1
1
module . exports = ( api , { lintOnSave } ) => {
2
2
if ( lintOnSave ) {
3
3
const extensions = require ( './eslintOptions' ) . extensions ( api )
4
+ const cacheIdentifier = genCacheIdentifier ( api . resolve ( '.' ) )
5
+
4
6
api . chainWebpack ( webpackConfig => {
5
7
webpackConfig . module
6
8
. rule ( 'eslint' )
@@ -14,6 +16,8 @@ module.exports = (api, { lintOnSave }) => {
14
16
. loader ( 'eslint-loader' )
15
17
. options ( {
16
18
extensions,
19
+ cache : true ,
20
+ cacheIdentifier,
17
21
emitWarning : lintOnSave !== 'error' ,
18
22
formatter : require ( 'eslint/lib/formatters/codeframe' )
19
23
} )
@@ -34,3 +38,33 @@ module.exports = (api, { lintOnSave }) => {
34
38
require ( './lint' ) ( args , api )
35
39
} )
36
40
}
41
+
42
+ // eslint-loader doesn't bust cache when eslint config changes
43
+ // so we have to manually generate a cache identifier that takes the config
44
+ // into account.
45
+ function genCacheIdentifier ( context ) {
46
+ const fs = require ( 'fs' )
47
+ const path = require ( 'path' )
48
+ const files = [
49
+ '.eslintrc.js' ,
50
+ '.eslintrc.yaml' ,
51
+ '.eslintrc.yml' ,
52
+ '.eslintrc.json' ,
53
+ '.eslintrc' ,
54
+ 'package.json'
55
+ ]
56
+
57
+ const configTimeStamp = ( ( ) => {
58
+ for ( const file of files ) {
59
+ if ( fs . existsSync ( path . join ( context , file ) ) ) {
60
+ return fs . statSync ( file ) . mtimeMs
61
+ }
62
+ }
63
+ } ) ( )
64
+
65
+ return JSON . stringify ( {
66
+ 'eslint-loader' : require ( 'eslint-loader/package.json' ) . version ,
67
+ 'eslint' : require ( 'eslint/package.json' ) . version ,
68
+ 'config' : configTimeStamp
69
+ } )
70
+ }
0 commit comments