From a04d9af5cec67eb778ca976431a99442dc8485bc Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Thu, 2 Apr 2026 02:34:13 +0800 Subject: [PATCH 1/3] rename nextSteps arg --- packages/sv/src/core/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sv/src/core/config.ts b/packages/sv/src/core/config.ts index 5963eedbb..dda819812 100644 --- a/packages/sv/src/core/config.ts +++ b/packages/sv/src/core/config.ts @@ -77,7 +77,7 @@ export type Addon = { } ) => MaybePromise; /** Next steps to display after the addon is run. */ - nextSteps?: (data: Workspace & { options: WorkspaceOptions }) => string[]; + nextSteps?: (workspace: Workspace & { options: WorkspaceOptions }) => string[]; }; /** From 41b29029d9705ee99dc7f9275ea1e28bfb0ec637 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Thu, 2 Apr 2026 18:23:19 +0800 Subject: [PATCH 2/3] order `nextSteps` --- packages/sv/src/cli/add.ts | 24 +++++++++++++++++------- packages/sv/src/cli/create.ts | 9 ++++++--- packages/sv/src/core/engine.ts | 5 ++++- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/packages/sv/src/cli/add.ts b/packages/sv/src/cli/add.ts index c786496d0..033d07472 100644 --- a/packages/sv/src/cli/add.ts +++ b/packages/sv/src/cli/add.ts @@ -18,7 +18,7 @@ import { type SetupResult, getErrorHint } from '../core/config.ts'; -import { applyAddons, setupAddons } from '../core/engine.ts'; +import { applyAddons, orderAddons, setupAddons } from '../core/engine.ts'; import { downloadPackage, getPackageJSON } from '../core/fetch-packages.ts'; import { formatFiles } from '../core/formatFiles.ts'; import { @@ -655,6 +655,7 @@ export async function runAddonsApply({ argsFormattedAddons: string[]; filesToFormat: string[]; successfulAddons: LoadedAddon[]; + setupResults: Record; }> { if (!setupResults) { // When no addons are selected, use official addons for setup @@ -666,7 +667,13 @@ export async function runAddonsApply({ // we'll return early when no addons are selected, // indicating that installing deps was skipped and no PM was selected if (loadedAddons.length === 0) - return { nextSteps: [], argsFormattedAddons: [], filesToFormat: [], successfulAddons: [] }; + return { + nextSteps: [], + argsFormattedAddons: [], + filesToFormat: [], + successfulAddons: [], + setupResults: {} + }; const { filesToFormat, pnpmBuildDependencies, status } = await applyAddons({ loadedAddons, @@ -768,19 +775,22 @@ export async function runAddonsApply({ await formatFiles({ packageManager, cwd: options.cwd, filesToFormat }); } - const nextSteps = getNextSteps(successfulAddons, workspace, answers); + const nextSteps = getNextSteps(successfulAddons, workspace, answers, setupResults); - return { nextSteps, argsFormattedAddons, filesToFormat, successfulAddons }; + return { nextSteps, argsFormattedAddons, filesToFormat, successfulAddons, setupResults }; } export function getNextSteps( loadedAddons: LoadedAddon[], workspace: Workspace, - answers: Record> + answers: Record>, + setupResults: Record ): string[] { - return loadedAddons + const addonDefs = loadedAddons.map((l) => l.addon); + + return orderAddons(addonDefs, setupResults) .map((loaded) => { - const addon = loaded.addon; + const { addon } = loadedAddons.find((l) => l.addon.id === loaded.id)!; if (!addon.nextSteps) return; const addonOptions = answers[addon.id]; const addonNextSteps = addon.nextSteps({ ...workspace, options: addonOptions }); diff --git a/packages/sv/src/cli/create.ts b/packages/sv/src/cli/create.ts index b31804536..c2a721118 100644 --- a/packages/sv/src/cli/create.ts +++ b/packages/sv/src/cli/create.ts @@ -6,7 +6,7 @@ import path from 'node:path'; import process from 'node:process'; import * as v from 'valibot'; import * as common from '../core/common.ts'; -import type { LoadedAddon, OptionValues } from '../core/config.ts'; +import type { LoadedAddon, OptionValues, SetupResult } from '../core/config.ts'; import { formatFiles } from '../core/formatFiles.ts'; import { AGENT_NAMES, @@ -331,11 +331,13 @@ async function createProject(cwd: ProjectPath, options: Options) { let argsFormattedAddons: string[] = []; let addOnFilesToFormat: string[] = []; let addOnSuccessfulAddons: LoadedAddon[] = []; + let addonSetupResults: Record = {}; if (template !== 'addon' && (options.addOns || options.add.length > 0)) { const { argsFormattedAddons: argsFormatted, filesToFormat, - successfulAddons + successfulAddons, + setupResults } = await runAddonsApply({ answers, options: { @@ -354,6 +356,7 @@ async function createProject(cwd: ProjectPath, options: Options) { argsFormattedAddons = argsFormatted; addOnFilesToFormat = filesToFormat; addOnSuccessfulAddons = successfulAddons; + addonSetupResults = setupResults; } const packageManager = @@ -382,7 +385,7 @@ async function createProject(cwd: ProjectPath, options: Options) { if (packageManager) { workspace.packageManager = packageManager; } - const addOnNextSteps = getNextSteps(addOnSuccessfulAddons, workspace, answers); + const addOnNextSteps = getNextSteps(addOnSuccessfulAddons, workspace, answers, addonSetupResults); await addPnpmBuildDependencies(projectPath, packageManager, ['esbuild']); if (packageManager) { diff --git a/packages/sv/src/core/engine.ts b/packages/sv/src/core/engine.ts index 1c7656467..805531bb6 100644 --- a/packages/sv/src/core/engine.ts +++ b/packages/sv/src/core/engine.ts @@ -264,7 +264,10 @@ async function runAddon({ addon, loaded, multiple, workspace, workspaceOptions } // orders addons by putting addons that don't require any other addon in the front. // This is a drastic simplification, as this could still cause some inconvenient circumstances, // but works for now in contrary to the previous implementation -function orderAddons(addons: Array>, setupResults: Record) { +export function orderAddons( + addons: Array>, + setupResults: Record +): Array> { return addons.sort((a, b) => { return setupResults[a.id]?.runsAfter?.length - setupResults[b.id]?.runsAfter?.length; }); From 190c9f1a80d5d928cb44db9d64dce20a7abc6eac Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Thu, 2 Apr 2026 20:27:42 +0800 Subject: [PATCH 3/3] changeset --- .changeset/blue-sloths-carry.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/blue-sloths-carry.md diff --git a/.changeset/blue-sloths-carry.md b/.changeset/blue-sloths-carry.md new file mode 100644 index 000000000..2d188e3d1 --- /dev/null +++ b/.changeset/blue-sloths-carry.md @@ -0,0 +1,5 @@ +--- +"sv": patch +--- + +fix(sv): `nextStep` will conform to depedencies