@expo/cli 1.0.0-canary-20250404-3c3b5fd → 1.0.0-canary-20250701-6a945c5

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 (182) hide show
  1. package/README.md +33 -24
  2. package/build/bin/cli +1 -1
  3. package/build/metro-require/require.js +6 -4
  4. package/build/src/api/user/actions.js +25 -11
  5. package/build/src/api/user/actions.js.map +1 -1
  6. package/build/src/customize/templates.js +15 -1
  7. package/build/src/customize/templates.js.map +1 -1
  8. package/build/src/export/exportApp.js +26 -14
  9. package/build/src/export/exportApp.js.map +1 -1
  10. package/build/src/export/exportAsync.js +6 -0
  11. package/build/src/export/exportAsync.js.map +1 -1
  12. package/build/src/export/exportHermes.js +2 -2
  13. package/build/src/export/exportHermes.js.map +1 -1
  14. package/build/src/export/persistMetroAssets.js.map +1 -1
  15. package/build/src/install/checkPackages.js +22 -4
  16. package/build/src/install/checkPackages.js.map +1 -1
  17. package/build/src/install/index.js +3 -1
  18. package/build/src/install/index.js.map +1 -1
  19. package/build/src/install/resolveOptions.js +7 -2
  20. package/build/src/install/resolveOptions.js.map +1 -1
  21. package/build/src/install/utils/checkPackagesCompatibility.js +1 -1
  22. package/build/src/install/utils/checkPackagesCompatibility.js.map +1 -1
  23. package/build/src/lint/ESlintPrerequisite.js +32 -48
  24. package/build/src/lint/ESlintPrerequisite.js.map +1 -1
  25. package/build/src/lint/index.js +45 -47
  26. package/build/src/lint/index.js.map +1 -1
  27. package/build/src/lint/lintAsync.js +150 -4
  28. package/build/src/lint/lintAsync.js.map +1 -1
  29. package/build/src/lint/resolveOptions.js +115 -0
  30. package/build/src/lint/resolveOptions.js.map +1 -0
  31. package/build/src/prebuild/renameTemplateAppName.js +4 -1
  32. package/build/src/prebuild/renameTemplateAppName.js.map +1 -1
  33. package/build/src/prebuild/resolveTemplate.js +4 -4
  34. package/build/src/prebuild/resolveTemplate.js.map +1 -1
  35. package/build/src/prebuild/updatePackageJson.js +19 -9
  36. package/build/src/prebuild/updatePackageJson.js.map +1 -1
  37. package/build/src/run/android/resolveOptions.js +13 -1
  38. package/build/src/run/android/resolveOptions.js.map +1 -1
  39. package/build/src/run/android/runAndroidAsync.js +39 -17
  40. package/build/src/run/android/runAndroidAsync.js.map +1 -1
  41. package/build/src/run/ios/XcodeBuild.js +3 -3
  42. package/build/src/run/ios/XcodeBuild.js.map +1 -1
  43. package/build/src/run/ios/options/resolveOptions.js +13 -1
  44. package/build/src/run/ios/options/resolveOptions.js.map +1 -1
  45. package/build/src/run/ios/runIosAsync.js +38 -7
  46. package/build/src/run/ios/runIosAsync.js.map +1 -1
  47. package/build/src/start/doctor/SecurityBinPrerequisite.js +1 -1
  48. package/build/src/start/doctor/SecurityBinPrerequisite.js.map +1 -1
  49. package/build/src/start/doctor/apple/XcodePrerequisite.js +1 -1
  50. package/build/src/start/doctor/apple/XcodePrerequisite.js.map +1 -1
  51. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js +1 -1
  52. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js.map +1 -1
  53. package/build/src/start/doctor/dependencies/resolvePackages.js +1 -1
  54. package/build/src/start/doctor/dependencies/resolvePackages.js.map +1 -1
  55. package/build/src/start/doctor/ngrok/ExternalModule.js +1 -1
  56. package/build/src/start/doctor/ngrok/ExternalModule.js.map +1 -1
  57. package/build/src/start/index.js +1 -1
  58. package/build/src/start/index.js.map +1 -1
  59. package/build/src/start/platforms/PlatformManager.js +1 -1
  60. package/build/src/start/platforms/PlatformManager.js.map +1 -1
  61. package/build/src/start/platforms/android/AndroidPlatformManager.js +1 -1
  62. package/build/src/start/platforms/android/AndroidPlatformManager.js.map +1 -1
  63. package/build/src/start/platforms/android/getDevices.js +1 -1
  64. package/build/src/start/platforms/android/getDevices.js.map +1 -1
  65. package/build/src/start/platforms/ios/AppleDeviceManager.js +1 -1
  66. package/build/src/start/platforms/ios/AppleDeviceManager.js.map +1 -1
  67. package/build/src/start/platforms/ios/xcrun.js +1 -1
  68. package/build/src/start/platforms/ios/xcrun.js.map +1 -1
  69. package/build/src/start/project/dotExpo.js +5 -0
  70. package/build/src/start/project/dotExpo.js.map +1 -1
  71. package/build/src/start/resolveOptions.js +3 -0
  72. package/build/src/start/resolveOptions.js.map +1 -1
  73. package/build/src/start/server/metro/MetroBundlerDevServer.js +38 -26
  74. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  75. package/build/src/start/server/metro/MetroTerminalReporter.js +29 -2
  76. package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
  77. package/build/src/start/server/metro/createExpoFallbackResolver.js +6 -4
  78. package/build/src/start/server/metro/createExpoFallbackResolver.js.map +1 -1
  79. package/build/src/start/server/metro/createJResolver.js +2 -2
  80. package/build/src/start/server/metro/createJResolver.js.map +1 -1
  81. package/build/src/start/server/metro/createServerComponentsMiddleware.js +16 -5
  82. package/build/src/start/server/metro/createServerComponentsMiddleware.js.map +1 -1
  83. package/build/src/start/server/metro/debugging/createDebugMiddleware.js +19 -19
  84. package/build/src/start/server/metro/debugging/createDebugMiddleware.js.map +1 -1
  85. package/build/src/start/server/metro/externals.js +1 -1
  86. package/build/src/start/server/metro/externals.js.map +1 -1
  87. package/build/src/start/server/metro/instantiateMetro.js +13 -8
  88. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  89. package/build/src/start/server/metro/log-box/LogBoxSymbolication.js +21 -2
  90. package/build/src/start/server/metro/log-box/LogBoxSymbolication.js.map +1 -1
  91. package/build/src/start/server/metro/log-box/formatProjectFilePath.js +15 -12
  92. package/build/src/start/server/metro/log-box/formatProjectFilePath.js.map +1 -1
  93. package/build/src/start/server/metro/metroErrorInterface.js +19 -8
  94. package/build/src/start/server/metro/metroErrorInterface.js.map +1 -1
  95. package/build/src/start/server/metro/runServer-fork.js +1 -1
  96. package/build/src/start/server/metro/runServer-fork.js.map +1 -1
  97. package/build/src/start/server/metro/withMetroMultiPlatform.js +7 -12
  98. package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
  99. package/build/src/start/server/middleware/CorsMiddleware.js +1 -1
  100. package/build/src/start/server/middleware/CorsMiddleware.js.map +1 -1
  101. package/build/src/start/server/middleware/ManifestMiddleware.js +4 -8
  102. package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
  103. package/build/src/start/server/middleware/inspector/JsInspector.js +2 -25
  104. package/build/src/start/server/middleware/inspector/JsInspector.js.map +1 -1
  105. package/build/src/start/server/middleware/metroOptions.js +2 -26
  106. package/build/src/start/server/middleware/metroOptions.js.map +1 -1
  107. package/build/src/utils/build-cache-providers/helpers.js +61 -0
  108. package/build/src/utils/build-cache-providers/helpers.js.map +1 -0
  109. package/build/src/utils/build-cache-providers/index.js +283 -0
  110. package/build/src/utils/build-cache-providers/index.js.map +1 -0
  111. package/build/src/utils/codesigning.js +14 -2
  112. package/build/src/utils/codesigning.js.map +1 -1
  113. package/build/src/utils/exit.js +0 -1
  114. package/build/src/utils/exit.js.map +1 -1
  115. package/build/src/utils/ip.js +7 -104
  116. package/build/src/utils/ip.js.map +1 -1
  117. package/build/src/utils/modifyConfigAsync.js +1 -1
  118. package/build/src/utils/modifyConfigAsync.js.map +1 -1
  119. package/build/src/utils/resolveArgs.js +8 -0
  120. package/build/src/utils/resolveArgs.js.map +1 -1
  121. package/build/src/utils/scheme.js +1 -1
  122. package/build/src/utils/scheme.js.map +1 -1
  123. package/build/src/utils/telemetry/clients/FetchClient.js +2 -2
  124. package/build/src/utils/telemetry/clients/FetchClient.js.map +1 -1
  125. package/build/src/utils/telemetry/utils/context.js +1 -1
  126. package/build/src/utils/tsconfig/evaluateTsConfig.js +7 -2
  127. package/build/src/utils/tsconfig/evaluateTsConfig.js.map +1 -1
  128. package/build/src/utils/variadic.js +63 -6
  129. package/build/src/utils/variadic.js.map +1 -1
  130. package/package.json +20 -20
  131. package/static/canary/react-is/cjs/react-is.development.js +118 -185
  132. package/static/canary/react-is/cjs/react-is.production.js +2 -2
  133. package/static/canary/react-native/Libraries/Renderer/implementations/ReactFabric-dev.js +16582 -26565
  134. package/static/canary/react-native/Libraries/Renderer/implementations/ReactFabric-prod.js +3495 -3357
  135. package/static/canary/react-native/Libraries/Renderer/implementations/ReactFabric-profiling.js +3929 -3801
  136. package/static/canary/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js +16869 -27032
  137. package/static/canary/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-prod.js +3535 -3428
  138. package/static/canary/react-native/Libraries/Renderer/implementations/ReactNativeRenderer-profiling.js +4198 -4095
  139. package/static/canary/scheduler/cjs/scheduler-unstable_mock.development.js +387 -684
  140. package/static/canary/scheduler/cjs/scheduler-unstable_mock.production.js +0 -9
  141. package/static/canary/scheduler/cjs/scheduler-unstable_post_task.development.js +137 -195
  142. package/static/canary/scheduler/cjs/scheduler-unstable_post_task.production.js +0 -5
  143. package/static/canary/scheduler/cjs/scheduler.development.js +339 -600
  144. package/static/canary/scheduler/cjs/scheduler.native.development.js +324 -512
  145. package/static/canary/scheduler/cjs/scheduler.native.production.js +6 -5
  146. package/static/canary/scheduler/cjs/scheduler.production.js +16 -17
  147. package/static/canary-full/react/cjs/react-compiler-runtime.development.js +13 -68
  148. package/static/canary-full/react/cjs/react-jsx-dev-runtime.development.js +317 -1251
  149. package/static/canary-full/react/cjs/react-jsx-dev-runtime.react-server.development.js +353 -1286
  150. package/static/canary-full/react/cjs/react-jsx-runtime.development.js +326 -1279
  151. package/static/canary-full/react/cjs/react-jsx-runtime.react-server.development.js +353 -1286
  152. package/static/canary-full/react/cjs/react.development.js +1204 -2771
  153. package/static/canary-full/react/cjs/react.production.js +25 -20
  154. package/static/canary-full/react/cjs/react.react-server.development.js +783 -2162
  155. package/static/canary-full/react/cjs/react.react-server.production.js +13 -63
  156. package/static/canary-full/react/package.json +1 -1
  157. package/static/canary-full/react-dom/cjs/react-dom-client.development.js +24847 -37099
  158. package/static/canary-full/react-dom/cjs/react-dom-client.production.js +8261 -7475
  159. package/static/canary-full/react-dom/cjs/react-dom-profiling.development.js +25252 -37571
  160. package/static/canary-full/react-dom/cjs/react-dom-profiling.profiling.js +9442 -8662
  161. package/static/canary-full/react-dom/cjs/react-dom-server-legacy.browser.development.js +8944 -11568
  162. package/static/canary-full/react-dom/cjs/react-dom-server-legacy.browser.production.js +1378 -944
  163. package/static/canary-full/react-dom/cjs/react-dom-server-legacy.node.development.js +8944 -11568
  164. package/static/canary-full/react-dom/cjs/react-dom-server-legacy.node.production.js +1386 -954
  165. package/static/canary-full/react-dom/cjs/react-dom-server.browser.development.js +9344 -11600
  166. package/static/canary-full/react-dom/cjs/react-dom-server.browser.production.js +1545 -954
  167. package/static/canary-full/react-dom/cjs/react-dom-server.bun.development.js +8286 -11064
  168. package/static/canary-full/react-dom/cjs/react-dom-server.bun.production.js +1437 -976
  169. package/static/canary-full/react-dom/cjs/react-dom-server.edge.development.js +9356 -11609
  170. package/static/canary-full/react-dom/cjs/react-dom-server.edge.production.js +1542 -970
  171. package/static/canary-full/react-dom/cjs/react-dom-server.node.development.js +9227 -11571
  172. package/static/canary-full/react-dom/cjs/react-dom-server.node.production.js +1787 -1183
  173. package/static/canary-full/react-dom/cjs/react-dom-test-utils.development.js +13 -59
  174. package/static/canary-full/react-dom/cjs/react-dom.development.js +402 -604
  175. package/static/canary-full/react-dom/cjs/react-dom.production.js +4 -3
  176. package/static/canary-full/react-dom/cjs/react-dom.react-server.development.js +322 -382
  177. package/static/canary-full/react-dom/cjs/react-dom.react-server.production.js +6 -7
  178. package/static/canary-full/react-dom/package.json +5 -5
  179. package/static/canary-full/react-dom/static.browser.js +1 -0
  180. package/static/canary-full/react-dom/static.edge.js +1 -0
  181. package/static/canary-full/react-dom/static.node.js +1 -0
  182. package/static/template/eslint.config.js +10 -0
