@@ -17,7 +17,7 @@ const getTypeMismatchError = ({ filename, expected, actual }) => {
17
17
return new Error (
18
18
`Generated type declaration file is outdated. Run webpack and commit the updated type declaration for '${ filename } '\n\n${ diff } `
19
19
) ;
20
- }
20
+ } ;
21
21
22
22
const cssModuleToNamedExports = cssModuleKeys => {
23
23
return cssModuleKeys
@@ -35,8 +35,21 @@ const filenameToTypingsFilename = filename => {
35
35
36
36
const validModes = [ 'emit' , 'verify' ] ;
37
37
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
+
38
51
module . exports = function ( content , ...rest ) {
39
- const callback = this . async ( ) ;
52
+ const { failed , success } = makeDoneHandlers ( this . async ( ) , content , rest ) ;
40
53
41
54
const filename = this . resourcePath ;
42
55
const { mode = 'emit' } = loaderUtils . getOptions ( this ) || { } ;
@@ -45,6 +58,7 @@ module.exports = function(content, ...rest) {
45
58
}
46
59
47
60
const cssModuleInterfaceFilename = filenameToTypingsFilename ( filename ) ;
61
+ const { read, write } = makeFileHandlers ( cssModuleInterfaceFilename ) ;
48
62
49
63
const keyRegex = / " ( [ ^ \\ " ] + ) " : / g;
50
64
let match ;
@@ -61,43 +75,44 @@ module.exports = function(content, ...rest) {
61
75
) } `;
62
76
63
77
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 ( {
80
94
filename : cssModuleInterfaceFilename ,
81
95
expected : cssModuleDefinition ,
82
96
actual : fileContents
83
- } ) ) ;
84
- }
85
-
86
- return callback ( null , content , ...rest ) ;
97
+ } )
98
+ ) ;
87
99
}
88
- ) ;
100
+
101
+ return success ( ) ;
102
+ } ) ;
89
103
} 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 ( ) ;
100
115
}
101
- ) ;
116
+ } ) ;
102
117
}
103
118
} ;
0 commit comments