@expo/cli 0.6.1 → 0.7.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 (43) hide show
  1. package/build/bin/cli +3 -3
  2. package/build/bin/cli.map +1 -1
  3. package/build/src/start/interface/interactiveActions.js +30 -3
  4. package/build/src/start/interface/interactiveActions.js.map +1 -1
  5. package/build/src/start/server/BundlerDevServer.js +5 -0
  6. package/build/src/start/server/BundlerDevServer.js.map +1 -1
  7. package/build/src/start/server/ReactDevToolsProxy.js +73 -0
  8. package/build/src/start/server/ReactDevToolsProxy.js.map +1 -0
  9. package/build/src/start/server/metro/MetroBundlerDevServer.js +3 -1
  10. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  11. package/build/src/start/server/metro/inspector-proxy/device.js +72 -0
  12. package/build/src/start/server/metro/inspector-proxy/device.js.map +1 -0
  13. package/build/src/start/server/metro/inspector-proxy/handlers/DebuggerScriptSource.js +87 -0
  14. package/build/src/start/server/metro/inspector-proxy/handlers/DebuggerScriptSource.js.map +1 -0
  15. package/build/src/start/server/metro/inspector-proxy/handlers/NetworkResponse.js +29 -0
  16. package/build/src/start/server/metro/inspector-proxy/handlers/NetworkResponse.js.map +1 -0
  17. package/build/src/start/server/metro/inspector-proxy/handlers/PageReload.js +22 -0
  18. package/build/src/start/server/metro/inspector-proxy/handlers/PageReload.js.map +1 -0
  19. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeCompat.js +63 -0
  20. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeCompat.js.map +1 -0
  21. package/build/src/start/server/metro/inspector-proxy/handlers/types.js +6 -0
  22. package/build/src/start/server/metro/inspector-proxy/handlers/types.js.map +1 -0
  23. package/build/src/start/server/metro/inspector-proxy/index.js +27 -0
  24. package/build/src/start/server/metro/inspector-proxy/index.js.map +1 -0
  25. package/build/src/start/server/metro/inspector-proxy/proxy.js +145 -0
  26. package/build/src/start/server/metro/inspector-proxy/proxy.js.map +1 -0
  27. package/build/src/start/server/metro/instantiateMetro.js +18 -2
  28. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  29. package/build/src/start/server/metro/resolveFromProject.js +8 -0
  30. package/build/src/start/server/metro/resolveFromProject.js.map +1 -1
  31. package/build/src/start/server/middleware/ClassicManifestMiddleware.js +2 -2
  32. package/build/src/start/server/middleware/ClassicManifestMiddleware.js.map +1 -1
  33. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +1 -1
  34. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -1
  35. package/build/src/start/server/middleware/ManifestMiddleware.js +7 -0
  36. package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
  37. package/build/src/start/server/middleware/ReactDevToolsPageMiddleware.js +35 -0
  38. package/build/src/start/server/middleware/ReactDevToolsPageMiddleware.js.map +1 -0
  39. package/build/src/utils/analytics/rudderstackClient.js +2 -2
  40. package/build/src/utils/env.js +3 -0
  41. package/build/src/utils/env.js.map +1 -1
  42. package/package.json +7 -4
  43. package/static/react-devtools-page/index.html +144 -0
