UNPKG

6.86 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.createCachedDescriptors = createCachedDescriptors;
7exports.createDescriptor = createDescriptor;
8exports.createUncachedDescriptors = createUncachedDescriptors;
9function _gensync() {
10 const data = require("gensync");
11 _gensync = function () {
12 return data;
13 };
14 return data;
15}
16var _functional = require("../gensync-utils/functional.js");
17var _index = require("./files/index.js");
18var _item = require("./item.js");
19var _caching = require("./caching.js");
20var _resolveTargets = require("./resolve-targets.js");
21function isEqualDescriptor(a, b) {
22 var _a$file, _b$file, _a$file2, _b$file2;
23 return a.name === b.name && a.value === b.value && a.options === b.options && a.dirname === b.dirname && a.alias === b.alias && a.ownPass === b.ownPass && ((_a$file = a.file) == null ? void 0 : _a$file.request) === ((_b$file = b.file) == null ? void 0 : _b$file.request) && ((_a$file2 = a.file) == null ? void 0 : _a$file2.resolved) === ((_b$file2 = b.file) == null ? void 0 : _b$file2.resolved);
24}
25function* handlerOf(value) {
26 return value;
27}
28function optionsWithResolvedBrowserslistConfigFile(options, dirname) {
29 if (typeof options.browserslistConfigFile === "string") {
30 options.browserslistConfigFile = (0, _resolveTargets.resolveBrowserslistConfigFile)(options.browserslistConfigFile, dirname);
31 }
32 return options;
33}
34function createCachedDescriptors(dirname, options, alias) {
35 const {
36 plugins,
37 presets,
38 passPerPreset
39 } = options;
40 return {
41 options: optionsWithResolvedBrowserslistConfigFile(options, dirname),
42 plugins: plugins ? () => createCachedPluginDescriptors(plugins, dirname)(alias) : () => handlerOf([]),
43 presets: presets ? () => createCachedPresetDescriptors(presets, dirname)(alias)(!!passPerPreset) : () => handlerOf([])
44 };
45}
46function createUncachedDescriptors(dirname, options, alias) {
47 return {
48 options: optionsWithResolvedBrowserslistConfigFile(options, dirname),
49 plugins: (0, _functional.once)(() => createPluginDescriptors(options.plugins || [], dirname, alias)),
50 presets: (0, _functional.once)(() => createPresetDescriptors(options.presets || [], dirname, alias, !!options.passPerPreset))
51 };
52}
53const PRESET_DESCRIPTOR_CACHE = new WeakMap();
54const createCachedPresetDescriptors = (0, _caching.makeWeakCacheSync)((items, cache) => {
55 const dirname = cache.using(dir => dir);
56 return (0, _caching.makeStrongCacheSync)(alias => (0, _caching.makeStrongCache)(function* (passPerPreset) {
57 const descriptors = yield* createPresetDescriptors(items, dirname, alias, passPerPreset);
58 return descriptors.map(desc => loadCachedDescriptor(PRESET_DESCRIPTOR_CACHE, desc));
59 }));
60});
61const PLUGIN_DESCRIPTOR_CACHE = new WeakMap();
62const createCachedPluginDescriptors = (0, _caching.makeWeakCacheSync)((items, cache) => {
63 const dirname = cache.using(dir => dir);
64 return (0, _caching.makeStrongCache)(function* (alias) {
65 const descriptors = yield* createPluginDescriptors(items, dirname, alias);
66 return descriptors.map(desc => loadCachedDescriptor(PLUGIN_DESCRIPTOR_CACHE, desc));
67 });
68});
69const DEFAULT_OPTIONS = {};
70function loadCachedDescriptor(cache, desc) {
71 const {
72 value,
73 options = DEFAULT_OPTIONS
74 } = desc;
75 if (options === false) return desc;
76 let cacheByOptions = cache.get(value);
77 if (!cacheByOptions) {
78 cacheByOptions = new WeakMap();
79 cache.set(value, cacheByOptions);
80 }
81 let possibilities = cacheByOptions.get(options);
82 if (!possibilities) {
83 possibilities = [];
84 cacheByOptions.set(options, possibilities);
85 }
86 if (possibilities.indexOf(desc) === -1) {
87 const matches = possibilities.filter(possibility => isEqualDescriptor(possibility, desc));
88 if (matches.length > 0) {
89 return matches[0];
90 }
91 possibilities.push(desc);
92 }
93 return desc;
94}
95function* createPresetDescriptors(items, dirname, alias, passPerPreset) {
96 return yield* createDescriptors("preset", items, dirname, alias, passPerPreset);
97}
98function* createPluginDescriptors(items, dirname, alias) {
99 return yield* createDescriptors("plugin", items, dirname, alias);
100}
101function* createDescriptors(type, items, dirname, alias, ownPass) {
102 const descriptors = yield* _gensync().all(items.map((item, index) => createDescriptor(item, dirname, {
103 type,
104 alias: `${alias}$${index}`,
105 ownPass: !!ownPass
106 })));
107 assertNoDuplicates(descriptors);
108 return descriptors;
109}
110function* createDescriptor(pair, dirname, {
111 type,
112 alias,
113 ownPass
114}) {
115 const desc = (0, _item.getItemDescriptor)(pair);
116 if (desc) {
117 return desc;
118 }
119 let name;
120 let options;
121 let value = pair;
122 if (Array.isArray(value)) {
123 if (value.length === 3) {
124 [value, options, name] = value;
125 } else {
126 [value, options] = value;
127 }
128 }
129 let file = undefined;
130 let filepath = null;
131 if (typeof value === "string") {
132 if (typeof type !== "string") {
133 throw new Error("To resolve a string-based item, the type of item must be given");
134 }
135 const resolver = type === "plugin" ? _index.loadPlugin : _index.loadPreset;
136 const request = value;
137 ({
138 filepath,
139 value
140 } = yield* resolver(value, dirname));
141 file = {
142 request,
143 resolved: filepath
144 };
145 }
146 if (!value) {
147 throw new Error(`Unexpected falsy value: ${String(value)}`);
148 }
149 if (typeof value === "object" && value.__esModule) {
150 if (value.default) {
151 value = value.default;
152 } else {
153 throw new Error("Must export a default export when using ES6 modules.");
154 }
155 }
156 if (typeof value !== "object" && typeof value !== "function") {
157 throw new Error(`Unsupported format: ${typeof value}. Expected an object or a function.`);
158 }
159 if (filepath !== null && typeof value === "object" && value) {
160 throw new Error(`Plugin/Preset files are not allowed to export objects, only functions. In ${filepath}`);
161 }
162 return {
163 name,
164 alias: filepath || alias,
165 value,
166 options,
167 dirname,
168 ownPass,
169 file
170 };
171}
172function assertNoDuplicates(items) {
173 const map = new Map();
174 for (const item of items) {
175 if (typeof item.value !== "function") continue;
176 let nameMap = map.get(item.value);
177 if (!nameMap) {
178 nameMap = new Set();
179 map.set(item.value, nameMap);
180 }
181 if (nameMap.has(item.name)) {
182 const conflicts = items.filter(i => i.value === item.value);
183 throw new Error([`Duplicate plugin/preset detected.`, `If you'd like to use two separate instances of a plugin,`, `they need separate names, e.g.`, ``, ` plugins: [`, ` ['some-plugin', {}],`, ` ['some-plugin', {}, 'some unique name'],`, ` ]`, ``, `Duplicates detected are:`, `${JSON.stringify(conflicts, null, 2)}`].join("\n"));
184 }
185 nameMap.add(item.name);
186 }
187}
1880 && 0;
189
190//# sourceMappingURL=config-descriptors.js.map