"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isInteger = exports.isRoot = exports.toPath = void 0; exports.unescapeComponent = unescapeComponent; exports.escapeComponent = escapeComponent; exports.parseJsonPointer = parseJsonPointer; exports.formatJsonPointer = formatJsonPointer; exports.isChild = isChild; exports.isPathEqual = isPathEqual; exports.parent = parent; exports.isValidIndex = isValidIndex; const r1 = /~1/g; const r2 = /~0/g; const r3 = /~/g; const r4 = /\//g; /** * Un-escapes a JSON pointer path component. */ function unescapeComponent(component) { if (component.indexOf('~') === -1) return component; return component.replace(r1, '/').replace(r2, '~'); } /** * Escapes a JSON pointer path component. */ function escapeComponent(component) { if (component.indexOf('/') === -1 && component.indexOf('~') === -1) return component; return component.replace(r3, '~0').replace(r4, '~1'); } /** * Convert JSON pointer like "/foo/bar" to array like ["", "foo", "bar"], while * also un-escaping reserved characters. */ function parseJsonPointer(pointer) { if (!pointer) return []; // TODO: Performance of this line can be improved: (1) don't use .split(); (2) don't use .map(). return pointer.slice(1).split('/').map(unescapeComponent); } /** * Escape and format a path array like ["", "foo", "bar"] to JSON pointer * like "/foo/bar". */ function formatJsonPointer(path) { if ((0, exports.isRoot)(path)) return ''; return '/' + path.map((component) => escapeComponent(String(component))).join('/'); } const toPath = (pointer) => (typeof pointer === 'string' ? parseJsonPointer(pointer) : pointer); exports.toPath = toPath; /** * Returns true if `parent` contains `child` path, false otherwise. */ function isChild(parent, child) { if (parent.length >= child.length) return false; for (let i = 0; i < parent.length; i++) if (parent[i] !== child[i]) return false; return true; } function isPathEqual(p1, p2) { if (p1.length !== p2.length) return false; for (let i = 0; i < p1.length; i++) if (p1[i] !== p2[i]) return false; return true; } // export function getSharedPath(one: Path, two: Path): Path { // const min = Math.min(one.length, two.length); // const res: string[] = []; // for (let i = 0; i < min; i++) { // if (one[i] === two[i]) res.push(one[i]); // else break; // } // return res as Path; // } /** * Returns true if JSON Pointer points to root value, false otherwise. */ const isRoot = (path) => !path.length; exports.isRoot = isRoot; /** * Returns parent path, e.g. for ['foo', 'bar', 'baz'] returns ['foo', 'bar']. */ function parent(path) { if (path.length < 1) throw new Error('NO_PARENT'); return path.slice(0, path.length - 1); } /** * Check if path component can be a valid array index. */ function isValidIndex(index) { if (typeof index === 'number') return true; const n = Number.parseInt(index, 10); return String(n) === index && n >= 0; } const isInteger = (str) => { const len = str.length; let i = 0; let charCode; while (i < len) { charCode = str.charCodeAt(i); if (charCode >= 48 && charCode <= 57) { i++; continue; } return false; } return true; }; exports.isInteger = isInteger;