New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details →
Socket
Book a DemoSign in
Socket

json-codemod

Package Overview
Dependencies
Maintainers
1
Versions
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

json-codemod - npm Package Compare versions

Comparing version
1.0.0
to
1.1.0
+13
dist/cjs/function/batch.d.cts
import { ReplacePatch } from "./replace.cts";
import { DeletePatch } from "./delete.cts";
import { InsertPatch } from "./insert.cts";
export type BatchPatch = ReplacePatch | DeletePatch | InsertPatch;
/**
* Applies a batch of patches to the source text.
* @param sourceText - The original source text.
* @param patches - An array of patches to apply.
* @returns The modified source text after applying all patches.
*/
export declare function batch(sourceText: string, patches: Array<BatchPatch>): string;
import { Node } from "../CSTBuilder.cts";
export interface DeletePatch {
/**
* A JSON path to delete.
*/
path: string;
}
/**
* Deletes nodes from the JSON content based on the provided patches.
* @param sourceText - The original JSON content as a string.
* @param patches - An array of delete patches specifying the paths to remove.
* @param root - Optional CST root node to avoid re-parsing.
*/
export declare function remove(sourceText: string, patches: Array<DeletePatch>, root?: Node): string;
import { Node } from "../CSTBuilder.cts";
export interface InsertPatchArray {
/**
* A JSON path where the insertion should occur.
* For arrays: the path should point to the array, and position specifies the index.
* For objects: the path should point to the object, and key specifies the property name.
*/
path: string;
/**
* For array insertion: the index where to insert the value.
*/
position: number;
/**
* The value to insert.
*/
value: string;
}
export interface InsertPatchObject {
/**
* A JSON path where the insertion should occur.
* For arrays: the path should point to the array, and position specifies the index.
* For objects: the path should point to the object, and key specifies the property name.
*/
path: string;
/**
* For object insertion: the key name for the new property.
*/
key: string;
/**
* The value to insert.
*/
value: string;
}
export type InsertPatch = InsertPatchArray | InsertPatchObject;
/**
* Inserts values into a JSON structure at specified paths.
* @param sourceText - The original JSON text.
* @param patches - An array of insertion patches.
* @param root - Optional CST root node to avoid re-parsing.
*/
export declare function insert(sourceText: string, patches: Array<InsertPatch>, root?: Node): string;
import { Node } from "../CSTBuilder.cts";
export interface ReplacePatch {
/**
* A JSON path where the replacement should occur.
*/
path: string;
/**
* The value to insert at the specified path.
*/
value: string;
}
/**
* Replaces values in a JSON-like string at specified paths with new values.
* @param sourceText - The original JSON content as a string.
* @param patches - An array of replacement instructions.
* @param root - Optional CST root node to avoid re-parsing.
*/
export declare function replace(sourceText: string, patches: Array<ReplacePatch>, root?: Node): string;
import { Node } from "./CSTBuilder.cts";
/**
* Parse a path string into an array of keys and indices.
* @param path
* @returns An array of strings and numbers representing the path.
* @example
* ```js
* const pathArray = parsePath('a.b[0].c');
* console.log(pathArray); // ['a', 'b', 0, 'c']
* ```
*/
export declare function parsePath(path: string): Array<string | number>;
/**
* Extract the string value from a CST node.
* @param node - The CST node to extract the string from.
* @param sourceText - The original source text.
*/
export declare function extractString(node: Node, sourceText: string): string;
import { ReplacePatch } from "./replace.mts";
import { DeletePatch } from "./delete.mts";
import { InsertPatch } from "./insert.mts";
export type BatchPatch = ReplacePatch | DeletePatch | InsertPatch;
/**
* Applies a batch of patches to the source text.
* @param sourceText - The original source text.
* @param patches - An array of patches to apply.
* @returns The modified source text after applying all patches.
*/
export declare function batch(sourceText: string, patches: Array<BatchPatch>): string;
import { Node } from "../CSTBuilder.mts";
export interface DeletePatch {
/**
* A JSON path to delete.
*/
path: string;
}
/**
* Deletes nodes from the JSON content based on the provided patches.
* @param sourceText - The original JSON content as a string.
* @param patches - An array of delete patches specifying the paths to remove.
* @param root - Optional CST root node to avoid re-parsing.
*/
export declare function remove(sourceText: string, patches: Array<DeletePatch>, root?: Node): string;
import { Node } from "../CSTBuilder.mts";
export interface InsertPatchArray {
/**
* A JSON path where the insertion should occur.
* For arrays: the path should point to the array, and position specifies the index.
* For objects: the path should point to the object, and key specifies the property name.
*/
path: string;
/**
* For array insertion: the index where to insert the value.
*/
position: number;
/**
* The value to insert.
*/
value: string;
}
export interface InsertPatchObject {
/**
* A JSON path where the insertion should occur.
* For arrays: the path should point to the array, and position specifies the index.
* For objects: the path should point to the object, and key specifies the property name.
*/
path: string;
/**
* For object insertion: the key name for the new property.
*/
key: string;
/**
* The value to insert.
*/
value: string;
}
export type InsertPatch = InsertPatchArray | InsertPatchObject;
/**
* Inserts values into a JSON structure at specified paths.
* @param sourceText - The original JSON text.
* @param patches - An array of insertion patches.
* @param root - Optional CST root node to avoid re-parsing.
*/
export declare function insert(sourceText: string, patches: Array<InsertPatch>, root?: Node): string;
import { Node } from "../CSTBuilder.mts";
export interface ReplacePatch {
/**
* A JSON path where the replacement should occur.
*/
path: string;
/**
* The value to insert at the specified path.
*/
value: string;
}
/**
* Replaces values in a JSON-like string at specified paths with new values.
* @param sourceText - The original JSON content as a string.
* @param patches - An array of replacement instructions.
* @param root - Optional CST root node to avoid re-parsing.
*/
export declare function replace(sourceText: string, patches: Array<ReplacePatch>, root?: Node): string;
import { Node } from "./CSTBuilder.mts";
/**
* Parse a path string into an array of keys and indices.
* @param path
* @returns An array of strings and numbers representing the path.
* @example
* ```js
* const pathArray = parsePath('a.b[0].c');
* console.log(pathArray); // ['a', 'b', 0, 'c']
* ```
*/
export declare function parsePath(path: string): Array<string | number>;
/**
* Extract the string value from a CST node.
* @param node - The CST node to extract the string from.
* @param sourceText - The original source text.
*/
export declare function extractString(node: Node, sourceText: string): string;
+334
-15

@@ -29,7 +29,16 @@ "use strict";

