pointer-props
Version:
JavaScript object manipulation (get/set/del) using JSON Pointer (RFC6901) and JSON Reference paths.
1 lines • 1.28 kB
JavaScript
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(e["pointer-props"]={})}(this,(function(e){const{dset:t}=require("dset"),r=require("dlv");class n extends Error{constructor(e){super(e),this.name="InfiniteReference"}}class o extends Error{constructor(e){super(e),this.name="ExternalReference"}}const s=function(e){if(!e.startsWith("/")&&!e.startsWith("#/"))throw new o("Non-relative JSON Pointers are not supported: "+e);[,...e]=e.split("/");let t=[];for(let r of e)t.push(r.replaceAll("~1","/").replaceAll("~0","~"));return t},i=e=>e.split?s(e):e;e.del=function(e,n){let o=i(n),s=o.pop(),l=r(e,o);return Array.isArray(l)?l.splice(parseInt(s,10),1):l&&delete l[s],t(e,o,l),e},e.get=function(e,t){return r(e,i(t))},e.resolve=function(e,t){const r=Object.create(null),o=t=>{let i=[...t],l=e;for(let e=0;e<t.length;e++){if(void 0===l)return null;if(l=l[i.shift()],l&&l.$ref){if(r[l.$ref])throw new n("Found a cycle of $ref names on: "+l.$ref);return r[l.$ref]=!0,o([...s(l.$ref),...i])}}return t};return o(i(t))},e.set=function(e,r,n){return t(e,i(r),n),e},e.toPointer=function(e){let t="";for(let r of e)t+="/"+r.toString().replaceAll("~","~0").replaceAll("/","~1");return t},e.toTokens=s}));