@scalar/openapi-parser 0.8.8 → 0.8.10

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 (40) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +26 -3
  3. package/dist/index.js +3 -0
  4. package/dist/types/index.d.ts.map +1 -1
  5. package/dist/utils/dereference.d.ts +1 -1
  6. package/dist/utils/dereference.d.ts.map +1 -1
  7. package/dist/utils/dereference.js +1 -1
  8. package/dist/utils/details.d.ts +1 -1
  9. package/dist/utils/details.js +1 -1
  10. package/dist/utils/index.d.ts +1 -0
  11. package/dist/utils/index.d.ts.map +1 -1
  12. package/dist/utils/normalize.d.ts +3 -2
  13. package/dist/utils/normalize.d.ts.map +1 -1
  14. package/dist/utils/normalize.js +3 -2
  15. package/dist/utils/transform/index.d.ts +2 -0
  16. package/dist/utils/transform/index.d.ts.map +1 -0
  17. package/dist/utils/transform/sanitize.d.ts +9 -0
  18. package/dist/utils/transform/sanitize.d.ts.map +1 -0
  19. package/dist/utils/transform/sanitize.js +23 -0
  20. package/dist/utils/transform/utils/addInfoObject.d.ts +7 -0
  21. package/dist/utils/transform/utils/addInfoObject.d.ts.map +1 -0
  22. package/dist/utils/transform/utils/addInfoObject.js +12 -0
  23. package/dist/utils/transform/utils/addLatestOpenApiVersion.d.ts +6 -0
  24. package/dist/utils/transform/utils/addLatestOpenApiVersion.d.ts.map +1 -0
  25. package/dist/utils/transform/utils/addLatestOpenApiVersion.js +7 -0
  26. package/dist/utils/transform/utils/addMissingTags.d.ts +3 -0
  27. package/dist/utils/transform/utils/addMissingTags.d.ts.map +1 -0
  28. package/dist/utils/transform/utils/addMissingTags.js +38 -0
  29. package/dist/utils/transform/utils/normalizeSecuritySchemes.d.ts +3 -0
  30. package/dist/utils/transform/utils/normalizeSecuritySchemes.d.ts.map +1 -0
  31. package/dist/utils/transform/utils/normalizeSecuritySchemes.js +49 -0
  32. package/dist/utils/transform/utils/rejectSwaggerDocuments.d.ts +3 -0
  33. package/dist/utils/transform/utils/rejectSwaggerDocuments.d.ts.map +1 -0
  34. package/dist/utils/transform/utils/rejectSwaggerDocuments.js +8 -0
  35. package/dist/utils/upgradeFromThreeToThreeOne.d.ts.map +1 -1
  36. package/dist/utils/upgradeFromThreeToThreeOne.js +4 -2
  37. package/dist/utils/upgradeFromTwoToThree.js +1 -1
  38. package/dist/utils/validate.d.ts +1 -1
  39. package/dist/utils/validate.js +1 -1
  40. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @scalar/openapi-parser
2
2
 
3
+ ## 0.8.10
4
+
5
+ ### Patch Changes
6
+
7
+ - 98e9cb2: feat: new `sanitize` utility to make documents OpenAPI-compliant
8
+
9
+ ## 0.8.9
10
+
11
+ ### Patch Changes
12
+
13
+ - 757fade: fix: when migrating example to example objects, the example should be inside the value attribute
14
+ - a607115: feat: add openapi 3.0.4 and openapi 3.1.1
15
+
3
16
  ## 0.8.8
4
17
 
5
18
  ### Patch Changes
package/README.md CHANGED
@@ -63,7 +63,7 @@ const specification = `{
63
63
  const { schema, errors } = await dereference(specification)
64
64
  ```
65
65
 
66
- ### Modify an OpenAPI specification
66
+ ### Modify an OpenAPI document
67
67
 
