UNPKG

7.05 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.getBowerJson = getBowerJson;
7exports.readFileAsJson = readFileAsJson;
8exports.paddedLog = paddedLog;
9exports.getChars = getChars;
10exports.codeLog = codeLog;
11exports.getBabelDependencies = getBabelDependencies;
12exports.addToDevDependenciesIfNotPresent = addToDevDependenciesIfNotPresent;
13exports.copyTemplate = copyTemplate;
14exports.copyComponents = copyComponents;
15exports.commandLog = exports.writeFileAsJson = void 0;
16
17require("core-js/modules/es.promise.js");
18
19var _path = _interopRequireDefault(require("path"));
20
21var _fs = _interopRequireDefault(require("fs"));
22
23var _fsExtra = _interopRequireDefault(require("fs-extra"));
24
25var _chalk = _interopRequireDefault(require("chalk"));
26
27var _semver = require("@storybook/semver");
28
29var _stripJsonComments = _interopRequireDefault(require("strip-json-comments"));
30
31function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
32
33/* eslint-disable no-param-reassign */
34const logger = console;
35
36function getBowerJson() {
37 const bowerJsonPath = _path.default.resolve('bower.json');
38
39 if (!_fs.default.existsSync(bowerJsonPath)) {
40 return false;
41 }
42
43 const jsonContent = _fs.default.readFileSync(bowerJsonPath, 'utf8');
44
45 return JSON.parse(jsonContent);
46}
47
48function readFileAsJson(jsonPath, allowComments) {
49 const filePath = _path.default.resolve(jsonPath);
50
51 if (!_fs.default.existsSync(filePath)) {
52 return false;
53 }
54
55 const fileContent = _fs.default.readFileSync(filePath, 'utf8');
56
57 const jsonContent = allowComments ? (0, _stripJsonComments.default)(fileContent) : fileContent;
58
59 try {
60 return JSON.parse(jsonContent);
61 } catch (e) {
62 logger.error(_chalk.default.red(`Invalid json in file: ${filePath}`));
63 throw e;
64 }
65}
66
67const writeFileAsJson = (jsonPath, content) => {
68 const filePath = _path.default.resolve(jsonPath);
69
70 if (!_fs.default.existsSync(filePath)) {
71 return false;
72 }
73
74 _fs.default.writeFileSync(filePath, `${JSON.stringify(content, null, 2)}\n`);
75
76 return true;
77};
78
79exports.writeFileAsJson = writeFileAsJson;
80
81const commandLog = message => {
82 process.stdout.write(_chalk.default.cyan(' • ') + message); // Need `void` to be able to use this function in a then of a Promise<void>
83
84 return (errorMessage, errorInfo) => {
85 if (errorMessage) {
86 process.stdout.write(`. ${_chalk.default.red('✖')}\n`);
87 logger.error(`\n ${_chalk.default.red(errorMessage)}`);
88
89 if (!errorInfo) {
90 return;
91 }
92
93 const newErrorInfo = errorInfo.split('\n').map(line => ` ${_chalk.default.dim(line)}`).join('\n');
94 logger.error(`${newErrorInfo}\n`);
95 return;
96 }
97
98 process.stdout.write(`. ${_chalk.default.green('✓')}\n`);
99 };
100};
101
102exports.commandLog = commandLog;
103
104function paddedLog(message) {
105 const newMessage = message.split('\n').map(line => ` ${line}`).join('\n');
106 logger.log(newMessage);
107}
108
109function getChars(char, amount) {
110 let line = '';
111
112 for (let lc = 0; lc < amount; lc += 1) {
113 line += char;
114 }
115
116 return line;
117}
118
119function codeLog(codeLines, leftPadAmount) {
120 let maxLength = 0;
121 const newLines = codeLines.map(line => {
122 maxLength = line.length > maxLength ? line.length : maxLength;
123 return line;
124 });
125 const finalResult = newLines.map(line => {
126 const rightPadAmount = maxLength - line.length;
127 let newLine = line + getChars(' ', rightPadAmount);
128 newLine = getChars(' ', leftPadAmount || 2) + _chalk.default.inverse(` ${newLine} `);
129 return newLine;
130 }).join('\n');
131 logger.log(finalResult);
132}
133/**
134 * Detect if any babel dependencies need to be added to the project
135 * @param {Object} packageJson The current package.json so we can inspect its contents
136 * @returns {Array} Contains the packages and versions that need to be installed
137 * @example
138 * const babelDependencies = await getBabelDependencies(packageManager, npmOptions, packageJson);
139 * // you can then spread the result when using installDependencies
140 * installDependencies(npmOptions, [
141 * `@storybook/react@${storybookVersion}`,
142 * ...babelDependencies,
143 * ]);
144 */
145
146
147async function getBabelDependencies(packageManager, packageJson) {
148 const dependenciesToAdd = [];
149 let babelLoaderVersion = '^8.0.0-0';
150 const babelCoreVersion = packageJson.dependencies['babel-core'] || packageJson.devDependencies['babel-core'];
151
152 if (!babelCoreVersion) {
153 if (!packageJson.dependencies['@babel/core'] && !packageJson.devDependencies['@babel/core']) {
154 const babelCoreInstallVersion = await packageManager.getVersion('@babel/core');
155 dependenciesToAdd.push(`@babel/core@${babelCoreInstallVersion}`);
156 }
157 } else {
158 const latestCompatibleBabelVersion = await packageManager.latestVersion('babel-core', babelCoreVersion); // Babel 6
159
160 if ((0, _semver.satisfies)(latestCompatibleBabelVersion, '^6.0.0')) {
161 babelLoaderVersion = '^7.0.0';
162 }
163 }
164
165 if (!packageJson.dependencies['babel-loader'] && !packageJson.devDependencies['babel-loader']) {
166 const babelLoaderInstallVersion = await packageManager.getVersion('babel-loader', babelLoaderVersion);
167 dependenciesToAdd.push(`babel-loader@${babelLoaderInstallVersion}`);
168 }
169
170 return dependenciesToAdd;
171}
172
173function addToDevDependenciesIfNotPresent(packageJson, name, packageVersion) {
174 if (!packageJson.dependencies[name] && !packageJson.devDependencies[name]) {
175 packageJson.devDependencies[name] = packageVersion;
176 }
177}
178
179function copyTemplate(templateRoot) {
180 const templateDir = _path.default.resolve(templateRoot, `template-csf/`);
181
182 if (!_fs.default.existsSync(templateDir)) {
183 throw new Error(`Couldn't find template dir`);
184 }
185
186 _fsExtra.default.copySync(templateDir, '.', {
187 overwrite: true
188 });
189}
190
191function copyComponents(framework, language) {
192 const languageFolderMapping = {
193 javascript: 'js',
194 typescript: 'ts'
195 };
196
197 const componentsPath = () => {
198 const frameworkPath = `frameworks/${framework}`;
199
200 const languageSpecific = _path.default.resolve(__dirname, `${frameworkPath}/${languageFolderMapping[language]}`);
201
202 if (_fsExtra.default.existsSync(languageSpecific)) {
203 return languageSpecific;
204 }
205
206 const jsFallback = _path.default.resolve(__dirname, `${frameworkPath}/${languageFolderMapping.javascript}`);
207
208 if (_fsExtra.default.existsSync(jsFallback)) {
209 return jsFallback;
210 }
211
212 const frameworkRootPath = _path.default.resolve(__dirname, frameworkPath);
213
214 if (_fsExtra.default.existsSync(frameworkRootPath)) {
215 return frameworkRootPath;
216 }
217
218 throw new Error(`Unsupported framework: ${framework}`);
219 };
220
221 const targetPath = () => {
222 if (_fsExtra.default.existsSync('./src')) {
223 return './src/stories';
224 }
225
226 return './stories';
227 };
228
229 const destinationPath = targetPath();
230
231 _fsExtra.default.copySync(componentsPath(), destinationPath, {
232 overwrite: true
233 });
234
235 _fsExtra.default.copySync(_path.default.resolve(__dirname, 'frameworks/common'), destinationPath, {
236 overwrite: true
237 });
238}
\No newline at end of file