oas-normalize 12.0.0 → 13.0.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/LICENSE +1 -3
- package/README.md +26 -20
- package/dist/{chunk-XOS5M44Y.js → chunk-EHNNEPCG.js} +22 -7
- package/dist/chunk-EHNNEPCG.js.map +1 -0
- package/dist/chunk-KGEOPSPH.js +12 -0
- package/dist/chunk-KGEOPSPH.js.map +1 -0
- package/dist/chunk-SI6PKQOL.cjs +12 -0
- package/dist/chunk-SI6PKQOL.cjs.map +1 -0
- package/dist/{chunk-K75HC34M.cjs → chunk-ZTTIELJH.cjs} +21 -6
- package/dist/chunk-ZTTIELJH.cjs.map +1 -0
- package/dist/index.cjs +36 -27
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.js +26 -17
- package/dist/index.js.map +1 -1
- package/dist/lib/errors.cjs +7 -0
- package/dist/lib/errors.cjs.map +1 -0
- package/dist/lib/errors.d.cts +5 -0
- package/dist/lib/errors.d.ts +5 -0
- package/dist/lib/errors.js +7 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/utils.cjs +4 -2
- package/dist/lib/utils.cjs.map +1 -1
- package/dist/lib/utils.d.cts +11 -5
- package/dist/lib/utils.d.ts +11 -5
- package/dist/lib/utils.js +5 -3
- package/package.json +12 -9
- package/dist/chunk-K75HC34M.cjs.map +0 -1
- package/dist/chunk-XOS5M44Y.js.map +0 -1
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -107,7 +107,7 @@ try {
|
|
|
107
107
|
|
|
108
108
|
#### Error Handling
|
|
109
109
|
|
|
110
|
-
All thrown
|
|
110
|
+
All errors will be thrown as a `ValidationError` exception with contextual error messages that direct the user to the line(s) where their errors are present:
|
|
111
111
|
|
|
112
112
|
```
|
|
113
113
|
OpenAPI schema validation failed.
|
|
@@ -123,27 +123,33 @@ REQUIRED must have required property 'url'
|
|
|
123
123
|
12 | ],
|
|
124
124
|
```
|
|
125
125
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
{
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
}
|
|
144
|
-
|
|
126
|
+
If you also wish to treat certain errors as warnings you can do so by supplying your `.validate()` call with a [`@readme/openapi-parser`](https://npm.im/@readme/openapi-parser) ruleset:
|
|
127
|
+
|
|
128
|
+
```ts
|
|
129
|
+
try {
|
|
130
|
+
const result = await oas.validate({
|
|
131
|
+
validate: {
|
|
132
|
+
rules: {
|
|
133
|
+
openapi: {
|
|
134
|
+
'path-parameters-not-in-path': 'warning',
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
if (result.warnings.length) {
|
|
141
|
+
console.warn('🚸 The API is valid but has some warnings.');
|
|
142
|
+
console.warn(result.warnings);
|
|
143
|
+
} else {
|
|
144
|
+
console.log('🍭 The API is valid!');
|
|
145
|
+
}
|
|
146
|
+
} catch (err) {
|
|
147
|
+
console.error(err);
|
|
148
|
+
}
|
|
145
149
|
```
|
|
146
150
|
|
|
151
|
+
For full documentation on the available rulesets, as well as tooling to transform the the `.validate()` responses into a human-readable strings, check out the documentation for [`@readme/openapi-parser`](https://npm.im/@readme/openapi-parser).
|
|
152
|
+
|
|
147
153
|
### `.version()`
|
|
148
154
|
|
|
149
155
|
Load and retrieve version information about a supplied API definition.
|
|
@@ -1,13 +1,27 @@
|
|
|
1
1
|
// src/lib/utils.ts
|
|
2
2
|
import YAML, { JSON_SCHEMA } from "js-yaml";
|
|
3
|
+
import { compileErrors } from "@readme/openapi-parser";
|
|
3
4
|
function isBuffer(obj) {
|
|
4
5
|
return obj != null && obj.constructor != null && typeof obj.constructor.isBuffer === "function" && !!obj.constructor.isBuffer(obj);
|
|
5
6
|
}
|
|
6
|
-
function
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
function prepareURL(url) {
|
|
8
|
+
const options = {};
|
|
9
|
+
const u = new URL(url);
|
|
10
|
+
if (u.username || u.password) {
|
|
11
|
+
options.headers = {
|
|
12
|
+
Authorization: `Basic ${btoa(`${u.username}:${u.password}`)}`
|
|
13
|
+
};
|
|
14
|
+
u.username = "";
|
|
15
|
+
u.password = "";
|
|
9
16
|
}
|
|
10
|
-
|
|
17
|
+
if (u.host === "github.com" && u.pathname.includes("/blob/")) {
|
|
18
|
+
u.host = "raw.githubusercontent.com";
|
|
19
|
+
u.pathname = u.pathname.replace("/blob/", "/");
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
url: u.toString(),
|
|
23
|
+
options
|
|
24
|
+
};
|
|
11
25
|
}
|
|
12
26
|
function getType(obj) {
|
|
13
27
|
if (isBuffer(obj)) {
|
|
@@ -59,13 +73,14 @@ function getAPIDefinitionType(schema) {
|
|
|
59
73
|
|
|
60
74
|
export {
|
|
61
75
|
isBuffer,
|
|
62
|
-
|
|
76
|
+
prepareURL,
|
|
63
77
|
getType,
|
|
64
78
|
isOpenAPI,
|
|
65
79
|
isPostman,
|
|
66
80
|
isSwagger,
|
|
67
81
|
stringToJSON,
|
|
68
82
|
isAPIDefinition,
|
|
69
|
-
getAPIDefinitionType
|
|
83
|
+
getAPIDefinitionType,
|
|
84
|
+
compileErrors
|
|
70
85
|
};
|
|
71
|
-
//# sourceMappingURL=chunk-
|
|
86
|
+
//# sourceMappingURL=chunk-EHNNEPCG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts"],"sourcesContent":["import YAML, { JSON_SCHEMA } from 'js-yaml';\n\nexport { compileErrors } from '@readme/openapi-parser';\n\n/**\n * Determine if a given variable is a `Buffer`.\n *\n */\nexport function isBuffer(obj: any): boolean {\n return (\n obj != null &&\n obj.constructor != null &&\n typeof obj.constructor.isBuffer === 'function' &&\n !!obj.constructor.isBuffer(obj)\n );\n}\n\n/**\n * Deconstruct a URL into a payload for a `fetch` request.\n *\n */\nexport function prepareURL(url: string): { options: RequestInit; url: string } {\n const options: RequestInit = {};\n const u = new URL(url);\n\n // `fetch` doesn't support supplying basic auth credentials in the URL so we need to move them\n // into a header.\n if (u.username || u.password) {\n options.headers = {\n Authorization: `Basic ${btoa(`${u.username}:${u.password}`)}`,\n };\n\n u.username = '';\n u.password = '';\n }\n\n // Transform GitHub sources into their raw content URLs.\n if (u.host === 'github.com' && u.pathname.includes('/blob/')) {\n u.host = 'raw.githubusercontent.com';\n u.pathname = u.pathname.replace('/blob/', '/');\n }\n\n return {\n url: u.toString(),\n options,\n };\n}\n\n/**\n * Determine the type of a given variable. Returns `false` if unrecognized.\n *\n */\nexport function getType(obj: any): 'buffer' | 'json' | 'path' | 'string-json' | 'string-yaml' | 'url' | false {\n if (isBuffer(obj)) {\n return 'buffer';\n } else if (typeof obj === 'object') {\n return 'json';\n } else if (typeof obj === 'string') {\n if (obj.match(/\\s*{/)) {\n return 'string-json';\n } else if (obj.match(/\\n/)) {\n // Not sure about this...\n return 'string-yaml';\n } else if (obj.substring(0, 4) === 'http') {\n return 'url';\n }\n\n return 'path';\n }\n\n return false;\n}\n\n/**\n * Determine if a given schema if an OpenAPI definition.\n *\n */\nexport function isOpenAPI(schema: Record<string, unknown>): boolean {\n return !!schema.openapi;\n}\n\n/**\n * Determine if a given schema is a Postman collection.\n *\n * Unfortunately the Postman schema spec doesn't have anything like `openapi` or `swagger` for us\n * to look at but it does require that `info` and `item` be present and as `item` doesn't exist in\n * OpenAPI or Swagger we can use the combination of those two properties to determine if what we\n * have is a Postman collection.\n *\n * @see {@link https://schema.postman.com/json/collection/v2.0.0/collection.json}\n * @see {@link https://schema.postman.com/json/collection/v2.1.0/collection.json}\n */\nexport function isPostman(schema: Record<string, unknown>): boolean {\n return !!schema.info && !!schema.item;\n}\n\n/**\n * Determine if a given schema if an Swagger definition.\n *\n */\nexport function isSwagger(schema: Record<string, unknown>): boolean {\n return !!schema.swagger;\n}\n\n/**\n * Convert a YAML blob or stringified JSON object into a JSON object.\n *\n */\nexport function stringToJSON(string: Record<string, unknown> | string): Record<string, unknown> {\n if (typeof string === 'object') {\n return string;\n } else if (string.match(/^\\s*{/)) {\n // eslint-disable-next-line try-catch-failsafe/json-parse\n return JSON.parse(string);\n }\n\n return YAML.load(string, { schema: JSON_SCHEMA }) as Record<string, unknown>;\n}\n\n/**\n * Determine if a given schema is an API definition that we can support.\n *\n */\nexport function isAPIDefinition(schema: Record<string, unknown>): boolean {\n return isOpenAPI(schema) || isPostman(schema) || isSwagger(schema);\n}\n\n/**\n * Retrieve the type of API definition that a given schema is.\n *\n */\nexport function getAPIDefinitionType(schema: Record<string, unknown>): 'openapi' | 'postman' | 'swagger' | 'unknown' {\n if (isOpenAPI(schema)) {\n return 'openapi';\n } else if (isPostman(schema)) {\n return 'postman';\n } else if (isSwagger(schema)) {\n return 'swagger';\n }\n\n return 'unknown';\n}\n"],"mappings":";AAAA,OAAO,QAAQ,mBAAmB;AAElC,SAAS,qBAAqB;AAMvB,SAAS,SAAS,KAAmB;AAC1C,SACE,OAAO,QACP,IAAI,eAAe,QACnB,OAAO,IAAI,YAAY,aAAa,cACpC,CAAC,CAAC,IAAI,YAAY,SAAS,GAAG;AAElC;AAMO,SAAS,WAAW,KAAoD;AAC7E,QAAM,UAAuB,CAAC;AAC9B,QAAM,IAAI,IAAI,IAAI,GAAG;AAIrB,MAAI,EAAE,YAAY,EAAE,UAAU;AAC5B,YAAQ,UAAU;AAAA,MAChB,eAAe,SAAS,KAAK,GAAG,EAAE,QAAQ,IAAI,EAAE,QAAQ,EAAE,CAAC;AAAA,IAC7D;AAEA,MAAE,WAAW;AACb,MAAE,WAAW;AAAA,EACf;AAGA,MAAI,EAAE,SAAS,gBAAgB,EAAE,SAAS,SAAS,QAAQ,GAAG;AAC5D,MAAE,OAAO;AACT,MAAE,WAAW,EAAE,SAAS,QAAQ,UAAU,GAAG;AAAA,EAC/C;AAEA,SAAO;AAAA,IACL,KAAK,EAAE,SAAS;AAAA,IAChB;AAAA,EACF;AACF;AAMO,SAAS,QAAQ,KAAsF;AAC5G,MAAI,SAAS,GAAG,GAAG;AACjB,WAAO;AAAA,EACT,WAAW,OAAO,QAAQ,UAAU;AAClC,WAAO;AAAA,EACT,WAAW,OAAO,QAAQ,UAAU;AAClC,QAAI,IAAI,MAAM,MAAM,GAAG;AACrB,aAAO;AAAA,IACT,WAAW,IAAI,MAAM,IAAI,GAAG;AAE1B,aAAO;AAAA,IACT,WAAW,IAAI,UAAU,GAAG,CAAC,MAAM,QAAQ;AACzC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAMO,SAAS,UAAU,QAA0C;AAClE,SAAO,CAAC,CAAC,OAAO;AAClB;AAaO,SAAS,UAAU,QAA0C;AAClE,SAAO,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,OAAO;AACnC;AAMO,SAAS,UAAU,QAA0C;AAClE,SAAO,CAAC,CAAC,OAAO;AAClB;AAMO,SAAS,aAAa,QAAmE;AAC9F,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO;AAAA,EACT,WAAW,OAAO,MAAM,OAAO,GAAG;AAEhC,WAAO,KAAK,MAAM,MAAM;AAAA,EAC1B;AAEA,SAAO,KAAK,KAAK,QAAQ,EAAE,QAAQ,YAAY,CAAC;AAClD;AAMO,SAAS,gBAAgB,QAA0C;AACxE,SAAO,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,MAAM;AACnE;AAMO,SAAS,qBAAqB,QAAgF;AACnH,MAAI,UAAU,MAAM,GAAG;AACrB,WAAO;AAAA,EACT,WAAW,UAAU,MAAM,GAAG;AAC5B,WAAO;AAAA,EACT,WAAW,UAAU,MAAM,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/errors.ts"],"sourcesContent":["export class ValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ValidationError';\n }\n}\n"],"mappings":";AAAO,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;","names":[]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/lib/errors.ts
|
|
2
|
+
var ValidationError = class extends Error {
|
|
3
|
+
constructor(message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = "ValidationError";
|
|
6
|
+
}
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
exports.ValidationError = ValidationError;
|
|
12
|
+
//# sourceMappingURL=chunk-SI6PKQOL.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/erunion/code/readme/oas/packages/oas-normalize/dist/chunk-SI6PKQOL.cjs","../src/lib/errors.ts"],"names":[],"mappings":"AAAA;ACAO,IAAM,gBAAA,EAAN,MAAA,QAA8B,MAAM;AAAA,EACzC,WAAA,CAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,KAAA,EAAO,iBAAA;AAAA,EACd;AACF,CAAA;ADEA;AACA;AACE;AACF,0CAAC","file":"/Users/erunion/code/readme/oas/packages/oas-normalize/dist/chunk-SI6PKQOL.cjs","sourcesContent":[null,"export class ValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'ValidationError';\n }\n}\n"]}
|
|
@@ -1,13 +1,27 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }// src/lib/utils.ts
|
|
2
2
|
var _jsyaml = require('js-yaml'); var _jsyaml2 = _interopRequireDefault(_jsyaml);
|
|
3
|
+
var _openapiparser = require('@readme/openapi-parser');
|
|
3
4
|
function isBuffer(obj) {
|
|
4
5
|
return obj != null && obj.constructor != null && typeof obj.constructor.isBuffer === "function" && !!obj.constructor.isBuffer(obj);
|
|
5
6
|
}
|
|
6
|
-
function
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
function prepareURL(url) {
|
|
8
|
+
const options = {};
|
|
9
|
+
const u = new URL(url);
|
|
10
|
+
if (u.username || u.password) {
|
|
11
|
+
options.headers = {
|
|
12
|
+
Authorization: `Basic ${btoa(`${u.username}:${u.password}`)}`
|
|
13
|
+
};
|
|
14
|
+
u.username = "";
|
|
15
|
+
u.password = "";
|
|
9
16
|
}
|
|
10
|
-
|
|
17
|
+
if (u.host === "github.com" && u.pathname.includes("/blob/")) {
|
|
18
|
+
u.host = "raw.githubusercontent.com";
|
|
19
|
+
u.pathname = u.pathname.replace("/blob/", "/");
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
url: u.toString(),
|
|
23
|
+
options
|
|
24
|
+
};
|
|
11
25
|
}
|
|
12
26
|
function getType(obj) {
|
|
13
27
|
if (isBuffer(obj)) {
|
|
@@ -67,5 +81,6 @@ function getAPIDefinitionType(schema) {
|
|
|
67
81
|
|
|
68
82
|
|
|
69
83
|
|
|
70
|
-
|
|
71
|
-
|
|
84
|
+
|
|
85
|
+
exports.isBuffer = isBuffer; exports.prepareURL = prepareURL; exports.getType = getType; exports.isOpenAPI = isOpenAPI; exports.isPostman = isPostman; exports.isSwagger = isSwagger; exports.stringToJSON = stringToJSON; exports.isAPIDefinition = isAPIDefinition; exports.getAPIDefinitionType = getAPIDefinitionType; exports.compileErrors = _openapiparser.compileErrors;
|
|
86
|
+
//# sourceMappingURL=chunk-ZTTIELJH.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/erunion/code/readme/oas/packages/oas-normalize/dist/chunk-ZTTIELJH.cjs","../src/lib/utils.ts"],"names":[],"mappings":"AAAA;ACAA,iFAAkC;AAElC,uDAA8B;AAMvB,SAAS,QAAA,CAAS,GAAA,EAAmB;AAC1C,EAAA,OACE,IAAA,GAAO,KAAA,GACP,GAAA,CAAI,YAAA,GAAe,KAAA,GACnB,OAAO,GAAA,CAAI,WAAA,CAAY,SAAA,IAAa,WAAA,GACpC,CAAC,CAAC,GAAA,CAAI,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA;AAElC;AAMO,SAAS,UAAA,CAAW,GAAA,EAAoD;AAC7E,EAAA,MAAM,QAAA,EAAuB,CAAC,CAAA;AAC9B,EAAA,MAAM,EAAA,EAAI,IAAI,GAAA,CAAI,GAAG,CAAA;AAIrB,EAAA,GAAA,CAAI,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,QAAA,EAAU;AAC5B,IAAA,OAAA,CAAQ,QAAA,EAAU;AAAA,MAChB,aAAA,EAAe,CAAA,MAAA,EAAS,IAAA,CAAK,CAAA,EAAA;AAC/B,IAAA;AAEa,IAAA;AACA,IAAA;AACf,EAAA;AAGiC,EAAA;AACtB,IAAA;AACuB,IAAA;AAClC,EAAA;AAEO,EAAA;AACW,IAAA;AAChB,IAAA;AACF,EAAA;AACF;AAM8G;AACzF,EAAA;AACV,IAAA;AACiB,EAAA;AACjB,IAAA;AACiB,EAAA;AACD,IAAA;AACd,MAAA;AACmB,IAAA;AAEnB,MAAA;AACoB,IAAA;AACpB,MAAA;AACT,IAAA;AAEO,IAAA;AACT,EAAA;AAEO,EAAA;AACT;AAMoE;AAClD,EAAA;AAClB;AAaoE;AACjC,EAAA;AACnC;AAMoE;AAClD,EAAA;AAClB;AAMgG;AAC9D,EAAA;AACvB,IAAA;AACyB,EAAA;AAER,IAAA;AAC1B,EAAA;AAE2B,EAAA;AAC7B;AAM0E;AAC5C,EAAA;AAC9B;AAMqC;AACZ,EAAA;AACd,IAAA;AACqB,EAAA;AACrB,IAAA;AACqB,EAAA;AACrB,IAAA;AACT,EAAA;AAEO,EAAA;AACT;ADrEoC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/erunion/code/readme/oas/packages/oas-normalize/dist/chunk-ZTTIELJH.cjs","sourcesContent":[null,"import YAML, { JSON_SCHEMA } from 'js-yaml';\n\nexport { compileErrors } from '@readme/openapi-parser';\n\n/**\n * Determine if a given variable is a `Buffer`.\n *\n */\nexport function isBuffer(obj: any): boolean {\n return (\n obj != null &&\n obj.constructor != null &&\n typeof obj.constructor.isBuffer === 'function' &&\n !!obj.constructor.isBuffer(obj)\n );\n}\n\n/**\n * Deconstruct a URL into a payload for a `fetch` request.\n *\n */\nexport function prepareURL(url: string): { options: RequestInit; url: string } {\n const options: RequestInit = {};\n const u = new URL(url);\n\n // `fetch` doesn't support supplying basic auth credentials in the URL so we need to move them\n // into a header.\n if (u.username || u.password) {\n options.headers = {\n Authorization: `Basic ${btoa(`${u.username}:${u.password}`)}`,\n };\n\n u.username = '';\n u.password = '';\n }\n\n // Transform GitHub sources into their raw content URLs.\n if (u.host === 'github.com' && u.pathname.includes('/blob/')) {\n u.host = 'raw.githubusercontent.com';\n u.pathname = u.pathname.replace('/blob/', '/');\n }\n\n return {\n url: u.toString(),\n options,\n };\n}\n\n/**\n * Determine the type of a given variable. Returns `false` if unrecognized.\n *\n */\nexport function getType(obj: any): 'buffer' | 'json' | 'path' | 'string-json' | 'string-yaml' | 'url' | false {\n if (isBuffer(obj)) {\n return 'buffer';\n } else if (typeof obj === 'object') {\n return 'json';\n } else if (typeof obj === 'string') {\n if (obj.match(/\\s*{/)) {\n return 'string-json';\n } else if (obj.match(/\\n/)) {\n // Not sure about this...\n return 'string-yaml';\n } else if (obj.substring(0, 4) === 'http') {\n return 'url';\n }\n\n return 'path';\n }\n\n return false;\n}\n\n/**\n * Determine if a given schema if an OpenAPI definition.\n *\n */\nexport function isOpenAPI(schema: Record<string, unknown>): boolean {\n return !!schema.openapi;\n}\n\n/**\n * Determine if a given schema is a Postman collection.\n *\n * Unfortunately the Postman schema spec doesn't have anything like `openapi` or `swagger` for us\n * to look at but it does require that `info` and `item` be present and as `item` doesn't exist in\n * OpenAPI or Swagger we can use the combination of those two properties to determine if what we\n * have is a Postman collection.\n *\n * @see {@link https://schema.postman.com/json/collection/v2.0.0/collection.json}\n * @see {@link https://schema.postman.com/json/collection/v2.1.0/collection.json}\n */\nexport function isPostman(schema: Record<string, unknown>): boolean {\n return !!schema.info && !!schema.item;\n}\n\n/**\n * Determine if a given schema if an Swagger definition.\n *\n */\nexport function isSwagger(schema: Record<string, unknown>): boolean {\n return !!schema.swagger;\n}\n\n/**\n * Convert a YAML blob or stringified JSON object into a JSON object.\n *\n */\nexport function stringToJSON(string: Record<string, unknown> | string): Record<string, unknown> {\n if (typeof string === 'object') {\n return string;\n } else if (string.match(/^\\s*{/)) {\n // eslint-disable-next-line try-catch-failsafe/json-parse\n return JSON.parse(string);\n }\n\n return YAML.load(string, { schema: JSON_SCHEMA }) as Record<string, unknown>;\n}\n\n/**\n * Determine if a given schema is an API definition that we can support.\n *\n */\nexport function isAPIDefinition(schema: Record<string, unknown>): boolean {\n return isOpenAPI(schema) || isPostman(schema) || isSwagger(schema);\n}\n\n/**\n * Retrieve the type of API definition that a given schema is.\n *\n */\nexport function getAPIDefinitionType(schema: Record<string, unknown>): 'openapi' | 'postman' | 'swagger' | 'unknown' {\n if (isOpenAPI(schema)) {\n return 'openapi';\n } else if (isPostman(schema)) {\n return 'postman';\n } else if (isSwagger(schema)) {\n return 'swagger';\n }\n\n return 'unknown';\n}\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -1,19 +1,26 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
|
+
var _chunkSI6PKQOLcjs = require('./chunk-SI6PKQOL.cjs');
|
|
3
4
|
|
|
4
5
|
|
|
5
6
|
|
|
6
7
|
|
|
7
8
|
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
var _chunkZTTIELJHcjs = require('./chunk-ZTTIELJH.cjs');
|
|
10
13
|
|
|
11
14
|
// src/index.ts
|
|
12
15
|
var _fs = require('fs'); var _fs2 = _interopRequireDefault(_fs);
|
|
13
|
-
var _openapiparser = require('@readme/openapi-parser');
|
|
16
|
+
var _openapiparser = require('@readme/openapi-parser');
|
|
14
17
|
var _postmantoopenapi = require('@readme/postman-to-openapi'); var _postmantoopenapi2 = _interopRequireDefault(_postmantoopenapi);
|
|
15
18
|
var _swagger2openapi = require('swagger2openapi'); var _swagger2openapi2 = _interopRequireDefault(_swagger2openapi);
|
|
16
19
|
var OASNormalize = class _OASNormalize {
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
17
24
|
constructor(file, opts) {
|
|
18
25
|
this.file = file;
|
|
19
26
|
this.opts = {
|
|
@@ -21,7 +28,7 @@ var OASNormalize = class _OASNormalize {
|
|
|
21
28
|
enablePaths: false,
|
|
22
29
|
...opts
|
|
23
30
|
};
|
|
24
|
-
this.type =
|
|
31
|
+
this.type = _chunkZTTIELJHcjs.getType.call(void 0, this.file);
|
|
25
32
|
this.cache = {
|
|
26
33
|
load: false,
|
|
27
34
|
bundle: false,
|
|
@@ -35,7 +42,7 @@ var OASNormalize = class _OASNormalize {
|
|
|
35
42
|
async load() {
|
|
36
43
|
if (this.cache.load) return this.cache.load;
|
|
37
44
|
const resolve = (obj) => {
|
|
38
|
-
const ret =
|
|
45
|
+
const ret = _chunkZTTIELJHcjs.stringToJSON.call(void 0, obj);
|
|
39
46
|
this.cache.load = ret;
|
|
40
47
|
return ret;
|
|
41
48
|
};
|
|
@@ -47,7 +54,8 @@ var OASNormalize = class _OASNormalize {
|
|
|
47
54
|
case "buffer":
|
|
48
55
|
return resolve(this.file.toString());
|
|
49
56
|
case "url":
|
|
50
|
-
const
|
|
57
|
+
const { url, options } = _chunkZTTIELJHcjs.prepareURL.call(void 0, this.file);
|
|
58
|
+
const resp = await fetch(url, options).then((res) => res.text());
|
|
51
59
|
return resolve(resp);
|
|
52
60
|
case "path":
|
|
53
61
|
if (!this.opts.enablePaths) {
|
|
@@ -74,13 +82,13 @@ var OASNormalize = class _OASNormalize {
|
|
|
74
82
|
async bundle() {
|
|
75
83
|
if (this.cache.bundle) return this.cache.bundle;
|
|
76
84
|
return this.load().then((schema) => {
|
|
77
|
-
if (
|
|
85
|
+
if (_chunkZTTIELJHcjs.isPostman.call(void 0, schema)) {
|
|
78
86
|
return _OASNormalize.convertPostmanToOpenAPI(schema);
|
|
79
87
|
}
|
|
80
88
|
return schema;
|
|
81
|
-
}).then((schema) =>
|
|
82
|
-
this.cache.bundle =
|
|
83
|
-
return
|
|
89
|
+
}).then((schema) => _openapiparser.bundle.call(void 0, schema)).then((bundled) => {
|
|
90
|
+
this.cache.bundle = bundled;
|
|
91
|
+
return bundled;
|
|
84
92
|
});
|
|
85
93
|
}
|
|
86
94
|
/**
|
|
@@ -90,11 +98,11 @@ var OASNormalize = class _OASNormalize {
|
|
|
90
98
|
async deref() {
|
|
91
99
|
if (this.cache.deref) return this.cache.deref;
|
|
92
100
|
return this.load().then((schema) => {
|
|
93
|
-
if (
|
|
101
|
+
if (_chunkZTTIELJHcjs.isPostman.call(void 0, schema)) {
|
|
94
102
|
return _OASNormalize.convertPostmanToOpenAPI(schema);
|
|
95
103
|
}
|
|
96
104
|
return schema;
|
|
97
|
-
}).then((schema) =>
|
|
105
|
+
}).then((schema) => _openapiparser.dereference.call(void 0, schema)).then((dereferenced) => {
|
|
98
106
|
this.cache.deref = dereferenced;
|
|
99
107
|
return dereferenced;
|
|
100
108
|
});
|
|
@@ -106,11 +114,11 @@ var OASNormalize = class _OASNormalize {
|
|
|
106
114
|
async convert() {
|
|
107
115
|
if (this.cache.convert) return this.cache.convert;
|
|
108
116
|
return this.load().then(async (schema) => {
|
|
109
|
-
return
|
|
117
|
+
return _chunkZTTIELJHcjs.isPostman.call(void 0, schema) ? _OASNormalize.convertPostmanToOpenAPI(schema) : schema;
|
|
110
118
|
}).then(async (schema) => {
|
|
111
|
-
if (!
|
|
119
|
+
if (!_chunkZTTIELJHcjs.isSwagger.call(void 0, schema) && !_chunkZTTIELJHcjs.isOpenAPI.call(void 0, schema)) {
|
|
112
120
|
throw new Error("The supplied API definition is unsupported.");
|
|
113
|
-
} else if (
|
|
121
|
+
} else if (_chunkZTTIELJHcjs.isOpenAPI.call(void 0, schema)) {
|
|
114
122
|
return schema;
|
|
115
123
|
}
|
|
116
124
|
const baseVersion = parseInt(schema.swagger, 10);
|
|
@@ -129,25 +137,26 @@ var OASNormalize = class _OASNormalize {
|
|
|
129
137
|
*/
|
|
130
138
|
async validate(opts = {}) {
|
|
131
139
|
const parserOptions = opts.parser || {};
|
|
132
|
-
if (!parserOptions.validate) {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
parserOptions.validate.colorizeErrors = this.opts.colorizeErrors;
|
|
140
|
+
if (!parserOptions.validate) parserOptions.validate = {};
|
|
141
|
+
if (!parserOptions.validate.errors) parserOptions.validate.errors = {};
|
|
142
|
+
parserOptions.validate.errors.colorize = this.opts.colorizeErrors;
|
|
136
143
|
return this.load().then(async (schema) => {
|
|
137
|
-
return
|
|
144
|
+
return _chunkZTTIELJHcjs.isPostman.call(void 0, schema) ? _OASNormalize.convertPostmanToOpenAPI(schema) : schema;
|
|
138
145
|
}).then(async (schema) => {
|
|
139
|
-
if (!
|
|
140
|
-
throw new
|
|
141
|
-
} else if (
|
|
146
|
+
if (!_chunkZTTIELJHcjs.isSwagger.call(void 0, schema) && !_chunkZTTIELJHcjs.isOpenAPI.call(void 0, schema)) {
|
|
147
|
+
throw new (0, _chunkSI6PKQOLcjs.ValidationError)("The supplied API definition is unsupported.");
|
|
148
|
+
} else if (_chunkZTTIELJHcjs.isSwagger.call(void 0, schema)) {
|
|
142
149
|
const baseVersion = parseInt(schema.swagger, 10);
|
|
143
150
|
if (baseVersion === 1) {
|
|
144
|
-
throw new
|
|
151
|
+
throw new (0, _chunkSI6PKQOLcjs.ValidationError)("Swagger v1.2 is unsupported.");
|
|
145
152
|
}
|
|
146
153
|
}
|
|
147
154
|
const clonedSchema = JSON.parse(JSON.stringify(schema));
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
155
|
+
const result = await _openapiparser.validate.call(void 0, clonedSchema, parserOptions);
|
|
156
|
+
if (!result.valid) {
|
|
157
|
+
throw new (0, _chunkSI6PKQOLcjs.ValidationError)(_openapiparser.compileErrors.call(void 0, result));
|
|
158
|
+
}
|
|
159
|
+
return result;
|
|
151
160
|
});
|
|
152
161
|
}
|
|
153
162
|
/**
|
|
@@ -156,7 +165,7 @@ var OASNormalize = class _OASNormalize {
|
|
|
156
165
|
*/
|
|
157
166
|
async version() {
|
|
158
167
|
return this.load().then((schema) => {
|
|
159
|
-
switch (
|
|
168
|
+
switch (_chunkZTTIELJHcjs.getAPIDefinitionType.call(void 0, schema)) {
|
|
160
169
|
case "openapi":
|
|
161
170
|
return {
|
|
162
171
|
specification: "openapi",
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/erunion/code/readme/oas/packages/oas-normalize/dist/index.cjs","../src/index.ts"],"names":[],"mappings":"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","file":"/Users/erunion/code/readme/oas/packages/oas-normalize/dist/index.cjs","sourcesContent":[null,"import type { Options } from './lib/types.js';\nimport type { OpenAPI, OpenAPIV2, OpenAPIV3 } from 'openapi-types';\n\nimport fs from 'node:fs';\n\nimport openapiParser from '@readme/openapi-parser';\nimport postmanToOpenAPI from '@readme/postman-to-openapi';\nimport converter from 'swagger2openapi';\n\nimport * as utils from './lib/utils.js';\n\nexport default class OASNormalize {\n cache: {\n bundle?: OpenAPI.Document | false;\n convert?: OpenAPI.Document | false;\n deref?: OpenAPI.Document | false;\n load?: Record<string, unknown> | false;\n };\n\n file: any;\n\n opts: Options;\n\n type: ReturnType<typeof utils.getType>;\n\n constructor(file: any, opts?: Options) {\n this.file = file;\n this.opts = {\n colorizeErrors: false,\n enablePaths: false,\n ...opts,\n };\n\n this.type = utils.getType(this.file);\n\n this.cache = {\n load: false,\n bundle: false,\n deref: false,\n };\n }\n\n /**\n * Load and return the API definition that `oas-normalize` was initialized with.\n *\n */\n async load(): Promise<Record<string, unknown>> {\n if (this.cache.load) return this.cache.load;\n\n const resolve = (obj: Parameters<typeof utils.stringToJSON>[0]) => {\n const ret = utils.stringToJSON(obj);\n this.cache.load = ret;\n return ret;\n };\n\n switch (this.type) {\n case 'json':\n case 'string-json':\n case 'string-yaml':\n return resolve(this.file);\n\n case 'buffer':\n return resolve(this.file.toString());\n\n case 'url':\n const resp = await fetch(utils.normalizeURL(this.file)).then(res => res.text());\n return resolve(resp);\n\n case 'path':\n // Load a local file\n if (!this.opts.enablePaths) {\n throw new Error('Use `opts.enablePaths` to enable accessing local files.');\n }\n\n const contents = fs.readFileSync(this.file).toString();\n if (!contents.trim()) {\n throw new Error('No file contents found.');\n }\n return resolve(contents);\n\n default:\n throw new Error('Could not load this file.');\n }\n }\n\n private static async convertPostmanToOpenAPI(schema: any) {\n return postmanToOpenAPI(JSON.stringify(schema), undefined, { outputFormat: 'json', replaceVars: true }).then(\n JSON.parse,\n );\n }\n\n /**\n * Bundle up the given API definition, resolving any external `$ref` pointers in the process.\n *\n */\n async bundle() {\n if (this.cache.bundle) return this.cache.bundle;\n\n return this.load()\n .then(schema => {\n // Though Postman collections don't support `$ref` pointers for us to bundle we'll still\n // upconvert it to an OpenAPI definition file so our returned dataset is always one of\n // those for a Postman dataset.\n if (utils.isPostman(schema)) {\n return OASNormalize.convertPostmanToOpenAPI(schema);\n }\n\n return schema;\n })\n .then(schema => openapiParser.bundle(schema))\n .then(bundle => {\n this.cache.bundle = bundle;\n return bundle;\n });\n }\n\n /**\n * Dereference the given API definition.\n *\n */\n async deref() {\n if (this.cache.deref) return this.cache.deref;\n\n return this.load()\n .then(schema => {\n // Though Postman collections don't support `$ref` pointers for us to dereference we'll\n // still upconvert it to an OpenAPI definition file so our returned dataset is always one\n // of those for a Postman dataset.\n if (utils.isPostman(schema)) {\n return OASNormalize.convertPostmanToOpenAPI(schema);\n }\n\n return schema;\n })\n .then(schema => openapiParser.dereference(schema))\n .then(dereferenced => {\n this.cache.deref = dereferenced;\n return dereferenced;\n });\n }\n\n /**\n * Convert a given API definition to OpenAPI if it is not already.\n *\n */\n async convert(): Promise<OpenAPI.Document> {\n if (this.cache.convert) return this.cache.convert;\n\n return this.load()\n .then(async schema => {\n // If we have a Postman collection we need to convert it to OpenAPI.\n return utils.isPostman(schema) ? OASNormalize.convertPostmanToOpenAPI(schema) : schema;\n })\n .then(async schema => {\n if (!utils.isSwagger(schema) && !utils.isOpenAPI(schema)) {\n throw new Error('The supplied API definition is unsupported.');\n } else if (utils.isOpenAPI(schema)) {\n return schema;\n }\n\n const baseVersion = parseInt(schema.swagger, 10);\n if (baseVersion === 1) {\n throw new Error('Swagger v1.2 is unsupported.');\n }\n\n return converter\n .convertObj(schema, { anchors: true })\n .then((options: { openapi: OpenAPI.Document }) => options.openapi);\n });\n }\n\n /**\n * Validate a given API definition.\n *\n * If supplied a Postman collection it will be converted to OpenAPI first and then run through\n * standard OpenAPI validation.\n *\n */\n async validate(\n opts: {\n parser?: openapiParser.Options;\n } = {},\n ): Promise<true> {\n const parserOptions = opts.parser || {};\n if (!parserOptions.validate) {\n parserOptions.validate = {};\n }\n\n parserOptions.validate.colorizeErrors = this.opts.colorizeErrors;\n\n return this.load()\n .then(async schema => {\n // Because we don't have something akin to `openapi-parser` for Postman collections we just\n // always convert them to OpenAPI.\n return utils.isPostman(schema) ? OASNormalize.convertPostmanToOpenAPI(schema) : schema;\n })\n .then(async schema => {\n if (!utils.isSwagger(schema) && !utils.isOpenAPI(schema)) {\n throw new Error('The supplied API definition is unsupported.');\n } else if (utils.isSwagger(schema)) {\n const baseVersion = parseInt(schema.swagger, 10);\n if (baseVersion === 1) {\n throw new Error('Swagger v1.2 is unsupported.');\n }\n }\n\n /**\n * `openapiParser.validate()` dereferences schemas at the same time as validation, mutating\n * the supplied parameter in the process, and does not give us an option to disable this.\n * As we already have a dereferencing method on this library, and this method just needs to\n * tell us if the API definition is valid or not, we need to clone the schema before\n * supplying it to `openapi-parser`.\n */\n // eslint-disable-next-line try-catch-failsafe/json-parse\n const clonedSchema = JSON.parse(JSON.stringify(schema));\n\n return openapiParser.validate(clonedSchema, parserOptions).then(() => {\n // The API definition, whatever its format or specification, is valid.\n return true;\n });\n });\n }\n\n /**\n * Retrieve OpenAPI, Swagger, or Postman version information about the supplied API definition.\n *\n */\n async version(): Promise<{ specification: 'openapi' | 'postman' | 'swagger'; version: string | 'unknown' }> {\n return this.load().then(schema => {\n switch (utils.getAPIDefinitionType(schema)) {\n case 'openapi':\n return {\n specification: 'openapi',\n version: (schema as unknown as OpenAPIV3.Document).openapi,\n };\n\n case 'postman':\n let version = 'unknown';\n if ((schema?.info as Record<string, string>)?.schema) {\n // Though `info.schema` is required by the Postman spec there's no strictness to its\n // contents so we'll do our best to extract a version out of this schema URL that they\n // seem to usually match. If not we'll fallback to treating it as an `unknown` version.\n const match = (schema?.info as Record<string, string>).schema.match(\n /http(s?):\\/\\/schema.getpostman.com\\/json\\/collection\\/v([0-9.]+)\\//,\n );\n\n if (match) {\n version = match[2];\n }\n }\n\n return {\n specification: 'postman',\n version,\n };\n\n case 'swagger':\n return {\n specification: 'swagger',\n version: (schema as unknown as OpenAPIV2.Document).swagger,\n };\n\n default:\n throw new Error('Unknown file detected.');\n }\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/Users/erunion/code/readme/oas/packages/oas-normalize/dist/index.cjs","../src/index.ts"],"names":[],"mappings":"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","file":"/Users/erunion/code/readme/oas/packages/oas-normalize/dist/index.cjs","sourcesContent":[null,"import type { Options } from './lib/types.js';\nimport type { ParserOptions, ValidationResult } from '@readme/openapi-parser';\nimport type { OpenAPI, OpenAPIV2, OpenAPIV3 } from 'openapi-types';\n\nimport fs from 'node:fs';\n\nimport { bundle, compileErrors, dereference, validate } from '@readme/openapi-parser';\nimport postmanToOpenAPI from '@readme/postman-to-openapi';\nimport converter from 'swagger2openapi';\n\nimport { ValidationError } from './lib/errors.js';\nimport * as utils from './lib/utils.js';\n\nexport default class OASNormalize {\n cache: {\n bundle?: OpenAPI.Document | false;\n convert?: OpenAPI.Document | false;\n deref?: OpenAPI.Document | false;\n load?: Record<string, unknown> | false;\n };\n\n file: any;\n\n opts: Options;\n\n type: ReturnType<typeof utils.getType>;\n\n constructor(file: any, opts?: Options) {\n this.file = file;\n this.opts = {\n colorizeErrors: false,\n enablePaths: false,\n ...opts,\n };\n\n this.type = utils.getType(this.file);\n\n this.cache = {\n load: false,\n bundle: false,\n deref: false,\n };\n }\n\n /**\n * Load and return the API definition that `oas-normalize` was initialized with.\n *\n */\n async load(): Promise<Record<string, unknown>> {\n if (this.cache.load) return this.cache.load;\n\n const resolve = (obj: Parameters<typeof utils.stringToJSON>[0]) => {\n const ret = utils.stringToJSON(obj);\n this.cache.load = ret;\n return ret;\n };\n\n switch (this.type) {\n case 'json':\n case 'string-json':\n case 'string-yaml':\n return resolve(this.file);\n\n case 'buffer':\n return resolve(this.file.toString());\n\n case 'url':\n const { url, options } = utils.prepareURL(this.file);\n const resp = await fetch(url, options).then(res => res.text());\n return resolve(resp);\n\n case 'path':\n // Load a local file\n if (!this.opts.enablePaths) {\n throw new Error('Use `opts.enablePaths` to enable accessing local files.');\n }\n\n const contents = fs.readFileSync(this.file).toString();\n if (!contents.trim()) {\n throw new Error('No file contents found.');\n }\n return resolve(contents);\n\n default:\n throw new Error('Could not load this file.');\n }\n }\n\n private static async convertPostmanToOpenAPI(schema: any) {\n return postmanToOpenAPI(JSON.stringify(schema), undefined, { outputFormat: 'json', replaceVars: true }).then(\n JSON.parse,\n );\n }\n\n /**\n * Bundle up the given API definition, resolving any external `$ref` pointers in the process.\n *\n */\n async bundle(): Promise<OpenAPI.Document> {\n if (this.cache.bundle) return this.cache.bundle;\n\n return this.load()\n .then(schema => {\n // Though Postman collections don't support `$ref` pointers for us to bundle we'll still\n // upconvert it to an OpenAPI definition file so our returned dataset is always one of\n // those for a Postman dataset.\n if (utils.isPostman(schema)) {\n return OASNormalize.convertPostmanToOpenAPI(schema);\n }\n\n return schema;\n })\n .then(schema => bundle(schema))\n .then(bundled => {\n this.cache.bundle = bundled;\n return bundled;\n });\n }\n\n /**\n * Dereference the given API definition.\n *\n */\n async deref(): Promise<OpenAPI.Document> {\n if (this.cache.deref) return this.cache.deref;\n\n return this.load()\n .then(schema => {\n // Though Postman collections don't support `$ref` pointers for us to dereference we'll\n // still upconvert it to an OpenAPI definition file so our returned dataset is always one\n // of those for a Postman dataset.\n if (utils.isPostman(schema)) {\n return OASNormalize.convertPostmanToOpenAPI(schema);\n }\n\n return schema;\n })\n .then(schema => dereference(schema))\n .then(dereferenced => {\n this.cache.deref = dereferenced;\n return dereferenced;\n });\n }\n\n /**\n * Convert a given API definition to OpenAPI if it is not already.\n *\n */\n async convert(): Promise<OpenAPI.Document> {\n if (this.cache.convert) return this.cache.convert;\n\n return this.load()\n .then(async schema => {\n // If we have a Postman collection we need to convert it to OpenAPI.\n return utils.isPostman(schema) ? OASNormalize.convertPostmanToOpenAPI(schema) : schema;\n })\n .then(async schema => {\n if (!utils.isSwagger(schema) && !utils.isOpenAPI(schema)) {\n throw new Error('The supplied API definition is unsupported.');\n } else if (utils.isOpenAPI(schema)) {\n return schema;\n }\n\n const baseVersion = parseInt(schema.swagger, 10);\n if (baseVersion === 1) {\n throw new Error('Swagger v1.2 is unsupported.');\n }\n\n return converter\n .convertObj(schema, { anchors: true })\n .then((options: { openapi: OpenAPI.Document }) => options.openapi);\n });\n }\n\n /**\n * Validate a given API definition.\n *\n * If supplied a Postman collection it will be converted to OpenAPI first and then run through\n * standard OpenAPI validation.\n *\n */\n async validate(\n opts: {\n parser?: ParserOptions;\n } = {},\n ): Promise<ValidationResult> {\n const parserOptions = opts.parser || {};\n if (!parserOptions.validate) parserOptions.validate = {};\n if (!parserOptions.validate.errors) parserOptions.validate.errors = {};\n\n parserOptions.validate.errors.colorize = this.opts.colorizeErrors;\n\n return this.load()\n .then(async schema => {\n // Because we don't have something akin to `openapi-parser` for Postman collections we just\n // always convert them to OpenAPI.\n return utils.isPostman(schema) ? OASNormalize.convertPostmanToOpenAPI(schema) : schema;\n })\n .then(async schema => {\n if (!utils.isSwagger(schema) && !utils.isOpenAPI(schema)) {\n throw new ValidationError('The supplied API definition is unsupported.');\n } else if (utils.isSwagger(schema)) {\n const baseVersion = parseInt(schema.swagger, 10);\n if (baseVersion === 1) {\n throw new ValidationError('Swagger v1.2 is unsupported.');\n }\n }\n\n /**\n * `OpenAPIParser.validate()` dereferences schemas at the same time as validation, mutating\n * the supplied parameter in the process, and does not give us an option to disable this.\n * As we already have a dereferencing method on this library, and this method just needs to\n * tell us if the API definition is valid or not, we need to clone the schema before\n * supplying it to `openapi-parser`.\n */\n // eslint-disable-next-line try-catch-failsafe/json-parse\n const clonedSchema = JSON.parse(JSON.stringify(schema));\n\n const result = await validate(clonedSchema, parserOptions);\n if (!result.valid) {\n throw new ValidationError(compileErrors(result));\n }\n\n // The API definition, whatever its format or specification, is valid.\n return result;\n });\n }\n\n /**\n * Retrieve OpenAPI, Swagger, or Postman version information about the supplied API definition.\n *\n */\n async version(): Promise<{ specification: 'openapi' | 'postman' | 'swagger'; version: string | 'unknown' }> {\n return this.load().then(schema => {\n switch (utils.getAPIDefinitionType(schema)) {\n case 'openapi':\n return {\n specification: 'openapi',\n version: (schema as unknown as OpenAPIV3.Document).openapi,\n };\n\n case 'postman':\n let version = 'unknown';\n if ((schema?.info as Record<string, string>)?.schema) {\n // Though `info.schema` is required by the Postman spec there's no strictness to its\n // contents so we'll do our best to extract a version out of this schema URL that they\n // seem to usually match. If not we'll fallback to treating it as an `unknown` version.\n const match = (schema?.info as Record<string, string>).schema.match(\n /http(s?):\\/\\/schema.getpostman.com\\/json\\/collection\\/v([0-9.]+)\\//,\n );\n\n if (match) {\n version = match[2];\n }\n }\n\n return {\n specification: 'postman',\n version,\n };\n\n case 'swagger':\n return {\n specification: 'swagger',\n version: (schema as unknown as OpenAPIV2.Document).swagger,\n };\n\n default:\n throw new Error('Unknown file detected.');\n }\n });\n }\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Options } from './lib/types.cjs';
|
|
2
|
+
import { ParserOptions, ValidationResult } from '@readme/openapi-parser';
|
|
2
3
|
import { OpenAPI } from 'openapi-types';
|
|
3
|
-
import openapiParser from '@readme/openapi-parser';
|
|
4
4
|
import { getType } from './lib/utils.cjs';
|
|
5
5
|
|
|
6
6
|
declare class OASNormalize {
|
|
@@ -24,12 +24,12 @@ declare class OASNormalize {
|
|
|
24
24
|
* Bundle up the given API definition, resolving any external `$ref` pointers in the process.
|
|
25
25
|
*
|
|
26
26
|
*/
|
|
27
|
-
bundle(): Promise<OpenAPI.Document
|
|
27
|
+
bundle(): Promise<OpenAPI.Document>;
|
|
28
28
|
/**
|
|
29
29
|
* Dereference the given API definition.
|
|
30
30
|
*
|
|
31
31
|
*/
|
|
32
|
-
deref(): Promise<OpenAPI.Document
|
|
32
|
+
deref(): Promise<OpenAPI.Document>;
|
|
33
33
|
/**
|
|
34
34
|
* Convert a given API definition to OpenAPI if it is not already.
|
|
35
35
|
*
|
|
@@ -43,8 +43,8 @@ declare class OASNormalize {
|
|
|
43
43
|
*
|
|
44
44
|
*/
|
|
45
45
|
validate(opts?: {
|
|
46
|
-
parser?:
|
|
47
|
-
}): Promise<
|
|
46
|
+
parser?: ParserOptions;
|
|
47
|
+
}): Promise<ValidationResult>;
|
|
48
48
|
/**
|
|
49
49
|
* Retrieve OpenAPI, Swagger, or Postman version information about the supplied API definition.
|
|
50
50
|
*
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Options } from './lib/types.js';
|
|
2
|
+
import { ParserOptions, ValidationResult } from '@readme/openapi-parser';
|
|
2
3
|
import { OpenAPI } from 'openapi-types';
|
|
3
|
-
import openapiParser from '@readme/openapi-parser';
|
|
4
4
|
import { getType } from './lib/utils.js';
|
|
5
5
|
|
|
6
6
|
declare class OASNormalize {
|
|
@@ -24,12 +24,12 @@ declare class OASNormalize {
|
|
|
24
24
|
* Bundle up the given API definition, resolving any external `$ref` pointers in the process.
|
|
25
25
|
*
|
|
26
26
|
*/
|
|
27
|
-
bundle(): Promise<OpenAPI.Document
|
|
27
|
+
bundle(): Promise<OpenAPI.Document>;
|
|
28
28
|
/**
|
|
29
29
|
* Dereference the given API definition.
|
|
30
30
|
*
|
|
31
31
|
*/
|
|
32
|
-
deref(): Promise<OpenAPI.Document
|
|
32
|
+
deref(): Promise<OpenAPI.Document>;
|
|
33
33
|
/**
|
|
34
34
|
* Convert a given API definition to OpenAPI if it is not already.
|
|
35
35
|
*
|
|
@@ -43,8 +43,8 @@ declare class OASNormalize {
|
|
|
43
43
|
*
|
|
44
44
|
*/
|
|
45
45
|
validate(opts?: {
|
|
46
|
-
parser?:
|
|
47
|
-
}): Promise<
|
|
46
|
+
parser?: ParserOptions;
|
|
47
|
+
}): Promise<ValidationResult>;
|
|
48
48
|
/**
|
|
49
49
|
* Retrieve OpenAPI, Swagger, or Postman version information about the supplied API definition.
|
|
50
50
|
*
|
package/dist/index.js
CHANGED
|
@@ -1,19 +1,26 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ValidationError
|
|
3
|
+
} from "./chunk-KGEOPSPH.js";
|
|
1
4
|
import {
|
|
2
5
|
getAPIDefinitionType,
|
|
3
6
|
getType,
|
|
4
7
|
isOpenAPI,
|
|
5
8
|
isPostman,
|
|
6
9
|
isSwagger,
|
|
7
|
-
|
|
10
|
+
prepareURL,
|
|
8
11
|
stringToJSON
|
|
9
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-EHNNEPCG.js";
|
|
10
13
|
|
|
11
14
|
// src/index.ts
|
|
12
15
|
import fs from "node:fs";
|
|
13
|
-
import
|
|
16
|
+
import { bundle, compileErrors, dereference, validate } from "@readme/openapi-parser";
|
|
14
17
|
import postmanToOpenAPI from "@readme/postman-to-openapi";
|
|
15
18
|
import converter from "swagger2openapi";
|
|
16
19
|
var OASNormalize = class _OASNormalize {
|
|
20
|
+
cache;
|
|
21
|
+
file;
|
|
22
|
+
opts;
|
|
23
|
+
type;
|
|
17
24
|
constructor(file, opts) {
|
|
18
25
|
this.file = file;
|
|
19
26
|
this.opts = {
|
|
@@ -47,7 +54,8 @@ var OASNormalize = class _OASNormalize {
|
|
|
47
54
|
case "buffer":
|
|
48
55
|
return resolve(this.file.toString());
|
|
49
56
|
case "url":
|
|
50
|
-
const
|
|
57
|
+
const { url, options } = prepareURL(this.file);
|
|
58
|
+
const resp = await fetch(url, options).then((res) => res.text());
|
|
51
59
|
return resolve(resp);
|
|
52
60
|
case "path":
|
|
53
61
|
if (!this.opts.enablePaths) {
|
|
@@ -78,9 +86,9 @@ var OASNormalize = class _OASNormalize {
|
|
|
78
86
|
return _OASNormalize.convertPostmanToOpenAPI(schema);
|
|
79
87
|
}
|
|
80
88
|
return schema;
|
|
81
|
-
}).then((schema) =>
|
|
82
|
-
this.cache.bundle =
|
|
83
|
-
return
|
|
89
|
+
}).then((schema) => bundle(schema)).then((bundled) => {
|
|
90
|
+
this.cache.bundle = bundled;
|
|
91
|
+
return bundled;
|
|
84
92
|
});
|
|
85
93
|
}
|
|
86
94
|
/**
|
|
@@ -94,7 +102,7 @@ var OASNormalize = class _OASNormalize {
|
|
|
94
102
|
return _OASNormalize.convertPostmanToOpenAPI(schema);
|
|
95
103
|
}
|
|
96
104
|
return schema;
|
|
97
|
-
}).then((schema) =>
|
|
105
|
+
}).then((schema) => dereference(schema)).then((dereferenced) => {
|
|
98
106
|
this.cache.deref = dereferenced;
|
|
99
107
|
return dereferenced;
|
|
100
108
|
});
|
|
@@ -129,25 +137,26 @@ var OASNormalize = class _OASNormalize {
|
|
|
129
137
|
*/
|
|
130
138
|
async validate(opts = {}) {
|
|
131
139
|
const parserOptions = opts.parser || {};
|
|
132
|
-
if (!parserOptions.validate) {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
parserOptions.validate.colorizeErrors = this.opts.colorizeErrors;
|
|
140
|
+
if (!parserOptions.validate) parserOptions.validate = {};
|
|
141
|
+
if (!parserOptions.validate.errors) parserOptions.validate.errors = {};
|
|
142
|
+
parserOptions.validate.errors.colorize = this.opts.colorizeErrors;
|
|
136
143
|
return this.load().then(async (schema) => {
|
|
137
144
|
return isPostman(schema) ? _OASNormalize.convertPostmanToOpenAPI(schema) : schema;
|
|
138
145
|
}).then(async (schema) => {
|
|
139
146
|
if (!isSwagger(schema) && !isOpenAPI(schema)) {
|
|
140
|
-
throw new
|
|
147
|
+
throw new ValidationError("The supplied API definition is unsupported.");
|
|
141
148
|
} else if (isSwagger(schema)) {
|
|
142
149
|
const baseVersion = parseInt(schema.swagger, 10);
|
|
143
150
|
if (baseVersion === 1) {
|
|
144
|
-
throw new
|
|
151
|
+
throw new ValidationError("Swagger v1.2 is unsupported.");
|
|
145
152
|
}
|
|
146
153
|
}
|
|
147
154
|
const clonedSchema = JSON.parse(JSON.stringify(schema));
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
155
|
+
const result = await validate(clonedSchema, parserOptions);
|
|
156
|
+
if (!result.valid) {
|
|
157
|
+
throw new ValidationError(compileErrors(result));
|
|
158
|
+
}
|
|
159
|
+
return result;
|
|
151
160
|
});
|
|
152
161
|
}
|
|
153
162
|
/**
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Options } from './lib/types.js';\nimport type { OpenAPI, OpenAPIV2, OpenAPIV3 } from 'openapi-types';\n\nimport fs from 'node:fs';\n\nimport openapiParser from '@readme/openapi-parser';\nimport postmanToOpenAPI from '@readme/postman-to-openapi';\nimport converter from 'swagger2openapi';\n\nimport * as utils from './lib/utils.js';\n\nexport default class OASNormalize {\n cache: {\n bundle?: OpenAPI.Document | false;\n convert?: OpenAPI.Document | false;\n deref?: OpenAPI.Document | false;\n load?: Record<string, unknown> | false;\n };\n\n file: any;\n\n opts: Options;\n\n type: ReturnType<typeof utils.getType>;\n\n constructor(file: any, opts?: Options) {\n this.file = file;\n this.opts = {\n colorizeErrors: false,\n enablePaths: false,\n ...opts,\n };\n\n this.type = utils.getType(this.file);\n\n this.cache = {\n load: false,\n bundle: false,\n deref: false,\n };\n }\n\n /**\n * Load and return the API definition that `oas-normalize` was initialized with.\n *\n */\n async load(): Promise<Record<string, unknown>> {\n if (this.cache.load) return this.cache.load;\n\n const resolve = (obj: Parameters<typeof utils.stringToJSON>[0]) => {\n const ret = utils.stringToJSON(obj);\n this.cache.load = ret;\n return ret;\n };\n\n switch (this.type) {\n case 'json':\n case 'string-json':\n case 'string-yaml':\n return resolve(this.file);\n\n case 'buffer':\n return resolve(this.file.toString());\n\n case 'url':\n const resp = await fetch(utils.normalizeURL(this.file)).then(res => res.text());\n return resolve(resp);\n\n case 'path':\n // Load a local file\n if (!this.opts.enablePaths) {\n throw new Error('Use `opts.enablePaths` to enable accessing local files.');\n }\n\n const contents = fs.readFileSync(this.file).toString();\n if (!contents.trim()) {\n throw new Error('No file contents found.');\n }\n return resolve(contents);\n\n default:\n throw new Error('Could not load this file.');\n }\n }\n\n private static async convertPostmanToOpenAPI(schema: any) {\n return postmanToOpenAPI(JSON.stringify(schema), undefined, { outputFormat: 'json', replaceVars: true }).then(\n JSON.parse,\n );\n }\n\n /**\n * Bundle up the given API definition, resolving any external `$ref` pointers in the process.\n *\n */\n async bundle() {\n if (this.cache.bundle) return this.cache.bundle;\n\n return this.load()\n .then(schema => {\n // Though Postman collections don't support `$ref` pointers for us to bundle we'll still\n // upconvert it to an OpenAPI definition file so our returned dataset is always one of\n // those for a Postman dataset.\n if (utils.isPostman(schema)) {\n return OASNormalize.convertPostmanToOpenAPI(schema);\n }\n\n return schema;\n })\n .then(schema => openapiParser.bundle(schema))\n .then(bundle => {\n this.cache.bundle = bundle;\n return bundle;\n });\n }\n\n /**\n * Dereference the given API definition.\n *\n */\n async deref() {\n if (this.cache.deref) return this.cache.deref;\n\n return this.load()\n .then(schema => {\n // Though Postman collections don't support `$ref` pointers for us to dereference we'll\n // still upconvert it to an OpenAPI definition file so our returned dataset is always one\n // of those for a Postman dataset.\n if (utils.isPostman(schema)) {\n return OASNormalize.convertPostmanToOpenAPI(schema);\n }\n\n return schema;\n })\n .then(schema => openapiParser.dereference(schema))\n .then(dereferenced => {\n this.cache.deref = dereferenced;\n return dereferenced;\n });\n }\n\n /**\n * Convert a given API definition to OpenAPI if it is not already.\n *\n */\n async convert(): Promise<OpenAPI.Document> {\n if (this.cache.convert) return this.cache.convert;\n\n return this.load()\n .then(async schema => {\n // If we have a Postman collection we need to convert it to OpenAPI.\n return utils.isPostman(schema) ? OASNormalize.convertPostmanToOpenAPI(schema) : schema;\n })\n .then(async schema => {\n if (!utils.isSwagger(schema) && !utils.isOpenAPI(schema)) {\n throw new Error('The supplied API definition is unsupported.');\n } else if (utils.isOpenAPI(schema)) {\n return schema;\n }\n\n const baseVersion = parseInt(schema.swagger, 10);\n if (baseVersion === 1) {\n throw new Error('Swagger v1.2 is unsupported.');\n }\n\n return converter\n .convertObj(schema, { anchors: true })\n .then((options: { openapi: OpenAPI.Document }) => options.openapi);\n });\n }\n\n /**\n * Validate a given API definition.\n *\n * If supplied a Postman collection it will be converted to OpenAPI first and then run through\n * standard OpenAPI validation.\n *\n */\n async validate(\n opts: {\n parser?: openapiParser.Options;\n } = {},\n ): Promise<true> {\n const parserOptions = opts.parser || {};\n if (!parserOptions.validate) {\n parserOptions.validate = {};\n }\n\n parserOptions.validate.colorizeErrors = this.opts.colorizeErrors;\n\n return this.load()\n .then(async schema => {\n // Because we don't have something akin to `openapi-parser` for Postman collections we just\n // always convert them to OpenAPI.\n return utils.isPostman(schema) ? OASNormalize.convertPostmanToOpenAPI(schema) : schema;\n })\n .then(async schema => {\n if (!utils.isSwagger(schema) && !utils.isOpenAPI(schema)) {\n throw new Error('The supplied API definition is unsupported.');\n } else if (utils.isSwagger(schema)) {\n const baseVersion = parseInt(schema.swagger, 10);\n if (baseVersion === 1) {\n throw new Error('Swagger v1.2 is unsupported.');\n }\n }\n\n /**\n * `openapiParser.validate()` dereferences schemas at the same time as validation, mutating\n * the supplied parameter in the process, and does not give us an option to disable this.\n * As we already have a dereferencing method on this library, and this method just needs to\n * tell us if the API definition is valid or not, we need to clone the schema before\n * supplying it to `openapi-parser`.\n */\n // eslint-disable-next-line try-catch-failsafe/json-parse\n const clonedSchema = JSON.parse(JSON.stringify(schema));\n\n return openapiParser.validate(clonedSchema, parserOptions).then(() => {\n // The API definition, whatever its format or specification, is valid.\n return true;\n });\n });\n }\n\n /**\n * Retrieve OpenAPI, Swagger, or Postman version information about the supplied API definition.\n *\n */\n async version(): Promise<{ specification: 'openapi' | 'postman' | 'swagger'; version: string | 'unknown' }> {\n return this.load().then(schema => {\n switch (utils.getAPIDefinitionType(schema)) {\n case 'openapi':\n return {\n specification: 'openapi',\n version: (schema as unknown as OpenAPIV3.Document).openapi,\n };\n\n case 'postman':\n let version = 'unknown';\n if ((schema?.info as Record<string, string>)?.schema) {\n // Though `info.schema` is required by the Postman spec there's no strictness to its\n // contents so we'll do our best to extract a version out of this schema URL that they\n // seem to usually match. If not we'll fallback to treating it as an `unknown` version.\n const match = (schema?.info as Record<string, string>).schema.match(\n /http(s?):\\/\\/schema.getpostman.com\\/json\\/collection\\/v([0-9.]+)\\//,\n );\n\n if (match) {\n version = match[2];\n }\n }\n\n return {\n specification: 'postman',\n version,\n };\n\n case 'swagger':\n return {\n specification: 'swagger',\n version: (schema as unknown as OpenAPIV2.Document).swagger,\n };\n\n default:\n throw new Error('Unknown file detected.');\n }\n });\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Options } from './lib/types.js';\nimport type { ParserOptions, ValidationResult } from '@readme/openapi-parser';\nimport type { OpenAPI, OpenAPIV2, OpenAPIV3 } from 'openapi-types';\n\nimport fs from 'node:fs';\n\nimport { bundle, compileErrors, dereference, validate } from '@readme/openapi-parser';\nimport postmanToOpenAPI from '@readme/postman-to-openapi';\nimport converter from 'swagger2openapi';\n\nimport { ValidationError } from './lib/errors.js';\nimport * as utils from './lib/utils.js';\n\nexport default class OASNormalize {\n cache: {\n bundle?: OpenAPI.Document | false;\n convert?: OpenAPI.Document | false;\n deref?: OpenAPI.Document | false;\n load?: Record<string, unknown> | false;\n };\n\n file: any;\n\n opts: Options;\n\n type: ReturnType<typeof utils.getType>;\n\n constructor(file: any, opts?: Options) {\n this.file = file;\n this.opts = {\n colorizeErrors: false,\n enablePaths: false,\n ...opts,\n };\n\n this.type = utils.getType(this.file);\n\n this.cache = {\n load: false,\n bundle: false,\n deref: false,\n };\n }\n\n /**\n * Load and return the API definition that `oas-normalize` was initialized with.\n *\n */\n async load(): Promise<Record<string, unknown>> {\n if (this.cache.load) return this.cache.load;\n\n const resolve = (obj: Parameters<typeof utils.stringToJSON>[0]) => {\n const ret = utils.stringToJSON(obj);\n this.cache.load = ret;\n return ret;\n };\n\n switch (this.type) {\n case 'json':\n case 'string-json':\n case 'string-yaml':\n return resolve(this.file);\n\n case 'buffer':\n return resolve(this.file.toString());\n\n case 'url':\n const { url, options } = utils.prepareURL(this.file);\n const resp = await fetch(url, options).then(res => res.text());\n return resolve(resp);\n\n case 'path':\n // Load a local file\n if (!this.opts.enablePaths) {\n throw new Error('Use `opts.enablePaths` to enable accessing local files.');\n }\n\n const contents = fs.readFileSync(this.file).toString();\n if (!contents.trim()) {\n throw new Error('No file contents found.');\n }\n return resolve(contents);\n\n default:\n throw new Error('Could not load this file.');\n }\n }\n\n private static async convertPostmanToOpenAPI(schema: any) {\n return postmanToOpenAPI(JSON.stringify(schema), undefined, { outputFormat: 'json', replaceVars: true }).then(\n JSON.parse,\n );\n }\n\n /**\n * Bundle up the given API definition, resolving any external `$ref` pointers in the process.\n *\n */\n async bundle(): Promise<OpenAPI.Document> {\n if (this.cache.bundle) return this.cache.bundle;\n\n return this.load()\n .then(schema => {\n // Though Postman collections don't support `$ref` pointers for us to bundle we'll still\n // upconvert it to an OpenAPI definition file so our returned dataset is always one of\n // those for a Postman dataset.\n if (utils.isPostman(schema)) {\n return OASNormalize.convertPostmanToOpenAPI(schema);\n }\n\n return schema;\n })\n .then(schema => bundle(schema))\n .then(bundled => {\n this.cache.bundle = bundled;\n return bundled;\n });\n }\n\n /**\n * Dereference the given API definition.\n *\n */\n async deref(): Promise<OpenAPI.Document> {\n if (this.cache.deref) return this.cache.deref;\n\n return this.load()\n .then(schema => {\n // Though Postman collections don't support `$ref` pointers for us to dereference we'll\n // still upconvert it to an OpenAPI definition file so our returned dataset is always one\n // of those for a Postman dataset.\n if (utils.isPostman(schema)) {\n return OASNormalize.convertPostmanToOpenAPI(schema);\n }\n\n return schema;\n })\n .then(schema => dereference(schema))\n .then(dereferenced => {\n this.cache.deref = dereferenced;\n return dereferenced;\n });\n }\n\n /**\n * Convert a given API definition to OpenAPI if it is not already.\n *\n */\n async convert(): Promise<OpenAPI.Document> {\n if (this.cache.convert) return this.cache.convert;\n\n return this.load()\n .then(async schema => {\n // If we have a Postman collection we need to convert it to OpenAPI.\n return utils.isPostman(schema) ? OASNormalize.convertPostmanToOpenAPI(schema) : schema;\n })\n .then(async schema => {\n if (!utils.isSwagger(schema) && !utils.isOpenAPI(schema)) {\n throw new Error('The supplied API definition is unsupported.');\n } else if (utils.isOpenAPI(schema)) {\n return schema;\n }\n\n const baseVersion = parseInt(schema.swagger, 10);\n if (baseVersion === 1) {\n throw new Error('Swagger v1.2 is unsupported.');\n }\n\n return converter\n .convertObj(schema, { anchors: true })\n .then((options: { openapi: OpenAPI.Document }) => options.openapi);\n });\n }\n\n /**\n * Validate a given API definition.\n *\n * If supplied a Postman collection it will be converted to OpenAPI first and then run through\n * standard OpenAPI validation.\n *\n */\n async validate(\n opts: {\n parser?: ParserOptions;\n } = {},\n ): Promise<ValidationResult> {\n const parserOptions = opts.parser || {};\n if (!parserOptions.validate) parserOptions.validate = {};\n if (!parserOptions.validate.errors) parserOptions.validate.errors = {};\n\n parserOptions.validate.errors.colorize = this.opts.colorizeErrors;\n\n return this.load()\n .then(async schema => {\n // Because we don't have something akin to `openapi-parser` for Postman collections we just\n // always convert them to OpenAPI.\n return utils.isPostman(schema) ? OASNormalize.convertPostmanToOpenAPI(schema) : schema;\n })\n .then(async schema => {\n if (!utils.isSwagger(schema) && !utils.isOpenAPI(schema)) {\n throw new ValidationError('The supplied API definition is unsupported.');\n } else if (utils.isSwagger(schema)) {\n const baseVersion = parseInt(schema.swagger, 10);\n if (baseVersion === 1) {\n throw new ValidationError('Swagger v1.2 is unsupported.');\n }\n }\n\n /**\n * `OpenAPIParser.validate()` dereferences schemas at the same time as validation, mutating\n * the supplied parameter in the process, and does not give us an option to disable this.\n * As we already have a dereferencing method on this library, and this method just needs to\n * tell us if the API definition is valid or not, we need to clone the schema before\n * supplying it to `openapi-parser`.\n */\n // eslint-disable-next-line try-catch-failsafe/json-parse\n const clonedSchema = JSON.parse(JSON.stringify(schema));\n\n const result = await validate(clonedSchema, parserOptions);\n if (!result.valid) {\n throw new ValidationError(compileErrors(result));\n }\n\n // The API definition, whatever its format or specification, is valid.\n return result;\n });\n }\n\n /**\n * Retrieve OpenAPI, Swagger, or Postman version information about the supplied API definition.\n *\n */\n async version(): Promise<{ specification: 'openapi' | 'postman' | 'swagger'; version: string | 'unknown' }> {\n return this.load().then(schema => {\n switch (utils.getAPIDefinitionType(schema)) {\n case 'openapi':\n return {\n specification: 'openapi',\n version: (schema as unknown as OpenAPIV3.Document).openapi,\n };\n\n case 'postman':\n let version = 'unknown';\n if ((schema?.info as Record<string, string>)?.schema) {\n // Though `info.schema` is required by the Postman spec there's no strictness to its\n // contents so we'll do our best to extract a version out of this schema URL that they\n // seem to usually match. If not we'll fallback to treating it as an `unknown` version.\n const match = (schema?.info as Record<string, string>).schema.match(\n /http(s?):\\/\\/schema.getpostman.com\\/json\\/collection\\/v([0-9.]+)\\//,\n );\n\n if (match) {\n version = match[2];\n }\n }\n\n return {\n specification: 'postman',\n version,\n };\n\n case 'swagger':\n return {\n specification: 'swagger',\n version: (schema as unknown as OpenAPIV2.Document).swagger,\n };\n\n default:\n throw new Error('Unknown file detected.');\n }\n });\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/erunion/code/readme/oas/packages/oas-normalize/dist/lib/errors.cjs"],"names":[],"mappings":"AAAA;AACE;AACF,yDAA8B;AAC9B;AACE;AACF,4DAAC","file":"/Users/erunion/code/readme/oas/packages/oas-normalize/dist/lib/errors.cjs"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/lib/utils.cjs
CHANGED
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
var _chunkK75HC34Mcjs = require('../chunk-K75HC34M.cjs');
|
|
12
11
|
|
|
12
|
+
var _chunkZTTIELJHcjs = require('../chunk-ZTTIELJH.cjs');
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
|
|
@@ -19,5 +19,7 @@ var _chunkK75HC34Mcjs = require('../chunk-K75HC34M.cjs');
|
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
exports.compileErrors = _chunkZTTIELJHcjs.compileErrors; exports.getAPIDefinitionType = _chunkZTTIELJHcjs.getAPIDefinitionType; exports.getType = _chunkZTTIELJHcjs.getType; exports.isAPIDefinition = _chunkZTTIELJHcjs.isAPIDefinition; exports.isBuffer = _chunkZTTIELJHcjs.isBuffer; exports.isOpenAPI = _chunkZTTIELJHcjs.isOpenAPI; exports.isPostman = _chunkZTTIELJHcjs.isPostman; exports.isSwagger = _chunkZTTIELJHcjs.isSwagger; exports.prepareURL = _chunkZTTIELJHcjs.prepareURL; exports.stringToJSON = _chunkZTTIELJHcjs.stringToJSON;
|
|
23
25
|
//# sourceMappingURL=utils.cjs.map
|
package/dist/lib/utils.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/erunion/code/readme/oas/packages/oas-normalize/dist/lib/utils.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,
|
|
1
|
+
{"version":3,"sources":["/Users/erunion/code/readme/oas/packages/oas-normalize/dist/lib/utils.cjs"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,yDAA8B;AAC9B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,qhBAAC","file":"/Users/erunion/code/readme/oas/packages/oas-normalize/dist/lib/utils.cjs"}
|
package/dist/lib/utils.d.cts
CHANGED
|
@@ -1,17 +1,23 @@
|
|
|
1
|
+
export { compileErrors } from '@readme/openapi-parser';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* Determine if a given variable is a `Buffer`.
|
|
3
5
|
*
|
|
4
6
|
*/
|
|
5
7
|
declare function isBuffer(obj: any): boolean;
|
|
6
8
|
/**
|
|
7
|
-
*
|
|
9
|
+
* Deconstruct a URL into a payload for a `fetch` request.
|
|
10
|
+
*
|
|
8
11
|
*/
|
|
9
|
-
declare function
|
|
12
|
+
declare function prepareURL(url: string): {
|
|
13
|
+
options: RequestInit;
|
|
14
|
+
url: string;
|
|
15
|
+
};
|
|
10
16
|
/**
|
|
11
17
|
* Determine the type of a given variable. Returns `false` if unrecognized.
|
|
12
18
|
*
|
|
13
19
|
*/
|
|
14
|
-
declare function getType(obj: any):
|
|
20
|
+
declare function getType(obj: any): 'buffer' | 'json' | 'path' | 'string-json' | 'string-yaml' | 'url' | false;
|
|
15
21
|
/**
|
|
16
22
|
* Determine if a given schema if an OpenAPI definition.
|
|
17
23
|
*
|
|
@@ -48,6 +54,6 @@ declare function isAPIDefinition(schema: Record<string, unknown>): boolean;
|
|
|
48
54
|
* Retrieve the type of API definition that a given schema is.
|
|
49
55
|
*
|
|
50
56
|
*/
|
|
51
|
-
declare function getAPIDefinitionType(schema: Record<string, unknown>):
|
|
57
|
+
declare function getAPIDefinitionType(schema: Record<string, unknown>): 'openapi' | 'postman' | 'swagger' | 'unknown';
|
|
52
58
|
|
|
53
|
-
export { getAPIDefinitionType, getType, isAPIDefinition, isBuffer, isOpenAPI, isPostman, isSwagger,
|
|
59
|
+
export { getAPIDefinitionType, getType, isAPIDefinition, isBuffer, isOpenAPI, isPostman, isSwagger, prepareURL, stringToJSON };
|
package/dist/lib/utils.d.ts
CHANGED
|
@@ -1,17 +1,23 @@
|
|
|
1
|
+
export { compileErrors } from '@readme/openapi-parser';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* Determine if a given variable is a `Buffer`.
|
|
3
5
|
*
|
|
4
6
|
*/
|
|
5
7
|
declare function isBuffer(obj: any): boolean;
|
|
6
8
|
/**
|
|
7
|
-
*
|
|
9
|
+
* Deconstruct a URL into a payload for a `fetch` request.
|
|
10
|
+
*
|
|
8
11
|
*/
|
|
9
|
-
declare function
|
|
12
|
+
declare function prepareURL(url: string): {
|
|
13
|
+
options: RequestInit;
|
|
14
|
+
url: string;
|
|
15
|
+
};
|
|
10
16
|
/**
|
|
11
17
|
* Determine the type of a given variable. Returns `false` if unrecognized.
|
|
12
18
|
*
|
|
13
19
|
*/
|
|
14
|
-
declare function getType(obj: any):
|
|
20
|
+
declare function getType(obj: any): 'buffer' | 'json' | 'path' | 'string-json' | 'string-yaml' | 'url' | false;
|
|
15
21
|
/**
|
|
16
22
|
* Determine if a given schema if an OpenAPI definition.
|
|
17
23
|
*
|
|
@@ -48,6 +54,6 @@ declare function isAPIDefinition(schema: Record<string, unknown>): boolean;
|
|
|
48
54
|
* Retrieve the type of API definition that a given schema is.
|
|
49
55
|
*
|
|
50
56
|
*/
|
|
51
|
-
declare function getAPIDefinitionType(schema: Record<string, unknown>):
|
|
57
|
+
declare function getAPIDefinitionType(schema: Record<string, unknown>): 'openapi' | 'postman' | 'swagger' | 'unknown';
|
|
52
58
|
|
|
53
|
-
export { getAPIDefinitionType, getType, isAPIDefinition, isBuffer, isOpenAPI, isPostman, isSwagger,
|
|
59
|
+
export { getAPIDefinitionType, getType, isAPIDefinition, isBuffer, isOpenAPI, isPostman, isSwagger, prepareURL, stringToJSON };
|
package/dist/lib/utils.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
|
+
compileErrors,
|
|
2
3
|
getAPIDefinitionType,
|
|
3
4
|
getType,
|
|
4
5
|
isAPIDefinition,
|
|
@@ -6,10 +7,11 @@ import {
|
|
|
6
7
|
isOpenAPI,
|
|
7
8
|
isPostman,
|
|
8
9
|
isSwagger,
|
|
9
|
-
|
|
10
|
+
prepareURL,
|
|
10
11
|
stringToJSON
|
|
11
|
-
} from "../chunk-
|
|
12
|
+
} from "../chunk-EHNNEPCG.js";
|
|
12
13
|
export {
|
|
14
|
+
compileErrors,
|
|
13
15
|
getAPIDefinitionType,
|
|
14
16
|
getType,
|
|
15
17
|
isAPIDefinition,
|
|
@@ -17,7 +19,7 @@ export {
|
|
|
17
19
|
isOpenAPI,
|
|
18
20
|
isPostman,
|
|
19
21
|
isSwagger,
|
|
20
|
-
|
|
22
|
+
prepareURL,
|
|
21
23
|
stringToJSON
|
|
22
24
|
};
|
|
23
25
|
//# sourceMappingURL=utils.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oas-normalize",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "13.0.0",
|
|
4
4
|
"description": "Tooling for converting, validating, and parsing OpenAPI, Swagger, and Postman API definitions",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
"require": "./dist/index.cjs",
|
|
9
9
|
"import": "./dist/index.js"
|
|
10
10
|
},
|
|
11
|
+
"./lib/errors": {
|
|
12
|
+
"require": "./dist/lib/errors.cjs",
|
|
13
|
+
"import": "./dist/lib/errors.js"
|
|
14
|
+
},
|
|
11
15
|
"./lib/types": {
|
|
12
16
|
"require": "./dist/lib/types.cjs",
|
|
13
17
|
"import": "./dist/lib/types.js"
|
|
@@ -22,7 +26,7 @@
|
|
|
22
26
|
"module": "dist/index.js",
|
|
23
27
|
"types": "dist/index.d.cts",
|
|
24
28
|
"engines": {
|
|
25
|
-
"node": ">=
|
|
29
|
+
"node": ">=20"
|
|
26
30
|
},
|
|
27
31
|
"files": [
|
|
28
32
|
"dist"
|
|
@@ -52,7 +56,7 @@
|
|
|
52
56
|
"url": "https://github.com/readmeio/oas/issues"
|
|
53
57
|
},
|
|
54
58
|
"scripts": {
|
|
55
|
-
"attw": "attw --pack --format
|
|
59
|
+
"attw": "attw --pack --format ascii --profile node16",
|
|
56
60
|
"bench": "echo 'Please run benchmarks from the root!' && exit 1",
|
|
57
61
|
"build": "tsup",
|
|
58
62
|
"lint": "npm run lint:types && npm run lint:js",
|
|
@@ -64,22 +68,21 @@
|
|
|
64
68
|
},
|
|
65
69
|
"license": "MIT",
|
|
66
70
|
"dependencies": {
|
|
67
|
-
"@readme/openapi-parser": "^
|
|
71
|
+
"@readme/openapi-parser": "^3.0.0",
|
|
68
72
|
"@readme/postman-to-openapi": "^4.1.0",
|
|
69
73
|
"js-yaml": "^4.1.0",
|
|
70
74
|
"openapi-types": "^12.1.3",
|
|
71
75
|
"swagger2openapi": "^7.0.8"
|
|
72
76
|
},
|
|
73
77
|
"devDependencies": {
|
|
74
|
-
"@readme/oas-examples": "^5.
|
|
78
|
+
"@readme/oas-examples": "^5.19.0",
|
|
75
79
|
"@types/js-yaml": "^4.0.9",
|
|
76
80
|
"@types/swagger2openapi": "^7.0.4",
|
|
77
81
|
"eslint": "^8.57.0",
|
|
78
|
-
"nock": "^14.0.0
|
|
79
|
-
"tsup": "^8.0.2",
|
|
82
|
+
"nock": "^14.0.0",
|
|
80
83
|
"typescript": "^5.1.6",
|
|
81
|
-
"vitest": "^
|
|
84
|
+
"vitest": "^3.0.5"
|
|
82
85
|
},
|
|
83
86
|
"prettier": "@readme/eslint-config/prettier",
|
|
84
|
-
"gitHead": "
|
|
87
|
+
"gitHead": "9794d956c5e51149abb030afc94a61d140b5fa3a"
|
|
85
88
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/erunion/code/readme/oas/packages/oas-normalize/dist/chunk-K75HC34M.cjs","../src/lib/utils.ts"],"names":[],"mappings":"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","file":"/Users/erunion/code/readme/oas/packages/oas-normalize/dist/chunk-K75HC34M.cjs","sourcesContent":[null,"import YAML, { JSON_SCHEMA } from 'js-yaml';\n\n/**\n * Determine if a given variable is a `Buffer`.\n *\n */\nexport function isBuffer(obj: any) {\n return (\n obj != null &&\n obj.constructor != null &&\n typeof obj.constructor.isBuffer === 'function' &&\n !!obj.constructor.isBuffer(obj)\n );\n}\n\n/**\n * Converts GitHub blob URLs to raw URLs\n */\nexport function normalizeURL(url: string) {\n if (url.startsWith('https://github.com/') && url.includes('/blob/')) {\n return url.replace('github.com', 'raw.githubusercontent.com').replace('/blob/', '/');\n }\n return url;\n}\n\n/**\n * Determine the type of a given variable. Returns `false` if unrecognized.\n *\n */\nexport function getType(obj: any) {\n if (isBuffer(obj)) {\n return 'buffer';\n } else if (typeof obj === 'object') {\n return 'json';\n } else if (typeof obj === 'string') {\n if (obj.match(/\\s*{/)) {\n return 'string-json';\n } else if (obj.match(/\\n/)) {\n // Not sure about this...\n return 'string-yaml';\n } else if (obj.substring(0, 4) === 'http') {\n return 'url';\n }\n\n return 'path';\n }\n\n return false;\n}\n\n/**\n * Determine if a given schema if an OpenAPI definition.\n *\n */\nexport function isOpenAPI(schema: Record<string, unknown>) {\n return !!schema.openapi;\n}\n\n/**\n * Determine if a given schema is a Postman collection.\n *\n * Unfortunately the Postman schema spec doesn't have anything like `openapi` or `swagger` for us\n * to look at but it does require that `info` and `item` be present and as `item` doesn't exist in\n * OpenAPI or Swagger we can use the combination of those two properties to determine if what we\n * have is a Postman collection.\n *\n * @see {@link https://schema.postman.com/json/collection/v2.0.0/collection.json}\n * @see {@link https://schema.postman.com/json/collection/v2.1.0/collection.json}\n */\nexport function isPostman(schema: Record<string, unknown>): boolean {\n return !!schema.info && !!schema.item;\n}\n\n/**\n * Determine if a given schema if an Swagger definition.\n *\n */\nexport function isSwagger(schema: Record<string, unknown>) {\n return !!schema.swagger;\n}\n\n/**\n * Convert a YAML blob or stringified JSON object into a JSON object.\n *\n */\nexport function stringToJSON(string: Record<string, unknown> | string): Record<string, unknown> {\n if (typeof string === 'object') {\n return string;\n } else if (string.match(/^\\s*{/)) {\n // eslint-disable-next-line try-catch-failsafe/json-parse\n return JSON.parse(string);\n }\n\n return YAML.load(string, { schema: JSON_SCHEMA }) as Record<string, unknown>;\n}\n\n/**\n * Determine if a given schema is an API definition that we can support.\n *\n */\nexport function isAPIDefinition(schema: Record<string, unknown>) {\n return isOpenAPI(schema) || isPostman(schema) || isSwagger(schema);\n}\n\n/**\n * Retrieve the type of API definition that a given schema is.\n *\n */\nexport function getAPIDefinitionType(schema: Record<string, unknown>) {\n if (isOpenAPI(schema)) {\n return 'openapi';\n } else if (isPostman(schema)) {\n return 'postman';\n } else if (isSwagger(schema)) {\n return 'swagger';\n }\n\n return 'unknown';\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/utils.ts"],"sourcesContent":["import YAML, { JSON_SCHEMA } from 'js-yaml';\n\n/**\n * Determine if a given variable is a `Buffer`.\n *\n */\nexport function isBuffer(obj: any) {\n return (\n obj != null &&\n obj.constructor != null &&\n typeof obj.constructor.isBuffer === 'function' &&\n !!obj.constructor.isBuffer(obj)\n );\n}\n\n/**\n * Converts GitHub blob URLs to raw URLs\n */\nexport function normalizeURL(url: string) {\n if (url.startsWith('https://github.com/') && url.includes('/blob/')) {\n return url.replace('github.com', 'raw.githubusercontent.com').replace('/blob/', '/');\n }\n return url;\n}\n\n/**\n * Determine the type of a given variable. Returns `false` if unrecognized.\n *\n */\nexport function getType(obj: any) {\n if (isBuffer(obj)) {\n return 'buffer';\n } else if (typeof obj === 'object') {\n return 'json';\n } else if (typeof obj === 'string') {\n if (obj.match(/\\s*{/)) {\n return 'string-json';\n } else if (obj.match(/\\n/)) {\n // Not sure about this...\n return 'string-yaml';\n } else if (obj.substring(0, 4) === 'http') {\n return 'url';\n }\n\n return 'path';\n }\n\n return false;\n}\n\n/**\n * Determine if a given schema if an OpenAPI definition.\n *\n */\nexport function isOpenAPI(schema: Record<string, unknown>) {\n return !!schema.openapi;\n}\n\n/**\n * Determine if a given schema is a Postman collection.\n *\n * Unfortunately the Postman schema spec doesn't have anything like `openapi` or `swagger` for us\n * to look at but it does require that `info` and `item` be present and as `item` doesn't exist in\n * OpenAPI or Swagger we can use the combination of those two properties to determine if what we\n * have is a Postman collection.\n *\n * @see {@link https://schema.postman.com/json/collection/v2.0.0/collection.json}\n * @see {@link https://schema.postman.com/json/collection/v2.1.0/collection.json}\n */\nexport function isPostman(schema: Record<string, unknown>): boolean {\n return !!schema.info && !!schema.item;\n}\n\n/**\n * Determine if a given schema if an Swagger definition.\n *\n */\nexport function isSwagger(schema: Record<string, unknown>) {\n return !!schema.swagger;\n}\n\n/**\n * Convert a YAML blob or stringified JSON object into a JSON object.\n *\n */\nexport function stringToJSON(string: Record<string, unknown> | string): Record<string, unknown> {\n if (typeof string === 'object') {\n return string;\n } else if (string.match(/^\\s*{/)) {\n // eslint-disable-next-line try-catch-failsafe/json-parse\n return JSON.parse(string);\n }\n\n return YAML.load(string, { schema: JSON_SCHEMA }) as Record<string, unknown>;\n}\n\n/**\n * Determine if a given schema is an API definition that we can support.\n *\n */\nexport function isAPIDefinition(schema: Record<string, unknown>) {\n return isOpenAPI(schema) || isPostman(schema) || isSwagger(schema);\n}\n\n/**\n * Retrieve the type of API definition that a given schema is.\n *\n */\nexport function getAPIDefinitionType(schema: Record<string, unknown>) {\n if (isOpenAPI(schema)) {\n return 'openapi';\n } else if (isPostman(schema)) {\n return 'postman';\n } else if (isSwagger(schema)) {\n return 'swagger';\n }\n\n return 'unknown';\n}\n"],"mappings":";AAAA,OAAO,QAAQ,mBAAmB;AAM3B,SAAS,SAAS,KAAU;AACjC,SACE,OAAO,QACP,IAAI,eAAe,QACnB,OAAO,IAAI,YAAY,aAAa,cACpC,CAAC,CAAC,IAAI,YAAY,SAAS,GAAG;AAElC;AAKO,SAAS,aAAa,KAAa;AACxC,MAAI,IAAI,WAAW,qBAAqB,KAAK,IAAI,SAAS,QAAQ,GAAG;AACnE,WAAO,IAAI,QAAQ,cAAc,2BAA2B,EAAE,QAAQ,UAAU,GAAG;AAAA,EACrF;AACA,SAAO;AACT;AAMO,SAAS,QAAQ,KAAU;AAChC,MAAI,SAAS,GAAG,GAAG;AACjB,WAAO;AAAA,EACT,WAAW,OAAO,QAAQ,UAAU;AAClC,WAAO;AAAA,EACT,WAAW,OAAO,QAAQ,UAAU;AAClC,QAAI,IAAI,MAAM,MAAM,GAAG;AACrB,aAAO;AAAA,IACT,WAAW,IAAI,MAAM,IAAI,GAAG;AAE1B,aAAO;AAAA,IACT,WAAW,IAAI,UAAU,GAAG,CAAC,MAAM,QAAQ;AACzC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAMO,SAAS,UAAU,QAAiC;AACzD,SAAO,CAAC,CAAC,OAAO;AAClB;AAaO,SAAS,UAAU,QAA0C;AAClE,SAAO,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,OAAO;AACnC;AAMO,SAAS,UAAU,QAAiC;AACzD,SAAO,CAAC,CAAC,OAAO;AAClB;AAMO,SAAS,aAAa,QAAmE;AAC9F,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO;AAAA,EACT,WAAW,OAAO,MAAM,OAAO,GAAG;AAEhC,WAAO,KAAK,MAAM,MAAM;AAAA,EAC1B;AAEA,SAAO,KAAK,KAAK,QAAQ,EAAE,QAAQ,YAAY,CAAC;AAClD;AAMO,SAAS,gBAAgB,QAAiC;AAC/D,SAAO,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK,UAAU,MAAM;AACnE;AAMO,SAAS,qBAAqB,QAAiC;AACpE,MAAI,UAAU,MAAM,GAAG;AACrB,WAAO;AAAA,EACT,WAAW,UAAU,MAAM,GAAG;AAC5B,WAAO;AAAA,EACT,WAAW,UAAU,MAAM,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;","names":[]}
|