Support passing additional properties to OpenAPI server generator

Signed-off-by: Adam Kunicki <kunickiaj@gmail.com>
This commit is contained in:
Adam Kunicki
2025-04-30 18:06:18 -07:00
parent 2c5efa9555
commit b229476481
4 changed files with 34 additions and 11 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/repo-tools': patch
---
Support passing additional properties to OpenAPI server generator
@@ -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'));
@@ -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);
};
@@ -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<void> {
export async function command(
{
abortSignal,
isWatch = false,
}: {
abortSignal?: AbortController;
isWatch?: boolean;
},
serverAdditionalProperties?: string,
): Promise<void> {
try {
await generate(abortSignal);
await generate(serverAdditionalProperties, abortSignal);
console.log(chalk.green('Generated server files.'));
} catch (err) {
if (err.name === 'AbortError') {