diff --git a/src/createWebpackLessPlugin.js b/src/createWebpackLessPlugin.js index 11393307..b3089550 100644 --- a/src/createWebpackLessPlugin.js +++ b/src/createWebpackLessPlugin.js @@ -1,14 +1,9 @@ -import { promisify } from 'util'; - import less from 'less'; import { urlToRequest } from 'loader-utils'; /* eslint-disable class-methods-use-this */ - -const stringifyLoader = require.resolve('./stringifyLoader.js'); const trailingSlash = /[/\\]$/; -const isLessCompatible = /\.(le|c)ss$/; // This somewhat changed in Less 3.x. Now the file name comes without the // automatically added extension whereas the extension is passed in as `options.ext`. @@ -23,11 +18,6 @@ const isModuleName = /^~[^/\\]+$/; * @returns {LessPlugin} */ function createWebpackLessPlugin(loaderContext) { - const { fs } = loaderContext; - - const loadModule = promisify(loaderContext.loadModule.bind(loaderContext)); - const readFile = promisify(fs.readFile.bind(fs)); - const resolve = loaderContext.getResolve({ mainFields: ['less', 'style', 'main', '...'], mainFiles: ['_index', 'index', '...'], @@ -40,7 +30,6 @@ function createWebpackLessPlugin(loaderContext) { return false; } - // Our WebpackFileManager handles all the files return true; } @@ -61,6 +50,20 @@ function createWebpackLessPlugin(loaderContext) { return filename; } + async resolveFilename(filename, currentDirectory, options) { + const url = this.getUrl(filename, options); + + const moduleRequest = urlToRequest( + url, + url.charAt(0) === '/' ? '' : null + ); + + // Less is giving us trailing slashes, but the context should have no trailing slash + const context = currentDirectory.replace(trailingSlash, ''); + + return this.resolveRequests(context, [moduleRequest, url]); + } + resolveRequests(context, possibleRequests) { if (possibleRequests.length === 0) { return Promise.reject(); @@ -81,50 +84,34 @@ function createWebpackLessPlugin(loaderContext) { }); } - async loadFile(filename, currentDirectory, options, ...args) { - const url = this.getUrl(filename, options); - - const moduleRequest = urlToRequest( - url, - url.charAt(0) === '/' ? '' : null - ); - - // Less is giving us trailing slashes, but the context should have no trailing slash - const context = currentDirectory.replace(trailingSlash, ''); - let resolvedFilename; + async loadFile(filename, ...args) { + let result; try { - resolvedFilename = await this.resolveRequests(context, [ - moduleRequest, - url, - ]); + result = await super.loadFile(filename, ...args); } catch (error) { - loaderContext.emitError(error); + if (error.type !== 'File') { + loaderContext.emitError(error); - return super.loadFile(filename, currentDirectory, options, ...args); - } + return Promise.reject(error); + } + + try { + result = await this.resolveFilename(filename, ...args); + } catch (e) { + loaderContext.emitError(e); - loaderContext.addDependency(resolvedFilename); + return Promise.reject(error); + } - if (isLessCompatible.test(resolvedFilename)) { - const fileBuffer = await readFile(resolvedFilename); - const contents = fileBuffer.toString('utf8'); + loaderContext.addDependency(result); - return { - contents, - filename: resolvedFilename, - }; + return super.loadFile(result, ...args); } - const loadedModule = await loadModule( - [stringifyLoader, resolvedFilename].join('!') - ); - const contents = JSON.parse(loadedModule); + loaderContext.addDependency(result.filename); - return { - contents, - filename: resolvedFilename, - }; + return result; } } diff --git a/src/stringifyLoader.js b/src/stringifyLoader.js deleted file mode 100644 index fbc2d3eb..00000000 --- a/src/stringifyLoader.js +++ /dev/null @@ -1,12 +0,0 @@ -/** - * The stringifyLoader turns any content into a valid JavaScript string. This allows us to load any content - * with loaderContext.loadModule() without webpack complaining about non-JS modules. - * - * @param {string} content - * @return {string} - */ -function stringifyLoader(content) { - return JSON.stringify(content); -} - -module.exports = stringifyLoader; diff --git a/test/fixtures/less/folder/some.file b/test/fixtures/less/folder/some.file index e69de29b..1b55cea3 100644 --- a/test/fixtures/less/folder/some.file +++ b/test/fixtures/less/folder/some.file @@ -0,0 +1,3 @@ +.some-file { + background: hotpink; +}