1 | import postcss from 'postcss';
|
---|
2 | import fs from 'fs';
|
---|
3 | import path from 'path';
|
---|
4 |
|
---|
5 | function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
---|
6 | try {
|
---|
7 | var info = gen[key](arg);
|
---|
8 | var value = info.value;
|
---|
9 | } catch (error) {
|
---|
10 | reject(error);
|
---|
11 | return;
|
---|
12 | }
|
---|
13 |
|
---|
14 | if (info.done) {
|
---|
15 | resolve(value);
|
---|
16 | } else {
|
---|
17 | Promise.resolve(value).then(_next, _throw);
|
---|
18 | }
|
---|
19 | }
|
---|
20 |
|
---|
21 | function _asyncToGenerator(fn) {
|
---|
22 | return function () {
|
---|
23 | var self = this,
|
---|
24 | args = arguments;
|
---|
25 | return new Promise(function (resolve, reject) {
|
---|
26 | var gen = fn.apply(self, args);
|
---|
27 |
|
---|
28 | function _next(value) {
|
---|
29 | asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
---|
30 | }
|
---|
31 |
|
---|
32 | function _throw(err) {
|
---|
33 | asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
---|
34 | }
|
---|
35 |
|
---|
36 | _next(undefined);
|
---|
37 | });
|
---|
38 | };
|
---|
39 | }
|
---|
40 |
|
---|
41 | function _defineProperty(obj, key, value) {
|
---|
42 | if (key in obj) {
|
---|
43 | Object.defineProperty(obj, key, {
|
---|
44 | value: value,
|
---|
45 | enumerable: true,
|
---|
46 | configurable: true,
|
---|
47 | writable: true
|
---|
48 | });
|
---|
49 | } else {
|
---|
50 | obj[key] = value;
|
---|
51 | }
|
---|
52 |
|
---|
53 | return obj;
|
---|
54 | }
|
---|
55 |
|
---|
56 | function _objectSpread(target) {
|
---|
57 | for (var i = 1; i < arguments.length; i++) {
|
---|
58 | var source = arguments[i] != null ? arguments[i] : {};
|
---|
59 | var ownKeys = Object.keys(source);
|
---|
60 |
|
---|
61 | if (typeof Object.getOwnPropertySymbols === 'function') {
|
---|
62 | ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
|
---|
63 | return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
---|
64 | }));
|
---|
65 | }
|
---|
66 |
|
---|
67 | ownKeys.forEach(function (key) {
|
---|
68 | _defineProperty(target, key, source[key]);
|
---|
69 | });
|
---|
70 | }
|
---|
71 |
|
---|
72 | return target;
|
---|
73 | }
|
---|
74 |
|
---|
75 | function _slicedToArray(arr, i) {
|
---|
76 | return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();
|
---|
77 | }
|
---|
78 |
|
---|
79 | function _arrayWithHoles(arr) {
|
---|
80 | if (Array.isArray(arr)) return arr;
|
---|
81 | }
|
---|
82 |
|
---|
83 | function _iterableToArrayLimit(arr, i) {
|
---|
84 | var _arr = [];
|
---|
85 | var _n = true;
|
---|
86 | var _d = false;
|
---|
87 | var _e = undefined;
|
---|
88 |
|
---|
89 | try {
|
---|
90 | for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
|
---|
91 | _arr.push(_s.value);
|
---|
92 |
|
---|
93 | if (i && _arr.length === i) break;
|
---|
94 | }
|
---|
95 | } catch (err) {
|
---|
96 | _d = true;
|
---|
97 | _e = err;
|
---|
98 | } finally {
|
---|
99 | try {
|
---|
100 | if (!_n && _i["return"] != null) _i["return"]();
|
---|
101 | } finally {
|
---|
102 | if (_d) throw _e;
|
---|
103 | }
|
---|
104 | }
|
---|
105 |
|
---|
106 | return _arr;
|
---|
107 | }
|
---|
108 |
|
---|
109 | function _nonIterableRest() {
|
---|
110 | throw new TypeError("Invalid attempt to destructure non-iterable instance");
|
---|
111 | }
|
---|
112 |
|
---|
113 | function parse(string, splitByAnd) {
|
---|
114 | const array = [];
|
---|
115 | let buffer = '';
|
---|
116 | let split = false;
|
---|
117 | let func = 0;
|
---|
118 | let i = -1;
|
---|
119 |
|
---|
120 | while (++i < string.length) {
|
---|
121 | const char = string[i];
|
---|
122 |
|
---|
123 | if (char === '(') {
|
---|
124 | func += 1;
|
---|
125 | } else if (char === ')') {
|
---|
126 | if (func > 0) {
|
---|
127 | func -= 1;
|
---|
128 | }
|
---|
129 | } else if (func === 0) {
|
---|
130 | if (splitByAnd && andRegExp.test(buffer + char)) {
|
---|
131 | split = true;
|
---|
132 | } else if (!splitByAnd && char === ',') {
|
---|
133 | split = true;
|
---|
134 | }
|
---|
135 | }
|
---|
136 |
|
---|
137 | if (split) {
|
---|
138 | array.push(splitByAnd ? new MediaExpression(buffer + char) : new MediaQuery(buffer));
|
---|
139 | buffer = '';
|
---|
140 | split = false;
|
---|
141 | } else {
|
---|
142 | buffer += char;
|
---|
143 | }
|
---|
144 | }
|
---|
145 |
|
---|
146 | if (buffer !== '') {
|
---|
147 | array.push(splitByAnd ? new MediaExpression(buffer) : new MediaQuery(buffer));
|
---|
148 | }
|
---|
149 |
|
---|
150 | return array;
|
---|
151 | }
|
---|
152 |
|
---|
153 | class MediaQueryList {
|
---|
154 | constructor(string) {
|
---|
155 | this.nodes = parse(string);
|
---|
156 | }
|
---|
157 |
|
---|
158 | invert() {
|
---|
159 | this.nodes.forEach(node => {
|
---|
160 | node.invert();
|
---|
161 | });
|
---|
162 | return this;
|
---|
163 | }
|
---|
164 |
|
---|
165 | clone() {
|
---|
166 | return new MediaQueryList(String(this));
|
---|
167 | }
|
---|
168 |
|
---|
169 | toString() {
|
---|
170 | return this.nodes.join(',');
|
---|
171 | }
|
---|
172 |
|
---|
173 | }
|
---|
174 |
|
---|
175 | class MediaQuery {
|
---|
176 | constructor(string) {
|
---|
177 | const _string$match = string.match(spaceWrapRegExp),
|
---|
178 | _string$match2 = _slicedToArray(_string$match, 4),
|
---|
179 | before = _string$match2[1],
|
---|
180 | media = _string$match2[2],
|
---|
181 | after = _string$match2[3];
|
---|
182 |
|
---|
183 | const _ref = media.match(mediaRegExp) || [],
|
---|
184 | _ref2 = _slicedToArray(_ref, 9),
|
---|
185 | _ref2$ = _ref2[1],
|
---|
186 | modifier = _ref2$ === void 0 ? '' : _ref2$,
|
---|
187 | _ref2$2 = _ref2[2],
|
---|
188 | afterModifier = _ref2$2 === void 0 ? ' ' : _ref2$2,
|
---|
189 | _ref2$3 = _ref2[3],
|
---|
190 | type = _ref2$3 === void 0 ? '' : _ref2$3,
|
---|
191 | _ref2$4 = _ref2[4],
|
---|
192 | beforeAnd = _ref2$4 === void 0 ? '' : _ref2$4,
|
---|
193 | _ref2$5 = _ref2[5],
|
---|
194 | and = _ref2$5 === void 0 ? '' : _ref2$5,
|
---|
195 | _ref2$6 = _ref2[6],
|
---|
196 | beforeExpression = _ref2$6 === void 0 ? '' : _ref2$6,
|
---|
197 | _ref2$7 = _ref2[7],
|
---|
198 | expression1 = _ref2$7 === void 0 ? '' : _ref2$7,
|
---|
199 | _ref2$8 = _ref2[8],
|
---|
200 | expression2 = _ref2$8 === void 0 ? '' : _ref2$8;
|
---|
201 |
|
---|
202 | const raws = {
|
---|
203 | before,
|
---|
204 | after,
|
---|
205 | afterModifier,
|
---|
206 | originalModifier: modifier || '',
|
---|
207 | beforeAnd,
|
---|
208 | and,
|
---|
209 | beforeExpression
|
---|
210 | };
|
---|
211 | const nodes = parse(expression1 || expression2, true);
|
---|
212 | Object.assign(this, {
|
---|
213 | modifier,
|
---|
214 | type,
|
---|
215 | raws,
|
---|
216 | nodes
|
---|
217 | });
|
---|
218 | }
|
---|
219 |
|
---|
220 | clone(overrides) {
|
---|
221 | const instance = new MediaQuery(String(this));
|
---|
222 | Object.assign(instance, overrides);
|
---|
223 | return instance;
|
---|
224 | }
|
---|
225 |
|
---|
226 | invert() {
|
---|
227 | this.modifier = this.modifier ? '' : this.raws.originalModifier;
|
---|
228 | return this;
|
---|
229 | }
|
---|
230 |
|
---|
231 | toString() {
|
---|
232 | const raws = this.raws;
|
---|
233 | return `${raws.before}${this.modifier}${this.modifier ? `${raws.afterModifier}` : ''}${this.type}${raws.beforeAnd}${raws.and}${raws.beforeExpression}${this.nodes.join('')}${this.raws.after}`;
|
---|
234 | }
|
---|
235 |
|
---|
236 | }
|
---|
237 |
|
---|
238 | class MediaExpression {
|
---|
239 | constructor(string) {
|
---|
240 | const _ref3 = string.match(andRegExp) || [null, string],
|
---|
241 | _ref4 = _slicedToArray(_ref3, 5),
|
---|
242 | value = _ref4[1],
|
---|
243 | _ref4$ = _ref4[2],
|
---|
244 | after = _ref4$ === void 0 ? '' : _ref4$,
|
---|
245 | _ref4$2 = _ref4[3],
|
---|
246 | and = _ref4$2 === void 0 ? '' : _ref4$2,
|
---|
247 | _ref4$3 = _ref4[4],
|
---|
248 | afterAnd = _ref4$3 === void 0 ? '' : _ref4$3;
|
---|
249 |
|
---|
250 | const raws = {
|
---|
251 | after,
|
---|
252 | and,
|
---|
253 | afterAnd
|
---|
254 | };
|
---|
255 | Object.assign(this, {
|
---|
256 | value,
|
---|
257 | raws
|
---|
258 | });
|
---|
259 | }
|
---|
260 |
|
---|
261 | clone(overrides) {
|
---|
262 | const instance = new MediaExpression(String(this));
|
---|
263 | Object.assign(instance, overrides);
|
---|
264 | return instance;
|
---|
265 | }
|
---|
266 |
|
---|
267 | toString() {
|
---|
268 | const raws = this.raws;
|
---|
269 | return `${this.value}${raws.after}${raws.and}${raws.afterAnd}`;
|
---|
270 | }
|
---|
271 |
|
---|
272 | }
|
---|
273 |
|
---|
274 | const modifierRE = '(not|only)';
|
---|
275 | const typeRE = '(all|print|screen|speech)';
|
---|
276 | const noExpressionRE = '([\\W\\w]*)';
|
---|
277 | const expressionRE = '([\\W\\w]+)';
|
---|
278 | const noSpaceRE = '(\\s*)';
|
---|
279 | const spaceRE = '(\\s+)';
|
---|
280 | const andRE = '(?:(\\s+)(and))';
|
---|
281 | const andRegExp = new RegExp(`^${expressionRE}(?:${andRE}${spaceRE})$`, 'i');
|
---|
282 | const spaceWrapRegExp = new RegExp(`^${noSpaceRE}${noExpressionRE}${noSpaceRE}$`);
|
---|
283 | const mediaRegExp = new RegExp(`^(?:${modifierRE}${spaceRE})?(?:${typeRE}(?:${andRE}${spaceRE}${expressionRE})?|${expressionRE})$`, 'i');
|
---|
284 | var mediaASTFromString = (string => new MediaQueryList(string));
|
---|
285 |
|
---|
286 | var getCustomMediaFromRoot = ((root, opts) => {
|
---|
287 | // initialize custom selectors
|
---|
288 | const customMedias = {}; // for each custom selector atrule that is a child of the css root
|
---|
289 |
|
---|
290 | root.nodes.slice().forEach(node => {
|
---|
291 | if (isCustomMedia(node)) {
|
---|
292 | // extract the name and selectors from the params of the custom selector
|
---|
293 | const _node$params$match = node.params.match(customMediaParamsRegExp),
|
---|
294 | _node$params$match2 = _slicedToArray(_node$params$match, 3),
|
---|
295 | name = _node$params$match2[1],
|
---|
296 | selectors = _node$params$match2[2]; // write the parsed selectors to the custom selector
|
---|
297 |
|
---|
298 |
|
---|
299 | customMedias[name] = mediaASTFromString(selectors); // conditionally remove the custom selector atrule
|
---|
300 |
|
---|
301 | if (!Object(opts).preserve) {
|
---|
302 | node.remove();
|
---|
303 | }
|
---|
304 | }
|
---|
305 | });
|
---|
306 | return customMedias;
|
---|
307 | }); // match the custom selector name
|
---|
308 |
|
---|
309 | const customMediaNameRegExp = /^custom-media$/i; // match the custom selector params
|
---|
310 |
|
---|
311 | const customMediaParamsRegExp = /^(--[A-z][\w-]*)\s+([\W\w]+)\s*$/; // whether the atrule is a custom selector
|
---|
312 |
|
---|
313 | const isCustomMedia = node => node.type === 'atrule' && customMediaNameRegExp.test(node.name) && customMediaParamsRegExp.test(node.params);
|
---|
314 |
|
---|
315 | /* Get Custom Media from CSS File
|
---|
316 | /* ========================================================================== */
|
---|
317 |
|
---|
318 | function getCustomMediaFromCSSFile(_x) {
|
---|
319 | return _getCustomMediaFromCSSFile.apply(this, arguments);
|
---|
320 | }
|
---|
321 | /* Get Custom Media from Object
|
---|
322 | /* ========================================================================== */
|
---|
323 |
|
---|
324 |
|
---|
325 | function _getCustomMediaFromCSSFile() {
|
---|
326 | _getCustomMediaFromCSSFile = _asyncToGenerator(function* (from) {
|
---|
327 | const css = yield readFile(from);
|
---|
328 | const root = postcss.parse(css, {
|
---|
329 | from
|
---|
330 | });
|
---|
331 | return getCustomMediaFromRoot(root, {
|
---|
332 | preserve: true
|
---|
333 | });
|
---|
334 | });
|
---|
335 | return _getCustomMediaFromCSSFile.apply(this, arguments);
|
---|
336 | }
|
---|
337 |
|
---|
338 | function getCustomMediaFromObject(object) {
|
---|
339 | const customMedia = Object.assign({}, Object(object).customMedia, Object(object)['custom-media']);
|
---|
340 |
|
---|
341 | for (const key in customMedia) {
|
---|
342 | customMedia[key] = mediaASTFromString(customMedia[key]);
|
---|
343 | }
|
---|
344 |
|
---|
345 | return customMedia;
|
---|
346 | }
|
---|
347 | /* Get Custom Media from JSON file
|
---|
348 | /* ========================================================================== */
|
---|
349 |
|
---|
350 |
|
---|
351 | function getCustomMediaFromJSONFile(_x2) {
|
---|
352 | return _getCustomMediaFromJSONFile.apply(this, arguments);
|
---|
353 | }
|
---|
354 | /* Get Custom Media from JS file
|
---|
355 | /* ========================================================================== */
|
---|
356 |
|
---|
357 |
|
---|
358 | function _getCustomMediaFromJSONFile() {
|
---|
359 | _getCustomMediaFromJSONFile = _asyncToGenerator(function* (from) {
|
---|
360 | const object = yield readJSON(from);
|
---|
361 | return getCustomMediaFromObject(object);
|
---|
362 | });
|
---|
363 | return _getCustomMediaFromJSONFile.apply(this, arguments);
|
---|
364 | }
|
---|
365 |
|
---|
366 | function getCustomMediaFromJSFile(_x3) {
|
---|
367 | return _getCustomMediaFromJSFile.apply(this, arguments);
|
---|
368 | }
|
---|
369 | /* Get Custom Media from Sources
|
---|
370 | /* ========================================================================== */
|
---|
371 |
|
---|
372 |
|
---|
373 | function _getCustomMediaFromJSFile() {
|
---|
374 | _getCustomMediaFromJSFile = _asyncToGenerator(function* (from) {
|
---|
375 | const object = yield import(from);
|
---|
376 | return getCustomMediaFromObject(object);
|
---|
377 | });
|
---|
378 | return _getCustomMediaFromJSFile.apply(this, arguments);
|
---|
379 | }
|
---|
380 |
|
---|
381 | function getCustomMediaFromSources(sources) {
|
---|
382 | return sources.map(source => {
|
---|
383 | if (source instanceof Promise) {
|
---|
384 | return source;
|
---|
385 | } else if (source instanceof Function) {
|
---|
386 | return source();
|
---|
387 | } // read the source as an object
|
---|
388 |
|
---|
389 |
|
---|
390 | const opts = source === Object(source) ? source : {
|
---|
391 | from: String(source)
|
---|
392 | }; // skip objects with custom media
|
---|
393 |
|
---|
394 | if (Object(opts).customMedia || Object(opts)['custom-media']) {
|
---|
395 | return opts;
|
---|
396 | } // source pathname
|
---|
397 |
|
---|
398 |
|
---|
399 | const from = path.resolve(String(opts.from || '')); // type of file being read from
|
---|
400 |
|
---|
401 | const type = (opts.type || path.extname(from).slice(1)).toLowerCase();
|
---|
402 | return {
|
---|
403 | type,
|
---|
404 | from
|
---|
405 | };
|
---|
406 | }).reduce(
|
---|
407 | /*#__PURE__*/
|
---|
408 | function () {
|
---|
409 | var _ref = _asyncToGenerator(function* (customMedia, source) {
|
---|
410 | const _ref2 = yield source,
|
---|
411 | type = _ref2.type,
|
---|
412 | from = _ref2.from;
|
---|
413 |
|
---|
414 | if (type === 'css' || type === 'pcss') {
|
---|
415 | return Object.assign((yield customMedia), (yield getCustomMediaFromCSSFile(from)));
|
---|
416 | }
|
---|
417 |
|
---|
418 | if (type === 'js') {
|
---|
419 | return Object.assign((yield customMedia), (yield getCustomMediaFromJSFile(from)));
|
---|
420 | }
|
---|
421 |
|
---|
422 | if (type === 'json') {
|
---|
423 | return Object.assign((yield customMedia), (yield getCustomMediaFromJSONFile(from)));
|
---|
424 | }
|
---|
425 |
|
---|
426 | return Object.assign((yield customMedia), getCustomMediaFromObject((yield source)));
|
---|
427 | });
|
---|
428 |
|
---|
429 | return function (_x4, _x5) {
|
---|
430 | return _ref.apply(this, arguments);
|
---|
431 | };
|
---|
432 | }(), {});
|
---|
433 | }
|
---|
434 | /* Helper utilities
|
---|
435 | /* ========================================================================== */
|
---|
436 |
|
---|
437 | const readFile = from => new Promise((resolve, reject) => {
|
---|
438 | fs.readFile(from, 'utf8', (error, result) => {
|
---|
439 | if (error) {
|
---|
440 | reject(error);
|
---|
441 | } else {
|
---|
442 | resolve(result);
|
---|
443 | }
|
---|
444 | });
|
---|
445 | });
|
---|
446 |
|
---|
447 | const readJSON =
|
---|
448 | /*#__PURE__*/
|
---|
449 | function () {
|
---|
450 | var _ref3 = _asyncToGenerator(function* (from) {
|
---|
451 | return JSON.parse((yield readFile(from)));
|
---|
452 | });
|
---|
453 |
|
---|
454 | return function readJSON(_x6) {
|
---|
455 | return _ref3.apply(this, arguments);
|
---|
456 | };
|
---|
457 | }();
|
---|
458 |
|
---|
459 | // return transformed medias, replacing custom pseudo medias with custom medias
|
---|
460 | function transformMediaList(mediaList, customMedias) {
|
---|
461 | let index = mediaList.nodes.length - 1;
|
---|
462 |
|
---|
463 | while (index >= 0) {
|
---|
464 | const transformedMedias = transformMedia(mediaList.nodes[index], customMedias);
|
---|
465 |
|
---|
466 | if (transformedMedias.length) {
|
---|
467 | mediaList.nodes.splice(index, 1, ...transformedMedias);
|
---|
468 | }
|
---|
469 |
|
---|
470 | --index;
|
---|
471 | }
|
---|
472 |
|
---|
473 | return mediaList;
|
---|
474 | } // return custom pseudo medias replaced with custom medias
|
---|
475 |
|
---|
476 | function transformMedia(media, customMedias) {
|
---|
477 | const transpiledMedias = [];
|
---|
478 |
|
---|
479 | for (const index in media.nodes) {
|
---|
480 | const _media$nodes$index = media.nodes[index],
|
---|
481 | value = _media$nodes$index.value,
|
---|
482 | nodes = _media$nodes$index.nodes;
|
---|
483 | const key = value.replace(customPseudoRegExp, '$1');
|
---|
484 |
|
---|
485 | if (key in customMedias) {
|
---|
486 | var _iteratorNormalCompletion = true;
|
---|
487 | var _didIteratorError = false;
|
---|
488 | var _iteratorError = undefined;
|
---|
489 |
|
---|
490 | try {
|
---|
491 | for (var _iterator = customMedias[key].nodes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
---|
492 | const replacementMedia = _step.value;
|
---|
493 | // use the first available modifier unless they cancel each other out
|
---|
494 | const modifier = media.modifier !== replacementMedia.modifier ? media.modifier || replacementMedia.modifier : '';
|
---|
495 | const mediaClone = media.clone({
|
---|
496 | modifier,
|
---|
497 | // conditionally use the raws from the first available modifier
|
---|
498 | raws: !modifier || media.modifier ? _objectSpread({}, media.raws) : _objectSpread({}, replacementMedia.raws),
|
---|
499 | type: media.type || replacementMedia.type
|
---|
500 | }); // conditionally include more replacement raws when the type is present
|
---|
501 |
|
---|
502 | if (mediaClone.type === replacementMedia.type) {
|
---|
503 | Object.assign(mediaClone.raws, {
|
---|
504 | and: replacementMedia.raws.and,
|
---|
505 | beforeAnd: replacementMedia.raws.beforeAnd,
|
---|
506 | beforeExpression: replacementMedia.raws.beforeExpression
|
---|
507 | });
|
---|
508 | }
|
---|
509 |
|
---|
510 | mediaClone.nodes.splice(index, 1, ...replacementMedia.clone().nodes.map(node => {
|
---|
511 | // use raws and spacing from the current usage
|
---|
512 | if (media.nodes[index].raws.and) {
|
---|
513 | node.raws = _objectSpread({}, media.nodes[index].raws);
|
---|
514 | }
|
---|
515 |
|
---|
516 | node.spaces = _objectSpread({}, media.nodes[index].spaces);
|
---|
517 | return node;
|
---|
518 | })); // remove the currently transformed key to prevent recursion
|
---|
519 |
|
---|
520 | const nextCustomMedia = getCustomMediasWithoutKey(customMedias, key);
|
---|
521 | const retranspiledMedias = transformMedia(mediaClone, nextCustomMedia);
|
---|
522 |
|
---|
523 | if (retranspiledMedias.length) {
|
---|
524 | transpiledMedias.push(...retranspiledMedias);
|
---|
525 | } else {
|
---|
526 | transpiledMedias.push(mediaClone);
|
---|
527 | }
|
---|
528 | }
|
---|
529 | } catch (err) {
|
---|
530 | _didIteratorError = true;
|
---|
531 | _iteratorError = err;
|
---|
532 | } finally {
|
---|
533 | try {
|
---|
534 | if (!_iteratorNormalCompletion && _iterator.return != null) {
|
---|
535 | _iterator.return();
|
---|
536 | }
|
---|
537 | } finally {
|
---|
538 | if (_didIteratorError) {
|
---|
539 | throw _iteratorError;
|
---|
540 | }
|
---|
541 | }
|
---|
542 | }
|
---|
543 |
|
---|
544 | return transpiledMedias;
|
---|
545 | } else if (nodes && nodes.length) {
|
---|
546 | transformMediaList(media.nodes[index], customMedias);
|
---|
547 | }
|
---|
548 | }
|
---|
549 |
|
---|
550 | return transpiledMedias;
|
---|
551 | }
|
---|
552 |
|
---|
553 | const customPseudoRegExp = /\((--[A-z][\w-]*)\)/;
|
---|
554 |
|
---|
555 | const getCustomMediasWithoutKey = (customMedias, key) => {
|
---|
556 | const nextCustomMedias = Object.assign({}, customMedias);
|
---|
557 | delete nextCustomMedias[key];
|
---|
558 | return nextCustomMedias;
|
---|
559 | };
|
---|
560 |
|
---|
561 | var transformAtrules = ((root, customMedia, opts) => {
|
---|
562 | root.walkAtRules(mediaAtRuleRegExp, atrule => {
|
---|
563 | if (customPseudoRegExp$1.test(atrule.params)) {
|
---|
564 | const mediaAST = mediaASTFromString(atrule.params);
|
---|
565 | const params = String(transformMediaList(mediaAST, customMedia));
|
---|
566 |
|
---|
567 | if (opts.preserve) {
|
---|
568 | atrule.cloneBefore({
|
---|
569 | params
|
---|
570 | });
|
---|
571 | } else {
|
---|
572 | atrule.params = params;
|
---|
573 | }
|
---|
574 | }
|
---|
575 | });
|
---|
576 | });
|
---|
577 | const mediaAtRuleRegExp = /^media$/i;
|
---|
578 | const customPseudoRegExp$1 = /\(--[A-z][\w-]*\)/;
|
---|
579 |
|
---|
580 | /* Write Custom Media from CSS File
|
---|
581 | /* ========================================================================== */
|
---|
582 |
|
---|
583 | function writeCustomMediaToCssFile(_x, _x2) {
|
---|
584 | return _writeCustomMediaToCssFile.apply(this, arguments);
|
---|
585 | }
|
---|
586 | /* Write Custom Media from JSON file
|
---|
587 | /* ========================================================================== */
|
---|
588 |
|
---|
589 |
|
---|
590 | function _writeCustomMediaToCssFile() {
|
---|
591 | _writeCustomMediaToCssFile = _asyncToGenerator(function* (to, customMedia) {
|
---|
592 | const cssContent = Object.keys(customMedia).reduce((cssLines, name) => {
|
---|
593 | cssLines.push(`@custom-media ${name} ${customMedia[name]};`);
|
---|
594 | return cssLines;
|
---|
595 | }, []).join('\n');
|
---|
596 | const css = `${cssContent}\n`;
|
---|
597 | yield writeFile(to, css);
|
---|
598 | });
|
---|
599 | return _writeCustomMediaToCssFile.apply(this, arguments);
|
---|
600 | }
|
---|
601 |
|
---|
602 | function writeCustomMediaToJsonFile(_x3, _x4) {
|
---|
603 | return _writeCustomMediaToJsonFile.apply(this, arguments);
|
---|
604 | }
|
---|
605 | /* Write Custom Media from Common JS file
|
---|
606 | /* ========================================================================== */
|
---|
607 |
|
---|
608 |
|
---|
609 | function _writeCustomMediaToJsonFile() {
|
---|
610 | _writeCustomMediaToJsonFile = _asyncToGenerator(function* (to, customMedia) {
|
---|
611 | const jsonContent = JSON.stringify({
|
---|
612 | 'custom-media': customMedia
|
---|
613 | }, null, ' ');
|
---|
614 | const json = `${jsonContent}\n`;
|
---|
615 | yield writeFile(to, json);
|
---|
616 | });
|
---|
617 | return _writeCustomMediaToJsonFile.apply(this, arguments);
|
---|
618 | }
|
---|
619 |
|
---|
620 | function writeCustomMediaToCjsFile(_x5, _x6) {
|
---|
621 | return _writeCustomMediaToCjsFile.apply(this, arguments);
|
---|
622 | }
|
---|
623 | /* Write Custom Media from Module JS file
|
---|
624 | /* ========================================================================== */
|
---|
625 |
|
---|
626 |
|
---|
627 | function _writeCustomMediaToCjsFile() {
|
---|
628 | _writeCustomMediaToCjsFile = _asyncToGenerator(function* (to, customMedia) {
|
---|
629 | const jsContents = Object.keys(customMedia).reduce((jsLines, name) => {
|
---|
630 | jsLines.push(`\t\t'${escapeForJS(name)}': '${escapeForJS(customMedia[name])}'`);
|
---|
631 | return jsLines;
|
---|
632 | }, []).join(',\n');
|
---|
633 | const js = `module.exports = {\n\tcustomMedia: {\n${jsContents}\n\t}\n};\n`;
|
---|
634 | yield writeFile(to, js);
|
---|
635 | });
|
---|
636 | return _writeCustomMediaToCjsFile.apply(this, arguments);
|
---|
637 | }
|
---|
638 |
|
---|
639 | function writeCustomMediaToMjsFile(_x7, _x8) {
|
---|
640 | return _writeCustomMediaToMjsFile.apply(this, arguments);
|
---|
641 | }
|
---|
642 | /* Write Custom Media to Exports
|
---|
643 | /* ========================================================================== */
|
---|
644 |
|
---|
645 |
|
---|
646 | function _writeCustomMediaToMjsFile() {
|
---|
647 | _writeCustomMediaToMjsFile = _asyncToGenerator(function* (to, customMedia) {
|
---|
648 | const mjsContents = Object.keys(customMedia).reduce((mjsLines, name) => {
|
---|
649 | mjsLines.push(`\t'${escapeForJS(name)}': '${escapeForJS(customMedia[name])}'`);
|
---|
650 | return mjsLines;
|
---|
651 | }, []).join(',\n');
|
---|
652 | const mjs = `export const customMedia = {\n${mjsContents}\n};\n`;
|
---|
653 | yield writeFile(to, mjs);
|
---|
654 | });
|
---|
655 | return _writeCustomMediaToMjsFile.apply(this, arguments);
|
---|
656 | }
|
---|
657 |
|
---|
658 | function writeCustomMediaToExports(customMedia, destinations) {
|
---|
659 | return Promise.all(destinations.map(
|
---|
660 | /*#__PURE__*/
|
---|
661 | function () {
|
---|
662 | var _ref = _asyncToGenerator(function* (destination) {
|
---|
663 | if (destination instanceof Function) {
|
---|
664 | yield destination(defaultCustomMediaToJSON(customMedia));
|
---|
665 | } else {
|
---|
666 | // read the destination as an object
|
---|
667 | const opts = destination === Object(destination) ? destination : {
|
---|
668 | to: String(destination)
|
---|
669 | }; // transformer for custom media into a JSON-compatible object
|
---|
670 |
|
---|
671 | const toJSON = opts.toJSON || defaultCustomMediaToJSON;
|
---|
672 |
|
---|
673 | if ('customMedia' in opts) {
|
---|
674 | // write directly to an object as customMedia
|
---|
675 | opts.customMedia = toJSON(customMedia);
|
---|
676 | } else if ('custom-media' in opts) {
|
---|
677 | // write directly to an object as custom-media
|
---|
678 | opts['custom-media'] = toJSON(customMedia);
|
---|
679 | } else {
|
---|
680 | // destination pathname
|
---|
681 | const to = String(opts.to || ''); // type of file being written to
|
---|
682 |
|
---|
683 | const type = (opts.type || path.extname(to).slice(1)).toLowerCase(); // transformed custom media
|
---|
684 |
|
---|
685 | const customMediaJSON = toJSON(customMedia);
|
---|
686 |
|
---|
687 | if (type === 'css') {
|
---|
688 | yield writeCustomMediaToCssFile(to, customMediaJSON);
|
---|
689 | }
|
---|
690 |
|
---|
691 | if (type === 'js') {
|
---|
692 | yield writeCustomMediaToCjsFile(to, customMediaJSON);
|
---|
693 | }
|
---|
694 |
|
---|
695 | if (type === 'json') {
|
---|
696 | yield writeCustomMediaToJsonFile(to, customMediaJSON);
|
---|
697 | }
|
---|
698 |
|
---|
699 | if (type === 'mjs') {
|
---|
700 | yield writeCustomMediaToMjsFile(to, customMediaJSON);
|
---|
701 | }
|
---|
702 | }
|
---|
703 | }
|
---|
704 | });
|
---|
705 |
|
---|
706 | return function (_x9) {
|
---|
707 | return _ref.apply(this, arguments);
|
---|
708 | };
|
---|
709 | }()));
|
---|
710 | }
|
---|
711 | /* Helper utilities
|
---|
712 | /* ========================================================================== */
|
---|
713 |
|
---|
714 | const defaultCustomMediaToJSON = customMedia => {
|
---|
715 | return Object.keys(customMedia).reduce((customMediaJSON, key) => {
|
---|
716 | customMediaJSON[key] = String(customMedia[key]);
|
---|
717 | return customMediaJSON;
|
---|
718 | }, {});
|
---|
719 | };
|
---|
720 |
|
---|
721 | const writeFile = (to, text) => new Promise((resolve, reject) => {
|
---|
722 | fs.writeFile(to, text, error => {
|
---|
723 | if (error) {
|
---|
724 | reject(error);
|
---|
725 | } else {
|
---|
726 | resolve();
|
---|
727 | }
|
---|
728 | });
|
---|
729 | });
|
---|
730 |
|
---|
731 | const escapeForJS = string => string.replace(/\\([\s\S])|(')/g, '\\$1$2').replace(/\n/g, '\\n').replace(/\r/g, '\\r');
|
---|
732 |
|
---|
733 | var index = postcss.plugin('postcss-custom-media', opts => {
|
---|
734 | // whether to preserve custom media and at-rules using them
|
---|
735 | const preserve = 'preserve' in Object(opts) ? Boolean(opts.preserve) : false; // sources to import custom media from
|
---|
736 |
|
---|
737 | const importFrom = [].concat(Object(opts).importFrom || []); // destinations to export custom media to
|
---|
738 |
|
---|
739 | const exportTo = [].concat(Object(opts).exportTo || []); // promise any custom media are imported
|
---|
740 |
|
---|
741 | const customMediaPromise = getCustomMediaFromSources(importFrom);
|
---|
742 | return (
|
---|
743 | /*#__PURE__*/
|
---|
744 | function () {
|
---|
745 | var _ref = _asyncToGenerator(function* (root) {
|
---|
746 | const customMedia = Object.assign((yield customMediaPromise), getCustomMediaFromRoot(root, {
|
---|
747 | preserve
|
---|
748 | }));
|
---|
749 | yield writeCustomMediaToExports(customMedia, exportTo);
|
---|
750 | transformAtrules(root, customMedia, {
|
---|
751 | preserve
|
---|
752 | });
|
---|
753 | });
|
---|
754 |
|
---|
755 | return function (_x) {
|
---|
756 | return _ref.apply(this, arguments);
|
---|
757 | };
|
---|
758 | }()
|
---|
759 | );
|
---|
760 | });
|
---|
761 |
|
---|
762 | export default index;
|
---|
763 | //# sourceMappingURL=index.es.mjs.map
|
---|