@expo/cli 0.1.0 → 0.1.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.
Files changed (113) hide show
  1. package/build/bin/cli +38 -11
  2. package/build/bin/cli.map +1 -1
  3. package/build/src/config/index.js +7 -17
  4. package/build/src/config/index.js.map +1 -1
  5. package/build/src/export/createBundles.js +62 -0
  6. package/build/src/export/createBundles.js.map +1 -0
  7. package/build/src/export/createMetadataJson.js +36 -0
  8. package/build/src/export/createMetadataJson.js.map +1 -0
  9. package/build/src/export/exportApp.js +102 -0
  10. package/build/src/export/exportApp.js.map +1 -0
  11. package/build/src/export/exportAssets.js +106 -0
  12. package/build/src/export/exportAssets.js.map +1 -0
  13. package/build/src/export/exportAsync.js +49 -0
  14. package/build/src/export/exportAsync.js.map +1 -0
  15. package/build/src/export/fork-bundleAsync.js +138 -0
  16. package/build/src/export/fork-bundleAsync.js.map +1 -0
  17. package/build/src/export/getPublicExpoManifest.js +28 -0
  18. package/build/src/export/getPublicExpoManifest.js.map +1 -0
  19. package/build/src/export/getResolvedLocales.js +35 -0
  20. package/build/src/export/getResolvedLocales.js.map +1 -0
  21. package/build/src/export/index.js +77 -0
  22. package/build/src/export/index.js.map +1 -0
  23. package/build/src/export/printBundleSizes.js +122 -0
  24. package/build/src/export/printBundleSizes.js.map +1 -0
  25. package/build/src/export/resolveOptions.js +24 -0
  26. package/build/src/export/resolveOptions.js.map +1 -0
  27. package/build/src/export/saveAssets.js +65 -0
  28. package/build/src/export/saveAssets.js.map +1 -0
  29. package/build/src/export/writeContents.js +108 -0
  30. package/build/src/export/writeContents.js.map +1 -0
  31. package/build/src/install/index.js +13 -40
  32. package/build/src/install/index.js.map +1 -1
  33. package/build/src/login/index.js +6 -20
  34. package/build/src/login/index.js.map +1 -1
  35. package/build/src/logout/index.js +2 -17
  36. package/build/src/logout/index.js.map +1 -1
  37. package/build/src/prebuild/index.js +10 -21
  38. package/build/src/prebuild/index.js.map +1 -1
  39. package/build/src/prebuild/prebuildAsync.js +1 -1
  40. package/build/src/prebuild/prebuildAsync.js.map +1 -1
  41. package/build/src/register/index.js +2 -17
  42. package/build/src/register/index.js.map +1 -1
  43. package/build/src/run/android/index.js +97 -0
  44. package/build/src/run/android/index.js.map +1 -0
  45. package/build/src/run/android/resolveDevice.js +23 -0
  46. package/build/src/run/android/resolveDevice.js.map +1 -0
  47. package/build/src/run/android/resolveGradleProps.js +37 -0
  48. package/build/src/run/android/resolveGradleProps.js.map +1 -0
  49. package/build/src/run/android/resolveInstallApkName.js +72 -0
  50. package/build/src/run/android/resolveInstallApkName.js.map +1 -0
  51. package/build/src/run/android/resolveLaunchProps.js +32 -0
  52. package/build/src/run/android/resolveLaunchProps.js.map +1 -0
  53. package/build/src/run/android/resolveOptions.js +25 -0
  54. package/build/src/run/android/resolveOptions.js.map +1 -0
  55. package/build/src/run/android/runAndroidAsync.js +74 -0
  56. package/build/src/run/android/runAndroidAsync.js.map +1 -0
  57. package/build/src/run/ensureNativeProject.js +33 -0
  58. package/build/src/run/ensureNativeProject.js.map +1 -0
  59. package/build/src/run/hints.js +22 -0
  60. package/build/src/run/hints.js.map +1 -0
  61. package/build/src/run/resolveBundlerProps.js +31 -0
  62. package/build/src/run/resolveBundlerProps.js.map +1 -0
  63. package/build/src/run/startBundler.js +76 -0
  64. package/build/src/run/startBundler.js.map +1 -0
  65. package/build/src/start/index.js +29 -39
  66. package/build/src/start/index.js.map +1 -1
  67. package/build/src/start/platforms/ExpoGoInstaller.js +4 -1
  68. package/build/src/start/platforms/ExpoGoInstaller.js.map +1 -1
  69. package/build/src/start/platforms/PlatformManager.js +25 -0
  70. package/build/src/start/platforms/PlatformManager.js.map +1 -1
  71. package/build/src/start/platforms/android/ADBServer.js +3 -1
  72. package/build/src/start/platforms/android/ADBServer.js.map +1 -1
  73. package/build/src/start/platforms/android/AndroidDeviceManager.js +13 -1
  74. package/build/src/start/platforms/android/AndroidDeviceManager.js.map +1 -1
  75. package/build/src/start/platforms/android/activateWindow.js +2 -0
  76. package/build/src/start/platforms/android/activateWindow.js.map +1 -1
  77. package/build/src/start/platforms/android/adb.js +37 -4
  78. package/build/src/start/platforms/android/adb.js.map +1 -1
  79. package/build/src/start/platforms/android/gradle.js +86 -0
  80. package/build/src/start/platforms/android/gradle.js.map +1 -0
  81. package/build/src/start/server/BundlerDevServer.js +62 -2
  82. package/build/src/start/server/BundlerDevServer.js.map +1 -1
  83. package/build/src/start/server/UrlCreator.js +2 -1
  84. package/build/src/start/server/UrlCreator.js.map +1 -1
  85. package/build/src/start/server/metro/MetroBundlerDevServer.js +11 -14
  86. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  87. package/build/src/start/server/metro/instantiateMetro.js +22 -9
  88. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  89. package/build/src/start/server/middleware/ClassicManifestMiddleware.js +1 -1
  90. package/build/src/start/server/middleware/createDevServerMiddleware.js +2 -2
  91. package/build/src/start/server/middleware/createDevServerMiddleware.js.map +1 -1
  92. package/build/src/start/server/middleware/resolveAssets.js +4 -1
  93. package/build/src/start/server/middleware/resolveAssets.js.map +1 -1
  94. package/build/src/start/server/webpack/WebpackBundlerDevServer.js +10 -14
  95. package/build/src/start/server/webpack/WebpackBundlerDevServer.js.map +1 -1
  96. package/build/src/utils/analytics/rudderstackClient.js +2 -2
  97. package/build/src/utils/args.js +14 -0
  98. package/build/src/utils/args.js.map +1 -1
  99. package/build/src/utils/array.js +29 -0
  100. package/build/src/utils/array.js.map +1 -1
  101. package/build/src/utils/dir.js +5 -1
  102. package/build/src/utils/dir.js.map +1 -1
  103. package/build/src/utils/downloadAppAsync.js +3 -0
  104. package/build/src/utils/downloadAppAsync.js.map +1 -1
  105. package/build/src/utils/downloadExpoGoAsync.js +11 -5
  106. package/build/src/utils/downloadExpoGoAsync.js.map +1 -1
  107. package/build/src/utils/env.js +3 -0
  108. package/build/src/utils/env.js.map +1 -1
  109. package/build/src/utils/resolveArgs.js +94 -0
  110. package/build/src/utils/resolveArgs.js.map +1 -0
  111. package/build/src/whoami/index.js +1 -17
  112. package/build/src/whoami/index.js.map +1 -1
  113. package/package.json +18 -13
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ exports.formatGradleArguments = formatGradleArguments;
6
+ exports.assembleAsync = assembleAsync;
7
+ exports.installAsync = installAsync;
8
+ exports.spawnGradleAsync = spawnGradleAsync;
9
+ var _spawnAsync = _interopRequireDefault(require("@expo/spawn-async"));
10
+ var _path = _interopRequireDefault(require("path"));
11
+ var _log = require("../../../log");
12
+ var _env = require("../../../utils/env");
13
+ var _errors = require("../../../utils/errors");
14
+ function _interopRequireDefault(obj) {
15
+ return obj && obj.__esModule ? obj : {
16
+ default: obj
17
+ };
18
+ }
19
+ function upperFirst(name) {
20
+ return name.charAt(0).toUpperCase() + name.slice(1);
21
+ }
22
+ function formatGradleArguments(cmd, { appName , variant , tasks =[
23
+ cmd + upperFirst(variant)
24
+ ] }) {
25
+ return appName ? tasks.map((task)=>`${appName}:${task}`
26
+ ) : tasks;
27
+ }
28
+ function resolveGradleWPath(androidProjectPath) {
29
+ return _path.default.join(androidProjectPath, process.platform === "win32" ? "gradlew.bat" : "gradlew");
30
+ }
31
+ function getPortArg(port) {
32
+ return `-PreactNativeDevServerPort=${port}`;
33
+ }
34
+ async function assembleAsync(androidProjectPath, { variant , port , appName , buildCache }) {
35
+ const task = formatGradleArguments("assemble", {
36
+ variant,
37
+ appName
38
+ });
39
+ const args = [
40
+ ...task,
41
+ // ignore linting errors
42
+ "-x",
43
+ "lint",
44
+ // ignore tests
45
+ "-x",
46
+ "test",
47
+ "--configure-on-demand",
48
+ ];
49
+ if (buildCache) args.push("--build-cache");
50
+ // Generate a profile under `/android/app/build/reports/profile`
51
+ if (_env.env.EXPO_PROFILE) args.push("--profile");
52
+ return await spawnGradleAsync(androidProjectPath, {
53
+ port,
54
+ args
55
+ });
56
+ }
57
+ async function installAsync(androidProjectPath, { variant , appName , port }) {
58
+ const args = formatGradleArguments("install", {
59
+ variant,
60
+ appName
61
+ });
62
+ return await spawnGradleAsync(androidProjectPath, {
63
+ port,
64
+ args
65
+ });
66
+ }
67
+ async function spawnGradleAsync(projectRoot, { port , args }) {
68
+ const gradlew = resolveGradleWPath(projectRoot);
69
+ if (port != null) args.push(getPortArg(port));
70
+ _log.Log.debug(` ${gradlew} ${args.join(" ")}`);
71
+ try {
72
+ return await (0, _spawnAsync).default(gradlew, args, {
73
+ cwd: projectRoot,
74
+ stdio: "inherit"
75
+ });
76
+ } catch (error) {
77
+ // User aborted the command with ctrl-c
78
+ if (error.status === 130) {
79
+ // Fail silently
80
+ throw new _errors.AbortCommandError();
81
+ }
82
+ throw error;
83
+ }
84
+ }
85
+
86
+ //# sourceMappingURL=gradle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/start/platforms/android/gradle.ts"],"sourcesContent":["import spawnAsync, { SpawnResult } from '@expo/spawn-async';\nimport path from 'path';\n\nimport { Log } from '../../../log';\nimport { env } from '../../../utils/env';\nimport { AbortCommandError } from '../../../utils/errors';\n\nfunction upperFirst(name: string) {\n return name.charAt(0).toUpperCase() + name.slice(1);\n}\n\n/** Format gradle assemble arguments. Exposed for testing. */\nexport function formatGradleArguments(\n cmd: 'assemble' | 'install',\n {\n appName,\n variant,\n tasks = [cmd + upperFirst(variant)],\n }: { tasks?: string[]; variant: string; appName: string }\n): string[] {\n return appName ? tasks.map((task) => `${appName}:${task}`) : tasks;\n}\n\nfunction resolveGradleWPath(androidProjectPath: string): string {\n return path.join(androidProjectPath, process.platform === 'win32' ? 'gradlew.bat' : 'gradlew');\n}\n\nfunction getPortArg(port: number): string {\n return `-PreactNativeDevServerPort=${port}`;\n}\n\n/**\n * Build the Android project using Gradle.\n *\n * @param androidProjectPath - Path to the Android project like `projectRoot/android`.\n * @param props.variant - Variant to install.\n * @param props.appName - Name of the 'app' folder, this appears to always be `app`.\n * @param props.port - Dev server port to pass to the install command.\n * @param props.buildCache - Should use the `--build-cache` flag, enabling the [Gradle build cache](https://docs.gradle.org/current/userguide/build_cache.html).\n * @returns - A promise resolving to spawn results.\n */\nexport async function assembleAsync(\n androidProjectPath: string,\n {\n variant,\n port,\n appName,\n buildCache,\n }: {\n variant: string;\n port?: number;\n appName: string;\n buildCache?: boolean;\n }\n): Promise<SpawnResult> {\n const task = formatGradleArguments('assemble', { variant, appName });\n const args = [\n ...task,\n // ignore linting errors\n '-x',\n 'lint',\n // ignore tests\n '-x',\n 'test',\n '--configure-on-demand',\n ];\n\n if (buildCache) args.push('--build-cache');\n\n // Generate a profile under `/android/app/build/reports/profile`\n if (env.EXPO_PROFILE) args.push('--profile');\n\n return await spawnGradleAsync(androidProjectPath, { port, args });\n}\n\n/**\n * Install an app on device or emulator using `gradlew install`.\n *\n * @param androidProjectPath - Path to the Android project like `projectRoot/android`.\n * @param props.variant - Variant to install.\n * @param props.appName - Name of the 'app' folder, this appears to always be `app`.\n * @param props.port - Dev server port to pass to the install command.\n * @returns - A promise resolving to spawn results.\n */\nexport async function installAsync(\n androidProjectPath: string,\n {\n variant,\n appName,\n port,\n }: {\n variant: string;\n appName: string;\n port?: number;\n }\n): Promise<SpawnResult> {\n const args = formatGradleArguments('install', { variant, appName });\n return await spawnGradleAsync(androidProjectPath, { port, args });\n}\n\nexport async function spawnGradleAsync(\n projectRoot: string,\n { port, args }: { port?: number; args: string[] }\n): Promise<SpawnResult> {\n const gradlew = resolveGradleWPath(projectRoot);\n if (port != null) args.push(getPortArg(port));\n Log.debug(` ${gradlew} ${args.join(' ')}`);\n try {\n return await spawnAsync(gradlew, args, {\n cwd: projectRoot,\n stdio: 'inherit',\n });\n } catch (error: any) {\n // User aborted the command with ctrl-c\n if (error.status === 130) {\n // Fail silently\n throw new AbortCommandError();\n }\n throw error;\n }\n}\n"],"names":["formatGradleArguments","assembleAsync","installAsync","spawnGradleAsync","upperFirst","name","charAt","toUpperCase","slice","cmd","appName","variant","tasks","map","task","resolveGradleWPath","androidProjectPath","path","join","process","platform","getPortArg","port","buildCache","args","push","env","EXPO_PROFILE","projectRoot","gradlew","Log","debug","spawnAsync","cwd","stdio","error","status","AbortCommandError"],"mappings":"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"}
@@ -13,6 +13,7 @@ var _env = require("../../utils/env");
13
13
  var _errors = require("../../utils/errors");
