@vxrn/vite-plugin-metro 2.0.0-beta.33.1 → 2.0.0-beta.362.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (338) hide show
  1. package/dist/cjs/babel-plugins/import-meta-env-plugin.cjs +84 -102
  2. package/dist/cjs/babel-plugins/import-meta-env-plugin.native.cjs +108 -0
  3. package/dist/cjs/babel-plugins/import-meta-env-plugin.native.js +90 -107
  4. package/dist/cjs/babel-plugins/import-meta-env-plugin.native.js.map +1 -1
  5. package/dist/cjs/env/platformEnv.cjs +57 -57
  6. package/dist/cjs/env/platformEnv.native.cjs +95 -0
  7. package/dist/cjs/env/platformEnv.native.js +74 -75
  8. package/dist/cjs/env/platformEnv.native.js.map +1 -1
  9. package/dist/cjs/index.cjs +21 -25
  10. package/dist/cjs/index.native.cjs +39 -0
  11. package/dist/cjs/index.native.js +21 -24
  12. package/dist/cjs/index.native.js.map +1 -1
  13. package/dist/cjs/metro-config/getMetroBabelConfigFromViteConfig.cjs +54 -51
  14. package/dist/cjs/metro-config/getMetroBabelConfigFromViteConfig.native.cjs +108 -0
  15. package/dist/cjs/metro-config/getMetroBabelConfigFromViteConfig.native.js +95 -94
  16. package/dist/cjs/metro-config/getMetroBabelConfigFromViteConfig.native.js.map +1 -1
  17. package/dist/cjs/metro-config/getMetroConfigFromViteConfig.cjs +303 -257
  18. package/dist/cjs/metro-config/getMetroConfigFromViteConfig.native.cjs +361 -0
  19. package/dist/cjs/metro-config/getMetroConfigFromViteConfig.native.js +327 -267
  20. package/dist/cjs/metro-config/getMetroConfigFromViteConfig.native.js.map +1 -1
  21. package/dist/cjs/metro-config/patchMetroServerWithViteConfigAndMetroPluginOptions.cjs +38 -44
  22. package/dist/cjs/metro-config/patchMetroServerWithViteConfigAndMetroPluginOptions.native.cjs +53 -0
  23. package/dist/cjs/metro-config/patchMetroServerWithViteConfigAndMetroPluginOptions.native.js +39 -44
  24. package/dist/cjs/metro-config/patchMetroServerWithViteConfigAndMetroPluginOptions.native.js.map +1 -1
  25. package/dist/cjs/metro-config/types.cjs +9 -11
  26. package/dist/cjs/metro-config/types.native.cjs +18 -0
  27. package/dist/cjs/metro-config/types.native.js +9 -10
  28. package/dist/cjs/metro-config/types.native.js.map +1 -1
  29. package/dist/cjs/plugins/metroPlugin.cjs +210 -248
  30. package/dist/cjs/plugins/metroPlugin.native.cjs +242 -0
  31. package/dist/cjs/plugins/metroPlugin.native.js +216 -253
  32. package/dist/cjs/plugins/metroPlugin.native.js.map +1 -1
  33. package/dist/cjs/rn-commands/bundle/assetCatalogIOS.cjs +56 -65
  34. package/dist/cjs/rn-commands/bundle/assetCatalogIOS.native.cjs +121 -0
  35. package/dist/cjs/rn-commands/bundle/assetCatalogIOS.native.js +94 -106
  36. package/dist/cjs/rn-commands/bundle/assetCatalogIOS.native.js.map +1 -1
  37. package/dist/cjs/rn-commands/bundle/assetPathUtils.cjs +51 -55
  38. package/dist/cjs/rn-commands/bundle/assetPathUtils.native.cjs +72 -0
  39. package/dist/cjs/rn-commands/bundle/assetPathUtils.native.js +51 -54
  40. package/dist/cjs/rn-commands/bundle/assetPathUtils.native.js.map +1 -1
  41. package/dist/cjs/rn-commands/bundle/buildBundle.cjs +37 -46
  42. package/dist/cjs/rn-commands/bundle/buildBundle.native.cjs +57 -0
  43. package/dist/cjs/rn-commands/bundle/buildBundle.native.js +39 -47
  44. package/dist/cjs/rn-commands/bundle/buildBundle.native.js.map +1 -1
  45. package/dist/cjs/rn-commands/bundle/buildBundleWithConfig.cjs +57 -68
  46. package/dist/cjs/rn-commands/bundle/buildBundleWithConfig.native.cjs +81 -0
  47. package/dist/cjs/rn-commands/bundle/buildBundleWithConfig.native.js +59 -70
  48. package/dist/cjs/rn-commands/bundle/buildBundleWithConfig.native.js.map +1 -1
  49. package/dist/cjs/rn-commands/bundle/filterPlatformAssetScales.cjs +37 -39
  50. package/dist/cjs/rn-commands/bundle/filterPlatformAssetScales.native.cjs +70 -0
  51. package/dist/cjs/rn-commands/bundle/filterPlatformAssetScales.native.js +56 -59
  52. package/dist/cjs/rn-commands/bundle/filterPlatformAssetScales.native.js.map +1 -1
  53. package/dist/cjs/rn-commands/bundle/getAssetDestPathAndroid.cjs +20 -29
  54. package/dist/cjs/rn-commands/bundle/getAssetDestPathAndroid.native.cjs +39 -0
  55. package/dist/cjs/rn-commands/bundle/getAssetDestPathAndroid.native.js +20 -28
  56. package/dist/cjs/rn-commands/bundle/getAssetDestPathAndroid.native.js.map +1 -1
  57. package/dist/cjs/rn-commands/bundle/getAssetDestPathIOS.cjs +20 -33
  58. package/dist/cjs/rn-commands/bundle/getAssetDestPathIOS.native.cjs +38 -0
  59. package/dist/cjs/rn-commands/bundle/getAssetDestPathIOS.native.js +20 -32
  60. package/dist/cjs/rn-commands/bundle/getAssetDestPathIOS.native.js.map +1 -1
  61. package/dist/cjs/rn-commands/bundle/getBuildBundleFn.cjs +23 -32
  62. package/dist/cjs/rn-commands/bundle/getBuildBundleFn.native.cjs +38 -0
  63. package/dist/cjs/rn-commands/bundle/getBuildBundleFn.native.js +23 -31
  64. package/dist/cjs/rn-commands/bundle/getBuildBundleFn.native.js.map +1 -1
  65. package/dist/cjs/rn-commands/bundle/index.cjs +15 -17
  66. package/dist/cjs/rn-commands/bundle/index.native.cjs +30 -0
  67. package/dist/cjs/rn-commands/bundle/index.native.js +15 -16
  68. package/dist/cjs/rn-commands/bundle/index.native.js.map +1 -1
  69. package/dist/cjs/rn-commands/bundle/saveAssets.cjs +85 -96
  70. package/dist/cjs/rn-commands/bundle/saveAssets.native.cjs +129 -0
  71. package/dist/cjs/rn-commands/bundle/saveAssets.native.js +102 -114
  72. package/dist/cjs/rn-commands/bundle/saveAssets.native.js.map +1 -1
  73. package/dist/cjs/rn-commands/bundle/types.cjs +9 -11
  74. package/dist/cjs/rn-commands/bundle/types.native.cjs +18 -0
  75. package/dist/cjs/rn-commands/bundle/types.native.js +9 -10
  76. package/dist/cjs/rn-commands/bundle/types.native.js.map +1 -1
  77. package/dist/cjs/rn-commands/index.cjs +17 -26
  78. package/dist/cjs/rn-commands/index.native.cjs +32 -0
  79. package/dist/cjs/rn-commands/index.native.js +17 -25
  80. package/dist/cjs/rn-commands/index.native.js.map +1 -1
  81. package/dist/cjs/transformer/babel-core.cjs +16 -18
  82. package/dist/cjs/transformer/babel-core.native.cjs +30 -0
  83. package/dist/cjs/transformer/babel-core.native.js +16 -17
  84. package/dist/cjs/transformer/babel-core.native.js.map +1 -1
  85. package/dist/cjs/transformer/babel-transformer.cjs +155 -151
  86. package/dist/cjs/transformer/babel-transformer.native.cjs +197 -0
  87. package/dist/cjs/transformer/babel-transformer.native.js +171 -158
  88. package/dist/cjs/transformer/babel-transformer.native.js.map +1 -1
  89. package/dist/cjs/transformer/expoVirtualEnv.cjs +92 -0
  90. package/dist/cjs/transformer/expoVirtualEnv.native.cjs +113 -0
  91. package/dist/cjs/transformer/expoVirtualEnv.native.js +115 -0
  92. package/dist/cjs/transformer/expoVirtualEnv.native.js.map +1 -0
  93. package/dist/cjs/transformer/loadBabelConfig.cjs +44 -49
  94. package/dist/cjs/transformer/loadBabelConfig.native.cjs +64 -0
  95. package/dist/cjs/transformer/loadBabelConfig.native.js +48 -52
  96. package/dist/cjs/transformer/loadBabelConfig.native.js.map +1 -1
  97. package/dist/cjs/transformer/metroNativeWorker.cjs +1436 -1489
  98. package/dist/cjs/transformer/metroNativeWorker.native.cjs +2525 -0
  99. package/dist/cjs/transformer/metroNativeWorker.native.js +2414 -2561
  100. package/dist/cjs/transformer/metroNativeWorker.native.js.map +1 -1
  101. package/dist/cjs/transformer/transformSync.cjs +48 -64
  102. package/dist/cjs/transformer/transformSync.native.cjs +74 -0
  103. package/dist/cjs/transformer/transformSync.native.js +50 -65
  104. package/dist/cjs/transformer/transformSync.native.js.map +1 -1
  105. package/dist/cjs/transformer/types.cjs +9 -11
  106. package/dist/cjs/transformer/types.native.cjs +18 -0
  107. package/dist/cjs/transformer/types.native.js +9 -10
  108. package/dist/cjs/transformer/types.native.js.map +1 -1
  109. package/dist/cjs/utils/exit.cjs +141 -139
  110. package/dist/cjs/utils/exit.native.cjs +266 -0
  111. package/dist/cjs/utils/exit.native.js +228 -241
  112. package/dist/cjs/utils/exit.native.js.map +1 -1
  113. package/dist/cjs/utils/getTerminalReporter.cjs +35 -47
  114. package/dist/cjs/utils/getTerminalReporter.native.cjs +57 -0
  115. package/dist/cjs/utils/getTerminalReporter.native.js +38 -49
  116. package/dist/cjs/utils/getTerminalReporter.native.js.map +1 -1
  117. package/dist/cjs/utils/metroCacheManager.cjs +84 -99
  118. package/dist/cjs/utils/metroCacheManager.native.cjs +130 -0
  119. package/dist/cjs/utils/metroCacheManager.native.js +102 -118
  120. package/dist/cjs/utils/metroCacheManager.native.js.map +1 -1
  121. package/dist/cjs/utils/projectImport.cjs +40 -51
  122. package/dist/cjs/utils/projectImport.native.cjs +64 -0
  123. package/dist/cjs/utils/projectImport.native.js +41 -58
  124. package/dist/cjs/utils/projectImport.native.js.map +1 -1
  125. package/dist/esm/babel-plugins/import-meta-env-plugin.mjs +72 -86
  126. package/dist/esm/babel-plugins/import-meta-env-plugin.mjs.map +1 -1
  127. package/dist/esm/babel-plugins/import-meta-env-plugin.native.js +78 -92
  128. package/dist/esm/babel-plugins/import-meta-env-plugin.native.js.map +1 -1
  129. package/dist/esm/env/platformEnv.mjs +42 -39
  130. package/dist/esm/env/platformEnv.mjs.map +1 -1
  131. package/dist/esm/env/platformEnv.native.js +59 -58
  132. package/dist/esm/env/platformEnv.native.js.map +1 -1
  133. package/dist/esm/index.js +3 -4
  134. package/dist/esm/index.mjs +3 -4
  135. package/dist/esm/index.native.js +3 -4
  136. package/dist/esm/metro-config/getMetroBabelConfigFromViteConfig.mjs +42 -33
  137. package/dist/esm/metro-config/getMetroBabelConfigFromViteConfig.mjs.map +1 -1
  138. package/dist/esm/metro-config/getMetroBabelConfigFromViteConfig.native.js +83 -77
  139. package/dist/esm/metro-config/getMetroBabelConfigFromViteConfig.native.js.map +1 -1
  140. package/dist/esm/metro-config/getMetroConfigFromViteConfig.mjs +287 -232
  141. package/dist/esm/metro-config/getMetroConfigFromViteConfig.mjs.map +1 -1
  142. package/dist/esm/metro-config/getMetroConfigFromViteConfig.native.js +311 -243
  143. package/dist/esm/metro-config/getMetroConfigFromViteConfig.native.js.map +1 -1
  144. package/dist/esm/metro-config/patchMetroServerWithViteConfigAndMetroPluginOptions.mjs +26 -26
  145. package/dist/esm/metro-config/patchMetroServerWithViteConfigAndMetroPluginOptions.mjs.map +1 -1
  146. package/dist/esm/metro-config/patchMetroServerWithViteConfigAndMetroPluginOptions.native.js +27 -27
  147. package/dist/esm/metro-config/patchMetroServerWithViteConfigAndMetroPluginOptions.native.js.map +1 -1
  148. package/dist/esm/metro-config/types.mjs +0 -2
  149. package/dist/esm/metro-config/types.native.js +0 -2
  150. package/dist/esm/plugins/metroPlugin.mjs +195 -222
  151. package/dist/esm/plugins/metroPlugin.mjs.map +1 -1
  152. package/dist/esm/plugins/metroPlugin.native.js +201 -228
  153. package/dist/esm/plugins/metroPlugin.native.js.map +1 -1
  154. package/dist/esm/rn-commands/bundle/assetCatalogIOS.mjs +38 -38
  155. package/dist/esm/rn-commands/bundle/assetCatalogIOS.mjs.map +1 -1
  156. package/dist/esm/rn-commands/bundle/assetCatalogIOS.native.js +76 -80
  157. package/dist/esm/rn-commands/bundle/assetCatalogIOS.native.js.map +1 -1
  158. package/dist/esm/rn-commands/bundle/assetPathUtils.mjs +38 -37
  159. package/dist/esm/rn-commands/bundle/assetPathUtils.mjs.map +1 -1
  160. package/dist/esm/rn-commands/bundle/assetPathUtils.native.js +38 -37
  161. package/dist/esm/rn-commands/bundle/assetPathUtils.native.js.map +1 -1
  162. package/dist/esm/rn-commands/bundle/buildBundle.mjs +25 -28
  163. package/dist/esm/rn-commands/bundle/buildBundle.mjs.map +1 -1
  164. package/dist/esm/rn-commands/bundle/buildBundle.native.js +27 -30
  165. package/dist/esm/rn-commands/bundle/buildBundle.native.js.map +1 -1
  166. package/dist/esm/rn-commands/bundle/buildBundleWithConfig.mjs +43 -43
  167. package/dist/esm/rn-commands/bundle/buildBundleWithConfig.mjs.map +1 -1
  168. package/dist/esm/rn-commands/bundle/buildBundleWithConfig.native.js +45 -46
  169. package/dist/esm/rn-commands/bundle/buildBundleWithConfig.native.js.map +1 -1
  170. package/dist/esm/rn-commands/bundle/filterPlatformAssetScales.mjs +24 -21
  171. package/dist/esm/rn-commands/bundle/filterPlatformAssetScales.mjs.map +1 -1
  172. package/dist/esm/rn-commands/bundle/filterPlatformAssetScales.native.js +43 -42
  173. package/dist/esm/rn-commands/bundle/filterPlatformAssetScales.native.js.map +1 -1
  174. package/dist/esm/rn-commands/bundle/getAssetDestPathAndroid.mjs +5 -3
  175. package/dist/esm/rn-commands/bundle/getAssetDestPathAndroid.mjs.map +1 -1
  176. package/dist/esm/rn-commands/bundle/getAssetDestPathAndroid.native.js +5 -3
  177. package/dist/esm/rn-commands/bundle/getAssetDestPathAndroid.native.js.map +1 -1
  178. package/dist/esm/rn-commands/bundle/getAssetDestPathIOS.mjs +5 -7
  179. package/dist/esm/rn-commands/bundle/getAssetDestPathIOS.mjs.map +1 -1
  180. package/dist/esm/rn-commands/bundle/getAssetDestPathIOS.native.js +5 -7
  181. package/dist/esm/rn-commands/bundle/getAssetDestPathIOS.native.js.map +1 -1
  182. package/dist/esm/rn-commands/bundle/getBuildBundleFn.mjs +11 -14
  183. package/dist/esm/rn-commands/bundle/getBuildBundleFn.mjs.map +1 -1
  184. package/dist/esm/rn-commands/bundle/getBuildBundleFn.native.js +11 -14
  185. package/dist/esm/rn-commands/bundle/getBuildBundleFn.native.js.map +1 -1
  186. package/dist/esm/rn-commands/bundle/index.mjs +2 -2
  187. package/dist/esm/rn-commands/bundle/index.native.js +2 -2
  188. package/dist/esm/rn-commands/bundle/saveAssets.mjs +70 -70
  189. package/dist/esm/rn-commands/bundle/saveAssets.mjs.map +1 -1
  190. package/dist/esm/rn-commands/bundle/saveAssets.native.js +87 -89
  191. package/dist/esm/rn-commands/bundle/saveAssets.native.js.map +1 -1
  192. package/dist/esm/rn-commands/bundle/types.mjs +0 -2
  193. package/dist/esm/rn-commands/bundle/types.native.js +0 -2
  194. package/dist/esm/rn-commands/index.mjs +2 -2
  195. package/dist/esm/rn-commands/index.native.js +2 -2
  196. package/dist/esm/transformer/babel-core.mjs +2 -2
  197. package/dist/esm/transformer/babel-core.native.js +2 -2
  198. package/dist/esm/transformer/babel-transformer.mjs +139 -132
  199. package/dist/esm/transformer/babel-transformer.mjs.map +1 -1
  200. package/dist/esm/transformer/babel-transformer.native.js +152 -142
  201. package/dist/esm/transformer/babel-transformer.native.js.map +1 -1
  202. package/dist/esm/transformer/expoVirtualEnv.mjs +67 -0
  203. package/dist/esm/transformer/expoVirtualEnv.mjs.map +1 -0
  204. package/dist/esm/transformer/expoVirtualEnv.native.js +86 -0
  205. package/dist/esm/transformer/expoVirtualEnv.native.js.map +1 -0
  206. package/dist/esm/transformer/loadBabelConfig.mjs +29 -23
  207. package/dist/esm/transformer/loadBabelConfig.mjs.map +1 -1
  208. package/dist/esm/transformer/loadBabelConfig.native.js +33 -27
  209. package/dist/esm/transformer/loadBabelConfig.native.js.map +1 -1
  210. package/dist/esm/transformer/metroNativeWorker.mjs +1399 -1443
  211. package/dist/esm/transformer/metroNativeWorker.mjs.map +1 -1
  212. package/dist/esm/transformer/metroNativeWorker.native.js +2377 -2516
  213. package/dist/esm/transformer/metroNativeWorker.native.js.map +1 -1
  214. package/dist/esm/transformer/transformSync.mjs +33 -38
  215. package/dist/esm/transformer/transformSync.mjs.map +1 -1
  216. package/dist/esm/transformer/transformSync.native.js +35 -40
  217. package/dist/esm/transformer/transformSync.native.js.map +1 -1
  218. package/dist/esm/transformer/types.mjs +0 -2
  219. package/dist/esm/transformer/types.native.js +0 -2
  220. package/dist/esm/utils/exit.mjs +123 -112
  221. package/dist/esm/utils/exit.mjs.map +1 -1
  222. package/dist/esm/utils/exit.native.js +210 -215
  223. package/dist/esm/utils/exit.native.js.map +1 -1
  224. package/dist/esm/utils/getTerminalReporter.mjs +20 -21
  225. package/dist/esm/utils/getTerminalReporter.mjs.map +1 -1
  226. package/dist/esm/utils/getTerminalReporter.native.js +23 -24
  227. package/dist/esm/utils/getTerminalReporter.native.js.map +1 -1
  228. package/dist/esm/utils/metroCacheManager.mjs +73 -82
  229. package/dist/esm/utils/metroCacheManager.mjs.map +1 -1
  230. package/dist/esm/utils/metroCacheManager.native.js +91 -102
  231. package/dist/esm/utils/metroCacheManager.native.js.map +1 -1
  232. package/dist/esm/utils/projectImport.mjs +23 -25
  233. package/dist/esm/utils/projectImport.mjs.map +1 -1
  234. package/dist/esm/utils/projectImport.native.js +24 -33
  235. package/dist/esm/utils/projectImport.native.js.map +1 -1
  236. package/package.json +16 -18
  237. package/src/babel-plugins/import-meta-env-plugin.ts +1 -1
  238. package/src/env/platformEnv.test.ts +44 -0
  239. package/src/env/platformEnv.ts +6 -3
  240. package/src/index.ts +0 -2
  241. package/src/metro-config/getMetroBabelConfigFromViteConfig.test.ts +52 -0
  242. package/src/metro-config/getMetroBabelConfigFromViteConfig.ts +8 -7
  243. package/src/metro-config/getMetroConfigFromViteConfig.test.ts +263 -0
  244. package/src/metro-config/getMetroConfigFromViteConfig.ts +226 -109
  245. package/src/metro-config/glbAssets.test.ts +57 -0
  246. package/src/plugins/metroPlugin.ts +3 -6
  247. package/src/transformer/babel-transformer.test.ts +118 -0
  248. package/src/transformer/babel-transformer.ts +102 -15
  249. package/src/transformer/expoVirtualEnv.integration.test.ts +106 -0
  250. package/src/transformer/expoVirtualEnv.test.ts +72 -0
  251. package/src/transformer/expoVirtualEnv.ts +115 -0
  252. package/src/transformer/loadBabelConfig.ts +3 -1
  253. package/src/transformer/metroNativeWorker.test.ts +425 -36
  254. package/src/transformer/metroNativeWorker.ts +72 -74
  255. package/src/transformer/swiftPackageTransform.test.ts +95 -0
  256. package/src/transformer/transformSync.test.ts +22 -0
  257. package/src/transformer/transformSync.ts +4 -4
  258. package/src/utils/exit.ts +2 -2
  259. package/src/utils/getTerminalReporter.ts +1 -1
  260. package/src/utils/projectImport.ts +2 -2
  261. package/types/babel-plugins/import-meta-env-plugin.d.ts +1 -1
  262. package/types/babel-plugins/import-meta-env-plugin.d.ts.map +1 -1
  263. package/types/env/platformEnv.d.ts +2 -1
  264. package/types/env/platformEnv.d.ts.map +1 -1
  265. package/types/index.d.ts +0 -2
  266. package/types/index.d.ts.map +1 -1
  267. package/types/metro-config/getMetroBabelConfigFromViteConfig.d.ts +1 -1
  268. package/types/metro-config/getMetroBabelConfigFromViteConfig.d.ts.map +1 -1
  269. package/types/metro-config/getMetroConfigFromViteConfig.d.ts +2 -2
  270. package/types/metro-config/getMetroConfigFromViteConfig.d.ts.map +1 -1
  271. package/types/plugins/metroPlugin.d.ts +2 -4
  272. package/types/plugins/metroPlugin.d.ts.map +1 -1
  273. package/types/rn-commands/bundle/assetPathUtils.d.ts.map +1 -1
  274. package/types/rn-commands/bundle/filterPlatformAssetScales.d.ts.map +1 -1
  275. package/types/rn-commands/bundle/getAssetDestPathAndroid.d.ts.map +1 -1
  276. package/types/rn-commands/bundle/getAssetDestPathIOS.d.ts.map +1 -1
  277. package/types/rn-commands/bundle/saveAssets.d.ts.map +1 -1
  278. package/types/transformer/babel-transformer.d.ts +10 -1
  279. package/types/transformer/babel-transformer.d.ts.map +1 -1
  280. package/types/transformer/expoVirtualEnv.d.ts +8 -0
  281. package/types/transformer/expoVirtualEnv.d.ts.map +1 -0
  282. package/types/transformer/loadBabelConfig.d.ts.map +1 -1
  283. package/types/transformer/metroNativeWorker.d.ts +7 -8
  284. package/types/transformer/metroNativeWorker.d.ts.map +1 -1
  285. package/types/utils/projectImport.d.ts +2 -2
  286. package/dist/cjs/plugins/expoManifestRequestHandlerPlugin.cjs +0 -71
  287. package/dist/cjs/plugins/expoManifestRequestHandlerPlugin.native.js +0 -82
  288. package/dist/cjs/plugins/expoManifestRequestHandlerPlugin.native.js.map +0 -1
  289. package/dist/cjs/transformer/metroNativeWorker.test.cjs +0 -897
  290. package/dist/cjs/transformer/metroNativeWorker.test.native.js +0 -1010
  291. package/dist/cjs/transformer/metroNativeWorker.test.native.js.map +0 -1
  292. package/dist/cjs/transformer/transformSync.test.cjs +0 -36
  293. package/dist/cjs/transformer/transformSync.test.native.js +0 -49
  294. package/dist/cjs/transformer/transformSync.test.native.js.map +0 -1
  295. package/dist/cjs/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.cjs +0 -39
  296. package/dist/cjs/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js +0 -42
  297. package/dist/cjs/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js.map +0 -1
  298. package/dist/esm/index.js.map +0 -1
  299. package/dist/esm/index.mjs.map +0 -1
  300. package/dist/esm/index.native.js.map +0 -1
  301. package/dist/esm/metro-config/types.mjs.map +0 -1
  302. package/dist/esm/metro-config/types.native.js.map +0 -1
  303. package/dist/esm/plugins/expoManifestRequestHandlerPlugin.mjs +0 -46
  304. package/dist/esm/plugins/expoManifestRequestHandlerPlugin.mjs.map +0 -1
  305. package/dist/esm/plugins/expoManifestRequestHandlerPlugin.native.js +0 -54
  306. package/dist/esm/plugins/expoManifestRequestHandlerPlugin.native.js.map +0 -1
  307. package/dist/esm/rn-commands/bundle/index.mjs.map +0 -1
  308. package/dist/esm/rn-commands/bundle/index.native.js.map +0 -1
  309. package/dist/esm/rn-commands/bundle/types.mjs.map +0 -1
  310. package/dist/esm/rn-commands/bundle/types.native.js.map +0 -1
  311. package/dist/esm/rn-commands/index.mjs.map +0 -1
  312. package/dist/esm/rn-commands/index.native.js.map +0 -1
  313. package/dist/esm/transformer/babel-core.mjs.map +0 -1
  314. package/dist/esm/transformer/babel-core.native.js.map +0 -1
  315. package/dist/esm/transformer/metroNativeWorker.test.mjs +0 -861
  316. package/dist/esm/transformer/metroNativeWorker.test.mjs.map +0 -1
  317. package/dist/esm/transformer/metroNativeWorker.test.native.js +0 -972
  318. package/dist/esm/transformer/metroNativeWorker.test.native.js.map +0 -1
  319. package/dist/esm/transformer/transformSync.test.mjs +0 -37
  320. package/dist/esm/transformer/transformSync.test.mjs.map +0 -1
  321. package/dist/esm/transformer/transformSync.test.native.js +0 -47
  322. package/dist/esm/transformer/transformSync.test.native.js.map +0 -1
  323. package/dist/esm/transformer/types.mjs.map +0 -1
  324. package/dist/esm/transformer/types.native.js.map +0 -1
  325. package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.mjs +0 -14
  326. package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.mjs.map +0 -1
  327. package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js +0 -14
  328. package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js.map +0 -1
  329. package/src/plugins/expoManifestRequestHandlerPlugin.ts +0 -88
  330. package/src/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.ts +0 -28
  331. package/types/plugins/expoManifestRequestHandlerPlugin.d.ts +0 -14
  332. package/types/plugins/expoManifestRequestHandlerPlugin.d.ts.map +0 -1
  333. package/types/transformer/metroNativeWorker.test.d.ts +0 -2
  334. package/types/transformer/metroNativeWorker.test.d.ts.map +0 -1
  335. package/types/transformer/transformSync.test.d.ts +0 -2
  336. package/types/transformer/transformSync.test.d.ts.map +0 -1
  337. package/types/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.d.ts +0 -5
  338. package/types/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.d.ts.map +0 -1
