From 2815a8c7e8389a3b7b3605dddef1cb9219f7e341 Mon Sep 17 00:00:00 2001 From: Manuel Date: Sun, 2 Feb 2025 08:49:10 +0100 Subject: [PATCH] cleanup --- community-addon-template/tests/setup/suite.ts | 27 ++++++++++++++++--- packages/addons/_tests/_setup/suite.ts | 6 ++--- packages/cli/commands/add/index.ts | 19 +++++++------ packages/cli/commands/create.ts | 4 +-- packages/cli/lib/install.ts | 18 ++++++------- packages/cli/lib/testing.ts | 4 +-- packages/cli/utils/package-manager.ts | 9 ++++--- packages/core/addon/config.ts | 2 +- 8 files changed, 55 insertions(+), 34 deletions(-) diff --git a/community-addon-template/tests/setup/suite.ts b/community-addon-template/tests/setup/suite.ts index 46f3f8c8..9b2dc0a5 100644 --- a/community-addon-template/tests/setup/suite.ts +++ b/community-addon-template/tests/setup/suite.ts @@ -3,7 +3,13 @@ import path from 'node:path'; import { execSync } from 'node:child_process'; import * as vitest from 'vitest'; import { installAddon, type AddonMap, type OptionMap } from 'sv'; -import { createProject, startPreview, type CreateProject, type ProjectVariant } from 'sv/testing'; +import { + addPnpmBuildDependendencies, + createProject, + startPreview, + type CreateProject, + type ProjectVariant +} from 'sv/testing'; import { chromium, type Browser, type Page } from '@playwright/test'; import { fileURLToPath } from 'node:url'; @@ -40,9 +46,18 @@ export function setupTest(addons: Addons) { // creates a pnpm workspace in each addon dir fs.writeFileSync( path.resolve(cwd, testName, 'pnpm-workspace.yaml'), - `packages:\n - '**/*'`, + "packages:\n - '**/*'", 'utf8' ); + + // creates a barebones package.json in each addon dir + fs.writeFileSync( + path.resolve(cwd, testName, 'package.json'), + JSON.stringify({ + name: `${testName}-workspace-root`, + private: true + }) + ); }); // runs before each test case @@ -57,7 +72,13 @@ export function setupTest(addons: Addons) { fs.writeFileSync(metaPath, JSON.stringify({ variant, options }, null, '\t'), 'utf8'); // run addon - await installAddon({ cwd, addons, options, packageManager: 'pnpm' }); + const { pnpmBuildDependencies } = await installAddon({ + cwd, + addons, + options, + packageManager: 'pnpm' + }); + addPnpmBuildDependendencies(cwd, 'pnpm', ['esbuild', ...pnpmBuildDependencies]); return cwd; }; diff --git a/packages/addons/_tests/_setup/suite.ts b/packages/addons/_tests/_setup/suite.ts index d4a7f995..5c6e5a1b 100644 --- a/packages/addons/_tests/_setup/suite.ts +++ b/packages/addons/_tests/_setup/suite.ts @@ -6,7 +6,7 @@ import { installAddon, type AddonMap, type OptionMap } from 'sv'; import { createProject, startPreview, - allowExecutingPostinstallScripts, + addPnpmBuildDependendencies, type CreateProject, type ProjectVariant } from 'sv/testing'; @@ -69,13 +69,13 @@ export function setupTest(addons: Addons) { fs.writeFileSync(metaPath, JSON.stringify({ variant, options }, null, '\t'), 'utf8'); // run addon - const { allowedPostinstallScripts } = await installAddon({ + const { pnpmBuildDependencies } = await installAddon({ cwd, addons, options, packageManager: 'pnpm' }); - allowExecutingPostinstallScripts(cwd, 'pnpm', ['esbuild', ...allowedPostinstallScripts]); + addPnpmBuildDependendencies(cwd, 'pnpm', ['esbuild', ...pnpmBuildDependencies]); return cwd; }; diff --git a/packages/cli/commands/add/index.ts b/packages/cli/commands/add/index.ts index 4e0345d5..054b47b8 100644 --- a/packages/cli/commands/add/index.ts +++ b/packages/cli/commands/add/index.ts @@ -19,7 +19,7 @@ import { createWorkspace } from './workspace.ts'; import { formatFiles, getHighlighter } from './utils.ts'; import { Directive, downloadPackage, getPackageJSON } from './fetch-packages.ts'; import { - allowExecutingPostinstallScripts, + addPnpmBuildDependendencies, installDependencies, packageManagerPrompt } from '../../utils/package-manager.ts'; @@ -437,13 +437,12 @@ export async function runAddCommand( const details = officialDetails.concat(commDetails); const addonMap: AddonMap = Object.assign({}, ...details.map((a) => ({ [a.id]: a }))); - const { filesToFormat, allowedPostinstallScripts: allowedAddonPostinstallScripts } = - await applyAddons({ - workspace, - addonSetupResults, - addons: addonMap, - options: official - }); + const { filesToFormat, pnpmBuildDependencies: addonPnpmBuildDependencies } = await applyAddons({ + workspace, + addonSetupResults, + addons: addonMap, + options: official + }); p.log.success('Successfully setup add-ons'); @@ -455,9 +454,9 @@ export async function runAddCommand( if (packageManager) { workspace.packageManager = packageManager; - allowExecutingPostinstallScripts(workspace.cwd, packageManager, [ + addPnpmBuildDependendencies(workspace.cwd, packageManager, [ 'esbuild', - ...allowedAddonPostinstallScripts + ...addonPnpmBuildDependencies ]); await installDependencies(packageManager, options.cwd); diff --git a/packages/cli/commands/create.ts b/packages/cli/commands/create.ts index c3b0adc1..77a5d8ce 100644 --- a/packages/cli/commands/create.ts +++ b/packages/cli/commands/create.ts @@ -15,7 +15,7 @@ import * as common from '../utils/common.ts'; import { runAddCommand } from './add/index.ts'; import { detectSync, resolveCommand, type AgentName } from 'package-manager-detector'; import { - allowExecutingPostinstallScripts, + addPnpmBuildDependendencies, getUserAgent, installDependencies, packageManagerPrompt @@ -165,7 +165,7 @@ async function createProject(cwd: ProjectPath, options: Options) { let addOnNextSteps: string | undefined; const installDeps = async () => { packageManager = await packageManagerPrompt(projectPath); - allowExecutingPostinstallScripts(projectPath, packageManager, ['esbuild']); + addPnpmBuildDependendencies(projectPath, packageManager, ['esbuild']); if (packageManager) await installDependencies(packageManager, projectPath); }; diff --git a/packages/cli/lib/install.ts b/packages/cli/lib/install.ts index 1b7e9273..6f98ce43 100644 --- a/packages/cli/lib/install.ts +++ b/packages/cli/lib/install.ts @@ -53,10 +53,10 @@ export async function applyAddons({ options }: ApplyAddonOptions): Promise<{ filesToFormat: string[]; - allowedPostinstallScripts: string[]; + pnpmBuildDependencies: string[]; }> { const filesToFormat = new Set(); - const allowedPostinstallScripts: string[] = []; + const allPnpmBuildDependencies: string[] = []; const mapped = Object.entries(addons).map(([, addon]) => addon); const ordered = orderAddons(mapped, addonSetupResults); @@ -64,19 +64,19 @@ export async function applyAddons({ for (const addon of ordered) { workspace = createWorkspace({ ...workspace, options: options[addon.id] }); - const { files, allowPostinstallScripts } = await runAddon({ + const { files, pnpmBuildDependencies } = await runAddon({ workspace, addon, multiple: ordered.length > 1 }); files.forEach((f) => filesToFormat.add(f)); - allowPostinstallScripts.forEach((s) => allowedPostinstallScripts.push(s)); + pnpmBuildDependencies.forEach((s) => allPnpmBuildDependencies.push(s)); } return { filesToFormat: Array.from(filesToFormat), - allowedPostinstallScripts + pnpmBuildDependencies: allPnpmBuildDependencies }; } @@ -116,7 +116,7 @@ async function runAddon({ addon, multiple, workspace }: RunAddon) { } const dependencies: Array<{ pkg: string; version: string; dev: boolean }> = []; - const allowPostinstallScripts: string[] = []; + const pnpmBuildDependencies: string[] = []; const sv: SvApi = { file: (path, content) => { try { @@ -165,8 +165,8 @@ async function runAddon({ addon, multiple, workspace }: RunAddon) { devDependency: (pkg, version) => { dependencies.push({ pkg, version, dev: true }); }, - allowPostinstallScript: (pkg) => { - allowPostinstallScripts.push(pkg); + pnpmBuildDependendency: (pkg) => { + pnpmBuildDependencies.push(pkg); } }; await addon.run({ ...workspace, sv }); @@ -176,7 +176,7 @@ async function runAddon({ addon, multiple, workspace }: RunAddon) { return { files: Array.from(files), - allowPostinstallScripts + pnpmBuildDependencies }; } diff --git a/packages/cli/lib/testing.ts b/packages/cli/lib/testing.ts index 77428c32..8dc06358 100644 --- a/packages/cli/lib/testing.ts +++ b/packages/cli/lib/testing.ts @@ -5,9 +5,9 @@ import degit from 'degit'; import { exec } from 'tinyexec'; import { create } from '@sveltejs/create'; import pstree, { type PS } from 'ps-tree'; -import { allowExecutingPostinstallScripts } from '../utils/package-manager.ts'; +import { addPnpmBuildDependendencies } from '../utils/package-manager.ts'; -export { allowExecutingPostinstallScripts }; +export { addPnpmBuildDependendencies }; export type ProjectVariant = 'kit-js' | 'kit-ts' | 'vite-js' | 'vite-ts'; const TEMPLATES_DIR = '.templates'; diff --git a/packages/cli/utils/package-manager.ts b/packages/cli/utils/package-manager.ts index 127d935a..c79a59e7 100644 --- a/packages/cli/utils/package-manager.ts +++ b/packages/cli/utils/package-manager.ts @@ -72,24 +72,24 @@ export function getUserAgent(): AgentName | undefined { return AGENTS.includes(name) ? name : undefined; } -export function allowExecutingPostinstallScripts( +export function addPnpmBuildDependendencies( cwd: string, packageManager: AgentName | null | undefined, allowedPackages: string[] ) { - // currently we only need to explicitly allow running postinstall - // scripts for pnpm. It's possible that this sets precedence for - // other package managers tho, therefore this has been extracted here. + // other package managers are currently not affected by this change if (!packageManager || packageManager !== 'pnpm') return; // find the workspace root const pnpmWorkspacePath = find.up('pnpm-workspace.yaml', { cwd }); if (!pnpmWorkspacePath) return; + // load the package.json const pkgPath = path.join(path.dirname(pnpmWorkspacePath), 'package.json'); const content = fs.readFileSync(pkgPath, 'utf-8'); const { data, generateCode } = parseJson(content); + // add the packages where we want the postinstall scripts to be run data.pnpm ??= {}; data.pnpm.onlyBuiltDependencies ??= []; for (const allowedPackage of allowedPackages) { @@ -97,6 +97,7 @@ export function allowExecutingPostinstallScripts( data.pnpm.onlyBuiltDependencies.push(allowedPackage); } + // save the updated package.json const newContent = generateCode(); fs.writeFileSync(pkgPath, newContent); } diff --git a/packages/core/addon/config.ts b/packages/core/addon/config.ts index cd816531..be36f777 100644 --- a/packages/core/addon/config.ts +++ b/packages/core/addon/config.ts @@ -20,7 +20,7 @@ export type Scripts = { }; export type SvApi = { - allowPostinstallScript: (pkg: string) => void; + pnpmBuildDependendency: (pkg: string) => void; dependency: (pkg: string, version: string) => void; devDependency: (pkg: string, version: string) => void; execute: (args: string[], stdio: 'inherit' | 'pipe') => Promise;