index.js 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = void 0;
  6. var _path = _interopRequireDefault(require("path"));
  7. var _options = _interopRequireDefault(require("./options.json"));
  8. var _utils = require("./utils");
  9. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  10. async function lessLoader(source) {
  11. const options = this.getOptions(_options.default);
  12. const callback = this.async();
  13. let implementation;
  14. try {
  15. implementation = (0, _utils.getLessImplementation)(this, options.implementation);
  16. } catch (error) {
  17. callback(error);
  18. return;
  19. }
  20. if (!implementation) {
  21. callback(new Error(`The Less implementation "${options.implementation}" not found`));
  22. return;
  23. }
  24. const lessOptions = (0, _utils.getLessOptions)(this, options, implementation);
  25. const useSourceMap = typeof options.sourceMap === "boolean" ? options.sourceMap : this.sourceMap;
  26. if (useSourceMap) {
  27. lessOptions.sourceMap = {
  28. outputSourceFiles: true
  29. };
  30. }
  31. let data = source;
  32. if (typeof options.additionalData !== "undefined") {
  33. data = typeof options.additionalData === "function" ? `${await options.additionalData(data, this)}` : `${options.additionalData}\n${data}`;
  34. }
  35. const logger = this.getLogger("less-loader");
  36. const loggerListener = {
  37. error(message) {
  38. logger.error(message);
  39. },
  40. warn(message) {
  41. logger.warn(message);
  42. },
  43. info(message) {
  44. logger.log(message);
  45. },
  46. debug(message) {
  47. logger.debug(message);
  48. }
  49. };
  50. implementation.logger.addListener(loggerListener);
  51. let result;
  52. try {
  53. result = await implementation.render(data, lessOptions);
  54. } catch (error) {
  55. if (error.filename) {
  56. // `less` returns forward slashes on windows when `webpack` resolver return an absolute windows path in `WebpackFileManager`
  57. // Ref: https://github.com/webpack-contrib/less-loader/issues/357
  58. this.addDependency(_path.default.normalize(error.filename));
  59. }
  60. callback((0, _utils.errorFactory)(error));
  61. return;
  62. } finally {
  63. // Fix memory leaks in `less`
  64. implementation.logger.removeListener(loggerListener);
  65. delete lessOptions.pluginManager.webpackLoaderContext;
  66. delete lessOptions.pluginManager;
  67. }
  68. const {
  69. css,
  70. imports
  71. } = result;
  72. imports.forEach(item => {
  73. if ((0, _utils.isUnsupportedUrl)(item)) {
  74. return;
  75. }
  76. // `less` return forward slashes on windows when `webpack` resolver return an absolute windows path in `WebpackFileManager`
  77. // Ref: https://github.com/webpack-contrib/less-loader/issues/357
  78. const normalizedItem = _path.default.normalize(item);
  79. // Custom `importer` can return only `contents` so item will be relative
  80. if (_path.default.isAbsolute(normalizedItem)) {
  81. this.addDependency(normalizedItem);
  82. }
  83. });
  84. let map = typeof result.map === "string" ? JSON.parse(result.map) : result.map;
  85. if (map && useSourceMap) {
  86. map = (0, _utils.normalizeSourceMap)(map, this.rootContext);
  87. }
  88. callback(null, css, map);
  89. }
  90. var _default = lessLoader;
  91. exports.default = _default;