Skip to content

Commit 62e37c0

Browse files
committed
fix pnp
1 parent 8d9d279 commit 62e37c0

File tree

22 files changed

+658
-66
lines changed

22 files changed

+658
-66
lines changed

.yarnrc.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
11
installStatePath: ./.yarn/root-install-state.gz
22

3-
nodeLinker: node-modules
4-
53
yarnPath: .yarn/releases/yarn-3.4.1.cjs

code/.yarnrc.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ compressionLevel: 0
22

33
enableGlobalCache: true
44

5+
checksumBehavior: update
6+
57
logFilters:
68
- code: YN0005
79
level: discard
810
- code: YN0076
911
level: discard
10-
- level: discard
11-
pattern: '@storybook/root@workspace:.'
1212
- level: discard
1313
pattern: '@workspace:addons/storyshots-*/'
1414

code/lib/cli/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,13 @@
6969
"commander": "^6.2.1",
7070
"cross-spawn": "^7.0.3",
7171
"detect-indent": "^6.1.0",
72+
"download-tarball": "^2.0.0",
7273
"envinfo": "^7.7.3",
7374
"execa": "^5.0.0",
7475
"express": "^4.17.3",
7576
"find-up": "^5.0.0",
7677
"fs-extra": "^11.1.0",
78+
"get-npm-tarball-url": "^2.0.3",
7779
"get-port": "^5.1.1",
7880
"giget": "^1.0.0",
7981
"globby": "^11.0.2",

code/lib/cli/src/detect.test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ jest.mock('fs', () => ({
1616
access: jest.fn(),
1717
}));
1818

