@expo/cli 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/build/bin/cli +2 -2
  2. package/build/src/export/createBundles.js.map +1 -1
  3. package/build/src/export/exportApp.js +1 -2
  4. package/build/src/export/exportApp.js.map +1 -1
  5. package/build/src/export/fork-bundleAsync.js +3 -0
  6. package/build/src/export/fork-bundleAsync.js.map +1 -1
  7. package/build/src/install/checkPackages.js +3 -6
  8. package/build/src/install/checkPackages.js.map +1 -1
  9. package/build/src/install/installAsync.js +37 -3
  10. package/build/src/install/installAsync.js.map +1 -1
  11. package/build/src/install/resolveOptions.js.map +1 -1
  12. package/build/src/run/ios/appleDevice/ClientManager.js +5 -1
  13. package/build/src/run/ios/appleDevice/ClientManager.js.map +1 -1
  14. package/build/src/run/ios/appleDevice/client/LockdowndClient.js +5 -1
  15. package/build/src/run/ios/appleDevice/client/LockdowndClient.js.map +1 -1
  16. package/build/src/run/ios/appleDevice/protocol/AbstractProtocol.js +18 -0
  17. package/build/src/run/ios/appleDevice/protocol/AbstractProtocol.js.map +1 -1
  18. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +13 -3
  19. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -1
  20. package/build/src/start/doctor/ngrok/ExternalModule.js +6 -2
  21. package/build/src/start/doctor/ngrok/ExternalModule.js.map +1 -1
  22. package/build/src/start/doctor/typescript/updateTSConfig.js +1 -1
  23. package/build/src/start/doctor/typescript/updateTSConfig.js.map +1 -1
  24. package/build/src/start/interface/interactiveActions.js +7 -2
  25. package/build/src/start/interface/interactiveActions.js.map +1 -1
  26. package/build/src/start/server/BundlerDevServer.js +14 -10
  27. package/build/src/start/server/BundlerDevServer.js.map +1 -1
  28. package/build/src/start/server/DevServerManager.js +4 -1
  29. package/build/src/start/server/DevServerManager.js.map +1 -1
  30. package/build/src/start/server/metro/instantiateMetro.js +5 -0
  31. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  32. package/build/src/start/server/metro/resolveFromProject.js +4 -0
  33. package/build/src/start/server/metro/resolveFromProject.js.map +1 -1
  34. package/build/src/start/server/middleware/ClassicManifestMiddleware.js +1 -1
  35. package/build/src/start/server/middleware/HistoryFallbackMiddleware.js +29 -0
  36. package/build/src/start/server/middleware/HistoryFallbackMiddleware.js.map +1 -1
  37. package/build/src/start/server/middleware/ManifestMiddleware.js +30 -1
  38. package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
  39. package/build/src/start/server/middleware/resolveEntryPoint.js +5 -1
  40. package/build/src/start/server/middleware/resolveEntryPoint.js.map +1 -1
  41. package/build/src/utils/FileNotifier.js +11 -2
  42. package/build/src/utils/FileNotifier.js.map +1 -1
  43. package/build/src/utils/analytics/getMetroDebugProperties.js +16 -0
  44. package/build/src/utils/analytics/getMetroDebugProperties.js.map +1 -0
  45. package/build/src/utils/analytics/getMetroProperties.js +29 -0
  46. package/build/src/utils/analytics/getMetroProperties.js.map +1 -0
  47. package/build/src/utils/analytics/metroDebuggerMiddleware.js +50 -0
  48. package/build/src/utils/analytics/metroDebuggerMiddleware.js.map +1 -0
  49. package/build/src/utils/analytics/rudderstackClient.js +2 -2
  50. package/build/src/utils/analytics/rudderstackClient.js.map +1 -1
  51. package/build/src/utils/array.js +11 -0
  52. package/build/src/utils/array.js.map +1 -1
  53. package/build/src/utils/env.js +3 -0
  54. package/build/src/utils/env.js.map +1 -1
  55. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/start/server/DevServerManager.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport assert from 'assert';\nimport chalk from 'chalk';\n\nimport { FileNotifier } from '../../utils/FileNotifier';\nimport { logEventAsync } from '../../utils/analytics/rudderstackClient';\nimport { ProjectPrerequisite } from '../doctor/Prerequisite';\nimport * as AndroidDebugBridge from '../platforms/android/adb';\nimport { BundlerDevServer, BundlerStartOptions } from './BundlerDevServer';\nimport { getPlatformBundlers } from './platformBundlers';\n\nconst debug = require('debug')('expo:start:server:devServerManager') as typeof console.log;\n\nexport type MultiBundlerStartOptions = {\n type: keyof typeof BUNDLERS;\n options?: BundlerStartOptions;\n}[];\n\nconst devServers: BundlerDevServer[] = [];\n\nconst BUNDLERS = {\n webpack: () =>\n require('./webpack/WebpackBundlerDevServer')\n .WebpackBundlerDevServer as typeof import('./webpack/WebpackBundlerDevServer').WebpackBundlerDevServer,\n metro: () =>\n require('./metro/MetroBundlerDevServer')\n .MetroBundlerDevServer as typeof import('./metro/MetroBundlerDevServer').MetroBundlerDevServer,\n};\n\n/** Manages interacting with multiple dev servers. */\nexport class DevServerManager {\n private projectPrerequisites: ProjectPrerequisite[] = [];\n\n constructor(\n public projectRoot: string,\n /** Keep track of the original CLI options for bundlers that are started interactively. */\n public options: BundlerStartOptions\n ) {\n this.watchBabelConfig();\n }\n\n private watchBabelConfig() {\n const notifier = new FileNotifier(\n this.projectRoot,\n [\n './babel.config.js',\n './babel.config.json',\n './.babelrc.json',\n './.babelrc',\n './.babelrc.js',\n ],\n {\n additionalWarning: chalk` You may need to clear the bundler cache with the {bold --clear} flag for your changes to take effect.`,\n }\n );\n\n notifier.startObserving();\n\n return notifier;\n }\n\n /** Lazily load and assert a project-level prerequisite. */\n async ensureProjectPrerequisiteAsync(PrerequisiteClass: typeof ProjectPrerequisite) {\n let prerequisite = this.projectPrerequisites.find(\n (prerequisite) => prerequisite instanceof PrerequisiteClass\n );\n if (!prerequisite) {\n prerequisite = new PrerequisiteClass(this.projectRoot);\n this.projectPrerequisites.push(prerequisite);\n }\n await prerequisite.assertAsync();\n }\n\n /**\n * Sends a message over web sockets to all connected devices,\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 extra event info to send over the socket.\n */\n broadcastMessage(method: 'reload' | 'devMenu' | 'sendDevCommand', params?: Record<string, any>) {\n devServers.forEach((server) => {\n server.broadcastMessage(method, params);\n });\n }\n\n /** Get the port for the dev server (either Webpack or Metro) that is hosting code for React Native runtimes. */\n getNativeDevServerPort() {\n const server = devServers.find((server) => server.isTargetingNative());\n return server?.getInstance()?.location.port ?? null;\n }\n\n /** Get the first server that targets web. */\n getWebDevServer() {\n const server = devServers.find((server) => server.isTargetingWeb());\n return server ?? null;\n }\n\n getDefaultDevServer(): BundlerDevServer {\n // Return the first native dev server otherwise return the first dev server.\n const server = devServers.find((server) => server.isTargetingNative());\n const defaultServer = server ?? devServers[0];\n assert(defaultServer, 'No dev servers are running');\n return defaultServer;\n }\n\n async ensureWebDevServerRunningAsync() {\n const [server] = devServers.filter((server) => server.isTargetingWeb());\n if (server) {\n return;\n }\n const { exp } = getConfig(this.projectRoot, {\n skipPlugins: true,\n skipSDKVersionRequirement: true,\n });\n const bundler = getPlatformBundlers(exp).web;\n debug(`Starting ${bundler} dev server for web`);\n return this.startAsync([\n {\n type: bundler,\n options: this.options,\n },\n ]);\n }\n\n /** Start all dev servers. */\n async startAsync(startOptions: MultiBundlerStartOptions): Promise<ExpoConfig> {\n const { exp } = getConfig(this.projectRoot);\n\n await logEventAsync('Start Project', {\n sdkVersion: exp.sdkVersion ?? null,\n });\n\n const platformBundlers = getPlatformBundlers(exp);\n\n // Start all dev servers...\n for (const { type, options } of startOptions) {\n const BundlerDevServerClass = await BUNDLERS[type]();\n const server = new BundlerDevServerClass(\n this.projectRoot,\n platformBundlers,\n !!options?.devClient\n );\n await server.startAsync(options ?? this.options);\n devServers.push(server);\n }\n\n return exp;\n }\n\n /** Stop all servers including ADB. */\n async stopAsync(): Promise<void> {\n await Promise.allSettled([\n // Stop all dev servers\n ...devServers.map((server) => server.stopAsync()),\n // Stop ADB\n AndroidDebugBridge.getServer().stopAsync(),\n ]);\n }\n}\n"],"names":["AndroidDebugBridge","debug","require","devServers","BUNDLERS","webpack","WebpackBundlerDevServer","metro","MetroBundlerDevServer","DevServerManager","constructor","projectRoot","options","projectPrerequisites","watchBabelConfig","notifier","FileNotifier","additionalWarning","chalk","startObserving","ensureProjectPrerequisiteAsync","PrerequisiteClass","prerequisite","find","push","assertAsync","broadcastMessage","method","params","forEach","server","getNativeDevServerPort","isTargetingNative","getInstance","location","port","getWebDevServer","isTargetingWeb","getDefaultDevServer","defaultServer","assert","ensureWebDevServerRunningAsync","filter","exp","getConfig","skipPlugins","skipSDKVersionRequirement","bundler","getPlatformBundlers","web","startAsync","type","startOptions","logEventAsync","sdkVersion","platformBundlers","BundlerDevServerClass","devClient","stopAsync","Promise","allSettled","map","getServer"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/start/server/DevServerManager.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport assert from 'assert';\nimport chalk from 'chalk';\n\nimport { FileNotifier } from '../../utils/FileNotifier';\nimport { logEventAsync } from '../../utils/analytics/rudderstackClient';\nimport { ProjectPrerequisite } from '../doctor/Prerequisite';\nimport * as AndroidDebugBridge from '../platforms/android/adb';\nimport { BundlerDevServer, BundlerStartOptions } from './BundlerDevServer';\nimport { getPlatformBundlers } from './platformBundlers';\n\nconst debug = require('debug')('expo:start:server:devServerManager') as typeof console.log;\n\nexport type MultiBundlerStartOptions = {\n type: keyof typeof BUNDLERS;\n options?: BundlerStartOptions;\n}[];\n\nconst devServers: BundlerDevServer[] = [];\n\nconst BUNDLERS = {\n webpack: () =>\n require('./webpack/WebpackBundlerDevServer')\n .WebpackBundlerDevServer as typeof import('./webpack/WebpackBundlerDevServer').WebpackBundlerDevServer,\n metro: () =>\n require('./metro/MetroBundlerDevServer')\n .MetroBundlerDevServer as typeof import('./metro/MetroBundlerDevServer').MetroBundlerDevServer,\n};\n\n/** Manages interacting with multiple dev servers. */\nexport class DevServerManager {\n private projectPrerequisites: ProjectPrerequisite[] = [];\n\n private notifier: FileNotifier | null = null;\n\n constructor(\n public projectRoot: string,\n /** Keep track of the original CLI options for bundlers that are started interactively. */\n public options: BundlerStartOptions\n ) {\n this.notifier = this.watchBabelConfig();\n }\n\n private watchBabelConfig() {\n const notifier = new FileNotifier(\n this.projectRoot,\n [\n './babel.config.js',\n './babel.config.json',\n './.babelrc.json',\n './.babelrc',\n './.babelrc.js',\n ],\n {\n additionalWarning: chalk` You may need to clear the bundler cache with the {bold --clear} flag for your changes to take effect.`,\n }\n );\n\n notifier.startObserving();\n\n return notifier;\n }\n\n /** Lazily load and assert a project-level prerequisite. */\n async ensureProjectPrerequisiteAsync(PrerequisiteClass: typeof ProjectPrerequisite) {\n let prerequisite = this.projectPrerequisites.find(\n (prerequisite) => prerequisite instanceof PrerequisiteClass\n );\n if (!prerequisite) {\n prerequisite = new PrerequisiteClass(this.projectRoot);\n this.projectPrerequisites.push(prerequisite);\n }\n await prerequisite.assertAsync();\n }\n\n /**\n * Sends a message over web sockets to all connected devices,\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 extra event info to send over the socket.\n */\n broadcastMessage(method: 'reload' | 'devMenu' | 'sendDevCommand', params?: Record<string, any>) {\n devServers.forEach((server) => {\n server.broadcastMessage(method, params);\n });\n }\n\n /** Get the port for the dev server (either Webpack or Metro) that is hosting code for React Native runtimes. */\n getNativeDevServerPort() {\n const server = devServers.find((server) => server.isTargetingNative());\n return server?.getInstance()?.location.port ?? null;\n }\n\n /** Get the first server that targets web. */\n getWebDevServer() {\n const server = devServers.find((server) => server.isTargetingWeb());\n return server ?? null;\n }\n\n getDefaultDevServer(): BundlerDevServer {\n // Return the first native dev server otherwise return the first dev server.\n const server = devServers.find((server) => server.isTargetingNative());\n const defaultServer = server ?? devServers[0];\n assert(defaultServer, 'No dev servers are running');\n return defaultServer;\n }\n\n async ensureWebDevServerRunningAsync() {\n const [server] = devServers.filter((server) => server.isTargetingWeb());\n if (server) {\n return;\n }\n const { exp } = getConfig(this.projectRoot, {\n skipPlugins: true,\n skipSDKVersionRequirement: true,\n });\n const bundler = getPlatformBundlers(exp).web;\n debug(`Starting ${bundler} dev server for web`);\n return this.startAsync([\n {\n type: bundler,\n options: this.options,\n },\n ]);\n }\n\n /** Start all dev servers. */\n async startAsync(startOptions: MultiBundlerStartOptions): Promise<ExpoConfig> {\n const { exp } = getConfig(this.projectRoot);\n\n await logEventAsync('Start Project', {\n sdkVersion: exp.sdkVersion ?? null,\n });\n\n const platformBundlers = getPlatformBundlers(exp);\n\n // Start all dev servers...\n for (const { type, options } of startOptions) {\n const BundlerDevServerClass = await BUNDLERS[type]();\n const server = new BundlerDevServerClass(\n this.projectRoot,\n platformBundlers,\n !!options?.devClient\n );\n await server.startAsync(options ?? this.options);\n devServers.push(server);\n }\n\n return exp;\n }\n\n /** Stop all servers including ADB. */\n async stopAsync(): Promise<void> {\n await Promise.allSettled([\n this.notifier?.stopObserving(),\n // Stop all dev servers\n ...devServers.map((server) => server.stopAsync()),\n // Stop ADB\n AndroidDebugBridge.getServer().stopAsync(),\n ]);\n }\n}\n"],"names":["AndroidDebugBridge","debug","require","devServers","BUNDLERS","webpack","WebpackBundlerDevServer","metro","MetroBundlerDevServer","DevServerManager","constructor","projectRoot","options","projectPrerequisites","notifier","watchBabelConfig","FileNotifier","additionalWarning","chalk","startObserving","ensureProjectPrerequisiteAsync","PrerequisiteClass","prerequisite","find","push","assertAsync","broadcastMessage","method","params","forEach","server","getNativeDevServerPort","isTargetingNative","getInstance","location","port","getWebDevServer","isTargetingWeb","getDefaultDevServer","defaultServer","assert","ensureWebDevServerRunningAsync","filter","exp","getConfig","skipPlugins","skipSDKVersionRequirement","bundler","getPlatformBundlers","web","startAsync","type","startOptions","logEventAsync","sdkVersion","platformBundlers","BundlerDevServerClass","devClient","stopAsync","Promise","allSettled","stopObserving","map","getServer"],"mappings":"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"}
@@ -8,6 +8,9 @@ var _config = require("@expo/config");
8
8
  var _chalk = _interopRequireDefault(require("chalk"));
9
9
  var _metroCore = require("metro-core");
10
10
  var _log = require("../../../log");
11
+ var _getMetroProperties = require("../../../utils/analytics/getMetroProperties");
12
+ var _metroDebuggerMiddleware = require("../../../utils/analytics/metroDebuggerMiddleware");
13
+ var _rudderstackClient = require("../../../utils/analytics/rudderstackClient");
11
14
  var _env = require("../../../utils/env");
12
15
  var _createDevServerMiddleware = require("../middleware/createDevServerMiddleware");
13
16
  var _platformBundlers = require("../platformBundlers");
@@ -44,6 +47,7 @@ async function instantiateMetroAsync(projectRoot, options) {
44
47
  });
45
48
  const platformBundlers = (0, _platformBundlers).getPlatformBundlers(exp);
46
49
  metroConfig = await (0, _withMetroMultiPlatform).withMetroMultiPlatformAsync(projectRoot, metroConfig, platformBundlers);
50
+ (0, _rudderstackClient).logEventAsync("metro config", (0, _getMetroProperties).getMetroProperties(projectRoot, exp, metroConfig));
47
51
  const { middleware , attachToServer , // New
48
52
  websocketEndpoints , eventsSocketEndpoint , messageSocketEndpoint , } = (0, _createDevServerMiddleware).createDevServerMiddleware(projectRoot, {
49
53
  port: metroConfig.server.port,
@@ -57,6 +61,7 @@ async function instantiateMetroAsync(projectRoot, options) {
57
61
  }
58
62
  return middleware.use(metroMiddleware);
59
63
  };
64
+ middleware.use((0, _metroDebuggerMiddleware).createDebuggerTelemetryMiddleware(projectRoot, exp));
60
65
  const server1 = await Metro.runServer(metroConfig, {
61
66
  hmrEnabled: true,
62
67
  websocketEndpoints,
@@ -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 chalk from 'chalk';\nimport http from 'http';\nimport Metro from 'metro';\nimport { Terminal } from 'metro-core';\n\nimport { Log } from '../../../log';\nimport { env } from '../../../utils/env';\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 // @ts-expect-error Property was added in 0.73.4, remove this statement when updating Metro\n watch: isWatchEnabled(),\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\n/**\n * Simplify and communicate if Metro is running without watching file updates,.\n * Exposed for testing.\n */\nexport function isWatchEnabled() {\n if (env.CI) {\n Log.log(\n chalk`Metro is running in CI mode, reloads are disabled. Remove {bold CI=true} to enable watch mode.`\n );\n }\n\n return !env.CI;\n}\n"],"names":["instantiateMetroAsync","isWatchEnabled","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","watch","messageSocket","eventsSocket","env","CI","Log","log","chalk"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport { MetroDevServerOptions } from '@expo/dev-server';\nimport chalk from 'chalk';\nimport http from 'http';\nimport Metro from 'metro';\nimport { Terminal } from 'metro-core';\n\nimport { Log } from '../../../log';\nimport { getMetroProperties } from '../../../utils/analytics/getMetroProperties';\nimport { createDebuggerTelemetryMiddleware } from '../../../utils/analytics/metroDebuggerMiddleware';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport { env } from '../../../utils/env';\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\n const platformBundlers = getPlatformBundlers(exp);\n metroConfig = await withMetroMultiPlatformAsync(projectRoot, metroConfig, platformBundlers);\n\n logEventAsync('metro config', getMetroProperties(projectRoot, exp, metroConfig));\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 middleware.use(createDebuggerTelemetryMiddleware(projectRoot, exp));\n\n const server = await Metro.runServer(metroConfig, {\n hmrEnabled: true,\n websocketEndpoints,\n // @ts-expect-error Property was added in 0.73.4, remove this statement when updating Metro\n watch: isWatchEnabled(),\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\n/**\n * Simplify and communicate if Metro is running without watching file updates,.\n * Exposed for testing.\n */\nexport function isWatchEnabled() {\n if (env.CI) {\n Log.log(\n chalk`Metro is running in CI mode, reloads are disabled. Remove {bold CI=true} to enable watch mode.`\n );\n }\n\n return !env.CI;\n}\n"],"names":["instantiateMetroAsync","isWatchEnabled","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","logEventAsync","getMetroProperties","middleware","attachToServer","websocketEndpoints","eventsSocketEndpoint","messageSocketEndpoint","createDevServerMiddleware","port","server","watchFolders","customEnhanceMiddleware","enhanceMiddleware","metroMiddleware","use","createDebuggerTelemetryMiddleware","runServer","hmrEnabled","watch","messageSocket","eventsSocket","env","CI","Log","log","chalk"],"mappings":"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"}
@@ -6,6 +6,7 @@ exports.importMetroFromProject = importMetroFromProject;
6
6
  exports.importExpoMetroConfigFromProject = importExpoMetroConfigFromProject;
7
7
  exports.importMetroResolverFromProject = importMetroResolverFromProject;
8
8
  exports.importCliSaveAssetsFromProject = importCliSaveAssetsFromProject;
9
+ exports.resolveMetroVersionFromProject = resolveMetroVersionFromProject;
9
10
  var _resolveFrom = _interopRequireDefault(require("resolve-from"));
10
11
  function _interopRequireDefault(obj) {
11
12
  return obj && obj.__esModule ? obj : {
@@ -42,5 +43,8 @@ function importMetroResolverFromProject(projectRoot) {
42
43
  function importCliSaveAssetsFromProject(projectRoot) {
43
44
  return importFromProject(projectRoot, "@react-native-community/cli-plugin-metro/build/commands/bundle/saveAssets").default;
44
45
  }
46
+ function resolveMetroVersionFromProject(projectRoot) {
47
+ return importFromProject(projectRoot, "metro/package.json").version;
48
+ }
45
49
 
46
50
  //# sourceMappingURL=resolveFromProject.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/metro/resolveFromProject.ts"],"sourcesContent":["import resolveFrom from 'resolve-from';\n\n// These resolvers enable us to test the CLI in older projects.\n// We may be able to get rid of this in the future.\n// TODO: Maybe combine with AsyncResolver?\nclass MetroImportError extends Error {\n constructor(projectRoot: string, moduleId: string) {\n super(\n `Missing package \"${moduleId}\" in the project at: ${projectRoot}\\n` +\n 'This usually means \"react-native\" is not installed. ' +\n 'Please verify that dependencies in package.json include \"react-native\" ' +\n 'and run `yarn` or `npm install`.'\n );\n }\n}\n\nfunction resolveFromProject(projectRoot: string, moduleId: string) {\n const resolvedPath = resolveFrom.silent(projectRoot, moduleId);\n if (!resolvedPath) {\n throw new MetroImportError(projectRoot, moduleId);\n }\n return resolvedPath;\n}\n\nfunction importFromProject(projectRoot: string, moduleId: string) {\n return require(resolveFromProject(projectRoot, moduleId));\n}\n\n/** Import `metro` from the project. */\nexport function importMetroFromProject(projectRoot: string): typeof import('metro') {\n return importFromProject(projectRoot, 'metro');\n}\n\n/** Import `@expo/metro-config` from the project. */\nexport function importExpoMetroConfigFromProject(\n projectRoot: string\n): typeof import('@expo/metro-config') {\n return importFromProject(projectRoot, '@expo/metro-config');\n}\n\n/** Import `metro-resolver` from the project. */\nexport function importMetroResolverFromProject(\n projectRoot: string\n): typeof import('metro-resolver') {\n return importFromProject(projectRoot, 'metro-resolver');\n}\n\n/**\n * Import the internal `saveAssets()` function from `react-native` for the purpose\n * of saving production assets as-is instead of converting them to a hash.\n */\nexport function importCliSaveAssetsFromProject(\n projectRoot: string\n): typeof import('@react-native-community/cli-plugin-metro/build/commands/bundle/saveAssets').default {\n return importFromProject(\n projectRoot,\n '@react-native-community/cli-plugin-metro/build/commands/bundle/saveAssets'\n ).default;\n}\n"],"names":["importMetroFromProject","importExpoMetroConfigFromProject","importMetroResolverFromProject","importCliSaveAssetsFromProject","MetroImportError","Error","constructor","projectRoot","moduleId","resolveFromProject","resolvedPath","resolveFrom","silent","importFromProject","require","default"],"mappings":"AAAA;;;;QA6BgBA,sBAAsB,GAAtBA,sBAAsB;QAKtBC,gCAAgC,GAAhCA,gCAAgC;QAOhCC,8BAA8B,GAA9BA,8BAA8B;QAU9BC,8BAA8B,GAA9BA,8BAA8B;AAnDtB,IAAA,YAAc,kCAAd,cAAc,EAAA;;;;;;AAEtC,+DAA+D;AAC/D,mDAAmD;AACnD,0CAA0C;AAC1C,MAAMC,gBAAgB,SAASC,KAAK;IAClCC,YAAYC,WAAmB,EAAEC,QAAgB,CAAE;QACjD,KAAK,CACH,CAAC,iBAAiB,EAAEA,QAAQ,CAAC,qBAAqB,EAAED,WAAW,CAAC,EAAE,CAAC,GACjE,sDAAsD,GACtD,yEAAyE,GACzE,kCAAkC,CACrC,CAAC;KACH;CACF;AAED,SAASE,kBAAkB,CAACF,WAAmB,EAAEC,QAAgB,EAAE;IACjE,MAAME,YAAY,GAAGC,YAAW,QAAA,CAACC,MAAM,CAACL,WAAW,EAAEC,QAAQ,CAAC,AAAC;IAC/D,IAAI,CAACE,YAAY,EAAE;QACjB,MAAM,IAAIN,gBAAgB,CAACG,WAAW,EAAEC,QAAQ,CAAC,CAAC;KACnD;IACD,OAAOE,YAAY,CAAC;CACrB;AAED,SAASG,iBAAiB,CAACN,WAAmB,EAAEC,QAAgB,EAAE;IAChE,OAAOM,OAAO,CAACL,kBAAkB,CAACF,WAAW,EAAEC,QAAQ,CAAC,CAAC,CAAC;CAC3D;AAGM,SAASR,sBAAsB,CAACO,WAAmB,EAA0B;IAClF,OAAOM,iBAAiB,CAACN,WAAW,EAAE,OAAO,CAAC,CAAC;CAChD;AAGM,SAASN,gCAAgC,CAC9CM,WAAmB,EACkB;IACrC,OAAOM,iBAAiB,CAACN,WAAW,EAAE,oBAAoB,CAAC,CAAC;CAC7D;AAGM,SAASL,8BAA8B,CAC5CK,WAAmB,EACc;IACjC,OAAOM,iBAAiB,CAACN,WAAW,EAAE,gBAAgB,CAAC,CAAC;CACzD;AAMM,SAASJ,8BAA8B,CAC5CI,WAAmB,EACiF;IACpG,OAAOM,iBAAiB,CACtBN,WAAW,EACX,2EAA2E,CAC5E,CAACQ,OAAO,CAAC;CACX"}
1
+ {"version":3,"sources":["../../../../../src/start/server/metro/resolveFromProject.ts"],"sourcesContent":["import resolveFrom from 'resolve-from';\n\n// These resolvers enable us to test the CLI in older projects.\n// We may be able to get rid of this in the future.\n// TODO: Maybe combine with AsyncResolver?\nclass MetroImportError extends Error {\n constructor(projectRoot: string, moduleId: string) {\n super(\n `Missing package \"${moduleId}\" in the project at: ${projectRoot}\\n` +\n 'This usually means \"react-native\" is not installed. ' +\n 'Please verify that dependencies in package.json include \"react-native\" ' +\n 'and run `yarn` or `npm install`.'\n );\n }\n}\n\nfunction resolveFromProject(projectRoot: string, moduleId: string) {\n const resolvedPath = resolveFrom.silent(projectRoot, moduleId);\n if (!resolvedPath) {\n throw new MetroImportError(projectRoot, moduleId);\n }\n return resolvedPath;\n}\n\nfunction importFromProject(projectRoot: string, moduleId: string) {\n return require(resolveFromProject(projectRoot, moduleId));\n}\n\n/** Import `metro` from the project. */\nexport function importMetroFromProject(projectRoot: string): typeof import('metro') {\n return importFromProject(projectRoot, 'metro');\n}\n\n/** Import `@expo/metro-config` from the project. */\nexport function importExpoMetroConfigFromProject(\n projectRoot: string\n): typeof import('@expo/metro-config') {\n return importFromProject(projectRoot, '@expo/metro-config');\n}\n\n/** Import `metro-resolver` from the project. */\nexport function importMetroResolverFromProject(\n projectRoot: string\n): typeof import('metro-resolver') {\n return importFromProject(projectRoot, 'metro-resolver');\n}\n\n/**\n * Import the internal `saveAssets()` function from `react-native` for the purpose\n * of saving production assets as-is instead of converting them to a hash.\n */\nexport function importCliSaveAssetsFromProject(\n projectRoot: string\n): typeof import('@react-native-community/cli-plugin-metro/build/commands/bundle/saveAssets').default {\n return importFromProject(\n projectRoot,\n '@react-native-community/cli-plugin-metro/build/commands/bundle/saveAssets'\n ).default;\n}\n\n/** Resolve the installed Metro version from project */\nexport function resolveMetroVersionFromProject(projectRoot: string): string {\n return importFromProject(projectRoot, 'metro/package.json').version;\n}\n"],"names":["importMetroFromProject","importExpoMetroConfigFromProject","importMetroResolverFromProject","importCliSaveAssetsFromProject","resolveMetroVersionFromProject","MetroImportError","Error","constructor","projectRoot","moduleId","resolveFromProject","resolvedPath","resolveFrom","silent","importFromProject","require","default","version"],"mappings":"AAAA;;;;QA6BgBA,sBAAsB,GAAtBA,sBAAsB;QAKtBC,gCAAgC,GAAhCA,gCAAgC;QAOhCC,8BAA8B,GAA9BA,8BAA8B;QAU9BC,8BAA8B,GAA9BA,8BAA8B;QAU9BC,8BAA8B,GAA9BA,8BAA8B;AA7DtB,IAAA,YAAc,kCAAd,cAAc,EAAA;;;;;;AAEtC,+DAA+D;AAC/D,mDAAmD;AACnD,0CAA0C;AAC1C,MAAMC,gBAAgB,SAASC,KAAK;IAClCC,YAAYC,WAAmB,EAAEC,QAAgB,CAAE;QACjD,KAAK,CACH,CAAC,iBAAiB,EAAEA,QAAQ,CAAC,qBAAqB,EAAED,WAAW,CAAC,EAAE,CAAC,GACjE,sDAAsD,GACtD,yEAAyE,GACzE,kCAAkC,CACrC,CAAC;KACH;CACF;AAED,SAASE,kBAAkB,CAACF,WAAmB,EAAEC,QAAgB,EAAE;IACjE,MAAME,YAAY,GAAGC,YAAW,QAAA,CAACC,MAAM,CAACL,WAAW,EAAEC,QAAQ,CAAC,AAAC;IAC/D,IAAI,CAACE,YAAY,EAAE;QACjB,MAAM,IAAIN,gBAAgB,CAACG,WAAW,EAAEC,QAAQ,CAAC,CAAC;KACnD;IACD,OAAOE,YAAY,CAAC;CACrB;AAED,SAASG,iBAAiB,CAACN,WAAmB,EAAEC,QAAgB,EAAE;IAChE,OAAOM,OAAO,CAACL,kBAAkB,CAACF,WAAW,EAAEC,QAAQ,CAAC,CAAC,CAAC;CAC3D;AAGM,SAAST,sBAAsB,CAACQ,WAAmB,EAA0B;IAClF,OAAOM,iBAAiB,CAACN,WAAW,EAAE,OAAO,CAAC,CAAC;CAChD;AAGM,SAASP,gCAAgC,CAC9CO,WAAmB,EACkB;IACrC,OAAOM,iBAAiB,CAACN,WAAW,EAAE,oBAAoB,CAAC,CAAC;CAC7D;AAGM,SAASN,8BAA8B,CAC5CM,WAAmB,EACc;IACjC,OAAOM,iBAAiB,CAACN,WAAW,EAAE,gBAAgB,CAAC,CAAC;CACzD;AAMM,SAASL,8BAA8B,CAC5CK,WAAmB,EACiF;IACpG,OAAOM,iBAAiB,CACtBN,WAAW,EACX,2EAA2E,CAC5E,CAACQ,OAAO,CAAC;CACX;AAGM,SAASZ,8BAA8B,CAACI,WAAmB,EAAU;IAC1E,OAAOM,iBAAiB,CAACN,WAAW,EAAE,oBAAoB,CAAC,CAACS,OAAO,CAAC;CACrE"}
@@ -130,7 +130,7 @@ async function createHostInfoAsync() {
130
130
  host: await _userSettings.default.getAnonymousIdentifierAsync(),
131
131
  server: "expo",
132
132
  // Defined in the build step
133
- serverVersion: "0.5.0",
133
+ serverVersion: "0.6.0",
134
134
  serverDriver: _manifestMiddleware.DEVELOPER_TOOL,
135
135
  serverOS: _os.default.platform(),
136
136
  serverOSVersion: _os.default.release()
@@ -2,7 +2,32 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
+ exports.isInspectorProxyRequest = isInspectorProxyRequest;
5
6
  var _resolvePlatform = require("./resolvePlatform");
7
+ const debug = require("debug")("expo:start:server:metro:historyFallback");
8
+ const WS_DEVICE_URL = "/inspector/device";
9
+ const WS_DEBUGGER_URL = "/inspector/debug";
10
+ const PAGES_LIST_JSON_URL = "/json";
11
+ const PAGES_LIST_JSON_URL_2 = "/json/list";
12
+ const PAGES_LIST_JSON_VERSION_URL = "/json/version";
13
+ function isInspectorProxyRequest(req) {
14
+ const ua = req.headers["user-agent"];
15
+ const url = req.url;
16
+ // This check is very fragile but it enables websites to use any of the
17
+ // endpoints below without triggering the inspector proxy.
18
+ if (!url || ua && !ua.includes("node-fetch")) {
19
+ // This optimizes for the inspector working over the endpoint being available on web.
20
+ // Web is less fragile.
21
+ return false;
22
+ }
23
+ return [
24
+ WS_DEVICE_URL,
25
+ WS_DEBUGGER_URL,
26
+ PAGES_LIST_JSON_URL,
27
+ PAGES_LIST_JSON_URL_2,
28
+ PAGES_LIST_JSON_VERSION_URL,
29
+ ].includes(url);
30
+ }
6
31
  class HistoryFallbackMiddleware {
7
32
  constructor(indexMiddleware){
8
33
  this.indexMiddleware = indexMiddleware;
@@ -11,6 +36,10 @@ class HistoryFallbackMiddleware {
11
36
  return (req, res, next)=>{
12
37
  const platform = (0, _resolvePlatform).parsePlatformHeader(req);
13
38
  if (!platform || platform === "web") {
39
+ if (isInspectorProxyRequest(req)) {
40
+ debug("Inspector proxy request:", req.url, "UA:", req.headers["user-agent"]);
41
+ return next();
42
+ }
14
43
  // Redirect unknown to the manifest handler while preserving the path.
15
44
  // This implements the HTML5 history fallback API.
16
45
  return this.indexMiddleware(req, res, next);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/middleware/HistoryFallbackMiddleware.ts"],"sourcesContent":["import { parsePlatformHeader } from './resolvePlatform';\nimport { ServerNext, ServerRequest, ServerResponse } from './server.types';\n\n/**\n * Create a web-only middleware which redirects to the index middleware without losing the path component.\n * This is useful for things like React Navigation which need to render the index.html and then direct the user in-memory.\n */\nexport class HistoryFallbackMiddleware {\n constructor(\n private indexMiddleware: (\n req: ServerRequest,\n res: ServerResponse,\n next: ServerNext\n ) => Promise<void>\n ) {}\n getHandler() {\n return (req: ServerRequest, res: ServerResponse, next: any) => {\n const platform = parsePlatformHeader(req);\n\n if (!platform || platform === 'web') {\n // Redirect unknown to the manifest handler while preserving the path.\n // This implements the HTML5 history fallback API.\n return this.indexMiddleware(req, res, next);\n }\n\n return next();\n };\n }\n}\n"],"names":["HistoryFallbackMiddleware","constructor","indexMiddleware","getHandler","req","res","next","platform","parsePlatformHeader"],"mappings":"AAAA;;;;AAAoC,IAAA,gBAAmB,WAAnB,mBAAmB,CAAA;AAOhD,MAAMA,yBAAyB;IACpCC,YACUC,eAIU,CAClB;aALQA,eAIU,GAJVA,eAIU;KAChB;IACJC,UAAU,GAAG;QACX,OAAO,CAACC,GAAkB,EAAEC,GAAmB,EAAEC,IAAS,GAAK;YAC7D,MAAMC,QAAQ,GAAGC,CAAAA,GAAAA,gBAAmB,AAAK,CAAA,oBAAL,CAACJ,GAAG,CAAC,AAAC;YAE1C,IAAI,CAACG,QAAQ,IAAIA,QAAQ,KAAK,KAAK,EAAE;gBACnC,sEAAsE;gBACtE,kDAAkD;gBAClD,OAAO,IAAI,CAACL,eAAe,CAACE,GAAG,EAAEC,GAAG,EAAEC,IAAI,CAAC,CAAC;aAC7C;YAED,OAAOA,IAAI,EAAE,CAAC;SACf,CAAC;KACH;CACF;QArBYN,yBAAyB,GAAzBA,yBAAyB"}
1
+ {"version":3,"sources":["../../../../../src/start/server/middleware/HistoryFallbackMiddleware.ts"],"sourcesContent":["import { parsePlatformHeader } from './resolvePlatform';\nimport { ServerNext, ServerRequest, ServerResponse } from './server.types';\n\nconst debug = require('debug')('expo:start:server:metro:historyFallback') as typeof console.log;\n\nconst WS_DEVICE_URL = '/inspector/device';\nconst WS_DEBUGGER_URL = '/inspector/debug';\nconst PAGES_LIST_JSON_URL = '/json';\nconst PAGES_LIST_JSON_URL_2 = '/json/list';\nconst PAGES_LIST_JSON_VERSION_URL = '/json/version';\n\nexport function isInspectorProxyRequest(req: ServerRequest) {\n const ua = req.headers['user-agent'];\n const url = req.url;\n\n // This check is very fragile but it enables websites to use any of the\n // endpoints below without triggering the inspector proxy.\n if (!url || (ua && !ua.includes('node-fetch'))) {\n // This optimizes for the inspector working over the endpoint being available on web.\n // Web is less fragile.\n return false;\n }\n\n return [\n WS_DEVICE_URL,\n WS_DEBUGGER_URL,\n PAGES_LIST_JSON_URL,\n PAGES_LIST_JSON_URL_2,\n PAGES_LIST_JSON_VERSION_URL,\n ].includes(url);\n}\n\n/**\n * Create a web-only middleware which redirects to the index middleware without losing the path component.\n * This is useful for things like React Navigation which need to render the index.html and then direct the user in-memory.\n */\nexport class HistoryFallbackMiddleware {\n constructor(\n private indexMiddleware: (\n req: ServerRequest,\n res: ServerResponse,\n next: ServerNext\n ) => Promise<void>\n ) {}\n getHandler() {\n return (req: ServerRequest, res: ServerResponse, next: any) => {\n const platform = parsePlatformHeader(req);\n\n if (!platform || platform === 'web') {\n if (isInspectorProxyRequest(req)) {\n debug('Inspector proxy request:', req.url, 'UA:', req.headers['user-agent']);\n return next();\n }\n // Redirect unknown to the manifest handler while preserving the path.\n // This implements the HTML5 history fallback API.\n return this.indexMiddleware(req, res, next);\n }\n\n return next();\n };\n }\n}\n"],"names":["isInspectorProxyRequest","debug","require","WS_DEVICE_URL","WS_DEBUGGER_URL","PAGES_LIST_JSON_URL","PAGES_LIST_JSON_URL_2","PAGES_LIST_JSON_VERSION_URL","req","ua","headers","url","includes","HistoryFallbackMiddleware","constructor","indexMiddleware","getHandler","res","next","platform","parsePlatformHeader"],"mappings":"AAAA;;;;QAWgBA,uBAAuB,GAAvBA,uBAAuB;AAXH,IAAA,gBAAmB,WAAnB,mBAAmB,CAAA;AAGvD,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,yCAAyC,CAAC,AAAsB,AAAC;AAEhG,MAAMC,aAAa,GAAG,mBAAmB,AAAC;AAC1C,MAAMC,eAAe,GAAG,kBAAkB,AAAC;AAC3C,MAAMC,mBAAmB,GAAG,OAAO,AAAC;AACpC,MAAMC,qBAAqB,GAAG,YAAY,AAAC;AAC3C,MAAMC,2BAA2B,GAAG,eAAe,AAAC;AAE7C,SAASP,uBAAuB,CAACQ,GAAkB,EAAE;IAC1D,MAAMC,EAAE,GAAGD,GAAG,CAACE,OAAO,CAAC,YAAY,CAAC,AAAC;IACrC,MAAMC,GAAG,GAAGH,GAAG,CAACG,GAAG,AAAC;IAEpB,uEAAuE;IACvE,0DAA0D;IAC1D,IAAI,CAACA,GAAG,IAAKF,EAAE,IAAI,CAACA,EAAE,CAACG,QAAQ,CAAC,YAAY,CAAC,AAAC,EAAE;QAC9C,qFAAqF;QACrF,uBAAuB;QACvB,OAAO,KAAK,CAAC;KACd;IAED,OAAO;QACLT,aAAa;QACbC,eAAe;QACfC,mBAAmB;QACnBC,qBAAqB;QACrBC,2BAA2B;KAC5B,CAACK,QAAQ,CAACD,GAAG,CAAC,CAAC;CACjB;AAMM,MAAME,yBAAyB;IACpCC,YACUC,eAIU,CAClB;aALQA,eAIU,GAJVA,eAIU;KAChB;IACJC,UAAU,GAAG;QACX,OAAO,CAACR,GAAkB,EAAES,GAAmB,EAAEC,IAAS,GAAK;YAC7D,MAAMC,QAAQ,GAAGC,CAAAA,GAAAA,gBAAmB,AAAK,CAAA,oBAAL,CAACZ,GAAG,CAAC,AAAC;YAE1C,IAAI,CAACW,QAAQ,IAAIA,QAAQ,KAAK,KAAK,EAAE;gBACnC,IAAInB,uBAAuB,CAACQ,GAAG,CAAC,EAAE;oBAChCP,KAAK,CAAC,0BAA0B,EAAEO,GAAG,CAACG,GAAG,EAAE,KAAK,EAAEH,GAAG,CAACE,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;oBAC7E,OAAOQ,IAAI,EAAE,CAAC;iBACf;gBACD,sEAAsE;gBACtE,kDAAkD;gBAClD,OAAO,IAAI,CAACH,eAAe,CAACP,GAAG,EAAES,GAAG,EAAEC,IAAI,CAAC,CAAC;aAC7C;YAED,OAAOA,IAAI,EAAE,CAAC;SACf,CAAC;KACH;CACF;QAzBYL,yBAAyB,GAAzBA,yBAAyB"}
@@ -2,10 +2,15 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
+ exports.getWorkspaceRoot = getWorkspaceRoot;
6
+ exports.getMetroServerRoot = getMetroServerRoot;
5
7
  exports.DEVELOPER_TOOL = void 0;
6
8
  var _config = require("@expo/config");
9
+ var _findYarnWorkspaceRoot = _interopRequireDefault(require("find-yarn-workspace-root"));
10
+ var _path = _interopRequireDefault(require("path"));
7
11
  var _url = require("url");
8
12
  var Log = _interopRequireWildcard(require("../../../log"));
13
+ var _env = require("../../../utils/env");
9
14
  var _url1 = require("../../../utils/url");
10
15
  var ProjectDevices = _interopRequireWildcard(require("../../project/devices"));
11
16
  var _platformBundlers = require("../platformBundlers");
@@ -14,6 +19,11 @@ var _expoMiddleware = require("./ExpoMiddleware");
14
19
  var _resolveAssets = require("./resolveAssets");
15
20
  var _resolveEntryPoint = require("./resolveEntryPoint");
16
21
  var _resolvePlatform = require("./resolvePlatform");
22
+ function _interopRequireDefault(obj) {
23
+ return obj && obj.__esModule ? obj : {
24
+ default: obj
25
+ };
26
+ }
17
27
  function _interopRequireWildcard(obj) {
18
28
  if (obj && obj.__esModule) {
19
29
  return obj;
@@ -35,6 +45,24 @@ function _interopRequireWildcard(obj) {
35
45
  return newObj;
36
46
  }
37
47
  }
48
+ const debug = require("debug")("expo:start:server:middleware:manifest");
49
+ function getWorkspaceRoot(projectRoot) {
50
+ try {
51
+ return (0, _findYarnWorkspaceRoot).default(projectRoot);
52
+ } catch (error) {
53
+ if (error.message.includes("Unexpected end of JSON input")) {
54
+ return null;
55
+ }
56
+ throw error;
57
+ }
58
+ }
59
+ function getMetroServerRoot(projectRoot) {
60
+ if (_env.env.EXPO_USE_METRO_WORKSPACE_ROOT) {
61
+ var ref;
62
+ return (ref = getWorkspaceRoot(projectRoot)) != null ? ref : projectRoot;
63
+ }
64
+ return projectRoot;
65
+ }
38
66
  const DEVELOPER_TOOL = "expo-cli";
39
67
  exports.DEVELOPER_TOOL = DEVELOPER_TOOL;
40
68
  class ManifestMiddleware extends _expoMiddleware.ExpoMiddleware {
@@ -79,7 +107,8 @@ class ManifestMiddleware extends _expoMiddleware.ExpoMiddleware {
79
107
  };
80
108
  }
81
109
  /** Get the main entry module ID (file) relative to the project root. */ resolveMainModuleName(projectConfig, platform) {
82
- let entryPoint = (0, _resolveEntryPoint).resolveEntryPoint(this.projectRoot, platform, projectConfig);
110
+ let entryPoint = _path.default.relative(getMetroServerRoot(this.projectRoot), (0, _resolveEntryPoint).resolveAbsoluteEntryPoint(this.projectRoot, platform, projectConfig));
111
+ debug(`Resolved entry point: ${entryPoint} (project root: ${this.projectRoot})`);
83
112
  // NOTE(Bacon): Webpack is currently hardcoded to index.bundle on native
84
113
  // in the future (TODO) we should move this logic into a Webpack plugin and use
85
114
  // a generated file name like we do on web.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/middleware/ManifestMiddleware.ts"],"sourcesContent":["import { ExpoConfig, ExpoGoConfig, getConfig, ProjectConfig } from '@expo/config';\nimport { resolve } from 'url';\n\nimport * as Log from '../../../log';\nimport { stripExtension } from '../../../utils/url';\nimport * as ProjectDevices from '../../project/devices';\nimport { UrlCreator } from '../UrlCreator';\nimport { getPlatformBundlers } from '../platformBundlers';\nimport { createTemplateHtmlFromExpoConfigAsync } from '../webTemplate';\nimport { ExpoMiddleware } from './ExpoMiddleware';\nimport { resolveGoogleServicesFile, resolveManifestAssets } from './resolveAssets';\nimport { resolveEntryPoint } from './resolveEntryPoint';\nimport { parsePlatformHeader, RuntimePlatform } from './resolvePlatform';\nimport { ServerHeaders, ServerNext, ServerRequest, ServerResponse } from './server.types';\n\n/** Info about the computer hosting the dev server. */\nexport interface HostInfo {\n host: string;\n server: 'expo';\n serverVersion: string;\n serverDriver: string | null;\n serverOS: NodeJS.Platform;\n serverOSVersion: string;\n}\n\n/** Parsed values from the supported request headers. */\nexport interface ManifestRequestInfo {\n /** Should return the signed manifest. */\n acceptSignature: boolean;\n /** Platform to serve. */\n platform: RuntimePlatform;\n /** Requested host name. */\n hostname?: string | null;\n}\n\n/** Project related info. */\nexport type ResponseProjectSettings = {\n expoGoConfig: ExpoGoConfig;\n hostUri: string;\n bundleUrl: string;\n exp: ExpoConfig;\n};\n\nexport const DEVELOPER_TOOL = 'expo-cli';\n\nexport type ManifestMiddlewareOptions = {\n /** Should start the dev servers in development mode (minify). */\n mode?: 'development' | 'production';\n /** Should instruct the bundler to create minified bundles. */\n minify?: boolean;\n constructUrl: UrlCreator['constructUrl'];\n isNativeWebpack?: boolean;\n privateKeyPath?: string;\n};\n\n/** Base middleware creator for serving the Expo manifest (like the index.html but for native runtimes). */\nexport abstract class ManifestMiddleware<\n TManifestRequestInfo extends ManifestRequestInfo\n> extends ExpoMiddleware {\n private initialProjectConfig: ProjectConfig;\n\n constructor(protected projectRoot: string, protected options: ManifestMiddlewareOptions) {\n super(\n projectRoot,\n /**\n * Only support `/`, `/manifest`, `/index.exp` for the manifest middleware.\n */\n ['/', '/manifest', '/index.exp']\n );\n this.initialProjectConfig = getConfig(projectRoot);\n }\n\n /** Exposed for testing. */\n public async _resolveProjectSettingsAsync({\n platform,\n hostname,\n }: Pick<TManifestRequestInfo, 'hostname' | 'platform'>): Promise<ResponseProjectSettings> {\n // Read the config\n const projectConfig = getConfig(this.projectRoot);\n\n // Read from headers\n const mainModuleName = this.resolveMainModuleName(projectConfig, platform);\n\n // Create the manifest and set fields within it\n const expoGoConfig = this.getExpoGoConfig({\n mainModuleName,\n hostname,\n });\n\n const hostUri = this.options.constructUrl({ scheme: '', hostname });\n\n const bundleUrl = this._getBundleUrl({\n platform,\n mainModuleName,\n hostname,\n });\n\n // Resolve all assets and set them on the manifest as URLs\n await this.mutateManifestWithAssetsAsync(projectConfig.exp, bundleUrl);\n\n return {\n expoGoConfig,\n hostUri,\n bundleUrl,\n exp: projectConfig.exp,\n };\n }\n\n /** Get the main entry module ID (file) relative to the project root. */\n private resolveMainModuleName(projectConfig: ProjectConfig, platform: string): string {\n let entryPoint = resolveEntryPoint(this.projectRoot, platform, projectConfig);\n // NOTE(Bacon): Webpack is currently hardcoded to index.bundle on native\n // in the future (TODO) we should move this logic into a Webpack plugin and use\n // a generated file name like we do on web.\n // const server = getDefaultDevServer();\n // // TODO: Move this into BundlerDevServer and read this info from self.\n // const isNativeWebpack = server instanceof WebpackBundlerDevServer && server.isTargetingNative();\n if (this.options.isNativeWebpack) {\n entryPoint = 'index.js';\n }\n\n return stripExtension(entryPoint, 'js');\n }\n\n /** Parse request headers into options. */\n public abstract getParsedHeaders(req: ServerRequest): TManifestRequestInfo;\n\n /** Store device IDs that were sent in the request headers. */\n private async saveDevicesAsync(req: ServerRequest) {\n const deviceIds = req.headers?.['expo-dev-client-id'];\n if (deviceIds) {\n await ProjectDevices.saveDevicesAsync(this.projectRoot, deviceIds).catch((e) =>\n Log.exception(e)\n );\n }\n }\n\n /** Create the bundle URL (points to the single JS entry file). Exposed for testing. */\n public _getBundleUrl({\n platform,\n mainModuleName,\n hostname,\n }: {\n platform: string;\n hostname?: string | null;\n mainModuleName: string;\n }): string {\n const path = this._getBundleUrlPath({ platform, mainModuleName });\n\n return (\n this.options.constructUrl({\n scheme: 'http',\n // hostType: this.options.location.hostType,\n hostname,\n }) + path\n );\n }\n\n public _getBundleUrlPath({\n platform,\n mainModuleName,\n }: {\n platform: string;\n mainModuleName: string;\n }): string {\n const queryParams = new URLSearchParams({\n platform: encodeURIComponent(platform),\n dev: String(this.options.mode !== 'production'),\n // TODO: Is this still needed?\n hot: String(false),\n });\n\n if (this.options.minify) {\n queryParams.append('minify', String(this.options.minify));\n }\n\n return `/${encodeURI(mainModuleName)}.bundle?${queryParams.toString()}`;\n }\n\n /** Log telemetry. */\n protected abstract trackManifest(version?: string): void;\n\n /** Get the manifest response to return to the runtime. This file contains info regarding where the assets can be loaded from. Exposed for testing. */\n public abstract _getManifestResponseAsync(options: TManifestRequestInfo): Promise<{\n body: string;\n version: string;\n headers: ServerHeaders;\n }>;\n\n private getExpoGoConfig({\n mainModuleName,\n hostname,\n }: {\n mainModuleName: string;\n hostname?: string | null;\n }): ExpoGoConfig {\n return {\n // localhost:19000\n debuggerHost: this.options.constructUrl({ scheme: '', hostname }),\n // http://localhost:19000/logs -- used to send logs to the CLI for displaying in the terminal.\n // This is deprecated in favor of the WebSocket connection setup in Metro.\n logUrl: this.options.constructUrl({ scheme: 'http', hostname }) + '/logs',\n // Required for Expo Go to function.\n developer: {\n tool: DEVELOPER_TOOL,\n projectRoot: this.projectRoot,\n },\n packagerOpts: {\n // Required for dev client.\n dev: this.options.mode !== 'production',\n },\n // Indicates the name of the main bundle.\n mainModuleName,\n // Add this string to make Flipper register React Native / Metro as \"running\".\n // Can be tested by running:\n // `METRO_SERVER_PORT=19000 open -a flipper.app`\n // Where 19000 is the port where the Expo project is being hosted.\n __flipperHack: 'React Native packager is running',\n };\n }\n\n /** Resolve all assets and set them on the manifest as URLs */\n private async mutateManifestWithAssetsAsync(manifest: ExpoConfig, bundleUrl: string) {\n await resolveManifestAssets(this.projectRoot, {\n manifest,\n resolver: async (path) => {\n if (this.options.isNativeWebpack) {\n // When using our custom dev server, just do assets normally\n // without the `assets/` subpath redirect.\n return resolve(bundleUrl!.match(/^https?:\\/\\/.*?\\//)![0], path);\n }\n return bundleUrl!.match(/^https?:\\/\\/.*?\\//)![0] + 'assets/' + path;\n },\n });\n // The server normally inserts this but if we're offline we'll do it here\n await resolveGoogleServicesFile(this.projectRoot, manifest);\n }\n\n /**\n * Web platforms should create an index.html response using the same script resolution as native.\n *\n * Instead of adding a `bundleUrl` to a `manifest.json` (native) we'll add a `<script src=\"\">`\n * to an `index.html`, this enables the web platform to load JavaScript from the server.\n */\n private async handleWebRequestAsync(req: ServerRequest, res: ServerResponse) {\n const platform = 'web';\n // Read from headers\n const mainModuleName = this.resolveMainModuleName(this.initialProjectConfig, platform);\n const bundleUrl = this._getBundleUrlPath({\n platform,\n mainModuleName,\n });\n\n res.setHeader('Content-Type', 'text/html');\n\n res.end(\n await createTemplateHtmlFromExpoConfigAsync(this.projectRoot, {\n exp: this.initialProjectConfig.exp,\n scripts: [bundleUrl],\n })\n );\n }\n\n /** Exposed for testing. */\n async checkBrowserRequestAsync(req: ServerRequest, res: ServerResponse) {\n // Read the config\n const bundlers = getPlatformBundlers(this.initialProjectConfig.exp);\n if (bundlers.web === 'metro') {\n // NOTE(EvanBacon): This effectively disables the safety check we do on custom runtimes to ensure\n // the `expo-platform` header is included. When `web.bundler=web`, if the user has non-standard Expo\n // code loading then they'll get a web bundle without a clear assertion of platform support.\n const platform = parsePlatformHeader(req);\n // On web, serve the public folder\n if (!platform || platform === 'web') {\n await this.handleWebRequestAsync(req, res);\n return true;\n }\n }\n return false;\n }\n\n async handleRequestAsync(\n req: ServerRequest,\n res: ServerResponse,\n next: ServerNext\n ): Promise<void> {\n // First check for standard JavaScript runtimes (aka legacy browsers like Chrome).\n if (await this.checkBrowserRequestAsync(req, res)) {\n return;\n }\n\n // Save device IDs for dev client.\n await this.saveDevicesAsync(req);\n\n // Read from headers\n const options = this.getParsedHeaders(req);\n const { body, version, headers } = await this._getManifestResponseAsync(options);\n for (const [headerName, headerValue] of headers) {\n res.setHeader(headerName, headerValue);\n }\n res.end(body);\n\n // Log analytics\n this.trackManifest(version ?? null);\n }\n}\n"],"names":["Log","ProjectDevices","DEVELOPER_TOOL","ManifestMiddleware","ExpoMiddleware","constructor","projectRoot","options","initialProjectConfig","getConfig","_resolveProjectSettingsAsync","platform","hostname","projectConfig","mainModuleName","resolveMainModuleName","expoGoConfig","getExpoGoConfig","hostUri","constructUrl","scheme","bundleUrl","_getBundleUrl","mutateManifestWithAssetsAsync","exp","entryPoint","resolveEntryPoint","isNativeWebpack","stripExtension","saveDevicesAsync","req","deviceIds","headers","catch","e","exception","path","_getBundleUrlPath","queryParams","URLSearchParams","encodeURIComponent","dev","String","mode","hot","minify","append","encodeURI","toString","debuggerHost","logUrl","developer","tool","packagerOpts","__flipperHack","manifest","resolveManifestAssets","resolver","resolve","match","resolveGoogleServicesFile","handleWebRequestAsync","res","setHeader","end","createTemplateHtmlFromExpoConfigAsync","scripts","checkBrowserRequestAsync","bundlers","getPlatformBundlers","web","parsePlatformHeader","handleRequestAsync","next","getParsedHeaders","body","version","_getManifestResponseAsync","headerName","headerValue","trackManifest"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/server/middleware/ManifestMiddleware.ts"],"sourcesContent":["import { ExpoConfig, ExpoGoConfig, getConfig, ProjectConfig } from '@expo/config';\nimport findWorkspaceRoot from 'find-yarn-workspace-root';\nimport path from 'path';\nimport { resolve } from 'url';\n\nimport * as Log from '../../../log';\nimport { env } from '../../../utils/env';\nimport { stripExtension } from '../../../utils/url';\nimport * as ProjectDevices from '../../project/devices';\nimport { UrlCreator } from '../UrlCreator';\nimport { getPlatformBundlers } from '../platformBundlers';\nimport { createTemplateHtmlFromExpoConfigAsync } from '../webTemplate';\nimport { ExpoMiddleware } from './ExpoMiddleware';\nimport { resolveGoogleServicesFile, resolveManifestAssets } from './resolveAssets';\nimport { resolveAbsoluteEntryPoint } from './resolveEntryPoint';\nimport { parsePlatformHeader, RuntimePlatform } from './resolvePlatform';\nimport { ServerHeaders, ServerNext, ServerRequest, ServerResponse } from './server.types';\n\nconst debug = require('debug')('expo:start:server:middleware:manifest') as typeof console.log;\n\n/** Wraps `findWorkspaceRoot` and guards against having an empty `package.json` file in an upper directory. */\nexport function getWorkspaceRoot(projectRoot: string): string | null {\n try {\n return findWorkspaceRoot(projectRoot);\n } catch (error: any) {\n if (error.message.includes('Unexpected end of JSON input')) {\n return null;\n }\n throw error;\n }\n}\n\nexport function getMetroServerRoot(projectRoot: string) {\n if (env.EXPO_USE_METRO_WORKSPACE_ROOT) {\n return getWorkspaceRoot(projectRoot) ?? projectRoot;\n }\n\n return projectRoot;\n}\n\n/** Info about the computer hosting the dev server. */\nexport interface HostInfo {\n host: string;\n server: 'expo';\n serverVersion: string;\n serverDriver: string | null;\n serverOS: NodeJS.Platform;\n serverOSVersion: string;\n}\n\n/** Parsed values from the supported request headers. */\nexport interface ManifestRequestInfo {\n /** Should return the signed manifest. */\n acceptSignature: boolean;\n /** Platform to serve. */\n platform: RuntimePlatform;\n /** Requested host name. */\n hostname?: string | null;\n}\n\n/** Project related info. */\nexport type ResponseProjectSettings = {\n expoGoConfig: ExpoGoConfig;\n hostUri: string;\n bundleUrl: string;\n exp: ExpoConfig;\n};\n\nexport const DEVELOPER_TOOL = 'expo-cli';\n\nexport type ManifestMiddlewareOptions = {\n /** Should start the dev servers in development mode (minify). */\n mode?: 'development' | 'production';\n /** Should instruct the bundler to create minified bundles. */\n minify?: boolean;\n constructUrl: UrlCreator['constructUrl'];\n isNativeWebpack?: boolean;\n privateKeyPath?: string;\n};\n\n/** Base middleware creator for serving the Expo manifest (like the index.html but for native runtimes). */\nexport abstract class ManifestMiddleware<\n TManifestRequestInfo extends ManifestRequestInfo\n> extends ExpoMiddleware {\n private initialProjectConfig: ProjectConfig;\n\n constructor(protected projectRoot: string, protected options: ManifestMiddlewareOptions) {\n super(\n projectRoot,\n /**\n * Only support `/`, `/manifest`, `/index.exp` for the manifest middleware.\n */\n ['/', '/manifest', '/index.exp']\n );\n this.initialProjectConfig = getConfig(projectRoot);\n }\n\n /** Exposed for testing. */\n public async _resolveProjectSettingsAsync({\n platform,\n hostname,\n }: Pick<TManifestRequestInfo, 'hostname' | 'platform'>): Promise<ResponseProjectSettings> {\n // Read the config\n const projectConfig = getConfig(this.projectRoot);\n\n // Read from headers\n const mainModuleName = this.resolveMainModuleName(projectConfig, platform);\n\n // Create the manifest and set fields within it\n const expoGoConfig = this.getExpoGoConfig({\n mainModuleName,\n hostname,\n });\n\n const hostUri = this.options.constructUrl({ scheme: '', hostname });\n\n const bundleUrl = this._getBundleUrl({\n platform,\n mainModuleName,\n hostname,\n });\n\n // Resolve all assets and set them on the manifest as URLs\n await this.mutateManifestWithAssetsAsync(projectConfig.exp, bundleUrl);\n\n return {\n expoGoConfig,\n hostUri,\n bundleUrl,\n exp: projectConfig.exp,\n };\n }\n\n /** Get the main entry module ID (file) relative to the project root. */\n private resolveMainModuleName(projectConfig: ProjectConfig, platform: string): string {\n let entryPoint = path.relative(\n getMetroServerRoot(this.projectRoot),\n resolveAbsoluteEntryPoint(this.projectRoot, platform, projectConfig)\n );\n\n debug(`Resolved entry point: ${entryPoint} (project root: ${this.projectRoot})`);\n\n // NOTE(Bacon): Webpack is currently hardcoded to index.bundle on native\n // in the future (TODO) we should move this logic into a Webpack plugin and use\n // a generated file name like we do on web.\n // const server = getDefaultDevServer();\n // // TODO: Move this into BundlerDevServer and read this info from self.\n // const isNativeWebpack = server instanceof WebpackBundlerDevServer && server.isTargetingNative();\n if (this.options.isNativeWebpack) {\n entryPoint = 'index.js';\n }\n\n return stripExtension(entryPoint, 'js');\n }\n\n /** Parse request headers into options. */\n public abstract getParsedHeaders(req: ServerRequest): TManifestRequestInfo;\n\n /** Store device IDs that were sent in the request headers. */\n private async saveDevicesAsync(req: ServerRequest) {\n const deviceIds = req.headers?.['expo-dev-client-id'];\n if (deviceIds) {\n await ProjectDevices.saveDevicesAsync(this.projectRoot, deviceIds).catch((e) =>\n Log.exception(e)\n );\n }\n }\n\n /** Create the bundle URL (points to the single JS entry file). Exposed for testing. */\n public _getBundleUrl({\n platform,\n mainModuleName,\n hostname,\n }: {\n platform: string;\n hostname?: string | null;\n mainModuleName: string;\n }): string {\n const path = this._getBundleUrlPath({ platform, mainModuleName });\n\n return (\n this.options.constructUrl({\n scheme: 'http',\n // hostType: this.options.location.hostType,\n hostname,\n }) + path\n );\n }\n\n public _getBundleUrlPath({\n platform,\n mainModuleName,\n }: {\n platform: string;\n mainModuleName: string;\n }): string {\n const queryParams = new URLSearchParams({\n platform: encodeURIComponent(platform),\n dev: String(this.options.mode !== 'production'),\n // TODO: Is this still needed?\n hot: String(false),\n });\n\n if (this.options.minify) {\n queryParams.append('minify', String(this.options.minify));\n }\n\n return `/${encodeURI(mainModuleName)}.bundle?${queryParams.toString()}`;\n }\n\n /** Log telemetry. */\n protected abstract trackManifest(version?: string): void;\n\n /** Get the manifest response to return to the runtime. This file contains info regarding where the assets can be loaded from. Exposed for testing. */\n public abstract _getManifestResponseAsync(options: TManifestRequestInfo): Promise<{\n body: string;\n version: string;\n headers: ServerHeaders;\n }>;\n\n private getExpoGoConfig({\n mainModuleName,\n hostname,\n }: {\n mainModuleName: string;\n hostname?: string | null;\n }): ExpoGoConfig {\n return {\n // localhost:19000\n debuggerHost: this.options.constructUrl({ scheme: '', hostname }),\n // http://localhost:19000/logs -- used to send logs to the CLI for displaying in the terminal.\n // This is deprecated in favor of the WebSocket connection setup in Metro.\n logUrl: this.options.constructUrl({ scheme: 'http', hostname }) + '/logs',\n // Required for Expo Go to function.\n developer: {\n tool: DEVELOPER_TOOL,\n projectRoot: this.projectRoot,\n },\n packagerOpts: {\n // Required for dev client.\n dev: this.options.mode !== 'production',\n },\n // Indicates the name of the main bundle.\n mainModuleName,\n // Add this string to make Flipper register React Native / Metro as \"running\".\n // Can be tested by running:\n // `METRO_SERVER_PORT=19000 open -a flipper.app`\n // Where 19000 is the port where the Expo project is being hosted.\n __flipperHack: 'React Native packager is running',\n };\n }\n\n /** Resolve all assets and set them on the manifest as URLs */\n private async mutateManifestWithAssetsAsync(manifest: ExpoConfig, bundleUrl: string) {\n await resolveManifestAssets(this.projectRoot, {\n manifest,\n resolver: async (path) => {\n if (this.options.isNativeWebpack) {\n // When using our custom dev server, just do assets normally\n // without the `assets/` subpath redirect.\n return resolve(bundleUrl!.match(/^https?:\\/\\/.*?\\//)![0], path);\n }\n return bundleUrl!.match(/^https?:\\/\\/.*?\\//)![0] + 'assets/' + path;\n },\n });\n // The server normally inserts this but if we're offline we'll do it here\n await resolveGoogleServicesFile(this.projectRoot, manifest);\n }\n\n /**\n * Web platforms should create an index.html response using the same script resolution as native.\n *\n * Instead of adding a `bundleUrl` to a `manifest.json` (native) we'll add a `<script src=\"\">`\n * to an `index.html`, this enables the web platform to load JavaScript from the server.\n */\n private async handleWebRequestAsync(req: ServerRequest, res: ServerResponse) {\n const platform = 'web';\n // Read from headers\n const mainModuleName = this.resolveMainModuleName(this.initialProjectConfig, platform);\n const bundleUrl = this._getBundleUrlPath({\n platform,\n mainModuleName,\n });\n\n res.setHeader('Content-Type', 'text/html');\n\n res.end(\n await createTemplateHtmlFromExpoConfigAsync(this.projectRoot, {\n exp: this.initialProjectConfig.exp,\n scripts: [bundleUrl],\n })\n );\n }\n\n /** Exposed for testing. */\n async checkBrowserRequestAsync(req: ServerRequest, res: ServerResponse) {\n // Read the config\n const bundlers = getPlatformBundlers(this.initialProjectConfig.exp);\n if (bundlers.web === 'metro') {\n // NOTE(EvanBacon): This effectively disables the safety check we do on custom runtimes to ensure\n // the `expo-platform` header is included. When `web.bundler=web`, if the user has non-standard Expo\n // code loading then they'll get a web bundle without a clear assertion of platform support.\n const platform = parsePlatformHeader(req);\n // On web, serve the public folder\n if (!platform || platform === 'web') {\n await this.handleWebRequestAsync(req, res);\n return true;\n }\n }\n return false;\n }\n\n async handleRequestAsync(\n req: ServerRequest,\n res: ServerResponse,\n next: ServerNext\n ): Promise<void> {\n // First check for standard JavaScript runtimes (aka legacy browsers like Chrome).\n if (await this.checkBrowserRequestAsync(req, res)) {\n return;\n }\n\n // Save device IDs for dev client.\n await this.saveDevicesAsync(req);\n\n // Read from headers\n const options = this.getParsedHeaders(req);\n const { body, version, headers } = await this._getManifestResponseAsync(options);\n for (const [headerName, headerValue] of headers) {\n res.setHeader(headerName, headerValue);\n }\n res.end(body);\n\n // Log analytics\n this.trackManifest(version ?? null);\n }\n}\n"],"names":["getWorkspaceRoot","getMetroServerRoot","Log","ProjectDevices","debug","require","projectRoot","findWorkspaceRoot","error","message","includes","env","EXPO_USE_METRO_WORKSPACE_ROOT","DEVELOPER_TOOL","ManifestMiddleware","ExpoMiddleware","constructor","options","initialProjectConfig","getConfig","_resolveProjectSettingsAsync","platform","hostname","projectConfig","mainModuleName","resolveMainModuleName","expoGoConfig","getExpoGoConfig","hostUri","constructUrl","scheme","bundleUrl","_getBundleUrl","mutateManifestWithAssetsAsync","exp","entryPoint","path","relative","resolveAbsoluteEntryPoint","isNativeWebpack","stripExtension","saveDevicesAsync","req","deviceIds","headers","catch","e","exception","_getBundleUrlPath","queryParams","URLSearchParams","encodeURIComponent","dev","String","mode","hot","minify","append","encodeURI","toString","debuggerHost","logUrl","developer","tool","packagerOpts","__flipperHack","manifest","resolveManifestAssets","resolver","resolve","match","resolveGoogleServicesFile","handleWebRequestAsync","res","setHeader","end","createTemplateHtmlFromExpoConfigAsync","scripts","checkBrowserRequestAsync","bundlers","getPlatformBundlers","web","parsePlatformHeader","handleRequestAsync","next","getParsedHeaders","body","version","_getManifestResponseAsync","headerName","headerValue","trackManifest"],"mappings":"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"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
5
  exports.resolveEntryPoint = resolveEntryPoint;
6
+ exports.resolveAbsoluteEntryPoint = resolveAbsoluteEntryPoint;
6
7
  var _paths = require("@expo/config/paths");
7
8
  var _chalk = _interopRequireDefault(require("chalk"));
8
9
  var _path = _interopRequireDefault(require("path"));
@@ -19,6 +20,9 @@ const supportedPlatforms = [
19
20
  "none"
20
21
  ];
21
22
  function resolveEntryPoint(projectRoot, platform, projectConfig) {
23
+ return _path.default.relative(projectRoot, resolveAbsoluteEntryPoint(projectRoot, platform, projectConfig));
24
+ }
25
+ function resolveAbsoluteEntryPoint(projectRoot, platform, projectConfig) {
22
26
  if (platform && !supportedPlatforms.includes(platform)) {
23
27
  throw new _errors.CommandError(`Failed to resolve the project's entry file: The platform "${platform}" is not supported.`);
24
28
  }
@@ -32,7 +36,7 @@ function resolveEntryPoint(projectRoot, platform, projectConfig) {
32
36
  // NOTE(Bacon): I purposefully don't mention all possible resolutions here since the package.json is the most standard and users should opt towards that.
33
37
  throw new _errors.CommandError(_chalk.default`The project entry file could not be resolved. Please define it in the {bold package.json} "main" field.`);
34
38
  }
35
- return _path.default.relative(projectRoot, entry);
39
+ return entry;
36
40
  }
37
41
 
38
42
  //# sourceMappingURL=resolveEntryPoint.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/middleware/resolveEntryPoint.ts"],"sourcesContent":["import { ProjectConfig } from '@expo/config';\nimport { getEntryPoint } from '@expo/config/paths';\nimport chalk from 'chalk';\nimport path from 'path';\n\nimport { CommandError } from '../../../utils/errors';\n\nconst supportedPlatforms = ['ios', 'android', 'web', 'none'];\n\n/** Returns the relative entry file for the project. */\nexport function resolveEntryPoint(\n projectRoot: string,\n platform?: string,\n projectConfig?: ProjectConfig\n): string {\n if (platform && !supportedPlatforms.includes(platform)) {\n throw new CommandError(\n `Failed to resolve the project's entry file: The platform \"${platform}\" is not supported.`\n );\n }\n // TODO(Bacon): support platform extension resolution like .ios, .native\n // const platforms = [platform, 'native'].filter(Boolean) as string[];\n const platforms: string[] = [];\n\n const entry = getEntryPoint(projectRoot, ['./index'], platforms, projectConfig);\n if (!entry) {\n // NOTE(Bacon): I purposefully don't mention all possible resolutions here since the package.json is the most standard and users should opt towards that.\n throw new CommandError(\n chalk`The project entry file could not be resolved. Please define it in the {bold package.json} \"main\" field.`\n );\n }\n\n return path.relative(projectRoot, entry);\n}\n"],"names":["resolveEntryPoint","supportedPlatforms","projectRoot","platform","projectConfig","includes","CommandError","platforms","entry","getEntryPoint","chalk","path","relative"],"mappings":"AAAA;;;;QAUgBA,iBAAiB,GAAjBA,iBAAiB;AATH,IAAA,MAAoB,WAApB,oBAAoB,CAAA;AAChC,IAAA,MAAO,kCAAP,OAAO,EAAA;AACR,IAAA,KAAM,kCAAN,MAAM,EAAA;AAEM,IAAA,OAAuB,WAAvB,uBAAuB,CAAA;;;;;;AAEpD,MAAMC,kBAAkB,GAAG;IAAC,KAAK;IAAE,SAAS;IAAE,KAAK;IAAE,MAAM;CAAC,AAAC;AAGtD,SAASD,iBAAiB,CAC/BE,WAAmB,EACnBC,QAAiB,EACjBC,aAA6B,EACrB;IACR,IAAID,QAAQ,IAAI,CAACF,kBAAkB,CAACI,QAAQ,CAACF,QAAQ,CAAC,EAAE;QACtD,MAAM,IAAIG,OAAY,aAAA,CACpB,CAAC,0DAA0D,EAAEH,QAAQ,CAAC,mBAAmB,CAAC,CAC3F,CAAC;KACH;IACD,wEAAwE;IACxE,sEAAsE;IACtE,MAAMI,SAAS,GAAa,EAAE,AAAC;IAE/B,MAAMC,KAAK,GAAGC,CAAAA,GAAAA,MAAa,AAAoD,CAAA,cAApD,CAACP,WAAW,EAAE;QAAC,SAAS;KAAC,EAAEK,SAAS,EAAEH,aAAa,CAAC,AAAC;IAChF,IAAI,CAACI,KAAK,EAAE;QACV,yJAAyJ;QACzJ,MAAM,IAAIF,OAAY,aAAA,CACpBI,MAAK,QAAA,CAAC,uGAAuG,CAAC,CAC/G,CAAC;KACH;IAED,OAAOC,KAAI,QAAA,CAACC,QAAQ,CAACV,WAAW,EAAEM,KAAK,CAAC,CAAC;CAC1C"}
1
+ {"version":3,"sources":["../../../../../src/start/server/middleware/resolveEntryPoint.ts"],"sourcesContent":["import { ProjectConfig } from '@expo/config';\nimport { getEntryPoint } from '@expo/config/paths';\nimport chalk from 'chalk';\nimport path from 'path';\n\nimport { CommandError } from '../../../utils/errors';\n\nconst supportedPlatforms = ['ios', 'android', 'web', 'none'];\n\n/** @returns the relative entry file for the project. */\nexport function resolveEntryPoint(\n projectRoot: string,\n platform?: string,\n projectConfig?: ProjectConfig\n): string {\n return path.relative(\n projectRoot,\n resolveAbsoluteEntryPoint(projectRoot, platform, projectConfig)\n );\n}\n\n/** @returns the absolute entry file for the project. */\nexport function resolveAbsoluteEntryPoint(\n projectRoot: string,\n platform?: string,\n projectConfig?: ProjectConfig\n): string {\n if (platform && !supportedPlatforms.includes(platform)) {\n throw new CommandError(\n `Failed to resolve the project's entry file: The platform \"${platform}\" is not supported.`\n );\n }\n // TODO(Bacon): support platform extension resolution like .ios, .native\n // const platforms = [platform, 'native'].filter(Boolean) as string[];\n const platforms: string[] = [];\n\n const entry = getEntryPoint(projectRoot, ['./index'], platforms, projectConfig);\n if (!entry) {\n // NOTE(Bacon): I purposefully don't mention all possible resolutions here since the package.json is the most standard and users should opt towards that.\n throw new CommandError(\n chalk`The project entry file could not be resolved. Please define it in the {bold package.json} \"main\" field.`\n );\n }\n\n return entry;\n}\n"],"names":["resolveEntryPoint","resolveAbsoluteEntryPoint","supportedPlatforms","projectRoot","platform","projectConfig","path","relative","includes","CommandError","platforms","entry","getEntryPoint","chalk"],"mappings":"AAAA;;;;QAUgBA,iBAAiB,GAAjBA,iBAAiB;QAYjBC,yBAAyB,GAAzBA,yBAAyB;AArBX,IAAA,MAAoB,WAApB,oBAAoB,CAAA;AAChC,IAAA,MAAO,kCAAP,OAAO,EAAA;AACR,IAAA,KAAM,kCAAN,MAAM,EAAA;AAEM,IAAA,OAAuB,WAAvB,uBAAuB,CAAA;;;;;;AAEpD,MAAMC,kBAAkB,GAAG;IAAC,KAAK;IAAE,SAAS;IAAE,KAAK;IAAE,MAAM;CAAC,AAAC;AAGtD,SAASF,iBAAiB,CAC/BG,WAAmB,EACnBC,QAAiB,EACjBC,aAA6B,EACrB;IACR,OAAOC,KAAI,QAAA,CAACC,QAAQ,CAClBJ,WAAW,EACXF,yBAAyB,CAACE,WAAW,EAAEC,QAAQ,EAAEC,aAAa,CAAC,CAChE,CAAC;CACH;AAGM,SAASJ,yBAAyB,CACvCE,WAAmB,EACnBC,QAAiB,EACjBC,aAA6B,EACrB;IACR,IAAID,QAAQ,IAAI,CAACF,kBAAkB,CAACM,QAAQ,CAACJ,QAAQ,CAAC,EAAE;QACtD,MAAM,IAAIK,OAAY,aAAA,CACpB,CAAC,0DAA0D,EAAEL,QAAQ,CAAC,mBAAmB,CAAC,CAC3F,CAAC;KACH;IACD,wEAAwE;IACxE,sEAAsE;IACtE,MAAMM,SAAS,GAAa,EAAE,AAAC;IAE/B,MAAMC,KAAK,GAAGC,CAAAA,GAAAA,MAAa,AAAoD,CAAA,cAApD,CAACT,WAAW,EAAE;QAAC,SAAS;KAAC,EAAEO,SAAS,EAAEL,aAAa,CAAC,AAAC;IAChF,IAAI,CAACM,KAAK,EAAE;QACV,yJAAyJ;QACzJ,MAAM,IAAIF,OAAY,aAAA,CACpBI,MAAK,QAAA,CAAC,uGAAuG,CAAC,CAC/G,CAAC;KACH;IAED,OAAOF,KAAK,CAAC;CACd"}
@@ -40,6 +40,7 @@ class FileNotifier {
40
40
  this.projectRoot = projectRoot;
41
41
  this.moduleIds = moduleIds;
42
42
  this.settings = settings;
43
+ this.unsubscribe = null;
43
44
  this.watchFile = (0, _fn).memoize(this.startWatchingFile.bind(this));
44
45
  }
45
46
  /** Get the file in the project. */ resolveFilePath() {
@@ -59,13 +60,21 @@ class FileNotifier {
59
60
  }
60
61
  return configPath;
61
62
  }
63
+ stopObserving() {
64
+ var _obj, ref;
65
+ (ref = (_obj = this).unsubscribe) == null ? void 0 : ref.call(_obj);
66
+ }
62
67
  startWatchingFile(filePath) {
63
68
  const configName = _path.default.relative(this.projectRoot, filePath);
64
- (0, _fs).watchFile(filePath, (cur, prev)=>{
69
+ const listener = (cur, prev)=>{
65
70
  if (prev.size || cur.size) {
66
71
  Log.log(`\u203A Detected a change in ${_chalk.default.bold(configName)}. Restart the server to see the new results.` + (this.settings.additionalWarning || ""));
67
72
  }
68
- });
73
+ };
74
+ const watcher = (0, _fs).watchFile(filePath, listener);
75
+ this.unsubscribe = ()=>{
76
+ watcher.unref();
77
+ };
69
78
  return filePath;
70
79
  }
71
80
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/FileNotifier.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { watchFile } from 'fs';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport * as Log from '../log';\nimport { memoize } from './fn';\n\nconst debug = require('debug')('expo:utils:fileNotifier') as typeof console.log;\n\n/** Observes and reports file changes. */\nexport class FileNotifier {\n constructor(\n /** Project root to resolve the module IDs relative to. */\n private projectRoot: string,\n /** List of module IDs sorted by priority. Only the first file that exists will be observed. */\n private moduleIds: string[],\n private settings: {\n /** An additional warning message to add to the notice. */\n additionalWarning?: string;\n } = {}\n ) {}\n\n /** Get the file in the project. */\n private resolveFilePath(): string | null {\n for (const moduleId of this.moduleIds) {\n const filePath = resolveFrom.silent(this.projectRoot, moduleId);\n if (filePath) {\n return filePath;\n }\n }\n return null;\n }\n\n public startObserving() {\n const configPath = this.resolveFilePath();\n if (configPath) {\n debug(`Observing ${configPath}`);\n return this.watchFile(configPath);\n }\n return configPath;\n }\n\n /** Watch the file and warn to reload the CLI if it changes. */\n public watchFile = memoize(this.startWatchingFile.bind(this));\n\n private startWatchingFile(filePath: string): string {\n const configName = path.relative(this.projectRoot, filePath);\n watchFile(filePath, (cur: any, prev: any) => {\n if (prev.size || cur.size) {\n Log.log(\n `\\u203A Detected a change in ${chalk.bold(\n configName\n )}. Restart the server to see the new results.` + (this.settings.additionalWarning || '')\n );\n }\n });\n return filePath;\n }\n}\n"],"names":["Log","debug","require","FileNotifier","constructor","projectRoot","moduleIds","settings","watchFile","memoize","startWatchingFile","bind","resolveFilePath","moduleId","filePath","resolveFrom","silent","startObserving","configPath","configName","path","relative","cur","prev","size","log","chalk","bold","additionalWarning"],"mappings":"AAAA;;;;AAAkB,IAAA,MAAO,kCAAP,OAAO,EAAA;AACC,IAAA,GAAI,WAAJ,IAAI,CAAA;AACb,IAAA,KAAM,kCAAN,MAAM,EAAA;AACC,IAAA,YAAc,kCAAd,cAAc,EAAA;AAE1BA,IAAAA,GAAG,mCAAM,QAAQ,EAAd;AACS,IAAA,GAAM,WAAN,MAAM,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE9B,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,yBAAyB,CAAC,AAAsB,AAAC;AAGzE,MAAMC,YAAY;IACvBC,YAEUC,WAAmB,EAEnBC,SAAmB,EACnBC,QAGP,GAAG,EAAE,CACN;aAPQF,WAAmB,GAAnBA,WAAmB;aAEnBC,SAAmB,GAAnBA,SAAmB;aACnBC,QAGP,GAHOA,QAGP;aAwBIC,SAAS,GAAGC,CAAAA,GAAAA,GAAO,AAAmC,CAAA,QAAnC,CAAC,IAAI,CAACC,iBAAiB,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC;KAvBzD;IAEJ,mCAAmC,CACnC,AAAQC,eAAe,GAAkB;QACvC,KAAK,MAAMC,QAAQ,IAAI,IAAI,CAACP,SAAS,CAAE;YACrC,MAAMQ,QAAQ,GAAGC,YAAW,QAAA,CAACC,MAAM,CAAC,IAAI,CAACX,WAAW,EAAEQ,QAAQ,CAAC,AAAC;YAChE,IAAIC,QAAQ,EAAE;gBACZ,OAAOA,QAAQ,CAAC;aACjB;SACF;QACD,OAAO,IAAI,CAAC;KACb;IAED,AAAOG,cAAc,GAAG;QACtB,MAAMC,UAAU,GAAG,IAAI,CAACN,eAAe,EAAE,AAAC;QAC1C,IAAIM,UAAU,EAAE;YACdjB,KAAK,CAAC,CAAC,UAAU,EAAEiB,UAAU,CAAC,CAAC,CAAC,CAAC;YACjC,OAAO,IAAI,CAACV,SAAS,CAACU,UAAU,CAAC,CAAC;SACnC;QACD,OAAOA,UAAU,CAAC;KACnB;IAKD,AAAQR,iBAAiB,CAACI,QAAgB,EAAU;QAClD,MAAMK,UAAU,GAAGC,KAAI,QAAA,CAACC,QAAQ,CAAC,IAAI,CAAChB,WAAW,EAAES,QAAQ,CAAC,AAAC;QAC7DN,CAAAA,GAAAA,GAAS,AAQP,CAAA,UARO,CAACM,QAAQ,EAAE,CAACQ,GAAQ,EAAEC,IAAS,GAAK;YAC3C,IAAIA,IAAI,CAACC,IAAI,IAAIF,GAAG,CAACE,IAAI,EAAE;gBACzBxB,GAAG,CAACyB,GAAG,CACL,CAAC,4BAA4B,EAAEC,MAAK,QAAA,CAACC,IAAI,CACvCR,UAAU,CACX,CAAC,4CAA4C,CAAC,GAAG,CAAC,IAAI,CAACZ,QAAQ,CAACqB,iBAAiB,IAAI,EAAE,CAAC,CAC1F,CAAC;aACH;SACF,CAAC,CAAC;QACH,OAAOd,QAAQ,CAAC;KACjB;CACF;QAhDYX,YAAY,GAAZA,YAAY"}
1
+ {"version":3,"sources":["../../../src/utils/FileNotifier.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { watchFile } from 'fs';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport * as Log from '../log';\nimport { memoize } from './fn';\n\nconst debug = require('debug')('expo:utils:fileNotifier') as typeof console.log;\n\n/** Observes and reports file changes. */\nexport class FileNotifier {\n private unsubscribe: (() => void) | null = null;\n constructor(\n /** Project root to resolve the module IDs relative to. */\n private projectRoot: string,\n /** List of module IDs sorted by priority. Only the first file that exists will be observed. */\n private moduleIds: string[],\n private settings: {\n /** An additional warning message to add to the notice. */\n additionalWarning?: string;\n } = {}\n ) {}\n\n /** Get the file in the project. */\n private resolveFilePath(): string | null {\n for (const moduleId of this.moduleIds) {\n const filePath = resolveFrom.silent(this.projectRoot, moduleId);\n if (filePath) {\n return filePath;\n }\n }\n return null;\n }\n\n public startObserving() {\n const configPath = this.resolveFilePath();\n if (configPath) {\n debug(`Observing ${configPath}`);\n return this.watchFile(configPath);\n }\n return configPath;\n }\n\n public stopObserving() {\n this.unsubscribe?.();\n }\n\n /** Watch the file and warn to reload the CLI if it changes. */\n public watchFile = memoize(this.startWatchingFile.bind(this));\n\n private startWatchingFile(filePath: string): string {\n const configName = path.relative(this.projectRoot, filePath);\n const listener = (cur: any, prev: any) => {\n if (prev.size || cur.size) {\n Log.log(\n `\\u203A Detected a change in ${chalk.bold(\n configName\n )}. Restart the server to see the new results.` + (this.settings.additionalWarning || '')\n );\n }\n };\n\n const watcher = watchFile(filePath, listener);\n\n this.unsubscribe = () => {\n watcher.unref();\n };\n\n return filePath;\n }\n}\n"],"names":["Log","debug","require","FileNotifier","constructor","projectRoot","moduleIds","settings","unsubscribe","watchFile","memoize","startWatchingFile","bind","resolveFilePath","moduleId","filePath","resolveFrom","silent","startObserving","configPath","stopObserving","configName","path","relative","listener","cur","prev","size","log","chalk","bold","additionalWarning","watcher","unref"],"mappings":"AAAA;;;;AAAkB,IAAA,MAAO,kCAAP,OAAO,EAAA;AACC,IAAA,GAAI,WAAJ,IAAI,CAAA;AACb,IAAA,KAAM,kCAAN,MAAM,EAAA;AACC,IAAA,YAAc,kCAAd,cAAc,EAAA;AAE1BA,IAAAA,GAAG,mCAAM,QAAQ,EAAd;AACS,IAAA,GAAM,WAAN,MAAM,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE9B,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,yBAAyB,CAAC,AAAsB,AAAC;AAGzE,MAAMC,YAAY;IAEvBC,YAEUC,WAAmB,EAEnBC,SAAmB,EACnBC,QAGP,GAAG,EAAE,CACN;aAPQF,WAAmB,GAAnBA,WAAmB;aAEnBC,SAAmB,GAAnBA,SAAmB;aACnBC,QAGP,GAHOA,QAGP;aATKC,WAAW,GAAwB,IAAI;aAqCxCC,SAAS,GAAGC,CAAAA,GAAAA,GAAO,AAAmC,CAAA,QAAnC,CAAC,IAAI,CAACC,iBAAiB,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC;KA3BzD;IAEJ,mCAAmC,CACnC,AAAQC,eAAe,GAAkB;QACvC,KAAK,MAAMC,QAAQ,IAAI,IAAI,CAACR,SAAS,CAAE;YACrC,MAAMS,QAAQ,GAAGC,YAAW,QAAA,CAACC,MAAM,CAAC,IAAI,CAACZ,WAAW,EAAES,QAAQ,CAAC,AAAC;YAChE,IAAIC,QAAQ,EAAE;gBACZ,OAAOA,QAAQ,CAAC;aACjB;SACF;QACD,OAAO,IAAI,CAAC;KACb;IAED,AAAOG,cAAc,GAAG;QACtB,MAAMC,UAAU,GAAG,IAAI,CAACN,eAAe,EAAE,AAAC;QAC1C,IAAIM,UAAU,EAAE;YACdlB,KAAK,CAAC,CAAC,UAAU,EAAEkB,UAAU,CAAC,CAAC,CAAC,CAAC;YACjC,OAAO,IAAI,CAACV,SAAS,CAACU,UAAU,CAAC,CAAC;SACnC;QACD,OAAOA,UAAU,CAAC;KACnB;IAED,AAAOC,aAAa,GAAG;YACrB,IAAI,AAAY,EAAhB,GAAgB;QAAhB,CAAA,GAAgB,GAAhB,CAAA,IAAI,GAAJ,IAAI,EAACZ,WAAW,SAAI,GAApB,KAAA,CAAoB,GAApB,GAAgB,CAAhB,IAAoB,CAApB,IAAI,CAAgB,AA7CxB,CA6CyB;KACtB;IAKD,AAAQG,iBAAiB,CAACI,QAAgB,EAAU;QAClD,MAAMM,UAAU,GAAGC,KAAI,QAAA,CAACC,QAAQ,CAAC,IAAI,CAAClB,WAAW,EAAEU,QAAQ,CAAC,AAAC;QAC7D,MAAMS,QAAQ,GAAG,CAACC,GAAQ,EAAEC,IAAS,GAAK;YACxC,IAAIA,IAAI,CAACC,IAAI,IAAIF,GAAG,CAACE,IAAI,EAAE;gBACzB3B,GAAG,CAAC4B,GAAG,CACL,CAAC,4BAA4B,EAAEC,MAAK,QAAA,CAACC,IAAI,CACvCT,UAAU,CACX,CAAC,4CAA4C,CAAC,GAAG,CAAC,IAAI,CAACd,QAAQ,CAACwB,iBAAiB,IAAI,EAAE,CAAC,CAC1F,CAAC;aACH;SACF,AAAC;QAEF,MAAMC,OAAO,GAAGvB,CAAAA,GAAAA,GAAS,AAAoB,CAAA,UAApB,CAACM,QAAQ,EAAES,QAAQ,CAAC,AAAC;QAE9C,IAAI,CAAChB,WAAW,GAAG,IAAM;YACvBwB,OAAO,CAACC,KAAK,EAAE,CAAC;SACjB,CAAC;QAEF,OAAOlB,QAAQ,CAAC;KACjB;CACF;QA5DYZ,YAAY,GAAZA,YAAY"}
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ exports.getMetroDebugProperties = getMetroDebugProperties;
6
+ var _resolveFromProject = require("../../start/server/metro/resolveFromProject");
7
+ function getMetroDebugProperties(projectRoot, exp, debugTool) {
8
+ return {
9
+ sdkVersion: exp.sdkVersion,
10
+ metroVersion: (0, _resolveFromProject).resolveMetroVersionFromProject(projectRoot),
11
+ toolName: debugTool.name,
12
+ toolVersion: debugTool.version
13
+ };
14
+ }
15
+
16
+ //# sourceMappingURL=getMetroDebugProperties.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/utils/analytics/getMetroDebugProperties.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config';\n\nimport { resolveMetroVersionFromProject } from '../../start/server/metro/resolveFromProject';\n\nexport type DebugTool = {\n name: string;\n version?: string;\n};\n\nexport function getMetroDebugProperties(\n projectRoot: string,\n exp: ExpoConfig,\n debugTool: DebugTool\n) {\n return {\n sdkVersion: exp.sdkVersion,\n metroVersion: resolveMetroVersionFromProject(projectRoot),\n toolName: debugTool.name,\n toolVersion: debugTool.version,\n };\n}\n"],"names":["getMetroDebugProperties","projectRoot","exp","debugTool","sdkVersion","metroVersion","resolveMetroVersionFromProject","toolName","name","toolVersion","version"],"mappings":"AAAA;;;;QASgBA,uBAAuB,GAAvBA,uBAAuB;AAPQ,IAAA,mBAA6C,WAA7C,6CAA6C,CAAA;AAOrF,SAASA,uBAAuB,CACrCC,WAAmB,EACnBC,GAAe,EACfC,SAAoB,EACpB;IACA,OAAO;QACLC,UAAU,EAAEF,GAAG,CAACE,UAAU;QAC1BC,YAAY,EAAEC,CAAAA,GAAAA,mBAA8B,AAAa,CAAA,+BAAb,CAACL,WAAW,CAAC;QACzDM,QAAQ,EAAEJ,SAAS,CAACK,IAAI;QACxBC,WAAW,EAAEN,SAAS,CAACO,OAAO;KAC/B,CAAC;CACH"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ exports.getMetroProperties = getMetroProperties;
6
+ var _resolveFromProject = require("../../start/server/metro/resolveFromProject");
7
+ function getMetroProperties(projectRoot, exp, metroConfig = {}) {
8
+ var ref, ref1, ref2, ref3, ref4, ref5, ref6, ref7, ref8, ref9, ref10, ref11;
9
+ return {
10
+ sdkVersion: exp.sdkVersion,
11
+ metroVersion: (0, _resolveFromProject).resolveMetroVersionFromProject(projectRoot),
12
+ fileMapCacheManagerFactory: Boolean(metroConfig.unstable_fileMapCacheManagerFactory) || undefined,
13
+ perfLogger: Boolean(metroConfig.unstable_perfLogger) || undefined,
14
+ resolverEnableSymlinks: (ref = metroConfig.resolver) == null ? void 0 : ref.unstable_enableSymlinks,
15
+ resolverConditionNames: (ref1 = metroConfig.resolver) == null ? void 0 : ref1.unstable_conditionNames,
16
+ resolverConditionsByPlatform: (ref2 = metroConfig.resolver) == null ? void 0 : ref2.unstable_conditionsByPlatform,
17
+ resolverEnablePackageExports: (ref3 = metroConfig.resolver) == null ? void 0 : ref3.unstable_enablePackageExports,
18
+ serverImportBundleSupport: (ref4 = metroConfig.server) == null ? void 0 : ref4.experimentalImportBundleSupport,
19
+ serverServerRoot: (ref5 = metroConfig.server) == null ? void 0 : ref5.unstable_serverRoot,
20
+ transformerCollectDependenciesPath: (ref6 = metroConfig.transformer) == null ? void 0 : ref6.unstable_collectDependenciesPath,
21
+ transformerDependencyMapReservedName: (ref7 = metroConfig.transformer) == null ? void 0 : ref7.unstable_dependencyMapReservedName,
22
+ transformerDisableModuleWrapping: (ref8 = metroConfig.transformer) == null ? void 0 : ref8.unstable_disableModuleWrapping,
23
+ transformerDisableNormalizePseudoGlobals: (ref9 = metroConfig.transformer) == null ? void 0 : ref9.unstable_disableNormalizePseudoGlobals,
24
+ transformerCompactOutput: (ref10 = metroConfig.transformer) == null ? void 0 : ref10.unstable_compactOutput,
25
+ transformerAllowRequireContext: (ref11 = metroConfig.transformer) == null ? void 0 : ref11.unstable_allowRequireContext
26
+ };
27
+ }
28
+
29
+ //# sourceMappingURL=getMetroProperties.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/utils/analytics/getMetroProperties.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config-types';\n\nimport { resolveMetroVersionFromProject } from '../../start/server/metro/resolveFromProject';\n\n/**\n * Get the unstable / experimental properties used within the Metro config.\n * Note that this should match `metro-config`, but uses newer features that are not yet typed.\n *\n * @see https://github.com/facebook/metro/blob/1d51ffd33f54dba25c54b49ff059543dac519f21/packages/metro-config/src/configTypes.flow.js\n */\nexport function getMetroProperties(\n projectRoot: string,\n exp: ExpoConfig,\n metroConfig: Record<string, any> = {}\n) {\n return {\n sdkVersion: exp.sdkVersion,\n metroVersion: resolveMetroVersionFromProject(projectRoot),\n\n fileMapCacheManagerFactory:\n Boolean(metroConfig.unstable_fileMapCacheManagerFactory) || undefined, // CacheManagerFactory\n perfLogger: Boolean(metroConfig.unstable_perfLogger) || undefined, // PerfLoggerFactory\n\n resolverEnableSymlinks: metroConfig.resolver?.unstable_enableSymlinks, // boolean\n resolverConditionNames: metroConfig.resolver?.unstable_conditionNames, // string[]\n resolverConditionsByPlatform: metroConfig.resolver?.unstable_conditionsByPlatform, // { [platform: string]: string[] }\n resolverEnablePackageExports: metroConfig.resolver?.unstable_enablePackageExports, // boolean\n\n serverImportBundleSupport: metroConfig.server?.experimentalImportBundleSupport, // boolean\n serverServerRoot: metroConfig.server?.unstable_serverRoot, // string | null\n\n transformerCollectDependenciesPath: metroConfig.transformer?.unstable_collectDependenciesPath, // string\n transformerDependencyMapReservedName:\n metroConfig.transformer?.unstable_dependencyMapReservedName, // string | null\n transformerDisableModuleWrapping: metroConfig.transformer?.unstable_disableModuleWrapping, // boolean\n transformerDisableNormalizePseudoGlobals:\n metroConfig.transformer?.unstable_disableNormalizePseudoGlobals, // boolean\n transformerCompactOutput: metroConfig.transformer?.unstable_compactOutput, // boolean\n transformerAllowRequireContext: metroConfig.transformer?.unstable_allowRequireContext, // boolean\n };\n}\n"],"names":["getMetroProperties","projectRoot","exp","metroConfig","sdkVersion","metroVersion","resolveMetroVersionFromProject","fileMapCacheManagerFactory","Boolean","unstable_fileMapCacheManagerFactory","undefined","perfLogger","unstable_perfLogger","resolverEnableSymlinks","resolver","unstable_enableSymlinks","resolverConditionNames","unstable_conditionNames","resolverConditionsByPlatform","unstable_conditionsByPlatform","resolverEnablePackageExports","unstable_enablePackageExports","serverImportBundleSupport","server","experimentalImportBundleSupport","serverServerRoot","unstable_serverRoot","transformerCollectDependenciesPath","transformer","unstable_collectDependenciesPath","transformerDependencyMapReservedName","unstable_dependencyMapReservedName","transformerDisableModuleWrapping","unstable_disableModuleWrapping","transformerDisableNormalizePseudoGlobals","unstable_disableNormalizePseudoGlobals","transformerCompactOutput","unstable_compactOutput","transformerAllowRequireContext","unstable_allowRequireContext"],"mappings":"AAAA;;;;QAUgBA,kBAAkB,GAAlBA,kBAAkB;AARa,IAAA,mBAA6C,WAA7C,6CAA6C,CAAA;AAQrF,SAASA,kBAAkB,CAChCC,WAAmB,EACnBC,GAAe,EACfC,WAAgC,GAAG,EAAE,EACrC;QAS0BA,GAAoB,EACpBA,IAAoB,EACdA,IAAoB,EACpBA,IAAoB,EAEvBA,IAAkB,EAC3BA,IAAkB,EAEAA,IAAuB,EAEzDA,IAAuB,EACSA,IAAuB,EAEvDA,IAAuB,EACCA,KAAuB,EACjBA,KAAuB;IAvBzD,OAAO;QACLC,UAAU,EAAEF,GAAG,CAACE,UAAU;QAC1BC,YAAY,EAAEC,CAAAA,GAAAA,mBAA8B,AAAa,CAAA,+BAAb,CAACL,WAAW,CAAC;QAEzDM,0BAA0B,EACxBC,OAAO,CAACL,WAAW,CAACM,mCAAmC,CAAC,IAAIC,SAAS;QACvEC,UAAU,EAAEH,OAAO,CAACL,WAAW,CAACS,mBAAmB,CAAC,IAAIF,SAAS;QAEjEG,sBAAsB,EAAEV,CAAAA,GAAoB,GAApBA,WAAW,CAACW,QAAQ,SAAyB,GAA7CX,KAAAA,CAA6C,GAA7CA,GAAoB,CAAEY,uBAAuB;QACrEC,sBAAsB,EAAEb,CAAAA,IAAoB,GAApBA,WAAW,CAACW,QAAQ,SAAyB,GAA7CX,KAAAA,CAA6C,GAA7CA,IAAoB,CAAEc,uBAAuB;QACrEC,4BAA4B,EAAEf,CAAAA,IAAoB,GAApBA,WAAW,CAACW,QAAQ,SAA+B,GAAnDX,KAAAA,CAAmD,GAAnDA,IAAoB,CAAEgB,6BAA6B;QACjFC,4BAA4B,EAAEjB,CAAAA,IAAoB,GAApBA,WAAW,CAACW,QAAQ,SAA+B,GAAnDX,KAAAA,CAAmD,GAAnDA,IAAoB,CAAEkB,6BAA6B;QAEjFC,yBAAyB,EAAEnB,CAAAA,IAAkB,GAAlBA,WAAW,CAACoB,MAAM,SAAiC,GAAnDpB,KAAAA,CAAmD,GAAnDA,IAAkB,CAAEqB,+BAA+B;QAC9EC,gBAAgB,EAAEtB,CAAAA,IAAkB,GAAlBA,WAAW,CAACoB,MAAM,SAAqB,GAAvCpB,KAAAA,CAAuC,GAAvCA,IAAkB,CAAEuB,mBAAmB;QAEzDC,kCAAkC,EAAExB,CAAAA,IAAuB,GAAvBA,WAAW,CAACyB,WAAW,SAAkC,GAAzDzB,KAAAA,CAAyD,GAAzDA,IAAuB,CAAE0B,gCAAgC;QAC7FC,oCAAoC,EAClC3B,CAAAA,IAAuB,GAAvBA,WAAW,CAACyB,WAAW,SAAoC,GAA3DzB,KAAAA,CAA2D,GAA3DA,IAAuB,CAAE4B,kCAAkC;QAC7DC,gCAAgC,EAAE7B,CAAAA,IAAuB,GAAvBA,WAAW,CAACyB,WAAW,SAAgC,GAAvDzB,KAAAA,CAAuD,GAAvDA,IAAuB,CAAE8B,8BAA8B;QACzFC,wCAAwC,EACtC/B,CAAAA,IAAuB,GAAvBA,WAAW,CAACyB,WAAW,SAAwC,GAA/DzB,KAAAA,CAA+D,GAA/DA,IAAuB,CAAEgC,sCAAsC;QACjEC,wBAAwB,EAAEjC,CAAAA,KAAuB,GAAvBA,WAAW,CAACyB,WAAW,SAAwB,GAA/CzB,KAAAA,CAA+C,GAA/CA,KAAuB,CAAEkC,sBAAsB;QACzEC,8BAA8B,EAAEnC,CAAAA,KAAuB,GAAvBA,WAAW,CAACyB,WAAW,SAA8B,GAArDzB,KAAAA,CAAqD,GAArDA,KAAuB,CAAEoC,4BAA4B;KACtF,CAAC;CACH"}