@speclynx/apidom-overlay 5.2.5 → 5.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,10 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [5.2.6](https://github.com/speclynx/apidom/compare/v5.2.5...v5.2.6) (2026-09-19)
7
+
8
+ **Note:** Version bump only for package @speclynx/apidom-overlay
9
+
6
10
  ## [5.2.5](https://github.com/speclynx/apidom/compare/v5.2.4...v5.2.5) (2026-09-17)
7
11
 
8
12
  **Note:** Version bump only for package @speclynx/apidom-overlay
@@ -102127,6 +102127,17 @@ class Arazzo1DereferenceStrategy extends _DereferenceStrategy_mjs__WEBPACK_IMPOR
102127
102127
  })
102128
102128
  });
102129
102129
 
102130
+ /**
102131
+ * If immutable option is set, replay refs from the refSet.
102132
+ * Replayed before source descriptions are dereferenced, so they can reuse the refs.
102133
+ */
102134
+ if (options.dereference.immutable) {
102135
+ mutableRefSet.refs.filter(ref => ref.uri.startsWith('immutable://')).map(ref => new _Reference_mjs__WEBPACK_IMPORTED_MODULE_7__["default"]({
102136
+ ...ref,
102137
+ uri: ref.uri.replace(/^immutable:\/\//, '')
102138
+ })).forEach(ref => immutableRefSet.add(ref));
102139
+ }
102140
+
102130
102141
  /**
102131
102142
  * Dereference source descriptions if option is enabled.
102132
102143
  */
@@ -102141,16 +102152,6 @@ class Arazzo1DereferenceStrategy extends _DereferenceStrategy_mjs__WEBPACK_IMPOR
102141
102152
  parseResult.push(...sourceDescriptions);
102142
102153
  }
102143
102154
 
102144
- /**
102145
- * If immutable option is set, replay refs from the refSet.
102146
- */
102147
- if (options.dereference.immutable) {
102148
- mutableRefSet.refs.filter(ref => ref.uri.startsWith('immutable://')).map(ref => new _Reference_mjs__WEBPACK_IMPORTED_MODULE_7__["default"]({
102149
- ...ref,
102150
- uri: ref.uri.replace(/^immutable:\/\//, '')
102151
- })).forEach(ref => immutableRefSet.add(ref));
102152
- }
102153
-
102154
102155
  /**
102155
102156
  * Release all memory if this refSet was not provided as a configuration option.
102156
102157
  * If provided as configuration option, then provider is responsible for cleanup.
@@ -102187,10 +102188,18 @@ __webpack_require__.r(__webpack_exports__);
102187
102188
  /* harmony import */ var _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4823);
102188
102189
  /* harmony import */ var _speclynx_apidom_ns_arazzo_1__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(28839);
102189
102190
  /* harmony import */ var _speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(44673);
102190
- /* harmony import */ var _util_url_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(18917);
102191
- /* harmony import */ var _options_util_mjs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(7778);
102192
- /* harmony import */ var _index_mjs__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(79920);
102193
- /* harmony import */ var _util_mjs__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(42424);
102191
+ /* harmony import */ var ramda__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(164);
102192
+ /* harmony import */ var _util_url_mjs__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(18917);
102193
+ /* harmony import */ var _Reference_mjs__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(82302);
102194
+ /* harmony import */ var _ReferenceSet_mjs__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(88526);
102195
+ /* harmony import */ var _options_util_mjs__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(7778);
102196
+ /* harmony import */ var _parse_index_mjs__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(85533);
102197
+ /* harmony import */ var _index_mjs__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(79920);
102198
+ /* harmony import */ var _util_mjs__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(42424);
102199
+
102200
+
102201
+
102202
+
102194
102203
 
102195
102204
 
102196
102205
 
@@ -102224,7 +102233,7 @@ async function dereferenceSourceDescription(sourceDescription, ctx) {
102224
102233
  }
102225
102234
 
102226
102235
  // normalize URI for consistent cycle detection and refSet cache key matching