14
14
  var _asyncNgrok = require("./AsyncNgrok");
15
15
  var _developmentSession = require("./DevelopmentSession");
16
+ var _urlCreator = require("./UrlCreator");
16
17
  function _interopRequireDefault(obj) {
17
18
  return obj && obj.__esModule ? obj : {
18
19
  default: obj
@@ -76,6 +77,48 @@ class BundlerDevServer {
76
77
  });
77
78
  return middleware.getHandler();
78
79
  }
80
+ /** Start the dev server using settings defined in the start command. */ async startAsync(options) {
81
+ await this.stopAsync();
82
+ let instance;
83
+ if (options.headless) {
84
+ instance = await this.startHeadlessAsync(options);
85
+ } else {
86
+ instance = await this.startImplementationAsync(options);
87
+ }
88
+ this.setInstance(instance);
89
+ await this.postStartAsync(options);
90
+ return instance;
91
+ }
92
+ /**
93
+ * Creates a mock server representation that can be used to estimate URLs for a server started in another process.
94
+ * This is used for the run commands where you can reuse the server from a previous run.
95
+ */ async startHeadlessAsync(options) {
96
+ if (!options.port) throw new _errors.CommandError("HEADLESS_SERVER", "headless dev server requires a port option");
97
+ this.urlCreator = this.getUrlCreator(options);
98
+ return {
99
+ // Create a mock server
100
+ server: {
101
+ close: ()=>{
102
+ this.instance = null;
103
+ }
104
+ },
105
+ location: {
106
+ // The port is the main thing we want to send back.
107
+ port: options.port,
108
+ // localhost isn't always correct.
109
+ host: "localhost",
110
+ // http is the only supported protocol on native.
111
+ url: `http://localhost:${options.port}`,
112
+ protocol: "http"
113
+ },
114
+ middleware: {},
115
+ messageSocket: {
116
+ broadcast: ()=>{
117
+ throw new _errors.CommandError("HEADLESS_SERVER", "Cannot broadcast messages to headless server");
118
+ }
119
+ }
120
+ };
121
+ }
79
122
  async postStartAsync(options) {
80
123
  if (options.location.hostType === "tunnel" && !_settings.APISettings.isOffline) {
81
124
  await this._startTunnelAsync();
@@ -166,8 +209,14 @@ class BundlerDevServer {
166
209
  errorMessage: `Timeout waiting for '${this.name}' dev server to close`
167
210
  });
168
211
  }
169
- getUrlCreator() {
170
- (0, _assert).default(this.urlCreator, "Dev server is not running.");
212
+ getUrlCreator(options = {}) {
213
+ if (!this.urlCreator) {
214
+ (0, _assert).default(options == null ? void 0 : options.port, "Dev server instance not found");
215
+ this.urlCreator = new _urlCreator.UrlCreator(options.location, {
216
+ port: options.port,
217
+ getTunnelUrl: this.getTunnelUrl.bind(this)
218
+ });
219
+ }
171
220
  return this.urlCreator;
172
221
  }
173
222
  getNativeRuntimeUrl(opts = {}) {
@@ -210,6 +259,17 @@ class BundlerDevServer {
210
259
  runtime
211
260
  }, resolver);
212
261
  }
