UNPKG

6.25 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.detect = detect;
7exports.detectBuilder = detectBuilder;
8exports.detectFrameworkPreset = detectFrameworkPreset;
9exports.detectLanguage = detectLanguage;
10exports.isStorybookInstalled = isStorybookInstalled;
11
12var _path = _interopRequireDefault(require("path"));
13
14var _fs = _interopRequireDefault(require("fs"));
15
16var _findUp = _interopRequireDefault(require("find-up"));
17
18var _project_types = require("./project_types");
19
20var _helpers = require("./helpers");
21
22var _jsPackageManager = require("./js-package-manager");
23
24var _detectWebpack = require("./detect-webpack");
25
26var _detectNextjs = require("./detect-nextjs");
27
28function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
30const viteConfigFiles = ['vite.config.ts', 'vite.config.js', 'vite.config.mjs'];
31
32const hasDependency = (packageJson, name, matcher) => {
33 var _packageJson$dependen, _packageJson$devDepen;
34
35 const version = ((_packageJson$dependen = packageJson.dependencies) === null || _packageJson$dependen === void 0 ? void 0 : _packageJson$dependen[name]) || ((_packageJson$devDepen = packageJson.devDependencies) === null || _packageJson$devDepen === void 0 ? void 0 : _packageJson$devDepen[name]);
36
37 if (version && typeof matcher === 'function') {
38 return matcher(version);
39 }
40
41 return !!version;
42};
43
44const hasPeerDependency = (packageJson, name, matcher) => {
45 var _packageJson$peerDepe;
46
47 const version = (_packageJson$peerDepe = packageJson.peerDependencies) === null || _packageJson$peerDepe === void 0 ? void 0 : _packageJson$peerDepe[name];
48
49 if (version && typeof matcher === 'function') {
50 return matcher(version);
51 }
52
53 return !!version;
54};
55
56const getFrameworkPreset = (packageJson, framework) => {
57 const matcher = {
58 dependencies: [false],
59 peerDependencies: [false],
60 files: [false]
61 };
62 const {
63 preset,
64 files,
65 dependencies,
66 peerDependencies,
67 matcherFunction
68 } = framework;
69 let dependencySearches = [];
70
71 if (Array.isArray(dependencies)) {
72 dependencySearches = dependencies.map(name => [name, undefined]);
73 } else if (typeof dependencies === 'object') {
74 dependencySearches = Object.entries(dependencies);
75 } // Must check the length so the `[false]` isn't overwritten if `{ dependencies: [] }`
76
77
78 if (dependencySearches.length > 0) {
79 matcher.dependencies = dependencySearches.map(([name, matchFn]) => hasDependency(packageJson, name, matchFn));
80 }
81
82 let peerDependencySearches = [];
83
84 if (Array.isArray(peerDependencies)) {
85 peerDependencySearches = peerDependencies.map(name => [name, undefined]);
86 } else if (typeof peerDependencies === 'object') {
87 peerDependencySearches = Object.entries(peerDependencies);
88 } // Must check the length so the `[false]` isn't overwritten if `{ peerDependencies: [] }`
89
90
91 if (peerDependencySearches.length > 0) {
92 matcher.peerDependencies = peerDependencySearches.map(([name, matchFn]) => hasPeerDependency(packageJson, name, matchFn));
93 }
94
95 if (Array.isArray(files) && files.length > 0) {
96 matcher.files = files.map(name => _fs.default.existsSync(_path.default.join(process.cwd(), name)));
97 }
98
99 return matcherFunction(matcher) ? preset : null;
100};
101
102function detectFrameworkPreset(packageJson = {}) {
103 const result = [..._project_types.supportedTemplates, _project_types.unsupportedTemplate].find(framework => {
104 return getFrameworkPreset(packageJson, framework) !== null;
105 });
106 return result ? result.preset : _project_types.ProjectType.UNDETECTED;
107}
108/**
109 * Attempts to detect which builder to use, by searching for a vite config file. If one is found, the vite builder
110 * will be used, otherwise, webpack4 is the default.
111 *
112 * @returns CoreBuilder
113 */
114
115
116function detectBuilder(packageManager) {
117 const viteConfig = _findUp.default.sync(viteConfigFiles);
118
119 if (viteConfig) {
120 (0, _helpers.paddedLog)('Detected vite project, setting builder to @storybook/builder-vite');
121 return _project_types.CoreBuilder.Vite;
122 }
123
124 const nextJSVersion = (0, _detectNextjs.detectNextJS)(packageManager);
125
126 if (nextJSVersion) {
127 if (nextJSVersion >= 11) {
128 return _project_types.CoreBuilder.Webpack5;
129 }
130 }
131
132 const webpackVersion = (0, _detectWebpack.detectWebpack)(packageManager);
133
134 if (webpackVersion) {
135 if (webpackVersion <= 4) {
136 return _project_types.CoreBuilder.Webpack4;
137 }
138
139 if (webpackVersion >= 5) {
140 return _project_types.CoreBuilder.Webpack5;
141 }
142 } // Fallback to webpack4
143
144
145 return _project_types.CoreBuilder.Webpack4;
146}
147
148function isStorybookInstalled(dependencies, force) {
149 if (!dependencies) {
150 return false;
151 }
152
153 if (!force && dependencies.devDependencies) {
154 if (_project_types.SUPPORTED_FRAMEWORKS.reduce((storybookPresent, framework) => storybookPresent || !!dependencies.devDependencies[`@storybook/${framework}`], false)) {
155 return _project_types.ProjectType.ALREADY_HAS_STORYBOOK;
156 }
157
158 if (dependencies.devDependencies['@kadira/storybook'] || dependencies.devDependencies['@kadira/react-native-storybook']) {
159 return _project_types.ProjectType.UPDATE_PACKAGE_ORGANIZATIONS;
160 }
161 }
162
163 return false;
164}
165
166function detectLanguage() {
167 let language = _project_types.SupportedLanguage.JAVASCRIPT;
168 let packageJson;
169
170 try {
171 packageJson = (0, _jsPackageManager.readPackageJson)();
172 } catch (err) {//
173 }
174
175 const bowerJson = (0, _helpers.getBowerJson)();
176
177 if (!packageJson && !bowerJson) {
178 return language;
179 }
180
181 if (hasDependency(packageJson || bowerJson, 'typescript')) {
182 language = _project_types.SupportedLanguage.TYPESCRIPT;
183 }
184
185 return language;
186}
187
188function detect(options = {}) {
189 let packageJson;
190
191 try {
192 packageJson = (0, _jsPackageManager.readPackageJson)();
193 } catch (err) {//
194 }
195
196 const bowerJson = (0, _helpers.getBowerJson)();
197
198 if (!packageJson && !bowerJson) {
199 return _project_types.ProjectType.UNDETECTED;
200 }
201
202 const storyBookInstalled = isStorybookInstalled(packageJson, options.force);
203
204 if (storyBookInstalled) {
205 return storyBookInstalled;
206 }
207
208 if (options.html) {
209 return _project_types.ProjectType.HTML;
210 }
211
212 return detectFrameworkPreset(packageJson || bowerJson);
213}
\No newline at end of file