@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.
@@ -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": "2.13.1",
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": "2.13.1",
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": "7a15e77dd776ef85f3e4421f0b4be52362b16f68"
55
+ "gitHead": "cb94ec84ea789d121801065876e7a91799a363d0"
56
56
  }
@@ -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;
@@ -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;
@@ -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 = cloneDeep(element.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 (except for
164
- * meta and attributes which are deep cloned to preserve semantic information).
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 => {
@@ -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 = cloneDeep(element.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 (except for
152
- * meta and attributes which are deep cloned to preserve semantic information).
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"; // Clone utilities
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.toValue() === id).first;
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.toValue() === id).first;
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 elements.ts)
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 an ObjectElement if not set.
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
- const meta = new this.ObjectElement();
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 Element) {
214
+ if (value instanceof _Metadata.default) {
214
215
  this._meta = value;
215
- } else {
216
- this.meta.set(value ?? {});
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.setMetaProperty('links', []);
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.toValue();
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 a new refracted element instance (not cached)
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
- if (defaultValue === undefined) {
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
- * Has meta property.
456
+ * Checks whether a meta property exists.
467
457
  */
468
458
  hasMetaProperty(name) {
469
- if (!this.isMetaEmpty) {
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.meta.isEmpty;
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
- * Has attributes property.
492
+ * Checks whether an attributes property exists.
506
493
  */
507
494
  hasAttributesProperty(name) {
508
495
  if (!this.isAttributesEmpty) {