@expo/cli 0.9.0 → 0.10.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 (76) hide show
  1. package/build/bin/cli +2 -2
  2. package/build/src/api/rest/client.js +29 -18
  3. package/build/src/api/rest/client.js.map +1 -1
  4. package/build/src/api/rest/wrapFetchWithOffline.js +2 -2
  5. package/build/src/api/rest/wrapFetchWithOffline.js.map +1 -1
  6. package/build/src/api/settings.js +14 -5
  7. package/build/src/api/settings.js.map +1 -1
  8. package/build/src/api/user/actions.js +5 -0
  9. package/build/src/api/user/actions.js.map +1 -1
  10. package/build/src/api/user/user.js +2 -2
  11. package/build/src/api/user/user.js.map +1 -1
  12. package/build/src/register/registerAsync.js +3 -0
  13. package/build/src/register/registerAsync.js.map +1 -1
  14. package/build/src/start/doctor/dependencies/bundledNativeModules.js +8 -4
  15. package/build/src/start/doctor/dependencies/bundledNativeModules.js.map +1 -1
  16. package/build/src/start/doctor/dependencies/getVersionedPackages.js +25 -8
  17. package/build/src/start/doctor/dependencies/getVersionedPackages.js.map +1 -1
  18. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +2 -2
  19. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -1
  20. package/build/src/start/index.js +18 -11
  21. package/build/src/start/index.js.map +1 -1
  22. package/build/src/start/interface/commandsTable.js +12 -0
  23. package/build/src/start/interface/commandsTable.js.map +1 -1
  24. package/build/src/start/interface/interactiveActions.js +7 -2
  25. package/build/src/start/interface/interactiveActions.js.map +1 -1
  26. package/build/src/start/interface/startInterface.js +9 -0
  27. package/build/src/start/interface/startInterface.js.map +1 -1
  28. package/build/src/start/platforms/ExpoGoInstaller.js +7 -6
  29. package/build/src/start/platforms/ExpoGoInstaller.js.map +1 -1
  30. package/build/src/start/platforms/PlatformManager.js.map +1 -1
  31. package/build/src/start/resolveOptions.js +17 -33
  32. package/build/src/start/resolveOptions.js.map +1 -1
  33. package/build/src/start/server/BundlerDevServer.js +1 -9
  34. package/build/src/start/server/BundlerDevServer.js.map +1 -1
  35. package/build/src/start/server/DevServerManager.js +22 -0
  36. package/build/src/start/server/DevServerManager.js.map +1 -1
  37. package/build/src/start/server/DevelopmentSession.js +3 -3
  38. package/build/src/start/server/DevelopmentSession.js.map +1 -1
  39. package/build/src/start/server/UrlCreator.js +2 -2
  40. package/build/src/start/server/UrlCreator.js.map +1 -1
  41. package/build/src/start/server/metro/MetroBundlerDevServer.js +6 -3
  42. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  43. package/build/src/start/server/metro/inspector-proxy/device.js +19 -0
  44. package/build/src/start/server/metro/inspector-proxy/device.js.map +1 -1
  45. package/build/src/start/server/metro/inspector-proxy/index.js +1 -1
  46. package/build/src/start/server/metro/inspector-proxy/index.js.map +1 -1
  47. package/build/src/start/server/metro/inspector-proxy/proxy.js +22 -7
  48. package/build/src/start/server/metro/inspector-proxy/proxy.js.map +1 -1
  49. package/build/src/start/server/metro/runServer-fork.js +1 -1
  50. package/build/src/start/server/metro/runServer-fork.js.map +1 -1
  51. package/build/src/start/server/middleware/ClassicManifestMiddleware.js +8 -7
  52. package/build/src/start/server/middleware/ClassicManifestMiddleware.js.map +1 -1
  53. package/build/src/start/server/middleware/ContextModuleSourceMapsMiddleware.js +27 -0
  54. package/build/src/start/server/middleware/ContextModuleSourceMapsMiddleware.js.map +1 -0
  55. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +2 -2
  56. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -1
  57. package/build/src/start/server/middleware/ManifestMiddleware.js +4 -4
  58. package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
  59. package/build/src/start/server/type-generation/{index.js → startTypescriptTypeGeneration.js} +13 -12
  60. package/build/src/start/server/type-generation/startTypescriptTypeGeneration.js.map +1 -0
  61. package/build/src/start/server/webpack/WebpackBundlerDevServer.js +3 -0
  62. package/build/src/start/server/webpack/WebpackBundlerDevServer.js.map +1 -1
  63. package/build/src/utils/analytics/getDevClientProperties.js +6 -0
  64. package/build/src/utils/analytics/getDevClientProperties.js.map +1 -1
  65. package/build/src/utils/analytics/rudderstackClient.js +2 -2
  66. package/build/src/utils/ansi.js.map +1 -1
  67. package/build/src/utils/codesigning.js +4 -3
  68. package/build/src/utils/codesigning.js.map +1 -1
  69. package/build/src/utils/env.js +5 -5
  70. package/build/src/utils/env.js.map +1 -1
  71. package/build/src/utils/mergeGitIgnorePaths.js +3 -3
  72. package/build/src/utils/mergeGitIgnorePaths.js.map +1 -1
  73. package/build/src/utils/validateApplicationId.js +21 -19
  74. package/build/src/utils/validateApplicationId.js.map +1 -1
  75. package/package.json +7 -7
  76. package/build/src/start/server/type-generation/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/webpack/WebpackBundlerDevServer.ts"],"sourcesContent":["import chalk from 'chalk';\nimport type { Application } from 'express';\nimport fs from 'fs';\nimport http from 'http';\nimport * as path from 'path';\nimport resolveFrom from 'resolve-from';\nimport type webpack from 'webpack';\nimport type WebpackDevServer from 'webpack-dev-server';\n\nimport * as Log from '../../../log';\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\nimport { getIpAddress } from '../../../utils/ip';\nimport { setNodeEnv } from '../../../utils/nodeEnv';\nimport { choosePortAsync } from '../../../utils/port';\nimport { createProgressBar } from '../../../utils/progress';\nimport { ensureDotExpoProjectDirectoryInitialized } from '../../project/dotExpo';\nimport { BundlerDevServer, BundlerStartOptions, DevServerInstance } from '../BundlerDevServer';\nimport { compileAsync } from './compile';\nimport {\n importExpoWebpackConfigFromProject,\n importWebpackDevServerFromProject,\n importWebpackFromProject,\n} from './resolveFromProject';\nimport { ensureEnvironmentSupportsTLSAsync } from './tls';\n\nconst debug = require('debug')('expo:start:server:webpack:devServer') as typeof console.log;\n\nexport type WebpackConfiguration = webpack.Configuration & {\n devServer?: {\n before?: (app: Application, server: WebpackDevServer, compiler: webpack.Compiler) => void;\n };\n};\n\nfunction assertIsWebpackDevServer(value: any): asserts value is WebpackDevServer {\n if (!value?.sockWrite) {\n throw new CommandError(\n 'WEBPACK',\n value\n ? 'Expected Webpack dev server, found: ' + (value.constructor?.name ?? value)\n : 'Webpack dev server not started yet.'\n );\n }\n}\n\nexport class WebpackBundlerDevServer extends BundlerDevServer {\n get name(): string {\n return 'webpack';\n }\n\n // A custom message websocket broadcaster used to send messages to a React Native runtime.\n private customMessageSocketBroadcaster:\n | undefined\n | ((message: string, data?: Record<string, any>) => void);\n\n public broadcastMessage(\n method: string | 'reload' | 'devMenu' | 'sendDevCommand',\n params?: Record<string, any>\n ): void {\n if (!this.instance) {\n return;\n }\n\n assertIsWebpackDevServer(this.instance?.server);\n\n // Allow any message on native\n if (this.customMessageSocketBroadcaster) {\n this.customMessageSocketBroadcaster(method, params);\n return;\n }\n\n // TODO(EvanBacon): Custom Webpack overlay.\n // Default webpack-dev-server sockets use \"content-changed\" instead of \"reload\" (what we use on native).\n // For now, just manually convert the value so our CLI interface can be unified.\n const hackyConvertedMessage = method === 'reload' ? 'content-changed' : method;\n\n this.instance.server.sockWrite(this.instance.server.sockets, hackyConvertedMessage, params);\n }\n\n private async attachNativeDevServerMiddlewareToDevServer({\n server,\n middleware,\n attachToServer,\n logger,\n }: { server: http.Server } & Awaited<ReturnType<typeof this.createNativeDevServerMiddleware>>) {\n const { attachInspectorProxy, LogReporter } = await import('@expo/dev-server');\n\n // Hook up the React Native WebSockets to the Webpack dev server.\n const { messageSocket, debuggerProxy, eventsSocket } = attachToServer(server);\n\n this.customMessageSocketBroadcaster = messageSocket.broadcast;\n\n const logReporter = new LogReporter(logger);\n logReporter.reportEvent = eventsSocket.reportEvent;\n\n const { inspectorProxy } = attachInspectorProxy(this.projectRoot, {\n middleware,\n server,\n });\n\n return {\n messageSocket,\n eventsSocket,\n debuggerProxy,\n logReporter,\n inspectorProxy,\n };\n }\n\n isTargetingNative(): boolean {\n // Temporary hack while we implement multi-bundler dev server proxy.\n return ['ios', 'android'].includes(process.env.EXPO_WEBPACK_PLATFORM || '');\n }\n\n private async createNativeDevServerMiddleware({\n port,\n options,\n }: {\n port: number;\n options: BundlerStartOptions;\n }) {\n if (!this.isTargetingNative()) {\n return null;\n }\n\n const { createDevServerMiddleware } = await import('../middleware/createDevServerMiddleware');\n\n const nativeMiddleware = createDevServerMiddleware(this.projectRoot, {\n port,\n watchFolders: [this.projectRoot],\n });\n // Add manifest middleware to the other middleware.\n // TODO: Move this in to expo/dev-server.\n\n const middleware = await this.getManifestMiddlewareAsync(options);\n\n nativeMiddleware.middleware.use(middleware.getHandler());\n\n return nativeMiddleware;\n }\n\n private async getAvailablePortAsync(options: { defaultPort?: number }): Promise<number> {\n try {\n const defaultPort = options?.defaultPort ?? 19006;\n const port = await choosePortAsync(this.projectRoot, {\n defaultPort,\n host: env.WEB_HOST,\n });\n if (!port) {\n throw new CommandError('NO_PORT_FOUND', `Port ${defaultPort} not available.`);\n }\n return port;\n } catch (error: any) {\n throw new CommandError('NO_PORT_FOUND', error.message);\n }\n }\n\n async bundleAsync({ mode, clear }: { mode: 'development' | 'production'; clear: boolean }) {\n // Do this first to fail faster.\n const webpack = importWebpackFromProject(this.projectRoot);\n\n if (clear) {\n await this.clearWebProjectCacheAsync(this.projectRoot, mode);\n }\n\n const config = await this.loadConfigAsync({\n isImageEditingEnabled: true,\n mode,\n });\n\n if (!config.plugins) {\n config.plugins = [];\n }\n\n const bar = createProgressBar(chalk`{bold Web} Bundling Javascript [:bar] :percent`, {\n width: 64,\n total: 100,\n clear: true,\n complete: '=',\n incomplete: ' ',\n });\n\n // NOTE(EvanBacon): Add a progress bar to the webpack logger if defined (e.g. not in CI).\n if (bar != null) {\n config.plugins.push(\n new webpack.ProgressPlugin((percent: number) => {\n bar?.update(percent);\n if (percent === 1) {\n bar?.terminate();\n }\n })\n );\n }\n\n // Create a webpack compiler that is configured with custom messages.\n const compiler = webpack(config);\n\n try {\n await compileAsync(compiler);\n } catch (error: any) {\n Log.error(chalk.red('Failed to compile'));\n throw error;\n } finally {\n bar?.terminate();\n }\n }\n\n protected async startImplementationAsync(\n options: BundlerStartOptions\n ): Promise<DevServerInstance> {\n // Do this first to fail faster.\n const webpack = importWebpackFromProject(this.projectRoot);\n const WebpackDevServer = importWebpackDevServerFromProject(this.projectRoot);\n\n await this.stopAsync();\n\n options.port = await this.getAvailablePortAsync({\n defaultPort: options.port,\n });\n const { resetDevServer, https, port, mode } = options;\n\n this.urlCreator = this.getUrlCreator({\n port,\n location: {\n scheme: https ? 'https' : 'http',\n },\n });\n\n debug('Starting webpack on port: ' + port);\n\n if (resetDevServer) {\n await this.clearWebProjectCacheAsync(this.projectRoot, mode);\n }\n\n if (https) {\n debug('Configuring TLS to enable HTTPS support');\n await ensureEnvironmentSupportsTLSAsync(this.projectRoot).catch((error) => {\n Log.error(`Error creating TLS certificates: ${error}`);\n });\n }\n\n const config = await this.loadConfigAsync(options);\n\n Log.log(chalk`Starting Webpack on port ${port} in {underline ${mode}} mode.`);\n\n // Create a webpack compiler that is configured with custom messages.\n const compiler = webpack(config);\n\n let nativeMiddleware: Awaited<ReturnType<typeof this.createNativeDevServerMiddleware>> | null =\n null;\n if (config.devServer?.before) {\n // Create the middleware required for interacting with a native runtime (Expo Go, or a development build).\n nativeMiddleware = await this.createNativeDevServerMiddleware({\n port,\n options,\n });\n // Inject the native manifest middleware.\n const originalBefore = config.devServer.before.bind(config.devServer.before);\n config.devServer.before = (\n app: Application,\n server: WebpackDevServer,\n compiler: webpack.Compiler\n ) => {\n originalBefore(app, server, compiler);\n\n if (nativeMiddleware?.middleware) {\n app.use(nativeMiddleware.middleware);\n }\n };\n }\n const { attachNativeDevServerMiddlewareToDevServer } = this;\n\n const server = new WebpackDevServer(\n // @ts-expect-error: type mismatch -- Webpack types aren't great.\n compiler,\n config.devServer\n );\n // Launch WebpackDevServer.\n server.listen(port, env.WEB_HOST, function (this: http.Server, error) {\n if (nativeMiddleware) {\n attachNativeDevServerMiddlewareToDevServer({\n server: this,\n ...nativeMiddleware,\n });\n }\n if (error) {\n Log.error(error.message);\n }\n });\n\n // Extend the close method to ensure that we clean up the local info.\n const originalClose = server.close.bind(server);\n\n server.close = (callback?: (err?: Error) => void) => {\n return originalClose((err?: Error) => {\n this.instance = null;\n callback?.(err);\n });\n };\n\n const _host = getIpAddress();\n const protocol = https ? 'https' : 'http';\n\n return {\n // Server instance\n server,\n // URL Info\n location: {\n url: `${protocol}://${_host}:${port}`,\n port,\n protocol,\n host: _host,\n },\n middleware: nativeMiddleware?.middleware,\n // Match the native protocol.\n messageSocket: {\n broadcast: this.broadcastMessage,\n },\n };\n }\n\n /** Load the Webpack config. Exposed for testing. */\n getProjectConfigFilePath(): string | null {\n // Check if the project has a webpack.config.js in the root.\n return (\n this.getConfigModuleIds().reduce<string | null | undefined>(\n (prev, moduleId) => prev || resolveFrom.silent(this.projectRoot, moduleId),\n null\n ) ?? null\n );\n }\n\n async loadConfigAsync(\n options: Pick<BundlerStartOptions, 'mode' | 'isImageEditingEnabled' | 'https'>,\n argv?: string[]\n ): Promise<WebpackConfiguration> {\n // let bar: ProgressBar | null = null;\n\n const env = {\n projectRoot: this.projectRoot,\n pwa: !!options.isImageEditingEnabled,\n // TODO: Use a new loader in Webpack config...\n logger: {\n info() {},\n },\n mode: options.mode,\n https: options.https,\n };\n setNodeEnv(env.mode ?? 'development');\n require('@expo/env').load(env.projectRoot);\n // Check if the project has a webpack.config.js in the root.\n const projectWebpackConfig = this.getProjectConfigFilePath();\n let config: WebpackConfiguration;\n if (projectWebpackConfig) {\n const webpackConfig = require(projectWebpackConfig);\n if (typeof webpackConfig === 'function') {\n config = await webpackConfig(env, argv);\n } else {\n config = webpackConfig;\n }\n } else {\n // Fallback to the default expo webpack config.\n const loadDefaultConfigAsync = importExpoWebpackConfigFromProject(this.projectRoot);\n // @ts-expect-error: types appear to be broken\n config = await loadDefaultConfigAsync(env, argv);\n }\n return config;\n }\n\n protected getConfigModuleIds(): string[] {\n return ['./webpack.config.js'];\n }\n\n protected async clearWebProjectCacheAsync(\n projectRoot: string,\n mode: string = 'development'\n ): Promise<void> {\n Log.log(chalk.dim(`Clearing Webpack ${mode} cache directory...`));\n\n const dir = await ensureDotExpoProjectDirectoryInitialized(projectRoot);\n const cacheFolder = path.join(dir, 'web/cache', mode);\n try {\n await fs.promises.rm(cacheFolder, { recursive: true, force: true });\n } catch (error: any) {\n Log.error(`Could not clear ${mode} web cache directory: ${error.message}`);\n }\n }\n}\n\nexport function getProjectWebpackConfigFilePath(projectRoot: string) {\n return resolveFrom.silent(projectRoot, './webpack.config.js');\n}\n"],"names":["getProjectWebpackConfigFilePath","path","Log","debug","require","assertIsWebpackDevServer","value","sockWrite","CommandError","constructor","name","WebpackBundlerDevServer","BundlerDevServer","broadcastMessage","method","params","instance","server","customMessageSocketBroadcaster","hackyConvertedMessage","sockets","attachNativeDevServerMiddlewareToDevServer","middleware","attachToServer","logger","attachInspectorProxy","LogReporter","messageSocket","debuggerProxy","eventsSocket","broadcast","logReporter","reportEvent","inspectorProxy","projectRoot","isTargetingNative","includes","process","env","EXPO_WEBPACK_PLATFORM","createNativeDevServerMiddleware","port","options","createDevServerMiddleware","nativeMiddleware","watchFolders","getManifestMiddlewareAsync","use","getHandler","getAvailablePortAsync","defaultPort","choosePortAsync","host","WEB_HOST","error","message","bundleAsync","mode","clear","webpack","importWebpackFromProject","clearWebProjectCacheAsync","config","loadConfigAsync","isImageEditingEnabled","plugins","bar","createProgressBar","chalk","width","total","complete","incomplete","push","ProgressPlugin","percent","update","terminate","compiler","compileAsync","red","startImplementationAsync","WebpackDevServer","importWebpackDevServerFromProject","stopAsync","resetDevServer","https","urlCreator","getUrlCreator","location","scheme","ensureEnvironmentSupportsTLSAsync","catch","log","devServer","before","originalBefore","bind","app","listen","originalClose","close","callback","err","_host","getIpAddress","protocol","url","getProjectConfigFilePath","getConfigModuleIds","reduce","prev","moduleId","resolveFrom","silent","argv","pwa","info","setNodeEnv","load","projectWebpackConfig","webpackConfig","loadDefaultConfigAsync","importExpoWebpackConfigFromProject","dim","dir","ensureDotExpoProjectDirectoryInitialized","cacheFolder","join","fs","promises","rm","recursive","force"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/server/webpack/WebpackBundlerDevServer.ts"],"sourcesContent":["import chalk from 'chalk';\nimport type { Application } from 'express';\nimport fs from 'fs';\nimport http from 'http';\nimport * as path from 'path';\nimport resolveFrom from 'resolve-from';\nimport type webpack from 'webpack';\nimport type WebpackDevServer from 'webpack-dev-server';\n\nimport * as Log from '../../../log';\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\nimport { getIpAddress } from '../../../utils/ip';\nimport { setNodeEnv } from '../../../utils/nodeEnv';\nimport { choosePortAsync } from '../../../utils/port';\nimport { createProgressBar } from '../../../utils/progress';\nimport { ensureDotExpoProjectDirectoryInitialized } from '../../project/dotExpo';\nimport { BundlerDevServer, BundlerStartOptions, DevServerInstance } from '../BundlerDevServer';\nimport { compileAsync } from './compile';\nimport {\n importExpoWebpackConfigFromProject,\n importWebpackDevServerFromProject,\n importWebpackFromProject,\n} from './resolveFromProject';\nimport { ensureEnvironmentSupportsTLSAsync } from './tls';\n\nconst debug = require('debug')('expo:start:server:webpack:devServer') as typeof console.log;\n\nexport type WebpackConfiguration = webpack.Configuration & {\n devServer?: {\n before?: (app: Application, server: WebpackDevServer, compiler: webpack.Compiler) => void;\n };\n};\n\nfunction assertIsWebpackDevServer(value: any): asserts value is WebpackDevServer {\n if (!value?.sockWrite) {\n throw new CommandError(\n 'WEBPACK',\n value\n ? 'Expected Webpack dev server, found: ' + (value.constructor?.name ?? value)\n : 'Webpack dev server not started yet.'\n );\n }\n}\n\nexport class WebpackBundlerDevServer extends BundlerDevServer {\n get name(): string {\n return 'webpack';\n }\n\n public async startTypeScriptServices(): Promise<void> {\n // noop -- this feature is Metro-only.\n }\n\n // A custom message websocket broadcaster used to send messages to a React Native runtime.\n private customMessageSocketBroadcaster:\n | undefined\n | ((message: string, data?: Record<string, any>) => void);\n\n public broadcastMessage(\n method: string | 'reload' | 'devMenu' | 'sendDevCommand',\n params?: Record<string, any>\n ): void {\n if (!this.instance) {\n return;\n }\n\n assertIsWebpackDevServer(this.instance?.server);\n\n // Allow any message on native\n if (this.customMessageSocketBroadcaster) {\n this.customMessageSocketBroadcaster(method, params);\n return;\n }\n\n // TODO(EvanBacon): Custom Webpack overlay.\n // Default webpack-dev-server sockets use \"content-changed\" instead of \"reload\" (what we use on native).\n // For now, just manually convert the value so our CLI interface can be unified.\n const hackyConvertedMessage = method === 'reload' ? 'content-changed' : method;\n\n this.instance.server.sockWrite(this.instance.server.sockets, hackyConvertedMessage, params);\n }\n\n private async attachNativeDevServerMiddlewareToDevServer({\n server,\n middleware,\n attachToServer,\n logger,\n }: { server: http.Server } & Awaited<ReturnType<typeof this.createNativeDevServerMiddleware>>) {\n const { attachInspectorProxy, LogReporter } = await import('@expo/dev-server');\n\n // Hook up the React Native WebSockets to the Webpack dev server.\n const { messageSocket, debuggerProxy, eventsSocket } = attachToServer(server);\n\n this.customMessageSocketBroadcaster = messageSocket.broadcast;\n\n const logReporter = new LogReporter(logger);\n logReporter.reportEvent = eventsSocket.reportEvent;\n\n const { inspectorProxy } = attachInspectorProxy(this.projectRoot, {\n middleware,\n server,\n });\n\n return {\n messageSocket,\n eventsSocket,\n debuggerProxy,\n logReporter,\n inspectorProxy,\n };\n }\n\n isTargetingNative(): boolean {\n // Temporary hack while we implement multi-bundler dev server proxy.\n return ['ios', 'android'].includes(process.env.EXPO_WEBPACK_PLATFORM || '');\n }\n\n private async createNativeDevServerMiddleware({\n port,\n options,\n }: {\n port: number;\n options: BundlerStartOptions;\n }) {\n if (!this.isTargetingNative()) {\n return null;\n }\n\n const { createDevServerMiddleware } = await import('../middleware/createDevServerMiddleware');\n\n const nativeMiddleware = createDevServerMiddleware(this.projectRoot, {\n port,\n watchFolders: [this.projectRoot],\n });\n // Add manifest middleware to the other middleware.\n // TODO: Move this in to expo/dev-server.\n\n const middleware = await this.getManifestMiddlewareAsync(options);\n\n nativeMiddleware.middleware.use(middleware.getHandler());\n\n return nativeMiddleware;\n }\n\n private async getAvailablePortAsync(options: { defaultPort?: number }): Promise<number> {\n try {\n const defaultPort = options?.defaultPort ?? 19006;\n const port = await choosePortAsync(this.projectRoot, {\n defaultPort,\n host: env.WEB_HOST,\n });\n if (!port) {\n throw new CommandError('NO_PORT_FOUND', `Port ${defaultPort} not available.`);\n }\n return port;\n } catch (error: any) {\n throw new CommandError('NO_PORT_FOUND', error.message);\n }\n }\n\n async bundleAsync({ mode, clear }: { mode: 'development' | 'production'; clear: boolean }) {\n // Do this first to fail faster.\n const webpack = importWebpackFromProject(this.projectRoot);\n\n if (clear) {\n await this.clearWebProjectCacheAsync(this.projectRoot, mode);\n }\n\n const config = await this.loadConfigAsync({\n isImageEditingEnabled: true,\n mode,\n });\n\n if (!config.plugins) {\n config.plugins = [];\n }\n\n const bar = createProgressBar(chalk`{bold Web} Bundling Javascript [:bar] :percent`, {\n width: 64,\n total: 100,\n clear: true,\n complete: '=',\n incomplete: ' ',\n });\n\n // NOTE(EvanBacon): Add a progress bar to the webpack logger if defined (e.g. not in CI).\n if (bar != null) {\n config.plugins.push(\n new webpack.ProgressPlugin((percent: number) => {\n bar?.update(percent);\n if (percent === 1) {\n bar?.terminate();\n }\n })\n );\n }\n\n // Create a webpack compiler that is configured with custom messages.\n const compiler = webpack(config);\n\n try {\n await compileAsync(compiler);\n } catch (error: any) {\n Log.error(chalk.red('Failed to compile'));\n throw error;\n } finally {\n bar?.terminate();\n }\n }\n\n protected async startImplementationAsync(\n options: BundlerStartOptions\n ): Promise<DevServerInstance> {\n // Do this first to fail faster.\n const webpack = importWebpackFromProject(this.projectRoot);\n const WebpackDevServer = importWebpackDevServerFromProject(this.projectRoot);\n\n await this.stopAsync();\n\n options.port = await this.getAvailablePortAsync({\n defaultPort: options.port,\n });\n const { resetDevServer, https, port, mode } = options;\n\n this.urlCreator = this.getUrlCreator({\n port,\n location: {\n scheme: https ? 'https' : 'http',\n },\n });\n\n debug('Starting webpack on port: ' + port);\n\n if (resetDevServer) {\n await this.clearWebProjectCacheAsync(this.projectRoot, mode);\n }\n\n if (https) {\n debug('Configuring TLS to enable HTTPS support');\n await ensureEnvironmentSupportsTLSAsync(this.projectRoot).catch((error) => {\n Log.error(`Error creating TLS certificates: ${error}`);\n });\n }\n\n const config = await this.loadConfigAsync(options);\n\n Log.log(chalk`Starting Webpack on port ${port} in {underline ${mode}} mode.`);\n\n // Create a webpack compiler that is configured with custom messages.\n const compiler = webpack(config);\n\n let nativeMiddleware: Awaited<ReturnType<typeof this.createNativeDevServerMiddleware>> | null =\n null;\n if (config.devServer?.before) {\n // Create the middleware required for interacting with a native runtime (Expo Go, or a development build).\n nativeMiddleware = await this.createNativeDevServerMiddleware({\n port,\n options,\n });\n // Inject the native manifest middleware.\n const originalBefore = config.devServer.before.bind(config.devServer.before);\n config.devServer.before = (\n app: Application,\n server: WebpackDevServer,\n compiler: webpack.Compiler\n ) => {\n originalBefore(app, server, compiler);\n\n if (nativeMiddleware?.middleware) {\n app.use(nativeMiddleware.middleware);\n }\n };\n }\n const { attachNativeDevServerMiddlewareToDevServer } = this;\n\n const server = new WebpackDevServer(\n // @ts-expect-error: type mismatch -- Webpack types aren't great.\n compiler,\n config.devServer\n );\n // Launch WebpackDevServer.\n server.listen(port, env.WEB_HOST, function (this: http.Server, error) {\n if (nativeMiddleware) {\n attachNativeDevServerMiddlewareToDevServer({\n server: this,\n ...nativeMiddleware,\n });\n }\n if (error) {\n Log.error(error.message);\n }\n });\n\n // Extend the close method to ensure that we clean up the local info.\n const originalClose = server.close.bind(server);\n\n server.close = (callback?: (err?: Error) => void) => {\n return originalClose((err?: Error) => {\n this.instance = null;\n callback?.(err);\n });\n };\n\n const _host = getIpAddress();\n const protocol = https ? 'https' : 'http';\n\n return {\n // Server instance\n server,\n // URL Info\n location: {\n url: `${protocol}://${_host}:${port}`,\n port,\n protocol,\n host: _host,\n },\n middleware: nativeMiddleware?.middleware,\n // Match the native protocol.\n messageSocket: {\n broadcast: this.broadcastMessage,\n },\n };\n }\n\n /** Load the Webpack config. Exposed for testing. */\n getProjectConfigFilePath(): string | null {\n // Check if the project has a webpack.config.js in the root.\n return (\n this.getConfigModuleIds().reduce<string | null | undefined>(\n (prev, moduleId) => prev || resolveFrom.silent(this.projectRoot, moduleId),\n null\n ) ?? null\n );\n }\n\n async loadConfigAsync(\n options: Pick<BundlerStartOptions, 'mode' | 'isImageEditingEnabled' | 'https'>,\n argv?: string[]\n ): Promise<WebpackConfiguration> {\n // let bar: ProgressBar | null = null;\n\n const env = {\n projectRoot: this.projectRoot,\n pwa: !!options.isImageEditingEnabled,\n // TODO: Use a new loader in Webpack config...\n logger: {\n info() {},\n },\n mode: options.mode,\n https: options.https,\n };\n setNodeEnv(env.mode ?? 'development');\n require('@expo/env').load(env.projectRoot);\n // Check if the project has a webpack.config.js in the root.\n const projectWebpackConfig = this.getProjectConfigFilePath();\n let config: WebpackConfiguration;\n if (projectWebpackConfig) {\n const webpackConfig = require(projectWebpackConfig);\n if (typeof webpackConfig === 'function') {\n config = await webpackConfig(env, argv);\n } else {\n config = webpackConfig;\n }\n } else {\n // Fallback to the default expo webpack config.\n const loadDefaultConfigAsync = importExpoWebpackConfigFromProject(this.projectRoot);\n // @ts-expect-error: types appear to be broken\n config = await loadDefaultConfigAsync(env, argv);\n }\n return config;\n }\n\n protected getConfigModuleIds(): string[] {\n return ['./webpack.config.js'];\n }\n\n protected async clearWebProjectCacheAsync(\n projectRoot: string,\n mode: string = 'development'\n ): Promise<void> {\n Log.log(chalk.dim(`Clearing Webpack ${mode} cache directory...`));\n\n const dir = await ensureDotExpoProjectDirectoryInitialized(projectRoot);\n const cacheFolder = path.join(dir, 'web/cache', mode);\n try {\n await fs.promises.rm(cacheFolder, { recursive: true, force: true });\n } catch (error: any) {\n Log.error(`Could not clear ${mode} web cache directory: ${error.message}`);\n }\n }\n}\n\nexport function getProjectWebpackConfigFilePath(projectRoot: string) {\n return resolveFrom.silent(projectRoot, './webpack.config.js');\n}\n"],"names":["getProjectWebpackConfigFilePath","path","Log","debug","require","assertIsWebpackDevServer","value","sockWrite","CommandError","constructor","name","WebpackBundlerDevServer","BundlerDevServer","startTypeScriptServices","broadcastMessage","method","params","instance","server","customMessageSocketBroadcaster","hackyConvertedMessage","sockets","attachNativeDevServerMiddlewareToDevServer","middleware","attachToServer","logger","attachInspectorProxy","LogReporter","messageSocket","debuggerProxy","eventsSocket","broadcast","logReporter","reportEvent","inspectorProxy","projectRoot","isTargetingNative","includes","process","env","EXPO_WEBPACK_PLATFORM","createNativeDevServerMiddleware","port","options","createDevServerMiddleware","nativeMiddleware","watchFolders","getManifestMiddlewareAsync","use","getHandler","getAvailablePortAsync","defaultPort","choosePortAsync","host","WEB_HOST","error","message","bundleAsync","mode","clear","webpack","importWebpackFromProject","clearWebProjectCacheAsync","config","loadConfigAsync","isImageEditingEnabled","plugins","bar","createProgressBar","chalk","width","total","complete","incomplete","push","ProgressPlugin","percent","update","terminate","compiler","compileAsync","red","startImplementationAsync","WebpackDevServer","importWebpackDevServerFromProject","stopAsync","resetDevServer","https","urlCreator","getUrlCreator","location","scheme","ensureEnvironmentSupportsTLSAsync","catch","log","devServer","before","originalBefore","bind","app","listen","originalClose","close","callback","err","_host","getIpAddress","protocol","url","getProjectConfigFilePath","getConfigModuleIds","reduce","prev","moduleId","resolveFrom","silent","argv","pwa","info","setNodeEnv","load","projectWebpackConfig","webpackConfig","loadDefaultConfigAsync","importExpoWebpackConfigFromProject","dim","dir","ensureDotExpoProjectDirectoryInitialized","cacheFolder","join","fs","promises","rm","recursive","force"],"mappings":"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"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
5
  exports.default = getDevClientProperties;
6
+ exports.hasDirectDevClientDependency = hasDirectDevClientDependency;
6
7
  var _config = require("@expo/config");
7
8
  var _jsonFile = _interopRequireDefault(require("@expo/json-file"));
8
9
  var _resolveFrom = _interopRequireDefault(require("resolve-from"));
@@ -25,6 +26,11 @@ function _interopRequireDefault(obj) {
25
26
  const getAccountName = (0, _fn).memoize((exp)=>{
26
27
  return (0, _config).getAccountUsername(exp);
27
28
  });
29
+ function hasDirectDevClientDependency(projectRoot) {
30
+ var ref, ref1;
31
+ const pkg = (0, _config).getPackageJson(projectRoot);
32
+ return !!((ref = pkg.dependencies) == null ? void 0 : ref["expo-dev-client"]) || !!((ref1 = pkg.devDependencies) == null ? void 0 : ref1["expo-dev-client"]);
33
+ }
28
34
  const getDevClientVersion = (0, _fn).memoize((projectRoot)=>{
29
35
  try {
30
36
  const devClientPackage = _resolveFrom.default.silent(projectRoot, "expo-dev-client/package.json");
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/utils/analytics/getDevClientProperties.ts"],"sourcesContent":["import { ExpoConfig, getAccountUsername, getDefaultTarget } from '@expo/config';\nimport JsonFile, { JSONValue } from '@expo/json-file';\nimport resolveFrom from 'resolve-from';\n\nimport { memoize } from '../fn';\n\nconst getAccountName = memoize((exp: Pick<ExpoConfig, 'owner'>) => {\n return getAccountUsername(exp);\n});\n\nconst getDevClientVersion = memoize((projectRoot: string): JSONValue | undefined => {\n try {\n const devClientPackage = resolveFrom.silent(projectRoot, 'expo-dev-client/package.json');\n if (devClientPackage) {\n return JsonFile.read(devClientPackage).version;\n }\n } catch {}\n return undefined;\n});\n\nconst getProjectType = memoize((projectRoot: string): 'managed' | 'generic' => {\n return getDefaultTarget(projectRoot) === 'managed' ? 'managed' : 'generic';\n});\n\nexport default function getDevClientProperties(projectRoot: string, exp: ExpoConfig) {\n return {\n account_name: getAccountName({ owner: exp.owner }),\n dev_client_version: getDevClientVersion(projectRoot),\n project_type: getProjectType(projectRoot),\n uptime_ms: process.uptime() * 1000,\n };\n}\n"],"names":["getDevClientProperties","projectRoot","exp","account_name","getAccountName","owner","dev_client_version","getDevClientVersion","project_type","getProjectType","uptime_ms","process","uptime","memoize","getAccountUsername","devClientPackage","resolveFrom","silent","JsonFile","read","version","undefined","getDefaultTarget"],"mappings":"AAAA;;;;kBAwBwBA,sBAAsB;AAxBmB,IAAA,OAAc,WAAd,cAAc,CAAA;AAC3C,IAAA,SAAiB,kCAAjB,iBAAiB,EAAA;AAC7B,IAAA,YAAc,kCAAd,cAAc,EAAA;AAEd,IAAA,GAAO,WAAP,OAAO,CAAA;AAoBhB,SAASA,sBAAsB,CAACC,WAAmB,EAAEC,GAAe,EAAE;IACnF,OAAO;QACLC,YAAY,EAAEC,cAAc,CAAC;YAAEC,KAAK,EAAEH,GAAG,CAACG,KAAK;SAAE,CAAC;QAClDC,kBAAkB,EAAEC,mBAAmB,CAACN,WAAW,CAAC;QACpDO,YAAY,EAAEC,cAAc,CAACR,WAAW,CAAC;QACzCS,SAAS,EAAEC,OAAO,CAACC,MAAM,EAAE,GAAG,IAAI;KACnC,CAAC;CACH;;;;;;AAzBD,MAAMR,cAAc,GAAGS,CAAAA,GAAAA,GAAO,AAE5B,CAAA,QAF4B,CAAC,CAACX,GAA8B,GAAK;IACjE,OAAOY,CAAAA,GAAAA,OAAkB,AAAK,CAAA,mBAAL,CAACZ,GAAG,CAAC,CAAC;CAChC,CAAC,AAAC;AAEH,MAAMK,mBAAmB,GAAGM,CAAAA,GAAAA,GAAO,AAQjC,CAAA,QARiC,CAAC,CAACZ,WAAmB,GAA4B;IAClF,IAAI;QACF,MAAMc,gBAAgB,GAAGC,YAAW,QAAA,CAACC,MAAM,CAAChB,WAAW,EAAE,8BAA8B,CAAC,AAAC;QACzF,IAAIc,gBAAgB,EAAE;YACpB,OAAOG,SAAQ,QAAA,CAACC,IAAI,CAACJ,gBAAgB,CAAC,CAACK,OAAO,CAAC;SAChD;KACF,CAAC,OAAM,EAAE;IACV,OAAOC,SAAS,CAAC;CAClB,CAAC,AAAC;AAEH,MAAMZ,cAAc,GAAGI,CAAAA,GAAAA,GAAO,AAE5B,CAAA,QAF4B,CAAC,CAACZ,WAAmB,GAA4B;IAC7E,OAAOqB,CAAAA,GAAAA,OAAgB,AAAa,CAAA,iBAAb,CAACrB,WAAW,CAAC,KAAK,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;CAC5E,CAAC,AAAC"}
1
+ {"version":3,"sources":["../../../../src/utils/analytics/getDevClientProperties.ts"],"sourcesContent":["import { ExpoConfig, getAccountUsername, getDefaultTarget, getPackageJson } from '@expo/config';\nimport JsonFile, { JSONValue } from '@expo/json-file';\nimport resolveFrom from 'resolve-from';\n\nimport { memoize } from '../fn';\n\nconst getAccountName = memoize((exp: Pick<ExpoConfig, 'owner'>) => {\n return getAccountUsername(exp);\n});\n\n/** @returns true if the expo-dev-client package is found in the project `package.json` file. */\nexport function hasDirectDevClientDependency(projectRoot: string): boolean {\n const pkg = getPackageJson(projectRoot);\n return !!pkg.dependencies?.['expo-dev-client'] || !!pkg.devDependencies?.['expo-dev-client'];\n}\n\nconst getDevClientVersion = memoize((projectRoot: string): JSONValue | undefined => {\n try {\n const devClientPackage = resolveFrom.silent(projectRoot, 'expo-dev-client/package.json');\n if (devClientPackage) {\n return JsonFile.read(devClientPackage).version;\n }\n } catch {}\n return undefined;\n});\n\nconst getProjectType = memoize((projectRoot: string): 'managed' | 'generic' => {\n return getDefaultTarget(projectRoot) === 'managed' ? 'managed' : 'generic';\n});\n\nexport default function getDevClientProperties(projectRoot: string, exp: ExpoConfig) {\n return {\n account_name: getAccountName({ owner: exp.owner }),\n dev_client_version: getDevClientVersion(projectRoot),\n project_type: getProjectType(projectRoot),\n uptime_ms: process.uptime() * 1000,\n };\n}\n"],"names":["getDevClientProperties","hasDirectDevClientDependency","projectRoot","exp","account_name","getAccountName","owner","dev_client_version","getDevClientVersion","project_type","getProjectType","uptime_ms","process","uptime","memoize","getAccountUsername","pkg","getPackageJson","dependencies","devDependencies","devClientPackage","resolveFrom","silent","JsonFile","read","version","undefined","getDefaultTarget"],"mappings":"AAAA;;;;kBA8BwBA,sBAAsB;QAnB9BC,4BAA4B,GAA5BA,4BAA4B;AAXqC,IAAA,OAAc,WAAd,cAAc,CAAA;AAC3D,IAAA,SAAiB,kCAAjB,iBAAiB,EAAA;AAC7B,IAAA,YAAc,kCAAd,cAAc,EAAA;AAEd,IAAA,GAAO,WAAP,OAAO,CAAA;AA0BhB,SAASD,sBAAsB,CAACE,WAAmB,EAAEC,GAAe,EAAE;IACnF,OAAO;QACLC,YAAY,EAAEC,cAAc,CAAC;YAAEC,KAAK,EAAEH,GAAG,CAACG,KAAK;SAAE,CAAC;QAClDC,kBAAkB,EAAEC,mBAAmB,CAACN,WAAW,CAAC;QACpDO,YAAY,EAAEC,cAAc,CAACR,WAAW,CAAC;QACzCS,SAAS,EAAEC,OAAO,CAACC,MAAM,EAAE,GAAG,IAAI;KACnC,CAAC;CACH;;;;;;AA/BD,MAAMR,cAAc,GAAGS,CAAAA,GAAAA,GAAO,AAE5B,CAAA,QAF4B,CAAC,CAACX,GAA8B,GAAK;IACjE,OAAOY,CAAAA,GAAAA,OAAkB,AAAK,CAAA,mBAAL,CAACZ,GAAG,CAAC,CAAC;CAChC,CAAC,AAAC;AAGI,SAASF,4BAA4B,CAACC,WAAmB,EAAW;QAEhEc,GAAgB,EAA2BA,IAAmB;IADvE,MAAMA,GAAG,GAAGC,CAAAA,GAAAA,OAAc,AAAa,CAAA,eAAb,CAACf,WAAW,CAAC,AAAC;IACxC,OAAO,CAAC,CAACc,CAAAA,CAAAA,GAAgB,GAAhBA,GAAG,CAACE,YAAY,SAAqB,GAArCF,KAAAA,CAAqC,GAArCA,GAAgB,AAAE,CAAC,iBAAiB,CAAC,CAAA,IAAI,CAAC,CAACA,CAAAA,CAAAA,IAAmB,GAAnBA,GAAG,CAACG,eAAe,SAAqB,GAAxCH,KAAAA,CAAwC,GAAxCA,IAAmB,AAAE,CAAC,iBAAiB,CAAC,CAAA,CAAC;CAC9F;AAED,MAAMR,mBAAmB,GAAGM,CAAAA,GAAAA,GAAO,AAQjC,CAAA,QARiC,CAAC,CAACZ,WAAmB,GAA4B;IAClF,IAAI;QACF,MAAMkB,gBAAgB,GAAGC,YAAW,QAAA,CAACC,MAAM,CAACpB,WAAW,EAAE,8BAA8B,CAAC,AAAC;QACzF,IAAIkB,gBAAgB,EAAE;YACpB,OAAOG,SAAQ,QAAA,CAACC,IAAI,CAACJ,gBAAgB,CAAC,CAACK,OAAO,CAAC;SAChD;KACF,CAAC,OAAM,EAAE;IACV,OAAOC,SAAS,CAAC;CAClB,CAAC,AAAC;AAEH,MAAMhB,cAAc,GAAGI,CAAAA,GAAAA,GAAO,AAE5B,CAAA,QAF4B,CAAC,CAACZ,WAAmB,GAA4B;IAC7E,OAAOyB,CAAAA,GAAAA,OAAgB,AAAa,CAAA,iBAAb,CAACzB,WAAW,CAAC,KAAK,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;CAC5E,CAAC,AAAC"}
@@ -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.9.0",
97
+ source_version: "0.10.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.9.0"
138
+ version: "0.10.0"
139
139
  },
140
140
  ci: ciInfo.isCI ? {
141
141
  name: ciInfo.name,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/ansi.ts"],"sourcesContent":["/** Remove ansi characters from a string and return the sanitized results. */\nexport function stripAnsi(str?: string) {\n if (!str) {\n return str;\n }\n const pattern = [\n '[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)',\n '(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~]))',\n ].join('|');\n\n return str.replace(new RegExp(pattern, 'g'), '');\n}\n"],"names":["stripAnsi","str","pattern","join","replace","RegExp"],"mappings":"AACA;;;;QAAgBA,SAAS,GAATA,SAAS;AAAlB,SAASA,SAAS,CAACC,GAAY,EAAE;IACtC,IAAI,CAACA,GAAG,EAAE;QACR,OAAOA,GAAG,CAAC;KACZ;IACD,MAAMC,OAAO,GAAG;QACd,8HAA8H;QAC9H,0DAA0D;KAC3D,CAACC,IAAI,CAAC,GAAG,CAAC,AAAC;IAEZ,OAAOF,GAAG,CAACG,OAAO,CAAC,IAAIC,MAAM,CAACH,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;CAClD"}
1
+ {"version":3,"sources":["../../../src/utils/ansi.ts"],"sourcesContent":["/** Remove ansi characters from a string and return the sanitized results. */\nexport function stripAnsi(str?: string | null) {\n if (!str) {\n return str;\n }\n const pattern = [\n '[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)',\n '(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~]))',\n ].join('|');\n\n return str.replace(new RegExp(pattern, 'g'), '');\n}\n"],"names":["stripAnsi","str","pattern","join","replace","RegExp"],"mappings":"AACA;;;;QAAgBA,SAAS,GAATA,SAAS;AAAlB,SAASA,SAAS,CAACC,GAAmB,EAAE;IAC7C,IAAI,CAACA,GAAG,EAAE;QACR,OAAOA,GAAG,CAAC;KACZ;IACD,MAAMC,OAAO,GAAG;QACd,8HAA8H;QAC9H,0DAA0D;KAC3D,CAACC,IAAI,CAAC,GAAG,CAAC,AAAC;IAEZ,OAAOF,GAAG,CAACG,OAAO,CAAC,IAAIC,MAAM,CAACH,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;CAClD"}
@@ -15,11 +15,11 @@ var _structuredHeaders = require("structured-headers");
15
15
  var _getExpoGoIntermediateCertificate = require("../api/getExpoGoIntermediateCertificate");
16
16
  var _getProjectDevelopmentCertificate = require("../api/getProjectDevelopmentCertificate");
17
17
  var _appQuery = require("../api/graphql/queries/AppQuery");
18
- var _settings = require("../api/settings");
19
18
  var _actions = require("../api/user/actions");
20
19
  var _generated = require("../graphql/generated");
21
20
  var Log = _interopRequireWildcard(require("../log"));
22
21
  var _link = require("../utils/link");
22
+ var _env = require("./env");
23
23
  var _errors = require("./errors");
24
24
  function _interopRequireDefault(obj) {
25
25
  return obj && obj.__esModule ? obj : {
@@ -47,6 +47,7 @@ function _interopRequireWildcard(obj) {
47
47
  return newObj;
48
48
  }
49
49
  }
50
+ const debug = require("debug")("expo:codesigning");
50
51
  const DEVELOPMENT_CODE_SIGNING_SETTINGS_FILE_NAME = "development-code-signing-settings-2.json";
51
52
  function getDevelopmentCodeSigningDirectory() {
52
53
  return _path.default.join((0, _getUserState).getExpoHomeDirectory(), "codesigning");
@@ -142,14 +143,14 @@ async function getCodeSigningInfoAsync(exp, expectSignatureHeader, privateKeyPat
142
143
  // can't check for scope key validity since scope key is derived on the server from projectId and we may be offline.
143
144
  // we rely upon the client certificate check to validate the scope key
144
145
  if (!easProjectId) {
145
- Log.warn(`Expo Application Services (EAS) is not configured for your project. Configuring EAS enables a more secure development experience amongst many other benefits. ${(0, _link).learnMore("https://docs.expo.dev/eas/")}`);
146
+ debug(`WARN: Expo Application Services (EAS) is not configured for your project. Configuring EAS enables a more secure development experience amongst many other benefits. ${(0, _link).learnMore("https://docs.expo.dev/eas/")}`);
146
147
  return null;
147
148
  }
148
149
  const developmentCodeSigningInfoFromFile = await DevelopmentCodeSigningInfoFile.readAsync(easProjectId);
149
150
  const validatedCodeSigningInfo = validateStoredDevelopmentExpoRootCertificateCodeSigningInfo(developmentCodeSigningInfoFromFile, easProjectId);
150
151
  // 1. If online, ensure logged in, generate key pair and CSR, fetch and cache certificate chain for projectId
151
152
  // (overwriting existing dev cert in case projectId changed or it has expired)
152
- if (!_settings.APISettings.isOffline) {
153
+ if (!_env.env.EXPO_OFFLINE) {
153
154
  try {
154
155
  return await fetchAndCacheNewDevelopmentCodeSigningInfoAsync(easProjectId);
155
156
  } catch (e) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/codesigning.ts"],"sourcesContent":["import {\n convertCertificatePEMToCertificate,\n convertKeyPairToPEM,\n convertCSRToCSRPEM,\n generateKeyPair,\n generateCSR,\n convertPrivateKeyPEMToPrivateKey,\n validateSelfSignedCertificate,\n signBufferRSASHA256AndVerify,\n} from '@expo/code-signing-certificates';\nimport { ExpoConfig } from '@expo/config';\nimport { getExpoHomeDirectory } from '@expo/config/build/getUserState';\nimport JsonFile, { JSONObject } from '@expo/json-file';\nimport { promises as fs } from 'fs';\nimport { pki as PKI } from 'node-forge';\nimport path from 'path';\nimport { Dictionary, parseDictionary } from 'structured-headers';\n\nimport { getExpoGoIntermediateCertificateAsync } from '../api/getExpoGoIntermediateCertificate';\nimport { getProjectDevelopmentCertificateAsync } from '../api/getProjectDevelopmentCertificate';\nimport { AppQuery } from '../api/graphql/queries/AppQuery';\nimport { APISettings } from '../api/settings';\nimport { ensureLoggedInAsync } from '../api/user/actions';\nimport { Actor } from '../api/user/user';\nimport { AppByIdQuery, Permission } from '../graphql/generated';\nimport * as Log from '../log';\nimport { learnMore } from '../utils/link';\nimport { CommandError } from './errors';\n\nexport type CodeSigningInfo = {\n keyId: string;\n privateKey: string;\n certificateForPrivateKey: string;\n /**\n * Chain of certificates to serve in the manifest multipart body \"certificate_chain\" part.\n * The leaf certificate must be the 0th element of the array, followed by any intermediate certificates\n * necessary to evaluate the chain of trust ending in the implicitly trusted root certificate embedded in\n * the client.\n *\n * An empty array indicates that there is no need to serve the certificate chain in the multipart response.\n */\n certificateChainForResponse: string[];\n /**\n * Scope key cached for the project when certificate is development Expo Go code signing.\n * For project-specific code signing (keyId == the project's generated keyId) this is undefined.\n */\n scopeKey: string | null;\n};\n\ntype StoredDevelopmentExpoRootCodeSigningInfo = {\n easProjectId: string | null;\n scopeKey: string | null;\n privateKey: string | null;\n certificateChain: string[] | null;\n};\nconst DEVELOPMENT_CODE_SIGNING_SETTINGS_FILE_NAME = 'development-code-signing-settings-2.json';\n\nexport function getDevelopmentCodeSigningDirectory(): string {\n return path.join(getExpoHomeDirectory(), 'codesigning');\n}\n\nfunction getProjectDevelopmentCodeSigningInfoFile<T extends JSONObject>(defaults: T) {\n function getFile(easProjectId: string): JsonFile<T> {\n const filePath = path.join(\n getDevelopmentCodeSigningDirectory(),\n easProjectId,\n DEVELOPMENT_CODE_SIGNING_SETTINGS_FILE_NAME\n );\n return new JsonFile<T>(filePath);\n }\n\n async function readAsync(easProjectId: string): Promise<T> {\n let projectSettings;\n try {\n projectSettings = await getFile(easProjectId).readAsync();\n } catch {\n projectSettings = await getFile(easProjectId).writeAsync(defaults, { ensureDir: true });\n }\n // Set defaults for any missing fields\n return { ...defaults, ...projectSettings };\n }\n\n async function setAsync(easProjectId: string, json: Partial<T>): Promise<T> {\n try {\n return await getFile(easProjectId).mergeAsync(json, {\n cantReadFileDefault: defaults,\n });\n } catch {\n return await getFile(easProjectId).writeAsync(\n {\n ...defaults,\n ...json,\n },\n { ensureDir: true }\n );\n }\n }\n\n return {\n getFile,\n readAsync,\n setAsync,\n };\n}\n\nexport const DevelopmentCodeSigningInfoFile =\n getProjectDevelopmentCodeSigningInfoFile<StoredDevelopmentExpoRootCodeSigningInfo>({\n easProjectId: null,\n scopeKey: null,\n privateKey: null,\n certificateChain: null,\n });\n\n/**\n * Get info necessary to generate a response `expo-signature` header given a project and incoming request `expo-expect-signature` header.\n * This only knows how to serve two code signing keyids:\n * - `expo-root` indicates that it should use a development certificate in the `expo-root` chain. See {@link getExpoRootDevelopmentCodeSigningInfoAsync}\n * - <developer's expo-updates keyid> indicates that it should sign with the configured certificate. See {@link getProjectCodeSigningCertificateAsync}\n */\nexport async function getCodeSigningInfoAsync(\n exp: ExpoConfig,\n expectSignatureHeader: string | null,\n privateKeyPath: string | undefined\n): Promise<CodeSigningInfo | null> {\n if (!expectSignatureHeader) {\n return null;\n }\n\n let parsedExpectSignature: Dictionary;\n try {\n parsedExpectSignature = parseDictionary(expectSignatureHeader);\n } catch {\n throw new CommandError('Invalid value for expo-expect-signature header');\n }\n\n const expectedKeyIdOuter = parsedExpectSignature.get('keyid');\n if (!expectedKeyIdOuter) {\n throw new CommandError('keyid not present in expo-expect-signature header');\n }\n\n const expectedKeyId = expectedKeyIdOuter[0];\n if (typeof expectedKeyId !== 'string') {\n throw new CommandError(\n `Invalid value for keyid in expo-expect-signature header: ${expectedKeyId}`\n );\n }\n\n let expectedAlg: string | null = null;\n const expectedAlgOuter = parsedExpectSignature.get('alg');\n if (expectedAlgOuter) {\n const expectedAlgTemp = expectedAlgOuter[0];\n if (typeof expectedAlgTemp !== 'string') {\n throw new CommandError('Invalid value for alg in expo-expect-signature header');\n }\n expectedAlg = expectedAlgTemp;\n }\n\n if (expectedKeyId === 'expo-root') {\n return await getExpoRootDevelopmentCodeSigningInfoAsync(exp);\n } else if (expectedKeyId === 'expo-go') {\n throw new CommandError(\n 'Invalid certificate requested: cannot sign with embedded keyid=expo-go key'\n );\n } else {\n return await getProjectCodeSigningCertificateAsync(\n exp,\n privateKeyPath,\n expectedKeyId,\n expectedAlg\n );\n }\n}\n\n/**\n * Get a development code signing certificate for the expo-root -> expo-go -> (development certificate) certificate chain.\n * This requires the user be logged in and online, otherwise try to use the cached development certificate.\n */\nasync function getExpoRootDevelopmentCodeSigningInfoAsync(\n exp: ExpoConfig\n): Promise<CodeSigningInfo | null> {\n const easProjectId = exp.extra?.eas?.projectId;\n // can't check for scope key validity since scope key is derived on the server from projectId and we may be offline.\n // we rely upon the client certificate check to validate the scope key\n if (!easProjectId) {\n Log.warn(\n `Expo Application Services (EAS) is not configured for your project. Configuring EAS enables a more secure development experience amongst many other benefits. ${learnMore(\n 'https://docs.expo.dev/eas/'\n )}`\n );\n return null;\n }\n\n const developmentCodeSigningInfoFromFile = await DevelopmentCodeSigningInfoFile.readAsync(\n easProjectId\n );\n const validatedCodeSigningInfo = validateStoredDevelopmentExpoRootCertificateCodeSigningInfo(\n developmentCodeSigningInfoFromFile,\n easProjectId\n );\n\n // 1. If online, ensure logged in, generate key pair and CSR, fetch and cache certificate chain for projectId\n // (overwriting existing dev cert in case projectId changed or it has expired)\n if (!APISettings.isOffline) {\n try {\n return await fetchAndCacheNewDevelopmentCodeSigningInfoAsync(easProjectId);\n } catch (e) {\n if (validatedCodeSigningInfo) {\n Log.warn(\n 'There was an error fetching the Expo development certificate, falling back to cached certificate'\n );\n return validatedCodeSigningInfo;\n } else {\n // need to return null here and say a message\n throw e;\n }\n }\n }\n\n // 2. check for cached cert/private key matching projectId and scopeKey of project, if found and valid return private key and cert chain including expo-go cert\n if (validatedCodeSigningInfo) {\n return validatedCodeSigningInfo;\n }\n\n // 3. if offline, return null\n Log.warn('Offline and no cached development certificate found, unable to sign manifest');\n return null;\n}\n\n/**\n * Get the certificate configured for expo-updates for this project.\n */\nasync function getProjectCodeSigningCertificateAsync(\n exp: ExpoConfig,\n privateKeyPath: string | undefined,\n expectedKeyId: string,\n expectedAlg: string | null\n): Promise<CodeSigningInfo | null> {\n const codeSigningCertificatePath = exp.updates?.codeSigningCertificate;\n if (!codeSigningCertificatePath) {\n return null;\n }\n\n if (!privateKeyPath) {\n throw new CommandError(\n 'Must specify --private-key-path argument to sign development manifest for requested code signing key'\n );\n }\n\n const codeSigningMetadata = exp.updates?.codeSigningMetadata;\n if (!codeSigningMetadata) {\n throw new CommandError(\n 'Must specify \"codeSigningMetadata\" under the \"updates\" field of your app config file to use EAS code signing'\n );\n }\n\n const { alg, keyid } = codeSigningMetadata;\n if (!alg || !keyid) {\n throw new CommandError(\n 'Must specify \"keyid\" and \"alg\" in the \"codeSigningMetadata\" field under the \"updates\" field of your app config file to use EAS code signing'\n );\n }\n\n if (expectedKeyId !== keyid) {\n throw new CommandError(`keyid mismatch: client=${expectedKeyId}, project=${keyid}`);\n }\n\n if (expectedAlg && expectedAlg !== alg) {\n throw new CommandError(`\"alg\" field mismatch (client=${expectedAlg}, project=${alg})`);\n }\n\n const { privateKeyPEM, certificatePEM } =\n await getProjectPrivateKeyAndCertificateFromFilePathsAsync({\n codeSigningCertificatePath,\n privateKeyPath,\n });\n\n return {\n keyId: keyid,\n privateKey: privateKeyPEM,\n certificateForPrivateKey: certificatePEM,\n certificateChainForResponse: [],\n scopeKey: null,\n };\n}\n\nasync function readFileWithErrorAsync(path: string, errorMessage: string): Promise<string> {\n try {\n return await fs.readFile(path, 'utf8');\n } catch {\n throw new CommandError(errorMessage);\n }\n}\n\nasync function getProjectPrivateKeyAndCertificateFromFilePathsAsync({\n codeSigningCertificatePath,\n privateKeyPath,\n}: {\n codeSigningCertificatePath: string;\n privateKeyPath: string;\n}): Promise<{ privateKeyPEM: string; certificatePEM: string }> {\n const [codeSigningCertificatePEM, privateKeyPEM] = await Promise.all([\n readFileWithErrorAsync(\n codeSigningCertificatePath,\n `Code signing certificate cannot be read from path: ${codeSigningCertificatePath}`\n ),\n readFileWithErrorAsync(\n privateKeyPath,\n `Code signing private key cannot be read from path: ${privateKeyPath}`\n ),\n ]);\n\n const privateKey = convertPrivateKeyPEMToPrivateKey(privateKeyPEM);\n const certificate = convertCertificatePEMToCertificate(codeSigningCertificatePEM);\n validateSelfSignedCertificate(certificate, {\n publicKey: certificate.publicKey as PKI.rsa.PublicKey,\n privateKey,\n });\n\n return { privateKeyPEM, certificatePEM: codeSigningCertificatePEM };\n}\n\n/**\n * Validate that the cached code signing info is still valid for the current project and\n * that it hasn't expired. If invalid, return null.\n */\nfunction validateStoredDevelopmentExpoRootCertificateCodeSigningInfo(\n codeSigningInfo: StoredDevelopmentExpoRootCodeSigningInfo,\n easProjectId: string\n): CodeSigningInfo | null {\n if (codeSigningInfo.easProjectId !== easProjectId) {\n return null;\n }\n\n const {\n privateKey: privateKeyPEM,\n certificateChain: certificatePEMs,\n scopeKey,\n } = codeSigningInfo;\n if (!privateKeyPEM || !certificatePEMs) {\n return null;\n }\n\n const certificateChain = certificatePEMs.map((certificatePEM) =>\n convertCertificatePEMToCertificate(certificatePEM)\n );\n\n // TODO(wschurman): maybe move to @expo/code-signing-certificates\n const leafCertificate = certificateChain[0];\n const now = new Date();\n if (leafCertificate.validity.notBefore > now || leafCertificate.validity.notAfter < now) {\n return null;\n }\n\n // TODO(wschurman): maybe do more validation, like validation of projectID and scopeKey within eas certificate extension\n\n return {\n keyId: 'expo-go',\n certificateChainForResponse: certificatePEMs,\n certificateForPrivateKey: certificatePEMs[0],\n privateKey: privateKeyPEM,\n scopeKey,\n };\n}\n\nfunction actorCanGetProjectDevelopmentCertificate(actor: Actor, app: AppByIdQuery['app']['byId']) {\n const owningAccountId = app.ownerAccount.id;\n\n const owningAccountIsActorPrimaryAccount =\n actor.__typename === 'User' || actor.__typename === 'SSOUser'\n ? actor.primaryAccount.id === owningAccountId\n : false;\n const userHasPublishPermissionForOwningAccount = !!actor.accounts\n .find((account) => account.id === owningAccountId)\n ?.users?.find((userPermission) => userPermission.actor.id === actor.id)\n ?.permissions?.includes(Permission.Publish);\n return owningAccountIsActorPrimaryAccount || userHasPublishPermissionForOwningAccount;\n}\n\nasync function fetchAndCacheNewDevelopmentCodeSigningInfoAsync(\n easProjectId: string\n): Promise<CodeSigningInfo | null> {\n const actor = await ensureLoggedInAsync();\n const app = await AppQuery.byIdAsync(easProjectId);\n if (!actorCanGetProjectDevelopmentCertificate(actor, app)) {\n return null;\n }\n\n const keyPair = generateKeyPair();\n const keyPairPEM = convertKeyPairToPEM(keyPair);\n const csr = generateCSR(keyPair, `Development Certificate for ${easProjectId}`);\n const csrPEM = convertCSRToCSRPEM(csr);\n const [developmentSigningCertificate, expoGoIntermediateCertificate] = await Promise.all([\n getProjectDevelopmentCertificateAsync(easProjectId, csrPEM),\n getExpoGoIntermediateCertificateAsync(easProjectId),\n ]);\n\n await DevelopmentCodeSigningInfoFile.setAsync(easProjectId, {\n easProjectId,\n scopeKey: app.scopeKey,\n privateKey: keyPairPEM.privateKeyPEM,\n certificateChain: [developmentSigningCertificate, expoGoIntermediateCertificate],\n });\n\n return {\n keyId: 'expo-go',\n certificateChainForResponse: [developmentSigningCertificate, expoGoIntermediateCertificate],\n certificateForPrivateKey: developmentSigningCertificate,\n privateKey: keyPairPEM.privateKeyPEM,\n scopeKey: app.scopeKey,\n };\n}\n/**\n * Generate the `expo-signature` header for a manifest and code signing info.\n */\nexport function signManifestString(\n stringifiedManifest: string,\n codeSigningInfo: CodeSigningInfo\n): string {\n const privateKey = convertPrivateKeyPEMToPrivateKey(codeSigningInfo.privateKey);\n const certificate = convertCertificatePEMToCertificate(codeSigningInfo.certificateForPrivateKey);\n return signBufferRSASHA256AndVerify(\n privateKey,\n certificate,\n Buffer.from(stringifiedManifest, 'utf8')\n );\n}\n"],"names":["getDevelopmentCodeSigningDirectory","getCodeSigningInfoAsync","signManifestString","Log","DEVELOPMENT_CODE_SIGNING_SETTINGS_FILE_NAME","path","join","getExpoHomeDirectory","getProjectDevelopmentCodeSigningInfoFile","defaults","getFile","easProjectId","filePath","JsonFile","readAsync","projectSettings","writeAsync","ensureDir","setAsync","json","mergeAsync","cantReadFileDefault","DevelopmentCodeSigningInfoFile","scopeKey","privateKey","certificateChain","exp","expectSignatureHeader","privateKeyPath","parsedExpectSignature","parseDictionary","CommandError","expectedKeyIdOuter","get","expectedKeyId","expectedAlg","expectedAlgOuter","expectedAlgTemp","getExpoRootDevelopmentCodeSigningInfoAsync","getProjectCodeSigningCertificateAsync","extra","eas","projectId","warn","learnMore","developmentCodeSigningInfoFromFile","validatedCodeSigningInfo","validateStoredDevelopmentExpoRootCertificateCodeSigningInfo","APISettings","isOffline","fetchAndCacheNewDevelopmentCodeSigningInfoAsync","e","codeSigningCertificatePath","updates","codeSigningCertificate","codeSigningMetadata","alg","keyid","privateKeyPEM","certificatePEM","getProjectPrivateKeyAndCertificateFromFilePathsAsync","keyId","certificateForPrivateKey","certificateChainForResponse","readFileWithErrorAsync","errorMessage","fs","readFile","codeSigningCertificatePEM","Promise","all","convertPrivateKeyPEMToPrivateKey","certificate","convertCertificatePEMToCertificate","validateSelfSignedCertificate","publicKey","codeSigningInfo","certificatePEMs","map","leafCertificate","now","Date","validity","notBefore","notAfter","actorCanGetProjectDevelopmentCertificate","actor","app","owningAccountId","ownerAccount","id","owningAccountIsActorPrimaryAccount","__typename","primaryAccount","userHasPublishPermissionForOwningAccount","accounts","find","account","users","userPermission","permissions","includes","Permission","Publish","ensureLoggedInAsync","AppQuery","byIdAsync","keyPair","generateKeyPair","keyPairPEM","convertKeyPairToPEM","csr","generateCSR","csrPEM","convertCSRToCSRPEM","developmentSigningCertificate","expoGoIntermediateCertificate","getProjectDevelopmentCertificateAsync","getExpoGoIntermediateCertificateAsync","stringifiedManifest","signBufferRSASHA256AndVerify","Buffer","from"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utils/codesigning.ts"],"sourcesContent":["import {\n convertCertificatePEMToCertificate,\n convertKeyPairToPEM,\n convertCSRToCSRPEM,\n generateKeyPair,\n generateCSR,\n convertPrivateKeyPEMToPrivateKey,\n validateSelfSignedCertificate,\n signBufferRSASHA256AndVerify,\n} from '@expo/code-signing-certificates';\nimport { ExpoConfig } from '@expo/config';\nimport { getExpoHomeDirectory } from '@expo/config/build/getUserState';\nimport JsonFile, { JSONObject } from '@expo/json-file';\nimport { promises as fs } from 'fs';\nimport { pki as PKI } from 'node-forge';\nimport path from 'path';\nimport { Dictionary, parseDictionary } from 'structured-headers';\n\nimport { getExpoGoIntermediateCertificateAsync } from '../api/getExpoGoIntermediateCertificate';\nimport { getProjectDevelopmentCertificateAsync } from '../api/getProjectDevelopmentCertificate';\nimport { AppQuery } from '../api/graphql/queries/AppQuery';\nimport { ensureLoggedInAsync } from '../api/user/actions';\nimport { Actor } from '../api/user/user';\nimport { AppByIdQuery, Permission } from '../graphql/generated';\nimport * as Log from '../log';\nimport { learnMore } from '../utils/link';\nimport { env } from './env';\nimport { CommandError } from './errors';\n\nconst debug = require('debug')('expo:codesigning') as typeof console.log;\n\nexport type CodeSigningInfo = {\n keyId: string;\n privateKey: string;\n certificateForPrivateKey: string;\n /**\n * Chain of certificates to serve in the manifest multipart body \"certificate_chain\" part.\n * The leaf certificate must be the 0th element of the array, followed by any intermediate certificates\n * necessary to evaluate the chain of trust ending in the implicitly trusted root certificate embedded in\n * the client.\n *\n * An empty array indicates that there is no need to serve the certificate chain in the multipart response.\n */\n certificateChainForResponse: string[];\n /**\n * Scope key cached for the project when certificate is development Expo Go code signing.\n * For project-specific code signing (keyId == the project's generated keyId) this is undefined.\n */\n scopeKey: string | null;\n};\n\ntype StoredDevelopmentExpoRootCodeSigningInfo = {\n easProjectId: string | null;\n scopeKey: string | null;\n privateKey: string | null;\n certificateChain: string[] | null;\n};\nconst DEVELOPMENT_CODE_SIGNING_SETTINGS_FILE_NAME = 'development-code-signing-settings-2.json';\n\nexport function getDevelopmentCodeSigningDirectory(): string {\n return path.join(getExpoHomeDirectory(), 'codesigning');\n}\n\nfunction getProjectDevelopmentCodeSigningInfoFile<T extends JSONObject>(defaults: T) {\n function getFile(easProjectId: string): JsonFile<T> {\n const filePath = path.join(\n getDevelopmentCodeSigningDirectory(),\n easProjectId,\n DEVELOPMENT_CODE_SIGNING_SETTINGS_FILE_NAME\n );\n return new JsonFile<T>(filePath);\n }\n\n async function readAsync(easProjectId: string): Promise<T> {\n let projectSettings;\n try {\n projectSettings = await getFile(easProjectId).readAsync();\n } catch {\n projectSettings = await getFile(easProjectId).writeAsync(defaults, { ensureDir: true });\n }\n // Set defaults for any missing fields\n return { ...defaults, ...projectSettings };\n }\n\n async function setAsync(easProjectId: string, json: Partial<T>): Promise<T> {\n try {\n return await getFile(easProjectId).mergeAsync(json, {\n cantReadFileDefault: defaults,\n });\n } catch {\n return await getFile(easProjectId).writeAsync(\n {\n ...defaults,\n ...json,\n },\n { ensureDir: true }\n );\n }\n }\n\n return {\n getFile,\n readAsync,\n setAsync,\n };\n}\n\nexport const DevelopmentCodeSigningInfoFile =\n getProjectDevelopmentCodeSigningInfoFile<StoredDevelopmentExpoRootCodeSigningInfo>({\n easProjectId: null,\n scopeKey: null,\n privateKey: null,\n certificateChain: null,\n });\n\n/**\n * Get info necessary to generate a response `expo-signature` header given a project and incoming request `expo-expect-signature` header.\n * This only knows how to serve two code signing keyids:\n * - `expo-root` indicates that it should use a development certificate in the `expo-root` chain. See {@link getExpoRootDevelopmentCodeSigningInfoAsync}\n * - <developer's expo-updates keyid> indicates that it should sign with the configured certificate. See {@link getProjectCodeSigningCertificateAsync}\n */\nexport async function getCodeSigningInfoAsync(\n exp: ExpoConfig,\n expectSignatureHeader: string | null,\n privateKeyPath: string | undefined\n): Promise<CodeSigningInfo | null> {\n if (!expectSignatureHeader) {\n return null;\n }\n\n let parsedExpectSignature: Dictionary;\n try {\n parsedExpectSignature = parseDictionary(expectSignatureHeader);\n } catch {\n throw new CommandError('Invalid value for expo-expect-signature header');\n }\n\n const expectedKeyIdOuter = parsedExpectSignature.get('keyid');\n if (!expectedKeyIdOuter) {\n throw new CommandError('keyid not present in expo-expect-signature header');\n }\n\n const expectedKeyId = expectedKeyIdOuter[0];\n if (typeof expectedKeyId !== 'string') {\n throw new CommandError(\n `Invalid value for keyid in expo-expect-signature header: ${expectedKeyId}`\n );\n }\n\n let expectedAlg: string | null = null;\n const expectedAlgOuter = parsedExpectSignature.get('alg');\n if (expectedAlgOuter) {\n const expectedAlgTemp = expectedAlgOuter[0];\n if (typeof expectedAlgTemp !== 'string') {\n throw new CommandError('Invalid value for alg in expo-expect-signature header');\n }\n expectedAlg = expectedAlgTemp;\n }\n\n if (expectedKeyId === 'expo-root') {\n return await getExpoRootDevelopmentCodeSigningInfoAsync(exp);\n } else if (expectedKeyId === 'expo-go') {\n throw new CommandError(\n 'Invalid certificate requested: cannot sign with embedded keyid=expo-go key'\n );\n } else {\n return await getProjectCodeSigningCertificateAsync(\n exp,\n privateKeyPath,\n expectedKeyId,\n expectedAlg\n );\n }\n}\n\n/**\n * Get a development code signing certificate for the expo-root -> expo-go -> (development certificate) certificate chain.\n * This requires the user be logged in and online, otherwise try to use the cached development certificate.\n */\nasync function getExpoRootDevelopmentCodeSigningInfoAsync(\n exp: ExpoConfig\n): Promise<CodeSigningInfo | null> {\n const easProjectId = exp.extra?.eas?.projectId;\n // can't check for scope key validity since scope key is derived on the server from projectId and we may be offline.\n // we rely upon the client certificate check to validate the scope key\n if (!easProjectId) {\n debug(\n `WARN: Expo Application Services (EAS) is not configured for your project. Configuring EAS enables a more secure development experience amongst many other benefits. ${learnMore(\n 'https://docs.expo.dev/eas/'\n )}`\n );\n return null;\n }\n\n const developmentCodeSigningInfoFromFile = await DevelopmentCodeSigningInfoFile.readAsync(\n easProjectId\n );\n const validatedCodeSigningInfo = validateStoredDevelopmentExpoRootCertificateCodeSigningInfo(\n developmentCodeSigningInfoFromFile,\n easProjectId\n );\n\n // 1. If online, ensure logged in, generate key pair and CSR, fetch and cache certificate chain for projectId\n // (overwriting existing dev cert in case projectId changed or it has expired)\n if (!env.EXPO_OFFLINE) {\n try {\n return await fetchAndCacheNewDevelopmentCodeSigningInfoAsync(easProjectId);\n } catch (e: any) {\n if (validatedCodeSigningInfo) {\n Log.warn(\n 'There was an error fetching the Expo development certificate, falling back to cached certificate'\n );\n return validatedCodeSigningInfo;\n } else {\n // need to return null here and say a message\n throw e;\n }\n }\n }\n\n // 2. check for cached cert/private key matching projectId and scopeKey of project, if found and valid return private key and cert chain including expo-go cert\n if (validatedCodeSigningInfo) {\n return validatedCodeSigningInfo;\n }\n\n // 3. if offline, return null\n Log.warn('Offline and no cached development certificate found, unable to sign manifest');\n return null;\n}\n\n/**\n * Get the certificate configured for expo-updates for this project.\n */\nasync function getProjectCodeSigningCertificateAsync(\n exp: ExpoConfig,\n privateKeyPath: string | undefined,\n expectedKeyId: string,\n expectedAlg: string | null\n): Promise<CodeSigningInfo | null> {\n const codeSigningCertificatePath = exp.updates?.codeSigningCertificate;\n if (!codeSigningCertificatePath) {\n return null;\n }\n\n if (!privateKeyPath) {\n throw new CommandError(\n 'Must specify --private-key-path argument to sign development manifest for requested code signing key'\n );\n }\n\n const codeSigningMetadata = exp.updates?.codeSigningMetadata;\n if (!codeSigningMetadata) {\n throw new CommandError(\n 'Must specify \"codeSigningMetadata\" under the \"updates\" field of your app config file to use EAS code signing'\n );\n }\n\n const { alg, keyid } = codeSigningMetadata;\n if (!alg || !keyid) {\n throw new CommandError(\n 'Must specify \"keyid\" and \"alg\" in the \"codeSigningMetadata\" field under the \"updates\" field of your app config file to use EAS code signing'\n );\n }\n\n if (expectedKeyId !== keyid) {\n throw new CommandError(`keyid mismatch: client=${expectedKeyId}, project=${keyid}`);\n }\n\n if (expectedAlg && expectedAlg !== alg) {\n throw new CommandError(`\"alg\" field mismatch (client=${expectedAlg}, project=${alg})`);\n }\n\n const { privateKeyPEM, certificatePEM } =\n await getProjectPrivateKeyAndCertificateFromFilePathsAsync({\n codeSigningCertificatePath,\n privateKeyPath,\n });\n\n return {\n keyId: keyid,\n privateKey: privateKeyPEM,\n certificateForPrivateKey: certificatePEM,\n certificateChainForResponse: [],\n scopeKey: null,\n };\n}\n\nasync function readFileWithErrorAsync(path: string, errorMessage: string): Promise<string> {\n try {\n return await fs.readFile(path, 'utf8');\n } catch {\n throw new CommandError(errorMessage);\n }\n}\n\nasync function getProjectPrivateKeyAndCertificateFromFilePathsAsync({\n codeSigningCertificatePath,\n privateKeyPath,\n}: {\n codeSigningCertificatePath: string;\n privateKeyPath: string;\n}): Promise<{ privateKeyPEM: string; certificatePEM: string }> {\n const [codeSigningCertificatePEM, privateKeyPEM] = await Promise.all([\n readFileWithErrorAsync(\n codeSigningCertificatePath,\n `Code signing certificate cannot be read from path: ${codeSigningCertificatePath}`\n ),\n readFileWithErrorAsync(\n privateKeyPath,\n `Code signing private key cannot be read from path: ${privateKeyPath}`\n ),\n ]);\n\n const privateKey = convertPrivateKeyPEMToPrivateKey(privateKeyPEM);\n const certificate = convertCertificatePEMToCertificate(codeSigningCertificatePEM);\n validateSelfSignedCertificate(certificate, {\n publicKey: certificate.publicKey as PKI.rsa.PublicKey,\n privateKey,\n });\n\n return { privateKeyPEM, certificatePEM: codeSigningCertificatePEM };\n}\n\n/**\n * Validate that the cached code signing info is still valid for the current project and\n * that it hasn't expired. If invalid, return null.\n */\nfunction validateStoredDevelopmentExpoRootCertificateCodeSigningInfo(\n codeSigningInfo: StoredDevelopmentExpoRootCodeSigningInfo,\n easProjectId: string\n): CodeSigningInfo | null {\n if (codeSigningInfo.easProjectId !== easProjectId) {\n return null;\n }\n\n const {\n privateKey: privateKeyPEM,\n certificateChain: certificatePEMs,\n scopeKey,\n } = codeSigningInfo;\n if (!privateKeyPEM || !certificatePEMs) {\n return null;\n }\n\n const certificateChain = certificatePEMs.map((certificatePEM) =>\n convertCertificatePEMToCertificate(certificatePEM)\n );\n\n // TODO(wschurman): maybe move to @expo/code-signing-certificates\n const leafCertificate = certificateChain[0];\n const now = new Date();\n if (leafCertificate.validity.notBefore > now || leafCertificate.validity.notAfter < now) {\n return null;\n }\n\n // TODO(wschurman): maybe do more validation, like validation of projectID and scopeKey within eas certificate extension\n\n return {\n keyId: 'expo-go',\n certificateChainForResponse: certificatePEMs,\n certificateForPrivateKey: certificatePEMs[0],\n privateKey: privateKeyPEM,\n scopeKey,\n };\n}\n\nfunction actorCanGetProjectDevelopmentCertificate(actor: Actor, app: AppByIdQuery['app']['byId']) {\n const owningAccountId = app.ownerAccount.id;\n\n const owningAccountIsActorPrimaryAccount =\n actor.__typename === 'User' || actor.__typename === 'SSOUser'\n ? actor.primaryAccount.id === owningAccountId\n : false;\n const userHasPublishPermissionForOwningAccount = !!actor.accounts\n .find((account) => account.id === owningAccountId)\n ?.users?.find((userPermission) => userPermission.actor.id === actor.id)\n ?.permissions?.includes(Permission.Publish);\n return owningAccountIsActorPrimaryAccount || userHasPublishPermissionForOwningAccount;\n}\n\nasync function fetchAndCacheNewDevelopmentCodeSigningInfoAsync(\n easProjectId: string\n): Promise<CodeSigningInfo | null> {\n const actor = await ensureLoggedInAsync();\n const app = await AppQuery.byIdAsync(easProjectId);\n if (!actorCanGetProjectDevelopmentCertificate(actor, app)) {\n return null;\n }\n\n const keyPair = generateKeyPair();\n const keyPairPEM = convertKeyPairToPEM(keyPair);\n const csr = generateCSR(keyPair, `Development Certificate for ${easProjectId}`);\n const csrPEM = convertCSRToCSRPEM(csr);\n const [developmentSigningCertificate, expoGoIntermediateCertificate] = await Promise.all([\n getProjectDevelopmentCertificateAsync(easProjectId, csrPEM),\n getExpoGoIntermediateCertificateAsync(easProjectId),\n ]);\n\n await DevelopmentCodeSigningInfoFile.setAsync(easProjectId, {\n easProjectId,\n scopeKey: app.scopeKey,\n privateKey: keyPairPEM.privateKeyPEM,\n certificateChain: [developmentSigningCertificate, expoGoIntermediateCertificate],\n });\n\n return {\n keyId: 'expo-go',\n certificateChainForResponse: [developmentSigningCertificate, expoGoIntermediateCertificate],\n certificateForPrivateKey: developmentSigningCertificate,\n privateKey: keyPairPEM.privateKeyPEM,\n scopeKey: app.scopeKey,\n };\n}\n/**\n * Generate the `expo-signature` header for a manifest and code signing info.\n */\nexport function signManifestString(\n stringifiedManifest: string,\n codeSigningInfo: CodeSigningInfo\n): string {\n const privateKey = convertPrivateKeyPEMToPrivateKey(codeSigningInfo.privateKey);\n const certificate = convertCertificatePEMToCertificate(codeSigningInfo.certificateForPrivateKey);\n return signBufferRSASHA256AndVerify(\n privateKey,\n certificate,\n Buffer.from(stringifiedManifest, 'utf8')\n );\n}\n"],"names":["getDevelopmentCodeSigningDirectory","getCodeSigningInfoAsync","signManifestString","Log","debug","require","DEVELOPMENT_CODE_SIGNING_SETTINGS_FILE_NAME","path","join","getExpoHomeDirectory","getProjectDevelopmentCodeSigningInfoFile","defaults","getFile","easProjectId","filePath","JsonFile","readAsync","projectSettings","writeAsync","ensureDir","setAsync","json","mergeAsync","cantReadFileDefault","DevelopmentCodeSigningInfoFile","scopeKey","privateKey","certificateChain","exp","expectSignatureHeader","privateKeyPath","parsedExpectSignature","parseDictionary","CommandError","expectedKeyIdOuter","get","expectedKeyId","expectedAlg","expectedAlgOuter","expectedAlgTemp","getExpoRootDevelopmentCodeSigningInfoAsync","getProjectCodeSigningCertificateAsync","extra","eas","projectId","learnMore","developmentCodeSigningInfoFromFile","validatedCodeSigningInfo","validateStoredDevelopmentExpoRootCertificateCodeSigningInfo","env","EXPO_OFFLINE","fetchAndCacheNewDevelopmentCodeSigningInfoAsync","e","warn","codeSigningCertificatePath","updates","codeSigningCertificate","codeSigningMetadata","alg","keyid","privateKeyPEM","certificatePEM","getProjectPrivateKeyAndCertificateFromFilePathsAsync","keyId","certificateForPrivateKey","certificateChainForResponse","readFileWithErrorAsync","errorMessage","fs","readFile","codeSigningCertificatePEM","Promise","all","convertPrivateKeyPEMToPrivateKey","certificate","convertCertificatePEMToCertificate","validateSelfSignedCertificate","publicKey","codeSigningInfo","certificatePEMs","map","leafCertificate","now","Date","validity","notBefore","notAfter","actorCanGetProjectDevelopmentCertificate","actor","app","owningAccountId","ownerAccount","id","owningAccountIsActorPrimaryAccount","__typename","primaryAccount","userHasPublishPermissionForOwningAccount","accounts","find","account","users","userPermission","permissions","includes","Permission","Publish","ensureLoggedInAsync","AppQuery","byIdAsync","keyPair","generateKeyPair","keyPairPEM","convertKeyPairToPEM","csr","generateCSR","csrPEM","convertCSRToCSRPEM","developmentSigningCertificate","expoGoIntermediateCertificate","getProjectDevelopmentCertificateAsync","getExpoGoIntermediateCertificateAsync","stringifiedManifest","signBufferRSASHA256AndVerify","Buffer","from"],"mappings":"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"}
@@ -13,6 +13,9 @@ class Env {
13
13
  /** Enable debug logging */ get EXPO_DEBUG() {
14
14
  return (0, _getenv).boolish("EXPO_DEBUG", false);
15
15
  }
16
+ /** Disable all network requests */ get EXPO_OFFLINE() {
17
+ return (0, _getenv).boolish("EXPO_OFFLINE", false);
18
+ }
16
19
  /** Enable the beta version of Expo (TODO: Should this just be in the beta version of expo releases?) */ get EXPO_BETA() {
17
20
  return (0, _getenv).boolish("EXPO_BETA", false);
18
21
  }
@@ -106,11 +109,8 @@ class Env {
106
109
  */ get HTTP_PROXY() {
107
110
  return process.env.HTTP_PROXY || process.env.http_proxy || "";
108
111
  }
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
- }
112
- /** **Experimental:** Enable automatic TypeScript types for Expo Router projects (SDK +49). */ get EXPO_USE_TYPED_ROUTES() {
113
- return (0, _getenv).boolish("EXPO_USE_TYPED_ROUTES", false);
112
+ /** Use the network inspector by overriding the metro inspector proxy with a custom version */ get EXPO_NO_INSPECTOR_PROXY() {
113
+ return (0, _getenv).boolish("EXPO_NO_INSPECTOR_PROXY", false);
114
114
  }
115
115
  /** Disable lazy bundling in Metro bundler. */ get EXPO_NO_METRO_LAZY() {
116
116
  return (0, _getenv).boolish("EXPO_NO_METRO_LAZY", false);
@@ -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 /** **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 /** **Experimental:** Enable automatic TypeScript types for Expo Router projects (SDK +49). */\n get EXPO_USE_TYPED_ROUTES() {\n return boolish('EXPO_USE_TYPED_ROUTES', false);\n }\n\n /** Disable lazy bundling in Metro bundler. */\n get EXPO_NO_METRO_LAZY() {\n return boolish('EXPO_NO_METRO_LAZY', 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","EXPO_USE_TYPED_ROUTES","EXPO_NO_METRO_LAZY"],"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 /** Disable all network requests */\n get EXPO_OFFLINE() {\n return boolish('EXPO_OFFLINE', 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 /** Use the network inspector by overriding the metro inspector proxy with a custom version */\n get EXPO_NO_INSPECTOR_PROXY(): boolean {\n return boolish('EXPO_NO_INSPECTOR_PROXY', false);\n }\n\n /** Disable lazy bundling in Metro bundler. */\n get EXPO_NO_METRO_LAZY() {\n return boolish('EXPO_NO_METRO_LAZY', false);\n }\n}\n\nexport const env = new Env();\n"],"names":["Env","EXPO_PROFILE","boolish","EXPO_DEBUG","EXPO_OFFLINE","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_NO_INSPECTOR_PROXY","EXPO_NO_METRO_LAZY"],"mappings":"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"}
@@ -19,6 +19,9 @@ function _interopRequireDefault(obj) {
19
19
  default: obj
20
20
  };
21
21
  }
22
+ const generatedHeaderPrefix = `# @generated expo-cli`;
23
+ const generatedFooterComment = `# @end expo-cli`;
24
+ exports.generatedFooterComment = generatedFooterComment;
22
25
  function mergeGitIgnorePaths(targetGitIgnorePath, sourceGitIgnorePath) {
23
26
  if (!_fs.default.existsSync(targetGitIgnorePath)) {
24
27
  // No gitignore in the project already, no need to merge anything into anything. I guess they
@@ -38,9 +41,6 @@ function mergeGitIgnorePaths(targetGitIgnorePath, sourceGitIgnorePath) {
38
41
  }
39
42
  return merged;
40
43
  }
41
- const generatedHeaderPrefix = `# @generated expo-cli`;
42
- const generatedFooterComment = `# @end expo-cli`;
43
- exports.generatedFooterComment = generatedFooterComment;
44
44
  /**
45
45
  * Get line indexes for the generated section of a gitignore.
46
46
  *
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/mergeGitIgnorePaths.ts"],"sourcesContent":["import crypto from 'crypto';\nimport fs from 'fs';\n\nimport { Log } from '../log';\n\ntype MergeResults = {\n contents: string;\n didClear: boolean;\n didMerge: boolean;\n};\n/**\n * Merge two gitignore files together and add a generated header.\n *\n * @param targetGitIgnorePath\n * @param sourceGitIgnorePath\n *\n * @returns `null` if one of the gitignore files doesn't exist. Otherwise, returns the merged contents.\n */\nexport function mergeGitIgnorePaths(\n targetGitIgnorePath: string,\n sourceGitIgnorePath: string\n): null | MergeResults {\n if (!fs.existsSync(targetGitIgnorePath)) {\n // No gitignore in the project already, no need to merge anything into anything. I guess they\n // are not using git :O\n return null;\n }\n\n if (!fs.existsSync(sourceGitIgnorePath)) {\n // Maybe we don't have a gitignore in the template project\n return null;\n }\n\n const targetGitIgnore = fs.readFileSync(targetGitIgnorePath).toString();\n const sourceGitIgnore = fs.readFileSync(sourceGitIgnorePath).toString();\n const merged = mergeGitIgnoreContents(targetGitIgnore, sourceGitIgnore);\n // Only rewrite the file if it was modified.\n if (merged.contents) {\n fs.writeFileSync(targetGitIgnorePath, merged.contents);\n }\n\n return merged;\n}\n\nconst generatedHeaderPrefix = `# @generated expo-cli`;\nexport const generatedFooterComment = `# @end expo-cli`;\n\n/**\n * Get line indexes for the generated section of a gitignore.\n *\n * @param gitIgnore\n */\nfunction getGeneratedSectionIndexes(gitIgnore: string): {\n contents: string[];\n start: number;\n end: number;\n} {\n const contents = gitIgnore.split('\\n');\n const start = contents.findIndex((line) => line.startsWith(generatedHeaderPrefix));\n const end = contents.findIndex((line) => line.startsWith(generatedFooterComment));\n\n return { contents, start, end };\n}\n\n/**\n * Removes the generated section from a gitignore, returns null when nothing can be removed.\n * This sways heavily towards not removing lines unless it's certain that modifications were not made to the gitignore manually.\n *\n * @param gitIgnore\n */\nexport function removeGeneratedGitIgnoreContents(gitIgnore: string): string | null {\n const { contents, start, end } = getGeneratedSectionIndexes(gitIgnore);\n if (start > -1 && end > -1 && start < end) {\n contents.splice(start, end - start + 1);\n // TODO: We could in theory check that the contents we're removing match the hash used in the header,\n // this would ensure that we don't accidentally remove lines that someone added or removed from the generated section.\n return contents.join('\\n');\n }\n return null;\n}\n\n/**\n * Merge the contents of two gitignores together and add a generated header.\n *\n * @param targetGitIgnore contents of the existing gitignore\n * @param sourceGitIgnore contents of the extra gitignore\n */\nexport function mergeGitIgnoreContents(\n targetGitIgnore: string,\n sourceGitIgnore: string\n): MergeResults {\n const header = createGeneratedHeaderComment(sourceGitIgnore);\n if (!targetGitIgnore.includes(header)) {\n // Ensure the old generated gitignore contents are removed.\n const sanitizedTarget = removeGeneratedGitIgnoreContents(targetGitIgnore);\n return {\n contents: [\n sanitizedTarget ?? targetGitIgnore,\n header,\n `# The following patterns were generated by expo-cli`,\n ``,\n sourceGitIgnore,\n generatedFooterComment,\n ].join('\\n'),\n didMerge: true,\n didClear: !!sanitizedTarget,\n };\n }\n return { contents: targetGitIgnore, didClear: false, didMerge: false };\n}\n\n/**\n * Adds the contents into an existing gitignore \"generated by expo-cli section\"\n * If no section exists, it will be created (hence the name upsert)\n */\nexport function upsertGitIgnoreContents(\n targetGitIgnorePath: string,\n contents: string\n): MergeResults | null {\n const targetGitIgnore = fs.readFileSync(targetGitIgnorePath, {\n encoding: 'utf-8',\n flag: 'a+',\n });\n\n if (targetGitIgnore.match(new RegExp(`^${contents}[\\\\n\\\\r\\\\s]*$`, 'm'))) {\n return null;\n }\n\n // If there is an existing section, update it with the new content\n if (targetGitIgnore.includes(generatedHeaderPrefix)) {\n const indexes = getGeneratedSectionIndexes(targetGitIgnore);\n\n contents = `${indexes.contents.slice(indexes.start + 3, indexes.end).join('\\n')}\\n${contents}`;\n }\n\n const merged = mergeGitIgnoreContents(targetGitIgnore, contents);\n\n if (merged.contents) {\n fs.writeFileSync(targetGitIgnorePath, merged.contents);\n }\n return merged;\n}\n\nexport function createGeneratedHeaderComment(gitIgnore: string): string {\n const hashKey = createGitIgnoreHash(getSanitizedGitIgnoreLines(gitIgnore).join('\\n'));\n\n return `${generatedHeaderPrefix} ${hashKey}`;\n}\n\n/**\n * Normalize the contents of a gitignore to ensure that minor changes like new lines or sort order don't cause a regeneration.\n */\nexport function getSanitizedGitIgnoreLines(gitIgnore: string): string[] {\n // filter, trim, and sort the lines.\n return gitIgnore\n .split('\\n')\n .filter((v) => {\n const line = v.trim();\n // Strip comments\n if (line.startsWith('#')) {\n return false;\n }\n return !!line;\n })\n .sort();\n}\n\nexport function createGitIgnoreHash(gitIgnore: string): string {\n // this doesn't need to be secure, the shorter the better.\n const hash = crypto.createHash('sha1').update(gitIgnore).digest('hex');\n return `sync-${hash}`;\n}\n\nexport function removeFromGitIgnore(targetGitIgnorePath: string, contents: string) {\n try {\n if (!fs.existsSync(targetGitIgnorePath)) {\n return;\n }\n\n let targetGitIgnore = fs.readFileSync(targetGitIgnorePath, 'utf-8');\n\n if (!targetGitIgnore.includes(contents)) {\n return null;\n }\n\n targetGitIgnore = targetGitIgnore.replace(`${contents}\\n`, '');\n\n const indexes = getGeneratedSectionIndexes(targetGitIgnore);\n\n if (indexes.start === indexes.end - 3) {\n targetGitIgnore = targetGitIgnore.replace(\n new RegExp(`^${generatedHeaderPrefix}((.|\\n)*)${generatedFooterComment}$`, 'm'),\n ''\n );\n }\n\n return fs.writeFileSync(targetGitIgnorePath, targetGitIgnore);\n } catch (error) {\n Log.error(`Failed to read/write to .gitignore path: ${targetGitIgnorePath}`);\n throw error;\n }\n}\n"],"names":["mergeGitIgnorePaths","removeGeneratedGitIgnoreContents","mergeGitIgnoreContents","upsertGitIgnoreContents","createGeneratedHeaderComment","getSanitizedGitIgnoreLines","createGitIgnoreHash","removeFromGitIgnore","targetGitIgnorePath","sourceGitIgnorePath","fs","existsSync","targetGitIgnore","readFileSync","toString","sourceGitIgnore","merged","contents","writeFileSync","generatedHeaderPrefix","generatedFooterComment","getGeneratedSectionIndexes","gitIgnore","split","start","findIndex","line","startsWith","end","splice","join","header","includes","sanitizedTarget","didMerge","didClear","encoding","flag","match","RegExp","indexes","slice","hashKey","filter","v","trim","sort","hash","crypto","createHash","update","digest","replace","error","Log"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utils/mergeGitIgnorePaths.ts"],"sourcesContent":["import crypto from 'crypto';\nimport fs from 'fs';\n\nimport { Log } from '../log';\n\ntype MergeResults = {\n contents: string;\n didClear: boolean;\n didMerge: boolean;\n};\n\nconst generatedHeaderPrefix = `# @generated expo-cli`;\nexport const generatedFooterComment = `# @end expo-cli`;\n\n/**\n * Merge two gitignore files together and add a generated header.\n *\n * @param targetGitIgnorePath\n * @param sourceGitIgnorePath\n *\n * @returns `null` if one of the gitignore files doesn't exist. Otherwise, returns the merged contents.\n */\nexport function mergeGitIgnorePaths(\n targetGitIgnorePath: string,\n sourceGitIgnorePath: string\n): null | MergeResults {\n if (!fs.existsSync(targetGitIgnorePath)) {\n // No gitignore in the project already, no need to merge anything into anything. I guess they\n // are not using git :O\n return null;\n }\n\n if (!fs.existsSync(sourceGitIgnorePath)) {\n // Maybe we don't have a gitignore in the template project\n return null;\n }\n\n const targetGitIgnore = fs.readFileSync(targetGitIgnorePath).toString();\n const sourceGitIgnore = fs.readFileSync(sourceGitIgnorePath).toString();\n const merged = mergeGitIgnoreContents(targetGitIgnore, sourceGitIgnore);\n // Only rewrite the file if it was modified.\n if (merged.contents) {\n fs.writeFileSync(targetGitIgnorePath, merged.contents);\n }\n\n return merged;\n}\n\n/**\n * Get line indexes for the generated section of a gitignore.\n *\n * @param gitIgnore\n */\nfunction getGeneratedSectionIndexes(gitIgnore: string): {\n contents: string[];\n start: number;\n end: number;\n} {\n const contents = gitIgnore.split('\\n');\n const start = contents.findIndex((line) => line.startsWith(generatedHeaderPrefix));\n const end = contents.findIndex((line) => line.startsWith(generatedFooterComment));\n\n return { contents, start, end };\n}\n\n/**\n * Removes the generated section from a gitignore, returns null when nothing can be removed.\n * This sways heavily towards not removing lines unless it's certain that modifications were not made to the gitignore manually.\n *\n * @param gitIgnore\n */\nexport function removeGeneratedGitIgnoreContents(gitIgnore: string): string | null {\n const { contents, start, end } = getGeneratedSectionIndexes(gitIgnore);\n if (start > -1 && end > -1 && start < end) {\n contents.splice(start, end - start + 1);\n // TODO: We could in theory check that the contents we're removing match the hash used in the header,\n // this would ensure that we don't accidentally remove lines that someone added or removed from the generated section.\n return contents.join('\\n');\n }\n return null;\n}\n\n/**\n * Merge the contents of two gitignores together and add a generated header.\n *\n * @param targetGitIgnore contents of the existing gitignore\n * @param sourceGitIgnore contents of the extra gitignore\n */\nexport function mergeGitIgnoreContents(\n targetGitIgnore: string,\n sourceGitIgnore: string\n): MergeResults {\n const header = createGeneratedHeaderComment(sourceGitIgnore);\n if (!targetGitIgnore.includes(header)) {\n // Ensure the old generated gitignore contents are removed.\n const sanitizedTarget = removeGeneratedGitIgnoreContents(targetGitIgnore);\n return {\n contents: [\n sanitizedTarget ?? targetGitIgnore,\n header,\n `# The following patterns were generated by expo-cli`,\n ``,\n sourceGitIgnore,\n generatedFooterComment,\n ].join('\\n'),\n didMerge: true,\n didClear: !!sanitizedTarget,\n };\n }\n return { contents: targetGitIgnore, didClear: false, didMerge: false };\n}\n\n/**\n * Adds the contents into an existing gitignore \"generated by expo-cli section\"\n * If no section exists, it will be created (hence the name upsert)\n */\nexport function upsertGitIgnoreContents(\n targetGitIgnorePath: string,\n contents: string\n): MergeResults | null {\n const targetGitIgnore = fs.readFileSync(targetGitIgnorePath, {\n encoding: 'utf-8',\n flag: 'a+',\n });\n\n if (targetGitIgnore.match(new RegExp(`^${contents}[\\\\n\\\\r\\\\s]*$`, 'm'))) {\n return null;\n }\n\n // If there is an existing section, update it with the new content\n if (targetGitIgnore.includes(generatedHeaderPrefix)) {\n const indexes = getGeneratedSectionIndexes(targetGitIgnore);\n\n contents = `${indexes.contents.slice(indexes.start + 3, indexes.end).join('\\n')}\\n${contents}`;\n }\n\n const merged = mergeGitIgnoreContents(targetGitIgnore, contents);\n\n if (merged.contents) {\n fs.writeFileSync(targetGitIgnorePath, merged.contents);\n }\n return merged;\n}\n\nexport function createGeneratedHeaderComment(gitIgnore: string): string {\n const hashKey = createGitIgnoreHash(getSanitizedGitIgnoreLines(gitIgnore).join('\\n'));\n\n return `${generatedHeaderPrefix} ${hashKey}`;\n}\n\n/**\n * Normalize the contents of a gitignore to ensure that minor changes like new lines or sort order don't cause a regeneration.\n */\nexport function getSanitizedGitIgnoreLines(gitIgnore: string): string[] {\n // filter, trim, and sort the lines.\n return gitIgnore\n .split('\\n')\n .filter((v) => {\n const line = v.trim();\n // Strip comments\n if (line.startsWith('#')) {\n return false;\n }\n return !!line;\n })\n .sort();\n}\n\nexport function createGitIgnoreHash(gitIgnore: string): string {\n // this doesn't need to be secure, the shorter the better.\n const hash = crypto.createHash('sha1').update(gitIgnore).digest('hex');\n return `sync-${hash}`;\n}\n\nexport function removeFromGitIgnore(targetGitIgnorePath: string, contents: string) {\n try {\n if (!fs.existsSync(targetGitIgnorePath)) {\n return;\n }\n\n let targetGitIgnore = fs.readFileSync(targetGitIgnorePath, 'utf-8');\n\n if (!targetGitIgnore.includes(contents)) {\n return null;\n }\n\n targetGitIgnore = targetGitIgnore.replace(`${contents}\\n`, '');\n\n const indexes = getGeneratedSectionIndexes(targetGitIgnore);\n\n if (indexes.start === indexes.end - 3) {\n targetGitIgnore = targetGitIgnore.replace(\n new RegExp(`^${generatedHeaderPrefix}((.|\\n)*)${generatedFooterComment}$`, 'm'),\n ''\n );\n }\n\n return fs.writeFileSync(targetGitIgnorePath, targetGitIgnore);\n } catch (error) {\n Log.error(`Failed to read/write to .gitignore path: ${targetGitIgnorePath}`);\n throw error;\n }\n}\n"],"names":["mergeGitIgnorePaths","removeGeneratedGitIgnoreContents","mergeGitIgnoreContents","upsertGitIgnoreContents","createGeneratedHeaderComment","getSanitizedGitIgnoreLines","createGitIgnoreHash","removeFromGitIgnore","generatedHeaderPrefix","generatedFooterComment","targetGitIgnorePath","sourceGitIgnorePath","fs","existsSync","targetGitIgnore","readFileSync","toString","sourceGitIgnore","merged","contents","writeFileSync","getGeneratedSectionIndexes","gitIgnore","split","start","findIndex","line","startsWith","end","splice","join","header","includes","sanitizedTarget","didMerge","didClear","encoding","flag","match","RegExp","indexes","slice","hashKey","filter","v","trim","sort","hash","crypto","createHash","update","digest","replace","error","Log"],"mappings":"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"}