Skip to content

Commit 36578be

Browse files
committed
feat: replace pnpmBuildDependency with sv.file + pnpm helper and file.findUp
1 parent c0e5831 commit 36578be

14 files changed

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

packages/sv/src/addons/drizzle.ts

Lines changed: 5 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,7 @@ export default defineAddon({
8990

9091
if (!isKit) return unsupported('Requires SvelteKit');
9192
},
92-
run: ({ sv, language, options, directory, dependencyVersion, cwd, cancel, file }) => {
93+
run: ({ sv, language, options, directory, dependencyVersion, cwd, cancel, file, packageManager }) => {
9394
if (options.database === 'd1' && !dependencyVersion('@sveltejs/adapter-cloudflare')) {
9495
return cancel('Cloudflare D1 requires @sveltejs/adapter-cloudflare - add the adapter first');
9596
}
@@ -124,7 +125,9 @@ export default defineAddon({
124125
// not a devDependency due to bundling issues
125126
sv.dependency('better-sqlite3', '^12.6.2');
126127
sv.devDependency('@types/better-sqlite3', '^7.6.13');
127-
sv.pnpmBuildDependency('better-sqlite3');
128+
if (packageManager === 'pnpm') {
129+
sv.file(file.findUp('pnpm-workspace.yaml'), pnpm.onlyBuiltDependencies('better-sqlite3'));
130+
}
128131
}
129132

130133
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: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
await addPnpmBuildDependencies(workspace.cwd, packageManager, ['esbuild']);
719716

720717
const argsFormattedAddons: string[] = [];
721718
for (const loaded of successfulAddons) {
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
onlyBuiltDependencies:
2+
- '@tailwindcss/oxide'

packages/sv/src/core/config.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ export type Scripts = {
2121
};
2222

2323
export type SvApi = {
24-
/** Add a package to the pnpm onlyBuiltDependencies. */
25-
pnpmBuildDependency: (pkg: string) => void;
2624
/** Add a package to the dependencies. */
2725
dependency: (pkg: string, version: string) => void;
2826
/** Add a package to the dev dependencies. */

0 commit comments

Comments
 (0)