@speclynx/apidom-ns-json-schema-draft-6 2.13.1 → 3.1.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.
@@ -366,7 +366,8 @@ __webpack_require__.r(__webpack_exports__);
366
366
  const refract = (value, {
367
367
  element = 'jSONSchemaDraft6',
368
368
  plugins = [],
369
- specificationObj = _specification_ts__WEBPACK_IMPORTED_MODULE_5__["default"]
369
+ specificationObj = _specification_ts__WEBPACK_IMPORTED_MODULE_5__["default"],
370
+ consume = false
370
371
  } = {}) => {
371
372
  const genericElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.refract)(value);
372
373
  const resolvedSpec = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_1__.resolveSpecification)(specificationObj);
@@ -383,7 +384,8 @@ const refract = (value, {
383
384
  */
384
385
  const RootVisitorClass = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(specPath, resolvedSpec);
385
386
  const rootVisitor = new RootVisitorClass({
386
- specObj: resolvedSpec
387
+ specObj: resolvedSpec,
388
+ consume
387
389
  });
388
390
  (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_2__.traverse)(genericElement, rootVisitor);
389
391
 
@@ -609,8 +611,9 @@ const schema = {
609
611
  }
610
612
  };
611
613
  const findElementFactory = (ancestor, keyName) => {
612
- const elementType = (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_8__.getNodeType)(ancestor); // @ts-ignore
613
- const keyMapping = schema[elementType] || schema[(0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(ancestor.classes.first)];
614
+ const elementType = (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_8__.getNodeType)(ancestor);
615
+ const classType = ancestor.isMetaEmpty ? undefined : ancestor.classes.at(0); // @ts-ignore
616
+ const keyMapping = schema[elementType] || schema[classType];
614
617
  return typeof keyMapping === 'undefined' ? undefined : Object.hasOwn(keyMapping, '[key: *]') ? keyMapping['[key: *]'] : keyMapping[keyName];
615
618
  };
616
619
 
@@ -640,7 +643,7 @@ const plugin = () => () => ({
640
643
  if (typeof elementFactory !== 'function') return;
641
644
  const replacement = elementFactory.call({
642
645
  context
643
- }, undefined, (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(element.meta), (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(element.attributes));
646
+ }, undefined, element.isMetaEmpty ? undefined : element.meta.cloneDeep(), element.isAttributesEmpty ? undefined : (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(element.attributes));
644
647
  _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__["default"].transfer(element, replacement);
645
648
  _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_6__["default"].transfer(element, replacement);
646
649
  path.replaceWith(replacement);
@@ -16349,7 +16352,7 @@ __webpack_require__.r(__webpack_exports__);
16349
16352
  * @public
16350
16353
  */
16351
16354
  const emptyElement = element => {
16352
- const meta = !element.isMetaEmpty ? (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(element.meta) : undefined;
16355
+ const meta = !element.isMetaEmpty ? element.meta.cloneDeep() : undefined;
16353
16356
  const attributes = !element.isAttributesEmpty ? (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(element.attributes) : undefined;
16354
16357
 
16355
16358
  // @ts-ignore
@@ -16365,7 +16368,7 @@ const getMergeFunction = (keyElement, options) => {
16365
16368
  };
16366
16369
  const getMetaMergeFunction = options => {
16367
16370
  if (typeof options.customMetaMerge !== 'function') {
16368
- return targetMeta => (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(targetMeta);
16371
+ return targetMeta => targetMeta.cloneDeep();
16369
16372
  }
16370
16373
  return options.customMetaMerge;
16371
16374
  };
@@ -16437,8 +16440,20 @@ const deepmerge = (targetElement, sourceElement, options) => {
16437
16440
  const mergedElement = sourceIsArrayElement && typeof mergedOptions.arrayElementMerge === 'function' ? mergedOptions.arrayElementMerge(targetElement, sourceElement, mergedOptions) : mergedOptions.objectElementMerge(targetElement, sourceElement, mergedOptions);
16438
16441
 
16439
16442
  // merging meta & attributes
16440
- mergedElement.meta = getMetaMergeFunction(mergedOptions)(targetElement.meta, sourceElement.meta);
16441
- mergedElement.attributes = getAttributesMergeFunction(mergedOptions)(targetElement.attributes, sourceElement.attributes);
16443
+ if (!targetElement.isMetaEmpty && !sourceElement.isMetaEmpty) {
16444
+ mergedElement.meta = getMetaMergeFunction(mergedOptions)(targetElement.meta, sourceElement.meta);
16445
+ } else if (!targetElement.isMetaEmpty) {
16446
+ mergedElement.meta = targetElement.meta.cloneDeep();
16447
+ } else if (!sourceElement.isMetaEmpty) {
16448
+ mergedElement.meta = sourceElement.meta.cloneDeep();
16449
+ }
16450
+ if (!targetElement.isAttributesEmpty && !sourceElement.isAttributesEmpty) {
16451
+ mergedElement.attributes = getAttributesMergeFunction(mergedOptions)(targetElement.attributes, sourceElement.attributes);
16452
+ } else if (!targetElement.isAttributesEmpty) {
16453
+ mergedElement.attributes = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(targetElement.attributes);
16454
+ } else if (!sourceElement.isAttributesEmpty) {
16455
+ mergedElement.attributes = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(sourceElement.attributes);
16456
+ }
16442
16457
  return mergedElement;
16443
16458
  };
16444
16459
  deepmerge.all = (list, options) => {
@@ -16771,6 +16786,104 @@ class KeyValuePair {
16771
16786
 
16772
16787
  /***/ },
16773
16788
 
16789
+ /***/ 1844
16790
+ (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
16791
+
16792
+ __webpack_require__.r(__webpack_exports__);
16793
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
16794
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
16795
+ /* harmony export */ });
16796
+ /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8138);
16797
+
16798
+ /**
16799
+ * Lightweight meta container for Element metadata.
16800
+ *
16801
+ * Data is stored as own properties on the instance; methods live on the prototype.
16802
+ * `Object.keys()`, `Object.entries()`, etc. only see data properties.
16803
+ *
16804
+ * @public
16805
+ */
16806
+ class Metadata {
16807
+ // Set via prototype assignment in registration.ts to avoid circular dependency
16808
+
16809
+ get(name) {
16810
+ return this[name];
16811
+ }
16812
+ set(name, value) {
16813
+ this[name] = value;
16814
+ }
16815
+ hasKey(name) {
16816
+ return Object.hasOwn(this, name);
16817
+ }
16818
+ keys() {
16819
+ return Object.keys(this);
16820
+ }
16821
+ remove(name) {
16822
+ delete this[name];
16823
+ }
16824
+ get isEmpty() {
16825
+ return Object.keys(this).length === 0;
16826
+ }
16827
+ get isFrozen() {
16828
+ return Object.isFrozen(this);
16829
+ }
16830
+ freeze() {
16831
+ for (const value of Object.values(this)) {
16832
+ if (value instanceof this.Element) {
16833
+ value.freeze();
16834
+ } else if (Array.isArray(value) || value !== null && typeof value === 'object') {
16835
+ Object.freeze(value);
16836
+ }
16837
+ }
16838
+ Object.freeze(this);
16839
+ }
16840
+
16841
+ /**
16842
+ * Creates a shallow clone. Same references, new container.
16843
+ */
16844
+ cloneShallow() {
16845
+ const clone = new Metadata();
16846
+ Object.assign(clone, this);
16847
+ return clone;
16848
+ }
16849
+
16850
+ /**
16851
+ * Merges another Metadata into a new instance.
16852
+ * Arrays are concatenated, all other values are overwritten by source.
16853
+ */
16854
+ merge(source) {
16855
+ const result = this.cloneShallow();
16856
+ for (const [key, value] of Object.entries(source)) {
16857
+ const existing = result.get(key);
16858
+ if (Array.isArray(existing) && Array.isArray(value)) {
16859
+ result.set(key, [...existing, ...value]);
16860
+ } else {
16861
+ result.set(key, value);
16862
+ }
16863
+ }
16864
+ return result;
16865
+ }
16866
+
16867
+ /**
16868
+ * Creates a deep clone. Elements are deep cloned,
16869
+ * all other values are deep cloned via ramda clone.
16870
+ */
16871
+ cloneDeep() {
16872
+ const copy = new Metadata();
16873
+ for (const [key, value] of Object.entries(this)) {
16874
+ if (value instanceof this.Element) {
16875
+ copy.set(key, this.cloneDeepElement(value));
16876
+ } else {
16877
+ copy.set(key, (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(value));
16878
+ }
16879
+ }
16880
+ return copy;
16881
+ }
16882
+ }
16883
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Metadata);
16884
+
16885
+ /***/ },
16886
+
16774
16887
  /***/ 5156
16775
16888
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
16776
16889
 
@@ -17411,7 +17524,7 @@ const cloneShallowElement = element => {
17411
17524
  const copy = new Ctor();
17412
17525
  copy.element = element.element;
17413
17526
  if (!element.isMetaEmpty) {
17414
- copy.meta = cloneDeep(element.meta);
17527
+ copy.meta = element.meta.cloneDeep();
17415
17528
  }
17416
17529
  if (!element.isAttributesEmpty) {
17417
17530
  copy.attributes = cloneDeep(element.attributes);
@@ -17439,8 +17552,8 @@ const cloneShallowElement = element => {
17439
17552
 
17440
17553
  /**
17441
17554
  * Creates a shallow clone of an ApiDOM Element, KeyValuePair, or ObjectSlice.
17442
- * The element itself is cloned, but content references are shared (except for
17443
- * meta and attributes which are deep cloned to preserve semantic information).
17555
+ * The element itself is cloned, but content references are shared.
17556
+ * Meta and attributes are deep cloned to preserve semantic information.
17444
17557
  * @public
17445
17558
  */
17446
17559
  const cloneShallow = value => {
@@ -18502,7 +18615,7 @@ class CollectionElement extends _Element_mjs__WEBPACK_IMPORTED_MODULE_0__["defau
18502
18615
  * Search the tree recursively and find the element with the matching ID.
18503
18616
  */
18504
18617
  getById(id) {
18505
- return this.find(item => item.id.toValue() === id).first;
18618
+ return this.find(item => item.id === id).first;
18506
18619
  }
18507
18620
 
18508
18621
  /**
@@ -18531,18 +18644,24 @@ class CollectionElement extends _Element_mjs__WEBPACK_IMPORTED_MODULE_0__["defau
18531
18644
 
18532
18645
  __webpack_require__.r(__webpack_exports__);
18533
18646
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
18647
+ /* harmony export */ Metadata: () => (/* reexport safe */ _Metadata_mjs__WEBPACK_IMPORTED_MODULE_1__["default"]),
18534
18648
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
18535
18649
  /* harmony export */ });
18536
18650
  /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3654);
18537
- /* harmony import */ var _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6663);
18538
- /* harmony import */ var _ObjectSlice_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8504);
18651
+ /* harmony import */ var _Metadata_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1844);
18652
+ /* harmony import */ var _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6663);
18653
+ /* harmony import */ var _ObjectSlice_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8504);
18654
+
18539
18655
 
18540
18656
 
18657
+ // shared singleton for frozen elements with no meta — avoids allocation on every access
18658
+ const FROZEN_EMPTY_METADATA = Object.freeze(new _Metadata_mjs__WEBPACK_IMPORTED_MODULE_1__["default"]());
18541
18659
 
18542
18660
  /**
18543
18661
  * Valid content types for an Element.
18544
18662
  * @public
18545
18663
  */
18664
+
18546
18665
  /**
18547
18666
  * Base Element class that all ApiDOM elements extend.
18548
18667
  *
@@ -18640,7 +18759,7 @@ class Element {
18640
18759
  _attributes;
18641
18760
 
18642
18761
  // ============================================================
18643
- // Prototype-assigned properties (set in elements.ts)
18762
+ // Prototype-assigned properties (set in registration.ts)
18644
18763
  // Using 'declare' allows TypeScript to know about these
18645
18764
  // without generating runtime code.
18646
18765
  // ============================================================
@@ -18701,13 +18820,13 @@ class Element {
18701
18820
  }
18702
18821
 
18703
18822
  // KeyValuePair
18704
- if (value instanceof _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_1__["default"]) {
18823
+ if (value instanceof _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_2__["default"]) {
18705
18824
  this._content = value;
18706
18825
  return;
18707
18826
  }
18708
18827
 
18709
18828
  // ObjectSlice - extract elements array
18710
- if (value instanceof _ObjectSlice_mjs__WEBPACK_IMPORTED_MODULE_2__["default"]) {
18829
+ if (value instanceof _ObjectSlice_mjs__WEBPACK_IMPORTED_MODULE_3__["default"]) {
18711
18830
  this._content = value.elements;
18712
18831
  return;
18713
18832
  }
@@ -18728,24 +18847,22 @@ class Element {
18728
18847
 
18729
18848
  /**
18730
18849
  * Metadata about this element (id, classes, title, description, links).
18731
- * Lazily creates an ObjectElement if not set.
18850
+ * Lazily creates a Metadata instance if not set.
18732
18851
  */
18733
18852
  get meta() {
18734
18853
  if (!this._meta) {
18735
- if (this.isFrozen) {
18736
- const meta = new this.ObjectElement();
18737
- meta.freeze();
18738
- return meta;
18739
- }
18740
- this._meta = new this.ObjectElement();
18854
+ if (this.isFrozen) return FROZEN_EMPTY_METADATA;
18855
+ this._meta = new _Metadata_mjs__WEBPACK_IMPORTED_MODULE_1__["default"]();
18741
18856
  }
18742
18857
  return this._meta;
18743
18858
  }
18744
18859
  set meta(value) {
18745
- if (value instanceof Element) {
18860
+ if (value instanceof _Metadata_mjs__WEBPACK_IMPORTED_MODULE_1__["default"]) {
18746
18861
  this._meta = value;
18747
- } else {
18748
- this.meta.set(value ?? {});
18862
+ } else if (value && typeof value === 'object') {
18863
+ const meta = new _Metadata_mjs__WEBPACK_IMPORTED_MODULE_1__["default"]();
18864
+ Object.assign(meta, value);
18865
+ this._meta = meta;
18749
18866
  }
18750
18867
  }
18751
18868
 
@@ -18778,10 +18895,8 @@ class Element {
18778
18895
 
18779
18896
  /** Unique identifier for this element. */
18780
18897
  get id() {
18781
- if (this.isFrozen) {
18782
- return this.getMetaProperty('id', '');
18783
- }
18784
18898
  if (!this.hasMetaProperty('id')) {
18899
+ if (this.isFrozen) return '';
18785
18900
  this.setMetaProperty('id', '');
18786
18901
  }
18787
18902
  return this.meta.get('id');
@@ -18792,10 +18907,8 @@ class Element {
18792
18907
 
18793
18908
  /** CSS-like class names. */
18794
18909
  get classes() {
18795
- if (this.isFrozen) {
18796
- return this.getMetaProperty('classes', []);
18797
- }
18798
18910
  if (!this.hasMetaProperty('classes')) {
18911
+ if (this.isFrozen) return [];
18799
18912
  this.setMetaProperty('classes', []);
18800
18913
  }
18801
18914
  return this.meta.get('classes');
@@ -18806,11 +18919,13 @@ class Element {
18806
18919
 
18807
18920
  /** Hyperlinks associated with this element. */
18808
18921
  get links() {
18809
- if (this.isFrozen) {
18810
- return this.getMetaProperty('links', []);
18811
- }
18812
18922
  if (!this.hasMetaProperty('links')) {
18813
- this.setMetaProperty('links', []);
18923
+ if (this.isFrozen) {
18924
+ const empty = new this.ArrayElement();
18925
+ empty.freeze();
18926
+ return empty;
18927
+ }
18928
+ this.setMetaProperty('links', new this.ArrayElement());
18814
18929
  }
18815
18930
  return this.meta.get('links');
18816
18931
  }
@@ -18830,7 +18945,7 @@ class Element {
18830
18945
  if (Array.isArray(content)) {
18831
18946
  return content;
18832
18947
  }
18833
- if (content instanceof _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_1__["default"]) {
18948
+ if (content instanceof _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_2__["default"]) {
18834
18949
  const children = [];
18835
18950
  if (content.key) children.push(content.key);
18836
18951
  if (content.value) children.push(content.value);
@@ -18860,7 +18975,6 @@ class Element {
18860
18975
 
18861
18976
  // Freeze meta and attributes
18862
18977
  if (this._meta) {
18863
- this._meta.parent = this;
18864
18978
  this._meta.freeze();
18865
18979
  }
18866
18980
  if (this._attributes) {
@@ -18895,7 +19009,7 @@ class Element {
18895
19009
  if (_content instanceof Element) {
18896
19010
  return _content.toValue();
18897
19011
  }
18898
- if (_content instanceof _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_1__["default"]) {
19012
+ if (_content instanceof _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_2__["default"]) {
18899
19013
  return _content.toValue();
18900
19014
  }
18901
19015
  if (Array.isArray(_content)) {
@@ -18951,7 +19065,7 @@ class Element {
18951
19065
  * @throws Error if this element has no ID
18952
19066
  */
18953
19067
  toRef(path) {
18954
- const idValue = this.id.toValue();
19068
+ const idValue = this.id;
18955
19069
  if (idValue === '') {
18956
19070
  throw new Error('Cannot create reference to an element without an ID');
18957
19071
  }
@@ -18963,26 +19077,16 @@ class Element {
18963
19077
  }
18964
19078
 
18965
19079
  /**
18966
- * Gets a meta property.
19080
+ * Gets a meta property value.
18967
19081
  *
18968
19082
  * When the property doesn't exist:
18969
- * - With defaultValue: returns a new refracted element instance (not cached)
19083
+ * - With defaultValue: returns the provided default value
18970
19084
  * - Without defaultValue: returns undefined
18971
- *
18972
- * Note: Each call with a default creates a new instance. Use setMetaProperty
18973
- * first if you need reference equality across multiple accesses.
18974
19085
  */
18975
19086
 
18976
19087
  getMetaProperty(name, defaultValue) {
18977
19088
  if (!this.hasMetaProperty(name)) {
18978
- if (defaultValue === undefined) {
18979
- return undefined;
18980
- }
18981
- const element = this.refract(defaultValue);
18982
- if (element && this.isFrozen) {
18983
- element.freeze();
18984
- }
18985
- return element;
19089
+ return defaultValue;
18986
19090
  }
18987
19091
  return this.meta.get(name);
18988
19092
  }
@@ -18995,20 +19099,17 @@ class Element {
18995
19099
  }
18996
19100
 
18997
19101
  /**
18998
- * Has meta property.
19102
+ * Checks whether a meta property exists.
18999
19103
  */
19000
19104
  hasMetaProperty(name) {
19001
- if (!this.isMetaEmpty) {
19002
- return this.meta.hasKey(name);
19003
- }
19004
- return false;
19105
+ return this._meta !== undefined && this._meta.hasKey(name);
19005
19106
  }
19006
19107
 
19007
19108
  /**
19008
19109
  * Checks if meta is empty.
19009
19110
  */
19010
19111
  get isMetaEmpty() {
19011
- return this._meta === undefined || this.meta.isEmpty;
19112
+ return this._meta === undefined || this._meta.isEmpty;
19012
19113
  }
19013
19114
 
19014
19115
  /**
@@ -19034,7 +19135,7 @@ class Element {
19034
19135
  }
19035
19136
 
19036
19137
  /**
19037
- * Has attributes property.
19138
+ * Checks whether an attributes property exists.
19038
19139
  */
19039
19140
  hasAttributesProperty(name) {
19040
19141
  if (!this.isAttributesEmpty) {
@@ -19053,6 +19154,7 @@ class Element {
19053
19154
 
19054
19155
  // Re-export types for convenience
19055
19156
 
19157
+
19056
19158
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Element);
19057
19159
 
19058
19160
  /***/ },
@@ -19485,6 +19587,10 @@ __webpack_require__.r(__webpack_exports__);
19485
19587
  /* harmony import */ var _elements_Style_mjs__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(9686);
19486
19588
  /* harmony import */ var _ObjectSlice_mjs__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(8504);
19487
19589
  /* harmony import */ var _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(6663);
19590
+ /* harmony import */ var _Metadata_mjs__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(1844);
19591
+ /* harmony import */ var _clone_index_mjs__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(2111);
19592
+
19593
+
19488
19594
 
19489
19595
 
19490
19596
 
@@ -19544,14 +19650,16 @@ function refract(value) {
19544
19650
  }
19545
19651
 
19546
19652
  // Set up prototype assignments for circular dependency resolution.
19547
- // These allow Element instances to create ObjectElement, MemberElement, RefElement
19548
- // without importing them directly (which would cause circular imports).
19653
+ // These allow Element and Metadata instances to reference classes they can't import
19654
+ // directly (which would cause circular imports).
19549
19655
  // Using 'declare' in the class definitions enables type-safe access to these properties.
19550
19656
  _primitives_Element_mjs__WEBPACK_IMPORTED_MODULE_0__["default"].prototype.ObjectElement = _primitives_ObjectElement_mjs__WEBPACK_IMPORTED_MODULE_8__["default"];
19551
19657
  _primitives_Element_mjs__WEBPACK_IMPORTED_MODULE_0__["default"].prototype.ArrayElement = _primitives_ArrayElement_mjs__WEBPACK_IMPORTED_MODULE_6__["default"];
19552
19658
  _primitives_Element_mjs__WEBPACK_IMPORTED_MODULE_0__["default"].prototype.RefElement = _elements_RefElement_mjs__WEBPACK_IMPORTED_MODULE_10__["default"];
19553
19659
  _primitives_Element_mjs__WEBPACK_IMPORTED_MODULE_0__["default"].prototype.MemberElement = _primitives_MemberElement_mjs__WEBPACK_IMPORTED_MODULE_7__["default"];
19554
19660
  _primitives_Element_mjs__WEBPACK_IMPORTED_MODULE_0__["default"].prototype.refract = refract;
19661
+ _Metadata_mjs__WEBPACK_IMPORTED_MODULE_18__["default"].prototype.Element = _primitives_Element_mjs__WEBPACK_IMPORTED_MODULE_0__["default"];
19662
+ _Metadata_mjs__WEBPACK_IMPORTED_MODULE_18__["default"].prototype.cloneDeepElement = element => (0,_clone_index_mjs__WEBPACK_IMPORTED_MODULE_19__.cloneDeep)(element);
19555
19663
 
19556
19664
  /**
19557
19665
  * Contains all of the element classes, and related structures and methods
@@ -19615,7 +19723,13 @@ class JSONSerialiser {
19615
19723
  element: element.element
19616
19724
  };
19617
19725
  if (!element.isMetaEmpty) {
19618
- payload.meta = this.serialiseObject(element.meta);
19726
+ const serialisedMeta = this.serialiseMeta(element);
19727
+ if (serialisedMeta) {
19728
+ payload.meta = serialisedMeta.meta;
19729
+ if (serialisedMeta.rawKeys.length > 0) {
19730
+ payload.__meta_raw__ = serialisedMeta.rawKeys;
19731
+ }
19732
+ }
19619
19733
  }
19620
19734
  if (!element.isAttributesEmpty) {
19621
19735
  payload.attributes = this.serialiseObject(element.attributes);
@@ -19662,7 +19776,7 @@ class JSONSerialiser {
19662
19776
  element.element = value.element;
19663
19777
  }
19664
19778
 
19665
- // Extract __mappings__ and __styles__ without mutating input, filter remaining meta
19779
+ // Extract special meta keys without mutating input, filter remaining meta
19666
19780
  let mappingsDoc;
19667
19781
  let stylesDoc;
19668
19782
  let metaToDeserialize = value.meta;
@@ -19676,8 +19790,15 @@ class JSONSerialiser {
19676
19790
  stylesDoc = __styles__;
19677
19791
  metaToDeserialize = Object.keys(rest).length > 0 ? rest : undefined;
19678
19792
  }
19793
+
19794
+ // determine which meta keys were raw primitives before serialization
19795
+ const rawKeys = value.__meta_raw__ ? new Set(value.__meta_raw__) : undefined;
19679
19796
  if (metaToDeserialize) {
19680
- this.deserialiseObject(metaToDeserialize, element.meta);
19797
+ for (const [key, doc] of Object.entries(metaToDeserialize)) {
19798
+ const deserialized = this.deserialise(doc);
19799
+ // unwrap keys that were raw primitives before serialization
19800
+ element.setMetaProperty(key, rawKeys?.has(key) ? deserialized.toValue() : deserialized);
19801
+ }
19681
19802
  }
19682
19803
 
19683
19804
  // Restore source position from __mappings__
@@ -19740,6 +19861,27 @@ class JSONSerialiser {
19740
19861
  }
19741
19862
  return content;
19742
19863
  }
19864
+ serialiseMeta(element) {
19865
+ const meta = {};
19866
+ const rawKeys = [];
19867
+ let hasEntries = false;
19868
+ for (const [key, value] of Object.entries(element.meta)) {
19869
+ if (value instanceof this.namespace.elements.Element) {
19870
+ meta[key] = this.serialise(value);
19871
+ hasEntries = true;
19872
+ } else if (value !== undefined) {
19873
+ // refract primitives to maintain JSON Refract spec compatibility
19874
+ const refracted = element.refract(value);
19875
+ meta[key] = this.serialise(refracted);
19876
+ rawKeys.push(key);
19877
+ hasEntries = true;
19878
+ }
19879
+ }
19880
+ return hasEntries ? {
19881
+ meta,
19882
+ rawKeys
19883
+ } : undefined;
19884
+ }
19743
19885
  serialiseObject(obj) {
19744
19886
  const result = {};
19745
19887
  obj.forEach((value, key) => {
@@ -20694,7 +20836,7 @@ __webpack_require__.r(__webpack_exports__);
20694
20836
  */
20695
20837
  class FallbackVisitor extends _Visitor_mjs__WEBPACK_IMPORTED_MODULE_1__["default"] {
20696
20838
  enter(path) {
20697
- this.element = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.cloneDeep)(path.node);
20839
+ this.element = this.consume ? path.node : (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.cloneDeep)(path.node);
20698
20840
  path.stop();
20699
20841
  }
20700
20842
  }
@@ -20733,7 +20875,7 @@ __webpack_require__.r(__webpack_exports__);
20733
20875
  */
20734
20876
  class SpecificationVisitor extends _Visitor_mjs__WEBPACK_IMPORTED_MODULE_6__["default"] {
20735
20877
  specObj;
20736
- passingOptionsNames = ['specObj', 'parent'];
20878
+ passingOptionsNames = ['specObj', 'parent', 'consume'];
20737
20879
  constructor({
20738
20880
  specObj,
20739
20881
  ...rest
@@ -20779,7 +20921,7 @@ class SpecificationVisitor extends _Visitor_mjs__WEBPACK_IMPORTED_MODULE_6__["de
20779
20921
  */
20780
20922
  const visitor = this.retrieveVisitorInstance(specPath, options);
20781
20923
  if (visitor instanceof _FallbackVisitor_mjs__WEBPACK_IMPORTED_MODULE_7__["default"] && visitor?.constructor === _FallbackVisitor_mjs__WEBPACK_IMPORTED_MODULE_7__["default"]) {
20782
- return (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneDeep)(element);
20924
+ return this.consume ? element : (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneDeep)(element);
20783
20925
  }
20784
20926
  (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_5__.traverse)(element, visitor, options);
20785
20927
  return visitor.element;
@@ -20797,7 +20939,7 @@ __webpack_require__.r(__webpack_exports__);
20797
20939
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
20798
20940
  /* harmony export */ });
20799
20941
  /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8400);
20800
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7071);
20942
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2111);
20801
20943
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5810);
20802
20944
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(9686);
20803
20945
 
@@ -20812,19 +20954,21 @@ __webpack_require__.r(__webpack_exports__);
20812
20954
  */
20813
20955
  class Visitor {
20814
20956
  element;
20957
+ consume = false;
20958
+ consumeSafe = false;
20815
20959
  constructor(options) {
20816
20960
  Object.assign(this, options);
20817
20961
  }
20818
20962
  copyMetaAndAttributes(from, to) {
20819
- if (!from.isMetaEmpty || !to.isMetaEmpty) {
20820
- const target = to.isMetaEmpty ? new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__["default"]() : to.meta;
20821
- const source = from.isMetaEmpty ? new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__["default"]() : from.meta;
20822
- to.meta = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_0__["default"])(target, source);
20963
+ if (!from.isMetaEmpty && !to.isMetaEmpty) {
20964
+ to.meta = to.meta.merge(from.meta);
20965
+ } else if (!from.isMetaEmpty) {
20966
+ to.meta = from.meta.cloneDeep();
20823
20967
  }
20824
- if (!from.isAttributesEmpty || !to.isAttributesEmpty) {
20825
- const target = to.isAttributesEmpty ? new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__["default"]() : to.attributes;
20826
- const source = from.isAttributesEmpty ? new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__["default"]() : from.attributes;
20827
- to.attributes = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_0__["default"])(target, source);
20968
+ if (!from.isAttributesEmpty && !to.isAttributesEmpty) {
20969
+ to.attributes = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_0__["default"])(to.attributes, from.attributes);
20970
+ } else if (!from.isAttributesEmpty) {
20971
+ to.attributes = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(from.attributes);
20828
20972
  }
20829
20973
  _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__["default"].transfer(from, to);
20830
20974
  _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__["default"].transfer(from, to);
@@ -20932,12 +21076,13 @@ class FixedFieldsVisitor extends _SpecificationVisitor_mjs__WEBPACK_IMPORTED_MOD
20932
21076
  const keyValue = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_3__["default"])(key);
20933
21077
  if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.isStringElement)(key) && fields.includes(keyValue) && !this.ignoredFields.includes(keyValue)) {
20934
21078
  const fixedFieldElement = this.toRefractedElement([...specPath, 'fixedFields', keyValue], value);
20935
- const newMemberElement = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__["default"]((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(key), fixedFieldElement);
21079
+ const newMemberElement = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__["default"](this.consume ? key : (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(key), fixedFieldElement);
20936
21080
  this.copyMetaAndAttributes(memberElement, newMemberElement);
20937
- newMemberElement.classes.push('fixed-field');
20938
21081
  this.element.content.push(newMemberElement);
21082
+ // consume: release processed generic subtree
21083
+ if (this.consume && this.consumeSafe && !memberElement.isFrozen) memberElement.value = undefined;
20939
21084
  } else if (!this.ignoredFields.includes(keyValue)) {
20940
- this.element.content.push((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(memberElement));
21085
+ this.element.content.push(this.consume ? memberElement : (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(memberElement));
20941
21086
  }
20942
21087
  });
20943
21088
  this.copyMetaAndAttributes(objectElement, this.element);
@@ -21024,12 +21169,14 @@ class PatternedFieldsVisitor extends _SpecificationVisitor_mjs__WEBPACK_IMPORTED
21024
21169
  if (!this.ignoredFields.includes(keyValue) && this.fieldPatternPredicate(keyValue)) {
21025
21170
  const specPath = this.specPath(value);
21026
21171
  const patternedFieldElement = this.toRefractedElement(specPath, value);
21027
- const newMemberElement = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__["default"]((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(key), patternedFieldElement);
21172
+ const newMemberElement = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__["default"](this.consume ? key : (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(key), patternedFieldElement);
21028
21173
  this.copyMetaAndAttributes(memberElement, newMemberElement);
21029
21174
  newMemberElement.classes.push('patterned-field');
21030
21175
  this.element.content.push(newMemberElement);
21176
+ // consume: release processed generic subtree
21177
+ if (this.consume && this.consumeSafe && !memberElement.isFrozen) memberElement.value = undefined;
21031
21178
  } else if (!this.ignoredFields.includes(keyValue)) {
21032
- this.element.content.push((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(memberElement));
21179
+ this.element.content.push(this.consume ? memberElement : (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(memberElement));
21033
21180
  }
21034
21181
  });
21035
21182
  this.copyMetaAndAttributes(objectElement, this.element);
@@ -21571,13 +21718,11 @@ __webpack_require__.r(__webpack_exports__);
21571
21718
  /* harmony import */ var ramda_adjunct__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3031);
21572
21719
  /* harmony import */ var ramda_adjunct__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6513);
21573
21720
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(5162);
21574
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(2111);
21575
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(7601);
21576
- /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(4673);
21577
- /* harmony import */ var _generics_FixedFieldsVisitor_mjs__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(5320);
21578
- /* harmony import */ var _bases_mjs__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(9033);
21579
- /* harmony import */ var _elements_JSONSchema_mjs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(4686);
21580
- /* harmony import */ var _predicates_mjs__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(6059);
21721
+ /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(4673);
21722
+ /* harmony import */ var _generics_FixedFieldsVisitor_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(5320);
21723
+ /* harmony import */ var _bases_mjs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(9033);
21724
+ /* harmony import */ var _elements_JSONSchema_mjs__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(4686);
21725
+ /* harmony import */ var _predicates_mjs__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(6059);
21581
21726
 
21582
21727
 
21583
21728
 
@@ -21592,10 +21737,11 @@ __webpack_require__.r(__webpack_exports__);
21592
21737
  /**
21593
21738
  * @public
21594
21739
  */
21595
- class JSONSchemaVisitor extends _bases_mjs__WEBPACK_IMPORTED_MODULE_9__.JSONSchemaVisitorBase {
21740
+ class JSONSchemaVisitor extends _bases_mjs__WEBPACK_IMPORTED_MODULE_7__.JSONSchemaVisitorBase {
21596
21741
  constructor(options) {
21597
21742
  super(options);
21598
- this.element = new _elements_JSONSchema_mjs__WEBPACK_IMPORTED_MODULE_10__["default"]();
21743
+ this.element = new _elements_JSONSchema_mjs__WEBPACK_IMPORTED_MODULE_8__["default"]();
21744
+ this.consumeSafe = true;
21599
21745
  this.specPath = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(['document', 'objects', 'JSONSchema']);
21600
21746
  }
21601
21747
  get defaultDialectIdentifier() {
@@ -21608,27 +21754,27 @@ class JSONSchemaVisitor extends _bases_mjs__WEBPACK_IMPORTED_MODULE_9__.JSONSche
21608
21754
 
21609
21755
  // for further processing consider this JSONSchema Element as parent for all sub-schemas
21610
21756
  this.parent = this.element;
21611
- return _generics_FixedFieldsVisitor_mjs__WEBPACK_IMPORTED_MODULE_8__["default"].prototype.ObjectElement.call(this, path);
21757
+ return _generics_FixedFieldsVisitor_mjs__WEBPACK_IMPORTED_MODULE_6__["default"].prototype.ObjectElement.call(this, path);
21612
21758
  }
21613
21759
  handleDialectIdentifier(objectElement) {
21614
21760
  // handle $schema keyword in embedded resources
21615
21761
  if ((0,ramda_adjunct__WEBPACK_IMPORTED_MODULE_2__["default"])(this.parent) && !(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.isStringElement)(objectElement.get('$schema'))) {
21616
21762
  // no parent available and no $schema is defined, set default $schema
21617
21763
  this.element.meta.set('inheritedDialectIdentifier', this.defaultDialectIdentifier);
21618
- } else if ((0,_predicates_mjs__WEBPACK_IMPORTED_MODULE_11__.isJSONSchemaElement)(this.parent) && !(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.isStringElement)(objectElement.get('$schema'))) {
21764
+ } else if ((0,_predicates_mjs__WEBPACK_IMPORTED_MODULE_9__.isJSONSchemaElement)(this.parent) && !(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.isStringElement)(objectElement.get('$schema'))) {
21619
21765
  // parent is available and no $schema is defined, set parent $schema
21620
- const inheritedDialectIdentifier = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])((0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(this.parent.meta.get('inheritedDialectIdentifier')), (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(this.parent.$schema));
21766
+ const inheritedDialectIdentifier = (0,ramda__WEBPACK_IMPORTED_MODULE_1__["default"])(this.parent.meta.get('inheritedDialectIdentifier'), (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(this.parent.$schema));
21621
21767
  this.element.meta.set('inheritedDialectIdentifier', inheritedDialectIdentifier);
21622
21768
  }
21623
21769
  }
21624
21770
  handleSchemaIdentifier(objectElement, identifierKeyword = 'id') {
21625
21771
  // handle schema identifier in embedded resources
21626
- // fetch parent's ancestorsSchemaIdentifiers
21627
- const ancestorsSchemaIdentifiers = this.parent !== undefined ? (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__.cloneDeep)(this.parent.meta.get('ancestorsSchemaIdentifiers') ?? new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_6__["default"]()) : new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_6__["default"]();
21772
+ // fetch parent's ancestorsSchemaIdentifiers (stored as plain string[])
21773
+ const ancestorsSchemaIdentifiers = this.parent !== undefined ? [...(this.parent.meta.get('ancestorsSchemaIdentifiers') ?? [])] : [];
21628
21774
  // get current schema identifier
21629
- const schemaIdentifier = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(objectElement.get(identifierKeyword));
21775
+ const schemaIdentifier = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(objectElement.get(identifierKeyword));
21630
21776
 
21631
- // remember schema identifier if it's a non-empty strings
21777
+ // remember schema identifier if it's a non-empty string
21632
21778
  if ((0,ramda_adjunct__WEBPACK_IMPORTED_MODULE_3__["default"])(schemaIdentifier)) {
21633
21779
  ancestorsSchemaIdentifiers.push(schemaIdentifier);
21634
21780
  }