Comparing version 3.0.3 to 3.0.4
@@ -1,21 +0,29 @@ | ||
var __defProp$1 = Object.defineProperty; | ||
var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { | ||
enumerable: true, | ||
configurable: true, | ||
writable: true, | ||
value | ||
}) : obj[key] = value; | ||
var __publicField$1 = (obj, key, value) => { | ||
__defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value); | ||
return value; | ||
}; | ||
const OPS = ["Value", "Copy", "Blank", "ReturnIntoArray", "ReturnIntoObject", "ReturnIntoObjectSameKey", "PushField", "PushElement", "PushParent", "Pop", "PushFieldCopy", "PushFieldBlank", "PushElementCopy", "PushElementBlank", "ReturnIntoObjectPop", "ReturnIntoObjectSameKeyPop", "ReturnIntoArrayPop", "ObjectSetFieldValue", "ObjectCopyField", "ObjectDeleteField", "ArrayAppendValue", "ArrayAppendSlice", "StringAppendString", "StringAppendSlice"]; | ||
const OPS = [ | ||
"Value", | ||
"Copy", | ||
"Blank", | ||
"ReturnIntoArray", | ||
"ReturnIntoObject", | ||
"ReturnIntoObjectSameKey", | ||
"PushField", | ||
"PushElement", | ||
"PushParent", | ||
"Pop", | ||
"PushFieldCopy", | ||
"PushFieldBlank", | ||
"PushElementCopy", | ||
"PushElementBlank", | ||
"ReturnIntoObjectPop", | ||
"ReturnIntoObjectSameKeyPop", | ||
"ReturnIntoArrayPop", | ||
"ObjectSetFieldValue", | ||
"ObjectCopyField", | ||
"ObjectDeleteField", | ||
"ArrayAppendValue", | ||
"ArrayAppendSlice", | ||
"StringAppendString", | ||
"StringAppendSlice" | ||
]; | ||
class Patcher { | ||
constructor(model, root, patch) { | ||
__publicField$1(this, "model"); | ||
__publicField$1(this, "root"); | ||
__publicField$1(this, "patch"); | ||
__publicField$1(this, "i"); | ||
__publicField$1(this, "inputStack"); | ||
__publicField$1(this, "outputStack"); | ||
this.model = model; | ||
@@ -32,12 +40,9 @@ this.root = root; | ||
process() { | ||
this.inputStack.push({ | ||
value: this.root | ||
}); | ||
this.outputStack.push({ | ||
value: this.root | ||
}); | ||
for (; this.i < this.patch.length;) { | ||
this.inputStack.push({ value: this.root }); | ||
this.outputStack.push({ value: this.root }); | ||
for (; this.i < this.patch.length; ) { | ||
let opcode = this.read(); | ||
let op = OPS[opcode]; | ||
if (!op) throw new Error("Unknown opcode: ".concat(opcode)); | ||
if (!op) | ||
throw new Error("Unknown opcode: ".concat(opcode)); | ||
let processor = "process".concat(op); | ||
@@ -92,16 +97,10 @@ this[processor].apply(this); | ||
let value = this.model.wrap(this.read()); | ||
this.outputStack.push({ | ||
value | ||
}); | ||
this.outputStack.push({ value }); | ||
} | ||
processCopy() { | ||
let input = this.inputEntry(); | ||
this.outputStack.push({ | ||
value: input.value | ||
}); | ||
this.outputStack.push({ value: input.value }); | ||
} | ||
processBlank() { | ||
this.outputStack.push({ | ||
value: null | ||
}); | ||
this.outputStack.push({ value: null }); | ||
} | ||
@@ -134,6 +133,3 @@ processReturnIntoArray() { | ||
let value = this.model.objectGetField(entry.value, key); | ||
this.inputStack.push({ | ||
value, | ||
key | ||
}); | ||
this.inputStack.push({ value, key }); | ||
} | ||
@@ -144,5 +140,3 @@ processPushElement() { | ||
let value = this.model.arrayGetElement(entry.value, idx); | ||
this.inputStack.push({ | ||
value | ||
}); | ||
this.inputStack.push({ value }); | ||
} | ||
@@ -222,2 +216,3 @@ processPop() { | ||
} | ||
function utf8charSize(code) { | ||
@@ -239,3 +234,4 @@ if (code >> 16) { | ||
let size = utf8charSize(code); | ||
if (size == 4) i++; | ||
if (size == 4) | ||
i++; | ||
b += size; | ||
@@ -245,4 +241,3 @@ } | ||
} | ||
function utf8resolveIndex(str, idx) { | ||
let start = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; | ||
function utf8resolveIndex(str, idx, start = 0) { | ||
let byteCount = start; | ||
@@ -253,3 +248,4 @@ let ucsIdx = 0; | ||
let size = utf8charSize(code); | ||
if (size === 4) ucsIdx++; | ||
if (size === 4) | ||
ucsIdx++; | ||
byteCount += size; | ||
@@ -262,6 +258,7 @@ } | ||
let b = 0; | ||
for (let i = 0; i < len;) { | ||
for (let i = 0; i < len; ) { | ||
let aPoint = str.codePointAt(i); | ||
let bPoint = str2.codePointAt(i); | ||
if (aPoint !== bPoint) return b; | ||
if (aPoint !== bPoint) | ||
return b; | ||
let size = utf8charSize(aPoint); | ||
@@ -273,10 +270,10 @@ b += size; | ||
} | ||
function commonSuffix(str, str2) { | ||
let prefix = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; | ||
function commonSuffix(str, str2, prefix = 0) { | ||
let len = Math.min(str.length, str2.length) - prefix; | ||
let b = 0; | ||
for (let i = 0; i < len;) { | ||
for (let i = 0; i < len; ) { | ||
let aPoint = str.codePointAt(str.length - 1 - i); | ||
let bPoint = str2.codePointAt(str2.length - 1 - i); | ||
if (aPoint !== bPoint) return b; | ||
if (aPoint !== bPoint) | ||
return b; | ||
let size = utf8charSize(aPoint); | ||
@@ -288,16 +285,5 @@ b += size; | ||
} | ||
var __defProp = Object.defineProperty; | ||
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { | ||
enumerable: true, | ||
configurable: true, | ||
writable: true, | ||
value | ||
}) : obj[key] = value; | ||
var __publicField = (obj, key, value) => { | ||
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); | ||
return value; | ||
}; | ||
class IncrementalModel { | ||
constructor(meta) { | ||
__publicField(this, "meta"); | ||
this.meta = meta; | ||
@@ -308,9 +294,4 @@ } | ||
} | ||
wrapWithMeta(data, startMeta) { | ||
let endMeta = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.meta; | ||
return { | ||
data, | ||
startMeta, | ||
endMeta | ||
}; | ||
wrapWithMeta(data, startMeta, endMeta = this.meta) { | ||
return { data, startMeta, endMeta }; | ||
} | ||
@@ -323,6 +304,3 @@ asObject(value) { | ||
} | ||
value.content = { | ||
type: "object", | ||
fields | ||
}; | ||
value.content = { type: "object", fields }; | ||
} | ||
@@ -333,9 +311,7 @@ return value.content; | ||
if (!value.content) { | ||
let elements = value.data.map(item => this.wrapWithMeta(item, value.startMeta)); | ||
let elements = value.data.map( | ||
(item) => this.wrapWithMeta(item, value.startMeta) | ||
); | ||
let metas = elements.map(() => this.meta); | ||
value.content = { | ||
type: "array", | ||
elements, | ||
metas | ||
}; | ||
value.content = { type: "array", elements, metas }; | ||
} | ||
@@ -385,7 +361,3 @@ return value.content; | ||
this.updateEndMeta(content); | ||
return { | ||
content, | ||
startMeta: this.meta, | ||
endMeta: this.meta | ||
}; | ||
return { content, startMeta: this.meta, endMeta: this.meta }; | ||
} | ||
@@ -483,3 +455,4 @@ markChanged(value) { | ||
resolveStringPart(str, from, len) { | ||
if (len === 0) return from; | ||
if (len === 0) | ||
return from; | ||
for (let i = from; i < str.parts.length; i++) { | ||
@@ -508,3 +481,4 @@ let part = str.parts[i]; | ||
let size = utf8charSize(code); | ||
if (size === 4) idx++; | ||
if (size === 4) | ||
idx++; | ||
byteCount += size; | ||
@@ -526,3 +500,4 @@ } | ||
let ndx = use.parts.indexOf(part); | ||
if (ndx === -1) throw new Error("bug: mismatch between string parts and use."); | ||
if (ndx === -1) | ||
throw new Error("bug: mismatch between string parts and use."); | ||
use.parts.splice(ndx + 1, 0, newPart); | ||
@@ -542,10 +517,7 @@ } | ||
function wrap(data, meta) { | ||
return { | ||
data, | ||
startMeta: meta, | ||
endMeta: meta | ||
}; | ||
return { data, startMeta: meta, endMeta: meta }; | ||
} | ||
function unwrap(value) { | ||
if (typeof value.data !== "undefined") return value.data; | ||
if (typeof value.data !== "undefined") | ||
return value.data; | ||
let result; | ||
@@ -555,14 +527,13 @@ let content = value.content; | ||
case "string": | ||
result = content.parts.map(part => part.value).join(""); | ||
result = content.parts.map((part) => part.value).join(""); | ||
break; | ||
case "array": | ||
result = content.elements.map(val => unwrap(val)); | ||
result = content.elements.map((val) => unwrap(val)); | ||
break; | ||
case "object": | ||
{ | ||
result = {}; | ||
for (let [key, val] of Object.entries(content.fields)) { | ||
result[key] = unwrap(val); | ||
} | ||
case "object": { | ||
result = {}; | ||
for (let [key, val] of Object.entries(content.fields)) { | ||
result[key] = unwrap(val); | ||
} | ||
} | ||
} | ||
@@ -573,5 +544,8 @@ value.data = result; | ||
function getType(value) { | ||
if (value.content) return value.content.type; | ||
if (Array.isArray(value.data)) return "array"; | ||
if (value.data === null) return "null"; | ||
if (value.content) | ||
return value.content.type; | ||
if (Array.isArray(value.data)) | ||
return "array"; | ||
if (value.data === null) | ||
return "null"; | ||
return typeof value.data; | ||
@@ -582,71 +556,71 @@ } | ||
let rightType = getType(right); | ||
if (leftType !== rightType) return right; | ||
if (leftType !== rightType) | ||
return right; | ||
let leftModel = new IncrementalModel(left.endMeta); | ||
let rightModel = new IncrementalModel(right.endMeta); | ||
switch (leftType) { | ||
case "object": | ||
{ | ||
let leftObj = leftModel.asObject(left); | ||
let rightObj = rightModel.asObject(right); | ||
let identicalFieldCount = 0; | ||
let leftFieldCount = Object.keys(leftObj.fields).length; | ||
let rightFieldCount = Object.keys(rightObj.fields).length; | ||
for (let [key, rightVal] of Object.entries(rightObj.fields)) { | ||
let leftVal = leftObj.fields[key]; | ||
if (leftVal) { | ||
rightObj.fields[key] = rebaseValue(leftVal, rightVal); | ||
if (rightObj.fields[key] === leftVal) { | ||
identicalFieldCount++; | ||
} | ||
case "object": { | ||
let leftObj = leftModel.asObject(left); | ||
let rightObj = rightModel.asObject(right); | ||
let identicalFieldCount = 0; | ||
let leftFieldCount = Object.keys(leftObj.fields).length; | ||
let rightFieldCount = Object.keys(rightObj.fields).length; | ||
for (let [key, rightVal] of Object.entries(rightObj.fields)) { | ||
let leftVal = leftObj.fields[key]; | ||
if (leftVal) { | ||
rightObj.fields[key] = rebaseValue(leftVal, rightVal); | ||
if (rightObj.fields[key] === leftVal) { | ||
identicalFieldCount++; | ||
} | ||
} | ||
let isIdentical = leftFieldCount === rightFieldCount && leftFieldCount === identicalFieldCount; | ||
return isIdentical ? left : right; | ||
} | ||
case "array": | ||
{ | ||
let leftArr = leftModel.asArray(left); | ||
let rightArr = rightModel.asArray(right); | ||
if (leftArr.elements.length !== rightArr.elements.length) { | ||
break; | ||
let isIdentical = leftFieldCount === rightFieldCount && leftFieldCount === identicalFieldCount; | ||
return isIdentical ? left : right; | ||
} | ||
case "array": { | ||
let leftArr = leftModel.asArray(left); | ||
let rightArr = rightModel.asArray(right); | ||
if (leftArr.elements.length !== rightArr.elements.length) { | ||
break; | ||
} | ||
let numRebased = 0; | ||
for (let i = 0; i < rightArr.elements.length; i++) { | ||
rightArr.elements[i] = rebaseValue(leftArr.elements[i], rightArr.elements[i]); | ||
if (rightArr.elements[i] !== leftArr.elements[i]) { | ||
numRebased++; | ||
} | ||
let numRebased = 0; | ||
for (let i = 0; i < rightArr.elements.length; i++) { | ||
rightArr.elements[i] = rebaseValue(leftArr.elements[i], rightArr.elements[i]); | ||
if (rightArr.elements[i] !== leftArr.elements[i]) { | ||
numRebased++; | ||
} | ||
} | ||
return numRebased === 0 ? left : right; | ||
} | ||
return numRebased === 0 ? left : right; | ||
} | ||
case "null": | ||
case "boolean": | ||
case "number": | ||
{ | ||
if (unwrap(left) === unwrap(right)) return left; | ||
break; | ||
case "number": { | ||
if (unwrap(left) === unwrap(right)) | ||
return left; | ||
break; | ||
} | ||
case "string": { | ||
let leftRaw = unwrap(left); | ||
let rightRaw = unwrap(right); | ||
if (leftRaw === rightRaw) | ||
return left; | ||
let result = rightModel.copyString(null); | ||
let prefix = commonPrefix(leftRaw, rightRaw); | ||
let suffix = commonSuffix(leftRaw, rightRaw, prefix); | ||
let rightLen = utf8stringSize(rightRaw); | ||
let leftLen = utf8stringSize(leftRaw); | ||
if (0 < prefix) { | ||
rightModel.stringAppendSlice(result, left, 0, prefix); | ||
} | ||
case "string": | ||
{ | ||
let leftRaw = unwrap(left); | ||
let rightRaw = unwrap(right); | ||
if (leftRaw === rightRaw) return left; | ||
let result = rightModel.copyString(null); | ||
let prefix = commonPrefix(leftRaw, rightRaw); | ||
let suffix = commonSuffix(leftRaw, rightRaw, prefix); | ||
let rightLen = utf8stringSize(rightRaw); | ||
let leftLen = utf8stringSize(leftRaw); | ||
if (0 < prefix) { | ||
rightModel.stringAppendSlice(result, left, 0, prefix); | ||
} | ||
if (prefix < rightLen - suffix) { | ||
rightModel.stringAppendSlice(result, right, prefix, rightLen - suffix); | ||
} | ||
if (leftLen - suffix < leftLen) { | ||
rightModel.stringAppendSlice(result, left, leftLen - suffix, leftLen); | ||
} | ||
let value = rightModel.finalize(result); | ||
if (unwrap(value) !== rightRaw) throw new Error("incorrect string rebase"); | ||
return value; | ||
if (prefix < rightLen - suffix) { | ||
rightModel.stringAppendSlice(result, right, prefix, rightLen - suffix); | ||
} | ||
if (leftLen - suffix < leftLen) { | ||
rightModel.stringAppendSlice(result, left, leftLen - suffix, leftLen); | ||
} | ||
let value = rightModel.finalize(result); | ||
if (unwrap(value) !== rightRaw) | ||
throw new Error("incorrect string rebase"); | ||
return value; | ||
} | ||
} | ||
@@ -660,2 +634,3 @@ return right; | ||
} | ||
var incrementalPatcher = /*#__PURE__*/Object.freeze({ | ||
@@ -669,2 +644,3 @@ __proto__: null, | ||
}); | ||
class SimpleModel { | ||
@@ -706,3 +682,4 @@ wrap(data) { | ||
copyArray(value) { | ||
if (value === null) return []; | ||
if (value === null) | ||
return []; | ||
return value.slice(); | ||
@@ -743,3 +720,4 @@ } | ||
} | ||
export { applyPatch, incrementalPatcher as incremental }; | ||
//# sourceMappingURL=index.js.map |
{ | ||
"name": "mendoza", | ||
"version": "3.0.3", | ||
"version": "3.0.4", | ||
"description": "Mendoza, differ for structured documents", | ||
@@ -47,6 +47,3 @@ "keywords": [ | ||
}, | ||
"browserslist": [ | ||
"> 0.2% and supports es6-module and supports es6-module-dynamic-import and not dead and not IE 11", | ||
"maintained node versions" | ||
], | ||
"browserslist": "extends @sanity/browserslist-config", | ||
"prettier": { | ||
@@ -62,20 +59,21 @@ "bracketSpacing": false, | ||
"devDependencies": { | ||
"@sanity/pkg-utils": "^2.3.10", | ||
"@sanity/semantic-release-preset": "^4.1.2", | ||
"@types/node": "^18.17.2", | ||
"@typescript-eslint/eslint-plugin": "^6.2.1", | ||
"@typescript-eslint/parser": "^6.2.1", | ||
"@vitest/coverage-v8": "^0.34.1", | ||
"eslint": "^8.46.0", | ||
"eslint-config-prettier": "^8.10.0", | ||
"eslint-plugin-prettier": "^5.0.0", | ||
"@sanity/pkg-utils": "^4.1.0", | ||
"@sanity/semantic-release-preset": "^4.1.6", | ||
"@types/node": "^18.17.14", | ||
"@typescript-eslint/eslint-plugin": "^6.19.1", | ||
"@typescript-eslint/parser": "^6.19.1", | ||
"@vitest/coverage-v8": "^1.2.1", | ||
"eslint": "^8.56.0", | ||
"eslint-config-prettier": "^9.1.0", | ||
"eslint-plugin-prettier": "^5.1.3", | ||
"eslint-plugin-simple-import-sort": "^10.0.0", | ||
"ls-engines": "^0.9.0", | ||
"prettier": "^3.0.1", | ||
"prettier-plugin-packagejson": "^2.4.5", | ||
"ls-engines": "^0.9.1", | ||
"prettier": "^3.2.4", | ||
"prettier-plugin-packagejson": "^2.4.9", | ||
"rimraf": "^4.4.1", | ||
"semantic-release": "^21.0.7", | ||
"typescript": "^5.1.6", | ||
"vitest": "^0.34.1", | ||
"vitest-github-actions-reporter": "^0.10.0" | ||
"semantic-release": "^22.0.12", | ||
"typescript": "^5.3.3", | ||
"vite-tsconfig-paths": "^4.3.1", | ||
"vitest": "^1.2.1", | ||
"vitest-github-actions-reporter": "^0.11.1" | ||
}, | ||
@@ -82,0 +80,0 @@ "engines": { |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
164122
19
2207