@expo/cli 54.0.16 → 54.0.18
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/add-module.js +4 -1
- package/build/bin/cli +1 -1
- package/build/src/start/server/MCP.js +13 -1
- package/build/src/start/server/MCP.js.map +1 -1
- package/build/src/start/startAsync.js +5 -5
- package/build/src/start/startAsync.js.map +1 -1
- package/build/src/utils/telemetry/clients/FetchClient.js +1 -1
- package/build/src/utils/telemetry/utils/context.js +1 -1
- package/package.json +19 -19
package/add-module.js
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const { pathToFileURL } = require('node:url');
|
|
3
|
+
|
|
1
4
|
// A wrapper that allows to import an ESM module from a CJS module.
|
|
2
5
|
// This works because the `import` in this wrapper is not transpiled by SWC.
|
|
3
6
|
module.exports = function (name) {
|
|
4
|
-
return import(name);
|
|
7
|
+
return import(path.isAbsolute(name) ? pathToFileURL(name).href : name);
|
|
5
8
|
};
|
package/build/bin/cli
CHANGED
|
@@ -8,6 +8,13 @@ Object.defineProperty(exports, "maybeCreateMCPServerAsync", {
|
|
|
8
8
|
return maybeCreateMCPServerAsync;
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
|
+
function _nodepath() {
|
|
12
|
+
const data = /*#__PURE__*/ _interop_require_default(require("node:path"));
|
|
13
|
+
_nodepath = function() {
|
|
14
|
+
return data;
|
|
15
|
+
};
|
|
16
|
+
return data;
|
|
17
|
+
}
|
|
11
18
|
function _resolvefrom() {
|
|
12
19
|
const data = /*#__PURE__*/ _interop_require_default(require("resolve-from"));
|
|
13
20
|
_resolvefrom = function() {
|
|
@@ -36,6 +43,11 @@ async function maybeCreateMCPServerAsync({ projectRoot, devServerUrl }) {
|
|
|
36
43
|
_log.Log.error('Missing the `expo-mcp` package in the project. To enable the MCP integration, add the `expo-mcp` package to your project.');
|
|
37
44
|
return null;
|
|
38
45
|
}
|
|
46
|
+
const mcpTunnelPackagePath = _resolvefrom().default.silent(_nodepath().default.dirname(mcpPackagePath), '@expo/mcp-tunnel');
|
|
47
|
+
if (!mcpTunnelPackagePath) {
|
|
48
|
+
_log.Log.error('Unable to resolve the `@expo/mcp-tunnel` package');
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
39
51
|
const normalizedServer = /^([a-zA-Z][a-zA-Z\d+\-.]*):\/\//.test(mcpServer) ? mcpServer : `wss://${mcpServer}`;
|
|
40
52
|
const mcpServerUrlObject = new URL(normalizedServer);
|
|
41
53
|
const scheme = mcpServerUrlObject.protocol ?? 'wss:';
|
|
@@ -43,7 +55,7 @@ async function maybeCreateMCPServerAsync({ projectRoot, devServerUrl }) {
|
|
|
43
55
|
debug(`Creating MCP tunnel - server URL: ${mcpServerUrl}`);
|
|
44
56
|
try {
|
|
45
57
|
const { addMcpCapabilities } = await importESM(mcpPackagePath);
|
|
46
|
-
const { TunnelMcpServerProxy } = await importESM(
|
|
58
|
+
const { TunnelMcpServerProxy } = await importESM(mcpTunnelPackagePath);
|
|
47
59
|
const logger = {
|
|
48
60
|
..._log.Log,
|
|
49
61
|
debug (...message) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/start/server/MCP.ts"],"sourcesContent":["import type {\n McpServerProxy,\n TunnelMcpServerProxy as TunnelMcpServerProxyType,\n} from '@expo/mcp-tunnel' with { 'resolution-mode': 'import' };\nimport resolveFrom from 'resolve-from';\n\nimport { getAccessToken, getSession } from '../../api/user/UserSettings';\nimport { Log } from '../../log';\nimport { env } from '../../utils/env';\nimport { installExitHooks } from '../../utils/exit';\n\nconst importESM = require('@expo/cli/add-module') as <T>(moduleName: string) => Promise<T>;\n\nconst debug = require('debug')('expo:start:server:mcp') as typeof console.log;\n\n/**\n * The MCP server\n */\nexport type McpServer = Omit<McpServerProxy, 'close'> & {\n /**\n * Close the server\n */\n closeAsync: () => Promise<void>;\n};\n\n/**\n * Create the MCP server\n */\nexport async function maybeCreateMCPServerAsync({\n projectRoot,\n devServerUrl,\n}: {\n projectRoot: string;\n devServerUrl: string;\n}): Promise<McpServer | null> {\n const mcpServer = env.EXPO_UNSTABLE_MCP_SERVER;\n if (!mcpServer) {\n return null;\n }\n const mcpPackagePath = resolveFrom.silent(projectRoot, 'expo-mcp');\n if (!mcpPackagePath) {\n Log.error(\n 'Missing the `expo-mcp` package in the project. To enable the MCP integration, add the `expo-mcp` package to your project.'\n );\n return null;\n }\n\n const normalizedServer = /^([a-zA-Z][a-zA-Z\\d+\\-.]*):\\/\\//.test(mcpServer)\n ? mcpServer\n : `wss://${mcpServer}`;\n const mcpServerUrlObject = new URL(normalizedServer);\n const scheme = mcpServerUrlObject.protocol ?? 'wss:';\n const mcpServerUrl = `${scheme}//${mcpServerUrlObject.host}`;\n debug(`Creating MCP tunnel - server URL: ${mcpServerUrl}`);\n\n try {\n const { addMcpCapabilities } = await importESM<{\n addMcpCapabilities: (server: McpServerProxy, projectRoot: string) => void;\n }>(mcpPackagePath);\n const { TunnelMcpServerProxy } = await importESM<{\n TunnelMcpServerProxy: typeof TunnelMcpServerProxyType;\n }>(
|
|
1
|
+
{"version":3,"sources":["../../../../src/start/server/MCP.ts"],"sourcesContent":["import type {\n McpServerProxy,\n TunnelMcpServerProxy as TunnelMcpServerProxyType,\n} from '@expo/mcp-tunnel' with { 'resolution-mode': 'import' };\nimport path from 'node:path';\nimport resolveFrom from 'resolve-from';\n\nimport { getAccessToken, getSession } from '../../api/user/UserSettings';\nimport { Log } from '../../log';\nimport { env } from '../../utils/env';\nimport { installExitHooks } from '../../utils/exit';\n\nconst importESM = require('@expo/cli/add-module') as <T>(moduleName: string) => Promise<T>;\n\nconst debug = require('debug')('expo:start:server:mcp') as typeof console.log;\n\n/**\n * The MCP server\n */\nexport type McpServer = Omit<McpServerProxy, 'close'> & {\n /**\n * Close the server\n */\n closeAsync: () => Promise<void>;\n};\n\n/**\n * Create the MCP server\n */\nexport async function maybeCreateMCPServerAsync({\n projectRoot,\n devServerUrl,\n}: {\n projectRoot: string;\n devServerUrl: string;\n}): Promise<McpServer | null> {\n const mcpServer = env.EXPO_UNSTABLE_MCP_SERVER;\n if (!mcpServer) {\n return null;\n }\n const mcpPackagePath = resolveFrom.silent(projectRoot, 'expo-mcp');\n if (!mcpPackagePath) {\n Log.error(\n 'Missing the `expo-mcp` package in the project. To enable the MCP integration, add the `expo-mcp` package to your project.'\n );\n return null;\n }\n const mcpTunnelPackagePath = resolveFrom.silent(path.dirname(mcpPackagePath), '@expo/mcp-tunnel');\n if (!mcpTunnelPackagePath) {\n Log.error('Unable to resolve the `@expo/mcp-tunnel` package');\n return null;\n }\n\n const normalizedServer = /^([a-zA-Z][a-zA-Z\\d+\\-.]*):\\/\\//.test(mcpServer)\n ? mcpServer\n : `wss://${mcpServer}`;\n const mcpServerUrlObject = new URL(normalizedServer);\n const scheme = mcpServerUrlObject.protocol ?? 'wss:';\n const mcpServerUrl = `${scheme}//${mcpServerUrlObject.host}`;\n debug(`Creating MCP tunnel - server URL: ${mcpServerUrl}`);\n\n try {\n const { addMcpCapabilities } = await importESM<{\n addMcpCapabilities: (server: McpServerProxy, projectRoot: string) => void;\n }>(mcpPackagePath);\n const { TunnelMcpServerProxy } = await importESM<{\n TunnelMcpServerProxy: typeof TunnelMcpServerProxyType;\n }>(mcpTunnelPackagePath);\n\n const logger = {\n ...Log,\n debug(...message: any[]): void {\n debug(...message);\n },\n info(...message: any[]): void {\n Log.log(...message);\n },\n };\n const serverProxy: McpServerProxy = new TunnelMcpServerProxy(mcpServerUrl, {\n logger,\n wsHeaders: createAuthHeaders(),\n projectRoot,\n devServerUrl,\n });\n addMcpCapabilities(serverProxy, projectRoot);\n\n const removeExitHook = installExitHooks(async () => {\n await serverProxy.close();\n });\n const server = serverProxy as unknown as McpServer;\n server.closeAsync = async () => {\n removeExitHook();\n await serverProxy.close();\n };\n\n return server;\n } catch (error: unknown) {\n debug(`Error creating MCP tunnel: ${error}`);\n }\n return null;\n}\n\nfunction createAuthHeaders(): Record<string, string> {\n const token = getAccessToken();\n if (token) {\n return {\n authorization: `Bearer ${token}`,\n };\n }\n const sessionSecret = getSession()?.sessionSecret;\n if (sessionSecret) {\n return {\n 'expo-session': sessionSecret,\n };\n }\n return {};\n}\n"],"names":["maybeCreateMCPServerAsync","importESM","require","debug","projectRoot","devServerUrl","mcpServer","env","EXPO_UNSTABLE_MCP_SERVER","mcpPackagePath","resolveFrom","silent","Log","error","mcpTunnelPackagePath","path","dirname","normalizedServer","test","mcpServerUrlObject","URL","scheme","protocol","mcpServerUrl","host","addMcpCapabilities","TunnelMcpServerProxy","logger","message","info","log","serverProxy","wsHeaders","createAuthHeaders","removeExitHook","installExitHooks","close","server","closeAsync","getSession","token","getAccessToken","authorization","sessionSecret"],"mappings":";;;;+BA6BsBA;;;eAAAA;;;;gEAzBL;;;;;;;gEACO;;;;;;8BAEmB;qBACvB;qBACA;sBACa;;;;;;AAEjC,MAAMC,YAAYC,QAAQ;AAE1B,MAAMC,QAAQD,QAAQ,SAAS;AAexB,eAAeF,0BAA0B,EAC9CI,WAAW,EACXC,YAAY,EAIb;IACC,MAAMC,YAAYC,QAAG,CAACC,wBAAwB;IAC9C,IAAI,CAACF,WAAW;QACd,OAAO;IACT;IACA,MAAMG,iBAAiBC,sBAAW,CAACC,MAAM,CAACP,aAAa;IACvD,IAAI,CAACK,gBAAgB;QACnBG,QAAG,CAACC,KAAK,CACP;QAEF,OAAO;IACT;IACA,MAAMC,uBAAuBJ,sBAAW,CAACC,MAAM,CAACI,mBAAI,CAACC,OAAO,CAACP,iBAAiB;IAC9E,IAAI,CAACK,sBAAsB;QACzBF,QAAG,CAACC,KAAK,CAAC;QACV,OAAO;IACT;IAEA,MAAMI,mBAAmB,kCAAkCC,IAAI,CAACZ,aAC5DA,YACA,CAAC,MAAM,EAAEA,WAAW;IACxB,MAAMa,qBAAqB,IAAIC,IAAIH;IACnC,MAAMI,SAASF,mBAAmBG,QAAQ,IAAI;IAC9C,MAAMC,eAAe,GAAGF,OAAO,EAAE,EAAEF,mBAAmBK,IAAI,EAAE;IAC5DrB,MAAM,CAAC,kCAAkC,EAAEoB,cAAc;IAEzD,IAAI;QACF,MAAM,EAAEE,kBAAkB,EAAE,GAAG,MAAMxB,UAElCQ;QACH,MAAM,EAAEiB,oBAAoB,EAAE,GAAG,MAAMzB,UAEpCa;QAEH,MAAMa,SAAS;YACb,GAAGf,QAAG;YACNT,OAAM,GAAGyB,OAAc;gBACrBzB,SAASyB;YACX;YACAC,MAAK,GAAGD,OAAc;gBACpBhB,QAAG,CAACkB,GAAG,IAAIF;YACb;QACF;QACA,MAAMG,cAA8B,IAAIL,qBAAqBH,cAAc;YACzEI;YACAK,WAAWC;YACX7B;YACAC;QACF;QACAoB,mBAAmBM,aAAa3B;QAEhC,MAAM8B,iBAAiBC,IAAAA,sBAAgB,EAAC;YACtC,MAAMJ,YAAYK,KAAK;QACzB;QACA,MAAMC,SAASN;QACfM,OAAOC,UAAU,GAAG;YAClBJ;YACA,MAAMH,YAAYK,KAAK;QACzB;QAEA,OAAOC;IACT,EAAE,OAAOxB,OAAgB;QACvBV,MAAM,CAAC,2BAA2B,EAAEU,OAAO;IAC7C;IACA,OAAO;AACT;AAEA,SAASoB;QAOeM;IANtB,MAAMC,QAAQC,IAAAA,4BAAc;IAC5B,IAAID,OAAO;QACT,OAAO;YACLE,eAAe,CAAC,OAAO,EAAEF,OAAO;QAClC;IACF;IACA,MAAMG,iBAAgBJ,cAAAA,IAAAA,wBAAU,wBAAVA,YAAcI,aAAa;IACjD,IAAIA,eAAe;QACjB,OAAO;YACL,gBAAgBA;QAClB;IACF;IACA,OAAO,CAAC;AACV"}
|
|
@@ -157,12 +157,12 @@ async function startAsync(projectRoot, options, settings) {
|
|
|
157
157
|
// Open project on devices.
|
|
158
158
|
await (0, _profile.profile)(_openPlatforms.openPlatformsAsync)(devServerManager, options);
|
|
159
159
|
const defaultServerUrl = ((_devServerManager_getDefaultDevServer = devServerManager.getDefaultDevServer()) == null ? void 0 : _devServerManager_getDefaultDevServer.getDevServerUrl()) ?? '';
|
|
160
|
+
const mcpServer = await (0, _profile.profile)(_MCP.maybeCreateMCPServerAsync)({
|
|
161
|
+
projectRoot,
|
|
162
|
+
devServerUrl: defaultServerUrl
|
|
163
|
+
}) ?? undefined;
|
|
160
164
|
// Present the Terminal UI.
|
|
161
165
|
if ((0, _interactive.isInteractive)()) {
|
|
162
|
-
const mcpServer = await (0, _profile.profile)(_MCP.maybeCreateMCPServerAsync)({
|
|
163
|
-
projectRoot,
|
|
164
|
-
devServerUrl: defaultServerUrl
|
|
165
|
-
}) ?? undefined;
|
|
166
166
|
await (0, _profile.profile)(_startInterface.startInterfaceAsync)(devServerManager, {
|
|
167
167
|
platforms: exp.platforms ?? [
|
|
168
168
|
'ios',
|
|
@@ -171,7 +171,6 @@ async function startAsync(projectRoot, options, settings) {
|
|
|
171
171
|
],
|
|
172
172
|
mcpServer
|
|
173
173
|
});
|
|
174
|
-
mcpServer == null ? void 0 : mcpServer.start();
|
|
175
174
|
} else {
|
|
176
175
|
// Display the server location in CI...
|
|
177
176
|
if (defaultServerUrl) {
|
|
@@ -184,6 +183,7 @@ async function startAsync(projectRoot, options, settings) {
|
|
|
184
183
|
_log.log((0, _chalk().default)`Waiting on {underline ${defaultServerUrl}}`);
|
|
185
184
|
}
|
|
186
185
|
}
|
|
186
|
+
mcpServer == null ? void 0 : mcpServer.start();
|
|
187
187
|
// Final note about closing the server.
|
|
188
188
|
const logLocation = settings.webOnly ? 'in the browser console' : 'below';
|
|
189
189
|
_log.log((0, _chalk().default)`Logs for your project will appear ${logLocation}.${(0, _interactive.isInteractive)() ? _chalk().default.dim(` Press Ctrl+C to exit.`) : ''}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/start/startAsync.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport chalk from 'chalk';\n\nimport { SimulatorAppPrerequisite } from './doctor/apple/SimulatorAppPrerequisite';\nimport { getXcodeVersionAsync } from './doctor/apple/XcodePrerequisite';\nimport { validateDependenciesVersionsAsync } from './doctor/dependencies/validateDependenciesVersions';\nimport { WebSupportProjectPrerequisite } from './doctor/web/WebSupportProjectPrerequisite';\nimport { startInterfaceAsync } from './interface/startInterface';\nimport { Options, resolvePortsAsync } from './resolveOptions';\nimport * as Log from '../log';\nimport { BundlerStartOptions } from './server/BundlerDevServer';\nimport { DevServerManager, MultiBundlerStartOptions } from './server/DevServerManager';\nimport { openPlatformsAsync } from './server/openPlatforms';\nimport { getPlatformBundlers, PlatformBundlers } from './server/platformBundlers';\nimport { env } from '../utils/env';\nimport { isInteractive } from '../utils/interactive';\nimport { profile } from '../utils/profile';\nimport { maybeCreateMCPServerAsync } from './server/MCP';\n\nasync function getMultiBundlerStartOptions(\n projectRoot: string,\n 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 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 if (exp.platforms?.includes('ios') && process.platform !== 'win32') {\n // If Xcode could potentially be used, then we should eagerly perform the\n // assertions since they can take a while on cold boots.\n getXcodeVersionAsync({ silent: true });\n SimulatorAppPrerequisite.instance.assertAsync().catch(() => {\n // noop -- this will be thrown again when the user attempts to open the project.\n });\n }\n\n const platformBundlers = getPlatformBundlers(projectRoot, exp);\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 // Start the server as soon as possible.\n await profile(devServerManager.startAsync.bind(devServerManager))(startOptions);\n\n if (!settings.webOnly) {\n await devServerManager.watchEnvironmentVariables();\n\n // After the server starts, we can start attempting to bootstrap TypeScript.\n await devServerManager.bootstrapTypeScriptAsync();\n }\n\n if (!env.EXPO_NO_DEPENDENCY_VALIDATION && !settings.webOnly && !options.devClient) {\n await profile(validateDependenciesVersionsAsync)(projectRoot, exp, pkg);\n }\n\n // Open project on devices.\n await profile(openPlatformsAsync)(devServerManager, options);\n\n const defaultServerUrl = devServerManager.getDefaultDevServer()?.getDevServerUrl() ?? '';\n
|
|
1
|
+
{"version":3,"sources":["../../../src/start/startAsync.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport chalk from 'chalk';\n\nimport { SimulatorAppPrerequisite } from './doctor/apple/SimulatorAppPrerequisite';\nimport { getXcodeVersionAsync } from './doctor/apple/XcodePrerequisite';\nimport { validateDependenciesVersionsAsync } from './doctor/dependencies/validateDependenciesVersions';\nimport { WebSupportProjectPrerequisite } from './doctor/web/WebSupportProjectPrerequisite';\nimport { startInterfaceAsync } from './interface/startInterface';\nimport { Options, resolvePortsAsync } from './resolveOptions';\nimport * as Log from '../log';\nimport { BundlerStartOptions } from './server/BundlerDevServer';\nimport { DevServerManager, MultiBundlerStartOptions } from './server/DevServerManager';\nimport { openPlatformsAsync } from './server/openPlatforms';\nimport { getPlatformBundlers, PlatformBundlers } from './server/platformBundlers';\nimport { env } from '../utils/env';\nimport { isInteractive } from '../utils/interactive';\nimport { profile } from '../utils/profile';\nimport { maybeCreateMCPServerAsync } from './server/MCP';\n\nasync function getMultiBundlerStartOptions(\n projectRoot: string,\n 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 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 if (exp.platforms?.includes('ios') && process.platform !== 'win32') {\n // If Xcode could potentially be used, then we should eagerly perform the\n // assertions since they can take a while on cold boots.\n getXcodeVersionAsync({ silent: true });\n SimulatorAppPrerequisite.instance.assertAsync().catch(() => {\n // noop -- this will be thrown again when the user attempts to open the project.\n });\n }\n\n const platformBundlers = getPlatformBundlers(projectRoot, exp);\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 // Start the server as soon as possible.\n await profile(devServerManager.startAsync.bind(devServerManager))(startOptions);\n\n if (!settings.webOnly) {\n await devServerManager.watchEnvironmentVariables();\n\n // After the server starts, we can start attempting to bootstrap TypeScript.\n await devServerManager.bootstrapTypeScriptAsync();\n }\n\n if (!env.EXPO_NO_DEPENDENCY_VALIDATION && !settings.webOnly && !options.devClient) {\n await profile(validateDependenciesVersionsAsync)(projectRoot, exp, pkg);\n }\n\n // Open project on devices.\n await profile(openPlatformsAsync)(devServerManager, options);\n\n const defaultServerUrl = devServerManager.getDefaultDevServer()?.getDevServerUrl() ?? '';\n const mcpServer =\n (await profile(maybeCreateMCPServerAsync)({\n projectRoot,\n devServerUrl: defaultServerUrl,\n })) ?? undefined;\n\n // Present the Terminal UI.\n if (isInteractive()) {\n await profile(startInterfaceAsync)(devServerManager, {\n platforms: exp.platforms ?? ['ios', 'android', 'web'],\n mcpServer,\n });\n } else {\n // Display the server location in CI...\n if (defaultServerUrl) {\n if (env.__EXPO_E2E_TEST) {\n // Print the URL to stdout for tests\n console.info(`[__EXPO_E2E_TEST:server] ${JSON.stringify({ url: defaultServerUrl })}`);\n }\n Log.log(chalk`Waiting on {underline ${defaultServerUrl}}`);\n }\n }\n mcpServer?.start();\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"],"names":["startAsync","getMultiBundlerStartOptions","projectRoot","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","exp","devServerManager","Log","log","chalk","gray","pkg","profile","getConfig","platforms","includes","process","platform","getXcodeVersionAsync","silent","SimulatorAppPrerequisite","instance","assertAsync","catch","getPlatformBundlers","defaultOptions","startOptions","DevServerManager","webOnly","ensureProjectPrerequisiteAsync","WebSupportProjectPrerequisite","bind","watchEnvironmentVariables","bootstrapTypeScriptAsync","env","EXPO_NO_DEPENDENCY_VALIDATION","validateDependenciesVersionsAsync","openPlatformsAsync","defaultServerUrl","getDefaultDevServer","getDevServerUrl","mcpServer","maybeCreateMCPServerAsync","devServerUrl","isInteractive","startInterfaceAsync","__EXPO_E2E_TEST","console","info","JSON","stringify","url","start","logLocation","dim"],"mappings":"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"}
|
|
@@ -33,7 +33,7 @@ class FetchClient {
|
|
|
33
33
|
this.headers = {
|
|
34
34
|
accept: 'application/json',
|
|
35
35
|
'content-type': 'application/json',
|
|
36
|
-
'user-agent': `expo-cli/${"54.0.
|
|
36
|
+
'user-agent': `expo-cli/${"54.0.18"}`,
|
|
37
37
|
authorization: 'Basic ' + _nodebuffer().Buffer.from(`${target}:`).toString('base64')
|
|
38
38
|
};
|
|
39
39
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@expo/cli",
|
|
3
|
-
"version": "54.0.
|
|
3
|
+
"version": "54.0.18",
|
|
4
4
|
"description": "The Expo CLI",
|
|
5
5
|
"main": "build/bin/cli",
|
|
6
6
|
"bin": {
|
|
@@ -43,20 +43,19 @@
|
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@0no-co/graphql.web": "^1.0.8",
|
|
45
45
|
"@expo/code-signing-certificates": "^0.0.5",
|
|
46
|
-
"@expo/config": "~12.0.
|
|
47
|
-
"@expo/config-plugins": "~54.0.
|
|
48
|
-
"@expo/devcert": "^1.1
|
|
49
|
-
"@expo/env": "~2.0.
|
|
50
|
-
"@expo/image-utils": "^0.8.
|
|
51
|
-
"@expo/json-file": "^10.0.
|
|
52
|
-
"@expo/mcp-tunnel": "~0.1.0",
|
|
46
|
+
"@expo/config": "~12.0.11",
|
|
47
|
+
"@expo/config-plugins": "~54.0.3",
|
|
48
|
+
"@expo/devcert": "^1.2.1",
|
|
49
|
+
"@expo/env": "~2.0.8",
|
|
50
|
+
"@expo/image-utils": "^0.8.8",
|
|
51
|
+
"@expo/json-file": "^10.0.8",
|
|
53
52
|
"@expo/metro": "~54.1.0",
|
|
54
|
-
"@expo/metro-config": "~54.0.
|
|
55
|
-
"@expo/osascript": "^2.3.
|
|
56
|
-
"@expo/package-manager": "^1.9.
|
|
57
|
-
"@expo/plist": "^0.4.
|
|
58
|
-
"@expo/prebuild-config": "^54.0.
|
|
59
|
-
"@expo/schema-utils": "^0.1.
|
|
53
|
+
"@expo/metro-config": "~54.0.10",
|
|
54
|
+
"@expo/osascript": "^2.3.8",
|
|
55
|
+
"@expo/package-manager": "^1.9.9",
|
|
56
|
+
"@expo/plist": "^0.4.8",
|
|
57
|
+
"@expo/prebuild-config": "^54.0.7",
|
|
58
|
+
"@expo/schema-utils": "^0.1.8",
|
|
60
59
|
"@expo/spawn-async": "^1.7.2",
|
|
61
60
|
"@expo/ws-tunnel": "^1.0.1",
|
|
62
61
|
"@expo/xcpretty": "^4.3.0",
|
|
@@ -74,10 +73,10 @@
|
|
|
74
73
|
"connect": "^3.7.0",
|
|
75
74
|
"debug": "^4.3.4",
|
|
76
75
|
"env-editor": "^0.4.1",
|
|
77
|
-
"expo-server": "^1.0.
|
|
76
|
+
"expo-server": "^1.0.5",
|
|
78
77
|
"freeport-async": "^2.0.0",
|
|
79
78
|
"getenv": "^2.0.0",
|
|
80
|
-
"glob": "^
|
|
79
|
+
"glob": "^13.0.0",
|
|
81
80
|
"lan-network": "^0.1.6",
|
|
82
81
|
"minimatch": "^9.0.0",
|
|
83
82
|
"node-forge": "^1.3.1",
|
|
@@ -100,7 +99,7 @@
|
|
|
100
99
|
"source-map-support": "~0.5.21",
|
|
101
100
|
"stacktrace-parser": "^0.1.10",
|
|
102
101
|
"structured-headers": "^0.4.1",
|
|
103
|
-
"tar": "^7.
|
|
102
|
+
"tar": "^7.5.2",
|
|
104
103
|
"terminal-link": "^2.1.1",
|
|
105
104
|
"undici": "^6.18.2",
|
|
106
105
|
"wrap-ansi": "^7.0.0",
|
|
@@ -125,6 +124,7 @@
|
|
|
125
124
|
}
|
|
126
125
|
},
|
|
127
126
|
"devDependencies": {
|
|
127
|
+
"@expo/mcp-tunnel": "~0.2.1",
|
|
128
128
|
"@expo/multipart-body-parser": "^1.0.0",
|
|
129
129
|
"@expo/ngrok": "4.1.3",
|
|
130
130
|
"@graphql-codegen/cli": "^2.16.3",
|
|
@@ -156,7 +156,7 @@
|
|
|
156
156
|
"@types/ws": "^8.5.4",
|
|
157
157
|
"devtools-protocol": "^0.0.1113120",
|
|
158
158
|
"expo-atlas": "^0.4.1",
|
|
159
|
-
"expo-module-scripts": "^5.0.
|
|
159
|
+
"expo-module-scripts": "^5.0.8",
|
|
160
160
|
"find-process": "^1.4.7",
|
|
161
161
|
"jest-runner-tsd": "^6.0.0",
|
|
162
162
|
"klaw-sync": "^6.0.0",
|
|
@@ -169,5 +169,5 @@
|
|
|
169
169
|
"tree-kill": "^1.2.2",
|
|
170
170
|
"tsd": "^0.28.1"
|
|
171
171
|
},
|
|
172
|
-
"gitHead": "
|
|
172
|
+
"gitHead": "172a69f5f70c1d0e043e1532f924de97210cabc3"
|
|
173
173
|
}
|