Software zum Installieren eines Smart-Mirror Frameworks , zum Nutzen von hochschulrelevanten Informationen, auf einem Raspberry-Pi.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

config-descriptors.js 6.6KB

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