Skip to content

Commit d7a9d2e

Browse files
valentinpalkovicstorybook-bot
authored andcommitted
Merge pull request #34032 from braedenfoster/fix/pnpm-preset-resolution
Core: Resolve builder preset path correctly in pnpm strict mode (cherry picked from commit 5c8e0ea)
1 parent 1f4697d commit d7a9d2e

2 files changed

Lines changed: 16 additions & 4 deletions

File tree

code/core/src/core-server/load.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import type { BuilderOptions, CLIOptions, LoadOptions, Options } from 'storybook
1010

1111
import { global } from '@storybook/global';
1212

13-
import { dirname, join, relative, resolve } from 'pathe';
13+
import { dirname, isAbsolute, join, relative, resolve } from 'pathe';
1414

1515
import { resolvePackageDir } from '../shared/utils/module';
1616

@@ -63,7 +63,13 @@ export async function loadStorybook(
6363
const builderName = typeof builder === 'string' ? builder : builder?.name;
6464

6565
if (builderName) {
66-
corePresets.push(join(dirname(builderName), 'preset.js'));
66+
/* builderName can be a bare package name (e.g. '@storybook/builder-vite') or an already-resolved
67+
file URL / absolute path (e.g. 'file:///.../.../dist/index.js'). For bare package names, we
68+
need to resolve the package directory first; for already-resolved paths, dirname works directly.
69+
*/
70+
const isResolved = builderName.startsWith('file:') || isAbsolute(builderName);
71+
const builderPresetDir = isResolved ? dirname(builderName) : resolvePackageDir(builderName);
72+
corePresets.push(join(builderPresetDir, 'preset.js'));
6773
}
6874

6975
// Load second pass: all presets are applied in order

code/core/src/shared/utils/module.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,14 @@ export const resolvePackageDir = (
3232
try {
3333
return dirname(fileURLToPath(importMetaResolve(join(pkg, 'package.json'), parent)));
3434
} catch {
35-
// Necessary fallback for Bun runtime
36-
return dirname(fileURLToPath(importMetaResolve(join(pkg, 'package.json'))));
35+
try {
36+
// Necessary fallback for Bun runtime
37+
return dirname(fileURLToPath(importMetaResolve(join(pkg, 'package.json'))));
38+
} catch {
39+
// Fallback using require.resolve for strict pnpm environments where import.meta.resolve may fail
40+
const req = createRequire(parent ?? import.meta.url);
41+
return dirname(req.resolve(join(pkg, 'package.json')));
42+
}
3743
}
3844
};
3945

0 commit comments

Comments
 (0)