11const { isDataFile, isTemplateFile } = require ( './contentModelHelpers' )
22
3- const logicFnMap = {
4- 'or' : 'some' ,
5- 'and' : 'every'
6- }
7-
83const matcha = {
94 helpers : { }
105}
116
127matcha . helpers . computeOptions = ( options , fsNode ) => {
138 const result = { }
149 if ( options . nameOptions ) {
10+ result . nameOptions = options . nameOptions
1511 if ( typeof options . nameOptions === 'function' ) {
1612 result . nameOptions = options . nameOptions ( fsNode )
1713 }
18- result . nameOptions = options . nameOptions
1914 }
2015 return result
2116}
2217
2318matcha . true = ( ) => fsNode => true
2419matcha . false = ( ) => fsNode => false
2520
26- matcha . either = ( ...matchers ) => {
27- return {
28- logic : 'or' ,
29- matchers
21+ matcha . either = ( ...matchers ) => ( fsNode ) => {
22+ if ( Array . isArray ( fsNode ) ) {
23+ return matchers . some ( matcher => fsNode . some ( matcher ) )
3024 }
25+ return matchers . some ( matcher => matcher ( fsNode ) )
3126}
3227
33- matcha . and = ( ...matchers ) => {
34- return {
35- logic : 'and' ,
36- matchers
28+ matcha . and = ( ...matchers ) => ( fsNode ) => {
29+ if ( Array . isArray ( fsNode ) ) {
30+ return matchers . every ( matcher => fsNode . some ( matcher ) )
3731 }
32+ return matchers . every ( matcher => matcher ( fsNode ) )
3833}
3934
4035matcha . directory = ( options = { } ) => {
@@ -56,12 +51,15 @@ matcha.directory = (options = {}) => {
5651
5752 let childrenMatch = true
5853 if ( options . children ) {
59- const logicFn = logicFnMap [ options . children . logic || 'and' ]
60- const matchers = options . children . matchers || options . children
61- childrenMatch = matchers [ logicFn ] ( childMatcher => {
62- return fsNode . children . some ( childMatcher )
63- } )
54+ if ( typeof options . children === 'function' ) {
55+ childrenMatch = options . children ( fsNode . children )
56+ } else {
57+ childrenMatch = options . children . every ( childMatcher => {
58+ return fsNode . children . some ( childMatcher )
59+ } )
60+ }
6461 }
62+
6563 if ( childrenMatch ) {
6664 return true
6765 }
@@ -78,51 +76,48 @@ matcha.directory = (options = {}) => {
7876 return recursionMatch
7977 }
8078}
79+
8180matcha . dataFile = ( options = { } ) => {
8281 return ( fsNode ) => {
8382 const { nameOptions } = matcha . helpers . computeOptions ( options , fsNode )
8483 return (
85- isDataFile ( fsNode ) &&
86- fsNode . name . match (
87- new RegExp ( `^(${ nameOptions . join ( '|' ) } )\\..+$` )
84+ isDataFile ( fsNode ) && (
85+ ! nameOptions || fsNode . name . match (
86+ new RegExp ( `^(${ nameOptions . join ( '|' ) } )\\..+$` )
87+ )
8888 )
8989 )
9090 }
9191}
9292
93- matcha . indexFile = ( options = { } ) => {
93+ matcha . templateFile = ( options = { } ) => {
9494 return ( fsNode ) => {
9595 const { nameOptions } = matcha . helpers . computeOptions ( options , fsNode )
9696 return (
97- isTemplateFile ( fsNode ) &&
98- fsNode . name . match (
99- new RegExp ( `^(${ nameOptions . join ( '|' ) } )\\..+$` )
97+ isTemplateFile ( fsNode ) && (
98+ ! nameOptions || fsNode . name . match (
99+ new RegExp ( `^(${ nameOptions . join ( '|' ) } )\\..+$` )
100+ )
100101 )
101102 )
102103 }
103104}
104105
105106matcha . folderable = ( options = { } ) => {
106107 return ( fsNode ) => {
107- const { nameOptions } = matcha . helpers . computeOptions ( options , fsNode )
108- return isTemplateFile ( fsNode ) || fsNode . children ?. find (
109- matcha . indexFile ( {
110- nameOptions : nameOptions . index
111- } )
112- )
113- }
114- }
115-
116- matcha . namedFolderable = ( options = { } ) => {
117- return fsNode => {
118- const { nameOptions } = matcha . helpers . computeOptions ( options , fsNode )
119- const namedFile = matcha . indexFile ( {
120- nameOptions : nameOptions . index
121- } ) ( fsNode )
122- return namedFile || matcha . directory ( {
108+ const { nameOptions = { } } = matcha . helpers . computeOptions ( options , fsNode )
109+ const standaloneFileMatcher = matcha . templateFile ( {
110+ nameOptions : nameOptions . standalone
111+ } )
112+ const indexedDirectoryMatcher = matcha . directory ( {
123113 nameOptions : nameOptions . folder ,
124- children : [ namedFile ]
125- } ) ( fsNode )
114+ children : [
115+ matcha . templateFile ( {
116+ nameOptions : nameOptions . index
117+ } )
118+ ]
119+ } )
120+ return standaloneFileMatcher ( fsNode ) || indexedDirectoryMatcher ( fsNode )
126121 }
127122}
128123
0 commit comments