@vxrn/vite-plugin-metro 1.27.1 → 2.0.0-beta.101.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 (335) 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 +287 -272
  18. package/dist/cjs/metro-config/getMetroConfigFromViteConfig.native.cjs +346 -0
  19. package/dist/cjs/metro-config/getMetroConfigFromViteConfig.native.js +309 -282
  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 +149 -151
  86. package/dist/cjs/transformer/babel-transformer.native.cjs +190 -0
  87. package/dist/cjs/transformer/babel-transformer.native.js +164 -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 +1430 -1488
  98. package/dist/cjs/transformer/metroNativeWorker.native.cjs +2519 -0
  99. package/dist/cjs/transformer/metroNativeWorker.native.js +2407 -2560
  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 +271 -247
  141. package/dist/esm/metro-config/getMetroConfigFromViteConfig.mjs.map +1 -1
  142. package/dist/esm/metro-config/getMetroConfigFromViteConfig.native.js +293 -258
  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 +133 -132
  199. package/dist/esm/transformer/babel-transformer.mjs.map +1 -1
  200. package/dist/esm/transformer/babel-transformer.native.js +145 -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 +1393 -1442
  211. package/dist/esm/transformer/metroNativeWorker.mjs.map +1 -1
  212. package/dist/esm/transformer/metroNativeWorker.native.js +2370 -2515
  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 +15 -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 +60 -0
  244. package/src/metro-config/getMetroConfigFromViteConfig.ts +150 -113
  245. package/src/plugins/metroPlugin.ts +3 -6
  246. package/src/transformer/babel-transformer.test.ts +118 -0
  247. package/src/transformer/babel-transformer.ts +82 -15
  248. package/src/transformer/expoVirtualEnv.integration.test.ts +106 -0
  249. package/src/transformer/expoVirtualEnv.test.ts +72 -0
  250. package/src/transformer/expoVirtualEnv.ts +115 -0
  251. package/src/transformer/loadBabelConfig.ts +1 -1
  252. package/src/transformer/metroNativeWorker.test.ts +268 -50
  253. package/src/transformer/metroNativeWorker.ts +53 -71
  254. package/src/transformer/transformSync.test.ts +22 -0
  255. package/src/transformer/transformSync.ts +4 -4
  256. package/src/utils/exit.ts +2 -2
  257. package/src/utils/getTerminalReporter.ts +1 -1
  258. package/src/utils/projectImport.ts +2 -2
  259. package/types/babel-plugins/import-meta-env-plugin.d.ts +1 -1
  260. package/types/babel-plugins/import-meta-env-plugin.d.ts.map +1 -1
  261. package/types/env/platformEnv.d.ts +2 -1
  262. package/types/env/platformEnv.d.ts.map +1 -1
  263. package/types/index.d.ts +0 -2
  264. package/types/index.d.ts.map +1 -1
  265. package/types/metro-config/getMetroBabelConfigFromViteConfig.d.ts +1 -1
  266. package/types/metro-config/getMetroBabelConfigFromViteConfig.d.ts.map +1 -1
  267. package/types/metro-config/getMetroConfigFromViteConfig.d.ts +2 -2
  268. package/types/metro-config/getMetroConfigFromViteConfig.d.ts.map +1 -1
  269. package/types/plugins/metroPlugin.d.ts +2 -4
  270. package/types/plugins/metroPlugin.d.ts.map +1 -1
  271. package/types/rn-commands/bundle/assetPathUtils.d.ts.map +1 -1
  272. package/types/rn-commands/bundle/filterPlatformAssetScales.d.ts.map +1 -1
  273. package/types/rn-commands/bundle/getAssetDestPathAndroid.d.ts.map +1 -1
  274. package/types/rn-commands/bundle/getAssetDestPathIOS.d.ts.map +1 -1
  275. package/types/rn-commands/bundle/saveAssets.d.ts.map +1 -1
  276. package/types/transformer/babel-transformer.d.ts +10 -1
  277. package/types/transformer/babel-transformer.d.ts.map +1 -1
  278. package/types/transformer/expoVirtualEnv.d.ts +8 -0
  279. package/types/transformer/expoVirtualEnv.d.ts.map +1 -0
  280. package/types/transformer/metroNativeWorker.d.ts +7 -8
  281. package/types/transformer/metroNativeWorker.d.ts.map +1 -1
  282. package/types/utils/projectImport.d.ts +2 -2
  283. package/dist/cjs/plugins/expoManifestRequestHandlerPlugin.cjs +0 -71
  284. package/dist/cjs/plugins/expoManifestRequestHandlerPlugin.native.js +0 -82
  285. package/dist/cjs/plugins/expoManifestRequestHandlerPlugin.native.js.map +0 -1
  286. package/dist/cjs/transformer/metroNativeWorker.test.cjs +0 -1054
  287. package/dist/cjs/transformer/metroNativeWorker.test.native.js +0 -1170
  288. package/dist/cjs/transformer/metroNativeWorker.test.native.js.map +0 -1
  289. package/dist/cjs/transformer/transformSync.test.cjs +0 -36
  290. package/dist/cjs/transformer/transformSync.test.native.js +0 -49
  291. package/dist/cjs/transformer/transformSync.test.native.js.map +0 -1
  292. package/dist/cjs/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.cjs +0 -39
  293. package/dist/cjs/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js +0 -42
  294. package/dist/cjs/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js.map +0 -1
  295. package/dist/esm/index.js.map +0 -1
  296. package/dist/esm/index.mjs.map +0 -1
  297. package/dist/esm/index.native.js.map +0 -1
  298. package/dist/esm/metro-config/types.mjs.map +0 -1
  299. package/dist/esm/metro-config/types.native.js.map +0 -1
  300. package/dist/esm/plugins/expoManifestRequestHandlerPlugin.mjs +0 -46
  301. package/dist/esm/plugins/expoManifestRequestHandlerPlugin.mjs.map +0 -1
  302. package/dist/esm/plugins/expoManifestRequestHandlerPlugin.native.js +0 -54
  303. package/dist/esm/plugins/expoManifestRequestHandlerPlugin.native.js.map +0 -1
  304. package/dist/esm/rn-commands/bundle/index.mjs.map +0 -1
  305. package/dist/esm/rn-commands/bundle/index.native.js.map +0 -1
  306. package/dist/esm/rn-commands/bundle/types.mjs.map +0 -1
  307. package/dist/esm/rn-commands/bundle/types.native.js.map +0 -1
  308. package/dist/esm/rn-commands/index.mjs.map +0 -1
  309. package/dist/esm/rn-commands/index.native.js.map +0 -1
  310. package/dist/esm/transformer/babel-core.mjs.map +0 -1
  311. package/dist/esm/transformer/babel-core.native.js.map +0 -1
  312. package/dist/esm/transformer/metroNativeWorker.test.mjs +0 -1010
  313. package/dist/esm/transformer/metroNativeWorker.test.mjs.map +0 -1
  314. package/dist/esm/transformer/metroNativeWorker.test.native.js +0 -1124
  315. package/dist/esm/transformer/metroNativeWorker.test.native.js.map +0 -1
  316. package/dist/esm/transformer/transformSync.test.mjs +0 -37
  317. package/dist/esm/transformer/transformSync.test.mjs.map +0 -1
  318. package/dist/esm/transformer/transformSync.test.native.js +0 -47
  319. package/dist/esm/transformer/transformSync.test.native.js.map +0 -1
  320. package/dist/esm/transformer/types.mjs.map +0 -1
  321. package/dist/esm/transformer/types.native.js.map +0 -1
  322. package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.mjs +0 -14
  323. package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.mjs.map +0 -1
  324. package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js +0 -14
  325. package/dist/esm/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.native.js.map +0 -1
  326. package/src/plugins/expoManifestRequestHandlerPlugin.ts +0 -88
  327. package/src/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.ts +0 -28
  328. package/types/plugins/expoManifestRequestHandlerPlugin.d.ts +0 -14
  329. package/types/plugins/expoManifestRequestHandlerPlugin.d.ts.map +0 -1
  330. package/types/transformer/metroNativeWorker.test.d.ts +0 -2
  331. package/types/transformer/metroNativeWorker.test.d.ts.map +0 -1
  332. package/types/transformer/transformSync.test.d.ts +0 -2
  333. package/types/transformer/transformSync.test.d.ts.map +0 -1
  334. package/types/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.d.ts +0 -5
  335. package/types/utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName.d.ts.map +0 -1
