diff --git a/react-packager/src/node-haste/__tests__/DependencyGraph-test.js b/react-packager/src/node-haste/__tests__/DependencyGraph-test.js index 131c06c3..9341c3cc 100644 --- a/react-packager/src/node-haste/__tests__/DependencyGraph-test.js +++ b/react-packager/src/node-haste/__tests__/DependencyGraph-test.js @@ -8,104 +8,13 @@ */ 'use strict'; -jest.autoMockOff(); +jest.disableAutomock(); jest.useRealTimers(); jest .mock('fs') .mock('../../Logger') .mock('../../lib/TransformCache'); -// This is an ugly hack: -// * jest-haste-map uses `find` for fast file system crawling which won't work -// when we mock the file system in node. This mock copies the node crawler's -// implementation and always falls back to the node crawling mechanism. -// Ideally we'll make this an option in jest-haste-map to force it to use -// the node crawler. -jest.mock('jest-haste-map/build/crawlers/node', () => { - const H = require('jest-haste-map/build/constants'); - - const fs = require('fs'); - const path = require('path'); - - function find( - roots, - extensions, - ignore, - callback) - { - const result = []; - let activeCalls = 0; - - function search(directory) { - activeCalls++; - fs.readdir(directory, (err, names) => { - activeCalls--; - - names.forEach(file => { - file = path.join(directory, file); - if (ignore(file)) { - return; - } - activeCalls++; - - fs.lstat(file, (err, stat) => { - activeCalls--; - - if (!err && stat && !stat.isSymbolicLink()) { - if (stat.isDirectory()) { - search(file); - } else { - const ext = path.extname(file).substr(1); - if (extensions.indexOf(ext) !== -1) { - result.push([file, stat.mtime.getTime()]); - } - } - } - if (activeCalls === 0) { - callback(result); - } - }); - }); - - if (activeCalls === 0) { - callback(result); - } - }); - } - - roots.forEach(search); - } - - return function nodeCrawl( - roots, - extensions, - ignore, - data) - { - return new Promise(resolve => { - const callback = list => { - const files = Object.create(null); - list.forEach(fileData => { - const name = fileData[0]; - const mtime = fileData[1]; - const existingFile = data.files[name]; - if (existingFile && existingFile[H.MTIME] === mtime) { - files[name] = existingFile; - } else { - // See ../constants.js - files[name] = ['', mtime, 0, []]; - } - }); - data.files = files; - resolve(data); - }; - - find(roots, extensions, ignore, callback); - }); - }; - -}); - const mocksPattern = /(?:[\\/]|^)__mocks__[\\/]([^\/]+)\.js$/; jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; @@ -192,6 +101,7 @@ describe('DependencyGraph', function() { assetExts: ['png', 'jpg'], cache: new Cache(), fileWatcher, + forceNodeFilesystemAPI: true, providesModuleNodeModules: [ 'haste-fbjs', 'react-haste', diff --git a/react-packager/src/node-haste/index.js b/react-packager/src/node-haste/index.js index 9d1e7fb4..22fa89ba 100644 --- a/react-packager/src/node-haste/index.js +++ b/react-packager/src/node-haste/index.js @@ -55,6 +55,7 @@ class DependencyGraph { roots: Array, ignoreFilePath: (filePath: string) => boolean, fileWatcher: FileWatcher, + forceNodeFilesystemAPI: boolean, assetRoots_DEPRECATED: Array, assetExts: Array, providesModuleNodeModules: mixed, @@ -88,6 +89,7 @@ class DependencyGraph { roots, ignoreFilePath, fileWatcher, + forceNodeFilesystemAPI, assetRoots_DEPRECATED, assetExts, providesModuleNodeModules, @@ -112,6 +114,7 @@ class DependencyGraph { roots: Array, ignoreFilePath: (filePath: string) => boolean, fileWatcher: FileWatcher, + forceNodeFilesystemAPI?: boolean, assetRoots_DEPRECATED: Array, assetExts: Array, providesModuleNodeModules: mixed, @@ -136,6 +139,7 @@ class DependencyGraph { roots, ignoreFilePath: ignoreFilePath || (() => {}), fileWatcher, + forceNodeFilesystemAPI: !!forceNodeFilesystemAPI, assetRoots_DEPRECATED: assetRoots_DEPRECATED || [], assetExts: assetExts || [], providesModuleNodeModules, @@ -171,6 +175,7 @@ class DependencyGraph { const mw = this._opts.maxWorkers; const haste = new JestHasteMap({ extensions: this._opts.extensions.concat(this._opts.assetExts), + forceNodeFilesystemAPI: this._opts.forceNodeFilesystemAPI, ignorePattern: {test: this._opts.ignoreFilePath}, maxWorkers: typeof mw === 'number' && mw >= 1 ? mw : getMaxWorkers(), mocksPattern: '',