| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 | 
							- 'use strict';
 
- var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
 
- var postcss = require('postcss');
 
- var topologicalSort = require('./topologicalSort');
 
- var declWhitelist = ['composes'];
 
- var declFilter = new RegExp(`^(${declWhitelist.join('|')})$`);
 
- var matchImports = /^(.+?)\s+from\s+(?:"([^"]+)"|'([^']+)'|(global))$/;
 
- var icssImport = /^:import\((?:"([^"]+)"|'([^']+)')\)/;
 
- var VISITED_MARKER = 1;
 
- function createParentName(rule, root) {
 
-   return `__${root.index(rule.parent)}_${rule.selector}`;
 
- }
 
- function serializeImports(imports) {
 
-   return imports.map(function (importPath) {
 
-     return '`' + importPath + '`';
 
-   }).join(', ');
 
- }
 
- /**
 
-  * :import('G') {}
 
-  *
 
-  * Rule
 
-  *   composes: ... from 'A'
 
-  *   composes: ... from 'B'
 
-  * Rule
 
-  *   composes: ... from 'A'
 
-  *   composes: ... from 'A'
 
-  *   composes: ... from 'C'
 
-  *
 
-  * Results in:
 
-  *
 
-  * graph: {
 
-  *   G: [],
 
-  *   A: [],
 
-  *   B: ['A'],
 
-  *   C: ['A'],
 
-  * }
 
-  */
 
- function addImportToGraph(importId, parentId, graph, visited) {
 
-   var siblingsId = parentId + '_' + 'siblings';
 
-   var visitedId = parentId + '_' + importId;
 
-   if (visited[visitedId] !== VISITED_MARKER) {
 
-     if (!Array.isArray(visited[siblingsId])) visited[siblingsId] = [];
 
-     var siblings = visited[siblingsId];
 
-     if (Array.isArray(graph[importId])) graph[importId] = graph[importId].concat(siblings);else graph[importId] = siblings.slice();
 
-     visited[visitedId] = VISITED_MARKER;
 
-     siblings.push(importId);
 
-   }
 
- }
 
- module.exports = postcss.plugin('modules-extract-imports', function () {
 
-   var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
 
-   var failOnWrongOrder = options.failOnWrongOrder;
 
-   return function (css) {
 
-     var graph = {};
 
-     var visited = {};
 
-     var existingImports = {};
 
-     var importDecls = {};
 
-     var imports = {};
 
-     var importIndex = 0;
 
-     var createImportedName = typeof options.createImportedName !== 'function' ? function (importName /*, path*/) {
 
-       return `i__imported_${importName.replace(/\W/g, '_')}_${importIndex++}`;
 
-     } : options.createImportedName;
 
-     // Check the existing imports order and save refs
 
-     css.walkRules(function (rule) {
 
-       var matches = icssImport.exec(rule.selector);
 
-       if (matches) {
 
-         var _matches = _slicedToArray(matches, 3),
 
-             /*match*/doubleQuotePath = _matches[1],
 
-             singleQuotePath = _matches[2];
 
-         var importPath = doubleQuotePath || singleQuotePath;
 
-         addImportToGraph(importPath, 'root', graph, visited);
 
-         existingImports[importPath] = rule;
 
-       }
 
-     });
 
-     // Find any declaration that supports imports
 
-     css.walkDecls(declFilter, function (decl) {
 
-       var matches = decl.value.match(matchImports);
 
-       var tmpSymbols = void 0;
 
-       if (matches) {
 
-         var _matches2 = _slicedToArray(matches, 5),
 
-         /*match*/symbols = _matches2[1],
 
-             doubleQuotePath = _matches2[2],
 
-             singleQuotePath = _matches2[3],
 
-             global = _matches2[4];
 
-         if (global) {
 
-           // Composing globals simply means changing these classes to wrap them in global(name)
 
-           tmpSymbols = symbols.split(/\s+/).map(function (s) {
 
-             return `global(${s})`;
 
-           });
 
-         } else {
 
-           var importPath = doubleQuotePath || singleQuotePath;
 
-           var parentRule = createParentName(decl.parent, css);
 
-           addImportToGraph(importPath, parentRule, graph, visited);
 
-           importDecls[importPath] = decl;
 
-           imports[importPath] = imports[importPath] || {};
 
-           tmpSymbols = symbols.split(/\s+/).map(function (s) {
 
-             if (!imports[importPath][s]) {
 
-               imports[importPath][s] = createImportedName(s, importPath);
 
-             }
 
-             return imports[importPath][s];
 
-           });
 
-         }
 
-         decl.value = tmpSymbols.join(' ');
 
-       }
 
-     });
 
-     var importsOrder = topologicalSort(graph, failOnWrongOrder);
 
-     if (importsOrder instanceof Error) {
 
-       var importPath = importsOrder.nodes.find(function (importPath) {
 
-         return importDecls.hasOwnProperty(importPath);
 
-       });
 
-       var decl = importDecls[importPath];
 
-       var errMsg = 'Failed to resolve order of composed modules ' + serializeImports(importsOrder.nodes) + '.';
 
-       throw decl.error(errMsg, {
 
-         plugin: 'modules-extract-imports',
 
-         word: 'composes'
 
-       });
 
-     }
 
-     var lastImportRule = void 0;
 
-     importsOrder.forEach(function (path) {
 
-       var importedSymbols = imports[path];
 
-       var rule = existingImports[path];
 
-       if (!rule && importedSymbols) {
 
-         rule = postcss.rule({
 
-           selector: `:import("${path}")`,
 
-           raws: { after: '\n' }
 
-         });
 
-         if (lastImportRule) css.insertAfter(lastImportRule, rule);else css.prepend(rule);
 
-       }
 
-       lastImportRule = rule;
 
-       if (!importedSymbols) return;
 
-       Object.keys(importedSymbols).forEach(function (importedSymbol) {
 
-         rule.append(postcss.decl({
 
-           value: importedSymbol,
 
-           prop: importedSymbols[importedSymbol],
 
-           raws: { before: '\n  ' }
 
-         }));
 
-       });
 
-     });
 
-   };
 
- });
 
 
  |