102227
- const retrievalURI = _util_url_mjs__WEBPACK_IMPORTED_MODULE_6__.sanitize(_util_url_mjs__WEBPACK_IMPORTED_MODULE_6__.stripHash(_util_url_mjs__WEBPACK_IMPORTED_MODULE_6__.resolve(ctx.baseURI, sourceDescriptionURI)));
102236
+ const retrievalURI = _util_url_mjs__WEBPACK_IMPORTED_MODULE_7__.sanitize(_util_url_mjs__WEBPACK_IMPORTED_MODULE_7__.stripHash(_util_url_mjs__WEBPACK_IMPORTED_MODULE_7__.resolve(ctx.baseURI, sourceDescriptionURI)));
102228
102237
  parseResult.setMetaProperty('retrievalURI', retrievalURI);
102229
102238
 
102230
102239
  // skip if the document is still being dereferenced higher up the chain (cycle detection)
@@ -102243,58 +102252,69 @@ async function dereferenceSourceDescription(sourceDescription, ctx) {
102243
102252
  annotation.classes.push('info');
102244
102253
  parseResult.push(annotation);
102245
102254
  parseResult.meta.set('parseResult', sharedDereferenceResult);
102246
- (0,_util_mjs__WEBPACK_IMPORTED_MODULE_9__.validateSourceDescriptionAPI)(parseResult, sourceDescription, sharedDereferenceResult.api, retrievalURI);
102255
+ (0,_util_mjs__WEBPACK_IMPORTED_MODULE_13__.validateSourceDescriptionAPI)(parseResult, sourceDescription, sharedDereferenceResult.api, retrievalURI);
102247
102256
  return parseResult;
102248
102257
  }
102249
102258
 
102250
102259
  // check if source description was already parsed (e.g., during parse phase with sourceDescriptions: true)
102251
102260
  const existingParseResult = sourceDescription.meta.get('parseResult');
