UNPKG

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