@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.
Files changed (40) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +40 -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 +4 -3
  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/resolveReferences.d.ts +7 -1
  16. package/dist/utils/resolveReferences.d.ts.map +1 -1
  17. package/dist/utils/resolveReferences.js +5 -4
  18. package/dist/utils/transform/index.d.ts +2 -0
  19. package/dist/utils/transform/index.d.ts.map +1 -0
  20. package/dist/utils/transform/sanitize.d.ts +9 -0
  21. package/dist/utils/transform/sanitize.d.ts.map +1 -0
  22. package/dist/utils/transform/sanitize.js +23 -0
  23. package/dist/utils/transform/utils/addInfoObject.d.ts +7 -0
  24. package/dist/utils/transform/utils/addInfoObject.d.ts.map +1 -0
  25. package/dist/utils/transform/utils/addInfoObject.js +12 -0
  26. package/dist/utils/transform/utils/addLatestOpenApiVersion.d.ts +6 -0
  27. package/dist/utils/transform/utils/addLatestOpenApiVersion.d.ts.map +1 -0
  28. package/dist/utils/transform/utils/addLatestOpenApiVersion.js +7 -0
  29. package/dist/utils/transform/utils/addMissingTags.d.ts +3 -0
  30. package/dist/utils/transform/utils/addMissingTags.d.ts.map +1 -0
  31. package/dist/utils/transform/utils/addMissingTags.js +38 -0
  32. package/dist/utils/transform/utils/normalizeSecuritySchemes.d.ts +3 -0
  33. package/dist/utils/transform/utils/normalizeSecuritySchemes.d.ts.map +1 -0
  34. package/dist/utils/transform/utils/normalizeSecuritySchemes.js +49 -0
  35. package/dist/utils/transform/utils/rejectSwaggerDocuments.d.ts +3 -0
  36. package/dist/utils/transform/utils/rejectSwaggerDocuments.d.ts.map +1 -0
  37. package/dist/utils/transform/utils/rejectSwaggerDocuments.js +8 -0
  38. package/dist/utils/validate.d.ts +1 -1
  39. package/dist/utils/validate.js +1 -1
  40. 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
- ### Modify an OpenAPI specification
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 specification
97
+ ### Upgrade your OpenAPI document
84
98
 
85
- There’s an `upgrade` command to upgrade all your OpenAPI specifications to the latest OpenAPI version.
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;AAE9D;;GAEG;AAEH,MAAM,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;AAE9C,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AAE3C;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,SAAS,CAAA;AAEvD,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,EAAE,UAAU,CAAA;IACtB,aAAa,EAAE,SAAS,CAAA;IACxB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,OAAO,CAAA;IACd,aAAa,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAA;IAChC,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAA;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI;IACzE,aAAa,EAAE,CAAC,CAAA;IAChB,OAAO,EAAE,KAAK,CAAA;CACf,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,aAAa,EAAE,SAAS,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,cAAc,CAAA;IACvB,iBAAiB,EAAE,MAAM,CAAA;IACzB,oBAAoB,EAAE,MAAM,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAA;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAA;IACzB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,OAAO,MAAM,GAAG,MAAM,CAAA;CACpC,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,CAAC,EAAE,OAAO,GAAG,KAAK,CAAA;CACzB,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,eAAe,EAAE,CAAA;AAE1C;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,YAAY,EAAE,OAAO,CAAA;IACrB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,SAAS,CAAA;CACzB,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,kBAAkB,CAAA;AAE/C,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AAED,OAAO,CAAC,MAAM,CAAC;IACb;;OAEG;IAEH,UAAU,QAAQ;KAAG;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,SAAS,IAAI,EAAE,GAAG,SAAS,IAAI,EAAE,IAAI;IAC/D,oEAAoE;IACpE,KAAK,EAAE,sBAAsB,CAAA;IAC7B,qDAAqD;IACrD,aAAa,EAAE,SAAS,CAAA;IACxB,qBAAqB;IACrB,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,mBAAmB;IACnB,KAAK,EAAE,CAAC,CAAA;CACT,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAA;AAEnD,MAAM,MAAM,uBAAuB,GAAG;IACpC,UAAU,EAAE,UAAU,CAAA;IACtB,aAAa,EAAE,SAAS,CAAA;CACzB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,IAAI,EAAE,IAAI,CAAC,SAAS;IACrD,MAAM,KAAK;IACX,GAAG,MAAM,IAAI;CACd,GACG,KAAK,SAAS,IAAI,GAChB,IAAI,SAAS,IAAI,EAAE,GACjB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,GAC5D,KAAK,GACP,KAAK,GACP,uBAAuB,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, ThrowOnErrorOption } from '../types';
2
- export type DereferenceOptions = ThrowOnErrorOption;
1
+ import type { AnyApiDefinitionFormat, DereferenceResult, Filesystem } from '../types';
2
+ import { type ResolveReferencesOptions } from './resolveReferences.js';
3
+ export type DereferenceOptions = ResolveReferencesOptions;
3
4
  /**
4
- * Validates an OpenAPI schema and resolves all references.
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,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,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
- * 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)) {
@@ -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?: ThrowOnErrorOption, file?: FilesystemEntry, errors?: ErrorObject[]): ResolveReferencesResult;
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,kBAAkB,EAE5B,IAAI,CAAC,EAAE,eAAe,EAEtB,MAAM,CAAC,EAAE,WAAW,EAAE,GACrB,uBAAuB,CA+FzB"}
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,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,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.9",
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.11",
67
+ "@scalar/build-tooling": "0.1.12",
68
68
  "@scalar/openapi-types": "0.1.5"
69
69
  },
70
70
  "scripts": {