diff --git a/code/lib/cli-storybook/src/link.ts b/code/lib/cli-storybook/src/link.ts index 5db8d2cbd930..55a89d1a380c 100644 --- a/code/lib/cli-storybook/src/link.ts +++ b/code/lib/cli-storybook/src/link.ts @@ -1,4 +1,4 @@ -import { mkdir, readFile } from 'node:fs/promises'; +import { mkdir, readFile, writeFile } from 'node:fs/promises'; import { basename, extname, join } from 'node:path'; import { logger } from 'storybook/internal/node-logger'; @@ -108,14 +108,23 @@ export const link = async ({ target, local, start }: LinkOptions) => { await exec(`yarn link --all --relative ${storybookDir}`, { cwd: reproDir }); logger.info(`Installing ${reproName}`); - await exec(`yarn install`, { cwd: reproDir }); if (!reproPackageJson.devDependencies?.vite) { - await exec(`yarn add -D webpack-hot-middleware`, { cwd: reproDir }); + reproPackageJson.devDependencies = { + ...reproPackageJson.devDependencies, + 'webpack-hot-middleware': '*', + }; } // ensure that linking is possible - await exec(`yarn add @types/node@22`, { cwd: reproDir }); + reproPackageJson.devDependencies = { + ...reproPackageJson.devDependencies, + '@types/node': '^22', + }; + + await writeFile(join(reproDir, 'package.json'), JSON.stringify(reproPackageJson, null, 2)); + + await exec(`yarn install`, { cwd: reproDir }); if (start) { logger.info(`Running ${reproName} storybook`); diff --git a/code/lib/create-storybook/src/generators/NUXT/index.ts b/code/lib/create-storybook/src/generators/NUXT/index.ts index a7d7be640eb7..89c775cbd82f 100644 --- a/code/lib/create-storybook/src/generators/NUXT/index.ts +++ b/code/lib/create-storybook/src/generators/NUXT/index.ts @@ -4,7 +4,9 @@ import type { Generator } from '../types'; const generator: Generator = async (packageManager, npmOptions, options) => { await baseGenerator( packageManager, - npmOptions, + { + ...npmOptions, + }, options, 'vue3', { @@ -19,6 +21,14 @@ const generator: Generator = async (packageManager, npmOptions, options) => { }, 'nuxt' ); + + if (npmOptions.skipInstall === true) { + console.log( + 'The --skip-install flag is not supported for generating Storybook for Nuxt. We will continue to install dependencies.' + ); + await packageManager.installDependencies(); + } + // Add nuxtjs/storybook to nuxt.config.js await packageManager.runPackageCommand('nuxi', [ 'module', diff --git a/scripts/tasks/sandbox-parts.ts b/scripts/tasks/sandbox-parts.ts index 21c36dc67bd0..db467ca67d70 100644 --- a/scripts/tasks/sandbox-parts.ts +++ b/scripts/tasks/sandbox-parts.ts @@ -13,6 +13,7 @@ import { writeFile, writeJson, } from 'fs-extra'; +import { readFile } from 'fs/promises'; import JSON5 from 'json5'; import { createRequire } from 'module'; import { join, relative, resolve, sep } from 'path'; @@ -144,7 +145,7 @@ export const init: Task['run'] = async ( await executeCLIStep(steps.init, { cwd, - optionValues: { debug, yes: true, ...extra }, + optionValues: { debug, yes: true, 'skip-install': true, ...extra }, dryRun, debug, }); @@ -538,17 +539,24 @@ export async function addExtraDependencies({ return; } + const packageJson = JSON.parse(await readFile(join(cwd, 'package.json'), { encoding: 'utf8' })); + const packageManager = JsPackageManagerFactory.getPackageManager({}, cwd); - await packageManager.addDependencies({ installAsDevDependencies: true }, extraDevDeps); + await packageManager.addDependencies( + { installAsDevDependencies: true, skipInstall: true, packageJson }, + extraDevDeps + ); if (extraDeps) { const versionedExtraDeps = await packageManager.getVersionedPackages(extraDeps); if (debug) { logger.log('\uD83C\uDF81 Adding extra deps', versionedExtraDeps); } - await packageManager.addDependencies({ installAsDevDependencies: true }, versionedExtraDeps); + await packageManager.addDependencies( + { installAsDevDependencies: true, skipInstall: true, packageJson }, + versionedExtraDeps + ); } - await packageManager.installDependencies(); } export const addStories: Task['run'] = async ( diff --git a/scripts/tasks/sandbox.ts b/scripts/tasks/sandbox.ts index cbf8856e0373..06d9d8e0418c 100644 --- a/scripts/tasks/sandbox.ts +++ b/scripts/tasks/sandbox.ts @@ -147,6 +147,12 @@ export const sandbox: Task = { await setImportMap(details.sandboxDir); + const { JsPackageManagerFactory } = await import('../../code/core/src/common'); + + const packageManager = JsPackageManagerFactory.getPackageManager({}, details.sandboxDir); + + await packageManager.installDependencies(); + logger.info(`✅ Storybook sandbox created at ${details.sandboxDir}`); }, }; diff --git a/scripts/utils/cli-step.ts b/scripts/utils/cli-step.ts index ce57896aeddf..188cb1a68449 100644 --- a/scripts/utils/cli-step.ts +++ b/scripts/utils/cli-step.ts @@ -40,6 +40,7 @@ export const steps = { yes: { type: 'boolean' }, type: { type: 'string' }, debug: { type: 'boolean' }, + 'skip-install': { type: 'boolean' }, }), }, add: {