From b37746f5117ce122834da1c169059779e568931e Mon Sep 17 00:00:00 2001 From: jycouet Date: Fri, 5 Sep 2025 19:37:37 +0200 Subject: [PATCH 1/3] fix(add): allow passing add-on as argument that depends on another add-on --- .changeset/light-taxis-share.md | 5 +++++ packages/cli/commands/add/index.ts | 13 ++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 .changeset/light-taxis-share.md diff --git a/.changeset/light-taxis-share.md b/.changeset/light-taxis-share.md new file mode 100644 index 000000000..e93caa375 --- /dev/null +++ b/.changeset/light-taxis-share.md @@ -0,0 +1,5 @@ +--- +'sv': patch +--- + +fix(add): allow passing add-on as argument that depends on another add-on diff --git a/packages/cli/commands/add/index.ts b/packages/cli/commands/add/index.ts index f7449f588..0e53e9109 100644 --- a/packages/cli/commands/add/index.ts +++ b/packages/cli/commands/add/index.ts @@ -381,7 +381,7 @@ export async function runAddCommand( // prepare official addons let workspace = await createWorkspace({ cwd: options.cwd }); const setups = selectedAddons.length ? selectedAddons.map(({ addon }) => addon) : officialAddons; - const addonSetupResults = setupAddons(setups, workspace); + let addonSetupResults = setupAddons(setups, workspace); // prompt which addons to apply if (selectedAddons.length === 0) { @@ -411,6 +411,11 @@ export async function runAddCommand( } // add inter-addon dependencies + addonSetupResults = setupAddons( + selectedAddons.map(({ addon }) => addon), + workspace + ); + for (const { addon } of selectedAddons) { workspace = await createWorkspace(workspace); @@ -433,6 +438,12 @@ export async function runAddCommand( process.exit(1); } selectedAddons.push({ type: 'official', addon: dependency }); + + // Regenerate setup results to include the newly added dependency + addonSetupResults = setupAddons( + selectedAddons.map(({ addon }) => addon), + workspace + ); } } From 593f696d4706639d28d74272008f99275ff8e2d4 Mon Sep 17 00:00:00 2001 From: jycouet Date: Fri, 5 Sep 2025 20:54:44 +0200 Subject: [PATCH 2/3] fix: setupAddons later on only once --- packages/cli/commands/add/index.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/cli/commands/add/index.ts b/packages/cli/commands/add/index.ts index 0e53e9109..282fae899 100644 --- a/packages/cli/commands/add/index.ts +++ b/packages/cli/commands/add/index.ts @@ -411,11 +411,6 @@ export async function runAddCommand( } // add inter-addon dependencies - addonSetupResults = setupAddons( - selectedAddons.map(({ addon }) => addon), - workspace - ); - for (const { addon } of selectedAddons) { workspace = await createWorkspace(workspace); From 3127ae01123c8642d8d381b192c9b4b4d6e1b24d Mon Sep 17 00:00:00 2001 From: AdrianGonz97 <31664583+AdrianGonz97@users.noreply.github.com> Date: Fri, 5 Sep 2025 16:24:54 -0400 Subject: [PATCH 3/3] tweak ordering --- packages/cli/commands/add/index.ts | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/packages/cli/commands/add/index.ts b/packages/cli/commands/add/index.ts index 282fae899..25b0ec88c 100644 --- a/packages/cli/commands/add/index.ts +++ b/packages/cli/commands/add/index.ts @@ -380,14 +380,13 @@ export async function runAddCommand( // prepare official addons let workspace = await createWorkspace({ cwd: options.cwd }); - const setups = selectedAddons.length ? selectedAddons.map(({ addon }) => addon) : officialAddons; - let addonSetupResults = setupAddons(setups, workspace); // prompt which addons to apply if (selectedAddons.length === 0) { + const allSetupResults = setupAddons(officialAddons, workspace); const addonOptions = officialAddons // only display supported addons relative to the current environment - .filter(({ id }) => addonSetupResults[id].unsupported.length === 0) + .filter(({ id }) => allSetupResults[id].unsupported.length === 0) .map(({ id, homepage, shortDescription }) => ({ label: id, value: id, @@ -414,7 +413,9 @@ export async function runAddCommand( for (const { addon } of selectedAddons) { workspace = await createWorkspace(workspace); - const setupResult = addonSetupResults[addon.id]; + const setups = selectedAddons.map(({ addon }) => addon); + const setupResult = setupAddons(setups, workspace)[addon.id]; + const missingDependencies = setupResult.dependsOn.filter( (depId) => !selectedAddons.some((a) => a.addon.id === depId) ); @@ -433,17 +434,14 @@ export async function runAddCommand( process.exit(1); } selectedAddons.push({ type: 'official', addon: dependency }); - - // Regenerate setup results to include the newly added dependency - addonSetupResults = setupAddons( - selectedAddons.map(({ addon }) => addon), - workspace - ); } } - // run verifications + // run all setups after inter-addon deps have been added const addons = selectedAddons.map(({ addon }) => addon); + const addonSetupResults = setupAddons(addons, workspace); + + // run verifications const verifications = [ ...verifyCleanWorkingDirectory(options.cwd, options.gitCheck), ...verifyUnsupportedAddons(addons, addonSetupResults)