@speclynx/apidom-reference 6.1.2 → 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 (106) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +57 -0
  3. package/dist/apidom-reference.browser.js +5783 -3741
  4. package/dist/apidom-reference.browser.min.js +1 -1
  5. package/package.json +31 -30
  6. package/src/File.cjs +5 -2
  7. package/src/File.mjs +5 -2
  8. package/src/bundle/index.cjs +6 -4
  9. package/src/bundle/index.mjs +6 -4
  10. package/src/bundle/strategies/arazzo-1/index.cjs +3 -2
  11. package/src/bundle/strategies/arazzo-1/index.mjs +3 -2
  12. package/src/bundle/strategies/asyncapi-2/index.cjs +3 -2
  13. package/src/bundle/strategies/asyncapi-2/index.mjs +3 -2
  14. package/src/bundle/strategies/openapi-2/index.cjs +3 -2
  15. package/src/bundle/strategies/openapi-2/index.mjs +3 -2
  16. package/src/bundle/strategies/openapi-3-0/index.cjs +3 -2
  17. package/src/bundle/strategies/openapi-3-0/index.mjs +3 -2
  18. package/src/bundle/strategies/openapi-3-1/index.cjs +3 -2
  19. package/src/bundle/strategies/openapi-3-1/index.mjs +3 -2
  20. package/src/dereference/index.cjs +8 -5
  21. package/src/dereference/index.mjs +8 -5
  22. package/src/dereference/strategies/DereferenceVisitor.cjs +588 -0
  23. package/src/dereference/strategies/DereferenceVisitor.mjs +580 -0
  24. package/src/dereference/strategies/arazzo-1/index.cjs +14 -39
  25. package/src/dereference/strategies/arazzo-1/index.mjs +15 -40
  26. package/src/dereference/strategies/arazzo-1/visitor.cjs +207 -331
  27. package/src/dereference/strategies/arazzo-1/visitor.mjs +215 -338
  28. package/src/dereference/strategies/asyncapi-2/index.cjs +11 -39
  29. package/src/dereference/strategies/asyncapi-2/index.mjs +11 -39
  30. package/src/dereference/strategies/asyncapi-2/visitor.cjs +133 -425
  31. package/src/dereference/strategies/asyncapi-2/visitor.mjs +137 -429
  32. package/src/dereference/strategies/openapi-2/index.cjs +12 -42
  33. package/src/dereference/strategies/openapi-2/index.mjs +12 -42
  34. package/src/dereference/strategies/openapi-2/visitor.cjs +168 -532
  35. package/src/dereference/strategies/openapi-2/visitor.mjs +172 -536
  36. package/src/dereference/strategies/openapi-3-0/index.cjs +12 -42
  37. package/src/dereference/strategies/openapi-3-0/index.mjs +12 -42
  38. package/src/dereference/strategies/openapi-3-0/visitor.cjs +194 -468
  39. package/src/dereference/strategies/openapi-3-0/visitor.mjs +199 -473
  40. package/src/dereference/strategies/openapi-3-1/index.cjs +16 -42
  41. package/src/dereference/strategies/openapi-3-1/index.mjs +16 -42
  42. package/src/dereference/strategies/openapi-3-1/visitor.cjs +350 -602
  43. package/src/dereference/strategies/openapi-3-1/visitor.mjs +357 -608
  44. package/src/dereference/strategies/overlay-1/index.cjs +3 -2
  45. package/src/dereference/strategies/overlay-1/index.mjs +3 -2
  46. package/src/index.cjs +0 -7
  47. package/src/index.mjs +0 -1
  48. package/src/options/index.cjs +4 -0
  49. package/src/options/index.mjs +4 -0
  50. package/src/options/util.cjs +7 -1
  51. package/src/options/util.mjs +8 -2
  52. package/src/parse/index.cjs +9 -1
  53. package/src/parse/index.mjs +9 -1
  54. package/src/parse/parsers/apidom-json/index.cjs +2 -1
  55. package/src/parse/parsers/apidom-json/index.mjs +2 -1
  56. package/src/parse/parsers/arazzo-json-1/index.cjs +2 -1
  57. package/src/parse/parsers/arazzo-json-1/index.mjs +2 -1
  58. package/src/parse/parsers/arazzo-yaml-1/index.cjs +2 -1
  59. package/src/parse/parsers/arazzo-yaml-1/index.mjs +2 -1
  60. package/src/parse/parsers/asyncapi-json-2/index.cjs +2 -1
  61. package/src/parse/parsers/asyncapi-json-2/index.mjs +2 -1
  62. package/src/parse/parsers/asyncapi-yaml-2/index.cjs +2 -1
  63. package/src/parse/parsers/asyncapi-yaml-2/index.mjs +2 -1
  64. package/src/parse/parsers/json/index.cjs +2 -1
  65. package/src/parse/parsers/json/index.mjs +2 -1
  66. package/src/parse/parsers/openapi-json-2/index.cjs +2 -1
  67. package/src/parse/parsers/openapi-json-2/index.mjs +2 -1
  68. package/src/parse/parsers/openapi-json-3-0/index.cjs +2 -1
  69. package/src/parse/parsers/openapi-json-3-0/index.mjs +2 -1
  70. package/src/parse/parsers/openapi-json-3-1/index.cjs +2 -1
  71. package/src/parse/parsers/openapi-json-3-1/index.mjs +2 -1
  72. package/src/parse/parsers/openapi-yaml-2/index.cjs +2 -1
  73. package/src/parse/parsers/openapi-yaml-2/index.mjs +2 -1
  74. package/src/parse/parsers/openapi-yaml-3-0/index.cjs +2 -1
  75. package/src/parse/parsers/openapi-yaml-3-0/index.mjs +2 -1
  76. package/src/parse/parsers/openapi-yaml-3-1/index.cjs +2 -1
  77. package/src/parse/parsers/openapi-yaml-3-1/index.mjs +2 -1
  78. package/src/parse/parsers/overlay-json-1/index.cjs +2 -1
  79. package/src/parse/parsers/overlay-json-1/index.mjs +2 -1
  80. package/src/parse/parsers/overlay-yaml-1/index.cjs +2 -1
  81. package/src/parse/parsers/overlay-yaml-1/index.mjs +2 -1
  82. package/src/parse/parsers/yaml-1-2/index.cjs +2 -1
  83. package/src/parse/parsers/yaml-1-2/index.mjs +2 -1
  84. package/src/resolve/index.cjs +6 -3
  85. package/src/resolve/index.mjs +6 -3
  86. package/src/util/url.cjs +38 -8
  87. package/src/util/url.mjs +35 -6
  88. package/types/apidom-reference.d.ts +13 -9
  89. package/types/dereference/strategies/DereferenceVisitor.d.ts +224 -0
  90. package/types/dereference/strategies/arazzo-1/index.d.ts +0 -1
  91. package/types/dereference/strategies/arazzo-1/visitor.d.ts +38 -38
  92. package/types/dereference/strategies/asyncapi-2/index.d.ts +0 -1
  93. package/types/dereference/strategies/asyncapi-2/visitor.d.ts +13 -29
  94. package/types/dereference/strategies/openapi-2/index.d.ts +0 -1
  95. package/types/dereference/strategies/openapi-2/visitor.d.ts +14 -29
  96. package/types/dereference/strategies/openapi-3-0/index.d.ts +0 -1
  97. package/types/dereference/strategies/openapi-3-0/visitor.d.ts +13 -28
  98. package/types/dereference/strategies/openapi-3-1/index.d.ts +0 -1
  99. package/types/dereference/strategies/openapi-3-1/visitor.d.ts +37 -33
  100. package/types/index.d.ts +0 -1
  101. package/types/util/url.d.ts +11 -0
  102. package/LICENSES/AFL-3.0.txt +0 -182
  103. package/LICENSES/BSD-3-Clause.txt +0 -26
  104. package/src/dereference/util.cjs +0 -33
  105. package/src/dereference/util.mjs +0 -27
  106. package/types/dereference/util.d.ts +0 -9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@speclynx/apidom-reference",
