From f6fdd2f59d035fec22f7fee27136939faae4628b Mon Sep 17 00:00:00 2001 From: Drew Powers <1369770+drwpow@users.noreply.github.com> Date: Fri, 22 Sep 2023 14:48:22 -0600 Subject: [PATCH] Improve YAML vs JSON parsing (#1348) * Improve YAML vs JSON parsing * Clean dist dir --- .changeset/brown-trainers-wink.md | 5 +++ packages/openapi-typescript/package.json | 1 + packages/openapi-typescript/src/load.ts | 53 ++++-------------------- 3 files changed, 13 insertions(+), 46 deletions(-) create mode 100644 .changeset/brown-trainers-wink.md diff --git a/.changeset/brown-trainers-wink.md b/.changeset/brown-trainers-wink.md new file mode 100644 index 000000000..8af89b080 --- /dev/null +++ b/.changeset/brown-trainers-wink.md @@ -0,0 +1,5 @@ +--- +"openapi-typescript": patch +--- + +Improve YAML vs JSON parsing diff --git a/packages/openapi-typescript/package.json b/packages/openapi-typescript/package.json index be69cb445..cf32eec15 100644 --- a/packages/openapi-typescript/package.json +++ b/packages/openapi-typescript/package.json @@ -41,6 +41,7 @@ }, "scripts": { "build": "run-s -s build:*", + "build:clean": "del dist", "build:esm": "tsc -p tsconfig.build.json", "build:cjs": "esbuild --bundle --platform=node --target=es2019 --outfile=dist/index.cjs --external:js-yaml --external:undici src/index.ts --footer:js=\"module.exports = module.exports.default;\"", "dev": "tsc -p tsconfig.build.json --watch", diff --git a/packages/openapi-typescript/src/load.ts b/packages/openapi-typescript/src/load.ts index 4091dd6a7..19535d129 100644 --- a/packages/openapi-typescript/src/load.ts +++ b/packages/openapi-typescript/src/load.ts @@ -14,22 +14,9 @@ interface SchemaMap { const EXT_RE = /\.(yaml|yml|json)#?\/?/i; export const VIRTUAL_JSON_URL = `file:///_json`; // fake URL reserved for dynamic JSON -function parseYAML(schema: string) { - try { - return yaml.load(schema); - } catch (err) { - error(`YAML: ${String(err)}`); - process.exit(1); - } -} - -function parseJSON(schema: string) { - try { - return JSON.parse(schema); - } catch (err) { - error(`JSON: ${String(err)}`); - process.exit(1); - } +/** parse OpenAPI schema s YAML or JSON */ +function parseSchema(source: string) { + return source.trim().startsWith("{") ? JSON.parse(source) : yaml.load(source); } export function resolveSchema(filename: string): URL { @@ -108,8 +95,6 @@ export default async function load(schema: URL | Subschema | Readable, options: } options.urlCache.add(schemaID); - const ext = path.extname(schema.pathname).toLowerCase(); - // remote if (schema.protocol.startsWith("http")) { const headers: Record = { "User-Agent": "openapi-typescript" }; @@ -126,33 +111,13 @@ export default async function load(schema: URL | Subschema | Readable, options: method: (options.httpMethod as Dispatcher.HttpMethod) || "GET", headers, }); - const contentType = res.headers.get("content-type"); - if (ext === ".json" || contentType?.includes("json")) { - options.schemas[schemaID] = { - hint, - schema: parseJSON(await res.text()), - }; - } else if (ext === ".yaml" || ext === ".yml" || contentType?.includes("yaml")) { - options.schemas[schemaID] = { - hint, - schema: parseYAML(await res.text()) as any, // eslint-disable-line @typescript-eslint/no-explicit-any - }; - } + const contents = await res.text(); + options.schemas[schemaID] = { hint, schema: parseSchema(contents) }; } // local file else { const contents = fs.readFileSync(schema, "utf8"); - if (ext === ".yaml" || ext === ".yml") { - options.schemas[schemaID] = { - hint, - schema: parseYAML(contents) as any, // eslint-disable-line @typescript-eslint/no-explicit-any - }; - } else if (ext === ".json") { - options.schemas[schemaID] = { - hint, - schema: parseJSON(contents), - }; - } + options.schemas[schemaID] = { hint, schema: parseSchema(contents) }; } } // 1b. Readable stream @@ -169,11 +134,7 @@ export default async function load(schema: URL | Subschema | Readable, options: resolve(content.trim()); }); }); - // if file starts with '{' assume JSON - options.schemas[schemaID] = { - hint: "OpenAPI3", - schema: contents.startsWith("{") ? parseJSON(contents) : parseYAML(contents), - }; + options.schemas[schemaID] = { hint: "OpenAPI3", schema: parseSchema(contents) }; } // 1c. inline else if (typeof schema === "object") {