@expo/cli 0.2.6 → 0.2.7

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 (41) hide show
  1. package/build/bin/cli +2 -2
  2. package/build/src/install/checkPackages.js +2 -2
  3. package/build/src/install/checkPackages.js.map +1 -1
  4. package/build/src/prebuild/clearNativeFolder.js +5 -2
  5. package/build/src/prebuild/clearNativeFolder.js.map +1 -1
  6. package/build/src/register/registerAsync.js +2 -2
  7. package/build/src/register/registerAsync.js.map +1 -1
  8. package/build/src/run/hints.js +2 -2
  9. package/build/src/run/hints.js.map +1 -1
  10. package/build/src/run/ios/appleDevice/installOnDeviceAsync.js +2 -2
  11. package/build/src/run/ios/appleDevice/installOnDeviceAsync.js.map +1 -1
  12. package/build/src/run/ios/codeSigning/resolveCertificateSigningIdentity.js +2 -2
  13. package/build/src/run/ios/codeSigning/resolveCertificateSigningIdentity.js.map +1 -1
  14. package/build/src/run/startBundler.js +2 -2
  15. package/build/src/run/startBundler.js.map +1 -1
  16. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js +2 -2
  17. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js.map +1 -1
  18. package/build/src/start/platforms/ExpoGoInstaller.js +2 -1
  19. package/build/src/start/platforms/ExpoGoInstaller.js.map +1 -1
  20. package/build/src/start/platforms/PlatformManager.js +1 -1
  21. package/build/src/start/platforms/PlatformManager.js.map +1 -1
  22. package/build/src/start/server/DevelopmentSession.js +11 -6
  23. package/build/src/start/server/DevelopmentSession.js.map +1 -1
  24. package/build/src/start/server/UrlCreator.js +7 -2
  25. package/build/src/start/server/UrlCreator.js.map +1 -1
  26. package/build/src/start/server/middleware/ClassicManifestMiddleware.js +1 -1
  27. package/build/src/start/startAsync.js +8 -8
  28. package/build/src/start/startAsync.js.map +1 -1
  29. package/build/src/utils/analytics/rudderstackClient.js +24 -38
  30. package/build/src/utils/analytics/rudderstackClient.js.map +1 -1
  31. package/build/src/utils/env.js +16 -0
  32. package/build/src/utils/env.js.map +1 -1
  33. package/build/src/utils/git.js +2 -1
  34. package/build/src/utils/git.js.map +1 -1
  35. package/build/src/utils/interactive.js +11 -0
  36. package/build/src/utils/interactive.js.map +1 -0
  37. package/build/src/utils/ora.js +2 -1
  38. package/build/src/utils/ora.js.map +1 -1
  39. package/build/src/utils/prompts.js +2 -2
  40. package/build/src/utils/prompts.js.map +1 -1
  41. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/start/server/DevelopmentSession.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\n\nimport { APISettings } from '../../api/settings';\nimport {\n closeDevelopmentSessionAsync,\n updateDevelopmentSessionAsync,\n} from '../../api/updateDevelopmentSession';\nimport { getUserAsync } from '../../api/user/user';\nimport * as ProjectDevices from '../project/devices';\n\nconst debug = require('debug')('expo:start:server:developmentSession') as typeof console.log;\n\nconst UPDATE_FREQUENCY = 20 * 1000; // 20 seconds\n\nasync function isAuthenticatedAsync(): Promise<boolean> {\n return !!(await getUserAsync().catch(() => null));\n}\n\nexport class DevelopmentSession {\n private timeout: NodeJS.Timeout | null = null;\n\n constructor(\n /** Project root directory. */\n private projectRoot: string,\n /** Development Server URL. */\n public url: string | null\n ) {}\n\n /**\n * Notify the Expo servers that a project is running, this enables the Expo Go app\n * and Dev Clients to offer a \"recently in development\" section for quick access.\n *\n * This method starts an interval that will continue to ping the servers until we stop it.\n *\n * @param projectRoot Project root folder, used for retrieving device installation IDs.\n * @param props.exp Partial Expo config with values that will be used in the Expo Go app.\n * @param props.runtime which runtime the app should be opened in. `native` for dev clients, `web` for web browsers.\n * @returns\n */\n public async startAsync({\n exp = getConfig(this.projectRoot).exp,\n runtime,\n }: {\n exp?: Pick<ExpoConfig, 'name' | 'description' | 'slug' | 'primaryColor'>;\n runtime: 'native' | 'web';\n }): Promise<void> {\n if (APISettings.isOffline) {\n debug('Development session will not ping because the server is offline.');\n this.stopNotifying();\n return;\n }\n\n const deviceIds = await this.getDeviceInstallationIdsAsync();\n\n if (!(await isAuthenticatedAsync()) && !deviceIds?.length) {\n debug(\n 'Development session will not ping because the user is not authenticated and there are no devices.'\n );\n this.stopNotifying();\n return;\n }\n\n if (this.url) {\n debug(`Development session ping (runtime: ${runtime}, url: ${this.url})`);\n await updateDevelopmentSessionAsync({\n url: this.url,\n runtime,\n exp,\n deviceIds,\n });\n }\n\n this.stopNotifying();\n\n this.timeout = setTimeout(() => this.startAsync({ exp, runtime }), UPDATE_FREQUENCY);\n }\n\n /** Get all recent devices for the project. */\n private async getDeviceInstallationIdsAsync(): Promise<string[]> {\n const { devices } = await ProjectDevices.getDevicesInfoAsync(this.projectRoot);\n return devices.map(({ installationId }) => installationId);\n }\n\n /** Stop notifying the Expo servers that the development session is running. */\n public stopNotifying() {\n if (this.timeout) {\n clearTimeout(this.timeout);\n }\n this.timeout = null;\n }\n\n public async closeAsync(): Promise<void> {\n this.stopNotifying();\n\n const deviceIds = await this.getDeviceInstallationIdsAsync();\n\n if (!(await isAuthenticatedAsync()) && !deviceIds?.length) {\n return;\n }\n\n if (this.url) {\n await closeDevelopmentSessionAsync({\n url: this.url,\n deviceIds,\n });\n }\n }\n}\n"],"names":["ProjectDevices","debug","require","UPDATE_FREQUENCY","isAuthenticatedAsync","getUserAsync","catch","DevelopmentSession","constructor","projectRoot","url","timeout","startAsync","exp","getConfig","runtime","APISettings","isOffline","stopNotifying","deviceIds","getDeviceInstallationIdsAsync","length","updateDevelopmentSessionAsync","setTimeout","devices","getDevicesInfoAsync","map","installationId","clearTimeout","closeAsync","closeDevelopmentSessionAsync"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/start/server/DevelopmentSession.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\n\nimport { APISettings } from '../../api/settings';\nimport {\n closeDevelopmentSessionAsync,\n updateDevelopmentSessionAsync,\n} from '../../api/updateDevelopmentSession';\nimport { getUserAsync } from '../../api/user/user';\nimport { Log } from '../../log';\nimport * as ProjectDevices from '../project/devices';\n\nconst debug = require('debug')('expo:start:server:developmentSession') as typeof console.log;\n\nconst UPDATE_FREQUENCY = 20 * 1000; // 20 seconds\n\nasync function isAuthenticatedAsync(): Promise<boolean> {\n return !!(await getUserAsync().catch(() => null));\n}\n\nexport class DevelopmentSession {\n private timeout: NodeJS.Timeout | null = null;\n\n constructor(\n /** Project root directory. */\n private projectRoot: string,\n /** Development Server URL. */\n public url: string | null\n ) {}\n\n /**\n * Notify the Expo servers that a project is running, this enables the Expo Go app\n * and Dev Clients to offer a \"recently in development\" section for quick access.\n *\n * This method starts an interval that will continue to ping the servers until we stop it.\n *\n * @param projectRoot Project root folder, used for retrieving device installation IDs.\n * @param props.exp Partial Expo config with values that will be used in the Expo Go app.\n * @param props.runtime which runtime the app should be opened in. `native` for dev clients, `web` for web browsers.\n * @returns\n */\n public async startAsync({\n exp = getConfig(this.projectRoot).exp,\n runtime,\n }: {\n exp?: Pick<ExpoConfig, 'name' | 'description' | 'slug' | 'primaryColor'>;\n runtime: 'native' | 'web';\n }): Promise<void> {\n if (APISettings.isOffline) {\n debug('Development session will not ping because the server is offline.');\n this.stopNotifying();\n return;\n }\n\n const deviceIds = await this.getDeviceInstallationIdsAsync();\n\n if (!(await isAuthenticatedAsync()) && !deviceIds?.length) {\n debug(\n 'Development session will not ping because the user is not authenticated and there are no devices.'\n );\n this.stopNotifying();\n return;\n }\n\n if (this.url) {\n debug(`Development session ping (runtime: ${runtime}, url: ${this.url})`);\n try {\n await updateDevelopmentSessionAsync({\n url: this.url,\n runtime,\n exp,\n deviceIds,\n });\n } catch (error) {\n Log.warn(`Non-fatal error updating development session API: ${error}`);\n }\n }\n\n this.stopNotifying();\n\n this.timeout = setTimeout(() => this.startAsync({ exp, runtime }), UPDATE_FREQUENCY);\n }\n\n /** Get all recent devices for the project. */\n private async getDeviceInstallationIdsAsync(): Promise<string[]> {\n const { devices } = await ProjectDevices.getDevicesInfoAsync(this.projectRoot);\n return devices.map(({ installationId }) => installationId);\n }\n\n /** Stop notifying the Expo servers that the development session is running. */\n public stopNotifying() {\n if (this.timeout) {\n clearTimeout(this.timeout);\n }\n this.timeout = null;\n }\n\n public async closeAsync(): Promise<void> {\n this.stopNotifying();\n\n const deviceIds = await this.getDeviceInstallationIdsAsync();\n\n if (!(await isAuthenticatedAsync()) && !deviceIds?.length) {\n return;\n }\n\n if (this.url) {\n await closeDevelopmentSessionAsync({\n url: this.url,\n deviceIds,\n });\n }\n }\n}\n"],"names":["ProjectDevices","debug","require","UPDATE_FREQUENCY","isAuthenticatedAsync","getUserAsync","catch","DevelopmentSession","constructor","projectRoot","url","timeout","startAsync","exp","getConfig","runtime","APISettings","isOffline","stopNotifying","deviceIds","getDeviceInstallationIdsAsync","length","updateDevelopmentSessionAsync","error","Log","warn","setTimeout","devices","getDevicesInfoAsync","map","installationId","clearTimeout","closeAsync","closeDevelopmentSessionAsync"],"mappings":"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"}
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  var _assert = _interopRequireDefault(require("assert"));
6
6
  var _url = require("url");
7
7
  var Log = _interopRequireWildcard(require("../../log"));
8
+ var _env = require("../../utils/env");
8
9
  var _ip = require("../../utils/ip");
