From de62a9d322a24eacf7768ced493b5d3514d89f7f Mon Sep 17 00:00:00 2001 From: Gabriel Dugny Date: Tue, 13 Jan 2026 00:49:02 +0100 Subject: [PATCH 1/2] chore: update dependency commander to v14, remove old @types/commander Signed-off-by: Gabriel Dugny --- .changeset/pink-terms-know.md | 9 +++++ docs/features/techdocs/cli.md | 2 +- packages/cli/package.json | 2 +- packages/cli/src/lib/role.test.ts | 1 + packages/cli/src/modules/test/index.ts | 4 +- packages/codemods/package.json | 2 +- packages/create-app/package.json | 2 +- packages/e2e-test/package.json | 2 +- packages/repo-tools/package.json | 2 +- packages/repo-tools/src/commands/index.ts | 3 ++ packages/techdocs-cli/cli-report.md | 8 ++-- packages/techdocs-cli/package.json | 3 +- packages/techdocs-cli/src/commands/index.ts | 8 ++-- yarn.lock | 45 ++++++++++----------- 14 files changed, 52 insertions(+), 41 deletions(-) create mode 100644 .changeset/pink-terms-know.md diff --git a/.changeset/pink-terms-know.md b/.changeset/pink-terms-know.md new file mode 100644 index 0000000000..ca64a76f39 --- /dev/null +++ b/.changeset/pink-terms-know.md @@ -0,0 +1,9 @@ +--- +'@backstage/cli': patch +'@backstage/codemods': patch +'@backstage/create-app': patch +'@backstage/repo-tools': patch +'@techdocs/cli': patch +--- + +Upgraded `commander` dependency from `^12.0.0` to `^14.0.3` across all CLI packages. diff --git a/docs/features/techdocs/cli.md b/docs/features/techdocs/cli.md index 67d29c4ebb..f6be53cb55 100644 --- a/docs/features/techdocs/cli.md +++ b/docs/features/techdocs/cli.md @@ -150,7 +150,7 @@ Options: --legacyCopyReadmeMdToIndexMd Attempt to ensure an index.md exists falling back to using /README.md or README.md in case a default /index.md is not provided. (default: false) --runAsDefaultUser Bypass setting the container user as the same user and group id as host for Linux and MacOS (default: false) - -v --verbose Enable verbose output. (default: false) + -v, --verbose Enable verbose output. (default: false) -h, --help display help for command ``` diff --git a/packages/cli/package.json b/packages/cli/package.json index fbe1b87253..1c0a31b996 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -83,7 +83,7 @@ "buffer": "^6.0.3", "chalk": "^4.0.0", "chokidar": "^3.3.1", - "commander": "^12.0.0", + "commander": "^14.0.3", "cross-fetch": "^4.0.0", "cross-spawn": "^7.0.3", "css-loader": "^6.5.1", diff --git a/packages/cli/src/lib/role.test.ts b/packages/cli/src/lib/role.test.ts index 8163512b76..b56719ad7d 100644 --- a/packages/cli/src/lib/role.test.ts +++ b/packages/cli/src/lib/role.test.ts @@ -31,6 +31,7 @@ jest.mock('./paths', () => ({ describe('findRoleFromCommand', () => { function mkCommand(args: string) { const parsed = new Command() + .allowExcessArguments(true) .option('--role ', 'test role') .parse(['node', 'entry.js', ...args.split(' ')]) as Command; return parsed.opts(); diff --git a/packages/cli/src/modules/test/index.ts b/packages/cli/src/modules/test/index.ts index 1583c74997..ecc546aee3 100644 --- a/packages/cli/src/modules/test/index.ts +++ b/packages/cli/src/modules/test/index.ts @@ -27,6 +27,7 @@ export default createCliPlugin({ execute: async ({ args }) => { const command = new Command(); command.allowUnknownOption(true); + command.allowExcessArguments(true); command.option( '--since ', 'Only test packages that changed since the specified ref', @@ -53,7 +54,8 @@ export default createCliPlugin({ const command = new Command(); command.allowUnknownOption(true); - command.helpOption(', --backstage-cli-help'); + command.allowExcessArguments(true); + command.helpOption('--backstage-cli-help'); command.action( lazy(() => import('./commands/package/test'), 'default'), ); diff --git a/packages/codemods/package.json b/packages/codemods/package.json index cdb623c4df..ff4514ba90 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -45,7 +45,7 @@ "dependencies": { "@backstage/cli-common": "workspace:^", "chalk": "^4.0.0", - "commander": "^12.0.0", + "commander": "^14.0.3", "jscodeshift": "^0.16.0", "jscodeshift-add-imports": "^1.0.10" }, diff --git a/packages/create-app/package.json b/packages/create-app/package.json index a1271c47ee..ab57343d45 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -45,7 +45,7 @@ "dependencies": { "@backstage/cli-common": "workspace:^", "chalk": "^4.0.0", - "commander": "^12.0.0", + "commander": "^14.0.3", "fs-extra": "^11.2.0", "handlebars": "^4.7.3", "inquirer": "^8.2.0", diff --git a/packages/e2e-test/package.json b/packages/e2e-test/package.json index edc4fbe9d2..c61d2fa37a 100644 --- a/packages/e2e-test/package.json +++ b/packages/e2e-test/package.json @@ -36,7 +36,7 @@ "@backstage/create-app": "workspace:^", "@backstage/errors": "workspace:^", "chalk": "^4.0.0", - "commander": "^12.0.0", + "commander": "^14.0.3", "cross-fetch": "^4.0.0", "fs-extra": "^11.2.0", "handlebars": "^4.7.3", diff --git a/packages/repo-tools/package.json b/packages/repo-tools/package.json index 3180dae9a6..6afc10e8d9 100644 --- a/packages/repo-tools/package.json +++ b/packages/repo-tools/package.json @@ -67,7 +67,7 @@ "chokidar": "^3.5.3", "codeowners-utils": "^1.0.2", "command-exists": "^1.2.9", - "commander": "^12.0.0", + "commander": "^14.0.3", "fs-extra": "^11.2.0", "glob": "^8.0.3", "globby": "^11.0.0", diff --git a/packages/repo-tools/src/commands/index.ts b/packages/repo-tools/src/commands/index.ts index dab7d6df0d..47849778b9 100644 --- a/packages/repo-tools/src/commands/index.ts +++ b/packages/repo-tools/src/commands/index.ts @@ -205,6 +205,7 @@ export function registerCommands(program: Command) { program .command('type-deps') .description('Find inconsistencies in types of all packages and plugins') + .allowExcessArguments(true) .action(lazy(() => import('./type-deps/type-deps'), 'default')); program @@ -213,6 +214,7 @@ export function registerCommands(program: Command) { 'Ensure your packages are using the correct peer dependency format.', ) .option('--fix', 'Fix the issues found') + .allowExcessArguments(true) .action(lazy(() => import('./peer-deps/peer-deps'), 'default')); program @@ -226,6 +228,7 @@ export function registerCommands(program: Command) { 'CI run checks that there are no changes to catalog-info.yaml files', ) .description('Create or fix info yaml files for all backstage packages') + .allowExcessArguments(true) .action( lazy( () => import('./generate-catalog-info/generate-catalog-info'), diff --git a/packages/techdocs-cli/cli-report.md b/packages/techdocs-cli/cli-report.md index 4cb7988add..667c4fb6b6 100644 --- a/packages/techdocs-cli/cli-report.md +++ b/packages/techdocs-cli/cli-report.md @@ -39,7 +39,7 @@ Options: --source-dir --techdocs-ref -h, --help - -v --verbose + -v, --verbose ``` ### `techdocs-cli migrate` @@ -62,7 +62,7 @@ Options: --removeOriginal --storage-name -h, --help - -v --verbose + -v, --verbose ``` ### `techdocs-cli publish` @@ -112,7 +112,7 @@ Options: -c, --mkdocs-config-file-name -h, --help -i, --docker-image - -v --verbose + -v, --verbose ``` ### `techdocs-cli serve:mkdocs` @@ -128,5 +128,5 @@ Options: -h, --help -i, --docker-image -p, --port - -v --verbose + -v, --verbose ``` diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index fb33677b45..7a5e130b2d 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -49,7 +49,7 @@ "@backstage/cli-common": "workspace:^", "@backstage/config": "workspace:^", "@backstage/plugin-techdocs-node": "workspace:^", - "commander": "^12.0.0", + "commander": "^14.0.3", "fs-extra": "^11.0.0", "global-agent": "^3.0.0", "http-proxy": "^1.18.1", @@ -59,7 +59,6 @@ }, "devDependencies": { "@backstage/cli": "workspace:^", - "@types/commander": "^2.12.2", "@types/fs-extra": "^11.0.0", "@types/http-proxy": "^1.17.4", "@types/node": "^22.13.14", diff --git a/packages/techdocs-cli/src/commands/index.ts b/packages/techdocs-cli/src/commands/index.ts index 253a2900fd..e69cf4671a 100644 --- a/packages/techdocs-cli/src/commands/index.ts +++ b/packages/techdocs-cli/src/commands/index.ts @@ -59,7 +59,7 @@ export function registerCommands(program: Command) { 'Name for site when using default MkDocs config', 'Documentation Site', ) - .option('-v --verbose', 'Enable verbose output.', false) + .option('-v, --verbose', 'Enable verbose output.', false) .option( '--omitTechdocsCoreMkdocsPlugin', "Don't patch MkDocs file automatically with techdocs-core plugin.", @@ -142,7 +142,7 @@ export function registerCommands(program: Command) { 'Optional Controls the number of API requests allowed to be performed simultaneously.', '25', ) - .option('-v --verbose', 'Enable verbose output.', false) + .option('-v, --verbose', 'Enable verbose output.', false) .action(lazy(() => import('./migrate/migrate'), 'default')); program @@ -253,7 +253,7 @@ export function registerCommands(program: Command) { 'Documentation Site', ) .option('-p, --port ', 'Port to serve documentation locally', '8000') - .option('-v --verbose', 'Enable verbose output.', false) + .option('-v, --verbose', 'Enable verbose output.', false) .action(lazy(() => import('./serve/mkdocs'), 'default')); program @@ -284,7 +284,7 @@ export function registerCommands(program: Command) { 'Documentation Site', ) .option('--mkdocs-port ', 'Port for MkDocs server to use', '8000') - .option('-v --verbose', 'Enable verbose output.', false) + .option('-v, --verbose', 'Enable verbose output.', false) .option( '--preview-app-bundle-path ', 'Preview documentation using another web app', diff --git a/yarn.lock b/yarn.lock index cc596a5ce2..b95f0bfcab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3351,7 +3351,7 @@ __metadata: buffer: "npm:^6.0.3" chalk: "npm:^4.0.0" chokidar: "npm:^3.3.1" - commander: "npm:^12.0.0" + commander: "npm:^14.0.3" cross-fetch: "npm:^4.0.0" cross-spawn: "npm:^7.0.3" css-loader: "npm:^6.5.1" @@ -3479,7 +3479,7 @@ __metadata: "@types/jscodeshift": "npm:^0.12.0" "@types/node": "npm:^22.13.14" chalk: "npm:^4.0.0" - commander: "npm:^12.0.0" + commander: "npm:^14.0.3" jscodeshift: "npm:^0.16.0" jscodeshift-add-imports: "npm:^1.0.10" bin: @@ -3735,7 +3735,7 @@ __metadata: "@types/node": "npm:^22.13.14" "@types/recursive-readdir": "npm:^2.2.0" chalk: "npm:^4.0.0" - commander: "npm:^12.0.0" + commander: "npm:^14.0.3" fs-extra: "npm:^11.2.0" handlebars: "npm:^4.7.3" inquirer: "npm:^8.2.0" @@ -7991,7 +7991,7 @@ __metadata: chokidar: "npm:^3.5.3" codeowners-utils: "npm:^1.0.2" command-exists: "npm:^1.2.9" - commander: "npm:^12.0.0" + commander: "npm:^14.0.3" fs-extra: "npm:^11.2.0" glob: "npm:^8.0.3" globby: "npm:^11.0.0" @@ -20690,13 +20690,12 @@ __metadata: "@backstage/cli-common": "workspace:^" "@backstage/config": "workspace:^" "@backstage/plugin-techdocs-node": "workspace:^" - "@types/commander": "npm:^2.12.2" "@types/fs-extra": "npm:^11.0.0" "@types/http-proxy": "npm:^1.17.4" "@types/node": "npm:^22.13.14" "@types/serve-handler": "npm:^6.1.0" "@types/webpack-env": "npm:^1.15.3" - commander: "npm:^12.0.0" + commander: "npm:^14.0.3" find-process: "npm:^2.0.0" fs-extra: "npm:^11.0.0" global-agent: "npm:^3.0.0" @@ -21208,15 +21207,6 @@ __metadata: languageName: node linkType: hard -"@types/commander@npm:^2.12.2": - version: 2.12.5 - resolution: "@types/commander@npm:2.12.5" - dependencies: - commander: "npm:*" - checksum: 10/5b70bf09366f778f54cd0b831417aa1f749cdd9e95e81016d0537b801ad14275973b04c34ff4dfaa344986aa93b4518c2df12647ecf8b499b636585335ae3edc - languageName: node - linkType: hard - "@types/compression@npm:^1.7.5": version: 1.8.1 resolution: "@types/compression@npm:1.8.1" @@ -27579,13 +27569,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:*, commander@npm:^13.1.0": - version: 13.1.0 - resolution: "commander@npm:13.1.0" - checksum: 10/d3b4b79e6be8471ddadacbb8cd441fe82154d7da7393b50e76165a9e29ccdb74fa911a186437b9a211d0fc071db6051915c94fb8ef16d77511d898e9dbabc6af - languageName: node - linkType: hard - "commander@npm:11.1.0, commander@npm:^11.0.0": version: 11.1.0 resolution: "commander@npm:11.1.0" @@ -27621,13 +27604,27 @@ __metadata: languageName: node linkType: hard -"commander@npm:^12.0.0, commander@npm:^12.1.0": +"commander@npm:^12.1.0": version: 12.1.0 resolution: "commander@npm:12.1.0" checksum: 10/cdaeb672d979816853a4eed7f1310a9319e8b976172485c2a6b437ed0db0a389a44cfb222bfbde772781efa9f215bdd1b936f80d6b249485b465c6cb906e1f93 languageName: node linkType: hard +"commander@npm:^13.1.0": + version: 13.1.0 + resolution: "commander@npm:13.1.0" + checksum: 10/d3b4b79e6be8471ddadacbb8cd441fe82154d7da7393b50e76165a9e29ccdb74fa911a186437b9a211d0fc071db6051915c94fb8ef16d77511d898e9dbabc6af + languageName: node + linkType: hard + +"commander@npm:^14.0.3": + version: 14.0.3 + resolution: "commander@npm:14.0.3" + checksum: 10/dfa9ebe2a433d277de5cb0252d23b10a543d245d892db858d23b516336a835c50fd4f52bee4cd13c705cc8acb6f03dc632c73dd806f7d06d3353eb09953dd17a + languageName: node + linkType: hard + "commander@npm:^2.19.0, commander@npm:^2.20.0": version: 2.20.3 resolution: "commander@npm:2.20.3" @@ -29776,7 +29773,7 @@ __metadata: "@types/fs-extra": "npm:^11.0.0" "@types/node": "npm:^22.13.14" chalk: "npm:^4.0.0" - commander: "npm:^12.0.0" + commander: "npm:^14.0.3" cross-fetch: "npm:^4.0.0" fs-extra: "npm:^11.2.0" handlebars: "npm:^4.7.3" From e6f7ab105df8b5dd35969d9f942ee58b7d0ded01 Mon Sep 17 00:00:00 2001 From: Gabriel Dugny Date: Mon, 16 Feb 2026 17:38:48 +0100 Subject: [PATCH 2/2] fix: Revert some un-necessary allowExcessArguments Signed-off-by: Gabriel Dugny --- packages/cli/src/lib/role.test.ts | 7 +++---- packages/repo-tools/src/commands/index.ts | 3 --- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/cli/src/lib/role.test.ts b/packages/cli/src/lib/role.test.ts index b56719ad7d..76f51df06f 100644 --- a/packages/cli/src/lib/role.test.ts +++ b/packages/cli/src/lib/role.test.ts @@ -29,11 +29,10 @@ jest.mock('./paths', () => ({ })); describe('findRoleFromCommand', () => { - function mkCommand(args: string) { + function mkCommand(args?: string) { const parsed = new Command() - .allowExcessArguments(true) .option('--role ', 'test role') - .parse(['node', 'entry.js', ...args.split(' ')]) as Command; + .parse(args?.split(' ') ?? [], { from: 'user' }); return parsed.opts(); } @@ -49,7 +48,7 @@ describe('findRoleFromCommand', () => { }); it('provides role info by role', async () => { - await expect(findRoleFromCommand(mkCommand(''))).resolves.toEqual( + await expect(findRoleFromCommand(mkCommand())).resolves.toEqual( 'web-library', ); diff --git a/packages/repo-tools/src/commands/index.ts b/packages/repo-tools/src/commands/index.ts index 47849778b9..dab7d6df0d 100644 --- a/packages/repo-tools/src/commands/index.ts +++ b/packages/repo-tools/src/commands/index.ts @@ -205,7 +205,6 @@ export function registerCommands(program: Command) { program .command('type-deps') .description('Find inconsistencies in types of all packages and plugins') - .allowExcessArguments(true) .action(lazy(() => import('./type-deps/type-deps'), 'default')); program @@ -214,7 +213,6 @@ export function registerCommands(program: Command) { 'Ensure your packages are using the correct peer dependency format.', ) .option('--fix', 'Fix the issues found') - .allowExcessArguments(true) .action(lazy(() => import('./peer-deps/peer-deps'), 'default')); program @@ -228,7 +226,6 @@ export function registerCommands(program: Command) { 'CI run checks that there are no changes to catalog-info.yaml files', ) .description('Create or fix info yaml files for all backstage packages') - .allowExcessArguments(true) .action( lazy( () => import('./generate-catalog-info/generate-catalog-info'),