From b22947648131a25d96c5597e22c5287db179f2b6 Mon Sep 17 00:00:00 2001 From: Adam Kunicki Date: Wed, 30 Apr 2025 18:06:18 -0700 Subject: [PATCH] Support passing additional properties to OpenAPI server generator Signed-off-by: Adam Kunicki --- .changeset/cool-colts-float.md | 5 +++ packages/repo-tools/src/commands/index.ts | 4 +++ .../package/schema/openapi/generate/index.ts | 2 +- .../package/schema/openapi/generate/server.ts | 34 +++++++++++++------ 4 files changed, 34 insertions(+), 11 deletions(-) create mode 100644 .changeset/cool-colts-float.md diff --git a/.changeset/cool-colts-float.md b/.changeset/cool-colts-float.md new file mode 100644 index 0000000000..c001f81ade --- /dev/null +++ b/.changeset/cool-colts-float.md @@ -0,0 +1,5 @@ +--- +'@backstage/repo-tools': patch +--- + +Support passing additional properties to OpenAPI server generator diff --git a/packages/repo-tools/src/commands/index.ts b/packages/repo-tools/src/commands/index.ts index b737d918bd..a3db26c9f7 100644 --- a/packages/repo-tools/src/commands/index.ts +++ b/packages/repo-tools/src/commands/index.ts @@ -56,6 +56,10 @@ function registerPackageCommand(program: Command) { .description( 'Additional properties that can be passed to @openapitools/openapi-generator-cli', ) + .option('--server-additional-properties [properties]') + .description( + 'Additional properties that can be passed to @openapitools/openapi-generator-cli', + ) .option('--watch') .description('Watch the OpenAPI spec for changes and regenerate on save.') .action(lazy(() => import('./package/schema/openapi/generate'), 'command')); diff --git a/packages/repo-tools/src/commands/package/schema/openapi/generate/index.ts b/packages/repo-tools/src/commands/package/schema/openapi/generate/index.ts index 1c9fd586fb..bda80d2fb1 100644 --- a/packages/repo-tools/src/commands/package/schema/openapi/generate/index.ts +++ b/packages/repo-tools/src/commands/package/schema/openapi/generate/index.ts @@ -51,7 +51,7 @@ export async function command(opts: OptionValues) { ); } if (opts.server) { - promises.push(generateServer(options)); + promises.push(generateServer(options, opts.serverAdditionalProperties)); } await Promise.all(promises); }; diff --git a/packages/repo-tools/src/commands/package/schema/openapi/generate/server.ts b/packages/repo-tools/src/commands/package/schema/openapi/generate/server.ts index 8c342b0a68..1a8dd36cab 100644 --- a/packages/repo-tools/src/commands/package/schema/openapi/generate/server.ts +++ b/packages/repo-tools/src/commands/package/schema/openapi/generate/server.ts @@ -30,6 +30,7 @@ import { resolvePackagePath } from '@backstage/backend-plugin-api'; import { getPathToCurrentOpenApiSpec, getRelativePathToFile, + toGeneratorAdditionalProperties, } from '../../../../../lib/openapi/helpers'; async function generateSpecFile() { @@ -70,7 +71,7 @@ export const createOpenApiRouter = async ( const indexFile = join(schemaDir, '..', 'index.ts'); await fs.writeFile( indexFile, - `// + `// export * from './generated';`, ); @@ -82,7 +83,10 @@ export const createOpenApiRouter = async ( } } -async function generate(abortSignal?: AbortController) { +async function generate( + serverAdditionalProperties?: string, + abortSignal?: AbortController, +) { const resolvedOpenapiPath = await getPathToCurrentOpenApiSpec(); const resolvedOutputDirectory = await getRelativePathToFile(OUTPUT_PATH); @@ -93,6 +97,10 @@ async function generate(abortSignal?: AbortController) { OPENAPI_IGNORE_FILES.join('\n'), ); + const additionalProperties = toGeneratorAdditionalProperties({ + initialValue: serverAdditionalProperties, + }); + await exec( 'node', [ @@ -111,6 +119,9 @@ async function generate(abortSignal?: AbortController) { ), '--generator-key', 'v3.0', + additionalProperties + ? `--additional-properties=${additionalProperties}` + : '', ], { maxBuffer: Number.MAX_VALUE, @@ -147,15 +158,18 @@ async function generate(abortSignal?: AbortController) { await generateSpecFile(); } -export async function command({ - abortSignal, - isWatch = false, -}: { - abortSignal?: AbortController; - isWatch?: boolean; -}): Promise { +export async function command( + { + abortSignal, + isWatch = false, + }: { + abortSignal?: AbortController; + isWatch?: boolean; + }, + serverAdditionalProperties?: string, +): Promise { try { - await generate(abortSignal); + await generate(serverAdditionalProperties, abortSignal); console.log(chalk.green('Generated server files.')); } catch (err) { if (err.name === 'AbortError') {