@expo/cli 0.3.2 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -10
- package/build/bin/cli +2 -2
- package/build/src/api/graphql/client.js +3 -1
- package/build/src/api/graphql/client.js.map +1 -1
- package/build/src/api/rest/client.js +5 -2
- package/build/src/api/rest/client.js.map +1 -1
- package/build/src/api/rest/wrapFetchWithProxy.js +25 -0
- package/build/src/api/rest/wrapFetchWithProxy.js.map +1 -0
- package/build/src/export/createMetadataJson.js.map +1 -1
- package/build/src/export/exportApp.js +16 -1
- package/build/src/export/exportApp.js.map +1 -1
- package/build/src/export/exportAssets.js.map +1 -1
- package/build/src/export/fork-bundleAsync.js +2 -1
- package/build/src/export/fork-bundleAsync.js.map +1 -1
- package/build/src/export/printBundleSizes.js +1 -1
- package/build/src/export/printBundleSizes.js.map +1 -1
- package/build/src/export/writeContents.js +7 -2
- package/build/src/export/writeContents.js.map +1 -1
- package/build/src/install/resolveOptions.js +6 -2
- package/build/src/install/resolveOptions.js.map +1 -1
- package/build/src/prebuild/copyTemplateFiles.js +6 -33
- package/build/src/prebuild/copyTemplateFiles.js.map +1 -1
- package/build/src/prebuild/resolveTemplate.js +2 -2
- package/build/src/prebuild/resolveTemplate.js.map +1 -1
- package/build/src/prebuild/updateFromTemplate.js +1 -3
- package/build/src/prebuild/updateFromTemplate.js.map +1 -1
- package/build/src/prebuild/updatePackageJson.js +3 -46
- package/build/src/prebuild/updatePackageJson.js.map +1 -1
- package/build/src/run/ios/XcodeBuild.js +2 -1
- package/build/src/run/ios/XcodeBuild.js.map +1 -1
- package/build/src/run/ios/codeSigning/simulatorCodeSigning.js +45 -0
- package/build/src/run/ios/codeSigning/simulatorCodeSigning.js.map +1 -0
- package/build/src/start/doctor/ngrok/NgrokResolver.js +5 -0
- package/build/src/start/doctor/ngrok/NgrokResolver.js.map +1 -1
- package/build/src/start/platforms/PlatformManager.js +6 -1
- package/build/src/start/platforms/PlatformManager.js.map +1 -1
- package/build/src/start/platforms/android/adbReverse.js +10 -0
- package/build/src/start/platforms/android/adbReverse.js.map +1 -1
- package/build/src/start/resolveOptions.js +1 -1
- package/build/src/start/resolveOptions.js.map +1 -1
- package/build/src/start/server/AsyncNgrok.js +58 -14
- package/build/src/start/server/AsyncNgrok.js.map +1 -1
- package/build/src/start/server/BundlerDevServer.js +4 -1
- package/build/src/start/server/BundlerDevServer.js.map +1 -1
- package/build/src/start/server/metro/MetroBundlerDevServer.js +20 -5
- package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
- package/build/src/start/server/metro/instantiateMetro.js +1 -6
- package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
- package/build/src/start/server/metro/withMetroMultiPlatform.js +36 -5
- package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
- package/build/src/start/server/middleware/ClassicManifestMiddleware.js +4 -2
- package/build/src/start/server/middleware/ClassicManifestMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +7 -3
- package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/RuntimeRedirectMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/resolveEntryPoint.js +2 -1
- package/build/src/start/server/middleware/resolveEntryPoint.js.map +1 -1
- package/build/src/start/server/middleware/resolvePlatform.js +3 -2
- package/build/src/start/server/middleware/resolvePlatform.js.map +1 -1
- package/build/src/start/server/webpack/WebpackBundlerDevServer.js +2 -8
- package/build/src/start/server/webpack/WebpackBundlerDevServer.js.map +1 -1
- package/build/src/utils/analytics/rudderstackClient.js +2 -2
- package/build/src/utils/codesigning.js +3 -0
- package/build/src/utils/codesigning.js.map +1 -1
- package/build/src/utils/downloadAppAsync.js +1 -2
- package/build/src/utils/downloadAppAsync.js.map +1 -1
- package/build/src/utils/env.js +37 -1
- package/build/src/utils/env.js.map +1 -1
- package/build/src/utils/npm.js +4 -11
- package/build/src/utils/npm.js.map +1 -1
- package/build/src/utils/url.js +2 -2
- package/build/src/utils/url.js.map +1 -1
- package/build/src/utils/validateApplicationId.js +3 -3
- package/build/src/utils/validateApplicationId.js.map +1 -1
- package/build/src/utils/variadic.js +18 -0
- package/build/src/utils/variadic.js.map +1 -1
- package/package.json +5 -4
|
@@ -264,9 +264,12 @@ class BundlerDevServer {
|
|
|
264
264
|
}
|
|
265
265
|
/** Open the dev server in a runtime. */ async openPlatformAsync(launchTarget, resolver = {}) {
|
|
266
266
|
if (launchTarget === "desktop") {
|
|
267
|
-
const
|
|
267
|
+
const serverUrl = this.getDevServerUrl({
|
|
268
268
|
hostType: "localhost"
|
|
269
269
|
});
|
|
270
|
+
var ref;
|
|
271
|
+
// Allow opening the tunnel URL when using Metro web.
|
|
272
|
+
const url = this.name === "metro" ? (ref = this.getTunnelUrl()) != null ? ref : serverUrl : serverUrl;
|
|
270
273
|
await (0, _betterOpn).default(url);
|
|
271
274
|
return {
|
|
272
275
|
url
|
|
@@ -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 {\n BaseOpenInCustomProps,\n BaseResolveDeviceProps,\n PlatformManager,\n} from '../platforms/PlatformManager';\nimport { AsyncNgrok } from './AsyncNgrok';\nimport { DevelopmentSession } from './DevelopmentSession';\nimport { CreateURLOptions, UrlCreator } from './UrlCreator';\nimport { PlatformBundlers } from './platformBundlers';\n\nconst debug = require('debug')('expo:start:server:devServer') as typeof console.log;\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 /** A mapping of bundlers to platforms. */\n public platformBundlers: PlatformBundlers,\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 /**\n * Runs after the `startAsync` function, performing any additional common operations.\n * You can assume the dev server is started by the time this function is called.\n */\n protected async postStartAsync(options: BundlerStartOptions) {\n if (\n options.location.hostType === 'tunnel' &&\n !APISettings.isOffline &&\n // This is a hack to prevent using tunnel on web since we block it upstream for some reason.\n this.isTargetingNative()\n ) {\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 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 // TODO: This appears to be happening consistently after an hour.\n // We should investigate why this is happening and fix it on our servers.\n // Log.error(\n // chalk.red(\n // '\\nAn unexpected error occurred while updating the Dev Session API. This project will not appear in the \"Development servers\" section of the Expo Go app until this process has been restarted.'\n // )\n // );\n // Log.exception(error);\n this.devSession?.closeAsync().catch((error) => {\n debug('[dev-session] error closing: ' + error.message);\n });\n }\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 this.platformBundlers.web === this.name;\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 debug(`Stopping dev server (bundler: ${this.name})`);\n\n if (this.instance?.server) {\n this.instance.server.close((error) => {\n 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 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 /** Get the URL for opening in Expo Go. */\n protected getExpoGoUrl(): string {\n return this.getUrlCreator().constructUrl({ scheme: 'exp' });\n }\n\n /** Should use the interstitial page for selecting which runtime to use. */\n protected isRedirectPageEnabled(): boolean {\n return (\n !env.EXPO_NO_REDIRECT_PAGE &&\n // if user passed --dev-client flag, skip interstitial page\n !this.isDevClient &&\n // Checks if dev client is installed.\n !!resolveFrom.silent(this.projectRoot, 'expo-dev-client')\n );\n }\n\n /** Get the redirect URL when redirecting is enabled. */\n public getRedirectUrl(platform: keyof typeof PLATFORM_MANAGERS | null = null): string | null {\n if (!this.isRedirectPageEnabled()) {\n debug('Redirect page is disabled');\n return null;\n }\n\n return (\n this.getUrlCreator().constructLoadingUrl(\n {},\n platform === 'emulator' ? 'android' : platform === 'simulator' ? 'ios' : null\n ) ?? null\n );\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 debug(`Creating platform manager (platform: ${platform}, port: ${port})`);\n this.platformManagers[platform] = new Manager(this.projectRoot, port, {\n getCustomRuntimeUrl: this.urlCreator.constructDevClientUrl.bind(this.urlCreator),\n getExpoGoUrl: this.getExpoGoUrl.bind(this),\n getRedirectUrl: this.getRedirectUrl.bind(this, platform),\n getDevServerUrl: this.getDevServerUrl.bind(this, { hostType: 'localhost' }),\n });\n }\n return this.platformManagers[platform];\n }\n}\n"],"names":["Log","debug","require","PLATFORM_MANAGERS","simulator","ApplePlatformManager","emulator","AndroidPlatformManager","MIDDLEWARES","classic","ClassicManifestMiddleware","ExpoGoManifestHandlerMiddleware","BundlerDevServer","constructor","projectRoot","platformBundlers","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","AsyncNgrok","stopNotifying","DevelopmentSession","getNativeRuntimeUrl","getDevServerUrl","closeAsync","catch","error","message","runtime","isTargetingWeb","web","broadcastMessage","method","params","e","exception","resolveWithTimeout","Promise","resolve","reject","timeout","errorMessage","UrlCreator","getTunnelUrl","opts","constructDevClientUrl","scheme","getActiveUrl","openPlatformAsync","launchTarget","resolver","openBrowserAsync","manager","getPlatformManagerAsync","openAsync","openCustomRuntimeAsync","launchProps","props","getExpoGoUrl","isRedirectPageEnabled","env","EXPO_NO_REDIRECT_PAGE","resolveFrom","silent","getRedirectUrl","platform","constructLoadingUrl","Manager","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';\nimport { PlatformBundlers } from './platformBundlers';\n\nconst debug = require('debug')('expo:start:server:devServer') as typeof console.log;\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 /** A mapping of bundlers to platforms. */\n public platformBundlers: PlatformBundlers,\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 /**\n * Runs after the `startAsync` function, performing any additional common operations.\n * You can assume the dev server is started by the time this function is called.\n */\n protected async postStartAsync(options: BundlerStartOptions) {\n if (\n options.location.hostType === 'tunnel' &&\n !APISettings.isOffline &&\n // This is a hack to prevent using tunnel on web since we block it upstream for some reason.\n this.isTargetingNative()\n ) {\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 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 // TODO: This appears to be happening consistently after an hour.\n // We should investigate why this is happening and fix it on our servers.\n // Log.error(\n // chalk.red(\n // '\\nAn unexpected error occurred while updating the Dev Session API. This project will not appear in the \"Development servers\" section of the Expo Go app until this process has been restarted.'\n // )\n // );\n // Log.exception(error);\n this.devSession?.closeAsync().catch((error) => {\n debug('[dev-session] error closing: ' + error.message);\n });\n }\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 this.platformBundlers.web === this.name;\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 debug(`Stopping dev server (bundler: ${this.name})`);\n\n if (this.instance?.server) {\n this.instance.server.close((error) => {\n 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 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 serverUrl = this.getDevServerUrl({ hostType: 'localhost' });\n // Allow opening the tunnel URL when using Metro web.\n const url = this.name === 'metro' ? this.getTunnelUrl() ?? serverUrl : serverUrl;\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 /** Get the URL for opening in Expo Go. */\n protected getExpoGoUrl(): string {\n return this.getUrlCreator().constructUrl({ scheme: 'exp' });\n }\n\n /** Should use the interstitial page for selecting which runtime to use. */\n protected isRedirectPageEnabled(): boolean {\n return (\n !env.EXPO_NO_REDIRECT_PAGE &&\n // if user passed --dev-client flag, skip interstitial page\n !this.isDevClient &&\n // Checks if dev client is installed.\n !!resolveFrom.silent(this.projectRoot, 'expo-dev-client')\n );\n }\n\n /** Get the redirect URL when redirecting is enabled. */\n public getRedirectUrl(platform: keyof typeof PLATFORM_MANAGERS | null = null): string | null {\n if (!this.isRedirectPageEnabled()) {\n debug('Redirect page is disabled');\n return null;\n }\n\n return (\n this.getUrlCreator().constructLoadingUrl(\n {},\n platform === 'emulator' ? 'android' : platform === 'simulator' ? 'ios' : null\n ) ?? null\n );\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 debug(`Creating platform manager (platform: ${platform}, port: ${port})`);\n this.platformManagers[platform] = new Manager(this.projectRoot, port, {\n getCustomRuntimeUrl: this.urlCreator.constructDevClientUrl.bind(this.urlCreator),\n getExpoGoUrl: this.getExpoGoUrl.bind(this),\n getRedirectUrl: this.getRedirectUrl.bind(this, platform),\n getDevServerUrl: this.getDevServerUrl.bind(this, { hostType: 'localhost' }),\n });\n }\n return this.platformManagers[platform];\n }\n}\n"],"names":["Log","debug","require","PLATFORM_MANAGERS","simulator","ApplePlatformManager","emulator","AndroidPlatformManager","MIDDLEWARES","classic","ClassicManifestMiddleware","ExpoGoManifestHandlerMiddleware","BundlerDevServer","constructor","projectRoot","platformBundlers","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","AsyncNgrok","stopNotifying","DevelopmentSession","getNativeRuntimeUrl","getDevServerUrl","closeAsync","catch","error","message","runtime","isTargetingWeb","web","broadcastMessage","method","params","e","exception","resolveWithTimeout","Promise","resolve","reject","timeout","errorMessage","UrlCreator","getTunnelUrl","opts","constructDevClientUrl","scheme","getActiveUrl","openPlatformAsync","launchTarget","resolver","serverUrl","openBrowserAsync","manager","getPlatformManagerAsync","openAsync","openCustomRuntimeAsync","launchProps","props","getExpoGoUrl","isRedirectPageEnabled","env","EXPO_NO_REDIRECT_PAGE","resolveFrom","silent","getRedirectUrl","platform","constructLoadingUrl","Manager","getCustomRuntimeUrl"],"mappings":"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"}
|
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
+
exports.getDeepLinkHandler = getDeepLinkHandler;
|
|
6
|
+
var _config = require("@expo/config");
|
|
5
7
|
var _devServer = require("@expo/dev-server");
|
|
8
|
+
var _getDevClientProperties = _interopRequireDefault(require("../../../utils/analytics/getDevClientProperties"));
|
|
9
|
+
var _rudderstackClient = require("../../../utils/analytics/rudderstackClient");
|
|
6
10
|
var _port = require("../../../utils/port");
|
|
7
11
|
var _bundlerDevServer = require("../BundlerDevServer");
|
|
8
12
|
var _createFileMiddleware = require("../middleware/CreateFileMiddleware");
|
|
@@ -11,6 +15,11 @@ var _interstitialPageMiddleware = require("../middleware/InterstitialPageMiddlew
|
|
|
11
15
|
var _runtimeRedirectMiddleware = require("../middleware/RuntimeRedirectMiddleware");
|
|
12
16
|
var _serveStaticMiddleware = require("../middleware/ServeStaticMiddleware");
|
|
13
17
|
var _instantiateMetro = require("./instantiateMetro");
|
|
18
|
+
function _interopRequireDefault(obj) {
|
|
19
|
+
return obj && obj.__esModule ? obj : {
|
|
20
|
+
default: obj
|
|
21
|
+
};
|
|
22
|
+
}
|
|
14
23
|
/** Default port to use for apps running in Expo Go. */ const EXPO_GO_METRO_PORT = 19000;
|
|
15
24
|
/** Default port to use for apps that run in standard React Native projects or Expo Dev Clients. */ const DEV_CLIENT_METRO_PORT = 8081;
|
|
16
25
|
class MetroBundlerDevServer extends _bundlerDevServer.BundlerDevServer {
|
|
@@ -50,11 +59,7 @@ class MetroBundlerDevServer extends _bundlerDevServer.BundlerDevServer {
|
|
|
50
59
|
scheme: (_scheme = options.location.scheme) != null ? _scheme : null
|
|
51
60
|
}).getHandler());
|
|
52
61
|
const deepLinkMiddleware = new _runtimeRedirectMiddleware.RuntimeRedirectMiddleware(this.projectRoot, {
|
|
53
|
-
onDeepLink: (
|
|
54
|
-
// eslint-disable-next-line no-useless-return
|
|
55
|
-
if (runtime === "expo") return;
|
|
56
|
-
// TODO: Some heavy analytics...
|
|
57
|
-
},
|
|
62
|
+
onDeepLink: getDeepLinkHandler(this.projectRoot),
|
|
58
63
|
getLocation: ({ runtime })=>{
|
|
59
64
|
if (runtime === "custom") {
|
|
60
65
|
var ref;
|
|
@@ -108,5 +113,15 @@ class MetroBundlerDevServer extends _bundlerDevServer.BundlerDevServer {
|
|
|
108
113
|
}
|
|
109
114
|
}
|
|
110
115
|
exports.MetroBundlerDevServer = MetroBundlerDevServer;
|
|
116
|
+
function getDeepLinkHandler(projectRoot) {
|
|
117
|
+
return async ({ runtime })=>{
|
|
118
|
+
if (runtime === "expo") return;
|
|
119
|
+
const { exp } = (0, _config).getConfig(projectRoot);
|
|
120
|
+
await (0, _rudderstackClient).logEventAsync("dev client start command", {
|
|
121
|
+
status: "started",
|
|
122
|
+
...(0, _getDevClientProperties).default(projectRoot, exp)
|
|
123
|
+
});
|
|
124
|
+
};
|
|
125
|
+
}
|
|
111
126
|
|
|
112
127
|
//# sourceMappingURL=MetroBundlerDevServer.js.map
|
|
@@ -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 { CreateFileMiddleware } from '../middleware/CreateFileMiddleware';\nimport { HistoryFallbackMiddleware } from '../middleware/HistoryFallbackMiddleware';\nimport { InterstitialPageMiddleware } from '../middleware/InterstitialPageMiddleware';\nimport { RuntimeRedirectMiddleware } from '../middleware/RuntimeRedirectMiddleware';\nimport { ServeStaticMiddleware } from '../middleware/ServeStaticMiddleware';\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(\n new InterstitialPageMiddleware(this.projectRoot, {\n // TODO: Prevent this from becoming stale.\n scheme: options.location.scheme ?? null,\n }).getHandler()\n );\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 middleware.use(new CreateFileMiddleware(this.projectRoot).getHandler());\n\n // Append support for redirecting unhandled requests to the index.html page on web.\n if (this.isTargetingWeb()) {\n // This MUST be after the manifest middleware so it doesn't have a chance to serve the template `public/index.html`.\n middleware.use(new ServeStaticMiddleware(this.projectRoot).getHandler());\n\n // This MUST run last since it's the fallback.\n middleware.use(new HistoryFallbackMiddleware(manifestMiddleware.internal).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","scheme","location","getHandler","deepLinkMiddleware","RuntimeRedirectMiddleware","onDeepLink","runtime","getLocation","constructDevClientUrl","constructUrl","CreateFileMiddleware","isTargetingWeb","ServeStaticMiddleware","HistoryFallbackMiddleware","internal","originalClose","close","bind","callback","err","instance","host","url","protocol","getConfigModuleIds"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/MetroBundlerDevServer.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport { prependMiddleware } from '@expo/dev-server';\n\nimport getDevClientProperties from '../../../utils/analytics/getDevClientProperties';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport { getFreePortAsync } from '../../../utils/port';\nimport { BundlerDevServer, BundlerStartOptions, DevServerInstance } from '../BundlerDevServer';\nimport { CreateFileMiddleware } from '../middleware/CreateFileMiddleware';\nimport { HistoryFallbackMiddleware } from '../middleware/HistoryFallbackMiddleware';\nimport { InterstitialPageMiddleware } from '../middleware/InterstitialPageMiddleware';\nimport {\n DeepLinkHandler,\n RuntimeRedirectMiddleware,\n} from '../middleware/RuntimeRedirectMiddleware';\nimport { ServeStaticMiddleware } from '../middleware/ServeStaticMiddleware';\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(\n new InterstitialPageMiddleware(this.projectRoot, {\n // TODO: Prevent this from becoming stale.\n scheme: options.location.scheme ?? null,\n }).getHandler()\n );\n\n const deepLinkMiddleware = new RuntimeRedirectMiddleware(this.projectRoot, {\n onDeepLink: getDeepLinkHandler(this.projectRoot),\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 middleware.use(new CreateFileMiddleware(this.projectRoot).getHandler());\n\n // Append support for redirecting unhandled requests to the index.html page on web.\n if (this.isTargetingWeb()) {\n // This MUST be after the manifest middleware so it doesn't have a chance to serve the template `public/index.html`.\n middleware.use(new ServeStaticMiddleware(this.projectRoot).getHandler());\n\n // This MUST run last since it's the fallback.\n middleware.use(new HistoryFallbackMiddleware(manifestMiddleware.internal).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\nexport function getDeepLinkHandler(projectRoot: string): DeepLinkHandler {\n return async ({ runtime }) => {\n if (runtime === 'expo') return;\n const { exp } = getConfig(projectRoot);\n await logEventAsync('dev client start command', {\n status: 'started',\n ...getDevClientProperties(projectRoot, exp),\n });\n };\n}\n"],"names":["getDeepLinkHandler","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","scheme","location","getHandler","deepLinkMiddleware","RuntimeRedirectMiddleware","onDeepLink","getLocation","runtime","constructDevClientUrl","constructUrl","CreateFileMiddleware","isTargetingWeb","ServeStaticMiddleware","HistoryFallbackMiddleware","internal","originalClose","close","bind","callback","err","instance","host","url","protocol","getConfigModuleIds","exp","getConfig","logEventAsync","status","getDevClientProperties"],"mappings":"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"}
|
|
@@ -9,7 +9,6 @@ var _createDevServerMiddleware = require("../middleware/createDevServerMiddlewar
|
|
|
9
9
|
var _platformBundlers = require("../platformBundlers");
|
|
10
10
|
var _metroTerminalReporter = require("./MetroTerminalReporter");
|
|
11
11
|
var _resolveFromProject = require("./resolveFromProject");
|
|
12
|
-
var _router = require("./router");
|
|
13
12
|
var _withMetroMultiPlatform = require("./withMetroMultiPlatform");
|
|
14
13
|
async function instantiateMetroAsync(projectRoot, options) {
|
|
15
14
|
let reportEvent;
|
|
@@ -35,11 +34,7 @@ async function instantiateMetroAsync(projectRoot, options) {
|
|
|
35
34
|
skipPlugins: true
|
|
36
35
|
});
|
|
37
36
|
const platformBundlers = (0, _platformBundlers).getPlatformBundlers(exp);
|
|
38
|
-
metroConfig = (0, _withMetroMultiPlatform).
|
|
39
|
-
// Auto pick App entry: this is injected with Babel.
|
|
40
|
-
process.env.EXPO_ROUTER_APP_ROOT = (0, _router).getAppRouterRelativeEntryPath(projectRoot);
|
|
41
|
-
var _EXPO_PROJECT_ROOT;
|
|
42
|
-
process.env.EXPO_PROJECT_ROOT = (_EXPO_PROJECT_ROOT = process.env.EXPO_PROJECT_ROOT) != null ? _EXPO_PROJECT_ROOT : projectRoot;
|
|
37
|
+
metroConfig = await (0, _withMetroMultiPlatform).withMetroMultiPlatformAsync(projectRoot, metroConfig, platformBundlers);
|
|
43
38
|
const { middleware , attachToServer , // New
|
|
44
39
|
websocketEndpoints , eventsSocketEndpoint , messageSocketEndpoint , } = (0, _createDevServerMiddleware).createDevServerMiddleware(projectRoot, {
|
|
45
40
|
port: metroConfig.server.port,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport { 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 { getPlatformBundlers } from '../platformBundlers';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { importExpoMetroConfigFromProject, importMetroFromProject } from './resolveFromProject';\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport { 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 { getPlatformBundlers } from '../platformBundlers';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { importExpoMetroConfigFromProject, importMetroFromProject } from './resolveFromProject';\nimport { withMetroMultiPlatformAsync } from './withMetroMultiPlatform';\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 let metroConfig = await ExpoMetroConfig.loadAsync(projectRoot, { reporter, ...options });\n\n // TODO: When we bring expo/metro-config into the expo/expo repo, then we can upstream this.\n const { exp } = getConfig(projectRoot, {\n skipSDKVersionRequirement: true,\n skipPlugins: true,\n });\n const platformBundlers = getPlatformBundlers(exp);\n metroConfig = await withMetroMultiPlatformAsync(projectRoot, metroConfig, platformBundlers);\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 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","exp","getConfig","skipSDKVersionRequirement","skipPlugins","platformBundlers","getPlatformBundlers","withMetroMultiPlatformAsync","middleware","attachToServer","websocketEndpoints","eventsSocketEndpoint","messageSocketEndpoint","createDevServerMiddleware","port","server","watchFolders","customEnhanceMiddleware","enhanceMiddleware","metroMiddleware","use","runServer","hmrEnabled","messageSocket","eventsSocket"],"mappings":"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"}
|
|
@@ -3,11 +3,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
5
|
exports.withWebResolvers = withWebResolvers;
|
|
6
|
-
exports.
|
|
6
|
+
exports.withMetroMultiPlatformAsync = withMetroMultiPlatformAsync;
|
|
7
7
|
var _fs = _interopRequireDefault(require("fs"));
|
|
8
8
|
var _path = _interopRequireDefault(require("path"));
|
|
9
9
|
var _resolveFrom = _interopRequireDefault(require("resolve-from"));
|
|
10
|
+
var _env = require("../../../utils/env");
|
|
11
|
+
var _webSupportProjectPrerequisite = require("../../doctor/web/WebSupportProjectPrerequisite");
|
|
10
12
|
var _resolveFromProject = require("./resolveFromProject");
|
|
13
|
+
var _router = require("./router");
|
|
11
14
|
function _interopRequireDefault(obj) {
|
|
12
15
|
return obj && obj.__esModule ? obj : {
|
|
13
16
|
default: obj
|
|
@@ -69,6 +72,16 @@ function withWebResolvers(config, projectRoot) {
|
|
|
69
72
|
"react-native": _path.default.resolve(require.resolve("react-native-web/package.json"), "..")
|
|
70
73
|
}
|
|
71
74
|
};
|
|
75
|
+
const preferredMainFields = {
|
|
76
|
+
// Defaults from Expo Webpack. Most packages using `react-native` don't support web
|
|
77
|
+
// in the `react-native` field, so we should prefer the `browser` field.
|
|
78
|
+
// https://github.com/expo/router/issues/37
|
|
79
|
+
web: [
|
|
80
|
+
"browser",
|
|
81
|
+
"module",
|
|
82
|
+
"main"
|
|
83
|
+
]
|
|
84
|
+
};
|
|
72
85
|
return withCustomResolvers(config, projectRoot, [
|
|
73
86
|
// Add a resolver to alias the web asset resolver.
|
|
74
87
|
(immutableContext, moduleName, platform)=>{
|
|
@@ -79,10 +92,19 @@ function withWebResolvers(config, projectRoot) {
|
|
|
79
92
|
if (platform && platform in extraNodeModules) {
|
|
80
93
|
context.extraNodeModules = extraNodeModules[platform];
|
|
81
94
|
}
|
|
95
|
+
const mainFields = _env.env.EXPO_METRO_NO_MAIN_FIELD_OVERRIDE ? context.mainFields : platform && platform in preferredMainFields ? preferredMainFields[platform] : context.mainFields;
|
|
82
96
|
const result = resolve({
|
|
83
97
|
...context,
|
|
84
98
|
preferNativePlatform: platform !== "web",
|
|
85
|
-
resolveRequest: undefined
|
|
99
|
+
resolveRequest: undefined,
|
|
100
|
+
// Passing `mainFields` directly won't be considered
|
|
101
|
+
// we need to extend the `getPackageMainPath` directly to
|
|
102
|
+
// use platform specific `mainFields`.
|
|
103
|
+
getPackageMainPath (packageJsonPath) {
|
|
104
|
+
// @ts-expect-error: mainFields is not on type
|
|
105
|
+
const package_ = context.moduleCache.getPackage(packageJsonPath);
|
|
106
|
+
return package_.getMain(mainFields);
|
|
107
|
+
}
|
|
86
108
|
}, moduleName, platform);
|
|
87
109
|
// Replace the web resolver with the original one.
|
|
88
110
|
// This is basically an alias for web-only.
|
|
@@ -94,11 +116,20 @@ function withWebResolvers(config, projectRoot) {
|
|
|
94
116
|
},
|
|
95
117
|
]);
|
|
96
118
|
}
|
|
97
|
-
function
|
|
98
|
-
//
|
|
99
|
-
|
|
119
|
+
async function withMetroMultiPlatformAsync(projectRoot, config, platformBundlers) {
|
|
120
|
+
// Auto pick App entry: this is injected with Babel.
|
|
121
|
+
process.env.EXPO_ROUTER_APP_ROOT = (0, _router).getAppRouterRelativeEntryPath(projectRoot);
|
|
122
|
+
var _EXPO_PROJECT_ROOT;
|
|
123
|
+
process.env.EXPO_PROJECT_ROOT = (_EXPO_PROJECT_ROOT = process.env.EXPO_PROJECT_ROOT) != null ? _EXPO_PROJECT_ROOT : projectRoot;
|
|
124
|
+
if (platformBundlers.web === "metro") {
|
|
125
|
+
await new _webSupportProjectPrerequisite.WebSupportProjectPrerequisite(projectRoot).assertAsync();
|
|
126
|
+
} else {
|
|
127
|
+
// Bail out early for performance enhancements if web is not enabled.
|
|
100
128
|
return config;
|
|
101
129
|
}
|
|
130
|
+
return withMetroMultiPlatform(projectRoot, config, platformBundlers);
|
|
131
|
+
}
|
|
132
|
+
function withMetroMultiPlatform(projectRoot, config, platformBundlers) {
|
|
102
133
|
let expoConfigPlatforms = Object.entries(platformBundlers).filter(([, bundler])=>bundler === "metro"
|
|
103
134
|
).map(([platform])=>platform
|
|
104
135
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/withMetroMultiPlatform.ts"],"sourcesContent":["/**\n * Copyright © 2022 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport fs from 'fs';\nimport { ConfigT } from 'metro-config';\nimport { ResolutionContext } from 'metro-resolver';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { PlatformBundlers } from '../platformBundlers';\nimport { importMetroResolverFromProject } from './resolveFromProject';\n\nfunction withWebPolyfills(config: ConfigT): ConfigT {\n const originalGetPolyfills = config.serializer.getPolyfills\n ? config.serializer.getPolyfills.bind(config.serializer)\n : () => [];\n\n const getPolyfills = (ctx: { platform: string | null | undefined }): readonly string[] => {\n if (ctx.platform === 'web') {\n return [\n // TODO: runtime polyfills, i.e. Fast Refresh, error overlay, React Dev Tools...\n ];\n }\n // Generally uses `rn-get-polyfills`\n return originalGetPolyfills(ctx);\n };\n\n return {\n ...config,\n serializer: {\n ...config.serializer,\n getPolyfills,\n },\n };\n}\n\nfunction getDefaultResolveRequest(projectRoot: string) {\n const { resolve } = importMetroResolverFromProject(projectRoot);\n return (context: ResolutionContext, moduleName: string, platform: string | null) => {\n return resolve(context, moduleName, platform);\n };\n}\n\nexport type ExpoCustomMetroResolver = (\n ...args: Parameters<import('metro-resolver').CustomResolver>\n) => import('metro-resolver').Resolution | null;\n\n/** Extend the `resolver.resolveRequest` method with custom methods that can exit early by returning a `Resolution`. */\nfunction withCustomResolvers(\n config: ConfigT,\n projectRoot: string,\n resolvers: ExpoCustomMetroResolver[]\n): ConfigT {\n const originalResolveRequest =\n config.resolver.resolveRequest || getDefaultResolveRequest(projectRoot);\n\n return {\n ...config,\n resolver: {\n ...config.resolver,\n resolveRequest(...args: Parameters<import('metro-resolver').CustomResolver>) {\n for (const resolver of resolvers) {\n const resolution = resolver(...args);\n if (resolution) {\n return resolution;\n }\n }\n return originalResolveRequest(...args);\n },\n },\n };\n}\n\n/**\n * Apply custom resolvers to do the following:\n * - Disable `.native.js` extensions on web.\n * - Alias `react-native` to `react-native-web` on web.\n * - Redirect `react-native-web/dist/modules/AssetRegistry/index.js` to `@react-native/assets/registry.js` on web.\n */\nexport function withWebResolvers(config: ConfigT, projectRoot: string) {\n // Get the `transformer.assetRegistryPath`\n // this needs to be unified since you can't dynamically\n // swap out the transformer based on platform.\n const assetRegistryPath = fs.realpathSync(\n // This is the native asset registry alias for native.\n path.resolve(resolveFrom(projectRoot, 'react-native/Libraries/Image/AssetRegistry'))\n // NOTE(EvanBacon): This is the newer import but it doesn't work in the expo/expo monorepo.\n // path.resolve(resolveFrom(projectRoot, '@react-native/assets/registry.js'))\n );\n\n // Create a resolver which dynamically disables support for\n // `*.native.*` extensions on web.\n\n const { resolve } = importMetroResolverFromProject(projectRoot);\n\n const extraNodeModules: { [key: string]: Record<string, string> } = {\n web: {\n 'react-native': path.resolve(require.resolve('react-native-web/package.json'), '..'),\n },\n };\n\n return withCustomResolvers(config, projectRoot, [\n // Add a resolver to alias the web asset resolver.\n (immutableContext: ResolutionContext, moduleName: string, platform: string | null) => {\n const context = { ...immutableContext };\n\n // Conditionally remap `react-native` to `react-native-web`\n if (platform && platform in extraNodeModules) {\n context.extraNodeModules = extraNodeModules[platform];\n }\n\n const result = resolve(\n {\n ...context,\n preferNativePlatform: platform !== 'web',\n resolveRequest: undefined,\n },\n moduleName,\n platform\n );\n\n // Replace the web resolver with the original one.\n // This is basically an alias for web-only.\n if (\n platform === 'web' &&\n result?.type === 'sourceFile' &&\n typeof result?.filePath === 'string' &&\n result.filePath.endsWith('react-native-web/dist/modules/AssetRegistry/index.js')\n ) {\n // @ts-expect-error: `readonly` for some reason.\n result.filePath = assetRegistryPath;\n }\n\n return result;\n },\n ]);\n}\n\n/** Add support for `react-native-web` and the Web platform. */\nexport function withMetroMultiPlatform(\n projectRoot: string,\n config: ConfigT,\n platformBundlers: PlatformBundlers\n) {\n // Bail out early for performance enhancements if web is not enabled.\n if (platformBundlers.web !== 'metro') {\n return config;\n }\n\n let expoConfigPlatforms = Object.entries(platformBundlers)\n .filter(([, bundler]) => bundler === 'metro')\n .map(([platform]) => platform);\n\n if (Array.isArray(config.resolver.platforms)) {\n expoConfigPlatforms = [...new Set(expoConfigPlatforms.concat(config.resolver.platforms))];\n }\n\n // @ts-expect-error: typed as `readonly`.\n config.resolver.platforms = expoConfigPlatforms;\n\n config = withWebPolyfills(config);\n\n return withWebResolvers(config, projectRoot);\n}\n"],"names":["withWebResolvers","withMetroMultiPlatform","withWebPolyfills","config","originalGetPolyfills","serializer","getPolyfills","bind","ctx","platform","getDefaultResolveRequest","projectRoot","resolve","importMetroResolverFromProject","context","moduleName","withCustomResolvers","resolvers","originalResolveRequest","resolver","resolveRequest","args","resolution","assetRegistryPath","fs","realpathSync","path","resolveFrom","extraNodeModules","web","require","immutableContext","result","preferNativePlatform","undefined","type","filePath","endsWith","platformBundlers","expoConfigPlatforms","Object","entries","filter","bundler","map","Array","isArray","platforms","Set","concat"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/withMetroMultiPlatform.ts"],"sourcesContent":["/**\n * Copyright © 2022 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport fs from 'fs';\nimport { ConfigT } from 'metro-config';\nimport { ResolutionContext } from 'metro-resolver';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { env } from '../../../utils/env';\nimport { WebSupportProjectPrerequisite } from '../../doctor/web/WebSupportProjectPrerequisite';\nimport { PlatformBundlers } from '../platformBundlers';\nimport { importMetroResolverFromProject } from './resolveFromProject';\nimport { getAppRouterRelativeEntryPath } from './router';\n\nfunction withWebPolyfills(config: ConfigT): ConfigT {\n const originalGetPolyfills = config.serializer.getPolyfills\n ? config.serializer.getPolyfills.bind(config.serializer)\n : () => [];\n\n const getPolyfills = (ctx: { platform: string | null | undefined }): readonly string[] => {\n if (ctx.platform === 'web') {\n return [\n // TODO: runtime polyfills, i.e. Fast Refresh, error overlay, React Dev Tools...\n ];\n }\n // Generally uses `rn-get-polyfills`\n return originalGetPolyfills(ctx);\n };\n\n return {\n ...config,\n serializer: {\n ...config.serializer,\n getPolyfills,\n },\n };\n}\n\nfunction getDefaultResolveRequest(projectRoot: string) {\n const { resolve } = importMetroResolverFromProject(projectRoot);\n return (context: ResolutionContext, moduleName: string, platform: string | null) => {\n return resolve(context, moduleName, platform);\n };\n}\n\nexport type ExpoCustomMetroResolver = (\n ...args: Parameters<import('metro-resolver').CustomResolver>\n) => import('metro-resolver').Resolution | null;\n\n/** Extend the `resolver.resolveRequest` method with custom methods that can exit early by returning a `Resolution`. */\nfunction withCustomResolvers(\n config: ConfigT,\n projectRoot: string,\n resolvers: ExpoCustomMetroResolver[]\n): ConfigT {\n const originalResolveRequest =\n config.resolver.resolveRequest || getDefaultResolveRequest(projectRoot);\n\n return {\n ...config,\n resolver: {\n ...config.resolver,\n resolveRequest(...args: Parameters<import('metro-resolver').CustomResolver>) {\n for (const resolver of resolvers) {\n const resolution = resolver(...args);\n if (resolution) {\n return resolution;\n }\n }\n return originalResolveRequest(...args);\n },\n },\n };\n}\n\n/**\n * Apply custom resolvers to do the following:\n * - Disable `.native.js` extensions on web.\n * - Alias `react-native` to `react-native-web` on web.\n * - Redirect `react-native-web/dist/modules/AssetRegistry/index.js` to `@react-native/assets/registry.js` on web.\n */\nexport function withWebResolvers(config: ConfigT, projectRoot: string) {\n // Get the `transformer.assetRegistryPath`\n // this needs to be unified since you can't dynamically\n // swap out the transformer based on platform.\n const assetRegistryPath = fs.realpathSync(\n // This is the native asset registry alias for native.\n path.resolve(resolveFrom(projectRoot, 'react-native/Libraries/Image/AssetRegistry'))\n // NOTE(EvanBacon): This is the newer import but it doesn't work in the expo/expo monorepo.\n // path.resolve(resolveFrom(projectRoot, '@react-native/assets/registry.js'))\n );\n\n // Create a resolver which dynamically disables support for\n // `*.native.*` extensions on web.\n\n const { resolve } = importMetroResolverFromProject(projectRoot);\n\n const extraNodeModules: { [key: string]: Record<string, string> } = {\n web: {\n 'react-native': path.resolve(require.resolve('react-native-web/package.json'), '..'),\n },\n };\n\n const preferredMainFields: { [key: string]: string[] } = {\n // Defaults from Expo Webpack. Most packages using `react-native` don't support web\n // in the `react-native` field, so we should prefer the `browser` field.\n // https://github.com/expo/router/issues/37\n web: ['browser', 'module', 'main'],\n };\n\n return withCustomResolvers(config, projectRoot, [\n // Add a resolver to alias the web asset resolver.\n (immutableContext: ResolutionContext, moduleName: string, platform: string | null) => {\n const context = { ...immutableContext } as ResolutionContext & { mainFields: string[] };\n\n // Conditionally remap `react-native` to `react-native-web`\n if (platform && platform in extraNodeModules) {\n context.extraNodeModules = extraNodeModules[platform];\n }\n\n const mainFields = env.EXPO_METRO_NO_MAIN_FIELD_OVERRIDE\n ? context.mainFields\n : platform && platform in preferredMainFields\n ? preferredMainFields[platform]\n : context.mainFields;\n\n const result = resolve(\n {\n ...context,\n preferNativePlatform: platform !== 'web',\n resolveRequest: undefined,\n\n // Passing `mainFields` directly won't be considered\n // we need to extend the `getPackageMainPath` directly to\n // use platform specific `mainFields`.\n getPackageMainPath(packageJsonPath) {\n // @ts-expect-error: mainFields is not on type\n const package_ = context.moduleCache.getPackage(packageJsonPath);\n return package_.getMain(mainFields);\n },\n },\n moduleName,\n platform\n );\n\n // Replace the web resolver with the original one.\n // This is basically an alias for web-only.\n if (\n platform === 'web' &&\n result?.type === 'sourceFile' &&\n typeof result?.filePath === 'string' &&\n result.filePath.endsWith('react-native-web/dist/modules/AssetRegistry/index.js')\n ) {\n // @ts-expect-error: `readonly` for some reason.\n result.filePath = assetRegistryPath;\n }\n\n return result;\n },\n ]);\n}\n\n/** Add support for `react-native-web` and the Web platform. */\nexport async function withMetroMultiPlatformAsync(\n projectRoot: string,\n config: ConfigT,\n platformBundlers: PlatformBundlers\n) {\n // Auto pick App entry: this is injected with Babel.\n process.env.EXPO_ROUTER_APP_ROOT = getAppRouterRelativeEntryPath(projectRoot);\n process.env.EXPO_PROJECT_ROOT = process.env.EXPO_PROJECT_ROOT ?? projectRoot;\n\n if (platformBundlers.web === 'metro') {\n await new WebSupportProjectPrerequisite(projectRoot).assertAsync();\n } else {\n // Bail out early for performance enhancements if web is not enabled.\n return config;\n }\n\n return withMetroMultiPlatform(projectRoot, config, platformBundlers);\n}\n\nfunction withMetroMultiPlatform(\n projectRoot: string,\n config: ConfigT,\n platformBundlers: PlatformBundlers\n) {\n let expoConfigPlatforms = Object.entries(platformBundlers)\n .filter(([, bundler]) => bundler === 'metro')\n .map(([platform]) => platform);\n\n if (Array.isArray(config.resolver.platforms)) {\n expoConfigPlatforms = [...new Set(expoConfigPlatforms.concat(config.resolver.platforms))];\n }\n\n // @ts-expect-error: typed as `readonly`.\n config.resolver.platforms = expoConfigPlatforms;\n\n config = withWebPolyfills(config);\n\n return withWebResolvers(config, projectRoot);\n}\n"],"names":["withWebResolvers","withMetroMultiPlatformAsync","withWebPolyfills","config","originalGetPolyfills","serializer","getPolyfills","bind","ctx","platform","getDefaultResolveRequest","projectRoot","resolve","importMetroResolverFromProject","context","moduleName","withCustomResolvers","resolvers","originalResolveRequest","resolver","resolveRequest","args","resolution","assetRegistryPath","fs","realpathSync","path","resolveFrom","extraNodeModules","web","require","preferredMainFields","immutableContext","mainFields","env","EXPO_METRO_NO_MAIN_FIELD_OVERRIDE","result","preferNativePlatform","undefined","getPackageMainPath","packageJsonPath","package_","moduleCache","getPackage","getMain","type","filePath","endsWith","platformBundlers","process","EXPO_ROUTER_APP_ROOT","getAppRouterRelativeEntryPath","EXPO_PROJECT_ROOT","WebSupportProjectPrerequisite","assertAsync","withMetroMultiPlatform","expoConfigPlatforms","Object","entries","filter","bundler","map","Array","isArray","platforms","Set","concat"],"mappings":"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"}
|
|
@@ -41,6 +41,7 @@ function _interopRequireWildcard(obj) {
|
|
|
41
41
|
return newObj;
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
|
+
const debug = require("debug")("expo:start:server:middleware:ClassicManifestMiddleware");
|
|
44
45
|
class ClassicManifestMiddleware extends _manifestMiddleware.ManifestMiddleware {
|
|
45
46
|
getParsedHeaders(req) {
|
|
46
47
|
const platform = (0, _resolvePlatform).parsePlatformHeader(req) || "ios";
|
|
@@ -99,7 +100,8 @@ class ClassicManifestMiddleware extends _manifestMiddleware.ManifestMiddleware {
|
|
|
99
100
|
try {
|
|
100
101
|
return await this._getManifestStringAsync(props);
|
|
101
102
|
} catch (error) {
|
|
102
|
-
|
|
103
|
+
debug(`Error getting manifest:`, error);
|
|
104
|
+
if (error.code === "UNAUTHORIZED" && props.manifest.owner) {
|
|
103
105
|
// Don't have permissions for siging, warn and enable offline mode.
|
|
104
106
|
this.addSigningDisabledWarning(`This project belongs to ${_chalk.default.bold(`@${props.manifest.owner}`)} and you have not been granted the appropriate permissions.\n` + `Please request access from an admin of @${props.manifest.owner} or change the "owner" field to an account you belong to.\n` + (0, _link).learnMore("https://docs.expo.dev/versions/latest/config/app/#owner"));
|
|
105
107
|
_settings.APISettings.isOffline = true;
|
|
@@ -128,7 +130,7 @@ async function createHostInfoAsync() {
|
|
|
128
130
|
host: await _userSettings.default.getAnonymousIdentifierAsync(),
|
|
129
131
|
server: "expo",
|
|
130
132
|
// Defined in the build step
|
|
131
|
-
serverVersion: "0.
|
|
133
|
+
serverVersion: "0.4.1",
|
|
132
134
|
serverDriver: _manifestMiddleware.DEVELOPER_TOOL,
|
|
133
135
|
serverOS: _os.default.platform(),
|
|
134
136
|
serverOSVersion: _os.default.release()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/middleware/ClassicManifestMiddleware.ts"],"sourcesContent":["import { ExpoAppManifest, ExpoConfig } from '@expo/config';\nimport chalk from 'chalk';\nimport os from 'os';\n\nimport { APISettings } from '../../../api/settings';\nimport { signClassicExpoGoManifestAsync } from '../../../api/signManifest';\nimport UserSettings from '../../../api/user/UserSettings';\nimport { ANONYMOUS_USERNAME, getUserAsync } from '../../../api/user/user';\nimport * as Log from '../../../log';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport { memoize } from '../../../utils/fn';\nimport { learnMore } from '../../../utils/link';\nimport { stripPort } from '../../../utils/url';\nimport {\n DEVELOPER_TOOL,\n HostInfo,\n ManifestMiddleware,\n ManifestRequestInfo,\n} from './ManifestMiddleware';\nimport { assertRuntimePlatform, parsePlatformHeader } from './resolvePlatform';\nimport { ServerHeaders, ServerRequest } from './server.types';\n\ntype SignManifestProps = {\n manifest: ExpoAppManifest;\n hostId: string;\n acceptSignature: boolean;\n};\n\ninterface ClassicManifestRequestInfo extends ManifestRequestInfo {}\n\nexport class ClassicManifestMiddleware extends ManifestMiddleware<ClassicManifestRequestInfo> {\n public getParsedHeaders(req: ServerRequest): ClassicManifestRequestInfo {\n const platform = parsePlatformHeader(req) || 'ios';\n assertRuntimePlatform(platform);\n return {\n platform,\n acceptSignature: Boolean(req.headers['exponent-accept-signature']),\n hostname: stripPort(req.headers['host']),\n };\n }\n\n public async _getManifestResponseAsync({\n acceptSignature,\n ...requestOptions\n }: ClassicManifestRequestInfo): Promise<{\n body: string;\n version: string;\n headers: ServerHeaders;\n }> {\n const { exp, hostUri, expoGoConfig, bundleUrl } = await this._resolveProjectSettingsAsync(\n requestOptions\n );\n\n const manifest: ExpoAppManifest = {\n ...(exp as ExpoAppManifest),\n ...expoGoConfig,\n hostUri,\n bundleUrl,\n };\n\n // Gather packager and host info\n const hostInfo = await createHostInfoAsync();\n\n const headers = new Map<string, any>();\n headers.set('Exponent-Server', hostInfo);\n\n // Create the final string\n const body = await this._fetchComputedManifestStringAsync({\n manifest,\n hostId: hostInfo.host,\n acceptSignature,\n });\n\n return {\n body,\n version: manifest.sdkVersion,\n headers,\n };\n }\n\n protected trackManifest(version?: string) {\n // Log analytics\n logEventAsync('Serve Manifest', {\n sdkVersion: version ?? null,\n });\n }\n\n /** Exposed for testing. */\n async _getManifestStringAsync({\n manifest,\n hostId,\n acceptSignature,\n }: SignManifestProps): Promise<string> {\n const currentSession = await getUserAsync();\n if (!currentSession || APISettings.isOffline) {\n manifest.id = `@${ANONYMOUS_USERNAME}/${manifest.slug}-${hostId}`;\n }\n if (!acceptSignature) {\n return JSON.stringify(manifest);\n } else if (!currentSession || APISettings.isOffline) {\n return getUnsignedManifestString(manifest);\n } else {\n return this.getSignedManifestStringAsync(manifest);\n }\n }\n\n private getSignedManifestStringAsync = memoize(signClassicExpoGoManifestAsync);\n\n /** Exposed for testing. */\n async _fetchComputedManifestStringAsync(props: SignManifestProps): Promise<string> {\n try {\n return await this._getManifestStringAsync(props);\n } catch (error: any) {\n if (error.code === 'UNAUTHORIZED_ERROR' && props.manifest.owner) {\n // Don't have permissions for siging, warn and enable offline mode.\n this.addSigningDisabledWarning(\n `This project belongs to ${chalk.bold(\n `@${props.manifest.owner}`\n )} and you have not been granted the appropriate permissions.\\n` +\n `Please request access from an admin of @${props.manifest.owner} or change the \"owner\" field to an account you belong to.\\n` +\n learnMore('https://docs.expo.dev/versions/latest/config/app/#owner')\n );\n APISettings.isOffline = true;\n return await this._getManifestStringAsync(props);\n } else if (error.code === 'ENOTFOUND') {\n // Got a DNS error, i.e. can't access exp.host, warn and enable offline mode.\n this.addSigningDisabledWarning(\n `Could not reach Expo servers, please check if you can access ${\n error.hostname || 'exp.host'\n }.`\n );\n APISettings.isOffline = true;\n return await this._getManifestStringAsync(props);\n } else {\n throw error;\n }\n }\n }\n\n private addSigningDisabledWarning = memoize((reason: string) => {\n Log.warn(`${reason}\\nFalling back to offline mode.`);\n // For the memo\n return reason;\n });\n}\n\n// Passed to Expo Go and registered as telemetry.\n// TODO: it's unclear why we don't just send it from the CLI.\nasync function createHostInfoAsync(): Promise<HostInfo> {\n return {\n host: await UserSettings.getAnonymousIdentifierAsync(),\n server: 'expo',\n // Defined in the build step\n serverVersion: process.env.__EXPO_VERSION!,\n serverDriver: DEVELOPER_TOOL,\n serverOS: os.platform(),\n serverOSVersion: os.release(),\n };\n}\n\nfunction getUnsignedManifestString(manifest: ExpoConfig) {\n const unsignedManifest = {\n manifestString: JSON.stringify(manifest),\n signature: 'UNSIGNED',\n };\n return JSON.stringify(unsignedManifest);\n}\n"],"names":["Log","ClassicManifestMiddleware","ManifestMiddleware","getParsedHeaders","req","platform","parsePlatformHeader","assertRuntimePlatform","acceptSignature","Boolean","headers","hostname","stripPort","_getManifestResponseAsync","requestOptions","exp","hostUri","expoGoConfig","bundleUrl","_resolveProjectSettingsAsync","manifest","hostInfo","createHostInfoAsync","Map","set","body","_fetchComputedManifestStringAsync","hostId","host","version","sdkVersion","trackManifest","logEventAsync","_getManifestStringAsync","currentSession","getUserAsync","APISettings","isOffline","id","ANONYMOUS_USERNAME","slug","JSON","stringify","getUnsignedManifestString","getSignedManifestStringAsync","memoize","signClassicExpoGoManifestAsync","props","error","code","owner","addSigningDisabledWarning","chalk","bold","learnMore","reason","warn","UserSettings","getAnonymousIdentifierAsync","server","serverVersion","process","env","__EXPO_VERSION","serverDriver","DEVELOPER_TOOL","serverOS","os","serverOSVersion","release","unsignedManifest","manifestString","signature"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/middleware/ClassicManifestMiddleware.ts"],"sourcesContent":["import { ExpoAppManifest, ExpoConfig } from '@expo/config';\nimport chalk from 'chalk';\nimport os from 'os';\n\nimport { APISettings } from '../../../api/settings';\nimport { signClassicExpoGoManifestAsync } from '../../../api/signManifest';\nimport UserSettings from '../../../api/user/UserSettings';\nimport { ANONYMOUS_USERNAME, getUserAsync } from '../../../api/user/user';\nimport * as Log from '../../../log';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport { memoize } from '../../../utils/fn';\nimport { learnMore } from '../../../utils/link';\nimport { stripPort } from '../../../utils/url';\nimport {\n DEVELOPER_TOOL,\n HostInfo,\n ManifestMiddleware,\n ManifestRequestInfo,\n} from './ManifestMiddleware';\nimport { assertRuntimePlatform, parsePlatformHeader } from './resolvePlatform';\nimport { ServerHeaders, ServerRequest } from './server.types';\n\ntype SignManifestProps = {\n manifest: ExpoAppManifest;\n hostId: string;\n acceptSignature: boolean;\n};\n\ninterface ClassicManifestRequestInfo extends ManifestRequestInfo {}\n\nconst debug = require('debug')(\n 'expo:start:server:middleware:ClassicManifestMiddleware'\n) as typeof console.log;\n\nexport class ClassicManifestMiddleware extends ManifestMiddleware<ClassicManifestRequestInfo> {\n public getParsedHeaders(req: ServerRequest): ClassicManifestRequestInfo {\n const platform = parsePlatformHeader(req) || 'ios';\n assertRuntimePlatform(platform);\n return {\n platform,\n acceptSignature: Boolean(req.headers['exponent-accept-signature']),\n hostname: stripPort(req.headers['host']),\n };\n }\n\n public async _getManifestResponseAsync({\n acceptSignature,\n ...requestOptions\n }: ClassicManifestRequestInfo): Promise<{\n body: string;\n version: string;\n headers: ServerHeaders;\n }> {\n const { exp, hostUri, expoGoConfig, bundleUrl } = await this._resolveProjectSettingsAsync(\n requestOptions\n );\n\n const manifest: ExpoAppManifest = {\n ...(exp as ExpoAppManifest),\n ...expoGoConfig,\n hostUri,\n bundleUrl,\n };\n\n // Gather packager and host info\n const hostInfo = await createHostInfoAsync();\n\n const headers = new Map<string, any>();\n headers.set('Exponent-Server', hostInfo);\n\n // Create the final string\n const body = await this._fetchComputedManifestStringAsync({\n manifest,\n hostId: hostInfo.host,\n acceptSignature,\n });\n\n return {\n body,\n version: manifest.sdkVersion,\n headers,\n };\n }\n\n protected trackManifest(version?: string) {\n // Log analytics\n logEventAsync('Serve Manifest', {\n sdkVersion: version ?? null,\n });\n }\n\n /** Exposed for testing. */\n async _getManifestStringAsync({\n manifest,\n hostId,\n acceptSignature,\n }: SignManifestProps): Promise<string> {\n const currentSession = await getUserAsync();\n if (!currentSession || APISettings.isOffline) {\n manifest.id = `@${ANONYMOUS_USERNAME}/${manifest.slug}-${hostId}`;\n }\n if (!acceptSignature) {\n return JSON.stringify(manifest);\n } else if (!currentSession || APISettings.isOffline) {\n return getUnsignedManifestString(manifest);\n } else {\n return this.getSignedManifestStringAsync(manifest);\n }\n }\n\n private getSignedManifestStringAsync = memoize(signClassicExpoGoManifestAsync);\n\n /** Exposed for testing. */\n async _fetchComputedManifestStringAsync(props: SignManifestProps): Promise<string> {\n try {\n return await this._getManifestStringAsync(props);\n } catch (error: any) {\n debug(`Error getting manifest:`, error);\n if (error.code === 'UNAUTHORIZED' && props.manifest.owner) {\n // Don't have permissions for siging, warn and enable offline mode.\n this.addSigningDisabledWarning(\n `This project belongs to ${chalk.bold(\n `@${props.manifest.owner}`\n )} and you have not been granted the appropriate permissions.\\n` +\n `Please request access from an admin of @${props.manifest.owner} or change the \"owner\" field to an account you belong to.\\n` +\n learnMore('https://docs.expo.dev/versions/latest/config/app/#owner')\n );\n APISettings.isOffline = true;\n return await this._getManifestStringAsync(props);\n } else if (error.code === 'ENOTFOUND') {\n // Got a DNS error, i.e. can't access exp.host, warn and enable offline mode.\n this.addSigningDisabledWarning(\n `Could not reach Expo servers, please check if you can access ${\n error.hostname || 'exp.host'\n }.`\n );\n APISettings.isOffline = true;\n return await this._getManifestStringAsync(props);\n } else {\n throw error;\n }\n }\n }\n\n private addSigningDisabledWarning = memoize((reason: string) => {\n Log.warn(`${reason}\\nFalling back to offline mode.`);\n // For the memo\n return reason;\n });\n}\n\n// Passed to Expo Go and registered as telemetry.\n// TODO: it's unclear why we don't just send it from the CLI.\nasync function createHostInfoAsync(): Promise<HostInfo> {\n return {\n host: await UserSettings.getAnonymousIdentifierAsync(),\n server: 'expo',\n // Defined in the build step\n serverVersion: process.env.__EXPO_VERSION!,\n serverDriver: DEVELOPER_TOOL,\n serverOS: os.platform(),\n serverOSVersion: os.release(),\n };\n}\n\nfunction getUnsignedManifestString(manifest: ExpoConfig) {\n const unsignedManifest = {\n manifestString: JSON.stringify(manifest),\n signature: 'UNSIGNED',\n };\n return JSON.stringify(unsignedManifest);\n}\n"],"names":["Log","debug","require","ClassicManifestMiddleware","ManifestMiddleware","getParsedHeaders","req","platform","parsePlatformHeader","assertRuntimePlatform","acceptSignature","Boolean","headers","hostname","stripPort","_getManifestResponseAsync","requestOptions","exp","hostUri","expoGoConfig","bundleUrl","_resolveProjectSettingsAsync","manifest","hostInfo","createHostInfoAsync","Map","set","body","_fetchComputedManifestStringAsync","hostId","host","version","sdkVersion","trackManifest","logEventAsync","_getManifestStringAsync","currentSession","getUserAsync","APISettings","isOffline","id","ANONYMOUS_USERNAME","slug","JSON","stringify","getUnsignedManifestString","getSignedManifestStringAsync","memoize","signClassicExpoGoManifestAsync","props","error","code","owner","addSigningDisabledWarning","chalk","bold","learnMore","reason","warn","UserSettings","getAnonymousIdentifierAsync","server","serverVersion","process","env","__EXPO_VERSION","serverDriver","DEVELOPER_TOOL","serverOS","os","serverOSVersion","release","unsignedManifest","manifestString","signature"],"mappings":"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"}
|
|
@@ -25,10 +25,14 @@ function _interopRequireDefault(obj) {
|
|
|
25
25
|
default: obj
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
|
+
const debug = require("debug")("expo:start:server:middleware:ExpoGoManifestHandlerMiddleware");
|
|
28
29
|
class ExpoGoManifestHandlerMiddleware extends _manifestMiddleware.ManifestMiddleware {
|
|
29
30
|
getParsedHeaders(req) {
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
let platform = (0, _resolvePlatform).parsePlatformHeader(req);
|
|
32
|
+
if (!platform) {
|
|
33
|
+
debug(`No "expo-platform" header or "platform" query parameter specified. Falling back to "none".`);
|
|
34
|
+
platform = "none";
|
|
35
|
+
}
|
|
32
36
|
(0, _resolvePlatform).assertRuntimePlatform(platform);
|
|
33
37
|
// Expo Updates clients explicitly accept "multipart/mixed" responses while browsers implicitly
|
|
34
38
|
// accept them with "accept: */*". To make it easier to debug manifest responses by visiting their
|
|
@@ -112,7 +116,7 @@ class ExpoGoManifestHandlerMiddleware extends _manifestMiddleware.ManifestMiddle
|
|
|
112
116
|
const signature = (0, _codesigning).signManifestString(stringifiedManifest, codeSigningInfo);
|
|
113
117
|
manifestPartHeaders = {
|
|
114
118
|
"expo-signature": (0, _structuredHeaders).serializeDictionary(convertToDictionaryItemsRepresentation({
|
|
115
|
-
keyid:
|
|
119
|
+
keyid: codeSigningInfo.keyId,
|
|
116
120
|
sig: signature,
|
|
117
121
|
alg: "rsa-v1_5-sha256"
|
|
118
122
|
}))
|