Source: index.js

const importCwd = require('import-cwd');
const pify = require('pify');
const path = require('path');
const { validateRollupPostcssLessLoaderOptions } = require('./validators');
const RollupFileManager = require('./RollupFileManager');
const replaceAliases = require('./replaceAliases');

const humanlizePath = filepath => path.relative(process.cwd(), filepath);

/**
 * Rollup Postcss Less Loader that is capable of resolving webpack style aliases
 *
 * Inspired by https://github.com/egoist/rollup-plugin-postcss/blob/5596ca978bee3d5c4da64c8ddd130ca3d8e77244/src/less-loader.js
 * but modified to use a custom file manager and resolve webpack aliases.
 *
 * @param options Information about the user.
 * @param {Object.<string, string>} options.aliases The user defined aliases.
 * @param {string} [options.nodeModulePath] The root node modules path, defaults to 'node_modules'
 */
const rollupPostcssLessLoader = options => {
  validateRollupPostcssLessLoaderOptions(options);
  options.nodeModulePath = options.nodeModulePath || 'node_modules';
  const rollupFileManager = new RollupFileManager(options.aliases, options.nodeModulePath);

  return {
    name: 'less',
    test: /\.less$/,

    async process({ code }) {
      code = replaceAliases(code, options.aliases, options.nodeModulePath);
      const less = importCwd('less');
      let { css, map, imports } = await pify(less.render.bind(importCwd('less')))(code, {
        ...this.options,
        sourceMap: this.sourceMap && {},
        filename: this.id,
        plugins: [
          {
            install(lessInstance, pluginManager) {
              pluginManager.addFileManager(rollupFileManager);
            },
            minVersion: [2, 1, 1]
          }
        ]
      });

      imports.forEach(dep => {
        this.dependencies.add(dep);
      });

      if (map) {
        map = JSON.parse(map);
        map.sources = map.sources.map(source => humanlizePath(source));
      }

      return {
        code: css,
        map
      };
    }
  };
};

module.exports = rollupPostcssLessLoader;