__webpack_require__.d(__webpack_exports__, {
default: function() {
return src;
},
insert: function() {
return insert;
},
batch: function() {
return batch;
},
remove: function() {
return remove;
},
replace: function() {
return replace;
},
default: function() {
return src;
}

@@ -405,4 +414,40 @@ });

}
function parsePath(path) {
if (path.startsWith("/")) return parseJSONPointer(path);
return parseDotPath(path);
}
function parseDotPath(path) {
var result = [];
var i = 0;
while(i < path.length){
var ch = path[i];
if ("." === ch) {
i++;
continue;
}
if ("[" === ch) {
i++;
var num = "";
while(i < path.length && "]" !== path[i])num += path[i++];
i++;
result.push(Number(num));
continue;
}
var name = "";
while(i < path.length && /[a-zA-Z0-9_$]/.test(path[i]))name += path[i++];
result.push(name);
}
return result;
}
function parseJSONPointer(pointer) {
if ("" === pointer) return [];
if ("/" !== pointer[0]) throw new Error("Invalid JSON Pointer");
return pointer.slice(1).split("/").map(function(segment) {
return segment.replace(/~1/g, "/").replace(/~0/g, "~");
}).map(function(seg) {
return /^\d+$/.test(seg) ? Number(seg) : seg;
});
}
function resolvePath(root, path, sourceText) {
var parts = Array.isArray(path) ? path : parsePath(path);
var parts = Array.isArray(path) ? path : PathResolver_parsePath(path);
var node = root;

@@ -457,7 +502,7 @@ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;

}
function parsePath(path) {
if (path.startsWith("/")) return parseJSONPointer(path);
return parseDotPath(path);
function PathResolver_parsePath(path) {
if (path.startsWith("/")) return PathResolver_parseJSONPointer(path);
return PathResolver_parseDotPath(path);
}
function parseDotPath(path) {
function PathResolver_parseDotPath(path) {
var result = [];

@@ -485,3 +530,3 @@ var i = 0;

}
function parseJSONPointer(pointer) {
function PathResolver_parseJSONPointer(pointer) {
if ("" === pointer) return [];

@@ -495,7 +540,9 @@ if ("/" !== pointer[0]) throw new Error("Invalid JSON Pointer");

}
function replace(sourceText, patches) {
var tokenizer = new Tokenizer_Tokenizer(sourceText);
var tokens = tokenizer.tokenize();
var builder = new CSTBuilder_CSTBuilder(tokens);
var root = builder.build();
function replace(sourceText, patches, root) {
if (!root) {
var tokenizer = new Tokenizer_Tokenizer(sourceText);
var tokens = tokenizer.tokenize();
var builder = new CSTBuilder_CSTBuilder(tokens);
root = builder.build();
}
var reverseNodes = patches.map(function(patch) {

@@ -536,10 +583,282 @@ var node = resolvePath(root, patch.path, sourceText);

}
function remove(sourceText, patches, root) {
if (!root) {
var tokenizer = new Tokenizer_Tokenizer(sourceText);
var tokens = tokenizer.tokenize();
var builder = new CSTBuilder_CSTBuilder(tokens);
root = builder.build();
}
var reverseNodes = patches.map(function(patch) {
var pathParts = parsePath(patch.path);
if (0 === pathParts.length) return null;
var parentPath = pathParts.slice(0, -1);
var lastKey = pathParts[pathParts.length - 1];
var parentNode = parentPath.length > 0 ? resolvePath(root, parentPath, sourceText) : root;
if (!parentNode) return null;
return {
parentNode: parentNode,
lastKey: lastKey,
patch: patch
};
}).filter(function(v) {
return null !== v;
}).sort(function(a, b) {
var aStart = getDeleteStart(a.parentNode, a.lastKey, sourceText);
var bStart = getDeleteStart(b.parentNode, b.lastKey, sourceText);
return bStart - aStart;
});
var result = sourceText;
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
try {
for(var _iterator = reverseNodes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
var _step_value = _step.value, parentNode = _step_value.parentNode, lastKey = _step_value.lastKey;
result = deleteFromParent(result, parentNode, lastKey, sourceText);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally{
try {
if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
} finally{
if (_didIteratorError) throw _iteratorError;
}
}
return result;
}
function getDeleteStart(parentNode, key, sourceText) {
if ("Object" === parentNode.type) {
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
try {
for(var _iterator = parentNode.properties[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
var prop = _step.value;
var keyStr = extractString(prop.key, sourceText);
if (keyStr === key) return prop.key.start;
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally{
try {
if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
} finally{
if (_didIteratorError) throw _iteratorError;
}
}
} else if ("Array" === parentNode.type) {
if ("number" == typeof key && key >= 0 && key < parentNode.elements.length) return parentNode.elements[key].start;
}
return 0;
}
function deleteObjectProperty(sourceText, objectNode, key, originalSource) {
var propIndex = -1;
for(var i = 0; i < objectNode.properties.length; i++){
var keyStr = extractString(objectNode.properties[i].key, originalSource);
if (keyStr === key) {
propIndex = i;
break;
}
}
if (-1 === propIndex) return sourceText;
var prop = objectNode.properties[propIndex];
var deleteStart = prop.key.start;
var deleteEnd = prop.value.end;
if (propIndex < objectNode.properties.length - 1) {
var pos = deleteEnd;
while(pos < sourceText.length && (" " === sourceText[pos] || "\t" === sourceText[pos] || "\n" === sourceText[pos] || "\r" === sourceText[pos]))pos++;
if ("," === sourceText[pos]) {
deleteEnd = pos + 1;
while(deleteEnd < sourceText.length && (" " === sourceText[deleteEnd] || "\t" === sourceText[deleteEnd] || "\n" === sourceText[deleteEnd] || "\r" === sourceText[deleteEnd]))deleteEnd++;
}
} else if (propIndex > 0) {
var pos1 = deleteStart - 1;
while(pos1 >= 0 && (" " === sourceText[pos1] || "\t" === sourceText[pos1] || "\n" === sourceText[pos1] || "\r" === sourceText[pos1]))pos1--;
if ("," === sourceText[pos1]) {
pos1--;
while(pos1 >= 0 && (" " === sourceText[pos1] || "\t" === sourceText[pos1] || "\n" === sourceText[pos1] || "\r" === sourceText[pos1]))pos1--;
deleteStart = pos1 + 1;
}
}
return sourceText.slice(0, deleteStart) + sourceText.slice(deleteEnd);
}
function deleteArrayElement(sourceText, arrayNode, index, originalSource) {
if ("number" != typeof index || index < 0 || index >= arrayNode.elements.length) return sourceText;
var element = arrayNode.elements[index];
var deleteStart = element.start;
var deleteEnd = element.end;
if (index < arrayNode.elements.length - 1) {
var pos = deleteEnd;
while(pos < sourceText.length && (" " === sourceText[pos] || "\t" === sourceText[pos] || "\n" === sourceText[pos] || "\r" === sourceText[pos]))pos++;
if ("," === sourceText[pos]) {
deleteEnd = pos + 1;
while(deleteEnd < sourceText.length && (" " === sourceText[deleteEnd] || "\t" === sourceText[deleteEnd] || "\n" === sourceText[deleteEnd] || "\r" === sourceText[deleteEnd]))deleteEnd++;
}
} else if (index > 0) {
var pos1 = deleteStart - 1;
while(pos1 >= 0 && (" " === sourceText[pos1] || "\t" === sourceText[pos1] || "\n" === sourceText[pos1] || "\r" === sourceText[pos1]))pos1--;
if ("," === sourceText[pos1]) {
pos1--;
while(pos1 >= 0 && (" " === sourceText[pos1] || "\t" === sourceText[pos1] || "\n" === sourceText[pos1] || "\r" === sourceText[pos1]))pos1--;
deleteStart = pos1 + 1;
}
}
return sourceText.slice(0, deleteStart) + sourceText.slice(deleteEnd);
}
function deleteFromParent(sourceText, parentNode, key, originalSource) {
if ("Object" === parentNode.type) return deleteObjectProperty(sourceText, parentNode, key, originalSource);
if ("Array" === parentNode.type) return deleteArrayElement(sourceText, parentNode, key, originalSource);
return sourceText;
}
function insert(sourceText, patches, root) {
if (!root) {
var tokenizer = new Tokenizer_Tokenizer(sourceText);
var tokens = tokenizer.tokenize();
var builder = new CSTBuilder_CSTBuilder(tokens);
root = builder.build();
}
var reverseNodes = patches.map(function(patch) {
var node = resolvePath(root, patch.path, sourceText);
return {
node: node,
patch: patch
};
}).filter(function(v) {
return v.node;
}).sort(function(a, b) {
return b.node.start - a.node.start;
});
var result = sourceText;
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
try {
for(var _iterator = reverseNodes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
var _step_value = _step.value, node = _step_value.node, patch = _step_value.patch;
result = insertIntoNode(result, node, patch, sourceText);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally{
try {
if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
} finally{
if (_didIteratorError) throw _iteratorError;
}
}
return result;
}
function insertIntoNode(sourceText, node, patch, originalSource) {
if ("Object" === node.type) return insertObjectProperty(sourceText, node, patch, originalSource);
if ("Array" === node.type) return insertArrayElement(sourceText, node, patch, originalSource);
return sourceText;
}
function insertObjectProperty(sourceText, objectNode, patch, originalSource) {
if (!patch.key) throw new Error("Insert into object requires 'key' property");
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
try {
for(var _iterator = objectNode.properties[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
var prop = _step.value;
var keyStr = extractString(prop.key, originalSource);
if (keyStr === patch.key) throw new Error('Key "'.concat(patch.key, '" already exists in object'));
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally{
try {
if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
} finally{
if (_didIteratorError) throw _iteratorError;
}
}
var newEntry = '"'.concat(patch.key, '": ').concat(patch.value);
if (0 === objectNode.properties.length) {
var insertPos = objectNode.start + 1;
return sourceText.slice(0, insertPos) + newEntry + sourceText.slice(insertPos);
}
var lastProp = objectNode.properties[objectNode.properties.length - 1];
var insertPos1 = lastProp.value.end;
return sourceText.slice(0, insertPos1) + ", " + newEntry + sourceText.slice(insertPos1);
}
function insertArrayElement(sourceText, arrayNode, patch, originalSource) {
var position = void 0 !== patch.position ? patch.position : arrayNode.elements.length;
if (position < 0 || position > arrayNode.elements.length) throw new Error("Invalid position ".concat(position, " for array of length ").concat(arrayNode.elements.length));
if (0 === arrayNode.elements.length) {
var insertPos = arrayNode.start + 1;
return sourceText.slice(0, insertPos) + patch.value + sourceText.slice(insertPos);
}
if (0 === position) {
var insertPos1 = arrayNode.elements[0].start;
return sourceText.slice(0, insertPos1) + patch.value + ", " + sourceText.slice(insertPos1);
}
if (position >= arrayNode.elements.length) {
var lastElement = arrayNode.elements[arrayNode.elements.length - 1];
var insertPos2 = lastElement.end;
return sourceText.slice(0, insertPos2) + ", " + patch.value + sourceText.slice(insertPos2);
}
var insertPos3 = arrayNode.elements[position].start;
return sourceText.slice(0, insertPos3) + patch.value + ", " + sourceText.slice(insertPos3);
}
function batch(sourceText, patches) {
var tokenizer = new Tokenizer_Tokenizer(sourceText);
var tokens = tokenizer.tokenize();
var builder = new CSTBuilder_CSTBuilder(tokens);
var root = builder.build();
var replacePatches = [];
var deletePatches = [];
var insertPatches = [];
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
try {
for(var _iterator = patches[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
var p = _step.value;
if (void 0 !== p.value && void 0 === p.key && void 0 === p.position) replacePatches.push({
path: p.path,
value: p.value
});
else if (void 0 === p.value && void 0 === p.key && void 0 === p.position) deletePatches.push({
path: p.path
});
else {
if (void 0 === p.key && void 0 === p.position || void 0 === p.value) continue;
insertPatches.push(p);
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally{
try {
if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
} finally{
if (_didIteratorError) throw _iteratorError;
}
}
var result = sourceText;
if (replacePatches.length > 0) result = replace(result, replacePatches, root);
if (insertPatches.length > 0) {
var currentRoot = replacePatches.length > 0 ? null : root;
result = insert(result, insertPatches, currentRoot);
}
if (deletePatches.length > 0) {
var currentRoot1 = replacePatches.length > 0 || insertPatches.length > 0 ? null : root;
result = remove(result, deletePatches, currentRoot1);
}
return result;
}
var jsoncst = {
replace: replace
replace: replace,
remove: remove,
insert: insert,
batch: batch
};
var src = jsoncst;
exports.batch = __webpack_exports__.batch;
exports["default"] = __webpack_exports__["default"];
exports.insert = __webpack_exports__.insert;
exports.remove = __webpack_exports__.remove;
exports.replace = __webpack_exports__.replace;
for(var __webpack_i__ in __webpack_exports__)if (-1 === [
"batch",
"default",
"insert",
"remove",
"replace"

@@ -546,0 +865,0 @@ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];

+1
-1

@@ -1,1 +0,1 @@

{"version":3,"file":"cjs/index.cjs","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/Tokenizer.js","../../src/CSTBuilder.js","../../src/PathResolver.js","../../src/index.js"],"sourcesContent":["__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","class Tokenizer {\n\tconstructor(text) {\n\t\tthis.text = text;\n\t\tthis.pos = 0;\n\t\tthis.tokens = [];\n\t}\n\n\ttokenize() {\n\t\twhile (this.pos < this.text.length) {\n\t\t\tconst ch = this.text[this.pos];\n\n\t\t\tif (this.isWhitespace(ch)) {\n\t\t\t\tthis.readWhitespace();\n\t\t\t} else if (ch === '\"') {\n\t\t\t\tthis.readString();\n\t\t\t} else if (this.isNumberStart(ch)) {\n\t\t\t\tthis.readNumber();\n\t\t\t} else if (this.isAlpha(ch)) {\n\t\t\t\tthis.readKeyword();\n\t\t\t} else {\n\t\t\t\tthis.readPunctuationOrComment();\n\t\t\t}\n\t\t}\n\n\t\treturn this.tokens;\n\t}\n\n\t// ---------- helpers ----------\n\n\tisWhitespace(ch) {\n\t\treturn ch === \" \" || ch === \"\\n\" || ch === \"\\r\" || ch === \"\\t\";\n\t}\n\n\tisNumberStart(ch) {\n\t\treturn ch === \"-\" || (ch >= \"0\" && ch <= \"9\");\n\t}\n\n\tisAlpha(ch) {\n\t\treturn (ch >= \"a\" && ch <= \"z\") || (ch >= \"A\" && ch <= \"Z\");\n\t}\n\n\t// ---------- readers ----------\n\n\treadWhitespace() {\n\t\tconst start = this.pos;\n\t\twhile (this.pos < this.text.length && this.isWhitespace(this.text[this.pos])) {\n\t\t\tthis.pos++;\n\t\t}\n\t\tthis.tokens.push({\n\t\t\ttype: \"whitespace\",\n\t\t\tstart,\n\t\t\tend: this.pos,\n\t\t});\n\t}\n\n\treadString() {\n\t\tconst start = this.pos;\n\t\tthis.pos++; // skip opening \"\n\n\t\twhile (this.pos < this.text.length) {\n\t\t\tconst ch = this.text[this.pos];\n\n\t\t\tif (ch === \"\\\\\") {\n\t\t\t\t// skip escaped char\n\t\t\t\tthis.pos += 2;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (ch === '\"') {\n\t\t\t\tthis.pos++; // closing \"\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis.pos++;\n\t\t}\n\n\t\tthis.tokens.push({\n\t\t\ttype: \"string\",\n\t\t\tstart,\n\t\t\tend: this.pos,\n\t\t});\n\t}\n\n\treadNumber() {\n\t\tconst start = this.pos;\n\n\t\tif (this.text[this.pos] === \"-\") this.pos++;\n\n\t\twhile (this.pos < this.text.length && this.isDigit(this.text[this.pos])) {\n\t\t\tthis.pos++;\n\t\t}\n\n\t\tif (this.text[this.pos] === \".\") {\n\t\t\tthis.pos++;\n\t\t\twhile (this.pos < this.text.length && this.isDigit(this.text[this.pos])) {\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t}\n\n\t\tif (this.text[this.pos] === \"e\" || this.text[this.pos] === \"E\") {\n\t\t\tthis.pos++;\n\t\t\tif (this.text[this.pos] === \"+\" || this.text[this.pos] === \"-\") {\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t\twhile (this.pos < this.text.length && this.isDigit(this.text[this.pos])) {\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t}\n\n\t\tthis.tokens.push({\n\t\t\ttype: \"number\",\n\t\t\tstart,\n\t\t\tend: this.pos,\n\t\t});\n\t}\n\n\treadKeyword() {\n\t\tconst start = this.pos;\n\n\t\twhile (this.pos < this.text.length && this.isAlpha(this.text[this.pos])) {\n\t\t\tthis.pos++;\n\t\t}\n\n\t\tconst word = this.text.slice(start, this.pos);\n\n\t\tlet type;\n\t\tif (word === \"true\" || word === \"false\") {\n\t\t\ttype = \"boolean\";\n\t\t} else if (word === \"null\") {\n\t\t\ttype = \"null\";\n\t\t} else {\n\t\t\tthrow new Error(`Unexpected identifier: ${word}`);\n\t\t}\n\n\t\tthis.tokens.push({\n\t\t\ttype,\n\t\t\tstart,\n\t\t\tend: this.pos,\n\t\t});\n\t}\n\n\treadPunctuationOrComment() {\n\t\tconst start = this.pos;\n\t\tconst ch = this.text[this.pos];\n\n\t\t// line comment //\n\t\tif (ch === \"/\" && this.text[this.pos + 1] === \"/\") {\n\t\t\tthis.pos += 2;\n\t\t\twhile (this.pos < this.text.length && this.text[this.pos] !== \"\\n\") {\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t\tthis.tokens.push({\n\t\t\t\ttype: \"comment\",\n\t\t\t\tstart,\n\t\t\t\tend: this.pos,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// block comment /* */\n\t\tif (ch === \"/\" && this.text[this.pos + 1] === \"*\") {\n\t\t\tthis.pos += 2;\n\t\t\twhile (this.pos < this.text.length && !(this.text[this.pos] === \"*\" && this.text[this.pos + 1] === \"/\")) {\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t\tthis.pos += 2; // skip */\n\t\t\tthis.tokens.push({\n\t\t\t\ttype: \"comment\",\n\t\t\t\tstart,\n\t\t\t\tend: this.pos,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// punctuation\n\t\tthis.pos++;\n\n\t\tconst map = {\n\t\t\t\"{\": \"braceL\",\n\t\t\t\"}\": \"braceR\",\n\t\t\t\"[\": \"bracketL\",\n\t\t\t\"]\": \"bracketR\",\n\t\t\t\":\": \"colon\",\n\t\t\t\",\": \"comma\",\n\t\t};\n\n\t\tconst type = map[ch];\n\t\tif (!type) {\n\t\t\tthrow new Error(`Unexpected character: ${ch} at ${start}`);\n\t\t}\n\n\t\tthis.tokens.push({\n\t\t\ttype,\n\t\t\tstart,\n\t\t\tend: this.pos,\n\t\t});\n\t}\n\n\tisDigit(ch) {\n\t\treturn ch >= \"0\" && ch <= \"9\";\n\t}\n}\n\nexport { Tokenizer };\n","export class CSTBuilder {\n\tconstructor(tokens) {\n\t\tthis.tokens = tokens;\n\t\tthis.pos = 0;\n\t}\n\n\tbuild() {\n\t\tthis.skipTrivia();\n\t\tconst node = this.parseValue();\n\t\tthis.skipTrivia();\n\t\treturn node;\n\t}\n\n\tcurrent() {\n\t\treturn this.tokens[this.pos];\n\t}\n\n\tskipTrivia() {\n\t\twhile (this.pos < this.tokens.length && (this.tokens[this.pos].type === \"whitespace\" || this.tokens[this.pos].type === \"comment\")) {\n\t\t\tthis.pos++;\n\t\t}\n\t}\n\n\tconsume(type) {\n\t\tconst token = this.current();\n\t\tif (!token || token.type !== type) {\n\t\t\tthrow new Error(`Expected ${type}, got ${token && token.type}`);\n\t\t}\n\t\tthis.pos++;\n\t\treturn token;\n\t}\n\n\tparseValue() {\n\t\tthis.skipTrivia();\n\t\tconst token = this.current();\n\n\t\tif (!token) {\n\t\t\tthrow new Error(\"Unexpected end of input\");\n\t\t}\n\n\t\tswitch (token.type) {\n\t\t\tcase \"braceL\":\n\t\t\t\treturn this.parseObject();\n\t\t\tcase \"bracketL\":\n\t\t\t\treturn this.parseArray();\n\t\t\tcase \"string\":\n\t\t\t\treturn this.parsePrimitive(\"String\");\n\t\t\tcase \"number\":\n\t\t\t\treturn this.parsePrimitive(\"Number\");\n\t\t\tcase \"boolean\":\n\t\t\t\treturn this.parsePrimitive(\"Boolean\");\n\t\t\tcase \"null\":\n\t\t\t\treturn this.parsePrimitive(\"Null\");\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unexpected token: ${token.type}`);\n\t\t}\n\t}\n\n\tparsePrimitive(type) {\n\t\tconst token = this.current();\n\t\tthis.pos++;\n\t\treturn {\n\t\t\ttype,\n\t\t\tstart: token.start,\n\t\t\tend: token.end,\n\t\t};\n\t}\n\n\tparseObject() {\n\t\tconst startToken = this.consume(\"braceL\");\n\t\tconst properties = [];\n\n\t\tthis.skipTrivia();\n\n\t\twhile (this.current() && this.current().type !== \"braceR\") {\n\t\t\tconst keyToken = this.consume(\"string\");\n\t\t\tconst keyNode = {\n\t\t\t\ttype: \"String\",\n\t\t\t\tstart: keyToken.start,\n\t\t\t\tend: keyToken.end,\n\t\t\t};\n\n\t\t\tthis.skipTrivia();\n\t\t\tthis.consume(\"colon\");\n\t\t\tthis.skipTrivia();\n\n\t\t\tconst valueNode = this.parseValue();\n\n\t\t\tproperties.push({ key: keyNode, value: valueNode });\n\n\t\t\tthis.skipTrivia();\n\t\t\tif (this.current() && this.current().type === \"comma\") {\n\t\t\t\tthis.pos++;\n\t\t\t\tthis.skipTrivia();\n\t\t\t}\n\t\t}\n\n\t\tconst endToken = this.consume(\"braceR\");\n\n\t\treturn {\n\t\t\ttype: \"Object\",\n\t\t\tstart: startToken.start,\n\t\t\tend: endToken.end,\n\t\t\tproperties,\n\t\t};\n\t}\n\n\tparseArray() {\n\t\tconst startToken = this.consume(\"bracketL\");\n\t\tconst elements = [];\n\n\t\tthis.skipTrivia();\n\n\t\twhile (this.current() && this.current().type !== \"bracketR\") {\n\t\t\tconst valueNode = this.parseValue();\n\t\t\telements.push(valueNode);\n\n\t\t\tthis.skipTrivia();\n\t\t\tif (this.current() && this.current().type === \"comma\") {\n\t\t\t\tthis.pos++;\n\t\t\t\tthis.skipTrivia();\n\t\t\t}\n\t\t}\n\n\t\tconst endToken = this.consume(\"bracketR\");\n\n\t\treturn {\n\t\t\ttype: \"Array\",\n\t\t\tstart: startToken.start,\n\t\t\tend: endToken.end,\n\t\t\telements,\n\t\t};\n\t}\n}\n","function unescapeString(str) {\n\treturn str.replace(/\\\\(.)/g, (_, ch) => {\n\t\tswitch (ch) {\n\t\t\tcase '\"':\n\t\t\t\treturn '\"';\n\t\t\tcase \"\\\\\":\n\t\t\t\treturn \"\\\\\";\n\t\t\tcase \"/\":\n\t\t\t\treturn \"/\";\n\t\t\tcase \"b\":\n\t\t\t\treturn \"\\b\";\n\t\t\tcase \"f\":\n\t\t\t\treturn \"\\f\";\n\t\t\tcase \"n\":\n\t\t\t\treturn \"\\n\";\n\t\t\tcase \"r\":\n\t\t\t\treturn \"\\r\";\n\t\t\tcase \"t\":\n\t\t\t\treturn \"\\t\";\n\t\t\tdefault:\n\t\t\t\treturn ch; // \\uXXXX 可后续增强\n\t\t}\n\t});\n}\n\nfunction extractString(stringNode, sourceText) {\n\t// sourceText 是完整 JSON 文本\n\t// stringNode.start / end 覆盖包含引号\n\tconst raw = sourceText.slice(stringNode.start + 1, stringNode.end - 1);\n\treturn unescapeString(raw);\n}\n\nexport function resolvePath(root, path, sourceText) {\n\tconst parts = Array.isArray(path) ? path : parsePath(path);\n\tlet node = root;\n\n\tfor (const part of parts) {\n\t\tif (!node) return null;\n\n\t\tif (node.type === \"Object\") {\n\t\t\tnode = resolveObjectProperty(node, part, sourceText);\n\t\t} else if (node.type === \"Array\") {\n\t\t\tnode = resolveArrayElement(node, part);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\treturn node;\n}\n\nfunction resolveObjectProperty(objectNode, key, sourceText) {\n\tif (typeof key !== \"string\") return null;\n\n\tfor (const prop of objectNode.properties) {\n\t\tconst name = extractString(prop.key, sourceText);\n\t\tif (name === key) {\n\t\t\treturn prop.value;\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction resolveArrayElement(arrayNode, index) {\n\tif (typeof index !== \"number\") return null;\n\treturn arrayNode.elements[index] || null;\n}\n\nfunction parsePath(path) {\n\tif (path.startsWith(\"/\")) {\n\t\treturn parseJSONPointer(path);\n\t}\n\treturn parseDotPath(path);\n}\n\nfunction parseDotPath(path) {\n\tconst result = [];\n\tlet i = 0;\n\n\twhile (i < path.length) {\n\t\tconst ch = path[i];\n\n\t\t// skip dot\n\t\tif (ch === \".\") {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// array index: [123]\n\t\tif (ch === \"[\") {\n\t\t\ti++;\n\t\t\tlet num = \"\";\n\t\t\twhile (i < path.length && path[i] !== \"]\") {\n\t\t\t\tnum += path[i++];\n\t\t\t}\n\t\t\ti++; // skip ]\n\t\t\tresult.push(Number(num));\n\t\t\tcontinue;\n\t\t}\n\n\t\t// identifier\n\t\tlet name = \"\";\n\t\twhile (i < path.length && /[a-zA-Z0-9_$]/.test(path[i])) {\n\t\t\tname += path[i++];\n\t\t}\n\t\tresult.push(name);\n\t}\n\n\treturn result;\n}\n\nfunction parseJSONPointer(pointer) {\n\tif (pointer === \"\") return [];\n\n\tif (pointer[0] !== \"/\") {\n\t\tthrow new Error(\"Invalid JSON Pointer\");\n\t}\n\n\treturn pointer\n\t\t.slice(1)\n\t\t.split(\"/\")\n\t\t.map((segment) => segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\"))\n\t\t.map((seg) => {\n\t\t\treturn /^\\d+$/.test(seg) ? Number(seg) : seg;\n\t\t});\n}\n","import { Tokenizer } from \"./Tokenizer.js\";\nimport { CSTBuilder } from \"./CSTBuilder.js\";\nimport { resolvePath } from \"./PathResolver.js\";\n\nfunction replace(sourceText, patches) {\n\tconst tokenizer = new Tokenizer(sourceText);\n\tconst tokens = tokenizer.tokenize();\n\n\tconst builder = new CSTBuilder(tokens);\n\tconst root = builder.build();\n\n\t// 倒叙替换\n\tconst reverseNodes = patches\n\t\t.map((patch) => {\n\t\t\tconst node = resolvePath(root, patch.path, sourceText);\n\n\t\t\treturn {\n\t\t\t\tnode,\n\t\t\t\tpatch,\n\t\t\t};\n\t\t})\n\t\t.filter((v) => v.node)\n\t\t.sort((a, b) => b.node.start - a.node.start);\n\n\t// 确保不会冲突\n\treverseNodes.reduce((lastEnd, { node }) => {\n\t\tif (node.end > lastEnd) {\n\t\t\tthrow new Error(`Patch conflict at path: ${node.path}`);\n\t\t}\n\n\t\treturn node.start;\n\t}, Infinity);\n\n\tlet result = sourceText;\n\n\tfor (const { node, patch } of reverseNodes) {\n\t\tresult = result.slice(0, node.start) + patch.value + result.slice(node.end);\n\t}\n\n\treturn result;\n}\n\nconst jsoncst = {\n\treplace: replace,\n};\n\nexport { replace };\nexport default jsoncst;\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","Tokenizer","text","tokenize","ch","isWhitespace","isNumberStart","isAlpha","readWhitespace","start","readString","readNumber","readKeyword","word","type","Error","readPunctuationOrComment","map","isDigit","CSTBuilder","tokens","build","node","current","skipTrivia","consume","token","parseValue","parsePrimitive","parseObject","startToken","properties","keyToken","keyNode","valueNode","endToken","parseArray","elements","unescapeString","str","_","extractString","stringNode","sourceText","raw","resolvePath","root","path","parts","Array","parsePath","_iteratorError","part","resolveObjectProperty","resolveArrayElement","objectNode","name","arrayNode","index","parseJSONPointer","parseDotPath","result","i","num","Number","pointer","segment","seg","replace","patches","tokenizer","builder","reverseNodes","patch","v","a","b","lastEnd","Infinity","jsoncst"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,SAAS,QAAO,EAAEC,UAAU;QACnD,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,SAASI,GAAG,EAAEC,IAAI;QAAI,OAAOF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;IAAO;;;ICCtGL,oBAAoB,CAAC,GAAG,SAAS,QAAO;QACvC,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACNA,IAAMI,sBAASA,WAAAA,GAAf;;aAAMA,UACOC,IAAI;gCADXD;QAEJ,IAAI,CAAC,IAAI,GAAGC;QACZ,IAAI,CAAC,GAAG,GAAG;QACX,IAAI,CAAC,MAAM,GAAG,EAAE;;kBAJZD,WAAAA;;YAOLE,KAAAA;mBAAAA;gBACC,MAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAE;oBACnC,IAAMC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;oBAE9B,IAAI,IAAI,CAAC,YAAY,CAACA,KACrB,IAAI,CAAC,cAAc;yBACb,IAAIA,AAAO,QAAPA,IACV,IAAI,CAAC,UAAU;yBACT,IAAI,IAAI,CAAC,aAAa,CAACA,KAC7B,IAAI,CAAC,UAAU;yBACT,IAAI,IAAI,CAAC,OAAO,CAACA,KACvB,IAAI,CAAC,WAAW;yBAEhB,IAAI,CAAC,wBAAwB;gBAE/B;gBAEA,OAAO,IAAI,CAAC,MAAM;YACnB;;;YAIAC,KAAAA;mBAAAA,SAAaD,EAAE;gBACd,OAAOA,AAAO,QAAPA,MAAcA,AAAO,SAAPA,MAAeA,AAAO,SAAPA,MAAeA,AAAO,SAAPA;YACpD;;;YAEAE,KAAAA;mBAAAA,SAAcF,EAAE;gBACf,OAAOA,AAAO,QAAPA,MAAeA,MAAM,OAAOA,MAAM;YAC1C;;;YAEAG,KAAAA;mBAAAA,SAAQH,EAAE;gBACT,OAAQA,MAAM,OAAOA,MAAM,OAASA,MAAM,OAAOA,MAAM;YACxD;;;YAIAI,KAAAA;mBAAAA;gBACC,IAAMC,QAAQ,IAAI,CAAC,GAAG;gBACtB,MAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAC1E,IAAI,CAAC,GAAG;gBAET,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBAChB,MAAM;oBACNA,OAAAA;oBACA,KAAK,IAAI,CAAC,GAAG;gBACd;YACD;;;YAEAC,KAAAA;mBAAAA;gBACC,IAAMD,QAAQ,IAAI,CAAC,GAAG;gBACtB,IAAI,CAAC,GAAG;gBAER,MAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAE;oBACnC,IAAML,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;oBAE9B,IAAIA,AAAO,SAAPA,IAAa;wBAEhB,IAAI,CAAC,GAAG,IAAI;wBACZ;oBACD;oBAEA,IAAIA,AAAO,QAAPA,IAAY;wBACf,IAAI,CAAC,GAAG;wBACR;oBACD;oBAEA,IAAI,CAAC,GAAG;gBACT;gBAEA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBAChB,MAAM;oBACNK,OAAAA;oBACA,KAAK,IAAI,CAAC,GAAG;gBACd;YACD;;;YAEAE,KAAAA;mBAAAA;gBACC,IAAMF,QAAQ,IAAI,CAAC,GAAG;gBAEtB,IAAI,AAAwB,QAAxB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAU,IAAI,CAAC,GAAG;gBAEzC,MAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EACrE,IAAI,CAAC,GAAG;gBAGT,IAAI,AAAwB,QAAxB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAU;oBAChC,IAAI,CAAC,GAAG;oBACR,MAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EACrE,IAAI,CAAC,GAAG;gBAEV;gBAEA,IAAI,AAAwB,QAAxB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAY,AAAwB,QAAxB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAU;oBAC/D,IAAI,CAAC,GAAG;oBACR,IAAI,AAAwB,QAAxB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAY,AAAwB,QAAxB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EACrD,IAAI,CAAC,GAAG;oBAET,MAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EACrE,IAAI,CAAC,GAAG;gBAEV;gBAEA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBAChB,MAAM;oBACNA,OAAAA;oBACA,KAAK,IAAI,CAAC,GAAG;gBACd;YACD;;;YAEAG,KAAAA;mBAAAA;gBACC,IAAMH,QAAQ,IAAI,CAAC,GAAG;gBAEtB,MAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EACrE,IAAI,CAAC,GAAG;gBAGT,IAAMI,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAACJ,OAAO,IAAI,CAAC,GAAG;gBAE5C,IAAIK;gBACJ,IAAID,AAAS,WAATA,QAAmBA,AAAS,YAATA,MACtBC,OAAO;qBACD,IAAID,AAAS,WAATA,MACVC,OAAO;qBAEP,MAAM,IAAIC,MAAO,0BAA8B,OAALF;gBAG3C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBAChBC,MAAAA;oBACAL,OAAAA;oBACA,KAAK,IAAI,CAAC,GAAG;gBACd;YACD;;;YAEAO,KAAAA;mBAAAA;gBACC,IAAMP,QAAQ,IAAI,CAAC,GAAG;gBACtB,IAAML,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;gBAG9B,IAAIA,AAAO,QAAPA,MAAc,AAA4B,QAA5B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,EAAU;oBAClD,IAAI,CAAC,GAAG,IAAI;oBACZ,MAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,AAAwB,SAAxB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CACxD,IAAI,CAAC,GAAG;oBAET,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;wBAChB,MAAM;wBACNK,OAAAA;wBACA,KAAK,IAAI,CAAC,GAAG;oBACd;oBACA;gBACD;gBAGA,IAAIL,AAAO,QAAPA,MAAc,AAA4B,QAA5B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,EAAU;oBAClD,IAAI,CAAC,GAAG,IAAI;oBACZ,MAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAE,CAAwB,QAAxB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAY,AAA4B,QAA5B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,AAAO,EACpG,IAAI,CAAC,GAAG;oBAET,IAAI,CAAC,GAAG,IAAI;oBACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;wBAChB,MAAM;wBACNK,OAAAA;wBACA,KAAK,IAAI,CAAC,GAAG;oBACd;oBACA;gBACD;gBAGA,IAAI,CAAC,GAAG;gBAER,IAAMQ,MAAM;oBACX,KAAK;oBACL,KAAK;oBACL,KAAK;oBACL,KAAK;oBACL,KAAK;oBACL,KAAK;gBACN;gBAEA,IAAMH,OAAOG,GAAG,CAACb,GAAG;gBACpB,IAAI,CAACU,MACJ,MAAM,IAAIC,MAAO,yBAAiCN,MAAAA,CAATL,IAAG,QAAY,OAANK;gBAGnD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBAChBK,MAAAA;oBACAL,OAAAA;oBACA,KAAK,IAAI,CAAC,GAAG;gBACd;YACD;;;YAEAS,KAAAA;mBAAAA,SAAQd,EAAE;gBACT,OAAOA,MAAM,OAAOA,MAAM;YAC3B;;;WAxMKH;;;;;;;;;;;;;;;;;;;ACAC,IAAMkB,wBAAUA,WAAAA,GAAhB;;aAAMA,WACAC,MAAM;0CADND;QAEX,IAAI,CAAC,MAAM,GAAGC;QACd,IAAI,CAAC,GAAG,GAAG;;4BAHAD,YAAAA;;YAMZE,KAAAA;mBAAAA;gBACC,IAAI,CAAC,UAAU;gBACf,IAAMC,OAAO,IAAI,CAAC,UAAU;gBAC5B,IAAI,CAAC,UAAU;gBACf,OAAOA;YACR;;;YAEAC,KAAAA;mBAAAA;gBACC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YAC7B;;;YAEAC,KAAAA;mBAAAA;gBACC,MAAO,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAK,CAA+B,iBAA/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,IAAqB,AAA+B,cAA/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,AAAa,EAC9H,IAAI,CAAC,GAAG;YAEV;;;YAEAC,KAAAA;mBAAAA,SAAQX,IAAI;gBACX,IAAMY,QAAQ,IAAI,CAAC,OAAO;gBAC1B,IAAI,CAACA,SAASA,MAAM,IAAI,KAAKZ,MAC5B,MAAM,IAAIC,MAAO,YAAwBW,MAAAA,CAAbZ,MAAK,UAA4B,OAApBY,SAASA,MAAM,IAAI;gBAE7D,IAAI,CAAC,GAAG;gBACR,OAAOA;YACR;;;YAEAC,KAAAA;mBAAAA;gBACC,IAAI,CAAC,UAAU;gBACf,IAAMD,QAAQ,IAAI,CAAC,OAAO;gBAE1B,IAAI,CAACA,OACJ,MAAM,IAAIX,MAAM;gBAGjB,OAAQW,MAAM,IAAI;oBACjB,KAAK;wBACJ,OAAO,IAAI,CAAC,WAAW;oBACxB,KAAK;wBACJ,OAAO,IAAI,CAAC,UAAU;oBACvB,KAAK;wBACJ,OAAO,IAAI,CAAC,cAAc,CAAC;oBAC5B,KAAK;wBACJ,OAAO,IAAI,CAAC,cAAc,CAAC;oBAC5B,KAAK;wBACJ,OAAO,IAAI,CAAC,cAAc,CAAC;oBAC5B,KAAK;wBACJ,OAAO,IAAI,CAAC,cAAc,CAAC;oBAC5B;wBACC,MAAM,IAAIX,MAAO,qBAA+B,OAAXW,MAAM,IAAI;gBACjD;YACD;;;YAEAE,KAAAA;mBAAAA,SAAed,IAAI;gBAClB,IAAMY,QAAQ,IAAI,CAAC,OAAO;gBAC1B,IAAI,CAAC,GAAG;gBACR,OAAO;oBACNZ,MAAAA;oBACA,OAAOY,MAAM,KAAK;oBAClB,KAAKA,MAAM,GAAG;gBACf;YACD;;;YAEAG,KAAAA;mBAAAA;gBACC,IAAMC,aAAa,IAAI,CAAC,OAAO,CAAC;gBAChC,IAAMC,aAAa,EAAE;gBAErB,IAAI,CAAC,UAAU;gBAEf,MAAO,IAAI,CAAC,OAAO,MAAM,AAAwB,aAAxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAe;oBAC1D,IAAMC,WAAW,IAAI,CAAC,OAAO,CAAC;oBAC9B,IAAMC,UAAU;wBACf,MAAM;wBACN,OAAOD,SAAS,KAAK;wBACrB,KAAKA,SAAS,GAAG;oBAClB;oBAEA,IAAI,CAAC,UAAU;oBACf,IAAI,CAAC,OAAO,CAAC;oBACb,IAAI,CAAC,UAAU;oBAEf,IAAME,YAAY,IAAI,CAAC,UAAU;oBAEjCH,WAAW,IAAI,CAAC;wBAAE,KAAKE;wBAAS,OAAOC;oBAAU;oBAEjD,IAAI,CAAC,UAAU;oBACf,IAAI,IAAI,CAAC,OAAO,MAAM,AAAwB,YAAxB,IAAI,CAAC,OAAO,GAAG,IAAI,EAAc;wBACtD,IAAI,CAAC,GAAG;wBACR,IAAI,CAAC,UAAU;oBAChB;gBACD;gBAEA,IAAMC,WAAW,IAAI,CAAC,OAAO,CAAC;gBAE9B,OAAO;oBACN,MAAM;oBACN,OAAOL,WAAW,KAAK;oBACvB,KAAKK,SAAS,GAAG;oBACjBJ,YAAAA;gBACD;YACD;;;YAEAK,KAAAA;mBAAAA;gBACC,IAAMN,aAAa,IAAI,CAAC,OAAO,CAAC;gBAChC,IAAMO,WAAW,EAAE;gBAEnB,IAAI,CAAC,UAAU;gBAEf,MAAO,IAAI,CAAC,OAAO,MAAM,AAAwB,eAAxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAiB;oBAC5D,IAAMH,YAAY,IAAI,CAAC,UAAU;oBACjCG,SAAS,IAAI,CAACH;oBAEd,IAAI,CAAC,UAAU;oBACf,IAAI,IAAI,CAAC,OAAO,MAAM,AAAwB,YAAxB,IAAI,CAAC,OAAO,GAAG,IAAI,EAAc;wBACtD,IAAI,CAAC,GAAG;wBACR,IAAI,CAAC,UAAU;oBAChB;gBACD;gBAEA,IAAMC,WAAW,IAAI,CAAC,OAAO,CAAC;gBAE9B,OAAO;oBACN,MAAM;oBACN,OAAOL,WAAW,KAAK;oBACvB,KAAKK,SAAS,GAAG;oBACjBE,UAAAA;gBACD;YACD;;;WApIYlB;;ACAb,SAASmB,eAAeC,GAAG;IAC1B,OAAOA,IAAI,OAAO,CAAC,UAAU,SAACC,CAAC,EAAEpC,EAAE;QAClC,OAAQA;YACP,KAAK;gBACJ,OAAO;YACR,KAAK;gBACJ,OAAO;YACR,KAAK;gBACJ,OAAO;YACR,KAAK;gBACJ,OAAO;YACR,KAAK;gBACJ,OAAO;YACR,KAAK;gBACJ,OAAO;YACR,KAAK;gBACJ,OAAO;YACR,KAAK;gBACJ,OAAO;YACR;gBACC,OAAOA;QACT;IACD;AACD;AAEA,SAASqC,cAAcC,UAAU,EAAEC,UAAU;IAG5C,IAAMC,MAAMD,WAAW,KAAK,CAACD,WAAW,KAAK,GAAG,GAAGA,WAAW,GAAG,GAAG;IACpE,OAAOJ,eAAeM;AACvB;AAEO,SAASC,YAAYC,IAAI,EAAEC,IAAI,EAAEJ,UAAU;IACjD,IAAMK,QAAQC,MAAM,OAAO,CAACF,QAAQA,OAAOG,UAAUH;IACrD,IAAIzB,OAAOwB;QAENK,4BAAAA,MAAAA,oBAAAA,OAAAA,iBAAAA;;QAAL,QAAKA,YAAcH,KAAK,CAALA,OAAAA,QAAAA,CAAAA,IAAdG,OAAAA,CAAAA,CAAAA,4BAAAA,AAAAA,CAAAA,QAAAA,UAAAA,IAAAA,EAAAA,EAAAA,IAAAA,AAAAA,GAAAA,4BAAAA,KAAqB;YAArBA,IAAMC,OAAND,MAAAA,KAAAA;YACJ,IAAI,CAAC7B,MAAM,OAAO;YAElB,IAAIA,AAAc,aAAdA,KAAK,IAAI,EACZA,OAAO+B,sBAAsB/B,MAAM8B,MAAMT;;gBACnC,IAAIrB,AAAc,YAAdA,KAAK,IAAI,EAGnB,OAAO;gBAFPA,OAAOgC,oBAAoBhC,MAAM8B;;QAInC;;QAVKD,oBAAAA;QAAAA,iBAAAA;;;iBAAAA,6BAAAA,AAAAA,QAAAA,UAAAA,MAAAA,EAAAA,UAAAA,MAAAA;;gBAAAA,mB,MAAAA;;;IAYL,OAAO7B;AACR;AAEA,SAAS+B,sBAAsBE,UAAU,EAAE3D,GAAG,EAAE+C,UAAU;IACzD,IAAI,AAAe,YAAf,OAAO/C,KAAkB,OAAO;QAE/BuD,4BAAAA,MAAAA,oBAAAA,OAAAA,iBAAAA;;QAAL,QAAKA,YAAcI,WAAW,UAAU,qBAAnCJ,OAAAA,CAAAA,CAAAA,4BAAAA,AAAAA,CAAAA,QAAAA,UAAAA,IAAAA,EAAAA,EAAAA,IAAAA,AAAAA,GAAAA,4BAAAA,KAAqC;YAArCA,IAAMpD,OAANoD,MAAAA,KAAAA;YACJ,IAAMK,OAAOf,cAAc1C,KAAK,GAAG,EAAE4C;YACrC,IAAIa,SAAS5D,KACZ,OAAOG,KAAK,KAAK;QAEnB;;QALKoD,oBAAAA;QAAAA,iBAAAA;;;iBAAAA,6BAAAA,AAAAA,QAAAA,UAAAA,MAAAA,EAAAA,UAAAA,MAAAA;;gBAAAA,mB,MAAAA;;;IAML,OAAO;AACR;AAEA,SAASG,oBAAoBG,SAAS,EAAEC,KAAK;IAC5C,IAAI,AAAiB,YAAjB,OAAOA,OAAoB,OAAO;IACtC,OAAOD,UAAU,QAAQ,CAACC,MAAM,IAAI;AACrC;AAEA,SAASR,UAAUH,IAAI;IACtB,IAAIA,KAAK,UAAU,CAAC,MACnB,OAAOY,iBAAiBZ;IAEzB,OAAOa,aAAab;AACrB;AAEA,SAASa,aAAab,IAAI;IACzB,IAAMc,SAAS,EAAE;IACjB,IAAIC,IAAI;IAER,MAAOA,IAAIf,KAAK,MAAM,CAAE;QACvB,IAAM3C,KAAK2C,IAAI,CAACe,EAAE;QAGlB,IAAI1D,AAAO,QAAPA,IAAY;YACf0D;YACA;QACD;QAGA,IAAI1D,AAAO,QAAPA,IAAY;YACf0D;YACA,IAAIC,MAAM;YACV,MAAOD,IAAIf,KAAK,MAAM,IAAIA,AAAY,QAAZA,IAAI,CAACe,EAAE,CAChCC,OAAOhB,IAAI,CAACe,IAAI;YAEjBA;YACAD,OAAO,IAAI,CAACG,OAAOD;YACnB;QACD;QAGA,IAAIP,OAAO;QACX,MAAOM,IAAIf,KAAK,MAAM,IAAI,gBAAgB,IAAI,CAACA,IAAI,CAACe,EAAE,EACrDN,QAAQT,IAAI,CAACe,IAAI;QAElBD,OAAO,IAAI,CAACL;IACb;IAEA,OAAOK;AACR;AAEA,SAASF,iBAAiBM,OAAO;IAChC,IAAIA,AAAY,OAAZA,SAAgB,OAAO,EAAE;IAE7B,IAAIA,AAAe,QAAfA,OAAO,CAAC,EAAE,EACb,MAAM,IAAIlD,MAAM;IAGjB,OAAOkD,QACL,KAAK,CAAC,GACN,KAAK,CAAC,KACN,GAAG,CAAC,SAACC,OAAO;eAAKA,QAAQ,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO;OAC5D,GAAG,CAAC,SAACC,GAAG;QACR,OAAO,QAAQ,IAAI,CAACA,OAAOH,OAAOG,OAAOA;IAC1C;AACF;ACzHA,SAASC,QAAQzB,UAAU,EAAE0B,OAAO;IACnC,IAAMC,YAAY,IAAIrE,oBAAU0C;IAChC,IAAMvB,SAASkD,UAAU,QAAQ;IAEjC,IAAMC,UAAU,IAAIpD,sBAAWC;IAC/B,IAAM0B,OAAOyB,QAAQ,KAAK;IAG1B,IAAMC,eAAeH,QACnB,GAAG,CAAC,SAACI,KAAK;QACV,IAAMnD,OAAOuB,YAAYC,MAAM2B,MAAM,IAAI,EAAE9B;QAE3C,OAAO;YACNrB,MAAAA;YACAmD,OAAAA;QACD;IACD,GACC,MAAM,CAAC,SAACC,CAAC;eAAKA,EAAE,IAAI;OACpB,IAAI,CAAC,SAACC,CAAC,EAAEC,CAAC;eAAKA,EAAE,IAAI,CAAC,KAAK,GAAGD,EAAE,IAAI,CAAC,KAAK;;IAG5CH,aAAa,MAAM,CAAC,SAACK,OAAO,EAAE,KAATA;YAAWvD,OAAAA,MAAAA,IAAI;QACnC,IAAIA,KAAK,GAAG,GAAGuD,SACd,MAAM,IAAI9D,MAAO,2BAAoC,OAAVO,KAAK,IAAI;QAGrD,OAAOA,KAAK,KAAK;IAClB,GAAGwD;IAEH,IAAIjB,SAASlB;QAERQ,4BAAAA,MAAAA,oBAAAA,OAAAA,iBAAAA;;QAAL,QAAKA,YAAyBqB,YAAY,CAAZA,OAAAA,QAAAA,CAAAA,IAAzBrB,OAAAA,CAAAA,CAAAA,4BAAAA,AAAAA,CAAAA,QAAAA,UAAAA,IAAAA,EAAAA,EAAAA,IAAAA,AAAAA,GAAAA,4BAAAA,KAAuC;YAAvCA,IAAAA,cAAAA,MAAAA,KAAAA,EAAQ7B,OAAAA,YAAAA,IAAI,EAAEmD,QAAAA,YAAAA,KAAK;YACvBZ,SAASA,OAAO,KAAK,CAAC,GAAGvC,KAAK,KAAK,IAAImD,MAAM,KAAK,GAAGZ,OAAO,KAAK,CAACvC,KAAK,GAAG;QAC3E;;QAFK6B,oBAAAA;QAAAA,iBAAAA;;;iBAAAA,6BAAAA,AAAAA,QAAAA,UAAAA,MAAAA,EAAAA,UAAAA,MAAAA;;gBAAAA,mB,MAAAA;;;IAIL,OAAOU;AACR;AAEA,IAAMkB,UAAU;IACf,SAASX;AACV;AAGA,UAAeW"}
{"version":3,"file":"cjs/index.cjs","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/Tokenizer.js","../../src/CSTBuilder.js","../../src/helper.js","../../src/PathResolver.js","../../src/function/replace.js","../../src/function/delete.js","../../src/function/insert.js","../../src/function/batch.js","../../src/index.js"],"sourcesContent":["__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","class Tokenizer {\n\tconstructor(text) {\n\t\tthis.text = text;\n\t\tthis.pos = 0;\n\t\tthis.tokens = [];\n\t}\n\n\ttokenize() {\n\t\twhile (this.pos < this.text.length) {\n\t\t\tconst ch = this.text[this.pos];\n\n\t\t\tif (this.isWhitespace(ch)) {\n\t\t\t\tthis.readWhitespace();\n\t\t\t} else if (ch === '\"') {\n\t\t\t\tthis.readString();\n\t\t\t} else if (this.isNumberStart(ch)) {\n\t\t\t\tthis.readNumber();\n\t\t\t} else if (this.isAlpha(ch)) {\n\t\t\t\tthis.readKeyword();\n\t\t\t} else {\n\t\t\t\tthis.readPunctuationOrComment();\n\t\t\t}\n\t\t}\n\n\t\treturn this.tokens;\n\t}\n\n\t// ---------- helpers ----------\n\n\tisWhitespace(ch) {\n\t\treturn ch === \" \" || ch === \"\\n\" || ch === \"\\r\" || ch === \"\\t\";\n\t}\n\n\tisNumberStart(ch) {\n\t\treturn ch === \"-\" || (ch >= \"0\" && ch <= \"9\");\n\t}\n\n\tisAlpha(ch) {\n\t\treturn (ch >= \"a\" && ch <= \"z\") || (ch >= \"A\" && ch <= \"Z\");\n\t}\n\n\t// ---------- readers ----------\n\n\treadWhitespace() {\n\t\tconst start = this.pos;\n\t\twhile (this.pos < this.text.length && this.isWhitespace(this.text[this.pos])) {\n\t\t\tthis.pos++;\n\t\t}\n\t\tthis.tokens.push({\n\t\t\ttype: \"whitespace\",\n\t\t\tstart,\n\t\t\tend: this.pos,\n\t\t});\n\t}\n\n\treadString() {\n\t\tconst start = this.pos;\n\t\tthis.pos++; // skip opening \"\n\n\t\twhile (this.pos < this.text.length) {\n\t\t\tconst ch = this.text[this.pos];\n\n\t\t\tif (ch === \"\\\\\") {\n\t\t\t\t// skip escaped char\n\t\t\t\tthis.pos += 2;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (ch === '\"') {\n\t\t\t\tthis.pos++; // closing \"\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis.pos++;\n\t\t}\n\n\t\tthis.tokens.push({\n\t\t\ttype: \"string\",\n\t\t\tstart,\n\t\t\tend: this.pos,\n\t\t});\n\t}\n\n\treadNumber() {\n\t\tconst start = this.pos;\n\n\t\tif (this.text[this.pos] === \"-\") this.pos++;\n\n\t\twhile (this.pos < this.text.length && this.isDigit(this.text[this.pos])) {\n\t\t\tthis.pos++;\n\t\t}\n\n\t\tif (this.text[this.pos] === \".\") {\n\t\t\tthis.pos++;\n\t\t\twhile (this.pos < this.text.length && this.isDigit(this.text[this.pos])) {\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t}\n\n\t\tif (this.text[this.pos] === \"e\" || this.text[this.pos] === \"E\") {\n\t\t\tthis.pos++;\n\t\t\tif (this.text[this.pos] === \"+\" || this.text[this.pos] === \"-\") {\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t\twhile (this.pos < this.text.length && this.isDigit(this.text[this.pos])) {\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t}\n\n\t\tthis.tokens.push({\n\t\t\ttype: \"number\",\n\t\t\tstart,\n\t\t\tend: this.pos,\n\t\t});\n\t}\n\n\treadKeyword() {\n\t\tconst start = this.pos;\n\n\t\twhile (this.pos < this.text.length && this.isAlpha(this.text[this.pos])) {\n\t\t\tthis.pos++;\n\t\t}\n\n\t\tconst word = this.text.slice(start, this.pos);\n\n\t\tlet type;\n\t\tif (word === \"true\" || word === \"false\") {\n\t\t\ttype = \"boolean\";\n\t\t} else if (word === \"null\") {\n\t\t\ttype = \"null\";\n\t\t} else {\n\t\t\tthrow new Error(`Unexpected identifier: ${word}`);\n\t\t}\n\n\t\tthis.tokens.push({\n\t\t\ttype,\n\t\t\tstart,\n\t\t\tend: this.pos,\n\t\t});\n\t}\n\n\treadPunctuationOrComment() {\n\t\tconst start = this.pos;\n\t\tconst ch = this.text[this.pos];\n\n\t\t// line comment //\n\t\tif (ch === \"/\" && this.text[this.pos + 1] === \"/\") {\n\t\t\tthis.pos += 2;\n\t\t\twhile (this.pos < this.text.length && this.text[this.pos] !== \"\\n\") {\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t\tthis.tokens.push({\n\t\t\t\ttype: \"comment\",\n\t\t\t\tstart,\n\t\t\t\tend: this.pos,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// block comment /* */\n\t\tif (ch === \"/\" && this.text[this.pos + 1] === \"*\") {\n\t\t\tthis.pos += 2;\n\t\t\twhile (this.pos < this.text.length && !(this.text[this.pos] === \"*\" && this.text[this.pos + 1] === \"/\")) {\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t\tthis.pos += 2; // skip */\n\t\t\tthis.tokens.push({\n\t\t\t\ttype: \"comment\",\n\t\t\t\tstart,\n\t\t\t\tend: this.pos,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// punctuation\n\t\tthis.pos++;\n\n\t\tconst map = {\n\t\t\t\"{\": \"braceL\",\n\t\t\t\"}\": \"braceR\",\n\t\t\t\"[\": \"bracketL\",\n\t\t\t\"]\": \"bracketR\",\n\t\t\t\":\": \"colon\",\n\t\t\t\",\": \"comma\",\n\t\t};\n\n\t\tconst type = map[ch];\n\t\tif (!type) {\n\t\t\tthrow new Error(`Unexpected character: ${ch} at ${start}`);\n\t\t}\n\n\t\tthis.tokens.push({\n\t\t\ttype,\n\t\t\tstart,\n\t\t\tend: this.pos,\n\t\t});\n\t}\n\n\tisDigit(ch) {\n\t\treturn ch >= \"0\" && ch <= \"9\";\n\t}\n}\n\nexport { Tokenizer };\n","export class CSTBuilder {\n\tconstructor(tokens) {\n\t\tthis.tokens = tokens;\n\t\tthis.pos = 0;\n\t}\n\n\tbuild() {\n\t\tthis.skipTrivia();\n\t\tconst node = this.parseValue();\n\t\tthis.skipTrivia();\n\t\treturn node;\n\t}\n\n\tcurrent() {\n\t\treturn this.tokens[this.pos];\n\t}\n\n\tskipTrivia() {\n\t\twhile (this.pos < this.tokens.length && (this.tokens[this.pos].type === \"whitespace\" || this.tokens[this.pos].type === \"comment\")) {\n\t\t\tthis.pos++;\n\t\t}\n\t}\n\n\tconsume(type) {\n\t\tconst token = this.current();\n\t\tif (!token || token.type !== type) {\n\t\t\tthrow new Error(`Expected ${type}, got ${token && token.type}`);\n\t\t}\n\t\tthis.pos++;\n\t\treturn token;\n\t}\n\n\tparseValue() {\n\t\tthis.skipTrivia();\n\t\tconst token = this.current();\n\n\t\tif (!token) {\n\t\t\tthrow new Error(\"Unexpected end of input\");\n\t\t}\n\n\t\tswitch (token.type) {\n\t\t\tcase \"braceL\":\n\t\t\t\treturn this.parseObject();\n\t\t\tcase \"bracketL\":\n\t\t\t\treturn this.parseArray();\n\t\t\tcase \"string\":\n\t\t\t\treturn this.parsePrimitive(\"String\");\n\t\t\tcase \"number\":\n\t\t\t\treturn this.parsePrimitive(\"Number\");\n\t\t\tcase \"boolean\":\n\t\t\t\treturn this.parsePrimitive(\"Boolean\");\n\t\t\tcase \"null\":\n\t\t\t\treturn this.parsePrimitive(\"Null\");\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unexpected token: ${token.type}`);\n\t\t}\n\t}\n\n\tparsePrimitive(type) {\n\t\tconst token = this.current();\n\t\tthis.pos++;\n\t\treturn {\n\t\t\ttype,\n\t\t\tstart: token.start,\n\t\t\tend: token.end,\n\t\t};\n\t}\n\n\tparseObject() {\n\t\tconst startToken = this.consume(\"braceL\");\n\t\tconst properties = [];\n\n\t\tthis.skipTrivia();\n\n\t\twhile (this.current() && this.current().type !== \"braceR\") {\n\t\t\tconst keyToken = this.consume(\"string\");\n\t\t\tconst keyNode = {\n\t\t\t\ttype: \"String\",\n\t\t\t\tstart: keyToken.start,\n\t\t\t\tend: keyToken.end,\n\t\t\t};\n\n\t\t\tthis.skipTrivia();\n\t\t\tthis.consume(\"colon\");\n\t\t\tthis.skipTrivia();\n\n\t\t\tconst valueNode = this.parseValue();\n\n\t\t\tproperties.push({ key: keyNode, value: valueNode });\n\n\t\t\tthis.skipTrivia();\n\t\t\tif (this.current() && this.current().type === \"comma\") {\n\t\t\t\tthis.pos++;\n\t\t\t\tthis.skipTrivia();\n\t\t\t}\n\t\t}\n\n\t\tconst endToken = this.consume(\"braceR\");\n\n\t\treturn {\n\t\t\ttype: \"Object\",\n\t\t\tstart: startToken.start,\n\t\t\tend: endToken.end,\n\t\t\tproperties,\n\t\t};\n\t}\n\n\tparseArray() {\n\t\tconst startToken = this.consume(\"bracketL\");\n\t\tconst elements = [];\n\n\t\tthis.skipTrivia();\n\n\t\twhile (this.current() && this.current().type !== \"bracketR\") {\n\t\t\tconst valueNode = this.parseValue();\n\t\t\telements.push(valueNode);\n\n\t\t\tthis.skipTrivia();\n\t\t\tif (this.current() && this.current().type === \"comma\") {\n\t\t\t\tthis.pos++;\n\t\t\t\tthis.skipTrivia();\n\t\t\t}\n\t\t}\n\n\t\tconst endToken = this.consume(\"bracketR\");\n\n\t\treturn {\n\t\t\ttype: \"Array\",\n\t\t\tstart: startToken.start,\n\t\t\tend: endToken.end,\n\t\t\telements,\n\t\t};\n\t}\n}\n","function unescapeString(str) {\n\treturn str.replace(/\\\\(.)/g, (_, ch) => {\n\t\tswitch (ch) {\n\t\t\tcase '\"':\n\t\t\t\treturn '\"';\n\t\t\tcase \"\\\\\":\n\t\t\t\treturn \"\\\\\";\n\t\t\tcase \"/\":\n\t\t\t\treturn \"/\";\n\t\t\tcase \"b\":\n\t\t\t\treturn \"\\b\";\n\t\t\tcase \"f\":\n\t\t\t\treturn \"\\f\";\n\t\t\tcase \"n\":\n\t\t\t\treturn \"\\n\";\n\t\t\tcase \"r\":\n\t\t\t\treturn \"\\r\";\n\t\t\tcase \"t\":\n\t\t\t\treturn \"\\t\";\n\t\t\tdefault:\n\t\t\t\treturn ch; // \\uXXXX 可后续增强\n\t\t}\n\t});\n}\n\nexport function extractString(stringNode, sourceText) {\n\t// sourceText 是完整 JSON 文本\n\t// stringNode.start / end 覆盖包含引号\n\tconst raw = sourceText.slice(stringNode.start + 1, stringNode.end - 1);\n\treturn unescapeString(raw);\n}\n\n/**\n *\n * @param {string} path\n * @returns\n */\nexport function parsePath(path) {\n\tif (path.startsWith(\"/\")) {\n\t\treturn parseJSONPointer(path);\n\t}\n\treturn parseDotPath(path);\n}\n\n/**\n *\n * @param {string} path\n * @returns\n */\nfunction parseDotPath(path) {\n\tconst result = [];\n\tlet i = 0;\n\n\twhile (i < path.length) {\n\t\tconst ch = path[i];\n\n\t\t// skip dot\n\t\tif (ch === \".\") {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// array index: [123]\n\t\tif (ch === \"[\") {\n\t\t\ti++;\n\t\t\tlet num = \"\";\n\t\t\twhile (i < path.length && path[i] !== \"]\") {\n\t\t\t\tnum += path[i++];\n\t\t\t}\n\t\t\ti++; // skip ]\n\t\t\tresult.push(Number(num));\n\t\t\tcontinue;\n\t\t}\n\n\t\t// identifier\n\t\tlet name = \"\";\n\t\twhile (i < path.length && /[a-zA-Z0-9_$]/.test(path[i])) {\n\t\t\tname += path[i++];\n\t\t}\n\t\tresult.push(name);\n\t}\n\n\treturn result;\n}\n\n/**\n *\n * @param {string} pointer\n * @returns\n */\nfunction parseJSONPointer(pointer) {\n\tif (pointer === \"\") return [];\n\n\tif (pointer[0] !== \"/\") {\n\t\tthrow new Error(\"Invalid JSON Pointer\");\n\t}\n\n\treturn pointer\n\t\t.slice(1)\n\t\t.split(\"/\")\n\t\t.map((segment) => segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\"))\n\t\t.map((seg) => {\n\t\t\treturn /^\\d+$/.test(seg) ? Number(seg) : seg;\n\t\t});\n}\n","import { extractString } from \"./helper.js\";\n\nexport function resolvePath(root, path, sourceText) {\n\tconst parts = Array.isArray(path) ? path : parsePath(path);\n\tlet node = root;\n\n\tfor (const part of parts) {\n\t\tif (!node) return null;\n\n\t\tif (node.type === \"Object\") {\n\t\t\tnode = resolveObjectProperty(node, part, sourceText);\n\t\t} else if (node.type === \"Array\") {\n\t\t\tnode = resolveArrayElement(node, part);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\treturn node;\n}\n\n/**\n *\n * @param {import('./CSTBuilder.js').NodeObject} objectNode\n * @param {string} key\n * @param {string} sourceText\n * @returns {import('./CSTBuilder.js').Node | null}\n */\nfunction resolveObjectProperty(objectNode, key, sourceText) {\n\tif (typeof key !== \"string\") return null;\n\n\tfor (const prop of objectNode.properties) {\n\t\tconst name = extractString(prop.key, sourceText);\n\t\tif (name === key) {\n\t\t\treturn prop.value;\n\t\t}\n\t}\n\treturn null;\n}\n\n/**\n *\n * @param {import('./CSTBuilder.js').NodeArray} arrayNode\n * @param {number} index\n * @returns {import('./CSTBuilder.js').Node | null}\n */\nfunction resolveArrayElement(arrayNode, index) {\n\tif (typeof index !== \"number\") return null;\n\treturn arrayNode.elements[index] || null;\n}\n\nfunction parsePath(path) {\n\tif (path.startsWith(\"/\")) {\n\t\treturn parseJSONPointer(path);\n\t}\n\treturn parseDotPath(path);\n}\n\nfunction parseDotPath(path) {\n\tconst result = [];\n\tlet i = 0;\n\n\twhile (i < path.length) {\n\t\tconst ch = path[i];\n\n\t\t// skip dot\n\t\tif (ch === \".\") {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// array index: [123]\n\t\tif (ch === \"[\") {\n\t\t\ti++;\n\t\t\tlet num = \"\";\n\t\t\twhile (i < path.length && path[i] !== \"]\") {\n\t\t\t\tnum += path[i++];\n\t\t\t}\n\t\t\ti++; // skip ]\n\t\t\tresult.push(Number(num));\n\t\t\tcontinue;\n\t\t}\n\n\t\t// identifier\n\t\tlet name = \"\";\n\t\twhile (i < path.length && /[a-zA-Z0-9_$]/.test(path[i])) {\n\t\t\tname += path[i++];\n\t\t}\n\t\tresult.push(name);\n\t}\n\n\treturn result;\n}\n\nfunction parseJSONPointer(pointer) {\n\tif (pointer === \"\") return [];\n\n\tif (pointer[0] !== \"/\") {\n\t\tthrow new Error(\"Invalid JSON Pointer\");\n\t}\n\n\treturn pointer\n\t\t.slice(1)\n\t\t.split(\"/\")\n\t\t.map((segment) => segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\"))\n\t\t.map((seg) => {\n\t\t\treturn /^\\d+$/.test(seg) ? Number(seg) : seg;\n\t\t});\n}\n","import { Tokenizer } from \"../Tokenizer.js\";\nimport { CSTBuilder } from \"../CSTBuilder.js\";\nimport { resolvePath } from \"../PathResolver.js\";\n\nexport function replace(sourceText, patches, root) {\n\tif (!root) {\n\t\tconst tokenizer = new Tokenizer(sourceText);\n\t\tconst tokens = tokenizer.tokenize();\n\n\t\tconst builder = new CSTBuilder(tokens);\n\t\troot = builder.build();\n\t}\n\n\t// 倒叙替换\n\tconst reverseNodes = patches\n\t\t.map((patch) => {\n\t\t\tconst node = resolvePath(root, patch.path, sourceText);\n\n\t\t\treturn {\n\t\t\t\tnode,\n\t\t\t\tpatch,\n\t\t\t};\n\t\t})\n\t\t.filter((v) => v.node)\n\t\t.sort((a, b) => b.node.start - a.node.start);\n\n\t// 确保不会冲突\n\treverseNodes.reduce((lastEnd, { node }) => {\n\t\tif (node.end > lastEnd) {\n\t\t\tthrow new Error(`Patch conflict at path: ${node.path}`);\n\t\t}\n\n\t\treturn node.start;\n\t}, Infinity);\n\n\tlet result = sourceText;\n\n\tfor (const { node, patch } of reverseNodes) {\n\t\tresult = result.slice(0, node.start) + patch.value + result.slice(node.end);\n\t}\n\n\treturn result;\n}\n","import { Tokenizer } from \"../Tokenizer.js\";\nimport { CSTBuilder } from \"../CSTBuilder.js\";\nimport { resolvePath } from \"../PathResolver.js\";\nimport { parsePath, extractString } from \"../helper.js\";\n\nexport function remove(sourceText, patches, root) {\n\tif (!root) {\n\t\tconst tokenizer = new Tokenizer(sourceText);\n\t\tconst tokens = tokenizer.tokenize();\n\n\t\tconst builder = new CSTBuilder(tokens);\n\t\troot = builder.build();\n\t}\n\n\t// 倒叙删除\n\tconst reverseNodes = patches\n\t\t.map((patch) => {\n\t\t\tconst pathParts = parsePath(patch.path);\n\t\t\tif (pathParts.length === 0) {\n\t\t\t\treturn null; // Cannot delete root\n\t\t\t}\n\n\t\t\t// Find parent and the item to delete\n\t\t\tconst parentPath = pathParts.slice(0, -1);\n\t\t\tconst lastKey = pathParts[pathParts.length - 1];\n\t\t\tconst parentNode = parentPath.length > 0 ? resolvePath(root, parentPath, sourceText) : root;\n\n\t\t\tif (!parentNode) return null;\n\n\t\t\treturn {\n\t\t\t\tparentNode,\n\t\t\t\tlastKey,\n\t\t\t\tpatch,\n\t\t\t};\n\t\t})\n\t\t.filter((v) => v !== null)\n\t\t.sort((a, b) => {\n\t\t\t// Sort by the start position of what we're deleting\n\t\t\tconst aStart = getDeleteStart(a.parentNode, a.lastKey, sourceText);\n\t\t\tconst bStart = getDeleteStart(b.parentNode, b.lastKey, sourceText);\n\t\t\treturn bStart - aStart;\n\t\t});\n\n\tlet result = sourceText;\n\n\tfor (const { parentNode, lastKey } of reverseNodes) {\n\t\tresult = deleteFromParent(result, parentNode, lastKey, sourceText);\n\t}\n\n\treturn result;\n}\n\nfunction getDeleteStart(parentNode, key, sourceText) {\n\tif (parentNode.type === \"Object\") {\n\t\tfor (const prop of parentNode.properties) {\n\t\t\tconst keyStr = extractString(prop.key, sourceText);\n\t\t\tif (keyStr === key) {\n\t\t\t\treturn prop.key.start;\n\t\t\t}\n\t\t}\n\t} else if (parentNode.type === \"Array\") {\n\t\tif (typeof key === \"number\" && key >= 0 && key < parentNode.elements.length) {\n\t\t\treturn parentNode.elements[key].start;\n\t\t}\n\t}\n\treturn 0;\n}\n\nfunction deleteObjectProperty(sourceText, objectNode, key, originalSource) {\n\tlet propIndex = -1;\n\tfor (let i = 0; i < objectNode.properties.length; i++) {\n\t\tconst keyStr = extractString(objectNode.properties[i].key, originalSource);\n\t\tif (keyStr === key) {\n\t\t\tpropIndex = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (propIndex === -1) return sourceText;\n\n\tconst prop = objectNode.properties[propIndex];\n\tlet deleteStart = prop.key.start;\n\tlet deleteEnd = prop.value.end;\n\n\t// Handle comma and whitespace\n\tif (propIndex < objectNode.properties.length - 1) {\n\t\t// Not the last property, look for comma after\n\t\tlet pos = deleteEnd;\n\t\twhile (\n\t\t\tpos < sourceText.length &&\n\t\t\t(sourceText[pos] === \" \" || sourceText[pos] === \"\\t\" || sourceText[pos] === \"\\n\" || sourceText[pos] === \"\\r\")\n\t\t) {\n\t\t\tpos++;\n\t\t}\n\t\tif (sourceText[pos] === \",\") {\n\t\t\tdeleteEnd = pos + 1;\n\t\t\t// Skip trailing whitespace after comma\n\t\t\twhile (\n\t\t\t\tdeleteEnd < sourceText.length &&\n\t\t\t\t(sourceText[deleteEnd] === \" \" ||\n\t\t\t\t\tsourceText[deleteEnd] === \"\\t\" ||\n\t\t\t\t\tsourceText[deleteEnd] === \"\\n\" ||\n\t\t\t\t\tsourceText[deleteEnd] === \"\\r\")\n\t\t\t) {\n\t\t\t\tdeleteEnd++;\n\t\t\t}\n\t\t}\n\t} else if (propIndex > 0) {\n\t\t// Last property, look for comma before (and whitespace before the comma)\n\t\tlet pos = deleteStart - 1;\n\t\t// Skip whitespace before the property\n\t\twhile (pos >= 0 && (sourceText[pos] === \" \" || sourceText[pos] === \"\\t\" || sourceText[pos] === \"\\n\" || sourceText[pos] === \"\\r\")) {\n\t\t\tpos--;\n\t\t}\n\t\tif (sourceText[pos] === \",\") {\n\t\t\t// Also skip whitespace before the comma\n\t\t\tlet commaPos = pos;\n\t\t\tpos--;\n\t\t\twhile (\n\t\t\t\tpos >= 0 &&\n\t\t\t\t(sourceText[pos] === \" \" || sourceText[pos] === \"\\t\" || sourceText[pos] === \"\\n\" || sourceText[pos] === \"\\r\")\n\t\t\t) {\n\t\t\t\tpos--;\n\t\t\t}\n\t\t\tdeleteStart = pos + 1;\n\t\t}\n\t}\n\n\treturn sourceText.slice(0, deleteStart) + sourceText.slice(deleteEnd);\n}\n\nfunction deleteArrayElement(sourceText, arrayNode, index, originalSource) {\n\tif (typeof index !== \"number\" || index < 0 || index >= arrayNode.elements.length) {\n\t\treturn sourceText;\n\t}\n\n\tconst element = arrayNode.elements[index];\n\tlet deleteStart = element.start;\n\tlet deleteEnd = element.end;\n\n\t// Handle comma and whitespace\n\tif (index < arrayNode.elements.length - 1) {\n\t\t// Not the last element, look for comma after\n\t\tlet pos = deleteEnd;\n\t\twhile (\n\t\t\tpos < sourceText.length &&\n\t\t\t(sourceText[pos] === \" \" || sourceText[pos] === \"\\t\" || sourceText[pos] === \"\\n\" || sourceText[pos] === \"\\r\")\n\t\t) {\n\t\t\tpos++;\n\t\t}\n\t\tif (sourceText[pos] === \",\") {\n\t\t\tdeleteEnd = pos + 1;\n\t\t\t// Skip trailing whitespace after comma\n\t\t\twhile (\n\t\t\t\tdeleteEnd < sourceText.length &&\n\t\t\t\t(sourceText[deleteEnd] === \" \" ||\n\t\t\t\t\tsourceText[deleteEnd] === \"\\t\" ||\n\t\t\t\t\tsourceText[deleteEnd] === \"\\n\" ||\n\t\t\t\t\tsourceText[deleteEnd] === \"\\r\")\n\t\t\t) {\n\t\t\t\tdeleteEnd++;\n\t\t\t}\n\t\t}\n\t} else if (index > 0) {\n\t\t// Last element, look for comma before (and whitespace before the comma)\n\t\tlet pos = deleteStart - 1;\n\t\t// Skip whitespace before the element\n\t\twhile (pos >= 0 && (sourceText[pos] === \" \" || sourceText[pos] === \"\\t\" || sourceText[pos] === \"\\n\" || sourceText[pos] === \"\\r\")) {\n\t\t\tpos--;\n\t\t}\n\t\tif (sourceText[pos] === \",\") {\n\t\t\t// Also skip whitespace before the comma\n\t\t\tlet commaPos = pos;\n\t\t\tpos--;\n\t\t\twhile (\n\t\t\t\tpos >= 0 &&\n\t\t\t\t(sourceText[pos] === \" \" || sourceText[pos] === \"\\t\" || sourceText[pos] === \"\\n\" || sourceText[pos] === \"\\r\")\n\t\t\t) {\n\t\t\t\tpos--;\n\t\t\t}\n\t\t\tdeleteStart = pos + 1;\n\t\t}\n\t}\n\n\treturn sourceText.slice(0, deleteStart) + sourceText.slice(deleteEnd);\n}\n\nfunction deleteFromParent(sourceText, parentNode, key, originalSource) {\n\tif (parentNode.type === \"Object\") {\n\t\treturn deleteObjectProperty(sourceText, parentNode, key, originalSource);\n\t} else if (parentNode.type === \"Array\") {\n\t\treturn deleteArrayElement(sourceText, parentNode, key, originalSource);\n\t}\n\treturn sourceText;\n}\n","import { Tokenizer } from \"../Tokenizer.js\";\nimport { CSTBuilder } from \"../CSTBuilder.js\";\nimport { resolvePath } from \"../PathResolver.js\";\nimport { extractString } from \"../helper.js\";\n\nexport function insert(sourceText, patches, root) {\n\tif (!root) {\n\t\tconst tokenizer = new Tokenizer(sourceText);\n\t\tconst tokens = tokenizer.tokenize();\n\n\t\tconst builder = new CSTBuilder(tokens);\n\t\troot = builder.build();\n\t}\n\n\t// 倒叙插入\n\tconst reverseNodes = patches\n\t\t.map((patch) => {\n\t\t\tconst node = resolvePath(root, patch.path, sourceText);\n\t\t\treturn {\n\t\t\t\tnode,\n\t\t\t\tpatch,\n\t\t\t};\n\t\t})\n\t\t.filter((v) => v.node)\n\t\t.sort((a, b) => b.node.start - a.node.start);\n\n\tlet result = sourceText;\n\n\tfor (const { node, patch } of reverseNodes) {\n\t\tresult = insertIntoNode(result, node, patch, sourceText);\n\t}\n\n\treturn result;\n}\n\nfunction insertIntoNode(sourceText, node, patch, originalSource) {\n\tif (node.type === \"Object\") {\n\t\treturn insertObjectProperty(sourceText, node, patch, originalSource);\n\t} else if (node.type === \"Array\") {\n\t\treturn insertArrayElement(sourceText, node, patch, originalSource);\n\t}\n\treturn sourceText;\n}\n\nfunction insertObjectProperty(sourceText, objectNode, patch, originalSource) {\n\tif (!patch.key) {\n\t\tthrow new Error(\"Insert into object requires 'key' property\");\n\t}\n\n\t// Check if key already exists\n\tfor (const prop of objectNode.properties) {\n\t\tconst keyStr = extractString(prop.key, originalSource);\n\t\tif (keyStr === patch.key) {\n\t\t\tthrow new Error(`Key \"${patch.key}\" already exists in object`);\n\t\t}\n\t}\n\n\tconst newEntry = `\"${patch.key}\": ${patch.value}`;\n\n\tif (objectNode.properties.length === 0) {\n\t\t// Empty object\n\t\tconst insertPos = objectNode.start + 1;\n\t\treturn sourceText.slice(0, insertPos) + newEntry + sourceText.slice(insertPos);\n\t} else {\n\t\t// Insert after last property\n\t\tconst lastProp = objectNode.properties[objectNode.properties.length - 1];\n\t\tconst insertPos = lastProp.value.end;\n\t\treturn sourceText.slice(0, insertPos) + \", \" + newEntry + sourceText.slice(insertPos);\n\t}\n}\n\nfunction insertArrayElement(sourceText, arrayNode, patch, originalSource) {\n\tconst position = patch.position !== undefined ? patch.position : arrayNode.elements.length;\n\n\tif (position < 0 || position > arrayNode.elements.length) {\n\t\tthrow new Error(`Invalid position ${position} for array of length ${arrayNode.elements.length}`);\n\t}\n\n\tif (arrayNode.elements.length === 0) {\n\t\t// Empty array\n\t\tconst insertPos = arrayNode.start + 1;\n\t\treturn sourceText.slice(0, insertPos) + patch.value + sourceText.slice(insertPos);\n\t} else if (position === 0) {\n\t\t// Insert at the beginning\n\t\tconst insertPos = arrayNode.elements[0].start;\n\t\treturn sourceText.slice(0, insertPos) + patch.value + \", \" + sourceText.slice(insertPos);\n\t} else if (position >= arrayNode.elements.length) {\n\t\t// Insert at the end\n\t\tconst lastElement = arrayNode.elements[arrayNode.elements.length - 1];\n\t\tconst insertPos = lastElement.end;\n\t\treturn sourceText.slice(0, insertPos) + \", \" + patch.value + sourceText.slice(insertPos);\n\t} else {\n\t\t// Insert in the middle\n\t\tconst insertPos = arrayNode.elements[position].start;\n\t\treturn sourceText.slice(0, insertPos) + patch.value + \", \" + sourceText.slice(insertPos);\n\t}\n}\n","import { replace } from \"./replace.js\";\nimport { remove } from \"./delete.js\";\nimport { insert } from \"./insert.js\";\nimport { Tokenizer } from \"../Tokenizer.js\";\nimport { CSTBuilder } from \"../CSTBuilder.js\";\n\nexport function batch(sourceText, patches) {\n\t// Parse the source text once\n\tconst tokenizer = new Tokenizer(sourceText);\n\tconst tokens = tokenizer.tokenize();\n\tconst builder = new CSTBuilder(tokens);\n\tconst root = builder.build();\n\n\t// Categorize patches by operation type\n\tconst replacePatches = [];\n\tconst deletePatches = [];\n\tconst insertPatches = [];\n\n\tfor (const p of patches) {\n\t\t// Determine patch type based on properties\n\t\tif (p.value !== undefined && p.key === undefined && p.position === undefined) {\n\t\t\t// Has value but no key/position -> replace operation\n\t\t\treplacePatches.push({ path: p.path, value: p.value });\n\t\t} else if (p.value === undefined && p.key === undefined && p.position === undefined) {\n\t\t\t// No value, key, or position -> delete operation\n\t\t\tdeletePatches.push({ path: p.path });\n\t\t} else if ((p.key !== undefined || p.position !== undefined) && p.value !== undefined) {\n\t\t\t// Has key or position with value -> insert operation\n\t\t\tinsertPatches.push(p);\n\t\t} else {\n\t\t\t// Invalid patch - skip it\n\t\t\tcontinue;\n\t\t}\n\t}\n\n\t// Apply patches in order: replace, insert, delete\n\t// This order ensures that replacements happen first, then inserts, then deletes\n\tlet result = sourceText;\n\n\t// Apply replacements\n\tif (replacePatches.length > 0) {\n\t\tresult = replace(result, replacePatches, root);\n\t}\n\n\t// Apply insertions\n\tif (insertPatches.length > 0) {\n\t\t// Need to re-parse if we did replacements\n\t\tconst currentRoot = replacePatches.length > 0 ? null : root;\n\t\tresult = insert(result, insertPatches, currentRoot);\n\t}\n\n\t// Apply deletions\n\tif (deletePatches.length > 0) {\n\t\t// Need to re-parse if we did replacements or insertions\n\t\tconst currentRoot = replacePatches.length > 0 || insertPatches.length > 0 ? null : root;\n\t\tresult = remove(result, deletePatches, currentRoot);\n\t}\n\n\treturn result;\n}\n","import { replace } from \"./function/replace.js\";\nimport { remove } from \"./function/delete.js\";\nimport { insert } from \"./function/insert.js\";\nimport { batch } from \"./function/batch.js\";\n\nconst jsoncst = {\n\treplace: replace,\n\tremove: remove,\n\tinsert: insert,\n\tbatch: batch,\n};\n\nexport { replace, remove, insert, batch };\n\nexport default jsoncst;\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","Tokenizer","text","tokenize","ch","isWhitespace","isNumberStart","isAlpha","readWhitespace","start","readString","readNumber","readKeyword","word","type","Error","readPunctuationOrComment","map","isDigit","CSTBuilder","tokens","build","node","current","skipTrivia","consume","token","parseValue","parsePrimitive","parseObject","startToken","properties","keyToken","keyNode","valueNode","endToken","parseArray","elements","unescapeString","str","_","extractString","stringNode","sourceText","raw","parsePath","path","parseJSONPointer","parseDotPath","result","i","num","Number","name","pointer","segment","seg","resolvePath","root","parts","Array","_iteratorError","part","resolveObjectProperty","resolveArrayElement","objectNode","arrayNode","index","replace","patches","tokenizer","builder","reverseNodes","patch","v","a","b","lastEnd","Infinity","remove","pathParts","parentPath","lastKey","parentNode","aStart","getDeleteStart","bStart","deleteFromParent","keyStr","deleteObjectProperty","originalSource","propIndex","deleteStart","deleteEnd","pos","pos1","deleteArrayElement","element","insert","insertIntoNode","insertObjectProperty","insertArrayElement","newEntry","insertPos","lastProp","insertPos1","position","undefined","lastElement","insertPos2","insertPos3","batch","replacePatches","deletePatches","insertPatches","p","currentRoot","currentRoot1","jsoncst"],"mappings":"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"}

@@ -1,18 +0,12 @@

interface Patch {
/**
* A JSON path where the replacement should occur.
*/
path: string;
/**
* The value to insert at the specified path.
*/
value: string;
}
import { replace, ReplacePatch } from "./function/replace.cts";
import { remove, DeletePatch } from "./function/delete.cts";
import { insert, InsertPatch } from "./function/insert.cts";
import { batch, BatchPatch } from "./function/batch.cts";
declare function replace(sourceText: string, patches: Array<Patch>): string;
export { replace, Patch };
export { ReplacePatch, DeletePatch, InsertPatch, BatchPatch, replace, remove, insert, batch };
interface JSONCTS {
replace: typeof replace;
remove: typeof remove;
insert: typeof insert;
batch: typeof batch;
}

@@ -19,0 +13,0 @@

@@ -5,4 +5,10 @@ import { Node } from "./CSTBuilder.cts";

declare function resolvePath(root: Node, path: Path): Node | null;
export { resolvePath };
/**
* Resolve a path within a JSON CST.
* @param root - The root node of the JSON CST.
* @param path - The path to resolve, either as a dot-separated string or an array of strings.
* @param sourceText - The original JSON source text.
* @returns The node at the specified path, or null if not found.
* @example
*/
export declare function resolvePath(root: Node, path: Path, sourceText: string): Node | null;

@@ -1,18 +0,12 @@

interface Patch {
/**
* A JSON path where the replacement should occur.
*/
path: string;
/**
* The value to insert at the specified path.
*/
value: string;
}
import { replace, ReplacePatch } from "./function/replace.mts";
import { remove, DeletePatch } from "./function/delete.mts";
import { insert, InsertPatch } from "./function/insert.mts";
import { batch, BatchPatch } from "./function/batch.mts";
declare function replace(sourceText: string, patches: Array<Patch>): string;
export { replace, Patch };
export { ReplacePatch, DeletePatch, InsertPatch, BatchPatch, replace, remove, insert, batch };
interface JSONCTS {
replace: typeof replace;
remove: typeof remove;
insert: typeof insert;
batch: typeof batch;
}

@@ -19,0 +13,0 @@

@@ -369,4 +369,40 @@ function _class_call_check(instance, Constructor) {

}
function parsePath(path) {
if (path.startsWith("/")) return parseJSONPointer(path);
return parseDotPath(path);
}
function parseDotPath(path) {
var result = [];
var i = 0;
while(i < path.length){
var ch = path[i];
if ("." === ch) {
i++;
continue;
}
if ("[" === ch) {
i++;
var num = "";
while(i < path.length && "]" !== path[i])num += path[i++];
i++;
result.push(Number(num));
continue;
}
var name = "";
while(i < path.length && /[a-zA-Z0-9_$]/.test(path[i]))name += path[i++];
result.push(name);
}
return result;
}
function parseJSONPointer(pointer) {
if ("" === pointer) return [];
if ("/" !== pointer[0]) throw new Error("Invalid JSON Pointer");
return pointer.slice(1).split("/").map(function(segment) {
return segment.replace(/~1/g, "/").replace(/~0/g, "~");
}).map(function(seg) {
return /^\d+$/.test(seg) ? Number(seg) : seg;
});
}
function resolvePath(root, path, sourceText) {
var parts = Array.isArray(path) ? path : parsePath(path);
var parts = Array.isArray(path) ? path : PathResolver_parsePath(path);
var node = root;

@@ -421,7 +457,7 @@ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;

}
function parsePath(path) {
if (path.startsWith("/")) return parseJSONPointer(path);
return parseDotPath(path);
function PathResolver_parsePath(path) {
if (path.startsWith("/")) return PathResolver_parseJSONPointer(path);
return PathResolver_parseDotPath(path);
}
function parseDotPath(path) {
function PathResolver_parseDotPath(path) {
var result = [];

@@ -449,3 +485,3 @@ var i = 0;

}
function parseJSONPointer(pointer) {
function PathResolver_parseJSONPointer(pointer) {
if ("" === pointer) return [];

@@ -459,7 +495,9 @@ if ("/" !== pointer[0]) throw new Error("Invalid JSON Pointer");

}
function replace(sourceText, patches) {
var tokenizer = new Tokenizer_Tokenizer(sourceText);
var tokens = tokenizer.tokenize();
var builder = new CSTBuilder_CSTBuilder(tokens);
var root = builder.build();
function replace(sourceText, patches, root) {
if (!root) {
var tokenizer = new Tokenizer_Tokenizer(sourceText);
var tokens = tokenizer.tokenize();
var builder = new CSTBuilder_CSTBuilder(tokens);
root = builder.build();
}
var reverseNodes = patches.map(function(patch) {

@@ -500,8 +538,274 @@ var node = resolvePath(root, patch.path, sourceText);

}
function remove(sourceText, patches, root) {
if (!root) {
var tokenizer = new Tokenizer_Tokenizer(sourceText);
var tokens = tokenizer.tokenize();
var builder = new CSTBuilder_CSTBuilder(tokens);
root = builder.build();
}
var reverseNodes = patches.map(function(patch) {
var pathParts = parsePath(patch.path);
if (0 === pathParts.length) return null;
var parentPath = pathParts.slice(0, -1);
var lastKey = pathParts[pathParts.length - 1];
var parentNode = parentPath.length > 0 ? resolvePath(root, parentPath, sourceText) : root;
if (!parentNode) return null;
return {
parentNode: parentNode,
lastKey: lastKey,
patch: patch
};
}).filter(function(v) {
return null !== v;
}).sort(function(a, b) {
var aStart = getDeleteStart(a.parentNode, a.lastKey, sourceText);
var bStart = getDeleteStart(b.parentNode, b.lastKey, sourceText);
return bStart - aStart;
});
var result = sourceText;
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
try {
for(var _iterator = reverseNodes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
var _step_value = _step.value, parentNode = _step_value.parentNode, lastKey = _step_value.lastKey;
result = deleteFromParent(result, parentNode, lastKey, sourceText);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally{
try {
if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
} finally{
if (_didIteratorError) throw _iteratorError;
}
}
return result;
}
function getDeleteStart(parentNode, key, sourceText) {
if ("Object" === parentNode.type) {
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
try {
for(var _iterator = parentNode.properties[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
var prop = _step.value;
var keyStr = extractString(prop.key, sourceText);
if (keyStr === key) return prop.key.start;
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally{
try {
if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
} finally{
if (_didIteratorError) throw _iteratorError;
}
}
} else if ("Array" === parentNode.type) {
if ("number" == typeof key && key >= 0 && key < parentNode.elements.length) return parentNode.elements[key].start;
}
return 0;
}
function deleteObjectProperty(sourceText, objectNode, key, originalSource) {
var propIndex = -1;
for(var i = 0; i < objectNode.properties.length; i++){
var keyStr = extractString(objectNode.properties[i].key, originalSource);
if (keyStr === key) {
propIndex = i;
break;
}
}
if (-1 === propIndex) return sourceText;
var prop = objectNode.properties[propIndex];
var deleteStart = prop.key.start;
var deleteEnd = prop.value.end;
if (propIndex < objectNode.properties.length - 1) {
var pos = deleteEnd;
while(pos < sourceText.length && (" " === sourceText[pos] || "\t" === sourceText[pos] || "\n" === sourceText[pos] || "\r" === sourceText[pos]))pos++;
if ("," === sourceText[pos]) {
deleteEnd = pos + 1;
while(deleteEnd < sourceText.length && (" " === sourceText[deleteEnd] || "\t" === sourceText[deleteEnd] || "\n" === sourceText[deleteEnd] || "\r" === sourceText[deleteEnd]))deleteEnd++;
}
} else if (propIndex > 0) {
var pos1 = deleteStart - 1;
while(pos1 >= 0 && (" " === sourceText[pos1] || "\t" === sourceText[pos1] || "\n" === sourceText[pos1] || "\r" === sourceText[pos1]))pos1--;
if ("," === sourceText[pos1]) {
pos1--;
while(pos1 >= 0 && (" " === sourceText[pos1] || "\t" === sourceText[pos1] || "\n" === sourceText[pos1] || "\r" === sourceText[pos1]))pos1--;
deleteStart = pos1 + 1;
}
}
return sourceText.slice(0, deleteStart) + sourceText.slice(deleteEnd);
}
function deleteArrayElement(sourceText, arrayNode, index, originalSource) {
if ("number" != typeof index || index < 0 || index >= arrayNode.elements.length) return sourceText;
var element = arrayNode.elements[index];
var deleteStart = element.start;
var deleteEnd = element.end;
if (index < arrayNode.elements.length - 1) {
var pos = deleteEnd;
while(pos < sourceText.length && (" " === sourceText[pos] || "\t" === sourceText[pos] || "\n" === sourceText[pos] || "\r" === sourceText[pos]))pos++;
if ("," === sourceText[pos]) {
deleteEnd = pos + 1;
while(deleteEnd < sourceText.length && (" " === sourceText[deleteEnd] || "\t" === sourceText[deleteEnd] || "\n" === sourceText[deleteEnd] || "\r" === sourceText[deleteEnd]))deleteEnd++;
}
} else if (index > 0) {
var pos1 = deleteStart - 1;
while(pos1 >= 0 && (" " === sourceText[pos1] || "\t" === sourceText[pos1] || "\n" === sourceText[pos1] || "\r" === sourceText[pos1]))pos1--;
if ("," === sourceText[pos1]) {
pos1--;
while(pos1 >= 0 && (" " === sourceText[pos1] || "\t" === sourceText[pos1] || "\n" === sourceText[pos1] || "\r" === sourceText[pos1]))pos1--;
deleteStart = pos1 + 1;
}
}
return sourceText.slice(0, deleteStart) + sourceText.slice(deleteEnd);
}
function deleteFromParent(sourceText, parentNode, key, originalSource) {
if ("Object" === parentNode.type) return deleteObjectProperty(sourceText, parentNode, key, originalSource);
if ("Array" === parentNode.type) return deleteArrayElement(sourceText, parentNode, key, originalSource);
return sourceText;
}
function insert(sourceText, patches, root) {
if (!root) {
var tokenizer = new Tokenizer_Tokenizer(sourceText);
var tokens = tokenizer.tokenize();
var builder = new CSTBuilder_CSTBuilder(tokens);
root = builder.build();
}
var reverseNodes = patches.map(function(patch) {
var node = resolvePath(root, patch.path, sourceText);
return {
node: node,
patch: patch
};
}).filter(function(v) {
return v.node;
}).sort(function(a, b) {
return b.node.start - a.node.start;
});
var result = sourceText;
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
try {
for(var _iterator = reverseNodes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
var _step_value = _step.value, node = _step_value.node, patch = _step_value.patch;
result = insertIntoNode(result, node, patch, sourceText);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally{
try {
if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
} finally{
if (_didIteratorError) throw _iteratorError;
}
}
return result;
}
function insertIntoNode(sourceText, node, patch, originalSource) {
if ("Object" === node.type) return insertObjectProperty(sourceText, node, patch, originalSource);
if ("Array" === node.type) return insertArrayElement(sourceText, node, patch, originalSource);
return sourceText;
}
function insertObjectProperty(sourceText, objectNode, patch, originalSource) {
if (!patch.key) throw new Error("Insert into object requires 'key' property");
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
try {
for(var _iterator = objectNode.properties[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
var prop = _step.value;
var keyStr = extractString(prop.key, originalSource);
if (keyStr === patch.key) throw new Error('Key "'.concat(patch.key, '" already exists in object'));
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally{
try {
if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
} finally{
if (_didIteratorError) throw _iteratorError;
}
}
var newEntry = '"'.concat(patch.key, '": ').concat(patch.value);
if (0 === objectNode.properties.length) {
var insertPos = objectNode.start + 1;
return sourceText.slice(0, insertPos) + newEntry + sourceText.slice(insertPos);
}
var lastProp = objectNode.properties[objectNode.properties.length - 1];
var insertPos1 = lastProp.value.end;
return sourceText.slice(0, insertPos1) + ", " + newEntry + sourceText.slice(insertPos1);
}
function insertArrayElement(sourceText, arrayNode, patch, originalSource) {
var position = void 0 !== patch.position ? patch.position : arrayNode.elements.length;
if (position < 0 || position > arrayNode.elements.length) throw new Error("Invalid position ".concat(position, " for array of length ").concat(arrayNode.elements.length));
if (0 === arrayNode.elements.length) {
var insertPos = arrayNode.start + 1;
return sourceText.slice(0, insertPos) + patch.value + sourceText.slice(insertPos);
}
if (0 === position) {
var insertPos1 = arrayNode.elements[0].start;
return sourceText.slice(0, insertPos1) + patch.value + ", " + sourceText.slice(insertPos1);
}
if (position >= arrayNode.elements.length) {
var lastElement = arrayNode.elements[arrayNode.elements.length - 1];
var insertPos2 = lastElement.end;
return sourceText.slice(0, insertPos2) + ", " + patch.value + sourceText.slice(insertPos2);
}
var insertPos3 = arrayNode.elements[position].start;
return sourceText.slice(0, insertPos3) + patch.value + ", " + sourceText.slice(insertPos3);
}
function batch(sourceText, patches) {
var tokenizer = new Tokenizer_Tokenizer(sourceText);
var tokens = tokenizer.tokenize();
var builder = new CSTBuilder_CSTBuilder(tokens);
var root = builder.build();
var replacePatches = [];
var deletePatches = [];
var insertPatches = [];
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
try {
for(var _iterator = patches[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
var p = _step.value;
if (void 0 !== p.value && void 0 === p.key && void 0 === p.position) replacePatches.push({
path: p.path,
value: p.value
});
else if (void 0 === p.value && void 0 === p.key && void 0 === p.position) deletePatches.push({
path: p.path
});
else {
if (void 0 === p.key && void 0 === p.position || void 0 === p.value) continue;
insertPatches.push(p);
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally{
try {
if (!_iteratorNormalCompletion && null != _iterator.return) _iterator.return();
} finally{
if (_didIteratorError) throw _iteratorError;
}
}
var result = sourceText;
if (replacePatches.length > 0) result = replace(result, replacePatches, root);
if (insertPatches.length > 0) {
var currentRoot = replacePatches.length > 0 ? null : root;
result = insert(result, insertPatches, currentRoot);
}
if (deletePatches.length > 0) {
var currentRoot1 = replacePatches.length > 0 || insertPatches.length > 0 ? null : root;
result = remove(result, deletePatches, currentRoot1);
}
return result;
}
var jsoncst = {
replace: replace
replace: replace,
remove: remove,
insert: insert,
batch: batch
};
var src = jsoncst;
export { src as default, replace };
export { batch, src as default, insert, remove, replace };
//# sourceMappingURL=index.mjs.map

@@ -1,1 +0,1 @@

{"version":3,"file":"esm/index.mjs","sources":["../../src/Tokenizer.js","../../src/CSTBuilder.js","../../src/PathResolver.js","../../src/index.js"],"sourcesContent":["class Tokenizer {\n\tconstructor(text) {\n\t\tthis.text = text;\n\t\tthis.pos = 0;\n\t\tthis.tokens = [];\n\t}\n\n\ttokenize() {\n\t\twhile (this.pos < this.text.length) {\n\t\t\tconst ch = this.text[this.pos];\n\n\t\t\tif (this.isWhitespace(ch)) {\n\t\t\t\tthis.readWhitespace();\n\t\t\t} else if (ch === '\"') {\n\t\t\t\tthis.readString();\n\t\t\t} else if (this.isNumberStart(ch)) {\n\t\t\t\tthis.readNumber();\n\t\t\t} else if (this.isAlpha(ch)) {\n\t\t\t\tthis.readKeyword();\n\t\t\t} else {\n\t\t\t\tthis.readPunctuationOrComment();\n\t\t\t}\n\t\t}\n\n\t\treturn this.tokens;\n\t}\n\n\t// ---------- helpers ----------\n\n\tisWhitespace(ch) {\n\t\treturn ch === \" \" || ch === \"\\n\" || ch === \"\\r\" || ch === \"\\t\";\n\t}\n\n\tisNumberStart(ch) {\n\t\treturn ch === \"-\" || (ch >= \"0\" && ch <= \"9\");\n\t}\n\n\tisAlpha(ch) {\n\t\treturn (ch >= \"a\" && ch <= \"z\") || (ch >= \"A\" && ch <= \"Z\");\n\t}\n\n\t// ---------- readers ----------\n\n\treadWhitespace() {\n\t\tconst start = this.pos;\n\t\twhile (this.pos < this.text.length && this.isWhitespace(this.text[this.pos])) {\n\t\t\tthis.pos++;\n\t\t}\n\t\tthis.tokens.push({\n\t\t\ttype: \"whitespace\",\n\t\t\tstart,\n\t\t\tend: this.pos,\n\t\t});\n\t}\n\n\treadString() {\n\t\tconst start = this.pos;\n\t\tthis.pos++; // skip opening \"\n\n\t\twhile (this.pos < this.text.length) {\n\t\t\tconst ch = this.text[this.pos];\n\n\t\t\tif (ch === \"\\\\\") {\n\t\t\t\t// skip escaped char\n\t\t\t\tthis.pos += 2;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (ch === '\"') {\n\t\t\t\tthis.pos++; // closing \"\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis.pos++;\n\t\t}\n\n\t\tthis.tokens.push({\n\t\t\ttype: \"string\",\n\t\t\tstart,\n\t\t\tend: this.pos,\n\t\t});\n\t}\n\n\treadNumber() {\n\t\tconst start = this.pos;\n\n\t\tif (this.text[this.pos] === \"-\") this.pos++;\n\n\t\twhile (this.pos < this.text.length && this.isDigit(this.text[this.pos])) {\n\t\t\tthis.pos++;\n\t\t}\n\n\t\tif (this.text[this.pos] === \".\") {\n\t\t\tthis.pos++;\n\t\t\twhile (this.pos < this.text.length && this.isDigit(this.text[this.pos])) {\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t}\n\n\t\tif (this.text[this.pos] === \"e\" || this.text[this.pos] === \"E\") {\n\t\t\tthis.pos++;\n\t\t\tif (this.text[this.pos] === \"+\" || this.text[this.pos] === \"-\") {\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t\twhile (this.pos < this.text.length && this.isDigit(this.text[this.pos])) {\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t}\n\n\t\tthis.tokens.push({\n\t\t\ttype: \"number\",\n\t\t\tstart,\n\t\t\tend: this.pos,\n\t\t});\n\t}\n\n\treadKeyword() {\n\t\tconst start = this.pos;\n\n\t\twhile (this.pos < this.text.length && this.isAlpha(this.text[this.pos])) {\n\t\t\tthis.pos++;\n\t\t}\n\n\t\tconst word = this.text.slice(start, this.pos);\n\n\t\tlet type;\n\t\tif (word === \"true\" || word === \"false\") {\n\t\t\ttype = \"boolean\";\n\t\t} else if (word === \"null\") {\n\t\t\ttype = \"null\";\n\t\t} else {\n\t\t\tthrow new Error(`Unexpected identifier: ${word}`);\n\t\t}\n\n\t\tthis.tokens.push({\n\t\t\ttype,\n\t\t\tstart,\n\t\t\tend: this.pos,\n\t\t});\n\t}\n\n\treadPunctuationOrComment() {\n\t\tconst start = this.pos;\n\t\tconst ch = this.text[this.pos];\n\n\t\t// line comment //\n\t\tif (ch === \"/\" && this.text[this.pos + 1] === \"/\") {\n\t\t\tthis.pos += 2;\n\t\t\twhile (this.pos < this.text.length && this.text[this.pos] !== \"\\n\") {\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t\tthis.tokens.push({\n\t\t\t\ttype: \"comment\",\n\t\t\t\tstart,\n\t\t\t\tend: this.pos,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// block comment /* */\n\t\tif (ch === \"/\" && this.text[this.pos + 1] === \"*\") {\n\t\t\tthis.pos += 2;\n\t\t\twhile (this.pos < this.text.length && !(this.text[this.pos] === \"*\" && this.text[this.pos + 1] === \"/\")) {\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t\tthis.pos += 2; // skip */\n\t\t\tthis.tokens.push({\n\t\t\t\ttype: \"comment\",\n\t\t\t\tstart,\n\t\t\t\tend: this.pos,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// punctuation\n\t\tthis.pos++;\n\n\t\tconst map = {\n\t\t\t\"{\": \"braceL\",\n\t\t\t\"}\": \"braceR\",\n\t\t\t\"[\": \"bracketL\",\n\t\t\t\"]\": \"bracketR\",\n\t\t\t\":\": \"colon\",\n\t\t\t\",\": \"comma\",\n\t\t};\n\n\t\tconst type = map[ch];\n\t\tif (!type) {\n\t\t\tthrow new Error(`Unexpected character: ${ch} at ${start}`);\n\t\t}\n\n\t\tthis.tokens.push({\n\t\t\ttype,\n\t\t\tstart,\n\t\t\tend: this.pos,\n\t\t});\n\t}\n\n\tisDigit(ch) {\n\t\treturn ch >= \"0\" && ch <= \"9\";\n\t}\n}\n\nexport { Tokenizer };\n","export class CSTBuilder {\n\tconstructor(tokens) {\n\t\tthis.tokens = tokens;\n\t\tthis.pos = 0;\n\t}\n\n\tbuild() {\n\t\tthis.skipTrivia();\n\t\tconst node = this.parseValue();\n\t\tthis.skipTrivia();\n\t\treturn node;\n\t}\n\n\tcurrent() {\n\t\treturn this.tokens[this.pos];\n\t}\n\n\tskipTrivia() {\n\t\twhile (this.pos < this.tokens.length && (this.tokens[this.pos].type === \"whitespace\" || this.tokens[this.pos].type === \"comment\")) {\n\t\t\tthis.pos++;\n\t\t}\n\t}\n\n\tconsume(type) {\n\t\tconst token = this.current();\n\t\tif (!token || token.type !== type) {\n\t\t\tthrow new Error(`Expected ${type}, got ${token && token.type}`);\n\t\t}\n\t\tthis.pos++;\n\t\treturn token;\n\t}\n\n\tparseValue() {\n\t\tthis.skipTrivia();\n\t\tconst token = this.current();\n\n\t\tif (!token) {\n\t\t\tthrow new Error(\"Unexpected end of input\");\n\t\t}\n\n\t\tswitch (token.type) {\n\t\t\tcase \"braceL\":\n\t\t\t\treturn this.parseObject();\n\t\t\tcase \"bracketL\":\n\t\t\t\treturn this.parseArray();\n\t\t\tcase \"string\":\n\t\t\t\treturn this.parsePrimitive(\"String\");\n\t\t\tcase \"number\":\n\t\t\t\treturn this.parsePrimitive(\"Number\");\n\t\t\tcase \"boolean\":\n\t\t\t\treturn this.parsePrimitive(\"Boolean\");\n\t\t\tcase \"null\":\n\t\t\t\treturn this.parsePrimitive(\"Null\");\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unexpected token: ${token.type}`);\n\t\t}\n\t}\n\n\tparsePrimitive(type) {\n\t\tconst token = this.current();\n\t\tthis.pos++;\n\t\treturn {\n\t\t\ttype,\n\t\t\tstart: token.start,\n\t\t\tend: token.end,\n\t\t};\n\t}\n\n\tparseObject() {\n\t\tconst startToken = this.consume(\"braceL\");\n\t\tconst properties = [];\n\n\t\tthis.skipTrivia();\n\n\t\twhile (this.current() && this.current().type !== \"braceR\") {\n\t\t\tconst keyToken = this.consume(\"string\");\n\t\t\tconst keyNode = {\n\t\t\t\ttype: \"String\",\n\t\t\t\tstart: keyToken.start,\n\t\t\t\tend: keyToken.end,\n\t\t\t};\n\n\t\t\tthis.skipTrivia();\n\t\t\tthis.consume(\"colon\");\n\t\t\tthis.skipTrivia();\n\n\t\t\tconst valueNode = this.parseValue();\n\n\t\t\tproperties.push({ key: keyNode, value: valueNode });\n\n\t\t\tthis.skipTrivia();\n\t\t\tif (this.current() && this.current().type === \"comma\") {\n\t\t\t\tthis.pos++;\n\t\t\t\tthis.skipTrivia();\n\t\t\t}\n\t\t}\n\n\t\tconst endToken = this.consume(\"braceR\");\n\n\t\treturn {\n\t\t\ttype: \"Object\",\n\t\t\tstart: startToken.start,\n\t\t\tend: endToken.end,\n\t\t\tproperties,\n\t\t};\n\t}\n\n\tparseArray() {\n\t\tconst startToken = this.consume(\"bracketL\");\n\t\tconst elements = [];\n\n\t\tthis.skipTrivia();\n\n\t\twhile (this.current() && this.current().type !== \"bracketR\") {\n\t\t\tconst valueNode = this.parseValue();\n\t\t\telements.push(valueNode);\n\n\t\t\tthis.skipTrivia();\n\t\t\tif (this.current() && this.current().type === \"comma\") {\n\t\t\t\tthis.pos++;\n\t\t\t\tthis.skipTrivia();\n\t\t\t}\n\t\t}\n\n\t\tconst endToken = this.consume(\"bracketR\");\n\n\t\treturn {\n\t\t\ttype: \"Array\",\n\t\t\tstart: startToken.start,\n\t\t\tend: endToken.end,\n\t\t\telements,\n\t\t};\n\t}\n}\n","function unescapeString(str) {\n\treturn str.replace(/\\\\(.)/g, (_, ch) => {\n\t\tswitch (ch) {\n\t\t\tcase '\"':\n\t\t\t\treturn '\"';\n\t\t\tcase \"\\\\\":\n\t\t\t\treturn \"\\\\\";\n\t\t\tcase \"/\":\n\t\t\t\treturn \"/\";\n\t\t\tcase \"b\":\n\t\t\t\treturn \"\\b\";\n\t\t\tcase \"f\":\n\t\t\t\treturn \"\\f\";\n\t\t\tcase \"n\":\n\t\t\t\treturn \"\\n\";\n\t\t\tcase \"r\":\n\t\t\t\treturn \"\\r\";\n\t\t\tcase \"t\":\n\t\t\t\treturn \"\\t\";\n\t\t\tdefault:\n\t\t\t\treturn ch; // \\uXXXX 可后续增强\n\t\t}\n\t});\n}\n\nfunction extractString(stringNode, sourceText) {\n\t// sourceText 是完整 JSON 文本\n\t// stringNode.start / end 覆盖包含引号\n\tconst raw = sourceText.slice(stringNode.start + 1, stringNode.end - 1);\n\treturn unescapeString(raw);\n}\n\nexport function resolvePath(root, path, sourceText) {\n\tconst parts = Array.isArray(path) ? path : parsePath(path);\n\tlet node = root;\n\n\tfor (const part of parts) {\n\t\tif (!node) return null;\n\n\t\tif (node.type === \"Object\") {\n\t\t\tnode = resolveObjectProperty(node, part, sourceText);\n\t\t} else if (node.type === \"Array\") {\n\t\t\tnode = resolveArrayElement(node, part);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\treturn node;\n}\n\nfunction resolveObjectProperty(objectNode, key, sourceText) {\n\tif (typeof key !== \"string\") return null;\n\n\tfor (const prop of objectNode.properties) {\n\t\tconst name = extractString(prop.key, sourceText);\n\t\tif (name === key) {\n\t\t\treturn prop.value;\n\t\t}\n\t}\n\treturn null;\n}\n\nfunction resolveArrayElement(arrayNode, index) {\n\tif (typeof index !== \"number\") return null;\n\treturn arrayNode.elements[index] || null;\n}\n\nfunction parsePath(path) {\n\tif (path.startsWith(\"/\")) {\n\t\treturn parseJSONPointer(path);\n\t}\n\treturn parseDotPath(path);\n}\n\nfunction parseDotPath(path) {\n\tconst result = [];\n\tlet i = 0;\n\n\twhile (i < path.length) {\n\t\tconst ch = path[i];\n\n\t\t// skip dot\n\t\tif (ch === \".\") {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// array index: [123]\n\t\tif (ch === \"[\") {\n\t\t\ti++;\n\t\t\tlet num = \"\";\n\t\t\twhile (i < path.length && path[i] !== \"]\") {\n\t\t\t\tnum += path[i++];\n\t\t\t}\n\t\t\ti++; // skip ]\n\t\t\tresult.push(Number(num));\n\t\t\tcontinue;\n\t\t}\n\n\t\t// identifier\n\t\tlet name = \"\";\n\t\twhile (i < path.length && /[a-zA-Z0-9_$]/.test(path[i])) {\n\t\t\tname += path[i++];\n\t\t}\n\t\tresult.push(name);\n\t}\n\n\treturn result;\n}\n\nfunction parseJSONPointer(pointer) {\n\tif (pointer === \"\") return [];\n\n\tif (pointer[0] !== \"/\") {\n\t\tthrow new Error(\"Invalid JSON Pointer\");\n\t}\n\n\treturn pointer\n\t\t.slice(1)\n\t\t.split(\"/\")\n\t\t.map((segment) => segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\"))\n\t\t.map((seg) => {\n\t\t\treturn /^\\d+$/.test(seg) ? Number(seg) : seg;\n\t\t});\n}\n","import { Tokenizer } from \"./Tokenizer.js\";\nimport { CSTBuilder } from \"./CSTBuilder.js\";\nimport { resolvePath } from \"./PathResolver.js\";\n\nfunction replace(sourceText, patches) {\n\tconst tokenizer = new Tokenizer(sourceText);\n\tconst tokens = tokenizer.tokenize();\n\n\tconst builder = new CSTBuilder(tokens);\n\tconst root = builder.build();\n\n\t// 倒叙替换\n\tconst reverseNodes = patches\n\t\t.map((patch) => {\n\t\t\tconst node = resolvePath(root, patch.path, sourceText);\n\n\t\t\treturn {\n\t\t\t\tnode,\n\t\t\t\tpatch,\n\t\t\t};\n\t\t})\n\t\t.filter((v) => v.node)\n\t\t.sort((a, b) => b.node.start - a.node.start);\n\n\t// 确保不会冲突\n\treverseNodes.reduce((lastEnd, { node }) => {\n\t\tif (node.end > lastEnd) {\n\t\t\tthrow new Error(`Patch conflict at path: ${node.path}`);\n\t\t}\n\n\t\treturn node.start;\n\t}, Infinity);\n\n\tlet result = sourceText;\n\n\tfor (const { node, patch } of reverseNodes) {\n\t\tresult = result.slice(0, node.start) + patch.value + result.slice(node.end);\n\t}\n\n\treturn result;\n}\n\nconst jsoncst = {\n\treplace: replace,\n};\n\nexport { replace };\nexport default jsoncst;\n"],"names":["Tokenizer","text","tokenize","ch","isWhitespace","isNumberStart","isAlpha","readWhitespace","start","readString","readNumber","readKeyword","word","type","Error","readPunctuationOrComment","map","isDigit","CSTBuilder","tokens","build","node","current","skipTrivia","consume","token","parseValue","parsePrimitive","parseObject","startToken","properties","keyToken","keyNode","valueNode","endToken","parseArray","elements","unescapeString","str","_","extractString","stringNode","sourceText","raw","resolvePath","root","path","parts","Array","parsePath","_iteratorError","part","resolveObjectProperty","resolveArrayElement","objectNode","key","prop","name","arrayNode","index","parseJSONPointer","parseDotPath","result","i","num","Number","pointer","segment","seg","replace","patches","tokenizer","builder","reverseNodes","patch","v","a","b","lastEnd","Infinity","jsoncst"],"mappings":"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"}
{"version":3,"file":"esm/index.mjs","sources":["../../src/Tokenizer.js","../../src/CSTBuilder.js","../../src/helper.js","../../src/PathResolver.js","../../src/function/replace.js","../../src/function/delete.js","../../src/function/insert.js","../../src/function/batch.js","../../src/index.js"],"sourcesContent":["class Tokenizer {\n\tconstructor(text) {\n\t\tthis.text = text;\n\t\tthis.pos = 0;\n\t\tthis.tokens = [];\n\t}\n\n\ttokenize() {\n\t\twhile (this.pos < this.text.length) {\n\t\t\tconst ch = this.text[this.pos];\n\n\t\t\tif (this.isWhitespace(ch)) {\n\t\t\t\tthis.readWhitespace();\n\t\t\t} else if (ch === '\"') {\n\t\t\t\tthis.readString();\n\t\t\t} else if (this.isNumberStart(ch)) {\n\t\t\t\tthis.readNumber();\n\t\t\t} else if (this.isAlpha(ch)) {\n\t\t\t\tthis.readKeyword();\n\t\t\t} else {\n\t\t\t\tthis.readPunctuationOrComment();\n\t\t\t}\n\t\t}\n\n\t\treturn this.tokens;\n\t}\n\n\t// ---------- helpers ----------\n\n\tisWhitespace(ch) {\n\t\treturn ch === \" \" || ch === \"\\n\" || ch === \"\\r\" || ch === \"\\t\";\n\t}\n\n\tisNumberStart(ch) {\n\t\treturn ch === \"-\" || (ch >= \"0\" && ch <= \"9\");\n\t}\n\n\tisAlpha(ch) {\n\t\treturn (ch >= \"a\" && ch <= \"z\") || (ch >= \"A\" && ch <= \"Z\");\n\t}\n\n\t// ---------- readers ----------\n\n\treadWhitespace() {\n\t\tconst start = this.pos;\n\t\twhile (this.pos < this.text.length && this.isWhitespace(this.text[this.pos])) {\n\t\t\tthis.pos++;\n\t\t}\n\t\tthis.tokens.push({\n\t\t\ttype: \"whitespace\",\n\t\t\tstart,\n\t\t\tend: this.pos,\n\t\t});\n\t}\n\n\treadString() {\n\t\tconst start = this.pos;\n\t\tthis.pos++; // skip opening \"\n\n\t\twhile (this.pos < this.text.length) {\n\t\t\tconst ch = this.text[this.pos];\n\n\t\t\tif (ch === \"\\\\\") {\n\t\t\t\t// skip escaped char\n\t\t\t\tthis.pos += 2;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (ch === '\"') {\n\t\t\t\tthis.pos++; // closing \"\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis.pos++;\n\t\t}\n\n\t\tthis.tokens.push({\n\t\t\ttype: \"string\",\n\t\t\tstart,\n\t\t\tend: this.pos,\n\t\t});\n\t}\n\n\treadNumber() {\n\t\tconst start = this.pos;\n\n\t\tif (this.text[this.pos] === \"-\") this.pos++;\n\n\t\twhile (this.pos < this.text.length && this.isDigit(this.text[this.pos])) {\n\t\t\tthis.pos++;\n\t\t}\n\n\t\tif (this.text[this.pos] === \".\") {\n\t\t\tthis.pos++;\n\t\t\twhile (this.pos < this.text.length && this.isDigit(this.text[this.pos])) {\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t}\n\n\t\tif (this.text[this.pos] === \"e\" || this.text[this.pos] === \"E\") {\n\t\t\tthis.pos++;\n\t\t\tif (this.text[this.pos] === \"+\" || this.text[this.pos] === \"-\") {\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t\twhile (this.pos < this.text.length && this.isDigit(this.text[this.pos])) {\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t}\n\n\t\tthis.tokens.push({\n\t\t\ttype: \"number\",\n\t\t\tstart,\n\t\t\tend: this.pos,\n\t\t});\n\t}\n\n\treadKeyword() {\n\t\tconst start = this.pos;\n\n\t\twhile (this.pos < this.text.length && this.isAlpha(this.text[this.pos])) {\n\t\t\tthis.pos++;\n\t\t}\n\n\t\tconst word = this.text.slice(start, this.pos);\n\n\t\tlet type;\n\t\tif (word === \"true\" || word === \"false\") {\n\t\t\ttype = \"boolean\";\n\t\t} else if (word === \"null\") {\n\t\t\ttype = \"null\";\n\t\t} else {\n\t\t\tthrow new Error(`Unexpected identifier: ${word}`);\n\t\t}\n\n\t\tthis.tokens.push({\n\t\t\ttype,\n\t\t\tstart,\n\t\t\tend: this.pos,\n\t\t});\n\t}\n\n\treadPunctuationOrComment() {\n\t\tconst start = this.pos;\n\t\tconst ch = this.text[this.pos];\n\n\t\t// line comment //\n\t\tif (ch === \"/\" && this.text[this.pos + 1] === \"/\") {\n\t\t\tthis.pos += 2;\n\t\t\twhile (this.pos < this.text.length && this.text[this.pos] !== \"\\n\") {\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t\tthis.tokens.push({\n\t\t\t\ttype: \"comment\",\n\t\t\t\tstart,\n\t\t\t\tend: this.pos,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// block comment /* */\n\t\tif (ch === \"/\" && this.text[this.pos + 1] === \"*\") {\n\t\t\tthis.pos += 2;\n\t\t\twhile (this.pos < this.text.length && !(this.text[this.pos] === \"*\" && this.text[this.pos + 1] === \"/\")) {\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t\tthis.pos += 2; // skip */\n\t\t\tthis.tokens.push({\n\t\t\t\ttype: \"comment\",\n\t\t\t\tstart,\n\t\t\t\tend: this.pos,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// punctuation\n\t\tthis.pos++;\n\n\t\tconst map = {\n\t\t\t\"{\": \"braceL\",\n\t\t\t\"}\": \"braceR\",\n\t\t\t\"[\": \"bracketL\",\n\t\t\t\"]\": \"bracketR\",\n\t\t\t\":\": \"colon\",\n\t\t\t\",\": \"comma\",\n\t\t};\n\n\t\tconst type = map[ch];\n\t\tif (!type) {\n\t\t\tthrow new Error(`Unexpected character: ${ch} at ${start}`);\n\t\t}\n\n\t\tthis.tokens.push({\n\t\t\ttype,\n\t\t\tstart,\n\t\t\tend: this.pos,\n\t\t});\n\t}\n\n\tisDigit(ch) {\n\t\treturn ch >= \"0\" && ch <= \"9\";\n\t}\n}\n\nexport { Tokenizer };\n","export class CSTBuilder {\n\tconstructor(tokens) {\n\t\tthis.tokens = tokens;\n\t\tthis.pos = 0;\n\t}\n\n\tbuild() {\n\t\tthis.skipTrivia();\n\t\tconst node = this.parseValue();\n\t\tthis.skipTrivia();\n\t\treturn node;\n\t}\n\n\tcurrent() {\n\t\treturn this.tokens[this.pos];\n\t}\n\n\tskipTrivia() {\n\t\twhile (this.pos < this.tokens.length && (this.tokens[this.pos].type === \"whitespace\" || this.tokens[this.pos].type === \"comment\")) {\n\t\t\tthis.pos++;\n\t\t}\n\t}\n\n\tconsume(type) {\n\t\tconst token = this.current();\n\t\tif (!token || token.type !== type) {\n\t\t\tthrow new Error(`Expected ${type}, got ${token && token.type}`);\n\t\t}\n\t\tthis.pos++;\n\t\treturn token;\n\t}\n\n\tparseValue() {\n\t\tthis.skipTrivia();\n\t\tconst token = this.current();\n\n\t\tif (!token) {\n\t\t\tthrow new Error(\"Unexpected end of input\");\n\t\t}\n\n\t\tswitch (token.type) {\n\t\t\tcase \"braceL\":\n\t\t\t\treturn this.parseObject();\n\t\t\tcase \"bracketL\":\n\t\t\t\treturn this.parseArray();\n\t\t\tcase \"string\":\n\t\t\t\treturn this.parsePrimitive(\"String\");\n\t\t\tcase \"number\":\n\t\t\t\treturn this.parsePrimitive(\"Number\");\n\t\t\tcase \"boolean\":\n\t\t\t\treturn this.parsePrimitive(\"Boolean\");\n\t\t\tcase \"null\":\n\t\t\t\treturn this.parsePrimitive(\"Null\");\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Unexpected token: ${token.type}`);\n\t\t}\n\t}\n\n\tparsePrimitive(type) {\n\t\tconst token = this.current();\n\t\tthis.pos++;\n\t\treturn {\n\t\t\ttype,\n\t\t\tstart: token.start,\n\t\t\tend: token.end,\n\t\t};\n\t}\n\n\tparseObject() {\n\t\tconst startToken = this.consume(\"braceL\");\n\t\tconst properties = [];\n\n\t\tthis.skipTrivia();\n\n\t\twhile (this.current() && this.current().type !== \"braceR\") {\n\t\t\tconst keyToken = this.consume(\"string\");\n\t\t\tconst keyNode = {\n\t\t\t\ttype: \"String\",\n\t\t\t\tstart: keyToken.start,\n\t\t\t\tend: keyToken.end,\n\t\t\t};\n\n\t\t\tthis.skipTrivia();\n\t\t\tthis.consume(\"colon\");\n\t\t\tthis.skipTrivia();\n\n\t\t\tconst valueNode = this.parseValue();\n\n\t\t\tproperties.push({ key: keyNode, value: valueNode });\n\n\t\t\tthis.skipTrivia();\n\t\t\tif (this.current() && this.current().type === \"comma\") {\n\t\t\t\tthis.pos++;\n\t\t\t\tthis.skipTrivia();\n\t\t\t}\n\t\t}\n\n\t\tconst endToken = this.consume(\"braceR\");\n\n\t\treturn {\n\t\t\ttype: \"Object\",\n\t\t\tstart: startToken.start,\n\t\t\tend: endToken.end,\n\t\t\tproperties,\n\t\t};\n\t}\n\n\tparseArray() {\n\t\tconst startToken = this.consume(\"bracketL\");\n\t\tconst elements = [];\n\n\t\tthis.skipTrivia();\n\n\t\twhile (this.current() && this.current().type !== \"bracketR\") {\n\t\t\tconst valueNode = this.parseValue();\n\t\t\telements.push(valueNode);\n\n\t\t\tthis.skipTrivia();\n\t\t\tif (this.current() && this.current().type === \"comma\") {\n\t\t\t\tthis.pos++;\n\t\t\t\tthis.skipTrivia();\n\t\t\t}\n\t\t}\n\n\t\tconst endToken = this.consume(\"bracketR\");\n\n\t\treturn {\n\t\t\ttype: \"Array\",\n\t\t\tstart: startToken.start,\n\t\t\tend: endToken.end,\n\t\t\telements,\n\t\t};\n\t}\n}\n","function unescapeString(str) {\n\treturn str.replace(/\\\\(.)/g, (_, ch) => {\n\t\tswitch (ch) {\n\t\t\tcase '\"':\n\t\t\t\treturn '\"';\n\t\t\tcase \"\\\\\":\n\t\t\t\treturn \"\\\\\";\n\t\t\tcase \"/\":\n\t\t\t\treturn \"/\";\n\t\t\tcase \"b\":\n\t\t\t\treturn \"\\b\";\n\t\t\tcase \"f\":\n\t\t\t\treturn \"\\f\";\n\t\t\tcase \"n\":\n\t\t\t\treturn \"\\n\";\n\t\t\tcase \"r\":\n\t\t\t\treturn \"\\r\";\n\t\t\tcase \"t\":\n\t\t\t\treturn \"\\t\";\n\t\t\tdefault:\n\t\t\t\treturn ch; // \\uXXXX 可后续增强\n\t\t}\n\t});\n}\n\nexport function extractString(stringNode, sourceText) {\n\t// sourceText 是完整 JSON 文本\n\t// stringNode.start / end 覆盖包含引号\n\tconst raw = sourceText.slice(stringNode.start + 1, stringNode.end - 1);\n\treturn unescapeString(raw);\n}\n\n/**\n *\n * @param {string} path\n * @returns\n */\nexport function parsePath(path) {\n\tif (path.startsWith(\"/\")) {\n\t\treturn parseJSONPointer(path);\n\t}\n\treturn parseDotPath(path);\n}\n\n/**\n *\n * @param {string} path\n * @returns\n */\nfunction parseDotPath(path) {\n\tconst result = [];\n\tlet i = 0;\n\n\twhile (i < path.length) {\n\t\tconst ch = path[i];\n\n\t\t// skip dot\n\t\tif (ch === \".\") {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// array index: [123]\n\t\tif (ch === \"[\") {\n\t\t\ti++;\n\t\t\tlet num = \"\";\n\t\t\twhile (i < path.length && path[i] !== \"]\") {\n\t\t\t\tnum += path[i++];\n\t\t\t}\n\t\t\ti++; // skip ]\n\t\t\tresult.push(Number(num));\n\t\t\tcontinue;\n\t\t}\n\n\t\t// identifier\n\t\tlet name = \"\";\n\t\twhile (i < path.length && /[a-zA-Z0-9_$]/.test(path[i])) {\n\t\t\tname += path[i++];\n\t\t}\n\t\tresult.push(name);\n\t}\n\n\treturn result;\n}\n\n/**\n *\n * @param {string} pointer\n * @returns\n */\nfunction parseJSONPointer(pointer) {\n\tif (pointer === \"\") return [];\n\n\tif (pointer[0] !== \"/\") {\n\t\tthrow new Error(\"Invalid JSON Pointer\");\n\t}\n\n\treturn pointer\n\t\t.slice(1)\n\t\t.split(\"/\")\n\t\t.map((segment) => segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\"))\n\t\t.map((seg) => {\n\t\t\treturn /^\\d+$/.test(seg) ? Number(seg) : seg;\n\t\t});\n}\n","import { extractString } from \"./helper.js\";\n\nexport function resolvePath(root, path, sourceText) {\n\tconst parts = Array.isArray(path) ? path : parsePath(path);\n\tlet node = root;\n\n\tfor (const part of parts) {\n\t\tif (!node) return null;\n\n\t\tif (node.type === \"Object\") {\n\t\t\tnode = resolveObjectProperty(node, part, sourceText);\n\t\t} else if (node.type === \"Array\") {\n\t\t\tnode = resolveArrayElement(node, part);\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\treturn node;\n}\n\n/**\n *\n * @param {import('./CSTBuilder.js').NodeObject} objectNode\n * @param {string} key\n * @param {string} sourceText\n * @returns {import('./CSTBuilder.js').Node | null}\n */\nfunction resolveObjectProperty(objectNode, key, sourceText) {\n\tif (typeof key !== \"string\") return null;\n\n\tfor (const prop of objectNode.properties) {\n\t\tconst name = extractString(prop.key, sourceText);\n\t\tif (name === key) {\n\t\t\treturn prop.value;\n\t\t}\n\t}\n\treturn null;\n}\n\n/**\n *\n * @param {import('./CSTBuilder.js').NodeArray} arrayNode\n * @param {number} index\n * @returns {import('./CSTBuilder.js').Node | null}\n */\nfunction resolveArrayElement(arrayNode, index) {\n\tif (typeof index !== \"number\") return null;\n\treturn arrayNode.elements[index] || null;\n}\n\nfunction parsePath(path) {\n\tif (path.startsWith(\"/\")) {\n\t\treturn parseJSONPointer(path);\n\t}\n\treturn parseDotPath(path);\n}\n\nfunction parseDotPath(path) {\n\tconst result = [];\n\tlet i = 0;\n\n\twhile (i < path.length) {\n\t\tconst ch = path[i];\n\n\t\t// skip dot\n\t\tif (ch === \".\") {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\t// array index: [123]\n\t\tif (ch === \"[\") {\n\t\t\ti++;\n\t\t\tlet num = \"\";\n\t\t\twhile (i < path.length && path[i] !== \"]\") {\n\t\t\t\tnum += path[i++];\n\t\t\t}\n\t\t\ti++; // skip ]\n\t\t\tresult.push(Number(num));\n\t\t\tcontinue;\n\t\t}\n\n\t\t// identifier\n\t\tlet name = \"\";\n\t\twhile (i < path.length && /[a-zA-Z0-9_$]/.test(path[i])) {\n\t\t\tname += path[i++];\n\t\t}\n\t\tresult.push(name);\n\t}\n\n\treturn result;\n}\n\nfunction parseJSONPointer(pointer) {\n\tif (pointer === \"\") return [];\n\n\tif (pointer[0] !== \"/\") {\n\t\tthrow new Error(\"Invalid JSON Pointer\");\n\t}\n\n\treturn pointer\n\t\t.slice(1)\n\t\t.split(\"/\")\n\t\t.map((segment) => segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\"))\n\t\t.map((seg) => {\n\t\t\treturn /^\\d+$/.test(seg) ? Number(seg) : seg;\n\t\t});\n}\n","import { Tokenizer } from \"../Tokenizer.js\";\nimport { CSTBuilder } from \"../CSTBuilder.js\";\nimport { resolvePath } from \"../PathResolver.js\";\n\nexport function replace(sourceText, patches, root) {\n\tif (!root) {\n\t\tconst tokenizer = new Tokenizer(sourceText);\n\t\tconst tokens = tokenizer.tokenize();\n\n\t\tconst builder = new CSTBuilder(tokens);\n\t\troot = builder.build();\n\t}\n\n\t// 倒叙替换\n\tconst reverseNodes = patches\n\t\t.map((patch) => {\n\t\t\tconst node = resolvePath(root, patch.path, sourceText);\n\n\t\t\treturn {\n\t\t\t\tnode,\n\t\t\t\tpatch,\n\t\t\t};\n\t\t})\n\t\t.filter((v) => v.node)\n\t\t.sort((a, b) => b.node.start - a.node.start);\n\n\t// 确保不会冲突\n\treverseNodes.reduce((lastEnd, { node }) => {\n\t\tif (node.end > lastEnd) {\n\t\t\tthrow new Error(`Patch conflict at path: ${node.path}`);\n\t\t}\n\n\t\treturn node.start;\n\t}, Infinity);\n\n\tlet result = sourceText;\n\n\tfor (const { node, patch } of reverseNodes) {\n\t\tresult = result.slice(0, node.start) + patch.value + result.slice(node.end);\n\t}\n\n\treturn result;\n}\n","import { Tokenizer } from \"../Tokenizer.js\";\nimport { CSTBuilder } from \"../CSTBuilder.js\";\nimport { resolvePath } from \"../PathResolver.js\";\nimport { parsePath, extractString } from \"../helper.js\";\n\nexport function remove(sourceText, patches, root) {\n\tif (!root) {\n\t\tconst tokenizer = new Tokenizer(sourceText);\n\t\tconst tokens = tokenizer.tokenize();\n\n\t\tconst builder = new CSTBuilder(tokens);\n\t\troot = builder.build();\n\t}\n\n\t// 倒叙删除\n\tconst reverseNodes = patches\n\t\t.map((patch) => {\n\t\t\tconst pathParts = parsePath(patch.path);\n\t\t\tif (pathParts.length === 0) {\n\t\t\t\treturn null; // Cannot delete root\n\t\t\t}\n\n\t\t\t// Find parent and the item to delete\n\t\t\tconst parentPath = pathParts.slice(0, -1);\n\t\t\tconst lastKey = pathParts[pathParts.length - 1];\n\t\t\tconst parentNode = parentPath.length > 0 ? resolvePath(root, parentPath, sourceText) : root;\n\n\t\t\tif (!parentNode) return null;\n\n\t\t\treturn {\n\t\t\t\tparentNode,\n\t\t\t\tlastKey,\n\t\t\t\tpatch,\n\t\t\t};\n\t\t})\n\t\t.filter((v) => v !== null)\n\t\t.sort((a, b) => {\n\t\t\t// Sort by the start position of what we're deleting\n\t\t\tconst aStart = getDeleteStart(a.parentNode, a.lastKey, sourceText);\n\t\t\tconst bStart = getDeleteStart(b.parentNode, b.lastKey, sourceText);\n\t\t\treturn bStart - aStart;\n\t\t});\n\n\tlet result = sourceText;\n\n\tfor (const { parentNode, lastKey } of reverseNodes) {\n\t\tresult = deleteFromParent(result, parentNode, lastKey, sourceText);\n\t}\n\n\treturn result;\n}\n\nfunction getDeleteStart(parentNode, key, sourceText) {\n\tif (parentNode.type === \"Object\") {\n\t\tfor (const prop of parentNode.properties) {\n\t\t\tconst keyStr = extractString(prop.key, sourceText);\n\t\t\tif (keyStr === key) {\n\t\t\t\treturn prop.key.start;\n\t\t\t}\n\t\t}\n\t} else if (parentNode.type === \"Array\") {\n\t\tif (typeof key === \"number\" && key >= 0 && key < parentNode.elements.length) {\n\t\t\treturn parentNode.elements[key].start;\n\t\t}\n\t}\n\treturn 0;\n}\n\nfunction deleteObjectProperty(sourceText, objectNode, key, originalSource) {\n\tlet propIndex = -1;\n\tfor (let i = 0; i < objectNode.properties.length; i++) {\n\t\tconst keyStr = extractString(objectNode.properties[i].key, originalSource);\n\t\tif (keyStr === key) {\n\t\t\tpropIndex = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (propIndex === -1) return sourceText;\n\n\tconst prop = objectNode.properties[propIndex];\n\tlet deleteStart = prop.key.start;\n\tlet deleteEnd = prop.value.end;\n\n\t// Handle comma and whitespace\n\tif (propIndex < objectNode.properties.length - 1) {\n\t\t// Not the last property, look for comma after\n\t\tlet pos = deleteEnd;\n\t\twhile (\n\t\t\tpos < sourceText.length &&\n\t\t\t(sourceText[pos] === \" \" || sourceText[pos] === \"\\t\" || sourceText[pos] === \"\\n\" || sourceText[pos] === \"\\r\")\n\t\t) {\n\t\t\tpos++;\n\t\t}\n\t\tif (sourceText[pos] === \",\") {\n\t\t\tdeleteEnd = pos + 1;\n\t\t\t// Skip trailing whitespace after comma\n\t\t\twhile (\n\t\t\t\tdeleteEnd < sourceText.length &&\n\t\t\t\t(sourceText[deleteEnd] === \" \" ||\n\t\t\t\t\tsourceText[deleteEnd] === \"\\t\" ||\n\t\t\t\t\tsourceText[deleteEnd] === \"\\n\" ||\n\t\t\t\t\tsourceText[deleteEnd] === \"\\r\")\n\t\t\t) {\n\t\t\t\tdeleteEnd++;\n\t\t\t}\n\t\t}\n\t} else if (propIndex > 0) {\n\t\t// Last property, look for comma before (and whitespace before the comma)\n\t\tlet pos = deleteStart - 1;\n\t\t// Skip whitespace before the property\n\t\twhile (pos >= 0 && (sourceText[pos] === \" \" || sourceText[pos] === \"\\t\" || sourceText[pos] === \"\\n\" || sourceText[pos] === \"\\r\")) {\n\t\t\tpos--;\n\t\t}\n\t\tif (sourceText[pos] === \",\") {\n\t\t\t// Also skip whitespace before the comma\n\t\t\tlet commaPos = pos;\n\t\t\tpos--;\n\t\t\twhile (\n\t\t\t\tpos >= 0 &&\n\t\t\t\t(sourceText[pos] === \" \" || sourceText[pos] === \"\\t\" || sourceText[pos] === \"\\n\" || sourceText[pos] === \"\\r\")\n\t\t\t) {\n\t\t\t\tpos--;\n\t\t\t}\n\t\t\tdeleteStart = pos + 1;\n\t\t}\n\t}\n\n\treturn sourceText.slice(0, deleteStart) + sourceText.slice(deleteEnd);\n}\n\nfunction deleteArrayElement(sourceText, arrayNode, index, originalSource) {\n\tif (typeof index !== \"number\" || index < 0 || index >= arrayNode.elements.length) {\n\t\treturn sourceText;\n\t}\n\n\tconst element = arrayNode.elements[index];\n\tlet deleteStart = element.start;\n\tlet deleteEnd = element.end;\n\n\t// Handle comma and whitespace\n\tif (index < arrayNode.elements.length - 1) {\n\t\t// Not the last element, look for comma after\n\t\tlet pos = deleteEnd;\n\t\twhile (\n\t\t\tpos < sourceText.length &&\n\t\t\t(sourceText[pos] === \" \" || sourceText[pos] === \"\\t\" || sourceText[pos] === \"\\n\" || sourceText[pos] === \"\\r\")\n\t\t) {\n\t\t\tpos++;\n\t\t}\n\t\tif (sourceText[pos] === \",\") {\n\t\t\tdeleteEnd = pos + 1;\n\t\t\t// Skip trailing whitespace after comma\n\t\t\twhile (\n\t\t\t\tdeleteEnd < sourceText.length &&\n\t\t\t\t(sourceText[deleteEnd] === \" \" ||\n\t\t\t\t\tsourceText[deleteEnd] === \"\\t\" ||\n\t\t\t\t\tsourceText[deleteEnd] === \"\\n\" ||\n\t\t\t\t\tsourceText[deleteEnd] === \"\\r\")\n\t\t\t) {\n\t\t\t\tdeleteEnd++;\n\t\t\t}\n\t\t}\n\t} else if (index > 0) {\n\t\t// Last element, look for comma before (and whitespace before the comma)\n\t\tlet pos = deleteStart - 1;\n\t\t// Skip whitespace before the element\n\t\twhile (pos >= 0 && (sourceText[pos] === \" \" || sourceText[pos] === \"\\t\" || sourceText[pos] === \"\\n\" || sourceText[pos] === \"\\r\")) {\n\t\t\tpos--;\n\t\t}\n\t\tif (sourceText[pos] === \",\") {\n\t\t\t// Also skip whitespace before the comma\n\t\t\tlet commaPos = pos;\n\t\t\tpos--;\n\t\t\twhile (\n\t\t\t\tpos >= 0 &&\n\t\t\t\t(sourceText[pos] === \" \" || sourceText[pos] === \"\\t\" || sourceText[pos] === \"\\n\" || sourceText[pos] === \"\\r\")\n\t\t\t) {\n\t\t\t\tpos--;\n\t\t\t}\n\t\t\tdeleteStart = pos + 1;\n\t\t}\n\t}\n\n\treturn sourceText.slice(0, deleteStart) + sourceText.slice(deleteEnd);\n}\n\nfunction deleteFromParent(sourceText, parentNode, key, originalSource) {\n\tif (parentNode.type === \"Object\") {\n\t\treturn deleteObjectProperty(sourceText, parentNode, key, originalSource);\n\t} else if (parentNode.type === \"Array\") {\n\t\treturn deleteArrayElement(sourceText, parentNode, key, originalSource);\n\t}\n\treturn sourceText;\n}\n","import { Tokenizer } from \"../Tokenizer.js\";\nimport { CSTBuilder } from \"../CSTBuilder.js\";\nimport { resolvePath } from \"../PathResolver.js\";\nimport { extractString } from \"../helper.js\";\n\nexport function insert(sourceText, patches, root) {\n\tif (!root) {\n\t\tconst tokenizer = new Tokenizer(sourceText);\n\t\tconst tokens = tokenizer.tokenize();\n\n\t\tconst builder = new CSTBuilder(tokens);\n\t\troot = builder.build();\n\t}\n\n\t// 倒叙插入\n\tconst reverseNodes = patches\n\t\t.map((patch) => {\n\t\t\tconst node = resolvePath(root, patch.path, sourceText);\n\t\t\treturn {\n\t\t\t\tnode,\n\t\t\t\tpatch,\n\t\t\t};\n\t\t})\n\t\t.filter((v) => v.node)\n\t\t.sort((a, b) => b.node.start - a.node.start);\n\n\tlet result = sourceText;\n\n\tfor (const { node, patch } of reverseNodes) {\n\t\tresult = insertIntoNode(result, node, patch, sourceText);\n\t}\n\n\treturn result;\n}\n\nfunction insertIntoNode(sourceText, node, patch, originalSource) {\n\tif (node.type === \"Object\") {\n\t\treturn insertObjectProperty(sourceText, node, patch, originalSource);\n\t} else if (node.type === \"Array\") {\n\t\treturn insertArrayElement(sourceText, node, patch, originalSource);\n\t}\n\treturn sourceText;\n}\n\nfunction insertObjectProperty(sourceText, objectNode, patch, originalSource) {\n\tif (!patch.key) {\n\t\tthrow new Error(\"Insert into object requires 'key' property\");\n\t}\n\n\t// Check if key already exists\n\tfor (const prop of objectNode.properties) {\n\t\tconst keyStr = extractString(prop.key, originalSource);\n\t\tif (keyStr === patch.key) {\n\t\t\tthrow new Error(`Key \"${patch.key}\" already exists in object`);\n\t\t}\n\t}\n\n\tconst newEntry = `\"${patch.key}\": ${patch.value}`;\n\n\tif (objectNode.properties.length === 0) {\n\t\t// Empty object\n\t\tconst insertPos = objectNode.start + 1;\n\t\treturn sourceText.slice(0, insertPos) + newEntry + sourceText.slice(insertPos);\n\t} else {\n\t\t// Insert after last property\n\t\tconst lastProp = objectNode.properties[objectNode.properties.length - 1];\n\t\tconst insertPos = lastProp.value.end;\n\t\treturn sourceText.slice(0, insertPos) + \", \" + newEntry + sourceText.slice(insertPos);\n\t}\n}\n\nfunction insertArrayElement(sourceText, arrayNode, patch, originalSource) {\n\tconst position = patch.position !== undefined ? patch.position : arrayNode.elements.length;\n\n\tif (position < 0 || position > arrayNode.elements.length) {\n\t\tthrow new Error(`Invalid position ${position} for array of length ${arrayNode.elements.length}`);\n\t}\n\n\tif (arrayNode.elements.length === 0) {\n\t\t// Empty array\n\t\tconst insertPos = arrayNode.start + 1;\n\t\treturn sourceText.slice(0, insertPos) + patch.value + sourceText.slice(insertPos);\n\t} else if (position === 0) {\n\t\t// Insert at the beginning\n\t\tconst insertPos = arrayNode.elements[0].start;\n\t\treturn sourceText.slice(0, insertPos) + patch.value + \", \" + sourceText.slice(insertPos);\n\t} else if (position >= arrayNode.elements.length) {\n\t\t// Insert at the end\n\t\tconst lastElement = arrayNode.elements[arrayNode.elements.length - 1];\n\t\tconst insertPos = lastElement.end;\n\t\treturn sourceText.slice(0, insertPos) + \", \" + patch.value + sourceText.slice(insertPos);\n\t} else {\n\t\t// Insert in the middle\n\t\tconst insertPos = arrayNode.elements[position].start;\n\t\treturn sourceText.slice(0, insertPos) + patch.value + \", \" + sourceText.slice(insertPos);\n\t}\n}\n","import { replace } from \"./replace.js\";\nimport { remove } from \"./delete.js\";\nimport { insert } from \"./insert.js\";\nimport { Tokenizer } from \"../Tokenizer.js\";\nimport { CSTBuilder } from \"../CSTBuilder.js\";\n\nexport function batch(sourceText, patches) {\n\t// Parse the source text once\n\tconst tokenizer = new Tokenizer(sourceText);\n\tconst tokens = tokenizer.tokenize();\n\tconst builder = new CSTBuilder(tokens);\n\tconst root = builder.build();\n\n\t// Categorize patches by operation type\n\tconst replacePatches = [];\n\tconst deletePatches = [];\n\tconst insertPatches = [];\n\n\tfor (const p of patches) {\n\t\t// Determine patch type based on properties\n\t\tif (p.value !== undefined && p.key === undefined && p.position === undefined) {\n\t\t\t// Has value but no key/position -> replace operation\n\t\t\treplacePatches.push({ path: p.path, value: p.value });\n\t\t} else if (p.value === undefined && p.key === undefined && p.position === undefined) {\n\t\t\t// No value, key, or position -> delete operation\n\t\t\tdeletePatches.push({ path: p.path });\n\t\t} else if ((p.key !== undefined || p.position !== undefined) && p.value !== undefined) {\n\t\t\t// Has key or position with value -> insert operation\n\t\t\tinsertPatches.push(p);\n\t\t} else {\n\t\t\t// Invalid patch - skip it\n\t\t\tcontinue;\n\t\t}\n\t}\n\n\t// Apply patches in order: replace, insert, delete\n\t// This order ensures that replacements happen first, then inserts, then deletes\n\tlet result = sourceText;\n\n\t// Apply replacements\n\tif (replacePatches.length > 0) {\n\t\tresult = replace(result, replacePatches, root);\n\t}\n\n\t// Apply insertions\n\tif (insertPatches.length > 0) {\n\t\t// Need to re-parse if we did replacements\n\t\tconst currentRoot = replacePatches.length > 0 ? null : root;\n\t\tresult = insert(result, insertPatches, currentRoot);\n\t}\n\n\t// Apply deletions\n\tif (deletePatches.length > 0) {\n\t\t// Need to re-parse if we did replacements or insertions\n\t\tconst currentRoot = replacePatches.length > 0 || insertPatches.length > 0 ? null : root;\n\t\tresult = remove(result, deletePatches, currentRoot);\n\t}\n\n\treturn result;\n}\n","import { replace } from \"./function/replace.js\";\nimport { remove } from \"./function/delete.js\";\nimport { insert } from \"./function/insert.js\";\nimport { batch } from \"./function/batch.js\";\n\nconst jsoncst = {\n\treplace: replace,\n\tremove: remove,\n\tinsert: insert,\n\tbatch: batch,\n};\n\nexport { replace, remove, insert, batch };\n\nexport default jsoncst;\n"],"names":["Tokenizer","text","tokenize","ch","isWhitespace","isNumberStart","isAlpha","readWhitespace","start","readString","readNumber","readKeyword","word","type","Error","readPunctuationOrComment","map","isDigit","CSTBuilder","tokens","build","node","current","skipTrivia","consume","token","parseValue","parsePrimitive","parseObject","startToken","properties","keyToken","keyNode","valueNode","endToken","parseArray","elements","unescapeString","str","_","extractString","stringNode","sourceText","raw","parsePath","path","parseJSONPointer","parseDotPath","result","i","num","Number","name","pointer","segment","seg","resolvePath","root","parts","Array","_iteratorError","part","resolveObjectProperty","resolveArrayElement","objectNode","key","prop","arrayNode","index","replace","patches","tokenizer","builder","reverseNodes","patch","v","a","b","lastEnd","Infinity","remove","pathParts","parentPath","lastKey","parentNode","aStart","getDeleteStart","bStart","deleteFromParent","keyStr","deleteObjectProperty","originalSource","propIndex","deleteStart","deleteEnd","pos","pos1","deleteArrayElement","element","insert","insertIntoNode","insertObjectProperty","insertArrayElement","newEntry","insertPos","lastProp","insertPos1","position","undefined","lastElement","insertPos2","insertPos3","batch","replacePatches","deletePatches","insertPatches","p","currentRoot","currentRoot1","jsoncst"],"mappings":"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"}

@@ -5,4 +5,10 @@ import { Node } from "./CSTBuilder.mts";

declare function resolvePath(root: Node, path: Path): Node | null;
export { resolvePath };
/**
* Resolve a path within a JSON CST.
* @param root - The root node of the JSON CST.
* @param path - The path to resolve, either as a dot-separated string or an array of strings.
* @param sourceText - The original JSON source text.
* @returns The node at the specified path, or null if not found.
* @example
*/
export declare function resolvePath(root: Node, path: Path, sourceText: string): Node | null;
{
"name": "json-codemod",
"version": "1.0.0",
"version": "1.1.0",
"private": false,

@@ -5,0 +5,0 @@ "description": "A utility to patch the JSON string and preserve the original formatting, including comments and whitespace.",

+344
-22

@@ -13,3 +13,4 @@ # json-codemod

- 🎨 **Format Preservation** - Maintains comments, whitespace, and original formatting
- 🔄 **Precise Modifications** - Only changes specified values, leaving everything else intact
- 🔄 **Precise Modifications** - Replace, delete, and insert values while leaving everything else intact
- ⚡ **Unified Patch API** - Apply multiple operations efficiently in a single call
- 🚀 **Fast & Lightweight** - Zero dependencies, minimal footprint

@@ -36,5 +37,23 @@ - 📦 **Dual module support** - Works with both ESM and CommonJS

### Basic Usage
### Using Patch (Recommended for Multiple Operations)
```js
import { batch } from "json-codemod";
const source = '{"name": "Alice", "age": 30, "items": [1, 2]}';
// Apply multiple operations at once (most efficient)
const result = batch(source, [
{ path: "age", value: "31" }, // Replace
{ path: "name" }, // Delete (no value means delete)
{ path: "items", position: 2, value: "3" }, // Insert
]);
console.log(result);
// Output: {"age": 31, "items": [1, 2, 3]}
```
### Replace Values
```js
import { replace } from "json-codemod";

@@ -51,2 +70,34 @@

### Delete Properties and Elements
```js
import { remove } from "json-codemod";
const source = '{"name": "Alice", "age": 30, "city": "Beijing"}';
// Delete a property
const result = remove(source, [{ path: "age" }]);
console.log(result);
// Output: {"name": "Alice", "city": "Beijing"}
```
### Insert Properties and Elements
```js
import { insert } from "json-codemod";
// Insert into object
const source1 = '{"name": "Alice"}';
const result1 = insert(source1, [{ path: "", key: "age", value: "30" }]);
console.log(result1);
// Output: {"name": "Alice", "age": 30}
// Insert into array
const source2 = '{"numbers": [1, 3, 4]}';
const result2 = insert(source2, [{ path: "numbers", position: 1, value: "2" }]);
console.log(result2);
// Output: {"numbers": [1, 2, 3, 4]}
```
### Preserving Format and Comments

@@ -75,4 +126,6 @@

### Modifying Nested Objects
### Replace Operations
#### Modifying Nested Objects
```js

@@ -86,3 +139,3 @@ const source = '{"user": {"name": "Alice", "profile": {"age": 30}}}';

### Modifying Array Elements
#### Modifying Array Elements

@@ -97,3 +150,3 @@ ```js

### Using JSON Pointer
#### Using JSON Pointer

@@ -108,3 +161,3 @@ ```js

### Batch Modifications
#### Batch Modifications

@@ -123,3 +176,3 @@ ```js

### Modifying String Values
#### Modifying String Values

@@ -135,2 +188,106 @@ ```js

### Delete Operations
#### Deleting Object Properties
```js
import { remove } from "json-codemod";
const source = '{"name": "Alice", "age": 30, "city": "Beijing"}';
// Delete a single property
const result = remove(source, [{ path: "age" }]);
// Result: {"name": "Alice", "city": "Beijing"}
```
#### Deleting Array Elements
```js
const source = '{"items": [1, 2, 3, 4, 5]}';
// Delete an element by index
const result = remove(source, [{ path: "items[2]" }]);
// Result: {"items": [1, 2, 4, 5]}
```
#### Deleting Nested Properties
```js
const source = '{"user": {"name": "Alice", "age": 30, "email": "alice@example.com"}}';
const result = remove(source, [{ path: "user.email" }]);
// Result: {"user": {"name": "Alice", "age": 30}}
```
#### Batch Deletions
```js
const source = '{"a": 1, "b": 2, "c": 3, "d": 4}';
const result = remove(source, [{ path: "b" }, { path: "d" }]);
// Result: {"a": 1, "c": 3}
```
### Insert Operations
#### Inserting into Objects
```js
import { insert } from "json-codemod";
const source = '{"name": "Alice"}';
// Insert a new property (key is required for objects)
const result = insert(source, [{ path: "", key: "age", value: "30" }]);
// Result: {"name": "Alice", "age": 30}
```
#### Inserting into Arrays
```js
const source = '{"numbers": [1, 2, 4, 5]}';
// Insert at specific position
const result = insert(source, [{ path: "numbers", position: 2, value: "3" }]);
// Result: {"numbers": [1, 2, 3, 4, 5]}
```
#### Inserting at Array Start
```js
const source = '{"list": [2, 3, 4]}';
const result = insert(source, [{ path: "list", position: 0, value: "1" }]);
// Result: {"list": [1, 2, 3, 4]}
```
#### Appending to Array
```js
const source = '{"list": [1, 2, 3]}';
// Omit position to append at the end
const result = insert(source, [{ path: "list", value: "4" }]);
// Result: {"list": [1, 2, 3, 4]}
```
#### Inserting into Nested Structures
```js
const source = '{"data": {"items": [1, 2]}}';
// Insert into nested array
const result = insert(source, [{ path: "data.items", position: 1, value: "99" }]);
// Result: {"data": {"items": [1, 99, 2]}}
```
### Modifying Complex Values

@@ -165,2 +322,46 @@

### `batch(sourceText, patches)` ⭐ Recommended
Applies multiple operations (replace, delete, insert) in a single call. This is the most efficient way to apply multiple changes as it only parses the source once.
#### Parameters
- **sourceText** (`string`): The original JSON string
- **patches** (`Array<ReplacePatch | DeletePatch | InsertPatch>`): Array of mixed operations to apply
#### Batch Types
The function automatically detects the operation type based on the batch properties:
```typescript
// Replace: has value but no key/position
{ path: string, value: string }
// Delete: no value, key, or position
{ path: string }
// Insert (object): has key and value
{ path: string, key: string, value: string }
// Insert (array): has position and value
{ path: string, position: number, value: string }
```
#### Return Value
Returns the modified JSON string with all patches applied.
#### Example
```js
const result = batch('{"a": 1, "b": 2, "items": [1, 2]}', [
{ path: "a", value: "10" }, // Replace
{ path: "b" }, // Delete
{ path: "items", position: 2, value: "3" }, // Insert
]);
// Returns: '{"a": 10, "items": [1, 2, 3]}'
```
---
### `replace(sourceText, patches)`

@@ -190,6 +391,96 @@

#### Path Syntax
#### Return Value
Two path syntaxes are supported:
Returns the modified JSON string.
#### Error Handling
- If a path doesn't exist, that modification is silently ignored without throwing an error
- If multiple modifications have conflicting (overlapping) paths, an error is thrown
---
### `remove(sourceText, patches)`
Deletes properties from objects or elements from arrays in a JSON string.
#### Parameters
- **sourceText** (`string`): The original JSON string
- **patches** (`Array<DeletePatch>`): Array of deletions to apply
#### DeletePatch Object
```typescript
interface DeletePatch {
/**
* A JSON path to delete.
*/
path: string;
}
```
#### Return Value
Returns the modified JSON string with specified paths removed.
#### Error Handling
- If a path doesn't exist, the deletion is silently ignored
- Whitespace and commas are automatically handled to maintain valid JSON
---
### `insert(sourceText, patches)`
Inserts new properties into objects or elements into arrays in a JSON string.
#### Parameters
- **sourceText** (`string`): The original JSON string
- **patches** (`Array<InsertPatch>`): Array of insertions to apply
#### InsertPatch Object
```typescript
interface InsertPatch {
/**
* A JSON path where the insertion should occur.
* For arrays: the path should point to the array, and position specifies the index.
* For objects: the path should point to the object, and key specifies the property name.
*/
path: string;
/**
* The value to insert.
*/
value: string;
/**
* For array insertion: the index where to insert the value.
* If omitted, the value is appended to the end.
*/
position?: number;
/**
* For object insertion: the key name for the new property.
* Required when inserting into objects.
*/
key?: string;
}
```
#### Return Value
Returns the modified JSON string with new values inserted.
#### Error Handling
- For object insertions, `key` is required
- For object insertions, if the key already exists, an error is thrown
- For array insertions, position must be within valid bounds (0 to array.length)
---
### Path Syntax
Two path syntaxes are supported for all operations:
1. **Dot Notation** (recommended for simple cases)

@@ -210,3 +501,3 @@

#### Value Format
### Value Format

@@ -222,11 +513,2 @@ The `value` parameter must be a string representation of a JSON value:

#### Return Value
Returns the modified JSON string.
#### Error Handling
- If a path doesn't exist, that modification is silently ignored without throwing an error
- If multiple modifications have conflicting (overlapping) paths, an error is thrown
## 🎯 Use Cases

@@ -240,3 +522,3 @@

import { readFileSync, writeFileSync } from "fs";
import { replace } from "json-codemod";
import { replace, remove, insert } from "json-codemod";

@@ -256,2 +538,19 @@ // Read configuration file

### Managing Dependencies
```js
import { readFileSync, writeFileSync } from "fs";
import { insert, remove } from "json-codemod";
const pkg = readFileSync("package.json", "utf-8");
// Add a new dependency
const withNewDep = insert(pkg, [{ path: "dependencies", key: "lodash", value: '"^4.17.21"' }]);
// Remove a dependency
const cleaned = remove(pkg, [{ path: "dependencies.old-package" }]);
writeFileSync("package.json", cleaned);
```
### JSON Data Transformation

@@ -269,2 +568,16 @@

### Array Manipulation
```js
import { insert, remove } from "json-codemod";
const data = '{"tasks": ["task1", "task2", "task4"]}';
// Insert a task in the middle
const withTask = insert(data, [{ path: "tasks", position: 2, value: '"task3"' }]);
// Remove a completed task
const updated = remove(withTask, [{ path: "tasks[0]" }]);
```
### Automation Scripts

@@ -287,8 +600,17 @@

```typescript
import { replace, Patch } from "json-codemod";
import { replace, remove, insert, Patch, DeletePatch, InsertPatch } from "json-codemod";
const source: string = '{"count": 0}';
// Replace
const patches: Patch[] = [{ path: "count", value: "1" }];
const result: string = replace(source, patches);
const result: string = replace(source, patches);
// Delete
const deletePatches: DeletePatch[] = [{ path: "count" }];
const deleted: string = remove(source, deletePatches);
// Insert
const insertPatches: InsertPatch[] = [{ path: "", key: "name", value: '"example"' }];
const inserted: string = insert(source, insertPatches);
```

@@ -295,0 +617,0 @@