68
68
  ```ts
69
69
  import { filter } from '@scalar/openapi-parser'
@@ -80,9 +80,9 @@ const specification = `{
80
80
  const { specification } = filter(specification, (schema) => !schema?.['x-internal'])
81
81
  ```
82
82
 
83
- ### Upgrade your OpenAPI specification
83
+ ### Upgrade your OpenAPI document
84
84
 
85
- There’s an `upgrade` command to upgrade all your OpenAPI specifications to the latest OpenAPI version.
85
+ There’s an `upgrade` command to upgrade all your OpenAPI documents to the latest OpenAPI version.
86
86
 
87
87
  > ⚠️ The upgrade from Swagger 2.0 is still experimental and probably lacks features.
88
88
 
@@ -102,6 +102,29 @@ console.log(specification.openapi)
102
102
  // Output: 3.1.0
103
103
  ```
104
104
 
105
+ ### Sanitize your OpenAPI document
106
+
107
+ The `sanitize()` utility helps ensure your OpenAPI document is valid and complete.
108
+ It automatically adds any missing required properties like the OpenAPI version and info object, collects operation tags
109
+ and adds them to the global tags array and normalizes security scheme types.
110
+
111
+ This makes your document as OpenAPI-compliant as possible with minimal effort, handling many common specification
112
+ requirements automatically.
113
+
114
+ > ⚠️ This doesn’t support Swagger 2.0 documents.
115
+
116
+ ```ts
117
+ import { sanitize } from '@scalar/openapi-parser'
118
+
119
+ const result = sanitize({
120
+ info: {
121
+ title: 'Hello World',
122
+ },
123
+ })
124
+
125
+ console.log(result)
126
+ ```
127
+
105
128
  ### Pipeline syntax
106
129
 
107
130
  ```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":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type { AnyApiDefinitionFormat, DereferenceResult, Filesystem, ThrowOnErrorOption } from '../types';
2
2
  export type DereferenceOptions = ThrowOnErrorOption;
3
3
  /**
4
- * Validates an OpenAPI schema and resolves all references.
4
+ * Resolves all references in an OpenAPI document
5
5
  */
6
6
  export declare function dereference(value: AnyApiDefinitionFormat | Filesystem, options?: DereferenceOptions): Promise<DereferenceResult>;
7
7
  //# 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,EAEtB,iBAAiB,EACjB,UAAU,EACV,kBAAkB,EACnB,MAAM,UAAU,CAAA;AAMjB,MAAM,MAAM,kBAAkB,GAAG,kBAAkB,CAAA;AAEnD;;GAEG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,sBAAsB,GAAG,UAAU,EAC1C,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,iBAAiB,CAAC,CAY5B"}
1
+ {"version":3,"file":"dereference.d.ts","sourceRoot":"","sources":["../../src/utils/dereference.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,iBAAiB,EACjB,UAAU,EACV,kBAAkB,EACnB,MAAM,UAAU,CAAA;AAMjB,MAAM,MAAM,kBAAkB,GAAG,kBAAkB,CAAA;AAEnD;;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
- * Validates an OpenAPI schema and resolves all references.
7
+ * Resolves all references in an OpenAPI document
8
8
  */
9
9
  async function dereference(value, options) {
10
10
  const filesystem = makeFilesystem(value);
@@ -1,6 +1,6 @@
1
1
  import type { AnyObject, DetailsResult } from '../types';
2
2
  /**
3
- * Get versions of the OpenAPI specification.
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
@@ -1,7 +1,7 @@
1
1
  import { OpenApiVersions } from '../configuration/index.js';
2
2
 
3
3
  /**
4
- * Get versions of the OpenAPI specification.
4
+ * Get versions of the OpenAPI document.
5
5
  */
6
6
  function details(specification) {
7
7
  for (const version of new Set(OpenApiVersions)) {
@@ -23,4 +23,5 @@ export * from './upgrade.js';
23
23
  export * from './upgradeFromThreeToThreeOne.js';
24
24
  export * from './upgradeFromTwoToThree.js';
25
25
  export * from './validate.js';
26
+ export * from './transform';
26
27
  //# sourceMappingURL=index.d.ts.map
@@ -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 specification to a JavaScript object.
4
- * Don’t touch the object if it’s a `Filesystem` (multiple files).
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;;;GAGG;AACH,wBAAgB,SAAS,CACvB,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,GAC7C,SAAS,GAAG,UAAU,CAgBxB"}
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"}
@@ -2,8 +2,9 @@ import { parse } from 'yaml';
2
2
  import { isFilesystem } from './isFilesystem.js';
3
3
 
4
4
  /**
5
- * Normalize the OpenAPI specification to a JavaScript object.
6
- * Don’t touch the object if it’s a `Filesystem` (multiple files).
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)) {
@@ -0,0 +1,2 @@
1
+ export * from './sanitize.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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,6 @@
1
+ import type { AnyObject } from '../../../types';
2
+ export declare const DEFAULT_OPENAPI_VERSION = "3.1.1";
3
+ export declare const addLatestOpenApiVersion: (definition: AnyObject) => {
4
+ openapi: any;
5
+ };
6
+ //# sourceMappingURL=addLatestOpenApiVersion.d.ts.map
@@ -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,7 @@
1
+ const DEFAULT_OPENAPI_VERSION = '3.1.1';
2
+ const addLatestOpenApiVersion = (definition) => ({
3
+ openapi: definition.openapi ?? DEFAULT_OPENAPI_VERSION,
4
+ ...definition,
5
+ });
6
+
7
+ export { DEFAULT_OPENAPI_VERSION, addLatestOpenApiVersion };
@@ -0,0 +1,3 @@
1
+ import type { AnyObject } from '../../../types';
2
+ export declare const addMissingTags: (definition: AnyObject) => AnyObject;
3
+ //# sourceMappingURL=addMissingTags.d.ts.map
@@ -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,3 @@
1
+ import type { AnyObject } from '../../../types';
2
+ export declare const normalizeSecuritySchemes: (definition: AnyObject) => AnyObject;
3
+ //# sourceMappingURL=normalizeSecuritySchemes.d.ts.map
@@ -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,3 @@
1
+ import type { AnyObject } from '../../../types';
2
+ export declare const rejectSwaggerDocuments: (defintion: AnyObject) => AnyObject;
3
+ //# sourceMappingURL=rejectSwaggerDocuments.d.ts.map
@@ -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"}
@@ -0,0 +1,8 @@
1
+ const rejectSwaggerDocuments = (defintion) => {
2
+ if ('swagger' in defintion) {
3
+ throw new Error('Swagger 2.0 documents are not supported. Please upgrade to OpenAPI 3.x.');
4
+ }
5
+ return defintion;
6
+ };
7
+
8
+ export { rejectSwaggerDocuments };
@@ -1 +1 @@
1
- {"version":3,"file":"upgradeFromThreeToThreeOne.d.ts","sourceRoot":"","sources":["../../src/utils/upgradeFromThreeToThreeOne.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAGzC;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,qBAAqB,EAAE,SAAS,aA2G1E;AAED,uDAAuD;AACvD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAsBpD"}
1
+ {"version":3,"file":"upgradeFromThreeToThreeOne.d.ts","sourceRoot":"","sources":["../../src/utils/upgradeFromThreeToThreeOne.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAGzC;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,qBAAqB,EAAE,SAAS,aA6G1E;AAED,uDAAuD;AACvD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAsBpD"}
@@ -9,7 +9,7 @@ function upgradeFromThreeToThreeOne(originalSpecification) {
9
9
  let specification = originalSpecification;
10
10
  // Version
11
11
  if (specification.openapi?.startsWith('3.0')) {
12
- specification.openapi = '3.1.0';
12
+ specification.openapi = '3.1.1';
13
13
  }
14
14
  else {
15
15
  // Skip if it’s something else than 3.0.x
@@ -51,7 +51,9 @@ function upgradeFromThreeToThreeOne(originalSpecification) {
51
51
  // Objects everywhere else
52
52
  else {
53
53
  schema.examples = {
54
- default: schema.example,
54
+ default: {
55
+ value: schema.example,
56
+ },
55
57
  };
56
58
  }
57
59
  delete schema.example;
@@ -8,7 +8,7 @@ import { traverse } from './traverse.js';
8
8
  function upgradeFromTwoToThree(specification) {
9
9
  // Version
10
10
  if (specification.swagger?.startsWith('2.0')) {
11
- specification.openapi = '3.0.3';
11
+ specification.openapi = '3.0.4';
12
12
  delete specification.swagger;
13
13
  }
14
14
  else {
@@ -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 schema.
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
@@ -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 schema.
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.8.8",
20
+ "version": "0.8.10",
21
21
  "engines": {
22
22
  "node": ">=18"
23
23
  },
@@ -64,8 +64,8 @@
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.11",
68
- "@scalar/openapi-types": "0.1.4"
67
+ "@scalar/build-tooling": "0.1.12",
68
+ "@scalar/openapi-types": "0.1.5"
69
69
  },
70
70
  "scripts": {
71
71
  "build": "scalar-build-rollup",