index.js 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', {
  3. value: true
  4. });
  5. 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'); } }; })();
  6. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
  7. var _postcss = require('postcss');
  8. var _postcss2 = _interopRequireDefault(_postcss);
  9. var declWhitelist = ['composes'],
  10. declFilter = new RegExp('^(' + declWhitelist.join('|') + ')$'),
  11. matchImports = /^(.+?)\s+from\s+(?:"([^"]+)"|'([^']+)'|(global))$/,
  12. icssImport = /^:import\((?:"([^"]+)"|'([^']+)')\)/;
  13. var processor = _postcss2['default'].plugin('modules-extract-imports', function (options) {
  14. return function (css) {
  15. var imports = {},
  16. importIndex = 0,
  17. createImportedName = options && options.createImportedName || function (importName /*, path*/) {
  18. return 'i__imported_' + importName.replace(/\W/g, '_') + '_' + importIndex++;
  19. };
  20. // Find any declaration that supports imports
  21. css.walkDecls(declFilter, function (decl) {
  22. var matches = decl.value.match(matchImports);
  23. var tmpSymbols = undefined;
  24. if (matches) {
  25. var _matches = _slicedToArray(matches, 5);
  26. var /*match*/symbols = _matches[1];
  27. var doubleQuotePath = _matches[2];
  28. var singleQuotePath = _matches[3];
  29. var _global = _matches[4];
  30. if (_global) {
  31. // Composing globals simply means changing these classes to wrap them in global(name)
  32. tmpSymbols = symbols.split(/\s+/).map(function (s) {
  33. return 'global(' + s + ')';
  34. });
  35. } else {
  36. (function () {
  37. var path = doubleQuotePath || singleQuotePath;
  38. imports[path] = imports[path] || {};
  39. tmpSymbols = symbols.split(/\s+/).map(function (s) {
  40. if (!imports[path][s]) {
  41. imports[path][s] = createImportedName(s, path);
  42. }
  43. return imports[path][s];
  44. });
  45. })();
  46. }
  47. decl.value = tmpSymbols.join(' ');
  48. }
  49. });
  50. // If we've found any imports, insert or append :import rules
  51. var existingImports = {};
  52. css.walkRules(function (rule) {
  53. var matches = icssImport.exec(rule.selector);
  54. if (matches) {
  55. var _matches2 = _slicedToArray(matches, 3);
  56. var /*match*/doubleQuotePath = _matches2[1];
  57. var singleQuotePath = _matches2[2];
  58. existingImports[doubleQuotePath || singleQuotePath] = rule;
  59. }
  60. });
  61. Object.keys(imports).reverse().forEach(function (path) {
  62. var rule = existingImports[path];
  63. if (!rule) {
  64. rule = _postcss2['default'].rule({
  65. selector: ':import("' + path + '")',
  66. raws: { after: "\n" }
  67. });
  68. css.prepend(rule);
  69. }
  70. Object.keys(imports[path]).forEach(function (importedSymbol) {
  71. rule.append(_postcss2['default'].decl({
  72. value: importedSymbol,
  73. prop: imports[path][importedSymbol],
  74. raws: { before: "\n " }
  75. }));
  76. });
  77. });
  78. };
  79. });
  80. exports['default'] = processor;
  81. module.exports = exports['default'];