File tree 4 files changed +103
-0
lines changed
4 files changed +103
-0
lines changed Original file line number Diff line number Diff line change
1
+ const path = require ( 'path' )
2
+ const parseFilename = require ( '../utils/parse-filename' )
3
+ const getExportedName = require ( '../utils/get-exported-name' )
4
+ const isIgnoredFilename = require ( '../utils/is-ignored-filename' )
5
+
6
+ module . exports = {
7
+ meta : {
8
+ type : 'problem' ,
9
+ docs : {
10
+ description : 'ensure filenames match a regex naming convention' ,
11
+ url : require ( '../url' ) ( module ) ,
12
+ } ,
13
+ schema : {
14
+ type : 'array' ,
15
+ minItems : 1 ,
16
+ maxItems : 2 ,
17
+ items : [
18
+ {
19
+ type : 'string' ,
20
+ } ,
21
+ ] ,
22
+ } ,
23
+ } ,
24
+
25
+ create ( context ) {
26
+ const defaultRegexp = / ^ ( [ a - z 0 - 9 ] + ) ( [ A - Z ] [ a - z 0 - 9 ] + ) * $ / g
27
+ const conventionRegexp = context . options [ 0 ] ? new RegExp ( context . options [ 0 ] ) : defaultRegexp
28
+ const ignoreExporting = context . options [ 1 ] ? context . options [ 1 ] : false
29
+
30
+ return {
31
+ Program ( node ) {
32
+ const filename = context . getFilename ( )
33
+ const absoluteFilename = path . resolve ( filename )
34
+ const parsed = parseFilename ( absoluteFilename )
35
+ const shouldIgnore = isIgnoredFilename ( filename )
36
+ const isExporting = Boolean ( getExportedName ( node ) )
37
+ const matchesRegex = conventionRegexp . test ( parsed . name )
38
+
39
+ if ( shouldIgnore ) return
40
+ if ( ignoreExporting && isExporting ) return
41
+ if ( ! matchesRegex ) {
42
+ context . report ( node , "Filename '{{name}}' does not match the regex naming convention." , {
43
+ name : parsed . base ,
44
+ } )
45
+ }
46
+ } ,
47
+ }
48
+ } ,
49
+ }
Original file line number Diff line number Diff line change
1
+ function getNodeName ( node , options ) {
2
+ const op = options || [ ]
3
+
4
+ if ( node . type === 'Identifier' ) {
5
+ return node . name
6
+ }
7
+
8
+ if ( node . id && node . id . type === 'Identifier' ) {
9
+ return node . id . name
10
+ }
11
+
12
+ if ( op [ 2 ] && node . type === 'CallExpression' && node . callee . type === 'Identifier' ) {
13
+ return node . callee . name
14
+ }
15
+ }
16
+
17
+ module . exports = function getExportedName ( programNode , options ) {
18
+ for ( let i = 0 ; i < programNode . body . length ; i += 1 ) {
19
+ const node = programNode . body [ i ]
20
+
21
+ if ( node . type === 'ExportDefaultDeclaration' ) {
22
+ return getNodeName ( node . declaration , options )
23
+ }
24
+
25
+ if (
26
+ node . type === 'ExpressionStatement' &&
27
+ node . expression . type === 'AssignmentExpression' &&
28
+ node . expression . left . type === 'MemberExpression' &&
29
+ node . expression . left . object . type === 'Identifier' &&
30
+ node . expression . left . object . name === 'module' &&
31
+ node . expression . left . property . type === 'Identifier' &&
32
+ node . expression . left . property . name === 'exports'
33
+ ) {
34
+ return getNodeName ( node . expression . right , options )
35
+ }
36
+ }
37
+ }
Original file line number Diff line number Diff line change
1
+ const ignoredFilenames = [ '<text>' , '<input>' ]
2
+
3
+ module . exports = function isIgnoredFilename ( filename ) {
4
+ return ignoredFilenames . indexOf ( filename ) !== - 1
5
+ }
Original file line number Diff line number Diff line change
1
+ const path = require ( 'path' )
2
+
3
+ module . exports = function parseFilename ( filename ) {
4
+ const ext = path . extname ( filename )
5
+
6
+ return {
7
+ dir : path . dirname ( filename ) ,
8
+ base : path . basename ( filename ) ,
9
+ ext,
10
+ name : path . basename ( filename , ext ) ,
11
+ }
12
+ }
You can’t perform that action at this time.
0 commit comments