@sphereon/pex
Version:
A Typescript implementation of the v1 and v2 DIF Presentation Exchange specification
153 lines (152 loc) • 12.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.JsonPathUtils = void 0;
const jsonpath_1 = require("@astronautlabs/jsonpath");
class JsonPathUtils {
/**
* @param obj: any object can be found in verifiablePresentation.verifiableCredential[i]
* @param paths: paths that can be found in Field object
* @return a result object containing value of the correct path in the verifiableCredential and the correct path
* @example(success result): if you call this method with 1. verifiableCredential:
* {
'@context': [''],
age: 19,
credentialSchema: [ { id: '' } ],
id: '2dc74354-e965-4883-be5e-bfec48bf60c7',
issuer: '',
type: 'VerifiableCredential'
}
and 2 paths: [ '$.age', '$.details.age ]
you will get result: [ { value: 19, path: [ '$', 'age' ] } ]
@example(fail result): if you call this method with 1. verifiableCredential:
{
'@context': [ '' ],
credentialSchema: [ { id: '' } ],
id: '2dc74354-e965-4883-be5e-bfec48bf60c7',
issuer: '',
type: 'VerifiableCredential'
}
and 2. paths: [ '$.age' ],
you will get result: result: []
@example (array example):
vc: {
'@context': [''],
"details": {
"information":[
{
"age": 19
}]
},
credentialSchema: [ { id: '' } ],
id: '2dc74354-e965-4883-be5e-bfec48bf60c7',
issuer: '',
type: 'VerifiableCredential'
}
result: [ { value: 19, path: [ '$', 'details', 'information', 0, 'age' ] } ]
*/
static extractInputField(obj, paths) {
let result = [];
if (paths) {
for (const path of paths) {
result = jsonpath_1.JSONPath.nodes(obj, path);
if (result.length) {
break;
}
}
}
return result;
}
static changePropertyNameRecursively(pd, currentPropertyName, newPropertyName) {
const existingPaths = JsonPathUtils.extractInputField(pd, ['$..' + currentPropertyName]);
for (const existingPath of existingPaths) {
this.copyResultPathToDestinationDefinition(existingPath.path, pd, newPropertyName);
}
}
static setValue(obj, path, newValue) {
const stringPath = typeof path === 'string' ? path : jsonpath_1.JSONPath.stringify(path);
jsonpath_1.JSONPath.value(obj, stringPath, newValue);
return obj;
}
static getValue(obj, path) {
try {
const stringPath = typeof path === 'string' ? path : jsonpath_1.JSONPath.stringify(path);
return jsonpath_1.JSONPath.value(obj, stringPath);
}
catch (error) {
return undefined;
}
}
static copyResultPathToDestinationDefinition(pathDetails, pd, newPropertyName) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
let objectCursor = pd;
for (let i = 1; i < pathDetails.length; i++) {
if (i + 1 < pathDetails.length) {
objectCursor = objectCursor[pathDetails[i]];
}
if (pathDetails.length == i + 1) {
objectCursor[newPropertyName] = objectCursor[pathDetails[i]];
delete objectCursor[pathDetails[i]];
break;
}
}
}
static changeSpecialPathsRecursively(pd) {
const paths = JsonPathUtils.extractInputField(pd, ['$..path']);
for (const path of paths) {
this.modifyPathsWithSpecialCharacter(path.path, pd);
}
}
static modifyPathsWithSpecialCharacter(pathDetails, pd) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
let objectCursor = pd;
for (let i = 1; i < pathDetails.length; i++) {
if (i + 1 < pathDetails.length) {
objectCursor = objectCursor[pathDetails[i]];
}
if (pathDetails.length == i + 1) {
const paths = objectCursor[pathDetails[i]];
const editedPaths = [];
for (let j = 0; j < paths.length; j++) {
editedPaths.push(this.modifyPathWithSpecialCharacter(paths[j]));
}
objectCursor[pathDetails[i]] = editedPaths;
break;
}
}
}
static modifyPathWithSpecialCharacter(path) {
const matches = path.matchAll(JsonPathUtils.REGEX_PATH);
path = this.modifyPathRecursive(matches, path);
return path;
}
static modifyPathRecursive(matches, path) {
let next = matches.next();
let indexChanged = false;
while (next && !next.done && !indexChanged) {
const atIdx = next.value.index;
if (atIdx && atIdx == 1) {
path = path.charAt(0) + "['" + next.value[0] + "']" + path.substring(atIdx + next.value[0].length);
indexChanged = true;
this.modifyPathRecursive(matches, path);
}
else if (atIdx && atIdx > 1 && path.substring(atIdx - 2, atIdx) !== "['" && path.substring(atIdx - 2, atIdx) !== '["') {
if (path.substring(atIdx - 2, atIdx) === '..') {
path = path.substring(0, atIdx - 2) + "..['" + next.value[0] + "']" + path.substring(atIdx + next.value[0].length);
indexChanged = true;
const matches = path.matchAll(JsonPathUtils.REGEX_PATH);
this.modifyPathRecursive(matches, path);
}
else if (path.charAt(atIdx - 1) === '.') {
path = path.substring(0, atIdx - 1) + "['" + next.value[0] + "']" + path.substring(atIdx + next.value[0].length);
indexChanged = true;
this.modifyPathRecursive(matches, path);
}
}
next = matches.next();
}
return path;
}
}
exports.JsonPathUtils = JsonPathUtils;
JsonPathUtils.REGEX_PATH = /@\w+/g;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvblBhdGhVdGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi91dGlscy9qc29uUGF0aFV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNEQUF5RDtBQUt6RCxNQUFhLGFBQWE7SUFFeEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BeUNHO0lBQ0ksTUFBTSxDQUFDLGlCQUFpQixDQUFzQixHQUFtQixFQUFFLEtBQWU7UUFDdkYsSUFBSSxNQUFNLEdBQWdELEVBQUUsQ0FBQztRQUM3RCxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxHQUFHLG1CQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ2xCLE1BQU07Z0JBQ1IsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxNQUF1RCxDQUFDO0lBQ2pFLENBQUM7SUFFTSxNQUFNLENBQUMsNkJBQTZCLENBQ3pDLEVBQXVELEVBQ3ZELG1CQUEyQixFQUMzQixlQUF1QjtRQUV2QixNQUFNLGFBQWEsR0FBb0QsYUFBYSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7UUFDMUksS0FBSyxNQUFNLFlBQVksSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMscUNBQXFDLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDckYsQ0FBQztJQUNILENBQUM7SUFFTSxNQUFNLENBQUMsUUFBUSxDQUFPLEdBQU0sRUFBRSxJQUE4QixFQUFFLFFBQVc7UUFDOUUsTUFBTSxVQUFVLEdBQUcsT0FBTyxJQUFJLEtB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