repo-tools: update to work with new dynamic imports

Signed-off-by: Patrik Oldsberg <poldsberg@gmail.com>
This commit is contained in:
Patrik Oldsberg
2024-12-22 12:20:25 +01:00
parent cdfff7254d
commit ceda4097bc
2 changed files with 37 additions and 58 deletions
+36 -57
View File
@@ -39,9 +39,7 @@ function registerPackageCommand(program: Command) {
'Initialize any required files to use the OpenAPI tooling for this package.',
)
.action(
lazy(() =>
import('./package/schema/openapi/init').then(m => m.singleCommand),
),
lazy(() => import('./package/schema/openapi/init'), 'singleCommand'),
);
openApiCommand
@@ -60,11 +58,7 @@ function registerPackageCommand(program: Command) {
)
.option('--watch')
.description('Watch the OpenAPI spec for changes and regenerate on save.')
.action(
lazy(() =>
import('./package/schema/openapi/generate').then(m => m.command),
),
);
.action(lazy(() => import('./package/schema/openapi/generate'), 'command'));
openApiCommand
.command('fuzz')
@@ -81,18 +75,14 @@ function registerPackageCommand(program: Command) {
'--exclude-checks <excludeChecks>',
'Exclude checks from schemathesis run',
)
.action(
lazy(() => import('./package/schema/openapi/fuzz').then(m => m.command)),
);
.action(lazy(() => import('./package/schema/openapi/fuzz'), 'command'));
openApiCommand
.command('diff')
.option('--ignore', 'Ignore linting failures and only log the results.')
.option('--json', 'Output the results as JSON')
.option('--since <ref>', 'Diff the API against a specific ref')
.action(
lazy(() => import('./package/schema/openapi/diff').then(m => m.command)),
);
.action(lazy(() => import('./package/schema/openapi/diff'), 'command'));
}
function registerRepoCommand(program: Command) {
@@ -113,11 +103,7 @@ function registerRepoCommand(program: Command) {
.description(
'Verify that all OpenAPI schemas are valid and set up correctly.',
)
.action(
lazy(() =>
import('./repo/schema/openapi/verify').then(m => m.bulkCommand),
),
);
.action(lazy(() => import('./repo/schema/openapi/verify'), 'bulkCommand'));
openApiCommand
.command('lint [paths...]')
@@ -126,17 +112,13 @@ function registerRepoCommand(program: Command) {
'--strict',
'Fail on any linting severity messages, not just errors.',
)
.action(
lazy(() => import('./repo/schema/openapi/lint').then(m => m.bulkCommand)),
);
.action(lazy(() => import('./repo/schema/openapi/lint'), 'bulkCommand'));
openApiCommand
.command('test [paths...]')
.description('Test OpenAPI schemas against written tests')
.option('--update', 'Update the spec on failure.')
.action(
lazy(() => import('./repo/schema/openapi/test').then(m => m.bulkCommand)),
);
.action(lazy(() => import('./repo/schema/openapi/test'), 'bulkCommand'));
openApiCommand
.command('fuzz')
@@ -145,9 +127,7 @@ function registerRepoCommand(program: Command) {
'--since <ref>',
'Only fuzz packages that have changed since the given ref',
)
.action(
lazy(() => import('./repo/schema/openapi/fuzz').then(m => m.command)),
);
.action(lazy(() => import('./repo/schema/openapi/fuzz'), 'command'));
openApiCommand
.command('diff')
@@ -159,9 +139,7 @@ function registerRepoCommand(program: Command) {
'Diff the API against a specific ref',
'origin/master',
)
.action(
lazy(() => import('./repo/schema/openapi/diff').then(m => m.command)),
);
.action(lazy(() => import('./repo/schema/openapi/diff'), 'command'));
}
function registerLintCommand(program: Command) {
@@ -174,10 +152,10 @@ function registerLintCommand(program: Command) {
'Lint backend plugin packages for legacy exports and make sure it conforms to the new export pattern',
)
.action(
lazy(() =>
import(
'./lint-legacy-backend-exports/lint-legacy-backend-exports'
).then(m => m.lint),
lazy(
() =>
import('./lint-legacy-backend-exports/lint-legacy-backend-exports'),
'lint',
),
);
}
@@ -215,16 +193,12 @@ export function registerCommands(program: Command) {
'Turn on release tag validation for the public, beta, and alpha APIs',
)
.description('Generate an API report for selected packages')
.action(
lazy(() =>
import('./api-reports/api-reports').then(m => m.buildApiReports),
),
);
.action(lazy(() => import('./api-reports/api-reports'), 'buildApiReports'));
program
.command('type-deps')
.description('Find inconsistencies in types of all packages and plugins')
.action(lazy(() => import('./type-deps/type-deps').then(m => m.default)));
.action(lazy(() => import('./type-deps/type-deps'), 'default'));
program
.command('peer-deps')
@@ -232,7 +206,7 @@ export function registerCommands(program: Command) {
'Ensure your packages are using the correct peer dependency format.',
)
.option('--fix', 'Fix the issues found')
.action(lazy(() => import('./peer-deps/peer-deps').then(m => m.default)));
.action(lazy(() => import('./peer-deps/peer-deps'), 'default'));
program
.command('generate-catalog-info')
@@ -246,10 +220,9 @@ export function registerCommands(program: Command) {
)
.description('Create or fix info yaml files for all backstage packages')
.action(
lazy(() =>
import('./generate-catalog-info/generate-catalog-info').then(
m => m.default,
),
lazy(
() => import('./generate-catalog-info/generate-catalog-info'),
'default',
),
);
@@ -278,20 +251,14 @@ export function registerCommands(program: Command) {
.description(
'Generate a patch for the selected package in the target repository',
)
.action(
lazy(() =>
import('./generate-patch/generate-patch').then(m => m.default),
),
);
.action(lazy(() => import('./generate-patch/generate-patch'), 'default'));
program
.command('knip-reports [paths...]')
.option('--ci', 'CI run checks that there is no changes on knip reports')
.description('Generate a knip report for selected packages')
.action(
lazy(() =>
import('./knip-reports/knip-reports').then(m => m.buildKnipReports),
),
lazy(() => import('./knip-reports/knip-reports'), 'buildKnipReports'),
);
registerPackageCommand(program);
@@ -299,13 +266,25 @@ export function registerCommands(program: Command) {
registerLintCommand(program);
}
type ActionFunc = (...args: any[]) => Promise<void>;
type ActionExports<TModule extends object> = {
[KName in keyof TModule as TModule[KName] extends ActionFunc
? KName
: never]: TModule[KName];
};
// Wraps an action function so that it always exits and handles errors
function lazy(
getActionFunc: () => Promise<(...args: any[]) => Promise<void>>,
export function lazy<TModule extends object>(
moduleLoader: () => Promise<TModule>,
exportName: keyof ActionExports<TModule>,
): (...args: any[]) => Promise<never> {
return async (...args: any[]) => {
try {
const actionFunc = await getActionFunc();
const mod = await moduleLoader();
const actualModule = (
mod as unknown as { default: ActionExports<TModule> }
).default;
const actionFunc = actualModule[exportName] as ActionFunc;
await actionFunc(...args);
process.exit(0);
@@ -54,7 +54,7 @@ async function verify(directoryPath: string) {
schemaPath = join(directoryPath, OLD_SCHEMA_PATH);
}
const schema = await import(resolvePath(schemaPath));
const { default: schema } = await import(resolvePath(schemaPath));
if (!schema.spec) {
throw new Error(`\`${TS_SCHEMA_PATH}\` needs to have a 'spec' export.`);