@speclynx/apidom-reference 4.11.1 → 4.12.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.
Files changed (123) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +215 -3
  3. package/dist/apidom-reference.browser.js +1339 -153
  4. package/dist/apidom-reference.browser.min.js +1 -1
  5. package/package.json +35 -30
  6. package/src/File.cjs +3 -1
  7. package/src/Reference.cjs +3 -1
  8. package/src/ReferenceSet.cjs +3 -1
  9. package/src/bundle/index.cjs +9 -1
  10. package/src/bundle/index.mjs +6 -0
  11. package/src/bundle/strategies/BundleStrategy.cjs +3 -1
  12. package/src/bundle/strategies/openapi-3-0/index.cjs +94 -0
  13. package/src/bundle/strategies/openapi-3-0/index.mjs +81 -0
  14. package/src/bundle/strategies/openapi-3-0/visitor.cjs +650 -0
  15. package/src/bundle/strategies/openapi-3-0/visitor.mjs +642 -0
  16. package/src/bundle/strategies/openapi-3-1/index.cjs +3 -1
  17. package/src/bundle/util.cjs +42 -0
  18. package/src/bundle/util.mjs +33 -0
  19. package/src/configuration/empty.cjs +9 -2
  20. package/src/configuration/saturated.cjs +19 -11
  21. package/src/configuration/saturated.mjs +2 -1
  22. package/src/dereference/index.cjs +3 -1
  23. package/src/dereference/strategies/DereferenceStrategy.cjs +3 -1
  24. package/src/dereference/strategies/apidom/index.cjs +9 -2
  25. package/src/dereference/strategies/apidom/selectors/element-id.cjs +9 -2
  26. package/src/dereference/strategies/apidom/visitor.cjs +3 -1
  27. package/src/dereference/strategies/arazzo-1/index.cjs +34 -7
  28. package/src/dereference/strategies/arazzo-1/selectors/$anchor.cjs +46 -10
  29. package/src/dereference/strategies/arazzo-1/selectors/uri.cjs +22 -6
  30. package/src/dereference/strategies/arazzo-1/source-descriptions.cjs +3 -1
  31. package/src/dereference/strategies/arazzo-1/util.cjs +16 -4
  32. package/src/dereference/strategies/arazzo-1/visitor.cjs +3 -1
  33. package/src/dereference/strategies/asyncapi-2/index.cjs +9 -2
  34. package/src/dereference/strategies/asyncapi-2/visitor.cjs +3 -1
  35. package/src/dereference/strategies/openapi-2/index.cjs +9 -2
  36. package/src/dereference/strategies/openapi-2/visitor.cjs +3 -1
  37. package/src/dereference/strategies/openapi-3-0/index.cjs +9 -2
  38. package/src/dereference/strategies/openapi-3-0/visitor.cjs +3 -1
  39. package/src/dereference/strategies/openapi-3-1/index.cjs +28 -6
  40. package/src/dereference/strategies/openapi-3-1/selectors/$anchor.cjs +22 -5
  41. package/src/dereference/strategies/openapi-3-1/selectors/uri.cjs +16 -4
  42. package/src/dereference/strategies/openapi-3-1/util.cjs +3 -1
  43. package/src/dereference/strategies/openapi-3-1/visitor.cjs +3 -1
  44. package/src/dereference/strategies/overlay-1/extends.cjs +3 -1
  45. package/src/dereference/strategies/overlay-1/index.cjs +9 -2
  46. package/src/dereference/util.cjs +3 -1
  47. package/src/errors/BundleError.cjs +4 -2
  48. package/src/errors/BundleError.mjs +2 -2
  49. package/src/errors/DereferenceError.cjs +3 -1
  50. package/src/errors/EvaluationElementIdError.cjs +3 -1
  51. package/src/errors/EvaluationJsonSchema$anchorError.cjs +3 -1
  52. package/src/errors/EvaluationJsonSchemaUriError.cjs +3 -1
  53. package/src/errors/InvalidJsonSchema$anchorError.cjs +3 -1
  54. package/src/errors/JsonSchema$anchorError.cjs +3 -1
  55. package/src/errors/JsonSchemaUriError.cjs +3 -1
  56. package/src/errors/MaximumBundleDepthError.cjs +3 -1
  57. package/src/errors/MaximumDereferenceDepthError.cjs +3 -1
  58. package/src/errors/MaximumResolveDepthError.cjs +3 -1
  59. package/src/errors/ParseError.cjs +3 -1
  60. package/src/errors/ParserError.cjs +3 -1
  61. package/src/errors/PluginError.cjs +3 -1
  62. package/src/errors/ResolveError.cjs +3 -1
  63. package/src/errors/ResolverError.cjs +3 -1
  64. package/src/errors/UnmatchedBundleStrategyError.cjs +3 -1
  65. package/src/errors/UnmatchedDereferenceStrategyError.cjs +3 -1
  66. package/src/errors/UnmatchedParserError.cjs +3 -1
  67. package/src/errors/UnmatchedResolveStrategyError.cjs +3 -1
  68. package/src/errors/UnmatchedResolverError.cjs +3 -1
  69. package/src/errors/UnresolvableReferenceError.cjs +8 -3
  70. package/src/errors/UnresolvableReferenceError.mjs +5 -2
  71. package/src/index.cjs +209 -36
  72. package/src/options/index.cjs +71 -2
  73. package/src/options/index.mjs +68 -1
  74. package/src/options/util.cjs +3 -1
  75. package/src/parse/index.cjs +3 -1
  76. package/src/parse/parsers/Parser.cjs +3 -1
  77. package/src/parse/parsers/apidom-json/index.cjs +3 -1
  78. package/src/parse/parsers/arazzo-json-1/index.cjs +9 -2
  79. package/src/parse/parsers/arazzo-json-1/source-descriptions.cjs +3 -1
  80. package/src/parse/parsers/arazzo-yaml-1/index.cjs +9 -2
  81. package/src/parse/parsers/arazzo-yaml-1/source-descriptions.cjs +3 -1
  82. package/src/parse/parsers/asyncapi-json-2/index.cjs +3 -1
  83. package/src/parse/parsers/asyncapi-yaml-2/index.cjs +3 -1
  84. package/src/parse/parsers/binary/index-browser.cjs +3 -1
  85. package/src/parse/parsers/binary/index-node.cjs +3 -1
  86. package/src/parse/parsers/json/index.cjs +3 -1
  87. package/src/parse/parsers/openapi-json-2/index.cjs +3 -1
  88. package/src/parse/parsers/openapi-json-3-0/index.cjs +3 -1
  89. package/src/parse/parsers/openapi-json-3-1/index.cjs +3 -1
  90. package/src/parse/parsers/openapi-yaml-2/index.cjs +3 -1
  91. package/src/parse/parsers/openapi-yaml-3-0/index.cjs +3 -1
  92. package/src/parse/parsers/openapi-yaml-3-1/index.cjs +3 -1
  93. package/src/parse/parsers/overlay-json-1/extends.cjs +3 -1
  94. package/src/parse/parsers/overlay-json-1/index.cjs +9 -2
  95. package/src/parse/parsers/overlay-yaml-1/extends.cjs +10 -4
  96. package/src/parse/parsers/overlay-yaml-1/index.cjs +9 -2
  97. package/src/parse/parsers/yaml-1-2/index.cjs +3 -1
  98. package/src/resolve/index.cjs +3 -1
  99. package/src/resolve/resolvers/HTTPResolver.cjs +3 -1
  100. package/src/resolve/resolvers/Resolver.cjs +3 -1
  101. package/src/resolve/resolvers/file/index-browser.cjs +3 -1
  102. package/src/resolve/resolvers/file/index-node.cjs +3 -1
  103. package/src/resolve/resolvers/http-axios/cache/MemoryCache.cjs +3 -1
  104. package/src/resolve/resolvers/http-axios/index.cjs +3 -1
  105. package/src/resolve/strategies/ResolveStrategy.cjs +3 -1
  106. package/src/resolve/strategies/apidom/index.cjs +3 -1
  107. package/src/resolve/strategies/arazzo-1/index.cjs +3 -1
  108. package/src/resolve/strategies/asyncapi-2/index.cjs +3 -1
  109. package/src/resolve/strategies/openapi-2/index.cjs +3 -1
  110. package/src/resolve/strategies/openapi-3-0/index.cjs +3 -1
  111. package/src/resolve/strategies/openapi-3-1/index.cjs +3 -1
  112. package/src/resolve/strategies/overlay-1/index.cjs +3 -1
  113. package/src/resolve/util.cjs +3 -1
  114. package/src/util/plugins.cjs +3 -1
  115. package/src/util/url.cjs +3 -1
  116. package/types/apidom-reference.d.ts +41 -2
  117. package/types/bundle/strategies/openapi-3-0/index.d.ts +31 -0
  118. package/types/bundle/strategies/openapi-3-0/visitor.d.ts +131 -0
  119. package/types/bundle/util.d.ts +22 -0
  120. package/types/errors/BundleError.d.ts +2 -2
  121. package/types/errors/UnresolvableReferenceError.d.ts +5 -2
  122. package/types/index.d.ts +1 -0
  123. package/types/options/index.d.ts +33 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@speclynx/apidom-reference",
