json-p3 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENCE +21 -0
- package/README.md +252 -0
- package/dist/deep_equals.d.ts +10 -0
- package/dist/index.d.ts +10 -0
- package/dist/json-p3.cjs.js +2838 -0
- package/dist/json-p3.esm.js +2811 -0
- package/dist/json-p3.iife.js +2843 -0
- package/dist/json-p3.iife.min.js +2 -0
- package/dist/json-p3.iife.min.js.map +1 -0
- package/dist/patch/errors.d.ts +11 -0
- package/dist/patch/index.d.ts +11 -0
- package/dist/patch/patch.d.ts +157 -0
- package/dist/path/environment.d.ts +60 -0
- package/dist/path/errors.d.ts +50 -0
- package/dist/path/expression.d.ts +98 -0
- package/dist/path/functions/count.d.ts +7 -0
- package/dist/path/functions/function.d.ts +26 -0
- package/dist/path/functions/index.d.ts +7 -0
- package/dist/path/functions/length.d.ts +7 -0
- package/dist/path/functions/match.d.ts +24 -0
- package/dist/path/functions/search.d.ts +24 -0
- package/dist/path/functions/value.d.ts +7 -0
- package/dist/path/index.d.ts +46 -0
- package/dist/path/lex.d.ts +65 -0
- package/dist/path/lru_cache.d.ts +10 -0
- package/dist/path/node.d.ts +74 -0
- package/dist/path/parse.d.ts +29 -0
- package/dist/path/path.d.ts +28 -0
- package/dist/path/selectors.d.ts +90 -0
- package/dist/path/token.d.ts +63 -0
- package/dist/path/types.d.ts +21 -0
- package/dist/pointer/errors.d.ts +27 -0
- package/dist/pointer/index.d.ts +24 -0
- package/dist/pointer/pointer.d.ts +75 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types.d.ts +25 -0
- package/package.json +83 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var json_p3=function(e){"use strict";class t extends Error{constructor(e,t){super(e),this.message=e,this.token=t,Object.setPrototypeOf(this,new.target.prototype),this.name="JSONPathError",this.message=n(e,t)}}function n(e,t){return t.input.length<=9?`${e} ('${t.input}':${t.index})`:t.index>t.input.length-5?`${e} ('${t.input.slice(t.input.length-9)}':${t.index})`:t.index-4<0?`${e} ('${t.input.slice(0,9)}':${t.index})`:`${e} ('${t.input.slice(t.index-4,t.index+5)}':${t.index})`}class r extends t{constructor(e,t){super(e,t),this.message=e,this.token=t,Object.setPrototypeOf(this,new.target.prototype),this.name="JSONPathLexerError",this.message=n(e,t)}}class s extends t{constructor(e,t){super(e,t),this.message=e,this.token=t,Object.setPrototypeOf(this,new.target.prototype),this.name="JSONPathTypeError",this.message=n(e,t)}}class i extends t{constructor(e,t){super(e,t),this.message=e,this.token=t,Object.setPrototypeOf(this,new.target.prototype),this.name="JSONPathIndexError",this.message=n(e,t)}}class o extends t{constructor(e,t){super(e,t),this.message=e,this.token=t,Object.setPrototypeOf(this,new.target.prototype),this.name="UndefinedFilterFunctionError",this.message=n(e,t)}}class a extends t{constructor(e,t){super(e,t),this.message=e,this.token=t,Object.setPrototypeOf(this,new.target.prototype),this.name="JSONPathSyntaxError",this.message=n(e,t)}}function h(e){return Array.isArray(e)}function c(e){const t=typeof e;return null!==e&&"object"===t||"function"===t}function u(e){return"string"==typeof e}function p(e){return"number"==typeof e}function l(e,t){if(e===t)return!0;if(Array.isArray(e)){if(Array.isArray(t)){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(!l(e[n],t[n]))return!1;return!0}return!1}if(c(e)&&c(t)){const n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(const r of n)if(!l(e[r],t[r]))return!1;return!0}return!1}let f=function(e){return e.ValueType="ValueType",e.LogicalType="LogicalType",e.NodesType="NodesType",e}({});class d extends Error{constructor(e){super(e),this.message=e,Object.setPrototypeOf(this,new.target.prototype),this.name="JSONPointerError"}}class g extends d{constructor(e){super(e),this.message=e,Object.setPrototypeOf(this,new.target.prototype),this.name="JSONPointerResolutionError"}}class m extends g{constructor(e){super(e),this.message=e,Object.setPrototypeOf(this,new.target.prototype),this.name="JSONPointerIndexError"}}class w extends g{constructor(e){super(e),this.message=e,Object.setPrototypeOf(this,new.target.prototype),this.name="JSONPointerKeyError"}}class v extends d{constructor(e){super(e),this.message=e,Object.setPrototypeOf(this,new.target.prototype),this.name="JSONPointerSyntaxError"}}class O extends g{constructor(e){super(e),this.message=e,Object.setPrototypeOf(this,new.target.prototype),this.name="JSONPointerTypeError"}}const x=Symbol.for("jsonpointer.undefined");class E{#e;constructor(e){this.tokens=this.parse(e),this.#e=E.encode(this.tokens)}static encode(e){return e.length?"/"+e.map((e=>e.replaceAll("~","~0").replaceAll("/","~1"))).join("/"):""}resolve(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:x;try{return this.tokens.reduce(this.getItem.bind(this),e)}catch(e){if(e instanceof g&&t!==x)return t;throw e}}resolveWithParent(e){if(!this.tokens.length)return[x,this.resolve(e)];const t=this.tokens.slice(0,this.tokens.length-1).reduce(this.getItem.bind(this),e);try{return[t,this.getItem(t,this.tokens[this.tokens.length-1],this.tokens.length-1)]}catch(e){if(e instanceof m||e instanceof w)return[t,x];throw e}}toString(){return this.#e}isRelativeTo(e){return e.tokens.length<this.tokens.length&&this.tokens.slice(0,e.tokens.length).every(((t,n)=>t===e.tokens[n]))}parse(e){if(e.length&&!e.startsWith("/"))throw new v(`"${e}" pointers must start with a slash or be the empty string`);return e.split("/").map((e=>e.replaceAll("~1","/").replaceAll("~0","~"))).slice(1)}getItem(e,t,n){if(h(e)){if("length"!==t&&Object.hasOwn(e,t))return e[Number(t)];throw new m(`index out of range '${E.encode(this.tokens.slice(0,n+1))}'`)}if(c(e)){if(Object.hasOwn(e,t))return e[t];throw new w(`no such property '${E.encode(this.tokens.slice(0,n+1))}'`)}throw new O(`found primitive value, expected an object '${E.encode(this.tokens.slice(0,n+1))}'`)}_join(e){if(!u(e))throw new O("join() requires string arguments, found "+typeof e);if(e.startsWith("/"))return new E(e);const t=this.tokens.concat(e.split("/").map((e=>e.replaceAll("~1","/").replaceAll("~0","~"))));return new E(E.encode(t))}join(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];if(!t.length)return this;let r=this;for(const e of t)r=r._join(e);return r}exists(e){try{this.resolve(e)}catch(e){if(e instanceof g)return!1;throw e}return!0}parent(){return this.tokens.length?new E(E.encode(this.tokens.slice(0,this.tokens.length-1))):this}}function N(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:x;return new E(e).resolve(t,n)}var k=Object.freeze({__proto__:null,JSONPointer:E,JSONPointerError:d,JSONPointerIndexError:m,JSONPointerKeyError:w,JSONPointerResolutionError:g,JSONPointerSyntaxError:v,JSONPointerTypeError:O,UNDEFINED:x,resolve:N});class y{constructor(e,t,n){this.value=e,this.location=t,this.root=n,this.path="$"+t.map((e=>u(e)?`['${e}']`:`[${e}]`)).join("")}toPointer(){return this.location.length?new E(E.encode(this.location.map(String))):new E("")}}class S{constructor(e){this.nodes=e}[Symbol.iterator](){return this.nodes[Symbol.iterator]()}empty(){return 0===this.nodes.length}values(){return this.nodes.map((e=>e.value))}valuesOrSingular(){return 1===this.nodes.length?this.nodes[0].value:this.nodes.map((e=>e.value))}locations(){return this.nodes.map((e=>e.location))}paths(){return this.nodes.map((e=>e.path))}pointers(){return this.nodes.map((e=>e.toPointer()))}get length(){return this.nodes.length}}const T=Symbol.for("jsonpath.nothing");class ${constructor(e){this.token=e}}class R extends ${}class b extends R{evaluate(){return null}toString(){return"null"}}class P extends R{constructor(e,t){super(e),this.token=e,this.value=t}evaluate(){return this.value}toString(){return String(this.value)}}class L extends R{constructor(e,t){super(e),this.token=e,this.value=t}evaluate(){return this.value}toString(){return JSON.stringify(this.value)}}class _ extends R{constructor(e,t){super(e),this.token=e,this.value=t}evaluate(){return this.value}toString(){return String(this.value)}}class I extends ${constructor(e,t,n){super(e),this.token=e,this.operator=t,this.right=n}evaluate(e){if("!"===this.operator){const t=this.right.evaluate(e);return t instanceof S?0===t.nodes.length:!C(t)}throw new s(`unknown operator '${this.operator}'`,this.token)}toString(){return`${this.operator}${this.right.toString()}`}}class A extends ${constructor(e,t,n,r){super(e),this.token=e,this.left=t,this.operator=n,this.right=r}evaluate(e){let t=this.left.evaluate(e);t instanceof S&&1===t.nodes.length&&(t=t.nodes[0].value);let n=this.right.evaluate(e);return n instanceof S&&1===n.nodes.length&&(n=n.nodes[0].value),"&&"===this.operator?C(t)&&C(n):"||"===this.operator?C(t)||C(n):function(e,t,n){switch(t){case"==":return U(e,n);case"!=":return!U(e,n);case"<":return D(e,n);case">":return D(n,e);case">=":return D(n,e)||U(e,n);case"<=":return D(e,n)||U(e,n);default:return!1}}(t,this.operator,n)}toString(){return"&&"===this.operator||"||"===this.operator?`(${this.left.toString()} ${this.operator} ${this.right.toString()})`:`${this.left.toString()} ${this.operator} ${this.right.toString()}`}}class F extends ${constructor(e,t){super(e),this.token=e,this.expression=t}evaluate(e){const t=this.expression.evaluate(e);return t instanceof S?t.nodes.length>0:C(t)}toString(){return this.expression.toString()}}class j extends ${constructor(e,t){super(e),this.token=e,this.path=t}}class M extends j{evaluate(e){return this.path.query(e.currentValue)}toString(){return`@${this.path.toString().slice(1)}`}}class J extends j{evaluate(e){return this.path.query(e.rootValue)}toString(){return this.path.toString()}}class K extends ${constructor(e,t,n){super(e),this.token=e,this.name=t,this.args=n}evaluate(e){const t=e.environment.filterRegister.get(this.name);if(!t)throw new o(`filter function '${this.name}' is undefined`,this.token);const n=this.args.map((t=>t.evaluate(e))).map(((e,n)=>t.argTypes[n]!==f.NodesType&&e instanceof S?e.valuesOrSingular():e));return t.call(...n)}toString(){return`${this.name}(${this.args.map((e=>e.toString())).join(", ")})`}}function C(e){return!(e instanceof S&&e.empty())&&!("boolean"==typeof e&&!1===e)}function U(e,t){if(t instanceof S&&([e,t]=[t,e]),e instanceof S){if(t instanceof S){if(e.empty()&&t.empty())return!0;if(1===e.nodes.length&&1===t.nodes.length)return l(e.nodes[0].value,t.nodes[0].value)}return e.empty()?t===T:1===e.nodes.length&&l(e.nodes[0].value,t)}return e===T&&t===T||l(e,t)}function D(e,t){return!!(u(e)&&u(t)||p(e)&&p(t))&&e<t}var G=Object.freeze({__proto__:null,BooleanLiteral:P,FilterExpression:$,FilterExpressionLiteral:R,FunctionExtension:K,InfixExpression:A,JSONPathQuery:j,LogicalExpression:F,NullLiteral:b,NumberLiteral:_,PrefixExpression:I,RelativeQuery:M,RootQuery:J,StringLiteral:L});class W{argTypes=[f.NodesType];returnType=f.ValueType;call(e){return e.length}}class Q{argTypes=[f.ValueType];returnType=f.ValueType;call(e){return h(e)||u(e)?e.length:c(e)?Object.keys(e).length:T}}class B extends Map{constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:128,t=arguments.length>1?arguments[1]:void 0;void 0!==t?super(t):super(),this.maxSize=e}get(e){const t=super.get(e);return this.has(e)&&(this.delete(e),this.set(e,t)),t}set(e,t){return this.has(e)?this.delete(e):this.size>=this.maxSize&&this.delete(this.first()),super.set(e,t)}first(){return this.keys().next().value}}class z{argTypes=[f.ValueType,f.ValueType];returnType=f.LogicalType;#t;constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.options=e,this.cacheSize=e.cacheSize??10,this.throwErrors=e.throwErrors??!1,this.#t=new B(this.cacheSize)}call(e,t){if(this.cacheSize>0){const n=this.#t.get(t);if(n)try{return n.test(e)}catch(e){if(this.throwErrors)throw e;return!1}}try{const n=new RegExp(this.fullMatch(t),"u");return this.cacheSize>0&&this.#t.set(t,n),n.test(e)}catch(e){if(this.throwErrors)throw e;return!1}}fullMatch(e){const t=[];return e.startsWith("^")||t.push("^"),t.push(e),e.endsWith("$")||t.push("$"),t.join("")}}class V{argTypes=[f.ValueType,f.ValueType];returnType=f.LogicalType;#t;constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.options=e,this.cacheSize=e.cacheSize??10,this.throwErrors=e.throwErrors??!1,this.#t=new B(this.cacheSize)}call(e,t){if(this.cacheSize>0){const n=this.#t.get(t);if(n)try{return!!e.match(n)}catch(e){if(this.throwErrors)throw e;return!1}}try{const n=new RegExp(t,"u");return this.cacheSize>0&&this.#t.set(t,n),!!e.match(n)}catch(e){if(this.throwErrors)throw e;return!1}}}class q{argTypes=[f.NodesType];returnType=f.ValueType;call(e){return 1===e.length?e.nodes[0].value:T}}let X=function(e){return e.AND="TOKEN_AND",e.COLON="TOKEN_COLON",e.COMMA="TOKEN_COMMA",e.CURRENT="TOKEN_CURRENT_NODE",e.DDOT="TOKEN_DDOT",e.DOT="TOKEN_DOT",e.DOUBLE_QUOTE_STRING="TOKEN_DOUBLE_QUOTE_STRING",e.EOF="TOKEN_EOF",e.EQ="TOKEN_EQ",e.ERROR="TOKEN_ERROR",e.FALSE="TOKEN_FALSE",e.FILTER="TOKEN_FILTER_START",e.FUNCTION="TOKEN_FUNCTION",e.GE="TOKEN_GE",e.GT="TOKEN_GT",e.INDEX="TOKEN_INDEX",e.LBRACKET="TOKEN_LBRACKET",e.LE="TOKEN_LE",e.LG="TOKEN_LG",e.LPAREN="TOKEN_LPAREN",e.LT="TOKEN_LT",e.NAME="TOKEN_NAME",e.NE="TOKEN_NE",e.NOT="TOKEN_NOT",e.NULL="TOKEN_NULL",e.NUMBER="NUMBER",e.OR="TOKEN_OR",e.RBRACKET="TOKEN_RBRACKET",e.ROOT="TOKEN_ROOT",e.RPAREN="TOKEN_RPAREN",e.SINGLE_QUOTE_STRING="TOKEN_SINGLE_QUOTE_STRING",e.TRUE="TOKEN_TRUE",e.WILD="TOKEN_WILD",e}({});class Z{constructor(e,t,n,r){this.kind=e,this.value=t,this.index=n,this.input=r}}new Z(X.EOF,"",-1,"");class H{#n=0;constructor(e){this.tokens=e}get current(){return this.tokens[this.#n]}get peek(){return this.#n>=this.tokens.length-1?this.tokens[this.tokens.length-1]:this.tokens[this.#n+1]}next(){const e=this.current;return this.#n+=1,e}backup(){this.#n>0&&(this.#n-=1)}expect(e){if(this.current.kind!==e)throw new a(`expected token '${e}', found '${this.current.kind}'`,this.current)}expectPeek(e){const t=this.peek;if(t.kind!==e)throw new a(`expected token '${e}', found '${t.kind}'`,t)}}const Y=/e[+-]\d+/y,ee=/[a-z][a-z_0-9]*/y,te=/-?\d+/y,ne=/-?[0-9]+/y,re=/[\u0080-\uFFFFa-zA-Z_][\u0080-\uFFFFa-zA-Z0-9_-]*/y,se=new Set([" ","\n","\t","\r"]);class ie{filterLevel=0;parenStack=[];tokens=[];#r=0;#n=0;constructor(e){this.path=e}get pos(){return this.#n}get start(){return this.#r}run(){let e=ae;for(;e;)e=e(this)}emit(e){this.tokens.push(new Z(e,this.path.slice(this.#r,this.#n),this.#r,this.path)),this.#r=this.#n}next(){if(this.#n>=this.path.length)return"";const e=this.path[this.#n];return this.#n+=1,e}ignore(){this.#r=this.#n}backup(){if(this.#n<=this.#r){const e="can't backup beyond start";throw new r(e,new Z(X.ERROR,e,this.#n,this.path))}this.#n-=1}peek(){const e=this.next();return e&&this.backup(),e}accept(e){const t=this.next();return!!e.has(t)||(t&&this.backup(),!1)}acceptMatch(e){const t=this.next();return!!e.test(t)||(t&&this.backup(),!1)}acceptRun(e){let t=!1,n=this.next();for(;e.has(n);)n=this.next(),t=!0;return n&&this.backup(),t}acceptMatchRun(e){e.lastIndex=this.#n;const t=e.exec(this.path);return e.lastIndex=0,!!t&&(this.#n+=t[0].length,!0)}ignoreWhitespace(){if(this.#n!==this.#r){const e=`must emit or ignore before consuming whitespace ('${this.path.slice(this.#r,this.#n)}':${this.pos})`;throw new r(e,new Z(X.ERROR,e,this.pos,this.path))}return!!this.acceptRun(se)&&(this.ignore(),!0)}error(e){this.tokens.push(new Z(X.ERROR,e,this.#n,this.path))}}function oe(e){const[t,n]=function(e){const t=new ie(e);return[t,t.tokens]}(e);if(t.run(),n.length&&n[n.length-1].kind===X.ERROR)throw new a(n[n.length-1].value,n[n.length-1]);return n}function ae(e){const t=e.next();return"$"!==t?(e.backup(),e.error(`expected '$', found '${t}'`),null):(e.emit(X.ROOT),he)}function he(e){e.ignoreWhitespace()&&!e.peek()&&e.error("trailing whitespace");const t=e.next();switch(t){case"":return e.emit(X.EOF),null;case".":return"."===e.peek()?(e.next(),e.emit(X.DDOT),ce):ue;case"[":return e.emit(X.LBRACKET),pe;default:return e.backup(),e.filterLevel?le:(e.error(`expected '.', '..' or a bracketed selection, found '${t}'`),null)}}function ce(e){const t=e.next();switch(t){case"":return e.error("bald descendant segment"),null;case"*":return e.emit(X.WILD),he;case"[":return e.emit(X.LBRACKET),pe;default:return e.backup(),e.acceptMatchRun(re)?(e.emit(X.NAME),he):(e.error(`unexpected descendent selection token '${t}'`),null)}}function ue(e){if(e.ignore(),e.ignoreWhitespace())return e.error("unexpected whitespace after dot"),null;const t=e.next();return"*"===t?(e.emit(X.WILD),he):(e.backup(),e.acceptMatchRun(re)?(e.emit(X.NAME),he):(e.error(`unexpected shorthand selector '${t}'`),null))}function pe(e){for(;;){e.ignoreWhitespace();const t=e.next();switch(t){case"]":return e.emit(X.RBRACKET),e.filterLevel?le:he;case"":return e.error("unclosed bracketed selection"),null;case"*":e.emit(X.WILD);continue;case"?":return e.emit(X.FILTER),e.filterLevel+=1,le;case",":e.emit(X.COMMA);continue;case":":e.emit(X.COLON);continue;case"'":return de;case'"':return ge;default:if(e.backup(),e.acceptMatchRun(te)){e.emit(X.INDEX);continue}return e.error(`unexpected token '${t}' in bracketed selection`),null}}}function le(e){for(;;){e.ignoreWhitespace();const t=e.next();switch(t){case"":case"]":return e.filterLevel-=1,e.backup(),pe;case",":if(e.emit(X.COMMA),e.parenStack.length)continue;return e.filterLevel-=1,pe;case"'":return me;case'"':return we;case"(":e.emit(X.LPAREN),e.parenStack.length&&(e.parenStack[e.parenStack.length-1]+=1);continue;case")":e.emit(X.RPAREN),e.parenStack.length&&(1===e.parenStack[e.parenStack.length-1]?e.parenStack.pop():e.parenStack[e.parenStack.length-1]-=1);continue;case"$":return e.emit(X.ROOT),he;case"@":return e.emit(X.CURRENT),he;case".":return e.backup(),he;case"!":"="===e.peek()?(e.next(),e.emit(X.NE)):e.emit(X.NOT);continue;case"=":if("="===e.peek()){e.next(),e.emit(X.EQ);continue}return e.backup(),e.error(`unexpected filter selector token '${t}'`),null;case"<":"="===e.peek()?(e.next(),e.emit(X.LE)):e.emit(X.LT);continue;case">":"="===e.peek()?(e.next(),e.emit(X.GE)):e.emit(X.GT);continue;default:if(e.backup(),e.acceptMatchRun(ne)){if("."===e.peek()&&(e.next(),!e.acceptMatchRun(ne)))return e.error("a fractional digit is required after a decimal point"),null;e.acceptMatchRun(Y),e.emit(X.NUMBER);continue}if(e.acceptMatchRun(/&&/y)){e.emit(X.AND);continue}if(e.acceptMatchRun(/\|\|/y)){e.emit(X.OR);continue}if(e.acceptMatchRun(/true/y)){e.emit(X.TRUE);continue}if(e.acceptMatchRun(/false/y)){e.emit(X.FALSE);continue}if(e.acceptMatchRun(/null/y)){e.emit(X.NULL);continue}if(e.acceptMatchRun(ee)&&"("===e.peek()){e.parenStack.push(1),e.emit(X.FUNCTION),e.next(),e.ignore();continue}}return e.error(`unexpected filter selector token '${t}'`),null}}function fe(e,t){return function(n){if(n.ignore(),n.peek()===e)return n.emit("'"===e?X.SINGLE_QUOTE_STRING:X.DOUBLE_QUOTE_STRING),n.next(),n.ignore(),t;for(;;){const r=n.path.slice(n.pos,n.pos+2),s=n.next();if("\\\\"!==r&&r!==`\\${e}`){if("\\"===s&&!r.match(/\\[bfnrtu/]/))return n.error("invalid escape"),null;if(!s)return n.error(`unclosed string starting at index ${n.start}`),null;if(s===e)return n.backup(),n.emit("'"===e?X.SINGLE_QUOTE_STRING:X.DOUBLE_QUOTE_STRING),n.next(),n.ignore(),t}else n.next()}}}const de=fe("'",pe),ge=fe('"',pe),me=fe("'",le),we=fe('"',le);class ve{constructor(e,t){this.environment=e,this.token=t}}class Oe extends ve{constructor(e,t,n,r){super(e,t),this.environment=e,this.token=t,this.name=n,this.shorthand=r}resolve(e){const t=[];for(const s of e)n=s.value,r=this.name,c(n)&&Object.hasOwn(n,r)&&t.push(new y(s.value[this.name],s.location.concat(this.name),s.root));var n,r;return new S(t)}toString(){return this.shorthand?`['${this.name}']`:`'${this.name}'`}}class xe extends ve{constructor(e,t,n){if(super(e,t),this.environment=e,this.token=t,this.index=n,n<this.environment.options.minIntIndex||n>this.environment.options.maxIntIndex)throw new i("index out of range",this.token)}resolve(e){const t=[];for(const n of e)if(h(n.value)){const e=this.normalizedIndex(n.value.length);e in n.value&&t.push(new y(n.value[e],n.location.concat(e),n.root))}return new S(t)}toString(){return String(this.index)}normalizedIndex(e){return this.index<0&&e>=Math.abs(this.index)?e+this.index:this.index}}class Ee extends ve{constructor(e,t,n,r,s){super(e,t),this.environment=e,this.token=t,this.start=n,this.stop=r,this.step=s,this.checkRange(n,r,s)}resolve(e){const t=[];for(const n of e)if(h(n.value))for(const[e,r]of this.slice(n.value,this.start,this.stop,this.step))t.push(new y(r,n.location.concat(e),n.root));return new S(t)}toString(){return`${this.start?this.start:""}:${this.stop?this.stop:""}:${this.step?this.step:"1"}`}checkRange(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];for(const e of t)if(void 0!==e&&(e<this.environment.options.minIntIndex||e>this.environment.options.maxIntIndex))throw new i("index out of range",this.token)}normalizedIndex(e,t){return t<0&&e>=Math.abs(t)?Math.min(e+t,e-1):Math.min(t,e-1)}slice(e,t,n,r){if(!e.length)return[];if(t=null==t?r&&r<0?e.length-1:0:t<0?Math.max(e.length+t,0):Math.min(t,e.length-1),n=null==n?r&&r<0?-1:e.length:n<0?Math.max(e.length+n,-1):Math.min(n,e.length),0===r)return[];r||(r=1);const s=[];if(r>0)for(let i=t;i<n;i+=r)s.push([i,e[i]]);else for(let i=t;i>n;i+=r)s.push([i,e[i]]);return s}}class Ne extends ve{constructor(e,t){let n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];super(e,t),this.environment=e,this.token=t,this.shorthand=n}resolve(e){const t=[];for(const n of e)if(!(n.value instanceof String))if(h(n.value))for(let e=0;e<n.value.length;e++)t.push(new y(n.value[e],n.location.concat(e),n.root));else if(c(n.value))for(const[e,r]of Object.entries(n.value))t.push(new y(r,n.location.concat(e),n.root));return new S(t)}toString(){return this.shorthand?"[*]":"*"}}class ke extends ve{resolve(e){const t=[];for(const n of e)t.push(n,...this.visit(n));return new S(t)}toString(){return".."}visit(e){const t=[];if(e.value instanceof String)return new S(t);if(h(e.value))for(let n=0;n<e.value.length;n++){const r=new y(e.value[n],e.location.concat(n),e.root);t.push(r,...this.visit(r))}else if(c(e.value))for(const[n,r]of Object.entries(e.value)){const s=new y(r,e.location.concat(n),e.root);t.push(s,...this.visit(s))}return new S(t)}}class ye extends ve{constructor(e,t,n){super(e,t),this.environment=e,this.token=t,this.expression=n}resolve(e){const t=[];for(const n of e)if(!(n.value instanceof String))if(h(n.value))for(let e=0;e<n.value.length;e++){const r=n.value[e],s={environment:this.environment,currentValue:r,rootValue:n.root};this.expression.evaluate(s)&&t.push(new y(r,n.location.concat(e),n.root))}else if(c(n.value))for(const[e,r]of Object.entries(n.value)){const s={environment:this.environment,currentValue:r,rootValue:n.root};this.expression.evaluate(s)&&t.push(new y(r,n.location.concat(e),n.root))}return new S(t)}toString(){return`?${this.expression.toString()}`}}class Se extends ve{constructor(e,t,n){super(e,t),this.environment=e,this.token=t,this.items=n}resolve(e){const t=[];for(const n of e)for(const e of this.items)t.push(...e.resolve(new S([n])));return new S(t)}toString(){return`[${this.items.map((e=>e.toString())).join(", ")}]`}}var Te=Object.freeze({__proto__:null,BracketedSelection:Se,FilterSelector:ye,IndexSelector:xe,JSONPathSelector:ve,NameSelector:Oe,RecursiveDescentSegment:ke,SliceSelector:Ee,WildcardSelector:Ne});class $e{constructor(e,t){this.environment=e,this.selectors=t}query(e){let t=new S([new y(e,[],e)]);for(const e of this.selectors)t=e.resolve(t);return t}toString(){return`$${this.selectors.map((e=>e.toString())).join("")}`}singularQuery(){for(const e of this.selectors)if(!(e instanceof Oe||e instanceof Se&&1===e.items.length&&(e.items[0]instanceof Oe||e.items[0]instanceof xe)))return!1;return!0}}const Re=new Map([[X.AND,4],[X.EQ,6],[X.GE,6],[X.GT,6],[X.LE,6],[X.LT,6],[X.NE,6],[X.NOT,3],[X.OR,5],[X.RPAREN,1]]),be=new Map([[X.AND,"&&"],[X.EQ,"=="],[X.GE,">="],[X.GT,">"],[X.LE,"<="],[X.LT,"<"],[X.NE,"!="],[X.OR,"||"]]),Pe=new Set(["==",">=",">","<=","<","!="]);class Le{constructor(e){this.environment=e,this.tokenMap=new Map([[X.FALSE,this.parseBoolean],[X.NUMBER,this.parseNumber],[X.LPAREN,this.parseGroupedExpression],[X.NOT,this.parsePrefixExpression],[X.NULL,this.parseNull],[X.ROOT,this.parseRootQuery],[X.CURRENT,this.parseRelativeQuery],[X.SINGLE_QUOTE_STRING,this.parseString],[X.DOUBLE_QUOTE_STRING,this.parseString],[X.TRUE,this.parseBoolean],[X.FUNCTION,this.parseFunction]])}parse(e){e.current.kind===X.ROOT&&e.next();const t=this.parsePath(e);if(e.current.kind!==X.EOF)throw new a(`unexpected token '${e.current.kind}'`,e.current);return t}parsePath(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const n=[];e:for(;;){switch(e.current.kind){case X.NAME:n.push(new Oe(this.environment,e.current,e.current.value,!0));break;case X.WILD:n.push(new Ne(this.environment,e.current,!0));break;case X.DDOT:n.push(new ke(this.environment,e.current));break;case X.LBRACKET:n.push(this.parseBracketedSelection(e));break;default:t&&e.backup();break e}e.next()}return n}parseIndex(e){if(e.current.value.length>1&&e.current.value.startsWith("0")||e.current.value.startsWith("-0"))throw new a("leading zero in index selector",e.current);return new xe(this.environment,e.current,Number(e.current.value))}parseSlice(e){const t=e.current,n=[];function r(e){if(e.kind===X.INDEX){if(e.value.length>1&&e.value.startsWith("0")||e.value.startsWith("-0"))throw new a("leading zero in index selector",e);return!0}return!1}return r(e.current)?(n.push(Number(e.current.value)),e.next(),e.expect(X.COLON),e.next()):(n.push(void 0),e.expect(X.COLON),e.next()),r(e.current)?(n.push(Number(e.current.value)),e.next(),e.current.kind===X.COLON&&e.next()):e.current.kind===X.COLON&&(n.push(void 0),e.expect(X.COLON),e.next()),r(e.current)&&(n.push(Number(e.current.value)),e.next()),e.backup(),new Ee(this.environment,t,...n)}parseBracketedSelection(e){const t=e.next(),n=[];for(;e.current.kind!==X.RBRACKET;){switch(e.current.kind){case X.SINGLE_QUOTE_STRING:case X.DOUBLE_QUOTE_STRING:n.push(new Oe(this.environment,e.current,this.decodeString(e.current,!0),!1));break;case X.FILTER:n.push(this.parseFilter(e));break;case X.INDEX:e.peek.kind===X.COLON?n.push(this.parseSlice(e)):n.push(this.parseIndex(e));break;case X.COLON:n.push(this.parseSlice(e));break;case X.WILD:n.push(new Ne(this.environment,e.current));break;case X.EOF:throw new a("unexpected end of query",e.current);default:throw new a(`unexpected token in bracketed selection '${e.current.kind}'`,e.current)}e.peek.kind!==X.RBRACKET&&(e.expectPeek(X.COMMA),e.next()),e.next()}if(!n.length)throw new a("empty bracketed segment",t);return new Se(this.environment,t,n)}parseFilter(e){const t=e.next(),n=this.parseFilterExpression(e);if(n instanceof K){const e=this.environment.filterRegister.get(n.name);if(e&&e.returnType===f.ValueType)throw new s(`result of ${n.name}() must be compared`,n.token)}return new ye(this.environment,t,new F(t,n))}parseBoolean(e){return e.current.kind===X.FALSE?new P(e.current,!1):new P(e.current,!0)}parseNull(e){return new b(e.current)}parseString(e){return new L(e.current,this.decodeString(e.current))}parseNumber(e){return new _(e.current,Number(e.current.value))}parsePrefixExpression(e){return e.expect(X.NOT),e.next(),new I(e.current,"!",this.parseFilterExpression(e,3))}parseInfixExpression(e,t){const n=e.next(),r=Re.get(n.kind)||1,s=this.parseFilterExpression(e,r),i=be.get(n.kind);if(!i)throw new a(`unknown operator '${n.kind}'`,n);return this.throwForNonSingularQuery(t),this.throwForNonSingularQuery(s),Pe.has(i)&&(this.throwForNonComparableFunction(t),this.throwForNonComparableFunction(s)),new A(n,t,i,s)}parseGroupedExpression(e){e.next();let t=this.parseFilterExpression(e);for(e.next();e.current.kind!==X.RPAREN;){if(e.current.kind===X.EOF)throw new a("unbalanced parentheses",e.current);t=this.parseInfixExpression(e,t)}return e.expect(X.RPAREN),t}parseRootQuery(e){const t=e.next();return new J(t,new $e(this.environment,this.parsePath(e,!0)))}parseRelativeQuery(e){const t=e.next();return new M(t,new $e(this.environment,this.parsePath(e,!0)))}parseFunction(e){const t=[],n=e.next();for(;e.current.kind!==X.RPAREN;){const n=this.tokenMap.get(e.current.kind);if(!n)throw new a(`unexpected '${e.current.value}'`,e.current);if(t.push(n.bind(this)(e)),e.peek.kind!==X.RPAREN){if(e.peek.kind===X.RBRACKET)break;e.expectPeek(X.COMMA),e.next()}e.next()}return new K(n,n.value,this.environment.checkWellTypedness(n,t))}parseFilterExpression(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;const n=this.tokenMap.get(e.current.kind);if(!n){let t;switch(e.current.kind){case X.EOF:case X.RBRACKET:t="end of expression";break;default:t=`'${e.current.value}`}throw new a(`unexpected ${t}`,e.current)}let r=n.bind(this)(e);for(;;){const n=e.peek.kind;if(n===X.EOF||n===X.RBRACKET||(Re.get(n)||1)<t)break;if(!be.has(n))return r;e.next(),r=this.parseInfixExpression(e,r)}return r}decodeString(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];try{return JSON.parse(e.kind===X.SINGLE_QUOTE_STRING?`"${e.value.replaceAll('"','\\"').replaceAll("\\'","'")}"`:`"${e.value}"`)}catch{throw new a(`invalid ${t?"name selector":"string literal"} '${e.value}'`,e)}}throwForNonSingularQuery(e){if((e instanceof J||e instanceof M)&&!e.path.singularQuery())throw new a("non-singular query is not comparable",e.token)}throwForNonComparableFunction(e){if(!(e instanceof K))return;const t=this.environment.filterRegister.get(e.name);if(t&&t.returnType!==f.ValueType)throw new s(`result of ${e.name}() is not comparable`,e.token)}}const _e={strict:!0,maxIntIndex:Math.pow(2,53)-1,minIntIndex:-Math.pow(2,53)-1};class Ie{filterRegister=new Map;constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:_e;this.options=e,this.parser=new Le(this),this.setupFilterFunctions()}compile(e){return new $e(this,this.parser.parse(new H(oe(e))))}query(e,t){return this.compile(e).query(t)}setupFilterFunctions(){this.filterRegister.set("count",new W),this.filterRegister.set("length",new Q),this.filterRegister.set("search",new V),this.filterRegister.set("match",new z),this.filterRegister.set("value",new q)}checkWellTypedness(e,t){const n=this.filterRegister.get(e.value);if(!n)throw new o(`no such function '${e.value}'`,e);if(t.length!==n.argTypes.length)throw new s(`${e.value}() takes ${n.argTypes.length} argument${1===n.argTypes.length?"":"s"}, ${t.length} given`,e);for(const[r,i,o]of n.argTypes.map(((e,n)=>[e,t[n],n])))switch(r){case f.ValueType:if(!(i instanceof R||i instanceof j&&i.path.singularQuery()))throw new s(`${e.value}() argument ${o} must be of ValueType`,i.token);break;case f.LogicalType:if(!(i instanceof P))throw new s(`${e.value}() argument ${o} must be of LogicalType`,i.token);break;case f.NodesType:if(!(i instanceof j))throw new s(`${e.value}() argument ${o} must be of NodesType`,i.token)}return t}}var Ae=Object.freeze({__proto__:null,Count:W,FunctionExpressionType:f,Length:Q,Match:z,Search:V,Value:q});const Fe=new Ie;function je(e,t){return Fe.query(e,t)}function Me(e){return Fe.compile(e)}var Je=Object.freeze({__proto__:null,DEFAULT_ENVIRONMENT:Fe,FunctionExpressionType:f,JSONPath:$e,JSONPathEnvironment:Ie,JSONPathError:t,JSONPathIndexError:i,JSONPathLexerError:r,JSONPathNode:y,JSONPathNodeList:S,JSONPathSyntaxError:a,JSONPathTypeError:s,Nothing:T,Token:Z,TokenKind:X,compile:Me,expressions:G,functions:Ae,query:je,selectors:Te});class Ke extends Error{constructor(e){super(e),this.message=e,Object.setPrototypeOf(this,new.target.prototype),this.name="JSONPatchError"}}class Ce extends Ke{constructor(e){super(e),this.message=e,Object.setPrototypeOf(this,new.target.prototype),this.name="JSONPatchTestFailure"}}class Ue{name="add";constructor(e,t){this.path=e,this.value=t}apply(e,t){const[n,r]=this.path.resolveWithParent(e);if(n===x)return this.value;const s=this.path.tokens.at(-1);if(void 0===s)throw new Ke(`unexpected operation on 'undefined' (${this.name}:${t})`);if(h(n))if(r===x){if("-"!==s)throw new Ke(`index out of range (${this.name}:${t})`);n.push(this.value)}else n.splice(Number(s),0,this.value);else{if(!c(n))throw new Ke(`unexpected operation on '${typeof n}' (${this.name}:${t})`);n[s]=this.value}return e}toObject(){return{op:this.name,path:this.path.toString(),value:this.value}}}class De{name="remove";constructor(e){this.path=e}apply(e,t){const[n,r]=this.path.resolveWithParent(e);if(n===x)throw new Ke(`can't remove root (${this.name}:${t})`);const s=this.path.tokens.at(-1);if(void 0===s)throw new Ke(`unexpected operation on 'undefined' (${this.name}:${t})`);if(h(n)){if(r===x)throw new Ke(`can't remove nonexistent item (${this.name}:${t})`);n.splice(Number(s),1)}else{if(!c(n))throw new Ke(`unexpected operation on '${typeof n}' (${this.name}:${t})`);if(r===x)throw new Ke(`can't remove nonexistent property (${this.name}:${t})`);delete n[s]}return e}toObject(){return{op:this.name,path:this.path.toString()}}}class Ge{name="replace";constructor(e,t){this.path=e,this.value=t}apply(e,t){const[n,r]=this.path.resolveWithParent(e);if(n===x)return this.value;const s=this.path.tokens.at(-1);if(void 0===s)throw new Ke(`unexpected operation on 'undefined' (${this.name}:${t})`);if(h(n)){if(r===x)throw new Ke(`can't replace nonexistent item (${this.name}:${t})`);n.splice(Number(s),1,this.value)}else{if(!c(n))throw new Ke(`unexpected operation on '${typeof n}' (${this.name}:${t})`);if(r===x)throw new Ke(`can't replace nonexistent property (${this.name}:${t})`);n[s]=this.value}return e}toObject(){return{op:this.name,path:this.path.toString(),value:this.value}}}class We{name="move";constructor(e,t){this.from=e,this.path=t}apply(e,t){if(this.path.isRelativeTo(this.from))throw new Ke(`can't move object to one of its own children (${this.name}:${t})`);const[n,r]=this.from.resolveWithParent(e);if(r===x)throw new Ke(`source object does not exist (${this.name}:${t})`);const s=this.from.tokens.at(-1);if(void 0===s)throw new Ke(`unexpected operation on 'undefined' (${this.name}:${t})`);h(n)?n.splice(Number(s),1):c(n)&&delete n[s];const[i,o]=this.path.resolveWithParent(e);if(i===x)return r;const a=this.path.tokens.at(-1);if(void 0===a)throw new Ke(`unexpected operation on 'undefined' (${this.name}:${t})`);if(h(i))i.splice(Number(a),0,r);else{if(!c(i))throw new Ke(`unexpected operation on '${typeof parent}' (${this.name}:${t})`);i[a]=r}return e}toObject(){return{op:this.name,from:this.from.toString(),path:this.path.toString()}}}class Qe{name="copy";constructor(e,t){this.from=e,this.path=t}apply(e,t){const[n,r]=this.from.resolveWithParent(e);if(r===x)throw new Ke(`source object does not exist (${this.name}:${t})`);const[s]=this.path.resolveWithParent(e);if(s===x)return this.deepCopy(r);const i=this.path.tokens.at(-1);if(void 0===i)throw new Ke(`unexpected operation on 'undefined' (${this.name}:${t})`);if(h(s))s.splice(Number(i),0,this.deepCopy(r));else{if(!c(s))throw new Ke(`unexpected operation on '${typeof parent}' (${this.name}:${t})`);s[i]=this.deepCopy(r)}return e}toObject(){return{op:this.name,from:this.from.toString(),path:this.path.toString()}}deepCopy(e){return JSON.parse(JSON.stringify(e))}}class Be{name="test";constructor(e,t){this.path=e,this.value=t}apply(e,t){const[n,r]=this.path.resolveWithParent(e);if(!l(r,this.value))throw new Ce(`test failed (${this.name}:${t})`);return e}toObject(){return{op:this.name,path:this.path.toString(),value:this.value}}}class ze{ops=[];constructor(e){e&&this.build(e)}add(e,t){return this.ops.push(new Ue(this.ensurePointer(e,"add",this.ops.length),t)),this}remove(e){return this.ops.push(new De(this.ensurePointer(e,"remove",this.ops.length))),this}replace(e,t){return this.ops.push(new Ge(this.ensurePointer(e,"replace",this.ops.length),t)),this}move(e,t){return this.ops.push(new We(this.ensurePointer(e,"move",this.ops.length),this.ensurePointer(t,"move",this.ops.length))),this}copy(e,t){return this.ops.push(new Qe(this.ensurePointer(e,"copy",this.ops.length),this.ensurePointer(t,"copy",this.ops.length))),this}test(e,t){return this.ops.push(new Be(this.ensurePointer(e,"test",this.ops.length),t)),this}apply(e){let t=e;for(let e=0;e<this.ops.length;e++){const n=this.ops[e];try{t=n.apply(t,e)}catch(t){if(t instanceof g)throw new Ke(`${t.message} (${n.name}:${e})`);throw t}}return t}toArray(){return this.ops.map((e=>e.toObject()))}build(e){for(let t=0;t<e.length;t++){const n=e[t];switch(n.op){case"add":this.add(this.opPointer(n,"path","add",t),this.opValue(n,"value","add",t));break;case"remove":this.remove(this.opPointer(n,"path","remove",t));break;case"replace":this.replace(this.opPointer(n,"path","replace",t),this.opValue(n,"value","replace",t));break;case"move":this.move(this.opPointer(n,"from","move",t),this.opPointer(n,"path","move",t));break;case"copy":this.copy(this.opPointer(n,"from","copy",t),this.opPointer(n,"path","copy",t));break;case"test":this.test(this.opPointer(n,"path","test",t),this.opValue(n,"value","test",t));break;default:throw new Ke(`expected 'op' to be one of 'add', 'remove', 'replace', 'move', 'copy' or 'test' (${n.op}:${t})`)}}}opPointer(e,t,n,r){if(!Object.hasOwn(e,t))throw new Ke(`missing property '${t}' (${n}:${r})`);const s=e[t];if(!u(s))throw new Ke(`expected a JSON Pointer string for '${t}', found ${typeof s} (${n}:${r})`);try{return new E(s)}catch(e){if(e instanceof d)throw new Ke(`${e.message} (${n}:${r})`);throw e}}opValue(e,t,n,r){if(!Object.hasOwn(e,t))throw new Ke(`missing property '${t}' (${n}:${r})`);return e[t]}ensurePointer(e,t,n){if(e instanceof E)return e;if(!u(e))throw new Ke(`expected a JSON Pointer string, found ${typeof e} (${t}:${n})`);try{return new E(e)}catch(e){if(e instanceof d)throw new Ke(`${e.message} (${t}:${n})`);throw e}}}function Ve(e,t){return new ze(e).apply(t)}var qe=Object.freeze({__proto__:null,JSONPatch:ze,JSONPatchError:Ke,JSONPatchTestFailure:Ce,apply:Ve});return e.FunctionExpressionType=f,e.JSONPatch=ze,e.JSONPatchError=Ke,e.JSONPatchTestFailure=Ce,e.JSONPath=$e,e.JSONPathEnvironment=Ie,e.JSONPathError=t,e.JSONPathIndexError=i,e.JSONPathLexerError=r,e.JSONPathNode=y,e.JSONPathNodeList=S,e.JSONPathSyntaxError=a,e.JSONPathTypeError=s,e.JSONPointer=E,e.Nothing=T,e.Token=Z,e.TokenKind=X,e.UNDEFINED=x,e.apply=Ve,e.compile=Me,e.jsonpatch=qe,e.jsonpath=Je,e.jsonpointer=k,e.query=je,e.resolve=N,e.version="0.1.0",e}({});
|
|
2
|
+
//# sourceMappingURL=json-p3.iife.min.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-p3.iife.min.js","sources":["../src/path/errors.ts","../src/types.ts","../src/deep_equals.ts","../src/path/functions/function.ts","../src/pointer/errors.ts","../src/pointer/pointer.ts","../src/pointer/index.ts","../src/path/node.ts","../src/path/types.ts","../src/path/expression.ts","../src/path/functions/count.ts","../src/path/functions/length.ts","../src/path/lru_cache.ts","../src/path/functions/match.ts","../src/path/functions/search.ts","../src/path/functions/value.ts","../src/path/token.ts","../src/path/lex.ts","../src/path/selectors.ts","../src/path/path.ts","../src/path/parse.ts","../src/path/environment.ts","../src/path/index.ts","../src/patch/errors.ts","../src/patch/patch.ts","../src/patch/index.ts","../src/index.ts"],"sourcesContent":["import { Token } from \"./token\";\n\n/**\n * Base class for all JSONPath errors.\n */\nexport class JSONPathError extends Error {\n constructor(\n readonly message: string,\n readonly token: Token,\n ) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"JSONPathError\";\n this.message = withErrorContext(message, token);\n }\n}\n\nfunction withErrorContext(message: string, token: Token): string {\n if (token.input.length <= 9) {\n return `${message} ('${token.input}':${token.index})`;\n }\n\n if (token.index > token.input.length - 5) {\n return `${message} ('${token.input.slice(token.input.length - 9)}':${\n token.index\n })`;\n }\n\n if (token.index - 4 < 0) {\n return `${message} ('${token.input.slice(0, 9)}':${token.index})`;\n }\n\n return `${message} ('${token.input.slice(\n token.index - 4,\n token.index + 5,\n )}':${token.index})`;\n}\n\n/**\n * Error thrown due to unexpected, internal path tokenization problems.\n */\nexport class JSONPathLexerError extends JSONPathError {\n constructor(\n readonly message: string,\n readonly token: Token,\n ) {\n super(message, token);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"JSONPathLexerError\";\n this.message = withErrorContext(message, token);\n }\n}\n\n/**\n * Error thrown due to type errors when evaluating filter expressions.\n */\nexport class JSONPathTypeError extends JSONPathError {\n constructor(\n readonly message: string,\n readonly token: Token,\n ) {\n super(message, token);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"JSONPathTypeError\";\n this.message = withErrorContext(message, token);\n }\n}\n\n/**\n * Error thrown due to out of range indices.\n */\nexport class JSONPathIndexError extends JSONPathError {\n constructor(\n readonly message: string,\n readonly token: Token,\n ) {\n super(message, token);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"JSONPathIndexError\";\n this.message = withErrorContext(message, token);\n }\n}\n\n/**\n * Error thrown when attempting to retrieve a filter function that has not\n * been registered.\n */\nexport class UndefinedFilterFunctionError extends JSONPathError {\n constructor(\n readonly message: string,\n readonly token: Token,\n ) {\n super(message, token);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"UndefinedFilterFunctionError\";\n this.message = withErrorContext(message, token);\n }\n}\n\n/**\n * Error thrown due to syntax errors found during parsing a JSONPath query.\n */\nexport class JSONPathSyntaxError extends JSONPathError {\n constructor(\n readonly message: string,\n readonly token: Token,\n ) {\n super(message, token);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"JSONPathSyntaxError\";\n this.message = withErrorContext(message, token);\n }\n}\n","/**\n * Common types and type predicates.\n */\n\n/**\n * A JSON-like value.\n */\nexport type JSONValue =\n | string\n | number\n | null\n | undefined\n | boolean\n | JSONValue[]\n | { [key: string]: JSONValue };\n\n/**\n * A type predicate for the Array object.\n */\nexport function isArray(value: unknown): value is unknown[] {\n return Array.isArray(value);\n}\n\n/**\n * A type predicate for object.\n */\nexport function isObject(value: unknown): value is object {\n const _type = typeof value;\n return (value !== null && _type === \"object\") || _type === \"function\"\n ? true\n : false;\n}\n\n/**\n * A type predicate for a string primitive.\n */\nexport function isString(value: unknown): value is string {\n return typeof value === \"string\";\n}\n\n/**\n * A type predicate for a number primitive.\n */\nexport function isNumber(value: unknown): value is string {\n return typeof value === \"number\";\n}\n","/**\n * Deep equality of JSON-like values.\n *\n * No attempt is made to handle function objects, recursive data\n * structures, NaNs, sparse arrays, primitive wrapper objects....\n *\n * We're not using JSON.stringify because we want objects with the same\n * entries in a different order to compare equal.\n */\n\nimport { isObject } from \"./types\";\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nexport function deepEquals(a: unknown, b: unknown): boolean {\n if (a === b) {\n return true;\n }\n\n if (Array.isArray(a)) {\n if (Array.isArray(b)) {\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (!deepEquals(a[i], b[i])) {\n return false;\n }\n }\n return true;\n }\n return false;\n } else if (isObject(a) && isObject(b)) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n for (const key of keysA) {\n if (!deepEquals(a[key as keyof typeof a], b[key as keyof typeof b])) {\n return false;\n }\n }\n\n return true;\n }\n\n return false;\n}\n","/**\n * The type of a JSONPath filter function parameter or return value, as\n * described in See section 2.4.1 of draft-ietf-jsonpath-base-20.\n */\nexport enum FunctionExpressionType {\n ValueType = \"ValueType\",\n LogicalType = \"LogicalType\",\n NodesType = \"NodesType\",\n}\n\n/**\n * A JSONPath filter function definition.\n */\nexport interface FilterFunction {\n /**\n * Argument types expected by the filter function.\n */\n argTypes: FunctionExpressionType[];\n\n /**\n * The type of the value returned by the filter function.\n */\n returnType: FunctionExpressionType;\n\n /**\n * A function with unknown number and type of arguments.\n */\n call(...args: unknown[]): unknown;\n}\n","/**\n * Base class for all JSON Pointer errors.\n */\nexport class JSONPointerError extends Error {\n constructor(readonly message: string) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"JSONPointerError\";\n }\n}\n\nexport class JSONPointerResolutionError extends JSONPointerError {\n constructor(readonly message: string) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"JSONPointerResolutionError\";\n }\n}\n\nexport class JSONPointerIndexError extends JSONPointerResolutionError {\n constructor(readonly message: string) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"JSONPointerIndexError\";\n }\n}\n\nexport class JSONPointerKeyError extends JSONPointerResolutionError {\n constructor(readonly message: string) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"JSONPointerKeyError\";\n }\n}\n\nexport class JSONPointerSyntaxError extends JSONPointerError {\n constructor(readonly message: string) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"JSONPointerSyntaxError\";\n }\n}\n\nexport class JSONPointerTypeError extends JSONPointerResolutionError {\n constructor(readonly message: string) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"JSONPointerTypeError\";\n }\n}\n","import { JSONValue, isArray, isObject, isString } from \"../types\";\nimport {\n JSONPointerIndexError,\n JSONPointerKeyError,\n JSONPointerResolutionError,\n JSONPointerSyntaxError,\n JSONPointerTypeError,\n} from \"./errors\";\n\n/**\n * The symbol indicating the absence of a JSON value.\n */\nexport const UNDEFINED = Symbol.for(\"jsonpointer.undefined\");\n\nexport type MaybeJSONValue = JSONValue | typeof UNDEFINED;\n\n/**\n * Identify a single value in JSON-like data, as per RFC 6901.\n */\nexport class JSONPointer {\n #pointer: string;\n tokens: string[];\n\n /**\n * @param pointer - A string representation of a JSON Pointer.\n */\n constructor(pointer: string) {\n this.tokens = this.parse(pointer);\n this.#pointer = JSONPointer.encode(this.tokens);\n }\n\n static encode(tokens: string[]) {\n if (!tokens.length) return \"\";\n return (\n // eslint-disable-next-line prefer-template\n \"/\" +\n tokens\n .map((token) => token.replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\"))\n .join(\"/\")\n );\n }\n\n /**\n * Resolve this pointer against JSON-like data _value_.\n *\n * @param value - The target JSON-like value, possibly loaded using\n * `JSON.parse()`.\n * @param fallback - A default value to return if _value_ has no\n * path matching `pointer`.\n * @returns The value identified by _pointer_ or, if given, the fallback\n * value in the even of a `JSONPointerResolutionError`.\n *\n * @throws {@link JSONPointerResolutionError}\n * If the value pointed to by _pointer_ does not exist in _value_, and\n * no fallback value is given.\n */\n public resolve(\n value: JSONValue,\n fallback: MaybeJSONValue = UNDEFINED,\n ): JSONValue {\n try {\n return this.tokens.reduce(this.getItem.bind(this), value);\n } catch (error) {\n if (\n error instanceof JSONPointerResolutionError &&\n fallback !== UNDEFINED\n ) {\n return fallback;\n }\n throw error;\n }\n }\n\n // TODO: add `resolveWithFallback` to handle explicit `undefined`\n\n /**\n *\n * @param value -\n * @returns\n */\n public resolveWithParent(value: JSONValue): [MaybeJSONValue, MaybeJSONValue] {\n if (!this.tokens.length) return [UNDEFINED, this.resolve(value)];\n\n const parent = this.tokens\n .slice(0, this.tokens.length - 1)\n .reduce(this.getItem.bind(this), value);\n\n try {\n return [\n parent,\n this.getItem(\n parent,\n this.tokens[this.tokens.length - 1],\n this.tokens.length - 1,\n ),\n ];\n } catch (error) {\n if (\n error instanceof JSONPointerIndexError ||\n error instanceof JSONPointerKeyError\n ) {\n return [parent, UNDEFINED];\n }\n throw error;\n }\n }\n\n /**\n *\n * @returns\n */\n public toString(): string {\n return this.#pointer;\n }\n\n /**\n * Return _true_ if this pointer points to a child of _pointer_.\n */\n public isRelativeTo(pointer: JSONPointer): boolean {\n return (\n pointer.tokens.length < this.tokens.length &&\n this.tokens\n .slice(0, pointer.tokens.length)\n .every((t, i) => t === pointer.tokens[i])\n );\n }\n\n protected parse(pointer: string): string[] {\n if (pointer.length && !pointer.startsWith(\"/\")) {\n throw new JSONPointerSyntaxError(\n `\"${pointer}\" pointers must start with a slash or be the empty string`,\n );\n }\n\n return pointer\n .split(\"/\")\n .map((token) => token.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\"))\n .slice(1);\n }\n\n protected getItem(val: JSONValue, token: string, idx: number): JSONValue {\n // NOTE:\n // - string primitives \"have own\" indices and `length`.\n // - Arrays have a `length` property.\n // - A property might exist with the value `undefined` or `null`.\n // - obj[1] is equivalent to obj[\"1\"].\n if (isArray(val)) {\n if (token !== \"length\" && Object.hasOwn(val, token)) {\n return val[Number(token)];\n } else {\n throw new JSONPointerIndexError(\n `index out of range '${JSONPointer.encode(\n this.tokens.slice(0, idx + 1),\n )}'`,\n );\n }\n } else if (isObject(val)) {\n if (Object.hasOwn(val, token)) {\n return val[token];\n } else {\n throw new JSONPointerKeyError(\n `no such property '${JSONPointer.encode(\n this.tokens.slice(0, idx + 1),\n )}'`,\n );\n }\n }\n throw new JSONPointerTypeError(\n `found primitive value, expected an object '${JSONPointer.encode(\n this.tokens.slice(0, idx + 1),\n )}'`,\n );\n }\n\n private _join(pointer: string): JSONPointer {\n if (!isString(pointer)) {\n throw new JSONPointerTypeError(\n `join() requires string arguments, found ${typeof pointer}`,\n );\n }\n\n if (pointer.startsWith(\"/\")) {\n return new JSONPointer(pointer);\n }\n\n const tokens = this.tokens.concat(\n pointer\n .split(\"/\")\n .map((token) => token.replaceAll(\"~1\", \"/\").replaceAll(\"~0\", \"~\")),\n );\n\n return new JSONPointer(JSONPointer.encode(tokens));\n }\n\n /**\n * Join this pointer with _tokens_.\n * @param tokens - JSON Pointer strings, possibly without leading slashes.\n * If a token or \"part\" does have a leading slash, the previous pointer is\n * ignored and a new `JSONPointer` is created, then processing of the\n * remaining tokens continues.\n * @returns A new JSON Pointer that is the concatenation of all tokens or\n * \"parts\".\n */\n public join(...tokens: string[]): JSONPointer {\n if (!tokens.length) {\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n let pointer: JSONPointer = this;\n for (const tok of tokens) {\n pointer = pointer._join(tok);\n }\n return pointer;\n }\n\n /**\n * Return _true_ if this pointer can be resolved against _value_.\n *\n * Note that `JSONPointer.resolve()` can return legitimate falsy values\n * that form part of the target JSON document. This method will return\n * `true` if a falsy value is found.\n */\n public exists(value: JSONValue): boolean {\n try {\n this.resolve(value);\n } catch (error) {\n if (error instanceof JSONPointerResolutionError) {\n return false;\n }\n throw error;\n }\n return true;\n }\n\n /**\n * Return this pointer's parent as a new `JSONPointer`.\n *\n * If this pointer points to the document root, _this_ is returned.\n */\n public parent(): JSONPointer {\n if (!this.tokens.length) {\n return this;\n }\n\n return new JSONPointer(\n JSONPointer.encode(this.tokens.slice(0, this.tokens.length - 1)),\n );\n }\n\n // TODO: to (relative pointer)\n}\n","import { JSONValue } from \"../types\";\nimport { JSONPointer, MaybeJSONValue, UNDEFINED } from \"./pointer\";\n\nexport { JSONPointer, UNDEFINED } from \"./pointer\";\nexport type { MaybeJSONValue } from \"./pointer\";\n\nexport {\n JSONPointerError,\n JSONPointerResolutionError,\n JSONPointerIndexError,\n JSONPointerKeyError,\n JSONPointerSyntaxError,\n JSONPointerTypeError,\n} from \"./errors\";\n\n/**\n * Resolve JSON Pointer _pointer_ against JSON-like data _value_.\n *\n * @param pointer - A string representation of a JSON pointer.\n * @param value - The target JSON-like value, possibly loaded using\n * `JSON.parse()`.\n * @param fallback - A default value to return if _value_ has no\n * path matching `pointer`.\n * @returns The value identified by _pointer_ or, if given, the fallback\n * value in the even of a `JSONPointerResolutionError`.\n *\n * @throws {@link JSONPointerResolutionError}\n * If the value pointed to by _pointer_ does not exist in _value_, and\n * no fallback value is given.\n *\n * @throws {@link JSONPointerSyntaxError}\n * If _pointer_ is malformed according to RFC 6901.\n */\nexport function resolve(\n pointer: string,\n value: JSONValue,\n fallback: MaybeJSONValue = UNDEFINED,\n): JSONValue {\n return new JSONPointer(pointer).resolve(value, fallback);\n}\n","import { JSONPointer } from \"../pointer\";\nimport { JSONValue, isString } from \"../types\";\n\n/**\n * The pair of a JSON value and its location found in the target JSON value.\n */\nexport class JSONPathNode {\n /**\n * The normalized path to this node in the target JSON value.\n */\n readonly path: string;\n\n /**\n * @param value - The JSON value found at _location_.\n * @param location - The parts of a normalized path to _value_.\n * @param root - The target value at the top of the JSON node tree.\n */\n constructor(\n readonly value: JSONValue,\n readonly location: Array<string | number>,\n readonly root: JSONValue,\n ) {\n this.path =\n // eslint-disable-next-line prefer-template\n \"$\" + location.map((s) => (isString(s) ? `['${s}']` : `[${s}]`)).join(\"\");\n }\n\n /**\n * Return this node's location as a {@link JSONPointer}.\n */\n public toPointer(): JSONPointer {\n if (!this.location.length) {\n return new JSONPointer(\"\");\n }\n return new JSONPointer(JSONPointer.encode(this.location.map(String)));\n }\n}\n\n/**\n *\n */\nexport class JSONPathNodeList {\n constructor(readonly nodes: JSONPathNode[]) {}\n\n /**\n * @returns an iterator over nodes in the list.\n */\n [Symbol.iterator](): Iterator<JSONPathNode> {\n return this.nodes[Symbol.iterator]();\n }\n\n /**\n * @returns `true` if the node list is empty.\n */\n public empty(): boolean {\n return this.nodes.length === 0;\n }\n\n /**\n * @returns An array containing the values at each node in the list.\n *\n * @see {@link valuesOrSingular} to unpack the array if there is only\n * one node in the list.\n */\n public values(): JSONValue[] {\n return this.nodes.map((node) => node.value);\n }\n\n /**\n * Like {@link values}, but returns the node's value is there is only one\n * node in the list.\n */\n public valuesOrSingular(): JSONValue {\n if (this.nodes.length === 1) return this.nodes[0].value;\n return this.nodes.map((node) => node.value);\n }\n\n /**\n * @returns An array of locations for each node in the node list.\n *\n * A location is an array of property names and array indices that were\n * required to reach the node's value in the target JSON value.\n */\n public locations(): Array<Array<string | number>> {\n return this.nodes.map((node) => node.location);\n }\n\n /**\n * @returns An array of normalized path strings for each node in the list.\n *\n * A normalized path contains only property name and index selectors, and\n * always uses bracketed segments, never shorthand selectors.\n */\n public paths(): string[] {\n return this.nodes.map((node) => node.path);\n }\n\n /**\n * @returns An array of {@link JSONPointer} instances, one for each node\n * in the list.\n */\n public pointers(): JSONPointer[] {\n return this.nodes.map((node) => node.toPointer());\n }\n\n /**\n * @returns The number of nodes in the node list.\n */\n public get length(): number {\n return this.nodes.length;\n }\n}\n","import { JSONValue, isObject } from \"../types\";\nimport { JSONPathEnvironment } from \"./environment\";\n\nexport const Nothing = Symbol.for(\"jsonpath.nothing\");\n\n/**\n * ValueType for JSONPath function expression tye system.\n */\nexport type JSONPathValue = JSONValue | typeof Nothing;\n\n/**\n * Object passed to FilterExpression.evaluate().\n */\nexport type FilterContext = {\n environment: JSONPathEnvironment;\n currentValue: JSONValue;\n rootValue: JSONValue;\n};\n\n/**\n * A type predicate for an object with a string property.\n */\nexport function hasStringKey(\n value: unknown,\n key: string,\n): value is { [key: string]: unknown } {\n return isObject(value) && Object.hasOwn(value, key);\n}\n","import { deepEquals } from \"../deep_equals\";\nimport { JSONPathTypeError, UndefinedFilterFunctionError } from \"./errors\";\nimport { FunctionExpressionType } from \"./functions/function\";\nimport { JSONPathNodeList } from \"./node\";\nimport { JSONPath } from \"./path\";\nimport { Token } from \"./token\";\nimport { FilterContext, Nothing } from \"./types\";\nimport { isNumber, isString } from \"../types\";\n\n/**\n * Base class for all filter expressions.\n */\nexport abstract class FilterExpression {\n constructor(readonly token: Token) {}\n\n /**\n * Evaluate the filter expression in the given context.\n * @param context - Evaluation context.\n */\n public abstract evaluate(context: FilterContext): unknown;\n\n /**\n * Return a string representation of the expression.\n */\n public abstract toString(): string;\n}\n\n/**\n * Base class for JSONPath ValueType literals.\n */\nexport abstract class FilterExpressionLiteral extends FilterExpression {}\n\nexport class NullLiteral extends FilterExpressionLiteral {\n public evaluate(): null {\n return null;\n }\n\n public toString(): string {\n return \"null\";\n }\n}\n\nexport class BooleanLiteral extends FilterExpressionLiteral {\n constructor(\n readonly token: Token,\n readonly value: boolean,\n ) {\n super(token);\n }\n\n public evaluate(): boolean {\n return this.value;\n }\n\n public toString(): string {\n return String(this.value);\n }\n}\n\nexport class StringLiteral extends FilterExpressionLiteral {\n constructor(\n readonly token: Token,\n readonly value: string,\n ) {\n super(token);\n }\n\n public evaluate(): string {\n return this.value;\n }\n\n public toString(): string {\n return JSON.stringify(this.value);\n }\n}\n\nexport class NumberLiteral extends FilterExpressionLiteral {\n constructor(\n readonly token: Token,\n readonly value: number,\n ) {\n super(token);\n }\n\n public evaluate(): number {\n return this.value;\n }\n\n public toString(): string {\n return String(this.value);\n }\n}\n\nexport class PrefixExpression extends FilterExpression {\n constructor(\n readonly token: Token,\n readonly operator: string,\n readonly right: FilterExpression,\n ) {\n super(token);\n }\n\n public evaluate(context: FilterContext): boolean {\n if (this.operator === \"!\") {\n const value = this.right.evaluate(context);\n if (value instanceof JSONPathNodeList) return value.nodes.length === 0; // negated existence\n return !isTruthy(value);\n }\n throw new JSONPathTypeError(\n `unknown operator '${this.operator}'`,\n this.token,\n );\n }\n\n public toString(): string {\n return `${this.operator}${this.right.toString()}`;\n }\n}\n\nexport class InfixExpression extends FilterExpression {\n constructor(\n readonly token: Token,\n readonly left: FilterExpression,\n readonly operator: string,\n readonly right: FilterExpression,\n ) {\n super(token);\n }\n\n public evaluate(context: FilterContext): boolean {\n let left = this.left.evaluate(context);\n if (left instanceof JSONPathNodeList && left.nodes.length === 1)\n left = left.nodes[0].value;\n\n let right = this.right.evaluate(context);\n if (right instanceof JSONPathNodeList && right.nodes.length === 1)\n right = right.nodes[0].value;\n\n if (this.operator === \"&&\") {\n return isTruthy(left) && isTruthy(right);\n }\n\n if (this.operator === \"||\") {\n return isTruthy(left) || isTruthy(right);\n }\n\n return compare(left, this.operator, right);\n }\n\n public toString(): string {\n if (this.operator === \"&&\" || this.operator === \"||\") {\n return `(${this.left.toString()} ${\n this.operator\n } ${this.right.toString()})`;\n }\n return `${this.left.toString()} ${this.operator} ${this.right.toString()}`;\n }\n}\n\nexport class LogicalExpression extends FilterExpression {\n constructor(\n readonly token: Token,\n readonly expression: FilterExpression,\n ) {\n super(token);\n }\n\n public evaluate(context: FilterContext): boolean {\n const value = this.expression.evaluate(context);\n if (value instanceof JSONPathNodeList) return value.nodes.length > 0; // existence\n return isTruthy(value);\n }\n\n public toString(): string {\n return this.expression.toString();\n }\n}\n\n/**\n * Base class for relative and absolute JSONPath query expressions.\n */\nexport abstract class JSONPathQuery extends FilterExpression {\n constructor(\n readonly token: Token,\n readonly path: JSONPath,\n ) {\n super(token);\n }\n}\n\nexport class RelativeQuery extends JSONPathQuery {\n public evaluate(context: FilterContext): JSONPathNodeList {\n return this.path.query(context.currentValue);\n }\n\n public toString(): string {\n return `@${this.path.toString().slice(1)}`;\n }\n}\n\nexport class RootQuery extends JSONPathQuery {\n public evaluate(context: FilterContext): JSONPathNodeList {\n return this.path.query(context.rootValue);\n }\n\n public toString(): string {\n return this.path.toString();\n }\n}\n\nexport class FunctionExtension extends FilterExpression {\n constructor(\n readonly token: Token,\n readonly name: string,\n readonly args: FilterExpression[],\n ) {\n super(token);\n }\n\n public evaluate(context: FilterContext): unknown {\n const func = context.environment.filterRegister.get(this.name);\n if (!func) {\n throw new UndefinedFilterFunctionError(\n `filter function '${this.name}' is undefined`,\n this.token,\n );\n }\n\n const args = this.args\n .map((arg) => arg.evaluate(context))\n .map((arg, idx) =>\n func.argTypes[idx] !== FunctionExpressionType.NodesType &&\n arg instanceof JSONPathNodeList\n ? arg.valuesOrSingular()\n : arg,\n );\n return func.call(...args);\n }\n\n public toString(): string {\n return `${this.name}(${this.args.map((e) => e.toString()).join(\", \")})`;\n }\n}\n\n/**\n *\n * @param value -\n */\nfunction isTruthy(value: unknown): boolean {\n if (value instanceof JSONPathNodeList && value.empty()) return false;\n return !(typeof value === \"boolean\" && value === false);\n}\n\n/**\n *\n * @param left -\n * @param operator -\n * @param right -\n */\nfunction compare(left: unknown, operator: string, right: unknown): boolean {\n switch (operator) {\n case \"==\":\n return eq(left, right);\n case \"!=\":\n return !eq(left, right);\n case \"<\":\n return lt(left, right);\n case \">\":\n return lt(right, left);\n case \">=\":\n return lt(right, left) || eq(left, right);\n case \"<=\":\n return lt(left, right) || eq(left, right);\n default:\n return false;\n }\n}\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nfunction eq(left: unknown, right: unknown): boolean {\n if (right instanceof JSONPathNodeList) [left, right] = [right, left];\n if (left instanceof JSONPathNodeList) {\n if (right instanceof JSONPathNodeList) {\n if (left.empty() && right.empty()) return true;\n if (left.nodes.length === 1 && right.nodes.length === 1)\n return deepEquals(left.nodes[0].value, right.nodes[0].value);\n }\n if (left.empty()) return right === Nothing;\n if (left.nodes.length === 1) return deepEquals(left.nodes[0].value, right);\n return false;\n }\n if (left === Nothing && right === Nothing) return true;\n return deepEquals(left, right);\n}\n\nfunction lt(left: unknown, right: unknown): boolean {\n if (\n (isString(left) && isString(right)) ||\n (isNumber(left) && isNumber(right))\n )\n return left < right;\n return false;\n}\n","import { JSONPathNodeList } from \"../node\";\nimport { FilterFunction, FunctionExpressionType } from \"./function\";\n\nexport class Count implements FilterFunction {\n readonly argTypes = [FunctionExpressionType.NodesType];\n readonly returnType = FunctionExpressionType.ValueType;\n\n public call(nodes: JSONPathNodeList): number {\n return nodes.length;\n }\n}\n","import { FilterFunction, FunctionExpressionType } from \"./function\";\nimport { Nothing } from \"../types\";\nimport { isArray, isObject, isString } from \"../../types\";\n\nexport class Length implements FilterFunction {\n readonly argTypes = [FunctionExpressionType.ValueType];\n readonly returnType = FunctionExpressionType.ValueType;\n\n public call(value: unknown): number | typeof Nothing {\n if (isArray(value) || isString(value)) return value.length;\n if (isObject(value)) return Object.keys(value).length;\n return Nothing;\n }\n}\n","/**\n * A Least Recently Used cache, implemented as an extended Map.\n */\nexport class LRUCache<K, V> extends Map<K, V> {\n readonly maxSize: number;\n\n constructor(maxSize: number = 128, entries?: Iterable<[K, V]>) {\n if (entries !== undefined) {\n super(entries);\n } else {\n super();\n }\n this.maxSize = maxSize;\n }\n\n get(key: K): V | undefined {\n const val = super.get(key);\n if (this.has(key)) {\n this.delete(key);\n this.set(key, val as V);\n }\n return val;\n }\n\n set(key: K, value: V): this {\n if (this.has(key)) {\n this.delete(key);\n } else if (this.size >= this.maxSize) {\n this.delete(this.first());\n }\n return super.set(key, value);\n }\n\n first() {\n return this.keys().next().value;\n }\n}\n","import { LRUCache } from \"../lru_cache\";\nimport { FilterFunction, FunctionExpressionType } from \"./function\";\n\nexport type MatchFilterFunctionOptions = {\n /**\n * The maximum number of regular expressions to cache.\n */\n cacheSize?: number;\n\n /**\n * If _true_, throw errors from regex construction and matching.\n * The standard and default behavior is to ignore these errors\n * and return _false_.\n */\n throwErrors?: boolean;\n};\n\nexport class Match implements FilterFunction {\n readonly argTypes = [\n FunctionExpressionType.ValueType,\n FunctionExpressionType.ValueType,\n ];\n\n readonly returnType = FunctionExpressionType.LogicalType;\n\n readonly cacheSize: number;\n readonly throwErrors: boolean;\n #cache: LRUCache<string, RegExp>;\n\n constructor(readonly options: MatchFilterFunctionOptions = {}) {\n this.cacheSize = options.cacheSize ?? 10;\n this.throwErrors = options.throwErrors ?? false;\n this.#cache = new LRUCache(this.cacheSize);\n }\n\n public call(s: string, pattern: string): boolean {\n if (this.cacheSize > 0) {\n const re = this.#cache.get(pattern);\n if (re) {\n try {\n return re.test(s);\n } catch (error) {\n if (this.throwErrors) throw error;\n return false;\n }\n }\n }\n\n try {\n const re = new RegExp(this.fullMatch(pattern), \"u\");\n if (this.cacheSize > 0) this.#cache.set(pattern, re);\n return re.test(s);\n } catch (error) {\n if (this.throwErrors) throw error;\n return false;\n }\n }\n\n protected fullMatch(pattern: string): string {\n const parts: string[] = [];\n if (!pattern.startsWith(\"^\")) parts.push(\"^\");\n parts.push(pattern);\n if (!pattern.endsWith(\"$\")) parts.push(\"$\");\n return parts.join(\"\");\n }\n}\n","import { LRUCache } from \"../lru_cache\";\nimport { FilterFunction, FunctionExpressionType } from \"./function\";\n\nexport type SearchFilterFunctionOptions = {\n /**\n * The maximum number of regular expressions to cache. Defaults\n * to 10.\n */\n cacheSize?: number;\n\n /**\n * If _true_, throw errors from regex construction and matching.\n * The standard and default behavior is to ignore these errors\n * and return _false_.\n */\n throwErrors?: boolean;\n};\n\nexport class Search implements FilterFunction {\n readonly argTypes = [\n FunctionExpressionType.ValueType,\n FunctionExpressionType.ValueType,\n ];\n\n readonly returnType = FunctionExpressionType.LogicalType;\n\n readonly cacheSize: number;\n readonly throwErrors: boolean;\n #cache: LRUCache<string, RegExp>;\n\n constructor(readonly options: SearchFilterFunctionOptions = {}) {\n this.cacheSize = options.cacheSize ?? 10;\n this.throwErrors = options.throwErrors ?? false;\n this.#cache = new LRUCache(this.cacheSize);\n }\n\n public call(s: string, pattern: string): boolean {\n if (this.cacheSize > 0) {\n const re = this.#cache.get(pattern);\n if (re) {\n try {\n return !!s.match(re);\n } catch (error) {\n if (this.throwErrors) throw error;\n return false;\n }\n }\n }\n\n try {\n const re = new RegExp(pattern, \"u\");\n if (this.cacheSize > 0) this.#cache.set(pattern, re);\n return !!s.match(re);\n } catch (error) {\n if (this.throwErrors) throw error;\n return false;\n }\n }\n}\n","import { JSONPathNodeList } from \"../node\";\nimport { Nothing } from \"../types\";\nimport { FilterFunction, FunctionExpressionType } from \"./function\";\n\nexport class Value implements FilterFunction {\n readonly argTypes = [FunctionExpressionType.NodesType];\n readonly returnType = FunctionExpressionType.ValueType;\n\n public call(nodes: JSONPathNodeList): unknown {\n if (nodes.length === 1) return nodes.nodes[0].value;\n return Nothing;\n }\n}\n","import { JSONPathSyntaxError } from \"./errors\";\n\n/**\n *\n */\nexport enum TokenKind {\n AND = \"TOKEN_AND\",\n COLON = \"TOKEN_COLON\",\n COMMA = \"TOKEN_COMMA\",\n CURRENT = \"TOKEN_CURRENT_NODE\",\n DDOT = \"TOKEN_DDOT\",\n DOT = \"TOKEN_DOT\",\n DOUBLE_QUOTE_STRING = \"TOKEN_DOUBLE_QUOTE_STRING\",\n EOF = \"TOKEN_EOF\",\n EQ = \"TOKEN_EQ\",\n ERROR = \"TOKEN_ERROR\",\n FALSE = \"TOKEN_FALSE\",\n FILTER = \"TOKEN_FILTER_START\",\n FUNCTION = \"TOKEN_FUNCTION\",\n GE = \"TOKEN_GE\",\n GT = \"TOKEN_GT\",\n INDEX = \"TOKEN_INDEX\",\n LBRACKET = \"TOKEN_LBRACKET\",\n LE = \"TOKEN_LE\",\n LG = \"TOKEN_LG\",\n LPAREN = \"TOKEN_LPAREN\",\n LT = \"TOKEN_LT\",\n NAME = \"TOKEN_NAME\",\n NE = \"TOKEN_NE\",\n NOT = \"TOKEN_NOT\",\n NULL = \"TOKEN_NULL\",\n NUMBER = \"NUMBER\",\n OR = \"TOKEN_OR\",\n RBRACKET = \"TOKEN_RBRACKET\",\n ROOT = \"TOKEN_ROOT\",\n RPAREN = \"TOKEN_RPAREN\",\n SINGLE_QUOTE_STRING = \"TOKEN_SINGLE_QUOTE_STRING\",\n TRUE = \"TOKEN_TRUE\",\n WILD = \"TOKEN_WILD\",\n}\n\n/**\n *\n */\nexport class Token {\n constructor(\n readonly kind: TokenKind,\n readonly value: string,\n readonly index: number,\n readonly input: string,\n ) {}\n}\n\nexport const EOF = new Token(TokenKind.EOF, \"\", -1, \"\");\n\n/**\n *\n */\nexport class TokenStream {\n #pos: number = 0;\n\n constructor(private tokens: Token[]) {}\n\n public get current(): Token {\n return this.tokens[this.#pos];\n }\n\n public get peek(): Token {\n if (this.#pos >= this.tokens.length - 1)\n return this.tokens[this.tokens.length - 1];\n return this.tokens[this.#pos + 1];\n }\n\n public next(): Token {\n const current = this.current;\n this.#pos += 1;\n return current;\n }\n\n public backup(): void {\n if (this.#pos > 0) this.#pos -= 1;\n }\n\n public expect(kind: TokenKind): void {\n if (this.current.kind !== kind) {\n throw new JSONPathSyntaxError(\n `expected token '${kind}', found '${this.current.kind}'`,\n this.current,\n );\n }\n }\n\n public expectPeek(kind: TokenKind): void {\n const peeked = this.peek;\n if (peeked.kind !== kind) {\n throw new JSONPathSyntaxError(\n `expected token '${kind}', found '${peeked.kind}'`,\n peeked,\n );\n }\n }\n}\n","import { JSONPathLexerError, JSONPathSyntaxError } from \"./errors\";\nimport { Token, TokenKind } from \"./token\";\n\n// These regular expressions are to be used with Lexer.acceptMatchRun(),\n// which expects the sticky flag to be set.\nconst exponentPattern = /e[+-]\\d+/y;\nconst functionNamePattern = /[a-z][a-z_0-9]*/y;\nconst indexPattern = /-?\\d+/y;\nconst intPattern = /-?[0-9]+/y;\nconst namePattern = /[\\u0080-\\uFFFFa-zA-Z_][\\u0080-\\uFFFFa-zA-Z0-9_-]*/y;\nconst whitespace = new Set([\" \", \"\\n\", \"\\t\", \"\\r\"]);\n\n/**\n * JSONPath lexical scanner.\n *\n * Lexer state is shared between this class and the current state function. A\n * new _Lexer_ instance is automatically created every time a path is tokenized.\n *\n * Use {@link tokenize} to get an array of {@link Token}'s for a JSONPath query.\n */\nclass Lexer {\n /**\n * Filter nesting level.\n */\n public filterLevel: number = 0;\n\n /**\n * A running count of parentheses for each, possibly nested, function call.\n *\n * If the stack is empty, we are not in a function call. Remember that\n * function arguments can use arbitrarily nested in parentheses.\n */\n public parenStack: number[] = [];\n\n /** Tokens resulting from tokenizing a JSONPath query. */\n public tokens: Token[] = [];\n\n #start: number = 0;\n #pos: number = 0;\n\n /**\n * @param path - A JSONPath query.\n */\n constructor(readonly path: string) {}\n\n public get pos(): number {\n return this.#pos;\n }\n\n public get start(): number {\n return this.#start;\n }\n\n public run(): void {\n let state: StateFn | null = lexRoot;\n while (state) {\n state = state(this);\n }\n }\n\n public emit(t: TokenKind): void {\n this.tokens.push(\n new Token(\n t,\n this.path.slice(this.#start, this.#pos),\n this.#start,\n this.path,\n ),\n );\n this.#start = this.#pos;\n }\n\n public next(): string {\n if (this.#pos >= this.path.length) return \"\";\n const s = this.path[this.#pos];\n this.#pos += 1;\n return s;\n }\n\n public ignore(): void {\n this.#start = this.#pos;\n }\n\n public backup(): void {\n if (this.#pos <= this.#start) {\n const msg = \"can't backup beyond start\";\n throw new JSONPathLexerError(\n msg,\n new Token(TokenKind.ERROR, msg, this.#pos, this.path),\n );\n }\n this.#pos -= 1;\n }\n\n public peek(): string {\n const ch = this.next();\n if (ch) this.backup();\n return ch;\n }\n\n public accept(valid: Set<string>): boolean {\n const ch = this.next();\n if (valid.has(ch)) return true;\n if (ch) this.backup();\n return false;\n }\n\n public acceptMatch(pattern: RegExp): boolean {\n const ch = this.next();\n if (pattern.test(ch)) return true;\n if (ch) this.backup();\n return false;\n }\n\n public acceptRun(valid: Set<string>): boolean {\n let found = false;\n let ch = this.next();\n while (valid.has(ch)) {\n ch = this.next();\n found = true;\n }\n if (ch) this.backup();\n return found;\n }\n\n public acceptMatchRun(pattern: RegExp): boolean {\n pattern.lastIndex = this.#pos;\n const match = pattern.exec(this.path);\n pattern.lastIndex = 0;\n if (match) {\n this.#pos += match[0].length;\n return true;\n }\n return false;\n }\n\n public ignoreWhitespace(): boolean {\n if (this.#pos !== this.#start) {\n const msg = `must emit or ignore before consuming whitespace ('${this.path.slice(\n this.#start,\n this.#pos,\n )}':${this.pos})`;\n\n throw new JSONPathLexerError(\n msg,\n new Token(TokenKind.ERROR, msg, this.pos, this.path),\n );\n }\n if (this.acceptRun(whitespace)) {\n this.ignore();\n return true;\n }\n return false;\n }\n\n public error(msg: string): void {\n this.tokens.push(new Token(TokenKind.ERROR, msg, this.#pos, this.path));\n }\n}\n\ntype StateFn = (l: Lexer) => StateFn | null;\n\n/**\n * Return a lexer for _path_ and an array to be populated with Tokens.\n *\n * `lexer.run()` must be called to populate the returned tokens array.\n *\n * You probably want to use {@link tokenize} instead of _lex_. This function\n * is mostly for internal use, where we want to test the state of the returned\n * _lexer_ after tokens have been populated.\n *\n * @param path - A JSONPath query.\n * @returns A two-tuple containing a lexer for _path_ and an array to populate\n * with tokens.\n */\nexport function lex(path: string): [Lexer, Token[]] {\n const lexer = new Lexer(path);\n return [lexer, lexer.tokens];\n}\n\n/**\n * Scan _path_ and return an array of tokens to be parsed by the parser.\n * @param path - A JSONPath query.\n * @returns Tokens to be parsed by the parser.\n */\nexport function tokenize(path: string): Token[] {\n const [lexer, tokens] = lex(path);\n lexer.run();\n if (tokens.length && tokens[tokens.length - 1].kind === TokenKind.ERROR) {\n throw new JSONPathSyntaxError(\n tokens[tokens.length - 1].value,\n tokens[tokens.length - 1],\n );\n }\n return tokens;\n}\n\nfunction lexRoot(l: Lexer): StateFn | null {\n const ch = l.next();\n if (ch !== \"$\") {\n l.backup();\n l.error(`expected '$', found '${ch}'`);\n return null;\n }\n l.emit(TokenKind.ROOT);\n return lexSegment;\n}\n\nfunction lexSegment(l: Lexer): StateFn | null {\n if (l.ignoreWhitespace() && !l.peek()) {\n l.error(\"trailing whitespace\");\n }\n const ch = l.next();\n switch (ch) {\n case \"\":\n l.emit(TokenKind.EOF);\n return null;\n case \".\":\n if (l.peek() === \".\") {\n l.next();\n l.emit(TokenKind.DDOT);\n return lexDescendantSelection;\n }\n return lexDotSelector;\n case \"[\":\n l.emit(TokenKind.LBRACKET);\n return lexInsideBracketedSelection;\n default:\n l.backup();\n if (l.filterLevel) return lexInsideFilter;\n l.error(`expected '.', '..' or a bracketed selection, found '${ch}'`);\n return null;\n }\n}\n\n/**\n * Similar to _lexSegment_, but ..\n * - no leading whitespace\n * - no extra dot before a property name\n * - there must be a selector, so EOF would be an error\n * @param l -\n * @returns -\n */\nfunction lexDescendantSelection(l: Lexer): StateFn | null {\n const ch = l.next();\n switch (ch) {\n case \"\":\n l.error(\"bald descendant segment\");\n return null;\n case \"*\":\n l.emit(TokenKind.WILD);\n return lexSegment;\n case \"[\":\n l.emit(TokenKind.LBRACKET);\n return lexInsideBracketedSelection;\n default:\n l.backup();\n if (l.acceptMatchRun(namePattern)) {\n l.emit(TokenKind.NAME);\n return lexSegment;\n } else {\n l.error(`unexpected descendent selection token '${ch}'`);\n return null;\n }\n }\n}\n\nfunction lexDotSelector(l: Lexer): StateFn | null {\n l.ignore();\n\n if (l.ignoreWhitespace()) {\n l.error(\"unexpected whitespace after dot\");\n return null;\n }\n\n const ch = l.next();\n if (ch === \"*\") {\n l.emit(TokenKind.WILD);\n return lexSegment;\n }\n\n l.backup();\n if (l.acceptMatchRun(namePattern)) {\n l.emit(TokenKind.NAME);\n return lexSegment;\n } else {\n l.error(`unexpected shorthand selector '${ch}'`);\n return null;\n }\n}\n\nfunction lexInsideBracketedSelection(l: Lexer): StateFn | null {\n for (;;) {\n l.ignoreWhitespace();\n const ch = l.next();\n switch (ch) {\n case \"]\":\n l.emit(TokenKind.RBRACKET);\n if (l.filterLevel) return lexInsideFilter;\n return lexSegment;\n case \"\":\n l.error(\"unclosed bracketed selection\");\n return null;\n case \"*\":\n l.emit(TokenKind.WILD);\n continue;\n case \"?\":\n l.emit(TokenKind.FILTER);\n l.filterLevel += 1;\n return lexInsideFilter;\n case \",\":\n l.emit(TokenKind.COMMA);\n continue;\n case \":\":\n l.emit(TokenKind.COLON);\n continue;\n case \"'\":\n return lexSingleQuoteStringInsideBracketSelection;\n case '\"':\n return lexDoubleQuoteStringInsideBracketSelection;\n default:\n l.backup();\n\n if (l.acceptMatchRun(indexPattern)) {\n l.emit(TokenKind.INDEX);\n continue;\n }\n\n l.error(`unexpected token '${ch}' in bracketed selection`);\n return null;\n }\n }\n}\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nfunction lexInsideFilter(l: Lexer): StateFn | null {\n for (;;) {\n l.ignoreWhitespace();\n const ch = l.next();\n switch (ch) {\n case \"\":\n case \"]\":\n l.filterLevel -= 1;\n l.backup();\n return lexInsideBracketedSelection;\n case \",\":\n l.emit(TokenKind.COMMA);\n // If we have unbalanced parens, we are inside a function call and a\n // comma separates arguments. Otherwise a comma separates selectors.\n if (l.parenStack.length) continue;\n l.filterLevel -= 1;\n return lexInsideBracketedSelection;\n case \"'\":\n return lexSingleQuoteStringInsideFilterExpression;\n case '\"':\n return lexDoubleQuoteStringInsideFilterExpression;\n case \"(\":\n l.emit(TokenKind.LPAREN);\n // Are we in a function call? If so, a function argument contains parens.\n if (l.parenStack.length) l.parenStack[l.parenStack.length - 1] += 1;\n continue;\n case \")\":\n l.emit(TokenKind.RPAREN);\n // Are we closing a function call or a parenthesized expression?\n if (l.parenStack.length) {\n if (l.parenStack[l.parenStack.length - 1] === 1) {\n l.parenStack.pop();\n } else {\n l.parenStack[l.parenStack.length - 1] -= 1;\n }\n }\n continue;\n case \"$\":\n l.emit(TokenKind.ROOT);\n return lexSegment;\n case \"@\":\n l.emit(TokenKind.CURRENT);\n return lexSegment;\n case \".\":\n l.backup();\n return lexSegment;\n case \"!\":\n if (l.peek() === \"=\") {\n l.next();\n l.emit(TokenKind.NE);\n } else {\n l.emit(TokenKind.NOT);\n }\n continue;\n case \"=\":\n if (l.peek() === \"=\") {\n l.next();\n l.emit(TokenKind.EQ);\n continue;\n } else {\n l.backup();\n l.error(`unexpected filter selector token '${ch}'`);\n return null;\n }\n case \"<\":\n if (l.peek() === \"=\") {\n l.next();\n l.emit(TokenKind.LE);\n } else {\n l.emit(TokenKind.LT);\n }\n continue;\n case \">\":\n if (l.peek() === \"=\") {\n l.next();\n l.emit(TokenKind.GE);\n } else {\n l.emit(TokenKind.GT);\n }\n continue;\n default:\n l.backup();\n\n // numbers\n if (l.acceptMatchRun(intPattern)) {\n if (l.peek() === \".\") {\n // A float.\n l.next();\n if (!l.acceptMatchRun(intPattern)) {\n // Need at least one digit after a decimal place.\n l.error(\"a fractional digit is required after a decimal point\");\n return null;\n }\n }\n l.acceptMatchRun(exponentPattern);\n l.emit(TokenKind.NUMBER);\n continue;\n }\n\n if (l.acceptMatchRun(/&&/y)) {\n l.emit(TokenKind.AND);\n continue;\n }\n\n if (l.acceptMatchRun(/\\|\\|/y)) {\n l.emit(TokenKind.OR);\n continue;\n }\n\n if (l.acceptMatchRun(/true/y)) {\n l.emit(TokenKind.TRUE);\n continue;\n }\n if (l.acceptMatchRun(/false/y)) {\n l.emit(TokenKind.FALSE);\n continue;\n }\n\n if (l.acceptMatchRun(/null/y)) {\n l.emit(TokenKind.NULL);\n continue;\n }\n\n // functions\n if (l.acceptMatchRun(functionNamePattern) && l.peek() === \"(\") {\n // Keep track of parentheses for this function call.\n l.parenStack.push(1);\n l.emit(TokenKind.FUNCTION);\n l.next();\n l.ignore();\n continue;\n }\n }\n\n l.error(`unexpected filter selector token '${ch}'`);\n return null;\n }\n}\n\n/**\n * Return a state function tokenizing string literals using _quote_ and\n * returning control to _state_.\n * @param quote - One of `'` or `\"`.\n * @param state - The state function to return control to.\n * @returns String tokenizing state function.\n */\nfunction makeLexString(quote: string, state: StateFn): StateFn {\n // eslint-disable-next-line sonarjs/cognitive-complexity\n function _lexString(l: Lexer): StateFn | null {\n l.ignore();\n\n if (l.peek() === quote) {\n // empty string\n l.emit(\n quote === \"'\"\n ? TokenKind.SINGLE_QUOTE_STRING\n : TokenKind.DOUBLE_QUOTE_STRING,\n );\n l.next();\n l.ignore();\n return state;\n }\n\n for (;;) {\n const la = l.path.slice(l.pos, l.pos + 2);\n const ch = l.next();\n if (la === \"\\\\\\\\\" || la === `\\\\${quote}`) {\n l.next();\n continue;\n } else if (ch === \"\\\\\" && !la.match(/\\\\[bfnrtu/]/)) {\n l.error(`invalid escape`);\n return null;\n }\n\n if (!ch) {\n l.error(`unclosed string starting at index ${l.start}`);\n return null;\n }\n\n if (ch === quote) {\n l.backup();\n l.emit(\n quote === \"'\"\n ? TokenKind.SINGLE_QUOTE_STRING\n : TokenKind.DOUBLE_QUOTE_STRING,\n );\n l.next();\n l.ignore();\n return state;\n }\n }\n }\n return _lexString;\n}\n\nconst lexSingleQuoteStringInsideBracketSelection = makeLexString(\n \"'\",\n lexInsideBracketedSelection,\n);\n\nconst lexDoubleQuoteStringInsideBracketSelection = makeLexString(\n '\"',\n lexInsideBracketedSelection,\n);\n\nconst lexSingleQuoteStringInsideFilterExpression = makeLexString(\n \"'\",\n lexInsideFilter,\n);\n\nconst lexDoubleQuoteStringInsideFilterExpression = makeLexString(\n '\"',\n lexInsideFilter,\n);\n","import { JSONPathEnvironment } from \"./environment\";\nimport { JSONPathIndexError } from \"./errors\";\nimport { LogicalExpression } from \"./expression\";\nimport { JSONPathNode, JSONPathNodeList } from \"./node\";\nimport { Token } from \"./token\";\nimport { FilterContext, hasStringKey } from \"./types\";\nimport { isArray, isObject, JSONValue } from \"../types\";\n\n/**\n * Base class for all JSONPath segments and selectors.\n */\nexport abstract class JSONPathSelector {\n /**\n * @param token - The token at the start of this selector.\n */\n constructor(\n readonly environment: JSONPathEnvironment,\n readonly token: Token,\n ) {}\n\n /**\n * @param nodes - Nodes matched by preceding selectors.\n */\n public abstract resolve(nodes: JSONPathNodeList): JSONPathNodeList;\n\n /**\n * Return a canonical string representation of this selector.\n */\n public abstract toString(): string;\n}\n\n/**\n * Shorthand and quoted name selector.\n */\nexport class NameSelector extends JSONPathSelector {\n constructor(\n readonly environment: JSONPathEnvironment,\n readonly token: Token,\n readonly name: string,\n readonly shorthand: boolean,\n ) {\n super(environment, token);\n }\n\n public resolve(nodes: JSONPathNodeList): JSONPathNodeList {\n const rv: JSONPathNode[] = [];\n for (const node of nodes) {\n if (hasStringKey(node.value, this.name)) {\n rv.push(\n new JSONPathNode(\n node.value[this.name],\n node.location.concat(this.name),\n node.root,\n ),\n );\n }\n }\n return new JSONPathNodeList(rv);\n }\n\n public toString(): string {\n return this.shorthand ? `['${this.name}']` : `'${this.name}'`;\n }\n}\n\n/**\n * Array index selector.\n */\nexport class IndexSelector extends JSONPathSelector {\n constructor(\n readonly environment: JSONPathEnvironment,\n readonly token: Token,\n readonly index: number,\n ) {\n super(environment, token);\n if (\n index < this.environment.options.minIntIndex ||\n index > this.environment.options.maxIntIndex\n ) {\n throw new JSONPathIndexError(\"index out of range\", this.token);\n }\n }\n\n public resolve(nodes: JSONPathNodeList): JSONPathNodeList {\n const rv: JSONPathNode[] = [];\n for (const node of nodes) {\n if (isArray(node.value)) {\n const normIndex = this.normalizedIndex(node.value.length);\n if (normIndex in node.value) {\n rv.push(\n new JSONPathNode(\n node.value[normIndex],\n node.location.concat(normIndex),\n node.root,\n ),\n );\n }\n }\n }\n return new JSONPathNodeList(rv);\n }\n\n public toString(): string {\n return String(this.index);\n }\n\n private normalizedIndex(length: number): number {\n if (this.index < 0 && length >= Math.abs(this.index))\n return length + this.index;\n return this.index;\n }\n}\n\nexport class SliceSelector extends JSONPathSelector {\n constructor(\n readonly environment: JSONPathEnvironment,\n readonly token: Token,\n readonly start?: number,\n readonly stop?: number,\n readonly step?: number,\n ) {\n super(environment, token);\n this.checkRange(start, stop, step);\n }\n\n public resolve(nodes: JSONPathNodeList): JSONPathNodeList {\n const rv: JSONPathNode[] = [];\n for (const node of nodes) {\n if (!isArray(node.value)) continue;\n\n for (const [i, value] of this.slice(\n node.value,\n this.start,\n this.stop,\n this.step,\n )) {\n rv.push(new JSONPathNode(value, node.location.concat(i), node.root));\n }\n }\n return new JSONPathNodeList(rv);\n }\n\n public toString(): string {\n const start = this.start ? this.start : \"\";\n const stop = this.stop ? this.stop : \"\";\n const step = this.step ? this.step : \"1\";\n return `${start}:${stop}:${step}`;\n }\n\n private checkRange(...indices: Array<number | undefined>): void {\n for (const index of indices) {\n if (\n index !== undefined &&\n (index < this.environment.options.minIntIndex ||\n index > this.environment.options.maxIntIndex)\n ) {\n throw new JSONPathIndexError(\"index out of range\", this.token);\n }\n }\n }\n\n private normalizedIndex(length: number, index: number): number {\n if (index < 0 && length >= Math.abs(index))\n return Math.min(length + index, length - 1);\n return Math.min(index, length - 1);\n }\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n private slice(\n arr: JSONValue[],\n start?: number,\n stop?: number,\n step?: number,\n ): Array<[number, JSONValue]> {\n if (!arr.length) return [];\n\n // Handle negative start and stop values\n if (start === undefined || start === null) {\n start = step && step < 0 ? arr.length - 1 : 0;\n } else if (start < 0) {\n start = Math.max(arr.length + start, 0);\n } else {\n start = Math.min(start, arr.length - 1);\n }\n\n if (stop === undefined || stop === null) {\n stop = step && step < 0 ? -1 : arr.length;\n } else if (stop < 0) {\n stop = Math.max(arr.length + stop, -1);\n } else {\n stop = Math.min(stop, arr.length);\n }\n\n // Handle step value\n if (step === 0) {\n return [];\n }\n if (!step) {\n step = 1;\n }\n\n // Perform the slice\n const slicedArray: Array<[number, JSONValue]> = [];\n if (step > 0) {\n for (let i = start; i < stop; i += step) {\n slicedArray.push([i, arr[i]]);\n }\n } else {\n for (let i = start; i > stop; i += step) {\n slicedArray.push([i, arr[i]]);\n }\n }\n\n return slicedArray;\n }\n}\n\nexport class WildcardSelector extends JSONPathSelector {\n constructor(\n readonly environment: JSONPathEnvironment,\n readonly token: Token,\n readonly shorthand: boolean = false,\n ) {\n super(environment, token);\n }\n\n public resolve(nodes: JSONPathNodeList): JSONPathNodeList {\n const rv: JSONPathNode[] = [];\n for (const node of nodes) {\n if (node.value instanceof String) continue;\n if (isArray(node.value)) {\n for (let i = 0; i < node.value.length; i++) {\n rv.push(\n new JSONPathNode(node.value[i], node.location.concat(i), node.root),\n );\n }\n } else if (isObject(node.value)) {\n for (const [key, value] of Object.entries(node.value)) {\n rv.push(\n new JSONPathNode(value, node.location.concat(key), node.root),\n );\n }\n }\n }\n return new JSONPathNodeList(rv);\n }\n\n public toString(): string {\n return this.shorthand ? \"[*]\" : \"*\";\n }\n}\n\nexport class RecursiveDescentSegment extends JSONPathSelector {\n public resolve(nodes: JSONPathNodeList): JSONPathNodeList {\n const rv: JSONPathNode[] = [];\n for (const node of nodes) {\n rv.push(node, ...this.visit(node));\n }\n return new JSONPathNodeList(rv);\n }\n\n public toString(): string {\n return \"..\";\n }\n\n private visit(node: JSONPathNode): JSONPathNodeList {\n const rv: JSONPathNode[] = [];\n if (node.value instanceof String) return new JSONPathNodeList(rv);\n if (isArray(node.value)) {\n for (let i = 0; i < node.value.length; i++) {\n const _node = new JSONPathNode(\n node.value[i],\n node.location.concat(i),\n node.root,\n );\n rv.push(_node, ...this.visit(_node));\n }\n } else if (isObject(node.value)) {\n for (const [key, value] of Object.entries(node.value)) {\n const _node = new JSONPathNode(\n value,\n node.location.concat(key),\n node.root,\n );\n rv.push(_node, ...this.visit(_node));\n }\n }\n return new JSONPathNodeList(rv);\n }\n}\n\nexport class FilterSelector extends JSONPathSelector {\n constructor(\n readonly environment: JSONPathEnvironment,\n readonly token: Token,\n readonly expression: LogicalExpression,\n ) {\n super(environment, token);\n }\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n public resolve(nodes: JSONPathNodeList): JSONPathNodeList {\n const rv: JSONPathNode[] = [];\n for (const node of nodes) {\n if (node.value instanceof String) continue;\n if (isArray(node.value)) {\n for (let i = 0; i < node.value.length; i++) {\n const value = node.value[i];\n const filterContext: FilterContext = {\n environment: this.environment,\n currentValue: value,\n rootValue: node.root,\n };\n if (this.expression.evaluate(filterContext)) {\n rv.push(\n new JSONPathNode(value, node.location.concat(i), node.root),\n );\n }\n }\n } else if (isObject(node.value)) {\n for (const [key, value] of Object.entries(node.value)) {\n const filterContext: FilterContext = {\n environment: this.environment,\n currentValue: value,\n rootValue: node.root,\n };\n if (this.expression.evaluate(filterContext)) {\n rv.push(\n new JSONPathNode(value, node.location.concat(key), node.root),\n );\n }\n }\n }\n }\n return new JSONPathNodeList(rv);\n }\n\n public toString(): string {\n return `?${this.expression.toString()}`;\n }\n}\n\nexport type BracketedSegment =\n | FilterSelector\n | IndexSelector\n | NameSelector\n | SliceSelector\n | WildcardSelector;\n\nexport class BracketedSelection extends JSONPathSelector {\n constructor(\n readonly environment: JSONPathEnvironment,\n readonly token: Token,\n readonly items: BracketedSegment[],\n ) {\n super(environment, token);\n }\n\n public resolve(nodes: JSONPathNodeList): JSONPathNodeList {\n const rv: JSONPathNode[] = [];\n for (const node of nodes) {\n for (const item of this.items) {\n rv.push(...item.resolve(new JSONPathNodeList([node])));\n }\n }\n\n return new JSONPathNodeList(rv);\n }\n\n public toString(): string {\n return `[${this.items.map((itm) => itm.toString()).join(\", \")}]`;\n }\n}\n","import { JSONPathEnvironment } from \"./environment\";\nimport { JSONPathNode, JSONPathNodeList } from \"./node\";\nimport {\n BracketedSelection,\n IndexSelector,\n JSONPathSelector,\n NameSelector,\n} from \"./selectors\";\nimport { JSONValue } from \"../types\";\n\n/**\n *\n */\nexport class JSONPath {\n /**\n *\n * @param environment -\n * @param selectors -\n */\n constructor(\n readonly environment: JSONPathEnvironment,\n readonly selectors: JSONPathSelector[],\n ) {}\n\n /**\n *\n * @param value -\n * @returns\n */\n public query(value: JSONValue): JSONPathNodeList {\n let nodes = new JSONPathNodeList([new JSONPathNode(value, [], value)]);\n for (const selector of this.selectors) {\n nodes = selector.resolve(nodes);\n }\n return nodes;\n }\n\n /**\n *\n */\n public toString(): string {\n return `$${this.selectors.map((s) => s.toString()).join(\"\")}`;\n }\n\n public singularQuery(): boolean {\n for (const selector of this.selectors) {\n if (selector instanceof NameSelector) continue;\n if (\n selector instanceof BracketedSelection &&\n selector.items.length === 1 &&\n (selector.items[0] instanceof NameSelector ||\n selector.items[0] instanceof IndexSelector)\n )\n continue;\n return false;\n }\n return true;\n }\n}\n","import { JSONPathEnvironment } from \"./environment\";\nimport { JSONPathSyntaxError, JSONPathTypeError } from \"./errors\";\nimport {\n BooleanLiteral,\n FilterExpression,\n FunctionExtension,\n InfixExpression,\n LogicalExpression,\n NullLiteral,\n NumberLiteral,\n PrefixExpression,\n RelativeQuery,\n RootQuery,\n StringLiteral,\n} from \"./expression\";\nimport { FunctionExpressionType } from \"./functions/function\";\nimport { JSONPath } from \"./path\";\nimport {\n BracketedSelection,\n BracketedSegment,\n FilterSelector,\n IndexSelector,\n JSONPathSelector,\n NameSelector,\n RecursiveDescentSegment,\n SliceSelector,\n WildcardSelector,\n} from \"./selectors\";\nimport { Token, TokenKind, TokenStream } from \"./token\";\n\nconst PRECEDENCE_LOWEST = 1;\nconst PRECEDENCE_LOGICALRIGHT = 3;\nconst PRECEDENCE_LOGICAL_AND = 4;\nconst PRECEDENCE_LOGICAL_OR = 5;\nconst PRECEDENCE_COMPARISON = 6;\n\nconst PRECEDENCES: Map<TokenKind, number> = new Map([\n [TokenKind.AND, PRECEDENCE_LOGICAL_AND],\n [TokenKind.EQ, PRECEDENCE_COMPARISON],\n [TokenKind.GE, PRECEDENCE_COMPARISON],\n [TokenKind.GT, PRECEDENCE_COMPARISON],\n [TokenKind.LE, PRECEDENCE_COMPARISON],\n [TokenKind.LT, PRECEDENCE_COMPARISON],\n [TokenKind.NE, PRECEDENCE_COMPARISON],\n [TokenKind.NOT, PRECEDENCE_LOGICALRIGHT],\n [TokenKind.OR, PRECEDENCE_LOGICAL_OR],\n [TokenKind.RPAREN, PRECEDENCE_LOWEST],\n]);\n\nconst BINARY_OPERATORS: Map<TokenKind, string> = new Map([\n [TokenKind.AND, \"&&\"],\n [TokenKind.EQ, \"==\"],\n [TokenKind.GE, \">=\"],\n [TokenKind.GT, \">\"],\n [TokenKind.LE, \"<=\"],\n [TokenKind.LT, \"<\"],\n [TokenKind.NE, \"!=\"],\n [TokenKind.OR, \"||\"],\n]);\n\nconst COMPARISON_OPERATORS = new Set([\"==\", \">=\", \">\", \"<=\", \"<\", \"!=\"]);\n\nexport class Parser {\n protected tokenMap: Map<string, (stream: TokenStream) => FilterExpression>;\n\n constructor(readonly environment: JSONPathEnvironment) {\n this.tokenMap = new Map([\n [TokenKind.FALSE, this.parseBoolean],\n [TokenKind.NUMBER, this.parseNumber],\n [TokenKind.LPAREN, this.parseGroupedExpression],\n [TokenKind.NOT, this.parsePrefixExpression],\n [TokenKind.NULL, this.parseNull],\n [TokenKind.ROOT, this.parseRootQuery],\n [TokenKind.CURRENT, this.parseRelativeQuery],\n [TokenKind.SINGLE_QUOTE_STRING, this.parseString],\n [TokenKind.DOUBLE_QUOTE_STRING, this.parseString],\n [TokenKind.TRUE, this.parseBoolean],\n [TokenKind.FUNCTION, this.parseFunction],\n ]);\n }\n\n public parse(stream: TokenStream): JSONPathSelector[] {\n if (stream.current.kind === TokenKind.ROOT) stream.next();\n const selectors = this.parsePath(stream);\n if (stream.current.kind !== TokenKind.EOF) {\n throw new JSONPathSyntaxError(\n `unexpected token '${stream.current.kind}'`,\n stream.current,\n );\n }\n return selectors;\n }\n\n protected parsePath(\n stream: TokenStream,\n inFilter: boolean = false,\n ): JSONPathSelector[] {\n const selectors: JSONPathSelector[] = [];\n loop: for (;;) {\n switch (stream.current.kind) {\n case TokenKind.NAME:\n selectors.push(\n new NameSelector(\n this.environment,\n stream.current,\n stream.current.value,\n true,\n ),\n );\n break;\n case TokenKind.WILD:\n selectors.push(\n new WildcardSelector(this.environment, stream.current, true),\n );\n break;\n case TokenKind.DDOT:\n selectors.push(\n new RecursiveDescentSegment(this.environment, stream.current),\n );\n break;\n case TokenKind.LBRACKET:\n selectors.push(this.parseBracketedSelection(stream));\n break;\n default:\n if (inFilter) {\n stream.backup();\n }\n break loop;\n }\n stream.next();\n }\n return selectors;\n }\n\n protected parseIndex(stream: TokenStream): IndexSelector {\n if (\n (stream.current.value.length > 1 &&\n stream.current.value.startsWith(\"0\")) ||\n stream.current.value.startsWith(\"-0\")\n ) {\n throw new JSONPathSyntaxError(\n \"leading zero in index selector\",\n stream.current,\n );\n }\n\n return new IndexSelector(\n this.environment,\n stream.current,\n Number(stream.current.value),\n );\n }\n\n protected parseSlice(stream: TokenStream): SliceSelector {\n const tok = stream.current;\n const indices: Array<number | undefined> = [];\n\n function maybeIndex(token: Token): boolean {\n if (token.kind === TokenKind.INDEX) {\n if (\n (token.value.length > 1 && token.value.startsWith(\"0\")) ||\n token.value.startsWith(\"-0\")\n ) {\n throw new JSONPathSyntaxError(\n \"leading zero in index selector\",\n token,\n );\n }\n return true;\n }\n return false;\n }\n\n // 1: or :\n if (maybeIndex(stream.current)) {\n indices.push(Number(stream.current.value));\n stream.next();\n stream.expect(TokenKind.COLON);\n stream.next();\n } else {\n indices.push(undefined);\n stream.expect(TokenKind.COLON);\n stream.next();\n }\n\n // 1 or 1: or : or ?\n if (maybeIndex(stream.current)) {\n indices.push(Number(stream.current.value));\n stream.next();\n if (stream.current.kind === TokenKind.COLON) {\n stream.next();\n }\n } else if (stream.current.kind === TokenKind.COLON) {\n indices.push(undefined);\n stream.expect(TokenKind.COLON);\n stream.next();\n }\n\n // 1 or ?\n if (maybeIndex(stream.current)) {\n indices.push(Number(stream.current.value));\n stream.next();\n }\n\n stream.backup();\n return new SliceSelector(this.environment, tok, ...indices);\n }\n\n protected parseBracketedSelection(stream: TokenStream): BracketedSelection {\n const token = stream.next();\n const items: BracketedSegment[] = [];\n\n while (stream.current.kind !== TokenKind.RBRACKET) {\n switch (stream.current.kind) {\n case TokenKind.SINGLE_QUOTE_STRING:\n case TokenKind.DOUBLE_QUOTE_STRING:\n items.push(\n new NameSelector(\n this.environment,\n stream.current,\n this.decodeString(stream.current, true),\n false,\n ),\n );\n break;\n case TokenKind.FILTER:\n items.push(this.parseFilter(stream));\n break;\n case TokenKind.INDEX:\n if (stream.peek.kind === TokenKind.COLON) {\n items.push(this.parseSlice(stream));\n } else {\n items.push(this.parseIndex(stream));\n }\n break;\n case TokenKind.COLON:\n items.push(this.parseSlice(stream));\n break;\n case TokenKind.WILD:\n items.push(new WildcardSelector(this.environment, stream.current));\n break;\n case TokenKind.EOF:\n throw new JSONPathSyntaxError(\n \"unexpected end of query\",\n stream.current,\n );\n default:\n throw new JSONPathSyntaxError(\n `unexpected token in bracketed selection '${stream.current.kind}'`,\n stream.current,\n );\n }\n\n if (stream.peek.kind !== TokenKind.RBRACKET) {\n stream.expectPeek(TokenKind.COMMA);\n stream.next();\n }\n\n stream.next();\n }\n\n if (!items.length) {\n throw new JSONPathSyntaxError(\"empty bracketed segment\", token);\n }\n\n return new BracketedSelection(this.environment, token, items);\n }\n\n protected parseFilter(stream: TokenStream): FilterSelector {\n const tok = stream.next();\n const expr = this.parseFilterExpression(stream);\n if (expr instanceof FunctionExtension) {\n const func = this.environment.filterRegister.get(expr.name);\n if (func && func.returnType === FunctionExpressionType.ValueType) {\n throw new JSONPathTypeError(\n `result of ${expr.name}() must be compared`,\n expr.token,\n );\n }\n }\n return new FilterSelector(\n this.environment,\n tok,\n new LogicalExpression(tok, expr),\n );\n }\n\n protected parseBoolean(stream: TokenStream): BooleanLiteral {\n if (stream.current.kind === TokenKind.FALSE)\n return new BooleanLiteral(stream.current, false);\n return new BooleanLiteral(stream.current, true);\n }\n\n protected parseNull(stream: TokenStream): NullLiteral {\n return new NullLiteral(stream.current);\n }\n\n protected parseString(stream: TokenStream): StringLiteral {\n return new StringLiteral(stream.current, this.decodeString(stream.current));\n }\n\n protected parseNumber(stream: TokenStream): NumberLiteral {\n return new NumberLiteral(stream.current, Number(stream.current.value));\n }\n\n protected parsePrefixExpression(stream: TokenStream): PrefixExpression {\n stream.expect(TokenKind.NOT);\n stream.next();\n return new PrefixExpression(\n stream.current,\n \"!\",\n this.parseFilterExpression(stream, PRECEDENCE_LOGICALRIGHT),\n );\n }\n\n protected parseInfixExpression(\n stream: TokenStream,\n left: FilterExpression,\n ): InfixExpression {\n const tok = stream.next();\n const precedence = PRECEDENCES.get(tok.kind) || PRECEDENCE_LOWEST;\n const right = this.parseFilterExpression(stream, precedence);\n const operator = BINARY_OPERATORS.get(tok.kind);\n\n if (!operator) {\n throw new JSONPathSyntaxError(`unknown operator '${tok.kind}'`, tok);\n }\n\n this.throwForNonSingularQuery(left);\n this.throwForNonSingularQuery(right);\n if (COMPARISON_OPERATORS.has(operator)) {\n this.throwForNonComparableFunction(left);\n this.throwForNonComparableFunction(right);\n }\n return new InfixExpression(tok, left, operator, right);\n }\n\n protected parseGroupedExpression(stream: TokenStream): FilterExpression {\n stream.next();\n let expr = this.parseFilterExpression(stream);\n stream.next();\n\n while (stream.current.kind !== TokenKind.RPAREN) {\n if (stream.current.kind === TokenKind.EOF) {\n throw new JSONPathSyntaxError(\"unbalanced parentheses\", stream.current);\n }\n expr = this.parseInfixExpression(stream, expr);\n }\n\n stream.expect(TokenKind.RPAREN);\n return expr;\n }\n\n protected parseRootQuery(stream: TokenStream): RootQuery {\n const tok = stream.next();\n return new RootQuery(\n tok,\n new JSONPath(this.environment, this.parsePath(stream, true)),\n );\n }\n\n protected parseRelativeQuery(stream: TokenStream): RelativeQuery {\n const tok = stream.next();\n return new RelativeQuery(\n tok,\n new JSONPath(this.environment, this.parsePath(stream, true)),\n );\n }\n\n protected parseFunction(stream: TokenStream): FunctionExtension {\n const args: FilterExpression[] = [];\n const tok = stream.next();\n\n while (stream.current.kind !== TokenKind.RPAREN) {\n const func = this.tokenMap.get(stream.current.kind);\n if (!func) {\n throw new JSONPathSyntaxError(\n `unexpected '${stream.current.value}'`,\n stream.current,\n );\n }\n\n args.push(func.bind(this)(stream));\n\n if (stream.peek.kind !== TokenKind.RPAREN) {\n if (stream.peek.kind === TokenKind.RBRACKET) break;\n stream.expectPeek(TokenKind.COMMA);\n stream.next();\n }\n\n stream.next();\n }\n\n return new FunctionExtension(\n tok,\n tok.value,\n this.environment.checkWellTypedness(tok, args),\n );\n }\n\n protected parseFilterExpression(\n stream: TokenStream,\n precedence: number = PRECEDENCE_LOWEST,\n ): FilterExpression {\n const func = this.tokenMap.get(stream.current.kind);\n if (!func) {\n let msg: string;\n switch (stream.current.kind) {\n case TokenKind.EOF:\n case TokenKind.RBRACKET:\n msg = \"end of expression\";\n break;\n default:\n msg = `'${stream.current.value}`;\n }\n throw new JSONPathSyntaxError(`unexpected ${msg}`, stream.current);\n }\n\n let left = func.bind(this)(stream);\n\n for (;;) {\n const peekKind = stream.peek.kind;\n if (\n peekKind === TokenKind.EOF ||\n peekKind === TokenKind.RBRACKET ||\n (PRECEDENCES.get(peekKind) || PRECEDENCE_LOWEST) < precedence\n ) {\n break;\n }\n\n if (!BINARY_OPERATORS.has(peekKind)) return left;\n stream.next();\n left = this.parseInfixExpression(stream, left);\n }\n\n return left;\n }\n\n protected decodeString(token: Token, isName: boolean = false): string {\n try {\n return JSON.parse(\n token.kind === TokenKind.SINGLE_QUOTE_STRING\n ? `\"${token.value.replaceAll('\"', '\\\\\"').replaceAll(\"\\\\'\", \"'\")}\"`\n : `\"${token.value}\"`,\n );\n } catch {\n throw new JSONPathSyntaxError(\n `invalid ${isName ? \"name selector\" : \"string literal\"} '${\n token.value\n }'`,\n token,\n );\n }\n }\n\n protected throwForNonSingularQuery(expr: FilterExpression): void {\n if (\n (expr instanceof RootQuery || expr instanceof RelativeQuery) &&\n !expr.path.singularQuery()\n ) {\n throw new JSONPathSyntaxError(\n \"non-singular query is not comparable\",\n expr.token,\n );\n }\n }\n\n protected throwForNonComparableFunction(expr: FilterExpression): void {\n if (!(expr instanceof FunctionExtension)) return;\n const func = this.environment.filterRegister.get(expr.name);\n if (func && func.returnType !== FunctionExpressionType.ValueType) {\n throw new JSONPathTypeError(\n `result of ${expr.name}() is not comparable`,\n expr.token,\n );\n }\n }\n}\n","import { JSONPathTypeError, UndefinedFilterFunctionError } from \"./errors\";\nimport {\n BooleanLiteral,\n FilterExpression,\n FilterExpressionLiteral,\n JSONPathQuery,\n} from \"./expression\";\nimport { Count as CountFilterFunction } from \"./functions/count\";\nimport { FilterFunction, FunctionExpressionType } from \"./functions/function\";\nimport { Length as LengthFilterFunction } from \"./functions/length\";\nimport { Match as MatchFilterFunction } from \"./functions/match\";\nimport { Search as SearchFilterFunction } from \"./functions/search\";\nimport { Value as ValueFilterFunction } from \"./functions/value\";\nimport { tokenize } from \"./lex\";\nimport { JSONPathNodeList } from \"./node\";\nimport { Parser } from \"./parse\";\nimport { JSONPath } from \"./path\";\nimport { Token, TokenStream } from \"./token\";\nimport { JSONValue } from \"../types\";\n\n/**\n *\n */\nexport type JSONPathEnvironmentOptions = {\n /**\n *\n */\n strict: boolean;\n\n /**\n *\n */\n maxIntIndex: number;\n\n /**\n *\n */\n minIntIndex: number;\n};\n\nexport const defaultOptions: JSONPathEnvironmentOptions = {\n strict: true,\n maxIntIndex: Math.pow(2, 53) - 1,\n minIntIndex: -Math.pow(2, 53) - 1,\n};\n\n/**\n *\n */\nexport class JSONPathEnvironment {\n /**\n *\n */\n public filterRegister: Map<string, FilterFunction> = new Map();\n\n private parser: Parser;\n\n /**\n *\n * @param options -\n */\n constructor(readonly options: JSONPathEnvironmentOptions = defaultOptions) {\n this.parser = new Parser(this);\n this.setupFilterFunctions();\n }\n\n /**\n *\n * @param path -\n * @returns\n */\n public compile(path: string): JSONPath {\n return new JSONPath(\n this,\n this.parser.parse(new TokenStream(tokenize(path))),\n );\n }\n\n /**\n *\n * @param path -\n * @param value -\n * @returns\n */\n public query(path: string, value: JSONValue): JSONPathNodeList {\n return this.compile(path).query(value);\n }\n\n protected setupFilterFunctions(): void {\n this.filterRegister.set(\"count\", new CountFilterFunction());\n this.filterRegister.set(\"length\", new LengthFilterFunction());\n this.filterRegister.set(\"search\", new SearchFilterFunction());\n this.filterRegister.set(\"match\", new MatchFilterFunction());\n this.filterRegister.set(\"value\", new ValueFilterFunction());\n }\n\n /**\n *\n * @param token -\n * @param args -\n */\n // eslint-disable-next-line sonarjs/cognitive-complexity\n public checkWellTypedness(\n token: Token,\n args: FilterExpression[],\n ): FilterExpression[] {\n const func = this.filterRegister.get(token.value);\n if (!func) {\n throw new UndefinedFilterFunctionError(\n `no such function '${token.value}'`,\n token,\n );\n }\n\n // Correct number of arguments\n if (args.length !== func.argTypes.length) {\n throw new JSONPathTypeError(\n `${token.value}() takes ${func.argTypes.length} argument${\n func.argTypes.length === 1 ? \"\" : \"s\"\n }, ${args.length} given`,\n token,\n );\n }\n\n // Argument types\n for (const [typ, arg, idx] of func.argTypes.map(\n (t, i): [FunctionExpressionType, FilterExpression, number] => [\n t,\n args[i],\n i,\n ],\n )) {\n switch (typ) {\n case FunctionExpressionType.ValueType:\n if (\n !(\n arg instanceof FilterExpressionLiteral ||\n (arg instanceof JSONPathQuery && arg.path.singularQuery())\n )\n ) {\n throw new JSONPathTypeError(\n `${token.value}() argument ${idx} must be of ValueType`,\n arg.token,\n );\n }\n break;\n case FunctionExpressionType.LogicalType:\n if (!(arg instanceof BooleanLiteral)) {\n throw new JSONPathTypeError(\n `${token.value}() argument ${idx} must be of LogicalType`,\n arg.token,\n );\n }\n break;\n case FunctionExpressionType.NodesType:\n if (!(arg instanceof JSONPathQuery)) {\n throw new JSONPathTypeError(\n `${token.value}() argument ${idx} must be of NodesType`,\n arg.token,\n );\n }\n }\n }\n\n return args;\n }\n}\n","import { JSONValue } from \"../types\";\nimport { JSONPathEnvironment } from \"./environment\";\nimport { JSONPathNodeList } from \"./node\";\nimport { JSONPath } from \"./path\";\n\nexport { JSONPathEnvironment } from \"./environment\";\nexport type { JSONPathEnvironmentOptions } from \"./environment\";\n\nexport { JSONPath } from \"./path\";\nexport { JSONPathNodeList, JSONPathNode } from \"./node\";\nexport { Token, TokenKind } from \"./token\";\n\nexport * as selectors from \"./selectors\";\nexport * as expressions from \"./expression\";\nexport * as functions from \"./functions\";\n\nexport { FunctionExpressionType } from \"./functions\";\nexport type { FilterFunction } from \"./functions\";\n\nexport {\n JSONPathError,\n JSONPathIndexError,\n JSONPathLexerError,\n JSONPathSyntaxError,\n JSONPathTypeError,\n} from \"./errors\";\n\nexport { Nothing } from \"./types\";\nexport type { JSONPathValue, FilterContext } from \"./types\";\n\nexport const DEFAULT_ENVIRONMENT = new JSONPathEnvironment();\n\n/**\n * Query JSON value _value_ with JSONPath expression _path_.\n * @param path - A JSONPath expression/query.\n * @param value - The JSON-like value the JSONPath query is applied to.\n * @returns A list of JSONPathNode objects, one for each value matched\n * by _path_ in _value_.\n *\n * @throws {@link JSONPathSyntaxError}\n * If the path does not conform to standard syntax.\n *\n * @throws {@link JSONPathTypeError}\n * If filter function arguments are invalid, or filter expression are\n * used in an invalid way.\n */\nexport function query(path: string, value: JSONValue): JSONPathNodeList {\n return DEFAULT_ENVIRONMENT.query(path, value);\n}\n\n/**\n * Compile JSONPath _path_ for later use.\n * @param path - A JSONPath expression/query.\n * @returns A path object with a `query()` method.\n *\n * @throws {@link JSONPathSyntaxError}\n * If the path does not conform to standard syntax.\n *\n * @throws {@link JSONPathTypeError}\n * If filter function arguments are invalid, or filter expression are\n * used in an invalid way.\n */\nexport function compile(path: string): JSONPath {\n return DEFAULT_ENVIRONMENT.compile(path);\n}\n","/**\n * Base class for all JSON Patch errors.\n */\nexport class JSONPatchError extends Error {\n constructor(readonly message: string) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"JSONPatchError\";\n }\n}\n\nexport class JSONPatchTestFailure extends JSONPatchError {\n constructor(readonly message: string) {\n super(message);\n Object.setPrototypeOf(this, new.target.prototype);\n this.name = \"JSONPatchTestFailure\";\n }\n}\n","import { deepEquals } from \"../deep_equals\";\nimport { JSONPointer, UNDEFINED } from \"../pointer\";\nimport {\n JSONPointerError,\n JSONPointerResolutionError,\n} from \"../pointer/errors\";\nimport { JSONValue, isArray, isObject, isString } from \"../types\";\nimport { JSONPatchError, JSONPatchTestFailure } from \"./errors\";\n\nexport type OpObject = {\n op: string;\n path: string;\n value?: JSONValue;\n from?: string;\n};\n\n/**\n * A JSON Patch operation.\n */\nexport interface Op {\n /**\n * The patch operation name.\n */\n name: string;\n\n /**\n * Apply the patch operation to _value_.\n * @param value - The target JSON value.\n */\n apply: (value: JSONValue, index: number) => JSONValue;\n\n /**\n * A plain object representation of the patch operation.\n */\n toObject: () => OpObject;\n}\n\n/**\n * The JSON Patch _add_ operation.\n */\nexport class OpAdd implements Op {\n public name: string = \"add\";\n\n constructor(\n readonly path: JSONPointer,\n readonly value: JSONValue,\n ) {}\n\n public apply(value: JSONValue, index: number): JSONValue {\n const [parent, obj] = this.path.resolveWithParent(value);\n if (parent === UNDEFINED) {\n // Replace the root object.\n return this.value;\n }\n\n const target = this.path.tokens.at(-1);\n if (target === undefined) {\n // this should not be possible\n throw new JSONPatchError(\n `unexpected operation on 'undefined' (${this.name}:${index})`,\n );\n } else if (isArray(parent)) {\n if (obj === UNDEFINED) {\n if (target === \"-\") {\n parent.push(this.value);\n } else {\n throw new JSONPatchError(\n `index out of range (${this.name}:${index})`,\n );\n }\n } else {\n parent.splice(Number(target), 0, this.value);\n }\n } else if (isObject(parent)) {\n parent[target] = this.value;\n } else {\n throw new JSONPatchError(\n `unexpected operation on '${typeof parent}' (${this.name}:${index})`,\n );\n }\n\n return value;\n }\n\n public toObject(): OpObject {\n return { op: this.name, path: this.path.toString(), value: this.value };\n }\n}\n\n/**\n * The JSON Patch _remove_ operation.\n */\nexport class OpRemove implements Op {\n public name: string = \"remove\";\n\n constructor(readonly path: JSONPointer) {}\n\n public apply(value: JSONValue, index: number): JSONValue {\n const [parent, obj] = this.path.resolveWithParent(value);\n if (parent === UNDEFINED) {\n throw new JSONPatchError(`can't remove root (${this.name}:${index})`);\n }\n\n const target = this.path.tokens.at(-1);\n if (target === undefined) {\n // this should not be possible\n throw new JSONPatchError(\n `unexpected operation on 'undefined' (${this.name}:${index})`,\n );\n } else if (isArray(parent)) {\n if (obj === UNDEFINED) {\n throw new JSONPatchError(\n `can't remove nonexistent item (${this.name}:${index})`,\n );\n }\n parent.splice(Number(target), 1);\n } else if (isObject(parent)) {\n if (obj === UNDEFINED) {\n throw new JSONPatchError(\n `can't remove nonexistent property (${this.name}:${index})`,\n );\n }\n delete parent[target];\n } else {\n throw new JSONPatchError(\n `unexpected operation on '${typeof parent}' (${this.name}:${index})`,\n );\n }\n\n return value;\n }\n\n public toObject(): OpObject {\n return { op: this.name, path: this.path.toString() };\n }\n}\n\n/**\n * The JSON Patch _replace_ operation.\n */\nexport class OpReplace implements Op {\n name: string = \"replace\";\n\n constructor(\n readonly path: JSONPointer,\n readonly value: JSONValue,\n ) {}\n\n public apply(value: JSONValue, index: number): JSONValue {\n const [parent, obj] = this.path.resolveWithParent(value);\n if (parent === UNDEFINED) {\n // Replace the root object.\n return this.value;\n }\n\n const target = this.path.tokens.at(-1);\n if (target === undefined) {\n // this should not be possible\n throw new JSONPatchError(\n `unexpected operation on 'undefined' (${this.name}:${index})`,\n );\n }\n\n if (isArray(parent)) {\n if (obj === UNDEFINED) {\n throw new JSONPatchError(\n `can't replace nonexistent item (${this.name}:${index})`,\n );\n }\n parent.splice(Number(target), 1, this.value);\n } else if (isObject(parent)) {\n if (obj === UNDEFINED) {\n throw new JSONPatchError(\n `can't replace nonexistent property (${this.name}:${index})`,\n );\n }\n parent[target] = this.value;\n } else {\n throw new JSONPatchError(\n `unexpected operation on '${typeof parent}' (${this.name}:${index})`,\n );\n }\n\n return value;\n }\n\n public toObject(): OpObject {\n return { op: this.name, path: this.path.toString(), value: this.value };\n }\n}\n\n/**\n * The JSON Patch _move_ operation.\n */\nexport class OpMove implements Op {\n name: string = \"move\";\n\n constructor(\n readonly from: JSONPointer,\n readonly path: JSONPointer,\n ) {}\n\n public apply(value: JSONValue, index: number): JSONValue {\n if (this.path.isRelativeTo(this.from)) {\n throw new JSONPatchError(\n `can't move object to one of its own children (${this.name}:${index})`,\n );\n }\n\n const [sourceParent, sourceObj] = this.from.resolveWithParent(value);\n if (sourceObj === UNDEFINED) {\n throw new JSONPatchError(\n `source object does not exist (${this.name}:${index})`,\n );\n }\n\n const sourceTarget = this.from.tokens.at(-1);\n if (sourceTarget === undefined) {\n // this should not be possible\n throw new JSONPatchError(\n `unexpected operation on 'undefined' (${this.name}:${index})`,\n );\n }\n\n if (isArray(sourceParent)) {\n sourceParent.splice(Number(sourceTarget), 1);\n } else if (isObject(sourceParent)) {\n delete sourceParent[sourceTarget];\n }\n\n const [destParent, _] = this.path.resolveWithParent(value);\n if (destParent === UNDEFINED) {\n // move source to root\n return sourceObj;\n }\n\n const destTarget = this.path.tokens.at(-1);\n if (destTarget === undefined) {\n // this should not be possible\n throw new JSONPatchError(\n `unexpected operation on 'undefined' (${this.name}:${index})`,\n );\n }\n\n if (isArray(destParent)) {\n destParent.splice(Number(destTarget), 0, sourceObj);\n } else if (isObject(destParent)) {\n destParent[destTarget] = sourceObj;\n } else {\n throw new JSONPatchError(\n `unexpected operation on '${typeof parent}' (${this.name}:${index})`,\n );\n }\n\n return value;\n }\n\n public toObject(): OpObject {\n return {\n op: this.name,\n from: this.from.toString(),\n path: this.path.toString(),\n };\n }\n}\n\n/**\n * The JSON Patch _copy_ operation.\n */\nexport class OpCopy implements Op {\n name = \"copy\";\n\n constructor(\n readonly from: JSONPointer,\n readonly path: JSONPointer,\n ) {}\n\n public apply(value: JSONValue, index: number): JSONValue {\n const [_, sourceObj] = this.from.resolveWithParent(value);\n if (sourceObj === UNDEFINED) {\n throw new JSONPatchError(\n `source object does not exist (${this.name}:${index})`,\n );\n }\n\n const [destParent] = this.path.resolveWithParent(value);\n if (destParent === UNDEFINED) {\n // copy source to root\n return this.deepCopy(sourceObj);\n }\n\n const destTarget = this.path.tokens.at(-1);\n if (destTarget === undefined) {\n // this should not be possible\n throw new JSONPatchError(\n `unexpected operation on 'undefined' (${this.name}:${index})`,\n );\n }\n\n if (isArray(destParent)) {\n destParent.splice(Number(destTarget), 0, this.deepCopy(sourceObj));\n } else if (isObject(destParent)) {\n destParent[destTarget] = this.deepCopy(sourceObj);\n } else {\n throw new JSONPatchError(\n `unexpected operation on '${typeof parent}' (${this.name}:${index})`,\n );\n }\n\n return value;\n }\n\n // eslint-disable-next-line sonarjs/no-identical-functions\n public toObject(): OpObject {\n return {\n op: this.name,\n from: this.from.toString(),\n path: this.path.toString(),\n };\n }\n\n protected deepCopy(value: JSONValue): JSONValue {\n return JSON.parse(JSON.stringify(value));\n }\n}\n\n/**\n * The JSON Patch _test_ operation.\n */\nexport class OpTest implements Op {\n public name: string = \"test\";\n\n constructor(\n readonly path: JSONPointer,\n readonly value: JSONValue,\n ) {}\n\n public apply(value: JSONValue, index: number): JSONValue {\n const [_, obj] = this.path.resolveWithParent(value);\n if (!deepEquals(obj, this.value)) {\n throw new JSONPatchTestFailure(`test failed (${this.name}:${index})`);\n }\n return value;\n }\n\n public toObject(): OpObject {\n return { op: this.name, path: this.path.toString(), value: this.value };\n }\n}\n\n/**\n *\n */\nexport class JSONPatch {\n private ops: Op[] = [];\n\n /**\n *\n * @param ops -\n */\n constructor(ops?: OpObject[]) {\n if (ops) {\n this.build(ops);\n }\n }\n\n /**\n *\n * @param path -\n * @param value -\n * @returns\n */\n public add(path: string | JSONPointer, value: JSONValue): this {\n this.ops.push(\n new OpAdd(this.ensurePointer(path, \"add\", this.ops.length), value),\n );\n return this;\n }\n\n /**\n *\n * @param path -\n */\n public remove(path: string | JSONPointer): this {\n this.ops.push(\n new OpRemove(this.ensurePointer(path, \"remove\", this.ops.length)),\n );\n return this;\n }\n\n /**\n *\n * @param path -\n * @param value -\n * @returns\n */\n public replace(path: string | JSONPointer, value: JSONValue): this {\n this.ops.push(\n new OpReplace(\n this.ensurePointer(path, \"replace\", this.ops.length),\n value,\n ),\n );\n return this;\n }\n\n /**\n *\n * @param from -\n * @param path -\n * @returns\n */\n public move(from: string | JSONPointer, path: string | JSONPointer): this {\n this.ops.push(\n new OpMove(\n this.ensurePointer(from, \"move\", this.ops.length),\n this.ensurePointer(path, \"move\", this.ops.length),\n ),\n );\n return this;\n }\n /**\n *\n * @param from -\n * @param path -\n * @returns\n */\n public copy(from: string | JSONPointer, path: string | JSONPointer): this {\n this.ops.push(\n new OpCopy(\n this.ensurePointer(from, \"copy\", this.ops.length),\n this.ensurePointer(path, \"copy\", this.ops.length),\n ),\n );\n return this;\n }\n\n /**\n *\n * @param path -\n * @param value -\n * @returns\n */\n public test(path: string | JSONPointer, value: JSONValue): this {\n this.ops.push(\n new OpTest(this.ensurePointer(path, \"test\", this.ops.length), value),\n );\n return this;\n }\n\n /**\n *\n * @param value -\n */\n public apply(value: JSONValue): JSONValue {\n let _value = value;\n for (let i = 0; i < this.ops.length; i++) {\n const op = this.ops[i];\n try {\n _value = op.apply(_value, i);\n } catch (error) {\n if (error instanceof JSONPointerResolutionError) {\n throw new JSONPatchError(`${error.message} (${op.name}:${i})`);\n }\n throw error;\n }\n }\n return _value;\n }\n\n /**\n *\n * @returns\n */\n public toArray(): OpObject[] {\n return this.ops.map((op) => op.toObject());\n }\n\n protected build(ops: OpObject[]): void {\n for (let i = 0; i < ops.length; i++) {\n const operation = ops[i];\n switch (operation.op) {\n case \"add\":\n this.add(\n this.opPointer(operation, \"path\", \"add\", i),\n this.opValue(operation, \"value\", \"add\", i),\n );\n break;\n case \"remove\":\n this.remove(this.opPointer(operation, \"path\", \"remove\", i));\n break;\n case \"replace\":\n this.replace(\n this.opPointer(operation, \"path\", \"replace\", i),\n this.opValue(operation, \"value\", \"replace\", i),\n );\n break;\n case \"move\":\n this.move(\n this.opPointer(operation, \"from\", \"move\", i),\n this.opPointer(operation, \"path\", \"move\", i),\n );\n break;\n case \"copy\":\n this.copy(\n this.opPointer(operation, \"from\", \"copy\", i),\n this.opPointer(operation, \"path\", \"copy\", i),\n );\n break;\n case \"test\":\n this.test(\n this.opPointer(operation, \"path\", \"test\", i),\n this.opValue(operation, \"value\", \"test\", i),\n );\n break;\n default:\n throw new JSONPatchError(\n `expected 'op' to be one of 'add', 'remove', 'replace', 'move', 'copy' or 'test' (${operation.op}:${i})`,\n );\n }\n }\n }\n\n protected opPointer(\n opObj: OpObject,\n key: keyof OpObject,\n op: string,\n index: number,\n ): JSONPointer {\n if (!Object.hasOwn(opObj, key)) {\n throw new JSONPatchError(`missing property '${key}' (${op}:${index})`);\n }\n\n const p = opObj[key];\n\n if (!isString(p)) {\n throw new JSONPatchError(\n `expected a JSON Pointer string for '${key}', found ${typeof p} (${op}:${index})`,\n );\n }\n\n try {\n return new JSONPointer(p);\n } catch (error) {\n if (error instanceof JSONPointerError) {\n throw new JSONPatchError(`${error.message} (${op}:${index})`);\n }\n throw error;\n }\n }\n\n protected opValue(\n opObj: OpObject,\n key: keyof OpObject,\n op: string,\n index: number,\n ): JSONValue {\n if (!Object.hasOwn(opObj, key)) {\n throw new JSONPatchError(`missing property '${key}' (${op}:${index})`);\n }\n\n return opObj[key];\n }\n\n protected ensurePointer(\n p: JSONPointer | string,\n op: string,\n index: number,\n ): JSONPointer {\n if (p instanceof JSONPointer) {\n return p;\n }\n\n if (!isString(p)) {\n throw new JSONPatchError(\n `expected a JSON Pointer string, found ${typeof p} (${op}:${index})`,\n );\n }\n\n try {\n return new JSONPointer(p);\n } catch (error) {\n if (error instanceof JSONPointerError) {\n throw new JSONPatchError(`${error.message} (${op}:${index})`);\n }\n throw error;\n }\n }\n}\n","import { JSONValue } from \"../types\";\nimport { JSONPatch, OpObject } from \"./patch\";\n\nexport { JSONPatch } from \"./patch\";\nexport { JSONPatchError, JSONPatchTestFailure } from \"./errors\";\nexport type { OpObject } from \"./patch\";\n\n/**\n * Apply the JSON Patch _patch_ to JSON-like data _value_.\n * @param ops - JSON Patch operations following RFC 6902.\n * @param value - The target JSON-like document to patch.\n */\nexport function apply(ops: OpObject[], value: JSONValue): JSONValue {\n return new JSONPatch(ops).apply(value);\n}\n","export const version = \"__VERSION__\";\n\nexport * as jsonpath from \"./path\";\nexport {\n FunctionExpressionType,\n JSONPath,\n JSONPathEnvironment,\n JSONPathError,\n JSONPathIndexError,\n JSONPathLexerError,\n JSONPathNode,\n JSONPathNodeList,\n JSONPathSyntaxError,\n JSONPathTypeError,\n Token,\n TokenKind,\n Nothing,\n query,\n compile,\n} from \"./path\";\nexport type { JSONPathEnvironmentOptions, FilterFunction } from \"./path\";\n\nexport * as jsonpointer from \"./pointer\";\nexport { JSONPointer, resolve, UNDEFINED } from \"./pointer\";\n\nexport * as jsonpatch from \"./patch\";\nexport {\n JSONPatch,\n JSONPatchError,\n JSONPatchTestFailure,\n apply,\n} from \"./patch\";\nexport type { OpObject } from \"./patch\";\n\nexport type { JSONValue } from \"./types\";\n"],"names":["JSONPathError","Error","constructor","message","token","super","this","Object","setPrototypeOf","prototype","name","withErrorContext","input","length","index","slice","JSONPathLexerError","JSONPathTypeError","JSONPathIndexError","UndefinedFilterFunctionError","JSONPathSyntaxError","isArray","value","Array","isObject","_type","isString","isNumber","deepEquals","a","b","i","keysA","keys","keysB","key","FunctionExpressionType","JSONPointerError","JSONPointerResolutionError","JSONPointerIndexError","JSONPointerKeyError","JSONPointerSyntaxError","JSONPointerTypeError","UNDEFINED","Symbol","for","JSONPointer","pointer","tokens","parse","encode","map","replaceAll","join","resolve","fallback","arguments","undefined","reduce","getItem","bind","error","resolveWithParent","parent","toString","isRelativeTo","every","t","startsWith","split","val","idx","hasOwn","Number","_join","concat","_len","_key","tok","exists","JSONPathNode","location","root","path","s","toPointer","String","JSONPathNodeList","nodes","iterator","empty","values","node","valuesOrSingular","locations","paths","pointers","Nothing","FilterExpression","FilterExpressionLiteral","NullLiteral","evaluate","BooleanLiteral","StringLiteral","JSON","stringify","NumberLiteral","PrefixExpression","operator","right","context","isTruthy","InfixExpression","left","eq","lt","compare","LogicalExpression","expression","JSONPathQuery","RelativeQuery","query","currentValue","RootQuery","rootValue","FunctionExtension","args","func","environment","filterRegister","get","arg","argTypes","NodesType","call","e","Count","returnType","ValueType","Length","LRUCache","Map","maxSize","entries","has","delete","set","size","first","next","Match","LogicalType","cache","options","cacheSize","throwErrors","pattern","re","test","RegExp","fullMatch","parts","push","endsWith","Search","match","Value","TokenKind","Token","kind","EOF","TokenStream","pos","current","peek","backup","expect","expectPeek","peeked","exponentPattern","functionNamePattern","indexPattern","intPattern","namePattern","whitespace","Set","Lexer","filterLevel","parenStack","start","run","state","lexRoot","emit","ignore","msg","ERROR","ch","accept","valid","acceptMatch","acceptRun","found","acceptMatchRun","lastIndex","exec","ignoreWhitespace","tokenize","lexer","lex","l","ROOT","lexSegment","DDOT","lexDescendantSelection","lexDotSelector","LBRACKET","lexInsideBracketedSelection","lexInsideFilter","WILD","NAME","RBRACKET","FILTER","COMMA","COLON","lexSingleQuoteStringInsideBracketSelection","lexDoubleQuoteStringInsideBracketSelection","INDEX","lexSingleQuoteStringInsideFilterExpression","lexDoubleQuoteStringInsideFilterExpression","LPAREN","RPAREN","pop","CURRENT","NE","NOT","EQ","LE","LT","GE","GT","NUMBER","AND","OR","TRUE","FALSE","NULL","FUNCTION","makeLexString","quote","SINGLE_QUOTE_STRING","DOUBLE_QUOTE_STRING","la","JSONPathSelector","NameSelector","shorthand","rv","IndexSelector","minIntIndex","maxIntIndex","normIndex","normalizedIndex","Math","abs","SliceSelector","stop","step","checkRange","indices","min","arr","max","slicedArray","WildcardSelector","RecursiveDescentSegment","visit","_node","FilterSelector","filterContext","BracketedSelection","items","item","itm","JSONPath","selectors","selector","singularQuery","PRECEDENCES","BINARY_OPERATORS","COMPARISON_OPERATORS","Parser","tokenMap","parseBoolean","parseNumber","parseGroupedExpression","parsePrefixExpression","parseNull","parseRootQuery","parseRelativeQuery","parseString","parseFunction","stream","parsePath","inFilter","loop","parseBracketedSelection","parseIndex","parseSlice","maybeIndex","decodeString","parseFilter","expr","parseFilterExpression","parseInfixExpression","precedence","throwForNonSingularQuery","throwForNonComparableFunction","checkWellTypedness","peekKind","isName","defaultOptions","strict","pow","JSONPathEnvironment","parser","setupFilterFunctions","compile","CountFilterFunction","LengthFilterFunction","SearchFilterFunction","MatchFilterFunction","ValueFilterFunction","typ","DEFAULT_ENVIRONMENT","JSONPatchError","JSONPatchTestFailure","OpAdd","apply","obj","target","at","splice","toObject","op","OpRemove","OpReplace","OpMove","from","sourceParent","sourceObj","sourceTarget","destParent","_","destTarget","OpCopy","deepCopy","OpTest","JSONPatch","ops","build","add","ensurePointer","remove","replace","move","copy","_value","toArray","operation","opPointer","opValue","opObj","p"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base class for all JSON Patch errors.
|
|
3
|
+
*/
|
|
4
|
+
export declare class JSONPatchError extends Error {
|
|
5
|
+
readonly message: string;
|
|
6
|
+
constructor(message: string);
|
|
7
|
+
}
|
|
8
|
+
export declare class JSONPatchTestFailure extends JSONPatchError {
|
|
9
|
+
readonly message: string;
|
|
10
|
+
constructor(message: string);
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { JSONValue } from "../types";
|
|
2
|
+
import { OpObject } from "./patch";
|
|
3
|
+
export { JSONPatch } from "./patch";
|
|
4
|
+
export { JSONPatchError, JSONPatchTestFailure } from "./errors";
|
|
5
|
+
export type { OpObject } from "./patch";
|
|
6
|
+
/**
|
|
7
|
+
* Apply the JSON Patch _patch_ to JSON-like data _value_.
|
|
8
|
+
* @param ops - JSON Patch operations following RFC 6902.
|
|
9
|
+
* @param value - The target JSON-like document to patch.
|
|
10
|
+
*/
|
|
11
|
+
export declare function apply(ops: OpObject[], value: JSONValue): JSONValue;
|