diff --git a/package.json b/package.json index 23a3477e7..2be4f7788 100644 --- a/package.json +++ b/package.json @@ -92,10 +92,6 @@ "jest": "^20.0.4", "lodash": "^4.17.4", "ncp": "^2.0.0", - "node-sass": "^4.5.3", - "sass-loader": "^6.0.6", - "stylus": "^0.54.5", - "stylus-loader": "^3.0.1", "uuid": "^3.0.1" }, "dependencies": { diff --git a/src/lib/webpack/dependency-install-loader.js b/src/lib/webpack/dependency-install-loader.js index bb0346259..ae5563eb9 100644 --- a/src/lib/webpack/dependency-install-loader.js +++ b/src/lib/webpack/dependency-install-loader.js @@ -58,7 +58,6 @@ module.exports = function(source, map) { Promise.all(deps.map(isInstalled)) .then( installed => { let toInstall = deps.filter( (dep, index) => !installed[index] ); - if (toInstall.length) { return installDeps(toInstall, query.save); } diff --git a/src/lib/webpack/proxy-loader.js b/src/lib/webpack/proxy-loader.js new file mode 100644 index 000000000..5278a8e05 --- /dev/null +++ b/src/lib/webpack/proxy-loader.js @@ -0,0 +1,48 @@ +var utils = require('loader-utils'); +var requireRelative = require('require-relative'); + +function proxyLoader(source, map) { + var options = utils.getOptions(this); + + // First run proxy-loader run + if (!this.query.__proxy_loader__) { + // Store passed options for future calls to proxy-loader with same loaderContext (this) + // e.g. calls via 'this.addDependency' from actual loader + this.query.__proxy_loader__ = { loader: options.loader, cwd: options.cwd }; + + // Remove proxy-loader options and make this.query act as requested loader query + swapOptions(this, options.options); + } + var proxyOptions = this.query.__proxy_loader__; + + var loader; + try { + loader = requireRelative(proxyOptions.loader, proxyOptions.cwd); + } catch (e) { + loader = require(proxyOptions.loader); + } + + // Run actual loader + return loader.call(this, source, map); +} + +function swapOptions(loaderContext, newOptions) { + var copy = {}; + var key = ''; + + for (key in newOptions) { + copy[key] = newOptions[key]; + } + + // Delete all existing loader options + delete loaderContext.query.options; + delete loaderContext.query.loader; + delete loaderContext.query.cwd; + + // Add new options + for (key in copy) { + loaderContext.query[key] = copy[key]; + } +} + +module.exports = proxyLoader; diff --git a/src/lib/webpack/webpack-base-config.js b/src/lib/webpack/webpack-base-config.js index 90d1fbca8..052267168 100644 --- a/src/lib/webpack/webpack-base-config.js +++ b/src/lib/webpack/webpack-base-config.js @@ -79,7 +79,10 @@ export default (env) => { modules: [ resolve(__dirname, '../../../node_modules'), resolve(cwd, 'node_modules') - ] + ], + alias: { + 'proxy-loader': require.resolve('./proxy-loader') + } } }), @@ -108,16 +111,22 @@ export default (env) => { enforce: 'pre', test: /\.less$/, use: [ + { + loader: 'proxy-loader', + options: { + cwd, + loader: 'less-loader', + options: { + sourceMap: true + } + } + }, { loader: resolve(__dirname, './dependency-install-loader'), options: { modules: ['less', 'less-loader'], save: true } - }, - { - loader: 'less-loader', - options: { sourceMap: true } } ] }, @@ -125,16 +134,20 @@ export default (env) => { enforce: 'pre', test: /\.s[ac]ss$/, use: [ + { + loader: 'proxy-loader', + options: { + cwd, + loader: 'sass-loader', + options: { sourceMap: true } + } + }, { loader: resolve(__dirname, './dependency-install-loader'), options: { modules: ['node-sass', 'sass-loader'], save: true } - }, - { - loader: 'sass-loader', - options: { sourceMap: true } } ] }, @@ -142,16 +155,21 @@ export default (env) => { enforce: 'pre', test: /\.styl$/, use: [ + { + loader: 'proxy-loader', + options: { + cwd, + loader: 'stylus-loader', + options: { sourceMap: true } + } + }, { loader: resolve(__dirname, './dependency-install-loader'), options: { + cwd, modules: ['stylus', 'stylus-loader'], save: true } - }, - { - loader: 'stylus-loader', - options: { sourceMap: true } } ] },