diff --git a/package.json b/package.json index b556450f39feb..1ca628761578f 100644 --- a/package.json +++ b/package.json @@ -105,6 +105,8 @@ "postinstall": "node node_modules/fbjs-scripts/node/check-dev-engines.js package.json", "test": "cross-env NODE_ENV=development jest --config ./scripts/jest/config.source.js", "test-prod": "cross-env NODE_ENV=production jest --config ./scripts/jest/config.source.js", + "test-bundles": "cross-env NODE_ENV=development jest --config ./scripts/jest/config.bundles.js", + "test-bundles-prod": "cross-env NODE_ENV=production jest --config ./scripts/jest/config.bundles.js", "flow": "node ./scripts/tasks/flow.js", "prettier": "node ./scripts/prettier/index.js write-changed", "prettier-all": "node ./scripts/prettier/index.js write", diff --git a/scripts/jest/config.base.js b/scripts/jest/config.base.js new file mode 100644 index 0000000000000..179c18c50c33a --- /dev/null +++ b/scripts/jest/config.base.js @@ -0,0 +1,19 @@ +'use strict'; + +module.exports = { + modulePathIgnorePatterns: [ + '/scripts/rollup/shims/', + '/scripts/bench/', + ], + transform: { + '.*': require.resolve('./preprocessor.js'), + }, + setupFiles: [require.resolve('./setupEnvironment.js')], + setupTestFrameworkScriptFile: require.resolve('./setupTests.js'), + testRegex: '/__tests__/.*(\\.js|\\.coffee|[^d]\\.ts)$', + moduleFileExtensions: ['js', 'json', 'node', 'coffee', 'ts'], + rootDir: process.cwd(), + roots: ['/packages', '/scripts'], + collectCoverageFrom: ['packages/**/*.js'], + timers: 'fake', +}; diff --git a/scripts/jest/config.bundles.js b/scripts/jest/config.bundles.js new file mode 100644 index 0000000000000..80028c0d8f0c2 --- /dev/null +++ b/scripts/jest/config.bundles.js @@ -0,0 +1,32 @@ +'use strict'; + +const {readdirSync, statSync} = require('fs'); +const {join} = require('path'); + +// Create a module map to point React packages to the build output. +const baseConfig = require('./config.base'); +const packagesRoot = join(__dirname, '..', '..', 'packages'); +const packages = readdirSync(packagesRoot).filter(dir => { + if (dir.charAt(0) === '.') { + return false; + } + const packagePath = join(packagesRoot, dir, 'package.json'); + return statSync(packagePath).isFile(); +}); +const moduleNameMapper = {}; +packages.forEach(name => { + // Root entry point + moduleNameMapper[`^${name}$`] = `/build/packages/${name}`; + // Named entry points + moduleNameMapper[`^${name}/(.*)$`] = `/build/packages/${name}/$1`; +}); + +module.exports = Object.assign({}, baseConfig, { + // Redirect imports to the compiled bundles. + moduleNameMapper, + // Only run bundle tests on whitelisted .public.* files. + // TODO: switch to a blacklist instead when enough tests are opted in. + testRegex: '/__tests__/.*\\.public\\.js$', + // Exclude the build output from transforms. + transformIgnorePatterns: ['/node_modules/', '/build/'], +}); diff --git a/scripts/jest/config.source.js b/scripts/jest/config.source.js index 179c18c50c33a..ffb17e302d354 100644 --- a/scripts/jest/config.source.js +++ b/scripts/jest/config.source.js @@ -1,19 +1,5 @@ 'use strict'; -module.exports = { - modulePathIgnorePatterns: [ - '/scripts/rollup/shims/', - '/scripts/bench/', - ], - transform: { - '.*': require.resolve('./preprocessor.js'), - }, - setupFiles: [require.resolve('./setupEnvironment.js')], - setupTestFrameworkScriptFile: require.resolve('./setupTests.js'), - testRegex: '/__tests__/.*(\\.js|\\.coffee|[^d]\\.ts)$', - moduleFileExtensions: ['js', 'json', 'node', 'coffee', 'ts'], - rootDir: process.cwd(), - roots: ['/packages', '/scripts'], - collectCoverageFrom: ['packages/**/*.js'], - timers: 'fake', -}; +const baseConfig = require('./config.base'); + +module.exports = Object.assign({}, baseConfig); diff --git a/scripts/jest/setupEnvironment.js b/scripts/jest/setupEnvironment.js index 8cfb01103270b..27d5bbe1a4093 100644 --- a/scripts/jest/setupEnvironment.js +++ b/scripts/jest/setupEnvironment.js @@ -1,16 +1,5 @@ /* eslint-disable */ -jest.mock('shared/ReactFeatureFlags', () => { - // We can alter flags based on environment here - // (e.g. for CI runs with different flags). - return require.requireActual('shared/ReactFeatureFlags'); -}); - -// Error logging varies between Fiber and Stack; -// Rather than fork dozens of tests, mock the error-logging file by default. -// TODO: direct imports like some-package/src/* are bad. Fix me. -jest.mock('react-reconciler/src/ReactFiberErrorLogger'); - const NODE_ENV = process.env.NODE_ENV; if (NODE_ENV !== 'development' && NODE_ENV !== 'production') { throw new Error('NODE_ENV must either be set to development or production.');