@@ -3,6 +3,7 @@ import * as babel from '@babel/core'
3
3
  import * as vm from 'node:vm'
4
4
  import { parseSync } from 'oxc-parser'
5
5
  import * as fs from 'node:fs'
6
+ import * as os from 'node:os'
6
7
  import * as path from 'node:path'
7
8
  import { createRequire } from 'node:module'
8
9
  import {
@@ -18,7 +19,10 @@ import {
18
19
  applyEnvironmentGuard,
19
20
  getRemoveServerCodeRouterRoot,
20
21
  } from './metroNativeWorker'
21
- import { buildMetroConfigInputFromViteConfig } from '../metro-config/getMetroConfigFromViteConfig'
22
+ import {
23
+ buildMetroConfigInputFromViteConfig,
24
+ getMetroConfigFromViteConfig,
25
+ } from '../metro-config/getMetroConfigFromViteConfig'
22
26
 
23
27
  const babelCalls = {
24
28
  transform: 0,
@@ -31,33 +35,25 @@ const babelCalls = {
31
35
 
32
36
  vi.mock('@babel/core', async (importOriginal) => {
33
37
  const actual = await importOriginal<typeof import('@babel/core')>()
34
- return {
35
- ...actual,
36
- transform: vi.fn((...args: any[]) => {
37
- babelCalls.transform++
38
- return (actual.transform as any)(...args)
39
- }),
40
- transformSync: vi.fn((...args: any[]) => {
41
- babelCalls.transformSync++
42
- return (actual.transformSync as any)(...args)
43
- }),
44
- transformAsync: vi.fn((...args: any[]) => {
45
- babelCalls.transformAsync++
46
- return (actual.transformAsync as any)(...args)
47
- }),
48
- transformFromAstSync: vi.fn((...args: any[]) => {
49
- babelCalls.transformFromAstSync++
50
- return (actual.transformFromAstSync as any)(...args)
51
- }),
52
- parse: vi.fn((...args: any[]) => {
53
- babelCalls.parse++
54
- return (actual.parse as any)(...args)
55
- }),
56
- parseSync: vi.fn((...args: any[]) => {
57
- babelCalls.parseSync++
58
- return (actual.parseSync as any)(...args)
59
- }),
60
- }
38
+ const names = [
39
+ 'transform',
40
+ 'transformSync',
41
+ 'transformAsync',
42
+ 'transformFromAstSync',
43
+ 'parse',
44
+ 'parseSync',
45
+ ] as const
46
+ const counted = Object.fromEntries(
47
+ names.map((name) => [
48
+ name,
49
+ vi.fn((...args: any[]) => {
50
+ babelCalls[name]++
51
+ return (actual[name] as any)(...args)
52
+ }),
53
+ ])
54
+ )
55
+ // @vxrn/compiler reaches babel through the default export, so count that too
56
+ return { ...actual, ...counted, default: { ...actual, ...counted } }
61
57
  })
62
58
 
63
59
  // module scope so every describe in this file can assert it, not just the first
@@ -70,6 +66,20 @@ beforeEach(() => {
70
66
  babelCalls.parseSync = 0
71
67
  })
72
68
 
69
+ // flow stripping is the one place the worker runs babel: react-native's flow
70
+ // syntax (readonly properties, enums) is beyond fast-flow-transform, so the
71
+ // hermes-parser pass in @vxrn/compiler strips it in a single transform call
72
+ function assertOnlyFlowStripBabelCall() {
73
+ expect(babelCalls).toEqual({
74
+ transform: 1,
75
+ transformSync: 0,
76
+ transformAsync: 0,
77
+ transformFromAstSync: 0,
78
+ parse: 0,
79
+ parseSync: 0,
80
+ })
81
+ }
82
+
73
83
  function assertZeroBabelCalls() {
74
84
  expect(babelCalls.transform).toBe(0)
75
85
  expect(babelCalls.transformSync).toBe(0)
@@ -236,7 +246,9 @@ describe('metroNativeWorker', () => {
236
246
  off.find((d) => d.name === 'react-native-worklets-core')!.data.isOptional
237
247
  ).toBeUndefined()
238
248
 
239
- const on = extractDependencies(code, 'setup.js', { allowOptionalDependencies: true })
249
+ const on = extractDependencies(code, 'setup.js', {
250
+ allowOptionalDependencies: true,
251
+ })
240
252
  expect(on.find((d) => d.name === 'react-native-worklets-core')!.data.isOptional).toBe(
241
253
  true
242
254
  )
@@ -399,7 +411,7 @@ describe('metroNativeWorker', () => {
399
411
  it('handles Asset files without Babel', async () => {
400
412
  const result = await transform(
401
413
  {
402
- assetRegistryPath: 'react-native/Libraries/Image/AssetRegistry',
414
+ assetRegistryPath: 'react-native/asset-registry',
403
415
  publicPath: '/assets',
404
416
  },
405
417
  '/project',
@@ -414,10 +426,10 @@ describe('metroNativeWorker', () => {
414
426
  expect(result.output[0].data.code).toContain('__d(function')
415
427
 
416
428
  const depNames = result.dependencies.map((d) => d.name)
417
- expect(depNames).toContain('react-native/Libraries/Image/AssetRegistry')
429
+ expect(depNames).toContain('react-native/asset-registry')
418
430
  })
419
431
 
420
- it('handles Flow files by stripping types without Babel', async () => {
432
+ it('strips Flow types with a single hermes-parser Babel pass', async () => {
421
433
  const flowSource = `
422
434
  // @flow
423
435
  function add(a: number, b: number): number {
@@ -434,11 +446,41 @@ describe('metroNativeWorker', () => {
434
446
  { dev: false, platform: 'ios', type: 'module' }
435
447
  )
436
448
 
437
- assertZeroBabelCalls()
449
+ assertOnlyFlowStripBabelCall()
438
450
  expect(result.output[0].data.code).not.toContain(': number')
439
451
  expect(result.output[0].data.code).toContain('function add(a, b)')
440
452
  })
441
453
 
454
+ it('lowers React Native Flow enums and readonly properties', async () => {
455
+ // react-native 0.87 ships VirtualView.js with exported Flow enums, and
456
+ // readonly object properties throughout its type declarations
457
+ const flowSource = `
458
+ // @flow strict-local
459
+ type Props = { readonly state: VirtualViewRenderState };
460
+ export enum VirtualViewRenderState {
461
+ Unknown = 0,
462
+ Rendered = 1,
463
+ None = 2,
464
+ }
465
+ export function isRendered(state: VirtualViewRenderState): boolean {
466
+ return state === VirtualViewRenderState.Rendered;
467
+ }
468
+ `
469
+
470
+ const result = await transform(
471
+ {},
472
+ '/project',
473
+ 'node_modules/react-native/src/private/components/virtualview/VirtualView.js',
474
+ Buffer.from(flowSource, 'utf8'),
475
+ { dev: false, platform: 'ios', type: 'module' }
476
+ )
477
+
478
+ assertOnlyFlowStripBabelCall()
479
+ expect(result.output[0].data.code).not.toContain('enum VirtualViewRenderState')
480
+ expect(result.output[0].data.code).not.toContain('readonly')
481
+ expect(result.dependencies.map((d) => d.name)).toContain('flow-enums-runtime')
482
+ })
483
+
442
484
  it('generates a deterministic cache key without Babel', () => {
443
485
  const key1 = getCacheKey(
444
486
  { globalPrefix: '__one_', minifierPath: 'terser' },
@@ -470,7 +512,7 @@ describe('metroNativeWorker', () => {
470
512
  expect(configDefault.defaultConfig.transformerPath).toContain('metroNativeWorker')
471
513
  expect(configDefault.defaultConfig.transformer.transformerPath).toBeUndefined()
472
514
 
473
- // Opting back into babel via metroPluginOptions leaves expo's default
515
+ // Opting back into babel via metroPluginOptions leaves Metro's default
474
516
  // worker in the key, which is itself proof that top level is where metro
475
517
  // reads it from.
476
518
  const configOptOff = await buildMetroConfigInputFromViteConfig(mockViteConfig, {
@@ -515,6 +557,151 @@ describe('metroNativeWorker', () => {
515
557
  )
516
558
  })
517
559
 
560
+ it('falls back to default Metro babel transformer when a user babel config exists', async () => {
561
+ const tempDir = path.join(process.cwd(), `.tmp-metro-test-${Date.now()}`)
562
+ fs.mkdirSync(tempDir, { recursive: true })
563
+ fs.writeFileSync(path.join(tempDir, 'package.json'), '{}')
564
+ try {
565
+ const mockViteConfig = { root: tempDir } as any
566
+ delete process.env.ONE_METRO_NATIVE_TRANSFORMS
567
+
568
+ // With no config, defaults to metroNativeWorker
569
+ const config1 = await buildMetroConfigInputFromViteConfig(mockViteConfig, {})
570
+ expect(config1.defaultConfig.transformerPath).toContain('metroNativeWorker')
571
+
572
+ // a config written by `one patch` is ignored, still uses metroNativeWorker
573
+ const babelConfigPath = path.join(tempDir, 'babel.config.js')
574
+ fs.writeFileSync(
575
+ babelConfigPath,
576
+ '// @one/generated bundler-config\nmodule.exports = {}'
577
+ )
578
+ const config2 = await buildMetroConfigInputFromViteConfig(mockViteConfig, {})
579
+ expect(config2.defaultConfig.transformerPath).toContain('metroNativeWorker')
580
+
581
+ // User config: falls back to metro default transformer (not metroNativeWorker)
582
+ fs.writeFileSync(babelConfigPath, 'module.exports = { plugins: ["my-plugin"] }')
583
+ const config3 = await buildMetroConfigInputFromViteConfig(mockViteConfig, {})
584
+ expect(config3.defaultConfig.transformerPath).not.toContain('metroNativeWorker')
585
+
586
+ // Explicit env var ONE_METRO_NATIVE_TRANSFORMS=1 forces native worker even with user babel config
587
+ process.env.ONE_METRO_NATIVE_TRANSFORMS = '1'
588
+ const config4 = await buildMetroConfigInputFromViteConfig(mockViteConfig, {})
589
+ expect(config4.defaultConfig.transformerPath).toContain('metroNativeWorker')
590
+ delete process.env.ONE_METRO_NATIVE_TRANSFORMS
591
+
592
+ // Explicit nativeTransforms: true also forces native worker
593
+ const config5 = await buildMetroConfigInputFromViteConfig(mockViteConfig, {
594
+ nativeTransforms: true,
595
+ })
596
+ expect(config5.defaultConfig.transformerPath).toContain('metroNativeWorker')
597
+ } finally {
598
+ delete process.env.ONE_METRO_NATIVE_TRANSFORMS
599
+ fs.rmSync(tempDir, { recursive: true, force: true })
600
+ }
601
+ })
602
+
603
+ it('warns naming the ignored user babel config when native transforms are forced', async () => {
604
+ const tempDir = fs.realpathSync(
605
+ fs.mkdtempSync(path.join(process.cwd(), '.tmp-metro-test-'))
606
+ )
607
+ fs.writeFileSync(path.join(tempDir, 'package.json'), '{}')
608
+ const babelConfigPath = path.join(tempDir, 'babel.config.js')
609
+ fs.writeFileSync(babelConfigPath, 'module.exports = { plugins: [] }')
610
+ try {
611
+ delete process.env.ONE_METRO_NATIVE_TRANSFORMS
612
+ const mockViteConfig = { root: tempDir } as any
613
+ const warnsWithConfig = (spy: any) =>
614
+ spy.mock.calls.some((args: any[]) => args.join(' ').includes(babelConfigPath))
615
+
616
+ // explicit option force still uses the worker, but names the dropped config
617
+ const optionWarn = vi.spyOn(console, 'warn').mockImplementation(() => {})
618
+ try {
619
+ const forced = await buildMetroConfigInputFromViteConfig(mockViteConfig, {
620
+ nativeTransforms: true,
621
+ })
622
+ expect(forced.defaultConfig.transformerPath).toContain('metroNativeWorker')
623
+ expect(warnsWithConfig(optionWarn)).toBe(true)
624
+ } finally {
625
+ optionWarn.mockRestore()
626
+ }
627
+
628
+ // env var force warns the same way
629
+ const envWarn = vi.spyOn(console, 'warn').mockImplementation(() => {})
630
+ try {
631
+ process.env.ONE_METRO_NATIVE_TRANSFORMS = '1'
632
+ const envForced = await buildMetroConfigInputFromViteConfig(mockViteConfig, {})
633
+ expect(envForced.defaultConfig.transformerPath).toContain('metroNativeWorker')
634
+ expect(warnsWithConfig(envWarn)).toBe(true)
635
+ } finally {
636
+ envWarn.mockRestore()
637
+ delete process.env.ONE_METRO_NATIVE_TRANSFORMS
638
+ }
639
+
640
+ // default (no force) respects the config silently: babel fallback, no warning
641
+ const respectedWarn = vi.spyOn(console, 'warn').mockImplementation(() => {})
642
+ try {
643
+ const respected = await buildMetroConfigInputFromViteConfig(mockViteConfig, {})
644
+ expect(respected.defaultConfig.transformerPath).not.toContain('metroNativeWorker')
645
+ expect(warnsWithConfig(respectedWarn)).toBe(false)
646
+ } finally {
647
+ respectedWarn.mockRestore()
648
+ }
649
+ } finally {
650
+ delete process.env.ONE_METRO_NATIVE_TRANSFORMS
651
+ fs.rmSync(tempDir, { recursive: true, force: true })
652
+ }
653
+ })
654
+
655
+ it('selects the same transformer in both metro config builders', async () => {
656
+ const tempDir = fs.realpathSync(
657
+ fs.mkdtempSync(path.join(process.cwd(), '.tmp-metro-test-'))
658
+ )
659
+ fs.writeFileSync(path.join(tempDir, 'package.json'), '{}')
660
+ try {
661
+ delete process.env.ONE_METRO_NATIVE_TRANSFORMS
662
+ const mockViteConfig = { root: tempDir } as any
663
+
664
+ // no user config: both builders default to the native worker
665
+ const nativeInput = await buildMetroConfigInputFromViteConfig(mockViteConfig, {})
666
+ const nativeFull = await getMetroConfigFromViteConfig(mockViteConfig, {})
667
+ expect(nativeInput.defaultConfig.transformerPath).toContain('metroNativeWorker')
668
+ expect((nativeFull as any).transformerPath).toContain('metroNativeWorker')
669
+
670
+ // user config: both builders fall back to the babel transformer
671
+ const babelConfigPath = path.join(tempDir, 'babel.config.js')
672
+ fs.writeFileSync(babelConfigPath, 'module.exports = { plugins: [] }')
673
+ const fallbackInput = await buildMetroConfigInputFromViteConfig(mockViteConfig, {})
674
+ const fallbackFull = await getMetroConfigFromViteConfig(mockViteConfig, {})
675
+ expect(fallbackInput.defaultConfig.transformerPath).not.toContain(
676
+ 'metroNativeWorker'
677
+ )
678
+ expect((fallbackFull as any).transformerPath).not.toContain('metroNativeWorker')
679
+
680
+ // forced with a user config: both builders warn naming the ignored file
681
+ const forcedWarn = vi.spyOn(console, 'warn').mockImplementation(() => {})
682
+ try {
683
+ const forcedInput = await buildMetroConfigInputFromViteConfig(mockViteConfig, {
684
+ nativeTransforms: true,
685
+ })
686
+ const forcedFull = await getMetroConfigFromViteConfig(mockViteConfig, {
687
+ nativeTransforms: true,
688
+ })
689
+ expect(forcedInput.defaultConfig.transformerPath).toContain('metroNativeWorker')
690
+ expect((forcedFull as any).transformerPath).toContain('metroNativeWorker')
691
+ expect(
692
+ forcedWarn.mock.calls.some((args: any[]) =>
693
+ args.join(' ').includes(babelConfigPath)
694
+ )
695
+ ).toBe(true)
696
+ } finally {
697
+ forcedWarn.mockRestore()
698
+ }
699
+ } finally {
700
+ delete process.env.ONE_METRO_NATIVE_TRANSFORMS
701
+ fs.rmSync(tempDir, { recursive: true, force: true })
702
+ }
703
+ })
704
+
518
705
  it('transforms and executes a real 2-module Metro bundle through metro-runtime require polyfill', async () => {
519
706
  // Probe 1 verification:
520
707
  // Module 2 (dep.js): exports a value
@@ -1130,7 +1317,11 @@ describe('one native transform ports', () => {
1130
1317
  it('inlines import.meta.env reads, which oxc otherwise lowers to an empty object', () => {
1131
1318
  // oxc's CJS lowering emits `var import_meta = {}`, so an untouched
1132
1319
  // `import.meta.env.X` silently reads undefined in every native bundle.
1133
- const env = { DEV: false, VITE_POSTHOG_API_KEY: 'pk_live', TAMAGUI_TARGET: 'native' }
1320
+ const env = {
1321
+ DEV: false,
1322
+ VITE_POSTHOG_API_KEY: 'pk_live',
1323
+ TAMAGUI_TARGET: 'native',
1324
+ }
1134
1325
  const out = applyInlineEnvVars(
1135
1326
  `export const key = import.meta.env.VITE_POSTHOG_API_KEY;
1136
1327
  export const target = import.meta.env?.TAMAGUI_TARGET;
@@ -1225,7 +1416,9 @@ export const all = { ...import.meta.env };`,
1225
1416
  // takeout adds `hot-updater/babel-plugin` for OTA; dropping it silently
1226
1417
  // would ship a build whose updates never apply.
1227
1418
  const withPlugins = (plugins: any[]) =>
1228
- ({ customTransformOptions: { vite: { babelConfig: { plugins } } } }) as any
1419
+ ({
1420
+ customTransformOptions: { vite: { babelConfig: { plugins } } },
1421
+ }) as any
1229
1422
 
1230
1423
  expect(() =>
1231
1424
  assertNoUnportedBabelPlugins(
@@ -1284,3 +1477,199 @@ export const all = { ...import.meta.env };`,
1284
1477
  )
1285
1478
  })
1286
1479
  })
1480
+
1481
+ describe('metro babel fallback config names', () => {
1482
+ it('extends json babel configs just like the compiler detection does', async () => {
1483
+ // loadBabelConfig memoizes a singleton, so each case gets a fresh module
1484
+ for (const name of ['babel.config.json', '.babelrc.json']) {
1485
+ vi.resetModules()
1486
+ const { loadBabelConfig } = await import('./loadBabelConfig')
1487
+ const tempDir = fs.realpathSync(
1488
+ fs.mkdtempSync(path.join(os.tmpdir(), 'vxrn-babel-json-'))
1489
+ )
1490
+ try {
1491
+ fs.writeFileSync(path.join(tempDir, name), JSON.stringify({ plugins: [] }))
1492
+ expect(loadBabelConfig({ projectRoot: tempDir })).toEqual({
1493
+ extends: path.join(tempDir, name),
1494
+ })
1495
+ } finally {
1496
+ fs.rmSync(tempDir, { recursive: true, force: true })
1497
+ }
1498
+ }
1499
+
1500
+ // control: js configs keep loading
1501
+ vi.resetModules()
1502
+ const { loadBabelConfig } = await import('./loadBabelConfig')
1503
+ const tempDir = fs.realpathSync(
1504
+ fs.mkdtempSync(path.join(os.tmpdir(), 'vxrn-babel-json-'))
1505
+ )
1506
+ try {
1507
+ fs.writeFileSync(
1508
+ path.join(tempDir, 'babel.config.js'),
1509
+ 'module.exports = { plugins: [] }'
1510
+ )
1511
+ expect(loadBabelConfig({ projectRoot: tempDir })).toEqual({
1512
+ extends: path.join(tempDir, 'babel.config.js'),
1513
+ })
1514
+ } finally {
1515
+ fs.rmSync(tempDir, { recursive: true, force: true })
1516
+ }
1517
+ })
1518
+ })
1519
+
1520
+ describe('one public env contract in the metro worker', () => {
1521
+ it('inlines One and Expo public reads in dev and prod with no virtual module', () => {
1522
+ for (const isProduction of [false, true]) {
1523
+ const out = applyInlineEnvVars(
1524
+ `export const values = [process.env.ONE_PUBLIC_API, process.env.EXPO_PUBLIC_API, import.meta.env.EXPO_PUBLIC_API];
1525
+ export const all = { ...import.meta.env };`,
1526
+ 'env.ts',
1527
+ isProduction,
1528
+ { ONE_PUBLIC_API: 'https://api.test' }
1529
+ )
1530
+ expect(out).toContain(
1531
+ 'export const values = ["https://api.test", "https://api.test", "https://api.test"];'
1532
+ )
1533
+ expect(out).toContain('"EXPO_PUBLIC_API":"https://api.test"')
1534
+ expect(out).not.toContain('expo/virtual/env')
1535
+ expect(out).not.toContain('_$$_EXPO_ENV')
1536
+ }
1537
+ })
1538
+
1539
+ it('preserves explicit conflicting values', () => {
1540
+ for (const isProduction of [false, true]) {
1541
+ const out = applyInlineEnvVars(
1542
+ 'export const values = [process.env.ONE_PUBLIC_API, process.env.EXPO_PUBLIC_API];',
1543
+ 'env.ts',
1544
+ isProduction,
1545
+ { ONE_PUBLIC_API: 'one', EXPO_PUBLIC_API: 'expo' }
1546
+ )
1547
+ expect(out).toBe('export const values = ["one", "expo"];')
1548
+ }
1549
+ })
1550
+
1551
+ it('accepts Expo runtime feature flags that are not configured', () => {
1552
+ const out = applyInlineEnvVars(
1553
+ 'export const useRnFetch = process.env.EXPO_PUBLIC_USE_RN_FETCH;',
1554
+ '/app/node_modules/expo/build/winter/runtime.native.js',
1555
+ false,
1556
+ { EXPO_PUBLIC_USE_RN_FETCH: undefined }
1557
+ )
1558
+ expect(out).toBe('export const useRnFetch = undefined;')
1559
+ })
1560
+
1561
+ it('carries public aliases through the whole import.meta.env object', () => {
1562
+ const out = applyInlineEnvVars(
1563
+ 'export const all = { ...import.meta.env };',
1564
+ 'env.ts',
1565
+ true,
1566
+ { ONE_PUBLIC_API: 'one' }
1567
+ )
1568
+ expect(out).toContain('"ONE_PUBLIC_API":"one"')
1569
+ expect(out).toContain('"EXPO_PUBLIC_API":"one"')
1570
+ })
1571
+ })
1572
+
1573
+ describe('optional expo virtual env', () => {
1574
+ const virtualFilename = '/proj/node_modules/expo/virtual/env.js'
1575
+ const virtualSource = 'export const env = process.env;'
1576
+
1577
+ function runFactory(
1578
+ code: string,
1579
+ opts: { requireImpl: (...args: any[]) => any; procEnv: Record<string, string> }
1580
+ ) {
1581
+ const module = { exports: {} as any }
1582
+ vm.runInNewContext(code, {
1583
+ __d(factory: any) {
1584
+ factory(
1585
+ {},
1586
+ opts.requireImpl,
1587
+ (v: any) => v,
1588
+ (v: any) => v,
1589
+ module,
1590
+ module.exports,
1591
+ []
1592
+ )
1593
+ },
1594
+ process: { env: opts.procEnv },
1595
+ console,
1596
+ })
1597
+ return module.exports
1598
+ }
1599
+
1600
+ const noRequire = () => {
1601
+ throw new Error('unexpected require call')
1602
+ }
1603
+
1604
+ it('merges .env files over process.env in dev like upstream', async () => {
1605
+ const result = await transform({}, '/proj', virtualFilename, Buffer.from(virtualSource), {
1606
+ dev: true,
1607
+ minify: false,
1608
+ platform: 'ios',
1609
+ type: 'module',
1610
+ customTransformOptions: { environment: 'client' },
1611
+ })
1612
+ const code = result.output[0].data.code
1613
+ expect(code).toContain('dotEnvModules')
1614
+ expect(code).toContain('.env.development.local')
1615
+ const contextModule: any = () => ({
1616
+ default: { EXPO_PUBLIC_SENTINEL_DOTENV: 'dotenv-sentinel-value' },
1617
+ })
1618
+ contextModule.keys = () => ['./.env']
1619
+ // metro lowers require.context(rel) to require(contextId, rel)
1620
+ const requireImpl: any = (_id: unknown, _rel?: unknown) => contextModule
1621
+ const mod = runFactory(code, {
1622
+ requireImpl,
1623
+ procEnv: { EXPO_PUBLIC_SENTINEL_PROC: 'proc-sentinel-value' },
1624
+ })
1625
+ expect(mod.env.EXPO_PUBLIC_SENTINEL_DOTENV).toBe('dotenv-sentinel-value')
1626
+ expect(mod.env.EXPO_PUBLIC_SENTINEL_PROC).toBe('proc-sentinel-value')
1627
+ })
1628
+
1629
+ it('throws a naming error in production like upstream', async () => {
1630
+ const result = await transform({}, '/proj', virtualFilename, Buffer.from(virtualSource), {
1631
+ dev: false,
1632
+ minify: false,
1633
+ platform: 'ios',
1634
+ type: 'module',
1635
+ customTransformOptions: { environment: 'client' },
1636
+ })
1637
+ const mod = runFactory(result.output[0].data.code, {
1638
+ requireImpl: noRequire,
1639
+ procEnv: {},
1640
+ })
1641
+ expect(() => mod.env.EXPO_PUBLIC_ANYTHING).toThrow(
1642
+ 'not supported in production bundles'
1643
+ )
1644
+ })
1645
+
1646
+ it('leaves .env files alone without Expo installed', async () => {
1647
+ const result = await transform(
1648
+ {},
1649
+ '/proj-no-expo',
1650
+ '/proj-no-expo/.env',
1651
+ Buffer.from('EXPO_PUBLIC_A=1\nSECRET=2\n'),
1652
+ {
1653
+ dev: true,
1654
+ minify: false,
1655
+ platform: 'ios',
1656
+ type: 'module',
1657
+ customTransformOptions: { environment: 'client' },
1658
+ }
1659
+ )
1660
+ const code = result.output[0].data.code
1661
+ expect(code).toContain('EXPO_PUBLIC_A')
1662
+ expect(code).not.toContain('EXPO_PUBLIC_A":"1')
1663
+ })
1664
+
1665
+ it('leaves the virtual module alone outside client environments', async () => {
1666
+ const result = await transform({}, '/proj', virtualFilename, Buffer.from(virtualSource), {
1667
+ dev: true,
1668
+ minify: false,
1669
+ platform: 'ios',
1670
+ type: 'module',
1671
+ customTransformOptions: { environment: 'react-server' },
1672
+ })
1673
+ expect(result.output[0].data.code).not.toContain('require.context')
1674
+ })
1675
+ })