UNPKG

8.01 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3/**
4 * Loader flattening inspired by:
5 * https://github.com/preactjs/preact-cli-experiment/tree/7b80623/packages/cli-plugin-legacy-config
6 */
7const util_1 = require("util");
8/**
9 *
10 * @param loaderName
11 * @param rules
12 * @category utils
13 */
14function findLoader(loaderName, rules) {
15 for (const rule of rules) {
16 if (rule.use &&
17 rule.use.loader &&
18 (rule.use.loader.includes(`/${loaderName}`) ||
19 rule.use.loader.includes(`\\${loaderName}`))) {
20 return rule;
21 }
22 }
23 return null;
24}
25exports.findLoader = findLoader;
26/**
27 *
28 * @param rules
29 * @category utils
30 */
31function getRulesAsItems(rules) {
32 return rules.map((rule, index) => ({
33 index,
34 rule,
35 }));
36}
37exports.getRulesAsItems = getRulesAsItems;
38/**
39 *
40 * @param config
41 * @category utils
42 */
43function getRules(config) {
44 const { rules = [] } = config.module || {};
45 return getRulesAsItems(getRulesFromRules(rules));
46}
47exports.getRules = getRules;
48/**
49 * Get the babel-loader rule created by `@expo/webpack-config/loaders`
50 *
51 * @param config
52 * @category utils
53 */
54function getExpoBabelLoader(config) {
55 var _a, _b;
56 const { rules = [] } = config.module || {};
57 const currentRules = getRulesAsItems(getRulesFromRules(rules));
58 for (const ruleItem of currentRules) {
59 const rule = ruleItem.rule;
60 if (rule.use &&
61 typeof rule.use === 'object' &&
62 ((_b = (_a = rule.use.options) === null || _a === void 0 ? void 0 : _a.caller) === null || _b === void 0 ? void 0 : _b.__dangerous_rule_id) === 'expo-babel-loader') {
63 return rule;
64 }
65 }
66 return null;
67}
68exports.getExpoBabelLoader = getExpoBabelLoader;
69/**
70 *
71 * @param rules
72 * @category utils
73 */
74function getRulesFromRules(rules) {
75 let output = [];
76 for (const rule of rules) {
77 if (rule.oneOf) {
78 output.push(...getRulesFromRules(rule.oneOf));
79 }
80 else {
81 output.push(rule);
82 }
83 }
84 return output;
85}
86exports.getRulesFromRules = getRulesFromRules;
87/**
88 *
89 * @param rules
90 * @category utils
91 */
92function getLoadersFromRules(rules) {
93 const loaders = rules.map(({ rule, index: ruleIndex }) => {
94 if (rule.oneOf) {
95 return getLoadersFromRules(getRulesAsItems(rule.oneOf));
96 }
97 return loaderToLoaderItemLoaderPart(rule.loaders || rule.loader || rule.use).map(loader => (Object.assign(Object.assign({}, loader), { rule,
98 ruleIndex })));
99 });
100 return loaders.reduce((arr, a) => arr.concat(a), []);
101}
102exports.getLoadersFromRules = getLoadersFromRules;
103/**
104 *
105 * @param config
106 * @category utils
107 */
108function getLoaders(config) {
109 const rules = getRules(config);
110 return getLoadersFromRules(rules);
111}
112exports.getLoaders = getLoaders;
113function loaderToLoaderItemLoaderPart(loader) {
114 if (!loader)
115 return [];
116 const loaders = [];
117 if (typeof loader === 'function') {
118 loaders.push(...loaderToLoaderItemLoaderPart(loader({})));
119 }
120 else if (isRuleSetItem(loader)) {
121 loaders.push({ loader, loaderIndex: -1 });
122 }
123 else if (Array.isArray(loader)) {
124 loaders.push(...loader.map((loader, loaderIndex) => ({ loader, loaderIndex })));
125 }
126 return loaders;
127}
128/**
129 *
130 * @param config
131 * @param files
132 * @category utils
133 */
134function getRulesByMatchingFiles(config, files) {
135 const rules = getRules(config);
136 let selectedRules = {};
137 for (const file of files) {
138 selectedRules[file] = rules.filter(({ rule }) => conditionMatchesFile(rule.test, file));
139 }
140 return selectedRules;
141}
142exports.getRulesByMatchingFiles = getRulesByMatchingFiles;
143/**
144 *
145 * @param config
146 * @param files
147 * @category utils
148 */
149function rulesMatchAnyFiles(config, files) {
150 const rules = getRulesByMatchingFiles(config, files);
151 return Object.keys(rules).some(filename => !!rules[filename].length);
152}
153exports.rulesMatchAnyFiles = rulesMatchAnyFiles;
154/**
155 *
156 * @param rule
157 * @category utils
158 */
159function resolveRuleSetUse(rule) {
160 if (!rule)
161 return [];
162 if (Array.isArray(rule)) {
163 const rules = rule;
164 let resolved = [];
165 for (const rule of rules) {
166 resolved = [...resolved, ...resolveRuleSetUse(rule)];
167 }
168 return resolved;
169 }
170 else if (typeof rule === 'string' || isRuleSetLoader(rule)) {
171 return [rule];
172 }
173 else if (typeof rule === 'function') {
174 return resolveRuleSetUse(rule({}));
175 }
176 return [rule];
177}
178exports.resolveRuleSetUse = resolveRuleSetUse;
179/**
180 *
181 * @param condition
182 * @param file
183 * @category utils
184 */
185function conditionMatchesFile(condition, file) {
186 if (!condition)
187 return false;
188 if (util_1.isRegExp(condition)) {
189 return condition.test(file);
190 }
191 else if (typeof condition === 'string') {
192 return file.startsWith(condition);
193 }
194 else if (typeof condition === 'function') {
195 return Boolean(condition(file));
196 }
197 else if (Array.isArray(condition)) {
198 return condition.some(c => conditionMatchesFile(c, file));
199 }
200 return Object.entries(condition)
201 .map(([key, value]) => {
202 switch (key) {
203 case 'test':
204 return conditionMatchesFile(value, file);
205 case 'include':
206 return conditionMatchesFile(value, file);
207 case 'exclude':
208 return !conditionMatchesFile(value, file);
209 case 'and':
210 return value.every(c => conditionMatchesFile(c, file));
211 case 'or':
212 return value.some(c => conditionMatchesFile(c, file));
213 case 'not':
214 return value.every(c => !conditionMatchesFile(c, file));
215 default:
216 return true;
217 }
218 })
219 .every(b => b);
220}
221exports.conditionMatchesFile = conditionMatchesFile;
222/**
223 *
224 * @param param0
225 * @category utils
226 */
227function getPlugins({ plugins = [] }) {
228 return plugins.map((plugin, index) => ({ index, plugin }));
229}
230exports.getPlugins = getPlugins;
231/**
232 *
233 * @param config
234 * @param name
235 * @category utils
236 */
237function getPluginsByName(config, name) {
238 return getPlugins(config).filter(({ plugin }) => {
239 if (plugin && plugin.constructor) {
240 return plugin.constructor.name === name;
241 }
242 return false;
243 });
244}
245exports.getPluginsByName = getPluginsByName;
246/**
247 *
248 * @param loader
249 * @category utils
250 */
251function isRuleSetItem(loader) {
252 return typeof loader === 'string' || typeof loader === 'function' || isRuleSetLoader(loader);
253}
254exports.isRuleSetItem = isRuleSetItem;
255/**
256 *
257 * @param loader
258 * @category utils
259 */
260function isRuleSetLoader(loader) {
261 return Object.keys(loader).some(k => ['loader', 'options', 'indent', 'query'].includes(k));
262}
263exports.isRuleSetLoader = isRuleSetLoader;
264/**
265 *
266 * @param arg
267 * @category utils
268 */
269function isEntry(arg) {
270 if (typeof arg !== 'object' || arg === null) {
271 return false;
272 }
273 return Object.values(arg).every(value => {
274 if (Array.isArray(value)) {
275 return value.every(value => typeof value === 'string');
276 }
277 return typeof value === 'string';
278 });
279}
280exports.isEntry = isEntry;
281/**
282 *
283 * @param arg
284 * @category utils
285 */
286async function resolveEntryAsync(arg) {
287 if (typeof arg === 'undefined') {
288 throw new Error('Webpack config entry cannot be undefined');
289 }
290 if (typeof arg === 'function') {
291 return resolveEntryAsync(await arg());
292 }
293 else if (typeof arg === 'string') {
294 return resolveEntryAsync([arg]);
295 }
296 else if (Array.isArray(arg)) {
297 return {
298 app: arg,
299 };
300 }
301 else if (isEntry(arg)) {
302 return arg;
303 }
304 throw new Error('Cannot resolve Webpack config entry prop: ' + arg);
305}
306exports.resolveEntryAsync = resolveEntryAsync;
307//# sourceMappingURL=search.js.map
\No newline at end of file