@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
@@ -1,36 +1,85 @@
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
 
11
+ import { findUserBabelConfig } from '@vxrn/compiler'
12
12
  import { projectImport, projectResolve } from '../utils/projectImport'
13
13
  import { getTerminalReporter } from '../utils/getTerminalReporter'
14
- import { patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName } from '../utils/patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName'
15
14
  import type { MetroPluginOptions } from '../plugins/metroPlugin'
16
15
  import type { ExtraConfig, MetroConfigExtended } from './types'
17
16
 
18
- type MetroInputConfig = Parameters<typeof loadConfigT>[1]
17
+ type MetroInputConfig = NonNullable<Parameters<typeof loadConfigT>[1]>
19
18
 
20
19
  const WATCHMAN_PROBE_TIMEOUT_MS = 2000
20
+ const expoEnvAdditionalExts = ['env', 'local', 'development']
21
+ // keep js before mjs so platform-aware .native.js wins for one dist.
22
+ const metroSourceExts = ['js', 'jsx', 'json', 'ts', 'tsx', 'mjs', 'cjs', 'swift', 'kt']
21
23
  const watchmanResponsivePromises = new Map<string, Promise<boolean>>()
22
24
  let didWarnAboutWatchmanFallback = false
23
25
  const rootIndexBundleRequestPattern = /^(https?:\/\/[^/]+)?\/index\.bundle(?=$|[?#])/
26
+ // expo prebuild writes an AppDelegate (ios) and MainApplication (android) whose
27
+ // debug bundle url is `.expo/.virtual-metro-entry`. expo maps it to the main
28
+ // entry through server.rewriteRequestUrl (see @expo/metro-config
29
+ // src/rewriteRequestUrl.ts: `url.includes('/.expo/.virtual-metro-entry.bundle?')`
30
+ // rewrites to the resolved entry, preserving relative vs absolute shape and
31
+ // query). match that path to the same main entry as index.
32
+ const expoVirtualEntryBundleRequestPattern =
33
+ /^(https?:\/\/[^/]+)?\/\.expo\/\.virtual-metro-entry\.bundle(?=$|[?#])/
24
34
  // keep app build output and volatile caches out of Metro's fallback watcher.
25
- // package dist directories remain visible because Metro resolves modules from them.
35
+ // package dist directories remain visible because Metro resolves modules from
36
+ // them, including a dependency's own dist/server, so the app build output
37
+ // pattern never matches inside node_modules.
26
38
  const metroWatchExclusions = [
27
- /[/\\]dist[/\\](?:static|server)(?:[/\\]|$)/,
39
+ /^(?!.*[/\\]node_modules[/\\]).*[/\\]dist[/\\](?:static|server)(?:[/\\]|$)/,
28
40
  /[/\\]tests[/\\][^/\\]+[/\\]dist(?:[/\\]|$)/,
29
41
  /[/\\]\.docker(?:[/\\]|$)/,
30
42
  /[/\\]\.vite(?:[/\\]|$)/,
31
43
  /[/\\]node_modules[/\\]\.vxrn(?:[/\\]|$)/,
32
44
  ]
33
45
 
46
+ function enforceWorkspaceVisibility(
47
+ config: MetroInputConfig,
48
+ projectRoot: string
49
+ ): MetroInputConfig {
50
+ const workspaceRoot = searchForWorkspaceRoot(projectRoot)
51
+ if (workspaceRoot === projectRoot) return config
52
+
53
+ return {
54
+ ...config,
55
+ watchFolders: [...new Set([...(config.watchFolders ?? []), workspaceRoot])],
56
+ resolver: {
57
+ ...config.resolver,
58
+ nodeModulesPaths: [
59
+ ...new Set([
60
+ ...(config.resolver?.nodeModulesPaths ?? []),
61
+ resolve(projectRoot, 'node_modules'),
62
+ resolve(workspaceRoot, 'node_modules'),
63
+ ]),
64
+ ],
65
+ },
66
+ }
67
+ }
68
+
69
+ function getReactNativeDefaultConfig(projectRoot: string): MetroInputConfig {
70
+ const config = enforceWorkspaceVisibility(
71
+ getDefaultConfig(projectRoot) as MetroInputConfig,
72
+ projectRoot
73
+ )
74
+ return {
75
+ ...config,
76
+ resolver: {
77
+ ...config.resolver,
78
+ assetExts: [...new Set([...(config.resolver?.assetExts ?? []), 'glb'])],
79
+ },
80
+ }
81
+ }
82
+
34
83
  function getPlatformFromBundleUrl(url: string): 'ios' | 'android' {
35
84
  const platform = url.match(/[?&]platform=(ios|android)(?:&|$)/)?.[1]
36
85
  return platform === 'android' ? 'android' : 'ios'
@@ -44,11 +93,76 @@ function rewriteMainModuleBundleUrl(
44
93
  platform: getPlatformFromBundleUrl(url),
45
94
  })
46
95
 
47
- if (url.includes('/.expo/.virtual-metro-entry.bundle?')) {
48
- return url.replace('.expo/.virtual-metro-entry', resolvedMainModulePath)
96
+ if (rootIndexBundleRequestPattern.test(url)) {
97
+ return url.replace(
98
+ rootIndexBundleRequestPattern,
99
+ `$1/${resolvedMainModulePath}.bundle`
100
+ )
49
101
  }
102
+ return url.replace(
103
+ expoVirtualEntryBundleRequestPattern,
104
+ `$1/${resolvedMainModulePath}.bundle`
105
+ )
106
+ }
50
107
 
51
- return url.replace(rootIndexBundleRequestPattern, `$1/${resolvedMainModulePath}.bundle`)
108
+ function isMainModuleBundleRequest(url: string) {
109
+ return (
110
+ rootIndexBundleRequestPattern.test(url) ||
111
+ expoVirtualEntryBundleRequestPattern.test(url)
112
+ )
113
+ }
114
+
115
+ function isBareSpecifier(name: string) {
116
+ return name !== '' && !name.startsWith('.') && !name.startsWith('/')
117
+ }
118
+
119
+ // metro parses `/one/metro-entry.bundle` to the entry `./one/metro-entry`
120
+ // relative to the server root, which misses node_modules package lookup.
121
+ function bareMainModuleForRequest(
122
+ moduleName: string,
123
+ mainModuleName: string | undefined
124
+ ) {
125
+ if (!mainModuleName || !isBareSpecifier(mainModuleName)) return undefined
126
+ if (moduleName === `./${mainModuleName}`) return mainModuleName
127
+ return undefined
128
+ }
129
+
130
+ // defaultConfigOverrides and Metro config loading can replace the resolver.
131
+ // enforce entry and vite dedupe semantics on the final resolver while
132
+ // preserving its platform, export conditions and custom resolution policy.
133
+ function enforcePackageResolution(
134
+ config: MetroInputConfig,
135
+ mainModuleName: string | undefined,
136
+ dedupe: readonly string[],
137
+ projectRoot: string
138
+ ): MetroInputConfig {
139
+ const dedupedPackages = new Set(dedupe)
140
+ if ((!mainModuleName || !isBareSpecifier(mainModuleName)) && !dedupedPackages.size) {
141
+ return config
142
+ }
143
+ const rootOrigin = resolve(projectRoot, 'package.json')
144
+ const innerResolveRequest = config.resolver?.resolveRequest
145
+ return {
146
+ ...config,
147
+ resolver: {
148
+ ...config.resolver,
149
+ resolveRequest: (context, moduleName, platform) => {
150
+ const bareMain = bareMainModuleForRequest(moduleName, mainModuleName)
151
+ const request = bareMain ?? moduleName
152
+ const packageEnd = request.indexOf(
153
+ '/',
154
+ request.startsWith('@') ? request.indexOf('/') + 1 : 0
155
+ )
156
+ const packageName = packageEnd === -1 ? request : request.slice(0, packageEnd)
157
+ const resolutionContext =
158
+ isBareSpecifier(request) && dedupedPackages.has(packageName)
159
+ ? { ...context, originModulePath: rootOrigin }
160
+ : context
161
+ const resolveRequest = innerResolveRequest || context.resolveRequest
162
+ return resolveRequest(resolutionContext, request, platform)
163
+ },
164
+ },
165
+ }
52
166
  }
53
167
 
54
168
  async function isWatchmanResponsive(projectRoot: string) {
@@ -89,11 +203,52 @@ async function isWatchmanResponsive(projectRoot: string) {
89
203
  return probe
90
204
  }
91
205
 
206
+ /**
207
+ * Decides whether Metro runs the native worker or the babel transformer.
208
+ * No babel by default: the worker throws on a babel plugin it has no port
209
+ * for, so opting back in is explicit rather than something you drift into.
210
+ * When a user adds a custom babel config, respect it rather than forcing
211
+ * native transforms, unless explicitly overridden. Shared by both config
212
+ * builders so the two never drift apart.
213
+ */
214
+ function resolveNativeTransforms(
215
+ projectRoot: string,
216
+ metroPluginOptions: MetroPluginOptions
217
+ ): { isNativeTransforms: boolean; userBabelConfigPath: string | null } {
218
+ const userBabelConfigPath = projectRoot ? findUserBabelConfig(projectRoot) : null
219
+ const hasUserBabelConfig = Boolean(userBabelConfigPath)
220
+
221
+ const isNativeTransforms =
222
+ process.env.ONE_METRO_NATIVE_TRANSFORMS === '0'
223
+ ? false
224
+ : process.env.ONE_METRO_NATIVE_TRANSFORMS === '1'
225
+ ? true
226
+ : metroPluginOptions.nativeTransforms === false
227
+ ? false
228
+ : metroPluginOptions.nativeTransforms === true
229
+ ? true
230
+ : hasUserBabelConfig
231
+ ? false
232
+ : true
233
+
234
+ // the native worker runs no babel at all, so reaching it here means an
235
+ // explicit override is about to silently drop the user's plugins. name the
236
+ // ignored file rather than swallowing it.
237
+ if (userBabelConfigPath && isNativeTransforms) {
238
+ console.warn(
239
+ `[vxrn/metro] Ignoring user babel config at ${userBabelConfigPath} because native transforms are explicitly enabled (nativeTransforms: true or ONE_METRO_NATIVE_TRANSFORMS=1). ` +
240
+ `Port its plugins to nativeTransformModules, or set nativeTransforms: false (or ONE_METRO_NATIVE_TRANSFORMS=0) to use the babel transformer.`
241
+ )
242
+ }
243
+
244
+ return { isNativeTransforms, userBabelConfigPath }
245
+ }
246
+
92
247
  /**
93
248
  * Build the Metro config input WITHOUT calling Metro's `loadConfig`. Returns
94
249
  * the same shape Metro `loadConfig` expects as its second argument. Use this
95
250
  * from a project's `metro.config.cjs` so the outer `loadConfig` (driven by
96
- * Expo CLI / Metro CLI) is the only one that runs — avoids infinite
251
+ * the Metro CLI) is the only one that runs. this avoids infinite
97
252
  * recursion that would happen if the inner pipeline also called `loadConfig`
98
253
  * and re-read the same metro.config.cjs.
99
254
  */
@@ -114,53 +269,20 @@ export async function buildMetroConfigInputFromViteConfig(
114
269
  )
115
270
  }
116
271
 
117
- const { getDefaultConfig } = await projectImport<{
118
- getDefaultConfig: typeof getDefaultConfigT
119
- }>(projectRoot, '@expo/metro-config')
120
-
121
- const _defaultConfig: MetroInputConfig = getDefaultConfig(projectRoot) as any
272
+ const _defaultConfig = getReactNativeDefaultConfig(projectRoot)
122
273
 
123
274
  if (mainModuleName) {
124
- const origRewriteRequestUrl = _defaultConfig!.server!.rewriteRequestUrl!
125
-
126
- const resolveMainModuleName: (p: { platform: 'ios' | 'android' }) => string =
127
- await (async () => {
128
- const ExpoGoManifestHandlerMiddleware = (
129
- await projectImport(
130
- projectRoot,
131
- '@expo/cli/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js'
132
- )
133
- ).default.ExpoGoManifestHandlerMiddleware
134
-
135
- const manifestHandlerMiddleware = new ExpoGoManifestHandlerMiddleware(
136
- projectRoot,
137
- {}
138
- )
139
-
140
- patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName(
141
- manifestHandlerMiddleware,
142
- mainModuleName
143
- )
144
-
145
- return (p) => {
146
- return manifestHandlerMiddleware.resolveMainModuleName({
147
- pkg: { main: mainModuleName },
148
- platform: p.platform,
149
- })
150
- }
151
- })()
275
+ const origRewriteRequestUrl = _defaultConfig!.server?.rewriteRequestUrl
276
+ const resolveMainModuleName = () => mainModuleName
152
277
 
153
278
  extraConfig.getResolveMainModuleName = resolveMainModuleName
154
279
 
155
280
  // @ts-expect-error Metro 0.83 made this read-only in types but we need to patch it
156
281
  _defaultConfig!.server!.rewriteRequestUrl = (url) => {
157
- if (
158
- url.includes('/.expo/.virtual-metro-entry.bundle?') ||
159
- rootIndexBundleRequestPattern.test(url)
160
- ) {
282
+ if (isMainModuleBundleRequest(url)) {
161
283
  return rewriteMainModuleBundleUrl(url, resolveMainModuleName)
162
284
  }
163
- return origRewriteRequestUrl(url)
285
+ return origRewriteRequestUrl?.(url) ?? url
164
286
  }
165
287
  }
166
288
 
@@ -176,11 +298,8 @@ export async function buildMetroConfigInputFromViteConfig(
176
298
 
177
299
  // no babel by default. the worker throws on a babel plugin it has no port
178
300
  // for, so opting back in is explicit rather than something you drift into.
179
- const isNativeTransforms =
180
- process.env.ONE_METRO_NATIVE_TRANSFORMS === '0'
181
- ? false
182
- : process.env.ONE_METRO_NATIVE_TRANSFORMS === '1' ||
183
- metroPluginOptions.nativeTransforms !== false
301
+ // When a user adds a custom babel config, respect it rather than forcing native transforms.
302
+ const { isNativeTransforms } = resolveNativeTransforms(projectRoot, metroPluginOptions)
184
303
 
185
304
  let nativeWorkerPath: string | undefined
186
305
  if (isNativeTransforms) {
@@ -194,11 +313,20 @@ export async function buildMetroConfigInputFromViteConfig(
194
313
 
195
314
  const defaultConfig: MetroInputConfig = {
196
315
  ..._defaultConfig,
316
+ watcher: {
317
+ ..._defaultConfig?.watcher,
318
+ additionalExts: [
319
+ ...new Set([
320
+ ...(_defaultConfig?.watcher?.additionalExts ?? []),
321
+ ...expoEnvAdditionalExts,
322
+ ]),
323
+ ],
324
+ },
197
325
  resolver: {
198
326
  ..._defaultConfig?.resolver,
199
327
  useWatchman,
200
328
  blockList,
201
- sourceExts: ['js', 'jsx', 'json', 'ts', 'tsx', 'mjs', 'cjs'], // `one` related packages are using `.mjs` extensions. This fixes `.native` files not being resolved correctly when `.mjs` files are present.
329
+ sourceExts: metroSourceExts,
202
330
  resolveRequest: (context, moduleName, platform) => {
203
331
  const origResolveRequestFn =
204
332
  _defaultConfig?.resolver?.resolveRequest || context.resolveRequest
@@ -230,6 +358,10 @@ export async function buildMetroConfigInputFromViteConfig(
230
358
  },
231
359
  transformer: {
232
360
  ..._defaultConfig?.transformer,
361
+ // one's router and Expo's optional development env module both use
362
+ // require.context. Metro installs a throwing runtime stub unless this
363
+ // graph feature is enabled.
364
+ unstable_allowRequireContext: true,
233
365
  babelTransformerPath: projectResolve(
234
366
  projectRoot,
235
367
  '@vxrn/vite-plugin-metro/babel-transformer'
@@ -248,7 +380,16 @@ export async function buildMetroConfigInputFromViteConfig(
248
380
  : defaultConfigOverrides),
249
381
  }
250
382
 
251
- return { defaultConfig: merged, projectRoot, extraConfig }
383
+ return {
384
+ defaultConfig: enforcePackageResolution(
385
+ enforceWorkspaceVisibility(merged, projectRoot),
386
+ mainModuleName,
387
+ config.resolve?.dedupe ?? [],
388
+ projectRoot
389
+ ),
390
+ projectRoot,
391
+ extraConfig,
392
+ }
252
393
  }
253
394
 
254
395
  export async function getMetroConfigFromViteConfig(
@@ -274,60 +415,21 @@ export async function getMetroConfigFromViteConfig(
274
415
  const { loadConfig } = await projectImport<{
275
416
  loadConfig: typeof loadConfigT
276
417
  }>(projectRoot, 'metro')
277
- const { getDefaultConfig } = await projectImport<{
278
- getDefaultConfig: typeof getDefaultConfigT
279
- }>(projectRoot, '@expo/metro-config')
280
-
281
- const _defaultConfig: MetroInputConfig = getDefaultConfig(projectRoot) as any
418
+ const _defaultConfig = getReactNativeDefaultConfig(projectRoot)
282
419
 
283
420
  if (mainModuleName) {
284
- const origRewriteRequestUrl = _defaultConfig!.server!.rewriteRequestUrl!
285
-
286
- // We need to patch Expo's default `config.server.rewriteRequestUrl`
287
- // to change how URLs like '/.expo/.virtual-metro-entry.bundle?' are
288
- // rewritten.
289
- // But since that function is difficult to override, here we borrow
290
- // the ExpoGoManifestHandlerMiddleware and use it to resolve the
291
- // URL to the main module name.
292
- const resolveMainModuleName: (p: { platform: 'ios' | 'android' }) => string =
293
- await (async () => {
294
- const ExpoGoManifestHandlerMiddleware = (
295
- await projectImport(
296
- projectRoot,
297
- '@expo/cli/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js'
298
- )
299
- ).default.ExpoGoManifestHandlerMiddleware
300
-
301
- const manifestHandlerMiddleware = new ExpoGoManifestHandlerMiddleware(
302
- projectRoot,
303
- {}
304
- )
305
-
306
- patchExpoGoManifestHandlerMiddlewareWithCustomMainModuleName(
307
- manifestHandlerMiddleware,
308
- mainModuleName
309
- )
310
-
311
- return (p) => {
312
- return manifestHandlerMiddleware.resolveMainModuleName({
313
- pkg: { main: mainModuleName },
314
- platform: p.platform,
315
- })
316
- }
317
- })()
421
+ const origRewriteRequestUrl = _defaultConfig!.server?.rewriteRequestUrl
422
+ const resolveMainModuleName = () => mainModuleName
318
423
 
319
424
  extraConfig.getResolveMainModuleName = resolveMainModuleName
320
425
 
321
426
  // @ts-expect-error Metro 0.83 made this read-only in types but we need to patch it
322
427
  _defaultConfig!.server!.rewriteRequestUrl = (url) => {
323
- if (
324
- url.includes('/.expo/.virtual-metro-entry.bundle?') ||
325
- rootIndexBundleRequestPattern.test(url)
326
- ) {
428
+ if (isMainModuleBundleRequest(url)) {
327
429
  return rewriteMainModuleBundleUrl(url, resolveMainModuleName)
328
430
  }
329
431
 
330
- return origRewriteRequestUrl(url)
432
+ return origRewriteRequestUrl?.(url) ?? url
331
433
  }
332
434
  }
333
435
 
@@ -343,11 +445,8 @@ export async function getMetroConfigFromViteConfig(
343
445
 
344
446
  // no babel by default. the worker throws on a babel plugin it has no port
345
447
  // for, so opting back in is explicit rather than something you drift into.
346
- const isNativeTransforms =
347
- process.env.ONE_METRO_NATIVE_TRANSFORMS === '0'
348
- ? false
349
- : process.env.ONE_METRO_NATIVE_TRANSFORMS === '1' ||
350
- metroPluginOptions.nativeTransforms !== false
448
+ // When a user adds a custom babel config, respect it rather than forcing native transforms.
449
+ const { isNativeTransforms } = resolveNativeTransforms(projectRoot, metroPluginOptions)
351
450
 
352
451
  let nativeWorkerPath: string | undefined
353
452
  if (isNativeTransforms) {
@@ -361,11 +460,20 @@ export async function getMetroConfigFromViteConfig(
361
460
 
362
461
  const defaultConfig: MetroInputConfig = {
363
462
  ..._defaultConfig,
463
+ watcher: {
464
+ ..._defaultConfig?.watcher,
465
+ additionalExts: [
466
+ ...new Set([
467
+ ...(_defaultConfig?.watcher?.additionalExts ?? []),
468
+ ...expoEnvAdditionalExts,
469
+ ]),
470
+ ],
471
+ },
364
472
  resolver: {
365
473
  ..._defaultConfig?.resolver,
366
474
  useWatchman,
367
475
  blockList,
368
- sourceExts: ['js', 'jsx', 'json', 'ts', 'tsx', 'mjs', 'cjs'], // `one` related packages are using `.mjs` extensions. This somehow fixes `.native` files not being resolved correctly when `.mjs` files are present.
476
+ sourceExts: metroSourceExts,
369
477
  resolveRequest: (context, moduleName, platform) => {
370
478
  const origResolveRequestFn =
371
479
  _defaultConfig?.resolver?.resolveRequest || context.resolveRequest
@@ -405,6 +513,10 @@ export async function getMetroConfigFromViteConfig(
405
513
  },
406
514
  transformer: {
407
515
  ..._defaultConfig?.transformer,
516
+ // one's router and Expo's optional development env module both use
517
+ // require.context. Metro installs a throwing runtime stub unless this
518
+ // graph feature is enabled.
519
+ unstable_allowRequireContext: true,
408
520
  babelTransformerPath: projectResolve(
409
521
  projectRoot,
410
522
  '@vxrn/vite-plugin-metro/babel-transformer'
@@ -432,7 +544,12 @@ export async function getMetroConfigFromViteConfig(
432
544
  )
433
545
 
434
546
  return {
435
- ...metroConfig,
547
+ ...enforcePackageResolution(
548
+ enforceWorkspaceVisibility(metroConfig, projectRoot),
549
+ mainModuleName,
550
+ config.resolve?.dedupe ?? [],
551
+ projectRoot
552
+ ),
436
553
  ...extraConfig,
437
554
  } as MetroConfigExtended
438
555
  }
@@ -0,0 +1,57 @@
1
+ import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises'
2
+ import { join } from 'node:path'
3
+ import { runInNewContext } from 'node:vm'
4
+ import type { ResolvedConfig } from 'vite'
5
+ import { expect, it } from 'vitest'
6
+ import { buildMetroConfigInputFromViteConfig } from './getMetroConfigFromViteConfig'
7
+ import { transform } from '../transformer/metroNativeWorker'
8
+
9
+ it('classifies a binary GLB with stock Metro config and registers its identity', async () => {
10
+ const root = await mkdtemp(join(import.meta.dirname, '.glb-metro-'))
11
+ const bytes = Buffer.from([0x67, 0x6c, 0x54, 0x46, 2, 0, 0, 0, 0xff, 0x80, 0, 1])
12
+ await writeFile(join(root, 'sofa.glb'), bytes)
13
+ try {
14
+ const { defaultConfig } = await buildMetroConfigInputFromViteConfig(
15
+ { root } as ResolvedConfig,
16
+ { watchman: false }
17
+ )
18
+ const type = defaultConfig.resolver.assetExts.includes('glb') ? 'asset' : 'module'
19
+ const result = await transform(
20
+ { assetRegistryPath: 'react-native/asset-registry', publicPath: '/assets' },
21
+ root,
22
+ 'sofa.glb',
23
+ bytes,
24
+ { dev: true, platform: 'ios', type }
25
+ )
26
+ expect(result.output[0].type).toBe('js/module/asset')
27
+ let descriptor: any
28
+ runInNewContext(result.output[0].data.code, {
29
+ __d: (factory: Function) =>
30
+ factory(
31
+ {},
32
+ () => ({
33
+ registerAsset: (asset: any) => {
34
+ descriptor = asset
35
+ },
36
+ }),
37
+ {},
38
+ {},
39
+ { exports: {} },
40
+ {},
41
+ [0]
42
+ ),
43
+ })
44
+ expect(descriptor).toMatchObject({
45
+ name: 'sofa',
46
+ type: 'glb',
47
+ scales: [1],
48
+ httpServerLocation: '/assets',
49
+ })
50
+ expect(descriptor.hash).not.toBe('')
51
+ expect(descriptor.width).toBeUndefined()
52
+ expect(descriptor.height).toBeUndefined()
53
+ expect(await readFile(join(root, 'sofa.glb'))).toEqual(bytes)
54
+ } finally {
55
+ await rm(root, { recursive: true, force: true })
56
+ }
57
+ })
@@ -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
+ })