@@ -1,27 +1,73 @@
1
- import type { ResolvedConfig } from 'vite'
1
+ import { searchForWorkspaceRoot, type ResolvedConfig } from 'vite'
2
2
  import { spawn } from 'node:child_process'
3
3
  import { resolve } from 'node:path'
4
4
  import micromatch from 'micromatch'
5
+ import { getDefaultConfig } from '@react-native/metro-config'
5
6
 
6
- // For Metro and Expo, we only import types here.
7
- // We use `projectImport` to dynamically import the actual modules
8
- // at runtime to ensure they are loaded from the user's project root.
7
+ // metro itself is loaded from the app so its cli and config stay aligned.
8
+ // the base config belongs to this package and matches its react-native peer.
9
9
  import type { loadConfig as loadConfigT } from 'metro'
10
- import type { getDefaultConfig as getDefaultConfigT } from '@expo/metro-config'
11
10
 
12
11
  import { findUserBabelConfig } from '@vxrn/compiler'
13
12
  import { projectImport, projectResolve } from '../utils/projectImport'
14
13
  import { getTerminalReporter } from '../utils/getTerminalReporter'
15
- import { patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName } from '../utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName'
16
14
  import type { MetroPluginOptions } from '../plugins/metroPlugin'
17
15
  import type { ExtraConfig, MetroConfigExtended } from './types'