19+
jest.mock('fs-extra', () => ({
20+
pathExistsSync: jest.fn(() => true),
21+
}));
22+
1923
jest.mock('path', () => ({
2024
// make it return just the second path, for easier testing
2125
join: jest.fn((_, p) => p),

code/lib/cli/src/detect.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import findUp from 'find-up';
33
import semver from 'semver';
44
import { logger } from '@storybook/node-logger';
55

6+
import { pathExistsSync } from 'fs-extra';
7+
import { join } from 'path';
68
import type { TemplateConfiguration, TemplateMatcher } from './project_types';
79
import {
810
ProjectType,
@@ -148,6 +150,10 @@ export function isStorybookInstalled(
148150
return false;
149151
}
150152

153+
export function detectPnp() {
154+
return pathExistsSync(join(process.cwd(), '.pnp.cjs'));
155+
}
156+
151157
export function detectLanguage(packageJson?: PackageJson) {
152158
let language = SupportedLanguage.JAVASCRIPT;
153159

code/lib/cli/src/dirs.ts

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,61 @@
1-
import { dirname } from 'path';
2-
import type { SupportedFrameworks, SupportedRenderers } from './project_types';
1+
import { dirname, join } from 'path';
2+
3+
// @ts-expect-error (has no typings)
4+
import downloadTarball from 'download-tarball';
5+
import getNpmTarballUrl from 'get-npm-tarball-url';
6+
import * as tempy from 'tempy';
7+
38
import { externalFrameworks } from './project_types';
9+
import type { SupportedFrameworks, SupportedRenderers } from './project_types';
10+
import type { JsPackageManager } from './js-package-manager';
11+
import versions from './versions';
412

513
export function getCliDir() {
614
return dirname(require.resolve('@storybook/cli/package.json'));
715
}
816

9-
export function getRendererDir(renderer: SupportedFrameworks | SupportedRenderers) {
17+
const resolveUsingBranchInstall = async (packageManager: JsPackageManager, request: string) => {
18+
const tempDirectory = tempy.directory();
19+
const name = request as keyof typeof versions;
20+
21+
// FIXME: this might not be the right version for community packages
22+
const version = versions[name] || (await packageManager.latestVersion(request));
23+
24+
const url = getNpmTarballUrl(request, version);
25+
26+
// this unzips the tarball into the temp directory
27+
await downloadTarball({ url, dir: tempDirectory });
28+
29+
return join(tempDirectory, 'package');
30+
};
31+
32+
export async function getRendererDir(
33+
packageManager: JsPackageManager,
34+
renderer: SupportedFrameworks | SupportedRenderers
35+
) {
1036
const externalFramework = externalFrameworks.find((framework) => framework.name === renderer);
1137
const frameworkPackageName =
1238
externalFramework?.renderer || externalFramework?.packageName || `@storybook/${renderer}`;
13-
return dirname(
14-
require.resolve(`${frameworkPackageName}/package.json`, {
15-
paths: [process.cwd()],
16-
})
17-
);
39+
40+
const packageJsonPath = `${frameworkPackageName}/package.json`;
41+
42+
const errors: Error[] = [];
43+
44+
try {
45+
return dirname(
46+
require.resolve(packageJsonPath, {
47+
paths: [process.cwd()],
48+
})
49+
);
50+
} catch (e) {
51+
errors.push(e);
52+
}
53+
54+
try {
55+
return await resolveUsingBranchInstall(packageManager, frameworkPackageName);
56+
} catch (e) {
57+
errors.push(e);
58+
}
59+
60+
throw new Error(`Cannot find ${packageJsonPath}, ${errors.map((e) => e.stack).join('\n\n')}`);
1861
}

code/lib/cli/src/generators/REACT_NATIVE/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ const generator = async (
5050
const storybookConfigFolder = '.storybook';
5151

5252
await copyTemplateFiles({
53+
packageManager,
5354
renderer: 'react-native',
5455
language: SupportedLanguage.JAVASCRIPT,
5556
destination: storybookConfigFolder,

code/lib/cli/src/generators/configure.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ describe('configureMain', () => {
5656
expect(mainConfigPath).toEqual('./.storybook/main.ts');
5757
expect(mainConfigContent).toMatchInlineSnapshot(`
5858
"import type { StorybookConfig } from '@storybook/react-vite';
59-
6059
const config: StorybookConfig = {
6160
\\"stories\\": [
6261
\\"../stories/**/*.mdx\\",
@@ -91,7 +90,9 @@ describe('configureMain', () => {
9190

9291
expect(mainConfigPath).toEqual('./.storybook/main.js');
9392
expect(mainConfigContent).toMatchInlineSnapshot(`
94-
"/** @type { import('@storybook/react-webpack5').StorybookConfig } */
93+
"import path from 'path';
94+
95+
/** @type { import('@storybook/react-webpack5').StorybookConfig } */
9596
const config = {
9697
\\"stories\\": [
9798
\\"../stories/**/*.mdx\\",

code/lib/cli/src/generators/configure.ts

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -74,18 +74,26 @@ export async function configureMain({
7474
logger.warn('Could not find framework package name');
7575
}
7676

77-
const mainJsContents = mainConfigTemplate
78-
.replace(
79-
'<<import>>',
80-
isTypescript
81-
? `import type { StorybookConfig } from '${frameworkPackage}';\n\n`
82-
: `/** @type { import('${frameworkPackage}').StorybookConfig } */\n`
83-
)
84-
.replace('<<type>>', isTypescript ? ': StorybookConfig' : '')
85-
.replace('<<mainContents>>', JSON.stringify(config, null, 2))
77+
const mainContents = JSON.stringify(config, null, 2)
8678
.replace(/['"]%%/g, '')
8779
.replace(/%%['"]/g, '');
8880

81+
const imports = [];
82+
83+
if (custom.framework?.name.includes('path.dirname(')) {
84+
imports.push(`import path from 'path';`);
85+
}
86+
87+
if (isTypescript) {
88+
imports.push(`import type { StorybookConfig } from '${frameworkPackage}';`);
89+
} else {
90+
imports.push(`/** @type { import('${frameworkPackage}').StorybookConfig } */`);
91+
}
92+
93+
const mainJsContents = mainConfigTemplate
94+
.replace('<<import>>', `${imports.join('\n\n')}\n`)
95+
.replace('<<type>>', isTypescript ? ': StorybookConfig' : '')
96+
.replace('<<mainContents>>', mainContents);
8997
await fse.writeFile(
9098
`./${storybookConfigFolder}/main.${isTypescript ? 'ts' : 'js'}`,
9199
dedent(mainJsContents),

code/lib/cli/src/helpers.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ import fs from 'fs';
22
import fse from 'fs-extra';
33

44
import * as helpers from './helpers';
5+
import type { JsPackageManager } from './js-package-manager';
56
import type { SupportedRenderers } from './project_types';
67
import { SupportedLanguage } from './project_types';
78

89
jest.mock('fs', () => ({
910
existsSync: jest.fn(),
1011
}));
1112
jest.mock('./dirs', () => ({
12-
getRendererDir: (renderer: string) => `@storybook/${renderer}`,
13+
getRendererDir: (_: JsPackageManager, renderer: string) => `@storybook/${renderer}`,
1314
getCliDir: () => '@storybook/cli',
1415
}));
1516

0 commit comments

Comments
 (0)