diff --git a/package-lock.json b/package-lock.json index 7f2217a..1a65273 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "2.10.2", "license": "Apache-2.0", "dependencies": { - "apg-lite": "^1.0.4" + "apg-lite": "^1.0.5" }, "devDependencies": { "@babel/cli": "=7.28.6", diff --git a/package.json b/package.json index d031f3c..e6fe158 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "SECURITY.md" ], "dependencies": { - "apg-lite": "^1.0.4" + "apg-lite": "^1.0.5" }, "devDependencies": { "@babel/cli": "=7.28.6", diff --git a/src/evaluate/index.js b/src/evaluate/index.js index 5b2dacb..4f9a1d6 100644 --- a/src/evaluate/index.js +++ b/src/evaluate/index.js @@ -3,6 +3,7 @@ import testArrayDash from '../test/array-dash.js'; import testArrayIndex from '../test/array-index.js'; import TraceBuilder from './trace/TraceBuilder.js'; import JSONRealm from './realms/json/index.js'; +import JSONPointerParseError from '../errors/JSONPointerParseError.js'; import JSONPointerEvaluateError from '../errors/JSONPointerEvaluateError.js'; import JSONPointerTypeError from '../errors/JSONPointerTypeError.js'; import JSONPointerIndexError from '../errors/JSONPointerIndexError.js'; @@ -19,6 +20,13 @@ const evaluate = ( trace: parseTrace, } = parse(jsonPointer, { trace: !!trace }); + if (!parseResult.success) { + let message = `Invalid JSON Pointer: "${jsonPointer}". Syntax error at position ${parseResult.maxMatched}`; + message += parseTrace ? `, expected ${parseTrace.inferExpectations()}` : ''; + + throw new JSONPointerParseError(message, { jsonPointer }); + } + const tracer = typeof trace === 'object' && trace !== null ? new TraceBuilder(trace, { @@ -34,17 +42,6 @@ const evaluate = ( try { let output; - if (!parseResult.success) { - let message = `Invalid JSON Pointer: "${jsonPointer}". Syntax error at position ${parseResult.maxMatched}`; - message += parseTrace ? `, expected ${parseTrace.inferExpectations()}` : ''; - - throw new JSONPointerEvaluateError(message, { - jsonPointer, - currentValue: value, - realm: realm.name, - }); - } - return referenceTokens.reduce((current, referenceToken, referenceTokenPosition) => { if (realm.isArray(current)) { if (testArrayDash(referenceToken)) { diff --git a/test/evaluate/index.js b/test/evaluate/index.js index 6dceb16..e24f5a7 100644 --- a/test/evaluate/index.js +++ b/test/evaluate/index.js @@ -5,6 +5,7 @@ import { JSONPointerIndexError, JSONPointerTypeError, JSONPointerKeyError, + JSONPointerParseError, JSONPointerEvaluateError, URIFragmentIdentifier, } from '../../src/index.js'; @@ -85,8 +86,8 @@ describe('evaluate', function () { }); context('invalid JSON Pointers (should throw errors)', function () { - specify('should throw JSONPointerEvaluateError for invalid JSON Pointer', function () { - assert.throws(() => evaluate(data, 'invalid-pointer'), JSONPointerEvaluateError); + specify('should throw JSONPointerParseError for invalid JSON Pointer', function () { + assert.throws(() => evaluate(data, 'invalid-pointer'), JSONPointerParseError); }); specify( diff --git a/test/evaluate/realms/apidom/evaluate.js b/test/evaluate/realms/apidom/evaluate.js index dbdec3b..824981f 100644 --- a/test/evaluate/realms/apidom/evaluate.js +++ b/test/evaluate/realms/apidom/evaluate.js @@ -6,7 +6,7 @@ import { JSONPointerIndexError, JSONPointerTypeError, JSONPointerKeyError, - JSONPointerEvaluateError, + JSONPointerParseError, URIFragmentIdentifier, } from '../../../../src/index.js'; import { evaluate } from '../../../../src/evaluate/realms/apidom/index.js'; @@ -91,8 +91,8 @@ describe('evaluate', function () { }); context('invalid JSON Pointers (should throw errors)', function () { - specify('should throw JSONPointerEvaluateError for invalid JSON Pointer', function () { - assert.throws(() => evaluate(element, 'invalid-pointer'), JSONPointerEvaluateError); + specify('should throw JSONPointerParseError for invalid JSON Pointer', function () { + assert.throws(() => evaluate(element, 'invalid-pointer'), JSONPointerParseError); }); specify( diff --git a/test/evaluate/realms/apidom/index.js b/test/evaluate/realms/apidom/index.js index 0ef3233..77ec069 100644 --- a/test/evaluate/realms/apidom/index.js +++ b/test/evaluate/realms/apidom/index.js @@ -7,7 +7,7 @@ import { JSONPointerIndexError, JSONPointerTypeError, JSONPointerKeyError, - JSONPointerEvaluateError, + JSONPointerParseError, URIFragmentIdentifier, } from '../../../../src/index.js'; import ApiDOMEvaluationRealm from '../../../../src/evaluate/realms/apidom/index.js'; @@ -101,10 +101,10 @@ describe('evaluate', function () { }); context('invalid JSON Pointers (should throw errors)', function () { - specify('should throw JSONPointerEvaluateError for invalid JSON Pointer', function () { + specify('should throw JSONPointerParseError for invalid JSON Pointer', function () { assert.throws( () => evaluate(element, 'invalid-pointer', { realm }), - JSONPointerEvaluateError, + JSONPointerParseError, ); }); diff --git a/test/evaluate/realms/immutable.js b/test/evaluate/realms/immutable.js index aee74a9..ec52c4b 100644 --- a/test/evaluate/realms/immutable.js +++ b/test/evaluate/realms/immutable.js @@ -6,7 +6,7 @@ import { JSONPointerIndexError, JSONPointerTypeError, JSONPointerKeyError, - JSONPointerEvaluateError, + JSONPointerParseError, URIFragmentIdentifier, } from '../../../src/index.js'; import ImmutableEvaluationRealm from '../../../src/evaluate/realms/immutable/index.js'; @@ -82,8 +82,8 @@ describe('evaluate', function () { }); context('invalid JSON Pointers (should throw errors)', function () { - specify('should throw JSONPointerEvaluateError for invalid JSON Pointer', function () { - assert.throws(() => evaluate(map, 'invalid-pointer', { realm }), JSONPointerEvaluateError); + specify('should throw JSONPointerParseError for invalid JSON Pointer', function () { + assert.throws(() => evaluate(map, 'invalid-pointer', { realm }), JSONPointerParseError); }); specify( diff --git a/test/evaluate/realms/map-set.js b/test/evaluate/realms/map-set.js index 36725b8..db7bfa9 100644 --- a/test/evaluate/realms/map-set.js +++ b/test/evaluate/realms/map-set.js @@ -5,7 +5,7 @@ import { JSONPointerIndexError, JSONPointerTypeError, JSONPointerKeyError, - JSONPointerEvaluateError, + JSONPointerParseError, URIFragmentIdentifier, } from '../../../src/index.js'; import MapSetEvaluationRealm from '../../../src/evaluate/realms/map-set/index.js'; @@ -76,8 +76,8 @@ describe('evaluate', function () { }); context('invalid JSON Pointers (should throw errors)', function () { - specify('should throw JSONPointerEvaluateError for invalid JSON Pointer', function () { - assert.throws(() => evaluate(data, 'invalid-pointer', { realm }), JSONPointerEvaluateError); + specify('should throw JSONPointerParseError for invalid JSON Pointer', function () { + assert.throws(() => evaluate(data, 'invalid-pointer', { realm }), JSONPointerParseError); }); specify( diff --git a/test/evaluate/realms/minim.js b/test/evaluate/realms/minim.js index 369e74d..2a2c5c1 100644 --- a/test/evaluate/realms/minim.js +++ b/test/evaluate/realms/minim.js @@ -6,7 +6,7 @@ import { JSONPointerIndexError, JSONPointerTypeError, JSONPointerKeyError, - JSONPointerEvaluateError, + JSONPointerParseError, URIFragmentIdentifier, } from '../../../src/index.js'; import MinimEvaluationRealm from '../../../src/evaluate/realms/minim/index.js'; @@ -80,10 +80,10 @@ describe('evaluate', function () { }); context('invalid JSON Pointers (should throw errors)', function () { - specify('should throw JSONPointerEvaluateError for invalid JSON Pointer', function () { + specify('should throw JSONPointerParseError for invalid JSON Pointer', function () { assert.throws( () => evaluate(element, 'invalid-pointer', { realm }), - JSONPointerEvaluateError, + JSONPointerParseError, ); }); diff --git a/test/evaluate/trace.js b/test/evaluate/trace.js index 93c5070..f730b06 100644 --- a/test/evaluate/trace.js +++ b/test/evaluate/trace.js @@ -1,6 +1,6 @@ import { assert } from 'chai'; -import { evaluate, JSONPointerEvaluateError } from '../../src/index.js'; +import { evaluate, JSONPointerParseError } from '../../src/index.js'; describe('evaluate', function () { context('given trace option as object', function () { @@ -92,10 +92,11 @@ describe('evaluate', function () { assert.throws( () => evaluate({ a: { b: 'c' } }, '1', { trace }), - JSONPointerEvaluateError, + JSONPointerParseError, 'Invalid JSON Pointer: "1". Syntax error at position 0, expected "/"', ); - assert.lengthOf(trace.steps, 1); + // Parse errors occur before evaluation begins, so trace is not populated + assert.notProperty(trace, 'steps'); }); }); @@ -103,7 +104,7 @@ describe('evaluate', function () { specify('should produce error message with tracing info', function () { assert.throws( () => evaluate({ a: { b: 'c' } }, '1', { trace: true }), - JSONPointerEvaluateError, + JSONPointerParseError, 'Invalid JSON Pointer: "1". Syntax error at position 0, expected "/"', ); }); @@ -112,7 +113,7 @@ describe('evaluate', function () { specify('should produce error message without tracking info #1', function () { assert.throws( () => evaluate({ a: { b: 'c' } }, '1'), - JSONPointerEvaluateError, + JSONPointerParseError, 'Invalid JSON Pointer: "1". Syntax error at position 0', ); }); @@ -120,7 +121,7 @@ describe('evaluate', function () { specify('should produce error message without tracking info #2', function () { assert.throws( () => evaluate({ a: { b: 'c' } }, '1', { trace: false }), - JSONPointerEvaluateError, + JSONPointerParseError, 'Invalid JSON Pointer: "1". Syntax error at position 0', ); });