diff --git a/.gitignore b/.gitignore index 54810e9f..ba320410 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ reports target *.log coverage +xunit.xml diff --git a/.ncurc.cjs b/.ncurc.cjs new file mode 100644 index 00000000..162a5bf9 --- /dev/null +++ b/.ncurc.cjs @@ -0,0 +1,8 @@ +'use strict'; + +module.exports = { + reject: [ + // Until typedoc supports + 'typescript' + ] +}; diff --git a/.npmignore b/.npmignore index 614e4f74..1dd2824d 100644 --- a/.npmignore +++ b/.npmignore @@ -15,11 +15,15 @@ mocha-multi-reporters.json .mocharc.cjs .github .nojekyll +.ncurc.cjs ignore pnpm-lock.yaml +pnpm-workspace.yaml eslint.config.js .editorconfig .eslintignore licenseInfo.json tsconfig.json +tsconfig-prod.json demo +xunit.xml diff --git a/CHANGES.md b/CHANGES.md index 9d25ccb6..438124ee 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,9 +1,17 @@ # CHANGES for jsonpath-plus -## 10.4.1 +## 11.0.0 + +BREAKING CHANGES +* chore: various changes in types, particularly with return values changing from any to unknown to ensure type safety (by forcing type casts of the results on the user). * fix(slice): explicit zero end no longer returns the whole array (#265) (@spokodev) +* fix: restore `JSONPath.prototype.evaluate`, `safeVm`, and `vm` compatibility +* refactor: expose JSONPathClass prototype through JSONPath for compatibility * chore: pnpm update (@brettz9) +* refactor: implement TypeScript-as-JSDoc and auto-build declaration files from this (avoiding need for maintaining declaration file manually) +* chore: update devDeps +* chore: lint * build(deps-dev): bump rollup from 4.53.2 to 4.59.0 (@dependabot[bot]) * build(deps): bump minimatch from 9.0.5 to 9.0.9 (@dependabot[bot]) * build(deps): bump serialize-javascript (via audit fix) (@dependabot[bot]) diff --git a/README.md b/README.md index dc5bf360..9ca32560 100644 --- a/README.md +++ b/README.md @@ -195,7 +195,8 @@ evaluate method (as the first argument) include: to be returned within results. - ***parentProperty*** (**default: null**) - In the event that a query could be made to return the root node, this allows the `parentProperty` - of that root node to be returned within results. + of that root node to be returned within results. This may be a string + property name or a numeric array index. - ***callback*** (**default: (none)**) - If supplied, a callback will be called immediately upon retrieval of an end point value. The three arguments supplied will be the value of the payload (according to `resultType`), diff --git a/badges/tests-badge.svg b/badges/tests-badge.svg index eb9013bd..70ab4bc5 100644 --- a/badges/tests-badge.svg +++ b/badges/tests-badge.svg @@ -1 +1 @@ -TestsTests280/280280/280 \ No newline at end of file +TestsTests298/298298/298 diff --git a/bin/jsonpath-cli.js b/bin/jsonpath-cli.js index 58fbb4bc..76e864c0 100755 --- a/bin/jsonpath-cli.js +++ b/bin/jsonpath-cli.js @@ -1,6 +1,6 @@ #!/usr/bin/env node import {readFile} from 'fs/promises'; -import {JSONPath as jsonpath} from '../dist/index-node-esm.js'; +import {JSONPath as jsonpath} from '../src/jsonpath-node.js'; const file = process.argv[2]; const path = process.argv[3]; @@ -17,11 +17,16 @@ try { } /** - * @typedef {any} JSON + * @typedef {JSONValue[]} JSONArray */ /** - * @param {JSON} json + * @typedef {null|boolean|number|string| + * {[key: string]: JSONValue}|JSONArray} JSONValue + */ + +/** + * @param {JSONValue} json * @param {string} pth * @returns {void} */ diff --git a/demo/index.js b/demo/index.js index b9db8bdf..71339ad2 100644 --- a/demo/index.js +++ b/demo/index.js @@ -1,6 +1,5 @@ -/// /* globals JSONPath, LZString -- Test UMD */ -/* eslint-disable import/unambiguous -- Demo */ +/// // Todo: Extract testing example paths/contents and use for a // pulldown that can populate examples @@ -12,10 +11,20 @@ // Todo: Could add JSON/JS syntax highlighting in sample and result, // ideally with a jsonpath-plus parser highlighter as well -const $ = (s) => document.querySelector(s); +/** + * @param {string} s + * @returns {HTMLElement} + */ +const $ = (s) => /** @type {HTMLElement} */ (document.querySelector(s)); -const jsonpathEl = $('#jsonpath'); -const jsonSample = $('#jsonSample'); +/** + * @param {string} s + * @returns {HTMLInputElement} + */ +const $i = (s) => /** @type {HTMLInputElement} */ (document.querySelector(s)); + +const jsonpathEl = $i('#jsonpath'); +const jsonSample = $i('#jsonSample'); const updateUrl = () => { const path = jsonpathEl.value; @@ -23,26 +32,30 @@ const updateUrl = () => { const url = new URL(location.href); url.searchParams.set('path', path); url.searchParams.set('json', jsonText); - url.searchParams.set('eval', $('#eval').value); - url.searchParams.set('ignoreEvalErrors', $('#ignoreEvalErrors').value); - history.replaceState(null, '', url.toString()); + url.searchParams.set('eval', $i('#eval').value); + url.searchParams.set('ignoreEvalErrors', $i('#ignoreEvalErrors').value); + history.replaceState(null, '', url.href); }; const loadUrl = () => { const url = new URL(location.href); if (url.searchParams.has('path')) { - jsonpathEl.value = url.searchParams.get('path'); + jsonpathEl.value = /** @type {string} */ (url.searchParams.get('path')); } if (url.searchParams.has('json')) { jsonSample.value = LZString.decompressFromEncodedURIComponent( - url.searchParams.get('json') + /** @type {string} */ (url.searchParams.get('json')) ); } if (url.searchParams.has('eval')) { - $('#eval').value = url.searchParams.get('eval'); + $i('#eval').value = /** @type {string} */ ( + url.searchParams.get('eval') + ); } if (url.searchParams.has('ignoreEvalErrors')) { - $('#ignoreEvalErrors').value = url.searchParams.get('ignoreEvalErrors'); + $i('#ignoreEvalErrors').value = /** @type {string} */ ( + url.searchParams.get('ignoreEvalErrors') + ); } }; @@ -52,7 +65,7 @@ const updateResults = () => { setTimeout(() => { jsonSample.reportValidity(); jsonpathEl.reportValidity(); - }); + }, 0); }; let json; jsonSample.setCustomValidity(''); @@ -61,7 +74,10 @@ const updateResults = () => { try { json = JSON.parse(jsonSample.value); } catch (err) { - jsonSample.setCustomValidity('Error parsing JSON: ' + err.toString()); + jsonSample.setCustomValidity( + 'Error parsing JSON: ' + + /** @type {Error} */ (err).toString() + ); reportValidity(); return; } @@ -69,16 +85,20 @@ const updateResults = () => { const result = new JSONPath.JSONPath({ path: jsonpathEl.value, json, - eval: $('#eval').value === 'false' ? false : $('#eval').value, - ignoreEvalErrors: $('#ignoreEvalErrors').value === 'true' + eval: /** @type {'safe'|'native'|boolean} */ ( + $i('#eval').value === 'false' ? false : $i('#eval').value + ), + ignoreEvalErrors: $i('#ignoreEvalErrors').value === 'true' }); - $('#results').value = JSON.stringify(result, null, 2); + $i('#results').value = JSON.stringify(result, null, 2); } catch (err) { jsonpathEl.setCustomValidity( - 'Error executing JSONPath: ' + err.toString() + 'Error executing JSONPath: ' + + /** @type {Error} */ + (err).toString() ); reportValidity(); - $('#results').value = ''; + $i('#results').value = ''; } }; diff --git a/demo/tsconfig.json b/demo/tsconfig.json new file mode 100644 index 00000000..ced96510 --- /dev/null +++ b/demo/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "lib": ["es2024", "dom"] + }, + "include": ["."], + "exclude": ["node-import-test.js"] +} diff --git a/demo/types.d.ts b/demo/types.d.ts index cf4aac6f..8032c8e8 100644 --- a/demo/types.d.ts +++ b/demo/types.d.ts @@ -1,5 +1,4 @@ -import '../src/jsonpath.d.ts' -import type { JSONPathType } from 'jsonpath-plus'; +import type {JSONPathClass} from 'jsonpath-plus'; declare global { var LZString: { @@ -7,6 +6,6 @@ declare global { compressToEncodedURIComponent: (value: string) => string; }; var JSONPath: { - JSONPath: JSONPathType + JSONPath: typeof JSONPathClass } } diff --git a/dist/Safe-Script.d.ts b/dist/Safe-Script.d.ts new file mode 100644 index 00000000..c12a3c31 --- /dev/null +++ b/dist/Safe-Script.d.ts @@ -0,0 +1,22 @@ +export type AssignmentExpression = any; +export type Substitution = any; +export type AnyParameter = any; +export type Substitutions = Record; +/** + * A replacement for NodeJS' VM.Script which is also {@link https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP | Content Security Policy} friendly. + */ +export class SafeScript { + /** + * @param {string} expr Expression to evaluate + */ + constructor(expr: string); + code: string; + ast: unknown; + /** + * @param {object} context Object whose items will be added + * to evaluation + * @returns {EvaluatedResult} Result of evaluated code + */ + runInNewContext(context: object): EvaluatedResult; +} +import type { EvaluatedResult } from './jsonpath.js'; diff --git a/dist/index-browser-esm.js b/dist/index-browser-esm.js index ff47009c..bf1cd752 100644 --- a/dist/index-browser-esm.js +++ b/dist/index-browser-esm.js @@ -1195,8 +1195,29 @@ const plugin = { } }; +/* eslint-disable unicorn/no-top-level-side-effects -- Temporary? */ /* eslint-disable no-bitwise -- Convenient */ +/** + * @import {EvaluatedResult, UnknownResult} from './jsonpath.js'; + */ + +/** + * @typedef {any} AssignmentExpression + */ + +/** + * @typedef {any} Substitution + */ + +/** + * @typedef {any} AnyParameter + */ + +/** + * @typedef {Record} Substitutions + */ + // register plugins jsep.plugins.register(index, plugin); jsep.addUnaryOp('typeof'); @@ -1207,37 +1228,50 @@ const BLOCKED_PROTO_PROPERTIES = new Set(['constructor', '__proto__', '__defineG const SafeEval = { /** * @param {jsep.Expression} ast - * @param {Record} subs + * @param {Substitutions} subs + * @returns {UnknownResult} */ evalAst(ast, subs) { switch (ast.type) { case 'BinaryExpression': case 'LogicalExpression': - return SafeEval.evalBinaryExpression(ast, subs); + return SafeEval.evalBinaryExpression(/** @type {jsep.BinaryExpression} */ast, subs); case 'Compound': - return SafeEval.evalCompound(ast, subs); + return SafeEval.evalCompound(/** @type {jsep.Compound} */ast, subs); case 'ConditionalExpression': - return SafeEval.evalConditionalExpression(ast, subs); + return SafeEval.evalConditionalExpression(/** @type {jsep.ConditionalExpression} */ast, subs); case 'Identifier': - return SafeEval.evalIdentifier(ast, subs); + return SafeEval.evalIdentifier(/** @type {jsep.Identifier} */ast, subs); case 'Literal': - return SafeEval.evalLiteral(ast, subs); + return SafeEval.evalLiteral(/** @type {jsep.Literal} */ast); case 'MemberExpression': - return SafeEval.evalMemberExpression(ast, subs); + return SafeEval.evalMemberExpression(/** @type {jsep.MemberExpression} */ast, subs); case 'UnaryExpression': - return SafeEval.evalUnaryExpression(ast, subs); + return SafeEval.evalUnaryExpression(/** @type {jsep.UnaryExpression} */ast, subs); case 'ArrayExpression': - return SafeEval.evalArrayExpression(ast, subs); + return SafeEval.evalArrayExpression(/** @type {jsep.ArrayExpression} */ast, subs); case 'CallExpression': - return SafeEval.evalCallExpression(ast, subs); + return SafeEval.evalCallExpression(/** @type {jsep.CallExpression} */ast, subs); case 'AssignmentExpression': - return SafeEval.evalAssignmentExpression(ast, subs); + return SafeEval.evalAssignmentExpression(/** @type {AssignmentExpression} */ast, subs); default: - throw SyntaxError('Unexpected expression', ast); + throw new SyntaxError('Unexpected expression', { + cause: ast + }); } }, + /** + * @param {jsep.BinaryExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalBinaryExpression(ast, subs) { - const result = { + /** + * @typedef {{ + * [key: string]: (a: AnyParameter, b: AnyParameter) => UnknownResult + * }} OperatorTable + */ + const result = /** @type {OperatorTable} */{ '||': (a, b) => a || b(), '&&': (a, b) => a && b(), '|': (a, b) => a | b(), @@ -1264,14 +1298,18 @@ const SafeEval = { }[ast.operator](SafeEval.evalAst(ast.left, subs), () => SafeEval.evalAst(ast.right, subs)); return result; }, + /** + * @param {jsep.Compound} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalCompound(ast, subs) { let last; for (let i = 0; i < ast.body.length; i++) { - if (ast.body[i].type === 'Identifier' && ['var', 'let', 'const'].includes(ast.body[i].name) && ast.body[i + 1] && ast.body[i + 1].type === 'AssignmentExpression') { + if (ast.body[i].type === 'Identifier' && ['var', 'let', 'const'].includes(/** @type {jsep.Identifier} */ + ast.body[i].name) && Object.hasOwn(ast.body, i + 1) && ast.body[i + 1].type === 'AssignmentExpression') { // var x=2; is detected as // [{Identifier var}, {AssignmentExpression x=2}] - // eslint-disable-next-line @stylistic/max-len -- Long - // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient i += 1; } const expr = ast.body[i]; @@ -1279,71 +1317,120 @@ const SafeEval = { } return last; }, + /** + * @param {jsep.ConditionalExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalConditionalExpression(ast, subs) { if (SafeEval.evalAst(ast.test, subs)) { return SafeEval.evalAst(ast.consequent, subs); } return SafeEval.evalAst(ast.alternate, subs); }, + /** + * @param {jsep.Identifier} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalIdentifier(ast, subs) { if (Object.hasOwn(subs, ast.name)) { return subs[ast.name]; } - throw ReferenceError(`${ast.name} is not defined`); + throw new ReferenceError(`${ast.name} is not defined`); }, + /** + * @param {jsep.Literal} ast + * @returns {UnknownResult} + */ evalLiteral(ast) { return ast.value; }, + /** + * @param {jsep.MemberExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalMemberExpression(ast, subs) { const prop = String( // NOTE: `String(value)` throws error when // value has overwritten the toString method to return non-string // i.e. `value = {toString: () => []}` - ast.computed ? SafeEval.evalAst(ast.property) // `object[property]` + ast.computed ? SafeEval.evalAst(ast.property, subs) // `object[property]` : ast.property.name // `object.property` property is Identifier ); const obj = SafeEval.evalAst(ast.object, subs); if (obj === undefined || obj === null) { - throw TypeError(`Cannot read properties of ${obj} (reading '${prop}')`); + throw new TypeError(`Cannot read properties of ${obj} (reading '${prop}')`); } if (!Object.hasOwn(obj, prop) && BLOCKED_PROTO_PROPERTIES.has(prop)) { - throw TypeError(`Cannot read properties of ${obj} (reading '${prop}')`); + throw new TypeError(`Cannot read properties of ${obj} (reading '${prop}')`); } - const result = obj[prop]; + const result = /** @type {Record} */obj[prop]; if (typeof result === 'function' && result !== Function) { return result.bind(obj); // arrow functions aren't affected by bind. } return result; }, + /** + * @param {jsep.UnaryExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalUnaryExpression(ast, subs) { - const result = { - '-': a => -SafeEval.evalAst(a, subs), + /** + * @typedef {{ + * [key: string]: (a: AnyParameter) => UnknownResult + * }} UnaryOperatorTable + */ + const result = /** @type {UnaryOperatorTable} */{ + '-': a => -(/** @type {EvaluatedResult} */ + SafeEval.evalAst(a, subs)), '!': a => !SafeEval.evalAst(a, subs), - '~': a => ~SafeEval.evalAst(a, subs), + '~': a => ~(/** @type {EvaluatedResult} */ + SafeEval.evalAst(a, subs)), // eslint-disable-next-line no-implicit-coercion -- API - '+': a => +SafeEval.evalAst(a, subs), + '+': a => +(/** @type {EvaluatedResult} */ + SafeEval.evalAst(a, subs)), typeof: a => typeof SafeEval.evalAst(a, subs), - // eslint-disable-next-line no-void, sonarjs/void-use -- feature + // eslint-disable-next-line no-void -- Ok void: a => void SafeEval.evalAst(a, subs) }[ast.operator](ast.argument); return result; }, + /** + * @param {jsep.ArrayExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalArrayExpression(ast, subs) { - return ast.elements.map(el => SafeEval.evalAst(el, subs)); + return ast.elements.map(el => SafeEval.evalAst(/** @type {jsep.Expression} */ + el, subs)); }, + /** + * @param {jsep.CallExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalCallExpression(ast, subs) { const args = ast.arguments.map(arg => SafeEval.evalAst(arg, subs)); const func = SafeEval.evalAst(ast.callee, subs); if (func === Function) { throw new Error('Function constructor is disabled'); } - return func(...args); + return (/** @type {(...args: AnyParameter[]) => UnknownResult} */ + func)(...args); }, + /** + * @param {AssignmentExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalAssignmentExpression(ast, subs) { if (ast.left.type !== 'Identifier') { - throw SyntaxError('Invalid left-hand side in assignment'); + throw new SyntaxError('Invalid left-hand side in assignment'); } - const id = ast.left.name; + const id = /** @type {jsep.Identifier} */ast.left.name; const value = SafeEval.evalAst(ast.right, subs); subs[id] = value; return subs[id]; @@ -1359,7 +1446,7 @@ class SafeScript { */ constructor(expr) { this.code = expr; - this.ast = jsep(this.code); + this.ast = /** @type {unknown} */jsep(this.code); } /** @@ -1370,30 +1457,63 @@ class SafeScript { runInNewContext(context) { // `Object.create(null)` creates a prototypeless object const keyMap = Object.assign(Object.create(null), context); - return SafeEval.evalAst(this.ast, keyMap); + return SafeEval.evalAst(/** @type {jsep.Expression} */this.ast, keyMap); } } /* eslint-disable camelcase -- Convenient for escaping */ +/* eslint-disable class-methods-use-this -- Consistent monkey-patching */ +/* eslint-disable unicorn/prefer-private-class-fields -- Allow + monkey-patching */ +/** + * @import {Script} from './jsonpath-browser.js'; + */ /** - * @typedef {null|boolean|number|string|object|GenericArray} JSONObject + * @typedef {any} AnyInput */ /** - * @typedef {any} AnyItem + * @typedef {((...args: any[]) => any)} SandboxCallback */ /** - * @typedef {any} AnyResult + * @typedef {any|SandboxCallback} SandboxPropertyValue + */ + +/** + * @typedef {(string|number)[]} ExpressionArray + */ + +/** + * @typedef {"scalar"|"boolean"|"string"|"undefined" + * |"function"|"integer"|"number"|"nonFinite"|"object" + * |"array"|"other"|"null"} ValueType + */ + +/** + * @typedef {unknown} ParentValue + */ + +/** + * @typedef {unknown} UnknownResult + */ + +/** + * @typedef {string|number|null} ParentProperty + */ + +/** + * @typedef {ReturnObject|string|number|boolean|null|unknown[] + * |Record} PreferredOutput */ /** * Copies array and then pushes item into it. - * @param {GenericArray} arr Array to copy and into which to push - * @param {AnyItem} item Array item to add (to end) - * @returns {GenericArray} Copy of the original array + * @param {ExpressionArray} arr Array to copy and into which to push + * @param {string|number} item Array item to add (to end) + * @returns {ExpressionArray} Copy of the original array */ function push(arr, item) { arr = arr.slice(); @@ -1402,9 +1522,9 @@ function push(arr, item) { } /** * Copies array and then unshifts item into it. - * @param {AnyItem} item Array item to add (to beginning) - * @param {GenericArray} arr Array to copy and into which to unshift - * @returns {GenericArray} Copy of the original array + * @param {string|number} item Array item to add (to beginning) + * @param {ExpressionArray} arr Array to copy and into which to unshift + * @returns {ExpressionArray} Copy of the original array */ function unshift(item, arr) { arr = arr.slice(); @@ -1413,45 +1533,34 @@ function unshift(item, arr) { } /** - * Caught when JSONPath is used without `new` but rethrown if with `new` - * @extends Error + * @typedef {object} ReturnObject + * @property {ExpressionArray|string} path + * @property {unknown} value + * @property {ParentValue} parent + * @property {ParentProperty} parentProperty + * @property {boolean} [isParentSelector] + * @property {boolean} [hasArrExpr] + * @property {ExpressionArray} [expr] + * @property {string} [pointer] */ -class NewError extends Error { - /** - * @param {AnyResult} value The evaluated scalar value - */ - constructor(value) { - super('JSONPath should not be called with "new" (it prevents return ' + 'of (unwrapped) scalar values)'); - this.avoidNew = true; - this.value = value; - this.name = 'NewError'; - } -} /** -* @typedef {object} ReturnObject -* @property {string} path -* @property {JSONObject} value -* @property {object|GenericArray} parent -* @property {string} parentProperty -*/ - -/** -* @callback JSONPathCallback -* @param {string|object} preferredOutput -* @param {"value"|"property"} type -* @param {ReturnObject} fullRetObj -* @returns {void} -*/ + * @callback JSONPathCallback + * @param {any} preferredOutput Using `any` type instead of `PreferredOutput` so + * that user can supply flexible type + * @param {"value"|"property"} type + * @param {ReturnObject} fullRetObj + * @returns {void} + */ /** -* @callback OtherTypeCallback -* @param {JSONObject} val -* @param {string} path -* @param {object|GenericArray} parent -* @param {string} parentPropName -* @returns {boolean} -*/ + * @callback OtherTypeCallback + * @param {unknown} val + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {string|null} parentPropName + * @returns {boolean|null} + */ /** * @typedef {any} ContextItem @@ -1462,523 +1571,841 @@ class NewError extends Error { */ /** -* @callback EvalCallback -* @param {string} code -* @param {ContextItem} context -* @returns {EvaluatedResult} -*/ + * @callback EvalCallback + * @param {string} code + * @param {ContextItem} context + * @returns {EvaluatedResult} + */ + +/** + * @typedef {new (expr: string) => { + * runInNewContext: (context: object) => EvaluatedResult + * }} ScriptConstructor + */ + +/** + * @typedef {ScriptConstructor} EvalClass + */ + +/** + * @typedef {"value"|"path"|"pointer"|"parent"|"parentProperty" + * |"all"} ResultType + */ + +/** + * @typedef {EvalCallback|EvalClass|'safe'|'native'|boolean} EvalValue + */ + +/** + * @typedef {string|string[]} PathType + */ + +/** + * @typedef {{Script: ScriptConstructor}} SafeScriptType + */ + +/** + * @typedef {{Script: ScriptConstructor}} ScriptType + */ /** - * @typedef {typeof SafeScript} EvalClass + * @typedef {{ + * _$_path?: string, + * _$_parentProperty?: ParentProperty, + * _$_parent?: ParentValue, + * _$_property?: string|number, + * _$_root?: AnyInput, + * _$_v?: unknown, + * [key: string]: SandboxPropertyValue + * }} SandboxType */ /** * @typedef {object} JSONPathOptions - * @property {JSON} json - * @property {string|string[]} path - * @property {"value"|"path"|"pointer"|"parent"|"parentProperty"| - * "all"} [resultType="value"] + * @property {AnyInput} [json] + * @property {PathType} [path] + * @property {ResultType} [resultType="value"] * @property {boolean} [flatten=false] * @property {boolean} [wrap=true] - * @property {object} [sandbox={}] - * @property {EvalCallback|EvalClass|'safe'|'native'| - * boolean} [eval = 'safe'] - * @property {object|GenericArray|null} [parent=null] - * @property {string|null} [parentProperty=null] + * @property {SandboxType} [sandbox={}] + * @property {EvalValue} [eval='safe'] + * @property {any|null} [parent=null] + * @property {ParentProperty} [parentProperty=null] * @property {JSONPathCallback} [callback] * @property {OtherTypeCallback} [otherTypeCallback] Defaults to * function which throws on encountering `@other` * @property {boolean} [autostart=true] + * @property {boolean} [ignoreEvalErrors=false] */ /** - * @param {string|JSONPathOptions} opts If a string, will be treated as `expr` - * @param {string} [expr] JSON path to evaluate - * @param {JSON} [obj] JSON object to evaluate against - * @param {JSONPathCallback} [callback] Passed 3 arguments: 1) desired payload - * per `resultType`, 2) `"value"|"property"`, 3) Full returned object with + * @overload + * @param {string} opts JSON path to evaluate + * @param {AnyInput} [expr] JSON object to evaluate against + * @param {JSONPathCallback} [obj] Passed 3 arguments: 1) desired + * payload per `resultType`, 2) `"value"|"property"`, 3) Full returned + * object with all payloads + * @param {OtherTypeCallback} [callback] If `@other()` is at the + * end of one's query, this will be invoked with the value of the item, + * its path, its parent, and its parent's property name, and it should + * return a boolean indicating whether the supplied value belongs to the + * "other" type or not (or it may handle transformations and return + * `false`). + * @param {undefined} [otherTypeCallback] + * @returns {unknown} The string form always has `autostart` implicitly + * `true`, so the result is the evaluated value, not a `JSONPathClass` + */ +/** + * @overload + * @param {JSONPathOptions & {autostart: false}} opts An options object + * with `autostart` explicitly set to `false` defers evaluation and + * returns the `JSONPathClass` instance instead + * @returns {JSONPathClass} + */ +/** + * @overload + * @param {JSONPathOptions} opts If a string, will be treated as + * `expr` + * @returns {unknown} + */ +/** + * @param {JSONPathOptions|string} opts If a string, will be treated as `expr` + * @param {string|AnyInput} [expr] JSON path to evaluate + * @param {AnyInput|JSONPathCallback} [obj] JSON object to evaluate against + * @param {JSONPathCallback|OtherTypeCallback} [callback] Passed 3 + * arguments: 1) desired payload per `resultType`, + * 2) `"value"|"property"`, 3) Full returned object with * all payloads * @param {OtherTypeCallback} [otherTypeCallback] If `@other()` is at the end * of one's query, this will be invoked with the value of the item, its * path, its parent, and its parent's property name, and it should return * a boolean indicating whether the supplied value belongs to the "other" * type or not (or it may handle transformations and return `false`). - * @returns {JSONPath} - * @class + * @throws {Error} + * @returns {unknown|JSONPathClass} */ function JSONPath(opts, expr, obj, callback, otherTypeCallback) { - // eslint-disable-next-line no-restricted-syntax -- Allow for pseudo-class - if (!(this instanceof JSONPath)) { - try { - return new JSONPath(opts, expr, obj, callback, otherTypeCallback); - } catch (e) { - if (!e.avoidNew) { - throw e; - } - return e.value; - } - } - if (typeof opts === 'string') { - otherTypeCallback = callback; - callback = obj; - obj = expr; - expr = opts; - opts = null; - } - const optObj = opts && typeof opts === 'object'; - opts = opts || {}; - this.json = opts.json || obj; - this.path = opts.path || expr; - this.resultType = opts.resultType || 'value'; - this.flatten = opts.flatten || false; - this.wrap = Object.hasOwn(opts, 'wrap') ? opts.wrap : true; - this.sandbox = opts.sandbox || {}; - this.eval = opts.eval === undefined ? 'safe' : opts.eval; - this.ignoreEvalErrors = typeof opts.ignoreEvalErrors === 'undefined' ? false : opts.ignoreEvalErrors; - this.parent = opts.parent || null; - this.parentProperty = opts.parentProperty || null; - this.callback = opts.callback || callback || null; - this.otherTypeCallback = opts.otherTypeCallback || otherTypeCallback || function () { - throw new TypeError('You must supply an otherTypeCallback callback option ' + 'with the @other() operator.'); - }; - if (opts.autostart !== false) { - const args = { - path: optObj ? opts.path : expr - }; - if (!optObj) { - args.json = obj; - } else if ('json' in opts) { - args.json = opts.json; + try { + if (opts && typeof opts === 'object') { + return new JSONPathClass(opts); } - const ret = this.evaluate(args); - if (!ret || typeof ret !== 'object') { - throw new NewError(ret); + return new JSONPathClass(opts, expr, /** @type {JSONPathCallback|undefined} */obj, /** @type {OtherTypeCallback|undefined} */callback, /** @type {undefined} */otherTypeCallback); + } catch (e) { + if (new.target) { + throw e; } - return ret; + if (e && typeof e === 'object' && 'value' in e) { + return /** @type {{value: UnknownResult}} */e.value; + } + throw e; } } -// PUBLIC METHODS -JSONPath.prototype.evaluate = function (expr, json, callback, otherTypeCallback) { - let currParent = this.parent, - currParentProperty = this.parentProperty; - let { - flatten, - wrap - } = this; - this.currResultType = this.resultType; - this.currEval = this.eval; - this.currSandbox = this.sandbox; - callback = callback || this.callback; - this.currOtherTypeCallback = otherTypeCallback || this.otherTypeCallback; - json = json || this.json; - expr = expr || this.path; - if (expr && typeof expr === 'object' && !Array.isArray(expr)) { - if (!expr.path && expr.path !== '') { - throw new TypeError('You must supply a "path" property when providing an object ' + 'argument to JSONPath.evaluate().'); - } - if (!Object.hasOwn(expr, 'json')) { - throw new TypeError('You must supply a "json" property when providing an object ' + 'argument to JSONPath.evaluate().'); - } - ({ - json - } = expr); - flatten = Object.hasOwn(expr, 'flatten') ? expr.flatten : flatten; - this.currResultType = Object.hasOwn(expr, 'resultType') ? expr.resultType : this.currResultType; - this.currSandbox = Object.hasOwn(expr, 'sandbox') ? expr.sandbox : this.currSandbox; - wrap = Object.hasOwn(expr, 'wrap') ? expr.wrap : wrap; - this.currEval = Object.hasOwn(expr, 'eval') ? expr.eval : this.currEval; - callback = Object.hasOwn(expr, 'callback') ? expr.callback : callback; - this.currOtherTypeCallback = Object.hasOwn(expr, 'otherTypeCallback') ? expr.otherTypeCallback : this.currOtherTypeCallback; - currParent = Object.hasOwn(expr, 'parent') ? expr.parent : currParent; - currParentProperty = Object.hasOwn(expr, 'parentProperty') ? expr.parentProperty : currParentProperty; - expr = expr.path; - } - currParent = currParent || null; - currParentProperty = currParentProperty || null; - if (Array.isArray(expr)) { - expr = JSONPath.toPathString(expr); - } - if (!expr && expr !== '' || !json) { - return undefined; - } - const exprList = JSONPath.toPathArray(expr); - if (exprList[0] === '$' && exprList.length > 1) { - exprList.shift(); - } - this._hasParentSelector = null; - const result = this._trace(exprList, json, ['$'], currParent, currParentProperty, callback).filter(function (ea) { - return ea && !ea.isParentSelector; - }); - if (!result.length) { - return wrap ? [] : undefined; - } - if (!wrap && result.length === 1 && !result[0].hasArrExpr) { - return this._getPreferredOutput(result[0]); +/** + * + */ +class JSONPathClass { + /** + * @overload + * @param {string} opts JSON path to evaluate + * @param {AnyInput} [expr] JSON object to evaluate against + * @param {JSONPathCallback} [obj] Passed 3 arguments: 1) desired + * payload per `resultType`, 2) `"value"|"property"`, 3) Full returned + * object with all payloads + * @param {OtherTypeCallback} [callback] If `@other()` is at the + * end of one's query, this will be invoked with the value of the item, + * its path, its parent, and its parent's property name, and it should + * return a boolean indicating whether the supplied value belongs to the + * "other" type or not (or it may handle transformations and return + * `false`). + * @param {undefined} [otherTypeCallback] + */ + /** + * @overload + * @param {JSONPathOptions} opts If a string, will be treated as + * `expr` + */ + /** + * @param {null|string|JSONPathOptions} opts If a string, will be treated as + * `expr` + * @param {string|AnyInput} [expr] JSON path to evaluate + * @param {AnyInput|JSONPathCallback} [obj] JSON object to evaluate against + * @param {JSONPathCallback|OtherTypeCallback} [callback] Passed 3 + * arguments: 1) desired payload per `resultType`, + * 2) `"value"|"property"`, 3) Full returned + * object with all payloads + * @param {OtherTypeCallback} [otherTypeCallback] If `@other()` is at the + * end of one's query, this will be invoked with the value of the item, + * its path, its parent, and its parent's property name, and it should + * return a boolean indicating whether the supplied value belongs to the + * "other" type or not (or it may handle transformations and return + * `false`). + */ + constructor(opts, expr, obj, callback, otherTypeCallback) { + if (typeof opts === 'string') { + otherTypeCallback = /** @type {OtherTypeCallback} */ + callback; + callback = /** @type {JSONPathCallback} */ + obj; + obj = expr; + expr = opts; + opts = null; + } + const optObj = opts && typeof opts === 'object'; + opts ||= /** @type {JSONPathOptions} */{}; + /** @type {ResultType|undefined} */ + this.currResultType = undefined; + + /** @type {EvalValue|undefined} */ + this.currEval = undefined; + + /** @type {OtherTypeCallback|undefined} */ + this.currOtherTypeCallback = undefined; + + /** @type {SandboxType|undefined} */ + this.currSandbox = undefined; + this._hasParentSelector = false; + this.json = opts.json || obj; + this.path = opts.path || expr; + this.resultType = opts.resultType || 'value'; + this.flatten = Object.hasOwn(opts, 'flatten') ? opts.flatten : false; + this.wrap = Object.hasOwn(opts, 'wrap') ? opts.wrap : true; + this.sandbox = opts.sandbox || {}; + this.eval = opts.eval === undefined ? 'safe' : opts.eval; + this.ignoreEvalErrors = typeof opts.ignoreEvalErrors === 'undefined' ? false : opts.ignoreEvalErrors; + this.parent = Object.hasOwn(opts, 'parent') ? opts.parent : null; + this.parentProperty = Object.hasOwn(opts, 'parentProperty') ? opts.parentProperty : null; + this.callback = opts.callback || (/** @type {JSONPathCallback} */ + callback) || null; + this.otherTypeCallback = opts.otherTypeCallback || otherTypeCallback || function () { + throw new TypeError('You must supply an otherTypeCallback callback option ' + 'with the @other() operator.'); + }; + if (opts.autostart !== false) { + const args = /** @type {JSONPathOptions} */{ + path: optObj ? opts.path : expr + }; + if (!optObj && obj !== undefined) { + args.json = obj; + } else if ('json' in opts) { + args.json = opts.json; + } + const ret = this.evaluate(args); + if (!ret || typeof ret !== 'object') { + const err = /** @type {Error & {value: UnknownResult}} */ + new Error('JSONPath should not be called with "new" (it ' + 'prevents return of (unwrapped) scalar values)'); + err.value = ret; + throw err; + } + + // eslint-disable-next-line @stylistic/max-len -- Long + // @ts-expect-error - Constructor returns evaluate result for legacy API + // eslint-disable-next-line no-constructor-return -- Legacy API + return ret; + } } - return result.reduce((rslt, ea) => { - const valOrPath = this._getPreferredOutput(ea); - if (flatten && Array.isArray(valOrPath)) { - rslt = rslt.concat(valOrPath); + + // PUBLIC METHODS + + /** + * @overload + * @param {JSONPathOptions} [expr] + * @returns {ReturnObject|ReturnObject[]|undefined|unknown} + */ + + /** + * @overload + * @param {PathType|undefined} [expr] + * @param {AnyInput} [json] + * @param {JSONPathCallback|null} [callback] + * @param {OtherTypeCallback} [otherTypeCallback] + * @returns {ReturnObject|ReturnObject[]|undefined|unknown} + */ + + /** + * @param {PathType|JSONPathOptions|undefined} [expr] + * @param {AnyInput} [json] + * @param {JSONPathCallback|null} [callback] + * @param {OtherTypeCallback} [otherTypeCallback] + * @returns {ReturnObject|ReturnObject[]|undefined|unknown} + */ + evaluate(expr, json, callback, otherTypeCallback) { + let currParent = this.parent, + currParentProperty = this.parentProperty; + let { + flatten, + wrap + } = this; + this.currResultType = this.resultType; + this.currEval = this.eval; + this.currSandbox = this.sandbox; + callback ||= this.callback; + this.currOtherTypeCallback = otherTypeCallback || this.otherTypeCallback; + if (expr && typeof expr === 'object' && !Array.isArray(expr)) { + const exprObj = expr; + if (!exprObj.path && exprObj.path !== '') { + throw new TypeError('You must supply a "path" property when providing an ' + 'object argument to JSONPath.evaluate().'); + } + if (!Object.hasOwn(exprObj, 'json')) { + throw new TypeError('You must supply a "json" property when providing an ' + 'object argument to JSONPath.evaluate().'); + } + ({ + json + } = exprObj); + flatten = Object.hasOwn(exprObj, 'flatten') ? exprObj.flatten : flatten; + this.currResultType = Object.hasOwn(exprObj, 'resultType') ? exprObj.resultType : this.currResultType; + this.currSandbox = Object.hasOwn(exprObj, 'sandbox') ? exprObj.sandbox : this.currSandbox; + wrap = Object.hasOwn(exprObj, 'wrap') ? exprObj.wrap : wrap; + this.currEval = Object.hasOwn(exprObj, 'eval') ? exprObj.eval : this.currEval; + callback = Object.hasOwn(exprObj, 'callback') ? exprObj.callback : callback; + this.currOtherTypeCallback = Object.hasOwn(exprObj, 'otherTypeCallback') ? exprObj.otherTypeCallback : this.currOtherTypeCallback; + currParent = Object.hasOwn(exprObj, 'parent') ? exprObj.parent : currParent; + currParentProperty = Object.hasOwn(exprObj, 'parentProperty') ? exprObj.parentProperty : currParentProperty; + expr = exprObj.path; } else { - rslt.push(valOrPath); + json ||= this.json; + expr ||= this.path; } - return rslt; - }, []); -}; + currParent ||= null; + currParentProperty ||= null; + if (Array.isArray(expr)) { + expr = JSONPath.toPathString(expr); + } + if (!json || !expr && expr !== '') { + return undefined; + } + const exprList = JSONPath.toPathArray(/** @type {string} */ + expr); + if (exprList[0] === '$' && exprList.length > 1) { + exprList.shift(); + } + this._hasParentSelector = false; + const traceResult = this._trace(exprList, json, ['$'], currParent, currParentProperty, callback ?? undefined, undefined); -// PRIVATE METHODS - -JSONPath.prototype._getPreferredOutput = function (ea) { - const resultType = this.currResultType; - switch (resultType) { - case 'all': - { - const path = Array.isArray(ea.path) ? ea.path : JSONPath.toPathArray(ea.path); - ea.pointer = JSONPath.toPointer(path); - ea.path = typeof ea.path === 'string' ? ea.path : JSONPath.toPathString(ea.path); - return ea; + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next 2 -- Unreachable: _trace returns array when hasArrExpr set */ + const result = (Array.isArray(traceResult) ? traceResult : [traceResult]).filter(ea => { + return ea && !ea.isParentSelector; + }); + if (!result.length) { + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next -- Unreachable: valid queries always produce results */ + return wrap ? [] : undefined; + } + if (!wrap && result.length === 1 && !result[0].hasArrExpr) { + const preferredOutput = this._getPreferredOutput(result[0]); + return preferredOutput; + } + const reduced = result.reduce((rslt, ea) => { + const valOrPath = this._getPreferredOutput(ea); + if (flatten && Array.isArray(valOrPath)) { + rslt = rslt.concat(valOrPath); + } else { + rslt.push(valOrPath); } - case 'value': - case 'parent': - case 'parentProperty': - return ea[resultType]; - case 'path': - return JSONPath.toPathString(ea[resultType]); - case 'pointer': - return JSONPath.toPointer(ea.path); - default: - throw new TypeError('Unknown result type'); + return rslt; + }, /** @type {UnknownResult[]} */ + []); + return reduced; } -}; -JSONPath.prototype._handleCallback = function (fullRetObj, callback, type) { - if (callback) { - const preferredOutput = this._getPreferredOutput(fullRetObj); - fullRetObj.path = typeof fullRetObj.path === 'string' ? fullRetObj.path : JSONPath.toPathString(fullRetObj.path); - // eslint-disable-next-line n/callback-return -- No need to return - callback(preferredOutput, type, fullRetObj); - } -}; -/** - * - * @param {string} expr - * @param {JSONObject} val - * @param {string} path - * @param {object|GenericArray} parent - * @param {string} parentPropName - * @param {JSONPathCallback} callback - * @param {boolean} hasArrExpr - * @param {boolean} literalPriority - * @returns {ReturnObject|ReturnObject[]} - */ -JSONPath.prototype._trace = function (expr, val, path, parent, parentPropName, callback, hasArrExpr, literalPriority) { - // No expr to follow? return path and value as the result of - // this trace branch - let retObj; - if (!expr.length) { - retObj = { - path, - value: val, - parent, - parentProperty: parentPropName, - hasArrExpr - }; - this._handleCallback(retObj, callback, 'value'); - return retObj; + // PRIVATE METHODS + + /** + * @param {ReturnObject} ea + * @returns {PreferredOutput} + */ + _getPreferredOutput(ea) { + const resultType = this.currResultType; + switch (resultType) { + case 'all': + { + const path = Array.isArray(ea.path) ? ea.path : JSONPath.toPathArray(ea.path); + ea.pointer = JSONPath.toPointer(/** @type {string[]} */path); + ea.path = typeof ea.path === 'string' ? ea.path : JSONPath.toPathString(/** @type {string[]} */ea.path); + return ea; + } + case 'value': + case 'parent': + case 'parentProperty': + return /** @type {PreferredOutput} */ea[resultType]; + case 'path': + if (typeof ea.path === 'string') { + return ea.path; + } + return JSONPath.toPathString(/** @type {string[]} */ea.path); + case 'pointer': + { + const pathArray = Array.isArray(ea.path) ? ea.path : JSONPath.toPathArray(ea.path); + return JSONPath.toPointer(/** @type {string[]} */pathArray); + } + default: + throw new TypeError('Unknown result type'); + } } - const loc = expr[0], - x = expr.slice(1); - // We need to gather the return value of recursive trace calls in order to - // do the parent sel computation. - const ret = []; /** - * - * @param {ReturnObject|ReturnObject[]} elems + * @param {ReturnObject} fullRetObj + * @param {JSONPathCallback|undefined} callback + * @param {"value"|"property"} type * @returns {void} */ - function addRet(elems) { - if (Array.isArray(elems)) { - // This was causing excessive stack size in Node (with or - // without Babel) against our performance test: - // `ret.push(...elems);` - elems.forEach(t => { - ret.push(t); - }); - } else { - ret.push(elems); + _handleCallback(fullRetObj, callback, type) { + // Early return if no callback provided (defensive + // check for internal calls) + if (!callback) { + return; } + const preferredOutput = this._getPreferredOutput(fullRetObj); + if (Array.isArray(fullRetObj.path)) { + fullRetObj.path = JSONPath.toPathString(/** @type {string[]} */fullRetObj.path); + } + callback(preferredOutput, type, fullRetObj); } - if ((typeof loc !== 'string' || literalPriority) && val && Object.hasOwn(val, loc)) { - // simple case--directly follow property - addRet(this._trace(x, val[loc], push(path, loc), val, loc, callback, hasArrExpr)); - // eslint-disable-next-line unicorn/prefer-switch -- Part of larger `if` - } else if (loc === '*') { - // all child properties - this._walk(val, m => { - addRet(this._trace(x, val[m], push(path, m), val, m, callback, true, true)); - }); - } else if (loc === '..') { - // all descendent parent properties - // Check remaining expression with val's immediate children - addRet(this._trace(x, val, path, parent, parentPropName, callback, hasArrExpr)); - this._walk(val, m => { - // We don't join m and x here because we only want parents, - // not scalar values - if (typeof val[m] === 'object') { - // Keep going with recursive descent on val's - // object children - addRet(this._trace(expr.slice(), val[m], push(path, m), val, m, callback, true)); + + /** + * + * @param {ExpressionArray} expr + * @param {unknown} val + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {ParentProperty} parentPropName + * @param {JSONPathCallback|undefined} callback + * @param {boolean|undefined} hasArrExpr + * @param {boolean} [literalPriority] + * @returns {ReturnObject|ReturnObject[]} + */ + _trace(expr, val, path, parent, parentPropName, callback, hasArrExpr, literalPriority) { + // No expr to follow? return path and value as the result of + // this trace branch + let retObj; + if (!expr.length) { + retObj = { + path, + value: val, + parent, + parentProperty: parentPropName, + hasArrExpr + }; + this._handleCallback(retObj, callback, 'value'); + return retObj; + } + const loc = /** @type {string} */expr[0], + x = expr.slice(1); + + // We need to gather the return value of recursive trace calls in order + // to do the parent sel computation. + /** @type {ReturnObject[]} */ + const ret = []; + /** + * + * @param {ReturnObject|ReturnObject[]} elems + * @returns {void} + */ + function addRet(elems) { + if (Array.isArray(elems)) { + // This was causing excessive stack size in Node (with or + // without Babel) against our performance test: + // `ret.push(...elems);` + elems.forEach(t => { + ret.push(t); + }); + } else { + ret.push(elems); } - }); - // The parent sel computation is handled in the frame above using the - // ancestor object of val - } else if (loc === '^') { - // This is not a final endpoint, so we do not invoke the callback here - this._hasParentSelector = true; - return { - path: path.slice(0, -1), - expr: x, - isParentSelector: true - }; - } else if (loc === '~') { - // property name - retObj = { - path: push(path, loc), - value: parentPropName, - parent, - parentProperty: null - }; - this._handleCallback(retObj, callback, 'property'); - return retObj; - } else if (loc === '$') { - // root only - addRet(this._trace(x, val, path, null, null, callback, hasArrExpr)); - } else if (/^(-?\d*):(-?\d*):?(\d*)$/u.test(loc)) { - // [start:end:step] Python slice syntax - addRet(this._slice(loc, x, val, path, parent, parentPropName, callback)); - } else if (loc.indexOf('?(') === 0) { - // [?(expr)] (filtering) - if (this.currEval === false) { - throw new Error('Eval [?(expr)] prevented in JSONPath expression.'); - } - const safeLoc = loc.replace(/^\?\((.*?)\)$/u, '$1'); - // check for a nested filter expression - const nested = /@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu.exec(safeLoc); - if (nested) { - // find if there are matches in the nested expression - // add them to the result set if there is at least one match + } + if (val && (typeof loc !== 'string' || literalPriority) && Object.hasOwn(val, /** @type {PropertyKey} */loc)) { + // simple case--directly follow property + const valObj = /** @type {Record} */val; + addRet(this._trace(x, valObj[(/** @type {string} */loc)], push(path, loc), val, /** @type {string|number} */loc, callback, hasArrExpr)); + // eslint-disable-next-line unicorn/prefer-switch -- Part of larger `if` + } else if (loc === '*') { + // all child properties this._walk(val, m => { - const npath = [nested[2]]; - const nvalue = nested[1] ? val[m][nested[1]] : val[m]; - const filterResults = this._trace(npath, nvalue, path, parent, parentPropName, callback, true); - if (filterResults.length > 0) { - addRet(this._trace(x, val[m], push(path, m), val, m, callback, true)); - } + const valObj = /** @type {Record} */val; + addRet(this._trace(x, valObj[m], push(path, m), val, m, callback, true, true)); }); - } else { + } else if (loc === '..') { + // all descendent parent properties + // Check remaining expression with val's immediate children + addRet(this._trace(x, val, path, parent, parentPropName, callback, hasArrExpr)); this._walk(val, m => { - if (this._eval(safeLoc, val[m], m, path, parent, parentPropName)) { - addRet(this._trace(x, val[m], push(path, m), val, m, callback, true)); + // We don't join m and x here because we only want parents, + // not scalar values + const valObj = /** @type {Record} */val; + if (typeof valObj[m] === 'object') { + // Keep going with recursive descent on val's + // object children + addRet(this._trace(expr.slice(), valObj[m], push(path, m), val, m, callback, true)); } }); - } - } else if (loc[0] === '(') { - // [(expr)] (dynamic property/index) - if (this.currEval === false) { - throw new Error('Eval [(expr)] prevented in JSONPath expression.'); - } - // As this will resolve to a property name (but we don't know it - // yet), property and parent information is relative to the - // parent of the property to which this expression will resolve - addRet(this._trace(unshift(this._eval(loc, val, path.at(-1), path.slice(0, -1), parent, parentPropName), x), val, path, parent, parentPropName, callback, hasArrExpr)); - } else if (loc[0] === '@') { - // value type: @boolean(), etc. - let addType = false; - const valueType = loc.slice(1, -2); - switch (valueType) { - case 'scalar': - if (!val || !['object', 'function'].includes(typeof val)) { - addType = true; - } - break; - case 'boolean': - case 'string': - case 'undefined': - case 'function': - if (typeof val === valueType) { - addType = true; - } - break; - case 'integer': - if (Number.isFinite(val) && !(val % 1)) { - addType = true; - } - break; - case 'number': - if (Number.isFinite(val)) { - addType = true; - } - break; - case 'nonFinite': - if (typeof val === 'number' && !Number.isFinite(val)) { - addType = true; - } - break; - case 'object': - if (val && typeof val === valueType) { - addType = true; - } - break; - case 'array': - if (Array.isArray(val)) { - addType = true; - } - break; - case 'other': - addType = this.currOtherTypeCallback(val, path, parent, parentPropName); - break; - case 'null': - if (val === null) { - addType = true; - } - break; - /* c8 ignore next 2 */ - default: - throw new TypeError('Unknown value type ' + valueType); - } - if (addType) { + // The parent sel computation is handled in the frame above using the + // ancestor object of val + } else if (loc === '^') { + // This is not a final endpoint, so we do not invoke the + // callback here + this._hasParentSelector = true; + return /** @type {ReturnObject} */{ + path: path.slice(0, -1), + expr: x, + isParentSelector: true, + value: undefined, + parent: undefined, + parentProperty: null + }; + } else if (loc === '~') { + // property name retObj = { - path, - value: val, + path: push(path, loc), + value: parentPropName, parent, - parentProperty: parentPropName + parentProperty: null }; - this._handleCallback(retObj, callback, 'value'); + this._handleCallback(retObj, callback, 'property'); return retObj; + } else if (loc === '$') { + // root only + addRet(this._trace(x, val, path, null, null, callback, hasArrExpr)); + } else if (/^(-?\d*):(-?\d*):?(\d*)$/u.test(loc)) { + // [start:end:step] Python slice syntax + const sliceResult = this._slice(loc, x, val, path, parent, parentPropName, callback); + if (sliceResult) { + addRet(sliceResult); + } + } else if (loc.indexOf('?(') === 0) { + // [?(expr)] (filtering) + if (this.currEval === false) { + throw new Error('Eval [?(expr)] prevented in JSONPath expression.'); + } + const safeLoc = loc.replace(/^\?\((.*?)\)$/u, '$1'); + // check for a nested filter expression + + const nested = /@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu.exec(safeLoc); + if (nested) { + // find if there are matches in the nested expression + // add them to the result set if there is at least one match + this._walk(val, m => { + const npath = [nested[2]]; + const valObj2 = /** @type {Record} */ + val; + const nvalue = /** @type {ValueType} */nested[1] ? /** @type {Record} */valObj2[m][nested[1]] : valObj2[m]; + const filterResults = this._trace(npath, nvalue, path, parent, parentPropName, callback, true); + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next 3 -- Unreachable: _trace always returns array for nested filters */ + const filterArray = Array.isArray(filterResults) ? filterResults : [filterResults]; + if (filterArray.length > 0) { + addRet(this._trace(x, valObj2[m], push(path, m), val, m, callback, true)); + } + }); + } else { + const valObj3 = /** @type {Record} */val; + this._walk(val, m => { + if (this._eval(safeLoc, valObj3[m], m, path, parent, parentPropName)) { + addRet(this._trace(x, valObj3[m], push(path, m), val, m, callback, true)); + } + }); + } + } else if (loc[0] === '(') { + // [(expr)] (dynamic property/index) + if (this.currEval === false) { + throw new Error('Eval [(expr)] prevented in JSONPath expression.'); + } + // As this will resolve to a property name (but we don't know it + // yet), property and parent information is relative to the + const evalResult = this._eval(/** @type {string} */loc, val, /** @type {string|number} */path.at(-1), path.slice(0, -1), parent, parentPropName); + const exprToUse = /** @type {string|number} */ + evalResult !== undefined ? evalResult : ''; + addRet(this._trace(unshift(exprToUse, x), val, path, parent, parentPropName, callback, hasArrExpr)); + } else if (loc[0] === '@') { + // value type: @boolean(), etc. + let addType = false; + const valueType = /** @type {ValueType} */loc.slice(1, -2); + switch (valueType) { + case 'scalar': + if (!val || !['object', 'function'].includes(typeof val)) { + addType = true; + } + break; + case 'boolean': + case 'string': + case 'undefined': + case 'function': + if (typeof val === valueType) { + addType = true; + } + break; + case 'integer': + if (Number.isFinite(val) && !(/** @type {number} */val % 1)) { + addType = true; + } + break; + case 'number': + if (Number.isFinite(val)) { + addType = true; + } + break; + case 'nonFinite': + if (typeof val === 'number' && !Number.isFinite(val)) { + addType = true; + } + break; + case 'object': + if (val && typeof val === valueType) { + addType = true; + } + break; + case 'array': + if (Array.isArray(val)) { + addType = true; + } + break; + case 'other': + addType = this.currOtherTypeCallback?.(val, path, parent, /** @type {string|null} */parentPropName) ?? false; + break; + case 'null': + if (val === null) { + addType = true; + } + break; + /* c8 ignore next 2 */ + default: + throw new TypeError('Unknown value type ' + valueType); + } + if (addType) { + retObj = { + path, + value: val, + parent, + parentProperty: parentPropName + }; + this._handleCallback(retObj, callback, 'value'); + return retObj; + } + // `-escaped property + } else if (val && loc[0] === '`' && Object.hasOwn(val, loc.slice(1))) { + const locProp = loc.slice(1); + const valObj = /** @type {Record} */val; + addRet(this._trace(x, valObj[locProp], push(path, locProp), val, locProp, callback, hasArrExpr, true)); + } else if (loc.includes(',')) { + // [name1,name2,...] + const parts = loc.split(','); + for (const part of parts) { + addRet(this._trace(unshift(part, x), val, path, parent, parentPropName, callback, true)); + } + // simple case--directly follow property + } else if (!literalPriority && val && Object.hasOwn(val, loc)) { + const valObj = /** @type {Record} */val; + addRet(this._trace(x, valObj[loc], push(path, loc), val, loc, callback, hasArrExpr, true)); } - // `-escaped property - } else if (loc[0] === '`' && val && Object.hasOwn(val, loc.slice(1))) { - const locProp = loc.slice(1); - addRet(this._trace(x, val[locProp], push(path, locProp), val, locProp, callback, hasArrExpr, true)); - } else if (loc.includes(',')) { - // [name1,name2,...] - const parts = loc.split(','); - for (const part of parts) { - addRet(this._trace(unshift(part, x), val, path, parent, parentPropName, callback, true)); - } - // simple case--directly follow property - } else if (!literalPriority && val && Object.hasOwn(val, loc)) { - addRet(this._trace(x, val[loc], push(path, loc), val, loc, callback, hasArrExpr, true)); - } - - // We check the resulting values for parent selections. For parent - // selections we discard the value object and continue the trace with the - // current val object - if (this._hasParentSelector) { - for (let t = 0; t < ret.length; t++) { - const rett = ret[t]; - if (rett && rett.isParentSelector) { - const tmp = this._trace(rett.expr, val, rett.path, parent, parentPropName, callback, hasArrExpr); - if (Array.isArray(tmp)) { - ret[t] = tmp[0]; - const tl = tmp.length; - for (let tt = 1; tt < tl; tt++) { - // eslint-disable-next-line @stylistic/max-len -- Long - // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient - t++; - ret.splice(t, 0, tmp[tt]); + + // We check the resulting values for parent selections. For parent + // selections we discard the value object and continue the trace with + // the current val object + if (this._hasParentSelector) { + for (let t = 0; t < ret.length; t++) { + const rett = ret[t]; + if (rett && rett.isParentSelector) { + const exprToUse = /** @type {ExpressionArray} */ + rett.expr; + const pathToUse = /** @type {ExpressionArray} */ + rett.path; + const tmp = this._trace(exprToUse, val, pathToUse, parent, parentPropName, callback, hasArrExpr); + if (Array.isArray(tmp)) { + ret[t] = tmp[0]; + const tl = tmp.length; + for (let tt = 1; tt < tl; tt++) { + t++; + ret.splice(t, 0, tmp[tt]); + } + } else { + ret[t] = tmp; } - } else { - ret[t] = tmp; } } } + return ret; } - return ret; -}; -JSONPath.prototype._walk = function (val, f) { - if (Array.isArray(val)) { - const n = val.length; - for (let i = 0; i < n; i++) { - f(i); - } - } else if (val && typeof val === 'object') { - Object.keys(val).forEach(m => { - f(m); - }); + + /** + * @param {unknown} val + * @param {(prop: string|number) => void} f + * @returns {void} + */ + _walk(val, f) { + if (Array.isArray(val)) { + const n = val.length; + for (let i = 0; i < n; i++) { + f(i); + } + } else if (val && typeof val === 'object') { + Object.keys(val).forEach(m => { + f(m); + }); + } } -}; -JSONPath.prototype._slice = function (loc, expr, val, path, parent, parentPropName, callback) { - if (!Array.isArray(val)) { - return undefined; - } - const len = val.length, - parts = loc.split(':'), - step = parts[2] && Number.parseInt(parts[2]) || 1; - let start = parts[0] && Number.parseInt(parts[0]) || 0, - end = parts[1] ? Number.parseInt(parts[1]) : len; - start = start < 0 ? Math.max(0, start + len) : Math.min(len, start); - end = end < 0 ? Math.max(0, end + len) : Math.min(len, end); - const ret = []; - for (let i = start; i < end; i += step) { - const tmp = this._trace(unshift(i, expr), val, path, parent, parentPropName, callback, true); - // Should only be possible to be an array here since first part of - // ``unshift(i, expr)` passed in above would not be empty, nor `~`, - // nor begin with `@` (as could return objects) - // This was causing excessive stack size in Node (with or - // without Babel) against our performance test: `ret.push(...tmp);` - tmp.forEach(t => { - ret.push(t); - }); + + /** + * @param {string} loc + * @param {ExpressionArray} expr + * @param {unknown} val + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {ParentProperty} parentPropName + * @param {JSONPathCallback|undefined} callback + * @returns {ReturnObject[]|undefined} + */ + _slice(loc, expr, val, path, parent, parentPropName, callback) { + if (!Array.isArray(val)) { + return undefined; + } + const len = val.length, + parts = loc.split(':'), + step = parts[2] && Number(parts[2]) || 1; + let start = parts[0] && Number(parts[0]) || 0, + end = parts[1] ? Number(parts[1]) : len; + start = start < 0 ? Math.max(0, start + len) : Math.min(len, start); + end = end < 0 ? Math.max(0, end + len) : Math.min(len, end); + /** @type {ReturnObject[]} */ + const ret = []; + for (let i = start; i < end; i += step) { + const tmp = this._trace(unshift(i, expr), val, path, parent, parentPropName, callback, true); + // Should only be possible to be an array here since first part of + // ``unshift(i, expr)` passed in above would not be empty, + // nor `~`, nor begin with `@` (as could return objects) + // This was causing excessive stack size in Node (with or + // without Babel) against our performance test: `ret.push(...tmp);` + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next -- Unreachable: _trace returns array when expr non-empty */ + const tmpArray = Array.isArray(tmp) ? tmp : [tmp]; + tmpArray.forEach(t => { + ret.push(t); + }); + } + return ret; } - return ret; -}; -JSONPath.prototype._eval = function (code, _v, _vname, path, parent, parentPropName) { - this.currSandbox._$_parentProperty = parentPropName; - this.currSandbox._$_parent = parent; - this.currSandbox._$_property = _vname; - this.currSandbox._$_root = this.json; - this.currSandbox._$_v = _v; - const containsPath = code.includes('@path'); - if (containsPath) { - this.currSandbox._$_path = JSONPath.toPathString(path.concat([_vname])); - } - const scriptCacheKey = this.currEval + 'Script:' + code; - if (!JSONPath.cache[scriptCacheKey]) { - let script = code.replaceAll('@parentProperty', '_$_parentProperty').replaceAll('@parent', '_$_parent').replaceAll('@property', '_$_property').replaceAll('@root', '_$_root').replaceAll(/@([.\s)[])/gu, '_$_v$1'); + + /** + * @param {string} code + * @param {unknown} _v + * @param {string|number} _vname + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {ParentProperty} parentPropName + * @returns {UnknownResult} + */ + _eval(code, _v, _vname, path, parent, parentPropName) { + if (this.currSandbox) { + this.currSandbox._$_parentProperty = parentPropName; + this.currSandbox._$_parent = parent; + this.currSandbox._$_property = _vname; + this.currSandbox._$_root = this.json; + this.currSandbox._$_v = _v; + } + const containsPath = code.includes('@path'); if (containsPath) { - script = script.replaceAll('@path', '_$_path'); - } - if (this.currEval === 'safe' || this.currEval === true || this.currEval === undefined) { - JSONPath.cache[scriptCacheKey] = new this.safeVm.Script(script); - } else if (this.currEval === 'native') { - JSONPath.cache[scriptCacheKey] = new this.vm.Script(script); - } else if (typeof this.currEval === 'function' && this.currEval.prototype && Object.hasOwn(this.currEval.prototype, 'runInNewContext')) { - const CurrEval = this.currEval; - JSONPath.cache[scriptCacheKey] = new CurrEval(script); - } else if (typeof this.currEval === 'function') { - JSONPath.cache[scriptCacheKey] = { - runInNewContext: context => this.currEval(script, context) - }; - } else { - throw new TypeError(`Unknown "eval" property "${this.currEval}"`); + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next -- Unreachable: currSandbox set in evaluate() before _eval */ + const currSandbox = this.currSandbox ?? {}; + currSandbox._$_path = JSONPath.toPathString(/** @type {string[]} */path.concat([_vname])); } - } - try { - return JSONPath.cache[scriptCacheKey].runInNewContext(this.currSandbox); - } catch (e) { - if (this.ignoreEvalErrors) { - return false; + const scriptCacheKey = this.currEval + 'Script:' + code; + if (!Object.hasOwn(JSONPath.cache, scriptCacheKey)) { + let script = code.replaceAll('@parentProperty', '_$_parentProperty').replaceAll('@parent', '_$_parent').replaceAll('@property', '_$_property').replaceAll('@root', '_$_root').replaceAll(/@([.\s)[])/gu, '_$_v$1'); + if (containsPath) { + script = script.replaceAll('@path', '_$_path'); + } + const evalType = /** @type {string|boolean|undefined} */ + this.currEval; + if (['safe', true, undefined].includes(evalType)) { + const { + cache + } = JSONPath; + // eslint-disable-next-line @stylistic/max-len -- Long + /* eslint-disable unicorn/no-undeclared-class-members -- Prototype members */ + cache[scriptCacheKey] = new ( + /** + * @type {JSONPathClass & { + * safeVm: SafeScriptType, + * vm: ScriptType + * }} + */ /** @type {unknown} */ + this).safeVm.Script(script); + // eslint-disable-next-line @stylistic/max-len -- Long + /* eslint-enable unicorn/no-undeclared-class-members -- End prototype member scope */ + } else if (this.currEval === 'native') { + const { + cache + } = JSONPath; + // eslint-disable-next-line @stylistic/max-len -- Long + /* eslint-disable unicorn/no-undeclared-class-members -- Prototype members */ + cache[scriptCacheKey] = new ( + /** + * @type {JSONPathClass & { + * safeVm: SafeScriptType, + * vm: ScriptType + * }} + */ /** @type {unknown} */ + this).vm.Script(script); + // eslint-disable-next-line @stylistic/max-len -- Long + /* eslint-enable unicorn/no-undeclared-class-members -- End prototype member scope */ + } else if (typeof this.currEval === 'function' && this.currEval.prototype && Object.hasOwn(this.currEval.prototype, 'runInNewContext')) { + const CurrEval = this.currEval; + const { + cache + } = JSONPath; + // eslint-disable-next-line @stylistic/max-len -- Long + // @ts-expect-error - Type checked above to have proper constructor + cache[scriptCacheKey] = new CurrEval(script); + } else if (typeof this.currEval === 'function') { + const { + cache + } = JSONPath; + // Type narrowing: at this point currEval is a function + // but not a constructor + const evalFunc = /** @type {EvalCallback} */this.currEval; + cache[scriptCacheKey] = { + runInNewContext: (/** @type {ContextItem} */context) => evalFunc(script, context) + }; + } else { + throw new TypeError(`Unknown "eval" property "${this.currEval}"`); + } + } + try { + const { + cache + } = JSONPath; + + /** + * @typedef {{ + * runInNewContext: ( + * ctx: SandboxType|undefined + * ) => EvaluatedResult + * }} RunInNewContext + */ + + return /** @type {RunInNewContext} */cache[scriptCacheKey].runInNewContext(this.currSandbox); + } catch (e) { + if (this.ignoreEvalErrors) { + return false; + } + const error = /** @type {Error} */e; + throw new Error('jsonPath: ' + error.message + ': ' + code, { + cause: e + }); } - throw new Error('jsonPath: ' + e.message + ': ' + code); } +} + +/** @type {{safeVm: SafeScriptType}} */ +(/** @type {unknown} */JSONPathClass.prototype).safeVm = { + Script: SafeScript }; +JSONPath.prototype = JSONPathClass.prototype; // PUBLIC CLASS PROPERTIES AND METHODS // Could store the cache object itself + +/** @type {Record} */ JSONPath.cache = {}; /** @@ -1998,7 +2425,7 @@ JSONPath.toPathString = function (pathArr) { }; /** - * @param {string} pointer JSON Path + * @param {string[]} pointer JSON Path array * @returns {string} JSON Pointer */ JSONPath.toPointer = function (pointer) { @@ -2021,9 +2448,10 @@ JSONPath.toPathArray = function (expr) { const { cache } = JSONPath; - if (cache[expr]) { - return cache[expr].concat(); + if (Object.hasOwn(cache, expr)) { + return /** @type {string[]} */cache[expr].concat(); } + /** @type {string[]} */ const subx = []; const normalized = expr // Properties @@ -2031,7 +2459,10 @@ JSONPath.toPathArray = function (expr) { // Parenthetical evaluations (filtering and otherwise), directly // within brackets or single quotes .replaceAll(/[['](\??\(.*?\))[\]'](?!.\])/gu, function ($0, $1) { - return '[#' + (subx.push($1) - 1) + ']'; + return '[#' + ( + // eslint-disable-next-line @stylistic/max-len -- Long + // eslint-disable-next-line unicorn/no-return-array-push -- Optimization + subx.push($1) - 1) + ']'; }) // Escape periods and tildes within properties .replaceAll(/\[['"]([^'\]]*)['"]\]/gu, function ($0, prop) { @@ -2055,34 +2486,95 @@ JSONPath.toPathArray = function (expr) { .replaceAll(/;$|'?\]|'$/gu, ''); const exprList = normalized.split(';').map(function (exp) { const match = exp.match(/#(\d+)/u); - return !match || !match[1] ? exp : subx[match[1]]; + return !match || !match[1] ? exp : subx[Number(match[1])]; }); cache[expr] = exprList; - return cache[expr].concat(); -}; -JSONPath.prototype.safeVm = { - Script: SafeScript + return /** @type {string[]} */cache[expr].concat(); }; /** - * @typedef {any} ContextItem + * @typedef {import('./jsonpath.js').AnyInput} AnyInput */ - /** - * @typedef {any} EvaluatedResult + * @typedef {import('./jsonpath.js').SandboxCallback} SandboxCallback + */ +/** + * @typedef {import('./jsonpath.js').SandboxPropertyValue} SandboxPropertyValue + */ +/** + * @typedef {import('./jsonpath.js').ExpressionArray} ExpressionArray + */ +/** + * @typedef {import('./jsonpath.js').ValueType} ValueType + */ +/** + * @typedef {import('./jsonpath.js').ParentValue} ParentValue + */ +/** + * @typedef {import('./jsonpath.js').UnknownResult} UnknownResult + */ +/** + * @typedef {import('./jsonpath.js').ParentProperty} ParentProperty + */ +/** + * @typedef {import('./jsonpath.js').PreferredOutput} PreferredOutput + */ +/** + * @typedef {import('./jsonpath.js').ReturnObject} ReturnObject + */ +/** + * @typedef {import('./jsonpath.js').JSONPathCallback} JSONPathCallback + */ +/** + * @typedef {import('./jsonpath.js').OtherTypeCallback} OtherTypeCallback + */ +/** + * @typedef {import('./jsonpath.js').ContextItem} ContextItem + */ +/** + * @typedef {import('./jsonpath.js').EvaluatedResult} EvaluatedResult + */ +/** + * @typedef {import('./jsonpath.js').EvalCallback} EvalCallback + */ +/** + * @typedef {import('./jsonpath.js').EvalClass} EvalClass + */ +/** + * @typedef {import('./jsonpath.js').ResultType} ResultType + */ +/** + * @typedef {import('./jsonpath.js').EvalValue} EvalValue + */ +/** + * @typedef {import('./jsonpath.js').PathType} PathType + */ +/** + * @typedef {import('./jsonpath.js').SafeScriptType} SafeScriptType + */ +/** + * @typedef {import('./jsonpath.js').ScriptType} ScriptType + */ +/** + * @typedef {import('./jsonpath.js').SandboxType} SandboxType + */ +/** + * @typedef {import('./jsonpath.js').JSONPathOptions} JSONPathOptions */ /** + * @template T * @callback ConditionCallback - * @param {ContextItem} item + * @param {T} item * @returns {boolean} */ /** * Copy items out of one array into another. - * @param {GenericArray} source Array with items to copy - * @param {GenericArray} target Array to which to copy - * @param {ConditionCallback} conditionCb Callback passed the current item; + * @template T + * @param {T[]} source Array with items to copy + * @param {T[]} target Array to which to copy + * @param {ConditionCallback} conditionCb Callback passed the current item; * will move item if evaluates to `true` * @returns {void} */ @@ -2091,8 +2583,6 @@ const moveToAnotherArray = function (source, target, conditionCb) { for (let i = 0; i < il; i++) { const item = source[i]; if (conditionCb(item)) { - // eslint-disable-next-line @stylistic/max-len -- Long - // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient target.push(source.splice(i--, 1)[0]); } } @@ -2110,14 +2600,14 @@ class Script { } /** - * @param {object} context Object whose items will be added + * @param {SandboxType} context Object whose items will be added * to evaluation * @returns {EvaluatedResult} Result of evaluated code */ runInNewContext(context) { let expr = this.code; const keys = Object.keys(context); - const funcs = []; + const funcs = /** @type {string[]} */[]; moveToAnotherArray(keys, funcs, key => { return typeof context[key] === 'function'; }); @@ -2133,7 +2623,7 @@ class Script { }, ''); expr = funcString + expr; - // Mitigate http://perfectionkills.com/global-eval-what-are-the-options/#new_function + // Mitigate https://perfectionkills.com/global-eval-what-are-the-options/#new_function if (!/(['"])use strict\1/u.test(expr) && !keys.includes('arguments')) { expr = 'var arguments = undefined;' + expr; } @@ -2151,8 +2641,10 @@ class Script { return new Function(...keys, code)(...values); } } -JSONPath.prototype.vm = { + +/** @type {{vm: ScriptType}} */ +(/** @type {unknown} */JSONPathClass.prototype).vm = { Script }; -export { JSONPath }; +export { JSONPath, JSONPathClass, Script }; diff --git a/dist/index-browser-esm.min.js b/dist/index-browser-esm.min.js index 6f1ab94d..1368b398 100644 --- a/dist/index-browser-esm.min.js +++ b/dist/index-browser-esm.min.js @@ -1,2 +1,2 @@ -class e{static get version(){return"1.4.0"}static toString(){return"JavaScript Expression Parser (JSEP) v"+e.version}static addUnaryOp(t){return e.max_unop_len=Math.max(t.length,e.max_unop_len),e.unary_ops[t]=1,e}static addBinaryOp(t,r,s){return e.max_binop_len=Math.max(t.length,e.max_binop_len),e.binary_ops[t]=r,s?e.right_associative.add(t):e.right_associative.delete(t),e}static addIdentifierChar(t){return e.additional_identifier_chars.add(t),e}static addLiteral(t,r){return e.literals[t]=r,e}static removeUnaryOp(t){return delete e.unary_ops[t],t.length===e.max_unop_len&&(e.max_unop_len=e.getMaxKeyLen(e.unary_ops)),e}static removeAllUnaryOps(){return e.unary_ops={},e.max_unop_len=0,e}static removeIdentifierChar(t){return e.additional_identifier_chars.delete(t),e}static removeBinaryOp(t){return delete e.binary_ops[t],t.length===e.max_binop_len&&(e.max_binop_len=e.getMaxKeyLen(e.binary_ops)),e.right_associative.delete(t),e}static removeAllBinaryOps(){return e.binary_ops={},e.max_binop_len=0,e}static removeLiteral(t){return delete e.literals[t],e}static removeAllLiterals(){return e.literals={},e}get char(){return this.expr.charAt(this.index)}get code(){return this.expr.charCodeAt(this.index)}constructor(e){this.expr=e,this.index=0}static parse(t){return new e(t).parse()}static getMaxKeyLen(e){return Math.max(0,...Object.keys(e).map(e=>e.length))}static isDecimalDigit(e){return e>=48&&e<=57}static binaryPrecedence(t){return e.binary_ops[t]||0}static isIdentifierStart(t){return t>=65&&t<=90||t>=97&&t<=122||t>=128&&!e.binary_ops[String.fromCharCode(t)]||e.additional_identifier_chars.has(String.fromCharCode(t))}static isIdentifierPart(t){return e.isIdentifierStart(t)||e.isDecimalDigit(t)}throwError(e){const t=new Error(e+" at character "+this.index);throw t.index=this.index,t.description=e,t}runHook(t,r){if(e.hooks[t]){const s={context:this,node:r};return e.hooks.run(t,s),s.node}return r}searchHook(t){if(e.hooks[t]){const r={context:this};return e.hooks[t].find(function(e){return e.call(r.context,r),r.node}),r.node}}gobbleSpaces(){let t=this.code;for(;t===e.SPACE_CODE||t===e.TAB_CODE||t===e.LF_CODE||t===e.CR_CODE;)t=this.expr.charCodeAt(++this.index);this.runHook("gobble-spaces")}parse(){this.runHook("before-all");const t=this.gobbleExpressions(),r=1===t.length?t[0]:{type:e.COMPOUND,body:t};return this.runHook("after-all",r)}gobbleExpressions(t){let r,s,n=[];for(;this.index0;){if(e.binary_ops.hasOwnProperty(t)&&(!e.isIdentifierStart(this.code)||this.index+t.lengthi.right_a&&e.right_a?s>e.prec:s<=e.prec;for(;n.length>2&&h(n[n.length-2]);)a=n.pop(),r=n.pop().value,o=n.pop(),t={type:e.BINARY_EXP,operator:r,left:o,right:a},n.push(t);t=this.gobbleToken(),t||this.throwError("Expected expression after "+l),n.push(i,t)}for(h=n.length-1,t=n[h];h>1;)t={type:e.BINARY_EXP,operator:n[h-1].value,left:n[h-2],right:t},h-=2;return t}gobbleToken(){let t,r,s,n;if(this.gobbleSpaces(),n=this.searchHook("gobble-token"),n)return this.runHook("after-token",n);if(t=this.code,e.isDecimalDigit(t)||t===e.PERIOD_CODE)return this.gobbleNumericLiteral();if(t===e.SQUOTE_CODE||t===e.DQUOTE_CODE)n=this.gobbleStringLiteral();else if(t===e.OBRACK_CODE)n=this.gobbleArray();else{for(r=this.expr.substr(this.index,e.max_unop_len),s=r.length;s>0;){if(e.unary_ops.hasOwnProperty(r)&&(!e.isIdentifierStart(this.code)||this.index+r.length=r.length&&this.throwError("Unexpected token "+String.fromCharCode(t));break}if(i===e.COMMA_CODE){if(this.index++,n++,n!==r.length)if(t===e.CPAREN_CODE)this.throwError("Unexpected token ,");else if(t===e.CBRACK_CODE)for(let e=r.length;e{if("object"!=typeof e||!e.name||!e.init)throw new Error("Invalid JSEP plugin format");this.registered[e.name]||(e.init(this.jsep),this.registered[e.name]=e)})}}(e),COMPOUND:"Compound",SEQUENCE_EXP:"SequenceExpression",IDENTIFIER:"Identifier",MEMBER_EXP:"MemberExpression",LITERAL:"Literal",THIS_EXP:"ThisExpression",CALL_EXP:"CallExpression",UNARY_EXP:"UnaryExpression",BINARY_EXP:"BinaryExpression",ARRAY_EXP:"ArrayExpression",TAB_CODE:9,LF_CODE:10,CR_CODE:13,SPACE_CODE:32,PERIOD_CODE:46,COMMA_CODE:44,SQUOTE_CODE:39,DQUOTE_CODE:34,OPAREN_CODE:40,CPAREN_CODE:41,OBRACK_CODE:91,CBRACK_CODE:93,QUMARK_CODE:63,SEMCOL_CODE:59,COLON_CODE:58,unary_ops:{"-":1,"!":1,"~":1,"+":1},binary_ops:{"||":1,"??":1,"&&":2,"|":3,"^":4,"&":5,"==":6,"!=":6,"===":6,"!==":6,"<":7,">":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10,"**":11},right_associative:new Set(["**"]),additional_identifier_chars:new Set(["$","_"]),literals:{true:!0,false:!1,null:null},this_str:"this"}),e.max_unop_len=e.getMaxKeyLen(e.unary_ops),e.max_binop_len=e.getMaxKeyLen(e.binary_ops);const r=t=>new e(t).parse(),s=Object.getOwnPropertyNames(class{});Object.getOwnPropertyNames(e).filter(e=>!s.includes(e)&&void 0===r[e]).forEach(t=>{r[t]=e[t]}),r.Jsep=e;var n={name:"ternary",init(e){e.hooks.add("after-expression",function(t){if(t.node&&this.code===e.QUMARK_CODE){this.index++;const r=t.node,s=this.gobbleExpression();if(s||this.throwError("Expected expression"),this.gobbleSpaces(),this.code===e.COLON_CODE){this.index++;const n=this.gobbleExpression();if(n||this.throwError("Expected expression"),t.node={type:"ConditionalExpression",test:r,consequent:s,alternate:n},r.operator&&e.binary_ops[r.operator]<=.9){let s=r;for(;s.right.operator&&e.binary_ops[s.right.operator]<=.9;)s=s.right;t.node.test=s.right,s.right=t.node,t.node=r}}else this.throwError("Expected :")}})}};r.plugins.register(n);var i={name:"regex",init(e){e.hooks.add("gobble-token",function(t){if(47===this.code){const r=++this.index;let s=!1;for(;this.index=97&&e<=122||e>=65&&e<=90||e>=48&&e<=57))break;i+=this.char}try{n=new RegExp(s,i)}catch(e){this.throwError(e.message)}return t.node={type:e.LITERAL,value:n,raw:this.expr.slice(r-1,this.index)},t.node=this.gobbleTokenProperty(t.node),t.node}this.code===e.OBRACK_CODE?s=!0:s&&this.code===e.CBRACK_CODE&&(s=!1),this.index+=92===this.code?2:1}this.throwError("Unclosed Regex")}})}};const o={name:"assignment",assignmentOperators:new Set(["=","*=","**=","/=","%=","+=","-=","<<=",">>=",">>>=","&=","^=","|=","||=","&&=","??="]),updateOperators:[43,45],assignmentPrecedence:.9,init(e){const t=[e.IDENTIFIER,e.MEMBER_EXP];function r(e){o.assignmentOperators.has(e.operator)?(e.type="AssignmentExpression",r(e.left),r(e.right)):e.operator||Object.values(e).forEach(e=>{e&&"object"==typeof e&&r(e)})}o.assignmentOperators.forEach(t=>e.addBinaryOp(t,o.assignmentPrecedence,!0)),e.hooks.add("gobble-token",function(e){const r=this.code;o.updateOperators.some(e=>e===r&&e===this.expr.charCodeAt(this.index+1))&&(this.index+=2,e.node={type:"UpdateExpression",operator:43===r?"++":"--",argument:this.gobbleTokenProperty(this.gobbleIdentifier()),prefix:!0},e.node.argument&&t.includes(e.node.argument.type)||this.throwError(`Unexpected ${e.node.operator}`))}),e.hooks.add("after-token",function(e){if(e.node){const r=this.code;o.updateOperators.some(e=>e===r&&e===this.expr.charCodeAt(this.index+1))&&(t.includes(e.node.type)||this.throwError(`Unexpected ${e.node.operator}`),this.index+=2,e.node={type:"UpdateExpression",operator:43===r?"++":"--",argument:e.node,prefix:!1})}}),e.hooks.add("after-expression",function(e){e.node&&r(e.node)})}};r.plugins.register(i,o),r.addUnaryOp("typeof"),r.addUnaryOp("void"),r.addLiteral("null",null),r.addLiteral("undefined",void 0);const a=new Set(["constructor","__proto__","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__"]),h={evalAst(e,t){switch(e.type){case"BinaryExpression":case"LogicalExpression":return h.evalBinaryExpression(e,t);case"Compound":return h.evalCompound(e,t);case"ConditionalExpression":return h.evalConditionalExpression(e,t);case"Identifier":return h.evalIdentifier(e,t);case"Literal":return h.evalLiteral(e,t);case"MemberExpression":return h.evalMemberExpression(e,t);case"UnaryExpression":return h.evalUnaryExpression(e,t);case"ArrayExpression":return h.evalArrayExpression(e,t);case"CallExpression":return h.evalCallExpression(e,t);case"AssignmentExpression":return h.evalAssignmentExpression(e,t);default:throw SyntaxError("Unexpected expression",e)}},evalBinaryExpression:(e,t)=>({"||":(e,t)=>e||t(),"&&":(e,t)=>e&&t(),"|":(e,t)=>e|t(),"^":(e,t)=>e^t(),"&":(e,t)=>e&t(),"==":(e,t)=>e==t(),"!=":(e,t)=>e!=t(),"===":(e,t)=>e===t(),"!==":(e,t)=>e!==t(),"<":(e,t)=>e":(e,t)=>e>t(),"<=":(e,t)=>e<=t(),">=":(e,t)=>e>=t(),"<<":(e,t)=>e<>":(e,t)=>e>>t(),">>>":(e,t)=>e>>>t(),"+":(e,t)=>e+t(),"-":(e,t)=>e-t(),"*":(e,t)=>e*t(),"/":(e,t)=>e/t(),"%":(e,t)=>e%t()}[e.operator](h.evalAst(e.left,t),()=>h.evalAst(e.right,t))),evalCompound(e,t){let r;for(let s=0;sh.evalAst(e.test,t)?h.evalAst(e.consequent,t):h.evalAst(e.alternate,t),evalIdentifier(e,t){if(Object.hasOwn(t,e.name))return t[e.name];throw ReferenceError(`${e.name} is not defined`)},evalLiteral:e=>e.value,evalMemberExpression(e,t){const r=String(e.computed?h.evalAst(e.property):e.property.name),s=h.evalAst(e.object,t);if(null==s)throw TypeError(`Cannot read properties of ${s} (reading '${r}')`);if(!Object.hasOwn(s,r)&&a.has(r))throw TypeError(`Cannot read properties of ${s} (reading '${r}')`);const n=s[r];return"function"==typeof n&&n!==Function?n.bind(s):n},evalUnaryExpression:(e,t)=>({"-":e=>-h.evalAst(e,t),"!":e=>!h.evalAst(e,t),"~":e=>~h.evalAst(e,t),"+":e=>+h.evalAst(e,t),typeof:e=>typeof h.evalAst(e,t),void:e=>{h.evalAst(e,t)}}[e.operator](e.argument)),evalArrayExpression:(e,t)=>e.elements.map(e=>h.evalAst(e,t)),evalCallExpression(e,t){const r=e.arguments.map(e=>h.evalAst(e,t)),s=h.evalAst(e.callee,t);if(s===Function)throw new Error("Function constructor is disabled");return s(...r)},evalAssignmentExpression(e,t){if("Identifier"!==e.left.type)throw SyntaxError("Invalid left-hand side in assignment");const r=e.left.name,s=h.evalAst(e.right,t);return t[r]=s,t[r]}};function l(e,t){return(e=e.slice()).push(t),e}function c(e,t){return(t=t.slice()).unshift(e),t}class p extends Error{constructor(e){super('JSONPath should not be called with "new" (it prevents return of (unwrapped) scalar values)'),this.avoidNew=!0,this.value=e,this.name="NewError"}}function u(e,t,r,s,n){if(!(this instanceof u))try{return new u(e,t,r,s,n)}catch(e){if(!e.avoidNew)throw e;return e.value}"string"==typeof e&&(n=s,s=r,r=t,t=e,e=null);const i=e&&"object"==typeof e;if(e=e||{},this.json=e.json||r,this.path=e.path||t,this.resultType=e.resultType||"value",this.flatten=e.flatten||!1,this.wrap=!Object.hasOwn(e,"wrap")||e.wrap,this.sandbox=e.sandbox||{},this.eval=void 0===e.eval?"safe":e.eval,this.ignoreEvalErrors=void 0!==e.ignoreEvalErrors&&e.ignoreEvalErrors,this.parent=e.parent||null,this.parentProperty=e.parentProperty||null,this.callback=e.callback||s||null,this.otherTypeCallback=e.otherTypeCallback||n||function(){throw new TypeError("You must supply an otherTypeCallback callback option with the @other() operator.")},!1!==e.autostart){const s={path:i?e.path:t};i?"json"in e&&(s.json=e.json):s.json=r;const n=this.evaluate(s);if(!n||"object"!=typeof n)throw new p(n);return n}}u.prototype.evaluate=function(e,t,r,s){let n=this.parent,i=this.parentProperty,{flatten:o,wrap:a}=this;if(this.currResultType=this.resultType,this.currEval=this.eval,this.currSandbox=this.sandbox,r=r||this.callback,this.currOtherTypeCallback=s||this.otherTypeCallback,t=t||this.json,(e=e||this.path)&&"object"==typeof e&&!Array.isArray(e)){if(!e.path&&""!==e.path)throw new TypeError('You must supply a "path" property when providing an object argument to JSONPath.evaluate().');if(!Object.hasOwn(e,"json"))throw new TypeError('You must supply a "json" property when providing an object argument to JSONPath.evaluate().');({json:t}=e),o=Object.hasOwn(e,"flatten")?e.flatten:o,this.currResultType=Object.hasOwn(e,"resultType")?e.resultType:this.currResultType,this.currSandbox=Object.hasOwn(e,"sandbox")?e.sandbox:this.currSandbox,a=Object.hasOwn(e,"wrap")?e.wrap:a,this.currEval=Object.hasOwn(e,"eval")?e.eval:this.currEval,r=Object.hasOwn(e,"callback")?e.callback:r,this.currOtherTypeCallback=Object.hasOwn(e,"otherTypeCallback")?e.otherTypeCallback:this.currOtherTypeCallback,n=Object.hasOwn(e,"parent")?e.parent:n,i=Object.hasOwn(e,"parentProperty")?e.parentProperty:i,e=e.path}if(n=n||null,i=i||null,Array.isArray(e)&&(e=u.toPathString(e)),!e&&""!==e||!t)return;const h=u.toPathArray(e);"$"===h[0]&&h.length>1&&h.shift(),this._hasParentSelector=null;const l=this._trace(h,t,["$"],n,i,r).filter(function(e){return e&&!e.isParentSelector});return l.length?a||1!==l.length||l[0].hasArrExpr?l.reduce((e,t)=>{const r=this._getPreferredOutput(t);return o&&Array.isArray(r)?e=e.concat(r):e.push(r),e},[]):this._getPreferredOutput(l[0]):a?[]:void 0},u.prototype._getPreferredOutput=function(e){const t=this.currResultType;switch(t){case"all":{const t=Array.isArray(e.path)?e.path:u.toPathArray(e.path);return e.pointer=u.toPointer(t),e.path="string"==typeof e.path?e.path:u.toPathString(e.path),e}case"value":case"parent":case"parentProperty":return e[t];case"path":return u.toPathString(e[t]);case"pointer":return u.toPointer(e.path);default:throw new TypeError("Unknown result type")}},u.prototype._handleCallback=function(e,t,r){if(t){const s=this._getPreferredOutput(e);e.path="string"==typeof e.path?e.path:u.toPathString(e.path),t(s,r,e)}},u.prototype._trace=function(e,t,r,s,n,i,o,a){let h;if(!e.length)return h={path:r,value:t,parent:s,parentProperty:n,hasArrExpr:o},this._handleCallback(h,i,"value"),h;const p=e[0],u=e.slice(1),d=[];function f(e){Array.isArray(e)?e.forEach(e=>{d.push(e)}):d.push(e)}if(("string"!=typeof p||a)&&t&&Object.hasOwn(t,p))f(this._trace(u,t[p],l(r,p),t,p,i,o));else if("*"===p)this._walk(t,e=>{f(this._trace(u,t[e],l(r,e),t,e,i,!0,!0))});else if(".."===p)f(this._trace(u,t,r,s,n,i,o)),this._walk(t,s=>{"object"==typeof t[s]&&f(this._trace(e.slice(),t[s],l(r,s),t,s,i,!0))});else{if("^"===p)return this._hasParentSelector=!0,{path:r.slice(0,-1),expr:u,isParentSelector:!0};if("~"===p)return h={path:l(r,p),value:n,parent:s,parentProperty:null},this._handleCallback(h,i,"property"),h;if("$"===p)f(this._trace(u,t,r,null,null,i,o));else if(/^(-?\d*):(-?\d*):?(\d*)$/u.test(p))f(this._slice(p,u,t,r,s,n,i));else if(0===p.indexOf("?(")){if(!1===this.currEval)throw new Error("Eval [?(expr)] prevented in JSONPath expression.");const e=p.replace(/^\?\((.*?)\)$/u,"$1"),o=/@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu.exec(e);o?this._walk(t,e=>{const a=[o[2]],h=o[1]?t[e][o[1]]:t[e];this._trace(a,h,r,s,n,i,!0).length>0&&f(this._trace(u,t[e],l(r,e),t,e,i,!0))}):this._walk(t,o=>{this._eval(e,t[o],o,r,s,n)&&f(this._trace(u,t[o],l(r,o),t,o,i,!0))})}else if("("===p[0]){if(!1===this.currEval)throw new Error("Eval [(expr)] prevented in JSONPath expression.");f(this._trace(c(this._eval(p,t,r.at(-1),r.slice(0,-1),s,n),u),t,r,s,n,i,o))}else if("@"===p[0]){let e=!1;const o=p.slice(1,-2);switch(o){case"scalar":t&&["object","function"].includes(typeof t)||(e=!0);break;case"boolean":case"string":case"undefined":case"function":typeof t===o&&(e=!0);break;case"integer":!Number.isFinite(t)||t%1||(e=!0);break;case"number":Number.isFinite(t)&&(e=!0);break;case"nonFinite":"number"!=typeof t||Number.isFinite(t)||(e=!0);break;case"object":t&&typeof t===o&&(e=!0);break;case"array":Array.isArray(t)&&(e=!0);break;case"other":e=this.currOtherTypeCallback(t,r,s,n);break;case"null":null===t&&(e=!0);break;default:throw new TypeError("Unknown value type "+o)}if(e)return h={path:r,value:t,parent:s,parentProperty:n},this._handleCallback(h,i,"value"),h}else if("`"===p[0]&&t&&Object.hasOwn(t,p.slice(1))){const e=p.slice(1);f(this._trace(u,t[e],l(r,e),t,e,i,o,!0))}else if(p.includes(",")){const e=p.split(",");for(const o of e)f(this._trace(c(o,u),t,r,s,n,i,!0))}else!a&&t&&Object.hasOwn(t,p)&&f(this._trace(u,t[p],l(r,p),t,p,i,o,!0))}if(this._hasParentSelector)for(let e=0;e{t(e)})},u.prototype._slice=function(e,t,r,s,n,i,o){if(!Array.isArray(r))return;const a=r.length,h=e.split(":"),l=h[2]&&Number.parseInt(h[2])||1;let p=h[0]&&Number.parseInt(h[0])||0,u=h[1]?Number.parseInt(h[1]):a;p=p<0?Math.max(0,p+a):Math.min(a,p),u=u<0?Math.max(0,u+a):Math.min(a,u);const d=[];for(let e=p;e{d.push(e)})}return d},u.prototype._eval=function(e,t,r,s,n,i){this.currSandbox._$_parentProperty=i,this.currSandbox._$_parent=n,this.currSandbox._$_property=r,this.currSandbox._$_root=this.json,this.currSandbox._$_v=t;const o=e.includes("@path");o&&(this.currSandbox._$_path=u.toPathString(s.concat([r])));const a=this.currEval+"Script:"+e;if(!u.cache[a]){let t=e.replaceAll("@parentProperty","_$_parentProperty").replaceAll("@parent","_$_parent").replaceAll("@property","_$_property").replaceAll("@root","_$_root").replaceAll(/@([.\s)[])/gu,"_$_v$1");if(o&&(t=t.replaceAll("@path","_$_path")),"safe"===this.currEval||!0===this.currEval||void 0===this.currEval)u.cache[a]=new this.safeVm.Script(t);else if("native"===this.currEval)u.cache[a]=new this.vm.Script(t);else if("function"==typeof this.currEval&&this.currEval.prototype&&Object.hasOwn(this.currEval.prototype,"runInNewContext")){const e=this.currEval;u.cache[a]=new e(t)}else{if("function"!=typeof this.currEval)throw new TypeError(`Unknown "eval" property "${this.currEval}"`);u.cache[a]={runInNewContext:e=>this.currEval(t,e)}}}try{return u.cache[a].runInNewContext(this.currSandbox)}catch(t){if(this.ignoreEvalErrors)return!1;throw new Error("jsonPath: "+t.message+": "+e)}},u.cache={},u.toPathString=function(e){const t=e,r=t.length;let s="$";for(let e=1;e"function"==typeof e[t]);const n=r.map(t=>e[t]);t=s.reduce((t,r)=>{let s=e[r].toString();return/function/u.test(s)||(s="function "+s),"var "+r+"="+s+";"+t},"")+t,/(['"])use strict\1/u.test(t)||r.includes("arguments")||(t="var arguments = undefined;"+t),t=t.replace(/;\s*$/u,"");const i=t.lastIndexOf(";"),o=-1!==i?t.slice(0,i+1)+" return "+t.slice(i+1):" return "+t;return new Function(...r,o)(...n)}}};export{u as JSONPath}; +class e{static get version(){return"1.4.0"}static toString(){return"JavaScript Expression Parser (JSEP) v"+e.version}static addUnaryOp(t){return e.max_unop_len=Math.max(t.length,e.max_unop_len),e.unary_ops[t]=1,e}static addBinaryOp(t,r,s){return e.max_binop_len=Math.max(t.length,e.max_binop_len),e.binary_ops[t]=r,s?e.right_associative.add(t):e.right_associative.delete(t),e}static addIdentifierChar(t){return e.additional_identifier_chars.add(t),e}static addLiteral(t,r){return e.literals[t]=r,e}static removeUnaryOp(t){return delete e.unary_ops[t],t.length===e.max_unop_len&&(e.max_unop_len=e.getMaxKeyLen(e.unary_ops)),e}static removeAllUnaryOps(){return e.unary_ops={},e.max_unop_len=0,e}static removeIdentifierChar(t){return e.additional_identifier_chars.delete(t),e}static removeBinaryOp(t){return delete e.binary_ops[t],t.length===e.max_binop_len&&(e.max_binop_len=e.getMaxKeyLen(e.binary_ops)),e.right_associative.delete(t),e}static removeAllBinaryOps(){return e.binary_ops={},e.max_binop_len=0,e}static removeLiteral(t){return delete e.literals[t],e}static removeAllLiterals(){return e.literals={},e}get char(){return this.expr.charAt(this.index)}get code(){return this.expr.charCodeAt(this.index)}constructor(e){this.expr=e,this.index=0}static parse(t){return new e(t).parse()}static getMaxKeyLen(e){return Math.max(0,...Object.keys(e).map(e=>e.length))}static isDecimalDigit(e){return e>=48&&e<=57}static binaryPrecedence(t){return e.binary_ops[t]||0}static isIdentifierStart(t){return t>=65&&t<=90||t>=97&&t<=122||t>=128&&!e.binary_ops[String.fromCharCode(t)]||e.additional_identifier_chars.has(String.fromCharCode(t))}static isIdentifierPart(t){return e.isIdentifierStart(t)||e.isDecimalDigit(t)}throwError(e){const t=new Error(e+" at character "+this.index);throw t.index=this.index,t.description=e,t}runHook(t,r){if(e.hooks[t]){const s={context:this,node:r};return e.hooks.run(t,s),s.node}return r}searchHook(t){if(e.hooks[t]){const r={context:this};return e.hooks[t].find(function(e){return e.call(r.context,r),r.node}),r.node}}gobbleSpaces(){let t=this.code;for(;t===e.SPACE_CODE||t===e.TAB_CODE||t===e.LF_CODE||t===e.CR_CODE;)t=this.expr.charCodeAt(++this.index);this.runHook("gobble-spaces")}parse(){this.runHook("before-all");const t=this.gobbleExpressions(),r=1===t.length?t[0]:{type:e.COMPOUND,body:t};return this.runHook("after-all",r)}gobbleExpressions(t){let r,s,n=[];for(;this.index0;){if(e.binary_ops.hasOwnProperty(t)&&(!e.isIdentifierStart(this.code)||this.index+t.lengthi.right_a&&e.right_a?s>e.prec:s<=e.prec;for(;n.length>2&&h(n[n.length-2]);)o=n.pop(),r=n.pop().value,a=n.pop(),t={type:e.BINARY_EXP,operator:r,left:a,right:o},n.push(t);t=this.gobbleToken(),t||this.throwError("Expected expression after "+l),n.push(i,t)}for(h=n.length-1,t=n[h];h>1;)t={type:e.BINARY_EXP,operator:n[h-1].value,left:n[h-2],right:t},h-=2;return t}gobbleToken(){let t,r,s,n;if(this.gobbleSpaces(),n=this.searchHook("gobble-token"),n)return this.runHook("after-token",n);if(t=this.code,e.isDecimalDigit(t)||t===e.PERIOD_CODE)return this.gobbleNumericLiteral();if(t===e.SQUOTE_CODE||t===e.DQUOTE_CODE)n=this.gobbleStringLiteral();else if(t===e.OBRACK_CODE)n=this.gobbleArray();else{for(r=this.expr.substr(this.index,e.max_unop_len),s=r.length;s>0;){if(e.unary_ops.hasOwnProperty(r)&&(!e.isIdentifierStart(this.code)||this.index+r.length=r.length&&this.throwError("Unexpected token "+String.fromCharCode(t));break}if(i===e.COMMA_CODE){if(this.index++,n++,n!==r.length)if(t===e.CPAREN_CODE)this.throwError("Unexpected token ,");else if(t===e.CBRACK_CODE)for(let e=r.length;e{if("object"!=typeof e||!e.name||!e.init)throw new Error("Invalid JSEP plugin format");this.registered[e.name]||(e.init(this.jsep),this.registered[e.name]=e)})}}(e),COMPOUND:"Compound",SEQUENCE_EXP:"SequenceExpression",IDENTIFIER:"Identifier",MEMBER_EXP:"MemberExpression",LITERAL:"Literal",THIS_EXP:"ThisExpression",CALL_EXP:"CallExpression",UNARY_EXP:"UnaryExpression",BINARY_EXP:"BinaryExpression",ARRAY_EXP:"ArrayExpression",TAB_CODE:9,LF_CODE:10,CR_CODE:13,SPACE_CODE:32,PERIOD_CODE:46,COMMA_CODE:44,SQUOTE_CODE:39,DQUOTE_CODE:34,OPAREN_CODE:40,CPAREN_CODE:41,OBRACK_CODE:91,CBRACK_CODE:93,QUMARK_CODE:63,SEMCOL_CODE:59,COLON_CODE:58,unary_ops:{"-":1,"!":1,"~":1,"+":1},binary_ops:{"||":1,"??":1,"&&":2,"|":3,"^":4,"&":5,"==":6,"!=":6,"===":6,"!==":6,"<":7,">":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10,"**":11},right_associative:new Set(["**"]),additional_identifier_chars:new Set(["$","_"]),literals:{true:!0,false:!1,null:null},this_str:"this"}),e.max_unop_len=e.getMaxKeyLen(e.unary_ops),e.max_binop_len=e.getMaxKeyLen(e.binary_ops);const r=t=>new e(t).parse(),s=Object.getOwnPropertyNames(class{});Object.getOwnPropertyNames(e).filter(e=>!s.includes(e)&&void 0===r[e]).forEach(t=>{r[t]=e[t]}),r.Jsep=e;var n={name:"ternary",init(e){e.hooks.add("after-expression",function(t){if(t.node&&this.code===e.QUMARK_CODE){this.index++;const r=t.node,s=this.gobbleExpression();if(s||this.throwError("Expected expression"),this.gobbleSpaces(),this.code===e.COLON_CODE){this.index++;const n=this.gobbleExpression();if(n||this.throwError("Expected expression"),t.node={type:"ConditionalExpression",test:r,consequent:s,alternate:n},r.operator&&e.binary_ops[r.operator]<=.9){let s=r;for(;s.right.operator&&e.binary_ops[s.right.operator]<=.9;)s=s.right;t.node.test=s.right,s.right=t.node,t.node=r}}else this.throwError("Expected :")}})}};r.plugins.register(n);var i={name:"regex",init(e){e.hooks.add("gobble-token",function(t){if(47===this.code){const r=++this.index;let s=!1;for(;this.index=97&&e<=122||e>=65&&e<=90||e>=48&&e<=57))break;i+=this.char}try{n=new RegExp(s,i)}catch(e){this.throwError(e.message)}return t.node={type:e.LITERAL,value:n,raw:this.expr.slice(r-1,this.index)},t.node=this.gobbleTokenProperty(t.node),t.node}this.code===e.OBRACK_CODE?s=!0:s&&this.code===e.CBRACK_CODE&&(s=!1),this.index+=92===this.code?2:1}this.throwError("Unclosed Regex")}})}};const a={name:"assignment",assignmentOperators:new Set(["=","*=","**=","/=","%=","+=","-=","<<=",">>=",">>>=","&=","^=","|=","||=","&&=","??="]),updateOperators:[43,45],assignmentPrecedence:.9,init(e){const t=[e.IDENTIFIER,e.MEMBER_EXP];function r(e){a.assignmentOperators.has(e.operator)?(e.type="AssignmentExpression",r(e.left),r(e.right)):e.operator||Object.values(e).forEach(e=>{e&&"object"==typeof e&&r(e)})}a.assignmentOperators.forEach(t=>e.addBinaryOp(t,a.assignmentPrecedence,!0)),e.hooks.add("gobble-token",function(e){const r=this.code;a.updateOperators.some(e=>e===r&&e===this.expr.charCodeAt(this.index+1))&&(this.index+=2,e.node={type:"UpdateExpression",operator:43===r?"++":"--",argument:this.gobbleTokenProperty(this.gobbleIdentifier()),prefix:!0},e.node.argument&&t.includes(e.node.argument.type)||this.throwError(`Unexpected ${e.node.operator}`))}),e.hooks.add("after-token",function(e){if(e.node){const r=this.code;a.updateOperators.some(e=>e===r&&e===this.expr.charCodeAt(this.index+1))&&(t.includes(e.node.type)||this.throwError(`Unexpected ${e.node.operator}`),this.index+=2,e.node={type:"UpdateExpression",operator:43===r?"++":"--",argument:e.node,prefix:!1})}}),e.hooks.add("after-expression",function(e){e.node&&r(e.node)})}};r.plugins.register(i,a),r.addUnaryOp("typeof"),r.addUnaryOp("void"),r.addLiteral("null",null),r.addLiteral("undefined",void 0);const o=new Set(["constructor","__proto__","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__"]),h={evalAst(e,t){switch(e.type){case"BinaryExpression":case"LogicalExpression":return h.evalBinaryExpression(e,t);case"Compound":return h.evalCompound(e,t);case"ConditionalExpression":return h.evalConditionalExpression(e,t);case"Identifier":return h.evalIdentifier(e,t);case"Literal":return h.evalLiteral(e);case"MemberExpression":return h.evalMemberExpression(e,t);case"UnaryExpression":return h.evalUnaryExpression(e,t);case"ArrayExpression":return h.evalArrayExpression(e,t);case"CallExpression":return h.evalCallExpression(e,t);case"AssignmentExpression":return h.evalAssignmentExpression(e,t);default:throw new SyntaxError("Unexpected expression",{cause:e})}},evalBinaryExpression:(e,t)=>({"||":(e,t)=>e||t(),"&&":(e,t)=>e&&t(),"|":(e,t)=>e|t(),"^":(e,t)=>e^t(),"&":(e,t)=>e&t(),"==":(e,t)=>e==t(),"!=":(e,t)=>e!=t(),"===":(e,t)=>e===t(),"!==":(e,t)=>e!==t(),"<":(e,t)=>e":(e,t)=>e>t(),"<=":(e,t)=>e<=t(),">=":(e,t)=>e>=t(),"<<":(e,t)=>e<>":(e,t)=>e>>t(),">>>":(e,t)=>e>>>t(),"+":(e,t)=>e+t(),"-":(e,t)=>e-t(),"*":(e,t)=>e*t(),"/":(e,t)=>e/t(),"%":(e,t)=>e%t()}[e.operator](h.evalAst(e.left,t),()=>h.evalAst(e.right,t))),evalCompound(e,t){let r;for(let s=0;sh.evalAst(e.test,t)?h.evalAst(e.consequent,t):h.evalAst(e.alternate,t),evalIdentifier(e,t){if(Object.hasOwn(t,e.name))return t[e.name];throw new ReferenceError(`${e.name} is not defined`)},evalLiteral:e=>e.value,evalMemberExpression(e,t){const r=String(e.computed?h.evalAst(e.property,t):e.property.name),s=h.evalAst(e.object,t);if(null==s)throw new TypeError(`Cannot read properties of ${s} (reading '${r}')`);if(!Object.hasOwn(s,r)&&o.has(r))throw new TypeError(`Cannot read properties of ${s} (reading '${r}')`);const n=s[r];return"function"==typeof n&&n!==Function?n.bind(s):n},evalUnaryExpression:(e,t)=>({"-":e=>-h.evalAst(e,t),"!":e=>!h.evalAst(e,t),"~":e=>~h.evalAst(e,t),"+":e=>+h.evalAst(e,t),typeof:e=>typeof h.evalAst(e,t),void:e=>{h.evalAst(e,t)}}[e.operator](e.argument)),evalArrayExpression:(e,t)=>e.elements.map(e=>h.evalAst(e,t)),evalCallExpression(e,t){const r=e.arguments.map(e=>h.evalAst(e,t)),s=h.evalAst(e.callee,t);if(s===Function)throw new Error("Function constructor is disabled");return s(...r)},evalAssignmentExpression(e,t){if("Identifier"!==e.left.type)throw new SyntaxError("Invalid left-hand side in assignment");const r=e.left.name,s=h.evalAst(e.right,t);return t[r]=s,t[r]}};function l(e,t){return(e=e.slice()).push(t),e}function c(e,t){return(t=t.slice()).unshift(e),t}function p(e,t,r,s,n){try{return e&&"object"==typeof e?new u(e):new u(e,t,r,s,n)}catch(e){if(new.target)throw e;if(e&&"object"==typeof e&&"value"in e)return e.value;throw e}}class u{constructor(e,t,r,s,n){"string"==typeof e&&(n=s,s=r,r=t,t=e,e=null);const i=e&&"object"==typeof e;if(e||={},this.currResultType=void 0,this.currEval=void 0,this.currOtherTypeCallback=void 0,this.currSandbox=void 0,this._hasParentSelector=!1,this.json=e.json||r,this.path=e.path||t,this.resultType=e.resultType||"value",this.flatten=!!Object.hasOwn(e,"flatten")&&e.flatten,this.wrap=!Object.hasOwn(e,"wrap")||e.wrap,this.sandbox=e.sandbox||{},this.eval=void 0===e.eval?"safe":e.eval,this.ignoreEvalErrors=void 0!==e.ignoreEvalErrors&&e.ignoreEvalErrors,this.parent=Object.hasOwn(e,"parent")?e.parent:null,this.parentProperty=Object.hasOwn(e,"parentProperty")?e.parentProperty:null,this.callback=e.callback||s||null,this.otherTypeCallback=e.otherTypeCallback||n||function(){throw new TypeError("You must supply an otherTypeCallback callback option with the @other() operator.")},!1!==e.autostart){const s={path:i?e.path:t};i||void 0===r?"json"in e&&(s.json=e.json):s.json=r;const n=this.evaluate(s);if(!n||"object"!=typeof n){const e=new Error('JSONPath should not be called with "new" (it prevents return of (unwrapped) scalar values)');throw e.value=n,e}return n}}evaluate(e,t,r,s){let n=this.parent,i=this.parentProperty,{flatten:a,wrap:o}=this;if(this.currResultType=this.resultType,this.currEval=this.eval,this.currSandbox=this.sandbox,r||=this.callback,this.currOtherTypeCallback=s||this.otherTypeCallback,e&&"object"==typeof e&&!Array.isArray(e)){const s=e;if(!s.path&&""!==s.path)throw new TypeError('You must supply a "path" property when providing an object argument to JSONPath.evaluate().');if(!Object.hasOwn(s,"json"))throw new TypeError('You must supply a "json" property when providing an object argument to JSONPath.evaluate().');({json:t}=s),a=Object.hasOwn(s,"flatten")?s.flatten:a,this.currResultType=Object.hasOwn(s,"resultType")?s.resultType:this.currResultType,this.currSandbox=Object.hasOwn(s,"sandbox")?s.sandbox:this.currSandbox,o=Object.hasOwn(s,"wrap")?s.wrap:o,this.currEval=Object.hasOwn(s,"eval")?s.eval:this.currEval,r=Object.hasOwn(s,"callback")?s.callback:r,this.currOtherTypeCallback=Object.hasOwn(s,"otherTypeCallback")?s.otherTypeCallback:this.currOtherTypeCallback,n=Object.hasOwn(s,"parent")?s.parent:n,i=Object.hasOwn(s,"parentProperty")?s.parentProperty:i,e=s.path}else t||=this.json,e||=this.path;if(n||=null,i||=null,Array.isArray(e)&&(e=p.toPathString(e)),!t||!e&&""!==e)return;const h=p.toPathArray(e);"$"===h[0]&&h.length>1&&h.shift(),this._hasParentSelector=!1;const l=this._trace(h,t,["$"],n,i,r??void 0,void 0),c=(Array.isArray(l)?l:[l]).filter(e=>e&&!e.isParentSelector);if(!c.length)return o?[]:void 0;if(!o&&1===c.length&&!c[0].hasArrExpr){return this._getPreferredOutput(c[0])}return c.reduce((e,t)=>{const r=this._getPreferredOutput(t);return a&&Array.isArray(r)?e=e.concat(r):e.push(r),e},[])}_getPreferredOutput(e){const t=this.currResultType;switch(t){case"all":{const t=Array.isArray(e.path)?e.path:p.toPathArray(e.path);return e.pointer=p.toPointer(t),e.path="string"==typeof e.path?e.path:p.toPathString(e.path),e}case"value":case"parent":case"parentProperty":return e[t];case"path":return"string"==typeof e.path?e.path:p.toPathString(e.path);case"pointer":{const t=Array.isArray(e.path)?e.path:p.toPathArray(e.path);return p.toPointer(t)}default:throw new TypeError("Unknown result type")}}_handleCallback(e,t,r){if(!t)return;const s=this._getPreferredOutput(e);Array.isArray(e.path)&&(e.path=p.toPathString(e.path)),t(s,r,e)}_trace(e,t,r,s,n,i,a,o){let h;if(!e.length)return h={path:r,value:t,parent:s,parentProperty:n,hasArrExpr:a},this._handleCallback(h,i,"value"),h;const p=e[0],u=e.slice(1),d=[];function b(e){Array.isArray(e)?e.forEach(e=>{d.push(e)}):d.push(e)}if(t&&("string"!=typeof p||o)&&Object.hasOwn(t,p)){const e=t;b(this._trace(u,e[p],l(r,p),t,p,i,a))}else if("*"===p)this._walk(t,e=>{const s=t;b(this._trace(u,s[e],l(r,e),t,e,i,!0,!0))});else if(".."===p)b(this._trace(u,t,r,s,n,i,a)),this._walk(t,s=>{const n=t;"object"==typeof n[s]&&b(this._trace(e.slice(),n[s],l(r,s),t,s,i,!0))});else{if("^"===p)return this._hasParentSelector=!0,{path:r.slice(0,-1),expr:u,isParentSelector:!0,value:void 0,parent:void 0,parentProperty:null};if("~"===p)return h={path:l(r,p),value:n,parent:s,parentProperty:null},this._handleCallback(h,i,"property"),h;if("$"===p)b(this._trace(u,t,r,null,null,i,a));else if(/^(-?\d*):(-?\d*):?(\d*)$/u.test(p)){const e=this._slice(p,u,t,r,s,n,i);e&&b(e)}else if(0===p.indexOf("?(")){if(!1===this.currEval)throw new Error("Eval [?(expr)] prevented in JSONPath expression.");const e=p.replace(/^\?\((.*?)\)$/u,"$1"),a=/@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu.exec(e);if(a)this._walk(t,e=>{const o=[a[2]],h=t,c=a[1]?h[e][a[1]]:h[e],p=this._trace(o,c,r,s,n,i,!0);(Array.isArray(p)?p:[p]).length>0&&b(this._trace(u,h[e],l(r,e),t,e,i,!0))});else{const a=t;this._walk(t,o=>{this._eval(e,a[o],o,r,s,n)&&b(this._trace(u,a[o],l(r,o),t,o,i,!0))})}}else if("("===p[0]){if(!1===this.currEval)throw new Error("Eval [(expr)] prevented in JSONPath expression.");const e=this._eval(p,t,r.at(-1),r.slice(0,-1),s,n),o=void 0!==e?e:"";b(this._trace(c(o,u),t,r,s,n,i,a))}else if("@"===p[0]){let e=!1;const a=p.slice(1,-2);switch(a){case"scalar":t&&["object","function"].includes(typeof t)||(e=!0);break;case"boolean":case"string":case"undefined":case"function":typeof t===a&&(e=!0);break;case"integer":!Number.isFinite(t)||t%1||(e=!0);break;case"number":Number.isFinite(t)&&(e=!0);break;case"nonFinite":"number"!=typeof t||Number.isFinite(t)||(e=!0);break;case"object":t&&typeof t===a&&(e=!0);break;case"array":Array.isArray(t)&&(e=!0);break;case"other":e=this.currOtherTypeCallback?.(t,r,s,n)??!1;break;case"null":null===t&&(e=!0);break;default:throw new TypeError("Unknown value type "+a)}if(e)return h={path:r,value:t,parent:s,parentProperty:n},this._handleCallback(h,i,"value"),h}else if(t&&"`"===p[0]&&Object.hasOwn(t,p.slice(1))){const e=p.slice(1),s=t;b(this._trace(u,s[e],l(r,e),t,e,i,a,!0))}else if(p.includes(",")){const e=p.split(",");for(const a of e)b(this._trace(c(a,u),t,r,s,n,i,!0))}else if(!o&&t&&Object.hasOwn(t,p)){const e=t;b(this._trace(u,e[p],l(r,p),t,p,i,a,!0))}}if(this._hasParentSelector)for(let e=0;e{t(e)})}_slice(e,t,r,s,n,i,a){if(!Array.isArray(r))return;const o=r.length,h=e.split(":"),l=h[2]&&Number(h[2])||1;let p=h[0]&&Number(h[0])||0,u=h[1]?Number(h[1]):o;p=p<0?Math.max(0,p+o):Math.min(o,p),u=u<0?Math.max(0,u+o):Math.min(o,u);const d=[];for(let e=p;e{d.push(e)})}return d}_eval(e,t,r,s,n,i){this.currSandbox&&(this.currSandbox._$_parentProperty=i,this.currSandbox._$_parent=n,this.currSandbox._$_property=r,this.currSandbox._$_root=this.json,this.currSandbox._$_v=t);const a=e.includes("@path");if(a){(this.currSandbox??{})._$_path=p.toPathString(s.concat([r]))}const o=this.currEval+"Script:"+e;if(!Object.hasOwn(p.cache,o)){let t=e.replaceAll("@parentProperty","_$_parentProperty").replaceAll("@parent","_$_parent").replaceAll("@property","_$_property").replaceAll("@root","_$_root").replaceAll(/@([.\s)[])/gu,"_$_v$1");a&&(t=t.replaceAll("@path","_$_path"));const r=this.currEval;if(["safe",!0,void 0].includes(r)){const{cache:e}=p;e[o]=new this.safeVm.Script(t)}else if("native"===this.currEval){const{cache:e}=p;e[o]=new this.vm.Script(t)}else if("function"==typeof this.currEval&&this.currEval.prototype&&Object.hasOwn(this.currEval.prototype,"runInNewContext")){const e=this.currEval,{cache:r}=p;r[o]=new e(t)}else{if("function"!=typeof this.currEval)throw new TypeError(`Unknown "eval" property "${this.currEval}"`);{const{cache:e}=p,r=this.currEval;e[o]={runInNewContext:e=>r(t,e)}}}}try{const{cache:e}=p;return e[o].runInNewContext(this.currSandbox)}catch(t){if(this.ignoreEvalErrors)return!1;throw new Error("jsonPath: "+t.message+": "+e,{cause:t})}}}u.prototype.safeVm={Script:class{constructor(e){this.code=e,this.ast=r(this.code)}runInNewContext(e){const t=Object.assign(Object.create(null),e);return h.evalAst(this.ast,t)}}},p.prototype=u.prototype,p.cache={},p.toPathString=function(e){const t=e,r=t.length;let s="$";for(let e=1;e"function"==typeof e[t]);const n=r.map(t=>e[t]);t=s.reduce((t,r)=>{let s=e[r].toString();return/function/u.test(s)||(s="function "+s),"var "+r+"="+s+";"+t},"")+t,/(['"])use strict\1/u.test(t)||r.includes("arguments")||(t="var arguments = undefined;"+t),t=t.replace(/;\s*$/u,"");const i=t.lastIndexOf(";"),a=-1!==i?t.slice(0,i+1)+" return "+t.slice(i+1):" return "+t;return new Function(...r,a)(...n)}}u.prototype.vm={Script:d};export{p as JSONPath,u as JSONPathClass,d as Script}; //# sourceMappingURL=index-browser-esm.min.js.map diff --git a/dist/index-browser-esm.min.js.map b/dist/index-browser-esm.min.js.map index 914f3764..18496898 100644 --- a/dist/index-browser-esm.min.js.map +++ b/dist/index-browser-esm.min.js.map @@ -1 +1 @@ -{"version":3,"file":"index-browser-esm.min.js","sources":["../node_modules/.pnpm/jsep@1.4.0/node_modules/jsep/dist/jsep.js","../node_modules/.pnpm/@jsep-plugin+regex@1.0.4_jsep@1.4.0/node_modules/@jsep-plugin/regex/dist/index.js","../node_modules/.pnpm/@jsep-plugin+assignment@1.3.0_jsep@1.4.0/node_modules/@jsep-plugin/assignment/dist/index.js","../src/Safe-Script.js","../src/jsonpath.js","../src/jsonpath-browser.js"],"sourcesContent":["/**\n * @implements {IHooks}\n */\nclass Hooks {\n\t/**\n\t * @callback HookCallback\n\t * @this {*|Jsep} this\n\t * @param {Jsep} env\n\t * @returns: void\n\t */\n\t/**\n\t * Adds the given callback to the list of callbacks for the given hook.\n\t *\n\t * The callback will be invoked when the hook it is registered for is run.\n\t *\n\t * One callback function can be registered to multiple hooks and the same hook multiple times.\n\t *\n\t * @param {string|object} name The name of the hook, or an object of callbacks keyed by name\n\t * @param {HookCallback|boolean} callback The callback function which is given environment variables.\n\t * @param {?boolean} [first=false] Will add the hook to the top of the list (defaults to the bottom)\n\t * @public\n\t */\n\tadd(name, callback, first) {\n\t\tif (typeof arguments[0] != 'string') {\n\t\t\t// Multiple hook callbacks, keyed by name\n\t\t\tfor (let name in arguments[0]) {\n\t\t\t\tthis.add(name, arguments[0][name], arguments[1]);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t(Array.isArray(name) ? name : [name]).forEach(function (name) {\n\t\t\t\tthis[name] = this[name] || [];\n\n\t\t\t\tif (callback) {\n\t\t\t\t\tthis[name][first ? 'unshift' : 'push'](callback);\n\t\t\t\t}\n\t\t\t}, this);\n\t\t}\n\t}\n\n\t/**\n\t * Runs a hook invoking all registered callbacks with the given environment variables.\n\t *\n\t * Callbacks will be invoked synchronously and in the order in which they were registered.\n\t *\n\t * @param {string} name The name of the hook.\n\t * @param {Object} env The environment variables of the hook passed to all callbacks registered.\n\t * @public\n\t */\n\trun(name, env) {\n\t\tthis[name] = this[name] || [];\n\t\tthis[name].forEach(function (callback) {\n\t\t\tcallback.call(env && env.context ? env.context : env, env);\n\t\t});\n\t}\n}\n\n/**\n * @implements {IPlugins}\n */\nclass Plugins {\n\tconstructor(jsep) {\n\t\tthis.jsep = jsep;\n\t\tthis.registered = {};\n\t}\n\n\t/**\n\t * @callback PluginSetup\n\t * @this {Jsep} jsep\n\t * @returns: void\n\t */\n\t/**\n\t * Adds the given plugin(s) to the registry\n\t *\n\t * @param {object} plugins\n\t * @param {string} plugins.name The name of the plugin\n\t * @param {PluginSetup} plugins.init The init function\n\t * @public\n\t */\n\tregister(...plugins) {\n\t\tplugins.forEach((plugin) => {\n\t\t\tif (typeof plugin !== 'object' || !plugin.name || !plugin.init) {\n\t\t\t\tthrow new Error('Invalid JSEP plugin format');\n\t\t\t}\n\t\t\tif (this.registered[plugin.name]) {\n\t\t\t\t// already registered. Ignore.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tplugin.init(this.jsep);\n\t\t\tthis.registered[plugin.name] = plugin;\n\t\t});\n\t}\n}\n\n// JavaScript Expression Parser (JSEP) 1.4.0\n\nclass Jsep {\n\t/**\n\t * @returns {string}\n\t */\n\tstatic get version() {\n\t\t// To be filled in by the template\n\t\treturn '1.4.0';\n\t}\n\n\t/**\n\t * @returns {string}\n\t */\n\tstatic toString() {\n\t\treturn 'JavaScript Expression Parser (JSEP) v' + Jsep.version;\n\t};\n\n\t// ==================== CONFIG ================================\n\t/**\n\t * @method addUnaryOp\n\t * @param {string} op_name The name of the unary op to add\n\t * @returns {Jsep}\n\t */\n\tstatic addUnaryOp(op_name) {\n\t\tJsep.max_unop_len = Math.max(op_name.length, Jsep.max_unop_len);\n\t\tJsep.unary_ops[op_name] = 1;\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method jsep.addBinaryOp\n\t * @param {string} op_name The name of the binary op to add\n\t * @param {number} precedence The precedence of the binary op (can be a float). Higher number = higher precedence\n\t * @param {boolean} [isRightAssociative=false] whether operator is right-associative\n\t * @returns {Jsep}\n\t */\n\tstatic addBinaryOp(op_name, precedence, isRightAssociative) {\n\t\tJsep.max_binop_len = Math.max(op_name.length, Jsep.max_binop_len);\n\t\tJsep.binary_ops[op_name] = precedence;\n\t\tif (isRightAssociative) {\n\t\t\tJsep.right_associative.add(op_name);\n\t\t}\n\t\telse {\n\t\t\tJsep.right_associative.delete(op_name);\n\t\t}\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method addIdentifierChar\n\t * @param {string} char The additional character to treat as a valid part of an identifier\n\t * @returns {Jsep}\n\t */\n\tstatic addIdentifierChar(char) {\n\t\tJsep.additional_identifier_chars.add(char);\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method addLiteral\n\t * @param {string} literal_name The name of the literal to add\n\t * @param {*} literal_value The value of the literal\n\t * @returns {Jsep}\n\t */\n\tstatic addLiteral(literal_name, literal_value) {\n\t\tJsep.literals[literal_name] = literal_value;\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeUnaryOp\n\t * @param {string} op_name The name of the unary op to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeUnaryOp(op_name) {\n\t\tdelete Jsep.unary_ops[op_name];\n\t\tif (op_name.length === Jsep.max_unop_len) {\n\t\t\tJsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);\n\t\t}\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllUnaryOps\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllUnaryOps() {\n\t\tJsep.unary_ops = {};\n\t\tJsep.max_unop_len = 0;\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeIdentifierChar\n\t * @param {string} char The additional character to stop treating as a valid part of an identifier\n\t * @returns {Jsep}\n\t */\n\tstatic removeIdentifierChar(char) {\n\t\tJsep.additional_identifier_chars.delete(char);\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeBinaryOp\n\t * @param {string} op_name The name of the binary op to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeBinaryOp(op_name) {\n\t\tdelete Jsep.binary_ops[op_name];\n\n\t\tif (op_name.length === Jsep.max_binop_len) {\n\t\t\tJsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);\n\t\t}\n\t\tJsep.right_associative.delete(op_name);\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllBinaryOps\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllBinaryOps() {\n\t\tJsep.binary_ops = {};\n\t\tJsep.max_binop_len = 0;\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeLiteral\n\t * @param {string} literal_name The name of the literal to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeLiteral(literal_name) {\n\t\tdelete Jsep.literals[literal_name];\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllLiterals\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllLiterals() {\n\t\tJsep.literals = {};\n\n\t\treturn Jsep;\n\t}\n\t// ==================== END CONFIG ============================\n\n\n\t/**\n\t * @returns {string}\n\t */\n\tget char() {\n\t\treturn this.expr.charAt(this.index);\n\t}\n\n\t/**\n\t * @returns {number}\n\t */\n\tget code() {\n\t\treturn this.expr.charCodeAt(this.index);\n\t};\n\n\n\t/**\n\t * @param {string} expr a string with the passed in express\n\t * @returns Jsep\n\t */\n\tconstructor(expr) {\n\t\t// `index` stores the character number we are currently at\n\t\t// All of the gobbles below will modify `index` as we move along\n\t\tthis.expr = expr;\n\t\tthis.index = 0;\n\t}\n\n\t/**\n\t * static top-level parser\n\t * @returns {jsep.Expression}\n\t */\n\tstatic parse(expr) {\n\t\treturn (new Jsep(expr)).parse();\n\t}\n\n\t/**\n\t * Get the longest key length of any object\n\t * @param {object} obj\n\t * @returns {number}\n\t */\n\tstatic getMaxKeyLen(obj) {\n\t\treturn Math.max(0, ...Object.keys(obj).map(k => k.length));\n\t}\n\n\t/**\n\t * `ch` is a character code in the next three functions\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isDecimalDigit(ch) {\n\t\treturn (ch >= 48 && ch <= 57); // 0...9\n\t}\n\n\t/**\n\t * Returns the precedence of a binary operator or `0` if it isn't a binary operator. Can be float.\n\t * @param {string} op_val\n\t * @returns {number}\n\t */\n\tstatic binaryPrecedence(op_val) {\n\t\treturn Jsep.binary_ops[op_val] || 0;\n\t}\n\n\t/**\n\t * Looks for start of identifier\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isIdentifierStart(ch) {\n\t\treturn (ch >= 65 && ch <= 90) || // A...Z\n\t\t\t(ch >= 97 && ch <= 122) || // a...z\n\t\t\t(ch >= 128 && !Jsep.binary_ops[String.fromCharCode(ch)]) || // any non-ASCII that is not an operator\n\t\t\t(Jsep.additional_identifier_chars.has(String.fromCharCode(ch))); // additional characters\n\t}\n\n\t/**\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isIdentifierPart(ch) {\n\t\treturn Jsep.isIdentifierStart(ch) || Jsep.isDecimalDigit(ch);\n\t}\n\n\t/**\n\t * throw error at index of the expression\n\t * @param {string} message\n\t * @throws\n\t */\n\tthrowError(message) {\n\t\tconst error = new Error(message + ' at character ' + this.index);\n\t\terror.index = this.index;\n\t\terror.description = message;\n\t\tthrow error;\n\t}\n\n\t/**\n\t * Run a given hook\n\t * @param {string} name\n\t * @param {jsep.Expression|false} [node]\n\t * @returns {?jsep.Expression}\n\t */\n\trunHook(name, node) {\n\t\tif (Jsep.hooks[name]) {\n\t\t\tconst env = { context: this, node };\n\t\t\tJsep.hooks.run(name, env);\n\t\t\treturn env.node;\n\t\t}\n\t\treturn node;\n\t}\n\n\t/**\n\t * Runs a given hook until one returns a node\n\t * @param {string} name\n\t * @returns {?jsep.Expression}\n\t */\n\tsearchHook(name) {\n\t\tif (Jsep.hooks[name]) {\n\t\t\tconst env = { context: this };\n\t\t\tJsep.hooks[name].find(function (callback) {\n\t\t\t\tcallback.call(env.context, env);\n\t\t\t\treturn env.node;\n\t\t\t});\n\t\t\treturn env.node;\n\t\t}\n\t}\n\n\t/**\n\t * Push `index` up to the next non-space character\n\t */\n\tgobbleSpaces() {\n\t\tlet ch = this.code;\n\t\t// Whitespace\n\t\twhile (ch === Jsep.SPACE_CODE\n\t\t|| ch === Jsep.TAB_CODE\n\t\t|| ch === Jsep.LF_CODE\n\t\t|| ch === Jsep.CR_CODE) {\n\t\t\tch = this.expr.charCodeAt(++this.index);\n\t\t}\n\t\tthis.runHook('gobble-spaces');\n\t}\n\n\t/**\n\t * Top-level method to parse all expressions and returns compound or single node\n\t * @returns {jsep.Expression}\n\t */\n\tparse() {\n\t\tthis.runHook('before-all');\n\t\tconst nodes = this.gobbleExpressions();\n\n\t\t// If there's only one expression just try returning the expression\n\t\tconst node = nodes.length === 1\n\t\t ? nodes[0]\n\t\t\t: {\n\t\t\t\ttype: Jsep.COMPOUND,\n\t\t\t\tbody: nodes\n\t\t\t};\n\t\treturn this.runHook('after-all', node);\n\t}\n\n\t/**\n\t * top-level parser (but can be reused within as well)\n\t * @param {number} [untilICode]\n\t * @returns {jsep.Expression[]}\n\t */\n\tgobbleExpressions(untilICode) {\n\t\tlet nodes = [], ch_i, node;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tch_i = this.code;\n\n\t\t\t// Expressions can be separated by semicolons, commas, or just inferred without any\n\t\t\t// separators\n\t\t\tif (ch_i === Jsep.SEMCOL_CODE || ch_i === Jsep.COMMA_CODE) {\n\t\t\t\tthis.index++; // ignore separators\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Try to gobble each expression individually\n\t\t\t\tif (node = this.gobbleExpression()) {\n\t\t\t\t\tnodes.push(node);\n\t\t\t\t\t// If we weren't able to find a binary expression and are out of room, then\n\t\t\t\t\t// the expression passed in probably has too much\n\t\t\t\t}\n\t\t\t\telse if (this.index < this.expr.length) {\n\t\t\t\t\tif (ch_i === untilICode) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tthis.throwError('Unexpected \"' + this.char + '\"');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn nodes;\n\t}\n\n\t/**\n\t * The main parsing function.\n\t * @returns {?jsep.Expression}\n\t */\n\tgobbleExpression() {\n\t\tconst node = this.searchHook('gobble-expression') || this.gobbleBinaryExpression();\n\t\tthis.gobbleSpaces();\n\n\t\treturn this.runHook('after-expression', node);\n\t}\n\n\t/**\n\t * Search for the operation portion of the string (e.g. `+`, `===`)\n\t * Start by taking the longest possible binary operations (3 characters: `===`, `!==`, `>>>`)\n\t * and move down from 3 to 2 to 1 character until a matching binary operation is found\n\t * then, return that binary operation\n\t * @returns {string|boolean}\n\t */\n\tgobbleBinaryOp() {\n\t\tthis.gobbleSpaces();\n\t\tlet to_check = this.expr.substr(this.index, Jsep.max_binop_len);\n\t\tlet tc_len = to_check.length;\n\n\t\twhile (tc_len > 0) {\n\t\t\t// Don't accept a binary op when it is an identifier.\n\t\t\t// Binary ops that start with a identifier-valid character must be followed\n\t\t\t// by a non identifier-part valid character\n\t\t\tif (Jsep.binary_ops.hasOwnProperty(to_check) && (\n\t\t\t\t!Jsep.isIdentifierStart(this.code) ||\n\t\t\t\t(this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))\n\t\t\t)) {\n\t\t\t\tthis.index += tc_len;\n\t\t\t\treturn to_check;\n\t\t\t}\n\t\t\tto_check = to_check.substr(0, --tc_len);\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * This function is responsible for gobbling an individual expression,\n\t * e.g. `1`, `1+2`, `a+(b*2)-Math.sqrt(2)`\n\t * @returns {?jsep.BinaryExpression}\n\t */\n\tgobbleBinaryExpression() {\n\t\tlet node, biop, prec, stack, biop_info, left, right, i, cur_biop;\n\n\t\t// First, try to get the leftmost thing\n\t\t// Then, check to see if there's a binary operator operating on that leftmost thing\n\t\t// Don't gobbleBinaryOp without a left-hand-side\n\t\tleft = this.gobbleToken();\n\t\tif (!left) {\n\t\t\treturn left;\n\t\t}\n\t\tbiop = this.gobbleBinaryOp();\n\n\t\t// If there wasn't a binary operator, just return the leftmost node\n\t\tif (!biop) {\n\t\t\treturn left;\n\t\t}\n\n\t\t// Otherwise, we need to start a stack to properly place the binary operations in their\n\t\t// precedence structure\n\t\tbiop_info = { value: biop, prec: Jsep.binaryPrecedence(biop), right_a: Jsep.right_associative.has(biop) };\n\n\t\tright = this.gobbleToken();\n\n\t\tif (!right) {\n\t\t\tthis.throwError(\"Expected expression after \" + biop);\n\t\t}\n\n\t\tstack = [left, biop_info, right];\n\n\t\t// Properly deal with precedence using [recursive descent](http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm)\n\t\twhile ((biop = this.gobbleBinaryOp())) {\n\t\t\tprec = Jsep.binaryPrecedence(biop);\n\n\t\t\tif (prec === 0) {\n\t\t\t\tthis.index -= biop.length;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbiop_info = { value: biop, prec, right_a: Jsep.right_associative.has(biop) };\n\n\t\t\tcur_biop = biop;\n\n\t\t\t// Reduce: make a binary expression from the three topmost entries.\n\t\t\tconst comparePrev = prev => biop_info.right_a && prev.right_a\n\t\t\t\t? prec > prev.prec\n\t\t\t\t: prec <= prev.prec;\n\t\t\twhile ((stack.length > 2) && comparePrev(stack[stack.length - 2])) {\n\t\t\t\tright = stack.pop();\n\t\t\t\tbiop = stack.pop().value;\n\t\t\t\tleft = stack.pop();\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.BINARY_EXP,\n\t\t\t\t\toperator: biop,\n\t\t\t\t\tleft,\n\t\t\t\t\tright\n\t\t\t\t};\n\t\t\t\tstack.push(node);\n\t\t\t}\n\n\t\t\tnode = this.gobbleToken();\n\n\t\t\tif (!node) {\n\t\t\t\tthis.throwError(\"Expected expression after \" + cur_biop);\n\t\t\t}\n\n\t\t\tstack.push(biop_info, node);\n\t\t}\n\n\t\ti = stack.length - 1;\n\t\tnode = stack[i];\n\n\t\twhile (i > 1) {\n\t\t\tnode = {\n\t\t\t\ttype: Jsep.BINARY_EXP,\n\t\t\t\toperator: stack[i - 1].value,\n\t\t\t\tleft: stack[i - 2],\n\t\t\t\tright: node\n\t\t\t};\n\t\t\ti -= 2;\n\t\t}\n\n\t\treturn node;\n\t}\n\n\t/**\n\t * An individual part of a binary expression:\n\t * e.g. `foo.bar(baz)`, `1`, `\"abc\"`, `(a % 2)` (because it's in parenthesis)\n\t * @returns {boolean|jsep.Expression}\n\t */\n\tgobbleToken() {\n\t\tlet ch, to_check, tc_len, node;\n\n\t\tthis.gobbleSpaces();\n\t\tnode = this.searchHook('gobble-token');\n\t\tif (node) {\n\t\t\treturn this.runHook('after-token', node);\n\t\t}\n\n\t\tch = this.code;\n\n\t\tif (Jsep.isDecimalDigit(ch) || ch === Jsep.PERIOD_CODE) {\n\t\t\t// Char code 46 is a dot `.` which can start off a numeric literal\n\t\t\treturn this.gobbleNumericLiteral();\n\t\t}\n\n\t\tif (ch === Jsep.SQUOTE_CODE || ch === Jsep.DQUOTE_CODE) {\n\t\t\t// Single or double quotes\n\t\t\tnode = this.gobbleStringLiteral();\n\t\t}\n\t\telse if (ch === Jsep.OBRACK_CODE) {\n\t\t\tnode = this.gobbleArray();\n\t\t}\n\t\telse {\n\t\t\tto_check = this.expr.substr(this.index, Jsep.max_unop_len);\n\t\t\ttc_len = to_check.length;\n\n\t\t\twhile (tc_len > 0) {\n\t\t\t\t// Don't accept an unary op when it is an identifier.\n\t\t\t\t// Unary ops that start with a identifier-valid character must be followed\n\t\t\t\t// by a non identifier-part valid character\n\t\t\t\tif (Jsep.unary_ops.hasOwnProperty(to_check) && (\n\t\t\t\t\t!Jsep.isIdentifierStart(this.code) ||\n\t\t\t\t\t(this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))\n\t\t\t\t)) {\n\t\t\t\t\tthis.index += tc_len;\n\t\t\t\t\tconst argument = this.gobbleToken();\n\t\t\t\t\tif (!argument) {\n\t\t\t\t\t\tthis.throwError('missing unaryOp argument');\n\t\t\t\t\t}\n\t\t\t\t\treturn this.runHook('after-token', {\n\t\t\t\t\t\ttype: Jsep.UNARY_EXP,\n\t\t\t\t\t\toperator: to_check,\n\t\t\t\t\t\targument,\n\t\t\t\t\t\tprefix: true\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tto_check = to_check.substr(0, --tc_len);\n\t\t\t}\n\n\t\t\tif (Jsep.isIdentifierStart(ch)) {\n\t\t\t\tnode = this.gobbleIdentifier();\n\t\t\t\tif (Jsep.literals.hasOwnProperty(node.name)) {\n\t\t\t\t\tnode = {\n\t\t\t\t\t\ttype: Jsep.LITERAL,\n\t\t\t\t\t\tvalue: Jsep.literals[node.name],\n\t\t\t\t\t\traw: node.name,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse if (node.name === Jsep.this_str) {\n\t\t\t\t\tnode = { type: Jsep.THIS_EXP };\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ch === Jsep.OPAREN_CODE) { // open parenthesis\n\t\t\t\tnode = this.gobbleGroup();\n\t\t\t}\n\t\t}\n\n\t\tif (!node) {\n\t\t\treturn this.runHook('after-token', false);\n\t\t}\n\n\t\tnode = this.gobbleTokenProperty(node);\n\t\treturn this.runHook('after-token', node);\n\t}\n\n\t/**\n\t * Gobble properties of of identifiers/strings/arrays/groups.\n\t * e.g. `foo`, `bar.baz`, `foo['bar'].baz`\n\t * It also gobbles function calls:\n\t * e.g. `Math.acos(obj.angle)`\n\t * @param {jsep.Expression} node\n\t * @returns {jsep.Expression}\n\t */\n\tgobbleTokenProperty(node) {\n\t\tthis.gobbleSpaces();\n\n\t\tlet ch = this.code;\n\t\twhile (ch === Jsep.PERIOD_CODE || ch === Jsep.OBRACK_CODE || ch === Jsep.OPAREN_CODE || ch === Jsep.QUMARK_CODE) {\n\t\t\tlet optional;\n\t\t\tif (ch === Jsep.QUMARK_CODE) {\n\t\t\t\tif (this.expr.charCodeAt(this.index + 1) !== Jsep.PERIOD_CODE) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\toptional = true;\n\t\t\t\tthis.index += 2;\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tch = this.code;\n\t\t\t}\n\t\t\tthis.index++;\n\n\t\t\tif (ch === Jsep.OBRACK_CODE) {\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.MEMBER_EXP,\n\t\t\t\t\tcomputed: true,\n\t\t\t\t\tobject: node,\n\t\t\t\t\tproperty: this.gobbleExpression()\n\t\t\t\t};\n\t\t\t\tif (!node.property) {\n\t\t\t\t\tthis.throwError('Unexpected \"' + this.char + '\"');\n\t\t\t\t}\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tch = this.code;\n\t\t\t\tif (ch !== Jsep.CBRACK_CODE) {\n\t\t\t\t\tthis.throwError('Unclosed [');\n\t\t\t\t}\n\t\t\t\tthis.index++;\n\t\t\t}\n\t\t\telse if (ch === Jsep.OPAREN_CODE) {\n\t\t\t\t// A function call is being made; gobble all the arguments\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.CALL_EXP,\n\t\t\t\t\t'arguments': this.gobbleArguments(Jsep.CPAREN_CODE),\n\t\t\t\t\tcallee: node\n\t\t\t\t};\n\t\t\t}\n\t\t\telse if (ch === Jsep.PERIOD_CODE || optional) {\n\t\t\t\tif (optional) {\n\t\t\t\t\tthis.index--;\n\t\t\t\t}\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.MEMBER_EXP,\n\t\t\t\t\tcomputed: false,\n\t\t\t\t\tobject: node,\n\t\t\t\t\tproperty: this.gobbleIdentifier(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (optional) {\n\t\t\t\tnode.optional = true;\n\t\t\t} // else leave undefined for compatibility with esprima\n\n\t\t\tthis.gobbleSpaces();\n\t\t\tch = this.code;\n\t\t}\n\n\t\treturn node;\n\t}\n\n\t/**\n\t * Parse simple numeric literals: `12`, `3.4`, `.5`. Do this by using a string to\n\t * keep track of everything in the numeric literal and then calling `parseFloat` on that string\n\t * @returns {jsep.Literal}\n\t */\n\tgobbleNumericLiteral() {\n\t\tlet number = '', ch, chCode;\n\n\t\twhile (Jsep.isDecimalDigit(this.code)) {\n\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t}\n\n\t\tif (this.code === Jsep.PERIOD_CODE) { // can start with a decimal marker\n\t\t\tnumber += this.expr.charAt(this.index++);\n\n\t\t\twhile (Jsep.isDecimalDigit(this.code)) {\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\t\t}\n\n\t\tch = this.char;\n\n\t\tif (ch === 'e' || ch === 'E') { // exponent marker\n\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\tch = this.char;\n\n\t\t\tif (ch === '+' || ch === '-') { // exponent sign\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\n\t\t\twhile (Jsep.isDecimalDigit(this.code)) { // exponent itself\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\n\t\t\tif (!Jsep.isDecimalDigit(this.expr.charCodeAt(this.index - 1)) ) {\n\t\t\t\tthis.throwError('Expected exponent (' + number + this.char + ')');\n\t\t\t}\n\t\t}\n\n\t\tchCode = this.code;\n\n\t\t// Check to make sure this isn't a variable name that start with a number (123abc)\n\t\tif (Jsep.isIdentifierStart(chCode)) {\n\t\t\tthis.throwError('Variable names cannot start with a number (' +\n\t\t\t\tnumber + this.char + ')');\n\t\t}\n\t\telse if (chCode === Jsep.PERIOD_CODE || (number.length === 1 && number.charCodeAt(0) === Jsep.PERIOD_CODE)) {\n\t\t\tthis.throwError('Unexpected period');\n\t\t}\n\n\t\treturn {\n\t\t\ttype: Jsep.LITERAL,\n\t\t\tvalue: parseFloat(number),\n\t\t\traw: number\n\t\t};\n\t}\n\n\t/**\n\t * Parses a string literal, staring with single or double quotes with basic support for escape codes\n\t * e.g. `\"hello world\"`, `'this is\\nJSEP'`\n\t * @returns {jsep.Literal}\n\t */\n\tgobbleStringLiteral() {\n\t\tlet str = '';\n\t\tconst startIndex = this.index;\n\t\tconst quote = this.expr.charAt(this.index++);\n\t\tlet closed = false;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tlet ch = this.expr.charAt(this.index++);\n\n\t\t\tif (ch === quote) {\n\t\t\t\tclosed = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (ch === '\\\\') {\n\t\t\t\t// Check for all of the common escape codes\n\t\t\t\tch = this.expr.charAt(this.index++);\n\n\t\t\t\tswitch (ch) {\n\t\t\t\t\tcase 'n': str += '\\n'; break;\n\t\t\t\t\tcase 'r': str += '\\r'; break;\n\t\t\t\t\tcase 't': str += '\\t'; break;\n\t\t\t\t\tcase 'b': str += '\\b'; break;\n\t\t\t\t\tcase 'f': str += '\\f'; break;\n\t\t\t\t\tcase 'v': str += '\\x0B'; break;\n\t\t\t\t\tdefault : str += ch;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tstr += ch;\n\t\t\t}\n\t\t}\n\n\t\tif (!closed) {\n\t\t\tthis.throwError('Unclosed quote after \"' + str + '\"');\n\t\t}\n\n\t\treturn {\n\t\t\ttype: Jsep.LITERAL,\n\t\t\tvalue: str,\n\t\t\traw: this.expr.substring(startIndex, this.index),\n\t\t};\n\t}\n\n\t/**\n\t * Gobbles only identifiers\n\t * e.g.: `foo`, `_value`, `$x1`\n\t * Also, this function checks if that identifier is a literal:\n\t * (e.g. `true`, `false`, `null`) or `this`\n\t * @returns {jsep.Identifier}\n\t */\n\tgobbleIdentifier() {\n\t\tlet ch = this.code, start = this.index;\n\n\t\tif (Jsep.isIdentifierStart(ch)) {\n\t\t\tthis.index++;\n\t\t}\n\t\telse {\n\t\t\tthis.throwError('Unexpected ' + this.char);\n\t\t}\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tch = this.code;\n\n\t\t\tif (Jsep.isIdentifierPart(ch)) {\n\t\t\t\tthis.index++;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\ttype: Jsep.IDENTIFIER,\n\t\t\tname: this.expr.slice(start, this.index),\n\t\t};\n\t}\n\n\t/**\n\t * Gobbles a list of arguments within the context of a function call\n\t * or array literal. This function also assumes that the opening character\n\t * `(` or `[` has already been gobbled, and gobbles expressions and commas\n\t * until the terminator character `)` or `]` is encountered.\n\t * e.g. `foo(bar, baz)`, `my_func()`, or `[bar, baz]`\n\t * @param {number} termination\n\t * @returns {jsep.Expression[]}\n\t */\n\tgobbleArguments(termination) {\n\t\tconst args = [];\n\t\tlet closed = false;\n\t\tlet separator_count = 0;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tthis.gobbleSpaces();\n\t\t\tlet ch_i = this.code;\n\n\t\t\tif (ch_i === termination) { // done parsing\n\t\t\t\tclosed = true;\n\t\t\t\tthis.index++;\n\n\t\t\t\tif (termination === Jsep.CPAREN_CODE && separator_count && separator_count >= args.length){\n\t\t\t\t\tthis.throwError('Unexpected token ' + String.fromCharCode(termination));\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (ch_i === Jsep.COMMA_CODE) { // between expressions\n\t\t\t\tthis.index++;\n\t\t\t\tseparator_count++;\n\n\t\t\t\tif (separator_count !== args.length) { // missing argument\n\t\t\t\t\tif (termination === Jsep.CPAREN_CODE) {\n\t\t\t\t\t\tthis.throwError('Unexpected token ,');\n\t\t\t\t\t}\n\t\t\t\t\telse if (termination === Jsep.CBRACK_CODE) {\n\t\t\t\t\t\tfor (let arg = args.length; arg < separator_count; arg++) {\n\t\t\t\t\t\t\targs.push(null);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (args.length !== separator_count && separator_count !== 0) {\n\t\t\t\t// NOTE: `&& separator_count !== 0` allows for either all commas, or all spaces as arguments\n\t\t\t\tthis.throwError('Expected comma');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst node = this.gobbleExpression();\n\n\t\t\t\tif (!node || node.type === Jsep.COMPOUND) {\n\t\t\t\t\tthis.throwError('Expected comma');\n\t\t\t\t}\n\n\t\t\t\targs.push(node);\n\t\t\t}\n\t\t}\n\n\t\tif (!closed) {\n\t\t\tthis.throwError('Expected ' + String.fromCharCode(termination));\n\t\t}\n\n\t\treturn args;\n\t}\n\n\t/**\n\t * Responsible for parsing a group of things within parentheses `()`\n\t * that have no identifier in front (so not a function call)\n\t * This function assumes that it needs to gobble the opening parenthesis\n\t * and then tries to gobble everything within that parenthesis, assuming\n\t * that the next thing it should see is the close parenthesis. If not,\n\t * then the expression probably doesn't have a `)`\n\t * @returns {boolean|jsep.Expression}\n\t */\n\tgobbleGroup() {\n\t\tthis.index++;\n\t\tlet nodes = this.gobbleExpressions(Jsep.CPAREN_CODE);\n\t\tif (this.code === Jsep.CPAREN_CODE) {\n\t\t\tthis.index++;\n\t\t\tif (nodes.length === 1) {\n\t\t\t\treturn nodes[0];\n\t\t\t}\n\t\t\telse if (!nodes.length) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn {\n\t\t\t\t\ttype: Jsep.SEQUENCE_EXP,\n\t\t\t\t\texpressions: nodes,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis.throwError('Unclosed (');\n\t\t}\n\t}\n\n\t/**\n\t * Responsible for parsing Array literals `[1, 2, 3]`\n\t * This function assumes that it needs to gobble the opening bracket\n\t * and then tries to gobble the expressions as arguments.\n\t * @returns {jsep.ArrayExpression}\n\t */\n\tgobbleArray() {\n\t\tthis.index++;\n\n\t\treturn {\n\t\t\ttype: Jsep.ARRAY_EXP,\n\t\t\telements: this.gobbleArguments(Jsep.CBRACK_CODE)\n\t\t};\n\t}\n}\n\n// Static fields:\nconst hooks = new Hooks();\nObject.assign(Jsep, {\n\thooks,\n\tplugins: new Plugins(Jsep),\n\n\t// Node Types\n\t// ----------\n\t// This is the full set of types that any JSEP node can be.\n\t// Store them here to save space when minified\n\tCOMPOUND: 'Compound',\n\tSEQUENCE_EXP: 'SequenceExpression',\n\tIDENTIFIER: 'Identifier',\n\tMEMBER_EXP: 'MemberExpression',\n\tLITERAL: 'Literal',\n\tTHIS_EXP: 'ThisExpression',\n\tCALL_EXP: 'CallExpression',\n\tUNARY_EXP: 'UnaryExpression',\n\tBINARY_EXP: 'BinaryExpression',\n\tARRAY_EXP: 'ArrayExpression',\n\n\tTAB_CODE: 9,\n\tLF_CODE: 10,\n\tCR_CODE: 13,\n\tSPACE_CODE: 32,\n\tPERIOD_CODE: 46, // '.'\n\tCOMMA_CODE: 44, // ','\n\tSQUOTE_CODE: 39, // single quote\n\tDQUOTE_CODE: 34, // double quotes\n\tOPAREN_CODE: 40, // (\n\tCPAREN_CODE: 41, // )\n\tOBRACK_CODE: 91, // [\n\tCBRACK_CODE: 93, // ]\n\tQUMARK_CODE: 63, // ?\n\tSEMCOL_CODE: 59, // ;\n\tCOLON_CODE: 58, // :\n\n\n\t// Operations\n\t// ----------\n\t// Use a quickly-accessible map to store all of the unary operators\n\t// Values are set to `1` (it really doesn't matter)\n\tunary_ops: {\n\t\t'-': 1,\n\t\t'!': 1,\n\t\t'~': 1,\n\t\t'+': 1\n\t},\n\n\t// Also use a map for the binary operations but set their values to their\n\t// binary precedence for quick reference (higher number = higher precedence)\n\t// see [Order of operations](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)\n\tbinary_ops: {\n\t\t'||': 1, '??': 1,\n\t\t'&&': 2, '|': 3, '^': 4, '&': 5,\n\t\t'==': 6, '!=': 6, '===': 6, '!==': 6,\n\t\t'<': 7, '>': 7, '<=': 7, '>=': 7,\n\t\t'<<': 8, '>>': 8, '>>>': 8,\n\t\t'+': 9, '-': 9,\n\t\t'*': 10, '/': 10, '%': 10,\n\t\t'**': 11,\n\t},\n\n\t// sets specific binary_ops as right-associative\n\tright_associative: new Set(['**']),\n\n\t// Additional valid identifier chars, apart from a-z, A-Z and 0-9 (except on the starting char)\n\tadditional_identifier_chars: new Set(['$', '_']),\n\n\t// Literals\n\t// ----------\n\t// Store the values to return for the various literals we may encounter\n\tliterals: {\n\t\t'true': true,\n\t\t'false': false,\n\t\t'null': null\n\t},\n\n\t// Except for `this`, which is special. This could be changed to something like `'self'` as well\n\tthis_str: 'this',\n});\nJsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);\nJsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);\n\n// Backward Compatibility:\nconst jsep = expr => (new Jsep(expr)).parse();\nconst stdClassProps = Object.getOwnPropertyNames(class Test{});\nObject.getOwnPropertyNames(Jsep)\n\t.filter(prop => !stdClassProps.includes(prop) && jsep[prop] === undefined)\n\t.forEach((m) => {\n\t\tjsep[m] = Jsep[m];\n\t});\njsep.Jsep = Jsep; // allows for const { Jsep } = require('jsep');\n\nconst CONDITIONAL_EXP = 'ConditionalExpression';\n\nvar ternary = {\n\tname: 'ternary',\n\n\tinit(jsep) {\n\t\t// Ternary expression: test ? consequent : alternate\n\t\tjsep.hooks.add('after-expression', function gobbleTernary(env) {\n\t\t\tif (env.node && this.code === jsep.QUMARK_CODE) {\n\t\t\t\tthis.index++;\n\t\t\t\tconst test = env.node;\n\t\t\t\tconst consequent = this.gobbleExpression();\n\n\t\t\t\tif (!consequent) {\n\t\t\t\t\tthis.throwError('Expected expression');\n\t\t\t\t}\n\n\t\t\t\tthis.gobbleSpaces();\n\n\t\t\t\tif (this.code === jsep.COLON_CODE) {\n\t\t\t\t\tthis.index++;\n\t\t\t\t\tconst alternate = this.gobbleExpression();\n\n\t\t\t\t\tif (!alternate) {\n\t\t\t\t\t\tthis.throwError('Expected expression');\n\t\t\t\t\t}\n\t\t\t\t\tenv.node = {\n\t\t\t\t\t\ttype: CONDITIONAL_EXP,\n\t\t\t\t\t\ttest,\n\t\t\t\t\t\tconsequent,\n\t\t\t\t\t\talternate,\n\t\t\t\t\t};\n\n\t\t\t\t\t// check for operators of higher priority than ternary (i.e. assignment)\n\t\t\t\t\t// jsep sets || at 1, and assignment at 0.9, and conditional should be between them\n\t\t\t\t\tif (test.operator && jsep.binary_ops[test.operator] <= 0.9) {\n\t\t\t\t\t\tlet newTest = test;\n\t\t\t\t\t\twhile (newTest.right.operator && jsep.binary_ops[newTest.right.operator] <= 0.9) {\n\t\t\t\t\t\t\tnewTest = newTest.right;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tenv.node.test = newTest.right;\n\t\t\t\t\t\tnewTest.right = env.node;\n\t\t\t\t\t\tenv.node = test;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.throwError('Expected :');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n};\n\n// Add default plugins:\n\njsep.plugins.register(ternary);\n\nexport { Jsep, jsep as default };\n","const FSLASH_CODE = 47; // '/'\nconst BSLASH_CODE = 92; // '\\\\'\n\nvar index = {\n\tname: 'regex',\n\n\tinit(jsep) {\n\t\t// Regex literal: /abc123/ig\n\t\tjsep.hooks.add('gobble-token', function gobbleRegexLiteral(env) {\n\t\t\tif (this.code === FSLASH_CODE) {\n\t\t\t\tconst patternIndex = ++this.index;\n\n\t\t\t\tlet inCharSet = false;\n\t\t\t\twhile (this.index < this.expr.length) {\n\t\t\t\t\tif (this.code === FSLASH_CODE && !inCharSet) {\n\t\t\t\t\t\tconst pattern = this.expr.slice(patternIndex, this.index);\n\n\t\t\t\t\t\tlet flags = '';\n\t\t\t\t\t\twhile (++this.index < this.expr.length) {\n\t\t\t\t\t\t\tconst code = this.code;\n\t\t\t\t\t\t\tif ((code >= 97 && code <= 122) // a...z\n\t\t\t\t\t\t\t\t|| (code >= 65 && code <= 90) // A...Z\n\t\t\t\t\t\t\t\t|| (code >= 48 && code <= 57)) { // 0-9\n\t\t\t\t\t\t\t\tflags += this.char;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet value;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tvalue = new RegExp(pattern, flags);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch (e) {\n\t\t\t\t\t\t\tthis.throwError(e.message);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tenv.node = {\n\t\t\t\t\t\t\ttype: jsep.LITERAL,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\traw: this.expr.slice(patternIndex - 1, this.index),\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// allow . [] and () after regex: /regex/.test(a)\n\t\t\t\t\t\tenv.node = this.gobbleTokenProperty(env.node);\n\t\t\t\t\t\treturn env.node;\n\t\t\t\t\t}\n\t\t\t\t\tif (this.code === jsep.OBRACK_CODE) {\n\t\t\t\t\t\tinCharSet = true;\n\t\t\t\t\t}\n\t\t\t\t\telse if (inCharSet && this.code === jsep.CBRACK_CODE) {\n\t\t\t\t\t\tinCharSet = false;\n\t\t\t\t\t}\n\t\t\t\t\tthis.index += this.code === BSLASH_CODE ? 2 : 1;\n\t\t\t\t}\n\t\t\t\tthis.throwError('Unclosed Regex');\n\t\t\t}\n\t\t});\n\t},\n};\n\nexport { index as default };\n","const PLUS_CODE = 43; // +\nconst MINUS_CODE = 45; // -\n\nconst plugin = {\n\tname: 'assignment',\n\n\tassignmentOperators: new Set([\n\t\t'=',\n\t\t'*=',\n\t\t'**=',\n\t\t'/=',\n\t\t'%=',\n\t\t'+=',\n\t\t'-=',\n\t\t'<<=',\n\t\t'>>=',\n\t\t'>>>=',\n\t\t'&=',\n\t\t'^=',\n\t\t'|=',\n\t\t'||=',\n\t\t'&&=',\n\t\t'??=',\n\t]),\n\tupdateOperators: [PLUS_CODE, MINUS_CODE],\n\tassignmentPrecedence: 0.9,\n\n\tinit(jsep) {\n\t\tconst updateNodeTypes = [jsep.IDENTIFIER, jsep.MEMBER_EXP];\n\t\tplugin.assignmentOperators.forEach(op => jsep.addBinaryOp(op, plugin.assignmentPrecedence, true));\n\n\t\tjsep.hooks.add('gobble-token', function gobbleUpdatePrefix(env) {\n\t\t\tconst code = this.code;\n\t\t\tif (plugin.updateOperators.some(c => c === code && c === this.expr.charCodeAt(this.index + 1))) {\n\t\t\t\tthis.index += 2;\n\t\t\t\tenv.node = {\n\t\t\t\t\ttype: 'UpdateExpression',\n\t\t\t\t\toperator: code === PLUS_CODE ? '++' : '--',\n\t\t\t\t\targument: this.gobbleTokenProperty(this.gobbleIdentifier()),\n\t\t\t\t\tprefix: true,\n\t\t\t\t};\n\t\t\t\tif (!env.node.argument || !updateNodeTypes.includes(env.node.argument.type)) {\n\t\t\t\t\tthis.throwError(`Unexpected ${env.node.operator}`);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tjsep.hooks.add('after-token', function gobbleUpdatePostfix(env) {\n\t\t\tif (env.node) {\n\t\t\t\tconst code = this.code;\n\t\t\t\tif (plugin.updateOperators.some(c => c === code && c === this.expr.charCodeAt(this.index + 1))) {\n\t\t\t\t\tif (!updateNodeTypes.includes(env.node.type)) {\n\t\t\t\t\t\tthis.throwError(`Unexpected ${env.node.operator}`);\n\t\t\t\t\t}\n\t\t\t\t\tthis.index += 2;\n\t\t\t\t\tenv.node = {\n\t\t\t\t\t\ttype: 'UpdateExpression',\n\t\t\t\t\t\toperator: code === PLUS_CODE ? '++' : '--',\n\t\t\t\t\t\targument: env.node,\n\t\t\t\t\t\tprefix: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tjsep.hooks.add('after-expression', function gobbleAssignment(env) {\n\t\t\tif (env.node) {\n\t\t\t\t// Note: Binaries can be chained in a single expression to respect\n\t\t\t\t// operator precedence (i.e. a = b = 1 + 2 + 3)\n\t\t\t\t// Update all binary assignment nodes in the tree\n\t\t\t\tupdateBinariesToAssignments(env.node);\n\t\t\t}\n\t\t});\n\n\t\tfunction updateBinariesToAssignments(node) {\n\t\t\tif (plugin.assignmentOperators.has(node.operator)) {\n\t\t\t\tnode.type = 'AssignmentExpression';\n\t\t\t\tupdateBinariesToAssignments(node.left);\n\t\t\t\tupdateBinariesToAssignments(node.right);\n\t\t\t}\n\t\t\telse if (!node.operator) {\n\t\t\t\tObject.values(node).forEach((val) => {\n\t\t\t\t\tif (val && typeof val === 'object') {\n\t\t\t\t\t\tupdateBinariesToAssignments(val);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t},\n};\n\nexport { plugin as default };\n","/* eslint-disable no-bitwise -- Convenient */\nimport jsep from 'jsep';\nimport jsepRegex from '@jsep-plugin/regex';\nimport jsepAssignment from '@jsep-plugin/assignment';\n\n// register plugins\njsep.plugins.register(jsepRegex, jsepAssignment);\njsep.addUnaryOp('typeof');\njsep.addUnaryOp('void');\njsep.addLiteral('null', null);\njsep.addLiteral('undefined', undefined);\n\nconst BLOCKED_PROTO_PROPERTIES = new Set([\n 'constructor',\n '__proto__',\n '__defineGetter__',\n '__defineSetter__',\n '__lookupGetter__',\n '__lookupSetter__'\n]);\n\nconst SafeEval = {\n /**\n * @param {jsep.Expression} ast\n * @param {Record} subs\n */\n evalAst (ast, subs) {\n switch (ast.type) {\n case 'BinaryExpression':\n case 'LogicalExpression':\n return SafeEval.evalBinaryExpression(ast, subs);\n case 'Compound':\n return SafeEval.evalCompound(ast, subs);\n case 'ConditionalExpression':\n return SafeEval.evalConditionalExpression(ast, subs);\n case 'Identifier':\n return SafeEval.evalIdentifier(ast, subs);\n case 'Literal':\n return SafeEval.evalLiteral(ast, subs);\n case 'MemberExpression':\n return SafeEval.evalMemberExpression(ast, subs);\n case 'UnaryExpression':\n return SafeEval.evalUnaryExpression(ast, subs);\n case 'ArrayExpression':\n return SafeEval.evalArrayExpression(ast, subs);\n case 'CallExpression':\n return SafeEval.evalCallExpression(ast, subs);\n case 'AssignmentExpression':\n return SafeEval.evalAssignmentExpression(ast, subs);\n default:\n throw SyntaxError('Unexpected expression', ast);\n }\n },\n evalBinaryExpression (ast, subs) {\n const result = {\n '||': (a, b) => a || b(),\n '&&': (a, b) => a && b(),\n '|': (a, b) => a | b(),\n '^': (a, b) => a ^ b(),\n '&': (a, b) => a & b(),\n // eslint-disable-next-line eqeqeq -- API\n '==': (a, b) => a == b(),\n // eslint-disable-next-line eqeqeq -- API\n '!=': (a, b) => a != b(),\n '===': (a, b) => a === b(),\n '!==': (a, b) => a !== b(),\n '<': (a, b) => a < b(),\n '>': (a, b) => a > b(),\n '<=': (a, b) => a <= b(),\n '>=': (a, b) => a >= b(),\n '<<': (a, b) => a << b(),\n '>>': (a, b) => a >> b(),\n '>>>': (a, b) => a >>> b(),\n '+': (a, b) => a + b(),\n '-': (a, b) => a - b(),\n '*': (a, b) => a * b(),\n '/': (a, b) => a / b(),\n '%': (a, b) => a % b()\n }[ast.operator](\n SafeEval.evalAst(ast.left, subs),\n () => SafeEval.evalAst(ast.right, subs)\n );\n return result;\n },\n evalCompound (ast, subs) {\n let last;\n for (let i = 0; i < ast.body.length; i++) {\n if (\n ast.body[i].type === 'Identifier' &&\n ['var', 'let', 'const'].includes(ast.body[i].name) &&\n ast.body[i + 1] &&\n ast.body[i + 1].type === 'AssignmentExpression'\n ) {\n // var x=2; is detected as\n // [{Identifier var}, {AssignmentExpression x=2}]\n // eslint-disable-next-line @stylistic/max-len -- Long\n // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient\n i += 1;\n }\n const expr = ast.body[i];\n last = SafeEval.evalAst(expr, subs);\n }\n return last;\n },\n evalConditionalExpression (ast, subs) {\n if (SafeEval.evalAst(ast.test, subs)) {\n return SafeEval.evalAst(ast.consequent, subs);\n }\n return SafeEval.evalAst(ast.alternate, subs);\n },\n evalIdentifier (ast, subs) {\n if (Object.hasOwn(subs, ast.name)) {\n return subs[ast.name];\n }\n throw ReferenceError(`${ast.name} is not defined`);\n },\n evalLiteral (ast) {\n return ast.value;\n },\n evalMemberExpression (ast, subs) {\n const prop = String(\n // NOTE: `String(value)` throws error when\n // value has overwritten the toString method to return non-string\n // i.e. `value = {toString: () => []}`\n ast.computed\n ? SafeEval.evalAst(ast.property) // `object[property]`\n : ast.property.name // `object.property` property is Identifier\n );\n const obj = SafeEval.evalAst(ast.object, subs);\n if (obj === undefined || obj === null) {\n throw TypeError(\n `Cannot read properties of ${obj} (reading '${prop}')`\n );\n }\n if (!Object.hasOwn(obj, prop) && BLOCKED_PROTO_PROPERTIES.has(prop)) {\n throw TypeError(\n `Cannot read properties of ${obj} (reading '${prop}')`\n );\n }\n const result = obj[prop];\n if (typeof result === 'function' && result !== Function) {\n return result.bind(obj); // arrow functions aren't affected by bind.\n }\n return result;\n },\n evalUnaryExpression (ast, subs) {\n const result = {\n '-': (a) => -SafeEval.evalAst(a, subs),\n '!': (a) => !SafeEval.evalAst(a, subs),\n '~': (a) => ~SafeEval.evalAst(a, subs),\n // eslint-disable-next-line no-implicit-coercion -- API\n '+': (a) => +SafeEval.evalAst(a, subs),\n typeof: (a) => typeof SafeEval.evalAst(a, subs),\n // eslint-disable-next-line no-void, sonarjs/void-use -- feature\n void: (a) => void SafeEval.evalAst(a, subs)\n }[ast.operator](ast.argument);\n return result;\n },\n evalArrayExpression (ast, subs) {\n return ast.elements.map((el) => SafeEval.evalAst(el, subs));\n },\n evalCallExpression (ast, subs) {\n const args = ast.arguments.map((arg) => SafeEval.evalAst(arg, subs));\n const func = SafeEval.evalAst(ast.callee, subs);\n if (func === Function) {\n throw new Error('Function constructor is disabled');\n }\n return func(...args);\n },\n evalAssignmentExpression (ast, subs) {\n if (ast.left.type !== 'Identifier') {\n throw SyntaxError('Invalid left-hand side in assignment');\n }\n const id = ast.left.name;\n const value = SafeEval.evalAst(ast.right, subs);\n subs[id] = value;\n return subs[id];\n }\n};\n\n/**\n * A replacement for NodeJS' VM.Script which is also {@link https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP | Content Security Policy} friendly.\n */\nclass SafeScript {\n /**\n * @param {string} expr Expression to evaluate\n */\n constructor (expr) {\n this.code = expr;\n this.ast = jsep(this.code);\n }\n\n /**\n * @param {object} context Object whose items will be added\n * to evaluation\n * @returns {EvaluatedResult} Result of evaluated code\n */\n runInNewContext (context) {\n // `Object.create(null)` creates a prototypeless object\n const keyMap = Object.assign(Object.create(null), context);\n return SafeEval.evalAst(this.ast, keyMap);\n }\n}\n\nexport {SafeScript};\n","/* eslint-disable camelcase -- Convenient for escaping */\n\nimport {SafeScript} from './Safe-Script.js';\n\n/**\n * @typedef {null|boolean|number|string|object|GenericArray} JSONObject\n */\n\n/**\n * @typedef {any} AnyItem\n */\n\n/**\n * @typedef {any} AnyResult\n */\n\n/**\n * Copies array and then pushes item into it.\n * @param {GenericArray} arr Array to copy and into which to push\n * @param {AnyItem} item Array item to add (to end)\n * @returns {GenericArray} Copy of the original array\n */\nfunction push (arr, item) {\n arr = arr.slice();\n arr.push(item);\n return arr;\n}\n/**\n * Copies array and then unshifts item into it.\n * @param {AnyItem} item Array item to add (to beginning)\n * @param {GenericArray} arr Array to copy and into which to unshift\n * @returns {GenericArray} Copy of the original array\n */\nfunction unshift (item, arr) {\n arr = arr.slice();\n arr.unshift(item);\n return arr;\n}\n\n/**\n * Caught when JSONPath is used without `new` but rethrown if with `new`\n * @extends Error\n */\nclass NewError extends Error {\n /**\n * @param {AnyResult} value The evaluated scalar value\n */\n constructor (value) {\n super(\n 'JSONPath should not be called with \"new\" (it prevents return ' +\n 'of (unwrapped) scalar values)'\n );\n this.avoidNew = true;\n this.value = value;\n this.name = 'NewError';\n }\n}\n\n/**\n* @typedef {object} ReturnObject\n* @property {string} path\n* @property {JSONObject} value\n* @property {object|GenericArray} parent\n* @property {string} parentProperty\n*/\n\n/**\n* @callback JSONPathCallback\n* @param {string|object} preferredOutput\n* @param {\"value\"|\"property\"} type\n* @param {ReturnObject} fullRetObj\n* @returns {void}\n*/\n\n/**\n* @callback OtherTypeCallback\n* @param {JSONObject} val\n* @param {string} path\n* @param {object|GenericArray} parent\n* @param {string} parentPropName\n* @returns {boolean}\n*/\n\n/**\n * @typedef {any} ContextItem\n */\n\n/**\n * @typedef {any} EvaluatedResult\n */\n\n/**\n* @callback EvalCallback\n* @param {string} code\n* @param {ContextItem} context\n* @returns {EvaluatedResult}\n*/\n\n/**\n * @typedef {typeof SafeScript} EvalClass\n */\n\n/**\n * @typedef {object} JSONPathOptions\n * @property {JSON} json\n * @property {string|string[]} path\n * @property {\"value\"|\"path\"|\"pointer\"|\"parent\"|\"parentProperty\"|\n * \"all\"} [resultType=\"value\"]\n * @property {boolean} [flatten=false]\n * @property {boolean} [wrap=true]\n * @property {object} [sandbox={}]\n * @property {EvalCallback|EvalClass|'safe'|'native'|\n * boolean} [eval = 'safe']\n * @property {object|GenericArray|null} [parent=null]\n * @property {string|null} [parentProperty=null]\n * @property {JSONPathCallback} [callback]\n * @property {OtherTypeCallback} [otherTypeCallback] Defaults to\n * function which throws on encountering `@other`\n * @property {boolean} [autostart=true]\n */\n\n/**\n * @param {string|JSONPathOptions} opts If a string, will be treated as `expr`\n * @param {string} [expr] JSON path to evaluate\n * @param {JSON} [obj] JSON object to evaluate against\n * @param {JSONPathCallback} [callback] Passed 3 arguments: 1) desired payload\n * per `resultType`, 2) `\"value\"|\"property\"`, 3) Full returned object with\n * all payloads\n * @param {OtherTypeCallback} [otherTypeCallback] If `@other()` is at the end\n * of one's query, this will be invoked with the value of the item, its\n * path, its parent, and its parent's property name, and it should return\n * a boolean indicating whether the supplied value belongs to the \"other\"\n * type or not (or it may handle transformations and return `false`).\n * @returns {JSONPath}\n * @class\n */\nfunction JSONPath (opts, expr, obj, callback, otherTypeCallback) {\n // eslint-disable-next-line no-restricted-syntax -- Allow for pseudo-class\n if (!(this instanceof JSONPath)) {\n try {\n return new JSONPath(opts, expr, obj, callback, otherTypeCallback);\n } catch (e) {\n if (!e.avoidNew) {\n throw e;\n }\n return e.value;\n }\n }\n\n if (typeof opts === 'string') {\n otherTypeCallback = callback;\n callback = obj;\n obj = expr;\n expr = opts;\n opts = null;\n }\n const optObj = opts && typeof opts === 'object';\n opts = opts || {};\n this.json = opts.json || obj;\n this.path = opts.path || expr;\n this.resultType = opts.resultType || 'value';\n this.flatten = opts.flatten || false;\n this.wrap = Object.hasOwn(opts, 'wrap') ? opts.wrap : true;\n this.sandbox = opts.sandbox || {};\n this.eval = opts.eval === undefined ? 'safe' : opts.eval;\n this.ignoreEvalErrors = (typeof opts.ignoreEvalErrors === 'undefined')\n ? false\n : opts.ignoreEvalErrors;\n this.parent = opts.parent || null;\n this.parentProperty = opts.parentProperty || null;\n this.callback = opts.callback || callback || null;\n this.otherTypeCallback = opts.otherTypeCallback ||\n otherTypeCallback ||\n function () {\n throw new TypeError(\n 'You must supply an otherTypeCallback callback option ' +\n 'with the @other() operator.'\n );\n };\n\n if (opts.autostart !== false) {\n const args = {\n path: (optObj ? opts.path : expr)\n };\n if (!optObj) {\n args.json = obj;\n } else if ('json' in opts) {\n args.json = opts.json;\n }\n const ret = this.evaluate(args);\n if (!ret || typeof ret !== 'object') {\n throw new NewError(ret);\n }\n return ret;\n }\n}\n\n// PUBLIC METHODS\nJSONPath.prototype.evaluate = function (\n expr, json, callback, otherTypeCallback\n) {\n let currParent = this.parent,\n currParentProperty = this.parentProperty;\n let {flatten, wrap} = this;\n\n this.currResultType = this.resultType;\n this.currEval = this.eval;\n this.currSandbox = this.sandbox;\n callback = callback || this.callback;\n this.currOtherTypeCallback = otherTypeCallback || this.otherTypeCallback;\n\n json = json || this.json;\n expr = expr || this.path;\n if (expr && typeof expr === 'object' && !Array.isArray(expr)) {\n if (!expr.path && expr.path !== '') {\n throw new TypeError(\n 'You must supply a \"path\" property when providing an object ' +\n 'argument to JSONPath.evaluate().'\n );\n }\n if (!(Object.hasOwn(expr, 'json'))) {\n throw new TypeError(\n 'You must supply a \"json\" property when providing an object ' +\n 'argument to JSONPath.evaluate().'\n );\n }\n ({json} = expr);\n flatten = Object.hasOwn(expr, 'flatten') ? expr.flatten : flatten;\n this.currResultType = Object.hasOwn(expr, 'resultType')\n ? expr.resultType\n : this.currResultType;\n this.currSandbox = Object.hasOwn(expr, 'sandbox')\n ? expr.sandbox\n : this.currSandbox;\n wrap = Object.hasOwn(expr, 'wrap') ? expr.wrap : wrap;\n this.currEval = Object.hasOwn(expr, 'eval')\n ? expr.eval\n : this.currEval;\n callback = Object.hasOwn(expr, 'callback') ? expr.callback : callback;\n this.currOtherTypeCallback = Object.hasOwn(expr, 'otherTypeCallback')\n ? expr.otherTypeCallback\n : this.currOtherTypeCallback;\n currParent = Object.hasOwn(expr, 'parent') ? expr.parent : currParent;\n currParentProperty = Object.hasOwn(expr, 'parentProperty')\n ? expr.parentProperty\n : currParentProperty;\n expr = expr.path;\n }\n currParent = currParent || null;\n currParentProperty = currParentProperty || null;\n\n if (Array.isArray(expr)) {\n expr = JSONPath.toPathString(expr);\n }\n if ((!expr && expr !== '') || !json) {\n return undefined;\n }\n\n const exprList = JSONPath.toPathArray(expr);\n if (exprList[0] === '$' && exprList.length > 1) {\n exprList.shift();\n }\n this._hasParentSelector = null;\n const result = this\n ._trace(\n exprList, json, ['$'], currParent, currParentProperty, callback\n )\n .filter(function (ea) {\n return ea && !ea.isParentSelector;\n });\n\n if (!result.length) {\n return wrap ? [] : undefined;\n }\n if (!wrap && result.length === 1 && !result[0].hasArrExpr) {\n return this._getPreferredOutput(result[0]);\n }\n return result.reduce((rslt, ea) => {\n const valOrPath = this._getPreferredOutput(ea);\n if (flatten && Array.isArray(valOrPath)) {\n rslt = rslt.concat(valOrPath);\n } else {\n rslt.push(valOrPath);\n }\n return rslt;\n }, []);\n};\n\n// PRIVATE METHODS\n\nJSONPath.prototype._getPreferredOutput = function (ea) {\n const resultType = this.currResultType;\n switch (resultType) {\n case 'all': {\n const path = Array.isArray(ea.path)\n ? ea.path\n : JSONPath.toPathArray(ea.path);\n ea.pointer = JSONPath.toPointer(path);\n ea.path = typeof ea.path === 'string'\n ? ea.path\n : JSONPath.toPathString(ea.path);\n return ea;\n } case 'value': case 'parent': case 'parentProperty':\n return ea[resultType];\n case 'path':\n return JSONPath.toPathString(ea[resultType]);\n case 'pointer':\n return JSONPath.toPointer(ea.path);\n default:\n throw new TypeError('Unknown result type');\n }\n};\n\nJSONPath.prototype._handleCallback = function (fullRetObj, callback, type) {\n if (callback) {\n const preferredOutput = this._getPreferredOutput(fullRetObj);\n fullRetObj.path = typeof fullRetObj.path === 'string'\n ? fullRetObj.path\n : JSONPath.toPathString(fullRetObj.path);\n // eslint-disable-next-line n/callback-return -- No need to return\n callback(preferredOutput, type, fullRetObj);\n }\n};\n\n/**\n *\n * @param {string} expr\n * @param {JSONObject} val\n * @param {string} path\n * @param {object|GenericArray} parent\n * @param {string} parentPropName\n * @param {JSONPathCallback} callback\n * @param {boolean} hasArrExpr\n * @param {boolean} literalPriority\n * @returns {ReturnObject|ReturnObject[]}\n */\nJSONPath.prototype._trace = function (\n expr, val, path, parent, parentPropName, callback, hasArrExpr,\n literalPriority\n) {\n // No expr to follow? return path and value as the result of\n // this trace branch\n let retObj;\n if (!expr.length) {\n retObj = {\n path,\n value: val,\n parent,\n parentProperty: parentPropName,\n hasArrExpr\n };\n this._handleCallback(retObj, callback, 'value');\n return retObj;\n }\n\n const loc = expr[0], x = expr.slice(1);\n\n // We need to gather the return value of recursive trace calls in order to\n // do the parent sel computation.\n const ret = [];\n /**\n *\n * @param {ReturnObject|ReturnObject[]} elems\n * @returns {void}\n */\n function addRet (elems) {\n if (Array.isArray(elems)) {\n // This was causing excessive stack size in Node (with or\n // without Babel) against our performance test:\n // `ret.push(...elems);`\n elems.forEach((t) => {\n ret.push(t);\n });\n } else {\n ret.push(elems);\n }\n }\n if ((typeof loc !== 'string' || literalPriority) && val &&\n Object.hasOwn(val, loc)\n ) { // simple case--directly follow property\n addRet(this._trace(x, val[loc], push(path, loc), val, loc, callback,\n hasArrExpr));\n // eslint-disable-next-line unicorn/prefer-switch -- Part of larger `if`\n } else if (loc === '*') { // all child properties\n this._walk(val, (m) => {\n addRet(this._trace(\n x, val[m], push(path, m), val, m, callback, true, true\n ));\n });\n } else if (loc === '..') { // all descendent parent properties\n // Check remaining expression with val's immediate children\n addRet(\n this._trace(x, val, path, parent, parentPropName, callback,\n hasArrExpr)\n );\n this._walk(val, (m) => {\n // We don't join m and x here because we only want parents,\n // not scalar values\n if (typeof val[m] === 'object') {\n // Keep going with recursive descent on val's\n // object children\n addRet(this._trace(\n expr.slice(), val[m], push(path, m), val, m, callback, true\n ));\n }\n });\n // The parent sel computation is handled in the frame above using the\n // ancestor object of val\n } else if (loc === '^') {\n // This is not a final endpoint, so we do not invoke the callback here\n this._hasParentSelector = true;\n return {\n path: path.slice(0, -1),\n expr: x,\n isParentSelector: true\n };\n } else if (loc === '~') { // property name\n retObj = {\n path: push(path, loc),\n value: parentPropName,\n parent,\n parentProperty: null\n };\n this._handleCallback(retObj, callback, 'property');\n return retObj;\n } else if (loc === '$') { // root only\n addRet(this._trace(x, val, path, null, null, callback, hasArrExpr));\n } else if ((/^(-?\\d*):(-?\\d*):?(\\d*)$/u).test(loc)) { // [start:end:step] Python slice syntax\n addRet(\n this._slice(loc, x, val, path, parent, parentPropName, callback)\n );\n } else if (loc.indexOf('?(') === 0) { // [?(expr)] (filtering)\n if (this.currEval === false) {\n throw new Error('Eval [?(expr)] prevented in JSONPath expression.');\n }\n const safeLoc = loc.replace(/^\\?\\((.*?)\\)$/u, '$1');\n // check for a nested filter expression\n const nested = (/@.?([^?]*)[['](\\??\\(.*?\\))(?!.\\)\\])[\\]']/gu).exec(safeLoc);\n if (nested) {\n // find if there are matches in the nested expression\n // add them to the result set if there is at least one match\n this._walk(val, (m) => {\n const npath = [nested[2]];\n const nvalue = nested[1]\n ? val[m][nested[1]]\n : val[m];\n const filterResults = this._trace(npath, nvalue, path,\n parent, parentPropName, callback, true);\n if (filterResults.length > 0) {\n addRet(this._trace(x, val[m], push(path, m), val,\n m, callback, true));\n }\n });\n } else {\n this._walk(val, (m) => {\n if (this._eval(safeLoc, val[m], m, path, parent,\n parentPropName)) {\n addRet(this._trace(x, val[m], push(path, m), val, m,\n callback, true));\n }\n });\n }\n } else if (loc[0] === '(') { // [(expr)] (dynamic property/index)\n if (this.currEval === false) {\n throw new Error('Eval [(expr)] prevented in JSONPath expression.');\n }\n // As this will resolve to a property name (but we don't know it\n // yet), property and parent information is relative to the\n // parent of the property to which this expression will resolve\n addRet(this._trace(unshift(\n this._eval(\n loc, val, path.at(-1),\n path.slice(0, -1), parent, parentPropName\n ),\n x\n ), val, path, parent, parentPropName, callback, hasArrExpr));\n } else if (loc[0] === '@') { // value type: @boolean(), etc.\n let addType = false;\n const valueType = loc.slice(1, -2);\n switch (valueType) {\n case 'scalar':\n if (!val || !(['object', 'function'].includes(typeof val))) {\n addType = true;\n }\n break;\n case 'boolean': case 'string': case 'undefined': case 'function':\n if (typeof val === valueType) {\n addType = true;\n }\n break;\n case 'integer':\n if (Number.isFinite(val) && !(val % 1)) {\n addType = true;\n }\n break;\n case 'number':\n if (Number.isFinite(val)) {\n addType = true;\n }\n break;\n case 'nonFinite':\n if (typeof val === 'number' && !Number.isFinite(val)) {\n addType = true;\n }\n break;\n case 'object':\n if (val && typeof val === valueType) {\n addType = true;\n }\n break;\n case 'array':\n if (Array.isArray(val)) {\n addType = true;\n }\n break;\n case 'other':\n addType = this.currOtherTypeCallback(\n val, path, parent, parentPropName\n );\n break;\n case 'null':\n if (val === null) {\n addType = true;\n }\n break;\n /* c8 ignore next 2 */\n default:\n throw new TypeError('Unknown value type ' + valueType);\n }\n if (addType) {\n retObj = {path, value: val, parent, parentProperty: parentPropName};\n this._handleCallback(retObj, callback, 'value');\n return retObj;\n }\n // `-escaped property\n } else if (loc[0] === '`' && val && Object.hasOwn(val, loc.slice(1))) {\n const locProp = loc.slice(1);\n addRet(this._trace(\n x, val[locProp], push(path, locProp), val, locProp, callback,\n hasArrExpr, true\n ));\n } else if (loc.includes(',')) { // [name1,name2,...]\n const parts = loc.split(',');\n for (const part of parts) {\n addRet(this._trace(\n unshift(part, x), val, path, parent, parentPropName, callback,\n true\n ));\n }\n // simple case--directly follow property\n } else if (\n !literalPriority && val && Object.hasOwn(val, loc)\n ) {\n addRet(\n this._trace(x, val[loc], push(path, loc), val, loc, callback,\n hasArrExpr, true)\n );\n }\n\n // We check the resulting values for parent selections. For parent\n // selections we discard the value object and continue the trace with the\n // current val object\n if (this._hasParentSelector) {\n for (let t = 0; t < ret.length; t++) {\n const rett = ret[t];\n if (rett && rett.isParentSelector) {\n const tmp = this._trace(\n rett.expr, val, rett.path, parent, parentPropName, callback,\n hasArrExpr\n );\n if (Array.isArray(tmp)) {\n ret[t] = tmp[0];\n const tl = tmp.length;\n for (let tt = 1; tt < tl; tt++) {\n // eslint-disable-next-line @stylistic/max-len -- Long\n // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient\n t++;\n ret.splice(t, 0, tmp[tt]);\n }\n } else {\n ret[t] = tmp;\n }\n }\n }\n }\n return ret;\n};\n\nJSONPath.prototype._walk = function (val, f) {\n if (Array.isArray(val)) {\n const n = val.length;\n for (let i = 0; i < n; i++) {\n f(i);\n }\n } else if (val && typeof val === 'object') {\n Object.keys(val).forEach((m) => {\n f(m);\n });\n }\n};\n\nJSONPath.prototype._slice = function (\n loc, expr, val, path, parent, parentPropName, callback\n) {\n if (!Array.isArray(val)) {\n return undefined;\n }\n const len = val.length, parts = loc.split(':'),\n step = (parts[2] && Number.parseInt(parts[2])) || 1;\n let start = (parts[0] && Number.parseInt(parts[0])) || 0,\n end = parts[1] ? Number.parseInt(parts[1]) : len;\n start = (start < 0) ? Math.max(0, start + len) : Math.min(len, start);\n end = (end < 0) ? Math.max(0, end + len) : Math.min(len, end);\n const ret = [];\n for (let i = start; i < end; i += step) {\n const tmp = this._trace(\n unshift(i, expr), val, path, parent, parentPropName, callback, true\n );\n // Should only be possible to be an array here since first part of\n // ``unshift(i, expr)` passed in above would not be empty, nor `~`,\n // nor begin with `@` (as could return objects)\n // This was causing excessive stack size in Node (with or\n // without Babel) against our performance test: `ret.push(...tmp);`\n tmp.forEach((t) => {\n ret.push(t);\n });\n }\n return ret;\n};\n\nJSONPath.prototype._eval = function (\n code, _v, _vname, path, parent, parentPropName\n) {\n this.currSandbox._$_parentProperty = parentPropName;\n this.currSandbox._$_parent = parent;\n this.currSandbox._$_property = _vname;\n this.currSandbox._$_root = this.json;\n this.currSandbox._$_v = _v;\n\n const containsPath = code.includes('@path');\n if (containsPath) {\n this.currSandbox._$_path = JSONPath.toPathString(path.concat([_vname]));\n }\n\n const scriptCacheKey = this.currEval + 'Script:' + code;\n if (!JSONPath.cache[scriptCacheKey]) {\n let script = code\n .replaceAll('@parentProperty', '_$_parentProperty')\n .replaceAll('@parent', '_$_parent')\n .replaceAll('@property', '_$_property')\n .replaceAll('@root', '_$_root')\n .replaceAll(/@([.\\s)[])/gu, '_$_v$1');\n if (containsPath) {\n script = script.replaceAll('@path', '_$_path');\n }\n if (\n this.currEval === 'safe' ||\n this.currEval === true ||\n this.currEval === undefined\n ) {\n JSONPath.cache[scriptCacheKey] = new this.safeVm.Script(script);\n } else if (this.currEval === 'native') {\n JSONPath.cache[scriptCacheKey] = new this.vm.Script(script);\n } else if (\n typeof this.currEval === 'function' &&\n this.currEval.prototype &&\n Object.hasOwn(this.currEval.prototype, 'runInNewContext')\n ) {\n const CurrEval = this.currEval;\n JSONPath.cache[scriptCacheKey] = new CurrEval(script);\n } else if (typeof this.currEval === 'function') {\n JSONPath.cache[scriptCacheKey] = {\n runInNewContext: (context) => this.currEval(script, context)\n };\n } else {\n throw new TypeError(`Unknown \"eval\" property \"${this.currEval}\"`);\n }\n }\n\n try {\n return JSONPath.cache[scriptCacheKey].runInNewContext(this.currSandbox);\n } catch (e) {\n if (this.ignoreEvalErrors) {\n return false;\n }\n throw new Error('jsonPath: ' + e.message + ': ' + code);\n }\n};\n\n// PUBLIC CLASS PROPERTIES AND METHODS\n\n// Could store the cache object itself\nJSONPath.cache = {};\n\n/**\n * @param {string[]} pathArr Array to convert\n * @returns {string} The path string\n */\nJSONPath.toPathString = function (pathArr) {\n const x = pathArr, n = x.length;\n let p = '$';\n for (let i = 1; i < n; i++) {\n if (!(/^(~|\\^|@.*?\\(\\))$/u).test(x[i])) {\n p += (/^[0-9*]+$/u).test(x[i]) ? ('[' + x[i] + ']') : (\"['\" + x[i] + \"']\");\n }\n }\n return p;\n};\n\n/**\n * @param {string} pointer JSON Path\n * @returns {string} JSON Pointer\n */\nJSONPath.toPointer = function (pointer) {\n const x = pointer, n = x.length;\n let p = '';\n for (let i = 1; i < n; i++) {\n if (!(/^(~|\\^|@.*?\\(\\))$/u).test(x[i])) {\n p += '/' + x[i].toString()\n .replaceAll('~', '~0')\n .replaceAll('/', '~1');\n }\n }\n return p;\n};\n\n/**\n * @param {string} expr Expression to convert\n * @returns {string[]}\n */\nJSONPath.toPathArray = function (expr) {\n const {cache} = JSONPath;\n if (cache[expr]) {\n return cache[expr].concat();\n }\n const subx = [];\n const normalized = expr\n // Properties\n .replaceAll(\n /@(?:null|boolean|number|string|integer|undefined|nonFinite|scalar|array|object|function|other)\\(\\)/gu,\n ';$&;'\n )\n // Parenthetical evaluations (filtering and otherwise), directly\n // within brackets or single quotes\n .replaceAll(/[['](\\??\\(.*?\\))[\\]'](?!.\\])/gu, function ($0, $1) {\n return '[#' + (subx.push($1) - 1) + ']';\n })\n // Escape periods and tildes within properties\n .replaceAll(/\\[['\"]([^'\\]]*)['\"]\\]/gu, function ($0, prop) {\n return \"['\" + prop\n .replaceAll('.', '%@%')\n .replaceAll('~', '%%@@%%') +\n \"']\";\n })\n // Properties operator\n .replaceAll('~', ';~;')\n // Split by property boundaries\n .replaceAll(/['\"]?\\.['\"]?(?![^[]*\\])|\\[['\"]?/gu, ';')\n // Reinsert periods within properties\n .replaceAll('%@%', '.')\n // Reinsert tildes within properties\n .replaceAll('%%@@%%', '~')\n // Parent\n .replaceAll(/(?:;)?(\\^+)(?:;)?/gu, function ($0, ups) {\n return ';' + ups.split('').join(';') + ';';\n })\n // Descendents\n .replaceAll(/;;;|;;/gu, ';..;')\n // Remove trailing\n .replaceAll(/;$|'?\\]|'$/gu, '');\n\n const exprList = normalized.split(';').map(function (exp) {\n const match = exp.match(/#(\\d+)/u);\n return !match || !match[1] ? exp : subx[match[1]];\n });\n cache[expr] = exprList;\n return cache[expr].concat();\n};\n\nJSONPath.prototype.safeVm = {\n Script: SafeScript\n};\n\nexport {JSONPath};\n","import {JSONPath} from './jsonpath.js';\n\n/**\n * @typedef {any} ContextItem\n */\n\n/**\n * @typedef {any} EvaluatedResult\n */\n\n/**\n * @callback ConditionCallback\n * @param {ContextItem} item\n * @returns {boolean}\n */\n\n/**\n * Copy items out of one array into another.\n * @param {GenericArray} source Array with items to copy\n * @param {GenericArray} target Array to which to copy\n * @param {ConditionCallback} conditionCb Callback passed the current item;\n * will move item if evaluates to `true`\n * @returns {void}\n */\nconst moveToAnotherArray = function (source, target, conditionCb) {\n const il = source.length;\n for (let i = 0; i < il; i++) {\n const item = source[i];\n if (conditionCb(item)) {\n // eslint-disable-next-line @stylistic/max-len -- Long\n // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient\n target.push(source.splice(i--, 1)[0]);\n }\n }\n};\n\n/**\n * In-browser replacement for NodeJS' VM.Script.\n */\nclass Script {\n /**\n * @param {string} expr Expression to evaluate\n */\n constructor (expr) {\n this.code = expr;\n }\n\n /**\n * @param {object} context Object whose items will be added\n * to evaluation\n * @returns {EvaluatedResult} Result of evaluated code\n */\n runInNewContext (context) {\n let expr = this.code;\n const keys = Object.keys(context);\n const funcs = [];\n moveToAnotherArray(keys, funcs, (key) => {\n return typeof context[key] === 'function';\n });\n const values = keys.map((vr) => {\n return context[vr];\n });\n\n const funcString = funcs.reduce((s, func) => {\n let fString = context[func].toString();\n if (!(/function/u).test(fString)) {\n fString = 'function ' + fString;\n }\n return 'var ' + func + '=' + fString + ';' + s;\n }, '');\n\n expr = funcString + expr;\n\n // Mitigate http://perfectionkills.com/global-eval-what-are-the-options/#new_function\n if (!(/(['\"])use strict\\1/u).test(expr) && !keys.includes('arguments')) {\n expr = 'var arguments = undefined;' + expr;\n }\n\n // Remove last semi so `return` will be inserted before\n // the previous one instead, allowing for the return\n // of a bare ending expression\n expr = expr.replace(/;\\s*$/u, '');\n\n // Insert `return`\n const lastStatementEnd = expr.lastIndexOf(';');\n const code =\n lastStatementEnd !== -1\n ? expr.slice(0, lastStatementEnd + 1) +\n ' return ' +\n expr.slice(lastStatementEnd + 1)\n : ' return ' + expr;\n\n // eslint-disable-next-line no-new-func -- User's choice\n return new Function(...keys, code)(...values);\n }\n}\n\nJSONPath.prototype.vm = {\n Script\n};\n\nexport {JSONPath};\n"],"names":["Jsep","version","toString","addUnaryOp","op_name","max_unop_len","Math","max","length","unary_ops","addBinaryOp","precedence","isRightAssociative","max_binop_len","binary_ops","right_associative","add","delete","addIdentifierChar","char","additional_identifier_chars","addLiteral","literal_name","literal_value","literals","removeUnaryOp","getMaxKeyLen","removeAllUnaryOps","removeIdentifierChar","removeBinaryOp","removeAllBinaryOps","removeLiteral","removeAllLiterals","this","expr","charAt","index","code","charCodeAt","constructor","parse","obj","Object","keys","map","k","isDecimalDigit","ch","binaryPrecedence","op_val","isIdentifierStart","String","fromCharCode","has","isIdentifierPart","throwError","message","error","Error","description","runHook","name","node","hooks","env","context","run","searchHook","find","callback","call","gobbleSpaces","SPACE_CODE","TAB_CODE","LF_CODE","CR_CODE","nodes","gobbleExpressions","type","COMPOUND","body","untilICode","ch_i","SEMCOL_CODE","COMMA_CODE","gobbleExpression","push","gobbleBinaryExpression","gobbleBinaryOp","to_check","substr","tc_len","hasOwnProperty","biop","prec","stack","biop_info","left","right","i","cur_biop","gobbleToken","value","right_a","comparePrev","prev","pop","BINARY_EXP","operator","PERIOD_CODE","gobbleNumericLiteral","SQUOTE_CODE","DQUOTE_CODE","gobbleStringLiteral","OBRACK_CODE","gobbleArray","argument","UNARY_EXP","prefix","gobbleIdentifier","LITERAL","raw","this_str","THIS_EXP","OPAREN_CODE","gobbleGroup","gobbleTokenProperty","QUMARK_CODE","optional","MEMBER_EXP","computed","object","property","CBRACK_CODE","CALL_EXP","arguments","gobbleArguments","CPAREN_CODE","callee","chCode","number","parseFloat","str","startIndex","quote","closed","substring","start","IDENTIFIER","slice","termination","args","separator_count","arg","SEQUENCE_EXP","expressions","ARRAY_EXP","elements","first","Array","isArray","forEach","assign","plugins","jsep","registered","register","plugin","init","COLON_CODE","Set","true","false","null","stdClassProps","getOwnPropertyNames","filter","prop","includes","undefined","m","ternary","test","consequent","alternate","newTest","patternIndex","inCharSet","pattern","flags","RegExp","e","assignmentOperators","updateOperators","assignmentPrecedence","updateNodeTypes","updateBinariesToAssignments","values","val","op","some","c","jsepRegex","jsepAssignment","BLOCKED_PROTO_PROPERTIES","SafeEval","evalAst","ast","subs","evalBinaryExpression","evalCompound","evalConditionalExpression","evalIdentifier","evalLiteral","evalMemberExpression","evalUnaryExpression","evalArrayExpression","evalCallExpression","evalAssignmentExpression","SyntaxError","||","a","b","&&","|","^","&","==","!=","===","!==","<",">","<=",">=","<<",">>",">>>","+","-","*","/","%","last","hasOwn","ReferenceError","TypeError","result","Function","bind","typeof","void","el","func","id","arr","item","unshift","NewError","super","avoidNew","JSONPath","opts","otherTypeCallback","optObj","json","path","resultType","flatten","wrap","sandbox","eval","ignoreEvalErrors","parent","parentProperty","autostart","ret","evaluate","prototype","currParent","currParentProperty","currResultType","currEval","currSandbox","currOtherTypeCallback","toPathString","exprList","toPathArray","shift","_hasParentSelector","_trace","ea","isParentSelector","hasArrExpr","reduce","rslt","valOrPath","_getPreferredOutput","concat","pointer","toPointer","_handleCallback","fullRetObj","preferredOutput","parentPropName","literalPriority","retObj","loc","x","addRet","elems","t","_walk","_slice","indexOf","safeLoc","replace","nested","exec","npath","nvalue","_eval","at","addType","valueType","Number","isFinite","locProp","parts","split","part","rett","tmp","tl","tt","splice","f","n","len","step","parseInt","end","min","_v","_vname","_$_parentProperty","_$_parent","_$_property","_$_root","_$_v","containsPath","_$_path","scriptCacheKey","cache","script","replaceAll","safeVm","Script","vm","CurrEval","runInNewContext","pathArr","p","subx","$0","$1","ups","join","exp","match","keyMap","create","funcs","source","target","conditionCb","il","moveToAnotherArray","key","vr","s","fString","lastStatementEnd","lastIndexOf"],"mappings":"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","x_google_ignoreList":[0,1,2]} \ No newline at end of file +{"version":3,"file":"index-browser-esm.min.js","sources":["../node_modules/.pnpm/jsep@1.4.0/node_modules/jsep/dist/jsep.js","../node_modules/.pnpm/@jsep-plugin+regex@1.0.4_jsep@1.4.0/node_modules/@jsep-plugin/regex/dist/index.js","../node_modules/.pnpm/@jsep-plugin+assignment@1.3.0_jsep@1.4.0/node_modules/@jsep-plugin/assignment/dist/index.js","../src/Safe-Script.js","../src/jsonpath.js","../src/jsonpath-browser.js"],"sourcesContent":["/**\n * @implements {IHooks}\n */\nclass Hooks {\n\t/**\n\t * @callback HookCallback\n\t * @this {*|Jsep} this\n\t * @param {Jsep} env\n\t * @returns: void\n\t */\n\t/**\n\t * Adds the given callback to the list of callbacks for the given hook.\n\t *\n\t * The callback will be invoked when the hook it is registered for is run.\n\t *\n\t * One callback function can be registered to multiple hooks and the same hook multiple times.\n\t *\n\t * @param {string|object} name The name of the hook, or an object of callbacks keyed by name\n\t * @param {HookCallback|boolean} callback The callback function which is given environment variables.\n\t * @param {?boolean} [first=false] Will add the hook to the top of the list (defaults to the bottom)\n\t * @public\n\t */\n\tadd(name, callback, first) {\n\t\tif (typeof arguments[0] != 'string') {\n\t\t\t// Multiple hook callbacks, keyed by name\n\t\t\tfor (let name in arguments[0]) {\n\t\t\t\tthis.add(name, arguments[0][name], arguments[1]);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t(Array.isArray(name) ? name : [name]).forEach(function (name) {\n\t\t\t\tthis[name] = this[name] || [];\n\n\t\t\t\tif (callback) {\n\t\t\t\t\tthis[name][first ? 'unshift' : 'push'](callback);\n\t\t\t\t}\n\t\t\t}, this);\n\t\t}\n\t}\n\n\t/**\n\t * Runs a hook invoking all registered callbacks with the given environment variables.\n\t *\n\t * Callbacks will be invoked synchronously and in the order in which they were registered.\n\t *\n\t * @param {string} name The name of the hook.\n\t * @param {Object} env The environment variables of the hook passed to all callbacks registered.\n\t * @public\n\t */\n\trun(name, env) {\n\t\tthis[name] = this[name] || [];\n\t\tthis[name].forEach(function (callback) {\n\t\t\tcallback.call(env && env.context ? env.context : env, env);\n\t\t});\n\t}\n}\n\n/**\n * @implements {IPlugins}\n */\nclass Plugins {\n\tconstructor(jsep) {\n\t\tthis.jsep = jsep;\n\t\tthis.registered = {};\n\t}\n\n\t/**\n\t * @callback PluginSetup\n\t * @this {Jsep} jsep\n\t * @returns: void\n\t */\n\t/**\n\t * Adds the given plugin(s) to the registry\n\t *\n\t * @param {object} plugins\n\t * @param {string} plugins.name The name of the plugin\n\t * @param {PluginSetup} plugins.init The init function\n\t * @public\n\t */\n\tregister(...plugins) {\n\t\tplugins.forEach((plugin) => {\n\t\t\tif (typeof plugin !== 'object' || !plugin.name || !plugin.init) {\n\t\t\t\tthrow new Error('Invalid JSEP plugin format');\n\t\t\t}\n\t\t\tif (this.registered[plugin.name]) {\n\t\t\t\t// already registered. Ignore.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tplugin.init(this.jsep);\n\t\t\tthis.registered[plugin.name] = plugin;\n\t\t});\n\t}\n}\n\n// JavaScript Expression Parser (JSEP) 1.4.0\n\nclass Jsep {\n\t/**\n\t * @returns {string}\n\t */\n\tstatic get version() {\n\t\t// To be filled in by the template\n\t\treturn '1.4.0';\n\t}\n\n\t/**\n\t * @returns {string}\n\t */\n\tstatic toString() {\n\t\treturn 'JavaScript Expression Parser (JSEP) v' + Jsep.version;\n\t};\n\n\t// ==================== CONFIG ================================\n\t/**\n\t * @method addUnaryOp\n\t * @param {string} op_name The name of the unary op to add\n\t * @returns {Jsep}\n\t */\n\tstatic addUnaryOp(op_name) {\n\t\tJsep.max_unop_len = Math.max(op_name.length, Jsep.max_unop_len);\n\t\tJsep.unary_ops[op_name] = 1;\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method jsep.addBinaryOp\n\t * @param {string} op_name The name of the binary op to add\n\t * @param {number} precedence The precedence of the binary op (can be a float). Higher number = higher precedence\n\t * @param {boolean} [isRightAssociative=false] whether operator is right-associative\n\t * @returns {Jsep}\n\t */\n\tstatic addBinaryOp(op_name, precedence, isRightAssociative) {\n\t\tJsep.max_binop_len = Math.max(op_name.length, Jsep.max_binop_len);\n\t\tJsep.binary_ops[op_name] = precedence;\n\t\tif (isRightAssociative) {\n\t\t\tJsep.right_associative.add(op_name);\n\t\t}\n\t\telse {\n\t\t\tJsep.right_associative.delete(op_name);\n\t\t}\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method addIdentifierChar\n\t * @param {string} char The additional character to treat as a valid part of an identifier\n\t * @returns {Jsep}\n\t */\n\tstatic addIdentifierChar(char) {\n\t\tJsep.additional_identifier_chars.add(char);\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method addLiteral\n\t * @param {string} literal_name The name of the literal to add\n\t * @param {*} literal_value The value of the literal\n\t * @returns {Jsep}\n\t */\n\tstatic addLiteral(literal_name, literal_value) {\n\t\tJsep.literals[literal_name] = literal_value;\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeUnaryOp\n\t * @param {string} op_name The name of the unary op to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeUnaryOp(op_name) {\n\t\tdelete Jsep.unary_ops[op_name];\n\t\tif (op_name.length === Jsep.max_unop_len) {\n\t\t\tJsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);\n\t\t}\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllUnaryOps\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllUnaryOps() {\n\t\tJsep.unary_ops = {};\n\t\tJsep.max_unop_len = 0;\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeIdentifierChar\n\t * @param {string} char The additional character to stop treating as a valid part of an identifier\n\t * @returns {Jsep}\n\t */\n\tstatic removeIdentifierChar(char) {\n\t\tJsep.additional_identifier_chars.delete(char);\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeBinaryOp\n\t * @param {string} op_name The name of the binary op to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeBinaryOp(op_name) {\n\t\tdelete Jsep.binary_ops[op_name];\n\n\t\tif (op_name.length === Jsep.max_binop_len) {\n\t\t\tJsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);\n\t\t}\n\t\tJsep.right_associative.delete(op_name);\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllBinaryOps\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllBinaryOps() {\n\t\tJsep.binary_ops = {};\n\t\tJsep.max_binop_len = 0;\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeLiteral\n\t * @param {string} literal_name The name of the literal to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeLiteral(literal_name) {\n\t\tdelete Jsep.literals[literal_name];\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllLiterals\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllLiterals() {\n\t\tJsep.literals = {};\n\n\t\treturn Jsep;\n\t}\n\t// ==================== END CONFIG ============================\n\n\n\t/**\n\t * @returns {string}\n\t */\n\tget char() {\n\t\treturn this.expr.charAt(this.index);\n\t}\n\n\t/**\n\t * @returns {number}\n\t */\n\tget code() {\n\t\treturn this.expr.charCodeAt(this.index);\n\t};\n\n\n\t/**\n\t * @param {string} expr a string with the passed in express\n\t * @returns Jsep\n\t */\n\tconstructor(expr) {\n\t\t// `index` stores the character number we are currently at\n\t\t// All of the gobbles below will modify `index` as we move along\n\t\tthis.expr = expr;\n\t\tthis.index = 0;\n\t}\n\n\t/**\n\t * static top-level parser\n\t * @returns {jsep.Expression}\n\t */\n\tstatic parse(expr) {\n\t\treturn (new Jsep(expr)).parse();\n\t}\n\n\t/**\n\t * Get the longest key length of any object\n\t * @param {object} obj\n\t * @returns {number}\n\t */\n\tstatic getMaxKeyLen(obj) {\n\t\treturn Math.max(0, ...Object.keys(obj).map(k => k.length));\n\t}\n\n\t/**\n\t * `ch` is a character code in the next three functions\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isDecimalDigit(ch) {\n\t\treturn (ch >= 48 && ch <= 57); // 0...9\n\t}\n\n\t/**\n\t * Returns the precedence of a binary operator or `0` if it isn't a binary operator. Can be float.\n\t * @param {string} op_val\n\t * @returns {number}\n\t */\n\tstatic binaryPrecedence(op_val) {\n\t\treturn Jsep.binary_ops[op_val] || 0;\n\t}\n\n\t/**\n\t * Looks for start of identifier\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isIdentifierStart(ch) {\n\t\treturn (ch >= 65 && ch <= 90) || // A...Z\n\t\t\t(ch >= 97 && ch <= 122) || // a...z\n\t\t\t(ch >= 128 && !Jsep.binary_ops[String.fromCharCode(ch)]) || // any non-ASCII that is not an operator\n\t\t\t(Jsep.additional_identifier_chars.has(String.fromCharCode(ch))); // additional characters\n\t}\n\n\t/**\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isIdentifierPart(ch) {\n\t\treturn Jsep.isIdentifierStart(ch) || Jsep.isDecimalDigit(ch);\n\t}\n\n\t/**\n\t * throw error at index of the expression\n\t * @param {string} message\n\t * @throws\n\t */\n\tthrowError(message) {\n\t\tconst error = new Error(message + ' at character ' + this.index);\n\t\terror.index = this.index;\n\t\terror.description = message;\n\t\tthrow error;\n\t}\n\n\t/**\n\t * Run a given hook\n\t * @param {string} name\n\t * @param {jsep.Expression|false} [node]\n\t * @returns {?jsep.Expression}\n\t */\n\trunHook(name, node) {\n\t\tif (Jsep.hooks[name]) {\n\t\t\tconst env = { context: this, node };\n\t\t\tJsep.hooks.run(name, env);\n\t\t\treturn env.node;\n\t\t}\n\t\treturn node;\n\t}\n\n\t/**\n\t * Runs a given hook until one returns a node\n\t * @param {string} name\n\t * @returns {?jsep.Expression}\n\t */\n\tsearchHook(name) {\n\t\tif (Jsep.hooks[name]) {\n\t\t\tconst env = { context: this };\n\t\t\tJsep.hooks[name].find(function (callback) {\n\t\t\t\tcallback.call(env.context, env);\n\t\t\t\treturn env.node;\n\t\t\t});\n\t\t\treturn env.node;\n\t\t}\n\t}\n\n\t/**\n\t * Push `index` up to the next non-space character\n\t */\n\tgobbleSpaces() {\n\t\tlet ch = this.code;\n\t\t// Whitespace\n\t\twhile (ch === Jsep.SPACE_CODE\n\t\t|| ch === Jsep.TAB_CODE\n\t\t|| ch === Jsep.LF_CODE\n\t\t|| ch === Jsep.CR_CODE) {\n\t\t\tch = this.expr.charCodeAt(++this.index);\n\t\t}\n\t\tthis.runHook('gobble-spaces');\n\t}\n\n\t/**\n\t * Top-level method to parse all expressions and returns compound or single node\n\t * @returns {jsep.Expression}\n\t */\n\tparse() {\n\t\tthis.runHook('before-all');\n\t\tconst nodes = this.gobbleExpressions();\n\n\t\t// If there's only one expression just try returning the expression\n\t\tconst node = nodes.length === 1\n\t\t ? nodes[0]\n\t\t\t: {\n\t\t\t\ttype: Jsep.COMPOUND,\n\t\t\t\tbody: nodes\n\t\t\t};\n\t\treturn this.runHook('after-all', node);\n\t}\n\n\t/**\n\t * top-level parser (but can be reused within as well)\n\t * @param {number} [untilICode]\n\t * @returns {jsep.Expression[]}\n\t */\n\tgobbleExpressions(untilICode) {\n\t\tlet nodes = [], ch_i, node;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tch_i = this.code;\n\n\t\t\t// Expressions can be separated by semicolons, commas, or just inferred without any\n\t\t\t// separators\n\t\t\tif (ch_i === Jsep.SEMCOL_CODE || ch_i === Jsep.COMMA_CODE) {\n\t\t\t\tthis.index++; // ignore separators\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Try to gobble each expression individually\n\t\t\t\tif (node = this.gobbleExpression()) {\n\t\t\t\t\tnodes.push(node);\n\t\t\t\t\t// If we weren't able to find a binary expression and are out of room, then\n\t\t\t\t\t// the expression passed in probably has too much\n\t\t\t\t}\n\t\t\t\telse if (this.index < this.expr.length) {\n\t\t\t\t\tif (ch_i === untilICode) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tthis.throwError('Unexpected \"' + this.char + '\"');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn nodes;\n\t}\n\n\t/**\n\t * The main parsing function.\n\t * @returns {?jsep.Expression}\n\t */\n\tgobbleExpression() {\n\t\tconst node = this.searchHook('gobble-expression') || this.gobbleBinaryExpression();\n\t\tthis.gobbleSpaces();\n\n\t\treturn this.runHook('after-expression', node);\n\t}\n\n\t/**\n\t * Search for the operation portion of the string (e.g. `+`, `===`)\n\t * Start by taking the longest possible binary operations (3 characters: `===`, `!==`, `>>>`)\n\t * and move down from 3 to 2 to 1 character until a matching binary operation is found\n\t * then, return that binary operation\n\t * @returns {string|boolean}\n\t */\n\tgobbleBinaryOp() {\n\t\tthis.gobbleSpaces();\n\t\tlet to_check = this.expr.substr(this.index, Jsep.max_binop_len);\n\t\tlet tc_len = to_check.length;\n\n\t\twhile (tc_len > 0) {\n\t\t\t// Don't accept a binary op when it is an identifier.\n\t\t\t// Binary ops that start with a identifier-valid character must be followed\n\t\t\t// by a non identifier-part valid character\n\t\t\tif (Jsep.binary_ops.hasOwnProperty(to_check) && (\n\t\t\t\t!Jsep.isIdentifierStart(this.code) ||\n\t\t\t\t(this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))\n\t\t\t)) {\n\t\t\t\tthis.index += tc_len;\n\t\t\t\treturn to_check;\n\t\t\t}\n\t\t\tto_check = to_check.substr(0, --tc_len);\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * This function is responsible for gobbling an individual expression,\n\t * e.g. `1`, `1+2`, `a+(b*2)-Math.sqrt(2)`\n\t * @returns {?jsep.BinaryExpression}\n\t */\n\tgobbleBinaryExpression() {\n\t\tlet node, biop, prec, stack, biop_info, left, right, i, cur_biop;\n\n\t\t// First, try to get the leftmost thing\n\t\t// Then, check to see if there's a binary operator operating on that leftmost thing\n\t\t// Don't gobbleBinaryOp without a left-hand-side\n\t\tleft = this.gobbleToken();\n\t\tif (!left) {\n\t\t\treturn left;\n\t\t}\n\t\tbiop = this.gobbleBinaryOp();\n\n\t\t// If there wasn't a binary operator, just return the leftmost node\n\t\tif (!biop) {\n\t\t\treturn left;\n\t\t}\n\n\t\t// Otherwise, we need to start a stack to properly place the binary operations in their\n\t\t// precedence structure\n\t\tbiop_info = { value: biop, prec: Jsep.binaryPrecedence(biop), right_a: Jsep.right_associative.has(biop) };\n\n\t\tright = this.gobbleToken();\n\n\t\tif (!right) {\n\t\t\tthis.throwError(\"Expected expression after \" + biop);\n\t\t}\n\n\t\tstack = [left, biop_info, right];\n\n\t\t// Properly deal with precedence using [recursive descent](http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm)\n\t\twhile ((biop = this.gobbleBinaryOp())) {\n\t\t\tprec = Jsep.binaryPrecedence(biop);\n\n\t\t\tif (prec === 0) {\n\t\t\t\tthis.index -= biop.length;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbiop_info = { value: biop, prec, right_a: Jsep.right_associative.has(biop) };\n\n\t\t\tcur_biop = biop;\n\n\t\t\t// Reduce: make a binary expression from the three topmost entries.\n\t\t\tconst comparePrev = prev => biop_info.right_a && prev.right_a\n\t\t\t\t? prec > prev.prec\n\t\t\t\t: prec <= prev.prec;\n\t\t\twhile ((stack.length > 2) && comparePrev(stack[stack.length - 2])) {\n\t\t\t\tright = stack.pop();\n\t\t\t\tbiop = stack.pop().value;\n\t\t\t\tleft = stack.pop();\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.BINARY_EXP,\n\t\t\t\t\toperator: biop,\n\t\t\t\t\tleft,\n\t\t\t\t\tright\n\t\t\t\t};\n\t\t\t\tstack.push(node);\n\t\t\t}\n\n\t\t\tnode = this.gobbleToken();\n\n\t\t\tif (!node) {\n\t\t\t\tthis.throwError(\"Expected expression after \" + cur_biop);\n\t\t\t}\n\n\t\t\tstack.push(biop_info, node);\n\t\t}\n\n\t\ti = stack.length - 1;\n\t\tnode = stack[i];\n\n\t\twhile (i > 1) {\n\t\t\tnode = {\n\t\t\t\ttype: Jsep.BINARY_EXP,\n\t\t\t\toperator: stack[i - 1].value,\n\t\t\t\tleft: stack[i - 2],\n\t\t\t\tright: node\n\t\t\t};\n\t\t\ti -= 2;\n\t\t}\n\n\t\treturn node;\n\t}\n\n\t/**\n\t * An individual part of a binary expression:\n\t * e.g. `foo.bar(baz)`, `1`, `\"abc\"`, `(a % 2)` (because it's in parenthesis)\n\t * @returns {boolean|jsep.Expression}\n\t */\n\tgobbleToken() {\n\t\tlet ch, to_check, tc_len, node;\n\n\t\tthis.gobbleSpaces();\n\t\tnode = this.searchHook('gobble-token');\n\t\tif (node) {\n\t\t\treturn this.runHook('after-token', node);\n\t\t}\n\n\t\tch = this.code;\n\n\t\tif (Jsep.isDecimalDigit(ch) || ch === Jsep.PERIOD_CODE) {\n\t\t\t// Char code 46 is a dot `.` which can start off a numeric literal\n\t\t\treturn this.gobbleNumericLiteral();\n\t\t}\n\n\t\tif (ch === Jsep.SQUOTE_CODE || ch === Jsep.DQUOTE_CODE) {\n\t\t\t// Single or double quotes\n\t\t\tnode = this.gobbleStringLiteral();\n\t\t}\n\t\telse if (ch === Jsep.OBRACK_CODE) {\n\t\t\tnode = this.gobbleArray();\n\t\t}\n\t\telse {\n\t\t\tto_check = this.expr.substr(this.index, Jsep.max_unop_len);\n\t\t\ttc_len = to_check.length;\n\n\t\t\twhile (tc_len > 0) {\n\t\t\t\t// Don't accept an unary op when it is an identifier.\n\t\t\t\t// Unary ops that start with a identifier-valid character must be followed\n\t\t\t\t// by a non identifier-part valid character\n\t\t\t\tif (Jsep.unary_ops.hasOwnProperty(to_check) && (\n\t\t\t\t\t!Jsep.isIdentifierStart(this.code) ||\n\t\t\t\t\t(this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))\n\t\t\t\t)) {\n\t\t\t\t\tthis.index += tc_len;\n\t\t\t\t\tconst argument = this.gobbleToken();\n\t\t\t\t\tif (!argument) {\n\t\t\t\t\t\tthis.throwError('missing unaryOp argument');\n\t\t\t\t\t}\n\t\t\t\t\treturn this.runHook('after-token', {\n\t\t\t\t\t\ttype: Jsep.UNARY_EXP,\n\t\t\t\t\t\toperator: to_check,\n\t\t\t\t\t\targument,\n\t\t\t\t\t\tprefix: true\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tto_check = to_check.substr(0, --tc_len);\n\t\t\t}\n\n\t\t\tif (Jsep.isIdentifierStart(ch)) {\n\t\t\t\tnode = this.gobbleIdentifier();\n\t\t\t\tif (Jsep.literals.hasOwnProperty(node.name)) {\n\t\t\t\t\tnode = {\n\t\t\t\t\t\ttype: Jsep.LITERAL,\n\t\t\t\t\t\tvalue: Jsep.literals[node.name],\n\t\t\t\t\t\traw: node.name,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse if (node.name === Jsep.this_str) {\n\t\t\t\t\tnode = { type: Jsep.THIS_EXP };\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ch === Jsep.OPAREN_CODE) { // open parenthesis\n\t\t\t\tnode = this.gobbleGroup();\n\t\t\t}\n\t\t}\n\n\t\tif (!node) {\n\t\t\treturn this.runHook('after-token', false);\n\t\t}\n\n\t\tnode = this.gobbleTokenProperty(node);\n\t\treturn this.runHook('after-token', node);\n\t}\n\n\t/**\n\t * Gobble properties of of identifiers/strings/arrays/groups.\n\t * e.g. `foo`, `bar.baz`, `foo['bar'].baz`\n\t * It also gobbles function calls:\n\t * e.g. `Math.acos(obj.angle)`\n\t * @param {jsep.Expression} node\n\t * @returns {jsep.Expression}\n\t */\n\tgobbleTokenProperty(node) {\n\t\tthis.gobbleSpaces();\n\n\t\tlet ch = this.code;\n\t\twhile (ch === Jsep.PERIOD_CODE || ch === Jsep.OBRACK_CODE || ch === Jsep.OPAREN_CODE || ch === Jsep.QUMARK_CODE) {\n\t\t\tlet optional;\n\t\t\tif (ch === Jsep.QUMARK_CODE) {\n\t\t\t\tif (this.expr.charCodeAt(this.index + 1) !== Jsep.PERIOD_CODE) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\toptional = true;\n\t\t\t\tthis.index += 2;\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tch = this.code;\n\t\t\t}\n\t\t\tthis.index++;\n\n\t\t\tif (ch === Jsep.OBRACK_CODE) {\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.MEMBER_EXP,\n\t\t\t\t\tcomputed: true,\n\t\t\t\t\tobject: node,\n\t\t\t\t\tproperty: this.gobbleExpression()\n\t\t\t\t};\n\t\t\t\tif (!node.property) {\n\t\t\t\t\tthis.throwError('Unexpected \"' + this.char + '\"');\n\t\t\t\t}\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tch = this.code;\n\t\t\t\tif (ch !== Jsep.CBRACK_CODE) {\n\t\t\t\t\tthis.throwError('Unclosed [');\n\t\t\t\t}\n\t\t\t\tthis.index++;\n\t\t\t}\n\t\t\telse if (ch === Jsep.OPAREN_CODE) {\n\t\t\t\t// A function call is being made; gobble all the arguments\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.CALL_EXP,\n\t\t\t\t\t'arguments': this.gobbleArguments(Jsep.CPAREN_CODE),\n\t\t\t\t\tcallee: node\n\t\t\t\t};\n\t\t\t}\n\t\t\telse if (ch === Jsep.PERIOD_CODE || optional) {\n\t\t\t\tif (optional) {\n\t\t\t\t\tthis.index--;\n\t\t\t\t}\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.MEMBER_EXP,\n\t\t\t\t\tcomputed: false,\n\t\t\t\t\tobject: node,\n\t\t\t\t\tproperty: this.gobbleIdentifier(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (optional) {\n\t\t\t\tnode.optional = true;\n\t\t\t} // else leave undefined for compatibility with esprima\n\n\t\t\tthis.gobbleSpaces();\n\t\t\tch = this.code;\n\t\t}\n\n\t\treturn node;\n\t}\n\n\t/**\n\t * Parse simple numeric literals: `12`, `3.4`, `.5`. Do this by using a string to\n\t * keep track of everything in the numeric literal and then calling `parseFloat` on that string\n\t * @returns {jsep.Literal}\n\t */\n\tgobbleNumericLiteral() {\n\t\tlet number = '', ch, chCode;\n\n\t\twhile (Jsep.isDecimalDigit(this.code)) {\n\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t}\n\n\t\tif (this.code === Jsep.PERIOD_CODE) { // can start with a decimal marker\n\t\t\tnumber += this.expr.charAt(this.index++);\n\n\t\t\twhile (Jsep.isDecimalDigit(this.code)) {\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\t\t}\n\n\t\tch = this.char;\n\n\t\tif (ch === 'e' || ch === 'E') { // exponent marker\n\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\tch = this.char;\n\n\t\t\tif (ch === '+' || ch === '-') { // exponent sign\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\n\t\t\twhile (Jsep.isDecimalDigit(this.code)) { // exponent itself\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\n\t\t\tif (!Jsep.isDecimalDigit(this.expr.charCodeAt(this.index - 1)) ) {\n\t\t\t\tthis.throwError('Expected exponent (' + number + this.char + ')');\n\t\t\t}\n\t\t}\n\n\t\tchCode = this.code;\n\n\t\t// Check to make sure this isn't a variable name that start with a number (123abc)\n\t\tif (Jsep.isIdentifierStart(chCode)) {\n\t\t\tthis.throwError('Variable names cannot start with a number (' +\n\t\t\t\tnumber + this.char + ')');\n\t\t}\n\t\telse if (chCode === Jsep.PERIOD_CODE || (number.length === 1 && number.charCodeAt(0) === Jsep.PERIOD_CODE)) {\n\t\t\tthis.throwError('Unexpected period');\n\t\t}\n\n\t\treturn {\n\t\t\ttype: Jsep.LITERAL,\n\t\t\tvalue: parseFloat(number),\n\t\t\traw: number\n\t\t};\n\t}\n\n\t/**\n\t * Parses a string literal, staring with single or double quotes with basic support for escape codes\n\t * e.g. `\"hello world\"`, `'this is\\nJSEP'`\n\t * @returns {jsep.Literal}\n\t */\n\tgobbleStringLiteral() {\n\t\tlet str = '';\n\t\tconst startIndex = this.index;\n\t\tconst quote = this.expr.charAt(this.index++);\n\t\tlet closed = false;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tlet ch = this.expr.charAt(this.index++);\n\n\t\t\tif (ch === quote) {\n\t\t\t\tclosed = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (ch === '\\\\') {\n\t\t\t\t// Check for all of the common escape codes\n\t\t\t\tch = this.expr.charAt(this.index++);\n\n\t\t\t\tswitch (ch) {\n\t\t\t\t\tcase 'n': str += '\\n'; break;\n\t\t\t\t\tcase 'r': str += '\\r'; break;\n\t\t\t\t\tcase 't': str += '\\t'; break;\n\t\t\t\t\tcase 'b': str += '\\b'; break;\n\t\t\t\t\tcase 'f': str += '\\f'; break;\n\t\t\t\t\tcase 'v': str += '\\x0B'; break;\n\t\t\t\t\tdefault : str += ch;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tstr += ch;\n\t\t\t}\n\t\t}\n\n\t\tif (!closed) {\n\t\t\tthis.throwError('Unclosed quote after \"' + str + '\"');\n\t\t}\n\n\t\treturn {\n\t\t\ttype: Jsep.LITERAL,\n\t\t\tvalue: str,\n\t\t\traw: this.expr.substring(startIndex, this.index),\n\t\t};\n\t}\n\n\t/**\n\t * Gobbles only identifiers\n\t * e.g.: `foo`, `_value`, `$x1`\n\t * Also, this function checks if that identifier is a literal:\n\t * (e.g. `true`, `false`, `null`) or `this`\n\t * @returns {jsep.Identifier}\n\t */\n\tgobbleIdentifier() {\n\t\tlet ch = this.code, start = this.index;\n\n\t\tif (Jsep.isIdentifierStart(ch)) {\n\t\t\tthis.index++;\n\t\t}\n\t\telse {\n\t\t\tthis.throwError('Unexpected ' + this.char);\n\t\t}\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tch = this.code;\n\n\t\t\tif (Jsep.isIdentifierPart(ch)) {\n\t\t\t\tthis.index++;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\ttype: Jsep.IDENTIFIER,\n\t\t\tname: this.expr.slice(start, this.index),\n\t\t};\n\t}\n\n\t/**\n\t * Gobbles a list of arguments within the context of a function call\n\t * or array literal. This function also assumes that the opening character\n\t * `(` or `[` has already been gobbled, and gobbles expressions and commas\n\t * until the terminator character `)` or `]` is encountered.\n\t * e.g. `foo(bar, baz)`, `my_func()`, or `[bar, baz]`\n\t * @param {number} termination\n\t * @returns {jsep.Expression[]}\n\t */\n\tgobbleArguments(termination) {\n\t\tconst args = [];\n\t\tlet closed = false;\n\t\tlet separator_count = 0;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tthis.gobbleSpaces();\n\t\t\tlet ch_i = this.code;\n\n\t\t\tif (ch_i === termination) { // done parsing\n\t\t\t\tclosed = true;\n\t\t\t\tthis.index++;\n\n\t\t\t\tif (termination === Jsep.CPAREN_CODE && separator_count && separator_count >= args.length){\n\t\t\t\t\tthis.throwError('Unexpected token ' + String.fromCharCode(termination));\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (ch_i === Jsep.COMMA_CODE) { // between expressions\n\t\t\t\tthis.index++;\n\t\t\t\tseparator_count++;\n\n\t\t\t\tif (separator_count !== args.length) { // missing argument\n\t\t\t\t\tif (termination === Jsep.CPAREN_CODE) {\n\t\t\t\t\t\tthis.throwError('Unexpected token ,');\n\t\t\t\t\t}\n\t\t\t\t\telse if (termination === Jsep.CBRACK_CODE) {\n\t\t\t\t\t\tfor (let arg = args.length; arg < separator_count; arg++) {\n\t\t\t\t\t\t\targs.push(null);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (args.length !== separator_count && separator_count !== 0) {\n\t\t\t\t// NOTE: `&& separator_count !== 0` allows for either all commas, or all spaces as arguments\n\t\t\t\tthis.throwError('Expected comma');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst node = this.gobbleExpression();\n\n\t\t\t\tif (!node || node.type === Jsep.COMPOUND) {\n\t\t\t\t\tthis.throwError('Expected comma');\n\t\t\t\t}\n\n\t\t\t\targs.push(node);\n\t\t\t}\n\t\t}\n\n\t\tif (!closed) {\n\t\t\tthis.throwError('Expected ' + String.fromCharCode(termination));\n\t\t}\n\n\t\treturn args;\n\t}\n\n\t/**\n\t * Responsible for parsing a group of things within parentheses `()`\n\t * that have no identifier in front (so not a function call)\n\t * This function assumes that it needs to gobble the opening parenthesis\n\t * and then tries to gobble everything within that parenthesis, assuming\n\t * that the next thing it should see is the close parenthesis. If not,\n\t * then the expression probably doesn't have a `)`\n\t * @returns {boolean|jsep.Expression}\n\t */\n\tgobbleGroup() {\n\t\tthis.index++;\n\t\tlet nodes = this.gobbleExpressions(Jsep.CPAREN_CODE);\n\t\tif (this.code === Jsep.CPAREN_CODE) {\n\t\t\tthis.index++;\n\t\t\tif (nodes.length === 1) {\n\t\t\t\treturn nodes[0];\n\t\t\t}\n\t\t\telse if (!nodes.length) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn {\n\t\t\t\t\ttype: Jsep.SEQUENCE_EXP,\n\t\t\t\t\texpressions: nodes,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis.throwError('Unclosed (');\n\t\t}\n\t}\n\n\t/**\n\t * Responsible for parsing Array literals `[1, 2, 3]`\n\t * This function assumes that it needs to gobble the opening bracket\n\t * and then tries to gobble the expressions as arguments.\n\t * @returns {jsep.ArrayExpression}\n\t */\n\tgobbleArray() {\n\t\tthis.index++;\n\n\t\treturn {\n\t\t\ttype: Jsep.ARRAY_EXP,\n\t\t\telements: this.gobbleArguments(Jsep.CBRACK_CODE)\n\t\t};\n\t}\n}\n\n// Static fields:\nconst hooks = new Hooks();\nObject.assign(Jsep, {\n\thooks,\n\tplugins: new Plugins(Jsep),\n\n\t// Node Types\n\t// ----------\n\t// This is the full set of types that any JSEP node can be.\n\t// Store them here to save space when minified\n\tCOMPOUND: 'Compound',\n\tSEQUENCE_EXP: 'SequenceExpression',\n\tIDENTIFIER: 'Identifier',\n\tMEMBER_EXP: 'MemberExpression',\n\tLITERAL: 'Literal',\n\tTHIS_EXP: 'ThisExpression',\n\tCALL_EXP: 'CallExpression',\n\tUNARY_EXP: 'UnaryExpression',\n\tBINARY_EXP: 'BinaryExpression',\n\tARRAY_EXP: 'ArrayExpression',\n\n\tTAB_CODE: 9,\n\tLF_CODE: 10,\n\tCR_CODE: 13,\n\tSPACE_CODE: 32,\n\tPERIOD_CODE: 46, // '.'\n\tCOMMA_CODE: 44, // ','\n\tSQUOTE_CODE: 39, // single quote\n\tDQUOTE_CODE: 34, // double quotes\n\tOPAREN_CODE: 40, // (\n\tCPAREN_CODE: 41, // )\n\tOBRACK_CODE: 91, // [\n\tCBRACK_CODE: 93, // ]\n\tQUMARK_CODE: 63, // ?\n\tSEMCOL_CODE: 59, // ;\n\tCOLON_CODE: 58, // :\n\n\n\t// Operations\n\t// ----------\n\t// Use a quickly-accessible map to store all of the unary operators\n\t// Values are set to `1` (it really doesn't matter)\n\tunary_ops: {\n\t\t'-': 1,\n\t\t'!': 1,\n\t\t'~': 1,\n\t\t'+': 1\n\t},\n\n\t// Also use a map for the binary operations but set their values to their\n\t// binary precedence for quick reference (higher number = higher precedence)\n\t// see [Order of operations](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)\n\tbinary_ops: {\n\t\t'||': 1, '??': 1,\n\t\t'&&': 2, '|': 3, '^': 4, '&': 5,\n\t\t'==': 6, '!=': 6, '===': 6, '!==': 6,\n\t\t'<': 7, '>': 7, '<=': 7, '>=': 7,\n\t\t'<<': 8, '>>': 8, '>>>': 8,\n\t\t'+': 9, '-': 9,\n\t\t'*': 10, '/': 10, '%': 10,\n\t\t'**': 11,\n\t},\n\n\t// sets specific binary_ops as right-associative\n\tright_associative: new Set(['**']),\n\n\t// Additional valid identifier chars, apart from a-z, A-Z and 0-9 (except on the starting char)\n\tadditional_identifier_chars: new Set(['$', '_']),\n\n\t// Literals\n\t// ----------\n\t// Store the values to return for the various literals we may encounter\n\tliterals: {\n\t\t'true': true,\n\t\t'false': false,\n\t\t'null': null\n\t},\n\n\t// Except for `this`, which is special. This could be changed to something like `'self'` as well\n\tthis_str: 'this',\n});\nJsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);\nJsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);\n\n// Backward Compatibility:\nconst jsep = expr => (new Jsep(expr)).parse();\nconst stdClassProps = Object.getOwnPropertyNames(class Test{});\nObject.getOwnPropertyNames(Jsep)\n\t.filter(prop => !stdClassProps.includes(prop) && jsep[prop] === undefined)\n\t.forEach((m) => {\n\t\tjsep[m] = Jsep[m];\n\t});\njsep.Jsep = Jsep; // allows for const { Jsep } = require('jsep');\n\nconst CONDITIONAL_EXP = 'ConditionalExpression';\n\nvar ternary = {\n\tname: 'ternary',\n\n\tinit(jsep) {\n\t\t// Ternary expression: test ? consequent : alternate\n\t\tjsep.hooks.add('after-expression', function gobbleTernary(env) {\n\t\t\tif (env.node && this.code === jsep.QUMARK_CODE) {\n\t\t\t\tthis.index++;\n\t\t\t\tconst test = env.node;\n\t\t\t\tconst consequent = this.gobbleExpression();\n\n\t\t\t\tif (!consequent) {\n\t\t\t\t\tthis.throwError('Expected expression');\n\t\t\t\t}\n\n\t\t\t\tthis.gobbleSpaces();\n\n\t\t\t\tif (this.code === jsep.COLON_CODE) {\n\t\t\t\t\tthis.index++;\n\t\t\t\t\tconst alternate = this.gobbleExpression();\n\n\t\t\t\t\tif (!alternate) {\n\t\t\t\t\t\tthis.throwError('Expected expression');\n\t\t\t\t\t}\n\t\t\t\t\tenv.node = {\n\t\t\t\t\t\ttype: CONDITIONAL_EXP,\n\t\t\t\t\t\ttest,\n\t\t\t\t\t\tconsequent,\n\t\t\t\t\t\talternate,\n\t\t\t\t\t};\n\n\t\t\t\t\t// check for operators of higher priority than ternary (i.e. assignment)\n\t\t\t\t\t// jsep sets || at 1, and assignment at 0.9, and conditional should be between them\n\t\t\t\t\tif (test.operator && jsep.binary_ops[test.operator] <= 0.9) {\n\t\t\t\t\t\tlet newTest = test;\n\t\t\t\t\t\twhile (newTest.right.operator && jsep.binary_ops[newTest.right.operator] <= 0.9) {\n\t\t\t\t\t\t\tnewTest = newTest.right;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tenv.node.test = newTest.right;\n\t\t\t\t\t\tnewTest.right = env.node;\n\t\t\t\t\t\tenv.node = test;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.throwError('Expected :');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n};\n\n// Add default plugins:\n\njsep.plugins.register(ternary);\n\nexport { Jsep, jsep as default };\n","const FSLASH_CODE = 47; // '/'\nconst BSLASH_CODE = 92; // '\\\\'\n\nvar index = {\n\tname: 'regex',\n\n\tinit(jsep) {\n\t\t// Regex literal: /abc123/ig\n\t\tjsep.hooks.add('gobble-token', function gobbleRegexLiteral(env) {\n\t\t\tif (this.code === FSLASH_CODE) {\n\t\t\t\tconst patternIndex = ++this.index;\n\n\t\t\t\tlet inCharSet = false;\n\t\t\t\twhile (this.index < this.expr.length) {\n\t\t\t\t\tif (this.code === FSLASH_CODE && !inCharSet) {\n\t\t\t\t\t\tconst pattern = this.expr.slice(patternIndex, this.index);\n\n\t\t\t\t\t\tlet flags = '';\n\t\t\t\t\t\twhile (++this.index < this.expr.length) {\n\t\t\t\t\t\t\tconst code = this.code;\n\t\t\t\t\t\t\tif ((code >= 97 && code <= 122) // a...z\n\t\t\t\t\t\t\t\t|| (code >= 65 && code <= 90) // A...Z\n\t\t\t\t\t\t\t\t|| (code >= 48 && code <= 57)) { // 0-9\n\t\t\t\t\t\t\t\tflags += this.char;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet value;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tvalue = new RegExp(pattern, flags);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch (e) {\n\t\t\t\t\t\t\tthis.throwError(e.message);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tenv.node = {\n\t\t\t\t\t\t\ttype: jsep.LITERAL,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\traw: this.expr.slice(patternIndex - 1, this.index),\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// allow . [] and () after regex: /regex/.test(a)\n\t\t\t\t\t\tenv.node = this.gobbleTokenProperty(env.node);\n\t\t\t\t\t\treturn env.node;\n\t\t\t\t\t}\n\t\t\t\t\tif (this.code === jsep.OBRACK_CODE) {\n\t\t\t\t\t\tinCharSet = true;\n\t\t\t\t\t}\n\t\t\t\t\telse if (inCharSet && this.code === jsep.CBRACK_CODE) {\n\t\t\t\t\t\tinCharSet = false;\n\t\t\t\t\t}\n\t\t\t\t\tthis.index += this.code === BSLASH_CODE ? 2 : 1;\n\t\t\t\t}\n\t\t\t\tthis.throwError('Unclosed Regex');\n\t\t\t}\n\t\t});\n\t},\n};\n\nexport { index as default };\n","const PLUS_CODE = 43; // +\nconst MINUS_CODE = 45; // -\n\nconst plugin = {\n\tname: 'assignment',\n\n\tassignmentOperators: new Set([\n\t\t'=',\n\t\t'*=',\n\t\t'**=',\n\t\t'/=',\n\t\t'%=',\n\t\t'+=',\n\t\t'-=',\n\t\t'<<=',\n\t\t'>>=',\n\t\t'>>>=',\n\t\t'&=',\n\t\t'^=',\n\t\t'|=',\n\t\t'||=',\n\t\t'&&=',\n\t\t'??=',\n\t]),\n\tupdateOperators: [PLUS_CODE, MINUS_CODE],\n\tassignmentPrecedence: 0.9,\n\n\tinit(jsep) {\n\t\tconst updateNodeTypes = [jsep.IDENTIFIER, jsep.MEMBER_EXP];\n\t\tplugin.assignmentOperators.forEach(op => jsep.addBinaryOp(op, plugin.assignmentPrecedence, true));\n\n\t\tjsep.hooks.add('gobble-token', function gobbleUpdatePrefix(env) {\n\t\t\tconst code = this.code;\n\t\t\tif (plugin.updateOperators.some(c => c === code && c === this.expr.charCodeAt(this.index + 1))) {\n\t\t\t\tthis.index += 2;\n\t\t\t\tenv.node = {\n\t\t\t\t\ttype: 'UpdateExpression',\n\t\t\t\t\toperator: code === PLUS_CODE ? '++' : '--',\n\t\t\t\t\targument: this.gobbleTokenProperty(this.gobbleIdentifier()),\n\t\t\t\t\tprefix: true,\n\t\t\t\t};\n\t\t\t\tif (!env.node.argument || !updateNodeTypes.includes(env.node.argument.type)) {\n\t\t\t\t\tthis.throwError(`Unexpected ${env.node.operator}`);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tjsep.hooks.add('after-token', function gobbleUpdatePostfix(env) {\n\t\t\tif (env.node) {\n\t\t\t\tconst code = this.code;\n\t\t\t\tif (plugin.updateOperators.some(c => c === code && c === this.expr.charCodeAt(this.index + 1))) {\n\t\t\t\t\tif (!updateNodeTypes.includes(env.node.type)) {\n\t\t\t\t\t\tthis.throwError(`Unexpected ${env.node.operator}`);\n\t\t\t\t\t}\n\t\t\t\t\tthis.index += 2;\n\t\t\t\t\tenv.node = {\n\t\t\t\t\t\ttype: 'UpdateExpression',\n\t\t\t\t\t\toperator: code === PLUS_CODE ? '++' : '--',\n\t\t\t\t\t\targument: env.node,\n\t\t\t\t\t\tprefix: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tjsep.hooks.add('after-expression', function gobbleAssignment(env) {\n\t\t\tif (env.node) {\n\t\t\t\t// Note: Binaries can be chained in a single expression to respect\n\t\t\t\t// operator precedence (i.e. a = b = 1 + 2 + 3)\n\t\t\t\t// Update all binary assignment nodes in the tree\n\t\t\t\tupdateBinariesToAssignments(env.node);\n\t\t\t}\n\t\t});\n\n\t\tfunction updateBinariesToAssignments(node) {\n\t\t\tif (plugin.assignmentOperators.has(node.operator)) {\n\t\t\t\tnode.type = 'AssignmentExpression';\n\t\t\t\tupdateBinariesToAssignments(node.left);\n\t\t\t\tupdateBinariesToAssignments(node.right);\n\t\t\t}\n\t\t\telse if (!node.operator) {\n\t\t\t\tObject.values(node).forEach((val) => {\n\t\t\t\t\tif (val && typeof val === 'object') {\n\t\t\t\t\t\tupdateBinariesToAssignments(val);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t},\n};\n\nexport { plugin as default };\n","/* eslint-disable unicorn/no-top-level-side-effects -- Temporary? */\n/* eslint-disable no-bitwise -- Convenient */\nimport jsep from 'jsep';\nimport jsepRegex from '@jsep-plugin/regex';\nimport jsepAssignment from '@jsep-plugin/assignment';\n\n/**\n * @import {EvaluatedResult, UnknownResult} from './jsonpath.js';\n */\n\n/**\n * @typedef {any} AssignmentExpression\n */\n\n/**\n * @typedef {any} Substitution\n */\n\n/**\n * @typedef {any} AnyParameter\n */\n\n/**\n * @typedef {Record} Substitutions\n */\n\n// register plugins\njsep.plugins.register(jsepRegex, jsepAssignment);\njsep.addUnaryOp('typeof');\njsep.addUnaryOp('void');\njsep.addLiteral('null', null);\njsep.addLiteral('undefined', undefined);\n\nconst BLOCKED_PROTO_PROPERTIES = new Set([\n 'constructor',\n '__proto__',\n '__defineGetter__',\n '__defineSetter__',\n '__lookupGetter__',\n '__lookupSetter__'\n]);\n\nconst SafeEval = {\n /**\n * @param {jsep.Expression} ast\n * @param {Substitutions} subs\n * @returns {UnknownResult}\n */\n evalAst (ast, subs) {\n switch (ast.type) {\n case 'BinaryExpression':\n case 'LogicalExpression':\n return SafeEval.evalBinaryExpression(\n /** @type {jsep.BinaryExpression} */ (ast),\n subs\n );\n case 'Compound':\n return SafeEval.evalCompound(\n /** @type {jsep.Compound} */ (ast),\n subs\n );\n case 'ConditionalExpression':\n return SafeEval.evalConditionalExpression(\n /** @type {jsep.ConditionalExpression} */ (ast),\n subs\n );\n case 'Identifier':\n return SafeEval.evalIdentifier(\n /** @type {jsep.Identifier} */ (ast),\n subs\n );\n case 'Literal':\n return SafeEval.evalLiteral(/** @type {jsep.Literal} */ (ast));\n case 'MemberExpression':\n return SafeEval.evalMemberExpression(\n /** @type {jsep.MemberExpression} */ (ast),\n subs\n );\n case 'UnaryExpression':\n return SafeEval.evalUnaryExpression(\n /** @type {jsep.UnaryExpression} */ (ast),\n subs\n );\n case 'ArrayExpression':\n return SafeEval.evalArrayExpression(\n /** @type {jsep.ArrayExpression} */ (ast),\n subs\n );\n case 'CallExpression':\n return SafeEval.evalCallExpression(\n /** @type {jsep.CallExpression} */ (ast),\n subs\n );\n case 'AssignmentExpression':\n return SafeEval.evalAssignmentExpression(\n /** @type {AssignmentExpression} */ (ast),\n subs\n );\n default:\n throw new SyntaxError('Unexpected expression', {\n cause: ast\n });\n }\n },\n\n /**\n * @param {jsep.BinaryExpression} ast\n * @param {Substitutions} subs\n * @returns {UnknownResult}\n */\n evalBinaryExpression (ast, subs) {\n /**\n * @typedef {{\n * [key: string]: (a: AnyParameter, b: AnyParameter) => UnknownResult\n * }} OperatorTable\n */\n const result = /** @type {OperatorTable} */ ({\n '||': (a, b) => a || b(),\n '&&': (a, b) => a && b(),\n '|': (a, b) => a | b(),\n '^': (a, b) => a ^ b(),\n '&': (a, b) => a & b(),\n // eslint-disable-next-line eqeqeq -- API\n '==': (a, b) => a == b(),\n // eslint-disable-next-line eqeqeq -- API\n '!=': (a, b) => a != b(),\n '===': (a, b) => a === b(),\n '!==': (a, b) => a !== b(),\n '<': (a, b) => a < b(),\n '>': (a, b) => a > b(),\n '<=': (a, b) => a <= b(),\n '>=': (a, b) => a >= b(),\n '<<': (a, b) => a << b(),\n '>>': (a, b) => a >> b(),\n '>>>': (a, b) => a >>> b(),\n '+': (a, b) => a + b(),\n '-': (a, b) => a - b(),\n '*': (a, b) => a * b(),\n '/': (a, b) => a / b(),\n '%': (a, b) => a % b()\n })[ast.operator](\n SafeEval.evalAst(ast.left, subs),\n () => SafeEval.evalAst(ast.right, subs)\n );\n return result;\n },\n\n /**\n * @param {jsep.Compound} ast\n * @param {Substitutions} subs\n * @returns {UnknownResult}\n */\n evalCompound (ast, subs) {\n let last;\n for (let i = 0; i < ast.body.length; i++) {\n if (\n ast.body[i].type === 'Identifier' &&\n ['var', 'let', 'const'].includes(\n /** @type {jsep.Identifier} */\n (ast.body[i]).name\n ) &&\n Object.hasOwn(ast.body, i + 1) &&\n ast.body[i + 1].type === 'AssignmentExpression'\n ) {\n // var x=2; is detected as\n // [{Identifier var}, {AssignmentExpression x=2}]\n i += 1;\n }\n const expr = ast.body[i];\n last = SafeEval.evalAst(expr, subs);\n }\n return last;\n },\n\n /**\n * @param {jsep.ConditionalExpression} ast\n * @param {Substitutions} subs\n * @returns {UnknownResult}\n */\n evalConditionalExpression (ast, subs) {\n if (SafeEval.evalAst(ast.test, subs)) {\n return SafeEval.evalAst(ast.consequent, subs);\n }\n return SafeEval.evalAst(ast.alternate, subs);\n },\n\n /**\n * @param {jsep.Identifier} ast\n * @param {Substitutions} subs\n * @returns {UnknownResult}\n */\n evalIdentifier (ast, subs) {\n if (Object.hasOwn(subs, ast.name)) {\n return subs[ast.name];\n }\n throw new ReferenceError(`${ast.name} is not defined`);\n },\n\n /**\n * @param {jsep.Literal} ast\n * @returns {UnknownResult}\n */\n evalLiteral (ast) {\n return ast.value;\n },\n\n /**\n * @param {jsep.MemberExpression} ast\n * @param {Substitutions} subs\n * @returns {UnknownResult}\n */\n evalMemberExpression (ast, subs) {\n const prop = String(\n // NOTE: `String(value)` throws error when\n // value has overwritten the toString method to return non-string\n // i.e. `value = {toString: () => []}`\n ast.computed\n ? SafeEval.evalAst(ast.property, subs) // `object[property]`\n : ast.property.name // `object.property` property is Identifier\n );\n const obj = SafeEval.evalAst(ast.object, subs);\n if (obj === undefined || obj === null) {\n throw new TypeError(\n `Cannot read properties of ${obj} (reading '${prop}')`\n );\n }\n if (!Object.hasOwn(obj, prop) && BLOCKED_PROTO_PROPERTIES.has(prop)) {\n throw new TypeError(\n `Cannot read properties of ${obj} (reading '${prop}')`\n );\n }\n const result = /** @type {Record} */ (obj)[prop];\n if (typeof result === 'function' && result !== Function) {\n return result.bind(obj); // arrow functions aren't affected by bind.\n }\n return result;\n },\n\n /**\n * @param {jsep.UnaryExpression} ast\n * @param {Substitutions} subs\n * @returns {UnknownResult}\n */\n evalUnaryExpression (ast, subs) {\n /**\n * @typedef {{\n * [key: string]: (a: AnyParameter) => UnknownResult\n * }} UnaryOperatorTable\n */\n const result = /** @type {UnaryOperatorTable} */ ({\n '-': (a) => -(/** @type {EvaluatedResult} */ (\n SafeEval.evalAst(a, subs))\n ),\n '!': (a) => !SafeEval.evalAst(a, subs),\n '~': (a) => ~(/** @type {EvaluatedResult} */ (\n SafeEval.evalAst(a, subs))\n ),\n // eslint-disable-next-line no-implicit-coercion -- API\n '+': (a) => +(/** @type {EvaluatedResult} */ (\n SafeEval.evalAst(a, subs))\n ),\n typeof: (a) => typeof SafeEval.evalAst(a, subs),\n // eslint-disable-next-line no-void -- Ok\n void: (a) => void SafeEval.evalAst(a, subs)\n })[ast.operator](ast.argument);\n return result;\n },\n\n /**\n * @param {jsep.ArrayExpression} ast\n * @param {Substitutions} subs\n * @returns {UnknownResult}\n */\n evalArrayExpression (ast, subs) {\n return ast.elements.map((el) => SafeEval.evalAst(\n /** @type {jsep.Expression} */\n (el),\n subs\n ));\n },\n\n /**\n * @param {jsep.CallExpression} ast\n * @param {Substitutions} subs\n * @returns {UnknownResult}\n */\n evalCallExpression (ast, subs) {\n const args = ast.arguments.map((arg) => SafeEval.evalAst(arg, subs));\n const func = SafeEval.evalAst(ast.callee, subs);\n if (func === Function) {\n throw new Error('Function constructor is disabled');\n }\n return (/** @type {(...args: AnyParameter[]) => UnknownResult} */ (\n func\n ))(...args);\n },\n\n /**\n * @param {AssignmentExpression} ast\n * @param {Substitutions} subs\n * @returns {UnknownResult}\n */\n evalAssignmentExpression (ast, subs) {\n if (ast.left.type !== 'Identifier') {\n throw new SyntaxError('Invalid left-hand side in assignment');\n }\n const id = /** @type {jsep.Identifier} */ (\n ast.left\n ).name;\n const value = SafeEval.evalAst(ast.right, subs);\n subs[id] = value;\n return subs[id];\n }\n};\n\n/**\n * A replacement for NodeJS' VM.Script which is also {@link https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP | Content Security Policy} friendly.\n */\nclass SafeScript {\n /**\n * @param {string} expr Expression to evaluate\n */\n constructor (expr) {\n this.code = expr;\n this.ast = /** @type {unknown} */ (jsep(this.code));\n }\n\n /**\n * @param {object} context Object whose items will be added\n * to evaluation\n * @returns {EvaluatedResult} Result of evaluated code\n */\n runInNewContext (context) {\n // `Object.create(null)` creates a prototypeless object\n const keyMap = Object.assign(Object.create(null), context);\n return SafeEval.evalAst(\n /** @type {jsep.Expression} */ (this.ast),\n keyMap\n );\n }\n}\n\nexport {SafeScript};\n","/* eslint-disable camelcase -- Convenient for escaping */\n/* eslint-disable class-methods-use-this -- Consistent monkey-patching */\n/* eslint-disable unicorn/prefer-private-class-fields -- Allow\n monkey-patching */\nimport {SafeScript} from './Safe-Script.js';\n\n/**\n * @import {Script} from './jsonpath-browser.js';\n */\n\n/**\n * @typedef {any} AnyInput\n */\n\n/**\n * @typedef {((...args: any[]) => any)} SandboxCallback\n */\n\n/**\n * @typedef {any|SandboxCallback} SandboxPropertyValue\n */\n\n/**\n * @typedef {(string|number)[]} ExpressionArray\n */\n\n/**\n * @typedef {\"scalar\"|\"boolean\"|\"string\"|\"undefined\"\n * |\"function\"|\"integer\"|\"number\"|\"nonFinite\"|\"object\"\n * |\"array\"|\"other\"|\"null\"} ValueType\n */\n\n/**\n * @typedef {unknown} ParentValue\n */\n\n/**\n * @typedef {unknown} UnknownResult\n */\n\n/**\n * @typedef {string|number|null} ParentProperty\n */\n\n/**\n * @typedef {ReturnObject|string|number|boolean|null|unknown[]\n * |Record} PreferredOutput\n */\n\n/**\n * Copies array and then pushes item into it.\n * @param {ExpressionArray} arr Array to copy and into which to push\n * @param {string|number} item Array item to add (to end)\n * @returns {ExpressionArray} Copy of the original array\n */\nfunction push (arr, item) {\n arr = arr.slice();\n arr.push(item);\n return arr;\n}\n/**\n * Copies array and then unshifts item into it.\n * @param {string|number} item Array item to add (to beginning)\n * @param {ExpressionArray} arr Array to copy and into which to unshift\n * @returns {ExpressionArray} Copy of the original array\n */\nfunction unshift (item, arr) {\n arr = arr.slice();\n arr.unshift(item);\n return arr;\n}\n\n/**\n * @typedef {object} ReturnObject\n * @property {ExpressionArray|string} path\n * @property {unknown} value\n * @property {ParentValue} parent\n * @property {ParentProperty} parentProperty\n * @property {boolean} [isParentSelector]\n * @property {boolean} [hasArrExpr]\n * @property {ExpressionArray} [expr]\n * @property {string} [pointer]\n */\n\n/**\n * @callback JSONPathCallback\n * @param {any} preferredOutput Using `any` type instead of `PreferredOutput` so\n * that user can supply flexible type\n * @param {\"value\"|\"property\"} type\n * @param {ReturnObject} fullRetObj\n * @returns {void}\n */\n\n/**\n * @callback OtherTypeCallback\n * @param {unknown} val\n * @param {ExpressionArray} path\n * @param {ParentValue} parent\n * @param {string|null} parentPropName\n * @returns {boolean|null}\n */\n\n/**\n * @typedef {any} ContextItem\n */\n\n/**\n * @typedef {any} EvaluatedResult\n */\n\n/**\n * @callback EvalCallback\n * @param {string} code\n * @param {ContextItem} context\n * @returns {EvaluatedResult}\n */\n\n/**\n * @typedef {new (expr: string) => {\n * runInNewContext: (context: object) => EvaluatedResult\n * }} ScriptConstructor\n */\n\n/**\n * @typedef {ScriptConstructor} EvalClass\n */\n\n/**\n * @typedef {\"value\"|\"path\"|\"pointer\"|\"parent\"|\"parentProperty\"\n * |\"all\"} ResultType\n */\n\n/**\n * @typedef {EvalCallback|EvalClass|'safe'|'native'|boolean} EvalValue\n */\n\n/**\n * @typedef {string|string[]} PathType\n */\n\n/**\n * @typedef {{Script: ScriptConstructor}} SafeScriptType\n */\n\n/**\n * @typedef {{Script: ScriptConstructor}} ScriptType\n */\n\n/**\n * @typedef {{\n * _$_path?: string,\n * _$_parentProperty?: ParentProperty,\n * _$_parent?: ParentValue,\n * _$_property?: string|number,\n * _$_root?: AnyInput,\n * _$_v?: unknown,\n * [key: string]: SandboxPropertyValue\n * }} SandboxType\n */\n\n/**\n * @typedef {object} JSONPathOptions\n * @property {AnyInput} [json]\n * @property {PathType} [path]\n * @property {ResultType} [resultType=\"value\"]\n * @property {boolean} [flatten=false]\n * @property {boolean} [wrap=true]\n * @property {SandboxType} [sandbox={}]\n * @property {EvalValue} [eval='safe']\n * @property {any|null} [parent=null]\n * @property {ParentProperty} [parentProperty=null]\n * @property {JSONPathCallback} [callback]\n * @property {OtherTypeCallback} [otherTypeCallback] Defaults to\n * function which throws on encountering `@other`\n * @property {boolean} [autostart=true]\n * @property {boolean} [ignoreEvalErrors=false]\n */\n\n\n/**\n * @overload\n * @param {string} opts JSON path to evaluate\n * @param {AnyInput} [expr] JSON object to evaluate against\n * @param {JSONPathCallback} [obj] Passed 3 arguments: 1) desired\n * payload per `resultType`, 2) `\"value\"|\"property\"`, 3) Full returned\n * object with all payloads\n * @param {OtherTypeCallback} [callback] If `@other()` is at the\n * end of one's query, this will be invoked with the value of the item,\n * its path, its parent, and its parent's property name, and it should\n * return a boolean indicating whether the supplied value belongs to the\n * \"other\" type or not (or it may handle transformations and return\n * `false`).\n * @param {undefined} [otherTypeCallback]\n * @returns {unknown} The string form always has `autostart` implicitly\n * `true`, so the result is the evaluated value, not a `JSONPathClass`\n */\n/**\n * @overload\n * @param {JSONPathOptions & {autostart: false}} opts An options object\n * with `autostart` explicitly set to `false` defers evaluation and\n * returns the `JSONPathClass` instance instead\n * @returns {JSONPathClass}\n */\n/**\n * @overload\n * @param {JSONPathOptions} opts If a string, will be treated as\n * `expr`\n * @returns {unknown}\n */\n/**\n * @param {JSONPathOptions|string} opts If a string, will be treated as `expr`\n * @param {string|AnyInput} [expr] JSON path to evaluate\n * @param {AnyInput|JSONPathCallback} [obj] JSON object to evaluate against\n * @param {JSONPathCallback|OtherTypeCallback} [callback] Passed 3\n * arguments: 1) desired payload per `resultType`,\n * 2) `\"value\"|\"property\"`, 3) Full returned object with\n * all payloads\n * @param {OtherTypeCallback} [otherTypeCallback] If `@other()` is at the end\n * of one's query, this will be invoked with the value of the item, its\n * path, its parent, and its parent's property name, and it should return\n * a boolean indicating whether the supplied value belongs to the \"other\"\n * type or not (or it may handle transformations and return `false`).\n * @throws {Error}\n * @returns {unknown|JSONPathClass}\n */\nfunction JSONPath (opts, expr, obj, callback, otherTypeCallback) {\n try {\n if (opts && typeof opts === 'object') {\n return new JSONPathClass(opts);\n }\n return new JSONPathClass(\n opts,\n expr,\n /** @type {JSONPathCallback|undefined} */ (obj),\n /** @type {OtherTypeCallback|undefined} */ (callback),\n /** @type {undefined} */ (otherTypeCallback)\n );\n } catch (e) {\n if (new.target) {\n throw e;\n }\n if (e && typeof e === 'object' && 'value' in e) {\n return /** @type {{value: UnknownResult}} */ (e).value;\n }\n throw e;\n }\n}\n\n/**\n *\n */\nclass JSONPathClass {\n /**\n * @overload\n * @param {string} opts JSON path to evaluate\n * @param {AnyInput} [expr] JSON object to evaluate against\n * @param {JSONPathCallback} [obj] Passed 3 arguments: 1) desired\n * payload per `resultType`, 2) `\"value\"|\"property\"`, 3) Full returned\n * object with all payloads\n * @param {OtherTypeCallback} [callback] If `@other()` is at the\n * end of one's query, this will be invoked with the value of the item,\n * its path, its parent, and its parent's property name, and it should\n * return a boolean indicating whether the supplied value belongs to the\n * \"other\" type or not (or it may handle transformations and return\n * `false`).\n * @param {undefined} [otherTypeCallback]\n */\n /**\n * @overload\n * @param {JSONPathOptions} opts If a string, will be treated as\n * `expr`\n */\n /**\n * @param {null|string|JSONPathOptions} opts If a string, will be treated as\n * `expr`\n * @param {string|AnyInput} [expr] JSON path to evaluate\n * @param {AnyInput|JSONPathCallback} [obj] JSON object to evaluate against\n * @param {JSONPathCallback|OtherTypeCallback} [callback] Passed 3\n * arguments: 1) desired payload per `resultType`,\n * 2) `\"value\"|\"property\"`, 3) Full returned\n * object with all payloads\n * @param {OtherTypeCallback} [otherTypeCallback] If `@other()` is at the\n * end of one's query, this will be invoked with the value of the item,\n * its path, its parent, and its parent's property name, and it should\n * return a boolean indicating whether the supplied value belongs to the\n * \"other\" type or not (or it may handle transformations and return\n * `false`).\n */\n constructor (opts, expr, obj, callback, otherTypeCallback) {\n if (typeof opts === 'string') {\n otherTypeCallback = /** @type {OtherTypeCallback} */ (\n callback\n );\n callback = /** @type {JSONPathCallback} */ (\n obj\n );\n obj = expr;\n expr = opts;\n opts = null;\n }\n const optObj = opts && typeof opts === 'object';\n opts ||= /** @type {JSONPathOptions} */ ({});\n /** @type {ResultType|undefined} */\n this.currResultType = undefined;\n\n /** @type {EvalValue|undefined} */\n this.currEval = undefined;\n\n /** @type {OtherTypeCallback|undefined} */\n this.currOtherTypeCallback = undefined;\n\n /** @type {SandboxType|undefined} */\n this.currSandbox = undefined;\n\n this._hasParentSelector = false;\n\n this.json = opts.json || obj;\n this.path = opts.path || expr;\n this.resultType = opts.resultType || 'value';\n this.flatten = Object.hasOwn(opts, 'flatten') ? opts.flatten : false;\n this.wrap = Object.hasOwn(opts, 'wrap') ? opts.wrap : true;\n this.sandbox = opts.sandbox || {};\n this.eval = opts.eval === undefined ? 'safe' : opts.eval;\n this.ignoreEvalErrors = (typeof opts.ignoreEvalErrors === 'undefined')\n ? false\n : opts.ignoreEvalErrors;\n this.parent = Object.hasOwn(opts, 'parent') ? opts.parent : null;\n this.parentProperty = Object.hasOwn(opts, 'parentProperty')\n ? opts.parentProperty\n : null;\n this.callback = opts.callback ||\n /** @type {JSONPathCallback} */\n (callback) ||\n null;\n this.otherTypeCallback = opts.otherTypeCallback ||\n otherTypeCallback ||\n function () {\n throw new TypeError(\n 'You must supply an otherTypeCallback callback option ' +\n 'with the @other() operator.'\n );\n };\n\n if (opts.autostart !== false) {\n const args = /** @type {JSONPathOptions} */ ({\n path: (optObj ? opts.path : expr)\n });\n if (!optObj && obj !== undefined) {\n args.json = obj;\n } else if ('json' in opts) {\n args.json = opts.json;\n }\n const ret = this.evaluate(args);\n if (!ret || typeof ret !== 'object') {\n const err = /** @type {Error & {value: UnknownResult}} */ (\n new Error(\n 'JSONPath should not be called with \"new\" (it ' +\n 'prevents return of (unwrapped) scalar values)'\n )\n );\n err.value = ret;\n throw err;\n }\n\n // eslint-disable-next-line @stylistic/max-len -- Long\n // @ts-expect-error - Constructor returns evaluate result for legacy API\n // eslint-disable-next-line no-constructor-return -- Legacy API\n return ret;\n }\n }\n\n // PUBLIC METHODS\n\n /**\n * @overload\n * @param {JSONPathOptions} [expr]\n * @returns {ReturnObject|ReturnObject[]|undefined|unknown}\n */\n\n /**\n * @overload\n * @param {PathType|undefined} [expr]\n * @param {AnyInput} [json]\n * @param {JSONPathCallback|null} [callback]\n * @param {OtherTypeCallback} [otherTypeCallback]\n * @returns {ReturnObject|ReturnObject[]|undefined|unknown}\n */\n\n /**\n * @param {PathType|JSONPathOptions|undefined} [expr]\n * @param {AnyInput} [json]\n * @param {JSONPathCallback|null} [callback]\n * @param {OtherTypeCallback} [otherTypeCallback]\n * @returns {ReturnObject|ReturnObject[]|undefined|unknown}\n */\n evaluate (\n expr, json, callback, otherTypeCallback\n ) {\n let currParent = this.parent,\n currParentProperty = this.parentProperty;\n let {flatten, wrap} = this;\n\n this.currResultType = this.resultType;\n this.currEval = this.eval;\n this.currSandbox = this.sandbox;\n callback ||= this.callback;\n this.currOtherTypeCallback = otherTypeCallback ||\n this.otherTypeCallback;\n\n if (expr && typeof expr === 'object' && !Array.isArray(expr)) {\n const exprObj = expr;\n if (!exprObj.path && exprObj.path !== '') {\n throw new TypeError(\n 'You must supply a \"path\" property when providing an ' +\n 'object argument to JSONPath.evaluate().'\n );\n }\n if (!(Object.hasOwn(exprObj, 'json'))) {\n throw new TypeError(\n 'You must supply a \"json\" property when providing an ' +\n 'object argument to JSONPath.evaluate().'\n );\n }\n ({json} = exprObj);\n flatten = Object.hasOwn(exprObj, 'flatten')\n ? exprObj.flatten\n : flatten;\n this.currResultType = Object.hasOwn(exprObj, 'resultType')\n ? exprObj.resultType\n : this.currResultType;\n this.currSandbox = Object.hasOwn(exprObj, 'sandbox')\n ? exprObj.sandbox\n : this.currSandbox;\n wrap = Object.hasOwn(exprObj, 'wrap') ? exprObj.wrap : wrap;\n this.currEval = Object.hasOwn(exprObj, 'eval')\n ? exprObj.eval\n : this.currEval;\n callback = Object.hasOwn(exprObj, 'callback')\n ? exprObj.callback\n : callback;\n this.currOtherTypeCallback = Object.hasOwn(\n exprObj, 'otherTypeCallback'\n )\n ? exprObj.otherTypeCallback\n : this.currOtherTypeCallback;\n currParent = Object.hasOwn(exprObj, 'parent')\n ? exprObj.parent\n : currParent;\n currParentProperty = Object.hasOwn(exprObj, 'parentProperty')\n ? exprObj.parentProperty\n : currParentProperty;\n expr = exprObj.path;\n } else {\n json ||= this.json;\n expr ||= this.path;\n }\n currParent ||= null;\n currParentProperty ||= null;\n\n if (Array.isArray(expr)) {\n expr = JSONPath.toPathString(expr);\n }\n if (!json || (!expr && expr !== '')) {\n return undefined;\n }\n\n const exprList = JSONPath.toPathArray(\n /** @type {string} */\n (expr)\n );\n if (exprList[0] === '$' && exprList.length > 1) {\n exprList.shift();\n }\n this._hasParentSelector = false;\n const traceResult = this._trace(\n exprList, json, ['$'], currParent,\n currParentProperty,\n callback ?? undefined,\n undefined\n );\n\n // eslint-disable-next-line @stylistic/max-len -- Long\n /* c8 ignore next 2 -- Unreachable: _trace returns array when hasArrExpr set */\n const result = (\n Array.isArray(traceResult) ? traceResult : [traceResult]\n ).filter((ea) => {\n return ea && !ea.isParentSelector;\n });\n\n if (!result.length) {\n // eslint-disable-next-line @stylistic/max-len -- Long\n /* c8 ignore next -- Unreachable: valid queries always produce results */\n return wrap ? [] : undefined;\n }\n if (!wrap && result.length === 1 && !result[0].hasArrExpr) {\n const preferredOutput = this._getPreferredOutput(result[0]);\n return preferredOutput;\n }\n const reduced = result.reduce(\n (rslt, ea) => {\n const valOrPath = this._getPreferredOutput(ea);\n if (flatten && Array.isArray(valOrPath)) {\n rslt = rslt.concat(valOrPath);\n } else {\n rslt.push(valOrPath);\n }\n return rslt;\n },\n /** @type {UnknownResult[]} */\n ([])\n );\n\n return reduced;\n }\n\n // PRIVATE METHODS\n\n /**\n * @param {ReturnObject} ea\n * @returns {PreferredOutput}\n */\n _getPreferredOutput (ea) {\n const resultType = this.currResultType;\n switch (resultType) {\n case 'all': {\n const path = Array.isArray(ea.path)\n ? ea.path\n : JSONPath.toPathArray(ea.path);\n ea.pointer = JSONPath.toPointer(/** @type {string[]} */ (path));\n ea.path = typeof ea.path === 'string'\n ? ea.path\n : JSONPath.toPathString(/** @type {string[]} */ (ea.path));\n return ea;\n } case 'value': case 'parent': case 'parentProperty':\n return /** @type {PreferredOutput} */ (ea[resultType]);\n case 'path':\n if (typeof ea.path === 'string') {\n return ea.path;\n }\n return JSONPath.toPathString(/** @type {string[]} */ (ea.path));\n case 'pointer': {\n const pathArray = Array.isArray(ea.path)\n ? ea.path\n : JSONPath.toPathArray(ea.path);\n return JSONPath.toPointer(/** @type {string[]} */ (pathArray));\n }\n default:\n throw new TypeError('Unknown result type');\n }\n }\n\n /**\n * @param {ReturnObject} fullRetObj\n * @param {JSONPathCallback|undefined} callback\n * @param {\"value\"|\"property\"} type\n * @returns {void}\n */\n _handleCallback (fullRetObj, callback, type) {\n // Early return if no callback provided (defensive\n // check for internal calls)\n if (!callback) {\n return;\n }\n const preferredOutput = this._getPreferredOutput(fullRetObj);\n if (Array.isArray(fullRetObj.path)) {\n fullRetObj.path = JSONPath.toPathString(\n /** @type {string[]} */ (fullRetObj.path)\n );\n }\n callback(preferredOutput, type, fullRetObj);\n }\n\n /**\n *\n * @param {ExpressionArray} expr\n * @param {unknown} val\n * @param {ExpressionArray} path\n * @param {ParentValue} parent\n * @param {ParentProperty} parentPropName\n * @param {JSONPathCallback|undefined} callback\n * @param {boolean|undefined} hasArrExpr\n * @param {boolean} [literalPriority]\n * @returns {ReturnObject|ReturnObject[]}\n */\n _trace (\n expr, val, path, parent, parentPropName, callback, hasArrExpr,\n literalPriority\n ) {\n // No expr to follow? return path and value as the result of\n // this trace branch\n let retObj;\n if (!expr.length) {\n retObj = {\n path,\n value: val,\n parent,\n parentProperty: parentPropName,\n hasArrExpr\n };\n this._handleCallback(retObj, callback, 'value');\n return retObj;\n }\n\n const loc = /** @type {string} */ (expr[0]), x = expr.slice(1);\n\n // We need to gather the return value of recursive trace calls in order\n // to do the parent sel computation.\n /** @type {ReturnObject[]} */\n const ret = [];\n /**\n *\n * @param {ReturnObject|ReturnObject[]} elems\n * @returns {void}\n */\n function addRet (elems) {\n if (Array.isArray(elems)) {\n // This was causing excessive stack size in Node (with or\n // without Babel) against our performance test:\n // `ret.push(...elems);`\n elems.forEach((t) => {\n ret.push(t);\n });\n } else {\n ret.push(elems);\n }\n }\n if (val && (typeof loc !== 'string' || literalPriority) &&\n Object.hasOwn(val, /** @type {PropertyKey} */ (loc))\n ) { // simple case--directly follow property\n const valObj = /** @type {Record} */ (val);\n addRet(this._trace(\n x, valObj[/** @type {string} */ (loc)],\n push(path, loc),\n val, /** @type {string|number} */ (loc), callback,\n hasArrExpr\n ));\n // eslint-disable-next-line unicorn/prefer-switch -- Part of larger `if`\n } else if (loc === '*') { // all child properties\n this._walk(val, (m) => {\n const valObj = /** @type {Record} */ (val);\n addRet(this._trace(\n x, valObj[m], push(path, m), val, m, callback, true, true\n ));\n });\n } else if (loc === '..') { // all descendent parent properties\n // Check remaining expression with val's immediate children\n addRet(\n this._trace(x, val, path, parent, parentPropName, callback,\n hasArrExpr)\n );\n this._walk(val, (m) => {\n // We don't join m and x here because we only want parents,\n // not scalar values\n const valObj = /** @type {Record} */ (val);\n if (typeof valObj[m] === 'object') {\n // Keep going with recursive descent on val's\n // object children\n addRet(this._trace(\n expr.slice(),\n valObj[m],\n push(path, m),\n val,\n m,\n callback,\n true\n ));\n }\n });\n // The parent sel computation is handled in the frame above using the\n // ancestor object of val\n } else if (loc === '^') {\n // This is not a final endpoint, so we do not invoke the\n // callback here\n this._hasParentSelector = true;\n return /** @type {ReturnObject} */ ({\n path: path.slice(0, -1),\n expr: x,\n isParentSelector: true,\n value: undefined,\n parent: undefined,\n parentProperty: null\n });\n } else if (loc === '~') { // property name\n retObj = {\n path: push(path, loc),\n value: parentPropName,\n parent,\n parentProperty: null\n };\n this._handleCallback(retObj, callback, 'property');\n return retObj;\n } else if (loc === '$') { // root only\n addRet(this._trace(x, val, path, null, null, callback, hasArrExpr));\n } else if ((/^(-?\\d*):(-?\\d*):?(\\d*)$/u).test(loc)) { // [start:end:step] Python slice syntax\n const sliceResult = this._slice(\n loc, x, val, path, parent, parentPropName, callback\n );\n if (sliceResult) {\n addRet(sliceResult);\n }\n } else if (loc.indexOf('?(') === 0) { // [?(expr)] (filtering)\n if (this.currEval === false) {\n throw new Error(\n 'Eval [?(expr)] prevented in JSONPath expression.'\n );\n }\n const safeLoc = loc.replace(/^\\?\\((.*?)\\)$/u, '$1');\n // check for a nested filter expression\n\n const nested = (/@.?([^?]*)[['](\\??\\(.*?\\))(?!.\\)\\])[\\]']/gu).exec(safeLoc);\n if (nested) {\n // find if there are matches in the nested expression\n // add them to the result set if there is at least one match\n this._walk(val, (m) => {\n const npath = [nested[2]];\n const valObj2 = /** @type {Record} */ (\n val\n );\n const nvalue = /** @type {ValueType} */ (nested[1]\n ? /** @type {Record} */ (\n valObj2[m]\n )[nested[1]]\n : valObj2[m]);\n const filterResults = this._trace(npath, nvalue, path,\n parent, parentPropName, callback, true);\n // eslint-disable-next-line @stylistic/max-len -- Long\n /* c8 ignore next 3 -- Unreachable: _trace always returns array for nested filters */\n const filterArray = Array.isArray(filterResults)\n ? filterResults\n : [filterResults];\n if (filterArray.length > 0) {\n addRet(this._trace(x, valObj2[m], push(path, m), val,\n m, callback, true));\n }\n });\n } else {\n const valObj3 = /** @type {Record} */ (val);\n this._walk(val, (m) => {\n if (this._eval(safeLoc, valObj3[m], m, path, parent,\n parentPropName)) {\n addRet(this._trace(x, valObj3[m], push(path, m), val, m,\n callback, true));\n }\n });\n }\n } else if (loc[0] === '(') { // [(expr)] (dynamic property/index)\n if (this.currEval === false) {\n throw new Error(\n 'Eval [(expr)] prevented in JSONPath expression.'\n );\n }\n // As this will resolve to a property name (but we don't know it\n // yet), property and parent information is relative to the\n const evalResult = this._eval(\n /** @type {string} */ (loc),\n val, /** @type {string|number} */ (path.at(-1)),\n path.slice(0, -1), parent, parentPropName\n );\n const exprToUse = /** @type {string|number} */ (\n evalResult !== undefined ? evalResult : ''\n );\n addRet(this._trace(unshift(\n exprToUse,\n x\n ), val, path, parent, parentPropName, callback, hasArrExpr));\n } else if (loc[0] === '@') { // value type: @boolean(), etc.\n let addType = false;\n const valueType = /** @type {ValueType} */ (loc).slice(1, -2);\n switch (valueType) {\n case 'scalar':\n if (!val || !(['object', 'function'].includes(typeof val))) {\n addType = true;\n }\n break;\n case 'boolean': case 'string': case 'undefined': case 'function':\n if (typeof val === valueType) {\n addType = true;\n }\n break;\n case 'integer':\n if (Number.isFinite(val) &&\n !(/** @type {number} */ (val) % 1)) {\n addType = true;\n }\n break;\n case 'number':\n if (Number.isFinite(val)) {\n addType = true;\n }\n break;\n case 'nonFinite':\n if (typeof val === 'number' && !Number.isFinite(val)) {\n addType = true;\n }\n break;\n case 'object':\n if (val && typeof val === valueType) {\n addType = true;\n }\n break;\n case 'array':\n if (Array.isArray(val)) {\n addType = true;\n }\n break;\n case 'other':\n addType = this.currOtherTypeCallback?.(\n val, path, parent,\n /** @type {string|null} */ (parentPropName)\n ) ?? false;\n break;\n case 'null':\n if (val === null) {\n addType = true;\n }\n break;\n /* c8 ignore next 2 */\n default:\n throw new TypeError('Unknown value type ' + valueType);\n }\n if (addType) {\n retObj = {\n path, value: val, parent, parentProperty: parentPropName\n };\n this._handleCallback(retObj, callback, 'value');\n return retObj;\n }\n // `-escaped property\n } else if (val && loc[0] === '`' &&\n Object.hasOwn(val, loc.slice(1))\n ) {\n const locProp = loc.slice(1);\n const valObj = /** @type {Record} */ (val);\n addRet(this._trace(\n x, valObj[locProp], push(path, locProp), val, locProp, callback,\n hasArrExpr, true\n ));\n } else if (loc.includes(',')) { // [name1,name2,...]\n const parts = loc.split(',');\n for (const part of parts) {\n addRet(this._trace(\n unshift(part, x),\n val,\n path,\n parent,\n parentPropName,\n callback,\n true\n ));\n }\n // simple case--directly follow property\n } else if (\n !literalPriority && val && Object.hasOwn(val, loc)\n ) {\n const valObj = /** @type {Record} */ (val);\n addRet(\n this._trace(x, valObj[loc], push(path, loc), val, loc, callback,\n hasArrExpr, true)\n );\n }\n\n // We check the resulting values for parent selections. For parent\n // selections we discard the value object and continue the trace with\n // the current val object\n if (this._hasParentSelector) {\n for (let t = 0; t < ret.length; t++) {\n const rett = ret[t];\n if (rett && rett.isParentSelector) {\n const exprToUse = /** @type {ExpressionArray} */ (\n rett.expr\n );\n const pathToUse = /** @type {ExpressionArray} */ (\n rett.path\n );\n const tmp = this._trace(\n exprToUse,\n val,\n pathToUse,\n parent,\n parentPropName,\n callback,\n hasArrExpr\n );\n if (Array.isArray(tmp)) {\n ret[t] = tmp[0];\n const tl = tmp.length;\n for (let tt = 1; tt < tl; tt++) {\n t++;\n ret.splice(t, 0, tmp[tt]);\n }\n } else {\n ret[t] = tmp;\n }\n }\n }\n }\n return ret;\n }\n\n /**\n * @param {unknown} val\n * @param {(prop: string|number) => void} f\n * @returns {void}\n */\n _walk (val, f) {\n if (Array.isArray(val)) {\n const n = val.length;\n for (let i = 0; i < n; i++) {\n f(i);\n }\n } else if (val && typeof val === 'object') {\n Object.keys(val).forEach((m) => {\n f(m);\n });\n }\n }\n\n /**\n * @param {string} loc\n * @param {ExpressionArray} expr\n * @param {unknown} val\n * @param {ExpressionArray} path\n * @param {ParentValue} parent\n * @param {ParentProperty} parentPropName\n * @param {JSONPathCallback|undefined} callback\n * @returns {ReturnObject[]|undefined}\n */\n _slice (\n loc, expr, val, path, parent, parentPropName, callback\n ) {\n if (!Array.isArray(val)) {\n return undefined;\n }\n const len = val.length, parts = loc.split(':'),\n step = (parts[2] && Number(parts[2])) || 1;\n let start = (parts[0] && Number(parts[0])) || 0,\n end = parts[1] ? Number(parts[1]) : len;\n start = (start < 0) ? Math.max(0, start + len) : Math.min(len, start);\n end = (end < 0) ? Math.max(0, end + len) : Math.min(len, end);\n /** @type {ReturnObject[]} */\n const ret = [];\n for (let i = start; i < end; i += step) {\n const tmp = this._trace(\n unshift(i, expr),\n val,\n path,\n parent,\n parentPropName,\n callback,\n true\n );\n // Should only be possible to be an array here since first part of\n // ``unshift(i, expr)` passed in above would not be empty,\n // nor `~`, nor begin with `@` (as could return objects)\n // This was causing excessive stack size in Node (with or\n // without Babel) against our performance test: `ret.push(...tmp);`\n // eslint-disable-next-line @stylistic/max-len -- Long\n /* c8 ignore next -- Unreachable: _trace returns array when expr non-empty */\n const tmpArray = Array.isArray(tmp) ? tmp : [tmp];\n tmpArray.forEach((t) => {\n ret.push(t);\n });\n }\n return ret;\n }\n\n /**\n * @param {string} code\n * @param {unknown} _v\n * @param {string|number} _vname\n * @param {ExpressionArray} path\n * @param {ParentValue} parent\n * @param {ParentProperty} parentPropName\n * @returns {UnknownResult}\n */\n _eval (\n code, _v, _vname, path, parent, parentPropName\n ) {\n if (this.currSandbox) {\n this.currSandbox._$_parentProperty = parentPropName;\n this.currSandbox._$_parent = parent;\n this.currSandbox._$_property = _vname;\n this.currSandbox._$_root = this.json;\n this.currSandbox._$_v = _v;\n }\n\n const containsPath = code.includes('@path');\n if (containsPath) {\n // eslint-disable-next-line @stylistic/max-len -- Long\n /* c8 ignore next -- Unreachable: currSandbox set in evaluate() before _eval */\n const currSandbox = this.currSandbox ?? {};\n currSandbox._$_path = JSONPath.toPathString(\n /** @type {string[]} */ (path.concat([_vname]))\n );\n }\n\n const scriptCacheKey = this.currEval + 'Script:' + code;\n if (!Object.hasOwn(JSONPath.cache, scriptCacheKey)) {\n let script = code\n .replaceAll('@parentProperty', '_$_parentProperty')\n .replaceAll('@parent', '_$_parent')\n .replaceAll('@property', '_$_property')\n .replaceAll('@root', '_$_root')\n .replaceAll(/@([.\\s)[])/gu, '_$_v$1');\n if (containsPath) {\n script = script.replaceAll('@path', '_$_path');\n }\n const evalType = /** @type {string|boolean|undefined} */ (\n this.currEval\n );\n if (['safe', true, undefined].includes(evalType)) {\n const {cache} = JSONPath;\n // eslint-disable-next-line @stylistic/max-len -- Long\n /* eslint-disable unicorn/no-undeclared-class-members -- Prototype members */\n cache[scriptCacheKey] = new (\n /**\n * @type {JSONPathClass & {\n * safeVm: SafeScriptType,\n * vm: ScriptType\n * }}\n */ (/** @type {unknown} */ (this))\n ).safeVm.Script(script);\n // eslint-disable-next-line @stylistic/max-len -- Long\n /* eslint-enable unicorn/no-undeclared-class-members -- End prototype member scope */\n } else if (this.currEval === 'native') {\n const {cache} = JSONPath;\n // eslint-disable-next-line @stylistic/max-len -- Long\n /* eslint-disable unicorn/no-undeclared-class-members -- Prototype members */\n cache[scriptCacheKey] = new (\n /**\n * @type {JSONPathClass & {\n * safeVm: SafeScriptType,\n * vm: ScriptType\n * }}\n */ (/** @type {unknown} */ (this))\n ).vm.Script(script);\n // eslint-disable-next-line @stylistic/max-len -- Long\n /* eslint-enable unicorn/no-undeclared-class-members -- End prototype member scope */\n } else if (\n typeof this.currEval === 'function' &&\n this.currEval.prototype &&\n Object.hasOwn(this.currEval.prototype, 'runInNewContext')\n ) {\n const CurrEval = this.currEval;\n const {cache} = JSONPath;\n // eslint-disable-next-line @stylistic/max-len -- Long\n // @ts-expect-error - Type checked above to have proper constructor\n cache[scriptCacheKey] = new CurrEval(script);\n } else if (typeof this.currEval === 'function') {\n const {cache} = JSONPath;\n // Type narrowing: at this point currEval is a function\n // but not a constructor\n const evalFunc = /** @type {EvalCallback} */ (this.currEval);\n cache[scriptCacheKey] = {\n runInNewContext: (\n /** @type {ContextItem} */ context\n ) => evalFunc(script, context)\n };\n } else {\n throw new TypeError(\n `Unknown \"eval\" property \"${this.currEval}\"`\n );\n }\n }\n\n try {\n const {cache} = JSONPath;\n\n /**\n * @typedef {{\n * runInNewContext: (\n * ctx: SandboxType|undefined\n * ) => EvaluatedResult\n * }} RunInNewContext\n */\n\n return /** @type {RunInNewContext} */ (\n cache[scriptCacheKey]\n ).runInNewContext(\n this.currSandbox\n );\n } catch (e) {\n if (this.ignoreEvalErrors) {\n return false;\n }\n const error = /** @type {Error} */ (e);\n throw new Error('jsonPath: ' + error.message + ': ' + code, {\n cause: e\n });\n }\n }\n}\n\n/** @type {{safeVm: SafeScriptType}} */\n(/** @type {unknown} */ (JSONPathClass.prototype)).safeVm = {\n Script: SafeScript\n};\n\nJSONPath.prototype = JSONPathClass.prototype;\n\n// PUBLIC CLASS PROPERTIES AND METHODS\n\n// Could store the cache object itself\n\n/** @type {Record} */\nJSONPath.cache = {};\n\n/**\n * @param {string[]} pathArr Array to convert\n * @returns {string} The path string\n */\nJSONPath.toPathString = function (pathArr) {\n const x = pathArr, n = x.length;\n let p = '$';\n for (let i = 1; i < n; i++) {\n if (!(/^(~|\\^|@.*?\\(\\))$/u).test(x[i])) {\n p += (/^[0-9*]+$/u).test(x[i]) ? ('[' + x[i] + ']') : (\"['\" + x[i] + \"']\");\n }\n }\n return p;\n};\n\n/**\n * @param {string[]} pointer JSON Path array\n * @returns {string} JSON Pointer\n */\nJSONPath.toPointer = function (pointer) {\n const x = pointer, n = x.length;\n let p = '';\n for (let i = 1; i < n; i++) {\n if (!(/^(~|\\^|@.*?\\(\\))$/u).test(x[i])) {\n p += '/' + x[i].toString()\n .replaceAll('~', '~0')\n .replaceAll('/', '~1');\n }\n }\n return p;\n};\n\n/**\n * @param {string} expr Expression to convert\n * @returns {string[]}\n */\nJSONPath.toPathArray = function (expr) {\n const {cache} = JSONPath;\n if (Object.hasOwn(cache, expr)) {\n return /** @type {string[]} */ (cache[expr]).concat();\n }\n /** @type {string[]} */\n const subx = [];\n const normalized = expr\n // Properties\n .replaceAll(\n /@(?:null|boolean|number|string|integer|undefined|nonFinite|scalar|array|object|function|other)\\(\\)/gu,\n ';$&;'\n )\n // Parenthetical evaluations (filtering and otherwise), directly\n // within brackets or single quotes\n .replaceAll(/[['](\\??\\(.*?\\))[\\]'](?!.\\])/gu, function ($0, $1) {\n return '[#' +\n // eslint-disable-next-line @stylistic/max-len -- Long\n // eslint-disable-next-line unicorn/no-return-array-push -- Optimization\n (subx.push($1) - 1) +\n ']';\n })\n // Escape periods and tildes within properties\n .replaceAll(/\\[['\"]([^'\\]]*)['\"]\\]/gu, function ($0, prop) {\n return \"['\" + prop\n .replaceAll('.', '%@%')\n .replaceAll('~', '%%@@%%') +\n \"']\";\n })\n // Properties operator\n .replaceAll('~', ';~;')\n // Split by property boundaries\n\n .replaceAll(/['\"]?\\.['\"]?(?![^[]*\\])|\\[['\"]?/gu, ';')\n // Reinsert periods within properties\n .replaceAll('%@%', '.')\n // Reinsert tildes within properties\n .replaceAll('%%@@%%', '~')\n // Parent\n .replaceAll(/(?:;)?(\\^+)(?:;)?/gu, function ($0, ups) {\n return ';' + ups.split('').join(';') + ';';\n })\n // Descendents\n .replaceAll(/;;;|;;/gu, ';..;')\n // Remove trailing\n .replaceAll(/;$|'?\\]|'$/gu, '');\n\n const exprList = normalized.split(';').map(function (exp) {\n const match = exp.match(/#(\\d+)/u);\n return !match || !match[1] ? exp : subx[Number(match[1])];\n });\n cache[expr] = exprList;\n return /** @type {string[]} */ (cache[expr]).concat();\n};\n\nexport {JSONPath, JSONPathClass};\n","import {JSONPath, JSONPathClass} from './jsonpath.js';\n\n/**\n * @typedef {import('./jsonpath.js').AnyInput} AnyInput\n */\n/**\n * @typedef {import('./jsonpath.js').SandboxCallback} SandboxCallback\n */\n/**\n * @typedef {import('./jsonpath.js').SandboxPropertyValue} SandboxPropertyValue\n */\n/**\n * @typedef {import('./jsonpath.js').ExpressionArray} ExpressionArray\n */\n/**\n * @typedef {import('./jsonpath.js').ValueType} ValueType\n */\n/**\n * @typedef {import('./jsonpath.js').ParentValue} ParentValue\n */\n/**\n * @typedef {import('./jsonpath.js').UnknownResult} UnknownResult\n */\n/**\n * @typedef {import('./jsonpath.js').ParentProperty} ParentProperty\n */\n/**\n * @typedef {import('./jsonpath.js').PreferredOutput} PreferredOutput\n */\n/**\n * @typedef {import('./jsonpath.js').ReturnObject} ReturnObject\n */\n/**\n * @typedef {import('./jsonpath.js').JSONPathCallback} JSONPathCallback\n */\n/**\n * @typedef {import('./jsonpath.js').OtherTypeCallback} OtherTypeCallback\n */\n/**\n * @typedef {import('./jsonpath.js').ContextItem} ContextItem\n */\n/**\n * @typedef {import('./jsonpath.js').EvaluatedResult} EvaluatedResult\n */\n/**\n * @typedef {import('./jsonpath.js').EvalCallback} EvalCallback\n */\n/**\n * @typedef {import('./jsonpath.js').EvalClass} EvalClass\n */\n/**\n * @typedef {import('./jsonpath.js').ResultType} ResultType\n */\n/**\n * @typedef {import('./jsonpath.js').EvalValue} EvalValue\n */\n/**\n * @typedef {import('./jsonpath.js').PathType} PathType\n */\n/**\n * @typedef {import('./jsonpath.js').SafeScriptType} SafeScriptType\n */\n/**\n * @typedef {import('./jsonpath.js').ScriptType} ScriptType\n */\n/**\n * @typedef {import('./jsonpath.js').SandboxType} SandboxType\n */\n/**\n * @typedef {import('./jsonpath.js').JSONPathOptions} JSONPathOptions\n */\n\n/**\n * @template T\n * @callback ConditionCallback\n * @param {T} item\n * @returns {boolean}\n */\n\n/**\n * Copy items out of one array into another.\n * @template T\n * @param {T[]} source Array with items to copy\n * @param {T[]} target Array to which to copy\n * @param {ConditionCallback} conditionCb Callback passed the current item;\n * will move item if evaluates to `true`\n * @returns {void}\n */\nconst moveToAnotherArray = function (source, target, conditionCb) {\n const il = source.length;\n for (let i = 0; i < il; i++) {\n const item = source[i];\n if (conditionCb(item)) {\n target.push(source.splice(i--, 1)[0]);\n }\n }\n};\n\n/**\n * In-browser replacement for NodeJS' VM.Script.\n */\nclass Script {\n /**\n * @param {string} expr Expression to evaluate\n */\n constructor (expr) {\n this.code = expr;\n }\n\n /**\n * @param {SandboxType} context Object whose items will be added\n * to evaluation\n * @returns {EvaluatedResult} Result of evaluated code\n */\n runInNewContext (context) {\n let expr = this.code;\n const keys = Object.keys(context);\n const funcs = /** @type {string[]} */ ([]);\n moveToAnotherArray(keys, funcs, (key) => {\n return typeof context[key] === 'function';\n });\n const values = keys.map((vr) => {\n return context[vr];\n });\n\n const funcString = funcs.reduce((s, func) => {\n let fString = context[func].toString();\n if (!(/function/u).test(fString)) {\n fString = 'function ' + fString;\n }\n return 'var ' + func + '=' + fString + ';' + s;\n }, '');\n\n expr = funcString + expr;\n\n // Mitigate https://perfectionkills.com/global-eval-what-are-the-options/#new_function\n if (!(/(['\"])use strict\\1/u).test(expr) && !keys.includes('arguments')) {\n expr = 'var arguments = undefined;' + expr;\n }\n\n // Remove last semi so `return` will be inserted before\n // the previous one instead, allowing for the return\n // of a bare ending expression\n expr = expr.replace(/;\\s*$/u, '');\n\n // Insert `return`\n const lastStatementEnd = expr.lastIndexOf(';');\n const code =\n lastStatementEnd !== -1\n ? expr.slice(0, lastStatementEnd + 1) +\n ' return ' +\n expr.slice(lastStatementEnd + 1)\n : ' return ' + expr;\n\n // eslint-disable-next-line no-new-func -- User's choice\n return new Function(...keys, code)(...values);\n }\n}\n\n/** @type {{vm: ScriptType}} */\n(/** @type {unknown} */ (JSONPathClass.prototype)).vm = {\n Script\n};\n\nexport {JSONPath, JSONPathClass, Script};\n"],"names":["Jsep","version","toString","addUnaryOp","op_name","max_unop_len","Math","max","length","unary_ops","addBinaryOp","precedence","isRightAssociative","max_binop_len","binary_ops","right_associative","add","delete","addIdentifierChar","char","additional_identifier_chars","addLiteral","literal_name","literal_value","literals","removeUnaryOp","getMaxKeyLen","removeAllUnaryOps","removeIdentifierChar","removeBinaryOp","removeAllBinaryOps","removeLiteral","removeAllLiterals","this","expr","charAt","index","code","charCodeAt","constructor","parse","obj","Object","keys","map","k","isDecimalDigit","ch","binaryPrecedence","op_val","isIdentifierStart","String","fromCharCode","has","isIdentifierPart","throwError","message","error","Error","description","runHook","name","node","hooks","env","context","run","searchHook","find","callback","call","gobbleSpaces","SPACE_CODE","TAB_CODE","LF_CODE","CR_CODE","nodes","gobbleExpressions","type","COMPOUND","body","untilICode","ch_i","SEMCOL_CODE","COMMA_CODE","gobbleExpression","push","gobbleBinaryExpression","gobbleBinaryOp","to_check","substr","tc_len","hasOwnProperty","biop","prec","stack","biop_info","left","right","i","cur_biop","gobbleToken","value","right_a","comparePrev","prev","pop","BINARY_EXP","operator","PERIOD_CODE","gobbleNumericLiteral","SQUOTE_CODE","DQUOTE_CODE","gobbleStringLiteral","OBRACK_CODE","gobbleArray","argument","UNARY_EXP","prefix","gobbleIdentifier","LITERAL","raw","this_str","THIS_EXP","OPAREN_CODE","gobbleGroup","gobbleTokenProperty","QUMARK_CODE","optional","MEMBER_EXP","computed","object","property","CBRACK_CODE","CALL_EXP","arguments","gobbleArguments","CPAREN_CODE","callee","chCode","number","parseFloat","str","startIndex","quote","closed","substring","start","IDENTIFIER","slice","termination","args","separator_count","arg","SEQUENCE_EXP","expressions","ARRAY_EXP","elements","first","Array","isArray","forEach","assign","plugins","jsep","registered","register","plugin","init","COLON_CODE","Set","true","false","null","stdClassProps","getOwnPropertyNames","filter","prop","includes","undefined","m","ternary","test","consequent","alternate","newTest","patternIndex","inCharSet","pattern","flags","RegExp","e","assignmentOperators","updateOperators","assignmentPrecedence","updateNodeTypes","updateBinariesToAssignments","values","val","op","some","c","jsepRegex","jsepAssignment","BLOCKED_PROTO_PROPERTIES","SafeEval","evalAst","ast","subs","evalBinaryExpression","evalCompound","evalConditionalExpression","evalIdentifier","evalLiteral","evalMemberExpression","evalUnaryExpression","evalArrayExpression","evalCallExpression","evalAssignmentExpression","SyntaxError","cause","||","a","b","&&","|","^","&","==","!=","===","!==","<",">","<=",">=","<<",">>",">>>","+","-","*","/","%","last","hasOwn","ReferenceError","TypeError","result","Function","bind","typeof","void","el","func","id","arr","item","unshift","JSONPath","opts","otherTypeCallback","JSONPathClass","optObj","currResultType","currEval","currOtherTypeCallback","currSandbox","_hasParentSelector","json","path","resultType","flatten","wrap","sandbox","eval","ignoreEvalErrors","parent","parentProperty","autostart","ret","evaluate","err","currParent","currParentProperty","exprObj","toPathString","exprList","toPathArray","shift","traceResult","_trace","ea","isParentSelector","hasArrExpr","_getPreferredOutput","reduce","rslt","valOrPath","concat","pointer","toPointer","pathArray","_handleCallback","fullRetObj","preferredOutput","parentPropName","literalPriority","retObj","loc","x","addRet","elems","t","valObj","_walk","sliceResult","_slice","indexOf","safeLoc","replace","nested","exec","npath","valObj2","nvalue","filterResults","valObj3","_eval","evalResult","at","exprToUse","addType","valueType","Number","isFinite","locProp","parts","split","part","rett","pathToUse","tmp","tl","tt","splice","f","n","len","step","end","min","_v","_vname","_$_parentProperty","_$_parent","_$_property","_$_root","_$_v","containsPath","_$_path","scriptCacheKey","cache","script","replaceAll","evalType","safeVm","Script","vm","prototype","CurrEval","evalFunc","runInNewContext","keyMap","create","pathArr","p","subx","$0","$1","ups","join","exp","match","funcs","source","target","conditionCb","il","moveToAnotherArray","key","vr","s","fString","lastStatementEnd","lastIndexOf"],"mappings":"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","x_google_ignoreList":[0,1,2]} \ No newline at end of file diff --git a/dist/index-browser-umd.cjs b/dist/index-browser-umd.cjs index 5f66ae76..6944de19 100644 --- a/dist/index-browser-umd.cjs +++ b/dist/index-browser-umd.cjs @@ -1201,8 +1201,29 @@ } }; + /* eslint-disable unicorn/no-top-level-side-effects -- Temporary? */ /* eslint-disable no-bitwise -- Convenient */ + /** + * @import {EvaluatedResult, UnknownResult} from './jsonpath.js'; + */ + + /** + * @typedef {any} AssignmentExpression + */ + + /** + * @typedef {any} Substitution + */ + + /** + * @typedef {any} AnyParameter + */ + + /** + * @typedef {Record} Substitutions + */ + // register plugins jsep.plugins.register(index, plugin); jsep.addUnaryOp('typeof'); @@ -1213,37 +1234,50 @@ const SafeEval = { /** * @param {jsep.Expression} ast - * @param {Record} subs + * @param {Substitutions} subs + * @returns {UnknownResult} */ evalAst(ast, subs) { switch (ast.type) { case 'BinaryExpression': case 'LogicalExpression': - return SafeEval.evalBinaryExpression(ast, subs); + return SafeEval.evalBinaryExpression(/** @type {jsep.BinaryExpression} */ast, subs); case 'Compound': - return SafeEval.evalCompound(ast, subs); + return SafeEval.evalCompound(/** @type {jsep.Compound} */ast, subs); case 'ConditionalExpression': - return SafeEval.evalConditionalExpression(ast, subs); + return SafeEval.evalConditionalExpression(/** @type {jsep.ConditionalExpression} */ast, subs); case 'Identifier': - return SafeEval.evalIdentifier(ast, subs); + return SafeEval.evalIdentifier(/** @type {jsep.Identifier} */ast, subs); case 'Literal': - return SafeEval.evalLiteral(ast, subs); + return SafeEval.evalLiteral(/** @type {jsep.Literal} */ast); case 'MemberExpression': - return SafeEval.evalMemberExpression(ast, subs); + return SafeEval.evalMemberExpression(/** @type {jsep.MemberExpression} */ast, subs); case 'UnaryExpression': - return SafeEval.evalUnaryExpression(ast, subs); + return SafeEval.evalUnaryExpression(/** @type {jsep.UnaryExpression} */ast, subs); case 'ArrayExpression': - return SafeEval.evalArrayExpression(ast, subs); + return SafeEval.evalArrayExpression(/** @type {jsep.ArrayExpression} */ast, subs); case 'CallExpression': - return SafeEval.evalCallExpression(ast, subs); + return SafeEval.evalCallExpression(/** @type {jsep.CallExpression} */ast, subs); case 'AssignmentExpression': - return SafeEval.evalAssignmentExpression(ast, subs); + return SafeEval.evalAssignmentExpression(/** @type {AssignmentExpression} */ast, subs); default: - throw SyntaxError('Unexpected expression', ast); + throw new SyntaxError('Unexpected expression', { + cause: ast + }); } }, + /** + * @param {jsep.BinaryExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalBinaryExpression(ast, subs) { - const result = { + /** + * @typedef {{ + * [key: string]: (a: AnyParameter, b: AnyParameter) => UnknownResult + * }} OperatorTable + */ + const result = /** @type {OperatorTable} */{ '||': (a, b) => a || b(), '&&': (a, b) => a && b(), '|': (a, b) => a | b(), @@ -1270,14 +1304,18 @@ }[ast.operator](SafeEval.evalAst(ast.left, subs), () => SafeEval.evalAst(ast.right, subs)); return result; }, + /** + * @param {jsep.Compound} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalCompound(ast, subs) { let last; for (let i = 0; i < ast.body.length; i++) { - if (ast.body[i].type === 'Identifier' && ['var', 'let', 'const'].includes(ast.body[i].name) && ast.body[i + 1] && ast.body[i + 1].type === 'AssignmentExpression') { + if (ast.body[i].type === 'Identifier' && ['var', 'let', 'const'].includes(/** @type {jsep.Identifier} */ + ast.body[i].name) && Object.hasOwn(ast.body, i + 1) && ast.body[i + 1].type === 'AssignmentExpression') { // var x=2; is detected as // [{Identifier var}, {AssignmentExpression x=2}] - // eslint-disable-next-line @stylistic/max-len -- Long - // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient i += 1; } const expr = ast.body[i]; @@ -1285,71 +1323,120 @@ } return last; }, + /** + * @param {jsep.ConditionalExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalConditionalExpression(ast, subs) { if (SafeEval.evalAst(ast.test, subs)) { return SafeEval.evalAst(ast.consequent, subs); } return SafeEval.evalAst(ast.alternate, subs); }, + /** + * @param {jsep.Identifier} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalIdentifier(ast, subs) { if (Object.hasOwn(subs, ast.name)) { return subs[ast.name]; } - throw ReferenceError(`${ast.name} is not defined`); + throw new ReferenceError(`${ast.name} is not defined`); }, + /** + * @param {jsep.Literal} ast + * @returns {UnknownResult} + */ evalLiteral(ast) { return ast.value; }, + /** + * @param {jsep.MemberExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalMemberExpression(ast, subs) { const prop = String( // NOTE: `String(value)` throws error when // value has overwritten the toString method to return non-string // i.e. `value = {toString: () => []}` - ast.computed ? SafeEval.evalAst(ast.property) // `object[property]` + ast.computed ? SafeEval.evalAst(ast.property, subs) // `object[property]` : ast.property.name // `object.property` property is Identifier ); const obj = SafeEval.evalAst(ast.object, subs); if (obj === undefined || obj === null) { - throw TypeError(`Cannot read properties of ${obj} (reading '${prop}')`); + throw new TypeError(`Cannot read properties of ${obj} (reading '${prop}')`); } if (!Object.hasOwn(obj, prop) && BLOCKED_PROTO_PROPERTIES.has(prop)) { - throw TypeError(`Cannot read properties of ${obj} (reading '${prop}')`); + throw new TypeError(`Cannot read properties of ${obj} (reading '${prop}')`); } - const result = obj[prop]; + const result = /** @type {Record} */obj[prop]; if (typeof result === 'function' && result !== Function) { return result.bind(obj); // arrow functions aren't affected by bind. } return result; }, + /** + * @param {jsep.UnaryExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalUnaryExpression(ast, subs) { - const result = { - '-': a => -SafeEval.evalAst(a, subs), + /** + * @typedef {{ + * [key: string]: (a: AnyParameter) => UnknownResult + * }} UnaryOperatorTable + */ + const result = /** @type {UnaryOperatorTable} */{ + '-': a => -(/** @type {EvaluatedResult} */ + SafeEval.evalAst(a, subs)), '!': a => !SafeEval.evalAst(a, subs), - '~': a => ~SafeEval.evalAst(a, subs), + '~': a => ~(/** @type {EvaluatedResult} */ + SafeEval.evalAst(a, subs)), // eslint-disable-next-line no-implicit-coercion -- API - '+': a => +SafeEval.evalAst(a, subs), + '+': a => +(/** @type {EvaluatedResult} */ + SafeEval.evalAst(a, subs)), typeof: a => typeof SafeEval.evalAst(a, subs), - // eslint-disable-next-line no-void, sonarjs/void-use -- feature + // eslint-disable-next-line no-void -- Ok void: a => void SafeEval.evalAst(a, subs) }[ast.operator](ast.argument); return result; }, + /** + * @param {jsep.ArrayExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalArrayExpression(ast, subs) { - return ast.elements.map(el => SafeEval.evalAst(el, subs)); + return ast.elements.map(el => SafeEval.evalAst(/** @type {jsep.Expression} */ + el, subs)); }, + /** + * @param {jsep.CallExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalCallExpression(ast, subs) { const args = ast.arguments.map(arg => SafeEval.evalAst(arg, subs)); const func = SafeEval.evalAst(ast.callee, subs); if (func === Function) { throw new Error('Function constructor is disabled'); } - return func(...args); + return (/** @type {(...args: AnyParameter[]) => UnknownResult} */ + func)(...args); }, + /** + * @param {AssignmentExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalAssignmentExpression(ast, subs) { if (ast.left.type !== 'Identifier') { - throw SyntaxError('Invalid left-hand side in assignment'); + throw new SyntaxError('Invalid left-hand side in assignment'); } - const id = ast.left.name; + const id = /** @type {jsep.Identifier} */ast.left.name; const value = SafeEval.evalAst(ast.right, subs); subs[id] = value; return subs[id]; @@ -1365,7 +1452,7 @@ */ constructor(expr) { this.code = expr; - this.ast = jsep(this.code); + this.ast = /** @type {unknown} */jsep(this.code); } /** @@ -1376,30 +1463,63 @@ runInNewContext(context) { // `Object.create(null)` creates a prototypeless object const keyMap = Object.assign(Object.create(null), context); - return SafeEval.evalAst(this.ast, keyMap); + return SafeEval.evalAst(/** @type {jsep.Expression} */this.ast, keyMap); } } /* eslint-disable camelcase -- Convenient for escaping */ + /* eslint-disable class-methods-use-this -- Consistent monkey-patching */ + /* eslint-disable unicorn/prefer-private-class-fields -- Allow + monkey-patching */ + /** + * @import {Script} from './jsonpath-browser.js'; + */ /** - * @typedef {null|boolean|number|string|object|GenericArray} JSONObject + * @typedef {any} AnyInput */ /** - * @typedef {any} AnyItem + * @typedef {((...args: any[]) => any)} SandboxCallback */ /** - * @typedef {any} AnyResult + * @typedef {any|SandboxCallback} SandboxPropertyValue + */ + + /** + * @typedef {(string|number)[]} ExpressionArray + */ + + /** + * @typedef {"scalar"|"boolean"|"string"|"undefined" + * |"function"|"integer"|"number"|"nonFinite"|"object" + * |"array"|"other"|"null"} ValueType + */ + + /** + * @typedef {unknown} ParentValue + */ + + /** + * @typedef {unknown} UnknownResult + */ + + /** + * @typedef {string|number|null} ParentProperty + */ + + /** + * @typedef {ReturnObject|string|number|boolean|null|unknown[] + * |Record} PreferredOutput */ /** * Copies array and then pushes item into it. - * @param {GenericArray} arr Array to copy and into which to push - * @param {AnyItem} item Array item to add (to end) - * @returns {GenericArray} Copy of the original array + * @param {ExpressionArray} arr Array to copy and into which to push + * @param {string|number} item Array item to add (to end) + * @returns {ExpressionArray} Copy of the original array */ function push(arr, item) { arr = arr.slice(); @@ -1408,9 +1528,9 @@ } /** * Copies array and then unshifts item into it. - * @param {AnyItem} item Array item to add (to beginning) - * @param {GenericArray} arr Array to copy and into which to unshift - * @returns {GenericArray} Copy of the original array + * @param {string|number} item Array item to add (to beginning) + * @param {ExpressionArray} arr Array to copy and into which to unshift + * @returns {ExpressionArray} Copy of the original array */ function unshift(item, arr) { arr = arr.slice(); @@ -1419,45 +1539,34 @@ } /** - * Caught when JSONPath is used without `new` but rethrown if with `new` - * @extends Error + * @typedef {object} ReturnObject + * @property {ExpressionArray|string} path + * @property {unknown} value + * @property {ParentValue} parent + * @property {ParentProperty} parentProperty + * @property {boolean} [isParentSelector] + * @property {boolean} [hasArrExpr] + * @property {ExpressionArray} [expr] + * @property {string} [pointer] */ - class NewError extends Error { - /** - * @param {AnyResult} value The evaluated scalar value - */ - constructor(value) { - super('JSONPath should not be called with "new" (it prevents return ' + 'of (unwrapped) scalar values)'); - this.avoidNew = true; - this.value = value; - this.name = 'NewError'; - } - } /** - * @typedef {object} ReturnObject - * @property {string} path - * @property {JSONObject} value - * @property {object|GenericArray} parent - * @property {string} parentProperty - */ - - /** - * @callback JSONPathCallback - * @param {string|object} preferredOutput - * @param {"value"|"property"} type - * @param {ReturnObject} fullRetObj - * @returns {void} - */ + * @callback JSONPathCallback + * @param {any} preferredOutput Using `any` type instead of `PreferredOutput` so + * that user can supply flexible type + * @param {"value"|"property"} type + * @param {ReturnObject} fullRetObj + * @returns {void} + */ /** - * @callback OtherTypeCallback - * @param {JSONObject} val - * @param {string} path - * @param {object|GenericArray} parent - * @param {string} parentPropName - * @returns {boolean} - */ + * @callback OtherTypeCallback + * @param {unknown} val + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {string|null} parentPropName + * @returns {boolean|null} + */ /** * @typedef {any} ContextItem @@ -1468,523 +1577,841 @@ */ /** - * @callback EvalCallback - * @param {string} code - * @param {ContextItem} context - * @returns {EvaluatedResult} - */ + * @callback EvalCallback + * @param {string} code + * @param {ContextItem} context + * @returns {EvaluatedResult} + */ + + /** + * @typedef {new (expr: string) => { + * runInNewContext: (context: object) => EvaluatedResult + * }} ScriptConstructor + */ + + /** + * @typedef {ScriptConstructor} EvalClass + */ + + /** + * @typedef {"value"|"path"|"pointer"|"parent"|"parentProperty" + * |"all"} ResultType + */ + + /** + * @typedef {EvalCallback|EvalClass|'safe'|'native'|boolean} EvalValue + */ + + /** + * @typedef {string|string[]} PathType + */ + + /** + * @typedef {{Script: ScriptConstructor}} SafeScriptType + */ + + /** + * @typedef {{Script: ScriptConstructor}} ScriptType + */ /** - * @typedef {typeof SafeScript} EvalClass + * @typedef {{ + * _$_path?: string, + * _$_parentProperty?: ParentProperty, + * _$_parent?: ParentValue, + * _$_property?: string|number, + * _$_root?: AnyInput, + * _$_v?: unknown, + * [key: string]: SandboxPropertyValue + * }} SandboxType */ /** * @typedef {object} JSONPathOptions - * @property {JSON} json - * @property {string|string[]} path - * @property {"value"|"path"|"pointer"|"parent"|"parentProperty"| - * "all"} [resultType="value"] + * @property {AnyInput} [json] + * @property {PathType} [path] + * @property {ResultType} [resultType="value"] * @property {boolean} [flatten=false] * @property {boolean} [wrap=true] - * @property {object} [sandbox={}] - * @property {EvalCallback|EvalClass|'safe'|'native'| - * boolean} [eval = 'safe'] - * @property {object|GenericArray|null} [parent=null] - * @property {string|null} [parentProperty=null] + * @property {SandboxType} [sandbox={}] + * @property {EvalValue} [eval='safe'] + * @property {any|null} [parent=null] + * @property {ParentProperty} [parentProperty=null] * @property {JSONPathCallback} [callback] * @property {OtherTypeCallback} [otherTypeCallback] Defaults to * function which throws on encountering `@other` * @property {boolean} [autostart=true] + * @property {boolean} [ignoreEvalErrors=false] */ /** - * @param {string|JSONPathOptions} opts If a string, will be treated as `expr` - * @param {string} [expr] JSON path to evaluate - * @param {JSON} [obj] JSON object to evaluate against - * @param {JSONPathCallback} [callback] Passed 3 arguments: 1) desired payload - * per `resultType`, 2) `"value"|"property"`, 3) Full returned object with + * @overload + * @param {string} opts JSON path to evaluate + * @param {AnyInput} [expr] JSON object to evaluate against + * @param {JSONPathCallback} [obj] Passed 3 arguments: 1) desired + * payload per `resultType`, 2) `"value"|"property"`, 3) Full returned + * object with all payloads + * @param {OtherTypeCallback} [callback] If `@other()` is at the + * end of one's query, this will be invoked with the value of the item, + * its path, its parent, and its parent's property name, and it should + * return a boolean indicating whether the supplied value belongs to the + * "other" type or not (or it may handle transformations and return + * `false`). + * @param {undefined} [otherTypeCallback] + * @returns {unknown} The string form always has `autostart` implicitly + * `true`, so the result is the evaluated value, not a `JSONPathClass` + */ + /** + * @overload + * @param {JSONPathOptions & {autostart: false}} opts An options object + * with `autostart` explicitly set to `false` defers evaluation and + * returns the `JSONPathClass` instance instead + * @returns {JSONPathClass} + */ + /** + * @overload + * @param {JSONPathOptions} opts If a string, will be treated as + * `expr` + * @returns {unknown} + */ + /** + * @param {JSONPathOptions|string} opts If a string, will be treated as `expr` + * @param {string|AnyInput} [expr] JSON path to evaluate + * @param {AnyInput|JSONPathCallback} [obj] JSON object to evaluate against + * @param {JSONPathCallback|OtherTypeCallback} [callback] Passed 3 + * arguments: 1) desired payload per `resultType`, + * 2) `"value"|"property"`, 3) Full returned object with * all payloads * @param {OtherTypeCallback} [otherTypeCallback] If `@other()` is at the end * of one's query, this will be invoked with the value of the item, its * path, its parent, and its parent's property name, and it should return * a boolean indicating whether the supplied value belongs to the "other" * type or not (or it may handle transformations and return `false`). - * @returns {JSONPath} - * @class + * @throws {Error} + * @returns {unknown|JSONPathClass} */ function JSONPath(opts, expr, obj, callback, otherTypeCallback) { - // eslint-disable-next-line no-restricted-syntax -- Allow for pseudo-class - if (!(this instanceof JSONPath)) { - try { - return new JSONPath(opts, expr, obj, callback, otherTypeCallback); - } catch (e) { - if (!e.avoidNew) { - throw e; - } - return e.value; - } - } - if (typeof opts === 'string') { - otherTypeCallback = callback; - callback = obj; - obj = expr; - expr = opts; - opts = null; - } - const optObj = opts && typeof opts === 'object'; - opts = opts || {}; - this.json = opts.json || obj; - this.path = opts.path || expr; - this.resultType = opts.resultType || 'value'; - this.flatten = opts.flatten || false; - this.wrap = Object.hasOwn(opts, 'wrap') ? opts.wrap : true; - this.sandbox = opts.sandbox || {}; - this.eval = opts.eval === undefined ? 'safe' : opts.eval; - this.ignoreEvalErrors = typeof opts.ignoreEvalErrors === 'undefined' ? false : opts.ignoreEvalErrors; - this.parent = opts.parent || null; - this.parentProperty = opts.parentProperty || null; - this.callback = opts.callback || callback || null; - this.otherTypeCallback = opts.otherTypeCallback || otherTypeCallback || function () { - throw new TypeError('You must supply an otherTypeCallback callback option ' + 'with the @other() operator.'); - }; - if (opts.autostart !== false) { - const args = { - path: optObj ? opts.path : expr - }; - if (!optObj) { - args.json = obj; - } else if ('json' in opts) { - args.json = opts.json; + try { + if (opts && typeof opts === 'object') { + return new JSONPathClass(opts); } - const ret = this.evaluate(args); - if (!ret || typeof ret !== 'object') { - throw new NewError(ret); + return new JSONPathClass(opts, expr, /** @type {JSONPathCallback|undefined} */obj, /** @type {OtherTypeCallback|undefined} */callback, /** @type {undefined} */otherTypeCallback); + } catch (e) { + if (new.target) { + throw e; } - return ret; + if (e && typeof e === 'object' && 'value' in e) { + return /** @type {{value: UnknownResult}} */e.value; + } + throw e; } } - // PUBLIC METHODS - JSONPath.prototype.evaluate = function (expr, json, callback, otherTypeCallback) { - let currParent = this.parent, - currParentProperty = this.parentProperty; - let { - flatten, - wrap - } = this; - this.currResultType = this.resultType; - this.currEval = this.eval; - this.currSandbox = this.sandbox; - callback = callback || this.callback; - this.currOtherTypeCallback = otherTypeCallback || this.otherTypeCallback; - json = json || this.json; - expr = expr || this.path; - if (expr && typeof expr === 'object' && !Array.isArray(expr)) { - if (!expr.path && expr.path !== '') { - throw new TypeError('You must supply a "path" property when providing an object ' + 'argument to JSONPath.evaluate().'); - } - if (!Object.hasOwn(expr, 'json')) { - throw new TypeError('You must supply a "json" property when providing an object ' + 'argument to JSONPath.evaluate().'); - } - ({ - json - } = expr); - flatten = Object.hasOwn(expr, 'flatten') ? expr.flatten : flatten; - this.currResultType = Object.hasOwn(expr, 'resultType') ? expr.resultType : this.currResultType; - this.currSandbox = Object.hasOwn(expr, 'sandbox') ? expr.sandbox : this.currSandbox; - wrap = Object.hasOwn(expr, 'wrap') ? expr.wrap : wrap; - this.currEval = Object.hasOwn(expr, 'eval') ? expr.eval : this.currEval; - callback = Object.hasOwn(expr, 'callback') ? expr.callback : callback; - this.currOtherTypeCallback = Object.hasOwn(expr, 'otherTypeCallback') ? expr.otherTypeCallback : this.currOtherTypeCallback; - currParent = Object.hasOwn(expr, 'parent') ? expr.parent : currParent; - currParentProperty = Object.hasOwn(expr, 'parentProperty') ? expr.parentProperty : currParentProperty; - expr = expr.path; - } - currParent = currParent || null; - currParentProperty = currParentProperty || null; - if (Array.isArray(expr)) { - expr = JSONPath.toPathString(expr); - } - if (!expr && expr !== '' || !json) { - return undefined; - } - const exprList = JSONPath.toPathArray(expr); - if (exprList[0] === '$' && exprList.length > 1) { - exprList.shift(); - } - this._hasParentSelector = null; - const result = this._trace(exprList, json, ['$'], currParent, currParentProperty, callback).filter(function (ea) { - return ea && !ea.isParentSelector; - }); - if (!result.length) { - return wrap ? [] : undefined; - } - if (!wrap && result.length === 1 && !result[0].hasArrExpr) { - return this._getPreferredOutput(result[0]); + /** + * + */ + class JSONPathClass { + /** + * @overload + * @param {string} opts JSON path to evaluate + * @param {AnyInput} [expr] JSON object to evaluate against + * @param {JSONPathCallback} [obj] Passed 3 arguments: 1) desired + * payload per `resultType`, 2) `"value"|"property"`, 3) Full returned + * object with all payloads + * @param {OtherTypeCallback} [callback] If `@other()` is at the + * end of one's query, this will be invoked with the value of the item, + * its path, its parent, and its parent's property name, and it should + * return a boolean indicating whether the supplied value belongs to the + * "other" type or not (or it may handle transformations and return + * `false`). + * @param {undefined} [otherTypeCallback] + */ + /** + * @overload + * @param {JSONPathOptions} opts If a string, will be treated as + * `expr` + */ + /** + * @param {null|string|JSONPathOptions} opts If a string, will be treated as + * `expr` + * @param {string|AnyInput} [expr] JSON path to evaluate + * @param {AnyInput|JSONPathCallback} [obj] JSON object to evaluate against + * @param {JSONPathCallback|OtherTypeCallback} [callback] Passed 3 + * arguments: 1) desired payload per `resultType`, + * 2) `"value"|"property"`, 3) Full returned + * object with all payloads + * @param {OtherTypeCallback} [otherTypeCallback] If `@other()` is at the + * end of one's query, this will be invoked with the value of the item, + * its path, its parent, and its parent's property name, and it should + * return a boolean indicating whether the supplied value belongs to the + * "other" type or not (or it may handle transformations and return + * `false`). + */ + constructor(opts, expr, obj, callback, otherTypeCallback) { + if (typeof opts === 'string') { + otherTypeCallback = /** @type {OtherTypeCallback} */ + callback; + callback = /** @type {JSONPathCallback} */ + obj; + obj = expr; + expr = opts; + opts = null; + } + const optObj = opts && typeof opts === 'object'; + opts ||= /** @type {JSONPathOptions} */{}; + /** @type {ResultType|undefined} */ + this.currResultType = undefined; + + /** @type {EvalValue|undefined} */ + this.currEval = undefined; + + /** @type {OtherTypeCallback|undefined} */ + this.currOtherTypeCallback = undefined; + + /** @type {SandboxType|undefined} */ + this.currSandbox = undefined; + this._hasParentSelector = false; + this.json = opts.json || obj; + this.path = opts.path || expr; + this.resultType = opts.resultType || 'value'; + this.flatten = Object.hasOwn(opts, 'flatten') ? opts.flatten : false; + this.wrap = Object.hasOwn(opts, 'wrap') ? opts.wrap : true; + this.sandbox = opts.sandbox || {}; + this.eval = opts.eval === undefined ? 'safe' : opts.eval; + this.ignoreEvalErrors = typeof opts.ignoreEvalErrors === 'undefined' ? false : opts.ignoreEvalErrors; + this.parent = Object.hasOwn(opts, 'parent') ? opts.parent : null; + this.parentProperty = Object.hasOwn(opts, 'parentProperty') ? opts.parentProperty : null; + this.callback = opts.callback || (/** @type {JSONPathCallback} */ + callback) || null; + this.otherTypeCallback = opts.otherTypeCallback || otherTypeCallback || function () { + throw new TypeError('You must supply an otherTypeCallback callback option ' + 'with the @other() operator.'); + }; + if (opts.autostart !== false) { + const args = /** @type {JSONPathOptions} */{ + path: optObj ? opts.path : expr + }; + if (!optObj && obj !== undefined) { + args.json = obj; + } else if ('json' in opts) { + args.json = opts.json; + } + const ret = this.evaluate(args); + if (!ret || typeof ret !== 'object') { + const err = /** @type {Error & {value: UnknownResult}} */ + new Error('JSONPath should not be called with "new" (it ' + 'prevents return of (unwrapped) scalar values)'); + err.value = ret; + throw err; + } + + // eslint-disable-next-line @stylistic/max-len -- Long + // @ts-expect-error - Constructor returns evaluate result for legacy API + // eslint-disable-next-line no-constructor-return -- Legacy API + return ret; + } } - return result.reduce((rslt, ea) => { - const valOrPath = this._getPreferredOutput(ea); - if (flatten && Array.isArray(valOrPath)) { - rslt = rslt.concat(valOrPath); + + // PUBLIC METHODS + + /** + * @overload + * @param {JSONPathOptions} [expr] + * @returns {ReturnObject|ReturnObject[]|undefined|unknown} + */ + + /** + * @overload + * @param {PathType|undefined} [expr] + * @param {AnyInput} [json] + * @param {JSONPathCallback|null} [callback] + * @param {OtherTypeCallback} [otherTypeCallback] + * @returns {ReturnObject|ReturnObject[]|undefined|unknown} + */ + + /** + * @param {PathType|JSONPathOptions|undefined} [expr] + * @param {AnyInput} [json] + * @param {JSONPathCallback|null} [callback] + * @param {OtherTypeCallback} [otherTypeCallback] + * @returns {ReturnObject|ReturnObject[]|undefined|unknown} + */ + evaluate(expr, json, callback, otherTypeCallback) { + let currParent = this.parent, + currParentProperty = this.parentProperty; + let { + flatten, + wrap + } = this; + this.currResultType = this.resultType; + this.currEval = this.eval; + this.currSandbox = this.sandbox; + callback ||= this.callback; + this.currOtherTypeCallback = otherTypeCallback || this.otherTypeCallback; + if (expr && typeof expr === 'object' && !Array.isArray(expr)) { + const exprObj = expr; + if (!exprObj.path && exprObj.path !== '') { + throw new TypeError('You must supply a "path" property when providing an ' + 'object argument to JSONPath.evaluate().'); + } + if (!Object.hasOwn(exprObj, 'json')) { + throw new TypeError('You must supply a "json" property when providing an ' + 'object argument to JSONPath.evaluate().'); + } + ({ + json + } = exprObj); + flatten = Object.hasOwn(exprObj, 'flatten') ? exprObj.flatten : flatten; + this.currResultType = Object.hasOwn(exprObj, 'resultType') ? exprObj.resultType : this.currResultType; + this.currSandbox = Object.hasOwn(exprObj, 'sandbox') ? exprObj.sandbox : this.currSandbox; + wrap = Object.hasOwn(exprObj, 'wrap') ? exprObj.wrap : wrap; + this.currEval = Object.hasOwn(exprObj, 'eval') ? exprObj.eval : this.currEval; + callback = Object.hasOwn(exprObj, 'callback') ? exprObj.callback : callback; + this.currOtherTypeCallback = Object.hasOwn(exprObj, 'otherTypeCallback') ? exprObj.otherTypeCallback : this.currOtherTypeCallback; + currParent = Object.hasOwn(exprObj, 'parent') ? exprObj.parent : currParent; + currParentProperty = Object.hasOwn(exprObj, 'parentProperty') ? exprObj.parentProperty : currParentProperty; + expr = exprObj.path; } else { - rslt.push(valOrPath); + json ||= this.json; + expr ||= this.path; } - return rslt; - }, []); - }; + currParent ||= null; + currParentProperty ||= null; + if (Array.isArray(expr)) { + expr = JSONPath.toPathString(expr); + } + if (!json || !expr && expr !== '') { + return undefined; + } + const exprList = JSONPath.toPathArray(/** @type {string} */ + expr); + if (exprList[0] === '$' && exprList.length > 1) { + exprList.shift(); + } + this._hasParentSelector = false; + const traceResult = this._trace(exprList, json, ['$'], currParent, currParentProperty, callback ?? undefined, undefined); - // PRIVATE METHODS - - JSONPath.prototype._getPreferredOutput = function (ea) { - const resultType = this.currResultType; - switch (resultType) { - case 'all': - { - const path = Array.isArray(ea.path) ? ea.path : JSONPath.toPathArray(ea.path); - ea.pointer = JSONPath.toPointer(path); - ea.path = typeof ea.path === 'string' ? ea.path : JSONPath.toPathString(ea.path); - return ea; + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next 2 -- Unreachable: _trace returns array when hasArrExpr set */ + const result = (Array.isArray(traceResult) ? traceResult : [traceResult]).filter(ea => { + return ea && !ea.isParentSelector; + }); + if (!result.length) { + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next -- Unreachable: valid queries always produce results */ + return wrap ? [] : undefined; + } + if (!wrap && result.length === 1 && !result[0].hasArrExpr) { + const preferredOutput = this._getPreferredOutput(result[0]); + return preferredOutput; + } + const reduced = result.reduce((rslt, ea) => { + const valOrPath = this._getPreferredOutput(ea); + if (flatten && Array.isArray(valOrPath)) { + rslt = rslt.concat(valOrPath); + } else { + rslt.push(valOrPath); } - case 'value': - case 'parent': - case 'parentProperty': - return ea[resultType]; - case 'path': - return JSONPath.toPathString(ea[resultType]); - case 'pointer': - return JSONPath.toPointer(ea.path); - default: - throw new TypeError('Unknown result type'); + return rslt; + }, /** @type {UnknownResult[]} */ + []); + return reduced; } - }; - JSONPath.prototype._handleCallback = function (fullRetObj, callback, type) { - if (callback) { - const preferredOutput = this._getPreferredOutput(fullRetObj); - fullRetObj.path = typeof fullRetObj.path === 'string' ? fullRetObj.path : JSONPath.toPathString(fullRetObj.path); - // eslint-disable-next-line n/callback-return -- No need to return - callback(preferredOutput, type, fullRetObj); - } - }; - /** - * - * @param {string} expr - * @param {JSONObject} val - * @param {string} path - * @param {object|GenericArray} parent - * @param {string} parentPropName - * @param {JSONPathCallback} callback - * @param {boolean} hasArrExpr - * @param {boolean} literalPriority - * @returns {ReturnObject|ReturnObject[]} - */ - JSONPath.prototype._trace = function (expr, val, path, parent, parentPropName, callback, hasArrExpr, literalPriority) { - // No expr to follow? return path and value as the result of - // this trace branch - let retObj; - if (!expr.length) { - retObj = { - path, - value: val, - parent, - parentProperty: parentPropName, - hasArrExpr - }; - this._handleCallback(retObj, callback, 'value'); - return retObj; + // PRIVATE METHODS + + /** + * @param {ReturnObject} ea + * @returns {PreferredOutput} + */ + _getPreferredOutput(ea) { + const resultType = this.currResultType; + switch (resultType) { + case 'all': + { + const path = Array.isArray(ea.path) ? ea.path : JSONPath.toPathArray(ea.path); + ea.pointer = JSONPath.toPointer(/** @type {string[]} */path); + ea.path = typeof ea.path === 'string' ? ea.path : JSONPath.toPathString(/** @type {string[]} */ea.path); + return ea; + } + case 'value': + case 'parent': + case 'parentProperty': + return /** @type {PreferredOutput} */ea[resultType]; + case 'path': + if (typeof ea.path === 'string') { + return ea.path; + } + return JSONPath.toPathString(/** @type {string[]} */ea.path); + case 'pointer': + { + const pathArray = Array.isArray(ea.path) ? ea.path : JSONPath.toPathArray(ea.path); + return JSONPath.toPointer(/** @type {string[]} */pathArray); + } + default: + throw new TypeError('Unknown result type'); + } } - const loc = expr[0], - x = expr.slice(1); - // We need to gather the return value of recursive trace calls in order to - // do the parent sel computation. - const ret = []; /** - * - * @param {ReturnObject|ReturnObject[]} elems + * @param {ReturnObject} fullRetObj + * @param {JSONPathCallback|undefined} callback + * @param {"value"|"property"} type * @returns {void} */ - function addRet(elems) { - if (Array.isArray(elems)) { - // This was causing excessive stack size in Node (with or - // without Babel) against our performance test: - // `ret.push(...elems);` - elems.forEach(t => { - ret.push(t); - }); - } else { - ret.push(elems); + _handleCallback(fullRetObj, callback, type) { + // Early return if no callback provided (defensive + // check for internal calls) + if (!callback) { + return; } + const preferredOutput = this._getPreferredOutput(fullRetObj); + if (Array.isArray(fullRetObj.path)) { + fullRetObj.path = JSONPath.toPathString(/** @type {string[]} */fullRetObj.path); + } + callback(preferredOutput, type, fullRetObj); } - if ((typeof loc !== 'string' || literalPriority) && val && Object.hasOwn(val, loc)) { - // simple case--directly follow property - addRet(this._trace(x, val[loc], push(path, loc), val, loc, callback, hasArrExpr)); - // eslint-disable-next-line unicorn/prefer-switch -- Part of larger `if` - } else if (loc === '*') { - // all child properties - this._walk(val, m => { - addRet(this._trace(x, val[m], push(path, m), val, m, callback, true, true)); - }); - } else if (loc === '..') { - // all descendent parent properties - // Check remaining expression with val's immediate children - addRet(this._trace(x, val, path, parent, parentPropName, callback, hasArrExpr)); - this._walk(val, m => { - // We don't join m and x here because we only want parents, - // not scalar values - if (typeof val[m] === 'object') { - // Keep going with recursive descent on val's - // object children - addRet(this._trace(expr.slice(), val[m], push(path, m), val, m, callback, true)); + + /** + * + * @param {ExpressionArray} expr + * @param {unknown} val + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {ParentProperty} parentPropName + * @param {JSONPathCallback|undefined} callback + * @param {boolean|undefined} hasArrExpr + * @param {boolean} [literalPriority] + * @returns {ReturnObject|ReturnObject[]} + */ + _trace(expr, val, path, parent, parentPropName, callback, hasArrExpr, literalPriority) { + // No expr to follow? return path and value as the result of + // this trace branch + let retObj; + if (!expr.length) { + retObj = { + path, + value: val, + parent, + parentProperty: parentPropName, + hasArrExpr + }; + this._handleCallback(retObj, callback, 'value'); + return retObj; + } + const loc = /** @type {string} */expr[0], + x = expr.slice(1); + + // We need to gather the return value of recursive trace calls in order + // to do the parent sel computation. + /** @type {ReturnObject[]} */ + const ret = []; + /** + * + * @param {ReturnObject|ReturnObject[]} elems + * @returns {void} + */ + function addRet(elems) { + if (Array.isArray(elems)) { + // This was causing excessive stack size in Node (with or + // without Babel) against our performance test: + // `ret.push(...elems);` + elems.forEach(t => { + ret.push(t); + }); + } else { + ret.push(elems); } - }); - // The parent sel computation is handled in the frame above using the - // ancestor object of val - } else if (loc === '^') { - // This is not a final endpoint, so we do not invoke the callback here - this._hasParentSelector = true; - return { - path: path.slice(0, -1), - expr: x, - isParentSelector: true - }; - } else if (loc === '~') { - // property name - retObj = { - path: push(path, loc), - value: parentPropName, - parent, - parentProperty: null - }; - this._handleCallback(retObj, callback, 'property'); - return retObj; - } else if (loc === '$') { - // root only - addRet(this._trace(x, val, path, null, null, callback, hasArrExpr)); - } else if (/^(-?\d*):(-?\d*):?(\d*)$/u.test(loc)) { - // [start:end:step] Python slice syntax - addRet(this._slice(loc, x, val, path, parent, parentPropName, callback)); - } else if (loc.indexOf('?(') === 0) { - // [?(expr)] (filtering) - if (this.currEval === false) { - throw new Error('Eval [?(expr)] prevented in JSONPath expression.'); - } - const safeLoc = loc.replace(/^\?\((.*?)\)$/u, '$1'); - // check for a nested filter expression - const nested = /@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu.exec(safeLoc); - if (nested) { - // find if there are matches in the nested expression - // add them to the result set if there is at least one match + } + if (val && (typeof loc !== 'string' || literalPriority) && Object.hasOwn(val, /** @type {PropertyKey} */loc)) { + // simple case--directly follow property + const valObj = /** @type {Record} */val; + addRet(this._trace(x, valObj[(/** @type {string} */loc)], push(path, loc), val, /** @type {string|number} */loc, callback, hasArrExpr)); + // eslint-disable-next-line unicorn/prefer-switch -- Part of larger `if` + } else if (loc === '*') { + // all child properties this._walk(val, m => { - const npath = [nested[2]]; - const nvalue = nested[1] ? val[m][nested[1]] : val[m]; - const filterResults = this._trace(npath, nvalue, path, parent, parentPropName, callback, true); - if (filterResults.length > 0) { - addRet(this._trace(x, val[m], push(path, m), val, m, callback, true)); - } + const valObj = /** @type {Record} */val; + addRet(this._trace(x, valObj[m], push(path, m), val, m, callback, true, true)); }); - } else { + } else if (loc === '..') { + // all descendent parent properties + // Check remaining expression with val's immediate children + addRet(this._trace(x, val, path, parent, parentPropName, callback, hasArrExpr)); this._walk(val, m => { - if (this._eval(safeLoc, val[m], m, path, parent, parentPropName)) { - addRet(this._trace(x, val[m], push(path, m), val, m, callback, true)); + // We don't join m and x here because we only want parents, + // not scalar values + const valObj = /** @type {Record} */val; + if (typeof valObj[m] === 'object') { + // Keep going with recursive descent on val's + // object children + addRet(this._trace(expr.slice(), valObj[m], push(path, m), val, m, callback, true)); } }); - } - } else if (loc[0] === '(') { - // [(expr)] (dynamic property/index) - if (this.currEval === false) { - throw new Error('Eval [(expr)] prevented in JSONPath expression.'); - } - // As this will resolve to a property name (but we don't know it - // yet), property and parent information is relative to the - // parent of the property to which this expression will resolve - addRet(this._trace(unshift(this._eval(loc, val, path.at(-1), path.slice(0, -1), parent, parentPropName), x), val, path, parent, parentPropName, callback, hasArrExpr)); - } else if (loc[0] === '@') { - // value type: @boolean(), etc. - let addType = false; - const valueType = loc.slice(1, -2); - switch (valueType) { - case 'scalar': - if (!val || !['object', 'function'].includes(typeof val)) { - addType = true; - } - break; - case 'boolean': - case 'string': - case 'undefined': - case 'function': - if (typeof val === valueType) { - addType = true; - } - break; - case 'integer': - if (Number.isFinite(val) && !(val % 1)) { - addType = true; - } - break; - case 'number': - if (Number.isFinite(val)) { - addType = true; - } - break; - case 'nonFinite': - if (typeof val === 'number' && !Number.isFinite(val)) { - addType = true; - } - break; - case 'object': - if (val && typeof val === valueType) { - addType = true; - } - break; - case 'array': - if (Array.isArray(val)) { - addType = true; - } - break; - case 'other': - addType = this.currOtherTypeCallback(val, path, parent, parentPropName); - break; - case 'null': - if (val === null) { - addType = true; - } - break; - /* c8 ignore next 2 */ - default: - throw new TypeError('Unknown value type ' + valueType); - } - if (addType) { + // The parent sel computation is handled in the frame above using the + // ancestor object of val + } else if (loc === '^') { + // This is not a final endpoint, so we do not invoke the + // callback here + this._hasParentSelector = true; + return /** @type {ReturnObject} */{ + path: path.slice(0, -1), + expr: x, + isParentSelector: true, + value: undefined, + parent: undefined, + parentProperty: null + }; + } else if (loc === '~') { + // property name retObj = { - path, - value: val, + path: push(path, loc), + value: parentPropName, parent, - parentProperty: parentPropName + parentProperty: null }; - this._handleCallback(retObj, callback, 'value'); + this._handleCallback(retObj, callback, 'property'); return retObj; + } else if (loc === '$') { + // root only + addRet(this._trace(x, val, path, null, null, callback, hasArrExpr)); + } else if (/^(-?\d*):(-?\d*):?(\d*)$/u.test(loc)) { + // [start:end:step] Python slice syntax + const sliceResult = this._slice(loc, x, val, path, parent, parentPropName, callback); + if (sliceResult) { + addRet(sliceResult); + } + } else if (loc.indexOf('?(') === 0) { + // [?(expr)] (filtering) + if (this.currEval === false) { + throw new Error('Eval [?(expr)] prevented in JSONPath expression.'); + } + const safeLoc = loc.replace(/^\?\((.*?)\)$/u, '$1'); + // check for a nested filter expression + + const nested = /@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu.exec(safeLoc); + if (nested) { + // find if there are matches in the nested expression + // add them to the result set if there is at least one match + this._walk(val, m => { + const npath = [nested[2]]; + const valObj2 = /** @type {Record} */ + val; + const nvalue = /** @type {ValueType} */nested[1] ? /** @type {Record} */valObj2[m][nested[1]] : valObj2[m]; + const filterResults = this._trace(npath, nvalue, path, parent, parentPropName, callback, true); + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next 3 -- Unreachable: _trace always returns array for nested filters */ + const filterArray = Array.isArray(filterResults) ? filterResults : [filterResults]; + if (filterArray.length > 0) { + addRet(this._trace(x, valObj2[m], push(path, m), val, m, callback, true)); + } + }); + } else { + const valObj3 = /** @type {Record} */val; + this._walk(val, m => { + if (this._eval(safeLoc, valObj3[m], m, path, parent, parentPropName)) { + addRet(this._trace(x, valObj3[m], push(path, m), val, m, callback, true)); + } + }); + } + } else if (loc[0] === '(') { + // [(expr)] (dynamic property/index) + if (this.currEval === false) { + throw new Error('Eval [(expr)] prevented in JSONPath expression.'); + } + // As this will resolve to a property name (but we don't know it + // yet), property and parent information is relative to the + const evalResult = this._eval(/** @type {string} */loc, val, /** @type {string|number} */path.at(-1), path.slice(0, -1), parent, parentPropName); + const exprToUse = /** @type {string|number} */ + evalResult !== undefined ? evalResult : ''; + addRet(this._trace(unshift(exprToUse, x), val, path, parent, parentPropName, callback, hasArrExpr)); + } else if (loc[0] === '@') { + // value type: @boolean(), etc. + let addType = false; + const valueType = /** @type {ValueType} */loc.slice(1, -2); + switch (valueType) { + case 'scalar': + if (!val || !['object', 'function'].includes(typeof val)) { + addType = true; + } + break; + case 'boolean': + case 'string': + case 'undefined': + case 'function': + if (typeof val === valueType) { + addType = true; + } + break; + case 'integer': + if (Number.isFinite(val) && !(/** @type {number} */val % 1)) { + addType = true; + } + break; + case 'number': + if (Number.isFinite(val)) { + addType = true; + } + break; + case 'nonFinite': + if (typeof val === 'number' && !Number.isFinite(val)) { + addType = true; + } + break; + case 'object': + if (val && typeof val === valueType) { + addType = true; + } + break; + case 'array': + if (Array.isArray(val)) { + addType = true; + } + break; + case 'other': + addType = this.currOtherTypeCallback?.(val, path, parent, /** @type {string|null} */parentPropName) ?? false; + break; + case 'null': + if (val === null) { + addType = true; + } + break; + /* c8 ignore next 2 */ + default: + throw new TypeError('Unknown value type ' + valueType); + } + if (addType) { + retObj = { + path, + value: val, + parent, + parentProperty: parentPropName + }; + this._handleCallback(retObj, callback, 'value'); + return retObj; + } + // `-escaped property + } else if (val && loc[0] === '`' && Object.hasOwn(val, loc.slice(1))) { + const locProp = loc.slice(1); + const valObj = /** @type {Record} */val; + addRet(this._trace(x, valObj[locProp], push(path, locProp), val, locProp, callback, hasArrExpr, true)); + } else if (loc.includes(',')) { + // [name1,name2,...] + const parts = loc.split(','); + for (const part of parts) { + addRet(this._trace(unshift(part, x), val, path, parent, parentPropName, callback, true)); + } + // simple case--directly follow property + } else if (!literalPriority && val && Object.hasOwn(val, loc)) { + const valObj = /** @type {Record} */val; + addRet(this._trace(x, valObj[loc], push(path, loc), val, loc, callback, hasArrExpr, true)); } - // `-escaped property - } else if (loc[0] === '`' && val && Object.hasOwn(val, loc.slice(1))) { - const locProp = loc.slice(1); - addRet(this._trace(x, val[locProp], push(path, locProp), val, locProp, callback, hasArrExpr, true)); - } else if (loc.includes(',')) { - // [name1,name2,...] - const parts = loc.split(','); - for (const part of parts) { - addRet(this._trace(unshift(part, x), val, path, parent, parentPropName, callback, true)); - } - // simple case--directly follow property - } else if (!literalPriority && val && Object.hasOwn(val, loc)) { - addRet(this._trace(x, val[loc], push(path, loc), val, loc, callback, hasArrExpr, true)); - } - - // We check the resulting values for parent selections. For parent - // selections we discard the value object and continue the trace with the - // current val object - if (this._hasParentSelector) { - for (let t = 0; t < ret.length; t++) { - const rett = ret[t]; - if (rett && rett.isParentSelector) { - const tmp = this._trace(rett.expr, val, rett.path, parent, parentPropName, callback, hasArrExpr); - if (Array.isArray(tmp)) { - ret[t] = tmp[0]; - const tl = tmp.length; - for (let tt = 1; tt < tl; tt++) { - // eslint-disable-next-line @stylistic/max-len -- Long - // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient - t++; - ret.splice(t, 0, tmp[tt]); + + // We check the resulting values for parent selections. For parent + // selections we discard the value object and continue the trace with + // the current val object + if (this._hasParentSelector) { + for (let t = 0; t < ret.length; t++) { + const rett = ret[t]; + if (rett && rett.isParentSelector) { + const exprToUse = /** @type {ExpressionArray} */ + rett.expr; + const pathToUse = /** @type {ExpressionArray} */ + rett.path; + const tmp = this._trace(exprToUse, val, pathToUse, parent, parentPropName, callback, hasArrExpr); + if (Array.isArray(tmp)) { + ret[t] = tmp[0]; + const tl = tmp.length; + for (let tt = 1; tt < tl; tt++) { + t++; + ret.splice(t, 0, tmp[tt]); + } + } else { + ret[t] = tmp; } - } else { - ret[t] = tmp; } } } + return ret; } - return ret; - }; - JSONPath.prototype._walk = function (val, f) { - if (Array.isArray(val)) { - const n = val.length; - for (let i = 0; i < n; i++) { - f(i); - } - } else if (val && typeof val === 'object') { - Object.keys(val).forEach(m => { - f(m); - }); + + /** + * @param {unknown} val + * @param {(prop: string|number) => void} f + * @returns {void} + */ + _walk(val, f) { + if (Array.isArray(val)) { + const n = val.length; + for (let i = 0; i < n; i++) { + f(i); + } + } else if (val && typeof val === 'object') { + Object.keys(val).forEach(m => { + f(m); + }); + } } - }; - JSONPath.prototype._slice = function (loc, expr, val, path, parent, parentPropName, callback) { - if (!Array.isArray(val)) { - return undefined; - } - const len = val.length, - parts = loc.split(':'), - step = parts[2] && Number.parseInt(parts[2]) || 1; - let start = parts[0] && Number.parseInt(parts[0]) || 0, - end = parts[1] ? Number.parseInt(parts[1]) : len; - start = start < 0 ? Math.max(0, start + len) : Math.min(len, start); - end = end < 0 ? Math.max(0, end + len) : Math.min(len, end); - const ret = []; - for (let i = start; i < end; i += step) { - const tmp = this._trace(unshift(i, expr), val, path, parent, parentPropName, callback, true); - // Should only be possible to be an array here since first part of - // ``unshift(i, expr)` passed in above would not be empty, nor `~`, - // nor begin with `@` (as could return objects) - // This was causing excessive stack size in Node (with or - // without Babel) against our performance test: `ret.push(...tmp);` - tmp.forEach(t => { - ret.push(t); - }); + + /** + * @param {string} loc + * @param {ExpressionArray} expr + * @param {unknown} val + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {ParentProperty} parentPropName + * @param {JSONPathCallback|undefined} callback + * @returns {ReturnObject[]|undefined} + */ + _slice(loc, expr, val, path, parent, parentPropName, callback) { + if (!Array.isArray(val)) { + return undefined; + } + const len = val.length, + parts = loc.split(':'), + step = parts[2] && Number(parts[2]) || 1; + let start = parts[0] && Number(parts[0]) || 0, + end = parts[1] ? Number(parts[1]) : len; + start = start < 0 ? Math.max(0, start + len) : Math.min(len, start); + end = end < 0 ? Math.max(0, end + len) : Math.min(len, end); + /** @type {ReturnObject[]} */ + const ret = []; + for (let i = start; i < end; i += step) { + const tmp = this._trace(unshift(i, expr), val, path, parent, parentPropName, callback, true); + // Should only be possible to be an array here since first part of + // ``unshift(i, expr)` passed in above would not be empty, + // nor `~`, nor begin with `@` (as could return objects) + // This was causing excessive stack size in Node (with or + // without Babel) against our performance test: `ret.push(...tmp);` + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next -- Unreachable: _trace returns array when expr non-empty */ + const tmpArray = Array.isArray(tmp) ? tmp : [tmp]; + tmpArray.forEach(t => { + ret.push(t); + }); + } + return ret; } - return ret; - }; - JSONPath.prototype._eval = function (code, _v, _vname, path, parent, parentPropName) { - this.currSandbox._$_parentProperty = parentPropName; - this.currSandbox._$_parent = parent; - this.currSandbox._$_property = _vname; - this.currSandbox._$_root = this.json; - this.currSandbox._$_v = _v; - const containsPath = code.includes('@path'); - if (containsPath) { - this.currSandbox._$_path = JSONPath.toPathString(path.concat([_vname])); - } - const scriptCacheKey = this.currEval + 'Script:' + code; - if (!JSONPath.cache[scriptCacheKey]) { - let script = code.replaceAll('@parentProperty', '_$_parentProperty').replaceAll('@parent', '_$_parent').replaceAll('@property', '_$_property').replaceAll('@root', '_$_root').replaceAll(/@([.\s)[])/gu, '_$_v$1'); + + /** + * @param {string} code + * @param {unknown} _v + * @param {string|number} _vname + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {ParentProperty} parentPropName + * @returns {UnknownResult} + */ + _eval(code, _v, _vname, path, parent, parentPropName) { + if (this.currSandbox) { + this.currSandbox._$_parentProperty = parentPropName; + this.currSandbox._$_parent = parent; + this.currSandbox._$_property = _vname; + this.currSandbox._$_root = this.json; + this.currSandbox._$_v = _v; + } + const containsPath = code.includes('@path'); if (containsPath) { - script = script.replaceAll('@path', '_$_path'); - } - if (this.currEval === 'safe' || this.currEval === true || this.currEval === undefined) { - JSONPath.cache[scriptCacheKey] = new this.safeVm.Script(script); - } else if (this.currEval === 'native') { - JSONPath.cache[scriptCacheKey] = new this.vm.Script(script); - } else if (typeof this.currEval === 'function' && this.currEval.prototype && Object.hasOwn(this.currEval.prototype, 'runInNewContext')) { - const CurrEval = this.currEval; - JSONPath.cache[scriptCacheKey] = new CurrEval(script); - } else if (typeof this.currEval === 'function') { - JSONPath.cache[scriptCacheKey] = { - runInNewContext: context => this.currEval(script, context) - }; - } else { - throw new TypeError(`Unknown "eval" property "${this.currEval}"`); + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next -- Unreachable: currSandbox set in evaluate() before _eval */ + const currSandbox = this.currSandbox ?? {}; + currSandbox._$_path = JSONPath.toPathString(/** @type {string[]} */path.concat([_vname])); } - } - try { - return JSONPath.cache[scriptCacheKey].runInNewContext(this.currSandbox); - } catch (e) { - if (this.ignoreEvalErrors) { - return false; + const scriptCacheKey = this.currEval + 'Script:' + code; + if (!Object.hasOwn(JSONPath.cache, scriptCacheKey)) { + let script = code.replaceAll('@parentProperty', '_$_parentProperty').replaceAll('@parent', '_$_parent').replaceAll('@property', '_$_property').replaceAll('@root', '_$_root').replaceAll(/@([.\s)[])/gu, '_$_v$1'); + if (containsPath) { + script = script.replaceAll('@path', '_$_path'); + } + const evalType = /** @type {string|boolean|undefined} */ + this.currEval; + if (['safe', true, undefined].includes(evalType)) { + const { + cache + } = JSONPath; + // eslint-disable-next-line @stylistic/max-len -- Long + /* eslint-disable unicorn/no-undeclared-class-members -- Prototype members */ + cache[scriptCacheKey] = new ( + /** + * @type {JSONPathClass & { + * safeVm: SafeScriptType, + * vm: ScriptType + * }} + */ /** @type {unknown} */ + this).safeVm.Script(script); + // eslint-disable-next-line @stylistic/max-len -- Long + /* eslint-enable unicorn/no-undeclared-class-members -- End prototype member scope */ + } else if (this.currEval === 'native') { + const { + cache + } = JSONPath; + // eslint-disable-next-line @stylistic/max-len -- Long + /* eslint-disable unicorn/no-undeclared-class-members -- Prototype members */ + cache[scriptCacheKey] = new ( + /** + * @type {JSONPathClass & { + * safeVm: SafeScriptType, + * vm: ScriptType + * }} + */ /** @type {unknown} */ + this).vm.Script(script); + // eslint-disable-next-line @stylistic/max-len -- Long + /* eslint-enable unicorn/no-undeclared-class-members -- End prototype member scope */ + } else if (typeof this.currEval === 'function' && this.currEval.prototype && Object.hasOwn(this.currEval.prototype, 'runInNewContext')) { + const CurrEval = this.currEval; + const { + cache + } = JSONPath; + // eslint-disable-next-line @stylistic/max-len -- Long + // @ts-expect-error - Type checked above to have proper constructor + cache[scriptCacheKey] = new CurrEval(script); + } else if (typeof this.currEval === 'function') { + const { + cache + } = JSONPath; + // Type narrowing: at this point currEval is a function + // but not a constructor + const evalFunc = /** @type {EvalCallback} */this.currEval; + cache[scriptCacheKey] = { + runInNewContext: (/** @type {ContextItem} */context) => evalFunc(script, context) + }; + } else { + throw new TypeError(`Unknown "eval" property "${this.currEval}"`); + } + } + try { + const { + cache + } = JSONPath; + + /** + * @typedef {{ + * runInNewContext: ( + * ctx: SandboxType|undefined + * ) => EvaluatedResult + * }} RunInNewContext + */ + + return /** @type {RunInNewContext} */cache[scriptCacheKey].runInNewContext(this.currSandbox); + } catch (e) { + if (this.ignoreEvalErrors) { + return false; + } + const error = /** @type {Error} */e; + throw new Error('jsonPath: ' + error.message + ': ' + code, { + cause: e + }); } - throw new Error('jsonPath: ' + e.message + ': ' + code); } + } + + /** @type {{safeVm: SafeScriptType}} */ + (/** @type {unknown} */JSONPathClass.prototype).safeVm = { + Script: SafeScript }; + JSONPath.prototype = JSONPathClass.prototype; // PUBLIC CLASS PROPERTIES AND METHODS // Could store the cache object itself + + /** @type {Record} */ JSONPath.cache = {}; /** @@ -2004,7 +2431,7 @@ }; /** - * @param {string} pointer JSON Path + * @param {string[]} pointer JSON Path array * @returns {string} JSON Pointer */ JSONPath.toPointer = function (pointer) { @@ -2027,9 +2454,10 @@ const { cache } = JSONPath; - if (cache[expr]) { - return cache[expr].concat(); + if (Object.hasOwn(cache, expr)) { + return /** @type {string[]} */cache[expr].concat(); } + /** @type {string[]} */ const subx = []; const normalized = expr // Properties @@ -2037,7 +2465,10 @@ // Parenthetical evaluations (filtering and otherwise), directly // within brackets or single quotes .replaceAll(/[['](\??\(.*?\))[\]'](?!.\])/gu, function ($0, $1) { - return '[#' + (subx.push($1) - 1) + ']'; + return '[#' + ( + // eslint-disable-next-line @stylistic/max-len -- Long + // eslint-disable-next-line unicorn/no-return-array-push -- Optimization + subx.push($1) - 1) + ']'; }) // Escape periods and tildes within properties .replaceAll(/\[['"]([^'\]]*)['"]\]/gu, function ($0, prop) { @@ -2061,34 +2492,95 @@ .replaceAll(/;$|'?\]|'$/gu, ''); const exprList = normalized.split(';').map(function (exp) { const match = exp.match(/#(\d+)/u); - return !match || !match[1] ? exp : subx[match[1]]; + return !match || !match[1] ? exp : subx[Number(match[1])]; }); cache[expr] = exprList; - return cache[expr].concat(); - }; - JSONPath.prototype.safeVm = { - Script: SafeScript + return /** @type {string[]} */cache[expr].concat(); }; /** - * @typedef {any} ContextItem + * @typedef {import('./jsonpath.js').AnyInput} AnyInput */ - /** - * @typedef {any} EvaluatedResult + * @typedef {import('./jsonpath.js').SandboxCallback} SandboxCallback + */ + /** + * @typedef {import('./jsonpath.js').SandboxPropertyValue} SandboxPropertyValue + */ + /** + * @typedef {import('./jsonpath.js').ExpressionArray} ExpressionArray + */ + /** + * @typedef {import('./jsonpath.js').ValueType} ValueType + */ + /** + * @typedef {import('./jsonpath.js').ParentValue} ParentValue + */ + /** + * @typedef {import('./jsonpath.js').UnknownResult} UnknownResult + */ + /** + * @typedef {import('./jsonpath.js').ParentProperty} ParentProperty + */ + /** + * @typedef {import('./jsonpath.js').PreferredOutput} PreferredOutput + */ + /** + * @typedef {import('./jsonpath.js').ReturnObject} ReturnObject + */ + /** + * @typedef {import('./jsonpath.js').JSONPathCallback} JSONPathCallback + */ + /** + * @typedef {import('./jsonpath.js').OtherTypeCallback} OtherTypeCallback + */ + /** + * @typedef {import('./jsonpath.js').ContextItem} ContextItem + */ + /** + * @typedef {import('./jsonpath.js').EvaluatedResult} EvaluatedResult + */ + /** + * @typedef {import('./jsonpath.js').EvalCallback} EvalCallback + */ + /** + * @typedef {import('./jsonpath.js').EvalClass} EvalClass + */ + /** + * @typedef {import('./jsonpath.js').ResultType} ResultType + */ + /** + * @typedef {import('./jsonpath.js').EvalValue} EvalValue + */ + /** + * @typedef {import('./jsonpath.js').PathType} PathType + */ + /** + * @typedef {import('./jsonpath.js').SafeScriptType} SafeScriptType + */ + /** + * @typedef {import('./jsonpath.js').ScriptType} ScriptType + */ + /** + * @typedef {import('./jsonpath.js').SandboxType} SandboxType + */ + /** + * @typedef {import('./jsonpath.js').JSONPathOptions} JSONPathOptions */ /** + * @template T * @callback ConditionCallback - * @param {ContextItem} item + * @param {T} item * @returns {boolean} */ /** * Copy items out of one array into another. - * @param {GenericArray} source Array with items to copy - * @param {GenericArray} target Array to which to copy - * @param {ConditionCallback} conditionCb Callback passed the current item; + * @template T + * @param {T[]} source Array with items to copy + * @param {T[]} target Array to which to copy + * @param {ConditionCallback} conditionCb Callback passed the current item; * will move item if evaluates to `true` * @returns {void} */ @@ -2097,8 +2589,6 @@ for (let i = 0; i < il; i++) { const item = source[i]; if (conditionCb(item)) { - // eslint-disable-next-line @stylistic/max-len -- Long - // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient target.push(source.splice(i--, 1)[0]); } } @@ -2116,14 +2606,14 @@ } /** - * @param {object} context Object whose items will be added + * @param {SandboxType} context Object whose items will be added * to evaluation * @returns {EvaluatedResult} Result of evaluated code */ runInNewContext(context) { let expr = this.code; const keys = Object.keys(context); - const funcs = []; + const funcs = /** @type {string[]} */[]; moveToAnotherArray(keys, funcs, key => { return typeof context[key] === 'function'; }); @@ -2139,7 +2629,7 @@ }, ''); expr = funcString + expr; - // Mitigate http://perfectionkills.com/global-eval-what-are-the-options/#new_function + // Mitigate https://perfectionkills.com/global-eval-what-are-the-options/#new_function if (!/(['"])use strict\1/u.test(expr) && !keys.includes('arguments')) { expr = 'var arguments = undefined;' + expr; } @@ -2157,10 +2647,14 @@ return new Function(...keys, code)(...values); } } - JSONPath.prototype.vm = { + + /** @type {{vm: ScriptType}} */ + (/** @type {unknown} */JSONPathClass.prototype).vm = { Script }; exports.JSONPath = JSONPath; + exports.JSONPathClass = JSONPathClass; + exports.Script = Script; })); diff --git a/dist/index-browser-umd.min.cjs b/dist/index-browser-umd.min.cjs index d0d073a3..68b591a8 100644 --- a/dist/index-browser-umd.min.cjs +++ b/dist/index-browser-umd.min.cjs @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).JSONPath={})}(this,function(e){"use strict";class t{static get version(){return"1.4.0"}static toString(){return"JavaScript Expression Parser (JSEP) v"+t.version}static addUnaryOp(e){return t.max_unop_len=Math.max(e.length,t.max_unop_len),t.unary_ops[e]=1,t}static addBinaryOp(e,r,s){return t.max_binop_len=Math.max(e.length,t.max_binop_len),t.binary_ops[e]=r,s?t.right_associative.add(e):t.right_associative.delete(e),t}static addIdentifierChar(e){return t.additional_identifier_chars.add(e),t}static addLiteral(e,r){return t.literals[e]=r,t}static removeUnaryOp(e){return delete t.unary_ops[e],e.length===t.max_unop_len&&(t.max_unop_len=t.getMaxKeyLen(t.unary_ops)),t}static removeAllUnaryOps(){return t.unary_ops={},t.max_unop_len=0,t}static removeIdentifierChar(e){return t.additional_identifier_chars.delete(e),t}static removeBinaryOp(e){return delete t.binary_ops[e],e.length===t.max_binop_len&&(t.max_binop_len=t.getMaxKeyLen(t.binary_ops)),t.right_associative.delete(e),t}static removeAllBinaryOps(){return t.binary_ops={},t.max_binop_len=0,t}static removeLiteral(e){return delete t.literals[e],t}static removeAllLiterals(){return t.literals={},t}get char(){return this.expr.charAt(this.index)}get code(){return this.expr.charCodeAt(this.index)}constructor(e){this.expr=e,this.index=0}static parse(e){return new t(e).parse()}static getMaxKeyLen(e){return Math.max(0,...Object.keys(e).map(e=>e.length))}static isDecimalDigit(e){return e>=48&&e<=57}static binaryPrecedence(e){return t.binary_ops[e]||0}static isIdentifierStart(e){return e>=65&&e<=90||e>=97&&e<=122||e>=128&&!t.binary_ops[String.fromCharCode(e)]||t.additional_identifier_chars.has(String.fromCharCode(e))}static isIdentifierPart(e){return t.isIdentifierStart(e)||t.isDecimalDigit(e)}throwError(e){const t=new Error(e+" at character "+this.index);throw t.index=this.index,t.description=e,t}runHook(e,r){if(t.hooks[e]){const s={context:this,node:r};return t.hooks.run(e,s),s.node}return r}searchHook(e){if(t.hooks[e]){const r={context:this};return t.hooks[e].find(function(e){return e.call(r.context,r),r.node}),r.node}}gobbleSpaces(){let e=this.code;for(;e===t.SPACE_CODE||e===t.TAB_CODE||e===t.LF_CODE||e===t.CR_CODE;)e=this.expr.charCodeAt(++this.index);this.runHook("gobble-spaces")}parse(){this.runHook("before-all");const e=this.gobbleExpressions(),r=1===e.length?e[0]:{type:t.COMPOUND,body:e};return this.runHook("after-all",r)}gobbleExpressions(e){let r,s,n=[];for(;this.index0;){if(t.binary_ops.hasOwnProperty(e)&&(!t.isIdentifierStart(this.code)||this.index+e.lengthi.right_a&&e.right_a?s>e.prec:s<=e.prec;for(;n.length>2&&h(n[n.length-2]);)a=n.pop(),r=n.pop().value,o=n.pop(),e={type:t.BINARY_EXP,operator:r,left:o,right:a},n.push(e);e=this.gobbleToken(),e||this.throwError("Expected expression after "+l),n.push(i,e)}for(h=n.length-1,e=n[h];h>1;)e={type:t.BINARY_EXP,operator:n[h-1].value,left:n[h-2],right:e},h-=2;return e}gobbleToken(){let e,r,s,n;if(this.gobbleSpaces(),n=this.searchHook("gobble-token"),n)return this.runHook("after-token",n);if(e=this.code,t.isDecimalDigit(e)||e===t.PERIOD_CODE)return this.gobbleNumericLiteral();if(e===t.SQUOTE_CODE||e===t.DQUOTE_CODE)n=this.gobbleStringLiteral();else if(e===t.OBRACK_CODE)n=this.gobbleArray();else{for(r=this.expr.substr(this.index,t.max_unop_len),s=r.length;s>0;){if(t.unary_ops.hasOwnProperty(r)&&(!t.isIdentifierStart(this.code)||this.index+r.length=r.length&&this.throwError("Unexpected token "+String.fromCharCode(e));break}if(i===t.COMMA_CODE){if(this.index++,n++,n!==r.length)if(e===t.CPAREN_CODE)this.throwError("Unexpected token ,");else if(e===t.CBRACK_CODE)for(let e=r.length;e{if("object"!=typeof e||!e.name||!e.init)throw new Error("Invalid JSEP plugin format");this.registered[e.name]||(e.init(this.jsep),this.registered[e.name]=e)})}}(t),COMPOUND:"Compound",SEQUENCE_EXP:"SequenceExpression",IDENTIFIER:"Identifier",MEMBER_EXP:"MemberExpression",LITERAL:"Literal",THIS_EXP:"ThisExpression",CALL_EXP:"CallExpression",UNARY_EXP:"UnaryExpression",BINARY_EXP:"BinaryExpression",ARRAY_EXP:"ArrayExpression",TAB_CODE:9,LF_CODE:10,CR_CODE:13,SPACE_CODE:32,PERIOD_CODE:46,COMMA_CODE:44,SQUOTE_CODE:39,DQUOTE_CODE:34,OPAREN_CODE:40,CPAREN_CODE:41,OBRACK_CODE:91,CBRACK_CODE:93,QUMARK_CODE:63,SEMCOL_CODE:59,COLON_CODE:58,unary_ops:{"-":1,"!":1,"~":1,"+":1},binary_ops:{"||":1,"??":1,"&&":2,"|":3,"^":4,"&":5,"==":6,"!=":6,"===":6,"!==":6,"<":7,">":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10,"**":11},right_associative:new Set(["**"]),additional_identifier_chars:new Set(["$","_"]),literals:{true:!0,false:!1,null:null},this_str:"this"}),t.max_unop_len=t.getMaxKeyLen(t.unary_ops),t.max_binop_len=t.getMaxKeyLen(t.binary_ops);const s=e=>new t(e).parse(),n=Object.getOwnPropertyNames(class{});Object.getOwnPropertyNames(t).filter(e=>!n.includes(e)&&void 0===s[e]).forEach(e=>{s[e]=t[e]}),s.Jsep=t;var i={name:"ternary",init(e){e.hooks.add("after-expression",function(t){if(t.node&&this.code===e.QUMARK_CODE){this.index++;const r=t.node,s=this.gobbleExpression();if(s||this.throwError("Expected expression"),this.gobbleSpaces(),this.code===e.COLON_CODE){this.index++;const n=this.gobbleExpression();if(n||this.throwError("Expected expression"),t.node={type:"ConditionalExpression",test:r,consequent:s,alternate:n},r.operator&&e.binary_ops[r.operator]<=.9){let s=r;for(;s.right.operator&&e.binary_ops[s.right.operator]<=.9;)s=s.right;t.node.test=s.right,s.right=t.node,t.node=r}}else this.throwError("Expected :")}})}};s.plugins.register(i);var o={name:"regex",init(e){e.hooks.add("gobble-token",function(t){if(47===this.code){const r=++this.index;let s=!1;for(;this.index=97&&e<=122||e>=65&&e<=90||e>=48&&e<=57))break;i+=this.char}try{n=new RegExp(s,i)}catch(e){this.throwError(e.message)}return t.node={type:e.LITERAL,value:n,raw:this.expr.slice(r-1,this.index)},t.node=this.gobbleTokenProperty(t.node),t.node}this.code===e.OBRACK_CODE?s=!0:s&&this.code===e.CBRACK_CODE&&(s=!1),this.index+=92===this.code?2:1}this.throwError("Unclosed Regex")}})}};const a={name:"assignment",assignmentOperators:new Set(["=","*=","**=","/=","%=","+=","-=","<<=",">>=",">>>=","&=","^=","|=","||=","&&=","??="]),updateOperators:[43,45],assignmentPrecedence:.9,init(e){const t=[e.IDENTIFIER,e.MEMBER_EXP];function r(e){a.assignmentOperators.has(e.operator)?(e.type="AssignmentExpression",r(e.left),r(e.right)):e.operator||Object.values(e).forEach(e=>{e&&"object"==typeof e&&r(e)})}a.assignmentOperators.forEach(t=>e.addBinaryOp(t,a.assignmentPrecedence,!0)),e.hooks.add("gobble-token",function(e){const r=this.code;a.updateOperators.some(e=>e===r&&e===this.expr.charCodeAt(this.index+1))&&(this.index+=2,e.node={type:"UpdateExpression",operator:43===r?"++":"--",argument:this.gobbleTokenProperty(this.gobbleIdentifier()),prefix:!0},e.node.argument&&t.includes(e.node.argument.type)||this.throwError(`Unexpected ${e.node.operator}`))}),e.hooks.add("after-token",function(e){if(e.node){const r=this.code;a.updateOperators.some(e=>e===r&&e===this.expr.charCodeAt(this.index+1))&&(t.includes(e.node.type)||this.throwError(`Unexpected ${e.node.operator}`),this.index+=2,e.node={type:"UpdateExpression",operator:43===r?"++":"--",argument:e.node,prefix:!1})}}),e.hooks.add("after-expression",function(e){e.node&&r(e.node)})}};s.plugins.register(o,a),s.addUnaryOp("typeof"),s.addUnaryOp("void"),s.addLiteral("null",null),s.addLiteral("undefined",void 0);const h=new Set(["constructor","__proto__","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__"]),l={evalAst(e,t){switch(e.type){case"BinaryExpression":case"LogicalExpression":return l.evalBinaryExpression(e,t);case"Compound":return l.evalCompound(e,t);case"ConditionalExpression":return l.evalConditionalExpression(e,t);case"Identifier":return l.evalIdentifier(e,t);case"Literal":return l.evalLiteral(e,t);case"MemberExpression":return l.evalMemberExpression(e,t);case"UnaryExpression":return l.evalUnaryExpression(e,t);case"ArrayExpression":return l.evalArrayExpression(e,t);case"CallExpression":return l.evalCallExpression(e,t);case"AssignmentExpression":return l.evalAssignmentExpression(e,t);default:throw SyntaxError("Unexpected expression",e)}},evalBinaryExpression:(e,t)=>({"||":(e,t)=>e||t(),"&&":(e,t)=>e&&t(),"|":(e,t)=>e|t(),"^":(e,t)=>e^t(),"&":(e,t)=>e&t(),"==":(e,t)=>e==t(),"!=":(e,t)=>e!=t(),"===":(e,t)=>e===t(),"!==":(e,t)=>e!==t(),"<":(e,t)=>e":(e,t)=>e>t(),"<=":(e,t)=>e<=t(),">=":(e,t)=>e>=t(),"<<":(e,t)=>e<>":(e,t)=>e>>t(),">>>":(e,t)=>e>>>t(),"+":(e,t)=>e+t(),"-":(e,t)=>e-t(),"*":(e,t)=>e*t(),"/":(e,t)=>e/t(),"%":(e,t)=>e%t()}[e.operator](l.evalAst(e.left,t),()=>l.evalAst(e.right,t))),evalCompound(e,t){let r;for(let s=0;sl.evalAst(e.test,t)?l.evalAst(e.consequent,t):l.evalAst(e.alternate,t),evalIdentifier(e,t){if(Object.hasOwn(t,e.name))return t[e.name];throw ReferenceError(`${e.name} is not defined`)},evalLiteral:e=>e.value,evalMemberExpression(e,t){const r=String(e.computed?l.evalAst(e.property):e.property.name),s=l.evalAst(e.object,t);if(null==s)throw TypeError(`Cannot read properties of ${s} (reading '${r}')`);if(!Object.hasOwn(s,r)&&h.has(r))throw TypeError(`Cannot read properties of ${s} (reading '${r}')`);const n=s[r];return"function"==typeof n&&n!==Function?n.bind(s):n},evalUnaryExpression:(e,t)=>({"-":e=>-l.evalAst(e,t),"!":e=>!l.evalAst(e,t),"~":e=>~l.evalAst(e,t),"+":e=>+l.evalAst(e,t),typeof:e=>typeof l.evalAst(e,t),void:e=>{l.evalAst(e,t)}}[e.operator](e.argument)),evalArrayExpression:(e,t)=>e.elements.map(e=>l.evalAst(e,t)),evalCallExpression(e,t){const r=e.arguments.map(e=>l.evalAst(e,t)),s=l.evalAst(e.callee,t);if(s===Function)throw new Error("Function constructor is disabled");return s(...r)},evalAssignmentExpression(e,t){if("Identifier"!==e.left.type)throw SyntaxError("Invalid left-hand side in assignment");const r=e.left.name,s=l.evalAst(e.right,t);return t[r]=s,t[r]}};function c(e,t){return(e=e.slice()).push(t),e}function p(e,t){return(t=t.slice()).unshift(e),t}class u extends Error{constructor(e){super('JSONPath should not be called with "new" (it prevents return of (unwrapped) scalar values)'),this.avoidNew=!0,this.value=e,this.name="NewError"}}function d(e,t,r,s,n){if(!(this instanceof d))try{return new d(e,t,r,s,n)}catch(e){if(!e.avoidNew)throw e;return e.value}"string"==typeof e&&(n=s,s=r,r=t,t=e,e=null);const i=e&&"object"==typeof e;if(e=e||{},this.json=e.json||r,this.path=e.path||t,this.resultType=e.resultType||"value",this.flatten=e.flatten||!1,this.wrap=!Object.hasOwn(e,"wrap")||e.wrap,this.sandbox=e.sandbox||{},this.eval=void 0===e.eval?"safe":e.eval,this.ignoreEvalErrors=void 0!==e.ignoreEvalErrors&&e.ignoreEvalErrors,this.parent=e.parent||null,this.parentProperty=e.parentProperty||null,this.callback=e.callback||s||null,this.otherTypeCallback=e.otherTypeCallback||n||function(){throw new TypeError("You must supply an otherTypeCallback callback option with the @other() operator.")},!1!==e.autostart){const s={path:i?e.path:t};i?"json"in e&&(s.json=e.json):s.json=r;const n=this.evaluate(s);if(!n||"object"!=typeof n)throw new u(n);return n}}d.prototype.evaluate=function(e,t,r,s){let n=this.parent,i=this.parentProperty,{flatten:o,wrap:a}=this;if(this.currResultType=this.resultType,this.currEval=this.eval,this.currSandbox=this.sandbox,r=r||this.callback,this.currOtherTypeCallback=s||this.otherTypeCallback,t=t||this.json,(e=e||this.path)&&"object"==typeof e&&!Array.isArray(e)){if(!e.path&&""!==e.path)throw new TypeError('You must supply a "path" property when providing an object argument to JSONPath.evaluate().');if(!Object.hasOwn(e,"json"))throw new TypeError('You must supply a "json" property when providing an object argument to JSONPath.evaluate().');({json:t}=e),o=Object.hasOwn(e,"flatten")?e.flatten:o,this.currResultType=Object.hasOwn(e,"resultType")?e.resultType:this.currResultType,this.currSandbox=Object.hasOwn(e,"sandbox")?e.sandbox:this.currSandbox,a=Object.hasOwn(e,"wrap")?e.wrap:a,this.currEval=Object.hasOwn(e,"eval")?e.eval:this.currEval,r=Object.hasOwn(e,"callback")?e.callback:r,this.currOtherTypeCallback=Object.hasOwn(e,"otherTypeCallback")?e.otherTypeCallback:this.currOtherTypeCallback,n=Object.hasOwn(e,"parent")?e.parent:n,i=Object.hasOwn(e,"parentProperty")?e.parentProperty:i,e=e.path}if(n=n||null,i=i||null,Array.isArray(e)&&(e=d.toPathString(e)),!e&&""!==e||!t)return;const h=d.toPathArray(e);"$"===h[0]&&h.length>1&&h.shift(),this._hasParentSelector=null;const l=this._trace(h,t,["$"],n,i,r).filter(function(e){return e&&!e.isParentSelector});return l.length?a||1!==l.length||l[0].hasArrExpr?l.reduce((e,t)=>{const r=this._getPreferredOutput(t);return o&&Array.isArray(r)?e=e.concat(r):e.push(r),e},[]):this._getPreferredOutput(l[0]):a?[]:void 0},d.prototype._getPreferredOutput=function(e){const t=this.currResultType;switch(t){case"all":{const t=Array.isArray(e.path)?e.path:d.toPathArray(e.path);return e.pointer=d.toPointer(t),e.path="string"==typeof e.path?e.path:d.toPathString(e.path),e}case"value":case"parent":case"parentProperty":return e[t];case"path":return d.toPathString(e[t]);case"pointer":return d.toPointer(e.path);default:throw new TypeError("Unknown result type")}},d.prototype._handleCallback=function(e,t,r){if(t){const s=this._getPreferredOutput(e);e.path="string"==typeof e.path?e.path:d.toPathString(e.path),t(s,r,e)}},d.prototype._trace=function(e,t,r,s,n,i,o,a){let h;if(!e.length)return h={path:r,value:t,parent:s,parentProperty:n,hasArrExpr:o},this._handleCallback(h,i,"value"),h;const l=e[0],u=e.slice(1),d=[];function f(e){Array.isArray(e)?e.forEach(e=>{d.push(e)}):d.push(e)}if(("string"!=typeof l||a)&&t&&Object.hasOwn(t,l))f(this._trace(u,t[l],c(r,l),t,l,i,o));else if("*"===l)this._walk(t,e=>{f(this._trace(u,t[e],c(r,e),t,e,i,!0,!0))});else if(".."===l)f(this._trace(u,t,r,s,n,i,o)),this._walk(t,s=>{"object"==typeof t[s]&&f(this._trace(e.slice(),t[s],c(r,s),t,s,i,!0))});else{if("^"===l)return this._hasParentSelector=!0,{path:r.slice(0,-1),expr:u,isParentSelector:!0};if("~"===l)return h={path:c(r,l),value:n,parent:s,parentProperty:null},this._handleCallback(h,i,"property"),h;if("$"===l)f(this._trace(u,t,r,null,null,i,o));else if(/^(-?\d*):(-?\d*):?(\d*)$/u.test(l))f(this._slice(l,u,t,r,s,n,i));else if(0===l.indexOf("?(")){if(!1===this.currEval)throw new Error("Eval [?(expr)] prevented in JSONPath expression.");const e=l.replace(/^\?\((.*?)\)$/u,"$1"),o=/@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu.exec(e);o?this._walk(t,e=>{const a=[o[2]],h=o[1]?t[e][o[1]]:t[e];this._trace(a,h,r,s,n,i,!0).length>0&&f(this._trace(u,t[e],c(r,e),t,e,i,!0))}):this._walk(t,o=>{this._eval(e,t[o],o,r,s,n)&&f(this._trace(u,t[o],c(r,o),t,o,i,!0))})}else if("("===l[0]){if(!1===this.currEval)throw new Error("Eval [(expr)] prevented in JSONPath expression.");f(this._trace(p(this._eval(l,t,r.at(-1),r.slice(0,-1),s,n),u),t,r,s,n,i,o))}else if("@"===l[0]){let e=!1;const o=l.slice(1,-2);switch(o){case"scalar":t&&["object","function"].includes(typeof t)||(e=!0);break;case"boolean":case"string":case"undefined":case"function":typeof t===o&&(e=!0);break;case"integer":!Number.isFinite(t)||t%1||(e=!0);break;case"number":Number.isFinite(t)&&(e=!0);break;case"nonFinite":"number"!=typeof t||Number.isFinite(t)||(e=!0);break;case"object":t&&typeof t===o&&(e=!0);break;case"array":Array.isArray(t)&&(e=!0);break;case"other":e=this.currOtherTypeCallback(t,r,s,n);break;case"null":null===t&&(e=!0);break;default:throw new TypeError("Unknown value type "+o)}if(e)return h={path:r,value:t,parent:s,parentProperty:n},this._handleCallback(h,i,"value"),h}else if("`"===l[0]&&t&&Object.hasOwn(t,l.slice(1))){const e=l.slice(1);f(this._trace(u,t[e],c(r,e),t,e,i,o,!0))}else if(l.includes(",")){const e=l.split(",");for(const o of e)f(this._trace(p(o,u),t,r,s,n,i,!0))}else!a&&t&&Object.hasOwn(t,l)&&f(this._trace(u,t[l],c(r,l),t,l,i,o,!0))}if(this._hasParentSelector)for(let e=0;e{t(e)})},d.prototype._slice=function(e,t,r,s,n,i,o){if(!Array.isArray(r))return;const a=r.length,h=e.split(":"),l=h[2]&&Number.parseInt(h[2])||1;let c=h[0]&&Number.parseInt(h[0])||0,u=h[1]?Number.parseInt(h[1]):a;c=c<0?Math.max(0,c+a):Math.min(a,c),u=u<0?Math.max(0,u+a):Math.min(a,u);const d=[];for(let e=c;e{d.push(e)})}return d},d.prototype._eval=function(e,t,r,s,n,i){this.currSandbox._$_parentProperty=i,this.currSandbox._$_parent=n,this.currSandbox._$_property=r,this.currSandbox._$_root=this.json,this.currSandbox._$_v=t;const o=e.includes("@path");o&&(this.currSandbox._$_path=d.toPathString(s.concat([r])));const a=this.currEval+"Script:"+e;if(!d.cache[a]){let t=e.replaceAll("@parentProperty","_$_parentProperty").replaceAll("@parent","_$_parent").replaceAll("@property","_$_property").replaceAll("@root","_$_root").replaceAll(/@([.\s)[])/gu,"_$_v$1");if(o&&(t=t.replaceAll("@path","_$_path")),"safe"===this.currEval||!0===this.currEval||void 0===this.currEval)d.cache[a]=new this.safeVm.Script(t);else if("native"===this.currEval)d.cache[a]=new this.vm.Script(t);else if("function"==typeof this.currEval&&this.currEval.prototype&&Object.hasOwn(this.currEval.prototype,"runInNewContext")){const e=this.currEval;d.cache[a]=new e(t)}else{if("function"!=typeof this.currEval)throw new TypeError(`Unknown "eval" property "${this.currEval}"`);d.cache[a]={runInNewContext:e=>this.currEval(t,e)}}}try{return d.cache[a].runInNewContext(this.currSandbox)}catch(t){if(this.ignoreEvalErrors)return!1;throw new Error("jsonPath: "+t.message+": "+e)}},d.cache={},d.toPathString=function(e){const t=e,r=t.length;let s="$";for(let e=1;e"function"==typeof e[t]);const n=r.map(t=>e[t]);t=s.reduce((t,r)=>{let s=e[r].toString();return/function/u.test(s)||(s="function "+s),"var "+r+"="+s+";"+t},"")+t,/(['"])use strict\1/u.test(t)||r.includes("arguments")||(t="var arguments = undefined;"+t),t=t.replace(/;\s*$/u,"");const i=t.lastIndexOf(";"),o=-1!==i?t.slice(0,i+1)+" return "+t.slice(i+1):" return "+t;return new Function(...r,o)(...n)}}},e.JSONPath=d}); +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).JSONPath={})}(this,function(e){"use strict";class t{static get version(){return"1.4.0"}static toString(){return"JavaScript Expression Parser (JSEP) v"+t.version}static addUnaryOp(e){return t.max_unop_len=Math.max(e.length,t.max_unop_len),t.unary_ops[e]=1,t}static addBinaryOp(e,r,s){return t.max_binop_len=Math.max(e.length,t.max_binop_len),t.binary_ops[e]=r,s?t.right_associative.add(e):t.right_associative.delete(e),t}static addIdentifierChar(e){return t.additional_identifier_chars.add(e),t}static addLiteral(e,r){return t.literals[e]=r,t}static removeUnaryOp(e){return delete t.unary_ops[e],e.length===t.max_unop_len&&(t.max_unop_len=t.getMaxKeyLen(t.unary_ops)),t}static removeAllUnaryOps(){return t.unary_ops={},t.max_unop_len=0,t}static removeIdentifierChar(e){return t.additional_identifier_chars.delete(e),t}static removeBinaryOp(e){return delete t.binary_ops[e],e.length===t.max_binop_len&&(t.max_binop_len=t.getMaxKeyLen(t.binary_ops)),t.right_associative.delete(e),t}static removeAllBinaryOps(){return t.binary_ops={},t.max_binop_len=0,t}static removeLiteral(e){return delete t.literals[e],t}static removeAllLiterals(){return t.literals={},t}get char(){return this.expr.charAt(this.index)}get code(){return this.expr.charCodeAt(this.index)}constructor(e){this.expr=e,this.index=0}static parse(e){return new t(e).parse()}static getMaxKeyLen(e){return Math.max(0,...Object.keys(e).map(e=>e.length))}static isDecimalDigit(e){return e>=48&&e<=57}static binaryPrecedence(e){return t.binary_ops[e]||0}static isIdentifierStart(e){return e>=65&&e<=90||e>=97&&e<=122||e>=128&&!t.binary_ops[String.fromCharCode(e)]||t.additional_identifier_chars.has(String.fromCharCode(e))}static isIdentifierPart(e){return t.isIdentifierStart(e)||t.isDecimalDigit(e)}throwError(e){const t=new Error(e+" at character "+this.index);throw t.index=this.index,t.description=e,t}runHook(e,r){if(t.hooks[e]){const s={context:this,node:r};return t.hooks.run(e,s),s.node}return r}searchHook(e){if(t.hooks[e]){const r={context:this};return t.hooks[e].find(function(e){return e.call(r.context,r),r.node}),r.node}}gobbleSpaces(){let e=this.code;for(;e===t.SPACE_CODE||e===t.TAB_CODE||e===t.LF_CODE||e===t.CR_CODE;)e=this.expr.charCodeAt(++this.index);this.runHook("gobble-spaces")}parse(){this.runHook("before-all");const e=this.gobbleExpressions(),r=1===e.length?e[0]:{type:t.COMPOUND,body:e};return this.runHook("after-all",r)}gobbleExpressions(e){let r,s,n=[];for(;this.index0;){if(t.binary_ops.hasOwnProperty(e)&&(!t.isIdentifierStart(this.code)||this.index+e.lengthi.right_a&&e.right_a?s>e.prec:s<=e.prec;for(;n.length>2&&h(n[n.length-2]);)a=n.pop(),r=n.pop().value,o=n.pop(),e={type:t.BINARY_EXP,operator:r,left:o,right:a},n.push(e);e=this.gobbleToken(),e||this.throwError("Expected expression after "+l),n.push(i,e)}for(h=n.length-1,e=n[h];h>1;)e={type:t.BINARY_EXP,operator:n[h-1].value,left:n[h-2],right:e},h-=2;return e}gobbleToken(){let e,r,s,n;if(this.gobbleSpaces(),n=this.searchHook("gobble-token"),n)return this.runHook("after-token",n);if(e=this.code,t.isDecimalDigit(e)||e===t.PERIOD_CODE)return this.gobbleNumericLiteral();if(e===t.SQUOTE_CODE||e===t.DQUOTE_CODE)n=this.gobbleStringLiteral();else if(e===t.OBRACK_CODE)n=this.gobbleArray();else{for(r=this.expr.substr(this.index,t.max_unop_len),s=r.length;s>0;){if(t.unary_ops.hasOwnProperty(r)&&(!t.isIdentifierStart(this.code)||this.index+r.length=r.length&&this.throwError("Unexpected token "+String.fromCharCode(e));break}if(i===t.COMMA_CODE){if(this.index++,n++,n!==r.length)if(e===t.CPAREN_CODE)this.throwError("Unexpected token ,");else if(e===t.CBRACK_CODE)for(let e=r.length;e{if("object"!=typeof e||!e.name||!e.init)throw new Error("Invalid JSEP plugin format");this.registered[e.name]||(e.init(this.jsep),this.registered[e.name]=e)})}}(t),COMPOUND:"Compound",SEQUENCE_EXP:"SequenceExpression",IDENTIFIER:"Identifier",MEMBER_EXP:"MemberExpression",LITERAL:"Literal",THIS_EXP:"ThisExpression",CALL_EXP:"CallExpression",UNARY_EXP:"UnaryExpression",BINARY_EXP:"BinaryExpression",ARRAY_EXP:"ArrayExpression",TAB_CODE:9,LF_CODE:10,CR_CODE:13,SPACE_CODE:32,PERIOD_CODE:46,COMMA_CODE:44,SQUOTE_CODE:39,DQUOTE_CODE:34,OPAREN_CODE:40,CPAREN_CODE:41,OBRACK_CODE:91,CBRACK_CODE:93,QUMARK_CODE:63,SEMCOL_CODE:59,COLON_CODE:58,unary_ops:{"-":1,"!":1,"~":1,"+":1},binary_ops:{"||":1,"??":1,"&&":2,"|":3,"^":4,"&":5,"==":6,"!=":6,"===":6,"!==":6,"<":7,">":7,"<=":7,">=":7,"<<":8,">>":8,">>>":8,"+":9,"-":9,"*":10,"/":10,"%":10,"**":11},right_associative:new Set(["**"]),additional_identifier_chars:new Set(["$","_"]),literals:{true:!0,false:!1,null:null},this_str:"this"}),t.max_unop_len=t.getMaxKeyLen(t.unary_ops),t.max_binop_len=t.getMaxKeyLen(t.binary_ops);const s=e=>new t(e).parse(),n=Object.getOwnPropertyNames(class{});Object.getOwnPropertyNames(t).filter(e=>!n.includes(e)&&void 0===s[e]).forEach(e=>{s[e]=t[e]}),s.Jsep=t;var i={name:"ternary",init(e){e.hooks.add("after-expression",function(t){if(t.node&&this.code===e.QUMARK_CODE){this.index++;const r=t.node,s=this.gobbleExpression();if(s||this.throwError("Expected expression"),this.gobbleSpaces(),this.code===e.COLON_CODE){this.index++;const n=this.gobbleExpression();if(n||this.throwError("Expected expression"),t.node={type:"ConditionalExpression",test:r,consequent:s,alternate:n},r.operator&&e.binary_ops[r.operator]<=.9){let s=r;for(;s.right.operator&&e.binary_ops[s.right.operator]<=.9;)s=s.right;t.node.test=s.right,s.right=t.node,t.node=r}}else this.throwError("Expected :")}})}};s.plugins.register(i);var o={name:"regex",init(e){e.hooks.add("gobble-token",function(t){if(47===this.code){const r=++this.index;let s=!1;for(;this.index=97&&e<=122||e>=65&&e<=90||e>=48&&e<=57))break;i+=this.char}try{n=new RegExp(s,i)}catch(e){this.throwError(e.message)}return t.node={type:e.LITERAL,value:n,raw:this.expr.slice(r-1,this.index)},t.node=this.gobbleTokenProperty(t.node),t.node}this.code===e.OBRACK_CODE?s=!0:s&&this.code===e.CBRACK_CODE&&(s=!1),this.index+=92===this.code?2:1}this.throwError("Unclosed Regex")}})}};const a={name:"assignment",assignmentOperators:new Set(["=","*=","**=","/=","%=","+=","-=","<<=",">>=",">>>=","&=","^=","|=","||=","&&=","??="]),updateOperators:[43,45],assignmentPrecedence:.9,init(e){const t=[e.IDENTIFIER,e.MEMBER_EXP];function r(e){a.assignmentOperators.has(e.operator)?(e.type="AssignmentExpression",r(e.left),r(e.right)):e.operator||Object.values(e).forEach(e=>{e&&"object"==typeof e&&r(e)})}a.assignmentOperators.forEach(t=>e.addBinaryOp(t,a.assignmentPrecedence,!0)),e.hooks.add("gobble-token",function(e){const r=this.code;a.updateOperators.some(e=>e===r&&e===this.expr.charCodeAt(this.index+1))&&(this.index+=2,e.node={type:"UpdateExpression",operator:43===r?"++":"--",argument:this.gobbleTokenProperty(this.gobbleIdentifier()),prefix:!0},e.node.argument&&t.includes(e.node.argument.type)||this.throwError(`Unexpected ${e.node.operator}`))}),e.hooks.add("after-token",function(e){if(e.node){const r=this.code;a.updateOperators.some(e=>e===r&&e===this.expr.charCodeAt(this.index+1))&&(t.includes(e.node.type)||this.throwError(`Unexpected ${e.node.operator}`),this.index+=2,e.node={type:"UpdateExpression",operator:43===r?"++":"--",argument:e.node,prefix:!1})}}),e.hooks.add("after-expression",function(e){e.node&&r(e.node)})}};s.plugins.register(o,a),s.addUnaryOp("typeof"),s.addUnaryOp("void"),s.addLiteral("null",null),s.addLiteral("undefined",void 0);const h=new Set(["constructor","__proto__","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__"]),l={evalAst(e,t){switch(e.type){case"BinaryExpression":case"LogicalExpression":return l.evalBinaryExpression(e,t);case"Compound":return l.evalCompound(e,t);case"ConditionalExpression":return l.evalConditionalExpression(e,t);case"Identifier":return l.evalIdentifier(e,t);case"Literal":return l.evalLiteral(e);case"MemberExpression":return l.evalMemberExpression(e,t);case"UnaryExpression":return l.evalUnaryExpression(e,t);case"ArrayExpression":return l.evalArrayExpression(e,t);case"CallExpression":return l.evalCallExpression(e,t);case"AssignmentExpression":return l.evalAssignmentExpression(e,t);default:throw new SyntaxError("Unexpected expression",{cause:e})}},evalBinaryExpression:(e,t)=>({"||":(e,t)=>e||t(),"&&":(e,t)=>e&&t(),"|":(e,t)=>e|t(),"^":(e,t)=>e^t(),"&":(e,t)=>e&t(),"==":(e,t)=>e==t(),"!=":(e,t)=>e!=t(),"===":(e,t)=>e===t(),"!==":(e,t)=>e!==t(),"<":(e,t)=>e":(e,t)=>e>t(),"<=":(e,t)=>e<=t(),">=":(e,t)=>e>=t(),"<<":(e,t)=>e<>":(e,t)=>e>>t(),">>>":(e,t)=>e>>>t(),"+":(e,t)=>e+t(),"-":(e,t)=>e-t(),"*":(e,t)=>e*t(),"/":(e,t)=>e/t(),"%":(e,t)=>e%t()}[e.operator](l.evalAst(e.left,t),()=>l.evalAst(e.right,t))),evalCompound(e,t){let r;for(let s=0;sl.evalAst(e.test,t)?l.evalAst(e.consequent,t):l.evalAst(e.alternate,t),evalIdentifier(e,t){if(Object.hasOwn(t,e.name))return t[e.name];throw new ReferenceError(`${e.name} is not defined`)},evalLiteral:e=>e.value,evalMemberExpression(e,t){const r=String(e.computed?l.evalAst(e.property,t):e.property.name),s=l.evalAst(e.object,t);if(null==s)throw new TypeError(`Cannot read properties of ${s} (reading '${r}')`);if(!Object.hasOwn(s,r)&&h.has(r))throw new TypeError(`Cannot read properties of ${s} (reading '${r}')`);const n=s[r];return"function"==typeof n&&n!==Function?n.bind(s):n},evalUnaryExpression:(e,t)=>({"-":e=>-l.evalAst(e,t),"!":e=>!l.evalAst(e,t),"~":e=>~l.evalAst(e,t),"+":e=>+l.evalAst(e,t),typeof:e=>typeof l.evalAst(e,t),void:e=>{l.evalAst(e,t)}}[e.operator](e.argument)),evalArrayExpression:(e,t)=>e.elements.map(e=>l.evalAst(e,t)),evalCallExpression(e,t){const r=e.arguments.map(e=>l.evalAst(e,t)),s=l.evalAst(e.callee,t);if(s===Function)throw new Error("Function constructor is disabled");return s(...r)},evalAssignmentExpression(e,t){if("Identifier"!==e.left.type)throw new SyntaxError("Invalid left-hand side in assignment");const r=e.left.name,s=l.evalAst(e.right,t);return t[r]=s,t[r]}};function c(e,t){return(e=e.slice()).push(t),e}function p(e,t){return(t=t.slice()).unshift(e),t}function u(e,t,r,s,n){try{return e&&"object"==typeof e?new d(e):new d(e,t,r,s,n)}catch(e){if(new.target)throw e;if(e&&"object"==typeof e&&"value"in e)return e.value;throw e}}class d{constructor(e,t,r,s,n){"string"==typeof e&&(n=s,s=r,r=t,t=e,e=null);const i=e&&"object"==typeof e;if(e||={},this.currResultType=void 0,this.currEval=void 0,this.currOtherTypeCallback=void 0,this.currSandbox=void 0,this._hasParentSelector=!1,this.json=e.json||r,this.path=e.path||t,this.resultType=e.resultType||"value",this.flatten=!!Object.hasOwn(e,"flatten")&&e.flatten,this.wrap=!Object.hasOwn(e,"wrap")||e.wrap,this.sandbox=e.sandbox||{},this.eval=void 0===e.eval?"safe":e.eval,this.ignoreEvalErrors=void 0!==e.ignoreEvalErrors&&e.ignoreEvalErrors,this.parent=Object.hasOwn(e,"parent")?e.parent:null,this.parentProperty=Object.hasOwn(e,"parentProperty")?e.parentProperty:null,this.callback=e.callback||s||null,this.otherTypeCallback=e.otherTypeCallback||n||function(){throw new TypeError("You must supply an otherTypeCallback callback option with the @other() operator.")},!1!==e.autostart){const s={path:i?e.path:t};i||void 0===r?"json"in e&&(s.json=e.json):s.json=r;const n=this.evaluate(s);if(!n||"object"!=typeof n){const e=new Error('JSONPath should not be called with "new" (it prevents return of (unwrapped) scalar values)');throw e.value=n,e}return n}}evaluate(e,t,r,s){let n=this.parent,i=this.parentProperty,{flatten:o,wrap:a}=this;if(this.currResultType=this.resultType,this.currEval=this.eval,this.currSandbox=this.sandbox,r||=this.callback,this.currOtherTypeCallback=s||this.otherTypeCallback,e&&"object"==typeof e&&!Array.isArray(e)){const s=e;if(!s.path&&""!==s.path)throw new TypeError('You must supply a "path" property when providing an object argument to JSONPath.evaluate().');if(!Object.hasOwn(s,"json"))throw new TypeError('You must supply a "json" property when providing an object argument to JSONPath.evaluate().');({json:t}=s),o=Object.hasOwn(s,"flatten")?s.flatten:o,this.currResultType=Object.hasOwn(s,"resultType")?s.resultType:this.currResultType,this.currSandbox=Object.hasOwn(s,"sandbox")?s.sandbox:this.currSandbox,a=Object.hasOwn(s,"wrap")?s.wrap:a,this.currEval=Object.hasOwn(s,"eval")?s.eval:this.currEval,r=Object.hasOwn(s,"callback")?s.callback:r,this.currOtherTypeCallback=Object.hasOwn(s,"otherTypeCallback")?s.otherTypeCallback:this.currOtherTypeCallback,n=Object.hasOwn(s,"parent")?s.parent:n,i=Object.hasOwn(s,"parentProperty")?s.parentProperty:i,e=s.path}else t||=this.json,e||=this.path;if(n||=null,i||=null,Array.isArray(e)&&(e=u.toPathString(e)),!t||!e&&""!==e)return;const h=u.toPathArray(e);"$"===h[0]&&h.length>1&&h.shift(),this._hasParentSelector=!1;const l=this._trace(h,t,["$"],n,i,r??void 0,void 0),c=(Array.isArray(l)?l:[l]).filter(e=>e&&!e.isParentSelector);if(!c.length)return a?[]:void 0;if(!a&&1===c.length&&!c[0].hasArrExpr){return this._getPreferredOutput(c[0])}return c.reduce((e,t)=>{const r=this._getPreferredOutput(t);return o&&Array.isArray(r)?e=e.concat(r):e.push(r),e},[])}_getPreferredOutput(e){const t=this.currResultType;switch(t){case"all":{const t=Array.isArray(e.path)?e.path:u.toPathArray(e.path);return e.pointer=u.toPointer(t),e.path="string"==typeof e.path?e.path:u.toPathString(e.path),e}case"value":case"parent":case"parentProperty":return e[t];case"path":return"string"==typeof e.path?e.path:u.toPathString(e.path);case"pointer":{const t=Array.isArray(e.path)?e.path:u.toPathArray(e.path);return u.toPointer(t)}default:throw new TypeError("Unknown result type")}}_handleCallback(e,t,r){if(!t)return;const s=this._getPreferredOutput(e);Array.isArray(e.path)&&(e.path=u.toPathString(e.path)),t(s,r,e)}_trace(e,t,r,s,n,i,o,a){let h;if(!e.length)return h={path:r,value:t,parent:s,parentProperty:n,hasArrExpr:o},this._handleCallback(h,i,"value"),h;const l=e[0],u=e.slice(1),d=[];function f(e){Array.isArray(e)?e.forEach(e=>{d.push(e)}):d.push(e)}if(t&&("string"!=typeof l||a)&&Object.hasOwn(t,l)){const e=t;f(this._trace(u,e[l],c(r,l),t,l,i,o))}else if("*"===l)this._walk(t,e=>{const s=t;f(this._trace(u,s[e],c(r,e),t,e,i,!0,!0))});else if(".."===l)f(this._trace(u,t,r,s,n,i,o)),this._walk(t,s=>{const n=t;"object"==typeof n[s]&&f(this._trace(e.slice(),n[s],c(r,s),t,s,i,!0))});else{if("^"===l)return this._hasParentSelector=!0,{path:r.slice(0,-1),expr:u,isParentSelector:!0,value:void 0,parent:void 0,parentProperty:null};if("~"===l)return h={path:c(r,l),value:n,parent:s,parentProperty:null},this._handleCallback(h,i,"property"),h;if("$"===l)f(this._trace(u,t,r,null,null,i,o));else if(/^(-?\d*):(-?\d*):?(\d*)$/u.test(l)){const e=this._slice(l,u,t,r,s,n,i);e&&f(e)}else if(0===l.indexOf("?(")){if(!1===this.currEval)throw new Error("Eval [?(expr)] prevented in JSONPath expression.");const e=l.replace(/^\?\((.*?)\)$/u,"$1"),o=/@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu.exec(e);if(o)this._walk(t,e=>{const a=[o[2]],h=t,l=o[1]?h[e][o[1]]:h[e],p=this._trace(a,l,r,s,n,i,!0);(Array.isArray(p)?p:[p]).length>0&&f(this._trace(u,h[e],c(r,e),t,e,i,!0))});else{const o=t;this._walk(t,a=>{this._eval(e,o[a],a,r,s,n)&&f(this._trace(u,o[a],c(r,a),t,a,i,!0))})}}else if("("===l[0]){if(!1===this.currEval)throw new Error("Eval [(expr)] prevented in JSONPath expression.");const e=this._eval(l,t,r.at(-1),r.slice(0,-1),s,n),a=void 0!==e?e:"";f(this._trace(p(a,u),t,r,s,n,i,o))}else if("@"===l[0]){let e=!1;const o=l.slice(1,-2);switch(o){case"scalar":t&&["object","function"].includes(typeof t)||(e=!0);break;case"boolean":case"string":case"undefined":case"function":typeof t===o&&(e=!0);break;case"integer":!Number.isFinite(t)||t%1||(e=!0);break;case"number":Number.isFinite(t)&&(e=!0);break;case"nonFinite":"number"!=typeof t||Number.isFinite(t)||(e=!0);break;case"object":t&&typeof t===o&&(e=!0);break;case"array":Array.isArray(t)&&(e=!0);break;case"other":e=this.currOtherTypeCallback?.(t,r,s,n)??!1;break;case"null":null===t&&(e=!0);break;default:throw new TypeError("Unknown value type "+o)}if(e)return h={path:r,value:t,parent:s,parentProperty:n},this._handleCallback(h,i,"value"),h}else if(t&&"`"===l[0]&&Object.hasOwn(t,l.slice(1))){const e=l.slice(1),s=t;f(this._trace(u,s[e],c(r,e),t,e,i,o,!0))}else if(l.includes(",")){const e=l.split(",");for(const o of e)f(this._trace(p(o,u),t,r,s,n,i,!0))}else if(!a&&t&&Object.hasOwn(t,l)){const e=t;f(this._trace(u,e[l],c(r,l),t,l,i,o,!0))}}if(this._hasParentSelector)for(let e=0;e{t(e)})}_slice(e,t,r,s,n,i,o){if(!Array.isArray(r))return;const a=r.length,h=e.split(":"),l=h[2]&&Number(h[2])||1;let c=h[0]&&Number(h[0])||0,u=h[1]?Number(h[1]):a;c=c<0?Math.max(0,c+a):Math.min(a,c),u=u<0?Math.max(0,u+a):Math.min(a,u);const d=[];for(let e=c;e{d.push(e)})}return d}_eval(e,t,r,s,n,i){this.currSandbox&&(this.currSandbox._$_parentProperty=i,this.currSandbox._$_parent=n,this.currSandbox._$_property=r,this.currSandbox._$_root=this.json,this.currSandbox._$_v=t);const o=e.includes("@path");if(o){(this.currSandbox??{})._$_path=u.toPathString(s.concat([r]))}const a=this.currEval+"Script:"+e;if(!Object.hasOwn(u.cache,a)){let t=e.replaceAll("@parentProperty","_$_parentProperty").replaceAll("@parent","_$_parent").replaceAll("@property","_$_property").replaceAll("@root","_$_root").replaceAll(/@([.\s)[])/gu,"_$_v$1");o&&(t=t.replaceAll("@path","_$_path"));const r=this.currEval;if(["safe",!0,void 0].includes(r)){const{cache:e}=u;e[a]=new this.safeVm.Script(t)}else if("native"===this.currEval){const{cache:e}=u;e[a]=new this.vm.Script(t)}else if("function"==typeof this.currEval&&this.currEval.prototype&&Object.hasOwn(this.currEval.prototype,"runInNewContext")){const e=this.currEval,{cache:r}=u;r[a]=new e(t)}else{if("function"!=typeof this.currEval)throw new TypeError(`Unknown "eval" property "${this.currEval}"`);{const{cache:e}=u,r=this.currEval;e[a]={runInNewContext:e=>r(t,e)}}}}try{const{cache:e}=u;return e[a].runInNewContext(this.currSandbox)}catch(t){if(this.ignoreEvalErrors)return!1;throw new Error("jsonPath: "+t.message+": "+e,{cause:t})}}}d.prototype.safeVm={Script:class{constructor(e){this.code=e,this.ast=s(this.code)}runInNewContext(e){const t=Object.assign(Object.create(null),e);return l.evalAst(this.ast,t)}}},u.prototype=d.prototype,u.cache={},u.toPathString=function(e){const t=e,r=t.length;let s="$";for(let e=1;e"function"==typeof e[t]);const n=r.map(t=>e[t]);t=s.reduce((t,r)=>{let s=e[r].toString();return/function/u.test(s)||(s="function "+s),"var "+r+"="+s+";"+t},"")+t,/(['"])use strict\1/u.test(t)||r.includes("arguments")||(t="var arguments = undefined;"+t),t=t.replace(/;\s*$/u,"");const i=t.lastIndexOf(";"),o=-1!==i?t.slice(0,i+1)+" return "+t.slice(i+1):" return "+t;return new Function(...r,o)(...n)}}d.prototype.vm={Script:f},e.JSONPath=u,e.JSONPathClass=d,e.Script=f}); //# sourceMappingURL=index-browser-umd.min.cjs.map diff --git a/dist/index-browser-umd.min.cjs.map b/dist/index-browser-umd.min.cjs.map index 1752f88c..f5b67eb1 100644 --- a/dist/index-browser-umd.min.cjs.map +++ b/dist/index-browser-umd.min.cjs.map @@ -1 +1 @@ -{"version":3,"file":"index-browser-umd.min.cjs","sources":["../node_modules/.pnpm/jsep@1.4.0/node_modules/jsep/dist/jsep.js","../node_modules/.pnpm/@jsep-plugin+regex@1.0.4_jsep@1.4.0/node_modules/@jsep-plugin/regex/dist/index.js","../node_modules/.pnpm/@jsep-plugin+assignment@1.3.0_jsep@1.4.0/node_modules/@jsep-plugin/assignment/dist/index.js","../src/Safe-Script.js","../src/jsonpath.js","../src/jsonpath-browser.js"],"sourcesContent":["/**\n * @implements {IHooks}\n */\nclass Hooks {\n\t/**\n\t * @callback HookCallback\n\t * @this {*|Jsep} this\n\t * @param {Jsep} env\n\t * @returns: void\n\t */\n\t/**\n\t * Adds the given callback to the list of callbacks for the given hook.\n\t *\n\t * The callback will be invoked when the hook it is registered for is run.\n\t *\n\t * One callback function can be registered to multiple hooks and the same hook multiple times.\n\t *\n\t * @param {string|object} name The name of the hook, or an object of callbacks keyed by name\n\t * @param {HookCallback|boolean} callback The callback function which is given environment variables.\n\t * @param {?boolean} [first=false] Will add the hook to the top of the list (defaults to the bottom)\n\t * @public\n\t */\n\tadd(name, callback, first) {\n\t\tif (typeof arguments[0] != 'string') {\n\t\t\t// Multiple hook callbacks, keyed by name\n\t\t\tfor (let name in arguments[0]) {\n\t\t\t\tthis.add(name, arguments[0][name], arguments[1]);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t(Array.isArray(name) ? name : [name]).forEach(function (name) {\n\t\t\t\tthis[name] = this[name] || [];\n\n\t\t\t\tif (callback) {\n\t\t\t\t\tthis[name][first ? 'unshift' : 'push'](callback);\n\t\t\t\t}\n\t\t\t}, this);\n\t\t}\n\t}\n\n\t/**\n\t * Runs a hook invoking all registered callbacks with the given environment variables.\n\t *\n\t * Callbacks will be invoked synchronously and in the order in which they were registered.\n\t *\n\t * @param {string} name The name of the hook.\n\t * @param {Object} env The environment variables of the hook passed to all callbacks registered.\n\t * @public\n\t */\n\trun(name, env) {\n\t\tthis[name] = this[name] || [];\n\t\tthis[name].forEach(function (callback) {\n\t\t\tcallback.call(env && env.context ? env.context : env, env);\n\t\t});\n\t}\n}\n\n/**\n * @implements {IPlugins}\n */\nclass Plugins {\n\tconstructor(jsep) {\n\t\tthis.jsep = jsep;\n\t\tthis.registered = {};\n\t}\n\n\t/**\n\t * @callback PluginSetup\n\t * @this {Jsep} jsep\n\t * @returns: void\n\t */\n\t/**\n\t * Adds the given plugin(s) to the registry\n\t *\n\t * @param {object} plugins\n\t * @param {string} plugins.name The name of the plugin\n\t * @param {PluginSetup} plugins.init The init function\n\t * @public\n\t */\n\tregister(...plugins) {\n\t\tplugins.forEach((plugin) => {\n\t\t\tif (typeof plugin !== 'object' || !plugin.name || !plugin.init) {\n\t\t\t\tthrow new Error('Invalid JSEP plugin format');\n\t\t\t}\n\t\t\tif (this.registered[plugin.name]) {\n\t\t\t\t// already registered. Ignore.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tplugin.init(this.jsep);\n\t\t\tthis.registered[plugin.name] = plugin;\n\t\t});\n\t}\n}\n\n// JavaScript Expression Parser (JSEP) 1.4.0\n\nclass Jsep {\n\t/**\n\t * @returns {string}\n\t */\n\tstatic get version() {\n\t\t// To be filled in by the template\n\t\treturn '1.4.0';\n\t}\n\n\t/**\n\t * @returns {string}\n\t */\n\tstatic toString() {\n\t\treturn 'JavaScript Expression Parser (JSEP) v' + Jsep.version;\n\t};\n\n\t// ==================== CONFIG ================================\n\t/**\n\t * @method addUnaryOp\n\t * @param {string} op_name The name of the unary op to add\n\t * @returns {Jsep}\n\t */\n\tstatic addUnaryOp(op_name) {\n\t\tJsep.max_unop_len = Math.max(op_name.length, Jsep.max_unop_len);\n\t\tJsep.unary_ops[op_name] = 1;\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method jsep.addBinaryOp\n\t * @param {string} op_name The name of the binary op to add\n\t * @param {number} precedence The precedence of the binary op (can be a float). Higher number = higher precedence\n\t * @param {boolean} [isRightAssociative=false] whether operator is right-associative\n\t * @returns {Jsep}\n\t */\n\tstatic addBinaryOp(op_name, precedence, isRightAssociative) {\n\t\tJsep.max_binop_len = Math.max(op_name.length, Jsep.max_binop_len);\n\t\tJsep.binary_ops[op_name] = precedence;\n\t\tif (isRightAssociative) {\n\t\t\tJsep.right_associative.add(op_name);\n\t\t}\n\t\telse {\n\t\t\tJsep.right_associative.delete(op_name);\n\t\t}\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method addIdentifierChar\n\t * @param {string} char The additional character to treat as a valid part of an identifier\n\t * @returns {Jsep}\n\t */\n\tstatic addIdentifierChar(char) {\n\t\tJsep.additional_identifier_chars.add(char);\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method addLiteral\n\t * @param {string} literal_name The name of the literal to add\n\t * @param {*} literal_value The value of the literal\n\t * @returns {Jsep}\n\t */\n\tstatic addLiteral(literal_name, literal_value) {\n\t\tJsep.literals[literal_name] = literal_value;\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeUnaryOp\n\t * @param {string} op_name The name of the unary op to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeUnaryOp(op_name) {\n\t\tdelete Jsep.unary_ops[op_name];\n\t\tif (op_name.length === Jsep.max_unop_len) {\n\t\t\tJsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);\n\t\t}\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllUnaryOps\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllUnaryOps() {\n\t\tJsep.unary_ops = {};\n\t\tJsep.max_unop_len = 0;\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeIdentifierChar\n\t * @param {string} char The additional character to stop treating as a valid part of an identifier\n\t * @returns {Jsep}\n\t */\n\tstatic removeIdentifierChar(char) {\n\t\tJsep.additional_identifier_chars.delete(char);\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeBinaryOp\n\t * @param {string} op_name The name of the binary op to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeBinaryOp(op_name) {\n\t\tdelete Jsep.binary_ops[op_name];\n\n\t\tif (op_name.length === Jsep.max_binop_len) {\n\t\t\tJsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);\n\t\t}\n\t\tJsep.right_associative.delete(op_name);\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllBinaryOps\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllBinaryOps() {\n\t\tJsep.binary_ops = {};\n\t\tJsep.max_binop_len = 0;\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeLiteral\n\t * @param {string} literal_name The name of the literal to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeLiteral(literal_name) {\n\t\tdelete Jsep.literals[literal_name];\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllLiterals\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllLiterals() {\n\t\tJsep.literals = {};\n\n\t\treturn Jsep;\n\t}\n\t// ==================== END CONFIG ============================\n\n\n\t/**\n\t * @returns {string}\n\t */\n\tget char() {\n\t\treturn this.expr.charAt(this.index);\n\t}\n\n\t/**\n\t * @returns {number}\n\t */\n\tget code() {\n\t\treturn this.expr.charCodeAt(this.index);\n\t};\n\n\n\t/**\n\t * @param {string} expr a string with the passed in express\n\t * @returns Jsep\n\t */\n\tconstructor(expr) {\n\t\t// `index` stores the character number we are currently at\n\t\t// All of the gobbles below will modify `index` as we move along\n\t\tthis.expr = expr;\n\t\tthis.index = 0;\n\t}\n\n\t/**\n\t * static top-level parser\n\t * @returns {jsep.Expression}\n\t */\n\tstatic parse(expr) {\n\t\treturn (new Jsep(expr)).parse();\n\t}\n\n\t/**\n\t * Get the longest key length of any object\n\t * @param {object} obj\n\t * @returns {number}\n\t */\n\tstatic getMaxKeyLen(obj) {\n\t\treturn Math.max(0, ...Object.keys(obj).map(k => k.length));\n\t}\n\n\t/**\n\t * `ch` is a character code in the next three functions\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isDecimalDigit(ch) {\n\t\treturn (ch >= 48 && ch <= 57); // 0...9\n\t}\n\n\t/**\n\t * Returns the precedence of a binary operator or `0` if it isn't a binary operator. Can be float.\n\t * @param {string} op_val\n\t * @returns {number}\n\t */\n\tstatic binaryPrecedence(op_val) {\n\t\treturn Jsep.binary_ops[op_val] || 0;\n\t}\n\n\t/**\n\t * Looks for start of identifier\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isIdentifierStart(ch) {\n\t\treturn (ch >= 65 && ch <= 90) || // A...Z\n\t\t\t(ch >= 97 && ch <= 122) || // a...z\n\t\t\t(ch >= 128 && !Jsep.binary_ops[String.fromCharCode(ch)]) || // any non-ASCII that is not an operator\n\t\t\t(Jsep.additional_identifier_chars.has(String.fromCharCode(ch))); // additional characters\n\t}\n\n\t/**\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isIdentifierPart(ch) {\n\t\treturn Jsep.isIdentifierStart(ch) || Jsep.isDecimalDigit(ch);\n\t}\n\n\t/**\n\t * throw error at index of the expression\n\t * @param {string} message\n\t * @throws\n\t */\n\tthrowError(message) {\n\t\tconst error = new Error(message + ' at character ' + this.index);\n\t\terror.index = this.index;\n\t\terror.description = message;\n\t\tthrow error;\n\t}\n\n\t/**\n\t * Run a given hook\n\t * @param {string} name\n\t * @param {jsep.Expression|false} [node]\n\t * @returns {?jsep.Expression}\n\t */\n\trunHook(name, node) {\n\t\tif (Jsep.hooks[name]) {\n\t\t\tconst env = { context: this, node };\n\t\t\tJsep.hooks.run(name, env);\n\t\t\treturn env.node;\n\t\t}\n\t\treturn node;\n\t}\n\n\t/**\n\t * Runs a given hook until one returns a node\n\t * @param {string} name\n\t * @returns {?jsep.Expression}\n\t */\n\tsearchHook(name) {\n\t\tif (Jsep.hooks[name]) {\n\t\t\tconst env = { context: this };\n\t\t\tJsep.hooks[name].find(function (callback) {\n\t\t\t\tcallback.call(env.context, env);\n\t\t\t\treturn env.node;\n\t\t\t});\n\t\t\treturn env.node;\n\t\t}\n\t}\n\n\t/**\n\t * Push `index` up to the next non-space character\n\t */\n\tgobbleSpaces() {\n\t\tlet ch = this.code;\n\t\t// Whitespace\n\t\twhile (ch === Jsep.SPACE_CODE\n\t\t|| ch === Jsep.TAB_CODE\n\t\t|| ch === Jsep.LF_CODE\n\t\t|| ch === Jsep.CR_CODE) {\n\t\t\tch = this.expr.charCodeAt(++this.index);\n\t\t}\n\t\tthis.runHook('gobble-spaces');\n\t}\n\n\t/**\n\t * Top-level method to parse all expressions and returns compound or single node\n\t * @returns {jsep.Expression}\n\t */\n\tparse() {\n\t\tthis.runHook('before-all');\n\t\tconst nodes = this.gobbleExpressions();\n\n\t\t// If there's only one expression just try returning the expression\n\t\tconst node = nodes.length === 1\n\t\t ? nodes[0]\n\t\t\t: {\n\t\t\t\ttype: Jsep.COMPOUND,\n\t\t\t\tbody: nodes\n\t\t\t};\n\t\treturn this.runHook('after-all', node);\n\t}\n\n\t/**\n\t * top-level parser (but can be reused within as well)\n\t * @param {number} [untilICode]\n\t * @returns {jsep.Expression[]}\n\t */\n\tgobbleExpressions(untilICode) {\n\t\tlet nodes = [], ch_i, node;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tch_i = this.code;\n\n\t\t\t// Expressions can be separated by semicolons, commas, or just inferred without any\n\t\t\t// separators\n\t\t\tif (ch_i === Jsep.SEMCOL_CODE || ch_i === Jsep.COMMA_CODE) {\n\t\t\t\tthis.index++; // ignore separators\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Try to gobble each expression individually\n\t\t\t\tif (node = this.gobbleExpression()) {\n\t\t\t\t\tnodes.push(node);\n\t\t\t\t\t// If we weren't able to find a binary expression and are out of room, then\n\t\t\t\t\t// the expression passed in probably has too much\n\t\t\t\t}\n\t\t\t\telse if (this.index < this.expr.length) {\n\t\t\t\t\tif (ch_i === untilICode) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tthis.throwError('Unexpected \"' + this.char + '\"');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn nodes;\n\t}\n\n\t/**\n\t * The main parsing function.\n\t * @returns {?jsep.Expression}\n\t */\n\tgobbleExpression() {\n\t\tconst node = this.searchHook('gobble-expression') || this.gobbleBinaryExpression();\n\t\tthis.gobbleSpaces();\n\n\t\treturn this.runHook('after-expression', node);\n\t}\n\n\t/**\n\t * Search for the operation portion of the string (e.g. `+`, `===`)\n\t * Start by taking the longest possible binary operations (3 characters: `===`, `!==`, `>>>`)\n\t * and move down from 3 to 2 to 1 character until a matching binary operation is found\n\t * then, return that binary operation\n\t * @returns {string|boolean}\n\t */\n\tgobbleBinaryOp() {\n\t\tthis.gobbleSpaces();\n\t\tlet to_check = this.expr.substr(this.index, Jsep.max_binop_len);\n\t\tlet tc_len = to_check.length;\n\n\t\twhile (tc_len > 0) {\n\t\t\t// Don't accept a binary op when it is an identifier.\n\t\t\t// Binary ops that start with a identifier-valid character must be followed\n\t\t\t// by a non identifier-part valid character\n\t\t\tif (Jsep.binary_ops.hasOwnProperty(to_check) && (\n\t\t\t\t!Jsep.isIdentifierStart(this.code) ||\n\t\t\t\t(this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))\n\t\t\t)) {\n\t\t\t\tthis.index += tc_len;\n\t\t\t\treturn to_check;\n\t\t\t}\n\t\t\tto_check = to_check.substr(0, --tc_len);\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * This function is responsible for gobbling an individual expression,\n\t * e.g. `1`, `1+2`, `a+(b*2)-Math.sqrt(2)`\n\t * @returns {?jsep.BinaryExpression}\n\t */\n\tgobbleBinaryExpression() {\n\t\tlet node, biop, prec, stack, biop_info, left, right, i, cur_biop;\n\n\t\t// First, try to get the leftmost thing\n\t\t// Then, check to see if there's a binary operator operating on that leftmost thing\n\t\t// Don't gobbleBinaryOp without a left-hand-side\n\t\tleft = this.gobbleToken();\n\t\tif (!left) {\n\t\t\treturn left;\n\t\t}\n\t\tbiop = this.gobbleBinaryOp();\n\n\t\t// If there wasn't a binary operator, just return the leftmost node\n\t\tif (!biop) {\n\t\t\treturn left;\n\t\t}\n\n\t\t// Otherwise, we need to start a stack to properly place the binary operations in their\n\t\t// precedence structure\n\t\tbiop_info = { value: biop, prec: Jsep.binaryPrecedence(biop), right_a: Jsep.right_associative.has(biop) };\n\n\t\tright = this.gobbleToken();\n\n\t\tif (!right) {\n\t\t\tthis.throwError(\"Expected expression after \" + biop);\n\t\t}\n\n\t\tstack = [left, biop_info, right];\n\n\t\t// Properly deal with precedence using [recursive descent](http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm)\n\t\twhile ((biop = this.gobbleBinaryOp())) {\n\t\t\tprec = Jsep.binaryPrecedence(biop);\n\n\t\t\tif (prec === 0) {\n\t\t\t\tthis.index -= biop.length;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbiop_info = { value: biop, prec, right_a: Jsep.right_associative.has(biop) };\n\n\t\t\tcur_biop = biop;\n\n\t\t\t// Reduce: make a binary expression from the three topmost entries.\n\t\t\tconst comparePrev = prev => biop_info.right_a && prev.right_a\n\t\t\t\t? prec > prev.prec\n\t\t\t\t: prec <= prev.prec;\n\t\t\twhile ((stack.length > 2) && comparePrev(stack[stack.length - 2])) {\n\t\t\t\tright = stack.pop();\n\t\t\t\tbiop = stack.pop().value;\n\t\t\t\tleft = stack.pop();\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.BINARY_EXP,\n\t\t\t\t\toperator: biop,\n\t\t\t\t\tleft,\n\t\t\t\t\tright\n\t\t\t\t};\n\t\t\t\tstack.push(node);\n\t\t\t}\n\n\t\t\tnode = this.gobbleToken();\n\n\t\t\tif (!node) {\n\t\t\t\tthis.throwError(\"Expected expression after \" + cur_biop);\n\t\t\t}\n\n\t\t\tstack.push(biop_info, node);\n\t\t}\n\n\t\ti = stack.length - 1;\n\t\tnode = stack[i];\n\n\t\twhile (i > 1) {\n\t\t\tnode = {\n\t\t\t\ttype: Jsep.BINARY_EXP,\n\t\t\t\toperator: stack[i - 1].value,\n\t\t\t\tleft: stack[i - 2],\n\t\t\t\tright: node\n\t\t\t};\n\t\t\ti -= 2;\n\t\t}\n\n\t\treturn node;\n\t}\n\n\t/**\n\t * An individual part of a binary expression:\n\t * e.g. `foo.bar(baz)`, `1`, `\"abc\"`, `(a % 2)` (because it's in parenthesis)\n\t * @returns {boolean|jsep.Expression}\n\t */\n\tgobbleToken() {\n\t\tlet ch, to_check, tc_len, node;\n\n\t\tthis.gobbleSpaces();\n\t\tnode = this.searchHook('gobble-token');\n\t\tif (node) {\n\t\t\treturn this.runHook('after-token', node);\n\t\t}\n\n\t\tch = this.code;\n\n\t\tif (Jsep.isDecimalDigit(ch) || ch === Jsep.PERIOD_CODE) {\n\t\t\t// Char code 46 is a dot `.` which can start off a numeric literal\n\t\t\treturn this.gobbleNumericLiteral();\n\t\t}\n\n\t\tif (ch === Jsep.SQUOTE_CODE || ch === Jsep.DQUOTE_CODE) {\n\t\t\t// Single or double quotes\n\t\t\tnode = this.gobbleStringLiteral();\n\t\t}\n\t\telse if (ch === Jsep.OBRACK_CODE) {\n\t\t\tnode = this.gobbleArray();\n\t\t}\n\t\telse {\n\t\t\tto_check = this.expr.substr(this.index, Jsep.max_unop_len);\n\t\t\ttc_len = to_check.length;\n\n\t\t\twhile (tc_len > 0) {\n\t\t\t\t// Don't accept an unary op when it is an identifier.\n\t\t\t\t// Unary ops that start with a identifier-valid character must be followed\n\t\t\t\t// by a non identifier-part valid character\n\t\t\t\tif (Jsep.unary_ops.hasOwnProperty(to_check) && (\n\t\t\t\t\t!Jsep.isIdentifierStart(this.code) ||\n\t\t\t\t\t(this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))\n\t\t\t\t)) {\n\t\t\t\t\tthis.index += tc_len;\n\t\t\t\t\tconst argument = this.gobbleToken();\n\t\t\t\t\tif (!argument) {\n\t\t\t\t\t\tthis.throwError('missing unaryOp argument');\n\t\t\t\t\t}\n\t\t\t\t\treturn this.runHook('after-token', {\n\t\t\t\t\t\ttype: Jsep.UNARY_EXP,\n\t\t\t\t\t\toperator: to_check,\n\t\t\t\t\t\targument,\n\t\t\t\t\t\tprefix: true\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tto_check = to_check.substr(0, --tc_len);\n\t\t\t}\n\n\t\t\tif (Jsep.isIdentifierStart(ch)) {\n\t\t\t\tnode = this.gobbleIdentifier();\n\t\t\t\tif (Jsep.literals.hasOwnProperty(node.name)) {\n\t\t\t\t\tnode = {\n\t\t\t\t\t\ttype: Jsep.LITERAL,\n\t\t\t\t\t\tvalue: Jsep.literals[node.name],\n\t\t\t\t\t\traw: node.name,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse if (node.name === Jsep.this_str) {\n\t\t\t\t\tnode = { type: Jsep.THIS_EXP };\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ch === Jsep.OPAREN_CODE) { // open parenthesis\n\t\t\t\tnode = this.gobbleGroup();\n\t\t\t}\n\t\t}\n\n\t\tif (!node) {\n\t\t\treturn this.runHook('after-token', false);\n\t\t}\n\n\t\tnode = this.gobbleTokenProperty(node);\n\t\treturn this.runHook('after-token', node);\n\t}\n\n\t/**\n\t * Gobble properties of of identifiers/strings/arrays/groups.\n\t * e.g. `foo`, `bar.baz`, `foo['bar'].baz`\n\t * It also gobbles function calls:\n\t * e.g. `Math.acos(obj.angle)`\n\t * @param {jsep.Expression} node\n\t * @returns {jsep.Expression}\n\t */\n\tgobbleTokenProperty(node) {\n\t\tthis.gobbleSpaces();\n\n\t\tlet ch = this.code;\n\t\twhile (ch === Jsep.PERIOD_CODE || ch === Jsep.OBRACK_CODE || ch === Jsep.OPAREN_CODE || ch === Jsep.QUMARK_CODE) {\n\t\t\tlet optional;\n\t\t\tif (ch === Jsep.QUMARK_CODE) {\n\t\t\t\tif (this.expr.charCodeAt(this.index + 1) !== Jsep.PERIOD_CODE) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\toptional = true;\n\t\t\t\tthis.index += 2;\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tch = this.code;\n\t\t\t}\n\t\t\tthis.index++;\n\n\t\t\tif (ch === Jsep.OBRACK_CODE) {\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.MEMBER_EXP,\n\t\t\t\t\tcomputed: true,\n\t\t\t\t\tobject: node,\n\t\t\t\t\tproperty: this.gobbleExpression()\n\t\t\t\t};\n\t\t\t\tif (!node.property) {\n\t\t\t\t\tthis.throwError('Unexpected \"' + this.char + '\"');\n\t\t\t\t}\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tch = this.code;\n\t\t\t\tif (ch !== Jsep.CBRACK_CODE) {\n\t\t\t\t\tthis.throwError('Unclosed [');\n\t\t\t\t}\n\t\t\t\tthis.index++;\n\t\t\t}\n\t\t\telse if (ch === Jsep.OPAREN_CODE) {\n\t\t\t\t// A function call is being made; gobble all the arguments\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.CALL_EXP,\n\t\t\t\t\t'arguments': this.gobbleArguments(Jsep.CPAREN_CODE),\n\t\t\t\t\tcallee: node\n\t\t\t\t};\n\t\t\t}\n\t\t\telse if (ch === Jsep.PERIOD_CODE || optional) {\n\t\t\t\tif (optional) {\n\t\t\t\t\tthis.index--;\n\t\t\t\t}\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.MEMBER_EXP,\n\t\t\t\t\tcomputed: false,\n\t\t\t\t\tobject: node,\n\t\t\t\t\tproperty: this.gobbleIdentifier(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (optional) {\n\t\t\t\tnode.optional = true;\n\t\t\t} // else leave undefined for compatibility with esprima\n\n\t\t\tthis.gobbleSpaces();\n\t\t\tch = this.code;\n\t\t}\n\n\t\treturn node;\n\t}\n\n\t/**\n\t * Parse simple numeric literals: `12`, `3.4`, `.5`. Do this by using a string to\n\t * keep track of everything in the numeric literal and then calling `parseFloat` on that string\n\t * @returns {jsep.Literal}\n\t */\n\tgobbleNumericLiteral() {\n\t\tlet number = '', ch, chCode;\n\n\t\twhile (Jsep.isDecimalDigit(this.code)) {\n\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t}\n\n\t\tif (this.code === Jsep.PERIOD_CODE) { // can start with a decimal marker\n\t\t\tnumber += this.expr.charAt(this.index++);\n\n\t\t\twhile (Jsep.isDecimalDigit(this.code)) {\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\t\t}\n\n\t\tch = this.char;\n\n\t\tif (ch === 'e' || ch === 'E') { // exponent marker\n\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\tch = this.char;\n\n\t\t\tif (ch === '+' || ch === '-') { // exponent sign\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\n\t\t\twhile (Jsep.isDecimalDigit(this.code)) { // exponent itself\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\n\t\t\tif (!Jsep.isDecimalDigit(this.expr.charCodeAt(this.index - 1)) ) {\n\t\t\t\tthis.throwError('Expected exponent (' + number + this.char + ')');\n\t\t\t}\n\t\t}\n\n\t\tchCode = this.code;\n\n\t\t// Check to make sure this isn't a variable name that start with a number (123abc)\n\t\tif (Jsep.isIdentifierStart(chCode)) {\n\t\t\tthis.throwError('Variable names cannot start with a number (' +\n\t\t\t\tnumber + this.char + ')');\n\t\t}\n\t\telse if (chCode === Jsep.PERIOD_CODE || (number.length === 1 && number.charCodeAt(0) === Jsep.PERIOD_CODE)) {\n\t\t\tthis.throwError('Unexpected period');\n\t\t}\n\n\t\treturn {\n\t\t\ttype: Jsep.LITERAL,\n\t\t\tvalue: parseFloat(number),\n\t\t\traw: number\n\t\t};\n\t}\n\n\t/**\n\t * Parses a string literal, staring with single or double quotes with basic support for escape codes\n\t * e.g. `\"hello world\"`, `'this is\\nJSEP'`\n\t * @returns {jsep.Literal}\n\t */\n\tgobbleStringLiteral() {\n\t\tlet str = '';\n\t\tconst startIndex = this.index;\n\t\tconst quote = this.expr.charAt(this.index++);\n\t\tlet closed = false;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tlet ch = this.expr.charAt(this.index++);\n\n\t\t\tif (ch === quote) {\n\t\t\t\tclosed = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (ch === '\\\\') {\n\t\t\t\t// Check for all of the common escape codes\n\t\t\t\tch = this.expr.charAt(this.index++);\n\n\t\t\t\tswitch (ch) {\n\t\t\t\t\tcase 'n': str += '\\n'; break;\n\t\t\t\t\tcase 'r': str += '\\r'; break;\n\t\t\t\t\tcase 't': str += '\\t'; break;\n\t\t\t\t\tcase 'b': str += '\\b'; break;\n\t\t\t\t\tcase 'f': str += '\\f'; break;\n\t\t\t\t\tcase 'v': str += '\\x0B'; break;\n\t\t\t\t\tdefault : str += ch;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tstr += ch;\n\t\t\t}\n\t\t}\n\n\t\tif (!closed) {\n\t\t\tthis.throwError('Unclosed quote after \"' + str + '\"');\n\t\t}\n\n\t\treturn {\n\t\t\ttype: Jsep.LITERAL,\n\t\t\tvalue: str,\n\t\t\traw: this.expr.substring(startIndex, this.index),\n\t\t};\n\t}\n\n\t/**\n\t * Gobbles only identifiers\n\t * e.g.: `foo`, `_value`, `$x1`\n\t * Also, this function checks if that identifier is a literal:\n\t * (e.g. `true`, `false`, `null`) or `this`\n\t * @returns {jsep.Identifier}\n\t */\n\tgobbleIdentifier() {\n\t\tlet ch = this.code, start = this.index;\n\n\t\tif (Jsep.isIdentifierStart(ch)) {\n\t\t\tthis.index++;\n\t\t}\n\t\telse {\n\t\t\tthis.throwError('Unexpected ' + this.char);\n\t\t}\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tch = this.code;\n\n\t\t\tif (Jsep.isIdentifierPart(ch)) {\n\t\t\t\tthis.index++;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\ttype: Jsep.IDENTIFIER,\n\t\t\tname: this.expr.slice(start, this.index),\n\t\t};\n\t}\n\n\t/**\n\t * Gobbles a list of arguments within the context of a function call\n\t * or array literal. This function also assumes that the opening character\n\t * `(` or `[` has already been gobbled, and gobbles expressions and commas\n\t * until the terminator character `)` or `]` is encountered.\n\t * e.g. `foo(bar, baz)`, `my_func()`, or `[bar, baz]`\n\t * @param {number} termination\n\t * @returns {jsep.Expression[]}\n\t */\n\tgobbleArguments(termination) {\n\t\tconst args = [];\n\t\tlet closed = false;\n\t\tlet separator_count = 0;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tthis.gobbleSpaces();\n\t\t\tlet ch_i = this.code;\n\n\t\t\tif (ch_i === termination) { // done parsing\n\t\t\t\tclosed = true;\n\t\t\t\tthis.index++;\n\n\t\t\t\tif (termination === Jsep.CPAREN_CODE && separator_count && separator_count >= args.length){\n\t\t\t\t\tthis.throwError('Unexpected token ' + String.fromCharCode(termination));\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (ch_i === Jsep.COMMA_CODE) { // between expressions\n\t\t\t\tthis.index++;\n\t\t\t\tseparator_count++;\n\n\t\t\t\tif (separator_count !== args.length) { // missing argument\n\t\t\t\t\tif (termination === Jsep.CPAREN_CODE) {\n\t\t\t\t\t\tthis.throwError('Unexpected token ,');\n\t\t\t\t\t}\n\t\t\t\t\telse if (termination === Jsep.CBRACK_CODE) {\n\t\t\t\t\t\tfor (let arg = args.length; arg < separator_count; arg++) {\n\t\t\t\t\t\t\targs.push(null);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (args.length !== separator_count && separator_count !== 0) {\n\t\t\t\t// NOTE: `&& separator_count !== 0` allows for either all commas, or all spaces as arguments\n\t\t\t\tthis.throwError('Expected comma');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst node = this.gobbleExpression();\n\n\t\t\t\tif (!node || node.type === Jsep.COMPOUND) {\n\t\t\t\t\tthis.throwError('Expected comma');\n\t\t\t\t}\n\n\t\t\t\targs.push(node);\n\t\t\t}\n\t\t}\n\n\t\tif (!closed) {\n\t\t\tthis.throwError('Expected ' + String.fromCharCode(termination));\n\t\t}\n\n\t\treturn args;\n\t}\n\n\t/**\n\t * Responsible for parsing a group of things within parentheses `()`\n\t * that have no identifier in front (so not a function call)\n\t * This function assumes that it needs to gobble the opening parenthesis\n\t * and then tries to gobble everything within that parenthesis, assuming\n\t * that the next thing it should see is the close parenthesis. If not,\n\t * then the expression probably doesn't have a `)`\n\t * @returns {boolean|jsep.Expression}\n\t */\n\tgobbleGroup() {\n\t\tthis.index++;\n\t\tlet nodes = this.gobbleExpressions(Jsep.CPAREN_CODE);\n\t\tif (this.code === Jsep.CPAREN_CODE) {\n\t\t\tthis.index++;\n\t\t\tif (nodes.length === 1) {\n\t\t\t\treturn nodes[0];\n\t\t\t}\n\t\t\telse if (!nodes.length) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn {\n\t\t\t\t\ttype: Jsep.SEQUENCE_EXP,\n\t\t\t\t\texpressions: nodes,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis.throwError('Unclosed (');\n\t\t}\n\t}\n\n\t/**\n\t * Responsible for parsing Array literals `[1, 2, 3]`\n\t * This function assumes that it needs to gobble the opening bracket\n\t * and then tries to gobble the expressions as arguments.\n\t * @returns {jsep.ArrayExpression}\n\t */\n\tgobbleArray() {\n\t\tthis.index++;\n\n\t\treturn {\n\t\t\ttype: Jsep.ARRAY_EXP,\n\t\t\telements: this.gobbleArguments(Jsep.CBRACK_CODE)\n\t\t};\n\t}\n}\n\n// Static fields:\nconst hooks = new Hooks();\nObject.assign(Jsep, {\n\thooks,\n\tplugins: new Plugins(Jsep),\n\n\t// Node Types\n\t// ----------\n\t// This is the full set of types that any JSEP node can be.\n\t// Store them here to save space when minified\n\tCOMPOUND: 'Compound',\n\tSEQUENCE_EXP: 'SequenceExpression',\n\tIDENTIFIER: 'Identifier',\n\tMEMBER_EXP: 'MemberExpression',\n\tLITERAL: 'Literal',\n\tTHIS_EXP: 'ThisExpression',\n\tCALL_EXP: 'CallExpression',\n\tUNARY_EXP: 'UnaryExpression',\n\tBINARY_EXP: 'BinaryExpression',\n\tARRAY_EXP: 'ArrayExpression',\n\n\tTAB_CODE: 9,\n\tLF_CODE: 10,\n\tCR_CODE: 13,\n\tSPACE_CODE: 32,\n\tPERIOD_CODE: 46, // '.'\n\tCOMMA_CODE: 44, // ','\n\tSQUOTE_CODE: 39, // single quote\n\tDQUOTE_CODE: 34, // double quotes\n\tOPAREN_CODE: 40, // (\n\tCPAREN_CODE: 41, // )\n\tOBRACK_CODE: 91, // [\n\tCBRACK_CODE: 93, // ]\n\tQUMARK_CODE: 63, // ?\n\tSEMCOL_CODE: 59, // ;\n\tCOLON_CODE: 58, // :\n\n\n\t// Operations\n\t// ----------\n\t// Use a quickly-accessible map to store all of the unary operators\n\t// Values are set to `1` (it really doesn't matter)\n\tunary_ops: {\n\t\t'-': 1,\n\t\t'!': 1,\n\t\t'~': 1,\n\t\t'+': 1\n\t},\n\n\t// Also use a map for the binary operations but set their values to their\n\t// binary precedence for quick reference (higher number = higher precedence)\n\t// see [Order of operations](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)\n\tbinary_ops: {\n\t\t'||': 1, '??': 1,\n\t\t'&&': 2, '|': 3, '^': 4, '&': 5,\n\t\t'==': 6, '!=': 6, '===': 6, '!==': 6,\n\t\t'<': 7, '>': 7, '<=': 7, '>=': 7,\n\t\t'<<': 8, '>>': 8, '>>>': 8,\n\t\t'+': 9, '-': 9,\n\t\t'*': 10, '/': 10, '%': 10,\n\t\t'**': 11,\n\t},\n\n\t// sets specific binary_ops as right-associative\n\tright_associative: new Set(['**']),\n\n\t// Additional valid identifier chars, apart from a-z, A-Z and 0-9 (except on the starting char)\n\tadditional_identifier_chars: new Set(['$', '_']),\n\n\t// Literals\n\t// ----------\n\t// Store the values to return for the various literals we may encounter\n\tliterals: {\n\t\t'true': true,\n\t\t'false': false,\n\t\t'null': null\n\t},\n\n\t// Except for `this`, which is special. This could be changed to something like `'self'` as well\n\tthis_str: 'this',\n});\nJsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);\nJsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);\n\n// Backward Compatibility:\nconst jsep = expr => (new Jsep(expr)).parse();\nconst stdClassProps = Object.getOwnPropertyNames(class Test{});\nObject.getOwnPropertyNames(Jsep)\n\t.filter(prop => !stdClassProps.includes(prop) && jsep[prop] === undefined)\n\t.forEach((m) => {\n\t\tjsep[m] = Jsep[m];\n\t});\njsep.Jsep = Jsep; // allows for const { Jsep } = require('jsep');\n\nconst CONDITIONAL_EXP = 'ConditionalExpression';\n\nvar ternary = {\n\tname: 'ternary',\n\n\tinit(jsep) {\n\t\t// Ternary expression: test ? consequent : alternate\n\t\tjsep.hooks.add('after-expression', function gobbleTernary(env) {\n\t\t\tif (env.node && this.code === jsep.QUMARK_CODE) {\n\t\t\t\tthis.index++;\n\t\t\t\tconst test = env.node;\n\t\t\t\tconst consequent = this.gobbleExpression();\n\n\t\t\t\tif (!consequent) {\n\t\t\t\t\tthis.throwError('Expected expression');\n\t\t\t\t}\n\n\t\t\t\tthis.gobbleSpaces();\n\n\t\t\t\tif (this.code === jsep.COLON_CODE) {\n\t\t\t\t\tthis.index++;\n\t\t\t\t\tconst alternate = this.gobbleExpression();\n\n\t\t\t\t\tif (!alternate) {\n\t\t\t\t\t\tthis.throwError('Expected expression');\n\t\t\t\t\t}\n\t\t\t\t\tenv.node = {\n\t\t\t\t\t\ttype: CONDITIONAL_EXP,\n\t\t\t\t\t\ttest,\n\t\t\t\t\t\tconsequent,\n\t\t\t\t\t\talternate,\n\t\t\t\t\t};\n\n\t\t\t\t\t// check for operators of higher priority than ternary (i.e. assignment)\n\t\t\t\t\t// jsep sets || at 1, and assignment at 0.9, and conditional should be between them\n\t\t\t\t\tif (test.operator && jsep.binary_ops[test.operator] <= 0.9) {\n\t\t\t\t\t\tlet newTest = test;\n\t\t\t\t\t\twhile (newTest.right.operator && jsep.binary_ops[newTest.right.operator] <= 0.9) {\n\t\t\t\t\t\t\tnewTest = newTest.right;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tenv.node.test = newTest.right;\n\t\t\t\t\t\tnewTest.right = env.node;\n\t\t\t\t\t\tenv.node = test;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.throwError('Expected :');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n};\n\n// Add default plugins:\n\njsep.plugins.register(ternary);\n\nexport { Jsep, jsep as default };\n","const FSLASH_CODE = 47; // '/'\nconst BSLASH_CODE = 92; // '\\\\'\n\nvar index = {\n\tname: 'regex',\n\n\tinit(jsep) {\n\t\t// Regex literal: /abc123/ig\n\t\tjsep.hooks.add('gobble-token', function gobbleRegexLiteral(env) {\n\t\t\tif (this.code === FSLASH_CODE) {\n\t\t\t\tconst patternIndex = ++this.index;\n\n\t\t\t\tlet inCharSet = false;\n\t\t\t\twhile (this.index < this.expr.length) {\n\t\t\t\t\tif (this.code === FSLASH_CODE && !inCharSet) {\n\t\t\t\t\t\tconst pattern = this.expr.slice(patternIndex, this.index);\n\n\t\t\t\t\t\tlet flags = '';\n\t\t\t\t\t\twhile (++this.index < this.expr.length) {\n\t\t\t\t\t\t\tconst code = this.code;\n\t\t\t\t\t\t\tif ((code >= 97 && code <= 122) // a...z\n\t\t\t\t\t\t\t\t|| (code >= 65 && code <= 90) // A...Z\n\t\t\t\t\t\t\t\t|| (code >= 48 && code <= 57)) { // 0-9\n\t\t\t\t\t\t\t\tflags += this.char;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet value;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tvalue = new RegExp(pattern, flags);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch (e) {\n\t\t\t\t\t\t\tthis.throwError(e.message);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tenv.node = {\n\t\t\t\t\t\t\ttype: jsep.LITERAL,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\traw: this.expr.slice(patternIndex - 1, this.index),\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// allow . [] and () after regex: /regex/.test(a)\n\t\t\t\t\t\tenv.node = this.gobbleTokenProperty(env.node);\n\t\t\t\t\t\treturn env.node;\n\t\t\t\t\t}\n\t\t\t\t\tif (this.code === jsep.OBRACK_CODE) {\n\t\t\t\t\t\tinCharSet = true;\n\t\t\t\t\t}\n\t\t\t\t\telse if (inCharSet && this.code === jsep.CBRACK_CODE) {\n\t\t\t\t\t\tinCharSet = false;\n\t\t\t\t\t}\n\t\t\t\t\tthis.index += this.code === BSLASH_CODE ? 2 : 1;\n\t\t\t\t}\n\t\t\t\tthis.throwError('Unclosed Regex');\n\t\t\t}\n\t\t});\n\t},\n};\n\nexport { index as default };\n","const PLUS_CODE = 43; // +\nconst MINUS_CODE = 45; // -\n\nconst plugin = {\n\tname: 'assignment',\n\n\tassignmentOperators: new Set([\n\t\t'=',\n\t\t'*=',\n\t\t'**=',\n\t\t'/=',\n\t\t'%=',\n\t\t'+=',\n\t\t'-=',\n\t\t'<<=',\n\t\t'>>=',\n\t\t'>>>=',\n\t\t'&=',\n\t\t'^=',\n\t\t'|=',\n\t\t'||=',\n\t\t'&&=',\n\t\t'??=',\n\t]),\n\tupdateOperators: [PLUS_CODE, MINUS_CODE],\n\tassignmentPrecedence: 0.9,\n\n\tinit(jsep) {\n\t\tconst updateNodeTypes = [jsep.IDENTIFIER, jsep.MEMBER_EXP];\n\t\tplugin.assignmentOperators.forEach(op => jsep.addBinaryOp(op, plugin.assignmentPrecedence, true));\n\n\t\tjsep.hooks.add('gobble-token', function gobbleUpdatePrefix(env) {\n\t\t\tconst code = this.code;\n\t\t\tif (plugin.updateOperators.some(c => c === code && c === this.expr.charCodeAt(this.index + 1))) {\n\t\t\t\tthis.index += 2;\n\t\t\t\tenv.node = {\n\t\t\t\t\ttype: 'UpdateExpression',\n\t\t\t\t\toperator: code === PLUS_CODE ? '++' : '--',\n\t\t\t\t\targument: this.gobbleTokenProperty(this.gobbleIdentifier()),\n\t\t\t\t\tprefix: true,\n\t\t\t\t};\n\t\t\t\tif (!env.node.argument || !updateNodeTypes.includes(env.node.argument.type)) {\n\t\t\t\t\tthis.throwError(`Unexpected ${env.node.operator}`);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tjsep.hooks.add('after-token', function gobbleUpdatePostfix(env) {\n\t\t\tif (env.node) {\n\t\t\t\tconst code = this.code;\n\t\t\t\tif (plugin.updateOperators.some(c => c === code && c === this.expr.charCodeAt(this.index + 1))) {\n\t\t\t\t\tif (!updateNodeTypes.includes(env.node.type)) {\n\t\t\t\t\t\tthis.throwError(`Unexpected ${env.node.operator}`);\n\t\t\t\t\t}\n\t\t\t\t\tthis.index += 2;\n\t\t\t\t\tenv.node = {\n\t\t\t\t\t\ttype: 'UpdateExpression',\n\t\t\t\t\t\toperator: code === PLUS_CODE ? '++' : '--',\n\t\t\t\t\t\targument: env.node,\n\t\t\t\t\t\tprefix: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tjsep.hooks.add('after-expression', function gobbleAssignment(env) {\n\t\t\tif (env.node) {\n\t\t\t\t// Note: Binaries can be chained in a single expression to respect\n\t\t\t\t// operator precedence (i.e. a = b = 1 + 2 + 3)\n\t\t\t\t// Update all binary assignment nodes in the tree\n\t\t\t\tupdateBinariesToAssignments(env.node);\n\t\t\t}\n\t\t});\n\n\t\tfunction updateBinariesToAssignments(node) {\n\t\t\tif (plugin.assignmentOperators.has(node.operator)) {\n\t\t\t\tnode.type = 'AssignmentExpression';\n\t\t\t\tupdateBinariesToAssignments(node.left);\n\t\t\t\tupdateBinariesToAssignments(node.right);\n\t\t\t}\n\t\t\telse if (!node.operator) {\n\t\t\t\tObject.values(node).forEach((val) => {\n\t\t\t\t\tif (val && typeof val === 'object') {\n\t\t\t\t\t\tupdateBinariesToAssignments(val);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t},\n};\n\nexport { plugin as default };\n","/* eslint-disable no-bitwise -- Convenient */\nimport jsep from 'jsep';\nimport jsepRegex from '@jsep-plugin/regex';\nimport jsepAssignment from '@jsep-plugin/assignment';\n\n// register plugins\njsep.plugins.register(jsepRegex, jsepAssignment);\njsep.addUnaryOp('typeof');\njsep.addUnaryOp('void');\njsep.addLiteral('null', null);\njsep.addLiteral('undefined', undefined);\n\nconst BLOCKED_PROTO_PROPERTIES = new Set([\n 'constructor',\n '__proto__',\n '__defineGetter__',\n '__defineSetter__',\n '__lookupGetter__',\n '__lookupSetter__'\n]);\n\nconst SafeEval = {\n /**\n * @param {jsep.Expression} ast\n * @param {Record} subs\n */\n evalAst (ast, subs) {\n switch (ast.type) {\n case 'BinaryExpression':\n case 'LogicalExpression':\n return SafeEval.evalBinaryExpression(ast, subs);\n case 'Compound':\n return SafeEval.evalCompound(ast, subs);\n case 'ConditionalExpression':\n return SafeEval.evalConditionalExpression(ast, subs);\n case 'Identifier':\n return SafeEval.evalIdentifier(ast, subs);\n case 'Literal':\n return SafeEval.evalLiteral(ast, subs);\n case 'MemberExpression':\n return SafeEval.evalMemberExpression(ast, subs);\n case 'UnaryExpression':\n return SafeEval.evalUnaryExpression(ast, subs);\n case 'ArrayExpression':\n return SafeEval.evalArrayExpression(ast, subs);\n case 'CallExpression':\n return SafeEval.evalCallExpression(ast, subs);\n case 'AssignmentExpression':\n return SafeEval.evalAssignmentExpression(ast, subs);\n default:\n throw SyntaxError('Unexpected expression', ast);\n }\n },\n evalBinaryExpression (ast, subs) {\n const result = {\n '||': (a, b) => a || b(),\n '&&': (a, b) => a && b(),\n '|': (a, b) => a | b(),\n '^': (a, b) => a ^ b(),\n '&': (a, b) => a & b(),\n // eslint-disable-next-line eqeqeq -- API\n '==': (a, b) => a == b(),\n // eslint-disable-next-line eqeqeq -- API\n '!=': (a, b) => a != b(),\n '===': (a, b) => a === b(),\n '!==': (a, b) => a !== b(),\n '<': (a, b) => a < b(),\n '>': (a, b) => a > b(),\n '<=': (a, b) => a <= b(),\n '>=': (a, b) => a >= b(),\n '<<': (a, b) => a << b(),\n '>>': (a, b) => a >> b(),\n '>>>': (a, b) => a >>> b(),\n '+': (a, b) => a + b(),\n '-': (a, b) => a - b(),\n '*': (a, b) => a * b(),\n '/': (a, b) => a / b(),\n '%': (a, b) => a % b()\n }[ast.operator](\n SafeEval.evalAst(ast.left, subs),\n () => SafeEval.evalAst(ast.right, subs)\n );\n return result;\n },\n evalCompound (ast, subs) {\n let last;\n for (let i = 0; i < ast.body.length; i++) {\n if (\n ast.body[i].type === 'Identifier' &&\n ['var', 'let', 'const'].includes(ast.body[i].name) &&\n ast.body[i + 1] &&\n ast.body[i + 1].type === 'AssignmentExpression'\n ) {\n // var x=2; is detected as\n // [{Identifier var}, {AssignmentExpression x=2}]\n // eslint-disable-next-line @stylistic/max-len -- Long\n // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient\n i += 1;\n }\n const expr = ast.body[i];\n last = SafeEval.evalAst(expr, subs);\n }\n return last;\n },\n evalConditionalExpression (ast, subs) {\n if (SafeEval.evalAst(ast.test, subs)) {\n return SafeEval.evalAst(ast.consequent, subs);\n }\n return SafeEval.evalAst(ast.alternate, subs);\n },\n evalIdentifier (ast, subs) {\n if (Object.hasOwn(subs, ast.name)) {\n return subs[ast.name];\n }\n throw ReferenceError(`${ast.name} is not defined`);\n },\n evalLiteral (ast) {\n return ast.value;\n },\n evalMemberExpression (ast, subs) {\n const prop = String(\n // NOTE: `String(value)` throws error when\n // value has overwritten the toString method to return non-string\n // i.e. `value = {toString: () => []}`\n ast.computed\n ? SafeEval.evalAst(ast.property) // `object[property]`\n : ast.property.name // `object.property` property is Identifier\n );\n const obj = SafeEval.evalAst(ast.object, subs);\n if (obj === undefined || obj === null) {\n throw TypeError(\n `Cannot read properties of ${obj} (reading '${prop}')`\n );\n }\n if (!Object.hasOwn(obj, prop) && BLOCKED_PROTO_PROPERTIES.has(prop)) {\n throw TypeError(\n `Cannot read properties of ${obj} (reading '${prop}')`\n );\n }\n const result = obj[prop];\n if (typeof result === 'function' && result !== Function) {\n return result.bind(obj); // arrow functions aren't affected by bind.\n }\n return result;\n },\n evalUnaryExpression (ast, subs) {\n const result = {\n '-': (a) => -SafeEval.evalAst(a, subs),\n '!': (a) => !SafeEval.evalAst(a, subs),\n '~': (a) => ~SafeEval.evalAst(a, subs),\n // eslint-disable-next-line no-implicit-coercion -- API\n '+': (a) => +SafeEval.evalAst(a, subs),\n typeof: (a) => typeof SafeEval.evalAst(a, subs),\n // eslint-disable-next-line no-void, sonarjs/void-use -- feature\n void: (a) => void SafeEval.evalAst(a, subs)\n }[ast.operator](ast.argument);\n return result;\n },\n evalArrayExpression (ast, subs) {\n return ast.elements.map((el) => SafeEval.evalAst(el, subs));\n },\n evalCallExpression (ast, subs) {\n const args = ast.arguments.map((arg) => SafeEval.evalAst(arg, subs));\n const func = SafeEval.evalAst(ast.callee, subs);\n if (func === Function) {\n throw new Error('Function constructor is disabled');\n }\n return func(...args);\n },\n evalAssignmentExpression (ast, subs) {\n if (ast.left.type !== 'Identifier') {\n throw SyntaxError('Invalid left-hand side in assignment');\n }\n const id = ast.left.name;\n const value = SafeEval.evalAst(ast.right, subs);\n subs[id] = value;\n return subs[id];\n }\n};\n\n/**\n * A replacement for NodeJS' VM.Script which is also {@link https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP | Content Security Policy} friendly.\n */\nclass SafeScript {\n /**\n * @param {string} expr Expression to evaluate\n */\n constructor (expr) {\n this.code = expr;\n this.ast = jsep(this.code);\n }\n\n /**\n * @param {object} context Object whose items will be added\n * to evaluation\n * @returns {EvaluatedResult} Result of evaluated code\n */\n runInNewContext (context) {\n // `Object.create(null)` creates a prototypeless object\n const keyMap = Object.assign(Object.create(null), context);\n return SafeEval.evalAst(this.ast, keyMap);\n }\n}\n\nexport {SafeScript};\n","/* eslint-disable camelcase -- Convenient for escaping */\n\nimport {SafeScript} from './Safe-Script.js';\n\n/**\n * @typedef {null|boolean|number|string|object|GenericArray} JSONObject\n */\n\n/**\n * @typedef {any} AnyItem\n */\n\n/**\n * @typedef {any} AnyResult\n */\n\n/**\n * Copies array and then pushes item into it.\n * @param {GenericArray} arr Array to copy and into which to push\n * @param {AnyItem} item Array item to add (to end)\n * @returns {GenericArray} Copy of the original array\n */\nfunction push (arr, item) {\n arr = arr.slice();\n arr.push(item);\n return arr;\n}\n/**\n * Copies array and then unshifts item into it.\n * @param {AnyItem} item Array item to add (to beginning)\n * @param {GenericArray} arr Array to copy and into which to unshift\n * @returns {GenericArray} Copy of the original array\n */\nfunction unshift (item, arr) {\n arr = arr.slice();\n arr.unshift(item);\n return arr;\n}\n\n/**\n * Caught when JSONPath is used without `new` but rethrown if with `new`\n * @extends Error\n */\nclass NewError extends Error {\n /**\n * @param {AnyResult} value The evaluated scalar value\n */\n constructor (value) {\n super(\n 'JSONPath should not be called with \"new\" (it prevents return ' +\n 'of (unwrapped) scalar values)'\n );\n this.avoidNew = true;\n this.value = value;\n this.name = 'NewError';\n }\n}\n\n/**\n* @typedef {object} ReturnObject\n* @property {string} path\n* @property {JSONObject} value\n* @property {object|GenericArray} parent\n* @property {string} parentProperty\n*/\n\n/**\n* @callback JSONPathCallback\n* @param {string|object} preferredOutput\n* @param {\"value\"|\"property\"} type\n* @param {ReturnObject} fullRetObj\n* @returns {void}\n*/\n\n/**\n* @callback OtherTypeCallback\n* @param {JSONObject} val\n* @param {string} path\n* @param {object|GenericArray} parent\n* @param {string} parentPropName\n* @returns {boolean}\n*/\n\n/**\n * @typedef {any} ContextItem\n */\n\n/**\n * @typedef {any} EvaluatedResult\n */\n\n/**\n* @callback EvalCallback\n* @param {string} code\n* @param {ContextItem} context\n* @returns {EvaluatedResult}\n*/\n\n/**\n * @typedef {typeof SafeScript} EvalClass\n */\n\n/**\n * @typedef {object} JSONPathOptions\n * @property {JSON} json\n * @property {string|string[]} path\n * @property {\"value\"|\"path\"|\"pointer\"|\"parent\"|\"parentProperty\"|\n * \"all\"} [resultType=\"value\"]\n * @property {boolean} [flatten=false]\n * @property {boolean} [wrap=true]\n * @property {object} [sandbox={}]\n * @property {EvalCallback|EvalClass|'safe'|'native'|\n * boolean} [eval = 'safe']\n * @property {object|GenericArray|null} [parent=null]\n * @property {string|null} [parentProperty=null]\n * @property {JSONPathCallback} [callback]\n * @property {OtherTypeCallback} [otherTypeCallback] Defaults to\n * function which throws on encountering `@other`\n * @property {boolean} [autostart=true]\n */\n\n/**\n * @param {string|JSONPathOptions} opts If a string, will be treated as `expr`\n * @param {string} [expr] JSON path to evaluate\n * @param {JSON} [obj] JSON object to evaluate against\n * @param {JSONPathCallback} [callback] Passed 3 arguments: 1) desired payload\n * per `resultType`, 2) `\"value\"|\"property\"`, 3) Full returned object with\n * all payloads\n * @param {OtherTypeCallback} [otherTypeCallback] If `@other()` is at the end\n * of one's query, this will be invoked with the value of the item, its\n * path, its parent, and its parent's property name, and it should return\n * a boolean indicating whether the supplied value belongs to the \"other\"\n * type or not (or it may handle transformations and return `false`).\n * @returns {JSONPath}\n * @class\n */\nfunction JSONPath (opts, expr, obj, callback, otherTypeCallback) {\n // eslint-disable-next-line no-restricted-syntax -- Allow for pseudo-class\n if (!(this instanceof JSONPath)) {\n try {\n return new JSONPath(opts, expr, obj, callback, otherTypeCallback);\n } catch (e) {\n if (!e.avoidNew) {\n throw e;\n }\n return e.value;\n }\n }\n\n if (typeof opts === 'string') {\n otherTypeCallback = callback;\n callback = obj;\n obj = expr;\n expr = opts;\n opts = null;\n }\n const optObj = opts && typeof opts === 'object';\n opts = opts || {};\n this.json = opts.json || obj;\n this.path = opts.path || expr;\n this.resultType = opts.resultType || 'value';\n this.flatten = opts.flatten || false;\n this.wrap = Object.hasOwn(opts, 'wrap') ? opts.wrap : true;\n this.sandbox = opts.sandbox || {};\n this.eval = opts.eval === undefined ? 'safe' : opts.eval;\n this.ignoreEvalErrors = (typeof opts.ignoreEvalErrors === 'undefined')\n ? false\n : opts.ignoreEvalErrors;\n this.parent = opts.parent || null;\n this.parentProperty = opts.parentProperty || null;\n this.callback = opts.callback || callback || null;\n this.otherTypeCallback = opts.otherTypeCallback ||\n otherTypeCallback ||\n function () {\n throw new TypeError(\n 'You must supply an otherTypeCallback callback option ' +\n 'with the @other() operator.'\n );\n };\n\n if (opts.autostart !== false) {\n const args = {\n path: (optObj ? opts.path : expr)\n };\n if (!optObj) {\n args.json = obj;\n } else if ('json' in opts) {\n args.json = opts.json;\n }\n const ret = this.evaluate(args);\n if (!ret || typeof ret !== 'object') {\n throw new NewError(ret);\n }\n return ret;\n }\n}\n\n// PUBLIC METHODS\nJSONPath.prototype.evaluate = function (\n expr, json, callback, otherTypeCallback\n) {\n let currParent = this.parent,\n currParentProperty = this.parentProperty;\n let {flatten, wrap} = this;\n\n this.currResultType = this.resultType;\n this.currEval = this.eval;\n this.currSandbox = this.sandbox;\n callback = callback || this.callback;\n this.currOtherTypeCallback = otherTypeCallback || this.otherTypeCallback;\n\n json = json || this.json;\n expr = expr || this.path;\n if (expr && typeof expr === 'object' && !Array.isArray(expr)) {\n if (!expr.path && expr.path !== '') {\n throw new TypeError(\n 'You must supply a \"path\" property when providing an object ' +\n 'argument to JSONPath.evaluate().'\n );\n }\n if (!(Object.hasOwn(expr, 'json'))) {\n throw new TypeError(\n 'You must supply a \"json\" property when providing an object ' +\n 'argument to JSONPath.evaluate().'\n );\n }\n ({json} = expr);\n flatten = Object.hasOwn(expr, 'flatten') ? expr.flatten : flatten;\n this.currResultType = Object.hasOwn(expr, 'resultType')\n ? expr.resultType\n : this.currResultType;\n this.currSandbox = Object.hasOwn(expr, 'sandbox')\n ? expr.sandbox\n : this.currSandbox;\n wrap = Object.hasOwn(expr, 'wrap') ? expr.wrap : wrap;\n this.currEval = Object.hasOwn(expr, 'eval')\n ? expr.eval\n : this.currEval;\n callback = Object.hasOwn(expr, 'callback') ? expr.callback : callback;\n this.currOtherTypeCallback = Object.hasOwn(expr, 'otherTypeCallback')\n ? expr.otherTypeCallback\n : this.currOtherTypeCallback;\n currParent = Object.hasOwn(expr, 'parent') ? expr.parent : currParent;\n currParentProperty = Object.hasOwn(expr, 'parentProperty')\n ? expr.parentProperty\n : currParentProperty;\n expr = expr.path;\n }\n currParent = currParent || null;\n currParentProperty = currParentProperty || null;\n\n if (Array.isArray(expr)) {\n expr = JSONPath.toPathString(expr);\n }\n if ((!expr && expr !== '') || !json) {\n return undefined;\n }\n\n const exprList = JSONPath.toPathArray(expr);\n if (exprList[0] === '$' && exprList.length > 1) {\n exprList.shift();\n }\n this._hasParentSelector = null;\n const result = this\n ._trace(\n exprList, json, ['$'], currParent, currParentProperty, callback\n )\n .filter(function (ea) {\n return ea && !ea.isParentSelector;\n });\n\n if (!result.length) {\n return wrap ? [] : undefined;\n }\n if (!wrap && result.length === 1 && !result[0].hasArrExpr) {\n return this._getPreferredOutput(result[0]);\n }\n return result.reduce((rslt, ea) => {\n const valOrPath = this._getPreferredOutput(ea);\n if (flatten && Array.isArray(valOrPath)) {\n rslt = rslt.concat(valOrPath);\n } else {\n rslt.push(valOrPath);\n }\n return rslt;\n }, []);\n};\n\n// PRIVATE METHODS\n\nJSONPath.prototype._getPreferredOutput = function (ea) {\n const resultType = this.currResultType;\n switch (resultType) {\n case 'all': {\n const path = Array.isArray(ea.path)\n ? ea.path\n : JSONPath.toPathArray(ea.path);\n ea.pointer = JSONPath.toPointer(path);\n ea.path = typeof ea.path === 'string'\n ? ea.path\n : JSONPath.toPathString(ea.path);\n return ea;\n } case 'value': case 'parent': case 'parentProperty':\n return ea[resultType];\n case 'path':\n return JSONPath.toPathString(ea[resultType]);\n case 'pointer':\n return JSONPath.toPointer(ea.path);\n default:\n throw new TypeError('Unknown result type');\n }\n};\n\nJSONPath.prototype._handleCallback = function (fullRetObj, callback, type) {\n if (callback) {\n const preferredOutput = this._getPreferredOutput(fullRetObj);\n fullRetObj.path = typeof fullRetObj.path === 'string'\n ? fullRetObj.path\n : JSONPath.toPathString(fullRetObj.path);\n // eslint-disable-next-line n/callback-return -- No need to return\n callback(preferredOutput, type, fullRetObj);\n }\n};\n\n/**\n *\n * @param {string} expr\n * @param {JSONObject} val\n * @param {string} path\n * @param {object|GenericArray} parent\n * @param {string} parentPropName\n * @param {JSONPathCallback} callback\n * @param {boolean} hasArrExpr\n * @param {boolean} literalPriority\n * @returns {ReturnObject|ReturnObject[]}\n */\nJSONPath.prototype._trace = function (\n expr, val, path, parent, parentPropName, callback, hasArrExpr,\n literalPriority\n) {\n // No expr to follow? return path and value as the result of\n // this trace branch\n let retObj;\n if (!expr.length) {\n retObj = {\n path,\n value: val,\n parent,\n parentProperty: parentPropName,\n hasArrExpr\n };\n this._handleCallback(retObj, callback, 'value');\n return retObj;\n }\n\n const loc = expr[0], x = expr.slice(1);\n\n // We need to gather the return value of recursive trace calls in order to\n // do the parent sel computation.\n const ret = [];\n /**\n *\n * @param {ReturnObject|ReturnObject[]} elems\n * @returns {void}\n */\n function addRet (elems) {\n if (Array.isArray(elems)) {\n // This was causing excessive stack size in Node (with or\n // without Babel) against our performance test:\n // `ret.push(...elems);`\n elems.forEach((t) => {\n ret.push(t);\n });\n } else {\n ret.push(elems);\n }\n }\n if ((typeof loc !== 'string' || literalPriority) && val &&\n Object.hasOwn(val, loc)\n ) { // simple case--directly follow property\n addRet(this._trace(x, val[loc], push(path, loc), val, loc, callback,\n hasArrExpr));\n // eslint-disable-next-line unicorn/prefer-switch -- Part of larger `if`\n } else if (loc === '*') { // all child properties\n this._walk(val, (m) => {\n addRet(this._trace(\n x, val[m], push(path, m), val, m, callback, true, true\n ));\n });\n } else if (loc === '..') { // all descendent parent properties\n // Check remaining expression with val's immediate children\n addRet(\n this._trace(x, val, path, parent, parentPropName, callback,\n hasArrExpr)\n );\n this._walk(val, (m) => {\n // We don't join m and x here because we only want parents,\n // not scalar values\n if (typeof val[m] === 'object') {\n // Keep going with recursive descent on val's\n // object children\n addRet(this._trace(\n expr.slice(), val[m], push(path, m), val, m, callback, true\n ));\n }\n });\n // The parent sel computation is handled in the frame above using the\n // ancestor object of val\n } else if (loc === '^') {\n // This is not a final endpoint, so we do not invoke the callback here\n this._hasParentSelector = true;\n return {\n path: path.slice(0, -1),\n expr: x,\n isParentSelector: true\n };\n } else if (loc === '~') { // property name\n retObj = {\n path: push(path, loc),\n value: parentPropName,\n parent,\n parentProperty: null\n };\n this._handleCallback(retObj, callback, 'property');\n return retObj;\n } else if (loc === '$') { // root only\n addRet(this._trace(x, val, path, null, null, callback, hasArrExpr));\n } else if ((/^(-?\\d*):(-?\\d*):?(\\d*)$/u).test(loc)) { // [start:end:step] Python slice syntax\n addRet(\n this._slice(loc, x, val, path, parent, parentPropName, callback)\n );\n } else if (loc.indexOf('?(') === 0) { // [?(expr)] (filtering)\n if (this.currEval === false) {\n throw new Error('Eval [?(expr)] prevented in JSONPath expression.');\n }\n const safeLoc = loc.replace(/^\\?\\((.*?)\\)$/u, '$1');\n // check for a nested filter expression\n const nested = (/@.?([^?]*)[['](\\??\\(.*?\\))(?!.\\)\\])[\\]']/gu).exec(safeLoc);\n if (nested) {\n // find if there are matches in the nested expression\n // add them to the result set if there is at least one match\n this._walk(val, (m) => {\n const npath = [nested[2]];\n const nvalue = nested[1]\n ? val[m][nested[1]]\n : val[m];\n const filterResults = this._trace(npath, nvalue, path,\n parent, parentPropName, callback, true);\n if (filterResults.length > 0) {\n addRet(this._trace(x, val[m], push(path, m), val,\n m, callback, true));\n }\n });\n } else {\n this._walk(val, (m) => {\n if (this._eval(safeLoc, val[m], m, path, parent,\n parentPropName)) {\n addRet(this._trace(x, val[m], push(path, m), val, m,\n callback, true));\n }\n });\n }\n } else if (loc[0] === '(') { // [(expr)] (dynamic property/index)\n if (this.currEval === false) {\n throw new Error('Eval [(expr)] prevented in JSONPath expression.');\n }\n // As this will resolve to a property name (but we don't know it\n // yet), property and parent information is relative to the\n // parent of the property to which this expression will resolve\n addRet(this._trace(unshift(\n this._eval(\n loc, val, path.at(-1),\n path.slice(0, -1), parent, parentPropName\n ),\n x\n ), val, path, parent, parentPropName, callback, hasArrExpr));\n } else if (loc[0] === '@') { // value type: @boolean(), etc.\n let addType = false;\n const valueType = loc.slice(1, -2);\n switch (valueType) {\n case 'scalar':\n if (!val || !(['object', 'function'].includes(typeof val))) {\n addType = true;\n }\n break;\n case 'boolean': case 'string': case 'undefined': case 'function':\n if (typeof val === valueType) {\n addType = true;\n }\n break;\n case 'integer':\n if (Number.isFinite(val) && !(val % 1)) {\n addType = true;\n }\n break;\n case 'number':\n if (Number.isFinite(val)) {\n addType = true;\n }\n break;\n case 'nonFinite':\n if (typeof val === 'number' && !Number.isFinite(val)) {\n addType = true;\n }\n break;\n case 'object':\n if (val && typeof val === valueType) {\n addType = true;\n }\n break;\n case 'array':\n if (Array.isArray(val)) {\n addType = true;\n }\n break;\n case 'other':\n addType = this.currOtherTypeCallback(\n val, path, parent, parentPropName\n );\n break;\n case 'null':\n if (val === null) {\n addType = true;\n }\n break;\n /* c8 ignore next 2 */\n default:\n throw new TypeError('Unknown value type ' + valueType);\n }\n if (addType) {\n retObj = {path, value: val, parent, parentProperty: parentPropName};\n this._handleCallback(retObj, callback, 'value');\n return retObj;\n }\n // `-escaped property\n } else if (loc[0] === '`' && val && Object.hasOwn(val, loc.slice(1))) {\n const locProp = loc.slice(1);\n addRet(this._trace(\n x, val[locProp], push(path, locProp), val, locProp, callback,\n hasArrExpr, true\n ));\n } else if (loc.includes(',')) { // [name1,name2,...]\n const parts = loc.split(',');\n for (const part of parts) {\n addRet(this._trace(\n unshift(part, x), val, path, parent, parentPropName, callback,\n true\n ));\n }\n // simple case--directly follow property\n } else if (\n !literalPriority && val && Object.hasOwn(val, loc)\n ) {\n addRet(\n this._trace(x, val[loc], push(path, loc), val, loc, callback,\n hasArrExpr, true)\n );\n }\n\n // We check the resulting values for parent selections. For parent\n // selections we discard the value object and continue the trace with the\n // current val object\n if (this._hasParentSelector) {\n for (let t = 0; t < ret.length; t++) {\n const rett = ret[t];\n if (rett && rett.isParentSelector) {\n const tmp = this._trace(\n rett.expr, val, rett.path, parent, parentPropName, callback,\n hasArrExpr\n );\n if (Array.isArray(tmp)) {\n ret[t] = tmp[0];\n const tl = tmp.length;\n for (let tt = 1; tt < tl; tt++) {\n // eslint-disable-next-line @stylistic/max-len -- Long\n // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient\n t++;\n ret.splice(t, 0, tmp[tt]);\n }\n } else {\n ret[t] = tmp;\n }\n }\n }\n }\n return ret;\n};\n\nJSONPath.prototype._walk = function (val, f) {\n if (Array.isArray(val)) {\n const n = val.length;\n for (let i = 0; i < n; i++) {\n f(i);\n }\n } else if (val && typeof val === 'object') {\n Object.keys(val).forEach((m) => {\n f(m);\n });\n }\n};\n\nJSONPath.prototype._slice = function (\n loc, expr, val, path, parent, parentPropName, callback\n) {\n if (!Array.isArray(val)) {\n return undefined;\n }\n const len = val.length, parts = loc.split(':'),\n step = (parts[2] && Number.parseInt(parts[2])) || 1;\n let start = (parts[0] && Number.parseInt(parts[0])) || 0,\n end = parts[1] ? Number.parseInt(parts[1]) : len;\n start = (start < 0) ? Math.max(0, start + len) : Math.min(len, start);\n end = (end < 0) ? Math.max(0, end + len) : Math.min(len, end);\n const ret = [];\n for (let i = start; i < end; i += step) {\n const tmp = this._trace(\n unshift(i, expr), val, path, parent, parentPropName, callback, true\n );\n // Should only be possible to be an array here since first part of\n // ``unshift(i, expr)` passed in above would not be empty, nor `~`,\n // nor begin with `@` (as could return objects)\n // This was causing excessive stack size in Node (with or\n // without Babel) against our performance test: `ret.push(...tmp);`\n tmp.forEach((t) => {\n ret.push(t);\n });\n }\n return ret;\n};\n\nJSONPath.prototype._eval = function (\n code, _v, _vname, path, parent, parentPropName\n) {\n this.currSandbox._$_parentProperty = parentPropName;\n this.currSandbox._$_parent = parent;\n this.currSandbox._$_property = _vname;\n this.currSandbox._$_root = this.json;\n this.currSandbox._$_v = _v;\n\n const containsPath = code.includes('@path');\n if (containsPath) {\n this.currSandbox._$_path = JSONPath.toPathString(path.concat([_vname]));\n }\n\n const scriptCacheKey = this.currEval + 'Script:' + code;\n if (!JSONPath.cache[scriptCacheKey]) {\n let script = code\n .replaceAll('@parentProperty', '_$_parentProperty')\n .replaceAll('@parent', '_$_parent')\n .replaceAll('@property', '_$_property')\n .replaceAll('@root', '_$_root')\n .replaceAll(/@([.\\s)[])/gu, '_$_v$1');\n if (containsPath) {\n script = script.replaceAll('@path', '_$_path');\n }\n if (\n this.currEval === 'safe' ||\n this.currEval === true ||\n this.currEval === undefined\n ) {\n JSONPath.cache[scriptCacheKey] = new this.safeVm.Script(script);\n } else if (this.currEval === 'native') {\n JSONPath.cache[scriptCacheKey] = new this.vm.Script(script);\n } else if (\n typeof this.currEval === 'function' &&\n this.currEval.prototype &&\n Object.hasOwn(this.currEval.prototype, 'runInNewContext')\n ) {\n const CurrEval = this.currEval;\n JSONPath.cache[scriptCacheKey] = new CurrEval(script);\n } else if (typeof this.currEval === 'function') {\n JSONPath.cache[scriptCacheKey] = {\n runInNewContext: (context) => this.currEval(script, context)\n };\n } else {\n throw new TypeError(`Unknown \"eval\" property \"${this.currEval}\"`);\n }\n }\n\n try {\n return JSONPath.cache[scriptCacheKey].runInNewContext(this.currSandbox);\n } catch (e) {\n if (this.ignoreEvalErrors) {\n return false;\n }\n throw new Error('jsonPath: ' + e.message + ': ' + code);\n }\n};\n\n// PUBLIC CLASS PROPERTIES AND METHODS\n\n// Could store the cache object itself\nJSONPath.cache = {};\n\n/**\n * @param {string[]} pathArr Array to convert\n * @returns {string} The path string\n */\nJSONPath.toPathString = function (pathArr) {\n const x = pathArr, n = x.length;\n let p = '$';\n for (let i = 1; i < n; i++) {\n if (!(/^(~|\\^|@.*?\\(\\))$/u).test(x[i])) {\n p += (/^[0-9*]+$/u).test(x[i]) ? ('[' + x[i] + ']') : (\"['\" + x[i] + \"']\");\n }\n }\n return p;\n};\n\n/**\n * @param {string} pointer JSON Path\n * @returns {string} JSON Pointer\n */\nJSONPath.toPointer = function (pointer) {\n const x = pointer, n = x.length;\n let p = '';\n for (let i = 1; i < n; i++) {\n if (!(/^(~|\\^|@.*?\\(\\))$/u).test(x[i])) {\n p += '/' + x[i].toString()\n .replaceAll('~', '~0')\n .replaceAll('/', '~1');\n }\n }\n return p;\n};\n\n/**\n * @param {string} expr Expression to convert\n * @returns {string[]}\n */\nJSONPath.toPathArray = function (expr) {\n const {cache} = JSONPath;\n if (cache[expr]) {\n return cache[expr].concat();\n }\n const subx = [];\n const normalized = expr\n // Properties\n .replaceAll(\n /@(?:null|boolean|number|string|integer|undefined|nonFinite|scalar|array|object|function|other)\\(\\)/gu,\n ';$&;'\n )\n // Parenthetical evaluations (filtering and otherwise), directly\n // within brackets or single quotes\n .replaceAll(/[['](\\??\\(.*?\\))[\\]'](?!.\\])/gu, function ($0, $1) {\n return '[#' + (subx.push($1) - 1) + ']';\n })\n // Escape periods and tildes within properties\n .replaceAll(/\\[['\"]([^'\\]]*)['\"]\\]/gu, function ($0, prop) {\n return \"['\" + prop\n .replaceAll('.', '%@%')\n .replaceAll('~', '%%@@%%') +\n \"']\";\n })\n // Properties operator\n .replaceAll('~', ';~;')\n // Split by property boundaries\n .replaceAll(/['\"]?\\.['\"]?(?![^[]*\\])|\\[['\"]?/gu, ';')\n // Reinsert periods within properties\n .replaceAll('%@%', '.')\n // Reinsert tildes within properties\n .replaceAll('%%@@%%', '~')\n // Parent\n .replaceAll(/(?:;)?(\\^+)(?:;)?/gu, function ($0, ups) {\n return ';' + ups.split('').join(';') + ';';\n })\n // Descendents\n .replaceAll(/;;;|;;/gu, ';..;')\n // Remove trailing\n .replaceAll(/;$|'?\\]|'$/gu, '');\n\n const exprList = normalized.split(';').map(function (exp) {\n const match = exp.match(/#(\\d+)/u);\n return !match || !match[1] ? exp : subx[match[1]];\n });\n cache[expr] = exprList;\n return cache[expr].concat();\n};\n\nJSONPath.prototype.safeVm = {\n Script: SafeScript\n};\n\nexport {JSONPath};\n","import {JSONPath} from './jsonpath.js';\n\n/**\n * @typedef {any} ContextItem\n */\n\n/**\n * @typedef {any} EvaluatedResult\n */\n\n/**\n * @callback ConditionCallback\n * @param {ContextItem} item\n * @returns {boolean}\n */\n\n/**\n * Copy items out of one array into another.\n * @param {GenericArray} source Array with items to copy\n * @param {GenericArray} target Array to which to copy\n * @param {ConditionCallback} conditionCb Callback passed the current item;\n * will move item if evaluates to `true`\n * @returns {void}\n */\nconst moveToAnotherArray = function (source, target, conditionCb) {\n const il = source.length;\n for (let i = 0; i < il; i++) {\n const item = source[i];\n if (conditionCb(item)) {\n // eslint-disable-next-line @stylistic/max-len -- Long\n // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient\n target.push(source.splice(i--, 1)[0]);\n }\n }\n};\n\n/**\n * In-browser replacement for NodeJS' VM.Script.\n */\nclass Script {\n /**\n * @param {string} expr Expression to evaluate\n */\n constructor (expr) {\n this.code = expr;\n }\n\n /**\n * @param {object} context Object whose items will be added\n * to evaluation\n * @returns {EvaluatedResult} Result of evaluated code\n */\n runInNewContext (context) {\n let expr = this.code;\n const keys = Object.keys(context);\n const funcs = [];\n moveToAnotherArray(keys, funcs, (key) => {\n return typeof context[key] === 'function';\n });\n const values = keys.map((vr) => {\n return context[vr];\n });\n\n const funcString = funcs.reduce((s, func) => {\n let fString = context[func].toString();\n if (!(/function/u).test(fString)) {\n fString = 'function ' + fString;\n }\n return 'var ' + func + '=' + fString + ';' + s;\n }, '');\n\n expr = funcString + expr;\n\n // Mitigate http://perfectionkills.com/global-eval-what-are-the-options/#new_function\n if (!(/(['\"])use strict\\1/u).test(expr) && !keys.includes('arguments')) {\n expr = 'var arguments = undefined;' + expr;\n }\n\n // Remove last semi so `return` will be inserted before\n // the previous one instead, allowing for the return\n // of a bare ending expression\n expr = expr.replace(/;\\s*$/u, '');\n\n // Insert `return`\n const lastStatementEnd = expr.lastIndexOf(';');\n const code =\n lastStatementEnd !== -1\n ? expr.slice(0, lastStatementEnd + 1) +\n ' return ' +\n expr.slice(lastStatementEnd + 1)\n : ' return ' + expr;\n\n // eslint-disable-next-line no-new-func -- User's choice\n return new Function(...keys, code)(...values);\n }\n}\n\nJSONPath.prototype.vm = {\n Script\n};\n\nexport {JSONPath};\n"],"names":["Jsep","version","toString","addUnaryOp","op_name","max_unop_len","Math","max","length","unary_ops","addBinaryOp","precedence","isRightAssociative","max_binop_len","binary_ops","right_associative","add","delete","addIdentifierChar","char","additional_identifier_chars","addLiteral","literal_name","literal_value","literals","removeUnaryOp","getMaxKeyLen","removeAllUnaryOps","removeIdentifierChar","removeBinaryOp","removeAllBinaryOps","removeLiteral","removeAllLiterals","this","expr","charAt","index","code","charCodeAt","constructor","parse","obj","Object","keys","map","k","isDecimalDigit","ch","binaryPrecedence","op_val","isIdentifierStart","String","fromCharCode","has","isIdentifierPart","throwError","message","error","Error","description","runHook","name","node","hooks","env","context","run","searchHook","find","callback","call","gobbleSpaces","SPACE_CODE","TAB_CODE","LF_CODE","CR_CODE","nodes","gobbleExpressions","type","COMPOUND","body","untilICode","ch_i","SEMCOL_CODE","COMMA_CODE","gobbleExpression","push","gobbleBinaryExpression","gobbleBinaryOp","to_check","substr","tc_len","hasOwnProperty","biop","prec","stack","biop_info","left","right","i","cur_biop","gobbleToken","value","right_a","comparePrev","prev","pop","BINARY_EXP","operator","PERIOD_CODE","gobbleNumericLiteral","SQUOTE_CODE","DQUOTE_CODE","gobbleStringLiteral","OBRACK_CODE","gobbleArray","argument","UNARY_EXP","prefix","gobbleIdentifier","LITERAL","raw","this_str","THIS_EXP","OPAREN_CODE","gobbleGroup","gobbleTokenProperty","QUMARK_CODE","optional","MEMBER_EXP","computed","object","property","CBRACK_CODE","CALL_EXP","arguments","gobbleArguments","CPAREN_CODE","callee","chCode","number","parseFloat","str","startIndex","quote","closed","substring","start","IDENTIFIER","slice","termination","args","separator_count","arg","SEQUENCE_EXP","expressions","ARRAY_EXP","elements","first","Array","isArray","forEach","assign","plugins","jsep","registered","register","plugin","init","COLON_CODE","Set","true","false","null","stdClassProps","getOwnPropertyNames","filter","prop","includes","undefined","m","ternary","test","consequent","alternate","newTest","patternIndex","inCharSet","pattern","flags","RegExp","e","assignmentOperators","updateOperators","assignmentPrecedence","updateNodeTypes","updateBinariesToAssignments","values","val","op","some","c","jsepRegex","jsepAssignment","BLOCKED_PROTO_PROPERTIES","SafeEval","evalAst","ast","subs","evalBinaryExpression","evalCompound","evalConditionalExpression","evalIdentifier","evalLiteral","evalMemberExpression","evalUnaryExpression","evalArrayExpression","evalCallExpression","evalAssignmentExpression","SyntaxError","||","a","b","&&","|","^","&","==","!=","===","!==","<",">","<=",">=","<<",">>",">>>","+","-","*","/","%","last","hasOwn","ReferenceError","TypeError","result","Function","bind","typeof","void","el","func","id","arr","item","unshift","NewError","super","avoidNew","JSONPath","opts","otherTypeCallback","optObj","json","path","resultType","flatten","wrap","sandbox","eval","ignoreEvalErrors","parent","parentProperty","autostart","ret","evaluate","prototype","currParent","currParentProperty","currResultType","currEval","currSandbox","currOtherTypeCallback","toPathString","exprList","toPathArray","shift","_hasParentSelector","_trace","ea","isParentSelector","hasArrExpr","reduce","rslt","valOrPath","_getPreferredOutput","concat","pointer","toPointer","_handleCallback","fullRetObj","preferredOutput","parentPropName","literalPriority","retObj","loc","x","addRet","elems","t","_walk","_slice","indexOf","safeLoc","replace","nested","exec","npath","nvalue","_eval","at","addType","valueType","Number","isFinite","locProp","parts","split","part","rett","tmp","tl","tt","splice","f","n","len","step","parseInt","end","min","_v","_vname","_$_parentProperty","_$_parent","_$_property","_$_root","_$_v","containsPath","_$_path","scriptCacheKey","cache","script","replaceAll","safeVm","Script","vm","CurrEval","runInNewContext","pathArr","p","subx","$0","$1","ups","join","exp","match","keyMap","create","funcs","source","target","conditionCb","il","moveToAnotherArray","key","vr","s","fString","lastStatementEnd","lastIndexOf"],"mappings":"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","x_google_ignoreList":[0,1,2]} \ No newline at end of file +{"version":3,"file":"index-browser-umd.min.cjs","sources":["../node_modules/.pnpm/jsep@1.4.0/node_modules/jsep/dist/jsep.js","../node_modules/.pnpm/@jsep-plugin+regex@1.0.4_jsep@1.4.0/node_modules/@jsep-plugin/regex/dist/index.js","../node_modules/.pnpm/@jsep-plugin+assignment@1.3.0_jsep@1.4.0/node_modules/@jsep-plugin/assignment/dist/index.js","../src/Safe-Script.js","../src/jsonpath.js","../src/jsonpath-browser.js"],"sourcesContent":["/**\n * @implements {IHooks}\n */\nclass Hooks {\n\t/**\n\t * @callback HookCallback\n\t * @this {*|Jsep} this\n\t * @param {Jsep} env\n\t * @returns: void\n\t */\n\t/**\n\t * Adds the given callback to the list of callbacks for the given hook.\n\t *\n\t * The callback will be invoked when the hook it is registered for is run.\n\t *\n\t * One callback function can be registered to multiple hooks and the same hook multiple times.\n\t *\n\t * @param {string|object} name The name of the hook, or an object of callbacks keyed by name\n\t * @param {HookCallback|boolean} callback The callback function which is given environment variables.\n\t * @param {?boolean} [first=false] Will add the hook to the top of the list (defaults to the bottom)\n\t * @public\n\t */\n\tadd(name, callback, first) {\n\t\tif (typeof arguments[0] != 'string') {\n\t\t\t// Multiple hook callbacks, keyed by name\n\t\t\tfor (let name in arguments[0]) {\n\t\t\t\tthis.add(name, arguments[0][name], arguments[1]);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t(Array.isArray(name) ? name : [name]).forEach(function (name) {\n\t\t\t\tthis[name] = this[name] || [];\n\n\t\t\t\tif (callback) {\n\t\t\t\t\tthis[name][first ? 'unshift' : 'push'](callback);\n\t\t\t\t}\n\t\t\t}, this);\n\t\t}\n\t}\n\n\t/**\n\t * Runs a hook invoking all registered callbacks with the given environment variables.\n\t *\n\t * Callbacks will be invoked synchronously and in the order in which they were registered.\n\t *\n\t * @param {string} name The name of the hook.\n\t * @param {Object} env The environment variables of the hook passed to all callbacks registered.\n\t * @public\n\t */\n\trun(name, env) {\n\t\tthis[name] = this[name] || [];\n\t\tthis[name].forEach(function (callback) {\n\t\t\tcallback.call(env && env.context ? env.context : env, env);\n\t\t});\n\t}\n}\n\n/**\n * @implements {IPlugins}\n */\nclass Plugins {\n\tconstructor(jsep) {\n\t\tthis.jsep = jsep;\n\t\tthis.registered = {};\n\t}\n\n\t/**\n\t * @callback PluginSetup\n\t * @this {Jsep} jsep\n\t * @returns: void\n\t */\n\t/**\n\t * Adds the given plugin(s) to the registry\n\t *\n\t * @param {object} plugins\n\t * @param {string} plugins.name The name of the plugin\n\t * @param {PluginSetup} plugins.init The init function\n\t * @public\n\t */\n\tregister(...plugins) {\n\t\tplugins.forEach((plugin) => {\n\t\t\tif (typeof plugin !== 'object' || !plugin.name || !plugin.init) {\n\t\t\t\tthrow new Error('Invalid JSEP plugin format');\n\t\t\t}\n\t\t\tif (this.registered[plugin.name]) {\n\t\t\t\t// already registered. Ignore.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tplugin.init(this.jsep);\n\t\t\tthis.registered[plugin.name] = plugin;\n\t\t});\n\t}\n}\n\n// JavaScript Expression Parser (JSEP) 1.4.0\n\nclass Jsep {\n\t/**\n\t * @returns {string}\n\t */\n\tstatic get version() {\n\t\t// To be filled in by the template\n\t\treturn '1.4.0';\n\t}\n\n\t/**\n\t * @returns {string}\n\t */\n\tstatic toString() {\n\t\treturn 'JavaScript Expression Parser (JSEP) v' + Jsep.version;\n\t};\n\n\t// ==================== CONFIG ================================\n\t/**\n\t * @method addUnaryOp\n\t * @param {string} op_name The name of the unary op to add\n\t * @returns {Jsep}\n\t */\n\tstatic addUnaryOp(op_name) {\n\t\tJsep.max_unop_len = Math.max(op_name.length, Jsep.max_unop_len);\n\t\tJsep.unary_ops[op_name] = 1;\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method jsep.addBinaryOp\n\t * @param {string} op_name The name of the binary op to add\n\t * @param {number} precedence The precedence of the binary op (can be a float). Higher number = higher precedence\n\t * @param {boolean} [isRightAssociative=false] whether operator is right-associative\n\t * @returns {Jsep}\n\t */\n\tstatic addBinaryOp(op_name, precedence, isRightAssociative) {\n\t\tJsep.max_binop_len = Math.max(op_name.length, Jsep.max_binop_len);\n\t\tJsep.binary_ops[op_name] = precedence;\n\t\tif (isRightAssociative) {\n\t\t\tJsep.right_associative.add(op_name);\n\t\t}\n\t\telse {\n\t\t\tJsep.right_associative.delete(op_name);\n\t\t}\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method addIdentifierChar\n\t * @param {string} char The additional character to treat as a valid part of an identifier\n\t * @returns {Jsep}\n\t */\n\tstatic addIdentifierChar(char) {\n\t\tJsep.additional_identifier_chars.add(char);\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method addLiteral\n\t * @param {string} literal_name The name of the literal to add\n\t * @param {*} literal_value The value of the literal\n\t * @returns {Jsep}\n\t */\n\tstatic addLiteral(literal_name, literal_value) {\n\t\tJsep.literals[literal_name] = literal_value;\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeUnaryOp\n\t * @param {string} op_name The name of the unary op to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeUnaryOp(op_name) {\n\t\tdelete Jsep.unary_ops[op_name];\n\t\tif (op_name.length === Jsep.max_unop_len) {\n\t\t\tJsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);\n\t\t}\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllUnaryOps\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllUnaryOps() {\n\t\tJsep.unary_ops = {};\n\t\tJsep.max_unop_len = 0;\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeIdentifierChar\n\t * @param {string} char The additional character to stop treating as a valid part of an identifier\n\t * @returns {Jsep}\n\t */\n\tstatic removeIdentifierChar(char) {\n\t\tJsep.additional_identifier_chars.delete(char);\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeBinaryOp\n\t * @param {string} op_name The name of the binary op to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeBinaryOp(op_name) {\n\t\tdelete Jsep.binary_ops[op_name];\n\n\t\tif (op_name.length === Jsep.max_binop_len) {\n\t\t\tJsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);\n\t\t}\n\t\tJsep.right_associative.delete(op_name);\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllBinaryOps\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllBinaryOps() {\n\t\tJsep.binary_ops = {};\n\t\tJsep.max_binop_len = 0;\n\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeLiteral\n\t * @param {string} literal_name The name of the literal to remove\n\t * @returns {Jsep}\n\t */\n\tstatic removeLiteral(literal_name) {\n\t\tdelete Jsep.literals[literal_name];\n\t\treturn Jsep;\n\t}\n\n\t/**\n\t * @method removeAllLiterals\n\t * @returns {Jsep}\n\t */\n\tstatic removeAllLiterals() {\n\t\tJsep.literals = {};\n\n\t\treturn Jsep;\n\t}\n\t// ==================== END CONFIG ============================\n\n\n\t/**\n\t * @returns {string}\n\t */\n\tget char() {\n\t\treturn this.expr.charAt(this.index);\n\t}\n\n\t/**\n\t * @returns {number}\n\t */\n\tget code() {\n\t\treturn this.expr.charCodeAt(this.index);\n\t};\n\n\n\t/**\n\t * @param {string} expr a string with the passed in express\n\t * @returns Jsep\n\t */\n\tconstructor(expr) {\n\t\t// `index` stores the character number we are currently at\n\t\t// All of the gobbles below will modify `index` as we move along\n\t\tthis.expr = expr;\n\t\tthis.index = 0;\n\t}\n\n\t/**\n\t * static top-level parser\n\t * @returns {jsep.Expression}\n\t */\n\tstatic parse(expr) {\n\t\treturn (new Jsep(expr)).parse();\n\t}\n\n\t/**\n\t * Get the longest key length of any object\n\t * @param {object} obj\n\t * @returns {number}\n\t */\n\tstatic getMaxKeyLen(obj) {\n\t\treturn Math.max(0, ...Object.keys(obj).map(k => k.length));\n\t}\n\n\t/**\n\t * `ch` is a character code in the next three functions\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isDecimalDigit(ch) {\n\t\treturn (ch >= 48 && ch <= 57); // 0...9\n\t}\n\n\t/**\n\t * Returns the precedence of a binary operator or `0` if it isn't a binary operator. Can be float.\n\t * @param {string} op_val\n\t * @returns {number}\n\t */\n\tstatic binaryPrecedence(op_val) {\n\t\treturn Jsep.binary_ops[op_val] || 0;\n\t}\n\n\t/**\n\t * Looks for start of identifier\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isIdentifierStart(ch) {\n\t\treturn (ch >= 65 && ch <= 90) || // A...Z\n\t\t\t(ch >= 97 && ch <= 122) || // a...z\n\t\t\t(ch >= 128 && !Jsep.binary_ops[String.fromCharCode(ch)]) || // any non-ASCII that is not an operator\n\t\t\t(Jsep.additional_identifier_chars.has(String.fromCharCode(ch))); // additional characters\n\t}\n\n\t/**\n\t * @param {number} ch\n\t * @returns {boolean}\n\t */\n\tstatic isIdentifierPart(ch) {\n\t\treturn Jsep.isIdentifierStart(ch) || Jsep.isDecimalDigit(ch);\n\t}\n\n\t/**\n\t * throw error at index of the expression\n\t * @param {string} message\n\t * @throws\n\t */\n\tthrowError(message) {\n\t\tconst error = new Error(message + ' at character ' + this.index);\n\t\terror.index = this.index;\n\t\terror.description = message;\n\t\tthrow error;\n\t}\n\n\t/**\n\t * Run a given hook\n\t * @param {string} name\n\t * @param {jsep.Expression|false} [node]\n\t * @returns {?jsep.Expression}\n\t */\n\trunHook(name, node) {\n\t\tif (Jsep.hooks[name]) {\n\t\t\tconst env = { context: this, node };\n\t\t\tJsep.hooks.run(name, env);\n\t\t\treturn env.node;\n\t\t}\n\t\treturn node;\n\t}\n\n\t/**\n\t * Runs a given hook until one returns a node\n\t * @param {string} name\n\t * @returns {?jsep.Expression}\n\t */\n\tsearchHook(name) {\n\t\tif (Jsep.hooks[name]) {\n\t\t\tconst env = { context: this };\n\t\t\tJsep.hooks[name].find(function (callback) {\n\t\t\t\tcallback.call(env.context, env);\n\t\t\t\treturn env.node;\n\t\t\t});\n\t\t\treturn env.node;\n\t\t}\n\t}\n\n\t/**\n\t * Push `index` up to the next non-space character\n\t */\n\tgobbleSpaces() {\n\t\tlet ch = this.code;\n\t\t// Whitespace\n\t\twhile (ch === Jsep.SPACE_CODE\n\t\t|| ch === Jsep.TAB_CODE\n\t\t|| ch === Jsep.LF_CODE\n\t\t|| ch === Jsep.CR_CODE) {\n\t\t\tch = this.expr.charCodeAt(++this.index);\n\t\t}\n\t\tthis.runHook('gobble-spaces');\n\t}\n\n\t/**\n\t * Top-level method to parse all expressions and returns compound or single node\n\t * @returns {jsep.Expression}\n\t */\n\tparse() {\n\t\tthis.runHook('before-all');\n\t\tconst nodes = this.gobbleExpressions();\n\n\t\t// If there's only one expression just try returning the expression\n\t\tconst node = nodes.length === 1\n\t\t ? nodes[0]\n\t\t\t: {\n\t\t\t\ttype: Jsep.COMPOUND,\n\t\t\t\tbody: nodes\n\t\t\t};\n\t\treturn this.runHook('after-all', node);\n\t}\n\n\t/**\n\t * top-level parser (but can be reused within as well)\n\t * @param {number} [untilICode]\n\t * @returns {jsep.Expression[]}\n\t */\n\tgobbleExpressions(untilICode) {\n\t\tlet nodes = [], ch_i, node;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tch_i = this.code;\n\n\t\t\t// Expressions can be separated by semicolons, commas, or just inferred without any\n\t\t\t// separators\n\t\t\tif (ch_i === Jsep.SEMCOL_CODE || ch_i === Jsep.COMMA_CODE) {\n\t\t\t\tthis.index++; // ignore separators\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// Try to gobble each expression individually\n\t\t\t\tif (node = this.gobbleExpression()) {\n\t\t\t\t\tnodes.push(node);\n\t\t\t\t\t// If we weren't able to find a binary expression and are out of room, then\n\t\t\t\t\t// the expression passed in probably has too much\n\t\t\t\t}\n\t\t\t\telse if (this.index < this.expr.length) {\n\t\t\t\t\tif (ch_i === untilICode) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tthis.throwError('Unexpected \"' + this.char + '\"');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn nodes;\n\t}\n\n\t/**\n\t * The main parsing function.\n\t * @returns {?jsep.Expression}\n\t */\n\tgobbleExpression() {\n\t\tconst node = this.searchHook('gobble-expression') || this.gobbleBinaryExpression();\n\t\tthis.gobbleSpaces();\n\n\t\treturn this.runHook('after-expression', node);\n\t}\n\n\t/**\n\t * Search for the operation portion of the string (e.g. `+`, `===`)\n\t * Start by taking the longest possible binary operations (3 characters: `===`, `!==`, `>>>`)\n\t * and move down from 3 to 2 to 1 character until a matching binary operation is found\n\t * then, return that binary operation\n\t * @returns {string|boolean}\n\t */\n\tgobbleBinaryOp() {\n\t\tthis.gobbleSpaces();\n\t\tlet to_check = this.expr.substr(this.index, Jsep.max_binop_len);\n\t\tlet tc_len = to_check.length;\n\n\t\twhile (tc_len > 0) {\n\t\t\t// Don't accept a binary op when it is an identifier.\n\t\t\t// Binary ops that start with a identifier-valid character must be followed\n\t\t\t// by a non identifier-part valid character\n\t\t\tif (Jsep.binary_ops.hasOwnProperty(to_check) && (\n\t\t\t\t!Jsep.isIdentifierStart(this.code) ||\n\t\t\t\t(this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))\n\t\t\t)) {\n\t\t\t\tthis.index += tc_len;\n\t\t\t\treturn to_check;\n\t\t\t}\n\t\t\tto_check = to_check.substr(0, --tc_len);\n\t\t}\n\t\treturn false;\n\t}\n\n\t/**\n\t * This function is responsible for gobbling an individual expression,\n\t * e.g. `1`, `1+2`, `a+(b*2)-Math.sqrt(2)`\n\t * @returns {?jsep.BinaryExpression}\n\t */\n\tgobbleBinaryExpression() {\n\t\tlet node, biop, prec, stack, biop_info, left, right, i, cur_biop;\n\n\t\t// First, try to get the leftmost thing\n\t\t// Then, check to see if there's a binary operator operating on that leftmost thing\n\t\t// Don't gobbleBinaryOp without a left-hand-side\n\t\tleft = this.gobbleToken();\n\t\tif (!left) {\n\t\t\treturn left;\n\t\t}\n\t\tbiop = this.gobbleBinaryOp();\n\n\t\t// If there wasn't a binary operator, just return the leftmost node\n\t\tif (!biop) {\n\t\t\treturn left;\n\t\t}\n\n\t\t// Otherwise, we need to start a stack to properly place the binary operations in their\n\t\t// precedence structure\n\t\tbiop_info = { value: biop, prec: Jsep.binaryPrecedence(biop), right_a: Jsep.right_associative.has(biop) };\n\n\t\tright = this.gobbleToken();\n\n\t\tif (!right) {\n\t\t\tthis.throwError(\"Expected expression after \" + biop);\n\t\t}\n\n\t\tstack = [left, biop_info, right];\n\n\t\t// Properly deal with precedence using [recursive descent](http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm)\n\t\twhile ((biop = this.gobbleBinaryOp())) {\n\t\t\tprec = Jsep.binaryPrecedence(biop);\n\n\t\t\tif (prec === 0) {\n\t\t\t\tthis.index -= biop.length;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbiop_info = { value: biop, prec, right_a: Jsep.right_associative.has(biop) };\n\n\t\t\tcur_biop = biop;\n\n\t\t\t// Reduce: make a binary expression from the three topmost entries.\n\t\t\tconst comparePrev = prev => biop_info.right_a && prev.right_a\n\t\t\t\t? prec > prev.prec\n\t\t\t\t: prec <= prev.prec;\n\t\t\twhile ((stack.length > 2) && comparePrev(stack[stack.length - 2])) {\n\t\t\t\tright = stack.pop();\n\t\t\t\tbiop = stack.pop().value;\n\t\t\t\tleft = stack.pop();\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.BINARY_EXP,\n\t\t\t\t\toperator: biop,\n\t\t\t\t\tleft,\n\t\t\t\t\tright\n\t\t\t\t};\n\t\t\t\tstack.push(node);\n\t\t\t}\n\n\t\t\tnode = this.gobbleToken();\n\n\t\t\tif (!node) {\n\t\t\t\tthis.throwError(\"Expected expression after \" + cur_biop);\n\t\t\t}\n\n\t\t\tstack.push(biop_info, node);\n\t\t}\n\n\t\ti = stack.length - 1;\n\t\tnode = stack[i];\n\n\t\twhile (i > 1) {\n\t\t\tnode = {\n\t\t\t\ttype: Jsep.BINARY_EXP,\n\t\t\t\toperator: stack[i - 1].value,\n\t\t\t\tleft: stack[i - 2],\n\t\t\t\tright: node\n\t\t\t};\n\t\t\ti -= 2;\n\t\t}\n\n\t\treturn node;\n\t}\n\n\t/**\n\t * An individual part of a binary expression:\n\t * e.g. `foo.bar(baz)`, `1`, `\"abc\"`, `(a % 2)` (because it's in parenthesis)\n\t * @returns {boolean|jsep.Expression}\n\t */\n\tgobbleToken() {\n\t\tlet ch, to_check, tc_len, node;\n\n\t\tthis.gobbleSpaces();\n\t\tnode = this.searchHook('gobble-token');\n\t\tif (node) {\n\t\t\treturn this.runHook('after-token', node);\n\t\t}\n\n\t\tch = this.code;\n\n\t\tif (Jsep.isDecimalDigit(ch) || ch === Jsep.PERIOD_CODE) {\n\t\t\t// Char code 46 is a dot `.` which can start off a numeric literal\n\t\t\treturn this.gobbleNumericLiteral();\n\t\t}\n\n\t\tif (ch === Jsep.SQUOTE_CODE || ch === Jsep.DQUOTE_CODE) {\n\t\t\t// Single or double quotes\n\t\t\tnode = this.gobbleStringLiteral();\n\t\t}\n\t\telse if (ch === Jsep.OBRACK_CODE) {\n\t\t\tnode = this.gobbleArray();\n\t\t}\n\t\telse {\n\t\t\tto_check = this.expr.substr(this.index, Jsep.max_unop_len);\n\t\t\ttc_len = to_check.length;\n\n\t\t\twhile (tc_len > 0) {\n\t\t\t\t// Don't accept an unary op when it is an identifier.\n\t\t\t\t// Unary ops that start with a identifier-valid character must be followed\n\t\t\t\t// by a non identifier-part valid character\n\t\t\t\tif (Jsep.unary_ops.hasOwnProperty(to_check) && (\n\t\t\t\t\t!Jsep.isIdentifierStart(this.code) ||\n\t\t\t\t\t(this.index + to_check.length < this.expr.length && !Jsep.isIdentifierPart(this.expr.charCodeAt(this.index + to_check.length)))\n\t\t\t\t)) {\n\t\t\t\t\tthis.index += tc_len;\n\t\t\t\t\tconst argument = this.gobbleToken();\n\t\t\t\t\tif (!argument) {\n\t\t\t\t\t\tthis.throwError('missing unaryOp argument');\n\t\t\t\t\t}\n\t\t\t\t\treturn this.runHook('after-token', {\n\t\t\t\t\t\ttype: Jsep.UNARY_EXP,\n\t\t\t\t\t\toperator: to_check,\n\t\t\t\t\t\targument,\n\t\t\t\t\t\tprefix: true\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tto_check = to_check.substr(0, --tc_len);\n\t\t\t}\n\n\t\t\tif (Jsep.isIdentifierStart(ch)) {\n\t\t\t\tnode = this.gobbleIdentifier();\n\t\t\t\tif (Jsep.literals.hasOwnProperty(node.name)) {\n\t\t\t\t\tnode = {\n\t\t\t\t\t\ttype: Jsep.LITERAL,\n\t\t\t\t\t\tvalue: Jsep.literals[node.name],\n\t\t\t\t\t\traw: node.name,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\telse if (node.name === Jsep.this_str) {\n\t\t\t\t\tnode = { type: Jsep.THIS_EXP };\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (ch === Jsep.OPAREN_CODE) { // open parenthesis\n\t\t\t\tnode = this.gobbleGroup();\n\t\t\t}\n\t\t}\n\n\t\tif (!node) {\n\t\t\treturn this.runHook('after-token', false);\n\t\t}\n\n\t\tnode = this.gobbleTokenProperty(node);\n\t\treturn this.runHook('after-token', node);\n\t}\n\n\t/**\n\t * Gobble properties of of identifiers/strings/arrays/groups.\n\t * e.g. `foo`, `bar.baz`, `foo['bar'].baz`\n\t * It also gobbles function calls:\n\t * e.g. `Math.acos(obj.angle)`\n\t * @param {jsep.Expression} node\n\t * @returns {jsep.Expression}\n\t */\n\tgobbleTokenProperty(node) {\n\t\tthis.gobbleSpaces();\n\n\t\tlet ch = this.code;\n\t\twhile (ch === Jsep.PERIOD_CODE || ch === Jsep.OBRACK_CODE || ch === Jsep.OPAREN_CODE || ch === Jsep.QUMARK_CODE) {\n\t\t\tlet optional;\n\t\t\tif (ch === Jsep.QUMARK_CODE) {\n\t\t\t\tif (this.expr.charCodeAt(this.index + 1) !== Jsep.PERIOD_CODE) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\toptional = true;\n\t\t\t\tthis.index += 2;\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tch = this.code;\n\t\t\t}\n\t\t\tthis.index++;\n\n\t\t\tif (ch === Jsep.OBRACK_CODE) {\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.MEMBER_EXP,\n\t\t\t\t\tcomputed: true,\n\t\t\t\t\tobject: node,\n\t\t\t\t\tproperty: this.gobbleExpression()\n\t\t\t\t};\n\t\t\t\tif (!node.property) {\n\t\t\t\t\tthis.throwError('Unexpected \"' + this.char + '\"');\n\t\t\t\t}\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tch = this.code;\n\t\t\t\tif (ch !== Jsep.CBRACK_CODE) {\n\t\t\t\t\tthis.throwError('Unclosed [');\n\t\t\t\t}\n\t\t\t\tthis.index++;\n\t\t\t}\n\t\t\telse if (ch === Jsep.OPAREN_CODE) {\n\t\t\t\t// A function call is being made; gobble all the arguments\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.CALL_EXP,\n\t\t\t\t\t'arguments': this.gobbleArguments(Jsep.CPAREN_CODE),\n\t\t\t\t\tcallee: node\n\t\t\t\t};\n\t\t\t}\n\t\t\telse if (ch === Jsep.PERIOD_CODE || optional) {\n\t\t\t\tif (optional) {\n\t\t\t\t\tthis.index--;\n\t\t\t\t}\n\t\t\t\tthis.gobbleSpaces();\n\t\t\t\tnode = {\n\t\t\t\t\ttype: Jsep.MEMBER_EXP,\n\t\t\t\t\tcomputed: false,\n\t\t\t\t\tobject: node,\n\t\t\t\t\tproperty: this.gobbleIdentifier(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (optional) {\n\t\t\t\tnode.optional = true;\n\t\t\t} // else leave undefined for compatibility with esprima\n\n\t\t\tthis.gobbleSpaces();\n\t\t\tch = this.code;\n\t\t}\n\n\t\treturn node;\n\t}\n\n\t/**\n\t * Parse simple numeric literals: `12`, `3.4`, `.5`. Do this by using a string to\n\t * keep track of everything in the numeric literal and then calling `parseFloat` on that string\n\t * @returns {jsep.Literal}\n\t */\n\tgobbleNumericLiteral() {\n\t\tlet number = '', ch, chCode;\n\n\t\twhile (Jsep.isDecimalDigit(this.code)) {\n\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t}\n\n\t\tif (this.code === Jsep.PERIOD_CODE) { // can start with a decimal marker\n\t\t\tnumber += this.expr.charAt(this.index++);\n\n\t\t\twhile (Jsep.isDecimalDigit(this.code)) {\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\t\t}\n\n\t\tch = this.char;\n\n\t\tif (ch === 'e' || ch === 'E') { // exponent marker\n\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\tch = this.char;\n\n\t\t\tif (ch === '+' || ch === '-') { // exponent sign\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\n\t\t\twhile (Jsep.isDecimalDigit(this.code)) { // exponent itself\n\t\t\t\tnumber += this.expr.charAt(this.index++);\n\t\t\t}\n\n\t\t\tif (!Jsep.isDecimalDigit(this.expr.charCodeAt(this.index - 1)) ) {\n\t\t\t\tthis.throwError('Expected exponent (' + number + this.char + ')');\n\t\t\t}\n\t\t}\n\n\t\tchCode = this.code;\n\n\t\t// Check to make sure this isn't a variable name that start with a number (123abc)\n\t\tif (Jsep.isIdentifierStart(chCode)) {\n\t\t\tthis.throwError('Variable names cannot start with a number (' +\n\t\t\t\tnumber + this.char + ')');\n\t\t}\n\t\telse if (chCode === Jsep.PERIOD_CODE || (number.length === 1 && number.charCodeAt(0) === Jsep.PERIOD_CODE)) {\n\t\t\tthis.throwError('Unexpected period');\n\t\t}\n\n\t\treturn {\n\t\t\ttype: Jsep.LITERAL,\n\t\t\tvalue: parseFloat(number),\n\t\t\traw: number\n\t\t};\n\t}\n\n\t/**\n\t * Parses a string literal, staring with single or double quotes with basic support for escape codes\n\t * e.g. `\"hello world\"`, `'this is\\nJSEP'`\n\t * @returns {jsep.Literal}\n\t */\n\tgobbleStringLiteral() {\n\t\tlet str = '';\n\t\tconst startIndex = this.index;\n\t\tconst quote = this.expr.charAt(this.index++);\n\t\tlet closed = false;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tlet ch = this.expr.charAt(this.index++);\n\n\t\t\tif (ch === quote) {\n\t\t\t\tclosed = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (ch === '\\\\') {\n\t\t\t\t// Check for all of the common escape codes\n\t\t\t\tch = this.expr.charAt(this.index++);\n\n\t\t\t\tswitch (ch) {\n\t\t\t\t\tcase 'n': str += '\\n'; break;\n\t\t\t\t\tcase 'r': str += '\\r'; break;\n\t\t\t\t\tcase 't': str += '\\t'; break;\n\t\t\t\t\tcase 'b': str += '\\b'; break;\n\t\t\t\t\tcase 'f': str += '\\f'; break;\n\t\t\t\t\tcase 'v': str += '\\x0B'; break;\n\t\t\t\t\tdefault : str += ch;\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tstr += ch;\n\t\t\t}\n\t\t}\n\n\t\tif (!closed) {\n\t\t\tthis.throwError('Unclosed quote after \"' + str + '\"');\n\t\t}\n\n\t\treturn {\n\t\t\ttype: Jsep.LITERAL,\n\t\t\tvalue: str,\n\t\t\traw: this.expr.substring(startIndex, this.index),\n\t\t};\n\t}\n\n\t/**\n\t * Gobbles only identifiers\n\t * e.g.: `foo`, `_value`, `$x1`\n\t * Also, this function checks if that identifier is a literal:\n\t * (e.g. `true`, `false`, `null`) or `this`\n\t * @returns {jsep.Identifier}\n\t */\n\tgobbleIdentifier() {\n\t\tlet ch = this.code, start = this.index;\n\n\t\tif (Jsep.isIdentifierStart(ch)) {\n\t\t\tthis.index++;\n\t\t}\n\t\telse {\n\t\t\tthis.throwError('Unexpected ' + this.char);\n\t\t}\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tch = this.code;\n\n\t\t\tif (Jsep.isIdentifierPart(ch)) {\n\t\t\t\tthis.index++;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\ttype: Jsep.IDENTIFIER,\n\t\t\tname: this.expr.slice(start, this.index),\n\t\t};\n\t}\n\n\t/**\n\t * Gobbles a list of arguments within the context of a function call\n\t * or array literal. This function also assumes that the opening character\n\t * `(` or `[` has already been gobbled, and gobbles expressions and commas\n\t * until the terminator character `)` or `]` is encountered.\n\t * e.g. `foo(bar, baz)`, `my_func()`, or `[bar, baz]`\n\t * @param {number} termination\n\t * @returns {jsep.Expression[]}\n\t */\n\tgobbleArguments(termination) {\n\t\tconst args = [];\n\t\tlet closed = false;\n\t\tlet separator_count = 0;\n\n\t\twhile (this.index < this.expr.length) {\n\t\t\tthis.gobbleSpaces();\n\t\t\tlet ch_i = this.code;\n\n\t\t\tif (ch_i === termination) { // done parsing\n\t\t\t\tclosed = true;\n\t\t\t\tthis.index++;\n\n\t\t\t\tif (termination === Jsep.CPAREN_CODE && separator_count && separator_count >= args.length){\n\t\t\t\t\tthis.throwError('Unexpected token ' + String.fromCharCode(termination));\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse if (ch_i === Jsep.COMMA_CODE) { // between expressions\n\t\t\t\tthis.index++;\n\t\t\t\tseparator_count++;\n\n\t\t\t\tif (separator_count !== args.length) { // missing argument\n\t\t\t\t\tif (termination === Jsep.CPAREN_CODE) {\n\t\t\t\t\t\tthis.throwError('Unexpected token ,');\n\t\t\t\t\t}\n\t\t\t\t\telse if (termination === Jsep.CBRACK_CODE) {\n\t\t\t\t\t\tfor (let arg = args.length; arg < separator_count; arg++) {\n\t\t\t\t\t\t\targs.push(null);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (args.length !== separator_count && separator_count !== 0) {\n\t\t\t\t// NOTE: `&& separator_count !== 0` allows for either all commas, or all spaces as arguments\n\t\t\t\tthis.throwError('Expected comma');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst node = this.gobbleExpression();\n\n\t\t\t\tif (!node || node.type === Jsep.COMPOUND) {\n\t\t\t\t\tthis.throwError('Expected comma');\n\t\t\t\t}\n\n\t\t\t\targs.push(node);\n\t\t\t}\n\t\t}\n\n\t\tif (!closed) {\n\t\t\tthis.throwError('Expected ' + String.fromCharCode(termination));\n\t\t}\n\n\t\treturn args;\n\t}\n\n\t/**\n\t * Responsible for parsing a group of things within parentheses `()`\n\t * that have no identifier in front (so not a function call)\n\t * This function assumes that it needs to gobble the opening parenthesis\n\t * and then tries to gobble everything within that parenthesis, assuming\n\t * that the next thing it should see is the close parenthesis. If not,\n\t * then the expression probably doesn't have a `)`\n\t * @returns {boolean|jsep.Expression}\n\t */\n\tgobbleGroup() {\n\t\tthis.index++;\n\t\tlet nodes = this.gobbleExpressions(Jsep.CPAREN_CODE);\n\t\tif (this.code === Jsep.CPAREN_CODE) {\n\t\t\tthis.index++;\n\t\t\tif (nodes.length === 1) {\n\t\t\t\treturn nodes[0];\n\t\t\t}\n\t\t\telse if (!nodes.length) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn {\n\t\t\t\t\ttype: Jsep.SEQUENCE_EXP,\n\t\t\t\t\texpressions: nodes,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tthis.throwError('Unclosed (');\n\t\t}\n\t}\n\n\t/**\n\t * Responsible for parsing Array literals `[1, 2, 3]`\n\t * This function assumes that it needs to gobble the opening bracket\n\t * and then tries to gobble the expressions as arguments.\n\t * @returns {jsep.ArrayExpression}\n\t */\n\tgobbleArray() {\n\t\tthis.index++;\n\n\t\treturn {\n\t\t\ttype: Jsep.ARRAY_EXP,\n\t\t\telements: this.gobbleArguments(Jsep.CBRACK_CODE)\n\t\t};\n\t}\n}\n\n// Static fields:\nconst hooks = new Hooks();\nObject.assign(Jsep, {\n\thooks,\n\tplugins: new Plugins(Jsep),\n\n\t// Node Types\n\t// ----------\n\t// This is the full set of types that any JSEP node can be.\n\t// Store them here to save space when minified\n\tCOMPOUND: 'Compound',\n\tSEQUENCE_EXP: 'SequenceExpression',\n\tIDENTIFIER: 'Identifier',\n\tMEMBER_EXP: 'MemberExpression',\n\tLITERAL: 'Literal',\n\tTHIS_EXP: 'ThisExpression',\n\tCALL_EXP: 'CallExpression',\n\tUNARY_EXP: 'UnaryExpression',\n\tBINARY_EXP: 'BinaryExpression',\n\tARRAY_EXP: 'ArrayExpression',\n\n\tTAB_CODE: 9,\n\tLF_CODE: 10,\n\tCR_CODE: 13,\n\tSPACE_CODE: 32,\n\tPERIOD_CODE: 46, // '.'\n\tCOMMA_CODE: 44, // ','\n\tSQUOTE_CODE: 39, // single quote\n\tDQUOTE_CODE: 34, // double quotes\n\tOPAREN_CODE: 40, // (\n\tCPAREN_CODE: 41, // )\n\tOBRACK_CODE: 91, // [\n\tCBRACK_CODE: 93, // ]\n\tQUMARK_CODE: 63, // ?\n\tSEMCOL_CODE: 59, // ;\n\tCOLON_CODE: 58, // :\n\n\n\t// Operations\n\t// ----------\n\t// Use a quickly-accessible map to store all of the unary operators\n\t// Values are set to `1` (it really doesn't matter)\n\tunary_ops: {\n\t\t'-': 1,\n\t\t'!': 1,\n\t\t'~': 1,\n\t\t'+': 1\n\t},\n\n\t// Also use a map for the binary operations but set their values to their\n\t// binary precedence for quick reference (higher number = higher precedence)\n\t// see [Order of operations](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)\n\tbinary_ops: {\n\t\t'||': 1, '??': 1,\n\t\t'&&': 2, '|': 3, '^': 4, '&': 5,\n\t\t'==': 6, '!=': 6, '===': 6, '!==': 6,\n\t\t'<': 7, '>': 7, '<=': 7, '>=': 7,\n\t\t'<<': 8, '>>': 8, '>>>': 8,\n\t\t'+': 9, '-': 9,\n\t\t'*': 10, '/': 10, '%': 10,\n\t\t'**': 11,\n\t},\n\n\t// sets specific binary_ops as right-associative\n\tright_associative: new Set(['**']),\n\n\t// Additional valid identifier chars, apart from a-z, A-Z and 0-9 (except on the starting char)\n\tadditional_identifier_chars: new Set(['$', '_']),\n\n\t// Literals\n\t// ----------\n\t// Store the values to return for the various literals we may encounter\n\tliterals: {\n\t\t'true': true,\n\t\t'false': false,\n\t\t'null': null\n\t},\n\n\t// Except for `this`, which is special. This could be changed to something like `'self'` as well\n\tthis_str: 'this',\n});\nJsep.max_unop_len = Jsep.getMaxKeyLen(Jsep.unary_ops);\nJsep.max_binop_len = Jsep.getMaxKeyLen(Jsep.binary_ops);\n\n// Backward Compatibility:\nconst jsep = expr => (new Jsep(expr)).parse();\nconst stdClassProps = Object.getOwnPropertyNames(class Test{});\nObject.getOwnPropertyNames(Jsep)\n\t.filter(prop => !stdClassProps.includes(prop) && jsep[prop] === undefined)\n\t.forEach((m) => {\n\t\tjsep[m] = Jsep[m];\n\t});\njsep.Jsep = Jsep; // allows for const { Jsep } = require('jsep');\n\nconst CONDITIONAL_EXP = 'ConditionalExpression';\n\nvar ternary = {\n\tname: 'ternary',\n\n\tinit(jsep) {\n\t\t// Ternary expression: test ? consequent : alternate\n\t\tjsep.hooks.add('after-expression', function gobbleTernary(env) {\n\t\t\tif (env.node && this.code === jsep.QUMARK_CODE) {\n\t\t\t\tthis.index++;\n\t\t\t\tconst test = env.node;\n\t\t\t\tconst consequent = this.gobbleExpression();\n\n\t\t\t\tif (!consequent) {\n\t\t\t\t\tthis.throwError('Expected expression');\n\t\t\t\t}\n\n\t\t\t\tthis.gobbleSpaces();\n\n\t\t\t\tif (this.code === jsep.COLON_CODE) {\n\t\t\t\t\tthis.index++;\n\t\t\t\t\tconst alternate = this.gobbleExpression();\n\n\t\t\t\t\tif (!alternate) {\n\t\t\t\t\t\tthis.throwError('Expected expression');\n\t\t\t\t\t}\n\t\t\t\t\tenv.node = {\n\t\t\t\t\t\ttype: CONDITIONAL_EXP,\n\t\t\t\t\t\ttest,\n\t\t\t\t\t\tconsequent,\n\t\t\t\t\t\talternate,\n\t\t\t\t\t};\n\n\t\t\t\t\t// check for operators of higher priority than ternary (i.e. assignment)\n\t\t\t\t\t// jsep sets || at 1, and assignment at 0.9, and conditional should be between them\n\t\t\t\t\tif (test.operator && jsep.binary_ops[test.operator] <= 0.9) {\n\t\t\t\t\t\tlet newTest = test;\n\t\t\t\t\t\twhile (newTest.right.operator && jsep.binary_ops[newTest.right.operator] <= 0.9) {\n\t\t\t\t\t\t\tnewTest = newTest.right;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tenv.node.test = newTest.right;\n\t\t\t\t\t\tnewTest.right = env.node;\n\t\t\t\t\t\tenv.node = test;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.throwError('Expected :');\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n};\n\n// Add default plugins:\n\njsep.plugins.register(ternary);\n\nexport { Jsep, jsep as default };\n","const FSLASH_CODE = 47; // '/'\nconst BSLASH_CODE = 92; // '\\\\'\n\nvar index = {\n\tname: 'regex',\n\n\tinit(jsep) {\n\t\t// Regex literal: /abc123/ig\n\t\tjsep.hooks.add('gobble-token', function gobbleRegexLiteral(env) {\n\t\t\tif (this.code === FSLASH_CODE) {\n\t\t\t\tconst patternIndex = ++this.index;\n\n\t\t\t\tlet inCharSet = false;\n\t\t\t\twhile (this.index < this.expr.length) {\n\t\t\t\t\tif (this.code === FSLASH_CODE && !inCharSet) {\n\t\t\t\t\t\tconst pattern = this.expr.slice(patternIndex, this.index);\n\n\t\t\t\t\t\tlet flags = '';\n\t\t\t\t\t\twhile (++this.index < this.expr.length) {\n\t\t\t\t\t\t\tconst code = this.code;\n\t\t\t\t\t\t\tif ((code >= 97 && code <= 122) // a...z\n\t\t\t\t\t\t\t\t|| (code >= 65 && code <= 90) // A...Z\n\t\t\t\t\t\t\t\t|| (code >= 48 && code <= 57)) { // 0-9\n\t\t\t\t\t\t\t\tflags += this.char;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet value;\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tvalue = new RegExp(pattern, flags);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch (e) {\n\t\t\t\t\t\t\tthis.throwError(e.message);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tenv.node = {\n\t\t\t\t\t\t\ttype: jsep.LITERAL,\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\traw: this.expr.slice(patternIndex - 1, this.index),\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// allow . [] and () after regex: /regex/.test(a)\n\t\t\t\t\t\tenv.node = this.gobbleTokenProperty(env.node);\n\t\t\t\t\t\treturn env.node;\n\t\t\t\t\t}\n\t\t\t\t\tif (this.code === jsep.OBRACK_CODE) {\n\t\t\t\t\t\tinCharSet = true;\n\t\t\t\t\t}\n\t\t\t\t\telse if (inCharSet && this.code === jsep.CBRACK_CODE) {\n\t\t\t\t\t\tinCharSet = false;\n\t\t\t\t\t}\n\t\t\t\t\tthis.index += this.code === BSLASH_CODE ? 2 : 1;\n\t\t\t\t}\n\t\t\t\tthis.throwError('Unclosed Regex');\n\t\t\t}\n\t\t});\n\t},\n};\n\nexport { index as default };\n","const PLUS_CODE = 43; // +\nconst MINUS_CODE = 45; // -\n\nconst plugin = {\n\tname: 'assignment',\n\n\tassignmentOperators: new Set([\n\t\t'=',\n\t\t'*=',\n\t\t'**=',\n\t\t'/=',\n\t\t'%=',\n\t\t'+=',\n\t\t'-=',\n\t\t'<<=',\n\t\t'>>=',\n\t\t'>>>=',\n\t\t'&=',\n\t\t'^=',\n\t\t'|=',\n\t\t'||=',\n\t\t'&&=',\n\t\t'??=',\n\t]),\n\tupdateOperators: [PLUS_CODE, MINUS_CODE],\n\tassignmentPrecedence: 0.9,\n\n\tinit(jsep) {\n\t\tconst updateNodeTypes = [jsep.IDENTIFIER, jsep.MEMBER_EXP];\n\t\tplugin.assignmentOperators.forEach(op => jsep.addBinaryOp(op, plugin.assignmentPrecedence, true));\n\n\t\tjsep.hooks.add('gobble-token', function gobbleUpdatePrefix(env) {\n\t\t\tconst code = this.code;\n\t\t\tif (plugin.updateOperators.some(c => c === code && c === this.expr.charCodeAt(this.index + 1))) {\n\t\t\t\tthis.index += 2;\n\t\t\t\tenv.node = {\n\t\t\t\t\ttype: 'UpdateExpression',\n\t\t\t\t\toperator: code === PLUS_CODE ? '++' : '--',\n\t\t\t\t\targument: this.gobbleTokenProperty(this.gobbleIdentifier()),\n\t\t\t\t\tprefix: true,\n\t\t\t\t};\n\t\t\t\tif (!env.node.argument || !updateNodeTypes.includes(env.node.argument.type)) {\n\t\t\t\t\tthis.throwError(`Unexpected ${env.node.operator}`);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tjsep.hooks.add('after-token', function gobbleUpdatePostfix(env) {\n\t\t\tif (env.node) {\n\t\t\t\tconst code = this.code;\n\t\t\t\tif (plugin.updateOperators.some(c => c === code && c === this.expr.charCodeAt(this.index + 1))) {\n\t\t\t\t\tif (!updateNodeTypes.includes(env.node.type)) {\n\t\t\t\t\t\tthis.throwError(`Unexpected ${env.node.operator}`);\n\t\t\t\t\t}\n\t\t\t\t\tthis.index += 2;\n\t\t\t\t\tenv.node = {\n\t\t\t\t\t\ttype: 'UpdateExpression',\n\t\t\t\t\t\toperator: code === PLUS_CODE ? '++' : '--',\n\t\t\t\t\t\targument: env.node,\n\t\t\t\t\t\tprefix: false,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tjsep.hooks.add('after-expression', function gobbleAssignment(env) {\n\t\t\tif (env.node) {\n\t\t\t\t// Note: Binaries can be chained in a single expression to respect\n\t\t\t\t// operator precedence (i.e. a = b = 1 + 2 + 3)\n\t\t\t\t// Update all binary assignment nodes in the tree\n\t\t\t\tupdateBinariesToAssignments(env.node);\n\t\t\t}\n\t\t});\n\n\t\tfunction updateBinariesToAssignments(node) {\n\t\t\tif (plugin.assignmentOperators.has(node.operator)) {\n\t\t\t\tnode.type = 'AssignmentExpression';\n\t\t\t\tupdateBinariesToAssignments(node.left);\n\t\t\t\tupdateBinariesToAssignments(node.right);\n\t\t\t}\n\t\t\telse if (!node.operator) {\n\t\t\t\tObject.values(node).forEach((val) => {\n\t\t\t\t\tif (val && typeof val === 'object') {\n\t\t\t\t\t\tupdateBinariesToAssignments(val);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t},\n};\n\nexport { plugin as default };\n","/* eslint-disable unicorn/no-top-level-side-effects -- Temporary? */\n/* eslint-disable no-bitwise -- Convenient */\nimport jsep from 'jsep';\nimport jsepRegex from '@jsep-plugin/regex';\nimport jsepAssignment from '@jsep-plugin/assignment';\n\n/**\n * @import {EvaluatedResult, UnknownResult} from './jsonpath.js';\n */\n\n/**\n * @typedef {any} AssignmentExpression\n */\n\n/**\n * @typedef {any} Substitution\n */\n\n/**\n * @typedef {any} AnyParameter\n */\n\n/**\n * @typedef {Record} Substitutions\n */\n\n// register plugins\njsep.plugins.register(jsepRegex, jsepAssignment);\njsep.addUnaryOp('typeof');\njsep.addUnaryOp('void');\njsep.addLiteral('null', null);\njsep.addLiteral('undefined', undefined);\n\nconst BLOCKED_PROTO_PROPERTIES = new Set([\n 'constructor',\n '__proto__',\n '__defineGetter__',\n '__defineSetter__',\n '__lookupGetter__',\n '__lookupSetter__'\n]);\n\nconst SafeEval = {\n /**\n * @param {jsep.Expression} ast\n * @param {Substitutions} subs\n * @returns {UnknownResult}\n */\n evalAst (ast, subs) {\n switch (ast.type) {\n case 'BinaryExpression':\n case 'LogicalExpression':\n return SafeEval.evalBinaryExpression(\n /** @type {jsep.BinaryExpression} */ (ast),\n subs\n );\n case 'Compound':\n return SafeEval.evalCompound(\n /** @type {jsep.Compound} */ (ast),\n subs\n );\n case 'ConditionalExpression':\n return SafeEval.evalConditionalExpression(\n /** @type {jsep.ConditionalExpression} */ (ast),\n subs\n );\n case 'Identifier':\n return SafeEval.evalIdentifier(\n /** @type {jsep.Identifier} */ (ast),\n subs\n );\n case 'Literal':\n return SafeEval.evalLiteral(/** @type {jsep.Literal} */ (ast));\n case 'MemberExpression':\n return SafeEval.evalMemberExpression(\n /** @type {jsep.MemberExpression} */ (ast),\n subs\n );\n case 'UnaryExpression':\n return SafeEval.evalUnaryExpression(\n /** @type {jsep.UnaryExpression} */ (ast),\n subs\n );\n case 'ArrayExpression':\n return SafeEval.evalArrayExpression(\n /** @type {jsep.ArrayExpression} */ (ast),\n subs\n );\n case 'CallExpression':\n return SafeEval.evalCallExpression(\n /** @type {jsep.CallExpression} */ (ast),\n subs\n );\n case 'AssignmentExpression':\n return SafeEval.evalAssignmentExpression(\n /** @type {AssignmentExpression} */ (ast),\n subs\n );\n default:\n throw new SyntaxError('Unexpected expression', {\n cause: ast\n });\n }\n },\n\n /**\n * @param {jsep.BinaryExpression} ast\n * @param {Substitutions} subs\n * @returns {UnknownResult}\n */\n evalBinaryExpression (ast, subs) {\n /**\n * @typedef {{\n * [key: string]: (a: AnyParameter, b: AnyParameter) => UnknownResult\n * }} OperatorTable\n */\n const result = /** @type {OperatorTable} */ ({\n '||': (a, b) => a || b(),\n '&&': (a, b) => a && b(),\n '|': (a, b) => a | b(),\n '^': (a, b) => a ^ b(),\n '&': (a, b) => a & b(),\n // eslint-disable-next-line eqeqeq -- API\n '==': (a, b) => a == b(),\n // eslint-disable-next-line eqeqeq -- API\n '!=': (a, b) => a != b(),\n '===': (a, b) => a === b(),\n '!==': (a, b) => a !== b(),\n '<': (a, b) => a < b(),\n '>': (a, b) => a > b(),\n '<=': (a, b) => a <= b(),\n '>=': (a, b) => a >= b(),\n '<<': (a, b) => a << b(),\n '>>': (a, b) => a >> b(),\n '>>>': (a, b) => a >>> b(),\n '+': (a, b) => a + b(),\n '-': (a, b) => a - b(),\n '*': (a, b) => a * b(),\n '/': (a, b) => a / b(),\n '%': (a, b) => a % b()\n })[ast.operator](\n SafeEval.evalAst(ast.left, subs),\n () => SafeEval.evalAst(ast.right, subs)\n );\n return result;\n },\n\n /**\n * @param {jsep.Compound} ast\n * @param {Substitutions} subs\n * @returns {UnknownResult}\n */\n evalCompound (ast, subs) {\n let last;\n for (let i = 0; i < ast.body.length; i++) {\n if (\n ast.body[i].type === 'Identifier' &&\n ['var', 'let', 'const'].includes(\n /** @type {jsep.Identifier} */\n (ast.body[i]).name\n ) &&\n Object.hasOwn(ast.body, i + 1) &&\n ast.body[i + 1].type === 'AssignmentExpression'\n ) {\n // var x=2; is detected as\n // [{Identifier var}, {AssignmentExpression x=2}]\n i += 1;\n }\n const expr = ast.body[i];\n last = SafeEval.evalAst(expr, subs);\n }\n return last;\n },\n\n /**\n * @param {jsep.ConditionalExpression} ast\n * @param {Substitutions} subs\n * @returns {UnknownResult}\n */\n evalConditionalExpression (ast, subs) {\n if (SafeEval.evalAst(ast.test, subs)) {\n return SafeEval.evalAst(ast.consequent, subs);\n }\n return SafeEval.evalAst(ast.alternate, subs);\n },\n\n /**\n * @param {jsep.Identifier} ast\n * @param {Substitutions} subs\n * @returns {UnknownResult}\n */\n evalIdentifier (ast, subs) {\n if (Object.hasOwn(subs, ast.name)) {\n return subs[ast.name];\n }\n throw new ReferenceError(`${ast.name} is not defined`);\n },\n\n /**\n * @param {jsep.Literal} ast\n * @returns {UnknownResult}\n */\n evalLiteral (ast) {\n return ast.value;\n },\n\n /**\n * @param {jsep.MemberExpression} ast\n * @param {Substitutions} subs\n * @returns {UnknownResult}\n */\n evalMemberExpression (ast, subs) {\n const prop = String(\n // NOTE: `String(value)` throws error when\n // value has overwritten the toString method to return non-string\n // i.e. `value = {toString: () => []}`\n ast.computed\n ? SafeEval.evalAst(ast.property, subs) // `object[property]`\n : ast.property.name // `object.property` property is Identifier\n );\n const obj = SafeEval.evalAst(ast.object, subs);\n if (obj === undefined || obj === null) {\n throw new TypeError(\n `Cannot read properties of ${obj} (reading '${prop}')`\n );\n }\n if (!Object.hasOwn(obj, prop) && BLOCKED_PROTO_PROPERTIES.has(prop)) {\n throw new TypeError(\n `Cannot read properties of ${obj} (reading '${prop}')`\n );\n }\n const result = /** @type {Record} */ (obj)[prop];\n if (typeof result === 'function' && result !== Function) {\n return result.bind(obj); // arrow functions aren't affected by bind.\n }\n return result;\n },\n\n /**\n * @param {jsep.UnaryExpression} ast\n * @param {Substitutions} subs\n * @returns {UnknownResult}\n */\n evalUnaryExpression (ast, subs) {\n /**\n * @typedef {{\n * [key: string]: (a: AnyParameter) => UnknownResult\n * }} UnaryOperatorTable\n */\n const result = /** @type {UnaryOperatorTable} */ ({\n '-': (a) => -(/** @type {EvaluatedResult} */ (\n SafeEval.evalAst(a, subs))\n ),\n '!': (a) => !SafeEval.evalAst(a, subs),\n '~': (a) => ~(/** @type {EvaluatedResult} */ (\n SafeEval.evalAst(a, subs))\n ),\n // eslint-disable-next-line no-implicit-coercion -- API\n '+': (a) => +(/** @type {EvaluatedResult} */ (\n SafeEval.evalAst(a, subs))\n ),\n typeof: (a) => typeof SafeEval.evalAst(a, subs),\n // eslint-disable-next-line no-void -- Ok\n void: (a) => void SafeEval.evalAst(a, subs)\n })[ast.operator](ast.argument);\n return result;\n },\n\n /**\n * @param {jsep.ArrayExpression} ast\n * @param {Substitutions} subs\n * @returns {UnknownResult}\n */\n evalArrayExpression (ast, subs) {\n return ast.elements.map((el) => SafeEval.evalAst(\n /** @type {jsep.Expression} */\n (el),\n subs\n ));\n },\n\n /**\n * @param {jsep.CallExpression} ast\n * @param {Substitutions} subs\n * @returns {UnknownResult}\n */\n evalCallExpression (ast, subs) {\n const args = ast.arguments.map((arg) => SafeEval.evalAst(arg, subs));\n const func = SafeEval.evalAst(ast.callee, subs);\n if (func === Function) {\n throw new Error('Function constructor is disabled');\n }\n return (/** @type {(...args: AnyParameter[]) => UnknownResult} */ (\n func\n ))(...args);\n },\n\n /**\n * @param {AssignmentExpression} ast\n * @param {Substitutions} subs\n * @returns {UnknownResult}\n */\n evalAssignmentExpression (ast, subs) {\n if (ast.left.type !== 'Identifier') {\n throw new SyntaxError('Invalid left-hand side in assignment');\n }\n const id = /** @type {jsep.Identifier} */ (\n ast.left\n ).name;\n const value = SafeEval.evalAst(ast.right, subs);\n subs[id] = value;\n return subs[id];\n }\n};\n\n/**\n * A replacement for NodeJS' VM.Script which is also {@link https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP | Content Security Policy} friendly.\n */\nclass SafeScript {\n /**\n * @param {string} expr Expression to evaluate\n */\n constructor (expr) {\n this.code = expr;\n this.ast = /** @type {unknown} */ (jsep(this.code));\n }\n\n /**\n * @param {object} context Object whose items will be added\n * to evaluation\n * @returns {EvaluatedResult} Result of evaluated code\n */\n runInNewContext (context) {\n // `Object.create(null)` creates a prototypeless object\n const keyMap = Object.assign(Object.create(null), context);\n return SafeEval.evalAst(\n /** @type {jsep.Expression} */ (this.ast),\n keyMap\n );\n }\n}\n\nexport {SafeScript};\n","/* eslint-disable camelcase -- Convenient for escaping */\n/* eslint-disable class-methods-use-this -- Consistent monkey-patching */\n/* eslint-disable unicorn/prefer-private-class-fields -- Allow\n monkey-patching */\nimport {SafeScript} from './Safe-Script.js';\n\n/**\n * @import {Script} from './jsonpath-browser.js';\n */\n\n/**\n * @typedef {any} AnyInput\n */\n\n/**\n * @typedef {((...args: any[]) => any)} SandboxCallback\n */\n\n/**\n * @typedef {any|SandboxCallback} SandboxPropertyValue\n */\n\n/**\n * @typedef {(string|number)[]} ExpressionArray\n */\n\n/**\n * @typedef {\"scalar\"|\"boolean\"|\"string\"|\"undefined\"\n * |\"function\"|\"integer\"|\"number\"|\"nonFinite\"|\"object\"\n * |\"array\"|\"other\"|\"null\"} ValueType\n */\n\n/**\n * @typedef {unknown} ParentValue\n */\n\n/**\n * @typedef {unknown} UnknownResult\n */\n\n/**\n * @typedef {string|number|null} ParentProperty\n */\n\n/**\n * @typedef {ReturnObject|string|number|boolean|null|unknown[]\n * |Record} PreferredOutput\n */\n\n/**\n * Copies array and then pushes item into it.\n * @param {ExpressionArray} arr Array to copy and into which to push\n * @param {string|number} item Array item to add (to end)\n * @returns {ExpressionArray} Copy of the original array\n */\nfunction push (arr, item) {\n arr = arr.slice();\n arr.push(item);\n return arr;\n}\n/**\n * Copies array and then unshifts item into it.\n * @param {string|number} item Array item to add (to beginning)\n * @param {ExpressionArray} arr Array to copy and into which to unshift\n * @returns {ExpressionArray} Copy of the original array\n */\nfunction unshift (item, arr) {\n arr = arr.slice();\n arr.unshift(item);\n return arr;\n}\n\n/**\n * @typedef {object} ReturnObject\n * @property {ExpressionArray|string} path\n * @property {unknown} value\n * @property {ParentValue} parent\n * @property {ParentProperty} parentProperty\n * @property {boolean} [isParentSelector]\n * @property {boolean} [hasArrExpr]\n * @property {ExpressionArray} [expr]\n * @property {string} [pointer]\n */\n\n/**\n * @callback JSONPathCallback\n * @param {any} preferredOutput Using `any` type instead of `PreferredOutput` so\n * that user can supply flexible type\n * @param {\"value\"|\"property\"} type\n * @param {ReturnObject} fullRetObj\n * @returns {void}\n */\n\n/**\n * @callback OtherTypeCallback\n * @param {unknown} val\n * @param {ExpressionArray} path\n * @param {ParentValue} parent\n * @param {string|null} parentPropName\n * @returns {boolean|null}\n */\n\n/**\n * @typedef {any} ContextItem\n */\n\n/**\n * @typedef {any} EvaluatedResult\n */\n\n/**\n * @callback EvalCallback\n * @param {string} code\n * @param {ContextItem} context\n * @returns {EvaluatedResult}\n */\n\n/**\n * @typedef {new (expr: string) => {\n * runInNewContext: (context: object) => EvaluatedResult\n * }} ScriptConstructor\n */\n\n/**\n * @typedef {ScriptConstructor} EvalClass\n */\n\n/**\n * @typedef {\"value\"|\"path\"|\"pointer\"|\"parent\"|\"parentProperty\"\n * |\"all\"} ResultType\n */\n\n/**\n * @typedef {EvalCallback|EvalClass|'safe'|'native'|boolean} EvalValue\n */\n\n/**\n * @typedef {string|string[]} PathType\n */\n\n/**\n * @typedef {{Script: ScriptConstructor}} SafeScriptType\n */\n\n/**\n * @typedef {{Script: ScriptConstructor}} ScriptType\n */\n\n/**\n * @typedef {{\n * _$_path?: string,\n * _$_parentProperty?: ParentProperty,\n * _$_parent?: ParentValue,\n * _$_property?: string|number,\n * _$_root?: AnyInput,\n * _$_v?: unknown,\n * [key: string]: SandboxPropertyValue\n * }} SandboxType\n */\n\n/**\n * @typedef {object} JSONPathOptions\n * @property {AnyInput} [json]\n * @property {PathType} [path]\n * @property {ResultType} [resultType=\"value\"]\n * @property {boolean} [flatten=false]\n * @property {boolean} [wrap=true]\n * @property {SandboxType} [sandbox={}]\n * @property {EvalValue} [eval='safe']\n * @property {any|null} [parent=null]\n * @property {ParentProperty} [parentProperty=null]\n * @property {JSONPathCallback} [callback]\n * @property {OtherTypeCallback} [otherTypeCallback] Defaults to\n * function which throws on encountering `@other`\n * @property {boolean} [autostart=true]\n * @property {boolean} [ignoreEvalErrors=false]\n */\n\n\n/**\n * @overload\n * @param {string} opts JSON path to evaluate\n * @param {AnyInput} [expr] JSON object to evaluate against\n * @param {JSONPathCallback} [obj] Passed 3 arguments: 1) desired\n * payload per `resultType`, 2) `\"value\"|\"property\"`, 3) Full returned\n * object with all payloads\n * @param {OtherTypeCallback} [callback] If `@other()` is at the\n * end of one's query, this will be invoked with the value of the item,\n * its path, its parent, and its parent's property name, and it should\n * return a boolean indicating whether the supplied value belongs to the\n * \"other\" type or not (or it may handle transformations and return\n * `false`).\n * @param {undefined} [otherTypeCallback]\n * @returns {unknown} The string form always has `autostart` implicitly\n * `true`, so the result is the evaluated value, not a `JSONPathClass`\n */\n/**\n * @overload\n * @param {JSONPathOptions & {autostart: false}} opts An options object\n * with `autostart` explicitly set to `false` defers evaluation and\n * returns the `JSONPathClass` instance instead\n * @returns {JSONPathClass}\n */\n/**\n * @overload\n * @param {JSONPathOptions} opts If a string, will be treated as\n * `expr`\n * @returns {unknown}\n */\n/**\n * @param {JSONPathOptions|string} opts If a string, will be treated as `expr`\n * @param {string|AnyInput} [expr] JSON path to evaluate\n * @param {AnyInput|JSONPathCallback} [obj] JSON object to evaluate against\n * @param {JSONPathCallback|OtherTypeCallback} [callback] Passed 3\n * arguments: 1) desired payload per `resultType`,\n * 2) `\"value\"|\"property\"`, 3) Full returned object with\n * all payloads\n * @param {OtherTypeCallback} [otherTypeCallback] If `@other()` is at the end\n * of one's query, this will be invoked with the value of the item, its\n * path, its parent, and its parent's property name, and it should return\n * a boolean indicating whether the supplied value belongs to the \"other\"\n * type or not (or it may handle transformations and return `false`).\n * @throws {Error}\n * @returns {unknown|JSONPathClass}\n */\nfunction JSONPath (opts, expr, obj, callback, otherTypeCallback) {\n try {\n if (opts && typeof opts === 'object') {\n return new JSONPathClass(opts);\n }\n return new JSONPathClass(\n opts,\n expr,\n /** @type {JSONPathCallback|undefined} */ (obj),\n /** @type {OtherTypeCallback|undefined} */ (callback),\n /** @type {undefined} */ (otherTypeCallback)\n );\n } catch (e) {\n if (new.target) {\n throw e;\n }\n if (e && typeof e === 'object' && 'value' in e) {\n return /** @type {{value: UnknownResult}} */ (e).value;\n }\n throw e;\n }\n}\n\n/**\n *\n */\nclass JSONPathClass {\n /**\n * @overload\n * @param {string} opts JSON path to evaluate\n * @param {AnyInput} [expr] JSON object to evaluate against\n * @param {JSONPathCallback} [obj] Passed 3 arguments: 1) desired\n * payload per `resultType`, 2) `\"value\"|\"property\"`, 3) Full returned\n * object with all payloads\n * @param {OtherTypeCallback} [callback] If `@other()` is at the\n * end of one's query, this will be invoked with the value of the item,\n * its path, its parent, and its parent's property name, and it should\n * return a boolean indicating whether the supplied value belongs to the\n * \"other\" type or not (or it may handle transformations and return\n * `false`).\n * @param {undefined} [otherTypeCallback]\n */\n /**\n * @overload\n * @param {JSONPathOptions} opts If a string, will be treated as\n * `expr`\n */\n /**\n * @param {null|string|JSONPathOptions} opts If a string, will be treated as\n * `expr`\n * @param {string|AnyInput} [expr] JSON path to evaluate\n * @param {AnyInput|JSONPathCallback} [obj] JSON object to evaluate against\n * @param {JSONPathCallback|OtherTypeCallback} [callback] Passed 3\n * arguments: 1) desired payload per `resultType`,\n * 2) `\"value\"|\"property\"`, 3) Full returned\n * object with all payloads\n * @param {OtherTypeCallback} [otherTypeCallback] If `@other()` is at the\n * end of one's query, this will be invoked with the value of the item,\n * its path, its parent, and its parent's property name, and it should\n * return a boolean indicating whether the supplied value belongs to the\n * \"other\" type or not (or it may handle transformations and return\n * `false`).\n */\n constructor (opts, expr, obj, callback, otherTypeCallback) {\n if (typeof opts === 'string') {\n otherTypeCallback = /** @type {OtherTypeCallback} */ (\n callback\n );\n callback = /** @type {JSONPathCallback} */ (\n obj\n );\n obj = expr;\n expr = opts;\n opts = null;\n }\n const optObj = opts && typeof opts === 'object';\n opts ||= /** @type {JSONPathOptions} */ ({});\n /** @type {ResultType|undefined} */\n this.currResultType = undefined;\n\n /** @type {EvalValue|undefined} */\n this.currEval = undefined;\n\n /** @type {OtherTypeCallback|undefined} */\n this.currOtherTypeCallback = undefined;\n\n /** @type {SandboxType|undefined} */\n this.currSandbox = undefined;\n\n this._hasParentSelector = false;\n\n this.json = opts.json || obj;\n this.path = opts.path || expr;\n this.resultType = opts.resultType || 'value';\n this.flatten = Object.hasOwn(opts, 'flatten') ? opts.flatten : false;\n this.wrap = Object.hasOwn(opts, 'wrap') ? opts.wrap : true;\n this.sandbox = opts.sandbox || {};\n this.eval = opts.eval === undefined ? 'safe' : opts.eval;\n this.ignoreEvalErrors = (typeof opts.ignoreEvalErrors === 'undefined')\n ? false\n : opts.ignoreEvalErrors;\n this.parent = Object.hasOwn(opts, 'parent') ? opts.parent : null;\n this.parentProperty = Object.hasOwn(opts, 'parentProperty')\n ? opts.parentProperty\n : null;\n this.callback = opts.callback ||\n /** @type {JSONPathCallback} */\n (callback) ||\n null;\n this.otherTypeCallback = opts.otherTypeCallback ||\n otherTypeCallback ||\n function () {\n throw new TypeError(\n 'You must supply an otherTypeCallback callback option ' +\n 'with the @other() operator.'\n );\n };\n\n if (opts.autostart !== false) {\n const args = /** @type {JSONPathOptions} */ ({\n path: (optObj ? opts.path : expr)\n });\n if (!optObj && obj !== undefined) {\n args.json = obj;\n } else if ('json' in opts) {\n args.json = opts.json;\n }\n const ret = this.evaluate(args);\n if (!ret || typeof ret !== 'object') {\n const err = /** @type {Error & {value: UnknownResult}} */ (\n new Error(\n 'JSONPath should not be called with \"new\" (it ' +\n 'prevents return of (unwrapped) scalar values)'\n )\n );\n err.value = ret;\n throw err;\n }\n\n // eslint-disable-next-line @stylistic/max-len -- Long\n // @ts-expect-error - Constructor returns evaluate result for legacy API\n // eslint-disable-next-line no-constructor-return -- Legacy API\n return ret;\n }\n }\n\n // PUBLIC METHODS\n\n /**\n * @overload\n * @param {JSONPathOptions} [expr]\n * @returns {ReturnObject|ReturnObject[]|undefined|unknown}\n */\n\n /**\n * @overload\n * @param {PathType|undefined} [expr]\n * @param {AnyInput} [json]\n * @param {JSONPathCallback|null} [callback]\n * @param {OtherTypeCallback} [otherTypeCallback]\n * @returns {ReturnObject|ReturnObject[]|undefined|unknown}\n */\n\n /**\n * @param {PathType|JSONPathOptions|undefined} [expr]\n * @param {AnyInput} [json]\n * @param {JSONPathCallback|null} [callback]\n * @param {OtherTypeCallback} [otherTypeCallback]\n * @returns {ReturnObject|ReturnObject[]|undefined|unknown}\n */\n evaluate (\n expr, json, callback, otherTypeCallback\n ) {\n let currParent = this.parent,\n currParentProperty = this.parentProperty;\n let {flatten, wrap} = this;\n\n this.currResultType = this.resultType;\n this.currEval = this.eval;\n this.currSandbox = this.sandbox;\n callback ||= this.callback;\n this.currOtherTypeCallback = otherTypeCallback ||\n this.otherTypeCallback;\n\n if (expr && typeof expr === 'object' && !Array.isArray(expr)) {\n const exprObj = expr;\n if (!exprObj.path && exprObj.path !== '') {\n throw new TypeError(\n 'You must supply a \"path\" property when providing an ' +\n 'object argument to JSONPath.evaluate().'\n );\n }\n if (!(Object.hasOwn(exprObj, 'json'))) {\n throw new TypeError(\n 'You must supply a \"json\" property when providing an ' +\n 'object argument to JSONPath.evaluate().'\n );\n }\n ({json} = exprObj);\n flatten = Object.hasOwn(exprObj, 'flatten')\n ? exprObj.flatten\n : flatten;\n this.currResultType = Object.hasOwn(exprObj, 'resultType')\n ? exprObj.resultType\n : this.currResultType;\n this.currSandbox = Object.hasOwn(exprObj, 'sandbox')\n ? exprObj.sandbox\n : this.currSandbox;\n wrap = Object.hasOwn(exprObj, 'wrap') ? exprObj.wrap : wrap;\n this.currEval = Object.hasOwn(exprObj, 'eval')\n ? exprObj.eval\n : this.currEval;\n callback = Object.hasOwn(exprObj, 'callback')\n ? exprObj.callback\n : callback;\n this.currOtherTypeCallback = Object.hasOwn(\n exprObj, 'otherTypeCallback'\n )\n ? exprObj.otherTypeCallback\n : this.currOtherTypeCallback;\n currParent = Object.hasOwn(exprObj, 'parent')\n ? exprObj.parent\n : currParent;\n currParentProperty = Object.hasOwn(exprObj, 'parentProperty')\n ? exprObj.parentProperty\n : currParentProperty;\n expr = exprObj.path;\n } else {\n json ||= this.json;\n expr ||= this.path;\n }\n currParent ||= null;\n currParentProperty ||= null;\n\n if (Array.isArray(expr)) {\n expr = JSONPath.toPathString(expr);\n }\n if (!json || (!expr && expr !== '')) {\n return undefined;\n }\n\n const exprList = JSONPath.toPathArray(\n /** @type {string} */\n (expr)\n );\n if (exprList[0] === '$' && exprList.length > 1) {\n exprList.shift();\n }\n this._hasParentSelector = false;\n const traceResult = this._trace(\n exprList, json, ['$'], currParent,\n currParentProperty,\n callback ?? undefined,\n undefined\n );\n\n // eslint-disable-next-line @stylistic/max-len -- Long\n /* c8 ignore next 2 -- Unreachable: _trace returns array when hasArrExpr set */\n const result = (\n Array.isArray(traceResult) ? traceResult : [traceResult]\n ).filter((ea) => {\n return ea && !ea.isParentSelector;\n });\n\n if (!result.length) {\n // eslint-disable-next-line @stylistic/max-len -- Long\n /* c8 ignore next -- Unreachable: valid queries always produce results */\n return wrap ? [] : undefined;\n }\n if (!wrap && result.length === 1 && !result[0].hasArrExpr) {\n const preferredOutput = this._getPreferredOutput(result[0]);\n return preferredOutput;\n }\n const reduced = result.reduce(\n (rslt, ea) => {\n const valOrPath = this._getPreferredOutput(ea);\n if (flatten && Array.isArray(valOrPath)) {\n rslt = rslt.concat(valOrPath);\n } else {\n rslt.push(valOrPath);\n }\n return rslt;\n },\n /** @type {UnknownResult[]} */\n ([])\n );\n\n return reduced;\n }\n\n // PRIVATE METHODS\n\n /**\n * @param {ReturnObject} ea\n * @returns {PreferredOutput}\n */\n _getPreferredOutput (ea) {\n const resultType = this.currResultType;\n switch (resultType) {\n case 'all': {\n const path = Array.isArray(ea.path)\n ? ea.path\n : JSONPath.toPathArray(ea.path);\n ea.pointer = JSONPath.toPointer(/** @type {string[]} */ (path));\n ea.path = typeof ea.path === 'string'\n ? ea.path\n : JSONPath.toPathString(/** @type {string[]} */ (ea.path));\n return ea;\n } case 'value': case 'parent': case 'parentProperty':\n return /** @type {PreferredOutput} */ (ea[resultType]);\n case 'path':\n if (typeof ea.path === 'string') {\n return ea.path;\n }\n return JSONPath.toPathString(/** @type {string[]} */ (ea.path));\n case 'pointer': {\n const pathArray = Array.isArray(ea.path)\n ? ea.path\n : JSONPath.toPathArray(ea.path);\n return JSONPath.toPointer(/** @type {string[]} */ (pathArray));\n }\n default:\n throw new TypeError('Unknown result type');\n }\n }\n\n /**\n * @param {ReturnObject} fullRetObj\n * @param {JSONPathCallback|undefined} callback\n * @param {\"value\"|\"property\"} type\n * @returns {void}\n */\n _handleCallback (fullRetObj, callback, type) {\n // Early return if no callback provided (defensive\n // check for internal calls)\n if (!callback) {\n return;\n }\n const preferredOutput = this._getPreferredOutput(fullRetObj);\n if (Array.isArray(fullRetObj.path)) {\n fullRetObj.path = JSONPath.toPathString(\n /** @type {string[]} */ (fullRetObj.path)\n );\n }\n callback(preferredOutput, type, fullRetObj);\n }\n\n /**\n *\n * @param {ExpressionArray} expr\n * @param {unknown} val\n * @param {ExpressionArray} path\n * @param {ParentValue} parent\n * @param {ParentProperty} parentPropName\n * @param {JSONPathCallback|undefined} callback\n * @param {boolean|undefined} hasArrExpr\n * @param {boolean} [literalPriority]\n * @returns {ReturnObject|ReturnObject[]}\n */\n _trace (\n expr, val, path, parent, parentPropName, callback, hasArrExpr,\n literalPriority\n ) {\n // No expr to follow? return path and value as the result of\n // this trace branch\n let retObj;\n if (!expr.length) {\n retObj = {\n path,\n value: val,\n parent,\n parentProperty: parentPropName,\n hasArrExpr\n };\n this._handleCallback(retObj, callback, 'value');\n return retObj;\n }\n\n const loc = /** @type {string} */ (expr[0]), x = expr.slice(1);\n\n // We need to gather the return value of recursive trace calls in order\n // to do the parent sel computation.\n /** @type {ReturnObject[]} */\n const ret = [];\n /**\n *\n * @param {ReturnObject|ReturnObject[]} elems\n * @returns {void}\n */\n function addRet (elems) {\n if (Array.isArray(elems)) {\n // This was causing excessive stack size in Node (with or\n // without Babel) against our performance test:\n // `ret.push(...elems);`\n elems.forEach((t) => {\n ret.push(t);\n });\n } else {\n ret.push(elems);\n }\n }\n if (val && (typeof loc !== 'string' || literalPriority) &&\n Object.hasOwn(val, /** @type {PropertyKey} */ (loc))\n ) { // simple case--directly follow property\n const valObj = /** @type {Record} */ (val);\n addRet(this._trace(\n x, valObj[/** @type {string} */ (loc)],\n push(path, loc),\n val, /** @type {string|number} */ (loc), callback,\n hasArrExpr\n ));\n // eslint-disable-next-line unicorn/prefer-switch -- Part of larger `if`\n } else if (loc === '*') { // all child properties\n this._walk(val, (m) => {\n const valObj = /** @type {Record} */ (val);\n addRet(this._trace(\n x, valObj[m], push(path, m), val, m, callback, true, true\n ));\n });\n } else if (loc === '..') { // all descendent parent properties\n // Check remaining expression with val's immediate children\n addRet(\n this._trace(x, val, path, parent, parentPropName, callback,\n hasArrExpr)\n );\n this._walk(val, (m) => {\n // We don't join m and x here because we only want parents,\n // not scalar values\n const valObj = /** @type {Record} */ (val);\n if (typeof valObj[m] === 'object') {\n // Keep going with recursive descent on val's\n // object children\n addRet(this._trace(\n expr.slice(),\n valObj[m],\n push(path, m),\n val,\n m,\n callback,\n true\n ));\n }\n });\n // The parent sel computation is handled in the frame above using the\n // ancestor object of val\n } else if (loc === '^') {\n // This is not a final endpoint, so we do not invoke the\n // callback here\n this._hasParentSelector = true;\n return /** @type {ReturnObject} */ ({\n path: path.slice(0, -1),\n expr: x,\n isParentSelector: true,\n value: undefined,\n parent: undefined,\n parentProperty: null\n });\n } else if (loc === '~') { // property name\n retObj = {\n path: push(path, loc),\n value: parentPropName,\n parent,\n parentProperty: null\n };\n this._handleCallback(retObj, callback, 'property');\n return retObj;\n } else if (loc === '$') { // root only\n addRet(this._trace(x, val, path, null, null, callback, hasArrExpr));\n } else if ((/^(-?\\d*):(-?\\d*):?(\\d*)$/u).test(loc)) { // [start:end:step] Python slice syntax\n const sliceResult = this._slice(\n loc, x, val, path, parent, parentPropName, callback\n );\n if (sliceResult) {\n addRet(sliceResult);\n }\n } else if (loc.indexOf('?(') === 0) { // [?(expr)] (filtering)\n if (this.currEval === false) {\n throw new Error(\n 'Eval [?(expr)] prevented in JSONPath expression.'\n );\n }\n const safeLoc = loc.replace(/^\\?\\((.*?)\\)$/u, '$1');\n // check for a nested filter expression\n\n const nested = (/@.?([^?]*)[['](\\??\\(.*?\\))(?!.\\)\\])[\\]']/gu).exec(safeLoc);\n if (nested) {\n // find if there are matches in the nested expression\n // add them to the result set if there is at least one match\n this._walk(val, (m) => {\n const npath = [nested[2]];\n const valObj2 = /** @type {Record} */ (\n val\n );\n const nvalue = /** @type {ValueType} */ (nested[1]\n ? /** @type {Record} */ (\n valObj2[m]\n )[nested[1]]\n : valObj2[m]);\n const filterResults = this._trace(npath, nvalue, path,\n parent, parentPropName, callback, true);\n // eslint-disable-next-line @stylistic/max-len -- Long\n /* c8 ignore next 3 -- Unreachable: _trace always returns array for nested filters */\n const filterArray = Array.isArray(filterResults)\n ? filterResults\n : [filterResults];\n if (filterArray.length > 0) {\n addRet(this._trace(x, valObj2[m], push(path, m), val,\n m, callback, true));\n }\n });\n } else {\n const valObj3 = /** @type {Record} */ (val);\n this._walk(val, (m) => {\n if (this._eval(safeLoc, valObj3[m], m, path, parent,\n parentPropName)) {\n addRet(this._trace(x, valObj3[m], push(path, m), val, m,\n callback, true));\n }\n });\n }\n } else if (loc[0] === '(') { // [(expr)] (dynamic property/index)\n if (this.currEval === false) {\n throw new Error(\n 'Eval [(expr)] prevented in JSONPath expression.'\n );\n }\n // As this will resolve to a property name (but we don't know it\n // yet), property and parent information is relative to the\n const evalResult = this._eval(\n /** @type {string} */ (loc),\n val, /** @type {string|number} */ (path.at(-1)),\n path.slice(0, -1), parent, parentPropName\n );\n const exprToUse = /** @type {string|number} */ (\n evalResult !== undefined ? evalResult : ''\n );\n addRet(this._trace(unshift(\n exprToUse,\n x\n ), val, path, parent, parentPropName, callback, hasArrExpr));\n } else if (loc[0] === '@') { // value type: @boolean(), etc.\n let addType = false;\n const valueType = /** @type {ValueType} */ (loc).slice(1, -2);\n switch (valueType) {\n case 'scalar':\n if (!val || !(['object', 'function'].includes(typeof val))) {\n addType = true;\n }\n break;\n case 'boolean': case 'string': case 'undefined': case 'function':\n if (typeof val === valueType) {\n addType = true;\n }\n break;\n case 'integer':\n if (Number.isFinite(val) &&\n !(/** @type {number} */ (val) % 1)) {\n addType = true;\n }\n break;\n case 'number':\n if (Number.isFinite(val)) {\n addType = true;\n }\n break;\n case 'nonFinite':\n if (typeof val === 'number' && !Number.isFinite(val)) {\n addType = true;\n }\n break;\n case 'object':\n if (val && typeof val === valueType) {\n addType = true;\n }\n break;\n case 'array':\n if (Array.isArray(val)) {\n addType = true;\n }\n break;\n case 'other':\n addType = this.currOtherTypeCallback?.(\n val, path, parent,\n /** @type {string|null} */ (parentPropName)\n ) ?? false;\n break;\n case 'null':\n if (val === null) {\n addType = true;\n }\n break;\n /* c8 ignore next 2 */\n default:\n throw new TypeError('Unknown value type ' + valueType);\n }\n if (addType) {\n retObj = {\n path, value: val, parent, parentProperty: parentPropName\n };\n this._handleCallback(retObj, callback, 'value');\n return retObj;\n }\n // `-escaped property\n } else if (val && loc[0] === '`' &&\n Object.hasOwn(val, loc.slice(1))\n ) {\n const locProp = loc.slice(1);\n const valObj = /** @type {Record} */ (val);\n addRet(this._trace(\n x, valObj[locProp], push(path, locProp), val, locProp, callback,\n hasArrExpr, true\n ));\n } else if (loc.includes(',')) { // [name1,name2,...]\n const parts = loc.split(',');\n for (const part of parts) {\n addRet(this._trace(\n unshift(part, x),\n val,\n path,\n parent,\n parentPropName,\n callback,\n true\n ));\n }\n // simple case--directly follow property\n } else if (\n !literalPriority && val && Object.hasOwn(val, loc)\n ) {\n const valObj = /** @type {Record} */ (val);\n addRet(\n this._trace(x, valObj[loc], push(path, loc), val, loc, callback,\n hasArrExpr, true)\n );\n }\n\n // We check the resulting values for parent selections. For parent\n // selections we discard the value object and continue the trace with\n // the current val object\n if (this._hasParentSelector) {\n for (let t = 0; t < ret.length; t++) {\n const rett = ret[t];\n if (rett && rett.isParentSelector) {\n const exprToUse = /** @type {ExpressionArray} */ (\n rett.expr\n );\n const pathToUse = /** @type {ExpressionArray} */ (\n rett.path\n );\n const tmp = this._trace(\n exprToUse,\n val,\n pathToUse,\n parent,\n parentPropName,\n callback,\n hasArrExpr\n );\n if (Array.isArray(tmp)) {\n ret[t] = tmp[0];\n const tl = tmp.length;\n for (let tt = 1; tt < tl; tt++) {\n t++;\n ret.splice(t, 0, tmp[tt]);\n }\n } else {\n ret[t] = tmp;\n }\n }\n }\n }\n return ret;\n }\n\n /**\n * @param {unknown} val\n * @param {(prop: string|number) => void} f\n * @returns {void}\n */\n _walk (val, f) {\n if (Array.isArray(val)) {\n const n = val.length;\n for (let i = 0; i < n; i++) {\n f(i);\n }\n } else if (val && typeof val === 'object') {\n Object.keys(val).forEach((m) => {\n f(m);\n });\n }\n }\n\n /**\n * @param {string} loc\n * @param {ExpressionArray} expr\n * @param {unknown} val\n * @param {ExpressionArray} path\n * @param {ParentValue} parent\n * @param {ParentProperty} parentPropName\n * @param {JSONPathCallback|undefined} callback\n * @returns {ReturnObject[]|undefined}\n */\n _slice (\n loc, expr, val, path, parent, parentPropName, callback\n ) {\n if (!Array.isArray(val)) {\n return undefined;\n }\n const len = val.length, parts = loc.split(':'),\n step = (parts[2] && Number(parts[2])) || 1;\n let start = (parts[0] && Number(parts[0])) || 0,\n end = parts[1] ? Number(parts[1]) : len;\n start = (start < 0) ? Math.max(0, start + len) : Math.min(len, start);\n end = (end < 0) ? Math.max(0, end + len) : Math.min(len, end);\n /** @type {ReturnObject[]} */\n const ret = [];\n for (let i = start; i < end; i += step) {\n const tmp = this._trace(\n unshift(i, expr),\n val,\n path,\n parent,\n parentPropName,\n callback,\n true\n );\n // Should only be possible to be an array here since first part of\n // ``unshift(i, expr)` passed in above would not be empty,\n // nor `~`, nor begin with `@` (as could return objects)\n // This was causing excessive stack size in Node (with or\n // without Babel) against our performance test: `ret.push(...tmp);`\n // eslint-disable-next-line @stylistic/max-len -- Long\n /* c8 ignore next -- Unreachable: _trace returns array when expr non-empty */\n const tmpArray = Array.isArray(tmp) ? tmp : [tmp];\n tmpArray.forEach((t) => {\n ret.push(t);\n });\n }\n return ret;\n }\n\n /**\n * @param {string} code\n * @param {unknown} _v\n * @param {string|number} _vname\n * @param {ExpressionArray} path\n * @param {ParentValue} parent\n * @param {ParentProperty} parentPropName\n * @returns {UnknownResult}\n */\n _eval (\n code, _v, _vname, path, parent, parentPropName\n ) {\n if (this.currSandbox) {\n this.currSandbox._$_parentProperty = parentPropName;\n this.currSandbox._$_parent = parent;\n this.currSandbox._$_property = _vname;\n this.currSandbox._$_root = this.json;\n this.currSandbox._$_v = _v;\n }\n\n const containsPath = code.includes('@path');\n if (containsPath) {\n // eslint-disable-next-line @stylistic/max-len -- Long\n /* c8 ignore next -- Unreachable: currSandbox set in evaluate() before _eval */\n const currSandbox = this.currSandbox ?? {};\n currSandbox._$_path = JSONPath.toPathString(\n /** @type {string[]} */ (path.concat([_vname]))\n );\n }\n\n const scriptCacheKey = this.currEval + 'Script:' + code;\n if (!Object.hasOwn(JSONPath.cache, scriptCacheKey)) {\n let script = code\n .replaceAll('@parentProperty', '_$_parentProperty')\n .replaceAll('@parent', '_$_parent')\n .replaceAll('@property', '_$_property')\n .replaceAll('@root', '_$_root')\n .replaceAll(/@([.\\s)[])/gu, '_$_v$1');\n if (containsPath) {\n script = script.replaceAll('@path', '_$_path');\n }\n const evalType = /** @type {string|boolean|undefined} */ (\n this.currEval\n );\n if (['safe', true, undefined].includes(evalType)) {\n const {cache} = JSONPath;\n // eslint-disable-next-line @stylistic/max-len -- Long\n /* eslint-disable unicorn/no-undeclared-class-members -- Prototype members */\n cache[scriptCacheKey] = new (\n /**\n * @type {JSONPathClass & {\n * safeVm: SafeScriptType,\n * vm: ScriptType\n * }}\n */ (/** @type {unknown} */ (this))\n ).safeVm.Script(script);\n // eslint-disable-next-line @stylistic/max-len -- Long\n /* eslint-enable unicorn/no-undeclared-class-members -- End prototype member scope */\n } else if (this.currEval === 'native') {\n const {cache} = JSONPath;\n // eslint-disable-next-line @stylistic/max-len -- Long\n /* eslint-disable unicorn/no-undeclared-class-members -- Prototype members */\n cache[scriptCacheKey] = new (\n /**\n * @type {JSONPathClass & {\n * safeVm: SafeScriptType,\n * vm: ScriptType\n * }}\n */ (/** @type {unknown} */ (this))\n ).vm.Script(script);\n // eslint-disable-next-line @stylistic/max-len -- Long\n /* eslint-enable unicorn/no-undeclared-class-members -- End prototype member scope */\n } else if (\n typeof this.currEval === 'function' &&\n this.currEval.prototype &&\n Object.hasOwn(this.currEval.prototype, 'runInNewContext')\n ) {\n const CurrEval = this.currEval;\n const {cache} = JSONPath;\n // eslint-disable-next-line @stylistic/max-len -- Long\n // @ts-expect-error - Type checked above to have proper constructor\n cache[scriptCacheKey] = new CurrEval(script);\n } else if (typeof this.currEval === 'function') {\n const {cache} = JSONPath;\n // Type narrowing: at this point currEval is a function\n // but not a constructor\n const evalFunc = /** @type {EvalCallback} */ (this.currEval);\n cache[scriptCacheKey] = {\n runInNewContext: (\n /** @type {ContextItem} */ context\n ) => evalFunc(script, context)\n };\n } else {\n throw new TypeError(\n `Unknown \"eval\" property \"${this.currEval}\"`\n );\n }\n }\n\n try {\n const {cache} = JSONPath;\n\n /**\n * @typedef {{\n * runInNewContext: (\n * ctx: SandboxType|undefined\n * ) => EvaluatedResult\n * }} RunInNewContext\n */\n\n return /** @type {RunInNewContext} */ (\n cache[scriptCacheKey]\n ).runInNewContext(\n this.currSandbox\n );\n } catch (e) {\n if (this.ignoreEvalErrors) {\n return false;\n }\n const error = /** @type {Error} */ (e);\n throw new Error('jsonPath: ' + error.message + ': ' + code, {\n cause: e\n });\n }\n }\n}\n\n/** @type {{safeVm: SafeScriptType}} */\n(/** @type {unknown} */ (JSONPathClass.prototype)).safeVm = {\n Script: SafeScript\n};\n\nJSONPath.prototype = JSONPathClass.prototype;\n\n// PUBLIC CLASS PROPERTIES AND METHODS\n\n// Could store the cache object itself\n\n/** @type {Record} */\nJSONPath.cache = {};\n\n/**\n * @param {string[]} pathArr Array to convert\n * @returns {string} The path string\n */\nJSONPath.toPathString = function (pathArr) {\n const x = pathArr, n = x.length;\n let p = '$';\n for (let i = 1; i < n; i++) {\n if (!(/^(~|\\^|@.*?\\(\\))$/u).test(x[i])) {\n p += (/^[0-9*]+$/u).test(x[i]) ? ('[' + x[i] + ']') : (\"['\" + x[i] + \"']\");\n }\n }\n return p;\n};\n\n/**\n * @param {string[]} pointer JSON Path array\n * @returns {string} JSON Pointer\n */\nJSONPath.toPointer = function (pointer) {\n const x = pointer, n = x.length;\n let p = '';\n for (let i = 1; i < n; i++) {\n if (!(/^(~|\\^|@.*?\\(\\))$/u).test(x[i])) {\n p += '/' + x[i].toString()\n .replaceAll('~', '~0')\n .replaceAll('/', '~1');\n }\n }\n return p;\n};\n\n/**\n * @param {string} expr Expression to convert\n * @returns {string[]}\n */\nJSONPath.toPathArray = function (expr) {\n const {cache} = JSONPath;\n if (Object.hasOwn(cache, expr)) {\n return /** @type {string[]} */ (cache[expr]).concat();\n }\n /** @type {string[]} */\n const subx = [];\n const normalized = expr\n // Properties\n .replaceAll(\n /@(?:null|boolean|number|string|integer|undefined|nonFinite|scalar|array|object|function|other)\\(\\)/gu,\n ';$&;'\n )\n // Parenthetical evaluations (filtering and otherwise), directly\n // within brackets or single quotes\n .replaceAll(/[['](\\??\\(.*?\\))[\\]'](?!.\\])/gu, function ($0, $1) {\n return '[#' +\n // eslint-disable-next-line @stylistic/max-len -- Long\n // eslint-disable-next-line unicorn/no-return-array-push -- Optimization\n (subx.push($1) - 1) +\n ']';\n })\n // Escape periods and tildes within properties\n .replaceAll(/\\[['\"]([^'\\]]*)['\"]\\]/gu, function ($0, prop) {\n return \"['\" + prop\n .replaceAll('.', '%@%')\n .replaceAll('~', '%%@@%%') +\n \"']\";\n })\n // Properties operator\n .replaceAll('~', ';~;')\n // Split by property boundaries\n\n .replaceAll(/['\"]?\\.['\"]?(?![^[]*\\])|\\[['\"]?/gu, ';')\n // Reinsert periods within properties\n .replaceAll('%@%', '.')\n // Reinsert tildes within properties\n .replaceAll('%%@@%%', '~')\n // Parent\n .replaceAll(/(?:;)?(\\^+)(?:;)?/gu, function ($0, ups) {\n return ';' + ups.split('').join(';') + ';';\n })\n // Descendents\n .replaceAll(/;;;|;;/gu, ';..;')\n // Remove trailing\n .replaceAll(/;$|'?\\]|'$/gu, '');\n\n const exprList = normalized.split(';').map(function (exp) {\n const match = exp.match(/#(\\d+)/u);\n return !match || !match[1] ? exp : subx[Number(match[1])];\n });\n cache[expr] = exprList;\n return /** @type {string[]} */ (cache[expr]).concat();\n};\n\nexport {JSONPath, JSONPathClass};\n","import {JSONPath, JSONPathClass} from './jsonpath.js';\n\n/**\n * @typedef {import('./jsonpath.js').AnyInput} AnyInput\n */\n/**\n * @typedef {import('./jsonpath.js').SandboxCallback} SandboxCallback\n */\n/**\n * @typedef {import('./jsonpath.js').SandboxPropertyValue} SandboxPropertyValue\n */\n/**\n * @typedef {import('./jsonpath.js').ExpressionArray} ExpressionArray\n */\n/**\n * @typedef {import('./jsonpath.js').ValueType} ValueType\n */\n/**\n * @typedef {import('./jsonpath.js').ParentValue} ParentValue\n */\n/**\n * @typedef {import('./jsonpath.js').UnknownResult} UnknownResult\n */\n/**\n * @typedef {import('./jsonpath.js').ParentProperty} ParentProperty\n */\n/**\n * @typedef {import('./jsonpath.js').PreferredOutput} PreferredOutput\n */\n/**\n * @typedef {import('./jsonpath.js').ReturnObject} ReturnObject\n */\n/**\n * @typedef {import('./jsonpath.js').JSONPathCallback} JSONPathCallback\n */\n/**\n * @typedef {import('./jsonpath.js').OtherTypeCallback} OtherTypeCallback\n */\n/**\n * @typedef {import('./jsonpath.js').ContextItem} ContextItem\n */\n/**\n * @typedef {import('./jsonpath.js').EvaluatedResult} EvaluatedResult\n */\n/**\n * @typedef {import('./jsonpath.js').EvalCallback} EvalCallback\n */\n/**\n * @typedef {import('./jsonpath.js').EvalClass} EvalClass\n */\n/**\n * @typedef {import('./jsonpath.js').ResultType} ResultType\n */\n/**\n * @typedef {import('./jsonpath.js').EvalValue} EvalValue\n */\n/**\n * @typedef {import('./jsonpath.js').PathType} PathType\n */\n/**\n * @typedef {import('./jsonpath.js').SafeScriptType} SafeScriptType\n */\n/**\n * @typedef {import('./jsonpath.js').ScriptType} ScriptType\n */\n/**\n * @typedef {import('./jsonpath.js').SandboxType} SandboxType\n */\n/**\n * @typedef {import('./jsonpath.js').JSONPathOptions} JSONPathOptions\n */\n\n/**\n * @template T\n * @callback ConditionCallback\n * @param {T} item\n * @returns {boolean}\n */\n\n/**\n * Copy items out of one array into another.\n * @template T\n * @param {T[]} source Array with items to copy\n * @param {T[]} target Array to which to copy\n * @param {ConditionCallback} conditionCb Callback passed the current item;\n * will move item if evaluates to `true`\n * @returns {void}\n */\nconst moveToAnotherArray = function (source, target, conditionCb) {\n const il = source.length;\n for (let i = 0; i < il; i++) {\n const item = source[i];\n if (conditionCb(item)) {\n target.push(source.splice(i--, 1)[0]);\n }\n }\n};\n\n/**\n * In-browser replacement for NodeJS' VM.Script.\n */\nclass Script {\n /**\n * @param {string} expr Expression to evaluate\n */\n constructor (expr) {\n this.code = expr;\n }\n\n /**\n * @param {SandboxType} context Object whose items will be added\n * to evaluation\n * @returns {EvaluatedResult} Result of evaluated code\n */\n runInNewContext (context) {\n let expr = this.code;\n const keys = Object.keys(context);\n const funcs = /** @type {string[]} */ ([]);\n moveToAnotherArray(keys, funcs, (key) => {\n return typeof context[key] === 'function';\n });\n const values = keys.map((vr) => {\n return context[vr];\n });\n\n const funcString = funcs.reduce((s, func) => {\n let fString = context[func].toString();\n if (!(/function/u).test(fString)) {\n fString = 'function ' + fString;\n }\n return 'var ' + func + '=' + fString + ';' + s;\n }, '');\n\n expr = funcString + expr;\n\n // Mitigate https://perfectionkills.com/global-eval-what-are-the-options/#new_function\n if (!(/(['\"])use strict\\1/u).test(expr) && !keys.includes('arguments')) {\n expr = 'var arguments = undefined;' + expr;\n }\n\n // Remove last semi so `return` will be inserted before\n // the previous one instead, allowing for the return\n // of a bare ending expression\n expr = expr.replace(/;\\s*$/u, '');\n\n // Insert `return`\n const lastStatementEnd = expr.lastIndexOf(';');\n const code =\n lastStatementEnd !== -1\n ? expr.slice(0, lastStatementEnd + 1) +\n ' return ' +\n expr.slice(lastStatementEnd + 1)\n : ' return ' + expr;\n\n // eslint-disable-next-line no-new-func -- User's choice\n return new Function(...keys, code)(...values);\n }\n}\n\n/** @type {{vm: ScriptType}} */\n(/** @type {unknown} */ (JSONPathClass.prototype)).vm = {\n Script\n};\n\nexport {JSONPath, JSONPathClass, Script};\n"],"names":["Jsep","version","toString","addUnaryOp","op_name","max_unop_len","Math","max","length","unary_ops","addBinaryOp","precedence","isRightAssociative","max_binop_len","binary_ops","right_associative","add","delete","addIdentifierChar","char","additional_identifier_chars","addLiteral","literal_name","literal_value","literals","removeUnaryOp","getMaxKeyLen","removeAllUnaryOps","removeIdentifierChar","removeBinaryOp","removeAllBinaryOps","removeLiteral","removeAllLiterals","this","expr","charAt","index","code","charCodeAt","constructor","parse","obj","Object","keys","map","k","isDecimalDigit","ch","binaryPrecedence","op_val","isIdentifierStart","String","fromCharCode","has","isIdentifierPart","throwError","message","error","Error","description","runHook","name","node","hooks","env","context","run","searchHook","find","callback","call","gobbleSpaces","SPACE_CODE","TAB_CODE","LF_CODE","CR_CODE","nodes","gobbleExpressions","type","COMPOUND","body","untilICode","ch_i","SEMCOL_CODE","COMMA_CODE","gobbleExpression","push","gobbleBinaryExpression","gobbleBinaryOp","to_check","substr","tc_len","hasOwnProperty","biop","prec","stack","biop_info","left","right","i","cur_biop","gobbleToken","value","right_a","comparePrev","prev","pop","BINARY_EXP","operator","PERIOD_CODE","gobbleNumericLiteral","SQUOTE_CODE","DQUOTE_CODE","gobbleStringLiteral","OBRACK_CODE","gobbleArray","argument","UNARY_EXP","prefix","gobbleIdentifier","LITERAL","raw","this_str","THIS_EXP","OPAREN_CODE","gobbleGroup","gobbleTokenProperty","QUMARK_CODE","optional","MEMBER_EXP","computed","object","property","CBRACK_CODE","CALL_EXP","arguments","gobbleArguments","CPAREN_CODE","callee","chCode","number","parseFloat","str","startIndex","quote","closed","substring","start","IDENTIFIER","slice","termination","args","separator_count","arg","SEQUENCE_EXP","expressions","ARRAY_EXP","elements","first","Array","isArray","forEach","assign","plugins","jsep","registered","register","plugin","init","COLON_CODE","Set","true","false","null","stdClassProps","getOwnPropertyNames","filter","prop","includes","undefined","m","ternary","test","consequent","alternate","newTest","patternIndex","inCharSet","pattern","flags","RegExp","e","assignmentOperators","updateOperators","assignmentPrecedence","updateNodeTypes","updateBinariesToAssignments","values","val","op","some","c","jsepRegex","jsepAssignment","BLOCKED_PROTO_PROPERTIES","SafeEval","evalAst","ast","subs","evalBinaryExpression","evalCompound","evalConditionalExpression","evalIdentifier","evalLiteral","evalMemberExpression","evalUnaryExpression","evalArrayExpression","evalCallExpression","evalAssignmentExpression","SyntaxError","cause","||","a","b","&&","|","^","&","==","!=","===","!==","<",">","<=",">=","<<",">>",">>>","+","-","*","/","%","last","hasOwn","ReferenceError","TypeError","result","Function","bind","typeof","void","el","func","id","arr","item","unshift","JSONPath","opts","otherTypeCallback","JSONPathClass","optObj","currResultType","currEval","currOtherTypeCallback","currSandbox","_hasParentSelector","json","path","resultType","flatten","wrap","sandbox","eval","ignoreEvalErrors","parent","parentProperty","autostart","ret","evaluate","err","currParent","currParentProperty","exprObj","toPathString","exprList","toPathArray","shift","traceResult","_trace","ea","isParentSelector","hasArrExpr","_getPreferredOutput","reduce","rslt","valOrPath","concat","pointer","toPointer","pathArray","_handleCallback","fullRetObj","preferredOutput","parentPropName","literalPriority","retObj","loc","x","addRet","elems","t","valObj","_walk","sliceResult","_slice","indexOf","safeLoc","replace","nested","exec","npath","valObj2","nvalue","filterResults","valObj3","_eval","evalResult","at","exprToUse","addType","valueType","Number","isFinite","locProp","parts","split","part","rett","pathToUse","tmp","tl","tt","splice","f","n","len","step","end","min","_v","_vname","_$_parentProperty","_$_parent","_$_property","_$_root","_$_v","containsPath","_$_path","scriptCacheKey","cache","script","replaceAll","evalType","safeVm","Script","vm","prototype","CurrEval","evalFunc","runInNewContext","keyMap","create","pathArr","p","subx","$0","$1","ups","join","exp","match","funcs","source","target","conditionCb","il","moveToAnotherArray","key","vr","s","fString","lastStatementEnd","lastIndexOf"],"mappings":"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","x_google_ignoreList":[0,1,2]} \ No newline at end of file diff --git a/dist/index-node-cjs.cjs b/dist/index-node-cjs.cjs index 99e86669..54864ad6 100644 --- a/dist/index-node-cjs.cjs +++ b/dist/index-node-cjs.cjs @@ -1199,8 +1199,29 @@ const plugin = { } }; +/* eslint-disable unicorn/no-top-level-side-effects -- Temporary? */ /* eslint-disable no-bitwise -- Convenient */ +/** + * @import {EvaluatedResult, UnknownResult} from './jsonpath.js'; + */ + +/** + * @typedef {any} AssignmentExpression + */ + +/** + * @typedef {any} Substitution + */ + +/** + * @typedef {any} AnyParameter + */ + +/** + * @typedef {Record} Substitutions + */ + // register plugins jsep.plugins.register(index, plugin); jsep.addUnaryOp('typeof'); @@ -1211,37 +1232,50 @@ const BLOCKED_PROTO_PROPERTIES = new Set(['constructor', '__proto__', '__defineG const SafeEval = { /** * @param {jsep.Expression} ast - * @param {Record} subs + * @param {Substitutions} subs + * @returns {UnknownResult} */ evalAst(ast, subs) { switch (ast.type) { case 'BinaryExpression': case 'LogicalExpression': - return SafeEval.evalBinaryExpression(ast, subs); + return SafeEval.evalBinaryExpression(/** @type {jsep.BinaryExpression} */ast, subs); case 'Compound': - return SafeEval.evalCompound(ast, subs); + return SafeEval.evalCompound(/** @type {jsep.Compound} */ast, subs); case 'ConditionalExpression': - return SafeEval.evalConditionalExpression(ast, subs); + return SafeEval.evalConditionalExpression(/** @type {jsep.ConditionalExpression} */ast, subs); case 'Identifier': - return SafeEval.evalIdentifier(ast, subs); + return SafeEval.evalIdentifier(/** @type {jsep.Identifier} */ast, subs); case 'Literal': - return SafeEval.evalLiteral(ast, subs); + return SafeEval.evalLiteral(/** @type {jsep.Literal} */ast); case 'MemberExpression': - return SafeEval.evalMemberExpression(ast, subs); + return SafeEval.evalMemberExpression(/** @type {jsep.MemberExpression} */ast, subs); case 'UnaryExpression': - return SafeEval.evalUnaryExpression(ast, subs); + return SafeEval.evalUnaryExpression(/** @type {jsep.UnaryExpression} */ast, subs); case 'ArrayExpression': - return SafeEval.evalArrayExpression(ast, subs); + return SafeEval.evalArrayExpression(/** @type {jsep.ArrayExpression} */ast, subs); case 'CallExpression': - return SafeEval.evalCallExpression(ast, subs); + return SafeEval.evalCallExpression(/** @type {jsep.CallExpression} */ast, subs); case 'AssignmentExpression': - return SafeEval.evalAssignmentExpression(ast, subs); + return SafeEval.evalAssignmentExpression(/** @type {AssignmentExpression} */ast, subs); default: - throw SyntaxError('Unexpected expression', ast); + throw new SyntaxError('Unexpected expression', { + cause: ast + }); } }, + /** + * @param {jsep.BinaryExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalBinaryExpression(ast, subs) { - const result = { + /** + * @typedef {{ + * [key: string]: (a: AnyParameter, b: AnyParameter) => UnknownResult + * }} OperatorTable + */ + const result = /** @type {OperatorTable} */{ '||': (a, b) => a || b(), '&&': (a, b) => a && b(), '|': (a, b) => a | b(), @@ -1268,14 +1302,18 @@ const SafeEval = { }[ast.operator](SafeEval.evalAst(ast.left, subs), () => SafeEval.evalAst(ast.right, subs)); return result; }, + /** + * @param {jsep.Compound} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalCompound(ast, subs) { let last; for (let i = 0; i < ast.body.length; i++) { - if (ast.body[i].type === 'Identifier' && ['var', 'let', 'const'].includes(ast.body[i].name) && ast.body[i + 1] && ast.body[i + 1].type === 'AssignmentExpression') { + if (ast.body[i].type === 'Identifier' && ['var', 'let', 'const'].includes(/** @type {jsep.Identifier} */ + ast.body[i].name) && Object.hasOwn(ast.body, i + 1) && ast.body[i + 1].type === 'AssignmentExpression') { // var x=2; is detected as // [{Identifier var}, {AssignmentExpression x=2}] - // eslint-disable-next-line @stylistic/max-len -- Long - // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient i += 1; } const expr = ast.body[i]; @@ -1283,71 +1321,120 @@ const SafeEval = { } return last; }, + /** + * @param {jsep.ConditionalExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalConditionalExpression(ast, subs) { if (SafeEval.evalAst(ast.test, subs)) { return SafeEval.evalAst(ast.consequent, subs); } return SafeEval.evalAst(ast.alternate, subs); }, + /** + * @param {jsep.Identifier} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalIdentifier(ast, subs) { if (Object.hasOwn(subs, ast.name)) { return subs[ast.name]; } - throw ReferenceError(`${ast.name} is not defined`); + throw new ReferenceError(`${ast.name} is not defined`); }, + /** + * @param {jsep.Literal} ast + * @returns {UnknownResult} + */ evalLiteral(ast) { return ast.value; }, + /** + * @param {jsep.MemberExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalMemberExpression(ast, subs) { const prop = String( // NOTE: `String(value)` throws error when // value has overwritten the toString method to return non-string // i.e. `value = {toString: () => []}` - ast.computed ? SafeEval.evalAst(ast.property) // `object[property]` + ast.computed ? SafeEval.evalAst(ast.property, subs) // `object[property]` : ast.property.name // `object.property` property is Identifier ); const obj = SafeEval.evalAst(ast.object, subs); if (obj === undefined || obj === null) { - throw TypeError(`Cannot read properties of ${obj} (reading '${prop}')`); + throw new TypeError(`Cannot read properties of ${obj} (reading '${prop}')`); } if (!Object.hasOwn(obj, prop) && BLOCKED_PROTO_PROPERTIES.has(prop)) { - throw TypeError(`Cannot read properties of ${obj} (reading '${prop}')`); + throw new TypeError(`Cannot read properties of ${obj} (reading '${prop}')`); } - const result = obj[prop]; + const result = /** @type {Record} */obj[prop]; if (typeof result === 'function' && result !== Function) { return result.bind(obj); // arrow functions aren't affected by bind. } return result; }, + /** + * @param {jsep.UnaryExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalUnaryExpression(ast, subs) { - const result = { - '-': a => -SafeEval.evalAst(a, subs), + /** + * @typedef {{ + * [key: string]: (a: AnyParameter) => UnknownResult + * }} UnaryOperatorTable + */ + const result = /** @type {UnaryOperatorTable} */{ + '-': a => -(/** @type {EvaluatedResult} */ + SafeEval.evalAst(a, subs)), '!': a => !SafeEval.evalAst(a, subs), - '~': a => ~SafeEval.evalAst(a, subs), + '~': a => ~(/** @type {EvaluatedResult} */ + SafeEval.evalAst(a, subs)), // eslint-disable-next-line no-implicit-coercion -- API - '+': a => +SafeEval.evalAst(a, subs), + '+': a => +(/** @type {EvaluatedResult} */ + SafeEval.evalAst(a, subs)), typeof: a => typeof SafeEval.evalAst(a, subs), - // eslint-disable-next-line no-void, sonarjs/void-use -- feature + // eslint-disable-next-line no-void -- Ok void: a => void SafeEval.evalAst(a, subs) }[ast.operator](ast.argument); return result; }, + /** + * @param {jsep.ArrayExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalArrayExpression(ast, subs) { - return ast.elements.map(el => SafeEval.evalAst(el, subs)); + return ast.elements.map(el => SafeEval.evalAst(/** @type {jsep.Expression} */ + el, subs)); }, + /** + * @param {jsep.CallExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalCallExpression(ast, subs) { const args = ast.arguments.map(arg => SafeEval.evalAst(arg, subs)); const func = SafeEval.evalAst(ast.callee, subs); if (func === Function) { throw new Error('Function constructor is disabled'); } - return func(...args); + return (/** @type {(...args: AnyParameter[]) => UnknownResult} */ + func)(...args); }, + /** + * @param {AssignmentExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalAssignmentExpression(ast, subs) { if (ast.left.type !== 'Identifier') { - throw SyntaxError('Invalid left-hand side in assignment'); + throw new SyntaxError('Invalid left-hand side in assignment'); } - const id = ast.left.name; + const id = /** @type {jsep.Identifier} */ast.left.name; const value = SafeEval.evalAst(ast.right, subs); subs[id] = value; return subs[id]; @@ -1363,7 +1450,7 @@ class SafeScript { */ constructor(expr) { this.code = expr; - this.ast = jsep(this.code); + this.ast = /** @type {unknown} */jsep(this.code); } /** @@ -1374,30 +1461,63 @@ class SafeScript { runInNewContext(context) { // `Object.create(null)` creates a prototypeless object const keyMap = Object.assign(Object.create(null), context); - return SafeEval.evalAst(this.ast, keyMap); + return SafeEval.evalAst(/** @type {jsep.Expression} */this.ast, keyMap); } } /* eslint-disable camelcase -- Convenient for escaping */ +/* eslint-disable class-methods-use-this -- Consistent monkey-patching */ +/* eslint-disable unicorn/prefer-private-class-fields -- Allow + monkey-patching */ +/** + * @import {Script} from './jsonpath-browser.js'; + */ /** - * @typedef {null|boolean|number|string|object|GenericArray} JSONObject + * @typedef {any} AnyInput */ /** - * @typedef {any} AnyItem + * @typedef {((...args: any[]) => any)} SandboxCallback */ /** - * @typedef {any} AnyResult + * @typedef {any|SandboxCallback} SandboxPropertyValue + */ + +/** + * @typedef {(string|number)[]} ExpressionArray + */ + +/** + * @typedef {"scalar"|"boolean"|"string"|"undefined" + * |"function"|"integer"|"number"|"nonFinite"|"object" + * |"array"|"other"|"null"} ValueType + */ + +/** + * @typedef {unknown} ParentValue + */ + +/** + * @typedef {unknown} UnknownResult + */ + +/** + * @typedef {string|number|null} ParentProperty + */ + +/** + * @typedef {ReturnObject|string|number|boolean|null|unknown[] + * |Record} PreferredOutput */ /** * Copies array and then pushes item into it. - * @param {GenericArray} arr Array to copy and into which to push - * @param {AnyItem} item Array item to add (to end) - * @returns {GenericArray} Copy of the original array + * @param {ExpressionArray} arr Array to copy and into which to push + * @param {string|number} item Array item to add (to end) + * @returns {ExpressionArray} Copy of the original array */ function push(arr, item) { arr = arr.slice(); @@ -1406,9 +1526,9 @@ function push(arr, item) { } /** * Copies array and then unshifts item into it. - * @param {AnyItem} item Array item to add (to beginning) - * @param {GenericArray} arr Array to copy and into which to unshift - * @returns {GenericArray} Copy of the original array + * @param {string|number} item Array item to add (to beginning) + * @param {ExpressionArray} arr Array to copy and into which to unshift + * @returns {ExpressionArray} Copy of the original array */ function unshift(item, arr) { arr = arr.slice(); @@ -1417,45 +1537,34 @@ function unshift(item, arr) { } /** - * Caught when JSONPath is used without `new` but rethrown if with `new` - * @extends Error + * @typedef {object} ReturnObject + * @property {ExpressionArray|string} path + * @property {unknown} value + * @property {ParentValue} parent + * @property {ParentProperty} parentProperty + * @property {boolean} [isParentSelector] + * @property {boolean} [hasArrExpr] + * @property {ExpressionArray} [expr] + * @property {string} [pointer] */ -class NewError extends Error { - /** - * @param {AnyResult} value The evaluated scalar value - */ - constructor(value) { - super('JSONPath should not be called with "new" (it prevents return ' + 'of (unwrapped) scalar values)'); - this.avoidNew = true; - this.value = value; - this.name = 'NewError'; - } -} /** -* @typedef {object} ReturnObject -* @property {string} path -* @property {JSONObject} value -* @property {object|GenericArray} parent -* @property {string} parentProperty -*/ - -/** -* @callback JSONPathCallback -* @param {string|object} preferredOutput -* @param {"value"|"property"} type -* @param {ReturnObject} fullRetObj -* @returns {void} -*/ + * @callback JSONPathCallback + * @param {any} preferredOutput Using `any` type instead of `PreferredOutput` so + * that user can supply flexible type + * @param {"value"|"property"} type + * @param {ReturnObject} fullRetObj + * @returns {void} + */ /** -* @callback OtherTypeCallback -* @param {JSONObject} val -* @param {string} path -* @param {object|GenericArray} parent -* @param {string} parentPropName -* @returns {boolean} -*/ + * @callback OtherTypeCallback + * @param {unknown} val + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {string|null} parentPropName + * @returns {boolean|null} + */ /** * @typedef {any} ContextItem @@ -1466,523 +1575,841 @@ class NewError extends Error { */ /** -* @callback EvalCallback -* @param {string} code -* @param {ContextItem} context -* @returns {EvaluatedResult} -*/ + * @callback EvalCallback + * @param {string} code + * @param {ContextItem} context + * @returns {EvaluatedResult} + */ + +/** + * @typedef {new (expr: string) => { + * runInNewContext: (context: object) => EvaluatedResult + * }} ScriptConstructor + */ + +/** + * @typedef {ScriptConstructor} EvalClass + */ + +/** + * @typedef {"value"|"path"|"pointer"|"parent"|"parentProperty" + * |"all"} ResultType + */ + +/** + * @typedef {EvalCallback|EvalClass|'safe'|'native'|boolean} EvalValue + */ + +/** + * @typedef {string|string[]} PathType + */ + +/** + * @typedef {{Script: ScriptConstructor}} SafeScriptType + */ + +/** + * @typedef {{Script: ScriptConstructor}} ScriptType + */ /** - * @typedef {typeof SafeScript} EvalClass + * @typedef {{ + * _$_path?: string, + * _$_parentProperty?: ParentProperty, + * _$_parent?: ParentValue, + * _$_property?: string|number, + * _$_root?: AnyInput, + * _$_v?: unknown, + * [key: string]: SandboxPropertyValue + * }} SandboxType */ /** * @typedef {object} JSONPathOptions - * @property {JSON} json - * @property {string|string[]} path - * @property {"value"|"path"|"pointer"|"parent"|"parentProperty"| - * "all"} [resultType="value"] + * @property {AnyInput} [json] + * @property {PathType} [path] + * @property {ResultType} [resultType="value"] * @property {boolean} [flatten=false] * @property {boolean} [wrap=true] - * @property {object} [sandbox={}] - * @property {EvalCallback|EvalClass|'safe'|'native'| - * boolean} [eval = 'safe'] - * @property {object|GenericArray|null} [parent=null] - * @property {string|null} [parentProperty=null] + * @property {SandboxType} [sandbox={}] + * @property {EvalValue} [eval='safe'] + * @property {any|null} [parent=null] + * @property {ParentProperty} [parentProperty=null] * @property {JSONPathCallback} [callback] * @property {OtherTypeCallback} [otherTypeCallback] Defaults to * function which throws on encountering `@other` * @property {boolean} [autostart=true] + * @property {boolean} [ignoreEvalErrors=false] */ /** - * @param {string|JSONPathOptions} opts If a string, will be treated as `expr` - * @param {string} [expr] JSON path to evaluate - * @param {JSON} [obj] JSON object to evaluate against - * @param {JSONPathCallback} [callback] Passed 3 arguments: 1) desired payload - * per `resultType`, 2) `"value"|"property"`, 3) Full returned object with + * @overload + * @param {string} opts JSON path to evaluate + * @param {AnyInput} [expr] JSON object to evaluate against + * @param {JSONPathCallback} [obj] Passed 3 arguments: 1) desired + * payload per `resultType`, 2) `"value"|"property"`, 3) Full returned + * object with all payloads + * @param {OtherTypeCallback} [callback] If `@other()` is at the + * end of one's query, this will be invoked with the value of the item, + * its path, its parent, and its parent's property name, and it should + * return a boolean indicating whether the supplied value belongs to the + * "other" type or not (or it may handle transformations and return + * `false`). + * @param {undefined} [otherTypeCallback] + * @returns {unknown} The string form always has `autostart` implicitly + * `true`, so the result is the evaluated value, not a `JSONPathClass` + */ +/** + * @overload + * @param {JSONPathOptions & {autostart: false}} opts An options object + * with `autostart` explicitly set to `false` defers evaluation and + * returns the `JSONPathClass` instance instead + * @returns {JSONPathClass} + */ +/** + * @overload + * @param {JSONPathOptions} opts If a string, will be treated as + * `expr` + * @returns {unknown} + */ +/** + * @param {JSONPathOptions|string} opts If a string, will be treated as `expr` + * @param {string|AnyInput} [expr] JSON path to evaluate + * @param {AnyInput|JSONPathCallback} [obj] JSON object to evaluate against + * @param {JSONPathCallback|OtherTypeCallback} [callback] Passed 3 + * arguments: 1) desired payload per `resultType`, + * 2) `"value"|"property"`, 3) Full returned object with * all payloads * @param {OtherTypeCallback} [otherTypeCallback] If `@other()` is at the end * of one's query, this will be invoked with the value of the item, its * path, its parent, and its parent's property name, and it should return * a boolean indicating whether the supplied value belongs to the "other" * type or not (or it may handle transformations and return `false`). - * @returns {JSONPath} - * @class + * @throws {Error} + * @returns {unknown|JSONPathClass} */ function JSONPath(opts, expr, obj, callback, otherTypeCallback) { - // eslint-disable-next-line no-restricted-syntax -- Allow for pseudo-class - if (!(this instanceof JSONPath)) { - try { - return new JSONPath(opts, expr, obj, callback, otherTypeCallback); - } catch (e) { - if (!e.avoidNew) { - throw e; - } - return e.value; + try { + if (opts && typeof opts === 'object') { + return new JSONPathClass(opts); } - } - if (typeof opts === 'string') { - otherTypeCallback = callback; - callback = obj; - obj = expr; - expr = opts; - opts = null; - } - const optObj = opts && typeof opts === 'object'; - opts = opts || {}; - this.json = opts.json || obj; - this.path = opts.path || expr; - this.resultType = opts.resultType || 'value'; - this.flatten = opts.flatten || false; - this.wrap = Object.hasOwn(opts, 'wrap') ? opts.wrap : true; - this.sandbox = opts.sandbox || {}; - this.eval = opts.eval === undefined ? 'safe' : opts.eval; - this.ignoreEvalErrors = typeof opts.ignoreEvalErrors === 'undefined' ? false : opts.ignoreEvalErrors; - this.parent = opts.parent || null; - this.parentProperty = opts.parentProperty || null; - this.callback = opts.callback || callback || null; - this.otherTypeCallback = opts.otherTypeCallback || otherTypeCallback || function () { - throw new TypeError('You must supply an otherTypeCallback callback option ' + 'with the @other() operator.'); - }; - if (opts.autostart !== false) { - const args = { - path: optObj ? opts.path : expr - }; - if (!optObj) { - args.json = obj; - } else if ('json' in opts) { - args.json = opts.json; + return new JSONPathClass(opts, expr, /** @type {JSONPathCallback|undefined} */obj, /** @type {OtherTypeCallback|undefined} */callback, /** @type {undefined} */otherTypeCallback); + } catch (e) { + if (new.target) { + throw e; } - const ret = this.evaluate(args); - if (!ret || typeof ret !== 'object') { - throw new NewError(ret); + if (e && typeof e === 'object' && 'value' in e) { + return /** @type {{value: UnknownResult}} */e.value; } - return ret; + throw e; } } -// PUBLIC METHODS -JSONPath.prototype.evaluate = function (expr, json, callback, otherTypeCallback) { - let currParent = this.parent, - currParentProperty = this.parentProperty; - let { - flatten, - wrap - } = this; - this.currResultType = this.resultType; - this.currEval = this.eval; - this.currSandbox = this.sandbox; - callback = callback || this.callback; - this.currOtherTypeCallback = otherTypeCallback || this.otherTypeCallback; - json = json || this.json; - expr = expr || this.path; - if (expr && typeof expr === 'object' && !Array.isArray(expr)) { - if (!expr.path && expr.path !== '') { - throw new TypeError('You must supply a "path" property when providing an object ' + 'argument to JSONPath.evaluate().'); - } - if (!Object.hasOwn(expr, 'json')) { - throw new TypeError('You must supply a "json" property when providing an object ' + 'argument to JSONPath.evaluate().'); - } - ({ - json - } = expr); - flatten = Object.hasOwn(expr, 'flatten') ? expr.flatten : flatten; - this.currResultType = Object.hasOwn(expr, 'resultType') ? expr.resultType : this.currResultType; - this.currSandbox = Object.hasOwn(expr, 'sandbox') ? expr.sandbox : this.currSandbox; - wrap = Object.hasOwn(expr, 'wrap') ? expr.wrap : wrap; - this.currEval = Object.hasOwn(expr, 'eval') ? expr.eval : this.currEval; - callback = Object.hasOwn(expr, 'callback') ? expr.callback : callback; - this.currOtherTypeCallback = Object.hasOwn(expr, 'otherTypeCallback') ? expr.otherTypeCallback : this.currOtherTypeCallback; - currParent = Object.hasOwn(expr, 'parent') ? expr.parent : currParent; - currParentProperty = Object.hasOwn(expr, 'parentProperty') ? expr.parentProperty : currParentProperty; - expr = expr.path; - } - currParent = currParent || null; - currParentProperty = currParentProperty || null; - if (Array.isArray(expr)) { - expr = JSONPath.toPathString(expr); - } - if (!expr && expr !== '' || !json) { - return undefined; - } - const exprList = JSONPath.toPathArray(expr); - if (exprList[0] === '$' && exprList.length > 1) { - exprList.shift(); - } - this._hasParentSelector = null; - const result = this._trace(exprList, json, ['$'], currParent, currParentProperty, callback).filter(function (ea) { - return ea && !ea.isParentSelector; - }); - if (!result.length) { - return wrap ? [] : undefined; - } - if (!wrap && result.length === 1 && !result[0].hasArrExpr) { - return this._getPreferredOutput(result[0]); +/** + * + */ +class JSONPathClass { + /** + * @overload + * @param {string} opts JSON path to evaluate + * @param {AnyInput} [expr] JSON object to evaluate against + * @param {JSONPathCallback} [obj] Passed 3 arguments: 1) desired + * payload per `resultType`, 2) `"value"|"property"`, 3) Full returned + * object with all payloads + * @param {OtherTypeCallback} [callback] If `@other()` is at the + * end of one's query, this will be invoked with the value of the item, + * its path, its parent, and its parent's property name, and it should + * return a boolean indicating whether the supplied value belongs to the + * "other" type or not (or it may handle transformations and return + * `false`). + * @param {undefined} [otherTypeCallback] + */ + /** + * @overload + * @param {JSONPathOptions} opts If a string, will be treated as + * `expr` + */ + /** + * @param {null|string|JSONPathOptions} opts If a string, will be treated as + * `expr` + * @param {string|AnyInput} [expr] JSON path to evaluate + * @param {AnyInput|JSONPathCallback} [obj] JSON object to evaluate against + * @param {JSONPathCallback|OtherTypeCallback} [callback] Passed 3 + * arguments: 1) desired payload per `resultType`, + * 2) `"value"|"property"`, 3) Full returned + * object with all payloads + * @param {OtherTypeCallback} [otherTypeCallback] If `@other()` is at the + * end of one's query, this will be invoked with the value of the item, + * its path, its parent, and its parent's property name, and it should + * return a boolean indicating whether the supplied value belongs to the + * "other" type or not (or it may handle transformations and return + * `false`). + */ + constructor(opts, expr, obj, callback, otherTypeCallback) { + if (typeof opts === 'string') { + otherTypeCallback = /** @type {OtherTypeCallback} */ + callback; + callback = /** @type {JSONPathCallback} */ + obj; + obj = expr; + expr = opts; + opts = null; + } + const optObj = opts && typeof opts === 'object'; + opts ||= /** @type {JSONPathOptions} */{}; + /** @type {ResultType|undefined} */ + this.currResultType = undefined; + + /** @type {EvalValue|undefined} */ + this.currEval = undefined; + + /** @type {OtherTypeCallback|undefined} */ + this.currOtherTypeCallback = undefined; + + /** @type {SandboxType|undefined} */ + this.currSandbox = undefined; + this._hasParentSelector = false; + this.json = opts.json || obj; + this.path = opts.path || expr; + this.resultType = opts.resultType || 'value'; + this.flatten = Object.hasOwn(opts, 'flatten') ? opts.flatten : false; + this.wrap = Object.hasOwn(opts, 'wrap') ? opts.wrap : true; + this.sandbox = opts.sandbox || {}; + this.eval = opts.eval === undefined ? 'safe' : opts.eval; + this.ignoreEvalErrors = typeof opts.ignoreEvalErrors === 'undefined' ? false : opts.ignoreEvalErrors; + this.parent = Object.hasOwn(opts, 'parent') ? opts.parent : null; + this.parentProperty = Object.hasOwn(opts, 'parentProperty') ? opts.parentProperty : null; + this.callback = opts.callback || (/** @type {JSONPathCallback} */ + callback) || null; + this.otherTypeCallback = opts.otherTypeCallback || otherTypeCallback || function () { + throw new TypeError('You must supply an otherTypeCallback callback option ' + 'with the @other() operator.'); + }; + if (opts.autostart !== false) { + const args = /** @type {JSONPathOptions} */{ + path: optObj ? opts.path : expr + }; + if (!optObj && obj !== undefined) { + args.json = obj; + } else if ('json' in opts) { + args.json = opts.json; + } + const ret = this.evaluate(args); + if (!ret || typeof ret !== 'object') { + const err = /** @type {Error & {value: UnknownResult}} */ + new Error('JSONPath should not be called with "new" (it ' + 'prevents return of (unwrapped) scalar values)'); + err.value = ret; + throw err; + } + + // eslint-disable-next-line @stylistic/max-len -- Long + // @ts-expect-error - Constructor returns evaluate result for legacy API + // eslint-disable-next-line no-constructor-return -- Legacy API + return ret; + } } - return result.reduce((rslt, ea) => { - const valOrPath = this._getPreferredOutput(ea); - if (flatten && Array.isArray(valOrPath)) { - rslt = rslt.concat(valOrPath); + + // PUBLIC METHODS + + /** + * @overload + * @param {JSONPathOptions} [expr] + * @returns {ReturnObject|ReturnObject[]|undefined|unknown} + */ + + /** + * @overload + * @param {PathType|undefined} [expr] + * @param {AnyInput} [json] + * @param {JSONPathCallback|null} [callback] + * @param {OtherTypeCallback} [otherTypeCallback] + * @returns {ReturnObject|ReturnObject[]|undefined|unknown} + */ + + /** + * @param {PathType|JSONPathOptions|undefined} [expr] + * @param {AnyInput} [json] + * @param {JSONPathCallback|null} [callback] + * @param {OtherTypeCallback} [otherTypeCallback] + * @returns {ReturnObject|ReturnObject[]|undefined|unknown} + */ + evaluate(expr, json, callback, otherTypeCallback) { + let currParent = this.parent, + currParentProperty = this.parentProperty; + let { + flatten, + wrap + } = this; + this.currResultType = this.resultType; + this.currEval = this.eval; + this.currSandbox = this.sandbox; + callback ||= this.callback; + this.currOtherTypeCallback = otherTypeCallback || this.otherTypeCallback; + if (expr && typeof expr === 'object' && !Array.isArray(expr)) { + const exprObj = expr; + if (!exprObj.path && exprObj.path !== '') { + throw new TypeError('You must supply a "path" property when providing an ' + 'object argument to JSONPath.evaluate().'); + } + if (!Object.hasOwn(exprObj, 'json')) { + throw new TypeError('You must supply a "json" property when providing an ' + 'object argument to JSONPath.evaluate().'); + } + ({ + json + } = exprObj); + flatten = Object.hasOwn(exprObj, 'flatten') ? exprObj.flatten : flatten; + this.currResultType = Object.hasOwn(exprObj, 'resultType') ? exprObj.resultType : this.currResultType; + this.currSandbox = Object.hasOwn(exprObj, 'sandbox') ? exprObj.sandbox : this.currSandbox; + wrap = Object.hasOwn(exprObj, 'wrap') ? exprObj.wrap : wrap; + this.currEval = Object.hasOwn(exprObj, 'eval') ? exprObj.eval : this.currEval; + callback = Object.hasOwn(exprObj, 'callback') ? exprObj.callback : callback; + this.currOtherTypeCallback = Object.hasOwn(exprObj, 'otherTypeCallback') ? exprObj.otherTypeCallback : this.currOtherTypeCallback; + currParent = Object.hasOwn(exprObj, 'parent') ? exprObj.parent : currParent; + currParentProperty = Object.hasOwn(exprObj, 'parentProperty') ? exprObj.parentProperty : currParentProperty; + expr = exprObj.path; } else { - rslt.push(valOrPath); + json ||= this.json; + expr ||= this.path; } - return rslt; - }, []); -}; + currParent ||= null; + currParentProperty ||= null; + if (Array.isArray(expr)) { + expr = JSONPath.toPathString(expr); + } + if (!json || !expr && expr !== '') { + return undefined; + } + const exprList = JSONPath.toPathArray(/** @type {string} */ + expr); + if (exprList[0] === '$' && exprList.length > 1) { + exprList.shift(); + } + this._hasParentSelector = false; + const traceResult = this._trace(exprList, json, ['$'], currParent, currParentProperty, callback ?? undefined, undefined); -// PRIVATE METHODS - -JSONPath.prototype._getPreferredOutput = function (ea) { - const resultType = this.currResultType; - switch (resultType) { - case 'all': - { - const path = Array.isArray(ea.path) ? ea.path : JSONPath.toPathArray(ea.path); - ea.pointer = JSONPath.toPointer(path); - ea.path = typeof ea.path === 'string' ? ea.path : JSONPath.toPathString(ea.path); - return ea; + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next 2 -- Unreachable: _trace returns array when hasArrExpr set */ + const result = (Array.isArray(traceResult) ? traceResult : [traceResult]).filter(ea => { + return ea && !ea.isParentSelector; + }); + if (!result.length) { + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next -- Unreachable: valid queries always produce results */ + return wrap ? [] : undefined; + } + if (!wrap && result.length === 1 && !result[0].hasArrExpr) { + const preferredOutput = this._getPreferredOutput(result[0]); + return preferredOutput; + } + const reduced = result.reduce((rslt, ea) => { + const valOrPath = this._getPreferredOutput(ea); + if (flatten && Array.isArray(valOrPath)) { + rslt = rslt.concat(valOrPath); + } else { + rslt.push(valOrPath); } - case 'value': - case 'parent': - case 'parentProperty': - return ea[resultType]; - case 'path': - return JSONPath.toPathString(ea[resultType]); - case 'pointer': - return JSONPath.toPointer(ea.path); - default: - throw new TypeError('Unknown result type'); - } -}; -JSONPath.prototype._handleCallback = function (fullRetObj, callback, type) { - if (callback) { - const preferredOutput = this._getPreferredOutput(fullRetObj); - fullRetObj.path = typeof fullRetObj.path === 'string' ? fullRetObj.path : JSONPath.toPathString(fullRetObj.path); - // eslint-disable-next-line n/callback-return -- No need to return - callback(preferredOutput, type, fullRetObj); + return rslt; + }, /** @type {UnknownResult[]} */ + []); + return reduced; } -}; -/** - * - * @param {string} expr - * @param {JSONObject} val - * @param {string} path - * @param {object|GenericArray} parent - * @param {string} parentPropName - * @param {JSONPathCallback} callback - * @param {boolean} hasArrExpr - * @param {boolean} literalPriority - * @returns {ReturnObject|ReturnObject[]} - */ -JSONPath.prototype._trace = function (expr, val, path, parent, parentPropName, callback, hasArrExpr, literalPriority) { - // No expr to follow? return path and value as the result of - // this trace branch - let retObj; - if (!expr.length) { - retObj = { - path, - value: val, - parent, - parentProperty: parentPropName, - hasArrExpr - }; - this._handleCallback(retObj, callback, 'value'); - return retObj; + // PRIVATE METHODS + + /** + * @param {ReturnObject} ea + * @returns {PreferredOutput} + */ + _getPreferredOutput(ea) { + const resultType = this.currResultType; + switch (resultType) { + case 'all': + { + const path = Array.isArray(ea.path) ? ea.path : JSONPath.toPathArray(ea.path); + ea.pointer = JSONPath.toPointer(/** @type {string[]} */path); + ea.path = typeof ea.path === 'string' ? ea.path : JSONPath.toPathString(/** @type {string[]} */ea.path); + return ea; + } + case 'value': + case 'parent': + case 'parentProperty': + return /** @type {PreferredOutput} */ea[resultType]; + case 'path': + if (typeof ea.path === 'string') { + return ea.path; + } + return JSONPath.toPathString(/** @type {string[]} */ea.path); + case 'pointer': + { + const pathArray = Array.isArray(ea.path) ? ea.path : JSONPath.toPathArray(ea.path); + return JSONPath.toPointer(/** @type {string[]} */pathArray); + } + default: + throw new TypeError('Unknown result type'); + } } - const loc = expr[0], - x = expr.slice(1); - // We need to gather the return value of recursive trace calls in order to - // do the parent sel computation. - const ret = []; /** - * - * @param {ReturnObject|ReturnObject[]} elems + * @param {ReturnObject} fullRetObj + * @param {JSONPathCallback|undefined} callback + * @param {"value"|"property"} type * @returns {void} */ - function addRet(elems) { - if (Array.isArray(elems)) { - // This was causing excessive stack size in Node (with or - // without Babel) against our performance test: - // `ret.push(...elems);` - elems.forEach(t => { - ret.push(t); - }); - } else { - ret.push(elems); + _handleCallback(fullRetObj, callback, type) { + // Early return if no callback provided (defensive + // check for internal calls) + if (!callback) { + return; + } + const preferredOutput = this._getPreferredOutput(fullRetObj); + if (Array.isArray(fullRetObj.path)) { + fullRetObj.path = JSONPath.toPathString(/** @type {string[]} */fullRetObj.path); } + callback(preferredOutput, type, fullRetObj); } - if ((typeof loc !== 'string' || literalPriority) && val && Object.hasOwn(val, loc)) { - // simple case--directly follow property - addRet(this._trace(x, val[loc], push(path, loc), val, loc, callback, hasArrExpr)); - // eslint-disable-next-line unicorn/prefer-switch -- Part of larger `if` - } else if (loc === '*') { - // all child properties - this._walk(val, m => { - addRet(this._trace(x, val[m], push(path, m), val, m, callback, true, true)); - }); - } else if (loc === '..') { - // all descendent parent properties - // Check remaining expression with val's immediate children - addRet(this._trace(x, val, path, parent, parentPropName, callback, hasArrExpr)); - this._walk(val, m => { - // We don't join m and x here because we only want parents, - // not scalar values - if (typeof val[m] === 'object') { - // Keep going with recursive descent on val's - // object children - addRet(this._trace(expr.slice(), val[m], push(path, m), val, m, callback, true)); + + /** + * + * @param {ExpressionArray} expr + * @param {unknown} val + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {ParentProperty} parentPropName + * @param {JSONPathCallback|undefined} callback + * @param {boolean|undefined} hasArrExpr + * @param {boolean} [literalPriority] + * @returns {ReturnObject|ReturnObject[]} + */ + _trace(expr, val, path, parent, parentPropName, callback, hasArrExpr, literalPriority) { + // No expr to follow? return path and value as the result of + // this trace branch + let retObj; + if (!expr.length) { + retObj = { + path, + value: val, + parent, + parentProperty: parentPropName, + hasArrExpr + }; + this._handleCallback(retObj, callback, 'value'); + return retObj; + } + const loc = /** @type {string} */expr[0], + x = expr.slice(1); + + // We need to gather the return value of recursive trace calls in order + // to do the parent sel computation. + /** @type {ReturnObject[]} */ + const ret = []; + /** + * + * @param {ReturnObject|ReturnObject[]} elems + * @returns {void} + */ + function addRet(elems) { + if (Array.isArray(elems)) { + // This was causing excessive stack size in Node (with or + // without Babel) against our performance test: + // `ret.push(...elems);` + elems.forEach(t => { + ret.push(t); + }); + } else { + ret.push(elems); } - }); - // The parent sel computation is handled in the frame above using the - // ancestor object of val - } else if (loc === '^') { - // This is not a final endpoint, so we do not invoke the callback here - this._hasParentSelector = true; - return { - path: path.slice(0, -1), - expr: x, - isParentSelector: true - }; - } else if (loc === '~') { - // property name - retObj = { - path: push(path, loc), - value: parentPropName, - parent, - parentProperty: null - }; - this._handleCallback(retObj, callback, 'property'); - return retObj; - } else if (loc === '$') { - // root only - addRet(this._trace(x, val, path, null, null, callback, hasArrExpr)); - } else if (/^(-?\d*):(-?\d*):?(\d*)$/u.test(loc)) { - // [start:end:step] Python slice syntax - addRet(this._slice(loc, x, val, path, parent, parentPropName, callback)); - } else if (loc.indexOf('?(') === 0) { - // [?(expr)] (filtering) - if (this.currEval === false) { - throw new Error('Eval [?(expr)] prevented in JSONPath expression.'); - } - const safeLoc = loc.replace(/^\?\((.*?)\)$/u, '$1'); - // check for a nested filter expression - const nested = /@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu.exec(safeLoc); - if (nested) { - // find if there are matches in the nested expression - // add them to the result set if there is at least one match + } + if (val && (typeof loc !== 'string' || literalPriority) && Object.hasOwn(val, /** @type {PropertyKey} */loc)) { + // simple case--directly follow property + const valObj = /** @type {Record} */val; + addRet(this._trace(x, valObj[(/** @type {string} */loc)], push(path, loc), val, /** @type {string|number} */loc, callback, hasArrExpr)); + // eslint-disable-next-line unicorn/prefer-switch -- Part of larger `if` + } else if (loc === '*') { + // all child properties this._walk(val, m => { - const npath = [nested[2]]; - const nvalue = nested[1] ? val[m][nested[1]] : val[m]; - const filterResults = this._trace(npath, nvalue, path, parent, parentPropName, callback, true); - if (filterResults.length > 0) { - addRet(this._trace(x, val[m], push(path, m), val, m, callback, true)); - } + const valObj = /** @type {Record} */val; + addRet(this._trace(x, valObj[m], push(path, m), val, m, callback, true, true)); }); - } else { + } else if (loc === '..') { + // all descendent parent properties + // Check remaining expression with val's immediate children + addRet(this._trace(x, val, path, parent, parentPropName, callback, hasArrExpr)); this._walk(val, m => { - if (this._eval(safeLoc, val[m], m, path, parent, parentPropName)) { - addRet(this._trace(x, val[m], push(path, m), val, m, callback, true)); + // We don't join m and x here because we only want parents, + // not scalar values + const valObj = /** @type {Record} */val; + if (typeof valObj[m] === 'object') { + // Keep going with recursive descent on val's + // object children + addRet(this._trace(expr.slice(), valObj[m], push(path, m), val, m, callback, true)); } }); - } - } else if (loc[0] === '(') { - // [(expr)] (dynamic property/index) - if (this.currEval === false) { - throw new Error('Eval [(expr)] prevented in JSONPath expression.'); - } - // As this will resolve to a property name (but we don't know it - // yet), property and parent information is relative to the - // parent of the property to which this expression will resolve - addRet(this._trace(unshift(this._eval(loc, val, path.at(-1), path.slice(0, -1), parent, parentPropName), x), val, path, parent, parentPropName, callback, hasArrExpr)); - } else if (loc[0] === '@') { - // value type: @boolean(), etc. - let addType = false; - const valueType = loc.slice(1, -2); - switch (valueType) { - case 'scalar': - if (!val || !['object', 'function'].includes(typeof val)) { - addType = true; - } - break; - case 'boolean': - case 'string': - case 'undefined': - case 'function': - if (typeof val === valueType) { - addType = true; - } - break; - case 'integer': - if (Number.isFinite(val) && !(val % 1)) { - addType = true; - } - break; - case 'number': - if (Number.isFinite(val)) { - addType = true; - } - break; - case 'nonFinite': - if (typeof val === 'number' && !Number.isFinite(val)) { - addType = true; - } - break; - case 'object': - if (val && typeof val === valueType) { - addType = true; - } - break; - case 'array': - if (Array.isArray(val)) { - addType = true; - } - break; - case 'other': - addType = this.currOtherTypeCallback(val, path, parent, parentPropName); - break; - case 'null': - if (val === null) { - addType = true; - } - break; - /* c8 ignore next 2 */ - default: - throw new TypeError('Unknown value type ' + valueType); - } - if (addType) { + // The parent sel computation is handled in the frame above using the + // ancestor object of val + } else if (loc === '^') { + // This is not a final endpoint, so we do not invoke the + // callback here + this._hasParentSelector = true; + return /** @type {ReturnObject} */{ + path: path.slice(0, -1), + expr: x, + isParentSelector: true, + value: undefined, + parent: undefined, + parentProperty: null + }; + } else if (loc === '~') { + // property name retObj = { - path, - value: val, + path: push(path, loc), + value: parentPropName, parent, - parentProperty: parentPropName + parentProperty: null }; - this._handleCallback(retObj, callback, 'value'); + this._handleCallback(retObj, callback, 'property'); return retObj; + } else if (loc === '$') { + // root only + addRet(this._trace(x, val, path, null, null, callback, hasArrExpr)); + } else if (/^(-?\d*):(-?\d*):?(\d*)$/u.test(loc)) { + // [start:end:step] Python slice syntax + const sliceResult = this._slice(loc, x, val, path, parent, parentPropName, callback); + if (sliceResult) { + addRet(sliceResult); + } + } else if (loc.indexOf('?(') === 0) { + // [?(expr)] (filtering) + if (this.currEval === false) { + throw new Error('Eval [?(expr)] prevented in JSONPath expression.'); + } + const safeLoc = loc.replace(/^\?\((.*?)\)$/u, '$1'); + // check for a nested filter expression + + const nested = /@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu.exec(safeLoc); + if (nested) { + // find if there are matches in the nested expression + // add them to the result set if there is at least one match + this._walk(val, m => { + const npath = [nested[2]]; + const valObj2 = /** @type {Record} */ + val; + const nvalue = /** @type {ValueType} */nested[1] ? /** @type {Record} */valObj2[m][nested[1]] : valObj2[m]; + const filterResults = this._trace(npath, nvalue, path, parent, parentPropName, callback, true); + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next 3 -- Unreachable: _trace always returns array for nested filters */ + const filterArray = Array.isArray(filterResults) ? filterResults : [filterResults]; + if (filterArray.length > 0) { + addRet(this._trace(x, valObj2[m], push(path, m), val, m, callback, true)); + } + }); + } else { + const valObj3 = /** @type {Record} */val; + this._walk(val, m => { + if (this._eval(safeLoc, valObj3[m], m, path, parent, parentPropName)) { + addRet(this._trace(x, valObj3[m], push(path, m), val, m, callback, true)); + } + }); + } + } else if (loc[0] === '(') { + // [(expr)] (dynamic property/index) + if (this.currEval === false) { + throw new Error('Eval [(expr)] prevented in JSONPath expression.'); + } + // As this will resolve to a property name (but we don't know it + // yet), property and parent information is relative to the + const evalResult = this._eval(/** @type {string} */loc, val, /** @type {string|number} */path.at(-1), path.slice(0, -1), parent, parentPropName); + const exprToUse = /** @type {string|number} */ + evalResult !== undefined ? evalResult : ''; + addRet(this._trace(unshift(exprToUse, x), val, path, parent, parentPropName, callback, hasArrExpr)); + } else if (loc[0] === '@') { + // value type: @boolean(), etc. + let addType = false; + const valueType = /** @type {ValueType} */loc.slice(1, -2); + switch (valueType) { + case 'scalar': + if (!val || !['object', 'function'].includes(typeof val)) { + addType = true; + } + break; + case 'boolean': + case 'string': + case 'undefined': + case 'function': + if (typeof val === valueType) { + addType = true; + } + break; + case 'integer': + if (Number.isFinite(val) && !(/** @type {number} */val % 1)) { + addType = true; + } + break; + case 'number': + if (Number.isFinite(val)) { + addType = true; + } + break; + case 'nonFinite': + if (typeof val === 'number' && !Number.isFinite(val)) { + addType = true; + } + break; + case 'object': + if (val && typeof val === valueType) { + addType = true; + } + break; + case 'array': + if (Array.isArray(val)) { + addType = true; + } + break; + case 'other': + addType = this.currOtherTypeCallback?.(val, path, parent, /** @type {string|null} */parentPropName) ?? false; + break; + case 'null': + if (val === null) { + addType = true; + } + break; + /* c8 ignore next 2 */ + default: + throw new TypeError('Unknown value type ' + valueType); + } + if (addType) { + retObj = { + path, + value: val, + parent, + parentProperty: parentPropName + }; + this._handleCallback(retObj, callback, 'value'); + return retObj; + } + // `-escaped property + } else if (val && loc[0] === '`' && Object.hasOwn(val, loc.slice(1))) { + const locProp = loc.slice(1); + const valObj = /** @type {Record} */val; + addRet(this._trace(x, valObj[locProp], push(path, locProp), val, locProp, callback, hasArrExpr, true)); + } else if (loc.includes(',')) { + // [name1,name2,...] + const parts = loc.split(','); + for (const part of parts) { + addRet(this._trace(unshift(part, x), val, path, parent, parentPropName, callback, true)); + } + // simple case--directly follow property + } else if (!literalPriority && val && Object.hasOwn(val, loc)) { + const valObj = /** @type {Record} */val; + addRet(this._trace(x, valObj[loc], push(path, loc), val, loc, callback, hasArrExpr, true)); } - // `-escaped property - } else if (loc[0] === '`' && val && Object.hasOwn(val, loc.slice(1))) { - const locProp = loc.slice(1); - addRet(this._trace(x, val[locProp], push(path, locProp), val, locProp, callback, hasArrExpr, true)); - } else if (loc.includes(',')) { - // [name1,name2,...] - const parts = loc.split(','); - for (const part of parts) { - addRet(this._trace(unshift(part, x), val, path, parent, parentPropName, callback, true)); - } - // simple case--directly follow property - } else if (!literalPriority && val && Object.hasOwn(val, loc)) { - addRet(this._trace(x, val[loc], push(path, loc), val, loc, callback, hasArrExpr, true)); - } - // We check the resulting values for parent selections. For parent - // selections we discard the value object and continue the trace with the - // current val object - if (this._hasParentSelector) { - for (let t = 0; t < ret.length; t++) { - const rett = ret[t]; - if (rett && rett.isParentSelector) { - const tmp = this._trace(rett.expr, val, rett.path, parent, parentPropName, callback, hasArrExpr); - if (Array.isArray(tmp)) { - ret[t] = tmp[0]; - const tl = tmp.length; - for (let tt = 1; tt < tl; tt++) { - // eslint-disable-next-line @stylistic/max-len -- Long - // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient - t++; - ret.splice(t, 0, tmp[tt]); + // We check the resulting values for parent selections. For parent + // selections we discard the value object and continue the trace with + // the current val object + if (this._hasParentSelector) { + for (let t = 0; t < ret.length; t++) { + const rett = ret[t]; + if (rett && rett.isParentSelector) { + const exprToUse = /** @type {ExpressionArray} */ + rett.expr; + const pathToUse = /** @type {ExpressionArray} */ + rett.path; + const tmp = this._trace(exprToUse, val, pathToUse, parent, parentPropName, callback, hasArrExpr); + if (Array.isArray(tmp)) { + ret[t] = tmp[0]; + const tl = tmp.length; + for (let tt = 1; tt < tl; tt++) { + t++; + ret.splice(t, 0, tmp[tt]); + } + } else { + ret[t] = tmp; } - } else { - ret[t] = tmp; } } } + return ret; } - return ret; -}; -JSONPath.prototype._walk = function (val, f) { - if (Array.isArray(val)) { - const n = val.length; - for (let i = 0; i < n; i++) { - f(i); - } - } else if (val && typeof val === 'object') { - Object.keys(val).forEach(m => { - f(m); - }); - } -}; -JSONPath.prototype._slice = function (loc, expr, val, path, parent, parentPropName, callback) { - if (!Array.isArray(val)) { - return undefined; - } - const len = val.length, - parts = loc.split(':'), - step = parts[2] && Number.parseInt(parts[2]) || 1; - let start = parts[0] && Number.parseInt(parts[0]) || 0, - end = parts[1] ? Number.parseInt(parts[1]) : len; - start = start < 0 ? Math.max(0, start + len) : Math.min(len, start); - end = end < 0 ? Math.max(0, end + len) : Math.min(len, end); - const ret = []; - for (let i = start; i < end; i += step) { - const tmp = this._trace(unshift(i, expr), val, path, parent, parentPropName, callback, true); - // Should only be possible to be an array here since first part of - // ``unshift(i, expr)` passed in above would not be empty, nor `~`, - // nor begin with `@` (as could return objects) - // This was causing excessive stack size in Node (with or - // without Babel) against our performance test: `ret.push(...tmp);` - tmp.forEach(t => { - ret.push(t); - }); + + /** + * @param {unknown} val + * @param {(prop: string|number) => void} f + * @returns {void} + */ + _walk(val, f) { + if (Array.isArray(val)) { + const n = val.length; + for (let i = 0; i < n; i++) { + f(i); + } + } else if (val && typeof val === 'object') { + Object.keys(val).forEach(m => { + f(m); + }); + } } - return ret; -}; -JSONPath.prototype._eval = function (code, _v, _vname, path, parent, parentPropName) { - this.currSandbox._$_parentProperty = parentPropName; - this.currSandbox._$_parent = parent; - this.currSandbox._$_property = _vname; - this.currSandbox._$_root = this.json; - this.currSandbox._$_v = _v; - const containsPath = code.includes('@path'); - if (containsPath) { - this.currSandbox._$_path = JSONPath.toPathString(path.concat([_vname])); + + /** + * @param {string} loc + * @param {ExpressionArray} expr + * @param {unknown} val + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {ParentProperty} parentPropName + * @param {JSONPathCallback|undefined} callback + * @returns {ReturnObject[]|undefined} + */ + _slice(loc, expr, val, path, parent, parentPropName, callback) { + if (!Array.isArray(val)) { + return undefined; + } + const len = val.length, + parts = loc.split(':'), + step = parts[2] && Number(parts[2]) || 1; + let start = parts[0] && Number(parts[0]) || 0, + end = parts[1] ? Number(parts[1]) : len; + start = start < 0 ? Math.max(0, start + len) : Math.min(len, start); + end = end < 0 ? Math.max(0, end + len) : Math.min(len, end); + /** @type {ReturnObject[]} */ + const ret = []; + for (let i = start; i < end; i += step) { + const tmp = this._trace(unshift(i, expr), val, path, parent, parentPropName, callback, true); + // Should only be possible to be an array here since first part of + // ``unshift(i, expr)` passed in above would not be empty, + // nor `~`, nor begin with `@` (as could return objects) + // This was causing excessive stack size in Node (with or + // without Babel) against our performance test: `ret.push(...tmp);` + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next -- Unreachable: _trace returns array when expr non-empty */ + const tmpArray = Array.isArray(tmp) ? tmp : [tmp]; + tmpArray.forEach(t => { + ret.push(t); + }); + } + return ret; } - const scriptCacheKey = this.currEval + 'Script:' + code; - if (!JSONPath.cache[scriptCacheKey]) { - let script = code.replaceAll('@parentProperty', '_$_parentProperty').replaceAll('@parent', '_$_parent').replaceAll('@property', '_$_property').replaceAll('@root', '_$_root').replaceAll(/@([.\s)[])/gu, '_$_v$1'); + + /** + * @param {string} code + * @param {unknown} _v + * @param {string|number} _vname + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {ParentProperty} parentPropName + * @returns {UnknownResult} + */ + _eval(code, _v, _vname, path, parent, parentPropName) { + if (this.currSandbox) { + this.currSandbox._$_parentProperty = parentPropName; + this.currSandbox._$_parent = parent; + this.currSandbox._$_property = _vname; + this.currSandbox._$_root = this.json; + this.currSandbox._$_v = _v; + } + const containsPath = code.includes('@path'); if (containsPath) { - script = script.replaceAll('@path', '_$_path'); - } - if (this.currEval === 'safe' || this.currEval === true || this.currEval === undefined) { - JSONPath.cache[scriptCacheKey] = new this.safeVm.Script(script); - } else if (this.currEval === 'native') { - JSONPath.cache[scriptCacheKey] = new this.vm.Script(script); - } else if (typeof this.currEval === 'function' && this.currEval.prototype && Object.hasOwn(this.currEval.prototype, 'runInNewContext')) { - const CurrEval = this.currEval; - JSONPath.cache[scriptCacheKey] = new CurrEval(script); - } else if (typeof this.currEval === 'function') { - JSONPath.cache[scriptCacheKey] = { - runInNewContext: context => this.currEval(script, context) - }; - } else { - throw new TypeError(`Unknown "eval" property "${this.currEval}"`); + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next -- Unreachable: currSandbox set in evaluate() before _eval */ + const currSandbox = this.currSandbox ?? {}; + currSandbox._$_path = JSONPath.toPathString(/** @type {string[]} */path.concat([_vname])); } - } - try { - return JSONPath.cache[scriptCacheKey].runInNewContext(this.currSandbox); - } catch (e) { - if (this.ignoreEvalErrors) { - return false; + const scriptCacheKey = this.currEval + 'Script:' + code; + if (!Object.hasOwn(JSONPath.cache, scriptCacheKey)) { + let script = code.replaceAll('@parentProperty', '_$_parentProperty').replaceAll('@parent', '_$_parent').replaceAll('@property', '_$_property').replaceAll('@root', '_$_root').replaceAll(/@([.\s)[])/gu, '_$_v$1'); + if (containsPath) { + script = script.replaceAll('@path', '_$_path'); + } + const evalType = /** @type {string|boolean|undefined} */ + this.currEval; + if (['safe', true, undefined].includes(evalType)) { + const { + cache + } = JSONPath; + // eslint-disable-next-line @stylistic/max-len -- Long + /* eslint-disable unicorn/no-undeclared-class-members -- Prototype members */ + cache[scriptCacheKey] = new ( + /** + * @type {JSONPathClass & { + * safeVm: SafeScriptType, + * vm: ScriptType + * }} + */ /** @type {unknown} */ + this).safeVm.Script(script); + // eslint-disable-next-line @stylistic/max-len -- Long + /* eslint-enable unicorn/no-undeclared-class-members -- End prototype member scope */ + } else if (this.currEval === 'native') { + const { + cache + } = JSONPath; + // eslint-disable-next-line @stylistic/max-len -- Long + /* eslint-disable unicorn/no-undeclared-class-members -- Prototype members */ + cache[scriptCacheKey] = new ( + /** + * @type {JSONPathClass & { + * safeVm: SafeScriptType, + * vm: ScriptType + * }} + */ /** @type {unknown} */ + this).vm.Script(script); + // eslint-disable-next-line @stylistic/max-len -- Long + /* eslint-enable unicorn/no-undeclared-class-members -- End prototype member scope */ + } else if (typeof this.currEval === 'function' && this.currEval.prototype && Object.hasOwn(this.currEval.prototype, 'runInNewContext')) { + const CurrEval = this.currEval; + const { + cache + } = JSONPath; + // eslint-disable-next-line @stylistic/max-len -- Long + // @ts-expect-error - Type checked above to have proper constructor + cache[scriptCacheKey] = new CurrEval(script); + } else if (typeof this.currEval === 'function') { + const { + cache + } = JSONPath; + // Type narrowing: at this point currEval is a function + // but not a constructor + const evalFunc = /** @type {EvalCallback} */this.currEval; + cache[scriptCacheKey] = { + runInNewContext: (/** @type {ContextItem} */context) => evalFunc(script, context) + }; + } else { + throw new TypeError(`Unknown "eval" property "${this.currEval}"`); + } + } + try { + const { + cache + } = JSONPath; + + /** + * @typedef {{ + * runInNewContext: ( + * ctx: SandboxType|undefined + * ) => EvaluatedResult + * }} RunInNewContext + */ + + return /** @type {RunInNewContext} */cache[scriptCacheKey].runInNewContext(this.currSandbox); + } catch (e) { + if (this.ignoreEvalErrors) { + return false; + } + const error = /** @type {Error} */e; + throw new Error('jsonPath: ' + error.message + ': ' + code, { + cause: e + }); } - throw new Error('jsonPath: ' + e.message + ': ' + code); } +} + +/** @type {{safeVm: SafeScriptType}} */ +(/** @type {unknown} */JSONPathClass.prototype).safeVm = { + Script: SafeScript }; +JSONPath.prototype = JSONPathClass.prototype; // PUBLIC CLASS PROPERTIES AND METHODS // Could store the cache object itself + +/** @type {Record} */ JSONPath.cache = {}; /** @@ -2002,7 +2429,7 @@ JSONPath.toPathString = function (pathArr) { }; /** - * @param {string} pointer JSON Path + * @param {string[]} pointer JSON Path array * @returns {string} JSON Pointer */ JSONPath.toPointer = function (pointer) { @@ -2025,9 +2452,10 @@ JSONPath.toPathArray = function (expr) { const { cache } = JSONPath; - if (cache[expr]) { - return cache[expr].concat(); + if (Object.hasOwn(cache, expr)) { + return /** @type {string[]} */cache[expr].concat(); } + /** @type {string[]} */ const subx = []; const normalized = expr // Properties @@ -2035,7 +2463,10 @@ JSONPath.toPathArray = function (expr) { // Parenthetical evaluations (filtering and otherwise), directly // within brackets or single quotes .replaceAll(/[['](\??\(.*?\))[\]'](?!.\])/gu, function ($0, $1) { - return '[#' + (subx.push($1) - 1) + ']'; + return '[#' + ( + // eslint-disable-next-line @stylistic/max-len -- Long + // eslint-disable-next-line unicorn/no-return-array-push -- Optimization + subx.push($1) - 1) + ']'; }) // Escape periods and tildes within properties .replaceAll(/\[['"]([^'\]]*)['"]\]/gu, function ($0, prop) { @@ -2059,15 +2490,88 @@ JSONPath.toPathArray = function (expr) { .replaceAll(/;$|'?\]|'$/gu, ''); const exprList = normalized.split(';').map(function (exp) { const match = exp.match(/#(\d+)/u); - return !match || !match[1] ? exp : subx[match[1]]; + return !match || !match[1] ? exp : subx[Number(match[1])]; }); cache[expr] = exprList; - return cache[expr].concat(); -}; -JSONPath.prototype.safeVm = { - Script: SafeScript + return /** @type {string[]} */cache[expr].concat(); }; -JSONPath.prototype.vm = vm; +/** + * @typedef {import('./jsonpath.js').AnyInput} AnyInput + */ +/** + * @typedef {import('./jsonpath.js').SandboxCallback} SandboxCallback + */ +/** + * @typedef {import('./jsonpath.js').SandboxPropertyValue} SandboxPropertyValue + */ +/** + * @typedef {import('./jsonpath.js').ExpressionArray} ExpressionArray + */ +/** + * @typedef {import('./jsonpath.js').ValueType} ValueType + */ +/** + * @typedef {import('./jsonpath.js').ParentValue} ParentValue + */ +/** + * @typedef {import('./jsonpath.js').UnknownResult} UnknownResult + */ +/** + * @typedef {import('./jsonpath.js').ParentProperty} ParentProperty + */ +/** + * @typedef {import('./jsonpath.js').PreferredOutput} PreferredOutput + */ +/** + * @typedef {import('./jsonpath.js').ReturnObject} ReturnObject + */ +/** + * @typedef {import('./jsonpath.js').JSONPathCallback} JSONPathCallback + */ +/** + * @typedef {import('./jsonpath.js').OtherTypeCallback} OtherTypeCallback + */ +/** + * @typedef {import('./jsonpath.js').ContextItem} ContextItem + */ +/** + * @typedef {import('./jsonpath.js').EvaluatedResult} EvaluatedResult + */ +/** + * @typedef {import('./jsonpath.js').EvalCallback} EvalCallback + */ +/** + * @typedef {import('./jsonpath.js').EvalClass} EvalClass + */ +/** + * @typedef {import('./jsonpath.js').ResultType} ResultType + */ +/** + * @typedef {import('./jsonpath.js').EvalValue} EvalValue + */ +/** + * @typedef {import('./jsonpath.js').PathType} PathType + */ +/** + * @typedef {import('./jsonpath.js').SafeScriptType} SafeScriptType + */ +/** + * @typedef {import('./jsonpath.js').ScriptType} ScriptType + */ +/** + * @typedef {import('./jsonpath.js').SandboxType} SandboxType + */ +/** + * @typedef {import('./jsonpath.js').JSONPathOptions} JSONPathOptions + */ + +// Node's vm module shape is wider than ScriptType, but is compatible for +// the properties actually used (Script) -- kept Node-specific here so +// `node:vm` types don't leak into the shared/browser declarations. +/** @type {{vm: ScriptType}} */ +(/** @type {unknown} */JSONPathClass.prototype).vm = /** @type {ScriptType} */ +/** @type {unknown} */vm; exports.JSONPath = JSONPath; +exports.JSONPathClass = JSONPathClass; diff --git a/dist/index-node-esm.js b/dist/index-node-esm.js index 29bbf5e8..5fe73596 100644 --- a/dist/index-node-esm.js +++ b/dist/index-node-esm.js @@ -1197,8 +1197,29 @@ const plugin = { } }; +/* eslint-disable unicorn/no-top-level-side-effects -- Temporary? */ /* eslint-disable no-bitwise -- Convenient */ +/** + * @import {EvaluatedResult, UnknownResult} from './jsonpath.js'; + */ + +/** + * @typedef {any} AssignmentExpression + */ + +/** + * @typedef {any} Substitution + */ + +/** + * @typedef {any} AnyParameter + */ + +/** + * @typedef {Record} Substitutions + */ + // register plugins jsep.plugins.register(index, plugin); jsep.addUnaryOp('typeof'); @@ -1209,37 +1230,50 @@ const BLOCKED_PROTO_PROPERTIES = new Set(['constructor', '__proto__', '__defineG const SafeEval = { /** * @param {jsep.Expression} ast - * @param {Record} subs + * @param {Substitutions} subs + * @returns {UnknownResult} */ evalAst(ast, subs) { switch (ast.type) { case 'BinaryExpression': case 'LogicalExpression': - return SafeEval.evalBinaryExpression(ast, subs); + return SafeEval.evalBinaryExpression(/** @type {jsep.BinaryExpression} */ast, subs); case 'Compound': - return SafeEval.evalCompound(ast, subs); + return SafeEval.evalCompound(/** @type {jsep.Compound} */ast, subs); case 'ConditionalExpression': - return SafeEval.evalConditionalExpression(ast, subs); + return SafeEval.evalConditionalExpression(/** @type {jsep.ConditionalExpression} */ast, subs); case 'Identifier': - return SafeEval.evalIdentifier(ast, subs); + return SafeEval.evalIdentifier(/** @type {jsep.Identifier} */ast, subs); case 'Literal': - return SafeEval.evalLiteral(ast, subs); + return SafeEval.evalLiteral(/** @type {jsep.Literal} */ast); case 'MemberExpression': - return SafeEval.evalMemberExpression(ast, subs); + return SafeEval.evalMemberExpression(/** @type {jsep.MemberExpression} */ast, subs); case 'UnaryExpression': - return SafeEval.evalUnaryExpression(ast, subs); + return SafeEval.evalUnaryExpression(/** @type {jsep.UnaryExpression} */ast, subs); case 'ArrayExpression': - return SafeEval.evalArrayExpression(ast, subs); + return SafeEval.evalArrayExpression(/** @type {jsep.ArrayExpression} */ast, subs); case 'CallExpression': - return SafeEval.evalCallExpression(ast, subs); + return SafeEval.evalCallExpression(/** @type {jsep.CallExpression} */ast, subs); case 'AssignmentExpression': - return SafeEval.evalAssignmentExpression(ast, subs); + return SafeEval.evalAssignmentExpression(/** @type {AssignmentExpression} */ast, subs); default: - throw SyntaxError('Unexpected expression', ast); + throw new SyntaxError('Unexpected expression', { + cause: ast + }); } }, + /** + * @param {jsep.BinaryExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalBinaryExpression(ast, subs) { - const result = { + /** + * @typedef {{ + * [key: string]: (a: AnyParameter, b: AnyParameter) => UnknownResult + * }} OperatorTable + */ + const result = /** @type {OperatorTable} */{ '||': (a, b) => a || b(), '&&': (a, b) => a && b(), '|': (a, b) => a | b(), @@ -1266,14 +1300,18 @@ const SafeEval = { }[ast.operator](SafeEval.evalAst(ast.left, subs), () => SafeEval.evalAst(ast.right, subs)); return result; }, + /** + * @param {jsep.Compound} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalCompound(ast, subs) { let last; for (let i = 0; i < ast.body.length; i++) { - if (ast.body[i].type === 'Identifier' && ['var', 'let', 'const'].includes(ast.body[i].name) && ast.body[i + 1] && ast.body[i + 1].type === 'AssignmentExpression') { + if (ast.body[i].type === 'Identifier' && ['var', 'let', 'const'].includes(/** @type {jsep.Identifier} */ + ast.body[i].name) && Object.hasOwn(ast.body, i + 1) && ast.body[i + 1].type === 'AssignmentExpression') { // var x=2; is detected as // [{Identifier var}, {AssignmentExpression x=2}] - // eslint-disable-next-line @stylistic/max-len -- Long - // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient i += 1; } const expr = ast.body[i]; @@ -1281,71 +1319,120 @@ const SafeEval = { } return last; }, + /** + * @param {jsep.ConditionalExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalConditionalExpression(ast, subs) { if (SafeEval.evalAst(ast.test, subs)) { return SafeEval.evalAst(ast.consequent, subs); } return SafeEval.evalAst(ast.alternate, subs); }, + /** + * @param {jsep.Identifier} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalIdentifier(ast, subs) { if (Object.hasOwn(subs, ast.name)) { return subs[ast.name]; } - throw ReferenceError(`${ast.name} is not defined`); + throw new ReferenceError(`${ast.name} is not defined`); }, + /** + * @param {jsep.Literal} ast + * @returns {UnknownResult} + */ evalLiteral(ast) { return ast.value; }, + /** + * @param {jsep.MemberExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalMemberExpression(ast, subs) { const prop = String( // NOTE: `String(value)` throws error when // value has overwritten the toString method to return non-string // i.e. `value = {toString: () => []}` - ast.computed ? SafeEval.evalAst(ast.property) // `object[property]` + ast.computed ? SafeEval.evalAst(ast.property, subs) // `object[property]` : ast.property.name // `object.property` property is Identifier ); const obj = SafeEval.evalAst(ast.object, subs); if (obj === undefined || obj === null) { - throw TypeError(`Cannot read properties of ${obj} (reading '${prop}')`); + throw new TypeError(`Cannot read properties of ${obj} (reading '${prop}')`); } if (!Object.hasOwn(obj, prop) && BLOCKED_PROTO_PROPERTIES.has(prop)) { - throw TypeError(`Cannot read properties of ${obj} (reading '${prop}')`); + throw new TypeError(`Cannot read properties of ${obj} (reading '${prop}')`); } - const result = obj[prop]; + const result = /** @type {Record} */obj[prop]; if (typeof result === 'function' && result !== Function) { return result.bind(obj); // arrow functions aren't affected by bind. } return result; }, + /** + * @param {jsep.UnaryExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalUnaryExpression(ast, subs) { - const result = { - '-': a => -SafeEval.evalAst(a, subs), + /** + * @typedef {{ + * [key: string]: (a: AnyParameter) => UnknownResult + * }} UnaryOperatorTable + */ + const result = /** @type {UnaryOperatorTable} */{ + '-': a => -(/** @type {EvaluatedResult} */ + SafeEval.evalAst(a, subs)), '!': a => !SafeEval.evalAst(a, subs), - '~': a => ~SafeEval.evalAst(a, subs), + '~': a => ~(/** @type {EvaluatedResult} */ + SafeEval.evalAst(a, subs)), // eslint-disable-next-line no-implicit-coercion -- API - '+': a => +SafeEval.evalAst(a, subs), + '+': a => +(/** @type {EvaluatedResult} */ + SafeEval.evalAst(a, subs)), typeof: a => typeof SafeEval.evalAst(a, subs), - // eslint-disable-next-line no-void, sonarjs/void-use -- feature + // eslint-disable-next-line no-void -- Ok void: a => void SafeEval.evalAst(a, subs) }[ast.operator](ast.argument); return result; }, + /** + * @param {jsep.ArrayExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalArrayExpression(ast, subs) { - return ast.elements.map(el => SafeEval.evalAst(el, subs)); + return ast.elements.map(el => SafeEval.evalAst(/** @type {jsep.Expression} */ + el, subs)); }, + /** + * @param {jsep.CallExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalCallExpression(ast, subs) { const args = ast.arguments.map(arg => SafeEval.evalAst(arg, subs)); const func = SafeEval.evalAst(ast.callee, subs); if (func === Function) { throw new Error('Function constructor is disabled'); } - return func(...args); + return (/** @type {(...args: AnyParameter[]) => UnknownResult} */ + func)(...args); }, + /** + * @param {AssignmentExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalAssignmentExpression(ast, subs) { if (ast.left.type !== 'Identifier') { - throw SyntaxError('Invalid left-hand side in assignment'); + throw new SyntaxError('Invalid left-hand side in assignment'); } - const id = ast.left.name; + const id = /** @type {jsep.Identifier} */ast.left.name; const value = SafeEval.evalAst(ast.right, subs); subs[id] = value; return subs[id]; @@ -1361,7 +1448,7 @@ class SafeScript { */ constructor(expr) { this.code = expr; - this.ast = jsep(this.code); + this.ast = /** @type {unknown} */jsep(this.code); } /** @@ -1372,30 +1459,63 @@ class SafeScript { runInNewContext(context) { // `Object.create(null)` creates a prototypeless object const keyMap = Object.assign(Object.create(null), context); - return SafeEval.evalAst(this.ast, keyMap); + return SafeEval.evalAst(/** @type {jsep.Expression} */this.ast, keyMap); } } /* eslint-disable camelcase -- Convenient for escaping */ +/* eslint-disable class-methods-use-this -- Consistent monkey-patching */ +/* eslint-disable unicorn/prefer-private-class-fields -- Allow + monkey-patching */ +/** + * @import {Script} from './jsonpath-browser.js'; + */ /** - * @typedef {null|boolean|number|string|object|GenericArray} JSONObject + * @typedef {any} AnyInput */ /** - * @typedef {any} AnyItem + * @typedef {((...args: any[]) => any)} SandboxCallback */ /** - * @typedef {any} AnyResult + * @typedef {any|SandboxCallback} SandboxPropertyValue + */ + +/** + * @typedef {(string|number)[]} ExpressionArray + */ + +/** + * @typedef {"scalar"|"boolean"|"string"|"undefined" + * |"function"|"integer"|"number"|"nonFinite"|"object" + * |"array"|"other"|"null"} ValueType + */ + +/** + * @typedef {unknown} ParentValue + */ + +/** + * @typedef {unknown} UnknownResult + */ + +/** + * @typedef {string|number|null} ParentProperty + */ + +/** + * @typedef {ReturnObject|string|number|boolean|null|unknown[] + * |Record} PreferredOutput */ /** * Copies array and then pushes item into it. - * @param {GenericArray} arr Array to copy and into which to push - * @param {AnyItem} item Array item to add (to end) - * @returns {GenericArray} Copy of the original array + * @param {ExpressionArray} arr Array to copy and into which to push + * @param {string|number} item Array item to add (to end) + * @returns {ExpressionArray} Copy of the original array */ function push(arr, item) { arr = arr.slice(); @@ -1404,9 +1524,9 @@ function push(arr, item) { } /** * Copies array and then unshifts item into it. - * @param {AnyItem} item Array item to add (to beginning) - * @param {GenericArray} arr Array to copy and into which to unshift - * @returns {GenericArray} Copy of the original array + * @param {string|number} item Array item to add (to beginning) + * @param {ExpressionArray} arr Array to copy and into which to unshift + * @returns {ExpressionArray} Copy of the original array */ function unshift(item, arr) { arr = arr.slice(); @@ -1415,45 +1535,34 @@ function unshift(item, arr) { } /** - * Caught when JSONPath is used without `new` but rethrown if with `new` - * @extends Error + * @typedef {object} ReturnObject + * @property {ExpressionArray|string} path + * @property {unknown} value + * @property {ParentValue} parent + * @property {ParentProperty} parentProperty + * @property {boolean} [isParentSelector] + * @property {boolean} [hasArrExpr] + * @property {ExpressionArray} [expr] + * @property {string} [pointer] */ -class NewError extends Error { - /** - * @param {AnyResult} value The evaluated scalar value - */ - constructor(value) { - super('JSONPath should not be called with "new" (it prevents return ' + 'of (unwrapped) scalar values)'); - this.avoidNew = true; - this.value = value; - this.name = 'NewError'; - } -} /** -* @typedef {object} ReturnObject -* @property {string} path -* @property {JSONObject} value -* @property {object|GenericArray} parent -* @property {string} parentProperty -*/ - -/** -* @callback JSONPathCallback -* @param {string|object} preferredOutput -* @param {"value"|"property"} type -* @param {ReturnObject} fullRetObj -* @returns {void} -*/ + * @callback JSONPathCallback + * @param {any} preferredOutput Using `any` type instead of `PreferredOutput` so + * that user can supply flexible type + * @param {"value"|"property"} type + * @param {ReturnObject} fullRetObj + * @returns {void} + */ /** -* @callback OtherTypeCallback -* @param {JSONObject} val -* @param {string} path -* @param {object|GenericArray} parent -* @param {string} parentPropName -* @returns {boolean} -*/ + * @callback OtherTypeCallback + * @param {unknown} val + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {string|null} parentPropName + * @returns {boolean|null} + */ /** * @typedef {any} ContextItem @@ -1464,523 +1573,841 @@ class NewError extends Error { */ /** -* @callback EvalCallback -* @param {string} code -* @param {ContextItem} context -* @returns {EvaluatedResult} -*/ + * @callback EvalCallback + * @param {string} code + * @param {ContextItem} context + * @returns {EvaluatedResult} + */ + +/** + * @typedef {new (expr: string) => { + * runInNewContext: (context: object) => EvaluatedResult + * }} ScriptConstructor + */ + +/** + * @typedef {ScriptConstructor} EvalClass + */ + +/** + * @typedef {"value"|"path"|"pointer"|"parent"|"parentProperty" + * |"all"} ResultType + */ + +/** + * @typedef {EvalCallback|EvalClass|'safe'|'native'|boolean} EvalValue + */ + +/** + * @typedef {string|string[]} PathType + */ + +/** + * @typedef {{Script: ScriptConstructor}} SafeScriptType + */ + +/** + * @typedef {{Script: ScriptConstructor}} ScriptType + */ /** - * @typedef {typeof SafeScript} EvalClass + * @typedef {{ + * _$_path?: string, + * _$_parentProperty?: ParentProperty, + * _$_parent?: ParentValue, + * _$_property?: string|number, + * _$_root?: AnyInput, + * _$_v?: unknown, + * [key: string]: SandboxPropertyValue + * }} SandboxType */ /** * @typedef {object} JSONPathOptions - * @property {JSON} json - * @property {string|string[]} path - * @property {"value"|"path"|"pointer"|"parent"|"parentProperty"| - * "all"} [resultType="value"] + * @property {AnyInput} [json] + * @property {PathType} [path] + * @property {ResultType} [resultType="value"] * @property {boolean} [flatten=false] * @property {boolean} [wrap=true] - * @property {object} [sandbox={}] - * @property {EvalCallback|EvalClass|'safe'|'native'| - * boolean} [eval = 'safe'] - * @property {object|GenericArray|null} [parent=null] - * @property {string|null} [parentProperty=null] + * @property {SandboxType} [sandbox={}] + * @property {EvalValue} [eval='safe'] + * @property {any|null} [parent=null] + * @property {ParentProperty} [parentProperty=null] * @property {JSONPathCallback} [callback] * @property {OtherTypeCallback} [otherTypeCallback] Defaults to * function which throws on encountering `@other` * @property {boolean} [autostart=true] + * @property {boolean} [ignoreEvalErrors=false] */ /** - * @param {string|JSONPathOptions} opts If a string, will be treated as `expr` - * @param {string} [expr] JSON path to evaluate - * @param {JSON} [obj] JSON object to evaluate against - * @param {JSONPathCallback} [callback] Passed 3 arguments: 1) desired payload - * per `resultType`, 2) `"value"|"property"`, 3) Full returned object with + * @overload + * @param {string} opts JSON path to evaluate + * @param {AnyInput} [expr] JSON object to evaluate against + * @param {JSONPathCallback} [obj] Passed 3 arguments: 1) desired + * payload per `resultType`, 2) `"value"|"property"`, 3) Full returned + * object with all payloads + * @param {OtherTypeCallback} [callback] If `@other()` is at the + * end of one's query, this will be invoked with the value of the item, + * its path, its parent, and its parent's property name, and it should + * return a boolean indicating whether the supplied value belongs to the + * "other" type or not (or it may handle transformations and return + * `false`). + * @param {undefined} [otherTypeCallback] + * @returns {unknown} The string form always has `autostart` implicitly + * `true`, so the result is the evaluated value, not a `JSONPathClass` + */ +/** + * @overload + * @param {JSONPathOptions & {autostart: false}} opts An options object + * with `autostart` explicitly set to `false` defers evaluation and + * returns the `JSONPathClass` instance instead + * @returns {JSONPathClass} + */ +/** + * @overload + * @param {JSONPathOptions} opts If a string, will be treated as + * `expr` + * @returns {unknown} + */ +/** + * @param {JSONPathOptions|string} opts If a string, will be treated as `expr` + * @param {string|AnyInput} [expr] JSON path to evaluate + * @param {AnyInput|JSONPathCallback} [obj] JSON object to evaluate against + * @param {JSONPathCallback|OtherTypeCallback} [callback] Passed 3 + * arguments: 1) desired payload per `resultType`, + * 2) `"value"|"property"`, 3) Full returned object with * all payloads * @param {OtherTypeCallback} [otherTypeCallback] If `@other()` is at the end * of one's query, this will be invoked with the value of the item, its * path, its parent, and its parent's property name, and it should return * a boolean indicating whether the supplied value belongs to the "other" * type or not (or it may handle transformations and return `false`). - * @returns {JSONPath} - * @class + * @throws {Error} + * @returns {unknown|JSONPathClass} */ function JSONPath(opts, expr, obj, callback, otherTypeCallback) { - // eslint-disable-next-line no-restricted-syntax -- Allow for pseudo-class - if (!(this instanceof JSONPath)) { - try { - return new JSONPath(opts, expr, obj, callback, otherTypeCallback); - } catch (e) { - if (!e.avoidNew) { - throw e; - } - return e.value; + try { + if (opts && typeof opts === 'object') { + return new JSONPathClass(opts); } - } - if (typeof opts === 'string') { - otherTypeCallback = callback; - callback = obj; - obj = expr; - expr = opts; - opts = null; - } - const optObj = opts && typeof opts === 'object'; - opts = opts || {}; - this.json = opts.json || obj; - this.path = opts.path || expr; - this.resultType = opts.resultType || 'value'; - this.flatten = opts.flatten || false; - this.wrap = Object.hasOwn(opts, 'wrap') ? opts.wrap : true; - this.sandbox = opts.sandbox || {}; - this.eval = opts.eval === undefined ? 'safe' : opts.eval; - this.ignoreEvalErrors = typeof opts.ignoreEvalErrors === 'undefined' ? false : opts.ignoreEvalErrors; - this.parent = opts.parent || null; - this.parentProperty = opts.parentProperty || null; - this.callback = opts.callback || callback || null; - this.otherTypeCallback = opts.otherTypeCallback || otherTypeCallback || function () { - throw new TypeError('You must supply an otherTypeCallback callback option ' + 'with the @other() operator.'); - }; - if (opts.autostart !== false) { - const args = { - path: optObj ? opts.path : expr - }; - if (!optObj) { - args.json = obj; - } else if ('json' in opts) { - args.json = opts.json; + return new JSONPathClass(opts, expr, /** @type {JSONPathCallback|undefined} */obj, /** @type {OtherTypeCallback|undefined} */callback, /** @type {undefined} */otherTypeCallback); + } catch (e) { + if (new.target) { + throw e; } - const ret = this.evaluate(args); - if (!ret || typeof ret !== 'object') { - throw new NewError(ret); + if (e && typeof e === 'object' && 'value' in e) { + return /** @type {{value: UnknownResult}} */e.value; } - return ret; + throw e; } } -// PUBLIC METHODS -JSONPath.prototype.evaluate = function (expr, json, callback, otherTypeCallback) { - let currParent = this.parent, - currParentProperty = this.parentProperty; - let { - flatten, - wrap - } = this; - this.currResultType = this.resultType; - this.currEval = this.eval; - this.currSandbox = this.sandbox; - callback = callback || this.callback; - this.currOtherTypeCallback = otherTypeCallback || this.otherTypeCallback; - json = json || this.json; - expr = expr || this.path; - if (expr && typeof expr === 'object' && !Array.isArray(expr)) { - if (!expr.path && expr.path !== '') { - throw new TypeError('You must supply a "path" property when providing an object ' + 'argument to JSONPath.evaluate().'); - } - if (!Object.hasOwn(expr, 'json')) { - throw new TypeError('You must supply a "json" property when providing an object ' + 'argument to JSONPath.evaluate().'); - } - ({ - json - } = expr); - flatten = Object.hasOwn(expr, 'flatten') ? expr.flatten : flatten; - this.currResultType = Object.hasOwn(expr, 'resultType') ? expr.resultType : this.currResultType; - this.currSandbox = Object.hasOwn(expr, 'sandbox') ? expr.sandbox : this.currSandbox; - wrap = Object.hasOwn(expr, 'wrap') ? expr.wrap : wrap; - this.currEval = Object.hasOwn(expr, 'eval') ? expr.eval : this.currEval; - callback = Object.hasOwn(expr, 'callback') ? expr.callback : callback; - this.currOtherTypeCallback = Object.hasOwn(expr, 'otherTypeCallback') ? expr.otherTypeCallback : this.currOtherTypeCallback; - currParent = Object.hasOwn(expr, 'parent') ? expr.parent : currParent; - currParentProperty = Object.hasOwn(expr, 'parentProperty') ? expr.parentProperty : currParentProperty; - expr = expr.path; - } - currParent = currParent || null; - currParentProperty = currParentProperty || null; - if (Array.isArray(expr)) { - expr = JSONPath.toPathString(expr); - } - if (!expr && expr !== '' || !json) { - return undefined; - } - const exprList = JSONPath.toPathArray(expr); - if (exprList[0] === '$' && exprList.length > 1) { - exprList.shift(); - } - this._hasParentSelector = null; - const result = this._trace(exprList, json, ['$'], currParent, currParentProperty, callback).filter(function (ea) { - return ea && !ea.isParentSelector; - }); - if (!result.length) { - return wrap ? [] : undefined; - } - if (!wrap && result.length === 1 && !result[0].hasArrExpr) { - return this._getPreferredOutput(result[0]); +/** + * + */ +class JSONPathClass { + /** + * @overload + * @param {string} opts JSON path to evaluate + * @param {AnyInput} [expr] JSON object to evaluate against + * @param {JSONPathCallback} [obj] Passed 3 arguments: 1) desired + * payload per `resultType`, 2) `"value"|"property"`, 3) Full returned + * object with all payloads + * @param {OtherTypeCallback} [callback] If `@other()` is at the + * end of one's query, this will be invoked with the value of the item, + * its path, its parent, and its parent's property name, and it should + * return a boolean indicating whether the supplied value belongs to the + * "other" type or not (or it may handle transformations and return + * `false`). + * @param {undefined} [otherTypeCallback] + */ + /** + * @overload + * @param {JSONPathOptions} opts If a string, will be treated as + * `expr` + */ + /** + * @param {null|string|JSONPathOptions} opts If a string, will be treated as + * `expr` + * @param {string|AnyInput} [expr] JSON path to evaluate + * @param {AnyInput|JSONPathCallback} [obj] JSON object to evaluate against + * @param {JSONPathCallback|OtherTypeCallback} [callback] Passed 3 + * arguments: 1) desired payload per `resultType`, + * 2) `"value"|"property"`, 3) Full returned + * object with all payloads + * @param {OtherTypeCallback} [otherTypeCallback] If `@other()` is at the + * end of one's query, this will be invoked with the value of the item, + * its path, its parent, and its parent's property name, and it should + * return a boolean indicating whether the supplied value belongs to the + * "other" type or not (or it may handle transformations and return + * `false`). + */ + constructor(opts, expr, obj, callback, otherTypeCallback) { + if (typeof opts === 'string') { + otherTypeCallback = /** @type {OtherTypeCallback} */ + callback; + callback = /** @type {JSONPathCallback} */ + obj; + obj = expr; + expr = opts; + opts = null; + } + const optObj = opts && typeof opts === 'object'; + opts ||= /** @type {JSONPathOptions} */{}; + /** @type {ResultType|undefined} */ + this.currResultType = undefined; + + /** @type {EvalValue|undefined} */ + this.currEval = undefined; + + /** @type {OtherTypeCallback|undefined} */ + this.currOtherTypeCallback = undefined; + + /** @type {SandboxType|undefined} */ + this.currSandbox = undefined; + this._hasParentSelector = false; + this.json = opts.json || obj; + this.path = opts.path || expr; + this.resultType = opts.resultType || 'value'; + this.flatten = Object.hasOwn(opts, 'flatten') ? opts.flatten : false; + this.wrap = Object.hasOwn(opts, 'wrap') ? opts.wrap : true; + this.sandbox = opts.sandbox || {}; + this.eval = opts.eval === undefined ? 'safe' : opts.eval; + this.ignoreEvalErrors = typeof opts.ignoreEvalErrors === 'undefined' ? false : opts.ignoreEvalErrors; + this.parent = Object.hasOwn(opts, 'parent') ? opts.parent : null; + this.parentProperty = Object.hasOwn(opts, 'parentProperty') ? opts.parentProperty : null; + this.callback = opts.callback || (/** @type {JSONPathCallback} */ + callback) || null; + this.otherTypeCallback = opts.otherTypeCallback || otherTypeCallback || function () { + throw new TypeError('You must supply an otherTypeCallback callback option ' + 'with the @other() operator.'); + }; + if (opts.autostart !== false) { + const args = /** @type {JSONPathOptions} */{ + path: optObj ? opts.path : expr + }; + if (!optObj && obj !== undefined) { + args.json = obj; + } else if ('json' in opts) { + args.json = opts.json; + } + const ret = this.evaluate(args); + if (!ret || typeof ret !== 'object') { + const err = /** @type {Error & {value: UnknownResult}} */ + new Error('JSONPath should not be called with "new" (it ' + 'prevents return of (unwrapped) scalar values)'); + err.value = ret; + throw err; + } + + // eslint-disable-next-line @stylistic/max-len -- Long + // @ts-expect-error - Constructor returns evaluate result for legacy API + // eslint-disable-next-line no-constructor-return -- Legacy API + return ret; + } } - return result.reduce((rslt, ea) => { - const valOrPath = this._getPreferredOutput(ea); - if (flatten && Array.isArray(valOrPath)) { - rslt = rslt.concat(valOrPath); + + // PUBLIC METHODS + + /** + * @overload + * @param {JSONPathOptions} [expr] + * @returns {ReturnObject|ReturnObject[]|undefined|unknown} + */ + + /** + * @overload + * @param {PathType|undefined} [expr] + * @param {AnyInput} [json] + * @param {JSONPathCallback|null} [callback] + * @param {OtherTypeCallback} [otherTypeCallback] + * @returns {ReturnObject|ReturnObject[]|undefined|unknown} + */ + + /** + * @param {PathType|JSONPathOptions|undefined} [expr] + * @param {AnyInput} [json] + * @param {JSONPathCallback|null} [callback] + * @param {OtherTypeCallback} [otherTypeCallback] + * @returns {ReturnObject|ReturnObject[]|undefined|unknown} + */ + evaluate(expr, json, callback, otherTypeCallback) { + let currParent = this.parent, + currParentProperty = this.parentProperty; + let { + flatten, + wrap + } = this; + this.currResultType = this.resultType; + this.currEval = this.eval; + this.currSandbox = this.sandbox; + callback ||= this.callback; + this.currOtherTypeCallback = otherTypeCallback || this.otherTypeCallback; + if (expr && typeof expr === 'object' && !Array.isArray(expr)) { + const exprObj = expr; + if (!exprObj.path && exprObj.path !== '') { + throw new TypeError('You must supply a "path" property when providing an ' + 'object argument to JSONPath.evaluate().'); + } + if (!Object.hasOwn(exprObj, 'json')) { + throw new TypeError('You must supply a "json" property when providing an ' + 'object argument to JSONPath.evaluate().'); + } + ({ + json + } = exprObj); + flatten = Object.hasOwn(exprObj, 'flatten') ? exprObj.flatten : flatten; + this.currResultType = Object.hasOwn(exprObj, 'resultType') ? exprObj.resultType : this.currResultType; + this.currSandbox = Object.hasOwn(exprObj, 'sandbox') ? exprObj.sandbox : this.currSandbox; + wrap = Object.hasOwn(exprObj, 'wrap') ? exprObj.wrap : wrap; + this.currEval = Object.hasOwn(exprObj, 'eval') ? exprObj.eval : this.currEval; + callback = Object.hasOwn(exprObj, 'callback') ? exprObj.callback : callback; + this.currOtherTypeCallback = Object.hasOwn(exprObj, 'otherTypeCallback') ? exprObj.otherTypeCallback : this.currOtherTypeCallback; + currParent = Object.hasOwn(exprObj, 'parent') ? exprObj.parent : currParent; + currParentProperty = Object.hasOwn(exprObj, 'parentProperty') ? exprObj.parentProperty : currParentProperty; + expr = exprObj.path; } else { - rslt.push(valOrPath); + json ||= this.json; + expr ||= this.path; } - return rslt; - }, []); -}; + currParent ||= null; + currParentProperty ||= null; + if (Array.isArray(expr)) { + expr = JSONPath.toPathString(expr); + } + if (!json || !expr && expr !== '') { + return undefined; + } + const exprList = JSONPath.toPathArray(/** @type {string} */ + expr); + if (exprList[0] === '$' && exprList.length > 1) { + exprList.shift(); + } + this._hasParentSelector = false; + const traceResult = this._trace(exprList, json, ['$'], currParent, currParentProperty, callback ?? undefined, undefined); -// PRIVATE METHODS - -JSONPath.prototype._getPreferredOutput = function (ea) { - const resultType = this.currResultType; - switch (resultType) { - case 'all': - { - const path = Array.isArray(ea.path) ? ea.path : JSONPath.toPathArray(ea.path); - ea.pointer = JSONPath.toPointer(path); - ea.path = typeof ea.path === 'string' ? ea.path : JSONPath.toPathString(ea.path); - return ea; + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next 2 -- Unreachable: _trace returns array when hasArrExpr set */ + const result = (Array.isArray(traceResult) ? traceResult : [traceResult]).filter(ea => { + return ea && !ea.isParentSelector; + }); + if (!result.length) { + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next -- Unreachable: valid queries always produce results */ + return wrap ? [] : undefined; + } + if (!wrap && result.length === 1 && !result[0].hasArrExpr) { + const preferredOutput = this._getPreferredOutput(result[0]); + return preferredOutput; + } + const reduced = result.reduce((rslt, ea) => { + const valOrPath = this._getPreferredOutput(ea); + if (flatten && Array.isArray(valOrPath)) { + rslt = rslt.concat(valOrPath); + } else { + rslt.push(valOrPath); } - case 'value': - case 'parent': - case 'parentProperty': - return ea[resultType]; - case 'path': - return JSONPath.toPathString(ea[resultType]); - case 'pointer': - return JSONPath.toPointer(ea.path); - default: - throw new TypeError('Unknown result type'); - } -}; -JSONPath.prototype._handleCallback = function (fullRetObj, callback, type) { - if (callback) { - const preferredOutput = this._getPreferredOutput(fullRetObj); - fullRetObj.path = typeof fullRetObj.path === 'string' ? fullRetObj.path : JSONPath.toPathString(fullRetObj.path); - // eslint-disable-next-line n/callback-return -- No need to return - callback(preferredOutput, type, fullRetObj); + return rslt; + }, /** @type {UnknownResult[]} */ + []); + return reduced; } -}; -/** - * - * @param {string} expr - * @param {JSONObject} val - * @param {string} path - * @param {object|GenericArray} parent - * @param {string} parentPropName - * @param {JSONPathCallback} callback - * @param {boolean} hasArrExpr - * @param {boolean} literalPriority - * @returns {ReturnObject|ReturnObject[]} - */ -JSONPath.prototype._trace = function (expr, val, path, parent, parentPropName, callback, hasArrExpr, literalPriority) { - // No expr to follow? return path and value as the result of - // this trace branch - let retObj; - if (!expr.length) { - retObj = { - path, - value: val, - parent, - parentProperty: parentPropName, - hasArrExpr - }; - this._handleCallback(retObj, callback, 'value'); - return retObj; + // PRIVATE METHODS + + /** + * @param {ReturnObject} ea + * @returns {PreferredOutput} + */ + _getPreferredOutput(ea) { + const resultType = this.currResultType; + switch (resultType) { + case 'all': + { + const path = Array.isArray(ea.path) ? ea.path : JSONPath.toPathArray(ea.path); + ea.pointer = JSONPath.toPointer(/** @type {string[]} */path); + ea.path = typeof ea.path === 'string' ? ea.path : JSONPath.toPathString(/** @type {string[]} */ea.path); + return ea; + } + case 'value': + case 'parent': + case 'parentProperty': + return /** @type {PreferredOutput} */ea[resultType]; + case 'path': + if (typeof ea.path === 'string') { + return ea.path; + } + return JSONPath.toPathString(/** @type {string[]} */ea.path); + case 'pointer': + { + const pathArray = Array.isArray(ea.path) ? ea.path : JSONPath.toPathArray(ea.path); + return JSONPath.toPointer(/** @type {string[]} */pathArray); + } + default: + throw new TypeError('Unknown result type'); + } } - const loc = expr[0], - x = expr.slice(1); - // We need to gather the return value of recursive trace calls in order to - // do the parent sel computation. - const ret = []; /** - * - * @param {ReturnObject|ReturnObject[]} elems + * @param {ReturnObject} fullRetObj + * @param {JSONPathCallback|undefined} callback + * @param {"value"|"property"} type * @returns {void} */ - function addRet(elems) { - if (Array.isArray(elems)) { - // This was causing excessive stack size in Node (with or - // without Babel) against our performance test: - // `ret.push(...elems);` - elems.forEach(t => { - ret.push(t); - }); - } else { - ret.push(elems); + _handleCallback(fullRetObj, callback, type) { + // Early return if no callback provided (defensive + // check for internal calls) + if (!callback) { + return; + } + const preferredOutput = this._getPreferredOutput(fullRetObj); + if (Array.isArray(fullRetObj.path)) { + fullRetObj.path = JSONPath.toPathString(/** @type {string[]} */fullRetObj.path); } + callback(preferredOutput, type, fullRetObj); } - if ((typeof loc !== 'string' || literalPriority) && val && Object.hasOwn(val, loc)) { - // simple case--directly follow property - addRet(this._trace(x, val[loc], push(path, loc), val, loc, callback, hasArrExpr)); - // eslint-disable-next-line unicorn/prefer-switch -- Part of larger `if` - } else if (loc === '*') { - // all child properties - this._walk(val, m => { - addRet(this._trace(x, val[m], push(path, m), val, m, callback, true, true)); - }); - } else if (loc === '..') { - // all descendent parent properties - // Check remaining expression with val's immediate children - addRet(this._trace(x, val, path, parent, parentPropName, callback, hasArrExpr)); - this._walk(val, m => { - // We don't join m and x here because we only want parents, - // not scalar values - if (typeof val[m] === 'object') { - // Keep going with recursive descent on val's - // object children - addRet(this._trace(expr.slice(), val[m], push(path, m), val, m, callback, true)); + + /** + * + * @param {ExpressionArray} expr + * @param {unknown} val + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {ParentProperty} parentPropName + * @param {JSONPathCallback|undefined} callback + * @param {boolean|undefined} hasArrExpr + * @param {boolean} [literalPriority] + * @returns {ReturnObject|ReturnObject[]} + */ + _trace(expr, val, path, parent, parentPropName, callback, hasArrExpr, literalPriority) { + // No expr to follow? return path and value as the result of + // this trace branch + let retObj; + if (!expr.length) { + retObj = { + path, + value: val, + parent, + parentProperty: parentPropName, + hasArrExpr + }; + this._handleCallback(retObj, callback, 'value'); + return retObj; + } + const loc = /** @type {string} */expr[0], + x = expr.slice(1); + + // We need to gather the return value of recursive trace calls in order + // to do the parent sel computation. + /** @type {ReturnObject[]} */ + const ret = []; + /** + * + * @param {ReturnObject|ReturnObject[]} elems + * @returns {void} + */ + function addRet(elems) { + if (Array.isArray(elems)) { + // This was causing excessive stack size in Node (with or + // without Babel) against our performance test: + // `ret.push(...elems);` + elems.forEach(t => { + ret.push(t); + }); + } else { + ret.push(elems); } - }); - // The parent sel computation is handled in the frame above using the - // ancestor object of val - } else if (loc === '^') { - // This is not a final endpoint, so we do not invoke the callback here - this._hasParentSelector = true; - return { - path: path.slice(0, -1), - expr: x, - isParentSelector: true - }; - } else if (loc === '~') { - // property name - retObj = { - path: push(path, loc), - value: parentPropName, - parent, - parentProperty: null - }; - this._handleCallback(retObj, callback, 'property'); - return retObj; - } else if (loc === '$') { - // root only - addRet(this._trace(x, val, path, null, null, callback, hasArrExpr)); - } else if (/^(-?\d*):(-?\d*):?(\d*)$/u.test(loc)) { - // [start:end:step] Python slice syntax - addRet(this._slice(loc, x, val, path, parent, parentPropName, callback)); - } else if (loc.indexOf('?(') === 0) { - // [?(expr)] (filtering) - if (this.currEval === false) { - throw new Error('Eval [?(expr)] prevented in JSONPath expression.'); - } - const safeLoc = loc.replace(/^\?\((.*?)\)$/u, '$1'); - // check for a nested filter expression - const nested = /@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu.exec(safeLoc); - if (nested) { - // find if there are matches in the nested expression - // add them to the result set if there is at least one match + } + if (val && (typeof loc !== 'string' || literalPriority) && Object.hasOwn(val, /** @type {PropertyKey} */loc)) { + // simple case--directly follow property + const valObj = /** @type {Record} */val; + addRet(this._trace(x, valObj[(/** @type {string} */loc)], push(path, loc), val, /** @type {string|number} */loc, callback, hasArrExpr)); + // eslint-disable-next-line unicorn/prefer-switch -- Part of larger `if` + } else if (loc === '*') { + // all child properties this._walk(val, m => { - const npath = [nested[2]]; - const nvalue = nested[1] ? val[m][nested[1]] : val[m]; - const filterResults = this._trace(npath, nvalue, path, parent, parentPropName, callback, true); - if (filterResults.length > 0) { - addRet(this._trace(x, val[m], push(path, m), val, m, callback, true)); - } + const valObj = /** @type {Record} */val; + addRet(this._trace(x, valObj[m], push(path, m), val, m, callback, true, true)); }); - } else { + } else if (loc === '..') { + // all descendent parent properties + // Check remaining expression with val's immediate children + addRet(this._trace(x, val, path, parent, parentPropName, callback, hasArrExpr)); this._walk(val, m => { - if (this._eval(safeLoc, val[m], m, path, parent, parentPropName)) { - addRet(this._trace(x, val[m], push(path, m), val, m, callback, true)); + // We don't join m and x here because we only want parents, + // not scalar values + const valObj = /** @type {Record} */val; + if (typeof valObj[m] === 'object') { + // Keep going with recursive descent on val's + // object children + addRet(this._trace(expr.slice(), valObj[m], push(path, m), val, m, callback, true)); } }); - } - } else if (loc[0] === '(') { - // [(expr)] (dynamic property/index) - if (this.currEval === false) { - throw new Error('Eval [(expr)] prevented in JSONPath expression.'); - } - // As this will resolve to a property name (but we don't know it - // yet), property and parent information is relative to the - // parent of the property to which this expression will resolve - addRet(this._trace(unshift(this._eval(loc, val, path.at(-1), path.slice(0, -1), parent, parentPropName), x), val, path, parent, parentPropName, callback, hasArrExpr)); - } else if (loc[0] === '@') { - // value type: @boolean(), etc. - let addType = false; - const valueType = loc.slice(1, -2); - switch (valueType) { - case 'scalar': - if (!val || !['object', 'function'].includes(typeof val)) { - addType = true; - } - break; - case 'boolean': - case 'string': - case 'undefined': - case 'function': - if (typeof val === valueType) { - addType = true; - } - break; - case 'integer': - if (Number.isFinite(val) && !(val % 1)) { - addType = true; - } - break; - case 'number': - if (Number.isFinite(val)) { - addType = true; - } - break; - case 'nonFinite': - if (typeof val === 'number' && !Number.isFinite(val)) { - addType = true; - } - break; - case 'object': - if (val && typeof val === valueType) { - addType = true; - } - break; - case 'array': - if (Array.isArray(val)) { - addType = true; - } - break; - case 'other': - addType = this.currOtherTypeCallback(val, path, parent, parentPropName); - break; - case 'null': - if (val === null) { - addType = true; - } - break; - /* c8 ignore next 2 */ - default: - throw new TypeError('Unknown value type ' + valueType); - } - if (addType) { + // The parent sel computation is handled in the frame above using the + // ancestor object of val + } else if (loc === '^') { + // This is not a final endpoint, so we do not invoke the + // callback here + this._hasParentSelector = true; + return /** @type {ReturnObject} */{ + path: path.slice(0, -1), + expr: x, + isParentSelector: true, + value: undefined, + parent: undefined, + parentProperty: null + }; + } else if (loc === '~') { + // property name retObj = { - path, - value: val, + path: push(path, loc), + value: parentPropName, parent, - parentProperty: parentPropName + parentProperty: null }; - this._handleCallback(retObj, callback, 'value'); + this._handleCallback(retObj, callback, 'property'); return retObj; + } else if (loc === '$') { + // root only + addRet(this._trace(x, val, path, null, null, callback, hasArrExpr)); + } else if (/^(-?\d*):(-?\d*):?(\d*)$/u.test(loc)) { + // [start:end:step] Python slice syntax + const sliceResult = this._slice(loc, x, val, path, parent, parentPropName, callback); + if (sliceResult) { + addRet(sliceResult); + } + } else if (loc.indexOf('?(') === 0) { + // [?(expr)] (filtering) + if (this.currEval === false) { + throw new Error('Eval [?(expr)] prevented in JSONPath expression.'); + } + const safeLoc = loc.replace(/^\?\((.*?)\)$/u, '$1'); + // check for a nested filter expression + + const nested = /@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu.exec(safeLoc); + if (nested) { + // find if there are matches in the nested expression + // add them to the result set if there is at least one match + this._walk(val, m => { + const npath = [nested[2]]; + const valObj2 = /** @type {Record} */ + val; + const nvalue = /** @type {ValueType} */nested[1] ? /** @type {Record} */valObj2[m][nested[1]] : valObj2[m]; + const filterResults = this._trace(npath, nvalue, path, parent, parentPropName, callback, true); + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next 3 -- Unreachable: _trace always returns array for nested filters */ + const filterArray = Array.isArray(filterResults) ? filterResults : [filterResults]; + if (filterArray.length > 0) { + addRet(this._trace(x, valObj2[m], push(path, m), val, m, callback, true)); + } + }); + } else { + const valObj3 = /** @type {Record} */val; + this._walk(val, m => { + if (this._eval(safeLoc, valObj3[m], m, path, parent, parentPropName)) { + addRet(this._trace(x, valObj3[m], push(path, m), val, m, callback, true)); + } + }); + } + } else if (loc[0] === '(') { + // [(expr)] (dynamic property/index) + if (this.currEval === false) { + throw new Error('Eval [(expr)] prevented in JSONPath expression.'); + } + // As this will resolve to a property name (but we don't know it + // yet), property and parent information is relative to the + const evalResult = this._eval(/** @type {string} */loc, val, /** @type {string|number} */path.at(-1), path.slice(0, -1), parent, parentPropName); + const exprToUse = /** @type {string|number} */ + evalResult !== undefined ? evalResult : ''; + addRet(this._trace(unshift(exprToUse, x), val, path, parent, parentPropName, callback, hasArrExpr)); + } else if (loc[0] === '@') { + // value type: @boolean(), etc. + let addType = false; + const valueType = /** @type {ValueType} */loc.slice(1, -2); + switch (valueType) { + case 'scalar': + if (!val || !['object', 'function'].includes(typeof val)) { + addType = true; + } + break; + case 'boolean': + case 'string': + case 'undefined': + case 'function': + if (typeof val === valueType) { + addType = true; + } + break; + case 'integer': + if (Number.isFinite(val) && !(/** @type {number} */val % 1)) { + addType = true; + } + break; + case 'number': + if (Number.isFinite(val)) { + addType = true; + } + break; + case 'nonFinite': + if (typeof val === 'number' && !Number.isFinite(val)) { + addType = true; + } + break; + case 'object': + if (val && typeof val === valueType) { + addType = true; + } + break; + case 'array': + if (Array.isArray(val)) { + addType = true; + } + break; + case 'other': + addType = this.currOtherTypeCallback?.(val, path, parent, /** @type {string|null} */parentPropName) ?? false; + break; + case 'null': + if (val === null) { + addType = true; + } + break; + /* c8 ignore next 2 */ + default: + throw new TypeError('Unknown value type ' + valueType); + } + if (addType) { + retObj = { + path, + value: val, + parent, + parentProperty: parentPropName + }; + this._handleCallback(retObj, callback, 'value'); + return retObj; + } + // `-escaped property + } else if (val && loc[0] === '`' && Object.hasOwn(val, loc.slice(1))) { + const locProp = loc.slice(1); + const valObj = /** @type {Record} */val; + addRet(this._trace(x, valObj[locProp], push(path, locProp), val, locProp, callback, hasArrExpr, true)); + } else if (loc.includes(',')) { + // [name1,name2,...] + const parts = loc.split(','); + for (const part of parts) { + addRet(this._trace(unshift(part, x), val, path, parent, parentPropName, callback, true)); + } + // simple case--directly follow property + } else if (!literalPriority && val && Object.hasOwn(val, loc)) { + const valObj = /** @type {Record} */val; + addRet(this._trace(x, valObj[loc], push(path, loc), val, loc, callback, hasArrExpr, true)); } - // `-escaped property - } else if (loc[0] === '`' && val && Object.hasOwn(val, loc.slice(1))) { - const locProp = loc.slice(1); - addRet(this._trace(x, val[locProp], push(path, locProp), val, locProp, callback, hasArrExpr, true)); - } else if (loc.includes(',')) { - // [name1,name2,...] - const parts = loc.split(','); - for (const part of parts) { - addRet(this._trace(unshift(part, x), val, path, parent, parentPropName, callback, true)); - } - // simple case--directly follow property - } else if (!literalPriority && val && Object.hasOwn(val, loc)) { - addRet(this._trace(x, val[loc], push(path, loc), val, loc, callback, hasArrExpr, true)); - } - // We check the resulting values for parent selections. For parent - // selections we discard the value object and continue the trace with the - // current val object - if (this._hasParentSelector) { - for (let t = 0; t < ret.length; t++) { - const rett = ret[t]; - if (rett && rett.isParentSelector) { - const tmp = this._trace(rett.expr, val, rett.path, parent, parentPropName, callback, hasArrExpr); - if (Array.isArray(tmp)) { - ret[t] = tmp[0]; - const tl = tmp.length; - for (let tt = 1; tt < tl; tt++) { - // eslint-disable-next-line @stylistic/max-len -- Long - // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient - t++; - ret.splice(t, 0, tmp[tt]); + // We check the resulting values for parent selections. For parent + // selections we discard the value object and continue the trace with + // the current val object + if (this._hasParentSelector) { + for (let t = 0; t < ret.length; t++) { + const rett = ret[t]; + if (rett && rett.isParentSelector) { + const exprToUse = /** @type {ExpressionArray} */ + rett.expr; + const pathToUse = /** @type {ExpressionArray} */ + rett.path; + const tmp = this._trace(exprToUse, val, pathToUse, parent, parentPropName, callback, hasArrExpr); + if (Array.isArray(tmp)) { + ret[t] = tmp[0]; + const tl = tmp.length; + for (let tt = 1; tt < tl; tt++) { + t++; + ret.splice(t, 0, tmp[tt]); + } + } else { + ret[t] = tmp; } - } else { - ret[t] = tmp; } } } + return ret; } - return ret; -}; -JSONPath.prototype._walk = function (val, f) { - if (Array.isArray(val)) { - const n = val.length; - for (let i = 0; i < n; i++) { - f(i); - } - } else if (val && typeof val === 'object') { - Object.keys(val).forEach(m => { - f(m); - }); - } -}; -JSONPath.prototype._slice = function (loc, expr, val, path, parent, parentPropName, callback) { - if (!Array.isArray(val)) { - return undefined; - } - const len = val.length, - parts = loc.split(':'), - step = parts[2] && Number.parseInt(parts[2]) || 1; - let start = parts[0] && Number.parseInt(parts[0]) || 0, - end = parts[1] ? Number.parseInt(parts[1]) : len; - start = start < 0 ? Math.max(0, start + len) : Math.min(len, start); - end = end < 0 ? Math.max(0, end + len) : Math.min(len, end); - const ret = []; - for (let i = start; i < end; i += step) { - const tmp = this._trace(unshift(i, expr), val, path, parent, parentPropName, callback, true); - // Should only be possible to be an array here since first part of - // ``unshift(i, expr)` passed in above would not be empty, nor `~`, - // nor begin with `@` (as could return objects) - // This was causing excessive stack size in Node (with or - // without Babel) against our performance test: `ret.push(...tmp);` - tmp.forEach(t => { - ret.push(t); - }); + + /** + * @param {unknown} val + * @param {(prop: string|number) => void} f + * @returns {void} + */ + _walk(val, f) { + if (Array.isArray(val)) { + const n = val.length; + for (let i = 0; i < n; i++) { + f(i); + } + } else if (val && typeof val === 'object') { + Object.keys(val).forEach(m => { + f(m); + }); + } } - return ret; -}; -JSONPath.prototype._eval = function (code, _v, _vname, path, parent, parentPropName) { - this.currSandbox._$_parentProperty = parentPropName; - this.currSandbox._$_parent = parent; - this.currSandbox._$_property = _vname; - this.currSandbox._$_root = this.json; - this.currSandbox._$_v = _v; - const containsPath = code.includes('@path'); - if (containsPath) { - this.currSandbox._$_path = JSONPath.toPathString(path.concat([_vname])); + + /** + * @param {string} loc + * @param {ExpressionArray} expr + * @param {unknown} val + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {ParentProperty} parentPropName + * @param {JSONPathCallback|undefined} callback + * @returns {ReturnObject[]|undefined} + */ + _slice(loc, expr, val, path, parent, parentPropName, callback) { + if (!Array.isArray(val)) { + return undefined; + } + const len = val.length, + parts = loc.split(':'), + step = parts[2] && Number(parts[2]) || 1; + let start = parts[0] && Number(parts[0]) || 0, + end = parts[1] ? Number(parts[1]) : len; + start = start < 0 ? Math.max(0, start + len) : Math.min(len, start); + end = end < 0 ? Math.max(0, end + len) : Math.min(len, end); + /** @type {ReturnObject[]} */ + const ret = []; + for (let i = start; i < end; i += step) { + const tmp = this._trace(unshift(i, expr), val, path, parent, parentPropName, callback, true); + // Should only be possible to be an array here since first part of + // ``unshift(i, expr)` passed in above would not be empty, + // nor `~`, nor begin with `@` (as could return objects) + // This was causing excessive stack size in Node (with or + // without Babel) against our performance test: `ret.push(...tmp);` + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next -- Unreachable: _trace returns array when expr non-empty */ + const tmpArray = Array.isArray(tmp) ? tmp : [tmp]; + tmpArray.forEach(t => { + ret.push(t); + }); + } + return ret; } - const scriptCacheKey = this.currEval + 'Script:' + code; - if (!JSONPath.cache[scriptCacheKey]) { - let script = code.replaceAll('@parentProperty', '_$_parentProperty').replaceAll('@parent', '_$_parent').replaceAll('@property', '_$_property').replaceAll('@root', '_$_root').replaceAll(/@([.\s)[])/gu, '_$_v$1'); + + /** + * @param {string} code + * @param {unknown} _v + * @param {string|number} _vname + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {ParentProperty} parentPropName + * @returns {UnknownResult} + */ + _eval(code, _v, _vname, path, parent, parentPropName) { + if (this.currSandbox) { + this.currSandbox._$_parentProperty = parentPropName; + this.currSandbox._$_parent = parent; + this.currSandbox._$_property = _vname; + this.currSandbox._$_root = this.json; + this.currSandbox._$_v = _v; + } + const containsPath = code.includes('@path'); if (containsPath) { - script = script.replaceAll('@path', '_$_path'); - } - if (this.currEval === 'safe' || this.currEval === true || this.currEval === undefined) { - JSONPath.cache[scriptCacheKey] = new this.safeVm.Script(script); - } else if (this.currEval === 'native') { - JSONPath.cache[scriptCacheKey] = new this.vm.Script(script); - } else if (typeof this.currEval === 'function' && this.currEval.prototype && Object.hasOwn(this.currEval.prototype, 'runInNewContext')) { - const CurrEval = this.currEval; - JSONPath.cache[scriptCacheKey] = new CurrEval(script); - } else if (typeof this.currEval === 'function') { - JSONPath.cache[scriptCacheKey] = { - runInNewContext: context => this.currEval(script, context) - }; - } else { - throw new TypeError(`Unknown "eval" property "${this.currEval}"`); + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next -- Unreachable: currSandbox set in evaluate() before _eval */ + const currSandbox = this.currSandbox ?? {}; + currSandbox._$_path = JSONPath.toPathString(/** @type {string[]} */path.concat([_vname])); } - } - try { - return JSONPath.cache[scriptCacheKey].runInNewContext(this.currSandbox); - } catch (e) { - if (this.ignoreEvalErrors) { - return false; + const scriptCacheKey = this.currEval + 'Script:' + code; + if (!Object.hasOwn(JSONPath.cache, scriptCacheKey)) { + let script = code.replaceAll('@parentProperty', '_$_parentProperty').replaceAll('@parent', '_$_parent').replaceAll('@property', '_$_property').replaceAll('@root', '_$_root').replaceAll(/@([.\s)[])/gu, '_$_v$1'); + if (containsPath) { + script = script.replaceAll('@path', '_$_path'); + } + const evalType = /** @type {string|boolean|undefined} */ + this.currEval; + if (['safe', true, undefined].includes(evalType)) { + const { + cache + } = JSONPath; + // eslint-disable-next-line @stylistic/max-len -- Long + /* eslint-disable unicorn/no-undeclared-class-members -- Prototype members */ + cache[scriptCacheKey] = new ( + /** + * @type {JSONPathClass & { + * safeVm: SafeScriptType, + * vm: ScriptType + * }} + */ /** @type {unknown} */ + this).safeVm.Script(script); + // eslint-disable-next-line @stylistic/max-len -- Long + /* eslint-enable unicorn/no-undeclared-class-members -- End prototype member scope */ + } else if (this.currEval === 'native') { + const { + cache + } = JSONPath; + // eslint-disable-next-line @stylistic/max-len -- Long + /* eslint-disable unicorn/no-undeclared-class-members -- Prototype members */ + cache[scriptCacheKey] = new ( + /** + * @type {JSONPathClass & { + * safeVm: SafeScriptType, + * vm: ScriptType + * }} + */ /** @type {unknown} */ + this).vm.Script(script); + // eslint-disable-next-line @stylistic/max-len -- Long + /* eslint-enable unicorn/no-undeclared-class-members -- End prototype member scope */ + } else if (typeof this.currEval === 'function' && this.currEval.prototype && Object.hasOwn(this.currEval.prototype, 'runInNewContext')) { + const CurrEval = this.currEval; + const { + cache + } = JSONPath; + // eslint-disable-next-line @stylistic/max-len -- Long + // @ts-expect-error - Type checked above to have proper constructor + cache[scriptCacheKey] = new CurrEval(script); + } else if (typeof this.currEval === 'function') { + const { + cache + } = JSONPath; + // Type narrowing: at this point currEval is a function + // but not a constructor + const evalFunc = /** @type {EvalCallback} */this.currEval; + cache[scriptCacheKey] = { + runInNewContext: (/** @type {ContextItem} */context) => evalFunc(script, context) + }; + } else { + throw new TypeError(`Unknown "eval" property "${this.currEval}"`); + } + } + try { + const { + cache + } = JSONPath; + + /** + * @typedef {{ + * runInNewContext: ( + * ctx: SandboxType|undefined + * ) => EvaluatedResult + * }} RunInNewContext + */ + + return /** @type {RunInNewContext} */cache[scriptCacheKey].runInNewContext(this.currSandbox); + } catch (e) { + if (this.ignoreEvalErrors) { + return false; + } + const error = /** @type {Error} */e; + throw new Error('jsonPath: ' + error.message + ': ' + code, { + cause: e + }); } - throw new Error('jsonPath: ' + e.message + ': ' + code); } +} + +/** @type {{safeVm: SafeScriptType}} */ +(/** @type {unknown} */JSONPathClass.prototype).safeVm = { + Script: SafeScript }; +JSONPath.prototype = JSONPathClass.prototype; // PUBLIC CLASS PROPERTIES AND METHODS // Could store the cache object itself + +/** @type {Record} */ JSONPath.cache = {}; /** @@ -2000,7 +2427,7 @@ JSONPath.toPathString = function (pathArr) { }; /** - * @param {string} pointer JSON Path + * @param {string[]} pointer JSON Path array * @returns {string} JSON Pointer */ JSONPath.toPointer = function (pointer) { @@ -2023,9 +2450,10 @@ JSONPath.toPathArray = function (expr) { const { cache } = JSONPath; - if (cache[expr]) { - return cache[expr].concat(); + if (Object.hasOwn(cache, expr)) { + return /** @type {string[]} */cache[expr].concat(); } + /** @type {string[]} */ const subx = []; const normalized = expr // Properties @@ -2033,7 +2461,10 @@ JSONPath.toPathArray = function (expr) { // Parenthetical evaluations (filtering and otherwise), directly // within brackets or single quotes .replaceAll(/[['](\??\(.*?\))[\]'](?!.\])/gu, function ($0, $1) { - return '[#' + (subx.push($1) - 1) + ']'; + return '[#' + ( + // eslint-disable-next-line @stylistic/max-len -- Long + // eslint-disable-next-line unicorn/no-return-array-push -- Optimization + subx.push($1) - 1) + ']'; }) // Escape periods and tildes within properties .replaceAll(/\[['"]([^'\]]*)['"]\]/gu, function ($0, prop) { @@ -2057,15 +2488,87 @@ JSONPath.toPathArray = function (expr) { .replaceAll(/;$|'?\]|'$/gu, ''); const exprList = normalized.split(';').map(function (exp) { const match = exp.match(/#(\d+)/u); - return !match || !match[1] ? exp : subx[match[1]]; + return !match || !match[1] ? exp : subx[Number(match[1])]; }); cache[expr] = exprList; - return cache[expr].concat(); -}; -JSONPath.prototype.safeVm = { - Script: SafeScript + return /** @type {string[]} */cache[expr].concat(); }; -JSONPath.prototype.vm = vm; +/** + * @typedef {import('./jsonpath.js').AnyInput} AnyInput + */ +/** + * @typedef {import('./jsonpath.js').SandboxCallback} SandboxCallback + */ +/** + * @typedef {import('./jsonpath.js').SandboxPropertyValue} SandboxPropertyValue + */ +/** + * @typedef {import('./jsonpath.js').ExpressionArray} ExpressionArray + */ +/** + * @typedef {import('./jsonpath.js').ValueType} ValueType + */ +/** + * @typedef {import('./jsonpath.js').ParentValue} ParentValue + */ +/** + * @typedef {import('./jsonpath.js').UnknownResult} UnknownResult + */ +/** + * @typedef {import('./jsonpath.js').ParentProperty} ParentProperty + */ +/** + * @typedef {import('./jsonpath.js').PreferredOutput} PreferredOutput + */ +/** + * @typedef {import('./jsonpath.js').ReturnObject} ReturnObject + */ +/** + * @typedef {import('./jsonpath.js').JSONPathCallback} JSONPathCallback + */ +/** + * @typedef {import('./jsonpath.js').OtherTypeCallback} OtherTypeCallback + */ +/** + * @typedef {import('./jsonpath.js').ContextItem} ContextItem + */ +/** + * @typedef {import('./jsonpath.js').EvaluatedResult} EvaluatedResult + */ +/** + * @typedef {import('./jsonpath.js').EvalCallback} EvalCallback + */ +/** + * @typedef {import('./jsonpath.js').EvalClass} EvalClass + */ +/** + * @typedef {import('./jsonpath.js').ResultType} ResultType + */ +/** + * @typedef {import('./jsonpath.js').EvalValue} EvalValue + */ +/** + * @typedef {import('./jsonpath.js').PathType} PathType + */ +/** + * @typedef {import('./jsonpath.js').SafeScriptType} SafeScriptType + */ +/** + * @typedef {import('./jsonpath.js').ScriptType} ScriptType + */ +/** + * @typedef {import('./jsonpath.js').SandboxType} SandboxType + */ +/** + * @typedef {import('./jsonpath.js').JSONPathOptions} JSONPathOptions + */ + +// Node's vm module shape is wider than ScriptType, but is compatible for +// the properties actually used (Script) -- kept Node-specific here so +// `node:vm` types don't leak into the shared/browser declarations. +/** @type {{vm: ScriptType}} */ +(/** @type {unknown} */JSONPathClass.prototype).vm = /** @type {ScriptType} */ +/** @type {unknown} */vm; -export { JSONPath }; +export { JSONPath, JSONPathClass }; diff --git a/dist/jsonpath-browser.d.ts b/dist/jsonpath-browser.d.ts new file mode 100644 index 00000000..ab997ea7 --- /dev/null +++ b/dist/jsonpath-browser.d.ts @@ -0,0 +1,43 @@ +export type AnyInput = import("./jsonpath.js").AnyInput; +export type SandboxCallback = import("./jsonpath.js").SandboxCallback; +export type SandboxPropertyValue = import("./jsonpath.js").SandboxPropertyValue; +export type ExpressionArray = import("./jsonpath.js").ExpressionArray; +export type ValueType = import("./jsonpath.js").ValueType; +export type ParentValue = import("./jsonpath.js").ParentValue; +export type UnknownResult = import("./jsonpath.js").UnknownResult; +export type ParentProperty = import("./jsonpath.js").ParentProperty; +export type PreferredOutput = import("./jsonpath.js").PreferredOutput; +export type ReturnObject = import("./jsonpath.js").ReturnObject; +export type JSONPathCallback = import("./jsonpath.js").JSONPathCallback; +export type OtherTypeCallback = import("./jsonpath.js").OtherTypeCallback; +export type ContextItem = import("./jsonpath.js").ContextItem; +export type EvaluatedResult = import("./jsonpath.js").EvaluatedResult; +export type EvalCallback = import("./jsonpath.js").EvalCallback; +export type EvalClass = import("./jsonpath.js").EvalClass; +export type ResultType = import("./jsonpath.js").ResultType; +export type EvalValue = import("./jsonpath.js").EvalValue; +export type PathType = import("./jsonpath.js").PathType; +export type SafeScriptType = import("./jsonpath.js").SafeScriptType; +export type ScriptType = import("./jsonpath.js").ScriptType; +export type SandboxType = import("./jsonpath.js").SandboxType; +export type JSONPathOptions = import("./jsonpath.js").JSONPathOptions; +export type ConditionCallback = (item: T) => boolean; +import { JSONPath } from './jsonpath.js'; +import { JSONPathClass } from './jsonpath.js'; +/** + * In-browser replacement for NodeJS' VM.Script. + */ +export class Script { + /** + * @param {string} expr Expression to evaluate + */ + constructor(expr: string); + code: string; + /** + * @param {SandboxType} context Object whose items will be added + * to evaluation + * @returns {EvaluatedResult} Result of evaluated code + */ + runInNewContext(context: SandboxType): EvaluatedResult; +} +export { JSONPath, JSONPathClass }; diff --git a/dist/jsonpath-node.d.cts b/dist/jsonpath-node.d.cts new file mode 100644 index 00000000..881f83ec --- /dev/null +++ b/dist/jsonpath-node.d.cts @@ -0,0 +1,2 @@ +import * as jsonpath from './jsonpath-node.js'; +export = jsonpath; diff --git a/dist/jsonpath-node.d.ts b/dist/jsonpath-node.d.ts new file mode 100644 index 00000000..0964da33 --- /dev/null +++ b/dist/jsonpath-node.d.ts @@ -0,0 +1,26 @@ +export type AnyInput = import("./jsonpath.js").AnyInput; +export type SandboxCallback = import("./jsonpath.js").SandboxCallback; +export type SandboxPropertyValue = import("./jsonpath.js").SandboxPropertyValue; +export type ExpressionArray = import("./jsonpath.js").ExpressionArray; +export type ValueType = import("./jsonpath.js").ValueType; +export type ParentValue = import("./jsonpath.js").ParentValue; +export type UnknownResult = import("./jsonpath.js").UnknownResult; +export type ParentProperty = import("./jsonpath.js").ParentProperty; +export type PreferredOutput = import("./jsonpath.js").PreferredOutput; +export type ReturnObject = import("./jsonpath.js").ReturnObject; +export type JSONPathCallback = import("./jsonpath.js").JSONPathCallback; +export type OtherTypeCallback = import("./jsonpath.js").OtherTypeCallback; +export type ContextItem = import("./jsonpath.js").ContextItem; +export type EvaluatedResult = import("./jsonpath.js").EvaluatedResult; +export type EvalCallback = import("./jsonpath.js").EvalCallback; +export type EvalClass = import("./jsonpath.js").EvalClass; +export type ResultType = import("./jsonpath.js").ResultType; +export type EvalValue = import("./jsonpath.js").EvalValue; +export type PathType = import("./jsonpath.js").PathType; +export type SafeScriptType = import("./jsonpath.js").SafeScriptType; +export type ScriptType = import("./jsonpath.js").ScriptType; +export type SandboxType = import("./jsonpath.js").SandboxType; +export type JSONPathOptions = import("./jsonpath.js").JSONPathOptions; +import { JSONPath } from './jsonpath.js'; +import { JSONPathClass } from './jsonpath.js'; +export { JSONPath, JSONPathClass }; diff --git a/dist/jsonpath.d.ts b/dist/jsonpath.d.ts new file mode 100644 index 00000000..e6d79be5 --- /dev/null +++ b/dist/jsonpath.d.ts @@ -0,0 +1,233 @@ +export type AnyInput = any; +export type SandboxCallback = ((...args: any[]) => any); +export type SandboxPropertyValue = any | SandboxCallback; +export type ExpressionArray = (string | number)[]; +export type ValueType = "scalar" | "boolean" | "string" | "undefined" | "function" | "integer" | "number" | "nonFinite" | "object" | "array" | "other" | "null"; +export type ParentValue = unknown; +export type UnknownResult = unknown; +export type ParentProperty = string | number | null; +export type PreferredOutput = ReturnObject | string | number | boolean | null | unknown[] | Record; +export type ReturnObject = { + path: ExpressionArray | string; + value: unknown; + parent: ParentValue; + parentProperty: ParentProperty; + isParentSelector?: boolean | undefined; + hasArrExpr?: boolean | undefined; + expr?: ExpressionArray | undefined; + pointer?: string | undefined; +}; +export type JSONPathCallback = (preferredOutput: any, type: "value" | "property", fullRetObj: ReturnObject) => void; +export type OtherTypeCallback = (val: unknown, path: ExpressionArray, parent: ParentValue, parentPropName: string | null) => boolean | null; +export type ContextItem = any; +export type EvaluatedResult = any; +export type EvalCallback = (code: string, context: ContextItem) => EvaluatedResult; +export type ScriptConstructor = new (expr: string) => { + runInNewContext: (context: object) => EvaluatedResult; +}; +export type EvalClass = ScriptConstructor; +export type ResultType = "value" | "path" | "pointer" | "parent" | "parentProperty" | "all"; +export type EvalValue = EvalCallback | EvalClass | "safe" | "native" | boolean; +export type PathType = string | string[]; +export type SafeScriptType = { + Script: ScriptConstructor; +}; +export type ScriptType = { + Script: ScriptConstructor; +}; +export type SandboxType = { + _$_path?: string; + _$_parentProperty?: ParentProperty; + _$_parent?: ParentValue; + _$_property?: string | number; + _$_root?: AnyInput; + _$_v?: unknown; + [key: string]: SandboxPropertyValue; +}; +export type JSONPathOptions = { + json?: AnyInput; + path?: PathType | undefined; + resultType?: ResultType | undefined; + flatten?: boolean | undefined; + wrap?: boolean | undefined; + sandbox?: SandboxType | undefined; + eval?: EvalValue | undefined; + parent?: any | null; + parentProperty?: ParentProperty | undefined; + callback?: JSONPathCallback | undefined; + /** + * Defaults to + * function which throws on encountering `@other` + */ + otherTypeCallback?: OtherTypeCallback | undefined; + autostart?: boolean | undefined; + ignoreEvalErrors?: boolean | undefined; +}; +/** + * @overload + * @param {string} opts JSON path to evaluate + * @param {AnyInput} [expr] JSON object to evaluate against + * @param {JSONPathCallback} [obj] Passed 3 arguments: 1) desired + * payload per `resultType`, 2) `"value"|"property"`, 3) Full returned + * object with all payloads + * @param {OtherTypeCallback} [callback] If `@other()` is at the + * end of one's query, this will be invoked with the value of the item, + * its path, its parent, and its parent's property name, and it should + * return a boolean indicating whether the supplied value belongs to the + * "other" type or not (or it may handle transformations and return + * `false`). + * @param {undefined} [otherTypeCallback] + * @returns {unknown} The string form always has `autostart` implicitly + * `true`, so the result is the evaluated value, not a `JSONPathClass` + */ +export function JSONPath(opts: string, expr?: AnyInput, obj?: JSONPathCallback | undefined, callback?: OtherTypeCallback | undefined, otherTypeCallback?: undefined): unknown; +/** + * @overload + * @param {JSONPathOptions & {autostart: false}} opts An options object + * with `autostart` explicitly set to `false` defers evaluation and + * returns the `JSONPathClass` instance instead + * @returns {JSONPathClass} + */ +export function JSONPath(opts: JSONPathOptions & { + autostart: false; +}): JSONPathClass; +/** + * @overload + * @param {JSONPathOptions} opts If a string, will be treated as + * `expr` + * @returns {unknown} + */ +export function JSONPath(opts: JSONPathOptions): unknown; +export namespace JSONPath { + let cache: Record; + /** + * @param {string[]} pathArr Array to convert + * @returns {string} The path string + */ + function toPathString(pathArr: string[]): string; + /** + * @param {string[]} pointer JSON Path array + * @returns {string} JSON Pointer + */ + function toPointer(pointer: string[]): string; + /** + * @param {string} expr Expression to convert + * @returns {string[]} + */ + function toPathArray(expr: string): string[]; +} +/** + * + */ +export class JSONPathClass { + /** + * @overload + * @param {string} opts JSON path to evaluate + * @param {AnyInput} [expr] JSON object to evaluate against + * @param {JSONPathCallback} [obj] Passed 3 arguments: 1) desired + * payload per `resultType`, 2) `"value"|"property"`, 3) Full returned + * object with all payloads + * @param {OtherTypeCallback} [callback] If `@other()` is at the + * end of one's query, this will be invoked with the value of the item, + * its path, its parent, and its parent's property name, and it should + * return a boolean indicating whether the supplied value belongs to the + * "other" type or not (or it may handle transformations and return + * `false`). + * @param {undefined} [otherTypeCallback] + */ + constructor(opts: string, expr?: AnyInput, obj?: JSONPathCallback | undefined, callback?: OtherTypeCallback | undefined, otherTypeCallback?: undefined); + /** + * @overload + * @param {JSONPathOptions} opts If a string, will be treated as + * `expr` + */ + constructor(opts: JSONPathOptions); + /** @type {ResultType|undefined} */ + currResultType: ResultType | undefined; + /** @type {EvalValue|undefined} */ + currEval: EvalValue | undefined; + /** @type {OtherTypeCallback|undefined} */ + currOtherTypeCallback: OtherTypeCallback | undefined; + /** @type {SandboxType|undefined} */ + currSandbox: SandboxType | undefined; + _hasParentSelector: boolean; + json: any; + path: any; + resultType: ResultType; + flatten: boolean | undefined; + wrap: boolean | undefined; + sandbox: SandboxType; + eval: EvalValue; + ignoreEvalErrors: boolean; + parent: any; + parentProperty: ParentProperty | undefined; + callback: JSONPathCallback; + otherTypeCallback: OtherTypeCallback; + /** + * @overload + * @param {JSONPathOptions} [expr] + * @returns {ReturnObject|ReturnObject[]|undefined|unknown} + */ + evaluate(expr?: JSONPathOptions | undefined): ReturnObject | ReturnObject[] | undefined | unknown; + /** + * @overload + * @param {PathType|undefined} [expr] + * @param {AnyInput} [json] + * @param {JSONPathCallback|null} [callback] + * @param {OtherTypeCallback} [otherTypeCallback] + * @returns {ReturnObject|ReturnObject[]|undefined|unknown} + */ + evaluate(expr?: PathType | undefined, json?: AnyInput, callback?: JSONPathCallback | null | undefined, otherTypeCallback?: OtherTypeCallback | undefined): ReturnObject | ReturnObject[] | undefined | unknown; + /** + * @param {ReturnObject} ea + * @returns {PreferredOutput} + */ + _getPreferredOutput(ea: ReturnObject): PreferredOutput; + /** + * @param {ReturnObject} fullRetObj + * @param {JSONPathCallback|undefined} callback + * @param {"value"|"property"} type + * @returns {void} + */ + _handleCallback(fullRetObj: ReturnObject, callback: JSONPathCallback | undefined, type: "value" | "property"): void; + /** + * + * @param {ExpressionArray} expr + * @param {unknown} val + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {ParentProperty} parentPropName + * @param {JSONPathCallback|undefined} callback + * @param {boolean|undefined} hasArrExpr + * @param {boolean} [literalPriority] + * @returns {ReturnObject|ReturnObject[]} + */ + _trace(expr: ExpressionArray, val: unknown, path: ExpressionArray, parent: ParentValue, parentPropName: ParentProperty, callback: JSONPathCallback | undefined, hasArrExpr: boolean | undefined, literalPriority?: boolean): ReturnObject | ReturnObject[]; + /** + * @param {unknown} val + * @param {(prop: string|number) => void} f + * @returns {void} + */ + _walk(val: unknown, f: (prop: string | number) => void): void; + /** + * @param {string} loc + * @param {ExpressionArray} expr + * @param {unknown} val + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {ParentProperty} parentPropName + * @param {JSONPathCallback|undefined} callback + * @returns {ReturnObject[]|undefined} + */ + _slice(loc: string, expr: ExpressionArray, val: unknown, path: ExpressionArray, parent: ParentValue, parentPropName: ParentProperty, callback: JSONPathCallback | undefined): ReturnObject[] | undefined; + /** + * @param {string} code + * @param {unknown} _v + * @param {string|number} _vname + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {ParentProperty} parentPropName + * @returns {UnknownResult} + */ + _eval(code: string, _v: unknown, _vname: string | number, path: ExpressionArray, parent: ParentValue, parentPropName: ParentProperty): UnknownResult; +} diff --git a/docs/ts/assets/hierarchy.js b/docs/ts/assets/hierarchy.js index 84b504ed..fb85f0ad 100644 --- a/docs/ts/assets/hierarchy.js +++ b/docs/ts/assets/hierarchy.js @@ -1 +1 @@ -window.hierarchyData = "eJyVjrEKgzAYhN/l5thipSL/1rVDLTiKQ4iRhMakJL+T5N2LFBwKhXa55buPuxUxBE6gvmwGgagnpxXb4BNoRdls6eWsQbh27e0u2bTPNxd4WD+CTudaYIkOBOtZx0kqnY4f7YPh2UFAOZkSCJzGYtOLXdmgsW6M2oP6qh6yQFV/378sHDqWkf87sms/PMo5vwAOBWG1" \ No newline at end of file +window.hierarchyData = "eJyrVirKzy8pVrKKjtVRKkpNy0lNLsnMzytWsqqurQUAmx4Kpg==" \ No newline at end of file diff --git a/docs/ts/assets/highlight.css b/docs/ts/assets/highlight.css index bddfe693..3b47d5b7 100644 --- a/docs/ts/assets/highlight.css +++ b/docs/ts/assets/highlight.css @@ -117,4 +117,4 @@ .hl-11 { color: var(--hl-11); } .hl-12 { color: var(--hl-12); } .hl-13 { color: var(--hl-13); } -pre, code { background: var(--code-background); } +pre, code, math[display='block'] { background: var(--code-background); } diff --git a/docs/ts/assets/icons.js b/docs/ts/assets/icons.js index 58882d76..4fbadc5a 100644 --- a/docs/ts/assets/icons.js +++ b/docs/ts/assets/icons.js @@ -3,7 +3,7 @@ function addIcons() { if (document.readyState === "loading") return document.addEventListener("DOMContentLoaded", addIcons); const svg = document.body.appendChild(document.createElementNS("http://www.w3.org/2000/svg", "svg")); - svg.innerHTML = `MMNEPVFCICPMFPCPTTAAATR`; + svg.innerHTML = `MMNEPVFCICPMFPCPTTAAATR`; svg.style.display = "none"; if (location.protocol === "file:") updateUseElements(); } diff --git a/docs/ts/assets/icons.svg b/docs/ts/assets/icons.svg index 50ad5799..be7798fc 100644 --- a/docs/ts/assets/icons.svg +++ b/docs/ts/assets/icons.svg @@ -1 +1 @@ -MMNEPVFCICPMFPCPTTAAATR \ No newline at end of file +MMNEPVFCICPMFPCPTTAAATR \ No newline at end of file diff --git a/docs/ts/assets/main.js b/docs/ts/assets/main.js index 2363f64c..b0eda9ed 100644 --- a/docs/ts/assets/main.js +++ b/docs/ts/assets/main.js @@ -1,9 +1,9 @@ "use strict"; -window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings.","hierarchy_expand":"Expand","hierarchy_collapse":"Collapse","folder":"Folder","kind_1":"Project","kind_2":"Module","kind_4":"Namespace","kind_8":"Enumeration","kind_16":"Enumeration Member","kind_32":"Variable","kind_64":"Function","kind_128":"Class","kind_256":"Interface","kind_512":"Constructor","kind_1024":"Property","kind_2048":"Method","kind_4096":"Call Signature","kind_8192":"Index Signature","kind_16384":"Constructor Signature","kind_32768":"Parameter","kind_65536":"Type Literal","kind_131072":"Type Parameter","kind_262144":"Accessor","kind_524288":"Get Signature","kind_1048576":"Set Signature","kind_2097152":"Type Alias","kind_4194304":"Reference","kind_8388608":"Document"}; -"use strict";(()=>{var De=Object.create;var le=Object.defineProperty;var Fe=Object.getOwnPropertyDescriptor;var Ne=Object.getOwnPropertyNames;var Ve=Object.getPrototypeOf,Be=Object.prototype.hasOwnProperty;var qe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var je=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ne(e))!Be.call(t,i)&&i!==n&&le(t,i,{get:()=>e[i],enumerable:!(r=Fe(e,i))||r.enumerable});return t};var $e=(t,e,n)=>(n=t!=null?De(Ve(t)):{},je(e||!t||!t.__esModule?le(n,"default",{value:t,enumerable:!0}):n,t));var pe=qe((de,he)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(n){e.console&&console.warn&&console.warn(n)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,c],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. -`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ol?d+=2:a==l&&(n+=r[c+1]*i[d+1],c+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var c=s.node.edges["*"];else{var c=new t.TokenSet;s.node.edges["*"]=c}s.str.length==1&&(c.final=!0),i.push({node:c,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),m=s.str.charAt(1),p;m in s.node.edges?p=s.node.edges[m]:(p=new t.TokenSet,s.node.edges[m]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),l=0;l1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,n){typeof define=="function"&&define.amd?define(n):typeof de=="object"?he.exports=n():e.lunr=n()}(this,function(){return t})})()});window.translations||={copy:"Copy",copied:"Copied!",normally_hidden:"This member is normally hidden due to your filter settings.",hierarchy_expand:"Expand",hierarchy_collapse:"Collapse",folder:"Folder",kind_1:"Project",kind_2:"Module",kind_4:"Namespace",kind_8:"Enumeration",kind_16:"Enumeration Member",kind_32:"Variable",kind_64:"Function",kind_128:"Class",kind_256:"Interface",kind_512:"Constructor",kind_1024:"Property",kind_2048:"Method",kind_4096:"Call Signature",kind_8192:"Index Signature",kind_16384:"Constructor Signature",kind_32768:"Parameter",kind_65536:"Type Literal",kind_131072:"Type Parameter",kind_262144:"Accessor",kind_524288:"Get Signature",kind_1048576:"Set Signature",kind_2097152:"Type Alias",kind_4194304:"Reference",kind_8388608:"Document"};var ce=[];function G(t,e){ce.push({selector:e,constructor:t})}var J=class{alwaysVisibleMember=null;constructor(){this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){ce.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!ze(e)){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r,document.querySelector(".col-sidebar").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};function ze(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var ue=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var ge=$e(pe(),1);async function A(t){let e=Uint8Array.from(atob(t),s=>s.charCodeAt(0)),r=new Blob([e]).stream().pipeThrough(new DecompressionStream("deflate")),i=await new Response(r).text();return JSON.parse(i)}async function fe(t,e){if(!window.searchData)return;let n=await A(window.searchData);t.data=n,t.index=ge.Index.load(n.index),e.classList.remove("loading"),e.classList.add("ready")}function ve(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:document.documentElement.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{fe(e,t)}),fe(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");i.addEventListener("mouseup",()=>{re(t)}),r.addEventListener("focus",()=>t.classList.add("has-focus")),We(t,i,r,e)}function We(t,e,n,r){n.addEventListener("input",ue(()=>{Ue(t,e,n,r)},200)),n.addEventListener("keydown",i=>{i.key=="Enter"?Je(e,t):i.key=="ArrowUp"?(me(e,n,-1),i.preventDefault()):i.key==="ArrowDown"&&(me(e,n,1),i.preventDefault())}),document.body.addEventListener("keypress",i=>{i.altKey||i.ctrlKey||i.metaKey||!n.matches(":focus")&&i.key==="/"&&(i.preventDefault(),n.focus())}),document.body.addEventListener("keyup",i=>{t.classList.contains("has-focus")&&(i.key==="Escape"||!e.matches(":focus-within")&&!n.matches(":focus"))&&(n.blur(),re(t))})}function re(t){t.classList.remove("has-focus")}function Ue(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=ye(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` - ${ye(l.parent,i)}.${d}`);let m=document.createElement("li");m.classList.value=l.classes??"";let p=document.createElement("a");p.href=r.base+l.url,p.innerHTML=c+d,m.append(p),p.addEventListener("focus",()=>{e.querySelector(".current")?.classList.remove("current"),m.classList.add("current")}),e.appendChild(m)}}function me(t,e,n){let r=t.querySelector(".current");if(!r)r=t.querySelector(n==1?"li:first-child":"li:last-child"),r&&r.classList.add("current");else{let i=r;if(n===1)do i=i.nextElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);else do i=i.previousElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);i?(r.classList.remove("current"),i.classList.add("current")):n===-1&&(r.classList.remove("current"),e.focus())}}function Je(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),re(e)}}function ye(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(ne(t.substring(s,o)),`${ne(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(ne(t.substring(s))),i.join("")}var Ge={"&":"&","<":"<",">":">","'":"'",'"':"""};function ne(t){return t.replace(/[&<>"'"]/g,e=>Ge[e])}var I=class{el;app;constructor(e){this.el=e.el,this.app=e.app}};var H="mousedown",Ee="mousemove",B="mouseup",X={x:0,y:0},xe=!1,ie=!1,Xe=!1,D=!1,be=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(be?"is-mobile":"not-mobile");be&&"ontouchstart"in document.documentElement&&(Xe=!0,H="touchstart",Ee="touchmove",B="touchend");document.addEventListener(H,t=>{ie=!0,D=!1;let e=H=="touchstart"?t.targetTouches[0]:t;X.y=e.pageY||0,X.x=e.pageX||0});document.addEventListener(Ee,t=>{if(ie&&!D){let e=H=="touchstart"?t.targetTouches[0]:t,n=X.x-(e.pageX||0),r=X.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(B,()=>{ie=!1});document.addEventListener("click",t=>{xe&&(t.preventDefault(),t.stopImmediatePropagation(),xe=!1)});var Y=class extends I{active;className;constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(B,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(H,n=>this.onDocumentPointerDown(n)),document.addEventListener(B,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){D||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!D&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var se;try{se=localStorage}catch{se={getItem(){return null},setItem(){}}}var C=se;var Le=document.head.appendChild(document.createElement("style"));Le.dataset.for="filters";var Z=class extends I{key;value;constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),Le.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } -`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=C.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){C.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),this.app.updateIndexVisibility()}};var oe=new Map,ae=class{open;accordions=[];key;constructor(e,n){this.key=e,this.open=n}add(e){this.accordions.push(e),e.open=this.open,e.addEventListener("toggle",()=>{this.toggle(e.open)})}toggle(e){for(let n of this.accordions)n.open=e;C.setItem(this.key,e.toString())}},K=class extends I{constructor(e){super(e);let n=this.el.querySelector("summary"),r=n.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)});let i=`tsd-accordion-${n.dataset.key??n.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`,s;if(oe.has(i))s=oe.get(i);else{let o=C.getItem(i),a=o?o==="true":this.el.open;s=new ae(i,a),oe.set(i,s)}s.add(this.el)}};function Se(t){let e=C.getItem("tsd-theme")||"os";t.value=e,we(e),t.addEventListener("change",()=>{C.setItem("tsd-theme",t.value),we(t.value)})}function we(t){document.documentElement.dataset.theme=t}var ee;function Ce(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Te),Te())}async function Te(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let e=await A(window.navigationData);ee=document.documentElement.dataset.base,ee.endsWith("/")||(ee+="/"),t.innerHTML="";for(let n of e)Ie(n,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Ie(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',ke(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let c of t.children)Ie(c,l,i)}else ke(t,r,t.class)}function ke(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));if(r.href=ee+t.path,n&&(r.className=n),location.pathname===r.pathname&&!r.href.includes("#")&&r.classList.add("current"),t.kind){let i=window.translations[`kind_${t.kind}`].replaceAll('"',""");r.innerHTML=``}r.appendChild(document.createElement("span")).textContent=t.text}else{let r=e.appendChild(document.createElement("span")),i=window.translations.folder.replaceAll('"',""");r.innerHTML=``,r.appendChild(document.createElement("span")).textContent=t.text}}var te=document.documentElement.dataset.base;te.endsWith("/")||(te+="/");function Pe(){document.querySelector(".tsd-full-hierarchy")?Ye():document.querySelector(".tsd-hierarchy")&&Ze()}function Ye(){document.addEventListener("click",r=>{let i=r.target;for(;i.parentElement&&i.parentElement.tagName!="LI";)i=i.parentElement;i.dataset.dropdown&&(i.dataset.dropdown=String(i.dataset.dropdown!=="true"))});let t=new Map,e=new Set;for(let r of document.querySelectorAll(".tsd-full-hierarchy [data-refl]")){let i=r.querySelector("ul");t.has(r.dataset.refl)?e.add(r.dataset.refl):i&&t.set(r.dataset.refl,i)}for(let r of e)n(r);function n(r){let i=t.get(r).cloneNode(!0);i.querySelectorAll("[id]").forEach(s=>{s.removeAttribute("id")}),i.querySelectorAll("[data-dropdown]").forEach(s=>{s.dataset.dropdown="false"});for(let s of document.querySelectorAll(`[data-refl="${r}"]`)){let o=tt(),a=s.querySelector("ul");s.insertBefore(o,a),o.dataset.dropdown=String(!!a),a||s.appendChild(i.cloneNode(!0))}}}function Ze(){let t=document.getElementById("tsd-hierarchy-script");t&&(t.addEventListener("load",Qe),Qe())}async function Qe(){let t=document.querySelector(".tsd-panel.tsd-hierarchy:has(h4 a)");if(!t||!window.hierarchyData)return;let e=+t.dataset.refl,n=await A(window.hierarchyData),r=t.querySelector("ul"),i=document.createElement("ul");if(i.classList.add("tsd-hierarchy"),Ke(i,n,e),r.querySelectorAll("li").length==i.querySelectorAll("li").length)return;let s=document.createElement("span");s.classList.add("tsd-hierarchy-toggle"),s.textContent=window.translations.hierarchy_expand,t.querySelector("h4 a")?.insertAdjacentElement("afterend",s),s.insertAdjacentText("beforebegin",", "),s.addEventListener("click",()=>{s.textContent===window.translations.hierarchy_expand?(r.insertAdjacentElement("afterend",i),r.remove(),s.textContent=window.translations.hierarchy_collapse):(i.insertAdjacentElement("afterend",r),i.remove(),s.textContent=window.translations.hierarchy_expand)})}function Ke(t,e,n){let r=e.roots.filter(i=>et(e,i,n));for(let i of r)t.appendChild(_e(e,i,n))}function _e(t,e,n,r=new Set){if(r.has(e))return;r.add(e);let i=t.reflections[e],s=document.createElement("li");if(s.classList.add("tsd-hierarchy-item"),e===n){let o=s.appendChild(document.createElement("span"));o.textContent=i.name,o.classList.add("tsd-hierarchy-target")}else{for(let a of i.uniqueNameParents||[]){let l=t.reflections[a],c=s.appendChild(document.createElement("a"));c.textContent=l.name,c.href=te+l.url,c.className=l.class+" tsd-signature-type",s.append(document.createTextNode("."))}let o=s.appendChild(document.createElement("a"));o.textContent=t.reflections[e].name,o.href=te+i.url,o.className=i.class+" tsd-signature-type"}if(i.children){let o=s.appendChild(document.createElement("ul"));o.classList.add("tsd-hierarchy");for(let a of i.children){let l=_e(t,a,n,r);l&&o.appendChild(l)}}return r.delete(e),s}function et(t,e,n){if(e===n)return!0;let r=new Set,i=[t.reflections[e]];for(;i.length;){let s=i.pop();if(!r.has(s)){r.add(s);for(let o of s.children||[]){if(o===n)return!0;i.push(t.reflections[o])}}}return!1}function tt(){let t=document.createElementNS("http://www.w3.org/2000/svg","svg");return t.setAttribute("width","20"),t.setAttribute("height","20"),t.setAttribute("viewBox","0 0 24 24"),t.setAttribute("fill","none"),t.innerHTML='',t}G(Y,"a[data-toggle]");G(K,".tsd-accordion");G(Z,".tsd-filter-item input[type=checkbox]");var Oe=document.getElementById("tsd-theme");Oe&&Se(Oe);var nt=new J;Object.defineProperty(window,"app",{value:nt});ve();Ce();Pe();})(); +window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings.","hierarchy_expand":"Expand","hierarchy_collapse":"Collapse","folder":"Folder","search_index_not_available":"The search index is not available","search_no_results_found_for_0":"No results found for {0}","kind_1":"Project","kind_2":"Module","kind_4":"Namespace","kind_8":"Enumeration","kind_16":"Enumeration Member","kind_32":"Variable","kind_64":"Function","kind_128":"Class","kind_256":"Interface","kind_512":"Constructor","kind_1024":"Property","kind_2048":"Method","kind_4096":"Call Signature","kind_8192":"Index Signature","kind_16384":"Constructor Signature","kind_32768":"Parameter","kind_65536":"Type Literal","kind_131072":"Type Parameter","kind_262144":"Accessor","kind_524288":"Get Signature","kind_1048576":"Set Signature","kind_2097152":"Type Alias","kind_4194304":"Reference","kind_8388608":"Document"}; +(()=>{var Ke=Object.create;var he=Object.defineProperty;var Ge=Object.getOwnPropertyDescriptor;var Ze=Object.getOwnPropertyNames;var Xe=Object.getPrototypeOf,Ye=Object.prototype.hasOwnProperty;var et=(t,e)=>()=>{try{return e||t((e={exports:{}}).exports,e),e.exports}catch(n){throw e=0,n}};var tt=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ze(e))!Ye.call(t,i)&&i!==n&&he(t,i,{get:()=>e[i],enumerable:!(r=Ge(e,i))||r.enumerable});return t};var nt=(t,e,n)=>(n=t!=null?Ke(Xe(t)):{},tt(e||!t||!t.__esModule?he(n,"default",{value:t,enumerable:!0}):n,t));var ye=et((me,ge)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=(function(e){return function(n){e.console&&console.warn&&console.warn(n)}})(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,l],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(oc?d+=2:a==c&&(n+=r[l+1]*i[d+1],l+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var c=s.node.edges["*"];else{var c=new t.TokenSet;s.node.edges["*"]=c}if(s.str.length==0&&(c.final=!0),i.push({node:c,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}s.str.length==1&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),f=s.str.charAt(1),p;f in s.node.edges?p=s.node.edges[f]:(p=new t.TokenSet,s.node.edges[f]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),c=0;c1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}if(s.type===t.QueryLexer.TERM)return t.QueryParser.parseTerm;var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},(function(e,n){typeof define=="function"&&define.amd?define(n):typeof me=="object"?ge.exports=n():e.lunr=n()})(this,function(){return t})})()});var M,G={getItem(){return null},setItem(){}},K;try{K=localStorage,M=K}catch{K=G,M=G}var S={getItem:t=>M.getItem(t),setItem:(t,e)=>M.setItem(t,e),disableWritingLocalStorage(){M=G},disable(){localStorage.clear(),M=G},enable(){M=K}};window.TypeDoc||={disableWritingLocalStorage(){S.disableWritingLocalStorage()},disableLocalStorage:()=>{S.disable()},enableLocalStorage:()=>{S.enable()}};window.translations||={copy:"Copy",copied:"Copied!",normally_hidden:"This member is normally hidden due to your filter settings.",hierarchy_expand:"Expand",hierarchy_collapse:"Collapse",search_index_not_available:"The search index is not available",search_no_results_found_for_0:"No results found for {0}",folder:"Folder",kind_1:"Project",kind_2:"Module",kind_4:"Namespace",kind_8:"Enumeration",kind_16:"Enumeration Member",kind_32:"Variable",kind_64:"Function",kind_128:"Class",kind_256:"Interface",kind_512:"Constructor",kind_1024:"Property",kind_2048:"Method",kind_4096:"Call Signature",kind_8192:"Index Signature",kind_16384:"Constructor Signature",kind_32768:"Parameter",kind_65536:"Type Literal",kind_131072:"Type Parameter",kind_262144:"Accessor",kind_524288:"Get Signature",kind_1048576:"Set Signature",kind_2097152:"Type Alias",kind_4194304:"Reference",kind_8388608:"Document"};var pe=[];function X(t,e){pe.push({selector:e,constructor:t})}var Z=class{alwaysVisibleMember=null;constructor(){this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){pe.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!rt(e)){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r,document.querySelector(".col-sidebar").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};function rt(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var fe=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var Ie=nt(ye(),1);async function R(t){let e=Uint8Array.from(atob(t),s=>s.charCodeAt(0)),r=new Blob([e]).stream().pipeThrough(new DecompressionStream("deflate")),i=await new Response(r).text();return JSON.parse(i)}var Y="closing",ae="tsd-overlay";function it(){let t=Math.abs(window.innerWidth-document.documentElement.clientWidth);document.body.style.overflow="hidden",document.body.style.paddingRight=`${t}px`}function st(){document.body.style.removeProperty("overflow"),document.body.style.removeProperty("padding-right")}function Ee(t,e){t.addEventListener("animationend",()=>{t.classList.contains(Y)&&(t.classList.remove(Y),document.getElementById(ae)?.remove(),t.close(),st())}),t.addEventListener("cancel",n=>{n.preventDefault(),ve(t)}),e?.closeOnClick&&document.addEventListener("click",n=>{t.open&&!t.contains(n.target)&&ve(t)},!0)}function xe(t){if(t.open)return;let e=document.createElement("div");e.id=ae,document.body.appendChild(e),t.showModal(),it()}function ve(t){if(!t.open)return;document.getElementById(ae)?.classList.add(Y),t.classList.add(Y)}var I=class{el;app;constructor(e){this.el=e.el,this.app=e.app}};var be=document.head.appendChild(document.createElement("style"));be.dataset.for="filters";var le={};function Le(t){for(let e of t.split(/\s+/))if(le.hasOwnProperty(e)&&!le[e])return!0;return!1}var ee=class extends I{key;value;constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),be.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=S.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){S.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),le[`tsd-is-${this.el.name}`]=this.value,this.app.filterChanged(),this.app.updateIndexVisibility()}};var we=0;async function Se(t,e){if(!window.searchData)return;let n=await R(window.searchData);t.data=n,t.index=Ie.Index.load(n.index),e.innerHTML=""}function _e(){let t=document.getElementById("tsd-search-trigger"),e=document.getElementById("tsd-search"),n=document.getElementById("tsd-search-input"),r=document.getElementById("tsd-search-results"),i=document.getElementById("tsd-search-script"),s=document.getElementById("tsd-search-status");if(!(t&&e&&n&&r&&i&&s))throw new Error("Search controls missing");let o={base:document.documentElement.dataset.base};o.base.endsWith("/")||(o.base+="/"),i.addEventListener("error",()=>{let a=window.translations.search_index_not_available;Pe(s,a)}),i.addEventListener("load",()=>{Se(o,s)}),Se(o,s),ot({trigger:t,searchEl:e,results:r,field:n,status:s},o)}function ot(t,e){let{field:n,results:r,searchEl:i,status:s,trigger:o}=t;Ee(i,{closeOnClick:!0});function a(){xe(i),n.setSelectionRange(0,n.value.length)}o.addEventListener("click",a),n.addEventListener("input",fe(()=>{at(r,n,s,e)},200)),n.addEventListener("keydown",l=>{if(r.childElementCount===0||l.ctrlKey||l.metaKey||l.altKey)return;let d=n.getAttribute("aria-activedescendant"),f=d?document.getElementById(d):null;if(f){let p=!1,v=!1;switch(l.key){case"Home":case"End":case"ArrowLeft":case"ArrowRight":v=!0;break;case"ArrowDown":case"ArrowUp":p=l.shiftKey;break}(p||v)&&ke(n)}if(!l.shiftKey)switch(l.key){case"Enter":f?.querySelector("a")?.click();break;case"ArrowUp":Te(r,n,f,-1),l.preventDefault();break;case"ArrowDown":Te(r,n,f,1),l.preventDefault();break}});function c(){ke(n)}n.addEventListener("change",c),n.addEventListener("blur",c),n.addEventListener("click",c),document.body.addEventListener("keydown",l=>{if(l.altKey||l.metaKey||l.shiftKey)return;let d=l.ctrlKey&&l.key==="k",f=!l.ctrlKey&&!ut()&&l.key==="/";(d||f)&&(l.preventDefault(),a())})}function at(t,e,n,r){if(!r.index||!r.data)return;t.innerHTML="",n.innerHTML="",we+=1;let i=e.value.trim(),s;if(i){let a=i.split(" ").map(c=>c.length?`*${c}*`:"").join(" ");s=r.index.search(a).filter(({ref:c})=>{let l=r.data.rows[Number(c)].classes;return!l||!Le(l)})}else s=[];if(s.length===0&&i){let a=window.translations.search_no_results_found_for_0.replace("{0}",` "${te(i)}" `);Pe(n,a);return}for(let a=0;ac.score-a.score);let o=Math.min(10,s.length);for(let a=0;a`,f=Ce(c.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(f+=` (score: ${s[a].score.toFixed(2)})`),c.parent&&(f=` + ${Ce(c.parent,i)}.${f}`);let p=document.createElement("li");p.id=`tsd-search:${we}-${a}`,p.role="option",p.ariaSelected="false",p.classList.value=c.classes??"";let v=document.createElement("a");v.tabIndex=-1,v.href=r.base+c.url,v.innerHTML=d+`${f}`,p.append(v),t.appendChild(p)}}function Te(t,e,n,r){let i;if(r===1?i=n?.nextElementSibling||t.firstElementChild:i=n?.previousElementSibling||t.lastElementChild,i!==n){if(!i||i.role!=="option"){console.error("Option missing");return}i.ariaSelected="true",i.scrollIntoView({behavior:"smooth",block:"nearest"}),e.setAttribute("aria-activedescendant",i.id),n?.setAttribute("aria-selected","false")}}function ke(t){let e=t.getAttribute("aria-activedescendant");(e?document.getElementById(e):null)?.setAttribute("aria-selected","false"),t.setAttribute("aria-activedescendant","")}function Ce(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(te(t.substring(s,o)),`${te(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(te(t.substring(s))),i.join("")}var lt={"&":"&","<":"<",">":">","'":"'",'"':"""};function te(t){return t.replace(/[&<>"'"]/g,e=>lt[e])}function Pe(t,e){t.innerHTML=e?`
${e}
`:""}var ct=["button","checkbox","file","hidden","image","radio","range","reset","submit"];function ut(){let t=document.activeElement;return t?t.isContentEditable||t.tagName==="TEXTAREA"||t.tagName==="SEARCH"?!0:t.tagName==="INPUT"&&!ct.includes(t.type):!1}var D="mousedown",Me="mousemove",$="mouseup",ne={x:0,y:0},Qe=!1,ce=!1,dt=!1,F=!1,Oe=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(Oe?"is-mobile":"not-mobile");Oe&&"ontouchstart"in document.documentElement&&(dt=!0,D="touchstart",Me="touchmove",$="touchend");document.addEventListener(D,t=>{ce=!0,F=!1;let e=D=="touchstart"?t.targetTouches[0]:t;ne.y=e.pageY||0,ne.x=e.pageX||0});document.addEventListener(Me,t=>{if(ce&&!F){let e=D=="touchstart"?t.targetTouches[0]:t,n=ne.x-(e.pageX||0),r=ne.y-(e.pageY||0);F=Math.sqrt(n*n+r*r)>10}});document.addEventListener($,()=>{ce=!1});document.addEventListener("click",t=>{Qe&&(t.preventDefault(),t.stopImmediatePropagation(),Qe=!1)});var re=class extends I{active;className;constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener($,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(D,n=>this.onDocumentPointerDown(n)),document.addEventListener($,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){F||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!F&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var ue=new Map,de=class{open;accordions=[];key;constructor(e,n){this.key=e,this.open=n}add(e){this.accordions.push(e),e.open=this.open,e.addEventListener("toggle",()=>{this.toggle(e.open)})}toggle(e){for(let n of this.accordions)n.open=e;S.setItem(this.key,e.toString())}},ie=class extends I{constructor(e){super(e);let n=this.el.querySelector("summary"),r=n.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)});let i=`tsd-accordion-${n.dataset.key??n.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`,s;if(ue.has(i))s=ue.get(i);else{let o=S.getItem(i),a=o?o==="true":this.el.open;s=new de(i,a),ue.set(i,s)}s.add(this.el)}};function He(t){let e=S.getItem("tsd-theme")||"os";t.value=e,Ae(e),t.addEventListener("change",()=>{S.setItem("tsd-theme",t.value),Ae(t.value)})}function Ae(t){document.documentElement.dataset.theme=t}var se;function Ne(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Re),Re())}async function Re(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let e=await R(window.navigationData);se=document.documentElement.dataset.base,se.endsWith("/")||(se+="/"),t.innerHTML="";for(let n of e)Ve(n,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Ve(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',De(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let c=a.appendChild(document.createElement("ul"));c.className="tsd-nested-navigation";for(let l of t.children)Ve(l,c,i)}else De(t,r,t.class)}function De(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));if(r.href=se+t.path,n&&(r.className=n),location.pathname===r.pathname&&!r.href.includes("#")&&(r.classList.add("current"),r.ariaCurrent="page"),t.kind){let i=window.translations[`kind_${t.kind}`].replaceAll('"',""");r.innerHTML=``}r.appendChild(Fe(t.text,document.createElement("span")))}else{let r=e.appendChild(document.createElement("span")),i=window.translations.folder.replaceAll('"',""");r.innerHTML=``,r.appendChild(Fe(t.text,document.createElement("span")))}}function Fe(t,e){let n=t.split(/(?<=[^A-Z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|(?<=[_-])(?=[^_-])/);for(let r=0;r{let i=r.target;for(;i.parentElement&&i.parentElement.tagName!="LI";)i=i.parentElement;i.dataset.dropdown&&(i.dataset.dropdown=String(i.dataset.dropdown!=="true"))});let t=new Map,e=new Set;for(let r of document.querySelectorAll(".tsd-full-hierarchy [data-refl]")){let i=r.querySelector("ul");t.has(r.dataset.refl)?e.add(r.dataset.refl):i&&t.set(r.dataset.refl,i)}for(let r of e)n(r);function n(r){let i=t.get(r).cloneNode(!0);i.querySelectorAll("[id]").forEach(s=>{s.removeAttribute("id")}),i.querySelectorAll("[data-dropdown]").forEach(s=>{s.dataset.dropdown="false"});for(let s of document.querySelectorAll(`[data-refl="${r}"]`)){let o=gt(),a=s.querySelector("ul");s.insertBefore(o,a),o.dataset.dropdown=String(!!a),a||s.appendChild(i.cloneNode(!0))}}}function pt(){let t=document.getElementById("tsd-hierarchy-script");t&&(t.addEventListener("load",Be),Be())}async function Be(){let t=document.querySelector(".tsd-panel.tsd-hierarchy:has(h4 a)");if(!t||!window.hierarchyData)return;let e=+t.dataset.refl,n=await R(window.hierarchyData),r=t.querySelector("ul"),i=document.createElement("ul");if(i.classList.add("tsd-hierarchy"),ft(i,n,e),r.querySelectorAll("li").length==i.querySelectorAll("li").length)return;let s=document.createElement("span");s.classList.add("tsd-hierarchy-toggle"),s.textContent=window.translations.hierarchy_expand,t.querySelector("h4 a")?.insertAdjacentElement("afterend",s),s.insertAdjacentText("beforebegin",", "),s.addEventListener("click",()=>{s.textContent===window.translations.hierarchy_expand?(r.insertAdjacentElement("afterend",i),r.remove(),s.textContent=window.translations.hierarchy_collapse):(i.insertAdjacentElement("afterend",r),i.remove(),s.textContent=window.translations.hierarchy_expand)})}function ft(t,e,n){let r=e.roots.filter(i=>mt(e,i,n));for(let i of r)t.appendChild(je(e,i,n))}function je(t,e,n,r=new Set){if(r.has(e))return;r.add(e);let i=t.reflections[e],s=document.createElement("li");if(s.classList.add("tsd-hierarchy-item"),e===n){let o=s.appendChild(document.createElement("span"));o.textContent=i.name,o.classList.add("tsd-hierarchy-target")}else{for(let a of i.uniqueNameParents||[]){let c=t.reflections[a],l=s.appendChild(document.createElement("a"));l.textContent=c.name,l.href=oe+c.url,l.className=c.class+" tsd-signature-type",s.append(document.createTextNode("."))}let o=s.appendChild(document.createElement("a"));o.textContent=t.reflections[e].name,o.href=oe+i.url,o.className=i.class+" tsd-signature-type"}if(i.children){let o=s.appendChild(document.createElement("ul"));o.classList.add("tsd-hierarchy");for(let a of i.children){let c=je(t,a,n,r);c&&o.appendChild(c)}}return r.delete(e),s}function mt(t,e,n){if(e===n)return!0;let r=new Set,i=[t.reflections[e]];for(;i.length;){let s=i.pop();if(!r.has(s)){r.add(s);for(let o of s.children||[]){if(o===n)return!0;i.push(t.reflections[o])}}}return!1}function gt(){let t=document.createElementNS("http://www.w3.org/2000/svg","svg");return t.setAttribute("width","20"),t.setAttribute("height","20"),t.innerHTML='',t}X(re,"a[data-toggle]");X(ie,".tsd-accordion");X(ee,".tsd-filter-item input[type=checkbox]");var qe=document.getElementById("tsd-theme");qe&&He(qe);var yt=new Z;Object.defineProperty(window,"app",{value:yt});_e();Ne();$e();"virtualKeyboard"in navigator&&(navigator.virtualKeyboard.overlaysContent=!0);})(); /*! Bundled license information: lunr/lunr.js: diff --git a/docs/ts/assets/navigation.js b/docs/ts/assets/navigation.js index 41c84fde..6d3c794e 100644 --- a/docs/ts/assets/navigation.js +++ b/docs/ts/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "eJyV0MEKgkAQBuB3mbNUSlp5i+jSIQO7RYfRVhQ3FR0jCd89NmRN09qOy//Ptzt7egCxO4EN2xvyDceiAA0ypBBs8MWRFVMZTUK6ctAgjpIL2LqxrDU5v3Od/QEpHDE6sZKDnKPHWUtFCbE8QP9da0pd0DCtAdDJKEqT4qvXdP7g1iWlLmFOKq4sq1wgdvPQj1uYqqy3u8h71my10E1j6MEUsvxYZewX/FFUvUHMjKEiU3VaIygT//Vz0uka1rw+PwFd7+wg" \ No newline at end of file +window.navigationData = "eJy1mkFT2zAQhf+Le4W2oUBLZnrIZHqghyZD2l4YDoqjNAZH8sgyJNPhv3dsR7ZkW9oN3Zwgk6dPy1pSXp64/xtpvtPROHrMpciY3kRnUfVjHG3lqkh5/sG8836jt2l0Fj0lYhWNL86ieJOkK8VFNL5vMN8Xsx9zpjfTlOV5y4rLlzbL0bnk0cWX17MGuIhVkumpFLlWRaylaqF6n9nInrJT8Mebz6OrCwttamiJ60LEOpFioFAXdn1pcSZifyuyQgOte8fEPjnoasrl6Oby00cbNZWi/O1W8y1Ei2tpUkt9wG/PLJ2yNF2y+Aki8meWxq02iHQfb4B3EIZgBdN8dcfzIgVbyI1cGXkI/JulBccgnw9CL2yXKZ7niRQTpdgeRDZydpD7wM02QD4i8wrxmAx6llUrGkuWjdwHnukNVz/3GccWLcsB5WZFVD1nigs9VzIrh0DkrFJnrTqMRa2HmgmtiLKzZQ9gmt7oWudFKb7mSvHVrNCIUyQzcmnkPnC9pTBV1rsJqPOO60KJ2fKRx2CRqtJKo/UhF2zN62MbU2XO1jyv1EClCyZWS7nDrs+8liNW5wFslidqPR3oZpFCC+swBa4flRRqBr6/mN7+Ek9CvgjccV3UYvCwrhqJKbHq3mCFDxbOjDlfKvmSc+WnGgXK29Sd9JuaBlYLQ67GezgnQnO1ZvEQtjOoU/PVNbhXQ3B7RIjcNzuuDWuARgi5sKkUq6T8g/rb1UPujUBM0XdVfrjRQthhb+Xh2mIU2HVYIWrfQg8jB31WAGzpMfjOaRgAV0oQ6fNcPrCrx5p/9APsDoAmCNgkzwy9EdAUPrPk4btyHBz3UC0tjO0aJy+zFoJAn33ycV09hB8yUR5yK4WgPt/jAbtyGO5xP166o0fiPR4oPIczCDkRskONFsQe0Xd0zz2uyMN11BB6wBt5sI3y+OAj6Iua74aYL7LhYGCYOxwSDDo6IVcBk1i9jfJycGbTssiCGwtJmd5YWLoIpwulynE6XLIwp8OFvmbxXSaV/orjVVqKeMiFHpkRobDHbNVjFtYbgif8AgufA2+ItAbYpLmWxT9FuGXhaROuHvj/Yy4HSZd12VjSwMsCE6ZeDpU0+rLI9PmXAz9NCNafgjQJ6+MJ4jAbSpiJWVjCYMyiHpmOIbzU+YjSTR1otH7KQMkdlQETeyoHS+qqbDKtr7LJZHdlLpnaDhkwvSHqkoktUQ9Paoq6dHpbZGY4mTEyE5zAGrloInPUQontUQOmN0gGTW2RWi69STLsE9mkFn9Co9SZhN4qdSagMksNltouGTC1YTJcnGUq1+F59/rPcK03cdeIzaLuXyXarFYXukmciP2cKbblmvf+Ncqm2TooH5zkefJHbLnQ7Yd5kD2gB2PYYpnrRBcaYNu6Y5i9uzMf1HN19vD68A84xXHN" \ No newline at end of file diff --git a/docs/ts/assets/search.js b/docs/ts/assets/search.js index 254a3d67..69b6b8ed 100644 --- a/docs/ts/assets/search.js +++ b/docs/ts/assets/search.js @@ -1 +1 @@ -window.searchData = "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"; \ No newline at end of file +window.searchData = "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"; \ No newline at end of file diff --git a/docs/ts/assets/style.css b/docs/ts/assets/style.css index 2ab8b836..ec257d51 100644 --- a/docs/ts/assets/style.css +++ b/docs/ts/assets/style.css @@ -1,14 +1,33 @@ @layer typedoc { + :root { + --dim-toolbar-contents-height: 2.5rem; + --dim-toolbar-border-bottom-width: 1px; + --dim-header-height: calc( + var(--dim-toolbar-border-bottom-width) + + var(--dim-toolbar-contents-height) + ); + + /* 0rem For mobile; unit is required for calculation in `calc` */ + --dim-container-main-margin-y: 0rem; + + --dim-footer-height: 3.5rem; + + --modal-animation-duration: 0.2s; + } + :root { /* Light */ --light-color-background: #f2f4f8; --light-color-background-secondary: #eff0f1; - --light-color-warning-text: #222; + /* Not to be confused with [:active](https://developer.mozilla.org/en-US/docs/Web/CSS/:active) */ + --light-color-background-active: #d6d8da; --light-color-background-warning: #e6e600; + --light-color-warning-text: #222; --light-color-accent: #c5c7c9; - --light-color-active-menu-item: var(--light-color-accent); + --light-color-active-menu-item: var(--light-color-background-active); --light-color-text: #222; - --light-color-text-aside: #6e6e6e; + --light-color-contrast-text: #000; + --light-color-text-aside: #5e5e5e; --light-color-icon-background: var(--light-color-background); --light-color-icon-text: var(--light-color-text); @@ -56,15 +75,20 @@ --light-external-icon: url("data:image/svg+xml;utf8,"); --light-color-scheme: light; + } + :root { /* Dark */ --dark-color-background: #2b2e33; --dark-color-background-secondary: #1e2024; + /* Not to be confused with [:active](https://developer.mozilla.org/en-US/docs/Web/CSS/:active) */ + --dark-color-background-active: #5d5d6a; --dark-color-background-warning: #bebe00; --dark-color-warning-text: #222; --dark-color-accent: #9096a2; - --dark-color-active-menu-item: #5d5d6a; + --dark-color-active-menu-item: var(--dark-color-background-active); --dark-color-text: #f5f5f5; + --dark-color-contrast-text: #ffffff; --dark-color-text-aside: #dddddd; --dark-color-icon-background: var(--dark-color-background-secondary); @@ -119,11 +143,13 @@ --color-background-secondary: var( --light-color-background-secondary ); + --color-background-active: var(--light-color-background-active); --color-background-warning: var(--light-color-background-warning); --color-warning-text: var(--light-color-warning-text); --color-accent: var(--light-color-accent); --color-active-menu-item: var(--light-color-active-menu-item); --color-text: var(--light-color-text); + --color-contrast-text: var(--light-color-contrast-text); --color-text-aside: var(--light-color-text-aside); --color-icon-background: var(--light-color-icon-background); @@ -179,11 +205,13 @@ --color-background-secondary: var( --dark-color-background-secondary ); + --color-background-active: var(--dark-color-background-active); --color-background-warning: var(--dark-color-background-warning); --color-warning-text: var(--dark-color-warning-text); --color-accent: var(--dark-color-accent); --color-active-menu-item: var(--dark-color-active-menu-item); --color-text: var(--dark-color-text); + --color-contrast-text: var(--dark-color-contrast-text); --color-text-aside: var(--dark-color-text-aside); --color-icon-background: var(--dark-color-icon-background); @@ -233,23 +261,17 @@ } } - html { - color-scheme: var(--color-scheme); - } - - body { - margin: 0; - } - :root[data-theme="light"] { --color-background: var(--light-color-background); --color-background-secondary: var(--light-color-background-secondary); + --color-background-active: var(--light-color-background-active); --color-background-warning: var(--light-color-background-warning); --color-warning-text: var(--light-color-warning-text); --color-icon-background: var(--light-color-icon-background); --color-accent: var(--light-color-accent); --color-active-menu-item: var(--light-color-active-menu-item); --color-text: var(--light-color-text); + --color-contrast-text: var(--light-color-contrast-text); --color-text-aside: var(--light-color-text-aside); --color-icon-text: var(--light-color-icon-text); @@ -299,12 +321,14 @@ :root[data-theme="dark"] { --color-background: var(--dark-color-background); --color-background-secondary: var(--dark-color-background-secondary); + --color-background-active: var(--dark-color-background-active); --color-background-warning: var(--dark-color-background-warning); --color-warning-text: var(--dark-color-warning-text); --color-icon-background: var(--dark-color-icon-background); --color-accent: var(--dark-color-accent); --color-active-menu-item: var(--dark-color-active-menu-item); --color-text: var(--dark-color-text); + --color-contrast-text: var(--dark-color-contrast-text); --color-text-aside: var(--dark-color-text-aside); --color-icon-text: var(--dark-color-icon-text); @@ -351,6 +375,13 @@ --color-scheme: var(--dark-color-scheme); } + html { + color-scheme: var(--color-scheme); + @media (prefers-reduced-motion: no-preference) { + scroll-behavior: smooth; + } + } + *:focus-visible, .tsd-accordion-summary:focus-visible svg { outline: 2px solid var(--color-focus-outline); @@ -421,16 +452,19 @@ border-top: 1px solid var(--color-accent); padding-top: 1rem; padding-bottom: 1rem; - max-height: 3.5rem; + max-height: var(--dim-footer-height); } footer > p { margin: 0 1em; } .container-main { - margin: 0 auto; + margin: var(--dim-container-main-margin-y) auto; /* toolbar, footer, margin */ - min-height: calc(100vh - 41px - 56px - 4rem); + min-height: calc( + 100svh - var(--dim-header-height) - var(--dim-footer-height) - + 2 * var(--dim-container-main-margin-y) + ); } @keyframes fade-in { @@ -450,29 +484,6 @@ opacity: 0; } } - @keyframes fade-in-delayed { - 0% { - opacity: 0; - } - 33% { - opacity: 0; - } - 100% { - opacity: 1; - } - } - @keyframes fade-out-delayed { - 0% { - opacity: 1; - visibility: visible; - } - 66% { - opacity: 0; - } - 100% { - opacity: 0; - } - } @keyframes pop-in-from-right { from { transform: translate(100%, 0); @@ -492,10 +503,19 @@ } body { background: var(--color-background); - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", - Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + font-family: + -apple-system, + BlinkMacSystemFont, + "Segoe UI", + "Noto Sans", + Helvetica, + Arial, + sans-serif, + "Apple Color Emoji", + "Segoe UI Emoji"; font-size: 16px; color: var(--color-text); + margin: 0; } a { @@ -514,6 +534,17 @@ a.tsd-anchor-link { color: var(--color-text); } + :target { + scroll-margin-block: calc(var(--dim-header-height) + 0.5rem); + } + + math[display="block"] { + position: relative; + padding: 10px; + border: 1px solid var(--color-accent); + border-radius: 0.8em; + margin-bottom: 8px; + } code, pre { @@ -545,7 +576,8 @@ box-sizing: border-box; } pre:hover > button, - pre > button.visible { + pre > button.visible, + pre > button:focus-visible { opacity: 1; } @@ -555,6 +587,52 @@ border-left: 4px solid gray; } + img { + max-width: 100%; + } + + * { + scrollbar-width: thin; + scrollbar-color: var(--color-accent) var(--color-icon-background); + } + + *::-webkit-scrollbar { + width: 0.75rem; + } + + *::-webkit-scrollbar-track { + background: var(--color-icon-background); + } + + *::-webkit-scrollbar-thumb { + background-color: var(--color-accent); + border-radius: 999rem; + border: 0.25rem solid var(--color-icon-background); + } + + dialog { + border: none; + outline: none; + padding: 0; + background-color: var(--color-background); + } + dialog::backdrop { + display: none; + } + #tsd-overlay { + background-color: rgba(0, 0, 0, 0.5); + position: fixed; + z-index: 9999; + top: 0; + left: 0; + right: 0; + bottom: 0; + animation: fade-in var(--modal-animation-duration) forwards; + } + #tsd-overlay.closing { + animation-name: fade-out; + } + .tsd-typography { line-height: 1.333em; } @@ -629,6 +707,7 @@ .tsd-breadcrumb { margin: 0; + margin-top: 1rem; padding: 0; color: var(--color-text-aside); } @@ -733,7 +812,7 @@ margin-right: 0.5em; border-radius: 0.33em; /* Leaving this at full opacity breaks event listeners on Firefox. - Don't remove unless you know what you're doing. */ + Don't remove unless you know what you're doing. */ opacity: 0.99; } .tsd-filter-input input[type="checkbox"]:focus-visible + svg { @@ -876,7 +955,8 @@ } .tsd-navigation.settings { - margin: 1rem 0; + margin: 0; + margin-bottom: 1rem; } .tsd-navigation > a, .tsd-navigation .tsd-accordion-summary { @@ -898,6 +978,7 @@ .tsd-navigation a.current, .tsd-page-navigation a.current { background: var(--color-active-menu-item); + color: var(--color-contrast-text); } .tsd-navigation a:hover, .tsd-page-navigation a:hover { @@ -931,14 +1012,14 @@ margin-left: -1.5rem; } - .tsd-page-navigation-section { - margin-left: 10px; - } .tsd-page-navigation-section > summary { padding: 0.25rem; } + .tsd-page-navigation-section > summary > svg { + margin-right: 0.25rem; + } .tsd-page-navigation-section > div { - margin-left: 20px; + margin-left: 30px; } .tsd-page-navigation ul { padding-left: 1.75rem; @@ -964,6 +1045,10 @@ .tsd-accordion-summary { list-style-type: none; /* hide marker on non-safari */ outline: none; /* broken on safari, so just hide it */ + display: flex; + align-items: center; + gap: 0.25rem; + box-sizing: border-box; } .tsd-accordion-summary::-webkit-details-marker { display: none; /* hide marker on safari */ @@ -977,7 +1062,7 @@ cursor: pointer; } - .tsd-accordion-summary a { + .tsd-accordion-summary > a { width: calc(100% - 1.5rem); } .tsd-accordion-summary > * { @@ -986,28 +1071,21 @@ padding-top: 0; padding-bottom: 0; } - .tsd-accordion .tsd-accordion-summary > svg { - margin-left: 0.25rem; - vertical-align: text-top; - } /* * We need to be careful to target the arrow indicating whether the accordion * is open, but not any other SVGs included in the details element. */ - .tsd-accordion:not([open]) > .tsd-accordion-summary > svg:first-child, - .tsd-accordion:not([open]) > .tsd-accordion-summary > h1 > svg:first-child, - .tsd-accordion:not([open]) > .tsd-accordion-summary > h2 > svg:first-child, - .tsd-accordion:not([open]) > .tsd-accordion-summary > h3 > svg:first-child, - .tsd-accordion:not([open]) > .tsd-accordion-summary > h4 > svg:first-child, - .tsd-accordion:not([open]) > .tsd-accordion-summary > h5 > svg:first-child { + .tsd-accordion:not([open]) > .tsd-accordion-summary > svg:first-child { transform: rotate(-90deg); } .tsd-index-content > :not(:first-child) { margin-top: 0.75rem; } - .tsd-index-heading { + .tsd-index-summary { margin-top: 1.5rem; margin-bottom: 0.75rem; + display: flex; + align-content: center; } .tsd-no-select { @@ -1062,117 +1140,104 @@ margin-bottom: 1rem; } - #tsd-search { - transition: background-color 0.2s; - } - #tsd-search .title { - position: relative; - z-index: 2; + #tsd-search[open] { + animation: fade-in var(--modal-animation-duration) ease-out forwards; } - #tsd-search .field { - position: absolute; - left: 0; - top: 0; - right: 2.5rem; - height: 100%; + #tsd-search[open].closing { + animation-name: fade-out; } - #tsd-search .field input { + + /* Avoid setting `display` on closed dialog */ + #tsd-search[open] { + display: flex; + flex-direction: column; + padding: 1rem; + width: 32rem; + max-width: 90vw; + max-height: calc(100vh - env(keyboard-inset-height, 0px) - 25vh); + /* Anchor dialog to top */ + margin-top: 10vh; + border-radius: 6px; + will-change: max-height; + } + #tsd-search-input { box-sizing: border-box; - position: relative; - top: -50px; - z-index: 1; width: 100%; - padding: 0 10px; - opacity: 0; + padding: 0 0.625rem; /* 10px */ outline: 0; - border: 0; - background: transparent; + border: 2px solid var(--color-accent); + background-color: transparent; color: var(--color-text); + border-radius: 4px; + height: 2.5rem; + flex: 0 0 auto; + font-size: 0.875rem; + transition: border-color 0.2s, background-color 0.2s; } - #tsd-search .field label { - position: absolute; - overflow: hidden; - right: -40px; + #tsd-search-input:focus-visible { + background-color: var(--color-background-active); + border-color: transparent; + color: var(--color-contrast-text); } - #tsd-search .field input, - #tsd-search .title, - #tsd-toolbar-links a { - transition: opacity 0.2s; + #tsd-search-input::placeholder { + color: inherit; + opacity: 0.8; } - #tsd-search .results { - position: absolute; - visibility: hidden; - top: 40px; - width: 100%; + #tsd-search-results { margin: 0; padding: 0; list-style: none; - box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); + flex: 1 1 auto; + display: flex; + flex-direction: column; + overflow-y: auto; + } + #tsd-search-results:not(:empty) { + margin-top: 0.5rem; } - #tsd-search .results li { + #tsd-search-results > li { background-color: var(--color-background); - line-height: initial; - padding: 4px; + line-height: 1.5; + box-sizing: border-box; + border-radius: 4px; } - #tsd-search .results li:nth-child(even) { + #tsd-search-results > li:nth-child(even) { background-color: var(--color-background-secondary); } - #tsd-search .results li.state { - display: none; - } - #tsd-search .results li.current:not(.no-results), - #tsd-search .results li:hover:not(.no-results) { - background-color: var(--color-accent); + #tsd-search-results > li:is(:hover, [aria-selected="true"]) { + background-color: var(--color-background-active); + color: var(--color-contrast-text); } - #tsd-search .results a { + /* It's important that this takes full size of parent `li`, to capture a click on `li` */ + #tsd-search-results > li > a { display: flex; align-items: center; - padding: 0.25rem; + padding: 0.5rem 0.25rem; box-sizing: border-box; + width: 100%; } - #tsd-search .results a:before { - top: 10px; + #tsd-search-results > li > a > .text { + flex: 1 1 auto; + min-width: 0; + overflow-wrap: anywhere; } - #tsd-search .results span.parent { + #tsd-search-results > li > a .parent { color: var(--color-text-aside); - font-weight: normal; - } - #tsd-search.has-focus { - background-color: var(--color-accent); - } - #tsd-search.has-focus .field input { - top: 0; - opacity: 1; } - #tsd-search.has-focus .title, - #tsd-search.has-focus #tsd-toolbar-links a { - z-index: 0; - opacity: 0; - } - #tsd-search.has-focus .results { - visibility: visible; - } - #tsd-search.loading .results li.state.loading { - display: block; - } - #tsd-search.failure .results li.state.failure { - display: block; - } - - #tsd-toolbar-links { - position: absolute; - top: 0; - right: 2rem; - height: 100%; - display: flex; - align-items: center; - justify-content: flex-end; + #tsd-search-results > li > a mark { + color: inherit; + background-color: inherit; + font-weight: bold; } - #tsd-toolbar-links a { - margin-left: 1.5rem; + #tsd-search-status { + flex: 1; + display: grid; + place-content: center; + text-align: center; + overflow-wrap: anywhere; } - #tsd-toolbar-links a:hover { - text-decoration: underline; + #tsd-search-status:not(:empty) { + min-height: 6rem; } .tsd-signature { @@ -1257,78 +1322,52 @@ width: 100%; color: var(--color-text); background: var(--color-background-secondary); - border-bottom: 1px var(--color-accent) solid; + border-bottom: var(--dim-toolbar-border-bottom-width) + var(--color-accent) solid; transition: transform 0.3s ease-in-out; } .tsd-page-toolbar a { color: var(--color-text); - text-decoration: none; } - .tsd-page-toolbar a.title { - font-weight: bold; - } - .tsd-page-toolbar a.title:hover { - text-decoration: underline; - } - .tsd-page-toolbar .tsd-toolbar-contents { + .tsd-toolbar-contents { display: flex; - justify-content: space-between; - height: 2.5rem; + align-items: center; + height: var(--dim-toolbar-contents-height); margin: 0 auto; } - .tsd-page-toolbar .table-cell { - position: relative; - white-space: nowrap; - line-height: 40px; - } - .tsd-page-toolbar .table-cell:first-child { - width: 100%; + .tsd-toolbar-contents > .title { + font-weight: bold; + margin-right: auto; } - .tsd-page-toolbar .tsd-toolbar-icon { - box-sizing: border-box; - line-height: 0; - padding: 12px 0; + #tsd-toolbar-links { + display: flex; + align-items: center; + gap: 1.5rem; + margin-right: 1rem; } .tsd-widget { + box-sizing: border-box; display: inline-block; - overflow: hidden; opacity: 0.8; - height: 40px; - transition: - opacity 0.1s, - background-color 0.2s; - vertical-align: bottom; + height: 2.5rem; + width: 2.5rem; + transition: opacity 0.1s, background-color 0.1s; + text-align: center; cursor: pointer; + border: none; + background-color: transparent; } .tsd-widget:hover { opacity: 0.9; } - .tsd-widget.active { + .tsd-widget:active { opacity: 1; background-color: var(--color-accent); } - .tsd-widget.no-caption { - width: 40px; - } - .tsd-widget.no-caption:before { - margin: 0; - } - - .tsd-widget.options, - .tsd-widget.menu { + #tsd-toolbar-menu-trigger { display: none; } - input[type="checkbox"] + .tsd-widget:before { - background-position: -120px 0; - } - input[type="checkbox"]:checked + .tsd-widget:before { - background-position: -160px 0; - } - - img { - max-width: 100%; - } .tsd-member-summary-name { display: inline-flex; @@ -1342,6 +1381,7 @@ align-items: center; margin-left: 0.5rem; color: var(--color-text); + vertical-align: middle; } .tsd-anchor-icon svg { @@ -1351,7 +1391,8 @@ } .tsd-member-summary-name:hover > .tsd-anchor-icon svg, - .tsd-anchor-link:hover > .tsd-anchor-icon svg { + .tsd-anchor-link:hover > .tsd-anchor-icon svg, + .tsd-anchor-icon:focus-visible svg { visibility: visible; } @@ -1437,41 +1478,26 @@ color: var(--color-text); } - * { - scrollbar-width: thin; - scrollbar-color: var(--color-accent) var(--color-icon-background); - } - - *::-webkit-scrollbar { - width: 0.75rem; - } - - *::-webkit-scrollbar-track { - background: var(--color-icon-background); - } - - *::-webkit-scrollbar-thumb { - background-color: var(--color-accent); - border-radius: 999rem; - border: 0.25rem solid var(--color-icon-background); - } - /* mobile */ @media (max-width: 769px) { - .tsd-widget.options, - .tsd-widget.menu { + #tsd-toolbar-menu-trigger { display: inline-block; + /* temporary fix to vertically align, for compatibility */ + line-height: 2.5; + } + #tsd-toolbar-links { + display: none; } .container-main { display: flex; } - html .col-content { + .col-content { float: none; max-width: 100%; width: 100%; } - html .col-sidebar { + .col-sidebar { position: fixed !important; overflow-y: auto; -webkit-overflow-scrolling: touch; @@ -1486,10 +1512,10 @@ background-color: var(--color-background); transform: translate(100%, 0); } - html .col-sidebar > *:last-child { + .col-sidebar > *:last-child { padding-bottom: 20px; } - html .overlay { + .overlay { content: ""; display: block; position: fixed; @@ -1536,9 +1562,6 @@ .has-menu .tsd-navigation { max-height: 100%; } - #tsd-toolbar-links { - display: none; - } .tsd-navigation .tsd-nav-link { display: flex; } @@ -1550,7 +1573,11 @@ display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); grid-template-areas: "sidebar content"; - margin: 2rem auto; + --dim-container-main-margin-y: 2rem; + } + + .tsd-breadcrumb { + margin-top: 0; } .col-sidebar { @@ -1563,11 +1590,15 @@ } @media (min-width: 770px) and (max-width: 1399px) { .col-sidebar { - max-height: calc(100vh - 2rem - 42px); + max-height: calc( + 100vh - var(--dim-header-height) - var(--dim-footer-height) - + 2 * var(--dim-container-main-margin-y) + ); overflow: auto; position: sticky; - top: 42px; - padding-top: 1rem; + top: calc( + var(--dim-header-height) + var(--dim-container-main-margin-y) + ); } .site-menu { margin-top: 1rem; @@ -1577,7 +1608,8 @@ /* two sidebars */ @media (min-width: 1200px) { .container-main { - grid-template-columns: minmax(0, 1fr) minmax(0, 2.5fr) minmax( + grid-template-columns: + minmax(0, 1fr) minmax(0, 2.5fr) minmax( 0, 20rem ); @@ -1597,15 +1629,20 @@ } .site-menu { - margin-top: 1rem; + margin-top: 0rem; } .page-menu, .site-menu { - max-height: calc(100vh - 2rem - 42px); + max-height: calc( + 100vh - var(--dim-header-height) - var(--dim-footer-height) - + 2 * var(--dim-container-main-margin-y) + ); overflow: auto; position: sticky; - top: 42px; + top: calc( + var(--dim-header-height) + var(--dim-container-main-margin-y) + ); } } } diff --git a/docs/ts/classes/EvalClass.html b/docs/ts/classes/EvalClass.html deleted file mode 100644 index 5c2c92a5..00000000 --- a/docs/ts/classes/EvalClass.html +++ /dev/null @@ -1,3 +0,0 @@ -EvalClass | jsonpath-plus

Class EvalClass

Constructors

Methods

Constructors

Methods

  • Parameters

    • context: object

    Returns any

diff --git a/docs/ts/classes/JSONPathClass.html b/docs/ts/classes/JSONPathClass.html deleted file mode 100644 index b7e1aa72..00000000 --- a/docs/ts/classes/JSONPathClass.html +++ /dev/null @@ -1,23 +0,0 @@ -JSONPathClass | jsonpath-plus

Class JSONPathClass

Constructors

Properties

Methods

Constructors

Properties

cache: any

Exposes the cache object for those who wish to preserve and reuse -it for optimization purposes.

-

Methods

  • Parameters

    Returns any

  • Parameters

    • options: {
          callback: JSONPathCallback;
          json: string | number | boolean | object | any[];
          otherTypeCallback: JSONPathOtherTypeCallback;
          path: string | any[];
      }

    Returns any

  • Accepts a normalized or unnormalized path as string and -converts to an array: for example, -['$', 'aProperty', 'anotherProperty'].

    -

    Parameters

    • path: string

    Returns string[]

  • Accepts a path array and converts to a normalized path string. -The string will be in a form like: -$['aProperty']['anotherProperty][0]. -The JSONPath terminal constructions ~ and ^ and type operators -like @string() are silently stripped.

    -

    Parameters

    • path: string[]

    Returns string

  • Accepts a path array and converts to a JSON Pointer.

    -

    The string will be in a form like: /aProperty/anotherProperty/0 -(with any ~ and / internal characters escaped as per the JSON -Pointer spec).

    -

    The JSONPath terminal constructions ~ and ^ and type operators -like @string() are silently stripped.

    -

    Parameters

    • path: string[]

    Returns any

diff --git a/docs/ts/classes/Safe-Script.SafeScript.html b/docs/ts/classes/Safe-Script.SafeScript.html new file mode 100644 index 00000000..027a2a3f --- /dev/null +++ b/docs/ts/classes/Safe-Script.SafeScript.html @@ -0,0 +1,113 @@ +SafeScript | jsonpath-plus
+
jsonpath-plus + +
    +
    +
    Preparing search index...
    +
    +
    +
    + +

    Class SafeScript

    +
    +

    A replacement for NodeJS' VM.Script which is also Content Security Policy friendly.

    +
    +
    +
    +
    +
    Index
    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    ast: unknown
    +
    + +
    code: string
    +
    + +
    +
    + +
      +
    • + +
      +
      +

      Parameters

      +
        +
      • context: object +

        Object whose items will be added +to evaluation

        +
      +

      Returns any

      Result of evaluated code

      +
    +
    + +
    +
    diff --git a/docs/ts/classes/jsonpath-browser.Script.html b/docs/ts/classes/jsonpath-browser.Script.html new file mode 100644 index 00000000..5ef3d952 --- /dev/null +++ b/docs/ts/classes/jsonpath-browser.Script.html @@ -0,0 +1,107 @@ +Script | jsonpath-plus
    +
    jsonpath-plus + +
      +
      +
      Preparing search index...
      +
      +
      +
      + +

      Class Script

      +
      +

      In-browser replacement for NodeJS' VM.Script.

      +
      +
      +
      +
      +
      Index
      +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      +
      + +
      code: string
      +
      + +
      +
      + +
      +
      + +
      +
      diff --git a/docs/ts/classes/jsonpath.JSONPathClass.html b/docs/ts/classes/jsonpath.JSONPathClass.html new file mode 100644 index 00000000..c4da8617 --- /dev/null +++ b/docs/ts/classes/jsonpath.JSONPathClass.html @@ -0,0 +1,367 @@ +JSONPathClass | jsonpath-plus
      +
      jsonpath-plus + +
        +
        +
        Preparing search index...
        +
        +
        +
        + +

        Class JSONPathClass

        +
        +
        +
        +
        Index
        +
        +
        + +
        +
        + +
          +
        • + +
          +
          +

          Parameters

          +
            +
          • opts: string +

            JSON path to evaluate

            +
          • +
          • Optionalexpr: any +

            JSON object to evaluate against

            +
          • +
          • Optionalobj: JSONPathCallback +

            Passed 3 arguments: 1) desired +payload per resultType, 2) "value"|"property", 3) Full returned +object with all payloads

            +
          • +
          • Optionalcallback: OtherTypeCallback +

            If @other() is at the +end of one's query, this will be invoked with the value of the item, +its path, its parent, and its parent's property name, and it should +return a boolean indicating whether the supplied value belongs to the +"other" type or not (or it may handle transformations and return +false).

            +
          • +
          • OptionalotherTypeCallback: undefined
          +

          Returns JSONPathClass | typeof JSONPath

        • +
        • + +
          +
          +

          Parameters

          +
          +

          Returns JSONPathClass

        +
        + +
        +
        + +
        _hasParentSelector: boolean
        +
        + +
        +
        + +
        currEval: EvalValue | undefined
        +
        + +
        currOtherTypeCallback: OtherTypeCallback | undefined
        +
        + +
        currResultType: ResultType | undefined
        +
        + +
        currSandbox: SandboxType | undefined
        +
        + +
        eval: EvalValue
        +
        + +
        flatten: boolean | undefined
        +
        + +
        ignoreEvalErrors: boolean
        +
        + +
        json: any
        +
        + +
        otherTypeCallback: OtherTypeCallback
        +
        + +
        parent: any
        +
        + +
        parentProperty: ParentProperty | undefined
        +
        + +
        path: any
        +
        + +
        resultType: ResultType
        +
        + +
        +
        + +
        sandbox: SandboxType
        +
        + +
        +
        + +
        wrap: boolean | undefined
        +
        + +
        +
        + +
          +
        • + +
          +
          +

          Parameters

          +
          +

          Returns unknown

        +
        + +
        +
        + +
        +
        + +
        +
        + +
        +
        + +
          +
        • + +
          +
          +

          Parameters

          +
            +
          • val: unknown
          • +
          • f: (prop: string | number) => void
          +

          Returns void

        +
        + +
        +
        +
        diff --git a/docs/ts/functions/JSONPath.html b/docs/ts/functions/JSONPath.html deleted file mode 100644 index bd3b7139..00000000 --- a/docs/ts/functions/JSONPath.html +++ /dev/null @@ -1,22 +0,0 @@ -JSONPath | jsonpath-plus

        Function JSONPath

        Properties

        cache: any

        Exposes the cache object for those who wish to preserve and reuse -it for optimization purposes.

        -

        Methods

        • Parameters

          Returns any

        • Parameters

          • options: {
                callback: JSONPathCallback;
                json: string | number | boolean | object | any[];
                otherTypeCallback: JSONPathOtherTypeCallback;
                path: string | any[];
            }

          Returns any

        • Accepts a normalized or unnormalized path as string and -converts to an array: for example, -['$', 'aProperty', 'anotherProperty'].

          -

          Parameters

          • path: string

          Returns string[]

        • Accepts a path array and converts to a normalized path string. -The string will be in a form like: -$['aProperty']['anotherProperty][0]. -The JSONPath terminal constructions ~ and ^ and type operators -like @string() are silently stripped.

          -

          Parameters

          • path: string[]

          Returns string

        • Accepts a path array and converts to a JSON Pointer.

          -

          The string will be in a form like: /aProperty/anotherProperty/0 -(with any ~ and / internal characters escaped as per the JSON -Pointer spec).

          -

          The JSONPath terminal constructions ~ and ^ and type operators -like @string() are silently stripped.

          -

          Parameters

          • path: string[]

          Returns any

        diff --git a/docs/ts/functions/jsonpath.JSONPath.html b/docs/ts/functions/jsonpath.JSONPath.html new file mode 100644 index 00000000..c49a0272 --- /dev/null +++ b/docs/ts/functions/jsonpath.JSONPath.html @@ -0,0 +1,176 @@ +JSONPath | jsonpath-plus
        +
        jsonpath-plus + +
          +
          +
          Preparing search index...
          +
          +
          +
          + +

          Function JSONPath

          +
          +
            +
          • + +
            +
            +

            Parameters

            +
              +
            • opts: string +

              JSON path to evaluate

              +
            • +
            • Optionalexpr: any +

              JSON object to evaluate against

              +
            • +
            • Optionalobj: JSONPathCallback +

              Passed 3 arguments: 1) desired +payload per resultType, 2) "value"|"property", 3) Full returned +object with all payloads

              +
            • +
            • Optionalcallback: OtherTypeCallback +

              If @other() is at the +end of one's query, this will be invoked with the value of the item, +its path, its parent, and its parent's property name, and it should +return a boolean indicating whether the supplied value belongs to the +"other" type or not (or it may handle transformations and return +false).

              +
            • +
            • OptionalotherTypeCallback: undefined
            +

            Returns unknown

            The string form always has autostart implicitly +true, so the result is the evaluated value, not a JSONPathClass

            +
          • +
          • + +
            +
            +

            Parameters

            +
              +
            • opts: JSONPathOptions & { autostart: false } +

              An options object +with autostart explicitly set to false defers evaluation and +returns the JSONPathClass instance instead

              +
            +

            Returns JSONPathClass

          • +
          • + +
            +
            +

            Parameters

            +
            +

            Returns unknown

          +
          +
          +
          +
          Index
          +
          +
          + +
          +
          + +
          +
          + +
          +
          + +
          cache: Record<string, unknown>
          +
          + +
          prototype: JSONPathClass
          +
          + +
          +
          + +
            +
          • + +
            +
            +

            Parameters

            +
              +
            • expr: string +

              Expression to convert

              +
            +

            Returns string[]

          +
          + +
            +
          • + +
            +
            +

            Parameters

            +
              +
            • pathArr: string[] +

              Array to convert

              +
            +

            Returns string

            The path string

            +
          +
          + +
            +
          • + +
            +
            +

            Parameters

            +
              +
            • pointer: string[] +

              JSON Path array

              +
            +

            Returns string

            JSON Pointer

            +
          +
          + +
          +
          diff --git a/docs/ts/hierarchy.html b/docs/ts/hierarchy.html index 84a02afb..2df54815 100644 --- a/docs/ts/hierarchy.html +++ b/docs/ts/hierarchy.html @@ -1 +1,28 @@ -jsonpath-plus

          jsonpath-plus

          Hierarchy Summary

          +jsonpath-plus
          +
          jsonpath-plus + +
            +
            +
            Preparing search index...
            +
            +
            +
            +

            jsonpath-plus

            +

            Hierarchy Summary

            +
            + +
            +
            diff --git a/docs/ts/index.html b/docs/ts/index.html index 2fb0fc26..f31d8735 100644 --- a/docs/ts/index.html +++ b/docs/ts/index.html @@ -1,4 +1,14 @@ -jsonpath-plus

            jsonpath-plus

            npm

            +jsonpath-plus
            +
            jsonpath-plus + +
              +
              +
              Preparing search index...
              +
              +
              +
              +

              jsonpath-plus

              +

              npm

              testing badge coverage badge

              Known Vulnerabilities

              @@ -6,7 +16,8 @@

              Licenses badge

              Node.js CI status

              (see also licenses for dev. deps.)

              -

              JSONPath Plus

              Analyse, transform, and selectively extract data from JSON +

              JSONPath Plus

              +

              Analyse, transform, and selectively extract data from JSON documents (and JavaScript objects).

              jsonpath-plus expands on the original specification to add some additional operators and makes explicit some behaviors the original @@ -16,7 +27,8 @@

              Please note: This project is not currently being actively maintained. We may accept well-documented PRs or some simple updates, but are not looking to make fixes or add new features ourselves.

              -
                + +
                • Compliant with the original jsonpath spec
                • Convenient additions or elaborations not provided in the original spec:
                    @@ -53,30 +65,38 @@ a sandbox for evaluated values.
                  • Option for callback to handle results as they are obtained.
                  -

                  jsonpath-plus is consistently performant with both large and small datasets compared to other json querying libraries per json-querying-performance-testing. You can verify these findings by running the project yourself and adding more perf cases.

                  -
                  npm install jsonpath-plus
                  +
                  +

                  jsonpath-plus is consistently performant with both large and small datasets compared to other json querying libraries per json-querying-performance-testing. You can verify these findings by running the project yourself and adding more perf cases.

                  + +
                  npm install jsonpath-plus
                   
                  -
                  const {JSONPath} = require('jsonpath-plus');

                  const result = JSONPath({path: '...', json}); + + +
                  const {JSONPath} = require('jsonpath-plus');

                  const result = JSONPath({path: '...', json});
                  -

                  For browser usage you can directly include dist/index-browser-umd.cjs; no +

                  +

                  For browser usage you can directly include dist/index-browser-umd.cjs; no Browserify magic is necessary:

                  <script src="node_modules/jsonpath-plus/dist/index-browser-umd.cjs"></script>

                  <script>

                  const result = JSONPath.JSONPath({path: '...', json: {}});

                  </script>
                  -

                  You may also use ES6 Module imports (for modern browsers):

                  + +

                  You may also use ES6 Module imports (for modern browsers):

                  <script type="module">

                  import {
                  JSONPath
                  } from './node_modules/jsonpath-plus/dist/index-browser-esm.js';

                  const result = JSONPath({path: '...', json: {}});

                  </script>
                  -

                  Or if you are bundling your JavaScript (e.g., with Rollup), just use, +

                  +

                  Or if you are bundling your JavaScript (e.g., with Rollup), just use, noting that mainFields should include browser for browser builds (for Node, the default, which checks module, should be fine):

                  import {JSONPath} from 'jsonpath-plus';

                  const result = JSONPath({path: '...', json});
                  -

                  The full signature available is:

                  + +

                  The full signature available is:

                  const result = JSONPath([options,] path, json, callback, otherTypeCallback);
                   
                  @@ -90,7 +110,8 @@ on the number of independent items to be found in the result. See the docs below for more on JSONPath's available arguments.

                  See also the API docs.

                  -

                  The properties that can be supplied on the options object or +

                  +

                  The properties that can be supplied on the options object or evaluate method (as the first argument) include:

                  • path (required) - The JSONPath expression as a (normalized @@ -141,7 +162,8 @@ to be returned within results.
                  • parentProperty (default: null) - In the event that a query could be made to return the root node, this allows the parentProperty -of that root node to be returned within results.
                  • +of that root node to be returned within results. This may be a string +property name or a numeric array index.
                  • callback (default: (none)) - If supplied, a callback will be called immediately upon retrieval of an end point value. The three arguments supplied will be the value of the payload (according to resultType), @@ -157,7 +179,8 @@ belongs to the "other" type or not (or it may handle transformations and return false).
                  -
                    + +
                    • evaluate(path, json, callback, otherTypeCallback) OR evaluate({path: <path>, json: <json object>, callback: <callback function>, otherTypeCallback: @@ -168,7 +191,8 @@ accept any of the other allowed instance properties (except for autostart which would have no relevance here).
                    -
                      + +
                      • JSONPath.cache - Exposes the cache object for those who wish to preserve and reuse it for optimization purposes.
                      • JSONPath.toPathArray(pathAsString) - Accepts a normalized or @@ -186,7 +210,8 @@ Pointer spec). The JSONPath terminal constructions ~ and ^ and type operators like @string() are silently stripped.
                      -

                      Given the following JSON, taken from http://goessner.net/articles/JsonPath/:

                      + +

                      Given the following JSON, taken from http://goessner.net/articles/JsonPath/:

                      {
                      "store": {
                      "book": [
                      {
                      "category": "reference",
                      "author": "Nigel Rees",
                      "title": "Sayings of the Century",
                      "price": 8.95
                      },
                      {
                      "category": "fiction",
                      "author": "Evelyn Waugh",
                      "title": "Sword of Honour",
                      "price": 12.99
                      },
                      {
                      "category": "fiction",
                      "author": "Herman Melville",
                      "title": "Moby Dick",
                      "isbn": "0-553-21311-3",
                      "price": 8.99
                      },
                      {
                      "category": "fiction",
                      "author": "J. R. R. Tolkien",
                      "title": "The Lord of the Rings",
                      "isbn": "0-395-19395-8",
                      "price": 22.99
                      }
                      ],
                      "bicycle": {
                      "color": "red",
                      "price": 19.95
                      }
                      }
                      }
                      @@ -407,7 +432,8 @@

                      Any additional variables supplied as properties on the optional "sandbox" object option are also available to (parenthetical-based) evaluations.

                      -
                        + +
                        1. In JSONPath, a filter expression, in addition to its @ being a reference to its children, actually selects the immediate children as well, whereas in XPath, filter conditions do not select the children @@ -417,14 +443,17 @@
                        2. In JSONPath, equality tests utilize (as per JavaScript) multiple equal signs whereas in XPath, they use a single equal sign.
                        -

                        A basic command line interface (CLI) is provided. Access it using npx jsonpath-plus <json-file> <jsonpath-query>.

                        -
                          + +

                          A basic command line interface (CLI) is provided. Access it using npx jsonpath-plus <json-file> <jsonpath-query>.

                          + +
                          1. Support OR outside of filters (as in XPath |) and grouping.
                          2. Create syntax to work like XPath filters in not selecting children?
                          3. Allow option for parentNode equivalent (maintaining entire chain of parent-and-parentProperty objects up to root)
                          -

                          Running the tests on Node:

                          + +

                          Running the tests on Node:

                          npm test
                           
                          @@ -438,6 +467,52 @@ -

                          Please see SECURITY.md for important security considerations and instructions on how to report vulnerabilities.

                          -

                          MIT License.

                          -
              + +

              Please see SECURITY.md for important security considerations and instructions on how to report vulnerabilities.

              + +

              MIT License.

              +
              +
              +
              diff --git a/docs/ts/interfaces/JSONPathCallable.html b/docs/ts/interfaces/JSONPathCallable.html deleted file mode 100644 index 6c9e2177..00000000 --- a/docs/ts/interfaces/JSONPathCallable.html +++ /dev/null @@ -1 +0,0 @@ -JSONPathCallable | jsonpath-plus

              Interface JSONPathCallable

              diff --git a/docs/ts/interfaces/JSONPathOptions.html b/docs/ts/interfaces/JSONPathOptions.html deleted file mode 100644 index 46905b68..00000000 --- a/docs/ts/interfaces/JSONPathOptions.html +++ /dev/null @@ -1,105 +0,0 @@ -JSONPathOptions | jsonpath-plus

              Interface JSONPathOptions

              interface JSONPathOptions {
                  autostart?: boolean;
                  callback?: JSONPathCallback;
                  eval?:
                      | boolean
                      | typeof EvalClass
                      | "safe"
                      | "native"
                      | (code: string, context: object) => any;
                  flatten?: boolean;
                  ignoreEvalErrors?: boolean;
                  json: string | number | boolean | object | any[];
                  otherTypeCallback?: JSONPathOtherTypeCallback;
                  parent?: any;
                  parentProperty?: any;
                  path: string | any[];
                  resultType?:
                      | "value"
                      | "path"
                      | "pointer"
                      | "parent"
                      | "parentProperty"
                      | "all";
                  sandbox?: Map<string, any>;
                  wrap?: boolean;
              }

              Hierarchy (View Summary)

              Properties

              autostart?: boolean

              If this is supplied as false, one may call the evaluate method -manually.

              -
              true
              -
              - -
              callback?: JSONPathCallback

              If supplied, a callback will be called immediately upon retrieval of -an end point value.

              -

              The three arguments supplied will be the value of the payload -(according to resultType), the type of the payload (whether it is -a normal "value" or a "property" name), and a full payload object -(with all resultTypes).

              -
              undefined
              -
              - -
              eval?:
                  | boolean
                  | typeof EvalClass
                  | "safe"
                  | "native"
                  | (code: string, context: object) => any

              Script evaluation method.

              -

              safe: In browser, it will use a minimal scripting engine which doesn't -use eval or Function and satisfies Content Security Policy. In NodeJS, -it has no effect and is equivalent to native as scripting is safe there.

              -

              native: uses the native scripting capabilities. i.e. unsafe eval or -Function in browser and vm.Script in nodejs.

              -

              true: Same as 'safe'

              -

              false: Disable Javascript executions in path string. Same as preventEval: true in previous versions.

              -

              callback [ (code, context) => value]: A custom implementation which is called -with code and context as arguments to return the evaluated value.

              -

              class: A class similar to nodejs vm.Script. It will be created with code as constructor argument and the code -is evaluated by calling runInNewContext with context.

              -
              'safe'
              -
              - -
              flatten?: boolean

              Whether the returned array of results will be flattened to a -single dimension array.

              -
              false
              -
              - -
              ignoreEvalErrors?: boolean

              Ignore errors while evaluating JSONPath expression.

              -

              true: Don't break entire search if an error occurs while evaluating JSONPath expression on one key/value pair.

              -

              false: Break entire search if an error occurs while evaluating JSONPath expression on one key/value pair.

              -
              false
              -
              - -
              json: string | number | boolean | object | any[]

              The JSON object to evaluate (whether of null, boolean, number, -string, object, or array type).

              -
              otherTypeCallback?: JSONPathOtherTypeCallback

              In the current absence of JSON Schema support, -one can determine types beyond the built-in types by adding the -perator @other() at the end of one's query.

              -

              If such a path is encountered, the otherTypeCallback will be invoked -with the value of the item, its path, its parent, and its parent's -property name, and it should return a boolean indicating whether the -supplied value belongs to the "other" type or not (or it may handle -transformations and return false).

              -

              undefined -<A function that throws an error when @other() is encountered>

              -
              parent?: any

              In the event that a query could be made to return the root node, -this allows the parent of that root node to be returned within results.

              -
              null
              -
              - -
              parentProperty?: any

              In the event that a query could be made to return the root node, -this allows the parentProperty of that root node to be returned within -results.

              -
              null
              -
              - -
              path: string | any[]

              The JSONPath expression as a (normalized or unnormalized) string or -array.

              -
              resultType?: "value" | "path" | "pointer" | "parent" | "parentProperty" | "all"

              Can be case-insensitive form of "value", "path", "pointer", "parent", -or "parentProperty" to determine respectively whether to return -results as the values of the found items, as their absolute paths, -as JSON Pointers to the absolute paths, as their parent objects, -or as their parent's property name.

              -

              If set to "all", all of these types will be returned on an object with -the type as key name.

              -
              'value'
              -
              - -
              sandbox?: Map<string, any>

              Key-value map of variables to be available to code evaluations such -as filtering expressions. -(Note that the current path and value will also be available to those -expressions; see the Syntax section for details.)

              -
              wrap?: boolean

              Whether or not to wrap the results in an array.

              -

              If wrap is set to false, and no results are found, undefined will be -returned (as opposed to an empty array when wrap is set to true).

              -

              If wrap is set to false and a single non-array result is found, that -result will be the only item returned (not within an array).

              -

              An array will still be returned if multiple results are found, however. -To avoid ambiguities (in the case where it is necessary to distinguish -between a result which is a failure and one which is an empty array), -it is recommended to switch the default to false.

              -
              true
              -
              - -
              diff --git a/docs/ts/interfaces/JSONPathOptionsAutoStart.html b/docs/ts/interfaces/JSONPathOptionsAutoStart.html deleted file mode 100644 index 7841ba82..00000000 --- a/docs/ts/interfaces/JSONPathOptionsAutoStart.html +++ /dev/null @@ -1,105 +0,0 @@ -JSONPathOptionsAutoStart | jsonpath-plus

              Interface JSONPathOptionsAutoStart

              interface JSONPathOptionsAutoStart {
                  autostart: false;
                  callback?: JSONPathCallback;
                  eval?:
                      | boolean
                      | typeof EvalClass
                      | "safe"
                      | "native"
                      | (code: string, context: object) => any;
                  flatten?: boolean;
                  ignoreEvalErrors?: boolean;
                  json: string | number | boolean | object | any[];
                  otherTypeCallback?: JSONPathOtherTypeCallback;
                  parent?: any;
                  parentProperty?: any;
                  path: string | any[];
                  resultType?:
                      | "value"
                      | "path"
                      | "pointer"
                      | "parent"
                      | "parentProperty"
                      | "all";
                  sandbox?: Map<string, any>;
                  wrap?: boolean;
              }

              Hierarchy (View Summary)

              Properties

              autostart: false

              If this is supplied as false, one may call the evaluate method -manually.

              -
              true
              -
              - -
              callback?: JSONPathCallback

              If supplied, a callback will be called immediately upon retrieval of -an end point value.

              -

              The three arguments supplied will be the value of the payload -(according to resultType), the type of the payload (whether it is -a normal "value" or a "property" name), and a full payload object -(with all resultTypes).

              -
              undefined
              -
              - -
              eval?:
                  | boolean
                  | typeof EvalClass
                  | "safe"
                  | "native"
                  | (code: string, context: object) => any

              Script evaluation method.

              -

              safe: In browser, it will use a minimal scripting engine which doesn't -use eval or Function and satisfies Content Security Policy. In NodeJS, -it has no effect and is equivalent to native as scripting is safe there.

              -

              native: uses the native scripting capabilities. i.e. unsafe eval or -Function in browser and vm.Script in nodejs.

              -

              true: Same as 'safe'

              -

              false: Disable Javascript executions in path string. Same as preventEval: true in previous versions.

              -

              callback [ (code, context) => value]: A custom implementation which is called -with code and context as arguments to return the evaluated value.

              -

              class: A class similar to nodejs vm.Script. It will be created with code as constructor argument and the code -is evaluated by calling runInNewContext with context.

              -
              'safe'
              -
              - -
              flatten?: boolean

              Whether the returned array of results will be flattened to a -single dimension array.

              -
              false
              -
              - -
              ignoreEvalErrors?: boolean

              Ignore errors while evaluating JSONPath expression.

              -

              true: Don't break entire search if an error occurs while evaluating JSONPath expression on one key/value pair.

              -

              false: Break entire search if an error occurs while evaluating JSONPath expression on one key/value pair.

              -
              false
              -
              - -
              json: string | number | boolean | object | any[]

              The JSON object to evaluate (whether of null, boolean, number, -string, object, or array type).

              -
              otherTypeCallback?: JSONPathOtherTypeCallback

              In the current absence of JSON Schema support, -one can determine types beyond the built-in types by adding the -perator @other() at the end of one's query.

              -

              If such a path is encountered, the otherTypeCallback will be invoked -with the value of the item, its path, its parent, and its parent's -property name, and it should return a boolean indicating whether the -supplied value belongs to the "other" type or not (or it may handle -transformations and return false).

              -

              undefined -<A function that throws an error when @other() is encountered>

              -
              parent?: any

              In the event that a query could be made to return the root node, -this allows the parent of that root node to be returned within results.

              -
              null
              -
              - -
              parentProperty?: any

              In the event that a query could be made to return the root node, -this allows the parentProperty of that root node to be returned within -results.

              -
              null
              -
              - -
              path: string | any[]

              The JSONPath expression as a (normalized or unnormalized) string or -array.

              -
              resultType?: "value" | "path" | "pointer" | "parent" | "parentProperty" | "all"

              Can be case-insensitive form of "value", "path", "pointer", "parent", -or "parentProperty" to determine respectively whether to return -results as the values of the found items, as their absolute paths, -as JSON Pointers to the absolute paths, as their parent objects, -or as their parent's property name.

              -

              If set to "all", all of these types will be returned on an object with -the type as key name.

              -
              'value'
              -
              - -
              sandbox?: Map<string, any>

              Key-value map of variables to be available to code evaluations such -as filtering expressions. -(Note that the current path and value will also be available to those -expressions; see the Syntax section for details.)

              -
              wrap?: boolean

              Whether or not to wrap the results in an array.

              -

              If wrap is set to false, and no results are found, undefined will be -returned (as opposed to an empty array when wrap is set to true).

              -

              If wrap is set to false and a single non-array result is found, that -result will be the only item returned (not within an array).

              -

              An array will still be returned if multiple results are found, however. -To avoid ambiguities (in the case where it is necessary to distinguish -between a result which is a failure and one which is an empty array), -it is recommended to switch the default to false.

              -
              true
              -
              - -
              diff --git a/docs/ts/interfaces/jsonpath-browser.JSONPathOptions.html b/docs/ts/interfaces/jsonpath-browser.JSONPathOptions.html new file mode 100644 index 00000000..c4e4bd4c --- /dev/null +++ b/docs/ts/interfaces/jsonpath-browser.JSONPathOptions.html @@ -0,0 +1,130 @@ +JSONPathOptions | jsonpath-plus
              +
              jsonpath-plus + +
                +
                +
                Preparing search index...
                +
                +
                +
                + +

                Interface JSONPathOptions

                +
                interface JSONPathOptions {
                    autostart?: boolean;
                    callback?: JSONPathCallback;
                    eval?: EvalValue;
                    flatten?: boolean;
                    ignoreEvalErrors?: boolean;
                    json?: any;
                    otherTypeCallback?: OtherTypeCallback;
                    parent?: any;
                    parentProperty?: ParentProperty;
                    path?: PathType;
                    resultType?: ResultType;
                    sandbox?: SandboxType;
                    wrap?: boolean;
                }
                +
                +
                +
                +
                Index
                +
                +
                + +
                +
                + +
                autostart?: boolean
                +
                + +
                callback?: JSONPathCallback
                +
                + +
                eval?: EvalValue
                +
                + +
                flatten?: boolean
                +
                + +
                ignoreEvalErrors?: boolean
                +
                + +
                json?: any
                +
                + +
                otherTypeCallback?: OtherTypeCallback
                +

                Defaults to +function which throws on encountering @other

                +
                +
                + +
                parent?: any
                +
                + +
                parentProperty?: ParentProperty
                +
                + +
                path?: PathType
                +
                + +
                resultType?: ResultType
                +
                + +
                sandbox?: SandboxType
                +
                + +
                wrap?: boolean
                +
                + +
                +
                diff --git a/docs/ts/interfaces/jsonpath-browser.ReturnObject.html b/docs/ts/interfaces/jsonpath-browser.ReturnObject.html new file mode 100644 index 00000000..77f2e994 --- /dev/null +++ b/docs/ts/interfaces/jsonpath-browser.ReturnObject.html @@ -0,0 +1,97 @@ +ReturnObject | jsonpath-plus
                +
                jsonpath-plus + +
                  +
                  +
                  Preparing search index...
                  +
                  +
                  +
                  + +

                  Interface ReturnObject

                  +
                  interface ReturnObject {
                      expr?: ExpressionArray;
                      hasArrExpr?: boolean;
                      isParentSelector?: boolean;
                      parent: unknown;
                      parentProperty: ParentProperty;
                      path: string | ExpressionArray;
                      pointer?: string;
                      value: unknown;
                  }
                  +
                  +
                  +
                  +
                  Index
                  +
                  +
                  + +
                  +
                  + +
                  +
                  + +
                  hasArrExpr?: boolean
                  +
                  + +
                  isParentSelector?: boolean
                  +
                  + +
                  parent: unknown
                  +
                  + +
                  parentProperty: ParentProperty
                  +
                  + +
                  path: string | ExpressionArray
                  +
                  + +
                  pointer?: string
                  +
                  + +
                  value: unknown
                  +
                  + +
                  +
                  diff --git a/docs/ts/modules.html b/docs/ts/modules.html index 452e7f95..af1027b1 100644 --- a/docs/ts/modules.html +++ b/docs/ts/modules.html @@ -1 +1,35 @@ -jsonpath-plus
                  +jsonpath-plus
                  +
                  jsonpath-plus + +
                    +
                    +
                    Preparing search index...
                    +
                    + +
                    + +
                    +
                    diff --git a/docs/ts/modules/Safe-Script.html b/docs/ts/modules/Safe-Script.html new file mode 100644 index 00000000..f4d66397 --- /dev/null +++ b/docs/ts/modules/Safe-Script.html @@ -0,0 +1,40 @@ +Safe-Script | jsonpath-plus
                    +
                    jsonpath-plus + +
                      +
                      +
                      Preparing search index...
                      +
                      +
                      +
                      + +

                      Module Safe-Script

                      +
                      +
                      SafeScript
                      +
                      +
                      AnyParameter
                      AssignmentExpression
                      Substitution
                      Substitutions
                      +
                      + +
                      +
                      diff --git a/docs/ts/modules/jsonpath-browser.html b/docs/ts/modules/jsonpath-browser.html new file mode 100644 index 00000000..41e5f44a --- /dev/null +++ b/docs/ts/modules/jsonpath-browser.html @@ -0,0 +1,48 @@ +jsonpath-browser | jsonpath-plus
                      +
                      jsonpath-plus + +
                        +
                        +
                        Preparing search index...
                        + +
                        diff --git a/docs/ts/modules/jsonpath-node-1.html b/docs/ts/modules/jsonpath-node-1.html new file mode 100644 index 00000000..e56e1ff6 --- /dev/null +++ b/docs/ts/modules/jsonpath-node-1.html @@ -0,0 +1,36 @@ +jsonpath-node | jsonpath-plus
                        +
                        jsonpath-plus + +
                          +
                          +
                          Preparing search index...
                          +
                          +
                          +
                          + +

                          Module jsonpath-node

                          +
                          +
                          AnyInput → AnyInput
                          ContextItem → ContextItem
                          EvalCallback → EvalCallback
                          EvalClass → EvalClass
                          EvaluatedResult → EvaluatedResult
                          EvalValue → EvalValue
                          ExpressionArray → ExpressionArray
                          JSONPath → JSONPath
                          JSONPathCallback → JSONPathCallback
                          JSONPathClass → JSONPathClass
                          JSONPathOptions → JSONPathOptions
                          OtherTypeCallback → OtherTypeCallback
                          ParentProperty → ParentProperty
                          ParentValue → ParentValue
                          PathType → PathType
                          PreferredOutput → PreferredOutput
                          ResultType → ResultType
                          ReturnObject → ReturnObject
                          SafeScriptType → SafeScriptType
                          SandboxCallback → SandboxCallback
                          SandboxPropertyValue → SandboxPropertyValue
                          SandboxType → SandboxType
                          ScriptType → ScriptType
                          UnknownResult → UnknownResult
                          ValueType → ValueType
                          +
                          +
                          diff --git a/docs/ts/modules/jsonpath-node.html b/docs/ts/modules/jsonpath-node.html new file mode 100644 index 00000000..8ae53b68 --- /dev/null +++ b/docs/ts/modules/jsonpath-node.html @@ -0,0 +1,36 @@ +jsonpath-node | jsonpath-plus
                          +
                          jsonpath-plus + +
                            +
                            +
                            Preparing search index...
                            +
                            +
                            +
                            + +

                            Module jsonpath-node

                            +
                            +
                            AnyInput → AnyInput
                            ContextItem → ContextItem
                            EvalCallback → EvalCallback
                            EvalClass → EvalClass
                            EvaluatedResult → EvaluatedResult
                            EvalValue → EvalValue
                            export= → jsonpath-node
                            ExpressionArray → ExpressionArray
                            JSONPath → JSONPath
                            JSONPathCallback → JSONPathCallback
                            JSONPathClass → JSONPathClass
                            JSONPathOptions → JSONPathOptions
                            OtherTypeCallback → OtherTypeCallback
                            ParentProperty → ParentProperty
                            ParentValue → ParentValue
                            PathType → PathType
                            PreferredOutput → PreferredOutput
                            ResultType → ResultType
                            ReturnObject → ReturnObject
                            SafeScriptType → SafeScriptType
                            SandboxCallback → SandboxCallback
                            SandboxPropertyValue → SandboxPropertyValue
                            SandboxType → SandboxType
                            ScriptType → ScriptType
                            UnknownResult → UnknownResult
                            ValueType → ValueType
                            +
                            +
                            diff --git a/docs/ts/modules/jsonpath.html b/docs/ts/modules/jsonpath.html new file mode 100644 index 00000000..fbd1d6be --- /dev/null +++ b/docs/ts/modules/jsonpath.html @@ -0,0 +1,48 @@ +jsonpath | jsonpath-plus
                            +
                            jsonpath-plus + +
                              +
                              +
                              Preparing search index...
                              +
                              +
                              +
                              + +

                              Module jsonpath

                              +
                              +
                              JSONPathClass
                              +
                              +
                              ScriptConstructor
                              +
                              +
                              JSONPath
                              +
                              +
                              AnyInput → AnyInput
                              ContextItem → ContextItem
                              EvalCallback → EvalCallback
                              EvalClass → EvalClass
                              EvaluatedResult → EvaluatedResult
                              EvalValue → EvalValue
                              ExpressionArray → ExpressionArray
                              JSONPathCallback → JSONPathCallback
                              JSONPathOptions → JSONPathOptions
                              OtherTypeCallback → OtherTypeCallback
                              ParentProperty → ParentProperty
                              ParentValue → ParentValue
                              PathType → PathType
                              PreferredOutput → PreferredOutput
                              ResultType → ResultType
                              ReturnObject → ReturnObject
                              SafeScriptType → SafeScriptType
                              SandboxCallback → SandboxCallback
                              SandboxPropertyValue → SandboxPropertyValue
                              SandboxType → SandboxType
                              ScriptType → ScriptType
                              UnknownResult → UnknownResult
                              ValueType → ValueType
                              +
                              +
                              diff --git a/docs/ts/types/JSONPathCallback.html b/docs/ts/types/JSONPathCallback.html deleted file mode 100644 index eea3b9fe..00000000 --- a/docs/ts/types/JSONPathCallback.html +++ /dev/null @@ -1 +0,0 @@ -JSONPathCallback | jsonpath-plus

                              Type Alias JSONPathCallback

                              JSONPathCallback: (payload: any, payloadType: any, fullPayload: any) => any

                              Type declaration

                                • (payload: any, payloadType: any, fullPayload: any): any
                                • Parameters

                                  • payload: any
                                  • payloadType: any
                                  • fullPayload: any

                                  Returns any

                              diff --git a/docs/ts/types/JSONPathOtherTypeCallback.html b/docs/ts/types/JSONPathOtherTypeCallback.html deleted file mode 100644 index dce5b578..00000000 --- a/docs/ts/types/JSONPathOtherTypeCallback.html +++ /dev/null @@ -1 +0,0 @@ -JSONPathOtherTypeCallback | jsonpath-plus

                              Type Alias JSONPathOtherTypeCallback

                              JSONPathOtherTypeCallback: (...args: any[]) => void

                              Type declaration

                                • (...args: any[]): void
                                • Parameters

                                  • ...args: any[]

                                  Returns void

                              diff --git a/docs/ts/types/JSONPathType.html b/docs/ts/types/JSONPathType.html deleted file mode 100644 index e3fb1940..00000000 --- a/docs/ts/types/JSONPathType.html +++ /dev/null @@ -1 +0,0 @@ -JSONPathType | jsonpath-plus

                              Type Alias JSONPathType

                              diff --git a/docs/ts/types/Safe-Script.AnyParameter.html b/docs/ts/types/Safe-Script.AnyParameter.html new file mode 100644 index 00000000..5e111e71 --- /dev/null +++ b/docs/ts/types/Safe-Script.AnyParameter.html @@ -0,0 +1,33 @@ +AnyParameter | jsonpath-plus
                              +
                              jsonpath-plus + +
                                +
                                +
                                Preparing search index...
                                +
                                +
                                +
                                + +

                                Type Alias AnyParameter

                                +
                                AnyParameter: any
                                +
                                + +
                                +
                                diff --git a/docs/ts/types/Safe-Script.AssignmentExpression.html b/docs/ts/types/Safe-Script.AssignmentExpression.html new file mode 100644 index 00000000..e4b5bbf3 --- /dev/null +++ b/docs/ts/types/Safe-Script.AssignmentExpression.html @@ -0,0 +1,33 @@ +AssignmentExpression | jsonpath-plus
                                +
                                jsonpath-plus + +
                                  +
                                  +
                                  Preparing search index...
                                  +
                                  +
                                  +
                                  + +

                                  Type Alias AssignmentExpression

                                  +
                                  AssignmentExpression: any
                                  +
                                  + +
                                  +
                                  diff --git a/docs/ts/types/Safe-Script.Substitution.html b/docs/ts/types/Safe-Script.Substitution.html new file mode 100644 index 00000000..868e9297 --- /dev/null +++ b/docs/ts/types/Safe-Script.Substitution.html @@ -0,0 +1,33 @@ +Substitution | jsonpath-plus
                                  +
                                  jsonpath-plus + +
                                    +
                                    +
                                    Preparing search index...
                                    +
                                    +
                                    +
                                    + +

                                    Type Alias Substitution

                                    +
                                    Substitution: any
                                    +
                                    + +
                                    +
                                    diff --git a/docs/ts/types/Safe-Script.Substitutions.html b/docs/ts/types/Safe-Script.Substitutions.html new file mode 100644 index 00000000..24963959 --- /dev/null +++ b/docs/ts/types/Safe-Script.Substitutions.html @@ -0,0 +1,33 @@ +Substitutions | jsonpath-plus
                                    +
                                    jsonpath-plus + +
                                      +
                                      +
                                      Preparing search index...
                                      +
                                      +
                                      +
                                      + +

                                      Type Alias Substitutions

                                      +
                                      Substitutions: Record<string, Substitution>
                                      +
                                      + +
                                      +
                                      diff --git a/docs/ts/types/jsonpath-browser.AnyInput.html b/docs/ts/types/jsonpath-browser.AnyInput.html new file mode 100644 index 00000000..0988bb78 --- /dev/null +++ b/docs/ts/types/jsonpath-browser.AnyInput.html @@ -0,0 +1,33 @@ +AnyInput | jsonpath-plus
                                      +
                                      jsonpath-plus + +
                                        +
                                        +
                                        Preparing search index...
                                        +
                                        +
                                        +
                                        + +

                                        Type Alias AnyInput

                                        +
                                        AnyInput: any
                                        +
                                        + +
                                        +
                                        diff --git a/docs/ts/types/jsonpath-browser.ConditionCallback.html b/docs/ts/types/jsonpath-browser.ConditionCallback.html new file mode 100644 index 00000000..1778bdd6 --- /dev/null +++ b/docs/ts/types/jsonpath-browser.ConditionCallback.html @@ -0,0 +1,49 @@ +ConditionCallback | jsonpath-plus
                                        +
                                        jsonpath-plus + +
                                          +
                                          +
                                          Preparing search index...
                                          +
                                          +
                                          +
                                          + +

                                          Type Alias ConditionCallback<T>

                                          +
                                          ConditionCallback: (item: T) => boolean
                                          +
                                          +

                                          Type Parameters

                                          +
                                            +
                                          • T
                                          +
                                          +

                                          Type Declaration

                                          +
                                            +
                                          • +
                                              +
                                            • (item: T): boolean
                                            • +
                                            • +
                                              +

                                              Parameters

                                              +
                                                +
                                              • item: T
                                              +

                                              Returns boolean

                                          +
                                          + +
                                          +
                                          diff --git a/docs/ts/types/jsonpath-browser.ContextItem.html b/docs/ts/types/jsonpath-browser.ContextItem.html new file mode 100644 index 00000000..8f33d7c5 --- /dev/null +++ b/docs/ts/types/jsonpath-browser.ContextItem.html @@ -0,0 +1,33 @@ +ContextItem | jsonpath-plus
                                          +
                                          jsonpath-plus + +
                                            +
                                            +
                                            Preparing search index...
                                            +
                                            +
                                            +
                                            + +

                                            Type Alias ContextItem

                                            +
                                            ContextItem: any
                                            +
                                            + +
                                            +
                                            diff --git a/docs/ts/types/jsonpath-browser.EvalCallback.html b/docs/ts/types/jsonpath-browser.EvalCallback.html new file mode 100644 index 00000000..7a8dd677 --- /dev/null +++ b/docs/ts/types/jsonpath-browser.EvalCallback.html @@ -0,0 +1,46 @@ +EvalCallback | jsonpath-plus
                                            +
                                            jsonpath-plus + +
                                              +
                                              +
                                              Preparing search index...
                                              +
                                              +
                                              +
                                              + +

                                              Type Alias EvalCallback

                                              +
                                              EvalCallback: (code: string, context: ContextItem) => EvaluatedResult
                                              +
                                              +

                                              Type Declaration

                                              +
                                              +
                                              + +
                                              +
                                              diff --git a/docs/ts/types/jsonpath-browser.EvalClass.html b/docs/ts/types/jsonpath-browser.EvalClass.html new file mode 100644 index 00000000..571a30ec --- /dev/null +++ b/docs/ts/types/jsonpath-browser.EvalClass.html @@ -0,0 +1,33 @@ +EvalClass | jsonpath-plus
                                              +
                                              jsonpath-plus + +
                                                +
                                                +
                                                Preparing search index...
                                                +
                                                +
                                                +
                                                + +

                                                Type Alias EvalClass

                                                +
                                                +
                                                + +
                                                +
                                                diff --git a/docs/ts/types/jsonpath-browser.EvalValue.html b/docs/ts/types/jsonpath-browser.EvalValue.html new file mode 100644 index 00000000..526b26d0 --- /dev/null +++ b/docs/ts/types/jsonpath-browser.EvalValue.html @@ -0,0 +1,33 @@ +EvalValue | jsonpath-plus
                                                +
                                                jsonpath-plus + +
                                                  +
                                                  +
                                                  Preparing search index...
                                                  +
                                                  +
                                                  +
                                                  + +

                                                  Type Alias EvalValue

                                                  +
                                                  EvalValue: EvalCallback | EvalClass | "safe" | "native" | boolean
                                                  +
                                                  + +
                                                  +
                                                  diff --git a/docs/ts/types/jsonpath-browser.EvaluatedResult.html b/docs/ts/types/jsonpath-browser.EvaluatedResult.html new file mode 100644 index 00000000..cbabd675 --- /dev/null +++ b/docs/ts/types/jsonpath-browser.EvaluatedResult.html @@ -0,0 +1,33 @@ +EvaluatedResult | jsonpath-plus
                                                  +
                                                  jsonpath-plus + +
                                                    +
                                                    +
                                                    Preparing search index...
                                                    +
                                                    +
                                                    +
                                                    + +

                                                    Type Alias EvaluatedResult

                                                    +
                                                    EvaluatedResult: any
                                                    +
                                                    + +
                                                    +
                                                    diff --git a/docs/ts/types/jsonpath-browser.ExpressionArray.html b/docs/ts/types/jsonpath-browser.ExpressionArray.html new file mode 100644 index 00000000..0fc6571f --- /dev/null +++ b/docs/ts/types/jsonpath-browser.ExpressionArray.html @@ -0,0 +1,33 @@ +ExpressionArray | jsonpath-plus
                                                    +
                                                    jsonpath-plus + +
                                                      +
                                                      +
                                                      Preparing search index...
                                                      +
                                                      +
                                                      +
                                                      + +

                                                      Type Alias ExpressionArray

                                                      +
                                                      ExpressionArray: (string | number)[]
                                                      +
                                                      + +
                                                      +
                                                      diff --git a/docs/ts/types/jsonpath-browser.JSONPathCallback.html b/docs/ts/types/jsonpath-browser.JSONPathCallback.html new file mode 100644 index 00000000..ed5bb18e --- /dev/null +++ b/docs/ts/types/jsonpath-browser.JSONPathCallback.html @@ -0,0 +1,50 @@ +JSONPathCallback | jsonpath-plus
                                                      +
                                                      jsonpath-plus + +
                                                        +
                                                        +
                                                        Preparing search index...
                                                        +
                                                        +
                                                        +
                                                        + +

                                                        Type Alias JSONPathCallback

                                                        +
                                                        JSONPathCallback: (
                                                            preferredOutput: any,
                                                            type: "value" | "property",
                                                            fullRetObj: ReturnObject,
                                                        ) => void
                                                        +
                                                        +

                                                        Type Declaration

                                                        +
                                                          +
                                                        • +
                                                            +
                                                          • (
                                                                preferredOutput: any,
                                                                type: "value" | "property",
                                                                fullRetObj: ReturnObject,
                                                            ): void
                                                          • +
                                                          • +
                                                            +

                                                            Parameters

                                                            +
                                                              +
                                                            • preferredOutput: any +

                                                              Using any type instead of PreferredOutput so +that user can supply flexible type

                                                              +
                                                            • +
                                                            • type: "value" | "property"
                                                            • +
                                                            • fullRetObj: ReturnObject
                                                            +

                                                            Returns void

                                                        +
                                                        + +
                                                        +
                                                        diff --git a/docs/ts/types/jsonpath-browser.OtherTypeCallback.html b/docs/ts/types/jsonpath-browser.OtherTypeCallback.html new file mode 100644 index 00000000..c1413cb6 --- /dev/null +++ b/docs/ts/types/jsonpath-browser.OtherTypeCallback.html @@ -0,0 +1,48 @@ +OtherTypeCallback | jsonpath-plus
                                                        +
                                                        jsonpath-plus + +
                                                          +
                                                          +
                                                          Preparing search index...
                                                          +
                                                          +
                                                          +
                                                          + +

                                                          Type Alias OtherTypeCallback

                                                          +
                                                          OtherTypeCallback: (
                                                              val: unknown,
                                                              path: ExpressionArray,
                                                              parent: ParentValue,
                                                              parentPropName: string | null,
                                                          ) => boolean
                                                          +
                                                          +

                                                          Type Declaration

                                                          +
                                                            +
                                                          • +
                                                              +
                                                            • (
                                                                  val: unknown,
                                                                  path: ExpressionArray,
                                                                  parent: ParentValue,
                                                                  parentPropName: string | null,
                                                              ): boolean
                                                            • +
                                                            • +
                                                              +

                                                              Parameters

                                                              +
                                                              +

                                                              Returns boolean

                                                          +
                                                          + +
                                                          +
                                                          diff --git a/docs/ts/types/jsonpath-browser.ParentProperty.html b/docs/ts/types/jsonpath-browser.ParentProperty.html new file mode 100644 index 00000000..3f1e2ccf --- /dev/null +++ b/docs/ts/types/jsonpath-browser.ParentProperty.html @@ -0,0 +1,33 @@ +ParentProperty | jsonpath-plus
                                                          +
                                                          jsonpath-plus + +
                                                            +
                                                            +
                                                            Preparing search index...
                                                            +
                                                            +
                                                            +
                                                            + +

                                                            Type Alias ParentProperty

                                                            +
                                                            ParentProperty: string | number | null
                                                            +
                                                            + +
                                                            +
                                                            diff --git a/docs/ts/types/jsonpath-browser.ParentValue.html b/docs/ts/types/jsonpath-browser.ParentValue.html new file mode 100644 index 00000000..79b7d811 --- /dev/null +++ b/docs/ts/types/jsonpath-browser.ParentValue.html @@ -0,0 +1,33 @@ +ParentValue | jsonpath-plus
                                                            +
                                                            jsonpath-plus + +
                                                              +
                                                              +
                                                              Preparing search index...
                                                              +
                                                              +
                                                              +
                                                              + +

                                                              Type Alias ParentValue

                                                              +
                                                              ParentValue: unknown
                                                              +
                                                              + +
                                                              +
                                                              diff --git a/docs/ts/types/jsonpath-browser.PathType.html b/docs/ts/types/jsonpath-browser.PathType.html new file mode 100644 index 00000000..6a1029e9 --- /dev/null +++ b/docs/ts/types/jsonpath-browser.PathType.html @@ -0,0 +1,33 @@ +PathType | jsonpath-plus
                                                              +
                                                              jsonpath-plus + +
                                                                +
                                                                +
                                                                Preparing search index...
                                                                +
                                                                +
                                                                +
                                                                + +

                                                                Type Alias PathType

                                                                +
                                                                PathType: string | string[]
                                                                +
                                                                + +
                                                                +
                                                                diff --git a/docs/ts/types/jsonpath-browser.PreferredOutput.html b/docs/ts/types/jsonpath-browser.PreferredOutput.html new file mode 100644 index 00000000..6679e6fc --- /dev/null +++ b/docs/ts/types/jsonpath-browser.PreferredOutput.html @@ -0,0 +1,33 @@ +PreferredOutput | jsonpath-plus
                                                                +
                                                                jsonpath-plus + +
                                                                  +
                                                                  +
                                                                  Preparing search index...
                                                                  +
                                                                  +
                                                                  +
                                                                  + +

                                                                  Type Alias PreferredOutput

                                                                  +
                                                                  PreferredOutput:
                                                                      | ReturnObject
                                                                      | string
                                                                      | number
                                                                      | boolean
                                                                      | null
                                                                      | unknown[]
                                                                      | Record<string, unknown>
                                                                  +
                                                                  + +
                                                                  +
                                                                  diff --git a/docs/ts/types/jsonpath-browser.ResultType.html b/docs/ts/types/jsonpath-browser.ResultType.html new file mode 100644 index 00000000..6e6c40f5 --- /dev/null +++ b/docs/ts/types/jsonpath-browser.ResultType.html @@ -0,0 +1,33 @@ +ResultType | jsonpath-plus
                                                                  +
                                                                  jsonpath-plus + +
                                                                    +
                                                                    +
                                                                    Preparing search index...
                                                                    +
                                                                    +
                                                                    +
                                                                    + +

                                                                    Type Alias ResultType

                                                                    +
                                                                    ResultType: "value" | "path" | "pointer" | "parent" | "parentProperty" | "all"
                                                                    +
                                                                    + +
                                                                    +
                                                                    diff --git a/docs/ts/types/jsonpath-browser.SafeScriptType.html b/docs/ts/types/jsonpath-browser.SafeScriptType.html new file mode 100644 index 00000000..091b51ee --- /dev/null +++ b/docs/ts/types/jsonpath-browser.SafeScriptType.html @@ -0,0 +1,38 @@ +SafeScriptType | jsonpath-plus
                                                                    +
                                                                    jsonpath-plus + +
                                                                      +
                                                                      +
                                                                      Preparing search index...
                                                                      +
                                                                      +
                                                                      +
                                                                      + +

                                                                      Type Alias SafeScriptType

                                                                      +
                                                                      SafeScriptType: { Script: ScriptConstructor }
                                                                      +
                                                                      +

                                                                      Type Declaration

                                                                      +
                                                                      +
                                                                      + +
                                                                      +
                                                                      diff --git a/docs/ts/types/jsonpath-browser.SandboxCallback.html b/docs/ts/types/jsonpath-browser.SandboxCallback.html new file mode 100644 index 00000000..70ba4691 --- /dev/null +++ b/docs/ts/types/jsonpath-browser.SandboxCallback.html @@ -0,0 +1,45 @@ +SandboxCallback | jsonpath-plus
                                                                      +
                                                                      jsonpath-plus + +
                                                                        +
                                                                        +
                                                                        Preparing search index...
                                                                        +
                                                                        +
                                                                        +
                                                                        + +

                                                                        Type Alias SandboxCallback

                                                                        +
                                                                        SandboxCallback: (...args: any[]) => any
                                                                        +
                                                                        +

                                                                        Type Declaration

                                                                        +
                                                                          +
                                                                        • +
                                                                            +
                                                                          • (...args: any[]): any
                                                                          • +
                                                                          • +
                                                                            +

                                                                            Parameters

                                                                            +
                                                                              +
                                                                            • ...args: any[]
                                                                            +

                                                                            Returns any

                                                                        +
                                                                        + +
                                                                        +
                                                                        diff --git a/docs/ts/types/jsonpath-browser.SandboxPropertyValue.html b/docs/ts/types/jsonpath-browser.SandboxPropertyValue.html new file mode 100644 index 00000000..12c2cc28 --- /dev/null +++ b/docs/ts/types/jsonpath-browser.SandboxPropertyValue.html @@ -0,0 +1,33 @@ +SandboxPropertyValue | jsonpath-plus
                                                                        +
                                                                        jsonpath-plus + +
                                                                          +
                                                                          +
                                                                          Preparing search index...
                                                                          +
                                                                          +
                                                                          +
                                                                          + +

                                                                          Type Alias SandboxPropertyValue

                                                                          +
                                                                          SandboxPropertyValue: any | SandboxCallback
                                                                          +
                                                                          + +
                                                                          +
                                                                          diff --git a/docs/ts/types/jsonpath-browser.SandboxType.html b/docs/ts/types/jsonpath-browser.SandboxType.html new file mode 100644 index 00000000..1f540a96 --- /dev/null +++ b/docs/ts/types/jsonpath-browser.SandboxType.html @@ -0,0 +1,50 @@ +SandboxType | jsonpath-plus
                                                                          +
                                                                          jsonpath-plus + +
                                                                            +
                                                                            +
                                                                            Preparing search index...
                                                                            +
                                                                            +
                                                                            +
                                                                            + +

                                                                            Type Alias SandboxType

                                                                            +
                                                                            SandboxType: {
                                                                                _$_parent?: ParentValue;
                                                                                _$_parentProperty?: ParentProperty;
                                                                                _$_path?: string;
                                                                                _$_property?: string | number;
                                                                                _$_root?: AnyInput;
                                                                                _$_v?: unknown;
                                                                                [key: string]: any;
                                                                            }
                                                                            +
                                                                            +

                                                                            Type Declaration

                                                                            +
                                                                              +
                                                                            • +
                                                                              [key: string]: any
                                                                            • +
                                                                            • +
                                                                              Optional_$_parent?: ParentValue
                                                                            • +
                                                                            • +
                                                                              Optional_$_parentProperty?: ParentProperty
                                                                            • +
                                                                            • +
                                                                              Optional_$_path?: string
                                                                            • +
                                                                            • +
                                                                              Optional_$_property?: string | number
                                                                            • +
                                                                            • +
                                                                              Optional_$_root?: AnyInput
                                                                            • +
                                                                            • +
                                                                              Optional_$_v?: unknown
                                                                            +
                                                                            + +
                                                                            +
                                                                            diff --git a/docs/ts/types/jsonpath-browser.ScriptType.html b/docs/ts/types/jsonpath-browser.ScriptType.html new file mode 100644 index 00000000..9e4851a6 --- /dev/null +++ b/docs/ts/types/jsonpath-browser.ScriptType.html @@ -0,0 +1,38 @@ +ScriptType | jsonpath-plus
                                                                            +
                                                                            jsonpath-plus + +
                                                                              +
                                                                              +
                                                                              Preparing search index...
                                                                              +
                                                                              +
                                                                              +
                                                                              + +

                                                                              Type Alias ScriptType

                                                                              +
                                                                              ScriptType: { Script: ScriptConstructor }
                                                                              +
                                                                              +

                                                                              Type Declaration

                                                                              +
                                                                              +
                                                                              + +
                                                                              +
                                                                              diff --git a/docs/ts/types/jsonpath-browser.UnknownResult.html b/docs/ts/types/jsonpath-browser.UnknownResult.html new file mode 100644 index 00000000..bf20dcef --- /dev/null +++ b/docs/ts/types/jsonpath-browser.UnknownResult.html @@ -0,0 +1,33 @@ +UnknownResult | jsonpath-plus
                                                                              +
                                                                              jsonpath-plus + +
                                                                                +
                                                                                +
                                                                                Preparing search index...
                                                                                +
                                                                                +
                                                                                +
                                                                                + +

                                                                                Type Alias UnknownResult

                                                                                +
                                                                                UnknownResult: unknown
                                                                                +
                                                                                + +
                                                                                +
                                                                                diff --git a/docs/ts/types/jsonpath-browser.ValueType.html b/docs/ts/types/jsonpath-browser.ValueType.html new file mode 100644 index 00000000..75af2c12 --- /dev/null +++ b/docs/ts/types/jsonpath-browser.ValueType.html @@ -0,0 +1,33 @@ +ValueType | jsonpath-plus
                                                                                +
                                                                                jsonpath-plus + +
                                                                                  +
                                                                                  +
                                                                                  Preparing search index...
                                                                                  +
                                                                                  +
                                                                                  +
                                                                                  + +

                                                                                  Type Alias ValueType

                                                                                  +
                                                                                  ValueType:
                                                                                      | "scalar"
                                                                                      | "boolean"
                                                                                      | "string"
                                                                                      | "undefined"
                                                                                      | "function"
                                                                                      | "integer"
                                                                                      | "number"
                                                                                      | "nonFinite"
                                                                                      | "object"
                                                                                      | "array"
                                                                                      | "other"
                                                                                      | "null"
                                                                                  +
                                                                                  + +
                                                                                  +
                                                                                  diff --git a/docs/ts/types/jsonpath.ScriptConstructor.html b/docs/ts/types/jsonpath.ScriptConstructor.html new file mode 100644 index 00000000..f5b59ab3 --- /dev/null +++ b/docs/ts/types/jsonpath.ScriptConstructor.html @@ -0,0 +1,33 @@ +ScriptConstructor | jsonpath-plus
                                                                                  +
                                                                                  jsonpath-plus + +
                                                                                    +
                                                                                    +
                                                                                    Preparing search index...
                                                                                    +
                                                                                    +
                                                                                    +
                                                                                    + +

                                                                                    Type Alias ScriptConstructor

                                                                                    +
                                                                                    ScriptConstructor: new (
                                                                                        expr: string,
                                                                                    ) => { runInNewContext: (context: object) => EvaluatedResult }
                                                                                    +
                                                                                    + +
                                                                                    +
                                                                                    diff --git a/eslint.config.js b/eslint.config.js index bbda9fee..0dc98567 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,6 +1,6 @@ import ashNazg from 'eslint-config-ash-nazg'; -export default [ +export default /** @type {import('eslint').Linter.Config} */ ([ { ignores: [ '.github', @@ -32,11 +32,11 @@ export default [ { files: ['*.md/*.js', '*.md/*.html'], rules: { - 'import/unambiguous': 0, - 'import/no-commonjs': 0, - 'import/no-unresolved': ['error', { - ignore: ['jsonpath-plus'] - }], + 'import-x/unambiguous': 0, + 'import-x/no-commonjs': 0, + // 'import-x/no-unresolved': ['error', { + // ignore: ['jsonpath-plus'] + // }], 'sonarjs/no-internal-api-use': 0, 'no-multiple-empty-lines': ['error', { max: 1, maxEOF: 2, maxBOF: 2 @@ -45,7 +45,7 @@ export default [ 'no-unused-vars': ['error', { varsIgnorePattern: 'json|result' }], - 'import/no-extraneous-dependencies': 0, + 'import-x/no-extraneous-dependencies': 0, 'n/no-extraneous-import': ['error', { allowModules: ['jsonpath-plus'] }], @@ -66,20 +66,26 @@ export default [ globals: { assert: 'readonly', expect: 'readonly', - jsonpath: 'readonly' + jsonpath: 'readonly', + JSONPath: 'readonly', + JSONPathClass: 'readonly' } }, rules: { '@stylistic/quotes': 0, '@stylistic/quote-props': 0, - 'import/unambiguous': 0, + 'import-x/unambiguous': 0, + // Not DOM here + 'unicorn/better-dom-traversing': 0, // Todo: Reenable '@stylistic/max-len': 0 } }, { rules: { - '@stylistic/indent': ['error', 4, {outerIIFEBody: 0}], + '@stylistic/indent': ['error', 4, { + SwitchCase: 0, outerIIFEBody: 0 + }], 'promise/prefer-await-to-callbacks': 0, // Disable for now @@ -92,4 +98,4 @@ export default [ 'unicorn/prefer-spread': 0 } } -]; +]); diff --git a/package.json b/package.json index 808ac423..f06c8e3e 100644 --- a/package.json +++ b/package.json @@ -11,17 +11,29 @@ "exports": { "./package.json": "./package.json", ".": { - "types": "./src/jsonpath.d.ts", - "browser": "./dist/index-browser-esm.js", - "umd": "./dist/index-browser-umd.cjs", - "import": "./dist/index-node-esm.js", - "require": "./dist/index-node-cjs.cjs", - "default": "./dist/index-browser-esm.js" + "browser": { + "types": "./dist/jsonpath-browser.d.ts", + "default": "./dist/index-browser-esm.js" + }, + "umd": { + "types": "./dist/jsonpath-browser.d.ts", + "default": "./dist/index-browser-umd.cjs" + }, + "import": { + "types": "./dist/jsonpath-node.d.ts", + "default": "./dist/index-node-esm.js" + }, + "require": { + "types": "./dist/jsonpath-node.d.cts", + "default": "./dist/index-node-cjs.cjs" + }, + "default": { + "types": "./dist/jsonpath.d.ts", + "default": "./dist/index-browser-esm.js" + } } }, - "module": "dist/index-node-esm.js", - "browser": "dist/index-browser-esm.js", - "types": "./src/jsonpath.d.ts", + "types": "./dist/jsonpath.d.ts", "description": "A JS implementation of JSONPath with some additional operators", "contributors": [ { @@ -68,25 +80,29 @@ "jsep": "^1.4.0" }, "devDependencies": { - "@babel/core": "^7.28.5", - "@babel/preset-env": "^7.28.5", - "@rollup/plugin-babel": "^6.1.0", + "@arethetypeswrong/cli": "^0.18.5", + "@babel/core": "^8.0.1", + "@babel/preset-env": "^8.0.2", + "@rollup/plugin-babel": "^7.1.0", "@rollup/plugin-node-resolve": "^16.0.3", - "@rollup/plugin-terser": "^0.4.4", - "c8": "^10.1.3", - "chai": "^6.2.1", + "@rollup/plugin-terser": "^1.0.0", + "@types/chai": "^5.2.3", + "@types/mocha": "^10.0.10", + "@types/node": "^26.2.0", + "c8": "^12.0.0", + "chai": "^6.2.2", "coveradge": "^0.8.2", - "eslint": "^9.39.1", - "eslint-config-ash-nazg": "^39.8.0", + "eslint": "^10.8.1", + "eslint-config-ash-nazg": "^42.4.0", "http-server": "^14.1.1", - "license-badger": "^0.22.1", - "mocha": "^11.7.5", + "license-badger": "^0.23.0", + "mocha": "^11.8.0", "mocha-badge-generator": "^0.11.0", "mocha-multi-reporters": "^1.5.1", - "open-cli": "^8.0.0", - "rollup": "4.59.0", - "typedoc": "^0.28.14", - "typescript": "^5.9.3" + "open-cli": "^9.0.0", + "rollup": "4.62.4", + "typedoc": "^0.28.20", + "typescript": "^6.0.3" }, "keywords": [ "json", @@ -103,8 +119,8 @@ ], "exclude": [ ".mocharc.cjs", + ".ncurc.cjs", "eslint.config.js", - "src/jsonpath.d.ts", "rollup.config.js", ".idea", "coverage", @@ -117,7 +133,8 @@ ] }, "scripts": { - "prepublishOnly": "pnpm i", + "prepublishOnly": "pnpm i && npm run build && npm run build-docs", + "attw": "attw --pack .", "license-badge": "license-badger --corrections --uncategorizedLicenseTemplate \"\\${license} (\\${name} (\\${version}))\" --filteredTypes=nonempty --textTemplate \"License types\n(project, deps, and bundled devDeps)\" --packageJson --production badges/licenses-badge.svg", "license-badge-dev": "license-badger --corrections --filteredTypes=nonempty --textTemplate \"License types\n(all devDeps)\" --allDevelopment badges/licenses-badge-dev.svg", "license-badges": "npm run license-badge && npm run license-badge-dev", @@ -125,17 +142,20 @@ "open-docs": "open-cli http://localhost:8084/docs/ts/ && npm start", "coverage": "open-cli http://localhost:8084/coverage/ && npm start", "coverage-badge": "coveradge badges/coverage-badge.svg", - "node-import-test": "node --experimental-modules demo/node-import-test.mjs", + "node-import-test": "node demo/node-import-test.js", "open": "open-cli http://localhost:8084/demo/ && npm start", "start": "http-server -p 8084", "cli": "./bin/jsonpath-cli.js package.json name", - "typescript": "tsc", + "tsc-demo": "tsc -p demo/tsconfig.json", + "tsc-prod": "tsc -p tsconfig-prod.json", + "tsc": "tsc", "mocha": "mocha --require test-helpers/node-env.js --reporter-options configFile=mocha-multi-reporters.json test", "c8": "rm -Rf ./coverage && rm -Rf ./node_modules/.cache && c8 --all npm run mocha && npm run coverage-badge", "rollup": "rollup -c", + "build": "npm run rollup && npm run tsc-prod && npm run tsc-demo", "eslint": "eslint .", - "lint": "npm run eslint", - "test": "npm run eslint && npm run rollup && npm run c8 && npm run typescript", + "lint": "npm run eslint --", + "test": "npm run eslint && npm run rollup && npm run c8 && npm run tsc", "browser-test": "npm run eslint && npm run rollup && open-cli http://localhost:8084/test/ && npm start" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index acfef52f..894c8642 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,610 +18,626 @@ importers: specifier: ^1.4.0 version: 1.4.0 devDependencies: + '@arethetypeswrong/cli': + specifier: ^0.18.5 + version: 0.18.5 '@babel/core': - specifier: ^7.28.5 - version: 7.28.5 + specifier: ^8.0.1 + version: 8.0.1 '@babel/preset-env': - specifier: ^7.28.5 - version: 7.28.5(@babel/core@7.28.5) + specifier: ^8.0.2 + version: 8.0.2(@babel/core@8.0.1) '@rollup/plugin-babel': - specifier: ^6.1.0 - version: 6.1.0(@babel/core@7.28.5)(rollup@4.59.0) + specifier: ^7.1.0 + version: 7.1.0(@babel/core@8.0.1)(rollup@4.62.4)(supports-color@8.1.1) '@rollup/plugin-node-resolve': specifier: ^16.0.3 - version: 16.0.3(rollup@4.59.0) + version: 16.0.3(rollup@4.62.4) '@rollup/plugin-terser': - specifier: ^0.4.4 - version: 0.4.4(rollup@4.59.0) + specifier: ^1.0.0 + version: 1.0.0(rollup@4.62.4) + '@types/chai': + specifier: ^5.2.3 + version: 5.2.3 + '@types/mocha': + specifier: ^10.0.10 + version: 10.0.10 + '@types/node': + specifier: ^26.2.0 + version: 26.2.0 c8: - specifier: ^10.1.3 - version: 10.1.3 + specifier: ^12.0.0 + version: 12.0.0 chai: - specifier: ^6.2.1 - version: 6.2.1 + specifier: ^6.2.2 + version: 6.2.2 coveradge: specifier: ^0.8.2 version: 0.8.2 eslint: - specifier: ^9.39.1 - version: 9.39.1 + specifier: ^10.8.1 + version: 10.8.1(supports-color@8.1.1) eslint-config-ash-nazg: - specifier: ^39.8.0 - version: 39.8.0(@babel/core@7.28.5)(eslint@9.39.1)(typescript@5.9.3) + specifier: ^42.4.0 + version: 42.4.0(@babel/core@8.0.1)(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint-plugin-import@2.32.0)(eslint@10.8.1(supports-color@8.1.1))(supports-color@8.1.1)(ts-declaration-location@1.0.7(typescript@6.0.3))(typescript@6.0.3) http-server: specifier: ^14.1.1 - version: 14.1.1 + version: 14.1.1(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1) license-badger: - specifier: ^0.22.1 - version: 0.22.1 + specifier: ^0.23.0 + version: 0.23.0(supports-color@8.1.1) mocha: - specifier: ^11.7.5 - version: 11.7.5 + specifier: ^11.8.0 + version: 11.8.0 mocha-badge-generator: specifier: ^0.11.0 version: 0.11.0 mocha-multi-reporters: specifier: ^1.5.1 - version: 1.5.1(mocha@11.7.5) + version: 1.5.1(mocha@11.8.0)(supports-color@8.1.1) open-cli: - specifier: ^8.0.0 - version: 8.0.0 + specifier: ^9.0.0 + version: 9.0.0(supports-color@8.1.1) rollup: - specifier: 4.59.0 - version: 4.59.0 + specifier: 4.62.4 + version: 4.62.4 typedoc: - specifier: ^0.28.14 - version: 0.28.14(typescript@5.9.3) + specifier: ^0.28.20 + version: 0.28.20(typescript@6.0.3) typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.3 + version: 6.0.3 packages: - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} - engines: {node: '>=6.9.0'} + '@andrewbranch/untar.js@1.0.3': + resolution: {integrity: sha512-Jh15/qVmrLGhkKJBdXlK1+9tY4lZruYjsgkDFj08ZmDiWVBLJcqkok7Z0/R0In+i1rScBpJlSvrTS2Lm41Pbnw==} + + '@arethetypeswrong/cli@0.18.5': + resolution: {integrity: sha512-gM+8vRsQOD/Uc7EnBedUhkG5OCsDWE4uoak5QvomGpMpaky0Eh41p04nIMgrWb8EOmqZUJGc6zz9hsP6E56R7g==} + engines: {node: '>=20'} + hasBin: true + + '@arethetypeswrong/core@0.18.5': + resolution: {integrity: sha512-9ytjzGwxjm9Uz7I9avfbt5vlQt6uk9uRRESzJjqrznl6WKvI6dwYTo+vJ3U02Wrq/mR3iql/PzhvHhKdJIAjDQ==} + engines: {node: '>=20'} '@babel/code-frame@7.29.0': resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.28.5': - resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} - engines: {node: '>=6.9.0'} + '@babel/code-frame@8.0.0': + resolution: {integrity: sha512-dYYg153EyN2Ekbqw2zAsbd6/JR+9N2SEoC7YV2GyyqMM7x9bLDTjBD6XBhSMLH0wtIVyJj03jWNriQhaN+eoCw==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/core@7.28.5': - resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} - engines: {node: '>=6.9.0'} + '@babel/compat-data@8.0.0': + resolution: {integrity: sha512-DOjnob/cXOUgDOozCDeq/aK2p5y8dUIVdf6tNhEV1HQRd6I8aQ4f4fbtHRVEvb6lP3BGomrKHiS8ICAASSVQSw==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/eslint-parser@7.28.5': - resolution: {integrity: sha512-fcdRcWahONYo+JRnJg1/AekOacGvKx12Gu0qXJXFi2WBqQA1i7+O5PaxRB7kxE/Op94dExnCiiar6T09pvdHpA==} - engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} - peerDependencies: - '@babel/core': ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 + '@babel/core@8.0.1': + resolution: {integrity: sha512-5FgxM4dLQpMJHSiVATk8foW263dVHQHBVpXYiimNECVWG01f4nFyEbQixeT6Mwvg7TayREJ2gpKl3o2RoMdnqw==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/eslint-plugin@7.27.1': - resolution: {integrity: sha512-vOG/EipZbIAcREK6XI4JRO3B3uZr70/KIhsrNLO9RXcgLMaW0sTsBpNeTpQUyelB0HsbWd45NIsuTgD3mqr/Og==} - engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + '@babel/eslint-parser@8.0.1': + resolution: {integrity: sha512-2javO8pAQv/ld6sS6OcxoLAlzZEZy+xm99bnoAfMhzKSumKhdF5wylpbZB7XTorWr3KLPtx5K95eduJPOy1mzA==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/eslint-parser': ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 + '@babel/core': ^8.0.0 + eslint: ^9.0.0 || ^10.0.0 - '@babel/generator@7.28.5': - resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} - engines: {node: '>=6.9.0'} + '@babel/eslint-plugin@8.0.1': + resolution: {integrity: sha512-nHigH34PJCSbkPeK4PEzfwfy6O8VWfeucP2ZP8nwf0QcKZBxcX+uD6Zp8uMxrvYvWXYmlhYwU+Ix5N5TMjq3qQ==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 + '@babel/eslint-parser': ^8.0.1 + eslint: ^9.0.0 || ^10.0.0 '@babel/generator@7.29.1': resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} - engines: {node: '>=6.9.0'} + '@babel/generator@8.0.0': + resolution: {integrity: sha512-NT9NrVwJsbSV6Y2FSstWa71EETOnzrjkL5/wX3D2mYHtKM+qvqB1DvR4D0Setb/gDBsHzRICifwEWMO8CnTF6g==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@8.0.0': + resolution: {integrity: sha512-NSpMkMsvvZqzThJ0p1B02cbtA2ObEyfBvq950bmNkyxsxvcxwhvvCB036rKhlEnuBBo30bOrk13u3FzlKSoRrw==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helper-create-class-features-plugin@7.28.5': - resolution: {integrity: sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@8.0.0': + resolution: {integrity: sha512-JwculLABZvyPvyLBpwU/E/IbH2uM3mnxNtIJpxnIfb24y1PrdVxK5Dqjle4DpgqpGRnwgC7G8IkzPdSXZrO1Ew==} + engines: {node: ^22.18.0 || >=24.11.0} + + '@babel/helper-create-class-features-plugin@8.0.1': + resolution: {integrity: sha512-++t3ZktzlLmASAxIlxeXQK9Z2YwUafYGYcvGBFevqOqt16HozVHStUoQvWD09fzAZOb/uJGpUTBuGK41AJAuOA==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^8.0.0 - '@babel/helper-create-regexp-features-plugin@7.28.5': - resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} - engines: {node: '>=6.9.0'} + '@babel/helper-create-regexp-features-plugin@8.0.1': + resolution: {integrity: sha512-PydTbcVTiIfVweHMeY1u3MslaD/ZzvnaTNhJp+7ghofelLWshF66Ckc/ZsjStfvRQIKQ4uVG0yEJucyDtyrWgw==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^8.0.0 - '@babel/helper-define-polyfill-provider@0.6.5': - resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} + '@babel/helper-define-polyfill-provider@1.0.0': + resolution: {integrity: sha512-9jzVaTeZyXRDKTgUnNzcPQMO8y0ga3o+Z4fKjNet9Fcx7slgKa83qRbz0EwROSd6qO6CoEe/HQszqSPKb5lhkw==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/core': ^7.4.0 || ^8.0.0 '@babel/helper-globals@7.28.0': resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.28.5': - resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} - engines: {node: '>=6.9.0'} + '@babel/helper-globals@8.0.0': + resolution: {integrity: sha512-lLozHOM6sWWlxNo8CYqHy4MBZeTvHXNgVPBfPOGsjPKUzHC2Az9QwB6gxdQmpwHl6GlQtbGgS+lj5887guDiLw==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} - engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@8.0.0': + resolution: {integrity: sha512-xkXrMbtk87Gk7+oKBVmBc6EORg/Qwx++AHESldmHkpvG8wgccdhJJFwrzqlF382Fk8wfXhJHWE/g/43QvEGNPQ==} + engines: {node: ^22.18.0 || >=24.11.0} '@babel/helper-module-imports@7.28.6': resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.28.3': - resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-module-imports@8.0.0': + resolution: {integrity: sha512-NZ7mSS93o4ndX4KrbD7W8Sf3QT8Qe24PrnFyUcuOPDzK6faqDFKjY9RG7he7+I7FdiQ4llpnosFqzrXa+Vy3Ew==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} - engines: {node: '>=6.9.0'} + '@babel/helper-module-transforms@8.0.1': + resolution: {integrity: sha512-UgAhl1kqiW5ciE0yCXqqvnb4H2n3IELJ7lIIQRezwDPilPEZX5i+Rvbja9MFTkwUn2biEiSMeV31aUzR4Lwakw==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-optimise-call-expression@7.27.1': - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} - engines: {node: '>=6.9.0'} + '@babel/core': ^8.0.0 - '@babel/helper-plugin-utils@7.27.1': - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} - engines: {node: '>=6.9.0'} + '@babel/helper-optimise-call-expression@8.0.0': + resolution: {integrity: sha512-3W6satvtPuCUkUx63S2jMoW9EQNYkADgs1HTfufmL7gCmAulHMKupA/12WNz4A0GMMFn/YnWWwqOT9IZrJHQjg==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helper-plugin-utils@7.28.6': - resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} - engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@8.0.1': + resolution: {integrity: sha512-3PKFgjTyPlhFhorfP+SjKQxLViIL++zWjFOO4hGriYU+Bsm983DxEM1JmDRJVWXV0O9npu+xXRqz7Pbd3mh70g==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@babel/core': ^8.0.0 - '@babel/helper-remap-async-to-generator@7.27.1': - resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} - engines: {node: '>=6.9.0'} + '@babel/helper-remap-async-to-generator@8.0.1': + resolution: {integrity: sha512-baAKuLEMmu6BCSY3tuiU7qglM1qOZt6F1SrFScA241oNqksxkxfEZEKztlGRmoVns9AQ5UgArH7RsUEjxWnzgQ==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^8.0.0 - '@babel/helper-replace-supers@7.27.1': - resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} - engines: {node: '>=6.9.0'} + '@babel/helper-replace-supers@8.0.1': + resolution: {integrity: sha512-B1SZADIcy3tmH8CmWvj4SHi/oAPom4UL3uknTc2QRNsPVLFk/sPnZvQL/8kj7Y5omvjMqie0vklvs6XM4OLW5Q==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^8.0.0 - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} - engines: {node: '>=6.9.0'} + '@babel/helper-skip-transparent-expression-wrappers@8.0.0': + resolution: {integrity: sha512-xmCA9kP3IhySsqhzwIdWGlDN/1A4cCKNBO/uwZx/3YzmDoMePwno2Q5/Bq0q+tYaKbeF940YiKV/kaW8Mzvpjw==} + engines: {node: ^22.18.0 || >=24.11.0} '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@8.0.0': + resolution: {integrity: sha512-6mJgmFFFIIO82vvoLt9XtRC7/TkzXfts1t/SpRX4IHSzMgqoPYCWesVu1udUPUWioAE/2fcG6WuI8zrkE1gwrg==} + engines: {node: ^22.18.0 || >=24.11.0} + '@babel/helper-validator-identifier@7.28.5': resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@8.0.4': + resolution: {integrity: sha512-4wFaiLd0bVo4cIoTXI3zKI038NIWE/cr3jvBjejOVYVxV/m8Ltav1USiGzG1fmS5J2RhgEOgXNNK46cRPnRsrg==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helper-wrap-function@7.28.3': - resolution: {integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@8.0.0': + resolution: {integrity: sha512-U4Dybxh4WESWHt5XhBeExi4DrY0/DNK1aHpQbsrQXCUbFHuMweT0TpLEWKvaraV2Y6fS+ZXunsZ8zIuZIgvF2Q==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helpers@7.28.4': - resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} - engines: {node: '>=6.9.0'} + '@babel/helper-wrap-function@8.0.0': + resolution: {integrity: sha512-Qpm8+wi5xfDkBfollanwriCcKniFfBmMmaKB01GVM6VGzKXo1fdxosZp04qEr5HM+LKhwr3hG1yRy8+ORsficA==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/parser@7.28.5': - resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} - engines: {node: '>=6.0.0'} - hasBin: true + '@babel/helpers@8.0.0': + resolution: {integrity: sha512-wfbi91pM3py96oIiJEz7qIpyXDytgr9zQC1HEWwlGNVRAEmItuU/0a41ZUKu1sJGyhhOIpc4t5vk4PYzt8wpsg==} + engines: {node: ^22.18.0 || >=24.11.0} '@babel/parser@7.29.3': resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': - resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': - resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': - resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/parser@8.0.4': + resolution: {integrity: sha512-srpptsAkEbbNIC/q8nT7o+m6CQe8CJUTV/t7MYc9NnWlgYVtHOb7JH6SorxMhN0kuRJjVqXbKClG6xSbPtzz+g==} + engines: {node: ^22.18.0 || >=24.11.0} + hasBin: true - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': - resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} - engines: {node: '>=6.9.0'} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@8.0.1': + resolution: {integrity: sha512-Ytgjjne4RnG3Oig7ik+NfY4ebRY30BPptVkkyu1f72eINJXRM3/bkU++tIc5aPvyLmo4KH20avq0xJ2o+9aEnw==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.13.0 + '@babel/core': ^8.0.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3': - resolution: {integrity: sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==} - engines: {node: '>=6.9.0'} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@8.0.1': + resolution: {integrity: sha512-X7pAMBhuKluA7UfwZNvKN0XVVu/AGeo84Z75eJl85rcb8J2aBzLK92btahM1X5h0oi0QIrbe0qIMA/0+4Buk7w==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^8.0.0 - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@8.0.1': + resolution: {integrity: sha512-DJviKTxYfH0hFwnMiW4dnPyMGzS3Hrr4zUfXl1zwQ0QiGlGlNYklLoPSYEQr8S7nau0/K7NdQjTh0qbYuyFjCA==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-syntax-import-assertions@7.27.1': - resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} - engines: {node: '>=6.9.0'} + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@8.0.1': + resolution: {integrity: sha512-DmR/N+B9+4PbURFj4+zdnWj49/PFAnK2bn8+E4ZAmwn3J5QCxnbG7Ep6aRfz9M8Aw+rBro0kIJQycvzFpl4buQ==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-syntax-import-attributes@7.27.1': - resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} - engines: {node: '>=6.9.0'} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@8.0.1': + resolution: {integrity: sha512-x8bi0LFVD2xkULjfNn+hCMg16yAFHAM9fS/ThSFeYBi+0MP9K6qcY2BZb4urUwC7PYtEy5wPe6TKjOEjXrCGFA==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6': - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@8.0.1': + resolution: {integrity: sha512-P8+RN2n7ts2s1vnE+lXdHYf+dhnmcGSen/kWzBsVluT9Sey5AqmcRXYWlHqgQxaNlKTD5YMa1tf5z4d1v8W88w==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-arrow-functions@7.27.1': - resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-arrow-functions@8.0.1': + resolution: {integrity: sha512-o/gr7kRlq3PKLLuYth4udOsrC7geBerti+QtwPeyxMOsEQO1d8kDHqk9r2PtMx2y9i8FG7tzyTerfv1yMLSMsQ==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-async-generator-functions@7.28.0': - resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-async-generator-functions@8.0.1': + resolution: {integrity: sha512-kqnSMF1YHBzuiQrl68675i5Ma1oljvo+SJsNEZFZVBu5BUrVIZm9KId3ui2PdtLK2sv2zM8sJnjPDfgLxQlEqQ==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-async-to-generator@7.27.1': - resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-async-to-generator@8.0.1': + resolution: {integrity: sha512-e1jmmEU4p2Lx64sA1+EF8e8/RxPuegzbXcEbmFp5alDyLE+f2ViUpZ77bRWMXzihTwgVVmn/TOpqDbAuS5g1Ew==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-block-scoped-functions@7.27.1': - resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-block-scoped-functions@8.0.1': + resolution: {integrity: sha512-0V97/gcf7LIgPieEiK1YT0eXa18XJFSLOTZjzEZhA9SJIqZhD/IwGUrCitBzXSmnGCP7hchwC6svHtJ/Eidcpg==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-block-scoping@7.28.5': - resolution: {integrity: sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-block-scoping@8.0.1': + resolution: {integrity: sha512-HxiQvKsSCs2jOmMhjDrooHaZYOy6W8bqwXp/zjdgPjsNrda6tK9/CH3a/cVIeg6ge3hSS02ALqvqgIo4rTsuSg==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-class-properties@7.27.1': - resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-class-properties@8.0.1': + resolution: {integrity: sha512-tORnYiVhIHnKj90TgbSZXrO24f9oEpA6MgFxpIDSKKlHv7AzBIRhkMlYevanueLNYaQXqZWarfCgXM4bWTfNiw==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-class-static-block@7.28.3': - resolution: {integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-class-static-block@8.0.1': + resolution: {integrity: sha512-NEVK+L0Le8h8tJ+IK0CGS5y9Yi1ZHxLj6M5PeanhMFuq9aSo0XI+Wtmbuyop6fTNukOm7ORNntf/kwid891vqQ==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.12.0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-classes@7.28.4': - resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-classes@8.0.1': + resolution: {integrity: sha512-phwyCES8kIMAdVOFw25ztmgAvkl2G+TvUv7azUYyrlR1Qoo3eLJC/MU3MGUKFZ4BWtsJ1NTJM1lKRLzKbswg7w==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-computed-properties@7.27.1': - resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-computed-properties@8.0.1': + resolution: {integrity: sha512-i4l3OGLO8DUDcwdnyraOvILbhqdUf4QgfzhVxSOSzRy49XKXrY7pwaSg9gDSKmhZfNPrEMciBSJSciQh/CjB1A==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-destructuring@7.28.5': - resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-destructuring@8.0.1': + resolution: {integrity: sha512-RtR8uLDl0QcCmqMNIkM8gmDeYZ3rS0ZH+sa+I6sfc09yFoqfp9AEPgBstq9KyfVb0lFCVSRFfJXCI70FIl5ccw==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-dotall-regex@7.27.1': - resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-dotall-regex@8.0.1': + resolution: {integrity: sha512-czOUoSaZljJ92yu+bYlXqb/UBN8K9daNCob/B6/7nthSvfGP6YhCnfqD64XWfyb2dN4ypxALNplApoJrsMd4fw==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-duplicate-keys@7.27.1': - resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-duplicate-keys@8.0.1': + resolution: {integrity: sha512-kNnVLkxFUEcTtCyB5PFVQ5Xoy88Bk1lU/ZgDu97CW8eNhRH2Wsiy8Sq5l5dFnwtIUYjzsXHU77jUy1W5AtGSIw==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@8.0.1': + resolution: {integrity: sha512-Tv43P47o6fuHgBL7HLHQg3WKXohW9CEUGjLtnCDW27yJLK0zKUdTTqREbZbycNHA83hewMjde5tF6ekrHu9bAA==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-dynamic-import@7.27.1': - resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-dynamic-import@8.0.1': + resolution: {integrity: sha512-AS9GlgKc43tJNRu7yOvLaTko4qmdOb+8M69uNS8i421WLO20eVez7LdG5khKdi8E0LIQpYzzzdGIrdXWnO753g==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-explicit-resource-management@7.28.0': - resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-explicit-resource-management@8.0.1': + resolution: {integrity: sha512-VzDIYwBlLCpV6mJfloRdJm8HmYnMqs7O+bGha8yfg2kP7jAdxeCw6yZBVBeaKKQUThtSU52iy+3lB7DhYsbOBA==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-exponentiation-operator@7.28.5': - resolution: {integrity: sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-exponentiation-operator@8.0.1': + resolution: {integrity: sha512-DsZvUUklUmDQ7d2vp+VjqgUWD51mGxhZZ1FPdPP9Hcj0vsgGUKX+zEBGp/vzB1O5PZUxWT/Euq5fu39M9dm9wg==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-export-namespace-from@7.27.1': - resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-export-namespace-from@8.0.1': + resolution: {integrity: sha512-bFzznm46bvWGaTYKle3iolbBJ+oPBfUjwCPesxlFE3SQ7DaY9EHf/8Y5ZzrodKJi8JDdcAyaVWaDUSVyhULh0g==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-for-of@7.27.1': - resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-for-of@8.0.1': + resolution: {integrity: sha512-rpeXtgELjpIBQH/+YmyFlD9timPEVCyqY+TNednzoeoTYvXSBEeUvYnYE+BK8rB8m6hHiNK7aL9QWKhGifEJCw==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-function-name@7.27.1': - resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-function-name@8.0.1': + resolution: {integrity: sha512-H1L/JfPf3CqmubuaiZaquXKQ8MRs4YWSsgRllkTviM8TafcCNnlvc4/fJZ3rXP8HmFM+/Bg+TlsPehUI9BtDFA==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-json-strings@7.27.1': - resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-json-strings@8.0.1': + resolution: {integrity: sha512-Mowp8X0J6p7ZehLU82B5e65te2uuSeDHyxrEROwEAS2VKXNXssfw5ZMqhY7k9iXTsOv1Xs/49G3lDCj9Vvw8qQ==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-literals@7.27.1': - resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-literals@8.0.1': + resolution: {integrity: sha512-ai7kfPRcfyUV1EszXoF1PvL3IuJoCuH08WSEPoRcJTWfZZ55VL/rcfvbVY16QLA3jjbzzSneQSoCtD3L6OyUjw==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-logical-assignment-operators@7.28.5': - resolution: {integrity: sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-logical-assignment-operators@8.0.1': + resolution: {integrity: sha512-Emvtr5zkEGyCNAmt+qKD5EUh8G0RbxV9EZWrDdX0LuVy5tBq1B3fOIslvVF9aCJmpnwS/AvAT53b9LxAZyXlng==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-member-expression-literals@7.27.1': - resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-member-expression-literals@8.0.1': + resolution: {integrity: sha512-3Axi9abnyGsm/hh6DsKPZ1Cr9fTtKqS7w0Ig5g12mU269YclpH8pV3xMln2vPLexXgUp6S6L+I06d9/YOLfRKA==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-modules-amd@7.27.1': - resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-modules-amd@8.0.1': + resolution: {integrity: sha512-FDdhET8y1YFDNRuoynqSf23WTzbBBpbIB2oRrlFX7YYm9uWtFvJDSD1r/epBSjfPkOjeaaLgRW9xNnt3JGx46A==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-modules-commonjs@7.27.1': - resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-modules-commonjs@8.0.1': + resolution: {integrity: sha512-PMuzulWrrzFNmY3lXSk/tV9NRb7y0eZZLJY4UEo2TKszroxvUZHAPPi+T9FDyrQhod+TQA+t+8/QYaaMpiEuhA==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-modules-systemjs@7.29.4': - resolution: {integrity: sha512-N7QmZ0xRZfjHOfZeQLJjwgX2zS9pdGHSVl/cjSGlo4dXMqvurfxXDMKY4RqEKzPozV78VMcd0lxyG13mlbKc4w==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-modules-systemjs@8.0.1': + resolution: {integrity: sha512-0NEHanXmnFEnfT2dLKTXnu7m8GXFsnxRgteBC2aH21hYMBwAgxu5dcTdi/Eg+ToI1HbZe0CHwz4XRLgRNQhYoQ==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-modules-umd@7.27.1': - resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-modules-umd@8.0.1': + resolution: {integrity: sha512-XKTa2J2MdkmbVEeChq9f7Or0VYcsF0NyVBgytRyeN9F+J+ETAB2SHhfkG4toz/ssuU0i+h/QgJ6ddo5YakSQcA==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-named-capturing-groups-regex@8.0.1': + resolution: {integrity: sha512-zCHu+Jr2gTdJE48lN9SV/kXueCW2M79mKtKJc/ttfzzr/jvgdQdCd17RADMqFRQc/25MLxdtjTmlD0HSAMOlIQ==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-new-target@7.27.1': - resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-new-target@8.0.1': + resolution: {integrity: sha512-QSQxVg1x4PuOuhWUs4Y9u+x9Y+ER8z6G3tC+bDLBzvoOrNLJrEBQLRnwrTP8e5klihAw6Z+e9X5RjdAKcAGapA==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': - resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-nullish-coalescing-operator@8.0.1': + resolution: {integrity: sha512-AgCJAmQLF7+PtsK79wJqr4xJ2StHCXlz7JL5CVFP4HejJx25Tk6yl1ZrXvi0cKh3VGDVnfVxefxnrpsBirgpyQ==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-numeric-separator@7.27.1': - resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-numeric-separator@8.0.1': + resolution: {integrity: sha512-it2DmUyLIA1GQUXlFDEnI+/G89mTgxndnAiZYpW8xYR6LboblfirMqiWJeTna5uypQJg7viTT4D1iEURRtFcfw==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-object-rest-spread@7.28.4': - resolution: {integrity: sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-object-rest-spread@8.0.1': + resolution: {integrity: sha512-VmxkDu6bBdbxRzqn6E93hYucug4OVa6svSO19W//vVzNUGAmQzk3QRyHyyEtfcjSLR3NWfRsWwVM9zExLmd+2w==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-object-super@7.27.1': - resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-object-super@8.0.1': + resolution: {integrity: sha512-fDkPXRTRKGm25bAq01q82UM4ypPqdVXCwphUUm4t1dL01fGIG0v8KRvT+4BjhMAtRxtPuI34t5Vs7yjRgs3ZgQ==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-optional-catch-binding@7.27.1': - resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-optional-catch-binding@8.0.1': + resolution: {integrity: sha512-b2OQ74uGliyATcasTjxGy2O/86UI/n+EN4juB4EMfEwTi9j9uq70PuP0L8fW77vfRY66gO/YoTo/WbIdQ/Si1g==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-optional-chaining@7.28.5': - resolution: {integrity: sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-optional-chaining@8.0.1': + resolution: {integrity: sha512-WtRS1c94lZGpGHxYLXMEWeoMVcuv8nkiyr8BTs6OYZv7N3Y9xVE8nbdFIl4lDJH6aH8/pLhqAQOL69d/WI9WdA==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-parameters@7.27.7': - resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-parameters@8.0.1': + resolution: {integrity: sha512-IIwRqroW0CYQwR6+3pnmu27z+H98poScWdnov8z6osumMeEsFxAFBBsDS2CFk2jFpPlGqVr89jK/HXO6i5DzxQ==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-private-methods@7.27.1': - resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-private-methods@8.0.1': + resolution: {integrity: sha512-TrFCGcXaVDh6S5IRhmLSRTY9H80VTCMQWnZtzBRg4RWg3KCLmdmsmj4M15kZAPZfoPkWL/SJb4em3Py/vOiX8g==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-private-property-in-object@7.27.1': - resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-private-property-in-object@8.0.1': + resolution: {integrity: sha512-e+yfOqSYBZaf3PARpiQkjZrpWYgmcFLhK+1tevh2CpHR1O9/36IdyPnAZusESX5nzVV/XZTDAtQBRLa8HPT5Dw==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-property-literals@7.27.1': - resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-property-literals@8.0.1': + resolution: {integrity: sha512-Z/qx4cxUtYR1nt7XWRutObPxDks98fEYsjWbVeKEqZH6y3AGknmgzCqmHf2FHWZCl1DfoPeuJY+3hZ+35D+2tg==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-regenerator@7.28.4': - resolution: {integrity: sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-regenerator@8.0.2': + resolution: {integrity: sha512-aFfsjCRYducRV4dPnpsBbdRkLjboca9FVDg6HZCgy0Ahvk2ZQ/2exmCRC5qS9P6rsWwrmIheNaIM6A1j2F8KMA==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-regexp-modifiers@7.27.1': - resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-regexp-modifiers@8.0.1': + resolution: {integrity: sha512-02ITRDBesPdTYU0oShAzERwEPzozOUQSXlz3qrt8JGuhalBJQv9z5NjgHJPC9sS3Fsam8gDtfAEpBnqZwUIdjQ==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-reserved-words@7.27.1': - resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-reserved-words@8.0.1': + resolution: {integrity: sha512-+aykZi7ZP3U84veqfJXm3HhPZGddWFi64g7jr0ni6tb1zel+1ey+SL+IRKPoZXFyFqvYEsoqrmx4PyEJRlHl/Q==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-shorthand-properties@7.27.1': - resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-shorthand-properties@8.0.1': + resolution: {integrity: sha512-JddANd9yPVH8dYgVoNkqAH5BftnsDxFpG51Zas7sc6F3poz5QWcejHNGO8a/57IX5ByjGSzEmYk9Z7ZMa5MWaw==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-spread@7.27.1': - resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-spread@8.0.1': + resolution: {integrity: sha512-O9Bw9FyxlSw1SlMg3S82/GKNZ0x77RPbHezotEy1JTlIM/vk6WO8jW1iF+iTiKLOXNvi+b+LZ9t77Gi+Q0FhGg==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-sticky-regex@7.27.1': - resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-sticky-regex@8.0.1': + resolution: {integrity: sha512-IsVP6WrZZQdaG2zLmeKwWiI+ua2NB5L1+f77C2/8z2NCDz7uxlIA/lnwocYOJk9PXcOC2sZgRls3LN4XpNduzQ==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-template-literals@7.27.1': - resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-template-literals@8.0.1': + resolution: {integrity: sha512-JXvtj5+BJA9Qv3prDzW2z2DkGTJNmG0BObTdUD03STiu1Jr4fNQkQy3hYZgPL46a2RjcuhwBMYf49BOuJ98gnA==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-typeof-symbol@7.27.1': - resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-typeof-symbol@8.0.1': + resolution: {integrity: sha512-+wJoxgxP2gtey0UMUOMhzMMji2XHO/Uu6MXUh/r5Yhc2jngKzK/wFxY2WNe4UCaRcMvCb4gcnB8wIgFXJsocXg==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-unicode-escapes@7.27.1': - resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-unicode-escapes@8.0.1': + resolution: {integrity: sha512-TAXJepIJ6vZphytTwcf+LuXi2M2ZWI43VCqNw+1ZZLPP/38Z1A8j4Mahvg8kqDgMOSM/cakk+hedTJCiw3jQuQ==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-unicode-property-regex@7.27.1': - resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-unicode-property-regex@8.0.1': + resolution: {integrity: sha512-zjBN9tSMSuomNDfurL69Gf7+v4D2t5uI1mSZaYJDo88SKpbduhCXqtxH7Tx66iCF6caWYwnBzSM0tnCozmQq5Q==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-unicode-regex@7.27.1': - resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-unicode-regex@8.0.1': + resolution: {integrity: sha512-v0oO83cvT5lwbcIVRShpx4vaHD8AvM9IBowsQuTeP+kGmhh3recJQs33Bl6dlo3/2g9amlznLbFGn4VJbPCJqA==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/plugin-transform-unicode-sets-regex@7.27.1': - resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} - engines: {node: '>=6.9.0'} + '@babel/plugin-transform-unicode-sets-regex@8.0.1': + resolution: {integrity: sha512-MlQeyS0K7gh0XNeLBMS/3Z07HjDOKhA7xm2L18GyxOXyiFHI9E+ZuQ4mFYmcLjluXsE/Wf6dABIqZvKpKw0Z3w==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^8.0.0 - '@babel/preset-env@7.28.5': - resolution: {integrity: sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==} - engines: {node: '>=6.9.0'} + '@babel/preset-env@8.0.2': + resolution: {integrity: sha512-CUGLn9hNBCF/eXnwdFAWERbniCcXCRvnKwLV9fegeUEIqv7YlU2MepsWMMM54GcILx5XYMnRh+JAL+K5G+mK6g==} + engines: {node: ^22.18.0 || >=24.11.0} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^8.0.0 - '@babel/preset-modules@0.1.6-no-external-plugins': - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + '@babel/preset-modules@0.2.0': + resolution: {integrity: sha512-yz0RBN2fx4fjCeFcTWsWgL7PxSRltvTa0Qg14HkWCU3qS8MO7ZSJlBVbGceynd5C9NsJwwUHNQD3dc6tYO+jqQ==} peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + '@babel/core': ^8.0.0 - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} engines: {node: '>=6.9.0'} '@babel/template@7.28.6': resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.5': - resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} - engines: {node: '>=6.9.0'} + '@babel/template@8.0.0': + resolution: {integrity: sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==} + engines: {node: ^22.18.0 || >=24.11.0} '@babel/traverse@7.29.0': resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.5': - resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} - engines: {node: '>=6.9.0'} + '@babel/traverse@8.0.4': + resolution: {integrity: sha512-bZnmqzGG8UZneG1lLxBoWIH0G6Gr1D846Yu4/3XnY6FhCndMR49u26nTY08u/dAxWmLWF9vGQOuC+84FfIUoeg==} + engines: {node: ^22.18.0 || >=24.11.0} '@babel/types@7.29.0': resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} + '@babel/types@8.0.4': + resolution: {integrity: sha512-eY+Yn3dCqTGmyiq2QRU66lA5FL8lqqqvecHt0fF3uHONIa7ToYsaCiWV8lOKqAs0Rb2SjixiKFROngnulPtt2g==} + engines: {node: ^22.18.0 || >=24.11.0} + '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} @@ -629,12 +645,22 @@ packages: '@blueoak/list@15.0.0': resolution: {integrity: sha512-xW5Xb9Fr3WtYAOwavxxWL0CaJK/ReT+HKb5/R6dR1p9RVJ55MTdaxPdeTKY2ukhFchv2YHPMM8YuZyfyLqxedg==} + '@borewit/text-codec@0.2.2': + resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} + + '@braidai/lang@1.1.2': + resolution: {integrity: sha512-qBcknbBufNHlui137Hft8xauQMTZDKdophmLFv05r2eNmdIv/MlPuP4TdUknHG68UdWLgVZwgxVe735HzJNIwA==} + '@brettz9/eslint-plugin@3.0.0': resolution: {integrity: sha512-QprVr0jsyljALm5HXtXh+1IorN8v2uBYWdEjQ6bJ8Q/al7WOOy6rbne8Ruzy/fvSaEL56f1RdXMyDmMYmAb0MQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=7.20.0' + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + '@emnapi/core@1.7.1': resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} @@ -644,72 +670,77 @@ packages: '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@es-joy/jsdoccomment@0.76.0': - resolution: {integrity: sha512-g+RihtzFgGTx2WYCuTHbdOXJeAlGnROws0TeALx9ow/ZmOROOZkVg5wp/B44n0WJgI4SQFP1eWM2iRPlU2Y14w==} - engines: {node: '>=20.11.0'} + '@es-joy/jsdoccomment@0.95.0': + resolution: {integrity: sha512-jbzwtRPuw1Nzld0lacvr1vwzPU/6zEHFGK5YOTstl2MQYMZBuKmSW3HMuEwsq1v4meK5Do4lizxyd/hi25rCZg==} + engines: {node: ^22.22.2 || >=24.15.0} '@es-joy/resolve.exports@1.2.0': resolution: {integrity: sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==} engines: {node: '>=10'} - '@eslint-community/eslint-plugin-eslint-comments@4.5.0': - resolution: {integrity: sha512-MAhuTKlr4y/CE3WYX26raZjy+I/kS2PLKSzvfmDCGrBLTFHOYwqROZdr4XwPgXwX3K9rjzMr4pSmUWGnzsUyMg==} + '@eslint-community/eslint-plugin-eslint-comments@4.7.2': + resolution: {integrity: sha512-LF03qURSwEWm2dz5wtdDCzNk+7Opl0X7q6I3undsaIuNsEiNvRV3BCtqu14Q/6Pzg1tBj44LcxpW2EpSLZStZw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 - '@eslint-community/eslint-utils@4.9.0': - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-community/regexpp@4.12.2': resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.1': - resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.4.2': - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-helpers@0.7.0': + resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/core@0.17.0': - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/eslintrc@3.3.1': - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/css-tree@4.0.5': + resolution: {integrity: sha512-iPmijIAq4hlIJB86PYmY/fcZORHtjphSqICDbwuw32A/JmkhZQ/K/6TjHE03zqf3n5yABpVcbRAMG8Mi9ojy8g==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/js@9.39.1': - resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true - '@eslint/markdown@7.5.1': - resolution: {integrity: sha512-R8uZemG9dKTbru/DQRPblbJyXpObwKzo8rv1KYGGuPUPtjM4LXBYM9q5CIZAComzZupws3tWbDwam5AFpPLyJQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/markdown@8.0.3': + resolution: {integrity: sha512-rBTSSShrq7e4O+PWfeE4azH4/CWPNrC+VGxBXiW00o3vYVJnznsZiDayj3KC9JztIMVRZxZHn2nrDIUau/4j7A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/object-schema@2.1.7': - resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.4.1': - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@fintechstudios/eslint-plugin-chai-as-promised@3.1.0': resolution: {integrity: sha512-Y3TmITTwc5u8hoW0GWxle1hKiVadDqDHyLQaTv+e+xVDHazn361QIEY9NbWqNsXP0jzrSskpnhkBr++h+PciEw==} engines: {node: '>=8.10.0'} - '@gerrit0/mini-shiki@3.15.0': - resolution: {integrity: sha512-L5IHdZIDa4bG4yJaOzfasOH/o22MCesY0mx+n6VATbaiCtMeR59pdRqYk4bEiQkIHfxsHPNgdi7VJlZb2FhdMQ==} + '@gar/promise-retry@1.0.3': + resolution: {integrity: sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@gerrit0/mini-shiki@3.23.0': + resolution: {integrity: sha512-bEMORlG0cqdjVyCEuU0cDQbORWX+kYCeo0kV1lbxF5bt4r7SID2l9bqsxJEM0zndaxpOUT7riCyIVEuqq/Ynxg==} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} @@ -731,6 +762,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@isaacs/string-locale-compare@1.1.0': resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} @@ -745,9 +780,6 @@ packages: '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -773,15 +805,25 @@ packages: peerDependencies: jsep: ^0.4.0||^1.0.0 + '@loaderkit/resolve@1.0.6': + resolution: {integrity: sha512-G8FdIoF5CypfwmD9rl8BXod5HDn8JqB0CCNBXDTaRZ+yRYhARrrSToX1zg1zy9jX3zLqigsELwhT4gNtkdQAUg==} + '@mdn/browser-compat-data@5.7.6': resolution: {integrity: sha512-7xdrMX0Wk7grrTZQwAoy1GkvPMFoizStUoL+VmtUkAxegbCCec+3FKwOM6yc/uGU5+BEczQHXAlWiqvM8JeENg==} + '@mdn/browser-compat-data@6.1.5': + resolution: {integrity: sha512-PzdZZzRhcXvKB0begee28n5lvwAcinGKYuLZOVxHAZm+n7y01ddEGfdS1ZXRuVcV+ndG6mSEAE8vgudom5UjYg==} + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] + libc: [glibc] + '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} - '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -794,67 +836,63 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nolyfill/is-core-module@1.0.39': - resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} - engines: {node: '>=12.4.0'} + '@npmcli/agent@4.0.2': + resolution: {integrity: sha512-EUEuWAxnL07Sp5/iC/1X6Xj+XThUvnbei9zfRWZdEXa7lss9RTHMhAHBeg+MZ5To9s/gGaSI+UwZTPdYMvKSeg==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/agent@2.2.2': - resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@npmcli/arborist@7.5.4': - resolution: {integrity: sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/arborist@9.9.0': + resolution: {integrity: sha512-tzsb1R8mx0k0drlLDT/9ckEYaQHIaWnUti/ci2IaFoQqdqwfmYrc+90p1+QEZC/ocvqcxBep9P1xKw4FbAGofw==} + engines: {node: ^20.17.0 || >=22.9.0} hasBin: true - '@npmcli/fs@3.1.1': - resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/fs@5.0.0': + resolution: {integrity: sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/git@5.0.8': - resolution: {integrity: sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/git@7.0.2': + resolution: {integrity: sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/installed-package-contents@2.1.0': - resolution: {integrity: sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/installed-package-contents@4.0.0': + resolution: {integrity: sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==} + engines: {node: ^20.17.0 || >=22.9.0} hasBin: true - '@npmcli/map-workspaces@3.0.6': - resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/map-workspaces@5.0.3': + resolution: {integrity: sha512-o2grssXo1e774E5OtEwwrgoszYRh0lqkJH+Pb9r78UcqdGJRDRfhpM8DvZPjzNLLNYeD/rNbjOKM3Ss5UABROw==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/metavuln-calculator@7.1.1': - resolution: {integrity: sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/metavuln-calculator@9.0.3': + resolution: {integrity: sha512-94GLSYhLXF2t2LAC7pDwLaM4uCARzxShyAQKsirmlNcpidH89VA4/+K1LbJmRMgz5gy65E/QBBWQdUvGLe2Frg==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/name-from-folder@2.0.0': - resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/name-from-folder@4.0.0': + resolution: {integrity: sha512-qfrhVlOSqmKM8i6rkNdZzABj8MKEITGFAY+4teqBziksCQAOLutiAxM1wY2BKEd8KjUSpWmWCYxvXr0y4VTlPg==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/node-gyp@3.0.0': - resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/node-gyp@5.0.0': + resolution: {integrity: sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/package-json@5.2.1': - resolution: {integrity: sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/package-json@7.0.5': + resolution: {integrity: sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/promise-spawn@7.0.2': - resolution: {integrity: sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/promise-spawn@9.0.1': + resolution: {integrity: sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/query@3.1.0': - resolution: {integrity: sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/query@5.0.0': + resolution: {integrity: sha512-8TZWfTQOsODpLqo9SVhVjHovmKXNpevHU0gO9e+y4V4fRIOneiXy0u0sMP9LmS71XivrEWfZWg50ReH4WRT4aQ==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/redact@2.0.1': - resolution: {integrity: sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/redact@4.0.0': + resolution: {integrity: sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==} + engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/run-script@8.1.0': - resolution: {integrity: sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==} - engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/run-script@10.0.4': + resolution: {integrity: sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg==} + engines: {node: ^20.17.0 || >=22.9.0} '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} @@ -872,13 +910,13 @@ packages: resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} engines: {node: '>=12'} - '@rollup/plugin-babel@6.1.0': - resolution: {integrity: sha512-dFZNuFD2YRcoomP4oYf+DvQNSUA9ih+A3vUqopQx5EdtPGo3WBnQcI/S8pwpz91UsGfL0HsMSOlaMld8HrbubA==} + '@rollup/plugin-babel@7.1.0': + resolution: {integrity: sha512-h9Y+xYha6p4wKO+FwdiPIkE+eIYCm8MzZPpX1iARIoFBnmKP9CnpT1p9dDf/DTFm6fyN8PmuLyRI5qZgchnitw==} engines: {node: '>=14.0.0'} peerDependencies: '@babel/core': ^7.0.0 '@types/babel__core': ^7.1.9 - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + rollup: ^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: '@types/babel__core': optional: true @@ -894,9 +932,9 @@ packages: rollup: optional: true - '@rollup/plugin-terser@0.4.4': - resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} - engines: {node: '>=14.0.0'} + '@rollup/plugin-terser@1.0.0': + resolution: {integrity: sha512-FnCxhTBx6bMOYQrar6C8h3scPt8/JwIzw3+AJ2K++6guogH5fYaIFia+zZuhqv0eo1RN7W1Pz630SyvLbDjhtQ==} + engines: {node: '>=20.0.0'} peerDependencies: rollup: ^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: @@ -912,141 +950,141 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.59.0': - resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} + '@rollup/rollup-android-arm-eabi@4.62.4': + resolution: {integrity: sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.59.0': - resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} + '@rollup/rollup-android-arm64@4.62.4': + resolution: {integrity: sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.59.0': - resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} + '@rollup/rollup-darwin-arm64@4.62.4': + resolution: {integrity: sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.59.0': - resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} + '@rollup/rollup-darwin-x64@4.62.4': + resolution: {integrity: sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.59.0': - resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} + '@rollup/rollup-freebsd-arm64@4.62.4': + resolution: {integrity: sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.59.0': - resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} + '@rollup/rollup-freebsd-x64@4.62.4': + resolution: {integrity: sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': - resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} + '@rollup/rollup-linux-arm-gnueabihf@4.62.4': + resolution: {integrity: sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.59.0': - resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} + '@rollup/rollup-linux-arm-musleabihf@4.62.4': + resolution: {integrity: sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.59.0': - resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} + '@rollup/rollup-linux-arm64-gnu@4.62.4': + resolution: {integrity: sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.59.0': - resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} + '@rollup/rollup-linux-arm64-musl@4.62.4': + resolution: {integrity: sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.59.0': - resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} + '@rollup/rollup-linux-loong64-gnu@4.62.4': + resolution: {integrity: sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.59.0': - resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} + '@rollup/rollup-linux-loong64-musl@4.62.4': + resolution: {integrity: sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.59.0': - resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} + '@rollup/rollup-linux-ppc64-gnu@4.62.4': + resolution: {integrity: sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.59.0': - resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} + '@rollup/rollup-linux-ppc64-musl@4.62.4': + resolution: {integrity: sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.59.0': - resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} + '@rollup/rollup-linux-riscv64-gnu@4.62.4': + resolution: {integrity: sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.59.0': - resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} + '@rollup/rollup-linux-riscv64-musl@4.62.4': + resolution: {integrity: sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.59.0': - resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} + '@rollup/rollup-linux-s390x-gnu@4.62.4': + resolution: {integrity: sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.59.0': - resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} + '@rollup/rollup-linux-x64-gnu@4.62.4': + resolution: {integrity: sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.59.0': - resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} + '@rollup/rollup-linux-x64-musl@4.62.4': + resolution: {integrity: sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.59.0': - resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} + '@rollup/rollup-openbsd-x64@4.62.4': + resolution: {integrity: sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.59.0': - resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} + '@rollup/rollup-openharmony-arm64@4.62.4': + resolution: {integrity: sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.59.0': - resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} + '@rollup/rollup-win32-arm64-msvc@4.62.4': + resolution: {integrity: sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.59.0': - resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} + '@rollup/rollup-win32-ia32-msvc@4.62.4': + resolution: {integrity: sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.59.0': - resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} + '@rollup/rollup-win32-x64-gnu@4.62.4': + resolution: {integrity: sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.59.0': - resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} + '@rollup/rollup-win32-x64-msvc@4.62.4': + resolution: {integrity: sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==} cpu: [x64] os: [win32] @@ -1057,67 +1095,75 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@shikijs/engine-oniguruma@3.15.0': - resolution: {integrity: sha512-HnqFsV11skAHvOArMZdLBZZApRSYS4LSztk2K3016Y9VCyZISnlYUYsL2hzlS7tPqKHvNqmI5JSUJZprXloMvA==} + '@shikijs/engine-oniguruma@3.23.0': + resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==} - '@shikijs/langs@3.15.0': - resolution: {integrity: sha512-WpRvEFvkVvO65uKYW4Rzxs+IG0gToyM8SARQMtGGsH4GDMNZrr60qdggXrFOsdfOVssG/QQGEl3FnJ3EZ+8w8A==} + '@shikijs/langs@3.23.0': + resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==} - '@shikijs/themes@3.15.0': - resolution: {integrity: sha512-8ow2zWb1IDvCKjYb0KiLNrK4offFdkfNVPXb1OZykpLCzRU6j+efkY+Y7VQjNlNFXonSw+4AOdGYtmqykDbRiQ==} + '@shikijs/themes@3.23.0': + resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==} - '@shikijs/types@3.15.0': - resolution: {integrity: sha512-BnP+y/EQnhihgHy4oIAN+6FFtmfTekwOLsQbRw9hOKwqgNy8Bdsjq8B05oAt/ZgvIWWFrshV71ytOrlPfYjIJw==} + '@shikijs/types@3.23.0': + resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@sigstore/bundle@2.3.2': - resolution: {integrity: sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==} - engines: {node: ^16.14.0 || >=18.0.0} + '@sigstore/bundle@4.0.0': + resolution: {integrity: sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==} + engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/core@1.1.0': - resolution: {integrity: sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==} - engines: {node: ^16.14.0 || >=18.0.0} + '@sigstore/core@3.2.1': + resolution: {integrity: sha512-qRsxPnCrbC/puegGxKuynfnxgLiHqWStrSjxkoB4YKqq3Z3s4cyZyj42ZdWFAEblNP65C+rBH8EuREHIXoi83g==} + engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/protobuf-specs@0.3.3': - resolution: {integrity: sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ==} + '@sigstore/protobuf-specs@0.5.1': + resolution: {integrity: sha512-/ScWUhhoFasJsSRGTVBwId1loQjjnjAfE4djL6ZhrXRpNCmPTnUKF5Jokd58ILseOMjzET3UrMOtJPS9sYeI0g==} engines: {node: ^18.17.0 || >=20.5.0} - '@sigstore/sign@2.3.2': - resolution: {integrity: sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==} - engines: {node: ^16.14.0 || >=18.0.0} + '@sigstore/sign@4.1.1': + resolution: {integrity: sha512-Hf4xglukg0XXQ2RiD5vSoLjdPe8OBUPA8XeVjUObheuDcWdYWrnH/BNmxZCzkAy68MzmNCxXLeurJvs6hcP2OQ==} + engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/tuf@2.3.4': - resolution: {integrity: sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==} - engines: {node: ^16.14.0 || >=18.0.0} + '@sigstore/tuf@4.0.2': + resolution: {integrity: sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ==} + engines: {node: ^20.17.0 || >=22.9.0} - '@sigstore/verify@1.2.1': - resolution: {integrity: sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==} - engines: {node: ^16.14.0 || >=18.0.0} + '@sigstore/verify@3.1.1': + resolution: {integrity: sha512-qv7+G3J2cc6wwFj3yKvXOamzqhMwSk1ogPGmhpS8iXllcPrJaIIBA+4HbttlHVu1pqWTdmaCH/WE7UOC51kdoA==} + engines: {node: ^20.17.0 || >=22.9.0} '@sindresorhus/base62@1.0.0': resolution: {integrity: sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==} engines: {node: '>=18'} + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + '@sindresorhus/is@5.6.0': resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} - '@sindresorhus/merge-streams@2.3.0': - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} - '@stylistic/eslint-plugin@5.6.0': - resolution: {integrity: sha512-owEc4B8ME+O/xyZOkLVyLqPMsUgJXIM4XzCm5Vt3WvRXpyoOfYxgA+JkEiFqXPCI8+Nc2BzAT+KGAK7QleGs8Q==} + '@stylistic/eslint-plugin@5.10.0': + resolution: {integrity: sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '>=9.0.0' + eslint: ^9.0.0 || ^10.0.0 '@szmarczak/http-timer@5.0.1': resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} engines: {node: '>=14.16'} + '@tokenizer/inflate@0.4.1': + resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} + engines: {node: '>=18'} + '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -1129,22 +1175,31 @@ packages: resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} engines: {node: ^16.14.0 || >=18.0.0} - '@tufjs/models@2.0.1': - resolution: {integrity: sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==} - engines: {node: ^16.14.0 || >=18.0.0} + '@tufjs/models@4.1.0': + resolution: {integrity: sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==} + engines: {node: ^20.17.0 || >=22.9.0} '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/gensync@1.0.5': + resolution: {integrity: sha512-MbsRCT7mTikHwKZ0X+LVUTLRrZZRLipTuXEO9qOYO+zmjMVk81axyClMROf6uoPD9MRVu46bx8zoR0Ad9q3NAg==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -1154,26 +1209,42 @@ packages: '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + '@types/jsesc@2.5.1': + resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/katex@0.16.8': + resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mocha@10.0.10': + resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} + '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@26.2.0': + resolution: {integrity: sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==} + '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/types@8.47.0': - resolution: {integrity: sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==} + '@typescript-eslint/types@8.65.0': + resolution: {integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/types@8.67.0': + resolution: {integrity: sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -1279,9 +1350,9 @@ packages: cpu: [x64] os: [win32] - abbrev@2.0.0: - resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + abbrev@4.0.0: + resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==} + engines: {node: ^20.17.0 || >=22.9.0} abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} @@ -1297,20 +1368,25 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.17.0: + resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-escapes@7.3.0: + resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} + engines: {node: '>=18'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1331,9 +1407,12 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} - are-docs-informative@0.0.2: - resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} - engines: {node: '>=14'} + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + are-docs-informative@0.1.1: + resolution: {integrity: sha512-sqRsNQBwbKLRX0jV5Cu5uzmtflf892n4Vukz7T659ebL4pz3mpOqCMU7lxMoBTFwnp10E3YB5ZcyHM41W5bcDA==} + engines: {node: '>=18'} argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -1385,6 +1464,10 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + ast-metadata-inferer@0.8.1: resolution: {integrity: sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA==} @@ -1402,29 +1485,29 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - babel-plugin-polyfill-corejs2@0.4.14: - resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} + babel-plugin-polyfill-corejs3@1.0.0: + resolution: {integrity: sha512-yIkslVjbmml2Xjb6XhFW7lISXHsqk6cesxTdDsXoMom4Lnb99DbD3OQbSOoM5Z+ASh8YXYaLAsRQrU2Jeh3Qig==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-corejs3@0.13.0: - resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-regenerator@0.6.5: - resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/core': ^7.4.0 || ^8.0.0 balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.31: - resolution: {integrity: sha512-MujYO3eP72uvmSE0i4wltsodRfIpZATP3jvzRNRGGxgzId7aVocVJJV3nf01qnzzKFGxQVC9bpWxl5cjxTr/7Q==} + baseline-browser-mapping@2.11.14: + resolution: {integrity: sha512-JyJ954WzuIR8/FFzX0o5krdSTrBAkcCSRfWSleRsIHSWV+cZe2FI1PKggVkFke1hBldRs+LRxUczzE9iPmgZww==} + engines: {node: '>=6.0.0'} + hasBin: true + + baseline-browser-mapping@2.11.4: + resolution: {integrity: sha512-s4+sLr9mZ/CyqeRritFeYV/Zx73OAtmaHn6kkBS1XRoJn1hrg3xIDUcpicAEX68tkcIN0iBCgti31C8zxtkhsQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -1432,9 +1515,9 @@ packages: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} engines: {node: '>= 0.8'} - bin-links@4.0.4: - resolution: {integrity: sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + bin-links@6.0.2: + resolution: {integrity: sha512-frE1t78WOwJ45PKV2cF2tNPjTcs9L1J9s6VkrV59wanRP4GlaomuxYPVma7BwthMg8WnfSory4w5PTE6FZZ81w==} + engines: {node: ^20.17.0 || >=22.9.0} boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -1453,6 +1536,10 @@ packages: brace-expansion@2.1.0: resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} + brace-expansion@5.0.8: + resolution: {integrity: sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==} + engines: {node: 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -1465,6 +1552,16 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.28.7: + resolution: {integrity: sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + browserslist@4.28.8: + resolution: {integrity: sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -1487,9 +1584,9 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - c8@10.1.3: - resolution: {integrity: sha512-LvcyrOAaOnrrlMpW22n690PUvxiq4Uf9WMhQwNJ9vgagkL/ph1+D4uvjvDA5XCbykrc0sx+ay6pVi9YZ1GnhyA==} - engines: {node: '>=18'} + c8@12.0.0: + resolution: {integrity: sha512-4zpJvrd1nKWutnnKC2pXkFmb6iM1l+ffN//o1CzlTNwW7GSOs9a1xrLqkC48nU8oEkjmPZLPiwMsIaOvoF4Pqg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} hasBin: true peerDependencies: monocart-coverage-reports: ^2 @@ -1497,9 +1594,9 @@ packages: monocart-coverage-reports: optional: true - cacache@18.0.4: - resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} - engines: {node: ^16.14.0 || >=18.0.0} + cacache@20.0.4: + resolution: {integrity: sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==} + engines: {node: ^20.17.0 || >=22.9.0} cacheable-lookup@7.0.0: resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} @@ -1521,10 +1618,6 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -1541,14 +1634,17 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} - caniuse-lite@1.0.30001793: - resolution: {integrity: sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==} + caniuse-lite@1.0.30001806: + resolution: {integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==} + + caniuse-lite@1.0.30001809: + resolution: {integrity: sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@6.2.1: - resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} chalk-template@0.4.0: @@ -1570,6 +1666,10 @@ packages: change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} @@ -1577,37 +1677,48 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - ci-info@4.3.1: - resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} - clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} - - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} cli-boxes@3.0.0: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} + cli-highlight@2.1.11: + resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true + + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} + engines: {node: 10.* || >= 12.*} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} - cmd-shim@6.0.3: - resolution: {integrity: sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + cliui@9.0.1: + resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} + engines: {node: '>=20'} + + cmd-shim@8.0.0: + resolution: {integrity: sha512-Jk/BK6NCapZ58BKUxlSI+ouKRbjH1NLZCgJkYoab+vEHUY3f6OzpNBN9u7HFSv9J6TRDGs4PLOHezoKGaFRSCA==} + engines: {node: ^20.17.0 || >=22.9.0} color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -1658,6 +1769,10 @@ packages: resolution: {integrity: sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==} engines: {node: '>=12.20.0'} + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -1665,12 +1780,21 @@ packages: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} - comment-parser@1.4.1: - resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + comment-parser@1.4.7: + resolution: {integrity: sha512-0h+uSNtQGW3D98eQt3jJ8L06Fves8hncB4V/PKdw/Qb8Hnk19VaKuTr55UNRYiSoVa7WwrFls+rh3ux9agmkeQ==} + engines: {node: '>= 12.0.0'} + + comment-parser@1.4.8: + resolution: {integrity: sha512-rKZTGo4fzKYna8UcL0isTg5wkBNla7bxTypLwZQXjIdi++IdP1OJ41rI5Mti3/jltkPujbu4i9LIARYA+zpotQ==} engines: {node: '>= 12.0.0'} - common-ancestor-path@1.0.1: - resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + common-ancestor-path@2.0.0: + resolution: {integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==} + engines: {node: '>= 18'} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -1686,11 +1810,15 @@ packages: resolution: {integrity: sha512-N4oog6YJWbR9kGyXvS7jEykLDXIE2C0ILYqNBZBp9iwiJpoCBWYsuAdW6PPFn6w06jjnC+3JstVvWHO4cZqvRg==} engines: {node: '>=18'} + convert-hrtime@5.0.0: + resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} + engines: {node: '>=12'} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - core-js-compat@3.47.0: - resolution: {integrity: sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==} + core-js-compat@3.49.0: + resolution: {integrity: sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==} correct-license-metadata@1.4.0: resolution: {integrity: sha512-nvbNpK/aYCbztZWGi9adIPqR+ZcQmZTWNT7eMYLvkaVGroN1nTHiVuuNPl7pK6ZNx1mvDztlRBJtfUdrVwKJ5A==} @@ -1818,6 +1946,10 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + detect-indent@7.0.2: + resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} + engines: {node: '>=12.20'} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -1876,8 +2008,11 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.255: - resolution: {integrity: sha512-Z9oIp4HrFF/cZkDPMpz2XSuVpc1THDpT4dlmATFlJUIBVCy9Vap5/rIXsASP1CscBacBqhabwh8vLctqBwEerQ==} + electron-to-chromium@1.5.396: + resolution: {integrity: sha512-yHiw2Y3C3H9U6TMbOfoWK/BPreiOPXRfTWPBwQBoZG6/8TB6eOPnsy5oaRYuatR7Fw2SJ4kKforgufeo7fq0EQ==} + + electron-to-chromium@1.5.406: + resolution: {integrity: sha512-hWH5ORBi3d0IipnMh7BN5GDTaAmrSSSWmznwt2zltdiRNEWoEQyTwF0FFSBxzHO7hLSRT6loQu3IQGV0wg/Tvg==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -1888,8 +2023,12 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + emojilib@2.4.0: + resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} + + empathic@2.0.1: + resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} + engines: {node: '>=14'} enhanced-resolve@5.18.3: resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} @@ -1902,16 +2041,17 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} engines: {node: '>=0.12'} env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} es-abstract@1.24.0: resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} @@ -1925,9 +2065,9 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-file-traverse@2.0.1: - resolution: {integrity: sha512-NvoZH3rRsmzMlXrNladYMmG0VYADqgRK2CLCDIEgGe7YxSayq2jbjtp50qa6Bm3rnErW7kM2j/p7cBjeQSH5nw==} - engines: {node: ^20.11.0 || >=22.0.0} + es-file-traverse@3.0.0: + resolution: {integrity: sha512-CEBr2uB5zkYOpdrJOXHNl3yRUehGf+9FBpXB/uKUq4gW3QNKWi9JVaB/F2BG+Xz1GtqdN4A3ipzBFnIj3jRZwQ==} + engines: {node: ^20.11.0 || >=22.16.0} hasBin: true es-object-atoms@1.1.1: @@ -1986,18 +2126,27 @@ packages: peerDependencies: eslint: '>=6.0.0' - eslint-config-ash-nazg@39.8.0: - resolution: {integrity: sha512-51sJll80mAadRBiMydxv/MDMU42JLRu8xoneN3OFcfp4wDXx+SAZ+IbUIsUwSdyu9yuUpK3/cRKfVSwRfutIag==} + eslint-config-ash-nazg@42.4.0: + resolution: {integrity: sha512-6op5sbIlEybWVQVEG7iZFeiXV2J1Be7W+Uym1Rxndb7sQjEQn6e4wlv7Lh/Bktu8FyEyavTO/iQWr8xmuZeYXQ==} engines: {node: '>=20.0.0'} peerDependencies: - eslint: ^9.6.0 + eslint: ^10.0.0 + + eslint-import-context@0.1.9: + resolution: {integrity: sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + peerDependencies: + unrs-resolver: ^1.0.0 + peerDependenciesMeta: + unrs-resolver: + optional: true eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-import-resolver-typescript@3.10.1: - resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} - engines: {node: ^14.18.0 || >=16.0.0} + eslint-import-resolver-typescript@4.4.5: + resolution: {integrity: sha512-nbE5XLph6TLtGYcu/U6e6ZVXyKBhbDWK5cLGk76eJ7NdZpwf1P9EFkpt1Z01mNZNrrilsAYWKH6zUkL4reoXbw==} + engines: {node: ^16.17.0 || >=18.6.0} peerDependencies: eslint: '*' eslint-plugin-import: '*' @@ -2029,38 +2178,44 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-array-func@5.1.0: - resolution: {integrity: sha512-+OULB0IQdENBmBf8pHMPPObgV6QyfeXFin483jPonOaiurI9UFmc8UydWriK5f5Gel8xBhQLA6NzMwbck1BUJw==} + eslint-plugin-array-func@5.1.1: + resolution: {integrity: sha512-TbVGk+yLqXHgtrS4DnYzg2Ycuk5y+lYFy5NgT748neQdJvNIYUucxp2QQjPU7dwbs9xp9fyktgtK069y9rNdig==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=8.51.0' - eslint-plugin-chai-expect-keywords@3.1.0: - resolution: {integrity: sha512-0RccqS5zfNFnwomz2OhpaIaK/Z5f0RypBiR4Va+nTo1QncPHQC2YxQk+IbHb3SY4Lj4hToQ9IXejzZSqF0Ae9A==} - engines: {node: '>=18.18.0'} + eslint-plugin-chai-expect-keywords@3.3.0: + resolution: {integrity: sha512-txCGC1Rtfih8w2L3EtXFX/d6rcbKqXd3X1lNJ9/0Be1U1KezitP2559pjNzygjpBuyiRPJkJV+HABdjhsFKeHg==} + engines: {node: ^22.13.0 || >=24.15.0} + peerDependencies: + eslint: '>=9.0.0' - eslint-plugin-chai-expect@3.1.0: - resolution: {integrity: sha512-a9F8b38hhJsR7fgDEfyMxppZXCnCW6OOHj7cQfygsm9guXqdSzfpwrHX5FT93gSExDqD71HQglF1lLkGBwhJ+g==} - engines: {node: 10.* || 12.* || || 14.* || 16.* || >= 18.*} + eslint-plugin-chai-expect@4.1.0: + resolution: {integrity: sha512-9Ldti0tyxlvbc4BAQ5lNkHsXjgH518aGO5cg53hv2V9jfEfmyAcrmJeG9+tkeq7gwoRNm+fITlwAgZsK12Mejw==} + engines: {node: '>= 20'} peerDependencies: - eslint: '>=2.0.0 <= 9.x' + eslint: '>=2.0.0 <=10.x' - eslint-plugin-chai-friendly@1.1.0: - resolution: {integrity: sha512-+T1rClpDdXkgBAhC16vRQMI5umiWojVqkj9oUTdpma50+uByCZM/oBfxitZiOkjMRlm725mwFfz/RVgyDRvCKA==} + eslint-plugin-chai-friendly@1.2.1: + resolution: {integrity: sha512-mV3EOJLDr8+L+LS8uCkP711fnNHz+4PsmPyz18xwkvjJwfLRlnx0Eu6CFnb5B+dW5ahoav2jVer2KFYsmIuv3A==} engines: {node: '>=0.10.0'} peerDependencies: eslint: '>=3.0.0' - eslint-plugin-compat@6.0.2: - resolution: {integrity: sha512-1ME+YfJjmOz1blH0nPZpHgjMGK4kjgEeoYqGCqoBPQ/mGu/dJzdoP0f1C8H2jcWZjzhZjAMccbM/VdXhPORIfA==} - engines: {node: '>=18.x'} + eslint-plugin-compat@7.0.2: + resolution: {integrity: sha512-gN8hF+4NzMsHUbr4m/TYZK0FtW3DcV4g8rXpTsY2EV5xiRD8jsilUlB9lNSkGGX0veDCxMhKSWbSd+faJByQDA==} + engines: {node: '>=22.x'} peerDependencies: - eslint: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + eslint: ^9.0.0 || ^10.0.0 - eslint-plugin-cypress@5.2.0: - resolution: {integrity: sha512-vuCUBQloUSILxtJrUWV39vNIQPlbg0L7cTunEAzvaUzv9LFZZym+KFLH18n9j2cZuFPdlxOqTubCvg5se0DyGw==} + eslint-plugin-cypress@7.0.0: + resolution: {integrity: sha512-gpvL3S1w45c0DORI/P5v3k1UUW2NKje3JiFz+oTHGF6dZa6ZPBokItJS7jP0BXGPEgI3RpHyAMNMAJ9K5P0bow==} peerDependencies: - eslint: '>=9' + '@typescript-eslint/parser': '>=8' + eslint: '>=10' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true eslint-plugin-es-x@7.8.0: resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} @@ -2073,10 +2228,23 @@ packages: peerDependencies: eslint: '>=5.14.1' - eslint-plugin-html@8.1.3: - resolution: {integrity: sha512-cnCdO7yb/jrvgSJJAfRkGDOwLu1AOvNdw8WCD6nh/2C4RnxuI4tz6QjMEAmmSiHSeugq/fXcIO8yBpIBQrMZCg==} + eslint-plugin-html@8.1.4: + resolution: {integrity: sha512-Eno3oPEj3s6AhvDJ5zHhnHPDvXp6LNFXuy3w51fNebOKYuTrfjOHUGwP+mOrGFpR6eOJkO1xkB8ivtbfMjbMjg==} engines: {node: '>=16.0.0'} + eslint-plugin-import-x@4.17.1: + resolution: {integrity: sha512-4cdstYkKCyjumM2Q9NSI03K8D2a9F4Ssz33K2lv2hQa4KmR9jPLwk3uWGtNvclfqBrPGfGuMBwsGMbe6dMRbfg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/utils': ^8.56.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + eslint-import-resolver-node: '*' + peerDependenciesMeta: + '@typescript-eslint/utils': + optional: true + eslint-import-resolver-node: + optional: true + eslint-plugin-import@2.32.0: resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} engines: {node: '>=4'} @@ -2087,11 +2255,11 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-jsdoc@61.2.1: - resolution: {integrity: sha512-Htacti3dbkNm4rlp/Bk9lqhv+gi6US9jyN22yaJ42G6wbteiTbNLChQwi25jr/BN+NOzDWhZHvCDdrhX0F8dXQ==} - engines: {node: '>=20.11.0'} + eslint-plugin-jsdoc@64.1.0: + resolution: {integrity: sha512-UyAR/zVWn1jgIM/7eDMeLHuqLVtqKtamNVE0M7mdcZtFkWdYlNvDVDzyCCcURmLe66JpTZkMM3ZM3zjiVvIByA==} + engines: {node: ^22.22.2 || >=24.15.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 eslint-plugin-mocha-cleanup@1.11.3: resolution: {integrity: sha512-LL4yt52+asxZmeqU6Ypr5XxN6CzJTKxu/YsbHEr0L/pArcS/acn49nNfrJluRSJ8N9MD1mtuI/V1jEfjPzQ1qQ==} @@ -2099,60 +2267,56 @@ packages: peerDependencies: eslint: '>=0.8.0' - eslint-plugin-mocha@11.2.0: - resolution: {integrity: sha512-nMdy3tEXZac8AH5Z/9hwUkSfWu8xHf4XqwB5UEQzyTQGKcNlgFeciRAjLjliIKC3dR1Ex/a2/5sqgQzvYRkkkA==} + eslint-plugin-mocha@12.0.2: + resolution: {integrity: sha512-RzjnzVBoidGFjVcvzQShLbfWug5pL/6d6LZFbBZk1b5duZ0ooq6dasmpu6qLyNowUZBqaWvQbnR5U1hsKX/+5g==} + engines: {node: '>=22.0.0'} peerDependencies: - eslint: '>=9.0.0' + eslint: '>=10.2.0' - eslint-plugin-n@17.23.1: - resolution: {integrity: sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-plugin-n@18.3.0: + resolution: {integrity: sha512-cPVguuDe6DrIPb/qUXHf8P89MaVTUmiYWwpt5gX5AILsvRIiZAxMFXcFR6QHYBksqKJpjfUBlL/RleCJUWcD7w==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: - eslint: '>=8.23.0' + eslint: '>=8.57.1' + ts-declaration-location: ^1.0.6 + typescript: '>=5.0.0' + peerDependenciesMeta: + ts-declaration-location: + optional: true + typescript: + optional: true - eslint-plugin-no-unsanitized@4.1.4: - resolution: {integrity: sha512-cjAoZoq3J+5KJuycYYOWrc0/OpZ7pl2Z3ypfFq4GtaAgheg+L7YGxUo2YS3avIvo/dYU5/zR2hXu3v81M9NxhQ==} + eslint-plugin-no-unsanitized@4.1.5: + resolution: {integrity: sha512-MSB4hXPVFQrI8weqzs6gzl7reP2k/qSjtCoL2vUMSDejIIq9YL1ZKvq5/ORBXab/PvfBBrWO2jWviYpL+4Ghfg==} peerDependencies: - eslint: ^8 || ^9 + eslint: ^9 || ^10 - eslint-plugin-no-use-extend-native@0.7.2: - resolution: {integrity: sha512-hUBlwaTXIO1GzTwPT6pAjvYwmSHe4XduDhAiQvur4RUujmBUFjd8Nb2+e7WQdsQ+nGHWGRlogcUWXJRGqizTWw==} + eslint-plugin-no-use-extend-native@0.7.3: + resolution: {integrity: sha512-kYJhgZkiZIavu/wIwrO+n4GemQcMX53kWCNZNr7nGMkRD1aBFLkDpBivEYP7nIJINCo9fzPbFjrpeX5kr2Qbww==} engines: {node: '>=18.18.0'} peerDependencies: - eslint: ^9.3.0 + eslint: ^9.3.0 || ^10.0.0 - eslint-plugin-promise@7.2.1: - resolution: {integrity: sha512-SWKjd+EuvWkYaS+uN2csvj0KoP43YTu7+phKQ5v+xw6+A0gutVX2yqCeCkC3uLCJFiPfR2dD8Es5L7yUsmvEaA==} + eslint-plugin-promise@7.3.0: + resolution: {integrity: sha512-6uGiOR0INuujr6PEQmeSSP7GbIMJ/ebEXXiEzb/nOj68LknH5Pxzb/AbZivmr6VE6TkTE8rTjRK9zhKpK6HsRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 - eslint-plugin-sonarjs@3.0.5: - resolution: {integrity: sha512-dI62Ff3zMezUToi161hs2i1HX1ie8Ia2hO0jtNBfdgRBicAG4ydy2WPt0rMTrAe3ZrlqhpAO3w1jcQEdneYoFA==} + eslint-plugin-sonarjs@4.2.0: + resolution: {integrity: sha512-bqADfuNtTL7VK6RU29eoiFTtaaBKIpVPuX3bOl+rBpWSBa0zIBVZlqZNZQjfP6s4iXkAJokv5IsD8OsACkwApg==} peerDependencies: - eslint: ^8.0.0 || ^9.0.0 + eslint: ^8.0.0 || ^9.0.0 || ^10.0.0 - eslint-plugin-unicorn@62.0.0: - resolution: {integrity: sha512-HIlIkGLkvf29YEiS/ImuDZQbP12gWyx5i3C6XrRxMvVdqMroCI9qoVYCoIl17ChN+U89pn9sVwLxhIWj5nEc7g==} - engines: {node: ^20.10.0 || >=21.0.0} + eslint-plugin-unicorn@73.0.0: + resolution: {integrity: sha512-V0YatLe9nkGhXEXKe2Qljb1EY0sJHwDV0HUF1NKFwtsHh/fU7qGHDgv+6fchzZcgU2/7noHo2gdjnmo0P2uDPw==} + engines: {node: '>=22'} peerDependencies: - eslint: '>=9.38.0' - - eslint-rule-composer@0.3.0: - resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==} - engines: {node: '>=4.0.0'} - - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - - eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint: '>=10.4' - eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} @@ -2162,9 +2326,13 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.39.1: - resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.8.1: + resolution: {integrity: sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: jiti: '*' @@ -2184,23 +2352,23 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -2260,6 +2428,9 @@ packages: picomatch: optional: true + fflate@0.8.3: + resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -2267,9 +2438,9 @@ packages: file-fetch@2.0.1: resolution: {integrity: sha512-jN4OveNyFdDIscQgaKL3vpPN5i4WnoQdWs1VQgT+3+SxsOW4+mQQzgOPQa4BjbKSkjeMv4xi+wLAMUKcL3CFtg==} - file-type@18.7.0: - resolution: {integrity: sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw==} - engines: {node: '>=14.16'} + file-type@21.3.4: + resolution: {integrity: sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==} + engines: {node: '>=20'} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} @@ -2339,10 +2510,6 @@ packages: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - fs-minipass@3.0.3: resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -2355,6 +2522,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-timeout@1.0.2: + resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} + engines: {node: '>=18'} + function.prototype.name@1.1.8: resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} @@ -2381,6 +2552,10 @@ packages: resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} engines: {node: '>=18'} + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} + get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -2397,10 +2572,6 @@ packages: resolution: {integrity: sha512-YCmOj+4YAeEB5Dd9jfp6ETdejMet4zSxXjNkgaa4npBEKRI9uDOGB5MmAdAgi2OoFGAKshYhCbmLq2DS03CgVA==} engines: {node: '>=18.0.0'} - get-stdin@9.0.0: - resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} - engines: {node: '>=12'} - get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -2428,6 +2599,10 @@ packages: deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + global-directory@4.0.1: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} engines: {node: '>=18'} @@ -2436,25 +2611,25 @@ packages: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} engines: {node: '>=10'} - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - globals@15.15.0: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} - globals@16.5.0: - resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} + globals@17.11.0: + resolution: {integrity: sha512-Z2I8hM+PbJDXQDq3Icgpzv+mPdwr68iZUU9d5WW4FuXfDUQfkZaZuvjMv42/5crNyw154+9+VWXbYrUgDXbxNw==} + engines: {node: '>=18'} + + globals@17.8.0: + resolution: {integrity: sha512-Zz/LMDZScFmkakeL2cTHzf+PbWKdpU3uclqkZT7TjDG58j5WPt0PpA+n9uPI24fZtlw07q0OtEi84K+umsRzqQ==} engines: {node: '>=18'} globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - globby@14.1.0: - resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} - engines: {node: '>=18'} + globby@16.2.2: + resolution: {integrity: sha512-NLvV9ubZ6NDsJaOpKPy3cQeJpKi9DcWiyCiFUpJPA0YihRqiE6RWaLUmgNNPr8MgPpLZjnBjSmou7uZBRJv9wA==} + engines: {node: '>=20'} globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} @@ -2512,9 +2687,12 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - hosted-git-info@7.0.2: - resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} - engines: {node: ^16.14.0 || >=18.0.0} + highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + + hosted-git-info@9.0.3: + resolution: {integrity: sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==} + engines: {node: ^20.17.0 || >=22.9.0} html-encoding-sniffer@3.0.0: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} @@ -2526,8 +2704,8 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - htmlparser2@10.0.0: - resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} + htmlparser2@10.1.0: + resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} @@ -2557,12 +2735,20 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} + + identifier-regex@1.1.0: + resolution: {integrity: sha512-SLX4H/vtcYlYnL7XqnuJKHU7Z8517TgsW9nmQiGOgMCjQ8V/deLYu6bEmbGoXe7WMMhc9+EUGyFFneHja8KabA==} + engines: {node: '>=18'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore-walk@6.0.5: - resolution: {integrity: sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ignore-walk@8.0.0: + resolution: {integrity: sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==} + engines: {node: ^20.17.0 || >=22.9.0} ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} @@ -2572,22 +2758,17 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - indent-string@5.0.0: resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} engines: {node: '>=12'} @@ -2603,9 +2784,9 @@ packages: resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - ini@4.1.3: - resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ini@6.0.0: + resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} + engines: {node: ^20.17.0 || >=22.9.0} internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} @@ -2687,11 +2868,19 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-identifier@1.1.0: + resolution: {integrity: sha512-NhOds0mDx9lJu+1lBRO0xbwFo5nobA7GCk/0e5xjr6+6XugX985+0OyGX35BNrTkPAsdLcIKg02HUQJOK8D8kw==} + engines: {node: '>=18'} + is-in-ci@1.0.0: resolution: {integrity: sha512-eUuAjybVTHMYWm/U+vBO1sY/JOCgoPCXRxzdju0K+K0BiGW0SChEL1MLC0PoCIR1OlPo5YAp8HuQoUlsWEICwg==} engines: {node: '>=18'} hasBin: true + is-in-ssh@1.0.0: + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} + engines: {node: '>=20'} + is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -2709,9 +2898,6 @@ packages: resolution: {integrity: sha512-IbPf3g3vxm1D902xaBaYp2TUHiXZWwWRu5bM9hgKN9oAQcFaKALV6Gd13PGhXjKE5u2n8s1PhLhdke/E1fchxQ==} engines: {node: '>=18.0.0'} - is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -2820,9 +3006,9 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} - engines: {node: '>=16'} + isexe@4.0.0: + resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} + engines: {node: '>=20'} istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} @@ -2839,6 +3025,9 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2854,9 +3043,13 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true - jsdoc-type-pratt-parser@6.10.0: - resolution: {integrity: sha512-+LexoTRyYui5iOhJGn13N9ZazL23nAHGkXsa1p/C8yeq79WRfLBag6ZZ0FQG2aRoc9yfo59JT9EYCQonOkHKkQ==} - engines: {node: '>=20.0.0'} + js-yaml@5.2.2: + resolution: {integrity: sha512-dayzUzKkJ1MkuUtZglSebU43utNXH0OWQByK9rKOOuYIO8M5TV1y+n8ALMdG0rdzBnfNkOmZEqrURepb0ejqBw==} + hasBin: true + + jsdoc-type-pratt-parser@9.1.1: + resolution: {integrity: sha512-kojSbQb9iQM2bk2PmHiKa3reG0U4v2gN9U8D8+eCQq+4KM5ZXBUyBVeF8KmR0RiwqyrW4+uVWYWTOLnpsavnkw==} + engines: {node: ^22.22.2 || >=24.15.0} jsep@1.4.0: resolution: {integrity: sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==} @@ -2870,9 +3063,13 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@3.0.2: - resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + json-parse-even-better-errors@5.0.0: + resolution: {integrity: sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + json-schema-to-ts@3.1.1: + resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} + engines: {node: '>=16'} json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -2906,6 +3103,10 @@ packages: just-diff@6.0.2: resolution: {integrity: sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==} + katex@0.16.47: + resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} + hasBin: true + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -2925,22 +3126,22 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - license-badger@0.22.1: - resolution: {integrity: sha512-Nwa/umKFr9dA+dDX6OLqm8NvqMV+vvrFMoE4fAbX+knh5JE1TMGTVdA2M7rE40ZxSSI1zG66btN26u/utSHbXQ==} - engines: {node: ^20.11.0 || >=22.0.0} + license-badger@0.23.0: + resolution: {integrity: sha512-b40/qxgTxmG+RuBQk5wHZLK9XK7nJLTc9Igrvs9MRuY3T9q0OJ9mSQWnRF2v0WDfAdW596/bYj2xpZJAqJ40xg==} + engines: {node: '>=24.0.0'} hasBin: true - license-types@3.1.0: - resolution: {integrity: sha512-coCk+CJr8uaOk5KSaQCon/WErJoa5jV6jkTtJfh7Ly1Q3JRTK/XJGrl7MWl7ck1c2IEKshd2VCO+tvSsj8tjpg==} + license-types@3.2.0: + resolution: {integrity: sha512-gPW/brXZjIxDQusvFGHzObypOi44NE+s558e9Yo/S2QSHSRQ58TpYU0d9ZWkiRKySS4Z6DdI2h406Xb2qdxMmg==} engines: {node: '>=14'} - licensee@11.1.1: - resolution: {integrity: sha512-FpgdKKjvJULlBqYiKtrK7J4Oo7sQO1lHQTUOcxxE4IPQccx6c0tJWMgwVdG46+rPnLPSV7EWD6eWUtAjGO52Lg==} - engines: {node: ^18.12 || ^20.9 || >= 22.7} + licensee@12.0.1: + resolution: {integrity: sha512-LMSs1+p7Gnqw4efSFaJPJJphn6QwugzXP0hD1VupIlGamkSvdxYm0asP3BVpM+DGJ5Bs3Cv1uwYhZokSNOwyPA==} + engines: {node: ^20.20 || ^22.22 || ^24.13 || >= 25.4} hasBin: true - linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + linkify-it@5.0.2: + resolution: {integrity: sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==} locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} @@ -2979,27 +3180,43 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + engines: {node: 20 || >=22} lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + make-asynchronous@1.1.0: + resolution: {integrity: sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==} + engines: {node: '>=18'} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} - make-fetch-happen@13.0.1: - resolution: {integrity: sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==} - engines: {node: ^16.14.0 || >=18.0.0} + make-fetch-happen@15.0.6: + resolution: {integrity: sha512-Je0fLJ0F5atA7F+eIlLzk+Wkcl57JDf4kf+EW8xiP5E31xOQxkIxTbgf1Oi1Lw9tRI9UEMRdI5Vz2xTzoNU1Jw==} + engines: {node: ^20.17.0 || >=22.9.0} - markdown-it@14.1.1: - resolution: {integrity: sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==} + markdown-it@14.3.0: + resolution: {integrity: sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==} hasBin: true markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + marked-terminal@7.3.0: + resolution: {integrity: sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==} + engines: {node: '>=16.0.0'} + peerDependencies: + marked: '>=1 <16' + + marked@9.1.6: + resolution: {integrity: sha512-jcByLnIFkd5gSXZmjNvS1TlmRhCXZjIzHYlaGkPlLIekG55JDR2Z4va9tZwCiP+/RDERiNhMOFu01xd6O5ct1Q==} + engines: {node: '>= 16'} + hasBin: true + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -3031,6 +3248,9 @@ packages: mdast-util-gfm@3.1.0: resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + mdast-util-math@3.0.0: + resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} + mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} @@ -3043,12 +3263,15 @@ packages: mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + mdn-data@2.29.0: + resolution: {integrity: sha512-pVxQFCcaYUEAH853+v7yoI/qzhxXSq1bTb9obMYGYAN1c3Hen+XDCEvr296XhstrwlSTNgOR7mCSD4JPjbJe5A==} + mdurl@2.0.0: resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} - meow@12.1.1: - resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} - engines: {node: '>=16.10'} + meow@14.1.0: + resolution: {integrity: sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==} + engines: {node: '>=20'} merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -3081,6 +3304,9 @@ packages: micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + micromark-extension-math@3.1.0: + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} + micromark-factory-destination@2.0.1: resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} @@ -3166,13 +3392,13 @@ packages: resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.9: resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} @@ -3184,9 +3410,9 @@ packages: resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} engines: {node: '>=16 || 14 >=14.17'} - minipass-fetch@3.0.5: - resolution: {integrity: sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + minipass-fetch@5.0.2: + resolution: {integrity: sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==} + engines: {node: ^20.17.0 || >=22.9.0} minipass-flush@1.0.5: resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} @@ -3196,30 +3422,21 @@ packages: resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} engines: {node: '>=8'} - minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + minipass-sized@2.0.0: + resolution: {integrity: sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==} engines: {node: '>=8'} minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} mocha-badge-generator@0.11.0: resolution: {integrity: sha512-S0eWVGfLvTWWvKfzMI9JhIpfGa3PrF5bA6By57kd5ckADYRP6jn7IpdSEsKiL6rhu07906P/si+YlTid0VHv8g==} @@ -3232,14 +3449,17 @@ packages: peerDependencies: mocha: '>=3.1.2' - mocha@11.7.5: - resolution: {integrity: sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==} + mocha@11.8.0: + resolution: {integrity: sha512-VyCeUdGN3A9lmCTTgG4yuvY9ixxaDk+xt2R/7/+1AP6EqNG+G9OKkzBwhVtVYoNX8YsxNSgAl8mOv3IAeOpFbw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + napi-postinstall@0.3.4: resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -3248,64 +3468,69 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - negotiator@0.6.4: - resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - node-gyp@10.3.1: - resolution: {integrity: sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ==} - engines: {node: ^16.14.0 || >=18.0.0} + node-emoji@2.2.0: + resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} + engines: {node: '>=18'} + + node-gyp@12.4.0: + resolution: {integrity: sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==} + engines: {node: ^20.17.0 || >=22.9.0} hasBin: true - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + node-releases@2.0.51: + resolution: {integrity: sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==} + engines: {node: '>=18'} - nopt@7.2.1: - resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - hasBin: true + node-releases@2.0.53: + resolution: {integrity: sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==} + engines: {node: '>=18'} - normalize-package-data@6.0.2: - resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} - engines: {node: ^16.14.0 || >=18.0.0} + nopt@9.0.0: + resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true normalize-url@8.1.0: resolution: {integrity: sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==} engines: {node: '>=14.16'} - npm-bundled@3.0.1: - resolution: {integrity: sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-bundled@5.0.0: + resolution: {integrity: sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==} + engines: {node: ^20.17.0 || >=22.9.0} - npm-install-checks@6.3.0: - resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-install-checks@8.0.0: + resolution: {integrity: sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==} + engines: {node: ^20.17.0 || >=22.9.0} npm-license-corrections@1.9.0: resolution: {integrity: sha512-9Tq6y6zop5lsZy6dInbgrCLnqtuN+3jBc9NCusKjbeQL4LRudDkvmCYyInsDOaKN7GIVbBSvDto5MnEqYXVhxQ==} - npm-normalize-package-bin@3.0.1: - resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-normalize-package-bin@5.0.0: + resolution: {integrity: sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==} + engines: {node: ^20.17.0 || >=22.9.0} - npm-package-arg@11.0.3: - resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} - engines: {node: ^16.14.0 || >=18.0.0} + npm-package-arg@13.0.2: + resolution: {integrity: sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==} + engines: {node: ^20.17.0 || >=22.9.0} - npm-packlist@8.0.2: - resolution: {integrity: sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + npm-packlist@10.0.4: + resolution: {integrity: sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng==} + engines: {node: ^20.17.0 || >=22.9.0} - npm-pick-manifest@9.1.0: - resolution: {integrity: sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==} - engines: {node: ^16.14.0 || >=18.0.0} + npm-pick-manifest@11.0.3: + resolution: {integrity: sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==} + engines: {node: ^20.17.0 || >=22.9.0} - npm-registry-fetch@17.1.0: - resolution: {integrity: sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==} - engines: {node: ^16.14.0 || >=18.0.0} + npm-registry-fetch@19.1.1: + resolution: {integrity: sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==} + engines: {node: ^20.17.0 || >=22.9.0} nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -3314,8 +3539,12 @@ packages: resolution: {integrity: sha512-Q/uLAAfjdhrzQWN2czRNh3fDCgXjh7yRIkdHjDgIHTwpFP0BsshxTA3HRNffHR7Iw/XGTH30u8vdMXQ+079urA==} engines: {node: '>=18.0.0'} - object-deep-merge@2.0.0: - resolution: {integrity: sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg==} + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-deep-merge@2.0.1: + resolution: {integrity: sha512-aKttDKcU3pyZqKcCkDhsMn70WmZFG2JGDQLP9EcLyTSIFQRCPWLAmBZRLJnrVUrhPG1jETEEbfdgbNtJf1LyMg==} object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} @@ -3341,14 +3570,18 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} - open-cli@8.0.0: - resolution: {integrity: sha512-3muD3BbfLyzl+aMVSEfn2FfOqGdPYR0O4KNnxXsLEPE2q9OSjBfJAaB6XKbrUzLgymoSMejvb5jpXJfru/Ko2A==} - engines: {node: '>=18'} + obug@2.1.4: + resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} + engines: {node: '>=12.20.0'} + + open-cli@9.0.0: + resolution: {integrity: sha512-4UHkLVm4tUM/ardg66uY3x1icgfCnunks5eFVFBzASO3b13Ow2Md3xs9YT7yXWFjXOBpauIeh/N9fvbziU1wkg==} + engines: {node: '>=22'} hasBin: true - open@10.2.0: - resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} - engines: {node: '>=18'} + open@11.0.0: + resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} + engines: {node: '>=20'} opener@1.5.2: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} @@ -3366,6 +3599,10 @@ packages: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} + p-event@6.0.1: + resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} + engines: {node: '>=16.17'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -3382,9 +3619,13 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} + p-map@7.0.6: + resolution: {integrity: sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==} + engines: {node: '>=18'} + + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} @@ -3401,18 +3642,14 @@ packages: resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} engines: {node: '>=14.16'} - pacote@18.0.6: - resolution: {integrity: sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==} - engines: {node: ^16.14.0 || >=18.0.0} + pacote@21.5.1: + resolution: {integrity: sha512-KvcJ9iy3crysCsgqc4+PknH/w6jkrp8JN36mpZBPwNaDRwTfMZD37YzRazNstiZUOhuF5pno9f78n9mEJBavwg==} + engines: {node: ^20.17.0 || >=22.9.0} hasBin: true - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-conflict-json@3.0.1: - resolution: {integrity: sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + parse-conflict-json@5.0.1: + resolution: {integrity: sha512-ZHEmNKMq1wyJXNwLxyHnluPfRAFSIliBvbK/UiOceROt4Xh9Pz0fq49NytIaeaCUf5VR86hwQ/34FCcNU5/LKQ==} + engines: {node: ^20.17.0 || >=22.9.0} parse-imports-exports@0.2.4: resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} @@ -3420,6 +3657,15 @@ packages: parse-statements@1.0.11: resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} + parse5-htmlparser2-tree-adapter@6.0.1: + resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} + + parse5@5.1.1: + resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} + + parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3435,13 +3681,9 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-type@6.0.0: - resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} - engines: {node: '>=18'} - - peek-readable@5.4.2: - resolution: {integrity: sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==} - engines: {node: '>=14.16'} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -3466,25 +3708,29 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + postcss-selector-parser@7.1.4: + resolution: {integrity: sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==} engines: {node: '>=4'} + powershell-utils@0.1.0: + resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} + engines: {node: '>=20'} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - proc-log@4.2.0: - resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + proc-log@6.1.0: + resolution: {integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==} + engines: {node: ^20.17.0 || >=22.9.0} process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} - proggy@2.0.0: - resolution: {integrity: sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + proggy@4.0.0: + resolution: {integrity: sha512-MbA4R+WQT76ZBm/5JUpV9yqcJt92175+Y0Bodg3HgiXzrmKu7Ggq+bpn6y6wHH+gN9NcyKn3yg1+d47VaKwNAQ==} + engines: {node: ^20.17.0 || >=22.9.0} promise-all-reject-late@1.0.1: resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} @@ -3492,18 +3738,6 @@ packages: promise-call-limit@3.0.2: resolution: {integrity: sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw==} - promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - - promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} - proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -3534,6 +3768,10 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} + quote-js-string@0.1.0: + resolution: {integrity: sha512-Y3NoRtprEEZQD8RfxMCfS0ZTqc4e+i18OrXEXAvpM6TfC/3y+0L5rNbZiSnbBBEkDfFzbpd8o+cE8q3/anjMGA==} + engines: {node: '>=22'} + randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} @@ -3541,22 +3779,14 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - read-cmd-shim@4.0.0: - resolution: {integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + read-cmd-shim@6.0.0: + resolution: {integrity: sha512-1zM5HuOfagXCBWMN83fuFI/x+T/UhZ7k+KIzhrHXcQoeX5+7gmaDYjELQHmmzIodumBHeByBJT4QYS7ufAgs7A==} + engines: {node: ^20.17.0 || >=22.9.0} readable-stream@4.7.0: resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - readable-web-to-node-stream@3.0.4: - resolution: {integrity: sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw==} - engines: {node: '>=8'} - readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -3584,10 +3814,6 @@ packages: resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -3607,8 +3833,8 @@ packages: regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - regjsparser@0.13.0: - resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} + regjsparser@0.13.2: + resolution: {integrity: sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==} hasBin: true require-directory@2.1.1: @@ -3629,10 +3855,6 @@ packages: resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} @@ -3653,16 +3875,12 @@ packages: resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} engines: {node: '>=14.16'} - retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - reusify@1.1.0: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.59.0: - resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} + rollup@4.62.4: + resolution: {integrity: sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3709,19 +3927,23 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} hasBin: true serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serialize-javascript@7.0.7: + resolution: {integrity: sha512-YAy8Od6KV+uuwUuU50np8fGB/Aues6Y0nAhA9y/hId74PlKUcme4pXcBD46NWKr1Q4osN/iseZ17YqO1XfmI8g==} + engines: {node: '>=20.0.0'} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -3765,9 +3987,13 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sigstore@2.3.1: - resolution: {integrity: sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==} - engines: {node: ^16.14.0 || >=18.0.0} + sigstore@4.1.1: + resolution: {integrity: sha512-endqECJkfhozrXMK5ngu/UAA0xVcVEFdnHJCElGaExypjW+HK5i6zu3NteLoaX/iFbRUbC3+DjttQs0GARr+5w==} + engines: {node: ^20.17.0 || >=22.9.0} + + skin-tone@2.0.0: + resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} + engines: {node: '>=8'} slash@5.1.0: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} @@ -3788,6 +4014,10 @@ packages: resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -3810,6 +4040,9 @@ packages: spdx-expression-parse@4.0.0: resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + spdx-expression-parse@5.0.0: + resolution: {integrity: sha512-vngmw3Rgn+o2arXNbnZaj5UtOEBuWBfvaI+Wc8GFfykIhA5/vdK9/Sp/XkLv63dykz2rxKDvKEHupF5P0FORcQ==} + spdx-expression-validate@2.0.0: resolution: {integrity: sha512-b3wydZLM+Tc6CFvaRDBOF9d76oGIHNCLYFeHbftFXUWjnfZWganmDmvtM5sm1cRwJc/VDBMLyGGrsLFd1vOxbg==} @@ -3822,8 +4055,8 @@ packages: spdx-ranges@2.1.1: resolution: {integrity: sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==} - spdx-satisfies@5.0.1: - resolution: {integrity: sha512-Nwor6W6gzFp8XX4neaKQ7ChV4wmpSh2sSDemMFSzHxpTw460jxFYeOn+jq4ybnSSw/5sc3pjka9MQPouksQNpw==} + spdx-satisfies@6.0.0: + resolution: {integrity: sha512-oOWQocnRbFVtBnBITfFgzjhnOklHossTvI+6C1hB2slvp3HgTsfru5wuo8HY2rQpwSm5JuIhNzIuqOfR5IuojQ==} spdx-whitelisted@1.0.0: resolution: {integrity: sha512-X4FOpUCvZuo42MdB1zAZ/wdX4N0lLcWDozf2KYFVDgtLv8Lx+f31LOYLP2/FcwTzsPi64bS/VwKqklI4RBletg==} @@ -3831,12 +4064,13 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - ssri@10.0.6: - resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ssri@13.0.1: + resolution: {integrity: sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==} + engines: {node: ^20.17.0 || >=22.9.0} - stable-hash@0.0.5: - resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + stable-hash-x@0.2.0: + resolution: {integrity: sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==} + engines: {node: '>=12.0.0'} stable@0.1.8: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} @@ -3861,6 +4095,10 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} + string-width@8.2.2: + resolution: {integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==} + engines: {node: '>=20'} + string.prototype.trim@1.2.10: resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} @@ -3900,9 +4138,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strtok3@7.1.1: - resolution: {integrity: sha512-mKX8HA/cdBqMKUr0MMZAFssCkIGoZeSCMXgnt79yKxNFguMLVFgRe6wB+fsL0NmoHDbeyZXczy7vEPSoo3rkzg==} - engines: {node: '>=16'} + strtok3@10.3.5: + resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==} + engines: {node: '>=18'} stubborn-fs@2.0.0: resolution: {integrity: sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==} @@ -3910,6 +4148,10 @@ packages: stubborn-utils@1.0.2: resolution: {integrity: sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==} + super-regex@1.1.0: + resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} + engines: {node: '>=18'} + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -3922,6 +4164,10 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} + supports-hyperlinks@3.2.0: + resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} + engines: {node: '>=14.18'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -3939,21 +4185,24 @@ packages: resolution: {integrity: sha512-iK5/YhZxq5GO5z8wb0bY1317uDF3Zjpha0QFFLA8/trAoiLbQD0HUbMesEaxyzUgDxi2QlcbM8IvqOlEjgoXBA==} engines: {node: '>=12.17'} + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + tapable@2.3.0: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + tar@7.5.22: + resolution: {integrity: sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==} + engines: {node: '>=18'} temp-dir@3.0.0: resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} engines: {node: '>=14.16'} - tempy@3.1.0: - resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==} + tempy@3.2.0: + resolution: {integrity: sha512-d79HhZya5Djd7am0q+W4RTsSU+D/aJzM+4Y4AGJGuGlgM2L6sx5ZvOYTmZjqPhrDrV6xJTtRSm1JCLj6V6LHLQ==} engines: {node: '>=14.16'} terser@5.44.1: @@ -3961,9 +4210,20 @@ packages: engines: {node: '>=10'} hasBin: true - test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} - engines: {node: '>=18'} + test-exclude@8.0.0: + resolution: {integrity: sha512-ZOffsNrXYggvU1mDGHk54I96r26P8SyMjO5slMKSc7+IWmtB/MQKnEC2fP51imB3/pT6YK5cT5E8f+Dd9KdyOQ==} + engines: {node: 20 || >=22} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + time-span@5.1.0: + resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} + engines: {node: '>=12'} tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} @@ -3977,14 +4237,23 @@ packages: resolution: {integrity: sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==} engines: {node: '>=20'} - token-types@5.0.1: - resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} + token-types@6.1.2: + resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} engines: {node: '>=14.16'} treeverse@3.0.0: resolution: {integrity: sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ts-algebra@2.0.0: + resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} + + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-declaration-location@1.0.7: resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} peerDependencies: @@ -3996,9 +4265,9 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tuf-js@2.2.1: - resolution: {integrity: sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==} - engines: {node: ^16.14.0 || >=18.0.0} + tuf-js@4.1.0: + resolution: {integrity: sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==} + engines: {node: ^20.17.0 || >=22.9.0} type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -4016,6 +4285,10 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} + type-fest@5.8.0: + resolution: {integrity: sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==} + engines: {node: '>=20'} + type@2.7.3: resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} @@ -4038,15 +4311,20 @@ packages: typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - typedoc@0.28.14: - resolution: {integrity: sha512-ftJYPvpVfQvFzpkoSfHLkJybdA/geDJ8BGQt/ZnkkhnBYoYW6lBgPQXu6vqLxO4X75dA55hX8Af847H5KXlEFA==} + typedoc@0.28.20: + resolution: {integrity: sha512-uSKqkh8Cr48vllnEy+jdaAgOeR6Y+QCBW7usgUsKj7gJEfR7stw9U/fE49LBnj2tPRKPY0c0EBJSWe9Appmplg==} engines: {node: '>= 18', pnpm: '>= 10'} hasBin: true peerDependencies: - typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x + typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x || 6.0.x - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + typescript@5.6.1-rc: + resolution: {integrity: sha512-E3b2+1zEFu84jB0YQi9BORDjz9+jGbwwy1Zi3G0LUNw7a7cePUrHMRNy8aPh53nXpkFGVHSxIZo5vKTfYaFiBQ==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true @@ -4065,14 +4343,29 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} + undici-types@8.3.0: + resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} + + undici@6.28.0: + resolution: {integrity: sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==} + engines: {node: '>=18.17'} + unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} + unicode-emoji-modifier-base@1.0.0: + resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} + engines: {node: '>=4'} + unicode-match-property-ecmascript@2.0.0: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} @@ -4085,22 +4378,14 @@ packages: resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} engines: {node: '>=4'} - unicorn-magic@0.3.0: - resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} - engines: {node: '>=18'} + unicorn-magic@0.4.0: + resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} + engines: {node: '>=20'} union@0.5.0: resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} engines: {node: '>= 0.8.0'} - unique-filename@3.0.0: - resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - unique-slug@4.0.0: - resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - unique-string@3.0.0: resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} engines: {node: '>=12'} @@ -4108,6 +4393,9 @@ packages: unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} @@ -4120,8 +4408,14 @@ packages: unrs-resolver@1.11.1: resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} - update-browserslist-db@1.1.4: - resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + update-browserslist-db@1.3.1: + resolution: {integrity: sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -4147,15 +4441,20 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - validate-npm-package-name@5.0.1: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - walk-up-path@3.0.1: - resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} + validate-npm-package-name@7.0.2: + resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} + engines: {node: ^20.17.0 || >=22.9.0} + + walk-up-path@4.0.0: + resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} + engines: {node: 20 || >=22} + + web-worker@1.5.0: + resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} whatwg-encoding@2.0.0: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} @@ -4186,9 +4485,9 @@ packages: engines: {node: '>= 8'} hasBin: true - which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} + which@6.0.1: + resolution: {integrity: sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==} + engines: {node: ^20.17.0 || >=22.9.0} hasBin: true widest-line@4.0.1: @@ -4229,13 +4528,13 @@ packages: write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - write-file-atomic@5.0.1: - resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + write-file-atomic@7.0.1: + resolution: {integrity: sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==} + engines: {node: ^20.17.0 || >=22.9.0} - wsl-utils@0.1.0: - resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} - engines: {node: '>=18'} + wsl-utils@0.3.1: + resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} + engines: {node: '>=20'} xdg-basedir@5.1.0: resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} @@ -4245,29 +4544,46 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yaml@2.9.0: resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} hasBin: true + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yargs-unparser@2.0.0: resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} engines: {node: '>=10'} + yargs@16.2.2: + resolution: {integrity: sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==} + engines: {node: '>=10'} + yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yargs@18.1.0: + resolution: {integrity: sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -4277,11 +4593,28 @@ packages: snapshots: - '@babel/code-frame@7.27.1': + '@andrewbranch/untar.js@1.0.3': {} + + '@arethetypeswrong/cli@0.18.5': dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 + '@arethetypeswrong/core': 0.18.5 + chalk: 4.1.2 + cli-table3: 0.6.5 + commander: 10.0.1 + marked: 9.1.6 + marked-terminal: 7.3.0(marked@9.1.6) + semver: 7.8.5 + + '@arethetypeswrong/core@0.18.5': + dependencies: + '@andrewbranch/untar.js': 1.0.3 + '@loaderkit/resolve': 1.0.6 + cjs-module-lexer: 1.4.3 + fflate: 0.8.3 + lru-cache: 11.5.2 + semver: 7.8.5 + typescript: 5.6.1-rc + validate-npm-package-name: 5.0.1 '@babel/code-frame@7.29.0': dependencies: @@ -4289,678 +4622,586 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.28.5': {} + '@babel/code-frame@8.0.0': + dependencies: + '@babel/helper-validator-identifier': 8.0.4 + js-tokens: 10.0.0 + + '@babel/compat-data@8.0.0': {} - '@babel/core@7.28.5': + '@babel/core@8.0.1': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - '@jridgewell/remapping': 2.3.5 + '@babel/code-frame': 8.0.0 + '@babel/generator': 8.0.0 + '@babel/helper-compilation-targets': 8.0.0 + '@babel/helpers': 8.0.0 + '@babel/parser': 8.0.4 + '@babel/template': 8.0.0 + '@babel/traverse': 8.0.4 + '@babel/types': 8.0.4 + '@types/gensync': 1.0.5 convert-source-map: 2.0.0 - debug: 4.4.3(supports-color@8.1.1) + empathic: 2.0.1 gensync: 1.0.0-beta.2 + import-meta-resolve: 4.2.0 json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color + obug: 2.1.4 + semver: 7.7.3 - '@babel/eslint-parser@7.28.5(@babel/core@7.28.5)(eslint@9.39.1)': + '@babel/eslint-parser@8.0.1(@babel/core@8.0.1)(eslint@10.8.1(supports-color@8.1.1))': dependencies: - '@babel/core': 7.28.5 - '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 9.39.1 - eslint-visitor-keys: 2.1.0 - semver: 6.3.1 + '@babel/core': 8.0.1 + eslint: 10.8.1(supports-color@8.1.1) + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + semver: 7.8.5 - '@babel/eslint-plugin@7.27.1(@babel/eslint-parser@7.28.5(@babel/core@7.28.5)(eslint@9.39.1))(eslint@9.39.1)': + '@babel/eslint-plugin@8.0.1(@babel/core@8.0.1)(@babel/eslint-parser@8.0.1(@babel/core@8.0.1)(eslint@10.8.1(supports-color@8.1.1)))(eslint@10.8.1(supports-color@8.1.1))': dependencies: - '@babel/eslint-parser': 7.28.5(@babel/core@7.28.5)(eslint@9.39.1) - eslint: 9.39.1 - eslint-rule-composer: 0.3.0 + '@babel/core': 8.0.1 + '@babel/eslint-parser': 8.0.1(@babel/core@8.0.1)(eslint@10.8.1(supports-color@8.1.1)) + eslint: 10.8.1(supports-color@8.1.1) - '@babel/generator@7.28.5': + '@babel/generator@7.29.1': dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/parser': 7.29.3 + '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/generator@7.29.1': + '@babel/generator@8.0.0': dependencies: - '@babel/parser': 7.29.3 - '@babel/types': 7.29.0 + '@babel/parser': 8.0.4 + '@babel/types': 8.0.4 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 + '@types/jsesc': 2.5.1 jsesc: 3.1.0 - '@babel/helper-annotate-as-pure@7.27.3': + '@babel/helper-annotate-as-pure@8.0.0': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 8.0.4 - '@babel/helper-compilation-targets@7.27.2': + '@babel/helper-compilation-targets@8.0.0': dependencies: - '@babel/compat-data': 7.28.5 - '@babel/helper-validator-option': 7.27.1 + '@babel/compat-data': 8.0.0 + '@babel/helper-validator-option': 8.0.0 browserslist: 4.28.0 - lru-cache: 5.1.1 - semver: 6.3.1 + lru-cache: 11.5.2 + semver: 7.7.3 - '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.5)': + '@babel/helper-create-class-features-plugin@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.5 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-annotate-as-pure': 8.0.0 + '@babel/helper-member-expression-to-functions': 8.0.0 + '@babel/helper-optimise-call-expression': 8.0.0 + '@babel/helper-replace-supers': 8.0.1(@babel/core@8.0.1) + '@babel/helper-skip-transparent-expression-wrappers': 8.0.0 + '@babel/traverse': 8.0.4 + semver: 7.8.5 - '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.5)': + '@babel/helper-create-regexp-features-plugin@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/core': 8.0.1 + '@babel/helper-annotate-as-pure': 8.0.0 regexpu-core: 6.4.0 - semver: 6.3.1 + semver: 7.8.5 - '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.5)': + '@babel/helper-define-polyfill-provider@1.0.0(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.3(supports-color@8.1.1) + '@babel/core': 8.0.1 + '@babel/helper-compilation-targets': 8.0.0 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) lodash.debounce: 4.0.8 - resolve: 1.22.11 - transitivePeerDependencies: - - supports-color '@babel/helper-globals@7.28.0': {} - '@babel/helper-member-expression-to-functions@7.28.5': - dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - transitivePeerDependencies: - - supports-color + '@babel/helper-globals@8.0.0': {} - '@babel/helper-module-imports@7.27.1': + '@babel/helper-member-expression-to-functions@8.0.0': dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - transitivePeerDependencies: - - supports-color + '@babel/traverse': 8.0.4 + '@babel/types': 8.0.4 - '@babel/helper-module-imports@7.28.6': + '@babel/helper-module-imports@7.28.6(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.29.0 + '@babel/traverse': 7.29.0(supports-color@8.1.1) '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + '@babel/helper-module-imports@8.0.0': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color + '@babel/traverse': 8.0.4 + '@babel/types': 8.0.4 - '@babel/helper-module-transforms@7.28.6(@babel/core@7.28.5)': + '@babel/helper-module-transforms@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-module-imports': 8.0.0 + '@babel/helper-validator-identifier': 8.0.4 + '@babel/traverse': 8.0.4 - '@babel/helper-optimise-call-expression@7.27.1': + '@babel/helper-optimise-call-expression@8.0.0': dependencies: - '@babel/types': 7.28.5 - - '@babel/helper-plugin-utils@7.27.1': {} + '@babel/types': 8.0.4 - '@babel/helper-plugin-utils@7.28.6': {} + '@babel/helper-plugin-utils@8.0.1(@babel/core@8.0.1)': + dependencies: + '@babel/core': 8.0.1 - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.5)': + '@babel/helper-remap-async-to-generator@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.28.3 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-annotate-as-pure': 8.0.0 + '@babel/helper-wrap-function': 8.0.0 + '@babel/traverse': 8.0.4 - '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5)': + '@babel/helper-replace-supers@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-member-expression-to-functions': 8.0.0 + '@babel/helper-optimise-call-expression': 8.0.0 + '@babel/traverse': 8.0.4 - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + '@babel/helper-skip-transparent-expression-wrappers@8.0.0': dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - transitivePeerDependencies: - - supports-color + '@babel/traverse': 8.0.4 + '@babel/types': 8.0.4 '@babel/helper-string-parser@7.27.1': {} + '@babel/helper-string-parser@8.0.0': {} + '@babel/helper-validator-identifier@7.28.5': {} - '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-validator-identifier@8.0.4': {} - '@babel/helper-wrap-function@7.28.3': - dependencies: - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - transitivePeerDependencies: - - supports-color + '@babel/helper-validator-option@8.0.0': {} - '@babel/helpers@7.28.4': + '@babel/helper-wrap-function@8.0.0': dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/template': 8.0.0 + '@babel/traverse': 8.0.4 + '@babel/types': 8.0.4 - '@babel/parser@7.28.5': + '@babel/helpers@8.0.0': dependencies: - '@babel/types': 7.28.5 + '@babel/template': 8.0.0 + '@babel/types': 8.0.4 '@babel/parser@7.29.3': dependencies: '@babel/types': 7.29.0 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.28.5)': + '@babel/parser@8.0.4': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 8.0.4 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.5)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5)': + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + '@babel/helper-skip-transparent-expression-wrappers': 8.0.0 - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + '@babel/helper-skip-transparent-expression-wrappers': 8.0.0 + '@babel/plugin-transform-optional-chaining': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.5)': + '@babel/plugin-transform-arrow-functions@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-async-generator-functions@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + '@babel/helper-remap-async-to-generator': 8.0.1(@babel/core@8.0.1) + '@babel/traverse': 8.0.4 - '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.5)': + '@babel/plugin-transform-async-to-generator@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-module-imports': 8.0.0 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + '@babel/helper-remap-async-to-generator': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-block-scoped-functions@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-block-scoping@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.28.5)': + '@babel/plugin-transform-class-properties@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-create-class-features-plugin': 8.0.1(@babel/core@8.0.1) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-class-static-block@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-create-class-features-plugin': 8.0.1(@babel/core@8.0.1) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.5)': + '@babel/plugin-transform-classes@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-annotate-as-pure': 8.0.0 + '@babel/helper-compilation-targets': 8.0.0 + '@babel/helper-globals': 8.0.0 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + '@babel/helper-replace-supers': 8.0.1(@babel/core@8.0.1) + '@babel/traverse': 8.0.4 - '@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.5)': + '@babel/plugin-transform-computed-properties@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-globals': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-destructuring@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/template': 7.27.2 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.5)': + '@babel/plugin-transform-dotall-regex@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-create-regexp-features-plugin': 8.0.1(@babel/core@8.0.1) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-duplicate-keys@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-create-regexp-features-plugin': 8.0.1(@babel/core@8.0.1) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-dynamic-import@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-explicit-resource-management@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-destructuring': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.5)': + '@babel/plugin-transform-exponentiation-operator@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-exponentiation-operator@7.28.5(@babel/core@7.28.5)': + '@babel/plugin-transform-export-namespace-from@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-for-of@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + '@babel/helper-skip-transparent-expression-wrappers': 8.0.0 - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-function-name@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-compilation-targets': 8.0.0 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-json-strings@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-literals@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-logical-assignment-operators@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-logical-assignment-operators@7.28.5(@babel/core@7.28.5)': + '@babel/plugin-transform-member-expression-literals@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-modules-amd@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-module-transforms': 8.0.1(@babel/core@8.0.1) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-modules-commonjs@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-module-transforms': 8.0.1(@babel/core@8.0.1) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-modules-systemjs@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-module-transforms': 8.0.1(@babel/core@8.0.1) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + '@babel/helper-validator-identifier': 8.0.4 - '@babel/plugin-transform-modules-systemjs@7.29.4(@babel/core@7.28.5)': + '@babel/plugin-transform-modules-umd@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.29.0 - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-module-transforms': 8.0.1(@babel/core@8.0.1) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-named-capturing-groups-regex@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-create-regexp-features-plugin': 8.0.1(@babel/core@8.0.1) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-new-target@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-nullish-coalescing-operator@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-numeric-separator@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-object-rest-spread@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-compilation-targets': 8.0.0 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-destructuring': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-parameters': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.28.5)': + '@babel/plugin-transform-object-super@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + '@babel/helper-replace-supers': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-optional-catch-binding@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-optional-chaining@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + '@babel/helper-skip-transparent-expression-wrappers': 8.0.0 - '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.28.5)': + '@babel/plugin-transform-parameters@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.5)': + '@babel/plugin-transform-private-methods@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-create-class-features-plugin': 8.0.1(@babel/core@8.0.1) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-private-property-in-object@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-annotate-as-pure': 8.0.0 + '@babel/helper-create-class-features-plugin': 8.0.1(@babel/core@8.0.1) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-property-literals@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-regenerator@8.0.2(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.28.5)': + '@babel/plugin-transform-regexp-modifiers@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-create-regexp-features-plugin': 8.0.1(@babel/core@8.0.1) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-reserved-words@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-shorthand-properties@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-spread@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + '@babel/helper-skip-transparent-expression-wrappers': 8.0.0 - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-sticky-regex@8.0.1(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/preset-env@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/compat-data': 7.28.5 - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.28.5) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5) - '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.5) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.5) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.5) - '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.28.5) - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.5) - '@babel/plugin-transform-exponentiation-operator': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-logical-assignment-operators': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-systemjs': 7.29.4(@babel/core@7.28.5) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.28.5) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.28.5) - '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.5) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.5) - babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.5) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.5) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.5) - core-js-compat: 3.47.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + + '@babel/plugin-transform-template-literals@8.0.1(@babel/core@8.0.1)': + dependencies: + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + + '@babel/plugin-transform-typeof-symbol@8.0.1(@babel/core@8.0.1)': + dependencies: + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + + '@babel/plugin-transform-unicode-escapes@8.0.1(@babel/core@8.0.1)': + dependencies: + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + + '@babel/plugin-transform-unicode-property-regex@8.0.1(@babel/core@8.0.1)': + dependencies: + '@babel/core': 8.0.1 + '@babel/helper-create-regexp-features-plugin': 8.0.1(@babel/core@8.0.1) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + + '@babel/plugin-transform-unicode-regex@8.0.1(@babel/core@8.0.1)': + dependencies: + '@babel/core': 8.0.1 + '@babel/helper-create-regexp-features-plugin': 8.0.1(@babel/core@8.0.1) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + + '@babel/plugin-transform-unicode-sets-regex@8.0.1(@babel/core@8.0.1)': + dependencies: + '@babel/core': 8.0.1 + '@babel/helper-create-regexp-features-plugin': 8.0.1(@babel/core@8.0.1) + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + + '@babel/preset-env@8.0.2(@babel/core@8.0.1)': + dependencies: + '@babel/compat-data': 8.0.0 + '@babel/core': 8.0.1 + '@babel/helper-compilation-targets': 8.0.0 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + '@babel/helper-validator-option': 8.0.0 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-bugfix-safari-rest-destructuring-rhs-array': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-arrow-functions': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-async-generator-functions': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-async-to-generator': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-block-scoped-functions': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-block-scoping': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-class-properties': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-class-static-block': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-classes': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-computed-properties': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-destructuring': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-dotall-regex': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-duplicate-keys': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-dynamic-import': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-explicit-resource-management': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-exponentiation-operator': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-export-namespace-from': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-for-of': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-function-name': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-json-strings': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-literals': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-logical-assignment-operators': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-member-expression-literals': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-modules-amd': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-modules-commonjs': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-modules-systemjs': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-modules-umd': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-named-capturing-groups-regex': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-new-target': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-nullish-coalescing-operator': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-numeric-separator': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-object-rest-spread': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-object-super': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-optional-catch-binding': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-optional-chaining': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-parameters': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-private-methods': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-private-property-in-object': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-property-literals': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-regenerator': 8.0.2(@babel/core@8.0.1) + '@babel/plugin-transform-regexp-modifiers': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-reserved-words': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-shorthand-properties': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-spread': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-sticky-regex': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-template-literals': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-typeof-symbol': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-unicode-escapes': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-unicode-property-regex': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-unicode-regex': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-unicode-sets-regex': 8.0.1(@babel/core@8.0.1) + '@babel/preset-modules': 0.2.0(@babel/core@8.0.1) + babel-plugin-polyfill-corejs3: 1.0.0(@babel/core@8.0.1) + core-js-compat: 3.49.0 + semver: 7.7.3 - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.5)': + '@babel/preset-modules@0.2.0(@babel/core@8.0.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.28.5 + '@babel/core': 8.0.1 + '@babel/helper-plugin-utils': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-dotall-regex': 8.0.1(@babel/core@8.0.1) + '@babel/plugin-transform-unicode-property-regex': 8.0.1(@babel/core@8.0.1) + '@babel/types': 8.0.4 esutils: 2.0.3 - '@babel/template@7.27.2': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/runtime@7.29.7': {} '@babel/template@7.28.6': dependencies: @@ -4968,19 +5209,13 @@ snapshots: '@babel/parser': 7.29.3 '@babel/types': 7.29.0 - '@babel/traverse@7.28.5': + '@babel/template@8.0.0': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 - debug: 4.4.3(supports-color@8.1.1) - transitivePeerDependencies: - - supports-color + '@babel/code-frame': 8.0.0 + '@babel/parser': 8.0.4 + '@babel/types': 8.0.4 - '@babel/traverse@7.29.0': + '@babel/traverse@7.29.0(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.29.0 '@babel/generator': 7.29.1 @@ -4992,23 +5227,40 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/types@7.28.5': + '@babel/traverse@8.0.4': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/code-frame': 8.0.0 + '@babel/generator': 8.0.0 + '@babel/helper-globals': 8.0.0 + '@babel/parser': 8.0.4 + '@babel/template': 8.0.0 + '@babel/types': 8.0.4 + obug: 2.1.4 '@babel/types@7.29.0': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 + '@babel/types@8.0.4': + dependencies: + '@babel/helper-string-parser': 8.0.0 + '@babel/helper-validator-identifier': 8.0.4 + '@bcoe/v8-coverage@1.0.2': {} '@blueoak/list@15.0.0': {} - '@brettz9/eslint-plugin@3.0.0(eslint@9.39.1)': + '@borewit/text-codec@0.2.2': {} + + '@braidai/lang@1.1.2': {} + + '@brettz9/eslint-plugin@3.0.0(eslint@10.8.1(supports-color@8.1.1))': dependencies: - eslint: 9.39.1 + eslint: 10.8.1(supports-color@8.1.1) + + '@colors/colors@1.5.0': + optional: true '@emnapi/core@1.7.1': dependencies: @@ -5026,92 +5278,87 @@ snapshots: tslib: 2.8.1 optional: true - '@es-joy/jsdoccomment@0.76.0': + '@es-joy/jsdoccomment@0.95.0': dependencies: '@types/estree': 1.0.9 - '@typescript-eslint/types': 8.47.0 - comment-parser: 1.4.1 - esquery: 1.6.0 - jsdoc-type-pratt-parser: 6.10.0 + '@typescript-eslint/types': 8.67.0 + comment-parser: 1.4.8 + esquery: 1.7.0 + jsdoc-type-pratt-parser: 9.1.1 '@es-joy/resolve.exports@1.2.0': {} - '@eslint-community/eslint-plugin-eslint-comments@4.5.0(eslint@9.39.1)': + '@eslint-community/eslint-plugin-eslint-comments@4.7.2(eslint@10.8.1(supports-color@8.1.1))': dependencies: escape-string-regexp: 4.0.0 - eslint: 9.39.1 - ignore: 5.3.2 + eslint: 10.8.1(supports-color@8.1.1) + ignore: 7.0.5 - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)': + '@eslint-community/eslint-utils@4.10.1(eslint@10.8.1(supports-color@8.1.1))': dependencies: - eslint: 9.39.1 + eslint: 10.8.1(supports-color@8.1.1) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} - '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.1': + '@eslint/config-array@0.23.5(supports-color@8.1.1)': dependencies: - '@eslint/object-schema': 2.1.7 + '@eslint/object-schema': 3.0.5 debug: 4.4.3(supports-color@8.1.1) - minimatch: 3.1.5 + minimatch: 10.2.5 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.4.2': + '@eslint/config-helpers@0.7.0': dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.2.1 - '@eslint/core@0.17.0': + '@eslint/core@1.2.1': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.1': + '@eslint/css-tree@4.0.5': dependencies: - ajv: 6.15.0 - debug: 4.4.3(supports-color@8.1.1) - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - minimatch: 3.1.5 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + mdn-data: 2.29.0 + source-map-js: 1.2.1 - '@eslint/js@9.39.1': {} + '@eslint/js@10.0.1(eslint@10.8.1(supports-color@8.1.1))': + optionalDependencies: + eslint: 10.8.1(supports-color@8.1.1) - '@eslint/markdown@7.5.1': + '@eslint/markdown@8.0.3(supports-color@8.1.1)': dependencies: - '@eslint/core': 0.17.0 - '@eslint/plugin-kit': 0.4.1 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 github-slugger: 2.0.0 - mdast-util-from-markdown: 2.0.2 - mdast-util-frontmatter: 2.0.1 - mdast-util-gfm: 3.1.0 + mdast-util-from-markdown: 2.0.2(supports-color@8.1.1) + mdast-util-frontmatter: 2.0.1(supports-color@8.1.1) + mdast-util-gfm: 3.1.0(supports-color@8.1.1) + mdast-util-math: 3.0.0(supports-color@8.1.1) micromark-extension-frontmatter: 2.0.0 micromark-extension-gfm: 3.0.0 + micromark-extension-math: 3.1.0 micromark-util-normalize-identifier: 2.0.1 transitivePeerDependencies: - supports-color - '@eslint/object-schema@2.1.7': {} + '@eslint/object-schema@3.0.5': {} - '@eslint/plugin-kit@0.4.1': + '@eslint/plugin-kit@0.7.2': dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.2.1 levn: 0.4.1 '@fintechstudios/eslint-plugin-chai-as-promised@3.1.0': {} - '@gerrit0/mini-shiki@3.15.0': + '@gar/promise-retry@1.0.3': {} + + '@gerrit0/mini-shiki@3.23.0': dependencies: - '@shikijs/engine-oniguruma': 3.15.0 - '@shikijs/langs': 3.15.0 - '@shikijs/themes': 3.15.0 - '@shikijs/types': 3.15.0 + '@shikijs/engine-oniguruma': 3.23.0 + '@shikijs/langs': 3.23.0 + '@shikijs/themes': 3.23.0 + '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 '@humanfs/core@0.19.1': {} @@ -5134,6 +5381,10 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.3 + '@isaacs/string-locale-compare@1.1.0': {} '@istanbuljs/load-nyc-config@1.1.0': @@ -5151,11 +5402,6 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/source-map@0.3.11': @@ -5178,18 +5424,23 @@ snapshots: dependencies: jsep: 1.4.0 + '@loaderkit/resolve@1.0.6': + dependencies: + '@braidai/lang': 1.1.2 + '@mdn/browser-compat-data@5.7.6': {} + '@mdn/browser-compat-data@6.1.5': {} + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true + '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.7.1 '@emnapi/runtime': 1.7.1 '@tybys/wasm-util': 0.10.1 - optional: true - - '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': - dependencies: - eslint-scope: 5.1.1 + optional: true '@nodelib/fs.scandir@2.1.5': dependencies: @@ -5203,137 +5454,123 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@nolyfill/is-core-module@1.0.39': {} - - '@npmcli/agent@2.2.2': + '@npmcli/agent@4.0.2(supports-color@8.1.1)': dependencies: agent-base: 7.1.4 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - lru-cache: 10.4.3 - socks-proxy-agent: 8.0.5 + http-proxy-agent: 7.0.2(supports-color@8.1.1) + https-proxy-agent: 7.0.6(supports-color@8.1.1) + lru-cache: 11.5.2 + socks-proxy-agent: 8.0.5(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@npmcli/arborist@7.5.4': + '@npmcli/arborist@9.9.0(supports-color@8.1.1)': dependencies: + '@gar/promise-retry': 1.0.3 '@isaacs/string-locale-compare': 1.1.0 - '@npmcli/fs': 3.1.1 - '@npmcli/installed-package-contents': 2.1.0 - '@npmcli/map-workspaces': 3.0.6 - '@npmcli/metavuln-calculator': 7.1.1 - '@npmcli/name-from-folder': 2.0.0 - '@npmcli/node-gyp': 3.0.0 - '@npmcli/package-json': 5.2.1 - '@npmcli/query': 3.1.0 - '@npmcli/redact': 2.0.1 - '@npmcli/run-script': 8.1.0 - bin-links: 4.0.4 - cacache: 18.0.4 - common-ancestor-path: 1.0.1 - hosted-git-info: 7.0.2 - json-parse-even-better-errors: 3.0.2 + '@npmcli/fs': 5.0.0 + '@npmcli/installed-package-contents': 4.0.0 + '@npmcli/map-workspaces': 5.0.3 + '@npmcli/metavuln-calculator': 9.0.3(supports-color@8.1.1) + '@npmcli/name-from-folder': 4.0.0 + '@npmcli/node-gyp': 5.0.0 + '@npmcli/package-json': 7.0.5 + '@npmcli/query': 5.0.0 + '@npmcli/redact': 4.0.0 + '@npmcli/run-script': 10.0.4 + bin-links: 6.0.2 + cacache: 20.0.4 + common-ancestor-path: 2.0.0 + hosted-git-info: 9.0.3 json-stringify-nice: 1.1.4 - lru-cache: 10.4.3 - minimatch: 9.0.9 - nopt: 7.2.1 - npm-install-checks: 6.3.0 - npm-package-arg: 11.0.3 - npm-pick-manifest: 9.1.0 - npm-registry-fetch: 17.1.0 - pacote: 18.0.6 - parse-conflict-json: 3.0.1 - proc-log: 4.2.0 - proggy: 2.0.0 + lru-cache: 11.5.2 + minimatch: 10.2.5 + nopt: 9.0.0 + npm-install-checks: 8.0.0 + npm-package-arg: 13.0.2 + npm-pick-manifest: 11.0.3 + npm-registry-fetch: 19.1.1(supports-color@8.1.1) + pacote: 21.5.1(supports-color@8.1.1) + parse-conflict-json: 5.0.1 + proc-log: 6.1.0 + proggy: 4.0.0 promise-all-reject-late: 1.0.1 promise-call-limit: 3.0.2 - read-package-json-fast: 3.0.2 - semver: 7.7.3 - ssri: 10.0.6 + semver: 7.8.5 + ssri: 13.0.1 treeverse: 3.0.0 - walk-up-path: 3.0.1 + walk-up-path: 4.0.0 transitivePeerDependencies: - - bluebird - supports-color - '@npmcli/fs@3.1.1': + '@npmcli/fs@5.0.0': dependencies: - semver: 7.7.3 + semver: 7.8.5 - '@npmcli/git@5.0.8': + '@npmcli/git@7.0.2': dependencies: - '@npmcli/promise-spawn': 7.0.2 - ini: 4.1.3 - lru-cache: 10.4.3 - npm-pick-manifest: 9.1.0 - proc-log: 4.2.0 - promise-inflight: 1.0.1 - promise-retry: 2.0.1 - semver: 7.7.3 - which: 4.0.0 - transitivePeerDependencies: - - bluebird + '@gar/promise-retry': 1.0.3 + '@npmcli/promise-spawn': 9.0.1 + ini: 6.0.0 + lru-cache: 11.5.2 + npm-pick-manifest: 11.0.3 + proc-log: 6.1.0 + semver: 7.8.5 + which: 6.0.1 - '@npmcli/installed-package-contents@2.1.0': + '@npmcli/installed-package-contents@4.0.0': dependencies: - npm-bundled: 3.0.1 - npm-normalize-package-bin: 3.0.1 + npm-bundled: 5.0.0 + npm-normalize-package-bin: 5.0.0 - '@npmcli/map-workspaces@3.0.6': + '@npmcli/map-workspaces@5.0.3': dependencies: - '@npmcli/name-from-folder': 2.0.0 - glob: 10.5.0 - minimatch: 9.0.9 - read-package-json-fast: 3.0.2 + '@npmcli/name-from-folder': 4.0.0 + '@npmcli/package-json': 7.0.5 + glob: 13.0.6 + minimatch: 10.2.5 - '@npmcli/metavuln-calculator@7.1.1': + '@npmcli/metavuln-calculator@9.0.3(supports-color@8.1.1)': dependencies: - cacache: 18.0.4 - json-parse-even-better-errors: 3.0.2 - pacote: 18.0.6 - proc-log: 4.2.0 - semver: 7.7.3 + cacache: 20.0.4 + json-parse-even-better-errors: 5.0.0 + pacote: 21.5.1(supports-color@8.1.1) + proc-log: 6.1.0 + semver: 7.8.5 transitivePeerDependencies: - - bluebird - supports-color - '@npmcli/name-from-folder@2.0.0': {} + '@npmcli/name-from-folder@4.0.0': {} - '@npmcli/node-gyp@3.0.0': {} + '@npmcli/node-gyp@5.0.0': {} - '@npmcli/package-json@5.2.1': + '@npmcli/package-json@7.0.5': dependencies: - '@npmcli/git': 5.0.8 - glob: 10.5.0 - hosted-git-info: 7.0.2 - json-parse-even-better-errors: 3.0.2 - normalize-package-data: 6.0.2 - proc-log: 4.2.0 - semver: 7.7.3 - transitivePeerDependencies: - - bluebird + '@npmcli/git': 7.0.2 + glob: 13.0.6 + hosted-git-info: 9.0.3 + json-parse-even-better-errors: 5.0.0 + proc-log: 6.1.0 + semver: 7.8.5 + spdx-expression-parse: 4.0.0 - '@npmcli/promise-spawn@7.0.2': + '@npmcli/promise-spawn@9.0.1': dependencies: - which: 4.0.0 + which: 6.0.1 - '@npmcli/query@3.1.0': + '@npmcli/query@5.0.0': dependencies: - postcss-selector-parser: 6.1.2 + postcss-selector-parser: 7.1.4 - '@npmcli/redact@2.0.1': {} + '@npmcli/redact@4.0.0': {} - '@npmcli/run-script@8.1.0': + '@npmcli/run-script@10.0.4': dependencies: - '@npmcli/node-gyp': 3.0.0 - '@npmcli/package-json': 5.2.1 - '@npmcli/promise-spawn': 7.0.2 - node-gyp: 10.3.1 - proc-log: 4.2.0 - which: 4.0.0 - transitivePeerDependencies: - - bluebird - - supports-color + '@npmcli/node-gyp': 5.0.0 + '@npmcli/package-json': 7.0.5 + '@npmcli/promise-spawn': 9.0.1 + node-gyp: 12.4.0 + proc-log: 6.1.0 '@pkgjs/parseargs@0.11.0': optional: true @@ -5350,115 +5587,116 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@rollup/plugin-babel@6.1.0(@babel/core@7.28.5)(rollup@4.59.0)': + '@rollup/plugin-babel@7.1.0(@babel/core@8.0.1)(rollup@4.62.4)(supports-color@8.1.1)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1 - '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + '@babel/core': 8.0.1 + '@babel/helper-module-imports': 7.28.6(supports-color@8.1.1) + '@rollup/pluginutils': 5.3.0(rollup@4.62.4) + workerpool: 9.3.4 optionalDependencies: - rollup: 4.59.0 + rollup: 4.62.4 transitivePeerDependencies: - supports-color - '@rollup/plugin-node-resolve@16.0.3(rollup@4.59.0)': + '@rollup/plugin-node-resolve@16.0.3(rollup@4.62.4)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.59.0) + '@rollup/pluginutils': 5.3.0(rollup@4.62.4) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.11 optionalDependencies: - rollup: 4.59.0 + rollup: 4.62.4 - '@rollup/plugin-terser@0.4.4(rollup@4.59.0)': + '@rollup/plugin-terser@1.0.0(rollup@4.62.4)': dependencies: - serialize-javascript: 6.0.2 + serialize-javascript: 7.0.7 smob: 1.5.0 terser: 5.44.1 optionalDependencies: - rollup: 4.59.0 + rollup: 4.62.4 - '@rollup/pluginutils@5.3.0(rollup@4.59.0)': + '@rollup/pluginutils@5.3.0(rollup@4.62.4)': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 estree-walker: 2.0.2 picomatch: 4.0.4 optionalDependencies: - rollup: 4.59.0 + rollup: 4.62.4 - '@rollup/rollup-android-arm-eabi@4.59.0': + '@rollup/rollup-android-arm-eabi@4.62.4': optional: true - '@rollup/rollup-android-arm64@4.59.0': + '@rollup/rollup-android-arm64@4.62.4': optional: true - '@rollup/rollup-darwin-arm64@4.59.0': + '@rollup/rollup-darwin-arm64@4.62.4': optional: true - '@rollup/rollup-darwin-x64@4.59.0': + '@rollup/rollup-darwin-x64@4.62.4': optional: true - '@rollup/rollup-freebsd-arm64@4.59.0': + '@rollup/rollup-freebsd-arm64@4.62.4': optional: true - '@rollup/rollup-freebsd-x64@4.59.0': + '@rollup/rollup-freebsd-x64@4.62.4': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + '@rollup/rollup-linux-arm-gnueabihf@4.62.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.59.0': + '@rollup/rollup-linux-arm-musleabihf@4.62.4': optional: true - '@rollup/rollup-linux-arm64-gnu@4.59.0': + '@rollup/rollup-linux-arm64-gnu@4.62.4': optional: true - '@rollup/rollup-linux-arm64-musl@4.59.0': + '@rollup/rollup-linux-arm64-musl@4.62.4': optional: true - '@rollup/rollup-linux-loong64-gnu@4.59.0': + '@rollup/rollup-linux-loong64-gnu@4.62.4': optional: true - '@rollup/rollup-linux-loong64-musl@4.59.0': + '@rollup/rollup-linux-loong64-musl@4.62.4': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.59.0': + '@rollup/rollup-linux-ppc64-gnu@4.62.4': optional: true - '@rollup/rollup-linux-ppc64-musl@4.59.0': + '@rollup/rollup-linux-ppc64-musl@4.62.4': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.59.0': + '@rollup/rollup-linux-riscv64-gnu@4.62.4': optional: true - '@rollup/rollup-linux-riscv64-musl@4.59.0': + '@rollup/rollup-linux-riscv64-musl@4.62.4': optional: true - '@rollup/rollup-linux-s390x-gnu@4.59.0': + '@rollup/rollup-linux-s390x-gnu@4.62.4': optional: true - '@rollup/rollup-linux-x64-gnu@4.59.0': + '@rollup/rollup-linux-x64-gnu@4.62.4': optional: true - '@rollup/rollup-linux-x64-musl@4.59.0': + '@rollup/rollup-linux-x64-musl@4.62.4': optional: true - '@rollup/rollup-openbsd-x64@4.59.0': + '@rollup/rollup-openbsd-x64@4.62.4': optional: true - '@rollup/rollup-openharmony-arm64@4.59.0': + '@rollup/rollup-openharmony-arm64@4.62.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.59.0': + '@rollup/rollup-win32-arm64-msvc@4.62.4': optional: true - '@rollup/rollup-win32-ia32-msvc@4.59.0': + '@rollup/rollup-win32-ia32-msvc@4.62.4': optional: true - '@rollup/rollup-win32-x64-gnu@4.59.0': + '@rollup/rollup-win32-x64-gnu@4.62.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.59.0': + '@rollup/rollup-win32-x64-msvc@4.62.4': optional: true '@rpl/badge-up@3.0.0': @@ -5467,71 +5705,74 @@ snapshots: dot: 1.1.3 svgo: 2.6.0 - '@rtsao/scc@1.1.0': {} + '@rtsao/scc@1.1.0': + optional: true - '@shikijs/engine-oniguruma@3.15.0': + '@shikijs/engine-oniguruma@3.23.0': dependencies: - '@shikijs/types': 3.15.0 + '@shikijs/types': 3.23.0 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.15.0': + '@shikijs/langs@3.23.0': dependencies: - '@shikijs/types': 3.15.0 + '@shikijs/types': 3.23.0 - '@shikijs/themes@3.15.0': + '@shikijs/themes@3.23.0': dependencies: - '@shikijs/types': 3.15.0 + '@shikijs/types': 3.23.0 - '@shikijs/types@3.15.0': + '@shikijs/types@3.23.0': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 '@shikijs/vscode-textmate@10.0.2': {} - '@sigstore/bundle@2.3.2': + '@sigstore/bundle@4.0.0': dependencies: - '@sigstore/protobuf-specs': 0.3.3 + '@sigstore/protobuf-specs': 0.5.1 - '@sigstore/core@1.1.0': {} + '@sigstore/core@3.2.1': {} - '@sigstore/protobuf-specs@0.3.3': {} + '@sigstore/protobuf-specs@0.5.1': {} - '@sigstore/sign@2.3.2': + '@sigstore/sign@4.1.1(supports-color@8.1.1)': dependencies: - '@sigstore/bundle': 2.3.2 - '@sigstore/core': 1.1.0 - '@sigstore/protobuf-specs': 0.3.3 - make-fetch-happen: 13.0.1 - proc-log: 4.2.0 - promise-retry: 2.0.1 + '@gar/promise-retry': 1.0.3 + '@sigstore/bundle': 4.0.0 + '@sigstore/core': 3.2.1 + '@sigstore/protobuf-specs': 0.5.1 + make-fetch-happen: 15.0.6(supports-color@8.1.1) + proc-log: 6.1.0 transitivePeerDependencies: - supports-color - '@sigstore/tuf@2.3.4': + '@sigstore/tuf@4.0.2(supports-color@8.1.1)': dependencies: - '@sigstore/protobuf-specs': 0.3.3 - tuf-js: 2.2.1 + '@sigstore/protobuf-specs': 0.5.1 + tuf-js: 4.1.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@sigstore/verify@1.2.1': + '@sigstore/verify@3.1.1': dependencies: - '@sigstore/bundle': 2.3.2 - '@sigstore/core': 1.1.0 - '@sigstore/protobuf-specs': 0.3.3 + '@sigstore/bundle': 4.0.0 + '@sigstore/core': 3.2.1 + '@sigstore/protobuf-specs': 0.5.1 '@sindresorhus/base62@1.0.0': {} + '@sindresorhus/is@4.6.0': {} + '@sindresorhus/is@5.6.0': {} - '@sindresorhus/merge-streams@2.3.0': {} + '@sindresorhus/merge-streams@4.0.0': {} - '@stylistic/eslint-plugin@5.6.0(eslint@9.39.1)': + '@stylistic/eslint-plugin@5.10.0(eslint@10.8.1(supports-color@8.1.1))': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) - '@typescript-eslint/types': 8.47.0 - eslint: 9.39.1 + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(supports-color@8.1.1)) + '@typescript-eslint/types': 8.65.0 + eslint: 10.8.1(supports-color@8.1.1) eslint-visitor-keys: 4.2.1 espree: 10.4.0 estraverse: 5.3.0 @@ -5541,30 +5782,46 @@ snapshots: dependencies: defer-to-connect: 2.0.1 + '@tokenizer/inflate@0.4.1(supports-color@8.1.1)': + dependencies: + debug: 4.4.3(supports-color@8.1.1) + token-types: 6.1.2 + transitivePeerDependencies: + - supports-color + '@tokenizer/token@0.3.0': {} '@trysound/sax@0.2.0': {} '@tufjs/canonical-json@2.0.0': {} - '@tufjs/models@2.0.1': + '@tufjs/models@4.1.0': dependencies: '@tufjs/canonical-json': 2.0.0 - minimatch: 9.0.9 + minimatch: 10.2.5 '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 optional: true + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + '@types/debug@4.1.12': dependencies: '@types/ms': 2.1.0 - '@types/estree@1.0.8': {} + '@types/deep-eql@4.0.2': {} + + '@types/esrecurse@4.3.1': {} '@types/estree@1.0.9': {} + '@types/gensync@1.0.5': {} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 @@ -5573,21 +5830,34 @@ snapshots: '@types/istanbul-lib-coverage@2.0.6': {} + '@types/jsesc@2.5.1': {} + '@types/json-schema@7.0.15': {} - '@types/json5@0.0.29': {} + '@types/json5@0.0.29': + optional: true + + '@types/katex@0.16.8': {} '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 + '@types/mocha@10.0.10': {} + '@types/ms@2.1.0': {} + '@types/node@26.2.0': + dependencies: + undici-types: 8.3.0 + '@types/resolve@1.20.2': {} '@types/unist@3.0.3': {} - '@typescript-eslint/types@8.47.0': {} + '@typescript-eslint/types@8.65.0': {} + + '@typescript-eslint/types@8.67.0': {} '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -5648,24 +5918,21 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - abbrev@2.0.0: {} + abbrev@4.0.0: {} abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-jsx@5.3.2(acorn@8.17.0): dependencies: - acorn: 8.15.0 + acorn: 8.17.0 acorn@8.15.0: {} - agent-base@7.1.4: {} + acorn@8.17.0: {} - aggregate-error@3.1.0: - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 + agent-base@7.1.4: {} ajv@6.15.0: dependencies: @@ -5678,6 +5945,10 @@ snapshots: dependencies: string-width: 4.2.3 + ansi-escapes@7.3.0: + dependencies: + environment: 1.1.0 + ansi-regex@5.0.1: {} ansi-regex@6.2.2: {} @@ -5692,7 +5963,9 @@ snapshots: ansi-styles@6.2.3: {} - are-docs-informative@0.0.2: {} + any-promise@1.3.0: {} + + are-docs-informative@0.1.1: {} argparse@1.0.10: dependencies: @@ -5710,6 +5983,7 @@ snapshots: dependencies: call-bound: 1.0.4 is-array-buffer: 3.0.5 + optional: true array-find-index@1.0.2: {} @@ -5725,6 +5999,7 @@ snapshots: get-intrinsic: 1.3.0 is-string: 1.1.1 math-intrinsics: 1.1.0 + optional: true array.prototype.findlastindex@1.2.6: dependencies: @@ -5735,6 +6010,7 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 + optional: true array.prototype.flat@1.3.3: dependencies: @@ -5742,6 +6018,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 + optional: true array.prototype.flatmap@1.3.3: dependencies: @@ -5749,6 +6026,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.0 es-shim-unscopables: 1.1.0 + optional: true arraybuffer.prototype.slice@1.0.4: dependencies: @@ -5759,12 +6037,16 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 + optional: true + + assertion-error@2.0.1: {} ast-metadata-inferer@0.8.1: dependencies: '@mdn/browser-compat-data': 5.7.6 - async-function@1.0.0: {} + async-function@1.0.0: + optional: true async@3.2.6: {} @@ -5776,47 +6058,35 @@ snapshots: available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 + optional: true - babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.5): - dependencies: - '@babel/compat-data': 7.28.5 - '@babel/core': 7.28.5 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.5): - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) - core-js-compat: 3.47.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.5): + babel-plugin-polyfill-corejs3@1.0.0(@babel/core@8.0.1): dependencies: - '@babel/core': 7.28.5 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color + '@babel/core': 8.0.1 + '@babel/helper-define-polyfill-provider': 1.0.0(@babel/core@8.0.1) + core-js-compat: 3.49.0 balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + base64-js@1.5.1: {} - baseline-browser-mapping@2.10.31: {} + baseline-browser-mapping@2.11.14: {} + + baseline-browser-mapping@2.11.4: {} basic-auth@2.0.1: dependencies: safe-buffer: 5.1.2 - bin-links@4.0.4: + bin-links@6.0.2: dependencies: - cmd-shim: 6.0.3 - npm-normalize-package-bin: 3.0.1 - read-cmd-shim: 4.0.0 - write-file-atomic: 5.0.1 + cmd-shim: 8.0.0 + npm-normalize-package-bin: 5.0.0 + proc-log: 6.1.0 + read-cmd-shim: 6.0.0 + write-file-atomic: 7.0.1 boolbase@1.0.0: {} @@ -5846,11 +6116,16 @@ snapshots: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 + optional: true brace-expansion@2.1.0: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.8: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -5859,11 +6134,27 @@ snapshots: browserslist@4.28.0: dependencies: - baseline-browser-mapping: 2.10.31 - caniuse-lite: 1.0.30001793 - electron-to-chromium: 1.5.255 - node-releases: 2.0.27 - update-browserslist-db: 1.1.4(browserslist@4.28.0) + baseline-browser-mapping: 2.11.4 + caniuse-lite: 1.0.30001806 + electron-to-chromium: 1.5.396 + node-releases: 2.0.51 + update-browserslist-db: 1.2.3(browserslist@4.28.0) + + browserslist@4.28.7: + dependencies: + baseline-browser-mapping: 2.11.4 + caniuse-lite: 1.0.30001806 + electron-to-chromium: 1.5.396 + node-releases: 2.0.51 + update-browserslist-db: 1.2.3(browserslist@4.28.7) + + browserslist@4.28.8: + dependencies: + baseline-browser-mapping: 2.11.14 + caniuse-lite: 1.0.30001809 + electron-to-chromium: 1.5.406 + node-releases: 2.0.53 + update-browserslist-db: 1.3.1(browserslist@4.28.8) buffer-from@1.1.2: {} @@ -5882,7 +6173,7 @@ snapshots: bytes@3.1.2: {} - c8@10.1.3: + c8@12.0.0: dependencies: '@bcoe/v8-coverage': 1.0.2 '@istanbuljs/schema': 0.1.3 @@ -5891,25 +6182,23 @@ snapshots: istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-reports: 3.2.0 - test-exclude: 7.0.1 + test-exclude: 8.0.0 v8-to-istanbul: 9.3.0 - yargs: 17.7.2 + yargs: 18.1.0 yargs-parser: 21.1.1 - cacache@18.0.4: + cacache@20.0.4: dependencies: - '@npmcli/fs': 3.1.1 + '@npmcli/fs': 5.0.0 fs-minipass: 3.0.3 - glob: 10.5.0 - lru-cache: 10.4.3 - minipass: 7.1.2 + glob: 13.0.6 + lru-cache: 11.5.2 + minipass: 7.1.3 minipass-collect: 2.0.1 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 - p-map: 4.0.0 - ssri: 10.0.6 - tar: 6.2.1 - unique-filename: 3.0.0 + p-map: 7.0.6 + ssri: 13.0.1 cacheable-lookup@7.0.0: {} @@ -5934,14 +6223,13 @@ snapshots: es-define-property: 1.0.1 get-intrinsic: 1.3.0 set-function-length: 1.2.2 + optional: true call-bound@1.0.4: dependencies: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 - callsites@3.1.0: {} - camelcase@5.3.1: {} camelcase@6.3.0: {} @@ -5950,11 +6238,13 @@ snapshots: camelcase@8.0.0: {} - caniuse-lite@1.0.30001793: {} + caniuse-lite@1.0.30001806: {} + + caniuse-lite@1.0.30001809: {} ccount@2.0.1: {} - chai@6.2.1: {} + chai@6.2.2: {} chalk-template@0.4.0: dependencies: @@ -5975,25 +6265,44 @@ snapshots: change-case@5.4.4: {} + char-regex@1.0.2: {} + character-entities@2.0.2: {} chokidar@4.0.3: dependencies: readdirp: 4.1.2 - chownr@2.0.0: {} + chownr@3.0.0: {} ci-info@3.9.0: {} - ci-info@4.3.1: {} + ci-info@4.4.0: {} + + cjs-module-lexer@1.4.3: {} - clean-regexp@1.0.0: + cli-boxes@3.0.0: {} + + cli-highlight@2.1.11: dependencies: - escape-string-regexp: 1.0.5 + chalk: 4.1.2 + highlight.js: 10.7.3 + mz: 2.7.0 + parse5: 5.1.1 + parse5-htmlparser2-tree-adapter: 6.0.1 + yargs: 16.2.2 - clean-stack@2.2.0: {} + cli-table3@0.6.5: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 - cli-boxes@3.0.0: {} + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 cliui@8.0.1: dependencies: @@ -6001,7 +6310,13 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - cmd-shim@6.0.3: {} + cliui@9.0.1: + dependencies: + string-width: 7.2.0 + strip-ansi: 7.1.2 + wrap-ansi: 9.0.2 + + cmd-shim@8.0.0: {} color-convert@1.9.3: dependencies: @@ -6065,15 +6380,22 @@ snapshots: table-layout: 4.1.1 typical: 7.3.0 + commander@10.0.1: {} + commander@2.20.3: {} commander@7.2.0: {} - comment-parser@1.4.1: {} + commander@8.3.0: {} + + comment-parser@1.4.7: {} + + comment-parser@1.4.8: {} - common-ancestor-path@1.0.1: {} + common-ancestor-path@2.0.0: {} - concat-map@0.0.1: {} + concat-map@0.0.1: + optional: true config-chain@1.1.13: dependencies: @@ -6095,11 +6417,13 @@ snapshots: graceful-fs: 4.2.11 xdg-basedir: 5.1.0 + convert-hrtime@5.0.0: {} + convert-source-map@2.0.0: {} - core-js-compat@3.47.0: + core-js-compat@3.49.0: dependencies: - browserslist: 4.28.0 + browserslist: 4.28.7 correct-license-metadata@1.4.0: dependencies: @@ -6159,22 +6483,28 @@ snapshots: call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 + optional: true data-view-byte-length@1.0.2: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 + optional: true data-view-byte-offset@1.0.1: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 + optional: true - debug@3.2.7: + debug@3.2.7(supports-color@8.1.1): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + optional: true debug@4.4.3(supports-color@8.1.1): dependencies: @@ -6212,6 +6542,7 @@ snapshots: es-define-property: 1.0.1 es-errors: 1.3.0 gopd: 1.2.0 + optional: true define-lazy-prop@3.0.0: {} @@ -6220,9 +6551,12 @@ snapshots: define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 + optional: true dequal@2.0.3: {} + detect-indent@7.0.2: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -6234,6 +6568,7 @@ snapshots: doctrine@2.1.0: dependencies: esutils: 2.0.3 + optional: true dom-serializer@1.4.1: dependencies: @@ -6287,7 +6622,9 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.255: {} + electron-to-chromium@1.5.396: {} + + electron-to-chromium@1.5.406: {} emoji-regex@10.6.0: {} @@ -6295,10 +6632,9 @@ snapshots: emoji-regex@9.2.2: {} - encoding@0.1.13: - dependencies: - iconv-lite: 0.6.3 - optional: true + emojilib@2.4.0: {} + + empathic@2.0.1: {} enhanced-resolve@5.18.3: dependencies: @@ -6309,11 +6645,11 @@ snapshots: entities@4.5.0: {} - entities@6.0.1: {} + entities@7.0.1: {} env-paths@2.2.1: {} - err-code@2.0.3: {} + environment@1.1.0: {} es-abstract@1.24.0: dependencies: @@ -6371,27 +6707,28 @@ snapshots: typed-array-length: 1.0.7 unbox-primitive: 1.1.0 which-typed-array: 1.1.19 + optional: true es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-file-traverse@2.0.1(@babel/core@7.28.5)(eslint-plugin-import@2.32.0(eslint@9.39.1))(eslint@9.39.1): + es-file-traverse@3.0.0(eslint-plugin-import-x@4.17.1(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint@10.8.1(supports-color@8.1.1))(supports-color@8.1.1))(eslint-plugin-import@2.32.0)(eslint@10.8.1(supports-color@8.1.1))(supports-color@8.1.1): dependencies: - '@babel/eslint-parser': 7.28.5(@babel/core@7.28.5)(eslint@9.39.1) + '@babel/core': 8.0.1 + '@babel/eslint-parser': 8.0.1(@babel/core@8.0.1)(eslint@10.8.1(supports-color@8.1.1)) command-line-basics: 3.0.0 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.1))(eslint@9.39.1) - esquery: 1.6.0 + eslint-import-resolver-typescript: 4.4.5(eslint-plugin-import-x@4.17.1(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint@10.8.1(supports-color@8.1.1))(supports-color@8.1.1))(eslint-plugin-import@2.32.0)(eslint@10.8.1(supports-color@8.1.1))(supports-color@8.1.1) + esquery: 1.7.0 file-fetch: 2.0.1 find-package-json: 1.2.0 - globby: 14.1.0 - htmlparser2: 10.0.0 + globby: 16.2.2 + htmlparser2: 10.1.0 is-builtin-module: 5.0.0 resolve: 1.22.11 resolve.exports: 2.0.3 transitivePeerDependencies: - '@75lb/nature' - - '@babel/core' - eslint - eslint-plugin-import - eslint-plugin-import-x @@ -6407,16 +6744,19 @@ snapshots: get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 + optional: true es-shim-unscopables@1.1.0: dependencies: hasown: 2.0.2 + optional: true es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 is-date-object: 1.1.0 is-symbol: 1.1.1 + optional: true es5-ext@0.10.64: dependencies: @@ -6451,150 +6791,178 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.39.1): + eslint-compat-utils@0.5.1(eslint@10.8.1(supports-color@8.1.1)): dependencies: - eslint: 9.39.1 - semver: 7.7.3 + eslint: 10.8.1(supports-color@8.1.1) + semver: 7.8.5 - eslint-config-ash-nazg@39.8.0(@babel/core@7.28.5)(eslint@9.39.1)(typescript@5.9.3): - dependencies: - '@babel/eslint-parser': 7.28.5(@babel/core@7.28.5)(eslint@9.39.1) - '@babel/eslint-plugin': 7.27.1(@babel/eslint-parser@7.28.5(@babel/core@7.28.5)(eslint@9.39.1))(eslint@9.39.1) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5) - '@brettz9/eslint-plugin': 3.0.0(eslint@9.39.1) - '@eslint-community/eslint-plugin-eslint-comments': 4.5.0(eslint@9.39.1) - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.39.1 - '@eslint/markdown': 7.5.1 + eslint-config-ash-nazg@42.4.0(@babel/core@8.0.1)(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint-plugin-import@2.32.0)(eslint@10.8.1(supports-color@8.1.1))(supports-color@8.1.1)(ts-declaration-location@1.0.7(typescript@6.0.3))(typescript@6.0.3): + dependencies: + '@babel/eslint-parser': 8.0.1(@babel/core@8.0.1)(eslint@10.8.1(supports-color@8.1.1)) + '@babel/eslint-plugin': 8.0.1(@babel/core@8.0.1)(@babel/eslint-parser@8.0.1(@babel/core@8.0.1)(eslint@10.8.1(supports-color@8.1.1)))(eslint@10.8.1(supports-color@8.1.1)) + '@brettz9/eslint-plugin': 3.0.0(eslint@10.8.1(supports-color@8.1.1)) + '@eslint-community/eslint-plugin-eslint-comments': 4.7.2(eslint@10.8.1(supports-color@8.1.1)) + '@eslint/core': 1.2.1 + '@eslint/js': 10.0.1(eslint@10.8.1(supports-color@8.1.1)) + '@eslint/markdown': 8.0.3(supports-color@8.1.1) '@fintechstudios/eslint-plugin-chai-as-promised': 3.1.0 - '@stylistic/eslint-plugin': 5.6.0(eslint@9.39.1) - browserslist: 4.28.0 - es-file-traverse: 2.0.1(@babel/core@7.28.5)(eslint-plugin-import@2.32.0(eslint@9.39.1))(eslint@9.39.1) - eslint: 9.39.1 - eslint-plugin-array-func: 5.1.0(eslint@9.39.1) - eslint-plugin-chai-expect: 3.1.0(eslint@9.39.1) - eslint-plugin-chai-expect-keywords: 3.1.0 - eslint-plugin-chai-friendly: 1.1.0(eslint@9.39.1) - eslint-plugin-compat: 6.0.2(eslint@9.39.1) - eslint-plugin-cypress: 5.2.0(eslint@9.39.1) - eslint-plugin-escompat: 3.11.4(eslint@9.39.1) - eslint-plugin-html: 8.1.3 - eslint-plugin-import: 2.32.0(eslint@9.39.1) - eslint-plugin-jsdoc: 61.2.1(eslint@9.39.1) - eslint-plugin-mocha: 11.2.0(eslint@9.39.1) - eslint-plugin-mocha-cleanup: 1.11.3(eslint@9.39.1) - eslint-plugin-n: 17.23.1(eslint@9.39.1)(typescript@5.9.3) - eslint-plugin-no-unsanitized: 4.1.4(eslint@9.39.1) - eslint-plugin-no-use-extend-native: 0.7.2(eslint@9.39.1) - eslint-plugin-promise: 7.2.1(eslint@9.39.1) - eslint-plugin-sonarjs: 3.0.5(eslint@9.39.1) - eslint-plugin-unicorn: 62.0.0(eslint@9.39.1) - globals: 16.5.0 - semver: 7.7.3 + '@stylistic/eslint-plugin': 5.10.0(eslint@10.8.1(supports-color@8.1.1)) + browserslist: 4.28.8 + es-file-traverse: 3.0.0(eslint-plugin-import-x@4.17.1(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint@10.8.1(supports-color@8.1.1))(supports-color@8.1.1))(eslint-plugin-import@2.32.0)(eslint@10.8.1(supports-color@8.1.1))(supports-color@8.1.1) + eslint: 10.8.1(supports-color@8.1.1) + eslint-plugin-array-func: 5.1.1(eslint@10.8.1(supports-color@8.1.1)) + eslint-plugin-chai-expect: 4.1.0(eslint@10.8.1(supports-color@8.1.1)) + eslint-plugin-chai-expect-keywords: 3.3.0(eslint@10.8.1(supports-color@8.1.1)) + eslint-plugin-chai-friendly: 1.2.1(eslint@10.8.1(supports-color@8.1.1)) + eslint-plugin-compat: 7.0.2(eslint@10.8.1(supports-color@8.1.1)) + eslint-plugin-cypress: 7.0.0(eslint@10.8.1(supports-color@8.1.1)) + eslint-plugin-escompat: 3.11.4(eslint@10.8.1(supports-color@8.1.1)) + eslint-plugin-html: 8.1.4 + eslint-plugin-import-x: 4.17.1(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint@10.8.1(supports-color@8.1.1))(supports-color@8.1.1) + eslint-plugin-jsdoc: 64.1.0(eslint@10.8.1(supports-color@8.1.1))(supports-color@8.1.1) + eslint-plugin-mocha: 12.0.2(eslint@10.8.1(supports-color@8.1.1)) + eslint-plugin-mocha-cleanup: 1.11.3(eslint@10.8.1(supports-color@8.1.1)) + eslint-plugin-n: 18.3.0(eslint@10.8.1(supports-color@8.1.1))(ts-declaration-location@1.0.7(typescript@6.0.3))(typescript@6.0.3) + eslint-plugin-no-unsanitized: 4.1.5(eslint@10.8.1(supports-color@8.1.1)) + eslint-plugin-no-use-extend-native: 0.7.3(eslint@10.8.1(supports-color@8.1.1)) + eslint-plugin-promise: 7.3.0(eslint@10.8.1(supports-color@8.1.1)) + eslint-plugin-sonarjs: 4.2.0(eslint@10.8.1(supports-color@8.1.1)) + eslint-plugin-unicorn: 73.0.0(eslint@10.8.1(supports-color@8.1.1)) + globals: 17.11.0 + semver: 7.8.5 transitivePeerDependencies: - '@75lb/nature' - '@babel/core' - '@typescript-eslint/parser' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - eslint-plugin-import-x + - '@typescript-eslint/utils' + - eslint-import-resolver-node + - eslint-plugin-import - supports-color + - ts-declaration-location - typescript - eslint-import-resolver-node@0.3.9: + eslint-import-context@0.1.9(unrs-resolver@1.11.1): + dependencies: + get-tsconfig: 4.13.0 + stable-hash-x: 0.2.0 + optionalDependencies: + unrs-resolver: 1.11.1 + + eslint-import-resolver-node@0.3.9(supports-color@8.1.1): dependencies: - debug: 3.2.7 + debug: 3.2.7(supports-color@8.1.1) is-core-module: 2.16.1 resolve: 1.22.11 transitivePeerDependencies: - supports-color + optional: true - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(eslint@9.39.1))(eslint@9.39.1): + eslint-import-resolver-typescript@4.4.5(eslint-plugin-import-x@4.17.1(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint@10.8.1(supports-color@8.1.1))(supports-color@8.1.1))(eslint-plugin-import@2.32.0)(eslint@10.8.1(supports-color@8.1.1))(supports-color@8.1.1): dependencies: - '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3(supports-color@8.1.1) - eslint: 9.39.1 + eslint: 10.8.1(supports-color@8.1.1) + eslint-import-context: 0.1.9(unrs-resolver@1.11.1) get-tsconfig: 4.13.0 is-bun-module: 2.0.0 - stable-hash: 0.0.5 + stable-hash-x: 0.2.0 tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(eslint@9.39.1) + eslint-plugin-import: 2.32.0(eslint-import-resolver-typescript@4.4.5)(eslint@10.8.1(supports-color@8.1.1))(supports-color@8.1.1) + eslint-plugin-import-x: 4.17.1(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint@10.8.1(supports-color@8.1.1))(supports-color@8.1.1) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint@9.39.1): + eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint-import-resolver-typescript@4.4.5)(eslint@10.8.1(supports-color@8.1.1))(supports-color@8.1.1): dependencies: - debug: 3.2.7 + debug: 3.2.7(supports-color@8.1.1) optionalDependencies: - eslint: 9.39.1 - eslint-import-resolver-node: 0.3.9 + eslint: 10.8.1(supports-color@8.1.1) + eslint-import-resolver-node: 0.3.9(supports-color@8.1.1) + eslint-import-resolver-typescript: 4.4.5(eslint-plugin-import-x@4.17.1(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint@10.8.1(supports-color@8.1.1))(supports-color@8.1.1))(eslint-plugin-import@2.32.0)(eslint@10.8.1(supports-color@8.1.1))(supports-color@8.1.1) transitivePeerDependencies: - supports-color + optional: true - eslint-plugin-array-func@5.1.0(eslint@9.39.1): + eslint-plugin-array-func@5.1.1(eslint@10.8.1(supports-color@8.1.1)): dependencies: - eslint: 9.39.1 + eslint: 10.8.1(supports-color@8.1.1) - eslint-plugin-chai-expect-keywords@3.1.0: + eslint-plugin-chai-expect-keywords@3.3.0(eslint@10.8.1(supports-color@8.1.1)): dependencies: - globals: 15.15.0 + '@types/estree': 1.0.9 + eslint: 10.8.1(supports-color@8.1.1) + globals: 17.8.0 - eslint-plugin-chai-expect@3.1.0(eslint@9.39.1): + eslint-plugin-chai-expect@4.1.0(eslint@10.8.1(supports-color@8.1.1)): dependencies: - eslint: 9.39.1 + eslint: 10.8.1(supports-color@8.1.1) - eslint-plugin-chai-friendly@1.1.0(eslint@9.39.1): + eslint-plugin-chai-friendly@1.2.1(eslint@10.8.1(supports-color@8.1.1)): dependencies: - eslint: 9.39.1 + eslint: 10.8.1(supports-color@8.1.1) - eslint-plugin-compat@6.0.2(eslint@9.39.1): + eslint-plugin-compat@7.0.2(eslint@10.8.1(supports-color@8.1.1)): dependencies: - '@mdn/browser-compat-data': 5.7.6 + '@mdn/browser-compat-data': 6.1.5 ast-metadata-inferer: 0.8.1 - browserslist: 4.28.0 - caniuse-lite: 1.0.30001793 - eslint: 9.39.1 + browserslist: 4.28.7 + eslint: 10.8.1(supports-color@8.1.1) find-up: 5.0.0 globals: 15.15.0 lodash.memoize: 4.1.2 - semver: 7.7.3 + semver: 7.8.5 - eslint-plugin-cypress@5.2.0(eslint@9.39.1): + eslint-plugin-cypress@7.0.0(eslint@10.8.1(supports-color@8.1.1)): dependencies: - eslint: 9.39.1 - globals: 16.5.0 + eslint: 10.8.1(supports-color@8.1.1) + globals: 17.11.0 - eslint-plugin-es-x@7.8.0(eslint@9.39.1): + eslint-plugin-es-x@7.8.0(eslint@10.8.1(supports-color@8.1.1)): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(supports-color@8.1.1)) '@eslint-community/regexpp': 4.12.2 - eslint: 9.39.1 - eslint-compat-utils: 0.5.1(eslint@9.39.1) + eslint: 10.8.1(supports-color@8.1.1) + eslint-compat-utils: 0.5.1(eslint@10.8.1(supports-color@8.1.1)) - eslint-plugin-escompat@3.11.4(eslint@9.39.1): + eslint-plugin-escompat@3.11.4(eslint@10.8.1(supports-color@8.1.1)): dependencies: - browserslist: 4.28.0 - eslint: 9.39.1 + browserslist: 4.28.7 + eslint: 10.8.1(supports-color@8.1.1) + + eslint-plugin-html@8.1.4: + dependencies: + htmlparser2: 10.1.0 - eslint-plugin-html@8.1.3: + eslint-plugin-import-x@4.17.1(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint@10.8.1(supports-color@8.1.1))(supports-color@8.1.1): dependencies: - htmlparser2: 10.0.0 + '@typescript-eslint/types': 8.65.0 + comment-parser: 1.4.7 + debug: 4.4.3(supports-color@8.1.1) + eslint: 10.8.1(supports-color@8.1.1) + eslint-import-context: 0.1.9(unrs-resolver@1.11.1) + is-glob: 4.0.3 + minimatch: 10.2.5 + semver: 7.8.5 + stable-hash-x: 0.2.0 + unrs-resolver: 1.11.1 + optionalDependencies: + eslint-import-resolver-node: 0.3.9(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color - eslint-plugin-import@2.32.0(eslint@9.39.1): + eslint-plugin-import@2.32.0(eslint-import-resolver-typescript@4.4.5)(eslint@10.8.1(supports-color@8.1.1))(supports-color@8.1.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 array.prototype.findlastindex: 1.2.6 array.prototype.flat: 1.3.3 array.prototype.flatmap: 1.3.3 - debug: 3.2.7 + debug: 3.2.7(supports-color@8.1.1) doctrine: 2.1.0 - eslint: 9.39.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint@9.39.1) + eslint: 10.8.1(supports-color@8.1.1) + eslint-import-resolver-node: 0.3.9(supports-color@8.1.1) + eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9(supports-color@8.1.1))(eslint-import-resolver-typescript@4.4.5)(eslint@10.8.1(supports-color@8.1.1))(supports-color@8.1.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -6609,147 +6977,149 @@ snapshots: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color + optional: true - eslint-plugin-jsdoc@61.2.1(eslint@9.39.1): + eslint-plugin-jsdoc@64.1.0(eslint@10.8.1(supports-color@8.1.1))(supports-color@8.1.1): dependencies: - '@es-joy/jsdoccomment': 0.76.0 + '@es-joy/jsdoccomment': 0.95.0 '@es-joy/resolve.exports': 1.2.0 - are-docs-informative: 0.0.2 - comment-parser: 1.4.1 + are-docs-informative: 0.1.1 + comment-parser: 1.4.8 debug: 4.4.3(supports-color@8.1.1) - escape-string-regexp: 4.0.0 - eslint: 9.39.1 - espree: 10.4.0 - esquery: 1.6.0 + escape-string-regexp: 5.0.0 + eslint: 10.8.1(supports-color@8.1.1) + espree: 11.2.0 + esquery: 1.7.0 html-entities: 2.6.0 - object-deep-merge: 2.0.0 + object-deep-merge: 2.0.1 parse-imports-exports: 0.2.4 - semver: 7.7.3 - spdx-expression-parse: 4.0.0 + semver: 7.8.5 + spdx-expression-parse: 5.0.0 to-valid-identifier: 1.0.0 transitivePeerDependencies: - supports-color - eslint-plugin-mocha-cleanup@1.11.3(eslint@9.39.1): + eslint-plugin-mocha-cleanup@1.11.3(eslint@10.8.1(supports-color@8.1.1)): dependencies: - eslint: 9.39.1 + eslint: 10.8.1(supports-color@8.1.1) requireindex: 1.2.0 - eslint-plugin-mocha@11.2.0(eslint@9.39.1): + eslint-plugin-mocha@12.0.2(eslint@10.8.1(supports-color@8.1.1)): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) - eslint: 9.39.1 - globals: 15.15.0 + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(supports-color@8.1.1)) + '@eslint/core': 1.2.1 + '@types/estree': 1.0.9 + eslint: 10.8.1(supports-color@8.1.1) + globals: 17.8.0 + json-schema-to-ts: 3.1.1 + type-fest: 5.8.0 - eslint-plugin-n@17.23.1(eslint@9.39.1)(typescript@5.9.3): + eslint-plugin-n@18.3.0(eslint@10.8.1(supports-color@8.1.1))(ts-declaration-location@1.0.7(typescript@6.0.3))(typescript@6.0.3): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(supports-color@8.1.1)) enhanced-resolve: 5.18.3 - eslint: 9.39.1 - eslint-plugin-es-x: 7.8.0(eslint@9.39.1) + eslint: 10.8.1(supports-color@8.1.1) + eslint-plugin-es-x: 7.8.0(eslint@10.8.1(supports-color@8.1.1)) get-tsconfig: 4.13.0 globals: 15.15.0 globrex: 0.1.2 ignore: 5.3.2 - semver: 7.7.3 - ts-declaration-location: 1.0.7(typescript@5.9.3) - transitivePeerDependencies: - - typescript + semver: 7.8.5 + optionalDependencies: + ts-declaration-location: 1.0.7(typescript@6.0.3) + typescript: 6.0.3 - eslint-plugin-no-unsanitized@4.1.4(eslint@9.39.1): + eslint-plugin-no-unsanitized@4.1.5(eslint@10.8.1(supports-color@8.1.1)): dependencies: - eslint: 9.39.1 + eslint: 10.8.1(supports-color@8.1.1) - eslint-plugin-no-use-extend-native@0.7.2(eslint@9.39.1): + eslint-plugin-no-use-extend-native@0.7.3(eslint@10.8.1(supports-color@8.1.1)): dependencies: - eslint: 9.39.1 + eslint: 10.8.1(supports-color@8.1.1) is-get-set-prop: 2.0.0 is-js-type: 3.0.0 is-obj-prop: 2.0.0 is-proto-prop: 3.0.1 - eslint-plugin-promise@7.2.1(eslint@9.39.1): + eslint-plugin-promise@7.3.0(eslint@10.8.1(supports-color@8.1.1)): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) - eslint: 9.39.1 + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(supports-color@8.1.1)) + eslint: 10.8.1(supports-color@8.1.1) - eslint-plugin-sonarjs@3.0.5(eslint@9.39.1): + eslint-plugin-sonarjs@4.2.0(eslint@10.8.1(supports-color@8.1.1)): dependencies: - '@eslint-community/regexpp': 4.12.1 + '@eslint-community/regexpp': 4.12.2 builtin-modules: 3.3.0 bytes: 3.1.2 - eslint: 9.39.1 + eslint: 10.8.1(supports-color@8.1.1) functional-red-black-tree: 1.0.1 + globals: 17.8.0 jsx-ast-utils-x: 0.1.0 lodash.merge: 4.6.2 - minimatch: 9.0.5 + minimatch: 10.2.5 scslre: 0.3.0 - semver: 7.7.2 - typescript: 5.9.3 + semver: 7.8.5 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + yaml: 2.9.0 - eslint-plugin-unicorn@62.0.0(eslint@9.39.1): + eslint-plugin-unicorn@73.0.0(eslint@10.8.1(supports-color@8.1.1)): dependencies: - '@babel/helper-validator-identifier': 7.28.5 - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) - '@eslint/plugin-kit': 0.4.1 + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(supports-color@8.1.1)) + '@eslint/css-tree': 4.0.5 + browserslist: 4.28.7 change-case: 5.4.4 - ci-info: 4.3.1 - clean-regexp: 1.0.0 - core-js-compat: 3.47.0 - eslint: 9.39.1 - esquery: 1.6.0 + ci-info: 4.4.0 + core-js-compat: 3.49.0 + detect-indent: 7.0.2 + entities: 4.5.0 + eslint: 10.8.1(supports-color@8.1.1) find-up-simple: 1.0.1 - globals: 16.5.0 + globals: 17.8.0 indent-string: 5.0.0 is-builtin-module: 5.0.0 - jsesc: 3.1.0 + is-identifier: 1.1.0 pluralize: 8.0.0 - regexp-tree: 0.1.27 - regjsparser: 0.13.0 - semver: 7.7.3 + quote-js-string: 0.1.0 + regjsparser: 0.13.2 + reserved-identifiers: 1.2.0 + semver: 7.8.5 strip-indent: 4.1.1 + yaml: 2.9.0 - eslint-rule-composer@0.3.0: {} - - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - - eslint-scope@8.4.0: + eslint-scope@9.1.2: dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-visitor-keys@2.1.0: {} - eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@4.2.1: {} - eslint@9.39.1: + eslint-visitor-keys@5.0.1: {} + + eslint@10.8.1(supports-color@8.1.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(supports-color@8.1.1)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.1 - '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.39.1 - '@eslint/plugin-kit': 0.4.1 + '@eslint/config-array': 0.23.5(supports-color@8.1.1) + '@eslint/config-helpers': 0.7.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 ajv: 6.15.0 - chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3(supports-color@8.1.1) escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.6.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 @@ -6759,8 +7129,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.5 + minimatch: 10.2.5 natural-compare: 1.4.0 optionator: 0.9.4 transitivePeerDependencies: @@ -6780,13 +7149,19 @@ snapshots: espree@10.4.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) eslint-visitor-keys: 4.2.1 + espree@11.2.0: + dependencies: + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) + eslint-visitor-keys: 5.0.1 + esprima@4.0.1: {} - esquery@1.6.0: + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -6794,8 +7169,6 @@ snapshots: dependencies: estraverse: 5.3.0 - estraverse@4.3.0: {} - estraverse@5.3.0: {} estree-walker@2.0.2: {} @@ -6845,6 +7218,8 @@ snapshots: optionalDependencies: picomatch: 4.0.4 + fflate@0.8.3: {} + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -6855,11 +7230,14 @@ snapshots: readable-stream: 4.7.0 stream-chunks: 1.0.0 - file-type@18.7.0: + file-type@21.3.4(supports-color@8.1.1): dependencies: - readable-web-to-node-stream: 3.0.4 - strtok3: 7.1.1 - token-types: 5.0.1 + '@tokenizer/inflate': 0.4.1(supports-color@8.1.1) + strtok3: 10.3.5 + token-types: 6.1.2 + uint8array-extras: 1.5.0 + transitivePeerDependencies: + - supports-color fill-range@7.1.1: dependencies: @@ -6894,11 +7272,14 @@ snapshots: flatted@3.4.2: {} - follow-redirects@1.16.0: {} + follow-redirects@1.16.0(debug@4.4.3(supports-color@8.1.1)): + optionalDependencies: + debug: 4.4.3(supports-color@8.1.1) for-each@0.3.5: dependencies: is-callable: 1.2.7 + optional: true foreground-child@3.3.1: dependencies: @@ -6909,19 +7290,17 @@ snapshots: format@0.2.2: {} - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - fs-minipass@3.0.3: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 fsevents@2.3.3: optional: true function-bind@1.1.2: {} + function-timeout@1.0.2: {} + function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 @@ -6930,12 +7309,15 @@ snapshots: functions-have-names: 1.2.3 hasown: 2.0.2 is-callable: 1.2.7 + optional: true functional-red-black-tree@1.0.1: {} - functions-have-names@1.2.3: {} + functions-have-names@1.2.3: + optional: true - generator-function@2.0.1: {} + generator-function@2.0.1: + optional: true gensync@1.0.0-beta.2: {} @@ -6943,6 +7325,8 @@ snapshots: get-east-asian-width@1.4.0: {} + get-east-asian-width@1.6.0: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -6965,8 +7349,6 @@ snapshots: get-set-props@0.2.0: {} - get-stdin@9.0.0: {} - get-stream@6.0.1: {} get-symbol-description@1.1.0: @@ -6974,6 +7356,7 @@ snapshots: call-bound: 1.0.4 es-errors: 1.3.0 get-intrinsic: 1.3.0 + optional: true get-tsconfig@4.13.0: dependencies: @@ -6994,10 +7377,16 @@ snapshots: foreground-child: 3.3.1 jackspeak: 3.4.3 minimatch: 9.0.9 - minipass: 7.1.2 + minipass: 7.1.3 package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@13.0.6: + dependencies: + minimatch: 10.2.5 + minipass: 7.1.3 + path-scurry: 2.0.2 + global-directory@4.0.1: dependencies: ini: 4.1.1 @@ -7006,25 +7395,26 @@ snapshots: dependencies: ini: 2.0.0 - globals@14.0.0: {} - globals@15.15.0: {} - globals@16.5.0: {} + globals@17.11.0: {} + + globals@17.8.0: {} globalthis@1.0.4: dependencies: define-properties: 1.2.1 gopd: 1.2.0 + optional: true - globby@14.1.0: + globby@16.2.2: dependencies: - '@sindresorhus/merge-streams': 2.3.0 + '@sindresorhus/merge-streams': 4.0.0 fast-glob: 3.3.3 ignore: 7.0.5 - path-type: 6.0.0 + is-path-inside: 4.0.0 slash: 5.1.0 - unicorn-magic: 0.3.0 + unicorn-magic: 0.4.0 globrex@0.1.2: {} @@ -7048,7 +7438,8 @@ snapshots: graceful-fs@4.2.11: {} - has-bigints@1.1.0: {} + has-bigints@1.1.0: + optional: true has-flag@3.0.0: {} @@ -7057,16 +7448,19 @@ snapshots: has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1 + optional: true has-proto@1.2.0: dependencies: dunder-proto: 1.0.1 + optional: true has-symbols@1.1.0: {} has-tostringtag@1.0.2: dependencies: has-symbols: 1.1.0 + optional: true has-yarn@3.0.0: {} @@ -7076,9 +7470,11 @@ snapshots: he@1.2.0: {} - hosted-git-info@7.0.2: + highlight.js@10.7.3: {} + + hosted-git-info@9.0.3: dependencies: - lru-cache: 10.4.3 + lru-cache: 11.5.2 html-encoding-sniffer@3.0.0: dependencies: @@ -7088,42 +7484,42 @@ snapshots: html-escaper@2.0.2: {} - htmlparser2@10.0.0: + htmlparser2@10.1.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.2.2 - entities: 6.0.1 + entities: 7.0.1 http-cache-semantics@4.2.0: {} - http-proxy-agent@7.0.2: + http-proxy-agent@7.0.2(supports-color@8.1.1): dependencies: agent-base: 7.1.4 debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - http-proxy@1.18.1: + http-proxy@1.18.1(debug@4.4.3(supports-color@8.1.1)): dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.16.0 + follow-redirects: 1.16.0(debug@4.4.3(supports-color@8.1.1)) requires-port: 1.0.0 transitivePeerDependencies: - debug - http-server@14.1.1: + http-server@14.1.1(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1): dependencies: basic-auth: 2.0.1 chalk: 4.1.2 corser: 2.0.1 he: 1.2.0 html-encoding-sniffer: 3.0.0 - http-proxy: 1.18.1 + http-proxy: 1.18.1(debug@4.4.3(supports-color@8.1.1)) mime: 1.6.0 minimist: 1.2.8 opener: 1.5.2 - portfinder: 1.0.38 + portfinder: 1.0.38(supports-color@8.1.1) secure-compare: 3.0.1 union: 0.5.0 url-join: 4.0.1 @@ -7136,7 +7532,7 @@ snapshots: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - https-proxy-agent@7.0.6: + https-proxy-agent@7.0.6(supports-color@8.1.1): dependencies: agent-base: 7.1.4 debug: 4.4.3(supports-color@8.1.1) @@ -7147,26 +7543,30 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.3: + dependencies: + safer-buffer: 2.1.2 + optional: true + + identifier-regex@1.1.0: + dependencies: + reserved-identifiers: 1.2.0 + ieee754@1.2.1: {} - ignore-walk@6.0.5: + ignore-walk@8.0.0: dependencies: - minimatch: 9.0.9 + minimatch: 10.2.5 ignore@5.3.2: {} ignore@7.0.5: {} - import-fresh@3.3.1: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - import-lazy@4.0.0: {} - imurmurhash@0.1.4: {} + import-meta-resolve@4.2.0: {} - indent-string@4.0.0: {} + imurmurhash@0.1.4: {} indent-string@5.0.0: {} @@ -7176,13 +7576,14 @@ snapshots: ini@4.1.1: {} - ini@4.1.3: {} + ini@6.0.0: {} internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.1.0 + optional: true ip-address@10.2.0: {} @@ -7191,6 +7592,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 get-intrinsic: 1.3.0 + optional: true is-async-function@2.1.1: dependencies: @@ -7199,15 +7601,18 @@ snapshots: get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 + optional: true is-bigint@1.1.0: dependencies: has-bigints: 1.1.0 + optional: true is-boolean-object@1.2.2: dependencies: call-bound: 1.0.4 has-tostringtag: 1.0.2 + optional: true is-builtin-module@5.0.0: dependencies: @@ -7215,9 +7620,10 @@ snapshots: is-bun-module@2.0.0: dependencies: - semver: 7.7.3 + semver: 7.8.5 - is-callable@1.2.7: {} + is-callable@1.2.7: + optional: true is-ci@3.0.1: dependencies: @@ -7232,11 +7638,13 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 is-typed-array: 1.1.15 + optional: true is-date-object@1.1.0: dependencies: call-bound: 1.0.4 has-tostringtag: 1.0.2 + optional: true is-docker@3.0.0: {} @@ -7245,6 +7653,7 @@ snapshots: is-finalizationregistry@1.1.1: dependencies: call-bound: 1.0.4 + optional: true is-fullwidth-code-point@3.0.0: {} @@ -7255,6 +7664,7 @@ snapshots: get-proto: 1.0.1 has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 + optional: true is-get-set-prop@2.0.0: dependencies: @@ -7265,8 +7675,15 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-identifier@1.1.0: + dependencies: + identifier-regex: 1.1.0 + super-regex: 1.1.0 + is-in-ci@1.0.0: {} + is-in-ssh@1.0.0: {} + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 @@ -7285,13 +7702,13 @@ snapshots: dependencies: js-types: 4.0.0 - is-lambda@1.0.1: {} - - is-map@2.0.3: {} + is-map@2.0.3: + optional: true is-module@1.0.0: {} - is-negative-zero@2.0.3: {} + is-negative-zero@2.0.3: + optional: true is-npm@6.1.0: {} @@ -7299,6 +7716,7 @@ snapshots: dependencies: call-bound: 1.0.4 has-tostringtag: 1.0.2 + optional: true is-number@7.0.0: {} @@ -7326,12 +7744,15 @@ snapshots: gopd: 1.2.0 has-tostringtag: 1.0.2 hasown: 2.0.2 + optional: true - is-set@2.0.3: {} + is-set@2.0.3: + optional: true is-shared-array-buffer@1.0.4: dependencies: call-bound: 1.0.4 + optional: true is-stream@3.0.0: {} @@ -7339,31 +7760,37 @@ snapshots: dependencies: call-bound: 1.0.4 has-tostringtag: 1.0.2 + optional: true is-symbol@1.1.1: dependencies: call-bound: 1.0.4 has-symbols: 1.1.0 safe-regex-test: 1.1.0 + optional: true is-typed-array@1.1.15: dependencies: which-typed-array: 1.1.19 + optional: true is-typedarray@1.0.0: {} is-unicode-supported@0.1.0: {} - is-weakmap@2.0.2: {} + is-weakmap@2.0.2: + optional: true is-weakref@1.1.1: dependencies: call-bound: 1.0.4 + optional: true is-weakset@2.0.4: dependencies: call-bound: 1.0.4 get-intrinsic: 1.3.0 + optional: true is-wsl@3.1.0: dependencies: @@ -7371,11 +7798,12 @@ snapshots: is-yarn-global@0.4.1: {} - isarray@2.0.5: {} + isarray@2.0.5: + optional: true isexe@2.0.0: {} - isexe@3.1.1: {} + isexe@4.0.0: {} istanbul-lib-coverage@3.2.2: {} @@ -7396,6 +7824,8 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + js-tokens@10.0.0: {} + js-tokens@4.0.0: {} js-types@4.0.0: {} @@ -7409,7 +7839,13 @@ snapshots: dependencies: argparse: 2.0.1 - jsdoc-type-pratt-parser@6.10.0: {} + js-yaml@5.2.2: + dependencies: + argparse: 2.0.1 + + jsdoc-type-pratt-parser@9.1.1: + dependencies: + '@types/estree': 1.0.9 jsep@1.4.0: {} @@ -7417,7 +7853,12 @@ snapshots: json-buffer@3.0.1: {} - json-parse-even-better-errors@3.0.2: {} + json-parse-even-better-errors@5.0.0: {} + + json-schema-to-ts@3.1.1: + dependencies: + '@babel/runtime': 7.29.7 + ts-algebra: 2.0.0 json-schema-traverse@0.4.1: {} @@ -7428,6 +7869,7 @@ snapshots: json5@1.0.2: dependencies: minimist: 1.2.8 + optional: true json5@2.2.3: {} @@ -7439,6 +7881,10 @@ snapshots: just-diff@6.0.2: {} + katex@0.16.47: + dependencies: + commander: 8.3.0 + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -7458,42 +7904,40 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - license-badger@0.22.1: + license-badger@0.23.0(supports-color@8.1.1): dependencies: '@rpl/badge-up': 3.0.0 command-line-basics: 3.0.0 es6-template-strings: 2.0.1 - js-yaml: 4.1.1 - license-types: 3.1.0 - licensee: 11.1.1 + js-yaml: 5.2.2 + license-types: 3.2.0 + licensee: 12.0.1(supports-color@8.1.1) spdx-correct: 3.2.0 - spdx-expression-parse: 4.0.0 - spdx-satisfies: 5.0.1 + spdx-expression-parse: 5.0.0 + spdx-satisfies: 6.0.0 transitivePeerDependencies: - '@75lb/nature' - - bluebird - supports-color - license-types@3.1.0: {} + license-types@3.2.0: {} - licensee@11.1.1: + licensee@12.0.1(supports-color@8.1.1): dependencies: '@blueoak/list': 15.0.0 - '@npmcli/arborist': 7.5.4 + '@npmcli/arborist': 9.9.0(supports-color@8.1.1) correct-license-metadata: 1.4.0 docopt: 0.6.2 hasown: 2.0.2 npm-license-corrections: 1.9.0 - semver: 7.7.3 + semver: 7.8.5 spdx-expression-parse: 4.0.0 spdx-expression-validate: 2.0.0 spdx-osi: 3.0.0 spdx-whitelisted: 1.0.0 transitivePeerDependencies: - - bluebird - supports-color - linkify-it@5.0.0: + linkify-it@5.0.2: dependencies: uc.micro: 2.1.0 @@ -7526,44 +7970,61 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 + lru-cache@11.5.2: {} lunr@2.3.9: {} + make-asynchronous@1.1.0: + dependencies: + p-event: 6.0.1 + type-fest: 4.41.0 + web-worker: 1.5.0 + make-dir@4.0.0: dependencies: - semver: 7.7.3 + semver: 7.8.5 - make-fetch-happen@13.0.1: + make-fetch-happen@15.0.6(supports-color@8.1.1): dependencies: - '@npmcli/agent': 2.2.2 - cacache: 18.0.4 + '@gar/promise-retry': 1.0.3 + '@npmcli/agent': 4.0.2(supports-color@8.1.1) + '@npmcli/redact': 4.0.0 + cacache: 20.0.4 http-cache-semantics: 4.2.0 - is-lambda: 1.0.1 - minipass: 7.1.2 - minipass-fetch: 3.0.5 + minipass: 7.1.3 + minipass-fetch: 5.0.2 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 - negotiator: 0.6.4 - proc-log: 4.2.0 - promise-retry: 2.0.1 - ssri: 10.0.6 + negotiator: 1.0.0 + proc-log: 6.1.0 + ssri: 13.0.1 transitivePeerDependencies: - supports-color - markdown-it@14.1.1: + markdown-it@14.3.0: dependencies: argparse: 2.0.1 entities: 4.5.0 - linkify-it: 5.0.0 + linkify-it: 5.0.2 mdurl: 2.0.0 punycode.js: 2.3.1 uc.micro: 2.1.0 markdown-table@3.0.4: {} + marked-terminal@7.3.0(marked@9.1.6): + dependencies: + ansi-escapes: 7.3.0 + ansi-regex: 6.2.2 + chalk: 5.6.2 + cli-highlight: 2.1.11 + cli-table3: 0.6.5 + marked: 9.1.6 + node-emoji: 2.2.0 + supports-hyperlinks: 3.2.0 + + marked@9.1.6: {} + math-intrinsics@1.1.0: {} mdast-util-find-and-replace@3.0.2: @@ -7573,14 +8034,14 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 - mdast-util-from-markdown@2.0.2: + mdast-util-from-markdown@2.0.2(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 decode-named-character-reference: 1.2.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.2 + micromark: 4.0.2(supports-color@8.1.1) micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-decode-string: 2.0.1 micromark-util-normalize-identifier: 2.0.1 @@ -7590,12 +8051,12 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-frontmatter@2.0.1: + mdast-util-frontmatter@2.0.1(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 escape-string-regexp: 5.0.0 - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.2(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 micromark-extension-frontmatter: 2.0.0 transitivePeerDependencies: @@ -7609,52 +8070,64 @@ snapshots: mdast-util-find-and-replace: 3.0.2 micromark-util-character: 2.1.1 - mdast-util-gfm-footnote@2.1.0: + mdast-util-gfm-footnote@2.1.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.2(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 micromark-util-normalize-identifier: 2.0.1 transitivePeerDependencies: - supports-color - mdast-util-gfm-strikethrough@2.0.0: + mdast-util-gfm-strikethrough@2.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.2(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-gfm-table@2.0.0: + mdast-util-gfm-table@2.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 markdown-table: 3.0.4 - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.2(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-gfm-task-list-item@2.0.0: + mdast-util-gfm-task-list-item@2.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.2(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-gfm@3.1.0: + mdast-util-gfm@3.1.0(supports-color@8.1.1): dependencies: - mdast-util-from-markdown: 2.0.2 + mdast-util-from-markdown: 2.0.2(supports-color@8.1.1) mdast-util-gfm-autolink-literal: 2.0.1 - mdast-util-gfm-footnote: 2.1.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-gfm-footnote: 2.1.0(supports-color@8.1.1) + mdast-util-gfm-strikethrough: 2.0.0(supports-color@8.1.1) + mdast-util-gfm-table: 2.0.0(supports-color@8.1.1) + mdast-util-gfm-task-list-item: 2.0.0(supports-color@8.1.1) + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-math@3.0.0(supports-color@8.1.1): + dependencies: + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + longest-streak: 3.1.0 + mdast-util-from-markdown: 2.0.2(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 + unist-util-remove-position: 5.0.0 transitivePeerDependencies: - supports-color @@ -7681,9 +8154,11 @@ snapshots: mdn-data@2.0.14: {} + mdn-data@2.29.0: {} + mdurl@2.0.0: {} - meow@12.1.1: {} + meow@14.1.0: {} merge2@1.4.1: {} @@ -7771,6 +8246,16 @@ snapshots: micromark-util-combine-extensions: 2.0.1 micromark-util-types: 2.0.2 + micromark-extension-math@3.1.0: + dependencies: + '@types/katex': 0.16.8 + devlop: 1.1.0 + katex: 0.16.47 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + micromark-factory-destination@2.0.1: dependencies: micromark-util-character: 2.1.1 @@ -7863,7 +8348,7 @@ snapshots: micromark-util-types@2.0.2: {} - micromark@4.0.2: + micromark@4.0.2(supports-color@8.1.1): dependencies: '@types/debug': 4.1.12 debug: 4.4.3(supports-color@8.1.1) @@ -7902,13 +8387,14 @@ snapshots: mimic-response@4.0.0: {} - minimatch@3.1.5: + minimatch@10.2.5: dependencies: - brace-expansion: 1.1.14 + brace-expansion: 5.0.8 - minimatch@9.0.5: + minimatch@3.1.5: dependencies: - brace-expansion: 2.1.0 + brace-expansion: 1.1.14 + optional: true minimatch@9.0.9: dependencies: @@ -7918,15 +8404,15 @@ snapshots: minipass-collect@2.0.1: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 - minipass-fetch@3.0.5: + minipass-fetch@5.0.2: dependencies: - minipass: 7.1.2 - minipass-sized: 1.0.3 - minizlib: 2.1.2 + minipass: 7.1.3 + minipass-sized: 2.0.0 + minizlib: 3.1.0 optionalDependencies: - encoding: 0.1.13 + iconv-lite: 0.7.3 minipass-flush@1.0.5: dependencies: @@ -7936,24 +8422,19 @@ snapshots: dependencies: minipass: 3.3.6 - minipass-sized@1.0.3: + minipass-sized@2.0.0: dependencies: - minipass: 3.3.6 + minipass: 7.1.3 minipass@3.3.6: dependencies: yallist: 4.0.0 - minipass@5.0.0: {} - - minipass@7.1.2: {} + minipass@7.1.3: {} - minizlib@2.1.2: + minizlib@3.1.0: dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - - mkdirp@1.0.4: {} + minipass: 7.1.3 mocha-badge-generator@0.11.0: dependencies: @@ -7962,15 +8443,15 @@ snapshots: es6-template-strings: 2.0.1 fast-glob: 3.3.3 - mocha-multi-reporters@1.5.1(mocha@11.7.5): + mocha-multi-reporters@1.5.1(mocha@11.8.0)(supports-color@8.1.1): dependencies: debug: 4.4.3(supports-color@8.1.1) lodash: 4.18.1 - mocha: 11.7.5 + mocha: 11.8.0 transitivePeerDependencies: - supports-color - mocha@11.7.5: + mocha@11.8.0: dependencies: browser-stdout: 1.3.1 chokidar: 4.0.3 @@ -7996,83 +8477,91 @@ snapshots: ms@2.1.3: {} + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + napi-postinstall@0.3.4: {} natural-compare@1.4.0: {} - negotiator@0.6.4: {} + negotiator@1.0.0: {} next-tick@1.1.0: {} - node-gyp@10.3.1: + node-emoji@2.2.0: + dependencies: + '@sindresorhus/is': 4.6.0 + char-regex: 1.0.2 + emojilib: 2.4.0 + skin-tone: 2.0.0 + + node-gyp@12.4.0: dependencies: env-paths: 2.2.1 exponential-backoff: 3.1.3 - glob: 10.5.0 graceful-fs: 4.2.11 - make-fetch-happen: 13.0.1 - nopt: 7.2.1 - proc-log: 4.2.0 - semver: 7.7.3 - tar: 6.2.1 - which: 4.0.0 - transitivePeerDependencies: - - supports-color + nopt: 9.0.0 + proc-log: 6.1.0 + semver: 7.8.5 + tar: 7.5.22 + tinyglobby: 0.2.15 + undici: 6.28.0 + which: 6.0.1 - node-releases@2.0.27: {} + node-releases@2.0.51: {} - nopt@7.2.1: - dependencies: - abbrev: 2.0.0 + node-releases@2.0.53: {} - normalize-package-data@6.0.2: + nopt@9.0.0: dependencies: - hosted-git-info: 7.0.2 - semver: 7.7.3 - validate-npm-package-license: 3.0.4 + abbrev: 4.0.0 normalize-url@8.1.0: {} - npm-bundled@3.0.1: + npm-bundled@5.0.0: dependencies: - npm-normalize-package-bin: 3.0.1 + npm-normalize-package-bin: 5.0.0 - npm-install-checks@6.3.0: + npm-install-checks@8.0.0: dependencies: - semver: 7.7.3 + semver: 7.8.5 npm-license-corrections@1.9.0: {} - npm-normalize-package-bin@3.0.1: {} + npm-normalize-package-bin@5.0.0: {} - npm-package-arg@11.0.3: + npm-package-arg@13.0.2: dependencies: - hosted-git-info: 7.0.2 - proc-log: 4.2.0 - semver: 7.7.3 - validate-npm-package-name: 5.0.1 + hosted-git-info: 9.0.3 + proc-log: 6.1.0 + semver: 7.8.5 + validate-npm-package-name: 7.0.2 - npm-packlist@8.0.2: + npm-packlist@10.0.4: dependencies: - ignore-walk: 6.0.5 + ignore-walk: 8.0.0 + proc-log: 6.1.0 - npm-pick-manifest@9.1.0: + npm-pick-manifest@11.0.3: dependencies: - npm-install-checks: 6.3.0 - npm-normalize-package-bin: 3.0.1 - npm-package-arg: 11.0.3 - semver: 7.7.3 + npm-install-checks: 8.0.0 + npm-normalize-package-bin: 5.0.0 + npm-package-arg: 13.0.2 + semver: 7.8.5 - npm-registry-fetch@17.1.0: + npm-registry-fetch@19.1.1(supports-color@8.1.1): dependencies: - '@npmcli/redact': 2.0.1 + '@npmcli/redact': 4.0.0 jsonparse: 1.3.1 - make-fetch-happen: 13.0.1 - minipass: 7.1.2 - minipass-fetch: 3.0.5 - minizlib: 2.1.2 - npm-package-arg: 11.0.3 - proc-log: 4.2.0 + make-fetch-happen: 15.0.6(supports-color@8.1.1) + minipass: 7.1.3 + minipass-fetch: 5.0.2 + minizlib: 3.1.0 + npm-package-arg: 13.0.2 + proc-log: 6.1.0 transitivePeerDependencies: - supports-color @@ -8082,11 +8571,14 @@ snapshots: obj-props@2.0.0: {} - object-deep-merge@2.0.0: {} + object-assign@4.1.1: {} + + object-deep-merge@2.0.1: {} object-inspect@1.13.4: {} - object-keys@1.1.1: {} + object-keys@1.1.1: + optional: true object.assign@4.1.7: dependencies: @@ -8096,6 +8588,7 @@ snapshots: es-object-atoms: 1.1.1 has-symbols: 1.1.0 object-keys: 1.1.1 + optional: true object.fromentries@2.0.8: dependencies: @@ -8103,12 +8596,14 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.0 es-object-atoms: 1.1.1 + optional: true object.groupby@1.0.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-abstract: 1.24.0 + optional: true object.values@1.2.1: dependencies: @@ -8116,21 +8611,27 @@ snapshots: call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 + optional: true + + obug@2.1.4: {} - open-cli@8.0.0: + open-cli@9.0.0(supports-color@8.1.1): dependencies: - file-type: 18.7.0 - get-stdin: 9.0.0 - meow: 12.1.1 - open: 10.2.0 - tempy: 3.1.0 + file-type: 21.3.4(supports-color@8.1.1) + meow: 14.1.0 + open: 11.0.0 + tempy: 3.2.0 + transitivePeerDependencies: + - supports-color - open@10.2.0: + open@11.0.0: dependencies: default-browser: 5.4.0 define-lazy-prop: 3.0.0 + is-in-ssh: 1.0.0 is-inside-container: 1.0.0 - wsl-utils: 0.1.0 + powershell-utils: 0.1.0 + wsl-utils: 0.3.1 opener@1.5.2: {} @@ -8148,9 +8649,14 @@ snapshots: get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 + optional: true p-cancelable@3.0.0: {} + p-event@6.0.1: + dependencies: + p-timeout: 6.1.4 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -8167,9 +8673,9 @@ snapshots: dependencies: p-limit: 3.1.0 - p-map@4.0.0: - dependencies: - aggregate-error: 3.1.0 + p-map@7.0.6: {} + + p-timeout@6.1.4: {} p-try@2.2.0: {} @@ -8180,45 +8686,40 @@ snapshots: ky: 1.14.0 registry-auth-token: 5.1.0 registry-url: 6.0.1 - semver: 7.7.3 + semver: 7.8.5 package-json@8.1.1: dependencies: got: 12.6.1 registry-auth-token: 5.1.0 registry-url: 6.0.1 - semver: 7.7.3 + semver: 7.8.5 - pacote@18.0.6: + pacote@21.5.1(supports-color@8.1.1): dependencies: - '@npmcli/git': 5.0.8 - '@npmcli/installed-package-contents': 2.1.0 - '@npmcli/package-json': 5.2.1 - '@npmcli/promise-spawn': 7.0.2 - '@npmcli/run-script': 8.1.0 - cacache: 18.0.4 + '@gar/promise-retry': 1.0.3 + '@npmcli/git': 7.0.2 + '@npmcli/installed-package-contents': 4.0.0 + '@npmcli/package-json': 7.0.5 + '@npmcli/promise-spawn': 9.0.1 + '@npmcli/run-script': 10.0.4 + cacache: 20.0.4 fs-minipass: 3.0.3 - minipass: 7.1.2 - npm-package-arg: 11.0.3 - npm-packlist: 8.0.2 - npm-pick-manifest: 9.1.0 - npm-registry-fetch: 17.1.0 - proc-log: 4.2.0 - promise-retry: 2.0.1 - sigstore: 2.3.1 - ssri: 10.0.6 - tar: 6.2.1 + minipass: 7.1.3 + npm-package-arg: 13.0.2 + npm-packlist: 10.0.4 + npm-pick-manifest: 11.0.3 + npm-registry-fetch: 19.1.1(supports-color@8.1.1) + proc-log: 6.1.0 + sigstore: 4.1.1(supports-color@8.1.1) + ssri: 13.0.1 + tar: 7.5.22 transitivePeerDependencies: - - bluebird - supports-color - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parse-conflict-json@3.0.1: + parse-conflict-json@5.0.1: dependencies: - json-parse-even-better-errors: 3.0.2 + json-parse-even-better-errors: 5.0.0 just-diff: 6.0.2 just-diff-apply: 5.5.0 @@ -8228,6 +8729,14 @@ snapshots: parse-statements@1.0.11: {} + parse5-htmlparser2-tree-adapter@6.0.1: + dependencies: + parse5: 6.0.1 + + parse5@5.1.1: {} + + parse5@6.0.1: {} + path-exists@4.0.0: {} path-key@3.1.1: {} @@ -8237,11 +8746,12 @@ snapshots: path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 - minipass: 7.1.2 - - path-type@6.0.0: {} + minipass: 7.1.3 - peek-readable@5.4.2: {} + path-scurry@2.0.2: + dependencies: + lru-cache: 11.5.2 + minipass: 7.1.3 picocolors@1.1.1: {} @@ -8251,39 +8761,35 @@ snapshots: pluralize@8.0.0: {} - portfinder@1.0.38: + portfinder@1.0.38(supports-color@8.1.1): dependencies: async: 3.2.6 debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - possible-typed-array-names@1.1.0: {} + possible-typed-array-names@1.1.0: + optional: true - postcss-selector-parser@6.1.2: + postcss-selector-parser@7.1.4: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 + powershell-utils@0.1.0: {} + prelude-ls@1.2.1: {} - proc-log@4.2.0: {} + proc-log@6.1.0: {} process@0.11.10: {} - proggy@2.0.0: {} + proggy@4.0.0: {} promise-all-reject-late@1.0.1: {} promise-call-limit@3.0.2: {} - promise-inflight@1.0.1: {} - - promise-retry@2.0.1: - dependencies: - err-code: 2.0.3 - retry: 0.12.0 - proto-list@1.2.4: {} prototype-properties@5.0.0: {} @@ -8304,6 +8810,8 @@ snapshots: quick-lru@5.1.1: {} + quote-js-string@0.1.0: {} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 @@ -8315,12 +8823,7 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - read-cmd-shim@4.0.0: {} - - read-package-json-fast@3.0.2: - dependencies: - json-parse-even-better-errors: 3.0.2 - npm-normalize-package-bin: 3.0.1 + read-cmd-shim@6.0.0: {} readable-stream@4.7.0: dependencies: @@ -8330,17 +8833,13 @@ snapshots: process: 0.11.10 string_decoder: 1.3.0 - readable-web-to-node-stream@3.0.4: - dependencies: - readable-stream: 4.7.0 - readdirp@4.1.2: {} reduce-flatten@2.0.0: {} refa@0.12.1: dependencies: - '@eslint-community/regexpp': 4.12.1 + '@eslint-community/regexpp': 4.12.2 reflect.getprototypeof@1.0.10: dependencies: @@ -8352,6 +8851,7 @@ snapshots: get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 + optional: true regenerate-unicode-properties@10.2.2: dependencies: @@ -8361,11 +8861,9 @@ snapshots: regexp-ast-analysis@0.7.1: dependencies: - '@eslint-community/regexpp': 4.12.1 + '@eslint-community/regexpp': 4.12.2 refa: 0.12.1 - regexp-tree@0.1.27: {} - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -8374,13 +8872,14 @@ snapshots: get-proto: 1.0.1 gopd: 1.2.0 set-function-name: 2.0.2 + optional: true regexpu-core@6.4.0: dependencies: regenerate: 1.4.2 regenerate-unicode-properties: 10.2.2 regjsgen: 0.8.0 - regjsparser: 0.13.0 + regjsparser: 0.13.2 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.2.1 @@ -8394,7 +8893,7 @@ snapshots: regjsgen@0.8.0: {} - regjsparser@0.13.0: + regjsparser@0.13.2: dependencies: jsesc: 3.1.0 @@ -8408,8 +8907,6 @@ snapshots: resolve-alpn@1.2.1: {} - resolve-from@4.0.0: {} - resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} @@ -8426,39 +8923,38 @@ snapshots: dependencies: lowercase-keys: 3.0.0 - retry@0.12.0: {} - reusify@1.1.0: {} - rollup@4.59.0: + rollup@4.62.4: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.59.0 - '@rollup/rollup-android-arm64': 4.59.0 - '@rollup/rollup-darwin-arm64': 4.59.0 - '@rollup/rollup-darwin-x64': 4.59.0 - '@rollup/rollup-freebsd-arm64': 4.59.0 - '@rollup/rollup-freebsd-x64': 4.59.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.59.0 - '@rollup/rollup-linux-arm-musleabihf': 4.59.0 - '@rollup/rollup-linux-arm64-gnu': 4.59.0 - '@rollup/rollup-linux-arm64-musl': 4.59.0 - '@rollup/rollup-linux-loong64-gnu': 4.59.0 - '@rollup/rollup-linux-loong64-musl': 4.59.0 - '@rollup/rollup-linux-ppc64-gnu': 4.59.0 - '@rollup/rollup-linux-ppc64-musl': 4.59.0 - '@rollup/rollup-linux-riscv64-gnu': 4.59.0 - '@rollup/rollup-linux-riscv64-musl': 4.59.0 - '@rollup/rollup-linux-s390x-gnu': 4.59.0 - '@rollup/rollup-linux-x64-gnu': 4.59.0 - '@rollup/rollup-linux-x64-musl': 4.59.0 - '@rollup/rollup-openbsd-x64': 4.59.0 - '@rollup/rollup-openharmony-arm64': 4.59.0 - '@rollup/rollup-win32-arm64-msvc': 4.59.0 - '@rollup/rollup-win32-ia32-msvc': 4.59.0 - '@rollup/rollup-win32-x64-gnu': 4.59.0 - '@rollup/rollup-win32-x64-msvc': 4.59.0 + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.62.4 + '@rollup/rollup-android-arm64': 4.62.4 + '@rollup/rollup-darwin-arm64': 4.62.4 + '@rollup/rollup-darwin-x64': 4.62.4 + '@rollup/rollup-freebsd-arm64': 4.62.4 + '@rollup/rollup-freebsd-x64': 4.62.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.4 + '@rollup/rollup-linux-arm-musleabihf': 4.62.4 + '@rollup/rollup-linux-arm64-gnu': 4.62.4 + '@rollup/rollup-linux-arm64-musl': 4.62.4 + '@rollup/rollup-linux-loong64-gnu': 4.62.4 + '@rollup/rollup-linux-loong64-musl': 4.62.4 + '@rollup/rollup-linux-ppc64-gnu': 4.62.4 + '@rollup/rollup-linux-ppc64-musl': 4.62.4 + '@rollup/rollup-linux-riscv64-gnu': 4.62.4 + '@rollup/rollup-linux-riscv64-musl': 4.62.4 + '@rollup/rollup-linux-s390x-gnu': 4.62.4 + '@rollup/rollup-linux-x64-gnu': 4.62.4 + '@rollup/rollup-linux-x64-musl': 4.62.4 + '@rollup/rollup-openbsd-x64': 4.62.4 + '@rollup/rollup-openharmony-arm64': 4.62.4 + '@rollup/rollup-win32-arm64-msvc': 4.62.4 + '@rollup/rollup-win32-ia32-msvc': 4.62.4 + '@rollup/rollup-win32-x64-gnu': 4.62.4 + '@rollup/rollup-win32-x64-msvc': 4.62.4 fsevents: 2.3.3 run-applescript@7.1.0: {} @@ -8474,6 +8970,7 @@ snapshots: get-intrinsic: 1.3.0 has-symbols: 1.1.0 isarray: 2.0.5 + optional: true safe-buffer@5.1.2: {} @@ -8483,18 +8980,20 @@ snapshots: dependencies: es-errors: 1.3.0 isarray: 2.0.5 + optional: true safe-regex-test@1.1.0: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 is-regex: 1.2.1 + optional: true safer-buffer@2.1.2: {} scslre@0.3.0: dependencies: - '@eslint-community/regexpp': 4.12.1 + '@eslint-community/regexpp': 4.12.2 refa: 0.12.1 regexp-ast-analysis: 0.7.1 @@ -8502,18 +9001,21 @@ snapshots: semver-diff@4.0.0: dependencies: - semver: 7.7.3 - - semver@6.3.1: {} + semver: 7.8.5 - semver@7.7.2: {} + semver@6.3.1: + optional: true semver@7.7.3: {} + semver@7.8.5: {} + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 + serialize-javascript@7.0.7: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -8522,6 +9024,7 @@ snapshots: get-intrinsic: 1.3.0 gopd: 1.2.0 has-property-descriptors: 1.0.2 + optional: true set-function-name@2.0.2: dependencies: @@ -8529,12 +9032,14 @@ snapshots: es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + optional: true set-proto@1.0.0: dependencies: dunder-proto: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 + optional: true shebang-command@2.0.0: dependencies: @@ -8574,24 +9079,28 @@ snapshots: signal-exit@4.1.0: {} - sigstore@2.3.1: + sigstore@4.1.1(supports-color@8.1.1): dependencies: - '@sigstore/bundle': 2.3.2 - '@sigstore/core': 1.1.0 - '@sigstore/protobuf-specs': 0.3.3 - '@sigstore/sign': 2.3.2 - '@sigstore/tuf': 2.3.4 - '@sigstore/verify': 1.2.1 + '@sigstore/bundle': 4.0.0 + '@sigstore/core': 3.2.1 + '@sigstore/protobuf-specs': 0.5.1 + '@sigstore/sign': 4.1.1(supports-color@8.1.1) + '@sigstore/tuf': 4.0.2(supports-color@8.1.1) + '@sigstore/verify': 3.1.1 transitivePeerDependencies: - supports-color + skin-tone@2.0.0: + dependencies: + unicode-emoji-modifier-base: 1.0.0 + slash@5.1.0: {} smart-buffer@4.2.0: {} smob@1.5.0: {} - socks-proxy-agent@8.0.5: + socks-proxy-agent@8.0.5(supports-color@8.1.1): dependencies: agent-base: 7.1.4 debug: 4.4.3(supports-color@8.1.1) @@ -8604,6 +9113,8 @@ snapshots: ip-address: 10.2.0 smart-buffer: 4.2.0 + source-map-js@1.2.1: {} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -8634,6 +9145,11 @@ snapshots: spdx-exceptions: 2.5.0 spdx-license-ids: 3.0.22 + spdx-expression-parse@5.0.0: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.22 + spdx-expression-validate@2.0.0: dependencies: spdx-expression-parse: 3.0.1 @@ -8644,7 +9160,7 @@ snapshots: spdx-ranges@2.1.1: {} - spdx-satisfies@5.0.1: + spdx-satisfies@6.0.0: dependencies: spdx-compare: 1.0.0 spdx-expression-parse: 3.0.1 @@ -8657,11 +9173,11 @@ snapshots: sprintf-js@1.0.3: {} - ssri@10.0.6: + ssri@13.0.1: dependencies: - minipass: 7.1.2 + minipass: 7.1.3 - stable-hash@0.0.5: {} + stable-hash-x@0.2.0: {} stable@0.1.8: {} @@ -8669,6 +9185,7 @@ snapshots: dependencies: es-errors: 1.3.0 internal-slot: 1.1.0 + optional: true stream-chunks@1.0.0: dependencies: @@ -8693,6 +9210,11 @@ snapshots: get-east-asian-width: 1.4.0 strip-ansi: 7.1.2 + string-width@8.2.2: + dependencies: + get-east-asian-width: 1.6.0 + strip-ansi: 7.1.2 + string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.8 @@ -8702,6 +9224,7 @@ snapshots: es-abstract: 1.24.0 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 + optional: true string.prototype.trimend@1.0.9: dependencies: @@ -8709,12 +9232,14 @@ snapshots: call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.1.1 + optional: true string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-object-atoms: 1.1.1 + optional: true string_decoder@1.3.0: dependencies: @@ -8728,7 +9253,8 @@ snapshots: dependencies: ansi-regex: 6.2.2 - strip-bom@3.0.0: {} + strip-bom@3.0.0: + optional: true strip-indent@4.1.1: {} @@ -8736,10 +9262,9 @@ snapshots: strip-json-comments@3.1.1: {} - strtok3@7.1.1: + strtok3@10.3.5: dependencies: '@tokenizer/token': 0.3.0 - peek-readable: 5.4.2 stubborn-fs@2.0.0: dependencies: @@ -8747,6 +9272,12 @@ snapshots: stubborn-utils@1.0.2: {} + super-regex@1.1.0: + dependencies: + function-timeout: 1.0.2 + make-asynchronous: 1.1.0 + time-span: 5.1.0 + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -8759,6 +9290,11 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-hyperlinks@3.2.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + supports-preserve-symlinks-flag@1.0.0: {} svgo@2.6.0: @@ -8783,20 +9319,21 @@ snapshots: array-back: 6.2.2 wordwrapjs: 5.1.1 + tagged-tag@1.0.0: {} + tapable@2.3.0: {} - tar@6.2.1: + tar@7.5.22: dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.3 + minizlib: 3.1.0 + yallist: 5.0.0 temp-dir@3.0.0: {} - tempy@3.1.0: + tempy@3.2.0: dependencies: is-stream: 3.0.0 temp-dir: 3.0.0 @@ -8810,11 +9347,23 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 - test-exclude@7.0.1: + test-exclude@8.0.0: dependencies: '@istanbuljs/schema': 0.1.3 - glob: 10.5.0 - minimatch: 9.0.9 + glob: 13.0.6 + minimatch: 10.2.5 + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + time-span@5.1.0: + dependencies: + convert-hrtime: 5.0.0 tinyglobby@0.2.15: dependencies: @@ -8830,17 +9379,25 @@ snapshots: '@sindresorhus/base62': 1.0.0 reserved-identifiers: 1.2.0 - token-types@5.0.1: + token-types@6.1.2: dependencies: + '@borewit/text-codec': 0.2.2 '@tokenizer/token': 0.3.0 ieee754: 1.2.1 treeverse@3.0.0: {} - ts-declaration-location@1.0.7(typescript@5.9.3): + ts-algebra@2.0.0: {} + + ts-api-utils@2.5.0(typescript@6.0.3): + dependencies: + typescript: 6.0.3 + + ts-declaration-location@1.0.7(typescript@6.0.3): dependencies: picomatch: 4.0.4 - typescript: 5.9.3 + typescript: 6.0.3 + optional: true tsconfig-paths@3.15.0: dependencies: @@ -8848,15 +9405,16 @@ snapshots: json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 + optional: true tslib@2.8.1: optional: true - tuf-js@2.2.1: + tuf-js@4.1.0(supports-color@8.1.1): dependencies: - '@tufjs/models': 2.0.1 + '@tufjs/models': 4.1.0 debug: 4.4.3(supports-color@8.1.1) - make-fetch-happen: 13.0.1 + make-fetch-happen: 15.0.6(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -8870,6 +9428,10 @@ snapshots: type-fest@4.41.0: {} + type-fest@5.8.0: + dependencies: + tagged-tag: 1.0.0 + type@2.7.3: {} typed-array-buffer@1.0.3: @@ -8877,6 +9439,7 @@ snapshots: call-bound: 1.0.4 es-errors: 1.3.0 is-typed-array: 1.1.15 + optional: true typed-array-byte-length@1.0.3: dependencies: @@ -8885,6 +9448,7 @@ snapshots: gopd: 1.2.0 has-proto: 1.2.0 is-typed-array: 1.1.15 + optional: true typed-array-byte-offset@1.0.4: dependencies: @@ -8895,6 +9459,7 @@ snapshots: has-proto: 1.2.0 is-typed-array: 1.1.15 reflect.getprototypeof: 1.0.10 + optional: true typed-array-length@1.0.7: dependencies: @@ -8904,21 +9469,24 @@ snapshots: is-typed-array: 1.1.15 possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 + optional: true typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 - typedoc@0.28.14(typescript@5.9.3): + typedoc@0.28.20(typescript@6.0.3): dependencies: - '@gerrit0/mini-shiki': 3.15.0 + '@gerrit0/mini-shiki': 3.23.0 lunr: 2.3.9 - markdown-it: 14.1.1 - minimatch: 9.0.9 - typescript: 5.9.3 + markdown-it: 14.3.0 + minimatch: 10.2.5 + typescript: 6.0.3 yaml: 2.9.0 - typescript@5.9.3: {} + typescript@5.6.1-rc: {} + + typescript@6.0.3: {} typical@4.0.0: {} @@ -8928,15 +9496,24 @@ snapshots: uc.micro@2.1.0: {} + uint8array-extras@1.5.0: {} + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 has-bigints: 1.1.0 has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 + optional: true + + undici-types@8.3.0: {} + + undici@6.28.0: {} unicode-canonical-property-names-ecmascript@2.0.1: {} + unicode-emoji-modifier-base@1.0.0: {} + unicode-match-property-ecmascript@2.0.0: dependencies: unicode-canonical-property-names-ecmascript: 2.0.1 @@ -8946,20 +9523,12 @@ snapshots: unicode-property-aliases-ecmascript@2.2.0: {} - unicorn-magic@0.3.0: {} + unicorn-magic@0.4.0: {} union@0.5.0: dependencies: qs: 6.15.2 - unique-filename@3.0.0: - dependencies: - unique-slug: 4.0.0 - - unique-slug@4.0.0: - dependencies: - imurmurhash: 0.1.4 - unique-string@3.0.0: dependencies: crypto-random-string: 4.0.0 @@ -8968,6 +9537,11 @@ snapshots: dependencies: '@types/unist': 3.0.3 + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.0.0 + unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.3 @@ -9007,12 +9581,24 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - update-browserslist-db@1.1.4(browserslist@4.28.0): + update-browserslist-db@1.2.3(browserslist@4.28.0): dependencies: browserslist: 4.28.0 escalade: 3.2.0 picocolors: 1.1.1 + update-browserslist-db@1.2.3(browserslist@4.28.7): + dependencies: + browserslist: 4.28.7 + escalade: 3.2.0 + picocolors: 1.1.1 + + update-browserslist-db@1.3.1(browserslist@4.28.8): + dependencies: + browserslist: 4.28.8 + escalade: 3.2.0 + picocolors: 1.1.1 + update-notifier@6.0.2: dependencies: boxen: 7.1.1 @@ -9026,7 +9612,7 @@ snapshots: is-yarn-global: 0.4.1 latest-version: 7.0.0 pupa: 3.3.0 - semver: 7.7.3 + semver: 7.8.5 semver-diff: 4.0.0 xdg-basedir: 5.1.0 @@ -9040,7 +9626,7 @@ snapshots: is-npm: 6.1.0 latest-version: 9.0.0 pupa: 3.3.0 - semver: 7.7.3 + semver: 7.8.5 xdg-basedir: 5.1.0 uri-js@4.4.1: @@ -9057,14 +9643,13 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - validate-npm-package-license@3.0.4: - dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 - validate-npm-package-name@5.0.1: {} - walk-up-path@3.0.1: {} + validate-npm-package-name@7.0.2: {} + + walk-up-path@4.0.0: {} + + web-worker@1.5.0: {} whatwg-encoding@2.0.0: dependencies: @@ -9079,6 +9664,7 @@ snapshots: is-number-object: 1.1.1 is-string: 1.1.1 is-symbol: 1.1.1 + optional: true which-builtin-type@1.2.1: dependencies: @@ -9095,6 +9681,7 @@ snapshots: which-boxed-primitive: 1.1.1 which-collection: 1.0.2 which-typed-array: 1.1.19 + optional: true which-collection@1.0.2: dependencies: @@ -9102,6 +9689,7 @@ snapshots: is-set: 2.0.3 is-weakmap: 2.0.2 is-weakset: 2.0.4 + optional: true which-typed-array@1.1.19: dependencies: @@ -9112,14 +9700,15 @@ snapshots: get-proto: 1.0.1 gopd: 1.2.0 has-tostringtag: 1.0.2 + optional: true which@2.0.2: dependencies: isexe: 2.0.0 - which@4.0.0: + which@6.0.1: dependencies: - isexe: 3.1.1 + isexe: 4.0.0 widest-line@4.0.1: dependencies: @@ -9165,27 +9754,31 @@ snapshots: signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - write-file-atomic@5.0.1: + write-file-atomic@7.0.1: dependencies: - imurmurhash: 0.1.4 signal-exit: 4.1.0 - wsl-utils@0.1.0: + wsl-utils@0.3.1: dependencies: is-wsl: 3.1.0 + powershell-utils: 0.1.0 xdg-basedir@5.1.0: {} y18n@5.0.8: {} - yallist@3.1.1: {} - yallist@4.0.0: {} + yallist@5.0.0: {} + yaml@2.9.0: {} + yargs-parser@20.2.9: {} + yargs-parser@21.1.1: {} + yargs-parser@22.0.0: {} + yargs-unparser@2.0.0: dependencies: camelcase: 6.3.0 @@ -9193,6 +9786,16 @@ snapshots: flat: 5.0.2 is-plain-obj: 2.1.0 + yargs@16.2.2: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + yargs@17.7.2: dependencies: cliui: 8.0.1 @@ -9203,6 +9806,15 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yargs@18.1.0: + dependencies: + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 8.2.2 + y18n: 5.0.8 + yargs-parser: 22.0.0 + yocto-queue@0.1.0: {} zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 9d793392..30123318 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,3 +3,10 @@ allowBuilds: unrs-resolver: false ignoredBuiltDependencies: - unrs-resolver +minimumReleaseAgeExclude: + - '@types/node@26.1.2' + - eslint-config-ash-nazg@41.0.0 + - eslint-plugin-jsdoc@63.3.1 + - eslint-plugin-mocha@12.0.0 + - license-badger@0.23.0 + - license-types@3.2.0 diff --git a/rollup.config.js b/rollup.config.js index f7da6ff4..45282e3e 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -3,10 +3,10 @@ import {babel} from '@rollup/plugin-babel'; import {nodeResolve} from '@rollup/plugin-node-resolve'; import terser from '@rollup/plugin-terser'; +// @ts-expect-error Ok const pkg = JSON.parse(await readFile('./package.json')); /** - * @external RollupConfig * @type {object} * @see {@link https://rollupjs.org/guide/en#big-list-of-options} */ @@ -15,10 +15,10 @@ const pkg = JSON.parse(await readFile('./package.json')); * @param {object} config * @param {string} config.input * @param {boolean} config.minifying - * @param {string[]} [config."external"] + * @param {string[]} [config.external] * @param {string} [config.environment] - * @param {string} [config.format] - * @returns {RollupConfig} + * @param {"esm"|"umd"|"cjs"} [config.format] + * @returns {import('rollup').RollupOptions} */ function getRollupObject ({ input, minifying, environment, @@ -64,10 +64,10 @@ function getRollupObject ({ } /** - * @param {PlainObject} config + * @param {object} config * @param {boolean} config.minifying - * @param {"node"|"environment"} [config.environment] - * @returns {RollupConfig[]} + * @param {"node"|"environment"|"browser"} [config.environment] + * @returns {import('rollup').RollupOptions[]} */ function getRollupObjectByEnv ({minifying, environment}) { const input = `src/jsonpath-${environment}.js`; diff --git a/src/Safe-Script.js b/src/Safe-Script.js index 4b8e6cd6..6596c179 100644 --- a/src/Safe-Script.js +++ b/src/Safe-Script.js @@ -1,8 +1,29 @@ +/* eslint-disable unicorn/no-top-level-side-effects -- Temporary? */ /* eslint-disable no-bitwise -- Convenient */ import jsep from 'jsep'; import jsepRegex from '@jsep-plugin/regex'; import jsepAssignment from '@jsep-plugin/assignment'; +/** + * @import {EvaluatedResult, UnknownResult} from './jsonpath.js'; + */ + +/** + * @typedef {any} AssignmentExpression + */ + +/** + * @typedef {any} Substitution + */ + +/** + * @typedef {any} AnyParameter + */ + +/** + * @typedef {Record} Substitutions + */ + // register plugins jsep.plugins.register(jsepRegex, jsepAssignment); jsep.addUnaryOp('typeof'); @@ -22,37 +43,78 @@ const BLOCKED_PROTO_PROPERTIES = new Set([ const SafeEval = { /** * @param {jsep.Expression} ast - * @param {Record} subs + * @param {Substitutions} subs + * @returns {UnknownResult} */ evalAst (ast, subs) { switch (ast.type) { case 'BinaryExpression': case 'LogicalExpression': - return SafeEval.evalBinaryExpression(ast, subs); + return SafeEval.evalBinaryExpression( + /** @type {jsep.BinaryExpression} */ (ast), + subs + ); case 'Compound': - return SafeEval.evalCompound(ast, subs); + return SafeEval.evalCompound( + /** @type {jsep.Compound} */ (ast), + subs + ); case 'ConditionalExpression': - return SafeEval.evalConditionalExpression(ast, subs); + return SafeEval.evalConditionalExpression( + /** @type {jsep.ConditionalExpression} */ (ast), + subs + ); case 'Identifier': - return SafeEval.evalIdentifier(ast, subs); + return SafeEval.evalIdentifier( + /** @type {jsep.Identifier} */ (ast), + subs + ); case 'Literal': - return SafeEval.evalLiteral(ast, subs); + return SafeEval.evalLiteral(/** @type {jsep.Literal} */ (ast)); case 'MemberExpression': - return SafeEval.evalMemberExpression(ast, subs); + return SafeEval.evalMemberExpression( + /** @type {jsep.MemberExpression} */ (ast), + subs + ); case 'UnaryExpression': - return SafeEval.evalUnaryExpression(ast, subs); + return SafeEval.evalUnaryExpression( + /** @type {jsep.UnaryExpression} */ (ast), + subs + ); case 'ArrayExpression': - return SafeEval.evalArrayExpression(ast, subs); + return SafeEval.evalArrayExpression( + /** @type {jsep.ArrayExpression} */ (ast), + subs + ); case 'CallExpression': - return SafeEval.evalCallExpression(ast, subs); + return SafeEval.evalCallExpression( + /** @type {jsep.CallExpression} */ (ast), + subs + ); case 'AssignmentExpression': - return SafeEval.evalAssignmentExpression(ast, subs); + return SafeEval.evalAssignmentExpression( + /** @type {AssignmentExpression} */ (ast), + subs + ); default: - throw SyntaxError('Unexpected expression', ast); + throw new SyntaxError('Unexpected expression', { + cause: ast + }); } }, + + /** + * @param {jsep.BinaryExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalBinaryExpression (ast, subs) { - const result = { + /** + * @typedef {{ + * [key: string]: (a: AnyParameter, b: AnyParameter) => UnknownResult + * }} OperatorTable + */ + const result = /** @type {OperatorTable} */ ({ '||': (a, b) => a || b(), '&&': (a, b) => a && b(), '|': (a, b) => a | b(), @@ -76,25 +138,32 @@ const SafeEval = { '*': (a, b) => a * b(), '/': (a, b) => a / b(), '%': (a, b) => a % b() - }[ast.operator]( + })[ast.operator]( SafeEval.evalAst(ast.left, subs), () => SafeEval.evalAst(ast.right, subs) ); return result; }, + + /** + * @param {jsep.Compound} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalCompound (ast, subs) { let last; for (let i = 0; i < ast.body.length; i++) { if ( ast.body[i].type === 'Identifier' && - ['var', 'let', 'const'].includes(ast.body[i].name) && - ast.body[i + 1] && + ['var', 'let', 'const'].includes( + /** @type {jsep.Identifier} */ + (ast.body[i]).name + ) && + Object.hasOwn(ast.body, i + 1) && ast.body[i + 1].type === 'AssignmentExpression' ) { // var x=2; is detected as // [{Identifier var}, {AssignmentExpression x=2}] - // eslint-disable-next-line @stylistic/max-len -- Long - // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient i += 1; } const expr = ast.body[i]; @@ -102,76 +171,142 @@ const SafeEval = { } return last; }, + + /** + * @param {jsep.ConditionalExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalConditionalExpression (ast, subs) { if (SafeEval.evalAst(ast.test, subs)) { return SafeEval.evalAst(ast.consequent, subs); } return SafeEval.evalAst(ast.alternate, subs); }, + + /** + * @param {jsep.Identifier} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalIdentifier (ast, subs) { if (Object.hasOwn(subs, ast.name)) { return subs[ast.name]; } - throw ReferenceError(`${ast.name} is not defined`); + throw new ReferenceError(`${ast.name} is not defined`); }, + + /** + * @param {jsep.Literal} ast + * @returns {UnknownResult} + */ evalLiteral (ast) { return ast.value; }, + + /** + * @param {jsep.MemberExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalMemberExpression (ast, subs) { const prop = String( // NOTE: `String(value)` throws error when // value has overwritten the toString method to return non-string // i.e. `value = {toString: () => []}` ast.computed - ? SafeEval.evalAst(ast.property) // `object[property]` + ? SafeEval.evalAst(ast.property, subs) // `object[property]` : ast.property.name // `object.property` property is Identifier ); const obj = SafeEval.evalAst(ast.object, subs); if (obj === undefined || obj === null) { - throw TypeError( + throw new TypeError( `Cannot read properties of ${obj} (reading '${prop}')` ); } if (!Object.hasOwn(obj, prop) && BLOCKED_PROTO_PROPERTIES.has(prop)) { - throw TypeError( + throw new TypeError( `Cannot read properties of ${obj} (reading '${prop}')` ); } - const result = obj[prop]; + const result = /** @type {Record} */ (obj)[prop]; if (typeof result === 'function' && result !== Function) { return result.bind(obj); // arrow functions aren't affected by bind. } return result; }, + + /** + * @param {jsep.UnaryExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalUnaryExpression (ast, subs) { - const result = { - '-': (a) => -SafeEval.evalAst(a, subs), + /** + * @typedef {{ + * [key: string]: (a: AnyParameter) => UnknownResult + * }} UnaryOperatorTable + */ + const result = /** @type {UnaryOperatorTable} */ ({ + '-': (a) => -(/** @type {EvaluatedResult} */ ( + SafeEval.evalAst(a, subs)) + ), '!': (a) => !SafeEval.evalAst(a, subs), - '~': (a) => ~SafeEval.evalAst(a, subs), + '~': (a) => ~(/** @type {EvaluatedResult} */ ( + SafeEval.evalAst(a, subs)) + ), // eslint-disable-next-line no-implicit-coercion -- API - '+': (a) => +SafeEval.evalAst(a, subs), + '+': (a) => +(/** @type {EvaluatedResult} */ ( + SafeEval.evalAst(a, subs)) + ), typeof: (a) => typeof SafeEval.evalAst(a, subs), - // eslint-disable-next-line no-void, sonarjs/void-use -- feature + // eslint-disable-next-line no-void -- Ok void: (a) => void SafeEval.evalAst(a, subs) - }[ast.operator](ast.argument); + })[ast.operator](ast.argument); return result; }, + + /** + * @param {jsep.ArrayExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalArrayExpression (ast, subs) { - return ast.elements.map((el) => SafeEval.evalAst(el, subs)); + return ast.elements.map((el) => SafeEval.evalAst( + /** @type {jsep.Expression} */ + (el), + subs + )); }, + + /** + * @param {jsep.CallExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalCallExpression (ast, subs) { const args = ast.arguments.map((arg) => SafeEval.evalAst(arg, subs)); const func = SafeEval.evalAst(ast.callee, subs); if (func === Function) { throw new Error('Function constructor is disabled'); } - return func(...args); + return (/** @type {(...args: AnyParameter[]) => UnknownResult} */ ( + func + ))(...args); }, + + /** + * @param {AssignmentExpression} ast + * @param {Substitutions} subs + * @returns {UnknownResult} + */ evalAssignmentExpression (ast, subs) { if (ast.left.type !== 'Identifier') { - throw SyntaxError('Invalid left-hand side in assignment'); + throw new SyntaxError('Invalid left-hand side in assignment'); } - const id = ast.left.name; + const id = /** @type {jsep.Identifier} */ ( + ast.left + ).name; const value = SafeEval.evalAst(ast.right, subs); subs[id] = value; return subs[id]; @@ -187,7 +322,7 @@ class SafeScript { */ constructor (expr) { this.code = expr; - this.ast = jsep(this.code); + this.ast = /** @type {unknown} */ (jsep(this.code)); } /** @@ -198,7 +333,10 @@ class SafeScript { runInNewContext (context) { // `Object.create(null)` creates a prototypeless object const keyMap = Object.assign(Object.create(null), context); - return SafeEval.evalAst(this.ast, keyMap); + return SafeEval.evalAst( + /** @type {jsep.Expression} */ (this.ast), + keyMap + ); } } diff --git a/src/jsonpath-browser.js b/src/jsonpath-browser.js index 47f7b65d..27637865 100644 --- a/src/jsonpath-browser.js +++ b/src/jsonpath-browser.js @@ -1,24 +1,88 @@ -import {JSONPath} from './jsonpath.js'; +import {JSONPath, JSONPathClass} from './jsonpath.js'; /** - * @typedef {any} ContextItem + * @typedef {import('./jsonpath.js').AnyInput} AnyInput + */ +/** + * @typedef {import('./jsonpath.js').SandboxCallback} SandboxCallback + */ +/** + * @typedef {import('./jsonpath.js').SandboxPropertyValue} SandboxPropertyValue + */ +/** + * @typedef {import('./jsonpath.js').ExpressionArray} ExpressionArray + */ +/** + * @typedef {import('./jsonpath.js').ValueType} ValueType + */ +/** + * @typedef {import('./jsonpath.js').ParentValue} ParentValue + */ +/** + * @typedef {import('./jsonpath.js').UnknownResult} UnknownResult + */ +/** + * @typedef {import('./jsonpath.js').ParentProperty} ParentProperty + */ +/** + * @typedef {import('./jsonpath.js').PreferredOutput} PreferredOutput + */ +/** + * @typedef {import('./jsonpath.js').ReturnObject} ReturnObject + */ +/** + * @typedef {import('./jsonpath.js').JSONPathCallback} JSONPathCallback + */ +/** + * @typedef {import('./jsonpath.js').OtherTypeCallback} OtherTypeCallback + */ +/** + * @typedef {import('./jsonpath.js').ContextItem} ContextItem + */ +/** + * @typedef {import('./jsonpath.js').EvaluatedResult} EvaluatedResult + */ +/** + * @typedef {import('./jsonpath.js').EvalCallback} EvalCallback + */ +/** + * @typedef {import('./jsonpath.js').EvalClass} EvalClass + */ +/** + * @typedef {import('./jsonpath.js').ResultType} ResultType + */ +/** + * @typedef {import('./jsonpath.js').EvalValue} EvalValue + */ +/** + * @typedef {import('./jsonpath.js').PathType} PathType + */ +/** + * @typedef {import('./jsonpath.js').SafeScriptType} SafeScriptType + */ +/** + * @typedef {import('./jsonpath.js').ScriptType} ScriptType + */ +/** + * @typedef {import('./jsonpath.js').SandboxType} SandboxType */ - /** - * @typedef {any} EvaluatedResult + * @typedef {import('./jsonpath.js').JSONPathOptions} JSONPathOptions */ /** + * @template T * @callback ConditionCallback - * @param {ContextItem} item + * @param {T} item * @returns {boolean} */ /** * Copy items out of one array into another. - * @param {GenericArray} source Array with items to copy - * @param {GenericArray} target Array to which to copy - * @param {ConditionCallback} conditionCb Callback passed the current item; + * @template T + * @param {T[]} source Array with items to copy + * @param {T[]} target Array to which to copy + * @param {ConditionCallback} conditionCb Callback passed the current item; * will move item if evaluates to `true` * @returns {void} */ @@ -27,8 +91,6 @@ const moveToAnotherArray = function (source, target, conditionCb) { for (let i = 0; i < il; i++) { const item = source[i]; if (conditionCb(item)) { - // eslint-disable-next-line @stylistic/max-len -- Long - // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient target.push(source.splice(i--, 1)[0]); } } @@ -46,14 +108,14 @@ class Script { } /** - * @param {object} context Object whose items will be added + * @param {SandboxType} context Object whose items will be added * to evaluation * @returns {EvaluatedResult} Result of evaluated code */ runInNewContext (context) { let expr = this.code; const keys = Object.keys(context); - const funcs = []; + const funcs = /** @type {string[]} */ ([]); moveToAnotherArray(keys, funcs, (key) => { return typeof context[key] === 'function'; }); @@ -71,7 +133,7 @@ class Script { expr = funcString + expr; - // Mitigate http://perfectionkills.com/global-eval-what-are-the-options/#new_function + // Mitigate https://perfectionkills.com/global-eval-what-are-the-options/#new_function if (!(/(['"])use strict\1/u).test(expr) && !keys.includes('arguments')) { expr = 'var arguments = undefined;' + expr; } @@ -95,8 +157,9 @@ class Script { } } -JSONPath.prototype.vm = { +/** @type {{vm: ScriptType}} */ +(/** @type {unknown} */ (JSONPathClass.prototype)).vm = { Script }; -export {JSONPath}; +export {JSONPath, JSONPathClass, Script}; diff --git a/src/jsonpath-node.cts b/src/jsonpath-node.cts new file mode 100644 index 00000000..881f83ec --- /dev/null +++ b/src/jsonpath-node.cts @@ -0,0 +1,2 @@ +import * as jsonpath from './jsonpath-node.js'; +export = jsonpath; diff --git a/src/jsonpath-node.js b/src/jsonpath-node.js index 75dcfa40..538f7e04 100644 --- a/src/jsonpath-node.js +++ b/src/jsonpath-node.js @@ -1,8 +1,85 @@ import vm from 'vm'; -import {JSONPath} from './jsonpath.js'; +import {JSONPath, JSONPathClass} from './jsonpath.js'; -JSONPath.prototype.vm = vm; +/** + * @typedef {import('./jsonpath.js').AnyInput} AnyInput + */ +/** + * @typedef {import('./jsonpath.js').SandboxCallback} SandboxCallback + */ +/** + * @typedef {import('./jsonpath.js').SandboxPropertyValue} SandboxPropertyValue + */ +/** + * @typedef {import('./jsonpath.js').ExpressionArray} ExpressionArray + */ +/** + * @typedef {import('./jsonpath.js').ValueType} ValueType + */ +/** + * @typedef {import('./jsonpath.js').ParentValue} ParentValue + */ +/** + * @typedef {import('./jsonpath.js').UnknownResult} UnknownResult + */ +/** + * @typedef {import('./jsonpath.js').ParentProperty} ParentProperty + */ +/** + * @typedef {import('./jsonpath.js').PreferredOutput} PreferredOutput + */ +/** + * @typedef {import('./jsonpath.js').ReturnObject} ReturnObject + */ +/** + * @typedef {import('./jsonpath.js').JSONPathCallback} JSONPathCallback + */ +/** + * @typedef {import('./jsonpath.js').OtherTypeCallback} OtherTypeCallback + */ +/** + * @typedef {import('./jsonpath.js').ContextItem} ContextItem + */ +/** + * @typedef {import('./jsonpath.js').EvaluatedResult} EvaluatedResult + */ +/** + * @typedef {import('./jsonpath.js').EvalCallback} EvalCallback + */ +/** + * @typedef {import('./jsonpath.js').EvalClass} EvalClass + */ +/** + * @typedef {import('./jsonpath.js').ResultType} ResultType + */ +/** + * @typedef {import('./jsonpath.js').EvalValue} EvalValue + */ +/** + * @typedef {import('./jsonpath.js').PathType} PathType + */ +/** + * @typedef {import('./jsonpath.js').SafeScriptType} SafeScriptType + */ +/** + * @typedef {import('./jsonpath.js').ScriptType} ScriptType + */ +/** + * @typedef {import('./jsonpath.js').SandboxType} SandboxType + */ +/** + * @typedef {import('./jsonpath.js').JSONPathOptions} JSONPathOptions + */ + +// Node's vm module shape is wider than ScriptType, but is compatible for +// the properties actually used (Script) -- kept Node-specific here so +// `node:vm` types don't leak into the shared/browser declarations. +/** @type {{vm: ScriptType}} */ +(/** @type {unknown} */ (JSONPathClass.prototype)).vm = + /** @type {ScriptType} */ ( + /** @type {unknown} */ (vm) + ); export { - JSONPath + JSONPath, JSONPathClass }; diff --git a/src/jsonpath.d.ts b/src/jsonpath.d.ts deleted file mode 100644 index 6c3ab7b4..00000000 --- a/src/jsonpath.d.ts +++ /dev/null @@ -1,226 +0,0 @@ -/** - * Declaration for https://github.com/s3u/JSONPath - */ -declare module 'jsonpath-plus' { - type JSONPathCallback = ( - payload: any, payloadType: any, fullPayload: any - ) => any - - type JSONPathOtherTypeCallback = (...args: any[]) => void - - class EvalClass { - constructor(code: string); - runInNewContext(context: object): any; - } - - interface JSONPathOptions { - /** - * The JSONPath expression as a (normalized or unnormalized) string or - * array. - */ - path: string | any[] - /** - * The JSON object to evaluate (whether of null, boolean, number, - * string, object, or array type). - */ - json: null | boolean | number | string | object | any[] - /** - * If this is supplied as false, one may call the evaluate method - * manually. - * - * @default true - */ - autostart?: true | boolean - /** - * Whether the returned array of results will be flattened to a - * single dimension array. - * - * @default false - */ - flatten?: false | boolean - /** - * Can be case-insensitive form of "value", "path", "pointer", "parent", - * or "parentProperty" to determine respectively whether to return - * results as the values of the found items, as their absolute paths, - * as JSON Pointers to the absolute paths, as their parent objects, - * or as their parent's property name. - * - * If set to "all", all of these types will be returned on an object with - * the type as key name. - * - * @default 'value' - */ - resultType?: - 'value' | 'path' | 'pointer' | 'parent' | 'parentProperty' | 'all' - - /** - * Key-value map of variables to be available to code evaluations such - * as filtering expressions. - * (Note that the current path and value will also be available to those - * expressions; see the Syntax section for details.) - */ - sandbox?: Map - /** - * Whether or not to wrap the results in an array. - * - * If wrap is set to false, and no results are found, undefined will be - * returned (as opposed to an empty array when wrap is set to true). - * - * If wrap is set to false and a single non-array result is found, that - * result will be the only item returned (not within an array). - * - * An array will still be returned if multiple results are found, however. - * To avoid ambiguities (in the case where it is necessary to distinguish - * between a result which is a failure and one which is an empty array), - * it is recommended to switch the default to false. - * - * @default true - */ - wrap?: true | boolean - /** - * Script evaluation method. - * - * `safe`: In browser, it will use a minimal scripting engine which doesn't - * use `eval` or `Function` and satisfies Content Security Policy. In NodeJS, - * it has no effect and is equivalent to native as scripting is safe there. - * - * `native`: uses the native scripting capabilities. i.e. unsafe `eval` or - * `Function` in browser and `vm.Script` in nodejs. - * - * `true`: Same as 'safe' - * - * `false`: Disable Javascript executions in path string. Same as `preventEval: true` in previous versions. - * - * `callback [ (code, context) => value]`: A custom implementation which is called - * with `code` and `context` as arguments to return the evaluated value. - * - * `class`: A class similar to nodejs vm.Script. It will be created with `code` as constructor argument and the code - * is evaluated by calling `runInNewContext` with `context`. - * - * @default 'safe' - */ - eval?: 'safe' | 'native' | boolean | ((code: string, context: object) => any) | typeof EvalClass - /** - * Ignore errors while evaluating JSONPath expression. - * - * `true`: Don't break entire search if an error occurs while evaluating JSONPath expression on one key/value pair. - * - * `false`: Break entire search if an error occurs while evaluating JSONPath expression on one key/value pair. - * - * @default false - * - */ - ignoreEvalErrors?: boolean - /** - * In the event that a query could be made to return the root node, - * this allows the parent of that root node to be returned within results. - * - * @default null - */ - parent?: null | any - /** - * In the event that a query could be made to return the root node, - * this allows the parentProperty of that root node to be returned within - * results. - * - * @default null - */ - parentProperty?: null | any - /** - * If supplied, a callback will be called immediately upon retrieval of - * an end point value. - * - * The three arguments supplied will be the value of the payload - * (according to `resultType`), the type of the payload (whether it is - * a normal "value" or a "property" name), and a full payload object - * (with all `resultType`s). - * - * @default undefined - */ - callback?: undefined | JSONPathCallback - /** - * In the current absence of JSON Schema support, - * one can determine types beyond the built-in types by adding the - * perator `@other()` at the end of one's query. - * - * If such a path is encountered, the `otherTypeCallback` will be invoked - * with the value of the item, its path, its parent, and its parent's - * property name, and it should return a boolean indicating whether the - * supplied value belongs to the "other" type or not (or it may handle - * transformations and return false). - * - * @default undefined - * - */ - otherTypeCallback?: undefined | JSONPathOtherTypeCallback - } - - interface JSONPathOptionsAutoStart extends JSONPathOptions { - autostart: false - } - - interface JSONPathCallable { - (options: JSONPathOptionsAutoStart): JSONPathClass - (options: JSONPathOptions): T - - ( - path: JSONPathOptions['path'], - json: JSONPathOptions['json'], - callback: JSONPathOptions['callback'], - otherTypeCallback: JSONPathOptions['otherTypeCallback'] - ): T - } - - class JSONPathClass { - /** - * Exposes the cache object for those who wish to preserve and reuse - * it for optimization purposes. - */ - cache: any - - /** - * Accepts a normalized or unnormalized path as string and - * converts to an array: for example, - * `['$', 'aProperty', 'anotherProperty']`. - */ - toPathArray(path: string): string[] - - /** - * Accepts a path array and converts to a normalized path string. - * The string will be in a form like: - * `$['aProperty']['anotherProperty][0]`. - * The JSONPath terminal constructions `~` and `^` and type operators - * like `@string()` are silently stripped. - */ - toPathString(path: string[]): string - - /** - * Accepts a path array and converts to a JSON Pointer. - * - * The string will be in a form like: `/aProperty/anotherProperty/0` - * (with any `~` and `/` internal characters escaped as per the JSON - * Pointer spec). - * - * The JSONPath terminal constructions `~` and `^` and type operators - * like `@string()` are silently stripped. - */ - toPointer(path: string[]): any - - evaluate( - path: JSONPathOptions['path'], - json: JSONPathOptions['json'], - callback: JSONPathOptions['callback'], - otherTypeCallback: JSONPathOptions['otherTypeCallback'] - ): any - evaluate(options: { - path: JSONPathOptions['path'], - json: JSONPathOptions['json'], - callback: JSONPathOptions['callback'], - otherTypeCallback: JSONPathOptions['otherTypeCallback'] - }): any - } - - type JSONPathType = JSONPathCallable & JSONPathClass - - export const JSONPath: JSONPathType -} diff --git a/src/jsonpath.js b/src/jsonpath.js index e2bdbb57..5bc11c3e 100644 --- a/src/jsonpath.js +++ b/src/jsonpath.js @@ -1,24 +1,57 @@ /* eslint-disable camelcase -- Convenient for escaping */ - +/* eslint-disable class-methods-use-this -- Consistent monkey-patching */ +/* eslint-disable unicorn/prefer-private-class-fields -- Allow + monkey-patching */ import {SafeScript} from './Safe-Script.js'; /** - * @typedef {null|boolean|number|string|object|GenericArray} JSONObject + * @import {Script} from './jsonpath-browser.js'; + */ + +/** + * @typedef {any} AnyInput + */ + +/** + * @typedef {((...args: any[]) => any)} SandboxCallback + */ + +/** + * @typedef {any|SandboxCallback} SandboxPropertyValue + */ + +/** + * @typedef {(string|number)[]} ExpressionArray + */ + +/** + * @typedef {"scalar"|"boolean"|"string"|"undefined" + * |"function"|"integer"|"number"|"nonFinite"|"object" + * |"array"|"other"|"null"} ValueType + */ + +/** + * @typedef {unknown} ParentValue */ /** - * @typedef {any} AnyItem + * @typedef {unknown} UnknownResult */ /** - * @typedef {any} AnyResult + * @typedef {string|number|null} ParentProperty + */ + +/** + * @typedef {ReturnObject|string|number|boolean|null|unknown[] + * |Record} PreferredOutput */ /** * Copies array and then pushes item into it. - * @param {GenericArray} arr Array to copy and into which to push - * @param {AnyItem} item Array item to add (to end) - * @returns {GenericArray} Copy of the original array + * @param {ExpressionArray} arr Array to copy and into which to push + * @param {string|number} item Array item to add (to end) + * @returns {ExpressionArray} Copy of the original array */ function push (arr, item) { arr = arr.slice(); @@ -27,9 +60,9 @@ function push (arr, item) { } /** * Copies array and then unshifts item into it. - * @param {AnyItem} item Array item to add (to beginning) - * @param {GenericArray} arr Array to copy and into which to unshift - * @returns {GenericArray} Copy of the original array + * @param {string|number} item Array item to add (to beginning) + * @param {ExpressionArray} arr Array to copy and into which to unshift + * @returns {ExpressionArray} Copy of the original array */ function unshift (item, arr) { arr = arr.slice(); @@ -38,48 +71,34 @@ function unshift (item, arr) { } /** - * Caught when JSONPath is used without `new` but rethrown if with `new` - * @extends Error + * @typedef {object} ReturnObject + * @property {ExpressionArray|string} path + * @property {unknown} value + * @property {ParentValue} parent + * @property {ParentProperty} parentProperty + * @property {boolean} [isParentSelector] + * @property {boolean} [hasArrExpr] + * @property {ExpressionArray} [expr] + * @property {string} [pointer] */ -class NewError extends Error { - /** - * @param {AnyResult} value The evaluated scalar value - */ - constructor (value) { - super( - 'JSONPath should not be called with "new" (it prevents return ' + - 'of (unwrapped) scalar values)' - ); - this.avoidNew = true; - this.value = value; - this.name = 'NewError'; - } -} /** -* @typedef {object} ReturnObject -* @property {string} path -* @property {JSONObject} value -* @property {object|GenericArray} parent -* @property {string} parentProperty -*/ - -/** -* @callback JSONPathCallback -* @param {string|object} preferredOutput -* @param {"value"|"property"} type -* @param {ReturnObject} fullRetObj -* @returns {void} -*/ + * @callback JSONPathCallback + * @param {any} preferredOutput Using `any` type instead of `PreferredOutput` so + * that user can supply flexible type + * @param {"value"|"property"} type + * @param {ReturnObject} fullRetObj + * @returns {void} + */ /** -* @callback OtherTypeCallback -* @param {JSONObject} val -* @param {string} path -* @param {object|GenericArray} parent -* @param {string} parentPropName -* @returns {boolean} -*/ + * @callback OtherTypeCallback + * @param {unknown} val + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {string|null} parentPropName + * @returns {boolean|null} + */ /** * @typedef {any} ContextItem @@ -90,606 +109,1000 @@ class NewError extends Error { */ /** -* @callback EvalCallback -* @param {string} code -* @param {ContextItem} context -* @returns {EvaluatedResult} -*/ + * @callback EvalCallback + * @param {string} code + * @param {ContextItem} context + * @returns {EvaluatedResult} + */ /** - * @typedef {typeof SafeScript} EvalClass + * @typedef {new (expr: string) => { + * runInNewContext: (context: object) => EvaluatedResult + * }} ScriptConstructor + */ + +/** + * @typedef {ScriptConstructor} EvalClass + */ + +/** + * @typedef {"value"|"path"|"pointer"|"parent"|"parentProperty" + * |"all"} ResultType + */ + +/** + * @typedef {EvalCallback|EvalClass|'safe'|'native'|boolean} EvalValue + */ + +/** + * @typedef {string|string[]} PathType + */ + +/** + * @typedef {{Script: ScriptConstructor}} SafeScriptType + */ + +/** + * @typedef {{Script: ScriptConstructor}} ScriptType + */ + +/** + * @typedef {{ + * _$_path?: string, + * _$_parentProperty?: ParentProperty, + * _$_parent?: ParentValue, + * _$_property?: string|number, + * _$_root?: AnyInput, + * _$_v?: unknown, + * [key: string]: SandboxPropertyValue + * }} SandboxType */ /** * @typedef {object} JSONPathOptions - * @property {JSON} json - * @property {string|string[]} path - * @property {"value"|"path"|"pointer"|"parent"|"parentProperty"| - * "all"} [resultType="value"] + * @property {AnyInput} [json] + * @property {PathType} [path] + * @property {ResultType} [resultType="value"] * @property {boolean} [flatten=false] * @property {boolean} [wrap=true] - * @property {object} [sandbox={}] - * @property {EvalCallback|EvalClass|'safe'|'native'| - * boolean} [eval = 'safe'] - * @property {object|GenericArray|null} [parent=null] - * @property {string|null} [parentProperty=null] + * @property {SandboxType} [sandbox={}] + * @property {EvalValue} [eval='safe'] + * @property {any|null} [parent=null] + * @property {ParentProperty} [parentProperty=null] * @property {JSONPathCallback} [callback] * @property {OtherTypeCallback} [otherTypeCallback] Defaults to * function which throws on encountering `@other` * @property {boolean} [autostart=true] + * @property {boolean} [ignoreEvalErrors=false] */ + /** - * @param {string|JSONPathOptions} opts If a string, will be treated as `expr` - * @param {string} [expr] JSON path to evaluate - * @param {JSON} [obj] JSON object to evaluate against - * @param {JSONPathCallback} [callback] Passed 3 arguments: 1) desired payload - * per `resultType`, 2) `"value"|"property"`, 3) Full returned object with + * @overload + * @param {string} opts JSON path to evaluate + * @param {AnyInput} [expr] JSON object to evaluate against + * @param {JSONPathCallback} [obj] Passed 3 arguments: 1) desired + * payload per `resultType`, 2) `"value"|"property"`, 3) Full returned + * object with all payloads + * @param {OtherTypeCallback} [callback] If `@other()` is at the + * end of one's query, this will be invoked with the value of the item, + * its path, its parent, and its parent's property name, and it should + * return a boolean indicating whether the supplied value belongs to the + * "other" type or not (or it may handle transformations and return + * `false`). + * @param {undefined} [otherTypeCallback] + * @returns {unknown} The string form always has `autostart` implicitly + * `true`, so the result is the evaluated value, not a `JSONPathClass` + */ +/** + * @overload + * @param {JSONPathOptions & {autostart: false}} opts An options object + * with `autostart` explicitly set to `false` defers evaluation and + * returns the `JSONPathClass` instance instead + * @returns {JSONPathClass} + */ +/** + * @overload + * @param {JSONPathOptions} opts If a string, will be treated as + * `expr` + * @returns {unknown} + */ +/** + * @param {JSONPathOptions|string} opts If a string, will be treated as `expr` + * @param {string|AnyInput} [expr] JSON path to evaluate + * @param {AnyInput|JSONPathCallback} [obj] JSON object to evaluate against + * @param {JSONPathCallback|OtherTypeCallback} [callback] Passed 3 + * arguments: 1) desired payload per `resultType`, + * 2) `"value"|"property"`, 3) Full returned object with * all payloads * @param {OtherTypeCallback} [otherTypeCallback] If `@other()` is at the end * of one's query, this will be invoked with the value of the item, its * path, its parent, and its parent's property name, and it should return * a boolean indicating whether the supplied value belongs to the "other" * type or not (or it may handle transformations and return `false`). - * @returns {JSONPath} - * @class + * @throws {Error} + * @returns {unknown|JSONPathClass} */ function JSONPath (opts, expr, obj, callback, otherTypeCallback) { - // eslint-disable-next-line no-restricted-syntax -- Allow for pseudo-class - if (!(this instanceof JSONPath)) { - try { - return new JSONPath(opts, expr, obj, callback, otherTypeCallback); - } catch (e) { - if (!e.avoidNew) { - throw e; - } - return e.value; + try { + if (opts && typeof opts === 'object') { + return new JSONPathClass(opts); } - } - - if (typeof opts === 'string') { - otherTypeCallback = callback; - callback = obj; - obj = expr; - expr = opts; - opts = null; - } - const optObj = opts && typeof opts === 'object'; - opts = opts || {}; - this.json = opts.json || obj; - this.path = opts.path || expr; - this.resultType = opts.resultType || 'value'; - this.flatten = opts.flatten || false; - this.wrap = Object.hasOwn(opts, 'wrap') ? opts.wrap : true; - this.sandbox = opts.sandbox || {}; - this.eval = opts.eval === undefined ? 'safe' : opts.eval; - this.ignoreEvalErrors = (typeof opts.ignoreEvalErrors === 'undefined') - ? false - : opts.ignoreEvalErrors; - this.parent = opts.parent || null; - this.parentProperty = opts.parentProperty || null; - this.callback = opts.callback || callback || null; - this.otherTypeCallback = opts.otherTypeCallback || - otherTypeCallback || - function () { - throw new TypeError( - 'You must supply an otherTypeCallback callback option ' + - 'with the @other() operator.' - ); - }; - - if (opts.autostart !== false) { - const args = { - path: (optObj ? opts.path : expr) - }; - if (!optObj) { - args.json = obj; - } else if ('json' in opts) { - args.json = opts.json; + return new JSONPathClass( + opts, + expr, + /** @type {JSONPathCallback|undefined} */ (obj), + /** @type {OtherTypeCallback|undefined} */ (callback), + /** @type {undefined} */ (otherTypeCallback) + ); + } catch (e) { + if (new.target) { + throw e; } - const ret = this.evaluate(args); - if (!ret || typeof ret !== 'object') { - throw new NewError(ret); + if (e && typeof e === 'object' && 'value' in e) { + return /** @type {{value: UnknownResult}} */ (e).value; } - return ret; + throw e; } } -// PUBLIC METHODS -JSONPath.prototype.evaluate = function ( - expr, json, callback, otherTypeCallback -) { - let currParent = this.parent, - currParentProperty = this.parentProperty; - let {flatten, wrap} = this; - - this.currResultType = this.resultType; - this.currEval = this.eval; - this.currSandbox = this.sandbox; - callback = callback || this.callback; - this.currOtherTypeCallback = otherTypeCallback || this.otherTypeCallback; - - json = json || this.json; - expr = expr || this.path; - if (expr && typeof expr === 'object' && !Array.isArray(expr)) { - if (!expr.path && expr.path !== '') { - throw new TypeError( - 'You must supply a "path" property when providing an object ' + - 'argument to JSONPath.evaluate().' +/** + * + */ +class JSONPathClass { + /** + * @overload + * @param {string} opts JSON path to evaluate + * @param {AnyInput} [expr] JSON object to evaluate against + * @param {JSONPathCallback} [obj] Passed 3 arguments: 1) desired + * payload per `resultType`, 2) `"value"|"property"`, 3) Full returned + * object with all payloads + * @param {OtherTypeCallback} [callback] If `@other()` is at the + * end of one's query, this will be invoked with the value of the item, + * its path, its parent, and its parent's property name, and it should + * return a boolean indicating whether the supplied value belongs to the + * "other" type or not (or it may handle transformations and return + * `false`). + * @param {undefined} [otherTypeCallback] + */ + /** + * @overload + * @param {JSONPathOptions} opts If a string, will be treated as + * `expr` + */ + /** + * @param {null|string|JSONPathOptions} opts If a string, will be treated as + * `expr` + * @param {string|AnyInput} [expr] JSON path to evaluate + * @param {AnyInput|JSONPathCallback} [obj] JSON object to evaluate against + * @param {JSONPathCallback|OtherTypeCallback} [callback] Passed 3 + * arguments: 1) desired payload per `resultType`, + * 2) `"value"|"property"`, 3) Full returned + * object with all payloads + * @param {OtherTypeCallback} [otherTypeCallback] If `@other()` is at the + * end of one's query, this will be invoked with the value of the item, + * its path, its parent, and its parent's property name, and it should + * return a boolean indicating whether the supplied value belongs to the + * "other" type or not (or it may handle transformations and return + * `false`). + */ + constructor (opts, expr, obj, callback, otherTypeCallback) { + if (typeof opts === 'string') { + otherTypeCallback = /** @type {OtherTypeCallback} */ ( + callback ); - } - if (!(Object.hasOwn(expr, 'json'))) { - throw new TypeError( - 'You must supply a "json" property when providing an object ' + - 'argument to JSONPath.evaluate().' + callback = /** @type {JSONPathCallback} */ ( + obj ); + obj = expr; + expr = opts; + opts = null; } - ({json} = expr); - flatten = Object.hasOwn(expr, 'flatten') ? expr.flatten : flatten; - this.currResultType = Object.hasOwn(expr, 'resultType') - ? expr.resultType - : this.currResultType; - this.currSandbox = Object.hasOwn(expr, 'sandbox') - ? expr.sandbox - : this.currSandbox; - wrap = Object.hasOwn(expr, 'wrap') ? expr.wrap : wrap; - this.currEval = Object.hasOwn(expr, 'eval') - ? expr.eval - : this.currEval; - callback = Object.hasOwn(expr, 'callback') ? expr.callback : callback; - this.currOtherTypeCallback = Object.hasOwn(expr, 'otherTypeCallback') - ? expr.otherTypeCallback - : this.currOtherTypeCallback; - currParent = Object.hasOwn(expr, 'parent') ? expr.parent : currParent; - currParentProperty = Object.hasOwn(expr, 'parentProperty') - ? expr.parentProperty - : currParentProperty; - expr = expr.path; - } - currParent = currParent || null; - currParentProperty = currParentProperty || null; + const optObj = opts && typeof opts === 'object'; + opts ||= /** @type {JSONPathOptions} */ ({}); + /** @type {ResultType|undefined} */ + this.currResultType = undefined; - if (Array.isArray(expr)) { - expr = JSONPath.toPathString(expr); - } - if ((!expr && expr !== '') || !json) { - return undefined; - } + /** @type {EvalValue|undefined} */ + this.currEval = undefined; + + /** @type {OtherTypeCallback|undefined} */ + this.currOtherTypeCallback = undefined; - const exprList = JSONPath.toPathArray(expr); - if (exprList[0] === '$' && exprList.length > 1) { - exprList.shift(); + /** @type {SandboxType|undefined} */ + this.currSandbox = undefined; + + this._hasParentSelector = false; + + this.json = opts.json || obj; + this.path = opts.path || expr; + this.resultType = opts.resultType || 'value'; + this.flatten = Object.hasOwn(opts, 'flatten') ? opts.flatten : false; + this.wrap = Object.hasOwn(opts, 'wrap') ? opts.wrap : true; + this.sandbox = opts.sandbox || {}; + this.eval = opts.eval === undefined ? 'safe' : opts.eval; + this.ignoreEvalErrors = (typeof opts.ignoreEvalErrors === 'undefined') + ? false + : opts.ignoreEvalErrors; + this.parent = Object.hasOwn(opts, 'parent') ? opts.parent : null; + this.parentProperty = Object.hasOwn(opts, 'parentProperty') + ? opts.parentProperty + : null; + this.callback = opts.callback || + /** @type {JSONPathCallback} */ + (callback) || + null; + this.otherTypeCallback = opts.otherTypeCallback || + otherTypeCallback || + function () { + throw new TypeError( + 'You must supply an otherTypeCallback callback option ' + + 'with the @other() operator.' + ); + }; + + if (opts.autostart !== false) { + const args = /** @type {JSONPathOptions} */ ({ + path: (optObj ? opts.path : expr) + }); + if (!optObj && obj !== undefined) { + args.json = obj; + } else if ('json' in opts) { + args.json = opts.json; + } + const ret = this.evaluate(args); + if (!ret || typeof ret !== 'object') { + const err = /** @type {Error & {value: UnknownResult}} */ ( + new Error( + 'JSONPath should not be called with "new" (it ' + + 'prevents return of (unwrapped) scalar values)' + ) + ); + err.value = ret; + throw err; + } + + // eslint-disable-next-line @stylistic/max-len -- Long + // @ts-expect-error - Constructor returns evaluate result for legacy API + // eslint-disable-next-line no-constructor-return -- Legacy API + return ret; + } } - this._hasParentSelector = null; - const result = this - ._trace( - exprList, json, ['$'], currParent, currParentProperty, callback - ) - .filter(function (ea) { + + // PUBLIC METHODS + + /** + * @overload + * @param {JSONPathOptions} [expr] + * @returns {ReturnObject|ReturnObject[]|undefined|unknown} + */ + + /** + * @overload + * @param {PathType|undefined} [expr] + * @param {AnyInput} [json] + * @param {JSONPathCallback|null} [callback] + * @param {OtherTypeCallback} [otherTypeCallback] + * @returns {ReturnObject|ReturnObject[]|undefined|unknown} + */ + + /** + * @param {PathType|JSONPathOptions|undefined} [expr] + * @param {AnyInput} [json] + * @param {JSONPathCallback|null} [callback] + * @param {OtherTypeCallback} [otherTypeCallback] + * @returns {ReturnObject|ReturnObject[]|undefined|unknown} + */ + evaluate ( + expr, json, callback, otherTypeCallback + ) { + let currParent = this.parent, + currParentProperty = this.parentProperty; + let {flatten, wrap} = this; + + this.currResultType = this.resultType; + this.currEval = this.eval; + this.currSandbox = this.sandbox; + callback ||= this.callback; + this.currOtherTypeCallback = otherTypeCallback || + this.otherTypeCallback; + + if (expr && typeof expr === 'object' && !Array.isArray(expr)) { + const exprObj = expr; + if (!exprObj.path && exprObj.path !== '') { + throw new TypeError( + 'You must supply a "path" property when providing an ' + + 'object argument to JSONPath.evaluate().' + ); + } + if (!(Object.hasOwn(exprObj, 'json'))) { + throw new TypeError( + 'You must supply a "json" property when providing an ' + + 'object argument to JSONPath.evaluate().' + ); + } + ({json} = exprObj); + flatten = Object.hasOwn(exprObj, 'flatten') + ? exprObj.flatten + : flatten; + this.currResultType = Object.hasOwn(exprObj, 'resultType') + ? exprObj.resultType + : this.currResultType; + this.currSandbox = Object.hasOwn(exprObj, 'sandbox') + ? exprObj.sandbox + : this.currSandbox; + wrap = Object.hasOwn(exprObj, 'wrap') ? exprObj.wrap : wrap; + this.currEval = Object.hasOwn(exprObj, 'eval') + ? exprObj.eval + : this.currEval; + callback = Object.hasOwn(exprObj, 'callback') + ? exprObj.callback + : callback; + this.currOtherTypeCallback = Object.hasOwn( + exprObj, 'otherTypeCallback' + ) + ? exprObj.otherTypeCallback + : this.currOtherTypeCallback; + currParent = Object.hasOwn(exprObj, 'parent') + ? exprObj.parent + : currParent; + currParentProperty = Object.hasOwn(exprObj, 'parentProperty') + ? exprObj.parentProperty + : currParentProperty; + expr = exprObj.path; + } else { + json ||= this.json; + expr ||= this.path; + } + currParent ||= null; + currParentProperty ||= null; + + if (Array.isArray(expr)) { + expr = JSONPath.toPathString(expr); + } + if (!json || (!expr && expr !== '')) { + return undefined; + } + + const exprList = JSONPath.toPathArray( + /** @type {string} */ + (expr) + ); + if (exprList[0] === '$' && exprList.length > 1) { + exprList.shift(); + } + this._hasParentSelector = false; + const traceResult = this._trace( + exprList, json, ['$'], currParent, + currParentProperty, + callback ?? undefined, + undefined + ); + + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next 2 -- Unreachable: _trace returns array when hasArrExpr set */ + const result = ( + Array.isArray(traceResult) ? traceResult : [traceResult] + ).filter((ea) => { return ea && !ea.isParentSelector; }); - if (!result.length) { - return wrap ? [] : undefined; - } - if (!wrap && result.length === 1 && !result[0].hasArrExpr) { - return this._getPreferredOutput(result[0]); - } - return result.reduce((rslt, ea) => { - const valOrPath = this._getPreferredOutput(ea); - if (flatten && Array.isArray(valOrPath)) { - rslt = rslt.concat(valOrPath); - } else { - rslt.push(valOrPath); + if (!result.length) { + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next -- Unreachable: valid queries always produce results */ + return wrap ? [] : undefined; } - return rslt; - }, []); -}; + if (!wrap && result.length === 1 && !result[0].hasArrExpr) { + const preferredOutput = this._getPreferredOutput(result[0]); + return preferredOutput; + } + const reduced = result.reduce( + (rslt, ea) => { + const valOrPath = this._getPreferredOutput(ea); + if (flatten && Array.isArray(valOrPath)) { + rslt = rslt.concat(valOrPath); + } else { + rslt.push(valOrPath); + } + return rslt; + }, + /** @type {UnknownResult[]} */ + ([]) + ); -// PRIVATE METHODS - -JSONPath.prototype._getPreferredOutput = function (ea) { - const resultType = this.currResultType; - switch (resultType) { - case 'all': { - const path = Array.isArray(ea.path) - ? ea.path - : JSONPath.toPathArray(ea.path); - ea.pointer = JSONPath.toPointer(path); - ea.path = typeof ea.path === 'string' - ? ea.path - : JSONPath.toPathString(ea.path); - return ea; - } case 'value': case 'parent': case 'parentProperty': - return ea[resultType]; - case 'path': - return JSONPath.toPathString(ea[resultType]); - case 'pointer': - return JSONPath.toPointer(ea.path); - default: - throw new TypeError('Unknown result type'); + return reduced; } -}; -JSONPath.prototype._handleCallback = function (fullRetObj, callback, type) { - if (callback) { - const preferredOutput = this._getPreferredOutput(fullRetObj); - fullRetObj.path = typeof fullRetObj.path === 'string' - ? fullRetObj.path - : JSONPath.toPathString(fullRetObj.path); - // eslint-disable-next-line n/callback-return -- No need to return - callback(preferredOutput, type, fullRetObj); - } -}; + // PRIVATE METHODS -/** - * - * @param {string} expr - * @param {JSONObject} val - * @param {string} path - * @param {object|GenericArray} parent - * @param {string} parentPropName - * @param {JSONPathCallback} callback - * @param {boolean} hasArrExpr - * @param {boolean} literalPriority - * @returns {ReturnObject|ReturnObject[]} - */ -JSONPath.prototype._trace = function ( - expr, val, path, parent, parentPropName, callback, hasArrExpr, - literalPriority -) { - // No expr to follow? return path and value as the result of - // this trace branch - let retObj; - if (!expr.length) { - retObj = { - path, - value: val, - parent, - parentProperty: parentPropName, - hasArrExpr - }; - this._handleCallback(retObj, callback, 'value'); - return retObj; + /** + * @param {ReturnObject} ea + * @returns {PreferredOutput} + */ + _getPreferredOutput (ea) { + const resultType = this.currResultType; + switch (resultType) { + case 'all': { + const path = Array.isArray(ea.path) + ? ea.path + : JSONPath.toPathArray(ea.path); + ea.pointer = JSONPath.toPointer(/** @type {string[]} */ (path)); + ea.path = typeof ea.path === 'string' + ? ea.path + : JSONPath.toPathString(/** @type {string[]} */ (ea.path)); + return ea; + } case 'value': case 'parent': case 'parentProperty': + return /** @type {PreferredOutput} */ (ea[resultType]); + case 'path': + if (typeof ea.path === 'string') { + return ea.path; + } + return JSONPath.toPathString(/** @type {string[]} */ (ea.path)); + case 'pointer': { + const pathArray = Array.isArray(ea.path) + ? ea.path + : JSONPath.toPathArray(ea.path); + return JSONPath.toPointer(/** @type {string[]} */ (pathArray)); + } + default: + throw new TypeError('Unknown result type'); + } } - const loc = expr[0], x = expr.slice(1); - - // We need to gather the return value of recursive trace calls in order to - // do the parent sel computation. - const ret = []; /** - * - * @param {ReturnObject|ReturnObject[]} elems + * @param {ReturnObject} fullRetObj + * @param {JSONPathCallback|undefined} callback + * @param {"value"|"property"} type * @returns {void} */ - function addRet (elems) { - if (Array.isArray(elems)) { - // This was causing excessive stack size in Node (with or - // without Babel) against our performance test: - // `ret.push(...elems);` - elems.forEach((t) => { - ret.push(t); - }); - } else { - ret.push(elems); + _handleCallback (fullRetObj, callback, type) { + // Early return if no callback provided (defensive + // check for internal calls) + if (!callback) { + return; } + const preferredOutput = this._getPreferredOutput(fullRetObj); + if (Array.isArray(fullRetObj.path)) { + fullRetObj.path = JSONPath.toPathString( + /** @type {string[]} */ (fullRetObj.path) + ); + } + callback(preferredOutput, type, fullRetObj); } - if ((typeof loc !== 'string' || literalPriority) && val && - Object.hasOwn(val, loc) - ) { // simple case--directly follow property - addRet(this._trace(x, val[loc], push(path, loc), val, loc, callback, - hasArrExpr)); - // eslint-disable-next-line unicorn/prefer-switch -- Part of larger `if` - } else if (loc === '*') { // all child properties - this._walk(val, (m) => { + + /** + * + * @param {ExpressionArray} expr + * @param {unknown} val + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {ParentProperty} parentPropName + * @param {JSONPathCallback|undefined} callback + * @param {boolean|undefined} hasArrExpr + * @param {boolean} [literalPriority] + * @returns {ReturnObject|ReturnObject[]} + */ + _trace ( + expr, val, path, parent, parentPropName, callback, hasArrExpr, + literalPriority + ) { + // No expr to follow? return path and value as the result of + // this trace branch + let retObj; + if (!expr.length) { + retObj = { + path, + value: val, + parent, + parentProperty: parentPropName, + hasArrExpr + }; + this._handleCallback(retObj, callback, 'value'); + return retObj; + } + + const loc = /** @type {string} */ (expr[0]), x = expr.slice(1); + + // We need to gather the return value of recursive trace calls in order + // to do the parent sel computation. + /** @type {ReturnObject[]} */ + const ret = []; + /** + * + * @param {ReturnObject|ReturnObject[]} elems + * @returns {void} + */ + function addRet (elems) { + if (Array.isArray(elems)) { + // This was causing excessive stack size in Node (with or + // without Babel) against our performance test: + // `ret.push(...elems);` + elems.forEach((t) => { + ret.push(t); + }); + } else { + ret.push(elems); + } + } + if (val && (typeof loc !== 'string' || literalPriority) && + Object.hasOwn(val, /** @type {PropertyKey} */ (loc)) + ) { // simple case--directly follow property + const valObj = /** @type {Record} */ (val); addRet(this._trace( - x, val[m], push(path, m), val, m, callback, true, true + x, valObj[/** @type {string} */ (loc)], + push(path, loc), + val, /** @type {string|number} */ (loc), callback, + hasArrExpr )); - }); - } else if (loc === '..') { // all descendent parent properties - // Check remaining expression with val's immediate children - addRet( - this._trace(x, val, path, parent, parentPropName, callback, - hasArrExpr) - ); - this._walk(val, (m) => { - // We don't join m and x here because we only want parents, - // not scalar values - if (typeof val[m] === 'object') { - // Keep going with recursive descent on val's - // object children + // eslint-disable-next-line unicorn/prefer-switch -- Part of larger `if` + } else if (loc === '*') { // all child properties + this._walk(val, (m) => { + const valObj = /** @type {Record} */ (val); addRet(this._trace( - expr.slice(), val[m], push(path, m), val, m, callback, true + x, valObj[m], push(path, m), val, m, callback, true, true )); - } - }); - // The parent sel computation is handled in the frame above using the - // ancestor object of val - } else if (loc === '^') { - // This is not a final endpoint, so we do not invoke the callback here - this._hasParentSelector = true; - return { - path: path.slice(0, -1), - expr: x, - isParentSelector: true - }; - } else if (loc === '~') { // property name - retObj = { - path: push(path, loc), - value: parentPropName, - parent, - parentProperty: null - }; - this._handleCallback(retObj, callback, 'property'); - return retObj; - } else if (loc === '$') { // root only - addRet(this._trace(x, val, path, null, null, callback, hasArrExpr)); - } else if ((/^(-?\d*):(-?\d*):?(\d*)$/u).test(loc)) { // [start:end:step] Python slice syntax - addRet( - this._slice(loc, x, val, path, parent, parentPropName, callback) - ); - } else if (loc.indexOf('?(') === 0) { // [?(expr)] (filtering) - if (this.currEval === false) { - throw new Error('Eval [?(expr)] prevented in JSONPath expression.'); - } - const safeLoc = loc.replace(/^\?\((.*?)\)$/u, '$1'); - // check for a nested filter expression - const nested = (/@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu).exec(safeLoc); - if (nested) { - // find if there are matches in the nested expression - // add them to the result set if there is at least one match - this._walk(val, (m) => { - const npath = [nested[2]]; - const nvalue = nested[1] - ? val[m][nested[1]] - : val[m]; - const filterResults = this._trace(npath, nvalue, path, - parent, parentPropName, callback, true); - if (filterResults.length > 0) { - addRet(this._trace(x, val[m], push(path, m), val, - m, callback, true)); - } }); - } else { + } else if (loc === '..') { // all descendent parent properties + // Check remaining expression with val's immediate children + addRet( + this._trace(x, val, path, parent, parentPropName, callback, + hasArrExpr) + ); this._walk(val, (m) => { - if (this._eval(safeLoc, val[m], m, path, parent, - parentPropName)) { - addRet(this._trace(x, val[m], push(path, m), val, m, - callback, true)); + // We don't join m and x here because we only want parents, + // not scalar values + const valObj = /** @type {Record} */ (val); + if (typeof valObj[m] === 'object') { + // Keep going with recursive descent on val's + // object children + addRet(this._trace( + expr.slice(), + valObj[m], + push(path, m), + val, + m, + callback, + true + )); } }); - } - } else if (loc[0] === '(') { // [(expr)] (dynamic property/index) - if (this.currEval === false) { - throw new Error('Eval [(expr)] prevented in JSONPath expression.'); - } - // As this will resolve to a property name (but we don't know it - // yet), property and parent information is relative to the - // parent of the property to which this expression will resolve - addRet(this._trace(unshift( - this._eval( - loc, val, path.at(-1), - path.slice(0, -1), parent, parentPropName - ), - x - ), val, path, parent, parentPropName, callback, hasArrExpr)); - } else if (loc[0] === '@') { // value type: @boolean(), etc. - let addType = false; - const valueType = loc.slice(1, -2); - switch (valueType) { - case 'scalar': - if (!val || !(['object', 'function'].includes(typeof val))) { - addType = true; - } - break; - case 'boolean': case 'string': case 'undefined': case 'function': - if (typeof val === valueType) { - addType = true; - } - break; - case 'integer': - if (Number.isFinite(val) && !(val % 1)) { - addType = true; - } - break; - case 'number': - if (Number.isFinite(val)) { - addType = true; + // The parent sel computation is handled in the frame above using the + // ancestor object of val + } else if (loc === '^') { + // This is not a final endpoint, so we do not invoke the + // callback here + this._hasParentSelector = true; + return /** @type {ReturnObject} */ ({ + path: path.slice(0, -1), + expr: x, + isParentSelector: true, + value: undefined, + parent: undefined, + parentProperty: null + }); + } else if (loc === '~') { // property name + retObj = { + path: push(path, loc), + value: parentPropName, + parent, + parentProperty: null + }; + this._handleCallback(retObj, callback, 'property'); + return retObj; + } else if (loc === '$') { // root only + addRet(this._trace(x, val, path, null, null, callback, hasArrExpr)); + } else if ((/^(-?\d*):(-?\d*):?(\d*)$/u).test(loc)) { // [start:end:step] Python slice syntax + const sliceResult = this._slice( + loc, x, val, path, parent, parentPropName, callback + ); + if (sliceResult) { + addRet(sliceResult); } - break; - case 'nonFinite': - if (typeof val === 'number' && !Number.isFinite(val)) { - addType = true; + } else if (loc.indexOf('?(') === 0) { // [?(expr)] (filtering) + if (this.currEval === false) { + throw new Error( + 'Eval [?(expr)] prevented in JSONPath expression.' + ); } - break; - case 'object': - if (val && typeof val === valueType) { - addType = true; + const safeLoc = loc.replace(/^\?\((.*?)\)$/u, '$1'); + // check for a nested filter expression + + const nested = (/@.?([^?]*)[['](\??\(.*?\))(?!.\)\])[\]']/gu).exec(safeLoc); + if (nested) { + // find if there are matches in the nested expression + // add them to the result set if there is at least one match + this._walk(val, (m) => { + const npath = [nested[2]]; + const valObj2 = /** @type {Record} */ ( + val + ); + const nvalue = /** @type {ValueType} */ (nested[1] + ? /** @type {Record} */ ( + valObj2[m] + )[nested[1]] + : valObj2[m]); + const filterResults = this._trace(npath, nvalue, path, + parent, parentPropName, callback, true); + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next 3 -- Unreachable: _trace always returns array for nested filters */ + const filterArray = Array.isArray(filterResults) + ? filterResults + : [filterResults]; + if (filterArray.length > 0) { + addRet(this._trace(x, valObj2[m], push(path, m), val, + m, callback, true)); + } + }); + } else { + const valObj3 = /** @type {Record} */ (val); + this._walk(val, (m) => { + if (this._eval(safeLoc, valObj3[m], m, path, parent, + parentPropName)) { + addRet(this._trace(x, valObj3[m], push(path, m), val, m, + callback, true)); + } + }); } - break; - case 'array': - if (Array.isArray(val)) { - addType = true; + } else if (loc[0] === '(') { // [(expr)] (dynamic property/index) + if (this.currEval === false) { + throw new Error( + 'Eval [(expr)] prevented in JSONPath expression.' + ); } - break; - case 'other': - addType = this.currOtherTypeCallback( - val, path, parent, parentPropName + // As this will resolve to a property name (but we don't know it + // yet), property and parent information is relative to the + const evalResult = this._eval( + /** @type {string} */ (loc), + val, /** @type {string|number} */ (path.at(-1)), + path.slice(0, -1), parent, parentPropName ); - break; - case 'null': - if (val === null) { - addType = true; + const exprToUse = /** @type {string|number} */ ( + evalResult !== undefined ? evalResult : '' + ); + addRet(this._trace(unshift( + exprToUse, + x + ), val, path, parent, parentPropName, callback, hasArrExpr)); + } else if (loc[0] === '@') { // value type: @boolean(), etc. + let addType = false; + const valueType = /** @type {ValueType} */ (loc).slice(1, -2); + switch (valueType) { + case 'scalar': + if (!val || !(['object', 'function'].includes(typeof val))) { + addType = true; + } + break; + case 'boolean': case 'string': case 'undefined': case 'function': + if (typeof val === valueType) { + addType = true; + } + break; + case 'integer': + if (Number.isFinite(val) && + !(/** @type {number} */ (val) % 1)) { + addType = true; + } + break; + case 'number': + if (Number.isFinite(val)) { + addType = true; + } + break; + case 'nonFinite': + if (typeof val === 'number' && !Number.isFinite(val)) { + addType = true; + } + break; + case 'object': + if (val && typeof val === valueType) { + addType = true; + } + break; + case 'array': + if (Array.isArray(val)) { + addType = true; + } + break; + case 'other': + addType = this.currOtherTypeCallback?.( + val, path, parent, + /** @type {string|null} */ (parentPropName) + ) ?? false; + break; + case 'null': + if (val === null) { + addType = true; + } + break; + /* c8 ignore next 2 */ + default: + throw new TypeError('Unknown value type ' + valueType); } - break; - /* c8 ignore next 2 */ - default: - throw new TypeError('Unknown value type ' + valueType); - } - if (addType) { - retObj = {path, value: val, parent, parentProperty: parentPropName}; - this._handleCallback(retObj, callback, 'value'); - return retObj; - } - // `-escaped property - } else if (loc[0] === '`' && val && Object.hasOwn(val, loc.slice(1))) { - const locProp = loc.slice(1); - addRet(this._trace( - x, val[locProp], push(path, locProp), val, locProp, callback, - hasArrExpr, true - )); - } else if (loc.includes(',')) { // [name1,name2,...] - const parts = loc.split(','); - for (const part of parts) { + if (addType) { + retObj = { + path, value: val, parent, parentProperty: parentPropName + }; + this._handleCallback(retObj, callback, 'value'); + return retObj; + } + // `-escaped property + } else if (val && loc[0] === '`' && + Object.hasOwn(val, loc.slice(1)) + ) { + const locProp = loc.slice(1); + const valObj = /** @type {Record} */ (val); addRet(this._trace( - unshift(part, x), val, path, parent, parentPropName, callback, - true + x, valObj[locProp], push(path, locProp), val, locProp, callback, + hasArrExpr, true )); + } else if (loc.includes(',')) { // [name1,name2,...] + const parts = loc.split(','); + for (const part of parts) { + addRet(this._trace( + unshift(part, x), + val, + path, + parent, + parentPropName, + callback, + true + )); + } + // simple case--directly follow property + } else if ( + !literalPriority && val && Object.hasOwn(val, loc) + ) { + const valObj = /** @type {Record} */ (val); + addRet( + this._trace(x, valObj[loc], push(path, loc), val, loc, callback, + hasArrExpr, true) + ); } - // simple case--directly follow property - } else if ( - !literalPriority && val && Object.hasOwn(val, loc) - ) { - addRet( - this._trace(x, val[loc], push(path, loc), val, loc, callback, - hasArrExpr, true) - ); - } - // We check the resulting values for parent selections. For parent - // selections we discard the value object and continue the trace with the - // current val object - if (this._hasParentSelector) { - for (let t = 0; t < ret.length; t++) { - const rett = ret[t]; - if (rett && rett.isParentSelector) { - const tmp = this._trace( - rett.expr, val, rett.path, parent, parentPropName, callback, - hasArrExpr - ); - if (Array.isArray(tmp)) { - ret[t] = tmp[0]; - const tl = tmp.length; - for (let tt = 1; tt < tl; tt++) { - // eslint-disable-next-line @stylistic/max-len -- Long - // eslint-disable-next-line sonarjs/updated-loop-counter -- Convenient - t++; - ret.splice(t, 0, tmp[tt]); + // We check the resulting values for parent selections. For parent + // selections we discard the value object and continue the trace with + // the current val object + if (this._hasParentSelector) { + for (let t = 0; t < ret.length; t++) { + const rett = ret[t]; + if (rett && rett.isParentSelector) { + const exprToUse = /** @type {ExpressionArray} */ ( + rett.expr + ); + const pathToUse = /** @type {ExpressionArray} */ ( + rett.path + ); + const tmp = this._trace( + exprToUse, + val, + pathToUse, + parent, + parentPropName, + callback, + hasArrExpr + ); + if (Array.isArray(tmp)) { + ret[t] = tmp[0]; + const tl = tmp.length; + for (let tt = 1; tt < tl; tt++) { + t++; + ret.splice(t, 0, tmp[tt]); + } + } else { + ret[t] = tmp; } - } else { - ret[t] = tmp; } } } + return ret; } - return ret; -}; -JSONPath.prototype._walk = function (val, f) { - if (Array.isArray(val)) { - const n = val.length; - for (let i = 0; i < n; i++) { - f(i); + /** + * @param {unknown} val + * @param {(prop: string|number) => void} f + * @returns {void} + */ + _walk (val, f) { + if (Array.isArray(val)) { + const n = val.length; + for (let i = 0; i < n; i++) { + f(i); + } + } else if (val && typeof val === 'object') { + Object.keys(val).forEach((m) => { + f(m); + }); } - } else if (val && typeof val === 'object') { - Object.keys(val).forEach((m) => { - f(m); - }); } -}; -JSONPath.prototype._slice = function ( - loc, expr, val, path, parent, parentPropName, callback -) { - if (!Array.isArray(val)) { - return undefined; - } - const len = val.length, parts = loc.split(':'), - step = (parts[2] && Number.parseInt(parts[2])) || 1; - let start = (parts[0] && Number.parseInt(parts[0])) || 0, - end = parts[1] ? Number.parseInt(parts[1]) : len; - start = (start < 0) ? Math.max(0, start + len) : Math.min(len, start); - end = (end < 0) ? Math.max(0, end + len) : Math.min(len, end); - const ret = []; - for (let i = start; i < end; i += step) { - const tmp = this._trace( - unshift(i, expr), val, path, parent, parentPropName, callback, true - ); - // Should only be possible to be an array here since first part of - // ``unshift(i, expr)` passed in above would not be empty, nor `~`, - // nor begin with `@` (as could return objects) - // This was causing excessive stack size in Node (with or - // without Babel) against our performance test: `ret.push(...tmp);` - tmp.forEach((t) => { - ret.push(t); - }); + /** + * @param {string} loc + * @param {ExpressionArray} expr + * @param {unknown} val + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {ParentProperty} parentPropName + * @param {JSONPathCallback|undefined} callback + * @returns {ReturnObject[]|undefined} + */ + _slice ( + loc, expr, val, path, parent, parentPropName, callback + ) { + if (!Array.isArray(val)) { + return undefined; + } + const len = val.length, parts = loc.split(':'), + step = (parts[2] && Number(parts[2])) || 1; + let start = (parts[0] && Number(parts[0])) || 0, + end = parts[1] ? Number(parts[1]) : len; + start = (start < 0) ? Math.max(0, start + len) : Math.min(len, start); + end = (end < 0) ? Math.max(0, end + len) : Math.min(len, end); + /** @type {ReturnObject[]} */ + const ret = []; + for (let i = start; i < end; i += step) { + const tmp = this._trace( + unshift(i, expr), + val, + path, + parent, + parentPropName, + callback, + true + ); + // Should only be possible to be an array here since first part of + // ``unshift(i, expr)` passed in above would not be empty, + // nor `~`, nor begin with `@` (as could return objects) + // This was causing excessive stack size in Node (with or + // without Babel) against our performance test: `ret.push(...tmp);` + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next -- Unreachable: _trace returns array when expr non-empty */ + const tmpArray = Array.isArray(tmp) ? tmp : [tmp]; + tmpArray.forEach((t) => { + ret.push(t); + }); + } + return ret; } - return ret; -}; -JSONPath.prototype._eval = function ( - code, _v, _vname, path, parent, parentPropName -) { - this.currSandbox._$_parentProperty = parentPropName; - this.currSandbox._$_parent = parent; - this.currSandbox._$_property = _vname; - this.currSandbox._$_root = this.json; - this.currSandbox._$_v = _v; - - const containsPath = code.includes('@path'); - if (containsPath) { - this.currSandbox._$_path = JSONPath.toPathString(path.concat([_vname])); - } + /** + * @param {string} code + * @param {unknown} _v + * @param {string|number} _vname + * @param {ExpressionArray} path + * @param {ParentValue} parent + * @param {ParentProperty} parentPropName + * @returns {UnknownResult} + */ + _eval ( + code, _v, _vname, path, parent, parentPropName + ) { + if (this.currSandbox) { + this.currSandbox._$_parentProperty = parentPropName; + this.currSandbox._$_parent = parent; + this.currSandbox._$_property = _vname; + this.currSandbox._$_root = this.json; + this.currSandbox._$_v = _v; + } - const scriptCacheKey = this.currEval + 'Script:' + code; - if (!JSONPath.cache[scriptCacheKey]) { - let script = code - .replaceAll('@parentProperty', '_$_parentProperty') - .replaceAll('@parent', '_$_parent') - .replaceAll('@property', '_$_property') - .replaceAll('@root', '_$_root') - .replaceAll(/@([.\s)[])/gu, '_$_v$1'); + const containsPath = code.includes('@path'); if (containsPath) { - script = script.replaceAll('@path', '_$_path'); + // eslint-disable-next-line @stylistic/max-len -- Long + /* c8 ignore next -- Unreachable: currSandbox set in evaluate() before _eval */ + const currSandbox = this.currSandbox ?? {}; + currSandbox._$_path = JSONPath.toPathString( + /** @type {string[]} */ (path.concat([_vname])) + ); } - if ( - this.currEval === 'safe' || - this.currEval === true || - this.currEval === undefined - ) { - JSONPath.cache[scriptCacheKey] = new this.safeVm.Script(script); - } else if (this.currEval === 'native') { - JSONPath.cache[scriptCacheKey] = new this.vm.Script(script); - } else if ( - typeof this.currEval === 'function' && - this.currEval.prototype && - Object.hasOwn(this.currEval.prototype, 'runInNewContext') - ) { - const CurrEval = this.currEval; - JSONPath.cache[scriptCacheKey] = new CurrEval(script); - } else if (typeof this.currEval === 'function') { - JSONPath.cache[scriptCacheKey] = { - runInNewContext: (context) => this.currEval(script, context) - }; - } else { - throw new TypeError(`Unknown "eval" property "${this.currEval}"`); + + const scriptCacheKey = this.currEval + 'Script:' + code; + if (!Object.hasOwn(JSONPath.cache, scriptCacheKey)) { + let script = code + .replaceAll('@parentProperty', '_$_parentProperty') + .replaceAll('@parent', '_$_parent') + .replaceAll('@property', '_$_property') + .replaceAll('@root', '_$_root') + .replaceAll(/@([.\s)[])/gu, '_$_v$1'); + if (containsPath) { + script = script.replaceAll('@path', '_$_path'); + } + const evalType = /** @type {string|boolean|undefined} */ ( + this.currEval + ); + if (['safe', true, undefined].includes(evalType)) { + const {cache} = JSONPath; + // eslint-disable-next-line @stylistic/max-len -- Long + /* eslint-disable unicorn/no-undeclared-class-members -- Prototype members */ + cache[scriptCacheKey] = new ( + /** + * @type {JSONPathClass & { + * safeVm: SafeScriptType, + * vm: ScriptType + * }} + */ (/** @type {unknown} */ (this)) + ).safeVm.Script(script); + // eslint-disable-next-line @stylistic/max-len -- Long + /* eslint-enable unicorn/no-undeclared-class-members -- End prototype member scope */ + } else if (this.currEval === 'native') { + const {cache} = JSONPath; + // eslint-disable-next-line @stylistic/max-len -- Long + /* eslint-disable unicorn/no-undeclared-class-members -- Prototype members */ + cache[scriptCacheKey] = new ( + /** + * @type {JSONPathClass & { + * safeVm: SafeScriptType, + * vm: ScriptType + * }} + */ (/** @type {unknown} */ (this)) + ).vm.Script(script); + // eslint-disable-next-line @stylistic/max-len -- Long + /* eslint-enable unicorn/no-undeclared-class-members -- End prototype member scope */ + } else if ( + typeof this.currEval === 'function' && + this.currEval.prototype && + Object.hasOwn(this.currEval.prototype, 'runInNewContext') + ) { + const CurrEval = this.currEval; + const {cache} = JSONPath; + // eslint-disable-next-line @stylistic/max-len -- Long + // @ts-expect-error - Type checked above to have proper constructor + cache[scriptCacheKey] = new CurrEval(script); + } else if (typeof this.currEval === 'function') { + const {cache} = JSONPath; + // Type narrowing: at this point currEval is a function + // but not a constructor + const evalFunc = /** @type {EvalCallback} */ (this.currEval); + cache[scriptCacheKey] = { + runInNewContext: ( + /** @type {ContextItem} */ context + ) => evalFunc(script, context) + }; + } else { + throw new TypeError( + `Unknown "eval" property "${this.currEval}"` + ); + } } - } - try { - return JSONPath.cache[scriptCacheKey].runInNewContext(this.currSandbox); - } catch (e) { - if (this.ignoreEvalErrors) { - return false; + try { + const {cache} = JSONPath; + + /** + * @typedef {{ + * runInNewContext: ( + * ctx: SandboxType|undefined + * ) => EvaluatedResult + * }} RunInNewContext + */ + + return /** @type {RunInNewContext} */ ( + cache[scriptCacheKey] + ).runInNewContext( + this.currSandbox + ); + } catch (e) { + if (this.ignoreEvalErrors) { + return false; + } + const error = /** @type {Error} */ (e); + throw new Error('jsonPath: ' + error.message + ': ' + code, { + cause: e + }); } - throw new Error('jsonPath: ' + e.message + ': ' + code); } +} + +/** @type {{safeVm: SafeScriptType}} */ +(/** @type {unknown} */ (JSONPathClass.prototype)).safeVm = { + Script: SafeScript }; +JSONPath.prototype = JSONPathClass.prototype; + // PUBLIC CLASS PROPERTIES AND METHODS // Could store the cache object itself + +/** @type {Record} */ JSONPath.cache = {}; /** @@ -708,7 +1121,7 @@ JSONPath.toPathString = function (pathArr) { }; /** - * @param {string} pointer JSON Path + * @param {string[]} pointer JSON Path array * @returns {string} JSON Pointer */ JSONPath.toPointer = function (pointer) { @@ -730,9 +1143,10 @@ JSONPath.toPointer = function (pointer) { */ JSONPath.toPathArray = function (expr) { const {cache} = JSONPath; - if (cache[expr]) { - return cache[expr].concat(); + if (Object.hasOwn(cache, expr)) { + return /** @type {string[]} */ (cache[expr]).concat(); } + /** @type {string[]} */ const subx = []; const normalized = expr // Properties @@ -743,7 +1157,11 @@ JSONPath.toPathArray = function (expr) { // Parenthetical evaluations (filtering and otherwise), directly // within brackets or single quotes .replaceAll(/[['](\??\(.*?\))[\]'](?!.\])/gu, function ($0, $1) { - return '[#' + (subx.push($1) - 1) + ']'; + return '[#' + + // eslint-disable-next-line @stylistic/max-len -- Long + // eslint-disable-next-line unicorn/no-return-array-push -- Optimization + (subx.push($1) - 1) + + ']'; }) // Escape periods and tildes within properties .replaceAll(/\[['"]([^'\]]*)['"]\]/gu, function ($0, prop) { @@ -755,6 +1173,7 @@ JSONPath.toPathArray = function (expr) { // Properties operator .replaceAll('~', ';~;') // Split by property boundaries + .replaceAll(/['"]?\.['"]?(?![^[]*\])|\[['"]?/gu, ';') // Reinsert periods within properties .replaceAll('%@%', '.') @@ -771,14 +1190,10 @@ JSONPath.toPathArray = function (expr) { const exprList = normalized.split(';').map(function (exp) { const match = exp.match(/#(\d+)/u); - return !match || !match[1] ? exp : subx[match[1]]; + return !match || !match[1] ? exp : subx[Number(match[1])]; }); cache[expr] = exprList; - return cache[expr].concat(); -}; - -JSONPath.prototype.safeVm = { - Script: SafeScript + return /** @type {string[]} */ (cache[expr]).concat(); }; -export {JSONPath}; +export {JSONPath, JSONPathClass}; diff --git a/test-helpers/checkVM.js b/test-helpers/checkVM.js index 361bad31..49951f17 100644 --- a/test-helpers/checkVM.js +++ b/test-helpers/checkVM.js @@ -1,14 +1,18 @@ /** -* @callback BeforeChecker -* @returns {void} -*/ + * @callback BeforeChecker + * @returns {void} + */ /** -* @callback VMTestIterator -* @param {"Node vm"|"JSONPath vm"} vmType -* @param {BeforeChecker} beforeChecker -* @returns {void} -*/ + * @typedef {"Node vm"|"JSONPath vm"} VmType + */ + +/** + * @callback VMTestIterator + * @param {VmType} vmType + * @param {BeforeChecker} beforeChecker + * @returns {void} + */ /** * @param {VMTestIterator} cb @@ -22,18 +26,23 @@ function checkBuiltInVMAndNodeVM (cb) { }); return; } - [ + /** @type {VmType[]} */ + ([ 'Node vm', 'JSONPath vm' - ].forEach((vmType) => { + ]).forEach((vmType) => { const checkingBrowserVM = vmType === 'JSONPath vm'; cb( vmType, checkingBrowserVM ? () => { + // eslint-disable-next-line @stylistic/max-len -- Long + // eslint-disable-next-line unicorn/no-global-object-property-assignment -- Test env globalThis.jsonpath = globalThis.jsonpathBrowser; } : () => { + // eslint-disable-next-line @stylistic/max-len -- Long + // eslint-disable-next-line unicorn/no-global-object-property-assignment -- Test env globalThis.jsonpath = globalThis.jsonpathNodeVM; } ); diff --git a/test-helpers/globals.d.ts b/test-helpers/globals.d.ts new file mode 100644 index 00000000..3e215e14 --- /dev/null +++ b/test-helpers/globals.d.ts @@ -0,0 +1,11 @@ +declare global { + var assert: typeof import('chai').assert; + var expect: typeof import('chai').expect; + var jsonpath: typeof import('../src/jsonpath.js').JSONPath; + var jsonpathNodeVM: typeof import('../src/jsonpath-node.js').JSONPath; + var jsonpathBrowser: typeof import('../src/jsonpath-browser.js').JSONPath; + var JSONPath: typeof import('../src/jsonpath.js').JSONPath; + var JSONPathClass: typeof import('../src/jsonpath.js').JSONPathClass; +} + +export {}; diff --git a/test-helpers/node-env.js b/test-helpers/node-env.js index d7ac504e..99bfde1c 100644 --- a/test-helpers/node-env.js +++ b/test-helpers/node-env.js @@ -1,12 +1,16 @@ import {assert, expect} from 'chai'; -import {JSONPath} from '../src/jsonpath-node.js'; +import {JSONPath, JSONPathClass} from '../src/jsonpath-node.js'; import { JSONPath as JSONPathBrowser } from '../src/jsonpath-browser.js'; +/* eslint-disable unicorn/no-global-object-property-assignment -- Test env */ globalThis.assert = assert; globalThis.expect = expect; globalThis.jsonpathNodeVM = JSONPath; globalThis.jsonpath = JSONPath; +globalThis.JSONPath = JSONPath; globalThis.jsonpathBrowser = JSONPathBrowser; +globalThis.JSONPathClass = JSONPathClass; +/* eslint-enable unicorn/no-global-object-property-assignment -- Test env */ diff --git a/test/test.all.js b/test/test.all.js index 75257adb..b2faf5eb 100644 --- a/test/test.all.js +++ b/test/test.all.js @@ -33,7 +33,14 @@ checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { }); it('select sibling via parent, return both path and value', () => { - const expected = [{path: "$['children'][2]['children'][1]", value: {name: 'child3_2'}, parent: json.children[2].children, parentProperty: 1, pointer: '/children/2/children/1', hasArrExpr: true}]; + const expected = [{ + path: "$['children'][2]['children'][1]", + value: {name: 'child3_2'}, + parent: json.children[2].children, + parentProperty: 1, + pointer: '/children/2/children/1', + hasArrExpr: true + }]; const result = jsonpath({json, path: '$..[?(@.name && @.name.match(/3_1$/))]^[?(@.name.match(/_2$/))]', resultType: 'all'}); assert.deepEqual(result, expected); }); diff --git a/test/test.api.js b/test/test.api.js index 8913772e..1c5a4ac7 100644 --- a/test/test.api.js +++ b/test/test.api.js @@ -1,5 +1,9 @@ +/** + * @import {JSONPathClass} from '../src/jsonpath.js'; + */ + describe('JSONPath - API', function () { - // tests based on examples at http://goessner.net/articles/jsonpath/ + // tests based on examples at https://goessner.net/articles/jsonpath/ const json = { "store": { "book": [{ @@ -89,8 +93,233 @@ describe('JSONPath - API', function () { callback () { /* */ }, parent: null, parentProperty: null, - otherTypeCallback () { /* */ } + otherTypeCallback () { + return true; + } + }); + assert.deepEqual(result, expected); + }); + + it('should handle _handleCallback with undefined callback', () => { + const jp = jsonpath({ + autostart: false }); + // Test the defensive check in _handleCallback when callback is undefined + const retObj = { + path: "$['store']['book'][0]", + value: json.store.book[0], + parent: json.store.book, + parentProperty: 0 + }; + // This should not throw and should return early + assert.doesNotThrow(() => { + jp._handleCallback(retObj, undefined, 'value'); + }); + }); + + it('should handle _getPreferredOutput with string path and all resultType', () => { + const jp = jsonpath({ + autostart: false + }); + jp.currResultType = 'all'; + const retObj = { + path: "$['store']['book'][0]", + value: json.store.book[0], + parent: json.store.book, + parentProperty: 0 + }; + + const result = /** @type {{path: string, pointer: string}} */ ( + jp._getPreferredOutput(retObj) + ); + assert.deepEqual(result.path, "$['store']['book'][0]"); + assert.deepEqual(result.pointer, '/store/book/0'); + }); + + it('should return string path directly in _getPreferredOutput for path resultType', () => { + const jp = jsonpath({ + autostart: false + }); + jp.currResultType = 'path'; + const retObj = { + path: "$['store']['book'][0]", + value: json.store.book[0], + parent: json.store.book, + parentProperty: 0 + }; + + const result = /** @type {string} */ (jp._getPreferredOutput(retObj)); + assert.deepEqual(result, "$['store']['book'][0]"); + }); + + it('should convert string path to array for pointer resultType', () => { + const jp = jsonpath({ + autostart: false + }); + jp.currResultType = 'pointer'; + const retObj = { + path: "$['store']['book'][0]", + value: json.store.book[0], + parent: json.store.book, + parentProperty: 0 + }; + + const result = /** @type {string} */ (jp._getPreferredOutput(retObj)); + assert.deepEqual(result, '/store/book/0'); + }); + + it('should handle flatten: null in evaluate options', () => { + const jp = jsonpath({ + autostart: false + }); + const result = jp.evaluate({ + json, + path: '$.store.book[*].author', + flatten: undefined + }); + const books = json.store.book; + const expected = [books[0].author, books[1].author, books[2].author, books[3].author]; assert.deepEqual(result, expected); }); + + it('should preserve explicit null overrides in evaluate options', () => { + const jp = jsonpath({ + autostart: false, + parent: {sentinel: true}, + parentProperty: 'sentinel' + }); + const result = /** @type {{parent: unknown, parentProperty: unknown, value: unknown}} */ ( + jp.evaluate({ + json, + path: '$', + parent: null, + parentProperty: null, + wrap: false, + resultType: 'all' + }) + ); + assert.deepEqual(result.parent, null); + assert.deepEqual(result.parentProperty, null); + assert.deepEqual(result.value, json); + }); + + it('should handle nested filter with single result', () => { + const testJson = { + items: [ + {id: 1, nested: {value: 'a'}}, + {id: 2, nested: {value: 'b'}} + ] + }; + const result = jsonpath({ + json: testJson, + path: '$.items[?(@.nested)]' + }); + assert.deepEqual(result, [testJson.items[0], testJson.items[1]]); + }); + + it('should handle slice with single element', () => { + const testJson = {items: [1]}; + const result = jsonpath({ + json: testJson, + path: '$.items[0:1]' + }); + assert.deepEqual(result, [1]); + }); + + it('should handle simple root path returning single object', () => { + const testJson = {value: 42}; + const result = jsonpath({ + json: testJson, + path: '$', + wrap: false, + resultType: 'all' + }); + assert.deepEqual(result, { + path: '$', + value: testJson, + parent: null, + parentProperty: null, + hasArrExpr: undefined, + pointer: '' + }); + }); + + it('should handle otherTypeCallback returning null for @other()', () => { + const testJson = { + values: [1, 'text', true, null, {obj: 'value'}] + }; + + const result = jsonpath({ + json: testJson, + path: '$.values[*]@other()', + otherTypeCallback (val) { + // Return null for objects to test the ?? false fallback + if (typeof val === 'object' && val !== null) { + return null; + } + return false; + } + }); + assert.deepEqual(/** @type {unknown} */ (result), []); + }); + + it('should handle nested filter with property access', () => { + const testJson = { + items: [ + {id: 1, subs: [{val: 1}, {val: 2}]}, + {id: 2, subs: [{val: 3}]}, + {id: 3, subs: []} + ] + }; + // Nested filter: select items that have subs with val > 1 + const result = jsonpath({ + json: testJson, + path: '$.items[?(@.subs[?(@.val > 1)])]' + }); + // Items 0 and 1 both have subs with val > 1 + assert.deepEqual(result, [testJson.items[0], testJson.items[1]]); + }); + + it('should handle slice operation with multiple elements', () => { + const testJson = {items: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]}; + const result = jsonpath({ + json: testJson, + path: '$.items[2:8:2]' + }); + assert.deepEqual(result, [3, 5, 7]); + }); + + it('should handle parenthesis expression with undefined result', () => { + const testJson = {a: {x: 1}, b: {y: 2}, c: {z: undefined}}; + const result = jsonpath({ + json: testJson, + path: '$[(undefined)]' + }); + assert.deepEqual(result, []); + }); + + // Behavior change: an `undefined` eval result no longer falls through to + // the literal `"undefined"` property (which previously also threw for + // some inputs); it now matches nothing. + it('should not match the literal "undefined" key for an undefined parenthesis expression', () => { + const testJson = {undefined: 'X', a: 'A'}; + assert.deepEqual(jsonpath({ + json: testJson, + path: '$[(undefined)]' + }), []); + assert.deepEqual(jsonpath({ + json: testJson, + path: "$['undefined']" + }), ['X']); + }); + + it('should handle @path expression without predefined sandbox', () => { + const testJson = {a: 1, b: 2}; + // Don't provide sandbox, let it be created on demand + const result = jsonpath({ + json: testJson, + path: '$[?(@path == "$[\'a\']")]' + }); + assert.deepEqual(result, [1]); + }); }); diff --git a/test/test.at_and_dollar.js b/test/test.at_and_dollar.js index c69d8715..5cd6b636 100644 --- a/test/test.at_and_dollar.js +++ b/test/test.at_and_dollar.js @@ -1,4 +1,16 @@ +/** + * @type {{ + * assert: Chai.AssertStatic, + * jsonpath: (opts: any) => any + * }} + */ +const testGlobals = globalThis; +/** @type {Chai.AssertStatic} */ +const assertChai = testGlobals.assert; + +const jsonpathFn = testGlobals.jsonpath; + describe('JSONPath - At and Dollar sign', function () { const t1 = { simpleString: "simpleString", @@ -15,20 +27,20 @@ describe('JSONPath - At and Dollar sign', function () { }; it('test undefined, null', () => { - assert.strictEqual(jsonpath({json: {a: null}, path: '$.a', wrap: false}), null); - assert.strictEqual(jsonpath({json: undefined, path: 'foo'}), undefined); - assert.strictEqual(jsonpath({json: null, path: 'foo'}), undefined); - assert.strictEqual(jsonpath({json: {}, path: 'foo'})[0], undefined); - assert.strictEqual(jsonpath({json: {a: 'b'}, path: 'foo'})[0], undefined); - assert.strictEqual(jsonpath({json: {a: 'b'}, path: 'foo'})[100], undefined); + assertChai.isNull(jsonpathFn({json: {a: null}, path: '$.a', wrap: false})); + assertChai.isUndefined(jsonpathFn({json: undefined, path: 'foo'})); + assertChai.isUndefined(jsonpathFn({json: null, path: 'foo'})); + assertChai.isUndefined(jsonpathFn({json: {}, path: 'foo'})[0]); + assertChai.isUndefined(jsonpathFn({json: {a: 'b'}, path: 'foo'})[0]); + assertChai.isUndefined(jsonpathFn({json: {a: 'b'}, path: 'foo'})[100]); }); it('test $ and @', () => { - assert.strictEqual(jsonpath({json: t1, path: '`$'})[0], t1.$); - assert.strictEqual(jsonpath({json: t1, path: 'a$a'})[0], t1.a$a); - assert.strictEqual(jsonpath({json: t1, path: '`@'})[0], t1['@']); - assert.strictEqual(jsonpath({json: t1, path: '$.`$.`@'})[0], t1.$['@']); - assert.strictEqual(jsonpath({json: t1, path: String.raw`\@`})[1], undefined); + assertChai.strictEqual(jsonpathFn({json: t1, path: '`$'})[0], t1.$); + assertChai.strictEqual(jsonpathFn({json: t1, path: 'a$a'})[0], t1.a$a); + assertChai.strictEqual(jsonpathFn({json: t1, path: '`@'})[0], t1['@']); + assertChai.strictEqual(jsonpathFn({json: t1, path: '$.`$.`@'})[0], t1.$['@']); + assertChai.isUndefined(jsonpathFn({json: t1, path: String.raw`\@`})[1]); }); it('@ as false', () => { @@ -38,8 +50,8 @@ describe('JSONPath - At and Dollar sign', function () { } }; const expected = [false]; - const result = jsonpath({json, path: "$..*[?(@ === false)]", wrap: false}); - assert.deepEqual(result, expected); + const result = jsonpathFn({json, path: "$..*[?(@ === false)]", wrap: false}); + assertChai.deepEqual(result, expected); }); it('@ as 0', function () { @@ -49,7 +61,7 @@ describe('JSONPath - At and Dollar sign', function () { } }; const expected = [0]; - const result = jsonpath({json, path: "$.a[?(@property === 'b' && @ < 1)]", wrap: false}); - assert.deepEqual(result, expected); + const result = jsonpathFn({json, path: "$.a[?(@property === 'b' && @ < 1)]", wrap: false}); + assertChai.deepEqual(result, expected); }); }); diff --git a/test/test.callback.js b/test/test.callback.js index 79d034d6..4f8dce0d 100644 --- a/test/test.callback.js +++ b/test/test.callback.js @@ -37,12 +37,16 @@ describe('JSONPath - Callback', function () { it('Callback', () => { const expected = ['value', json.store.bicycle, {path: "$['store']['bicycle']", value: json.store.bicycle, parent: json.store, parentProperty: 'bicycle', hasArrExpr: undefined}]; + + /** + * @type {undefined|(string|object)[]} + */ let result; /** * - * @param {PlainObject} data + * @param {object} data * @param {string} type - * @param {PlainObject} fullData + * @param {object} fullData * @returns {void} */ function callback (data, type, fullData) { @@ -75,12 +79,16 @@ describe('JSONPath - Callback', function () { hasArrExpr: undefined } ]; + + /** + * @type {undefined|(string|object)[]} + */ let result; /** * - * @param {PlainObject} data + * @param {object} data * @param {string} type - * @param {PlainObject} fullData + * @param {object} fullData * @returns {void} */ function callback (data, type, fullData) { @@ -90,7 +98,7 @@ describe('JSONPath - Callback', function () { result.push(type, data, fullData); } jsonpath({json, path: '$.store.bicycle', resultType: 'all', wrap: false, callback}); - assert.deepEqual(result[0], expected[0]); + assert.deepEqual(result?.[0], expected[0]); assert.deepEqual(result, expected); }); @@ -143,4 +151,59 @@ describe('JSONPath - Callback', function () { const result = givenPerson; assert.deepEqual(result, expected); }); + + // The callback stringifies `retObj.path` in place, so the returned + // results are built from an already-stringified path. + it('returns unmangled paths with `resultType: "path"` and a callback', () => { + /** @type {unknown[]} */ + const seen = []; + const result = jsonpath({ + json, + path: '$.store.book[*].author', + resultType: 'path', + callback (preferredOutput) { + seen.push(preferredOutput); + } + }); + const expected = [ + "$['store']['book'][0]['author']", + "$['store']['book'][1]['author']", + "$['store']['book'][2]['author']", + "$['store']['book'][3]['author']" + ]; + assert.deepEqual(result, expected); + assert.deepEqual(seen, expected); + }); + + it('returns unmangled pointers with `resultType: "pointer"` and a callback', () => { + /** @type {unknown[]} */ + const seen = []; + const result = jsonpath({ + json, + path: '$.store.book[*].author', + resultType: 'pointer', + callback (preferredOutput) { + seen.push(preferredOutput); + } + }); + const expected = [ + '/store/book/0/author', + '/store/book/1/author', + '/store/book/2/author', + '/store/book/3/author' + ]; + assert.deepEqual(result, expected); + assert.deepEqual(seen, expected); + }); + + it('returns an unmangled path with `resultType: "path"`, `wrap: false`, and a callback', () => { + const result = jsonpath({ + json, + path: '$.store.bicycle.color', + resultType: 'path', + wrap: false, + callback () { /* */ } + }); + assert.deepEqual(result, "$['store']['bicycle']['color']"); + }); }); diff --git a/test/test.cli.js b/test/test.cli.js index 3bbb22cb..3ee8e77c 100644 --- a/test/test.cli.js +++ b/test/test.cli.js @@ -20,6 +20,9 @@ describe("JSONPath - cli", () => { } expect(out).to.have.property("code", 1); expect(out).to.have.property("stderr"); - expect(out.stderr).to.include(`usage: ${binPath} \n\n`); + expect( + /** @type {{stderr: string}} */ + (out).stderr + ).to.include(`usage: ${binPath} \n\n`); }); }); diff --git a/test/test.errors.js b/test/test.errors.js index 4bc27f07..1c8b5aa5 100644 --- a/test/test.errors.js +++ b/test/test.errors.js @@ -25,9 +25,11 @@ checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { it('should throw with a bad result type', () => { expect(() => { + // @ts-ignore -- Deliberately invalid result type. jsonpath({ json: {children: [5]}, path: '$..children', + // @ts-ignore -- Deliberately invalid result type. resultType: 'badType' }); }).to.throw(TypeError, 'Unknown result type'); @@ -90,5 +92,18 @@ checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { }); }).to.throw(Error, 'jsonPath: Invalid left-hand side in assignment: 2 = 8'); }); + + it('should throw when `new JSONPath` would unwrap a scalar result', () => { + expect(() => { + // @ts-expect-error - Confirm constructor misuse is rejected + // eslint-disable-next-line no-new -- Testing + new /** @type {new (opts: object) => object} */ ( + JSONPath + )({json: {a: 1}, path: '$.a', wrap: false}); + }).to.throw( + Error, + 'JSONPath should not be called with "new" (it prevents return of (unwrapped) scalar values)' + ); + }); }); }); diff --git a/test/test.eval.js b/test/test.eval.js index 4fd1fb27..0c2046b1 100644 --- a/test/test.eval.js +++ b/test/test.eval.js @@ -1,5 +1,9 @@ import {checkBuiltInVMAndNodeVM} from '../test-helpers/checkVM.js'; +/** + * @import {SandboxCallback, EvalValue} from '../src/jsonpath.js'; + */ + checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { describe(`JSONPath - Eval (${vmType} - native)`, function () { before(setBuiltInState); @@ -28,6 +32,7 @@ checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { it('fail if eval is unsupported', () => { expect(() => { + // @ts-expect-error Bad argument jsonpath({json, path: "$..[?(@.category === category)]", eval: 'wrong-eval'}); }).to.throw( TypeError, @@ -124,11 +129,11 @@ checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { const expected = [json.store.book]; const result = jsonpath({ json, - sandbox: { + sandbox: /** @type {{filter: SandboxCallback}} */ ({ filter (arg) { return arg.category === 'reference'; } - }, + }), path: "$..[?(filter(@))]", wrap: false, eval: 'native' }); @@ -138,6 +143,10 @@ checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { describe('cyclic object', () => { // This is not an eval test, but we put it here for parity with item below it('cyclic object without a sandbox', () => { + /** + * @typedef {{a: {b: {c: number}, x?: CircularObj}}} CircularObj + */ + /** @type {CircularObj} */ const circular = {a: {b: {c: 5}}}; circular.a.x = circular; const expected = circular.a.b; @@ -150,6 +159,12 @@ checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { assert.deepEqual(result, expected); }); it('cyclic object in a sandbox', () => { + /** + * @typedef {{ + * category: string, recurse?: CircularObjWithRecurse + * }} CircularObjWithRecurse + */ + /** @type {CircularObjWithRecurse} */ const circular = {category: 'fiction'}; circular.recurse = circular; const expected = json.store.books; @@ -168,6 +183,13 @@ checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { }); describe(`JSONPath - Eval (${vmType} - custom)`, function () { before(setBuiltInState); + it('preserves the prototype compatibility surface', () => { + assert.strictEqual(JSONPath.prototype.evaluate, JSONPathClass.prototype.evaluate); + // @ts-ignore -- Prototype compatibility surface. + assert.strictEqual(JSONPath.prototype.safeVm, JSONPathClass.prototype.safeVm); + // @ts-ignore -- Prototype compatibility surface. + assert.strictEqual(JSONPath.prototype.vm, JSONPathClass.prototype.vm); + }); const json = { "store": { "book": { @@ -191,8 +213,10 @@ checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { } }; it('eval as callback function', () => { + /** @type {EvalValue} */ const evalCb = (code, ctxt) => { - const script = new jsonpath.prototype.safeVm.Script(code); + // @ts-ignore -- Prototype compatibility surface. + const script = new JSONPathClass.prototype.safeVm.Script(code); return script.runInNewContext(ctxt); }; const expected = [json.store.book]; @@ -208,7 +232,8 @@ checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { const result = jsonpath({ json, path: '$..[?(@.category === "reference")]', - eval: jsonpath.prototype.safeVm.Script + // @ts-ignore -- Prototype compatibility surface. + eval: JSONPathClass.prototype.safeVm.Script }); assert.deepEqual(result, expected); }); @@ -218,7 +243,8 @@ checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { const result = jsonpath({ json, path: '$..[?(@.category.toLowerCase() === "reference")]', - eval: jsonpath.prototype.safeVm.Script, + // @ts-ignore -- Prototype compatibility surface. + eval: JSONPathClass.prototype.safeVm.Script, ignoreEvalErrors: true }); assert.deepEqual(result, expected); diff --git a/test/test.examples.js b/test/test.examples.js index 0d06190a..22dc6cf7 100644 --- a/test/test.examples.js +++ b/test/test.examples.js @@ -3,7 +3,7 @@ import {checkBuiltInVMAndNodeVM} from '../test-helpers/checkVM.js'; checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { describe(`JSONPath - Examples (${vmType})`, function () { before(setBuiltInState); - // tests based on examples at http://goessner.net/articles/jsonpath/ + // tests based on examples at https://goessner.net/articles/jsonpath/ const json = { "store": { "book": [{ @@ -143,17 +143,17 @@ checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { }); it('all properties of a JSON structure (beneath the root)', () => { - const expected = [ + const expected = /** @type {any[]} */ ([ json.store, json.store.book, json.store.bicycle - ]; + ]); json.store.book.forEach((book) => { expected.push(book); }); json.store.book.forEach(function (book) { - Object.keys(book).forEach(function (p) { - expected.push(book[p]); + Object.values(book).forEach(function (v) { + expected.push(v); }); }); expected.push( @@ -166,11 +166,11 @@ checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { }); it('all parent components of a JSON structure', () => { - const expected = [ + const expected = /** @type {any[]} */ ([ json, json.store, json.store.book - ]; + ]); json.store.book.forEach((book) => { expected.push(book); }); @@ -207,34 +207,46 @@ checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { assert.deepEqual(result, expected); }); it('Custom property: @property', () => { - let expected = json.store.book.reduce(function (arr, book) { + const expected = json.store.book.reduce(function (arr, book) { arr.push(book.author, book.title); if (book.isbn) { arr.push(book.isbn); } arr.push(book.price); return arr; - }, []); + }, /** @type {(string|number)[]} */ ([])); let result = jsonpath({json, path: '$..book.*[?(@property !== "category")]'}); assert.deepEqual(result, expected); - expected = json.store.book.slice(1); + const expected2 = json.store.book.slice(1); result = jsonpath({json, path: '$..book[?(@property !== 0)]'}); - assert.deepEqual(result, expected); + assert.deepEqual(result, expected2); }); it('Custom property: @parentProperty', () => { - let expected = [json.store.bicycle.color, json.store.bicycle.price]; + const expected = [json.store.bicycle.color, json.store.bicycle.price]; let result = jsonpath({json, path: '$.store.*[?(@parentProperty !== "book")]'}); assert.deepEqual(result, expected); - expected = json.store.book.slice(1).reduce(function (rslt, book) { - return [...rslt, ...Object.keys(book).reduce((reslt, prop) => { - reslt.push(book[prop]); - return reslt; - }, [])]; - }, []); + const expected2 = json.store.book.slice(1).reduce( + (rslt, book) => { + return [...rslt, ...Object.values(book).reduce((reslt, v) => { + reslt.push(v); + return reslt; + }, [])]; + }, + /** + * @type {{ + * category: string; + * author: string; + * title: string; + * isbn: string; + * price: number; + * }[]} + */ + ([]) + ); result = jsonpath({json, path: '$..book.*[?(@parentProperty !== 0)]'}); - assert.deepEqual(result, expected); + assert.deepEqual(result, expected2); }); it('Custom property: @root', () => { diff --git a/test/test.intermixed.arr.js b/test/test.intermixed.arr.js index 75d908e9..0700e219 100644 --- a/test/test.intermixed.arr.js +++ b/test/test.intermixed.arr.js @@ -1,6 +1,6 @@ describe('JSONPath - Intermixed Array', function () { - // tests based on examples at http://goessner.net/articles/jsonpath/ + // tests based on examples at https://goessner.net/articles/jsonpath/ const json = { "store": { "book": [ @@ -41,7 +41,7 @@ describe('JSONPath - Intermixed Array', function () { it('all sub properties, entire tree', () => { const books = json.store.book; let expected = [books[1].price, books[2].price, books[3].price, json.store.bicycle.price]; - expected = [...books[0].price, ...expected]; + expected = [...(/** @type {number[]} */ (books[0].price)), ...expected]; const result = jsonpath({json, path: '$.store..price', flatten: true}); assert.deepEqual(result, expected); }); diff --git a/test/test.path_expressions.js b/test/test.path_expressions.js index d42b5e73..f25b86f0 100644 --- a/test/test.path_expressions.js +++ b/test/test.path_expressions.js @@ -1,6 +1,6 @@ describe('JSONPath - Path expressions', function () { - // tests based on examples at http://goessner.net/articles/JsonPath/ + // tests based on examples at https://goessner.net/articles/JsonPath/ const json = {"store": { "book": [ diff --git a/test/test.performance.js b/test/test.performance.js index d241f42d..c19ef933 100644 --- a/test/test.performance.js +++ b/test/test.performance.js @@ -6,27 +6,31 @@ describe('JSONPath - Performance', function () { itemCount = 150, groupCount = 245; + /** + * @typedef {{a: {b: 0, c: 0}, s: {b: {c: number[]}}}[]} Items + */ + const json = { - results: [] + results: + /** @type {{groups: {items: Items, a: string}[], v?: {v: number[]}}[]} */ ( + [] + ) }; - let i, j; - - const bigArray = []; - for (i = 0; i < arraySize; i++) { + const bigArray = /** @type {number[]} */ ([]); + for (let i = 0; i < arraySize; i++) { bigArray[i] = 1; } - const items = []; - for (i = 0; i < itemCount; i++) { - // eslint-disable-next-line unicorn/prefer-structured-clone -- Want JSON - items[i] = JSON.parse(JSON.stringify({a: {b: 0, c: 0}, s: {b: {c: bigArray}}})); + const items = /** @type {Items} */ ([]); + for (let i = 0; i < itemCount; i++) { + items[i] = {a: {b: 0, c: 0}, s: {b: {c: bigArray}}}; } - for (i = 0; i < resultCount; i++) { + for (let i = 0; i < resultCount; i++) { json.results[i] = {groups: [], v: {v: [1, 2, 3, 4, 5, 6, 7, 8]}}; json.results[i].groups = []; - for (j = 0; j < groupCount; j++) { + for (let j = 0; j < groupCount; j++) { json.results[i].groups[j] = {items, a: "121212"}; } } diff --git a/test/test.safe-eval.js b/test/test.safe-eval.js index 6b079a3b..e18f618f 100644 --- a/test/test.safe-eval.js +++ b/test/test.safe-eval.js @@ -1,5 +1,9 @@ import {checkBuiltInVMAndNodeVM} from '../test-helpers/checkVM.js'; +/** + * @import {SandboxCallback} from '../src/jsonpath.js'; + */ + checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { describe(`JSONPath - Eval (${vmType} - safe)`, function () { before(setBuiltInState); @@ -110,11 +114,11 @@ checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { const expected = [json.store.book]; const result = jsonpath({ json, - sandbox: { + sandbox: /** @type {{filter: SandboxCallback}} */ ({ filter (arg) { return arg.category === 'reference'; } - }, + }), path: "$..[?(filter(@))]", wrap: false, eval: 'safe' }); @@ -124,6 +128,11 @@ checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { describe('cyclic object', () => { // This is not an eval test, but we put it here for parity with item below it('cyclic object without a sandbox', () => { + /** + * @typedef {{a: {b: {c: number}, x?: CircularObj}}} CircularObj + */ + + /** @type {CircularObj} */ const circular = {a: {b: {c: 5}}}; circular.a.x = circular; const expected = circular.a.b; @@ -136,6 +145,12 @@ checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { assert.deepEqual(result, expected); }); it('cyclic object in a sandbox', () => { + /** + * @typedef {{ + * category: string, recurse?: CircularObjWithRecurse + * }} CircularObjWithRecurse + */ + /** @type {CircularObjWithRecurse} */ const circular = {category: 'fiction'}; circular.recurse = circular; const expected = json.store.books; @@ -211,7 +226,7 @@ checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { }] } }; - const opPathExpecteds = [ + const opPathExpecteds = /** @type {[string, string, unknown[]][]} */ ([ ['|| , ===', '$..[?(@property === "book" || @property === "books")]', [json.store.book, json.store.books]], ['| , &&', '$..[?(@ && (@.shelf === (1 | 2)))]', [json.store.books[1]]], ['^', '$..[?(@ && (@.shelf === (1 ^ 2)))]', [json.store.books[1]]], @@ -233,7 +248,7 @@ checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { ['+ (unary)', '$..[?(@ && +@.meta === 12)]', [json.store.book]], ['typeof', '$..[?(@ && typeof @.meta === "number")]', [json.store.books[0]]], ['void', '$..books[?(@.meta === void 0)]', [json.store.books[1]]] - ]; + ]); for (const [operator, path, expected] of opPathExpecteds) { it(`${operator} operator`, () => { const result = jsonpath({ @@ -280,6 +295,7 @@ checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { path: pathDoS }); + // @ts-expect-error Won't get here result.toString(); // DoS }, 'constructor is not defined'); }); @@ -302,6 +318,8 @@ checkBuiltInVMAndNodeVM(function (vmType, setBuiltInState) { }); it("10.4.1 RCE", () => { assert.throws(() => { + // @ts-expect-error VM testing + // eslint-disable-next-line unicorn/no-global-object-property-assignment -- Exploit test globalThis.TEST_10_4_1_RCE = 'not exploited'; const path = "$..[?(@.constructor[( @.getPrototypeOf(@).constructor('globalThis.TEST_10_4_1_RCE=\"RCE\";0')() )])]"; diff --git a/test/test.toPath.js b/test/test.toPath.js index 6541f3dd..000993f9 100644 --- a/test/test.toPath.js +++ b/test/test.toPath.js @@ -31,7 +31,7 @@ describe('JSONPath - toPath*', function () { const json = {foo: {bar: 'baz'}}; const pathArr = jsonpath.toPathArray(originalPath); - assert.strictEqual(pathArr.length, 3); + assert.lengthOf(pathArr, 3); // Shouldn't manipulate pathArr values jsonpath({ @@ -41,7 +41,7 @@ describe('JSONPath - toPath*', function () { resultType: 'value' }); - assert.strictEqual(pathArr.length, 3); + assert.lengthOf(pathArr, 3); const path = jsonpath.toPathString(pathArr); assert.strictEqual(path, originalPath); diff --git a/test/test.type-operators.js b/test/test.type-operators.js index 51a08e78..b77fc7a8 100644 --- a/test/test.type-operators.js +++ b/test/test.type-operators.js @@ -1,6 +1,8 @@ - +/** + * @import {OtherTypeCallback} from '../src/jsonpath.js'; + */ describe('JSONPath - Type Operators', function () { - // tests based on examples at http://goessner.net/articles/jsonpath/ + // tests based on examples at https://goessner.net/articles/jsonpath/ const json = {"store": { "book": [ @@ -68,16 +70,12 @@ describe('JSONPath - Type Operators', function () { it('@other()', () => { const expected = [12.99, 8.99, 22.99]; - /** - * @typedef {any} Value - */ /** * - * @param {Value} val - * @returns {boolean} + * @type {OtherTypeCallback} */ function endsIn99 (val /* , path, parent, parentPropName */) { - return Boolean((/\.99/u).test(val.toString())); + return (/\.99/u).test(String(val)); } const result = jsonpath({json, path: '$.store.book..*@other()', flatten: true, otherTypeCallback: endsIn99}); assert.deepEqual(result, expected); @@ -136,9 +134,9 @@ describe('JSONPath - Type Operators', function () { nested: { a: true, b: null, - c: [ + c: /** @type {[number, unknown[]]} */ ([ 7, [false, 9] - ] + ]) } }; const expected = [jsonMixed.nested.a, jsonMixed.nested.c[1][0]]; @@ -153,9 +151,9 @@ describe('JSONPath - Type Operators', function () { nested: { a: 50.7, b: null, - c: [ + c: /** @type {[number, unknown[]]} */ ([ 42, [false, 73] - ] + ]) } }; const expected = [jsonMixed.nested.c[0], jsonMixed.nested.c[1][1]]; @@ -169,10 +167,10 @@ describe('JSONPath - Type Operators', function () { const jsonMixed = { nested: { a: 50.7, - b: Number.NEGATIVE_INFINITY, - c: [ - 42, [Number.POSITIVE_INFINITY, 73, Number.NaN] - ] + b: -Infinity, + c: /** @type {[number, unknown[]]} */ ([ + 42, [Infinity, 73, NaN] + ]) } }; const expected = [ @@ -200,4 +198,35 @@ describe('JSONPath - Type Operators', function () { }); assert.deepEqual(result, expected); }); + + it('unwraps a lone type-operator result with `wrap: false`', () => { + const result = jsonpath({ + json: {a: 1}, path: '$..*[@number()]', wrap: false + }); + assert.deepEqual(result, 1); + }); + + it('still wraps multiple type-operator results with `wrap: false`', () => { + const result = jsonpath({ + json: {a: 1, b: 2}, path: '$..*[@number()]', wrap: false + }); + assert.deepEqual(result, [1, 2]); + }); + + it('adds no `hasArrExpr` key to `resultType: "all"` results', () => { + const jsonSimple = {a: 1}; + const result = /** @type {object[]} */ (jsonpath({ + json: jsonSimple, path: '$..*[@number()]', resultType: 'all' + })); + assert.deepEqual(Object.keys(result[0]), [ + 'path', 'value', 'parent', 'parentProperty', 'pointer' + ]); + assert.deepEqual(result, [{ + path: "$['a']", + value: 1, + parent: jsonSimple, + parentProperty: 'a', + pointer: '/a' + }]); + }); }); diff --git a/tsconfig-prod.json b/tsconfig-prod.json new file mode 100644 index 00000000..5bd19d6b --- /dev/null +++ b/tsconfig-prod.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "emitDeclarationOnly": true, + "noEmit": false, + "rootDir": "src" + }, + "include": [ + "src" + ] +} diff --git a/tsconfig.json b/tsconfig.json index 1c9167a1..9bc99b89 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,9 +1,20 @@ { "compilerOptions": { - "lib": ["es2015"] + "lib": ["es2024"], + "types": ["node", "mocha"], + "target": "es2017", + "module": "nodenext", + "allowJs": true, + "checkJs": true, + "declaration": true, + "noEmit": true, + "outDir": "dist", + "skipLibCheck": true }, "include": [ - "src" + "src", "bin", "test-helpers", "test", + "eslint.config.js" + // "rollup.config.js" ], "exclude": ["node_modules"] }