diff --git a/index.js b/index.js index 307474a..2994c79 100644 --- a/index.js +++ b/index.js @@ -276,7 +276,7 @@ function getDataByJSONPointer (data, jsonPointer) { if (typeof current !== 'object' || current === null) { return null } - current = current[part] + current = current[part.replace(/~1/g, '/').replace(/~0/g, '~')] } return current ?? null } diff --git a/test/get-deref-schema.test.js b/test/get-deref-schema.test.js index 9ad2309..ec27d13 100644 --- a/test/get-deref-schema.test.js +++ b/test/get-deref-schema.test.js @@ -4,6 +4,38 @@ const assert = require('node:assert/strict') const { test } = require('node:test') const { RefResolver } = require('../index.js') +test('should dereference escaped JSON Pointer tokens', () => { + const refResolver = new RefResolver() + refResolver.addSchema({ + $id: 'target', + definitions: { + 'a/b': { type: 'integer' }, + 'm~n': { type: 'number' }, + 'a~1b': { type: 'string' } + } + }) + refResolver.addSchema({ + $id: 'source', + type: 'object', + properties: { + slash: { $ref: 'target#/definitions/a~1b' }, + tilde: { $ref: 'target#/definitions/m~0n' }, + literalEscape: { $ref: 'target#/definitions/a~01b' } + } + }) + + assert.deepStrictEqual(refResolver.getDerefSchema('source'), { + $id: 'source', + type: 'object', + properties: { + slash: { type: 'integer' }, + tilde: { type: 'number' }, + literalEscape: { type: 'string' } + } + }) + assert.deepStrictEqual(refResolver.getDerefSchema('target', '#/definitions/a~1b'), { type: 'integer' }) +}) + test('should resolve reference', () => { const refResolver = new RefResolver() diff --git a/test/get-schema.test.js b/test/get-schema.test.js index a7849e9..e1b96fd 100644 --- a/test/get-schema.test.js +++ b/test/get-schema.test.js @@ -4,6 +4,25 @@ const assert = require('node:assert/strict') const { test } = require('node:test') const { RefResolver } = require('../index.js') +test('should decode escaped JSON Pointer tokens', () => { + const refResolver = new RefResolver() + const schema = { + $id: 'schema', + definitions: { + 'a/b': { type: 'integer' }, + 'm~n': { type: 'number' }, + 'a~1b': { type: 'string' }, + 'a//b': { type: 'boolean' } + } + } + refResolver.addSchema(schema) + + assert.equal(refResolver.getSchema('schema', '#/definitions/a~1b'), schema.definitions['a/b']) + assert.equal(refResolver.getSchema('schema', '#/definitions/m~0n'), schema.definitions['m~n']) + assert.equal(refResolver.getSchema('schema', '#/definitions/a~01b'), schema.definitions['a~1b']) + assert.equal(refResolver.getSchema('schema', '#/definitions/a~1~1b'), schema.definitions['a//b']) +}) + test('should get schema by schema id', () => { const refResolver = new RefResolver()