diff --git a/packages/jest-haste-map/package.json b/packages/jest-haste-map/package.json index 76e34ab3ea23..22df1b8907ca 100644 --- a/packages/jest-haste-map/package.json +++ b/packages/jest-haste-map/package.json @@ -16,6 +16,7 @@ "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.4", + "jest-regex-util": "^26.0.0", "jest-serializer": "^26.1.0", "jest-util": "^26.1.0", "jest-worker": "^26.1.0", diff --git a/packages/jest-haste-map/src/__tests__/index.test.js b/packages/jest-haste-map/src/__tests__/index.test.js index 5d67e670dcde..1135360eb698 100644 --- a/packages/jest-haste-map/src/__tests__/index.test.js +++ b/packages/jest-haste-map/src/__tests__/index.test.js @@ -294,6 +294,45 @@ describe('HasteMap', () => { }); }); + it('ignores vcs directories without ignore pattern', () => { + mockFs['/project/fruits/.git/fruit-history.js'] = ` + // test + `; + return new HasteMap(defaultConfig).build().then(({hasteFS}) => { + expect(hasteFS.matchFiles('.git')).toEqual([]); + }); + }); + + it('ignores vcs directories with ignore pattern regex', () => { + const config = {...defaultConfig, ignorePattern: /Kiwi/}; + mockFs['/project/fruits/Kiwi.js'] = ` + // Kiwi! + `; + + mockFs['/project/fruits/.git/fruit-history.js'] = ` + // test + `; + return new HasteMap(config).build().then(({hasteFS}) => { + expect(hasteFS.matchFiles(/Kiwi/)).toEqual([]); + expect(hasteFS.matchFiles('.git')).toEqual([]); + }); + }); + + it('ignores vcs directories with ignore pattern function', () => { + const config = {...defaultConfig, ignorePattern: f => /Kiwi/.test(f)}; + mockFs['/project/fruits/Kiwi.js'] = ` + // Kiwi! + `; + + mockFs['/project/fruits/.git/fruit-history.js'] = ` + // test + `; + return new HasteMap(config).build().then(({hasteFS}) => { + expect(hasteFS.matchFiles(/Kiwi/)).toEqual([]); + expect(hasteFS.matchFiles('.git')).toEqual([]); + }); + }); + it('builds a haste map on a fresh cache', () => { // Include these files in the map mockFs['/project/fruits/node_modules/react/React.js'] = ` diff --git a/packages/jest-haste-map/src/index.ts b/packages/jest-haste-map/src/index.ts index 572164a4bbf2..e333e5b9ef85 100644 --- a/packages/jest-haste-map/src/index.ts +++ b/packages/jest-haste-map/src/index.ts @@ -113,6 +113,7 @@ const CHANGE_INTERVAL = 30; const MAX_WAIT_TIME = 240000; const NODE_MODULES = path.sep + 'node_modules' + path.sep; const PACKAGE_JSON = path.sep + 'package.json'; +const VCS_DIRECTORIES = ['.git', '.hg'].map(vcs => '/' + vcs + '/').join('|'); // TypeScript doesn't like us importing from outside `rootDir`, but it doesn't // understand `require`. @@ -233,7 +234,6 @@ class HasteMap extends EventEmitter { extensions: options.extensions, forceNodeFilesystemAPI: !!options.forceNodeFilesystemAPI, hasteImplModulePath: options.hasteImplModulePath, - ignorePattern: options.ignorePattern, maxWorkers: options.maxWorkers, mocksPattern: options.mocksPattern ? new RegExp(options.mocksPattern) @@ -250,11 +250,26 @@ class HasteMap extends EventEmitter { watch: !!options.watch, }; this._console = options.console || global.console; - if (options.ignorePattern && !(options.ignorePattern instanceof RegExp)) { - this._console.warn( - 'jest-haste-map: the `ignorePattern` options as a function is being ' + - 'deprecated. Provide a RegExp instead. See https://github.com/facebook/jest/pull/4063.', - ); + + if (options.ignorePattern) { + if (options.ignorePattern instanceof RegExp) { + this._options.ignorePattern = new RegExp( + options.ignorePattern.source.concat('|' + VCS_DIRECTORIES), + options.ignorePattern.flags, + ); + } else { + const ignorePattern = options.ignorePattern; + const vcsIgnoreRegExp = new RegExp(VCS_DIRECTORIES); + this._options.ignorePattern = (filePath: string) => + vcsIgnoreRegExp.test(filePath) || ignorePattern(filePath); + + this._console.warn( + 'jest-haste-map: the `ignorePattern` options as a function is being ' + + 'deprecated. Provide a RegExp instead. See https://github.com/facebook/jest/pull/4063.', + ); + } + } else { + this._options.ignorePattern = new RegExp(VCS_DIRECTORIES); } const rootDirHash = createHash('md5').update(options.rootDir).digest('hex'); diff --git a/packages/jest-haste-map/tsconfig.json b/packages/jest-haste-map/tsconfig.json index 8290de687869..f945d5e82cc1 100644 --- a/packages/jest-haste-map/tsconfig.json +++ b/packages/jest-haste-map/tsconfig.json @@ -7,6 +7,7 @@ "references": [ {"path": "../jest-worker"}, {"path": "../jest-serializer"}, + {"path": "../jest-regex-util"}, {"path": "../jest-util"}, {"path": "../jest-types"} ] diff --git a/yarn.lock b/yarn.lock index 42b35e08e785..0e2c65f6a462 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,7 +3,7 @@ __metadata: version: 4 - cacheKey: 5 + cacheKey: 6 "@angular/common@npm:^10.0.2": version: 10.0.2 @@ -11213,6 +11213,7 @@ fsevents@^1.2.7: fb-watchman: ^2.0.0 fsevents: ^2.1.2 graceful-fs: ^4.2.4 + jest-regex-util: ^26.0.0 jest-serializer: ^26.1.0 jest-util: ^26.1.0 jest-worker: ^26.1.0