Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 30 additions & 41 deletions src/createWebpackLessPlugin.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const less = require('less');
const loaderUtils = require('loader-utils');
const pify = require('pify');

const trailingSlash = /[\\/]$/;

Expand All @@ -11,48 +12,36 @@ const trailingSlash = /[\\/]$/;
* @returns {LessPlugin}
*/
function createWebpackLessPlugin(loaderContext, root) {
function WebpackFileManager(...args) {
less.FileManager.apply(this, args);
}

WebpackFileManager.prototype = Object.create(less.FileManager.prototype);

WebpackFileManager.prototype.supports = function supports(/* filename, currentDirectory, options, environment */) {
// Our WebpackFileManager handles all the files
return true;
};

WebpackFileManager.prototype.supportsSync = function supportsSync(/* filename, currentDirectory, options, environment */) {
return false;
};

WebpackFileManager.prototype.loadFile = function loadFile(filename, currentDirectory, options, environment, callback) {
const moduleRequest = loaderUtils.urlToRequest(filename, root);
// Less is giving us trailing slashes, but the context should have no trailing slash
const context = currentDirectory.replace(trailingSlash, '');

loaderContext.resolve(context, moduleRequest, (err, filename) => {
if (err) {
callback(err);
return;
}

loaderContext.addDependency(filename);
// The default (asynchronous)
// loadModule() accepts a request. Thus it's ok to not use path.resolve()
loaderContext.loadModule(`-!${__dirname}/stringify.loader.js!${filename}`, (err, data) => { // eslint-disable-line no-path-concat
if (err) {
callback(err);
return;
}

callback(null, {
contents: JSON.parse(data),
filename,
const resolve = pify(loaderContext.resolve.bind(loaderContext));
const loadModule = pify(loaderContext.loadModule.bind(loaderContext));

class WebpackFileManager extends less.FileManager {
supports(/* filename, currentDirectory, options, environment */) { // eslint-disable-line class-methods-use-this
// Our WebpackFileManager handles all the files
return true;
}

loadFile(filename, currentDirectory /* , options, environment */) { // eslint-disable-line class-methods-use-this
const moduleRequest = loaderUtils.urlToRequest(filename, root);
// Less is giving us trailing slashes, but the context should have no trailing slash
const context = currentDirectory.replace(trailingSlash, '');
let resolvedFilename;

return resolve(context, moduleRequest)
.then((f) => {
resolvedFilename = f;
loaderContext.addDependency(resolvedFilename);

return loadModule(`-!${__dirname}/stringify.loader.js!${resolvedFilename}`);
})
.then((contents) => {
return {
contents: JSON.parse(contents),
filename: resolvedFilename,
};
});
});
});
};
}
}

return {
install(lessInstance, pluginManager) {
Expand Down