Skip to content

Commit aead922

Browse files
authored
feat: decouple pnpmBuildDependency from sv (2) (#1037)
1 parent 71f5d0c commit aead922

15 files changed

Lines changed: 104 additions & 92 deletions

File tree

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
'sv': minor
3+
'@sveltejs/sv-utils': minor
4+
---
5+
6+
feat: replace `sv.pnpmBuildDependency` with `sv.file` + `pnpm.onlyBuiltDependencies` helper and `file.findUp`

documentation/docs/50-api/10-sv.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ export default defineAddon({
4848
});
4949
```
5050

51-
The `sv` object in `run` provides `file`, `dependency`, `devDependency`, `execute`, and `pnpmBuildDependency`. For file transforms (AST-based editing of scripts, Svelte components, CSS, JSON, etc.), see [`@sveltejs/sv-utils`](sv-utils).
51+
The `sv` object in `run` provides `file`, `dependency`, `devDependency`, and `execute`. For file transforms (AST-based editing of scripts, Svelte components, CSS, JSON, etc.) and package manager helpers, see [`@sveltejs/sv-utils`](sv-utils).
5252

5353
## `defineAddonOptions`
5454

documentation/docs/50-api/20-sv-utils.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,3 +229,18 @@ Namespaced helpers for AST manipulation:
229229
- **`json.*`** - arrayUpsert, packageScriptsUpsert
230230
- **`html.*`** - attribute manipulation
231231
- **`text.*`** - upsert lines in flat files (.env, .gitignore)
232+
233+
## Package manager helpers
234+
235+
### `pnpm.onlyBuiltDependencies`
236+
237+
Returns a transform for `pnpm-workspace.yaml` that adds packages to the `onlyBuiltDependencies` list. Use with `sv.file` when the project uses pnpm.
238+
239+
```js
240+
// @noErrors
241+
import { pnpm } from '@sveltejs/sv-utils';
242+
243+
if (packageManager === 'pnpm') {
244+
sv.file(file.findUp('pnpm-workspace.yaml'), pnpm.onlyBuiltDependencies('my-native-dep'));
245+
}
246+
```

packages/sv-utils/src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ export * as text from './tooling/text.ts';
3939
export * as json from './tooling/json.ts';
4040
export * as svelte from './tooling/svelte/index.ts';
4141

42+
// Package manager helpers
43+
export * as pnpm from './pnpm.ts';
44+
4245
// Transforms — sv-utils = what to do to content, sv = where and when to do it.
4346
export { transforms } from './tooling/transforms.ts';
4447

packages/sv-utils/src/pnpm.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { transforms, type TransformFn } from './tooling/transforms.ts';
2+
3+
/**
4+
* Returns a TransformFn for `pnpm-workspace.yaml` that adds packages to `onlyBuiltDependencies`.
5+
*
6+
* Use with `sv.file`:
7+
* ```ts
8+
* if (packageManager === 'pnpm') {
9+
* sv.file(file.findUp('pnpm-workspace.yaml'), pnpm.onlyBuiltDependencies('my-native-dep'));
10+
* }
11+
* ```
12+
*/
13+
export function onlyBuiltDependencies(...packages: string[]): TransformFn {
14+
return transforms.yaml(({ data }) => {
15+
const existing = data.get('onlyBuiltDependencies');
16+
const items: Array<{ value: string } | string> = existing?.items ?? [];
17+
for (const pkg of packages) {
18+
if (items.includes(pkg)) continue;
19+
if (items.some((y) => typeof y === 'object' && y.value === pkg)) continue;
20+
items.push(pkg);
21+
}
22+
data.set('onlyBuiltDependencies', items);
23+
});
24+
}

packages/sv/src/addons/drizzle.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
dedent,
44
type TransformFn,
55
transforms,
6+
pnpm,
67
resolveCommandArray,
78
fileExists,
89
createPrinter
@@ -89,7 +90,17 @@ export default defineAddon({
8990

9091
if (!isKit) return unsupported('Requires SvelteKit');
9192
},
92-
run: ({ sv, language, options, directory, dependencyVersion, cwd, cancel, file }) => {
93+
run: ({
94+
sv,
95+
language,
96+
options,
97+
directory,
98+
dependencyVersion,
99+
cwd,
100+
cancel,
101+
file,
102+
packageManager
103+
}) => {
93104
if (options.database === 'd1' && !dependencyVersion('@sveltejs/adapter-cloudflare')) {
94105
return cancel('Cloudflare D1 requires @sveltejs/adapter-cloudflare - add the adapter first');
95106
}
@@ -124,7 +135,9 @@ export default defineAddon({
124135
// not a devDependency due to bundling issues
125136
sv.dependency('better-sqlite3', '^12.6.2');
126137
sv.devDependency('@types/better-sqlite3', '^7.6.13');
127-
sv.pnpmBuildDependency('better-sqlite3');
138+
if (packageManager === 'pnpm') {
139+
sv.file(file.findUp('pnpm-workspace.yaml'), pnpm.onlyBuiltDependencies('better-sqlite3'));
140+
}
128141
}
129142

130143
if (options.sqlite === 'libsql' || options.sqlite === 'turso')

packages/sv/src/addons/tailwindcss.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { transforms } from '@sveltejs/sv-utils';
1+
import { pnpm, transforms } from '@sveltejs/sv-utils';
22
import { defineAddon, defineAddonOptions } from '../core/config.ts';
33

44
const plugins = [
@@ -30,12 +30,14 @@ export default defineAddon({
3030
shortDescription: 'css framework',
3131
homepage: 'https://tailwindcss.com',
3232
options,
33-
run: ({ sv, options, file, isKit, directory, dependencyVersion, language }) => {
33+
run: ({ sv, options, file, isKit, directory, dependencyVersion, language, packageManager }) => {
3434
const prettierInstalled = Boolean(dependencyVersion('prettier'));
3535

3636
sv.devDependency('tailwindcss', '^4.1.18');
3737
sv.devDependency('@tailwindcss/vite', '^4.1.18');
38-
sv.pnpmBuildDependency('@tailwindcss/oxide');
38+
if (packageManager === 'pnpm') {
39+
sv.file(file.findUp('pnpm-workspace.yaml'), pnpm.onlyBuiltDependencies('@tailwindcss/oxide'));
40+
}
3941

4042
if (prettierInstalled) sv.devDependency('prettier-plugin-tailwindcss', '^0.7.2');
4143

packages/sv/src/cli/add.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { downloadPackage, getPackageJSON } from '../core/fetch-packages.ts';
2323
import { formatFiles } from '../core/formatFiles.ts';
2424
import {
2525
AGENT_NAMES,
26-
addPnpmBuildDependencies,
26+
addPnpmOnlyBuiltDependencies,
2727
installDependencies,
2828
installOption,
2929
packageManagerPrompt
@@ -677,7 +677,7 @@ export async function runAddonsApply({
677677
setupResults: {}
678678
};
679679

680-
const { filesToFormat, pnpmBuildDependencies, status } = await applyAddons({
680+
const { filesToFormat, status } = await applyAddons({
681681
loadedAddons,
682682
workspace,
683683
setupResults,
@@ -712,10 +712,7 @@ export async function runAddonsApply({
712712
? await packageManagerPrompt(options.cwd)
713713
: options.install;
714714

715-
await addPnpmBuildDependencies(workspace.cwd, packageManager, [
716-
'esbuild',
717-
...pnpmBuildDependencies
718-
]);
715+
addPnpmOnlyBuiltDependencies(workspace.cwd, packageManager, 'esbuild');
719716

720717
const argsFormattedAddons: string[] = [];
721718
for (const loaded of successfulAddons) {

packages/sv/src/cli/create.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import type { LoadedAddon, OptionValues, SetupResult } from '../core/config.ts';
1010
import { formatFiles } from '../core/formatFiles.ts';
1111
import {
1212
AGENT_NAMES,
13-
addPnpmBuildDependencies,
13+
addPnpmOnlyBuiltDependencies,
1414
detectPackageManager,
1515
installDependencies,
1616
installOption,
@@ -395,7 +395,7 @@ async function createProject(cwd: ProjectPath, options: Options) {
395395
}
396396
const addOnNextSteps = getNextSteps(addOnSuccessfulAddons, workspace, answers, addonSetupResults);
397397

398-
await addPnpmBuildDependencies(projectPath, packageManager, ['esbuild']);
398+
addPnpmOnlyBuiltDependencies(projectPath, packageManager, 'esbuild');
399399
if (packageManager) {
400400
await installDependencies(packageManager, projectPath);
401401
await formatFiles({ packageManager, cwd: projectPath, filesToFormat: addOnFilesToFormat });
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
onlyBuiltDependencies:
2+
- '@tailwindcss/oxide'

0 commit comments

Comments
 (0)