From 769cb030b9c474108523f382c9e6d84de5cc01a4 Mon Sep 17 00:00:00 2001 From: Vincenzo Scamporlino Date: Mon, 16 Mar 2026 23:05:51 +0100 Subject: [PATCH] Enhance plugin package input handling by clearing empty/invalid values and updating pre-population logic Signed-off-by: Vincenzo Scamporlino --- .../collectPortableTemplateInput.test.ts | 50 +++++++++++++++++++ .../collectPortableTemplateInput.ts | 32 +++++++----- 2 files changed, 70 insertions(+), 12 deletions(-) diff --git a/packages/cli-module-new/src/lib/preparation/collectPortableTemplateInput.test.ts b/packages/cli-module-new/src/lib/preparation/collectPortableTemplateInput.test.ts index c0cb4dd563..7436793630 100644 --- a/packages/cli-module-new/src/lib/preparation/collectPortableTemplateInput.test.ts +++ b/packages/cli-module-new/src/lib/preparation/collectPortableTemplateInput.test.ts @@ -214,6 +214,56 @@ describe('collectTemplateParams', () => { packagePath: 'plugins/custom-backend-module-my-extension', }); }); + + it('should re-prompt when pluginPackage is prefilled with an empty string', async () => { + jest.spyOn(inquirer, 'prompt').mockResolvedValueOnce({ + pluginPackage: '@mycompany/plugin-custom-backend', + }); + + await expect( + collectPortableTemplateInput({ + ...backendModuleOptions, + prefilledParams: { + pluginId: 'custom', + moduleId: 'my-extension', + pluginPackage: '', + }, + }), + ).resolves.toEqual( + expect.objectContaining({ + roleParams: expect.objectContaining({ + pluginPackage: '@mycompany/plugin-custom-backend', + }), + }), + ); + + expect(inquirer.prompt).toHaveBeenCalled(); + }); + + it('should re-prompt when pluginPackage is prefilled with an invalid name', async () => { + jest.spyOn(inquirer, 'prompt').mockResolvedValueOnce({ + pluginPackage: '@mycompany/plugin-custom-backend', + }); + + await expect( + collectPortableTemplateInput({ + ...backendModuleOptions, + prefilledParams: { + pluginId: 'custom', + moduleId: 'my-extension', + pluginPackage: 'INVALID PACKAGE NAME!', + }, + }), + ).resolves.toEqual( + expect.objectContaining({ + roleParams: expect.objectContaining({ + pluginPackage: '@mycompany/plugin-custom-backend', + }), + }), + ); + + expect(inquirer.prompt).toHaveBeenCalled(); + }); }); describe('frontend-plugin-module with pluginPackage', () => { diff --git a/packages/cli-module-new/src/lib/preparation/collectPortableTemplateInput.ts b/packages/cli-module-new/src/lib/preparation/collectPortableTemplateInput.ts index a38432a66a..a80ade8942 100644 --- a/packages/cli-module-new/src/lib/preparation/collectPortableTemplateInput.ts +++ b/packages/cli-module-new/src/lib/preparation/collectPortableTemplateInput.ts @@ -65,20 +65,28 @@ export async function collectPortableTemplateInput( ...deprecatedParams, }; - // Pre-populate pluginPackage for known plugins so the prompt is skipped + // Pre-populate pluginPackage for known plugins so the prompt is skipped. + // Also clear out empty/invalid values so they don't bypass the prompt. if ( - (template.role === 'backend-plugin-module' || - template.role === 'frontend-plugin-module') && - parameters.pluginId && - !parameters.pluginPackage + template.role === 'backend-plugin-module' || + template.role === 'frontend-plugin-module' ) { - const knownPackages = - template.role === 'backend-plugin-module' - ? knownBackendPluginPackageNameByPluginId - : knownFrontendPluginPackageNameByPluginId; - const knownPackage = knownPackages[parameters.pluginId as string]; - if (knownPackage) { - parameters.pluginPackage = knownPackage; + if ( + parameters.pluginPackage && + !isValidNpmPackageName(parameters.pluginPackage as string) + ) { + delete parameters.pluginPackage; + } + + if (parameters.pluginId && !parameters.pluginPackage) { + const knownPackages = + template.role === 'backend-plugin-module' + ? knownBackendPluginPackageNameByPluginId + : knownFrontendPluginPackageNameByPluginId; + const knownPackage = knownPackages[parameters.pluginId as string]; + if (knownPackage) { + parameters.pluginPackage = knownPackage; + } } }