Add JSON pointer support to $data reference.
parent
eac77bf565
commit
53e9971edd
|
@ -214,20 +214,33 @@ function getPath(currentPath, prop, jsonPointers) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
var JSON_POINTER = /^#|\/(?:[^~]|~0|~1)*?$/;
|
||||||
var RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;
|
var RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;
|
||||||
function getData($data, lvl, paths) {
|
function getData($data, lvl, paths) {
|
||||||
var matches = $data.match(RELATIVE_JSON_POINTER);
|
var up;
|
||||||
if (!matches) throw new Error('Invalid relative JSON-pointer: ' + $data);
|
var jsonPointer;
|
||||||
var up = +matches[1];
|
var data;
|
||||||
var jsonPointer = matches[2];
|
var matches;
|
||||||
|
if ($data.charAt(0) == '/') {
|
||||||
|
matches = $data.match(JSON_POINTER);
|
||||||
|
if (!matches) throw new Error('Invalid JSON-pointer: ' + $data);
|
||||||
|
jsonPointer = matches[0];
|
||||||
|
data = 'data';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
matches = $data.match(RELATIVE_JSON_POINTER);
|
||||||
|
if (!matches) throw new Error('Invalid JSON-pointer: ' + $data);
|
||||||
|
up = +matches[1];
|
||||||
|
jsonPointer = matches[2];
|
||||||
if (jsonPointer == '#') {
|
if (jsonPointer == '#') {
|
||||||
if (up >= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl);
|
if (up >= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl);
|
||||||
return paths[lvl - up];
|
return paths[lvl - up];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl);
|
if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl);
|
||||||
var data = 'data' + ((lvl - up) || '');
|
data = 'data' + ((lvl - up) || '');
|
||||||
if (!jsonPointer) return data;
|
if (!jsonPointer) return data;
|
||||||
|
}
|
||||||
|
|
||||||
var expr = data;
|
var expr = data;
|
||||||
var segments = jsonPointer.split('/');
|
var segments = jsonPointer.split('/');
|
||||||
|
|
|
@ -30,7 +30,10 @@
|
||||||
"properties": {
|
"properties": {
|
||||||
"$data": {
|
"$data": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"format": "relative-json-pointer"
|
"anyOf": [
|
||||||
|
{ "format": "relative-json-pointer" },
|
||||||
|
{ "format": "json-pointer" }
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false
|
"additionalProperties": false
|
||||||
|
|
Loading…
Reference in New Issue