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.
Files changed (37) hide show
  1. package/README.md +8 -7
  2. package/dist/swagger-client.browser.js +29435 -21476
  3. package/dist/swagger-client.browser.min.js +1 -1
  4. package/dist/swagger-client.browser.min.js.map +1 -1
  5. package/es/helpers/openapi-predicates.js +11 -1
  6. package/es/index.js +12 -4
  7. package/es/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/errors/SchemaRefError.js +3 -0
  8. package/es/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/index.js +99 -0
  9. package/es/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/utils/get-root-cause.js +17 -0
  10. package/es/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/utils/to-path.js +23 -0
  11. package/es/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/visitors/all-of.js +103 -0
  12. package/es/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/visitors/dereference.js +677 -0
  13. package/es/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/visitors/parameters.js +40 -0
  14. package/es/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/visitors/properties.js +34 -0
  15. package/es/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/visitors/root.js +45 -0
  16. package/es/resolver/apidom/reference/parse/parsers/openapi-json-3-2/index.js +55 -0
  17. package/es/resolver/apidom/reference/parse/parsers/openapi-yaml-3-2/index.js +56 -0
  18. package/es/resolver/strategies/openapi-3-2-apidom/index.js +28 -0
  19. package/es/resolver/strategies/openapi-3-2-apidom/normalize.js +44 -0
  20. package/es/resolver/strategies/openapi-3-2-apidom/resolve.js +161 -0
  21. package/lib/helpers/openapi-predicates.js +13 -2
  22. package/lib/index.js +29 -21
  23. package/lib/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/errors/SchemaRefError.js +7 -0
  24. package/lib/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/index.js +106 -0
  25. package/lib/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/utils/get-root-cause.js +21 -0
  26. package/lib/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/utils/to-path.js +27 -0
  27. package/lib/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/visitors/all-of.js +108 -0
  28. package/lib/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/visitors/dereference.js +683 -0
  29. package/lib/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/visitors/parameters.js +45 -0
  30. package/lib/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/visitors/properties.js +39 -0
  31. package/lib/resolver/apidom/reference/dereference/strategies/openapi-3-2-swagger-client/visitors/root.js +51 -0
  32. package/lib/resolver/apidom/reference/parse/parsers/openapi-json-3-2/index.js +60 -0
  33. package/lib/resolver/apidom/reference/parse/parsers/openapi-yaml-3-2/index.js +62 -0
  34. package/lib/resolver/strategies/openapi-3-2-apidom/index.js +34 -0
  35. package/lib/resolver/strategies/openapi-3-2-apidom/normalize.js +51 -0
  36. package/lib/resolver/strategies/openapi-3-2-apidom/resolve.js +169 -0
  37. package/package.json +32 -29
@@ -28,7 +28,17 @@ export const isOpenAPI31 = spec => {
28
28
  return false;
29
29
  }
30
30
  };
31
- export const isOpenAPI3 = spec => isOpenAPI30(spec) || isOpenAPI31(spec);
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
  };
@@ -0,0 +1,3 @@
1
+ import { ApiDOMStructuredError } from '@swagger-api/apidom-error';
2
+ class SchemaRefError extends ApiDOMStructuredError {}
3
+ export default SchemaRefError;
@@ -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;