3
- "version": "4.11.1",
3
+ "version": "4.12.0",
4
4
  "description": "Advanced algorithms for semantic ApiDOM manipulations like dereferencing or resolution.",
5
5
  "keywords": [
6
6
  "apidom",
@@ -249,6 +249,11 @@
249
249
  "require": "./src/dereference/strategies/openapi-3-1/selectors/uri.cjs",
250
250
  "types": "./types/dereference/strategies/openapi-3-1/selectors/uri.d.ts"
251
251
  },
252
+ "./bundle/strategies/openapi-3-0": {
253
+ "import": "./src/bundle/strategies/openapi-3-0/index.mjs",
254
+ "require": "./src/bundle/strategies/openapi-3-0/index.cjs",
255
+ "types": "./types/bundle/strategies/openapi-3-0/index.d.ts"
256
+ },
252
257
  "./bundle/strategies/openapi-3-1": {
253
258
  "import": "./src/bundle/strategies/openapi-3-1/index.mjs",
254
259
  "require": "./src/bundle/strategies/openapi-3-1/index.cjs",
@@ -278,35 +283,35 @@
278
283
  "author": "Vladimir Gorej",
279
284
  "license": "Apache-2.0",
280
285
  "dependencies": {
281
- "@babel/runtime-corejs3": "^7.29.7",
282
- "@speclynx/apidom-core": "4.11.1",
283
- "@speclynx/apidom-datamodel": "4.11.1",
284
- "@speclynx/apidom-error": "4.11.1",
285
- "@speclynx/apidom-json-pointer": "4.11.1",
286
- "@speclynx/apidom-ns-arazzo-1": "4.11.1",
287
- "@speclynx/apidom-ns-asyncapi-2": "4.11.1",
288
- "@speclynx/apidom-ns-json-schema-2020-12": "4.11.1",
289
- "@speclynx/apidom-ns-openapi-2": "4.11.1",
290
- "@speclynx/apidom-ns-openapi-3-0": "4.11.1",
291
- "@speclynx/apidom-ns-openapi-3-1": "4.11.1",
292
- "@speclynx/apidom-ns-overlay-1": "4.11.1",
293
- "@speclynx/apidom-parser-adapter-arazzo-json-1": "4.11.1",
294
- "@speclynx/apidom-parser-adapter-arazzo-yaml-1": "4.11.1",
295
- "@speclynx/apidom-parser-adapter-asyncapi-json-2": "4.11.1",
296
- "@speclynx/apidom-parser-adapter-asyncapi-yaml-2": "4.11.1",
297
- "@speclynx/apidom-parser-adapter-json": "4.11.1",
298
- "@speclynx/apidom-parser-adapter-openapi-json-2": "4.11.1",
299
- "@speclynx/apidom-parser-adapter-openapi-json-3-0": "4.11.1",
300
- "@speclynx/apidom-parser-adapter-openapi-json-3-1": "4.11.1",
301
- "@speclynx/apidom-parser-adapter-openapi-yaml-2": "4.11.1",
302
- "@speclynx/apidom-parser-adapter-openapi-yaml-3-0": "4.11.1",
303
- "@speclynx/apidom-parser-adapter-openapi-yaml-3-1": "4.11.1",
304
- "@speclynx/apidom-parser-adapter-overlay-json-1": "4.11.1",
305
- "@speclynx/apidom-parser-adapter-overlay-yaml-1": "4.11.1",
306
- "@speclynx/apidom-parser-adapter-yaml-1-2": "4.11.1",
307
- "@speclynx/apidom-traverse": "4.11.1",
286
+ "@babel/runtime-corejs3": "^8.0.0",
287
+ "@speclynx/apidom-core": "4.12.0",
288
+ "@speclynx/apidom-datamodel": "4.12.0",
289
+ "@speclynx/apidom-error": "4.12.0",
290
+ "@speclynx/apidom-json-pointer": "4.12.0",
291
+ "@speclynx/apidom-ns-arazzo-1": "4.12.0",
292
+ "@speclynx/apidom-ns-asyncapi-2": "4.12.0",
293
+ "@speclynx/apidom-ns-json-schema-2020-12": "4.12.0",
294
+ "@speclynx/apidom-ns-openapi-2": "4.12.0",
295
+ "@speclynx/apidom-ns-openapi-3-0": "4.12.0",
296
+ "@speclynx/apidom-ns-openapi-3-1": "4.12.0",
297
+ "@speclynx/apidom-ns-overlay-1": "4.12.0",
298
+ "@speclynx/apidom-parser-adapter-arazzo-json-1": "4.12.0",
299
+ "@speclynx/apidom-parser-adapter-arazzo-yaml-1": "4.12.0",
300
+ "@speclynx/apidom-parser-adapter-asyncapi-json-2": "4.12.0",
301
+ "@speclynx/apidom-parser-adapter-asyncapi-yaml-2": "4.12.0",
302
+ "@speclynx/apidom-parser-adapter-json": "4.12.0",
303
+ "@speclynx/apidom-parser-adapter-openapi-json-2": "4.12.0",
304
+ "@speclynx/apidom-parser-adapter-openapi-json-3-0": "4.12.0",
305
+ "@speclynx/apidom-parser-adapter-openapi-json-3-1": "4.12.0",
306
+ "@speclynx/apidom-parser-adapter-openapi-yaml-2": "4.12.0",
307
+ "@speclynx/apidom-parser-adapter-openapi-yaml-3-0": "4.12.0",
308
+ "@speclynx/apidom-parser-adapter-openapi-yaml-3-1": "4.12.0",
309
+ "@speclynx/apidom-parser-adapter-overlay-json-1": "4.12.0",
310
+ "@speclynx/apidom-parser-adapter-overlay-yaml-1": "4.12.0",
311
+ "@speclynx/apidom-parser-adapter-yaml-1-2": "4.12.0",
312
+ "@speclynx/apidom-traverse": "4.12.0",
308
313
  "@swaggerexpert/arazzo-runtime-expression": "^2.0.3",
309
- "axios": "^1.17.0",
314
+ "axios": "^1.18.0",
310
315
  "picomatch": "^4.0.4",
311
316
  "process": "^0.11.10",
312
317
  "ramda": "~0.32.0",
@@ -326,5 +331,5 @@
326
331
  "README.md",
327
332
  "CHANGELOG.md"
328
333
  ],
329
- "gitHead": "76396e154f0b561793c096c852aaef9d8e01818b"
334
+ "gitHead": "7d5549ba93000f249ebbe1480ae01d1aaeb2ce15"
330
335
  }
