@winglet/json
Version:
TypeScript library for safe and efficient JSON data manipulation with RFC 6901 (JSON Pointer) and RFC 6902 (JSON Patch) compliance, featuring prototype pollution protection and immutable operations
55 lines (52 loc) • 1.94 kB
JavaScript
import { isArrayIndex } from '@winglet/common-utils/filter';
const convertJsonPointerToPath = (jsonPointer) => {
if (!jsonPointer || jsonPointer === JSON_POINTER_SEPARATOR)
return JSON_PATH_SEPARATOR;
if (jsonPointer[0] === '.' ||
((jsonPointer[0] === '@' || jsonPointer[0] === '$') &&
jsonPointer[1] === '.'))
return jsonPointer;
const length = jsonPointer.length;
let result = JSON_PATH_SEPARATOR;
let start = 1;
let index = 1;
let isFirstSegment = true;
while (index < length) {
const character = jsonPointer[index];
if (character === JSON_POINTER_SEPARATOR) {
if (index > start) {
const segment = jsonPointer.slice(start, index);
result += formatSegment(segment, isFirstSegment);
isFirstSegment = false;
}
start = index + 1;
index++;
}
else
index++;
}
if (start < length) {
const segment = jsonPointer.slice(start);
result += formatSegment(segment, isFirstSegment);
}
return result;
};
const formatSegment = (segment, isFirstSegment) => {
if (segment === JSON_PATH_ARRAY_INDEX_NEW)
return JSON_PATH_ARRAY_EMPTY_ARRAY;
if (isArrayIndex(segment))
return `${JSON_PATH_ARRAY_INDEX_PREFIX}${segment}${JSON_PATH_ARRAY_INDEX_SUFFIX}`;
else {
if (segment.indexOf(JSON_PATH_SEPARATOR) === -1)
return isFirstSegment ? segment : `${JSON_PATH_SEPARATOR}${segment}`;
else
return `${JSON_PATH_ARRAY_INDEX_PREFIX}${segment}${JSON_PATH_ARRAY_INDEX_SUFFIX}`;
}
};
const JSON_PATH_SEPARATOR = '.';
const JSON_PATH_ARRAY_INDEX_PREFIX = '[';
const JSON_PATH_ARRAY_INDEX_SUFFIX = ']';
const JSON_PATH_ARRAY_EMPTY_ARRAY = '[]';
const JSON_POINTER_SEPARATOR = '/';
const JSON_PATH_ARRAY_INDEX_NEW = '-';
export { convertJsonPointerToPath };