"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * Loader flattening inspired by: * https://github.com/preactjs/preact-cli-experiment/tree/7b80623/packages/cli-plugin-legacy-config */ const util_1 = require("util"); function findLoader(loaderName, rules) { for (const rule of rules) { if (rule.use && rule.use.loader && (rule.use.loader.includes(`/${loaderName}`) || rule.use.loader.includes(`\\${loaderName}`))) { return rule; } } return null; } exports.findLoader = findLoader; function getRulesAsItems(rules) { return rules.map((rule, index) => ({ index, rule, })); } exports.getRulesAsItems = getRulesAsItems; function getRules(config) { const { preLoaders = [], postLoaders = [], rules = [] } = config.module || {}; return getRulesAsItems(getRulesFromRules([...preLoaders, ...postLoaders, ...rules])); } exports.getRules = getRules; function getRulesFromRules(rules) { let output = []; for (const rule of rules) { if (rule.oneOf) { output.push(...getRulesFromRules(rule.oneOf)); } else { output.push(rule); } } return output; } exports.getRulesFromRules = getRulesFromRules; function getLoadersFromRules(rules) { const loaders = rules.map(({ rule, index: ruleIndex }) => { if (rule.oneOf) { return getLoadersFromRules(getRulesAsItems(rule.oneOf)); } return loaderToLoaderItemLoaderPart(rule.loaders || rule.loader || rule.use).map(loader => (Object.assign({}, loader, { rule, ruleIndex }))); }); return loaders.reduce((arr, a) => arr.concat(a), []); } exports.getLoadersFromRules = getLoadersFromRules; function getLoaders(config) { const rules = getRules(config); return getLoadersFromRules(rules); } exports.getLoaders = getLoaders; function loaderToLoaderItemLoaderPart(loader) { if (!loader) return []; const loaders = []; if (typeof loader === 'function') { loaders.push(...loaderToLoaderItemLoaderPart(loader({}))); } else if (isRuleSetItem(loader)) { loaders.push({ loader, loaderIndex: -1 }); } else if (Array.isArray(loader)) { loaders.push(...loader.map((loader, loaderIndex) => ({ loader, loaderIndex }))); } return loaders; } function getRulesByMatchingFiles(config, files) { const rules = getRules(config); let selectedRules = {}; for (const file of files) { selectedRules[file] = rules.filter(({ rule }) => conditionMatchesFile(rule.test, file)); } return selectedRules; } exports.getRulesByMatchingFiles = getRulesByMatchingFiles; function rulesMatchAnyFiles(config, files) { const rules = getRulesByMatchingFiles(config, files); return Object.keys(rules).some(filename => !!rules[filename].length); } exports.rulesMatchAnyFiles = rulesMatchAnyFiles; function resolveRuleSetUse(rule) { if (!rule) return []; if (Array.isArray(rule)) { const rules = rule; let resolved = []; for (const rule of rules) { resolved = [...resolved, ...resolveRuleSetUse(rule)]; } return resolved; } else if (typeof rule === 'string' || isRuleSetLoader(rule)) { return [rule]; } else if (typeof rule === 'function') { return resolveRuleSetUse(rule({})); } return [rule]; } exports.resolveRuleSetUse = resolveRuleSetUse; function conditionMatchesFile(condition, file) { if (!condition) return false; if (util_1.isRegExp(condition)) { return condition.test(file); } else if (typeof condition === 'string') { return file.startsWith(condition); } else if (typeof condition === 'function') { return Boolean(condition(file)); } else if (Array.isArray(condition)) { return condition.some(c => conditionMatchesFile(c, file)); } return Object.entries(condition) .map(([key, value]) => { switch (key) { case 'test': return conditionMatchesFile(value, file); case 'include': return conditionMatchesFile(value, file); case 'exclude': return !conditionMatchesFile(value, file); case 'and': return value.every(c => conditionMatchesFile(c, file)); case 'or': return value.some(c => conditionMatchesFile(c, file)); case 'not': return value.every(c => !conditionMatchesFile(c, file)); default: return true; } }) .every(b => b); } exports.conditionMatchesFile = conditionMatchesFile; function getPlugins({ plugins = [] }) { return plugins.map((plugin, index) => ({ index, plugin })); } exports.getPlugins = getPlugins; function getPluginsByName(config, name) { return getPlugins(config).filter(({ plugin }) => { if (plugin && plugin.constructor) { return plugin.constructor.name === name; } return false; }); } exports.getPluginsByName = getPluginsByName; function isRuleSetItem(loader) { return typeof loader === 'string' || typeof loader === 'function' || isRuleSetLoader(loader); } exports.isRuleSetItem = isRuleSetItem; function isRuleSetLoader(loader) { return Object.keys(loader).some(k => ['loader', 'options', 'indent', 'query'].includes(k)); } exports.isRuleSetLoader = isRuleSetLoader; //# sourceMappingURL=loaders.js.map