From 35a5fe833e5068d3515c42e66f8198378742d26a Mon Sep 17 00:00:00 2001 From: Vladimir Gorej Date: Sun, 22 May 2022 21:56:54 +0200 Subject: [PATCH] feat(json-path): add support for JSONPath Refs #1485 --- package-lock.json | 2 ++ packages/apidom-json-path/package.json | 3 ++- packages/apidom-json-path/src/index.ts | 8 +++++--- packages/apidom-json-path/test/index.ts | 16 +++++++++++----- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0679f1dc30..0072e5cdec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26332,6 +26332,7 @@ "dependencies": { "@babel/runtime-corejs3": "=7.18.0", "@swagger-api/apidom-core": "^0.27.0", + "@swagger-api/apidom-json-pointer": "^0.27.0", "jsonpath-plus": "=6.0.1" } }, @@ -30585,6 +30586,7 @@ "requires": { "@babel/runtime-corejs3": "=7.18.0", "@swagger-api/apidom-core": "^0.27.0", + "@swagger-api/apidom-json-pointer": "^0.27.0", "jsonpath-plus": "=6.0.1" } }, diff --git a/packages/apidom-json-path/package.json b/packages/apidom-json-path/package.json index 7e9911805a..dbd969139a 100644 --- a/packages/apidom-json-path/package.json +++ b/packages/apidom-json-path/package.json @@ -36,7 +36,8 @@ "dependencies": { "@babel/runtime-corejs3": "=7.18.0", "jsonpath-plus": "=6.0.1", - "@swagger-api/apidom-core": "^0.27.0" + "@swagger-api/apidom-core": "^0.27.0", + "@swagger-api/apidom-json-pointer": "^0.27.0" }, "files": [ "cjs/", diff --git a/packages/apidom-json-path/src/index.ts b/packages/apidom-json-path/src/index.ts index 3a69695a52..b27ab61773 100644 --- a/packages/apidom-json-path/src/index.ts +++ b/packages/apidom-json-path/src/index.ts @@ -1,5 +1,6 @@ import { JSONPath } from 'jsonpath-plus'; -import { Element, toValue, ObjectElement } from '@swagger-api/apidom-core'; +import { Element, toValue } from '@swagger-api/apidom-core'; +import { evaluate as jsonPointerEvaluate } from '@swagger-api/apidom-json-pointer'; type Evaluate = { (path: string, element: T): Element[]; @@ -24,7 +25,7 @@ export const evaluate: Evaluate = (path, element) => { resultType: 'pointer', }) as string[]; - return pointers.map(() => new ObjectElement()); + return pointers.map((pointer) => jsonPointerEvaluate(pointer, element)); }; /** @@ -43,7 +44,8 @@ export const evaluateMulti: EvaluateMulti = (paths, element) => { const endPointValues: Element[] = []; for (const pointer of pointers) { - endPointValues.push(new ObjectElement({ pointer })); + const endPointValue = jsonPointerEvaluate(pointer, element); + endPointValues.push(endPointValue); } if (Array.isArray(path)) { diff --git a/packages/apidom-json-path/test/index.ts b/packages/apidom-json-path/test/index.ts index b58bc85669..bdf08c624c 100644 --- a/packages/apidom-json-path/test/index.ts +++ b/packages/apidom-json-path/test/index.ts @@ -1,5 +1,5 @@ import { assert } from 'chai'; -import { ObjectElement } from '@swagger-api/apidom-core'; +import { ObjectElement, NumberElement } from '@swagger-api/apidom-core'; import { evaluate, evaluateMulti } from '../src'; @@ -14,7 +14,7 @@ describe('apidom-json-path', function () { }); const result = evaluate('$.a.b[?(@ < 10)]', objectElement); - assert.lengthOf(result, 2); + assert.deepEqual(result, [new NumberElement(1), new NumberElement(2)]); }); }); @@ -27,7 +27,7 @@ describe('apidom-json-path', function () { }); const result = evaluate(['$', 'a', 'b', '?(@ < 10)'], objectElement); - assert.lengthOf(result, 2); + assert.deepEqual(result, [new NumberElement(1), new NumberElement(2)]); }); }); @@ -55,7 +55,10 @@ describe('apidom-json-path', function () { }); const result = evaluateMulti(['$.a.b[?(@ < 10)]', '$.a.b[?(@ > 10)]'], objectElement); - assert.lengthOf(result, 2); + assert.deepEqual(result, [ + ['$.a.b[?(@ < 10)]', [new NumberElement(1), new NumberElement(2)]], + ['$.a.b[?(@ > 10)]', [new NumberElement(100)]], + ]); }); }); @@ -74,7 +77,10 @@ describe('apidom-json-path', function () { objectElement, ); - assert.lengthOf(result, 2); + assert.deepEqual(result, [ + ["$['a']['b']['?(@ < 10)']", [new NumberElement(1), new NumberElement(2)]], + ["$['a']['b']['?(@ > 10)']", [new NumberElement(100)]], + ]); }); });