使用 fast-json-patched 进行文档版本控制和时间安排

Using fast-json-patched for document versioning and timelining

我正在尝试创建一个可修订的文档,并将编辑内容存储为 fast-json-patched 对象。

大纲是:

const jsonpatch = require('fast-json-patch');

/**
 * Generate a doc, with all the state changes recorded as
 * diffed objects.
 * @param {object} docParams The parameters to generate the doc from
 * @returns {object} the doc
 */
function generateDoc(docParams) {
  const defaults = {
    docnumber: 'TS99999',
    edits: 1,
  };
  // create a complete set of properties to work from
  const { docnumber, edits } = {
    ...defaults,
    ...docParams,
  };
  // basic docs setup
  const doc = {
    parameters: { docnumber, edits },
    history: [],
    state: { docnumber, notes: [] },
  };

  // update the doc 'edits' times
  for (let edit = 0; edit < edits; edit++) {
    // clone to preserve the current state
    const currentState = JSON.parse(JSON.stringify(doc.state));
    // add at least one note, up to every edit
    const notesToAdd = Math.ceil(Math.random() * 5);
    for (let i = 0; i < notesToAdd; i++) {
      doc.state.notes.push('Note: ' + Math.ceil(Math.random() * 500));
    }
    doc.history.push(jsonpatch.compare(currentState, doc.state));
  }
  return doc;
}

/**
 * Set the current doc state to the state at the spercifier point in time
 * @param {object} doc The doc to update
 * @param {integer} edit The point in time to use
 * @returns {boolean} Was the doc set updated?
 */
function timetravel(doc, editPoint) {
  if (
    doc.parameters.currentedit === editPoint ||
    editPoint > doc.parameters.edits ||
    editPoint < 1
  ) {
    return false; // don't travel too far into the future or past!
  }
  const patchesToApply = doc.history.slice(0, editPoint);
  const patches = [].concat.apply([], patchesToApply);
  let newDoc = {};
  newDoc = jsonpatch.applyPatch(newDoc, patches).newDocument;
  doc.state = newDoc;
  doc.parameters.currentedit = editPoint;
  return true;
}

// Testing....
const doc = generateDoc({
  docnumber: 'TS99999',
  edits: 5,
});

console.log(doc);
timetravel(doc, 2);
console.log(doc);

显然我对应该发生的事情的理解是错误的,因为我收到以下错误...

/Users/dd/Code/patchtesting/node_modules/fast-json-patch/commonjs/core.js:14
        obj[key] = this.value;

就在 jsonpatch.applyPatch 行。

我尝试过其他方法:

// seems to be one popular suggestion...
  const patchesToApply = doc.history.slice(0, editPoint);
  const patches = [].concat.apply([], patchesToApply);
  doc.state = patches.reduce(jsonpatch.applyReducer, {});
  doc.parameters.currentedit = editPoint;

或...

// Trying to see the effect of applying a single patch at a time...
  patches.forEach(patch => {
    console.log(patch);
    newDoc = jsonpatch.applyPatch(newDoc, [patch]).newDocument;
    console.log(newDoc);
  });

生成的补丁很有意义,我似乎无法应用它们:-(

抱歉,这是一个基本的编码/fencepost-ish 错误:

...

// basic docs setup
const doc = {
  parameters: { docnumber, edits },
  history: [],
  state: { docnumber, notes: [] },
};

// ADDED: need to record the initial state
doc.history.push(jsonpatch.compare({}, doc.state))

// update the doc 'edits' times
...
;