From caddd25a8d2e9cb0ddff5521aa7a2d1b6a9ca51b Mon Sep 17 00:00:00 2001 From: Aramis Sennyey Date: Tue, 7 Mar 2023 17:00:41 -0500 Subject: [PATCH] Validate that the file is valid OpenAPI 3.1. Signed-off-by: Aramis Sennyey --- packages/cli/package.json | 1 + packages/cli/src/commands/openapi/verify.ts | 3 + yarn.lock | 67 +++++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/packages/cli/package.json b/packages/cli/package.json index 5e99a3cba0..8f166db53d 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -30,6 +30,7 @@ "backstage-cli": "bin/backstage-cli" }, "dependencies": { + "@apidevtools/swagger-parser": "^10.1.0", "@backstage/cli-common": "workspace:^", "@backstage/config": "workspace:^", "@backstage/config-loader": "workspace:^", diff --git a/packages/cli/src/commands/openapi/verify.ts b/packages/cli/src/commands/openapi/verify.ts index 7d3de8e7ee..ac053a1f5e 100644 --- a/packages/cli/src/commands/openapi/verify.ts +++ b/packages/cli/src/commands/openapi/verify.ts @@ -22,6 +22,8 @@ import { join } from 'path'; import chalk from 'chalk'; import { relative as relativePath } from 'path'; import { PackageGraph } from '../../lib/monorepo'; +import { cloneDeep } from 'lodash'; +import SwaggerParser from '@apidevtools/swagger-parser'; async function verify(directoryPath: string) { const openapiPath = join(directoryPath, 'openapi.yaml'); @@ -29,6 +31,7 @@ async function verify(directoryPath: string) { return; } const yaml = YAML.load(await fs.readFile(openapiPath, 'utf8')); + await SwaggerParser.validate(cloneDeep(yaml)); const schemaPath = join(directoryPath, 'schema/openapi.ts'); if (!(await fs.pathExists(schemaPath))) { diff --git a/yarn.lock b/yarn.lock index 78e5acf047..9056881ebb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -18,6 +18,17 @@ __metadata: languageName: node linkType: hard +"@apidevtools/json-schema-ref-parser@npm:9.0.6": + version: 9.0.6 + resolution: "@apidevtools/json-schema-ref-parser@npm:9.0.6" + dependencies: + "@jsdevtools/ono": ^7.1.3 + call-me-maybe: ^1.0.1 + js-yaml: ^3.13.1 + checksum: c7ff53623ab8a9dd221772a5757fa0b9e5167a5ac3a71c23596634bae6efc85d8efcdebbe17f73ee5c027ea5afc48c705e8a720f02c4909f9a357d8027040b7b + languageName: node + linkType: hard + "@apidevtools/json-schema-ref-parser@npm:^9.0.6": version: 9.1.2 resolution: "@apidevtools/json-schema-ref-parser@npm:9.1.2" @@ -30,6 +41,37 @@ __metadata: languageName: node linkType: hard +"@apidevtools/openapi-schemas@npm:^2.1.0": + version: 2.1.0 + resolution: "@apidevtools/openapi-schemas@npm:2.1.0" + checksum: 4a8f64935b9049ef21e41fa4b188f39f6bc3f5291cebd451701db1115451ccb246a739e46cc5ce9ecdec781671431db40db7851acdac84a990a45756e0f32de3 + languageName: node + linkType: hard + +"@apidevtools/swagger-methods@npm:^3.0.2": + version: 3.0.2 + resolution: "@apidevtools/swagger-methods@npm:3.0.2" + checksum: d06b1ac5c1956613c4c6be695612ef860cd4e962b93a509ca551735a328a856cae1e33399cac1dcbf8333ba22b231746f3586074769ef0e172cf549ec9e7eaae + languageName: node + linkType: hard + +"@apidevtools/swagger-parser@npm:^10.1.0": + version: 10.1.0 + resolution: "@apidevtools/swagger-parser@npm:10.1.0" + dependencies: + "@apidevtools/json-schema-ref-parser": 9.0.6 + "@apidevtools/openapi-schemas": ^2.1.0 + "@apidevtools/swagger-methods": ^3.0.2 + "@jsdevtools/ono": ^7.1.3 + ajv: ^8.6.3 + ajv-draft-04: ^1.0.0 + call-me-maybe: ^1.0.1 + peerDependencies: + openapi-types: ">=7" + checksum: c7c923755bd025ee2cae97e1cfd525538523ba74c341a0ac814c023ffe5e63fc2d997539a8ccf9a0fcec41a2d6337d40cc5735acb991ddcbb415853a241908d1 + languageName: node + linkType: hard + "@apollo/cache-control-types@npm:^1.0.2": version: 1.0.2 resolution: "@apollo/cache-control-types@npm:1.0.2" @@ -4066,6 +4108,7 @@ __metadata: version: 0.0.0-use.local resolution: "@backstage/cli@workspace:packages/cli" dependencies: + "@apidevtools/swagger-parser": ^10.1.0 "@backstage/backend-common": "workspace:^" "@backstage/cli-common": "workspace:^" "@backstage/config": "workspace:^" @@ -18001,6 +18044,18 @@ __metadata: languageName: node linkType: hard +"ajv-draft-04@npm:^1.0.0": + version: 1.0.0 + resolution: "ajv-draft-04@npm:1.0.0" + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + checksum: 3f11fa0e7f7359bef6608657f02ab78e9cc62b1fb7bdd860db0d00351b3863a1189c1a23b72466d2d82726cab4eb20725c76f5e7c134a89865e2bfd0e6828137 + languageName: node + linkType: hard + "ajv-formats@npm:^2.1.1": version: 2.1.1 resolution: "ajv-formats@npm:2.1.1" @@ -18059,6 +18114,18 @@ __metadata: languageName: node linkType: hard +"ajv@npm:^8.0.0, ajv@npm:^8.10.0, ajv@npm:^8.12.0, ajv@npm:^8.6.3, ajv@npm:^8.8.0": + version: 8.12.0 + resolution: "ajv@npm:8.12.0" + dependencies: + fast-deep-equal: ^3.1.1 + json-schema-traverse: ^1.0.0 + require-from-string: ^2.0.2 + uri-js: ^4.2.2 + checksum: 4dc13714e316e67537c8b31bc063f99a1d9d9a497eb4bbd55191ac0dcd5e4985bbb71570352ad6f1e76684fb6d790928f96ba3b2d4fd6e10024be9612fe3f001 + languageName: node + linkType: hard + "ajv@npm:^8.0.0, ajv@npm:^8.10.0, ajv@npm:^8.12.0, ajv@npm:^8.8.0": version: 8.12.0 resolution: "ajv@npm:8.12.0"