index.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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 loaderContext = this;
  37. const loggerListener = {
  38. error(message) {
  39. // TODO enable by default in the next major release
  40. if (options.lessLogAsWarnOrErr) {
  41. loaderContext.emitError(new Error(message));
  42. } else {
  43. logger.error(message);
  44. }
  45. },
  46. warn(message) {
  47. // TODO enable by default in the next major release
  48. if (options.lessLogAsWarnOrErr) {
  49. loaderContext.emitWarning(new Error(message));
  50. } else {
  51. logger.warn(message);
  52. }
  53. },
  54. info(message) {
  55. logger.log(message);
  56. },
  57. debug(message) {
  58. logger.debug(message);
  59. }
  60. };
  61. implementation.logger.addListener(loggerListener);
  62. let result;
  63. try {
  64. result = await implementation.render(data, lessOptions);
  65. } catch (error) {
  66. if (error.filename) {
  67. // `less` returns forward slashes on windows when `webpack` resolver return an absolute windows path in `WebpackFileManager`
  68. // Ref: https://github.com/webpack-contrib/less-loader/issues/357
  69. this.addDependency(_path.default.normalize(error.filename));
  70. }
  71. callback((0, _utils.errorFactory)(error));
  72. return;
  73. } finally {
  74. // Fix memory leaks in `less`
  75. implementation.logger.removeListener(loggerListener);
  76. delete lessOptions.pluginManager.webpackLoaderContext;
  77. delete lessOptions.pluginManager;
  78. }
  79. const {
  80. css,
  81. imports
  82. } = result;
  83. imports.forEach(item => {
  84. if ((0, _utils.isUnsupportedUrl)(item)) {
  85. return;
  86. }
  87. // `less` return forward slashes on windows when `webpack` resolver return an absolute windows path in `WebpackFileManager`
  88. // Ref: https://github.com/webpack-contrib/less-loader/issues/357
  89. const normalizedItem = _path.default.normalize(item);
  90. // Custom `importer` can return only `contents` so item will be relative
  91. if (_path.default.isAbsolute(normalizedItem)) {
  92. this.addDependency(normalizedItem);
  93. }
  94. });
  95. let map = typeof result.map === "string" ? JSON.parse(result.map) : result.map;
  96. if (map && useSourceMap) {
  97. map = (0, _utils.normalizeSourceMap)(map, this.rootContext);
  98. }
  99. callback(null, css, map);
  100. }
  101. var _default = exports.default = lessLoader;