Skip to content

Commit 4a24bc9

Browse files
authored
fix(sv): nextStep will conform to depedencies (#1025)
1 parent 73745c5 commit 4a24bc9

5 files changed

Lines changed: 33 additions & 12 deletions

File tree

.changeset/blue-sloths-carry.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"sv": patch
3+
---
4+
5+
fix(sv): `nextStep` will conform to depedencies

packages/sv/src/cli/add.ts

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import {
1818
type SetupResult,
1919
getErrorHint
2020
} from '../core/config.ts';
21-
import { applyAddons, setupAddons } from '../core/engine.ts';
21+
import { applyAddons, orderAddons, setupAddons } from '../core/engine.ts';
2222
import { downloadPackage, getPackageJSON } from '../core/fetch-packages.ts';
2323
import { formatFiles } from '../core/formatFiles.ts';
2424
import {
@@ -655,6 +655,7 @@ export async function runAddonsApply({
655655
argsFormattedAddons: string[];
656656
filesToFormat: string[];
657657
successfulAddons: LoadedAddon[];
658+
setupResults: Record<string, SetupResult>;
658659
}> {
659660
if (!setupResults) {
660661
// When no addons are selected, use official addons for setup
@@ -666,7 +667,13 @@ export async function runAddonsApply({
666667
// we'll return early when no addons are selected,
667668
// indicating that installing deps was skipped and no PM was selected
668669
if (loadedAddons.length === 0)
669-
return { nextSteps: [], argsFormattedAddons: [], filesToFormat: [], successfulAddons: [] };
670+
return {
671+
nextSteps: [],
672+
argsFormattedAddons: [],
673+
filesToFormat: [],
674+
successfulAddons: [],
675+
setupResults: {}
676+
};
670677

671678
const { filesToFormat, pnpmBuildDependencies, status } = await applyAddons({
672679
loadedAddons,
@@ -768,19 +775,22 @@ export async function runAddonsApply({
768775
await formatFiles({ packageManager, cwd: options.cwd, filesToFormat });
769776
}
770777

771-
const nextSteps = getNextSteps(successfulAddons, workspace, answers);
778+
const nextSteps = getNextSteps(successfulAddons, workspace, answers, setupResults);
772779

773-
return { nextSteps, argsFormattedAddons, filesToFormat, successfulAddons };
780+
return { nextSteps, argsFormattedAddons, filesToFormat, successfulAddons, setupResults };
774781
}
775782

776783
export function getNextSteps(
777784
loadedAddons: LoadedAddon[],
778785
workspace: Workspace,
779-
answers: Record<string, OptionValues<any>>
786+
answers: Record<string, OptionValues<any>>,
787+
setupResults: Record<string, SetupResult>
780788
): string[] {
781-
return loadedAddons
789+
const addonDefs = loadedAddons.map((l) => l.addon);
790+
791+
return orderAddons(addonDefs, setupResults)
782792
.map((loaded) => {
783-
const addon = loaded.addon;
793+
const { addon } = loadedAddons.find((l) => l.addon.id === loaded.id)!;
784794
if (!addon.nextSteps) return;
785795
const addonOptions = answers[addon.id];
786796
const addonNextSteps = addon.nextSteps({ ...workspace, options: addonOptions });

packages/sv/src/cli/create.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import path from 'node:path';
66
import process from 'node:process';
77
import * as v from 'valibot';
88
import * as common from '../core/common.ts';
9-
import type { LoadedAddon, OptionValues } from '../core/config.ts';
9+
import type { LoadedAddon, OptionValues, SetupResult } from '../core/config.ts';
1010
import { formatFiles } from '../core/formatFiles.ts';
1111
import {
1212
AGENT_NAMES,
@@ -331,11 +331,13 @@ async function createProject(cwd: ProjectPath, options: Options) {
331331
let argsFormattedAddons: string[] = [];
332332
let addOnFilesToFormat: string[] = [];
333333
let addOnSuccessfulAddons: LoadedAddon[] = [];
334+
let addonSetupResults: Record<string, SetupResult> = {};
334335
if (template !== 'addon' && (options.addOns || options.add.length > 0)) {
335336
const {
336337
argsFormattedAddons: argsFormatted,
337338
filesToFormat,
338-
successfulAddons
339+
successfulAddons,
340+
setupResults
339341
} = await runAddonsApply({
340342
answers,
341343
options: {
@@ -354,6 +356,7 @@ async function createProject(cwd: ProjectPath, options: Options) {
354356
argsFormattedAddons = argsFormatted;
355357
addOnFilesToFormat = filesToFormat;
356358
addOnSuccessfulAddons = successfulAddons;
359+
addonSetupResults = setupResults;
357360
}
358361

359362
const packageManager =
@@ -382,7 +385,7 @@ async function createProject(cwd: ProjectPath, options: Options) {
382385
if (packageManager) {
383386
workspace.packageManager = packageManager;
384387
}
385-
const addOnNextSteps = getNextSteps(addOnSuccessfulAddons, workspace, answers);
388+
const addOnNextSteps = getNextSteps(addOnSuccessfulAddons, workspace, answers, addonSetupResults);
386389

387390
await addPnpmBuildDependencies(projectPath, packageManager, ['esbuild']);
388391
if (packageManager) {

packages/sv/src/core/config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export type Addon<Args extends OptionDefinition, Id extends string = string> = {
7777
}
7878
) => MaybePromise<void>;
7979
/** Next steps to display after the addon is run. */
80-
nextSteps?: (data: Workspace & { options: WorkspaceOptions<Args> }) => string[];
80+
nextSteps?: (workspace: Workspace & { options: WorkspaceOptions<Args> }) => string[];
8181
};
8282

8383
/**

packages/sv/src/core/engine.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,10 @@ async function runAddon({ addon, loaded, multiple, workspace, workspaceOptions }
264264
// orders addons by putting addons that don't require any other addon in the front.
265265
// This is a drastic simplification, as this could still cause some inconvenient circumstances,
266266
// but works for now in contrary to the previous implementation
267-
function orderAddons(addons: Array<Addon<any>>, setupResults: Record<string, SetupResult>) {
267+
export function orderAddons(
268+
addons: Array<Addon<any>>,
269+
setupResults: Record<string, SetupResult>
270+
): Array<Addon<any>> {
268271
return addons.sort((a, b) => {
269272
return setupResults[a.id]?.runsAfter?.length - setupResults[b.id]?.runsAfter?.length;
270273
});

0 commit comments

Comments
 (0)