UNPKG

@storybook/cli

Version:

Storybook's CLI - easiest method of adding storybook to your projects

290 lines (210 loc) • 13.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.initiate = initiate; require("core-js/modules/es.promise.js"); var _updateNotifier = require("update-notifier"); var _chalk = _interopRequireDefault(require("chalk")); var _prompts = _interopRequireDefault(require("prompts")); var _detect = require("./detect"); var _project_types = require("./project_types"); var _helpers = require("./helpers"); var _ANGULAR = _interopRequireDefault(require("./generators/ANGULAR")); var _AURELIA = _interopRequireDefault(require("./generators/AURELIA")); var _EMBER = _interopRequireDefault(require("./generators/EMBER")); var _METEOR = _interopRequireDefault(require("./generators/METEOR")); var _REACT = _interopRequireDefault(require("./generators/REACT")); var _REACT_NATIVE = _interopRequireDefault(require("./generators/REACT_NATIVE")); var _REACT_SCRIPTS = _interopRequireDefault(require("./generators/REACT_SCRIPTS")); var _SFC_VUE = _interopRequireDefault(require("./generators/SFC_VUE")); var _UPDATE_PACKAGE_ORGANIZATIONS = _interopRequireDefault(require("./generators/UPDATE_PACKAGE_ORGANIZATIONS")); var _VUE = _interopRequireDefault(require("./generators/VUE")); var _VUE2 = _interopRequireDefault(require("./generators/VUE3")); var _WEBPACK_REACT = _interopRequireDefault(require("./generators/WEBPACK_REACT")); var _MITHRIL = _interopRequireDefault(require("./generators/MITHRIL")); var _MARIONETTE = _interopRequireDefault(require("./generators/MARIONETTE")); var _MARKO = _interopRequireDefault(require("./generators/MARKO")); var _HTML = _interopRequireDefault(require("./generators/HTML")); var _WEBCOMPONENTS = _interopRequireDefault(require("./generators/WEB-COMPONENTS")); var _RIOT = _interopRequireDefault(require("./generators/RIOT")); var _PREACT = _interopRequireDefault(require("./generators/PREACT")); var _SVELTE = _interopRequireDefault(require("./generators/SVELTE")); var _RAX = _interopRequireDefault(require("./generators/RAX")); var _SERVER = _interopRequireDefault(require("./generators/SERVER")); var _jsPackageManager = require("./js-package-manager"); var _automigrate = require("./automigrate"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const logger = console; const installStorybook = (projectType, options) => { const packageManager = _jsPackageManager.JsPackageManagerFactory.getPackageManager(options.useNpm); const npmOptions = { installAsDevDependencies: true, skipInstall: options.skipInstall }; const language = (0, _detect.detectLanguage)(); const generatorOptions = { language, builder: options.builder || _project_types.CoreBuilder.Webpack4, linkable: !!options.linkable, commonJs: options.commonJs }; const end = () => { if (!options.skipInstall) { packageManager.installDependencies(); } logger.log('\nTo run your Storybook, type:\n'); (0, _helpers.codeLog)([packageManager.getRunStorybookCommand()]); logger.log('\nFor more information visit:', _chalk.default.cyan('https://storybook.js.org')); // Add a new line for the clear visibility. logger.log(); }; const REACT_NATIVE_REPO = 'https://github.com/storybookjs/react-native'; const runGenerator = () => { switch (projectType) { case _project_types.ProjectType.ALREADY_HAS_STORYBOOK: logger.log(); (0, _helpers.paddedLog)('There seems to be a Storybook already available in this project.'); (0, _helpers.paddedLog)('Apply following command to force:\n'); (0, _helpers.codeLog)(['sb init [options] -f']); // Add a new line for the clear visibility. logger.log(); return Promise.resolve(); case _project_types.ProjectType.UPDATE_PACKAGE_ORGANIZATIONS: return (0, _UPDATE_PACKAGE_ORGANIZATIONS.default)(packageManager, options.parser, npmOptions).then(() => null) // commandLog doesn't like to see output .then((0, _helpers.commandLog)('Upgrading your project to the new Storybook packages.')).then(end); case _project_types.ProjectType.REACT_SCRIPTS: return (0, _REACT_SCRIPTS.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Create React App" based project')).then(end); case _project_types.ProjectType.REACT: return (0, _REACT.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "React" app')).then(end); case _project_types.ProjectType.REACT_NATIVE: { return (options.yes ? Promise.resolve({ server: true }) : (0, _prompts.default)([{ type: 'confirm', name: 'server', message: 'Do you want to install dependencies necessary to run Storybook server? You can manually do it later by install @storybook/react-native-server', initial: false }])).then(({ server }) => (0, _REACT_NATIVE.default)(packageManager, npmOptions, server)).then((0, _helpers.commandLog)('Adding Storybook support to your "React Native" app')).then(end).then(() => { logger.log(_chalk.default.red('NOTE: installation is not 100% automated.')); logger.log(`To quickly run Storybook, replace contents of your app entry with:\n`); (0, _helpers.codeLog)(["export {default} from './storybook';"]); logger.log('\n For more in information, see the github readme:\n'); logger.log(_chalk.default.cyan(REACT_NATIVE_REPO)); logger.log(); }); } case _project_types.ProjectType.METEOR: return (0, _METEOR.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Meteor" app')).then(end); case _project_types.ProjectType.WEBPACK_REACT: return (0, _WEBPACK_REACT.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Webpack React" app')).then(end); case _project_types.ProjectType.REACT_PROJECT: return (0, _REACT.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "React" library')).then(end); case _project_types.ProjectType.SFC_VUE: return (0, _SFC_VUE.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Single File Components Vue" app')).then(end); case _project_types.ProjectType.VUE: return (0, _VUE.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Vue" app')).then(end); case _project_types.ProjectType.VUE3: return (0, _VUE2.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Vue 3" app')).then(end); case _project_types.ProjectType.ANGULAR: return (0, _ANGULAR.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Angular" app')).then(end); case _project_types.ProjectType.EMBER: return (0, _EMBER.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Ember" app')).then(end); case _project_types.ProjectType.MITHRIL: return (0, _MITHRIL.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Mithril" app')).then(end); case _project_types.ProjectType.MARIONETTE: return (0, _MARIONETTE.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Marionette.js" app')).then(end); case _project_types.ProjectType.MARKO: return (0, _MARKO.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Marko" app')).then(end); case _project_types.ProjectType.HTML: return (0, _HTML.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "HTML" app')).then(end); case _project_types.ProjectType.WEB_COMPONENTS: return (0, _WEBCOMPONENTS.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "web components" app')).then(end); case _project_types.ProjectType.RIOT: return (0, _RIOT.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "riot.js" app')).then(end); case _project_types.ProjectType.PREACT: return (0, _PREACT.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Preact" app')).then(end); case _project_types.ProjectType.SVELTE: return (0, _SVELTE.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Svelte" app')).then(end); case _project_types.ProjectType.RAX: return (0, _RAX.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Rax" app')).then(end); case _project_types.ProjectType.AURELIA: return (0, _AURELIA.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Aurelia" app')).then(end); case _project_types.ProjectType.SERVER: return (0, _SERVER.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Server" app')).then(end); case _project_types.ProjectType.UNSUPPORTED: (0, _helpers.paddedLog)(`We detected a project type that we don't support yet.`); (0, _helpers.paddedLog)(`If you'd like your framework to be supported, please let use know about it at https://github.com/storybookjs/storybook/issues`); // Add a new line for the clear visibility. logger.log(); return Promise.resolve(); default: (0, _helpers.paddedLog)(`We couldn't detect your project type. (code: ${projectType})`); (0, _helpers.paddedLog)('You can specify a project type explicitly via `sb init --type <type>`, see our docs on how to configure Storybook for your framework: https://storybook.js.org/docs/react/get-started/install'); // Add a new line for the clear visibility. logger.log(); return projectTypeInquirer(options); } }; return runGenerator().catch(ex => { logger.error(`\n ${_chalk.default.red(ex.stack)}`); process.exit(1); }); }; const projectTypeInquirer = async options => { const manualAnswer = options.yes ? true : await (0, _prompts.default)([{ type: 'confirm', name: 'manual', message: 'Do you want to manually choose a Storybook project type to install?' }]); if (manualAnswer !== true && manualAnswer.manual) { const frameworkAnswer = await (0, _prompts.default)([{ type: 'select', name: 'manualFramework', message: 'Please choose a project type from the following list:', choices: _project_types.installableProjectTypes.map(type => ({ title: type, value: type.toUpperCase() })) }]); return installStorybook(frameworkAnswer.manualFramework, options); } return Promise.resolve(); }; async function initiate(options, pkg) { const welcomeMessage = 'sb init - the simplest way to add a Storybook to your project.'; logger.log(_chalk.default.inverse(`\n ${welcomeMessage} \n`)); // Update notify code. new _updateNotifier.UpdateNotifier({ pkg, updateCheckInterval: 1000 * 60 * 60 // every hour (we could increase this later on.) }).notify(); let projectType; const projectTypeProvided = options.type; const infoText = projectTypeProvided ? `Installing Storybook for user specified project type: ${projectTypeProvided}` : 'Detecting project type'; const done = (0, _helpers.commandLog)(infoText); const packageJson = (0, _jsPackageManager.readPackageJson)(); const isEsm = packageJson && packageJson.type === 'module'; try { if (projectTypeProvided) { if (_project_types.installableProjectTypes.includes(projectTypeProvided)) { const storybookInstalled = (0, _detect.isStorybookInstalled)(packageJson, options.force); projectType = storybookInstalled ? _project_types.ProjectType.ALREADY_HAS_STORYBOOK : projectTypeProvided.toUpperCase(); } else { done(`The provided project type was not recognized by Storybook: ${projectTypeProvided}`); logger.log(`\nThe project types currently supported by Storybook are:\n`); _project_types.installableProjectTypes.sort().forEach(framework => (0, _helpers.paddedLog)(`- ${framework}`)); logger.log(); process.exit(1); } } else { projectType = (0, _detect.detect)(options); } } catch (ex) { done(ex.message); process.exit(1); } done(); await installStorybook(projectType, Object.assign({}, options, isEsm ? { commonJs: true } : undefined)); return (0, _automigrate.automigrate)(); }