@expo/cli 0.21.5 → 0.21.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/bin/cli CHANGED
@@ -121,7 +121,7 @@ const args = (0, _arg().default)({
121
121
  });
122
122
  if (args["--version"]) {
123
123
  // Version is added in the build script.
124
- console.log("0.21.5");
124
+ console.log("0.21.6");
125
125
  process.exit(0);
126
126
  }
127
127
  if (args["--non-interactive"]) {
@@ -153,11 +153,13 @@ class TypeScriptProjectPrerequisite extends _prerequisite.ProjectPrerequisite {
153
153
  // the package and attempts to resolve the module in the same process.
154
154
  {
155
155
  file: "typescript/package.json",
156
- pkg: "typescript"
156
+ pkg: "typescript",
157
+ dev: true
157
158
  },
158
159
  {
159
160
  file: "@types/react/package.json",
160
- pkg: "@types/react"
161
+ pkg: "@types/react",
162
+ dev: true
161
163
  },
162
164
  ]
163
165
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/doctor/typescript/TypeScriptProjectPrerequisite.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config';\nimport fs from 'fs/promises';\nimport path from 'path';\n\nimport { updateTSConfigAsync } from './updateTSConfig';\nimport * as Log from '../../../log';\nimport { fileExistsAsync } from '../../../utils/dir';\nimport { env } from '../../../utils/env';\nimport { memoize } from '../../../utils/fn';\nimport { everyMatchAsync } from '../../../utils/glob';\nimport { ProjectPrerequisite } from '../Prerequisite';\nimport { ensureDependenciesAsync } from '../dependencies/ensureDependenciesAsync';\n\nconst debug = require('debug')('expo:doctor:typescriptSupport') as typeof console.log;\n\nconst warnDisabled = memoize(() => {\n Log.warn('Skipping TypeScript setup: EXPO_NO_TYPESCRIPT_SETUP is enabled.');\n});\n\n/** Ensure the project has the required TypeScript support settings. */\nexport class TypeScriptProjectPrerequisite extends ProjectPrerequisite<boolean> {\n /**\n * Ensure a project that hasn't explicitly disabled typescript support has all the required packages for running in the browser.\n *\n * @returns `true` if the setup finished and no longer needs to be run again.\n */\n async assertImplementation(): Promise<boolean> {\n if (env.EXPO_NO_TYPESCRIPT_SETUP) {\n warnDisabled();\n return true;\n }\n debug('Ensuring TypeScript support is setup');\n\n const tsConfigPath = path.join(this.projectRoot, 'tsconfig.json');\n\n // Ensure the project is TypeScript before continuing.\n const intent = await this._getSetupRequirements();\n if (!intent) {\n return false;\n }\n\n // Ensure TypeScript packages are installed\n await this._ensureDependenciesInstalledAsync();\n\n // Update the config\n await updateTSConfigAsync({ tsConfigPath });\n\n return true;\n }\n\n async bootstrapAsync(): Promise<void> {\n if (env.EXPO_NO_TYPESCRIPT_SETUP) {\n warnDisabled();\n return;\n }\n // Ensure TypeScript packages are installed\n await this._ensureDependenciesInstalledAsync({\n skipPrompt: true,\n isProjectMutable: true,\n });\n\n const tsConfigPath = path.join(this.projectRoot, 'tsconfig.json');\n\n // Update the config\n await updateTSConfigAsync({ tsConfigPath });\n }\n\n /** Exposed for testing. */\n async _getSetupRequirements(): Promise<{\n /** Indicates that TypeScript support is being bootstrapped. */\n isBootstrapping: boolean;\n } | null> {\n const tsConfigPath = await this._hasTSConfig();\n\n // Enable TS setup if the project has a `tsconfig.json`\n if (tsConfigPath) {\n const content = await fs.readFile(tsConfigPath, { encoding: 'utf8' }).then(\n (txt) => txt.trim(),\n // null when the file doesn't exist.\n () => null\n );\n const isBlankConfig = content === '' || content === '{}';\n return { isBootstrapping: isBlankConfig };\n }\n // This is a somewhat heavy check in larger projects.\n // Test that this is reasonably paced by running expo start in `expo/apps/native-component-list`\n const typescriptFile = await this._queryFirstTypeScriptFileAsync();\n if (typescriptFile) {\n return { isBootstrapping: true };\n }\n\n return null;\n }\n\n /** Exposed for testing. */\n async _ensureDependenciesInstalledAsync({\n exp,\n skipPrompt,\n isProjectMutable,\n }: {\n exp?: ExpoConfig;\n skipPrompt?: boolean;\n isProjectMutable?: boolean;\n } = {}): Promise<boolean> {\n try {\n return await ensureDependenciesAsync(this.projectRoot, {\n exp,\n skipPrompt,\n isProjectMutable,\n installMessage: `It looks like you're trying to use TypeScript but don't have the required dependencies installed.`,\n warningMessage:\n \"If you're not using TypeScript, please remove the TypeScript files from your project\",\n requiredPackages: [\n // use typescript/package.json to skip node module cache issues when the user installs\n // the package and attempts to resolve the module in the same process.\n { file: 'typescript/package.json', pkg: 'typescript' },\n { file: '@types/react/package.json', pkg: '@types/react' },\n ],\n });\n } catch (error) {\n // Reset the cached check so we can re-run the check if the user re-runs the command by pressing 'w' in the Terminal UI.\n this.resetAssertion();\n throw error;\n }\n }\n\n /** Return the first TypeScript file in the project. */\n async _queryFirstTypeScriptFileAsync(): Promise<null | string> {\n try {\n // TODO(Bacon): Use `everyMatch` since a bug causes `anyMatch` to return inaccurate results when used multiple times.\n const results = await everyMatchAsync('**/*.@(ts|tsx)', {\n cwd: this.projectRoot,\n signal: AbortSignal.timeout(5000),\n ignore: [\n '**/@(Carthage|Pods|node_modules)/**',\n '**/*.d.ts',\n '@(ios|android|web|web-build|dist)/**',\n ],\n });\n\n return results[0] ?? null;\n } catch (error: any) {\n if (error.name === 'TimeoutError') {\n return null;\n }\n\n throw error;\n }\n }\n\n async _hasTSConfig(): Promise<string | null> {\n const tsConfigPath = path.join(this.projectRoot, 'tsconfig.json');\n if (await fileExistsAsync(tsConfigPath)) {\n return tsConfigPath;\n }\n return null;\n }\n}\n"],"names":["TypeScriptProjectPrerequisite","debug","require","warnDisabled","memoize","Log","warn","ProjectPrerequisite","assertImplementation","env","EXPO_NO_TYPESCRIPT_SETUP","tsConfigPath","path","join","projectRoot","intent","_getSetupRequirements","_ensureDependenciesInstalledAsync","updateTSConfigAsync","bootstrapAsync","skipPrompt","isProjectMutable","_hasTSConfig","content","fs","readFile","encoding","then","txt","trim","isBlankConfig","isBootstrapping","typescriptFile","_queryFirstTypeScriptFileAsync","exp","ensureDependenciesAsync","installMessage","warningMessage","requiredPackages","file","pkg","error","resetAssertion","results","everyMatchAsync","cwd","signal","AbortSignal","timeout","ignore","name","fileExistsAsync"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/doctor/typescript/TypeScriptProjectPrerequisite.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config';\nimport fs from 'fs/promises';\nimport path from 'path';\n\nimport { updateTSConfigAsync } from './updateTSConfig';\nimport * as Log from '../../../log';\nimport { fileExistsAsync } from '../../../utils/dir';\nimport { env } from '../../../utils/env';\nimport { memoize } from '../../../utils/fn';\nimport { everyMatchAsync } from '../../../utils/glob';\nimport { ProjectPrerequisite } from '../Prerequisite';\nimport { ensureDependenciesAsync } from '../dependencies/ensureDependenciesAsync';\n\nconst debug = require('debug')('expo:doctor:typescriptSupport') as typeof console.log;\n\nconst warnDisabled = memoize(() => {\n Log.warn('Skipping TypeScript setup: EXPO_NO_TYPESCRIPT_SETUP is enabled.');\n});\n\n/** Ensure the project has the required TypeScript support settings. */\nexport class TypeScriptProjectPrerequisite extends ProjectPrerequisite<boolean> {\n /**\n * Ensure a project that hasn't explicitly disabled typescript support has all the required packages for running in the browser.\n *\n * @returns `true` if the setup finished and no longer needs to be run again.\n */\n async assertImplementation(): Promise<boolean> {\n if (env.EXPO_NO_TYPESCRIPT_SETUP) {\n warnDisabled();\n return true;\n }\n debug('Ensuring TypeScript support is setup');\n\n const tsConfigPath = path.join(this.projectRoot, 'tsconfig.json');\n\n // Ensure the project is TypeScript before continuing.\n const intent = await this._getSetupRequirements();\n if (!intent) {\n return false;\n }\n\n // Ensure TypeScript packages are installed\n await this._ensureDependenciesInstalledAsync();\n\n // Update the config\n await updateTSConfigAsync({ tsConfigPath });\n\n return true;\n }\n\n async bootstrapAsync(): Promise<void> {\n if (env.EXPO_NO_TYPESCRIPT_SETUP) {\n warnDisabled();\n return;\n }\n // Ensure TypeScript packages are installed\n await this._ensureDependenciesInstalledAsync({\n skipPrompt: true,\n isProjectMutable: true,\n });\n\n const tsConfigPath = path.join(this.projectRoot, 'tsconfig.json');\n\n // Update the config\n await updateTSConfigAsync({ tsConfigPath });\n }\n\n /** Exposed for testing. */\n async _getSetupRequirements(): Promise<{\n /** Indicates that TypeScript support is being bootstrapped. */\n isBootstrapping: boolean;\n } | null> {\n const tsConfigPath = await this._hasTSConfig();\n\n // Enable TS setup if the project has a `tsconfig.json`\n if (tsConfigPath) {\n const content = await fs.readFile(tsConfigPath, { encoding: 'utf8' }).then(\n (txt) => txt.trim(),\n // null when the file doesn't exist.\n () => null\n );\n const isBlankConfig = content === '' || content === '{}';\n return { isBootstrapping: isBlankConfig };\n }\n // This is a somewhat heavy check in larger projects.\n // Test that this is reasonably paced by running expo start in `expo/apps/native-component-list`\n const typescriptFile = await this._queryFirstTypeScriptFileAsync();\n if (typescriptFile) {\n return { isBootstrapping: true };\n }\n\n return null;\n }\n\n /** Exposed for testing. */\n async _ensureDependenciesInstalledAsync({\n exp,\n skipPrompt,\n isProjectMutable,\n }: {\n exp?: ExpoConfig;\n skipPrompt?: boolean;\n isProjectMutable?: boolean;\n } = {}): Promise<boolean> {\n try {\n return await ensureDependenciesAsync(this.projectRoot, {\n exp,\n skipPrompt,\n isProjectMutable,\n installMessage: `It looks like you're trying to use TypeScript but don't have the required dependencies installed.`,\n warningMessage:\n \"If you're not using TypeScript, please remove the TypeScript files from your project\",\n requiredPackages: [\n // use typescript/package.json to skip node module cache issues when the user installs\n // the package and attempts to resolve the module in the same process.\n { file: 'typescript/package.json', pkg: 'typescript', dev: true },\n { file: '@types/react/package.json', pkg: '@types/react', dev: true },\n ],\n });\n } catch (error) {\n // Reset the cached check so we can re-run the check if the user re-runs the command by pressing 'w' in the Terminal UI.\n this.resetAssertion();\n throw error;\n }\n }\n\n /** Return the first TypeScript file in the project. */\n async _queryFirstTypeScriptFileAsync(): Promise<null | string> {\n try {\n // TODO(Bacon): Use `everyMatch` since a bug causes `anyMatch` to return inaccurate results when used multiple times.\n const results = await everyMatchAsync('**/*.@(ts|tsx)', {\n cwd: this.projectRoot,\n signal: AbortSignal.timeout(5000),\n ignore: [\n '**/@(Carthage|Pods|node_modules)/**',\n '**/*.d.ts',\n '@(ios|android|web|web-build|dist)/**',\n ],\n });\n\n return results[0] ?? null;\n } catch (error: any) {\n if (error.name === 'TimeoutError') {\n return null;\n }\n\n throw error;\n }\n }\n\n async _hasTSConfig(): Promise<string | null> {\n const tsConfigPath = path.join(this.projectRoot, 'tsconfig.json');\n if (await fileExistsAsync(tsConfigPath)) {\n return tsConfigPath;\n }\n return null;\n }\n}\n"],"names":["TypeScriptProjectPrerequisite","debug","require","warnDisabled","memoize","Log","warn","ProjectPrerequisite","assertImplementation","env","EXPO_NO_TYPESCRIPT_SETUP","tsConfigPath","path","join","projectRoot","intent","_getSetupRequirements","_ensureDependenciesInstalledAsync","updateTSConfigAsync","bootstrapAsync","skipPrompt","isProjectMutable","_hasTSConfig","content","fs","readFile","encoding","then","txt","trim","isBlankConfig","isBootstrapping","typescriptFile","_queryFirstTypeScriptFileAsync","exp","ensureDependenciesAsync","installMessage","warningMessage","requiredPackages","file","pkg","dev","error","resetAssertion","results","everyMatchAsync","cwd","signal","AbortSignal","timeout","ignore","name","fileExistsAsync"],"mappings":"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"}
@@ -83,6 +83,7 @@ function _interopRequireDefault(obj) {
83
83
  return null;
84
84
  }
85
85
  }
86
+ /** By convention, a zero mac address means we have a virtual device, which we'd like to exclude */ const VIRTUAL_MAC_ADDRESS = "00:00:00:00:00:00";
86
87
  /** Determines the internal IP address by opening a socket, then checking the socket address against non-internal network interface assignments
87
88
  * @throws If no address can be determined.
88
89
  */ function getRouteIPAddress() {
@@ -101,7 +102,8 @@ function _interopRequireDefault(obj) {
101
102
  for(let i = 0; assignments && i < assignments.length; i++){
102
103
  const assignment = assignments[i];
103
104
  // Only use IPv4 assigments that aren't internal
104
- if (assignment.family === "IPv4" && !assignment.internal && assignment.address === routeAddress) return routeAddress;
105
+ // Only use IPv4 assignment if it's not a virtual device (e.g. a VPN network interface)
106
+ if (assignment.family === "IPv4" && !assignment.internal && assignment.address === routeAddress && assignment.mac !== VIRTUAL_MAC_ADDRESS) return routeAddress;
105
107
  }
106
108
  }
107
109
  return null;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/ip.ts"],"sourcesContent":["import internalIp from 'internal-ip';\nimport { spawnSync } from 'node:child_process';\nimport { isIPv4 } from 'node:net';\nimport { networkInterfaces } from 'node:os';\n\n/** Gets a route address by opening a UDP socket to a publicly routed address.\n * @privateRemarks\n * This is wrapped in `spawnSync` since the original `getIpAddress` utility exported\n * in this module is used synchronosly. An appropriate timeout has been set and UDP\n * ports don't send a message when opened.\n * @throws if `spawnSync` fails\n */\nfunction getRouteAddress(): string | null {\n const { error, status, stdout } = spawnSync(process.execPath, ['-'], {\n // This should be the cheapest method to determine the default route\n // By opening a socket to a publicly routed IP address, we let the default\n // gateway handle this socket, which means the socket's address will be\n // the prioritised route for public IP addresses.\n // It might fall back to `\"0.0.0.0\"` when no network connection is established\n input: `\n var socket = require('dgram').createSocket({ type: 'udp4', reuseAddr: true });\n socket.unref();\n socket.connect(53, '1.1.1.1', function() {\n var address = socket.address();\n socket.close();\n if (address && 'address' in address) {\n process.stdout.write(address.address);\n process.exit(0);\n } else {\n process.exit(1);\n }\n });\n `,\n shell: false,\n timeout: 500,\n encoding: 'utf8',\n windowsVerbatimArguments: false,\n windowsHide: true,\n });\n // We only use the stdout as an IP, if it validates as an IP and we got a zero exit code\n if (status || error) {\n return null;\n } else if (!status && typeof stdout === 'string' && isIPv4(stdout.trim())) {\n return stdout.trim();\n } else {\n return null;\n }\n}\n\n/** Determines the internal IP address by opening a socket, then checking the socket address against non-internal network interface assignments\n * @throws If no address can be determined.\n */\nfunction getRouteIPAddress(): string | null {\n // We check the IP address we get against the available network interfaces\n // It's only an internal IP address if we have a matching address on an interface's IP assignment\n let routeAddress: string | null = null;\n try {\n routeAddress = getRouteAddress();\n } catch {}\n if (!routeAddress) {\n return null;\n }\n const ifaces = networkInterfaces();\n for (const iface in ifaces) {\n const assignments = ifaces[iface];\n for (let i = 0; assignments && i < assignments.length; i++) {\n const assignment = assignments[i];\n // Only use IPv4 assigments that aren't internal\n if (\n assignment.family === 'IPv4' &&\n !assignment.internal &&\n assignment.address === routeAddress\n )\n return routeAddress;\n }\n }\n return null;\n}\n\nexport function getIpAddress(): string {\n return internalIp.v4.sync() || getRouteIPAddress() || '127.0.0.1';\n}\n"],"names":["getIpAddress","getRouteAddress","error","status","stdout","spawnSync","process","execPath","input","shell","timeout","encoding","windowsVerbatimArguments","windowsHide","isIPv4","trim","getRouteIPAddress","routeAddress","ifaces","networkInterfaces","iface","assignments","i","length","assignment","family","internal","address","internalIp","v4","sync"],"mappings":"AAAA;;;;+BA+EgBA,cAAY;;aAAZA,YAAY;;;8DA/EL,aAAa;;;;;;;yBACV,oBAAoB;;;;;;;yBACvB,UAAU;;;;;;;yBACC,SAAS;;;;;;;;;;;AAE3C;;;;;;CAMC,GACD,SAASC,eAAe,GAAkB;IACxC,MAAM,EAAEC,KAAK,CAAA,EAAEC,MAAM,CAAA,EAAEC,MAAM,CAAA,EAAE,GAAGC,IAAAA,iBAAS,EAAA,UAAA,EAACC,OAAO,CAACC,QAAQ,EAAE;QAAC,GAAG;KAAC,EAAE;QACnE,oEAAoE;QACpE,0EAA0E;QAC1E,uEAAuE;QACvE,iDAAiD;QACjD,8EAA8E;QAC9EC,KAAK,EAAE,CAAC;;;;;;;;;;;;;IAaR,CAAC;QACDC,KAAK,EAAE,KAAK;QACZC,OAAO,EAAE,GAAG;QACZC,QAAQ,EAAE,MAAM;QAChBC,wBAAwB,EAAE,KAAK;QAC/BC,WAAW,EAAE,IAAI;KAClB,CAAC,AAAC;IACH,wFAAwF;IACxF,IAAIV,MAAM,IAAID,KAAK,EAAE;QACnB,OAAO,IAAI,CAAC;IACd,OAAO,IAAI,CAACC,MAAM,IAAI,OAAOC,MAAM,KAAK,QAAQ,IAAIU,IAAAA,QAAM,EAAA,OAAA,EAACV,MAAM,CAACW,IAAI,EAAE,CAAC,EAAE;QACzE,OAAOX,MAAM,CAACW,IAAI,EAAE,CAAC;IACvB,OAAO;QACL,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;CAEC,GACD,SAASC,iBAAiB,GAAkB;IAC1C,0EAA0E;IAC1E,iGAAiG;IACjG,IAAIC,YAAY,GAAkB,IAAI,AAAC;IACvC,IAAI;QACFA,YAAY,GAAGhB,eAAe,EAAE,CAAC;IACnC,EAAE,OAAM,CAAC,CAAC;IACV,IAAI,CAACgB,YAAY,EAAE;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAMC,MAAM,GAAGC,IAAAA,OAAiB,EAAA,kBAAA,GAAE,AAAC;IACnC,IAAK,MAAMC,KAAK,IAAIF,MAAM,CAAE;QAC1B,MAAMG,WAAW,GAAGH,MAAM,CAACE,KAAK,CAAC,AAAC;QAClC,IAAK,IAAIE,CAAC,GAAG,CAAC,EAAED,WAAW,IAAIC,CAAC,GAAGD,WAAW,CAACE,MAAM,EAAED,CAAC,EAAE,CAAE;YAC1D,MAAME,UAAU,GAAGH,WAAW,CAACC,CAAC,CAAC,AAAC;YAClC,gDAAgD;YAChD,IACEE,UAAU,CAACC,MAAM,KAAK,MAAM,IAC5B,CAACD,UAAU,CAACE,QAAQ,IACpBF,UAAU,CAACG,OAAO,KAAKV,YAAY,EAEnC,OAAOA,YAAY,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,SAASjB,YAAY,GAAW;IACrC,OAAO4B,WAAU,EAAA,QAAA,CAACC,EAAE,CAACC,IAAI,EAAE,IAAId,iBAAiB,EAAE,IAAI,WAAW,CAAC;AACpE,CAAC"}
1
+ {"version":3,"sources":["../../../src/utils/ip.ts"],"sourcesContent":["import internalIp from 'internal-ip';\nimport { spawnSync } from 'node:child_process';\nimport { isIPv4 } from 'node:net';\nimport { networkInterfaces } from 'node:os';\n\n/** Gets a route address by opening a UDP socket to a publicly routed address.\n * @privateRemarks\n * This is wrapped in `spawnSync` since the original `getIpAddress` utility exported\n * in this module is used synchronosly. An appropriate timeout has been set and UDP\n * ports don't send a message when opened.\n * @throws if `spawnSync` fails\n */\nfunction getRouteAddress(): string | null {\n const { error, status, stdout } = spawnSync(process.execPath, ['-'], {\n // This should be the cheapest method to determine the default route\n // By opening a socket to a publicly routed IP address, we let the default\n // gateway handle this socket, which means the socket's address will be\n // the prioritised route for public IP addresses.\n // It might fall back to `\"0.0.0.0\"` when no network connection is established\n input: `\n var socket = require('dgram').createSocket({ type: 'udp4', reuseAddr: true });\n socket.unref();\n socket.connect(53, '1.1.1.1', function() {\n var address = socket.address();\n socket.close();\n if (address && 'address' in address) {\n process.stdout.write(address.address);\n process.exit(0);\n } else {\n process.exit(1);\n }\n });\n `,\n shell: false,\n timeout: 500,\n encoding: 'utf8',\n windowsVerbatimArguments: false,\n windowsHide: true,\n });\n // We only use the stdout as an IP, if it validates as an IP and we got a zero exit code\n if (status || error) {\n return null;\n } else if (!status && typeof stdout === 'string' && isIPv4(stdout.trim())) {\n return stdout.trim();\n } else {\n return null;\n }\n}\n\n/** By convention, a zero mac address means we have a virtual device, which we'd like to exclude */\nconst VIRTUAL_MAC_ADDRESS = '00:00:00:00:00:00';\n\n/** Determines the internal IP address by opening a socket, then checking the socket address against non-internal network interface assignments\n * @throws If no address can be determined.\n */\nfunction getRouteIPAddress(): string | null {\n // We check the IP address we get against the available network interfaces\n // It's only an internal IP address if we have a matching address on an interface's IP assignment\n let routeAddress: string | null = null;\n try {\n routeAddress = getRouteAddress();\n } catch {}\n if (!routeAddress) {\n return null;\n }\n const ifaces = networkInterfaces();\n for (const iface in ifaces) {\n const assignments = ifaces[iface];\n for (let i = 0; assignments && i < assignments.length; i++) {\n const assignment = assignments[i];\n // Only use IPv4 assigments that aren't internal\n // Only use IPv4 assignment if it's not a virtual device (e.g. a VPN network interface)\n if (\n assignment.family === 'IPv4' &&\n !assignment.internal &&\n assignment.address === routeAddress &&\n assignment.mac !== VIRTUAL_MAC_ADDRESS\n )\n return routeAddress;\n }\n }\n return null;\n}\n\nexport function getIpAddress(): string {\n return internalIp.v4.sync() || getRouteIPAddress() || '127.0.0.1';\n}\n"],"names":["getIpAddress","getRouteAddress","error","status","stdout","spawnSync","process","execPath","input","shell","timeout","encoding","windowsVerbatimArguments","windowsHide","isIPv4","trim","VIRTUAL_MAC_ADDRESS","getRouteIPAddress","routeAddress","ifaces","networkInterfaces","iface","assignments","i","length","assignment","family","internal","address","mac","internalIp","v4","sync"],"mappings":"AAAA;;;;+BAoFgBA,cAAY;;aAAZA,YAAY;;;8DApFL,aAAa;;;;;;;yBACV,oBAAoB;;;;;;;yBACvB,UAAU;;;;;;;yBACC,SAAS;;;;;;;;;;;AAE3C;;;;;;CAMC,GACD,SAASC,eAAe,GAAkB;IACxC,MAAM,EAAEC,KAAK,CAAA,EAAEC,MAAM,CAAA,EAAEC,MAAM,CAAA,EAAE,GAAGC,IAAAA,iBAAS,EAAA,UAAA,EAACC,OAAO,CAACC,QAAQ,EAAE;QAAC,GAAG;KAAC,EAAE;QACnE,oEAAoE;QACpE,0EAA0E;QAC1E,uEAAuE;QACvE,iDAAiD;QACjD,8EAA8E;QAC9EC,KAAK,EAAE,CAAC;;;;;;;;;;;;;IAaR,CAAC;QACDC,KAAK,EAAE,KAAK;QACZC,OAAO,EAAE,GAAG;QACZC,QAAQ,EAAE,MAAM;QAChBC,wBAAwB,EAAE,KAAK;QAC/BC,WAAW,EAAE,IAAI;KAClB,CAAC,AAAC;IACH,wFAAwF;IACxF,IAAIV,MAAM,IAAID,KAAK,EAAE;QACnB,OAAO,IAAI,CAAC;IACd,OAAO,IAAI,CAACC,MAAM,IAAI,OAAOC,MAAM,KAAK,QAAQ,IAAIU,IAAAA,QAAM,EAAA,OAAA,EAACV,MAAM,CAACW,IAAI,EAAE,CAAC,EAAE;QACzE,OAAOX,MAAM,CAACW,IAAI,EAAE,CAAC;IACvB,OAAO;QACL,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,iGAAiG,GACjG,MAAMC,mBAAmB,GAAG,mBAAmB,AAAC;AAEhD;;CAEC,GACD,SAASC,iBAAiB,GAAkB;IAC1C,0EAA0E;IAC1E,iGAAiG;IACjG,IAAIC,YAAY,GAAkB,IAAI,AAAC;IACvC,IAAI;QACFA,YAAY,GAAGjB,eAAe,EAAE,CAAC;IACnC,EAAE,OAAM,CAAC,CAAC;IACV,IAAI,CAACiB,YAAY,EAAE;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAMC,MAAM,GAAGC,IAAAA,OAAiB,EAAA,kBAAA,GAAE,AAAC;IACnC,IAAK,MAAMC,KAAK,IAAIF,MAAM,CAAE;QAC1B,MAAMG,WAAW,GAAGH,MAAM,CAACE,KAAK,CAAC,AAAC;QAClC,IAAK,IAAIE,CAAC,GAAG,CAAC,EAAED,WAAW,IAAIC,CAAC,GAAGD,WAAW,CAACE,MAAM,EAAED,CAAC,EAAE,CAAE;YAC1D,MAAME,UAAU,GAAGH,WAAW,CAACC,CAAC,CAAC,AAAC;YAClC,gDAAgD;YAChD,uFAAuF;YACvF,IACEE,UAAU,CAACC,MAAM,KAAK,MAAM,IAC5B,CAACD,UAAU,CAACE,QAAQ,IACpBF,UAAU,CAACG,OAAO,KAAKV,YAAY,IACnCO,UAAU,CAACI,GAAG,KAAKb,mBAAmB,EAEtC,OAAOE,YAAY,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,SAASlB,YAAY,GAAW;IACrC,OAAO8B,WAAU,EAAA,QAAA,CAACC,EAAE,CAACC,IAAI,EAAE,IAAIf,iBAAiB,EAAE,IAAI,WAAW,CAAC;AACpE,CAAC"}
@@ -31,7 +31,7 @@ class FetchClient {
31
31
  this.headers = {
32
32
  accept: "application/json",
33
33
  "content-type": "application/json",
34
- "user-agent": `expo-cli/${"0.21.5"}`,
34
+ "user-agent": `expo-cli/${"0.21.6"}`,
35
35
  authorization: "Basic " + _nodeBuffer().Buffer.from(`${target}:`).toString("base64")
36
36
  };
37
37
  }
@@ -79,7 +79,7 @@ function createContext() {
79
79
  cpu: summarizeCpuInfo(),
80
80
  app: {
81
81
  name: "expo/cli",
82
- version: "0.21.5"
82
+ version: "0.21.6"
83
83
  },
84
84
  ci: _ciInfo().isCI ? {
85
85
  name: _ciInfo().name,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/cli",
3
- "version": "0.21.5",
3
+ "version": "0.21.6",
4
4
  "description": "The Expo CLI",
5
5
  "main": "build/bin/cli",
6
6
  "bin": {
@@ -167,5 +167,5 @@
167
167
  "tree-kill": "^1.2.2",
168
168
  "tsd": "^0.28.1"
169
169
  },
170
- "gitHead": "9ff989048e66f85facda048e4be78329d8665e7c"
170
+ "gitHead": "128718d43bac2eaed764b3551469b95400f2363e"
171
171
  }