package/src/File.cjs CHANGED
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireWildcard = require("@babel/runtime-corejs3/helpers/interopRequireWildcard").default;
4
- exports.__esModule = true;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
5
7
  exports.default = void 0;
6
8
  var _ramda = require("ramda");
7
9
  var _ramdaAdjunct = require("ramda-adjunct");
package/src/Reference.cjs CHANGED
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
 
3
- exports.__esModule = true;
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
4
6
  exports.default = void 0;
5
7
  /**
6
8
  * @public
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
 
3
- exports.__esModule = true;
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
4
6
  exports.default = void 0;
5
7
  var _ramdaAdjunct = require("ramda-adjunct");
6
8
  /**
@@ -2,13 +2,16 @@
2
2
 
3
3
  var _interopRequireWildcard = require("@babel/runtime-corejs3/helpers/interopRequireWildcard").default;
4
4
  var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
5
- exports.__esModule = true;
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
6
8
  exports.default = void 0;
7
9
  var _ramda = require("ramda");
8
10
  var _File = _interopRequireDefault(require("../File.cjs"));
9
11
  var plugins = _interopRequireWildcard(require("../util/plugins.cjs"));
10
12
  var _UnmatchedBundleStrategyError = _interopRequireDefault(require("../errors/UnmatchedBundleStrategyError.cjs"));
11
13
  var _BundleError = _interopRequireDefault(require("../errors/BundleError.cjs"));
14
+ var _UnresolvableReferenceError = _interopRequireDefault(require("../errors/UnresolvableReferenceError.cjs"));
12
15
  var _index = _interopRequireDefault(require("../parse/index.cjs"));
13
16
  var _util = require("../options/util.cjs");
14
17
  var url = _interopRequireWildcard(require("../util/url.cjs"));
@@ -53,6 +56,11 @@ const bundle = async (uri, options) => {
53
56
  } = await plugins.run('bundle', [file, mergedOptions], bundleStrategies);
54
57
  return result;
55
58
  } catch (error) {
59
+ // pass through errors that are already part of the bundle/resolution
60
+ // taxonomy rather than nesting them inside another BundleError
61
+ if (error instanceof _BundleError.default || error instanceof _UnresolvableReferenceError.default) {
62
+ throw error;
63
+ }
56
64
  throw new _BundleError.default(`Error while bundling file "${file.uri}"`, {
57
65
  cause: error
58
66
  });
@@ -3,6 +3,7 @@ import File from "../File.mjs";
3
3
  import * as plugins from "../util/plugins.mjs";
4
4
  import UnmatchedBundleStrategyError from "../errors/UnmatchedBundleStrategyError.mjs";
5
5
  import BundleError from "../errors/BundleError.mjs";
6
+ import UnresolvableReferenceError from "../errors/UnresolvableReferenceError.mjs";
6
7
  import parse from "../parse/index.mjs";
7
8
  import { merge as mergeOptions } from "../options/util.mjs";
8
9
  import * as url from "../util/url.mjs";
@@ -47,6 +48,11 @@ const bundle = async (uri, options) => {
47
48
  } = await plugins.run('bundle', [file, mergedOptions], bundleStrategies);
48
49
  return result;
49
50
  } catch (error) {
51
+ // pass through errors that are already part of the bundle/resolution
52
+ // taxonomy rather than nesting them inside another BundleError
53
+ if (error instanceof BundleError || error instanceof UnresolvableReferenceError) {
54
+ throw error;
55
+ }
50
56
  throw new BundleError(`Error while bundling file "${file.uri}"`, {
51
57
  cause: error
52
58
  });
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
 
3
- exports.__esModule = true;
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
4
6
  exports.default = void 0;
5
7
  /**
6
8
  * @public
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ Object.defineProperty(exports, "OpenAPI3_0BundleVisitor", {
8
+ enumerable: true,
9
+ get: function () {
10
+ return _visitor.default;
11
+ }
12
+ });
13
+ exports.default = void 0;
14
+ var _apidomDatamodel = require("@speclynx/apidom-datamodel");
15
+ var _apidomTraverse = require("@speclynx/apidom-traverse");
16
+ var _apidomNsOpenapi = require("@speclynx/apidom-ns-openapi-3-0");
17
+ var _Reference = _interopRequireDefault(require("../../../Reference.cjs"));
18
+ var _ReferenceSet = _interopRequireDefault(require("../../../ReferenceSet.cjs"));
19
+ var _BundleStrategy = _interopRequireDefault(require("../BundleStrategy.cjs"));
20
+ var _visitor = _interopRequireDefault(require("./visitor.cjs"));
21
+ /**
22
+ * @public
23
+ */
24
+
25
+ /**
26
+ * @public
27
+ */
28
+ class OpenAPI3_0BundleStrategy extends _BundleStrategy.default {
29
+ constructor(options) {
30
+ super({
31
+ ...(options ?? {}),
32
+ name: 'openapi-3-0'
33
+ });
34
+ }
35
+ canBundle(file) {
36
+ // assert by media type
37
+ if (file.mediaType !== 'text/plain') {
38
+ return _apidomNsOpenapi.mediaTypes.includes(file.mediaType);
39
+ }
40
+
41
+ // assert by inspecting ApiDOM
42
+ return (0, _apidomNsOpenapi.isOpenApi3_0Element)(file.parseResult?.result);
43
+ }
44
+ async bundle(file, options) {
45
+ const immutableRefSet = options.bundle.refSet ?? new _ReferenceSet.default();
46
+ const mutableRefSet = new _ReferenceSet.default();
47
+ let refSet = immutableRefSet;
48
+ let reference;
49
+
50
+ // determine the initial reference
51
+ if (!immutableRefSet.has(file.uri)) {
52
+ reference = new _Reference.default({
53
+ uri: file.uri,
54
+ value: file.parseResult
55
+ });
56
+ immutableRefSet.add(reference);
57
+ } else {
58
+ // pre-computed refSet was provided as configuration option
59
+ reference = immutableRefSet.find(ref => ref.uri === file.uri);
60
+ }
61
+
62
+ /**
63
+ * Clone refSet due the bundling process being mutable.
64
+ * We don't want to mutate the original refSet and the references.
65
+ */
66
+ if (options.bundle.immutable) {
67
+ immutableRefSet.refs.map(ref => new _Reference.default({
68
+ ...ref,
69
+ value: (0, _apidomDatamodel.cloneDeep)(ref.value)
70
+ })).forEach(ref => mutableRefSet.add(ref));
71
+ reference = mutableRefSet.find(ref => ref.uri === file.uri);
72
+ refSet = mutableRefSet;
73
+ }
74
+ const visitor = new _visitor.default({
75
+ reference: reference,
76
+ options
77
+ });
78
+ await (0, _apidomTraverse.traverseAsync)(refSet.rootRef.value, visitor, {
79
+ mutable: true
80
+ });
81
+ const parseResult = reference.value;
82
+
83
+ /**
84
+ * Release all memory if this refSet was not provided as a configuration option.
85
+ * If provided as configuration option, then provider is responsible for cleanup.
86
+ */
87
+ if (options.bundle.refSet === null) {
88
+ immutableRefSet.clean();
89
+ }
90
+ mutableRefSet.clean();
91
+ return parseResult;
92
+ }
93
+ }
94
+ var _default = exports.default = OpenAPI3_0BundleStrategy;
@@ -0,0 +1,81 @@
1
+ import { cloneDeep } from '@speclynx/apidom-datamodel';
2
+ import { traverseAsync } from '@speclynx/apidom-traverse';
3
+ import { mediaTypes, isOpenApi3_0Element } from '@speclynx/apidom-ns-openapi-3-0';
4
+ import Reference from "../../../Reference.mjs";
5
+ import ReferenceSet from "../../../ReferenceSet.mjs";
6
+ import BundleStrategy from "../BundleStrategy.mjs";
7
+ import OpenAPI3_0BundleVisitor from "./visitor.mjs";
8
+ /**
9
+ * @public
10
+ */
11
+ /**
12
+ * @public
13
+ */
14
+ class OpenAPI3_0BundleStrategy extends BundleStrategy {
15
+ constructor(options) {
16
+ super({
17
+ ...(options ?? {}),
18
+ name: 'openapi-3-0'
19
+ });
20
+ }
21
+ canBundle(file) {
22
+ // assert by media type
23
+ if (file.mediaType !== 'text/plain') {
24
+ return mediaTypes.includes(file.mediaType);
25
+ }
26
+
27
+ // assert by inspecting ApiDOM
28
+ return isOpenApi3_0Element(file.parseResult?.result);
29
+ }
30
+ async bundle(file, options) {
31
+ const immutableRefSet = options.bundle.refSet ?? new ReferenceSet();
32
+ const mutableRefSet = new ReferenceSet();
33
+ let refSet = immutableRefSet;
34
+ let reference;
35
+
36
+ // determine the initial reference
37
+ if (!immutableRefSet.has(file.uri)) {
38
+ reference = new Reference({
39
+ uri: file.uri,
40
+ value: file.parseResult
41
+ });
42
+ immutableRefSet.add(reference);
43
+ } else {
44
+ // pre-computed refSet was provided as configuration option
45
+ reference = immutableRefSet.find(ref => ref.uri === file.uri);
46
+ }
47
+
48
+ /**
49
+ * Clone refSet due the bundling process being mutable.
50
+ * We don't want to mutate the original refSet and the references.
51
+ */
52
+ if (options.bundle.immutable) {
53
+ immutableRefSet.refs.map(ref => new Reference({
54
+ ...ref,
55
+ value: cloneDeep(ref.value)
56
+ })).forEach(ref => mutableRefSet.add(ref));
57
+ reference = mutableRefSet.find(ref => ref.uri === file.uri);
58
+ refSet = mutableRefSet;
59
+ }
60
+ const visitor = new OpenAPI3_0BundleVisitor({
61
+ reference: reference,
62
+ options
63
+ });
64
+ await traverseAsync(refSet.rootRef.value, visitor, {
65
+ mutable: true
66
+ });
67
+ const parseResult = reference.value;
68
+
69
+ /**
70
+ * Release all memory if this refSet was not provided as a configuration option.
71
+ * If provided as configuration option, then provider is responsible for cleanup.
72
+ */
73
+ if (options.bundle.refSet === null) {
74
+ immutableRefSet.clean();
75
+ }
76
+ mutableRefSet.clean();
77
+ return parseResult;
78
+ }
79
+ }
80
+ export { OpenAPI3_0BundleVisitor };
81
+ export default OpenAPI3_0BundleStrategy;