@expo/cli 0.18.2 → 0.18.3
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.
- package/build/bin/cli +1 -1
- package/build/src/run/ios/appleDevice/AppleDevice.js +78 -30
- package/build/src/run/ios/appleDevice/AppleDevice.js.map +1 -1
- package/build/src/run/ios/appleDevice/installOnDeviceAsync.js +14 -0
- package/build/src/run/ios/appleDevice/installOnDeviceAsync.js.map +1 -1
- package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js.map +1 -1
- package/build/src/start/platforms/ios/devicectl.js +353 -0
- package/build/src/start/platforms/ios/devicectl.js.map +1 -0
- package/build/src/start/server/metro/debugging/AtlasPrerequisite.js +47 -0
- package/build/src/start/server/metro/debugging/AtlasPrerequisite.js.map +1 -0
- package/build/src/start/server/metro/debugging/attachAtlas.js +69 -0
- package/build/src/start/server/metro/debugging/attachAtlas.js.map +1 -0
- package/build/src/start/server/metro/instantiateMetro.js +11 -0
- package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
- package/build/src/start/server/metro/router.js +4 -2
- package/build/src/start/server/metro/router.js.map +1 -1
- package/build/src/utils/env.js +3 -0
- package/build/src/utils/env.js.map +1 -1
- package/build/src/utils/telemetry/getContext.js +1 -1
- package/package.json +4 -3
package/build/bin/cli
CHANGED
|
@@ -10,8 +10,7 @@ function _export(target, all) {
|
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
12
|
getConnectedDevicesAsync: ()=>getConnectedDevicesAsync,
|
|
13
|
-
runOnDevice: ()=>runOnDevice
|
|
14
|
-
launchAppWithDeviceCtl: ()=>launchAppWithDeviceCtl
|
|
13
|
+
runOnDevice: ()=>runOnDevice
|
|
15
14
|
});
|
|
16
15
|
function _debug() {
|
|
17
16
|
const data = /*#__PURE__*/ _interopRequireDefault(require("debug"));
|
|
@@ -40,17 +39,85 @@ const _usbmuxdClient = require("./client/UsbmuxdClient");
|
|
|
40
39
|
const _afcprotocol = require("./protocol/AFCProtocol");
|
|
41
40
|
const _log = require("../../../log");
|
|
42
41
|
const _xcodeDeveloperDiskImagePrerequisite = require("../../../start/doctor/apple/XcodeDeveloperDiskImagePrerequisite");
|
|
43
|
-
const
|
|
42
|
+
const _devicectl = /*#__PURE__*/ _interopRequireWildcard(require("../../../start/platforms/ios/devicectl"));
|
|
43
|
+
const _array = require("../../../utils/array");
|
|
44
44
|
const _delay = require("../../../utils/delay");
|
|
45
45
|
const _errors = require("../../../utils/errors");
|
|
46
46
|
const _exit = require("../../../utils/exit");
|
|
47
|
+
const _profile = require("../../../utils/profile");
|
|
47
48
|
function _interopRequireDefault(obj) {
|
|
48
49
|
return obj && obj.__esModule ? obj : {
|
|
49
50
|
default: obj
|
|
50
51
|
};
|
|
51
52
|
}
|
|
53
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
54
|
+
if (typeof WeakMap !== "function") return null;
|
|
55
|
+
var cacheBabelInterop = new WeakMap();
|
|
56
|
+
var cacheNodeInterop = new WeakMap();
|
|
57
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
58
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
59
|
+
})(nodeInterop);
|
|
60
|
+
}
|
|
61
|
+
function _interopRequireWildcard(obj, nodeInterop) {
|
|
62
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
63
|
+
return obj;
|
|
64
|
+
}
|
|
65
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
66
|
+
return {
|
|
67
|
+
default: obj
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
71
|
+
if (cache && cache.has(obj)) {
|
|
72
|
+
return cache.get(obj);
|
|
73
|
+
}
|
|
74
|
+
var newObj = {};
|
|
75
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
76
|
+
for(var key in obj){
|
|
77
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
78
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
79
|
+
if (desc && (desc.get || desc.set)) {
|
|
80
|
+
Object.defineProperty(newObj, key, desc);
|
|
81
|
+
} else {
|
|
82
|
+
newObj[key] = obj[key];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
newObj.default = obj;
|
|
87
|
+
if (cache) {
|
|
88
|
+
cache.set(obj, newObj);
|
|
89
|
+
}
|
|
90
|
+
return newObj;
|
|
91
|
+
}
|
|
52
92
|
const debug = (0, _debug().default)("expo:apple-device");
|
|
93
|
+
async function getConnectedDevicesUsingNativeToolsAsync() {
|
|
94
|
+
return (await _devicectl.getConnectedAppleDevicesAsync())// Filter out unpaired devices.
|
|
95
|
+
// TODO: We could improve this logic in the future to attempt pairing if specified.
|
|
96
|
+
.filter((device)=>device.connectionProperties.pairingState === "paired").map((device)=>{
|
|
97
|
+
return {
|
|
98
|
+
name: device.deviceProperties.name,
|
|
99
|
+
model: device.hardwareProperties.productType,
|
|
100
|
+
osVersion: device.deviceProperties.osVersionNumber,
|
|
101
|
+
udid: device.hardwareProperties.udid,
|
|
102
|
+
deviceType: "device",
|
|
103
|
+
connectionType: device.connectionProperties.transportType === "localNetwork" ? "Network" : "USB"
|
|
104
|
+
};
|
|
105
|
+
});
|
|
106
|
+
}
|
|
53
107
|
async function getConnectedDevicesAsync() {
|
|
108
|
+
const devices = await Promise.all([
|
|
109
|
+
// Prioritize native tools since they can provide more accurate information.
|
|
110
|
+
// NOTE: xcrun is substantially slower than custom tooling. +1.5s vs 9ms.
|
|
111
|
+
(0, _profile.profile)(getConnectedDevicesUsingNativeToolsAsync)(),
|
|
112
|
+
(0, _profile.profile)(getConnectedDevicesUsingCustomToolingAsync)(),
|
|
113
|
+
]);
|
|
114
|
+
return (0, _array.uniqBy)(devices.flat(), (device)=>device.udid);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* This supports devices that are running OS versions older than iOS 17.
|
|
118
|
+
*
|
|
119
|
+
* @returns a list of connected Apple devices.
|
|
120
|
+
*/ async function getConnectedDevicesUsingCustomToolingAsync() {
|
|
54
121
|
const client = new _usbmuxdClient.UsbmuxdClient(_usbmuxdClient.UsbmuxdClient.connectUsbmuxdSocket());
|
|
55
122
|
const devices = await client.getDevices();
|
|
56
123
|
client.socket.end();
|
|
@@ -72,6 +139,13 @@ async function getConnectedDevicesAsync() {
|
|
|
72
139
|
}));
|
|
73
140
|
}
|
|
74
141
|
async function runOnDevice({ udid , appPath , bundleId , waitForApp , deltaPath , onProgress }) {
|
|
142
|
+
debug("Running on device:", {
|
|
143
|
+
udid,
|
|
144
|
+
appPath,
|
|
145
|
+
bundleId,
|
|
146
|
+
waitForApp,
|
|
147
|
+
deltaPath
|
|
148
|
+
});
|
|
75
149
|
const clientManager = await _clientManager.ClientManager.create(udid);
|
|
76
150
|
try {
|
|
77
151
|
await mountDeveloperDiskImage(clientManager);
|
|
@@ -187,32 +261,6 @@ async function launchAppWithUsbmux(clientManager, { appInfo , detach }) {
|
|
|
187
261
|
}
|
|
188
262
|
throw new _errors.CommandError("Unable to launch app, number of tries exceeded");
|
|
189
263
|
}
|
|
190
|
-
async function launchAppWithDeviceCtl(deviceId, bundleId) {
|
|
191
|
-
try {
|
|
192
|
-
await (0, _xcrun.xcrunAsync)([
|
|
193
|
-
"devicectl",
|
|
194
|
-
"device",
|
|
195
|
-
"process",
|
|
196
|
-
"launch",
|
|
197
|
-
"--device",
|
|
198
|
-
deviceId,
|
|
199
|
-
bundleId
|
|
200
|
-
]);
|
|
201
|
-
} catch (error) {
|
|
202
|
-
if ("stderr" in error) {
|
|
203
|
-
const errorCodes = getDeviceCtlErrorCodes(error.stderr);
|
|
204
|
-
if (errorCodes.includes("Locked")) {
|
|
205
|
-
throw new _errors.CommandError("APPLE_DEVICE_LOCKED", "Device is locked, unlock and try again.");
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
throw new _errors.CommandError(`There was an error launching app: ${error}`);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
/** Find all error codes from the output log */ function getDeviceCtlErrorCodes(log) {
|
|
212
|
-
return [
|
|
213
|
-
...log.matchAll(/BSErrorCodeDescription\s+=\s+(.*)$/gim)
|
|
214
|
-
].map(([_line, code])=>code);
|
|
215
|
-
}
|
|
216
264
|
/**
|
|
217
265
|
* iOS 17 introduces a new protocol called RemoteXPC.
|
|
218
266
|
* This is not yet implemented, so we fallback to devicectl.
|
|
@@ -230,7 +278,7 @@ async function launchAppWithDeviceCtl(deviceId, bundleId) {
|
|
|
230
278
|
const deviceId = clientManager.device.Properties.SerialNumber;
|
|
231
279
|
clientManager.end();
|
|
232
280
|
// Fallback to devicectl for iOS 17 support
|
|
233
|
-
return await launchAppWithDeviceCtl(deviceId, bundleId);
|
|
281
|
+
return await (0, _devicectl.launchAppWithDeviceCtl)(deviceId, bundleId);
|
|
234
282
|
}
|
|
235
283
|
}
|
|
236
284
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/run/ios/appleDevice/AppleDevice.ts"],"sourcesContent":["import Debug from 'debug';\nimport fs from 'fs';\nimport path from 'path';\n\nimport { ClientManager } from './ClientManager';\nimport { IPLookupResult, OnInstallProgressCallback } from './client/InstallationProxyClient';\nimport { LockdowndClient } from './client/LockdowndClient';\nimport { UsbmuxdClient } from './client/UsbmuxdClient';\nimport { AFC_STATUS, AFCError } from './protocol/AFCProtocol';\nimport { Log } from '../../../log';\nimport { XcodeDeveloperDiskImagePrerequisite } from '../../../start/doctor/apple/XcodeDeveloperDiskImagePrerequisite';\nimport { xcrunAsync } from '../../../start/platforms/ios/xcrun';\nimport { delayAsync } from '../../../utils/delay';\nimport { CommandError } from '../../../utils/errors';\nimport { installExitHooks } from '../../../utils/exit';\n\nconst debug = Debug('expo:apple-device');\n\n// NOTE(EvanBacon): I have a feeling this shape will change with new iOS versions (tested against iOS 15).\nexport interface ConnectedDevice {\n /** @example `00008101-001964A22629003A` */\n udid: string;\n /** @example `Evan's phone` */\n name: string;\n /** @example `iPhone13,4` */\n model: string;\n /** @example `device` */\n deviceType: 'device' | 'catalyst';\n /** @example `USB` */\n connectionType: 'USB' | 'Network';\n /** @example `15.4.1` */\n osVersion: string;\n}\n\n/** @returns a list of connected Apple devices. */\nexport async function getConnectedDevicesAsync(): Promise<ConnectedDevice[]> {\n const client = new UsbmuxdClient(UsbmuxdClient.connectUsbmuxdSocket());\n const devices = await client.getDevices();\n client.socket.end();\n\n return Promise.all(\n devices.map(async (device): Promise<ConnectedDevice> => {\n const socket = await new UsbmuxdClient(UsbmuxdClient.connectUsbmuxdSocket()).connect(\n device,\n 62078\n );\n const deviceValues = await new LockdowndClient(socket).getAllValues();\n socket.end();\n // TODO(EvanBacon): Add support for osType (ipad, watchos, etc)\n return {\n // TODO(EvanBacon): Better name\n name: deviceValues.DeviceName ?? deviceValues.ProductType ?? 'unknown iOS device',\n model: deviceValues.ProductType,\n osVersion: deviceValues.ProductVersion,\n deviceType: 'device',\n connectionType: device.Properties.ConnectionType,\n udid: device.Properties.SerialNumber,\n };\n })\n );\n}\n\n/** Install and run an Apple app binary on a connected Apple device. */\nexport async function runOnDevice({\n udid,\n appPath,\n bundleId,\n waitForApp,\n deltaPath,\n onProgress,\n}: {\n /** Apple device UDID */\n udid: string;\n /** File path to the app binary (ipa) */\n appPath: string;\n /** Bundle identifier for the app at `appPath` */\n bundleId: string;\n /** Wait for the app to launch before returning */\n waitForApp: boolean;\n /** File path to the app deltas folder to use for faster subsequent installs */\n deltaPath: string;\n /** Callback to be called with progress updates */\n onProgress: OnInstallProgressCallback;\n}) {\n const clientManager = await ClientManager.create(udid);\n\n try {\n await mountDeveloperDiskImage(clientManager);\n\n const packageName = path.basename(appPath);\n const destPackagePath = path.join('PublicStaging', packageName);\n\n await uploadApp(clientManager, { appBinaryPath: appPath, destinationPath: destPackagePath });\n\n const installer = await clientManager.getInstallationProxyClient();\n await installer.installApp(\n destPackagePath,\n bundleId,\n {\n // https://github.com/ios-control/ios-deploy/blob/0f2ffb1e564aa67a2dfca7cdf13de47ce489d835/src/ios-deploy/ios-deploy.m#L2491-L2508\n ApplicationsType: 'Any',\n\n CFBundleIdentifier: bundleId,\n CloseOnInvalidate: '1',\n InvalidateOnDetach: '1',\n IsUserInitiated: '1',\n // Disable checking for wifi devices, this is nominally faster.\n PreferWifi: '0',\n // Only info I could find on these:\n // https://github.com/wwxxyx/Quectel_BG96/blob/310876f90fc1093a59e45e381160eddcc31697d0/Apple_Homekit/homekit_certification_tools/ATS%206/ATS%206/ATS.app/Contents/Frameworks/CaptureKit.framework/Versions/A/Resources/MobileDevice/MobileInstallation.h#L112-L121\n PackageType: 'Developer',\n ShadowParentKey: deltaPath,\n // SkipUninstall: '1'\n },\n onProgress\n );\n\n const {\n // TODO(EvanBacon): This can be undefined when querying App Clips.\n [bundleId]: appInfo,\n } = await installer.lookupApp([bundleId]);\n\n if (appInfo) {\n // launch fails with EBusy or ENotFound if you try to launch immediately after install\n await delayAsync(200);\n const debugServerClient = await launchApp(clientManager, {\n bundleId,\n appInfo,\n detach: !waitForApp,\n });\n\n if (waitForApp && debugServerClient) {\n installExitHooks(async () => {\n // causes continue() to return\n debugServerClient.halt();\n // give continue() time to return response\n await delayAsync(64);\n });\n\n debug(`Waiting for app to close...\\n`);\n const result = await debugServerClient.continue();\n // TODO: I have no idea what this packet means yet (successful close?)\n // if not a close (ie, most likely due to halt from onBeforeExit), then kill the app\n if (result !== 'W00') {\n await debugServerClient.kill();\n }\n }\n } else {\n Log.warn(`App \"${bundleId}\" installed but couldn't be launched. Open on device manually.`);\n }\n } finally {\n clientManager.end();\n }\n}\n\n/** Mount the developer disk image for Xcode. */\nasync function mountDeveloperDiskImage(clientManager: ClientManager) {\n const imageMounter = await clientManager.getMobileImageMounterClient();\n // Check if already mounted. If not, mount.\n if (!(await imageMounter.lookupImage()).ImageSignature) {\n // verify DeveloperDiskImage exists (TODO: how does this work on Windows/Linux?)\n // TODO: if windows/linux, download?\n const version = await (await clientManager.getLockdowndClient()).getValue('ProductVersion');\n const developerDiskImagePath = await XcodeDeveloperDiskImagePrerequisite.instance.assertAsync({\n version,\n });\n const developerDiskImageSig = fs.readFileSync(`${developerDiskImagePath}.signature`);\n await imageMounter.uploadImage(developerDiskImagePath, developerDiskImageSig);\n await imageMounter.mountImage(developerDiskImagePath, developerDiskImageSig);\n }\n}\n\nasync function uploadApp(\n clientManager: ClientManager,\n { appBinaryPath, destinationPath }: { appBinaryPath: string; destinationPath: string }\n) {\n const afcClient = await clientManager.getAFCClient();\n try {\n await afcClient.getFileInfo('PublicStaging');\n } catch (err: any) {\n if (err instanceof AFCError && err.status === AFC_STATUS.OBJECT_NOT_FOUND) {\n await afcClient.makeDirectory('PublicStaging');\n } else {\n throw err;\n }\n }\n await afcClient.uploadDirectory(appBinaryPath, destinationPath);\n}\n\nasync function launchAppWithUsbmux(\n clientManager: ClientManager,\n { appInfo, detach }: { appInfo: IPLookupResult[string]; detach?: boolean }\n) {\n let tries = 0;\n while (tries < 3) {\n const debugServerClient = await clientManager.getDebugserverClient();\n await debugServerClient.setMaxPacketSize(1024);\n await debugServerClient.setWorkingDir(appInfo.Container);\n await debugServerClient.launchApp(appInfo.Path, appInfo.CFBundleExecutable);\n\n const result = await debugServerClient.checkLaunchSuccess();\n if (result === 'OK') {\n if (detach) {\n // https://github.com/libimobiledevice/libimobiledevice/blob/25059d4c7d75e03aab516af2929d7c6e6d4c17de/tools/idevicedebug.c#L455-L464\n const res = await debugServerClient.sendCommand('D', []);\n debug('Disconnect from debug server request:', res);\n if (res !== 'OK') {\n console.warn(\n 'Something went wrong while attempting to disconnect from iOS debug server, you may need to reopen the app manually.'\n );\n }\n }\n\n return debugServerClient;\n } else if (result === 'EBusy' || result === 'ENotFound') {\n debug('Device busy or app not found, trying to launch again in .5s...');\n tries++;\n debugServerClient.socket.end();\n await delayAsync(500);\n } else {\n throw new CommandError(`There was an error launching app: ${result}`);\n }\n }\n throw new CommandError('Unable to launch app, number of tries exceeded');\n}\n\n/** @internal Exposed for testing */\nexport async function launchAppWithDeviceCtl(deviceId: string, bundleId: string) {\n try {\n await xcrunAsync(['devicectl', 'device', 'process', 'launch', '--device', deviceId, bundleId]);\n } catch (error: any) {\n if ('stderr' in error) {\n const errorCodes = getDeviceCtlErrorCodes(error.stderr);\n if (errorCodes.includes('Locked')) {\n throw new CommandError('APPLE_DEVICE_LOCKED', 'Device is locked, unlock and try again.');\n }\n }\n\n throw new CommandError(`There was an error launching app: ${error}`);\n }\n}\n\n/** Find all error codes from the output log */\nfunction getDeviceCtlErrorCodes(log: string): string[] {\n return [...log.matchAll(/BSErrorCodeDescription\\s+=\\s+(.*)$/gim)].map(([_line, code]) => code);\n}\n\n/**\n * iOS 17 introduces a new protocol called RemoteXPC.\n * This is not yet implemented, so we fallback to devicectl.\n *\n * @see https://github.com/doronz88/pymobiledevice3/blob/master/misc/RemoteXPC.md#process-remoted\n */\nasync function launchApp(\n clientManager: ClientManager,\n {\n bundleId,\n appInfo,\n detach,\n }: { bundleId: string; appInfo: IPLookupResult[string]; detach?: boolean }\n) {\n try {\n return await launchAppWithUsbmux(clientManager, { appInfo, detach });\n } catch (error) {\n debug('Failed to launch app with Usbmuxd, falling back to xcrun...', error);\n\n // Get the device UDID and close the connection, to allow `xcrun devicectl` to connect\n const deviceId = clientManager.device.Properties.SerialNumber;\n clientManager.end();\n\n // Fallback to devicectl for iOS 17 support\n return await launchAppWithDeviceCtl(deviceId, bundleId);\n }\n}\n"],"names":["getConnectedDevicesAsync","runOnDevice","launchAppWithDeviceCtl","debug","Debug","client","UsbmuxdClient","connectUsbmuxdSocket","devices","getDevices","socket","end","Promise","all","map","device","connect","deviceValues","LockdowndClient","getAllValues","name","DeviceName","ProductType","model","osVersion","ProductVersion","deviceType","connectionType","Properties","ConnectionType","udid","SerialNumber","appPath","bundleId","waitForApp","deltaPath","onProgress","clientManager","ClientManager","create","mountDeveloperDiskImage","packageName","path","basename","destPackagePath","join","uploadApp","appBinaryPath","destinationPath","installer","getInstallationProxyClient","installApp","ApplicationsType","CFBundleIdentifier","CloseOnInvalidate","InvalidateOnDetach","IsUserInitiated","PreferWifi","PackageType","ShadowParentKey","appInfo","lookupApp","delayAsync","debugServerClient","launchApp","detach","installExitHooks","halt","result","continue","kill","Log","warn","imageMounter","getMobileImageMounterClient","lookupImage","ImageSignature","version","getLockdowndClient","getValue","developerDiskImagePath","XcodeDeveloperDiskImagePrerequisite","instance","assertAsync","developerDiskImageSig","fs","readFileSync","uploadImage","mountImage","afcClient","getAFCClient","getFileInfo","err","AFCError","status","AFC_STATUS","OBJECT_NOT_FOUND","makeDirectory","uploadDirectory","launchAppWithUsbmux","tries","getDebugserverClient","setMaxPacketSize","setWorkingDir","Container","Path","CFBundleExecutable","checkLaunchSuccess","res","sendCommand","console","CommandError","deviceId","xcrunAsync","error","errorCodes","getDeviceCtlErrorCodes","stderr","includes","log","matchAll","_line","code"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/run/ios/appleDevice/AppleDevice.ts"],"sourcesContent":["import Debug from 'debug';\nimport fs from 'fs';\nimport path from 'path';\n\nimport { ClientManager } from './ClientManager';\nimport { IPLookupResult, OnInstallProgressCallback } from './client/InstallationProxyClient';\nimport { LockdowndClient } from './client/LockdowndClient';\nimport { UsbmuxdClient } from './client/UsbmuxdClient';\nimport { AFC_STATUS, AFCError } from './protocol/AFCProtocol';\nimport { Log } from '../../../log';\nimport { XcodeDeveloperDiskImagePrerequisite } from '../../../start/doctor/apple/XcodeDeveloperDiskImagePrerequisite';\nimport * as devicectl from '../../../start/platforms/ios/devicectl';\nimport { launchAppWithDeviceCtl } from '../../../start/platforms/ios/devicectl';\nimport { uniqBy } from '../../../utils/array';\nimport { delayAsync } from '../../../utils/delay';\nimport { CommandError } from '../../../utils/errors';\nimport { installExitHooks } from '../../../utils/exit';\nimport { profile } from '../../../utils/profile';\n\nconst debug = Debug('expo:apple-device');\n\n// NOTE(EvanBacon): I have a feeling this shape will change with new iOS versions (tested against iOS 15).\nexport interface ConnectedDevice {\n /** @example `00008101-001964A22629003A` */\n udid: string;\n /** @example `Evan's phone` */\n name: string;\n /** @example `iPhone13,4` */\n model: string;\n /** @example `device` */\n deviceType: 'device' | 'catalyst';\n /** @example `USB` */\n connectionType: 'USB' | 'Network';\n /** @example `15.4.1` */\n osVersion: string;\n}\n\nasync function getConnectedDevicesUsingNativeToolsAsync(): Promise<ConnectedDevice[]> {\n return (\n (await devicectl.getConnectedAppleDevicesAsync())\n // Filter out unpaired devices.\n // TODO: We could improve this logic in the future to attempt pairing if specified.\n .filter((device) => device.connectionProperties.pairingState === 'paired')\n .map((device) => {\n return {\n name: device.deviceProperties.name,\n model: device.hardwareProperties.productType,\n osVersion: device.deviceProperties.osVersionNumber,\n udid: device.hardwareProperties.udid,\n deviceType: 'device',\n connectionType:\n device.connectionProperties.transportType === 'localNetwork' ? 'Network' : 'USB',\n };\n })\n );\n}\n\n/** @returns a list of connected Apple devices. */\nexport async function getConnectedDevicesAsync(): Promise<ConnectedDevice[]> {\n const devices = await Promise.all([\n // Prioritize native tools since they can provide more accurate information.\n // NOTE: xcrun is substantially slower than custom tooling. +1.5s vs 9ms.\n profile(getConnectedDevicesUsingNativeToolsAsync)(),\n profile(getConnectedDevicesUsingCustomToolingAsync)(),\n ]);\n\n return uniqBy(devices.flat(), (device) => device.udid);\n}\n\n/**\n * This supports devices that are running OS versions older than iOS 17.\n *\n * @returns a list of connected Apple devices.\n */\nasync function getConnectedDevicesUsingCustomToolingAsync(): Promise<ConnectedDevice[]> {\n const client = new UsbmuxdClient(UsbmuxdClient.connectUsbmuxdSocket());\n const devices = await client.getDevices();\n client.socket.end();\n\n return Promise.all(\n devices.map(async (device): Promise<ConnectedDevice> => {\n const socket = await new UsbmuxdClient(UsbmuxdClient.connectUsbmuxdSocket()).connect(\n device,\n 62078\n );\n const deviceValues = await new LockdowndClient(socket).getAllValues();\n socket.end();\n // TODO(EvanBacon): Add support for osType (ipad, watchos, etc)\n return {\n // TODO(EvanBacon): Better name\n name: deviceValues.DeviceName ?? deviceValues.ProductType ?? 'unknown iOS device',\n model: deviceValues.ProductType,\n osVersion: deviceValues.ProductVersion,\n deviceType: 'device',\n connectionType: device.Properties.ConnectionType,\n udid: device.Properties.SerialNumber,\n };\n })\n );\n}\n\n/** Install and run an Apple app binary on a connected Apple device. */\nexport async function runOnDevice({\n udid,\n appPath,\n bundleId,\n waitForApp,\n deltaPath,\n onProgress,\n}: {\n /** Apple device UDID */\n udid: string;\n /** File path to the app binary (ipa) */\n appPath: string;\n /** Bundle identifier for the app at `appPath` */\n bundleId: string;\n /** Wait for the app to launch before returning */\n waitForApp: boolean;\n /** File path to the app deltas folder to use for faster subsequent installs */\n deltaPath: string;\n /** Callback to be called with progress updates */\n onProgress: OnInstallProgressCallback;\n}) {\n debug('Running on device:', { udid, appPath, bundleId, waitForApp, deltaPath });\n\n const clientManager = await ClientManager.create(udid);\n\n try {\n await mountDeveloperDiskImage(clientManager);\n\n const packageName = path.basename(appPath);\n const destPackagePath = path.join('PublicStaging', packageName);\n\n await uploadApp(clientManager, { appBinaryPath: appPath, destinationPath: destPackagePath });\n\n const installer = await clientManager.getInstallationProxyClient();\n await installer.installApp(\n destPackagePath,\n bundleId,\n {\n // https://github.com/ios-control/ios-deploy/blob/0f2ffb1e564aa67a2dfca7cdf13de47ce489d835/src/ios-deploy/ios-deploy.m#L2491-L2508\n ApplicationsType: 'Any',\n\n CFBundleIdentifier: bundleId,\n CloseOnInvalidate: '1',\n InvalidateOnDetach: '1',\n IsUserInitiated: '1',\n // Disable checking for wifi devices, this is nominally faster.\n PreferWifi: '0',\n // Only info I could find on these:\n // https://github.com/wwxxyx/Quectel_BG96/blob/310876f90fc1093a59e45e381160eddcc31697d0/Apple_Homekit/homekit_certification_tools/ATS%206/ATS%206/ATS.app/Contents/Frameworks/CaptureKit.framework/Versions/A/Resources/MobileDevice/MobileInstallation.h#L112-L121\n PackageType: 'Developer',\n ShadowParentKey: deltaPath,\n // SkipUninstall: '1'\n },\n onProgress\n );\n\n const {\n // TODO(EvanBacon): This can be undefined when querying App Clips.\n [bundleId]: appInfo,\n } = await installer.lookupApp([bundleId]);\n\n if (appInfo) {\n // launch fails with EBusy or ENotFound if you try to launch immediately after install\n await delayAsync(200);\n const debugServerClient = await launchApp(clientManager, {\n bundleId,\n appInfo,\n detach: !waitForApp,\n });\n\n if (waitForApp && debugServerClient) {\n installExitHooks(async () => {\n // causes continue() to return\n debugServerClient.halt();\n // give continue() time to return response\n await delayAsync(64);\n });\n\n debug(`Waiting for app to close...\\n`);\n const result = await debugServerClient.continue();\n // TODO: I have no idea what this packet means yet (successful close?)\n // if not a close (ie, most likely due to halt from onBeforeExit), then kill the app\n if (result !== 'W00') {\n await debugServerClient.kill();\n }\n }\n } else {\n Log.warn(`App \"${bundleId}\" installed but couldn't be launched. Open on device manually.`);\n }\n } finally {\n clientManager.end();\n }\n}\n\n/** Mount the developer disk image for Xcode. */\nasync function mountDeveloperDiskImage(clientManager: ClientManager) {\n const imageMounter = await clientManager.getMobileImageMounterClient();\n // Check if already mounted. If not, mount.\n if (!(await imageMounter.lookupImage()).ImageSignature) {\n // verify DeveloperDiskImage exists (TODO: how does this work on Windows/Linux?)\n // TODO: if windows/linux, download?\n const version = await (await clientManager.getLockdowndClient()).getValue('ProductVersion');\n const developerDiskImagePath = await XcodeDeveloperDiskImagePrerequisite.instance.assertAsync({\n version,\n });\n const developerDiskImageSig = fs.readFileSync(`${developerDiskImagePath}.signature`);\n await imageMounter.uploadImage(developerDiskImagePath, developerDiskImageSig);\n await imageMounter.mountImage(developerDiskImagePath, developerDiskImageSig);\n }\n}\n\nasync function uploadApp(\n clientManager: ClientManager,\n { appBinaryPath, destinationPath }: { appBinaryPath: string; destinationPath: string }\n) {\n const afcClient = await clientManager.getAFCClient();\n try {\n await afcClient.getFileInfo('PublicStaging');\n } catch (err: any) {\n if (err instanceof AFCError && err.status === AFC_STATUS.OBJECT_NOT_FOUND) {\n await afcClient.makeDirectory('PublicStaging');\n } else {\n throw err;\n }\n }\n await afcClient.uploadDirectory(appBinaryPath, destinationPath);\n}\n\nasync function launchAppWithUsbmux(\n clientManager: ClientManager,\n { appInfo, detach }: { appInfo: IPLookupResult[string]; detach?: boolean }\n) {\n let tries = 0;\n while (tries < 3) {\n const debugServerClient = await clientManager.getDebugserverClient();\n await debugServerClient.setMaxPacketSize(1024);\n await debugServerClient.setWorkingDir(appInfo.Container);\n await debugServerClient.launchApp(appInfo.Path, appInfo.CFBundleExecutable);\n\n const result = await debugServerClient.checkLaunchSuccess();\n if (result === 'OK') {\n if (detach) {\n // https://github.com/libimobiledevice/libimobiledevice/blob/25059d4c7d75e03aab516af2929d7c6e6d4c17de/tools/idevicedebug.c#L455-L464\n const res = await debugServerClient.sendCommand('D', []);\n debug('Disconnect from debug server request:', res);\n if (res !== 'OK') {\n console.warn(\n 'Something went wrong while attempting to disconnect from iOS debug server, you may need to reopen the app manually.'\n );\n }\n }\n\n return debugServerClient;\n } else if (result === 'EBusy' || result === 'ENotFound') {\n debug('Device busy or app not found, trying to launch again in .5s...');\n tries++;\n debugServerClient.socket.end();\n await delayAsync(500);\n } else {\n throw new CommandError(`There was an error launching app: ${result}`);\n }\n }\n throw new CommandError('Unable to launch app, number of tries exceeded');\n}\n\n/**\n * iOS 17 introduces a new protocol called RemoteXPC.\n * This is not yet implemented, so we fallback to devicectl.\n *\n * @see https://github.com/doronz88/pymobiledevice3/blob/master/misc/RemoteXPC.md#process-remoted\n */\nasync function launchApp(\n clientManager: ClientManager,\n {\n bundleId,\n appInfo,\n detach,\n }: { bundleId: string; appInfo: IPLookupResult[string]; detach?: boolean }\n) {\n try {\n return await launchAppWithUsbmux(clientManager, { appInfo, detach });\n } catch (error) {\n debug('Failed to launch app with Usbmuxd, falling back to xcrun...', error);\n\n // Get the device UDID and close the connection, to allow `xcrun devicectl` to connect\n const deviceId = clientManager.device.Properties.SerialNumber;\n clientManager.end();\n\n // Fallback to devicectl for iOS 17 support\n return await launchAppWithDeviceCtl(deviceId, bundleId);\n }\n}\n"],"names":["getConnectedDevicesAsync","runOnDevice","debug","Debug","getConnectedDevicesUsingNativeToolsAsync","devicectl","getConnectedAppleDevicesAsync","filter","device","connectionProperties","pairingState","map","name","deviceProperties","model","hardwareProperties","productType","osVersion","osVersionNumber","udid","deviceType","connectionType","transportType","devices","Promise","all","profile","getConnectedDevicesUsingCustomToolingAsync","uniqBy","flat","client","UsbmuxdClient","connectUsbmuxdSocket","getDevices","socket","end","connect","deviceValues","LockdowndClient","getAllValues","DeviceName","ProductType","ProductVersion","Properties","ConnectionType","SerialNumber","appPath","bundleId","waitForApp","deltaPath","onProgress","clientManager","ClientManager","create","mountDeveloperDiskImage","packageName","path","basename","destPackagePath","join","uploadApp","appBinaryPath","destinationPath","installer","getInstallationProxyClient","installApp","ApplicationsType","CFBundleIdentifier","CloseOnInvalidate","InvalidateOnDetach","IsUserInitiated","PreferWifi","PackageType","ShadowParentKey","appInfo","lookupApp","delayAsync","debugServerClient","launchApp","detach","installExitHooks","halt","result","continue","kill","Log","warn","imageMounter","getMobileImageMounterClient","lookupImage","ImageSignature","version","getLockdowndClient","getValue","developerDiskImagePath","XcodeDeveloperDiskImagePrerequisite","instance","assertAsync","developerDiskImageSig","fs","readFileSync","uploadImage","mountImage","afcClient","getAFCClient","getFileInfo","err","AFCError","status","AFC_STATUS","OBJECT_NOT_FOUND","makeDirectory","uploadDirectory","launchAppWithUsbmux","tries","getDebugserverClient","setMaxPacketSize","setWorkingDir","Container","Path","CFBundleExecutable","checkLaunchSuccess","res","sendCommand","console","CommandError","error","deviceId","launchAppWithDeviceCtl"],"mappings":"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"}
|
|
@@ -34,6 +34,7 @@ function _path() {
|
|
|
34
34
|
return data;
|
|
35
35
|
}
|
|
36
36
|
const _appleDevice = /*#__PURE__*/ _interopRequireWildcard(require("./AppleDevice"));
|
|
37
|
+
const _devicectl = /*#__PURE__*/ _interopRequireWildcard(require("../../../start/platforms/ios/devicectl"));
|
|
37
38
|
const _dir = require("../../../utils/dir");
|
|
38
39
|
const _errors = require("../../../utils/errors");
|
|
39
40
|
const _interactive = require("../../../utils/interactive");
|
|
@@ -112,6 +113,19 @@ async function installOnDeviceAsync(props) {
|
|
|
112
113
|
}
|
|
113
114
|
});
|
|
114
115
|
} catch (error) {
|
|
116
|
+
if (error instanceof _errors.CommandError) {
|
|
117
|
+
if (error.code === "APPLE_DEVICE_USBMUXD") {
|
|
118
|
+
// Couldn't find device, could be OTA...
|
|
119
|
+
// Fallback on much slower devicectl method which supports OTA installs.
|
|
120
|
+
if (_devicectl.hasDevicectlEverBeenInstalled()) {
|
|
121
|
+
// This should never happen.
|
|
122
|
+
if (indicator) {
|
|
123
|
+
indicator.clear();
|
|
124
|
+
}
|
|
125
|
+
return await _devicectl.installAndLaunchAppAsync(props);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
115
129
|
if (indicator) {
|
|
116
130
|
indicator.fail();
|
|
117
131
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/run/ios/appleDevice/installOnDeviceAsync.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { Ora } from 'ora';\nimport os from 'os';\nimport path from 'path';\n\nimport * as AppleDevice from './AppleDevice';\nimport { ensureDirectory } from '../../../utils/dir';\nimport { CommandError } from '../../../utils/errors';\nimport { isInteractive } from '../../../utils/interactive';\nimport { ora } from '../../../utils/ora';\nimport { confirmAsync } from '../../../utils/prompts';\n\n/** Get the app_delta folder for faster subsequent rebuilds on devices. */\nexport function getAppDeltaDirectory(bundleId: string): string {\n // TODO: Maybe use .expo folder instead for debugging\n // TODO: Reuse existing folder from xcode?\n const deltaFolder = path.join(os.tmpdir(), 'ios', 'app-delta', bundleId);\n ensureDirectory(deltaFolder);\n return deltaFolder;\n}\n\n/**\n * Wraps the apple device method for installing and running an app,\n * adds indicator and retry loop for when the device is locked.\n */\nexport async function installOnDeviceAsync(props: {\n bundle: string;\n bundleIdentifier: string;\n appDeltaDirectory: string;\n udid: string;\n deviceName: string;\n}): Promise<void> {\n const { bundle, bundleIdentifier, appDeltaDirectory, udid, deviceName } = props;\n let indicator: Ora | undefined;\n\n try {\n // TODO: Connect for logs\n await AppleDevice.runOnDevice({\n udid,\n appPath: bundle,\n bundleId: bundleIdentifier,\n waitForApp: false,\n deltaPath: appDeltaDirectory,\n onProgress({\n status,\n isComplete,\n progress,\n }: {\n status: string;\n isComplete: boolean;\n progress: number;\n }) {\n if (!indicator) {\n indicator = ora(status).start();\n }\n indicator.text = `${chalk.bold(status)} ${progress}%`;\n if (isComplete) {\n indicator.succeed();\n }\n },\n });\n } catch (error: any) {\n if (indicator) {\n indicator.fail();\n }\n if (error.code === 'APPLE_DEVICE_LOCKED') {\n // Get the app name from the binary path.\n const appName = path.basename(bundle).split('.')[0] ?? 'app';\n if (\n isInteractive() &&\n (await confirmAsync({\n message: `Cannot launch ${appName} because the device is locked. Unlock ${deviceName} to continue...`,\n initial: true,\n }))\n ) {\n return installOnDeviceAsync(props);\n }\n throw new CommandError(\n `Cannot launch ${appName} on ${deviceName} because the device is locked.`\n );\n }\n throw error;\n }\n}\n"],"names":["getAppDeltaDirectory","installOnDeviceAsync","bundleId","deltaFolder","path","join","os","tmpdir","ensureDirectory","props","bundle","bundleIdentifier","appDeltaDirectory","udid","deviceName","indicator","AppleDevice","runOnDevice","appPath","waitForApp","deltaPath","onProgress","status","isComplete","progress","ora","start","text","chalk","bold","succeed","error","
|
|
1
|
+
{"version":3,"sources":["../../../../../src/run/ios/appleDevice/installOnDeviceAsync.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { Ora } from 'ora';\nimport os from 'os';\nimport path from 'path';\n\nimport * as AppleDevice from './AppleDevice';\nimport * as devicectl from '../../../start/platforms/ios/devicectl';\nimport { ensureDirectory } from '../../../utils/dir';\nimport { CommandError } from '../../../utils/errors';\nimport { isInteractive } from '../../../utils/interactive';\nimport { ora } from '../../../utils/ora';\nimport { confirmAsync } from '../../../utils/prompts';\n\n/** Get the app_delta folder for faster subsequent rebuilds on devices. */\nexport function getAppDeltaDirectory(bundleId: string): string {\n // TODO: Maybe use .expo folder instead for debugging\n // TODO: Reuse existing folder from xcode?\n const deltaFolder = path.join(os.tmpdir(), 'ios', 'app-delta', bundleId);\n ensureDirectory(deltaFolder);\n return deltaFolder;\n}\n\n/**\n * Wraps the apple device method for installing and running an app,\n * adds indicator and retry loop for when the device is locked.\n */\nexport async function installOnDeviceAsync(props: {\n bundle: string;\n bundleIdentifier: string;\n appDeltaDirectory: string;\n udid: string;\n deviceName: string;\n}): Promise<void> {\n const { bundle, bundleIdentifier, appDeltaDirectory, udid, deviceName } = props;\n let indicator: Ora | undefined;\n\n try {\n // TODO: Connect for logs\n await AppleDevice.runOnDevice({\n udid,\n appPath: bundle,\n bundleId: bundleIdentifier,\n waitForApp: false,\n deltaPath: appDeltaDirectory,\n onProgress({\n status,\n isComplete,\n progress,\n }: {\n status: string;\n isComplete: boolean;\n progress: number;\n }) {\n if (!indicator) {\n indicator = ora(status).start();\n }\n indicator.text = `${chalk.bold(status)} ${progress}%`;\n if (isComplete) {\n indicator.succeed();\n }\n },\n });\n } catch (error: any) {\n if (error instanceof CommandError) {\n if (error.code === 'APPLE_DEVICE_USBMUXD') {\n // Couldn't find device, could be OTA...\n // Fallback on much slower devicectl method which supports OTA installs.\n if (devicectl.hasDevicectlEverBeenInstalled()) {\n // This should never happen.\n if (indicator) {\n indicator.clear();\n }\n return await devicectl.installAndLaunchAppAsync(props);\n }\n }\n }\n\n if (indicator) {\n indicator.fail();\n }\n if (error.code === 'APPLE_DEVICE_LOCKED') {\n // Get the app name from the binary path.\n const appName = path.basename(bundle).split('.')[0] ?? 'app';\n if (\n isInteractive() &&\n (await confirmAsync({\n message: `Cannot launch ${appName} because the device is locked. Unlock ${deviceName} to continue...`,\n initial: true,\n }))\n ) {\n return installOnDeviceAsync(props);\n }\n throw new CommandError(\n `Cannot launch ${appName} on ${deviceName} because the device is locked.`\n );\n }\n throw error;\n }\n}\n"],"names":["getAppDeltaDirectory","installOnDeviceAsync","bundleId","deltaFolder","path","join","os","tmpdir","ensureDirectory","props","bundle","bundleIdentifier","appDeltaDirectory","udid","deviceName","indicator","AppleDevice","runOnDevice","appPath","waitForApp","deltaPath","onProgress","status","isComplete","progress","ora","start","text","chalk","bold","succeed","error","CommandError","code","devicectl","hasDevicectlEverBeenInstalled","clear","installAndLaunchAppAsync","fail","appName","basename","split","isInteractive","confirmAsync","message","initial"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/doctor/dependencies/ensureDependenciesAsync.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport chalk from 'chalk';\nimport wrapAnsi from 'wrap-ansi';\n\nimport { getMissingPackagesAsync, ResolvedPackage } from './getMissingPackages';\nimport { installAsync } from '../../../install/installAsync';\nimport * as Log from '../../../log';\nimport { CommandError } from '../../../utils/errors';\nimport { isInteractive } from '../../../utils/interactive';\nimport { logNewSection } from '../../../utils/ora';\nimport { confirmAsync } from '../../../utils/prompts';\n\nexport async function ensureDependenciesAsync(\n projectRoot: string,\n {\n exp = getConfig(projectRoot).exp,\n requiredPackages,\n warningMessage,\n installMessage,\n // Don't prompt in CI\n skipPrompt = !isInteractive(),\n isProjectMutable = isInteractive(),\n }:
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/doctor/dependencies/ensureDependenciesAsync.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport chalk from 'chalk';\nimport wrapAnsi from 'wrap-ansi';\n\nimport { getMissingPackagesAsync, ResolvedPackage } from './getMissingPackages';\nimport { installAsync } from '../../../install/installAsync';\nimport * as Log from '../../../log';\nimport { CommandError } from '../../../utils/errors';\nimport { isInteractive } from '../../../utils/interactive';\nimport { logNewSection } from '../../../utils/ora';\nimport { confirmAsync } from '../../../utils/prompts';\n\nexport type EnsureDependenciesOptions = {\n /** The packages and/or version ranges that should be enforced in the project */\n requiredPackages: ResolvedPackage[];\n /** The user-facing message when the required packages are missing or incorrect */\n installMessage: string;\n /** The user-facing message when users aborted the installation */\n warningMessage: string;\n /** A previously loaded Expo configuration (loads when omitted) */\n exp?: ExpoConfig;\n /** If the prompts asking users to install should be skipped (defaults to false, in CI defaults to true) */\n skipPrompt?: boolean;\n /** Project can be mutated in the current environment (defaults to true, in CI defaults to false) */\n isProjectMutable?: boolean;\n};\n\nexport async function ensureDependenciesAsync(\n projectRoot: string,\n {\n exp = getConfig(projectRoot).exp,\n requiredPackages,\n warningMessage,\n installMessage,\n // Don't prompt in CI\n skipPrompt = !isInteractive(),\n isProjectMutable = isInteractive(),\n }: EnsureDependenciesOptions\n): Promise<boolean> {\n const { missing } = await getMissingPackagesAsync(projectRoot, {\n sdkVersion: exp.sdkVersion,\n requiredPackages,\n });\n if (!missing.length) {\n return true;\n }\n\n // Prompt to install or bail out...\n const readableMissingPackages = missing\n .map(({ pkg, version }) => (version ? [pkg, version].join('@') : pkg))\n .join(', ');\n\n let title = installMessage;\n\n if (skipPrompt && !isProjectMutable) {\n title += '\\n\\n';\n } else {\n let confirm = skipPrompt;\n if (skipPrompt) {\n // Automatically install packages without prompting.\n Log.log(wrapForTerminal(title + ` Installing ${chalk.cyan(readableMissingPackages)}`));\n } else {\n confirm = await confirmAsync({\n message: wrapForTerminal(\n title + ` Would you like to install ${chalk.cyan(readableMissingPackages)}?`\n ),\n initial: true,\n });\n }\n\n if (confirm) {\n // Format with version if available.\n const [packages, devPackages] = missing.reduce(\n ([deps, devDeps], p) => {\n const pkg = p.version ? [p.pkg, p.version].join('@') : p.pkg;\n if (p.dev) {\n return [deps, devDeps.concat(pkg)];\n }\n return [deps.concat(pkg), devDeps];\n },\n [[], []] as [string[], string[]]\n );\n\n if (packages.length) {\n await installPackagesAsync(projectRoot, {\n packages,\n });\n }\n\n if (devPackages.length) {\n await installPackagesAsync(projectRoot, {\n packages: devPackages,\n dev: true,\n });\n }\n\n // Try again but skip prompting twice, simply fail if the packages didn't install correctly.\n return await ensureDependenciesAsync(projectRoot, {\n skipPrompt: true,\n installMessage,\n warningMessage,\n requiredPackages,\n });\n }\n\n // Reset the title so it doesn't print twice in interactive mode.\n title = '';\n }\n\n const installCommand = 'npx expo install ' + missing.map(({ pkg }) => pkg).join(' ');\n\n const disableMessage = warningMessage;\n\n const solution = `Please install ${chalk.bold(\n readableMissingPackages\n )} by running:\\n\\n ${chalk.reset.bold(installCommand)}\\n\\n`;\n\n // This prevents users from starting a misconfigured JS or TS project by default.\n throw new CommandError(wrapForTerminal(title + solution + disableMessage + '\\n'));\n}\n\n/** Wrap long messages to fit smaller terminals. */\nfunction wrapForTerminal(message: string): string {\n return wrapAnsi(message, process.stdout.columns || 80);\n}\n\n/** Create the bash install command from a given set of packages and settings. */\nexport function createInstallCommand({\n packages,\n}: {\n packages: {\n file: string;\n pkg: string;\n version?: string | undefined;\n }[];\n}) {\n return 'npx expo install ' + packages.map(({ pkg }) => pkg).join(' ');\n}\n\n/** Install packages in the project. */\nasync function installPackagesAsync(\n projectRoot: string,\n { packages, dev }: { packages: string[]; dev?: boolean }\n) {\n const packagesStr = chalk.bold(packages.join(', '));\n Log.log();\n const installingPackageStep = logNewSection(`Installing ${packagesStr}`);\n try {\n await installAsync(packages, { projectRoot, dev });\n } catch (e: any) {\n installingPackageStep.fail(`Failed to install ${packagesStr} with error: ${e.message}`);\n throw e;\n }\n installingPackageStep.succeed(`Installed ${packagesStr}`);\n}\n"],"names":["ensureDependenciesAsync","createInstallCommand","projectRoot","exp","getConfig","requiredPackages","warningMessage","installMessage","skipPrompt","isInteractive","isProjectMutable","missing","getMissingPackagesAsync","sdkVersion","length","readableMissingPackages","map","pkg","version","join","title","confirm","Log","log","wrapForTerminal","chalk","cyan","confirmAsync","message","initial","packages","devPackages","reduce","deps","devDeps","p","dev","concat","installPackagesAsync","installCommand","disableMessage","solution","bold","reset","CommandError","wrapAnsi","process","stdout","columns","packagesStr","installingPackageStep","logNewSection","installAsync","e","fail","succeed"],"mappings":"AAAA;;;;;;;;;;;IA2BsBA,uBAAuB,MAAvBA,uBAAuB;IAoG7BC,oBAAoB,MAApBA,oBAAoB;;;yBA/HE,cAAc;;;;;;;8DAClC,OAAO;;;;;;;8DACJ,WAAW;;;;;;oCAEyB,sBAAsB;8BAClD,+BAA+B;2DACvC,cAAc;wBACN,uBAAuB;6BACtB,4BAA4B;qBAC5B,oBAAoB;yBACrB,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiB9C,eAAeD,uBAAuB,CAC3CE,WAAmB,EACnB,EACEC,GAAG,EAAGC,IAAAA,OAAS,EAAA,UAAA,EAACF,WAAW,CAAC,CAACC,GAAG,CAAA,EAChCE,gBAAgB,CAAA,EAChBC,cAAc,CAAA,EACdC,cAAc,CAAA,EACd,qBAAqB;AACrBC,UAAU,EAAG,CAACC,IAAAA,YAAa,cAAA,GAAE,CAAA,EAC7BC,gBAAgB,EAAGD,IAAAA,YAAa,cAAA,GAAE,CAAA,EACR,EACV;IAClB,MAAM,EAAEE,OAAO,CAAA,EAAE,GAAG,MAAMC,IAAAA,mBAAuB,wBAAA,EAACV,WAAW,EAAE;QAC7DW,UAAU,EAAEV,GAAG,CAACU,UAAU;QAC1BR,gBAAgB;KACjB,CAAC,AAAC;IACH,IAAI,CAACM,OAAO,CAACG,MAAM,EAAE;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mCAAmC;IACnC,MAAMC,uBAAuB,GAAGJ,OAAO,CACpCK,GAAG,CAAC,CAAC,EAAEC,GAAG,CAAA,EAAEC,OAAO,CAAA,EAAE,GAAMA,OAAO,GAAG;YAACD,GAAG;YAAEC,OAAO;SAAC,CAACC,IAAI,CAAC,GAAG,CAAC,GAAGF,GAAG,AAAC,CAAC,CACrEE,IAAI,CAAC,IAAI,CAAC,AAAC;IAEd,IAAIC,KAAK,GAAGb,cAAc,AAAC;IAE3B,IAAIC,UAAU,IAAI,CAACE,gBAAgB,EAAE;QACnCU,KAAK,IAAI,MAAM,CAAC;IAClB,OAAO;QACL,IAAIC,OAAO,GAAGb,UAAU,AAAC;QACzB,IAAIA,UAAU,EAAE;YACd,oDAAoD;YACpDc,IAAG,CAACC,GAAG,CAACC,eAAe,CAACJ,KAAK,GAAG,CAAC,YAAY,EAAEK,MAAK,EAAA,QAAA,CAACC,IAAI,CAACX,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzF,OAAO;YACLM,OAAO,GAAG,MAAMM,IAAAA,QAAY,aAAA,EAAC;gBAC3BC,OAAO,EAAEJ,eAAe,CACtBJ,KAAK,GAAG,CAAC,2BAA2B,EAAEK,MAAK,EAAA,QAAA,CAACC,IAAI,CAACX,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAC7E;gBACDc,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;QAED,IAAIR,OAAO,EAAE;YACX,oCAAoC;YACpC,MAAM,CAACS,QAAQ,EAAEC,WAAW,CAAC,GAAGpB,OAAO,CAACqB,MAAM,CAC5C,CAAC,CAACC,IAAI,EAAEC,OAAO,CAAC,EAAEC,CAAC,GAAK;gBACtB,MAAMlB,GAAG,GAAGkB,CAAC,CAACjB,OAAO,GAAG;oBAACiB,CAAC,CAAClB,GAAG;oBAAEkB,CAAC,CAACjB,OAAO;iBAAC,CAACC,IAAI,CAAC,GAAG,CAAC,GAAGgB,CAAC,CAAClB,GAAG,AAAC;gBAC7D,IAAIkB,CAAC,CAACC,GAAG,EAAE;oBACT,OAAO;wBAACH,IAAI;wBAAEC,OAAO,CAACG,MAAM,CAACpB,GAAG,CAAC;qBAAC,CAAC;gBACrC,CAAC;gBACD,OAAO;oBAACgB,IAAI,CAACI,MAAM,CAACpB,GAAG,CAAC;oBAAEiB,OAAO;iBAAC,CAAC;YACrC,CAAC,EACD;gBAAC,EAAE;gBAAE,EAAE;aAAC,CACT,AAAC;YAEF,IAAIJ,QAAQ,CAAChB,MAAM,EAAE;gBACnB,MAAMwB,oBAAoB,CAACpC,WAAW,EAAE;oBACtC4B,QAAQ;iBACT,CAAC,CAAC;YACL,CAAC;YAED,IAAIC,WAAW,CAACjB,MAAM,EAAE;gBACtB,MAAMwB,oBAAoB,CAACpC,WAAW,EAAE;oBACtC4B,QAAQ,EAAEC,WAAW;oBACrBK,GAAG,EAAE,IAAI;iBACV,CAAC,CAAC;YACL,CAAC;YAED,4FAA4F;YAC5F,OAAO,MAAMpC,uBAAuB,CAACE,WAAW,EAAE;gBAChDM,UAAU,EAAE,IAAI;gBAChBD,cAAc;gBACdD,cAAc;gBACdD,gBAAgB;aACjB,CAAC,CAAC;QACL,CAAC;QAED,iEAAiE;QACjEe,KAAK,GAAG,EAAE,CAAC;IACb,CAAC;IAED,MAAMmB,cAAc,GAAG,mBAAmB,GAAG5B,OAAO,CAACK,GAAG,CAAC,CAAC,EAAEC,GAAG,CAAA,EAAE,GAAKA,GAAG,CAAC,CAACE,IAAI,CAAC,GAAG,CAAC,AAAC;IAErF,MAAMqB,cAAc,GAAGlC,cAAc,AAAC;IAEtC,MAAMmC,QAAQ,GAAG,CAAC,eAAe,EAAEhB,MAAK,EAAA,QAAA,CAACiB,IAAI,CAC3C3B,uBAAuB,CACxB,CAAC,kBAAkB,EAAEU,MAAK,EAAA,QAAA,CAACkB,KAAK,CAACD,IAAI,CAACH,cAAc,CAAC,CAAC,IAAI,CAAC,AAAC;IAE7D,iFAAiF;IACjF,MAAM,IAAIK,OAAY,aAAA,CAACpB,eAAe,CAACJ,KAAK,GAAGqB,QAAQ,GAAGD,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,kDAAkD,GAClD,SAAShB,eAAe,CAACI,OAAe,EAAU;IAChD,OAAOiB,IAAAA,SAAQ,EAAA,QAAA,EAACjB,OAAO,EAAEkB,OAAO,CAACC,MAAM,CAACC,OAAO,IAAI,EAAE,CAAC,CAAC;AACzD,CAAC;AAGM,SAAS/C,oBAAoB,CAAC,EACnC6B,QAAQ,CAAA,EAOT,EAAE;IACD,OAAO,mBAAmB,GAAGA,QAAQ,CAACd,GAAG,CAAC,CAAC,EAAEC,GAAG,CAAA,EAAE,GAAKA,GAAG,CAAC,CAACE,IAAI,CAAC,GAAG,CAAC,CAAC;AACxE,CAAC;AAED,qCAAqC,GACrC,eAAemB,oBAAoB,CACjCpC,WAAmB,EACnB,EAAE4B,QAAQ,CAAA,EAAEM,GAAG,CAAA,EAAyC,EACxD;IACA,MAAMa,WAAW,GAAGxB,MAAK,EAAA,QAAA,CAACiB,IAAI,CAACZ,QAAQ,CAACX,IAAI,CAAC,IAAI,CAAC,CAAC,AAAC;IACpDG,IAAG,CAACC,GAAG,EAAE,CAAC;IACV,MAAM2B,qBAAqB,GAAGC,IAAAA,IAAa,cAAA,EAAC,CAAC,WAAW,EAAEF,WAAW,CAAC,CAAC,CAAC,AAAC;IACzE,IAAI;QACF,MAAMG,IAAAA,aAAY,aAAA,EAACtB,QAAQ,EAAE;YAAE5B,WAAW;YAAEkC,GAAG;SAAE,CAAC,CAAC;IACrD,EAAE,OAAOiB,CAAC,EAAO;QACfH,qBAAqB,CAACI,IAAI,CAAC,CAAC,kBAAkB,EAAEL,WAAW,CAAC,aAAa,EAAEI,CAAC,CAACzB,OAAO,CAAC,CAAC,CAAC,CAAC;QACxF,MAAMyB,CAAC,CAAC;IACV,CAAC;IACDH,qBAAqB,CAACK,OAAO,CAAC,CAAC,UAAU,EAAEN,WAAW,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright © 2024 650 Industries.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*/ "use strict";
|
|
7
|
+
Object.defineProperty(exports, "__esModule", {
|
|
8
|
+
value: true
|
|
9
|
+
});
|
|
10
|
+
function _export(target, all) {
|
|
11
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
get: all[name]
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
_export(exports, {
|
|
17
|
+
devicectlAsync: ()=>devicectlAsync,
|
|
18
|
+
getConnectedAppleDevicesAsync: ()=>getConnectedAppleDevicesAsync,
|
|
19
|
+
launchAppWithDeviceCtl: ()=>launchAppWithDeviceCtl,
|
|
20
|
+
hasDevicectlEverBeenInstalled: ()=>hasDevicectlEverBeenInstalled,
|
|
21
|
+
installAndLaunchAppAsync: ()=>installAndLaunchAppAsync
|
|
22
|
+
});
|
|
23
|
+
function _getUserState() {
|
|
24
|
+
const data = require("@expo/config/build/getUserState");
|
|
25
|
+
_getUserState = function() {
|
|
26
|
+
return data;
|
|
27
|
+
};
|
|
28
|
+
return data;
|
|
29
|
+
}
|
|
30
|
+
function _jsonFile() {
|
|
31
|
+
const data = /*#__PURE__*/ _interopRequireDefault(require("@expo/json-file"));
|
|
32
|
+
_jsonFile = function() {
|
|
33
|
+
return data;
|
|
34
|
+
};
|
|
35
|
+
return data;
|
|
36
|
+
}
|
|
37
|
+
function _chalk() {
|
|
38
|
+
const data = /*#__PURE__*/ _interopRequireDefault(require("chalk"));
|
|
39
|
+
_chalk = function() {
|
|
40
|
+
return data;
|
|
41
|
+
};
|
|
42
|
+
return data;
|
|
43
|
+
}
|
|
44
|
+
function _childProcess() {
|
|
45
|
+
const data = require("child_process");
|
|
46
|
+
_childProcess = function() {
|
|
47
|
+
return data;
|
|
48
|
+
};
|
|
49
|
+
return data;
|
|
50
|
+
}
|
|
51
|
+
function _fs() {
|
|
52
|
+
const data = /*#__PURE__*/ _interopRequireDefault(require("fs"));
|
|
53
|
+
_fs = function() {
|
|
54
|
+
return data;
|
|
55
|
+
};
|
|
56
|
+
return data;
|
|
57
|
+
}
|
|
58
|
+
function _nodeAssert() {
|
|
59
|
+
const data = /*#__PURE__*/ _interopRequireDefault(require("node:assert"));
|
|
60
|
+
_nodeAssert = function() {
|
|
61
|
+
return data;
|
|
62
|
+
};
|
|
63
|
+
return data;
|
|
64
|
+
}
|
|
65
|
+
function _os() {
|
|
66
|
+
const data = require("os");
|
|
67
|
+
_os = function() {
|
|
68
|
+
return data;
|
|
69
|
+
};
|
|
70
|
+
return data;
|
|
71
|
+
}
|
|
72
|
+
function _path() {
|
|
73
|
+
const data = /*#__PURE__*/ _interopRequireDefault(require("path"));
|
|
74
|
+
_path = function() {
|
|
75
|
+
return data;
|
|
76
|
+
};
|
|
77
|
+
return data;
|
|
78
|
+
}
|
|
79
|
+
function _tempy() {
|
|
80
|
+
const data = /*#__PURE__*/ _interopRequireDefault(require("tempy"));
|
|
81
|
+
_tempy = function() {
|
|
82
|
+
return data;
|
|
83
|
+
};
|
|
84
|
+
return data;
|
|
85
|
+
}
|
|
86
|
+
const _xcrun = require("./xcrun");
|
|
87
|
+
const _log = /*#__PURE__*/ _interopRequireWildcard(require("../../../log"));
|
|
88
|
+
const _errors = require("../../../utils/errors");
|
|
89
|
+
const _exit = require("../../../utils/exit");
|
|
90
|
+
const _interactive = require("../../../utils/interactive");
|
|
91
|
+
const _ora = require("../../../utils/ora");
|
|
92
|
+
const _prompts = require("../../../utils/prompts");
|
|
93
|
+
function _interopRequireDefault(obj) {
|
|
94
|
+
return obj && obj.__esModule ? obj : {
|
|
95
|
+
default: obj
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
99
|
+
if (typeof WeakMap !== "function") return null;
|
|
100
|
+
var cacheBabelInterop = new WeakMap();
|
|
101
|
+
var cacheNodeInterop = new WeakMap();
|
|
102
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
103
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
104
|
+
})(nodeInterop);
|
|
105
|
+
}
|
|
106
|
+
function _interopRequireWildcard(obj, nodeInterop) {
|
|
107
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
108
|
+
return obj;
|
|
109
|
+
}
|
|
110
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
111
|
+
return {
|
|
112
|
+
default: obj
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
116
|
+
if (cache && cache.has(obj)) {
|
|
117
|
+
return cache.get(obj);
|
|
118
|
+
}
|
|
119
|
+
var newObj = {};
|
|
120
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
121
|
+
for(var key in obj){
|
|
122
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
123
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
124
|
+
if (desc && (desc.get || desc.set)) {
|
|
125
|
+
Object.defineProperty(newObj, key, desc);
|
|
126
|
+
} else {
|
|
127
|
+
newObj[key] = obj[key];
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
newObj.default = obj;
|
|
132
|
+
if (cache) {
|
|
133
|
+
cache.set(obj, newObj);
|
|
134
|
+
}
|
|
135
|
+
return newObj;
|
|
136
|
+
}
|
|
137
|
+
const DEVICE_CTL_EXISTS_PATH = _path().default.join((0, _getUserState().getExpoHomeDirectory)(), "devicectl-exists");
|
|
138
|
+
const debug = require("debug")("expo:devicectl");
|
|
139
|
+
async function devicectlAsync(args, options) {
|
|
140
|
+
try {
|
|
141
|
+
return await (0, _xcrun.xcrunAsync)([
|
|
142
|
+
"devicectl",
|
|
143
|
+
...args
|
|
144
|
+
], options);
|
|
145
|
+
} catch (error) {
|
|
146
|
+
if (error instanceof _errors.CommandError) {
|
|
147
|
+
throw error;
|
|
148
|
+
}
|
|
149
|
+
if ("stderr" in error) {
|
|
150
|
+
const errorCodes = getDeviceCtlErrorCodes(error.stderr);
|
|
151
|
+
if (errorCodes.includes("Locked")) {
|
|
152
|
+
throw new _errors.CommandError("APPLE_DEVICE_LOCKED", "Device is locked, unlock and try again.");
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
throw error;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
async function getConnectedAppleDevicesAsync() {
|
|
159
|
+
var ref, ref1;
|
|
160
|
+
if (!hasDevicectlEverBeenInstalled()) {
|
|
161
|
+
debug("devicectl not found, skipping remote Apple devices.");
|
|
162
|
+
return [];
|
|
163
|
+
}
|
|
164
|
+
const tmpPath = _tempy().default.file();
|
|
165
|
+
const devices = await devicectlAsync([
|
|
166
|
+
"list",
|
|
167
|
+
"devices",
|
|
168
|
+
"--json-output",
|
|
169
|
+
tmpPath,
|
|
170
|
+
// Give two seconds before timing out: between 5 and 9223372036854775807
|
|
171
|
+
"--timeout",
|
|
172
|
+
"5",
|
|
173
|
+
]);
|
|
174
|
+
debug(devices.stdout);
|
|
175
|
+
const devicesJson = await _jsonFile().default.readAsync(tmpPath);
|
|
176
|
+
if (((ref = devicesJson) == null ? void 0 : (ref1 = ref.info) == null ? void 0 : ref1.jsonVersion) !== 2) {
|
|
177
|
+
_log.warn("Unexpected devicectl JSON version output from devicectl. Connecting to physical Apple devices may not work as expected.");
|
|
178
|
+
}
|
|
179
|
+
assertDevicesJson(devicesJson);
|
|
180
|
+
return devicesJson.result.devices;
|
|
181
|
+
}
|
|
182
|
+
function assertDevicesJson(results) {
|
|
183
|
+
var ref;
|
|
184
|
+
(0, _nodeAssert().default)(results != null && "result" in results && Array.isArray(results == null ? void 0 : (ref = results.result) == null ? void 0 : ref.devices), "Malformed JSON output from devicectl: " + JSON.stringify(results, null, 2));
|
|
185
|
+
}
|
|
186
|
+
async function installAppWithDeviceCtlAsync(uuid, bundleIdOrAppPath, onProgress) {
|
|
187
|
+
// 𝝠 xcrun devicectl device install app --device 00001110-001111110110101A /Users/evanbacon/Library/Developer/Xcode/DerivedData/Router-hgbqaxzhrhkiftfweydvhgttadvn/Build/Products/Debug-iphoneos/Router.app --verbose
|
|
188
|
+
return new Promise((resolve, reject)=>{
|
|
189
|
+
const args = [
|
|
190
|
+
"devicectl",
|
|
191
|
+
"device",
|
|
192
|
+
"install",
|
|
193
|
+
"app",
|
|
194
|
+
"--device",
|
|
195
|
+
uuid,
|
|
196
|
+
bundleIdOrAppPath,
|
|
197
|
+
];
|
|
198
|
+
const childProcess = (0, _childProcess().spawn)("xcrun", args);
|
|
199
|
+
debug("xcrun " + args.join(" "));
|
|
200
|
+
let currentProgress = 0;
|
|
201
|
+
let hasStarted = false;
|
|
202
|
+
function updateProgress(progress) {
|
|
203
|
+
hasStarted = true;
|
|
204
|
+
if (progress <= currentProgress) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
currentProgress = progress;
|
|
208
|
+
onProgress({
|
|
209
|
+
progress,
|
|
210
|
+
isComplete: progress === 100,
|
|
211
|
+
status: "Installing"
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
childProcess.stdout.on("data", (data)=>{
|
|
215
|
+
// Sometimes more than one chunk comes at a time, here we split by system newline,
|
|
216
|
+
// then trim and filter.
|
|
217
|
+
const strings = data.toString().split(_os().EOL).map((value)=>value.trim());
|
|
218
|
+
strings.forEach((str)=>{
|
|
219
|
+
// Match the progress percentage:
|
|
220
|
+
// - '34%... 35%...' -> 34
|
|
221
|
+
// - '31%...' -> 31
|
|
222
|
+
// - 'Complete!' -> 100
|
|
223
|
+
const match = str.match(/(\d+)%\.\.\./);
|
|
224
|
+
if (match) {
|
|
225
|
+
updateProgress(parseInt(match[1], 10));
|
|
226
|
+
} else if (hasStarted) {
|
|
227
|
+
updateProgress(100);
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
debug("[stdout]:", strings);
|
|
231
|
+
});
|
|
232
|
+
childProcess.on("close", (code)=>{
|
|
233
|
+
debug("[close]: " + code);
|
|
234
|
+
if (code === 0) {
|
|
235
|
+
resolve();
|
|
236
|
+
} else {
|
|
237
|
+
const stderr = childProcess.stderr.read();
|
|
238
|
+
const err = new Error(stderr);
|
|
239
|
+
err.code = code;
|
|
240
|
+
detach(err);
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
const detach = async (err)=>{
|
|
244
|
+
off == null ? void 0 : off();
|
|
245
|
+
if (childProcess) {
|
|
246
|
+
return new Promise((resolve)=>{
|
|
247
|
+
childProcess == null ? void 0 : childProcess.on("close", resolve);
|
|
248
|
+
childProcess == null ? void 0 : childProcess.kill();
|
|
249
|
+
// childProcess = null;
|
|
250
|
+
reject(err != null ? err : new _errors.CommandError("detached"));
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
const off = (0, _exit.installExitHooks)(()=>detach());
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
async function launchAppWithDeviceCtl(deviceId, bundleId) {
|
|
258
|
+
try {
|
|
259
|
+
await devicectlAsync([
|
|
260
|
+
"device",
|
|
261
|
+
"process",
|
|
262
|
+
"launch",
|
|
263
|
+
"--device",
|
|
264
|
+
deviceId,
|
|
265
|
+
bundleId
|
|
266
|
+
]);
|
|
267
|
+
} catch (error) {
|
|
268
|
+
if (error instanceof _errors.CommandError) {
|
|
269
|
+
throw error;
|
|
270
|
+
}
|
|
271
|
+
throw new _errors.CommandError(`There was an error launching app: ${error}`);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/** Find all error codes from the output log */ function getDeviceCtlErrorCodes(log) {
|
|
275
|
+
return [
|
|
276
|
+
...log.matchAll(/BSErrorCodeDescription\s+=\s+(.*)$/gim)
|
|
277
|
+
].map(([_line, code])=>code);
|
|
278
|
+
}
|
|
279
|
+
let hasEverBeenInstalled;
|
|
280
|
+
function hasDevicectlEverBeenInstalled() {
|
|
281
|
+
if (hasEverBeenInstalled) return hasEverBeenInstalled;
|
|
282
|
+
// It doesn't appear possible for devicectl to ever be uninstalled. We can just check once and store this result forever
|
|
283
|
+
// to prevent cold boots of devicectl from slowing down all invocations of `expo run ios`
|
|
284
|
+
if (_fs().default.existsSync(DEVICE_CTL_EXISTS_PATH)) {
|
|
285
|
+
hasEverBeenInstalled = true;
|
|
286
|
+
return true;
|
|
287
|
+
}
|
|
288
|
+
const isInstalled = isDevicectlInstalled();
|
|
289
|
+
if (isInstalled) {
|
|
290
|
+
_fs().default.writeFileSync(DEVICE_CTL_EXISTS_PATH, "1");
|
|
291
|
+
}
|
|
292
|
+
hasEverBeenInstalled = isInstalled;
|
|
293
|
+
return isInstalled;
|
|
294
|
+
}
|
|
295
|
+
function isDevicectlInstalled() {
|
|
296
|
+
try {
|
|
297
|
+
(0, _childProcess().execSync)("xcrun devicectl --version", {
|
|
298
|
+
stdio: "ignore"
|
|
299
|
+
});
|
|
300
|
+
return true;
|
|
301
|
+
} catch {
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
async function installAndLaunchAppAsync(props) {
|
|
306
|
+
debug("Running on device:", props);
|
|
307
|
+
const { bundle , bundleIdentifier , udid , deviceName } = props;
|
|
308
|
+
let indicator;
|
|
309
|
+
try {
|
|
310
|
+
if (!indicator) {
|
|
311
|
+
indicator = (0, _ora.ora)(`Connecting to: ${props.deviceName}`).start();
|
|
312
|
+
}
|
|
313
|
+
await installAppWithDeviceCtlAsync(udid, bundle, ({ status , isComplete , progress })=>{
|
|
314
|
+
if (!indicator) {
|
|
315
|
+
indicator = (0, _ora.ora)(status).start();
|
|
316
|
+
}
|
|
317
|
+
indicator.text = `${_chalk().default.bold(status)} ${progress}%`;
|
|
318
|
+
if (isComplete) {
|
|
319
|
+
indicator.succeed();
|
|
320
|
+
}
|
|
321
|
+
});
|
|
322
|
+
} catch (error) {
|
|
323
|
+
if (indicator) {
|
|
324
|
+
indicator.fail();
|
|
325
|
+
}
|
|
326
|
+
throw error;
|
|
327
|
+
}
|
|
328
|
+
async function launchAppOptionally() {
|
|
329
|
+
try {
|
|
330
|
+
await launchAppWithDeviceCtl(udid, bundleIdentifier);
|
|
331
|
+
} catch (error) {
|
|
332
|
+
if (indicator) {
|
|
333
|
+
indicator.fail();
|
|
334
|
+
}
|
|
335
|
+
if (error.code === "APPLE_DEVICE_LOCKED") {
|
|
336
|
+
var ref;
|
|
337
|
+
// Get the app name from the binary path.
|
|
338
|
+
const appName = (ref = _path().default.basename(bundle).split(".")[0]) != null ? ref : "app";
|
|
339
|
+
if ((0, _interactive.isInteractive)() && await (0, _prompts.confirmAsync)({
|
|
340
|
+
message: `Cannot launch ${appName} because the device is locked. Unlock ${deviceName} to continue...`,
|
|
341
|
+
initial: true
|
|
342
|
+
})) {
|
|
343
|
+
return launchAppOptionally();
|
|
344
|
+
}
|
|
345
|
+
throw new _errors.CommandError(`Cannot launch ${appName} on ${deviceName} because the device is locked.`);
|
|
346
|
+
}
|
|
347
|
+
throw error;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
await launchAppOptionally();
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
//# sourceMappingURL=devicectl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/platforms/ios/devicectl.ts"],"sourcesContent":["/**\n * Copyright © 2024 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport { getExpoHomeDirectory } from '@expo/config/build/getUserState';\nimport JsonFile from '@expo/json-file';\nimport { SpawnOptions, SpawnResult } from '@expo/spawn-async';\nimport chalk from 'chalk';\nimport { spawn, execSync } from 'child_process';\nimport fs from 'fs';\nimport assert from 'node:assert';\nimport { Ora } from 'ora';\nimport { EOL } from 'os';\nimport path from 'path';\nimport tempy from 'tempy';\n\nimport { xcrunAsync } from './xcrun';\nimport * as Log from '../../../log';\nimport { CommandError } from '../../../utils/errors';\nimport { installExitHooks } from '../../../utils/exit';\nimport { isInteractive } from '../../../utils/interactive';\nimport { ora } from '../../../utils/ora';\nimport { confirmAsync } from '../../../utils/prompts';\n\nconst DEVICE_CTL_EXISTS_PATH = path.join(getExpoHomeDirectory(), 'devicectl-exists');\n\nconst debug = require('debug')('expo:devicectl') as typeof console.log;\n\n// eslint-disable-next-line @typescript-eslint/ban-types\ntype AnyEnum<T extends string = string> = T | (string & {});\n\ntype DeviceCtlDevice = {\n capabilities: DeviceCtlDeviceCapability[];\n connectionProperties: DeviceCtlConnectionProperties;\n deviceProperties: DeviceCtlDeviceProperties;\n hardwareProperties: DeviceCtlHardwareProperties;\n /** \"A1A1AAA1-0011-1AA1-11A1-10A1111AA11A\" */\n identifier: string;\n visibilityClass: AnyEnum<'default'>;\n};\n\ntype DeviceCtlHardwareProperties = {\n cpuType: DeviceCtlCpuType;\n deviceType: AnyEnum<'iPhone'>;\n /** 1114404411111111 */\n ecid: number;\n /** \"D74AP\" */\n hardwareModel: string;\n /** 512000000000 */\n internalStorageCapacity: number;\n /** true */\n isProductionFused: boolean;\n /** \"iPhone 14 Pro Max\" */\n marketingName: string;\n /** \"iOS\" */\n platform: string;\n /** \"iPhone15,3\" */\n productType: AnyEnum<'iPhone13,4' | 'iPhone15,3'>;\n reality: AnyEnum<'physical'>;\n /** \"X2X1CC1XXX\" */\n serialNumber: string;\n supportedCPUTypes: DeviceCtlCpuType[];\n /** [1] */\n supportedDeviceFamilies: number[];\n thinningProductType: AnyEnum<'iPhone15,3'>;\n /** \"00001110-001111110110101A\" */\n udid: string;\n};\n\ntype DeviceCtlDeviceProperties = {\n /** true */\n bootedFromSnapshot: boolean;\n /** \"com.apple.os.update-AD0CF111ACFF11A11111A76A3D1262AE42A3F56F305AF5AE1135393A7A14A7D1\" */\n bootedSnapshotName: string;\n /** false */\n ddiServicesAvailable: boolean;\n\n developerModeStatus: AnyEnum<'enabled'>;\n /** false */\n hasInternalOSBuild: boolean;\n /** \"Evan's phone\" */\n name: string;\n /** \"21E236\" */\n osBuildUpdate: string;\n /** \"17.4.1\" */\n osVersionNumber: string;\n /** false */\n rootFileSystemIsWritable: boolean;\n};\n\ntype DeviceCtlDeviceCapability =\n | {\n name: AnyEnum;\n featureIdentifier: AnyEnum;\n }\n | {\n featureIdentifier: 'com.apple.coredevice.feature.connectdevice';\n name: 'Connect to Device';\n }\n | {\n featureIdentifier: 'com.apple.coredevice.feature.unpairdevice';\n name: 'Unpair Device';\n }\n | {\n featureIdentifier: 'com.apple.coredevice.feature.acquireusageassertion';\n name: 'Acquire Usage Assertion';\n };\n\ntype DeviceCtlConnectionProperties = {\n authenticationType: AnyEnum<'manualPairing'>;\n isMobileDeviceOnly: boolean;\n /** \"2024-04-20T22:50:04.244Z\" */\n lastConnectionDate: string;\n pairingState: AnyEnum<'paired'>;\n /** [\"00001111-001111110110101A.coredevice.local\", \"A1A1AAA1-0011-1AA1-11A1-10A1111AA11A.coredevice.local\"] */\n potentialHostnames: string[];\n transportType: AnyEnum<'localNetwork' | 'wired'>;\n tunnelState: AnyEnum<'disconnected'>;\n tunnelTransportProtocol: AnyEnum<'tcp'>;\n};\n\ntype DeviceCtlCpuType = {\n name: AnyEnum<'arm64e' | 'arm64' | 'arm64_32'>;\n subType: number;\n /** 16777228 */\n type: number;\n};\n\n/** Run a `devicectl` command. */\nexport async function devicectlAsync(\n args: (string | undefined)[],\n options?: SpawnOptions\n): Promise<SpawnResult> {\n try {\n return await xcrunAsync(['devicectl', ...args], options);\n } catch (error: any) {\n if (error instanceof CommandError) {\n throw error;\n }\n if ('stderr' in error) {\n const errorCodes = getDeviceCtlErrorCodes(error.stderr);\n if (errorCodes.includes('Locked')) {\n throw new CommandError('APPLE_DEVICE_LOCKED', 'Device is locked, unlock and try again.');\n }\n }\n throw error;\n }\n}\n\nexport async function getConnectedAppleDevicesAsync() {\n if (!hasDevicectlEverBeenInstalled()) {\n debug('devicectl not found, skipping remote Apple devices.');\n return [];\n }\n\n const tmpPath = tempy.file();\n const devices = await devicectlAsync([\n 'list',\n 'devices',\n '--json-output',\n tmpPath,\n // Give two seconds before timing out: between 5 and 9223372036854775807\n '--timeout',\n '5',\n ]);\n debug(devices.stdout);\n const devicesJson = await JsonFile.readAsync(tmpPath);\n\n if ((devicesJson as any)?.info?.jsonVersion !== 2) {\n Log.warn(\n 'Unexpected devicectl JSON version output from devicectl. Connecting to physical Apple devices may not work as expected.'\n );\n }\n\n assertDevicesJson(devicesJson);\n\n return devicesJson.result.devices as DeviceCtlDevice[];\n}\n\nfunction assertDevicesJson(\n results: any\n): asserts results is { result: { devices: DeviceCtlDevice[] } } {\n assert(\n results != null && 'result' in results && Array.isArray(results?.result?.devices),\n 'Malformed JSON output from devicectl: ' + JSON.stringify(results, null, 2)\n );\n}\n\nasync function installAppWithDeviceCtlAsync(\n uuid: string,\n bundleIdOrAppPath: string,\n onProgress: (event: { status: string; isComplete: boolean; progress: number }) => void\n): Promise<void> {\n // 𝝠 xcrun devicectl device install app --device 00001110-001111110110101A /Users/evanbacon/Library/Developer/Xcode/DerivedData/Router-hgbqaxzhrhkiftfweydvhgttadvn/Build/Products/Debug-iphoneos/Router.app --verbose\n return new Promise((resolve, reject) => {\n const args: string[] = [\n 'devicectl',\n 'device',\n 'install',\n 'app',\n '--device',\n uuid,\n bundleIdOrAppPath,\n ];\n const childProcess = spawn('xcrun', args);\n debug('xcrun ' + args.join(' '));\n\n let currentProgress = 0;\n let hasStarted = false;\n\n function updateProgress(progress: number) {\n hasStarted = true;\n if (progress <= currentProgress) {\n return;\n }\n currentProgress = progress;\n onProgress({\n progress,\n isComplete: progress === 100,\n status: 'Installing',\n });\n }\n\n childProcess.stdout.on('data', (data: Buffer) => {\n // Sometimes more than one chunk comes at a time, here we split by system newline,\n // then trim and filter.\n const strings = data\n .toString()\n .split(EOL)\n .map((value) => value.trim());\n\n strings.forEach((str) => {\n // Match the progress percentage:\n // - '34%... 35%...' -> 34\n // - '31%...' -> 31\n // - 'Complete!' -> 100\n\n const match = str.match(/(\\d+)%\\.\\.\\./);\n if (match) {\n updateProgress(parseInt(match[1], 10));\n } else if (hasStarted) {\n updateProgress(100);\n }\n });\n\n debug('[stdout]:', strings);\n });\n\n childProcess.on('close', (code) => {\n debug('[close]: ' + code);\n if (code === 0) {\n resolve();\n } else {\n const stderr = childProcess.stderr.read();\n const err = new Error(stderr);\n (err as any).code = code;\n detach(err);\n }\n });\n\n const detach = async (err?: Error) => {\n off?.();\n if (childProcess) {\n return new Promise<void>((resolve) => {\n childProcess?.on('close', resolve);\n childProcess?.kill();\n // childProcess = null;\n reject(err ?? new CommandError('detached'));\n });\n }\n };\n\n const off = installExitHooks(() => detach());\n });\n}\n\nexport async function launchAppWithDeviceCtl(deviceId: string, bundleId: string) {\n try {\n await devicectlAsync(['device', 'process', 'launch', '--device', deviceId, bundleId]);\n } catch (error: any) {\n if (error instanceof CommandError) {\n throw error;\n }\n\n throw new CommandError(`There was an error launching app: ${error}`);\n }\n}\n\n/** Find all error codes from the output log */\nfunction getDeviceCtlErrorCodes(log: string): string[] {\n return [...log.matchAll(/BSErrorCodeDescription\\s+=\\s+(.*)$/gim)].map(([_line, code]) => code);\n}\n\nlet hasEverBeenInstalled: boolean | undefined;\n\nexport function hasDevicectlEverBeenInstalled() {\n if (hasEverBeenInstalled) return hasEverBeenInstalled;\n // It doesn't appear possible for devicectl to ever be uninstalled. We can just check once and store this result forever\n // to prevent cold boots of devicectl from slowing down all invocations of `expo run ios`\n if (fs.existsSync(DEVICE_CTL_EXISTS_PATH)) {\n hasEverBeenInstalled = true;\n return true;\n }\n\n const isInstalled = isDevicectlInstalled();\n\n if (isInstalled) {\n fs.writeFileSync(DEVICE_CTL_EXISTS_PATH, '1');\n }\n hasEverBeenInstalled = isInstalled;\n return isInstalled;\n}\n\nfunction isDevicectlInstalled() {\n try {\n execSync('xcrun devicectl --version', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Wraps the apple device method for installing and running an app,\n * adds indicator and retry loop for when the device is locked.\n */\nexport async function installAndLaunchAppAsync(props: {\n bundle: string;\n bundleIdentifier: string;\n udid: string;\n deviceName: string;\n}): Promise<void> {\n debug('Running on device:', props);\n const { bundle, bundleIdentifier, udid, deviceName } = props;\n let indicator: Ora | undefined;\n\n try {\n if (!indicator) {\n indicator = ora(`Connecting to: ${props.deviceName}`).start();\n }\n\n await installAppWithDeviceCtlAsync(\n udid,\n bundle,\n ({\n status,\n isComplete,\n progress,\n }: {\n status: string;\n isComplete: boolean;\n progress: number;\n }) => {\n if (!indicator) {\n indicator = ora(status).start();\n }\n indicator.text = `${chalk.bold(status)} ${progress}%`;\n if (isComplete) {\n indicator.succeed();\n }\n }\n );\n } catch (error: any) {\n if (indicator) {\n indicator.fail();\n }\n throw error;\n }\n\n async function launchAppOptionally() {\n try {\n await launchAppWithDeviceCtl(udid, bundleIdentifier);\n } catch (error: any) {\n if (indicator) {\n indicator.fail();\n }\n if (error.code === 'APPLE_DEVICE_LOCKED') {\n // Get the app name from the binary path.\n const appName = path.basename(bundle).split('.')[0] ?? 'app';\n if (\n isInteractive() &&\n (await confirmAsync({\n message: `Cannot launch ${appName} because the device is locked. Unlock ${deviceName} to continue...`,\n initial: true,\n }))\n ) {\n return launchAppOptionally();\n }\n throw new CommandError(\n `Cannot launch ${appName} on ${deviceName} because the device is locked.`\n );\n }\n throw error;\n }\n }\n\n await launchAppOptionally();\n}\n"],"names":["devicectlAsync","getConnectedAppleDevicesAsync","launchAppWithDeviceCtl","hasDevicectlEverBeenInstalled","installAndLaunchAppAsync","DEVICE_CTL_EXISTS_PATH","path","join","getExpoHomeDirectory","debug","require","args","options","xcrunAsync","error","CommandError","errorCodes","getDeviceCtlErrorCodes","stderr","includes","tmpPath","tempy","file","devices","stdout","devicesJson","JsonFile","readAsync","info","jsonVersion","Log","warn","assertDevicesJson","result","results","assert","Array","isArray","JSON","stringify","installAppWithDeviceCtlAsync","uuid","bundleIdOrAppPath","onProgress","Promise","resolve","reject","childProcess","spawn","currentProgress","hasStarted","updateProgress","progress","isComplete","status","on","data","strings","toString","split","EOL","map","value","trim","forEach","str","match","parseInt","code","read","err","Error","detach","off","kill","installExitHooks","deviceId","bundleId","log","matchAll","_line","hasEverBeenInstalled","fs","existsSync","isInstalled","isDevicectlInstalled","writeFileSync","execSync","stdio","props","bundle","bundleIdentifier","udid","deviceName","indicator","ora","start","text","chalk","bold","succeed","fail","launchAppOptionally","appName","basename","isInteractive","confirmAsync","message","initial"],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "AtlasPrerequisite", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: ()=>AtlasPrerequisite
|
|
8
|
+
});
|
|
9
|
+
const _prerequisite = require("../../../doctor/Prerequisite");
|
|
10
|
+
const _ensureDependenciesAsync = require("../../../doctor/dependencies/ensureDependenciesAsync");
|
|
11
|
+
class AtlasPrerequisite extends _prerequisite.ProjectPrerequisite {
|
|
12
|
+
async assertImplementation({ exp } = {}) {
|
|
13
|
+
await this.ensureAtlasInstalled({
|
|
14
|
+
exp
|
|
15
|
+
});
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
async bootstrapAsync({ exp } = {}) {
|
|
19
|
+
await this.ensureAtlasInstalled({
|
|
20
|
+
exp,
|
|
21
|
+
skipPrompt: true,
|
|
22
|
+
isProjectMutable: true
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
async ensureAtlasInstalled(options = {}) {
|
|
26
|
+
try {
|
|
27
|
+
return await (0, _ensureDependenciesAsync.ensureDependenciesAsync)(this.projectRoot, {
|
|
28
|
+
...options,
|
|
29
|
+
installMessage: "Expo Atlas is required to gather bundle information, but it is not installed in this project.",
|
|
30
|
+
warningMessage: "Expo Atlas is not installed in this project, unable to gather bundle information.",
|
|
31
|
+
requiredPackages: [
|
|
32
|
+
{
|
|
33
|
+
version: "^0.1.1",
|
|
34
|
+
pkg: "expo-atlas",
|
|
35
|
+
file: "expo-atlas/package.json",
|
|
36
|
+
dev: true
|
|
37
|
+
},
|
|
38
|
+
]
|
|
39
|
+
});
|
|
40
|
+
} catch (error) {
|
|
41
|
+
this.resetAssertion({});
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
//# sourceMappingURL=AtlasPrerequisite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/start/server/metro/debugging/AtlasPrerequisite.ts"],"sourcesContent":["import { ProjectPrerequisite } from '../../../doctor/Prerequisite';\nimport {\n type EnsureDependenciesOptions,\n ensureDependenciesAsync,\n} from '../../../doctor/dependencies/ensureDependenciesAsync';\n\nexport class AtlasPrerequisite extends ProjectPrerequisite<\n boolean,\n Pick<EnsureDependenciesOptions, 'exp'>\n> {\n async assertImplementation({ exp }: Pick<EnsureDependenciesOptions, 'exp'> = {}) {\n await this.ensureAtlasInstalled({ exp });\n return true;\n }\n\n async bootstrapAsync({ exp }: Pick<EnsureDependenciesOptions, 'exp'> = {}) {\n await this.ensureAtlasInstalled({ exp, skipPrompt: true, isProjectMutable: true });\n }\n\n private async ensureAtlasInstalled(options: Partial<EnsureDependenciesOptions> = {}) {\n try {\n return await ensureDependenciesAsync(this.projectRoot, {\n ...options,\n installMessage:\n 'Expo Atlas is required to gather bundle information, but it is not installed in this project.',\n warningMessage:\n 'Expo Atlas is not installed in this project, unable to gather bundle information.',\n requiredPackages: [\n { version: '^0.1.1', pkg: 'expo-atlas', file: 'expo-atlas/package.json', dev: true },\n ],\n });\n } catch (error) {\n this.resetAssertion({});\n throw error;\n }\n }\n}\n"],"names":["AtlasPrerequisite","ProjectPrerequisite","assertImplementation","exp","ensureAtlasInstalled","bootstrapAsync","skipPrompt","isProjectMutable","options","ensureDependenciesAsync","projectRoot","installMessage","warningMessage","requiredPackages","version","pkg","file","dev","error","resetAssertion"],"mappings":"AAAA;;;;+BAMaA,mBAAiB;;aAAjBA,iBAAiB;;8BANM,8BAA8B;yCAI3D,sDAAsD;AAEtD,MAAMA,iBAAiB,SAASC,aAAmB,oBAAA;UAIlDC,oBAAoB,CAAC,EAAEC,GAAG,CAAA,EAA0C,GAAG,EAAE,EAAE;QAC/E,MAAM,IAAI,CAACC,oBAAoB,CAAC;YAAED,GAAG;SAAE,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd;UAEME,cAAc,CAAC,EAAEF,GAAG,CAAA,EAA0C,GAAG,EAAE,EAAE;QACzE,MAAM,IAAI,CAACC,oBAAoB,CAAC;YAAED,GAAG;YAAEG,UAAU,EAAE,IAAI;YAAEC,gBAAgB,EAAE,IAAI;SAAE,CAAC,CAAC;IACrF;UAEcH,oBAAoB,CAACI,OAA2C,GAAG,EAAE,EAAE;QACnF,IAAI;YACF,OAAO,MAAMC,IAAAA,wBAAuB,wBAAA,EAAC,IAAI,CAACC,WAAW,EAAE;gBACrD,GAAGF,OAAO;gBACVG,cAAc,EACZ,+FAA+F;gBACjGC,cAAc,EACZ,mFAAmF;gBACrFC,gBAAgB,EAAE;oBAChB;wBAAEC,OAAO,EAAE,QAAQ;wBAAEC,GAAG,EAAE,YAAY;wBAAEC,IAAI,EAAE,yBAAyB;wBAAEC,GAAG,EAAE,IAAI;qBAAE;iBACrF;aACF,CAAC,CAAC;QACL,EAAE,OAAOC,KAAK,EAAE;YACd,IAAI,CAACC,cAAc,CAAC,EAAE,CAAC,CAAC;YACxB,MAAMD,KAAK,CAAC;QACd,CAAC;IACH;CACD"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "attachAtlasAsync", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: ()=>attachAtlasAsync
|
|
8
|
+
});
|
|
9
|
+
const _atlasPrerequisite = require("./AtlasPrerequisite");
|
|
10
|
+
const _env = require("../../../../utils/env");
|
|
11
|
+
const debug = require("debug")("expo:metro:debugging:attachAtlas");
|
|
12
|
+
async function attachAtlasAsync({ exp , isExporting , projectRoot , middleware , metroConfig }) {
|
|
13
|
+
if (!_env.env.EXPO_UNSTABLE_ATLAS) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
debug("Atlas is enabled, initializing for this project...");
|
|
17
|
+
await new _atlasPrerequisite.AtlasPrerequisite(projectRoot).bootstrapAsync({
|
|
18
|
+
exp
|
|
19
|
+
});
|
|
20
|
+
// Exporting only sets up Metro, without attaching middleware
|
|
21
|
+
if (isExporting) {
|
|
22
|
+
const atlas = importAtlasForExport(projectRoot);
|
|
23
|
+
if (!atlas) {
|
|
24
|
+
return debug("Atlas is not installed in the project, skipping initialization");
|
|
25
|
+
}
|
|
26
|
+
atlas.withExpoAtlas(metroConfig);
|
|
27
|
+
debug("Attached Atlas to Metro config for exporting");
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
// Running in development mode requires middleware to be attached
|
|
31
|
+
if (!isExporting && !middleware) {
|
|
32
|
+
throw new Error("Expected middleware to be provided for Atlas when running in development mode");
|
|
33
|
+
} else if (!isExporting && middleware) {
|
|
34
|
+
const atlas1 = importAtlasForDev(projectRoot);
|
|
35
|
+
if (!atlas1) {
|
|
36
|
+
return debug("Atlas is not installed in the project, skipping initialization");
|
|
37
|
+
}
|
|
38
|
+
const instance = atlas1.createExpoAtlasMiddleware(metroConfig);
|
|
39
|
+
middleware.use("/_expo/atlas", instance.middleware);
|
|
40
|
+
debug("Attached Atlas middleware for development on: /_expo/atlas");
|
|
41
|
+
return instance;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function importAtlasForDev(projectRoot) {
|
|
45
|
+
try {
|
|
46
|
+
return require(require.resolve("expo-atlas/cli", {
|
|
47
|
+
paths: [
|
|
48
|
+
projectRoot
|
|
49
|
+
]
|
|
50
|
+
}));
|
|
51
|
+
} catch (error) {
|
|
52
|
+
debug("Failed to load Atlas from project:", error);
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function importAtlasForExport(projectRoot) {
|
|
57
|
+
try {
|
|
58
|
+
return require(require.resolve("expo-atlas/metro", {
|
|
59
|
+
paths: [
|
|
60
|
+
projectRoot
|
|
61
|
+
]
|
|
62
|
+
}));
|
|
63
|
+
} catch (error) {
|
|
64
|
+
debug("Failed to load Atlas from project:", error);
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
//# sourceMappingURL=attachAtlas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/start/server/metro/debugging/attachAtlas.ts"],"sourcesContent":["import type { Server as ConnectServer } from 'connect';\nimport type { ConfigT as MetroConfig } from 'metro-config';\n\nimport { AtlasPrerequisite } from './AtlasPrerequisite';\nimport { env } from '../../../../utils/env';\nimport { type EnsureDependenciesOptions } from '../../../doctor/dependencies/ensureDependenciesAsync';\n\nconst debug = require('debug')('expo:metro:debugging:attachAtlas') as typeof console.log;\n\ntype AttachAtlasOptions = Pick<EnsureDependenciesOptions, 'exp'> & {\n isExporting: boolean;\n projectRoot: string;\n middleware?: ConnectServer;\n metroConfig: MetroConfig;\n};\n\nexport async function attachAtlasAsync({\n exp,\n isExporting,\n projectRoot,\n middleware,\n metroConfig,\n}: AttachAtlasOptions): Promise<void | ReturnType<\n typeof import('expo-atlas/cli').createExpoAtlasMiddleware\n>> {\n if (!env.EXPO_UNSTABLE_ATLAS) {\n return;\n }\n\n debug('Atlas is enabled, initializing for this project...');\n\n await new AtlasPrerequisite(projectRoot).bootstrapAsync({ exp });\n\n // Exporting only sets up Metro, without attaching middleware\n if (isExporting) {\n const atlas = importAtlasForExport(projectRoot);\n if (!atlas) {\n return debug('Atlas is not installed in the project, skipping initialization');\n }\n\n atlas.withExpoAtlas(metroConfig);\n debug('Attached Atlas to Metro config for exporting');\n return;\n }\n\n // Running in development mode requires middleware to be attached\n if (!isExporting && !middleware) {\n throw new Error(\n 'Expected middleware to be provided for Atlas when running in development mode'\n );\n } else if (!isExporting && middleware) {\n const atlas = importAtlasForDev(projectRoot);\n if (!atlas) {\n return debug('Atlas is not installed in the project, skipping initialization');\n }\n\n const instance = atlas.createExpoAtlasMiddleware(metroConfig);\n middleware.use('/_expo/atlas', instance.middleware);\n debug('Attached Atlas middleware for development on: /_expo/atlas');\n return instance;\n }\n}\n\nfunction importAtlasForDev(projectRoot: string): null | typeof import('expo-atlas/cli') {\n try {\n return require(require.resolve('expo-atlas/cli', { paths: [projectRoot] }));\n } catch (error: any) {\n debug('Failed to load Atlas from project:', error);\n return null;\n }\n}\n\nfunction importAtlasForExport(projectRoot: string): null | typeof import('expo-atlas/metro') {\n try {\n return require(require.resolve('expo-atlas/metro', { paths: [projectRoot] }));\n } catch (error: any) {\n debug('Failed to load Atlas from project:', error);\n return null;\n }\n}\n"],"names":["attachAtlasAsync","debug","require","exp","isExporting","projectRoot","middleware","metroConfig","env","EXPO_UNSTABLE_ATLAS","AtlasPrerequisite","bootstrapAsync","atlas","importAtlasForExport","withExpoAtlas","Error","importAtlasForDev","instance","createExpoAtlasMiddleware","use","resolve","paths","error"],"mappings":"AAAA;;;;+BAgBsBA,kBAAgB;;aAAhBA,gBAAgB;;mCAbJ,qBAAqB;qBACnC,uBAAuB;AAG3C,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,kCAAkC,CAAC,AAAsB,AAAC;AASlF,eAAeF,gBAAgB,CAAC,EACrCG,GAAG,CAAA,EACHC,WAAW,CAAA,EACXC,WAAW,CAAA,EACXC,UAAU,CAAA,EACVC,WAAW,CAAA,EACQ,EAElB;IACD,IAAI,CAACC,IAAG,IAAA,CAACC,mBAAmB,EAAE;QAC5B,OAAO;IACT,CAAC;IAEDR,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAE5D,MAAM,IAAIS,kBAAiB,kBAAA,CAACL,WAAW,CAAC,CAACM,cAAc,CAAC;QAAER,GAAG;KAAE,CAAC,CAAC;IAEjE,6DAA6D;IAC7D,IAAIC,WAAW,EAAE;QACf,MAAMQ,KAAK,GAAGC,oBAAoB,CAACR,WAAW,CAAC,AAAC;QAChD,IAAI,CAACO,KAAK,EAAE;YACV,OAAOX,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACjF,CAAC;QAEDW,KAAK,CAACE,aAAa,CAACP,WAAW,CAAC,CAAC;QACjCN,KAAK,CAAC,8CAA8C,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,iEAAiE;IACjE,IAAI,CAACG,WAAW,IAAI,CAACE,UAAU,EAAE;QAC/B,MAAM,IAAIS,KAAK,CACb,+EAA+E,CAChF,CAAC;IACJ,OAAO,IAAI,CAACX,WAAW,IAAIE,UAAU,EAAE;QACrC,MAAMM,MAAK,GAAGI,iBAAiB,CAACX,WAAW,CAAC,AAAC;QAC7C,IAAI,CAACO,MAAK,EAAE;YACV,OAAOX,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACjF,CAAC;QAED,MAAMgB,QAAQ,GAAGL,MAAK,CAACM,yBAAyB,CAACX,WAAW,CAAC,AAAC;QAC9DD,UAAU,CAACa,GAAG,CAAC,cAAc,EAAEF,QAAQ,CAACX,UAAU,CAAC,CAAC;QACpDL,KAAK,CAAC,4DAA4D,CAAC,CAAC;QACpE,OAAOgB,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAASD,iBAAiB,CAACX,WAAmB,EAA0C;IACtF,IAAI;QACF,OAAOH,OAAO,CAACA,OAAO,CAACkB,OAAO,CAAC,gBAAgB,EAAE;YAAEC,KAAK,EAAE;gBAAChB,WAAW;aAAC;SAAE,CAAC,CAAC,CAAC;IAC9E,EAAE,OAAOiB,KAAK,EAAO;QACnBrB,KAAK,CAAC,oCAAoC,EAAEqB,KAAK,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAST,oBAAoB,CAACR,WAAmB,EAA4C;IAC3F,IAAI;QACF,OAAOH,OAAO,CAACA,OAAO,CAACkB,OAAO,CAAC,kBAAkB,EAAE;YAAEC,KAAK,EAAE;gBAAChB,WAAW;aAAC;SAAE,CAAC,CAAC,CAAC;IAChF,EAAE,OAAOiB,KAAK,EAAO;QACnBrB,KAAK,CAAC,oCAAoC,EAAEqB,KAAK,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -70,6 +70,7 @@ function _url() {
|
|
|
70
70
|
return data;
|
|
71
71
|
}
|
|
72
72
|
const _metroTerminalReporter = require("./MetroTerminalReporter");
|
|
73
|
+
const _attachAtlas = require("./debugging/attachAtlas");
|
|
73
74
|
const _createDebugMiddleware = require("./debugging/createDebugMiddleware");
|
|
74
75
|
const _runServerFork = require("./runServer-fork");
|
|
75
76
|
const _withMetroMultiPlatform = require("./withMetroMultiPlatform");
|
|
@@ -223,6 +224,14 @@ async function instantiateMetroAsync(metroBundler, options, { isExporting }) {
|
|
|
223
224
|
const { debugMiddleware , debugWebsocketEndpoints } = (0, _createDebugMiddleware.createDebugMiddleware)(metroBundler);
|
|
224
225
|
(0, _mutations.prependMiddleware)(middleware, debugMiddleware);
|
|
225
226
|
middleware.use("/_expo/debugger", (0, _createJsInspectorMiddleware.createJsInspectorMiddleware)());
|
|
227
|
+
// Attach Expo Atlas if enabled
|
|
228
|
+
const atlas = await (0, _attachAtlas.attachAtlasAsync)({
|
|
229
|
+
isExporting,
|
|
230
|
+
exp,
|
|
231
|
+
projectRoot,
|
|
232
|
+
middleware,
|
|
233
|
+
metroConfig
|
|
234
|
+
});
|
|
226
235
|
const { server , metro } = await (0, _runServerFork.runServer)(metroBundler, metroConfig, {
|
|
227
236
|
// @ts-expect-error: Inconsistent `websocketEndpoints` type between metro and @react-native-community/cli-server-api
|
|
228
237
|
websocketEndpoints: {
|
|
@@ -231,6 +240,8 @@ async function instantiateMetroAsync(metroBundler, options, { isExporting }) {
|
|
|
231
240
|
},
|
|
232
241
|
watch: !isExporting && isWatchEnabled()
|
|
233
242
|
});
|
|
243
|
+
// If Atlas is enabled, and can register to Metro, attach it to listen for changes
|
|
244
|
+
atlas == null ? void 0 : atlas.registerMetro(metro);
|
|
234
245
|
(0, _mutations.prependMiddleware)(middleware, (req, res, next)=>{
|
|
235
246
|
// If the URL is a Metro asset request, then we need to skip all other middleware to prevent
|
|
236
247
|
// the community CLI's serve-static from hosting `/assets/index.html` in place of all assets if it exists.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport { getDefaultConfig, LoadOptions } from '@expo/metro-config';\nimport chalk from 'chalk';\nimport { Server as ConnectServer } from 'connect';\nimport http from 'http';\nimport type Metro from 'metro';\nimport Bundler from 'metro/src/Bundler';\nimport { loadConfig, resolveConfig, ConfigT } from 'metro-config';\nimport { Terminal } from 'metro-core';\nimport util from 'node:util';\nimport semver from 'semver';\nimport { URL } from 'url';\n\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { createDebugMiddleware } from './debugging/createDebugMiddleware';\nimport { runServer } from './runServer-fork';\nimport { withMetroMultiPlatformAsync } from './withMetroMultiPlatform';\nimport { MetroDevServerOptions } from '../../../export/fork-bundleAsync';\nimport { Log } from '../../../log';\nimport { getMetroProperties } from '../../../utils/analytics/getMetroProperties';\nimport { createDebuggerTelemetryMiddleware } from '../../../utils/analytics/metroDebuggerMiddleware';\nimport { env } from '../../../utils/env';\nimport { logEventAsync } from '../../../utils/telemetry';\nimport { createCorsMiddleware } from '../middleware/CorsMiddleware';\nimport { getMetroServerRoot } from '../middleware/ManifestMiddleware';\nimport { createJsInspectorMiddleware } from '../middleware/inspector/createJsInspectorMiddleware';\nimport { prependMiddleware, replaceMiddlewareWith } from '../middleware/mutations';\nimport { ServerNext, ServerRequest, ServerResponse } from '../middleware/server.types';\nimport { suppressRemoteDebuggingErrorMiddleware } from '../middleware/suppressErrorMiddleware';\nimport { getPlatformBundlers } from '../platformBundlers';\n// From expo/dev-server but with ability to use custom logger.\ntype MessageSocket = {\n broadcast: (method: string, params?: Record<string, any> | undefined) => void;\n};\n\nfunction gteSdkVersion(exp: Pick<ExpoConfig, 'sdkVersion'>, sdkVersion: string): boolean {\n if (!exp.sdkVersion) {\n return false;\n }\n\n if (exp.sdkVersion === 'UNVERSIONED') {\n return true;\n }\n\n try {\n return semver.gte(exp.sdkVersion, sdkVersion);\n } catch {\n throw new Error(`${exp.sdkVersion} is not a valid version. Must be in the form of x.y.z`);\n }\n}\n\n// Wrap terminal and polyfill console.log so we can log during bundling without breaking the indicator.\nclass LogRespectingTerminal extends Terminal {\n constructor(stream: import('node:net').Socket | import('node:stream').Writable) {\n super(stream);\n\n const sendLog = (...args: any[]) => {\n // @ts-expect-error\n this._logLines.push(\n // format args like console.log\n util.format(...args)\n );\n // @ts-expect-error\n this._scheduleUpdate();\n\n // Flush the logs to the terminal immediately so logs at the end of the process are not lost.\n this.flush();\n };\n\n console.log = sendLog;\n console.info = sendLog;\n }\n}\n\n// Share one instance of Terminal for all instances of Metro.\nconst terminal = new LogRespectingTerminal(process.stdout);\n\nexport async function loadMetroConfigAsync(\n projectRoot: string,\n options: LoadOptions,\n {\n exp = getConfig(projectRoot, { skipSDKVersionRequirement: true }).exp,\n isExporting,\n getMetroBundler,\n }: { exp?: ExpoConfig; isExporting: boolean; getMetroBundler: () => Bundler }\n) {\n let reportEvent: ((event: any) => void) | undefined;\n const serverRoot = getMetroServerRoot(projectRoot);\n const terminalReporter = new MetroTerminalReporter(serverRoot, terminal);\n\n const hasConfig = await resolveConfig(options.config, projectRoot);\n let config: ConfigT = {\n ...(await loadConfig(\n { cwd: projectRoot, projectRoot, ...options },\n // If the project does not have a metro.config.js, then we use the default config.\n hasConfig.isEmpty ? getDefaultConfig(projectRoot) : undefined\n )),\n reporter: {\n update(event: any) {\n terminalReporter.update(event);\n if (reportEvent) {\n reportEvent(event);\n }\n },\n },\n };\n\n if (\n // Requires SDK 50 for expo-assets hashAssetPlugin change.\n !exp.sdkVersion ||\n gteSdkVersion(exp, '50.0.0')\n ) {\n if (isExporting) {\n // This token will be used in the asset plugin to ensure the path is correct for writing locally.\n // @ts-expect-error: typed as readonly.\n config.transformer.publicPath = `/assets?export_path=${\n (exp.experiments?.baseUrl ?? '') + '/assets'\n }`;\n } else {\n // @ts-expect-error: typed as readonly\n config.transformer.publicPath = '/assets/?unstable_path=.';\n }\n } else {\n if (isExporting && exp.experiments?.baseUrl) {\n // This token will be used in the asset plugin to ensure the path is correct for writing locally.\n // @ts-expect-error: typed as readonly.\n config.transformer.publicPath = exp.experiments?.baseUrl;\n }\n }\n\n const platformBundlers = getPlatformBundlers(projectRoot, exp);\n\n config = await withMetroMultiPlatformAsync(projectRoot, {\n config,\n exp,\n platformBundlers,\n isTsconfigPathsEnabled: exp.experiments?.tsconfigPaths ?? true,\n webOutput: exp.web?.output ?? 'single',\n isFastResolverEnabled: env.EXPO_USE_FAST_RESOLVER,\n isExporting,\n isReactCanaryEnabled: exp.experiments?.reactCanary ?? false,\n getMetroBundler,\n });\n\n if (process.env.NODE_ENV !== 'test') {\n logEventAsync('metro config', getMetroProperties(projectRoot, exp, config));\n }\n\n return {\n config,\n setEventReporter: (logger: (event: any) => void) => (reportEvent = logger),\n reporter: terminalReporter,\n };\n}\n\n/** The most generic possible setup for Metro bundler. */\nexport async function instantiateMetroAsync(\n metroBundler: MetroBundlerDevServer,\n options: Omit<MetroDevServerOptions, 'logger'>,\n { isExporting }: { isExporting: boolean }\n): Promise<{\n metro: Metro.Server;\n server: http.Server;\n middleware: any;\n messageSocket: MessageSocket;\n}> {\n const projectRoot = metroBundler.projectRoot;\n\n // TODO: When we bring expo/metro-config into the expo/expo repo, then we can upstream this.\n const { exp } = getConfig(projectRoot, {\n skipSDKVersionRequirement: true,\n });\n\n const { config: metroConfig, setEventReporter } = await loadMetroConfigAsync(\n projectRoot,\n options,\n {\n exp,\n isExporting,\n getMetroBundler() {\n return metro.getBundler().getBundler();\n },\n }\n );\n\n const { createDevServerMiddleware, securityHeadersMiddleware } =\n require('@react-native-community/cli-server-api') as typeof import('@react-native-community/cli-server-api');\n\n const { middleware, messageSocketEndpoint, eventsSocketEndpoint, websocketEndpoints } =\n createDevServerMiddleware({\n port: metroConfig.server.port,\n watchFolders: metroConfig.watchFolders,\n });\n\n // The `securityHeadersMiddleware` does not support cross-origin requests, we replace with the enhanced version.\n replaceMiddlewareWith(\n middleware as ConnectServer,\n securityHeadersMiddleware,\n createCorsMiddleware(exp)\n );\n\n prependMiddleware(middleware, suppressRemoteDebuggingErrorMiddleware);\n\n // TODO: We can probably drop this now.\n const customEnhanceMiddleware = metroConfig.server.enhanceMiddleware;\n // @ts-expect-error: can't mutate readonly config\n metroConfig.server.enhanceMiddleware = (metroMiddleware: any, server: Metro.Server) => {\n if (customEnhanceMiddleware) {\n metroMiddleware = customEnhanceMiddleware(metroMiddleware, server);\n }\n return middleware.use(metroMiddleware);\n };\n\n middleware.use(createDebuggerTelemetryMiddleware(projectRoot, exp));\n\n // Initialize all React Native debug features\n const { debugMiddleware, debugWebsocketEndpoints } = createDebugMiddleware(metroBundler);\n prependMiddleware(middleware, debugMiddleware);\n middleware.use('/_expo/debugger', createJsInspectorMiddleware());\n\n const { server, metro } = await runServer(metroBundler, metroConfig, {\n // @ts-expect-error: Inconsistent `websocketEndpoints` type between metro and @react-native-community/cli-server-api\n websocketEndpoints: {\n ...websocketEndpoints,\n ...debugWebsocketEndpoints,\n },\n watch: !isExporting && isWatchEnabled(),\n });\n\n prependMiddleware(middleware, (req: ServerRequest, res: ServerResponse, next: ServerNext) => {\n // If the URL is a Metro asset request, then we need to skip all other middleware to prevent\n // the community CLI's serve-static from hosting `/assets/index.html` in place of all assets if it exists.\n // /assets/?unstable_path=.\n if (req.url) {\n const url = new URL(req.url!, 'http://localhost:8000');\n if (url.pathname.match(/^\\/assets\\/?/) && url.searchParams.get('unstable_path') != null) {\n return metro.processRequest(req, res, next);\n }\n }\n return next();\n });\n\n setEventReporter(eventsSocketEndpoint.reportEvent);\n\n return {\n metro,\n server,\n middleware,\n messageSocket: messageSocketEndpoint,\n };\n}\n\n/**\n * Simplify and communicate if Metro is running without watching file updates,.\n * Exposed for testing.\n */\nexport function isWatchEnabled() {\n if (env.CI) {\n Log.log(\n chalk`Metro is running in CI mode, reloads are disabled. Remove {bold CI=true} to enable watch mode.`\n );\n }\n\n return !env.CI;\n}\n"],"names":["loadMetroConfigAsync","instantiateMetroAsync","isWatchEnabled","gteSdkVersion","exp","sdkVersion","semver","gte","Error","LogRespectingTerminal","Terminal","constructor","stream","sendLog","args","_logLines","push","util","format","_scheduleUpdate","flush","console","log","info","terminal","process","stdout","projectRoot","options","getConfig","skipSDKVersionRequirement","isExporting","getMetroBundler","reportEvent","serverRoot","getMetroServerRoot","terminalReporter","MetroTerminalReporter","hasConfig","resolveConfig","config","loadConfig","cwd","isEmpty","getDefaultConfig","undefined","reporter","update","event","transformer","publicPath","experiments","baseUrl","platformBundlers","getPlatformBundlers","withMetroMultiPlatformAsync","isTsconfigPathsEnabled","tsconfigPaths","webOutput","web","output","isFastResolverEnabled","env","EXPO_USE_FAST_RESOLVER","isReactCanaryEnabled","reactCanary","NODE_ENV","logEventAsync","getMetroProperties","setEventReporter","logger","metroBundler","metroConfig","metro","getBundler","createDevServerMiddleware","securityHeadersMiddleware","require","middleware","messageSocketEndpoint","eventsSocketEndpoint","websocketEndpoints","port","server","watchFolders","replaceMiddlewareWith","createCorsMiddleware","prependMiddleware","suppressRemoteDebuggingErrorMiddleware","customEnhanceMiddleware","enhanceMiddleware","metroMiddleware","use","createDebuggerTelemetryMiddleware","debugMiddleware","debugWebsocketEndpoints","createDebugMiddleware","createJsInspectorMiddleware","runServer","watch","req","res","next","url","URL","pathname","match","searchParams","get","processRequest","messageSocket","CI","Log","chalk"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport { getDefaultConfig, LoadOptions } from '@expo/metro-config';\nimport chalk from 'chalk';\nimport { Server as ConnectServer } from 'connect';\nimport http from 'http';\nimport type Metro from 'metro';\nimport Bundler from 'metro/src/Bundler';\nimport { loadConfig, resolveConfig, ConfigT } from 'metro-config';\nimport { Terminal } from 'metro-core';\nimport util from 'node:util';\nimport semver from 'semver';\nimport { URL } from 'url';\n\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { attachAtlasAsync } from './debugging/attachAtlas';\nimport { createDebugMiddleware } from './debugging/createDebugMiddleware';\nimport { runServer } from './runServer-fork';\nimport { withMetroMultiPlatformAsync } from './withMetroMultiPlatform';\nimport { MetroDevServerOptions } from '../../../export/fork-bundleAsync';\nimport { Log } from '../../../log';\nimport { getMetroProperties } from '../../../utils/analytics/getMetroProperties';\nimport { createDebuggerTelemetryMiddleware } from '../../../utils/analytics/metroDebuggerMiddleware';\nimport { env } from '../../../utils/env';\nimport { logEventAsync } from '../../../utils/telemetry';\nimport { createCorsMiddleware } from '../middleware/CorsMiddleware';\nimport { getMetroServerRoot } from '../middleware/ManifestMiddleware';\nimport { createJsInspectorMiddleware } from '../middleware/inspector/createJsInspectorMiddleware';\nimport { prependMiddleware, replaceMiddlewareWith } from '../middleware/mutations';\nimport { ServerNext, ServerRequest, ServerResponse } from '../middleware/server.types';\nimport { suppressRemoteDebuggingErrorMiddleware } from '../middleware/suppressErrorMiddleware';\nimport { getPlatformBundlers } from '../platformBundlers';\n\n// From expo/dev-server but with ability to use custom logger.\ntype MessageSocket = {\n broadcast: (method: string, params?: Record<string, any> | undefined) => void;\n};\n\nfunction gteSdkVersion(exp: Pick<ExpoConfig, 'sdkVersion'>, sdkVersion: string): boolean {\n if (!exp.sdkVersion) {\n return false;\n }\n\n if (exp.sdkVersion === 'UNVERSIONED') {\n return true;\n }\n\n try {\n return semver.gte(exp.sdkVersion, sdkVersion);\n } catch {\n throw new Error(`${exp.sdkVersion} is not a valid version. Must be in the form of x.y.z`);\n }\n}\n\n// Wrap terminal and polyfill console.log so we can log during bundling without breaking the indicator.\nclass LogRespectingTerminal extends Terminal {\n constructor(stream: import('node:net').Socket | import('node:stream').Writable) {\n super(stream);\n\n const sendLog = (...args: any[]) => {\n // @ts-expect-error\n this._logLines.push(\n // format args like console.log\n util.format(...args)\n );\n // @ts-expect-error\n this._scheduleUpdate();\n\n // Flush the logs to the terminal immediately so logs at the end of the process are not lost.\n this.flush();\n };\n\n console.log = sendLog;\n console.info = sendLog;\n }\n}\n\n// Share one instance of Terminal for all instances of Metro.\nconst terminal = new LogRespectingTerminal(process.stdout);\n\nexport async function loadMetroConfigAsync(\n projectRoot: string,\n options: LoadOptions,\n {\n exp = getConfig(projectRoot, { skipSDKVersionRequirement: true }).exp,\n isExporting,\n getMetroBundler,\n }: { exp?: ExpoConfig; isExporting: boolean; getMetroBundler: () => Bundler }\n) {\n let reportEvent: ((event: any) => void) | undefined;\n const serverRoot = getMetroServerRoot(projectRoot);\n const terminalReporter = new MetroTerminalReporter(serverRoot, terminal);\n\n const hasConfig = await resolveConfig(options.config, projectRoot);\n let config: ConfigT = {\n ...(await loadConfig(\n { cwd: projectRoot, projectRoot, ...options },\n // If the project does not have a metro.config.js, then we use the default config.\n hasConfig.isEmpty ? getDefaultConfig(projectRoot) : undefined\n )),\n reporter: {\n update(event: any) {\n terminalReporter.update(event);\n if (reportEvent) {\n reportEvent(event);\n }\n },\n },\n };\n\n if (\n // Requires SDK 50 for expo-assets hashAssetPlugin change.\n !exp.sdkVersion ||\n gteSdkVersion(exp, '50.0.0')\n ) {\n if (isExporting) {\n // This token will be used in the asset plugin to ensure the path is correct for writing locally.\n // @ts-expect-error: typed as readonly.\n config.transformer.publicPath = `/assets?export_path=${\n (exp.experiments?.baseUrl ?? '') + '/assets'\n }`;\n } else {\n // @ts-expect-error: typed as readonly\n config.transformer.publicPath = '/assets/?unstable_path=.';\n }\n } else {\n if (isExporting && exp.experiments?.baseUrl) {\n // This token will be used in the asset plugin to ensure the path is correct for writing locally.\n // @ts-expect-error: typed as readonly.\n config.transformer.publicPath = exp.experiments?.baseUrl;\n }\n }\n\n const platformBundlers = getPlatformBundlers(projectRoot, exp);\n\n config = await withMetroMultiPlatformAsync(projectRoot, {\n config,\n exp,\n platformBundlers,\n isTsconfigPathsEnabled: exp.experiments?.tsconfigPaths ?? true,\n webOutput: exp.web?.output ?? 'single',\n isFastResolverEnabled: env.EXPO_USE_FAST_RESOLVER,\n isExporting,\n isReactCanaryEnabled: exp.experiments?.reactCanary ?? false,\n getMetroBundler,\n });\n\n if (process.env.NODE_ENV !== 'test') {\n logEventAsync('metro config', getMetroProperties(projectRoot, exp, config));\n }\n\n return {\n config,\n setEventReporter: (logger: (event: any) => void) => (reportEvent = logger),\n reporter: terminalReporter,\n };\n}\n\n/** The most generic possible setup for Metro bundler. */\nexport async function instantiateMetroAsync(\n metroBundler: MetroBundlerDevServer,\n options: Omit<MetroDevServerOptions, 'logger'>,\n { isExporting }: { isExporting: boolean }\n): Promise<{\n metro: Metro.Server;\n server: http.Server;\n middleware: any;\n messageSocket: MessageSocket;\n}> {\n const projectRoot = metroBundler.projectRoot;\n\n // TODO: When we bring expo/metro-config into the expo/expo repo, then we can upstream this.\n const { exp } = getConfig(projectRoot, {\n skipSDKVersionRequirement: true,\n });\n\n const { config: metroConfig, setEventReporter } = await loadMetroConfigAsync(\n projectRoot,\n options,\n {\n exp,\n isExporting,\n getMetroBundler() {\n return metro.getBundler().getBundler();\n },\n }\n );\n\n const { createDevServerMiddleware, securityHeadersMiddleware } =\n require('@react-native-community/cli-server-api') as typeof import('@react-native-community/cli-server-api');\n\n const { middleware, messageSocketEndpoint, eventsSocketEndpoint, websocketEndpoints } =\n createDevServerMiddleware({\n port: metroConfig.server.port,\n watchFolders: metroConfig.watchFolders,\n });\n\n // The `securityHeadersMiddleware` does not support cross-origin requests, we replace with the enhanced version.\n replaceMiddlewareWith(\n middleware as ConnectServer,\n securityHeadersMiddleware,\n createCorsMiddleware(exp)\n );\n\n prependMiddleware(middleware, suppressRemoteDebuggingErrorMiddleware);\n\n // TODO: We can probably drop this now.\n const customEnhanceMiddleware = metroConfig.server.enhanceMiddleware;\n // @ts-expect-error: can't mutate readonly config\n metroConfig.server.enhanceMiddleware = (metroMiddleware: any, server: Metro.Server) => {\n if (customEnhanceMiddleware) {\n metroMiddleware = customEnhanceMiddleware(metroMiddleware, server);\n }\n return middleware.use(metroMiddleware);\n };\n\n middleware.use(createDebuggerTelemetryMiddleware(projectRoot, exp));\n\n // Initialize all React Native debug features\n const { debugMiddleware, debugWebsocketEndpoints } = createDebugMiddleware(metroBundler);\n prependMiddleware(middleware, debugMiddleware);\n middleware.use('/_expo/debugger', createJsInspectorMiddleware());\n\n // Attach Expo Atlas if enabled\n const atlas = await attachAtlasAsync({ isExporting, exp, projectRoot, middleware, metroConfig });\n\n const { server, metro } = await runServer(metroBundler, metroConfig, {\n // @ts-expect-error: Inconsistent `websocketEndpoints` type between metro and @react-native-community/cli-server-api\n websocketEndpoints: {\n ...websocketEndpoints,\n ...debugWebsocketEndpoints,\n },\n watch: !isExporting && isWatchEnabled(),\n });\n\n // If Atlas is enabled, and can register to Metro, attach it to listen for changes\n atlas?.registerMetro(metro);\n\n prependMiddleware(middleware, (req: ServerRequest, res: ServerResponse, next: ServerNext) => {\n // If the URL is a Metro asset request, then we need to skip all other middleware to prevent\n // the community CLI's serve-static from hosting `/assets/index.html` in place of all assets if it exists.\n // /assets/?unstable_path=.\n if (req.url) {\n const url = new URL(req.url!, 'http://localhost:8000');\n if (url.pathname.match(/^\\/assets\\/?/) && url.searchParams.get('unstable_path') != null) {\n return metro.processRequest(req, res, next);\n }\n }\n return next();\n });\n\n setEventReporter(eventsSocketEndpoint.reportEvent);\n\n return {\n metro,\n server,\n middleware,\n messageSocket: messageSocketEndpoint,\n };\n}\n\n/**\n * Simplify and communicate if Metro is running without watching file updates,.\n * Exposed for testing.\n */\nexport function isWatchEnabled() {\n if (env.CI) {\n Log.log(\n chalk`Metro is running in CI mode, reloads are disabled. Remove {bold CI=true} to enable watch mode.`\n );\n }\n\n return !env.CI;\n}\n"],"names":["loadMetroConfigAsync","instantiateMetroAsync","isWatchEnabled","gteSdkVersion","exp","sdkVersion","semver","gte","Error","LogRespectingTerminal","Terminal","constructor","stream","sendLog","args","_logLines","push","util","format","_scheduleUpdate","flush","console","log","info","terminal","process","stdout","projectRoot","options","getConfig","skipSDKVersionRequirement","isExporting","getMetroBundler","reportEvent","serverRoot","getMetroServerRoot","terminalReporter","MetroTerminalReporter","hasConfig","resolveConfig","config","loadConfig","cwd","isEmpty","getDefaultConfig","undefined","reporter","update","event","transformer","publicPath","experiments","baseUrl","platformBundlers","getPlatformBundlers","withMetroMultiPlatformAsync","isTsconfigPathsEnabled","tsconfigPaths","webOutput","web","output","isFastResolverEnabled","env","EXPO_USE_FAST_RESOLVER","isReactCanaryEnabled","reactCanary","NODE_ENV","logEventAsync","getMetroProperties","setEventReporter","logger","metroBundler","metroConfig","metro","getBundler","createDevServerMiddleware","securityHeadersMiddleware","require","middleware","messageSocketEndpoint","eventsSocketEndpoint","websocketEndpoints","port","server","watchFolders","replaceMiddlewareWith","createCorsMiddleware","prependMiddleware","suppressRemoteDebuggingErrorMiddleware","customEnhanceMiddleware","enhanceMiddleware","metroMiddleware","use","createDebuggerTelemetryMiddleware","debugMiddleware","debugWebsocketEndpoints","createDebugMiddleware","createJsInspectorMiddleware","atlas","attachAtlasAsync","runServer","watch","registerMetro","req","res","next","url","URL","pathname","match","searchParams","get","processRequest","messageSocket","CI","Log","chalk"],"mappings":"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"}
|
|
@@ -101,12 +101,14 @@ function isApiRouteConvention(name) {
|
|
|
101
101
|
function getApiRoutesForDirectory(cwd) {
|
|
102
102
|
return (0, _glob().sync)("**/*+api.@(ts|tsx|js|jsx)", {
|
|
103
103
|
cwd,
|
|
104
|
-
absolute: true
|
|
104
|
+
absolute: true,
|
|
105
|
+
dot: true
|
|
105
106
|
});
|
|
106
107
|
}
|
|
107
108
|
function getRoutePaths(cwd) {
|
|
108
109
|
return (0, _glob().sync)("**/*.@(ts|tsx|js|jsx)", {
|
|
109
|
-
cwd
|
|
110
|
+
cwd,
|
|
111
|
+
dot: true
|
|
110
112
|
}).map((p)=>"./" + normalizePaths(p));
|
|
111
113
|
}
|
|
112
114
|
function normalizePaths(p) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/router.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config';\nimport chalk from 'chalk';\nimport { sync as globSync } from 'glob';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { Log } from '../../../log';\nimport { directoryExistsSync } from '../../../utils/dir';\nimport { learnMore } from '../../../utils/link';\n\nconst debug = require('debug')('expo:start:server:metro:router') as typeof console.log;\n\n/**\n * Get the relative path for requiring the `/app` folder relative to the `expo-router/entry` file.\n * This mechanism does require the server to restart after the `expo-router` package is installed.\n */\nexport function getAppRouterRelativeEntryPath(\n projectRoot: string,\n routerDirectory: string = getRouterDirectory(projectRoot)\n): string | undefined {\n // Auto pick App entry\n const routerEntry =\n resolveFrom.silent(projectRoot, 'expo-router/entry') ?? getFallbackEntryRoot(projectRoot);\n if (!routerEntry) {\n return undefined;\n }\n // It doesn't matter if the app folder exists.\n const appFolder = path.join(projectRoot, routerDirectory);\n const appRoot = path.relative(path.dirname(routerEntry), appFolder);\n debug('expo-router entry', routerEntry, appFolder, appRoot);\n return appRoot;\n}\n\n/** If the `expo-router` package is not installed, then use the `expo` package to determine where the node modules are relative to the project. */\nfunction getFallbackEntryRoot(projectRoot: string): string {\n const expoRoot = resolveFrom.silent(projectRoot, 'expo/package.json');\n if (expoRoot) {\n return path.join(path.dirname(path.dirname(expoRoot)), 'expo-router/entry');\n }\n return path.join(projectRoot, 'node_modules/expo-router/entry');\n}\n\nexport function getRouterDirectoryModuleIdWithManifest(\n projectRoot: string,\n exp: ExpoConfig\n): string {\n return exp.extra?.router?.root ?? getRouterDirectory(projectRoot);\n}\n\nlet hasWarnedAboutSrcDir = false;\nconst logSrcDir = () => {\n if (hasWarnedAboutSrcDir) return;\n hasWarnedAboutSrcDir = true;\n Log.log(chalk.gray('Using src/app as the root directory for Expo Router.'));\n};\n\nexport function getRouterDirectory(projectRoot: string): string {\n // more specific directories first\n if (directoryExistsSync(path.join(projectRoot, 'src/app'))) {\n logSrcDir();\n return 'src/app';\n }\n\n debug('Using app as the root directory for Expo Router.');\n return 'app';\n}\n\nexport function isApiRouteConvention(name: string): boolean {\n return /\\+api\\.[tj]sx?$/.test(name);\n}\n\nexport function getApiRoutesForDirectory(cwd: string) {\n return globSync('**/*+api.@(ts|tsx|js|jsx)', {\n cwd,\n absolute: true,\n });\n}\n\n// Used to emulate a context module, but way faster. TODO: May need to adjust the extensions to stay in sync with Metro.\nexport function getRoutePaths(cwd: string) {\n return globSync('**/*.@(ts|tsx|js|jsx)', {\n cwd,\n }).map((p) => './' + normalizePaths(p));\n}\n\nfunction normalizePaths(p: string) {\n return p.replace(/\\\\/g, '/');\n}\n\nlet hasWarnedAboutApiRouteOutput = false;\n\nexport function hasWarnedAboutApiRoutes() {\n return hasWarnedAboutApiRouteOutput;\n}\n\nexport function warnInvalidWebOutput() {\n if (!hasWarnedAboutApiRouteOutput) {\n Log.warn(\n chalk.yellow`Using API routes requires the {bold web.output} to be set to {bold \"server\"} in the project {bold app.json}. ${learnMore(\n 'https://docs.expo.dev/router/reference/api-routes/'\n )}`\n );\n }\n\n hasWarnedAboutApiRouteOutput = true;\n}\n"],"names":["getAppRouterRelativeEntryPath","getRouterDirectoryModuleIdWithManifest","getRouterDirectory","isApiRouteConvention","getApiRoutesForDirectory","getRoutePaths","hasWarnedAboutApiRoutes","warnInvalidWebOutput","debug","require","projectRoot","routerDirectory","resolveFrom","routerEntry","silent","getFallbackEntryRoot","undefined","appFolder","path","join","appRoot","relative","dirname","expoRoot","exp","extra","router","root","hasWarnedAboutSrcDir","logSrcDir","Log","log","chalk","gray","directoryExistsSync","name","test","cwd","globSync","absolute","map","p","normalizePaths","replace","hasWarnedAboutApiRouteOutput","warn","yellow","learnMore"],"mappings":"AAAA;;;;;;;;;;;IAgBgBA,6BAA6B,MAA7BA,6BAA6B;IA0B7BC,sCAAsC,MAAtCA,sCAAsC;IActCC,kBAAkB,MAAlBA,kBAAkB;IAWlBC,oBAAoB,MAApBA,oBAAoB;IAIpBC,wBAAwB,MAAxBA,wBAAwB;
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/router.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config';\nimport chalk from 'chalk';\nimport { sync as globSync } from 'glob';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { Log } from '../../../log';\nimport { directoryExistsSync } from '../../../utils/dir';\nimport { learnMore } from '../../../utils/link';\n\nconst debug = require('debug')('expo:start:server:metro:router') as typeof console.log;\n\n/**\n * Get the relative path for requiring the `/app` folder relative to the `expo-router/entry` file.\n * This mechanism does require the server to restart after the `expo-router` package is installed.\n */\nexport function getAppRouterRelativeEntryPath(\n projectRoot: string,\n routerDirectory: string = getRouterDirectory(projectRoot)\n): string | undefined {\n // Auto pick App entry\n const routerEntry =\n resolveFrom.silent(projectRoot, 'expo-router/entry') ?? getFallbackEntryRoot(projectRoot);\n if (!routerEntry) {\n return undefined;\n }\n // It doesn't matter if the app folder exists.\n const appFolder = path.join(projectRoot, routerDirectory);\n const appRoot = path.relative(path.dirname(routerEntry), appFolder);\n debug('expo-router entry', routerEntry, appFolder, appRoot);\n return appRoot;\n}\n\n/** If the `expo-router` package is not installed, then use the `expo` package to determine where the node modules are relative to the project. */\nfunction getFallbackEntryRoot(projectRoot: string): string {\n const expoRoot = resolveFrom.silent(projectRoot, 'expo/package.json');\n if (expoRoot) {\n return path.join(path.dirname(path.dirname(expoRoot)), 'expo-router/entry');\n }\n return path.join(projectRoot, 'node_modules/expo-router/entry');\n}\n\nexport function getRouterDirectoryModuleIdWithManifest(\n projectRoot: string,\n exp: ExpoConfig\n): string {\n return exp.extra?.router?.root ?? getRouterDirectory(projectRoot);\n}\n\nlet hasWarnedAboutSrcDir = false;\nconst logSrcDir = () => {\n if (hasWarnedAboutSrcDir) return;\n hasWarnedAboutSrcDir = true;\n Log.log(chalk.gray('Using src/app as the root directory for Expo Router.'));\n};\n\nexport function getRouterDirectory(projectRoot: string): string {\n // more specific directories first\n if (directoryExistsSync(path.join(projectRoot, 'src/app'))) {\n logSrcDir();\n return 'src/app';\n }\n\n debug('Using app as the root directory for Expo Router.');\n return 'app';\n}\n\nexport function isApiRouteConvention(name: string): boolean {\n return /\\+api\\.[tj]sx?$/.test(name);\n}\n\nexport function getApiRoutesForDirectory(cwd: string) {\n return globSync('**/*+api.@(ts|tsx|js|jsx)', {\n cwd,\n absolute: true,\n dot: true,\n });\n}\n\n// Used to emulate a context module, but way faster. TODO: May need to adjust the extensions to stay in sync with Metro.\nexport function getRoutePaths(cwd: string) {\n return globSync('**/*.@(ts|tsx|js|jsx)', {\n cwd,\n dot: true,\n }).map((p) => './' + normalizePaths(p));\n}\n\nfunction normalizePaths(p: string) {\n return p.replace(/\\\\/g, '/');\n}\n\nlet hasWarnedAboutApiRouteOutput = false;\n\nexport function hasWarnedAboutApiRoutes() {\n return hasWarnedAboutApiRouteOutput;\n}\n\nexport function warnInvalidWebOutput() {\n if (!hasWarnedAboutApiRouteOutput) {\n Log.warn(\n chalk.yellow`Using API routes requires the {bold web.output} to be set to {bold \"server\"} in the project {bold app.json}. ${learnMore(\n 'https://docs.expo.dev/router/reference/api-routes/'\n )}`\n );\n }\n\n hasWarnedAboutApiRouteOutput = true;\n}\n"],"names":["getAppRouterRelativeEntryPath","getRouterDirectoryModuleIdWithManifest","getRouterDirectory","isApiRouteConvention","getApiRoutesForDirectory","getRoutePaths","hasWarnedAboutApiRoutes","warnInvalidWebOutput","debug","require","projectRoot","routerDirectory","resolveFrom","routerEntry","silent","getFallbackEntryRoot","undefined","appFolder","path","join","appRoot","relative","dirname","expoRoot","exp","extra","router","root","hasWarnedAboutSrcDir","logSrcDir","Log","log","chalk","gray","directoryExistsSync","name","test","cwd","globSync","absolute","dot","map","p","normalizePaths","replace","hasWarnedAboutApiRouteOutput","warn","yellow","learnMore"],"mappings":"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"}
|
package/build/src/utils/env.js
CHANGED
|
@@ -145,6 +145,9 @@ class Env {
|
|
|
145
145
|
/** Set the default `user` that should be passed to `--user` with ADB commands. Used for installing APKs on Android devices with multiple profiles. Defaults to `0`. */ get EXPO_ADB_USER() {
|
|
146
146
|
return (0, _getenv().string)("EXPO_ADB_USER", "0");
|
|
147
147
|
}
|
|
148
|
+
/** Enable unstable/experimental Atlas to gather bundle information during development or export */ get EXPO_UNSTABLE_ATLAS() {
|
|
149
|
+
return (0, _getenv().boolish)("EXPO_UNSTABLE_ATLAS", false);
|
|
150
|
+
}
|
|
148
151
|
}
|
|
149
152
|
const env = new Env();
|
|
150
153
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/env.ts"],"sourcesContent":["import { boolish, int, string } from 'getenv';\n\n// @expo/webpack-config -> expo-pwa -> @expo/image-utils: EXPO_IMAGE_UTILS_NO_SHARP\n\n// TODO: EXPO_CLI_USERNAME, EXPO_CLI_PASSWORD\n\nclass Env {\n /** Enable profiling metrics */\n get EXPO_PROFILE() {\n return boolish('EXPO_PROFILE', false);\n }\n\n /** Enable debug logging */\n get EXPO_DEBUG() {\n return boolish('EXPO_DEBUG', false);\n }\n\n /** Disable all network requests */\n get EXPO_OFFLINE() {\n return boolish('EXPO_OFFLINE', false);\n }\n\n /** Enable the beta version of Expo (TODO: Should this just be in the beta version of expo releases?) */\n get EXPO_BETA() {\n return boolish('EXPO_BETA', false);\n }\n\n /** Enable staging API environment */\n get EXPO_STAGING() {\n return boolish('EXPO_STAGING', false);\n }\n\n /** Enable local API environment */\n get EXPO_LOCAL() {\n return boolish('EXPO_LOCAL', false);\n }\n\n /** Is running in non-interactive CI mode */\n get CI() {\n return boolish('CI', false);\n }\n\n /** Disable telemetry (analytics) */\n get EXPO_NO_TELEMETRY() {\n return boolish('EXPO_NO_TELEMETRY', false);\n }\n\n /** Disable detaching telemetry to separate process */\n get EXPO_NO_TELEMETRY_DETACH() {\n return boolish('EXPO_NO_TELEMETRY_DETACH', false);\n }\n\n /** local directory to the universe repo for testing locally */\n get EXPO_UNIVERSE_DIR() {\n return string('EXPO_UNIVERSE_DIR', '');\n }\n\n /** @deprecated Default Webpack host string */\n get WEB_HOST() {\n return string('WEB_HOST', '0.0.0.0');\n }\n\n /** Skip warning users about a dirty git status */\n get EXPO_NO_GIT_STATUS() {\n return boolish('EXPO_NO_GIT_STATUS', false);\n }\n /** Disable auto web setup */\n get EXPO_NO_WEB_SETUP() {\n return boolish('EXPO_NO_WEB_SETUP', false);\n }\n /** Disable auto TypeScript setup */\n get EXPO_NO_TYPESCRIPT_SETUP() {\n return boolish('EXPO_NO_TYPESCRIPT_SETUP', false);\n }\n /** Disable all API caches. Does not disable bundler caches. */\n get EXPO_NO_CACHE() {\n return boolish('EXPO_NO_CACHE', false);\n }\n /** Disable the app select redirect page. */\n get EXPO_NO_REDIRECT_PAGE() {\n return boolish('EXPO_NO_REDIRECT_PAGE', false);\n }\n /** The React Metro port that's baked into react-native scripts and tools. */\n get RCT_METRO_PORT() {\n return int('RCT_METRO_PORT', 0);\n }\n /** Skip validating the manifest during `export`. */\n get EXPO_SKIP_MANIFEST_VALIDATION_TOKEN(): boolean {\n return !!string('EXPO_SKIP_MANIFEST_VALIDATION_TOKEN', '');\n }\n\n /** Public folder path relative to the project root. Default to `public` */\n get EXPO_PUBLIC_FOLDER(): string {\n return string('EXPO_PUBLIC_FOLDER', 'public');\n }\n\n /** Higher priority `$EDIOTR` variable for indicating which editor to use when pressing `o` in the Terminal UI. */\n get EXPO_EDITOR(): string {\n return string('EXPO_EDITOR', '');\n }\n\n /** Enable auto server root detection for Metro. This will change the server root to the workspace root. */\n get EXPO_USE_METRO_WORKSPACE_ROOT(): boolean {\n return boolish('EXPO_USE_METRO_WORKSPACE_ROOT', false);\n }\n\n /**\n * Overwrite the dev server URL, disregarding the `--port`, `--host`, `--tunnel`, `--lan`, `--localhost` arguments.\n * This is useful for browser editors that require custom proxy URLs.\n */\n get EXPO_PACKAGER_PROXY_URL(): string {\n return string('EXPO_PACKAGER_PROXY_URL', '');\n }\n\n /**\n * **Experimental** - Disable using `exp.direct` as the hostname for\n * `--tunnel` connections. This enables **https://** forwarding which\n * can be used to test universal links on iOS.\n *\n * This may cause issues with `expo-linking` and Expo Go.\n *\n * Select the exact subdomain by passing a string value that is not one of: `true`, `false`, `1`, `0`.\n */\n get EXPO_TUNNEL_SUBDOMAIN(): string | boolean {\n const subdomain = string('EXPO_TUNNEL_SUBDOMAIN', '');\n if (['0', 'false', ''].includes(subdomain)) {\n return false;\n } else if (['1', 'true'].includes(subdomain)) {\n return true;\n }\n return subdomain;\n }\n\n /**\n * Force Expo CLI to use the [`resolver.resolverMainFields`](https://facebook.github.io/metro/docs/configuration/#resolvermainfields) from the project `metro.config.js` for all platforms.\n *\n * By default, Expo CLI will use `['browser', 'module', 'main']` (default for Webpack) for web and the user-defined main fields for other platforms.\n */\n get EXPO_METRO_NO_MAIN_FIELD_OVERRIDE(): boolean {\n return boolish('EXPO_METRO_NO_MAIN_FIELD_OVERRIDE', false);\n }\n\n /**\n * HTTP/HTTPS proxy to connect to for network requests. Configures [https-proxy-agent](https://www.npmjs.com/package/https-proxy-agent).\n */\n get HTTP_PROXY(): string {\n return process.env.HTTP_PROXY || process.env.http_proxy || '';\n }\n\n /**\n * Use the network inspector by overriding the metro inspector proxy with a custom version.\n * @deprecated This has been replaced by `@react-native/dev-middleware` and is now unused.\n */\n get EXPO_NO_INSPECTOR_PROXY(): boolean {\n return boolish('EXPO_NO_INSPECTOR_PROXY', false);\n }\n\n /** Disable lazy bundling in Metro bundler. */\n get EXPO_NO_METRO_LAZY() {\n return boolish('EXPO_NO_METRO_LAZY', false);\n }\n\n /** Enable the unstable inverse dependency stack trace for Metro bundling errors. */\n get EXPO_METRO_UNSTABLE_ERRORS() {\n return boolish('EXPO_METRO_UNSTABLE_ERRORS', false);\n }\n\n /** Enable the unstable fast resolver for Metro. */\n get EXPO_USE_FAST_RESOLVER() {\n return boolish('EXPO_USE_FAST_RESOLVER', false);\n }\n\n /** Disable Environment Variable injection in client bundles. */\n get EXPO_NO_CLIENT_ENV_VARS(): boolean {\n return boolish('EXPO_NO_CLIENT_ENV_VARS', false);\n }\n\n /** Enable the React Native JS Inspector, instead of the \"classic\" Chrome DevTools (SDK <=49) */\n get EXPO_USE_UNSTABLE_DEBUGGER(): boolean {\n return boolish('EXPO_USE_UNSTABLE_DEBUGGER', false);\n }\n\n /** Set the default `user` that should be passed to `--user` with ADB commands. Used for installing APKs on Android devices with multiple profiles. Defaults to `0`. */\n get EXPO_ADB_USER(): string {\n return string('EXPO_ADB_USER', '0');\n }\n}\n\nexport const env = new Env();\n"],"names":["env","Env","EXPO_PROFILE","boolish","EXPO_DEBUG","EXPO_OFFLINE","EXPO_BETA","EXPO_STAGING","EXPO_LOCAL","CI","EXPO_NO_TELEMETRY","EXPO_NO_TELEMETRY_DETACH","EXPO_UNIVERSE_DIR","string","WEB_HOST","EXPO_NO_GIT_STATUS","EXPO_NO_WEB_SETUP","EXPO_NO_TYPESCRIPT_SETUP","EXPO_NO_CACHE","EXPO_NO_REDIRECT_PAGE","RCT_METRO_PORT","int","EXPO_SKIP_MANIFEST_VALIDATION_TOKEN","EXPO_PUBLIC_FOLDER","EXPO_EDITOR","EXPO_USE_METRO_WORKSPACE_ROOT","EXPO_PACKAGER_PROXY_URL","EXPO_TUNNEL_SUBDOMAIN","subdomain","includes","EXPO_METRO_NO_MAIN_FIELD_OVERRIDE","HTTP_PROXY","process","http_proxy","EXPO_NO_INSPECTOR_PROXY","EXPO_NO_METRO_LAZY","EXPO_METRO_UNSTABLE_ERRORS","EXPO_USE_FAST_RESOLVER","EXPO_NO_CLIENT_ENV_VARS","EXPO_USE_UNSTABLE_DEBUGGER","EXPO_ADB_USER"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/env.ts"],"sourcesContent":["import { boolish, int, string } from 'getenv';\n\n// @expo/webpack-config -> expo-pwa -> @expo/image-utils: EXPO_IMAGE_UTILS_NO_SHARP\n\n// TODO: EXPO_CLI_USERNAME, EXPO_CLI_PASSWORD\n\nclass Env {\n /** Enable profiling metrics */\n get EXPO_PROFILE() {\n return boolish('EXPO_PROFILE', false);\n }\n\n /** Enable debug logging */\n get EXPO_DEBUG() {\n return boolish('EXPO_DEBUG', false);\n }\n\n /** Disable all network requests */\n get EXPO_OFFLINE() {\n return boolish('EXPO_OFFLINE', false);\n }\n\n /** Enable the beta version of Expo (TODO: Should this just be in the beta version of expo releases?) */\n get EXPO_BETA() {\n return boolish('EXPO_BETA', false);\n }\n\n /** Enable staging API environment */\n get EXPO_STAGING() {\n return boolish('EXPO_STAGING', false);\n }\n\n /** Enable local API environment */\n get EXPO_LOCAL() {\n return boolish('EXPO_LOCAL', false);\n }\n\n /** Is running in non-interactive CI mode */\n get CI() {\n return boolish('CI', false);\n }\n\n /** Disable telemetry (analytics) */\n get EXPO_NO_TELEMETRY() {\n return boolish('EXPO_NO_TELEMETRY', false);\n }\n\n /** Disable detaching telemetry to separate process */\n get EXPO_NO_TELEMETRY_DETACH() {\n return boolish('EXPO_NO_TELEMETRY_DETACH', false);\n }\n\n /** local directory to the universe repo for testing locally */\n get EXPO_UNIVERSE_DIR() {\n return string('EXPO_UNIVERSE_DIR', '');\n }\n\n /** @deprecated Default Webpack host string */\n get WEB_HOST() {\n return string('WEB_HOST', '0.0.0.0');\n }\n\n /** Skip warning users about a dirty git status */\n get EXPO_NO_GIT_STATUS() {\n return boolish('EXPO_NO_GIT_STATUS', false);\n }\n /** Disable auto web setup */\n get EXPO_NO_WEB_SETUP() {\n return boolish('EXPO_NO_WEB_SETUP', false);\n }\n /** Disable auto TypeScript setup */\n get EXPO_NO_TYPESCRIPT_SETUP() {\n return boolish('EXPO_NO_TYPESCRIPT_SETUP', false);\n }\n /** Disable all API caches. Does not disable bundler caches. */\n get EXPO_NO_CACHE() {\n return boolish('EXPO_NO_CACHE', false);\n }\n /** Disable the app select redirect page. */\n get EXPO_NO_REDIRECT_PAGE() {\n return boolish('EXPO_NO_REDIRECT_PAGE', false);\n }\n /** The React Metro port that's baked into react-native scripts and tools. */\n get RCT_METRO_PORT() {\n return int('RCT_METRO_PORT', 0);\n }\n /** Skip validating the manifest during `export`. */\n get EXPO_SKIP_MANIFEST_VALIDATION_TOKEN(): boolean {\n return !!string('EXPO_SKIP_MANIFEST_VALIDATION_TOKEN', '');\n }\n\n /** Public folder path relative to the project root. Default to `public` */\n get EXPO_PUBLIC_FOLDER(): string {\n return string('EXPO_PUBLIC_FOLDER', 'public');\n }\n\n /** Higher priority `$EDIOTR` variable for indicating which editor to use when pressing `o` in the Terminal UI. */\n get EXPO_EDITOR(): string {\n return string('EXPO_EDITOR', '');\n }\n\n /** Enable auto server root detection for Metro. This will change the server root to the workspace root. */\n get EXPO_USE_METRO_WORKSPACE_ROOT(): boolean {\n return boolish('EXPO_USE_METRO_WORKSPACE_ROOT', false);\n }\n\n /**\n * Overwrite the dev server URL, disregarding the `--port`, `--host`, `--tunnel`, `--lan`, `--localhost` arguments.\n * This is useful for browser editors that require custom proxy URLs.\n */\n get EXPO_PACKAGER_PROXY_URL(): string {\n return string('EXPO_PACKAGER_PROXY_URL', '');\n }\n\n /**\n * **Experimental** - Disable using `exp.direct` as the hostname for\n * `--tunnel` connections. This enables **https://** forwarding which\n * can be used to test universal links on iOS.\n *\n * This may cause issues with `expo-linking` and Expo Go.\n *\n * Select the exact subdomain by passing a string value that is not one of: `true`, `false`, `1`, `0`.\n */\n get EXPO_TUNNEL_SUBDOMAIN(): string | boolean {\n const subdomain = string('EXPO_TUNNEL_SUBDOMAIN', '');\n if (['0', 'false', ''].includes(subdomain)) {\n return false;\n } else if (['1', 'true'].includes(subdomain)) {\n return true;\n }\n return subdomain;\n }\n\n /**\n * Force Expo CLI to use the [`resolver.resolverMainFields`](https://facebook.github.io/metro/docs/configuration/#resolvermainfields) from the project `metro.config.js` for all platforms.\n *\n * By default, Expo CLI will use `['browser', 'module', 'main']` (default for Webpack) for web and the user-defined main fields for other platforms.\n */\n get EXPO_METRO_NO_MAIN_FIELD_OVERRIDE(): boolean {\n return boolish('EXPO_METRO_NO_MAIN_FIELD_OVERRIDE', false);\n }\n\n /**\n * HTTP/HTTPS proxy to connect to for network requests. Configures [https-proxy-agent](https://www.npmjs.com/package/https-proxy-agent).\n */\n get HTTP_PROXY(): string {\n return process.env.HTTP_PROXY || process.env.http_proxy || '';\n }\n\n /**\n * Use the network inspector by overriding the metro inspector proxy with a custom version.\n * @deprecated This has been replaced by `@react-native/dev-middleware` and is now unused.\n */\n get EXPO_NO_INSPECTOR_PROXY(): boolean {\n return boolish('EXPO_NO_INSPECTOR_PROXY', false);\n }\n\n /** Disable lazy bundling in Metro bundler. */\n get EXPO_NO_METRO_LAZY() {\n return boolish('EXPO_NO_METRO_LAZY', false);\n }\n\n /** Enable the unstable inverse dependency stack trace for Metro bundling errors. */\n get EXPO_METRO_UNSTABLE_ERRORS() {\n return boolish('EXPO_METRO_UNSTABLE_ERRORS', false);\n }\n\n /** Enable the unstable fast resolver for Metro. */\n get EXPO_USE_FAST_RESOLVER() {\n return boolish('EXPO_USE_FAST_RESOLVER', false);\n }\n\n /** Disable Environment Variable injection in client bundles. */\n get EXPO_NO_CLIENT_ENV_VARS(): boolean {\n return boolish('EXPO_NO_CLIENT_ENV_VARS', false);\n }\n\n /** Enable the React Native JS Inspector, instead of the \"classic\" Chrome DevTools (SDK <=49) */\n get EXPO_USE_UNSTABLE_DEBUGGER(): boolean {\n return boolish('EXPO_USE_UNSTABLE_DEBUGGER', false);\n }\n\n /** Set the default `user` that should be passed to `--user` with ADB commands. Used for installing APKs on Android devices with multiple profiles. Defaults to `0`. */\n get EXPO_ADB_USER(): string {\n return string('EXPO_ADB_USER', '0');\n }\n\n /** Enable unstable/experimental Atlas to gather bundle information during development or export */\n get EXPO_UNSTABLE_ATLAS() {\n return boolish('EXPO_UNSTABLE_ATLAS', false);\n }\n}\n\nexport const env = new Env();\n"],"names":["env","Env","EXPO_PROFILE","boolish","EXPO_DEBUG","EXPO_OFFLINE","EXPO_BETA","EXPO_STAGING","EXPO_LOCAL","CI","EXPO_NO_TELEMETRY","EXPO_NO_TELEMETRY_DETACH","EXPO_UNIVERSE_DIR","string","WEB_HOST","EXPO_NO_GIT_STATUS","EXPO_NO_WEB_SETUP","EXPO_NO_TYPESCRIPT_SETUP","EXPO_NO_CACHE","EXPO_NO_REDIRECT_PAGE","RCT_METRO_PORT","int","EXPO_SKIP_MANIFEST_VALIDATION_TOKEN","EXPO_PUBLIC_FOLDER","EXPO_EDITOR","EXPO_USE_METRO_WORKSPACE_ROOT","EXPO_PACKAGER_PROXY_URL","EXPO_TUNNEL_SUBDOMAIN","subdomain","includes","EXPO_METRO_NO_MAIN_FIELD_OVERRIDE","HTTP_PROXY","process","http_proxy","EXPO_NO_INSPECTOR_PROXY","EXPO_NO_METRO_LAZY","EXPO_METRO_UNSTABLE_ERRORS","EXPO_USE_FAST_RESOLVER","EXPO_NO_CLIENT_ENV_VARS","EXPO_USE_UNSTABLE_DEBUGGER","EXPO_ADB_USER","EXPO_UNSTABLE_ATLAS"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@expo/cli",
|
|
3
|
-
"version": "0.18.
|
|
3
|
+
"version": "0.18.3",
|
|
4
4
|
"description": "The Expo CLI",
|
|
5
5
|
"main": "build/bin/cli",
|
|
6
6
|
"bin": {
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"@expo/json-file": "^8.3.0",
|
|
48
48
|
"@expo/metro-config": "~0.18.0",
|
|
49
49
|
"@expo/osascript": "^2.0.31",
|
|
50
|
-
"@expo/package-manager": "^1.
|
|
50
|
+
"@expo/package-manager": "^1.5.0",
|
|
51
51
|
"@expo/plist": "^0.1.0",
|
|
52
52
|
"@expo/prebuild-config": "7.0.1",
|
|
53
53
|
"@expo/rudder-sdk-node": "1.1.1",
|
|
@@ -155,6 +155,7 @@
|
|
|
155
155
|
"@types/wrap-ansi": "^8.0.1",
|
|
156
156
|
"@types/ws": "^8.5.4",
|
|
157
157
|
"devtools-protocol": "^0.0.1113120",
|
|
158
|
+
"expo-atlas": "^0.1.0",
|
|
158
159
|
"expo-module-scripts": "^3.0.0",
|
|
159
160
|
"find-process": "^1.4.7",
|
|
160
161
|
"jest-runner-tsd": "^6.0.0",
|
|
@@ -167,5 +168,5 @@
|
|
|
167
168
|
"tree-kill": "^1.2.2",
|
|
168
169
|
"tsd": "^0.28.1"
|
|
169
170
|
},
|
|
170
|
-
"gitHead": "
|
|
171
|
+
"gitHead": "f8f9d041c6467f325b58c7913e0f5ed1af102e11"
|
|
171
172
|
}
|