@expo/cli 56.0.6 → 56.1.1

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 (35) hide show
  1. package/build/bin/cli +1 -1
  2. package/build/src/events/index.js +1 -1
  3. package/build/src/export/embed/exportEmbedAsync.js +19 -0
  4. package/build/src/export/embed/exportEmbedAsync.js.map +1 -1
  5. package/build/src/log.js +21 -3
  6. package/build/src/log.js.map +1 -1
  7. package/build/src/start/resolveOptions.js +2 -2
  8. package/build/src/start/resolveOptions.js.map +1 -1
  9. package/build/src/start/server/getStaticRenderFunctions.js +7 -19
  10. package/build/src/start/server/getStaticRenderFunctions.js.map +1 -1
  11. package/build/src/start/server/metro/MetroBundlerDevServer.js +12 -25
  12. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  13. package/build/src/start/server/metro/MetroTerminalReporter.js +58 -8
  14. package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
  15. package/build/src/start/server/metro/TerminalReporter.js +18 -0
  16. package/build/src/start/server/metro/TerminalReporter.js.map +1 -1
  17. package/build/src/start/server/metro/createFileMap-fork.js +2 -17
  18. package/build/src/start/server/metro/createFileMap-fork.js.map +1 -1
  19. package/build/src/start/server/metro/instantiateMetro.js +74 -3
  20. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  21. package/build/src/start/server/metro/runServer-fork.js +1 -8
  22. package/build/src/start/server/metro/runServer-fork.js.map +1 -1
  23. package/build/src/start/server/metro/withMetroMultiPlatform.js +17 -4
  24. package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
  25. package/build/src/start/server/middleware/metroOptions.js +3 -2
  26. package/build/src/start/server/middleware/metroOptions.js.map +1 -1
  27. package/build/src/start/server/serverLogLikeMetro.js +5 -28
  28. package/build/src/start/server/serverLogLikeMetro.js.map +1 -1
  29. package/build/src/utils/composeMetroIgnorePatterns.js +69 -0
  30. package/build/src/utils/composeMetroIgnorePatterns.js.map +1 -0
  31. package/build/src/utils/port.js +7 -0
  32. package/build/src/utils/port.js.map +1 -1
  33. package/build/src/utils/telemetry/clients/FetchClient.js +1 -1
  34. package/build/src/utils/telemetry/utils/context.js +1 -1
  35. package/package.json +16 -18
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "composeMetroIgnorePatterns", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return composeMetroIgnorePatterns;
9
+ }
10
+ });
11
+ const NEVER_MATCHES = /(?!)/;
12
+ function isEscapedAt(source, dotIdx) {
13
+ let backslashes = 0;
14
+ for(let i = dotIdx - 1; i >= 0 && source.charCodeAt(i) === 92; i--){
15
+ backslashes++;
16
+ }
17
+ return backslashes % 2 === 1;
18
+ }
19
+ function stripUnanchoredDecoration(source) {
20
+ let s = source;
21
+ if (s.startsWith('^.*?')) s = s.slice(4);
22
+ else if (s.startsWith('^.*')) s = s.slice(3);
23
+ else if (s.startsWith('^[\\s\\S]*?')) s = s.slice(9);
24
+ else if (s.startsWith('^[\\s\\S]*')) s = s.slice(8);
25
+ else if (s.startsWith('.*?')) s = s.slice(3);
26
+ else if (s.startsWith('.*')) s = s.slice(2);
27
+ else if (s.startsWith('[\\s\\S]*?')) s = s.slice(8);
28
+ else if (s.startsWith('[\\s\\S]*')) s = s.slice(7);
29
+ if (s.endsWith('.*?$') && !isEscapedAt(s, s.length - 4)) s = s.slice(0, -4);
30
+ else if (s.endsWith('.*$') && !isEscapedAt(s, s.length - 3)) s = s.slice(0, -3);
31
+ else if (s.endsWith('[\\s\\S]*?$')) s = s.slice(0, -9);
32
+ else if (s.endsWith('[\\s\\S]*$')) s = s.slice(0, -8);
33
+ else if (s.endsWith('.*?') && !isEscapedAt(s, s.length - 3)) s = s.slice(0, -3);
34
+ else if (s.endsWith('.*') && !isEscapedAt(s, s.length - 2)) s = s.slice(0, -2);
35
+ else if (s.endsWith('[\\s\\S]*?')) s = s.slice(0, -8);
36
+ else if (s.endsWith('[\\s\\S]*')) s = s.slice(0, -7);
37
+ if (s === '' || s === '^' || s === '$' || s === '^$') return source;
38
+ return s;
39
+ }
40
+ function rankForOrdering(source) {
41
+ if (source.startsWith('^')) return 0;
42
+ if (source.startsWith('.*') || source.startsWith('.*?') || source.startsWith('[\\s\\S]*')) {
43
+ return 2;
44
+ }
45
+ return 1;
46
+ }
47
+ function composeMetroIgnorePatterns(input) {
48
+ if (!input) return NEVER_MATCHES;
49
+ if (!Array.isArray(input)) {
50
+ const regex = input;
51
+ return new RegExp(stripUnanchoredDecoration(regex.source), regex.flags);
52
+ }
53
+ const patterns = input;
54
+ if (patterns.length === 0) return NEVER_MATCHES;
55
+ if (patterns.length === 1) {
56
+ const regex = patterns[0];
57
+ return new RegExp(stripUnanchoredDecoration(regex.source), regex.flags);
58
+ }
59
+ const flags = patterns[0].flags;
60
+ for(let i = 1; i < patterns.length; i++){
61
+ if (patterns[i].flags !== flags) {
62
+ throw new Error('Cannot combine blockList patterns, because they have different flags:\n' + ` - Pattern 0: ${patterns[0].toString()}\n` + ` - Pattern ${i}: ${patterns[i].toString()}`);
63
+ }
64
+ }
65
+ const sources = patterns.map((regex)=>stripUnanchoredDecoration(regex.source)).sort((a, b)=>rankForOrdering(a) - rankForOrdering(b)).map((s)=>'(?:' + s + ')');
66
+ return new RegExp(sources.join('|'), flags);
67
+ }
68
+
69
+ //# sourceMappingURL=composeMetroIgnorePatterns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utils/composeMetroIgnorePatterns.ts"],"sourcesContent":["const NEVER_MATCHES = /(?!)/;\n\nfunction isEscapedAt(source: string, dotIdx: number): boolean {\n let backslashes = 0;\n for (let i = dotIdx - 1; i >= 0 && source.charCodeAt(i) === 92; i--) {\n backslashes++;\n }\n return backslashes % 2 === 1;\n}\n\nfunction stripUnanchoredDecoration(source: string): string {\n let s = source;\n\n if (s.startsWith('^.*?')) s = s.slice(4);\n else if (s.startsWith('^.*')) s = s.slice(3);\n else if (s.startsWith('^[\\\\s\\\\S]*?')) s = s.slice(9);\n else if (s.startsWith('^[\\\\s\\\\S]*')) s = s.slice(8);\n else if (s.startsWith('.*?')) s = s.slice(3);\n else if (s.startsWith('.*')) s = s.slice(2);\n else if (s.startsWith('[\\\\s\\\\S]*?')) s = s.slice(8);\n else if (s.startsWith('[\\\\s\\\\S]*')) s = s.slice(7);\n\n if (s.endsWith('.*?$') && !isEscapedAt(s, s.length - 4)) s = s.slice(0, -4);\n else if (s.endsWith('.*$') && !isEscapedAt(s, s.length - 3)) s = s.slice(0, -3);\n else if (s.endsWith('[\\\\s\\\\S]*?$')) s = s.slice(0, -9);\n else if (s.endsWith('[\\\\s\\\\S]*$')) s = s.slice(0, -8);\n else if (s.endsWith('.*?') && !isEscapedAt(s, s.length - 3)) s = s.slice(0, -3);\n else if (s.endsWith('.*') && !isEscapedAt(s, s.length - 2)) s = s.slice(0, -2);\n else if (s.endsWith('[\\\\s\\\\S]*?')) s = s.slice(0, -8);\n else if (s.endsWith('[\\\\s\\\\S]*')) s = s.slice(0, -7);\n\n if (s === '' || s === '^' || s === '$' || s === '^$') return source;\n return s;\n}\n\nfunction rankForOrdering(source: string): number {\n if (source.startsWith('^')) return 0;\n if (source.startsWith('.*') || source.startsWith('.*?') || source.startsWith('[\\\\s\\\\S]*')) {\n return 2;\n }\n return 1;\n}\n\n/**\n * Composes Metro `blockList` regexes into a single ignore pattern, normalizing\n * leading/trailing `.*` decoration so V8 can extract a literal prefilter from\n * each alternative.\n */\nexport function composeMetroIgnorePatterns(\n input: RegExp | readonly RegExp[] | null | undefined\n): RegExp {\n if (!input) return NEVER_MATCHES;\n if (!Array.isArray(input)) {\n const regex = input as RegExp;\n return new RegExp(stripUnanchoredDecoration(regex.source), regex.flags);\n }\n\n const patterns = input as readonly RegExp[];\n if (patterns.length === 0) return NEVER_MATCHES;\n if (patterns.length === 1) {\n const regex = patterns[0]!;\n return new RegExp(stripUnanchoredDecoration(regex.source), regex.flags);\n }\n\n const flags = patterns[0]!.flags;\n for (let i = 1; i < patterns.length; i++) {\n if (patterns[i]!.flags !== flags) {\n throw new Error(\n 'Cannot combine blockList patterns, because they have different flags:\\n' +\n ` - Pattern 0: ${patterns[0]!.toString()}\\n` +\n ` - Pattern ${i}: ${patterns[i]!.toString()}`\n );\n }\n }\n\n const sources = patterns\n .map((regex) => stripUnanchoredDecoration(regex.source))\n .sort((a, b) => rankForOrdering(a) - rankForOrdering(b))\n .map((s) => '(?:' + s + ')');\n return new RegExp(sources.join('|'), flags);\n}\n"],"names":["composeMetroIgnorePatterns","NEVER_MATCHES","isEscapedAt","source","dotIdx","backslashes","i","charCodeAt","stripUnanchoredDecoration","s","startsWith","slice","endsWith","length","rankForOrdering","input","Array","isArray","regex","RegExp","flags","patterns","Error","toString","sources","map","sort","a","b","join"],"mappings":"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"}
@@ -178,6 +178,13 @@ async function resolvePortAsync(projectRoot, { /** Should opt to reuse a port th
178
178
  } else {
179
179
  port = _env.env.RCT_METRO_PORT || fallbackPort || 8081;
180
180
  }
181
+ // Port 0 means "pick any available port" — scan from the fallback port without prompting.
182
+ if (port === 0) {
183
+ const scanFrom = _env.env.RCT_METRO_PORT || fallbackPort || 8081;
184
+ const resolvedPort = await getFreePortAsync(scanFrom);
185
+ process.env.RCT_METRO_PORT = String(resolvedPort);
186
+ return resolvedPort;
187
+ }
181
188
  // Only check the port when the bundler is running.
182
189
  const resolvedPort = await choosePortAsync(projectRoot, {
183
190
  defaultPort: port,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/utils/port.ts"],"sourcesContent":["import chalk from 'chalk';\n\nimport { env } from './env';\nimport { CommandError } from './errors';\nimport { testPortAsync, freePortAsync } from './freeport';\nimport * as Log from '../log';\n\n/** Get a free port or assert a CLI command error. */\nexport async function getFreePortAsync(rangeStart: number): Promise<number> {\n const port = await freePortAsync(rangeStart, [null, 'localhost']);\n if (!port) {\n throw new CommandError('NO_PORT_FOUND', 'No available port found');\n }\n\n return port;\n}\n\n/** @return `true` if the port can still be used to start the dev server, `false` if the dev server should be skipped, and asserts if the port is now taken. */\nexport async function ensurePortAvailabilityAsync(\n projectRoot: string,\n { port }: { port: number }\n): Promise<boolean> {\n const isFreePort = await testPortAsync(port, [null]);\n // Check if port has become busy during the build.\n if (isFreePort) {\n return true;\n }\n\n const isBusy = await isBusyPortRunningSameProcessAsync(projectRoot, { port });\n if (!isBusy) {\n throw new CommandError(\n `Port \"${port}\" became busy running another process while the app was compiling. Re-run command to use a new port.`\n );\n }\n\n // Log that the dev server will not be started and that the logs will appear in another window.\n Log.log(\n '› The dev server for this app is already running in another window. Logs will appear there.'\n );\n return false;\n}\n\nfunction isRestrictedPort(port: number) {\n if (process.platform !== 'win32' && port < 1024) {\n const isRoot = process.getuid && process.getuid() === 0;\n return !isRoot;\n }\n return false;\n}\n\nasync function isBusyPortRunningSameProcessAsync(projectRoot: string, { port }: { port: number }) {\n const { getRunningProcess } =\n require('./getRunningProcess') as typeof import('./getRunningProcess');\n const runningProcess = isRestrictedPort(port) ? null : await getRunningProcess(port);\n if (runningProcess) {\n if (runningProcess.directory === projectRoot) {\n return true;\n } else {\n return false;\n }\n }\n\n return null;\n}\n\n// TODO(Bacon): Revisit after all start and run code is merged.\nexport async function choosePortAsync(\n projectRoot: string,\n {\n defaultPort,\n host,\n reuseExistingPort,\n }: {\n defaultPort: number;\n host?: string;\n reuseExistingPort?: boolean;\n }\n): Promise<number | null> {\n try {\n const port = await freePortAsync(defaultPort, [host ?? null]);\n if (port === defaultPort || defaultPort === 0) {\n return port;\n }\n\n const isRestricted = port && isRestrictedPort(port);\n\n let message = isRestricted\n ? `Admin permissions are required to run a server on a port below 1024`\n : `Port ${chalk.bold(defaultPort)} is`;\n\n const { getRunningProcess } =\n require('./getRunningProcess') as typeof import('./getRunningProcess');\n const runningProcess = isRestricted ? null : await getRunningProcess(defaultPort);\n\n if (runningProcess) {\n const pidTag = chalk.gray(`(pid ${runningProcess.pid})`);\n if (runningProcess.directory === projectRoot) {\n message += ` running this app in another window`;\n if (reuseExistingPort) {\n return null;\n }\n } else {\n message += ` running ${chalk.cyan(runningProcess.command)} in another window`;\n }\n message += '\\n' + chalk.gray(` ${runningProcess.directory} ${pidTag}`);\n } else {\n message += ' being used by another process';\n }\n\n Log.log(`\\u203A ${message}`);\n const { confirmAsync } = require('./prompts') as typeof import('./prompts');\n const change = await confirmAsync({\n message: `Use port ${port} instead?`,\n initial: true,\n });\n return change ? port : null;\n } catch (error: any) {\n if (error.code === 'ABORTED') {\n throw error;\n } else if (error.code === 'NON_INTERACTIVE') {\n Log.warn(chalk.yellow(error.message));\n return null;\n }\n throw error;\n }\n}\n\n// TODO(Bacon): Revisit after all start and run code is merged.\nexport async function resolvePortAsync(\n projectRoot: string,\n {\n /** Should opt to reuse a port that is running the same project in another window. */\n reuseExistingPort,\n /** Preferred port. */\n defaultPort,\n /** Backup port for when the default isn't available. */\n fallbackPort,\n }: {\n reuseExistingPort?: boolean;\n defaultPort?: string | number;\n fallbackPort?: number;\n } = {}\n): Promise<number | null> {\n let port: number;\n if (typeof defaultPort === 'string') {\n port = parseInt(defaultPort, 10);\n } else if (typeof defaultPort === 'number') {\n port = defaultPort;\n } else {\n port = env.RCT_METRO_PORT || fallbackPort || 8081;\n }\n\n // Only check the port when the bundler is running.\n const resolvedPort = await choosePortAsync(projectRoot, {\n defaultPort: port,\n reuseExistingPort,\n });\n if (resolvedPort == null) {\n Log.log('\\u203A Skipping dev server');\n // Skip bundling if the port is null\n } else {\n // Use the new or resolved port\n process.env.RCT_METRO_PORT = String(resolvedPort);\n }\n\n return resolvedPort;\n}\n"],"names":["choosePortAsync","ensurePortAvailabilityAsync","getFreePortAsync","resolvePortAsync","rangeStart","port","freePortAsync","CommandError","projectRoot","isFreePort","testPortAsync","isBusy","isBusyPortRunningSameProcessAsync","Log","log","isRestrictedPort","process","platform","isRoot","getuid","getRunningProcess","require","runningProcess","directory","defaultPort","host","reuseExistingPort","isRestricted","message","chalk","bold","pidTag","gray","pid","cyan","command","confirmAsync","change","initial","error","code","warn","yellow","fallbackPort","parseInt","env","RCT_METRO_PORT","resolvedPort","String"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/utils/port.ts"],"sourcesContent":["import chalk from 'chalk';\n\nimport { env } from './env';\nimport { CommandError } from './errors';\nimport { testPortAsync, freePortAsync } from './freeport';\nimport * as Log from '../log';\n\n/** Get a free port or assert a CLI command error. */\nexport async function getFreePortAsync(rangeStart: number): Promise<number> {\n const port = await freePortAsync(rangeStart, [null, 'localhost']);\n if (!port) {\n throw new CommandError('NO_PORT_FOUND', 'No available port found');\n }\n\n return port;\n}\n\n/** @return `true` if the port can still be used to start the dev server, `false` if the dev server should be skipped, and asserts if the port is now taken. */\nexport async function ensurePortAvailabilityAsync(\n projectRoot: string,\n { port }: { port: number }\n): Promise<boolean> {\n const isFreePort = await testPortAsync(port, [null]);\n // Check if port has become busy during the build.\n if (isFreePort) {\n return true;\n }\n\n const isBusy = await isBusyPortRunningSameProcessAsync(projectRoot, { port });\n if (!isBusy) {\n throw new CommandError(\n `Port \"${port}\" became busy running another process while the app was compiling. Re-run command to use a new port.`\n );\n }\n\n // Log that the dev server will not be started and that the logs will appear in another window.\n Log.log(\n '› The dev server for this app is already running in another window. Logs will appear there.'\n );\n return false;\n}\n\nfunction isRestrictedPort(port: number) {\n if (process.platform !== 'win32' && port < 1024) {\n const isRoot = process.getuid && process.getuid() === 0;\n return !isRoot;\n }\n return false;\n}\n\nasync function isBusyPortRunningSameProcessAsync(projectRoot: string, { port }: { port: number }) {\n const { getRunningProcess } =\n require('./getRunningProcess') as typeof import('./getRunningProcess');\n const runningProcess = isRestrictedPort(port) ? null : await getRunningProcess(port);\n if (runningProcess) {\n if (runningProcess.directory === projectRoot) {\n return true;\n } else {\n return false;\n }\n }\n\n return null;\n}\n\n// TODO(Bacon): Revisit after all start and run code is merged.\nexport async function choosePortAsync(\n projectRoot: string,\n {\n defaultPort,\n host,\n reuseExistingPort,\n }: {\n defaultPort: number;\n host?: string;\n reuseExistingPort?: boolean;\n }\n): Promise<number | null> {\n try {\n const port = await freePortAsync(defaultPort, [host ?? null]);\n if (port === defaultPort || defaultPort === 0) {\n return port;\n }\n\n const isRestricted = port && isRestrictedPort(port);\n\n let message = isRestricted\n ? `Admin permissions are required to run a server on a port below 1024`\n : `Port ${chalk.bold(defaultPort)} is`;\n\n const { getRunningProcess } =\n require('./getRunningProcess') as typeof import('./getRunningProcess');\n const runningProcess = isRestricted ? null : await getRunningProcess(defaultPort);\n\n if (runningProcess) {\n const pidTag = chalk.gray(`(pid ${runningProcess.pid})`);\n if (runningProcess.directory === projectRoot) {\n message += ` running this app in another window`;\n if (reuseExistingPort) {\n return null;\n }\n } else {\n message += ` running ${chalk.cyan(runningProcess.command)} in another window`;\n }\n message += '\\n' + chalk.gray(` ${runningProcess.directory} ${pidTag}`);\n } else {\n message += ' being used by another process';\n }\n\n Log.log(`\\u203A ${message}`);\n const { confirmAsync } = require('./prompts') as typeof import('./prompts');\n const change = await confirmAsync({\n message: `Use port ${port} instead?`,\n initial: true,\n });\n return change ? port : null;\n } catch (error: any) {\n if (error.code === 'ABORTED') {\n throw error;\n } else if (error.code === 'NON_INTERACTIVE') {\n Log.warn(chalk.yellow(error.message));\n return null;\n }\n throw error;\n }\n}\n\n// TODO(Bacon): Revisit after all start and run code is merged.\nexport async function resolvePortAsync(\n projectRoot: string,\n {\n /** Should opt to reuse a port that is running the same project in another window. */\n reuseExistingPort,\n /** Preferred port. */\n defaultPort,\n /** Backup port for when the default isn't available. */\n fallbackPort,\n }: {\n reuseExistingPort?: boolean;\n defaultPort?: string | number;\n fallbackPort?: number;\n } = {}\n): Promise<number | null> {\n let port: number;\n if (typeof defaultPort === 'string') {\n port = parseInt(defaultPort, 10);\n } else if (typeof defaultPort === 'number') {\n port = defaultPort;\n } else {\n port = env.RCT_METRO_PORT || fallbackPort || 8081;\n }\n\n // Port 0 means \"pick any available port\" — scan from the fallback port without prompting.\n if (port === 0) {\n const scanFrom = env.RCT_METRO_PORT || fallbackPort || 8081;\n const resolvedPort = await getFreePortAsync(scanFrom);\n process.env.RCT_METRO_PORT = String(resolvedPort);\n return resolvedPort;\n }\n\n // Only check the port when the bundler is running.\n const resolvedPort = await choosePortAsync(projectRoot, {\n defaultPort: port,\n reuseExistingPort,\n });\n if (resolvedPort == null) {\n Log.log('\\u203A Skipping dev server');\n // Skip bundling if the port is null\n } else {\n // Use the new or resolved port\n process.env.RCT_METRO_PORT = String(resolvedPort);\n }\n\n return resolvedPort;\n}\n"],"names":["choosePortAsync","ensurePortAvailabilityAsync","getFreePortAsync","resolvePortAsync","rangeStart","port","freePortAsync","CommandError","projectRoot","isFreePort","testPortAsync","isBusy","isBusyPortRunningSameProcessAsync","Log","log","isRestrictedPort","process","platform","isRoot","getuid","getRunningProcess","require","runningProcess","directory","defaultPort","host","reuseExistingPort","isRestricted","message","chalk","bold","pidTag","gray","pid","cyan","command","confirmAsync","change","initial","error","code","warn","yellow","fallbackPort","parseInt","env","RCT_METRO_PORT","scanFrom","resolvedPort","String"],"mappings":"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"}
@@ -26,7 +26,7 @@ class FetchClient {
26
26
  this.headers = {
27
27
  accept: 'application/json',
28
28
  'content-type': 'application/json',
29
- 'user-agent': `expo-cli/${"56.0.6"}`,
29
+ 'user-agent': `expo-cli/${"56.1.1"}`,
30
30
  authorization: 'Basic ' + _nodebuffer().Buffer.from(`${target}:`).toString('base64')
31
31
  };
32
32
  }
@@ -83,7 +83,7 @@ function createContext() {
83
83
  cpu: summarizeCpuInfo(),
84
84
  app: {
85
85
  name: 'expo/cli',
86
- version: "56.0.6"
86
+ version: "56.1.1"
87
87
  },
88
88
  ci: _ciinfo().isCI ? {
89
89
  name: _ciinfo().name,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/cli",
3
- "version": "56.0.6",
3
+ "version": "56.1.1",
4
4
  "description": "The Expo CLI",
5
5
  "main": "main.js",
6
6
  "bin": {
@@ -39,23 +39,23 @@
39
39
  "homepage": "https://github.com/expo/expo/tree/main/packages/@expo/cli",
40
40
  "dependencies": {
41
41
  "@expo/code-signing-certificates": "^0.0.6",
42
- "@expo/config": "~56.0.2",
43
- "@expo/config-plugins": "~56.0.2",
42
+ "@expo/config": "~56.0.3",
43
+ "@expo/config-plugins": "~56.0.3",
44
44
  "@expo/devcert": "^1.2.1",
45
45
  "@expo/env": "~2.2.0",
46
- "@expo/image-utils": "^0.9.0",
47
- "@expo/inline-modules": "0.0.4",
46
+ "@expo/image-utils": "^0.9.2",
47
+ "@expo/inline-modules": "^0.0.5",
48
48
  "@expo/json-file": "^10.1.0",
49
- "@expo/log-box": "56.0.5",
49
+ "@expo/log-box": "^56.0.7",
50
50
  "@expo/metro": "~56.0.0",
51
- "@expo/metro-config": "~56.0.4",
52
- "@expo/metro-file-map": "56.0.0-2",
51
+ "@expo/metro-config": "~56.0.6",
52
+ "@expo/metro-file-map": "^56.0.1",
53
53
  "@expo/osascript": "^2.5.0",
54
54
  "@expo/package-manager": "^1.11.0",
55
55
  "@expo/plist": "^0.6.0",
56
- "@expo/prebuild-config": "^56.0.3",
57
- "@expo/require-utils": "^56.0.0",
58
- "@expo/router-server": "^56.0.4",
56
+ "@expo/prebuild-config": "^56.0.5",
57
+ "@expo/require-utils": "^56.1.0",
58
+ "@expo/router-server": "^56.0.5",
59
59
  "@expo/schema-utils": "^56.0.0",
60
60
  "@expo/spawn-async": "^1.7.2",
61
61
  "@expo/ws-tunnel": "^1.0.1",
@@ -89,7 +89,6 @@
89
89
  "semver": "^7.6.0",
90
90
  "send": "^0.19.0",
91
91
  "slugify": "^1.3.4",
92
- "source-map-support": "~0.5.21",
93
92
  "stacktrace-parser": "^0.1.10",
94
93
  "structured-headers": "^0.4.1",
95
94
  "terminal-link": "^2.1.1",
@@ -142,7 +141,6 @@
142
141
  "@types/resolve": "^1.20.2",
143
142
  "@types/semver": "^7.5.8",
144
143
  "@types/send": "^0.17.1",
145
- "@types/source-map-support": "^0.5.10",
146
144
  "@types/webpack": "~4.41.32",
147
145
  "@types/webpack-dev-server": "^3.11.0",
148
146
  "@types/wrap-ansi": "^3.0.0",
@@ -159,13 +157,13 @@
159
157
  "playwright": "^1.59.0",
160
158
  "taskr": "^1.1.0",
161
159
  "tree-kill": "^1.2.2",
162
- "expo": "56.0.0-preview.6",
160
+ "@expo/fingerprint": "0.17.4",
161
+ "expo-modules-autolinking": "56.0.4",
163
162
  "expo-module-scripts": "56.0.2",
164
- "@expo/fingerprint": "0.17.3",
165
- "expo-modules-autolinking": "56.0.2",
166
- "expo-router": "56.1.0"
163
+ "expo": "56.0.0-preview.8",
164
+ "expo-router": "56.1.2"
167
165
  },
168
- "gitHead": "d7b4e5edff4bf2e619d2c2f16d158798c6d592ef",
166
+ "gitHead": "42013232893cb2aa71ab218e9b422d4a8476b3f0",
169
167
  "scripts": {
170
168
  "build": "taskr",
171
169
  "clean": "expo-module clean",