@depup/expo__cli 55.0.22-depup.1 → 57.0.9-depup.0

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 (600) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +13 -18
  3. package/build/bin/cli +4 -4
  4. package/build/bin/cli.map +1 -1
  5. package/build/src/api/endpoint.js +4 -4
  6. package/build/src/api/endpoint.js.map +1 -1
  7. package/build/src/api/getExpoSchema.js +3 -3
  8. package/build/src/api/getExpoSchema.js.map +1 -1
  9. package/build/src/api/graphql/client.js +26 -14
  10. package/build/src/api/graphql/client.js.map +1 -1
  11. package/build/src/api/graphql/mutations/TunnelMutation.js +31 -0
  12. package/build/src/api/graphql/mutations/TunnelMutation.js.map +1 -0
  13. package/build/src/api/rest/cache/FileSystemResponseCache.js.map +1 -1
  14. package/build/src/api/rest/cache/ResponseCache.js +5 -5
  15. package/build/src/api/rest/cache/ResponseCache.js.map +1 -1
  16. package/build/src/api/rest/client.js +35 -20
  17. package/build/src/api/rest/client.js.map +1 -1
  18. package/build/src/api/rest/wrapFetchWithBaseUrl.js.map +1 -1
  19. package/build/src/api/rest/wrapFetchWithOffline.js.map +1 -1
  20. package/build/src/api/rest/wrapFetchWithProgress.js.map +1 -1
  21. package/build/src/api/rest/wrapFetchWithUserAgent.js.map +1 -1
  22. package/build/src/api/updateDevelopmentSession.js +6 -5
  23. package/build/src/api/updateDevelopmentSession.js.map +1 -1
  24. package/build/src/api/user/UserSettings.js +28 -15
  25. package/build/src/api/user/UserSettings.js.map +1 -1
  26. package/build/src/api/user/actions.js +10 -3
  27. package/build/src/api/user/actions.js.map +1 -1
  28. package/build/src/api/user/expoSsoLauncher.js +76 -24
  29. package/build/src/api/user/expoSsoLauncher.js.map +1 -1
  30. package/build/src/api/user/otp.js +4 -4
  31. package/build/src/api/user/otp.js.map +1 -1
  32. package/build/src/api/user/user.js +19 -7
  33. package/build/src/api/user/user.js.map +1 -1
  34. package/build/src/config/configAsync.js +3 -3
  35. package/build/src/config/configAsync.js.map +1 -1
  36. package/build/src/config/index.js.map +1 -1
  37. package/build/src/customize/customizeAsync.js.map +1 -1
  38. package/build/src/customize/generate.js +7 -4
  39. package/build/src/customize/generate.js.map +1 -1
  40. package/build/src/customize/index.js.map +1 -1
  41. package/build/src/customize/templates.js +4 -6
  42. package/build/src/customize/templates.js.map +1 -1
  43. package/build/src/customize/typescript.js.map +1 -1
  44. package/build/src/events/index.js +19 -15
  45. package/build/src/events/index.js.map +1 -1
  46. package/build/src/events/stream.js +94 -24
  47. package/build/src/events/stream.js.map +1 -1
  48. package/build/src/expoUpdatesExports.js +50 -7
  49. package/build/src/expoUpdatesExports.js.map +1 -1
  50. package/build/src/export/createMetadataJson.js +2 -1
  51. package/build/src/export/createMetadataJson.js.map +1 -1
  52. package/build/src/export/embed/exportEmbedAsync.js +58 -24
  53. package/build/src/export/embed/exportEmbedAsync.js.map +1 -1
  54. package/build/src/export/embed/exportServer.js +1 -1
  55. package/build/src/export/embed/exportServer.js.map +1 -1
  56. package/build/src/export/embed/index.js +1 -1
  57. package/build/src/export/embed/index.js.map +1 -1
  58. package/build/src/export/embed/resolveOptions.js +7 -6
  59. package/build/src/export/embed/resolveOptions.js.map +1 -1
  60. package/build/src/export/embed/xcodeCompilerLogger.js +7 -7
  61. package/build/src/export/embed/xcodeCompilerLogger.js.map +1 -1
  62. package/build/src/export/exportApp.js +40 -30
  63. package/build/src/export/exportApp.js.map +1 -1
  64. package/build/src/export/exportAssets.js +5 -5
  65. package/build/src/export/exportAssets.js.map +1 -1
  66. package/build/src/export/exportAsync.js.map +1 -1
  67. package/build/src/export/exportDomComponents.js +16 -9
  68. package/build/src/export/exportDomComponents.js.map +1 -1
  69. package/build/src/export/exportHermes.js +23 -13
  70. package/build/src/export/exportHermes.js.map +1 -1
  71. package/build/src/export/exportStaticAsync.js +30 -21
  72. package/build/src/export/exportStaticAsync.js.map +1 -1
  73. package/build/src/export/favicon.js +26 -34
  74. package/build/src/export/favicon.js.map +1 -1
  75. package/build/src/export/getPublicExpoManifest.js.map +1 -1
  76. package/build/src/export/getResolvedLocales.js.map +1 -1
  77. package/build/src/export/html.js +3 -3
  78. package/build/src/export/html.js.map +1 -1
  79. package/build/src/export/index.js +2 -0
  80. package/build/src/export/index.js.map +1 -1
  81. package/build/src/export/metroAssetLocalPath.js +4 -4
  82. package/build/src/export/metroAssetLocalPath.js.map +1 -1
  83. package/build/src/export/persistMetroAssets.js +6 -6
  84. package/build/src/export/persistMetroAssets.js.map +1 -1
  85. package/build/src/export/publicFolder.js +16 -4
  86. package/build/src/export/publicFolder.js.map +1 -1
  87. package/build/src/export/resolveOptions.js +12 -13
  88. package/build/src/export/resolveOptions.js.map +1 -1
  89. package/build/src/export/saveAssets.js +3 -3
  90. package/build/src/export/saveAssets.js.map +1 -1
  91. package/build/src/export/static.js +6 -0
  92. package/build/src/export/static.js.map +1 -0
  93. package/build/src/export/web/exportWebAsync.js.map +1 -1
  94. package/build/src/export/web/index.js.map +1 -1
  95. package/build/src/export/writeContents.js.map +1 -1
  96. package/build/src/install/checkPackages.js +1 -28
  97. package/build/src/install/checkPackages.js.map +1 -1
  98. package/build/src/install/fixPackages.js.map +1 -1
  99. package/build/src/install/index.js.map +1 -1
  100. package/build/src/install/installAsync.js +3 -3
  101. package/build/src/install/installAsync.js.map +1 -1
  102. package/build/src/install/installExpoPackage.js.map +1 -1
  103. package/build/src/install/resolveOptions.js.map +1 -1
  104. package/build/src/install/utils/autoAddConfigPlugins.js +3 -3
  105. package/build/src/install/utils/autoAddConfigPlugins.js.map +1 -1
  106. package/build/src/install/utils/checkPackagesCompatibility.js +32 -16
  107. package/build/src/install/utils/checkPackagesCompatibility.js.map +1 -1
  108. package/build/src/lint/ESlintPrerequisite.js.map +1 -1
  109. package/build/src/log.js +32 -14
  110. package/build/src/log.js.map +1 -1
  111. package/build/src/login/index.js +25 -5
  112. package/build/src/login/index.js.map +1 -1
  113. package/build/src/logout/index.js.map +1 -1
  114. package/build/src/prebuild/clearNativeFolder.js +49 -14
  115. package/build/src/prebuild/clearNativeFolder.js.map +1 -1
  116. package/build/src/prebuild/configureProjectAsync.js.map +1 -1
  117. package/build/src/prebuild/copyTemplateFiles.js +3 -3
  118. package/build/src/prebuild/copyTemplateFiles.js.map +1 -1
  119. package/build/src/prebuild/ensureConfigAsync.js.map +1 -1
  120. package/build/src/prebuild/index.js +3 -2
  121. package/build/src/prebuild/index.js.map +1 -1
  122. package/build/src/prebuild/prebuildAsync.js +31 -6
  123. package/build/src/prebuild/prebuildAsync.js.map +1 -1
  124. package/build/src/prebuild/renameTemplateAppName.js +8 -5
  125. package/build/src/prebuild/renameTemplateAppName.js.map +1 -1
  126. package/build/src/prebuild/resolveOptions.js +7 -7
  127. package/build/src/prebuild/resolveOptions.js.map +1 -1
  128. package/build/src/prebuild/resolveTemplate.js +10 -5
  129. package/build/src/prebuild/resolveTemplate.js.map +1 -1
  130. package/build/src/prebuild/updateFromTemplate.js +3 -3
  131. package/build/src/prebuild/updateFromTemplate.js.map +1 -1
  132. package/build/src/prebuild/updatePackageJson.js +7 -7
  133. package/build/src/prebuild/updatePackageJson.js.map +1 -1
  134. package/build/src/prebuild/validateTemplatePlatforms.js.map +1 -1
  135. package/build/src/register/index.js.map +1 -1
  136. package/build/src/run/android/index.js.map +1 -1
  137. package/build/src/run/android/resolveGradlePropsAsync.js +3 -4
  138. package/build/src/run/android/resolveGradlePropsAsync.js.map +1 -1
  139. package/build/src/run/android/resolveInstallApkName.js +48 -1
  140. package/build/src/run/android/resolveInstallApkName.js.map +1 -1
  141. package/build/src/run/android/resolveLaunchProps.js +4 -1
  142. package/build/src/run/android/resolveLaunchProps.js.map +1 -1
  143. package/build/src/run/android/resolveOptions.js.map +1 -1
  144. package/build/src/run/android/runAndroidAsync.js.map +1 -1
  145. package/build/src/run/ensureNativeProject.js.map +1 -1
  146. package/build/src/run/hints.js +4 -4
  147. package/build/src/run/hints.js.map +1 -1
  148. package/build/src/run/index.js.map +1 -1
  149. package/build/src/run/ios/XcodeBuild.js +163 -23
  150. package/build/src/run/ios/XcodeBuild.js.map +1 -1
  151. package/build/src/run/ios/appleDevice/AppleDevice.js +6 -5
  152. package/build/src/run/ios/appleDevice/AppleDevice.js.map +1 -1
  153. package/build/src/run/ios/appleDevice/ClientManager.js.map +1 -1
  154. package/build/src/run/ios/appleDevice/client/AFCClient.js +10 -16
  155. package/build/src/run/ios/appleDevice/client/AFCClient.js.map +1 -1
  156. package/build/src/run/ios/appleDevice/client/DebugserverClient.js +1 -1
  157. package/build/src/run/ios/appleDevice/client/DebugserverClient.js.map +1 -1
  158. package/build/src/run/ios/appleDevice/client/InstallationProxyClient.js +2 -1
  159. package/build/src/run/ios/appleDevice/client/InstallationProxyClient.js.map +1 -1
  160. package/build/src/run/ios/appleDevice/client/LockdowndClient.js +1 -1
  161. package/build/src/run/ios/appleDevice/client/LockdowndClient.js.map +1 -1
  162. package/build/src/run/ios/appleDevice/client/MobileImageMounterClient.js.map +1 -1
  163. package/build/src/run/ios/appleDevice/client/ServiceClient.js +3 -3
  164. package/build/src/run/ios/appleDevice/client/ServiceClient.js.map +1 -1
  165. package/build/src/run/ios/appleDevice/client/UsbmuxdClient.js.map +1 -1
  166. package/build/src/run/ios/appleDevice/installOnDeviceAsync.js +3 -3
  167. package/build/src/run/ios/appleDevice/installOnDeviceAsync.js.map +1 -1
  168. package/build/src/run/ios/appleDevice/protocol/AFCProtocol.js +16 -13
  169. package/build/src/run/ios/appleDevice/protocol/AFCProtocol.js.map +1 -1
  170. package/build/src/run/ios/appleDevice/protocol/AbstractProtocol.js +6 -6
  171. package/build/src/run/ios/appleDevice/protocol/AbstractProtocol.js.map +1 -1
  172. package/build/src/run/ios/appleDevice/protocol/GDBProtocol.js +5 -5
  173. package/build/src/run/ios/appleDevice/protocol/GDBProtocol.js.map +1 -1
  174. package/build/src/run/ios/appleDevice/protocol/LockdownProtocol.js +7 -7
  175. package/build/src/run/ios/appleDevice/protocol/LockdownProtocol.js.map +1 -1
  176. package/build/src/run/ios/appleDevice/protocol/UsbmuxProtocol.js +5 -5
  177. package/build/src/run/ios/appleDevice/protocol/UsbmuxProtocol.js.map +1 -1
  178. package/build/src/run/ios/codeSigning/Security.js +8 -8
  179. package/build/src/run/ios/codeSigning/Security.js.map +1 -1
  180. package/build/src/run/ios/codeSigning/configureCodeSigning.js +5 -3
  181. package/build/src/run/ios/codeSigning/configureCodeSigning.js.map +1 -1
  182. package/build/src/run/ios/codeSigning/resolveCertificateSigningIdentity.js +7 -5
  183. package/build/src/run/ios/codeSigning/resolveCertificateSigningIdentity.js.map +1 -1
  184. package/build/src/run/ios/codeSigning/settings.js +3 -3
  185. package/build/src/run/ios/codeSigning/settings.js.map +1 -1
  186. package/build/src/run/ios/codeSigning/xcodeCodeSigning.js +4 -4
  187. package/build/src/run/ios/codeSigning/xcodeCodeSigning.js.map +1 -1
  188. package/build/src/run/ios/index.js +8 -1
  189. package/build/src/run/ios/index.js.map +1 -1
  190. package/build/src/run/ios/launchApp.js +3 -3
  191. package/build/src/run/ios/launchApp.js.map +1 -1
  192. package/build/src/run/ios/options/appleDestinations.js.map +1 -1
  193. package/build/src/run/ios/options/promptDevice.js +3 -3
  194. package/build/src/run/ios/options/promptDevice.js.map +1 -1
  195. package/build/src/run/ios/options/resolveDevice.js +8 -3
  196. package/build/src/run/ios/options/resolveDevice.js.map +1 -1
  197. package/build/src/run/ios/options/resolveNativeScheme.js +4 -4
  198. package/build/src/run/ios/options/resolveNativeScheme.js.map +1 -1
  199. package/build/src/run/ios/options/resolveOptions.js +9 -4
  200. package/build/src/run/ios/options/resolveOptions.js.map +1 -1
  201. package/build/src/run/ios/options/resolveXcodeProject.js.map +1 -1
  202. package/build/src/run/ios/runIosAsync.js +39 -0
  203. package/build/src/run/ios/runIosAsync.js.map +1 -1
  204. package/build/src/run/ios/validateExternalBinary.js.map +1 -1
  205. package/build/src/run/startBundler.js +4 -0
  206. package/build/src/run/startBundler.js.map +1 -1
  207. package/build/src/serve/index.js +4 -1
  208. package/build/src/serve/index.js.map +1 -1
  209. package/build/src/serve/serveAsync.js +23 -11
  210. package/build/src/serve/serveAsync.js.map +1 -1
  211. package/build/src/serve/static.js +69 -0
  212. package/build/src/serve/static.js.map +1 -0
  213. package/build/src/start/checkDependenciesOnStart.js +131 -0
  214. package/build/src/start/checkDependenciesOnStart.js.map +1 -0
  215. package/build/src/start/detectDevClient.js +3 -3
  216. package/build/src/start/detectDevClient.js.map +1 -1
  217. package/build/src/start/doctor/Prerequisite.js +4 -4
  218. package/build/src/start/doctor/Prerequisite.js.map +1 -1
  219. package/build/src/start/doctor/apple/SimulatorAppPrerequisite.js +53 -91
  220. package/build/src/start/doctor/apple/SimulatorAppPrerequisite.js.map +1 -1
  221. package/build/src/start/doctor/apple/XcodePrerequisite.js +3 -3
  222. package/build/src/start/doctor/apple/XcodePrerequisite.js.map +1 -1
  223. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js +3 -3
  224. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js.map +1 -1
  225. package/build/src/start/doctor/dependencies/getMissingPackages.js +5 -5
  226. package/build/src/start/doctor/dependencies/getMissingPackages.js.map +1 -1
  227. package/build/src/start/doctor/dependencies/getVersionedPackages.js +5 -5
  228. package/build/src/start/doctor/dependencies/getVersionedPackages.js.map +1 -1
  229. package/build/src/start/doctor/dependencies/reactNativeTv.js +149 -0
  230. package/build/src/start/doctor/dependencies/reactNativeTv.js.map +1 -0
  231. package/build/src/start/doctor/dependencies/resolvePackages.js +4 -4
  232. package/build/src/start/doctor/dependencies/resolvePackages.js.map +1 -1
  233. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +33 -8
  234. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -1
  235. package/build/src/start/doctor/ngrok/ExternalModule.js +14 -9
  236. package/build/src/start/doctor/ngrok/ExternalModule.js.map +1 -1
  237. package/build/src/start/doctor/ngrok/NgrokResolver.js +3 -3
  238. package/build/src/start/doctor/ngrok/NgrokResolver.js.map +1 -1
  239. package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js.map +1 -1
  240. package/build/src/start/doctor/typescript/updateTSConfig.js +3 -3
  241. package/build/src/start/doctor/typescript/updateTSConfig.js.map +1 -1
  242. package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js +5 -12
  243. package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js.map +1 -1
  244. package/build/src/start/index.js +2 -0
  245. package/build/src/start/index.js.map +1 -1
  246. package/build/src/start/interface/KeyPressHandler.js.map +1 -1
  247. package/build/src/start/interface/cliExtensionMenuItemHandler.js.map +1 -1
  248. package/build/src/start/interface/commandsTable.js +6 -6
  249. package/build/src/start/interface/commandsTable.js.map +1 -1
  250. package/build/src/start/interface/createDevToolsMenuItems.js.map +1 -1
  251. package/build/src/start/interface/interactiveActions.js +49 -6
  252. package/build/src/start/interface/interactiveActions.js.map +1 -1
  253. package/build/src/start/interface/startInterface.js +13 -4
  254. package/build/src/start/interface/startInterface.js.map +1 -1
  255. package/build/src/start/platforms/AppIdResolver.js +4 -0
  256. package/build/src/start/platforms/AppIdResolver.js.map +1 -1
  257. package/build/src/start/platforms/DeviceManager.js.map +1 -1
  258. package/build/src/start/platforms/ExpoGoInstaller.js +13 -4
  259. package/build/src/start/platforms/ExpoGoInstaller.js.map +1 -1
  260. package/build/src/start/platforms/PlatformManager.js.map +1 -1
  261. package/build/src/start/platforms/android/AndroidAppIdResolver.js.map +1 -1
  262. package/build/src/start/platforms/android/AndroidDeviceManager.js.map +1 -1
  263. package/build/src/start/platforms/android/AndroidPlatformManager.js.map +1 -1
  264. package/build/src/start/platforms/android/activateWindow.js.map +1 -1
  265. package/build/src/start/platforms/android/adb.js +36 -34
  266. package/build/src/start/platforms/android/adb.js.map +1 -1
  267. package/build/src/start/platforms/android/adbReverse.js +4 -4
  268. package/build/src/start/platforms/android/adbReverse.js.map +1 -1
  269. package/build/src/start/platforms/android/emulator.js +5 -5
  270. package/build/src/start/platforms/android/emulator.js.map +1 -1
  271. package/build/src/start/platforms/android/getDevices.js.map +1 -1
  272. package/build/src/start/platforms/android/gradle.js +5 -5
  273. package/build/src/start/platforms/android/gradle.js.map +1 -1
  274. package/build/src/start/platforms/android/promptAndroidDevice.js +3 -3
  275. package/build/src/start/platforms/android/promptAndroidDevice.js.map +1 -1
  276. package/build/src/start/platforms/ios/AppleAppIdResolver.js.map +1 -1
  277. package/build/src/start/platforms/ios/AppleDeviceManager.js +20 -6
  278. package/build/src/start/platforms/ios/AppleDeviceManager.js.map +1 -1
  279. package/build/src/start/platforms/ios/ApplePlatformManager.js +11 -0
  280. package/build/src/start/platforms/ios/ApplePlatformManager.js.map +1 -1
  281. package/build/src/start/platforms/ios/devicectl.js +7 -7
  282. package/build/src/start/platforms/ios/devicectl.js.map +1 -1
  283. package/build/src/start/platforms/ios/ensureSimulatorAppRunning.js +26 -11
  284. package/build/src/start/platforms/ios/ensureSimulatorAppRunning.js.map +1 -1
  285. package/build/src/start/platforms/ios/getBestSimulator.js +5 -5
  286. package/build/src/start/platforms/ios/getBestSimulator.js.map +1 -1
  287. package/build/src/start/platforms/ios/promptAppleDevice.js +5 -4
  288. package/build/src/start/platforms/ios/promptAppleDevice.js.map +1 -1
  289. package/build/src/start/platforms/ios/simctl.js +25 -19
  290. package/build/src/start/platforms/ios/simctl.js.map +1 -1
  291. package/build/src/start/platforms/ios/simctlLogging.js +3 -3
  292. package/build/src/start/platforms/ios/simctlLogging.js.map +1 -1
  293. package/build/src/start/platforms/ios/xcrun.js +3 -3
  294. package/build/src/start/platforms/ios/xcrun.js.map +1 -1
  295. package/build/src/start/project/devices.js +6 -6
  296. package/build/src/start/project/devices.js.map +1 -1
  297. package/build/src/start/project/dotExpo.js +4 -3
  298. package/build/src/start/project/dotExpo.js.map +1 -1
  299. package/build/src/start/resolveOptions.js +7 -7
  300. package/build/src/start/resolveOptions.js.map +1 -1
  301. package/build/src/start/server/AsyncNgrok.js +1 -1
  302. package/build/src/start/server/AsyncNgrok.js.map +1 -1
  303. package/build/src/start/server/AsyncWsTunnel.js +120 -35
  304. package/build/src/start/server/AsyncWsTunnel.js.map +1 -1
  305. package/build/src/start/server/Bonjour.js +8 -3
  306. package/build/src/start/server/Bonjour.js.map +1 -1
  307. package/build/src/start/server/BundlerDevServer.js +23 -9
  308. package/build/src/start/server/BundlerDevServer.js.map +1 -1
  309. package/build/src/start/server/DevServerManager.js.map +1 -1
  310. package/build/src/start/server/DevToolsPlugin.js +63 -3
  311. package/build/src/start/server/DevToolsPlugin.js.map +1 -1
  312. package/build/src/start/server/DevToolsPlugin.schema.js +8 -3
  313. package/build/src/start/server/DevToolsPlugin.schema.js.map +1 -1
  314. package/build/src/start/server/DevToolsPluginCliExtensionExecutor.js +58 -23
  315. package/build/src/start/server/DevToolsPluginCliExtensionExecutor.js.map +1 -1
  316. package/build/src/start/server/DevToolsPluginCliExtensionResults.js +29 -0
  317. package/build/src/start/server/DevToolsPluginCliExtensionResults.js.map +1 -1
  318. package/build/src/start/server/DevToolsPluginManager.js +20 -6
  319. package/build/src/start/server/DevToolsPluginManager.js.map +1 -1
  320. package/build/src/start/server/DevToolsPluginServerHelpers.js +83 -0
  321. package/build/src/start/server/DevToolsPluginServerHelpers.js.map +1 -0
  322. package/build/src/start/server/DevelopmentSession.js +41 -24
  323. package/build/src/start/server/DevelopmentSession.js.map +1 -1
  324. package/build/src/start/server/MCP.js +10 -3
  325. package/build/src/start/server/MCP.js.map +1 -1
  326. package/build/src/start/server/MCPDevToolsPluginCLIExtensions.js +15 -5
  327. package/build/src/start/server/MCPDevToolsPluginCLIExtensions.js.map +1 -1
  328. package/build/src/start/server/UrlCreator.js +14 -1
  329. package/build/src/start/server/UrlCreator.js.map +1 -1
  330. package/build/src/start/server/createMCPDevToolsExtensionSchema.js +18 -4
  331. package/build/src/start/server/createMCPDevToolsExtensionSchema.js.map +1 -1
  332. package/build/src/start/server/getStaticRenderFunctions.js +13 -24
  333. package/build/src/start/server/getStaticRenderFunctions.js.map +1 -1
  334. package/build/src/start/server/metro/MetroBundlerDevServer.js +245 -114
  335. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  336. package/build/src/start/server/metro/MetroTerminalReporter.js +67 -16
  337. package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
  338. package/build/src/start/server/metro/TerminalReporter.js +22 -4
  339. package/build/src/start/server/metro/TerminalReporter.js.map +1 -1
  340. package/build/src/start/server/metro/createExpoAutolinkingResolver.js +25 -12
  341. package/build/src/start/server/metro/createExpoAutolinkingResolver.js.map +1 -1
  342. package/build/src/start/server/metro/createExpoFallbackResolver.js +39 -0
  343. package/build/src/start/server/metro/createExpoFallbackResolver.js.map +1 -1
  344. package/build/src/start/server/metro/createFileMap-fork.js +196 -0
  345. package/build/src/start/server/metro/createFileMap-fork.js.map +1 -0
  346. package/build/src/start/server/metro/createServerComponentsMiddleware.js +22 -22
  347. package/build/src/start/server/metro/createServerComponentsMiddleware.js.map +1 -1
  348. package/build/src/start/server/metro/createServerRouteMiddleware.js.map +1 -1
  349. package/build/src/start/server/metro/createTypescriptResolver.js +410 -0
  350. package/build/src/start/server/metro/createTypescriptResolver.js.map +1 -0
  351. package/build/src/start/server/metro/debugging/MessageHandler.js.map +1 -1
  352. package/build/src/start/server/metro/debugging/attachAtlas.js +3 -3
  353. package/build/src/start/server/metro/debugging/attachAtlas.js.map +1 -1
  354. package/build/src/start/server/metro/debugging/createDebugMiddleware.js +6 -5
  355. package/build/src/start/server/metro/debugging/createDebugMiddleware.js.map +1 -1
  356. package/build/src/start/server/metro/debugging/createHandlersFactory.js.map +1 -1
  357. package/build/src/start/server/metro/debugging/messageHandlers/NetworkResponse.js +20 -4
  358. package/build/src/start/server/metro/debugging/messageHandlers/NetworkResponse.js.map +1 -1
  359. package/build/src/start/server/metro/debugging/pageIsSupported.js.map +1 -1
  360. package/build/src/start/server/metro/dev-server/compression.js.map +1 -1
  361. package/build/src/start/server/metro/dev-server/createMessageSocket.js +13 -2
  362. package/build/src/start/server/metro/dev-server/createMessageSocket.js.map +1 -1
  363. package/build/src/start/server/metro/dev-server/createMetroMiddleware.js +9 -2
  364. package/build/src/start/server/metro/dev-server/createMetroMiddleware.js.map +1 -1
  365. package/build/src/start/server/metro/dev-server/utils/socketMessages.js +3 -3
  366. package/build/src/start/server/metro/dev-server/utils/socketMessages.js.map +1 -1
  367. package/build/src/start/server/metro/errors/FailedToResolveNativeOnlyModuleError.js.map +1 -1
  368. package/build/src/start/server/metro/externals.js +4 -4
  369. package/build/src/start/server/metro/externals.js.map +1 -1
  370. package/build/src/start/server/metro/fetchRouterManifest.js +3 -3
  371. package/build/src/start/server/metro/fetchRouterManifest.js.map +1 -1
  372. package/build/src/start/server/metro/getCssModulesFromBundler.js +3 -3
  373. package/build/src/start/server/metro/getCssModulesFromBundler.js.map +1 -1
  374. package/build/src/start/server/metro/instantiateMetro.js +141 -57
  375. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  376. package/build/src/start/server/metro/log-box/LogBoxLog.js.map +1 -1
  377. package/build/src/start/server/metro/log-box/LogBoxSymbolication.js +4 -4
  378. package/build/src/start/server/metro/log-box/LogBoxSymbolication.js.map +1 -1
  379. package/build/src/start/server/metro/log-box/formatProjectFilePath.js +3 -3
  380. package/build/src/start/server/metro/log-box/formatProjectFilePath.js.map +1 -1
  381. package/build/src/start/server/metro/metroErrorInterface.js +16 -13
  382. package/build/src/start/server/metro/metroErrorInterface.js.map +1 -1
  383. package/build/src/start/server/metro/metroErrors.js +3 -3
  384. package/build/src/start/server/metro/metroErrors.js.map +1 -1
  385. package/build/src/start/server/metro/metroWatchTypeScriptFiles.js +48 -16
  386. package/build/src/start/server/metro/metroWatchTypeScriptFiles.js.map +1 -1
  387. package/build/src/start/server/metro/resolveLoader.js +3 -3
  388. package/build/src/start/server/metro/resolveLoader.js.map +1 -1
  389. package/build/src/start/server/metro/router.js +23 -14
  390. package/build/src/start/server/metro/router.js.map +1 -1
  391. package/build/src/start/server/metro/runServer-fork.js +13 -10
  392. package/build/src/start/server/metro/runServer-fork.js.map +1 -1
  393. package/build/src/start/server/metro/serializeHtml.js +29 -13
  394. package/build/src/start/server/metro/serializeHtml.js.map +1 -1
  395. package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js +36 -34
  396. package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js.map +1 -1
  397. package/build/src/start/server/metro/withMetroErrorReportingResolver.js +53 -30
  398. package/build/src/start/server/metro/withMetroErrorReportingResolver.js.map +1 -1
  399. package/build/src/start/server/metro/withMetroMultiPlatform.js +187 -126
  400. package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
  401. package/build/src/start/server/metro/withMetroResolvers.js +4 -4
  402. package/build/src/start/server/metro/withMetroResolvers.js.map +1 -1
  403. package/build/src/start/server/middleware/ContextModuleSourceMapsMiddleware.js.map +1 -1
  404. package/build/src/start/server/middleware/CorsMiddleware.js +3 -3
  405. package/build/src/start/server/middleware/CorsMiddleware.js.map +1 -1
  406. package/build/src/start/server/middleware/CreateFileMiddleware.js.map +1 -1
  407. package/build/src/start/server/middleware/DevToolsPluginMiddleware.js +60 -9
  408. package/build/src/start/server/middleware/DevToolsPluginMiddleware.js.map +1 -1
  409. package/build/src/start/server/middleware/DomComponentsMiddleware.js +30 -17
  410. package/build/src/start/server/middleware/DomComponentsMiddleware.js.map +1 -1
  411. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +6 -4
  412. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -1
  413. package/build/src/start/server/middleware/ExpoMiddleware.js +3 -3
  414. package/build/src/start/server/middleware/ExpoMiddleware.js.map +1 -1
  415. package/build/src/start/server/middleware/FaviconMiddleware.js.map +1 -1
  416. package/build/src/start/server/middleware/HistoryFallbackMiddleware.js.map +1 -1
  417. package/build/src/start/server/middleware/InterstitialPageMiddleware.js +13 -8
  418. package/build/src/start/server/middleware/InterstitialPageMiddleware.js.map +1 -1
  419. package/build/src/start/server/middleware/ManifestMiddleware.js +19 -47
  420. package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
  421. package/build/src/start/server/middleware/OpenMiddleware.js +150 -0
  422. package/build/src/start/server/middleware/OpenMiddleware.js.map +1 -0
  423. package/build/src/start/server/middleware/RuntimeRedirectMiddleware.js +13 -4
  424. package/build/src/start/server/middleware/RuntimeRedirectMiddleware.js.map +1 -1
  425. package/build/src/start/server/middleware/ServeStaticMiddleware.js +2 -9
  426. package/build/src/start/server/middleware/ServeStaticMiddleware.js.map +1 -1
  427. package/build/src/start/server/middleware/domPolyfills.js +60 -0
  428. package/build/src/start/server/middleware/domPolyfills.js.map +1 -0
  429. package/build/src/start/server/middleware/inspector/JsInspector.js +6 -31
  430. package/build/src/start/server/middleware/inspector/JsInspector.js.map +1 -1
  431. package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js +14 -24
  432. package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js.map +1 -1
  433. package/build/src/start/server/middleware/inspector/middlwareMutations.js +3 -3
  434. package/build/src/start/server/middleware/inspector/middlwareMutations.js.map +1 -1
  435. package/build/src/start/server/middleware/metroOptions.js +15 -14
  436. package/build/src/start/server/middleware/metroOptions.js.map +1 -1
  437. package/build/src/start/server/middleware/mutations.js +3 -3
  438. package/build/src/start/server/middleware/mutations.js.map +1 -1
  439. package/build/src/start/server/middleware/openHandlers.js +157 -0
  440. package/build/src/start/server/middleware/openHandlers.js.map +1 -0
  441. package/build/src/start/server/middleware/resolveAssets.js +4 -4
  442. package/build/src/start/server/middleware/resolveAssets.js.map +1 -1
  443. package/build/src/start/server/middleware/resolvePlatform.js +9 -7
  444. package/build/src/start/server/middleware/resolvePlatform.js.map +1 -1
  445. package/build/src/start/server/middleware/resolveRuntimeVersionWithExpoUpdatesAsync.js.map +1 -1
  446. package/build/src/start/server/openPlatforms.js.map +1 -1
  447. package/build/src/start/server/platformBundlers.js +3 -1
  448. package/build/src/start/server/platformBundlers.js.map +1 -1
  449. package/build/src/start/server/serverLogLikeMetro.js +13 -36
  450. package/build/src/start/server/serverLogLikeMetro.js.map +1 -1
  451. package/build/src/start/server/type-generation/expo-env.js +3 -3
  452. package/build/src/start/server/type-generation/expo-env.js.map +1 -1
  453. package/build/src/start/server/type-generation/routes.js +14 -55
  454. package/build/src/start/server/type-generation/routes.js.map +1 -1
  455. package/build/src/start/server/type-generation/startTypescriptTypeGeneration.js.map +1 -1
  456. package/build/src/start/server/type-generation/tsconfig.js +5 -5
  457. package/build/src/start/server/type-generation/tsconfig.js.map +1 -1
  458. package/build/src/start/server/webTemplate.js +12 -10
  459. package/build/src/start/server/webTemplate.js.map +1 -1
  460. package/build/src/start/server/webpack/WebpackBundlerDevServer.js +3 -3
  461. package/build/src/start/server/webpack/WebpackBundlerDevServer.js.map +1 -1
  462. package/build/src/start/server/webpack/formatWebpackMessages.js.map +1 -1
  463. package/build/src/start/server/webpack/resolveFromProject.js +4 -4
  464. package/build/src/start/server/webpack/resolveFromProject.js.map +1 -1
  465. package/build/src/start/server/webpack/tls.js +3 -3
  466. package/build/src/start/server/webpack/tls.js.map +1 -1
  467. package/build/src/start/startAsync.js +21 -11
  468. package/build/src/start/startAsync.js.map +1 -1
  469. package/build/src/types.d.ts +2 -0
  470. package/build/src/utils/FileNotifier.js +1 -1
  471. package/build/src/utils/FileNotifier.js.map +1 -1
  472. package/build/src/utils/args.js +5 -5
  473. package/build/src/utils/args.js.map +1 -1
  474. package/build/src/utils/array.js +8 -8
  475. package/build/src/utils/array.js.map +1 -1
  476. package/build/src/utils/build-cache-providers/helpers.js +4 -4
  477. package/build/src/utils/build-cache-providers/helpers.js.map +1 -1
  478. package/build/src/utils/build-cache-providers/index.js +5 -5
  479. package/build/src/utils/build-cache-providers/index.js.map +1 -1
  480. package/build/src/utils/cocoapods.js +5 -5
  481. package/build/src/utils/cocoapods.js.map +1 -1
  482. package/build/src/utils/codesigning.js +12 -6
  483. package/build/src/utils/codesigning.js.map +1 -1
  484. package/build/src/utils/composeMetroIgnorePatterns.js +69 -0
  485. package/build/src/utils/composeMetroIgnorePatterns.js.map +1 -0
  486. package/build/src/utils/createTempPath.js +3 -3
  487. package/build/src/utils/createTempPath.js.map +1 -1
  488. package/build/src/utils/delay.js +4 -4
  489. package/build/src/utils/delay.js.map +1 -1
  490. package/build/src/utils/dir.js +21 -11
  491. package/build/src/utils/dir.js.map +1 -1
  492. package/build/src/utils/downloadAppAsync.js.map +1 -1
  493. package/build/src/utils/downloadExpoGoAsync.js +4 -4
  494. package/build/src/utils/downloadExpoGoAsync.js.map +1 -1
  495. package/build/src/utils/editor.js +4 -4
  496. package/build/src/utils/editor.js.map +1 -1
  497. package/build/src/utils/env.js +39 -13
  498. package/build/src/utils/env.js.map +1 -1
  499. package/build/src/utils/errors.js +6 -6
  500. package/build/src/utils/errors.js.map +1 -1
  501. package/build/src/utils/exit.js +15 -19
  502. package/build/src/utils/exit.js.map +1 -1
  503. package/build/src/utils/expoUpdatesCli.js +5 -5
  504. package/build/src/utils/expoUpdatesCli.js.map +1 -1
  505. package/build/src/utils/fetch.js +4 -4
  506. package/build/src/utils/fetch.js.map +1 -1
  507. package/build/src/utils/filePath.js +3 -29
  508. package/build/src/utils/filePath.js.map +1 -1
  509. package/build/src/utils/findUp.js +3 -3
  510. package/build/src/utils/findUp.js.map +1 -1
  511. package/build/src/utils/fn.js +3 -3
  512. package/build/src/utils/fn.js.map +1 -1
  513. package/build/src/utils/freeport.js +3 -3
  514. package/build/src/utils/freeport.js.map +1 -1
  515. package/build/src/utils/getOrPromptApplicationId.js +3 -5
  516. package/build/src/utils/getOrPromptApplicationId.js.map +1 -1
  517. package/build/src/utils/getRunningProcess.js +5 -5
  518. package/build/src/utils/getRunningProcess.js.map +1 -1
  519. package/build/src/utils/git.js +3 -3
  520. package/build/src/utils/git.js.map +1 -1
  521. package/build/src/utils/glob.js +3 -3
  522. package/build/src/utils/glob.js.map +1 -1
  523. package/build/src/utils/ip.js +4 -4
  524. package/build/src/utils/ip.js.map +1 -1
  525. package/build/src/utils/link.js +3 -3
  526. package/build/src/utils/link.js.map +1 -1
  527. package/build/src/utils/mergeGitIgnorePaths.js +10 -10
  528. package/build/src/utils/mergeGitIgnorePaths.js.map +1 -1
  529. package/build/src/utils/modifyConfigAsync.js +3 -3
  530. package/build/src/utils/modifyConfigAsync.js.map +1 -1
  531. package/build/src/utils/net.js +23 -4
  532. package/build/src/utils/net.js.map +1 -1
  533. package/build/src/utils/nodeEnv.js +6 -6
  534. package/build/src/utils/nodeEnv.js.map +1 -1
  535. package/build/src/utils/npm.js +10 -9
  536. package/build/src/utils/npm.js.map +1 -1
  537. package/build/src/utils/obj.js +4 -4
  538. package/build/src/utils/obj.js.map +1 -1
  539. package/build/src/utils/open.js +240 -11
  540. package/build/src/utils/open.js.map +1 -1
  541. package/build/src/utils/ora.js +4 -4
  542. package/build/src/utils/ora.js.map +1 -1
  543. package/build/src/utils/plist.js +5 -4
  544. package/build/src/utils/plist.js.map +1 -1
  545. package/build/src/utils/port.js +12 -5
  546. package/build/src/utils/port.js.map +1 -1
  547. package/build/src/utils/progress.js +4 -4
  548. package/build/src/utils/progress.js.map +1 -1
  549. package/build/src/utils/prompts.js +11 -11
  550. package/build/src/utils/prompts.js.map +1 -1
  551. package/build/src/utils/qr.js +5 -4
  552. package/build/src/utils/qr.js.map +1 -1
  553. package/build/src/utils/resolveArgs.js +10 -9
  554. package/build/src/utils/resolveArgs.js.map +1 -1
  555. package/build/src/utils/scheme.js +4 -4
  556. package/build/src/utils/scheme.js.map +1 -1
  557. package/build/src/utils/strings.js.map +1 -1
  558. package/build/src/utils/tar.js +8 -7
  559. package/build/src/utils/tar.js.map +1 -1
  560. package/build/src/utils/telemetry/Telemetry.js +5 -0
  561. package/build/src/utils/telemetry/Telemetry.js.map +1 -1
  562. package/build/src/utils/telemetry/clients/FetchClient.js +1 -1
  563. package/build/src/utils/telemetry/clients/FetchClient.js.map +1 -1
  564. package/build/src/utils/telemetry/clients/flushFetchDetached.js +5 -1
  565. package/build/src/utils/telemetry/clients/flushFetchDetached.js.map +1 -1
  566. package/build/src/utils/telemetry/index.js +4 -4
  567. package/build/src/utils/telemetry/index.js.map +1 -1
  568. package/build/src/utils/telemetry/utils/agent.js +42 -0
  569. package/build/src/utils/telemetry/utils/agent.js.map +1 -0
  570. package/build/src/utils/telemetry/utils/constants.js +3 -3
  571. package/build/src/utils/telemetry/utils/constants.js.map +1 -1
  572. package/build/src/utils/telemetry/utils/context.js +3 -2
  573. package/build/src/utils/telemetry/utils/context.js.map +1 -1
  574. package/build/src/utils/url.js +5 -17
  575. package/build/src/utils/url.js.map +1 -1
  576. package/build/src/utils/validateApplicationId.js +12 -12
  577. package/build/src/utils/validateApplicationId.js.map +1 -1
  578. package/build/src/utils/variadic.js +4 -4
  579. package/build/src/utils/variadic.js.map +1 -1
  580. package/build/src/whoami/index.js.map +1 -1
  581. package/changes.json +16 -36
  582. package/main.js +3 -0
  583. package/package.json +86 -90
  584. package/static/loading-page/index.html +45 -3
  585. package/static/template/+html.tsx +14 -5
  586. package/add-module.js +0 -8
  587. package/build/src/start/server/middleware/inspector/CdpClient.js +0 -81
  588. package/build/src/start/server/middleware/inspector/CdpClient.js.map +0 -1
  589. package/build/src/utils/resolveGlobal.js +0 -195
  590. package/build/src/utils/resolveGlobal.js.map +0 -1
  591. package/build/src/utils/resolveWatchFolders.js +0 -67
  592. package/build/src/utils/resolveWatchFolders.js.map +0 -1
  593. package/build/src/utils/tsconfig/evaluateTsConfig.js +0 -87
  594. package/build/src/utils/tsconfig/evaluateTsConfig.js.map +0 -1
  595. package/build/src/utils/tsconfig/loadTsConfigPaths.js +0 -84
  596. package/build/src/utils/tsconfig/loadTsConfigPaths.js.map +0 -1
  597. package/build/src/utils/tsconfig/matchTsConfigPathAlias.js +0 -94
  598. package/build/src/utils/tsconfig/matchTsConfigPathAlias.js.map +0 -1
  599. package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js +0 -62
  600. package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/tar.ts"],"sourcesContent":["import { streamToAsyncIterable, TarTypeFlag, untar } from 'multitars';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { Readable } from 'node:stream';\n\nimport { ensureDirectoryAsync } from './dir';\n\nconst debug = require('debug')('expo:utils:tar') as typeof console.log;\n\nclass ChecksumStream extends TransformStream {\n hash: crypto.Hash;\n constructor(algorithm: string) {\n super({\n transform: (chunk, controller) => {\n this.hash.update(chunk);\n controller.enqueue(chunk);\n },\n });\n this.hash = crypto.createHash(algorithm);\n }\n\n digest(): Buffer;\n digest(encoding: crypto.BinaryToTextEncoding): string;\n digest(encoding?: crypto.BinaryToTextEncoding): string | Buffer {\n return this.hash.digest(encoding!);\n }\n}\n\nexport interface ExtractOptions {\n strip?: number;\n filter?(name: string, type: TarTypeFlag): boolean | null | undefined;\n rename?(name: string, type: TarTypeFlag): string | null | undefined;\n checksumAlgorithm?: string;\n}\n\nexport async function extractStream(\n input: ReadableStream,\n output: string,\n options: ExtractOptions = {}\n): Promise<string> {\n output = path.resolve(output);\n await ensureDirectoryAsync(output);\n\n const { checksumAlgorithm, strip = 0, rename, filter } = options;\n\n const checksumStream = new ChecksumStream(checksumAlgorithm || 'md5');\n const decompressionStream = new DecompressionStream('gzip');\n\n const body = input.pipeThrough(checksumStream).pipeThrough(decompressionStream);\n\n for await (const file of untar(body)) {\n let name = path.normalize(file.name);\n if (filter && !filter(name, file.typeflag)) {\n debug(`filtered: ${path.resolve(output, name)}`);\n continue;\n } else if (rename) {\n name = rename(name, file.typeflag) ?? name;\n }\n\n for (let idx = 0; idx < strip; idx++) {\n const sepIdx = name.indexOf(path.sep);\n if (sepIdx > -1) {\n name = name.slice(sepIdx + 1);\n } else {\n break;\n }\n }\n\n const resolved = path.resolve(output, name);\n if (!resolved.startsWith(output)) {\n debug(`skip: ${resolved}`);\n continue;\n }\n\n const parent = path.dirname(resolved);\n if (parent !== output) {\n let exists = false;\n try {\n const stat = await fs.promises.lstat(parent);\n if (stat.isSymbolicLink() || (!stat.isDirectory() && !stat.isFile())) {\n debug(`skip: ${resolved}`);\n continue;\n } else if (stat.isDirectory()) {\n exists = true;\n }\n } catch {}\n\n if (!exists) {\n debug(`mkdir(p): ${parent}`);\n await fs.promises.mkdir(parent, { recursive: true });\n }\n }\n\n switch (file.typeflag) {\n case TarTypeFlag.FILE:\n debug(`write(${file.mode.toString(8)}): ${resolved}`);\n await fs.promises.writeFile(resolved, streamToAsyncIterable(file.stream()), {\n mode: file.mode,\n });\n break;\n case TarTypeFlag.DIRECTORY:\n debug(`mkdir(${file.mode.toString(8)}): ${resolved}`);\n try {\n await fs.promises.mkdir(resolved, { mode: file.mode });\n } catch (error: any) {\n if (error.code !== 'EEXIST') {\n throw error;\n }\n }\n break;\n case TarTypeFlag.SYMLINK:\n case TarTypeFlag.LINK: {\n const target = path.resolve(parent, file.linkname ?? '');\n if (!target.startsWith(output) || target === parent) {\n debug(`skip: ${resolved} -> ${target}`);\n continue;\n }\n\n if (file.typeflag === TarTypeFlag.LINK) {\n debug(`link: ${resolved} -> ${target}`);\n await fs.promises.link(target, resolved);\n } else {\n const stat = await fs.promises.lstat(target).catch(() => null);\n const type = stat?.isDirectory() ? 'dir' : 'file';\n debug(`symlink(${type}): ${resolved} -> ${target}`);\n await fs.promises.symlink(target, resolved, type);\n }\n break;\n }\n }\n }\n\n return checksumStream.digest('hex');\n}\n\n/** Extract a tar using built-in tools if available and falling back on Node.js. */\nexport async function extractAsync(\n input: string,\n output: string,\n options?: ExtractOptions\n): Promise<void> {\n await extractStream(\n Readable.toWeb(fs.createReadStream(input)) as ReadableStream,\n output,\n options\n );\n}\n"],"names":["extractAsync","extractStream","debug","require","ChecksumStream","TransformStream","constructor","algorithm","transform","chunk","controller","hash","update","enqueue","crypto","createHash","digest","encoding","input","output","options","path","resolve","ensureDirectoryAsync","checksumAlgorithm","strip","rename","filter","checksumStream","decompressionStream","DecompressionStream","body","pipeThrough","file","untar","name","normalize","typeflag","idx","sepIdx","indexOf","sep","slice","resolved","startsWith","parent","dirname","exists","stat","fs","promises","lstat","isSymbolicLink","isDirectory","isFile","mkdir","recursive","TarTypeFlag","FILE","mode","toString","writeFile","streamToAsyncIterable","stream","DIRECTORY","error","code","SYMLINK","LINK","target","linkname","link","catch","type","symlink","Readable","toWeb","createReadStream"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utils/tar.ts"],"sourcesContent":["import { streamToAsyncIterable, TarTypeFlag, untar } from 'multitars';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { Readable } from 'node:stream';\n\nconst debug = require('debug')('expo:utils:tar') as typeof console.log;\n\nclass ChecksumStream extends TransformStream {\n hash: crypto.Hash;\n constructor(algorithm: string) {\n super({\n transform: (chunk, controller) => {\n this.hash.update(chunk);\n controller.enqueue(chunk);\n },\n });\n this.hash = crypto.createHash(algorithm);\n }\n\n digest(): Buffer;\n digest(encoding: crypto.BinaryToTextEncoding): string;\n digest(encoding?: crypto.BinaryToTextEncoding): string | Buffer {\n return this.hash.digest(encoding!);\n }\n}\n\nexport interface ExtractOptions {\n strip?: number;\n filter?(name: string, type: TarTypeFlag): boolean | null | undefined;\n rename?(name: string, type: TarTypeFlag): string | null | undefined;\n checksumAlgorithm?: string;\n}\n\nexport async function extractStream(\n input: ReadableStream,\n targetOutput: string,\n options: ExtractOptions = {}\n): Promise<string> {\n const output = path.resolve(targetOutput) + path.sep;\n await fs.promises.mkdir(output, { recursive: true });\n\n const { checksumAlgorithm, strip = 0, rename, filter } = options;\n\n const checksumStream = new ChecksumStream(checksumAlgorithm || 'md5');\n const decompressionStream = new DecompressionStream('gzip');\n\n const body = input.pipeThrough(checksumStream).pipeThrough(decompressionStream);\n\n for await (const file of untar(body)) {\n let name = path.normalize(file.name);\n if (filter && !filter(name, file.typeflag)) {\n debug(`filtered: ${path.resolve(output, name)}`);\n continue;\n } else if (rename) {\n name = rename(name, file.typeflag) ?? name;\n }\n\n for (let idx = 0; idx < strip; idx++) {\n const sepIdx = name.indexOf(path.sep);\n if (sepIdx > -1) {\n name = name.slice(sepIdx + 1);\n } else {\n break;\n }\n }\n\n const resolved = path.resolve(output, name);\n if (!resolved.startsWith(output)) {\n debug(`skip: ${resolved}`);\n continue;\n }\n\n const parent = path.dirname(resolved);\n if (parent !== output) {\n let exists = false;\n try {\n const stat = await fs.promises.lstat(parent);\n if (stat.isSymbolicLink() || (!stat.isDirectory() && !stat.isFile())) {\n debug(`skip: ${resolved}`);\n continue;\n } else if (stat.isDirectory()) {\n exists = true;\n }\n } catch {}\n\n if (!exists) {\n debug(`mkdir(p): ${parent}`);\n await fs.promises.mkdir(parent, { recursive: true });\n }\n }\n\n switch (file.typeflag) {\n case TarTypeFlag.FILE:\n debug(`write(${file.mode.toString(8)}): ${resolved}`);\n await fs.promises.writeFile(resolved, streamToAsyncIterable(file.stream()), {\n mode: file.mode,\n });\n break;\n case TarTypeFlag.DIRECTORY:\n debug(`mkdir(${file.mode.toString(8)}): ${resolved}`);\n try {\n await fs.promises.mkdir(resolved, { mode: file.mode });\n } catch (error: any) {\n if (error.code !== 'EEXIST') {\n throw error;\n }\n }\n break;\n case TarTypeFlag.SYMLINK:\n case TarTypeFlag.LINK: {\n const target = path.resolve(parent, file.linkname ?? '');\n if (!target.startsWith(output) || target === parent) {\n debug(`skip: ${resolved} -> ${target}`);\n continue;\n }\n\n if (file.typeflag === TarTypeFlag.LINK) {\n debug(`link: ${resolved} -> ${target}`);\n await fs.promises.link(target, resolved);\n } else {\n const stat = await fs.promises.lstat(target).catch(() => null);\n const type = stat?.isDirectory() ? 'dir' : 'file';\n debug(`symlink(${type}): ${resolved} -> ${target}`);\n await fs.promises.symlink(target, resolved, type);\n }\n break;\n }\n }\n }\n\n return checksumStream.digest('hex');\n}\n\n/** Extract a tar using built-in tools if available and falling back on Node.js. */\nexport async function extractAsync(\n input: string,\n output: string,\n options?: ExtractOptions\n): Promise<void> {\n await extractStream(\n Readable.toWeb(fs.createReadStream(input)) as ReadableStream,\n output,\n options\n );\n}\n"],"names":["extractAsync","extractStream","debug","require","ChecksumStream","TransformStream","algorithm","transform","chunk","controller","hash","update","enqueue","crypto","createHash","digest","encoding","input","targetOutput","options","output","path","resolve","sep","fs","promises","mkdir","recursive","checksumAlgorithm","strip","rename","filter","checksumStream","decompressionStream","DecompressionStream","body","pipeThrough","file","untar","name","normalize","typeflag","idx","sepIdx","indexOf","slice","resolved","startsWith","parent","dirname","exists","stat","lstat","isSymbolicLink","isDirectory","isFile","TarTypeFlag","FILE","mode","toString","writeFile","streamToAsyncIterable","stream","DIRECTORY","error","code","SYMLINK","LINK","target","linkname","link","catch","type","symlink","Readable","toWeb","createReadStream"],"mappings":"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"}
