From 9d363e983b60835d730fd71a1168ed529bc06c5d Mon Sep 17 00:00:00 2001 From: Samuel Newman Date: Wed, 19 Aug 2026 19:37:41 +0300 Subject: [PATCH] Fix MMKV persistence in Metro builds (#11504) --- patches/react-native-dotenv@3.4.11.patch | 20 ++++++++++++++++++++ patches/react-native-dotenv@3.4.11.patch.md | 4 ++++ pnpm-lock.yaml | 5 +++-- pnpm-workspace.yaml | 1 + 4 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 patches/react-native-dotenv@3.4.11.patch create mode 100644 patches/react-native-dotenv@3.4.11.patch.md diff --git a/patches/react-native-dotenv@3.4.11.patch b/patches/react-native-dotenv@3.4.11.patch new file mode 100644 index 0000000000..00a71aa9e2 --- /dev/null +++ b/patches/react-native-dotenv@3.4.11.patch @@ -0,0 +1,20 @@ +diff --git a/index.js b/index.js +index 49b3650..a690ec8 100644 +--- a/index.js ++++ b/index.js +@@ -153,6 +153,15 @@ module.exports = function(api, options = {}) { + const key = path.toComputedKey() + if (t.isStringLiteral(key)) { + const importedId = key.value ++ // Metro uses Jest workers to transform application code. Do not ++ // leak the build worker's ID into the application runtime, where ++ // libraries can mistake it for an actual test environment. ++ if ( ++ importedId === 'JEST_WORKER_ID' || ++ importedId === 'VITEST_WORKER_ID' ++ ) { ++ return ++ } + const value = (env && importedId in env) ? env[importedId] : process.env[importedId] + if (value !== undefined) { + path.replaceWith(t.valueToNode(value)) diff --git a/patches/react-native-dotenv@3.4.11.patch.md b/patches/react-native-dotenv@3.4.11.patch.md new file mode 100644 index 0000000000..9a9a891f7a --- /dev/null +++ b/patches/react-native-dotenv@3.4.11.patch.md @@ -0,0 +1,4 @@ +# react-native-dotenv@3.4.11.patch + +Avoid inlining Metro's `JEST_WORKER_ID` or `VITEST_WORKER_ID` into application +code, which causes libraries such as react-native-mmkv to use test-only mocks. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 11a3474cd1..86133a02ef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -228,6 +228,7 @@ patchedDependencies: expo@57.0.8: 1722861d12907a2d412d04230545b2fcbfa5547a79f99d763cb3e8de6f3a6f2a react-native-compressor@1.13.0: 58379dfaace6ced8590cb341c77f2ca8099dfa8f7df6297032ec51de767a9925 react-native-date-picker@5.0.13: 92943fb79d17d7342a29bbb12b0d8ee3cf6f7bca12ed322dc8d124a3e9fb75bd + react-native-dotenv@3.4.11: 16b34eb974399935d3cf7c2526534f906991ccd876215176658347059cdd2021 react-native-drawer-layout@4.2.3: 74f2c043cc22ab87054f219e7c7373a509b779b18bfa79d27e7d051d73355130 react-native-keyboard-controller@1.21.9: ac52bf7502ff3ad34a8594b5e1a916b96bf87a2523b6abc87c31f03607d52271 react-native-pager-view@6.8.0: c8316acd33c9aef6531e8c272c2bfab7bd02af1255969eeaab2bad5ab48531cc @@ -853,7 +854,7 @@ importers: version: 3.9.6 react-native-dotenv: specifier: ^3.4.11 - version: 3.4.11(@babel/runtime@7.29.2) + version: 3.4.11(patch_hash=16b34eb974399935d3cf7c2526534f906991ccd876215176658347059cdd2021)(@babel/runtime@7.29.2) react-refresh: specifier: ^0.14.0 version: 0.14.2 @@ -18190,7 +18191,7 @@ snapshots: react: 19.2.3 react-native: 0.86.0(patch_hash=dd549527bb84c88acc7b0b1d521c9f4b666fda484c75cd0b282f8e9838524909)(@babel/core@7.29.0(supports-color@8.1.1))(@react-native/jest-preset@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(react@19.2.3)(supports-color@8.1.1))(@react-native/metro-config@0.86.0(@babel/core@7.29.0(supports-color@8.1.1))(supports-color@8.1.1))(@types/react@19.2.18)(react@19.2.3)(supports-color@8.1.1) - react-native-dotenv@3.4.11(@babel/runtime@7.29.2): + react-native-dotenv@3.4.11(patch_hash=16b34eb974399935d3cf7c2526534f906991ccd876215176658347059cdd2021)(@babel/runtime@7.29.2): dependencies: '@babel/runtime': 7.29.2 dotenv: 16.6.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f5a9ab7cd3..b627e1d3a8 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -40,6 +40,7 @@ patchedDependencies: expo@57.0.8: patches/expo@57.0.8.patch 'react-native-compressor@1.13.0': patches/react-native-compressor@1.13.0.patch 'react-native-date-picker@5.0.13': patches/react-native-date-picker@5.0.13.patch + 'react-native-dotenv@3.4.11': patches/react-native-dotenv@3.4.11.patch 'react-native-drawer-layout@4.2.3': patches/react-native-drawer-layout@4.2.3.patch 'react-native-keyboard-controller@1.21.9': patches/react-native-keyboard-controller@1.21.9.patch 'react-native-pager-view@6.8.0': patches/react-native-pager-view@6.8.0.patch