diff --git a/lib/loader.js b/lib/loader.js index 625166b9..c1a76175 100644 --- a/lib/loader.js +++ b/lib/loader.js @@ -5,7 +5,11 @@ const loaderUtils = require('loader-utils'); const processCss = require('./processCss'); -const { getImportPrefix, compileExports } = require('./utils'); +const { + getImportPrefix, + placeholderImportItemReplacer, + compileExports, +} = require('./utils'); module.exports = function loader(content, map) { const callback = this.async(); @@ -78,20 +82,9 @@ module.exports = function loader(content, map) { }, this) .join('\n'); - function importItemMatcher(item) { - const match = result.importItemRegExp.exec(item); - const idx = +match[1]; - const importItem = result.importItems[idx]; - const importUrl = importUrlPrefix + importItem.url; - return `" + require(${loaderUtils.stringifyRequest( - this, - importUrl - )}).locals[${JSON.stringify(importItem.export)}] + "`; - } - cssAsString = cssAsString.replace( result.importItemRegExpG, - importItemMatcher.bind(this) + placeholderImportItemReplacer(this, result, importUrlPrefix) ); // helper for ensuring valid CSS strings from requires @@ -136,7 +129,7 @@ module.exports = function loader(content, map) { let exportJs = compileExports( result, - importItemMatcher.bind(this), + placeholderImportItemReplacer(this, result, importUrlPrefix), options.camelCase ); if (exportJs) { @@ -170,7 +163,7 @@ module.exports = function loader(content, map) { moduleJs = `exports.push([module.id, ${cssAsString}, ""]);`; } - // embed runtime + // Embed runtime return callback( null, `${urlEscapeHelper}exports = module.exports = require(${loaderUtils.stringifyRequest( diff --git a/lib/localsLoader.js b/lib/localsLoader.js index f7431cf9..29cb08db 100644 --- a/lib/localsLoader.js +++ b/lib/localsLoader.js @@ -5,7 +5,11 @@ const loaderUtils = require('loader-utils'); const processCss = require('./processCss'); -const { getImportPrefix, compileExports } = require('./utils'); +const { + getImportPrefix, + placeholderImportItemReplacer, + compileExports, +} = require('./utils'); module.exports = function loader(content) { const callback = this.async(); @@ -26,20 +30,9 @@ module.exports = function loader(content) { // for importing CSS const importUrlPrefix = getImportPrefix(this, options); - function importItemMatcher(item) { - const match = result.importItemRegExp.exec(item); - const idx = +match[1]; - const importItem = result.importItems[idx]; - const importUrl = importUrlPrefix + importItem.url; - return ( - `" + require(${loaderUtils.stringifyRequest(this, importUrl)})` + - `[${JSON.stringify(importItem.export)}] + "` - ); - } - let exportJs = compileExports( result, - importItemMatcher.bind(this), + placeholderImportItemReplacer(this, result, importUrlPrefix, true), options.camelCase ); if (exportJs) { diff --git a/lib/utils.js b/lib/utils.js index 0fad5e75..b195e70f 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -110,9 +110,36 @@ function getLocalIdent(loaderContext, localIdentName, localName, options) { .replace(/^((-?[0-9])|--)/, '_$1'); } +function placeholderImportItemReplacer( + loaderContext, + result, + importUrlPrefix, + onlyLocals = false +) { + return (item) => { + const match = result.importItemRegExp.exec(item); + const idx = +match[1]; + const importItem = result.importItems[idx]; + const importUrl = importUrlPrefix + importItem.url; + + if (onlyLocals) { + return `" + require(${loaderUtils.stringifyRequest( + loaderContext, + importUrl + )})[${JSON.stringify(importItem.export)}] + "`; + } + + return `" + require(${loaderUtils.stringifyRequest( + loaderContext, + importUrl + )}).locals[${JSON.stringify(importItem.export)}] + "`; + }; +} + module.exports = { dashesCamelCase, compileExports, getImportPrefix, getLocalIdent, + placeholderImportItemReplacer, };