diff --git a/.husky/pre-commit b/.husky/pre-commit index 8862d8db03..d2ae35e84b 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,4 @@ -#!/bin/zsh +#!/bin/sh . "$(dirname "$0")/_/husky.sh" yarn lint-staged diff --git a/plugins/catalog-backend/openapi.yaml b/plugins/catalog-backend/openapi.yaml index 07d1bc9ca5..ecab6c7272 100644 --- a/plugins/catalog-backend/openapi.yaml +++ b/plugins/catalog-backend/openapi.yaml @@ -731,9 +731,18 @@ paths: content: application/json: schema: - type: array - items: - type: string + type: object + required: + - entityRefs + properties: + entityRefs: + type: array + items: + type: string + fields: + type: array + items: + type: string /entities/by-query: get: operationId: GetEntitiesByQuery @@ -768,15 +777,6 @@ paths: type: string explode: false style: form - - requestBody: - required: true - content: - application/json: - schema: - type: array - items: - type: string /entity-facets: get: operationId: GetEntityFacets diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index ef6fdd8029..2d77c724c5 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -46,6 +46,7 @@ }, "dependencies": { "@backstage/backend-common": "workspace:^", + "@backstage/backend-openapi-utils": "workspace:^", "@backstage/backend-plugin-api": "workspace:^", "@backstage/catalog-client": "workspace:^", "@backstage/catalog-model": "workspace:^", @@ -54,7 +55,6 @@ "@backstage/integration": "workspace:^", "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", - "@backstage/plugin-openapi-router": "workspace:^", "@backstage/plugin-permission-common": "workspace:^", "@backstage/plugin-permission-node": "workspace:^", "@backstage/plugin-scaffolder-common": "workspace:^", @@ -71,7 +71,6 @@ "fs-extra": "10.1.0", "git-url-parse": "^13.0.0", "glob": "^7.1.6", - "js-yaml": "^4.1.0", "knex": "^2.0.0", "lodash": "^4.17.21", "luxon": "^3.0.0", diff --git a/plugins/catalog-backend/src/service/schema/openapi.ts b/plugins/catalog-backend/src/service/schema/openapi.ts index 6ec4f25527..e14410cd30 100644 --- a/plugins/catalog-backend/src/service/schema/openapi.ts +++ b/plugins/catalog-backend/src/service/schema/openapi.ts @@ -934,9 +934,21 @@ export default { content: { 'application/json': { schema: { - type: 'array', - items: { - type: 'string', + type: 'object', + required: ['entityRefs'], + properties: { + entityRefs: { + type: 'array', + items: { + type: 'string', + }, + }, + fields: { + type: 'array', + items: { + type: 'string', + }, + }, }, }, }, @@ -1003,19 +1015,6 @@ export default { style: 'form', }, ], - requestBody: { - required: true, - content: { - 'application/json': { - schema: { - type: 'array', - items: { - type: 'string', - }, - }, - }, - }, - }, }, }, '/entity-facets': { diff --git a/plugins/openapi-router/README.md b/plugins/openapi-router/README.md index ad45dae773..1cb8575cb9 100644 --- a/plugins/openapi-router/README.md +++ b/plugins/openapi-router/README.md @@ -8,7 +8,7 @@ This package is meant to provide a typed Express router for an OpenAPI spec. Spe ### Configuration -In your plugin's `schema/openapi`, +In your plugin's `schema/openapi.ts`, ```ts export default { @@ -34,7 +34,7 @@ export function createRouter(){ 1. OpenAPI definitions must be converted to Typescript files From [#32063](https://github.com/microsoft/TypeScript/issues/32063), we cannot import JSON `as const`. If we could, this would allow us to force all specs to be JSON and then just import from a spec. 2. `as const` makes all fields `readonly` - To ensure a good DX of + To ensure a good DX of using a simple imported JSON spec, we want to remove any type issues between `readonly` arrays and mutable arrays. Typescript does not allow them to be compared, so converting all imports from the `openapi3-ts` library to `readonly` is important. ```tsx ... diff --git a/plugins/openapi-router/package.json b/plugins/openapi-router/package.json index dfc8b85441..df0e92bdc1 100644 --- a/plugins/openapi-router/package.json +++ b/plugins/openapi-router/package.json @@ -1,6 +1,6 @@ { - "name": "@backstage/plugin-openapi-router", - "description": "OpenAPI router with type completions.", + "name": "@backstage/backend-openapi-utils", + "description": "OpenAPI typescript support.", "version": "0.0.0", "main": "src/index.ts", "types": "src/index.ts", @@ -12,7 +12,7 @@ "types": "dist/index.d.ts" }, "backstage": { - "role": "backend-plugin" + "role": "node-library" }, "scripts": { "start": "backstage-cli package start", diff --git a/plugins/openapi-router/src/run.ts b/plugins/openapi-router/src/run.ts deleted file mode 100644 index 9a14d0e57d..0000000000 --- a/plugins/openapi-router/src/run.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import yn from 'yn'; -import { getRootLogger } from '@backstage/backend-common'; -import { startStandaloneServer } from './standaloneServer'; - -const port = process.env.PLUGIN_PORT ? Number(process.env.PLUGIN_PORT) : 3004; -const enableCors = yn(process.env.PLUGIN_CORS, { default: false }); -const logger = getRootLogger(); - -startStandaloneServer({ port, enableCors, logger }).catch(err => { - logger.error(err); - process.exit(1); -}); - -process.on('SIGINT', () => { - logger.info('CTRL+C pressed; exiting.'); - process.exit(0); -}); diff --git a/plugins/openapi-router/src/standaloneServer.ts b/plugins/openapi-router/src/standaloneServer.ts deleted file mode 100644 index f7c2ec2c61..0000000000 --- a/plugins/openapi-router/src/standaloneServer.ts +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2020 The Backstage Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Server } from 'http'; -import { Logger } from 'winston'; -import { createServiceBuilder } from '@backstage/backend-common'; -import { createRouter } from './example'; - -export interface ServerOptions { - port: number; - enableCors: boolean; - logger: Logger; -} - -export async function startStandaloneServer( - options: ServerOptions, -): Promise { - const logger = options.logger.child({ service: 'app-backend' }); - logger.debug('Starting application server...'); - const router = await createRouter({ - logger, - appPackageName: 'example-app', - }); - - const service = createServiceBuilder(module) - .setPort(options.port) - .addRouter('', router); - - return await service.start().catch(err => { - logger.error(err); - process.exit(1); - }); -} - -module.hot?.accept(); diff --git a/yarn.lock b/yarn.lock index 1442f4d64e..e0fb52c28e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3929,6 +3929,26 @@ __metadata: languageName: unknown linkType: soft +"@backstage/backend-openapi-utils@workspace:^, @backstage/backend-openapi-utils@workspace:plugins/openapi-router": + version: 0.0.0-use.local + resolution: "@backstage/backend-openapi-utils@workspace:plugins/openapi-router" + dependencies: + "@backstage/backend-common": "workspace:^" + "@backstage/cli": "workspace:^" + "@types/express": ^4.17.6 + "@types/express-serve-static-core": ^4.17.33 + expect-type: ^0.15.0 + express: ^4.17.1 + express-promise-router: ^4.1.0 + json-schema-to-ts: ^2.6.2 + openapi-types: ^12.1.0 + openapi3-ts: ^3.1.2 + ts-node: ^10.9.1 + winston: ^3.8.2 + yn: ^4.0.0 + languageName: unknown + linkType: soft + "@backstage/backend-plugin-api@workspace:^, @backstage/backend-plugin-api@workspace:packages/backend-plugin-api": version: 0.0.0-use.local resolution: "@backstage/backend-plugin-api@workspace:packages/backend-plugin-api" @@ -5691,6 +5711,7 @@ __metadata: resolution: "@backstage/plugin-catalog-backend@workspace:plugins/catalog-backend" dependencies: "@backstage/backend-common": "workspace:^" + "@backstage/backend-openapi-utils": "workspace:^" "@backstage/backend-plugin-api": "workspace:^" "@backstage/backend-test-utils": "workspace:^" "@backstage/catalog-client": "workspace:^" @@ -5701,7 +5722,6 @@ __metadata: "@backstage/integration": "workspace:^" "@backstage/plugin-catalog-common": "workspace:^" "@backstage/plugin-catalog-node": "workspace:^" - "@backstage/plugin-openapi-router": "workspace:^" "@backstage/plugin-permission-common": "workspace:^" "@backstage/plugin-permission-node": "workspace:^" "@backstage/plugin-scaffolder-common": "workspace:^" @@ -5725,7 +5745,6 @@ __metadata: fs-extra: 10.1.0 git-url-parse: ^13.0.0 glob: ^7.1.6 - js-yaml: ^4.1.0 knex: ^2.0.0 lodash: ^4.17.21 luxon: ^3.0.0 @@ -7794,26 +7813,6 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-openapi-router@workspace:^, @backstage/plugin-openapi-router@workspace:plugins/openapi-router": - version: 0.0.0-use.local - resolution: "@backstage/plugin-openapi-router@workspace:plugins/openapi-router" - dependencies: - "@backstage/backend-common": "workspace:^" - "@backstage/cli": "workspace:^" - "@types/express": ^4.17.6 - "@types/express-serve-static-core": ^4.17.33 - expect-type: ^0.15.0 - express: ^4.17.1 - express-promise-router: ^4.1.0 - json-schema-to-ts: ^2.6.2 - openapi-types: ^12.1.0 - openapi3-ts: ^3.1.2 - ts-node: ^10.9.1 - winston: ^3.8.2 - yn: ^4.0.0 - languageName: unknown - linkType: soft - "@backstage/plugin-org-react@workspace:plugins/org-react": version: 0.0.0-use.local resolution: "@backstage/plugin-org-react@workspace:plugins/org-react"