From 47a257f09ded828c21981096e650546894bb8816 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 7 Feb 2025 10:03:51 +0100 Subject: [PATCH] cli/new: refactor arg options parsing + fixes Signed-off-by: Patrik Oldsberg --- packages/cli/src/commands/new/new.ts | 24 +++++++++++++++++++----- packages/cli/src/lib/new/utils.test.ts | 6 +++--- packages/cli/src/lib/new/utils.ts | 7 ++----- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/packages/cli/src/commands/new/new.ts b/packages/cli/src/commands/new/new.ts index c2e12e4edf..1cc59a98d7 100644 --- a/packages/cli/src/commands/new/new.ts +++ b/packages/cli/src/commands/new/new.ts @@ -41,7 +41,6 @@ import { import { runAdditionalActions } from '../../lib/new/additionalActions'; import { executePluginPackageTemplate } from '../../lib/new/executeTemplate'; import { TemporaryDirectoryManager } from './TemporaryDirectoryManager'; -import { OptionValues } from 'commander'; function parseOptions(optionStrings: string[]): Record { const options: Record = {}; @@ -60,18 +59,33 @@ function parseOptions(optionStrings: string[]): Record { return options; } -export default async (opts: OptionValues) => { +type ArgOptions = { + option: string[]; + select?: string; + private?: boolean; + npmRegistry?: string; + scope?: string; + license?: string; + baseVersion?: string; +}; + +export default async ({ + option: argOptions, + select: preselectedTemplateId, + ...argGlobals +}: ArgOptions) => { const pkgJson = await fs.readJson(paths.resolveTargetRoot('package.json')); const cliConfig = pkgJson.backstage?.cli; const { templates, globals } = readCliConfig(cliConfig); const template = verifyTemplate( - await templateSelector(templates, opts.select), + await templateSelector(templates, preselectedTemplateId), ); const codeOwnersFilePath = await getCodeownersFilePath(paths.targetRoot); - const legacyOpts = parseOptions(opts.option); + const legacyOpts = parseOptions(argOptions); + const prefilledAnswers = Object.fromEntries( (template.prompts ?? []).flatMap(prompt => { const id = typeof prompt === 'string' ? prompt : prompt.id; @@ -92,7 +106,7 @@ export default async (opts: OptionValues) => { codeOwnersFilePath, }); const answers = { ...prefilledAnswers, ...promptAnswers }; - const options = populateOptions(answers, template, opts); + const options = populateOptions({ ...answers, ...argGlobals }, template); const tmpDirManager = TemporaryDirectoryManager.create(); diff --git a/packages/cli/src/lib/new/utils.test.ts b/packages/cli/src/lib/new/utils.test.ts index 577a213722..b2ec958a69 100644 --- a/packages/cli/src/lib/new/utils.test.ts +++ b/packages/cli/src/lib/new/utils.test.ts @@ -88,7 +88,7 @@ describe('populateOptions', () => { expect(populateOptions({}, { targetPath: '/example' } as Template)).toEqual( { id: '', - private: false, + private: true, baseVersion: '0.1.0', owner: '', license: 'Apache-2.0', @@ -106,7 +106,7 @@ describe('populateOptions', () => { } as Template), ).toEqual({ id: '', - private: false, + private: true, baseVersion: '0.1.0', owner: '', license: 'Apache-2.0', @@ -124,7 +124,7 @@ describe('populateOptions', () => { } as Template), ).toEqual({ id: '', - private: false, + private: true, baseVersion: '0.1.0', owner: '', license: 'Apache-2.0', diff --git a/packages/cli/src/lib/new/utils.ts b/packages/cli/src/lib/new/utils.ts index 47069b3d13..02f885ca20 100644 --- a/packages/cli/src/lib/new/utils.ts +++ b/packages/cli/src/lib/new/utils.ts @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { OptionValues } from 'commander'; import { Template } from './types'; export interface Options extends Record { @@ -51,9 +50,8 @@ export const resolvePackageName = (options: { }; export function populateOptions( - options: Record, + options: { [name in string]?: string | boolean }, template: Template, - argOpts?: OptionValues, ): Options { return { id: '', @@ -63,9 +61,8 @@ export function populateOptions( moduleId: '', baseVersion: '0.1.0', private: true, - ...options, - ...argOpts, targetPath: template.targetPath, + ...options, }; }