@speclynx/apidom-ns-json-schema-draft-7 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.
@@ -432,7 +432,8 @@ __webpack_require__.r(__webpack_exports__);
432
432
  const refract = (value, {
433
433
  element = 'jSONSchemaDraft7',
434
434
  plugins = [],
435
- specificationObj = _specification_ts__WEBPACK_IMPORTED_MODULE_5__["default"]
435
+ specificationObj = _specification_ts__WEBPACK_IMPORTED_MODULE_5__["default"],
436
+ consume = false
436
437
  } = {}) => {
437
438
  const genericElement = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__.refract)(value);
438
439
  const resolvedSpec = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_1__.resolveSpecification)(specificationObj);
@@ -449,7 +450,8 @@ const refract = (value, {
449
450
  */
450
451
  const RootVisitorClass = (0,ramda__WEBPACK_IMPORTED_MODULE_4__["default"])(specPath, resolvedSpec);
451
452
  const rootVisitor = new RootVisitorClass({
452
- specObj: resolvedSpec
453
+ specObj: resolvedSpec,
454
+ consume
453
455
  });
454
456
  (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_2__.traverse)(genericElement, rootVisitor);
455
457
 
@@ -691,8 +693,9 @@ const schema = {
691
693
  }
692
694
  };
693
695
  const findElementFactory = (ancestor, keyName) => {
694
- const elementType = (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_8__.getNodeType)(ancestor); // @ts-ignore
695
- const keyMapping = schema[elementType] || schema[(0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(ancestor.classes.first)];
696
+ const elementType = (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_8__.getNodeType)(ancestor);
697
+ const classType = ancestor.isMetaEmpty ? undefined : ancestor.classes.at(0); // @ts-ignore
698
+ const keyMapping = schema[elementType] || schema[classType];
696
699
  return typeof keyMapping === 'undefined' ? undefined : Object.hasOwn(keyMapping, '[key: *]') ? keyMapping['[key: *]'] : keyMapping[keyName];
697
700
  };
698
701
 
@@ -722,7 +725,7 @@ const plugin = () => () => ({
722
725
  if (typeof elementFactory !== 'function') return;
723
726
  const replacement = elementFactory.call({
724
727
  context
725
- }, undefined, (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(element.meta), (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(element.attributes));
728
+ }, undefined, element.isMetaEmpty ? undefined : element.meta.cloneDeep(), element.isAttributesEmpty ? undefined : (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(element.attributes));
726
729
  _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__["default"].transfer(element, replacement);
727
730
  _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_6__["default"].transfer(element, replacement);
728
731
  path.replaceWith(replacement);
@@ -16360,7 +16363,7 @@ __webpack_require__.r(__webpack_exports__);
16360
16363
  * @public
16361
16364
  */
16362
16365
  const emptyElement = element => {
16363
- const meta = !element.isMetaEmpty ? (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(element.meta) : undefined;
16366
+ const meta = !element.isMetaEmpty ? element.meta.cloneDeep() : undefined;
16364
16367
  const attributes = !element.isAttributesEmpty ? (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(element.attributes) : undefined;
16365
16368
 
16366
16369
  // @ts-ignore
@@ -16376,7 +16379,7 @@ const getMergeFunction = (keyElement, options) => {
16376
16379
  };
16377
16380
  const getMetaMergeFunction = options => {
16378
16381
  if (typeof options.customMetaMerge !== 'function') {
16379
- return targetMeta => (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(targetMeta);
16382
+ return targetMeta => targetMeta.cloneDeep();
16380
16383
  }
16381
16384
  return options.customMetaMerge;
16382
16385
  };
@@ -16448,8 +16451,20 @@ const deepmerge = (targetElement, sourceElement, options) => {
16448
16451
  const mergedElement = sourceIsArrayElement && typeof mergedOptions.arrayElementMerge === 'function' ? mergedOptions.arrayElementMerge(targetElement, sourceElement, mergedOptions) : mergedOptions.objectElementMerge(targetElement, sourceElement, mergedOptions);
16449
16452
 
16450
16453
  // merging meta & attributes
16451
- mergedElement.meta = getMetaMergeFunction(mergedOptions)(targetElement.meta, sourceElement.meta);
16452
- mergedElement.attributes = getAttributesMergeFunction(mergedOptions)(targetElement.attributes, sourceElement.attributes);
16454
+ if (!targetElement.isMetaEmpty && !sourceElement.isMetaEmpty) {
16455
+ mergedElement.meta = getMetaMergeFunction(mergedOptions)(targetElement.meta, sourceElement.meta);
16456
+ } else if (!targetElement.isMetaEmpty) {
16457
+ mergedElement.meta = targetElement.meta.cloneDeep();
16458
+ } else if (!sourceElement.isMetaEmpty) {
16459
+ mergedElement.meta = sourceElement.meta.cloneDeep();
16460
+ }
16461
+ if (!targetElement.isAttributesEmpty && !sourceElement.isAttributesEmpty) {
16462
+ mergedElement.attributes = getAttributesMergeFunction(mergedOptions)(targetElement.attributes, sourceElement.attributes);
16463
+ } else if (!targetElement.isAttributesEmpty) {
16464
+ mergedElement.attributes = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(targetElement.attributes);
16465
+ } else if (!sourceElement.isAttributesEmpty) {
16466
+ mergedElement.attributes = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(sourceElement.attributes);
16467
+ }
16453
16468
  return mergedElement;
16454
16469
  };
16455
16470
  deepmerge.all = (list, options) => {
@@ -16782,6 +16797,104 @@ class KeyValuePair {
16782
16797
 
16783
16798
  /***/ },
16784
16799
 
16800
+ /***/ 1844
16801
+ (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
16802
+
16803
+ __webpack_require__.r(__webpack_exports__);
16804
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
16805
+ /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
16806
+ /* harmony export */ });
16807
+ /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8138);
16808
+
16809
+ /**
16810
+ * Lightweight meta container for Element metadata.
16811
+ *
16812
+ * Data is stored as own properties on the instance; methods live on the prototype.
16813
+ * `Object.keys()`, `Object.entries()`, etc. only see data properties.
16814
+ *
16815
+ * @public
16816
+ */
16817
+ class Metadata {
16818
+ // Set via prototype assignment in registration.ts to avoid circular dependency
16819
+
16820
+ get(name) {
16821
+ return this[name];
16822
+ }
16823
+ set(name, value) {
16824
+ this[name] = value;
16825
+ }
16826
+ hasKey(name) {
16827
+ return Object.hasOwn(this, name);
16828
+ }
16829
+ keys() {
16830
+ return Object.keys(this);
16831
+ }
16832
+ remove(name) {
16833
+ delete this[name];
16834
+ }
16835
+ get isEmpty() {
16836
+ return Object.keys(this).length === 0;
16837
+ }
16838
+ get isFrozen() {
16839
+ return Object.isFrozen(this);
16840
+ }
16841
+ freeze() {
16842
+ for (const value of Object.values(this)) {
16843
+ if (value instanceof this.Element) {
16844
+ value.freeze();
16845
+ } else if (Array.isArray(value) || value !== null && typeof value === 'object') {
16846
+ Object.freeze(value);
16847
+ }
16848
+ }
16849
+ Object.freeze(this);
16850
+ }
16851
+
16852
+ /**
16853
+ * Creates a shallow clone. Same references, new container.
16854
+ */
16855
+ cloneShallow() {
16856
+ const clone = new Metadata();
16857
+ Object.assign(clone, this);
16858
+ return clone;
16859
+ }
16860
+
16861
+ /**
16862
+ * Merges another Metadata into a new instance.
16863
+ * Arrays are concatenated, all other values are overwritten by source.
16864
+ */
16865
+ merge(source) {
16866
+ const result = this.cloneShallow();
16867
+ for (const [key, value] of Object.entries(source)) {
16868
+ const existing = result.get(key);
16869
+ if (Array.isArray(existing) && Array.isArray(value)) {
16870
+ result.set(key, [...existing, ...value]);
16871
+ } else {
16872
+ result.set(key, value);
16873
+ }
16874
+ }
16875
+ return result;
16876
+ }
16877
+
16878
+ /**
16879
+ * Creates a deep clone. Elements are deep cloned,
16880
+ * all other values are deep cloned via ramda clone.
16881
+ */
16882
+ cloneDeep() {
16883
+ const copy = new Metadata();
16884
+ for (const [key, value] of Object.entries(this)) {
16885
+ if (value instanceof this.Element) {
16886
+ copy.set(key, this.cloneDeepElement(value));
16887
+ } else {
16888
+ copy.set(key, (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(value));
16889
+ }
16890
+ }
16891
+ return copy;
16892
+ }
16893
+ }
16894
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Metadata);
16895
+
16896
+ /***/ },
16897
+
16785
16898
  /***/ 5156
16786
16899
  (__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
16787
16900
 
@@ -17422,7 +17535,7 @@ const cloneShallowElement = element => {
17422
17535
  const copy = new Ctor();
17423
17536
  copy.element = element.element;
17424
17537
  if (!element.isMetaEmpty) {
17425
- copy.meta = cloneDeep(element.meta);
17538
+ copy.meta = element.meta.cloneDeep();
17426
17539
  }
17427
17540
  if (!element.isAttributesEmpty) {
17428
17541
  copy.attributes = cloneDeep(element.attributes);
@@ -17450,8 +17563,8 @@ const cloneShallowElement = element => {
17450
17563
 
17451
17564
  /**
17452
17565
  * Creates a shallow clone of an ApiDOM Element, KeyValuePair, or ObjectSlice.
17453
- * The element itself is cloned, but content references are shared (except for
17454
- * meta and attributes which are deep cloned to preserve semantic information).
17566
+ * The element itself is cloned, but content references are shared.
17567
+ * Meta and attributes are deep cloned to preserve semantic information.
17455
17568
  * @public
17456
17569
  */
17457
17570
  const cloneShallow = value => {
@@ -18513,7 +18626,7 @@ class CollectionElement extends _Element_mjs__WEBPACK_IMPORTED_MODULE_0__["defau
18513
18626
  * Search the tree recursively and find the element with the matching ID.
18514
18627
  */
18515
18628
  getById(id) {
18516
- return this.find(item => item.id.toValue() === id).first;
18629
+ return this.find(item => item.id === id).first;
18517
18630
  }
18518
18631
 
18519
18632
  /**
@@ -18542,18 +18655,24 @@ class CollectionElement extends _Element_mjs__WEBPACK_IMPORTED_MODULE_0__["defau
18542
18655
 
18543
18656
  __webpack_require__.r(__webpack_exports__);
18544
18657
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
18658
+ /* harmony export */ Metadata: () => (/* reexport safe */ _Metadata_mjs__WEBPACK_IMPORTED_MODULE_1__["default"]),
18545
18659
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
18546
18660
  /* harmony export */ });
18547
18661
  /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3654);
18548
- /* harmony import */ var _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6663);
18549
- /* harmony import */ var _ObjectSlice_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8504);
18662
+ /* harmony import */ var _Metadata_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(1844);
18663
+ /* harmony import */ var _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6663);
18664
+ /* harmony import */ var _ObjectSlice_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(8504);
18665
+
18550
18666
 
18551
18667
 
18668
+ // shared singleton for frozen elements with no meta — avoids allocation on every access
18669
+ const FROZEN_EMPTY_METADATA = Object.freeze(new _Metadata_mjs__WEBPACK_IMPORTED_MODULE_1__["default"]());
18552
18670
 
18553
18671
  /**
18554
18672
  * Valid content types for an Element.
18555
18673
  * @public
18556
18674
  */
18675
+
18557
18676
  /**
18558
18677
  * Base Element class that all ApiDOM elements extend.
18559
18678
  *
@@ -18651,7 +18770,7 @@ class Element {
18651
18770
  _attributes;
18652
18771
 
18653
18772
  // ============================================================
18654
- // Prototype-assigned properties (set in elements.ts)
18773
+ // Prototype-assigned properties (set in registration.ts)
18655
18774
  // Using 'declare' allows TypeScript to know about these
18656
18775
  // without generating runtime code.
18657
18776
  // ============================================================
@@ -18712,13 +18831,13 @@ class Element {
18712
18831
  }
18713
18832
 
18714
18833
  // KeyValuePair
18715
- if (value instanceof _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_1__["default"]) {
18834
+ if (value instanceof _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_2__["default"]) {
18716
18835
  this._content = value;
18717
18836
  return;
18718
18837
  }
18719
18838
 
18720
18839
  // ObjectSlice - extract elements array
18721
- if (value instanceof _ObjectSlice_mjs__WEBPACK_IMPORTED_MODULE_2__["default"]) {
18840
+ if (value instanceof _ObjectSlice_mjs__WEBPACK_IMPORTED_MODULE_3__["default"]) {
18722
18841
  this._content = value.elements;
18723
18842
  return;
18724
18843
  }
@@ -18739,24 +18858,22 @@ class Element {
18739
18858
 
18740
18859
  /**
18741
18860
  * Metadata about this element (id, classes, title, description, links).
18742
- * Lazily creates an ObjectElement if not set.
18861
+ * Lazily creates a Metadata instance if not set.
18743
18862
  */
18744
18863
  get meta() {
18745
18864
  if (!this._meta) {
18746
- if (this.isFrozen) {
18747
- const meta = new this.ObjectElement();
18748
- meta.freeze();
18749
- return meta;
18750
- }
18751
- this._meta = new this.ObjectElement();
18865
+ if (this.isFrozen) return FROZEN_EMPTY_METADATA;
18866
+ this._meta = new _Metadata_mjs__WEBPACK_IMPORTED_MODULE_1__["default"]();
18752
18867
  }
18753
18868
  return this._meta;
18754
18869
  }
18755
18870
  set meta(value) {
18756
- if (value instanceof Element) {
18871
+ if (value instanceof _Metadata_mjs__WEBPACK_IMPORTED_MODULE_1__["default"]) {
18757
18872
  this._meta = value;
18758
- } else {
18759
- this.meta.set(value ?? {});
18873
+ } else if (value && typeof value === 'object') {
18874
+ const meta = new _Metadata_mjs__WEBPACK_IMPORTED_MODULE_1__["default"]();
18875
+ Object.assign(meta, value);
18876
+ this._meta = meta;
18760
18877
  }
18761
18878
  }
18762
18879
 
@@ -18789,10 +18906,8 @@ class Element {
18789
18906
 
18790
18907
  /** Unique identifier for this element. */
18791
18908
  get id() {
18792
- if (this.isFrozen) {
18793
- return this.getMetaProperty('id', '');
18794
- }
18795
18909
  if (!this.hasMetaProperty('id')) {
18910
+ if (this.isFrozen) return '';
18796
18911
  this.setMetaProperty('id', '');
18797
18912
  }
18798
18913
  return this.meta.get('id');
@@ -18803,10 +18918,8 @@ class Element {
18803
18918
 
18804
18919
  /** CSS-like class names. */
18805
18920
  get classes() {
18806
- if (this.isFrozen) {
18807
- return this.getMetaProperty('classes', []);
18808
- }
18809
18921
  if (!this.hasMetaProperty('classes')) {
18922
+ if (this.isFrozen) return [];
18810
18923
  this.setMetaProperty('classes', []);
18811
18924
  }
18812
18925
  return this.meta.get('classes');
@@ -18817,11 +18930,13 @@ class Element {
18817
18930
 
18818
18931
  /** Hyperlinks associated with this element. */
18819
18932
  get links() {
18820
- if (this.isFrozen) {
18821
- return this.getMetaProperty('links', []);
18822
- }
18823
18933
  if (!this.hasMetaProperty('links')) {
18824
- this.setMetaProperty('links', []);
18934
+ if (this.isFrozen) {
18935
+ const empty = new this.ArrayElement();
18936
+ empty.freeze();
18937
+ return empty;
18938
+ }
18939
+ this.setMetaProperty('links', new this.ArrayElement());
18825
18940
  }
18826
18941
  return this.meta.get('links');
18827
18942
  }
@@ -18841,7 +18956,7 @@ class Element {
18841
18956
  if (Array.isArray(content)) {
18842
18957
  return content;
18843
18958
  }
18844
- if (content instanceof _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_1__["default"]) {
18959
+ if (content instanceof _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_2__["default"]) {
18845
18960
  const children = [];
18846
18961
  if (content.key) children.push(content.key);
18847
18962
  if (content.value) children.push(content.value);
@@ -18871,7 +18986,6 @@ class Element {
18871
18986
 
18872
18987
  // Freeze meta and attributes
18873
18988
  if (this._meta) {
18874
- this._meta.parent = this;
18875
18989
  this._meta.freeze();
18876
18990
  }
18877
18991
  if (this._attributes) {
@@ -18906,7 +19020,7 @@ class Element {
18906
19020
  if (_content instanceof Element) {
18907
19021
  return _content.toValue();
18908
19022
  }
18909
- if (_content instanceof _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_1__["default"]) {
19023
+ if (_content instanceof _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_2__["default"]) {
18910
19024
  return _content.toValue();
18911
19025
  }
18912
19026
  if (Array.isArray(_content)) {
@@ -18962,7 +19076,7 @@ class Element {
18962
19076
  * @throws Error if this element has no ID
18963
19077
  */
18964
19078
  toRef(path) {
18965
- const idValue = this.id.toValue();
19079
+ const idValue = this.id;
18966
19080
  if (idValue === '') {
18967
19081
  throw new Error('Cannot create reference to an element without an ID');
18968
19082
  }
@@ -18974,26 +19088,16 @@ class Element {
18974
19088
  }
18975
19089
 
18976
19090
  /**
18977
- * Gets a meta property.
19091
+ * Gets a meta property value.
18978
19092
  *
18979
19093
  * When the property doesn't exist:
18980
- * - With defaultValue: returns a new refracted element instance (not cached)
19094
+ * - With defaultValue: returns the provided default value
18981
19095
  * - Without defaultValue: returns undefined
18982
- *
18983
- * Note: Each call with a default creates a new instance. Use setMetaProperty
18984
- * first if you need reference equality across multiple accesses.
18985
19096
  */
18986
19097
 
18987
19098
  getMetaProperty(name, defaultValue) {
18988
19099
  if (!this.hasMetaProperty(name)) {
18989
- if (defaultValue === undefined) {
18990
- return undefined;
18991
- }
18992
- const element = this.refract(defaultValue);
18993
- if (element && this.isFrozen) {
18994
- element.freeze();
18995
- }
18996
- return element;
19100
+ return defaultValue;
18997
19101
  }
18998
19102
  return this.meta.get(name);
18999
19103
  }
@@ -19006,20 +19110,17 @@ class Element {
19006
19110
  }
19007
19111
 
19008
19112
  /**
19009
- * Has meta property.
19113
+ * Checks whether a meta property exists.
19010
19114
  */
19011
19115
  hasMetaProperty(name) {
19012
- if (!this.isMetaEmpty) {
19013
- return this.meta.hasKey(name);
19014
- }
19015
- return false;
19116
+ return this._meta !== undefined && this._meta.hasKey(name);
19016
19117
  }
19017
19118
 
19018
19119
  /**
19019
19120
  * Checks if meta is empty.
19020
19121
  */
19021
19122
  get isMetaEmpty() {
19022
- return this._meta === undefined || this.meta.isEmpty;
19123
+ return this._meta === undefined || this._meta.isEmpty;
19023
19124
  }
19024
19125
 
19025
19126
  /**
@@ -19045,7 +19146,7 @@ class Element {
19045
19146
  }
19046
19147
 
19047
19148
  /**
19048
- * Has attributes property.
19149
+ * Checks whether an attributes property exists.
19049
19150
  */
19050
19151
  hasAttributesProperty(name) {
19051
19152
  if (!this.isAttributesEmpty) {
@@ -19064,6 +19165,7 @@ class Element {
19064
19165
 
19065
19166
  // Re-export types for convenience
19066
19167
 
19168
+
19067
19169
  /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (Element);
19068
19170
 
19069
19171
  /***/ },
@@ -19496,6 +19598,10 @@ __webpack_require__.r(__webpack_exports__);
19496
19598
  /* harmony import */ var _elements_Style_mjs__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(9686);
19497
19599
  /* harmony import */ var _ObjectSlice_mjs__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(8504);
19498
19600
  /* harmony import */ var _KeyValuePair_mjs__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(6663);
19601
+ /* harmony import */ var _Metadata_mjs__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(1844);
19602
+ /* harmony import */ var _clone_index_mjs__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(2111);
19603
+
19604
+
19499
19605
 
19500
19606
 
19501
19607
 
@@ -19555,14 +19661,16 @@ function refract(value) {
19555
19661
  }
19556
19662
 
19557
19663
  // Set up prototype assignments for circular dependency resolution.
19558
- // These allow Element instances to create ObjectElement, MemberElement, RefElement
19559
- // without importing them directly (which would cause circular imports).
19664
+ // These allow Element and Metadata instances to reference classes they can't import
19665
+ // directly (which would cause circular imports).
19560
19666
  // Using 'declare' in the class definitions enables type-safe access to these properties.
19561
19667
  _primitives_Element_mjs__WEBPACK_IMPORTED_MODULE_0__["default"].prototype.ObjectElement = _primitives_ObjectElement_mjs__WEBPACK_IMPORTED_MODULE_8__["default"];
19562
19668
  _primitives_Element_mjs__WEBPACK_IMPORTED_MODULE_0__["default"].prototype.ArrayElement = _primitives_ArrayElement_mjs__WEBPACK_IMPORTED_MODULE_6__["default"];
19563
19669
  _primitives_Element_mjs__WEBPACK_IMPORTED_MODULE_0__["default"].prototype.RefElement = _elements_RefElement_mjs__WEBPACK_IMPORTED_MODULE_10__["default"];
19564
19670
  _primitives_Element_mjs__WEBPACK_IMPORTED_MODULE_0__["default"].prototype.MemberElement = _primitives_MemberElement_mjs__WEBPACK_IMPORTED_MODULE_7__["default"];
19565
19671
  _primitives_Element_mjs__WEBPACK_IMPORTED_MODULE_0__["default"].prototype.refract = refract;
19672
+ _Metadata_mjs__WEBPACK_IMPORTED_MODULE_18__["default"].prototype.Element = _primitives_Element_mjs__WEBPACK_IMPORTED_MODULE_0__["default"];
19673
+ _Metadata_mjs__WEBPACK_IMPORTED_MODULE_18__["default"].prototype.cloneDeepElement = element => (0,_clone_index_mjs__WEBPACK_IMPORTED_MODULE_19__.cloneDeep)(element);
19566
19674
 
19567
19675
  /**
19568
19676
  * Contains all of the element classes, and related structures and methods
@@ -19626,7 +19734,13 @@ class JSONSerialiser {
19626
19734
  element: element.element
19627
19735
  };
19628
19736
  if (!element.isMetaEmpty) {
19629
- payload.meta = this.serialiseObject(element.meta);
19737
+ const serialisedMeta = this.serialiseMeta(element);
19738
+ if (serialisedMeta) {
19739
+ payload.meta = serialisedMeta.meta;
19740
+ if (serialisedMeta.rawKeys.length > 0) {
19741
+ payload.__meta_raw__ = serialisedMeta.rawKeys;
19742
+ }
19743
+ }
19630
19744
  }
19631
19745
  if (!element.isAttributesEmpty) {
19632
19746
  payload.attributes = this.serialiseObject(element.attributes);
@@ -19673,7 +19787,7 @@ class JSONSerialiser {
19673
19787
  element.element = value.element;
19674
19788
  }
19675
19789
 
19676
- // Extract __mappings__ and __styles__ without mutating input, filter remaining meta
19790
+ // Extract special meta keys without mutating input, filter remaining meta
19677
19791
  let mappingsDoc;
19678
19792
  let stylesDoc;
19679
19793
  let metaToDeserialize = value.meta;
@@ -19687,8 +19801,15 @@ class JSONSerialiser {
19687
19801
  stylesDoc = __styles__;
19688
19802
  metaToDeserialize = Object.keys(rest).length > 0 ? rest : undefined;
19689
19803
  }
19804
+
19805
+ // determine which meta keys were raw primitives before serialization
19806
+ const rawKeys = value.__meta_raw__ ? new Set(value.__meta_raw__) : undefined;
19690
19807
  if (metaToDeserialize) {
19691
- this.deserialiseObject(metaToDeserialize, element.meta);
19808
+ for (const [key, doc] of Object.entries(metaToDeserialize)) {
19809
+ const deserialized = this.deserialise(doc);
19810
+ // unwrap keys that were raw primitives before serialization
19811
+ element.setMetaProperty(key, rawKeys?.has(key) ? deserialized.toValue() : deserialized);
19812
+ }
19692
19813
  }
19693
19814
 
19694
19815
  // Restore source position from __mappings__
@@ -19751,6 +19872,27 @@ class JSONSerialiser {
19751
19872
  }
19752
19873
  return content;
19753
19874
  }
19875
+ serialiseMeta(element) {
19876
+ const meta = {};
19877
+ const rawKeys = [];
19878
+ let hasEntries = false;
19879
+ for (const [key, value] of Object.entries(element.meta)) {
19880
+ if (value instanceof this.namespace.elements.Element) {
19881
+ meta[key] = this.serialise(value);
19882
+ hasEntries = true;
19883
+ } else if (value !== undefined) {
19884
+ // refract primitives to maintain JSON Refract spec compatibility
19885
+ const refracted = element.refract(value);
19886
+ meta[key] = this.serialise(refracted);
19887
+ rawKeys.push(key);
19888
+ hasEntries = true;
19889
+ }
19890
+ }
19891
+ return hasEntries ? {
19892
+ meta,
19893
+ rawKeys
19894
+ } : undefined;
19895
+ }
19754
19896
  serialiseObject(obj) {
19755
19897
  const result = {};
19756
19898
  obj.forEach((value, key) => {
@@ -20705,7 +20847,7 @@ __webpack_require__.r(__webpack_exports__);
20705
20847
  */
20706
20848
  class FallbackVisitor extends _Visitor_mjs__WEBPACK_IMPORTED_MODULE_1__["default"] {
20707
20849
  enter(path) {
20708
- this.element = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.cloneDeep)(path.node);
20850
+ this.element = this.consume ? path.node : (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.cloneDeep)(path.node);
20709
20851
  path.stop();
20710
20852
  }
20711
20853
  }
@@ -20744,7 +20886,7 @@ __webpack_require__.r(__webpack_exports__);
20744
20886
  */
20745
20887
  class SpecificationVisitor extends _Visitor_mjs__WEBPACK_IMPORTED_MODULE_6__["default"] {
20746
20888
  specObj;
20747
- passingOptionsNames = ['specObj', 'parent'];
20889
+ passingOptionsNames = ['specObj', 'parent', 'consume'];
20748
20890
  constructor({
20749
20891
  specObj,
20750
20892
  ...rest
@@ -20790,7 +20932,7 @@ class SpecificationVisitor extends _Visitor_mjs__WEBPACK_IMPORTED_MODULE_6__["de
20790
20932
  */
20791
20933
  const visitor = this.retrieveVisitorInstance(specPath, options);
20792
20934
  if (visitor instanceof _FallbackVisitor_mjs__WEBPACK_IMPORTED_MODULE_7__["default"] && visitor?.constructor === _FallbackVisitor_mjs__WEBPACK_IMPORTED_MODULE_7__["default"]) {
20793
- return (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneDeep)(element);
20935
+ return this.consume ? element : (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.cloneDeep)(element);
20794
20936
  }
20795
20937
  (0,_speclynx_apidom_traverse__WEBPACK_IMPORTED_MODULE_5__.traverse)(element, visitor, options);
20796
20938
  return visitor.element;
@@ -20808,7 +20950,7 @@ __webpack_require__.r(__webpack_exports__);
20808
20950
  /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
20809
20951
  /* harmony export */ });
20810
20952
  /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8400);
20811
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7071);
20953
+ /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2111);
20812
20954
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5810);
20813
20955
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(9686);
20814
20956
 
@@ -20823,19 +20965,21 @@ __webpack_require__.r(__webpack_exports__);
20823
20965
  */
20824
20966
  class Visitor {
20825
20967
  element;
20968
+ consume = false;
20969
+ consumeSafe = false;
20826
20970
  constructor(options) {
20827
20971
  Object.assign(this, options);
20828
20972
  }
20829
20973
  copyMetaAndAttributes(from, to) {
20830
- if (!from.isMetaEmpty || !to.isMetaEmpty) {
20831
- const target = to.isMetaEmpty ? new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__["default"]() : to.meta;
20832
- const source = from.isMetaEmpty ? new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__["default"]() : from.meta;
20833
- to.meta = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_0__["default"])(target, source);
20974
+ if (!from.isMetaEmpty && !to.isMetaEmpty) {
20975
+ to.meta = to.meta.merge(from.meta);
20976
+ } else if (!from.isMetaEmpty) {
20977
+ to.meta = from.meta.cloneDeep();
20834
20978
  }
20835
- if (!from.isAttributesEmpty || !to.isAttributesEmpty) {
20836
- const target = to.isAttributesEmpty ? new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__["default"]() : to.attributes;
20837
- const source = from.isAttributesEmpty ? new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__["default"]() : from.attributes;
20838
- to.attributes = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_0__["default"])(target, source);
20979
+ if (!from.isAttributesEmpty && !to.isAttributesEmpty) {
20980
+ to.attributes = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_0__["default"])(to.attributes, from.attributes);
20981
+ } else if (!from.isAttributesEmpty) {
20982
+ to.attributes = (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(from.attributes);
20839
20983
  }
20840
20984
  _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__["default"].transfer(from, to);
20841
20985
  _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__["default"].transfer(from, to);
@@ -20943,12 +21087,13 @@ class FixedFieldsVisitor extends _SpecificationVisitor_mjs__WEBPACK_IMPORTED_MOD
20943
21087
  const keyValue = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_3__["default"])(key);
20944
21088
  if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_0__.isStringElement)(key) && fields.includes(keyValue) && !this.ignoredFields.includes(keyValue)) {
20945
21089
  const fixedFieldElement = this.toRefractedElement([...specPath, 'fixedFields', keyValue], value);
20946
- const newMemberElement = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__["default"]((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(key), fixedFieldElement);
21090
+ 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);
20947
21091
  this.copyMetaAndAttributes(memberElement, newMemberElement);
20948
- newMemberElement.classes.push('fixed-field');
20949
21092
  this.element.content.push(newMemberElement);
21093
+ // consume: release processed generic subtree
21094
+ if (this.consume && this.consumeSafe && !memberElement.isFrozen) memberElement.value = undefined;
20950
21095
  } else if (!this.ignoredFields.includes(keyValue)) {
20951
- this.element.content.push((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(memberElement));
21096
+ this.element.content.push(this.consume ? memberElement : (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(memberElement));
20952
21097
  }
20953
21098
  });
20954
21099
  this.copyMetaAndAttributes(objectElement, this.element);
@@ -21035,12 +21180,14 @@ class PatternedFieldsVisitor extends _SpecificationVisitor_mjs__WEBPACK_IMPORTED
21035
21180
  if (!this.ignoredFields.includes(keyValue) && this.fieldPatternPredicate(keyValue)) {
21036
21181
  const specPath = this.specPath(value);
21037
21182
  const patternedFieldElement = this.toRefractedElement(specPath, value);
21038
- const newMemberElement = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__["default"]((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(key), patternedFieldElement);
21183
+ 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);
21039
21184
  this.copyMetaAndAttributes(memberElement, newMemberElement);
21040
21185
  newMemberElement.classes.push('patterned-field');
21041
21186
  this.element.content.push(newMemberElement);
21187
+ // consume: release processed generic subtree
21188
+ if (this.consume && this.consumeSafe && !memberElement.isFrozen) memberElement.value = undefined;
21042
21189
  } else if (!this.ignoredFields.includes(keyValue)) {
21043
- this.element.content.push((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(memberElement));
21190
+ this.element.content.push(this.consume ? memberElement : (0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.cloneDeep)(memberElement));
21044
21191
  }
21045
21192
  });
21046
21193
  this.copyMetaAndAttributes(objectElement, this.element);
@@ -21582,13 +21729,11 @@ __webpack_require__.r(__webpack_exports__);
21582
21729
  /* harmony import */ var ramda_adjunct__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3031);
21583
21730
  /* harmony import */ var ramda_adjunct__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6513);
21584
21731
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(5162);
21585
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(2111);
21586
- /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(7601);
21587
- /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(4673);
21588
- /* harmony import */ var _generics_FixedFieldsVisitor_mjs__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(5320);
21589
- /* harmony import */ var _bases_mjs__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(9033);
21590
- /* harmony import */ var _elements_JSONSchema_mjs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(4686);
21591
- /* harmony import */ var _predicates_mjs__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(6059);
21732
+ /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(4673);
21733
+ /* harmony import */ var _generics_FixedFieldsVisitor_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(5320);
21734
+ /* harmony import */ var _bases_mjs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(9033);
21735
+ /* harmony import */ var _elements_JSONSchema_mjs__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(4686);
21736
+ /* harmony import */ var _predicates_mjs__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(6059);
21592
21737
 
21593
21738
 
21594
21739
 
@@ -21603,10 +21748,11 @@ __webpack_require__.r(__webpack_exports__);
21603
21748
  /**
21604
21749
  * @public
21605
21750
  */
21606
- class JSONSchemaVisitor extends _bases_mjs__WEBPACK_IMPORTED_MODULE_9__.JSONSchemaVisitorBase {
21751
+ class JSONSchemaVisitor extends _bases_mjs__WEBPACK_IMPORTED_MODULE_7__.JSONSchemaVisitorBase {
21607
21752
  constructor(options) {
21608
21753
  super(options);
21609
- this.element = new _elements_JSONSchema_mjs__WEBPACK_IMPORTED_MODULE_10__["default"]();
21754
+ this.element = new _elements_JSONSchema_mjs__WEBPACK_IMPORTED_MODULE_8__["default"]();
21755
+ this.consumeSafe = true;
21610
21756
  this.specPath = (0,ramda__WEBPACK_IMPORTED_MODULE_0__["default"])(['document', 'objects', 'JSONSchema']);
21611
21757
  }
21612
21758
  get defaultDialectIdentifier() {
@@ -21619,27 +21765,27 @@ class JSONSchemaVisitor extends _bases_mjs__WEBPACK_IMPORTED_MODULE_9__.JSONSche
21619
21765
 
21620
21766
  // for further processing consider this JSONSchema Element as parent for all sub-schemas
21621
21767
  this.parent = this.element;
21622
- return _generics_FixedFieldsVisitor_mjs__WEBPACK_IMPORTED_MODULE_8__["default"].prototype.ObjectElement.call(this, path);
21768
+ return _generics_FixedFieldsVisitor_mjs__WEBPACK_IMPORTED_MODULE_6__["default"].prototype.ObjectElement.call(this, path);
21623
21769
  }
21624
21770
  handleDialectIdentifier(objectElement) {
21625
21771
  // handle $schema keyword in embedded resources
21626
21772
  if ((0,ramda_adjunct__WEBPACK_IMPORTED_MODULE_2__["default"])(this.parent) && !(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.isStringElement)(objectElement.get('$schema'))) {
21627
21773
  // no parent available and no $schema is defined, set default $schema
21628
21774
  this.element.meta.set('inheritedDialectIdentifier', this.defaultDialectIdentifier);
21629
- } else if ((0,_predicates_mjs__WEBPACK_IMPORTED_MODULE_11__.isJSONSchemaElement)(this.parent) && !(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.isStringElement)(objectElement.get('$schema'))) {
21775
+ } else if ((0,_predicates_mjs__WEBPACK_IMPORTED_MODULE_9__.isJSONSchemaElement)(this.parent) && !(0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_4__.isStringElement)(objectElement.get('$schema'))) {
21630
21776
  // parent is available and no $schema is defined, set parent $schema
21631
- 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));
21777
+ 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));
21632
21778
  this.element.meta.set('inheritedDialectIdentifier', inheritedDialectIdentifier);
21633
21779
  }
21634
21780
  }
21635
21781
  handleSchemaIdentifier(objectElement, identifierKeyword = 'id') {
21636
21782
  // handle schema identifier in embedded resources
21637
- // fetch parent's ancestorsSchemaIdentifiers
21638
- 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"]();
21783
+ // fetch parent's ancestorsSchemaIdentifiers (stored as plain string[])
21784
+ const ancestorsSchemaIdentifiers = this.parent !== undefined ? [...(this.parent.meta.get('ancestorsSchemaIdentifiers') ?? [])] : [];
21639
21785
  // get current schema identifier
21640
- const schemaIdentifier = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_7__["default"])(objectElement.get(identifierKeyword));
21786
+ const schemaIdentifier = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_5__["default"])(objectElement.get(identifierKeyword));
21641
21787
 
21642
- // remember schema identifier if it's a non-empty strings
21788
+ // remember schema identifier if it's a non-empty string
21643
21789
  if ((0,ramda_adjunct__WEBPACK_IMPORTED_MODULE_3__["default"])(schemaIdentifier)) {
21644
21790
  ancestorsSchemaIdentifiers.push(schemaIdentifier);
21645
21791
  }