@@ -12,6 +12,7 @@ import type {
12
12
GlobPatternWithOptionalRoot ,
13
13
PathInterface ,
14
14
} from './GlobMatcherTypes.js' ;
15
+ import { fileURLToPath } from 'node:url' ;
15
16
16
17
const defaultCwdWin32 = 'C:\\user\\home\\project\\testing' ;
17
18
const defaultCwdPosix = '/user/home/project/testing' ;
@@ -26,6 +27,8 @@ const pathPosix: PathInterface = {
26
27
resolve : ( ...paths ) => path . posix . resolve ( defaultCwdPosix , ...paths ) ,
27
28
} ;
28
29
30
+ const __filename = fileURLToPath ( import . meta. url ) ;
31
+
29
32
const pathNames = new Map ( [
30
33
[ pathWin32 , 'Win32' ] ,
31
34
[ pathPosix , 'Posix' ] ,
@@ -55,34 +58,37 @@ describe('Validate assumptions', () => {
55
58
56
59
describe ( 'Validate Micromatch assumptions' , ( ) => {
57
60
test . each `
58
- glob | filename | expectedToMatch
59
- ${ '*.json' } | ${ 'settings.json' } | ${ true }
60
- ${ '*.json' } | ${ '/settings.json' } | ${ false }
61
- ${ '*.json' } | ${ 'src/settings.json' } | ${ false }
62
- ${ '*.json' } | ${ '/src/settings.json' } | ${ false }
63
- ${ '**/*.json' } | ${ 'settings.json' } | ${ true }
64
- ${ '**/*.json' } | ${ '/settings.json' } | ${ true }
65
- ${ '**/*.json' } | ${ 'src/settings.json' } | ${ true }
66
- ${ '**/*.json' } | ${ '/src/settings.json' } | ${ true }
67
- ${ '**/temp' } | ${ '/src/temp/data.json' } | ${ false }
68
- ${ '**/temp/' } | ${ '/src/temp/data.json' } | ${ false }
69
- ${ '**/temp/**' } | ${ '/src/temp/data.json' } | ${ true }
70
- ${ 'src/*.json' } | ${ 'src/settings.json' } | ${ true }
71
- ${ '**/{*.json,*.json/**}' } | ${ 'settings.json' } | ${ true }
72
- ${ '**/{*.json,*.json/**}' } | ${ '/settings.json' } | ${ true }
73
- ${ '**/{*.json,*.json/**}' } | ${ 'src/settings.json' } | ${ true }
74
- ${ '**/{*.json,*.json/**}' } | ${ 'src/settings.json/config' } | ${ true }
75
- ${ '**/{*.json,*.json/**}' } | ${ 'settings.json/config' } | ${ true }
76
- ${ 'src/*.{test,spec}.ts' } | ${ 'src/code.test.ts' } | ${ true }
77
- ${ 'src/*.(test|spec).ts' } | ${ 'src/code.test.ts' } | ${ true }
78
- ${ 'src/*.(test|spec).ts' } | ${ 'src/code.spec.ts' } | ${ true }
79
- ${ 'src/*.(test|spec).ts' } | ${ 'src/deep.code.test.ts' } | ${ true }
80
- ${ 'src/*.(test|spec).ts' } | ${ 'src/test.ts' } | ${ false }
61
+ glob | filename | expectedToMatch
62
+ ${ '*.json' } | ${ 'settings.json' } | ${ true }
63
+ ${ '*.json' } | ${ '/settings.json' } | ${ false }
64
+ ${ '*.json' } | ${ 'src/settings.json' } | ${ false }
65
+ ${ '*.json' } | ${ '/src/settings.json' } | ${ false }
66
+ ${ '**/*.json' } | ${ 'settings.json' } | ${ true }
67
+ ${ '**/*.json' } | ${ '/settings.json' } | ${ true }
68
+ ${ '**/*.json' } | ${ 'src/settings.json' } | ${ true }
69
+ ${ '**/*.json' } | ${ '/src/settings.json' } | ${ true }
70
+ ${ '**/temp' } | ${ '/src/temp/data.json' } | ${ false }
71
+ ${ '**/temp/' } | ${ '/src/temp/data.json' } | ${ false }
72
+ ${ '**/temp/**' } | ${ '/src/temp/data.json' } | ${ true }
73
+ ${ 'src/*.json' } | ${ 'src/settings.json' } | ${ true }
74
+ ${ '**/{*.json,*.json/**}' } | ${ 'settings.json' } | ${ true }
75
+ ${ '**/{*.json,*.json/**}' } | ${ '/settings.json' } | ${ true }
76
+ ${ '**/{*.json,*.json/**}' } | ${ 'src/settings.json' } | ${ true }
77
+ ${ '**/{*.json,*.json/**}' } | ${ 'src/settings.json/config' } | ${ true }
78
+ ${ '**/{*.json,*.json/**}' } | ${ 'settings.json/config' } | ${ true }
79
+ ${ 'src/*.{test,spec}.ts' } | ${ 'src/code.test.ts' } | ${ true }
80
+ ${ 'src/*.(test|spec).ts' } | ${ 'src/code.test.ts' } | ${ true }
81
+ ${ 'src/*.(test|spec).ts' } | ${ 'src/code.spec.ts' } | ${ true }
82
+ ${ 'src/*.(test|spec).ts' } | ${ 'src/deep.code.test.ts' } | ${ true }
83
+ ${ 'src/*.(test|spec).ts' } | ${ 'src/test.ts' } | ${ false }
84
+ ${ filenameToGlob ( __filename , 1 ) } | ${ __filename } | ${ true }
85
+ ${ filenameToGlob ( __filename , 2 ) } | ${ __filename } | ${ true }
81
86
` (
82
87
`Micromatch glob: '$glob', filename: '$filename' expected: $expectedToMatch` ,
83
88
( { glob, filename, expectedToMatch } ) => {
84
- const reg1 = mm . makeRe ( glob ) ;
85
- expect ( reg1 . test ( filename ) ) . toEqual ( expectedToMatch ) ;
89
+ const reg = mm . makeRe ( glob ) ;
90
+ expect ( reg . test ( filename ) ) . toEqual ( expectedToMatch ) ;
91
+ expect ( mm . isMatch ( filename , glob , { windows : path . sep === '\\' } ) ) . toBe ( expectedToMatch ) ;
86
92
} ,
87
93
) ;
88
94
} ) ;
@@ -123,6 +129,14 @@ function resolveFilename(pathInstance: PathInterface, filename: string | undefin
123
129
} ) ;
124
130
} ) ;
125
131
132
+ describe ( 'Validate GlobMatcher on Windows' , ( ) => {
133
+ test ( 'Make sure it works on Windows' , ( ) => {
134
+ const glob = filenameToGlob ( __filename , 3 ) ;
135
+ const matcher = new GlobMatcher ( glob ) ;
136
+ expect ( matcher . match ( __filename ) ) . toBe ( true ) ;
137
+ } ) ;
138
+ } ) ;
139
+
126
140
describe ( 'Tests .gitignore file contents' , ( ) => {
127
141
const pattern = `
128
142
# This is a comment
@@ -692,3 +706,8 @@ function resolvePattern(p: GlobPattern | GlobPattern[], path: PathInterface): Gl
692
706
root : path . resolve ( p . root ) ,
693
707
} ;
694
708
}
709
+
710
+ function filenameToGlob ( filename : string , segments : number = 1 ) {
711
+ const parts = filename . split ( path . sep ) . slice ( - segments ) . join ( '/' ) ;
712
+ return '**/' + parts ;
713
+ }
0 commit comments