index.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = loader;
  6. var _schemaUtils = _interopRequireDefault(require("schema-utils"));
  7. var _postcss = _interopRequireDefault(require("postcss"));
  8. var _package = _interopRequireDefault(require("postcss/package.json"));
  9. var _loaderUtils = require("loader-utils");
  10. var _options = _interopRequireDefault(require("./options.json"));
  11. var _plugins = require("./plugins");
  12. var _utils = require("./utils");
  13. var _Warning = _interopRequireDefault(require("./Warning"));
  14. var _CssSyntaxError = _interopRequireDefault(require("./CssSyntaxError"));
  15. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  16. /*
  17. MIT License http://www.opensource.org/licenses/mit-license.php
  18. Author Tobias Koppers @sokra
  19. */
  20. function loader(content, map, meta) {
  21. const options = (0, _loaderUtils.getOptions)(this) || {};
  22. (0, _schemaUtils.default)(_options.default, options, {
  23. name: 'CSS Loader',
  24. baseDataPath: 'options'
  25. });
  26. const callback = this.async();
  27. const sourceMap = options.sourceMap || false;
  28. const plugins = [];
  29. if (options.modules) {
  30. plugins.push(...(0, _utils.getModulesPlugins)(options, this));
  31. }
  32. const exportType = options.onlyLocals ? 'locals' : 'full';
  33. plugins.push((0, _plugins.icssParser)());
  34. if (options.import !== false && exportType === 'full') {
  35. plugins.push((0, _plugins.importParser)({
  36. filter: (0, _utils.getFilter)(options.import, this.resourcePath)
  37. }));
  38. }
  39. if (options.url !== false && exportType === 'full') {
  40. plugins.push((0, _plugins.urlParser)({
  41. filter: (0, _utils.getFilter)(options.url, this.resourcePath, value => (0, _loaderUtils.isUrlRequest)(value))
  42. }));
  43. } // Reuse CSS AST (PostCSS AST e.g 'postcss-loader') to avoid reparsing
  44. if (meta) {
  45. const {
  46. ast
  47. } = meta;
  48. if (ast && ast.type === 'postcss' && ast.version === _package.default.version) {
  49. // eslint-disable-next-line no-param-reassign
  50. content = ast.root;
  51. }
  52. }
  53. (0, _postcss.default)(plugins).process(content, {
  54. from: this.remainingRequest.split('!').pop(),
  55. to: this.currentRequest.split('!').pop(),
  56. map: options.sourceMap ? {
  57. // Some loaders (example `"postcss-loader": "1.x.x"`) always generates source map, we should remove it
  58. prev: sourceMap && map ? (0, _utils.normalizeSourceMap)(map) : null,
  59. inline: false,
  60. annotation: false
  61. } : false
  62. }).then(result => {
  63. result.warnings().forEach(warning => this.emitWarning(new _Warning.default(warning)));
  64. const imports = [];
  65. const exports = [];
  66. const replacers = [];
  67. for (const message of result.messages) {
  68. // eslint-disable-next-line default-case
  69. switch (message.type) {
  70. case 'import':
  71. imports.push(message.value);
  72. break;
  73. case 'export':
  74. exports.push(message.value);
  75. break;
  76. case 'replacer':
  77. replacers.push(message.value);
  78. break;
  79. }
  80. }
  81. const {
  82. importLoaders,
  83. localsConvention
  84. } = options;
  85. const esModule = typeof options.esModule !== 'undefined' ? options.esModule : false;
  86. const importCode = (0, _utils.getImportCode)(this, imports, exportType, sourceMap, importLoaders, esModule);
  87. const moduleCode = (0, _utils.getModuleCode)(this, result, exportType, sourceMap, replacers);
  88. const exportCode = (0, _utils.getExportCode)(this, exports, exportType, replacers, localsConvention, esModule);
  89. return callback(null, [importCode, moduleCode, exportCode].join(''));
  90. }).catch(error => {
  91. callback(error.name === 'CssSyntaxError' ? new _CssSyntaxError.default(error) : error);
  92. });
  93. }