@expo/cli 0.20.6 → 0.21.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/bin/cli +5 -3
- package/build/bin/cli.map +1 -1
- package/build/src/run/ios/appleDevice/AppleDevice.js +1 -0
- package/build/src/run/ios/appleDevice/AppleDevice.js.map +1 -1
- package/build/src/serve/index.js +91 -0
- package/build/src/serve/index.js.map +1 -0
- package/build/src/serve/serveAsync.js +218 -0
- package/build/src/serve/serveAsync.js.map +1 -0
- package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +3 -15
- package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -1
- package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js +8 -0
- package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js.map +1 -1
- package/build/src/start/server/metro/MetroBundlerDevServer.js +22 -17
- package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
- package/build/src/start/server/metro/createServerComponentsMiddleware.js +22 -11
- package/build/src/start/server/metro/createServerComponentsMiddleware.js.map +1 -1
- package/build/src/start/server/metro/instantiateMetro.js +113 -8
- package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
- package/build/src/start/server/metro/metroErrors.js +1 -1
- package/build/src/start/server/metro/metroErrors.js.map +1 -1
- package/build/src/start/server/metro/metroPrivateServer.js.map +1 -1
- package/build/src/start/server/metro/withMetroMultiPlatform.js +7 -2
- package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
- package/build/src/utils/env.js +5 -2
- package/build/src/utils/env.js.map +1 -1
- package/build/src/utils/telemetry/clients/FetchClient.js +1 -1
- package/build/src/utils/telemetry/utils/context.js +1 -1
- package/package.json +2 -2
package/build/bin/cli
CHANGED
|
@@ -94,6 +94,7 @@ const commands = {
|
|
|
94
94
|
export: ()=>Promise.resolve().then(()=>/*#__PURE__*/ _interopRequireWildcard(require("../src/export/index.js"))).then((i)=>i.expoExport),
|
|
95
95
|
"export:web": ()=>Promise.resolve().then(()=>/*#__PURE__*/ _interopRequireWildcard(require("../src/export/web/index.js"))).then((i)=>i.expoExportWeb),
|
|
96
96
|
"export:embed": ()=>Promise.resolve().then(()=>/*#__PURE__*/ _interopRequireWildcard(require("../src/export/embed/index.js"))).then((i)=>i.expoExportEmbed),
|
|
97
|
+
serve: ()=>Promise.resolve().then(()=>/*#__PURE__*/ _interopRequireWildcard(require("../src/serve/index.js"))).then((i)=>i.expoServe),
|
|
97
98
|
// Auxiliary commands
|
|
98
99
|
install: ()=>Promise.resolve().then(()=>/*#__PURE__*/ _interopRequireWildcard(require("../src/install/index.js"))).then((i)=>i.expoInstall),
|
|
99
100
|
add: ()=>Promise.resolve().then(()=>/*#__PURE__*/ _interopRequireWildcard(require("../src/install/index.js"))).then((i)=>i.expoInstall),
|
|
@@ -120,7 +121,7 @@ const args = (0, _arg().default)({
|
|
|
120
121
|
});
|
|
121
122
|
if (args["--version"]) {
|
|
122
123
|
// Version is added in the build script.
|
|
123
|
-
console.log("0.
|
|
124
|
+
console.log("0.21.1");
|
|
124
125
|
process.exit(0);
|
|
125
126
|
}
|
|
126
127
|
if (args["--non-interactive"]) {
|
|
@@ -136,7 +137,7 @@ if (!isSubcommand && args["--help"]) {
|
|
|
136
137
|
"export:embed": exportEmbed_unused , // The export:web command is deprecated. Hide it from the help prompt.
|
|
137
138
|
"export:web": exportWeb_unused , // Other ignored commands, these are intentially not listed in the `--help` output
|
|
138
139
|
run: _run , // NOTE(cedric): Still pending the migration to ESLint's flat config
|
|
139
|
-
lint: _lint , // All other commands
|
|
140
|
+
lint: _lint , serve , // All other commands
|
|
140
141
|
...others } = commands;
|
|
141
142
|
console.log((0, _chalk().default)`
|
|
142
143
|
{bold Usage}
|
|
@@ -156,7 +157,8 @@ if (!isSubcommand && args["--help"]) {
|
|
|
156
157
|
${Object.keys({
|
|
157
158
|
install,
|
|
158
159
|
customize,
|
|
159
|
-
config
|
|
160
|
+
config,
|
|
161
|
+
serve
|
|
160
162
|
}).join(", ")}
|
|
161
163
|
{dim ${Object.keys({
|
|
162
164
|
login,
|
package/build/bin/cli.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../bin/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport arg from 'arg';\nimport chalk from 'chalk';\nimport Debug from 'debug';\nimport { boolish } from 'getenv';\n\n// Setup before requiring `debug`.\nif (boolish('EXPO_DEBUG', false)) {\n Debug.enable('expo:*');\n} else if (Debug.enabled('expo:')) {\n process.env.EXPO_DEBUG = '1';\n}\n\nconst defaultCmd = 'start';\n\nexport type Command = (argv?: string[]) => void;\n\nconst commands: { [command: string]: () => Promise<Command> } = {\n // Add a new command here\n // NOTE(EvanBacon): Ensure every bundler-related command sets `NODE_ENV` as expected for the command.\n run: () => import('../src/run/index.js').then((i) => i.expoRun),\n 'run:ios': () => import('../src/run/ios/index.js').then((i) => i.expoRunIos),\n 'run:android': () => import('../src/run/android/index.js').then((i) => i.expoRunAndroid),\n start: () => import('../src/start/index.js').then((i) => i.expoStart),\n prebuild: () => import('../src/prebuild/index.js').then((i) => i.expoPrebuild),\n config: () => import('../src/config/index.js').then((i) => i.expoConfig),\n export: () => import('../src/export/index.js').then((i) => i.expoExport),\n 'export:web': () => import('../src/export/web/index.js').then((i) => i.expoExportWeb),\n 'export:embed': () => import('../src/export/embed/index.js').then((i) => i.expoExportEmbed),\n\n // Auxiliary commands\n install: () => import('../src/install/index.js').then((i) => i.expoInstall),\n add: () => import('../src/install/index.js').then((i) => i.expoInstall),\n customize: () => import('../src/customize/index.js').then((i) => i.expoCustomize),\n lint: () => import('../src/lint/index.js').then((i) => i.expoLint),\n\n // Auth\n login: () => import('../src/login/index.js').then((i) => i.expoLogin),\n logout: () => import('../src/logout/index.js').then((i) => i.expoLogout),\n register: () => import('../src/register/index.js').then((i) => i.expoRegister),\n whoami: () => import('../src/whoami/index.js').then((i) => i.expoWhoami),\n};\n\nconst args = arg(\n {\n // Types\n '--version': Boolean,\n '--help': Boolean,\n // NOTE(EvanBacon): This is here to silence warnings from processes that\n // expect the global expo-cli.\n '--non-interactive': Boolean,\n\n // Aliases\n '-v': '--version',\n '-h': '--help',\n },\n {\n permissive: true,\n }\n);\n\nif (args['--version']) {\n // Version is added in the build script.\n console.log(process.env.__EXPO_VERSION);\n process.exit(0);\n}\n\nif (args['--non-interactive']) {\n console.warn(chalk.yellow` {bold --non-interactive} is not supported, use {bold $CI=1} instead`);\n}\n\n// Check if we are running `npx expo <subcommand>` or `npx expo`\nconst isSubcommand = Boolean(commands[args._[0]]);\n\n// Handle `--help` flag\nif (!isSubcommand && args['--help']) {\n const {\n login,\n logout,\n whoami,\n register,\n start,\n install,\n add,\n export: _export,\n config,\n customize,\n prebuild,\n 'run:ios': runIos,\n 'run:android': runAndroid,\n // NOTE(EvanBacon): Don't document this command as it's a temporary\n // workaround until we can use `expo export` for all production bundling.\n // https://github.com/expo/expo/pull/21396/files#r1121025873\n 'export:embed': exportEmbed_unused,\n // The export:web command is deprecated. Hide it from the help prompt.\n 'export:web': exportWeb_unused,\n // Other ignored commands, these are intentially not listed in the `--help` output\n run: _run,\n // NOTE(cedric): Still pending the migration to ESLint's flat config\n lint: _lint,\n // All other commands\n ...others\n } = commands;\n\n console.log(chalk`\n {bold Usage}\n {dim $} npx expo <command>\n\n {bold Commands}\n ${Object.keys({ start, export: _export, ...others }).join(', ')}\n ${Object.keys({ 'run:ios': runIos, 'run:android': runAndroid, prebuild }).join(', ')}\n ${Object.keys({ install, customize, config }).join(', ')}\n {dim ${Object.keys({ login, logout, whoami, register }).join(', ')}}\n\n {bold Options}\n --version, -v Version number\n --help, -h Usage info\n\n For more info run a command with the {bold --help} flag\n {dim $} npx expo start --help\n`);\n\n process.exit(0);\n}\n\n// NOTE(EvanBacon): Squat some directory names to help with migration,\n// users can still use folders named \"send\" or \"eject\" by using the fully qualified `npx expo start ./send`.\nif (!isSubcommand) {\n const migrationMap: Record<string, string> = {\n init: 'npx create-expo-app',\n eject: 'npx expo prebuild',\n web: 'npx expo start --web',\n 'start:web': 'npx expo start --web',\n 'build:ios': 'eas build -p ios',\n 'build:android': 'eas build -p android',\n 'client:install:ios': 'npx expo start --ios',\n 'client:install:android': 'npx expo start --android',\n doctor: 'npx expo-doctor',\n upgrade: 'https://docs.expo.dev/workflow/upgrading-expo-sdk-walkthrough/',\n 'customize:web': 'npx expo customize',\n\n publish: 'eas update',\n 'publish:set': 'eas update',\n 'publish:rollback': 'eas update',\n 'publish:history': 'eas update',\n 'publish:details': 'eas update',\n\n 'build:web': 'npx expo export:web',\n\n 'credentials:manager': `eas credentials`,\n 'fetch:ios:certs': `eas credentials`,\n 'fetch:android:keystore': `eas credentials`,\n 'fetch:android:hashes': `eas credentials`,\n 'fetch:android:upload-cert': `eas credentials`,\n 'push:android:upload': `eas credentials`,\n 'push:android:show': `eas credentials`,\n 'push:android:clear': `eas credentials`,\n url: `eas build:list`,\n 'url:ipa': `eas build:list`,\n 'url:apk': `eas build:list`,\n webhooks: `eas webhook`,\n 'webhooks:add': `eas webhook:create`,\n 'webhooks:remove': `eas webhook:delete`,\n 'webhooks:update': `eas webhook:update`,\n\n 'build:status': `eas build:list`,\n 'upload:android': `eas submit -p android`,\n 'upload:ios': `eas submit -p ios`,\n };\n\n // TODO: Log telemetry about invalid command used.\n const subcommand = args._[0];\n if (subcommand in migrationMap) {\n const replacement = migrationMap[subcommand];\n console.log();\n const instruction = subcommand === 'upgrade' ? 'follow this guide' : 'use';\n console.log(\n chalk.yellow` {gray $} {bold expo ${subcommand}} is not supported in the local CLI, please ${instruction} {bold ${replacement}} instead`\n );\n console.log();\n process.exit(1);\n }\n const deprecated = ['send', 'client:ios'];\n if (deprecated.includes(subcommand)) {\n console.log();\n console.log(chalk.yellow` {gray $} {bold expo ${subcommand}} is deprecated`);\n console.log();\n process.exit(1);\n }\n}\n\nconst command = isSubcommand ? args._[0] : defaultCmd;\nconst commandArgs = isSubcommand ? args._.slice(1) : args._;\n\n// Push the help flag to the subcommand args.\nif (args['--help']) {\n commandArgs.push('--help');\n}\n\n// Install exit hooks\nprocess.on('SIGINT', () => process.exit(0));\nprocess.on('SIGTERM', () => process.exit(0));\n\ncommands[command]().then((exec) => {\n exec(commandArgs);\n\n // NOTE(EvanBacon): Track some basic telemetry events indicating the command\n // that was run. This can be disabled with the $EXPO_NO_TELEMETRY environment variable.\n // We do this to determine how well deprecations are going before removing a command.\n if (!boolish('EXPO_NO_TELEMETRY', false)) {\n const { recordCommand } =\n require('../src/utils/telemetry') as typeof import('../src/utils/telemetry');\n recordCommand(command);\n }\n});\n"],"names":["boolish","Debug","enable","enabled","process","env","EXPO_DEBUG","defaultCmd","commands","run","then","i","expoRun","expoRunIos","expoRunAndroid","start","expoStart","prebuild","expoPrebuild","config","expoConfig","export","expoExport","expoExportWeb","expoExportEmbed","install","expoInstall","add","customize","expoCustomize","lint","expoLint","login","expoLogin","logout","expoLogout","register","expoRegister","whoami","expoWhoami","args","arg","Boolean","permissive","console","log","__EXPO_VERSION","exit","warn","chalk","yellow","isSubcommand","_","_export","runIos","runAndroid","exportEmbed_unused","exportWeb_unused","_run","_lint","others","Object","keys","join","migrationMap","init","eject","web","doctor","upgrade","publish","url","webhooks","subcommand","replacement","instruction","deprecated","includes","command","commandArgs","slice","push","on","exec","recordCommand","require"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../bin/cli.ts"],"sourcesContent":["#!/usr/bin/env node\nimport arg from 'arg';\nimport chalk from 'chalk';\nimport Debug from 'debug';\nimport { boolish } from 'getenv';\n\n// Setup before requiring `debug`.\nif (boolish('EXPO_DEBUG', false)) {\n Debug.enable('expo:*');\n} else if (Debug.enabled('expo:')) {\n process.env.EXPO_DEBUG = '1';\n}\n\nconst defaultCmd = 'start';\n\nexport type Command = (argv?: string[]) => void;\n\nconst commands: { [command: string]: () => Promise<Command> } = {\n // Add a new command here\n // NOTE(EvanBacon): Ensure every bundler-related command sets `NODE_ENV` as expected for the command.\n run: () => import('../src/run/index.js').then((i) => i.expoRun),\n 'run:ios': () => import('../src/run/ios/index.js').then((i) => i.expoRunIos),\n 'run:android': () => import('../src/run/android/index.js').then((i) => i.expoRunAndroid),\n start: () => import('../src/start/index.js').then((i) => i.expoStart),\n prebuild: () => import('../src/prebuild/index.js').then((i) => i.expoPrebuild),\n config: () => import('../src/config/index.js').then((i) => i.expoConfig),\n export: () => import('../src/export/index.js').then((i) => i.expoExport),\n 'export:web': () => import('../src/export/web/index.js').then((i) => i.expoExportWeb),\n 'export:embed': () => import('../src/export/embed/index.js').then((i) => i.expoExportEmbed),\n\n serve: () => import('../src/serve/index.js').then((i) => i.expoServe),\n\n // Auxiliary commands\n install: () => import('../src/install/index.js').then((i) => i.expoInstall),\n add: () => import('../src/install/index.js').then((i) => i.expoInstall),\n customize: () => import('../src/customize/index.js').then((i) => i.expoCustomize),\n lint: () => import('../src/lint/index.js').then((i) => i.expoLint),\n\n // Auth\n login: () => import('../src/login/index.js').then((i) => i.expoLogin),\n logout: () => import('../src/logout/index.js').then((i) => i.expoLogout),\n register: () => import('../src/register/index.js').then((i) => i.expoRegister),\n whoami: () => import('../src/whoami/index.js').then((i) => i.expoWhoami),\n};\n\nconst args = arg(\n {\n // Types\n '--version': Boolean,\n '--help': Boolean,\n // NOTE(EvanBacon): This is here to silence warnings from processes that\n // expect the global expo-cli.\n '--non-interactive': Boolean,\n\n // Aliases\n '-v': '--version',\n '-h': '--help',\n },\n {\n permissive: true,\n }\n);\n\nif (args['--version']) {\n // Version is added in the build script.\n console.log(process.env.__EXPO_VERSION);\n process.exit(0);\n}\n\nif (args['--non-interactive']) {\n console.warn(chalk.yellow` {bold --non-interactive} is not supported, use {bold $CI=1} instead`);\n}\n\n// Check if we are running `npx expo <subcommand>` or `npx expo`\nconst isSubcommand = Boolean(commands[args._[0]]);\n\n// Handle `--help` flag\nif (!isSubcommand && args['--help']) {\n const {\n login,\n logout,\n whoami,\n register,\n start,\n install,\n add,\n export: _export,\n config,\n customize,\n prebuild,\n 'run:ios': runIos,\n 'run:android': runAndroid,\n // NOTE(EvanBacon): Don't document this command as it's a temporary\n // workaround until we can use `expo export` for all production bundling.\n // https://github.com/expo/expo/pull/21396/files#r1121025873\n 'export:embed': exportEmbed_unused,\n // The export:web command is deprecated. Hide it from the help prompt.\n 'export:web': exportWeb_unused,\n // Other ignored commands, these are intentially not listed in the `--help` output\n run: _run,\n // NOTE(cedric): Still pending the migration to ESLint's flat config\n lint: _lint,\n serve,\n // All other commands\n ...others\n } = commands;\n\n console.log(chalk`\n {bold Usage}\n {dim $} npx expo <command>\n\n {bold Commands}\n ${Object.keys({ start, export: _export, ...others }).join(', ')}\n ${Object.keys({ 'run:ios': runIos, 'run:android': runAndroid, prebuild }).join(', ')}\n ${Object.keys({ install, customize, config, serve }).join(', ')}\n {dim ${Object.keys({ login, logout, whoami, register }).join(', ')}}\n\n {bold Options}\n --version, -v Version number\n --help, -h Usage info\n\n For more info run a command with the {bold --help} flag\n {dim $} npx expo start --help\n`);\n\n process.exit(0);\n}\n\n// NOTE(EvanBacon): Squat some directory names to help with migration,\n// users can still use folders named \"send\" or \"eject\" by using the fully qualified `npx expo start ./send`.\nif (!isSubcommand) {\n const migrationMap: Record<string, string> = {\n init: 'npx create-expo-app',\n eject: 'npx expo prebuild',\n web: 'npx expo start --web',\n 'start:web': 'npx expo start --web',\n 'build:ios': 'eas build -p ios',\n 'build:android': 'eas build -p android',\n 'client:install:ios': 'npx expo start --ios',\n 'client:install:android': 'npx expo start --android',\n doctor: 'npx expo-doctor',\n upgrade: 'https://docs.expo.dev/workflow/upgrading-expo-sdk-walkthrough/',\n 'customize:web': 'npx expo customize',\n\n publish: 'eas update',\n 'publish:set': 'eas update',\n 'publish:rollback': 'eas update',\n 'publish:history': 'eas update',\n 'publish:details': 'eas update',\n\n 'build:web': 'npx expo export:web',\n\n 'credentials:manager': `eas credentials`,\n 'fetch:ios:certs': `eas credentials`,\n 'fetch:android:keystore': `eas credentials`,\n 'fetch:android:hashes': `eas credentials`,\n 'fetch:android:upload-cert': `eas credentials`,\n 'push:android:upload': `eas credentials`,\n 'push:android:show': `eas credentials`,\n 'push:android:clear': `eas credentials`,\n url: `eas build:list`,\n 'url:ipa': `eas build:list`,\n 'url:apk': `eas build:list`,\n webhooks: `eas webhook`,\n 'webhooks:add': `eas webhook:create`,\n 'webhooks:remove': `eas webhook:delete`,\n 'webhooks:update': `eas webhook:update`,\n\n 'build:status': `eas build:list`,\n 'upload:android': `eas submit -p android`,\n 'upload:ios': `eas submit -p ios`,\n };\n\n // TODO: Log telemetry about invalid command used.\n const subcommand = args._[0];\n if (subcommand in migrationMap) {\n const replacement = migrationMap[subcommand];\n console.log();\n const instruction = subcommand === 'upgrade' ? 'follow this guide' : 'use';\n console.log(\n chalk.yellow` {gray $} {bold expo ${subcommand}} is not supported in the local CLI, please ${instruction} {bold ${replacement}} instead`\n );\n console.log();\n process.exit(1);\n }\n const deprecated = ['send', 'client:ios'];\n if (deprecated.includes(subcommand)) {\n console.log();\n console.log(chalk.yellow` {gray $} {bold expo ${subcommand}} is deprecated`);\n console.log();\n process.exit(1);\n }\n}\n\nconst command = isSubcommand ? args._[0] : defaultCmd;\nconst commandArgs = isSubcommand ? args._.slice(1) : args._;\n\n// Push the help flag to the subcommand args.\nif (args['--help']) {\n commandArgs.push('--help');\n}\n\n// Install exit hooks\nprocess.on('SIGINT', () => process.exit(0));\nprocess.on('SIGTERM', () => process.exit(0));\n\ncommands[command]().then((exec) => {\n exec(commandArgs);\n\n // NOTE(EvanBacon): Track some basic telemetry events indicating the command\n // that was run. This can be disabled with the $EXPO_NO_TELEMETRY environment variable.\n // We do this to determine how well deprecations are going before removing a command.\n if (!boolish('EXPO_NO_TELEMETRY', false)) {\n const { recordCommand } =\n require('../src/utils/telemetry') as typeof import('../src/utils/telemetry');\n recordCommand(command);\n }\n});\n"],"names":["boolish","Debug","enable","enabled","process","env","EXPO_DEBUG","defaultCmd","commands","run","then","i","expoRun","expoRunIos","expoRunAndroid","start","expoStart","prebuild","expoPrebuild","config","expoConfig","export","expoExport","expoExportWeb","expoExportEmbed","serve","expoServe","install","expoInstall","add","customize","expoCustomize","lint","expoLint","login","expoLogin","logout","expoLogout","register","expoRegister","whoami","expoWhoami","args","arg","Boolean","permissive","console","log","__EXPO_VERSION","exit","warn","chalk","yellow","isSubcommand","_","_export","runIos","runAndroid","exportEmbed_unused","exportWeb_unused","_run","_lint","others","Object","keys","join","migrationMap","init","eject","web","doctor","upgrade","publish","url","webhooks","subcommand","replacement","instruction","deprecated","includes","command","commandArgs","slice","push","on","exec","recordCommand","require"],"mappings":"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"}
|
|
@@ -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 * as devicectl from '../../../start/platforms/ios/devicectl';\nimport { launchAppWithDeviceCtl } from '../../../start/platforms/ios/devicectl';\nimport { OSType } from '../../../start/platforms/ios/simctl';\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 osType: OSType;\n}\n\nasync function getConnectedDevicesUsingNativeToolsAsync(): Promise<ConnectedDevice[]> {\n return (\n (await devicectl.getConnectedAppleDevicesAsync())\n // Filter out unpaired and unavailable devices.\n // TODO: We could improve this logic in the future to attempt pairing if specified.\n .filter(\n (device) =>\n device.connectionProperties.pairingState === 'paired' &&\n device.connectionProperties.tunnelState !== 'unavailable'\n )\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 osType: coercePlatformToOsType(device.hardwareProperties.platform),\n };\n })\n );\n}\n\nfunction coercePlatformToOsType(platform: string): OSType {\n // The only two devices I have to test against...\n switch (platform) {\n case 'iOS':\n return 'iOS';\n case 'xrOS':\n return 'xrOS';\n default:\n debug('Unknown devicectl platform (needs to be added to Expo CLI):', platform);\n return platform as OSType;\n }\n}\nfunction coerceUsbmuxdPlatformToOsType(platform: string): OSType {\n // The only connectable device I have to test against...\n switch (platform) {\n case 'iPhone':\n case 'iPhone OS':\n return 'iOS';\n default:\n debug('Unknown usbmuxd platform (needs to be added to Expo CLI):', platform);\n return platform as OSType;\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 osType: coerceUsbmuxdPlatformToOsType(deviceValues.DeviceClass),\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","tunnelState","map","name","deviceProperties","model","hardwareProperties","productType","osVersion","osVersionNumber","udid","deviceType","connectionType","transportType","osType","coercePlatformToOsType","platform","coerceUsbmuxdPlatformToOsType","devices","Promise","all","profile","getConnectedDevicesUsingCustomToolingAsync","uniqBy","flat","client","UsbmuxdClient","connectUsbmuxdSocket","getDevices","socket","end","connect","deviceValues","LockdowndClient","getAllValues","DeviceName","ProductType","ProductVersion","Properties","ConnectionType","SerialNumber","DeviceClass","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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"}
|
|
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 { OSType } from '../../../start/platforms/ios/simctl';\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 osType: OSType;\n}\n\nasync function getConnectedDevicesUsingNativeToolsAsync(): Promise<ConnectedDevice[]> {\n return (\n (await devicectl.getConnectedAppleDevicesAsync())\n // Filter out unpaired and unavailable devices.\n // TODO: We could improve this logic in the future to attempt pairing if specified.\n .filter(\n (device) =>\n device.connectionProperties.pairingState === 'paired' &&\n device.connectionProperties.tunnelState !== 'unavailable'\n )\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 osType: coercePlatformToOsType(device.hardwareProperties.platform),\n };\n })\n );\n}\n\nfunction coercePlatformToOsType(platform: string): OSType {\n // The only two devices I have to test against...\n switch (platform) {\n case 'iOS':\n return 'iOS';\n case 'xrOS':\n return 'xrOS';\n default:\n debug('Unknown devicectl platform (needs to be added to Expo CLI):', platform);\n return platform as OSType;\n }\n}\nfunction coerceUsbmuxdPlatformToOsType(platform: string): OSType {\n // The only connectable device I have to test against...\n switch (platform) {\n case 'iPhone':\n case 'iPad':\n case 'iPhone OS':\n return 'iOS';\n default:\n debug('Unknown usbmuxd platform (needs to be added to Expo CLI):', platform);\n return platform as OSType;\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 osType: coerceUsbmuxdPlatformToOsType(deviceValues.DeviceClass),\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","tunnelState","map","name","deviceProperties","model","hardwareProperties","productType","osVersion","osVersionNumber","udid","deviceType","connectionType","transportType","osType","coercePlatformToOsType","platform","coerceUsbmuxdPlatformToOsType","devices","Promise","all","profile","getConnectedDevicesUsingCustomToolingAsync","uniqBy","flat","client","UsbmuxdClient","connectUsbmuxdSocket","getDevices","socket","end","connect","deviceValues","LockdowndClient","getAllValues","DeviceName","ProductType","ProductVersion","Properties","ConnectionType","SerialNumber","DeviceClass","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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"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "expoServe", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: ()=>expoServe
|
|
9
|
+
});
|
|
10
|
+
function _chalk() {
|
|
11
|
+
const data = /*#__PURE__*/ _interopRequireDefault(require("chalk"));
|
|
12
|
+
_chalk = function() {
|
|
13
|
+
return data;
|
|
14
|
+
};
|
|
15
|
+
return data;
|
|
16
|
+
}
|
|
17
|
+
const _args = require("../utils/args");
|
|
18
|
+
function _interopRequireDefault(obj) {
|
|
19
|
+
return obj && obj.__esModule ? obj : {
|
|
20
|
+
default: obj
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
24
|
+
if (typeof WeakMap !== "function") return null;
|
|
25
|
+
var cacheBabelInterop = new WeakMap();
|
|
26
|
+
var cacheNodeInterop = new WeakMap();
|
|
27
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
28
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
29
|
+
})(nodeInterop);
|
|
30
|
+
}
|
|
31
|
+
function _interopRequireWildcard(obj, nodeInterop) {
|
|
32
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
33
|
+
return obj;
|
|
34
|
+
}
|
|
35
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
36
|
+
return {
|
|
37
|
+
default: obj
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
41
|
+
if (cache && cache.has(obj)) {
|
|
42
|
+
return cache.get(obj);
|
|
43
|
+
}
|
|
44
|
+
var newObj = {};
|
|
45
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
46
|
+
for(var key in obj){
|
|
47
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
48
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
49
|
+
if (desc && (desc.get || desc.set)) {
|
|
50
|
+
Object.defineProperty(newObj, key, desc);
|
|
51
|
+
} else {
|
|
52
|
+
newObj[key] = obj[key];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
newObj.default = obj;
|
|
57
|
+
if (cache) {
|
|
58
|
+
cache.set(obj, newObj);
|
|
59
|
+
}
|
|
60
|
+
return newObj;
|
|
61
|
+
}
|
|
62
|
+
const expoServe = async (argv)=>{
|
|
63
|
+
const args = (0, _args.assertArgs)({
|
|
64
|
+
// Types
|
|
65
|
+
"--help": Boolean,
|
|
66
|
+
"--port": Number,
|
|
67
|
+
// Aliases
|
|
68
|
+
"-h": "--help"
|
|
69
|
+
}, argv);
|
|
70
|
+
if (args["--help"]) {
|
|
71
|
+
(0, _args.printHelp)(`Host the production server locally`, (0, _chalk().default)`npx expo serve {dim <dir>}`, [
|
|
72
|
+
(0, _chalk().default)`<dir> Directory of the Expo project. {dim Default: Current working directory}`,
|
|
73
|
+
`--port <number> Port to host the server on`,
|
|
74
|
+
`-h, --help Usage info`,
|
|
75
|
+
].join("\n"));
|
|
76
|
+
}
|
|
77
|
+
// Load modules after the help prompt so `npx expo config -h` shows as fast as possible.
|
|
78
|
+
const [// ./configAsync
|
|
79
|
+
{ serveAsync }, // ../utils/errors
|
|
80
|
+
{ logCmdError }, ] = await Promise.all([
|
|
81
|
+
Promise.resolve().then(()=>/*#__PURE__*/ _interopRequireWildcard(require("./serveAsync.js"))),
|
|
82
|
+
Promise.resolve().then(()=>/*#__PURE__*/ _interopRequireWildcard(require("../utils/errors.js")))
|
|
83
|
+
]);
|
|
84
|
+
return serveAsync((0, _args.getProjectRoot)(args), {
|
|
85
|
+
isDefaultDirectory: !args._[0],
|
|
86
|
+
// Parsed options
|
|
87
|
+
port: args["--port"]
|
|
88
|
+
}).catch(logCmdError);
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/serve/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport chalk from 'chalk';\n\nimport { Command } from '../../bin/cli';\nimport { assertArgs, getProjectRoot, printHelp } from '../utils/args';\n\nexport const expoServe: Command = async (argv) => {\n const args = assertArgs(\n {\n // Types\n '--help': Boolean,\n '--port': Number,\n\n // Aliases\n '-h': '--help',\n },\n argv\n );\n\n if (args['--help']) {\n printHelp(\n `Host the production server locally`,\n chalk`npx expo serve {dim <dir>}`,\n [\n chalk`<dir> Directory of the Expo project. {dim Default: Current working directory}`,\n `--port <number> Port to host the server on`,\n `-h, --help Usage info`,\n ].join('\\n')\n );\n }\n\n // Load modules after the help prompt so `npx expo config -h` shows as fast as possible.\n const [\n // ./configAsync\n { serveAsync },\n // ../utils/errors\n { logCmdError },\n ] = await Promise.all([import('./serveAsync.js'), import('../utils/errors.js')]);\n\n return serveAsync(getProjectRoot(args), {\n isDefaultDirectory: !args._[0],\n // Parsed options\n port: args['--port'],\n }).catch(logCmdError);\n};\n"],"names":["expoServe","argv","args","assertArgs","Boolean","Number","printHelp","chalk","join","serveAsync","logCmdError","Promise","all","getProjectRoot","isDefaultDirectory","_","port","catch"],"mappings":"AAAA;;;;;+BAMaA,WAAS;;aAATA,SAAS;;;8DALJ,OAAO;;;;;;sBAG6B,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE9D,MAAMA,SAAS,GAAY,OAAOC,IAAI,GAAK;IAChD,MAAMC,IAAI,GAAGC,IAAAA,KAAU,WAAA,EACrB;QACE,QAAQ;QACR,QAAQ,EAAEC,OAAO;QACjB,QAAQ,EAAEC,MAAM;QAEhB,UAAU;QACV,IAAI,EAAE,QAAQ;KACf,EACDJ,IAAI,CACL,AAAC;IAEF,IAAIC,IAAI,CAAC,QAAQ,CAAC,EAAE;QAClBI,IAAAA,KAAS,UAAA,EACP,CAAC,kCAAkC,CAAC,EACpCC,IAAAA,MAAK,EAAA,QAAA,CAAA,CAAC,0BAA0B,CAAC,EACjC;YACEA,IAAAA,MAAK,EAAA,QAAA,CAAA,CAAC,wFAAwF,CAAC;YAC/F,CAAC,2CAA2C,CAAC;YAC7C,CAAC,2BAA2B,CAAC;SAC9B,CAACC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC;IAED,wFAAwF;IACxF,MAAM,CACJ,gBAAgB;IAChB,EAAEC,UAAU,CAAA,EAAE,EACd,kBAAkB;IAClB,EAAEC,WAAW,CAAA,EAAE,GAChB,GAAG,MAAMC,OAAO,CAACC,GAAG,CAAC;QAAC,iEAAA,OAAM,CAAC,iBAAiB,GAAC;QAAE,iEAAA,OAAM,CAAC,oBAAoB,GAAC;KAAC,CAAC,AAAC;IAEjF,OAAOH,UAAU,CAACI,IAAAA,KAAc,eAAA,EAACX,IAAI,CAAC,EAAE;QACtCY,kBAAkB,EAAE,CAACZ,IAAI,CAACa,CAAC,CAAC,CAAC,CAAC;QAC9B,iBAAiB;QACjBC,IAAI,EAAEd,IAAI,CAAC,QAAQ,CAAC;KACrB,CAAC,CAACe,KAAK,CAACP,WAAW,CAAC,CAAC;AACxB,CAAC,AAAC"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "serveAsync", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: ()=>serveAsync
|
|
8
|
+
});
|
|
9
|
+
function _http() {
|
|
10
|
+
const data = require("@expo/server/build/vendor/http");
|
|
11
|
+
_http = function() {
|
|
12
|
+
return data;
|
|
13
|
+
};
|
|
14
|
+
return data;
|
|
15
|
+
}
|
|
16
|
+
function _chalk() {
|
|
17
|
+
const data = /*#__PURE__*/ _interopRequireDefault(require("chalk"));
|
|
18
|
+
_chalk = function() {
|
|
19
|
+
return data;
|
|
20
|
+
};
|
|
21
|
+
return data;
|
|
22
|
+
}
|
|
23
|
+
function _connect() {
|
|
24
|
+
const data = /*#__PURE__*/ _interopRequireDefault(require("connect"));
|
|
25
|
+
_connect = function() {
|
|
26
|
+
return data;
|
|
27
|
+
};
|
|
28
|
+
return data;
|
|
29
|
+
}
|
|
30
|
+
function _http1() {
|
|
31
|
+
const data = /*#__PURE__*/ _interopRequireDefault(require("http"));
|
|
32
|
+
_http1 = function() {
|
|
33
|
+
return data;
|
|
34
|
+
};
|
|
35
|
+
return data;
|
|
36
|
+
}
|
|
37
|
+
function _path() {
|
|
38
|
+
const data = /*#__PURE__*/ _interopRequireDefault(require("path"));
|
|
39
|
+
_path = function() {
|
|
40
|
+
return data;
|
|
41
|
+
};
|
|
42
|
+
return data;
|
|
43
|
+
}
|
|
44
|
+
function _send() {
|
|
45
|
+
const data = /*#__PURE__*/ _interopRequireDefault(require("send"));
|
|
46
|
+
_send = function() {
|
|
47
|
+
return data;
|
|
48
|
+
};
|
|
49
|
+
return data;
|
|
50
|
+
}
|
|
51
|
+
const _log = /*#__PURE__*/ _interopRequireWildcard(require("../log"));
|
|
52
|
+
const _dir = require("../utils/dir");
|
|
53
|
+
const _errors = require("../utils/errors");
|
|
54
|
+
const _nodeEnv = require("../utils/nodeEnv");
|
|
55
|
+
const _port = require("../utils/port");
|
|
56
|
+
function _interopRequireDefault(obj) {
|
|
57
|
+
return obj && obj.__esModule ? obj : {
|
|
58
|
+
default: obj
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
62
|
+
if (typeof WeakMap !== "function") return null;
|
|
63
|
+
var cacheBabelInterop = new WeakMap();
|
|
64
|
+
var cacheNodeInterop = new WeakMap();
|
|
65
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
66
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
67
|
+
})(nodeInterop);
|
|
68
|
+
}
|
|
69
|
+
function _interopRequireWildcard(obj, nodeInterop) {
|
|
70
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
71
|
+
return obj;
|
|
72
|
+
}
|
|
73
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
74
|
+
return {
|
|
75
|
+
default: obj
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
79
|
+
if (cache && cache.has(obj)) {
|
|
80
|
+
return cache.get(obj);
|
|
81
|
+
}
|
|
82
|
+
var newObj = {};
|
|
83
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
84
|
+
for(var key in obj){
|
|
85
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
86
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
87
|
+
if (desc && (desc.get || desc.set)) {
|
|
88
|
+
Object.defineProperty(newObj, key, desc);
|
|
89
|
+
} else {
|
|
90
|
+
newObj[key] = obj[key];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
newObj.default = obj;
|
|
95
|
+
if (cache) {
|
|
96
|
+
cache.set(obj, newObj);
|
|
97
|
+
}
|
|
98
|
+
return newObj;
|
|
99
|
+
}
|
|
100
|
+
const debug = require("debug")("expo:serve");
|
|
101
|
+
async function serveAsync(projectRoot, options) {
|
|
102
|
+
(0, _nodeEnv.setNodeEnv)("production");
|
|
103
|
+
require("@expo/env").load(projectRoot);
|
|
104
|
+
const port = await (0, _port.resolvePortAsync)(projectRoot, {
|
|
105
|
+
defaultPort: options.port,
|
|
106
|
+
fallbackPort: 8081
|
|
107
|
+
});
|
|
108
|
+
if (port == null) {
|
|
109
|
+
throw new _errors.CommandError("Could not start server. Port is not available.");
|
|
110
|
+
}
|
|
111
|
+
options.port = port;
|
|
112
|
+
const serverDist = options.isDefaultDirectory ? _path().default.join(projectRoot, "dist") : projectRoot;
|
|
113
|
+
// TODO: `.expo/server/ios`, `.expo/server/android`, etc.
|
|
114
|
+
if (!await (0, _dir.directoryExistsAsync)(serverDist)) {
|
|
115
|
+
throw new _errors.CommandError(`The server directory ${serverDist} does not exist. Run \`npx expo export\` first.`);
|
|
116
|
+
}
|
|
117
|
+
const isStatic = await isStaticExportAsync(serverDist);
|
|
118
|
+
_log.log(_chalk().default.dim(`Starting ${isStatic ? "static " : ""}server in ${serverDist}`));
|
|
119
|
+
if (isStatic) {
|
|
120
|
+
await startStaticServerAsync(serverDist, options);
|
|
121
|
+
} else {
|
|
122
|
+
await startDynamicServerAsync(serverDist, options);
|
|
123
|
+
}
|
|
124
|
+
_log.log(`Server running at http://localhost:${options.port}`);
|
|
125
|
+
// Detect the type of server we need to setup:
|
|
126
|
+
}
|
|
127
|
+
async function startStaticServerAsync(dist, options) {
|
|
128
|
+
const server = _http1().default.createServer((req, res)=>{
|
|
129
|
+
var ref;
|
|
130
|
+
// Remove query strings and decode URI
|
|
131
|
+
const filePath = decodeURI(((ref = req.url) == null ? void 0 : ref.split("?")[0]) ?? "");
|
|
132
|
+
(0, _send().default)(req, filePath, {
|
|
133
|
+
root: dist,
|
|
134
|
+
index: "index.html"
|
|
135
|
+
}).on("error", (err)=>{
|
|
136
|
+
if (err.status === 404) {
|
|
137
|
+
res.statusCode = 404;
|
|
138
|
+
res.end("Not Found");
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
res.statusCode = err.status || 500;
|
|
142
|
+
res.end("Internal Server Error");
|
|
143
|
+
}).pipe(res);
|
|
144
|
+
});
|
|
145
|
+
server.listen(options.port);
|
|
146
|
+
}
|
|
147
|
+
async function startDynamicServerAsync(dist, options) {
|
|
148
|
+
const middleware = (0, _connect().default)();
|
|
149
|
+
const staticDirectory = _path().default.join(dist, "client");
|
|
150
|
+
const serverDirectory = _path().default.join(dist, "server");
|
|
151
|
+
const serverHandler = (0, _http().createRequestHandler)({
|
|
152
|
+
build: serverDirectory
|
|
153
|
+
});
|
|
154
|
+
// DOM component CORS support
|
|
155
|
+
middleware.use((req, res, next)=>{
|
|
156
|
+
// TODO: Only when origin is `file://` (iOS), and Android equivalent.
|
|
157
|
+
// Required for DOM components security in release builds.
|
|
158
|
+
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
159
|
+
res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
|
|
160
|
+
res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, expo-platform");
|
|
161
|
+
// Handle OPTIONS preflight requests
|
|
162
|
+
if (req.method === "OPTIONS") {
|
|
163
|
+
res.statusCode = 200;
|
|
164
|
+
res.end();
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
next();
|
|
168
|
+
});
|
|
169
|
+
middleware.use((req, res, next)=>{
|
|
170
|
+
if (!(req == null ? void 0 : req.url) || req.method !== "GET" && req.method !== "HEAD") {
|
|
171
|
+
return next();
|
|
172
|
+
}
|
|
173
|
+
const pathname = canParseURL(req.url) ? new URL(req.url).pathname : req.url;
|
|
174
|
+
if (!pathname) {
|
|
175
|
+
return next();
|
|
176
|
+
}
|
|
177
|
+
debug(`Maybe serve static:`, pathname);
|
|
178
|
+
const stream = (0, _send().default)(req, pathname, {
|
|
179
|
+
root: staticDirectory,
|
|
180
|
+
extensions: [
|
|
181
|
+
"html"
|
|
182
|
+
]
|
|
183
|
+
});
|
|
184
|
+
// add file listener for fallthrough
|
|
185
|
+
let forwardError = false;
|
|
186
|
+
stream.on("file", function onFile() {
|
|
187
|
+
// once file is determined, always forward error
|
|
188
|
+
forwardError = true;
|
|
189
|
+
});
|
|
190
|
+
// forward errors
|
|
191
|
+
stream.on("error", function error(err) {
|
|
192
|
+
if (forwardError || !(err.statusCode < 500)) {
|
|
193
|
+
next(err);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
next();
|
|
197
|
+
});
|
|
198
|
+
// pipe
|
|
199
|
+
stream.pipe(res);
|
|
200
|
+
});
|
|
201
|
+
middleware.use(serverHandler);
|
|
202
|
+
middleware.listen(options.port);
|
|
203
|
+
}
|
|
204
|
+
function canParseURL(url) {
|
|
205
|
+
try {
|
|
206
|
+
// eslint-disable-next-line no-new
|
|
207
|
+
new URL(url);
|
|
208
|
+
return true;
|
|
209
|
+
} catch {
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
async function isStaticExportAsync(dist) {
|
|
214
|
+
const routesFile = _path().default.join(dist, `server/_expo/routes.json`);
|
|
215
|
+
return !await (0, _dir.fileExistsAsync)(routesFile);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
//# sourceMappingURL=serveAsync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/serve/serveAsync.ts"],"sourcesContent":["import { createRequestHandler } from '@expo/server/build/vendor/http';\nimport chalk from 'chalk';\nimport connect from 'connect';\nimport http from 'http';\nimport path from 'path';\nimport send from 'send';\n\nimport * as Log from '../log';\nimport { directoryExistsAsync, fileExistsAsync } from '../utils/dir';\nimport { CommandError } from '../utils/errors';\nimport { setNodeEnv } from '../utils/nodeEnv';\nimport { resolvePortAsync } from '../utils/port';\n\ntype Options = {\n port?: number;\n isDefaultDirectory: boolean;\n};\n\nconst debug = require('debug')('expo:serve') as typeof console.log;\n\n// Start a basic http server\nexport async function serveAsync(projectRoot: string, options: Options) {\n setNodeEnv('production');\n require('@expo/env').load(projectRoot);\n\n const port = await resolvePortAsync(projectRoot, {\n defaultPort: options.port,\n fallbackPort: 8081,\n });\n\n if (port == null) {\n throw new CommandError('Could not start server. Port is not available.');\n }\n options.port = port;\n\n const serverDist = options.isDefaultDirectory ? path.join(projectRoot, 'dist') : projectRoot;\n // TODO: `.expo/server/ios`, `.expo/server/android`, etc.\n\n if (!(await directoryExistsAsync(serverDist))) {\n throw new CommandError(\n `The server directory ${serverDist} does not exist. Run \\`npx expo export\\` first.`\n );\n }\n\n const isStatic = await isStaticExportAsync(serverDist);\n\n Log.log(chalk.dim(`Starting ${isStatic ? 'static ' : ''}server in ${serverDist}`));\n\n if (isStatic) {\n await startStaticServerAsync(serverDist, options);\n } else {\n await startDynamicServerAsync(serverDist, options);\n }\n Log.log(`Server running at http://localhost:${options.port}`);\n // Detect the type of server we need to setup:\n}\n\nasync function startStaticServerAsync(dist: string, options: Options) {\n const server = http.createServer((req, res) => {\n // Remove query strings and decode URI\n const filePath = decodeURI(req.url?.split('?')[0] ?? '');\n\n send(req, filePath, {\n root: dist,\n index: 'index.html',\n })\n .on('error', (err: any) => {\n if (err.status === 404) {\n res.statusCode = 404;\n res.end('Not Found');\n return;\n }\n res.statusCode = err.status || 500;\n res.end('Internal Server Error');\n })\n .pipe(res);\n });\n\n server.listen(options.port!);\n}\n\nasync function startDynamicServerAsync(dist: string, options: Options) {\n const middleware = connect();\n\n const staticDirectory = path.join(dist, 'client');\n const serverDirectory = path.join(dist, 'server');\n\n const serverHandler = createRequestHandler({ build: serverDirectory });\n\n // DOM component CORS support\n middleware.use((req, res, next) => {\n // TODO: Only when origin is `file://` (iOS), and Android equivalent.\n\n // Required for DOM components security in release builds.\n\n res.setHeader('Access-Control-Allow-Origin', '*');\n res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.setHeader(\n 'Access-Control-Allow-Headers',\n 'Origin, X-Requested-With, Content-Type, Accept, expo-platform'\n );\n\n // Handle OPTIONS preflight requests\n if (req.method === 'OPTIONS') {\n res.statusCode = 200;\n res.end();\n return;\n }\n next();\n });\n\n middleware.use((req, res, next) => {\n if (!req?.url || (req.method !== 'GET' && req.method !== 'HEAD')) {\n return next();\n }\n\n const pathname = canParseURL(req.url) ? new URL(req.url).pathname : req.url;\n if (!pathname) {\n return next();\n }\n\n debug(`Maybe serve static:`, pathname);\n\n const stream = send(req, pathname, {\n root: staticDirectory,\n extensions: ['html'],\n });\n\n // add file listener for fallthrough\n let forwardError = false;\n stream.on('file', function onFile() {\n // once file is determined, always forward error\n forwardError = true;\n });\n\n // forward errors\n stream.on('error', function error(err: any) {\n if (forwardError || !(err.statusCode < 500)) {\n next(err);\n return;\n }\n\n next();\n });\n\n // pipe\n stream.pipe(res);\n });\n\n middleware.use(serverHandler);\n\n middleware.listen(options.port!);\n}\n\nfunction canParseURL(url: string): boolean {\n try {\n // eslint-disable-next-line no-new\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function isStaticExportAsync(dist: string): Promise<boolean> {\n const routesFile = path.join(dist, `server/_expo/routes.json`);\n return !(await fileExistsAsync(routesFile));\n}\n"],"names":["serveAsync","debug","require","projectRoot","options","setNodeEnv","load","port","resolvePortAsync","defaultPort","fallbackPort","CommandError","serverDist","isDefaultDirectory","path","join","directoryExistsAsync","isStatic","isStaticExportAsync","Log","log","chalk","dim","startStaticServerAsync","startDynamicServerAsync","dist","server","http","createServer","req","res","filePath","decodeURI","url","split","send","root","index","on","err","status","statusCode","end","pipe","listen","middleware","connect","staticDirectory","serverDirectory","serverHandler","createRequestHandler","build","use","next","setHeader","method","pathname","canParseURL","URL","stream","extensions","forwardError","onFile","error","routesFile","fileExistsAsync"],"mappings":"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"}
|
|
@@ -11,8 +11,7 @@ function _export(target, all) {
|
|
|
11
11
|
_export(exports, {
|
|
12
12
|
validateDependenciesVersionsAsync: ()=>validateDependenciesVersionsAsync,
|
|
13
13
|
logIncorrectDependencies: ()=>logIncorrectDependencies,
|
|
14
|
-
getVersionedDependenciesAsync: ()=>getVersionedDependenciesAsync
|
|
15
|
-
isDependencyVersionIncorrect: ()=>isDependencyVersionIncorrect
|
|
14
|
+
getVersionedDependenciesAsync: ()=>getVersionedDependenciesAsync
|
|
16
15
|
});
|
|
17
16
|
function _assert() {
|
|
18
17
|
const data = /*#__PURE__*/ _interopRequireDefault(require("assert"));
|
|
@@ -233,19 +232,8 @@ function isDependencyVersionIncorrect(packageName, actualVersion, expectedVersio
|
|
|
233
232
|
if (packageName === "expo") {
|
|
234
233
|
return _semver().default.ltr(actualVersion, expectedVersionOrRange);
|
|
235
234
|
}
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
// If both are prereleases or both are not prereleases, use satisfies
|
|
239
|
-
if (actualPrerelease && expectedPrerelease || !actualPrerelease && !expectedPrerelease) {
|
|
240
|
-
return !_semver().default.satisfies(actualVersion, expectedVersionOrRange);
|
|
241
|
-
}
|
|
242
|
-
// If actual is prerelease but expected is not
|
|
243
|
-
if (actualPrerelease && !expectedPrerelease) {
|
|
244
|
-
const cleanedActualVersion = `${_semver().default.major(actualVersion)}.${_semver().default.minor(actualVersion)}.${_semver().default.patch(actualVersion)}`;
|
|
245
|
-
return !_semver().default.satisfies(cleanedActualVersion, expectedVersionOrRange);
|
|
246
|
-
}
|
|
247
|
-
// If expected is prerelease but actual is not, consider it incorrect
|
|
248
|
-
return true;
|
|
235
|
+
// all other packages: version range is based on Expo SDK version, so we always want to match range
|
|
236
|
+
return !_semver().default.intersects(expectedVersionOrRange, actualVersion);
|
|
249
237
|
}
|
|
250
238
|
function findDependencyType(pkg, packageName) {
|
|
251
239
|
if (pkg.devDependencies && packageName in pkg.devDependencies) {
|