From b7d77b3fef2c15a49aa659b39d3b5d1b696810dd Mon Sep 17 00:00:00 2001 From: Johannes Ewald Date: Thu, 16 Mar 2017 23:56:18 +0100 Subject: [PATCH] refactor(less-plugin) * Use class syntax * Use promises. They are already supported by less 2.1.1 --- src/createWebpackLessPlugin.js | 71 ++++++++++++++-------------------- 1 file changed, 30 insertions(+), 41 deletions(-) diff --git a/src/createWebpackLessPlugin.js b/src/createWebpackLessPlugin.js index 8851951c..e0d2fc40 100644 --- a/src/createWebpackLessPlugin.js +++ b/src/createWebpackLessPlugin.js @@ -1,5 +1,6 @@ const less = require('less'); const loaderUtils = require('loader-utils'); +const pify = require('pify'); const trailingSlash = /[\\/]$/; @@ -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) {