Skip to content

Commit 62b4745

Browse files
committed
feat: add OpenAPI 3.1.0 dereference strategy (#2740)
Refs #2717
1 parent 551c101 commit 62b4745

File tree

329 files changed

+8429
-80
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

329 files changed

+8429
-80
lines changed

.eslintrc

+9-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,15 @@
3737
"import/no-unresolved": [
3838
2,
3939
{
40-
"ignore": ["^@swagger-api/apidom-reference/configuration/empty$"]
40+
"ignore": [
41+
"^@swagger-api/apidom-reference/configuration/empty$",
42+
"^@swagger-api/apidom-reference/dereference/strategies/openapi-3-1$",
43+
"^@swagger-api/apidom-reference/dereference/strategies/openapi-3-1/selectors/\\$anchor$",
44+
"^@swagger-api/apidom-reference/dereference/strategies/openapi-3-1/selectors/uri$",
45+
"^@swagger-api/apidom-reference/resolve/resolvers/file$",
46+
"^@swagger-api/apidom-reference/resolve/strategies/openapi-3-1$",
47+
"^@swagger-api/apidom-reference/parse/parsers/binary$"
48+
]
4149
}
4250
],
4351
"prettier/prettier": "error",

config/jest/jest.unit.config.js

+2
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,7 @@ module.exports = {
1515
'<rootDir>/test/jest.setup.js',
1616
'<rootDir>/test/specmap/data/',
1717
'<rootDir>/test/build-artifacts/',
18+
'/__fixtures__/',
19+
'/__utils__/',
1820
],
1921
};

package.json

+5-3
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
"build:es": "cross-env BABEL_ENV=es babel src --out-dir es",
4646
"lint": "eslint src/ test/",
4747
"lint:fix": "npm run lint -- --fix",
48+
"link:apidom": "npm link @swagger-api/apidom-core @swagger-api/apidom-reference @swagger-api/apidom-ns-openapi-3-1 @swagger-api/apidom-ns-openapi-3-0 @swagger-api/apidom-ns-json-schema-draft-4 @swagger-api/apidom-json-pointer",
4849
"test": "run-s test:unit:coverage test:artifact",
4950
"test:unit": "cross-env BABEL_ENV=commonjs jest --runInBand --config ./config/jest/jest.unit.config.js",
5051
"test:unit:coverage": "cross-env BABEL_ENV=commonjs jest --runInBand --config ./config/jest/jest.unit.coverage.config.js",
@@ -110,9 +111,10 @@
110111
},
111112
"dependencies": {
112113
"@babel/runtime-corejs3": "^7.11.2",
113-
"@swagger-api/apidom-core": "^0.60.0",
114-
"@swagger-api/apidom-reference": "^0.60.0",
115-
"@swagger-api/apidom-ns-openapi-3-1": "^0.60.0",
114+
"@swagger-api/apidom-core": "^0.61.0",
115+
"@swagger-api/apidom-reference": "^0.61.0",
116+
"@swagger-api/apidom-ns-openapi-3-1": "^0.61.0",
117+
"@swagger-api/apidom-json-pointer": "^0.61.0",
116118
"cookie": "~0.5.0",
117119
"cross-fetch": "^3.1.5",
118120
"deepmerge": "~4.2.2",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/* eslint-disable camelcase */
2+
import { createNamespace, visit } from '@swagger-api/apidom-core';
3+
import { ReferenceSet, Reference } from '@swagger-api/apidom-reference/configuration/empty';
4+
import OpenApi3_1DereferenceStrategy from '@swagger-api/apidom-reference/dereference/strategies/openapi-3-1';
5+
import openApi3_1Namespace, { getNodeType, keyMap } from '@swagger-api/apidom-ns-openapi-3-1';
6+
7+
import OpenApi3_1SwaggerClientDereferenceVisitor from './visitor.js';
8+
9+
const visitAsync = visit[Symbol.for('nodejs.util.promisify.custom')];
10+
11+
const OpenApi3_1SwaggerClientDereferenceStrategy = OpenApi3_1DereferenceStrategy.compose({
12+
props: {
13+
useCircularStructures: true,
14+
allowMetaPatches: false,
15+
},
16+
init({
17+
useCircularStructures = this.useCircularStructures,
18+
allowMetaPatches = this.allowMetaPatches,
19+
} = {}) {
20+
this.name = 'openapi-3-1-swagger-client';
21+
this.useCircularStructures = useCircularStructures;
22+
this.allowMetaPatches = allowMetaPatches;
23+
},
24+
methods: {
25+
async dereference(file, options) {
26+
const namespace = createNamespace(openApi3_1Namespace);
27+
const refSet = options.dereference.refSet ?? ReferenceSet();
28+
let reference;
29+
30+
if (!refSet.has(file.uri)) {
31+
reference = Reference({ uri: file.uri, value: file.parseResult });
32+
refSet.add(reference);
33+
} else {
34+
// pre-computed refSet was provided as configuration option
35+
reference = refSet.find((ref) => ref.uri === file.uri);
36+
}
37+
38+
const visitor = OpenApi3_1SwaggerClientDereferenceVisitor({
39+
reference,
40+
namespace,
41+
options,
42+
useCircularStructures: this.useCircularStructures,
43+
allowMetaPatches: this.allowMetaPatches,
44+
});
45+
const dereferencedElement = await visitAsync(refSet.rootRef.value, visitor, {
46+
keyMap,
47+
nodeTypeGetter: getNodeType,
48+
});
49+
50+
/**
51+
* Release all memory if this refSet was not provided as a configuration option.
52+
* If provided as configuration option, then provider is responsible for cleanup.
53+
*/
54+
if (options.dereference.refSet === null) {
55+
refSet.clean();
56+
}
57+
58+
return dereferencedElement;
59+
},
60+
},
61+
});
62+
63+
export default OpenApi3_1SwaggerClientDereferenceStrategy;
64+
/* eslint-enable camelcase */

0 commit comments

Comments
 (0)