UNPKG

13.4 kBJavaScriptView Raw
1"use strict";
2
3require("core-js/modules/es.promise.js");
4
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports.default = _default;
9
10var _updateNotifier = require("update-notifier");
11
12var _chalk = _interopRequireDefault(require("chalk"));
13
14var _prompts = _interopRequireDefault(require("prompts"));
15
16var _detect = require("./detect");
17
18var _project_types = require("./project_types");
19
20var _helpers = require("./helpers");
21
22var _ANGULAR = _interopRequireDefault(require("./generators/ANGULAR"));
23
24var _AURELIA = _interopRequireDefault(require("./generators/AURELIA"));
25
26var _EMBER = _interopRequireDefault(require("./generators/EMBER"));
27
28var _METEOR = _interopRequireDefault(require("./generators/METEOR"));
29
30var _REACT = _interopRequireDefault(require("./generators/REACT"));
31
32var _REACT_NATIVE = _interopRequireDefault(require("./generators/REACT_NATIVE"));
33
34var _REACT_SCRIPTS = _interopRequireDefault(require("./generators/REACT_SCRIPTS"));
35
36var _SFC_VUE = _interopRequireDefault(require("./generators/SFC_VUE"));
37
38var _UPDATE_PACKAGE_ORGANIZATIONS = _interopRequireDefault(require("./generators/UPDATE_PACKAGE_ORGANIZATIONS"));
39
40var _VUE = _interopRequireDefault(require("./generators/VUE"));
41
42var _VUE2 = _interopRequireDefault(require("./generators/VUE3"));
43
44var _WEBPACK_REACT = _interopRequireDefault(require("./generators/WEBPACK_REACT"));
45
46var _MITHRIL = _interopRequireDefault(require("./generators/MITHRIL"));
47
48var _MARIONETTE = _interopRequireDefault(require("./generators/MARIONETTE"));
49
50var _MARKO = _interopRequireDefault(require("./generators/MARKO"));
51
52var _HTML = _interopRequireDefault(require("./generators/HTML"));
53
54var _WEBCOMPONENTS = _interopRequireDefault(require("./generators/WEB-COMPONENTS"));
55
56var _RIOT = _interopRequireDefault(require("./generators/RIOT"));
57
58var _PREACT = _interopRequireDefault(require("./generators/PREACT"));
59
60var _SVELTE = _interopRequireDefault(require("./generators/SVELTE"));
61
62var _RAX = _interopRequireDefault(require("./generators/RAX"));
63
64var _warn = require("./warn");
65
66var _jsPackageManager = require("./js-package-manager");
67
68function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
69
70const logger = console;
71
72const installStorybook = (projectType, options) => {
73 const packageManager = _jsPackageManager.JsPackageManagerFactory.getPackageManager(options.useNpm);
74
75 const npmOptions = {
76 installAsDevDependencies: true,
77 skipInstall: options.skipInstall
78 };
79 const language = (0, _detect.detectLanguage)();
80 const hasTSDependency = language === _project_types.SupportedLanguage.TYPESCRIPT;
81 (0, _warn.warn)({
82 hasTSDependency
83 });
84 const defaultStoryFormat = hasTSDependency ? _project_types.StoryFormat.CSF_TYPESCRIPT : _project_types.StoryFormat.CSF;
85 const generatorOptions = {
86 storyFormat: options.storyFormat || defaultStoryFormat,
87 language,
88 builder: options.builder || _project_types.Builder.Webpack4
89 };
90
91 const end = () => {
92 if (!options.skipInstall) {
93 packageManager.installDependencies();
94 }
95
96 logger.log('\nTo run your Storybook, type:\n');
97 (0, _helpers.codeLog)([packageManager.getRunStorybookCommand()]);
98 logger.log('\nFor more information visit:', _chalk.default.cyan('https://storybook.js.org')); // Add a new line for the clear visibility.
99
100 logger.log();
101 };
102
103 const REACT_NATIVE_REPO = 'https://github.com/storybookjs/react-native';
104
105 const runGenerator = () => {
106 switch (projectType) {
107 case _project_types.ProjectType.ALREADY_HAS_STORYBOOK:
108 logger.log();
109 (0, _helpers.paddedLog)('There seems to be a Storybook already available in this project.');
110 (0, _helpers.paddedLog)('Apply following command to force:\n');
111 (0, _helpers.codeLog)(['sb init [options] -f']); // Add a new line for the clear visibility.
112
113 logger.log();
114 return Promise.resolve();
115
116 case _project_types.ProjectType.UPDATE_PACKAGE_ORGANIZATIONS:
117 return (0, _UPDATE_PACKAGE_ORGANIZATIONS.default)(packageManager, options.parser, npmOptions).then(() => null) // commandLog doesn't like to see output
118 .then((0, _helpers.commandLog)('Upgrading your project to the new Storybook packages.')).then(end);
119
120 case _project_types.ProjectType.REACT_SCRIPTS:
121 return (0, _REACT_SCRIPTS.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Create React App" based project')).then(end);
122
123 case _project_types.ProjectType.REACT:
124 return (0, _REACT.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "React" app')).then(end);
125
126 case _project_types.ProjectType.REACT_NATIVE:
127 {
128 return (options.yes ? Promise.resolve({
129 server: true
130 }) : (0, _prompts.default)([{
131 type: 'confirm',
132 name: 'server',
133 message: 'Do you want to install dependencies necessary to run Storybook server? You can manually do it later by install @storybook/react-native-server',
134 initial: false
135 }])).then(({
136 server
137 }) => (0, _REACT_NATIVE.default)(packageManager, npmOptions, server, generatorOptions)).then((0, _helpers.commandLog)('Adding Storybook support to your "React Native" app')).then(end).then(() => {
138 logger.log(_chalk.default.red('NOTE: installation is not 100% automated.'));
139 logger.log(`To quickly run Storybook, replace contents of your app entry with:\n`);
140 (0, _helpers.codeLog)(["export {default} from './storybook';"]);
141 logger.log('\n For more in information, see the github readme:\n');
142 logger.log(_chalk.default.cyan(REACT_NATIVE_REPO));
143 logger.log();
144 });
145 }
146
147 case _project_types.ProjectType.METEOR:
148 return (0, _METEOR.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Meteor" app')).then(end);
149
150 case _project_types.ProjectType.WEBPACK_REACT:
151 return (0, _WEBPACK_REACT.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Webpack React" app')).then(end);
152
153 case _project_types.ProjectType.REACT_PROJECT:
154 return (0, _REACT.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "React" library')).then(end);
155
156 case _project_types.ProjectType.SFC_VUE:
157 return (0, _SFC_VUE.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Single File Components Vue" app')).then(end);
158
159 case _project_types.ProjectType.VUE:
160 return (0, _VUE.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Vue" app')).then(end);
161
162 case _project_types.ProjectType.VUE3:
163 return (0, _VUE2.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Vue 3" app')).then(end);
164
165 case _project_types.ProjectType.ANGULAR:
166 return (0, _ANGULAR.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Angular" app')).then(end);
167
168 case _project_types.ProjectType.EMBER:
169 return (0, _EMBER.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Ember" app')).then(end);
170
171 case _project_types.ProjectType.MITHRIL:
172 return (0, _MITHRIL.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Mithril" app')).then(end);
173
174 case _project_types.ProjectType.MARIONETTE:
175 return (0, _MARIONETTE.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Marionette.js" app')).then(end);
176
177 case _project_types.ProjectType.MARKO:
178 return (0, _MARKO.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Marko" app')).then(end);
179
180 case _project_types.ProjectType.HTML:
181 return (0, _HTML.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "HTML" app')).then(end);
182
183 case _project_types.ProjectType.WEB_COMPONENTS:
184 return (0, _WEBCOMPONENTS.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "web components" app')).then(end);
185
186 case _project_types.ProjectType.RIOT:
187 return (0, _RIOT.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "riot.js" app')).then(end);
188
189 case _project_types.ProjectType.PREACT:
190 return (0, _PREACT.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Preact" app')).then(end);
191
192 case _project_types.ProjectType.SVELTE:
193 return (0, _SVELTE.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Svelte" app')).then(end);
194
195 case _project_types.ProjectType.RAX:
196 return (0, _RAX.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Rax" app')).then(end);
197
198 case _project_types.ProjectType.AURELIA:
199 return (0, _AURELIA.default)(packageManager, npmOptions, generatorOptions).then((0, _helpers.commandLog)('Adding Storybook support to your "Aurelia" app')).then(end);
200
201 case _project_types.ProjectType.UNSUPPORTED:
202 (0, _helpers.paddedLog)(`We detected a project type that we don't support yet.`);
203 (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.
204
205 logger.log();
206 return Promise.resolve();
207
208 default:
209 (0, _helpers.paddedLog)(`We couldn't detect your project type. (code: ${projectType})`);
210 (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.
211
212 logger.log();
213 return projectTypeInquirer(options);
214 }
215 };
216
217 return runGenerator().catch(ex => {
218 logger.error(`\n ${_chalk.default.red(ex.stack)}`);
219 process.exit(1);
220 });
221};
222
223const projectTypeInquirer = async options => {
224 const manualAnswer = options.yes ? true : await (0, _prompts.default)([{
225 type: 'confirm',
226 name: 'manual',
227 message: 'Do you want to manually choose a Storybook project type to install?'
228 }]);
229
230 if (manualAnswer !== true && manualAnswer.manual) {
231 const frameworkAnswer = await (0, _prompts.default)([{
232 type: 'select',
233 name: 'manualFramework',
234 message: 'Please choose a project type from the following list:',
235 choices: _project_types.installableProjectTypes.map(type => ({
236 title: type,
237 value: type.toUpperCase()
238 }))
239 }]);
240 return installStorybook(frameworkAnswer.manualFramework, options);
241 }
242
243 return Promise.resolve();
244};
245
246function _default(options, pkg) {
247 const welcomeMessage = 'sb init - the simplest way to add a Storybook to your project.';
248 logger.log(_chalk.default.inverse(`\n ${welcomeMessage} \n`)); // Update notify code.
249
250 new _updateNotifier.UpdateNotifier({
251 pkg,
252 updateCheckInterval: 1000 * 60 * 60 // every hour (we could increase this later on.)
253
254 }).notify();
255 let projectType;
256 const projectTypeProvided = options.type;
257 const infoText = projectTypeProvided ? 'Installing Storybook for user specified project type' : 'Detecting project type';
258 const done = (0, _helpers.commandLog)(infoText);
259
260 try {
261 if (projectTypeProvided) {
262 if (_project_types.installableProjectTypes.includes(options.type)) {
263 const storybookInstalled = (0, _detect.isStorybookInstalled)((0, _jsPackageManager.readPackageJson)(), options.force);
264 projectType = storybookInstalled ? _project_types.ProjectType.ALREADY_HAS_STORYBOOK : options.type.toUpperCase();
265 } else {
266 done(`The provided project type was not recognized by Storybook.`);
267 logger.log(`\nThe project types currently supported by Storybook are:\n`);
268
269 _project_types.installableProjectTypes.sort().forEach(framework => (0, _helpers.paddedLog)(`- ${framework}`));
270
271 logger.log();
272 process.exit(1);
273 }
274 } else {
275 projectType = (0, _detect.detect)(options);
276 }
277 } catch (ex) {
278 done(ex.message);
279 process.exit(1);
280 }
281
282 done();
283 const cleanOptions = Object.assign({}, options);
284
285 if (options.storyFormat === _project_types.StoryFormat.MDX) {
286 logger.warn(' The MDX CLI template is deprecated. The JS and TS templates already include MDX examples!');
287 cleanOptions.storyFormat = undefined;
288 }
289
290 return installStorybook(projectType, cleanOptions);
291}
\No newline at end of file