9
10
  function _interopRequireDefault(obj) {
10
11
  return obj && obj.__esModule ? obj : {
@@ -153,9 +154,13 @@ function joinUrlComponents({ protocol , hostname , port }) {
153
154
  // This is because Android React Native WebSocket implementation is not spec compliant and fails without a port:
154
155
  // `E unknown:ReactNative: java.lang.IllegalArgumentException: Invalid URL port: "-1"`
155
156
  // Invoked first in `metro-runtime/src/modules/HMRClient.js`
156
- const validPort = port || "80";
157
+ const validPort = _env.env.EXPO_NO_DEFAULT_PORT ? port : port || "80";
157
158
  const validProtocol = protocol ? `${protocol}://` : "";
158
- return `${validProtocol}${hostname}:${validPort}`;
159
+ let url = `${validProtocol}${hostname}`;
160
+ if (validPort) {
161
+ url += `:${validPort}`;
162
+ }
163
+ return url;
159
164
  }
160
165
  /** @deprecated */ function getProxyUrl() {
161
166
  return process.env.EXPO_PACKAGER_PROXY_URL;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/start/server/UrlCreator.ts"],"sourcesContent":["import assert from 'assert';\nimport { URL } from 'url';\n\nimport * as Log from '../../log';\nimport { getIpAddress } from '../../utils/ip';\n\nconst debug = require('debug')('expo:start:server:urlCreator') as typeof console.log;\n\nexport interface CreateURLOptions {\n /** URL scheme to use when opening apps in custom runtimes. */\n scheme?: string | null;\n /** Type of dev server host to use. */\n hostType?: 'localhost' | 'lan' | 'tunnel';\n /** Requested hostname. */\n hostname?: string | null;\n}\n\ninterface UrlComponents {\n port: string;\n hostname: string;\n protocol: string;\n}\nexport class UrlCreator {\n constructor(\n private defaults: CreateURLOptions | undefined,\n private bundlerInfo: { port: number; getTunnelUrl?: () => string | null }\n ) {}\n\n /**\n * @returns URL like `http://localhost:19000/_expo/loading?platform=ios`\n */\n public constructLoadingUrl(options: CreateURLOptions, platform: string): string {\n const url = new URL('_expo/loading', this.constructUrl({ scheme: 'http', ...options }));\n url.search = new URLSearchParams({ platform }).toString();\n const loadingUrl = url.toString();\n debug(`Loading URL: ${loadingUrl}`);\n return loadingUrl;\n }\n\n /** Create a URI for launching in a native dev client. Returns `null` when no `scheme` can be resolved. */\n public constructDevClientUrl(options?: CreateURLOptions): null | string {\n const protocol = options?.scheme || this.defaults?.scheme;\n\n if (\n !protocol ||\n // Prohibit the use of http(s) in dev client URIs since they'll never be valid.\n ['http', 'https'].includes(protocol.toLowerCase())\n ) {\n return null;\n }\n\n const manifestUrl = this.constructUrl({ ...options, scheme: 'http' });\n const devClientUrl = `${protocol}://expo-development-client/?url=${encodeURIComponent(\n manifestUrl\n )}`;\n debug(`Dev client URL: ${devClientUrl} -- manifestUrl: ${manifestUrl} -- %O`, options);\n return devClientUrl;\n }\n\n /** Create a generic URL. */\n public constructUrl(options?: Partial<CreateURLOptions> | null): string {\n const urlComponents = this.getUrlComponents({\n ...this.defaults,\n ...options,\n });\n const url = joinUrlComponents(urlComponents);\n debug(`URL: ${url}`);\n return url;\n }\n\n /** Get the URL components from the Ngrok server URL. */\n private getTunnelUrlComponents(options: Pick<CreateURLOptions, 'scheme'>): UrlComponents | null {\n const tunnelUrl = this.bundlerInfo.getTunnelUrl?.();\n if (!tunnelUrl) {\n return null;\n }\n const parsed = new URL(tunnelUrl);\n return {\n port: parsed.port,\n hostname: parsed.hostname,\n protocol: options.scheme ?? 'http',\n };\n }\n\n private getUrlComponents(options: CreateURLOptions): UrlComponents {\n // Proxy comes first.\n const proxyURL = getProxyUrl();\n if (proxyURL) {\n return getUrlComponentsFromProxyUrl(options, proxyURL);\n }\n\n // Ngrok.\n if (options.hostType === 'tunnel') {\n const components = this.getTunnelUrlComponents(options);\n if (components) {\n return components;\n }\n Log.warn('Tunnel URL not found (it might not be ready yet), falling back to LAN URL.');\n } else if (options.hostType === 'localhost' && !options.hostname) {\n options.hostname = 'localhost';\n }\n\n return {\n hostname: getDefaultHostname(options),\n port: this.bundlerInfo.port.toString(),\n protocol: options.scheme ?? 'http',\n };\n }\n}\n\nfunction getUrlComponentsFromProxyUrl(\n options: Pick<CreateURLOptions, 'scheme'>,\n url: string\n): UrlComponents {\n const parsedProxyUrl = new URL(url);\n let protocol = options.scheme ?? 'http';\n if (parsedProxyUrl.protocol === 'https:') {\n if (protocol === 'http') {\n protocol = 'https';\n }\n if (!parsedProxyUrl.port) {\n parsedProxyUrl.port = '443';\n }\n }\n return {\n port: parsedProxyUrl.port,\n hostname: parsedProxyUrl.hostname,\n protocol,\n };\n}\n\nfunction getDefaultHostname(options: Pick<CreateURLOptions, 'hostname'>) {\n // TODO: Drop REACT_NATIVE_PACKAGER_HOSTNAME\n if (process.env.REACT_NATIVE_PACKAGER_HOSTNAME) {\n return process.env.REACT_NATIVE_PACKAGER_HOSTNAME.trim();\n } else if (options.hostname === 'localhost') {\n // Restrict the use of `localhost`\n // TODO: Note why we do this.\n return '127.0.0.1';\n }\n\n return options.hostname || getIpAddress();\n}\n\nfunction joinUrlComponents({ protocol, hostname, port }: Partial<UrlComponents>): string {\n assert(hostname, 'hostname cannot be inferred.');\n // Android HMR breaks without this port 80.\n // This is because Android React Native WebSocket implementation is not spec compliant and fails without a port:\n // `E unknown:ReactNative: java.lang.IllegalArgumentException: Invalid URL port: \"-1\"`\n // Invoked first in `metro-runtime/src/modules/HMRClient.js`\n const validPort = port || '80';\n const validProtocol = protocol ? `${protocol}://` : '';\n\n return `${validProtocol}${hostname}:${validPort}`;\n}\n\n/** @deprecated */\nfunction getProxyUrl(): string | undefined {\n return process.env.EXPO_PACKAGER_PROXY_URL;\n}\n\n// TODO: Drop the undocumented env variables:\n// REACT_NATIVE_PACKAGER_HOSTNAME\n// EXPO_PACKAGER_PROXY_URL\n"],"names":["Log","debug","require","UrlCreator","constructor","defaults","bundlerInfo","constructLoadingUrl","options","platform","url","URL","constructUrl","scheme","search","URLSearchParams","toString","loadingUrl","constructDevClientUrl","protocol","includes","toLowerCase","manifestUrl","devClientUrl","encodeURIComponent","urlComponents","getUrlComponents","joinUrlComponents","getTunnelUrlComponents","tunnelUrl","getTunnelUrl","parsed","port","hostname","proxyURL","getProxyUrl","getUrlComponentsFromProxyUrl","hostType","components","warn","getDefaultHostname","parsedProxyUrl","process","env","REACT_NATIVE_PACKAGER_HOSTNAME","trim","getIpAddress","assert","validPort","validProtocol","EXPO_PACKAGER_PROXY_URL"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/start/server/UrlCreator.ts"],"sourcesContent":["import assert from 'assert';\nimport { URL } from 'url';\n\nimport * as Log from '../../log';\nimport { env } from '../../utils/env';\nimport { getIpAddress } from '../../utils/ip';\n\nconst debug = require('debug')('expo:start:server:urlCreator') as typeof console.log;\n\nexport interface CreateURLOptions {\n /** URL scheme to use when opening apps in custom runtimes. */\n scheme?: string | null;\n /** Type of dev server host to use. */\n hostType?: 'localhost' | 'lan' | 'tunnel';\n /** Requested hostname. */\n hostname?: string | null;\n}\n\ninterface UrlComponents {\n port: string;\n hostname: string;\n protocol: string;\n}\nexport class UrlCreator {\n constructor(\n private defaults: CreateURLOptions | undefined,\n private bundlerInfo: { port: number; getTunnelUrl?: () => string | null }\n ) {}\n\n /**\n * @returns URL like `http://localhost:19000/_expo/loading?platform=ios`\n */\n public constructLoadingUrl(options: CreateURLOptions, platform: string): string {\n const url = new URL('_expo/loading', this.constructUrl({ scheme: 'http', ...options }));\n url.search = new URLSearchParams({ platform }).toString();\n const loadingUrl = url.toString();\n debug(`Loading URL: ${loadingUrl}`);\n return loadingUrl;\n }\n\n /** Create a URI for launching in a native dev client. Returns `null` when no `scheme` can be resolved. */\n public constructDevClientUrl(options?: CreateURLOptions): null | string {\n const protocol = options?.scheme || this.defaults?.scheme;\n\n if (\n !protocol ||\n // Prohibit the use of http(s) in dev client URIs since they'll never be valid.\n ['http', 'https'].includes(protocol.toLowerCase())\n ) {\n return null;\n }\n\n const manifestUrl = this.constructUrl({ ...options, scheme: 'http' });\n const devClientUrl = `${protocol}://expo-development-client/?url=${encodeURIComponent(\n manifestUrl\n )}`;\n debug(`Dev client URL: ${devClientUrl} -- manifestUrl: ${manifestUrl} -- %O`, options);\n return devClientUrl;\n }\n\n /** Create a generic URL. */\n public constructUrl(options?: Partial<CreateURLOptions> | null): string {\n const urlComponents = this.getUrlComponents({\n ...this.defaults,\n ...options,\n });\n const url = joinUrlComponents(urlComponents);\n debug(`URL: ${url}`);\n return url;\n }\n\n /** Get the URL components from the Ngrok server URL. */\n private getTunnelUrlComponents(options: Pick<CreateURLOptions, 'scheme'>): UrlComponents | null {\n const tunnelUrl = this.bundlerInfo.getTunnelUrl?.();\n if (!tunnelUrl) {\n return null;\n }\n const parsed = new URL(tunnelUrl);\n return {\n port: parsed.port,\n hostname: parsed.hostname,\n protocol: options.scheme ?? 'http',\n };\n }\n\n private getUrlComponents(options: CreateURLOptions): UrlComponents {\n // Proxy comes first.\n const proxyURL = getProxyUrl();\n if (proxyURL) {\n return getUrlComponentsFromProxyUrl(options, proxyURL);\n }\n\n // Ngrok.\n if (options.hostType === 'tunnel') {\n const components = this.getTunnelUrlComponents(options);\n if (components) {\n return components;\n }\n Log.warn('Tunnel URL not found (it might not be ready yet), falling back to LAN URL.');\n } else if (options.hostType === 'localhost' && !options.hostname) {\n options.hostname = 'localhost';\n }\n\n return {\n hostname: getDefaultHostname(options),\n port: this.bundlerInfo.port.toString(),\n protocol: options.scheme ?? 'http',\n };\n }\n}\n\nfunction getUrlComponentsFromProxyUrl(\n options: Pick<CreateURLOptions, 'scheme'>,\n url: string\n): UrlComponents {\n const parsedProxyUrl = new URL(url);\n let protocol = options.scheme ?? 'http';\n if (parsedProxyUrl.protocol === 'https:') {\n if (protocol === 'http') {\n protocol = 'https';\n }\n if (!parsedProxyUrl.port) {\n parsedProxyUrl.port = '443';\n }\n }\n return {\n port: parsedProxyUrl.port,\n hostname: parsedProxyUrl.hostname,\n protocol,\n };\n}\n\nfunction getDefaultHostname(options: Pick<CreateURLOptions, 'hostname'>) {\n // TODO: Drop REACT_NATIVE_PACKAGER_HOSTNAME\n if (process.env.REACT_NATIVE_PACKAGER_HOSTNAME) {\n return process.env.REACT_NATIVE_PACKAGER_HOSTNAME.trim();\n } else if (options.hostname === 'localhost') {\n // Restrict the use of `localhost`\n // TODO: Note why we do this.\n return '127.0.0.1';\n }\n\n return options.hostname || getIpAddress();\n}\n\nfunction joinUrlComponents({ protocol, hostname, port }: Partial<UrlComponents>): string {\n assert(hostname, 'hostname cannot be inferred.');\n // Android HMR breaks without this port 80.\n // This is because Android React Native WebSocket implementation is not spec compliant and fails without a port:\n // `E unknown:ReactNative: java.lang.IllegalArgumentException: Invalid URL port: \"-1\"`\n // Invoked first in `metro-runtime/src/modules/HMRClient.js`\n const validPort = env.EXPO_NO_DEFAULT_PORT ? port : port || '80';\n const validProtocol = protocol ? `${protocol}://` : '';\n\n let url = `${validProtocol}${hostname}`;\n\n if (validPort) {\n url += `:${validPort}`;\n }\n\n return url;\n}\n\n/** @deprecated */\nfunction getProxyUrl(): string | undefined {\n return process.env.EXPO_PACKAGER_PROXY_URL;\n}\n\n// TODO: Drop the undocumented env variables:\n// REACT_NATIVE_PACKAGER_HOSTNAME\n// EXPO_PACKAGER_PROXY_URL\n"],"names":["Log","debug","require","UrlCreator","constructor","defaults","bundlerInfo","constructLoadingUrl","options","platform","url","URL","constructUrl","scheme","search","URLSearchParams","toString","loadingUrl","constructDevClientUrl","protocol","includes","toLowerCase","manifestUrl","devClientUrl","encodeURIComponent","urlComponents","getUrlComponents","joinUrlComponents","getTunnelUrlComponents","tunnelUrl","getTunnelUrl","parsed","port","hostname","proxyURL","getProxyUrl","getUrlComponentsFromProxyUrl","hostType","components","warn","getDefaultHostname","parsedProxyUrl","process","env","REACT_NATIVE_PACKAGER_HOSTNAME","trim","getIpAddress","assert","validPort","EXPO_NO_DEFAULT_PORT","validProtocol","EXPO_PACKAGER_PROXY_URL"],"mappings":"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"}
@@ -128,7 +128,7 @@ async function createHostInfoAsync() {
128
128
  host: await _userSettings.default.getAnonymousIdentifierAsync(),
129
129
  server: "expo",
130
130
  // Defined in the build step
131
- serverVersion: "0.2.6",
131
+ serverVersion: "0.2.7",
132
132
  serverDriver: _manifestMiddleware.DEVELOPER_TOOL,
133
133
  serverOS: _os.default.platform(),
134
134
  serverOSVersion: _os.default.release()
@@ -8,8 +8,8 @@ var _chalk = _interopRequireDefault(require("chalk"));
8
8
  var Log = _interopRequireWildcard(require("../log"));
9
9
  var _getDevClientProperties = _interopRequireDefault(require("../utils/analytics/getDevClientProperties"));
10
10
  var _rudderstackClient = require("../utils/analytics/rudderstackClient");
11
- var _env = require("../utils/env");
12
11
  var _exit = require("../utils/exit");
12
+ var _interactive = require("../utils/interactive");
13
13
  var _profile = require("../utils/profile");
14
14
  var _validateDependenciesVersions = require("./doctor/dependencies/validateDependenciesVersions");
15
15
  var _typeScriptProjectPrerequisite = require("./doctor/typescript/TypeScriptProjectPrerequisite");
@@ -110,13 +110,13 @@ async function startAsync(projectRoot, options, settings) {
110
110
  }
111
111
  // Some tracking thing
112
112
  if (options.devClient) {
113
- track(projectRoot, exp);
113
+ await trackAsync(projectRoot, exp);
114
114
  }
115
115
  await (0, _profile).profile(devServerManager.startAsync.bind(devServerManager))(startOptions);
116
116
  // Open project on devices.
117
117
  await (0, _profile).profile(_openPlatforms.openPlatformsAsync)(devServerManager, options);
118
118
  // Present the Terminal UI.
119
- if (!_env.env.CI) {
119
+ if ((0, _interactive).isInteractive()) {
120
120
  var _platforms;
121
121
  await (0, _profile).profile(_startInterface.startInterfaceAsync)(devServerManager, {
122
122
  platforms: (_platforms = exp.platforms) != null ? _platforms : [
@@ -135,15 +135,15 @@ async function startAsync(projectRoot, options, settings) {
135
135
  }
136
136
  // Final note about closing the server.
137
137
  const logLocation = settings.webOnly ? "in the browser console" : "below";
138
- Log.log(_chalk.default`Logs for your project will appear ${logLocation}.${_env.env.CI ? "" : _chalk.default.dim(` Press Ctrl+C to exit.`)}`);
138
+ Log.log(_chalk.default`Logs for your project will appear ${logLocation}.${(0, _interactive).isInteractive() ? _chalk.default.dim(` Press Ctrl+C to exit.`) : ""}`);
139
139
  }
140
- function track(projectRoot, exp) {
141
- (0, _rudderstackClient).logEvent("dev client start command", {
140
+ async function trackAsync(projectRoot, exp) {
141
+ await (0, _rudderstackClient).logEventAsync("dev client start command", {
142
142
  status: "started",
143
143
  ...(0, _getDevClientProperties).default(projectRoot, exp)
144
144
  });
145
- (0, _exit).installExitHooks(()=>{
146
- (0, _rudderstackClient).logEvent("dev client start command", {
145
+ (0, _exit).installExitHooks(async ()=>{
146
+ await (0, _rudderstackClient).logEventAsync("dev client start command", {
147
147
  status: "finished",
148
148
  ...(0, _getDevClientProperties).default(projectRoot, exp)
149
149
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/start/startAsync.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport chalk from 'chalk';\n\nimport * as Log from '../log';\nimport getDevClientProperties from '../utils/analytics/getDevClientProperties';\nimport { logEvent } from '../utils/analytics/rudderstackClient';\nimport { env } from '../utils/env';\nimport { installExitHooks } from '../utils/exit';\nimport { profile } from '../utils/profile';\nimport { validateDependenciesVersionsAsync } from './doctor/dependencies/validateDependenciesVersions';\nimport { TypeScriptProjectPrerequisite } from './doctor/typescript/TypeScriptProjectPrerequisite';\nimport { WebSupportProjectPrerequisite } from './doctor/web/WebSupportProjectPrerequisite';\nimport { startInterfaceAsync } from './interface/startInterface';\nimport { Options, resolvePortsAsync } from './resolveOptions';\nimport { BundlerStartOptions } from './server/BundlerDevServer';\nimport { DevServerManager, MultiBundlerStartOptions } from './server/DevServerManager';\nimport { openPlatformsAsync } from './server/openPlatforms';\nimport { getPlatformBundlers, PlatformBundlers } from './server/platformBundlers';\n\nasync function getMultiBundlerStartOptions(\n projectRoot: string,\n { forceManifestType, ...options }: Options,\n settings: { webOnly?: boolean },\n platformBundlers: PlatformBundlers\n): Promise<[BundlerStartOptions, MultiBundlerStartOptions]> {\n const commonOptions: BundlerStartOptions = {\n mode: options.dev ? 'development' : 'production',\n devClient: options.devClient,\n forceManifestType,\n privateKeyPath: options.privateKeyPath ?? undefined,\n https: options.https,\n maxWorkers: options.maxWorkers,\n resetDevServer: options.clear,\n minify: options.minify,\n location: {\n hostType: options.host,\n scheme: options.scheme,\n },\n };\n const multiBundlerSettings = await resolvePortsAsync(projectRoot, options, settings);\n\n const optionalBundlers: Partial<PlatformBundlers> = { ...platformBundlers };\n // In the default case, we don't want to start multiple bundlers since this is\n // a bit slower. Our priority (for legacy) is native platforms.\n if (!options.web) {\n delete optionalBundlers['web'];\n }\n\n const bundlers = [...new Set(Object.values(optionalBundlers))];\n const multiBundlerStartOptions = bundlers.map((bundler) => {\n const port =\n bundler === 'webpack' ? multiBundlerSettings.webpackPort : multiBundlerSettings.metroPort;\n return {\n type: bundler,\n options: {\n ...commonOptions,\n port,\n },\n };\n });\n\n return [commonOptions, multiBundlerStartOptions];\n}\n\nexport async function startAsync(\n projectRoot: string,\n options: Options,\n settings: { webOnly?: boolean }\n) {\n Log.log(chalk.gray(`Starting project at ${projectRoot}`));\n\n const { exp, pkg } = profile(getConfig)(projectRoot);\n\n const platformBundlers = getPlatformBundlers(exp);\n\n if (!options.forceManifestType) {\n const easUpdatesUrlRegex = /^https:\\/\\/(staging-)?u\\.expo\\.dev/;\n const isEasUpdatesUrl = exp.updates?.url ? easUpdatesUrlRegex.test(exp.updates.url) : false;\n options.forceManifestType = isEasUpdatesUrl ? 'expo-updates' : 'classic';\n }\n\n const [defaultOptions, startOptions] = await getMultiBundlerStartOptions(\n projectRoot,\n options,\n settings,\n platformBundlers\n );\n\n const devServerManager = new DevServerManager(projectRoot, defaultOptions);\n\n // Validations\n\n if (options.web || settings.webOnly) {\n await devServerManager.ensureProjectPrerequisiteAsync(WebSupportProjectPrerequisite);\n }\n\n await devServerManager.ensureProjectPrerequisiteAsync(TypeScriptProjectPrerequisite);\n\n if (!settings.webOnly && !options.devClient) {\n await profile(validateDependenciesVersionsAsync)(projectRoot, exp, pkg);\n }\n\n // Some tracking thing\n\n if (options.devClient) {\n track(projectRoot, exp);\n }\n\n await profile(devServerManager.startAsync.bind(devServerManager))(startOptions);\n\n // Open project on devices.\n await profile(openPlatformsAsync)(devServerManager, options);\n\n // Present the Terminal UI.\n if (!env.CI) {\n await profile(startInterfaceAsync)(devServerManager, {\n platforms: exp.platforms ?? ['ios', 'android', 'web'],\n });\n } else {\n // Display the server location in CI...\n const url = devServerManager.getDefaultDevServer()?.getDevServerUrl();\n if (url) {\n Log.log(chalk`Waiting on {underline ${url}}`);\n }\n }\n\n // Final note about closing the server.\n const logLocation = settings.webOnly ? 'in the browser console' : 'below';\n Log.log(\n chalk`Logs for your project will appear ${logLocation}.${\n env.CI ? '' : chalk.dim(` Press Ctrl+C to exit.`)\n }`\n );\n}\n\nfunction track(projectRoot: string, exp: ExpoConfig) {\n logEvent('dev client start command', {\n status: 'started',\n ...getDevClientProperties(projectRoot, exp),\n });\n installExitHooks(() => {\n logEvent('dev client start command', {\n status: 'finished',\n ...getDevClientProperties(projectRoot, exp),\n });\n // UnifiedAnalytics.flush();\n });\n}\n"],"names":["startAsync","Log","getMultiBundlerStartOptions","projectRoot","forceManifestType","options","settings","platformBundlers","commonOptions","mode","dev","devClient","privateKeyPath","undefined","https","maxWorkers","resetDevServer","clear","minify","location","hostType","host","scheme","multiBundlerSettings","resolvePortsAsync","optionalBundlers","web","bundlers","Set","Object","values","multiBundlerStartOptions","map","bundler","port","webpackPort","metroPort","type","log","chalk","gray","exp","pkg","profile","getConfig","getPlatformBundlers","easUpdatesUrlRegex","isEasUpdatesUrl","updates","url","test","defaultOptions","startOptions","devServerManager","DevServerManager","webOnly","ensureProjectPrerequisiteAsync","WebSupportProjectPrerequisite","TypeScriptProjectPrerequisite","validateDependenciesVersionsAsync","track","bind","openPlatformsAsync","env","CI","startInterfaceAsync","platforms","getDefaultDevServer","getDevServerUrl","logLocation","dim","logEvent","status","getDevClientProperties","installExitHooks"],"mappings":"AAAA;;;;QAgEsBA,UAAU,GAAVA,UAAU;AAhEM,IAAA,OAAc,WAAd,cAAc,CAAA;AAClC,IAAA,MAAO,kCAAP,OAAO,EAAA;AAEbC,IAAAA,GAAG,mCAAM,QAAQ,EAAd;AACoB,IAAA,uBAA2C,kCAA3C,2CAA2C,EAAA;AACrD,IAAA,kBAAsC,WAAtC,sCAAsC,CAAA;AAC3C,IAAA,IAAc,WAAd,cAAc,CAAA;AACD,IAAA,KAAe,WAAf,eAAe,CAAA;AACxB,IAAA,QAAkB,WAAlB,kBAAkB,CAAA;AACQ,IAAA,6BAAoD,WAApD,oDAAoD,CAAA;AACxD,IAAA,8BAAmD,WAAnD,mDAAmD,CAAA;AACnD,IAAA,8BAA4C,WAA5C,4CAA4C,CAAA;AACtD,IAAA,eAA4B,WAA5B,4BAA4B,CAAA;AACrB,IAAA,eAAkB,WAAlB,kBAAkB,CAAA;AAEF,IAAA,iBAA2B,WAA3B,2BAA2B,CAAA;AACnD,IAAA,cAAwB,WAAxB,wBAAwB,CAAA;AACL,IAAA,iBAA2B,WAA3B,2BAA2B,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEjF,eAAeC,2BAA2B,CACxCC,WAAmB,EACnB,EAAEC,iBAAiB,CAAA,EAAE,GAAGC,OAAO,EAAW,EAC1CC,QAA+B,EAC/BC,gBAAkC,EACwB;QAKxCF,eAAsB;IAJxC,MAAMG,aAAa,GAAwB;QACzCC,IAAI,EAAEJ,OAAO,CAACK,GAAG,GAAG,aAAa,GAAG,YAAY;QAChDC,SAAS,EAAEN,OAAO,CAACM,SAAS;QAC5BP,iBAAiB;QACjBQ,cAAc,EAAEP,CAAAA,eAAsB,GAAtBA,OAAO,CAACO,cAAc,YAAtBP,eAAsB,GAAIQ,SAAS;QACnDC,KAAK,EAAET,OAAO,CAACS,KAAK;QACpBC,UAAU,EAAEV,OAAO,CAACU,UAAU;QAC9BC,cAAc,EAAEX,OAAO,CAACY,KAAK;QAC7BC,MAAM,EAAEb,OAAO,CAACa,MAAM;QACtBC,QAAQ,EAAE;YACRC,QAAQ,EAAEf,OAAO,CAACgB,IAAI;YACtBC,MAAM,EAAEjB,OAAO,CAACiB,MAAM;SACvB;KACF,AAAC;IACF,MAAMC,oBAAoB,GAAG,MAAMC,CAAAA,GAAAA,eAAiB,AAAgC,CAAA,kBAAhC,CAACrB,WAAW,EAAEE,OAAO,EAAEC,QAAQ,CAAC,AAAC;IAErF,MAAMmB,gBAAgB,GAA8B;QAAE,GAAGlB,gBAAgB;KAAE,AAAC;IAC5E,8EAA8E;IAC9E,+DAA+D;IAC/D,IAAI,CAACF,OAAO,CAACqB,GAAG,EAAE;QAChB,OAAOD,gBAAgB,CAAC,KAAK,CAAC,CAAC;KAChC;IAED,MAAME,QAAQ,GAAG;WAAI,IAAIC,GAAG,CAACC,MAAM,CAACC,MAAM,CAACL,gBAAgB,CAAC,CAAC;KAAC,AAAC;IAC/D,MAAMM,wBAAwB,GAAGJ,QAAQ,CAACK,GAAG,CAAC,CAACC,OAAO,GAAK;QACzD,MAAMC,IAAI,GACRD,OAAO,KAAK,SAAS,GAAGV,oBAAoB,CAACY,WAAW,GAAGZ,oBAAoB,CAACa,SAAS,AAAC;QAC5F,OAAO;YACLC,IAAI,EAAEJ,OAAO;YACb5B,OAAO,EAAE;gBACP,GAAGG,aAAa;gBAChB0B,IAAI;aACL;SACF,CAAC;KACH,CAAC,AAAC;IAEH,OAAO;QAAC1B,aAAa;QAAEuB,wBAAwB;KAAC,CAAC;CAClD;AAEM,eAAe/B,UAAU,CAC9BG,WAAmB,EACnBE,OAAgB,EAChBC,QAA+B,EAC/B;IACAL,GAAG,CAACqC,GAAG,CAACC,MAAK,QAAA,CAACC,IAAI,CAAC,CAAC,oBAAoB,EAAErC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1D,MAAM,EAAEsC,GAAG,CAAA,EAAEC,GAAG,CAAA,EAAE,GAAGC,CAAAA,GAAAA,QAAO,AAAW,CAAA,QAAX,CAACC,OAAS,UAAA,CAAC,CAACzC,WAAW,CAAC,AAAC;IAErD,MAAMI,gBAAgB,GAAGsC,CAAAA,GAAAA,iBAAmB,AAAK,CAAA,oBAAL,CAACJ,GAAG,CAAC,AAAC;IAElD,IAAI,CAACpC,OAAO,CAACD,iBAAiB,EAAE;YAENqC,GAAW;QADnC,MAAMK,kBAAkB,uCAAuC,AAAC;QAChE,MAAMC,eAAe,GAAGN,CAAAA,CAAAA,GAAW,GAAXA,GAAG,CAACO,OAAO,SAAK,GAAhBP,KAAAA,CAAgB,GAAhBA,GAAW,CAAEQ,GAAG,CAAA,GAAGH,kBAAkB,CAACI,IAAI,CAACT,GAAG,CAACO,OAAO,CAACC,GAAG,CAAC,GAAG,KAAK,AAAC;QAC5F5C,OAAO,CAACD,iBAAiB,GAAG2C,eAAe,GAAG,cAAc,GAAG,SAAS,CAAC;KAC1E;IAED,MAAM,CAACI,cAAc,EAAEC,YAAY,CAAC,GAAG,MAAMlD,2BAA2B,CACtEC,WAAW,EACXE,OAAO,EACPC,QAAQ,EACRC,gBAAgB,CACjB,AAAC;IAEF,MAAM8C,gBAAgB,GAAG,IAAIC,iBAAgB,iBAAA,CAACnD,WAAW,EAAEgD,cAAc,CAAC,AAAC;IAE3E,cAAc;IAEd,IAAI9C,OAAO,CAACqB,GAAG,IAAIpB,QAAQ,CAACiD,OAAO,EAAE;QACnC,MAAMF,gBAAgB,CAACG,8BAA8B,CAACC,8BAA6B,8BAAA,CAAC,CAAC;KACtF;IAED,MAAMJ,gBAAgB,CAACG,8BAA8B,CAACE,8BAA6B,8BAAA,CAAC,CAAC;IAErF,IAAI,CAACpD,QAAQ,CAACiD,OAAO,IAAI,CAAClD,OAAO,CAACM,SAAS,EAAE;QAC3C,MAAMgC,CAAAA,GAAAA,QAAO,AAAmC,CAAA,QAAnC,CAACgB,6BAAiC,kCAAA,CAAC,CAACxD,WAAW,EAAEsC,GAAG,EAAEC,GAAG,CAAC,CAAC;KACzE;IAED,sBAAsB;IAEtB,IAAIrC,OAAO,CAACM,SAAS,EAAE;QACrBiD,KAAK,CAACzD,WAAW,EAAEsC,GAAG,CAAC,CAAC;KACzB;IAED,MAAME,CAAAA,GAAAA,QAAO,AAAoD,CAAA,QAApD,CAACU,gBAAgB,CAACrD,UAAU,CAAC6D,IAAI,CAACR,gBAAgB,CAAC,CAAC,CAACD,YAAY,CAAC,CAAC;IAEhF,2BAA2B;IAC3B,MAAMT,CAAAA,GAAAA,QAAO,AAAoB,CAAA,QAApB,CAACmB,cAAkB,mBAAA,CAAC,CAACT,gBAAgB,EAAEhD,OAAO,CAAC,CAAC;IAE7D,2BAA2B;IAC3B,IAAI,CAAC0D,IAAG,IAAA,CAACC,EAAE,EAAE;YAEEvB,UAAa;QAD1B,MAAME,CAAAA,GAAAA,QAAO,AAAqB,CAAA,QAArB,CAACsB,eAAmB,oBAAA,CAAC,CAACZ,gBAAgB,EAAE;YACnDa,SAAS,EAAEzB,CAAAA,UAAa,GAAbA,GAAG,CAACyB,SAAS,YAAbzB,UAAa,GAAI;gBAAC,KAAK;gBAAE,SAAS;gBAAE,KAAK;aAAC;SACtD,CAAC,CAAC;KACJ,MAAM;YAEOY,IAAsC;QADlD,uCAAuC;QACvC,MAAMJ,GAAG,GAAGI,CAAAA,IAAsC,GAAtCA,gBAAgB,CAACc,mBAAmB,EAAE,SAAiB,GAAvDd,KAAAA,CAAuD,GAAvDA,IAAsC,CAAEe,eAAe,EAAE,AAAC;QACtE,IAAInB,GAAG,EAAE;YACPhD,GAAG,CAACqC,GAAG,CAACC,MAAK,QAAA,CAAC,sBAAsB,EAAEU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC/C;KACF;IAED,uCAAuC;IACvC,MAAMoB,WAAW,GAAG/D,QAAQ,CAACiD,OAAO,GAAG,wBAAwB,GAAG,OAAO,AAAC;IAC1EtD,GAAG,CAACqC,GAAG,CACLC,MAAK,QAAA,CAAC,kCAAkC,EAAE8B,WAAW,CAAC,CAAC,EACrDN,IAAG,IAAA,CAACC,EAAE,GAAG,EAAE,GAAGzB,MAAK,QAAA,CAAC+B,GAAG,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAClD,CAAC,CACH,CAAC;CACH;AAED,SAASV,KAAK,CAACzD,WAAmB,EAAEsC,GAAe,EAAE;IACnD8B,CAAAA,GAAAA,kBAAQ,AAGN,CAAA,SAHM,CAAC,0BAA0B,EAAE;QACnCC,MAAM,EAAE,SAAS;QACjB,GAAGC,CAAAA,GAAAA,uBAAsB,AAAkB,CAAA,QAAlB,CAACtE,WAAW,EAAEsC,GAAG,CAAC;KAC5C,CAAC,CAAC;IACHiC,CAAAA,GAAAA,KAAgB,AAMd,CAAA,iBANc,CAAC,IAAM;QACrBH,CAAAA,GAAAA,kBAAQ,AAGN,CAAA,SAHM,CAAC,0BAA0B,EAAE;YACnCC,MAAM,EAAE,UAAU;YAClB,GAAGC,CAAAA,GAAAA,uBAAsB,AAAkB,CAAA,QAAlB,CAACtE,WAAW,EAAEsC,GAAG,CAAC;SAC5C,CAAC,CAAC;IACH,4BAA4B;KAC7B,CAAC,CAAC;CACJ"}
1
+ {"version":3,"sources":["../../../src/start/startAsync.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport chalk from 'chalk';\n\nimport * as Log from '../log';\nimport getDevClientProperties from '../utils/analytics/getDevClientProperties';\nimport { logEventAsync } from '../utils/analytics/rudderstackClient';\nimport { installExitHooks } from '../utils/exit';\nimport { isInteractive } from '../utils/interactive';\nimport { profile } from '../utils/profile';\nimport { validateDependenciesVersionsAsync } from './doctor/dependencies/validateDependenciesVersions';\nimport { TypeScriptProjectPrerequisite } from './doctor/typescript/TypeScriptProjectPrerequisite';\nimport { WebSupportProjectPrerequisite } from './doctor/web/WebSupportProjectPrerequisite';\nimport { startInterfaceAsync } from './interface/startInterface';\nimport { Options, resolvePortsAsync } from './resolveOptions';\nimport { BundlerStartOptions } from './server/BundlerDevServer';\nimport { DevServerManager, MultiBundlerStartOptions } from './server/DevServerManager';\nimport { openPlatformsAsync } from './server/openPlatforms';\nimport { getPlatformBundlers, PlatformBundlers } from './server/platformBundlers';\n\nasync function getMultiBundlerStartOptions(\n projectRoot: string,\n { forceManifestType, ...options }: Options,\n settings: { webOnly?: boolean },\n platformBundlers: PlatformBundlers\n): Promise<[BundlerStartOptions, MultiBundlerStartOptions]> {\n const commonOptions: BundlerStartOptions = {\n mode: options.dev ? 'development' : 'production',\n devClient: options.devClient,\n forceManifestType,\n privateKeyPath: options.privateKeyPath ?? undefined,\n https: options.https,\n maxWorkers: options.maxWorkers,\n resetDevServer: options.clear,\n minify: options.minify,\n location: {\n hostType: options.host,\n scheme: options.scheme,\n },\n };\n const multiBundlerSettings = await resolvePortsAsync(projectRoot, options, settings);\n\n const optionalBundlers: Partial<PlatformBundlers> = { ...platformBundlers };\n // In the default case, we don't want to start multiple bundlers since this is\n // a bit slower. Our priority (for legacy) is native platforms.\n if (!options.web) {\n delete optionalBundlers['web'];\n }\n\n const bundlers = [...new Set(Object.values(optionalBundlers))];\n const multiBundlerStartOptions = bundlers.map((bundler) => {\n const port =\n bundler === 'webpack' ? multiBundlerSettings.webpackPort : multiBundlerSettings.metroPort;\n return {\n type: bundler,\n options: {\n ...commonOptions,\n port,\n },\n };\n });\n\n return [commonOptions, multiBundlerStartOptions];\n}\n\nexport async function startAsync(\n projectRoot: string,\n options: Options,\n settings: { webOnly?: boolean }\n) {\n Log.log(chalk.gray(`Starting project at ${projectRoot}`));\n\n const { exp, pkg } = profile(getConfig)(projectRoot);\n\n const platformBundlers = getPlatformBundlers(exp);\n\n if (!options.forceManifestType) {\n const easUpdatesUrlRegex = /^https:\\/\\/(staging-)?u\\.expo\\.dev/;\n const isEasUpdatesUrl = exp.updates?.url ? easUpdatesUrlRegex.test(exp.updates.url) : false;\n options.forceManifestType = isEasUpdatesUrl ? 'expo-updates' : 'classic';\n }\n\n const [defaultOptions, startOptions] = await getMultiBundlerStartOptions(\n projectRoot,\n options,\n settings,\n platformBundlers\n );\n\n const devServerManager = new DevServerManager(projectRoot, defaultOptions);\n\n // Validations\n\n if (options.web || settings.webOnly) {\n await devServerManager.ensureProjectPrerequisiteAsync(WebSupportProjectPrerequisite);\n }\n\n await devServerManager.ensureProjectPrerequisiteAsync(TypeScriptProjectPrerequisite);\n\n if (!settings.webOnly && !options.devClient) {\n await profile(validateDependenciesVersionsAsync)(projectRoot, exp, pkg);\n }\n\n // Some tracking thing\n\n if (options.devClient) {\n await trackAsync(projectRoot, exp);\n }\n\n await profile(devServerManager.startAsync.bind(devServerManager))(startOptions);\n\n // Open project on devices.\n await profile(openPlatformsAsync)(devServerManager, options);\n\n // Present the Terminal UI.\n if (isInteractive()) {\n await profile(startInterfaceAsync)(devServerManager, {\n platforms: exp.platforms ?? ['ios', 'android', 'web'],\n });\n } else {\n // Display the server location in CI...\n const url = devServerManager.getDefaultDevServer()?.getDevServerUrl();\n if (url) {\n Log.log(chalk`Waiting on {underline ${url}}`);\n }\n }\n\n // Final note about closing the server.\n const logLocation = settings.webOnly ? 'in the browser console' : 'below';\n Log.log(\n chalk`Logs for your project will appear ${logLocation}.${\n isInteractive() ? chalk.dim(` Press Ctrl+C to exit.`) : ''\n }`\n );\n}\n\nasync function trackAsync(projectRoot: string, exp: ExpoConfig): Promise<void> {\n await logEventAsync('dev client start command', {\n status: 'started',\n ...getDevClientProperties(projectRoot, exp),\n });\n installExitHooks(async () => {\n await logEventAsync('dev client start command', {\n status: 'finished',\n ...getDevClientProperties(projectRoot, exp),\n });\n // UnifiedAnalytics.flush();\n });\n}\n"],"names":["startAsync","Log","getMultiBundlerStartOptions","projectRoot","forceManifestType","options","settings","platformBundlers","commonOptions","mode","dev","devClient","privateKeyPath","undefined","https","maxWorkers","resetDevServer","clear","minify","location","hostType","host","scheme","multiBundlerSettings","resolvePortsAsync","optionalBundlers","web","bundlers","Set","Object","values","multiBundlerStartOptions","map","bundler","port","webpackPort","metroPort","type","log","chalk","gray","exp","pkg","profile","getConfig","getPlatformBundlers","easUpdatesUrlRegex","isEasUpdatesUrl","updates","url","test","defaultOptions","startOptions","devServerManager","DevServerManager","webOnly","ensureProjectPrerequisiteAsync","WebSupportProjectPrerequisite","TypeScriptProjectPrerequisite","validateDependenciesVersionsAsync","trackAsync","bind","openPlatformsAsync","isInteractive","startInterfaceAsync","platforms","getDefaultDevServer","getDevServerUrl","logLocation","dim","logEventAsync","status","getDevClientProperties","installExitHooks"],"mappings":"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"}
@@ -2,14 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
+ exports.resetInternalStateForTesting = resetInternalStateForTesting;
6
+ exports.getRudderAnalyticsClient = getRudderAnalyticsClient;
5
7
  exports.setUserDataAsync = setUserDataAsync;
6
- exports.logEvent = logEvent;
7
8
  exports.logEventAsync = logEventAsync;
8
9
  exports.getContext = getContext;
9
10
  var _rudderSdkNode = _interopRequireDefault(require("@expo/rudder-sdk-node"));
10
11
  var ciInfo = _interopRequireWildcard(require("ci-info"));
11
12
  var _os = _interopRequireDefault(require("os"));
12
- var _uuid = require("uuid");
13
13
  var _userSettings = _interopRequireDefault(require("../../api/user/UserSettings"));
14
14
  var _user = require("../../api/user/user");
15
15
  var _env = require("../env");
@@ -47,7 +47,12 @@ const PLATFORM_TO_ANALYTICS_PLATFORM = {
47
47
  let client = null;
48
48
  let identified = false;
49
49
  let identifyData = null;
50
- function getClient() {
50
+ function resetInternalStateForTesting() {
51
+ identified = false;
52
+ identifyData = null;
53
+ client = null;
54
+ }
55
+ function getRudderAnalyticsClient() {
51
56
  if (client) {
52
57
  return client;
53
58
  }
@@ -73,49 +78,30 @@ async function setUserDataAsync(userId, traits) {
73
78
  deviceId,
74
79
  traits
75
80
  };
76
- ensureIdentified();
81
+ identifyIfNotYetIdentified();
77
82
  }
78
- function logEvent(event, properties = {}) {
83
+ async function logEventAsync(event, properties = {}) {
79
84
  if (_env.env.EXPO_NO_TELEMETRY) {
80
85
  return;
81
86
  }
82
- ensureIdentified();
83
- const { userId , deviceId } = identifyData != null ? identifyData : {};
84
- const commonEventProperties = {
85
- source_version: "0.2.6",
86
- source: "expo"
87
- };
88
- const identity = {
89
- userId: userId != null ? userId : undefined,
90
- anonymousId: deviceId != null ? deviceId : (0, _uuid).v4()
91
- };
92
- getClient().track({
93
- event,
94
- properties: {
95
- ...properties,
96
- ...commonEventProperties
97
- },
98
- ...identity,
99
- context: getContext()
100
- });
101
- }
102
- async function logEventAsync(event, properties = {}) {
103
- if (_env.env.EXPO_NO_TELEMETRY) {
87
+ // this has the side effect of calling `setUserData` which fetches the user and populates identifyData
88
+ try {
89
+ await (0, _user).getUserAsync();
90
+ } catch {}
91
+ identifyIfNotYetIdentified();
92
+ if (!identifyData) {
104
93
  return;
105
94
  }
106
- await (0, _user).getUserAsync().catch(()=>null
107
- );
108
- ensureIdentified();
109
- const { userId , deviceId } = identifyData != null ? identifyData : {};
95
+ const { userId , deviceId } = identifyData;
110
96
  const commonEventProperties = {
111
- source_version: "0.2.6",
97
+ source_version: "0.2.7",
112
98
  source: "expo"
113
99
  };
114
100
  const identity = {
115
- userId: userId != null ? userId : undefined,
116
- anonymousId: deviceId != null ? deviceId : (0, _uuid).v4()
101
+ userId,
102
+ anonymousId: deviceId
117
103
  };
118
- getClient().track({
104
+ getRudderAnalyticsClient().track({
119
105
  event,
120
106
  properties: {
121
107
  ...properties,
@@ -125,11 +111,11 @@ async function logEventAsync(event, properties = {}) {
125
111
  context: getContext()
126
112
  });
127
113
  }
128
- function ensureIdentified() {
114
+ function identifyIfNotYetIdentified() {
129
115
  if (_env.env.EXPO_NO_TELEMETRY || identified || !identifyData) {
130
116
  return;
131
117
  }
132
- getClient().identify({
118
+ getRudderAnalyticsClient().identify({
133
119
  userId: identifyData.userId,
134
120
  anonymousId: identifyData.deviceId,
135
121
  traits: identifyData.traits
@@ -149,7 +135,7 @@ function getContext() {
149
135
  },
150
136
  app: {
151
137
  name: "expo",
152
- version: "0.2.6"
138
+ version: "0.2.7"
153
139
  },
154
140
  ci: ciInfo.isCI ? {
155
141
  name: ciInfo.name,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/utils/analytics/rudderstackClient.ts"],"sourcesContent":["import RudderAnalytics from '@expo/rudder-sdk-node';\nimport * as ciInfo from 'ci-info';\nimport os from 'os';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport UserSettings from '../../api/user/UserSettings';\nimport { getUserAsync } from '../../api/user/user';\nimport { env } from '../env';\n\nconst PLATFORM_TO_ANALYTICS_PLATFORM: { [platform: string]: string } = {\n darwin: 'Mac',\n win32: 'Windows',\n linux: 'Linux',\n};\n\nlet client: RudderAnalytics | null = null;\nlet identified = false;\nlet identifyData: {\n userId: string;\n deviceId: string;\n traits: Record<string, any>;\n} | null = null;\n\nfunction getClient(): RudderAnalytics {\n if (client) {\n return client;\n }\n\n client = new RudderAnalytics(\n env.EXPO_STAGING || env.EXPO_LOCAL\n ? '24TKICqYKilXM480mA7ktgVDdea'\n : '24TKR7CQAaGgIrLTgu3Fp4OdOkI', // expo unified\n 'https://cdp.expo.dev/v1/batch',\n {\n flushInterval: 300,\n }\n );\n\n // Install flush on exit...\n process.on('SIGINT', () => client?.flush?.());\n process.on('SIGTERM', () => client?.flush?.());\n\n return client;\n}\n\nexport async function setUserDataAsync(userId: string, traits: Record<string, any>): Promise<void> {\n if (env.EXPO_NO_TELEMETRY) {\n return;\n }\n\n const deviceId = await UserSettings.getAnonymousIdentifierAsync();\n\n identifyData = {\n userId,\n deviceId,\n traits,\n };\n\n ensureIdentified();\n}\n\ntype Event =\n | 'action'\n | 'Open Url on Device'\n | 'Start Project'\n | 'Serve Manifest'\n | 'Serve Expo Updates Manifest'\n | 'dev client start command'\n | 'dev client run command';\n\nexport function logEvent(event: Event, properties: Record<string, any> = {}): void {\n if (env.EXPO_NO_TELEMETRY) {\n return;\n }\n\n ensureIdentified();\n\n const { userId, deviceId } = identifyData ?? {};\n const commonEventProperties = { source_version: process.env.__EXPO_VERSION, source: 'expo' };\n\n const identity = { userId: userId ?? undefined, anonymousId: deviceId ?? uuidv4() };\n getClient().track({\n event,\n properties: { ...properties, ...commonEventProperties },\n ...identity,\n context: getContext(),\n });\n}\n\n/** Log event while ensuring the user is identified. */\nexport async function logEventAsync(\n event: Event,\n properties: Record<string, any> = {}\n): Promise<void> {\n if (env.EXPO_NO_TELEMETRY) {\n return;\n }\n\n await getUserAsync().catch(() => null);\n ensureIdentified();\n\n const { userId, deviceId } = identifyData ?? {};\n const commonEventProperties = { source_version: process.env.__EXPO_VERSION, source: 'expo' };\n\n const identity = { userId: userId ?? undefined, anonymousId: deviceId ?? uuidv4() };\n getClient().track({\n event,\n properties: { ...properties, ...commonEventProperties },\n ...identity,\n context: getContext(),\n });\n}\n\nfunction ensureIdentified(): void {\n if (env.EXPO_NO_TELEMETRY || identified || !identifyData) {\n return;\n }\n\n getClient().identify({\n userId: identifyData.userId,\n anonymousId: identifyData.deviceId,\n traits: identifyData.traits,\n });\n identified = true;\n}\n\n/** Exposed for testing only */\nexport function getContext(): Record<string, any> {\n const platform = PLATFORM_TO_ANALYTICS_PLATFORM[os.platform()] || os.platform();\n return {\n os: { name: platform, version: os.release() },\n device: { type: platform, model: platform },\n app: { name: 'expo', version: process.env.__EXPO_VERSION },\n ci: ciInfo.isCI ? { name: ciInfo.name, isPr: ciInfo.isPR } : undefined,\n };\n}\n"],"names":["setUserDataAsync","logEvent","logEventAsync","getContext","ciInfo","PLATFORM_TO_ANALYTICS_PLATFORM","darwin","win32","linux","client","identified","identifyData","getClient","RudderAnalytics","env","EXPO_STAGING","EXPO_LOCAL","flushInterval","process","on","flush","userId","traits","EXPO_NO_TELEMETRY","deviceId","UserSettings","getAnonymousIdentifierAsync","ensureIdentified","event","properties","commonEventProperties","source_version","__EXPO_VERSION","source","identity","undefined","anonymousId","uuidv4","track","context","getUserAsync","catch","identify","platform","os","name","version","release","device","type","model","app","ci","isCI","isPr","isPR"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/utils/analytics/rudderstackClient.ts"],"sourcesContent":["import RudderAnalytics from '@expo/rudder-sdk-node';\nimport * as ciInfo from 'ci-info';\nimport os from 'os';\n\nimport UserSettings from '../../api/user/UserSettings';\nimport { getUserAsync } from '../../api/user/user';\nimport { env } from '../env';\n\nconst PLATFORM_TO_ANALYTICS_PLATFORM: { [platform: string]: string } = {\n darwin: 'Mac',\n win32: 'Windows',\n linux: 'Linux',\n};\n\nlet client: RudderAnalytics | null = null;\nlet identified = false;\nlet identifyData: {\n userId: string;\n deviceId: string;\n traits: Record<string, any>;\n} | null = null;\n\nexport function resetInternalStateForTesting() {\n identified = false;\n identifyData = null;\n client = null;\n}\n\nexport function getRudderAnalyticsClient(): RudderAnalytics {\n if (client) {\n return client;\n }\n\n client = new RudderAnalytics(\n env.EXPO_STAGING || env.EXPO_LOCAL\n ? '24TKICqYKilXM480mA7ktgVDdea'\n : '24TKR7CQAaGgIrLTgu3Fp4OdOkI', // expo unified\n 'https://cdp.expo.dev/v1/batch',\n {\n flushInterval: 300,\n }\n );\n\n // Install flush on exit...\n process.on('SIGINT', () => client?.flush?.());\n process.on('SIGTERM', () => client?.flush?.());\n\n return client;\n}\n\nexport async function setUserDataAsync(userId: string, traits: Record<string, any>): Promise<void> {\n if (env.EXPO_NO_TELEMETRY) {\n return;\n }\n\n const deviceId = await UserSettings.getAnonymousIdentifierAsync();\n\n identifyData = {\n userId,\n deviceId,\n traits,\n };\n\n identifyIfNotYetIdentified();\n}\n\ntype Event =\n | 'action'\n | 'Open Url on Device'\n | 'Start Project'\n | 'Serve Manifest'\n | 'Serve Expo Updates Manifest'\n | 'dev client start command'\n | 'dev client run command';\n\n/**\n * Log an event, ensuring the user is identified before logging the event.\n **/\nexport async function logEventAsync(\n event: Event,\n properties: Record<string, any> = {}\n): Promise<void> {\n if (env.EXPO_NO_TELEMETRY) {\n return;\n }\n\n // this has the side effect of calling `setUserData` which fetches the user and populates identifyData\n try {\n await getUserAsync();\n } catch {}\n\n identifyIfNotYetIdentified();\n\n if (!identifyData) {\n return;\n }\n const { userId, deviceId } = identifyData;\n const commonEventProperties = { source_version: process.env.__EXPO_VERSION, source: 'expo' };\n\n const identity = { userId, anonymousId: deviceId };\n getRudderAnalyticsClient().track({\n event,\n properties: { ...properties, ...commonEventProperties },\n ...identity,\n context: getContext(),\n });\n}\n\nfunction identifyIfNotYetIdentified(): void {\n if (env.EXPO_NO_TELEMETRY || identified || !identifyData) {\n return;\n }\n\n getRudderAnalyticsClient().identify({\n userId: identifyData.userId,\n anonymousId: identifyData.deviceId,\n traits: identifyData.traits,\n });\n identified = true;\n}\n\n/** Exposed for testing only */\nexport function getContext(): Record<string, any> {\n const platform = PLATFORM_TO_ANALYTICS_PLATFORM[os.platform()] || os.platform();\n return {\n os: { name: platform, version: os.release() },\n device: { type: platform, model: platform },\n app: { name: 'expo', version: process.env.__EXPO_VERSION },\n ci: ciInfo.isCI ? { name: ciInfo.name, isPr: ciInfo.isPR } : undefined,\n };\n}\n"],"names":["resetInternalStateForTesting","getRudderAnalyticsClient","setUserDataAsync","logEventAsync","getContext","ciInfo","PLATFORM_TO_ANALYTICS_PLATFORM","darwin","win32","linux","client","identified","identifyData","RudderAnalytics","env","EXPO_STAGING","EXPO_LOCAL","flushInterval","process","on","flush","userId","traits","EXPO_NO_TELEMETRY","deviceId","UserSettings","getAnonymousIdentifierAsync","identifyIfNotYetIdentified","event","properties","getUserAsync","commonEventProperties","source_version","__EXPO_VERSION","source","identity","anonymousId","track","context","identify","platform","os","name","version","release","device","type","model","app","ci","isCI","isPr","isPR","undefined"],"mappings":"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"}
@@ -61,6 +61,22 @@ class Env {
61
61
  /** Higher priority `$EDIOTR` variable for indicating which editor to use when pressing `o` in the Terminal UI. */ get EXPO_EDITOR() {
62
62
  return (0, _getenv).string("EXPO_EDITOR", "");
63
63
  }
64
+ /**
65
+ * Overwrite the dev server URL, disregarding the `--port`, `--host`, `--tunnel`, `--lan`, `--localhost` arguments.
66
+ * This is useful for browser editors that require custom proxy URLs.
67
+ *
68
+ * The URL will not be used verbatim unless `EXPO_NO_DEFAULT_PORT=true` is also set,
69
+ * otherwise a `:80` port will be added for Android support.
70
+ */ get EXPO_PACKAGER_PROXY_URL() {
71
+ return (0, _getenv).string("EXPO_PACKAGER_PROXY_URL", "");
72
+ }
73
+ /**
74
+ * Disable the enforced `:80` port when using custom dev server URLs.
75
+ * This can break the incomplete Android WebSocket implementation but allows
76
+ * `EXPO_PACKAGER_PROXY_URL` to work as expected.
77
+ * */ get EXPO_NO_DEFAULT_PORT() {
78
+ return (0, _getenv).boolish("EXPO_NO_DEFAULT_PORT", false);
79
+ }
64
80
  }
65
81
  const env = new Env();
66
82
  exports.env = env;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/env.ts"],"sourcesContent":["import { boolish, int, string } from 'getenv';\n\n// @expo/webpack-config -> expo-pwa -> @expo/image-utils: EXPO_IMAGE_UTILS_NO_SHARP\n\n// TODO: EXPO_CLI_USERNAME, EXPO_CLI_PASSWORD\n\nclass Env {\n /** Enable profiling metrics */\n get EXPO_PROFILE() {\n return boolish('EXPO_PROFILE', false);\n }\n\n /** Enable debug logging */\n get EXPO_DEBUG() {\n return boolish('EXPO_DEBUG', false);\n }\n\n /** Enable the beta version of Expo (TODO: Should this just be in the beta version of expo releases?) */\n get EXPO_BETA() {\n return boolish('EXPO_BETA', false);\n }\n\n /** Enable staging API environment */\n get EXPO_STAGING() {\n return boolish('EXPO_STAGING', false);\n }\n\n /** Enable local API environment */\n get EXPO_LOCAL() {\n return boolish('EXPO_LOCAL', false);\n }\n\n /** Is running in non-interactive CI mode */\n get CI() {\n return boolish('CI', false);\n }\n\n /** Disable telemetry (analytics) */\n get EXPO_NO_TELEMETRY() {\n return boolish('EXPO_NO_TELEMETRY', false);\n }\n\n /** local directory to the universe repo for testing locally */\n get EXPO_UNIVERSE_DIR() {\n return string('EXPO_UNIVERSE_DIR', '');\n }\n\n /** @deprecated Default Webpack host string */\n get WEB_HOST() {\n return string('WEB_HOST', '0.0.0.0');\n }\n\n /** Skip warning users about a dirty git status */\n get EXPO_NO_GIT_STATUS() {\n return boolish('EXPO_NO_GIT_STATUS', false);\n }\n /** Disable auto web setup */\n get EXPO_NO_WEB_SETUP() {\n return boolish('EXPO_NO_WEB_SETUP', false);\n }\n /** Disable auto TypeScript setup */\n get EXPO_NO_TYPESCRIPT_SETUP() {\n return boolish('EXPO_NO_TYPESCRIPT_SETUP', false);\n }\n /** Disable all API caches. Does not disable bundler caches. */\n get EXPO_NO_CACHE() {\n return boolish('EXPO_NO_CACHE', false);\n }\n /** Enable the experimental interstitial app select page. */\n get EXPO_ENABLE_INTERSTITIAL_PAGE() {\n return boolish('EXPO_ENABLE_INTERSTITIAL_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\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_ENABLE_INTERSTITIAL_PAGE","RCT_METRO_PORT","int","EXPO_SKIP_MANIFEST_VALIDATION_TOKEN","EXPO_PUBLIC_FOLDER","EXPO_EDITOR","env"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utils/env.ts"],"sourcesContent":["import { boolish, int, string } from 'getenv';\n\n// @expo/webpack-config -> expo-pwa -> @expo/image-utils: EXPO_IMAGE_UTILS_NO_SHARP\n\n// TODO: EXPO_CLI_USERNAME, EXPO_CLI_PASSWORD\n\nclass Env {\n /** Enable profiling metrics */\n get EXPO_PROFILE() {\n return boolish('EXPO_PROFILE', false);\n }\n\n /** Enable debug logging */\n get EXPO_DEBUG() {\n return boolish('EXPO_DEBUG', false);\n }\n\n /** Enable the beta version of Expo (TODO: Should this just be in the beta version of expo releases?) */\n get EXPO_BETA() {\n return boolish('EXPO_BETA', false);\n }\n\n /** Enable staging API environment */\n get EXPO_STAGING() {\n return boolish('EXPO_STAGING', false);\n }\n\n /** Enable local API environment */\n get EXPO_LOCAL() {\n return boolish('EXPO_LOCAL', false);\n }\n\n /** Is running in non-interactive CI mode */\n get CI() {\n return boolish('CI', false);\n }\n\n /** Disable telemetry (analytics) */\n get EXPO_NO_TELEMETRY() {\n return boolish('EXPO_NO_TELEMETRY', false);\n }\n\n /** local directory to the universe repo for testing locally */\n get EXPO_UNIVERSE_DIR() {\n return string('EXPO_UNIVERSE_DIR', '');\n }\n\n /** @deprecated Default Webpack host string */\n get WEB_HOST() {\n return string('WEB_HOST', '0.0.0.0');\n }\n\n /** Skip warning users about a dirty git status */\n get EXPO_NO_GIT_STATUS() {\n return boolish('EXPO_NO_GIT_STATUS', false);\n }\n /** Disable auto web setup */\n get EXPO_NO_WEB_SETUP() {\n return boolish('EXPO_NO_WEB_SETUP', false);\n }\n /** Disable auto TypeScript setup */\n get EXPO_NO_TYPESCRIPT_SETUP() {\n return boolish('EXPO_NO_TYPESCRIPT_SETUP', false);\n }\n /** Disable all API caches. Does not disable bundler caches. */\n get EXPO_NO_CACHE() {\n return boolish('EXPO_NO_CACHE', false);\n }\n /** Enable the experimental interstitial app select page. */\n get EXPO_ENABLE_INTERSTITIAL_PAGE() {\n return boolish('EXPO_ENABLE_INTERSTITIAL_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 /**\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 * The URL will not be used verbatim unless `EXPO_NO_DEFAULT_PORT=true` is also set,\n * otherwise a `:80` port will be added for Android support.\n */\n get EXPO_PACKAGER_PROXY_URL(): string {\n return string('EXPO_PACKAGER_PROXY_URL', '');\n }\n\n /**\n * Disable the enforced `:80` port when using custom dev server URLs.\n * This can break the incomplete Android WebSocket implementation but allows\n * `EXPO_PACKAGER_PROXY_URL` to work as expected.\n * */\n get EXPO_NO_DEFAULT_PORT(): boolean {\n return boolish('EXPO_NO_DEFAULT_PORT', 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_ENABLE_INTERSTITIAL_PAGE","RCT_METRO_PORT","int","EXPO_SKIP_MANIFEST_VALIDATION_TOKEN","EXPO_PUBLIC_FOLDER","EXPO_EDITOR","EXPO_PACKAGER_PROXY_URL","EXPO_NO_DEFAULT_PORT","env"],"mappings":"AAAA;;;;;AAAqC,IAAA,OAAQ,WAAR,QAAQ,CAAA;AAE7C,mFAAmF;AAEnF,6CAA6C;AAE7C,MAAMA,GAAG;IACP,+BAA+B,CAC/B,IAAIC,YAAY,GAAG;QACjB,OAAOC,CAAAA,GAAAA,OAAO,AAAuB,CAAA,QAAvB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;KACvC;IAED,2BAA2B,CAC3B,IAAIC,UAAU,GAAG;QACf,OAAOD,CAAAA,GAAAA,OAAO,AAAqB,CAAA,QAArB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;KACrC;IAED,wGAAwG,CACxG,IAAIE,SAAS,GAAG;QACd,OAAOF,CAAAA,GAAAA,OAAO,AAAoB,CAAA,QAApB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;KACpC;IAED,qCAAqC,CACrC,IAAIG,YAAY,GAAG;QACjB,OAAOH,CAAAA,GAAAA,OAAO,AAAuB,CAAA,QAAvB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;KACvC;IAED,mCAAmC,CACnC,IAAII,UAAU,GAAG;QACf,OAAOJ,CAAAA,GAAAA,OAAO,AAAqB,CAAA,QAArB,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;KACrC;IAED,4CAA4C,CAC5C,IAAIK,EAAE,GAAG;QACP,OAAOL,CAAAA,GAAAA,OAAO,AAAa,CAAA,QAAb,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;KAC7B;IAED,oCAAoC,CACpC,IAAIM,iBAAiB,GAAG;QACtB,OAAON,CAAAA,GAAAA,OAAO,AAA4B,CAAA,QAA5B,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;KAC5C;IAED,+DAA+D,CAC/D,IAAIO,iBAAiB,GAAG;QACtB,OAAOC,CAAAA,GAAAA,OAAM,AAAyB,CAAA,OAAzB,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;KACxC;IAED,8CAA8C,CAC9C,IAAIC,QAAQ,GAAG;QACb,OAAOD,CAAAA,GAAAA,OAAM,AAAuB,CAAA,OAAvB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;KACtC;IAED,kDAAkD,CAClD,IAAIE,kBAAkB,GAAG;QACvB,OAAOV,CAAAA,GAAAA,OAAO,AAA6B,CAAA,QAA7B,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;KAC7C;IACD,6BAA6B,CAC7B,IAAIW,iBAAiB,GAAG;QACtB,OAAOX,CAAAA,GAAAA,OAAO,AAA4B,CAAA,QAA5B,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;KAC5C;IACD,oCAAoC,CACpC,IAAIY,wBAAwB,GAAG;QAC7B,OAAOZ,CAAAA,GAAAA,OAAO,AAAmC,CAAA,QAAnC,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;KACnD;IACD,+DAA+D,CAC/D,IAAIa,aAAa,GAAG;QAClB,OAAOb,CAAAA,GAAAA,OAAO,AAAwB,CAAA,QAAxB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;KACxC;IACD,4DAA4D,CAC5D,IAAIc,6BAA6B,GAAG;QAClC,OAAOd,CAAAA,GAAAA,OAAO,AAAwC,CAAA,QAAxC,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;KACxD;IACD,6EAA6E,CAC7E,IAAIe,cAAc,GAAG;QACnB,OAAOC,CAAAA,GAAAA,OAAG,AAAqB,CAAA,IAArB,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;KACjC;IACD,oDAAoD,CACpD,IAAIC,mCAAmC,GAAY;QACjD,OAAO,CAAC,CAACT,CAAAA,GAAAA,OAAM,AAAuC,CAAA,OAAvC,CAAC,qCAAqC,CAAC,CAAC;KACxD;IAED,2EAA2E,CAC3E,IAAIU,kBAAkB,GAAW;QAC/B,OAAOV,CAAAA,GAAAA,OAAM,AAAgC,CAAA,OAAhC,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;KAC/C;IAED,kHAAkH,CAClH,IAAIW,WAAW,GAAW;QACxB,OAAOX,CAAAA,GAAAA,OAAM,AAAmB,CAAA,OAAnB,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;KAClC;IAED;;;;;;KAMG,CACH,IAAIY,uBAAuB,GAAW;QACpC,OAAOZ,CAAAA,GAAAA,OAAM,AAA+B,CAAA,OAA/B,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;KAC9C;IAED;;;;OAIK,CACL,IAAIa,oBAAoB,GAAY;QAClC,OAAOrB,CAAAA,GAAAA,OAAO,AAA+B,CAAA,QAA/B,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;KAC/C;CACF;AAEM,MAAMsB,GAAG,GAAG,IAAIxB,GAAG,EAAE,AAAC;QAAhBwB,GAAG,GAAHA,GAAG"}
@@ -8,6 +8,7 @@ var _spawnAsync = _interopRequireDefault(require("@expo/spawn-async"));
8
8
  var _chalk = _interopRequireDefault(require("chalk"));
9
9
  var Log = _interopRequireWildcard(require("../log"));
10
10
  var _env = require("./env");
11
+ var _interactive = require("./interactive");
11
12
  var _prompts = require("./prompts");
12
13
  function _interopRequireDefault(obj) {
13
14
  return obj && obj.__esModule ? obj : {
@@ -43,7 +44,7 @@ async function maybeBailOnGitStatusAsync() {
43
44
  const isGitStatusClean = await validateGitStatusAsync();
44
45
  // Give people a chance to bail out if git working tree is dirty
45
46
  if (!isGitStatusClean) {
46
- if (_env.env.CI) {
47
+ if (!(0, _interactive).isInteractive()) {
47
48
  Log.warn(`Git status is dirty but the command will continue because the terminal is not interactive.`);
48
49
  return false;
49
50
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/git.ts"],"sourcesContent":["import spawnAsync from '@expo/spawn-async';\nimport chalk from 'chalk';\n\nimport * as Log from '../log';\nimport { env } from './env';\nimport { confirmAsync } from './prompts';\n\nexport async function maybeBailOnGitStatusAsync(): Promise<boolean> {\n if (env.EXPO_NO_GIT_STATUS) {\n Log.warn(\n 'Git status is dirty but the command will continue because EXPO_NO_GIT_STATUS is enabled...'\n );\n return false;\n }\n const isGitStatusClean = await validateGitStatusAsync();\n\n // Give people a chance to bail out if git working tree is dirty\n if (!isGitStatusClean) {\n if (env.CI) {\n Log.warn(\n `Git status is dirty but the command will continue because the terminal is not interactive.`\n );\n return false;\n }\n\n Log.log();\n const answer = await confirmAsync({\n message: `Would you like to proceed?`,\n });\n\n if (!answer) {\n return true;\n }\n\n Log.log();\n }\n return false;\n}\n\nexport async function validateGitStatusAsync(): Promise<boolean> {\n let workingTreeStatus = 'unknown';\n try {\n const result = await spawnAsync('git', ['status', '--porcelain']);\n workingTreeStatus = result.stdout === '' ? 'clean' : 'dirty';\n } catch {\n // Maybe git is not installed?\n // Maybe this project is not using git?\n }\n\n if (workingTreeStatus === 'clean') {\n Log.log(`Your git working tree is ${chalk.green('clean')}`);\n Log.log('To revert the changes after this command completes, you can run the following:');\n Log.log(' git clean --force && git reset --hard');\n return true;\n } else if (workingTreeStatus === 'dirty') {\n Log.log(`${chalk.bold('Warning!')} Your git working tree is ${chalk.red('dirty')}.`);\n Log.log(\n `It's recommended to ${chalk.bold(\n 'commit all your changes before proceeding'\n )}, so you can revert the changes made by this command if necessary.`\n );\n } else {\n Log.log(\"We couldn't find a git repository in your project directory.\");\n Log.log(\"It's recommended to back up your project before proceeding.\");\n }\n\n return false;\n}\n"],"names":["maybeBailOnGitStatusAsync","validateGitStatusAsync","Log","env","EXPO_NO_GIT_STATUS","warn","isGitStatusClean","CI","log","answer","confirmAsync","message","workingTreeStatus","result","spawnAsync","stdout","chalk","green","bold","red"],"mappings":"AAAA;;;;QAOsBA,yBAAyB,GAAzBA,yBAAyB;QAgCzBC,sBAAsB,GAAtBA,sBAAsB;AAvCrB,IAAA,WAAmB,kCAAnB,mBAAmB,EAAA;AACxB,IAAA,MAAO,kCAAP,OAAO,EAAA;AAEbC,IAAAA,GAAG,mCAAM,QAAQ,EAAd;AACK,IAAA,IAAO,WAAP,OAAO,CAAA;AACE,IAAA,QAAW,WAAX,WAAW,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEjC,eAAeF,yBAAyB,GAAqB;IAClE,IAAIG,IAAG,IAAA,CAACC,kBAAkB,EAAE;QAC1BF,GAAG,CAACG,IAAI,CACN,4FAA4F,CAC7F,CAAC;QACF,OAAO,KAAK,CAAC;KACd;IACD,MAAMC,gBAAgB,GAAG,MAAML,sBAAsB,EAAE,AAAC;IAExD,gEAAgE;IAChE,IAAI,CAACK,gBAAgB,EAAE;QACrB,IAAIH,IAAG,IAAA,CAACI,EAAE,EAAE;YACVL,GAAG,CAACG,IAAI,CACN,CAAC,0FAA0F,CAAC,CAC7F,CAAC;YACF,OAAO,KAAK,CAAC;SACd;QAEDH,GAAG,CAACM,GAAG,EAAE,CAAC;QACV,MAAMC,MAAM,GAAG,MAAMC,CAAAA,GAAAA,QAAY,AAE/B,CAAA,aAF+B,CAAC;YAChCC,OAAO,EAAE,CAAC,0BAA0B,CAAC;SACtC,CAAC,AAAC;QAEH,IAAI,CAACF,MAAM,EAAE;YACX,OAAO,IAAI,CAAC;SACb;QAEDP,GAAG,CAACM,GAAG,EAAE,CAAC;KACX;IACD,OAAO,KAAK,CAAC;CACd;AAEM,eAAeP,sBAAsB,GAAqB;IAC/D,IAAIW,iBAAiB,GAAG,SAAS,AAAC;IAClC,IAAI;QACF,MAAMC,MAAM,GAAG,MAAMC,CAAAA,GAAAA,WAAU,AAAkC,CAAA,QAAlC,CAAC,KAAK,EAAE;YAAC,QAAQ;YAAE,aAAa;SAAC,CAAC,AAAC;QAClEF,iBAAiB,GAAGC,MAAM,CAACE,MAAM,KAAK,EAAE,GAAG,OAAO,GAAG,OAAO,CAAC;KAC9D,CAAC,OAAM;IACN,8BAA8B;IAC9B,uCAAuC;KACxC;IAED,IAAIH,iBAAiB,KAAK,OAAO,EAAE;QACjCV,GAAG,CAACM,GAAG,CAAC,CAAC,yBAAyB,EAAEQ,MAAK,QAAA,CAACC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5Df,GAAG,CAACM,GAAG,CAAC,gFAAgF,CAAC,CAAC;QAC1FN,GAAG,CAACM,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;KACb,MAAM,IAAII,iBAAiB,KAAK,OAAO,EAAE;QACxCV,GAAG,CAACM,GAAG,CAAC,CAAC,EAAEQ,MAAK,QAAA,CAACE,IAAI,CAAC,UAAU,CAAC,CAAC,0BAA0B,EAAEF,MAAK,QAAA,CAACG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrFjB,GAAG,CAACM,GAAG,CACL,CAAC,oBAAoB,EAAEQ,MAAK,QAAA,CAACE,IAAI,CAC/B,2CAA2C,CAC5C,CAAC,kEAAkE,CAAC,CACtE,CAAC;KACH,MAAM;QACLhB,GAAG,CAACM,GAAG,CAAC,8DAA8D,CAAC,CAAC;QACxEN,GAAG,CAACM,GAAG,CAAC,6DAA6D,CAAC,CAAC;KACxE;IAED,OAAO,KAAK,CAAC;CACd"}
1
+ {"version":3,"sources":["../../../src/utils/git.ts"],"sourcesContent":["import spawnAsync from '@expo/spawn-async';\nimport chalk from 'chalk';\n\nimport * as Log from '../log';\nimport { env } from './env';\nimport { isInteractive } from './interactive';\nimport { confirmAsync } from './prompts';\n\nexport async function maybeBailOnGitStatusAsync(): Promise<boolean> {\n if (env.EXPO_NO_GIT_STATUS) {\n Log.warn(\n 'Git status is dirty but the command will continue because EXPO_NO_GIT_STATUS is enabled...'\n );\n return false;\n }\n const isGitStatusClean = await validateGitStatusAsync();\n\n // Give people a chance to bail out if git working tree is dirty\n if (!isGitStatusClean) {\n if (!isInteractive()) {\n Log.warn(\n `Git status is dirty but the command will continue because the terminal is not interactive.`\n );\n return false;\n }\n\n Log.log();\n const answer = await confirmAsync({\n message: `Would you like to proceed?`,\n });\n\n if (!answer) {\n return true;\n }\n\n Log.log();\n }\n return false;\n}\n\nexport async function validateGitStatusAsync(): Promise<boolean> {\n let workingTreeStatus = 'unknown';\n try {\n const result = await spawnAsync('git', ['status', '--porcelain']);\n workingTreeStatus = result.stdout === '' ? 'clean' : 'dirty';\n } catch {\n // Maybe git is not installed?\n // Maybe this project is not using git?\n }\n\n if (workingTreeStatus === 'clean') {\n Log.log(`Your git working tree is ${chalk.green('clean')}`);\n Log.log('To revert the changes after this command completes, you can run the following:');\n Log.log(' git clean --force && git reset --hard');\n return true;\n } else if (workingTreeStatus === 'dirty') {\n Log.log(`${chalk.bold('Warning!')} Your git working tree is ${chalk.red('dirty')}.`);\n Log.log(\n `It's recommended to ${chalk.bold(\n 'commit all your changes before proceeding'\n )}, so you can revert the changes made by this command if necessary.`\n );\n } else {\n Log.log(\"We couldn't find a git repository in your project directory.\");\n Log.log(\"It's recommended to back up your project before proceeding.\");\n }\n\n return false;\n}\n"],"names":["maybeBailOnGitStatusAsync","validateGitStatusAsync","Log","env","EXPO_NO_GIT_STATUS","warn","isGitStatusClean","isInteractive","log","answer","confirmAsync","message","workingTreeStatus","result","spawnAsync","stdout","chalk","green","bold","red"],"mappings":"AAAA;;;;QAQsBA,yBAAyB,GAAzBA,yBAAyB;QAgCzBC,sBAAsB,GAAtBA,sBAAsB;AAxCrB,IAAA,WAAmB,kCAAnB,mBAAmB,EAAA;AACxB,IAAA,MAAO,kCAAP,OAAO,EAAA;AAEbC,IAAAA,GAAG,mCAAM,QAAQ,EAAd;AACK,IAAA,IAAO,WAAP,OAAO,CAAA;AACG,IAAA,YAAe,WAAf,eAAe,CAAA;AAChB,IAAA,QAAW,WAAX,WAAW,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEjC,eAAeF,yBAAyB,GAAqB;IAClE,IAAIG,IAAG,IAAA,CAACC,kBAAkB,EAAE;QAC1BF,GAAG,CAACG,IAAI,CACN,4FAA4F,CAC7F,CAAC;QACF,OAAO,KAAK,CAAC;KACd;IACD,MAAMC,gBAAgB,GAAG,MAAML,sBAAsB,EAAE,AAAC;IAExD,gEAAgE;IAChE,IAAI,CAACK,gBAAgB,EAAE;QACrB,IAAI,CAACC,CAAAA,GAAAA,YAAa,AAAE,CAAA,cAAF,EAAE,EAAE;YACpBL,GAAG,CAACG,IAAI,CACN,CAAC,0FAA0F,CAAC,CAC7F,CAAC;YACF,OAAO,KAAK,CAAC;SACd;QAEDH,GAAG,CAACM,GAAG,EAAE,CAAC;QACV,MAAMC,MAAM,GAAG,MAAMC,CAAAA,GAAAA,QAAY,AAE/B,CAAA,aAF+B,CAAC;YAChCC,OAAO,EAAE,CAAC,0BAA0B,CAAC;SACtC,CAAC,AAAC;QAEH,IAAI,CAACF,MAAM,EAAE;YACX,OAAO,IAAI,CAAC;SACb;QAEDP,GAAG,CAACM,GAAG,EAAE,CAAC;KACX;IACD,OAAO,KAAK,CAAC;CACd;AAEM,eAAeP,sBAAsB,GAAqB;IAC/D,IAAIW,iBAAiB,GAAG,SAAS,AAAC;IAClC,IAAI;QACF,MAAMC,MAAM,GAAG,MAAMC,CAAAA,GAAAA,WAAU,AAAkC,CAAA,QAAlC,CAAC,KAAK,EAAE;YAAC,QAAQ;YAAE,aAAa;SAAC,CAAC,AAAC;QAClEF,iBAAiB,GAAGC,MAAM,CAACE,MAAM,KAAK,EAAE,GAAG,OAAO,GAAG,OAAO,CAAC;KAC9D,CAAC,OAAM;IACN,8BAA8B;IAC9B,uCAAuC;KACxC;IAED,IAAIH,iBAAiB,KAAK,OAAO,EAAE;QACjCV,GAAG,CAACM,GAAG,CAAC,CAAC,yBAAyB,EAAEQ,MAAK,QAAA,CAACC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5Df,GAAG,CAACM,GAAG,CAAC,gFAAgF,CAAC,CAAC;QAC1FN,GAAG,CAACM,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;KACb,MAAM,IAAII,iBAAiB,KAAK,OAAO,EAAE;QACxCV,GAAG,CAACM,GAAG,CAAC,CAAC,EAAEQ,MAAK,QAAA,CAACE,IAAI,CAAC,UAAU,CAAC,CAAC,0BAA0B,EAAEF,MAAK,QAAA,CAACG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrFjB,GAAG,CAACM,GAAG,CACL,CAAC,oBAAoB,EAAEQ,MAAK,QAAA,CAACE,IAAI,CAC/B,2CAA2C,CAC5C,CAAC,kEAAkE,CAAC,CACtE,CAAC;KACH,MAAM;QACLhB,GAAG,CAACM,GAAG,CAAC,8DAA8D,CAAC,CAAC;QACxEN,GAAG,CAACM,GAAG,CAAC,6DAA6D,CAAC,CAAC;KACxE;IAED,OAAO,KAAK,CAAC;CACd"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ exports.isInteractive = isInteractive;
6
+ var _env = require("./env");
7
+ function isInteractive() {
8
+ return !_env.env.CI && process.stdout.isTTY;
9
+ }
10
+
11
+ //# sourceMappingURL=interactive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/interactive.ts"],"sourcesContent":["import { env } from './env';\n\n/** @returns `true` if the process is interactive. */\nexport function isInteractive(): boolean {\n return !env.CI && process.stdout.isTTY;\n}\n"],"names":["isInteractive","env","CI","process","stdout","isTTY"],"mappings":"AAAA;;;;QAGgBA,aAAa,GAAbA,aAAa;AAHT,IAAA,IAAO,WAAP,OAAO,CAAA;AAGpB,SAASA,aAAa,GAAY;IACvC,OAAO,CAACC,IAAG,IAAA,CAACC,EAAE,IAAIC,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC;CACxC"}
@@ -8,6 +8,7 @@ exports.logNewSection = logNewSection;
8
8
  var _chalk = _interopRequireDefault(require("chalk"));
9
9
  var _ora = _interopRequireDefault(require("ora"));
10
10
  var _env = require("./env");
11
+ var _interactive = require("./interactive");
11
12
  function _interopRequireDefault(obj) {
12
13
  return obj && obj.__esModule ? obj : {
13
14
  default: obj
@@ -25,7 +26,7 @@ function ora(options1) {
25
26
  const inputOptions = typeof options1 === "string" ? {
26
27
  text: options1
27
28
  } : options1 || {};
28
- const disabled = _env.env.CI || _env.env.EXPO_DEBUG;
29
+ const disabled = !(0, _interactive).isInteractive() || _env.env.EXPO_DEBUG;
29
30
  const spinner = (0, _ora).default({
30
31
  // Ensure our non-interactive mode emulates CI mode.
31
32
  isEnabled: !disabled,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/ora.ts"],"sourcesContent":["import chalk from 'chalk';\nimport oraReal, { Ora } from 'ora';\n\n// import * as Log from '../log';\nimport { env } from './env';\n\nconst logReal = console.log;\nconst infoReal = console.info;\nconst warnReal = console.warn;\nconst errorReal = console.error;\n\nconst runningSpinners: oraReal.Ora[] = [];\n\nexport function getAllSpinners() {\n return runningSpinners;\n}\n\n/**\n * A custom ora spinner that sends the stream to stdout in CI, non-TTY, or expo's non-interactive flag instead of stderr (the default).\n *\n * @param options\n * @returns\n */\nexport function ora(options?: oraReal.Options | string): oraReal.Ora {\n const inputOptions = typeof options === 'string' ? { text: options } : options || {};\n const disabled = env.CI || env.EXPO_DEBUG;\n const spinner = oraReal({\n // Ensure our non-interactive mode emulates CI mode.\n isEnabled: !disabled,\n // In non-interactive mode, send the stream to stdout so it prevents looking like an error.\n stream: disabled ? process.stdout : process.stderr,\n ...inputOptions,\n });\n\n const oraStart = spinner.start.bind(spinner);\n const oraStop = spinner.stop.bind(spinner);\n const oraStopAndPersist = spinner.stopAndPersist.bind(spinner);\n\n const logWrap = (method: any, args: any[]): void => {\n oraStop();\n method(...args);\n spinner.start();\n };\n\n const wrapNativeLogs = (): void => {\n console.log = (...args: any) => logWrap(logReal, args);\n console.info = (...args: any) => logWrap(infoReal, args);\n console.warn = (...args: any) => logWrap(warnReal, args);\n console.error = (...args: any) => logWrap(errorReal, args);\n\n runningSpinners.push(spinner);\n };\n\n const resetNativeLogs = (): void => {\n console.log = logReal;\n console.info = infoReal;\n console.warn = warnReal;\n console.error = errorReal;\n\n const index = runningSpinners.indexOf(spinner);\n if (index >= 0) {\n runningSpinners.splice(index, 1);\n }\n };\n\n spinner.start = (text): Ora => {\n wrapNativeLogs();\n return oraStart(text);\n };\n\n spinner.stopAndPersist = (options): Ora => {\n const result = oraStopAndPersist(options);\n resetNativeLogs();\n return result;\n };\n\n spinner.stop = (): Ora => {\n const result = oraStop();\n resetNativeLogs();\n return result;\n };\n\n // Always make the central logging module aware of the current spinner\n // Log.setSpinner(spinner);\n\n return spinner;\n}\n\n/**\n * Create a unified section spinner.\n *\n * @param title\n * @returns\n */\nexport function logNewSection(title: string) {\n const spinner = ora(chalk.bold(title));\n // Prevent the spinner from clashing with debug logs\n spinner.start();\n return spinner;\n}\n"],"names":["getAllSpinners","ora","logNewSection","logReal","console","log","infoReal","info","warnReal","warn","errorReal","error","runningSpinners","options","inputOptions","text","disabled","env","CI","EXPO_DEBUG","spinner","oraReal","isEnabled","stream","process","stdout","stderr","oraStart","start","bind","oraStop","stop","oraStopAndPersist","stopAndPersist","logWrap","method","args","wrapNativeLogs","push","resetNativeLogs","index","indexOf","splice","result","title","chalk","bold"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utils/ora.ts"],"sourcesContent":["import chalk from 'chalk';\nimport oraReal, { Ora } from 'ora';\n\n// import * as Log from '../log';\nimport { env } from './env';\nimport { isInteractive } from './interactive';\n\nconst logReal = console.log;\nconst infoReal = console.info;\nconst warnReal = console.warn;\nconst errorReal = console.error;\n\nconst runningSpinners: oraReal.Ora[] = [];\n\nexport function getAllSpinners() {\n return runningSpinners;\n}\n\n/**\n * A custom ora spinner that sends the stream to stdout in CI, non-TTY, or expo's non-interactive flag instead of stderr (the default).\n *\n * @param options\n * @returns\n */\nexport function ora(options?: oraReal.Options | string): oraReal.Ora {\n const inputOptions = typeof options === 'string' ? { text: options } : options || {};\n const disabled = !isInteractive() || env.EXPO_DEBUG;\n const spinner = oraReal({\n // Ensure our non-interactive mode emulates CI mode.\n isEnabled: !disabled,\n // In non-interactive mode, send the stream to stdout so it prevents looking like an error.\n stream: disabled ? process.stdout : process.stderr,\n ...inputOptions,\n });\n\n const oraStart = spinner.start.bind(spinner);\n const oraStop = spinner.stop.bind(spinner);\n const oraStopAndPersist = spinner.stopAndPersist.bind(spinner);\n\n const logWrap = (method: any, args: any[]): void => {\n oraStop();\n method(...args);\n spinner.start();\n };\n\n const wrapNativeLogs = (): void => {\n console.log = (...args: any) => logWrap(logReal, args);\n console.info = (...args: any) => logWrap(infoReal, args);\n console.warn = (...args: any) => logWrap(warnReal, args);\n console.error = (...args: any) => logWrap(errorReal, args);\n\n runningSpinners.push(spinner);\n };\n\n const resetNativeLogs = (): void => {\n console.log = logReal;\n console.info = infoReal;\n console.warn = warnReal;\n console.error = errorReal;\n\n const index = runningSpinners.indexOf(spinner);\n if (index >= 0) {\n runningSpinners.splice(index, 1);\n }\n };\n\n spinner.start = (text): Ora => {\n wrapNativeLogs();\n return oraStart(text);\n };\n\n spinner.stopAndPersist = (options): Ora => {\n const result = oraStopAndPersist(options);\n resetNativeLogs();\n return result;\n };\n\n spinner.stop = (): Ora => {\n const result = oraStop();\n resetNativeLogs();\n return result;\n };\n\n // Always make the central logging module aware of the current spinner\n // Log.setSpinner(spinner);\n\n return spinner;\n}\n\n/**\n * Create a unified section spinner.\n *\n * @param title\n * @returns\n */\nexport function logNewSection(title: string) {\n const spinner = ora(chalk.bold(title));\n // Prevent the spinner from clashing with debug logs\n spinner.start();\n return spinner;\n}\n"],"names":["getAllSpinners","ora","logNewSection","logReal","console","log","infoReal","info","warnReal","warn","errorReal","error","runningSpinners","options","inputOptions","text","disabled","isInteractive","env","EXPO_DEBUG","spinner","oraReal","isEnabled","stream","process","stdout","stderr","oraStart","start","bind","oraStop","stop","oraStopAndPersist","stopAndPersist","logWrap","method","args","wrapNativeLogs","push","resetNativeLogs","index","indexOf","splice","result","title","chalk","bold"],"mappings":"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"}
@@ -19,13 +19,13 @@ exports.createSelectionFilter = createSelectionFilter;
19
19
  exports.promptAsync = void 0;
20
20
  var _assert = _interopRequireDefault(require("assert"));
21
21
  var _prompts = _interopRequireWildcard(require("prompts"));
22
- var _env = require("./env");
23
22
  var _errors = require("./errors");
23
+ var _interactive = require("./interactive");
24
24
  async function prompt(questions, { nonInteractiveHelp , ...options } = {}) {
25
25
  questions = Array.isArray(questions) ? questions : [
26
26
  questions
27
27
  ];
28
- if (_env.env.CI && questions.length !== 0) {
28
+ if (!(0, _interactive).isInteractive() && questions.length !== 0) {
29
29
  let message = `Input is required, but 'npx expo' is in non-interactive mode.\n`;
30
30
  if (nonInteractiveHelp) {
31
31
  message += nonInteractiveHelp;