From 1651314435f99c85fcaa5f2d1f5399938115754c Mon Sep 17 00:00:00 2001 From: jycouet Date: Thu, 18 Sep 2025 11:13:03 +0200 Subject: [PATCH 01/15] fix(tailwindcss): add `@tailwindcss/oxide` to approve-builds in `pnpm` --- .changeset/nasty-towns-crash.md | 5 +++++ packages/addons/tailwindcss/index.ts | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/nasty-towns-crash.md diff --git a/.changeset/nasty-towns-crash.md b/.changeset/nasty-towns-crash.md new file mode 100644 index 00000000..9e9f474d --- /dev/null +++ b/.changeset/nasty-towns-crash.md @@ -0,0 +1,5 @@ +--- +'sv': patch +--- + +fix(tailwindcss): add `@tailwindcss/oxide` to approve-builds in `pnpm` diff --git a/packages/addons/tailwindcss/index.ts b/packages/addons/tailwindcss/index.ts index 022d8d81..40a84bbf 100644 --- a/packages/addons/tailwindcss/index.ts +++ b/packages/addons/tailwindcss/index.ts @@ -37,6 +37,7 @@ export default defineAddon({ sv.devDependency('tailwindcss', '^4.0.0'); sv.devDependency('@tailwindcss/vite', '^4.0.0'); + sv.pnpmBuildDependency('@tailwindcss/oxide'); if (prettierInstalled) sv.devDependency('prettier-plugin-tailwindcss', '^0.6.11'); From a906f7d0a6207548efcf01a75e494fd85bf5294c Mon Sep 17 00:00:00 2001 From: jycouet Date: Thu, 18 Sep 2025 11:26:59 +0200 Subject: [PATCH 02/15] addd yaml utils --- packages/core/package.json | 1 + packages/core/tests/utils.ts | 90 +++++++++++++++++++++++++++++++- packages/core/tooling/index.ts | 9 ++++ packages/core/tooling/parsers.ts | 10 ++++ pnpm-lock.yaml | 29 ++++++---- 5 files changed, 128 insertions(+), 11 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index 8897e990..4d9009be 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -57,6 +57,7 @@ "picocolors": "^1.1.1", "postcss": "^8.5.6", "silver-fleece": "^1.2.1", + "yaml": "^2.8.1", "zimmerframe": "^1.1.2" }, "keywords": [ diff --git a/packages/core/tests/utils.ts b/packages/core/tests/utils.ts index 37979d0b..01139fbc 100644 --- a/packages/core/tests/utils.ts +++ b/packages/core/tests/utils.ts @@ -1,11 +1,13 @@ -import { expect, test } from 'vitest'; +import { describe, expect, test } from 'vitest'; import dedent from 'dedent'; import { parseScript, serializeScript, guessIndentString, guessQuoteStyle, - type AstTypes + type AstTypes, + serializeYaml, + parseYaml } from '../tooling/index.ts'; test('guessIndentString - one tab', () => { @@ -183,3 +185,87 @@ test('integration - preserves comments', () => { let foo = 'bar';" `); }); + +describe('yaml', () => { + test('read and write', () => { + const input = dedent`foo: + - bar + - baz`; + const output = serializeYaml(parseYaml(input)); + expect(output).toMatchInlineSnapshot(` + "foo: + - bar + - baz + " + `); + }); + + test('edit object', () => { + const input = dedent`foo: + # nice comment + - bar + - baz`; + const doc = parseYaml(input); + const foo = doc.get('foo'); + if (foo) foo.add('yop'); + else doc.set('foo', ['yop']); + expect(serializeYaml(doc)).toMatchInlineSnapshot(` + "foo: + # nice comment + - bar + - baz + - yop + " + `); + }); + + test('add to array (keeping comments)', () => { + const input = dedent`foo: + - bar + # com + - baz`; + const doc = parseYaml(input); + const toAdd = ['bar', 'yop1', 'yop2', 'yop1']; + const foo = doc.get('foo'); + const items: Array<{ value: string } | string> = foo?.items ?? []; + for (const item of toAdd) { + if (items.includes(item)) continue; + if (items.some((y) => typeof y === 'object' && y.value === item)) continue; + items.push(item); + } + doc.set('foo', new Set(items)); + expect(serializeYaml(doc)).toMatchInlineSnapshot(` + "foo: + - bar + # com + - baz + - yop1 + - yop2 + " + `); + }); + + test('create object', () => { + const input = dedent`# this is my file`; + const doc = parseYaml(input); + const foo = doc.get('foo'); + if (foo) foo.add('yop'); + else doc.set('foo', ['yop']); + expect(serializeYaml(doc)).toMatchInlineSnapshot(` + "# this is my file + + foo: + - yop + " + `); + }); + + test('array of foo', () => { + const input = dedent`foo: # nice comment - bar - baz`; + const output = serializeYaml(parseYaml(input)); + expect(output).toMatchInlineSnapshot(` + "foo: # nice comment - bar - baz + " + `); + }); +}); diff --git a/packages/core/tooling/index.ts b/packages/core/tooling/index.ts index ac42aa48..b2fbe43f 100644 --- a/packages/core/tooling/index.ts +++ b/packages/core/tooling/index.ts @@ -16,6 +16,7 @@ import * as fleece from 'silver-fleece'; import { print as esrapPrint } from 'esrap'; import * as acorn from 'acorn'; import { tsPlugin } from '@sveltejs/acorn-typescript'; +import * as yaml from 'yaml'; export { // html @@ -238,3 +239,11 @@ export function guessQuoteStyle(ast: TsEstree.Node): 'single' | 'double' | undef return singleCount > doubleCount ? 'single' : 'double'; } + +export function parseYaml(content: string): ReturnType { + return yaml.parseDocument(content); +} + +export function serializeYaml(data: unknown): string { + return yaml.stringify(data, { singleQuote: true }); +} diff --git a/packages/core/tooling/parsers.ts b/packages/core/tooling/parsers.ts index f7764d34..21b6b099 100644 --- a/packages/core/tooling/parsers.ts +++ b/packages/core/tooling/parsers.ts @@ -35,6 +35,16 @@ export function parseJson(source: string): { data: any } & ParseBase { return { data, source, generateCode }; } +export function parseYaml( + source: string +): { data: ReturnType } & ParseBase { + if (!source) source = ''; + const data = utils.parseYaml(source); + const generateCode = () => utils.serializeYaml(data); + + return { data, source, generateCode }; +} + type SvelteGenerator = (code: { script?: string; module?: string; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 30594fb7..f62b6a13 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -67,7 +67,7 @@ importers: version: 0.8.3(rollup@4.46.2)(typescript@5.8.3) vitest: specifier: 4.0.0-beta.6 - version: 4.0.0-beta.6(@types/node@22.15.32)(@vitest/ui@4.0.0-beta.6) + version: 4.0.0-beta.6(@types/node@22.15.32)(@vitest/ui@4.0.0-beta.6)(yaml@2.8.1) community-addon-template: dependencies: @@ -83,7 +83,7 @@ importers: version: link:../packages/cli vitest: specifier: 4.0.0-beta.6 - version: 4.0.0-beta.6(@types/node@22.15.32)(@vitest/ui@4.0.0-beta.6) + version: 4.0.0-beta.6(@types/node@22.15.32)(@vitest/ui@4.0.0-beta.6)(yaml@2.8.1) packages/addons: dependencies: @@ -181,6 +181,9 @@ importers: silver-fleece: specifier: ^1.2.1 version: 1.2.1 + yaml: + specifier: ^2.8.1 + version: 2.8.1 zimmerframe: specifier: ^1.1.2 version: 1.1.2 @@ -2196,6 +2199,11 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} + yaml@2.8.1: + resolution: {integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==} + engines: {node: '>= 14.6'} + hasBin: true + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -2904,13 +2912,13 @@ snapshots: chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/mocker@4.0.0-beta.6(vite@7.0.6(@types/node@22.15.32))': + '@vitest/mocker@4.0.0-beta.6(vite@7.0.6(@types/node@22.15.32)(yaml@2.8.1))': dependencies: '@vitest/spy': 4.0.0-beta.6 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 7.0.6(@types/node@22.15.32) + vite: 7.0.6(@types/node@22.15.32)(yaml@2.8.1) '@vitest/pretty-format@4.0.0-beta.6': dependencies: @@ -2939,7 +2947,7 @@ snapshots: sirv: 3.0.1 tinyglobby: 0.2.14 tinyrainbow: 2.0.0 - vitest: 4.0.0-beta.6(@types/node@22.15.32)(@vitest/ui@4.0.0-beta.6) + vitest: 4.0.0-beta.6(@types/node@22.15.32)(@vitest/ui@4.0.0-beta.6)(yaml@2.8.1) '@vitest/utils@4.0.0-beta.6': dependencies: @@ -4010,7 +4018,7 @@ snapshots: optionalDependencies: typescript: 5.8.3 - vite@7.0.6(@types/node@22.15.32): + vite@7.0.6(@types/node@22.15.32)(yaml@2.8.1): dependencies: esbuild: 0.25.8 fdir: 6.4.6(picomatch@4.0.3) @@ -4021,12 +4029,13 @@ snapshots: optionalDependencies: '@types/node': 22.15.32 fsevents: 2.3.3 + yaml: 2.8.1 - vitest@4.0.0-beta.6(@types/node@22.15.32)(@vitest/ui@4.0.0-beta.6): + vitest@4.0.0-beta.6(@types/node@22.15.32)(@vitest/ui@4.0.0-beta.6)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 4.0.0-beta.6 - '@vitest/mocker': 4.0.0-beta.6(vite@7.0.6(@types/node@22.15.32)) + '@vitest/mocker': 4.0.0-beta.6(vite@7.0.6(@types/node@22.15.32)(yaml@2.8.1)) '@vitest/pretty-format': 4.0.0-beta.6 '@vitest/runner': 4.0.0-beta.6 '@vitest/snapshot': 4.0.0-beta.6 @@ -4045,7 +4054,7 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.0.6(@types/node@22.15.32) + vite: 7.0.6(@types/node@22.15.32)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.15.32 @@ -4098,6 +4107,8 @@ snapshots: yaml@1.10.2: {} + yaml@2.8.1: {} + yocto-queue@0.1.0: {} zimmerframe@1.1.2: {} From eec72fdcd7ec14566dd2a32800083ce1c68ccd07 Mon Sep 17 00:00:00 2001 From: jycouet Date: Thu, 18 Sep 2025 11:49:49 +0200 Subject: [PATCH 03/15] using yaml-workspace when possible --- community-addon-template/tests/setup/suite.ts | 2 +- package.json | 7 +- packages/addons/_tests/_setup/suite.ts | 2 +- packages/cli/commands/add/index.ts | 2 +- packages/cli/commands/create.ts | 2 +- packages/cli/utils/package-manager.ts | 96 ++++++++++++------- pnpm-workspace.yaml | 3 + 7 files changed, 71 insertions(+), 43 deletions(-) diff --git a/community-addon-template/tests/setup/suite.ts b/community-addon-template/tests/setup/suite.ts index 3b7c0413..db7dd06d 100644 --- a/community-addon-template/tests/setup/suite.ts +++ b/community-addon-template/tests/setup/suite.ts @@ -78,7 +78,7 @@ export function setupTest(addons: Addons) { options, packageManager: 'pnpm' }); - addPnpmBuildDependencies(cwd, 'pnpm', ['esbuild', ...pnpmBuildDependencies]); + await addPnpmBuildDependencies(cwd, 'pnpm', ['esbuild', ...pnpmBuildDependencies]); return cwd; }; diff --git a/package.json b/package.json index 82cbc963..da6e3308 100644 --- a/package.json +++ b/package.json @@ -40,10 +40,5 @@ "unplugin-isolated-decl": "^0.8.3", "vitest": "4.0.0-beta.6" }, - "packageManager": "pnpm@10.4.1", - "pnpm": { - "onlyBuiltDependencies": [ - "esbuild" - ] - } + "packageManager": "pnpm@10.17.0" } diff --git a/packages/addons/_tests/_setup/suite.ts b/packages/addons/_tests/_setup/suite.ts index eadee8f5..9eb500b5 100644 --- a/packages/addons/_tests/_setup/suite.ts +++ b/packages/addons/_tests/_setup/suite.ts @@ -98,7 +98,7 @@ export function setupTest( options: kind.options, packageManager: 'pnpm' }); - addPnpmBuildDependencies(cwd, 'pnpm', ['esbuild', ...pnpmBuildDependencies]); + await addPnpmBuildDependencies(cwd, 'pnpm', ['esbuild', ...pnpmBuildDependencies]); } execSync('pnpm install', { cwd: path.resolve(cwd, testName), stdio: 'pipe' }); diff --git a/packages/cli/commands/add/index.ts b/packages/cli/commands/add/index.ts index f5945575..2223250c 100644 --- a/packages/cli/commands/add/index.ts +++ b/packages/cli/commands/add/index.ts @@ -559,7 +559,7 @@ export async function runAddCommand( if (packageManager) { workspace.packageManager = packageManager; - addPnpmBuildDependencies(workspace.cwd, packageManager, [ + await addPnpmBuildDependencies(workspace.cwd, packageManager, [ 'esbuild', ...addonPnpmBuildDependencies ]); diff --git a/packages/cli/commands/create.ts b/packages/cli/commands/create.ts index 386c801f..acd8112f 100644 --- a/packages/cli/commands/create.ts +++ b/packages/cli/commands/create.ts @@ -204,7 +204,7 @@ async function createProject(cwd: ProjectPath, options: Options) { const installDeps = async (install: true | AgentName) => { packageManager = install === true ? await packageManagerPrompt(projectPath) : install; - addPnpmBuildDependencies(projectPath, packageManager, ['esbuild']); + await addPnpmBuildDependencies(projectPath, packageManager, ['esbuild']); if (packageManager) await installDependencies(packageManager, projectPath); }; diff --git a/packages/cli/utils/package-manager.ts b/packages/cli/utils/package-manager.ts index f53e4878..cc4e6670 100644 --- a/packages/cli/utils/package-manager.ts +++ b/packages/cli/utils/package-manager.ts @@ -2,7 +2,7 @@ import fs from 'node:fs'; import path from 'node:path'; import process from 'node:process'; import * as find from 'empathic/find'; -import { exec } from 'tinyexec'; +import { x } from 'tinyexec'; import { Option } from 'commander'; import * as p from '@clack/prompts'; import { @@ -12,7 +12,8 @@ import { detect, type AgentName } from 'package-manager-detector'; -import { parseJson } from '@sveltejs/cli-core/parsers'; +import { parseJson, parseYaml } from '@sveltejs/cli-core/parsers'; +import { isVersionUnsupportedBelow } from '@sveltejs/cli-core'; export const AGENT_NAMES = AGENTS.filter((agent): agent is AgentName => !agent.includes('@')); const agentOptions: PackageManagerOptions = AGENT_NAMES.map((pm) => ({ value: pm, label: pm })); @@ -55,19 +56,16 @@ export async function installDependencies(agent: AgentName, cwd: string): Promis try { const { command, args } = constructCommand(COMMANDS[agent].install, [])!; - const proc = exec(command, args, { + + const proc = x(command, args, { nodeOptions: { cwd, stdio: 'pipe' }, throwOnError: true }); - proc.process?.stdout?.on('data', (data) => { - task.message(data.toString(), { raw: true }); - }); - proc.process?.stderr?.on('data', (data) => { - task.message(data.toString(), { raw: true }); - }); - - await proc; + for await (const line of proc) { + // line will be from stderr/stdout in the order you'd see it in a term + task.message(line, { raw: true }); + } task.success('Successfully installed dependencies'); } catch { @@ -87,35 +85,67 @@ export function getUserAgent(): AgentName | undefined { return AGENTS.includes(name) ? name : undefined; } -export function addPnpmBuildDependencies( +export async function addPnpmBuildDependencies( cwd: string, packageManager: AgentName | null | undefined, allowedPackages: string[] ) { // other package managers are currently not affected by this change - if (!packageManager || packageManager !== 'pnpm') return; + if (!packageManager || packageManager !== 'pnpm' || allowedPackages.length === 0) return; + + let confIn: 'package.json' | 'pnpm-workspace.yaml' = 'package.json'; + const pnpmVersion = await getPnpmVersion(); + if (pnpmVersion) { + confIn = isVersionUnsupportedBelow(pnpmVersion, '10.5') + ? 'package.json' + : 'pnpm-workspace.yaml'; + } // find the workspace root (if present) - const pnpmWorkspacePath = find.up('pnpm-workspace.yaml', { cwd }); - let packageDirectory; - - if (pnpmWorkspacePath) packageDirectory = path.dirname(pnpmWorkspacePath); - else packageDirectory = cwd; - - // load the package.json - const pkgPath = path.join(packageDirectory, 'package.json'); - const content = fs.readFileSync(pkgPath, 'utf-8'); - const { data, generateCode } = parseJson(content); - - // add the packages where we install scripts should be executed - data.pnpm ??= {}; - data.pnpm.onlyBuiltDependencies ??= []; - for (const allowedPackage of allowedPackages) { - if (data.pnpm.onlyBuiltDependencies.includes(allowedPackage)) continue; - data.pnpm.onlyBuiltDependencies.push(allowedPackage); + const found = find.up('pnpm-workspace.yaml', { cwd }); + const dir = found ? path.dirname(found) : cwd; + + if (confIn === 'pnpm-workspace.yaml') { + const content = found ? fs.readFileSync(found, 'utf-8') : ''; + const { data, generateCode } = parseYaml(content); + + const onlyBuiltDependencies = data.get('onlyBuiltDependencies'); + const items: Array<{ value: string } | string> = onlyBuiltDependencies?.items ?? []; + for (const item of allowedPackages) { + if (items.includes(item)) continue; + if (items.some((y) => typeof y === 'object' && y.value === item)) continue; + items.push(item); + } + data.set('onlyBuiltDependencies', new Set(items)); + + const newContent = generateCode(); + const pnpmWorkspacePath = found ?? path.join(cwd, 'pnpm-workspace.yaml'); + fs.writeFileSync(pnpmWorkspacePath, newContent); + } else { + // else is package.json (fallback) + const pkgPath = path.join(dir, 'package.json'); + const content = fs.readFileSync(pkgPath, 'utf-8'); + const { data, generateCode } = parseJson(content); + + // add the packages where we install scripts should be executed + data.pnpm ??= {}; + data.pnpm.onlyBuiltDependencies ??= []; + for (const allowedPackage of allowedPackages) { + if (data.pnpm.onlyBuiltDependencies.includes(allowedPackage)) continue; + data.pnpm.onlyBuiltDependencies.push(allowedPackage); + } + + // save the updated package.json + const newContent = generateCode(); + fs.writeFileSync(pkgPath, newContent); } +} - // save the updated package.json - const newContent = generateCode(); - fs.writeFileSync(pkgPath, newContent); +async function getPnpmVersion(): Promise { + let v: string | undefined = undefined; + try { + const proc = await x('pnpm', ['--version'], { throwOnError: true, timeout: 1000 }); + v = proc.stdout.trim(); + } catch {} + return v; } diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 86c4b35e..6e0eb8cb 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,3 +2,6 @@ packages: - 'packages/*' - 'community-addon-template' - '!.test-tmp/**' + +onlyBuiltDependencies: + - esbuild From 02254b77c9ec7393134f7be8f188c97702b5c196 Mon Sep 17 00:00:00 2001 From: jycouet Date: Thu, 18 Sep 2025 12:52:14 +0200 Subject: [PATCH 04/15] windows robustness --- packages/cli/lib/testing.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/cli/lib/testing.ts b/packages/cli/lib/testing.ts index 998e9542..b4c29144 100644 --- a/packages/cli/lib/testing.ts +++ b/packages/cli/lib/testing.ts @@ -2,7 +2,7 @@ import fs from 'node:fs'; import path from 'node:path'; import process from 'node:process'; import degit from 'degit'; -import { exec } from 'tinyexec'; +import { x, exec } from 'tinyexec'; import { create } from '@sveltejs/create'; export { addPnpmBuildDependencies } from '../utils/package-manager.ts'; @@ -83,7 +83,7 @@ export function createProject({ cwd, testName, templatesDir }: CreateOptions): C type PreviewOptions = { cwd: string; command?: string }; export async function startPreview({ cwd, - command = 'npm run preview' + command = 'pnpm preview' }: PreviewOptions): Promise<{ url: string; close: () => Promise }> { const [cmd, ...args] = command.split(' '); const proc = exec(cmd, args, { @@ -124,7 +124,7 @@ export async function startPreview({ async function terminate(pid: number) { try { if (process.platform === 'win32') { - await exec(`taskkill /pid ${pid} /T /F`); // on windows, use taskkill to terminate the process tree + await x('taskkill', ['/PID', `${pid}`, '/T', '/F']); // on windows, use taskkill to terminate the process tree } else { process.kill(-pid, 'SIGTERM'); // Kill the process group } From 89d6c81cd97364ff995a843a1906da3b852c0992 Mon Sep 17 00:00:00 2001 From: jycouet Date: Thu, 18 Sep 2025 13:31:01 +0200 Subject: [PATCH 05/15] CI debug --- packages/addons/_tests/_setup/suite.ts | 2 +- packages/cli/utils/package-manager.ts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/addons/_tests/_setup/suite.ts b/packages/addons/_tests/_setup/suite.ts index 9eb500b5..f1486cf7 100644 --- a/packages/addons/_tests/_setup/suite.ts +++ b/packages/addons/_tests/_setup/suite.ts @@ -101,7 +101,7 @@ export function setupTest( await addPnpmBuildDependencies(cwd, 'pnpm', ['esbuild', ...pnpmBuildDependencies]); } - execSync('pnpm install', { cwd: path.resolve(cwd, testName), stdio: 'pipe' }); + execSync('pnpm install', { cwd: path.resolve(cwd, testName), stdio: 'inherit' }); }); // runs before each test case diff --git a/packages/cli/utils/package-manager.ts b/packages/cli/utils/package-manager.ts index cc4e6670..32baa8f2 100644 --- a/packages/cli/utils/package-manager.ts +++ b/packages/cli/utils/package-manager.ts @@ -121,6 +121,8 @@ export async function addPnpmBuildDependencies( const newContent = generateCode(); const pnpmWorkspacePath = found ?? path.join(cwd, 'pnpm-workspace.yaml'); fs.writeFileSync(pnpmWorkspacePath, newContent); + console.log(`pnpmWorkspacePath`, pnpmWorkspacePath); + console.log(`newContent`, newContent); } else { // else is package.json (fallback) const pkgPath = path.join(dir, 'package.json'); From afa2813b3d9966ee1a6a0c5a42743dd8e4fafe3d Mon Sep 17 00:00:00 2001 From: jycouet Date: Thu, 18 Sep 2025 13:38:29 +0200 Subject: [PATCH 06/15] more logs --- packages/addons/_tests/_setup/suite.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/addons/_tests/_setup/suite.ts b/packages/addons/_tests/_setup/suite.ts index f1486cf7..f562ba97 100644 --- a/packages/addons/_tests/_setup/suite.ts +++ b/packages/addons/_tests/_setup/suite.ts @@ -84,9 +84,11 @@ export function setupTest( private: true }) ); - + console.log(`name`, name, testName); + console.log(`flavors`, flavors); for (const { variant, kind } of flavors) { const cwd = create({ testId: `${kind.type}-${variant}`, variant }); + console.log(`cwd`, cwd); // test metadata const metaPath = path.resolve(cwd, 'meta.json'); From d010517c08d1ac8727d8ac061aa716f4f12a2d74 Mon Sep 17 00:00:00 2001 From: jycouet Date: Thu, 18 Sep 2025 13:42:06 +0200 Subject: [PATCH 07/15] !silent --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index da6e3308..4bfa5369 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "dev": "rolldown --watch --config", "format": "pnpm --parallel format", "lint": "pnpm --parallel lint && eslint --cache --cache-location node_modules/.eslintcache", - "test": "vitest run --silent", + "test": "vitest run", "test:ui": "vitest --ui", "update-addon-deps": "node ./scripts/update-addon-dependencies.js" }, From 261417112a239ba80433356ee882f0dc6fef95db Mon Sep 17 00:00:00 2001 From: jycouet Date: Thu, 18 Sep 2025 14:45:39 +0200 Subject: [PATCH 08/15] CI & windows & I don't know --- packages/addons/_tests/_setup/suite.ts | 8 ++++---- packages/cli/utils/package-manager.ts | 7 +++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/addons/_tests/_setup/suite.ts b/packages/addons/_tests/_setup/suite.ts index f562ba97..888a1b99 100644 --- a/packages/addons/_tests/_setup/suite.ts +++ b/packages/addons/_tests/_setup/suite.ts @@ -84,11 +84,9 @@ export function setupTest( private: true }) ); - console.log(`name`, name, testName); - console.log(`flavors`, flavors); + for (const { variant, kind } of flavors) { const cwd = create({ testId: `${kind.type}-${variant}`, variant }); - console.log(`cwd`, cwd); // test metadata const metaPath = path.resolve(cwd, 'meta.json'); @@ -103,7 +101,9 @@ export function setupTest( await addPnpmBuildDependencies(cwd, 'pnpm', ['esbuild', ...pnpmBuildDependencies]); } - execSync('pnpm install', { cwd: path.resolve(cwd, testName), stdio: 'inherit' }); + // await 0.3 sec + await new Promise((resolve) => setTimeout(resolve, 300)); + execSync('pnpm install', { cwd: path.resolve(cwd, testName), stdio: 'pipe' }); }); // runs before each test case diff --git a/packages/cli/utils/package-manager.ts b/packages/cli/utils/package-manager.ts index 32baa8f2..4884391c 100644 --- a/packages/cli/utils/package-manager.ts +++ b/packages/cli/utils/package-manager.ts @@ -111,6 +111,7 @@ export async function addPnpmBuildDependencies( const onlyBuiltDependencies = data.get('onlyBuiltDependencies'); const items: Array<{ value: string } | string> = onlyBuiltDependencies?.items ?? []; + for (const item of allowedPackages) { if (items.includes(item)) continue; if (items.some((y) => typeof y === 'object' && y.value === item)) continue; @@ -120,9 +121,7 @@ export async function addPnpmBuildDependencies( const newContent = generateCode(); const pnpmWorkspacePath = found ?? path.join(cwd, 'pnpm-workspace.yaml'); - fs.writeFileSync(pnpmWorkspacePath, newContent); - console.log(`pnpmWorkspacePath`, pnpmWorkspacePath); - console.log(`newContent`, newContent); + if (newContent !== content) fs.writeFileSync(pnpmWorkspacePath, newContent); } else { // else is package.json (fallback) const pkgPath = path.join(dir, 'package.json'); @@ -139,7 +138,7 @@ export async function addPnpmBuildDependencies( // save the updated package.json const newContent = generateCode(); - fs.writeFileSync(pkgPath, newContent); + if (newContent !== content) fs.writeFileSync(pkgPath, newContent); } } From d21324ac86b98d39ee8d3e4725db8fc268f94791 Mon Sep 17 00:00:00 2001 From: jycouet Date: Thu, 18 Sep 2025 14:59:30 +0200 Subject: [PATCH 09/15] sniff --- packages/addons/_tests/_setup/suite.ts | 2 ++ packages/addons/_tests/drizzle/test.ts | 1 + packages/cli/utils/package-manager.ts | 2 ++ 3 files changed, 5 insertions(+) diff --git a/packages/addons/_tests/_setup/suite.ts b/packages/addons/_tests/_setup/suite.ts index 888a1b99..698588a7 100644 --- a/packages/addons/_tests/_setup/suite.ts +++ b/packages/addons/_tests/_setup/suite.ts @@ -104,6 +104,8 @@ export function setupTest( // await 0.3 sec await new Promise((resolve) => setTimeout(resolve, 300)); execSync('pnpm install', { cwd: path.resolve(cwd, testName), stdio: 'pipe' }); + + console.log(testName, `beforeAll finished`); }); // runs before each test case diff --git a/packages/addons/_tests/drizzle/test.ts b/packages/addons/_tests/drizzle/test.ts index e643d665..c6cf2c97 100644 --- a/packages/addons/_tests/drizzle/test.ts +++ b/packages/addons/_tests/drizzle/test.ts @@ -38,6 +38,7 @@ const { test, flavors, prepareServer } = setupTest( ); beforeAll(() => { + console.log(`local beforeAll start`, noDocker); if (noDocker) return; const cwd = path.dirname(fileURLToPath(import.meta.url)); execSync('docker compose up --detach', { cwd, stdio: 'pipe' }); diff --git a/packages/cli/utils/package-manager.ts b/packages/cli/utils/package-manager.ts index 4884391c..cc035c7f 100644 --- a/packages/cli/utils/package-manager.ts +++ b/packages/cli/utils/package-manager.ts @@ -120,6 +120,8 @@ export async function addPnpmBuildDependencies( data.set('onlyBuiltDependencies', new Set(items)); const newContent = generateCode(); + console.log(`newContent`, cwd, newContent); + const pnpmWorkspacePath = found ?? path.join(cwd, 'pnpm-workspace.yaml'); if (newContent !== content) fs.writeFileSync(pnpmWorkspacePath, newContent); } else { From 9fc444b77321462379a02759e5e228f1b23885d1 Mon Sep 17 00:00:00 2001 From: jycouet Date: Thu, 18 Sep 2025 15:06:35 +0200 Subject: [PATCH 10/15] . --- packages/cli/utils/package-manager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/utils/package-manager.ts b/packages/cli/utils/package-manager.ts index cc035c7f..a2469309 100644 --- a/packages/cli/utils/package-manager.ts +++ b/packages/cli/utils/package-manager.ts @@ -120,9 +120,9 @@ export async function addPnpmBuildDependencies( data.set('onlyBuiltDependencies', new Set(items)); const newContent = generateCode(); - console.log(`newContent`, cwd, newContent); const pnpmWorkspacePath = found ?? path.join(cwd, 'pnpm-workspace.yaml'); + console.log(`newContent`, pnpmWorkspacePath, newContent); if (newContent !== content) fs.writeFileSync(pnpmWorkspacePath, newContent); } else { // else is package.json (fallback) From afca1c3bbe471f03e3fe13cb53f76f3630417820 Mon Sep 17 00:00:00 2001 From: jycouet Date: Thu, 18 Sep 2025 15:16:14 +0200 Subject: [PATCH 11/15] more and more logs --- packages/addons/_tests/_setup/suite.ts | 2 +- packages/cli/utils/package-manager.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/addons/_tests/_setup/suite.ts b/packages/addons/_tests/_setup/suite.ts index 698588a7..1cea3fa6 100644 --- a/packages/addons/_tests/_setup/suite.ts +++ b/packages/addons/_tests/_setup/suite.ts @@ -103,7 +103,7 @@ export function setupTest( // await 0.3 sec await new Promise((resolve) => setTimeout(resolve, 300)); - execSync('pnpm install', { cwd: path.resolve(cwd, testName), stdio: 'pipe' }); + execSync('pnpm install', { cwd: path.resolve(cwd, testName), stdio: 'inherit' }); console.log(testName, `beforeAll finished`); }); diff --git a/packages/cli/utils/package-manager.ts b/packages/cli/utils/package-manager.ts index a2469309..cbd85760 100644 --- a/packages/cli/utils/package-manager.ts +++ b/packages/cli/utils/package-manager.ts @@ -150,5 +150,6 @@ async function getPnpmVersion(): Promise { const proc = await x('pnpm', ['--version'], { throwOnError: true, timeout: 1000 }); v = proc.stdout.trim(); } catch {} + console.log(`getPnpmVersion`, v); return v; } From c590e9fe3544a81161e43d50fbace29851653f3e Mon Sep 17 00:00:00 2001 From: jycouet Date: Thu, 18 Sep 2025 15:19:51 +0200 Subject: [PATCH 12/15] pnpm v --- packages/cli/utils/package-manager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/utils/package-manager.ts b/packages/cli/utils/package-manager.ts index cbd85760..345d1f5a 100644 --- a/packages/cli/utils/package-manager.ts +++ b/packages/cli/utils/package-manager.ts @@ -147,7 +147,7 @@ export async function addPnpmBuildDependencies( async function getPnpmVersion(): Promise { let v: string | undefined = undefined; try { - const proc = await x('pnpm', ['--version'], { throwOnError: true, timeout: 1000 }); + const proc = await x('pnpm', ['--version'], { throwOnError: true }); v = proc.stdout.trim(); } catch {} console.log(`getPnpmVersion`, v); From 0bd608d5d9f2b96dc920c6d72bdd09ef91129c51 Mon Sep 17 00:00:00 2001 From: jycouet Date: Thu, 18 Sep 2025 15:28:44 +0200 Subject: [PATCH 13/15] cleanup! --- packages/addons/_tests/_setup/suite.ts | 6 +----- packages/addons/_tests/drizzle/test.ts | 1 - packages/cli/utils/package-manager.ts | 2 -- 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/packages/addons/_tests/_setup/suite.ts b/packages/addons/_tests/_setup/suite.ts index 1cea3fa6..9eb500b5 100644 --- a/packages/addons/_tests/_setup/suite.ts +++ b/packages/addons/_tests/_setup/suite.ts @@ -101,11 +101,7 @@ export function setupTest( await addPnpmBuildDependencies(cwd, 'pnpm', ['esbuild', ...pnpmBuildDependencies]); } - // await 0.3 sec - await new Promise((resolve) => setTimeout(resolve, 300)); - execSync('pnpm install', { cwd: path.resolve(cwd, testName), stdio: 'inherit' }); - - console.log(testName, `beforeAll finished`); + execSync('pnpm install', { cwd: path.resolve(cwd, testName), stdio: 'pipe' }); }); // runs before each test case diff --git a/packages/addons/_tests/drizzle/test.ts b/packages/addons/_tests/drizzle/test.ts index c6cf2c97..e643d665 100644 --- a/packages/addons/_tests/drizzle/test.ts +++ b/packages/addons/_tests/drizzle/test.ts @@ -38,7 +38,6 @@ const { test, flavors, prepareServer } = setupTest( ); beforeAll(() => { - console.log(`local beforeAll start`, noDocker); if (noDocker) return; const cwd = path.dirname(fileURLToPath(import.meta.url)); execSync('docker compose up --detach', { cwd, stdio: 'pipe' }); diff --git a/packages/cli/utils/package-manager.ts b/packages/cli/utils/package-manager.ts index 345d1f5a..2c534c59 100644 --- a/packages/cli/utils/package-manager.ts +++ b/packages/cli/utils/package-manager.ts @@ -122,7 +122,6 @@ export async function addPnpmBuildDependencies( const newContent = generateCode(); const pnpmWorkspacePath = found ?? path.join(cwd, 'pnpm-workspace.yaml'); - console.log(`newContent`, pnpmWorkspacePath, newContent); if (newContent !== content) fs.writeFileSync(pnpmWorkspacePath, newContent); } else { // else is package.json (fallback) @@ -150,6 +149,5 @@ async function getPnpmVersion(): Promise { const proc = await x('pnpm', ['--version'], { throwOnError: true }); v = proc.stdout.trim(); } catch {} - console.log(`getPnpmVersion`, v); return v; } From 7e39fd3783cfb329b2ad9cdc79ab72d6024b3ad3 Mon Sep 17 00:00:00 2001 From: jycouet Date: Thu, 18 Sep 2025 15:37:17 +0200 Subject: [PATCH 14/15] --silent --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4bfa5369..da6e3308 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "dev": "rolldown --watch --config", "format": "pnpm --parallel format", "lint": "pnpm --parallel lint && eslint --cache --cache-location node_modules/.eslintcache", - "test": "vitest run", + "test": "vitest run --silent", "test:ui": "vitest --ui", "update-addon-deps": "node ./scripts/update-addon-dependencies.js" }, From 87235e8482440d3a57e8408423218295eb51c52b Mon Sep 17 00:00:00 2001 From: jycouet Date: Thu, 18 Sep 2025 15:40:11 +0200 Subject: [PATCH 15/15] add changeset --- .changeset/solid-dragons-trade.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/solid-dragons-trade.md diff --git a/.changeset/solid-dragons-trade.md b/.changeset/solid-dragons-trade.md new file mode 100644 index 00000000..481b024e --- /dev/null +++ b/.changeset/solid-dragons-trade.md @@ -0,0 +1,5 @@ +--- +'sv': patch +--- + +feat(cli): pnpm config will now be stored in `pnpm-workspace.yaml` (e.g. `onlyBuiltDependencies`)