diff --git a/packages/jest-expo/CHANGELOG.md b/packages/jest-expo/CHANGELOG.md index c042f4693fecb..ce8878ec23698 100644 --- a/packages/jest-expo/CHANGELOG.md +++ b/packages/jest-expo/CHANGELOG.md @@ -6,6 +6,8 @@ ### 🎉 New features +- Add support for internal `process.env.EXPO_OS` environment variable and passing `platform` to `babel-jest` caller. ([#27637](https://github.com/expo/expo/pull/27637) by [@EvanBacon](https://github.com/EvanBacon)) + ### 🐛 Bug fixes ### 💡 Others diff --git a/packages/jest-expo/config/getPlatformPreset.js b/packages/jest-expo/config/getPlatformPreset.js index eff6d633159c3..031f93c547d92 100644 --- a/packages/jest-expo/config/getPlatformPreset.js +++ b/packages/jest-expo/config/getPlatformPreset.js @@ -4,7 +4,16 @@ const { getBareExtensions } = require('@expo/config/paths'); const { withWatchPlugins } = require('./withWatchPlugins'); const expoPreset = require('../jest-preset'); -function getPlatformPreset(displayOptions, extensions) { +function getUpstreamBabelJest(transform) { + const upstreamBabelJest = Object.keys(transform).find((key) => + Array.isArray(transform[key]) + ? transform[key][0] === 'babel-jest' + : transform[key] === 'babel-jest' + ); + return upstreamBabelJest; +} + +function getPlatformPreset(displayOptions, extensions, platform, isServer) { const moduleFileExtensions = getBareExtensions(extensions, { isTS: true, isReact: true, @@ -20,7 +29,26 @@ function getPlatformPreset(displayOptions, extensions) { ]; }); + const upstreamBabelJest = getUpstreamBabelJest(expoPreset.transform) ?? '\\.[jt]sx?$'; + return withWatchPlugins({ + transform: { + ...expoPreset.transform, + [upstreamBabelJest]: [ + 'babel-jest', + { + caller: { + name: 'metro', + bundler: 'metro', + // Add support for the `platform` babel transforms and inlines such as + // Platform.OS and `process.env.EXPO_OS`. + platform, + // Add support for removing server related code from the bundle. + isServer, + }, + }, + ], + }, displayName: displayOptions, testMatch, moduleFileExtensions, @@ -52,27 +80,31 @@ module.exports = { getWebPreset() { return { ...getBaseWebPreset(), - ...getPlatformPreset({ name: 'Web', color: 'magenta' }, ['web']), + ...getPlatformPreset({ name: 'Web', color: 'magenta' }, ['web'], 'web'), testEnvironment: 'jsdom', }; }, getNodePreset() { return { ...getBaseWebPreset(), - ...getPlatformPreset({ name: 'Node', color: 'cyan' }, ['node', 'web']), + ...getPlatformPreset({ name: 'Node', color: 'cyan' }, ['node', 'web'], 'web', true), testEnvironment: 'node', }; }, getIOSPreset() { return { ...expoPreset, - ...getPlatformPreset({ name: 'iOS', color: 'white' }, ['ios', 'native']), + ...getPlatformPreset({ name: 'iOS', color: 'white' }, ['ios', 'native'], 'ios'), }; }, getAndroidPreset() { return { ...expoPreset, - ...getPlatformPreset({ name: 'Android', color: 'blueBright' }, ['android', 'native']), + ...getPlatformPreset( + { name: 'Android', color: 'blueBright' }, + ['android', 'native'], + 'android' + ), }; }, }; diff --git a/packages/jest-expo/jest-preset.js b/packages/jest-expo/jest-preset.js index 2a5267bf6b236..0e679f33e4063 100644 --- a/packages/jest-expo/jest-preset.js +++ b/packages/jest-expo/jest-preset.js @@ -14,13 +14,19 @@ jestPreset.moduleNameMapper = { '^react-native-vector-icons/(.*)': '@expo/vector-icons/$1', }; -// transform -if (!jestPreset.transform) { - jestPreset.transform = { - '\\.[jt]sx?$': 'babel-jest', - }; +const upstreamBabelJest = Object.keys(jestPreset.transform).find( + (key) => jestPreset.transform[key] === 'babel-jest' +); +if (upstreamBabelJest) { + delete jestPreset.transform[upstreamBabelJest]; } +// transform +jestPreset.transform['\\.[jt]sx?$'] = [ + 'babel-jest', + { caller: { name: 'metro', bundler: 'metro', platform: 'ios' } }, +]; + const defaultAssetNamePattern = '^.+\\.(bmp|gif|jpg|jpeg|mp4|png|psd|svg|webp)$'; if (!jestPreset.transform[defaultAssetNamePattern]) { console.warn(`Expected react-native/jest-preset to define transform[${defaultAssetNamePattern}]`); diff --git a/packages/jest-expo/tests/__tests__/jest-test.js b/packages/jest-expo/tests/__tests__/jest-test.js index 7f4459b42808c..ae2201a5e07ba 100644 --- a/packages/jest-expo/tests/__tests__/jest-test.js +++ b/packages/jest-expo/tests/__tests__/jest-test.js @@ -11,4 +11,11 @@ describe(`jest-expo/universal`, () => { expect(OS).toContain(Platform.OS); expect(OS).toMatchSnapshot(); }); + + it(`injects process.env.EXPO_OS via babel-preset-expo automatically`, () => { + const { OS } = require('../default-extension'); + const { Platform } = require('expo-modules-core'); + expect(Platform.OS).toEqual(process.env.EXPO_OS); + expect(OS).toContain(process.env.EXPO_OS); + }); });