3
- "version": "6.1.2",
3
+ "version": "7.0.0",
4
4
  "description": "Advanced algorithms for semantic ApiDOM manipulations like dereferencing or resolution.",
5
5
  "keywords": [
6
6
  "apidom",
@@ -299,35 +299,36 @@
299
299
  "author": "Vladimir Gorej",
300
300
  "license": "Apache-2.0",
301
301
  "dependencies": {
302
- "@babel/runtime-corejs3": "^8.0.8",
303
- "@speclynx/apidom-core": "6.1.2",
304
- "@speclynx/apidom-datamodel": "6.1.2",
305
- "@speclynx/apidom-error": "6.1.2",
306
- "@speclynx/apidom-json-pointer": "6.1.2",
307
- "@speclynx/apidom-ns-arazzo-1": "6.1.2",
308
- "@speclynx/apidom-ns-asyncapi-2": "6.1.2",
309
- "@speclynx/apidom-ns-json-schema-2020-12": "6.1.2",
310
- "@speclynx/apidom-ns-openapi-2": "6.1.2",
311
- "@speclynx/apidom-ns-openapi-3-0": "6.1.2",
312
- "@speclynx/apidom-ns-openapi-3-1": "6.1.2",
313
- "@speclynx/apidom-ns-overlay-1": "6.1.2",
314
- "@speclynx/apidom-parser-adapter-arazzo-json-1": "6.1.2",
315
- "@speclynx/apidom-parser-adapter-arazzo-yaml-1": "6.1.2",
316
- "@speclynx/apidom-parser-adapter-asyncapi-json-2": "6.1.2",
317
- "@speclynx/apidom-parser-adapter-asyncapi-yaml-2": "6.1.2",
318
- "@speclynx/apidom-parser-adapter-json": "6.1.2",
319
- "@speclynx/apidom-parser-adapter-openapi-json-2": "6.1.2",
320
- "@speclynx/apidom-parser-adapter-openapi-json-3-0": "6.1.2",
321
- "@speclynx/apidom-parser-adapter-openapi-json-3-1": "6.1.2",
322
- "@speclynx/apidom-parser-adapter-openapi-yaml-2": "6.1.2",
323
- "@speclynx/apidom-parser-adapter-openapi-yaml-3-0": "6.1.2",
324
- "@speclynx/apidom-parser-adapter-openapi-yaml-3-1": "6.1.2",
325
- "@speclynx/apidom-parser-adapter-overlay-json-1": "6.1.2",
326
- "@speclynx/apidom-parser-adapter-overlay-yaml-1": "6.1.2",
327
- "@speclynx/apidom-parser-adapter-yaml-1-2": "6.1.2",
328
- "@speclynx/apidom-traverse": "6.1.2",
302
+ "@babel/runtime-corejs3": "^8.1.0",
303
+ "@speclynx/apidom-core": "7.0.0",
304
+ "@speclynx/apidom-datamodel": "7.0.0",
305
+ "@speclynx/apidom-error": "7.0.0",
306
+ "@speclynx/apidom-json-pointer": "7.0.0",
307
+ "@speclynx/apidom-ns-arazzo-1": "7.0.0",
308
+ "@speclynx/apidom-ns-asyncapi-2": "7.0.0",
309
+ "@speclynx/apidom-ns-json-schema-2020-12": "7.0.0",
310
+ "@speclynx/apidom-ns-openapi-2": "7.0.0",
311
+ "@speclynx/apidom-ns-openapi-3-0": "7.0.0",
312
+ "@speclynx/apidom-ns-openapi-3-1": "7.0.0",
313
+ "@speclynx/apidom-ns-overlay-1": "7.0.0",
314
+ "@speclynx/apidom-parser-adapter-arazzo-json-1": "7.0.0",
315
+ "@speclynx/apidom-parser-adapter-arazzo-yaml-1": "7.0.0",
316
+ "@speclynx/apidom-parser-adapter-asyncapi-json-2": "7.0.0",
317
+ "@speclynx/apidom-parser-adapter-asyncapi-yaml-2": "7.0.0",
318
+ "@speclynx/apidom-parser-adapter-json": "7.0.0",
319
+ "@speclynx/apidom-parser-adapter-openapi-json-2": "7.0.0",
320
+ "@speclynx/apidom-parser-adapter-openapi-json-3-0": "7.0.0",
321
+ "@speclynx/apidom-parser-adapter-openapi-json-3-1": "7.0.0",
322
+ "@speclynx/apidom-parser-adapter-openapi-yaml-2": "7.0.0",
323
+ "@speclynx/apidom-parser-adapter-openapi-yaml-3-0": "7.0.0",
324
+ "@speclynx/apidom-parser-adapter-openapi-yaml-3-1": "7.0.0",
325
+ "@speclynx/apidom-parser-adapter-overlay-json-1": "7.0.0",
326
+ "@speclynx/apidom-parser-adapter-overlay-yaml-1": "7.0.0",
327
+ "@speclynx/apidom-parser-adapter-yaml-1-2": "7.0.0",
328
+ "@speclynx/apidom-traverse": "7.0.0",
329
329
  "@swaggerexpert/arazzo-runtime-expression": "^3.2.0",
330
- "axios": "^1.20.0",
330
+ "@swaggerexpert/media-types": "^1.0.3",
331
+ "axios": "^1.21.0",
331
332
  "picomatch": "^4.0.7",
332
333
  "ramda": "~0.32.0",
333
334
  "ramda-adjunct": "^6.1.0"
@@ -346,5 +347,5 @@
346
347
  "README.md",
347
348
  "CHANGELOG.md"
348
349
  ],
349
- "gitHead": "e3ba735e1c56369bb263dd8246c711d405ed9606"
350
+ "gitHead": "40c7c9837e4fb303453cec3d633bc06ee6be1e8b"
350
351
  }
