diff --git a/lib/config-generator.js b/lib/config-generator.js index 4666ffad..745f0775 100644 --- a/lib/config-generator.js +++ b/lib/config-generator.js @@ -302,7 +302,7 @@ class ConfigGenerator { rules.push(applyRuleConfigurationCallback('images', { test: /\.(png|jpg|jpeg|gif|ico|svg|webp)$/, - loader: loaderName, + loader: require.resolve(loaderName), options: loaderOptions })); } @@ -330,7 +330,7 @@ class ConfigGenerator { rules.push(applyRuleConfigurationCallback('fonts', { test: /\.(woff|woff2|ttf|eot|otf)$/, - loader: loaderName, + loader: require.resolve(loaderName), options: loaderOptions })); } @@ -394,7 +394,7 @@ class ConfigGenerator { if (this.webpackConfig.useEslintLoader) { rules.push(applyRuleConfigurationCallback('eslint', { test: eslintLoaderUtil.getTest(this.webpackConfig), - loader: 'eslint-loader', + loader: require.resolve('eslint-loader'), exclude: /node_modules/, enforce: 'pre', options: eslintLoaderUtil.getOptions(this.webpackConfig) diff --git a/lib/loaders/babel.js b/lib/loaders/babel.js index 10e124cf..6e923357 100644 --- a/lib/loaders/babel.js +++ b/lib/loaders/babel.js @@ -98,7 +98,7 @@ module.exports = { return [ { - loader: 'babel-loader', + loader: require.resolve('babel-loader'), options: babelConfig } ]; diff --git a/lib/loaders/css-extract.js b/lib/loaders/css-extract.js index 833b8b55..619b3623 100644 --- a/lib/loaders/css-extract.js +++ b/lib/loaders/css-extract.js @@ -29,7 +29,7 @@ module.exports = { // If the CSS extraction is disabled, use the // style-loader instead. return [{ - loader: 'style-loader', + loader: require.resolve('style-loader'), options: applyOptionsCallback(webpackConfig.styleLoaderConfigurationCallback, options) }, ...loaders]; diff --git a/lib/loaders/css.js b/lib/loaders/css.js index 7658f1b8..a0729e5f 100644 --- a/lib/loaders/css.js +++ b/lib/loaders/css.js @@ -41,7 +41,7 @@ module.exports = { const cssLoaders = [ { - loader: 'css-loader', + loader: require.resolve('css-loader'), options: applyOptionsCallback(webpackConfig.cssLoaderConfigurationCallback, options) }, ]; @@ -54,7 +54,7 @@ module.exports = { }; cssLoaders.push({ - loader: 'postcss-loader', + loader: require.resolve('postcss-loader'), options: applyOptionsCallback(webpackConfig.postCssLoaderOptionsCallback, postCssLoaderOptions) }); } diff --git a/lib/loaders/handlebars.js b/lib/loaders/handlebars.js index 749b35c2..e1aa3983 100644 --- a/lib/loaders/handlebars.js +++ b/lib/loaders/handlebars.js @@ -25,7 +25,7 @@ module.exports = { return [ { - loader: 'handlebars-loader', + loader: require.resolve('handlebars-loader'), options: applyOptionsCallback(webpackConfig.handlebarsConfigurationCallback, options) } ]; diff --git a/lib/loaders/less.js b/lib/loaders/less.js index e6edb8de..b48a225e 100644 --- a/lib/loaders/less.js +++ b/lib/loaders/less.js @@ -30,7 +30,7 @@ module.exports = { return [ ...cssLoader.getLoaders(webpackConfig, useCssModules), { - loader: 'less-loader', + loader: require.resolve('less-loader'), options: applyOptionsCallback(webpackConfig.lessLoaderOptionsCallback, config) }, ]; diff --git a/lib/loaders/sass.js b/lib/loaders/sass.js index 002fe6b9..dfb3a79e 100644 --- a/lib/loaders/sass.js +++ b/lib/loaders/sass.js @@ -29,7 +29,7 @@ module.exports = { // without this, all url() paths must be relative to the // entry file, not the file that contains the url() sassLoaders.push({ - loader: 'resolve-url-loader', + loader: require.resolve('resolve-url-loader'), options: Object.assign( { sourceMap: webpackConfig.useSourceMaps @@ -47,7 +47,7 @@ module.exports = { }); sassLoaders.push({ - loader: 'sass-loader', + loader: require.resolve('sass-loader'), options: applyOptionsCallback(webpackConfig.sassLoaderOptionsCallback, config) }); diff --git a/lib/loaders/stylus.js b/lib/loaders/stylus.js index 06fd70b8..3fe6713a 100644 --- a/lib/loaders/stylus.js +++ b/lib/loaders/stylus.js @@ -30,7 +30,7 @@ module.exports = { return [ ...cssLoader.getLoaders(webpackConfig, useCssModules), { - loader: 'stylus-loader', + loader: require.resolve('stylus-loader'), options: applyOptionsCallback(webpackConfig.stylusLoaderOptionsCallback, config) }, ]; diff --git a/lib/loaders/typescript.js b/lib/loaders/typescript.js index 18cccb50..9fef9dc5 100644 --- a/lib/loaders/typescript.js +++ b/lib/loaders/typescript.js @@ -51,7 +51,7 @@ module.exports = { let loaders = babelLoader.getLoaders(webpackConfig); return loaders.concat([ { - loader: 'ts-loader', + loader: require.resolve('ts-loader'), // @see https://github.com/TypeStrong/ts-loader/blob/master/README.md#available-options options: config } diff --git a/lib/loaders/vue.js b/lib/loaders/vue.js index 45bc120f..2ac6d1fe 100644 --- a/lib/loaders/vue.js +++ b/lib/loaders/vue.js @@ -25,7 +25,7 @@ module.exports = { return [ { - loader: 'vue-loader', + loader: require.resolve('vue-loader'), options: applyOptionsCallback(webpackConfig.vueLoaderOptionsCallback, options) } ]; diff --git a/test/config-generator.js b/test/config-generator.js index 9cc43b5b..82375d4c 100644 --- a/test/config-generator.js +++ b/test/config-generator.js @@ -861,10 +861,10 @@ describe('The config-generator function', () => { const actualConfig = configGenerator(config); const imagesRule = findRule(/\.(png|jpg|jpeg|gif|ico|svg|webp)$/, actualConfig.module.rules); - expect(imagesRule.loader).to.equal('file-loader'); + expect(imagesRule.loader).to.contain('file-loader'); const fontsRule = findRule(/\.(woff|woff2|ttf|eot|otf)$/, actualConfig.module.rules); - expect(fontsRule.loader).to.equal('file-loader'); + expect(fontsRule.loader).to.contain('file-loader'); }); it('with configureUrlLoader() and missing keys', () => { @@ -877,10 +877,10 @@ describe('The config-generator function', () => { const actualConfig = configGenerator(config); const imagesRule = findRule(/\.(png|jpg|jpeg|gif|ico|svg|webp)$/, actualConfig.module.rules); - expect(imagesRule.loader).to.equal('file-loader'); + expect(imagesRule.loader).to.contain('file-loader'); const fontsRule = findRule(/\.(woff|woff2|ttf|eot|otf)$/, actualConfig.module.rules); - expect(fontsRule.loader).to.equal('file-loader'); + expect(fontsRule.loader).to.contain('file-loader'); }); it('with configureUrlLoader()', () => { @@ -900,12 +900,12 @@ describe('The config-generator function', () => { const actualConfig = configGenerator(config); const imagesRule = findRule(/\.(png|jpg|jpeg|gif|ico|svg|webp)$/, actualConfig.module.rules); - expect(imagesRule.loader).to.equal('url-loader'); + expect(imagesRule.loader).to.contain('url-loader'); expect(imagesRule.options.name).to.equal('[name].foo.[ext]'); expect(imagesRule.options.limit).to.equal(8192); const fontsRule = findRule(/\.(woff|woff2|ttf|eot|otf)$/, actualConfig.module.rules); - expect(fontsRule.loader).to.equal('url-loader'); + expect(fontsRule.loader).to.contain('url-loader'); expect(fontsRule.options.limit).to.equal(4096); expect(fontsRule.options.name).to.equal('[name].bar.[ext]'); }); @@ -951,7 +951,7 @@ describe('The config-generator function', () => { const jsRule = findRule(/\.(jsx?)$/, actualConfig.module.rules); expect(String(jsRule.exclude)).to.equal(String(/(node_modules|bower_components)/)); - const babelLoader = jsRule.use.find(loader => loader.loader === 'babel-loader'); + const babelLoader = jsRule.use.find(loader => /babel-loader/.test(loader.loader)); const babelEnvPreset = babelLoader.options.presets.find(([name]) => name === '@babel/preset-env'); expect(babelEnvPreset[1].useBuiltIns).to.equal(false); }); @@ -1001,7 +1001,7 @@ describe('The config-generator function', () => { const actualConfig = configGenerator(config); const jsRule = findRule(/\.(jsx?)$/, actualConfig.module.rules); - const babelLoader = jsRule.use.find(loader => loader.loader === 'babel-loader'); + const babelLoader = jsRule.use.find(loader => /babel-loader/.test(loader.loader)); const babelEnvPreset = babelLoader.options.presets.find(([name]) => name === '@babel/preset-env'); expect(babelEnvPreset[1].useBuiltIns).to.equal('usage'); expect(babelEnvPreset[1].corejs).to.equal(3); @@ -1018,7 +1018,7 @@ describe('The config-generator function', () => { const actualConfig = configGenerator(config); const jsRule = findRule(/\.(jsx?)$/, actualConfig.module.rules); - const babelLoader = jsRule.use.find(loader => loader.loader === 'babel-loader'); + const babelLoader = jsRule.use.find(loader => /babel-loader/.test(loader.loader)); const babelEnvPreset = babelLoader.options.presets.find(([name]) => name === '@babel/preset-env'); expect(babelEnvPreset[1].useBuiltIns).to.equal(false); }); @@ -1035,7 +1035,7 @@ describe('The config-generator function', () => { const actualConfig = configGenerator(config); const jsRule = findRule(/\.(jsx?)$/, actualConfig.module.rules); - const babelLoader = jsRule.use.find(loader => loader.loader === 'babel-loader'); + const babelLoader = jsRule.use.find(loader => /babel-loader/.test(loader.loader)); const babelEnvPreset = babelLoader.options.presets.find(([name]) => name === '@babel/preset-env'); expect(babelEnvPreset[1].useBuiltIns).to.equal('usage'); }); diff --git a/test/loaders/sass.js b/test/loaders/sass.js index 90772a07..b09da932 100644 --- a/test/loaders/sass.js +++ b/test/loaders/sass.js @@ -35,10 +35,10 @@ describe('loaders/sass', () => { const actualLoaders = sassLoader.getLoaders(config); expect(actualLoaders).to.have.lengthOf(2); - expect(actualLoaders[0].loader).to.equal('resolve-url-loader'); + expect(actualLoaders[0].loader).to.contain('resolve-url-loader'); expect(actualLoaders[0].options.sourceMap).to.be.true; - expect(actualLoaders[1].loader).to.equal('sass-loader'); + expect(actualLoaders[1].loader).to.contain('sass-loader'); expect(actualLoaders[1].options.sourceMap).to.be.true; expect(cssLoaderStub.getCall(0).args[1]).to.be.false; @@ -55,10 +55,10 @@ describe('loaders/sass', () => { const actualLoaders = sassLoader.getLoaders(config); expect(actualLoaders).to.have.lengthOf(2); - expect(actualLoaders[0].loader).to.equal('resolve-url-loader'); + expect(actualLoaders[0].loader).to.contain('resolve-url-loader'); expect(actualLoaders[0].options.sourceMap).to.be.false; - expect(actualLoaders[1].loader).to.equal('sass-loader'); + expect(actualLoaders[1].loader).to.contain('sass-loader'); // sourcemaps always enabled when resolve-url-loader is enabled expect(actualLoaders[1].options.sourceMap).to.be.true; @@ -79,7 +79,7 @@ describe('loaders/sass', () => { const actualLoaders = sassLoader.getLoaders(config); expect(actualLoaders).to.have.lengthOf(2); - expect(actualLoaders[0].loader).to.equal('resolve-url-loader'); + expect(actualLoaders[0].loader).to.contain('resolve-url-loader'); expect(actualLoaders[0].options.removeCR).to.be.true; cssLoader.getLoaders.restore(); @@ -98,7 +98,7 @@ describe('loaders/sass', () => { const actualLoaders = sassLoader.getLoaders(config); expect(actualLoaders).to.have.lengthOf(1); - expect(actualLoaders[0].loader).to.equal('sass-loader'); + expect(actualLoaders[0].loader).to.contain('sass-loader'); expect(actualLoaders[0].options.sourceMap).to.be.false; cssLoader.getLoaders.restore(); @@ -158,10 +158,10 @@ describe('loaders/sass', () => { const actualLoaders = sassLoader.getLoaders(config, true); expect(actualLoaders).to.have.lengthOf(2); - expect(actualLoaders[0].loader).to.equal('resolve-url-loader'); + expect(actualLoaders[0].loader).to.contain('resolve-url-loader'); expect(actualLoaders[0].options.sourceMap).to.be.true; - expect(actualLoaders[1].loader).to.equal('sass-loader'); + expect(actualLoaders[1].loader).to.contain('sass-loader'); expect(actualLoaders[1].options.sourceMap).to.be.true; expect(cssLoaderStub.getCall(0).args[1]).to.be.true;