From 4d944459f2b5947e4ad780a9ef077e5c0ed87aba Mon Sep 17 00:00:00 2001 From: Jon Ursenbach Date: Fri, 24 Jan 2025 14:38:31 -0800 Subject: [PATCH] feat: upgrading our openapi parser to support OAS 3.1.1 and 3.0.4 --- package-lock.json | 69 ++++++------------- packages/oas-normalize/package.json | 4 +- .../test/__snapshots__/index.test.ts.snap | 14 ++++ packages/oas-normalize/test/index.test.ts | 5 +- packages/oas-normalize/vitest.config.mts | 13 ++++ packages/oas/package.json | 2 +- 6 files changed, 51 insertions(+), 56 deletions(-) create mode 100644 packages/oas-normalize/vitest.config.mts diff --git a/package-lock.json b/package-lock.json index 9e636432..8b863cef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1234,9 +1234,9 @@ } }, "node_modules/@mswjs/interceptors": { - "version": "0.36.5", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.36.5.tgz", - "integrity": "sha512-aQ8WF5zQwOdcxLsxSEk9Jd01GgGb80xxqCaiDDlewhtwqpSm8MOvUHslwPydVirasdW09++NxDNNftm1vLY8yA==", + "version": "0.37.5", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.37.5.tgz", + "integrity": "sha512-AAwRb5vXFcY4L+FvZ7LZusDuZ0vEe0Zm8ohn1FM6/X7A3bj4mqmkAcGRWuvC2JwSygNwHAAmMnAI73vPHeqsHA==", "dev": true, "license": "MIT", "dependencies": { @@ -2188,21 +2188,20 @@ } }, "node_modules/@readme/better-ajv-errors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@readme/better-ajv-errors/-/better-ajv-errors-1.6.0.tgz", - "integrity": "sha512-9gO9rld84Jgu13kcbKRU+WHseNhaVt76wYMeRDGsUGYxwJtI3RmEJ9LY9dZCYQGI8eUZLuxb5qDja0nqklpFjQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@readme/better-ajv-errors/-/better-ajv-errors-2.0.0.tgz", + "integrity": "sha512-RquGi4rLHJNBIdlp+28x3a0T1m3NTbDMkAIAxE+u0pVEF2cBGSyfwbNT77lRWqKveOod0ua3MW5S+czTR3cExw==", "license": "Apache-2.0", "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/runtime": "^7.21.0", + "@babel/code-frame": "^7.22.5", + "@babel/runtime": "^7.22.5", "@humanwhocodes/momoa": "^2.0.3", "chalk": "^4.1.2", - "json-to-ast": "^2.0.3", "jsonpointer": "^5.0.0", "leven": "^3.1.0" }, "engines": { - "node": ">=14" + "node": ">=18" }, "peerDependencies": { "ajv": "4.11.8 - 8" @@ -2303,14 +2302,14 @@ "link": true }, "node_modules/@readme/openapi-parser": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@readme/openapi-parser/-/openapi-parser-2.6.0.tgz", - "integrity": "sha512-pyFJXezWj9WI1O+gdp95CoxfY+i+Uq3kKk4zXIFuRAZi9YnHpHOpjumWWr67wkmRTw19Hskh9spyY0Iyikf3fA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@readme/openapi-parser/-/openapi-parser-2.7.0.tgz", + "integrity": "sha512-P8WSr8WTOxilnT89tcCRKWYsG/II4sAwt1a/DIWub8xTtkrG9cCBBy/IUcvc5X8oGWN82MwcTA3uEkDrXZd/7A==", "license": "MIT", "dependencies": { "@apidevtools/swagger-methods": "^3.0.2", "@jsdevtools/ono": "^7.1.3", - "@readme/better-ajv-errors": "^1.6.0", + "@readme/better-ajv-errors": "^2.0.0", "@readme/json-schema-ref-parser": "^1.2.0", "@readme/openapi-schemas": "^3.1.0", "ajv": "^8.12.0", @@ -4916,15 +4915,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/code-error-fragment": { - "version": "0.0.230", - "resolved": "https://registry.npmjs.org/code-error-fragment/-/code-error-fragment-0.0.230.tgz", - "integrity": "sha512-cadkfKp6932H8UkhzE/gcUqhRMNf8jHzkAN7+5Myabswaghu4xABTgPHDCjW+dBAJxj/SpkTYokpzDqY4pCzQw==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -9512,12 +9502,6 @@ "dev": true, "license": "ISC" }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "license": "MIT" - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -11312,19 +11296,6 @@ "dev": true, "license": "ISC" }, - "node_modules/json-to-ast": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json-to-ast/-/json-to-ast-2.1.0.tgz", - "integrity": "sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ==", - "license": "MIT", - "dependencies": { - "code-error-fragment": "0.0.230", - "grapheme-splitter": "^1.0.4" - }, - "engines": { - "node": ">= 4" - } - }, "node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", @@ -14016,13 +13987,13 @@ } }, "node_modules/nock": { - "version": "14.0.0-beta.15", - "resolved": "https://registry.npmjs.org/nock/-/nock-14.0.0-beta.15.tgz", - "integrity": "sha512-rp72chatxoZbR/2cYHwtb+IX6n6kkanYKGN2PKn4c12JBrj9n4xGUKFykuQHB+Gkz3fynlikFbMH2LI6VoebuQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/nock/-/nock-14.0.0.tgz", + "integrity": "sha512-3Z2ZoZoYTR/y2I+NI16+6IzfZFKBX7MrADtoBAm7v/QKqxQUhKw+Dh+847PPS1j/FDutjfIXfrh3CJF74yITWg==", "dev": true, "license": "MIT", "dependencies": { - "@mswjs/interceptors": "^0.36.4", + "@mswjs/interceptors": "^0.37.3", "json-stringify-safe": "^5.0.1", "propagate": "^2.0.0" }, @@ -20627,7 +20598,7 @@ }, "devDependencies": { "@readme/oas-examples": "^5.13.0", - "@readme/openapi-parser": "^2.6.0", + "@readme/openapi-parser": "^2.7.0", "@types/json-schema-merge-allof": "^0.6.5", "@types/memoizee": "^0.4.11", "@types/node": "^22.7.6", @@ -20643,7 +20614,7 @@ "version": "12.0.0", "license": "MIT", "dependencies": { - "@readme/openapi-parser": "^2.6.0", + "@readme/openapi-parser": "^2.7.0", "@readme/postman-to-openapi": "^4.1.0", "js-yaml": "^4.1.0", "openapi-types": "^12.1.3", @@ -20654,7 +20625,7 @@ "@types/js-yaml": "^4.0.9", "@types/swagger2openapi": "^7.0.4", "eslint": "^8.57.0", - "nock": "^14.0.0-beta.12", + "nock": "^14.0.0", "tsup": "^8.0.2", "typescript": "^5.1.6", "vitest": "^2.1.3" diff --git a/packages/oas-normalize/package.json b/packages/oas-normalize/package.json index c4530987..a3fb8221 100644 --- a/packages/oas-normalize/package.json +++ b/packages/oas-normalize/package.json @@ -64,7 +64,7 @@ }, "license": "MIT", "dependencies": { - "@readme/openapi-parser": "^2.6.0", + "@readme/openapi-parser": "^2.7.0", "@readme/postman-to-openapi": "^4.1.0", "js-yaml": "^4.1.0", "openapi-types": "^12.1.3", @@ -75,7 +75,7 @@ "@types/js-yaml": "^4.0.9", "@types/swagger2openapi": "^7.0.4", "eslint": "^8.57.0", - "nock": "^14.0.0-beta.12", + "nock": "^14.0.0", "tsup": "^8.0.2", "typescript": "^5.1.6", "vitest": "^2.1.3" diff --git a/packages/oas-normalize/test/__snapshots__/index.test.ts.snap b/packages/oas-normalize/test/__snapshots__/index.test.ts.snap index 2e2e3dc1..fd068acc 100644 --- a/packages/oas-normalize/test/__snapshots__/index.test.ts.snap +++ b/packages/oas-normalize/test/__snapshots__/index.test.ts.snap @@ -14512,6 +14512,20 @@ exports[`#convert > Swagger 2.0 support > should validate a YAML path as expecte } `; +exports[`#validate > should colorize errors when \`opts.colorizeErrors\` is present 1`] = ` +[SyntaxError: OpenAPI schema validation failed. + +REQUIRED must have required property 'name' + + 24 | "components": { + 25 | "securitySchemes": { +> 26 | "tlsAuth": { + | ^ ☹️ name is missing here! + 27 | "type": "mutualTLS" + 28 | } + 29 | }] +`; + exports[`#validate > should error out, and show all errors, when a definition has lots of problems 1`] = ` "OpenAPI schema validation failed. diff --git a/packages/oas-normalize/test/index.test.ts b/packages/oas-normalize/test/index.test.ts index 2ad11ec7..66e3f648 100644 --- a/packages/oas-normalize/test/index.test.ts +++ b/packages/oas-normalize/test/index.test.ts @@ -357,10 +357,7 @@ describe('#validate', () => { await expect(o.validate()).rejects.toStrictEqual(new Error('No file contents found.')); }); - // Skipping because the `chalk` dependency of `better-ajv-errors` within `openapi-parser` has - // issues in CI. Test works fine locally though! - // eslint-disable-next-line vitest/no-disabled-tests - it.skip('should colorize errors when `opts.colorizeErrors` is present', async () => { + it('should colorize errors when `opts.colorizeErrors` is present', async () => { const o = new OASNormalize(require.resolve('./__fixtures__/invalid/openapi-3.1.json'), { colorizeErrors: true, enablePaths: true, diff --git a/packages/oas-normalize/vitest.config.mts b/packages/oas-normalize/vitest.config.mts new file mode 100644 index 00000000..65241a43 --- /dev/null +++ b/packages/oas-normalize/vitest.config.mts @@ -0,0 +1,13 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import { defineConfig } from 'vitest/config'; + +export default defineConfig({ + test: { + env: { + // Vitest strips colors from content by default and `chalk` has troubles with color detection + // in CI. + // https://github.com/chalk/supports-color/issues/106 + FORCE_COLOR: '1', + }, + }, +}); diff --git a/packages/oas/package.json b/packages/oas/package.json index 681bb35c..6547808b 100644 --- a/packages/oas/package.json +++ b/packages/oas/package.json @@ -100,7 +100,7 @@ }, "devDependencies": { "@readme/oas-examples": "^5.13.0", - "@readme/openapi-parser": "^2.6.0", + "@readme/openapi-parser": "^2.7.0", "@types/json-schema-merge-allof": "^0.6.5", "@types/memoizee": "^0.4.11", "@types/node": "^22.7.6",