package/src/File.cjs CHANGED
@@ -23,12 +23,15 @@ class File {
23
23
  parseResult;
24
24
  constructor({
25
25
  uri,
26
- mediaType = 'text/plain',
26
+ mediaType,
27
27
  data,
28
28
  parseResult
29
29
  }) {
30
30
  this.uri = uri;
31
- this.mediaType = mediaType;
31
+ // media types are compared as Content-Type field values, which exclude surrounding whitespace;
32
+ // a missing or blank media type means none was given
33
+ const trimmedMediaType = (0, _ramdaAdjunct.isString)(mediaType) ? mediaType.trim() : '';
34
+ this.mediaType = trimmedMediaType === '' ? 'text/plain' : trimmedMediaType;
32
35
  this.data = data;
33
36
  this.parseResult = parseResult;
34
37
  }
package/src/File.mjs CHANGED
@@ -15,12 +15,15 @@ class File {
15
15
  parseResult;
16
16
  constructor({
17
17
  uri,
18
- mediaType = 'text/plain',
18
+ mediaType,
19
19
  data,
20
20
  parseResult
21
21
  }) {
22
22
  this.uri = uri;
23
- this.mediaType = mediaType;
23
+ // media types are compared as Content-Type field values, which exclude surrounding whitespace;
24
+ // a missing or blank media type means none was given
25
+ const trimmedMediaType = isString(mediaType) ? mediaType.trim() : '';
26
+ this.mediaType = trimmedMediaType === '' ? 'text/plain' : trimmedMediaType;
24
27
  this.data = data;
25
28
  this.parseResult = parseResult;
26
29
  }
@@ -22,20 +22,22 @@ const bundle = async (uri, options) => {
22
22
  const {
23
23
  refSet
24
24
  } = options.bundle;
25
- const sanitizedURI = url.sanitize(uri);
25
+ // strategies look up same-document references by a resolved, hence normalized, URI;
26
+ // the file is parsed as a whole document, so its URI has no fragment
27
+ const baseURI = url.normalize(url.stripHash(uri));
26
28
  const mergedOptions = (0, _util.merge)(options, {
27
29
  resolve: {
28
- baseURI: sanitizedURI
30
+ baseURI
29
31
  }
30
32
  });
31
33
  let parseResult;
32
34
 
33
35
  // if refSet was provided, use it to avoid unnecessary parsing
34
- if (refSet !== null && refSet.has(sanitizedURI)) {
36
+ if (refSet !== null && refSet.has(baseURI)) {
35
37
  // @ts-ignore
36
38
  ({
37
39
  value: parseResult
38
- } = refSet.find((0, _ramda.propEq)(sanitizedURI, 'uri')));
40
+ } = refSet.find((0, _ramda.propEq)(baseURI, 'uri')));
39
41
  } else {
40
42
  parseResult = await (0, _index.default)(uri, mergedOptions);
41
43
  }
@@ -14,20 +14,22 @@ const bundle = async (uri, options) => {
14
14
  const {
15
15
  refSet
16
16
  } = options.bundle;
17
- const sanitizedURI = url.sanitize(uri);
17
+ // strategies look up same-document references by a resolved, hence normalized, URI;
18
+ // the file is parsed as a whole document, so its URI has no fragment
19
+ const baseURI = url.normalize(url.stripHash(uri));
18
20
  const mergedOptions = mergeOptions(options, {
19
21
  resolve: {
20
- baseURI: sanitizedURI
22
+ baseURI
21
23
  }
22
24
  });
23
25
  let parseResult;
24
26
 
25
27
  // if refSet was provided, use it to avoid unnecessary parsing
26
- if (refSet !== null && refSet.has(sanitizedURI)) {
28
+ if (refSet !== null && refSet.has(baseURI)) {
27
29
  // @ts-ignore
28
30
  ({
29
31
  value: parseResult
30
- } = refSet.find(propEq(sanitizedURI, 'uri')));
32
+ } = refSet.find(propEq(baseURI, 'uri')));
31
33
  } else {
32
34
  parseResult = await parse(uri, mergedOptions);
33
35
  }
@@ -14,6 +14,7 @@ exports.default = void 0;
14
14
  var _apidomDatamodel = require("@speclynx/apidom-datamodel");
15
15
  var _apidomTraverse = require("@speclynx/apidom-traverse");
16
16
  var _apidomNsArazzo = require("@speclynx/apidom-ns-arazzo-1");
17
+ var _mediaTypes = require("@swaggerexpert/media-types");
17
18
  var _Reference = _interopRequireDefault(require("../../../Reference.cjs"));
18
19
  var _ReferenceSet = _interopRequireDefault(require("../../../ReferenceSet.cjs"));
19
20
  var _BundleStrategy = _interopRequireDefault(require("../BundleStrategy.cjs"));
@@ -34,8 +35,8 @@ class Arazzo1BundleStrategy extends _BundleStrategy.default {
34
35
  }
35
36
  canBundle(file) {
36
37
  // assert by media type
37
- if (file.mediaType !== 'text/plain') {
38
- return _apidomNsArazzo.mediaTypes.includes(file.mediaType);
38
+ if (!(0, _mediaTypes.matches)('text/plain', file.mediaType)) {
39
+ return (0, _mediaTypes.selectBestMatch)(_apidomNsArazzo.mediaTypes, file.mediaType) !== null;
39
40
  }
40
41
 
41
42
  // assert by inspecting ApiDOM
@@ -1,6 +1,7 @@
1
1
  import { cloneDeep } from '@speclynx/apidom-datamodel';
2
2
  import { traverseAsync } from '@speclynx/apidom-traverse';
3
3
  import { mediaTypes, isArazzoSpecification1Element } from '@speclynx/apidom-ns-arazzo-1';
4
+ import { matches, selectBestMatch } from '@swaggerexpert/media-types';
4
5
  import Reference from "../../../Reference.mjs";
5
6
  import ReferenceSet from "../../../ReferenceSet.mjs";
6
7
  import BundleStrategy from "../BundleStrategy.mjs";
@@ -20,8 +21,8 @@ class Arazzo1BundleStrategy extends BundleStrategy {
20
21
  }
21
22
  canBundle(file) {
22
23
  // assert by media type
23
- if (file.mediaType !== 'text/plain') {
24
- return mediaTypes.includes(file.mediaType);
24
+ if (!matches('text/plain', file.mediaType)) {
25
+ return selectBestMatch(mediaTypes, file.mediaType) !== null;
25
26
  }
26
27
 
27
28
  // assert by inspecting ApiDOM
@@ -14,6 +14,7 @@ exports.default = void 0;
14
14
  var _apidomDatamodel = require("@speclynx/apidom-datamodel");
15
15
  var _apidomTraverse = require("@speclynx/apidom-traverse");
16
16
  var _apidomNsAsyncapi = require("@speclynx/apidom-ns-asyncapi-2");
17
+ var _mediaTypes = require("@swaggerexpert/media-types");
17
18
  var _Reference = _interopRequireDefault(require("../../../Reference.cjs"));
18
19
  var _ReferenceSet = _interopRequireDefault(require("../../../ReferenceSet.cjs"));
19
20
  var _BundleStrategy = _interopRequireDefault(require("../BundleStrategy.cjs"));
@@ -34,8 +35,8 @@ class AsyncAPI2BundleStrategy extends _BundleStrategy.default {
34
35
  }
35
36
  canBundle(file) {
36
37
  // assert by media type
37
- if (file.mediaType !== 'text/plain') {
38
- return _apidomNsAsyncapi.mediaTypes.includes(file.mediaType);
38
+ if (!(0, _mediaTypes.matches)('text/plain', file.mediaType)) {
39
+ return (0, _mediaTypes.selectBestMatch)(_apidomNsAsyncapi.mediaTypes, file.mediaType) !== null;
39
40
  }
40
41
 
41
42
  // assert by inspecting ApiDOM
@@ -1,6 +1,7 @@
1
1
  import { cloneDeep } from '@speclynx/apidom-datamodel';
2
2
  import { traverseAsync } from '@speclynx/apidom-traverse';
3
3
  import { mediaTypes, isAsyncApi2Element } from '@speclynx/apidom-ns-asyncapi-2';
4
+ import { matches, selectBestMatch } from '@swaggerexpert/media-types';
4
5
  import Reference from "../../../Reference.mjs";
5
6
  import ReferenceSet from "../../../ReferenceSet.mjs";
6
7
  import BundleStrategy from "../BundleStrategy.mjs";
@@ -20,8 +21,8 @@ class AsyncAPI2BundleStrategy extends BundleStrategy {
20
21
  }
21
22
  canBundle(file) {
22
23
  // assert by media type
23
- if (file.mediaType !== 'text/plain') {
24
- return mediaTypes.includes(file.mediaType);
24
+ if (!matches('text/plain', file.mediaType)) {
25
+ return selectBestMatch(mediaTypes, file.mediaType) !== null;
25
26
  }
26
27
 
27
28
  // assert by inspecting ApiDOM
@@ -14,6 +14,7 @@ exports.default = void 0;
14
14
  var _apidomDatamodel = require("@speclynx/apidom-datamodel");
15
15
  var _apidomTraverse = require("@speclynx/apidom-traverse");
16
16
  var _apidomNsOpenapi = require("@speclynx/apidom-ns-openapi-2");
17
+ var _mediaTypes = require("@swaggerexpert/media-types");
17
18
  var _Reference = _interopRequireDefault(require("../../../Reference.cjs"));
18
19
  var _ReferenceSet = _interopRequireDefault(require("../../../ReferenceSet.cjs"));
19
20
  var _BundleStrategy = _interopRequireDefault(require("../BundleStrategy.cjs"));
@@ -34,8 +35,8 @@ class OpenAPI2BundleStrategy extends _BundleStrategy.default {
34
35
  }
35
36
  canBundle(file) {
36
37
  // assert by media type
37
- if (file.mediaType !== 'text/plain') {
38
- return _apidomNsOpenapi.mediaTypes.includes(file.mediaType);
38
+ if (!(0, _mediaTypes.matches)('text/plain', file.mediaType)) {
39
+ return (0, _mediaTypes.selectBestMatch)(_apidomNsOpenapi.mediaTypes, file.mediaType) !== null;
39
40
  }
40
41
 
41
42
  // assert by inspecting ApiDOM
@@ -1,6 +1,7 @@
1
1
  import { cloneDeep } from '@speclynx/apidom-datamodel';
2
2
  import { traverseAsync } from '@speclynx/apidom-traverse';
3
3
  import { mediaTypes, isSwaggerElement } from '@speclynx/apidom-ns-openapi-2';
4
+ import { matches, selectBestMatch } from '@swaggerexpert/media-types';
4
5
  import Reference from "../../../Reference.mjs";
5
6
  import ReferenceSet from "../../../ReferenceSet.mjs";
6
7
  import BundleStrategy from "../BundleStrategy.mjs";
@@ -20,8 +21,8 @@ class OpenAPI2BundleStrategy extends BundleStrategy {
20
21
  }
21
22
  canBundle(file) {
22
23
  // assert by media type
23
- if (file.mediaType !== 'text/plain') {
24
- return mediaTypes.includes(file.mediaType);
24
+ if (!matches('text/plain', file.mediaType)) {
25
+ return selectBestMatch(mediaTypes, file.mediaType) !== null;
25
26
  }
26
27
 
27
28
  // assert by inspecting ApiDOM
@@ -14,6 +14,7 @@ exports.default = void 0;
14
14
  var _apidomDatamodel = require("@speclynx/apidom-datamodel");
15
15
  var _apidomTraverse = require("@speclynx/apidom-traverse");
16
16
  var _apidomNsOpenapi = require("@speclynx/apidom-ns-openapi-3-0");
17
+ var _mediaTypes = require("@swaggerexpert/media-types");
17
18
  var _Reference = _interopRequireDefault(require("../../../Reference.cjs"));
18
19
  var _ReferenceSet = _interopRequireDefault(require("../../../ReferenceSet.cjs"));
19
20
  var _BundleStrategy = _interopRequireDefault(require("../BundleStrategy.cjs"));
@@ -34,8 +35,8 @@ class OpenAPI3_0BundleStrategy extends _BundleStrategy.default {
34
35
  }
35
36
  canBundle(file) {
36
37
  // assert by media type
37
- if (file.mediaType !== 'text/plain') {
38
- return _apidomNsOpenapi.mediaTypes.includes(file.mediaType);
38
+ if (!(0, _mediaTypes.matches)('text/plain', file.mediaType)) {
39
+ return (0, _mediaTypes.selectBestMatch)(_apidomNsOpenapi.mediaTypes, file.mediaType) !== null;
39
40
  }
40
41
 
41
42
  // assert by inspecting ApiDOM
@@ -1,6 +1,7 @@
1
1
  import { cloneDeep } from '@speclynx/apidom-datamodel';
2
2
  import { traverseAsync } from '@speclynx/apidom-traverse';
3
3
  import { mediaTypes, isOpenApi3_0Element } from '@speclynx/apidom-ns-openapi-3-0';
4
+ import { matches, selectBestMatch } from '@swaggerexpert/media-types';
4
5
  import Reference from "../../../Reference.mjs";
5
6
  import ReferenceSet from "../../../ReferenceSet.mjs";
6
7
  import BundleStrategy from "../BundleStrategy.mjs";
@@ -20,8 +21,8 @@ class OpenAPI3_0BundleStrategy extends BundleStrategy {
20
21
  }
21
22
  canBundle(file) {
22
23
  // assert by media type
23
- if (file.mediaType !== 'text/plain') {
24
- return mediaTypes.includes(file.mediaType);
24
+ if (!matches('text/plain', file.mediaType)) {
25
+ return selectBestMatch(mediaTypes, file.mediaType) !== null;
25
26
  }
26
27
 
27
28
  // assert by inspecting ApiDOM
@@ -14,6 +14,7 @@ exports.default = void 0;
14
14
  var _apidomDatamodel = require("@speclynx/apidom-datamodel");
15
15
  var _apidomTraverse = require("@speclynx/apidom-traverse");
16
16
  var _apidomNsOpenapi = require("@speclynx/apidom-ns-openapi-3-1");
17
+ var _mediaTypes = require("@swaggerexpert/media-types");
17
18
  var _Reference = _interopRequireDefault(require("../../../Reference.cjs"));
18
19
  var _ReferenceSet = _interopRequireDefault(require("../../../ReferenceSet.cjs"));
19
20
  var _BundleStrategy = _interopRequireDefault(require("../BundleStrategy.cjs"));
@@ -34,8 +35,8 @@ class OpenAPI3_1BundleStrategy extends _BundleStrategy.default {
34
35
  }
35
36
  canBundle(file) {
36
37
  // assert by media type
37
- if (file.mediaType !== 'text/plain') {
38
- return _apidomNsOpenapi.mediaTypes.includes(file.mediaType);
38
+ if (!(0, _mediaTypes.matches)('text/plain', file.mediaType)) {
39
+ return (0, _mediaTypes.selectBestMatch)(_apidomNsOpenapi.mediaTypes, file.mediaType) !== null;
39
40
  }
40
41
 
41
42
  // assert by inspecting ApiDOM
@@ -1,6 +1,7 @@
1
1
  import { cloneDeep } from '@speclynx/apidom-datamodel';
2
2
  import { traverseAsync } from '@speclynx/apidom-traverse';
3
3
  import { mediaTypes, isOpenApi3_1Element } from '@speclynx/apidom-ns-openapi-3-1';
4
+ import { matches, selectBestMatch } from '@swaggerexpert/media-types';
4
5
  import Reference from "../../../Reference.mjs";
5
6
  import ReferenceSet from "../../../ReferenceSet.mjs";
6
7
  import BundleStrategy from "../BundleStrategy.mjs";
@@ -20,8 +21,8 @@ class OpenAPI3_1BundleStrategy extends BundleStrategy {
20
21
  }
21
22
  canBundle(file) {
22
23
  // assert by media type
23
- if (file.mediaType !== 'text/plain') {
24
- return mediaTypes.includes(file.mediaType);
24
+ if (!matches('text/plain', file.mediaType)) {
25
+ return selectBestMatch(mediaTypes, file.mediaType) !== null;
25
26
  }
26
27
 
27
28
  // assert by inspecting ApiDOM
@@ -31,8 +31,10 @@ const dereferenceApiDOM = async (element, options) => {
31
31
  parseResult = new _apidomDatamodel.ParseResultElement([elementClone]);
32
32
  surrogateWrapping = true;
33
33
  }
34
+
35
+ // strategies look up same-document references by a resolved, hence normalized, URI
34
36
  const file = new _File.default({
35
- uri: options.resolve.baseURI,
37
+ uri: url.normalize(options.resolve.baseURI),
36
38
  parseResult,
37
39
  mediaType: options.parse.mediaType
38
40
  });
@@ -66,21 +68,22 @@ const dereference = async (uri, options) => {
66
68
  const {
67
69
  refSet
68
70
  } = options.dereference;
69
- const sanitizedURI = url.sanitize(uri);
71
+ // the file is parsed as a whole document, so its URI has no fragment
72
+ const baseURI = url.normalize(url.stripHash(uri));
70
73
  let parseResult;
71
74
 
72
75
  // if refSet was provided, use it to avoid unnecessary parsing
73
- if (refSet !== null && refSet.has(sanitizedURI)) {
76
+ if (refSet !== null && refSet.has(baseURI)) {
74
77
  // @ts-ignore
75
78
  ({
76
79
  value: parseResult
77
- } = refSet.find((0, _ramda.propEq)(sanitizedURI, 'uri')));
80
+ } = refSet.find((0, _ramda.propEq)(baseURI, 'uri')));
78
81
  } else {
79
82
  parseResult = await (0, _index.default)(uri, options);
80
83
  }
81
84
  const mergedOptions = (0, _util.merge)(options, {
82
85
  resolve: {
83
- baseURI: sanitizedURI
86
+ baseURI
84
87
  },
85
88
  dereference: {
86
89
  // if refSet was not provided, then we can work in mutable mode
@@ -23,8 +23,10 @@ export const dereferenceApiDOM = async (element, options) => {
23
23
  parseResult = new ParseResultElement([elementClone]);
24
24
  surrogateWrapping = true;
25
25
  }
26
+
27
+ // strategies look up same-document references by a resolved, hence normalized, URI
26
28
  const file = new File({
27
- uri: options.resolve.baseURI,
29
+ uri: url.normalize(options.resolve.baseURI),
28
30
  parseResult,
29
31
  mediaType: options.parse.mediaType
30
32
  });
@@ -57,21 +59,22 @@ const dereference = async (uri, options) => {
57
59
  const {
58
60
  refSet
59
61
  } = options.dereference;
60
- const sanitizedURI = url.sanitize(uri);
62
+ // the file is parsed as a whole document, so its URI has no fragment
63
+ const baseURI = url.normalize(url.stripHash(uri));
61
64
  let parseResult;
62
65
 
63
66
  // if refSet was provided, use it to avoid unnecessary parsing
64
- if (refSet !== null && refSet.has(sanitizedURI)) {
67
+ if (refSet !== null && refSet.has(baseURI)) {
65
68
  // @ts-ignore
66
69
  ({
67
70
  value: parseResult
68
- } = refSet.find(propEq(sanitizedURI, 'uri')));
71
+ } = refSet.find(propEq(baseURI, 'uri')));
69
72
  } else {
70
73
  parseResult = await parse(uri, options);
71
74
  }
72
75
  const mergedOptions = mergeOptions(options, {
73
76
  resolve: {
74
- baseURI: sanitizedURI
77
+ baseURI
75
78
  },
76
79
  dereference: {
77
80
  // if refSet was not provided, then we can work in mutable mode