diff --git a/code/lib/cli/src/detect.test.ts b/code/lib/cli/src/detect.test.ts index 9f898a377381..0c463a0056e2 100644 --- a/code/lib/cli/src/detect.test.ts +++ b/code/lib/cli/src/detect.test.ts @@ -1,8 +1,8 @@ import * as fs from 'fs'; import { logger } from '@storybook/node-logger'; import { getBowerJson } from './helpers'; -import { detect, detectFrameworkPreset, detectLanguage, isStorybookInstalled } from './detect'; -import { ProjectType, SUPPORTED_RENDERERS, SupportedLanguage } from './project_types'; +import { detect, detectFrameworkPreset, detectLanguage } from './detect'; +import { ProjectType, SupportedLanguage } from './project_types'; import type { PackageJsonWithMaybeDeps } from './js-package-manager'; jest.mock('./helpers', () => ({ @@ -346,36 +346,6 @@ describe('Detect', () => { expect(detectLanguage()).toBe(SupportedLanguage.JAVASCRIPT); }); - describe('isStorybookInstalled should return', () => { - it('false if empty devDependency', () => { - expect(isStorybookInstalled({ devDependencies: {} }, false)).toBe(false); - }); - - it('false if no devDependency', () => { - expect(isStorybookInstalled({}, false)).toBe(false); - }); - - SUPPORTED_RENDERERS.forEach((framework) => { - it(`true if devDependencies has ${framework} Storybook version`, () => { - const devDependencies = { - [`@storybook/${framework}`]: '4.0.0-alpha.21', - }; - expect(isStorybookInstalled({ devDependencies }, false)).toBeTruthy(); - }); - }); - - it('false if forced flag', () => { - expect( - isStorybookInstalled( - { - devDependencies: { '@storybook/react': '4.0.0-alpha.21' }, - }, - true - ) - ).toBe(false); - }); - }); - describe('detectFrameworkPreset should return', () => { afterEach(() => { jest.clearAllMocks(); diff --git a/code/lib/cli/src/detect.ts b/code/lib/cli/src/detect.ts index 74db230922ad..e360702d8e51 100644 --- a/code/lib/cli/src/detect.ts +++ b/code/lib/cli/src/detect.ts @@ -4,17 +4,16 @@ import semver from 'semver'; import { logger } from '@storybook/node-logger'; import { pathExistsSync } from 'fs-extra'; -import { join } from 'path'; +import { join, resolve } from 'path'; import type { TemplateConfiguration, TemplateMatcher } from './project_types'; import { ProjectType, supportedTemplates, - SUPPORTED_RENDERERS, SupportedLanguage, unsupportedTemplate, CoreBuilder, } from './project_types'; -import { getBowerJson, isNxProject, paddedLog } from './helpers'; +import { commandLog, getBowerJson, isNxProject } from './helpers'; import type { JsPackageManager, PackageJson, PackageJsonWithMaybeDeps } from './js-package-manager'; import { detectWebpack } from './detect-webpack'; @@ -112,12 +111,12 @@ export function detectFrameworkPreset( export function detectBuilder(packageManager: JsPackageManager, projectType: ProjectType) { const viteConfig = findUp.sync(viteConfigFiles); if (viteConfig) { - paddedLog('Detected Vite project. Setting builder to Vite'); + commandLog('Detected Vite project. Setting builder to Vite')(); return CoreBuilder.Vite; } if (detectWebpack(packageManager)) { - paddedLog('Detected webpack project. Setting builder to webpack'); + commandLog('Detected webpack project. Setting builder to webpack')(); return CoreBuilder.Webpack5; } @@ -134,26 +133,8 @@ export function detectBuilder(packageManager: JsPackageManager, projectType: Pro } } -export function isStorybookInstalled( - dependencies: Pick | false, - force?: boolean -) { - if (!dependencies) { - return false; - } - - if (!force && dependencies.devDependencies) { - if ( - SUPPORTED_RENDERERS.reduce( - (storybookPresent, framework) => - storybookPresent || !!dependencies.devDependencies[`@storybook/${framework}`], - false - ) - ) { - return true; - } - } - return false; +export function isStorybookInstantiated(configDir = resolve(process.cwd(), '.storybook')) { + return fs.existsSync(configDir); } export function detectPnp() { diff --git a/code/lib/cli/src/initiate.ts b/code/lib/cli/src/initiate.ts index 1d02074d40fa..7efbb4b6ec08 100644 --- a/code/lib/cli/src/initiate.ts +++ b/code/lib/cli/src/initiate.ts @@ -5,7 +5,13 @@ import { telemetry } from '@storybook/telemetry'; import { withTelemetry } from '@storybook/core-server'; import { installableProjectTypes, ProjectType } from './project_types'; -import { detect, isStorybookInstalled, detectLanguage, detectBuilder, detectPnp } from './detect'; +import { + detect, + isStorybookInstantiated, + detectLanguage, + detectBuilder, + detectPnp, +} from './detect'; import { commandLog, codeLog, paddedLog } from './helpers'; import angularGenerator from './generators/ANGULAR'; import aureliaGenerator from './generators/AURELIA'; @@ -77,118 +83,118 @@ const installStorybook = async ( case ProjectType.REACT: return reactGenerator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "React" app\n') + commandLog('Adding Storybook support to your "React" app') ); case ProjectType.REACT_NATIVE: { return reactNativeGenerator(packageManager, npmOptions).then( - commandLog('Adding Storybook support to your "React Native" app\n') + commandLog('Adding Storybook support to your "React Native" app') ); } case ProjectType.QWIK: { return qwikGenerator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "Qwik" app\n') + commandLog('Adding Storybook support to your "Qwik" app') ); } case ProjectType.WEBPACK_REACT: return webpackReactGenerator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "Webpack React" app\n') + commandLog('Adding Storybook support to your "Webpack React" app') ); case ProjectType.REACT_PROJECT: return reactGenerator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "React" library\n') + commandLog('Adding Storybook support to your "React" library') ); case ProjectType.NEXTJS: return nextjsGenerator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "Next" app\n') + commandLog('Adding Storybook support to your "Next" app') ); case ProjectType.SFC_VUE: return sfcVueGenerator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "Single File Components Vue" app\n') + commandLog('Adding Storybook support to your "Single File Components Vue" app') ); case ProjectType.VUE: return vueGenerator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "Vue" app\n') + commandLog('Adding Storybook support to your "Vue" app') ); case ProjectType.VUE3: return vue3Generator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "Vue 3" app\n') + commandLog('Adding Storybook support to your "Vue 3" app') ); case ProjectType.ANGULAR: - commandLog('Adding Storybook support to your "Angular" app\n'); + commandLog('Adding Storybook support to your "Angular" app'); return angularGenerator(packageManager, npmOptions, generatorOptions, options); case ProjectType.EMBER: return emberGenerator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "Ember" app\n') + commandLog('Adding Storybook support to your "Ember" app') ); case ProjectType.MITHRIL: return mithrilGenerator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "Mithril" app\n') + commandLog('Adding Storybook support to your "Mithril" app') ); case ProjectType.MARIONETTE: return marionetteGenerator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "Marionette.js" app\n') + commandLog('Adding Storybook support to your "Marionette.js" app') ); case ProjectType.MARKO: return markoGenerator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "Marko" app\n') + commandLog('Adding Storybook support to your "Marko" app') ); case ProjectType.HTML: return htmlGenerator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "HTML" app\n') + commandLog('Adding Storybook support to your "HTML" app') ); case ProjectType.WEB_COMPONENTS: return webComponentsGenerator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "web components" app\n') + commandLog('Adding Storybook support to your "web components" app') ); case ProjectType.RIOT: return riotGenerator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "riot.js" app\n') + commandLog('Adding Storybook support to your "riot.js" app') ); case ProjectType.PREACT: return preactGenerator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "Preact" app\n') + commandLog('Adding Storybook support to your "Preact" app') ); case ProjectType.SVELTE: return svelteGenerator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "Svelte" app\n') + commandLog('Adding Storybook support to your "Svelte" app') ); case ProjectType.SVELTEKIT: return svelteKitGenerator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "SvelteKit" app\n') + commandLog('Adding Storybook support to your "SvelteKit" app') ); case ProjectType.RAX: return raxGenerator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "Rax" app\n') + commandLog('Adding Storybook support to your "Rax" app') ); case ProjectType.AURELIA: return aureliaGenerator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "Aurelia" app\n') + commandLog('Adding Storybook support to your "Aurelia" app') ); case ProjectType.SERVER: return serverGenerator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "Server" app\n') + commandLog('Adding Storybook support to your "Server" app') ); case ProjectType.NX /* NX */: @@ -200,7 +206,7 @@ const installStorybook = async ( case ProjectType.SOLID: return solidGenerator(packageManager, npmOptions, generatorOptions).then( - commandLog('Adding Storybook support to your "SolidJS" app\n') + commandLog('Adding Storybook support to your "SolidJS" app') ); case ProjectType.UNSUPPORTED: @@ -313,22 +319,31 @@ async function doInitiate(options: CommandOptions, pkg: PackageJson): Promise