@speclynx/apidom-reference 6.2.0 → 7.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.
Files changed (91) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/README.md +45 -0
  3. package/dist/apidom-reference.browser.js +4701 -3478
  4. package/dist/apidom-reference.browser.min.js +1 -1
  5. package/package.json +29 -28
  6. package/src/File.cjs +5 -2
  7. package/src/File.mjs +5 -2
  8. package/src/bundle/strategies/arazzo-1/index.cjs +3 -2
  9. package/src/bundle/strategies/arazzo-1/index.mjs +3 -2
  10. package/src/bundle/strategies/asyncapi-2/index.cjs +3 -2
  11. package/src/bundle/strategies/asyncapi-2/index.mjs +3 -2
  12. package/src/bundle/strategies/openapi-2/index.cjs +3 -2
  13. package/src/bundle/strategies/openapi-2/index.mjs +3 -2
  14. package/src/bundle/strategies/openapi-3-0/index.cjs +3 -2
  15. package/src/bundle/strategies/openapi-3-0/index.mjs +3 -2
  16. package/src/bundle/strategies/openapi-3-1/index.cjs +3 -2
  17. package/src/bundle/strategies/openapi-3-1/index.mjs +3 -2
  18. package/src/dereference/strategies/DereferenceVisitor.cjs +588 -0
  19. package/src/dereference/strategies/DereferenceVisitor.mjs +580 -0
  20. package/src/dereference/strategies/arazzo-1/index.cjs +14 -39
  21. package/src/dereference/strategies/arazzo-1/index.mjs +15 -40
  22. package/src/dereference/strategies/arazzo-1/visitor.cjs +207 -331
  23. package/src/dereference/strategies/arazzo-1/visitor.mjs +215 -338
  24. package/src/dereference/strategies/asyncapi-2/index.cjs +11 -39
  25. package/src/dereference/strategies/asyncapi-2/index.mjs +11 -39
  26. package/src/dereference/strategies/asyncapi-2/visitor.cjs +133 -425
  27. package/src/dereference/strategies/asyncapi-2/visitor.mjs +137 -429
  28. package/src/dereference/strategies/openapi-2/index.cjs +12 -42
  29. package/src/dereference/strategies/openapi-2/index.mjs +12 -42
  30. package/src/dereference/strategies/openapi-2/visitor.cjs +168 -532
  31. package/src/dereference/strategies/openapi-2/visitor.mjs +172 -536
  32. package/src/dereference/strategies/openapi-3-0/index.cjs +12 -42
  33. package/src/dereference/strategies/openapi-3-0/index.mjs +12 -42
  34. package/src/dereference/strategies/openapi-3-0/visitor.cjs +194 -468
  35. package/src/dereference/strategies/openapi-3-0/visitor.mjs +199 -473
  36. package/src/dereference/strategies/openapi-3-1/index.cjs +16 -42
  37. package/src/dereference/strategies/openapi-3-1/index.mjs +16 -42
  38. package/src/dereference/strategies/openapi-3-1/visitor.cjs +350 -602
  39. package/src/dereference/strategies/openapi-3-1/visitor.mjs +357 -608
  40. package/src/dereference/strategies/overlay-1/index.cjs +3 -2
  41. package/src/dereference/strategies/overlay-1/index.mjs +3 -2
  42. package/src/index.cjs +0 -7
  43. package/src/index.mjs +0 -1
  44. package/src/parse/index.cjs +9 -1
  45. package/src/parse/index.mjs +9 -1
  46. package/src/parse/parsers/apidom-json/index.cjs +2 -1
  47. package/src/parse/parsers/apidom-json/index.mjs +2 -1
  48. package/src/parse/parsers/arazzo-json-1/index.cjs +2 -1
  49. package/src/parse/parsers/arazzo-json-1/index.mjs +2 -1
  50. package/src/parse/parsers/arazzo-yaml-1/index.cjs +2 -1
  51. package/src/parse/parsers/arazzo-yaml-1/index.mjs +2 -1
  52. package/src/parse/parsers/asyncapi-json-2/index.cjs +2 -1
  53. package/src/parse/parsers/asyncapi-json-2/index.mjs +2 -1
  54. package/src/parse/parsers/asyncapi-yaml-2/index.cjs +2 -1
  55. package/src/parse/parsers/asyncapi-yaml-2/index.mjs +2 -1
  56. package/src/parse/parsers/json/index.cjs +2 -1
  57. package/src/parse/parsers/json/index.mjs +2 -1
  58. package/src/parse/parsers/openapi-json-2/index.cjs +2 -1
  59. package/src/parse/parsers/openapi-json-2/index.mjs +2 -1
  60. package/src/parse/parsers/openapi-json-3-0/index.cjs +2 -1
  61. package/src/parse/parsers/openapi-json-3-0/index.mjs +2 -1
  62. package/src/parse/parsers/openapi-json-3-1/index.cjs +2 -1
  63. package/src/parse/parsers/openapi-json-3-1/index.mjs +2 -1
  64. package/src/parse/parsers/openapi-yaml-2/index.cjs +2 -1
  65. package/src/parse/parsers/openapi-yaml-2/index.mjs +2 -1
  66. package/src/parse/parsers/openapi-yaml-3-0/index.cjs +2 -1
  67. package/src/parse/parsers/openapi-yaml-3-0/index.mjs +2 -1
  68. package/src/parse/parsers/openapi-yaml-3-1/index.cjs +2 -1
  69. package/src/parse/parsers/openapi-yaml-3-1/index.mjs +2 -1
  70. package/src/parse/parsers/overlay-json-1/index.cjs +2 -1
  71. package/src/parse/parsers/overlay-json-1/index.mjs +2 -1
  72. package/src/parse/parsers/overlay-yaml-1/index.cjs +2 -1
  73. package/src/parse/parsers/overlay-yaml-1/index.mjs +2 -1
  74. package/src/parse/parsers/yaml-1-2/index.cjs +2 -1
  75. package/src/parse/parsers/yaml-1-2/index.mjs +2 -1
  76. package/types/apidom-reference.d.ts +0 -9
  77. package/types/dereference/strategies/DereferenceVisitor.d.ts +224 -0
  78. package/types/dereference/strategies/arazzo-1/index.d.ts +0 -1
  79. package/types/dereference/strategies/arazzo-1/visitor.d.ts +38 -38
  80. package/types/dereference/strategies/asyncapi-2/index.d.ts +0 -1
  81. package/types/dereference/strategies/asyncapi-2/visitor.d.ts +13 -29
  82. package/types/dereference/strategies/openapi-2/index.d.ts +0 -1
  83. package/types/dereference/strategies/openapi-2/visitor.d.ts +14 -29
  84. package/types/dereference/strategies/openapi-3-0/index.d.ts +0 -1
  85. package/types/dereference/strategies/openapi-3-0/visitor.d.ts +13 -28
  86. package/types/dereference/strategies/openapi-3-1/index.d.ts +0 -1
  87. package/types/dereference/strategies/openapi-3-1/visitor.d.ts +37 -33
  88. package/types/index.d.ts +0 -1
  89. package/src/dereference/util.cjs +0 -33
  90. package/src/dereference/util.mjs +0 -27
  91. package/types/dereference/util.d.ts +0 -9
