@scalar/openapi-parser 0.8.9 → 0.9.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.
- package/CHANGELOG.md +12 -0
- package/README.md +40 -3
- package/dist/index.js +3 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/dereference.d.ts +4 -3
- package/dist/utils/dereference.d.ts.map +1 -1
- package/dist/utils/dereference.js +1 -1
- package/dist/utils/details.d.ts +1 -1
- package/dist/utils/details.js +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/normalize.d.ts +3 -2
- package/dist/utils/normalize.d.ts.map +1 -1
- package/dist/utils/normalize.js +3 -2
- package/dist/utils/resolveReferences.d.ts +7 -1
- package/dist/utils/resolveReferences.d.ts.map +1 -1
- package/dist/utils/resolveReferences.js +5 -4
- package/dist/utils/transform/index.d.ts +2 -0
- package/dist/utils/transform/index.d.ts.map +1 -0
- package/dist/utils/transform/sanitize.d.ts +9 -0
- package/dist/utils/transform/sanitize.d.ts.map +1 -0
- package/dist/utils/transform/sanitize.js +23 -0
- package/dist/utils/transform/utils/addInfoObject.d.ts +7 -0
- package/dist/utils/transform/utils/addInfoObject.d.ts.map +1 -0
- package/dist/utils/transform/utils/addInfoObject.js +12 -0
- package/dist/utils/transform/utils/addLatestOpenApiVersion.d.ts +6 -0
- package/dist/utils/transform/utils/addLatestOpenApiVersion.d.ts.map +1 -0
- package/dist/utils/transform/utils/addLatestOpenApiVersion.js +7 -0
- package/dist/utils/transform/utils/addMissingTags.d.ts +3 -0
- package/dist/utils/transform/utils/addMissingTags.d.ts.map +1 -0
- package/dist/utils/transform/utils/addMissingTags.js +38 -0
- package/dist/utils/transform/utils/normalizeSecuritySchemes.d.ts +3 -0
- package/dist/utils/transform/utils/normalizeSecuritySchemes.d.ts.map +1 -0
- package/dist/utils/transform/utils/normalizeSecuritySchemes.js +49 -0
- package/dist/utils/transform/utils/rejectSwaggerDocuments.d.ts +3 -0
- package/dist/utils/transform/utils/rejectSwaggerDocuments.d.ts.map +1 -0
- package/dist/utils/transform/utils/rejectSwaggerDocuments.js +8 -0
- package/dist/utils/validate.d.ts +1 -1
- package/dist/utils/validate.js +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @scalar/openapi-parser
|
|
2
2
|
|
|
3
|
+
## 0.9.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 6fef2f3: feat(openapi-parser): support `onDereference` option on `dereference`
|
|
8
|
+
|
|
9
|
+
## 0.8.10
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 98e9cb2: feat: new `sanitize` utility to make documents OpenAPI-compliant
|
|
14
|
+
|
|
3
15
|
## 0.8.9
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -63,7 +63,21 @@ const specification = `{
|
|
|
63
63
|
const { schema, errors } = await dereference(specification)
|
|
64
64
|
```
|
|
65
65
|
|
|
66
|
-
###
|
|
66
|
+
### Track references
|
|
67
|
+
|
|
68
|
+
The `dereference` function accepts an `onDereference` callback option that gets called whenever a reference is resolved. This can be useful for tracking which schemas are being dereferenced:
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
import { dereference } from '@scalar/openapi-parser'
|
|
72
|
+
|
|
73
|
+
const { schema, errors } = await dereference(specification, {
|
|
74
|
+
onDereference: ({ schema, ref }) => {
|
|
75
|
+
//
|
|
76
|
+
},
|
|
77
|
+
})
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Modify an OpenAPI document
|
|
67
81
|
|
|
68
82
|
```ts
|
|
69
83
|
import { filter } from '@scalar/openapi-parser'
|
|
@@ -80,9 +94,9 @@ const specification = `{
|
|
|
80
94
|
const { specification } = filter(specification, (schema) => !schema?.['x-internal'])
|
|
81
95
|
```
|
|
82
96
|
|
|
83
|
-
### Upgrade your OpenAPI
|
|
97
|
+
### Upgrade your OpenAPI document
|
|
84
98
|
|
|
85
|
-
There’s an `upgrade` command to upgrade all your OpenAPI
|
|
99
|
+
There’s an `upgrade` command to upgrade all your OpenAPI documents to the latest OpenAPI version.
|
|
86
100
|
|
|
87
101
|
> ⚠️ The upgrade from Swagger 2.0 is still experimental and probably lacks features.
|
|
88
102
|
|
|
@@ -102,6 +116,29 @@ console.log(specification.openapi)
|
|
|
102
116
|
// Output: 3.1.0
|
|
103
117
|
```
|
|
104
118
|
|
|
119
|
+
### Sanitize your OpenAPI document
|
|
120
|
+
|
|
121
|
+
The `sanitize()` utility helps ensure your OpenAPI document is valid and complete.
|
|
122
|
+
It automatically adds any missing required properties like the OpenAPI version and info object, collects operation tags
|
|
123
|
+
and adds them to the global tags array and normalizes security scheme types.
|
|
124
|
+
|
|
125
|
+
This makes your document as OpenAPI-compliant as possible with minimal effort, handling many common specification
|
|
126
|
+
requirements automatically.
|
|
127
|
+
|
|
128
|
+
> ⚠️ This doesn’t support Swagger 2.0 documents.
|
|
129
|
+
|
|
130
|
+
```ts
|
|
131
|
+
import { sanitize } from '@scalar/openapi-parser'
|
|
132
|
+
|
|
133
|
+
const result = sanitize({
|
|
134
|
+
info: {
|
|
135
|
+
title: 'Hello World',
|
|
136
|
+
},
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
console.log(result)
|
|
140
|
+
```
|
|
141
|
+
|
|
105
142
|
### Pipeline syntax
|
|
106
143
|
|
|
107
144
|
```ts
|
package/dist/index.js
CHANGED
|
@@ -24,3 +24,6 @@ export { upgrade } from './utils/upgrade.js';
|
|
|
24
24
|
export { isSchemaPath, upgradeFromThreeToThreeOne } from './utils/upgradeFromThreeToThreeOne.js';
|
|
25
25
|
export { upgradeFromTwoToThree } from './utils/upgradeFromTwoToThree.js';
|
|
26
26
|
export { validate } from './utils/validate.js';
|
|
27
|
+
export { DEFAULT_OPENAPI_VERSION } from './utils/transform/utils/addLatestOpenApiVersion.js';
|
|
28
|
+
export { DEFAULT_TITLE, DEFAULT_VERSION } from './utils/transform/utils/addInfoObject.js';
|
|
29
|
+
export { sanitize } from './utils/transform/sanitize.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAEpD,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type { AnyApiDefinitionFormat, DereferenceResult, Filesystem
|
|
2
|
-
|
|
1
|
+
import type { AnyApiDefinitionFormat, DereferenceResult, Filesystem } from '../types';
|
|
2
|
+
import { type ResolveReferencesOptions } from './resolveReferences.js';
|
|
3
|
+
export type DereferenceOptions = ResolveReferencesOptions;
|
|
3
4
|
/**
|
|
4
|
-
*
|
|
5
|
+
* Resolves all references in an OpenAPI document
|
|
5
6
|
*/
|
|
6
7
|
export declare function dereference(value: AnyApiDefinitionFormat | Filesystem, options?: DereferenceOptions): Promise<DereferenceResult>;
|
|
7
8
|
//# sourceMappingURL=dereference.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dereference.d.ts","sourceRoot":"","sources":["../../src/utils/dereference.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,
|
|
1
|
+
{"version":3,"file":"dereference.d.ts","sourceRoot":"","sources":["../../src/utils/dereference.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,iBAAiB,EACjB,UAAU,EACX,MAAM,UAAU,CAAA;AAIjB,OAAO,EACL,KAAK,wBAAwB,EAE9B,MAAM,qBAAqB,CAAA;AAE5B,MAAM,MAAM,kBAAkB,GAAG,wBAAwB,CAAA;AAEzD;;GAEG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,sBAAsB,GAAG,UAAU,EAC1C,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CAY5B"}
|
|
@@ -4,7 +4,7 @@ import { makeFilesystem } from './makeFilesystem.js';
|
|
|
4
4
|
import { resolveReferences } from './resolveReferences.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* Resolves all references in an OpenAPI document
|
|
8
8
|
*/
|
|
9
9
|
async function dereference(value, options) {
|
|
10
10
|
const filesystem = makeFilesystem(value);
|
package/dist/utils/details.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { AnyObject, DetailsResult } from '../types';
|
|
2
2
|
/**
|
|
3
|
-
* Get versions of the OpenAPI
|
|
3
|
+
* Get versions of the OpenAPI document.
|
|
4
4
|
*/
|
|
5
5
|
export declare function details(specification: AnyObject): DetailsResult;
|
|
6
6
|
//# sourceMappingURL=details.d.ts.map
|
package/dist/utils/details.js
CHANGED
package/dist/utils/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,WAAW,CAAA;AACzB,cAAc,qBAAqB,CAAA;AACnC,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,QAAQ,CAAA;AACtB,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,qBAAqB,CAAA;AACnC,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA;AAC1B,cAAc,uBAAuB,CAAA;AACrC,cAAc,WAAW,CAAA;AACzB,cAAc,8BAA8B,CAAA;AAC5C,cAAc,yBAAyB,CAAA;AACvC,cAAc,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,WAAW,CAAA;AACzB,cAAc,qBAAqB,CAAA;AACnC,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,QAAQ,CAAA;AACtB,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,qBAAqB,CAAA;AACnC,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA;AAC1B,cAAc,uBAAuB,CAAA;AACrC,cAAc,WAAW,CAAA;AACzB,cAAc,8BAA8B,CAAA;AAC5C,cAAc,yBAAyB,CAAA;AACvC,cAAc,YAAY,CAAA;AAC1B,cAAc,aAAa,CAAA"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { AnyObject, Filesystem } from '../types';
|
|
2
2
|
/**
|
|
3
|
-
* Normalize the OpenAPI
|
|
4
|
-
*
|
|
3
|
+
* Normalize the OpenAPI document (YAML, JSON, object) to a JavaScript object.
|
|
4
|
+
*
|
|
5
|
+
* Doesn’t modify the object if it’s a `Filesystem` (multiple files) already.
|
|
5
6
|
*/
|
|
6
7
|
export declare function normalize(specification: string | AnyObject | Filesystem): AnyObject | Filesystem;
|
|
7
8
|
//# sourceMappingURL=normalize.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAGrD
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAGrD;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAC7C,SAAS,GAAG,UAAU,CAgBxB"}
|
package/dist/utils/normalize.js
CHANGED
|
@@ -2,8 +2,9 @@ import { parse } from 'yaml';
|
|
|
2
2
|
import { isFilesystem } from './isFilesystem.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* Normalize the OpenAPI
|
|
6
|
-
*
|
|
5
|
+
* Normalize the OpenAPI document (YAML, JSON, object) to a JavaScript object.
|
|
6
|
+
*
|
|
7
|
+
* Doesn’t modify the object if it’s a `Filesystem` (multiple files) already.
|
|
7
8
|
*/
|
|
8
9
|
function normalize(specification) {
|
|
9
10
|
if (isFilesystem(specification)) {
|
|
@@ -5,8 +5,14 @@ export type ResolveReferencesResult = {
|
|
|
5
5
|
errors: ErrorObject[];
|
|
6
6
|
schema: OpenAPI.Document;
|
|
7
7
|
};
|
|
8
|
+
export type ResolveReferencesOptions = ThrowOnErrorOption & {
|
|
9
|
+
onDereference?: (data: {
|
|
10
|
+
schema: AnyObject;
|
|
11
|
+
ref: string;
|
|
12
|
+
}) => void;
|
|
13
|
+
};
|
|
8
14
|
/**
|
|
9
15
|
* Takes a specification and resolves all references.
|
|
10
16
|
*/
|
|
11
|
-
export declare function resolveReferences(input: AnyObject | Filesystem, options?:
|
|
17
|
+
export declare function resolveReferences(input: AnyObject | Filesystem, options?: ResolveReferencesOptions, file?: FilesystemEntry, errors?: ErrorObject[]): ResolveReferencesResult;
|
|
12
18
|
//# sourceMappingURL=resolveReferences.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolveReferences.d.ts","sourceRoot":"","sources":["../../src/utils/resolveReferences.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAGpD,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,eAAe,EACf,kBAAkB,EACnB,MAAM,UAAU,CAAA;AAejB,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAA;CACzB,CAAA;AAOD;;GAEG;AACH,wBAAgB,iBAAiB,CAE/B,KAAK,EAAE,SAAS,GAAG,UAAU,EAE7B,OAAO,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"resolveReferences.d.ts","sourceRoot":"","sources":["../../src/utils/resolveReferences.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAGpD,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,eAAe,EACf,kBAAkB,EACnB,MAAM,UAAU,CAAA;AAejB,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG,kBAAkB,GAAG;IAC1D,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,SAAS,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;CACnE,CAAA;AAOD;;GAEG;AACH,wBAAgB,iBAAiB,CAE/B,KAAK,EAAE,SAAS,GAAG,UAAU,EAE7B,OAAO,CAAC,EAAE,wBAAwB,EAElC,IAAI,CAAC,EAAE,eAAe,EAEtB,MAAM,CAAC,EAAE,WAAW,EAAE,GACrB,uBAAuB,CAoGzB"}
|
|
@@ -26,10 +26,10 @@ errors) {
|
|
|
26
26
|
// Get the main file
|
|
27
27
|
const entrypoint = getEntrypoint(filesystem);
|
|
28
28
|
// Recursively resolve all references
|
|
29
|
-
resolve(file?.specification ?? entrypoint.specification, filesystem, file ?? entrypoint);
|
|
29
|
+
resolve(file?.specification ?? entrypoint.specification, filesystem, file ?? entrypoint, options?.onDereference);
|
|
30
30
|
// If we replace references with content, that includes a reference, we can’t deal with that right-away.
|
|
31
31
|
// That’s why we need a second run.
|
|
32
|
-
resolve(file?.specification ?? entrypoint.specification, filesystem, file ?? entrypoint);
|
|
32
|
+
resolve(file?.specification ?? entrypoint.specification, filesystem, file ?? entrypoint, options?.onDereference);
|
|
33
33
|
// Remove duplicats (according to message) from errors
|
|
34
34
|
errors = errors.filter((error, index, self) => index ===
|
|
35
35
|
self.findIndex((t) => t.message === error.message && t.code === error.code));
|
|
@@ -43,7 +43,7 @@ errors) {
|
|
|
43
43
|
/**
|
|
44
44
|
* Resolves the circular reference to an object and deletes the $ref properties.
|
|
45
45
|
*/
|
|
46
|
-
function resolve(schema, resolveFilesystem, resolveFile) {
|
|
46
|
+
function resolve(schema, resolveFilesystem, resolveFile, onResolve) {
|
|
47
47
|
let result;
|
|
48
48
|
// Iterate over the whole objecct
|
|
49
49
|
Object.entries(schema ?? {}).forEach(([_, value]) => {
|
|
@@ -54,6 +54,7 @@ errors) {
|
|
|
54
54
|
if (target === undefined) {
|
|
55
55
|
return undefined;
|
|
56
56
|
}
|
|
57
|
+
onResolve?.({ schema, ref: schema.$ref });
|
|
57
58
|
// Get rid of the reference
|
|
58
59
|
delete schema.$ref;
|
|
59
60
|
if (typeof target === 'object') {
|
|
@@ -65,7 +66,7 @@ errors) {
|
|
|
65
66
|
}
|
|
66
67
|
}
|
|
67
68
|
if (typeof value === 'object' && !isCircular(value)) {
|
|
68
|
-
result = resolve(value, resolveFilesystem, resolveFile);
|
|
69
|
+
result = resolve(value, resolveFilesystem, resolveFile, onResolve);
|
|
69
70
|
}
|
|
70
71
|
});
|
|
71
72
|
return {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/transform/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { OpenAPI } from '@scalar/openapi-types';
|
|
2
|
+
import type { AnyObject } from '../../types';
|
|
3
|
+
export { DEFAULT_OPENAPI_VERSION } from './utils/addLatestOpenApiVersion.js';
|
|
4
|
+
export { DEFAULT_TITLE, DEFAULT_VERSION } from './utils/addInfoObject.js';
|
|
5
|
+
/**
|
|
6
|
+
* Make an OpenAPI document a valid and clean OpenAPI document
|
|
7
|
+
*/
|
|
8
|
+
export declare function sanitize(definition: AnyObject): OpenAPI.Document;
|
|
9
|
+
//# sourceMappingURL=sanitize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../../src/utils/transform/sanitize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAEpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAO5C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AACzE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEtE;;GAEG;AACH,wBAAgB,QAAQ,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,CAUhE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { addInfoObject } from './utils/addInfoObject.js';
|
|
2
|
+
export { DEFAULT_TITLE, DEFAULT_VERSION } from './utils/addInfoObject.js';
|
|
3
|
+
import { addLatestOpenApiVersion } from './utils/addLatestOpenApiVersion.js';
|
|
4
|
+
export { DEFAULT_OPENAPI_VERSION } from './utils/addLatestOpenApiVersion.js';
|
|
5
|
+
import { addMissingTags } from './utils/addMissingTags.js';
|
|
6
|
+
import { normalizeSecuritySchemes } from './utils/normalizeSecuritySchemes.js';
|
|
7
|
+
import { rejectSwaggerDocuments } from './utils/rejectSwaggerDocuments.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Make an OpenAPI document a valid and clean OpenAPI document
|
|
11
|
+
*/
|
|
12
|
+
function sanitize(definition) {
|
|
13
|
+
const transformers = [
|
|
14
|
+
rejectSwaggerDocuments,
|
|
15
|
+
addLatestOpenApiVersion,
|
|
16
|
+
addInfoObject,
|
|
17
|
+
addMissingTags,
|
|
18
|
+
normalizeSecuritySchemes,
|
|
19
|
+
];
|
|
20
|
+
return transformers.reduce((doc, transformer) => transformer(doc), definition);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { sanitize };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AnyObject } from '../../../types';
|
|
2
|
+
export declare const DEFAULT_TITLE = "API";
|
|
3
|
+
export declare const DEFAULT_VERSION = "1.0";
|
|
4
|
+
export declare const addInfoObject: (definition: AnyObject) => {
|
|
5
|
+
info: any;
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=addInfoObject.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addInfoObject.d.ts","sourceRoot":"","sources":["../../../../src/utils/transform/utils/addInfoObject.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,eAAO,MAAM,aAAa,QAAQ,CAAA;AAClC,eAAO,MAAM,eAAe,QAAQ,CAAA;AAEpC,eAAO,MAAM,aAAa,eAAgB,SAAS;;CAOjD,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
const DEFAULT_TITLE = 'API';
|
|
2
|
+
const DEFAULT_VERSION = '1.0';
|
|
3
|
+
const addInfoObject = (definition) => ({
|
|
4
|
+
...definition,
|
|
5
|
+
info: {
|
|
6
|
+
...definition.info,
|
|
7
|
+
title: definition.info?.title ?? DEFAULT_TITLE,
|
|
8
|
+
version: definition.info?.version ?? DEFAULT_VERSION,
|
|
9
|
+
},
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
export { DEFAULT_TITLE, DEFAULT_VERSION, addInfoObject };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addLatestOpenApiVersion.d.ts","sourceRoot":"","sources":["../../../../src/utils/transform/utils/addLatestOpenApiVersion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,eAAO,MAAM,uBAAuB,UAAU,CAAA;AAE9C,eAAO,MAAM,uBAAuB,eAAgB,SAAS;;CAG3D,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addMissingTags.d.ts","sourceRoot":"","sources":["../../../../src/utils/transform/utils/addMissingTags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,eAAO,MAAM,cAAc,eAAgB,SAAS,cA8CnD,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
const addMissingTags = (definition) => {
|
|
2
|
+
if (!definition.paths) {
|
|
3
|
+
return definition;
|
|
4
|
+
}
|
|
5
|
+
// Collect all unique tags used in operations
|
|
6
|
+
const usedTags = new Set();
|
|
7
|
+
for (const path of Object.values(definition.paths)) {
|
|
8
|
+
if (typeof path === 'object' && path !== null) {
|
|
9
|
+
for (const operation of Object.values(path)) {
|
|
10
|
+
if (typeof operation === 'object' &&
|
|
11
|
+
operation !== null &&
|
|
12
|
+
'tags' in operation) {
|
|
13
|
+
const tags = operation.tags;
|
|
14
|
+
if (Array.isArray(tags)) {
|
|
15
|
+
tags.forEach((tag) => usedTags.add(String(tag)));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
// Convert tags to array of tag objects if not already present
|
|
22
|
+
const existingTags = new Set((Array.isArray(definition.tags) ? definition.tags : [])
|
|
23
|
+
.map((tag) => typeof tag === 'object' && tag !== null ? String(tag.name) : null)
|
|
24
|
+
.filter(Boolean));
|
|
25
|
+
// Add missing tags
|
|
26
|
+
const missingTags = [...usedTags]
|
|
27
|
+
.filter((tag) => !existingTags.has(tag))
|
|
28
|
+
.map((name) => ({ name }));
|
|
29
|
+
return {
|
|
30
|
+
...definition,
|
|
31
|
+
tags: [
|
|
32
|
+
...(Array.isArray(definition.tags) ? definition.tags : []),
|
|
33
|
+
...missingTags,
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export { addMissingTags };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeSecuritySchemes.d.ts","sourceRoot":"","sources":["../../../../src/utils/transform/utils/normalizeSecuritySchemes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,eAAO,MAAM,wBAAwB,eAAgB,SAAS,cAsD7D,CAAA"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const normalizeSecuritySchemes = (definition) => {
|
|
2
|
+
if (!definition.components?.securitySchemes) {
|
|
3
|
+
return definition;
|
|
4
|
+
}
|
|
5
|
+
const securitySchemes = { ...definition.components.securitySchemes };
|
|
6
|
+
for (const scheme of Object.values(securitySchemes)) {
|
|
7
|
+
if (typeof scheme === 'object' && scheme !== null && 'type' in scheme) {
|
|
8
|
+
const type = String(scheme.type).toLowerCase();
|
|
9
|
+
scheme.type =
|
|
10
|
+
{
|
|
11
|
+
apikey: 'apiKey',
|
|
12
|
+
oauth2: 'oauth2',
|
|
13
|
+
http: 'http',
|
|
14
|
+
mutualtls: 'mutualTLS',
|
|
15
|
+
openidconnect: 'openIdConnect',
|
|
16
|
+
}[type] ?? type;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
// Convert array scopes to objects
|
|
20
|
+
for (const scheme of Object.values(securitySchemes)) {
|
|
21
|
+
if (typeof scheme === 'object' &&
|
|
22
|
+
scheme !== null &&
|
|
23
|
+
'type' in scheme &&
|
|
24
|
+
scheme.type === 'oauth2' &&
|
|
25
|
+
'flows' in scheme) {
|
|
26
|
+
const flows = scheme.flows;
|
|
27
|
+
for (const flow of Object.values(flows)) {
|
|
28
|
+
if (typeof flow === 'object' &&
|
|
29
|
+
flow !== null &&
|
|
30
|
+
'scopes' in flow &&
|
|
31
|
+
Array.isArray(flow.scopes)) {
|
|
32
|
+
flow.scopes = flow.scopes.reduce((acc, scope) => {
|
|
33
|
+
acc[scope] = '';
|
|
34
|
+
return acc;
|
|
35
|
+
}, {});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
...definition,
|
|
42
|
+
components: {
|
|
43
|
+
...definition.components,
|
|
44
|
+
securitySchemes,
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export { normalizeSecuritySchemes };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rejectSwaggerDocuments.d.ts","sourceRoot":"","sources":["../../../../src/utils/transform/utils/rejectSwaggerDocuments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,eAAO,MAAM,sBAAsB,cAAe,SAAS,cAQ1D,CAAA"}
|
package/dist/utils/validate.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { AnyObject, Filesystem, ThrowOnErrorOption, ValidateResult } from '../types';
|
|
2
2
|
export type ValidateOptions = ThrowOnErrorOption;
|
|
3
3
|
/**
|
|
4
|
-
* Validates an OpenAPI
|
|
4
|
+
* Validates an OpenAPI document
|
|
5
5
|
*/
|
|
6
6
|
export declare function validate(value: string | AnyObject | Filesystem, options?: ValidateOptions): Promise<ValidateResult>;
|
|
7
7
|
//# sourceMappingURL=validate.d.ts.map
|
package/dist/utils/validate.js
CHANGED
|
@@ -2,7 +2,7 @@ import { makeFilesystem } from './makeFilesystem.js';
|
|
|
2
2
|
import { Validator } from '../lib/Validator/Validator.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
* Validates an OpenAPI
|
|
5
|
+
* Validates an OpenAPI document
|
|
6
6
|
*/
|
|
7
7
|
async function validate(value, options) {
|
|
8
8
|
const filesystem = makeFilesystem(value);
|
package/package.json
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"parser",
|
|
18
18
|
"typescript"
|
|
19
19
|
],
|
|
20
|
-
"version": "0.
|
|
20
|
+
"version": "0.9.0",
|
|
21
21
|
"engines": {
|
|
22
22
|
"node": ">=18"
|
|
23
23
|
},
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
"json-to-ast": "^2.1.0",
|
|
65
65
|
"just-diff": "^6.0.2",
|
|
66
66
|
"tinybench": "^2.8.0",
|
|
67
|
-
"@scalar/build-tooling": "0.1.
|
|
67
|
+
"@scalar/build-tooling": "0.1.12",
|
|
68
68
|
"@scalar/openapi-types": "0.1.5"
|
|
69
69
|
},
|
|
70
70
|
"scripts": {
|