swagger-client 3.36.2 → 3.37.1
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/README.md +8 -7
- package/dist/swagger-client.browser.js +29435 -21476
- package/dist/swagger-client.browser.min.js +1 -1
- package/dist/swagger-client.browser.min.js.map +1 -1
- package/es/helpers/openapi-predicates.js +11 -1
- package/es/index.js +12 -4
- package/es/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/errors/SchemaRefError.js +3 -0
- package/es/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/index.js +99 -0
- package/es/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/utils/get-root-cause.js +17 -0
- package/es/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/utils/to-path.js +23 -0
- package/es/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/visitors/all-of.js +103 -0
- package/es/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/visitors/dereference.js +677 -0
- package/es/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/visitors/parameters.js +40 -0
- package/es/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/visitors/properties.js +34 -0
- package/es/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/visitors/root.js +45 -0
- package/es/resolver/apidom/reference/parse/parsers/openapi-json-3-2/index.js +55 -0
- package/es/resolver/apidom/reference/parse/parsers/openapi-yaml-3-2/index.js +56 -0
- package/es/resolver/strategies/openapi-3-2-apidom/index.js +28 -0
- package/es/resolver/strategies/openapi-3-2-apidom/normalize.js +44 -0
- package/es/resolver/strategies/openapi-3-2-apidom/resolve.js +161 -0
- package/lib/helpers/openapi-predicates.js +13 -2
- package/lib/index.js +29 -21
- package/lib/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/errors/SchemaRefError.js +7 -0
- package/lib/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/index.js +106 -0
- package/lib/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/utils/get-root-cause.js +21 -0
- package/lib/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/utils/to-path.js +27 -0
- package/lib/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/visitors/all-of.js +108 -0
- package/lib/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/visitors/dereference.js +683 -0
- package/lib/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/visitors/parameters.js +45 -0
- package/lib/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/visitors/properties.js +39 -0
- package/lib/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/visitors/root.js +51 -0
- package/lib/resolver/apidom/reference/parse/parsers/openapi-json-3-2/index.js +60 -0
- package/lib/resolver/apidom/reference/parse/parsers/openapi-yaml-3-2/index.js +62 -0
- package/lib/resolver/strategies/openapi-3-2-apidom/index.js +34 -0
- package/lib/resolver/strategies/openapi-3-2-apidom/normalize.js +51 -0
- package/lib/resolver/strategies/openapi-3-2-apidom/resolve.js +169 -0
- package/package.json +32 -29
|
@@ -28,7 +28,17 @@ export const isOpenAPI31 = spec => {
|
|
|
28
28
|
return false;
|
|
29
29
|
}
|
|
30
30
|
};
|
|
31
|
-
export const
|
|
31
|
+
export const isOpenAPI32 = spec => {
|
|
32
|
+
try {
|
|
33
|
+
const {
|
|
34
|
+
openapi
|
|
35
|
+
} = spec;
|
|
36
|
+
return typeof openapi === 'string' && /^3\.2\.(?:[1-9]\d*|0)$/.test(openapi);
|
|
37
|
+
} catch {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
export const isOpenAPI3 = spec => isOpenAPI30(spec) || isOpenAPI31(spec) || isOpenAPI32(spec);
|
|
32
42
|
|
|
33
43
|
// backward compatibility export
|
|
34
44
|
export { isOpenAPI2 as isSwagger2 };
|
package/es/index.js
CHANGED
|
@@ -8,6 +8,7 @@ import genericResolveStrategy from './resolver/strategies/generic/index.js';
|
|
|
8
8
|
import openApi2ResolveStrategy, { clearCache } from './resolver/strategies/openapi-2/index.js';
|
|
9
9
|
import openApi30ResolveStrategy from './resolver/strategies/openapi-3-0/index.js';
|
|
10
10
|
import openApi31ApiDOMResolveStrategy from './resolver/strategies/openapi-3-1-apidom/index.js';
|
|
11
|
+
import openApi32ApiDOMResolveStrategy from './resolver/strategies/openapi-3-2-apidom/index.js';
|
|
11
12
|
import { makeApisTagOperation } from './interfaces.js';
|
|
12
13
|
import { execute, buildRequest, baseUrl } from './execute/index.js';
|
|
13
14
|
import { opId, isHttpUrl } from './helpers/index.js';
|
|
@@ -17,20 +18,24 @@ import JsonParser from './resolver/apidom/reference/parse/parsers/json/index.js'
|
|
|
17
18
|
import YamlParser from './resolver/apidom/reference/parse/parsers/yaml-1-2/index.js';
|
|
18
19
|
import OpenApiJson3_1Parser from './resolver/apidom/reference/parse/parsers/openapi-json-3-1/index.js';
|
|
19
20
|
import OpenApiYaml3_1Parser from './resolver/apidom/reference/parse/parsers/openapi-yaml-3-1/index.js';
|
|
21
|
+
import OpenApiJson3_2Parser from './resolver/apidom/reference/parse/parsers/openapi-json-3-2/index.js';
|
|
22
|
+
import OpenApiYaml3_2Parser from './resolver/apidom/reference/parse/parsers/openapi-yaml-3-2/index.js';
|
|
20
23
|
import OpenApi3_1SwaggerClientDereferenceStrategy from './resolver/apidom/reference/dereference/strategies/openapi-3-1-swagger-client/index.js';
|
|
24
|
+
import OpenApi3_2SwaggerClientDereferenceStrategy from './resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/index.js';
|
|
21
25
|
Swagger.http = Http;
|
|
22
26
|
Swagger.makeHttp = makeHttp.bind(null, Swagger.http);
|
|
23
27
|
Swagger.resolveStrategies = {
|
|
28
|
+
'openapi-3-2-apidom': openApi32ApiDOMResolveStrategy,
|
|
24
29
|
'openapi-3-1-apidom': openApi31ApiDOMResolveStrategy,
|
|
25
30
|
'openapi-3-0': openApi30ResolveStrategy,
|
|
26
31
|
'openapi-2-0': openApi2ResolveStrategy,
|
|
27
32
|
generic: genericResolveStrategy
|
|
28
33
|
};
|
|
29
34
|
Swagger.resolve = makeResolve({
|
|
30
|
-
strategies: [Swagger.resolveStrategies['openapi-3-1-apidom'], Swagger.resolveStrategies['openapi-3-0'], Swagger.resolveStrategies['openapi-2-0'], Swagger.resolveStrategies.generic]
|
|
35
|
+
strategies: [Swagger.resolveStrategies['openapi-3-2-apidom'], Swagger.resolveStrategies['openapi-3-1-apidom'], Swagger.resolveStrategies['openapi-3-0'], Swagger.resolveStrategies['openapi-2-0'], Swagger.resolveStrategies.generic]
|
|
31
36
|
});
|
|
32
37
|
Swagger.resolveSubtree = makeResolveSubtree({
|
|
33
|
-
strategies: [Swagger.resolveStrategies['openapi-3-1-apidom'], Swagger.resolveStrategies['openapi-3-0'], Swagger.resolveStrategies['openapi-2-0'], Swagger.resolveStrategies.generic]
|
|
38
|
+
strategies: [Swagger.resolveStrategies['openapi-3-2-apidom'], Swagger.resolveStrategies['openapi-3-1-apidom'], Swagger.resolveStrategies['openapi-3-0'], Swagger.resolveStrategies['openapi-2-0'], Swagger.resolveStrategies.generic]
|
|
34
39
|
});
|
|
35
40
|
Swagger.execute = execute;
|
|
36
41
|
Swagger.serializeRes = serializeRes;
|
|
@@ -53,12 +58,15 @@ Swagger.apidom = {
|
|
|
53
58
|
JsonParser,
|
|
54
59
|
YamlParser,
|
|
55
60
|
OpenApiJson3_1Parser,
|
|
56
|
-
OpenApiYaml3_1Parser
|
|
61
|
+
OpenApiYaml3_1Parser,
|
|
62
|
+
OpenApiJson3_2Parser,
|
|
63
|
+
OpenApiYaml3_2Parser
|
|
57
64
|
}
|
|
58
65
|
},
|
|
59
66
|
dereference: {
|
|
60
67
|
strategies: {
|
|
61
|
-
OpenApi3_1SwaggerClientDereferenceStrategy
|
|
68
|
+
OpenApi3_1SwaggerClientDereferenceStrategy,
|
|
69
|
+
OpenApi3_2SwaggerClientDereferenceStrategy
|
|
62
70
|
}
|
|
63
71
|
}
|
|
64
72
|
};
|
package/es/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/index.js
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/* eslint-disable camelcase */
|
|
2
|
+
import { createNamespace, visit, cloneDeep } from '@swagger-api/apidom-core';
|
|
3
|
+
import { ReferenceSet, Reference } from '@swagger-api/apidom-reference/configuration/empty';
|
|
4
|
+
import OpenAPI3_2DereferenceStrategy from '@swagger-api/apidom-reference/dereference/strategies/openapi-3-2';
|
|
5
|
+
import openApi3_2Namespace, { getNodeType, keyMap } from '@swagger-api/apidom-ns-openapi-3-2';
|
|
6
|
+
import RootVisitor from './visitors/root.js';
|
|
7
|
+
const visitAsync = visit[Symbol.for('nodejs.util.promisify.custom')];
|
|
8
|
+
class OpenAPI3_2SwaggerClientDereferenceStrategy extends OpenAPI3_2DereferenceStrategy {
|
|
9
|
+
allowMetaPatches;
|
|
10
|
+
parameterMacro;
|
|
11
|
+
modelPropertyMacro;
|
|
12
|
+
mode;
|
|
13
|
+
ancestors;
|
|
14
|
+
constructor({
|
|
15
|
+
allowMetaPatches = false,
|
|
16
|
+
parameterMacro = null,
|
|
17
|
+
modelPropertyMacro = null,
|
|
18
|
+
mode = 'non-strict',
|
|
19
|
+
ancestors = [],
|
|
20
|
+
...rest
|
|
21
|
+
} = {}) {
|
|
22
|
+
super({
|
|
23
|
+
...rest
|
|
24
|
+
});
|
|
25
|
+
this.name = 'openapi-3-2-swagger-client';
|
|
26
|
+
this.allowMetaPatches = allowMetaPatches;
|
|
27
|
+
this.parameterMacro = parameterMacro;
|
|
28
|
+
this.modelPropertyMacro = modelPropertyMacro;
|
|
29
|
+
this.mode = mode;
|
|
30
|
+
this.ancestors = [...ancestors];
|
|
31
|
+
}
|
|
32
|
+
async dereference(file, options) {
|
|
33
|
+
var _options$dereference$;
|
|
34
|
+
const namespace = createNamespace(openApi3_2Namespace);
|
|
35
|
+
const immutableRefSet = (_options$dereference$ = options.dereference.refSet) !== null && _options$dereference$ !== void 0 ? _options$dereference$ : new ReferenceSet();
|
|
36
|
+
const mutableRefsSet = new ReferenceSet();
|
|
37
|
+
let refSet = immutableRefSet;
|
|
38
|
+
let reference;
|
|
39
|
+
if (!immutableRefSet.has(file.uri)) {
|
|
40
|
+
reference = new Reference({
|
|
41
|
+
uri: file.uri,
|
|
42
|
+
value: file.parseResult
|
|
43
|
+
});
|
|
44
|
+
immutableRefSet.add(reference);
|
|
45
|
+
} else {
|
|
46
|
+
// pre-computed refSet was provided as configuration option
|
|
47
|
+
reference = immutableRefSet.find(ref => ref.uri === file.uri);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Clone refSet due the dereferencing process being mutable.
|
|
52
|
+
* We don't want to mutate the original refSet and the references.
|
|
53
|
+
*/
|
|
54
|
+
if (options.dereference.immutable) {
|
|
55
|
+
immutableRefSet.refs.map(ref => new Reference({
|
|
56
|
+
...ref,
|
|
57
|
+
value: cloneDeep(ref.value)
|
|
58
|
+
})).forEach(ref => mutableRefsSet.add(ref));
|
|
59
|
+
reference = mutableRefsSet.find(ref => ref.uri === file.uri);
|
|
60
|
+
refSet = mutableRefsSet;
|
|
61
|
+
}
|
|
62
|
+
const rootVisitor = new RootVisitor({
|
|
63
|
+
reference,
|
|
64
|
+
namespace,
|
|
65
|
+
options,
|
|
66
|
+
allowMetaPatches: this.allowMetaPatches,
|
|
67
|
+
ancestors: this.ancestors,
|
|
68
|
+
modelPropertyMacro: this.modelPropertyMacro,
|
|
69
|
+
mode: this.mode,
|
|
70
|
+
parameterMacro: this.parameterMacro
|
|
71
|
+
});
|
|
72
|
+
const dereferencedElement = await visitAsync(refSet.rootRef.value, rootVisitor, {
|
|
73
|
+
keyMap,
|
|
74
|
+
nodeTypeGetter: getNodeType
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* If immutable option is set, replay refs from the refSet.
|
|
79
|
+
*/
|
|
80
|
+
if (options.dereference.immutable) {
|
|
81
|
+
mutableRefsSet.refs.filter(ref => ref.uri.startsWith('immutable://')).map(ref => new Reference({
|
|
82
|
+
...ref,
|
|
83
|
+
uri: ref.uri.replace(/^immutable:\/\//, '')
|
|
84
|
+
})).forEach(ref => immutableRefSet.add(ref));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Release all memory if this refSet was not provided as an configuration option.
|
|
89
|
+
* If provided as configuration option, then provider is responsible for cleanup.
|
|
90
|
+
*/
|
|
91
|
+
if (options.dereference.refSet === null) {
|
|
92
|
+
immutableRefSet.clean();
|
|
93
|
+
}
|
|
94
|
+
mutableRefsSet.clean();
|
|
95
|
+
return dereferencedElement;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
export default OpenAPI3_2SwaggerClientDereferenceStrategy;
|
|
99
|
+
/* eslint-enable camelcase */
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retrieves the root cause of ApiDOM error hierarchy.
|
|
3
|
+
* ApiDOM error hierarchies are modeled similar to Java.
|
|
4
|
+
* Every error can have cause attribute which references
|
|
5
|
+
* cause of this error.
|
|
6
|
+
*/
|
|
7
|
+
const getRootCause = error => {
|
|
8
|
+
if (error.cause == null) return error;
|
|
9
|
+
let {
|
|
10
|
+
cause
|
|
11
|
+
} = error;
|
|
12
|
+
while (cause.cause != null) {
|
|
13
|
+
cause = cause.cause;
|
|
14
|
+
}
|
|
15
|
+
return cause;
|
|
16
|
+
};
|
|
17
|
+
export default getRootCause;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { isMemberElement, isArrayElement, toValue } from '@swagger-api/apidom-core';
|
|
2
|
+
const trimParseResult = elementPath => elementPath.slice(2);
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Transforms ApiDOM traversal meta information into
|
|
6
|
+
* SwaggerClient compatible path.
|
|
7
|
+
*
|
|
8
|
+
* SwaggerClient path is a list of JSON Pointer tokens.
|
|
9
|
+
*/
|
|
10
|
+
const toPath = elementPath => {
|
|
11
|
+
const elementPathSanitized = trimParseResult(elementPath);
|
|
12
|
+
return elementPathSanitized.reduce((path, element, index) => {
|
|
13
|
+
if (isMemberElement(element)) {
|
|
14
|
+
const token = String(toValue(element.key));
|
|
15
|
+
path.push(token);
|
|
16
|
+
} else if (isArrayElement(elementPathSanitized[index - 2])) {
|
|
17
|
+
const token = elementPathSanitized[index - 2].content.indexOf(element);
|
|
18
|
+
path.push(token);
|
|
19
|
+
}
|
|
20
|
+
return path;
|
|
21
|
+
}, []);
|
|
22
|
+
};
|
|
23
|
+
export default toPath;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { uniqWith } from 'ramda';
|
|
2
|
+
import { isArrayElement, isObjectElement, deepmerge, toValue, cloneShallow, includesClasses } from '@swagger-api/apidom-core';
|
|
3
|
+
import { isSchemaElement } from '@swagger-api/apidom-ns-openapi-3-2';
|
|
4
|
+
import toPath from '../utils/to-path.js';
|
|
5
|
+
class AllOfVisitor {
|
|
6
|
+
options;
|
|
7
|
+
SchemaElement = {
|
|
8
|
+
leave(schemaElement, key, parent, path, ancestors) {
|
|
9
|
+
// do nothing
|
|
10
|
+
if (typeof schemaElement.allOf === 'undefined') return undefined;
|
|
11
|
+
|
|
12
|
+
// collect error and return if allOf keyword is not an array
|
|
13
|
+
if (!isArrayElement(schemaElement.allOf)) {
|
|
14
|
+
var _this$options$derefer, _this$options$derefer2;
|
|
15
|
+
const error = new TypeError('allOf must be an array');
|
|
16
|
+
error.fullPath = [...toPath([...ancestors, parent, schemaElement]), 'allOf'];
|
|
17
|
+
(_this$options$derefer = this.options.dereference.dereferenceOpts) === null || _this$options$derefer === void 0 || (_this$options$derefer = _this$options$derefer.errors) === null || _this$options$derefer === void 0 || (_this$options$derefer2 = _this$options$derefer.push) === null || _this$options$derefer2 === void 0 || _this$options$derefer2.call(_this$options$derefer, error);
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// remove allOf keyword if empty
|
|
22
|
+
if (schemaElement.allOf.isEmpty) {
|
|
23
|
+
schemaElement.remove('allOf');
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// collect errors if allOf keyword contains anything else than Schema Object
|
|
28
|
+
const includesSchemaElementOnly = schemaElement.allOf.content.every(isSchemaElement);
|
|
29
|
+
if (!includesSchemaElementOnly) {
|
|
30
|
+
var _this$options$derefer3, _this$options$derefer4;
|
|
31
|
+
const error = new TypeError('Elements in allOf must be objects');
|
|
32
|
+
error.fullPath = [...toPath([...ancestors, parent, schemaElement]), 'allOf'];
|
|
33
|
+
(_this$options$derefer3 = this.options.dereference.dereferenceOpts) === null || _this$options$derefer3 === void 0 || (_this$options$derefer3 = _this$options$derefer3.errors) === null || _this$options$derefer3 === void 0 || (_this$options$derefer4 = _this$options$derefer3.push) === null || _this$options$derefer4 === void 0 || _this$options$derefer4.call(_this$options$derefer3, error);
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
while (schemaElement.hasKey('allOf')) {
|
|
37
|
+
const {
|
|
38
|
+
allOf
|
|
39
|
+
} = schemaElement;
|
|
40
|
+
schemaElement.remove('allOf');
|
|
41
|
+
const allOfMerged = deepmerge.all([...allOf.content, schemaElement], {
|
|
42
|
+
customMerge: keyElement => {
|
|
43
|
+
if (toValue(keyElement) === 'enum') {
|
|
44
|
+
return (targetElement, sourceElement) => {
|
|
45
|
+
if (includesClasses(['json-schema-enum'], targetElement) && includesClasses(['json-schema-enum'], sourceElement)) {
|
|
46
|
+
const areElementsEqual = (a, b) => {
|
|
47
|
+
if (isArrayElement(a) || isArrayElement(b) || isObjectElement(a) || isObjectElement(b)) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
return a.equals(toValue(b));
|
|
51
|
+
};
|
|
52
|
+
const clone = cloneShallow(targetElement);
|
|
53
|
+
clone.content = uniqWith(areElementsEqual)([...targetElement.content, ...sourceElement.content]);
|
|
54
|
+
return clone;
|
|
55
|
+
}
|
|
56
|
+
return deepmerge(targetElement, sourceElement);
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return deepmerge;
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* If there was not an original $$ref value, make sure to remove
|
|
65
|
+
* any $$ref value that may exist from the result of `allOf` merges.
|
|
66
|
+
*/
|
|
67
|
+
if (!schemaElement.hasKey('$$ref')) {
|
|
68
|
+
allOfMerged.remove('$$ref');
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* If there was an example keyword in the original schema,
|
|
73
|
+
* keep it instead of merging with example from other schema.
|
|
74
|
+
*/
|
|
75
|
+
if (schemaElement.hasKey('example')) {
|
|
76
|
+
const member = allOfMerged.getMember('example');
|
|
77
|
+
if (member) {
|
|
78
|
+
member.value = schemaElement.get('example');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* If there was an examples keyword in the original schema,
|
|
84
|
+
* keep it instead of merging with examples from other schema.
|
|
85
|
+
*/
|
|
86
|
+
if (schemaElement.hasKey('examples')) {
|
|
87
|
+
const member = allOfMerged.getMember('examples');
|
|
88
|
+
if (member) {
|
|
89
|
+
member.value = schemaElement.get('examples');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
schemaElement.content = allOfMerged.content;
|
|
93
|
+
}
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
constructor({
|
|
98
|
+
options
|
|
99
|
+
}) {
|
|
100
|
+
this.options = options;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
export default AllOfVisitor;
|