diff --git a/src/getClassName.js b/src/getClassName.js index a987748..57e7749 100644 --- a/src/getClassName.js +++ b/src/getClassName.js @@ -78,15 +78,27 @@ export default (styleNameValue: string, styleModuleImportMap: StyleModuleImportM return styleName; }) .map((styleName) => { + const includedStyleModuleImportMapKeys = styleModuleImportMapKeys.filter((x) => { + let shouldBeIncluded = true; + + const satisfiesInclude = x.match(new RegExp(options.include)); + if (options.include && !satisfiesInclude) shouldBeIncluded = false; + + const satisfiesExclude = x.match(new RegExp(options.exclude)); + if (options.exclude && satisfiesExclude) shouldBeIncluded = false; + + return shouldBeIncluded; + }); + if (isNamespacedStyleName(styleName)) { return getClassNameForNamespacedStyleName(styleName, styleModuleImportMap, handleMissingStyleName); } - if (styleModuleImportMapKeys.length === 0) { + if (includedStyleModuleImportMapKeys.length === 0) { throw new Error('Cannot use styleName attribute without importing at least one stylesheet.'); } - if (styleModuleImportMapKeys.length > 1) { + if (includedStyleModuleImportMapKeys.length > 1) { throw new Error('Cannot use anonymous style name with more than one stylesheet import.'); } diff --git a/src/index.js b/src/index.js index 75f7607..b4db6df 100644 --- a/src/index.js +++ b/src/index.js @@ -134,6 +134,10 @@ export default ({ return true; } + if (stats.opts.include && !getTargetResourcePath(path, stats).match(new RegExp(stats.opts.include))) { + return true; + } + return false; }; @@ -165,7 +169,9 @@ export default ({ filenameMap[filename].styleModuleImportMap[styleImportName] = requireCssModule(targetResourcePath, { context: stats.opts.context, filetypes: stats.opts.filetypes || {}, - generateScopedName: stats.opts.generateScopedName + generateScopedName: stats.opts.generateScopedName, + include: stats.opts.include, + exclude: stats.opts.exclude }); if (stats.opts.webpackHotModuleReloading) { @@ -188,6 +194,8 @@ export default ({ } const handleMissingStyleName = stats.opts && stats.opts.handleMissingStyleName || optionsDefaults.handleMissingStyleName; + const include = stats.opts && stats.opts.include || optionsDefaults.include; + const exclude = stats.opts && stats.opts.exclude || optionsDefaults.exclude; if (t.isStringLiteral(styleNameAttribute.value)) { resolveStringLiteral( @@ -195,7 +203,9 @@ export default ({ filenameMap[filename].styleModuleImportMap, styleNameAttribute, { - handleMissingStyleName + handleMissingStyleName, + include, + exclude } ); diff --git a/src/schemas/optionsSchema.json b/src/schemas/optionsSchema.json index b1319b2..aee54c8 100644 --- a/src/schemas/optionsSchema.json +++ b/src/schemas/optionsSchema.json @@ -7,6 +7,9 @@ "exclude": { "type": "string" }, + "include": { + "type": "string" + }, "filetypes": { "additionalProperties": false, "patternProperties": { diff --git a/test/fixtures/react-css-modules/include styles from react-css-modules/actual.js b/test/fixtures/react-css-modules/include styles from react-css-modules/actual.js new file mode 100644 index 0000000..8190ecc --- /dev/null +++ b/test/fixtures/react-css-modules/include styles from react-css-modules/actual.js @@ -0,0 +1,4 @@ +import './bar.module.css'; +import './not_me.css'; + +
; diff --git a/test/fixtures/react-css-modules/include styles from react-css-modules/bar.module.css b/test/fixtures/react-css-modules/include styles from react-css-modules/bar.module.css new file mode 100644 index 0000000..6b087b6 --- /dev/null +++ b/test/fixtures/react-css-modules/include styles from react-css-modules/bar.module.css @@ -0,0 +1 @@ +.a {} diff --git a/test/fixtures/react-css-modules/include styles from react-css-modules/expected.js b/test/fixtures/react-css-modules/include styles from react-css-modules/expected.js new file mode 100644 index 0000000..7cb6dd9 --- /dev/null +++ b/test/fixtures/react-css-modules/include styles from react-css-modules/expected.js @@ -0,0 +1,4 @@ +import './bar.module.css'; +import './not_me.css'; + +
; diff --git a/test/fixtures/react-css-modules/include styles from react-css-modules/not_me.css b/test/fixtures/react-css-modules/include styles from react-css-modules/not_me.css new file mode 100644 index 0000000..89b44e3 --- /dev/null +++ b/test/fixtures/react-css-modules/include styles from react-css-modules/not_me.css @@ -0,0 +1 @@ +.other {} diff --git a/test/fixtures/react-css-modules/include styles from react-css-modules/options.json b/test/fixtures/react-css-modules/include styles from react-css-modules/options.json new file mode 100644 index 0000000..d8940b3 --- /dev/null +++ b/test/fixtures/react-css-modules/include styles from react-css-modules/options.json @@ -0,0 +1,11 @@ +{ + "plugins": [ + [ + "../../../../src", + { + "generateScopedName": "[name]__[local]", + "include": "\\.module\\.css" + } + ] + ] +}