@speclynx/apidom-datamodel 2.13.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/README.md +6 -6
- package/dist/apidom-datamodel.browser.js +257 -127
- package/dist/apidom-datamodel.browser.min.js +1 -1
- package/package.json +3 -3
- package/src/Metadata.cjs +91 -0
- package/src/Metadata.mjs +87 -0
- package/src/clone/index.cjs +3 -3
- package/src/clone/index.mjs +3 -3
- package/src/index.cjs +3 -1
- package/src/index.mjs +2 -1
- package/src/primitives/CollectionElement.cjs +1 -1
- package/src/primitives/CollectionElement.mjs +1 -1
- package/src/primitives/Element.cjs +30 -43
- package/src/primitives/Element.mjs +31 -44
- package/src/registration.cjs +6 -2
- package/src/registration.mjs +6 -2
- package/src/serialisers/JSONSerialiser.cjs +37 -3
- package/src/serialisers/JSONSerialiser.mjs +37 -3
- package/types/apidom-datamodel.d.ts +60 -22
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.apidomDatamodel=t():e.apidomDatamodel=t()}(self,()=>(()=>{"use strict";var e={d:(t,n)=>{for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};function n(e){return null!=e&&"object"==typeof e&&!0===e["@@functional/placeholder"]}function r(e){return function t(r){return 0===arguments.length||n(r)?t:e.apply(this,arguments)}}function s(e){return function t(s,i){switch(arguments.length){case 0:return t;case 1:return n(s)?t:r(function(t){return e(s,t)});default:return n(s)&&n(i)?t:n(s)?r(function(t){return e(t,i)}):n(i)?r(function(t){return e(s,t)}):e(s,i)}}}function i(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}function o(e,t,n){for(var r=0,s=n.length;r<s;){if(e(t,n[r]))return!0;r+=1}return!1}function a(e,t){return Object.prototype.hasOwnProperty.call(t,e)}e.r(t),e.d(t,{AnnotationElement:()=>Se,ArrayElement:()=>B,BooleanElement:()=>K,CloneError:()=>ge,CollectionElement:()=>x,CommentElement:()=>Ce,DeepCloneError:()=>ve,Element:()=>A,JSONSerialiser:()=>q,KeyValuePair:()=>E,LinkElement:()=>T,MemberElement:()=>z,Namespace:()=>H,NullElement:()=>F,NumberElement:()=>R,ObjectElement:()=>L,ObjectSlice:()=>w,ParseResultElement:()=>Ve,RefElement:()=>N,ShallowCloneError:()=>Ee,SourceMapElement:()=>C,StringElement:()=>O,StyleElement:()=>I,cloneDeep:()=>ke,cloneShallow:()=>je,hasElementSourceMap:()=>ue,hasElementStyle:()=>le,includesClasses:()=>fe,includesSymbols:()=>he,isAnnotationElement:()=>Le,isArrayElement:()=>ie,isBooleanElement:()=>se,isCommentElement:()=>De,isElement:()=>ee,isLinkElement:()=>xe,isMemberElement:()=>ae,isNullElement:()=>re,isNumberElement:()=>ne,isObjectElement:()=>oe,isParseResultElement:()=>Ie,isPrimitiveElement:()=>ce,isRefElement:()=>ze,isSourceMapElement:()=>qe,isStringElement:()=>te,refract:()=>Pe});const c="function"==typeof Object.is?Object.is:function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t};var l=Object.prototype.toString;const u=function(){return"[object Arguments]"===l.call(arguments)?function(e){return"[object Arguments]"===l.call(e)}:function(e){return a("callee",e)}}();var h=!{toString:null}.propertyIsEnumerable("toString"),f=["constructor","valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],m=function(){return arguments.propertyIsEnumerable("length")}(),p=function(e,t){for(var n=0;n<e.length;){if(e[n]===t)return!0;n+=1}return!1};const y="function"!=typeof Object.keys||m?r(function(e){if(Object(e)!==e)return[];var t,n,r=[],s=m&&u(e);for(t in e)!a(t,e)||s&&"length"===t||(r[r.length]=t);if(h)for(n=f.length-1;n>=0;)a(t=f[n],e)&&!p(r,t)&&(r[r.length]=t),n-=1;return r}):r(function(e){return Object(e)!==e?[]:Object.keys(e)});const d=r(function(e){return null===e?"Null":void 0===e?"Undefined":Object.prototype.toString.call(e).slice(8,-1)});function b(e,t,n,r){var s=i(e);function a(e,t){return g(e,t,n.slice(),r.slice())}return!o(function(e,t){return!o(a,t,e)},i(t),s)}function g(e,t,n,r){if(c(e,t))return!0;var s,i,o=d(e);if(o!==d(t))return!1;if("function"==typeof e["fantasy-land/equals"]||"function"==typeof t["fantasy-land/equals"])return"function"==typeof e["fantasy-land/equals"]&&e["fantasy-land/equals"](t)&&"function"==typeof t["fantasy-land/equals"]&&t["fantasy-land/equals"](e);if("function"==typeof e.equals||"function"==typeof t.equals)return"function"==typeof e.equals&&e.equals(t)&&"function"==typeof t.equals&&t.equals(e);switch(o){case"Arguments":case"Array":case"Object":if("function"==typeof e.constructor&&"Promise"===(s=e.constructor,null==(i=String(s).match(/^function (\w*)/))?"":i[1]))return e===t;break;case"Boolean":case"Number":case"String":if(typeof e!=typeof t||!c(e.valueOf(),t.valueOf()))return!1;break;case"Date":if(!c(e.valueOf(),t.valueOf()))return!1;break;case"Error":return e.name===t.name&&e.message===t.message;case"RegExp":if(e.source!==t.source||e.global!==t.global||e.ignoreCase!==t.ignoreCase||e.multiline!==t.multiline||e.sticky!==t.sticky||e.unicode!==t.unicode)return!1}for(var l=n.length-1;l>=0;){if(n[l]===e)return r[l]===t;l-=1}switch(o){case"Map":return e.size===t.size&&b(e.entries(),t.entries(),n.concat([e]),r.concat([t]));case"Set":return e.size===t.size&&b(e.values(),t.values(),n.concat([e]),r.concat([t]));case"Arguments":case"Array":case"Object":case"Boolean":case"Number":case"String":case"Date":case"Error":case"RegExp":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"ArrayBuffer":break;default:return!1}var u=y(e);if(u.length!==y(t).length)return!1;var h=n.concat([e]),f=r.concat([t]);for(l=u.length-1;l>=0;){var m=u[l];if(!a(m,t)||!g(t[m],e[m],h,f))return!1;l-=1}return!0}const v=s(function(e,t){return g(e,t,[],[])});const E=class{key;value;constructor(e,t){this.key=e,this.value=t}toValue(){return{key:this.key?.toValue(),value:this.value?.toValue()}}};class _{elements;constructor(e){this.elements=e??[]}toValue(){return this.elements.map(e=>({key:e.key?.toValue(),value:e.value?.toValue()}))}map(e,t){return this.elements.map(n=>{const r=n.value,s=n.key;if(void 0===r||void 0===s)throw new Error("MemberElement must have both key and value");return void 0!==t?e.call(t,r,s,n):e(r,s,n)})}filter(e,t){const n=this.elements.filter(n=>{const r=n.value,s=n.key;return void 0!==r&&void 0!==s&&(void 0!==t?e.call(t,r,s,n):e(r,s,n))});return new _(n)}reject(e,t){const n=[];for(const r of this.elements){const s=r.value,i=r.key;void 0!==s&&void 0!==i&&(e.call(t,s,i,r)||n.push(r))}return new _(n)}forEach(e,t){this.elements.forEach((n,r)=>{const s=n.value,i=n.key;void 0!==s&&void 0!==i&&(void 0!==t?e.call(t,s,i,n,r):e(s,i,n,r))})}find(e,t){return this.elements.find(n=>{const r=n.value,s=n.key;return void 0!==r&&void 0!==s&&(void 0!==t?e.call(t,r,s,n):e(r,s,n))})}keys(){return this.elements.map(e=>e.key?.toValue()).filter(e=>void 0!==e)}values(){return this.elements.map(e=>e.value?.toValue()).filter(e=>void 0!==e)}get length(){return this.elements.length}get isEmpty(){return 0===this.length}get first(){return this.elements[0]}get(e){return this.elements[e]}push(e){return this.elements.push(e),this}includesKey(e){return this.elements.some(t=>t.key?.equals(e))}[Symbol.iterator](){return this.elements[Symbol.iterator]()}}const w=_;class k{parent;style;startLine;startCharacter;startOffset;endLine;endCharacter;endOffset;_storedElement="element";_content;_meta;_attributes;constructor(e,t,n){void 0!==t&&(this.meta=t),void 0!==n&&(this.attributes=n),void 0!==e&&(this.content=e)}get element(){return this._storedElement}set element(e){this._storedElement=e}get content(){return this._content}set content(e){if(e instanceof k)this._content=e;else if(null!=e&&"string"!=typeof e&&"number"!=typeof e&&"boolean"!=typeof e&&"bigint"!=typeof e&&"symbol"!=typeof e)if(e instanceof E)this._content=e;else if(e instanceof w)this._content=e.elements;else if(Array.isArray(e))this._content=e.map(e=>this.refract(e));else{if("object"!=typeof e)throw new Error("Cannot set content to value of type "+typeof e);this._content=Object.entries(e).map(([e,t])=>new this.MemberElement(e,t))}else this._content=e}get meta(){if(!this._meta){if(this.isFrozen){const e=new this.ObjectElement;return e.freeze(),e}this._meta=new this.ObjectElement}return this._meta}set meta(e){e instanceof k?this._meta=e:this.meta.set(e??{})}get attributes(){if(!this._attributes){if(this.isFrozen){const e=new this.ObjectElement;return e.freeze(),e}this._attributes=new this.ObjectElement}return this._attributes}set attributes(e){e instanceof k?this._attributes=e:this.attributes.set(e??{})}get id(){return this.isFrozen?this.getMetaProperty("id",""):(this.hasMetaProperty("id")||this.setMetaProperty("id",""),this.meta.get("id"))}set id(e){this.setMetaProperty("id",e)}get classes(){return this.isFrozen?this.getMetaProperty("classes",[]):(this.hasMetaProperty("classes")||this.setMetaProperty("classes",[]),this.meta.get("classes"))}set classes(e){this.setMetaProperty("classes",e)}get links(){return this.isFrozen?this.getMetaProperty("links",[]):(this.hasMetaProperty("links")||this.setMetaProperty("links",[]),this.meta.get("links"))}set links(e){this.setMetaProperty("links",e)}get children(){const{_content:e}=this;if(Array.isArray(e))return e;if(e instanceof E){const t=[];return e.key&&t.push(e.key),e.value&&t.push(e.value),t}return e instanceof k?[e]:[]}get isFrozen(){return Object.isFrozen(this)}freeze(){if(!this.isFrozen){this._meta&&(this._meta.parent=this,this._meta.freeze()),this._attributes&&(this._attributes.parent=this,this._attributes.freeze());for(const e of this.children)e.parent=this,e.freeze();Array.isArray(this._content)&&Object.freeze(this._content),Object.freeze(this)}}toValue(){const{_content:e}=this;return e instanceof k||e instanceof E?e.toValue():Array.isArray(e)?e.map(e=>e.toValue()):e}equals(e){const t=e instanceof k?e.toValue():e;return v(this.toValue(),t)}primitive(){}set(e){return this.content=e,this}toRef(e){const t=this.id.toValue();if(""===t)throw new Error("Cannot create reference to an element without an ID");const n=new this.RefElement(t);return"string"==typeof e&&(n.path=this.refract(e)),n}getMetaProperty(e,t){if(!this.hasMetaProperty(e)){if(void 0===t)return;const e=this.refract(t);return e&&this.isFrozen&&e.freeze(),e}return this.meta.get(e)}setMetaProperty(e,t){this.meta.set(e,t)}hasMetaProperty(e){return!this.isMetaEmpty&&this.meta.hasKey(e)}get isMetaEmpty(){return void 0===this._meta||this.meta.isEmpty}getAttributesProperty(e,t){if(!this.hasAttributesProperty(e)){if(this.isFrozen){const e=this.refract(t);return e.freeze(),e}this.attributes.set(e,t)}return this.attributes.get(e)}setAttributesProperty(e,t){this.attributes.set(e,t)}hasAttributesProperty(e){return!this.isAttributesEmpty&&this.attributes.hasKey(e)}get isAttributesEmpty(){return void 0===this._attributes||this.attributes.isEmpty}}const A=k;const O=class extends A{constructor(e,t,n){super(e,t,n),this.element="string"}primitive(){return"string"}get length(){return this.content?.length??0}};class j extends O{constructor(e,t,n){super(e,t,n),this.element="sourceMap"}static transfer(e,t){t.startLine=e.startLine,t.startCharacter=e.startCharacter,t.startOffset=e.startOffset,t.endLine=e.endLine,t.endCharacter=e.endCharacter,t.endOffset=e.endOffset}static from(e){const{startLine:t,startCharacter:n,startOffset:r,endLine:s,endCharacter:i,endOffset:o}=e;if("number"!=typeof t||"number"!=typeof n||"number"!=typeof r||"number"!=typeof s||"number"!=typeof i||"number"!=typeof o)return;const a="sm1:"+[t,n,r,s,i,o].map(P).join("");const c=new j(a);return c.startLine=t,c.startCharacter=n,c.startOffset=r,c.endLine=s,c.endCharacter=i,c.endOffset=o,c}applyTo(e){this.content&&([e.startLine,e.startCharacter,e.startOffset,e.endLine,e.endCharacter,e.endOffset]=function(e){const t=e.startsWith("sm1:")?e.slice(4):e,n=[];let r=0;for(let e=0;e<6;e++){const e=S(t,r);n.push(e.value),r=e.next}return n}(this.content))}}const M="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function P(e){let t=e>>>0,n="";do{let e=31&t;t>>>=5,0!==t&&(e|=32),n+=M[e]}while(0!==t);return n}function S(e,t=0){let n=0,r=0,s=t;for(;;){const t=e[s++],i=M.indexOf(t);if(-1===i)throw new Error(`Invalid Base64 VLQ char: ${t}`);if(n|=(31&i)<<r,r+=5,!!!(32&i))break}return{value:n>>>0,next:s}}const C=j;class V extends A{constructor(e,t,n){super(e||[],t,n)}get length(){return this._content.length}get isEmpty(){return 0===this.length}get first(){return this._content[0]}get second(){return this._content[1]}get last(){return this._content.at(-1)}push(...e){for(const t of e)this._content.push(this.refract(t));return this}shift(){return this._content.shift()}unshift(e){this._content.unshift(this.refract(e))}includes(e){return this._content.some(t=>t.equals(e))}findElements(e,t){const n=t||{},r=!!n.recursive,s=void 0===n.results?[]:n.results;for(let t=0;t<this._content.length;t+=1){const n=this._content[t],i=n;r&&"function"==typeof i.findElements&&i.findElements(e,{results:s,recursive:r}),e(n,t,void 0)&&s.push(n)}return s}find(e){const t=this.findElements(e,{recursive:!0});return new this.ArrayElement(t)}findByElement(e){return this.find(t=>t.element===e)}findByClass(e){return this.find(t=>{const n=t.classes;return"function"==typeof n.includes&&n.includes(e)})}getById(e){return this.find(t=>t.id.toValue()===e).first}concat(e){return new(0,this.constructor)(this._content.concat(e._content))}[Symbol.iterator](){return this._content[Symbol.iterator]()}}const x=V;const z=class extends A{constructor(e,t,n,r){super(new E,n,r),this.element="member",void 0!==e&&(this.key=e),arguments.length>=2&&(this.value=t)}primitive(){return"member"}get key(){return this._content.key}set key(e){this._content.key=this.refract(e)}get value(){return this._content.value}set value(e){this._content.value=void 0===e?void 0:this.refract(e)}};const L=class extends x{constructor(e,t,n){super(e||[],t,n),this.element="object"}primitive(){return"object"}toValue(){return this._content.reduce((e,t)=>(e[t.key.toValue()]=t.value?t.value.toValue():void 0,e),{})}get(e){const t=this.getMember(e);if(t)return t.value}getValue(e){const t=this.get(e);if(t)return t.toValue()}getMember(e){if(void 0!==e)return this._content.find(t=>t.key.toValue()===e)}remove(e){let t=null;return this.content=this._content.filter(n=>n.key.toValue()!==e||(t=n,!1)),t}getKey(e){const t=this.getMember(e);if(t)return t.key}set(e,t){if("string"==typeof e){const n=this.getMember(e);n?n.value=t:this._content.push(new z(e,t))}else if("object"==typeof e&&!Array.isArray(e))for(const t of Object.keys(e))this.set(t,e[t]);return this}keys(){return this._content.map(e=>e.key.toValue())}values(){return this._content.map(e=>e.value.toValue())}hasKey(e){return this._content.some(t=>t.key.equals(e))}items(){return this._content.map(e=>[e.key.toValue(),e.value.toValue()])}map(e,t){return this._content.map(n=>e.call(t,n.value,n.key,n))}compactMap(e,t){const n=[];return this.forEach((r,s,i)=>{const o=e.call(t,r,s,i);o&&n.push(o)}),n}filter(e,t){return new w(this._content).filter(e,t)}reject(e,t){const n=[];for(const r of this._content)e.call(t,r.value,r.key,r)||n.push(r);return new w(n)}forEach(e,t){this._content.forEach(n=>e.call(t,n.value,n.key,n))}reduce(e,t){let n,r;void 0!==t?(n=0,r=this.refract(t)):(n=1,r=this._content[0]?.value);for(let t=n;t<this._content.length;t+=1){const n=this._content[t],s=e(r,n.value,n.key,n,this);r=void 0===s?s:this.refract(s)}return r}empty(){return new this.constructor([])}};class D extends L{constructor(e,t,n){super(e,t,n),this.element="__styles__"}static transfer(e,t){t.style=e.style}static from(e){if(e.style)return new D(e.style)}applyTo(e){e.style=this.toValue()}}const I=D;const q=class{namespace;constructor(e){this.namespace=e||new this.Namespace}serialise(e){if(!(e instanceof this.namespace.elements.Element))throw new TypeError(`Given element \`${e}\` is not an Element instance`);const t={element:e.element};if(e.isMetaEmpty||(t.meta=this.serialiseObject(e.meta)),e.isAttributesEmpty||(t.attributes=this.serialiseObject(e.attributes)),!(e instanceof C)){const n=C.from(e);n&&(t.meta||(t.meta={}),t.meta.__mappings__=this.serialise(n))}if(!(e instanceof I)){const n=I.from(e);n&&(t.meta||(t.meta={}),t.meta.__styles__=this.serialise(n))}const n=this.serialiseContent(e.content);return void 0!==n&&(t.content=n),t}deserialise(e){if(!e.element)throw new Error("Given value is not an object containing an element name");const t=new(this.namespace.getElementClass(e.element));let n,r;t.element!==e.element&&(t.element=e.element);let s=e.meta;if(e.meta?.__mappings__||e.meta?.__styles__){const{__mappings__:t,__styles__:i,...o}=e.meta;n=t,r=i,s=Object.keys(o).length>0?o:void 0}if(s&&this.deserialiseObject(s,t.meta),n){this.deserialise(n).applyTo(t)}if(r){this.deserialise(r).applyTo(t)}e.attributes&&this.deserialiseObject(e.attributes,t.attributes);const i=this.deserialiseContent(e.content);return void 0===i&&null!==t.content||(t.content=i),t}serialiseContent(e){if(e instanceof this.namespace.elements.Element)return this.serialise(e);if(e instanceof this.namespace.KeyValuePair){const t=e,n={key:this.serialise(t.key)};return t.value&&(n.value=this.serialise(t.value)),n}if(e&&Array.isArray(e)){if(0===e.length)return;return e.map(e=>this.serialise(e))}return e}deserialiseContent(e){if(e){if(e.element)return this.deserialise(e);if(e.key){const t=new this.namespace.KeyValuePair(this.deserialise(e.key));return e.value&&(t.value=this.deserialise(e.value)),t}if(Array.isArray(e))return e.map(e=>this.deserialise(e))}return e}serialiseObject(e){const t={};if(e.forEach((e,n)=>{e&&(t[n.toValue()]=this.serialise(e))}),0!==Object.keys(t).length)return t}deserialiseObject(e,t){Object.keys(e).forEach(n=>{t.set(n,this.deserialise(e[n]))})}};const F=class extends A{constructor(e,t,n){super(e??null,t,n),this.element="null"}primitive(){return"null"}set(e){throw new Error("Cannot set the value of null")}};const R=class extends A{constructor(e,t,n){super(e,t,n),this.element="number"}primitive(){return"number"}};const K=class extends A{constructor(e,t,n){super(e,t,n),this.element="boolean"}primitive(){return"boolean"}};const B=class extends x{constructor(e,t,n){super(e||[],t,n),this.element="array"}primitive(){return"array"}get(e){return this._content[e]}getValue(e){const t=this.get(e);if(t)return t.toValue()}set(e,t){return"number"==typeof e&&void 0!==t?this._content[e]=this.refract(t):this.content=e,this}remove(e){return this._content.splice(e,1)[0]??null}map(e,t){return this._content.map(e,t)}flatMap(e,t){return this._content.flatMap(e,t)}compactMap(e,t){const n=[];for(const r of this._content){const s=e.call(t,r);s&&n.push(s)}return n}filter(e,t){const n=this._content.filter(e,t);return new this.constructor(n)}reject(e,t){const n=[];for(const r of this._content)e.call(t,r)||n.push(r);return new this.constructor(n)}reduce(e,t){let n,r;void 0!==t?(n=0,r=this.refract(t)):(n=1,r=this.first);for(let t=n;t<this.length;t+=1){const n=e(r,this._content[t],t,this);r=void 0===n?n:this.refract(n)}return r}forEach(e,t){this._content.forEach((n,r)=>{e.call(t,n,r)})}empty(){return new this.constructor([])}};const N=class extends A{constructor(e,t,n){super(e||[],t,n),this.element="ref",this.path||(this.path="element")}get path(){if(this.hasAttributesProperty("path"))return this.attributes.get("path")}set path(e){this.attributes.set("path",e)}};const T=class extends A{constructor(e,t,n){super(e||[],t,n),this.element="link"}get relation(){if(this.hasAttributesProperty("relation"))return this.attributes.get("relation")}set relation(e){this.attributes.set("relation",e)}get href(){if(this.hasAttributesProperty("href"))return this.attributes.get("href")}set href(e){this.attributes.set("href",e)}},U=e=>null===e,W=e=>"string"==typeof e,G=e=>"number"==typeof e,J=e=>"boolean"==typeof e,Q=e=>null!==e&&"object"==typeof e;class ${elementMap={};elementDetection=[];Element;KeyValuePair;_elements;_attributeElementKeys=[];_attributeElementArrayKeys=[];constructor(e){this.Element=A,this.KeyValuePair=E,e&&e.noDefault||this.useDefault()}use(e){return e.namespace&&e.namespace({base:this}),e.load&&e.load({base:this}),this}useDefault(){return this.register("null",F).register("string",O).register("number",R).register("boolean",K).register("array",B).register("object",L).register("member",z).register("ref",N).register("link",T).register("sourceMap",C),this.detect(U,F,!1).detect(W,O,!1).detect(G,R,!1).detect(J,K,!1).detect(Array.isArray,B,!1).detect(Q,L,!1),this}register(e,t){return this._elements=void 0,this.elementMap[e]=t,this}unregister(e){return this._elements=void 0,delete this.elementMap[e],this}detect(e,t,n){return void 0===n||n?this.elementDetection.unshift([e,t]):this.elementDetection.push([e,t]),this}toElement(e){if(e instanceof this.Element)return e;let t;for(const[n,r]of this.elementDetection)if(n(e)){t=new r(e);break}return t}getElementClass(e){const t=this.elementMap[e];return void 0===t?this.Element:t}fromRefract(e){return this.serialiser.deserialise(e)}toRefract(e){return this.serialiser.serialise(e)}get elements(){return void 0===this._elements&&(this._elements={Element:this.Element},Object.keys(this.elementMap).forEach(e=>{const t=e[0].toUpperCase()+e.substring(1);this._elements[t]=this.elementMap[e]})),this._elements}get serialiser(){return new q(this)}}q.prototype.Namespace=$;const H=$;function X(e,t,n){if(n||(n=new Y),function(e){var t=typeof e;return null==e||"object"!=t&&"function"!=t}(e))return e;var r,s=function(r){var s=n.get(e);if(s)return s;for(var i in n.set(e,r),e)Object.prototype.hasOwnProperty.call(e,i)&&(r[i]=t?X(e[i],!0,n):e[i]);return r};switch(d(e)){case"Object":return s(Object.create(Object.getPrototypeOf(e)));case"Array":return s(Array(e.length));case"Date":return new Date(e.valueOf());case"RegExp":return r=e,new RegExp(r.source,r.flags?r.flags:(r.global?"g":"")+(r.ignoreCase?"i":"")+(r.multiline?"m":"")+(r.sticky?"y":"")+(r.unicode?"u":"")+(r.dotAll?"s":""));case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"BigInt64Array":case"BigUint64Array":return e.slice();default:return e}}var Y=function(){function e(){this.map={},this.length=0}return e.prototype.set=function(e,t){var n=this.hash(e),r=this.map[n];r||(this.map[n]=r=[]),r.push([e,t]),this.length+=1},e.prototype.hash=function(e){var t=[];for(var n in e)t.push(Object.prototype.toString.call(e[n]));return t.join()},e.prototype.get=function(e){if(this.length<=180)for(var t in this.map)for(var n=this.map[t],r=0;r<n.length;r+=1){if((i=n[r])[0]===e)return i[1]}else{var s=this.hash(e);if(n=this.map[s])for(r=0;r<n.length;r+=1){var i;if((i=n[r])[0]===e)return i[1]}}},e}();const Z=r(function(e){return null!=e&&"function"==typeof e.clone?e.clone():X(e,!0)}),ee=e=>e instanceof A,te=e=>e instanceof O,ne=e=>e instanceof R,re=e=>e instanceof F,se=e=>e instanceof K,ie=e=>e instanceof B,oe=e=>e instanceof L,ae=e=>e instanceof z,ce=e=>oe(e)&&"object"===e.element||ie(e)&&"array"===e.element||se(e)&&"boolean"===e.element||ne(e)&&"number"===e.element||te(e)&&"string"===e.element||re(e)&&"null"===e.element||ae(e)&&"member"===e.element,le=e=>void 0!==e.style,ue=e=>"number"==typeof e.startLine&&"number"==typeof e.startCharacter&&"number"==typeof e.startOffset&&"number"==typeof e.endLine&&"number"==typeof e.endCharacter&&"number"==typeof e.endOffset,he=(e,t)=>{if(0===t.length)return!0;if(!e.hasAttributesProperty("symbols"))return!1;const n=e.attributes.get("symbols");return!!ie(n)&&t.every(e=>n.includes(e))},fe=(e,t)=>0===t.length||!!ee(e)&&(!e.isMetaEmpty&&(!!e.hasMetaProperty("classes")&&t.every(t=>e.classes.includes(t))));class me extends AggregateError{constructor(e,t,n){super(e,t,n),this.name=this.constructor.name,"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}}const pe=me;class ye extends Error{static[Symbol.hasInstance](e){return super[Symbol.hasInstance](e)||Function.prototype[Symbol.hasInstance].call(pe,e)}constructor(e,t){super(e,t),this.name=this.constructor.name,"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}}const de=ye;const be=class extends de{constructor(e,t){if(super(e,t),null!=t&&"object"==typeof t){const{cause:e,...n}=t;Object.assign(this,n)}}};const ge=class extends be{value;constructor(e,t){super(e,t),void 0!==t&&(this.value=t.value)}};const ve=class extends ge{};const Ee=class extends ge{},_e=(e,t)=>{const{visited:n=new WeakMap}=t,r={...t,visited:n};if(n.has(e))return n.get(e);const s=Oe(e);n.set(e,s);const{content:i}=e;return Array.isArray(i)?s.content=i.map(e=>_e(e,r)):ee(i)?s.content=_e(i,r):s.content=i instanceof E?we(i,r):i,s},we=(e,t)=>{const{visited:n=new WeakMap}=t,r={...t,visited:n};if(n.has(e))return n.get(e);const{key:s,value:i}=e,o=void 0!==s?_e(s,r):void 0,a=void 0!==i?_e(i,r):void 0,c=new E(o,a);return n.set(e,c),c},ke=(e,t={})=>{if(e instanceof E)return we(e,t);if(e instanceof w)return((e,t)=>{const{visited:n=new WeakMap}=t,r={...t,visited:n};if(n.has(e))return n.get(e);const s=[...e].map(e=>_e(e,r)),i=new w(s);return n.set(e,i),i})(e,t);if(ee(e))return _e(e,t);throw new ve("Value provided to cloneDeep function couldn't be cloned",{value:e})};ke.safe=e=>{try{return ke(e)}catch{return e}};const Ae=e=>{const{key:t,value:n}=e;return new E(t,n)},Oe=e=>{const t=new(0,e.constructor);t.element=e.element,e.isMetaEmpty||(t.meta=ke(e.meta)),e.isAttributesEmpty||(t.attributes=ke(e.attributes)),ue(e)&&C.transfer(e,t),le(e)&&(t.style=Z(e.style));const{content:n}=e;return ee(n)?t.content=Oe(n):Array.isArray(n)?t.content=[...n]:t.content=n instanceof E?Ae(n):n,t},je=e=>{if(e instanceof E)return Ae(e);if(e instanceof w)return(e=>{const t=[...e];return new w(t)})(e);if(ee(e))return Oe(e);throw new Ee("Value provided to cloneShallow function couldn't be cloned",{value:e})};function Me(e){return void 0===e?new F:Pe(e)}function Pe(e){if(e instanceof A)return e;if("string"==typeof e)return new O(e);if("number"==typeof e)return new R(e);if("boolean"==typeof e)return new K(e);if(null===e)return new F;if(Array.isArray(e))return new B(e.map(Me));if("object"==typeof e)return new L(e);throw new Error("Cannot refract value of type "+typeof e)}je.safe=e=>{try{return je(e)}catch{return e}},A.prototype.ObjectElement=L,A.prototype.ArrayElement=B,A.prototype.RefElement=N,A.prototype.MemberElement=z,A.prototype.refract=Pe;const Se=class extends O{constructor(e,t,n){super(e,t,n),this.element="annotation"}get code(){if(this.hasAttributesProperty("code"))return this.attributes.get("code")}set code(e){this.attributes.set("code",e)}};const Ce=class extends O{constructor(e,t,n){super(e,t,n),this.element="comment"}};const Ve=class extends B{constructor(e,t,n){super(e,t,n),this.element="parseResult"}get api(){return this.filter(e=>fe(e,["api"])).first}get results(){return this.filter(e=>fe(e,["result"]))}get result(){return this.results.first}get annotations(){return this.filter(e=>"annotation"===e.element)}get warnings(){return this.filter(e=>"annotation"===e.element&&fe(e,["warning"]))}get errors(){return this.filter(e=>"annotation"===e.element&&fe(e,["error"]))}get isEmpty(){return 0===this.reject(e=>"annotation"===e.element).length}replaceResult(e){const{result:t}=this;if(void 0===t)return!1;const n=this._content,r=n.findIndex(e=>e===t);return-1!==r&&(n[r]=e,!0)}},xe=e=>e instanceof T,ze=e=>e instanceof N,Le=e=>e instanceof Se,De=e=>e instanceof Ce,Ie=e=>e instanceof Ve,qe=e=>e instanceof C;return t})());
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.apidomDatamodel=t():e.apidomDatamodel=t()}(self,()=>(()=>{"use strict";var e={d:(t,n)=>{for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};function n(e){return null!=e&&"object"==typeof e&&!0===e["@@functional/placeholder"]}function r(e){return function t(r){return 0===arguments.length||n(r)?t:e.apply(this,arguments)}}function s(e){return function t(s,i){switch(arguments.length){case 0:return t;case 1:return n(s)?t:r(function(t){return e(s,t)});default:return n(s)&&n(i)?t:n(s)?r(function(t){return e(t,i)}):n(i)?r(function(t){return e(s,t)}):e(s,i)}}}function i(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}function o(e,t,n){for(var r=0,s=n.length;r<s;){if(e(t,n[r]))return!0;r+=1}return!1}function a(e,t){return Object.prototype.hasOwnProperty.call(t,e)}e.r(t),e.d(t,{AnnotationElement:()=>xe,ArrayElement:()=>J,BooleanElement:()=>G,CloneError:()=>Ee,CollectionElement:()=>F,CommentElement:()=>ze,DeepCloneError:()=>we,Element:()=>C,JSONSerialiser:()=>T,KeyValuePair:()=>j,LinkElement:()=>$,MemberElement:()=>K,Metadata:()=>A,Namespace:()=>ne,NullElement:()=>U,NumberElement:()=>W,ObjectElement:()=>R,ObjectSlice:()=>M,ParseResultElement:()=>De,RefElement:()=>Q,ShallowCloneError:()=>Oe,SourceMapElement:()=>I,StringElement:()=>V,StyleElement:()=>N,cloneDeep:()=>ke,cloneShallow:()=>Pe,hasElementSourceMap:()=>me,hasElementStyle:()=>fe,includesClasses:()=>ye,includesSymbols:()=>pe,isAnnotationElement:()=>qe,isArrayElement:()=>ce,isBooleanElement:()=>ae,isCommentElement:()=>Fe,isElement:()=>re,isLinkElement:()=>Le,isMemberElement:()=>ue,isNullElement:()=>oe,isNumberElement:()=>ie,isObjectElement:()=>le,isParseResultElement:()=>Ke,isPrimitiveElement:()=>he,isRefElement:()=>Ie,isSourceMapElement:()=>Re,isStringElement:()=>se,refract:()=>Ve});const c="function"==typeof Object.is?Object.is:function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t};var l=Object.prototype.toString;const u=function(){return"[object Arguments]"===l.call(arguments)?function(e){return"[object Arguments]"===l.call(e)}:function(e){return a("callee",e)}}();var h=!{toString:null}.propertyIsEnumerable("toString"),f=["constructor","valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],m=function(){return arguments.propertyIsEnumerable("length")}(),p=function(e,t){for(var n=0;n<e.length;){if(e[n]===t)return!0;n+=1}return!1};const y="function"!=typeof Object.keys||m?r(function(e){if(Object(e)!==e)return[];var t,n,r=[],s=m&&u(e);for(t in e)!a(t,e)||s&&"length"===t||(r[r.length]=t);if(h)for(n=f.length-1;n>=0;)a(t=f[n],e)&&!p(r,t)&&(r[r.length]=t),n-=1;return r}):r(function(e){return Object(e)!==e?[]:Object.keys(e)});const d=r(function(e){return null===e?"Null":void 0===e?"Undefined":Object.prototype.toString.call(e).slice(8,-1)});function b(e,t,n,r){var s=i(e);function a(e,t){return g(e,t,n.slice(),r.slice())}return!o(function(e,t){return!o(a,t,e)},i(t),s)}function g(e,t,n,r){if(c(e,t))return!0;var s,i,o=d(e);if(o!==d(t))return!1;if("function"==typeof e["fantasy-land/equals"]||"function"==typeof t["fantasy-land/equals"])return"function"==typeof e["fantasy-land/equals"]&&e["fantasy-land/equals"](t)&&"function"==typeof t["fantasy-land/equals"]&&t["fantasy-land/equals"](e);if("function"==typeof e.equals||"function"==typeof t.equals)return"function"==typeof e.equals&&e.equals(t)&&"function"==typeof t.equals&&t.equals(e);switch(o){case"Arguments":case"Array":case"Object":if("function"==typeof e.constructor&&"Promise"===(s=e.constructor,null==(i=String(s).match(/^function (\w*)/))?"":i[1]))return e===t;break;case"Boolean":case"Number":case"String":if(typeof e!=typeof t||!c(e.valueOf(),t.valueOf()))return!1;break;case"Date":if(!c(e.valueOf(),t.valueOf()))return!1;break;case"Error":return e.name===t.name&&e.message===t.message;case"RegExp":if(e.source!==t.source||e.global!==t.global||e.ignoreCase!==t.ignoreCase||e.multiline!==t.multiline||e.sticky!==t.sticky||e.unicode!==t.unicode)return!1}for(var l=n.length-1;l>=0;){if(n[l]===e)return r[l]===t;l-=1}switch(o){case"Map":return e.size===t.size&&b(e.entries(),t.entries(),n.concat([e]),r.concat([t]));case"Set":return e.size===t.size&&b(e.values(),t.values(),n.concat([e]),r.concat([t]));case"Arguments":case"Array":case"Object":case"Boolean":case"Number":case"String":case"Date":case"Error":case"RegExp":case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"ArrayBuffer":break;default:return!1}var u=y(e);if(u.length!==y(t).length)return!1;var h=n.concat([e]),f=r.concat([t]);for(l=u.length-1;l>=0;){var m=u[l];if(!a(m,t)||!g(t[m],e[m],h,f))return!1;l-=1}return!0}const v=s(function(e,t){return g(e,t,[],[])});function _(e,t,n){if(n||(n=new E),function(e){var t=typeof e;return null==e||"object"!=t&&"function"!=t}(e))return e;var r,s=function(r){var s=n.get(e);if(s)return s;for(var i in n.set(e,r),e)Object.prototype.hasOwnProperty.call(e,i)&&(r[i]=t?_(e[i],!0,n):e[i]);return r};switch(d(e)){case"Object":return s(Object.create(Object.getPrototypeOf(e)));case"Array":return s(Array(e.length));case"Date":return new Date(e.valueOf());case"RegExp":return r=e,new RegExp(r.source,r.flags?r.flags:(r.global?"g":"")+(r.ignoreCase?"i":"")+(r.multiline?"m":"")+(r.sticky?"y":"")+(r.unicode?"u":"")+(r.dotAll?"s":""));case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":case"BigInt64Array":case"BigUint64Array":return e.slice();default:return e}}var E=function(){function e(){this.map={},this.length=0}return e.prototype.set=function(e,t){var n=this.hash(e),r=this.map[n];r||(this.map[n]=r=[]),r.push([e,t]),this.length+=1},e.prototype.hash=function(e){var t=[];for(var n in e)t.push(Object.prototype.toString.call(e[n]));return t.join()},e.prototype.get=function(e){if(this.length<=180)for(var t in this.map)for(var n=this.map[t],r=0;r<n.length;r+=1){if((i=n[r])[0]===e)return i[1]}else{var s=this.hash(e);if(n=this.map[s])for(r=0;r<n.length;r+=1){var i;if((i=n[r])[0]===e)return i[1]}}},e}();const w=r(function(e){return null!=e&&"function"==typeof e.clone?e.clone():_(e,!0)});class O{get(e){return this[e]}set(e,t){this[e]=t}hasKey(e){return Object.hasOwn(this,e)}keys(){return Object.keys(this)}remove(e){delete this[e]}get isEmpty(){return 0===Object.keys(this).length}get isFrozen(){return Object.isFrozen(this)}freeze(){for(const e of Object.values(this))e instanceof this.Element?e.freeze():(Array.isArray(e)||null!==e&&"object"==typeof e)&&Object.freeze(e);Object.freeze(this)}cloneShallow(){const e=new O;return Object.assign(e,this),e}merge(e){const t=this.cloneShallow();for(const[n,r]of Object.entries(e)){const e=t.get(n);Array.isArray(e)&&Array.isArray(r)?t.set(n,[...e,...r]):t.set(n,r)}return t}cloneDeep(){const e=new O;for(const[t,n]of Object.entries(this))n instanceof this.Element?e.set(t,this.cloneDeepElement(n)):e.set(t,w(n));return e}}const A=O;const j=class{key;value;constructor(e,t){this.key=e,this.value=t}toValue(){return{key:this.key?.toValue(),value:this.value?.toValue()}}};class k{elements;constructor(e){this.elements=e??[]}toValue(){return this.elements.map(e=>({key:e.key?.toValue(),value:e.value?.toValue()}))}map(e,t){return this.elements.map(n=>{const r=n.value,s=n.key;if(void 0===r||void 0===s)throw new Error("MemberElement must have both key and value");return void 0!==t?e.call(t,r,s,n):e(r,s,n)})}filter(e,t){const n=this.elements.filter(n=>{const r=n.value,s=n.key;return void 0!==r&&void 0!==s&&(void 0!==t?e.call(t,r,s,n):e(r,s,n))});return new k(n)}reject(e,t){const n=[];for(const r of this.elements){const s=r.value,i=r.key;void 0!==s&&void 0!==i&&(e.call(t,s,i,r)||n.push(r))}return new k(n)}forEach(e,t){this.elements.forEach((n,r)=>{const s=n.value,i=n.key;void 0!==s&&void 0!==i&&(void 0!==t?e.call(t,s,i,n,r):e(s,i,n,r))})}find(e,t){return this.elements.find(n=>{const r=n.value,s=n.key;return void 0!==r&&void 0!==s&&(void 0!==t?e.call(t,r,s,n):e(r,s,n))})}keys(){return this.elements.map(e=>e.key?.toValue()).filter(e=>void 0!==e)}values(){return this.elements.map(e=>e.value?.toValue()).filter(e=>void 0!==e)}get length(){return this.elements.length}get isEmpty(){return 0===this.length}get first(){return this.elements[0]}get(e){return this.elements[e]}push(e){return this.elements.push(e),this}includesKey(e){return this.elements.some(t=>t.key?.equals(e))}[Symbol.iterator](){return this.elements[Symbol.iterator]()}}const M=k,S=Object.freeze(new A);class P{parent;style;startLine;startCharacter;startOffset;endLine;endCharacter;endOffset;_storedElement="element";_content;_meta;_attributes;constructor(e,t,n){void 0!==t&&(this.meta=t),void 0!==n&&(this.attributes=n),void 0!==e&&(this.content=e)}get element(){return this._storedElement}set element(e){this._storedElement=e}get content(){return this._content}set content(e){if(e instanceof P)this._content=e;else if(null!=e&&"string"!=typeof e&&"number"!=typeof e&&"boolean"!=typeof e&&"bigint"!=typeof e&&"symbol"!=typeof e)if(e instanceof j)this._content=e;else if(e instanceof M)this._content=e.elements;else if(Array.isArray(e))this._content=e.map(e=>this.refract(e));else{if("object"!=typeof e)throw new Error("Cannot set content to value of type "+typeof e);this._content=Object.entries(e).map(([e,t])=>new this.MemberElement(e,t))}else this._content=e}get meta(){if(!this._meta){if(this.isFrozen)return S;this._meta=new A}return this._meta}set meta(e){if(e instanceof A)this._meta=e;else if(e&&"object"==typeof e){const t=new A;Object.assign(t,e),this._meta=t}}get attributes(){if(!this._attributes){if(this.isFrozen){const e=new this.ObjectElement;return e.freeze(),e}this._attributes=new this.ObjectElement}return this._attributes}set attributes(e){e instanceof P?this._attributes=e:this.attributes.set(e??{})}get id(){if(!this.hasMetaProperty("id")){if(this.isFrozen)return"";this.setMetaProperty("id","")}return this.meta.get("id")}set id(e){this.setMetaProperty("id",e)}get classes(){if(!this.hasMetaProperty("classes")){if(this.isFrozen)return[];this.setMetaProperty("classes",[])}return this.meta.get("classes")}set classes(e){this.setMetaProperty("classes",e)}get links(){if(!this.hasMetaProperty("links")){if(this.isFrozen){const e=new this.ArrayElement;return e.freeze(),e}this.setMetaProperty("links",new this.ArrayElement)}return this.meta.get("links")}set links(e){this.setMetaProperty("links",e)}get children(){const{_content:e}=this;if(Array.isArray(e))return e;if(e instanceof j){const t=[];return e.key&&t.push(e.key),e.value&&t.push(e.value),t}return e instanceof P?[e]:[]}get isFrozen(){return Object.isFrozen(this)}freeze(){if(!this.isFrozen){this._meta&&this._meta.freeze(),this._attributes&&(this._attributes.parent=this,this._attributes.freeze());for(const e of this.children)e.parent=this,e.freeze();Array.isArray(this._content)&&Object.freeze(this._content),Object.freeze(this)}}toValue(){const{_content:e}=this;return e instanceof P||e instanceof j?e.toValue():Array.isArray(e)?e.map(e=>e.toValue()):e}equals(e){const t=e instanceof P?e.toValue():e;return v(this.toValue(),t)}primitive(){}set(e){return this.content=e,this}toRef(e){const t=this.id;if(""===t)throw new Error("Cannot create reference to an element without an ID");const n=new this.RefElement(t);return"string"==typeof e&&(n.path=this.refract(e)),n}getMetaProperty(e,t){return this.hasMetaProperty(e)?this.meta.get(e):t}setMetaProperty(e,t){this.meta.set(e,t)}hasMetaProperty(e){return void 0!==this._meta&&this._meta.hasKey(e)}get isMetaEmpty(){return void 0===this._meta||this._meta.isEmpty}getAttributesProperty(e,t){if(!this.hasAttributesProperty(e)){if(this.isFrozen){const e=this.refract(t);return e.freeze(),e}this.attributes.set(e,t)}return this.attributes.get(e)}setAttributesProperty(e,t){this.attributes.set(e,t)}hasAttributesProperty(e){return!this.isAttributesEmpty&&this.attributes.hasKey(e)}get isAttributesEmpty(){return void 0===this._attributes||this.attributes.isEmpty}}const C=P;const V=class extends C{constructor(e,t,n){super(e,t,n),this.element="string"}primitive(){return"string"}get length(){return this.content?.length??0}};class x extends V{constructor(e,t,n){super(e,t,n),this.element="sourceMap"}static transfer(e,t){t.startLine=e.startLine,t.startCharacter=e.startCharacter,t.startOffset=e.startOffset,t.endLine=e.endLine,t.endCharacter=e.endCharacter,t.endOffset=e.endOffset}static from(e){const{startLine:t,startCharacter:n,startOffset:r,endLine:s,endCharacter:i,endOffset:o}=e;if("number"!=typeof t||"number"!=typeof n||"number"!=typeof r||"number"!=typeof s||"number"!=typeof i||"number"!=typeof o)return;const a="sm1:"+[t,n,r,s,i,o].map(D).join("");const c=new x(a);return c.startLine=t,c.startCharacter=n,c.startOffset=r,c.endLine=s,c.endCharacter=i,c.endOffset=o,c}applyTo(e){this.content&&([e.startLine,e.startCharacter,e.startOffset,e.endLine,e.endCharacter,e.endOffset]=function(e){const t=e.startsWith("sm1:")?e.slice(4):e,n=[];let r=0;for(let e=0;e<6;e++){const e=L(t,r);n.push(e.value),r=e.next}return n}(this.content))}}const z="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function D(e){let t=e>>>0,n="";do{let e=31&t;t>>>=5,0!==t&&(e|=32),n+=z[e]}while(0!==t);return n}function L(e,t=0){let n=0,r=0,s=t;for(;;){const t=e[s++],i=z.indexOf(t);if(-1===i)throw new Error(`Invalid Base64 VLQ char: ${t}`);if(n|=(31&i)<<r,r+=5,!!!(32&i))break}return{value:n>>>0,next:s}}const I=x;class q extends C{constructor(e,t,n){super(e||[],t,n)}get length(){return this._content.length}get isEmpty(){return 0===this.length}get first(){return this._content[0]}get second(){return this._content[1]}get last(){return this._content.at(-1)}push(...e){for(const t of e)this._content.push(this.refract(t));return this}shift(){return this._content.shift()}unshift(e){this._content.unshift(this.refract(e))}includes(e){return this._content.some(t=>t.equals(e))}findElements(e,t){const n=t||{},r=!!n.recursive,s=void 0===n.results?[]:n.results;for(let t=0;t<this._content.length;t+=1){const n=this._content[t],i=n;r&&"function"==typeof i.findElements&&i.findElements(e,{results:s,recursive:r}),e(n,t,void 0)&&s.push(n)}return s}find(e){const t=this.findElements(e,{recursive:!0});return new this.ArrayElement(t)}findByElement(e){return this.find(t=>t.element===e)}findByClass(e){return this.find(t=>{const n=t.classes;return"function"==typeof n.includes&&n.includes(e)})}getById(e){return this.find(t=>t.id===e).first}concat(e){return new(0,this.constructor)(this._content.concat(e._content))}[Symbol.iterator](){return this._content[Symbol.iterator]()}}const F=q;const K=class extends C{constructor(e,t,n,r){super(new j,n,r),this.element="member",void 0!==e&&(this.key=e),arguments.length>=2&&(this.value=t)}primitive(){return"member"}get key(){return this._content.key}set key(e){this._content.key=this.refract(e)}get value(){return this._content.value}set value(e){this._content.value=void 0===e?void 0:this.refract(e)}};const R=class extends F{constructor(e,t,n){super(e||[],t,n),this.element="object"}primitive(){return"object"}toValue(){return this._content.reduce((e,t)=>(e[t.key.toValue()]=t.value?t.value.toValue():void 0,e),{})}get(e){const t=this.getMember(e);if(t)return t.value}getValue(e){const t=this.get(e);if(t)return t.toValue()}getMember(e){if(void 0!==e)return this._content.find(t=>t.key.toValue()===e)}remove(e){let t=null;return this.content=this._content.filter(n=>n.key.toValue()!==e||(t=n,!1)),t}getKey(e){const t=this.getMember(e);if(t)return t.key}set(e,t){if("string"==typeof e){const n=this.getMember(e);n?n.value=t:this._content.push(new K(e,t))}else if("object"==typeof e&&!Array.isArray(e))for(const t of Object.keys(e))this.set(t,e[t]);return this}keys(){return this._content.map(e=>e.key.toValue())}values(){return this._content.map(e=>e.value.toValue())}hasKey(e){return this._content.some(t=>t.key.equals(e))}items(){return this._content.map(e=>[e.key.toValue(),e.value.toValue()])}map(e,t){return this._content.map(n=>e.call(t,n.value,n.key,n))}compactMap(e,t){const n=[];return this.forEach((r,s,i)=>{const o=e.call(t,r,s,i);o&&n.push(o)}),n}filter(e,t){return new M(this._content).filter(e,t)}reject(e,t){const n=[];for(const r of this._content)e.call(t,r.value,r.key,r)||n.push(r);return new M(n)}forEach(e,t){this._content.forEach(n=>e.call(t,n.value,n.key,n))}reduce(e,t){let n,r;void 0!==t?(n=0,r=this.refract(t)):(n=1,r=this._content[0]?.value);for(let t=n;t<this._content.length;t+=1){const n=this._content[t],s=e(r,n.value,n.key,n,this);r=void 0===s?s:this.refract(s)}return r}empty(){return new this.constructor([])}};class B extends R{constructor(e,t,n){super(e,t,n),this.element="__styles__"}static transfer(e,t){t.style=e.style}static from(e){if(e.style)return new B(e.style)}applyTo(e){e.style=this.toValue()}}const N=B;const T=class{namespace;constructor(e){this.namespace=e||new this.Namespace}serialise(e){if(!(e instanceof this.namespace.elements.Element))throw new TypeError(`Given element \`${e}\` is not an Element instance`);const t={element:e.element};if(!e.isMetaEmpty){const n=this.serialiseMeta(e);n&&(t.meta=n.meta,n.rawKeys.length>0&&(t.__meta_raw__=n.rawKeys))}if(e.isAttributesEmpty||(t.attributes=this.serialiseObject(e.attributes)),!(e instanceof I)){const n=I.from(e);n&&(t.meta||(t.meta={}),t.meta.__mappings__=this.serialise(n))}if(!(e instanceof N)){const n=N.from(e);n&&(t.meta||(t.meta={}),t.meta.__styles__=this.serialise(n))}const n=this.serialiseContent(e.content);return void 0!==n&&(t.content=n),t}deserialise(e){if(!e.element)throw new Error("Given value is not an object containing an element name");const t=new(this.namespace.getElementClass(e.element));let n,r;t.element!==e.element&&(t.element=e.element);let s=e.meta;if(e.meta?.__mappings__||e.meta?.__styles__){const{__mappings__:t,__styles__:i,...o}=e.meta;n=t,r=i,s=Object.keys(o).length>0?o:void 0}const i=e.__meta_raw__?new Set(e.__meta_raw__):void 0;if(s)for(const[e,n]of Object.entries(s)){const r=this.deserialise(n);t.setMetaProperty(e,i?.has(e)?r.toValue():r)}if(n){this.deserialise(n).applyTo(t)}if(r){this.deserialise(r).applyTo(t)}e.attributes&&this.deserialiseObject(e.attributes,t.attributes);const o=this.deserialiseContent(e.content);return void 0===o&&null!==t.content||(t.content=o),t}serialiseContent(e){if(e instanceof this.namespace.elements.Element)return this.serialise(e);if(e instanceof this.namespace.KeyValuePair){const t=e,n={key:this.serialise(t.key)};return t.value&&(n.value=this.serialise(t.value)),n}if(e&&Array.isArray(e)){if(0===e.length)return;return e.map(e=>this.serialise(e))}return e}deserialiseContent(e){if(e){if(e.element)return this.deserialise(e);if(e.key){const t=new this.namespace.KeyValuePair(this.deserialise(e.key));return e.value&&(t.value=this.deserialise(e.value)),t}if(Array.isArray(e))return e.map(e=>this.deserialise(e))}return e}serialiseMeta(e){const t={},n=[];let r=!1;for(const[s,i]of Object.entries(e.meta))if(i instanceof this.namespace.elements.Element)t[s]=this.serialise(i),r=!0;else if(void 0!==i){const o=e.refract(i);t[s]=this.serialise(o),n.push(s),r=!0}return r?{meta:t,rawKeys:n}:void 0}serialiseObject(e){const t={};if(e.forEach((e,n)=>{e&&(t[n.toValue()]=this.serialise(e))}),0!==Object.keys(t).length)return t}deserialiseObject(e,t){Object.keys(e).forEach(n=>{t.set(n,this.deserialise(e[n]))})}};const U=class extends C{constructor(e,t,n){super(e??null,t,n),this.element="null"}primitive(){return"null"}set(e){throw new Error("Cannot set the value of null")}};const W=class extends C{constructor(e,t,n){super(e,t,n),this.element="number"}primitive(){return"number"}};const G=class extends C{constructor(e,t,n){super(e,t,n),this.element="boolean"}primitive(){return"boolean"}};const J=class extends F{constructor(e,t,n){super(e||[],t,n),this.element="array"}primitive(){return"array"}get(e){return this._content[e]}getValue(e){const t=this.get(e);if(t)return t.toValue()}set(e,t){return"number"==typeof e&&void 0!==t?this._content[e]=this.refract(t):this.content=e,this}remove(e){return this._content.splice(e,1)[0]??null}map(e,t){return this._content.map(e,t)}flatMap(e,t){return this._content.flatMap(e,t)}compactMap(e,t){const n=[];for(const r of this._content){const s=e.call(t,r);s&&n.push(s)}return n}filter(e,t){const n=this._content.filter(e,t);return new this.constructor(n)}reject(e,t){const n=[];for(const r of this._content)e.call(t,r)||n.push(r);return new this.constructor(n)}reduce(e,t){let n,r;void 0!==t?(n=0,r=this.refract(t)):(n=1,r=this.first);for(let t=n;t<this.length;t+=1){const n=e(r,this._content[t],t,this);r=void 0===n?n:this.refract(n)}return r}forEach(e,t){this._content.forEach((n,r)=>{e.call(t,n,r)})}empty(){return new this.constructor([])}};const Q=class extends C{constructor(e,t,n){super(e||[],t,n),this.element="ref",this.path||(this.path="element")}get path(){if(this.hasAttributesProperty("path"))return this.attributes.get("path")}set path(e){this.attributes.set("path",e)}};const $=class extends C{constructor(e,t,n){super(e||[],t,n),this.element="link"}get relation(){if(this.hasAttributesProperty("relation"))return this.attributes.get("relation")}set relation(e){this.attributes.set("relation",e)}get href(){if(this.hasAttributesProperty("href"))return this.attributes.get("href")}set href(e){this.attributes.set("href",e)}},H=e=>null===e,X=e=>"string"==typeof e,Y=e=>"number"==typeof e,Z=e=>"boolean"==typeof e,ee=e=>null!==e&&"object"==typeof e;class te{elementMap={};elementDetection=[];Element;KeyValuePair;_elements;_attributeElementKeys=[];_attributeElementArrayKeys=[];constructor(e){this.Element=C,this.KeyValuePair=j,e&&e.noDefault||this.useDefault()}use(e){return e.namespace&&e.namespace({base:this}),e.load&&e.load({base:this}),this}useDefault(){return this.register("null",U).register("string",V).register("number",W).register("boolean",G).register("array",J).register("object",R).register("member",K).register("ref",Q).register("link",$).register("sourceMap",I),this.detect(H,U,!1).detect(X,V,!1).detect(Y,W,!1).detect(Z,G,!1).detect(Array.isArray,J,!1).detect(ee,R,!1),this}register(e,t){return this._elements=void 0,this.elementMap[e]=t,this}unregister(e){return this._elements=void 0,delete this.elementMap[e],this}detect(e,t,n){return void 0===n||n?this.elementDetection.unshift([e,t]):this.elementDetection.push([e,t]),this}toElement(e){if(e instanceof this.Element)return e;let t;for(const[n,r]of this.elementDetection)if(n(e)){t=new r(e);break}return t}getElementClass(e){const t=this.elementMap[e];return void 0===t?this.Element:t}fromRefract(e){return this.serialiser.deserialise(e)}toRefract(e){return this.serialiser.serialise(e)}get elements(){return void 0===this._elements&&(this._elements={Element:this.Element},Object.keys(this.elementMap).forEach(e=>{const t=e[0].toUpperCase()+e.substring(1);this._elements[t]=this.elementMap[e]})),this._elements}get serialiser(){return new T(this)}}T.prototype.Namespace=te;const ne=te,re=e=>e instanceof C,se=e=>e instanceof V,ie=e=>e instanceof W,oe=e=>e instanceof U,ae=e=>e instanceof G,ce=e=>e instanceof J,le=e=>e instanceof R,ue=e=>e instanceof K,he=e=>le(e)&&"object"===e.element||ce(e)&&"array"===e.element||ae(e)&&"boolean"===e.element||ie(e)&&"number"===e.element||se(e)&&"string"===e.element||oe(e)&&"null"===e.element||ue(e)&&"member"===e.element,fe=e=>void 0!==e.style,me=e=>"number"==typeof e.startLine&&"number"==typeof e.startCharacter&&"number"==typeof e.startOffset&&"number"==typeof e.endLine&&"number"==typeof e.endCharacter&&"number"==typeof e.endOffset,pe=(e,t)=>{if(0===t.length)return!0;if(!e.hasAttributesProperty("symbols"))return!1;const n=e.attributes.get("symbols");return!!ce(n)&&t.every(e=>n.includes(e))},ye=(e,t)=>0===t.length||!!re(e)&&(!e.isMetaEmpty&&(!!e.hasMetaProperty("classes")&&t.every(t=>e.classes.includes(t))));class de extends AggregateError{constructor(e,t,n){super(e,t,n),this.name=this.constructor.name,"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}}const be=de;class ge extends Error{static[Symbol.hasInstance](e){return super[Symbol.hasInstance](e)||Function.prototype[Symbol.hasInstance].call(be,e)}constructor(e,t){super(e,t),this.name=this.constructor.name,"function"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}}const ve=ge;const _e=class extends ve{constructor(e,t){if(super(e,t),null!=t&&"object"==typeof t){const{cause:e,...n}=t;Object.assign(this,n)}}};const Ee=class extends _e{value;constructor(e,t){super(e,t),void 0!==t&&(this.value=t.value)}};const we=class extends Ee{};const Oe=class extends Ee{},Ae=(e,t)=>{const{visited:n=new WeakMap}=t,r={...t,visited:n};if(n.has(e))return n.get(e);const s=Se(e);n.set(e,s);const{content:i}=e;return Array.isArray(i)?s.content=i.map(e=>Ae(e,r)):re(i)?s.content=Ae(i,r):s.content=i instanceof j?je(i,r):i,s},je=(e,t)=>{const{visited:n=new WeakMap}=t,r={...t,visited:n};if(n.has(e))return n.get(e);const{key:s,value:i}=e,o=void 0!==s?Ae(s,r):void 0,a=void 0!==i?Ae(i,r):void 0,c=new j(o,a);return n.set(e,c),c},ke=(e,t={})=>{if(e instanceof j)return je(e,t);if(e instanceof M)return((e,t)=>{const{visited:n=new WeakMap}=t,r={...t,visited:n};if(n.has(e))return n.get(e);const s=[...e].map(e=>Ae(e,r)),i=new M(s);return n.set(e,i),i})(e,t);if(re(e))return Ae(e,t);throw new we("Value provided to cloneDeep function couldn't be cloned",{value:e})};ke.safe=e=>{try{return ke(e)}catch{return e}};const Me=e=>{const{key:t,value:n}=e;return new j(t,n)},Se=e=>{const t=new(0,e.constructor);t.element=e.element,e.isMetaEmpty||(t.meta=e.meta.cloneDeep()),e.isAttributesEmpty||(t.attributes=ke(e.attributes)),me(e)&&I.transfer(e,t),fe(e)&&(t.style=w(e.style));const{content:n}=e;return re(n)?t.content=Se(n):Array.isArray(n)?t.content=[...n]:t.content=n instanceof j?Me(n):n,t},Pe=e=>{if(e instanceof j)return Me(e);if(e instanceof M)return(e=>{const t=[...e];return new M(t)})(e);if(re(e))return Se(e);throw new Oe("Value provided to cloneShallow function couldn't be cloned",{value:e})};function Ce(e){return void 0===e?new U:Ve(e)}function Ve(e){if(e instanceof C)return e;if("string"==typeof e)return new V(e);if("number"==typeof e)return new W(e);if("boolean"==typeof e)return new G(e);if(null===e)return new U;if(Array.isArray(e))return new J(e.map(Ce));if("object"==typeof e)return new R(e);throw new Error("Cannot refract value of type "+typeof e)}Pe.safe=e=>{try{return Pe(e)}catch{return e}},C.prototype.ObjectElement=R,C.prototype.ArrayElement=J,C.prototype.RefElement=Q,C.prototype.MemberElement=K,C.prototype.refract=Ve,A.prototype.Element=C,A.prototype.cloneDeepElement=e=>ke(e);const xe=class extends V{constructor(e,t,n){super(e,t,n),this.element="annotation"}get code(){if(this.hasAttributesProperty("code"))return this.attributes.get("code")}set code(e){this.attributes.set("code",e)}};const ze=class extends V{constructor(e,t,n){super(e,t,n),this.element="comment"}};const De=class extends J{constructor(e,t,n){super(e,t,n),this.element="parseResult"}get api(){return this.filter(e=>ye(e,["api"])).first}get results(){return this.filter(e=>ye(e,["result"]))}get result(){return this.results.first}get annotations(){return this.filter(e=>"annotation"===e.element)}get warnings(){return this.filter(e=>"annotation"===e.element&&ye(e,["warning"]))}get errors(){return this.filter(e=>"annotation"===e.element&&ye(e,["error"]))}get isEmpty(){return 0===this.reject(e=>"annotation"===e.element).length}replaceResult(e){const{result:t}=this;if(void 0===t)return!1;const n=this._content,r=n.findIndex(e=>e===t);return-1!==r&&(n[r]=e,!0)}},Le=e=>e instanceof $,Ie=e=>e instanceof Q,qe=e=>e instanceof xe,Fe=e=>e instanceof ze,Ke=e=>e instanceof De,Re=e=>e instanceof I;return t})());
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@speclynx/apidom-datamodel",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "Data model primitives for ApiDOM.",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"license": "Apache-2.0",
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@babel/runtime-corejs3": "^7.28.4",
|
|
42
|
-
"@speclynx/apidom-error": "
|
|
42
|
+
"@speclynx/apidom-error": "3.0.0",
|
|
43
43
|
"ramda": "~0.32.0"
|
|
44
44
|
},
|
|
45
45
|
"files": [
|
|
@@ -52,5 +52,5 @@
|
|
|
52
52
|
"README.md",
|
|
53
53
|
"CHANGELOG.md"
|
|
54
54
|
],
|
|
55
|
-
"gitHead": "
|
|
55
|
+
"gitHead": "cb94ec84ea789d121801065876e7a91799a363d0"
|
|
56
56
|
}
|
package/src/Metadata.cjs
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
exports.__esModule = true;
|
|
4
|
+
exports.default = void 0;
|
|
5
|
+
var _ramda = require("ramda");
|
|
6
|
+
/**
|
|
7
|
+
* Lightweight meta container for Element metadata.
|
|
8
|
+
*
|
|
9
|
+
* Data is stored as own properties on the instance; methods live on the prototype.
|
|
10
|
+
* `Object.keys()`, `Object.entries()`, etc. only see data properties.
|
|
11
|
+
*
|
|
12
|
+
* @public
|
|
13
|
+
*/
|
|
14
|
+
class Metadata {
|
|
15
|
+
// Set via prototype assignment in registration.ts to avoid circular dependency
|
|
16
|
+
|
|
17
|
+
get(name) {
|
|
18
|
+
return this[name];
|
|
19
|
+
}
|
|
20
|
+
set(name, value) {
|
|
21
|
+
this[name] = value;
|
|
22
|
+
}
|
|
23
|
+
hasKey(name) {
|
|
24
|
+
return Object.hasOwn(this, name);
|
|
25
|
+
}
|
|
26
|
+
keys() {
|
|
27
|
+
return Object.keys(this);
|
|
28
|
+
}
|
|
29
|
+
remove(name) {
|
|
30
|
+
delete this[name];
|
|
31
|
+
}
|
|
32
|
+
get isEmpty() {
|
|
33
|
+
return Object.keys(this).length === 0;
|
|
34
|
+
}
|
|
35
|
+
get isFrozen() {
|
|
36
|
+
return Object.isFrozen(this);
|
|
37
|
+
}
|
|
38
|
+
freeze() {
|
|
39
|
+
for (const value of Object.values(this)) {
|
|
40
|
+
if (value instanceof this.Element) {
|
|
41
|
+
value.freeze();
|
|
42
|
+
} else if (Array.isArray(value) || value !== null && typeof value === 'object') {
|
|
43
|
+
Object.freeze(value);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
Object.freeze(this);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Creates a shallow clone. Same references, new container.
|
|
51
|
+
*/
|
|
52
|
+
cloneShallow() {
|
|
53
|
+
const clone = new Metadata();
|
|
54
|
+
Object.assign(clone, this);
|
|
55
|
+
return clone;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Merges another Metadata into a new instance.
|
|
60
|
+
* Arrays are concatenated, all other values are overwritten by source.
|
|
61
|
+
*/
|
|
62
|
+
merge(source) {
|
|
63
|
+
const result = this.cloneShallow();
|
|
64
|
+
for (const [key, value] of Object.entries(source)) {
|
|
65
|
+
const existing = result.get(key);
|
|
66
|
+
if (Array.isArray(existing) && Array.isArray(value)) {
|
|
67
|
+
result.set(key, [...existing, ...value]);
|
|
68
|
+
} else {
|
|
69
|
+
result.set(key, value);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return result;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Creates a deep clone. Elements are deep cloned,
|
|
77
|
+
* all other values are deep cloned via ramda clone.
|
|
78
|
+
*/
|
|
79
|
+
cloneDeep() {
|
|
80
|
+
const copy = new Metadata();
|
|
81
|
+
for (const [key, value] of Object.entries(this)) {
|
|
82
|
+
if (value instanceof this.Element) {
|
|
83
|
+
copy.set(key, this.cloneDeepElement(value));
|
|
84
|
+
} else {
|
|
85
|
+
copy.set(key, (0, _ramda.clone)(value));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return copy;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
var _default = exports.default = Metadata;
|
package/src/Metadata.mjs
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { clone } from 'ramda';
|
|
2
|
+
/**
|
|
3
|
+
* Lightweight meta container for Element metadata.
|
|
4
|
+
*
|
|
5
|
+
* Data is stored as own properties on the instance; methods live on the prototype.
|
|
6
|
+
* `Object.keys()`, `Object.entries()`, etc. only see data properties.
|
|
7
|
+
*
|
|
8
|
+
* @public
|
|
9
|
+
*/
|
|
10
|
+
class Metadata {
|
|
11
|
+
// Set via prototype assignment in registration.ts to avoid circular dependency
|
|
12
|
+
|
|
13
|
+
get(name) {
|
|
14
|
+
return this[name];
|
|
15
|
+
}
|
|
16
|
+
set(name, value) {
|
|
17
|
+
this[name] = value;
|
|
18
|
+
}
|
|
19
|
+
hasKey(name) {
|
|
20
|
+
return Object.hasOwn(this, name);
|
|
21
|
+
}
|
|
22
|
+
keys() {
|
|
23
|
+
return Object.keys(this);
|
|
24
|
+
}
|
|
25
|
+
remove(name) {
|
|
26
|
+
delete this[name];
|
|
27
|
+
}
|
|
28
|
+
get isEmpty() {
|
|
29
|
+
return Object.keys(this).length === 0;
|
|
30
|
+
}
|
|
31
|
+
get isFrozen() {
|
|
32
|
+
return Object.isFrozen(this);
|
|
33
|
+
}
|
|
34
|
+
freeze() {
|
|
35
|
+
for (const value of Object.values(this)) {
|
|
36
|
+
if (value instanceof this.Element) {
|
|
37
|
+
value.freeze();
|
|
38
|
+
} else if (Array.isArray(value) || value !== null && typeof value === 'object') {
|
|
39
|
+
Object.freeze(value);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
Object.freeze(this);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Creates a shallow clone. Same references, new container.
|
|
47
|
+
*/
|
|
48
|
+
cloneShallow() {
|
|
49
|
+
const clone = new Metadata();
|
|
50
|
+
Object.assign(clone, this);
|
|
51
|
+
return clone;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Merges another Metadata into a new instance.
|
|
56
|
+
* Arrays are concatenated, all other values are overwritten by source.
|
|
57
|
+
*/
|
|
58
|
+
merge(source) {
|
|
59
|
+
const result = this.cloneShallow();
|
|
60
|
+
for (const [key, value] of Object.entries(source)) {
|
|
61
|
+
const existing = result.get(key);
|
|
62
|
+
if (Array.isArray(existing) && Array.isArray(value)) {
|
|
63
|
+
result.set(key, [...existing, ...value]);
|
|
64
|
+
} else {
|
|
65
|
+
result.set(key, value);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Creates a deep clone. Elements are deep cloned,
|
|
73
|
+
* all other values are deep cloned via ramda clone.
|
|
74
|
+
*/
|
|
75
|
+
cloneDeep() {
|
|
76
|
+
const copy = new Metadata();
|
|
77
|
+
for (const [key, value] of Object.entries(this)) {
|
|
78
|
+
if (value instanceof this.Element) {
|
|
79
|
+
copy.set(key, this.cloneDeepElement(value));
|
|
80
|
+
} else {
|
|
81
|
+
copy.set(key, clone(value));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return copy;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export default Metadata;
|
package/src/clone/index.cjs
CHANGED
|
@@ -132,7 +132,7 @@ const cloneShallowElement = element => {
|
|
|
132
132
|
const copy = new Ctor();
|
|
133
133
|
copy.element = element.element;
|
|
134
134
|
if (!element.isMetaEmpty) {
|
|
135
|
-
copy.meta =
|
|
135
|
+
copy.meta = element.meta.cloneDeep();
|
|
136
136
|
}
|
|
137
137
|
if (!element.isAttributesEmpty) {
|
|
138
138
|
copy.attributes = cloneDeep(element.attributes);
|
|
@@ -160,8 +160,8 @@ const cloneShallowElement = element => {
|
|
|
160
160
|
|
|
161
161
|
/**
|
|
162
162
|
* Creates a shallow clone of an ApiDOM Element, KeyValuePair, or ObjectSlice.
|
|
163
|
-
* The element itself is cloned, but content references are shared
|
|
164
|
-
*
|
|
163
|
+
* The element itself is cloned, but content references are shared.
|
|
164
|
+
* Meta and attributes are deep cloned to preserve semantic information.
|
|
165
165
|
* @public
|
|
166
166
|
*/
|
|
167
167
|
const cloneShallow = value => {
|
package/src/clone/index.mjs
CHANGED
|
@@ -120,7 +120,7 @@ const cloneShallowElement = element => {
|
|
|
120
120
|
const copy = new Ctor();
|
|
121
121
|
copy.element = element.element;
|
|
122
122
|
if (!element.isMetaEmpty) {
|
|
123
|
-
copy.meta =
|
|
123
|
+
copy.meta = element.meta.cloneDeep();
|
|
124
124
|
}
|
|
125
125
|
if (!element.isAttributesEmpty) {
|
|
126
126
|
copy.attributes = cloneDeep(element.attributes);
|
|
@@ -148,8 +148,8 @@ const cloneShallowElement = element => {
|
|
|
148
148
|
|
|
149
149
|
/**
|
|
150
150
|
* Creates a shallow clone of an ApiDOM Element, KeyValuePair, or ObjectSlice.
|
|
151
|
-
* The element itself is cloned, but content references are shared
|
|
152
|
-
*
|
|
151
|
+
* The element itself is cloned, but content references are shared.
|
|
152
|
+
* Meta and attributes are deep cloned to preserve semantic information.
|
|
153
153
|
* @public
|
|
154
154
|
*/
|
|
155
155
|
export const cloneShallow = value => {
|
package/src/index.cjs
CHANGED
|
@@ -2,11 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
|
|
4
4
|
exports.__esModule = true;
|
|
5
|
-
exports.refract = exports.isStringElement = exports.isSourceMapElement = exports.isRefElement = exports.isPrimitiveElement = exports.isParseResultElement = exports.isObjectElement = exports.isNumberElement = exports.isNullElement = exports.isMemberElement = exports.isLinkElement = exports.isElement = exports.isCommentElement = exports.isBooleanElement = exports.isArrayElement = exports.isAnnotationElement = exports.includesSymbols = exports.includesClasses = exports.hasElementStyle = exports.hasElementSourceMap = exports.cloneShallow = exports.cloneDeep = exports.StyleElement = exports.StringElement = exports.SourceMapElement = exports.ShallowCloneError = exports.RefElement = exports.ParseResultElement = exports.ObjectSlice = exports.ObjectElement = exports.NumberElement = exports.NullElement = exports.Namespace = exports.MemberElement = exports.LinkElement = exports.KeyValuePair = exports.JSONSerialiser = exports.Element = exports.DeepCloneError = exports.CommentElement = exports.CollectionElement = exports.CloneError = exports.BooleanElement = exports.ArrayElement = exports.AnnotationElement = void 0;
|
|
5
|
+
exports.refract = exports.isStringElement = exports.isSourceMapElement = exports.isRefElement = exports.isPrimitiveElement = exports.isParseResultElement = exports.isObjectElement = exports.isNumberElement = exports.isNullElement = exports.isMemberElement = exports.isLinkElement = exports.isElement = exports.isCommentElement = exports.isBooleanElement = exports.isArrayElement = exports.isAnnotationElement = exports.includesSymbols = exports.includesClasses = exports.hasElementStyle = exports.hasElementSourceMap = exports.cloneShallow = exports.cloneDeep = exports.StyleElement = exports.StringElement = exports.SourceMapElement = exports.ShallowCloneError = exports.RefElement = exports.ParseResultElement = exports.ObjectSlice = exports.ObjectElement = exports.NumberElement = exports.NullElement = exports.Namespace = exports.Metadata = exports.MemberElement = exports.LinkElement = exports.KeyValuePair = exports.JSONSerialiser = exports.Element = exports.DeepCloneError = exports.CommentElement = exports.CollectionElement = exports.CloneError = exports.BooleanElement = exports.ArrayElement = exports.AnnotationElement = void 0;
|
|
6
6
|
var _Namespace = _interopRequireDefault(require("./Namespace.cjs"));
|
|
7
7
|
exports.Namespace = _Namespace.default;
|
|
8
8
|
var _KeyValuePair = _interopRequireDefault(require("./KeyValuePair.cjs"));
|
|
9
9
|
exports.KeyValuePair = _KeyValuePair.default;
|
|
10
|
+
var _Metadata = _interopRequireDefault(require("./Metadata.cjs"));
|
|
11
|
+
exports.Metadata = _Metadata.default;
|
|
10
12
|
var _index = require("./clone/index.cjs");
|
|
11
13
|
exports.cloneShallow = _index.cloneShallow;
|
|
12
14
|
exports.cloneDeep = _index.cloneDeep;
|
package/src/index.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { default as Namespace } from "./Namespace.mjs";
|
|
2
|
-
export { default as KeyValuePair } from "./KeyValuePair.mjs";
|
|
2
|
+
export { default as KeyValuePair } from "./KeyValuePair.mjs";
|
|
3
|
+
export { default as Metadata } from "./Metadata.mjs"; // Clone utilities
|
|
3
4
|
export { cloneShallow, cloneDeep, CloneError, DeepCloneError, ShallowCloneError } from "./clone/index.mjs";
|
|
4
5
|
// Re-export elements directly to preserve JSDoc
|
|
5
6
|
export { ObjectSlice, Element, CollectionElement, StringElement, NumberElement, BooleanElement, NullElement, ArrayElement, ObjectElement, MemberElement, RefElement, LinkElement, AnnotationElement, CommentElement, ParseResultElement, SourceMapElement, StyleElement, refract } from "./registration.mjs";
|
|
@@ -157,7 +157,7 @@ class CollectionElement extends _Element.default {
|
|
|
157
157
|
* Search the tree recursively and find the element with the matching ID.
|
|
158
158
|
*/
|
|
159
159
|
getById(id) {
|
|
160
|
-
return this.find(item => item.id
|
|
160
|
+
return this.find(item => item.id === id).first;
|
|
161
161
|
}
|
|
162
162
|
|
|
163
163
|
/**
|
|
@@ -150,7 +150,7 @@ class CollectionElement extends Element {
|
|
|
150
150
|
* Search the tree recursively and find the element with the matching ID.
|
|
151
151
|
*/
|
|
152
152
|
getById(id) {
|
|
153
|
-
return this.find(item => item.id
|
|
153
|
+
return this.find(item => item.id === id).first;
|
|
154
154
|
}
|
|
155
155
|
|
|
156
156
|
/**
|
|
@@ -4,8 +4,13 @@ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequ
|
|
|
4
4
|
exports.__esModule = true;
|
|
5
5
|
exports.default = void 0;
|
|
6
6
|
var _ramda = require("ramda");
|
|
7
|
+
var _Metadata = _interopRequireDefault(require("../Metadata.cjs"));
|
|
8
|
+
exports.Metadata = _Metadata.default;
|
|
7
9
|
var _KeyValuePair = _interopRequireDefault(require("../KeyValuePair.cjs"));
|
|
8
10
|
var _ObjectSlice = _interopRequireDefault(require("../ObjectSlice.cjs"));
|
|
11
|
+
// shared singleton for frozen elements with no meta — avoids allocation on every access
|
|
12
|
+
const FROZEN_EMPTY_METADATA = Object.freeze(new _Metadata.default());
|
|
13
|
+
|
|
9
14
|
/**
|
|
10
15
|
* Valid content types for an Element.
|
|
11
16
|
* @public
|
|
@@ -108,7 +113,7 @@ class Element {
|
|
|
108
113
|
_attributes;
|
|
109
114
|
|
|
110
115
|
// ============================================================
|
|
111
|
-
// Prototype-assigned properties (set in
|
|
116
|
+
// Prototype-assigned properties (set in registration.ts)
|
|
112
117
|
// Using 'declare' allows TypeScript to know about these
|
|
113
118
|
// without generating runtime code.
|
|
114
119
|
// ============================================================
|
|
@@ -196,24 +201,22 @@ class Element {
|
|
|
196
201
|
|
|
197
202
|
/**
|
|
198
203
|
* Metadata about this element (id, classes, title, description, links).
|
|
199
|
-
* Lazily creates
|
|
204
|
+
* Lazily creates a Metadata instance if not set.
|
|
200
205
|
*/
|
|
201
206
|
get meta() {
|
|
202
207
|
if (!this._meta) {
|
|
203
|
-
if (this.isFrozen)
|
|
204
|
-
|
|
205
|
-
meta.freeze();
|
|
206
|
-
return meta;
|
|
207
|
-
}
|
|
208
|
-
this._meta = new this.ObjectElement();
|
|
208
|
+
if (this.isFrozen) return FROZEN_EMPTY_METADATA;
|
|
209
|
+
this._meta = new _Metadata.default();
|
|
209
210
|
}
|
|
210
211
|
return this._meta;
|
|
211
212
|
}
|
|
212
213
|
set meta(value) {
|
|
213
|
-
if (value instanceof
|
|
214
|
+
if (value instanceof _Metadata.default) {
|
|
214
215
|
this._meta = value;
|
|
215
|
-
} else {
|
|
216
|
-
|
|
216
|
+
} else if (value && typeof value === 'object') {
|
|
217
|
+
const meta = new _Metadata.default();
|
|
218
|
+
Object.assign(meta, value);
|
|
219
|
+
this._meta = meta;
|
|
217
220
|
}
|
|
218
221
|
}
|
|
219
222
|
|
|
@@ -246,10 +249,8 @@ class Element {
|
|
|
246
249
|
|
|
247
250
|
/** Unique identifier for this element. */
|
|
248
251
|
get id() {
|
|
249
|
-
if (this.isFrozen) {
|
|
250
|
-
return this.getMetaProperty('id', '');
|
|
251
|
-
}
|
|
252
252
|
if (!this.hasMetaProperty('id')) {
|
|
253
|
+
if (this.isFrozen) return '';
|
|
253
254
|
this.setMetaProperty('id', '');
|
|
254
255
|
}
|
|
255
256
|
return this.meta.get('id');
|
|
@@ -260,10 +261,8 @@ class Element {
|
|
|
260
261
|
|
|
261
262
|
/** CSS-like class names. */
|
|
262
263
|
get classes() {
|
|
263
|
-
if (this.isFrozen) {
|
|
264
|
-
return this.getMetaProperty('classes', []);
|
|
265
|
-
}
|
|
266
264
|
if (!this.hasMetaProperty('classes')) {
|
|
265
|
+
if (this.isFrozen) return [];
|
|
267
266
|
this.setMetaProperty('classes', []);
|
|
268
267
|
}
|
|
269
268
|
return this.meta.get('classes');
|
|
@@ -274,11 +273,13 @@ class Element {
|
|
|
274
273
|
|
|
275
274
|
/** Hyperlinks associated with this element. */
|
|
276
275
|
get links() {
|
|
277
|
-
if (this.isFrozen) {
|
|
278
|
-
return this.getMetaProperty('links', []);
|
|
279
|
-
}
|
|
280
276
|
if (!this.hasMetaProperty('links')) {
|
|
281
|
-
this.
|
|
277
|
+
if (this.isFrozen) {
|
|
278
|
+
const empty = new this.ArrayElement();
|
|
279
|
+
empty.freeze();
|
|
280
|
+
return empty;
|
|
281
|
+
}
|
|
282
|
+
this.setMetaProperty('links', new this.ArrayElement());
|
|
282
283
|
}
|
|
283
284
|
return this.meta.get('links');
|
|
284
285
|
}
|
|
@@ -328,7 +329,6 @@ class Element {
|
|
|
328
329
|
|
|
329
330
|
// Freeze meta and attributes
|
|
330
331
|
if (this._meta) {
|
|
331
|
-
this._meta.parent = this;
|
|
332
332
|
this._meta.freeze();
|
|
333
333
|
}
|
|
334
334
|
if (this._attributes) {
|
|
@@ -419,7 +419,7 @@ class Element {
|
|
|
419
419
|
* @throws Error if this element has no ID
|
|
420
420
|
*/
|
|
421
421
|
toRef(path) {
|
|
422
|
-
const idValue = this.id
|
|
422
|
+
const idValue = this.id;
|
|
423
423
|
if (idValue === '') {
|
|
424
424
|
throw new Error('Cannot create reference to an element without an ID');
|
|
425
425
|
}
|
|
@@ -431,26 +431,16 @@ class Element {
|
|
|
431
431
|
}
|
|
432
432
|
|
|
433
433
|
/**
|
|
434
|
-
* Gets a meta property.
|
|
434
|
+
* Gets a meta property value.
|
|
435
435
|
*
|
|
436
436
|
* When the property doesn't exist:
|
|
437
|
-
* - With defaultValue: returns
|
|
437
|
+
* - With defaultValue: returns the provided default value
|
|
438
438
|
* - Without defaultValue: returns undefined
|
|
439
|
-
*
|
|
440
|
-
* Note: Each call with a default creates a new instance. Use setMetaProperty
|
|
441
|
-
* first if you need reference equality across multiple accesses.
|
|
442
439
|
*/
|
|
443
440
|
|
|
444
441
|
getMetaProperty(name, defaultValue) {
|
|
445
442
|
if (!this.hasMetaProperty(name)) {
|
|
446
|
-
|
|
447
|
-
return undefined;
|
|
448
|
-
}
|
|
449
|
-
const element = this.refract(defaultValue);
|
|
450
|
-
if (element && this.isFrozen) {
|
|
451
|
-
element.freeze();
|
|
452
|
-
}
|
|
453
|
-
return element;
|
|
443
|
+
return defaultValue;
|
|
454
444
|
}
|
|
455
445
|
return this.meta.get(name);
|
|
456
446
|
}
|
|
@@ -463,20 +453,17 @@ class Element {
|
|
|
463
453
|
}
|
|
464
454
|
|
|
465
455
|
/**
|
|
466
|
-
*
|
|
456
|
+
* Checks whether a meta property exists.
|
|
467
457
|
*/
|
|
468
458
|
hasMetaProperty(name) {
|
|
469
|
-
|
|
470
|
-
return this.meta.hasKey(name);
|
|
471
|
-
}
|
|
472
|
-
return false;
|
|
459
|
+
return this._meta !== undefined && this._meta.hasKey(name);
|
|
473
460
|
}
|
|
474
461
|
|
|
475
462
|
/**
|
|
476
463
|
* Checks if meta is empty.
|
|
477
464
|
*/
|
|
478
465
|
get isMetaEmpty() {
|
|
479
|
-
return this._meta === undefined || this.
|
|
466
|
+
return this._meta === undefined || this._meta.isEmpty;
|
|
480
467
|
}
|
|
481
468
|
|
|
482
469
|
/**
|
|
@@ -502,7 +489,7 @@ class Element {
|
|
|
502
489
|
}
|
|
503
490
|
|
|
504
491
|
/**
|
|
505
|
-
*
|
|
492
|
+
* Checks whether an attributes property exists.
|
|
506
493
|
*/
|
|
507
494
|
hasAttributesProperty(name) {
|
|
508
495
|
if (!this.isAttributesEmpty) {
|