18
16
 
19
- type MetroInputConfig = Parameters<typeof loadConfigT>[1]
17
+ type MetroInputConfig = NonNullable<Parameters<typeof loadConfigT>[1]>
20
18
 
21
19
  const WATCHMAN_PROBE_TIMEOUT_MS = 2000
20
+ const expoEnvAdditionalExts = ['env', 'local', 'development']
22
21
  const watchmanResponsivePromises = new Map<string, Promise<boolean>>()
23
22
  let didWarnAboutWatchmanFallback = false
24
23
  const rootIndexBundleRequestPattern = /^(https?:\/\/[^/]+)?\/index\.bundle(?=$|[?#])/
24
+ // expo prebuild writes an AppDelegate (ios) and MainApplication (android) whose
25
+ // debug bundle url is `.expo/.virtual-metro-entry`. expo maps it to the main
26
+ // entry through server.rewriteRequestUrl (see @expo/metro-config
27
+ // src/rewriteRequestUrl.ts: `url.includes('/.expo/.virtual-metro-entry.bundle?')`
28
+ // rewrites to the resolved entry, preserving relative vs absolute shape and
29
+ // query). match that path to the same main entry as index.
30
+ const expoVirtualEntryBundleRequestPattern =
31
+ /^(https?:\/\/[^/]+)?\/\.expo\/\.virtual-metro-entry\.bundle(?=$|[?#])/
32
+ // keep app build output and volatile caches out of Metro's fallback watcher.
33
+ // package dist directories remain visible because Metro resolves modules from them.
34
+ const metroWatchExclusions = [
35
+ /[/\\]dist[/\\](?:static|server)(?:[/\\]|$)/,
36
+ /[/\\]tests[/\\][^/\\]+[/\\]dist(?:[/\\]|$)/,
37
+ /[/\\]\.docker(?:[/\\]|$)/,
38
+ /[/\\]\.vite(?:[/\\]|$)/,
39
+ /[/\\]node_modules[/\\]\.vxrn(?:[/\\]|$)/,
40
+ ]
41
+
42
+ function enforceWorkspaceVisibility(
43
+ config: MetroInputConfig,
44
+ projectRoot: string
45
+ ): MetroInputConfig {
46
+ const workspaceRoot = searchForWorkspaceRoot(projectRoot)
47
+ if (workspaceRoot === projectRoot) return config
48
+
49
+ return {
50
+ ...config,
51
+ watchFolders: [...new Set([...(config.watchFolders ?? []), workspaceRoot])],
52
+ resolver: {
53
+ ...config.resolver,
54
+ nodeModulesPaths: [
55
+ ...new Set([
56
+ ...(config.resolver?.nodeModulesPaths ?? []),
57
+ resolve(projectRoot, 'node_modules'),
58
+ resolve(workspaceRoot, 'node_modules'),
59
+ ]),
60
+ ],
61
+ },
62
+ }
63
+ }
64
+
65
+ function getReactNativeDefaultConfig(projectRoot: string): MetroInputConfig {
66
+ return enforceWorkspaceVisibility(
67
+ getDefaultConfig(projectRoot) as MetroInputConfig,
68
+ projectRoot
69
+ )
70
+ }
25
71
 
26
72
  function getPlatformFromBundleUrl(url: string): 'ios' | 'android' {
27
73
  const platform = url.match(/[?&]platform=(ios|android)(?:&|$)/)?.[1]
@@ -36,11 +82,54 @@ function rewriteMainModuleBundleUrl(
36
82
  platform: getPlatformFromBundleUrl(url),
37
83
  })
38
84
 
39
- if (url.includes('/.expo/.virtual-metro-entry.bundle?')) {
40
- return url.replace('.expo/.virtual-metro-entry', resolvedMainModulePath)
85
+ if (rootIndexBundleRequestPattern.test(url)) {
86
+ return url.replace(rootIndexBundleRequestPattern, `$1/${resolvedMainModulePath}.bundle`)
41
87
  }
88
+ return url.replace(
89
+ expoVirtualEntryBundleRequestPattern,
90
+ `$1/${resolvedMainModulePath}.bundle`
91
+ )
92
+ }
93
+
94
+ function isMainModuleBundleRequest(url: string) {
95
+ return (
96
+ rootIndexBundleRequestPattern.test(url) ||
97
+ expoVirtualEntryBundleRequestPattern.test(url)
98
+ )
99
+ }
100
+
101
+ function isBareSpecifier(name: string) {
102
+ return name !== '' && !name.startsWith('.') && !name.startsWith('/')
103
+ }
104
+
105
+ // metro parses `/one/metro-entry.bundle` to the entry `./one/metro-entry`
106
+ // relative to the server root, which misses node_modules package lookup.
107
+ function bareMainModuleForRequest(
108
+ moduleName: string,
109
+ mainModuleName: string | undefined
110
+ ) {
111
+ if (!mainModuleName || !isBareSpecifier(mainModuleName)) return undefined
112
+ if (moduleName === `./${mainModuleName}`) return mainModuleName
113
+ return undefined
114
+ }
42
115
 
43
- return url.replace(rootIndexBundleRequestPattern, `$1/${resolvedMainModulePath}.bundle`)
116
+ // defaultConfigOverrides and Metro config loading can replace the resolver.
117
+ // enforce package semantics on the final config while leaving every other
118
+ // request on the resolver selected by that composition.
119
+ function enforceBareMainModuleEntry(config: any, mainModuleName: string | undefined) {
120
+ if (!mainModuleName || !isBareSpecifier(mainModuleName)) return config
121
+ const innerResolveRequest = config?.resolver?.resolveRequest
122
+ return {
123
+ ...config,
124
+ resolver: {
125
+ ...config?.resolver,
126
+ resolveRequest: (context: any, moduleName: string, platform: string) => {
127
+ const bareMain = bareMainModuleForRequest(moduleName, mainModuleName)
128
+ const resolveRequest = innerResolveRequest || context.resolveRequest
129
+ return resolveRequest(context, bareMain ?? moduleName, platform)
130
+ },
131
+ },
132
+ }
44
133
  }
45
134
 
46
135
  async function isWatchmanResponsive(projectRoot: string) {
@@ -126,7 +215,7 @@ function resolveNativeTransforms(
126
215
  * Build the Metro config input WITHOUT calling Metro's `loadConfig`. Returns
127
216
  * the same shape Metro `loadConfig` expects as its second argument. Use this
128
217
  * from a project's `metro.config.cjs` so the outer `loadConfig` (driven by
129
- * Expo CLI / Metro CLI) is the only one that runs — avoids infinite
218
+ * the Metro CLI) is the only one that runs. this avoids infinite
130
219
  * recursion that would happen if the inner pipeline also called `loadConfig`
131
220
  * and re-read the same metro.config.cjs.
132
221
  */
@@ -147,70 +236,31 @@ export async function buildMetroConfigInputFromViteConfig(
147
236
  )
148
237
  }
149
238
 
150
- const { getDefaultConfig } = await projectImport<{
151
- getDefaultConfig: typeof getDefaultConfigT
152
- }>(projectRoot, '@expo/metro-config')
153
-
154
- const _defaultConfig: MetroInputConfig = getDefaultConfig(projectRoot) as any
239
+ const _defaultConfig = getReactNativeDefaultConfig(projectRoot)
155
240
 
156
241
  if (mainModuleName) {
157
- const origRewriteRequestUrl = _defaultConfig!.server!.rewriteRequestUrl!
158
-
159
- const resolveMainModuleName: (p: { platform: 'ios' | 'android' }) => string =
160
- await (async () => {
161
- const ExpoGoManifestHandlerMiddleware = (
162
- await projectImport(
163
- projectRoot,
164
- '@expo/cli/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js'
165
- )
166
- ).default.ExpoGoManifestHandlerMiddleware
167
-
168
- const manifestHandlerMiddleware = new ExpoGoManifestHandlerMiddleware(
169
- projectRoot,
170
- {}
171
- )
172
-
173
- patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName(
174
- manifestHandlerMiddleware,
175
- mainModuleName
176
- )
177
-
178
- return (p) => {
179
- return manifestHandlerMiddleware.resolveMainModuleName({
180
- pkg: { main: mainModuleName },
181
- platform: p.platform,
182
- })
183
- }
184
- })()
242
+ const origRewriteRequestUrl = _defaultConfig!.server?.rewriteRequestUrl
243
+ const resolveMainModuleName = () => mainModuleName
185
244
 
186
245
  extraConfig.getResolveMainModuleName = resolveMainModuleName
187
246
 
188
247
  // @ts-expect-error Metro 0.83 made this read-only in types but we need to patch it
189
248
  _defaultConfig!.server!.rewriteRequestUrl = (url) => {
190
- if (
191
- url.includes('/.expo/.virtual-metro-entry.bundle?') ||
192
- rootIndexBundleRequestPattern.test(url)
193
- ) {
249
+ if (isMainModuleBundleRequest(url)) {
194
250
  return rewriteMainModuleBundleUrl(url, resolveMainModuleName)
195
251
  }
196
- return origRewriteRequestUrl(url)
252
+ return origRewriteRequestUrl?.(url) ?? url
197
253
  }
198
254
  }
199
255
 
200
256
  const existingBlockList = _defaultConfig?.resolver?.blockList
201
- const buildOutputExclusions = [
202
- /[/\\]dist[/\\](?:static|server)(?:[/\\]|$)/,
203
- /[/\\]tests[/\\][^/\\]+[/\\]dist(?:[/\\]|$)/,
204
- /[/\\]\.docker(?:[/\\]|$)/,
205
- /[/\\]\.vite(?:[/\\]|$)/,
206
- ]
207
257
  const blockList: RegExp[] = [
208
258
  ...(existingBlockList
209
259
  ? Array.isArray(existingBlockList)
210
260
  ? existingBlockList
211
261
  : [existingBlockList]
212
262
  : []),
213
- ...buildOutputExclusions,
263
+ ...metroWatchExclusions,
214
264
  ]
215
265
 
216
266
  // no babel by default. the worker throws on a babel plugin it has no port
@@ -230,6 +280,15 @@ export async function buildMetroConfigInputFromViteConfig(
230
280
 
231
281
  const defaultConfig: MetroInputConfig = {
232
282
  ..._defaultConfig,
283
+ watcher: {
284
+ ..._defaultConfig?.watcher,
285
+ additionalExts: [
286
+ ...new Set([
287
+ ...(_defaultConfig?.watcher?.additionalExts ?? []),
288
+ ...expoEnvAdditionalExts,
289
+ ]),
290
+ ],
291
+ },
233
292
  resolver: {
234
293
  ..._defaultConfig?.resolver,
235
294
  useWatchman,
@@ -266,6 +325,10 @@ export async function buildMetroConfigInputFromViteConfig(
266
325
  },
267
326
  transformer: {
268
327
  ..._defaultConfig?.transformer,
328
+ // one's router and Expo's optional development env module both use
329
+ // require.context. Metro installs a throwing runtime stub unless this
330
+ // graph feature is enabled.
331
+ unstable_allowRequireContext: true,
269
332
  babelTransformerPath: projectResolve(
270
333
  projectRoot,
271
334
  '@vxrn/vite-plugin-metro/babel-transformer'
@@ -284,7 +347,14 @@ export async function buildMetroConfigInputFromViteConfig(
284
347
  : defaultConfigOverrides),
285
348
  }
286
349
 
287
- return { defaultConfig: merged, projectRoot, extraConfig }
350
+ return {
351
+ defaultConfig: enforceBareMainModuleEntry(
352
+ enforceWorkspaceVisibility(merged, projectRoot),
353
+ mainModuleName
354
+ ),
355
+ projectRoot,
356
+ extraConfig,
357
+ }
288
358
  }
289
359
 
290
360
  export async function getMetroConfigFromViteConfig(
@@ -310,81 +380,32 @@ export async function getMetroConfigFromViteConfig(
310
380
  const { loadConfig } = await projectImport<{
311
381
  loadConfig: typeof loadConfigT
312
382
  }>(projectRoot, 'metro')
313
- const { getDefaultConfig } = await projectImport<{
314
- getDefaultConfig: typeof getDefaultConfigT
315
- }>(projectRoot, '@expo/metro-config')
316
-
317
- const _defaultConfig: MetroInputConfig = getDefaultConfig(projectRoot) as any
383
+ const _defaultConfig = getReactNativeDefaultConfig(projectRoot)
318
384
 
319
385
  if (mainModuleName) {
320
- const origRewriteRequestUrl = _defaultConfig!.server!.rewriteRequestUrl!
321
-
322
- // We need to patch Expo's default `config.server.rewriteRequestUrl`
323
- // to change how URLs like '/.expo/.virtual-metro-entry.bundle?' are
324
- // rewritten.
325
- // But since that function is difficult to override, here we borrow
326
- // the ExpoGoManifestHandlerMiddleware and use it to resolve the
327
- // URL to the main module name.
328
- const resolveMainModuleName: (p: { platform: 'ios' | 'android' }) => string =
329
- await (async () => {
330
- const ExpoGoManifestHandlerMiddleware = (
331
- await projectImport(
332
- projectRoot,
333
- '@expo/cli/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js'
334
- )
335
- ).default.ExpoGoManifestHandlerMiddleware
336
-
337
- const manifestHandlerMiddleware = new ExpoGoManifestHandlerMiddleware(
338
- projectRoot,
339
- {}
340
- )
341
-
342
- patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName(
343
- manifestHandlerMiddleware,
344
- mainModuleName
345
- )
346
-
347
- return (p) => {
348
- return manifestHandlerMiddleware.resolveMainModuleName({
349
- pkg: { main: mainModuleName },
350
- platform: p.platform,
351
- })
352
- }
353
- })()
386
+ const origRewriteRequestUrl = _defaultConfig!.server?.rewriteRequestUrl
387
+ const resolveMainModuleName = () => mainModuleName
354
388
 
355
389
  extraConfig.getResolveMainModuleName = resolveMainModuleName
356
390
 
357
391
  // @ts-expect-error Metro 0.83 made this read-only in types but we need to patch it
358
392
  _defaultConfig!.server!.rewriteRequestUrl = (url) => {
359
- if (
360
- url.includes('/.expo/.virtual-metro-entry.bundle?') ||
361
- rootIndexBundleRequestPattern.test(url)
362
- ) {
393
+ if (isMainModuleBundleRequest(url)) {
363
394
  return rewriteMainModuleBundleUrl(url, resolveMainModuleName)
364
395
  }
365
396
 
366
- return origRewriteRequestUrl(url)
397
+ return origRewriteRequestUrl?.(url) ?? url
367
398
  }
368
399
  }
369
400
 
370
- // exclude app-level build output directories from Metro's watcher to prevent
371
- // FallbackWatcher from crashing on volatile dirs during parallel CI runs.
372
- // block test app dist dirs and one's web build outputs, but not package
373
- // dist/ dirs which Metro needs for module resolution.
374
401
  const existingBlockList = _defaultConfig?.resolver?.blockList
375
- const buildOutputExclusions = [
376
- /[/\\]dist[/\\](?:static|server)(?:[/\\]|$)/,
377
- /[/\\]tests[/\\][^/\\]+[/\\]dist(?:[/\\]|$)/,
378
- /[/\\]\.docker(?:[/\\]|$)/,
379
- /[/\\]\.vite(?:[/\\]|$)/,
380
- ]
381
402
  const blockList: RegExp[] = [
382
403
  ...(existingBlockList
383
404
  ? Array.isArray(existingBlockList)
384
405
  ? existingBlockList
385
406
  : [existingBlockList]
386
407
  : []),
387
- ...buildOutputExclusions,
408
+ ...metroWatchExclusions,
388
409
  ]
389
410
 
390
411
  // no babel by default. the worker throws on a babel plugin it has no port
@@ -404,6 +425,15 @@ export async function getMetroConfigFromViteConfig(
404
425
 
405
426
  const defaultConfig: MetroInputConfig = {
406
427
  ..._defaultConfig,
428
+ watcher: {
429
+ ..._defaultConfig?.watcher,
430
+ additionalExts: [
431
+ ...new Set([
432
+ ...(_defaultConfig?.watcher?.additionalExts ?? []),
433
+ ...expoEnvAdditionalExts,
434
+ ]),
435
+ ],
436
+ },
407
437
  resolver: {
408
438
  ..._defaultConfig?.resolver,
409
439
  useWatchman,
@@ -448,6 +478,10 @@ export async function getMetroConfigFromViteConfig(
448
478
  },
449
479
  transformer: {
450
480
  ..._defaultConfig?.transformer,
481
+ // one's router and Expo's optional development env module both use
482
+ // require.context. Metro installs a throwing runtime stub unless this
483
+ // graph feature is enabled.
484
+ unstable_allowRequireContext: true,
451
485
  babelTransformerPath: projectResolve(
452
486
  projectRoot,
453
487
  '@vxrn/vite-plugin-metro/babel-transformer'
@@ -475,7 +509,10 @@ export async function getMetroConfigFromViteConfig(
475
509
  )
476
510
 
477
511
  return {
478
- ...metroConfig,
512
+ ...enforceBareMainModuleEntry(
513
+ enforceWorkspaceVisibility(metroConfig, projectRoot),
514
+ mainModuleName
515
+ ),
479
516
  ...extraConfig,
480
517
  } as MetroConfigExtended
481
518
  }
@@ -9,8 +9,7 @@ import { checkAndClearMetroCacheFromVite } from '../utils/metroCacheManager'
9
9
 
10
10
  const { debug } = createDebugger('vite-plugin-metro')
11
11
 
12
- // For Metro and Expo, we only import types here.
13
- // We use `projectImport` to dynamically import the actual modules
12
+ // for Metro, we only import types here. `projectImport` loads the actual modules
14
13
  // at runtime to ensure they are loaded from the user's project root.
15
14
  import type MetroT from 'metro'
16
15
  import type { loadConfig as loadConfigT } from 'metro'
@@ -72,10 +71,8 @@ export type MetroPluginOptions = {
72
71
  /**
73
72
  * Overrides the main module name which is normally defined as the `main` field in `package.json`.
74
73
  *
75
- * This will affect how `/.expo/.virtual-metro-entry.bundle` behaves.
76
- *
77
- * It can be used to change the entry point of the React Native app without the need of using
78
- * the `main` field in `package.json`.
74
+ * Changes the React Native entry point without requiring a `main` field in
75
+ * `package.json`.
79
76
  */
80
77
  mainModuleName?: string
81
78
  /**
@@ -0,0 +1,118 @@
1
+ import path from 'node:path'
2
+ import { fileURLToPath } from 'node:url'
3
+ import vm from 'node:vm'
4
+ import { describe, expect, it } from 'vitest'
5
+
6
+ import { transformFromAstSync } from './babel-core'
7
+ // @ts-expect-error: module.exports = has no default export in types, runtime interop provides it
8
+ import babelTransformer from './babel-transformer'
9
+
10
+ const fixturesDir = path.join(
11
+ path.dirname(fileURLToPath(import.meta.url)),
12
+ '__fixtures__'
13
+ )
14
+ const virtualFilename = '/proj/node_modules/expo/virtual/env.js'
15
+ const virtualSource = 'export const env = process.env;'
16
+
17
+ function runBabelTransform(src: string, filename: string, dev: boolean): any {
18
+ // the transformer leaks BABEL_ENV=development when it was previously
19
+ // unset; keep that pre-existing leak out of sibling tests.
20
+ const OLD_BABEL_ENV = process.env.BABEL_ENV
21
+ try {
22
+ return (babelTransformer as any).transform({
23
+ filename,
24
+ src,
25
+ options: {
26
+ projectRoot: fixturesDir,
27
+ dev,
28
+ platform: 'ios',
29
+ customTransformOptions: {
30
+ environment: 'client',
31
+ vite: {
32
+ oneViteMetroBabelConfig: true,
33
+ babelConfig: {
34
+ babelrc: false,
35
+ configFile: false,
36
+ presets: [],
37
+ plugins: [],
38
+ },
39
+ },
40
+ },
41
+ },
42
+ plugins: [],
43
+ })
44
+ } finally {
45
+ if (OLD_BABEL_ENV === undefined) {
46
+ delete process.env.BABEL_ENV
47
+ } else {
48
+ process.env.BABEL_ENV = OLD_BABEL_ENV
49
+ }
50
+ }
51
+ }
52
+
53
+ function codegen(ast: any, filename: string): string {
54
+ const out = transformFromAstSync(ast, virtualSource, {
55
+ filename,
56
+ babelrc: false,
57
+ configFile: false,
58
+ code: true,
59
+ ast: false,
60
+ })
61
+ if (!out?.code) {
62
+ throw new Error('codegen produced no code')
63
+ }
64
+ return out.code
65
+ }
66
+
67
+ function runCjs(
68
+ code: string,
69
+ opts: { requireImpl: (...args: any[]) => any; procEnv: Record<string, string> }
70
+ ) {
71
+ const module = { exports: {} as any }
72
+ vm.runInNewContext(code, {
73
+ require: opts.requireImpl,
74
+ module,
75
+ exports: module.exports,
76
+ process: { env: opts.procEnv },
77
+ console,
78
+ })
79
+ return module.exports
80
+ }
81
+
82
+ const noRequire = () => {
83
+ throw new Error('unexpected require call')
84
+ }
85
+
86
+ describe('babel-transformer optional expo virtual env', () => {
87
+ it('merges .env files over process.env in dev like upstream', () => {
88
+ const result = runBabelTransform(virtualSource, virtualFilename, true)
89
+ expect(result.ast).toBeTruthy()
90
+ const code = codegen(result.ast, virtualFilename)
91
+ expect(code).toContain('require.context')
92
+ expect(code).toContain('.env.development.local')
93
+ const contextModule: any = () => ({
94
+ default: { EXPO_PUBLIC_SENTINEL_DOTENV: 'dotenv-sentinel-value' },
95
+ })
96
+ contextModule.keys = () => ['./.env']
97
+ const requireImpl: any = noRequire
98
+ requireImpl.context = () => contextModule
99
+ const mod = runCjs(code, {
100
+ requireImpl,
101
+ procEnv: { EXPO_PUBLIC_SENTINEL_PROC: 'proc-sentinel-value' },
102
+ })
103
+ expect(mod.env.EXPO_PUBLIC_SENTINEL_DOTENV).toBe('dotenv-sentinel-value')
104
+ expect(mod.env.EXPO_PUBLIC_SENTINEL_PROC).toBe('proc-sentinel-value')
105
+ })
106
+
107
+ it('throws a naming error in production like upstream', () => {
108
+ const result = runBabelTransform(virtualSource, virtualFilename, false)
109
+ expect(result.ast).toBeTruthy()
110
+ const mod = runCjs(codegen(result.ast, virtualFilename), {
111
+ requireImpl: noRequire,
112
+ procEnv: {},
113
+ })
114
+ expect(() => mod.env.EXPO_PUBLIC_ANYTHING).toThrow(
115
+ 'not supported in production bundles'
116
+ )
117
+ })
118
+ })