diff --git a/lib/compile-exports.js b/lib/compile-exports.js deleted file mode 100644 index 581a65b6..00000000 --- a/lib/compile-exports.js +++ /dev/null @@ -1,60 +0,0 @@ -const camelCase = require('lodash/camelCase'); - -function dashesCamelCase(str) { - return str.replace(/-+(\w)/g, (match, firstLetter) => - firstLetter.toUpperCase() - ); -} - -module.exports = function compileExports( - result, - importItemMatcher, - camelCaseKeys -) { - if (!Object.keys(result.exports).length) { - return ''; - } - - const exportJs = Object.keys(result.exports) - .reduce((res, key) => { - let valueAsString = JSON.stringify(result.exports[key]); - valueAsString = valueAsString.replace( - result.importItemRegExpG, - importItemMatcher - ); - function addEntry(k) { - res.push(`\t${JSON.stringify(k)}: ${valueAsString}`); - } - - let targetKey; - switch (camelCaseKeys) { - case true: - addEntry(key); - targetKey = camelCase(key); - if (targetKey !== key) { - addEntry(targetKey); - } - break; - case 'dashes': - addEntry(key); - targetKey = dashesCamelCase(key); - if (targetKey !== key) { - addEntry(targetKey); - } - break; - case 'only': - addEntry(camelCase(key)); - break; - case 'dashesOnly': - addEntry(dashesCamelCase(key)); - break; - default: - addEntry(key); - break; - } - return res; - }, []) - .join(',\n'); - - return `{\n${exportJs}\n}`; -}; diff --git a/lib/getImportPrefix.js b/lib/getImportPrefix.js deleted file mode 100644 index fdadcfc0..00000000 --- a/lib/getImportPrefix.js +++ /dev/null @@ -1,19 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -module.exports = function getImportPrefix(loaderContext, query) { - if (query.importLoaders === false) { - return ''; - } - - const importLoaders = parseInt(query.importLoaders, 10) || 0; - const loadersRequest = loaderContext.loaders - .slice( - loaderContext.loaderIndex, - loaderContext.loaderIndex + 1 + importLoaders - ) - .map((x) => x.request) - .join('!'); - return `-!${loadersRequest}!`; -}; diff --git a/lib/getLocalIdent.js b/lib/getLocalIdent.js deleted file mode 100644 index dbc1ecab..00000000 --- a/lib/getLocalIdent.js +++ /dev/null @@ -1,43 +0,0 @@ -/* - MIT License http://www.opensource.org/licenses/mit-license.php - Author Tobias Koppers @sokra -*/ -const path = require('path'); - -const loaderUtils = require('loader-utils'); - -module.exports = function getLocalIdent( - loaderContext, - localIdentName, - localName, - options -) { - if (!options.context) { - if (loaderContext.rootContext) { - // eslint-disable-next-line no-param-reassign - options.context = loaderContext.rootContext; - } else if ( - loaderContext.options && - typeof loaderContext.options.context === 'string' - ) { - // eslint-disable-next-line no-param-reassign - options.context = loaderContext.options.context; - } else { - // eslint-disable-next-line no-param-reassign - options.context = loaderContext.context; - } - } - const request = path.relative(options.context, loaderContext.resourcePath); - // eslint-disable-next-line no-param-reassign - options.content = `${options.hashPrefix + request}+${localName}`; - // eslint-disable-next-line no-param-reassign - localIdentName = localIdentName.replace(/\[local\]/gi, localName); - const hash = loaderUtils.interpolateName( - loaderContext, - localIdentName, - options - ); - return hash - .replace(new RegExp('[^a-zA-Z0-9\\-_\u00A0-\uFFFF]', 'g'), '-') - .replace(/^((-?[0-9])|--)/, '_$1'); -}; diff --git a/lib/loader.js b/lib/loader.js index 3526df71..6cee1ef5 100644 --- a/lib/loader.js +++ b/lib/loader.js @@ -5,8 +5,7 @@ const loaderUtils = require('loader-utils'); const processCss = require('./processCss'); -const getImportPrefix = require('./getImportPrefix'); -const compileExports = require('./compile-exports'); +const { getImportPrefix, compileExports } = require('./utils'); module.exports = function loader(content, map) { const callback = this.async(); diff --git a/lib/localsLoader.js b/lib/localsLoader.js index f601c613..9eeac21e 100644 --- a/lib/localsLoader.js +++ b/lib/localsLoader.js @@ -5,8 +5,7 @@ const loaderUtils = require('loader-utils'); const processCss = require('./processCss'); -const getImportPrefix = require('./getImportPrefix'); -const compileExports = require('./compile-exports'); +const { getImportPrefix, compileExports } = require('./utils'); module.exports = function loader(content) { const callback = this.async(); diff --git a/lib/processCss.js b/lib/processCss.js index f21ca025..ccc0e99b 100644 --- a/lib/processCss.js +++ b/lib/processCss.js @@ -13,7 +13,7 @@ const modulesValues = require('postcss-modules-values'); const cssLoaderParser = require('./postcss-css-loader-parser'); const CssSyntaxError = require('./CssSyntaxError'); -const getLocalIdent = require('./getLocalIdent'); +const { getLocalIdent } = require('./utils'); module.exports = function processCss(inputSource, inputMap, options, callback) { const { query } = options; diff --git a/lib/utils.js b/lib/utils.js new file mode 100644 index 00000000..6c7574c8 --- /dev/null +++ b/lib/utils.js @@ -0,0 +1,117 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ +const path = require('path'); + +const camelCase = require('lodash/camelCase'); +const loaderUtils = require('loader-utils'); + +function dashesCamelCase(str) { + return str.replace(/-+(\w)/g, (match, firstLetter) => + firstLetter.toUpperCase() + ); +} + +function compileExports(result, importItemMatcher, camelCaseKeys) { + if (!Object.keys(result.exports).length) { + return ''; + } + + const exportJs = Object.keys(result.exports) + .reduce((res, key) => { + let valueAsString = JSON.stringify(result.exports[key]); + valueAsString = valueAsString.replace( + result.importItemRegExpG, + importItemMatcher + ); + function addEntry(k) { + res.push(`\t${JSON.stringify(k)}: ${valueAsString}`); + } + + let targetKey; + switch (camelCaseKeys) { + case true: + addEntry(key); + targetKey = camelCase(key); + if (targetKey !== key) { + addEntry(targetKey); + } + break; + case 'dashes': + addEntry(key); + targetKey = dashesCamelCase(key); + if (targetKey !== key) { + addEntry(targetKey); + } + break; + case 'only': + addEntry(camelCase(key)); + break; + case 'dashesOnly': + addEntry(dashesCamelCase(key)); + break; + default: + addEntry(key); + break; + } + return res; + }, []) + .join(',\n'); + + return `{\n${exportJs}\n}`; +} + +function getImportPrefix(loaderContext, query) { + if (query.importLoaders === false) { + return ''; + } + + const importLoaders = parseInt(query.importLoaders, 10) || 0; + const loadersRequest = loaderContext.loaders + .slice( + loaderContext.loaderIndex, + loaderContext.loaderIndex + 1 + importLoaders + ) + .map((x) => x.request) + .join('!'); + return `-!${loadersRequest}!`; +} + +function getLocalIdent(loaderContext, localIdentName, localName, options) { + if (!options.context) { + if (loaderContext.rootContext) { + // eslint-disable-next-line no-param-reassign + options.context = loaderContext.rootContext; + } else if ( + loaderContext.options && + typeof loaderContext.options.context === 'string' + ) { + // eslint-disable-next-line no-param-reassign + options.context = loaderContext.options.context; + } else { + // eslint-disable-next-line no-param-reassign + options.context = loaderContext.context; + } + } + const request = path.relative(options.context, loaderContext.resourcePath); + // eslint-disable-next-line no-param-reassign + options.content = `${options.hashPrefix + request}+${localName}`; + // eslint-disable-next-line no-param-reassign + localIdentName = localIdentName.replace(/\[local\]/gi, localName); + const hash = loaderUtils.interpolateName( + loaderContext, + localIdentName, + options + ); + return hash + .replace(new RegExp('[^a-zA-Z0-9\\-_\u00A0-\uFFFF]', 'g'), '-') + .replace(/^((-?[0-9])|--)/, '_$1'); +} + +module.exports = { + dashesCamelCase, + compileExports, + getImportPrefix, + getLocalIdent, +};