@@ -2,6 +2,8 @@ import cssLoader from 'css-loader';
2
2
import cssLocalsLoader from 'css-loader/locals' ;
3
3
import loaderUtils from 'loader-utils' ;
4
4
import {
5
+ filterNonWordClasses ,
6
+ generateNamedExports ,
5
7
generateGenericExportInterface ,
6
8
filenameToTypingsFilename ,
7
9
} from './cssModuleToInterface' ;
@@ -27,13 +29,25 @@ module.exports = function(input) {
27
29
28
30
// mock async step 2 - offer css loader a "fake" callback
29
31
this . async = ( ) => ( err , content ) => {
30
- const requestedResource = this . resourcePath ;
31
- const cssModuleInterfaceFilename = filenameToTypingsFilename ( requestedResource ) ;
32
+ const filename = this . resourcePath ;
33
+ const cssModuleInterfaceFilename = filenameToTypingsFilename ( filename ) ;
32
34
33
35
let cssModuleKeys = Object . keys ( this . exec ( content , this . resource ) ) ;
34
36
35
- const cssModuleInterface = generateGenericExportInterface ( cssModuleKeys , requestedResource ) ;
36
- persist . writeToFileIfChanged ( cssModuleInterfaceFilename , cssModuleInterface ) ;
37
+ let cssModuleDefinition ;
38
+ if ( ! query . namedExport ) {
39
+ cssModuleDefinition = generateGenericExportInterface ( cssModuleKeys , filename ) ;
40
+ } else {
41
+ const [ cleanedDefinitions , skippedDefinitions ] = filterNonWordClasses ( cssModuleKeys ) ;
42
+ if ( skippedDefinitions . length > 0 && ! query . camelCase ) {
43
+ console . warn ( `Typings for CSS-Modules: option 'namedExport' was set but 'camelCase' for the css-loader not.
44
+ The following classes will not be available as named exports:
45
+ ${ skippedDefinitions . map ( sd => ` - "${ sd } "` ) . join ( '\n' ) }
46
+ ` )
47
+ }
48
+ cssModuleDefinition = generateNamedExports ( cleanedDefinitions ) ;
49
+ }
50
+ persist . writeToFileIfChanged ( cssModuleInterfaceFilename , cssModuleDefinition ) ;
37
51
// mock async step 3 - make `async` return the actual callback again before calling the 'real' css-loader
38
52
delegateToCssLoader ( this , input , callback ) ;
39
53
} ;
0 commit comments