1 | "use strict";
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.createCachedDescriptors = createCachedDescriptors;
|
7 | exports.createDescriptor = createDescriptor;
|
8 | exports.createUncachedDescriptors = createUncachedDescriptors;
|
9 | function _gensync() {
|
10 | const data = require("gensync");
|
11 | _gensync = function () {
|
12 | return data;
|
13 | };
|
14 | return data;
|
15 | }
|
16 | var _functional = require("../gensync-utils/functional.js");
|
17 | var _index = require("./files/index.js");
|
18 | var _item = require("./item.js");
|
19 | var _caching = require("./caching.js");
|
20 | var _resolveTargets = require("./resolve-targets.js");
|
21 | function 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 | }
|
25 | function* handlerOf(value) {
|
26 | return value;
|
27 | }
|
28 | function optionsWithResolvedBrowserslistConfigFile(options, dirname) {
|
29 | if (typeof options.browserslistConfigFile === "string") {
|
30 | options.browserslistConfigFile = (0, _resolveTargets.resolveBrowserslistConfigFile)(options.browserslistConfigFile, dirname);
|
31 | }
|
32 | return options;
|
33 | }
|
34 | function 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 | }
|
46 | function 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 | }
|
53 | const PRESET_DESCRIPTOR_CACHE = new WeakMap();
|
54 | const 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 | });
|
61 | const PLUGIN_DESCRIPTOR_CACHE = new WeakMap();
|
62 | const 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 | });
|
69 | const DEFAULT_OPTIONS = {};
|
70 | function 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 | }
|
95 | function* createPresetDescriptors(items, dirname, alias, passPerPreset) {
|
96 | return yield* createDescriptors("preset", items, dirname, alias, passPerPreset);
|
97 | }
|
98 | function* createPluginDescriptors(items, dirname, alias) {
|
99 | return yield* createDescriptors("plugin", items, dirname, alias);
|
100 | }
|
101 | function* 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 | }
|
110 | function* 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 | }
|
172 | function 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 | }
|
188 | 0 && 0;
|
189 |
|
190 |
|