@@ -17,7 +17,7 @@ const getTypeMismatchError = ({ filename, expected, actual }) => {
1717 return new Error (
1818 `Generated type declaration file is outdated. Run webpack and commit the updated type declaration for '${ filename } '\n\n${ diff } `
1919 ) ;
20- }
20+ } ;
2121
2222const cssModuleToNamedExports = cssModuleKeys => {
2323 return cssModuleKeys
@@ -35,8 +35,21 @@ const filenameToTypingsFilename = filename => {
3535
3636const validModes = [ 'emit' , 'verify' ] ;
3737
38+ const isFileNotFound = err => err && err . code === 'ENOENT' ;
39+
40+ const makeDoneHandlers = ( callback , content , rest ) => ( {
41+ failed : e => callback ( e ) ,
42+ success : ( ) => callback ( null , content , ...rest )
43+ } ) ;
44+
45+ const makeFileHandlers = filename => ( {
46+ read : handler => fs . readFile ( filename , { encoding : 'utf-8' } , handler ) ,
47+ write : ( content , handler ) =>
48+ fs . writeFile ( filename , content , { encoding : 'utf-8' } , handler )
49+ } ) ;
50+
3851module . exports = function ( content , ...rest ) {
39- const callback = this . async ( ) ;
52+ const { failed , success } = makeDoneHandlers ( this . async ( ) , content , rest ) ;
4053
4154 const filename = this . resourcePath ;
4255 const { mode = 'emit' } = loaderUtils . getOptions ( this ) || { } ;
@@ -45,6 +58,7 @@ module.exports = function(content, ...rest) {
4558 }
4659
4760 const cssModuleInterfaceFilename = filenameToTypingsFilename ( filename ) ;
61+ const { read, write } = makeFileHandlers ( cssModuleInterfaceFilename ) ;
4862
4963 const keyRegex = / " ( [ ^ \\ " ] + ) " : / g;
5064 let match ;
@@ -61,43 +75,44 @@ module.exports = function(content, ...rest) {
6175 ) } `;
6276
6377 if ( mode === 'verify' ) {
64- fs . readFile (
65- cssModuleInterfaceFilename ,
66- { encoding : 'utf-8' } ,
67- ( err , fileContents ) => {
68- if ( err ) {
69- const error =
70- err . code === 'ENOENT'
71- ? getNoDeclarationFileError ( {
72- filename : cssModuleInterfaceFilename
73- } )
74- : err ;
75- return callback ( error ) ;
76- }
77-
78- if ( cssModuleDefinition !== fileContents ) {
79- return callback ( getTypeMismatchError ( {
78+ read ( ( err , fileContents ) => {
79+ if ( isFileNotFound ( err ) ) {
80+ return failed (
81+ getNoDeclarationFileError ( {
82+ filename : cssModuleInterfaceFilename
83+ } )
84+ ) ;
85+ }
86+
87+ if ( err ) {
88+ return failed ( err ) ;
89+ }
90+
91+ if ( cssModuleDefinition !== fileContents ) {
92+ return failed (
93+ getTypeMismatchError ( {
8094 filename : cssModuleInterfaceFilename ,
8195 expected : cssModuleDefinition ,
8296 actual : fileContents
83- } ) ) ;
84- }
85-
86- return callback ( null , content , ...rest ) ;
97+ } )
98+ ) ;
8799 }
88- ) ;
100+
101+ return success ( ) ;
102+ } ) ;
89103 } else {
90- fs . writeFile (
91- cssModuleInterfaceFilename ,
92- cssModuleDefinition ,
93- { encoding : 'utf-8' } ,
94- err => {
95- if ( err ) {
96- return callback ( err ) ;
97- } else {
98- return callback ( null , content , ...rest ) ;
99- }
104+ read ( ( _ , fileContents ) => {
105+ if ( cssModuleDefinition !== fileContents ) {
106+ write ( cssModuleDefinition , err => {
107+ if ( err ) {
108+ failed ( err ) ;
109+ } else {
110+ success ( ) ;
111+ }
112+ } ) ;
113+ } else {
114+ success ( ) ;
100115 }
101- ) ;
116+ } ) ;
102117 }
103118} ;
0 commit comments