@@ -17,6 +17,7 @@ function _nodecrypto() {
17
17
  }
18
18
  const _FetchClient = require("./clients/FetchClient");
19
19
  const _FetchDetachedClient = require("./clients/FetchDetachedClient");
20
+ const _agent = require("./utils/agent");
20
21
  const _context = require("./utils/context");
21
22
  const _UserSettings = require("../../api/user/UserSettings");
22
23
  const _env = require("../env");
@@ -74,6 +75,7 @@ class Telemetry {
74
75
  }
75
76
  }
76
77
  recordInternal(records) {
78
+ const agent = (0, _agent.getAgentTelemetryContext)();
77
79
  return this.client.record(records.map((record)=>({
78
80
  ...record,
79
81
  type: 'track',
@@ -84,6 +86,9 @@ class Telemetry {
84
86
  context: {
85
87
  ...this.context,
86
88
  sessionId: this.actor.sessionId,
89
+ ...agent ? {
90
+ agent
91
+ } : {},
87
92
  client: {
88
93
  mode: this.client.strategy
89
94
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/utils/telemetry/Telemetry.ts"],"sourcesContent":["import crypto from 'node:crypto';\n\nimport { FetchClient } from './clients/FetchClient';\nimport { FetchDetachedClient } from './clients/FetchDetachedClient';\nimport { TelemetryClient, TelemetryClientStrategy, TelemetryRecord } from './types';\nimport { createContext } from './utils/context';\nimport { getAnonymousId } from '../../api/user/UserSettings';\nimport { env } from '../env';\n\nconst debug = require('debug')('expo:telemetry') as typeof console.log;\n\ntype TelemetryOptions = {\n /** A locally generated ID, untracable to an actual user */\n anonymousId?: string;\n /** A locally generated ID, per CLI invocation */\n sessionId?: string;\n /** The authenticated user ID, this is used to generate an untracable hash */\n userId?: string;\n /** The underlying telemetry strategy to use */\n strategy?: TelemetryClientStrategy;\n};\n\ntype TelemetryActor = Required<Pick<TelemetryOptions, 'anonymousId' | 'sessionId'>> & {\n /**\n * Hashed version of the user ID, untracable to an actual user.\n * If this value is set to `undefined`, telemetry is considered uninitialized and will wait until its set.\n * If this value is set to `null`, telemetry is considered initialized without an authenticated user.\n * If this value is set to a string, telemetry is considered initialized with an authenticated user.\n */\n userHash?: string | null;\n};\n\nexport class Telemetry {\n private context = createContext();\n private client: TelemetryClient = new FetchDetachedClient();\n private actor: TelemetryActor;\n\n /** A list of all events, recorded before the telemetry was fully initialized */\n private earlyRecords: TelemetryRecord[] = [];\n\n constructor({\n anonymousId = getAnonymousId(),\n sessionId = crypto.randomUUID(),\n userId,\n strategy = 'detached',\n }: TelemetryOptions = {}) {\n this.actor = { anonymousId, sessionId };\n this.setStrategy(env.EXPO_NO_TELEMETRY_DETACH ? 'debug' : strategy);\n\n if (userId) {\n this.initialize({ userId });\n }\n }\n\n get strategy() {\n return this.client.strategy;\n }\n\n setStrategy(strategy: TelemetryOptions['strategy']) {\n // Abort when client is already using the correct strategy\n if (this.client.strategy === strategy) return;\n // Abort when debugging the telemetry\n if (env.EXPO_NO_TELEMETRY_DETACH && strategy !== 'debug') return;\n\n debug('Switching strategy from %s to %s', this.client.strategy, strategy);\n\n // Load and instantiate the correct client, based on strategy\n const client = createClientFromStrategy(strategy);\n // Replace the client, and re-record any pending records\n this.client.abort().forEach((record) => client.record([record]));\n this.client = client;\n\n return this;\n }\n\n get isInitialized() {\n return this.actor.userHash !== undefined;\n }\n\n initialize({ userId }: { userId: string | null }) {\n this.actor.userHash = userId ? hashUserId(userId) : null;\n this.flushEarlyRecords();\n }\n\n private flushEarlyRecords() {\n if (this.earlyRecords.length) {\n this.recordInternal(this.earlyRecords);\n this.earlyRecords = [];\n }\n }\n\n private recordInternal(records: TelemetryRecord[]) {\n return this.client.record(\n records.map((record) => ({\n ...record,\n type: 'track' as const,\n sentAt: new Date(),\n messageId: createMessageId(record),\n anonymousId: this.actor.anonymousId,\n userHash: this.actor.userHash,\n context: {\n ...this.context,\n sessionId: this.actor.sessionId,\n client: { mode: this.client.strategy },\n },\n }))\n );\n }\n\n record(record: TelemetryRecord | TelemetryRecord[]) {\n const records = Array.isArray(record) ? record : [record];\n\n debug('Recording %d event(s)', records.length);\n\n if (!this.isInitialized) {\n this.earlyRecords.push(...records);\n return;\n }\n\n return this.recordInternal(records);\n }\n\n flush() {\n debug('Flushing events...');\n this.flushEarlyRecords();\n return this.client.flush();\n }\n\n flushOnExit() {\n this.setStrategy('detached');\n this.flushEarlyRecords();\n return this.client.flush();\n }\n}\n\nfunction createClientFromStrategy(strategy: TelemetryOptions['strategy']) {\n // When debugging, use the actual Rudderstack client, but lazy load it\n if (env.EXPO_NO_TELEMETRY_DETACH || strategy === 'debug' || strategy === 'instant') {\n return new FetchClient();\n }\n\n return new FetchDetachedClient();\n}\n\n/** Generate a unique message ID using a random hash and UUID */\nfunction createMessageId(record: TelemetryRecord) {\n const uuid = crypto.randomUUID();\n const md5 = crypto.createHash('md5').update(JSON.stringify(record)).digest('hex');\n\n return `node-${md5}-${uuid}`;\n}\n\n/** Hash the user identifier to make it untracable */\nfunction hashUserId(userId: string) {\n return crypto.createHash('sha256').update(userId).digest('hex');\n}\n"],"names":["Telemetry","debug","require","constructor","anonymousId","getAnonymousId","sessionId","crypto","randomUUID","userId","strategy","context","createContext","client","FetchDetachedClient","earlyRecords","actor","setStrategy","env","EXPO_NO_TELEMETRY_DETACH","initialize","createClientFromStrategy","abort","forEach","record","isInitialized","userHash","undefined","hashUserId","flushEarlyRecords","length","recordInternal","records","map","type","sentAt","Date","messageId","createMessageId","mode","Array","isArray","push","flush","flushOnExit","FetchClient","uuid","md5","createHash","update","JSON","stringify","digest"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/utils/telemetry/Telemetry.ts"],"sourcesContent":["import crypto from 'node:crypto';\n\nimport { FetchClient } from './clients/FetchClient';\nimport { FetchDetachedClient } from './clients/FetchDetachedClient';\nimport type { TelemetryClient, TelemetryClientStrategy, TelemetryRecord } from './types';\nimport { getAgentTelemetryContext } from './utils/agent';\nimport { createContext } from './utils/context';\nimport { getAnonymousId } from '../../api/user/UserSettings';\nimport { env } from '../env';\n\nconst debug = require('debug')('expo:telemetry') as typeof console.log;\n\ntype TelemetryOptions = {\n /** A locally generated ID, untracable to an actual user */\n anonymousId?: string;\n /** A locally generated ID, per CLI invocation */\n sessionId?: string;\n /** The authenticated user ID, this is used to generate an untracable hash */\n userId?: string;\n /** The underlying telemetry strategy to use */\n strategy?: TelemetryClientStrategy;\n};\n\ntype TelemetryActor = Required<Pick<TelemetryOptions, 'anonymousId' | 'sessionId'>> & {\n /**\n * Hashed version of the user ID, untracable to an actual user.\n * If this value is set to `undefined`, telemetry is considered uninitialized and will wait until its set.\n * If this value is set to `null`, telemetry is considered initialized without an authenticated user.\n * If this value is set to a string, telemetry is considered initialized with an authenticated user.\n */\n userHash?: string | null;\n};\n\nexport class Telemetry {\n private context = createContext();\n private client: TelemetryClient = new FetchDetachedClient();\n private actor: TelemetryActor;\n\n /** A list of all events, recorded before the telemetry was fully initialized */\n private earlyRecords: TelemetryRecord[] = [];\n\n constructor({\n anonymousId = getAnonymousId(),\n sessionId = crypto.randomUUID(),\n userId,\n strategy = 'detached',\n }: TelemetryOptions = {}) {\n this.actor = { anonymousId, sessionId };\n this.setStrategy(env.EXPO_NO_TELEMETRY_DETACH ? 'debug' : strategy);\n\n if (userId) {\n this.initialize({ userId });\n }\n }\n\n get strategy() {\n return this.client.strategy;\n }\n\n setStrategy(strategy: TelemetryOptions['strategy']) {\n // Abort when client is already using the correct strategy\n if (this.client.strategy === strategy) return;\n // Abort when debugging the telemetry\n if (env.EXPO_NO_TELEMETRY_DETACH && strategy !== 'debug') return;\n\n debug('Switching strategy from %s to %s', this.client.strategy, strategy);\n\n // Load and instantiate the correct client, based on strategy\n const client = createClientFromStrategy(strategy);\n // Replace the client, and re-record any pending records\n this.client.abort().forEach((record) => client.record([record]));\n this.client = client;\n\n return this;\n }\n\n get isInitialized() {\n return this.actor.userHash !== undefined;\n }\n\n initialize({ userId }: { userId: string | null }) {\n this.actor.userHash = userId ? hashUserId(userId) : null;\n this.flushEarlyRecords();\n }\n\n private flushEarlyRecords() {\n if (this.earlyRecords.length) {\n this.recordInternal(this.earlyRecords);\n this.earlyRecords = [];\n }\n }\n\n private recordInternal(records: TelemetryRecord[]) {\n const agent = getAgentTelemetryContext();\n\n return this.client.record(\n records.map((record) => ({\n ...record,\n type: 'track' as const,\n sentAt: new Date(),\n messageId: createMessageId(record),\n anonymousId: this.actor.anonymousId,\n userHash: this.actor.userHash,\n context: {\n ...this.context,\n sessionId: this.actor.sessionId,\n ...(agent ? { agent } : {}),\n client: { mode: this.client.strategy },\n },\n }))\n );\n }\n\n record(record: TelemetryRecord | TelemetryRecord[]) {\n const records = Array.isArray(record) ? record : [record];\n\n debug('Recording %d event(s)', records.length);\n\n if (!this.isInitialized) {\n this.earlyRecords.push(...records);\n return;\n }\n\n return this.recordInternal(records);\n }\n\n flush() {\n debug('Flushing events...');\n this.flushEarlyRecords();\n return this.client.flush();\n }\n\n flushOnExit() {\n this.setStrategy('detached');\n this.flushEarlyRecords();\n return this.client.flush();\n }\n}\n\nfunction createClientFromStrategy(strategy: TelemetryOptions['strategy']) {\n // When debugging, use the actual Rudderstack client, but lazy load it\n if (env.EXPO_NO_TELEMETRY_DETACH || strategy === 'debug' || strategy === 'instant') {\n return new FetchClient();\n }\n\n return new FetchDetachedClient();\n}\n\n/** Generate a unique message ID using a random hash and UUID */\nfunction createMessageId(record: TelemetryRecord) {\n const uuid = crypto.randomUUID();\n const md5 = crypto.createHash('md5').update(JSON.stringify(record)).digest('hex');\n\n return `node-${md5}-${uuid}`;\n}\n\n/** Hash the user identifier to make it untracable */\nfunction hashUserId(userId: string) {\n return crypto.createHash('sha256').update(userId).digest('hex');\n}\n"],"names":["Telemetry","debug","require","anonymousId","getAnonymousId","sessionId","crypto","randomUUID","userId","strategy","context","createContext","client","FetchDetachedClient","earlyRecords","actor","setStrategy","env","EXPO_NO_TELEMETRY_DETACH","initialize","createClientFromStrategy","abort","forEach","record","isInitialized","userHash","undefined","hashUserId","flushEarlyRecords","length","recordInternal","records","agent","getAgentTelemetryContext","map","type","sentAt","Date","messageId","createMessageId","mode","Array","isArray","push","flush","flushOnExit","FetchClient","uuid","md5","createHash","update","JSON","stringify","digest"],"mappings":";;;;+BAiCaA;;;eAAAA;;;;gEAjCM;;;;;;6BAES;qCACQ;uBAEK;yBACX;8BACC;qBACX;;;;;;AAEpB,MAAMC,QAAQC,QAAQ,SAAS;AAuBxB,MAAMF;IAQX,YAAY,EACVG,cAAcC,IAAAA,4BAAc,GAAE,EAC9BC,YAAYC,qBAAM,CAACC,UAAU,EAAE,EAC/BC,MAAM,EACNC,WAAW,UAAU,EACJ,GAAG,CAAC,CAAC,CAAE;aAZlBC,UAAUC,IAAAA,sBAAa;aACvBC,SAA0B,IAAIC,wCAAmB;QAGzD,8EAA8E,QACtEC,eAAkC,EAAE;QAQ1C,IAAI,CAACC,KAAK,GAAG;YAAEZ;YAAaE;QAAU;QACtC,IAAI,CAACW,WAAW,CAACC,QAAG,CAACC,wBAAwB,GAAG,UAAUT;QAE1D,IAAID,QAAQ;YACV,IAAI,CAACW,UAAU,CAAC;gBAAEX;YAAO;QAC3B;IACF;IAEA,IAAIC,WAAW;QACb,OAAO,IAAI,CAACG,MAAM,CAACH,QAAQ;IAC7B;IAEAO,YAAYP,QAAsC,EAAE;QAClD,0DAA0D;QAC1D,IAAI,IAAI,CAACG,MAAM,CAACH,QAAQ,KAAKA,UAAU;QACvC,qCAAqC;QACrC,IAAIQ,QAAG,CAACC,wBAAwB,IAAIT,aAAa,SAAS;QAE1DR,MAAM,oCAAoC,IAAI,CAACW,MAAM,CAACH,QAAQ,EAAEA;QAEhE,6DAA6D;QAC7D,MAAMG,SAASQ,yBAAyBX;QACxC,wDAAwD;QACxD,IAAI,CAACG,MAAM,CAACS,KAAK,GAAGC,OAAO,CAAC,CAACC,SAAWX,OAAOW,MAAM,CAAC;gBAACA;aAAO;QAC9D,IAAI,CAACX,MAAM,GAAGA;QAEd,OAAO,IAAI;IACb;IAEA,IAAIY,gBAAgB;QAClB,OAAO,IAAI,CAACT,KAAK,CAACU,QAAQ,KAAKC;IACjC;IAEAP,WAAW,EAAEX,MAAM,EAA6B,EAAE;QAChD,IAAI,CAACO,KAAK,CAACU,QAAQ,GAAGjB,SAASmB,WAAWnB,UAAU;QACpD,IAAI,CAACoB,iBAAiB;IACxB;IAEQA,oBAAoB;QAC1B,IAAI,IAAI,CAACd,YAAY,CAACe,MAAM,EAAE;YAC5B,IAAI,CAACC,cAAc,CAAC,IAAI,CAAChB,YAAY;YACrC,IAAI,CAACA,YAAY,GAAG,EAAE;QACxB;IACF;IAEQgB,eAAeC,OAA0B,EAAE;QACjD,MAAMC,QAAQC,IAAAA,+BAAwB;QAEtC,OAAO,IAAI,CAACrB,MAAM,CAACW,MAAM,CACvBQ,QAAQG,GAAG,CAAC,CAACX,SAAY,CAAA;gBACvB,GAAGA,MAAM;gBACTY,MAAM;gBACNC,QAAQ,IAAIC;gBACZC,WAAWC,gBAAgBhB;gBAC3BpB,aAAa,IAAI,CAACY,KAAK,CAACZ,WAAW;gBACnCsB,UAAU,IAAI,CAACV,KAAK,CAACU,QAAQ;gBAC7Bf,SAAS;oBACP,GAAG,IAAI,CAACA,OAAO;oBACfL,WAAW,IAAI,CAACU,KAAK,CAACV,SAAS;oBAC/B,GAAI2B,QAAQ;wBAAEA;oBAAM,IAAI,CAAC,CAAC;oBAC1BpB,QAAQ;wBAAE4B,MAAM,IAAI,CAAC5B,MAAM,CAACH,QAAQ;oBAAC;gBACvC;YACF,CAAA;IAEJ;IAEAc,OAAOA,MAA2C,EAAE;QAClD,MAAMQ,UAAUU,MAAMC,OAAO,CAACnB,UAAUA,SAAS;YAACA;SAAO;QAEzDtB,MAAM,yBAAyB8B,QAAQF,MAAM;QAE7C,IAAI,CAAC,IAAI,CAACL,aAAa,EAAE;YACvB,IAAI,CAACV,YAAY,CAAC6B,IAAI,IAAIZ;YAC1B;QACF;QAEA,OAAO,IAAI,CAACD,cAAc,CAACC;IAC7B;IAEAa,QAAQ;QACN3C,MAAM;QACN,IAAI,CAAC2B,iBAAiB;QACtB,OAAO,IAAI,CAAChB,MAAM,CAACgC,KAAK;IAC1B;IAEAC,cAAc;QACZ,IAAI,CAAC7B,WAAW,CAAC;QACjB,IAAI,CAACY,iBAAiB;QACtB,OAAO,IAAI,CAAChB,MAAM,CAACgC,KAAK;IAC1B;AACF;AAEA,SAASxB,yBAAyBX,QAAsC;IACtE,sEAAsE;IACtE,IAAIQ,QAAG,CAACC,wBAAwB,IAAIT,aAAa,WAAWA,aAAa,WAAW;QAClF,OAAO,IAAIqC,wBAAW;IACxB;IAEA,OAAO,IAAIjC,wCAAmB;AAChC;AAEA,8DAA8D,GAC9D,SAAS0B,gBAAgBhB,MAAuB;IAC9C,MAAMwB,OAAOzC,qBAAM,CAACC,UAAU;IAC9B,MAAMyC,MAAM1C,qBAAM,CAAC2C,UAAU,CAAC,OAAOC,MAAM,CAACC,KAAKC,SAAS,CAAC7B,SAAS8B,MAAM,CAAC;IAE3E,OAAO,CAAC,KAAK,EAAEL,IAAI,CAAC,EAAED,MAAM;AAC9B;AAEA,mDAAmD,GACnD,SAASpB,WAAWnB,MAAc;IAChC,OAAOF,qBAAM,CAAC2C,UAAU,CAAC,UAAUC,MAAM,CAAC1C,QAAQ6C,MAAM,CAAC;AAC3D"}
@@ -26,7 +26,7 @@ class FetchClient {
26
26
  this.headers = {
27
27
  accept: 'application/json',
28
28
  'content-type': 'application/json',
29
- 'user-agent': `expo-cli/${"55.0.22"}`,
29
+ 'user-agent': `expo-cli/${"57.0.9"}`,
30
30
  authorization: 'Basic ' + _nodebuffer().Buffer.from(`${target}:`).toString('base64')
31
31
  };
32
32
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/utils/telemetry/clients/FetchClient.ts"],"sourcesContent":["import type { RequestInit } from 'fetch-nodeshim';\nimport { Buffer } from 'node:buffer';\n\nimport { fetch } from '../../fetch';\nimport { TelemetryClient, TelemetryClientStrategy, TelemetryRecordInternal } from '../types';\nimport { TELEMETRY_ENDPOINT, TELEMETRY_TARGET } from '../utils/constants';\n\ntype Fetch = typeof fetch;\n\ntype FetchClientOptions = {\n /** The fetch method for sending events, should handle retries and timeouts */\n fetch?: Fetch;\n /** The endpoint for recorded events */\n url?: string;\n /** The telemetry target for all events */\n target?: string;\n};\n\ntype FetchClientEntry = Promise<void> & {\n records: TelemetryRecordInternal[];\n controller: AbortController;\n};\n\nexport class FetchClient implements TelemetryClient {\n /** This client should be used for long-running commands */\n readonly strategy: TelemetryClientStrategy = 'instant';\n /** The fetch instance used to transport telemetry to the backend */\n private fetch: Fetch;\n /** The endpoint to send events to */\n private url: string;\n /** Additional headers to send with every event */\n private headers: RequestInit['headers'];\n /** All records that are queued and being sent */\n private entries: Set<FetchClientEntry> = new Set();\n\n constructor({\n fetch = createTelemetryFetch(),\n url = TELEMETRY_ENDPOINT,\n target = TELEMETRY_TARGET,\n }: FetchClientOptions = {}) {\n this.fetch = fetch;\n this.url = url;\n this.headers = {\n accept: 'application/json',\n 'content-type': 'application/json',\n 'user-agent': `expo-cli/${process.env.__EXPO_VERSION}`,\n authorization: 'Basic ' + Buffer.from(`${target}:`).toString('base64'),\n };\n }\n\n private queue(\n records: TelemetryRecordInternal[],\n controller: AbortController,\n request: ReturnType<typeof fetch>\n ) {\n const entry: FetchClientEntry = mutePromise(request) as any;\n entry.finally(() => this.entries.delete(entry));\n entry.controller = controller;\n entry.records = records;\n\n this.entries.add(entry);\n\n return entry;\n }\n\n record(record: TelemetryRecordInternal[]) {\n const records = Array.isArray(record) ? record : [record];\n\n if (!records.length) return;\n\n const controller = new AbortController();\n const body = JSON.stringify({\n sentAt: new Date(),\n batch: records,\n });\n\n return this.queue(\n records,\n controller,\n this.fetch(this.url, {\n body,\n method: 'POST',\n signal: controller.signal,\n headers: this.headers,\n })\n );\n }\n\n flush() {\n return mutePromise(Promise.all(this.entries));\n }\n\n abort() {\n const records: TelemetryRecordInternal[] = [];\n\n this.entries.forEach((entry) => {\n try {\n entry.controller.abort();\n records.push(...entry.records);\n } catch {\n // Ignore abort errors\n }\n });\n\n return records;\n }\n}\n\nfunction createTelemetryFetch(): typeof fetch {\n return async function telemetryFetch(info, init) {\n let error: any;\n for (let attemptCount = 0; attemptCount < 3; attemptCount++) {\n try {\n return await fetch(info, init);\n } catch (_error: any) {\n error = _error;\n }\n }\n throw error;\n };\n}\n\n/** Mute a promise by removing the original return type and hide errors */\nfunction mutePromise(promise: Promise<any>) {\n return promise.then(\n () => {},\n () => {}\n );\n}\n"],"names":["FetchClient","constructor","fetch","createTelemetryFetch","url","TELEMETRY_ENDPOINT","target","TELEMETRY_TARGET","strategy","entries","Set","headers","accept","process","env","__EXPO_VERSION","authorization","Buffer","from","toString","queue","records","controller","request","entry","mutePromise","finally","delete","add","record","Array","isArray","length","AbortController","body","JSON","stringify","sentAt","Date","batch","method","signal","flush","Promise","all","abort","forEach","push","telemetryFetch","info","init","error","attemptCount","_error","promise","then"],"mappings":";;;;+BAuBaA;;;eAAAA;;;;yBAtBU;;;;;;uBAED;2BAE+B;AAkB9C,MAAMA;IAYXC,YAAY,EACVC,QAAQC,sBAAsB,EAC9BC,MAAMC,6BAAkB,EACxBC,SAASC,2BAAgB,EACN,GAAG,CAAC,CAAC,CAAE;QAf5B,yDAAyD,QAChDC,WAAoC;QAO7C,+CAA+C,QACvCC,UAAiC,IAAIC;QAO3C,IAAI,CAACR,KAAK,GAAGA;QACb,IAAI,CAACE,GAAG,GAAGA;QACX,IAAI,CAACO,OAAO,GAAG;YACbC,QAAQ;YACR,gBAAgB;YAChB,cAAc,CAAC,SAAS,EAAEC,QAAQC,GAAG,CAACC,cAAc,EAAE;YACtDC,eAAe,WAAWC,oBAAM,CAACC,IAAI,CAAC,GAAGZ,OAAO,CAAC,CAAC,EAAEa,QAAQ,CAAC;QAC/D;IACF;IAEQC,MACNC,OAAkC,EAClCC,UAA2B,EAC3BC,OAAiC,EACjC;QACA,MAAMC,QAA0BC,YAAYF;QAC5CC,MAAME,OAAO,CAAC,IAAM,IAAI,CAACjB,OAAO,CAACkB,MAAM,CAACH;QACxCA,MAAMF,UAAU,GAAGA;QACnBE,MAAMH,OAAO,GAAGA;QAEhB,IAAI,CAACZ,OAAO,CAACmB,GAAG,CAACJ;QAEjB,OAAOA;IACT;IAEAK,OAAOA,MAAiC,EAAE;QACxC,MAAMR,UAAUS,MAAMC,OAAO,CAACF,UAAUA,SAAS;YAACA;SAAO;QAEzD,IAAI,CAACR,QAAQW,MAAM,EAAE;QAErB,MAAMV,aAAa,IAAIW;QACvB,MAAMC,OAAOC,KAAKC,SAAS,CAAC;YAC1BC,QAAQ,IAAIC;YACZC,OAAOlB;QACT;QAEA,OAAO,IAAI,CAACD,KAAK,CACfC,SACAC,YACA,IAAI,CAACpB,KAAK,CAAC,IAAI,CAACE,GAAG,EAAE;YACnB8B;YACAM,QAAQ;YACRC,QAAQnB,WAAWmB,MAAM;YACzB9B,SAAS,IAAI,CAACA,OAAO;QACvB;IAEJ;IAEA+B,QAAQ;QACN,OAAOjB,YAAYkB,QAAQC,GAAG,CAAC,IAAI,CAACnC,OAAO;IAC7C;IAEAoC,QAAQ;QACN,MAAMxB,UAAqC,EAAE;QAE7C,IAAI,CAACZ,OAAO,CAACqC,OAAO,CAAC,CAACtB;YACpB,IAAI;gBACFA,MAAMF,UAAU,CAACuB,KAAK;gBACtBxB,QAAQ0B,IAAI,IAAIvB,MAAMH,OAAO;YAC/B,EAAE,OAAM;YACN,sBAAsB;YACxB;QACF;QAEA,OAAOA;IACT;AACF;AAEA,SAASlB;IACP,OAAO,eAAe6C,eAAeC,IAAI,EAAEC,IAAI;QAC7C,IAAIC;QACJ,IAAK,IAAIC,eAAe,GAAGA,eAAe,GAAGA,eAAgB;YAC3D,IAAI;gBACF,OAAO,MAAMlD,IAAAA,YAAK,EAAC+C,MAAMC;YAC3B,EAAE,OAAOG,QAAa;gBACpBF,QAAQE;YACV;QACF;QACA,MAAMF;IACR;AACF;AAEA,wEAAwE,GACxE,SAAS1B,YAAY6B,OAAqB;IACxC,OAAOA,QAAQC,IAAI,CACjB,KAAO,GACP,KAAO;AAEX"}
1
+ {"version":3,"sources":["../../../../../src/utils/telemetry/clients/FetchClient.ts"],"sourcesContent":["import type { RequestInit } from 'fetch-nodeshim';\nimport { Buffer } from 'node:buffer';\n\nimport { fetch } from '../../fetch';\nimport type { TelemetryClient, TelemetryClientStrategy, TelemetryRecordInternal } from '../types';\nimport { TELEMETRY_ENDPOINT, TELEMETRY_TARGET } from '../utils/constants';\n\ntype Fetch = typeof fetch;\n\ntype FetchClientOptions = {\n /** The fetch method for sending events, should handle retries and timeouts */\n fetch?: Fetch;\n /** The endpoint for recorded events */\n url?: string;\n /** The telemetry target for all events */\n target?: string;\n};\n\ntype FetchClientEntry = Promise<void> & {\n records: TelemetryRecordInternal[];\n controller: AbortController;\n};\n\nexport class FetchClient implements TelemetryClient {\n /** This client should be used for long-running commands */\n readonly strategy: TelemetryClientStrategy = 'instant';\n /** The fetch instance used to transport telemetry to the backend */\n private fetch: Fetch;\n /** The endpoint to send events to */\n private url: string;\n /** Additional headers to send with every event */\n private headers: RequestInit['headers'];\n /** All records that are queued and being sent */\n private entries: Set<FetchClientEntry> = new Set();\n\n constructor({\n fetch = createTelemetryFetch(),\n url = TELEMETRY_ENDPOINT,\n target = TELEMETRY_TARGET,\n }: FetchClientOptions = {}) {\n this.fetch = fetch;\n this.url = url;\n this.headers = {\n accept: 'application/json',\n 'content-type': 'application/json',\n 'user-agent': `expo-cli/${process.env.__EXPO_VERSION}`,\n authorization: 'Basic ' + Buffer.from(`${target}:`).toString('base64'),\n };\n }\n\n private queue(\n records: TelemetryRecordInternal[],\n controller: AbortController,\n request: ReturnType<typeof fetch>\n ) {\n const entry: FetchClientEntry = mutePromise(request) as any;\n entry.finally(() => this.entries.delete(entry));\n entry.controller = controller;\n entry.records = records;\n\n this.entries.add(entry);\n\n return entry;\n }\n\n record(record: TelemetryRecordInternal[]) {\n const records = Array.isArray(record) ? record : [record];\n\n if (!records.length) return;\n\n const controller = new AbortController();\n const body = JSON.stringify({\n sentAt: new Date(),\n batch: records,\n });\n\n return this.queue(\n records,\n controller,\n this.fetch(this.url, {\n body,\n method: 'POST',\n signal: controller.signal,\n headers: this.headers,\n })\n );\n }\n\n flush() {\n return mutePromise(Promise.all(this.entries));\n }\n\n abort() {\n const records: TelemetryRecordInternal[] = [];\n\n this.entries.forEach((entry) => {\n try {\n entry.controller.abort();\n records.push(...entry.records);\n } catch {\n // Ignore abort errors\n }\n });\n\n return records;\n }\n}\n\nfunction createTelemetryFetch(): typeof fetch {\n return async function telemetryFetch(info, init) {\n let error: any;\n for (let attemptCount = 0; attemptCount < 3; attemptCount++) {\n try {\n return await fetch(info, init);\n } catch (_error: any) {\n error = _error;\n }\n }\n throw error;\n };\n}\n\n/** Mute a promise by removing the original return type and hide errors */\nfunction mutePromise(promise: Promise<any>) {\n return promise.then(\n () => {},\n () => {}\n );\n}\n"],"names":["FetchClient","fetch","createTelemetryFetch","url","TELEMETRY_ENDPOINT","target","TELEMETRY_TARGET","strategy","entries","Set","headers","accept","process","env","__EXPO_VERSION","authorization","Buffer","from","toString","queue","records","controller","request","entry","mutePromise","finally","delete","add","record","Array","isArray","length","AbortController","body","JSON","stringify","sentAt","Date","batch","method","signal","flush","Promise","all","abort","forEach","push","telemetryFetch","info","init","error","attemptCount","_error","promise","then"],"mappings":";;;;+BAuBaA;;;eAAAA;;;;yBAtBU;;;;;;uBAED;2BAE+B;AAkB9C,MAAMA;IAYX,YAAY,EACVC,QAAQC,sBAAsB,EAC9BC,MAAMC,6BAAkB,EACxBC,SAASC,2BAAgB,EACN,GAAG,CAAC,CAAC,CAAE;QAf5B,yDAAyD,QAChDC,WAAoC;QAO7C,+CAA+C,QACvCC,UAAiC,IAAIC;QAO3C,IAAI,CAACR,KAAK,GAAGA;QACb,IAAI,CAACE,GAAG,GAAGA;QACX,IAAI,CAACO,OAAO,GAAG;YACbC,QAAQ;YACR,gBAAgB;YAChB,cAAc,CAAC,SAAS,EAAEC,QAAQC,GAAG,CAACC,cAAc,EAAE;YACtDC,eAAe,WAAWC,oBAAM,CAACC,IAAI,CAAC,GAAGZ,OAAO,CAAC,CAAC,EAAEa,QAAQ,CAAC;QAC/D;IACF;IAEQC,MACNC,OAAkC,EAClCC,UAA2B,EAC3BC,OAAiC,EACjC;QACA,MAAMC,QAA0BC,YAAYF;QAC5CC,MAAME,OAAO,CAAC,IAAM,IAAI,CAACjB,OAAO,CAACkB,MAAM,CAACH;QACxCA,MAAMF,UAAU,GAAGA;QACnBE,MAAMH,OAAO,GAAGA;QAEhB,IAAI,CAACZ,OAAO,CAACmB,GAAG,CAACJ;QAEjB,OAAOA;IACT;IAEAK,OAAOA,MAAiC,EAAE;QACxC,MAAMR,UAAUS,MAAMC,OAAO,CAACF,UAAUA,SAAS;YAACA;SAAO;QAEzD,IAAI,CAACR,QAAQW,MAAM,EAAE;QAErB,MAAMV,aAAa,IAAIW;QACvB,MAAMC,OAAOC,KAAKC,SAAS,CAAC;YAC1BC,QAAQ,IAAIC;YACZC,OAAOlB;QACT;QAEA,OAAO,IAAI,CAACD,KAAK,CACfC,SACAC,YACA,IAAI,CAACpB,KAAK,CAAC,IAAI,CAACE,GAAG,EAAE;YACnB8B;YACAM,QAAQ;YACRC,QAAQnB,WAAWmB,MAAM;YACzB9B,SAAS,IAAI,CAACA,OAAO;QACvB;IAEJ;IAEA+B,QAAQ;QACN,OAAOjB,YAAYkB,QAAQC,GAAG,CAAC,IAAI,CAACnC,OAAO;IAC7C;IAEAoC,QAAQ;QACN,MAAMxB,UAAqC,EAAE;QAE7C,IAAI,CAACZ,OAAO,CAACqC,OAAO,CAAC,CAACtB;YACpB,IAAI;gBACFA,MAAMF,UAAU,CAACuB,KAAK;gBACtBxB,QAAQ0B,IAAI,IAAIvB,MAAMH,OAAO;YAC/B,EAAE,OAAM;YACN,sBAAsB;YACxB;QACF;QAEA,OAAOA;IACT;AACF;AAEA,SAASlB;IACP,OAAO,eAAe6C,eAAeC,IAAI,EAAEC,IAAI;QAC7C,IAAIC;QACJ,IAAK,IAAIC,eAAe,GAAGA,eAAe,GAAGA,eAAgB;YAC3D,IAAI;gBACF,OAAO,MAAMlD,IAAAA,YAAK,EAAC+C,MAAMC;YAC3B,EAAE,OAAOG,QAAa;gBACpBF,QAAQE;YACV;QACF;QACA,MAAMF;IACR;AACF;AAEA,wEAAwE,GACxE,SAAS1B,YAAY6B,OAAqB;IACxC,OAAOA,QAAQC,IAAI,CACjB,KAAO,GACP,KAAO;AAEX"}
@@ -16,7 +16,11 @@ function _interop_require_default(obj) {
16
16
  };
17
17
  }
18
18
  const telemetryFile = process.argv[2];
19
- flush().catch(()=>_nodefs().default.promises.unlink(telemetryFile)).finally(()=>process.exit(0));
19
+ flush().catch(()=>{
20
+ if (telemetryFile) {
21
+ _nodefs().default.promises.unlink(telemetryFile);
22
+ }
23
+ }).finally(()=>process.exit(0));
20
24
  async function flush() {
21
25
  if (!telemetryFile) return;
22
26
  let json;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/utils/telemetry/clients/flushFetchDetached.ts"],"sourcesContent":["import fs from 'node:fs';\n\nimport { FetchClient } from './FetchClient';\nimport type { TelemetryRecordInternal } from '../types';\n\nconst telemetryFile = process.argv[2];\n\nflush()\n .catch(() => fs.promises.unlink(telemetryFile))\n .finally(() => process.exit(0));\n\nasync function flush() {\n if (!telemetryFile) return;\n\n let json: string;\n let data: { records: TelemetryRecordInternal[] };\n\n try {\n json = await fs.promises.readFile(telemetryFile, 'utf8');\n data = JSON.parse(json) as any;\n } catch (error: any) {\n if (error.code === 'ENOENT') return;\n throw error;\n }\n\n if (data.records.length) {\n const client = new FetchClient();\n await client.record(data.records);\n await client.flush();\n }\n\n await fs.promises.unlink(telemetryFile);\n}\n"],"names":["telemetryFile","process","argv","flush","catch","fs","promises","unlink","finally","exit","json","data","readFile","JSON","parse","error","code","records","length","client","FetchClient","record"],"mappings":";;;;;gEAAe;;;;;;6BAEa;;;;;;AAG5B,MAAMA,gBAAgBC,QAAQC,IAAI,CAAC,EAAE;AAErCC,QACGC,KAAK,CAAC,IAAMC,iBAAE,CAACC,QAAQ,CAACC,MAAM,CAACP,gBAC/BQ,OAAO,CAAC,IAAMP,QAAQQ,IAAI,CAAC;AAE9B,eAAeN;IACb,IAAI,CAACH,eAAe;IAEpB,IAAIU;IACJ,IAAIC;IAEJ,IAAI;QACFD,OAAO,MAAML,iBAAE,CAACC,QAAQ,CAACM,QAAQ,CAACZ,eAAe;QACjDW,OAAOE,KAAKC,KAAK,CAACJ;IACpB,EAAE,OAAOK,OAAY;QACnB,IAAIA,MAAMC,IAAI,KAAK,UAAU;QAC7B,MAAMD;IACR;IAEA,IAAIJ,KAAKM,OAAO,CAACC,MAAM,EAAE;QACvB,MAAMC,SAAS,IAAIC,wBAAW;QAC9B,MAAMD,OAAOE,MAAM,CAACV,KAAKM,OAAO;QAChC,MAAME,OAAOhB,KAAK;IACpB;IAEA,MAAME,iBAAE,CAACC,QAAQ,CAACC,MAAM,CAACP;AAC3B"}
1
+ {"version":3,"sources":["../../../../../src/utils/telemetry/clients/flushFetchDetached.ts"],"sourcesContent":["import fs from 'node:fs';\n\nimport { FetchClient } from './FetchClient';\nimport type { TelemetryRecordInternal } from '../types';\n\nconst telemetryFile = process.argv[2];\n\nflush()\n .catch(() => {\n if (telemetryFile) {\n fs.promises.unlink(telemetryFile);\n }\n })\n .finally(() => process.exit(0));\n\nasync function flush() {\n if (!telemetryFile) return;\n\n let json: string;\n let data: { records: TelemetryRecordInternal[] };\n\n try {\n json = await fs.promises.readFile(telemetryFile, 'utf8');\n data = JSON.parse(json) as any;\n } catch (error: any) {\n if (error.code === 'ENOENT') return;\n throw error;\n }\n\n if (data.records.length) {\n const client = new FetchClient();\n await client.record(data.records);\n await client.flush();\n }\n\n await fs.promises.unlink(telemetryFile);\n}\n"],"names":["telemetryFile","process","argv","flush","catch","fs","promises","unlink","finally","exit","json","data","readFile","JSON","parse","error","code","records","length","client","FetchClient","record"],"mappings":";;;;;gEAAe;;;;;;6BAEa;;;;;;AAG5B,MAAMA,gBAAgBC,QAAQC,IAAI,CAAC,EAAE;AAErCC,QACGC,KAAK,CAAC;IACL,IAAIJ,eAAe;QACjBK,iBAAE,CAACC,QAAQ,CAACC,MAAM,CAACP;IACrB;AACF,GACCQ,OAAO,CAAC,IAAMP,QAAQQ,IAAI,CAAC;AAE9B,eAAeN;IACb,IAAI,CAACH,eAAe;IAEpB,IAAIU;IACJ,IAAIC;IAEJ,IAAI;QACFD,OAAO,MAAML,iBAAE,CAACC,QAAQ,CAACM,QAAQ,CAACZ,eAAe;QACjDW,OAAOE,KAAKC,KAAK,CAACJ;IACpB,EAAE,OAAOK,OAAY;QACnB,IAAIA,MAAMC,IAAI,KAAK,UAAU;QAC7B,MAAMD;IACR;IAEA,IAAIJ,KAAKM,OAAO,CAACC,MAAM,EAAE;QACvB,MAAMC,SAAS,IAAIC,wBAAW;QAC9B,MAAMD,OAAOE,MAAM,CAACV,KAAKM,OAAO;QAChC,MAAME,OAAOhB,KAAK;IACpB;IAEA,MAAME,iBAAE,CAACC,QAAQ,CAACC,MAAM,CAACP;AAC3B"}
@@ -5,17 +5,17 @@ Object.defineProperty(exports, "__esModule", {
5
5
  function _export(target, all) {
6
6
  for(var name in all)Object.defineProperty(target, name, {
7
7
  enumerable: true,
8
- get: all[name]
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- getTelemetry: function() {
12
+ get getTelemetry () {
13
13
  return getTelemetry;
14
14
  },
15
- record: function() {
15
+ get record () {
16
16
  return record;
17
17
  },
18
- recordCommand: function() {
18
+ get recordCommand () {
19
19
  return recordCommand;
20
20
  }
21
21
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/utils/telemetry/index.ts"],"sourcesContent":["import process from 'node:process';\n\nimport type { Telemetry } from './Telemetry';\nimport { commandEvent } from './events';\nimport type { TelemetryRecord } from './types';\nimport { getUserAsync } from '../../api/user/user';\nimport { env } from '../env';\n\n/** The singleton telemetry manager to use */\nlet telemetry: Telemetry | null = null;\n\nexport function getTelemetry(): Telemetry | null {\n if (env.EXPO_NO_TELEMETRY || env.EXPO_OFFLINE) return null;\n\n if (!telemetry) {\n // Lazy load the telemetry client, only when enabled\n const { Telemetry } = require('./Telemetry') as typeof import('./Telemetry');\n telemetry = new Telemetry();\n\n // Flush any pending events on exit\n process.once('SIGINT', () => telemetry?.flushOnExit());\n process.once('SIGTERM', () => telemetry?.flushOnExit());\n process.once('beforeExit', () => telemetry?.flushOnExit());\n\n // Initialize the telemetry\n getUserAsync()\n .then((actor) => telemetry?.initialize({ userId: actor?.id ?? null }))\n .catch(() => telemetry?.initialize({ userId: null }));\n }\n\n return telemetry;\n}\n\n/**\n * Record a single telemetry event, or multiple in a single batch.\n * The event does not need to be awaited, its:\n * - Not sent when using `EXPO_NO_TELEMETRY` or `EXPO_OFFLINE`, and returns `null`\n * - Sent immediately for long running commands, returns the `fetch` promise\n * - Queued and sent in background, returns `undefined`\n */\nexport function record(records: TelemetryRecord | TelemetryRecord[]) {\n return getTelemetry()?.record(records);\n}\n\n/**\n * Record a command invocation, and the name of the command.\n * This can be disabled with the $EXPO_NO_TELEMETRY environment variable.\n * We do this to determine how well deprecations are going before remove a command.\n */\nexport function recordCommand(command: string) {\n if (isLongRunningCommand(command)) {\n getTelemetry()?.setStrategy('instant');\n }\n\n return record(commandEvent(command));\n}\n\n/** Determine if the command is a long-running command, based on the command name */\nfunction isLongRunningCommand(command: string) {\n return command === 'start' || command.startsWith('run') || command.startsWith('export');\n}\n"],"names":["getTelemetry","record","recordCommand","telemetry","env","EXPO_NO_TELEMETRY","EXPO_OFFLINE","Telemetry","require","process","once","flushOnExit","getUserAsync","then","actor","initialize","userId","id","catch","records","command","isLongRunningCommand","setStrategy","commandEvent","startsWith"],"mappings":";;;;;;;;;;;IAWgBA,YAAY;eAAZA;;IA6BAC,MAAM;eAANA;;IASAC,aAAa;eAAbA;;;;gEAjDI;;;;;;wBAGS;sBAEA;qBACT;;;;;;AAEpB,2CAA2C,GAC3C,IAAIC,YAA8B;AAE3B,SAASH;IACd,IAAII,QAAG,CAACC,iBAAiB,IAAID,QAAG,CAACE,YAAY,EAAE,OAAO;IAEtD,IAAI,CAACH,WAAW;QACd,oDAAoD;QACpD,MAAM,EAAEI,SAAS,EAAE,GAAGC,QAAQ;QAC9BL,YAAY,IAAII;QAEhB,mCAAmC;QACnCE,sBAAO,CAACC,IAAI,CAAC,UAAU,IAAMP,6BAAAA,UAAWQ,WAAW;QACnDF,sBAAO,CAACC,IAAI,CAAC,WAAW,IAAMP,6BAAAA,UAAWQ,WAAW;QACpDF,sBAAO,CAACC,IAAI,CAAC,cAAc,IAAMP,6BAAAA,UAAWQ,WAAW;QAEvD,2BAA2B;QAC3BC,IAAAA,kBAAY,IACTC,IAAI,CAAC,CAACC,QAAUX,6BAAAA,UAAWY,UAAU,CAAC;gBAAEC,QAAQF,CAAAA,yBAAAA,MAAOG,EAAE,KAAI;YAAK,IAClEC,KAAK,CAAC,IAAMf,6BAAAA,UAAWY,UAAU,CAAC;gBAAEC,QAAQ;YAAK;IACtD;IAEA,OAAOb;AACT;AASO,SAASF,OAAOkB,OAA4C;QAC1DnB;IAAP,QAAOA,gBAAAA,mCAAAA,cAAgBC,MAAM,CAACkB;AAChC;AAOO,SAASjB,cAAckB,OAAe;IAC3C,IAAIC,qBAAqBD,UAAU;YACjCpB;SAAAA,gBAAAA,mCAAAA,cAAgBsB,WAAW,CAAC;IAC9B;IAEA,OAAOrB,OAAOsB,IAAAA,oBAAY,EAACH;AAC7B;AAEA,kFAAkF,GAClF,SAASC,qBAAqBD,OAAe;IAC3C,OAAOA,YAAY,WAAWA,QAAQI,UAAU,CAAC,UAAUJ,QAAQI,UAAU,CAAC;AAChF"}
1
+ {"version":3,"sources":["../../../../src/utils/telemetry/index.ts"],"sourcesContent":["import process from 'node:process';\n\nimport type { Telemetry } from './Telemetry';\nimport { commandEvent } from './events';\nimport type { TelemetryRecord } from './types';\nimport { getUserAsync } from '../../api/user/user';\nimport { env } from '../env';\n\n/** The singleton telemetry manager to use */\nlet telemetry: Telemetry | null = null;\n\nexport function getTelemetry(): Telemetry | null {\n if (env.EXPO_NO_TELEMETRY || env.EXPO_OFFLINE) return null;\n\n if (!telemetry) {\n // Lazy load the telemetry client, only when enabled\n const { Telemetry } = require('./Telemetry') as typeof import('./Telemetry');\n telemetry = new Telemetry();\n\n // Flush any pending events on exit\n process.once('SIGINT', () => telemetry?.flushOnExit());\n process.once('SIGTERM', () => telemetry?.flushOnExit());\n process.once('beforeExit', () => telemetry?.flushOnExit());\n\n // Initialize the telemetry\n getUserAsync()\n .then((actor) => telemetry?.initialize({ userId: actor?.id ?? null }))\n .catch(() => telemetry?.initialize({ userId: null }));\n }\n\n return telemetry;\n}\n\n/**\n * Record a single telemetry event, or multiple in a single batch.\n * The event does not need to be awaited, its:\n * - Not sent when using `EXPO_NO_TELEMETRY` or `EXPO_OFFLINE`, and returns `null`\n * - Sent immediately for long running commands, returns the `fetch` promise\n * - Queued and sent in background, returns `undefined`\n */\nexport function record(records: TelemetryRecord | TelemetryRecord[]) {\n return getTelemetry()?.record(records);\n}\n\n/**\n * Record a command invocation, and the name of the command.\n * This can be disabled with the $EXPO_NO_TELEMETRY environment variable.\n * We do this to determine how well deprecations are going before remove a command.\n */\nexport function recordCommand(command: string) {\n if (isLongRunningCommand(command)) {\n getTelemetry()?.setStrategy('instant');\n }\n\n return record(commandEvent(command));\n}\n\n/** Determine if the command is a long-running command, based on the command name */\nfunction isLongRunningCommand(command: string) {\n return command === 'start' || command.startsWith('run') || command.startsWith('export');\n}\n"],"names":["getTelemetry","record","recordCommand","telemetry","env","EXPO_NO_TELEMETRY","EXPO_OFFLINE","Telemetry","require","process","once","flushOnExit","getUserAsync","then","actor","initialize","userId","id","catch","records","command","isLongRunningCommand","setStrategy","commandEvent","startsWith"],"mappings":";;;;;;;;;;;QAWgBA;eAAAA;;QA6BAC;eAAAA;;QASAC;eAAAA;;;;gEAjDI;;;;;;wBAGS;sBAEA;qBACT;;;;;;AAEpB,2CAA2C,GAC3C,IAAIC,YAA8B;AAE3B,SAASH;IACd,IAAII,QAAG,CAACC,iBAAiB,IAAID,QAAG,CAACE,YAAY,EAAE,OAAO;IAEtD,IAAI,CAACH,WAAW;QACd,oDAAoD;QACpD,MAAM,EAAEI,SAAS,EAAE,GAAGC,QAAQ;QAC9BL,YAAY,IAAII;QAEhB,mCAAmC;QACnCE,sBAAO,CAACC,IAAI,CAAC,UAAU,IAAMP,6BAAAA,UAAWQ,WAAW;QACnDF,sBAAO,CAACC,IAAI,CAAC,WAAW,IAAMP,6BAAAA,UAAWQ,WAAW;QACpDF,sBAAO,CAACC,IAAI,CAAC,cAAc,IAAMP,6BAAAA,UAAWQ,WAAW;QAEvD,2BAA2B;QAC3BC,IAAAA,kBAAY,IACTC,IAAI,CAAC,CAACC,QAAUX,6BAAAA,UAAWY,UAAU,CAAC;gBAAEC,QAAQF,CAAAA,yBAAAA,MAAOG,EAAE,KAAI;YAAK,IAClEC,KAAK,CAAC,IAAMf,6BAAAA,UAAWY,UAAU,CAAC;gBAAEC,QAAQ;YAAK;IACtD;IAEA,OAAOb;AACT;AASO,SAASF,OAAOkB,OAA4C;QAC1DnB;IAAP,QAAOA,gBAAAA,mCAAAA,cAAgBC,MAAM,CAACkB;AAChC;AAOO,SAASjB,cAAckB,OAAe;IAC3C,IAAIC,qBAAqBD,UAAU;YACjCpB;SAAAA,gBAAAA,mCAAAA,cAAgBsB,WAAW,CAAC;IAC9B;IAEA,OAAOrB,OAAOsB,IAAAA,oBAAY,EAACH;AAC7B;AAEA,kFAAkF,GAClF,SAASC,qBAAqBD,OAAe;IAC3C,OAAOA,YAAY,WAAWA,QAAQI,UAAU,CAAC,UAAUJ,QAAQI,UAAU,CAAC;AAChF"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "getAgentTelemetryContext", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return getAgentTelemetryContext;
9
+ }
10
+ });
11
+ function _agentclidetector() {
12
+ const data = require("agent-cli-detector");
13
+ _agentclidetector = function() {
14
+ return data;
15
+ };
16
+ return data;
17
+ }
18
+ const debug = require('debug')('expo:telemetry:agent');
19
+ let agentTelemetryContext;
20
+ function getAgentTelemetryContext() {
21
+ if (agentTelemetryContext === undefined) {
22
+ agentTelemetryContext = resolveAgentTelemetryContext();
23
+ }
24
+ return agentTelemetryContext;
25
+ }
26
+ function resolveAgentTelemetryContext() {
27
+ try {
28
+ const { agent, detected } = (0, _agentclidetector().detectAgent)();
29
+ if (!detected || agent == null) {
30
+ return null;
31
+ }
32
+ return {
33
+ id: agent.id,
34
+ sessionId: agent.sessionId
35
+ };
36
+ } catch (error) {
37
+ debug('Failed to detect coding agent: %s', (error == null ? void 0 : error.message) ?? error);
38
+ return null;
39
+ }
40
+ }
41
+
42
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/utils/telemetry/utils/agent.ts"],"sourcesContent":["import { detectAgent } from 'agent-cli-detector';\n\nconst debug = require('debug')('expo:telemetry:agent') as typeof console.log;\n\nexport type AgentTelemetryContext = {\n id: string;\n sessionId: string | undefined;\n};\n\nlet agentTelemetryContext: AgentTelemetryContext | null | undefined;\n\nexport function getAgentTelemetryContext(): AgentTelemetryContext | null {\n if (agentTelemetryContext === undefined) {\n agentTelemetryContext = resolveAgentTelemetryContext();\n }\n\n return agentTelemetryContext;\n}\n\nfunction resolveAgentTelemetryContext(): AgentTelemetryContext | null {\n try {\n const { agent, detected } = detectAgent();\n if (!detected || agent == null) {\n return null;\n }\n return { id: agent.id, sessionId: agent.sessionId };\n } catch (error: any) {\n debug('Failed to detect coding agent: %s', error?.message ?? error);\n return null;\n }\n}\n"],"names":["getAgentTelemetryContext","debug","require","agentTelemetryContext","undefined","resolveAgentTelemetryContext","agent","detected","detectAgent","id","sessionId","error","message"],"mappings":";;;;+BAWgBA;;;eAAAA;;;;yBAXY;;;;;;AAE5B,MAAMC,QAAQC,QAAQ,SAAS;AAO/B,IAAIC;AAEG,SAASH;IACd,IAAIG,0BAA0BC,WAAW;QACvCD,wBAAwBE;IAC1B;IAEA,OAAOF;AACT;AAEA,SAASE;IACP,IAAI;QACF,MAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAE,GAAGC,IAAAA,+BAAW;QACvC,IAAI,CAACD,YAAYD,SAAS,MAAM;YAC9B,OAAO;QACT;QACA,OAAO;YAAEG,IAAIH,MAAMG,EAAE;YAAEC,WAAWJ,MAAMI,SAAS;QAAC;IACpD,EAAE,OAAOC,OAAY;QACnBV,MAAM,qCAAqCU,CAAAA,yBAAAA,MAAOC,OAAO,KAAID;QAC7D,OAAO;IACT;AACF"}
@@ -5,14 +5,14 @@ Object.defineProperty(exports, "__esModule", {
5
5
  function _export(target, all) {
6
6
  for(var name in all)Object.defineProperty(target, name, {
7
7
  enumerable: true,
8
- get: all[name]
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- TELEMETRY_ENDPOINT: function() {
12
+ get TELEMETRY_ENDPOINT () {
13
13
  return TELEMETRY_ENDPOINT;
14
14
  },
15
- TELEMETRY_TARGET: function() {
15
+ get TELEMETRY_TARGET () {
16
16
  return TELEMETRY_TARGET;
17
17
  }
18
18
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/utils/telemetry/utils/constants.ts"],"sourcesContent":["import { env } from '../../env';\n\nexport const TELEMETRY_ENDPOINT = 'https://cdp.expo.dev/v1/batch';\n\nexport const TELEMETRY_TARGET =\n env.EXPO_STAGING || env.EXPO_LOCAL\n ? '24TKICqYKilXM480mA7ktgVDdea'\n : '24TKR7CQAaGgIrLTgu3Fp4OdOkI'; // expo unified\n"],"names":["TELEMETRY_ENDPOINT","TELEMETRY_TARGET","env","EXPO_STAGING","EXPO_LOCAL"],"mappings":";;;;;;;;;;;IAEaA,kBAAkB;eAAlBA;;IAEAC,gBAAgB;eAAhBA;;;qBAJO;AAEb,MAAMD,qBAAqB;AAE3B,MAAMC,mBACXC,QAAG,CAACC,YAAY,IAAID,QAAG,CAACE,UAAU,GAC9B,gCACA,+BAA+B,eAAe"}
1
+ {"version":3,"sources":["../../../../../src/utils/telemetry/utils/constants.ts"],"sourcesContent":["import { env } from '../../env';\n\nexport const TELEMETRY_ENDPOINT = 'https://cdp.expo.dev/v1/batch';\n\nexport const TELEMETRY_TARGET =\n env.EXPO_STAGING || env.EXPO_LOCAL\n ? '24TKICqYKilXM480mA7ktgVDdea'\n : '24TKR7CQAaGgIrLTgu3Fp4OdOkI'; // expo unified\n"],"names":["TELEMETRY_ENDPOINT","TELEMETRY_TARGET","env","EXPO_STAGING","EXPO_LOCAL"],"mappings":";;;;;;;;;;;QAEaA;eAAAA;;QAEAC;eAAAA;;;qBAJO;AAEb,MAAMD,qBAAqB;AAE3B,MAAMC,mBACXC,QAAG,CAACC,YAAY,IAAID,QAAG,CAACE,UAAU,GAC9B,gCACA,+BAA+B,eAAe"}
@@ -83,7 +83,7 @@ function createContext() {
83
83
  cpu: summarizeCpuInfo(),
84
84
  app: {
85
85
  name: 'expo/cli',
86
- version: "55.0.22"
86
+ version: "57.0.9"
87
87
  },
88
88
  ci: _ciinfo().isCI ? {
89
89
  name: _ciinfo().name,
@@ -104,8 +104,9 @@ function summarizeCpuInfo() {
104
104
  };
105
105
  for(const key in cpus){
106
106
  if (cpus[key].length > summary.count) {
107
+ var _cpus_key_;
107
108
  summary.model = key;
108
- summary.speed = cpus[key][0].speed;
109
+ summary.speed = ((_cpus_key_ = cpus[key][0]) == null ? void 0 : _cpus_key_.speed) ?? 0;
109
110
  summary.count = cpus[key].length;
110
111
  }
111
112
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/utils/telemetry/utils/context.ts"],"sourcesContent":["import * as ciInfo from 'ci-info';\nimport os from 'os';\n\nimport { groupBy } from '../../array';\n\nexport function createContext() {\n return {\n os: { name: os.platform(), version: os.release(), node: process.versions.node },\n device: { arch: os.arch(), memory: summarizeMemory() },\n cpu: summarizeCpuInfo(),\n app: { name: 'expo/cli', version: process.env.__EXPO_VERSION },\n ci: ciInfo.isCI ? { name: ciInfo.name, isPr: ciInfo.isPR } : undefined,\n };\n}\n\nfunction summarizeMemory() {\n const gb = os.totalmem() / 1024 / 1024 / 1024;\n return Math.round(gb * 100) / 100;\n}\n\nfunction summarizeCpuInfo() {\n const cpus = groupBy(os.cpus() ?? [], (item) => item.model);\n const summary = { model: '', speed: 0, count: 0 };\n\n for (const key in cpus) {\n if (cpus[key].length > summary.count) {\n summary.model = key;\n summary.speed = cpus[key][0].speed;\n summary.count = cpus[key].length;\n }\n }\n\n return !summary.model || !summary.count ? undefined : summary;\n}\n"],"names":["createContext","os","name","platform","version","release","node","process","versions","device","arch","memory","summarizeMemory","cpu","summarizeCpuInfo","app","env","__EXPO_VERSION","ci","ciInfo","isCI","isPr","isPR","undefined","gb","totalmem","Math","round","cpus","groupBy","item","model","summary","speed","count","key","length"],"mappings":";;;;+BAKgBA;;;eAAAA;;;;iEALQ;;;;;;;gEACT;;;;;;uBAES;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEjB,SAASA;IACd,OAAO;QACLC,IAAI;YAAEC,MAAMD,aAAE,CAACE,QAAQ;YAAIC,SAASH,aAAE,CAACI,OAAO;YAAIC,MAAMC,QAAQC,QAAQ,CAACF,IAAI;QAAC;QAC9EG,QAAQ;YAAEC,MAAMT,aAAE,CAACS,IAAI;YAAIC,QAAQC;QAAkB;QACrDC,KAAKC;QACLC,KAAK;YAAEb,MAAM;YAAYE,SAASG,QAAQS,GAAG,CAACC,cAAc;QAAC;QAC7DC,IAAIC,UAAOC,IAAI,GAAG;YAAElB,MAAMiB,UAAOjB,IAAI;YAAEmB,MAAMF,UAAOG,IAAI;QAAC,IAAIC;IAC/D;AACF;AAEA,SAASX;IACP,MAAMY,KAAKvB,aAAE,CAACwB,QAAQ,KAAK,OAAO,OAAO;IACzC,OAAOC,KAAKC,KAAK,CAACH,KAAK,OAAO;AAChC;AAEA,SAASV;IACP,MAAMc,OAAOC,IAAAA,cAAO,EAAC5B,aAAE,CAAC2B,IAAI,MAAM,EAAE,EAAE,CAACE,OAASA,KAAKC,KAAK;IAC1D,MAAMC,UAAU;QAAED,OAAO;QAAIE,OAAO;QAAGC,OAAO;IAAE;IAEhD,IAAK,MAAMC,OAAOP,KAAM;QACtB,IAAIA,IAAI,CAACO,IAAI,CAACC,MAAM,GAAGJ,QAAQE,KAAK,EAAE;YACpCF,QAAQD,KAAK,GAAGI;YAChBH,QAAQC,KAAK,GAAGL,IAAI,CAACO,IAAI,CAAC,EAAE,CAACF,KAAK;YAClCD,QAAQE,KAAK,GAAGN,IAAI,CAACO,IAAI,CAACC,MAAM;QAClC;IACF;IAEA,OAAO,CAACJ,QAAQD,KAAK,IAAI,CAACC,QAAQE,KAAK,GAAGX,YAAYS;AACxD"}
1
+ {"version":3,"sources":["../../../../../src/utils/telemetry/utils/context.ts"],"sourcesContent":["import * as ciInfo from 'ci-info';\nimport os from 'os';\n\nimport { groupBy } from '../../array';\n\nexport function createContext() {\n return {\n os: { name: os.platform(), version: os.release(), node: process.versions.node },\n device: { arch: os.arch(), memory: summarizeMemory() },\n cpu: summarizeCpuInfo(),\n app: { name: 'expo/cli', version: process.env.__EXPO_VERSION },\n ci: ciInfo.isCI ? { name: ciInfo.name, isPr: ciInfo.isPR } : undefined,\n };\n}\n\nfunction summarizeMemory() {\n const gb = os.totalmem() / 1024 / 1024 / 1024;\n return Math.round(gb * 100) / 100;\n}\n\nfunction summarizeCpuInfo() {\n const cpus = groupBy(os.cpus() ?? [], (item) => item.model);\n const summary = { model: '', speed: 0, count: 0 };\n\n for (const key in cpus) {\n if (cpus[key]!.length > summary.count) {\n summary.model = key;\n summary.speed = cpus[key]![0]?.speed ?? 0;\n summary.count = cpus[key]!.length;\n }\n }\n\n return !summary.model || !summary.count ? undefined : summary;\n}\n"],"names":["createContext","os","name","platform","version","release","node","process","versions","device","arch","memory","summarizeMemory","cpu","summarizeCpuInfo","app","env","__EXPO_VERSION","ci","ciInfo","isCI","isPr","isPR","undefined","gb","totalmem","Math","round","cpus","groupBy","item","model","summary","speed","count","key","length"],"mappings":";;;;+BAKgBA;;;eAAAA;;;;iEALQ;;;;;;;gEACT;;;;;;uBAES;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEjB,SAASA;IACd,OAAO;QACLC,IAAI;YAAEC,MAAMD,aAAE,CAACE,QAAQ;YAAIC,SAASH,aAAE,CAACI,OAAO;YAAIC,MAAMC,QAAQC,QAAQ,CAACF,IAAI;QAAC;QAC9EG,QAAQ;YAAEC,MAAMT,aAAE,CAACS,IAAI;YAAIC,QAAQC;QAAkB;QACrDC,KAAKC;QACLC,KAAK;YAAEb,MAAM;YAAYE,SAASG,QAAQS,GAAG,CAACC,cAAc;QAAC;QAC7DC,IAAIC,UAAOC,IAAI,GAAG;YAAElB,MAAMiB,UAAOjB,IAAI;YAAEmB,MAAMF,UAAOG,IAAI;QAAC,IAAIC;IAC/D;AACF;AAEA,SAASX;IACP,MAAMY,KAAKvB,aAAE,CAACwB,QAAQ,KAAK,OAAO,OAAO;IACzC,OAAOC,KAAKC,KAAK,CAACH,KAAK,OAAO;AAChC;AAEA,SAASV;IACP,MAAMc,OAAOC,IAAAA,cAAO,EAAC5B,aAAE,CAAC2B,IAAI,MAAM,EAAE,EAAE,CAACE,OAASA,KAAKC,KAAK;IAC1D,MAAMC,UAAU;QAAED,OAAO;QAAIE,OAAO;QAAGC,OAAO;IAAE;IAEhD,IAAK,MAAMC,OAAOP,KAAM;QACtB,IAAIA,IAAI,CAACO,IAAI,CAAEC,MAAM,GAAGJ,QAAQE,KAAK,EAAE;gBAErBN;YADhBI,QAAQD,KAAK,GAAGI;YAChBH,QAAQC,KAAK,GAAGL,EAAAA,aAAAA,IAAI,CAACO,IAAI,AAAC,CAAC,EAAE,qBAAbP,WAAeK,KAAK,KAAI;YACxCD,QAAQE,KAAK,GAAGN,IAAI,CAACO,IAAI,CAAEC,MAAM;QACnC;IACF;IAEA,OAAO,CAACJ,QAAQD,KAAK,IAAI,CAACC,QAAQE,KAAK,GAAGX,YAAYS;AACxD"}
@@ -5,23 +5,20 @@ Object.defineProperty(exports, "__esModule", {
5
5
  function _export(target, all) {
6
6
  for(var name in all)Object.defineProperty(target, name, {
7
7
  enumerable: true,
8
- get: all[name]
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- isUrlAvailableAsync: function() {
12
+ get isUrlAvailableAsync () {
13
13
  return isUrlAvailableAsync;
14
14
  },
15
- isUrlOk: function() {
16
- return isUrlOk;
17
- },
18
- stripExtension: function() {
15
+ get stripExtension () {
19
16
  return stripExtension;
20
17
  },
21
- stripPort: function() {
18
+ get stripPort () {
22
19
  return stripPort;
23
20
  },
24
- validateUrl: function() {
21
+ get validateUrl () {
25
22
  return validateUrl;
26
23
  }
27
24
  });
@@ -39,7 +36,6 @@ function _url() {
39
36
  };
40
37
  return data;
41
38
  }
42
- const _client = require("../api/rest/client");
43
39
  function _interop_require_default(obj) {
44
40
  return obj && obj.__esModule ? obj : {
45
41
  default: obj
@@ -52,14 +48,6 @@ function isUrlAvailableAsync(url) {
52
48
  });
53
49
  });
54
50
  }
55
- async function isUrlOk(url) {
56
- try {
57
- const res = await (0, _client.fetchAsync)(url);
58
- return res.ok;
59
- } catch {
60
- return false;
61
- }
62
- }
63
51
  function validateUrl(urlString, { protocols, requireProtocol } = {}) {
64
52
  try {
65
53
  const results = new (_url()).URL(urlString);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/url.ts"],"sourcesContent":["import dns from 'dns';\nimport { URL } from 'url';\n\nimport { fetchAsync } from '../api/rest/client';\n\n/** Check if a server is available based on the URL. */\nexport function isUrlAvailableAsync(url: string): Promise<boolean> {\n return new Promise<boolean>((resolve) => {\n dns.lookup(url, (err) => {\n resolve(!err);\n });\n });\n}\n\n/** Check if a request to the given URL is `ok` (status 200). */\nexport async function isUrlOk(url: string): Promise<boolean> {\n try {\n const res = await fetchAsync(url);\n return res.ok;\n } catch {\n return false;\n }\n}\n\n/** Determine if a string is a valid URL, can optionally ensure certain protocols (like `https` or `exp`) are adhered to. */\nexport function validateUrl(\n urlString: string,\n {\n protocols,\n requireProtocol,\n }: {\n /** Set of allowed protocols for the string to adhere to. @example ['exp', 'https'] */\n protocols?: string[];\n /** Ensure the URL has a protocol component (prefix before `://`). */\n requireProtocol?: boolean;\n } = {}\n) {\n try {\n const results = new URL(urlString);\n if (!results.protocol && !requireProtocol) {\n return true;\n }\n return protocols\n ? results.protocol\n ? protocols.map((x) => `${x.toLowerCase()}:`).includes(results.protocol)\n : false\n : true;\n } catch {\n return false;\n }\n}\n\n/** Remove the port from a given `host` URL string. */\nexport function stripPort(host?: string): string | null {\n return coerceUrl(host)?.hostname ?? null;\n}\n\nfunction coerceUrl(urlString?: string): URL | null {\n if (!urlString) {\n return null;\n }\n try {\n return new URL('/', urlString);\n } catch {\n return new URL('/', `http://${urlString}`);\n }\n}\n\n/** Strip a given extension from a URL string. */\nexport function stripExtension(url: string, extension: string): string {\n return url.replace(new RegExp(`.${extension}$`), '');\n}\n"],"names":["isUrlAvailableAsync","isUrlOk","stripExtension","stripPort","validateUrl","url","Promise","resolve","dns","lookup","err","res","fetchAsync","ok","urlString","protocols","requireProtocol","results","URL","protocol","map","x","toLowerCase","includes","host","coerceUrl","hostname","extension","replace","RegExp"],"mappings":";;;;;;;;;;;IAMgBA,mBAAmB;eAAnBA;;IASMC,OAAO;eAAPA;;IAsDNC,cAAc;eAAdA;;IAhBAC,SAAS;eAATA;;IA5BAC,WAAW;eAAXA;;;;gEAzBA;;;;;;;yBACI;;;;;;wBAEO;;;;;;AAGpB,SAASJ,oBAAoBK,GAAW;IAC7C,OAAO,IAAIC,QAAiB,CAACC;QAC3BC,cAAG,CAACC,MAAM,CAACJ,KAAK,CAACK;YACfH,QAAQ,CAACG;QACX;IACF;AACF;AAGO,eAAeT,QAAQI,GAAW;IACvC,IAAI;QACF,MAAMM,MAAM,MAAMC,IAAAA,kBAAU,EAACP;QAC7B,OAAOM,IAAIE,EAAE;IACf,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAGO,SAAST,YACdU,SAAiB,EACjB,EACEC,SAAS,EACTC,eAAe,EAMhB,GAAG,CAAC,CAAC;IAEN,IAAI;QACF,MAAMC,UAAU,IAAIC,CAAAA,MAAE,KAAC,CAACJ;QACxB,IAAI,CAACG,QAAQE,QAAQ,IAAI,CAACH,iBAAiB;YACzC,OAAO;QACT;QACA,OAAOD,YACHE,QAAQE,QAAQ,GACdJ,UAAUK,GAAG,CAAC,CAACC,IAAM,GAAGA,EAAEC,WAAW,GAAG,CAAC,CAAC,EAAEC,QAAQ,CAACN,QAAQE,QAAQ,IACrE,QACF;IACN,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAGO,SAAShB,UAAUqB,IAAa;QAC9BC;IAAP,OAAOA,EAAAA,aAAAA,UAAUD,0BAAVC,WAAiBC,QAAQ,KAAI;AACtC;AAEA,SAASD,UAAUX,SAAkB;IACnC,IAAI,CAACA,WAAW;QACd,OAAO;IACT;IACA,IAAI;QACF,OAAO,IAAII,CAAAA,MAAE,KAAC,CAAC,KAAKJ;IACtB,EAAE,OAAM;QACN,OAAO,IAAII,CAAAA,MAAE,KAAC,CAAC,KAAK,CAAC,OAAO,EAAEJ,WAAW;IAC3C;AACF;AAGO,SAASZ,eAAeG,GAAW,EAAEsB,SAAiB;IAC3D,OAAOtB,IAAIuB,OAAO,CAAC,IAAIC,OAAO,CAAC,CAAC,EAAEF,UAAU,CAAC,CAAC,GAAG;AACnD"}
1
+ {"version":3,"sources":["../../../src/utils/url.ts"],"sourcesContent":["import dns from 'dns';\nimport { URL } from 'url';\n\n/** Check if a server is available based on the URL. */\nexport function isUrlAvailableAsync(url: string): Promise<boolean> {\n return new Promise<boolean>((resolve) => {\n dns.lookup(url, (err) => {\n resolve(!err);\n });\n });\n}\n\n/** Determine if a string is a valid URL, can optionally ensure certain protocols (like `https` or `exp`) are adhered to. */\nexport function validateUrl(\n urlString: string,\n {\n protocols,\n requireProtocol,\n }: {\n /** Set of allowed protocols for the string to adhere to. @example ['exp', 'https'] */\n protocols?: string[];\n /** Ensure the URL has a protocol component (prefix before `://`). */\n requireProtocol?: boolean;\n } = {}\n) {\n try {\n const results = new URL(urlString);\n if (!results.protocol && !requireProtocol) {\n return true;\n }\n return protocols\n ? results.protocol\n ? protocols.map((x) => `${x.toLowerCase()}:`).includes(results.protocol)\n : false\n : true;\n } catch {\n return false;\n }\n}\n\n/** Remove the port from a given `host` URL string. */\nexport function stripPort(host?: string): string | null {\n return coerceUrl(host)?.hostname ?? null;\n}\n\nfunction coerceUrl(urlString?: string): URL | null {\n if (!urlString) {\n return null;\n }\n try {\n return new URL('/', urlString);\n } catch {\n return new URL('/', `http://${urlString}`);\n }\n}\n\n/** Strip a given extension from a URL string. */\nexport function stripExtension(url: string, extension: string): string {\n return url.replace(new RegExp(`.${extension}$`), '');\n}\n"],"names":["isUrlAvailableAsync","stripExtension","stripPort","validateUrl","url","Promise","resolve","dns","lookup","err","urlString","protocols","requireProtocol","results","URL","protocol","map","x","toLowerCase","includes","host","coerceUrl","hostname","extension","replace","RegExp"],"mappings":";;;;;;;;;;;QAIgBA;eAAAA;;QAqDAC;eAAAA;;QAhBAC;eAAAA;;QA5BAC;eAAAA;;;;gEAbA;;;;;;;yBACI;;;;;;;;;;;AAGb,SAASH,oBAAoBI,GAAW;IAC7C,OAAO,IAAIC,QAAiB,CAACC;QAC3BC,cAAG,CAACC,MAAM,CAACJ,KAAK,CAACK;YACfH,QAAQ,CAACG;QACX;IACF;AACF;AAGO,SAASN,YACdO,SAAiB,EACjB,EACEC,SAAS,EACTC,eAAe,EAMhB,GAAG,CAAC,CAAC;IAEN,IAAI;QACF,MAAMC,UAAU,IAAIC,CAAAA,MAAE,KAAC,CAACJ;QACxB,IAAI,CAACG,QAAQE,QAAQ,IAAI,CAACH,iBAAiB;YACzC,OAAO;QACT;QACA,OAAOD,YACHE,QAAQE,QAAQ,GACdJ,UAAUK,GAAG,CAAC,CAACC,IAAM,GAAGA,EAAEC,WAAW,GAAG,CAAC,CAAC,EAAEC,QAAQ,CAACN,QAAQE,QAAQ,IACrE,QACF;IACN,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAGO,SAASb,UAAUkB,IAAa;QAC9BC;IAAP,OAAOA,EAAAA,aAAAA,UAAUD,0BAAVC,WAAiBC,QAAQ,KAAI;AACtC;AAEA,SAASD,UAAUX,SAAkB;IACnC,IAAI,CAACA,WAAW;QACd,OAAO;IACT;IACA,IAAI;QACF,OAAO,IAAII,CAAAA,MAAE,KAAC,CAAC,KAAKJ;IACtB,EAAE,OAAM;QACN,OAAO,IAAII,CAAAA,MAAE,KAAC,CAAC,KAAK,CAAC,OAAO,EAAEJ,WAAW;IAC3C;AACF;AAGO,SAAST,eAAeG,GAAW,EAAEmB,SAAiB;IAC3D,OAAOnB,IAAIoB,OAAO,CAAC,IAAIC,OAAO,CAAC,CAAC,EAAEF,UAAU,CAAC,CAAC,GAAG;AACnD"}
@@ -5,41 +5,41 @@ Object.defineProperty(exports, "__esModule", {
5
5
  function _export(target, all) {
6
6
  for(var name in all)Object.defineProperty(target, name, {
7
7
  enumerable: true,
8
- get: all[name]
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- assertValidBundleId: function() {
12
+ get assertValidBundleId () {
13
13
  return assertValidBundleId;
14
14
  },
15
- assertValidPackage: function() {
15
+ get assertValidPackage () {
16
16
  return assertValidPackage;
17
17
  },
18
- getBundleIdWarningAsync: function() {
18
+ get getBundleIdWarningAsync () {
19
19
  return getBundleIdWarningAsync;
20
20
  },
21
- getBundleIdWarningInternalAsync: function() {
21
+ get getBundleIdWarningInternalAsync () {
22
22
  return getBundleIdWarningInternalAsync;
23
23
  },
24
- getPackageNameWarningAsync: function() {
24
+ get getPackageNameWarningAsync () {
25
25
  return getPackageNameWarningAsync;
26
26
  },
27
- getPackageNameWarningInternalAsync: function() {
27
+ get getPackageNameWarningInternalAsync () {
28
28
  return getPackageNameWarningInternalAsync;
29
29
  },
30
- getSanitizedBundleIdentifier: function() {
30
+ get getSanitizedBundleIdentifier () {
31
31
  return getSanitizedBundleIdentifier;
32
32
  },
33
- getSanitizedPackage: function() {
33
+ get getSanitizedPackage () {
34
34
  return getSanitizedPackage;
35
35
  },
36
- validateBundleId: function() {
36
+ get validateBundleId () {
37
37
  return validateBundleId;
38
38
  },
39
- validatePackage: function() {
39
+ get validatePackage () {
40
40
  return validatePackage;
41
41
  },
42
- validatePackageWithWarning: function() {
42
+ get validatePackageWithWarning () {
43
43
  return validatePackageWithWarning;
44
44
  }
45
45
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/validateApplicationId.ts"],"sourcesContent":["import assert from 'assert';\nimport chalk from 'chalk';\n\nimport { env } from './env';\nimport { memoize } from './fn';\nimport { learnMore } from './link';\nimport { isUrlAvailableAsync } from './url';\nimport { Log } from '../log';\n\nconst debug = require('debug')('expo:utils:validateApplicationId') as typeof console.log;\n\n// TODO: Adjust to indicate that the bundle identifier must start with a letter, period, or hyphen.\nconst IOS_BUNDLE_ID_REGEX = /^[a-zA-Z0-9-.]+$/;\nconst ANDROID_PACKAGE_REGEX = /^[a-zA-Z][a-zA-Z0-9_]*(\\.[a-zA-Z][a-zA-Z0-9_]*)+$/;\n\n/** Validate an iOS bundle identifier. */\nexport function validateBundleId(value: string): boolean {\n return IOS_BUNDLE_ID_REGEX.test(value);\n}\n\n/** Validate an Android package name. */\nexport function validatePackage(value: string): boolean {\n return validatePackageWithWarning(value) === true;\n}\n\n/** Validate an Android package name and return the reason if invalid. */\nexport function validatePackageWithWarning(value: string): true | string {\n const parts = value.split('.');\n for (const segment of parts) {\n if (RESERVED_ANDROID_PACKAGE_NAME_SEGMENTS.includes(segment)) {\n return `\"${segment}\" is a reserved Java keyword.`;\n }\n }\n if (parts.length < 2) {\n return `Package name must contain more than one segment, separated by \".\", e.g. com.${value}`;\n }\n if (!ANDROID_PACKAGE_REGEX.test(value)) {\n return 'Invalid characters in Android package name. Only alphanumeric characters, \".\" and \"_\" are allowed, and each segment start with a letter.';\n }\n\n return true;\n}\n\nexport function getSanitizedPackage(value: string) {\n // It's common to use dashes in your node project name, strip them from the suggested package name.\n let output = value\n // Oracle recommends package names are \"legalized\" by converting hyphen to an underscore and removing unsupported characters\n // https://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html\n // However, life is much nicer when the bundle identifier and package name are the same and iOS has the inverse rule— converting underscores to hyphens.\n // So we'll simply remove hyphens and illegal characters for Android.\n .replace(/[^a-zA-Z0-9_.]/g, '')\n // Prevent multiple '.' in a row (e.g. no zero-length segments).\n .replace(/\\.+/g, '.')\n // Prevent '.' from the start or end.\n .replace(/^\\.|\\.$/g, '');\n\n output ||= 'app';\n\n // Prepend extra segments\n let segments = output.split('.').length;\n while (segments < 2) {\n output = `com.${output}`;\n segments += 1;\n }\n\n // Ensure each dot has a letter or number after it\n output = output\n .split('.')\n .map((segment) => {\n segment = /^[a-zA-Z]/.test(segment) ? segment : 'x' + segment;\n\n if (RESERVED_ANDROID_PACKAGE_NAME_SEGMENTS.includes(segment)) {\n segment = 'x' + segment;\n }\n return segment;\n })\n .join('.');\n\n return output;\n}\n\nexport function getSanitizedBundleIdentifier(value: string) {\n // According to the behavior observed when using the UI in Xcode.\n // Must start with a letter, period, or hyphen (not number).\n // Can only contain alphanumeric characters, periods, and hyphens.\n // Can have empty segments (e.g. com.example..app).\n return value.replace(/(^[^a-zA-Z.-]|[^a-zA-Z0-9-.])/g, '-');\n}\n\n// https://en.wikipedia.org/wiki/List_of_Java_keywords\n// Running the following in the console and pruning the \"Reserved Identifiers\" section:\n// [...document.querySelectorAll('dl > dt > code')].map(node => node.innerText)\nconst RESERVED_ANDROID_PACKAGE_NAME_SEGMENTS = [\n // List of Java keywords\n '_',\n 'abstract',\n 'assert',\n 'boolean',\n 'break',\n 'byte',\n 'case',\n 'catch',\n 'char',\n 'class',\n 'const',\n 'continue',\n 'default',\n 'do',\n 'double',\n 'else',\n 'enum',\n 'extends',\n 'final',\n 'finally',\n 'float',\n 'for',\n 'goto',\n 'if',\n 'implements',\n 'import',\n 'instanceof',\n 'int',\n 'interface',\n 'long',\n 'native',\n 'new',\n 'package',\n 'private',\n 'protected',\n 'public',\n 'return',\n 'short',\n 'static',\n 'super',\n 'switch',\n 'synchronized',\n 'this',\n 'throw',\n 'throws',\n 'transient',\n 'try',\n 'void',\n 'volatile',\n 'while',\n // Reserved words for literal values\n 'true',\n 'false',\n 'null',\n // Unused\n 'const',\n 'goto',\n 'strictfp',\n];\n\nexport function assertValidBundleId(value: string) {\n assert.match(\n value,\n IOS_BUNDLE_ID_REGEX,\n `The ios.bundleIdentifier defined in your Expo config is not formatted properly. Only alphanumeric characters, '.', '-', and '_' are allowed, and each '.' must be followed by a letter.`\n );\n}\n\nexport function assertValidPackage(value: string) {\n assert.match(\n value,\n ANDROID_PACKAGE_REGEX,\n `Invalid format of Android package name. Only alphanumeric characters, '.' and '_' are allowed, and each '.' must be followed by a letter. Reserved Java keywords are not allowed.`\n );\n}\n\n/** @private */\nexport async function getBundleIdWarningInternalAsync(bundleId: string): Promise<string | null> {\n if (env.EXPO_OFFLINE) {\n Log.warn('Skipping Apple bundle identifier reservation validation in offline-mode.');\n return null;\n }\n\n if (!(await isUrlAvailableAsync('itunes.apple.com'))) {\n debug(\n `Couldn't connect to iTunes Store to check bundle ID ${bundleId}. itunes.apple.com may be down.`\n );\n // If no network, simply skip the warnings since they'll just lead to more confusion.\n return null;\n }\n\n const url = `http://itunes.apple.com/lookup?bundleId=${bundleId}`;\n try {\n debug(`Checking iOS bundle ID '${bundleId}' at: ${url}`);\n const response = await fetch(url);\n const json: any = await response.json();\n if (json.resultCount > 0) {\n const firstApp = json.results[0];\n return formatInUseWarning(firstApp.trackName, firstApp.sellerName, bundleId);\n }\n } catch (error: any) {\n debug(`Error checking bundle ID ${bundleId}: ${error.message}`);\n // Error fetching itunes data.\n }\n return null;\n}\n\n/** Returns a warning message if an iOS bundle identifier is potentially already in use. */\nexport const getBundleIdWarningAsync = memoize(getBundleIdWarningInternalAsync);\n\n/** @private */\nexport async function getPackageNameWarningInternalAsync(\n packageName: string\n): Promise<string | null> {\n if (env.EXPO_OFFLINE) {\n Log.warn('Skipping Android package name reservation validation in offline-mode.');\n return null;\n }\n\n if (!(await isUrlAvailableAsync('play.google.com'))) {\n debug(\n `Couldn't connect to Play Store to check package name ${packageName}. play.google.com may be down.`\n );\n // If no network, simply skip the warnings since they'll just lead to more confusion.\n return null;\n }\n\n const url = `https://play.google.com/store/apps/details?id=${packageName}`;\n try {\n debug(`Checking Android package name '${packageName}' at: ${url}`);\n const response = await fetch(url);\n // If the page exists, then warn the user.\n if (response.status === 200) {\n // There is no JSON API for the Play Store so we can't concisely\n // locate the app name and developer to match the iOS warning.\n return `⚠️ The package ${chalk.bold(packageName)} is already in use. ${chalk.dim(\n learnMore(url)\n )}`;\n }\n } catch (error: any) {\n // Error fetching play store data or the page doesn't exist.\n debug(`Error checking package name ${packageName}: ${error.message}`);\n }\n return null;\n}\n\nfunction formatInUseWarning(appName: string, author: string, id: string): string {\n return `⚠️ The app ${chalk.bold(appName)} by ${chalk.italic(\n author\n )} is already using ${chalk.bold(id)}`;\n}\n\n/** Returns a warning message if an Android package name is potentially already in use. */\nexport const getPackageNameWarningAsync = memoize(getPackageNameWarningInternalAsync);\n"],"names":["assertValidBundleId","assertValidPackage","getBundleIdWarningAsync","getBundleIdWarningInternalAsync","getPackageNameWarningAsync","getPackageNameWarningInternalAsync","getSanitizedBundleIdentifier","getSanitizedPackage","validateBundleId","validatePackage","validatePackageWithWarning","debug","require","IOS_BUNDLE_ID_REGEX","ANDROID_PACKAGE_REGEX","value","test","parts","split","segment","RESERVED_ANDROID_PACKAGE_NAME_SEGMENTS","includes","length","output","replace","segments","map","join","assert","match","bundleId","env","EXPO_OFFLINE","Log","warn","isUrlAvailableAsync","url","response","fetch","json","resultCount","firstApp","results","formatInUseWarning","trackName","sellerName","error","message","memoize","packageName","status","chalk","bold","dim","learnMore","appName","author","id","italic"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utils/validateApplicationId.ts"],"sourcesContent":["import assert from 'assert';\nimport chalk from 'chalk';\n\nimport { env } from './env';\nimport { memoize } from './fn';\nimport { learnMore } from './link';\nimport { isUrlAvailableAsync } from './url';\nimport { Log } from '../log';\n\nconst debug = require('debug')('expo:utils:validateApplicationId') as typeof console.log;\n\n// TODO: Adjust to indicate that the bundle identifier must start with a letter, period, or hyphen.\nconst IOS_BUNDLE_ID_REGEX = /^[a-zA-Z0-9-.]+$/;\nconst ANDROID_PACKAGE_REGEX = /^[a-zA-Z][a-zA-Z0-9_]*(\\.[a-zA-Z][a-zA-Z0-9_]*)+$/;\n\n/** Validate an iOS bundle identifier. */\nexport function validateBundleId(value: string): boolean {\n return IOS_BUNDLE_ID_REGEX.test(value);\n}\n\n/** Validate an Android package name. */\nexport function validatePackage(value: string): boolean {\n return validatePackageWithWarning(value) === true;\n}\n\n/** Validate an Android package name and return the reason if invalid. */\nexport function validatePackageWithWarning(value: string): true | string {\n const parts = value.split('.');\n for (const segment of parts) {\n if (RESERVED_ANDROID_PACKAGE_NAME_SEGMENTS.includes(segment)) {\n return `\"${segment}\" is a reserved Java keyword.`;\n }\n }\n if (parts.length < 2) {\n return `Package name must contain more than one segment, separated by \".\", e.g. com.${value}`;\n }\n if (!ANDROID_PACKAGE_REGEX.test(value)) {\n return 'Invalid characters in Android package name. Only alphanumeric characters, \".\" and \"_\" are allowed, and each segment start with a letter.';\n }\n\n return true;\n}\n\nexport function getSanitizedPackage(value: string) {\n // It's common to use dashes in your node project name, strip them from the suggested package name.\n let output = value\n // Oracle recommends package names are \"legalized\" by converting hyphen to an underscore and removing unsupported characters\n // https://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html\n // However, life is much nicer when the bundle identifier and package name are the same and iOS has the inverse rule— converting underscores to hyphens.\n // So we'll simply remove hyphens and illegal characters for Android.\n .replace(/[^a-zA-Z0-9_.]/g, '')\n // Prevent multiple '.' in a row (e.g. no zero-length segments).\n .replace(/\\.+/g, '.')\n // Prevent '.' from the start or end.\n .replace(/^\\.|\\.$/g, '');\n\n output ||= 'app';\n\n // Prepend extra segments\n let segments = output.split('.').length;\n while (segments < 2) {\n output = `com.${output}`;\n segments += 1;\n }\n\n // Ensure each dot has a letter or number after it\n output = output\n .split('.')\n .map((segment) => {\n segment = /^[a-zA-Z]/.test(segment) ? segment : 'x' + segment;\n\n if (RESERVED_ANDROID_PACKAGE_NAME_SEGMENTS.includes(segment)) {\n segment = 'x' + segment;\n }\n return segment;\n })\n .join('.');\n\n return output;\n}\n\nexport function getSanitizedBundleIdentifier(value: string) {\n // According to the behavior observed when using the UI in Xcode.\n // Must start with a letter, period, or hyphen (not number).\n // Can only contain alphanumeric characters, periods, and hyphens.\n // Can have empty segments (e.g. com.example..app).\n return value.replace(/(^[^a-zA-Z.-]|[^a-zA-Z0-9-.])/g, '-');\n}\n\n// https://en.wikipedia.org/wiki/List_of_Java_keywords\n// Running the following in the console and pruning the \"Reserved Identifiers\" section:\n// [...document.querySelectorAll('dl > dt > code')].map(node => node.innerText)\nconst RESERVED_ANDROID_PACKAGE_NAME_SEGMENTS = [\n // List of Java keywords\n '_',\n 'abstract',\n 'assert',\n 'boolean',\n 'break',\n 'byte',\n 'case',\n 'catch',\n 'char',\n 'class',\n 'const',\n 'continue',\n 'default',\n 'do',\n 'double',\n 'else',\n 'enum',\n 'extends',\n 'final',\n 'finally',\n 'float',\n 'for',\n 'goto',\n 'if',\n 'implements',\n 'import',\n 'instanceof',\n 'int',\n 'interface',\n 'long',\n 'native',\n 'new',\n 'package',\n 'private',\n 'protected',\n 'public',\n 'return',\n 'short',\n 'static',\n 'super',\n 'switch',\n 'synchronized',\n 'this',\n 'throw',\n 'throws',\n 'transient',\n 'try',\n 'void',\n 'volatile',\n 'while',\n // Reserved words for literal values\n 'true',\n 'false',\n 'null',\n // Unused\n 'const',\n 'goto',\n 'strictfp',\n];\n\nexport function assertValidBundleId(value: string) {\n assert.match(\n value,\n IOS_BUNDLE_ID_REGEX,\n `The ios.bundleIdentifier defined in your Expo config is not formatted properly. Only alphanumeric characters, '.', '-', and '_' are allowed, and each '.' must be followed by a letter.`\n );\n}\n\nexport function assertValidPackage(value: string) {\n assert.match(\n value,\n ANDROID_PACKAGE_REGEX,\n `Invalid format of Android package name. Only alphanumeric characters, '.' and '_' are allowed, and each '.' must be followed by a letter. Reserved Java keywords are not allowed.`\n );\n}\n\n/** @private */\nexport async function getBundleIdWarningInternalAsync(bundleId: string): Promise<string | null> {\n if (env.EXPO_OFFLINE) {\n Log.warn('Skipping Apple bundle identifier reservation validation in offline-mode.');\n return null;\n }\n\n if (!(await isUrlAvailableAsync('itunes.apple.com'))) {\n debug(\n `Couldn't connect to iTunes Store to check bundle ID ${bundleId}. itunes.apple.com may be down.`\n );\n // If no network, simply skip the warnings since they'll just lead to more confusion.\n return null;\n }\n\n const url = `http://itunes.apple.com/lookup?bundleId=${bundleId}`;\n try {\n debug(`Checking iOS bundle ID '${bundleId}' at: ${url}`);\n const response = await fetch(url);\n const json: any = await response.json();\n if (json.resultCount > 0) {\n const firstApp = json.results[0];\n return formatInUseWarning(firstApp.trackName, firstApp.sellerName, bundleId);\n }\n } catch (error: any) {\n debug(`Error checking bundle ID ${bundleId}: ${error.message}`);\n // Error fetching itunes data.\n }\n return null;\n}\n\n/** Returns a warning message if an iOS bundle identifier is potentially already in use. */\nexport const getBundleIdWarningAsync = memoize(getBundleIdWarningInternalAsync);\n\n/** @private */\nexport async function getPackageNameWarningInternalAsync(\n packageName: string\n): Promise<string | null> {\n if (env.EXPO_OFFLINE) {\n Log.warn('Skipping Android package name reservation validation in offline-mode.');\n return null;\n }\n\n if (!(await isUrlAvailableAsync('play.google.com'))) {\n debug(\n `Couldn't connect to Play Store to check package name ${packageName}. play.google.com may be down.`\n );\n // If no network, simply skip the warnings since they'll just lead to more confusion.\n return null;\n }\n\n const url = `https://play.google.com/store/apps/details?id=${packageName}`;\n try {\n debug(`Checking Android package name '${packageName}' at: ${url}`);\n const response = await fetch(url);\n // If the page exists, then warn the user.\n if (response.status === 200) {\n // There is no JSON API for the Play Store so we can't concisely\n // locate the app name and developer to match the iOS warning.\n return `⚠️ The package ${chalk.bold(packageName)} is already in use. ${chalk.dim(\n learnMore(url)\n )}`;\n }\n } catch (error: any) {\n // Error fetching play store data or the page doesn't exist.\n debug(`Error checking package name ${packageName}: ${error.message}`);\n }\n return null;\n}\n\nfunction formatInUseWarning(appName: string, author: string, id: string): string {\n return `⚠️ The app ${chalk.bold(appName)} by ${chalk.italic(\n author\n )} is already using ${chalk.bold(id)}`;\n}\n\n/** Returns a warning message if an Android package name is potentially already in use. */\nexport const getPackageNameWarningAsync = memoize(getPackageNameWarningInternalAsync);\n"],"names":["assertValidBundleId","assertValidPackage","getBundleIdWarningAsync","getBundleIdWarningInternalAsync","getPackageNameWarningAsync","getPackageNameWarningInternalAsync","getSanitizedBundleIdentifier","getSanitizedPackage","validateBundleId","validatePackage","validatePackageWithWarning","debug","require","IOS_BUNDLE_ID_REGEX","ANDROID_PACKAGE_REGEX","value","test","parts","split","segment","RESERVED_ANDROID_PACKAGE_NAME_SEGMENTS","includes","length","output","replace","segments","map","join","assert","match","bundleId","env","EXPO_OFFLINE","Log","warn","isUrlAvailableAsync","url","response","fetch","json","resultCount","firstApp","results","formatInUseWarning","trackName","sellerName","error","message","memoize","packageName","status","chalk","bold","dim","learnMore","appName","author","id","italic"],"mappings":"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"}
@@ -5,17 +5,17 @@ Object.defineProperty(exports, "__esModule", {
5
5
  function _export(target, all) {
6
6
  for(var name in all)Object.defineProperty(target, name, {
7
7
  enumerable: true,
8
- get: all[name]
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- assertUnexpectedObjectKeys: function() {
12
+ get assertUnexpectedObjectKeys () {
13
13
  return assertUnexpectedObjectKeys;
14
14
  },
15
- assertUnexpectedVariadicFlags: function() {
15
+ get assertUnexpectedVariadicFlags () {
16
16
  return assertUnexpectedVariadicFlags;
17
17
  },
18
- parseVariadicArguments: function() {
18
+ get parseVariadicArguments () {
19
19
  return parseVariadicArguments;
20
20
  }
21
21
  });