Skip to content

Commit c5f7409

Browse files
committed
Merge branch 'next' into pq
2 parents 4474a04 + 77c3c8a commit c5f7409

File tree

24 files changed

+319
-171
lines changed

24 files changed

+319
-171
lines changed

CHANGELOG.md

Lines changed: 108 additions & 95 deletions
Large diffs are not rendered by default.

code/lib/cli/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@
5353
],
5454
"scripts": {
5555
"check": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/check.ts",
56-
"prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/bundle.ts"
56+
"prep": "node --loader ../../../scripts/node_modules/esbuild-register/loader.js -r ../../../scripts/node_modules/esbuild-register/register.js ../../../scripts/prepare/bundle.ts",
57+
"sb": "node ./bin/index.js"
5758
},
5859
"dependencies": {
5960
"@babel/core": "^7.24.4",

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

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,28 @@ const MOCK_FRAMEWORK_FILES: {
4141
},
4242
},
4343
},
44+
{
45+
name: ProjectType.NUXT,
46+
files: {
47+
'package.json': {
48+
dependencies: {
49+
nuxt: '^3.11.2',
50+
},
51+
},
52+
},
53+
},
54+
{
55+
name: ProjectType.NUXT,
56+
files: {
57+
'package.json': {
58+
dependencies: {
59+
// Nuxt projects may have Vue 3 as an explicit dependency
60+
nuxt: '^3.11.2',
61+
vue: '^3.0.0',
62+
},
63+
},
64+
},
65+
},
4466
{
4567
name: ProjectType.VUE3,
4668
files: {
@@ -433,16 +455,6 @@ describe('Detect', () => {
433455
expect(result).toBe(ProjectType.UNDETECTED);
434456
});
435457

436-
// TODO(blaine): Remove once Nuxt3 is supported
437-
it(`UNSUPPORTED for Nuxt framework above version 3.0.0`, () => {
438-
const result = detectFrameworkPreset({
439-
dependencies: {
440-
nuxt: '3.0.0',
441-
},
442-
});
443-
expect(result).toBe(ProjectType.UNSUPPORTED);
444-
});
445-
446458
// TODO: The mocking in this test causes tests after it to fail
447459
it('REACT_SCRIPTS for custom react scripts config', () => {
448460
const forkedReactScriptsConfig = {

code/lib/cli/src/detect.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,11 @@ export async function detectBuilder(packageManager: JsPackageManager, projectTyp
120120
}
121121

122122
// REWORK
123-
if (webpackConfig || (dependencies.webpack && dependencies.vite !== undefined)) {
123+
if (
124+
webpackConfig ||
125+
((dependencies.webpack || dependencies['@nuxt/webpack-builder']) &&
126+
dependencies.vite !== undefined)
127+
) {
124128
commandLog('Detected webpack project. Setting builder to webpack')();
125129
return CoreBuilder.Webpack5;
126130
}
@@ -133,6 +137,8 @@ export async function detectBuilder(packageManager: JsPackageManager, projectTyp
133137
case ProjectType.NEXTJS:
134138
case ProjectType.EMBER:
135139
return CoreBuilder.Webpack5;
140+
case ProjectType.NUXT:
141+
return CoreBuilder.Vite;
136142
default:
137143
const { builder } = await prompts(
138144
{
@@ -202,6 +208,13 @@ export async function detectLanguage(packageManager: JsPackageManager) {
202208
} else if (semver.lt(typescriptVersion, '3.8.0')) {
203209
logger.warn('Detected TypeScript < 3.8, populating with JavaScript examples');
204210
}
211+
} else {
212+
// No direct dependency on TypeScript, but could be a transitive dependency
213+
// This is eg the case for Nuxt projects, which support a recent version of TypeScript
214+
// Check for tsconfig.json (https://www.typescriptlang.org/docs/handbook/tsconfig-json.html)
215+
if (fs.existsSync('tsconfig.json')) {
216+
language = SupportedLanguage.TYPESCRIPT_4_9;
217+
}
205218
}
206219

207220
return language;
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { baseGenerator } from '../baseGenerator';
2+
import type { Generator } from '../types';
3+
4+
const generator: Generator = async (packageManager, npmOptions, options) => {
5+
await baseGenerator(
6+
packageManager,
7+
npmOptions,
8+
options,
9+
'nuxt',
10+
{
11+
extraPackages: async ({ builder }) => {
12+
return ['@nuxtjs/storybook'];
13+
},
14+
installStorybookPackage: false,
15+
installFrameworkPackages: false,
16+
componentsDestinationPath: './components',
17+
extraMain: {
18+
stories: ['../components/**/*.mdx', '../components/**/*.stories.@(js|jsx|ts|tsx|mdx)'],
19+
},
20+
},
21+
'nuxt'
22+
);
23+
// Add nuxtjs/storybook to nuxt.config.js
24+
await packageManager.runPackageCommand('nuxi', [
25+
'module',
26+
'add',
27+
'@nuxtjs/storybook',
28+
'--skipInstall',
29+
]);
30+
};
31+
32+
export default generator;

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

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,16 @@ const defaultOptions: FrameworkOptions = {
2323
staticDir: undefined,
2424
addScripts: true,
2525
addMainFile: true,
26+
addPreviewFile: true,
2627
addComponents: true,
2728
webpackCompiler: () => undefined,
2829
extraMain: undefined,
2930
framework: undefined,
3031
extensions: undefined,
3132
componentsDestinationPath: undefined,
3233
storybookConfigFolder: '.storybook',
34+
installStorybookPackage: true,
35+
installFrameworkPackages: true,
3336
};
3437

3538
const getBuilderDetails = (builder: string) => {
@@ -202,12 +205,15 @@ export async function baseGenerator(
202205
staticDir,
203206
addScripts,
204207
addMainFile,
208+
addPreviewFile,
205209
addComponents,
206210
extraMain,
207211
extensions,
208212
storybookConfigFolder,
209213
componentsDestinationPath,
210214
webpackCompiler,
215+
installStorybookPackage,
216+
installFrameworkPackages,
211217
} = {
212218
...defaultOptions,
213219
...options,
@@ -279,9 +285,9 @@ export async function baseGenerator(
279285
: extraPackages;
280286

281287
const allPackages = [
282-
'storybook',
288+
installStorybookPackage ? 'storybook' : undefined,
283289
getExternalFramework(rendererId) ? undefined : `@storybook/${rendererId}`,
284-
...frameworkPackages,
290+
...(installFrameworkPackages ? frameworkPackages : []),
285291
...addonPackages,
286292
...(extraPackagesToInstall || []),
287293
].filter(Boolean);
@@ -323,7 +329,9 @@ export async function baseGenerator(
323329
addDependenciesSpinner.succeed();
324330
}
325331

326-
await fse.ensureDir(`./${storybookConfigFolder}`);
332+
if (addMainFile || addPreviewFile) {
333+
await fse.ensureDir(`./${storybookConfigFolder}`);
334+
}
327335

328336
if (addMainFile) {
329337
const prefixes = shouldApplyRequireWrapperOnPackageNames
@@ -371,12 +379,14 @@ export async function baseGenerator(
371379
});
372380
}
373381

374-
await configurePreview({
375-
frameworkPreviewParts,
376-
storybookConfigFolder: storybookConfigFolder as string,
377-
language,
378-
rendererId,
379-
});
382+
if (addPreviewFile) {
383+
await configurePreview({
384+
frameworkPreviewParts,
385+
storybookConfigFolder: storybookConfigFolder as string,
386+
language,
387+
rendererId,
388+
});
389+
}
380390

381391
if (addScripts) {
382392
await packageManager.addStorybookCommandInScripts({

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ describe('configureMain', () => {
2929
expect(mainConfigContent).toMatchInlineSnapshot(`
3030
"/** @type { import('@storybook/react-vite').StorybookConfig } */
3131
const config = {
32-
stories: ['../stories/**/*.mdx', '../stories/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
32+
stories: ['../stories/**/*.mdx', '../stories/**/*.stories.@(js|jsx|mjs)'],
3333
addons: [],
3434
framework: {
3535
name: '@storybook/react-vite',
@@ -95,7 +95,7 @@ describe('configureMain', () => {
9595
9696
/** @type { import('@storybook/react-webpack5').StorybookConfig } */
9797
const config = {
98-
stories: ['../stories/**/*.mdx', '../stories/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
98+
stories: ['../stories/**/*.mdx', '../stories/**/*.stories.@(js|jsx|mjs)'],
9999
addons: [
100100
path.dirname(require.resolve(path.join('@storybook/addon-links', 'package.json'))),
101101
path.dirname(require.resolve(path.join('@storybook/addon-essentials', 'package.json'))),

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ const sanitizeFramework = (framework: string) => {
4949
return matches[0];
5050
};
5151

52+
const typescriptExtensions = ['ts', 'tsx', 'mts', 'cts'];
53+
5254
export async function configureMain({
5355
addons,
5456
extensions = ['js', 'jsx', 'mjs', 'ts', 'tsx'],
@@ -57,10 +59,14 @@ export async function configureMain({
5759
prefixes = [],
5860
...custom
5961
}: ConfigureMainOptions) {
62+
const isLanguageJavascript = language === SupportedLanguage.JAVASCRIPT;
63+
const filteredExtensions = extensions.filter((extension) =>
64+
isLanguageJavascript ? !typescriptExtensions.includes(extension) : true
65+
);
6066
const srcPath = path.resolve(storybookConfigFolder, '../src');
6167
const prefix = (await fse.pathExists(srcPath)) ? '../src' : '../stories';
6268
const config = {
63-
stories: [`${prefix}/**/*.mdx`, `${prefix}/**/*.stories.@(${extensions.join('|')})`],
69+
stories: [`${prefix}/**/*.mdx`, `${prefix}/**/*.stories.@(${filteredExtensions.join('|')})`],
6470
addons,
6571
...custom,
6672
};

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,16 @@ export interface FrameworkOptions {
2222
staticDir?: string;
2323
addScripts?: boolean;
2424
addMainFile?: boolean;
25+
addPreviewFile?: boolean;
2526
addComponents?: boolean;
2627
webpackCompiler?: ({ builder }: { builder: Builder }) => 'babel' | 'swc' | undefined;
2728
extraMain?: any;
2829
extensions?: string[];
2930
framework?: Record<string, any>;
3031
storybookConfigFolder?: string;
3132
componentsDestinationPath?: string;
33+
installStorybookPackage?: boolean;
34+
installFrameworkPackages?: boolean;
3235
}
3336

3437
export type Generator<T = void> = (

code/lib/cli/src/helpers.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ export const frameworkToDefaultBuilder: Record<SupportedFrameworks, CoreBuilder>
143143
'html-vite': CoreBuilder.Vite,
144144
'html-webpack5': CoreBuilder.Webpack5,
145145
nextjs: CoreBuilder.Webpack5,
146+
nuxt: CoreBuilder.Vite,
146147
'preact-vite': CoreBuilder.Vite,
147148
'preact-webpack5': CoreBuilder.Webpack5,
148149
qwik: CoreBuilder.Vite,

0 commit comments

Comments
 (0)