oas-normalize 10.1.0 → 11.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{chunk-BYQRNLHY.cjs → chunk-6L2UD42X.cjs} +15 -21
- package/dist/chunk-6L2UD42X.cjs.map +1 -0
- package/dist/{chunk-F3S2V53P.js → chunk-UAOUL4T3.js} +13 -5
- package/dist/chunk-UAOUL4T3.js.map +1 -0
- package/dist/index.cjs +29 -34
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -8
- package/dist/index.d.ts +3 -8
- package/dist/index.js +18 -11
- package/dist/index.js.map +1 -1
- package/dist/lib/types.cjs +1 -0
- package/dist/lib/types.cjs.map +1 -0
- package/dist/lib/types.d.cts +6 -0
- package/dist/lib/types.d.ts +6 -0
- package/dist/lib/types.js +1 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/utils.cjs +22 -43
- package/dist/lib/utils.js +22 -2
- package/dist/lib/utils.js.map +1 -1
- package/package.json +16 -11
- package/dist/chunk-BYQRNLHY.cjs.map +0 -1
- package/dist/chunk-F3S2V53P.js.map +0 -1
- /package/{LICENSE.md → LICENSE} +0 -0
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
<a href="https://npm.im/oas-normalize"><img src="https://img.shields.io/npm/v/oas-normalize?style=for-the-badge" alt="NPM Version"></a>
|
|
13
13
|
<a href="https://npm.im/oas-normalize"><img src="https://img.shields.io/node/v/oas-normalize?style=for-the-badge" alt="Node Version"></a>
|
|
14
14
|
<a href="https://npm.im/oas-normalize"><img src="https://img.shields.io/npm/l/oas-normalize?style=for-the-badge" alt="MIT License"></a>
|
|
15
|
-
<a href="https://github.com/readmeio/oas-normalize"><img src="https://img.shields.io/github/actions/workflow/status/readmeio/oas
|
|
15
|
+
<a href="https://github.com/readmeio/oas/tree/main/packages/oas-normalize"><img src="https://img.shields.io/github/actions/workflow/status/readmeio/oas/ci.yml?branch=main&style=for-the-badge" alt="Build status"></a>
|
|
16
16
|
</p>
|
|
17
17
|
|
|
18
18
|
<p align="center">
|
|
@@ -1,12 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
var YAML = require('js-yaml');
|
|
4
|
-
|
|
5
|
-
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
6
|
-
|
|
7
|
-
var YAML__default = /*#__PURE__*/_interopDefault(YAML);
|
|
8
|
-
|
|
9
|
-
// src/lib/utils.ts
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }// src/lib/utils.ts
|
|
2
|
+
var _jsyaml = require('js-yaml'); var _jsyaml2 = _interopRequireDefault(_jsyaml);
|
|
10
3
|
function isBuffer(obj) {
|
|
11
4
|
return obj != null && obj.constructor != null && typeof obj.constructor.isBuffer === "function" && obj.constructor.isBuffer(obj);
|
|
12
5
|
}
|
|
@@ -48,7 +41,7 @@ function stringToJSON(string) {
|
|
|
48
41
|
} else if (string.match(/^\s*{/)) {
|
|
49
42
|
return JSON.parse(string);
|
|
50
43
|
}
|
|
51
|
-
return
|
|
44
|
+
return _jsyaml2.default.load(string, { schema: _jsyaml.JSON_SCHEMA });
|
|
52
45
|
}
|
|
53
46
|
function isAPIDefinition(schema) {
|
|
54
47
|
return isOpenAPI(schema) || isPostman(schema) || isSwagger(schema);
|
|
@@ -64,14 +57,15 @@ function getAPIDefinitionType(schema) {
|
|
|
64
57
|
return "unknown";
|
|
65
58
|
}
|
|
66
59
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
exports.isBuffer = isBuffer; exports.normalizeURL = normalizeURL; exports.getType = getType; exports.isOpenAPI = isOpenAPI; exports.isPostman = isPostman; exports.isSwagger = isSwagger; exports.stringToJSON = stringToJSON; exports.isAPIDefinition = isAPIDefinition; exports.getAPIDefinitionType = getAPIDefinitionType;
|
|
71
|
+
//# sourceMappingURL=chunk-6L2UD42X.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/utils.ts"],"names":[],"mappings":";AAAA,OAAO,QAAQ,mBAAmB;AAM3B,SAAS,SAAS,KAAU;AACjC,SACE,OAAO,QACP,IAAI,eAAe,QACnB,OAAO,IAAI,YAAY,aAAa,cACpC,IAAI,YAAY,SAAS,GAAG;AAEhC;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,QAA0C;AACrE,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO;AAAA,EACT,WAAW,OAAO,MAAM,OAAO,GAAG;AAChC,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","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: string | Record<string, unknown>) {\n if (typeof string === 'object') {\n return string;\n } else if (string.match(/^\\s*{/)) {\n return JSON.parse(string);\n }\n\n return YAML.load(string, { schema: JSON_SCHEMA });\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,6 +1,5 @@
|
|
|
1
|
-
import YAML, { JSON_SCHEMA } from 'js-yaml';
|
|
2
|
-
|
|
3
1
|
// src/lib/utils.ts
|
|
2
|
+
import YAML, { JSON_SCHEMA } from "js-yaml";
|
|
4
3
|
function isBuffer(obj) {
|
|
5
4
|
return obj != null && obj.constructor != null && typeof obj.constructor.isBuffer === "function" && obj.constructor.isBuffer(obj);
|
|
6
5
|
}
|
|
@@ -58,6 +57,15 @@ function getAPIDefinitionType(schema) {
|
|
|
58
57
|
return "unknown";
|
|
59
58
|
}
|
|
60
59
|
|
|
61
|
-
export {
|
|
62
|
-
|
|
63
|
-
|
|
60
|
+
export {
|
|
61
|
+
isBuffer,
|
|
62
|
+
normalizeURL,
|
|
63
|
+
getType,
|
|
64
|
+
isOpenAPI,
|
|
65
|
+
isPostman,
|
|
66
|
+
isSwagger,
|
|
67
|
+
stringToJSON,
|
|
68
|
+
isAPIDefinition,
|
|
69
|
+
getAPIDefinitionType
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=chunk-UAOUL4T3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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: string | Record<string, unknown>) {\n if (typeof string === 'object') {\n return string;\n } else if (string.match(/^\\s*{/)) {\n return JSON.parse(string);\n }\n\n return YAML.load(string, { schema: JSON_SCHEMA });\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,IAAI,YAAY,SAAS,GAAG;AAEhC;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,QAA0C;AACrE,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO;AAAA,EACT,WAAW,OAAO,MAAM,OAAO,GAAG;AAChC,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":[]}
|
package/dist/index.cjs
CHANGED
|
@@ -1,22 +1,18 @@
|
|
|
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
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
3
|
|
|
5
|
-
var chunkBYQRNLHY_cjs = require('./chunk-BYQRNLHY.cjs');
|
|
6
|
-
var fs = require('fs');
|
|
7
|
-
var openapiParser = require('@readme/openapi-parser');
|
|
8
|
-
var postmanToOpenAPI = require('@readme/postman-to-openapi');
|
|
9
|
-
var converter = require('swagger2openapi');
|
|
10
4
|
|
|
11
|
-
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
5
|
|
|
13
|
-
var fs__default = /*#__PURE__*/_interopDefault(fs);
|
|
14
|
-
var openapiParser__default = /*#__PURE__*/_interopDefault(openapiParser);
|
|
15
|
-
var postmanToOpenAPI__default = /*#__PURE__*/_interopDefault(postmanToOpenAPI);
|
|
16
|
-
var converter__default = /*#__PURE__*/_interopDefault(converter);
|
|
17
6
|
|
|
18
|
-
|
|
19
|
-
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
var _chunk6L2UD42Xcjs = require('./chunk-6L2UD42X.cjs');
|
|
10
|
+
|
|
11
|
+
// src/index.ts
|
|
12
|
+
var _fs = require('fs'); var _fs2 = _interopRequireDefault(_fs);
|
|
13
|
+
var _openapiparser = require('@readme/openapi-parser'); var _openapiparser2 = _interopRequireDefault(_openapiparser);
|
|
14
|
+
var _postmantoopenapi = require('@readme/postman-to-openapi'); var _postmantoopenapi2 = _interopRequireDefault(_postmantoopenapi);
|
|
15
|
+
var _swagger2openapi = require('swagger2openapi'); var _swagger2openapi2 = _interopRequireDefault(_swagger2openapi);
|
|
20
16
|
var OASNormalize = class _OASNormalize {
|
|
21
17
|
constructor(file, opts) {
|
|
22
18
|
this.file = file;
|
|
@@ -25,7 +21,7 @@ var OASNormalize = class _OASNormalize {
|
|
|
25
21
|
enablePaths: false,
|
|
26
22
|
...opts
|
|
27
23
|
};
|
|
28
|
-
this.type =
|
|
24
|
+
this.type = _chunk6L2UD42Xcjs.getType.call(void 0, this.file);
|
|
29
25
|
this.cache = {
|
|
30
26
|
load: false,
|
|
31
27
|
bundle: false,
|
|
@@ -39,7 +35,7 @@ var OASNormalize = class _OASNormalize {
|
|
|
39
35
|
if (this.cache.load)
|
|
40
36
|
return Promise.resolve(this.cache.load);
|
|
41
37
|
const resolve = (obj) => {
|
|
42
|
-
const ret =
|
|
38
|
+
const ret = _chunk6L2UD42Xcjs.stringToJSON.call(void 0, obj);
|
|
43
39
|
this.cache.load = ret;
|
|
44
40
|
return Promise.resolve(ret);
|
|
45
41
|
};
|
|
@@ -51,13 +47,13 @@ var OASNormalize = class _OASNormalize {
|
|
|
51
47
|
case "buffer":
|
|
52
48
|
return resolve(this.file.toString());
|
|
53
49
|
case "url":
|
|
54
|
-
const resp = await fetch(
|
|
50
|
+
const resp = await fetch(_chunk6L2UD42Xcjs.normalizeURL.call(void 0, this.file)).then((res) => res.text());
|
|
55
51
|
return resolve(resp);
|
|
56
52
|
case "path":
|
|
57
53
|
if (!this.opts.enablePaths) {
|
|
58
54
|
return Promise.reject(new Error("Use `opts.enablePaths` to enable accessing local files."));
|
|
59
55
|
}
|
|
60
|
-
const contents =
|
|
56
|
+
const contents = _fs2.default.readFileSync(this.file).toString();
|
|
61
57
|
if (!contents.trim()) {
|
|
62
58
|
return Promise.reject(new Error("No file contents found."));
|
|
63
59
|
}
|
|
@@ -70,7 +66,7 @@ var OASNormalize = class _OASNormalize {
|
|
|
70
66
|
* @private
|
|
71
67
|
*/
|
|
72
68
|
static convertPostmanToOpenAPI(schema) {
|
|
73
|
-
return
|
|
69
|
+
return _postmantoopenapi2.default.call(void 0, JSON.stringify(schema), null, { outputFormat: "json", replaceVars: true }).then(JSON.parse);
|
|
74
70
|
}
|
|
75
71
|
/**
|
|
76
72
|
* Bundle up the given API definition, resolving any external `$ref` pointers in the process.
|
|
@@ -80,11 +76,11 @@ var OASNormalize = class _OASNormalize {
|
|
|
80
76
|
if (this.cache.bundle)
|
|
81
77
|
return Promise.resolve(this.cache.bundle);
|
|
82
78
|
return this.load().then((schema) => {
|
|
83
|
-
if (
|
|
79
|
+
if (_chunk6L2UD42Xcjs.isPostman.call(void 0, schema)) {
|
|
84
80
|
return _OASNormalize.convertPostmanToOpenAPI(schema);
|
|
85
81
|
}
|
|
86
82
|
return schema;
|
|
87
|
-
}).then((schema) =>
|
|
83
|
+
}).then((schema) => _openapiparser2.default.bundle(schema)).then((bundle) => {
|
|
88
84
|
this.cache.bundle = bundle;
|
|
89
85
|
return bundle;
|
|
90
86
|
});
|
|
@@ -97,11 +93,11 @@ var OASNormalize = class _OASNormalize {
|
|
|
97
93
|
if (this.cache.deref)
|
|
98
94
|
return Promise.resolve(this.cache.deref);
|
|
99
95
|
return this.load().then((schema) => {
|
|
100
|
-
if (
|
|
96
|
+
if (_chunk6L2UD42Xcjs.isPostman.call(void 0, schema)) {
|
|
101
97
|
return _OASNormalize.convertPostmanToOpenAPI(schema);
|
|
102
98
|
}
|
|
103
99
|
return schema;
|
|
104
|
-
}).then((schema) =>
|
|
100
|
+
}).then((schema) => _openapiparser2.default.dereference(schema)).then((dereferenced) => {
|
|
105
101
|
this.cache.deref = dereferenced;
|
|
106
102
|
return dereferenced;
|
|
107
103
|
});
|
|
@@ -118,25 +114,25 @@ var OASNormalize = class _OASNormalize {
|
|
|
118
114
|
}
|
|
119
115
|
parserOptions.validate.colorizeErrors = this.opts.colorizeErrors;
|
|
120
116
|
return this.load().then(async (schema) => {
|
|
121
|
-
if (!
|
|
117
|
+
if (!_chunk6L2UD42Xcjs.isPostman.call(void 0, schema)) {
|
|
122
118
|
return schema;
|
|
123
119
|
}
|
|
124
120
|
return _OASNormalize.convertPostmanToOpenAPI(schema);
|
|
125
121
|
}).then(async (schema) => {
|
|
126
|
-
if (!
|
|
122
|
+
if (!_chunk6L2UD42Xcjs.isSwagger.call(void 0, schema) && !_chunk6L2UD42Xcjs.isOpenAPI.call(void 0, schema)) {
|
|
127
123
|
return Promise.reject(new Error("The supplied API definition is unsupported."));
|
|
128
|
-
} else if (
|
|
124
|
+
} else if (_chunk6L2UD42Xcjs.isSwagger.call(void 0, schema)) {
|
|
129
125
|
const baseVersion = parseInt(schema.swagger, 10);
|
|
130
126
|
if (baseVersion === 1) {
|
|
131
127
|
return Promise.reject(new Error("Swagger v1.2 is unsupported."));
|
|
132
128
|
}
|
|
133
129
|
}
|
|
134
130
|
const clonedSchema = JSON.parse(JSON.stringify(schema));
|
|
135
|
-
return
|
|
131
|
+
return _openapiparser2.default.validate(clonedSchema, parserOptions).then(() => {
|
|
136
132
|
if (!convertToLatest) {
|
|
137
133
|
return schema;
|
|
138
134
|
}
|
|
139
|
-
return
|
|
135
|
+
return _swagger2openapi2.default.convertObj(schema, { anchors: true }).then((options) => options.openapi);
|
|
140
136
|
}).catch((err) => Promise.reject(err));
|
|
141
137
|
});
|
|
142
138
|
}
|
|
@@ -146,7 +142,7 @@ var OASNormalize = class _OASNormalize {
|
|
|
146
142
|
*/
|
|
147
143
|
version() {
|
|
148
144
|
return this.load().then((schema) => {
|
|
149
|
-
switch (
|
|
145
|
+
switch (_chunk6L2UD42Xcjs.getAPIDefinitionType.call(void 0, schema)) {
|
|
150
146
|
case "openapi":
|
|
151
147
|
return {
|
|
152
148
|
specification: "openapi",
|
|
@@ -154,7 +150,7 @@ var OASNormalize = class _OASNormalize {
|
|
|
154
150
|
};
|
|
155
151
|
case "postman":
|
|
156
152
|
let version = "unknown";
|
|
157
|
-
if (schema
|
|
153
|
+
if (_optionalChain([schema, 'optionalAccess', _ => _.info, 'optionalAccess', _2 => _2.schema])) {
|
|
158
154
|
const match = schema.info.schema.match(
|
|
159
155
|
/http(s?):\/\/schema.getpostman.com\/json\/collection\/v([0-9.]+)\//
|
|
160
156
|
);
|
|
@@ -178,8 +174,7 @@ var OASNormalize = class _OASNormalize {
|
|
|
178
174
|
}
|
|
179
175
|
};
|
|
180
176
|
|
|
177
|
+
|
|
181
178
|
exports.default = OASNormalize;
|
|
182
|
-
|
|
183
|
-
exports.
|
|
184
|
-
//# sourceMappingURL=out.js.map
|
|
185
|
-
//# sourceMappingURL=index.cjs.map
|
|
179
|
+
|
|
180
|
+
module.exports = exports.default//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["isAPIDefinition","getAPIDefinitionType"],"mappings":"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","sourcesContent":["import type { OpenAPI } from 'openapi-types';\n\nimport fs from 'node:fs';\n\nimport openapiParser from '@readme/openapi-parser';\nimport postmanToOpenAPI from '@readme/postman-to-openapi';\n\nimport converter from 'swagger2openapi';\n\nimport * as utils from './lib/utils';\n\nexport interface Options {\n colorizeErrors?: boolean;\n enablePaths?: boolean;\n}\n\nexport const isAPIDefinition = utils.isAPIDefinition;\nexport const getAPIDefinitionType = utils.getAPIDefinitionType;\n\nexport default class OASNormalize {\n cache: {\n bundle?: false | OpenAPI.Document;\n deref?: false | OpenAPI.Document;\n load?: false | Record<string, unknown>;\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 * @private\n */\n async load() {\n if (this.cache.load) return Promise.resolve(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 Promise.resolve(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 return Promise.reject(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 return Promise.reject(new Error('No file contents found.'));\n }\n return resolve(contents);\n\n default:\n return Promise.reject(new Error('Could not load this file.'));\n }\n }\n\n /**\n * @private\n */\n static convertPostmanToOpenAPI(schema: any) {\n return postmanToOpenAPI(JSON.stringify(schema), null, { outputFormat: 'json', replaceVars: true }).then(JSON.parse);\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 Promise.resolve(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 Promise.resolve(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 * Validate, and potentially convert to OpenAPI, a given API definition.\n *\n */\n async validate(\n opts: {\n /**\n * Automatically convert the supplied API definition to the latest version of OpenAPI.\n */\n convertToLatest?: boolean;\n parser?: openapiParser.Options;\n } = { convertToLatest: false },\n ) {\n const convertToLatest = opts.convertToLatest;\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 if (!utils.isPostman(schema)) {\n return schema;\n }\n\n return OASNormalize.convertPostmanToOpenAPI(schema);\n })\n .then(async schema => {\n if (!utils.isSwagger(schema) && !utils.isOpenAPI(schema)) {\n return Promise.reject(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 return Promise.reject(new Error('Swagger v1.2 is unsupported.'));\n }\n }\n\n /**\n * `openapiParser.validate()` dereferences schemas at the same time as validation and does\n * not give us an option to disable this. Since all we already have a dereferencing method\n * on this library and our `validate()` method here just needs to tell us if the definition\n * is valid or not we need to clone it before passing it over to `openapi-parser` so as to\n * not run into pass-by-reference problems.\n */\n const clonedSchema = JSON.parse(JSON.stringify(schema));\n\n return openapiParser\n .validate(clonedSchema, parserOptions)\n .then(() => {\n if (!convertToLatest) {\n return schema;\n }\n\n return converter\n .convertObj(schema, { anchors: true })\n .then((options: { openapi: OpenAPI.Document }) => options.openapi);\n })\n .catch(err => Promise.reject(err));\n });\n }\n\n /**\n * Retrieve OpenAPI, Swagger, or Postman version information about the supplied API definition.\n *\n */\n version() {\n return this.load().then(schema => {\n switch (getAPIDefinitionType(schema)) {\n case 'openapi':\n return {\n specification: 'openapi',\n version: schema.openapi,\n };\n\n case 'postman':\n let version = 'unknown';\n if (schema?.info?.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.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.swagger,\n };\n\n default:\n throw new Error('Unknown file detected.');\n }\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;AAGA,OAAO,QAAQ;AAEf,OAAO,mBAAmB;AAC1B,OAAO,sBAAsB;AAC7B,OAAO,eAAe;AAItB,IAAqB,eAArB,MAAqB,cAAa;AAAA,EAahC,YAAY,MAAW,MAAgB;AACrC,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,MACV,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,GAAG;AAAA,IACL;AAEA,SAAK,OAAa,QAAQ,KAAK,IAAI;AAEnC,SAAK,QAAQ;AAAA,MACX,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO;AACX,QAAI,KAAK,MAAM;AAAM,aAAO,QAAQ,QAAQ,KAAK,MAAM,IAAI;AAE3D,UAAM,UAAU,CAAC,QAAkD;AACjE,YAAM,MAAY,aAAa,GAAG;AAClC,WAAK,MAAM,OAAO;AAClB,aAAO,QAAQ,QAAQ,GAAG;AAAA,IAC5B;AAEA,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAO,QAAQ,KAAK,IAAI;AAAA,MAE1B,KAAK;AACH,eAAO,QAAQ,KAAK,KAAK,SAAS,CAAC;AAAA,MAErC,KAAK;AACH,cAAM,OAAO,MAAM,MAAY,aAAa,KAAK,IAAI,CAAC,EAAE,KAAK,SAAO,IAAI,KAAK,CAAC;AAC9E,eAAO,QAAQ,IAAI;AAAA,MAErB,KAAK;AAEH,YAAI,CAAC,KAAK,KAAK,aAAa;AAC1B,iBAAO,QAAQ,OAAO,IAAI,MAAM,yDAAyD,CAAC;AAAA,QAC5F;AAEA,cAAM,WAAW,GAAG,aAAa,KAAK,IAAI,EAAE,SAAS;AACrD,YAAI,CAAC,SAAS,KAAK,GAAG;AACpB,iBAAO,QAAQ,OAAO,IAAI,MAAM,yBAAyB,CAAC;AAAA,QAC5D;AACA,eAAO,QAAQ,QAAQ;AAAA,MAEzB;AACE,eAAO,QAAQ,OAAO,IAAI,MAAM,2BAA2B,CAAC;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,wBAAwB,QAAa;AAC1C,WAAO,iBAAiB,KAAK,UAAU,MAAM,GAAG,MAAM,EAAE,cAAc,QAAQ,aAAa,KAAK,CAAC,EAAE,KAAK,KAAK,KAAK;AAAA,EACpH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAS;AACb,QAAI,KAAK,MAAM;AAAQ,aAAO,QAAQ,QAAQ,KAAK,MAAM,MAAM;AAE/D,WAAO,KAAK,KAAK,EACd,KAAK,YAAU;AAId,UAAU,UAAU,MAAM,GAAG;AAC3B,eAAO,cAAa,wBAAwB,MAAM;AAAA,MACpD;AAEA,aAAO;AAAA,IACT,CAAC,EACA,KAAK,YAAU,cAAc,OAAO,MAAM,CAAC,EAC3C,KAAK,YAAU;AACd,WAAK,MAAM,SAAS;AACpB,aAAO;AAAA,IACT,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ;AACZ,QAAI,KAAK,MAAM;AAAO,aAAO,QAAQ,QAAQ,KAAK,MAAM,KAAK;AAE7D,WAAO,KAAK,KAAK,EACd,KAAK,YAAU;AAId,UAAU,UAAU,MAAM,GAAG;AAC3B,eAAO,cAAa,wBAAwB,MAAM;AAAA,MACpD;AAEA,aAAO;AAAA,IACT,CAAC,EACA,KAAK,YAAU,cAAc,YAAY,MAAM,CAAC,EAChD,KAAK,kBAAgB;AACpB,WAAK,MAAM,QAAQ;AACnB,aAAO;AAAA,IACT,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SACJ,OAMI,EAAE,iBAAiB,MAAM,GAC7B;AACA,UAAM,kBAAkB,KAAK;AAC7B,UAAM,gBAAgB,KAAK,UAAU,CAAC;AACtC,QAAI,CAAC,cAAc,UAAU;AAC3B,oBAAc,WAAW,CAAC;AAAA,IAC5B;AAEA,kBAAc,SAAS,iBAAiB,KAAK,KAAK;AAElD,WAAO,KAAK,KAAK,EACd,KAAK,OAAM,WAAU;AACpB,UAAI,CAAO,UAAU,MAAM,GAAG;AAC5B,eAAO;AAAA,MACT;AAEA,aAAO,cAAa,wBAAwB,MAAM;AAAA,IACpD,CAAC,EACA,KAAK,OAAM,WAAU;AACpB,UAAI,CAAO,UAAU,MAAM,KAAK,CAAO,UAAU,MAAM,GAAG;AACxD,eAAO,QAAQ,OAAO,IAAI,MAAM,6CAA6C,CAAC;AAAA,MAChF,WAAiB,UAAU,MAAM,GAAG;AAClC,cAAM,cAAc,SAAS,OAAO,SAAS,EAAE;AAC/C,YAAI,gBAAgB,GAAG;AACrB,iBAAO,QAAQ,OAAO,IAAI,MAAM,8BAA8B,CAAC;AAAA,QACjE;AAAA,MACF;AASA,YAAM,eAAe,KAAK,MAAM,KAAK,UAAU,MAAM,CAAC;AAEtD,aAAO,cACJ,SAAS,cAAc,aAAa,EACpC,KAAK,MAAM;AACV,YAAI,CAAC,iBAAiB;AACpB,iBAAO;AAAA,QACT;AAEA,eAAO,UACJ,WAAW,QAAQ,EAAE,SAAS,KAAK,CAAC,EACpC,KAAK,CAAC,YAA2C,QAAQ,OAAO;AAAA,MACrE,CAAC,EACA,MAAM,SAAO,QAAQ,OAAO,GAAG,CAAC;AAAA,IACrC,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU;AACR,WAAO,KAAK,KAAK,EAAE,KAAK,YAAU;AAChC,cAAc,qBAAqB,MAAM,GAAG;AAAA,QAC1C,KAAK;AACH,iBAAO;AAAA,YACL,eAAe;AAAA,YACf,SAAS,OAAO;AAAA,UAClB;AAAA,QAEF,KAAK;AACH,cAAI,UAAU;AACd,cAAI,QAAQ,MAAM,QAAQ;AAIxB,kBAAM,QAAQ,OAAO,KAAK,OAAO;AAAA,cAC/B;AAAA,YACF;AAEA,gBAAI,OAAO;AACT,wBAAU,MAAM,CAAC;AAAA,YACnB;AAAA,UACF;AAEA,iBAAO;AAAA,YACL,eAAe;AAAA,YACf;AAAA,UACF;AAAA,QAEF,KAAK;AACH,iBAAO;AAAA,YACL,eAAe;AAAA,YACf,SAAS,OAAO;AAAA,UAClB;AAAA,QAEF;AACE,gBAAM,IAAI,MAAM,wBAAwB;AAAA,MAC5C;AAAA,IACF,CAAC;AAAA,EACH;AACF","sourcesContent":["import type { Options } from './lib/types.js';\nimport type { OpenAPI } 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?: false | OpenAPI.Document;\n deref?: false | OpenAPI.Document;\n load?: false | Record<string, unknown>;\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 * @private\n */\n async load() {\n if (this.cache.load) return Promise.resolve(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 Promise.resolve(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 return Promise.reject(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 return Promise.reject(new Error('No file contents found.'));\n }\n return resolve(contents);\n\n default:\n return Promise.reject(new Error('Could not load this file.'));\n }\n }\n\n /**\n * @private\n */\n static convertPostmanToOpenAPI(schema: any) {\n return postmanToOpenAPI(JSON.stringify(schema), null, { outputFormat: 'json', replaceVars: true }).then(JSON.parse);\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 Promise.resolve(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 Promise.resolve(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 * Validate, and potentially convert to OpenAPI, a given API definition.\n *\n */\n async validate(\n opts: {\n /**\n * Automatically convert the supplied API definition to the latest version of OpenAPI.\n */\n convertToLatest?: boolean;\n parser?: openapiParser.Options;\n } = { convertToLatest: false },\n ) {\n const convertToLatest = opts.convertToLatest;\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 if (!utils.isPostman(schema)) {\n return schema;\n }\n\n return OASNormalize.convertPostmanToOpenAPI(schema);\n })\n .then(async schema => {\n if (!utils.isSwagger(schema) && !utils.isOpenAPI(schema)) {\n return Promise.reject(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 return Promise.reject(new Error('Swagger v1.2 is unsupported.'));\n }\n }\n\n /**\n * `openapiParser.validate()` dereferences schemas at the same time as validation and does\n * not give us an option to disable this. Since all we already have a dereferencing method\n * on this library and our `validate()` method here just needs to tell us if the definition\n * is valid or not we need to clone it before passing it over to `openapi-parser` so as to\n * not run into pass-by-reference problems.\n */\n const clonedSchema = JSON.parse(JSON.stringify(schema));\n\n return openapiParser\n .validate(clonedSchema, parserOptions)\n .then(() => {\n if (!convertToLatest) {\n return schema;\n }\n\n return converter\n .convertObj(schema, { anchors: true })\n .then((options: { openapi: OpenAPI.Document }) => options.openapi);\n })\n .catch(err => Promise.reject(err));\n });\n }\n\n /**\n * Retrieve OpenAPI, Swagger, or Postman version information about the supplied API definition.\n *\n */\n version() {\n return this.load().then(schema => {\n switch (utils.getAPIDefinitionType(schema)) {\n case 'openapi':\n return {\n specification: 'openapi',\n version: schema.openapi,\n };\n\n case 'postman':\n let version = 'unknown';\n if (schema?.info?.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.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.swagger,\n };\n\n default:\n throw new Error('Unknown file detected.');\n }\n });\n }\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,13 +1,8 @@
|
|
|
1
|
+
import { Options } from './lib/types.cjs';
|
|
1
2
|
import { OpenAPI } from 'openapi-types';
|
|
2
3
|
import openapiParser from '@readme/openapi-parser';
|
|
3
|
-
import {
|
|
4
|
+
import { getType } from './lib/utils.cjs';
|
|
4
5
|
|
|
5
|
-
interface Options {
|
|
6
|
-
colorizeErrors?: boolean;
|
|
7
|
-
enablePaths?: boolean;
|
|
8
|
-
}
|
|
9
|
-
declare const isAPIDefinition: typeof isAPIDefinition$1;
|
|
10
|
-
declare const getAPIDefinitionType: typeof getAPIDefinitionType$1;
|
|
11
6
|
declare class OASNormalize {
|
|
12
7
|
cache: {
|
|
13
8
|
bundle?: false | OpenAPI.Document;
|
|
@@ -57,4 +52,4 @@ declare class OASNormalize {
|
|
|
57
52
|
}>;
|
|
58
53
|
}
|
|
59
54
|
|
|
60
|
-
export
|
|
55
|
+
export = OASNormalize;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,8 @@
|
|
|
1
|
+
import { Options } from './lib/types.js';
|
|
1
2
|
import { OpenAPI } from 'openapi-types';
|
|
2
3
|
import openapiParser from '@readme/openapi-parser';
|
|
3
|
-
import {
|
|
4
|
+
import { getType } from './lib/utils.js';
|
|
4
5
|
|
|
5
|
-
interface Options {
|
|
6
|
-
colorizeErrors?: boolean;
|
|
7
|
-
enablePaths?: boolean;
|
|
8
|
-
}
|
|
9
|
-
declare const isAPIDefinition: typeof isAPIDefinition$1;
|
|
10
|
-
declare const getAPIDefinitionType: typeof getAPIDefinitionType$1;
|
|
11
6
|
declare class OASNormalize {
|
|
12
7
|
cache: {
|
|
13
8
|
bundle?: false | OpenAPI.Document;
|
|
@@ -57,4 +52,4 @@ declare class OASNormalize {
|
|
|
57
52
|
}>;
|
|
58
53
|
}
|
|
59
54
|
|
|
60
|
-
export {
|
|
55
|
+
export { OASNormalize as default };
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import {
|
|
2
|
+
getAPIDefinitionType,
|
|
3
|
+
getType,
|
|
4
|
+
isOpenAPI,
|
|
5
|
+
isPostman,
|
|
6
|
+
isSwagger,
|
|
7
|
+
normalizeURL,
|
|
8
|
+
stringToJSON
|
|
9
|
+
} from "./chunk-UAOUL4T3.js";
|
|
6
10
|
|
|
7
|
-
|
|
8
|
-
|
|
11
|
+
// src/index.ts
|
|
12
|
+
import fs from "fs";
|
|
13
|
+
import openapiParser from "@readme/openapi-parser";
|
|
14
|
+
import postmanToOpenAPI from "@readme/postman-to-openapi";
|
|
15
|
+
import converter from "swagger2openapi";
|
|
9
16
|
var OASNormalize = class _OASNormalize {
|
|
10
17
|
constructor(file, opts) {
|
|
11
18
|
this.file = file;
|
|
@@ -135,7 +142,7 @@ var OASNormalize = class _OASNormalize {
|
|
|
135
142
|
*/
|
|
136
143
|
version() {
|
|
137
144
|
return this.load().then((schema) => {
|
|
138
|
-
switch (
|
|
145
|
+
switch (getAPIDefinitionType(schema)) {
|
|
139
146
|
case "openapi":
|
|
140
147
|
return {
|
|
141
148
|
specification: "openapi",
|
|
@@ -166,7 +173,7 @@ var OASNormalize = class _OASNormalize {
|
|
|
166
173
|
});
|
|
167
174
|
}
|
|
168
175
|
};
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
176
|
+
export {
|
|
177
|
+
OASNormalize as default
|
|
178
|
+
};
|
|
172
179
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":["isAPIDefinition","getAPIDefinitionType"],"mappings":"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","sourcesContent":["import type { OpenAPI } from 'openapi-types';\n\nimport fs from 'node:fs';\n\nimport openapiParser from '@readme/openapi-parser';\nimport postmanToOpenAPI from '@readme/postman-to-openapi';\n\nimport converter from 'swagger2openapi';\n\nimport * as utils from './lib/utils';\n\nexport interface Options {\n colorizeErrors?: boolean;\n enablePaths?: boolean;\n}\n\nexport const isAPIDefinition = utils.isAPIDefinition;\nexport const getAPIDefinitionType = utils.getAPIDefinitionType;\n\nexport default class OASNormalize {\n cache: {\n bundle?: false | OpenAPI.Document;\n deref?: false | OpenAPI.Document;\n load?: false | Record<string, unknown>;\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 * @private\n */\n async load() {\n if (this.cache.load) return Promise.resolve(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 Promise.resolve(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 return Promise.reject(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 return Promise.reject(new Error('No file contents found.'));\n }\n return resolve(contents);\n\n default:\n return Promise.reject(new Error('Could not load this file.'));\n }\n }\n\n /**\n * @private\n */\n static convertPostmanToOpenAPI(schema: any) {\n return postmanToOpenAPI(JSON.stringify(schema), null, { outputFormat: 'json', replaceVars: true }).then(JSON.parse);\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 Promise.resolve(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 Promise.resolve(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 * Validate, and potentially convert to OpenAPI, a given API definition.\n *\n */\n async validate(\n opts: {\n /**\n * Automatically convert the supplied API definition to the latest version of OpenAPI.\n */\n convertToLatest?: boolean;\n parser?: openapiParser.Options;\n } = { convertToLatest: false },\n ) {\n const convertToLatest = opts.convertToLatest;\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 if (!utils.isPostman(schema)) {\n return schema;\n }\n\n return OASNormalize.convertPostmanToOpenAPI(schema);\n })\n .then(async schema => {\n if (!utils.isSwagger(schema) && !utils.isOpenAPI(schema)) {\n return Promise.reject(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 return Promise.reject(new Error('Swagger v1.2 is unsupported.'));\n }\n }\n\n /**\n * `openapiParser.validate()` dereferences schemas at the same time as validation and does\n * not give us an option to disable this. Since all we already have a dereferencing method\n * on this library and our `validate()` method here just needs to tell us if the definition\n * is valid or not we need to clone it before passing it over to `openapi-parser` so as to\n * not run into pass-by-reference problems.\n */\n const clonedSchema = JSON.parse(JSON.stringify(schema));\n\n return openapiParser\n .validate(clonedSchema, parserOptions)\n .then(() => {\n if (!convertToLatest) {\n return schema;\n }\n\n return converter\n .convertObj(schema, { anchors: true })\n .then((options: { openapi: OpenAPI.Document }) => options.openapi);\n })\n .catch(err => Promise.reject(err));\n });\n }\n\n /**\n * Retrieve OpenAPI, Swagger, or Postman version information about the supplied API definition.\n *\n */\n version() {\n return this.load().then(schema => {\n switch (getAPIDefinitionType(schema)) {\n case 'openapi':\n return {\n specification: 'openapi',\n version: schema.openapi,\n };\n\n case 'postman':\n let version = 'unknown';\n if (schema?.info?.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.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.swagger,\n };\n\n default:\n throw new Error('Unknown file detected.');\n }\n });\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { Options } from './lib/types.js';\nimport type { OpenAPI } 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?: false | OpenAPI.Document;\n deref?: false | OpenAPI.Document;\n load?: false | Record<string, unknown>;\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 * @private\n */\n async load() {\n if (this.cache.load) return Promise.resolve(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 Promise.resolve(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 return Promise.reject(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 return Promise.reject(new Error('No file contents found.'));\n }\n return resolve(contents);\n\n default:\n return Promise.reject(new Error('Could not load this file.'));\n }\n }\n\n /**\n * @private\n */\n static convertPostmanToOpenAPI(schema: any) {\n return postmanToOpenAPI(JSON.stringify(schema), null, { outputFormat: 'json', replaceVars: true }).then(JSON.parse);\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 Promise.resolve(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 Promise.resolve(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 * Validate, and potentially convert to OpenAPI, a given API definition.\n *\n */\n async validate(\n opts: {\n /**\n * Automatically convert the supplied API definition to the latest version of OpenAPI.\n */\n convertToLatest?: boolean;\n parser?: openapiParser.Options;\n } = { convertToLatest: false },\n ) {\n const convertToLatest = opts.convertToLatest;\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 if (!utils.isPostman(schema)) {\n return schema;\n }\n\n return OASNormalize.convertPostmanToOpenAPI(schema);\n })\n .then(async schema => {\n if (!utils.isSwagger(schema) && !utils.isOpenAPI(schema)) {\n return Promise.reject(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 return Promise.reject(new Error('Swagger v1.2 is unsupported.'));\n }\n }\n\n /**\n * `openapiParser.validate()` dereferences schemas at the same time as validation and does\n * not give us an option to disable this. Since all we already have a dereferencing method\n * on this library and our `validate()` method here just needs to tell us if the definition\n * is valid or not we need to clone it before passing it over to `openapi-parser` so as to\n * not run into pass-by-reference problems.\n */\n const clonedSchema = JSON.parse(JSON.stringify(schema));\n\n return openapiParser\n .validate(clonedSchema, parserOptions)\n .then(() => {\n if (!convertToLatest) {\n return schema;\n }\n\n return converter\n .convertObj(schema, { anchors: true })\n .then((options: { openapi: OpenAPI.Document }) => options.openapi);\n })\n .catch(err => Promise.reject(err));\n });\n }\n\n /**\n * Retrieve OpenAPI, Swagger, or Postman version information about the supplied API definition.\n *\n */\n version() {\n return this.load().then(schema => {\n switch (utils.getAPIDefinitionType(schema)) {\n case 'openapi':\n return {\n specification: 'openapi',\n version: schema.openapi,\n };\n\n case 'postman':\n let version = 'unknown';\n if (schema?.info?.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.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.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
|
+
"use strict";//# sourceMappingURL=types.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/lib/utils.cjs
CHANGED
|
@@ -1,44 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
Object.defineProperty(exports, 'isOpenAPI', {
|
|
24
|
-
enumerable: true,
|
|
25
|
-
get: function () { return chunkBYQRNLHY_cjs.isOpenAPI; }
|
|
26
|
-
});
|
|
27
|
-
Object.defineProperty(exports, 'isPostman', {
|
|
28
|
-
enumerable: true,
|
|
29
|
-
get: function () { return chunkBYQRNLHY_cjs.isPostman; }
|
|
30
|
-
});
|
|
31
|
-
Object.defineProperty(exports, 'isSwagger', {
|
|
32
|
-
enumerable: true,
|
|
33
|
-
get: function () { return chunkBYQRNLHY_cjs.isSwagger; }
|
|
34
|
-
});
|
|
35
|
-
Object.defineProperty(exports, 'normalizeURL', {
|
|
36
|
-
enumerable: true,
|
|
37
|
-
get: function () { return chunkBYQRNLHY_cjs.normalizeURL; }
|
|
38
|
-
});
|
|
39
|
-
Object.defineProperty(exports, 'stringToJSON', {
|
|
40
|
-
enumerable: true,
|
|
41
|
-
get: function () { return chunkBYQRNLHY_cjs.stringToJSON; }
|
|
42
|
-
});
|
|
43
|
-
//# sourceMappingURL=out.js.map
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
var _chunk6L2UD42Xcjs = require('../chunk-6L2UD42X.cjs');
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
exports.getAPIDefinitionType = _chunk6L2UD42Xcjs.getAPIDefinitionType; exports.getType = _chunk6L2UD42Xcjs.getType; exports.isAPIDefinition = _chunk6L2UD42Xcjs.isAPIDefinition; exports.isBuffer = _chunk6L2UD42Xcjs.isBuffer; exports.isOpenAPI = _chunk6L2UD42Xcjs.isOpenAPI; exports.isPostman = _chunk6L2UD42Xcjs.isPostman; exports.isSwagger = _chunk6L2UD42Xcjs.isSwagger; exports.normalizeURL = _chunk6L2UD42Xcjs.normalizeURL; exports.stringToJSON = _chunk6L2UD42Xcjs.stringToJSON;
|
|
44
23
|
//# sourceMappingURL=utils.cjs.map
|
package/dist/lib/utils.js
CHANGED
|
@@ -1,3 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
getAPIDefinitionType,
|
|
3
|
+
getType,
|
|
4
|
+
isAPIDefinition,
|
|
5
|
+
isBuffer,
|
|
6
|
+
isOpenAPI,
|
|
7
|
+
isPostman,
|
|
8
|
+
isSwagger,
|
|
9
|
+
normalizeURL,
|
|
10
|
+
stringToJSON
|
|
11
|
+
} from "../chunk-UAOUL4T3.js";
|
|
12
|
+
export {
|
|
13
|
+
getAPIDefinitionType,
|
|
14
|
+
getType,
|
|
15
|
+
isAPIDefinition,
|
|
16
|
+
isBuffer,
|
|
17
|
+
isOpenAPI,
|
|
18
|
+
isPostman,
|
|
19
|
+
isSwagger,
|
|
20
|
+
normalizeURL,
|
|
21
|
+
stringToJSON
|
|
22
|
+
};
|
|
3
23
|
//# sourceMappingURL=utils.js.map
|
package/dist/lib/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "oas-normalize",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "11.0.1",
|
|
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/types": {
|
|
12
|
+
"require": "./dist/lib/types.cjs",
|
|
13
|
+
"import": "./dist/lib/types.js"
|
|
14
|
+
},
|
|
11
15
|
"./lib/utils": {
|
|
12
16
|
"require": "./dist/lib/utils.cjs",
|
|
13
17
|
"import": "./dist/lib/utils.js"
|
|
@@ -41,20 +45,21 @@
|
|
|
41
45
|
],
|
|
42
46
|
"repository": {
|
|
43
47
|
"type": "git",
|
|
44
|
-
"url": "git://github.com/readmeio/oas
|
|
48
|
+
"url": "git://github.com/readmeio/oas.git",
|
|
49
|
+
"directory": "packages/oas-normalize"
|
|
45
50
|
},
|
|
46
51
|
"bugs": {
|
|
47
|
-
"url": "https://github.com/readmeio/oas
|
|
52
|
+
"url": "https://github.com/readmeio/oas/issues"
|
|
48
53
|
},
|
|
49
54
|
"scripts": {
|
|
55
|
+
"attw": "attw --pack --format table-flipped",
|
|
50
56
|
"build": "tsup",
|
|
51
|
-
"lint": "
|
|
57
|
+
"lint": "npm run lint:types && npm run lint:js",
|
|
58
|
+
"lint:js": "eslint . --ext .js,.ts --ignore-path ../../.gitignore",
|
|
59
|
+
"lint:types": "tsc --noEmit",
|
|
52
60
|
"prebuild": "rm -rf dist/",
|
|
53
61
|
"prepack": "npm run build",
|
|
54
|
-
"
|
|
55
|
-
"prettier": "prettier --list-different \"./**/**.{md,js,ts}\"",
|
|
56
|
-
"prettier:write": "prettier --list-different --write \"./**/**.{md,js,ts}\"",
|
|
57
|
-
"test": "vitest --coverage"
|
|
62
|
+
"test": "vitest run --coverage"
|
|
58
63
|
},
|
|
59
64
|
"license": "MIT",
|
|
60
65
|
"dependencies": {
|
|
@@ -65,16 +70,16 @@
|
|
|
65
70
|
"swagger2openapi": "^7.0.8"
|
|
66
71
|
},
|
|
67
72
|
"devDependencies": {
|
|
68
|
-
"@readme/eslint-config": "^12.0.2",
|
|
69
73
|
"@readme/oas-examples": "^5.12.0",
|
|
70
74
|
"@types/js-yaml": "^4.0.5",
|
|
75
|
+
"@types/swagger2openapi": "^7.0.1",
|
|
71
76
|
"@vitest/coverage-v8": "^0.34.1",
|
|
72
77
|
"eslint": "^8.46.0",
|
|
73
78
|
"fetch-mock": "^9.11.0",
|
|
74
|
-
"prettier": "^3.0.1",
|
|
75
79
|
"tsup": "^7.2.0",
|
|
76
80
|
"typescript": "^5.1.6",
|
|
77
81
|
"vitest": "^0.34.1"
|
|
78
82
|
},
|
|
79
|
-
"prettier": "@readme/eslint-config/prettier"
|
|
83
|
+
"prettier": "@readme/eslint-config/prettier",
|
|
84
|
+
"gitHead": "f7476178b1a63e94cc3d604b2755401caeb65527"
|
|
80
85
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/utils.ts"],"names":[],"mappings":";AAAA,OAAO,QAAQ,mBAAmB;AAK3B,SAAS,SAAS,KAAU;AACjC,SACE,OAAO,QACP,IAAI,eAAe,QACnB,OAAO,IAAI,YAAY,aAAa,cACpC,IAAI,YAAY,SAAS,GAAG;AAEhC;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,QAA0C;AACrE,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO;AAAA,EACT,WAAW,OAAO,MAAM,OAAO,GAAG;AAChC,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","sourcesContent":["import YAML, { JSON_SCHEMA } from 'js-yaml';\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: string | Record<string, unknown>) {\n if (typeof string === 'object') {\n return string;\n } else if (string.match(/^\\s*{/)) {\n return JSON.parse(string);\n }\n\n return YAML.load(string, { schema: JSON_SCHEMA });\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"],"names":[],"mappings":";AAAA,OAAO,QAAQ,mBAAmB;AAK3B,SAAS,SAAS,KAAU;AACjC,SACE,OAAO,QACP,IAAI,eAAe,QACnB,OAAO,IAAI,YAAY,aAAa,cACpC,IAAI,YAAY,SAAS,GAAG;AAEhC;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,QAA0C;AACrE,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO;AAAA,EACT,WAAW,OAAO,MAAM,OAAO,GAAG;AAChC,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","sourcesContent":["import YAML, { JSON_SCHEMA } from 'js-yaml';\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: string | Record<string, unknown>) {\n if (typeof string === 'object') {\n return string;\n } else if (string.match(/^\\s*{/)) {\n return JSON.parse(string);\n }\n\n return YAML.load(string, { schema: JSON_SCHEMA });\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"]}
|
/package/{LICENSE.md → LICENSE}
RENAMED
|
File without changes
|