index.js 4.3 KB

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