262
+ /** Open the dev server in a runtime. */ async openCustomRuntimeAsync(launchTarget, launchProps = {}, resolver = {}) {
263
+ const runtime = this.isTargetingNative() ? this.isDevClient ? "custom" : "expo" : "web";
264
+ if (runtime !== "custom") {
265
+ throw new _errors.CommandError(`dev server cannot open custom runtimes either because it does not target native platforms or because it is not targeting dev clients. (target: ${runtime})`);
266
+ }
267
+ const manager = await this.getPlatformManagerAsync(launchTarget);
268
+ return manager.openAsync({
269
+ runtime: "custom",
270
+ props: launchProps
271
+ }, resolver);
272
+ }
213
273
  /** Should use the interstitial page for selecting which runtime to use. */ shouldUseInterstitialPage() {
214
274
  return _env.env.EXPO_ENABLE_INTERSTITIAL_PAGE && // Checks if dev client is installed.
215
275
  !!_resolveFrom.default.silent(this.projectRoot, "expo-dev-launcher");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/start/server/BundlerDevServer.ts"],"sourcesContent":["import { MessageSocket } from '@expo/dev-server';\nimport assert from 'assert';\nimport openBrowserAsync from 'better-opn';\nimport resolveFrom from 'resolve-from';\n\nimport { APISettings } from '../../api/settings';\nimport * as Log from '../../log';\nimport { FileNotifier } from '../../utils/FileNotifier';\nimport { resolveWithTimeout } from '../../utils/delay';\nimport { env } from '../../utils/env';\nimport { CommandError } from '../../utils/errors';\nimport { BaseResolveDeviceProps, PlatformManager } from '../platforms/PlatformManager';\nimport { AsyncNgrok } from './AsyncNgrok';\nimport { DevelopmentSession } from './DevelopmentSession';\nimport { CreateURLOptions, UrlCreator } from './UrlCreator';\n\nexport type ServerLike = {\n close(callback?: (err?: Error) => void): void;\n};\n\nexport type DevServerInstance = {\n /** Bundler dev server instance. */\n server: ServerLike;\n /** Dev server URL location properties. */\n location: {\n url: string;\n port: number;\n protocol: 'http' | 'https';\n host?: string;\n };\n /** Additional middleware that's attached to the `server`. */\n middleware: any;\n /** Message socket for communicating with the runtime. */\n messageSocket: MessageSocket;\n};\n\nexport interface BundlerStartOptions {\n /** Should the dev server use `https` protocol. */\n https?: boolean;\n /** Should start the dev servers in development mode (minify). */\n mode?: 'development' | 'production';\n /** Is dev client enabled. */\n devClient?: boolean;\n /** Should run dev servers with clean caches. */\n resetDevServer?: boolean;\n /** Which manifest type to serve. */\n forceManifestType?: 'expo-updates' | 'classic';\n /** Code signing private key path (defaults to same directory as certificate) */\n privateKeyPath?: string;\n\n /** Max amount of workers (threads) to use with Metro bundler, defaults to undefined for max workers. */\n maxWorkers?: number;\n /** Port to start the dev server on. */\n port?: number;\n\n /** Should instruct the bundler to create minified bundles. */\n minify?: boolean;\n\n // Webpack options\n /** Should modify and create PWA icons. */\n isImageEditingEnabled?: boolean;\n\n location: CreateURLOptions;\n}\n\nconst PLATFORM_MANAGERS = {\n simulator: () =>\n require('../platforms/ios/ApplePlatformManager')\n .ApplePlatformManager as typeof import('../platforms/ios/ApplePlatformManager').ApplePlatformManager,\n emulator: () =>\n require('../platforms/android/AndroidPlatformManager')\n .AndroidPlatformManager as typeof import('../platforms/android/AndroidPlatformManager').AndroidPlatformManager,\n};\n\nconst MIDDLEWARES = {\n classic: () =>\n require('./middleware/ClassicManifestMiddleware')\n .ClassicManifestMiddleware as typeof import('./middleware/ClassicManifestMiddleware').ClassicManifestMiddleware,\n 'expo-updates': () =>\n require('./middleware/ExpoGoManifestHandlerMiddleware')\n .ExpoGoManifestHandlerMiddleware as typeof import('./middleware/ExpoGoManifestHandlerMiddleware').ExpoGoManifestHandlerMiddleware,\n};\n\nexport abstract class BundlerDevServer {\n /** Name of the bundler. */\n abstract get name(): string;\n\n /** Ngrok instance for managing tunnel connections. */\n protected ngrok: AsyncNgrok | null = null;\n /** Interfaces with the Expo 'Development Session' API. */\n protected devSession: DevelopmentSession | null = null;\n /** Http server and related info. */\n protected instance: DevServerInstance | null = null;\n /** Native platform interfaces for opening projects. */\n private platformManagers: Record<string, PlatformManager<any>> = {};\n /** Manages the creation of dev server URLs. */\n protected urlCreator?: UrlCreator | null = null;\n\n constructor(\n /** Project root folder. */\n public projectRoot: string,\n // TODO: Replace with custom scheme maybe...\n public isDevClient?: boolean\n ) {}\n\n protected setInstance(instance: DevServerInstance) {\n this.instance = instance;\n }\n\n /** Get the manifest middleware function. */\n protected async getManifestMiddlewareAsync(\n options: Pick<\n BundlerStartOptions,\n 'minify' | 'mode' | 'forceManifestType' | 'privateKeyPath'\n > = {}\n ) {\n const manifestType = options.forceManifestType || 'classic';\n assert(manifestType in MIDDLEWARES, `Manifest middleware for type '${manifestType}' not found`);\n const Middleware = MIDDLEWARES[manifestType]();\n\n const urlCreator = this.getUrlCreator();\n const middleware = new Middleware(this.projectRoot, {\n constructUrl: urlCreator.constructUrl.bind(urlCreator),\n mode: options.mode,\n minify: options.minify,\n isNativeWebpack: this.name === 'webpack' && this.isTargetingNative(),\n privateKeyPath: options.privateKeyPath,\n });\n return middleware.getHandler();\n }\n\n /** Start the dev server using settings defined in the start command. */\n public abstract startAsync(options: BundlerStartOptions): Promise<DevServerInstance>;\n\n protected async postStartAsync(options: BundlerStartOptions) {\n if (options.location.hostType === 'tunnel' && !APISettings.isOffline) {\n await this._startTunnelAsync();\n }\n await this.startDevSessionAsync();\n\n this.watchConfig();\n }\n\n protected abstract getConfigModuleIds(): string[];\n\n protected watchConfig() {\n const notifier = new FileNotifier(this.projectRoot, this.getConfigModuleIds());\n notifier.startObserving();\n }\n\n /** Create ngrok instance and start the tunnel server. Exposed for testing. */\n public async _startTunnelAsync(): Promise<AsyncNgrok | null> {\n const port = this.getInstance()?.location.port;\n if (!port) return null;\n Log.debug('[ngrok] connect to port: ' + port);\n this.ngrok = new AsyncNgrok(this.projectRoot, port);\n await this.ngrok.startAsync();\n return this.ngrok;\n }\n\n protected async startDevSessionAsync() {\n // This is used to make Expo Go open the project in either Expo Go, or the web browser.\n // Must come after ngrok (`startTunnelAsync`) setup.\n\n if (this.devSession) {\n this.devSession.stopNotifying();\n }\n\n this.devSession = new DevelopmentSession(\n this.projectRoot,\n // This URL will be used on external devices so the computer IP won't be relevant.\n this.isTargetingNative()\n ? this.getNativeRuntimeUrl()\n : this.getDevServerUrl({ hostType: 'localhost' })\n );\n\n await this.devSession.startAsync({\n runtime: this.isTargetingNative() ? 'native' : 'web',\n });\n }\n\n public isTargetingNative() {\n // Temporary hack while we implement multi-bundler dev server proxy.\n return true;\n }\n\n public isTargetingWeb() {\n return false;\n }\n\n /**\n * Sends a message over web sockets to any connected device,\n * does nothing when the dev server is not running.\n *\n * @param method name of the command. In RN projects `reload`, and `devMenu` are available. In Expo Go, `sendDevCommand` is available.\n * @param params\n */\n public broadcastMessage(\n method: 'reload' | 'devMenu' | 'sendDevCommand',\n params?: Record<string, any>\n ) {\n this.getInstance()?.messageSocket.broadcast(method, params);\n }\n\n /** Get the running dev server instance. */\n public getInstance() {\n return this.instance;\n }\n\n /** Stop the running dev server instance. */\n async stopAsync() {\n // Stop the dev session timer and tell Expo API to remove dev session.\n await this.devSession?.closeAsync();\n\n // Stop ngrok if running.\n await this.ngrok?.stopAsync().catch((e) => {\n Log.error(`Error stopping ngrok:`);\n Log.exception(e);\n });\n\n return resolveWithTimeout(\n () =>\n new Promise<void>((resolve, reject) => {\n // Close the server.\n Log.debug(`Stopping dev server (bundler: ${this.name})`);\n\n if (this.instance?.server) {\n this.instance.server.close((error) => {\n Log.debug(`Stopped dev server (bundler: ${this.name})`);\n this.instance = null;\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n } else {\n Log.debug(`Stopped dev server (bundler: ${this.name})`);\n this.instance = null;\n resolve();\n }\n }),\n {\n // NOTE(Bacon): Metro dev server doesn't seem to be closing in time.\n timeout: 1000,\n errorMessage: `Timeout waiting for '${this.name}' dev server to close`,\n }\n );\n }\n\n private getUrlCreator() {\n assert(this.urlCreator, 'Dev server is not running.');\n return this.urlCreator;\n }\n\n public getNativeRuntimeUrl(opts: Partial<CreateURLOptions> = {}) {\n return this.isDevClient\n ? this.getUrlCreator().constructDevClientUrl(opts) ?? this.getDevServerUrl()\n : this.getUrlCreator().constructUrl({ ...opts, scheme: 'exp' });\n }\n\n /** Get the URL for the running instance of the dev server. */\n public getDevServerUrl(options: { hostType?: 'localhost' } = {}): string | null {\n const instance = this.getInstance();\n if (!instance?.location) {\n return null;\n }\n const { location } = instance;\n if (options.hostType === 'localhost') {\n return `${location.protocol}://localhost:${location.port}`;\n }\n return location.url ?? null;\n }\n\n /** Get the tunnel URL from ngrok. */\n public getTunnelUrl(): string | null {\n return this.ngrok?.getActiveUrl() ?? null;\n }\n\n /** Open the dev server in a runtime. */\n public async openPlatformAsync(\n launchTarget: keyof typeof PLATFORM_MANAGERS | 'desktop',\n resolver: BaseResolveDeviceProps<any> = {}\n ) {\n if (launchTarget === 'desktop') {\n const url = this.getDevServerUrl({ hostType: 'localhost' });\n await openBrowserAsync(url!);\n return { url };\n }\n\n const runtime = this.isTargetingNative() ? (this.isDevClient ? 'custom' : 'expo') : 'web';\n const manager = await this.getPlatformManagerAsync(launchTarget);\n return manager.openAsync({ runtime }, resolver);\n }\n\n /** Should use the interstitial page for selecting which runtime to use. */\n protected shouldUseInterstitialPage(): boolean {\n return (\n env.EXPO_ENABLE_INTERSTITIAL_PAGE &&\n // Checks if dev client is installed.\n !!resolveFrom.silent(this.projectRoot, 'expo-dev-launcher')\n );\n }\n\n /** Get the URL for opening in Expo Go. */\n protected getExpoGoUrl(platform: keyof typeof PLATFORM_MANAGERS): string | null {\n if (this.shouldUseInterstitialPage()) {\n const loadingUrl =\n platform === 'emulator'\n ? this.urlCreator?.constructLoadingUrl({}, 'android')\n : this.urlCreator?.constructLoadingUrl({ hostType: 'localhost' }, 'ios');\n return loadingUrl ?? null;\n }\n\n return this.urlCreator?.constructUrl({ scheme: 'exp' }) ?? null;\n }\n\n protected async getPlatformManagerAsync(platform: keyof typeof PLATFORM_MANAGERS) {\n if (!this.platformManagers[platform]) {\n const Manager = PLATFORM_MANAGERS[platform]();\n const port = this.getInstance()?.location.port;\n if (!port || !this.urlCreator) {\n throw new CommandError(\n 'DEV_SERVER',\n 'Cannot interact with native platforms until dev server has started'\n );\n }\n this.platformManagers[platform] = new Manager(this.projectRoot, port, {\n getCustomRuntimeUrl: this.urlCreator.constructDevClientUrl.bind(this.urlCreator),\n getExpoGoUrl: this.getExpoGoUrl.bind(this, platform),\n getDevServerUrl: this.getDevServerUrl.bind(this, { hostType: 'localhost' }),\n });\n }\n return this.platformManagers[platform];\n }\n}\n"],"names":["Log","PLATFORM_MANAGERS","simulator","require","ApplePlatformManager","emulator","AndroidPlatformManager","MIDDLEWARES","classic","ClassicManifestMiddleware","ExpoGoManifestHandlerMiddleware","BundlerDevServer","constructor","projectRoot","isDevClient","ngrok","devSession","instance","platformManagers","urlCreator","setInstance","getManifestMiddlewareAsync","options","manifestType","forceManifestType","assert","Middleware","getUrlCreator","middleware","constructUrl","bind","mode","minify","isNativeWebpack","name","isTargetingNative","privateKeyPath","getHandler","postStartAsync","location","hostType","APISettings","isOffline","_startTunnelAsync","startDevSessionAsync","watchConfig","notifier","FileNotifier","getConfigModuleIds","startObserving","port","getInstance","debug","AsyncNgrok","startAsync","stopNotifying","DevelopmentSession","getNativeRuntimeUrl","getDevServerUrl","runtime","isTargetingWeb","broadcastMessage","method","params","messageSocket","broadcast","stopAsync","closeAsync","catch","e","error","exception","resolveWithTimeout","Promise","resolve","reject","server","close","timeout","errorMessage","opts","constructDevClientUrl","scheme","protocol","url","getTunnelUrl","getActiveUrl","openPlatformAsync","launchTarget","resolver","openBrowserAsync","manager","getPlatformManagerAsync","openAsync","shouldUseInterstitialPage","env","EXPO_ENABLE_INTERSTITIAL_PAGE","resolveFrom","silent","getExpoGoUrl","platform","loadingUrl","constructLoadingUrl","Manager","CommandError","getCustomRuntimeUrl"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/start/server/BundlerDevServer.ts"],"sourcesContent":["import { MessageSocket } from '@expo/dev-server';\nimport assert from 'assert';\nimport openBrowserAsync from 'better-opn';\nimport resolveFrom from 'resolve-from';\n\nimport { APISettings } from '../../api/settings';\nimport * as Log from '../../log';\nimport { FileNotifier } from '../../utils/FileNotifier';\nimport { resolveWithTimeout } from '../../utils/delay';\nimport { env } from '../../utils/env';\nimport { CommandError } from '../../utils/errors';\nimport {\n BaseOpenInCustomProps,\n BaseResolveDeviceProps,\n PlatformManager,\n} from '../platforms/PlatformManager';\nimport { AsyncNgrok } from './AsyncNgrok';\nimport { DevelopmentSession } from './DevelopmentSession';\nimport { CreateURLOptions, UrlCreator } from './UrlCreator';\n\nexport type ServerLike = {\n close(callback?: (err?: Error) => void): void;\n};\n\nexport type DevServerInstance = {\n /** Bundler dev server instance. */\n server: ServerLike;\n /** Dev server URL location properties. */\n location: {\n url: string;\n port: number;\n protocol: 'http' | 'https';\n host?: string;\n };\n /** Additional middleware that's attached to the `server`. */\n middleware: any;\n /** Message socket for communicating with the runtime. */\n messageSocket: MessageSocket;\n};\n\nexport interface BundlerStartOptions {\n /** Should the dev server use `https` protocol. */\n https?: boolean;\n /** Should start the dev servers in development mode (minify). */\n mode?: 'development' | 'production';\n /** Is dev client enabled. */\n devClient?: boolean;\n /** Should run dev servers with clean caches. */\n resetDevServer?: boolean;\n /** Which manifest type to serve. */\n forceManifestType?: 'expo-updates' | 'classic';\n /** Code signing private key path (defaults to same directory as certificate) */\n privateKeyPath?: string;\n\n /** Max amount of workers (threads) to use with Metro bundler, defaults to undefined for max workers. */\n maxWorkers?: number;\n /** Port to start the dev server on. */\n port?: number;\n\n /** Should start a headless dev server e.g. mock representation to approximate info from a server running in a different process. */\n headless?: boolean;\n /** Should instruct the bundler to create minified bundles. */\n minify?: boolean;\n\n // Webpack options\n /** Should modify and create PWA icons. */\n isImageEditingEnabled?: boolean;\n\n location: CreateURLOptions;\n}\n\nconst PLATFORM_MANAGERS = {\n simulator: () =>\n require('../platforms/ios/ApplePlatformManager')\n .ApplePlatformManager as typeof import('../platforms/ios/ApplePlatformManager').ApplePlatformManager,\n emulator: () =>\n require('../platforms/android/AndroidPlatformManager')\n .AndroidPlatformManager as typeof import('../platforms/android/AndroidPlatformManager').AndroidPlatformManager,\n};\n\nconst MIDDLEWARES = {\n classic: () =>\n require('./middleware/ClassicManifestMiddleware')\n .ClassicManifestMiddleware as typeof import('./middleware/ClassicManifestMiddleware').ClassicManifestMiddleware,\n 'expo-updates': () =>\n require('./middleware/ExpoGoManifestHandlerMiddleware')\n .ExpoGoManifestHandlerMiddleware as typeof import('./middleware/ExpoGoManifestHandlerMiddleware').ExpoGoManifestHandlerMiddleware,\n};\n\nexport abstract class BundlerDevServer {\n /** Name of the bundler. */\n abstract get name(): string;\n\n /** Ngrok instance for managing tunnel connections. */\n protected ngrok: AsyncNgrok | null = null;\n /** Interfaces with the Expo 'Development Session' API. */\n protected devSession: DevelopmentSession | null = null;\n /** Http server and related info. */\n protected instance: DevServerInstance | null = null;\n /** Native platform interfaces for opening projects. */\n private platformManagers: Record<string, PlatformManager<any>> = {};\n /** Manages the creation of dev server URLs. */\n protected urlCreator?: UrlCreator | null = null;\n\n constructor(\n /** Project root folder. */\n public projectRoot: string,\n // TODO: Replace with custom scheme maybe...\n public isDevClient?: boolean\n ) {}\n\n protected setInstance(instance: DevServerInstance) {\n this.instance = instance;\n }\n\n /** Get the manifest middleware function. */\n protected async getManifestMiddlewareAsync(\n options: Pick<\n BundlerStartOptions,\n 'minify' | 'mode' | 'forceManifestType' | 'privateKeyPath'\n > = {}\n ) {\n const manifestType = options.forceManifestType || 'classic';\n assert(manifestType in MIDDLEWARES, `Manifest middleware for type '${manifestType}' not found`);\n const Middleware = MIDDLEWARES[manifestType]();\n\n const urlCreator = this.getUrlCreator();\n const middleware = new Middleware(this.projectRoot, {\n constructUrl: urlCreator.constructUrl.bind(urlCreator),\n mode: options.mode,\n minify: options.minify,\n isNativeWebpack: this.name === 'webpack' && this.isTargetingNative(),\n privateKeyPath: options.privateKeyPath,\n });\n return middleware.getHandler();\n }\n\n /** Start the dev server using settings defined in the start command. */\n public async startAsync(options: BundlerStartOptions): Promise<DevServerInstance> {\n await this.stopAsync();\n\n let instance: DevServerInstance;\n if (options.headless) {\n instance = await this.startHeadlessAsync(options);\n } else {\n instance = await this.startImplementationAsync(options);\n }\n\n this.setInstance(instance);\n await this.postStartAsync(options);\n return instance;\n }\n\n protected abstract startImplementationAsync(\n options: BundlerStartOptions\n ): Promise<DevServerInstance>;\n\n /**\n * Creates a mock server representation that can be used to estimate URLs for a server started in another process.\n * This is used for the run commands where you can reuse the server from a previous run.\n */\n private async startHeadlessAsync(options: BundlerStartOptions): Promise<DevServerInstance> {\n if (!options.port)\n throw new CommandError('HEADLESS_SERVER', 'headless dev server requires a port option');\n this.urlCreator = this.getUrlCreator(options);\n\n return {\n // Create a mock server\n server: {\n close: () => {\n this.instance = null;\n },\n },\n location: {\n // The port is the main thing we want to send back.\n port: options.port,\n // localhost isn't always correct.\n host: 'localhost',\n // http is the only supported protocol on native.\n url: `http://localhost:${options.port}`,\n protocol: 'http',\n },\n middleware: {},\n messageSocket: {\n broadcast: () => {\n throw new CommandError('HEADLESS_SERVER', 'Cannot broadcast messages to headless server');\n },\n },\n };\n }\n\n protected async postStartAsync(options: BundlerStartOptions) {\n if (options.location.hostType === 'tunnel' && !APISettings.isOffline) {\n await this._startTunnelAsync();\n }\n await this.startDevSessionAsync();\n\n this.watchConfig();\n }\n\n protected abstract getConfigModuleIds(): string[];\n\n protected watchConfig() {\n const notifier = new FileNotifier(this.projectRoot, this.getConfigModuleIds());\n notifier.startObserving();\n }\n\n /** Create ngrok instance and start the tunnel server. Exposed for testing. */\n public async _startTunnelAsync(): Promise<AsyncNgrok | null> {\n const port = this.getInstance()?.location.port;\n if (!port) return null;\n Log.debug('[ngrok] connect to port: ' + port);\n this.ngrok = new AsyncNgrok(this.projectRoot, port);\n await this.ngrok.startAsync();\n return this.ngrok;\n }\n\n protected async startDevSessionAsync() {\n // This is used to make Expo Go open the project in either Expo Go, or the web browser.\n // Must come after ngrok (`startTunnelAsync`) setup.\n\n if (this.devSession) {\n this.devSession.stopNotifying();\n }\n\n this.devSession = new DevelopmentSession(\n this.projectRoot,\n // This URL will be used on external devices so the computer IP won't be relevant.\n this.isTargetingNative()\n ? this.getNativeRuntimeUrl()\n : this.getDevServerUrl({ hostType: 'localhost' })\n );\n\n await this.devSession.startAsync({\n runtime: this.isTargetingNative() ? 'native' : 'web',\n });\n }\n\n public isTargetingNative() {\n // Temporary hack while we implement multi-bundler dev server proxy.\n return true;\n }\n\n public isTargetingWeb() {\n return false;\n }\n\n /**\n * Sends a message over web sockets to any connected device,\n * does nothing when the dev server is not running.\n *\n * @param method name of the command. In RN projects `reload`, and `devMenu` are available. In Expo Go, `sendDevCommand` is available.\n * @param params\n */\n public broadcastMessage(\n method: 'reload' | 'devMenu' | 'sendDevCommand',\n params?: Record<string, any>\n ) {\n this.getInstance()?.messageSocket.broadcast(method, params);\n }\n\n /** Get the running dev server instance. */\n public getInstance() {\n return this.instance;\n }\n\n /** Stop the running dev server instance. */\n async stopAsync() {\n // Stop the dev session timer and tell Expo API to remove dev session.\n await this.devSession?.closeAsync();\n\n // Stop ngrok if running.\n await this.ngrok?.stopAsync().catch((e) => {\n Log.error(`Error stopping ngrok:`);\n Log.exception(e);\n });\n\n return resolveWithTimeout(\n () =>\n new Promise<void>((resolve, reject) => {\n // Close the server.\n Log.debug(`Stopping dev server (bundler: ${this.name})`);\n\n if (this.instance?.server) {\n this.instance.server.close((error) => {\n Log.debug(`Stopped dev server (bundler: ${this.name})`);\n this.instance = null;\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n } else {\n Log.debug(`Stopped dev server (bundler: ${this.name})`);\n this.instance = null;\n resolve();\n }\n }),\n {\n // NOTE(Bacon): Metro dev server doesn't seem to be closing in time.\n timeout: 1000,\n errorMessage: `Timeout waiting for '${this.name}' dev server to close`,\n }\n );\n }\n\n protected getUrlCreator(options: Partial<Pick<BundlerStartOptions, 'port' | 'location'>> = {}) {\n if (!this.urlCreator) {\n assert(options?.port, 'Dev server instance not found');\n this.urlCreator = new UrlCreator(options.location, {\n port: options.port,\n getTunnelUrl: this.getTunnelUrl.bind(this),\n });\n }\n return this.urlCreator;\n }\n\n public getNativeRuntimeUrl(opts: Partial<CreateURLOptions> = {}) {\n return this.isDevClient\n ? this.getUrlCreator().constructDevClientUrl(opts) ?? this.getDevServerUrl()\n : this.getUrlCreator().constructUrl({ ...opts, scheme: 'exp' });\n }\n\n /** Get the URL for the running instance of the dev server. */\n public getDevServerUrl(options: { hostType?: 'localhost' } = {}): string | null {\n const instance = this.getInstance();\n if (!instance?.location) {\n return null;\n }\n const { location } = instance;\n if (options.hostType === 'localhost') {\n return `${location.protocol}://localhost:${location.port}`;\n }\n return location.url ?? null;\n }\n\n /** Get the tunnel URL from ngrok. */\n public getTunnelUrl(): string | null {\n return this.ngrok?.getActiveUrl() ?? null;\n }\n\n /** Open the dev server in a runtime. */\n public async openPlatformAsync(\n launchTarget: keyof typeof PLATFORM_MANAGERS | 'desktop',\n resolver: BaseResolveDeviceProps<any> = {}\n ) {\n if (launchTarget === 'desktop') {\n const url = this.getDevServerUrl({ hostType: 'localhost' });\n await openBrowserAsync(url!);\n return { url };\n }\n\n const runtime = this.isTargetingNative() ? (this.isDevClient ? 'custom' : 'expo') : 'web';\n const manager = await this.getPlatformManagerAsync(launchTarget);\n return manager.openAsync({ runtime }, resolver);\n }\n\n /** Open the dev server in a runtime. */\n public async openCustomRuntimeAsync(\n launchTarget: keyof typeof PLATFORM_MANAGERS,\n launchProps: Partial<BaseOpenInCustomProps> = {},\n resolver: BaseResolveDeviceProps<any> = {}\n ) {\n const runtime = this.isTargetingNative() ? (this.isDevClient ? 'custom' : 'expo') : 'web';\n if (runtime !== 'custom') {\n throw new CommandError(\n `dev server cannot open custom runtimes either because it does not target native platforms or because it is not targeting dev clients. (target: ${runtime})`\n );\n }\n\n const manager = await this.getPlatformManagerAsync(launchTarget);\n return manager.openAsync({ runtime: 'custom', props: launchProps }, resolver);\n }\n\n /** Should use the interstitial page for selecting which runtime to use. */\n protected shouldUseInterstitialPage(): boolean {\n return (\n env.EXPO_ENABLE_INTERSTITIAL_PAGE &&\n // Checks if dev client is installed.\n !!resolveFrom.silent(this.projectRoot, 'expo-dev-launcher')\n );\n }\n\n /** Get the URL for opening in Expo Go. */\n protected getExpoGoUrl(platform: keyof typeof PLATFORM_MANAGERS): string | null {\n if (this.shouldUseInterstitialPage()) {\n const loadingUrl =\n platform === 'emulator'\n ? this.urlCreator?.constructLoadingUrl({}, 'android')\n : this.urlCreator?.constructLoadingUrl({ hostType: 'localhost' }, 'ios');\n return loadingUrl ?? null;\n }\n\n return this.urlCreator?.constructUrl({ scheme: 'exp' }) ?? null;\n }\n\n protected async getPlatformManagerAsync(platform: keyof typeof PLATFORM_MANAGERS) {\n if (!this.platformManagers[platform]) {\n const Manager = PLATFORM_MANAGERS[platform]();\n const port = this.getInstance()?.location.port;\n if (!port || !this.urlCreator) {\n throw new CommandError(\n 'DEV_SERVER',\n 'Cannot interact with native platforms until dev server has started'\n );\n }\n this.platformManagers[platform] = new Manager(this.projectRoot, port, {\n getCustomRuntimeUrl: this.urlCreator.constructDevClientUrl.bind(this.urlCreator),\n getExpoGoUrl: this.getExpoGoUrl.bind(this, platform),\n getDevServerUrl: this.getDevServerUrl.bind(this, { hostType: 'localhost' }),\n });\n }\n return this.platformManagers[platform];\n }\n}\n"],"names":["Log","PLATFORM_MANAGERS","simulator","require","ApplePlatformManager","emulator","AndroidPlatformManager","MIDDLEWARES","classic","ClassicManifestMiddleware","ExpoGoManifestHandlerMiddleware","BundlerDevServer","constructor","projectRoot","isDevClient","ngrok","devSession","instance","platformManagers","urlCreator","setInstance","getManifestMiddlewareAsync","options","manifestType","forceManifestType","assert","Middleware","getUrlCreator","middleware","constructUrl","bind","mode","minify","isNativeWebpack","name","isTargetingNative","privateKeyPath","getHandler","startAsync","stopAsync","headless","startHeadlessAsync","startImplementationAsync","postStartAsync","port","CommandError","server","close","location","host","url","protocol","messageSocket","broadcast","hostType","APISettings","isOffline","_startTunnelAsync","startDevSessionAsync","watchConfig","notifier","FileNotifier","getConfigModuleIds","startObserving","getInstance","debug","AsyncNgrok","stopNotifying","DevelopmentSession","getNativeRuntimeUrl","getDevServerUrl","runtime","isTargetingWeb","broadcastMessage","method","params","closeAsync","catch","e","error","exception","resolveWithTimeout","Promise","resolve","reject","timeout","errorMessage","UrlCreator","getTunnelUrl","opts","constructDevClientUrl","scheme","getActiveUrl","openPlatformAsync","launchTarget","resolver","openBrowserAsync","manager","getPlatformManagerAsync","openAsync","openCustomRuntimeAsync","launchProps","props","shouldUseInterstitialPage","env","EXPO_ENABLE_INTERSTITIAL_PAGE","resolveFrom","silent","getExpoGoUrl","platform","loadingUrl","constructLoadingUrl","Manager","getCustomRuntimeUrl"],"mappings":"AAAA;;;;AACmB,IAAA,OAAQ,kCAAR,QAAQ,EAAA;AACE,IAAA,UAAY,kCAAZ,YAAY,EAAA;AACjB,IAAA,YAAc,kCAAd,cAAc,EAAA;AAEV,IAAA,SAAoB,WAApB,oBAAoB,CAAA;AACpCA,IAAAA,GAAG,mCAAM,WAAW,EAAjB;AACc,IAAA,aAA0B,WAA1B,0BAA0B,CAAA;AACpB,IAAA,MAAmB,WAAnB,mBAAmB,CAAA;AAClC,IAAA,IAAiB,WAAjB,iBAAiB,CAAA;AACR,IAAA,OAAoB,WAApB,oBAAoB,CAAA;AAMtB,IAAA,WAAc,WAAd,cAAc,CAAA;AACN,IAAA,mBAAsB,WAAtB,sBAAsB,CAAA;AACZ,IAAA,WAAc,WAAd,cAAc,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqD3D,MAAMC,iBAAiB,GAAG;IACxBC,SAAS,EAAE,IACTC,OAAO,CAAC,uCAAuC,CAAC,CAC7CC,oBAAoB;IAA+E;IACxGC,QAAQ,EAAE,IACRF,OAAO,CAAC,6CAA6C,CAAC,CACnDG,sBAAsB;CAC5B,AAAC;AAEF,MAAMC,WAAW,GAAG;IAClBC,OAAO,EAAE,IACPL,OAAO,CAAC,wCAAwC,CAAC,CAC9CM,yBAAyB;IAAqF;IACnH,cAAc,EAAE,IACdN,OAAO,CAAC,8CAA8C,CAAC,CACpDO,+BAA+B;CACrC,AAAC;AAEK,MAAeC,gBAAgB;IAepCC,YAESC,WAAmB,EAEnBC,WAAqB,CAC5B;aAHOD,WAAmB,GAAnBA,WAAmB;aAEnBC,WAAqB,GAArBA,WAAqB;aAdpBC,KAAK,GAAsB,IAAI;aAE/BC,UAAU,GAA8B,IAAI;aAE5CC,QAAQ,GAA6B,IAAI;aAE3CC,gBAAgB,GAAyC,EAAE;aAEzDC,UAAU,GAAuB,IAAI;KAO3C;IAEJ,AAAUC,WAAW,CAACH,QAA2B,EAAE;QACjD,IAAI,CAACA,QAAQ,GAAGA,QAAQ,CAAC;KAC1B;IAED,4CAA4C,CAC5C,MAAgBI,0BAA0B,CACxCC,OAGC,GAAG,EAAE,EACN;QACA,MAAMC,YAAY,GAAGD,OAAO,CAACE,iBAAiB,IAAI,SAAS,AAAC;QAC5DC,CAAAA,GAAAA,OAAM,AAAyF,CAAA,QAAzF,CAACF,YAAY,IAAIhB,WAAW,EAAE,CAAC,8BAA8B,EAAEgB,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;QAChG,MAAMG,UAAU,GAAGnB,WAAW,CAACgB,YAAY,CAAC,EAAE,AAAC;QAE/C,MAAMJ,UAAU,GAAG,IAAI,CAACQ,aAAa,EAAE,AAAC;QACxC,MAAMC,UAAU,GAAG,IAAIF,UAAU,CAAC,IAAI,CAACb,WAAW,EAAE;YAClDgB,YAAY,EAAEV,UAAU,CAACU,YAAY,CAACC,IAAI,CAACX,UAAU,CAAC;YACtDY,IAAI,EAAET,OAAO,CAACS,IAAI;YAClBC,MAAM,EAAEV,OAAO,CAACU,MAAM;YACtBC,eAAe,EAAE,IAAI,CAACC,IAAI,KAAK,SAAS,IAAI,IAAI,CAACC,iBAAiB,EAAE;YACpEC,cAAc,EAAEd,OAAO,CAACc,cAAc;SACvC,CAAC,AAAC;QACH,OAAOR,UAAU,CAACS,UAAU,EAAE,CAAC;KAChC;IAED,wEAAwE,CACxE,MAAaC,UAAU,CAAChB,OAA4B,EAA8B;QAChF,MAAM,IAAI,CAACiB,SAAS,EAAE,CAAC;QAEvB,IAAItB,QAAQ,AAAmB,AAAC;QAChC,IAAIK,OAAO,CAACkB,QAAQ,EAAE;YACpBvB,QAAQ,GAAG,MAAM,IAAI,CAACwB,kBAAkB,CAACnB,OAAO,CAAC,CAAC;SACnD,MAAM;YACLL,QAAQ,GAAG,MAAM,IAAI,CAACyB,wBAAwB,CAACpB,OAAO,CAAC,CAAC;SACzD;QAED,IAAI,CAACF,WAAW,CAACH,QAAQ,CAAC,CAAC;QAC3B,MAAM,IAAI,CAAC0B,cAAc,CAACrB,OAAO,CAAC,CAAC;QACnC,OAAOL,QAAQ,CAAC;KACjB;IAMD;;;KAGG,CACH,MAAcwB,kBAAkB,CAACnB,OAA4B,EAA8B;QACzF,IAAI,CAACA,OAAO,CAACsB,IAAI,EACf,MAAM,IAAIC,OAAY,aAAA,CAAC,iBAAiB,EAAE,4CAA4C,CAAC,CAAC;QAC1F,IAAI,CAAC1B,UAAU,GAAG,IAAI,CAACQ,aAAa,CAACL,OAAO,CAAC,CAAC;QAE9C,OAAO;YACL,uBAAuB;YACvBwB,MAAM,EAAE;gBACNC,KAAK,EAAE,IAAM;oBACX,IAAI,CAAC9B,QAAQ,GAAG,IAAI,CAAC;iBACtB;aACF;YACD+B,QAAQ,EAAE;gBACR,mDAAmD;gBACnDJ,IAAI,EAAEtB,OAAO,CAACsB,IAAI;gBAClB,kCAAkC;gBAClCK,IAAI,EAAE,WAAW;gBACjB,iDAAiD;gBACjDC,GAAG,EAAE,CAAC,iBAAiB,EAAE5B,OAAO,CAACsB,IAAI,CAAC,CAAC;gBACvCO,QAAQ,EAAE,MAAM;aACjB;YACDvB,UAAU,EAAE,EAAE;YACdwB,aAAa,EAAE;gBACbC,SAAS,EAAE,IAAM;oBACf,MAAM,IAAIR,OAAY,aAAA,CAAC,iBAAiB,EAAE,8CAA8C,CAAC,CAAC;iBAC3F;aACF;SACF,CAAC;KACH;IAED,MAAgBF,cAAc,CAACrB,OAA4B,EAAE;QAC3D,IAAIA,OAAO,CAAC0B,QAAQ,CAACM,QAAQ,KAAK,QAAQ,IAAI,CAACC,SAAW,YAAA,CAACC,SAAS,EAAE;YACpE,MAAM,IAAI,CAACC,iBAAiB,EAAE,CAAC;SAChC;QACD,MAAM,IAAI,CAACC,oBAAoB,EAAE,CAAC;QAElC,IAAI,CAACC,WAAW,EAAE,CAAC;KACpB;IAID,AAAUA,WAAW,GAAG;QACtB,MAAMC,QAAQ,GAAG,IAAIC,aAAY,aAAA,CAAC,IAAI,CAAChD,WAAW,EAAE,IAAI,CAACiD,kBAAkB,EAAE,CAAC,AAAC;QAC/EF,QAAQ,CAACG,cAAc,EAAE,CAAC;KAC3B;IAED,8EAA8E,CAC9E,MAAaN,iBAAiB,GAA+B;YAC9C,GAAkB;QAA/B,MAAMb,IAAI,GAAG,CAAA,GAAkB,GAAlB,IAAI,CAACoB,WAAW,EAAE,SAAU,GAA5B,KAAA,CAA4B,GAA5B,GAAkB,CAAEhB,QAAQ,CAACJ,IAAI,AAAC;QAC/C,IAAI,CAACA,IAAI,EAAE,OAAO,IAAI,CAAC;QACvB5C,GAAG,CAACiE,KAAK,CAAC,2BAA2B,GAAGrB,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC7B,KAAK,GAAG,IAAImD,WAAU,WAAA,CAAC,IAAI,CAACrD,WAAW,EAAE+B,IAAI,CAAC,CAAC;QACpD,MAAM,IAAI,CAAC7B,KAAK,CAACuB,UAAU,EAAE,CAAC;QAC9B,OAAO,IAAI,CAACvB,KAAK,CAAC;KACnB;IAED,MAAgB2C,oBAAoB,GAAG;QACrC,uFAAuF;QACvF,oDAAoD;QAEpD,IAAI,IAAI,CAAC1C,UAAU,EAAE;YACnB,IAAI,CAACA,UAAU,CAACmD,aAAa,EAAE,CAAC;SACjC;QAED,IAAI,CAACnD,UAAU,GAAG,IAAIoD,mBAAkB,mBAAA,CACtC,IAAI,CAACvD,WAAW,EAChB,kFAAkF;QAClF,IAAI,CAACsB,iBAAiB,EAAE,GACpB,IAAI,CAACkC,mBAAmB,EAAE,GAC1B,IAAI,CAACC,eAAe,CAAC;YAAEhB,QAAQ,EAAE,WAAW;SAAE,CAAC,CACpD,CAAC;QAEF,MAAM,IAAI,CAACtC,UAAU,CAACsB,UAAU,CAAC;YAC/BiC,OAAO,EAAE,IAAI,CAACpC,iBAAiB,EAAE,GAAG,QAAQ,GAAG,KAAK;SACrD,CAAC,CAAC;KACJ;IAED,AAAOA,iBAAiB,GAAG;QACzB,oEAAoE;QACpE,OAAO,IAAI,CAAC;KACb;IAED,AAAOqC,cAAc,GAAG;QACtB,OAAO,KAAK,CAAC;KACd;IAED;;;;;;KAMG,CACH,AAAOC,gBAAgB,CACrBC,MAA+C,EAC/CC,MAA4B,EAC5B;YACA,GAAkB;QAAlB,CAAA,GAAkB,GAAlB,IAAI,CAACX,WAAW,EAAE,SAAe,GAAjC,KAAA,CAAiC,GAAjC,GAAkB,CAAEZ,aAAa,CAACC,SAAS,CAACqB,MAAM,EAAEC,MAAM,CAAC,CAAC;KAC7D;IAED,2CAA2C,CAC3C,AAAOX,WAAW,GAAG;QACnB,OAAO,IAAI,CAAC/C,QAAQ,CAAC;KACtB;IAED,4CAA4C,CAC5C,MAAMsB,SAAS,GAAG;YAEV,IAAe,EAGf,IAAU;QAJhB,sEAAsE;QACtE,OAAM,CAAA,IAAe,GAAf,IAAI,CAACvB,UAAU,SAAY,GAA3B,KAAA,CAA2B,GAA3B,IAAe,CAAE4D,UAAU,EAAE,CAAA,CAAC;QAEpC,yBAAyB;QACzB,MAAM,CAAA,CAAA,IAAU,GAAV,IAAI,CAAC7D,KAAK,SAAW,GAArB,KAAA,CAAqB,GAArB,IAAU,CAAEwB,SAAS,EAAE,CAACsC,KAAK,CAAC,CAACC,CAAC,GAAK;YACzC9E,GAAG,CAAC+E,KAAK,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC;YACnC/E,GAAG,CAACgF,SAAS,CAACF,CAAC,CAAC,CAAC;SAClB,CAAC,CAAA,CAAC;QAEH,OAAOG,CAAAA,GAAAA,MAAkB,AA2BxB,CAAA,mBA3BwB,CACvB;YACE,OAAA,IAAIC,OAAO,CAAO,CAACC,OAAO,EAAEC,MAAM,GAAK;oBAIjC,GAAa;gBAHjB,oBAAoB;gBACpBpF,GAAG,CAACiE,KAAK,CAAC,CAAC,8BAA8B,EAAE,IAAI,CAAC/B,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEzD,IAAI,CAAA,GAAa,GAAb,IAAI,CAACjB,QAAQ,SAAQ,GAArB,KAAA,CAAqB,GAArB,GAAa,CAAE6B,MAAM,EAAE;oBACzB,IAAI,CAAC7B,QAAQ,CAAC6B,MAAM,CAACC,KAAK,CAAC,CAACgC,KAAK,GAAK;wBACpC/E,GAAG,CAACiE,KAAK,CAAC,CAAC,6BAA6B,EAAE,IAAI,CAAC/B,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;wBACxD,IAAI,CAACjB,QAAQ,GAAG,IAAI,CAAC;wBACrB,IAAI8D,KAAK,EAAE;4BACTK,MAAM,CAACL,KAAK,CAAC,CAAC;yBACf,MAAM;4BACLI,OAAO,EAAE,CAAC;yBACX;qBACF,CAAC,CAAC;iBACJ,MAAM;oBACLnF,GAAG,CAACiE,KAAK,CAAC,CAAC,6BAA6B,EAAE,IAAI,CAAC/B,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBACxD,IAAI,CAACjB,QAAQ,GAAG,IAAI,CAAC;oBACrBkE,OAAO,EAAE,CAAC;iBACX;aACF,CAAC,CAAA;SAAA,EACJ;YACE,oEAAoE;YACpEE,OAAO,EAAE,IAAI;YACbC,YAAY,EAAE,CAAC,qBAAqB,EAAE,IAAI,CAACpD,IAAI,CAAC,qBAAqB,CAAC;SACvE,CACF,CAAC;KACH;IAED,AAAUP,aAAa,CAACL,OAAgE,GAAG,EAAE,EAAE;QAC7F,IAAI,CAAC,IAAI,CAACH,UAAU,EAAE;YACpBM,CAAAA,GAAAA,OAAM,AAAgD,CAAA,QAAhD,CAACH,OAAO,QAAM,GAAbA,KAAAA,CAAa,GAAbA,OAAO,CAAEsB,IAAI,EAAE,+BAA+B,CAAC,CAAC;YACvD,IAAI,CAACzB,UAAU,GAAG,IAAIoE,WAAU,WAAA,CAACjE,OAAO,CAAC0B,QAAQ,EAAE;gBACjDJ,IAAI,EAAEtB,OAAO,CAACsB,IAAI;gBAClB4C,YAAY,EAAE,IAAI,CAACA,YAAY,CAAC1D,IAAI,CAAC,IAAI,CAAC;aAC3C,CAAC,CAAC;SACJ;QACD,OAAO,IAAI,CAACX,UAAU,CAAC;KACxB;IAED,AAAOkD,mBAAmB,CAACoB,IAA+B,GAAG,EAAE,EAAE;YAE3D,GAAgD;QADpD,OAAO,IAAI,CAAC3E,WAAW,GACnB,CAAA,GAAgD,GAAhD,IAAI,CAACa,aAAa,EAAE,CAAC+D,qBAAqB,CAACD,IAAI,CAAC,YAAhD,GAAgD,GAAI,IAAI,CAACnB,eAAe,EAAE,GAC1E,IAAI,CAAC3C,aAAa,EAAE,CAACE,YAAY,CAAC;YAAE,GAAG4D,IAAI;YAAEE,MAAM,EAAE,KAAK;SAAE,CAAC,CAAC;KACnE;IAED,8DAA8D,CAC9D,AAAOrB,eAAe,CAAChD,OAAmC,GAAG,EAAE,EAAiB;QAC9E,MAAML,QAAQ,GAAG,IAAI,CAAC+C,WAAW,EAAE,AAAC;QACpC,IAAI,CAAC/C,CAAAA,QAAQ,QAAU,GAAlBA,KAAAA,CAAkB,GAAlBA,QAAQ,CAAE+B,QAAQ,CAAA,EAAE;YACvB,OAAO,IAAI,CAAC;SACb;QACD,MAAM,EAAEA,QAAQ,CAAA,EAAE,GAAG/B,QAAQ,AAAC;QAC9B,IAAIK,OAAO,CAACgC,QAAQ,KAAK,WAAW,EAAE;YACpC,OAAO,CAAC,EAAEN,QAAQ,CAACG,QAAQ,CAAC,aAAa,EAAEH,QAAQ,CAACJ,IAAI,CAAC,CAAC,CAAC;SAC5D;YACMI,IAAY;QAAnB,OAAOA,CAAAA,IAAY,GAAZA,QAAQ,CAACE,GAAG,YAAZF,IAAY,GAAI,IAAI,CAAC;KAC7B;IAED,qCAAqC,CACrC,AAAOwC,YAAY,GAAkB;YAC5B,GAAU;YAAV,IAA0B;QAAjC,OAAO,CAAA,IAA0B,GAA1B,CAAA,GAAU,GAAV,IAAI,CAACzE,KAAK,SAAc,GAAxB,KAAA,CAAwB,GAAxB,GAAU,CAAE6E,YAAY,EAAE,YAA1B,IAA0B,GAAI,IAAI,CAAC;KAC3C;IAED,wCAAwC,CACxC,MAAaC,iBAAiB,CAC5BC,YAAwD,EACxDC,QAAqC,GAAG,EAAE,EAC1C;QACA,IAAID,YAAY,KAAK,SAAS,EAAE;YAC9B,MAAM5C,GAAG,GAAG,IAAI,CAACoB,eAAe,CAAC;gBAAEhB,QAAQ,EAAE,WAAW;aAAE,CAAC,AAAC;YAC5D,MAAM0C,CAAAA,GAAAA,UAAgB,AAAM,CAAA,QAAN,CAAC9C,GAAG,CAAE,CAAC;YAC7B,OAAO;gBAAEA,GAAG;aAAE,CAAC;SAChB;QAED,MAAMqB,OAAO,GAAG,IAAI,CAACpC,iBAAiB,EAAE,GAAI,IAAI,CAACrB,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAI,KAAK,AAAC;QAC1F,MAAMmF,OAAO,GAAG,MAAM,IAAI,CAACC,uBAAuB,CAACJ,YAAY,CAAC,AAAC;QACjE,OAAOG,OAAO,CAACE,SAAS,CAAC;YAAE5B,OAAO;SAAE,EAAEwB,QAAQ,CAAC,CAAC;KACjD;IAED,wCAAwC,CACxC,MAAaK,sBAAsB,CACjCN,YAA4C,EAC5CO,WAA2C,GAAG,EAAE,EAChDN,QAAqC,GAAG,EAAE,EAC1C;QACA,MAAMxB,OAAO,GAAG,IAAI,CAACpC,iBAAiB,EAAE,GAAI,IAAI,CAACrB,WAAW,GAAG,QAAQ,GAAG,MAAM,GAAI,KAAK,AAAC;QAC1F,IAAIyD,OAAO,KAAK,QAAQ,EAAE;YACxB,MAAM,IAAI1B,OAAY,aAAA,CACpB,CAAC,+IAA+I,EAAE0B,OAAO,CAAC,CAAC,CAAC,CAC7J,CAAC;SACH;QAED,MAAM0B,OAAO,GAAG,MAAM,IAAI,CAACC,uBAAuB,CAACJ,YAAY,CAAC,AAAC;QACjE,OAAOG,OAAO,CAACE,SAAS,CAAC;YAAE5B,OAAO,EAAE,QAAQ;YAAE+B,KAAK,EAAED,WAAW;SAAE,EAAEN,QAAQ,CAAC,CAAC;KAC/E;IAED,2EAA2E,CAC3E,AAAUQ,yBAAyB,GAAY;QAC7C,OACEC,IAAG,IAAA,CAACC,6BAA6B,IACjC,qCAAqC;QACrC,CAAC,CAACC,YAAW,QAAA,CAACC,MAAM,CAAC,IAAI,CAAC9F,WAAW,EAAE,mBAAmB,CAAC,CAC3D;KACH;IAED,0CAA0C,CAC1C,AAAU+F,YAAY,CAACC,QAAwC,EAAiB;YASvE,GAAe;QARtB,IAAI,IAAI,CAACN,yBAAyB,EAAE,EAAE;gBAG9B,IAAe,EACf,IAAe;YAHrB,MAAMO,UAAU,GACdD,QAAQ,KAAK,UAAU,GACnB,CAAA,IAAe,GAAf,IAAI,CAAC1F,UAAU,SAAqB,GAApC,KAAA,CAAoC,GAApC,IAAe,CAAE4F,mBAAmB,CAAC,EAAE,EAAE,SAAS,CAAC,GACnD,CAAA,IAAe,GAAf,IAAI,CAAC5F,UAAU,SAAqB,GAApC,KAAA,CAAoC,GAApC,IAAe,CAAE4F,mBAAmB,CAAC;gBAAEzD,QAAQ,EAAE,WAAW;aAAE,EAAE,KAAK,CAAC,AAAC;YAC7E,OAAOwD,UAAU,WAAVA,UAAU,GAAI,IAAI,CAAC;SAC3B;YAEM,IAAgD;QAAvD,OAAO,CAAA,IAAgD,GAAhD,CAAA,GAAe,GAAf,IAAI,CAAC3F,UAAU,SAAc,GAA7B,KAAA,CAA6B,GAA7B,GAAe,CAAEU,YAAY,CAAC;YAAE8D,MAAM,EAAE,KAAK;SAAE,CAAC,YAAhD,IAAgD,GAAI,IAAI,CAAC;KACjE;IAED,MAAgBO,uBAAuB,CAACW,QAAwC,EAAE;QAChF,IAAI,CAAC,IAAI,CAAC3F,gBAAgB,CAAC2F,QAAQ,CAAC,EAAE;gBAEvB,GAAkB;YAD/B,MAAMG,OAAO,GAAG/G,iBAAiB,CAAC4G,QAAQ,CAAC,EAAE,AAAC;YAC9C,MAAMjE,IAAI,GAAG,CAAA,GAAkB,GAAlB,IAAI,CAACoB,WAAW,EAAE,SAAU,GAA5B,KAAA,CAA4B,GAA5B,GAAkB,CAAEhB,QAAQ,CAACJ,IAAI,AAAC;YAC/C,IAAI,CAACA,IAAI,IAAI,CAAC,IAAI,CAACzB,UAAU,EAAE;gBAC7B,MAAM,IAAI0B,OAAY,aAAA,CACpB,YAAY,EACZ,oEAAoE,CACrE,CAAC;aACH;YACD,IAAI,CAAC3B,gBAAgB,CAAC2F,QAAQ,CAAC,GAAG,IAAIG,OAAO,CAAC,IAAI,CAACnG,WAAW,EAAE+B,IAAI,EAAE;gBACpEqE,mBAAmB,EAAE,IAAI,CAAC9F,UAAU,CAACuE,qBAAqB,CAAC5D,IAAI,CAAC,IAAI,CAACX,UAAU,CAAC;gBAChFyF,YAAY,EAAE,IAAI,CAACA,YAAY,CAAC9E,IAAI,CAAC,IAAI,EAAE+E,QAAQ,CAAC;gBACpDvC,eAAe,EAAE,IAAI,CAACA,eAAe,CAACxC,IAAI,CAAC,IAAI,EAAE;oBAAEwB,QAAQ,EAAE,WAAW;iBAAE,CAAC;aAC5E,CAAC,CAAC;SACJ;QACD,OAAO,IAAI,CAACpC,gBAAgB,CAAC2F,QAAQ,CAAC,CAAC;KACxC;CACF;QAtUqBlG,gBAAgB,GAAhBA,gBAAgB"}
@@ -50,7 +50,8 @@ class UrlCreator {
50
50
  return url.toString();
51
51
  }
52
52
  /** Create a URI for launching in a native dev client. Returns `null` when no `scheme` can be resolved. */ constructDevClientUrl(options) {
53
- const protocol = (options == null ? void 0 : options.scheme) || this.defaults.scheme;
53
+ var ref;
54
+ const protocol = (options == null ? void 0 : options.scheme) || ((ref = this.defaults) == null ? void 0 : ref.scheme);
54
55
  if (!protocol || // Prohibit the use of http(s) in dev client URIs since they'll never be valid.
55
56
  [
56
57
  "http",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/start/server/UrlCreator.ts"],"sourcesContent":["import assert from 'assert';\nimport { URL } from 'url';\n\nimport * as Log from '../../log';\nimport { getIpAddress } from '../../utils/ip';\n\nexport interface CreateURLOptions {\n /** URL scheme to use when opening apps in custom runtimes. */\n scheme?: string | null;\n /** Type of dev server host to use. */\n hostType?: 'localhost' | 'lan' | 'tunnel';\n /** Requested hostname. */\n hostname?: string | null;\n}\n\ninterface UrlComponents {\n port: string;\n hostname: string;\n protocol: string;\n}\nexport class UrlCreator {\n constructor(\n private defaults: CreateURLOptions,\n private bundlerInfo: { port: number; getTunnelUrl?: () => string | null }\n ) {}\n\n /**\n * @returns URL like `http://localhost:19000/_expo/loading?platform=ios`\n */\n public constructLoadingUrl(options: CreateURLOptions, platform: string): string {\n const url = new URL('_expo/loading', this.constructUrl({ scheme: 'http', ...options }));\n url.search = new URLSearchParams({ platform }).toString();\n return url.toString();\n }\n\n /** Create a URI for launching in a native dev client. Returns `null` when no `scheme` can be resolved. */\n public constructDevClientUrl(options?: CreateURLOptions): null | string {\n const protocol = options?.scheme || this.defaults.scheme;\n\n if (\n !protocol ||\n // Prohibit the use of http(s) in dev client URIs since they'll never be valid.\n ['http', 'https'].includes(protocol.toLowerCase())\n ) {\n return null;\n }\n\n const manifestUrl = this.constructUrl({ ...options, scheme: 'http' });\n return `${protocol}://expo-development-client/?url=${encodeURIComponent(manifestUrl)}`;\n }\n\n /** Create a generic URL. */\n public constructUrl(options?: Partial<CreateURLOptions> | null): string {\n const urlComponents = this.getUrlComponents({\n ...this.defaults,\n ...options,\n });\n return joinUrlComponents(urlComponents);\n }\n\n /** Get the URL components from the Ngrok server URL. */\n private getTunnelUrlComponents(options: Pick<CreateURLOptions, 'scheme'>): UrlComponents | null {\n const tunnelUrl = this.bundlerInfo.getTunnelUrl?.();\n if (!tunnelUrl) {\n return null;\n }\n const parsed = new URL(tunnelUrl);\n return {\n port: parsed.port,\n hostname: parsed.hostname,\n protocol: options.scheme ?? 'http',\n };\n }\n\n private getUrlComponents(options: CreateURLOptions): UrlComponents {\n // Proxy comes first.\n const proxyURL = getProxyUrl();\n if (proxyURL) {\n return getUrlComponentsFromProxyUrl(options, proxyURL);\n }\n\n // Ngrok.\n if (options.hostType === 'tunnel') {\n const components = this.getTunnelUrlComponents(options);\n if (components) {\n return components;\n }\n Log.warn('Tunnel URL not found (it might not be ready yet), falling back to LAN URL.');\n } else if (options.hostType === 'localhost' && !options.hostname) {\n options.hostname = 'localhost';\n }\n\n return {\n hostname: getDefaultHostname(options),\n port: this.bundlerInfo.port.toString(),\n protocol: options.scheme ?? 'http',\n };\n }\n}\n\nfunction getUrlComponentsFromProxyUrl(\n options: Pick<CreateURLOptions, 'scheme'>,\n url: string\n): UrlComponents {\n const parsedProxyUrl = new URL(url);\n let protocol = options.scheme ?? 'http';\n if (parsedProxyUrl.protocol === 'https:') {\n if (protocol === 'http') {\n protocol = 'https';\n }\n if (!parsedProxyUrl.port) {\n parsedProxyUrl.port = '443';\n }\n }\n return {\n port: parsedProxyUrl.port,\n hostname: parsedProxyUrl.hostname,\n protocol,\n };\n}\n\nfunction getDefaultHostname(options: Pick<CreateURLOptions, 'hostname'>) {\n // TODO: Drop REACT_NATIVE_PACKAGER_HOSTNAME\n if (process.env.REACT_NATIVE_PACKAGER_HOSTNAME) {\n return process.env.REACT_NATIVE_PACKAGER_HOSTNAME.trim();\n } else if (options.hostname === 'localhost') {\n // Restrict the use of `localhost`\n // TODO: Note why we do this.\n return '127.0.0.1';\n }\n\n return options.hostname || getIpAddress();\n}\n\nfunction joinUrlComponents({ protocol, hostname, port }: Partial<UrlComponents>): string {\n assert(hostname, 'hostname cannot be inferred.');\n // Android HMR breaks without this port 80.\n // This is because Android React Native WebSocket implementation is not spec compliant and fails without a port:\n // `E unknown:ReactNative: java.lang.IllegalArgumentException: Invalid URL port: \"-1\"`\n // Invoked first in `metro-runtime/src/modules/HMRClient.js`\n const validPort = port || '80';\n const validProtocol = protocol ? `${protocol}://` : '';\n\n return `${validProtocol}${hostname}:${validPort}`;\n}\n\n/** @deprecated */\nfunction getProxyUrl(): string | undefined {\n return process.env.EXPO_PACKAGER_PROXY_URL;\n}\n\n// TODO: Drop the undocumented env variables:\n// REACT_NATIVE_PACKAGER_HOSTNAME\n// EXPO_PACKAGER_PROXY_URL\n"],"names":["Log","UrlCreator","constructor","defaults","bundlerInfo","constructLoadingUrl","options","platform","url","URL","constructUrl","scheme","search","URLSearchParams","toString","constructDevClientUrl","protocol","includes","toLowerCase","manifestUrl","encodeURIComponent","urlComponents","getUrlComponents","joinUrlComponents","getTunnelUrlComponents","tunnelUrl","getTunnelUrl","parsed","port","hostname","proxyURL","getProxyUrl","getUrlComponentsFromProxyUrl","hostType","components","warn","getDefaultHostname","parsedProxyUrl","process","env","REACT_NATIVE_PACKAGER_HOSTNAME","trim","getIpAddress","assert","validPort","validProtocol","EXPO_PACKAGER_PROXY_URL"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/start/server/UrlCreator.ts"],"sourcesContent":["import assert from 'assert';\nimport { URL } from 'url';\n\nimport * as Log from '../../log';\nimport { getIpAddress } from '../../utils/ip';\n\nexport interface CreateURLOptions {\n /** URL scheme to use when opening apps in custom runtimes. */\n scheme?: string | null;\n /** Type of dev server host to use. */\n hostType?: 'localhost' | 'lan' | 'tunnel';\n /** Requested hostname. */\n hostname?: string | null;\n}\n\ninterface UrlComponents {\n port: string;\n hostname: string;\n protocol: string;\n}\nexport class UrlCreator {\n constructor(\n private defaults: CreateURLOptions | undefined,\n private bundlerInfo: { port: number; getTunnelUrl?: () => string | null }\n ) {}\n\n /**\n * @returns URL like `http://localhost:19000/_expo/loading?platform=ios`\n */\n public constructLoadingUrl(options: CreateURLOptions, platform: string): string {\n const url = new URL('_expo/loading', this.constructUrl({ scheme: 'http', ...options }));\n url.search = new URLSearchParams({ platform }).toString();\n return url.toString();\n }\n\n /** Create a URI for launching in a native dev client. Returns `null` when no `scheme` can be resolved. */\n public constructDevClientUrl(options?: CreateURLOptions): null | string {\n const protocol = options?.scheme || this.defaults?.scheme;\n\n if (\n !protocol ||\n // Prohibit the use of http(s) in dev client URIs since they'll never be valid.\n ['http', 'https'].includes(protocol.toLowerCase())\n ) {\n return null;\n }\n\n const manifestUrl = this.constructUrl({ ...options, scheme: 'http' });\n return `${protocol}://expo-development-client/?url=${encodeURIComponent(manifestUrl)}`;\n }\n\n /** Create a generic URL. */\n public constructUrl(options?: Partial<CreateURLOptions> | null): string {\n const urlComponents = this.getUrlComponents({\n ...this.defaults,\n ...options,\n });\n return joinUrlComponents(urlComponents);\n }\n\n /** Get the URL components from the Ngrok server URL. */\n private getTunnelUrlComponents(options: Pick<CreateURLOptions, 'scheme'>): UrlComponents | null {\n const tunnelUrl = this.bundlerInfo.getTunnelUrl?.();\n if (!tunnelUrl) {\n return null;\n }\n const parsed = new URL(tunnelUrl);\n return {\n port: parsed.port,\n hostname: parsed.hostname,\n protocol: options.scheme ?? 'http',\n };\n }\n\n private getUrlComponents(options: CreateURLOptions): UrlComponents {\n // Proxy comes first.\n const proxyURL = getProxyUrl();\n if (proxyURL) {\n return getUrlComponentsFromProxyUrl(options, proxyURL);\n }\n\n // Ngrok.\n if (options.hostType === 'tunnel') {\n const components = this.getTunnelUrlComponents(options);\n if (components) {\n return components;\n }\n Log.warn('Tunnel URL not found (it might not be ready yet), falling back to LAN URL.');\n } else if (options.hostType === 'localhost' && !options.hostname) {\n options.hostname = 'localhost';\n }\n\n return {\n hostname: getDefaultHostname(options),\n port: this.bundlerInfo.port.toString(),\n protocol: options.scheme ?? 'http',\n };\n }\n}\n\nfunction getUrlComponentsFromProxyUrl(\n options: Pick<CreateURLOptions, 'scheme'>,\n url: string\n): UrlComponents {\n const parsedProxyUrl = new URL(url);\n let protocol = options.scheme ?? 'http';\n if (parsedProxyUrl.protocol === 'https:') {\n if (protocol === 'http') {\n protocol = 'https';\n }\n if (!parsedProxyUrl.port) {\n parsedProxyUrl.port = '443';\n }\n }\n return {\n port: parsedProxyUrl.port,\n hostname: parsedProxyUrl.hostname,\n protocol,\n };\n}\n\nfunction getDefaultHostname(options: Pick<CreateURLOptions, 'hostname'>) {\n // TODO: Drop REACT_NATIVE_PACKAGER_HOSTNAME\n if (process.env.REACT_NATIVE_PACKAGER_HOSTNAME) {\n return process.env.REACT_NATIVE_PACKAGER_HOSTNAME.trim();\n } else if (options.hostname === 'localhost') {\n // Restrict the use of `localhost`\n // TODO: Note why we do this.\n return '127.0.0.1';\n }\n\n return options.hostname || getIpAddress();\n}\n\nfunction joinUrlComponents({ protocol, hostname, port }: Partial<UrlComponents>): string {\n assert(hostname, 'hostname cannot be inferred.');\n // Android HMR breaks without this port 80.\n // This is because Android React Native WebSocket implementation is not spec compliant and fails without a port:\n // `E unknown:ReactNative: java.lang.IllegalArgumentException: Invalid URL port: \"-1\"`\n // Invoked first in `metro-runtime/src/modules/HMRClient.js`\n const validPort = port || '80';\n const validProtocol = protocol ? `${protocol}://` : '';\n\n return `${validProtocol}${hostname}:${validPort}`;\n}\n\n/** @deprecated */\nfunction getProxyUrl(): string | undefined {\n return process.env.EXPO_PACKAGER_PROXY_URL;\n}\n\n// TODO: Drop the undocumented env variables:\n// REACT_NATIVE_PACKAGER_HOSTNAME\n// EXPO_PACKAGER_PROXY_URL\n"],"names":["Log","UrlCreator","constructor","defaults","bundlerInfo","constructLoadingUrl","options","platform","url","URL","constructUrl","scheme","search","URLSearchParams","toString","constructDevClientUrl","protocol","includes","toLowerCase","manifestUrl","encodeURIComponent","urlComponents","getUrlComponents","joinUrlComponents","getTunnelUrlComponents","tunnelUrl","getTunnelUrl","parsed","port","hostname","proxyURL","getProxyUrl","getUrlComponentsFromProxyUrl","hostType","components","warn","getDefaultHostname","parsedProxyUrl","process","env","REACT_NATIVE_PACKAGER_HOSTNAME","trim","getIpAddress","assert","validPort","validProtocol","EXPO_PACKAGER_PROXY_URL"],"mappings":"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"}
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  var _devServer = require("@expo/dev-server");
6
6
  var _port = require("../../../utils/port");
7
7
  var _bundlerDevServer = require("../BundlerDevServer");
8
- var _urlCreator = require("../UrlCreator");
9
8
  var _interstitialPageMiddleware = require("../middleware/InterstitialPageMiddleware");
10
9
  var _runtimeRedirectMiddleware = require("../middleware/RuntimeRedirectMiddleware");
11
10
  var _instantiateMetro = require("./instantiateMetro");
@@ -15,18 +14,18 @@ class MetroBundlerDevServer extends _bundlerDevServer.BundlerDevServer {
15
14
  get name() {
16
15
  return "metro";
17
16
  }
18
- async startAsync(options) {
19
- await this.stopAsync();
17
+ async resolvePortAsync(options = {}) {
20
18
  var // If the manually defined port is busy then an error should be thrown...
21
19
  _port1;
22
20
  const port = (_port1 = options.port) != null ? _port1 : // Otherwise use the default port based on the runtime target.
23
21
  (options.devClient ? Number(process.env.RCT_METRO_PORT) || DEV_CLIENT_METRO_PORT : await (0, _port).getFreePortAsync(EXPO_GO_METRO_PORT));
24
- this.urlCreator = new _urlCreator.UrlCreator(options.location, {
25
- port,
26
- getTunnelUrl: this.getTunnelUrl.bind(this)
27
- });
22
+ return port;
23
+ }
24
+ async startImplementationAsync(options) {
25
+ options.port = await this.resolvePortAsync(options);
26
+ this.urlCreator = this.getUrlCreator(options);
28
27
  const parsedOptions = {
29
- port,
28
+ port: options.port,
30
29
  maxWorkers: options.maxWorkers,
31
30
  resetCache: options.resetDevServer,
32
31
  // Use the unversioned metro config.
@@ -70,22 +69,20 @@ class MetroBundlerDevServer extends _bundlerDevServer.BundlerDevServer {
70
69
  callback == null ? void 0 : callback(err);
71
70
  });
72
71
  };
73
- this.setInstance({
72
+ return {
74
73
  server,
75
74
  location: {
76
75
  // The port is the main thing we want to send back.
77
- port,
76
+ port: options.port,
78
77
  // localhost isn't always correct.
79
78
  host: "localhost",
80
79
  // http is the only supported protocol on native.
81
- url: `http://localhost:${port}`,
80
+ url: `http://localhost:${options.port}`,
82
81
  protocol: "http"
83
82
  },
84
83
  middleware,
85
84
  messageSocket
86
- });
87
- await this.postStartAsync(options);
88
- return this.instance;
85
+ };
89
86
  }
90
87
  getConfigModuleIds() {
91
88
  return [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/metro/MetroBundlerDevServer.ts"],"sourcesContent":["import { prependMiddleware } from '@expo/dev-server';\n\nimport { getFreePortAsync } from '../../../utils/port';\nimport { BundlerDevServer, BundlerStartOptions, DevServerInstance } from '../BundlerDevServer';\nimport { UrlCreator } from '../UrlCreator';\nimport { InterstitialPageMiddleware } from '../middleware/InterstitialPageMiddleware';\nimport { RuntimeRedirectMiddleware } from '../middleware/RuntimeRedirectMiddleware';\nimport { instantiateMetroAsync } from './instantiateMetro';\n\n/** Default port to use for apps running in Expo Go. */\nconst EXPO_GO_METRO_PORT = 19000;\n\n/** Default port to use for apps that run in standard React Native projects or Expo Dev Clients. */\nconst DEV_CLIENT_METRO_PORT = 8081;\n\nexport class MetroBundlerDevServer extends BundlerDevServer {\n get name(): string {\n return 'metro';\n }\n\n async startAsync(options: BundlerStartOptions): Promise<DevServerInstance> {\n await this.stopAsync();\n const port =\n // If the manually defined port is busy then an error should be thrown...\n options.port ??\n // Otherwise use the default port based on the runtime target.\n (options.devClient\n ? // Don't check if the port is busy if we're using the dev client since most clients are hardcoded to 8081.\n Number(process.env.RCT_METRO_PORT) || DEV_CLIENT_METRO_PORT\n : // Otherwise (running in Expo Go) use a free port that falls back on the classic 19000 port.\n await getFreePortAsync(EXPO_GO_METRO_PORT));\n\n this.urlCreator = new UrlCreator(options.location, {\n port,\n getTunnelUrl: this.getTunnelUrl.bind(this),\n });\n\n const parsedOptions = {\n port,\n maxWorkers: options.maxWorkers,\n resetCache: options.resetDevServer,\n\n // Use the unversioned metro config.\n // TODO: Deprecate this property when expo-cli goes away.\n unversioned: false,\n };\n\n const { server, middleware, messageSocket } = await instantiateMetroAsync(\n this.projectRoot,\n parsedOptions\n );\n\n const manifestMiddleware = await this.getManifestMiddlewareAsync(options);\n\n // We need the manifest handler to be the first middleware to run so our\n // routes take precedence over static files. For example, the manifest is\n // served from '/' and if the user has an index.html file in their project\n // then the manifest handler will never run, the static middleware will run\n // and serve index.html instead of the manifest.\n // https://github.com/expo/expo/issues/13114\n prependMiddleware(middleware, manifestMiddleware);\n\n middleware.use(new InterstitialPageMiddleware(this.projectRoot).getHandler());\n\n const deepLinkMiddleware = new RuntimeRedirectMiddleware(this.projectRoot, {\n onDeepLink: ({ runtime }) => {\n // eslint-disable-next-line no-useless-return\n if (runtime === 'expo') return;\n // TODO: Some heavy analytics...\n },\n getLocation: ({ runtime }) => {\n if (runtime === 'custom') {\n return this.urlCreator?.constructDevClientUrl();\n } else {\n return this.urlCreator?.constructUrl({\n scheme: 'exp',\n });\n }\n },\n });\n middleware.use(deepLinkMiddleware.getHandler());\n\n // Extend the close method to ensure that we clean up the local info.\n const originalClose = server.close.bind(server);\n\n server.close = (callback?: (err?: Error) => void) => {\n return originalClose((err?: Error) => {\n this.instance = null;\n callback?.(err);\n });\n };\n\n this.setInstance({\n server,\n location: {\n // The port is the main thing we want to send back.\n port,\n // localhost isn't always correct.\n host: 'localhost',\n // http is the only supported protocol on native.\n url: `http://localhost:${port}`,\n protocol: 'http',\n },\n middleware,\n messageSocket,\n });\n\n await this.postStartAsync(options);\n\n return this.instance!;\n }\n\n protected getConfigModuleIds(): string[] {\n return ['./metro.config.js', './metro.config.json', './rn-cli.config.js'];\n }\n}\n"],"names":["EXPO_GO_METRO_PORT","DEV_CLIENT_METRO_PORT","MetroBundlerDevServer","BundlerDevServer","name","startAsync","options","stopAsync","port","devClient","Number","process","env","RCT_METRO_PORT","getFreePortAsync","urlCreator","UrlCreator","location","getTunnelUrl","bind","parsedOptions","maxWorkers","resetCache","resetDevServer","unversioned","server","middleware","messageSocket","instantiateMetroAsync","projectRoot","manifestMiddleware","getManifestMiddlewareAsync","prependMiddleware","use","InterstitialPageMiddleware","getHandler","deepLinkMiddleware","RuntimeRedirectMiddleware","onDeepLink","runtime","getLocation","constructDevClientUrl","constructUrl","scheme","originalClose","close","callback","err","instance","setInstance","host","url","protocol","postStartAsync","getConfigModuleIds"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/server/metro/MetroBundlerDevServer.ts"],"sourcesContent":["import { prependMiddleware } from '@expo/dev-server';\n\nimport { getFreePortAsync } from '../../../utils/port';\nimport { BundlerDevServer, BundlerStartOptions, DevServerInstance } from '../BundlerDevServer';\nimport { InterstitialPageMiddleware } from '../middleware/InterstitialPageMiddleware';\nimport { RuntimeRedirectMiddleware } from '../middleware/RuntimeRedirectMiddleware';\nimport { instantiateMetroAsync } from './instantiateMetro';\n\n/** Default port to use for apps running in Expo Go. */\nconst EXPO_GO_METRO_PORT = 19000;\n\n/** Default port to use for apps that run in standard React Native projects or Expo Dev Clients. */\nconst DEV_CLIENT_METRO_PORT = 8081;\n\nexport class MetroBundlerDevServer extends BundlerDevServer {\n get name(): string {\n return 'metro';\n }\n\n async resolvePortAsync(options: Partial<BundlerStartOptions> = {}): Promise<number> {\n const port =\n // If the manually defined port is busy then an error should be thrown...\n options.port ??\n // Otherwise use the default port based on the runtime target.\n (options.devClient\n ? // Don't check if the port is busy if we're using the dev client since most clients are hardcoded to 8081.\n Number(process.env.RCT_METRO_PORT) || DEV_CLIENT_METRO_PORT\n : // Otherwise (running in Expo Go) use a free port that falls back on the classic 19000 port.\n await getFreePortAsync(EXPO_GO_METRO_PORT));\n\n return port;\n }\n\n protected async startImplementationAsync(\n options: BundlerStartOptions\n ): Promise<DevServerInstance> {\n options.port = await this.resolvePortAsync(options);\n this.urlCreator = this.getUrlCreator(options);\n\n const parsedOptions = {\n port: options.port,\n maxWorkers: options.maxWorkers,\n resetCache: options.resetDevServer,\n\n // Use the unversioned metro config.\n // TODO: Deprecate this property when expo-cli goes away.\n unversioned: false,\n };\n\n const { server, middleware, messageSocket } = await instantiateMetroAsync(\n this.projectRoot,\n parsedOptions\n );\n\n const manifestMiddleware = await this.getManifestMiddlewareAsync(options);\n\n // We need the manifest handler to be the first middleware to run so our\n // routes take precedence over static files. For example, the manifest is\n // served from '/' and if the user has an index.html file in their project\n // then the manifest handler will never run, the static middleware will run\n // and serve index.html instead of the manifest.\n // https://github.com/expo/expo/issues/13114\n prependMiddleware(middleware, manifestMiddleware);\n\n middleware.use(new InterstitialPageMiddleware(this.projectRoot).getHandler());\n\n const deepLinkMiddleware = new RuntimeRedirectMiddleware(this.projectRoot, {\n onDeepLink: ({ runtime }) => {\n // eslint-disable-next-line no-useless-return\n if (runtime === 'expo') return;\n // TODO: Some heavy analytics...\n },\n getLocation: ({ runtime }) => {\n if (runtime === 'custom') {\n return this.urlCreator?.constructDevClientUrl();\n } else {\n return this.urlCreator?.constructUrl({\n scheme: 'exp',\n });\n }\n },\n });\n middleware.use(deepLinkMiddleware.getHandler());\n\n // Extend the close method to ensure that we clean up the local info.\n const originalClose = server.close.bind(server);\n\n server.close = (callback?: (err?: Error) => void) => {\n return originalClose((err?: Error) => {\n this.instance = null;\n callback?.(err);\n });\n };\n\n return {\n server,\n location: {\n // The port is the main thing we want to send back.\n port: options.port,\n // localhost isn't always correct.\n host: 'localhost',\n // http is the only supported protocol on native.\n url: `http://localhost:${options.port}`,\n protocol: 'http',\n },\n middleware,\n messageSocket,\n };\n }\n\n protected getConfigModuleIds(): string[] {\n return ['./metro.config.js', './metro.config.json', './rn-cli.config.js'];\n }\n}\n"],"names":["EXPO_GO_METRO_PORT","DEV_CLIENT_METRO_PORT","MetroBundlerDevServer","BundlerDevServer","name","resolvePortAsync","options","port","devClient","Number","process","env","RCT_METRO_PORT","getFreePortAsync","startImplementationAsync","urlCreator","getUrlCreator","parsedOptions","maxWorkers","resetCache","resetDevServer","unversioned","server","middleware","messageSocket","instantiateMetroAsync","projectRoot","manifestMiddleware","getManifestMiddlewareAsync","prependMiddleware","use","InterstitialPageMiddleware","getHandler","deepLinkMiddleware","RuntimeRedirectMiddleware","onDeepLink","runtime","getLocation","constructDevClientUrl","constructUrl","scheme","originalClose","close","bind","callback","err","instance","location","host","url","protocol","getConfigModuleIds"],"mappings":"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"}
@@ -25,7 +25,8 @@ async function instantiateMetroAsync(projectRoot, options) {
25
25
  reporter,
26
26
  ...options
27
27
  });
28
- const { middleware , attachToServer } = (0, _createDevServerMiddleware).createDevServerMiddleware({
28
+ const { middleware , attachToServer , // New
29
+ websocketEndpoints , eventsSocketEndpoint , messageSocketEndpoint , } = (0, _createDevServerMiddleware).createDevServerMiddleware(projectRoot, {
29
30
  port: metroConfig.server.port,
30
31
  watchFolders: metroConfig.watchFolders
31
32
  });
@@ -39,15 +40,27 @@ async function instantiateMetroAsync(projectRoot, options) {
39
40
  };
40
41
  const server1 = await Metro.runServer(metroConfig, {
41
42
  // @ts-expect-error: TODO: Update the types.
42
- hmrEnabled: true
43
+ hmrEnabled: true,
44
+ websocketEndpoints
43
45
  });
44
- const { messageSocket , eventsSocket } = attachToServer(server1);
45
- reportEvent = eventsSocket.reportEvent;
46
- return {
47
- server: server1,
48
- middleware,
49
- messageSocket
50
- };
46
+ if (attachToServer) {
47
+ // Expo SDK 44 and lower
48
+ const { messageSocket , eventsSocket } = attachToServer(server1);
49
+ reportEvent = eventsSocket.reportEvent;
50
+ return {
51
+ server: server1,
52
+ middleware,
53
+ messageSocket
54
+ };
55
+ } else {
56
+ // RN +68 -- Expo SDK +45
57
+ reportEvent = eventsSocketEndpoint.reportEvent;
58
+ return {
59
+ server: server1,
60
+ middleware,
61
+ messageSocket: messageSocketEndpoint
62
+ };
63
+ }
51
64
  }
52
65
 
53
66
  //# sourceMappingURL=instantiateMetro.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { MetroDevServerOptions } from '@expo/dev-server';\nimport http from 'http';\nimport Metro from 'metro';\nimport { Terminal } from 'metro-core';\n\nimport { createDevServerMiddleware } from '../middleware/createDevServerMiddleware';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { importExpoMetroConfigFromProject, importMetroFromProject } from './resolveFromProject';\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\n/** The most generic possible setup for Metro bundler. */\nexport async function instantiateMetroAsync(\n projectRoot: string,\n options: Omit<MetroDevServerOptions, 'logger'>\n): Promise<{\n server: http.Server;\n middleware: any;\n messageSocket: MessageSocket;\n}> {\n let reportEvent: ((event: any) => void) | undefined;\n\n const Metro = importMetroFromProject(projectRoot);\n const ExpoMetroConfig = importExpoMetroConfigFromProject(projectRoot);\n\n const terminal = new Terminal(process.stdout);\n const terminalReporter = new MetroTerminalReporter(projectRoot, terminal);\n\n const reporter = {\n update(event: any) {\n terminalReporter.update(event);\n if (reportEvent) {\n reportEvent(event);\n }\n },\n };\n\n const metroConfig = await ExpoMetroConfig.loadAsync(projectRoot, { reporter, ...options });\n\n const { middleware, attachToServer } = createDevServerMiddleware({\n port: metroConfig.server.port,\n watchFolders: metroConfig.watchFolders,\n });\n\n const customEnhanceMiddleware = metroConfig.server.enhanceMiddleware;\n // @ts-ignore 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 const server = await Metro.runServer(metroConfig, {\n // @ts-expect-error: TODO: Update the types.\n hmrEnabled: true,\n });\n\n const { messageSocket, eventsSocket } = attachToServer(server);\n reportEvent = eventsSocket.reportEvent;\n\n return {\n server,\n middleware,\n messageSocket,\n };\n}\n"],"names":["instantiateMetroAsync","projectRoot","options","reportEvent","Metro","importMetroFromProject","ExpoMetroConfig","importExpoMetroConfigFromProject","terminal","Terminal","process","stdout","terminalReporter","MetroTerminalReporter","reporter","update","event","metroConfig","loadAsync","middleware","attachToServer","createDevServerMiddleware","port","server","watchFolders","customEnhanceMiddleware","enhanceMiddleware","metroMiddleware","use","runServer","hmrEnabled","messageSocket","eventsSocket"],"mappings":"AAAA;;;;QAesBA,qBAAqB,GAArBA,qBAAqB;AAZlB,IAAA,UAAY,WAAZ,YAAY,CAAA;AAEK,IAAA,0BAAyC,WAAzC,yCAAyC,CAAA;AAC7C,IAAA,sBAAyB,WAAzB,yBAAyB,CAAA;AACU,IAAA,mBAAsB,WAAtB,sBAAsB,CAAA;AAQxF,eAAeA,qBAAqB,CACzCC,WAAmB,EACnBC,OAA8C,EAK7C;IACD,IAAIC,WAAW,AAAoC,AAAC;IAEpD,MAAMC,KAAK,GAAGC,CAAAA,GAAAA,mBAAsB,AAAa,CAAA,uBAAb,CAACJ,WAAW,CAAC,AAAC;IAClD,MAAMK,eAAe,GAAGC,CAAAA,GAAAA,mBAAgC,AAAa,CAAA,iCAAb,CAACN,WAAW,CAAC,AAAC;IAEtE,MAAMO,QAAQ,GAAG,IAAIC,UAAQ,SAAA,CAACC,OAAO,CAACC,MAAM,CAAC,AAAC;IAC9C,MAAMC,gBAAgB,GAAG,IAAIC,sBAAqB,sBAAA,CAACZ,WAAW,EAAEO,QAAQ,CAAC,AAAC;IAE1E,MAAMM,QAAQ,GAAG;QACfC,MAAM,EAACC,KAAU,EAAE;YACjBJ,gBAAgB,CAACG,MAAM,CAACC,KAAK,CAAC,CAAC;YAC/B,IAAIb,WAAW,EAAE;gBACfA,WAAW,CAACa,KAAK,CAAC,CAAC;aACpB;SACF;KACF,AAAC;IAEF,MAAMC,WAAW,GAAG,MAAMX,eAAe,CAACY,SAAS,CAACjB,WAAW,EAAE;QAAEa,QAAQ;QAAE,GAAGZ,OAAO;KAAE,CAAC,AAAC;IAE3F,MAAM,EAAEiB,UAAU,CAAA,EAAEC,cAAc,CAAA,EAAE,GAAGC,CAAAA,GAAAA,0BAAyB,AAG9D,CAAA,0BAH8D,CAAC;QAC/DC,IAAI,EAAEL,WAAW,CAACM,MAAM,CAACD,IAAI;QAC7BE,YAAY,EAAEP,WAAW,CAACO,YAAY;KACvC,CAAC,AAAC;IAEH,MAAMC,uBAAuB,GAAGR,WAAW,CAACM,MAAM,CAACG,iBAAiB,AAAC;IACrE,0CAA0C;IAC1CT,WAAW,CAACM,MAAM,CAACG,iBAAiB,GAAG,CAACC,eAAoB,EAAEJ,MAAoB,GAAK;QACrF,IAAIE,uBAAuB,EAAE;YAC3BE,eAAe,GAAGF,uBAAuB,CAACE,eAAe,EAAEJ,MAAM,CAAC,CAAC;SACpE;QACD,OAAOJ,UAAU,CAACS,GAAG,CAACD,eAAe,CAAC,CAAC;KACxC,CAAC;IAEF,MAAMJ,OAAM,GAAG,MAAMnB,KAAK,CAACyB,SAAS,CAACZ,WAAW,EAAE;QAChD,4CAA4C;QAC5Ca,UAAU,EAAE,IAAI;KACjB,CAAC,AAAC;IAEH,MAAM,EAAEC,aAAa,CAAA,EAAEC,YAAY,CAAA,EAAE,GAAGZ,cAAc,CAACG,OAAM,CAAC,AAAC;IAC/DpB,WAAW,GAAG6B,YAAY,CAAC7B,WAAW,CAAC;IAEvC,OAAO;QACLoB,MAAM,EAANA,OAAM;QACNJ,UAAU;QACVY,aAAa;KACd,CAAC;CACH"}
1
+ {"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { MetroDevServerOptions } from '@expo/dev-server';\nimport http from 'http';\nimport Metro from 'metro';\nimport { Terminal } from 'metro-core';\n\nimport { createDevServerMiddleware } from '../middleware/createDevServerMiddleware';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { importExpoMetroConfigFromProject, importMetroFromProject } from './resolveFromProject';\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\n/** The most generic possible setup for Metro bundler. */\nexport async function instantiateMetroAsync(\n projectRoot: string,\n options: Omit<MetroDevServerOptions, 'logger'>\n): Promise<{\n server: http.Server;\n middleware: any;\n messageSocket: MessageSocket;\n}> {\n let reportEvent: ((event: any) => void) | undefined;\n\n const Metro = importMetroFromProject(projectRoot);\n const ExpoMetroConfig = importExpoMetroConfigFromProject(projectRoot);\n\n const terminal = new Terminal(process.stdout);\n const terminalReporter = new MetroTerminalReporter(projectRoot, terminal);\n\n const reporter = {\n update(event: any) {\n terminalReporter.update(event);\n if (reportEvent) {\n reportEvent(event);\n }\n },\n };\n\n const metroConfig = await ExpoMetroConfig.loadAsync(projectRoot, { reporter, ...options });\n\n const {\n middleware,\n attachToServer,\n\n // New\n websocketEndpoints,\n eventsSocketEndpoint,\n messageSocketEndpoint,\n } = createDevServerMiddleware(projectRoot, {\n port: metroConfig.server.port,\n watchFolders: metroConfig.watchFolders,\n });\n\n const customEnhanceMiddleware = metroConfig.server.enhanceMiddleware;\n // @ts-ignore 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 const server = await Metro.runServer(metroConfig, {\n // @ts-expect-error: TODO: Update the types.\n hmrEnabled: true,\n websocketEndpoints,\n });\n\n if (attachToServer) {\n // Expo SDK 44 and lower\n const { messageSocket, eventsSocket } = attachToServer(server);\n reportEvent = eventsSocket.reportEvent;\n\n return {\n server,\n middleware,\n messageSocket,\n };\n } else {\n // RN +68 -- Expo SDK +45\n reportEvent = eventsSocketEndpoint.reportEvent;\n\n return {\n server,\n middleware,\n messageSocket: messageSocketEndpoint,\n };\n }\n}\n"],"names":["instantiateMetroAsync","projectRoot","options","reportEvent","Metro","importMetroFromProject","ExpoMetroConfig","importExpoMetroConfigFromProject","terminal","Terminal","process","stdout","terminalReporter","MetroTerminalReporter","reporter","update","event","metroConfig","loadAsync","middleware","attachToServer","websocketEndpoints","eventsSocketEndpoint","messageSocketEndpoint","createDevServerMiddleware","port","server","watchFolders","customEnhanceMiddleware","enhanceMiddleware","metroMiddleware","use","runServer","hmrEnabled","messageSocket","eventsSocket"],"mappings":"AAAA;;;;QAesBA,qBAAqB,GAArBA,qBAAqB;AAZlB,IAAA,UAAY,WAAZ,YAAY,CAAA;AAEK,IAAA,0BAAyC,WAAzC,yCAAyC,CAAA;AAC7C,IAAA,sBAAyB,WAAzB,yBAAyB,CAAA;AACU,IAAA,mBAAsB,WAAtB,sBAAsB,CAAA;AAQxF,eAAeA,qBAAqB,CACzCC,WAAmB,EACnBC,OAA8C,EAK7C;IACD,IAAIC,WAAW,AAAoC,AAAC;IAEpD,MAAMC,KAAK,GAAGC,CAAAA,GAAAA,mBAAsB,AAAa,CAAA,uBAAb,CAACJ,WAAW,CAAC,AAAC;IAClD,MAAMK,eAAe,GAAGC,CAAAA,GAAAA,mBAAgC,AAAa,CAAA,iCAAb,CAACN,WAAW,CAAC,AAAC;IAEtE,MAAMO,QAAQ,GAAG,IAAIC,UAAQ,SAAA,CAACC,OAAO,CAACC,MAAM,CAAC,AAAC;IAC9C,MAAMC,gBAAgB,GAAG,IAAIC,sBAAqB,sBAAA,CAACZ,WAAW,EAAEO,QAAQ,CAAC,AAAC;IAE1E,MAAMM,QAAQ,GAAG;QACfC,MAAM,EAACC,KAAU,EAAE;YACjBJ,gBAAgB,CAACG,MAAM,CAACC,KAAK,CAAC,CAAC;YAC/B,IAAIb,WAAW,EAAE;gBACfA,WAAW,CAACa,KAAK,CAAC,CAAC;aACpB;SACF;KACF,AAAC;IAEF,MAAMC,WAAW,GAAG,MAAMX,eAAe,CAACY,SAAS,CAACjB,WAAW,EAAE;QAAEa,QAAQ;QAAE,GAAGZ,OAAO;KAAE,CAAC,AAAC;IAE3F,MAAM,EACJiB,UAAU,CAAA,EACVC,cAAc,CAAA,EAEd,MAAM;IACNC,kBAAkB,CAAA,EAClBC,oBAAoB,CAAA,EACpBC,qBAAqB,CAAA,IACtB,GAAGC,CAAAA,GAAAA,0BAAyB,AAG3B,CAAA,0BAH2B,CAACvB,WAAW,EAAE;QACzCwB,IAAI,EAAER,WAAW,CAACS,MAAM,CAACD,IAAI;QAC7BE,YAAY,EAAEV,WAAW,CAACU,YAAY;KACvC,CAAC,AAAC;IAEH,MAAMC,uBAAuB,GAAGX,WAAW,CAACS,MAAM,CAACG,iBAAiB,AAAC;IACrE,0CAA0C;IAC1CZ,WAAW,CAACS,MAAM,CAACG,iBAAiB,GAAG,CAACC,eAAoB,EAAEJ,MAAoB,GAAK;QACrF,IAAIE,uBAAuB,EAAE;YAC3BE,eAAe,GAAGF,uBAAuB,CAACE,eAAe,EAAEJ,MAAM,CAAC,CAAC;SACpE;QACD,OAAOP,UAAU,CAACY,GAAG,CAACD,eAAe,CAAC,CAAC;KACxC,CAAC;IAEF,MAAMJ,OAAM,GAAG,MAAMtB,KAAK,CAAC4B,SAAS,CAACf,WAAW,EAAE;QAChD,4CAA4C;QAC5CgB,UAAU,EAAE,IAAI;QAChBZ,kBAAkB;KACnB,CAAC,AAAC;IAEH,IAAID,cAAc,EAAE;QAClB,wBAAwB;QACxB,MAAM,EAAEc,aAAa,CAAA,EAAEC,YAAY,CAAA,EAAE,GAAGf,cAAc,CAACM,OAAM,CAAC,AAAC;QAC/DvB,WAAW,GAAGgC,YAAY,CAAChC,WAAW,CAAC;QAEvC,OAAO;YACLuB,MAAM,EAANA,OAAM;YACNP,UAAU;YACVe,aAAa;SACd,CAAC;KACH,MAAM;QACL,yBAAyB;QACzB/B,WAAW,GAAGmB,oBAAoB,CAACnB,WAAW,CAAC;QAE/C,OAAO;YACLuB,MAAM,EAANA,OAAM;YACNP,UAAU;YACVe,aAAa,EAAEX,qBAAqB;SACrC,CAAC;KACH;CACF"}
@@ -128,7 +128,7 @@ async function createHostInfoAsync() {
128
128
  host: await _userSettings.default.getAnonymousIdentifierAsync(),
129
129
  server: "expo",
130
130
  // Defined in the build step
131
- serverVersion: "0.1.0",
131
+ serverVersion: "0.1.3",
132
132
  serverDriver: _manifestMiddleware.DEVELOPER_TOOL,
133
133
  serverOS: _os.default.platform(),
134
134
  serverOSVersion: _os.default.release()
@@ -4,9 +4,9 @@ Object.defineProperty(exports, "__esModule", {
4
4
  });
5
5
  exports.createDevServerMiddleware = createDevServerMiddleware;
6
6
  var _devServer = require("@expo/dev-server");
7
- function createDevServerMiddleware({ watchFolders , port }) {
7
+ function createDevServerMiddleware(projectRoot, { watchFolders , port }) {
8
8
  const shim = function() {};
9
- return (0, _devServer).createDevServerMiddleware({
9
+ return (0, _devServer).createDevServerMiddleware(projectRoot, {
10
10
  // Attach a fake logger to the expo `/logs` middleware so we can collect devices for analytics.
11
11
  // We utilize the WebSocket logs now so we don't need to print anything.
12
12
  // TODO: Migrate to a system that uses WebSockets so we can detect when a device disconnects.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/middleware/createDevServerMiddleware.ts"],"sourcesContent":["import { createDevServerMiddleware as originalCreate } from '@expo/dev-server';\n\nexport function createDevServerMiddleware({\n watchFolders,\n port,\n}: {\n watchFolders: readonly string[];\n port: number;\n}) {\n const shim = function () {};\n\n return originalCreate({\n // Attach a fake logger to the expo `/logs` middleware so we can collect devices for analytics.\n // We utilize the WebSocket logs now so we don't need to print anything.\n // TODO: Migrate to a system that uses WebSockets so we can detect when a device disconnects.\n logger: {\n info: shim,\n warn: shim,\n error: shim,\n debug: shim,\n } as any,\n port,\n watchFolders,\n });\n}\n"],"names":["createDevServerMiddleware","watchFolders","port","shim","originalCreate","logger","info","warn","error","debug"],"mappings":"AAAA;;;;QAEgBA,yBAAyB,GAAzBA,yBAAyB;AAFmB,IAAA,UAAkB,WAAlB,kBAAkB,CAAA;AAEvE,SAASA,yBAAyB,CAAC,EACxCC,YAAY,CAAA,EACZC,IAAI,CAAA,EAIL,EAAE;IACD,MAAMC,IAAI,GAAG,WAAY,EAAE,AAAC;IAE5B,OAAOC,CAAAA,GAAAA,UAAc,AAYnB,CAAA,0BAZmB,CAAC;QACpB,+FAA+F;QAC/F,wEAAwE;QACxE,6FAA6F;QAC7FC,MAAM,EAAE;YACNC,IAAI,EAAEH,IAAI;YACVI,IAAI,EAAEJ,IAAI;YACVK,KAAK,EAAEL,IAAI;YACXM,KAAK,EAAEN,IAAI;SACZ;QACDD,IAAI;QACJD,YAAY;KACb,CAAC,CAAC;CACJ"}
1
+ {"version":3,"sources":["../../../../../src/start/server/middleware/createDevServerMiddleware.ts"],"sourcesContent":["import { createDevServerMiddleware as originalCreate } from '@expo/dev-server';\n\nexport function createDevServerMiddleware(\n projectRoot: string,\n {\n watchFolders,\n port,\n }: {\n watchFolders: readonly string[];\n port: number;\n }\n) {\n const shim = function () {};\n\n return originalCreate(projectRoot, {\n // Attach a fake logger to the expo `/logs` middleware so we can collect devices for analytics.\n // We utilize the WebSocket logs now so we don't need to print anything.\n // TODO: Migrate to a system that uses WebSockets so we can detect when a device disconnects.\n logger: {\n info: shim,\n warn: shim,\n error: shim,\n debug: shim,\n } as any,\n port,\n watchFolders,\n });\n}\n"],"names":["createDevServerMiddleware","projectRoot","watchFolders","port","shim","originalCreate","logger","info","warn","error","debug"],"mappings":"AAAA;;;;QAEgBA,yBAAyB,GAAzBA,yBAAyB;AAFmB,IAAA,UAAkB,WAAlB,kBAAkB,CAAA;AAEvE,SAASA,yBAAyB,CACvCC,WAAmB,EACnB,EACEC,YAAY,CAAA,EACZC,IAAI,CAAA,EAIL,EACD;IACA,MAAMC,IAAI,GAAG,WAAY,EAAE,AAAC;IAE5B,OAAOC,CAAAA,GAAAA,UAAc,AAYnB,CAAA,0BAZmB,CAACJ,WAAW,EAAE;QACjC,+FAA+F;QAC/F,wEAAwE;QACxE,6FAA6F;QAC7FK,MAAM,EAAE;YACNC,IAAI,EAAEH,IAAI;YACVI,IAAI,EAAEJ,IAAI;YACVK,KAAK,EAAEL,IAAI;YACXM,KAAK,EAAEN,IAAI;SACZ;QACDD,IAAI;QACJD,YAAY;KACb,CAAC,CAAC;CACJ"}