UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

148 lines (147 loc) 4.05 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.compile = compile; exports.dict = dict; exports.escape = escape; exports.get = get; exports.has = has; exports.parse = parse; exports.remove = remove; exports.set = set; exports.unescape = unescape; exports.walk = walk; var _push = _interopRequireDefault(require("core-js-pure/stable/instance/push.js")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function get(obj, pointer) { const refTokens = Array.isArray(pointer) ? pointer : parse(pointer); for (let i = 0; i < refTokens.length; ++i) { const tok = refTokens[i]; if (!(typeof obj === 'object' && tok in obj)) { throw new Error('Invalid reference token: ' + tok); } obj = obj[tok]; } return obj; } function set(obj, pointer, value) { const refTokens = Array.isArray(pointer) ? pointer : parse(pointer); let nextTok = refTokens[0]; if (refTokens.length === 0) { throw Error('Cannot set the root object'); } for (let i = 0; i < refTokens.length - 1; ++i) { let tok = refTokens[i]; if (typeof tok !== 'string' && typeof tok !== 'number') { tok = String(tok); } if (tok === '__proto__' || tok === 'constructor' || tok === 'prototype') { continue; } if (tok === '-' && Array.isArray(obj)) { tok = obj.length; } nextTok = refTokens[i + 1]; if (!(tok in obj)) { if (nextTok.match(/^(\d+|-)$/)) { obj[tok] = []; } else { obj[tok] = {}; } } if (Object.isFrozen(obj[tok])) { obj[tok] = { ...obj[tok] }; } obj = obj[tok]; } if (nextTok === '-' && Array.isArray(obj)) { nextTok = obj.length; } obj[nextTok] = value; } function remove(obj, pointer) { const refTokens = Array.isArray(pointer) ? pointer : parse(pointer); const finalToken = refTokens[refTokens.length - 1]; if (finalToken === undefined) { throw new Error('Invalid JSON pointer for remove: "' + pointer + '"'); } const parent = get(obj, refTokens.slice(0, -1)); if (Array.isArray(parent)) { const index = +finalToken; if (finalToken === '' && isNaN(index)) { throw new Error('Invalid array index: "' + finalToken + '"'); } Array.prototype.splice.call(parent, index, 1); } else { delete parent[finalToken]; } } function dict(obj, descend = null) { const results = {}; walk(obj, (value, pointer) => { results[pointer] = value; }, descend); return results; } function walk(obj, iterator, descend = null) { const refTokens = []; descend = descend || (value => { const type = Object.prototype.toString.call(value); return type === '[object Object]' || type === '[object Array]'; }); next(obj, refTokens, iterator, descend); } function next(cur, refTokens, iterator, descend) { if (Array.isArray(cur)) { cur = cur.reduce((acc, cur, i) => { acc[i] = cur; return acc; }, {}); } let res; for (const key in cur) { (0, _push.default)(refTokens).call(refTokens, String(key)); if (descend(cur[key])) { res = next(cur[key], refTokens, iterator, descend); } else { res = iterator(cur[key], compile(refTokens)); } if (res === false) { return false; } refTokens.pop(); } } function has(obj, pointer) { try { get(obj, pointer); } catch (e) { return false; } return true; } function escape(str) { return str.toString().replace(/~/g, '~0').replace(/\//g, '~1'); } function unescape(str) { return str.replace(/~1/g, '/').replace(/~0/g, '~'); } function parse(pointer) { if (pointer === '') { return []; } if ((pointer === null || pointer === void 0 ? void 0 : pointer.charAt(0)) !== '/') { throw new Error('Invalid JSON pointer: ' + pointer); } return pointer.substring(1).split(/\//).map(unescape); } function compile(refTokens) { if (refTokens.length === 0) { return ''; } return '/' + refTokens.map(escape).join('/'); } //# sourceMappingURL=json-pointer.js.map