@@ -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 { 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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"}
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 { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { createInspectorProxy } from './inspector-proxy';\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 metroBundler: MetroBundlerDevServer,\n options: Omit<MetroDevServerOptions, 'logger'>\n): Promise<{\n server: http.Server;\n middleware: any;\n messageSocket: MessageSocket;\n}> {\n const projectRoot = metroBundler.projectRoot;\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 // Create the custom inspector proxy only when enabled and opt-in\n const inspectorProxy =\n metroConfig.server.runInspectorProxy && env.EXPO_USE_CUSTOM_INSPECTOR_PROXY\n ? createInspectorProxy(metroBundler, metroBundler.projectRoot)\n : null;\n\n if (inspectorProxy) {\n // @ts-expect-error Property is read-only, but we need to disable it\n metroConfig.server.runInspectorProxy = false;\n }\n\n middleware.use(createDebuggerTelemetryMiddleware(projectRoot, exp));\n\n const server = await Metro.runServer(metroConfig, {\n hmrEnabled: true,\n websocketEndpoints: {\n ...websocketEndpoints,\n ...(inspectorProxy ? inspectorProxy.createWebSocketListeners() : {}),\n },\n // @ts-expect-error Property was added in 0.73.4, remove this statement when updating Metro\n watch: isWatchEnabled(),\n });\n\n // Hook the inspector proxy in the Metro server\n if (inspectorProxy) {\n inspectorProxy.setServerAddress(server);\n middleware.use(inspectorProxy.processRequest);\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","metroBundler","options","projectRoot","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","inspectorProxy","runInspectorProxy","env","EXPO_USE_CUSTOM_INSPECTOR_PROXY","createInspectorProxy","createDebuggerTelemetryMiddleware","runServer","hmrEnabled","createWebSocketListeners","watch","setServerAddress","processRequest","messageSocket","eventsSocket","CI","Log","log","chalk"],"mappings":"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"}
@@ -5,6 +5,8 @@ Object.defineProperty(exports, "__esModule", {
5
5
  exports.importMetroFromProject = importMetroFromProject;
6
6
  exports.importExpoMetroConfigFromProject = importExpoMetroConfigFromProject;
7
7
  exports.importMetroResolverFromProject = importMetroResolverFromProject;
8
+ exports.importMetroInspectorProxyFromProject = importMetroInspectorProxyFromProject;
9
+ exports.importMetroInspectorDeviceFromProject = importMetroInspectorDeviceFromProject;
8
10
  exports.importCliSaveAssetsFromProject = importCliSaveAssetsFromProject;
9
11
  exports.resolveMetroVersionFromProject = resolveMetroVersionFromProject;
10
12
  var _resolveFrom = _interopRequireDefault(require("resolve-from"));
@@ -40,6 +42,12 @@ function importExpoMetroConfigFromProject(projectRoot) {
40
42
  function importMetroResolverFromProject(projectRoot) {
41
43
  return importFromProject(projectRoot, "metro-resolver");
42
44
  }
45
+ function importMetroInspectorProxyFromProject(projectRoot) {
46
+ return importFromProject(projectRoot, "metro-inspector-proxy");
47
+ }
48
+ function importMetroInspectorDeviceFromProject(projectRoot) {
49
+ return importFromProject(projectRoot, "metro-inspector-proxy/src/Device");
50
+ }
43
51
  function importCliSaveAssetsFromProject(projectRoot) {
44
52
  return importFromProject(projectRoot, "@react-native-community/cli-plugin-metro/build/commands/bundle/saveAssets").default;
45
53
  }
@@ -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\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"}
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/** Import `metro-inspector-proxy` from the project. */\nexport function importMetroInspectorProxyFromProject(\n projectRoot: string\n): typeof import('metro-inspector-proxy') {\n return importFromProject(projectRoot, 'metro-inspector-proxy');\n}\n\n/** Import `metro-inspector-proxy/src/Device` from the project. */\nexport function importMetroInspectorDeviceFromProject(\n projectRoot: string\n): typeof import('metro-inspector-proxy/src/Device') {\n return importFromProject(projectRoot, 'metro-inspector-proxy/src/Device');\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","importMetroInspectorProxyFromProject","importMetroInspectorDeviceFromProject","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;QAO9BC,oCAAoC,GAApCA,oCAAoC;QAOpCC,qCAAqC,GAArCA,qCAAqC;QAUrCC,8BAA8B,GAA9BA,8BAA8B;QAU9BC,8BAA8B,GAA9BA,8BAA8B;AA3EtB,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,SAASX,sBAAsB,CAACU,WAAmB,EAA0B;IAClF,OAAOM,iBAAiB,CAACN,WAAW,EAAE,OAAO,CAAC,CAAC;CAChD;AAGM,SAAST,gCAAgC,CAC9CS,WAAmB,EACkB;IACrC,OAAOM,iBAAiB,CAACN,WAAW,EAAE,oBAAoB,CAAC,CAAC;CAC7D;AAGM,SAASR,8BAA8B,CAC5CQ,WAAmB,EACc;IACjC,OAAOM,iBAAiB,CAACN,WAAW,EAAE,gBAAgB,CAAC,CAAC;CACzD;AAGM,SAASP,oCAAoC,CAClDO,WAAmB,EACqB;IACxC,OAAOM,iBAAiB,CAACN,WAAW,EAAE,uBAAuB,CAAC,CAAC;CAChE;AAGM,SAASN,qCAAqC,CACnDM,WAAmB,EACgC;IACnD,OAAOM,iBAAiB,CAACN,WAAW,EAAE,kCAAkC,CAAC,CAAC;CAC3E;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"}
@@ -48,7 +48,7 @@ class ClassicManifestMiddleware extends _manifestMiddleware.ManifestMiddleware {
48
48
  (0, _resolvePlatform).assertRuntimePlatform(platform);
49
49
  return {
50
50
  platform,
51
- acceptSignature: Boolean(req.headers["exponent-accept-signature"]),
51
+ acceptSignature: this.getLegacyAcceptSignatureHeader(req),
52
52
  hostname: (0, _url).stripPort(req.headers["host"])
53
53
  };
54
54
  }
@@ -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.6.1",
133
+ serverVersion: "0.7.0",
134
134
  serverDriver: _manifestMiddleware.DEVELOPER_TOOL,
135
135
  serverOS: _os.default.platform(),
136
136
  serverOSVersion: _os.default.release()
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/middleware/ClassicManifestMiddleware.ts"],"sourcesContent":["import { ExpoAppManifest, ExpoConfig } from '@expo/config';\nimport chalk from 'chalk';\nimport os from 'os';\n\nimport { APISettings } from '../../../api/settings';\nimport { signClassicExpoGoManifestAsync } from '../../../api/signManifest';\nimport UserSettings from '../../../api/user/UserSettings';\nimport { ANONYMOUS_USERNAME, getUserAsync } from '../../../api/user/user';\nimport * as Log from '../../../log';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport { memoize } from '../../../utils/fn';\nimport { learnMore } from '../../../utils/link';\nimport { stripPort } from '../../../utils/url';\nimport {\n DEVELOPER_TOOL,\n HostInfo,\n ManifestMiddleware,\n ManifestRequestInfo,\n} from './ManifestMiddleware';\nimport { assertRuntimePlatform, parsePlatformHeader } from './resolvePlatform';\nimport { ServerHeaders, ServerRequest } from './server.types';\n\ntype SignManifestProps = {\n manifest: ExpoAppManifest;\n hostId: string;\n acceptSignature: boolean;\n};\n\ninterface ClassicManifestRequestInfo extends ManifestRequestInfo {}\n\nconst debug = require('debug')(\n 'expo:start:server:middleware:ClassicManifestMiddleware'\n) as typeof console.log;\n\nexport class ClassicManifestMiddleware extends ManifestMiddleware<ClassicManifestRequestInfo> {\n public getParsedHeaders(req: ServerRequest): ClassicManifestRequestInfo {\n const platform = parsePlatformHeader(req) || 'ios';\n assertRuntimePlatform(platform);\n return {\n platform,\n acceptSignature: Boolean(req.headers['exponent-accept-signature']),\n hostname: stripPort(req.headers['host']),\n };\n }\n\n public async _getManifestResponseAsync({\n acceptSignature,\n ...requestOptions\n }: ClassicManifestRequestInfo): Promise<{\n body: string;\n version: string;\n headers: ServerHeaders;\n }> {\n const { exp, hostUri, expoGoConfig, bundleUrl } = await this._resolveProjectSettingsAsync(\n requestOptions\n );\n\n const manifest: ExpoAppManifest = {\n ...(exp as ExpoAppManifest),\n ...expoGoConfig,\n hostUri,\n bundleUrl,\n };\n\n // Gather packager and host info\n const hostInfo = await createHostInfoAsync();\n\n const headers = new Map<string, any>();\n headers.set('Exponent-Server', JSON.stringify(hostInfo));\n\n // Create the final string\n const body = await this._fetchComputedManifestStringAsync({\n manifest,\n hostId: hostInfo.host,\n acceptSignature,\n });\n\n return {\n body,\n version: manifest.sdkVersion,\n headers,\n };\n }\n\n protected trackManifest(version?: string) {\n // Log analytics\n logEventAsync('Serve Manifest', {\n sdkVersion: version ?? null,\n });\n }\n\n /** Exposed for testing. */\n async _getManifestStringAsync({\n manifest,\n hostId,\n acceptSignature,\n }: SignManifestProps): Promise<string> {\n const currentSession = await getUserAsync();\n if (!currentSession || APISettings.isOffline) {\n manifest.id = `@${ANONYMOUS_USERNAME}/${manifest.slug}-${hostId}`;\n }\n if (!acceptSignature) {\n return JSON.stringify(manifest);\n } else if (!currentSession || APISettings.isOffline) {\n return getUnsignedManifestString(manifest);\n } else {\n return this.getSignedManifestStringAsync(manifest);\n }\n }\n\n private getSignedManifestStringAsync = memoize(signClassicExpoGoManifestAsync);\n\n /** Exposed for testing. */\n async _fetchComputedManifestStringAsync(props: SignManifestProps): Promise<string> {\n try {\n return await this._getManifestStringAsync(props);\n } catch (error: any) {\n debug(`Error getting manifest:`, error);\n if (error.code === 'UNAUTHORIZED' && props.manifest.owner) {\n // Don't have permissions for siging, warn and enable offline mode.\n this.addSigningDisabledWarning(\n `This project belongs to ${chalk.bold(\n `@${props.manifest.owner}`\n )} and you have not been granted the appropriate permissions.\\n` +\n `Please request access from an admin of @${props.manifest.owner} or change the \"owner\" field to an account you belong to.\\n` +\n learnMore('https://docs.expo.dev/versions/latest/config/app/#owner')\n );\n APISettings.isOffline = true;\n return await this._getManifestStringAsync(props);\n } else if (error.code === 'ENOTFOUND') {\n // Got a DNS error, i.e. can't access exp.host, warn and enable offline mode.\n this.addSigningDisabledWarning(\n `Could not reach Expo servers, please check if you can access ${\n error.hostname || 'exp.host'\n }.`\n );\n APISettings.isOffline = true;\n return await this._getManifestStringAsync(props);\n } else {\n throw error;\n }\n }\n }\n\n private addSigningDisabledWarning = memoize((reason: string) => {\n Log.warn(`${reason}\\nFalling back to offline mode.`);\n // For the memo\n return reason;\n });\n}\n\n// Passed to Expo Go and registered as telemetry.\n// TODO: it's unclear why we don't just send it from the CLI.\nasync function createHostInfoAsync(): Promise<HostInfo> {\n return {\n host: await UserSettings.getAnonymousIdentifierAsync(),\n server: 'expo',\n // Defined in the build step\n serverVersion: process.env.__EXPO_VERSION!,\n serverDriver: DEVELOPER_TOOL,\n serverOS: os.platform(),\n serverOSVersion: os.release(),\n };\n}\n\nfunction getUnsignedManifestString(manifest: ExpoConfig) {\n const unsignedManifest = {\n manifestString: JSON.stringify(manifest),\n signature: 'UNSIGNED',\n };\n return JSON.stringify(unsignedManifest);\n}\n"],"names":["Log","debug","require","ClassicManifestMiddleware","ManifestMiddleware","getParsedHeaders","req","platform","parsePlatformHeader","assertRuntimePlatform","acceptSignature","Boolean","headers","hostname","stripPort","_getManifestResponseAsync","requestOptions","exp","hostUri","expoGoConfig","bundleUrl","_resolveProjectSettingsAsync","manifest","hostInfo","createHostInfoAsync","Map","set","JSON","stringify","body","_fetchComputedManifestStringAsync","hostId","host","version","sdkVersion","trackManifest","logEventAsync","_getManifestStringAsync","currentSession","getUserAsync","APISettings","isOffline","id","ANONYMOUS_USERNAME","slug","getUnsignedManifestString","getSignedManifestStringAsync","memoize","signClassicExpoGoManifestAsync","props","error","code","owner","addSigningDisabledWarning","chalk","bold","learnMore","reason","warn","UserSettings","getAnonymousIdentifierAsync","server","serverVersion","process","env","__EXPO_VERSION","serverDriver","DEVELOPER_TOOL","serverOS","os","serverOSVersion","release","unsignedManifest","manifestString","signature"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/server/middleware/ClassicManifestMiddleware.ts"],"sourcesContent":["import { ExpoAppManifest, ExpoConfig } from '@expo/config';\nimport chalk from 'chalk';\nimport os from 'os';\n\nimport { APISettings } from '../../../api/settings';\nimport { signClassicExpoGoManifestAsync } from '../../../api/signManifest';\nimport UserSettings from '../../../api/user/UserSettings';\nimport { ANONYMOUS_USERNAME, getUserAsync } from '../../../api/user/user';\nimport * as Log from '../../../log';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport { memoize } from '../../../utils/fn';\nimport { learnMore } from '../../../utils/link';\nimport { stripPort } from '../../../utils/url';\nimport {\n DEVELOPER_TOOL,\n HostInfo,\n ManifestMiddleware,\n ManifestRequestInfo,\n} from './ManifestMiddleware';\nimport { assertRuntimePlatform, parsePlatformHeader } from './resolvePlatform';\nimport { ServerHeaders, ServerRequest } from './server.types';\n\ntype SignManifestProps = {\n manifest: ExpoAppManifest;\n hostId: string;\n acceptSignature: boolean;\n};\n\ninterface ClassicManifestRequestInfo extends ManifestRequestInfo {}\n\nconst debug = require('debug')(\n 'expo:start:server:middleware:ClassicManifestMiddleware'\n) as typeof console.log;\n\nexport class ClassicManifestMiddleware extends ManifestMiddleware<ClassicManifestRequestInfo> {\n public getParsedHeaders(req: ServerRequest): ClassicManifestRequestInfo {\n const platform = parsePlatformHeader(req) || 'ios';\n assertRuntimePlatform(platform);\n return {\n platform,\n acceptSignature: this.getLegacyAcceptSignatureHeader(req),\n hostname: stripPort(req.headers['host']),\n };\n }\n\n public async _getManifestResponseAsync({\n acceptSignature,\n ...requestOptions\n }: ClassicManifestRequestInfo): Promise<{\n body: string;\n version: string;\n headers: ServerHeaders;\n }> {\n const { exp, hostUri, expoGoConfig, bundleUrl } = await this._resolveProjectSettingsAsync(\n requestOptions\n );\n\n const manifest: ExpoAppManifest = {\n ...(exp as ExpoAppManifest),\n ...expoGoConfig,\n hostUri,\n bundleUrl,\n };\n\n // Gather packager and host info\n const hostInfo = await createHostInfoAsync();\n\n const headers = new Map<string, any>();\n headers.set('Exponent-Server', JSON.stringify(hostInfo));\n\n // Create the final string\n const body = await this._fetchComputedManifestStringAsync({\n manifest,\n hostId: hostInfo.host,\n acceptSignature,\n });\n\n return {\n body,\n version: manifest.sdkVersion,\n headers,\n };\n }\n\n protected trackManifest(version?: string) {\n // Log analytics\n logEventAsync('Serve Manifest', {\n sdkVersion: version ?? null,\n });\n }\n\n /** Exposed for testing. */\n async _getManifestStringAsync({\n manifest,\n hostId,\n acceptSignature,\n }: SignManifestProps): Promise<string> {\n const currentSession = await getUserAsync();\n if (!currentSession || APISettings.isOffline) {\n manifest.id = `@${ANONYMOUS_USERNAME}/${manifest.slug}-${hostId}`;\n }\n if (!acceptSignature) {\n return JSON.stringify(manifest);\n } else if (!currentSession || APISettings.isOffline) {\n return getUnsignedManifestString(manifest);\n } else {\n return this.getSignedManifestStringAsync(manifest);\n }\n }\n\n private getSignedManifestStringAsync = memoize(signClassicExpoGoManifestAsync);\n\n /** Exposed for testing. */\n async _fetchComputedManifestStringAsync(props: SignManifestProps): Promise<string> {\n try {\n return await this._getManifestStringAsync(props);\n } catch (error: any) {\n debug(`Error getting manifest:`, error);\n if (error.code === 'UNAUTHORIZED' && props.manifest.owner) {\n // Don't have permissions for siging, warn and enable offline mode.\n this.addSigningDisabledWarning(\n `This project belongs to ${chalk.bold(\n `@${props.manifest.owner}`\n )} and you have not been granted the appropriate permissions.\\n` +\n `Please request access from an admin of @${props.manifest.owner} or change the \"owner\" field to an account you belong to.\\n` +\n learnMore('https://docs.expo.dev/versions/latest/config/app/#owner')\n );\n APISettings.isOffline = true;\n return await this._getManifestStringAsync(props);\n } else if (error.code === 'ENOTFOUND') {\n // Got a DNS error, i.e. can't access exp.host, warn and enable offline mode.\n this.addSigningDisabledWarning(\n `Could not reach Expo servers, please check if you can access ${\n error.hostname || 'exp.host'\n }.`\n );\n APISettings.isOffline = true;\n return await this._getManifestStringAsync(props);\n } else {\n throw error;\n }\n }\n }\n\n private addSigningDisabledWarning = memoize((reason: string) => {\n Log.warn(`${reason}\\nFalling back to offline mode.`);\n // For the memo\n return reason;\n });\n}\n\n// Passed to Expo Go and registered as telemetry.\n// TODO: it's unclear why we don't just send it from the CLI.\nasync function createHostInfoAsync(): Promise<HostInfo> {\n return {\n host: await UserSettings.getAnonymousIdentifierAsync(),\n server: 'expo',\n // Defined in the build step\n serverVersion: process.env.__EXPO_VERSION!,\n serverDriver: DEVELOPER_TOOL,\n serverOS: os.platform(),\n serverOSVersion: os.release(),\n };\n}\n\nfunction getUnsignedManifestString(manifest: ExpoConfig) {\n const unsignedManifest = {\n manifestString: JSON.stringify(manifest),\n signature: 'UNSIGNED',\n };\n return JSON.stringify(unsignedManifest);\n}\n"],"names":["Log","debug","require","ClassicManifestMiddleware","ManifestMiddleware","getParsedHeaders","req","platform","parsePlatformHeader","assertRuntimePlatform","acceptSignature","getLegacyAcceptSignatureHeader","hostname","stripPort","headers","_getManifestResponseAsync","requestOptions","exp","hostUri","expoGoConfig","bundleUrl","_resolveProjectSettingsAsync","manifest","hostInfo","createHostInfoAsync","Map","set","JSON","stringify","body","_fetchComputedManifestStringAsync","hostId","host","version","sdkVersion","trackManifest","logEventAsync","_getManifestStringAsync","currentSession","getUserAsync","APISettings","isOffline","id","ANONYMOUS_USERNAME","slug","getUnsignedManifestString","getSignedManifestStringAsync","memoize","signClassicExpoGoManifestAsync","props","error","code","owner","addSigningDisabledWarning","chalk","bold","learnMore","reason","warn","UserSettings","getAnonymousIdentifierAsync","server","serverVersion","process","env","__EXPO_VERSION","serverDriver","DEVELOPER_TOOL","serverOS","os","serverOSVersion","release","unsignedManifest","manifestString","signature"],"mappings":"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"}
@@ -47,7 +47,7 @@ class ExpoGoManifestHandlerMiddleware extends _manifestMiddleware.ManifestMiddle
47
47
  return {
48
48
  explicitlyPrefersMultipartMixed,
49
49
  platform,
50
- acceptSignature: !!req.headers["expo-accept-signature"],
50
+ acceptSignature: this.getLegacyAcceptSignatureHeader(req),
51
51
  expectSignature: expectSignature ? String(expectSignature) : null,
52
52
  hostname: (0, _url).stripPort(req.headers["host"])
53
53
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/middleware/ExpoGoManifestHandlerMiddleware.ts"],"sourcesContent":["import { ExpoUpdatesManifest } from '@expo/config';\nimport { Updates } from '@expo/config-plugins';\nimport accepts from 'accepts';\nimport assert from 'assert';\nimport crypto from 'crypto';\nimport FormData from 'form-data';\nimport { serializeDictionary, Dictionary } from 'structured-headers';\n\nimport { getProjectAsync } from '../../../api/getProject';\nimport { APISettings } from '../../../api/settings';\nimport { signExpoGoManifestAsync } from '../../../api/signManifest';\nimport UserSettings from '../../../api/user/UserSettings';\nimport { ANONYMOUS_USERNAME, getUserAsync } from '../../../api/user/user';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport {\n CodeSigningInfo,\n getCodeSigningInfoAsync,\n signManifestString,\n} from '../../../utils/codesigning';\nimport { CommandError } from '../../../utils/errors';\nimport { memoize } from '../../../utils/fn';\nimport { stripPort } from '../../../utils/url';\nimport { ManifestMiddleware, ManifestRequestInfo } from './ManifestMiddleware';\nimport { assertRuntimePlatform, parsePlatformHeader } from './resolvePlatform';\nimport { ServerHeaders, ServerRequest } from './server.types';\n\nconst debug = require('debug')('expo:start:server:middleware:ExpoGoManifestHandlerMiddleware');\n\ninterface ExpoGoManifestRequestInfo extends ManifestRequestInfo {\n explicitlyPrefersMultipartMixed: boolean;\n expectSignature: string | null;\n}\n\nexport class ExpoGoManifestHandlerMiddleware extends ManifestMiddleware<ExpoGoManifestRequestInfo> {\n public getParsedHeaders(req: ServerRequest): ExpoGoManifestRequestInfo {\n let platform = parsePlatformHeader(req);\n\n if (!platform) {\n debug(\n `No \"expo-platform\" header or \"platform\" query parameter specified. Falling back to \"none\".`\n );\n platform = 'none';\n }\n\n assertRuntimePlatform(platform);\n\n // Expo Updates clients explicitly accept \"multipart/mixed\" responses while browsers implicitly\n // accept them with \"accept: */*\". To make it easier to debug manifest responses by visiting their\n // URLs in a browser, we denote the response as \"text/plain\" if the user agent appears not to be\n // an Expo Updates client.\n const accept = accepts(req);\n const explicitlyPrefersMultipartMixed =\n accept.types(['unknown/unknown', 'multipart/mixed']) === 'multipart/mixed';\n\n const expectSignature = req.headers['expo-expect-signature'];\n\n return {\n explicitlyPrefersMultipartMixed,\n platform,\n acceptSignature: !!req.headers['expo-accept-signature'],\n expectSignature: expectSignature ? String(expectSignature) : null,\n hostname: stripPort(req.headers['host']),\n };\n }\n\n private getDefaultResponseHeaders(): ServerHeaders {\n const headers = new Map<string, number | string | readonly string[]>();\n // set required headers for Expo Updates manifest specification\n headers.set('expo-protocol-version', 0);\n headers.set('expo-sfv-version', 0);\n headers.set('cache-control', 'private, max-age=0');\n return headers;\n }\n\n public async _getManifestResponseAsync(requestOptions: ExpoGoManifestRequestInfo): Promise<{\n body: string;\n version: string;\n headers: ServerHeaders;\n }> {\n const { exp, hostUri, expoGoConfig, bundleUrl } = await this._resolveProjectSettingsAsync(\n requestOptions\n );\n\n const runtimeVersion = Updates.getRuntimeVersion(\n { ...exp, runtimeVersion: exp.runtimeVersion ?? { policy: 'sdkVersion' } },\n requestOptions.platform\n );\n if (!runtimeVersion) {\n throw new CommandError(\n 'MANIFEST_MIDDLEWARE',\n `Unable to determine runtime version for platform '${requestOptions.platform}'`\n );\n }\n\n const codeSigningInfo = await getCodeSigningInfoAsync(\n exp,\n requestOptions.expectSignature,\n this.options.privateKeyPath\n );\n\n const easProjectId = exp.extra?.eas?.projectId;\n const shouldUseAnonymousManifest = await shouldUseAnonymousManifestAsync(\n easProjectId,\n codeSigningInfo\n );\n const userAnonymousIdentifier = await UserSettings.getAnonymousIdentifierAsync();\n if (!shouldUseAnonymousManifest) {\n assert(easProjectId);\n }\n const scopeKey = shouldUseAnonymousManifest\n ? `@${ANONYMOUS_USERNAME}/${exp.slug}-${userAnonymousIdentifier}`\n : await this.getScopeKeyForProjectIdAsync(easProjectId);\n\n const expoUpdatesManifest: ExpoUpdatesManifest = {\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n runtimeVersion,\n launchAsset: {\n key: 'bundle',\n contentType: 'application/javascript',\n url: bundleUrl,\n },\n assets: [], // assets are not used in development\n metadata: {}, // required for the client to detect that this is an expo-updates manifest\n extra: {\n eas: {\n projectId: easProjectId ?? undefined,\n },\n expoClient: {\n ...exp,\n hostUri,\n },\n expoGo: expoGoConfig,\n scopeKey,\n },\n };\n\n const headers = this.getDefaultResponseHeaders();\n if (requestOptions.acceptSignature && !shouldUseAnonymousManifest) {\n const manifestSignature = await this.getSignedManifestStringAsync(expoUpdatesManifest);\n headers.set('expo-manifest-signature', manifestSignature);\n }\n\n const stringifiedManifest = JSON.stringify(expoUpdatesManifest);\n\n let manifestPartHeaders: { 'expo-signature': string } | null = null;\n let certificateChainBody: string | null = null;\n if (codeSigningInfo) {\n const signature = signManifestString(stringifiedManifest, codeSigningInfo);\n manifestPartHeaders = {\n 'expo-signature': serializeDictionary(\n convertToDictionaryItemsRepresentation({\n keyid: codeSigningInfo.keyId,\n sig: signature,\n alg: 'rsa-v1_5-sha256',\n })\n ),\n };\n certificateChainBody = codeSigningInfo.certificateChainForResponse.join('\\n');\n }\n\n const form = this.getFormData({\n stringifiedManifest,\n manifestPartHeaders,\n certificateChainBody,\n });\n\n headers.set(\n 'content-type',\n requestOptions.explicitlyPrefersMultipartMixed\n ? `multipart/mixed; boundary=${form.getBoundary()}`\n : 'text/plain'\n );\n\n return {\n body: form.getBuffer().toString(),\n version: runtimeVersion,\n headers,\n };\n }\n\n private getFormData({\n stringifiedManifest,\n manifestPartHeaders,\n certificateChainBody,\n }: {\n stringifiedManifest: string;\n manifestPartHeaders: { 'expo-signature': string } | null;\n certificateChainBody: string | null;\n }): FormData {\n const form = new FormData();\n form.append('manifest', stringifiedManifest, {\n contentType: 'application/json',\n header: {\n ...manifestPartHeaders,\n },\n });\n if (certificateChainBody && certificateChainBody.length > 0) {\n form.append('certificate_chain', certificateChainBody, {\n contentType: 'application/x-pem-file',\n });\n }\n return form;\n }\n\n protected trackManifest(version?: string) {\n logEventAsync('Serve Expo Updates Manifest', {\n runtimeVersion: version,\n });\n }\n\n private getSignedManifestStringAsync = memoize(signExpoGoManifestAsync);\n\n private getScopeKeyForProjectIdAsync = memoize(getScopeKeyForProjectIdAsync);\n}\n\n/**\n * 1. No EAS project ID in config, then use anonymous scope key\n * 2. When offline or not logged in\n * a. If code signing not accepted by client (only legacy manifest signing is supported), then use anonymous scope key\n * b. If code signing accepted by client and no development code signing certificate is cached, then use anonymous scope key\n */\nasync function shouldUseAnonymousManifestAsync(\n easProjectId: string | undefined | null,\n codeSigningInfo: CodeSigningInfo | null\n): Promise<boolean> {\n if (!easProjectId || (APISettings.isOffline && codeSigningInfo === null)) {\n return true;\n }\n\n return !(await getUserAsync());\n}\n\nasync function getScopeKeyForProjectIdAsync(projectId: string): Promise<string> {\n const project = await getProjectAsync(projectId);\n return project.scopeKey;\n}\n\nfunction convertToDictionaryItemsRepresentation(obj: { [key: string]: string }): Dictionary {\n return new Map(\n Object.entries(obj).map(([k, v]) => {\n return [k, [v, new Map()]];\n })\n );\n}\n"],"names":["debug","require","ExpoGoManifestHandlerMiddleware","ManifestMiddleware","getParsedHeaders","req","platform","parsePlatformHeader","assertRuntimePlatform","accept","accepts","explicitlyPrefersMultipartMixed","types","expectSignature","headers","acceptSignature","String","hostname","stripPort","getDefaultResponseHeaders","Map","set","_getManifestResponseAsync","requestOptions","exp","hostUri","expoGoConfig","bundleUrl","_resolveProjectSettingsAsync","runtimeVersion","Updates","getRuntimeVersion","policy","CommandError","codeSigningInfo","getCodeSigningInfoAsync","options","privateKeyPath","easProjectId","extra","eas","projectId","shouldUseAnonymousManifest","shouldUseAnonymousManifestAsync","userAnonymousIdentifier","UserSettings","getAnonymousIdentifierAsync","assert","scopeKey","ANONYMOUS_USERNAME","slug","getScopeKeyForProjectIdAsync","expoUpdatesManifest","id","crypto","randomUUID","createdAt","Date","toISOString","launchAsset","key","contentType","url","assets","metadata","undefined","expoClient","expoGo","manifestSignature","getSignedManifestStringAsync","stringifiedManifest","JSON","stringify","manifestPartHeaders","certificateChainBody","signature","signManifestString","serializeDictionary","convertToDictionaryItemsRepresentation","keyid","keyId","sig","alg","certificateChainForResponse","join","form","getFormData","getBoundary","body","getBuffer","toString","version","FormData","append","header","length","trackManifest","logEventAsync","memoize","signExpoGoManifestAsync","APISettings","isOffline","getUserAsync","project","getProjectAsync","obj","Object","entries","map","k","v"],"mappings":"AAAA;;;;AACwB,IAAA,cAAsB,WAAtB,sBAAsB,CAAA;AAC1B,IAAA,QAAS,kCAAT,SAAS,EAAA;AACV,IAAA,OAAQ,kCAAR,QAAQ,EAAA;AACR,IAAA,OAAQ,kCAAR,QAAQ,EAAA;AACN,IAAA,SAAW,kCAAX,WAAW,EAAA;AACgB,IAAA,kBAAoB,WAApB,oBAAoB,CAAA;AAEpC,IAAA,WAAyB,WAAzB,yBAAyB,CAAA;AAC7B,IAAA,SAAuB,WAAvB,uBAAuB,CAAA;AACX,IAAA,aAA2B,WAA3B,2BAA2B,CAAA;AAC1C,IAAA,aAAgC,kCAAhC,gCAAgC,EAAA;AACR,IAAA,KAAwB,WAAxB,wBAAwB,CAAA;AAC3C,IAAA,kBAA4C,WAA5C,4CAA4C,CAAA;AAKnE,IAAA,YAA4B,WAA5B,4BAA4B,CAAA;AACN,IAAA,OAAuB,WAAvB,uBAAuB,CAAA;AAC5B,IAAA,GAAmB,WAAnB,mBAAmB,CAAA;AACjB,IAAA,IAAoB,WAApB,oBAAoB,CAAA;AACU,IAAA,mBAAsB,WAAtB,sBAAsB,CAAA;AACnB,IAAA,gBAAmB,WAAnB,mBAAmB,CAAA;;;;;;AAG9E,MAAMA,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,8DAA8D,CAAC,AAAC;AAOxF,MAAMC,+BAA+B,SAASC,mBAAkB,mBAAA;IACrE,AAAOC,gBAAgB,CAACC,GAAkB,EAA6B;QACrE,IAAIC,QAAQ,GAAGC,CAAAA,GAAAA,gBAAmB,AAAK,CAAA,oBAAL,CAACF,GAAG,CAAC,AAAC;QAExC,IAAI,CAACC,QAAQ,EAAE;YACbN,KAAK,CACH,CAAC,0FAA0F,CAAC,CAC7F,CAAC;YACFM,QAAQ,GAAG,MAAM,CAAC;SACnB;QAEDE,CAAAA,GAAAA,gBAAqB,AAAU,CAAA,sBAAV,CAACF,QAAQ,CAAC,CAAC;QAEhC,+FAA+F;QAC/F,kGAAkG;QAClG,gGAAgG;QAChG,0BAA0B;QAC1B,MAAMG,MAAM,GAAGC,CAAAA,GAAAA,QAAO,AAAK,CAAA,QAAL,CAACL,GAAG,CAAC,AAAC;QAC5B,MAAMM,+BAA+B,GACnCF,MAAM,CAACG,KAAK,CAAC;YAAC,iBAAiB;YAAE,iBAAiB;SAAC,CAAC,KAAK,iBAAiB,AAAC;QAE7E,MAAMC,eAAe,GAAGR,GAAG,CAACS,OAAO,CAAC,uBAAuB,CAAC,AAAC;QAE7D,OAAO;YACLH,+BAA+B;YAC/BL,QAAQ;YACRS,eAAe,EAAE,CAAC,CAACV,GAAG,CAACS,OAAO,CAAC,uBAAuB,CAAC;YACvDD,eAAe,EAAEA,eAAe,GAAGG,MAAM,CAACH,eAAe,CAAC,GAAG,IAAI;YACjEI,QAAQ,EAAEC,CAAAA,GAAAA,IAAS,AAAqB,CAAA,UAArB,CAACb,GAAG,CAACS,OAAO,CAAC,MAAM,CAAC,CAAC;SACzC,CAAC;KACH;IAED,AAAQK,yBAAyB,GAAkB;QACjD,MAAML,OAAO,GAAG,IAAIM,GAAG,EAA+C,AAAC;QACvE,+DAA+D;QAC/DN,OAAO,CAACO,GAAG,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC;QACxCP,OAAO,CAACO,GAAG,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;QACnCP,OAAO,CAACO,GAAG,CAAC,eAAe,EAAE,oBAAoB,CAAC,CAAC;QACnD,OAAOP,OAAO,CAAC;KAChB;IAED,MAAaQ,yBAAyB,CAACC,cAAyC,EAI7E;YAsBoBC,GAAS;QArB9B,MAAM,EAAEA,GAAG,CAAA,EAAEC,OAAO,CAAA,EAAEC,YAAY,CAAA,EAAEC,SAAS,CAAA,EAAE,GAAG,MAAM,IAAI,CAACC,4BAA4B,CACvFL,cAAc,CACf,AAAC;YAG0BC,eAAkB;QAD9C,MAAMK,cAAc,GAAGC,cAAO,QAAA,CAACC,iBAAiB,CAC9C;YAAE,GAAGP,GAAG;YAAEK,cAAc,EAAEL,CAAAA,eAAkB,GAAlBA,GAAG,CAACK,cAAc,YAAlBL,eAAkB,GAAI;gBAAEQ,MAAM,EAAE,YAAY;aAAE;SAAE,EAC1ET,cAAc,CAACjB,QAAQ,CACxB,AAAC;QACF,IAAI,CAACuB,cAAc,EAAE;YACnB,MAAM,IAAII,OAAY,aAAA,CACpB,qBAAqB,EACrB,CAAC,kDAAkD,EAAEV,cAAc,CAACjB,QAAQ,CAAC,CAAC,CAAC,CAChF,CAAC;SACH;QAED,MAAM4B,eAAe,GAAG,MAAMC,CAAAA,GAAAA,YAAuB,AAIpD,CAAA,wBAJoD,CACnDX,GAAG,EACHD,cAAc,CAACV,eAAe,EAC9B,IAAI,CAACuB,OAAO,CAACC,cAAc,CAC5B,AAAC;QAEF,MAAMC,YAAY,GAAGd,CAAAA,GAAS,GAATA,GAAG,CAACe,KAAK,SAAK,GAAdf,KAAAA,CAAc,GAAdA,QAAAA,GAAS,CAAEgB,GAAG,SAAA,GAAdhB,KAAAA,CAAc,QAAEiB,SAAS,AAAX,AAAY;QAC/C,MAAMC,0BAA0B,GAAG,MAAMC,+BAA+B,CACtEL,YAAY,EACZJ,eAAe,CAChB,AAAC;QACF,MAAMU,uBAAuB,GAAG,MAAMC,aAAY,QAAA,CAACC,2BAA2B,EAAE,AAAC;QACjF,IAAI,CAACJ,0BAA0B,EAAE;YAC/BK,CAAAA,GAAAA,OAAM,AAAc,CAAA,QAAd,CAACT,YAAY,CAAC,CAAC;SACtB;QACD,MAAMU,QAAQ,GAAGN,0BAA0B,GACvC,CAAC,CAAC,EAAEO,KAAkB,mBAAA,CAAC,CAAC,EAAEzB,GAAG,CAAC0B,IAAI,CAAC,CAAC,EAAEN,uBAAuB,CAAC,CAAC,GAC/D,MAAM,IAAI,CAACO,4BAA4B,CAACb,YAAY,CAAC,AAAC;QAE1D,MAAMc,mBAAmB,GAAwB;YAC/CC,EAAE,EAAEC,OAAM,QAAA,CAACC,UAAU,EAAE;YACvBC,SAAS,EAAE,IAAIC,IAAI,EAAE,CAACC,WAAW,EAAE;YACnC7B,cAAc;YACd8B,WAAW,EAAE;gBACXC,GAAG,EAAE,QAAQ;gBACbC,WAAW,EAAE,wBAAwB;gBACrCC,GAAG,EAAEnC,SAAS;aACf;YACDoC,MAAM,EAAE,EAAE;YACVC,QAAQ,EAAE,EAAE;YACZzB,KAAK,EAAE;gBACLC,GAAG,EAAE;oBACHC,SAAS,EAAEH,YAAY,WAAZA,YAAY,GAAI2B,SAAS;iBACrC;gBACDC,UAAU,EAAE;oBACV,GAAG1C,GAAG;oBACNC,OAAO;iBACR;gBACD0C,MAAM,EAAEzC,YAAY;gBACpBsB,QAAQ;aACT;SACF,AAAC;QAEF,MAAMlC,OAAO,GAAG,IAAI,CAACK,yBAAyB,EAAE,AAAC;QACjD,IAAII,cAAc,CAACR,eAAe,IAAI,CAAC2B,0BAA0B,EAAE;YACjE,MAAM0B,iBAAiB,GAAG,MAAM,IAAI,CAACC,4BAA4B,CAACjB,mBAAmB,CAAC,AAAC;YACvFtC,OAAO,CAACO,GAAG,CAAC,yBAAyB,EAAE+C,iBAAiB,CAAC,CAAC;SAC3D;QAED,MAAME,mBAAmB,GAAGC,IAAI,CAACC,SAAS,CAACpB,mBAAmB,CAAC,AAAC;QAEhE,IAAIqB,mBAAmB,GAAwC,IAAI,AAAC;QACpE,IAAIC,oBAAoB,GAAkB,IAAI,AAAC;QAC/C,IAAIxC,eAAe,EAAE;YACnB,MAAMyC,SAAS,GAAGC,CAAAA,GAAAA,YAAkB,AAAsC,CAAA,mBAAtC,CAACN,mBAAmB,EAAEpC,eAAe,CAAC,AAAC;YAC3EuC,mBAAmB,GAAG;gBACpB,gBAAgB,EAAEI,CAAAA,GAAAA,kBAAmB,AAMpC,CAAA,oBANoC,CACnCC,sCAAsC,CAAC;oBACrCC,KAAK,EAAE7C,eAAe,CAAC8C,KAAK;oBAC5BC,GAAG,EAAEN,SAAS;oBACdO,GAAG,EAAE,iBAAiB;iBACvB,CAAC,CACH;aACF,CAAC;YACFR,oBAAoB,GAAGxC,eAAe,CAACiD,2BAA2B,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC/E;QAED,MAAMC,IAAI,GAAG,IAAI,CAACC,WAAW,CAAC;YAC5BhB,mBAAmB;YACnBG,mBAAmB;YACnBC,oBAAoB;SACrB,CAAC,AAAC;QAEH5D,OAAO,CAACO,GAAG,CACT,cAAc,EACdE,cAAc,CAACZ,+BAA+B,GAC1C,CAAC,0BAA0B,EAAE0E,IAAI,CAACE,WAAW,EAAE,CAAC,CAAC,GACjD,YAAY,CACjB,CAAC;QAEF,OAAO;YACLC,IAAI,EAAEH,IAAI,CAACI,SAAS,EAAE,CAACC,QAAQ,EAAE;YACjCC,OAAO,EAAE9D,cAAc;YACvBf,OAAO;SACR,CAAC;KACH;IAED,AAAQwE,WAAW,CAAC,EAClBhB,mBAAmB,CAAA,EACnBG,mBAAmB,CAAA,EACnBC,oBAAoB,CAAA,EAKrB,EAAY;QACX,MAAMW,IAAI,GAAG,IAAIO,SAAQ,QAAA,EAAE,AAAC;QAC5BP,IAAI,CAACQ,MAAM,CAAC,UAAU,EAAEvB,mBAAmB,EAAE;YAC3CT,WAAW,EAAE,kBAAkB;YAC/BiC,MAAM,EAAE;gBACN,GAAGrB,mBAAmB;aACvB;SACF,CAAC,CAAC;QACH,IAAIC,oBAAoB,IAAIA,oBAAoB,CAACqB,MAAM,GAAG,CAAC,EAAE;YAC3DV,IAAI,CAACQ,MAAM,CAAC,mBAAmB,EAAEnB,oBAAoB,EAAE;gBACrDb,WAAW,EAAE,wBAAwB;aACtC,CAAC,CAAC;SACJ;QACD,OAAOwB,IAAI,CAAC;KACb;IAED,AAAUW,aAAa,CAACL,OAAgB,EAAE;QACxCM,CAAAA,GAAAA,kBAAa,AAEX,CAAA,cAFW,CAAC,6BAA6B,EAAE;YAC3CpE,cAAc,EAAE8D,OAAO;SACxB,CAAC,CAAC;KACJ;IAED,AAAQtB,4BAA4B,GAAG6B,CAAAA,GAAAA,GAAO,AAAyB,CAAA,QAAzB,CAACC,aAAuB,wBAAA,CAAC,CAAC;IAExE,AAAQhD,4BAA4B,GAAG+C,CAAAA,GAAAA,GAAO,AAA8B,CAAA,QAA9B,CAAC/C,4BAA4B,CAAC,CAAC;CAC9E;QArLYjD,+BAA+B,GAA/BA,+BAA+B;AAuL5C;;;;;GAKG,CACH,eAAeyC,+BAA+B,CAC5CL,YAAuC,EACvCJ,eAAuC,EACrB;IAClB,IAAI,CAACI,YAAY,IAAK8D,SAAW,YAAA,CAACC,SAAS,IAAInE,eAAe,KAAK,IAAI,AAAC,EAAE;QACxE,OAAO,IAAI,CAAC;KACb;IAED,OAAO,CAAE,MAAMoE,CAAAA,GAAAA,KAAY,AAAE,CAAA,aAAF,EAAE,AAAC,CAAC;CAChC;AAED,eAAenD,4BAA4B,CAACV,SAAiB,EAAmB;IAC9E,MAAM8D,OAAO,GAAG,MAAMC,CAAAA,GAAAA,WAAe,AAAW,CAAA,gBAAX,CAAC/D,SAAS,CAAC,AAAC;IACjD,OAAO8D,OAAO,CAACvD,QAAQ,CAAC;CACzB;AAED,SAAS8B,sCAAsC,CAAC2B,GAA8B,EAAc;IAC1F,OAAO,IAAIrF,GAAG,CACZsF,MAAM,CAACC,OAAO,CAACF,GAAG,CAAC,CAACG,GAAG,CAAC,CAAC,CAACC,CAAC,EAAEC,CAAC,CAAC,GAAK;QAClC,OAAO;YAACD,CAAC;YAAE;gBAACC,CAAC;gBAAE,IAAI1F,GAAG,EAAE;aAAC;SAAC,CAAC;KAC5B,CAAC,CACH,CAAC;CACH"}
1
+ {"version":3,"sources":["../../../../../src/start/server/middleware/ExpoGoManifestHandlerMiddleware.ts"],"sourcesContent":["import { ExpoUpdatesManifest } from '@expo/config';\nimport { Updates } from '@expo/config-plugins';\nimport accepts from 'accepts';\nimport assert from 'assert';\nimport crypto from 'crypto';\nimport FormData from 'form-data';\nimport { serializeDictionary, Dictionary } from 'structured-headers';\n\nimport { getProjectAsync } from '../../../api/getProject';\nimport { APISettings } from '../../../api/settings';\nimport { signExpoGoManifestAsync } from '../../../api/signManifest';\nimport UserSettings from '../../../api/user/UserSettings';\nimport { ANONYMOUS_USERNAME, getUserAsync } from '../../../api/user/user';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport {\n CodeSigningInfo,\n getCodeSigningInfoAsync,\n signManifestString,\n} from '../../../utils/codesigning';\nimport { CommandError } from '../../../utils/errors';\nimport { memoize } from '../../../utils/fn';\nimport { stripPort } from '../../../utils/url';\nimport { ManifestMiddleware, ManifestRequestInfo } from './ManifestMiddleware';\nimport { assertRuntimePlatform, parsePlatformHeader } from './resolvePlatform';\nimport { ServerHeaders, ServerRequest } from './server.types';\n\nconst debug = require('debug')('expo:start:server:middleware:ExpoGoManifestHandlerMiddleware');\n\ninterface ExpoGoManifestRequestInfo extends ManifestRequestInfo {\n explicitlyPrefersMultipartMixed: boolean;\n expectSignature: string | null;\n}\n\nexport class ExpoGoManifestHandlerMiddleware extends ManifestMiddleware<ExpoGoManifestRequestInfo> {\n public getParsedHeaders(req: ServerRequest): ExpoGoManifestRequestInfo {\n let platform = parsePlatformHeader(req);\n\n if (!platform) {\n debug(\n `No \"expo-platform\" header or \"platform\" query parameter specified. Falling back to \"none\".`\n );\n platform = 'none';\n }\n\n assertRuntimePlatform(platform);\n\n // Expo Updates clients explicitly accept \"multipart/mixed\" responses while browsers implicitly\n // accept them with \"accept: */*\". To make it easier to debug manifest responses by visiting their\n // URLs in a browser, we denote the response as \"text/plain\" if the user agent appears not to be\n // an Expo Updates client.\n const accept = accepts(req);\n const explicitlyPrefersMultipartMixed =\n accept.types(['unknown/unknown', 'multipart/mixed']) === 'multipart/mixed';\n\n const expectSignature = req.headers['expo-expect-signature'];\n\n return {\n explicitlyPrefersMultipartMixed,\n platform,\n acceptSignature: this.getLegacyAcceptSignatureHeader(req),\n expectSignature: expectSignature ? String(expectSignature) : null,\n hostname: stripPort(req.headers['host']),\n };\n }\n\n private getDefaultResponseHeaders(): ServerHeaders {\n const headers = new Map<string, number | string | readonly string[]>();\n // set required headers for Expo Updates manifest specification\n headers.set('expo-protocol-version', 0);\n headers.set('expo-sfv-version', 0);\n headers.set('cache-control', 'private, max-age=0');\n return headers;\n }\n\n public async _getManifestResponseAsync(requestOptions: ExpoGoManifestRequestInfo): Promise<{\n body: string;\n version: string;\n headers: ServerHeaders;\n }> {\n const { exp, hostUri, expoGoConfig, bundleUrl } = await this._resolveProjectSettingsAsync(\n requestOptions\n );\n\n const runtimeVersion = Updates.getRuntimeVersion(\n { ...exp, runtimeVersion: exp.runtimeVersion ?? { policy: 'sdkVersion' } },\n requestOptions.platform\n );\n if (!runtimeVersion) {\n throw new CommandError(\n 'MANIFEST_MIDDLEWARE',\n `Unable to determine runtime version for platform '${requestOptions.platform}'`\n );\n }\n\n const codeSigningInfo = await getCodeSigningInfoAsync(\n exp,\n requestOptions.expectSignature,\n this.options.privateKeyPath\n );\n\n const easProjectId = exp.extra?.eas?.projectId;\n const shouldUseAnonymousManifest = await shouldUseAnonymousManifestAsync(\n easProjectId,\n codeSigningInfo\n );\n const userAnonymousIdentifier = await UserSettings.getAnonymousIdentifierAsync();\n if (!shouldUseAnonymousManifest) {\n assert(easProjectId);\n }\n const scopeKey = shouldUseAnonymousManifest\n ? `@${ANONYMOUS_USERNAME}/${exp.slug}-${userAnonymousIdentifier}`\n : await this.getScopeKeyForProjectIdAsync(easProjectId);\n\n const expoUpdatesManifest: ExpoUpdatesManifest = {\n id: crypto.randomUUID(),\n createdAt: new Date().toISOString(),\n runtimeVersion,\n launchAsset: {\n key: 'bundle',\n contentType: 'application/javascript',\n url: bundleUrl,\n },\n assets: [], // assets are not used in development\n metadata: {}, // required for the client to detect that this is an expo-updates manifest\n extra: {\n eas: {\n projectId: easProjectId ?? undefined,\n },\n expoClient: {\n ...exp,\n hostUri,\n },\n expoGo: expoGoConfig,\n scopeKey,\n },\n };\n\n const headers = this.getDefaultResponseHeaders();\n if (requestOptions.acceptSignature && !shouldUseAnonymousManifest) {\n const manifestSignature = await this.getSignedManifestStringAsync(expoUpdatesManifest);\n headers.set('expo-manifest-signature', manifestSignature);\n }\n\n const stringifiedManifest = JSON.stringify(expoUpdatesManifest);\n\n let manifestPartHeaders: { 'expo-signature': string } | null = null;\n let certificateChainBody: string | null = null;\n if (codeSigningInfo) {\n const signature = signManifestString(stringifiedManifest, codeSigningInfo);\n manifestPartHeaders = {\n 'expo-signature': serializeDictionary(\n convertToDictionaryItemsRepresentation({\n keyid: codeSigningInfo.keyId,\n sig: signature,\n alg: 'rsa-v1_5-sha256',\n })\n ),\n };\n certificateChainBody = codeSigningInfo.certificateChainForResponse.join('\\n');\n }\n\n const form = this.getFormData({\n stringifiedManifest,\n manifestPartHeaders,\n certificateChainBody,\n });\n\n headers.set(\n 'content-type',\n requestOptions.explicitlyPrefersMultipartMixed\n ? `multipart/mixed; boundary=${form.getBoundary()}`\n : 'text/plain'\n );\n\n return {\n body: form.getBuffer().toString(),\n version: runtimeVersion,\n headers,\n };\n }\n\n private getFormData({\n stringifiedManifest,\n manifestPartHeaders,\n certificateChainBody,\n }: {\n stringifiedManifest: string;\n manifestPartHeaders: { 'expo-signature': string } | null;\n certificateChainBody: string | null;\n }): FormData {\n const form = new FormData();\n form.append('manifest', stringifiedManifest, {\n contentType: 'application/json',\n header: {\n ...manifestPartHeaders,\n },\n });\n if (certificateChainBody && certificateChainBody.length > 0) {\n form.append('certificate_chain', certificateChainBody, {\n contentType: 'application/x-pem-file',\n });\n }\n return form;\n }\n\n protected trackManifest(version?: string) {\n logEventAsync('Serve Expo Updates Manifest', {\n runtimeVersion: version,\n });\n }\n\n private getSignedManifestStringAsync = memoize(signExpoGoManifestAsync);\n\n private getScopeKeyForProjectIdAsync = memoize(getScopeKeyForProjectIdAsync);\n}\n\n/**\n * 1. No EAS project ID in config, then use anonymous scope key\n * 2. When offline or not logged in\n * a. If code signing not accepted by client (only legacy manifest signing is supported), then use anonymous scope key\n * b. If code signing accepted by client and no development code signing certificate is cached, then use anonymous scope key\n */\nasync function shouldUseAnonymousManifestAsync(\n easProjectId: string | undefined | null,\n codeSigningInfo: CodeSigningInfo | null\n): Promise<boolean> {\n if (!easProjectId || (APISettings.isOffline && codeSigningInfo === null)) {\n return true;\n }\n\n return !(await getUserAsync());\n}\n\nasync function getScopeKeyForProjectIdAsync(projectId: string): Promise<string> {\n const project = await getProjectAsync(projectId);\n return project.scopeKey;\n}\n\nfunction convertToDictionaryItemsRepresentation(obj: { [key: string]: string }): Dictionary {\n return new Map(\n Object.entries(obj).map(([k, v]) => {\n return [k, [v, new Map()]];\n })\n );\n}\n"],"names":["debug","require","ExpoGoManifestHandlerMiddleware","ManifestMiddleware","getParsedHeaders","req","platform","parsePlatformHeader","assertRuntimePlatform","accept","accepts","explicitlyPrefersMultipartMixed","types","expectSignature","headers","acceptSignature","getLegacyAcceptSignatureHeader","String","hostname","stripPort","getDefaultResponseHeaders","Map","set","_getManifestResponseAsync","requestOptions","exp","hostUri","expoGoConfig","bundleUrl","_resolveProjectSettingsAsync","runtimeVersion","Updates","getRuntimeVersion","policy","CommandError","codeSigningInfo","getCodeSigningInfoAsync","options","privateKeyPath","easProjectId","extra","eas","projectId","shouldUseAnonymousManifest","shouldUseAnonymousManifestAsync","userAnonymousIdentifier","UserSettings","getAnonymousIdentifierAsync","assert","scopeKey","ANONYMOUS_USERNAME","slug","getScopeKeyForProjectIdAsync","expoUpdatesManifest","id","crypto","randomUUID","createdAt","Date","toISOString","launchAsset","key","contentType","url","assets","metadata","undefined","expoClient","expoGo","manifestSignature","getSignedManifestStringAsync","stringifiedManifest","JSON","stringify","manifestPartHeaders","certificateChainBody","signature","signManifestString","serializeDictionary","convertToDictionaryItemsRepresentation","keyid","keyId","sig","alg","certificateChainForResponse","join","form","getFormData","getBoundary","body","getBuffer","toString","version","FormData","append","header","length","trackManifest","logEventAsync","memoize","signExpoGoManifestAsync","APISettings","isOffline","getUserAsync","project","getProjectAsync","obj","Object","entries","map","k","v"],"mappings":"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"}
@@ -120,6 +120,13 @@ class ManifestMiddleware extends _expoMiddleware.ExpoMiddleware {
120
120
  }
121
121
  return (0, _url1).stripExtension(entryPoint, "js");
122
122
  }
123
+ /**
124
+ * This header is specified as a string "true" or "false", in one of two headers:
125
+ * - exponent-accept-signature
126
+ * - expo-accept-signature
127
+ */ getLegacyAcceptSignatureHeader(req) {
128
+ return req.headers["exponent-accept-signature"] === "true" || req.headers["expo-accept-signature"] === "true";
129
+ }
123
130
  /** Store device IDs that were sent in the request headers. */ async saveDevicesAsync(req) {
124
131
  var ref;
125
132
  const deviceIds = (ref = req.headers) == null ? void 0 : ref["expo-dev-client-id"];
@@ -1 +1 @@
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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"}
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 /**\n * This header is specified as a string \"true\" or \"false\", in one of two headers:\n * - exponent-accept-signature\n * - expo-accept-signature\n */\n protected getLegacyAcceptSignatureHeader(req: ServerRequest): boolean {\n return (\n req.headers['exponent-accept-signature'] === 'true' ||\n req.headers['expo-accept-signature'] === 'true'\n );\n }\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","getLegacyAcceptSignatureHeader","req","headers","saveDevicesAsync","deviceIds","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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"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ exports.ReactDevToolsEndpoint = void 0;
6
+ var _promises = require("fs/promises");
7
+ var _path = _interopRequireDefault(require("path"));
8
+ var _resolveFrom = _interopRequireDefault(require("resolve-from"));
9
+ var _expoMiddleware = require("./ExpoMiddleware");
10
+ function _interopRequireDefault(obj) {
11
+ return obj && obj.__esModule ? obj : {
12
+ default: obj
13
+ };
14
+ }
15
+ const ReactDevToolsEndpoint = "/_expo/react-devtools";
16
+ exports.ReactDevToolsEndpoint = ReactDevToolsEndpoint;
17
+ class ReactDevToolsPageMiddleware extends _expoMiddleware.ExpoMiddleware {
18
+ constructor(projectRoot){
19
+ super(projectRoot, [
20
+ ReactDevToolsEndpoint
21
+ ]);
22
+ }
23
+ async handleRequestAsync(req, res) {
24
+ var // Production: This will resolve when installed in the project.
25
+ ref;
26
+ const templatePath = (ref = _resolveFrom.default.silent(this.projectRoot, "expo/static/react-devtools-page/index.html")) != null ? ref : // Development: This will resolve when testing locally.
27
+ _path.default.resolve(__dirname, "../../../../../static/react-devtools-page/index.html");
28
+ const content = (await (0, _promises).readFile(templatePath)).toString("utf-8");
29
+ res.setHeader("Content-Type", "text/html");
30
+ res.end(content);
31
+ }
32
+ }
33
+ exports.ReactDevToolsPageMiddleware = ReactDevToolsPageMiddleware;
34
+
35
+ //# sourceMappingURL=ReactDevToolsPageMiddleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/start/server/middleware/ReactDevToolsPageMiddleware.ts"],"sourcesContent":["import { readFile } from 'fs/promises';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { ExpoMiddleware } from './ExpoMiddleware';\nimport { ServerRequest, ServerResponse } from './server.types';\n\nexport const ReactDevToolsEndpoint = '/_expo/react-devtools';\n\nexport class ReactDevToolsPageMiddleware extends ExpoMiddleware {\n constructor(projectRoot: string) {\n super(projectRoot, [ReactDevToolsEndpoint]);\n }\n\n async handleRequestAsync(req: ServerRequest, res: ServerResponse): Promise<void> {\n const templatePath =\n // Production: This will resolve when installed in the project.\n resolveFrom.silent(this.projectRoot, 'expo/static/react-devtools-page/index.html') ??\n // Development: This will resolve when testing locally.\n path.resolve(__dirname, '../../../../../static/react-devtools-page/index.html');\n const content = (await readFile(templatePath)).toString('utf-8');\n\n res.setHeader('Content-Type', 'text/html');\n res.end(content);\n }\n}\n"],"names":["ReactDevToolsEndpoint","ReactDevToolsPageMiddleware","ExpoMiddleware","constructor","projectRoot","handleRequestAsync","req","res","resolveFrom","templatePath","silent","path","resolve","__dirname","content","readFile","toString","setHeader","end"],"mappings":"AAAA;;;;;AAAyB,IAAA,SAAa,WAAb,aAAa,CAAA;AACrB,IAAA,KAAM,kCAAN,MAAM,EAAA;AACC,IAAA,YAAc,kCAAd,cAAc,EAAA;AAEP,IAAA,eAAkB,WAAlB,kBAAkB,CAAA;;;;;;AAG1C,MAAMA,qBAAqB,GAAG,uBAAuB,AAAC;QAAhDA,qBAAqB,GAArBA,qBAAqB;AAE3B,MAAMC,2BAA2B,SAASC,eAAc,eAAA;IAC7DC,YAAYC,WAAmB,CAAE;QAC/B,KAAK,CAACA,WAAW,EAAE;YAACJ,qBAAqB;SAAC,CAAC,CAAC;KAC7C;IAED,MAAMK,kBAAkB,CAACC,GAAkB,EAAEC,GAAmB,EAAiB;YAE7E,+DAA+D;QAC/DC,GAAkF;QAFpF,MAAMC,YAAY,GAEhBD,CAAAA,GAAkF,GAAlFA,YAAW,QAAA,CAACE,MAAM,CAAC,IAAI,CAACN,WAAW,EAAE,4CAA4C,CAAC,YAAlFI,GAAkF,GAClF,uDAAuD;QACvDG,KAAI,QAAA,CAACC,OAAO,CAACC,SAAS,EAAE,sDAAsD,CAAC,AAAC;QAClF,MAAMC,OAAO,GAAG,CAAC,MAAMC,CAAAA,GAAAA,SAAQ,AAAc,CAAA,SAAd,CAACN,YAAY,CAAC,CAAC,CAACO,QAAQ,CAAC,OAAO,CAAC,AAAC;QAEjET,GAAG,CAACU,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QAC3CV,GAAG,CAACW,GAAG,CAACJ,OAAO,CAAC,CAAC;KAClB;CACF;QAhBYb,2BAA2B,GAA3BA,2BAA2B"}
@@ -94,7 +94,7 @@ async function logEventAsync(event, properties = {}) {
94
94
  }
95
95
  const { userId , deviceId } = identifyData;
96
96
  const commonEventProperties = {
97
- source_version: "0.6.1",
97
+ source_version: "0.7.0",
98
98
  source: "expo"
99
99
  };
100
100
  const identity = {
@@ -135,7 +135,7 @@ function getContext() {
135
135
  },
136
136
  app: {
137
137
  name: "expo",
138
- version: "0.6.1"
138
+ version: "0.7.0"
139
139
  },
140
140
  ci: ciInfo.isCI ? {
141
141
  name: ciInfo.name,
@@ -106,6 +106,9 @@ class Env {
106
106
  */ get HTTP_PROXY() {
107
107
  return process.env.HTTP_PROXY || process.env.http_proxy || "";
108
108
  }
109
+ /** **Experimental:** Use the network inspector by overriding the metro inspector proxy with a custom version */ get EXPO_USE_CUSTOM_INSPECTOR_PROXY() {
110
+ return (0, _getenv).boolish("EXPO_USE_CUSTOM_INSPECTOR_PROXY", false);
111
+ }
109
112
  }
110
113
  const env = new Env();
111
114
  exports.env = env;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/env.ts"],"sourcesContent":["import { boolish, int, string } from 'getenv';\n\n// @expo/webpack-config -> expo-pwa -> @expo/image-utils: EXPO_IMAGE_UTILS_NO_SHARP\n\n// TODO: EXPO_CLI_USERNAME, EXPO_CLI_PASSWORD\n\nclass Env {\n /** Enable profiling metrics */\n get EXPO_PROFILE() {\n return boolish('EXPO_PROFILE', false);\n }\n\n /** Enable debug logging */\n get EXPO_DEBUG() {\n return boolish('EXPO_DEBUG', false);\n }\n\n /** Enable the beta version of Expo (TODO: Should this just be in the beta version of expo releases?) */\n get EXPO_BETA() {\n return boolish('EXPO_BETA', false);\n }\n\n /** Enable staging API environment */\n get EXPO_STAGING() {\n return boolish('EXPO_STAGING', false);\n }\n\n /** Enable local API environment */\n get EXPO_LOCAL() {\n return boolish('EXPO_LOCAL', false);\n }\n\n /** Is running in non-interactive CI mode */\n get CI() {\n return boolish('CI', false);\n }\n\n /** Disable telemetry (analytics) */\n get EXPO_NO_TELEMETRY() {\n return boolish('EXPO_NO_TELEMETRY', false);\n }\n\n /** local directory to the universe repo for testing locally */\n get EXPO_UNIVERSE_DIR() {\n return string('EXPO_UNIVERSE_DIR', '');\n }\n\n /** @deprecated Default Webpack host string */\n get WEB_HOST() {\n return string('WEB_HOST', '0.0.0.0');\n }\n\n /** Skip warning users about a dirty git status */\n get EXPO_NO_GIT_STATUS() {\n return boolish('EXPO_NO_GIT_STATUS', false);\n }\n /** Disable auto web setup */\n get EXPO_NO_WEB_SETUP() {\n return boolish('EXPO_NO_WEB_SETUP', false);\n }\n /** Disable auto TypeScript setup */\n get EXPO_NO_TYPESCRIPT_SETUP() {\n return boolish('EXPO_NO_TYPESCRIPT_SETUP', false);\n }\n /** Disable all API caches. Does not disable bundler caches. */\n get EXPO_NO_CACHE() {\n return boolish('EXPO_NO_CACHE', false);\n }\n /** Disable the app select redirect page. */\n get EXPO_NO_REDIRECT_PAGE() {\n return boolish('EXPO_NO_REDIRECT_PAGE', false);\n }\n /** The React Metro port that's baked into react-native scripts and tools. */\n get RCT_METRO_PORT() {\n return int('RCT_METRO_PORT', 0);\n }\n /** Skip validating the manifest during `export`. */\n get EXPO_SKIP_MANIFEST_VALIDATION_TOKEN(): boolean {\n return !!string('EXPO_SKIP_MANIFEST_VALIDATION_TOKEN');\n }\n\n /** Public folder path relative to the project root. Default to `public` */\n get EXPO_PUBLIC_FOLDER(): string {\n return string('EXPO_PUBLIC_FOLDER', 'public');\n }\n\n /** Higher priority `$EDIOTR` variable for indicating which editor to use when pressing `o` in the Terminal UI. */\n get EXPO_EDITOR(): string {\n return string('EXPO_EDITOR', '');\n }\n\n /** Enable auto server root detection for Metro. This will change the server root to the workspace root. */\n get EXPO_USE_METRO_WORKSPACE_ROOT(): boolean {\n return boolish('EXPO_USE_METRO_WORKSPACE_ROOT', false);\n }\n\n /**\n * Overwrite the dev server URL, disregarding the `--port`, `--host`, `--tunnel`, `--lan`, `--localhost` arguments.\n * This is useful for browser editors that require custom proxy URLs.\n */\n get EXPO_PACKAGER_PROXY_URL(): string {\n return string('EXPO_PACKAGER_PROXY_URL', '');\n }\n\n /**\n * **Experimental** - Disable using `exp.direct` as the hostname for\n * `--tunnel` connections. This enables **https://** forwarding which\n * can be used to test universal links on iOS.\n *\n * This may cause issues with `expo-linking` and Expo Go.\n *\n * Select the exact subdomain by passing a string value that is not one of: `true`, `false`, `1`, `0`.\n */\n get EXPO_TUNNEL_SUBDOMAIN(): string | boolean {\n const subdomain = string('EXPO_TUNNEL_SUBDOMAIN', '');\n if (['0', 'false', ''].includes(subdomain)) {\n return false;\n } else if (['1', 'true'].includes(subdomain)) {\n return true;\n }\n return subdomain;\n }\n\n /**\n * Force Expo CLI to use the [`resolver.resolverMainFields`](https://facebook.github.io/metro/docs/configuration/#resolvermainfields) from the project `metro.config.js` for all platforms.\n *\n * By default, Expo CLI will use `['browser', 'module', 'main']` (default for Webpack) for web and the user-defined main fields for other platforms.\n */\n get EXPO_METRO_NO_MAIN_FIELD_OVERRIDE(): boolean {\n return boolish('EXPO_METRO_NO_MAIN_FIELD_OVERRIDE', false);\n }\n\n /**\n * HTTP/HTTPS proxy to connect to for network requests. Configures [https-proxy-agent](https://www.npmjs.com/package/https-proxy-agent).\n */\n get HTTP_PROXY(): string {\n return process.env.HTTP_PROXY || process.env.http_proxy || '';\n }\n}\n\nexport const env = new Env();\n"],"names":["Env","EXPO_PROFILE","boolish","EXPO_DEBUG","EXPO_BETA","EXPO_STAGING","EXPO_LOCAL","CI","EXPO_NO_TELEMETRY","EXPO_UNIVERSE_DIR","string","WEB_HOST","EXPO_NO_GIT_STATUS","EXPO_NO_WEB_SETUP","EXPO_NO_TYPESCRIPT_SETUP","EXPO_NO_CACHE","EXPO_NO_REDIRECT_PAGE","RCT_METRO_PORT","int","EXPO_SKIP_MANIFEST_VALIDATION_TOKEN","EXPO_PUBLIC_FOLDER","EXPO_EDITOR","EXPO_USE_METRO_WORKSPACE_ROOT","EXPO_PACKAGER_PROXY_URL","EXPO_TUNNEL_SUBDOMAIN","subdomain","includes","EXPO_METRO_NO_MAIN_FIELD_OVERRIDE","HTTP_PROXY","process","env","http_proxy"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utils/env.ts"],"sourcesContent":["import { boolish, int, string } from 'getenv';\n\n// @expo/webpack-config -> expo-pwa -> @expo/image-utils: EXPO_IMAGE_UTILS_NO_SHARP\n\n// TODO: EXPO_CLI_USERNAME, EXPO_CLI_PASSWORD\n\nclass Env {\n /** Enable profiling metrics */\n get EXPO_PROFILE() {\n return boolish('EXPO_PROFILE', false);\n }\n\n /** Enable debug logging */\n get EXPO_DEBUG() {\n return boolish('EXPO_DEBUG', false);\n }\n\n /** Enable the beta version of Expo (TODO: Should this just be in the beta version of expo releases?) */\n get EXPO_BETA() {\n return boolish('EXPO_BETA', false);\n }\n\n /** Enable staging API environment */\n get EXPO_STAGING() {\n return boolish('EXPO_STAGING', false);\n }\n\n /** Enable local API environment */\n get EXPO_LOCAL() {\n return boolish('EXPO_LOCAL', false);\n }\n\n /** Is running in non-interactive CI mode */\n get CI() {\n return boolish('CI', false);\n }\n\n /** Disable telemetry (analytics) */\n get EXPO_NO_TELEMETRY() {\n return boolish('EXPO_NO_TELEMETRY', false);\n }\n\n /** local directory to the universe repo for testing locally */\n get EXPO_UNIVERSE_DIR() {\n return string('EXPO_UNIVERSE_DIR', '');\n }\n\n /** @deprecated Default Webpack host string */\n get WEB_HOST() {\n return string('WEB_HOST', '0.0.0.0');\n }\n\n /** Skip warning users about a dirty git status */\n get EXPO_NO_GIT_STATUS() {\n return boolish('EXPO_NO_GIT_STATUS', false);\n }\n /** Disable auto web setup */\n get EXPO_NO_WEB_SETUP() {\n return boolish('EXPO_NO_WEB_SETUP', false);\n }\n /** Disable auto TypeScript setup */\n get EXPO_NO_TYPESCRIPT_SETUP() {\n return boolish('EXPO_NO_TYPESCRIPT_SETUP', false);\n }\n /** Disable all API caches. Does not disable bundler caches. */\n get EXPO_NO_CACHE() {\n return boolish('EXPO_NO_CACHE', false);\n }\n /** Disable the app select redirect page. */\n get EXPO_NO_REDIRECT_PAGE() {\n return boolish('EXPO_NO_REDIRECT_PAGE', false);\n }\n /** The React Metro port that's baked into react-native scripts and tools. */\n get RCT_METRO_PORT() {\n return int('RCT_METRO_PORT', 0);\n }\n /** Skip validating the manifest during `export`. */\n get EXPO_SKIP_MANIFEST_VALIDATION_TOKEN(): boolean {\n return !!string('EXPO_SKIP_MANIFEST_VALIDATION_TOKEN');\n }\n\n /** Public folder path relative to the project root. Default to `public` */\n get EXPO_PUBLIC_FOLDER(): string {\n return string('EXPO_PUBLIC_FOLDER', 'public');\n }\n\n /** Higher priority `$EDIOTR` variable for indicating which editor to use when pressing `o` in the Terminal UI. */\n get EXPO_EDITOR(): string {\n return string('EXPO_EDITOR', '');\n }\n\n /** Enable auto server root detection for Metro. This will change the server root to the workspace root. */\n get EXPO_USE_METRO_WORKSPACE_ROOT(): boolean {\n return boolish('EXPO_USE_METRO_WORKSPACE_ROOT', false);\n }\n\n /**\n * Overwrite the dev server URL, disregarding the `--port`, `--host`, `--tunnel`, `--lan`, `--localhost` arguments.\n * This is useful for browser editors that require custom proxy URLs.\n */\n get EXPO_PACKAGER_PROXY_URL(): string {\n return string('EXPO_PACKAGER_PROXY_URL', '');\n }\n\n /**\n * **Experimental** - Disable using `exp.direct` as the hostname for\n * `--tunnel` connections. This enables **https://** forwarding which\n * can be used to test universal links on iOS.\n *\n * This may cause issues with `expo-linking` and Expo Go.\n *\n * Select the exact subdomain by passing a string value that is not one of: `true`, `false`, `1`, `0`.\n */\n get EXPO_TUNNEL_SUBDOMAIN(): string | boolean {\n const subdomain = string('EXPO_TUNNEL_SUBDOMAIN', '');\n if (['0', 'false', ''].includes(subdomain)) {\n return false;\n } else if (['1', 'true'].includes(subdomain)) {\n return true;\n }\n return subdomain;\n }\n\n /**\n * Force Expo CLI to use the [`resolver.resolverMainFields`](https://facebook.github.io/metro/docs/configuration/#resolvermainfields) from the project `metro.config.js` for all platforms.\n *\n * By default, Expo CLI will use `['browser', 'module', 'main']` (default for Webpack) for web and the user-defined main fields for other platforms.\n */\n get EXPO_METRO_NO_MAIN_FIELD_OVERRIDE(): boolean {\n return boolish('EXPO_METRO_NO_MAIN_FIELD_OVERRIDE', false);\n }\n\n /**\n * HTTP/HTTPS proxy to connect to for network requests. Configures [https-proxy-agent](https://www.npmjs.com/package/https-proxy-agent).\n */\n get HTTP_PROXY(): string {\n return process.env.HTTP_PROXY || process.env.http_proxy || '';\n }\n\n /** **Experimental:** Use the network inspector by overriding the metro inspector proxy with a custom version */\n get EXPO_USE_CUSTOM_INSPECTOR_PROXY(): boolean {\n return boolish('EXPO_USE_CUSTOM_INSPECTOR_PROXY', false);\n }\n}\n\nexport const env = new Env();\n"],"names":["Env","EXPO_PROFILE","boolish","EXPO_DEBUG","EXPO_BETA","EXPO_STAGING","EXPO_LOCAL","CI","EXPO_NO_TELEMETRY","EXPO_UNIVERSE_DIR","string","WEB_HOST","EXPO_NO_GIT_STATUS","EXPO_NO_WEB_SETUP","EXPO_NO_TYPESCRIPT_SETUP","EXPO_NO_CACHE","EXPO_NO_REDIRECT_PAGE","RCT_METRO_PORT","int","EXPO_SKIP_MANIFEST_VALIDATION_TOKEN","EXPO_PUBLIC_FOLDER","EXPO_EDITOR","EXPO_USE_METRO_WORKSPACE_ROOT","EXPO_PACKAGER_PROXY_URL","EXPO_TUNNEL_SUBDOMAIN","subdomain","includes","EXPO_METRO_NO_MAIN_FIELD_OVERRIDE","HTTP_PROXY","process","env","http_proxy","EXPO_USE_CUSTOM_INSPECTOR_PROXY"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/cli",
3
- "version": "0.6.1",
3
+ "version": "0.7.0",
4
4
  "description": "The Expo CLI",
5
5
  "main": "build/bin/cli",
6
6
  "bin": {
@@ -40,7 +40,7 @@
40
40
  "@expo/code-signing-certificates": "0.0.5",
41
41
  "@expo/config": "~8.0.0",
42
42
  "@expo/config-plugins": "~6.0.0",
43
- "@expo/dev-server": "0.2.2",
43
+ "@expo/dev-server": "0.3.0",
44
44
  "@expo/devcert": "^1.0.0",
45
45
  "@expo/json-file": "^8.2.37",
46
46
  "@expo/metro-config": "~0.7.0",
@@ -95,7 +95,8 @@
95
95
  "terminal-link": "^2.1.1",
96
96
  "text-table": "^0.2.0",
97
97
  "url-join": "4.0.0",
98
- "wrap-ansi": "^7.0.0"
98
+ "wrap-ansi": "^7.0.0",
99
+ "ws": "^8.12.1"
99
100
  },
100
101
  "taskr": {
101
102
  "requires": [
@@ -132,6 +133,8 @@
132
133
  "@types/webpack": "~4.41.32",
133
134
  "@types/webpack-dev-server": "3.11.0",
134
135
  "@types/wrap-ansi": "^8.0.1",
136
+ "@types/ws": "^8.5.4",
137
+ "devtools-protocol": "^0.0.1113120",
135
138
  "expo-module-scripts": "^3.0.0",
136
139
  "klaw-sync": "^6.0.0",
137
140
  "nock": "~13.2.2",
@@ -139,5 +142,5 @@
139
142
  "structured-headers": "^0.4.1",
140
143
  "taskr": "1.1.0"
141
144
  },
142
- "gitHead": "4dd0cc2752d2486fa72b71742d2c4a6b63c1587d"
145
+ "gitHead": "362ed24e78a57e9839afd2925d2af4aff7e28437"
143
146
  }