6a4389da4fb4687fdff539b51251270b9061e82ac807924c586f85fddbd63dd2f3baffcabb696a86050e92b9143cd6f8d82d988d7a0753afdbac15e2d638bd 6.7 KB

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