@@ -8,117 +8,20 @@ Object.defineProperty(exports, "getIpAddress", {
8
8
  return getIpAddress;
9
9
  }
10
10
  });
11
- function _internalip() {
12
- const data = /*#__PURE__*/ _interop_require_default(require("internal-ip"));
13
- _internalip = function() {
11
+ function _lannetwork() {
12
+ const data = require("lan-network");
13
+ _lannetwork = function() {
14
14
  return data;
15
15
  };
16
16
  return data;
17
17
  }
18
- function _nodechild_process() {
19
- const data = require("node:child_process");
20
- _nodechild_process = function() {
21
- return data;
22
- };
23
- return data;
24
- }
25
- function _nodenet() {
26
- const data = require("node:net");
27
- _nodenet = function() {
28
- return data;
29
- };
30
- return data;
31
- }
32
- function _nodeos() {
33
- const data = require("node:os");
34
- _nodeos = function() {
35
- return data;
36
- };
37
- return data;
38
- }
39
- function _interop_require_default(obj) {
40
- return obj && obj.__esModule ? obj : {
41
- default: obj
42
- };
43
- }
44
- /** Gets a route address by opening a UDP socket to a publicly routed address.
45
- * @privateRemarks
46
- * This is wrapped in `spawnSync` since the original `getIpAddress` utility exported
47
- * in this module is used synchronosly. An appropriate timeout has been set and UDP
48
- * ports don't send a message when opened.
49
- * @throws if `spawnSync` fails
50
- */ function getRouteAddress() {
51
- const { error, status, stdout } = (0, _nodechild_process().spawnSync)(process.execPath, [
52
- '-'
53
- ], {
54
- // This should be the cheapest method to determine the default route
55
- // By opening a socket to a publicly routed IP address, we let the default
56
- // gateway handle this socket, which means the socket's address will be
57
- // the prioritised route for public IP addresses.
58
- // It might fall back to `"0.0.0.0"` when no network connection is established
59
- input: `
60
- var socket = require('dgram').createSocket({ type: 'udp4', reuseAddr: true });
61
- socket.unref();
62
- socket.connect(53, '1.1.1.1', function() {
63
- var address = socket.address();
64
- socket.close();
65
- if (address && 'address' in address) {
66
- process.stdout.write(address.address);
67
- process.exit(0);
68
- } else {
69
- process.exit(1);
70
- }
71
- });
72
- `,
73
- shell: false,
74
- timeout: 500,
75
- encoding: 'utf8',
76
- windowsVerbatimArguments: false,
77
- windowsHide: true
78
- });
79
- // We only use the stdout as an IP, if it validates as an IP and we got a zero exit code
80
- if (status || error) {
81
- return null;
82
- } else if (!status && typeof stdout === 'string' && (0, _nodenet().isIPv4)(stdout.trim())) {
83
- return stdout.trim();
84
- } else {
85
- return null;
86
- }
87
- }
88
- /** By convention, a zero mac address means we have a virtual device, which we'd like to exclude */ const VIRTUAL_MAC_ADDRESS = '00:00:00:00:00:00';
89
- /** Determines the internal IP address by opening a socket, then checking the socket address against non-internal network interface assignments
90
- * @throws If no address can be determined.
91
- */ function getRouteIPAddress() {
92
- // We check the IP address we get against the available network interfaces
93
- // It's only an internal IP address if we have a matching address on an interface's IP assignment
94
- let routeAddress = null;
95
- try {
96
- routeAddress = getRouteAddress();
97
- } catch {}
98
- if (!routeAddress) {
99
- return null;
100
- }
101
- let ifaces;
18
+ function getIpAddress() {
102
19
  try {
103
- ifaces = (0, _nodeos().networkInterfaces)();
20
+ const lan = (0, _lannetwork().lanNetworkSync)();
21
+ return lan.address;
104
22
  } catch {
105
- // NOTE: This usually doesn't throw, but invalid builds or unknown targets in Node.js
106
- // can cause this call to unexpectedly raise a system error
107
- return null;
108
- }
109
- for(const iface in ifaces){
110
- const assignments = ifaces[iface];
111
- for(let i = 0; assignments && i < assignments.length; i++){
112
- const assignment = assignments[i];
113
- // Only use IPv4 assigments that aren't internal
114
- // Only use IPv4 assignment if it's not a virtual device (e.g. a VPN network interface)
115
- if (assignment.family === 'IPv4' && !assignment.internal && assignment.address === routeAddress && assignment.mac !== VIRTUAL_MAC_ADDRESS) return routeAddress;
116
- }
23
+ return '127.0.0.1';
117
24
  }
118
- return null;
119
- }
120
- function getIpAddress() {
121
- return _internalip().default.v4.sync() || getRouteIPAddress() || '127.0.0.1';
122
25
  }
123
26
 
124
27
  //# sourceMappingURL=ip.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/ip.ts"],"sourcesContent":["import internalIp from 'internal-ip';\nimport { spawnSync } from 'node:child_process';\nimport { isIPv4 } from 'node:net';\nimport { networkInterfaces } from 'node:os';\n\n/** Gets a route address by opening a UDP socket to a publicly routed address.\n * @privateRemarks\n * This is wrapped in `spawnSync` since the original `getIpAddress` utility exported\n * in this module is used synchronosly. An appropriate timeout has been set and UDP\n * ports don't send a message when opened.\n * @throws if `spawnSync` fails\n */\nfunction getRouteAddress(): string | null {\n const { error, status, stdout } = spawnSync(process.execPath, ['-'], {\n // This should be the cheapest method to determine the default route\n // By opening a socket to a publicly routed IP address, we let the default\n // gateway handle this socket, which means the socket's address will be\n // the prioritised route for public IP addresses.\n // It might fall back to `\"0.0.0.0\"` when no network connection is established\n input: `\n var socket = require('dgram').createSocket({ type: 'udp4', reuseAddr: true });\n socket.unref();\n socket.connect(53, '1.1.1.1', function() {\n var address = socket.address();\n socket.close();\n if (address && 'address' in address) {\n process.stdout.write(address.address);\n process.exit(0);\n } else {\n process.exit(1);\n }\n });\n `,\n shell: false,\n timeout: 500,\n encoding: 'utf8',\n windowsVerbatimArguments: false,\n windowsHide: true,\n });\n // We only use the stdout as an IP, if it validates as an IP and we got a zero exit code\n if (status || error) {\n return null;\n } else if (!status && typeof stdout === 'string' && isIPv4(stdout.trim())) {\n return stdout.trim();\n } else {\n return null;\n }\n}\n\n/** By convention, a zero mac address means we have a virtual device, which we'd like to exclude */\nconst VIRTUAL_MAC_ADDRESS = '00:00:00:00:00:00';\n\n/** Determines the internal IP address by opening a socket, then checking the socket address against non-internal network interface assignments\n * @throws If no address can be determined.\n */\nfunction getRouteIPAddress(): string | null {\n // We check the IP address we get against the available network interfaces\n // It's only an internal IP address if we have a matching address on an interface's IP assignment\n let routeAddress: string | null = null;\n try {\n routeAddress = getRouteAddress();\n } catch {}\n if (!routeAddress) {\n return null;\n }\n let ifaces: ReturnType<typeof networkInterfaces>;\n try {\n ifaces = networkInterfaces();\n } catch {\n // NOTE: This usually doesn't throw, but invalid builds or unknown targets in Node.js\n // can cause this call to unexpectedly raise a system error\n return null;\n }\n for (const iface in ifaces) {\n const assignments = ifaces[iface];\n for (let i = 0; assignments && i < assignments.length; i++) {\n const assignment = assignments[i];\n // Only use IPv4 assigments that aren't internal\n // Only use IPv4 assignment if it's not a virtual device (e.g. a VPN network interface)\n if (\n assignment.family === 'IPv4' &&\n !assignment.internal &&\n assignment.address === routeAddress &&\n assignment.mac !== VIRTUAL_MAC_ADDRESS\n )\n return routeAddress;\n }\n }\n return null;\n}\n\nexport function getIpAddress(): string {\n return internalIp.v4.sync() || getRouteIPAddress() || '127.0.0.1';\n}\n"],"names":["getIpAddress","getRouteAddress","error","status","stdout","spawnSync","process","execPath","input","shell","timeout","encoding","windowsVerbatimArguments","windowsHide","isIPv4","trim","VIRTUAL_MAC_ADDRESS","getRouteIPAddress","routeAddress","ifaces","networkInterfaces","iface","assignments","i","length","assignment","family","internal","address","mac","internalIp","v4","sync"],"mappings":";;;;+BA2FgBA;;;eAAAA;;;;gEA3FO;;;;;;;yBACG;;;;;;;yBACH;;;;;;;yBACW;;;;;;;;;;;AAElC;;;;;;CAMC,GACD,SAASC;IACP,MAAM,EAAEC,KAAK,EAAEC,MAAM,EAAEC,MAAM,EAAE,GAAGC,IAAAA,8BAAS,EAACC,QAAQC,QAAQ,EAAE;QAAC;KAAI,EAAE;QACnE,oEAAoE;QACpE,0EAA0E;QAC1E,uEAAuE;QACvE,iDAAiD;QACjD,8EAA8E;QAC9EC,OAAO,CAAC;;;;;;;;;;;;;IAaR,CAAC;QACDC,OAAO;QACPC,SAAS;QACTC,UAAU;QACVC,0BAA0B;QAC1BC,aAAa;IACf;IACA,wFAAwF;IACxF,IAAIV,UAAUD,OAAO;QACnB,OAAO;IACT,OAAO,IAAI,CAACC,UAAU,OAAOC,WAAW,YAAYU,IAAAA,iBAAM,EAACV,OAAOW,IAAI,KAAK;QACzE,OAAOX,OAAOW,IAAI;IACpB,OAAO;QACL,OAAO;IACT;AACF;AAEA,iGAAiG,GACjG,MAAMC,sBAAsB;AAE5B;;CAEC,GACD,SAASC;IACP,0EAA0E;IAC1E,iGAAiG;IACjG,IAAIC,eAA8B;IAClC,IAAI;QACFA,eAAejB;IACjB,EAAE,OAAM,CAAC;IACT,IAAI,CAACiB,cAAc;QACjB,OAAO;IACT;IACA,IAAIC;IACJ,IAAI;QACFA,SAASC,IAAAA,2BAAiB;IAC5B,EAAE,OAAM;QACN,qFAAqF;QACrF,2DAA2D;QAC3D,OAAO;IACT;IACA,IAAK,MAAMC,SAASF,OAAQ;QAC1B,MAAMG,cAAcH,MAAM,CAACE,MAAM;QACjC,IAAK,IAAIE,IAAI,GAAGD,eAAeC,IAAID,YAAYE,MAAM,EAAED,IAAK;YAC1D,MAAME,aAAaH,WAAW,CAACC,EAAE;YACjC,gDAAgD;YAChD,uFAAuF;YACvF,IACEE,WAAWC,MAAM,KAAK,UACtB,CAACD,WAAWE,QAAQ,IACpBF,WAAWG,OAAO,KAAKV,gBACvBO,WAAWI,GAAG,KAAKb,qBAEnB,OAAOE;QACX;IACF;IACA,OAAO;AACT;AAEO,SAASlB;IACd,OAAO8B,qBAAU,CAACC,EAAE,CAACC,IAAI,MAAMf,uBAAuB;AACxD"}
1
+ {"version":3,"sources":["../../../src/utils/ip.ts"],"sourcesContent":["import { lanNetworkSync } from 'lan-network';\n\nexport function getIpAddress(): string {\n try {\n const lan = lanNetworkSync();\n return lan.address;\n } catch {\n return '127.0.0.1';\n }\n}\n"],"names":["getIpAddress","lan","lanNetworkSync","address"],"mappings":";;;;+BAEgBA;;;eAAAA;;;;yBAFe;;;;;;AAExB,SAASA;IACd,IAAI;QACF,MAAMC,MAAMC,IAAAA,4BAAc;QAC1B,OAAOD,IAAIE,OAAO;IACpB,EAAE,OAAM;QACN,OAAO;IACT;AACF"}
@@ -97,7 +97,7 @@ function warnAboutConfigAndThrow(type, message, edits) {
97
97
  throw new _errors.SilentError();
98
98
  }
99
99
  function notifyAboutManualConfigEdits(edits) {
100
- _log.log(_chalk().default.cyan(`Please add the following to your Expo config`));
100
+ _log.log(_chalk().default.cyan(`Add the following to your Expo config`));
101
101
  _log.log();
102
102
  _log.log(JSON.stringify(edits, null, 2));
103
103
  _log.log();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/modifyConfigAsync.ts"],"sourcesContent":["import { ExpoConfig, modifyConfigAsync } from '@expo/config';\nimport chalk from 'chalk';\n\nimport { SilentError } from './errors';\nimport * as Log from '../log';\n\n/** Wraps `[@expo/config] modifyConfigAsync()` and adds additional logging. */\nexport async function attemptModification(\n projectRoot: string,\n edits: Partial<ExpoConfig>,\n exactEdits: Partial<ExpoConfig>\n): Promise<boolean> {\n const modification = await modifyConfigAsync(projectRoot, edits, {\n skipSDKVersionRequirement: true,\n });\n if (modification.type !== 'success') {\n warnAboutConfigAndThrow(modification.type, modification.message!, exactEdits);\n }\n return modification.type === 'success';\n}\n\nexport function warnAboutConfigAndThrow(type: string, message: string, edits: Partial<ExpoConfig>) {\n Log.log();\n if (type === 'warn') {\n // The project is using a dynamic config, give the user a helpful log and bail out.\n Log.log(chalk.yellow(message));\n }\n notifyAboutManualConfigEdits(edits);\n throw new SilentError();\n}\n\nfunction notifyAboutManualConfigEdits(edits: Partial<ExpoConfig>) {\n Log.log(chalk.cyan(`Please add the following to your Expo config`));\n Log.log();\n Log.log(JSON.stringify(edits, null, 2));\n Log.log();\n}\n"],"names":["attemptModification","warnAboutConfigAndThrow","projectRoot","edits","exactEdits","modification","modifyConfigAsync","skipSDKVersionRequirement","type","message","Log","log","chalk","yellow","notifyAboutManualConfigEdits","SilentError","cyan","JSON","stringify"],"mappings":";;;;;;;;;;;IAOsBA,mBAAmB;eAAnBA;;IAcNC,uBAAuB;eAAvBA;;;;yBArB8B;;;;;;;gEAC5B;;;;;;wBAEU;6DACP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGd,eAAeD,oBACpBE,WAAmB,EACnBC,KAA0B,EAC1BC,UAA+B;IAE/B,MAAMC,eAAe,MAAMC,IAAAA,2BAAiB,EAACJ,aAAaC,OAAO;QAC/DI,2BAA2B;IAC7B;IACA,IAAIF,aAAaG,IAAI,KAAK,WAAW;QACnCP,wBAAwBI,aAAaG,IAAI,EAAEH,aAAaI,OAAO,EAAGL;IACpE;IACA,OAAOC,aAAaG,IAAI,KAAK;AAC/B;AAEO,SAASP,wBAAwBO,IAAY,EAAEC,OAAe,EAAEN,KAA0B;IAC/FO,KAAIC,GAAG;IACP,IAAIH,SAAS,QAAQ;QACnB,mFAAmF;QACnFE,KAAIC,GAAG,CAACC,gBAAK,CAACC,MAAM,CAACJ;IACvB;IACAK,6BAA6BX;IAC7B,MAAM,IAAIY,mBAAW;AACvB;AAEA,SAASD,6BAA6BX,KAA0B;IAC9DO,KAAIC,GAAG,CAACC,gBAAK,CAACI,IAAI,CAAC,CAAC,4CAA4C,CAAC;IACjEN,KAAIC,GAAG;IACPD,KAAIC,GAAG,CAACM,KAAKC,SAAS,CAACf,OAAO,MAAM;IACpCO,KAAIC,GAAG;AACT"}
1
+ {"version":3,"sources":["../../../src/utils/modifyConfigAsync.ts"],"sourcesContent":["import { ExpoConfig, modifyConfigAsync } from '@expo/config';\nimport chalk from 'chalk';\n\nimport { SilentError } from './errors';\nimport * as Log from '../log';\n\n/** Wraps `[@expo/config] modifyConfigAsync()` and adds additional logging. */\nexport async function attemptModification(\n projectRoot: string,\n edits: Partial<ExpoConfig>,\n exactEdits: Partial<ExpoConfig>\n): Promise<boolean> {\n const modification = await modifyConfigAsync(projectRoot, edits, {\n skipSDKVersionRequirement: true,\n });\n if (modification.type !== 'success') {\n warnAboutConfigAndThrow(modification.type, modification.message!, exactEdits);\n }\n return modification.type === 'success';\n}\n\nexport function warnAboutConfigAndThrow(type: string, message: string, edits: Partial<ExpoConfig>) {\n Log.log();\n if (type === 'warn') {\n // The project is using a dynamic config, give the user a helpful log and bail out.\n Log.log(chalk.yellow(message));\n }\n notifyAboutManualConfigEdits(edits);\n throw new SilentError();\n}\n\nfunction notifyAboutManualConfigEdits(edits: Partial<ExpoConfig>) {\n Log.log(chalk.cyan(`Add the following to your Expo config`));\n Log.log();\n Log.log(JSON.stringify(edits, null, 2));\n Log.log();\n}\n"],"names":["attemptModification","warnAboutConfigAndThrow","projectRoot","edits","exactEdits","modification","modifyConfigAsync","skipSDKVersionRequirement","type","message","Log","log","chalk","yellow","notifyAboutManualConfigEdits","SilentError","cyan","JSON","stringify"],"mappings":";;;;;;;;;;;IAOsBA,mBAAmB;eAAnBA;;IAcNC,uBAAuB;eAAvBA;;;;yBArB8B;;;;;;;gEAC5B;;;;;;wBAEU;6DACP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGd,eAAeD,oBACpBE,WAAmB,EACnBC,KAA0B,EAC1BC,UAA+B;IAE/B,MAAMC,eAAe,MAAMC,IAAAA,2BAAiB,EAACJ,aAAaC,OAAO;QAC/DI,2BAA2B;IAC7B;IACA,IAAIF,aAAaG,IAAI,KAAK,WAAW;QACnCP,wBAAwBI,aAAaG,IAAI,EAAEH,aAAaI,OAAO,EAAGL;IACpE;IACA,OAAOC,aAAaG,IAAI,KAAK;AAC/B;AAEO,SAASP,wBAAwBO,IAAY,EAAEC,OAAe,EAAEN,KAA0B;IAC/FO,KAAIC,GAAG;IACP,IAAIH,SAAS,QAAQ;QACnB,mFAAmF;QACnFE,KAAIC,GAAG,CAACC,gBAAK,CAACC,MAAM,CAACJ;IACvB;IACAK,6BAA6BX;IAC7B,MAAM,IAAIY,mBAAW;AACvB;AAEA,SAASD,6BAA6BX,KAA0B;IAC9DO,KAAIC,GAAG,CAACC,gBAAK,CAACI,IAAI,CAAC,CAAC,qCAAqC,CAAC;IAC1DN,KAAIC,GAAG;IACPD,KAAIC,GAAG,CAACM,KAAKC,SAAS,CAACf,OAAO,MAAM;IACpCO,KAAIC,GAAG;AACT"}
@@ -15,6 +15,9 @@ _export(exports, {
15
15
  assertDuplicateArgs: function() {
16
16
  return assertDuplicateArgs;
17
17
  },
18
+ assertNonBooleanArg: function() {
19
+ return assertNonBooleanArg;
20
+ },
18
21
  assertUnknownArgs: function() {
19
22
  return assertUnknownArgs;
20
23
  },
@@ -157,5 +160,10 @@ function assertDuplicateArgs(args, argNameAliasTuple) {
157
160
  }
158
161
  }
159
162
  }
163
+ function assertNonBooleanArg(argName, arg) {
164
+ if (arg == null || typeof arg === 'boolean') {
165
+ throw new _errors.CommandError('BAD_ARGS', `Expected input for arg ${argName}`);
166
+ }
167
+ }
160
168
 
161
169
  //# sourceMappingURL=resolveArgs.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/resolveArgs.ts"],"sourcesContent":["import arg, { Spec } from 'arg';\n\nimport { replaceValue } from './array';\nimport { CommandError } from './errors';\n\n/** Split up arguments that are formatted like `--foo=bar` or `-f=\"bar\"` to `['--foo', 'bar']` */\nfunction splitArgs(args: string[]): string[] {\n const result: string[] = [];\n\n for (const arg of args) {\n if (arg.startsWith('-')) {\n const [key, ...props] = arg.split('=');\n result.push(key);\n if (props.length) {\n result.push(props.join('='));\n }\n } else {\n result.push(arg);\n }\n }\n\n return result;\n}\n\n/**\n * Enables the resolution of arguments that can either be a string or a boolean.\n *\n * @param args arguments that were passed to the command.\n * @param rawMap raw map of arguments that are passed to the command.\n * @param extraArgs extra arguments and aliases that should be resolved as string or boolean.\n * @returns parsed arguments and project root.\n */\nexport async function resolveStringOrBooleanArgsAsync(\n args: string[],\n rawMap: arg.Spec,\n extraArgs: arg.Spec\n) {\n args = splitArgs(args);\n\n // Assert any missing arguments\n assertUnknownArgs(\n {\n ...rawMap,\n ...extraArgs,\n },\n args\n );\n\n // Collapse aliases into fully qualified arguments.\n args = collapseAliases(extraArgs, args);\n\n // Resolve all of the string or boolean arguments and the project root.\n return _resolveStringOrBooleanArgs({ ...rawMap, ...extraArgs }, args);\n}\n\n/**\n * Enables the resolution of boolean arguments that can be formatted like `--foo=true` or `--foo false`\n *\n * @param args arguments that were passed to the command.\n * @param rawMap raw map of arguments that are passed to the command.\n * @param extraArgs extra arguments and aliases that should be resolved as string or boolean.\n * @returns parsed arguments and project root.\n */\nexport async function resolveCustomBooleanArgsAsync(\n args: string[],\n rawMap: arg.Spec,\n extraArgs: arg.Spec\n) {\n const results = await resolveStringOrBooleanArgsAsync(args, rawMap, extraArgs);\n\n return {\n ...results,\n args: Object.fromEntries(\n Object.entries(results.args).map(([key, value]) => {\n if (extraArgs[key]) {\n if (typeof value === 'string') {\n if (!['true', 'false'].includes(value)) {\n throw new CommandError(\n 'BAD_ARGS',\n `Invalid boolean argument: ${key}=${value}. Expected one of: true, false`\n );\n }\n return [key, value === 'true'];\n }\n }\n return [key, value];\n })\n ),\n };\n}\n\nexport function _resolveStringOrBooleanArgs(arg: Spec, args: string[]) {\n // Default project root, if a custom one is defined then it will overwrite this.\n let projectRoot: string = '.';\n // The resolved arguments.\n const settings: Record<string, string | boolean | undefined> = {};\n\n // Create a list of possible arguments, this will filter out aliases.\n const possibleArgs = Object.entries(arg)\n .filter(([, value]) => typeof value !== 'string')\n .map(([key]) => key);\n\n // Loop over arguments in reverse order so we can resolve if a value belongs to a flag.\n for (let i = args.length - 1; i > -1; i--) {\n const value = args[i];\n // At this point we should have converted all aliases to fully qualified arguments.\n if (value.startsWith('--')) {\n // If we ever find an argument then it must be a boolean because we are checking in reverse\n // and removing arguments from the array if we find a string.\n // We don't override arguments that are already set\n if (!(value in settings)) {\n settings[value] = true;\n }\n } else {\n // Get the previous argument in the array.\n const nextValue = i > 0 ? args[i - 1] : null;\n if (nextValue && possibleArgs.includes(nextValue)) {\n // We don't override arguments that are already set\n if (!(nextValue in settings)) {\n settings[nextValue] = value;\n }\n i--;\n } else if (\n // If the last value is not a flag and it doesn't have a recognized flag before it (instead having a string value or nothing)\n // then it must be the project root.\n i ===\n args.length - 1\n ) {\n projectRoot = value;\n } else {\n // This will asserts if two strings are passed in a row and not at the end of the line.\n throw new CommandError('BAD_ARGS', `Unknown argument: ${value}`);\n }\n }\n }\n\n return {\n args: settings,\n projectRoot,\n };\n}\n\n/** Convert all aliases to fully qualified flag names. */\nexport function collapseAliases(arg: Spec, args: string[]): string[] {\n const aliasMap = getAliasTuples(arg);\n\n for (const [arg, alias] of aliasMap) {\n args = replaceValue(args, arg, alias);\n }\n\n // Assert if there are duplicate flags after we collapse the aliases.\n assertDuplicateArgs(args, aliasMap);\n return args;\n}\n\n/** Assert that the spec has unknown arguments. */\nexport function assertUnknownArgs(arg: Spec, args: string[]) {\n const allowedArgs = Object.keys(arg);\n const unknownArgs = args.filter((arg) => !allowedArgs.includes(arg) && arg.startsWith('-'));\n if (unknownArgs.length > 0) {\n throw new CommandError(`Unknown arguments: ${unknownArgs.join(', ')}`);\n }\n}\n\nfunction getAliasTuples(arg: Spec): [string, string][] {\n return Object.entries(arg).filter(([, value]) => typeof value === 'string') as [string, string][];\n}\n\n/** Asserts that a duplicate flag has been used, this naively throws without knowing if an alias or flag were used as the duplicate. */\nexport function assertDuplicateArgs(args: string[], argNameAliasTuple: [string, string][]) {\n for (const [argName, argNameAlias] of argNameAliasTuple) {\n if (args.filter((a) => [argName, argNameAlias].includes(a)).length > 1) {\n throw new CommandError(\n 'BAD_ARGS',\n `Can only provide one instance of ${argName} or ${argNameAlias}`\n );\n }\n }\n}\n"],"names":["_resolveStringOrBooleanArgs","assertDuplicateArgs","assertUnknownArgs","collapseAliases","resolveCustomBooleanArgsAsync","resolveStringOrBooleanArgsAsync","splitArgs","args","result","arg","startsWith","key","props","split","push","length","join","rawMap","extraArgs","results","Object","fromEntries","entries","map","value","includes","CommandError","projectRoot","settings","possibleArgs","filter","i","nextValue","aliasMap","getAliasTuples","alias","replaceValue","allowedArgs","keys","unknownArgs","argNameAliasTuple","argName","argNameAlias","a"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utils/resolveArgs.ts"],"sourcesContent":["import arg, { Spec } from 'arg';\n\nimport { replaceValue } from './array';\nimport { CommandError } from './errors';\n\n/** Split up arguments that are formatted like `--foo=bar` or `-f=\"bar\"` to `['--foo', 'bar']` */\nfunction splitArgs(args: string[]): string[] {\n const result: string[] = [];\n\n for (const arg of args) {\n if (arg.startsWith('-')) {\n const [key, ...props] = arg.split('=');\n result.push(key);\n if (props.length) {\n result.push(props.join('='));\n }\n } else {\n result.push(arg);\n }\n }\n\n return result;\n}\n\n/**\n * Enables the resolution of arguments that can either be a string or a boolean.\n *\n * @param args arguments that were passed to the command.\n * @param rawMap raw map of arguments that are passed to the command.\n * @param extraArgs extra arguments and aliases that should be resolved as string or boolean.\n * @returns parsed arguments and project root.\n */\nexport async function resolveStringOrBooleanArgsAsync(\n args: string[],\n rawMap: arg.Spec,\n extraArgs: arg.Spec\n) {\n args = splitArgs(args);\n\n // Assert any missing arguments\n assertUnknownArgs(\n {\n ...rawMap,\n ...extraArgs,\n },\n args\n );\n\n // Collapse aliases into fully qualified arguments.\n args = collapseAliases(extraArgs, args);\n\n // Resolve all of the string or boolean arguments and the project root.\n return _resolveStringOrBooleanArgs({ ...rawMap, ...extraArgs }, args);\n}\n\n/**\n * Enables the resolution of boolean arguments that can be formatted like `--foo=true` or `--foo false`\n *\n * @param args arguments that were passed to the command.\n * @param rawMap raw map of arguments that are passed to the command.\n * @param extraArgs extra arguments and aliases that should be resolved as string or boolean.\n * @returns parsed arguments and project root.\n */\nexport async function resolveCustomBooleanArgsAsync(\n args: string[],\n rawMap: arg.Spec,\n extraArgs: arg.Spec\n) {\n const results = await resolveStringOrBooleanArgsAsync(args, rawMap, extraArgs);\n\n return {\n ...results,\n args: Object.fromEntries(\n Object.entries(results.args).map(([key, value]) => {\n if (extraArgs[key]) {\n if (typeof value === 'string') {\n if (!['true', 'false'].includes(value)) {\n throw new CommandError(\n 'BAD_ARGS',\n `Invalid boolean argument: ${key}=${value}. Expected one of: true, false`\n );\n }\n return [key, value === 'true'];\n }\n }\n return [key, value];\n })\n ),\n };\n}\n\nexport function _resolveStringOrBooleanArgs(arg: Spec, args: string[]) {\n // Default project root, if a custom one is defined then it will overwrite this.\n let projectRoot: string = '.';\n // The resolved arguments.\n const settings: Record<string, string | boolean | undefined> = {};\n\n // Create a list of possible arguments, this will filter out aliases.\n const possibleArgs = Object.entries(arg)\n .filter(([, value]) => typeof value !== 'string')\n .map(([key]) => key);\n\n // Loop over arguments in reverse order so we can resolve if a value belongs to a flag.\n for (let i = args.length - 1; i > -1; i--) {\n const value = args[i];\n // At this point we should have converted all aliases to fully qualified arguments.\n if (value.startsWith('--')) {\n // If we ever find an argument then it must be a boolean because we are checking in reverse\n // and removing arguments from the array if we find a string.\n // We don't override arguments that are already set\n if (!(value in settings)) {\n settings[value] = true;\n }\n } else {\n // Get the previous argument in the array.\n const nextValue = i > 0 ? args[i - 1] : null;\n if (nextValue && possibleArgs.includes(nextValue)) {\n // We don't override arguments that are already set\n if (!(nextValue in settings)) {\n settings[nextValue] = value;\n }\n i--;\n } else if (\n // If the last value is not a flag and it doesn't have a recognized flag before it (instead having a string value or nothing)\n // then it must be the project root.\n i ===\n args.length - 1\n ) {\n projectRoot = value;\n } else {\n // This will asserts if two strings are passed in a row and not at the end of the line.\n throw new CommandError('BAD_ARGS', `Unknown argument: ${value}`);\n }\n }\n }\n\n return {\n args: settings,\n projectRoot,\n };\n}\n\n/** Convert all aliases to fully qualified flag names. */\nexport function collapseAliases(arg: Spec, args: string[]): string[] {\n const aliasMap = getAliasTuples(arg);\n\n for (const [arg, alias] of aliasMap) {\n args = replaceValue(args, arg, alias);\n }\n\n // Assert if there are duplicate flags after we collapse the aliases.\n assertDuplicateArgs(args, aliasMap);\n return args;\n}\n\n/** Assert that the spec has unknown arguments. */\nexport function assertUnknownArgs(arg: Spec, args: string[]) {\n const allowedArgs = Object.keys(arg);\n const unknownArgs = args.filter((arg) => !allowedArgs.includes(arg) && arg.startsWith('-'));\n if (unknownArgs.length > 0) {\n throw new CommandError(`Unknown arguments: ${unknownArgs.join(', ')}`);\n }\n}\n\nfunction getAliasTuples(arg: Spec): [string, string][] {\n return Object.entries(arg).filter(([, value]) => typeof value === 'string') as [string, string][];\n}\n\n/** Asserts that a duplicate flag has been used, this naively throws without knowing if an alias or flag were used as the duplicate. */\nexport function assertDuplicateArgs(args: string[], argNameAliasTuple: [string, string][]) {\n for (const [argName, argNameAlias] of argNameAliasTuple) {\n if (args.filter((a) => [argName, argNameAlias].includes(a)).length > 1) {\n throw new CommandError(\n 'BAD_ARGS',\n `Can only provide one instance of ${argName} or ${argNameAlias}`\n );\n }\n }\n}\n\nexport function assertNonBooleanArg(argName: string, arg: any): asserts arg is string | string[] {\n if (arg == null || typeof arg === 'boolean') {\n throw new CommandError('BAD_ARGS', `Expected input for arg ${argName}`);\n }\n}\n"],"names":["_resolveStringOrBooleanArgs","assertDuplicateArgs","assertNonBooleanArg","assertUnknownArgs","collapseAliases","resolveCustomBooleanArgsAsync","resolveStringOrBooleanArgsAsync","splitArgs","args","result","arg","startsWith","key","props","split","push","length","join","rawMap","extraArgs","results","Object","fromEntries","entries","map","value","includes","CommandError","projectRoot","settings","possibleArgs","filter","i","nextValue","aliasMap","getAliasTuples","alias","replaceValue","allowedArgs","keys","unknownArgs","argNameAliasTuple","argName","argNameAlias","a"],"mappings":";;;;;;;;;;;IA2FgBA,2BAA2B;eAA3BA;;IA8EAC,mBAAmB;eAAnBA;;IAWAC,mBAAmB;eAAnBA;;IAxBAC,iBAAiB;eAAjBA;;IAbAC,eAAe;eAAfA;;IAhFMC,6BAA6B;eAA7BA;;IA/BAC,+BAA+B;eAA/BA;;;uBA9BO;wBACA;AAE7B,+FAA+F,GAC/F,SAASC,UAAUC,IAAc;IAC/B,MAAMC,SAAmB,EAAE;IAE3B,KAAK,MAAMC,OAAOF,KAAM;QACtB,IAAIE,IAAIC,UAAU,CAAC,MAAM;YACvB,MAAM,CAACC,KAAK,GAAGC,MAAM,GAAGH,IAAII,KAAK,CAAC;YAClCL,OAAOM,IAAI,CAACH;YACZ,IAAIC,MAAMG,MAAM,EAAE;gBAChBP,OAAOM,IAAI,CAACF,MAAMI,IAAI,CAAC;YACzB;QACF,OAAO;YACLR,OAAOM,IAAI,CAACL;QACd;IACF;IAEA,OAAOD;AACT;AAUO,eAAeH,gCACpBE,IAAc,EACdU,MAAgB,EAChBC,SAAmB;IAEnBX,OAAOD,UAAUC;IAEjB,+BAA+B;IAC/BL,kBACE;QACE,GAAGe,MAAM;QACT,GAAGC,SAAS;IACd,GACAX;IAGF,mDAAmD;IACnDA,OAAOJ,gBAAgBe,WAAWX;IAElC,uEAAuE;IACvE,OAAOR,4BAA4B;QAAE,GAAGkB,MAAM;QAAE,GAAGC,SAAS;IAAC,GAAGX;AAClE;AAUO,eAAeH,8BACpBG,IAAc,EACdU,MAAgB,EAChBC,SAAmB;IAEnB,MAAMC,UAAU,MAAMd,gCAAgCE,MAAMU,QAAQC;IAEpE,OAAO;QACL,GAAGC,OAAO;QACVZ,MAAMa,OAAOC,WAAW,CACtBD,OAAOE,OAAO,CAACH,QAAQZ,IAAI,EAAEgB,GAAG,CAAC,CAAC,CAACZ,KAAKa,MAAM;YAC5C,IAAIN,SAAS,CAACP,IAAI,EAAE;gBAClB,IAAI,OAAOa,UAAU,UAAU;oBAC7B,IAAI,CAAC;wBAAC;wBAAQ;qBAAQ,CAACC,QAAQ,CAACD,QAAQ;wBACtC,MAAM,IAAIE,oBAAY,CACpB,YACA,CAAC,0BAA0B,EAAEf,IAAI,CAAC,EAAEa,MAAM,8BAA8B,CAAC;oBAE7E;oBACA,OAAO;wBAACb;wBAAKa,UAAU;qBAAO;gBAChC;YACF;YACA,OAAO;gBAACb;gBAAKa;aAAM;QACrB;IAEJ;AACF;AAEO,SAASzB,4BAA4BU,GAAS,EAAEF,IAAc;IACnE,gFAAgF;IAChF,IAAIoB,cAAsB;IAC1B,0BAA0B;IAC1B,MAAMC,WAAyD,CAAC;IAEhE,qEAAqE;IACrE,MAAMC,eAAeT,OAAOE,OAAO,CAACb,KACjCqB,MAAM,CAAC,CAAC,GAAGN,MAAM,GAAK,OAAOA,UAAU,UACvCD,GAAG,CAAC,CAAC,CAACZ,IAAI,GAAKA;IAElB,uFAAuF;IACvF,IAAK,IAAIoB,IAAIxB,KAAKQ,MAAM,GAAG,GAAGgB,IAAI,CAAC,GAAGA,IAAK;QACzC,MAAMP,QAAQjB,IAAI,CAACwB,EAAE;QACrB,mFAAmF;QACnF,IAAIP,MAAMd,UAAU,CAAC,OAAO;YAC1B,2FAA2F;YAC3F,6DAA6D;YAC7D,mDAAmD;YACnD,IAAI,CAAEc,CAAAA,SAASI,QAAO,GAAI;gBACxBA,QAAQ,CAACJ,MAAM,GAAG;YACpB;QACF,OAAO;YACL,0CAA0C;YAC1C,MAAMQ,YAAYD,IAAI,IAAIxB,IAAI,CAACwB,IAAI,EAAE,GAAG;YACxC,IAAIC,aAAaH,aAAaJ,QAAQ,CAACO,YAAY;gBACjD,mDAAmD;gBACnD,IAAI,CAAEA,CAAAA,aAAaJ,QAAO,GAAI;oBAC5BA,QAAQ,CAACI,UAAU,GAAGR;gBACxB;gBACAO;YACF,OAAO,IACL,6HAA6H;YAC7H,oCAAoC;YACpCA,MACAxB,KAAKQ,MAAM,GAAG,GACd;gBACAY,cAAcH;YAChB,OAAO;gBACL,uFAAuF;gBACvF,MAAM,IAAIE,oBAAY,CAAC,YAAY,CAAC,kBAAkB,EAAEF,OAAO;YACjE;QACF;IACF;IAEA,OAAO;QACLjB,MAAMqB;QACND;IACF;AACF;AAGO,SAASxB,gBAAgBM,GAAS,EAAEF,IAAc;IACvD,MAAM0B,WAAWC,eAAezB;IAEhC,KAAK,MAAM,CAACA,KAAK0B,MAAM,IAAIF,SAAU;QACnC1B,OAAO6B,IAAAA,mBAAY,EAAC7B,MAAME,KAAK0B;IACjC;IAEA,qEAAqE;IACrEnC,oBAAoBO,MAAM0B;IAC1B,OAAO1B;AACT;AAGO,SAASL,kBAAkBO,GAAS,EAAEF,IAAc;IACzD,MAAM8B,cAAcjB,OAAOkB,IAAI,CAAC7B;IAChC,MAAM8B,cAAchC,KAAKuB,MAAM,CAAC,CAACrB,MAAQ,CAAC4B,YAAYZ,QAAQ,CAAChB,QAAQA,IAAIC,UAAU,CAAC;IACtF,IAAI6B,YAAYxB,MAAM,GAAG,GAAG;QAC1B,MAAM,IAAIW,oBAAY,CAAC,CAAC,mBAAmB,EAAEa,YAAYvB,IAAI,CAAC,OAAO;IACvE;AACF;AAEA,SAASkB,eAAezB,GAAS;IAC/B,OAAOW,OAAOE,OAAO,CAACb,KAAKqB,MAAM,CAAC,CAAC,GAAGN,MAAM,GAAK,OAAOA,UAAU;AACpE;AAGO,SAASxB,oBAAoBO,IAAc,EAAEiC,iBAAqC;IACvF,KAAK,MAAM,CAACC,SAASC,aAAa,IAAIF,kBAAmB;QACvD,IAAIjC,KAAKuB,MAAM,CAAC,CAACa,IAAM;gBAACF;gBAASC;aAAa,CAACjB,QAAQ,CAACkB,IAAI5B,MAAM,GAAG,GAAG;YACtE,MAAM,IAAIW,oBAAY,CACpB,YACA,CAAC,iCAAiC,EAAEe,QAAQ,IAAI,EAAEC,cAAc;QAEpE;IACF;AACF;AAEO,SAASzC,oBAAoBwC,OAAe,EAAEhC,GAAQ;IAC3D,IAAIA,OAAO,QAAQ,OAAOA,QAAQ,WAAW;QAC3C,MAAM,IAAIiB,oBAAY,CAAC,YAAY,CAAC,uBAAuB,EAAEe,SAAS;IACxE;AACF"}
@@ -170,7 +170,7 @@ async function getManagedDevClientSchemeAsync(projectRoot) {
170
170
  const scheme = getDefaultScheme(exp);
171
171
  return scheme;
172
172
  } catch {
173
- _log.warn('\nDevelopment build: Unable to get the default URI scheme for the project. Please make sure the expo-dev-client package is installed.');
173
+ _log.warn('\nDevelopment build: Unable to determine the default URI scheme for deep linking into the app. Ensure that the expo-dev-client package is installed.');
174
174
  return null;
175
175
  }
176
176
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/scheme.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport { AndroidConfig, IOSConfig } from '@expo/config-plugins';\nimport { getInfoPlistPathFromPbxproj } from '@expo/config-plugins/build/ios/utils/getInfoPlistPath';\nimport plist from '@expo/plist';\nimport fs from 'fs';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { intersecting } from './array';\nimport * as Log from '../log';\nimport {\n hasRequiredAndroidFilesAsync,\n hasRequiredIOSFilesAsync,\n} from '../prebuild/clearNativeFolder';\n\nconst debug = require('debug')('expo:utils:scheme') as typeof console.log;\n\n// sort longest to ensure uniqueness.\n// this might be undesirable as it causes the QR code to be longer.\nfunction sortLongest(obj: string[]): string[] {\n return obj.sort((a, b) => b.length - a.length);\n}\n\n/**\n * Resolve the scheme for the dev client using two methods:\n * - filter on known Expo schemes, starting with `exp+`, avoiding 3rd party schemes.\n * - filter on longest to ensure uniqueness.\n */\nfunction resolveExpoOrLongestScheme(schemes: string[]): string[] {\n const expoOnlySchemes = schemes.filter((scheme) => scheme.startsWith('exp+'));\n return expoOnlySchemes.length > 0 ? sortLongest(expoOnlySchemes) : sortLongest(schemes);\n}\n\n// TODO: Revisit and test after run code is merged.\nexport async function getSchemesForIosAsync(projectRoot: string): Promise<string[]> {\n try {\n const infoPlistBuildProperty = getInfoPlistPathFromPbxproj(projectRoot);\n debug(`ios application Info.plist path:`, infoPlistBuildProperty);\n if (infoPlistBuildProperty) {\n const configPath = path.join(projectRoot, 'ios', infoPlistBuildProperty);\n const rawPlist = fs.readFileSync(configPath, 'utf8');\n const plistObject = plist.parse(rawPlist);\n const schemes = IOSConfig.Scheme.getSchemesFromPlist(plistObject);\n debug(`ios application schemes:`, schemes);\n return resolveExpoOrLongestScheme(schemes);\n }\n } catch (error) {\n debug(`expected error collecting ios application schemes for the main target:`, error);\n }\n // No ios folder or some other error\n return [];\n}\n\n// TODO: Revisit and test after run code is merged.\nexport async function getSchemesForAndroidAsync(projectRoot: string): Promise<string[]> {\n try {\n const configPath = await AndroidConfig.Paths.getAndroidManifestAsync(projectRoot);\n const manifest = await AndroidConfig.Manifest.readAndroidManifestAsync(configPath);\n const schemes = await AndroidConfig.Scheme.getSchemesFromManifest(manifest);\n debug(`android application schemes:`, schemes);\n return resolveExpoOrLongestScheme(schemes);\n } catch (error) {\n debug(`expected error collecting android application schemes for the main activity:`, error);\n // No android folder or some other error\n return [];\n }\n}\n\n// TODO: Revisit and test after run code is merged.\nasync function getManagedDevClientSchemeAsync(projectRoot: string): Promise<string | null> {\n const { exp } = getConfig(projectRoot);\n try {\n const getDefaultScheme = require(resolveFrom(projectRoot, 'expo-dev-client/getDefaultScheme'));\n const scheme = getDefaultScheme(exp);\n return scheme;\n } catch {\n Log.warn(\n '\\nDevelopment build: Unable to get the default URI scheme for the project. Please make sure the expo-dev-client package is installed.'\n );\n return null;\n }\n}\n\n// TODO: Revisit and test after run code is merged.\nexport async function getOptionalDevClientSchemeAsync(\n projectRoot: string\n): Promise<{ scheme: string | null; resolution: 'config' | 'shared' | 'android' | 'ios' }> {\n const [hasIos, hasAndroid] = await Promise.all([\n hasRequiredIOSFilesAsync(projectRoot),\n hasRequiredAndroidFilesAsync(projectRoot),\n ]);\n\n const [ios, android] = await Promise.all([\n getSchemesForIosAsync(projectRoot),\n getSchemesForAndroidAsync(projectRoot),\n ]);\n\n // Allow managed projects\n if (!hasIos && !hasAndroid) {\n return { scheme: await getManagedDevClientSchemeAsync(projectRoot), resolution: 'config' };\n }\n\n // Allow for only one native project to exist.\n if (!hasIos) {\n return { scheme: android[0], resolution: 'android' };\n } else if (!hasAndroid) {\n return { scheme: ios[0], resolution: 'ios' };\n } else {\n return { scheme: intersecting(ios, android)[0], resolution: 'shared' };\n }\n}\n"],"names":["getOptionalDevClientSchemeAsync","getSchemesForAndroidAsync","getSchemesForIosAsync","debug","require","sortLongest","obj","sort","a","b","length","resolveExpoOrLongestScheme","schemes","expoOnlySchemes","filter","scheme","startsWith","projectRoot","infoPlistBuildProperty","getInfoPlistPathFromPbxproj","configPath","path","join","rawPlist","fs","readFileSync","plistObject","plist","parse","IOSConfig","Scheme","getSchemesFromPlist","error","AndroidConfig","Paths","getAndroidManifestAsync","manifest","Manifest","readAndroidManifestAsync","getSchemesFromManifest","getManagedDevClientSchemeAsync","exp","getConfig","getDefaultScheme","resolveFrom","Log","warn","hasIos","hasAndroid","Promise","all","hasRequiredIOSFilesAsync","hasRequiredAndroidFilesAsync","ios","android","resolution","intersecting"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utils/scheme.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport { AndroidConfig, IOSConfig } from '@expo/config-plugins';\nimport { getInfoPlistPathFromPbxproj } from '@expo/config-plugins/build/ios/utils/getInfoPlistPath';\nimport plist from '@expo/plist';\nimport fs from 'fs';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { intersecting } from './array';\nimport * as Log from '../log';\nimport {\n hasRequiredAndroidFilesAsync,\n hasRequiredIOSFilesAsync,\n} from '../prebuild/clearNativeFolder';\n\nconst debug = require('debug')('expo:utils:scheme') as typeof console.log;\n\n// sort longest to ensure uniqueness.\n// this might be undesirable as it causes the QR code to be longer.\nfunction sortLongest(obj: string[]): string[] {\n return obj.sort((a, b) => b.length - a.length);\n}\n\n/**\n * Resolve the scheme for the dev client using two methods:\n * - filter on known Expo schemes, starting with `exp+`, avoiding 3rd party schemes.\n * - filter on longest to ensure uniqueness.\n */\nfunction resolveExpoOrLongestScheme(schemes: string[]): string[] {\n const expoOnlySchemes = schemes.filter((scheme) => scheme.startsWith('exp+'));\n return expoOnlySchemes.length > 0 ? sortLongest(expoOnlySchemes) : sortLongest(schemes);\n}\n\n// TODO: Revisit and test after run code is merged.\nexport async function getSchemesForIosAsync(projectRoot: string): Promise<string[]> {\n try {\n const infoPlistBuildProperty = getInfoPlistPathFromPbxproj(projectRoot);\n debug(`ios application Info.plist path:`, infoPlistBuildProperty);\n if (infoPlistBuildProperty) {\n const configPath = path.join(projectRoot, 'ios', infoPlistBuildProperty);\n const rawPlist = fs.readFileSync(configPath, 'utf8');\n const plistObject = plist.parse(rawPlist);\n const schemes = IOSConfig.Scheme.getSchemesFromPlist(plistObject);\n debug(`ios application schemes:`, schemes);\n return resolveExpoOrLongestScheme(schemes);\n }\n } catch (error) {\n debug(`expected error collecting ios application schemes for the main target:`, error);\n }\n // No ios folder or some other error\n return [];\n}\n\n// TODO: Revisit and test after run code is merged.\nexport async function getSchemesForAndroidAsync(projectRoot: string): Promise<string[]> {\n try {\n const configPath = await AndroidConfig.Paths.getAndroidManifestAsync(projectRoot);\n const manifest = await AndroidConfig.Manifest.readAndroidManifestAsync(configPath);\n const schemes = await AndroidConfig.Scheme.getSchemesFromManifest(manifest);\n debug(`android application schemes:`, schemes);\n return resolveExpoOrLongestScheme(schemes);\n } catch (error) {\n debug(`expected error collecting android application schemes for the main activity:`, error);\n // No android folder or some other error\n return [];\n }\n}\n\n// TODO: Revisit and test after run code is merged.\nasync function getManagedDevClientSchemeAsync(projectRoot: string): Promise<string | null> {\n const { exp } = getConfig(projectRoot);\n try {\n const getDefaultScheme = require(resolveFrom(projectRoot, 'expo-dev-client/getDefaultScheme'));\n const scheme = getDefaultScheme(exp);\n return scheme;\n } catch {\n Log.warn(\n '\\nDevelopment build: Unable to determine the default URI scheme for deep linking into the app. Ensure that the expo-dev-client package is installed.'\n );\n return null;\n }\n}\n\n// TODO: Revisit and test after run code is merged.\nexport async function getOptionalDevClientSchemeAsync(\n projectRoot: string\n): Promise<{ scheme: string | null; resolution: 'config' | 'shared' | 'android' | 'ios' }> {\n const [hasIos, hasAndroid] = await Promise.all([\n hasRequiredIOSFilesAsync(projectRoot),\n hasRequiredAndroidFilesAsync(projectRoot),\n ]);\n\n const [ios, android] = await Promise.all([\n getSchemesForIosAsync(projectRoot),\n getSchemesForAndroidAsync(projectRoot),\n ]);\n\n // Allow managed projects\n if (!hasIos && !hasAndroid) {\n return { scheme: await getManagedDevClientSchemeAsync(projectRoot), resolution: 'config' };\n }\n\n // Allow for only one native project to exist.\n if (!hasIos) {\n return { scheme: android[0], resolution: 'android' };\n } else if (!hasAndroid) {\n return { scheme: ios[0], resolution: 'ios' };\n } else {\n return { scheme: intersecting(ios, android)[0], resolution: 'shared' };\n }\n}\n"],"names":["getOptionalDevClientSchemeAsync","getSchemesForAndroidAsync","getSchemesForIosAsync","debug","require","sortLongest","obj","sort","a","b","length","resolveExpoOrLongestScheme","schemes","expoOnlySchemes","filter","scheme","startsWith","projectRoot","infoPlistBuildProperty","getInfoPlistPathFromPbxproj","configPath","path","join","rawPlist","fs","readFileSync","plistObject","plist","parse","IOSConfig","Scheme","getSchemesFromPlist","error","AndroidConfig","Paths","getAndroidManifestAsync","manifest","Manifest","readAndroidManifestAsync","getSchemesFromManifest","getManagedDevClientSchemeAsync","exp","getConfig","getDefaultScheme","resolveFrom","Log","warn","hasIos","hasAndroid","Promise","all","hasRequiredIOSFilesAsync","hasRequiredAndroidFilesAsync","ios","android","resolution","intersecting"],"mappings":"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"}
@@ -22,7 +22,7 @@ function _undici() {
22
22
  };
23
23
  return data;
24
24
  }
25
- const _fetch = require("../../../utils/fetch");
25
+ const _fetch = require("../../fetch");
26
26
  const _constants = require("../utils/constants");
27
27
  class FetchClient {
28
28
  constructor({ fetch = createTelemetryFetch(), url = _constants.TELEMETRY_ENDPOINT, target = _constants.TELEMETRY_TARGET } = {}){
@@ -33,7 +33,7 @@ class FetchClient {
33
33
  this.headers = {
34
34
  accept: 'application/json',
35
35
  'content-type': 'application/json',
36
- 'user-agent': `expo-cli/${"1.0.0-canary-20250404-3c3b5fd"}`,
36
+ 'user-agent': `expo-cli/${"1.0.0-canary-20250701-6a945c5"}`,
37
37
  authorization: 'Basic ' + _nodebuffer().Buffer.from(`${target}:`).toString('base64')
38
38
  };
39
39
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/utils/telemetry/clients/FetchClient.ts"],"sourcesContent":["import { Buffer } from 'node:buffer';\nimport { URL } from 'node:url';\nimport { Agent, RetryAgent, type RequestInfo, type RequestInit } from 'undici';\n\nimport { fetch } from '../../../utils/fetch';\nimport { TelemetryClient, TelemetryClientStrategy, TelemetryRecordInternal } from '../types';\nimport { TELEMETRY_ENDPOINT, TELEMETRY_TARGET } from '../utils/constants';\n\ntype FetchClientOptions = {\n /** The fetch method for sending events, should handle retries and timeouts */\n fetch?: typeof 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: typeof 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 const agent = new RetryAgent(new Agent(), {\n maxRetries: 3,\n retryAfter: true,\n minTimeout: 500,\n maxTimeout: 2000,\n timeoutFactor: 2,\n });\n\n return (info: RequestInfo | URL, init: RequestInit = {}) =>\n fetch(extractUrl(info), { ...init, dispatcher: agent });\n}\n\n/** Extract the URL string from either `RequestInfo` or `URL` */\nfunction extractUrl(info: RequestInfo | URL) {\n if (typeof info === 'string') return info;\n if ('url' in info) return info.url;\n return info.toString();\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","agent","RetryAgent","Agent","maxRetries","retryAfter","minTimeout","maxTimeout","timeoutFactor","info","init","extractUrl","dispatcher","promise","then"],"mappings":";;;;+BAsBaA;;;eAAAA;;;;yBAtBU;;;;;;;yBAE+C;;;;;;uBAEhD;2BAE+B;AAgB9C,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,MAAM6C,QAAQ,IAAIC,CAAAA,SAAS,YAAC,CAAC,IAAIC,CAAAA,SAAI,OAAC,IAAI;QACxCC,YAAY;QACZC,YAAY;QACZC,YAAY;QACZC,YAAY;QACZC,eAAe;IACjB;IAEA,OAAO,CAACC,MAAyBC,OAAoB,CAAC,CAAC,GACrDvD,IAAAA,YAAK,EAACwD,WAAWF,OAAO;YAAE,GAAGC,IAAI;YAAEE,YAAYX;QAAM;AACzD;AAEA,8DAA8D,GAC9D,SAASU,WAAWF,IAAuB;IACzC,IAAI,OAAOA,SAAS,UAAU,OAAOA;IACrC,IAAI,SAASA,MAAM,OAAOA,KAAKpD,GAAG;IAClC,OAAOoD,KAAKrC,QAAQ;AACtB;AAEA,wEAAwE,GACxE,SAASM,YAAYmC,OAAqB;IACxC,OAAOA,QAAQC,IAAI,CACjB,KAAO,GACP,KAAO;AAEX"}
1
+ {"version":3,"sources":["../../../../../src/utils/telemetry/clients/FetchClient.ts"],"sourcesContent":["import { Buffer } from 'node:buffer';\nimport { URL } from 'node:url';\nimport { Agent, RetryAgent, type RequestInfo, type RequestInit } from 'undici';\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 const agent = new RetryAgent(new Agent(), {\n maxRetries: 3,\n retryAfter: true,\n minTimeout: 500,\n maxTimeout: 2000,\n timeoutFactor: 2,\n });\n\n return (info: RequestInfo | URL, init: RequestInit = {}) =>\n fetch(extractUrl(info), { ...init, dispatcher: agent });\n}\n\n/** Extract the URL string from either `RequestInfo` or `URL` */\nfunction extractUrl(info: RequestInfo | URL) {\n if (typeof info === 'string') return info;\n if ('url' in info) return info.url;\n return info.toString();\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","agent","RetryAgent","Agent","maxRetries","retryAfter","minTimeout","maxTimeout","timeoutFactor","info","init","extractUrl","dispatcher","promise","then"],"mappings":";;;;+BAwBaA;;;eAAAA;;;;yBAxBU;;;;;;;yBAE+C;;;;;;uBAEhD;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,MAAM6C,QAAQ,IAAIC,CAAAA,SAAS,YAAC,CAAC,IAAIC,CAAAA,SAAI,OAAC,IAAI;QACxCC,YAAY;QACZC,YAAY;QACZC,YAAY;QACZC,YAAY;QACZC,eAAe;IACjB;IAEA,OAAO,CAACC,MAAyBC,OAAoB,CAAC,CAAC,GACrDvD,IAAAA,YAAK,EAACwD,WAAWF,OAAO;YAAE,GAAGC,IAAI;YAAEE,YAAYX;QAAM;AACzD;AAEA,8DAA8D,GAC9D,SAASU,WAAWF,IAAuB;IACzC,IAAI,OAAOA,SAAS,UAAU,OAAOA;IACrC,IAAI,SAASA,MAAM,OAAOA,KAAKpD,GAAG;IAClC,OAAOoD,KAAKrC,QAAQ;AACtB;AAEA,wEAAwE,GACxE,SAASM,YAAYmC,OAAqB;IACxC,OAAOA,QAAQC,IAAI,CACjB,KAAO,GACP,KAAO;AAEX"}
@@ -83,7 +83,7 @@ function createContext() {
83
83
  cpu: summarizeCpuInfo(),
84
84
  app: {
85
85
  name: 'expo/cli',
86
- version: "1.0.0-canary-20250404-3c3b5fd"
86
+ version: "1.0.0-canary-20250701-6a945c5"
87
87
  },
88
88
  ci: _ciinfo().isCI ? {
89
89
  name: _ciinfo().name,
@@ -54,8 +54,13 @@ function evaluateTsConfig(ts, tsConfigPath) {
54
54
  ]
55
55
  }, _path().default.dirname(tsConfigPath));
56
56
  if (jsonFileContents.errors) {
57
- // filter out "no inputs were found in config file" error
58
- jsonFileContents.errors = jsonFileContents.errors.filter(({ code })=>code !== 18003);
57
+ jsonFileContents.errors = jsonFileContents.errors.filter(({ code })=>{
58
+ // TS18003: filter out "no inputs were found in config file" error */
59
+ // TS6046: filter out "Argument for '--module' option must be" error
60
+ // this error can be ignored since we're only typically interested in `paths` and `baseUrl`
61
+ return code !== 18003 && code !== 6046;
62
+ })// filter out non-error diagnostics
63
+ .filter(({ category })=>category !== 1 /*DiagnosticCategory.Error = 1*/ );
59
64
  }
60
65
  if ((_jsonFileContents_errors = jsonFileContents.errors) == null ? void 0 : _jsonFileContents_errors.length) {
61
66
  throw new Error(ts.formatDiagnostic(jsonFileContents.errors[0], formatDiagnosticsHost));
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/utils/tsconfig/evaluateTsConfig.ts"],"sourcesContent":["import path from 'path';\nimport resolveFrom from 'resolve-from';\n\nexport function evaluateTsConfig(ts: typeof import('typescript'), tsConfigPath: string) {\n const formatDiagnosticsHost: import('typescript').FormatDiagnosticsHost = {\n getNewLine: () => require('os').EOL,\n getCurrentDirectory: ts.sys.getCurrentDirectory,\n getCanonicalFileName: (fileName: string) => fileName,\n };\n\n try {\n const { config, error } = ts.readConfigFile(tsConfigPath, ts.sys.readFile);\n\n if (error) {\n throw new Error(ts.formatDiagnostic(error, formatDiagnosticsHost));\n }\n\n const jsonFileContents = ts.parseJsonConfigFileContent(\n config,\n {\n ...ts.sys,\n readDirectory: (_, ext) => [ext ? `file${ext[0]}` : `file.ts`],\n },\n path.dirname(tsConfigPath)\n );\n\n if (jsonFileContents.errors) {\n // filter out \"no inputs were found in config file\" error\n jsonFileContents.errors = jsonFileContents.errors.filter(({ code }) => code !== 18003);\n }\n\n if (jsonFileContents.errors?.length) {\n throw new Error(ts.formatDiagnostic(jsonFileContents.errors[0], formatDiagnosticsHost));\n }\n\n return { compilerOptions: jsonFileContents.options, raw: config.raw };\n } catch (error: any) {\n if (error?.name === 'SyntaxError') {\n throw new Error('tsconfig.json is invalid:\\n' + (error.message ?? ''));\n }\n throw error;\n }\n}\n\nexport function importTypeScriptFromProjectOptionally(\n projectRoot: string\n): typeof import('typescript') | null {\n const resolvedPath = resolveFrom.silent(projectRoot, 'typescript');\n if (!resolvedPath) {\n return null;\n }\n return require(resolvedPath);\n}\n"],"names":["evaluateTsConfig","importTypeScriptFromProjectOptionally","ts","tsConfigPath","formatDiagnosticsHost","getNewLine","require","EOL","getCurrentDirectory","sys","getCanonicalFileName","fileName","jsonFileContents","config","error","readConfigFile","readFile","Error","formatDiagnostic","parseJsonConfigFileContent","readDirectory","_","ext","path","dirname","errors","filter","code","length","compilerOptions","options","raw","name","message","projectRoot","resolvedPath","resolveFrom","silent"],"mappings":";;;;;;;;;;;IAGgBA,gBAAgB;eAAhBA;;IAyCAC,qCAAqC;eAArCA;;;;gEA5CC;;;;;;;gEACO;;;;;;;;;;;AAEjB,SAASD,iBAAiBE,EAA+B,EAAEC,YAAoB;IACpF,MAAMC,wBAAoE;QACxEC,YAAY,IAAMC,QAAQ,MAAMC,GAAG;QACnCC,qBAAqBN,GAAGO,GAAG,CAACD,mBAAmB;QAC/CE,sBAAsB,CAACC,WAAqBA;IAC9C;IAEA,IAAI;YAqBEC;QApBJ,MAAM,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAGZ,GAAGa,cAAc,CAACZ,cAAcD,GAAGO,GAAG,CAACO,QAAQ;QAEzE,IAAIF,OAAO;YACT,MAAM,IAAIG,MAAMf,GAAGgB,gBAAgB,CAACJ,OAAOV;QAC7C;QAEA,MAAMQ,mBAAmBV,GAAGiB,0BAA0B,CACpDN,QACA;YACE,GAAGX,GAAGO,GAAG;YACTW,eAAe,CAACC,GAAGC,MAAQ;oBAACA,MAAM,CAAC,IAAI,EAAEA,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC;iBAAC;QAChE,GACAC,eAAI,CAACC,OAAO,CAACrB;QAGf,IAAIS,iBAAiBa,MAAM,EAAE;YAC3B,yDAAyD;YACzDb,iBAAiBa,MAAM,GAAGb,iBAAiBa,MAAM,CAACC,MAAM,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKA,SAAS;QAClF;QAEA,KAAIf,2BAAAA,iBAAiBa,MAAM,qBAAvBb,yBAAyBgB,MAAM,EAAE;YACnC,MAAM,IAAIX,MAAMf,GAAGgB,gBAAgB,CAACN,iBAAiBa,MAAM,CAAC,EAAE,EAAErB;QAClE;QAEA,OAAO;YAAEyB,iBAAiBjB,iBAAiBkB,OAAO;YAAEC,KAAKlB,OAAOkB,GAAG;QAAC;IACtE,EAAE,OAAOjB,OAAY;QACnB,IAAIA,CAAAA,yBAAAA,MAAOkB,IAAI,MAAK,eAAe;YACjC,MAAM,IAAIf,MAAM,gCAAiCH,CAAAA,MAAMmB,OAAO,IAAI,EAAC;QACrE;QACA,MAAMnB;IACR;AACF;AAEO,SAASb,sCACdiC,WAAmB;IAEnB,MAAMC,eAAeC,sBAAW,CAACC,MAAM,CAACH,aAAa;IACrD,IAAI,CAACC,cAAc;QACjB,OAAO;IACT;IACA,OAAO7B,QAAQ6B;AACjB"}
1
+ {"version":3,"sources":["../../../../src/utils/tsconfig/evaluateTsConfig.ts"],"sourcesContent":["import path from 'path';\nimport resolveFrom from 'resolve-from';\n\nexport function evaluateTsConfig(ts: typeof import('typescript'), tsConfigPath: string) {\n const formatDiagnosticsHost: import('typescript').FormatDiagnosticsHost = {\n getNewLine: () => require('os').EOL,\n getCurrentDirectory: ts.sys.getCurrentDirectory,\n getCanonicalFileName: (fileName: string) => fileName,\n };\n\n try {\n const { config, error } = ts.readConfigFile(tsConfigPath, ts.sys.readFile);\n\n if (error) {\n throw new Error(ts.formatDiagnostic(error, formatDiagnosticsHost));\n }\n\n const jsonFileContents = ts.parseJsonConfigFileContent(\n config,\n {\n ...ts.sys,\n readDirectory: (_, ext) => [ext ? `file${ext[0]}` : `file.ts`],\n },\n path.dirname(tsConfigPath)\n );\n\n if (jsonFileContents.errors) {\n jsonFileContents.errors = jsonFileContents.errors\n .filter(({ code }) => {\n // TS18003: filter out \"no inputs were found in config file\" error */\n // TS6046: filter out \"Argument for '--module' option must be\" error\n // this error can be ignored since we're only typically interested in `paths` and `baseUrl`\n return code !== 18003 && code !== 6046;\n })\n // filter out non-error diagnostics\n .filter(({ category }) => category !== 1 /*DiagnosticCategory.Error = 1*/);\n }\n\n if (jsonFileContents.errors?.length) {\n throw new Error(ts.formatDiagnostic(jsonFileContents.errors[0], formatDiagnosticsHost));\n }\n\n return { compilerOptions: jsonFileContents.options, raw: config.raw };\n } catch (error: any) {\n if (error?.name === 'SyntaxError') {\n throw new Error('tsconfig.json is invalid:\\n' + (error.message ?? ''));\n }\n throw error;\n }\n}\n\nexport function importTypeScriptFromProjectOptionally(\n projectRoot: string\n): typeof import('typescript') | null {\n const resolvedPath = resolveFrom.silent(projectRoot, 'typescript');\n if (!resolvedPath) {\n return null;\n }\n return require(resolvedPath);\n}\n"],"names":["evaluateTsConfig","importTypeScriptFromProjectOptionally","ts","tsConfigPath","formatDiagnosticsHost","getNewLine","require","EOL","getCurrentDirectory","sys","getCanonicalFileName","fileName","jsonFileContents","config","error","readConfigFile","readFile","Error","formatDiagnostic","parseJsonConfigFileContent","readDirectory","_","ext","path","dirname","errors","filter","code","category","length","compilerOptions","options","raw","name","message","projectRoot","resolvedPath","resolveFrom","silent"],"mappings":";;;;;;;;;;;IAGgBA,gBAAgB;eAAhBA;;IAgDAC,qCAAqC;eAArCA;;;;gEAnDC;;;;;;;gEACO;;;;;;;;;;;AAEjB,SAASD,iBAAiBE,EAA+B,EAAEC,YAAoB;IACpF,MAAMC,wBAAoE;QACxEC,YAAY,IAAMC,QAAQ,MAAMC,GAAG;QACnCC,qBAAqBN,GAAGO,GAAG,CAACD,mBAAmB;QAC/CE,sBAAsB,CAACC,WAAqBA;IAC9C;IAEA,IAAI;YA4BEC;QA3BJ,MAAM,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAGZ,GAAGa,cAAc,CAACZ,cAAcD,GAAGO,GAAG,CAACO,QAAQ;QAEzE,IAAIF,OAAO;YACT,MAAM,IAAIG,MAAMf,GAAGgB,gBAAgB,CAACJ,OAAOV;QAC7C;QAEA,MAAMQ,mBAAmBV,GAAGiB,0BAA0B,CACpDN,QACA;YACE,GAAGX,GAAGO,GAAG;YACTW,eAAe,CAACC,GAAGC,MAAQ;oBAACA,MAAM,CAAC,IAAI,EAAEA,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC;iBAAC;QAChE,GACAC,eAAI,CAACC,OAAO,CAACrB;QAGf,IAAIS,iBAAiBa,MAAM,EAAE;YAC3Bb,iBAAiBa,MAAM,GAAGb,iBAAiBa,MAAM,CAC9CC,MAAM,CAAC,CAAC,EAAEC,IAAI,EAAE;gBACf,qEAAqE;gBACrE,oEAAoE;gBACpE,mGAAmG;gBACnG,OAAOA,SAAS,SAASA,SAAS;YACpC,EACA,mCAAmC;aAClCD,MAAM,CAAC,CAAC,EAAEE,QAAQ,EAAE,GAAKA,aAAa,EAAE,8BAA8B;QAC3E;QAEA,KAAIhB,2BAAAA,iBAAiBa,MAAM,qBAAvBb,yBAAyBiB,MAAM,EAAE;YACnC,MAAM,IAAIZ,MAAMf,GAAGgB,gBAAgB,CAACN,iBAAiBa,MAAM,CAAC,EAAE,EAAErB;QAClE;QAEA,OAAO;YAAE0B,iBAAiBlB,iBAAiBmB,OAAO;YAAEC,KAAKnB,OAAOmB,GAAG;QAAC;IACtE,EAAE,OAAOlB,OAAY;QACnB,IAAIA,CAAAA,yBAAAA,MAAOmB,IAAI,MAAK,eAAe;YACjC,MAAM,IAAIhB,MAAM,gCAAiCH,CAAAA,MAAMoB,OAAO,IAAI,EAAC;QACrE;QACA,MAAMpB;IACR;AACF;AAEO,SAASb,sCACdkC,WAAmB;IAEnB,MAAMC,eAAeC,sBAAW,CAACC,MAAM,CAACH,aAAa;IACrD,IAAI,CAACC,cAAc;QACjB,OAAO;IACT;IACA,OAAO9B,QAAQ8B;AACjB"}
@@ -21,17 +21,74 @@ _export(exports, {
21
21
  });
22
22
  const _errors = require("../utils/errors");
23
23
  const debug = require('debug')('expo:utils:variadic');
24
- function parseVariadicArguments(argv) {
24
+ function parseVariadicArguments(argv, strFlags = []) {
25
25
  const variadic = [];
26
- const flags = {};
27
- for (const arg of argv){
26
+ const parsedFlags = {};
27
+ let i = 0;
28
+ while(i < argv.length){
29
+ const arg = argv[i];
28
30
  if (!arg.startsWith('-')) {
29
31
  variadic.push(arg);
30
32
  } else if (arg === '--') {
31
33
  break;
32
34
  } else {
33
- flags[arg] = true;
35
+ const flagIndex = strFlags.indexOf(arg.split('=')[0]);
36
+ if (flagIndex !== -1) {
37
+ // Handle flags that expect a value
38
+ const [flag, value] = arg.split('=');
39
+ if (value !== undefined) {
40
+ // If the flag has a value inline (e.g., --flag=value)
41
+ if (parsedFlags[flag] === undefined) {
42
+ parsedFlags[flag] = value;
43
+ } else if (Array.isArray(parsedFlags[flag])) {
44
+ parsedFlags[flag].push(value);
45
+ } else {
46
+ parsedFlags[flag] = [
47
+ parsedFlags[flag],
48
+ value
49
+ ];
50
+ }
51
+ } else {
52
+ const nextArg = argv[i + 1];
53
+ if (nextArg && !nextArg.startsWith('-')) {
54
+ if (parsedFlags[arg] === undefined) {
55
+ parsedFlags[arg] = nextArg;
56
+ } else if (Array.isArray(parsedFlags[arg])) {
57
+ parsedFlags[arg].push(nextArg);
58
+ } else {
59
+ parsedFlags[arg] = [
60
+ parsedFlags[arg],
61
+ nextArg
62
+ ];
63
+ }
64
+ i++; // Skip the next argument since it's part of the current flag
65
+ } else {
66
+ if (parsedFlags[arg] === undefined) {
67
+ parsedFlags[arg] = true; // Flag without a value
68
+ } else if (Array.isArray(parsedFlags[arg])) {
69
+ parsedFlags[arg].push(true);
70
+ } else {
71
+ parsedFlags[arg] = [
72
+ parsedFlags[arg],
73
+ true
74
+ ];
75
+ }
76
+ }
77
+ }
78
+ } else {
79
+ if (parsedFlags[arg] === undefined) {
80
+ parsedFlags[arg] = true; // Unknown flag
81
+ } else if (Array.isArray(parsedFlags[arg])) {
82
+ parsedFlags[arg].push(true);
83
+ } else {
84
+ parsedFlags[arg] = [
85
+ parsedFlags[arg],
86
+ true
87
+ ];
88
+ }
89
+ }
34
90
  }
91
+ i++;
35
92
  }
36
93
  // Everything after `--` that is not an option is passed to the underlying install command.
37
94
  const extras = [];
@@ -44,10 +101,10 @@ function parseVariadicArguments(argv) {
44
101
  extras.push(...extraArgs);
45
102
  debug('Extra arguments: ' + extras.join(', '));
46
103
  }
47
- debug(`Parsed arguments (variadic: %O, flags: %O, extra: %O)`, variadic, flags, extras);
104
+ debug(`Parsed arguments (variadic: %O, flags: %O, extra: %O)`, variadic, parsedFlags, extras);
48
105
  return {
49
106
  variadic,
50
- flags,
107
+ flags: parsedFlags,
51
108
  extras
52
109
  };
53
110
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/variadic.ts"],"sourcesContent":["import { CommandError } from '../utils/errors';\n\nconst debug = require('debug')('expo:utils:variadic') as typeof console.log;\n\n/** Given a list of CLI args, return a sorted set of args based on categories used in a complex command. */\nexport function parseVariadicArguments(argv: string[]): {\n variadic: string[];\n extras: string[];\n flags: Record<string, boolean | undefined>;\n} {\n const variadic: string[] = [];\n const flags: Record<string, boolean> = {};\n\n for (const arg of argv) {\n if (!arg.startsWith('-')) {\n variadic.push(arg);\n } else if (arg === '--') {\n break;\n } else {\n flags[arg] = true;\n }\n }\n\n // Everything after `--` that is not an option is passed to the underlying install command.\n const extras: string[] = [];\n\n const extraOperator = argv.indexOf('--');\n if (extraOperator > -1 && argv.length > extraOperator + 1) {\n const extraArgs = argv.slice(extraOperator + 1);\n if (extraArgs.includes('--')) {\n throw new CommandError('BAD_ARGS', 'Unexpected multiple --');\n }\n extras.push(...extraArgs);\n debug('Extra arguments: ' + extras.join(', '));\n }\n\n debug(`Parsed arguments (variadic: %O, flags: %O, extra: %O)`, variadic, flags, extras);\n\n return {\n variadic,\n flags,\n extras,\n };\n}\n\nexport function assertUnexpectedObjectKeys(keys: string[], obj: Record<string, any>): void {\n const unexpectedKeys = Object.keys(obj).filter((key) => !keys.includes(key));\n if (unexpectedKeys.length > 0) {\n throw new CommandError('BAD_ARGS', `Unexpected: ${unexpectedKeys.join(', ')}`);\n }\n}\n\nexport function assertUnexpectedVariadicFlags(\n expectedFlags: string[],\n { extras, flags, variadic }: ReturnType<typeof parseVariadicArguments>,\n prefixCommand = ''\n) {\n const unexpectedFlags = Object.keys(flags).filter((key) => !expectedFlags.includes(key));\n\n if (unexpectedFlags.length > 0) {\n const intendedFlags = Object.entries(flags)\n .filter(([key]) => expectedFlags.includes(key))\n .map(([key]) => key);\n\n const cmd = [\n prefixCommand,\n ...variadic,\n ...intendedFlags,\n '--',\n ...extras.concat(unexpectedFlags),\n ].join(' ');\n\n throw new CommandError(\n 'BAD_ARGS',\n `Unexpected: ${unexpectedFlags.join(', ')}\\nDid you mean: ${cmd.trim()}`\n );\n }\n}\n"],"names":["assertUnexpectedObjectKeys","assertUnexpectedVariadicFlags","parseVariadicArguments","debug","require","argv","variadic","flags","arg","startsWith","push","extras","extraOperator","indexOf","length","extraArgs","slice","includes","CommandError","join","keys","obj","unexpectedKeys","Object","filter","key","expectedFlags","prefixCommand","unexpectedFlags","intendedFlags","entries","map","cmd","concat","trim"],"mappings":";;;;;;;;;;;IA6CgBA,0BAA0B;eAA1BA;;IAOAC,6BAA6B;eAA7BA;;IA/CAC,sBAAsB;eAAtBA;;;wBALa;AAE7B,MAAMC,QAAQC,QAAQ,SAAS;AAGxB,SAASF,uBAAuBG,IAAc;IAKnD,MAAMC,WAAqB,EAAE;IAC7B,MAAMC,QAAiC,CAAC;IAExC,KAAK,MAAMC,OAAOH,KAAM;QACtB,IAAI,CAACG,IAAIC,UAAU,CAAC,MAAM;YACxBH,SAASI,IAAI,CAACF;QAChB,OAAO,IAAIA,QAAQ,MAAM;YACvB;QACF,OAAO;YACLD,KAAK,CAACC,IAAI,GAAG;QACf;IACF;IAEA,2FAA2F;IAC3F,MAAMG,SAAmB,EAAE;IAE3B,MAAMC,gBAAgBP,KAAKQ,OAAO,CAAC;IACnC,IAAID,gBAAgB,CAAC,KAAKP,KAAKS,MAAM,GAAGF,gBAAgB,GAAG;QACzD,MAAMG,YAAYV,KAAKW,KAAK,CAACJ,gBAAgB;QAC7C,IAAIG,UAAUE,QAAQ,CAAC,OAAO;YAC5B,MAAM,IAAIC,oBAAY,CAAC,YAAY;QACrC;QACAP,OAAOD,IAAI,IAAIK;QACfZ,MAAM,sBAAsBQ,OAAOQ,IAAI,CAAC;IAC1C;IAEAhB,MAAM,CAAC,qDAAqD,CAAC,EAAEG,UAAUC,OAAOI;IAEhF,OAAO;QACLL;QACAC;QACAI;IACF;AACF;AAEO,SAASX,2BAA2BoB,IAAc,EAAEC,GAAwB;IACjF,MAAMC,iBAAiBC,OAAOH,IAAI,CAACC,KAAKG,MAAM,CAAC,CAACC,MAAQ,CAACL,KAAKH,QAAQ,CAACQ;IACvE,IAAIH,eAAeR,MAAM,GAAG,GAAG;QAC7B,MAAM,IAAII,oBAAY,CAAC,YAAY,CAAC,YAAY,EAAEI,eAAeH,IAAI,CAAC,OAAO;IAC/E;AACF;AAEO,SAASlB,8BACdyB,aAAuB,EACvB,EAAEf,MAAM,EAAEJ,KAAK,EAAED,QAAQ,EAA6C,EACtEqB,gBAAgB,EAAE;IAElB,MAAMC,kBAAkBL,OAAOH,IAAI,CAACb,OAAOiB,MAAM,CAAC,CAACC,MAAQ,CAACC,cAAcT,QAAQ,CAACQ;IAEnF,IAAIG,gBAAgBd,MAAM,GAAG,GAAG;QAC9B,MAAMe,gBAAgBN,OAAOO,OAAO,CAACvB,OAClCiB,MAAM,CAAC,CAAC,CAACC,IAAI,GAAKC,cAAcT,QAAQ,CAACQ,MACzCM,GAAG,CAAC,CAAC,CAACN,IAAI,GAAKA;QAElB,MAAMO,MAAM;YACVL;eACGrB;eACAuB;YACH;eACGlB,OAAOsB,MAAM,CAACL;SAClB,CAACT,IAAI,CAAC;QAEP,MAAM,IAAID,oBAAY,CACpB,YACA,CAAC,YAAY,EAAEU,gBAAgBT,IAAI,CAAC,MAAM,gBAAgB,EAAEa,IAAIE,IAAI,IAAI;IAE5E;AACF"}
1
+ {"version":3,"sources":["../../../src/utils/variadic.ts"],"sourcesContent":["import { CommandError } from '../utils/errors';\n\nconst debug = require('debug')('expo:utils:variadic') as typeof console.log;\n\n/** Given a list of CLI args, return a sorted set of args based on categories used in a complex command. */\nexport function parseVariadicArguments(\n argv: string[],\n strFlags: string[] = []\n): {\n variadic: string[];\n extras: string[];\n flags: Record<string, boolean | string | string[] | undefined>;\n} {\n const variadic: string[] = [];\n const parsedFlags: Record<string, boolean | string | string[]> = {};\n\n let i = 0;\n while (i < argv.length) {\n const arg = argv[i];\n\n if (!arg.startsWith('-')) {\n variadic.push(arg);\n } else if (arg === '--') {\n break;\n } else {\n const flagIndex = strFlags.indexOf(arg.split('=')[0]);\n if (flagIndex !== -1) {\n // Handle flags that expect a value\n const [flag, value] = arg.split('=');\n if (value !== undefined) {\n // If the flag has a value inline (e.g., --flag=value)\n if (parsedFlags[flag] === undefined) {\n parsedFlags[flag] = value;\n } else if (Array.isArray(parsedFlags[flag])) {\n (parsedFlags[flag] as string[]).push(value);\n } else {\n parsedFlags[flag] = [parsedFlags[flag] as string, value];\n }\n } else {\n const nextArg = argv[i + 1];\n if (nextArg && !nextArg.startsWith('-')) {\n if (parsedFlags[arg] === undefined) {\n parsedFlags[arg] = nextArg;\n } else if (Array.isArray(parsedFlags[arg])) {\n (parsedFlags[arg] as string[]).push(nextArg);\n } else {\n parsedFlags[arg] = [parsedFlags[arg] as string, nextArg];\n }\n i++; // Skip the next argument since it's part of the current flag\n } else {\n if (parsedFlags[arg] === undefined) {\n parsedFlags[arg] = true; // Flag without a value\n } else if (Array.isArray(parsedFlags[arg])) {\n (parsedFlags[arg] as (string | boolean)[]).push(true);\n } else {\n parsedFlags[arg] = [parsedFlags[arg] as any, true];\n }\n }\n }\n } else {\n if (parsedFlags[arg] === undefined) {\n parsedFlags[arg] = true; // Unknown flag\n } else if (Array.isArray(parsedFlags[arg])) {\n (parsedFlags[arg] as (string | boolean)[]).push(true);\n } else {\n parsedFlags[arg] = [parsedFlags[arg] as any, true];\n }\n }\n }\n i++;\n }\n\n // Everything after `--` that is not an option is passed to the underlying install command.\n const extras: string[] = [];\n const extraOperator = argv.indexOf('--');\n if (extraOperator > -1 && argv.length > extraOperator + 1) {\n const extraArgs = argv.slice(extraOperator + 1);\n if (extraArgs.includes('--')) {\n throw new CommandError('BAD_ARGS', 'Unexpected multiple --');\n }\n extras.push(...extraArgs);\n debug('Extra arguments: ' + extras.join(', '));\n }\n\n debug(`Parsed arguments (variadic: %O, flags: %O, extra: %O)`, variadic, parsedFlags, extras);\n\n return {\n variadic,\n flags: parsedFlags,\n extras,\n };\n}\n\nexport function assertUnexpectedObjectKeys(keys: string[], obj: Record<string, any>): void {\n const unexpectedKeys = Object.keys(obj).filter((key) => !keys.includes(key));\n if (unexpectedKeys.length > 0) {\n throw new CommandError('BAD_ARGS', `Unexpected: ${unexpectedKeys.join(', ')}`);\n }\n}\n\nexport function assertUnexpectedVariadicFlags(\n expectedFlags: string[],\n { extras, flags, variadic }: ReturnType<typeof parseVariadicArguments>,\n prefixCommand = ''\n) {\n const unexpectedFlags = Object.keys(flags).filter((key) => !expectedFlags.includes(key));\n\n if (unexpectedFlags.length > 0) {\n const intendedFlags = Object.entries(flags)\n .filter(([key]) => expectedFlags.includes(key))\n .map(([key]) => key);\n\n const cmd = [\n prefixCommand,\n ...variadic,\n ...intendedFlags,\n '--',\n ...extras.concat(unexpectedFlags),\n ].join(' ');\n\n throw new CommandError(\n 'BAD_ARGS',\n `Unexpected: ${unexpectedFlags.join(', ')}\\nDid you mean: ${cmd.trim()}`\n );\n }\n}\n"],"names":["assertUnexpectedObjectKeys","assertUnexpectedVariadicFlags","parseVariadicArguments","debug","require","argv","strFlags","variadic","parsedFlags","i","length","arg","startsWith","push","flagIndex","indexOf","split","flag","value","undefined","Array","isArray","nextArg","extras","extraOperator","extraArgs","slice","includes","CommandError","join","flags","keys","obj","unexpectedKeys","Object","filter","key","expectedFlags","prefixCommand","unexpectedFlags","intendedFlags","entries","map","cmd","concat","trim"],"mappings":"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"}