102261
+ const parentRefSet = ctx.options.dereference.refSet;
102262
+ let refSet = null;
102252
102263
  try {
102253
- let sourceDescriptionDereferenced;
102254
- if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isParseResultElement)(existingParseResult)) {
102255
- // use existing parsed result - just dereference it (no re-fetch/re-parse)
102256
- sourceDescriptionDereferenced = await (0,_index_mjs__WEBPACK_IMPORTED_MODULE_8__.dereferenceApiDOM)(existingParseResult, (0,_options_util_mjs__WEBPACK_IMPORTED_MODULE_7__.merge)(ctx.options, {
102257
- parse: {
102258
- mediaType: 'text/plain' // allow dereference strategy detection via ApiDOM inspection
102259
- },
102260
- resolve: {
102261
- baseURI: retrievalURI
102262
- },
102263
- dereference: {
102264
- strategyOpts: {
102265
- // nested documents should dereference all their source descriptions
102266
- // (parent's name filter doesn't apply to nested documents)
102267
- // set at strategy-specific level to override any inherited filters
102268
- [ctx.strategyName]: {
102269
- sourceDescriptions: true,
102270
- sourceDescriptionsDepth: ctx.currentDepth + 1,
102271
- sourceDescriptionsAncestors: ctx.ancestors,
102272
- sourceDescriptionsDereferenced: ctx.dereferenced
102273
- }
102274
- }
102275
- }
102276
- }));
102264
+ // source description document comes from, in order of preference:
102265
+ // caller-supplied refSet, parse phase, or is fetched and parsed now
102266
+ const cachedReference = parentRefSet?.find(ref => ref.uri === retrievalURI);
102267
+ let sourceDescriptionParseResult;
102268
+ let isFreshlyParsed = false;
102269
+ if (cachedReference !== undefined) {
102270
+ sourceDescriptionParseResult = cachedReference.value;
102271
+ } else if ((0,_speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_1__.isParseResultElement)(existingParseResult)) {
102272
+ sourceDescriptionParseResult = existingParseResult;
102277
102273
  } else {
102278
- // no existing parse result - fetch, parse, and dereference
102279
- sourceDescriptionDereferenced = await (0,_index_mjs__WEBPACK_IMPORTED_MODULE_8__["default"])(retrievalURI, (0,_options_util_mjs__WEBPACK_IMPORTED_MODULE_7__.merge)(ctx.options, {
102274
+ sourceDescriptionParseResult = await (0,_parse_index_mjs__WEBPACK_IMPORTED_MODULE_11__["default"])(retrievalURI, (0,_options_util_mjs__WEBPACK_IMPORTED_MODULE_10__.merge)(ctx.options, {
102280
102275
  parse: {
102281
- mediaType: 'text/plain' // allow parser plugin detection
102282
- },
102283
- dereference: {
102284
- strategyOpts: {
102285
- // nested documents should dereference all their source descriptions
102286
- // (parent's name filter doesn't apply to nested documents)
102287
- // set at strategy-specific level to override any inherited filters
102288
- [ctx.strategyName]: {
102289
- sourceDescriptions: true,
102290
- sourceDescriptionsDepth: ctx.currentDepth + 1,
102291
- sourceDescriptionsAncestors: ctx.ancestors,
102292
- sourceDescriptionsDereferenced: ctx.dereferenced
102293
- }
102294
- }
102295
- }
102276
+ mediaType: 'text/plain'
102277
+ } // allow parser plugin detection
102296
102278
  }));
102279
+ isFreshlyParsed = true;
102280
+ }
102281
+
102282
+ // caller-supplied refSet is rooted at the entry document, but strategies dereference
102283
+ // the root of the refSet; re-root its references at the source description
102284
+ if (parentRefSet !== null) {
102285
+ refSet = new _ReferenceSet_mjs__WEBPACK_IMPORTED_MODULE_9__["default"]({
102286
+ refs: [new _Reference_mjs__WEBPACK_IMPORTED_MODULE_8__["default"]({
102287
+ uri: retrievalURI,
102288
+ value: sourceDescriptionParseResult
102289
+ }), ...parentRefSet.refs.map(ref => new _Reference_mjs__WEBPACK_IMPORTED_MODULE_8__["default"]({
102290
+ ...ref,
102291
+ refSet: undefined
102292
+ }))]
102293
+ });
102297
102294
  }
102295
+ const sourceDescriptionDereferenced = await (0,_index_mjs__WEBPACK_IMPORTED_MODULE_12__.dereferenceApiDOM)(sourceDescriptionParseResult, (0,_options_util_mjs__WEBPACK_IMPORTED_MODULE_10__.merge)((0,ramda__WEBPACK_IMPORTED_MODULE_6__["default"])(['dereference', 'refSet'], refSet, ctx.options), {
102296
+ parse: {
102297
+ mediaType: 'text/plain' // allow dereference strategy detection via ApiDOM inspection
102298
+ },
102299
+ resolve: {
102300
+ baseURI: retrievalURI
102301
+ },
102302
+ dereference: {
102303
+ // freshly parsed document not reported to any refSet can be dereferenced in mutable mode
102304
+ immutable: ctx.options.dereference.immutable && !(isFreshlyParsed && parentRefSet === null),
102305
+ strategyOpts: {
102306
+ // nested documents should dereference all their source descriptions
102307
+ // (parent's name filter doesn't apply to nested documents)
102308
+ // set at strategy-specific level to override any inherited filters
102309
+ [ctx.strategyName]: {
102310
+ sourceDescriptions: true,
102311
+ sourceDescriptionsDepth: ctx.currentDepth + 1,
102312
+ sourceDescriptionsAncestors: ctx.ancestors,
102313
+ sourceDescriptionsDereferenced: ctx.dereferenced
102314
+ }
102315
+ }
102316
+ }
102317
+ }));
102298
102318
 
102299
102319
  // merge dereferenced result into our parse result
102300
102320
  for (const item of sourceDescriptionDereferenced) {
@@ -102307,16 +102327,23 @@ async function dereferenceSourceDescription(sourceDescription, ctx) {
102307
102327
  annotation.classes.push('error');
102308
102328
  parseResult.push(annotation);
102309
102329
  return parseResult;
102330
+ } finally {
102331
+ // report documents reached through the source description to the caller-supplied refSet,
102332
+ // even when dereferencing it failed
102333
+ if (parentRefSet !== null && refSet !== null) {
102334
+ parentRefSet.merge(refSet);
102335
+ parentRefSet.circular ||= refSet.circular;
102336
+ }
102310
102337
  }
102311
102338
 
102312
102339
  // register dereferenced document for later references to it
102313
102340
  const {
102314
102341
  api: sourceDescriptionAPI
102315
102342
  } = parseResult;
102316
- for (const documentURI of (0,_util_mjs__WEBPACK_IMPORTED_MODULE_9__.arazzoDocumentURIs)(retrievalURI, sourceDescriptionAPI)) {
102343
+ for (const documentURI of (0,_util_mjs__WEBPACK_IMPORTED_MODULE_13__.arazzoDocumentURIs)(retrievalURI, sourceDescriptionAPI)) {
102317
102344
  ctx.dereferenced.set(documentURI, parseResult);
102318
102345
  }
102319
- ;(0,_util_mjs__WEBPACK_IMPORTED_MODULE_9__.validateSourceDescriptionAPI)(parseResult, sourceDescription, sourceDescriptionAPI, retrievalURI);
102346
+ ;(0,_util_mjs__WEBPACK_IMPORTED_MODULE_13__.validateSourceDescriptionAPI)(parseResult, sourceDescription, sourceDescriptionAPI, retrievalURI);
102320
102347
  return parseResult;
102321
102348
  }
102322
102349
 
@@ -102369,7 +102396,7 @@ async function dereferenceSourceDescription(sourceDescription, ctx) {
102369
102396
  * @public
102370
102397
  */
102371
102398
  async function dereferenceSourceDescriptions(parseResult, parseResultRetrievalURI, options, strategyName = 'arazzo-1') {
102372
- const retrievalURI = _util_url_mjs__WEBPACK_IMPORTED_MODULE_6__.sanitize(_util_url_mjs__WEBPACK_IMPORTED_MODULE_6__.stripHash(parseResultRetrievalURI));
102399
+ const retrievalURI = _util_url_mjs__WEBPACK_IMPORTED_MODULE_7__.sanitize(_util_url_mjs__WEBPACK_IMPORTED_MODULE_7__.stripHash(parseResultRetrievalURI));
102373
102400
  const results = [];
102374
102401
 
102375
102402
  // get API from dereferenced parse result
@@ -102400,7 +102427,7 @@ async function dereferenceSourceDescriptions(parseResult, parseResultRetrievalUR
102400
102427
  const currentDepth = sharedOpts.sourceDescriptionsDepth ?? 0;
102401
102428
  const dereferenced = sharedOpts.sourceDescriptionsDereferenced ?? new Map();
102402
102429
  // current file is an ancestor of everything dereferenced below
102403
- const ancestors = [...(sharedOpts.sourceDescriptionsAncestors ?? []), ...(0,_util_mjs__WEBPACK_IMPORTED_MODULE_9__.arazzoDocumentURIs)(retrievalURI, api)];
102430
+ const ancestors = [...(sharedOpts.sourceDescriptionsAncestors ?? []), ...(0,_util_mjs__WEBPACK_IMPORTED_MODULE_13__.arazzoDocumentURIs)(retrievalURI, api)];
102404
102431
  if (currentDepth >= maxDepth) {
102405
102432
  const annotation = new _speclynx_apidom_datamodel__WEBPACK_IMPORTED_MODULE_2__["default"](`Maximum dereference depth of ${maxDepth} has been exceeded by file "${retrievalURI}"`);
102406
102433
  annotation.classes.push('error');
@@ -102410,7 +102437,7 @@ async function dereferenceSourceDescriptions(parseResult, parseResultRetrievalUR
102410
102437
  }
102411
102438
  const ctx = {
102412
102439
  // base URI for resolving source description URLs honors Arazzo `$self` field
102413
- baseURI: (0,_util_mjs__WEBPACK_IMPORTED_MODULE_9__.resolveArazzo$selfField)(retrievalURI, api),
102440
+ baseURI: (0,_util_mjs__WEBPACK_IMPORTED_MODULE_13__.resolveArazzo$selfField)(retrievalURI, api),
102414
102441
  options,
102415
102442
  strategyName,
102416
102443
  currentDepth,
@@ -102859,34 +102886,38 @@ class Arazzo1DereferenceVisitor {
102859
102886
  return;
102860
102887
  }
102861
102888
  const runtimeExpression = (0,_speclynx_apidom_core__WEBPACK_IMPORTED_MODULE_6__["default"])(referencingElement.reference);
102862
-
102863
- // parse the runtime expression
102864
- const {
102865
- result,
102866
- tree
102867
- } = (0,_swaggerexpert_arazzo_runtime_expression__WEBPACK_IMPORTED_MODULE_15__.parse)(runtimeExpression);
102868
- if (!result.success) {
102869
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_8__["default"](`Invalid Reusable Object reference format: "${runtimeExpression}"`, {
102870
- runtimeExpression
102871
- });
102872
- }
102873
-
102874
- // ReusableElement can only reference components
102875
- if (tree.type !== 'ComponentsExpression') {
102876
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_8__["default"](`Reusable Object reference "${runtimeExpression}" must be a components expression`, {
102877
- runtimeExpression
102878
- });
102879
- }
102880
-
102881
- // evaluate runtime expression as JSON Pointer to get the referenced element
102882
- const jsonPointer = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__.compile)(['components', tree.componentType, tree.componentName]);
102883
102889
  let referencedElement;
102884
102890
  try {
102885
- referencedElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_10__.evaluate)(this.reference.value.result, jsonPointer);
102886
- } catch {
102887
- throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_8__["default"](`Reusable Object reference "${runtimeExpression}" cannot be resolved`, {
102888
- runtimeExpression
102889
- });
102891
+ // parse the runtime expression
102892
+ const {
102893
+ result,
102894
+ tree
102895
+ } = (0,_swaggerexpert_arazzo_runtime_expression__WEBPACK_IMPORTED_MODULE_15__.parse)(runtimeExpression);
102896
+ if (!result.success) {
102897
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_8__["default"](`Invalid Reusable Object reference format: "${runtimeExpression}"`, {
102898
+ runtimeExpression
102899
+ });
102900
+ }
102901
+
102902
+ // ReusableElement can only reference components
102903
+ if (tree.type !== 'ComponentsExpression') {
102904
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_8__["default"](`Reusable Object reference "${runtimeExpression}" must be a components expression`, {
102905
+ runtimeExpression
102906
+ });
102907
+ }
102908
+
102909
+ // evaluate runtime expression as JSON Pointer to get the referenced element
102910
+ const jsonPointer = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_11__.compile)(['components', tree.componentType, tree.componentName]);
102911
+ try {
102912
+ referencedElement = (0,_speclynx_apidom_json_pointer__WEBPACK_IMPORTED_MODULE_10__.evaluate)(this.reference.value.result, jsonPointer);
102913
+ } catch {
102914
+ throw new _speclynx_apidom_error__WEBPACK_IMPORTED_MODULE_8__["default"](`Reusable Object reference "${runtimeExpression}" cannot be resolved`, {
102915
+ runtimeExpression
102916
+ });
102917
+ }
102918
+ } catch (error) {
102919
+ this.handleError(`Error while dereferencing Reusable Object. Cannot resolve reference "${runtimeExpression}": ${error.message}`, error, referencingElement, 'reference', runtimeExpression, path);
102920
+ return;
102890
102921
  }
102891
102922
 
102892
102923
  /**