@@ -11,9 +11,8 @@ Object.defineProperty(exports, "OpenAPI2DereferenceVisitor", {
11
11
  }
12
12
  });
13
13
  exports.default = void 0;
14
- var _apidomDatamodel = require("@speclynx/apidom-datamodel");
15
14
  var _apidomNsOpenapi = require("@speclynx/apidom-ns-openapi-2");
16
- var _apidomTraverse = require("@speclynx/apidom-traverse");
15
+ var _mediaTypes = require("@swaggerexpert/media-types");
17
16
  var _DereferenceStrategy = _interopRequireDefault(require("../DereferenceStrategy.cjs"));
18
17
  var _Reference = _interopRequireDefault(require("../../../Reference.cjs"));
19
18
  var _ReferenceSet = _interopRequireDefault(require("../../../ReferenceSet.cjs"));
@@ -34,73 +33,44 @@ class OpenAPI2DereferenceStrategy extends _DereferenceStrategy.default {
34
33
  }
35
34
  canDereference(file) {
36
35
  // assert by media type
37
- if (file.mediaType !== 'text/plain') {
38
- return _apidomNsOpenapi.mediaTypes.includes(file.mediaType);
36
+ if (!(0, _mediaTypes.matches)('text/plain', file.mediaType)) {
37
+ return (0, _mediaTypes.selectBestMatch)(_apidomNsOpenapi.mediaTypes, file.mediaType) !== null;
39
38
  }
40
39
 
41
40
  // assert by inspecting ApiDOM
42
41
  return (0, _apidomNsOpenapi.isSwaggerElement)(file.parseResult?.result);
43
42
  }
44
43
  async dereference(file, options) {
45
- const immutableRefSet = options.dereference.refSet ?? new _ReferenceSet.default();
46
- const mutableRefSet = new _ReferenceSet.default();
47
- let refSet = immutableRefSet;
44
+ const refSet = options.dereference.refSet ?? new _ReferenceSet.default();
48
45
  let reference;
49
- if (!immutableRefSet.has(file.uri)) {
46
+ if (!refSet.has(file.uri)) {
50
47
  reference = new _Reference.default({
51
48
  uri: file.uri,
52
49
  value: file.parseResult
53
50
  });
54
- immutableRefSet.add(reference);
51
+ refSet.add(reference);
55
52
  } else {
56
53
  // pre-computed refSet was provided as configuration option
57
- reference = immutableRefSet.find(ref => ref.uri === file.uri);
54
+ reference = refSet.find(ref => ref.uri === file.uri);
58
55
  }
59
56
 
60
57
  /**
61
- * Clone refSet due the dereferencing process being mutable.
62
- * We don't want to mutate the original refSet and the references.
58
+ * With the immutable option the dereferenced element is a new tree,
59
+ * otherwise the dereferenced root is dereferenced in place.
63
60
  */
64
- if (options.dereference.immutable) {
65
- immutableRefSet.refs.map(ref => new _Reference.default({
66
- ...ref,
67
- value: (0, _apidomDatamodel.cloneDeep)(ref.value)
68
- })).forEach(ref => mutableRefSet.add(ref));
69
- reference = mutableRefSet.find(ref => ref.uri === file.uri);
70
- refSet = mutableRefSet;
71
- }
72
- const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
73
61
  const visitor = new _visitor.default({
74
- reference: reference,
62
+ reference,
75
63
  options
76
64
  });
77
- const dereferencedElement = await (0, _apidomTraverse.traverseAsync)(refSet.rootRef.value, visitor, {
78
- mutable: true,
79
- ...(shouldDetectCircular && {
80
- skipVisited: 'skip'
81
- })
82
- });
83
-
84
- /**
85
- * If immutable option is set, replay refs from the refSet.
86
- */
87
- if (options.dereference.immutable) {
88
- mutableRefSet.refs.filter(ref => ref.uri.startsWith('immutable://')).map(ref => new _Reference.default({
89
- ...ref,
90
- uri: ref.uri.replace(/^immutable:\/\//, '')
91
- })).forEach(ref => immutableRefSet.add(ref));
92
- reference = immutableRefSet.find(ref => ref.uri === file.uri);
93
- refSet = immutableRefSet;
94
- }
65
+ const dereferencedElement = await visitor.dereference(refSet.rootRef.value, undefined);
95
66
 
96
67
  /**
97
68
  * Release all memory if this refSet was not provided as a configuration option.
98
69
  * If provided as configuration option, then provider is responsible for cleanup.
99
70
  */
100
71
  if (options.dereference.refSet === null) {
101
- immutableRefSet.clean();
72
+ refSet.clean();
102
73
  }
103
- mutableRefSet.clean();
104
74
  return dereferencedElement;
105
75
  }
106
76
  }
@@ -1,6 +1,5 @@
1
- import { cloneDeep } from '@speclynx/apidom-datamodel';
2
1
  import { isSwaggerElement, mediaTypes } from '@speclynx/apidom-ns-openapi-2';
3
- import { traverseAsync } from '@speclynx/apidom-traverse';
2
+ import { matches, selectBestMatch } from '@swaggerexpert/media-types';
4
3
  import DereferenceStrategy from "../DereferenceStrategy.mjs";
5
4
  import Reference from "../../../Reference.mjs";
6
5
  import ReferenceSet from "../../../ReferenceSet.mjs";
@@ -20,73 +19,44 @@ class OpenAPI2DereferenceStrategy extends DereferenceStrategy {
20
19
  }
21
20
  canDereference(file) {
22
21
  // assert by media type
23
- if (file.mediaType !== 'text/plain') {
24
- return mediaTypes.includes(file.mediaType);
22
+ if (!matches('text/plain', file.mediaType)) {
23
+ return selectBestMatch(mediaTypes, file.mediaType) !== null;
25
24
  }
26
25
 
27
26
  // assert by inspecting ApiDOM
28
27
  return isSwaggerElement(file.parseResult?.result);
29
28
  }
30
29
  async dereference(file, options) {
31
- const immutableRefSet = options.dereference.refSet ?? new ReferenceSet();
32
- const mutableRefSet = new ReferenceSet();
33
- let refSet = immutableRefSet;
30
+ const refSet = options.dereference.refSet ?? new ReferenceSet();
34
31
  let reference;
35
- if (!immutableRefSet.has(file.uri)) {
32
+ if (!refSet.has(file.uri)) {
36
33
  reference = new Reference({
37
34
  uri: file.uri,
38
35
  value: file.parseResult
39
36
  });
40
- immutableRefSet.add(reference);
37
+ refSet.add(reference);
41
38
  } else {
42
39
  // pre-computed refSet was provided as configuration option
43
- reference = immutableRefSet.find(ref => ref.uri === file.uri);
40
+ reference = refSet.find(ref => ref.uri === file.uri);
44
41
  }
45
42
 
46
43
  /**
47
- * Clone refSet due the dereferencing process being mutable.
48
- * We don't want to mutate the original refSet and the references.
44
+ * With the immutable option the dereferenced element is a new tree,
45
+ * otherwise the dereferenced root is dereferenced in place.
49
46
  */
50
- if (options.dereference.immutable) {
51
- immutableRefSet.refs.map(ref => new Reference({
52
- ...ref,
53
- value: cloneDeep(ref.value)
54
- })).forEach(ref => mutableRefSet.add(ref));
55
- reference = mutableRefSet.find(ref => ref.uri === file.uri);
56
- refSet = mutableRefSet;
57
- }
58
- const shouldDetectCircular = ['error', 'replace'].includes(options.dereference.circular);
59
47
  const visitor = new OpenAPI2DereferenceVisitor({
60
- reference: reference,
48
+ reference,
61
49
  options
62
50
  });
63
- const dereferencedElement = await traverseAsync(refSet.rootRef.value, visitor, {
64
- mutable: true,
65
- ...(shouldDetectCircular && {
66
- skipVisited: 'skip'
67
- })
68
- });
69
-
70
- /**
71
- * If immutable option is set, replay refs from the refSet.
72
- */
73
- if (options.dereference.immutable) {
74
- mutableRefSet.refs.filter(ref => ref.uri.startsWith('immutable://')).map(ref => new Reference({
75
- ...ref,
76
- uri: ref.uri.replace(/^immutable:\/\//, '')
77
- })).forEach(ref => immutableRefSet.add(ref));
78
- reference = immutableRefSet.find(ref => ref.uri === file.uri);
79
- refSet = immutableRefSet;
80
- }
51
+ const dereferencedElement = await visitor.dereference(refSet.rootRef.value, undefined);
81
52
 
82
53
  /**
83
54
  * Release all memory if this refSet was not provided as a configuration option.
84
55
  * If provided as configuration option, then provider is responsible for cleanup.
85
56
  */
86
57
  if (options.dereference.refSet === null) {
87
- immutableRefSet.clean();
58
+ refSet.clean();
88
59
  }
89
- mutableRefSet.clean();
90
60
  return dereferencedElement;
91
61
  }
92
62
  }