@expo/cli 0.16.7 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/bin/cli +4 -3
- package/build/bin/cli.map +1 -1
- package/build/src/customize/customizeAsync.js +2 -1
- package/build/src/customize/customizeAsync.js.map +1 -1
- package/build/src/customize/typescript.js +1 -1
- package/build/src/customize/typescript.js.map +1 -1
- package/build/src/export/resolveOptions.js +7 -5
- package/build/src/export/resolveOptions.js.map +1 -1
- package/build/src/export/web/exportWebAsync.js +1 -1
- package/build/src/export/web/exportWebAsync.js.map +1 -1
- package/build/src/export/web/index.js +1 -1
- package/build/src/export/web/index.js.map +1 -1
- package/build/src/install/installAsync.js +1 -5
- package/build/src/install/installAsync.js.map +1 -1
- package/build/src/prebuild/configureProjectAsync.js +7 -1
- package/build/src/prebuild/configureProjectAsync.js.map +1 -1
- package/build/src/prebuild/prebuildAsync.js +3 -2
- package/build/src/prebuild/prebuildAsync.js.map +1 -1
- package/build/src/prebuild/resolveTemplate.js +41 -48
- package/build/src/prebuild/resolveTemplate.js.map +1 -1
- package/build/src/prebuild/updateFromTemplate.js +9 -8
- package/build/src/prebuild/updateFromTemplate.js.map +1 -1
- package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js +4 -12
- package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js.map +1 -1
- package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js +6 -1
- package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js.map +1 -1
- package/build/src/start/platforms/android/ADBServer.js +7 -0
- package/build/src/start/platforms/android/ADBServer.js.map +1 -1
- package/build/src/start/platforms/android/adb.js +4 -3
- package/build/src/start/platforms/android/adb.js.map +1 -1
- package/build/src/start/server/DevServerManager.js +2 -2
- package/build/src/start/server/DevServerManager.js.map +1 -1
- package/build/src/start/server/metro/MetroBundlerDevServer.js +30 -18
- package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
- package/build/src/start/server/metro/createServerRouteMiddleware.js +18 -7
- package/build/src/start/server/metro/createServerRouteMiddleware.js.map +1 -1
- package/build/src/start/server/metro/instantiateMetro.js +5 -7
- package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
- package/build/src/start/server/metro/router.js +17 -0
- package/build/src/start/server/metro/router.js.map +1 -1
- package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js +1 -1
- package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js.map +1 -1
- package/build/src/start/server/metro/withMetroMultiPlatform.js +7 -4
- package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
- package/build/src/start/server/middleware/CorsMiddleware.js +55 -0
- package/build/src/start/server/middleware/CorsMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/ManifestMiddleware.js +5 -5
- package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
- package/build/src/start/server/platformBundlers.js +18 -5
- package/build/src/start/server/platformBundlers.js.map +1 -1
- package/build/src/start/server/type-generation/__typetests__/fixtures/basic.js.map +1 -1
- package/build/src/start/server/type-generation/routes.js +1 -1
- package/build/src/start/server/type-generation/routes.js.map +1 -1
- package/build/src/start/startAsync.js +1 -1
- package/build/src/start/startAsync.js.map +1 -1
- package/build/src/utils/analytics/rudderstackClient.js +2 -2
- package/build/src/utils/env.js +3 -0
- package/build/src/utils/env.js.map +1 -1
- package/build/src/utils/npm.js +12 -4
- package/build/src/utils/npm.js.map +1 -1
- package/build/src/utils/resolveArgs.js +8 -2
- package/build/src/utils/resolveArgs.js.map +1 -1
- package/package.json +3 -3
- package/build/src/start/server/middleware/remoteDevtoolsCorsMiddleware.js +0 -31
- package/build/src/start/server/middleware/remoteDevtoolsCorsMiddleware.js.map +0 -1
- package/build/src/start/server/middleware/remoteDevtoolsSecurityHeadersMiddleware.js +0 -17
- package/build/src/start/server/middleware/remoteDevtoolsSecurityHeadersMiddleware.js.map +0 -1
|
@@ -3,16 +3,17 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
5
|
exports.createRouteHandlerMiddleware = createRouteHandlerMiddleware;
|
|
6
|
-
var _server = require("@expo/server");
|
|
7
|
-
var _http = require("@expo/server/build/vendor/http");
|
|
8
6
|
var _requireFromString = _interopRequireDefault(require("require-from-string"));
|
|
9
7
|
var _resolve = _interopRequireDefault(require("resolve"));
|
|
8
|
+
var _resolveFrom = _interopRequireDefault(require("resolve-from"));
|
|
10
9
|
var _util = require("util");
|
|
11
10
|
var _metroBundlerDevServer = require("./MetroBundlerDevServer");
|
|
12
11
|
var _bundleApiRoutes = require("./bundleApiRoutes");
|
|
13
12
|
var _fetchRouterManifest = require("./fetchRouterManifest");
|
|
14
13
|
var _metroErrorInterface = require("./metroErrorInterface");
|
|
14
|
+
var _router = require("./router");
|
|
15
15
|
var _log = require("../../../log");
|
|
16
|
+
var _errors = require("../../../utils/errors");
|
|
16
17
|
function _interopRequireDefault(obj) {
|
|
17
18
|
return obj && obj.__esModule ? obj : {
|
|
18
19
|
default: obj
|
|
@@ -21,7 +22,12 @@ function _interopRequireDefault(obj) {
|
|
|
21
22
|
const debug = require("debug")("expo:start:server:metro");
|
|
22
23
|
const resolveAsync = (0, _util).promisify(_resolve.default);
|
|
23
24
|
function createRouteHandlerMiddleware(projectRoot, options) {
|
|
24
|
-
|
|
25
|
+
if (!_resolveFrom.default.silent(projectRoot, "expo-router")) {
|
|
26
|
+
throw new _errors.CommandError("static and server rendering requires the expo-router package to be installed in your project.");
|
|
27
|
+
}
|
|
28
|
+
const { ExpoResponse } = require("expo-router/server");
|
|
29
|
+
const { createRequestHandler } = require("@expo/server/build/vendor/http");
|
|
30
|
+
return createRequestHandler({
|
|
25
31
|
build: ""
|
|
26
32
|
}, {
|
|
27
33
|
async getRoutesManifest () {
|
|
@@ -50,7 +56,7 @@ function createRouteHandlerMiddleware(projectRoot, options) {
|
|
|
50
56
|
} catch (error) {
|
|
51
57
|
// Forward the Metro server response as-is. It won't be pretty, but at least it will be accurate.
|
|
52
58
|
if (error instanceof _metroBundlerDevServer.ForwardHtmlError) {
|
|
53
|
-
return new
|
|
59
|
+
return new ExpoResponse(error.html, {
|
|
54
60
|
status: error.statusCode,
|
|
55
61
|
headers: {
|
|
56
62
|
"Content-Type": "text/html"
|
|
@@ -58,7 +64,7 @@ function createRouteHandlerMiddleware(projectRoot, options) {
|
|
|
58
64
|
});
|
|
59
65
|
}
|
|
60
66
|
try {
|
|
61
|
-
return new
|
|
67
|
+
return new ExpoResponse(await (0, _metroErrorInterface).getErrorOverlayHtmlAsync({
|
|
62
68
|
error,
|
|
63
69
|
projectRoot,
|
|
64
70
|
routerRoot: options.routerRoot
|
|
@@ -70,7 +76,7 @@ function createRouteHandlerMiddleware(projectRoot, options) {
|
|
|
70
76
|
});
|
|
71
77
|
} catch (staticError) {
|
|
72
78
|
// Fallback error for when Expo Router is misconfigured in the project.
|
|
73
|
-
return new
|
|
79
|
+
return new ExpoResponse("<span><h3>Internal Error:</h3><b>Project is not setup correctly for static rendering (check terminal for more info):</b><br/>" + error.message + "<br/><br/>" + staticError.message + "</span>", {
|
|
74
80
|
status: 500,
|
|
75
81
|
headers: {
|
|
76
82
|
"Content-Type": "text/html"
|
|
@@ -85,6 +91,11 @@ function createRouteHandlerMiddleware(projectRoot, options) {
|
|
|
85
91
|
});
|
|
86
92
|
},
|
|
87
93
|
async getApiRoute (route) {
|
|
94
|
+
var ref;
|
|
95
|
+
const { exp } = options.config;
|
|
96
|
+
if (((ref = exp.web) == null ? void 0 : ref.output) !== "server") {
|
|
97
|
+
(0, _router).warnInvalidWebOutput();
|
|
98
|
+
}
|
|
88
99
|
const resolvedFunctionPath = await resolveAsync(route.page, {
|
|
89
100
|
extensions: [
|
|
90
101
|
".js",
|
|
@@ -111,7 +122,7 @@ function createRouteHandlerMiddleware(projectRoot, options) {
|
|
|
111
122
|
} else {
|
|
112
123
|
_log.Log.error("Failed to load middleware: " + error);
|
|
113
124
|
}
|
|
114
|
-
return new
|
|
125
|
+
return new ExpoResponse("Failed to load middleware: " + resolvedFunctionPath + "\n\n" + error.message, {
|
|
115
126
|
status: 500,
|
|
116
127
|
headers: {
|
|
117
128
|
"Content-Type": "text/html"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/createServerRouteMiddleware.ts"],"sourcesContent":["/**\n * Copyright © 2022 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { ExpoResponse } from '@expo/server';\nimport { createRequestHandler } from '@expo/server/build/vendor/http';\nimport requireString from 'require-from-string';\nimport resolve from 'resolve';\nimport { promisify } from 'util';\n\nimport { ForwardHtmlError } from './MetroBundlerDevServer';\nimport { bundleApiRoute } from './bundleApiRoutes';\nimport { fetchManifest } from './fetchRouterManifest';\nimport { getErrorOverlayHtmlAsync, logMetroError, logMetroErrorAsync } from './metroErrorInterface';\nimport { Log } from '../../../log';\n\nconst debug = require('debug')('expo:start:server:metro') as typeof console.log;\n\nconst resolveAsync = promisify(resolve) as any as (\n id: string,\n opts: resolve.AsyncOpts\n) => Promise<string | null>;\n\nexport function createRouteHandlerMiddleware(\n projectRoot: string,\n options: {\n mode?: string;\n appDir: string;\n routerRoot: string;\n port?: number;\n baseUrl: string;\n getWebBundleUrl: () => string;\n getStaticPageAsync: (pathname: string) => Promise<{ content: string }>;\n }\n) {\n return createRequestHandler(\n { build: '' },\n {\n async getRoutesManifest() {\n const manifest = await fetchManifest<RegExp>(projectRoot, options);\n debug('manifest', manifest);\n // NOTE: no app dir if null\n // TODO: Redirect to 404 page\n return (\n manifest ?? {\n // Support the onboarding screen if there's no manifest\n htmlRoutes: [\n {\n file: 'index.js',\n page: '/index',\n routeKeys: {},\n namedRegex: /^\\/(?:index)?\\/?$/i,\n },\n ],\n apiRoutes: [],\n notFoundRoutes: [],\n }\n );\n },\n async getHtml(request) {\n try {\n const { content } = await options.getStaticPageAsync(request.url);\n return content;\n } catch (error: any) {\n // Forward the Metro server response as-is. It won't be pretty, but at least it will be accurate.\n if (error instanceof ForwardHtmlError) {\n return new ExpoResponse(error.html, {\n status: error.statusCode,\n headers: {\n 'Content-Type': 'text/html',\n },\n });\n }\n\n try {\n return new ExpoResponse(\n await getErrorOverlayHtmlAsync({\n error,\n projectRoot,\n routerRoot: options.routerRoot,\n }),\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n }\n );\n } catch (staticError: any) {\n // Fallback error for when Expo Router is misconfigured in the project.\n return new ExpoResponse(\n '<span><h3>Internal Error:</h3><b>Project is not setup correctly for static rendering (check terminal for more info):</b><br/>' +\n error.message +\n '<br/><br/>' +\n staticError.message +\n '</span>',\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n }\n );\n }\n }\n },\n logApiRouteExecutionError(error) {\n logMetroError(projectRoot, { error });\n },\n async getApiRoute(route) {\n const resolvedFunctionPath = await resolveAsync(route.page, {\n extensions: ['.js', '.jsx', '.ts', '.tsx'],\n basedir: options.appDir,\n });\n\n const middlewareContents = await bundleApiRoute(\n projectRoot,\n resolvedFunctionPath!,\n options\n );\n if (!middlewareContents) {\n // TODO: Error handling\n return null;\n }\n\n try {\n debug(`Bundling middleware at: ${resolvedFunctionPath}`);\n return requireString(middlewareContents);\n } catch (error: any) {\n if (error instanceof Error) {\n await logMetroErrorAsync({ projectRoot, error });\n } else {\n Log.error('Failed to load middleware: ' + error);\n }\n return new ExpoResponse(\n 'Failed to load middleware: ' + resolvedFunctionPath + '\\n\\n' + error.message,\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n }\n );\n }\n },\n }\n );\n}\n"],"names":["createRouteHandlerMiddleware","debug","require","resolveAsync","promisify","resolve","projectRoot","options","createRequestHandler","build","getRoutesManifest","manifest","fetchManifest","htmlRoutes","file","page","routeKeys","namedRegex","apiRoutes","notFoundRoutes","getHtml","request","content","getStaticPageAsync","url","error","ForwardHtmlError","ExpoResponse","html","status","statusCode","headers","getErrorOverlayHtmlAsync","routerRoot","staticError","message","logApiRouteExecutionError","logMetroError","getApiRoute","route","resolvedFunctionPath","extensions","basedir","appDir","middlewareContents","bundleApiRoute","requireString","Error","logMetroErrorAsync","Log"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/createServerRouteMiddleware.ts"],"sourcesContent":["/**\n * Copyright © 2022 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nimport type { ProjectConfig } from '@expo/config';\nimport requireString from 'require-from-string';\nimport resolve from 'resolve';\nimport resolveFrom from 'resolve-from';\nimport { promisify } from 'util';\n\nimport { ForwardHtmlError } from './MetroBundlerDevServer';\nimport { bundleApiRoute } from './bundleApiRoutes';\nimport { fetchManifest } from './fetchRouterManifest';\nimport { getErrorOverlayHtmlAsync, logMetroError, logMetroErrorAsync } from './metroErrorInterface';\nimport { warnInvalidWebOutput } from './router';\nimport { Log } from '../../../log';\nimport { CommandError } from '../../../utils/errors';\n\nconst debug = require('debug')('expo:start:server:metro') as typeof console.log;\n\nconst resolveAsync = promisify(resolve) as any as (\n id: string,\n opts: resolve.AsyncOpts\n) => Promise<string | null>;\n\nexport function createRouteHandlerMiddleware(\n projectRoot: string,\n options: {\n mode?: string;\n appDir: string;\n routerRoot: string;\n port?: number;\n baseUrl: string;\n getWebBundleUrl: () => string;\n getStaticPageAsync: (pathname: string) => Promise<{ content: string }>;\n config: ProjectConfig;\n }\n) {\n if (!resolveFrom.silent(projectRoot, 'expo-router')) {\n throw new CommandError(\n 'static and server rendering requires the expo-router package to be installed in your project.'\n );\n }\n\n const { ExpoResponse } = require('expo-router/server') as typeof import('expo-router/server');\n const { createRequestHandler } =\n require('@expo/server/build/vendor/http') as typeof import('@expo/server/build/vendor/http');\n\n return createRequestHandler(\n { build: '' },\n {\n async getRoutesManifest() {\n const manifest = await fetchManifest<RegExp>(projectRoot, options);\n debug('manifest', manifest);\n // NOTE: no app dir if null\n // TODO: Redirect to 404 page\n return (\n manifest ?? {\n // Support the onboarding screen if there's no manifest\n htmlRoutes: [\n {\n file: 'index.js',\n page: '/index',\n routeKeys: {},\n namedRegex: /^\\/(?:index)?\\/?$/i,\n },\n ],\n apiRoutes: [],\n notFoundRoutes: [],\n }\n );\n },\n async getHtml(request) {\n try {\n const { content } = await options.getStaticPageAsync(request.url);\n return content;\n } catch (error: any) {\n // Forward the Metro server response as-is. It won't be pretty, but at least it will be accurate.\n if (error instanceof ForwardHtmlError) {\n return new ExpoResponse(error.html, {\n status: error.statusCode,\n headers: {\n 'Content-Type': 'text/html',\n },\n });\n }\n\n try {\n return new ExpoResponse(\n await getErrorOverlayHtmlAsync({\n error,\n projectRoot,\n routerRoot: options.routerRoot,\n }),\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n }\n );\n } catch (staticError: any) {\n // Fallback error for when Expo Router is misconfigured in the project.\n return new ExpoResponse(\n '<span><h3>Internal Error:</h3><b>Project is not setup correctly for static rendering (check terminal for more info):</b><br/>' +\n error.message +\n '<br/><br/>' +\n staticError.message +\n '</span>',\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n }\n );\n }\n }\n },\n logApiRouteExecutionError(error) {\n logMetroError(projectRoot, { error });\n },\n async getApiRoute(route) {\n const { exp } = options.config;\n if (exp.web?.output !== 'server') {\n warnInvalidWebOutput();\n }\n\n const resolvedFunctionPath = await resolveAsync(route.page, {\n extensions: ['.js', '.jsx', '.ts', '.tsx'],\n basedir: options.appDir,\n });\n\n const middlewareContents = await bundleApiRoute(\n projectRoot,\n resolvedFunctionPath!,\n options\n );\n if (!middlewareContents) {\n // TODO: Error handling\n return null;\n }\n\n try {\n debug(`Bundling middleware at: ${resolvedFunctionPath}`);\n return requireString(middlewareContents);\n } catch (error: any) {\n if (error instanceof Error) {\n await logMetroErrorAsync({ projectRoot, error });\n } else {\n Log.error('Failed to load middleware: ' + error);\n }\n return new ExpoResponse(\n 'Failed to load middleware: ' + resolvedFunctionPath + '\\n\\n' + error.message,\n {\n status: 500,\n headers: {\n 'Content-Type': 'text/html',\n },\n }\n );\n }\n },\n }\n );\n}\n"],"names":["createRouteHandlerMiddleware","debug","require","resolveAsync","promisify","resolve","projectRoot","options","resolveFrom","silent","CommandError","ExpoResponse","createRequestHandler","build","getRoutesManifest","manifest","fetchManifest","htmlRoutes","file","page","routeKeys","namedRegex","apiRoutes","notFoundRoutes","getHtml","request","content","getStaticPageAsync","url","error","ForwardHtmlError","html","status","statusCode","headers","getErrorOverlayHtmlAsync","routerRoot","staticError","message","logApiRouteExecutionError","logMetroError","getApiRoute","route","exp","config","web","output","warnInvalidWebOutput","resolvedFunctionPath","extensions","basedir","appDir","middlewareContents","bundleApiRoute","requireString","Error","logMetroErrorAsync","Log"],"mappings":"AAOA;;;;QAqBgBA,4BAA4B,GAA5BA,4BAA4B;AApBlB,IAAA,kBAAqB,kCAArB,qBAAqB,EAAA;AAC3B,IAAA,QAAS,kCAAT,SAAS,EAAA;AACL,IAAA,YAAc,kCAAd,cAAc,EAAA;AACZ,IAAA,KAAM,WAAN,MAAM,CAAA;AAEC,IAAA,sBAAyB,WAAzB,yBAAyB,CAAA;AAC3B,IAAA,gBAAmB,WAAnB,mBAAmB,CAAA;AACpB,IAAA,oBAAuB,WAAvB,uBAAuB,CAAA;AACuB,IAAA,oBAAuB,WAAvB,uBAAuB,CAAA;AAC9D,IAAA,OAAU,WAAV,UAAU,CAAA;AAC3B,IAAA,IAAc,WAAd,cAAc,CAAA;AACL,IAAA,OAAuB,WAAvB,uBAAuB,CAAA;;;;;;AAEpD,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,yBAAyB,CAAC,AAAsB,AAAC;AAEhF,MAAMC,YAAY,GAAGC,CAAAA,GAAAA,KAAS,AAAS,CAAA,UAAT,CAACC,QAAO,QAAA,CAAC,AAGZ,AAAC;AAErB,SAASL,4BAA4B,CAC1CM,WAAmB,EACnBC,OASC,EACD;IACA,IAAI,CAACC,YAAW,QAAA,CAACC,MAAM,CAACH,WAAW,EAAE,aAAa,CAAC,EAAE;QACnD,MAAM,IAAII,OAAY,aAAA,CACpB,+FAA+F,CAChG,CAAC;KACH;IAED,MAAM,EAAEC,YAAY,CAAA,EAAE,GAAGT,OAAO,CAAC,oBAAoB,CAAC,AAAuC,AAAC;IAC9F,MAAM,EAAEU,oBAAoB,CAAA,EAAE,GAC5BV,OAAO,CAAC,gCAAgC,CAAC,AAAmD,AAAC;IAE/F,OAAOU,oBAAoB,CACzB;QAAEC,KAAK,EAAE,EAAE;KAAE,EACb;QACE,MAAMC,iBAAiB,IAAG;YACxB,MAAMC,QAAQ,GAAG,MAAMC,CAAAA,GAAAA,oBAAa,AAA8B,CAAA,cAA9B,CAASV,WAAW,EAAEC,OAAO,CAAC,AAAC;YACnEN,KAAK,CAAC,UAAU,EAAEc,QAAQ,CAAC,CAAC;YAC5B,2BAA2B;YAC3B,6BAA6B;YAC7B,OACEA,QAAQ,WAARA,QAAQ,GAAI;gBACV,uDAAuD;gBACvDE,UAAU,EAAE;oBACV;wBACEC,IAAI,EAAE,UAAU;wBAChBC,IAAI,EAAE,QAAQ;wBACdC,SAAS,EAAE,EAAE;wBACbC,UAAU,sBAAsB;qBACjC;iBACF;gBACDC,SAAS,EAAE,EAAE;gBACbC,cAAc,EAAE,EAAE;aACnB,CACD;SACH;QACD,MAAMC,OAAO,EAACC,OAAO,EAAE;YACrB,IAAI;gBACF,MAAM,EAAEC,OAAO,CAAA,EAAE,GAAG,MAAMnB,OAAO,CAACoB,kBAAkB,CAACF,OAAO,CAACG,GAAG,CAAC,AAAC;gBAClE,OAAOF,OAAO,CAAC;aAChB,CAAC,OAAOG,KAAK,EAAO;gBACnB,iGAAiG;gBACjG,IAAIA,KAAK,YAAYC,sBAAgB,iBAAA,EAAE;oBACrC,OAAO,IAAInB,YAAY,CAACkB,KAAK,CAACE,IAAI,EAAE;wBAClCC,MAAM,EAAEH,KAAK,CAACI,UAAU;wBACxBC,OAAO,EAAE;4BACP,cAAc,EAAE,WAAW;yBAC5B;qBACF,CAAC,CAAC;iBACJ;gBAED,IAAI;oBACF,OAAO,IAAIvB,YAAY,CACrB,MAAMwB,CAAAA,GAAAA,oBAAwB,AAI5B,CAAA,yBAJ4B,CAAC;wBAC7BN,KAAK;wBACLvB,WAAW;wBACX8B,UAAU,EAAE7B,OAAO,CAAC6B,UAAU;qBAC/B,CAAC,EACF;wBACEJ,MAAM,EAAE,GAAG;wBACXE,OAAO,EAAE;4BACP,cAAc,EAAE,WAAW;yBAC5B;qBACF,CACF,CAAC;iBACH,CAAC,OAAOG,WAAW,EAAO;oBACzB,uEAAuE;oBACvE,OAAO,IAAI1B,YAAY,CACrB,+HAA+H,GAC7HkB,KAAK,CAACS,OAAO,GACb,YAAY,GACZD,WAAW,CAACC,OAAO,GACnB,SAAS,EACX;wBACEN,MAAM,EAAE,GAAG;wBACXE,OAAO,EAAE;4BACP,cAAc,EAAE,WAAW;yBAC5B;qBACF,CACF,CAAC;iBACH;aACF;SACF;QACDK,yBAAyB,EAACV,KAAK,EAAE;YAC/BW,CAAAA,GAAAA,oBAAa,AAAwB,CAAA,cAAxB,CAAClC,WAAW,EAAE;gBAAEuB,KAAK;aAAE,CAAC,CAAC;SACvC;QACD,MAAMY,WAAW,EAACC,KAAK,EAAE;gBAEnBC,GAAO;YADX,MAAM,EAAEA,GAAG,CAAA,EAAE,GAAGpC,OAAO,CAACqC,MAAM,AAAC;YAC/B,IAAID,CAAAA,CAAAA,GAAO,GAAPA,GAAG,CAACE,GAAG,SAAQ,GAAfF,KAAAA,CAAe,GAAfA,GAAO,CAAEG,MAAM,CAAA,KAAK,QAAQ,EAAE;gBAChCC,CAAAA,GAAAA,OAAoB,AAAE,CAAA,qBAAF,EAAE,CAAC;aACxB;YAED,MAAMC,oBAAoB,GAAG,MAAM7C,YAAY,CAACuC,KAAK,CAACvB,IAAI,EAAE;gBAC1D8B,UAAU,EAAE;oBAAC,KAAK;oBAAE,MAAM;oBAAE,KAAK;oBAAE,MAAM;iBAAC;gBAC1CC,OAAO,EAAE3C,OAAO,CAAC4C,MAAM;aACxB,CAAC,AAAC;YAEH,MAAMC,kBAAkB,GAAG,MAAMC,CAAAA,GAAAA,gBAAc,AAI9C,CAAA,eAJ8C,CAC7C/C,WAAW,EACX0C,oBAAoB,EACpBzC,OAAO,CACR,AAAC;YACF,IAAI,CAAC6C,kBAAkB,EAAE;gBACvB,uBAAuB;gBACvB,OAAO,IAAI,CAAC;aACb;YAED,IAAI;gBACFnD,KAAK,CAAC,CAAC,wBAAwB,EAAE+C,oBAAoB,CAAC,CAAC,CAAC,CAAC;gBACzD,OAAOM,CAAAA,GAAAA,kBAAa,AAAoB,CAAA,QAApB,CAACF,kBAAkB,CAAC,CAAC;aAC1C,CAAC,OAAOvB,KAAK,EAAO;gBACnB,IAAIA,KAAK,YAAY0B,KAAK,EAAE;oBAC1B,MAAMC,CAAAA,GAAAA,oBAAkB,AAAwB,CAAA,mBAAxB,CAAC;wBAAElD,WAAW;wBAAEuB,KAAK;qBAAE,CAAC,CAAC;iBAClD,MAAM;oBACL4B,IAAG,IAAA,CAAC5B,KAAK,CAAC,6BAA6B,GAAGA,KAAK,CAAC,CAAC;iBAClD;gBACD,OAAO,IAAIlB,YAAY,CACrB,6BAA6B,GAAGqC,oBAAoB,GAAG,MAAM,GAAGnB,KAAK,CAACS,OAAO,EAC7E;oBACEN,MAAM,EAAE,GAAG;oBACXE,OAAO,EAAE;wBACP,cAAc,EAAE,WAAW;qBAC5B;iBACF,CACF,CAAC;aACH;SACF;KACF,CACF,CAAC;CACH"}
|
|
@@ -21,11 +21,10 @@ var _getMetroProperties = require("../../../utils/analytics/getMetroProperties")
|
|
|
21
21
|
var _metroDebuggerMiddleware = require("../../../utils/analytics/metroDebuggerMiddleware");
|
|
22
22
|
var _rudderstackClient = require("../../../utils/analytics/rudderstackClient");
|
|
23
23
|
var _env = require("../../../utils/env");
|
|
24
|
+
var _corsMiddleware = require("../middleware/CorsMiddleware");
|
|
24
25
|
var _manifestMiddleware = require("../middleware/ManifestMiddleware");
|
|
25
26
|
var _createJsInspectorMiddleware = require("../middleware/inspector/createJsInspectorMiddleware");
|
|
26
27
|
var _mutations = require("../middleware/mutations");
|
|
27
|
-
var _remoteDevtoolsCorsMiddleware = require("../middleware/remoteDevtoolsCorsMiddleware");
|
|
28
|
-
var _remoteDevtoolsSecurityHeadersMiddleware = require("../middleware/remoteDevtoolsSecurityHeadersMiddleware");
|
|
29
28
|
var _suppressErrorMiddleware = require("../middleware/suppressErrorMiddleware");
|
|
30
29
|
var _platformBundlers = require("../platformBundlers");
|
|
31
30
|
function _interopRequireDefault(obj) {
|
|
@@ -92,10 +91,11 @@ async function loadMetroConfigAsync(projectRoot, options, { exp =(0, _config).ge
|
|
|
92
91
|
config.transformer.publicPath = (ref5 = exp.experiments) == null ? void 0 : ref5.baseUrl;
|
|
93
92
|
}
|
|
94
93
|
}
|
|
95
|
-
const platformBundlers = (0, _platformBundlers).getPlatformBundlers(exp);
|
|
94
|
+
const platformBundlers = (0, _platformBundlers).getPlatformBundlers(projectRoot, exp);
|
|
96
95
|
var ref6, ref7;
|
|
97
96
|
config = await (0, _withMetroMultiPlatform).withMetroMultiPlatformAsync(projectRoot, {
|
|
98
97
|
config,
|
|
98
|
+
exp,
|
|
99
99
|
platformBundlers,
|
|
100
100
|
isTsconfigPathsEnabled: (ref6 = (ref = exp.experiments) == null ? void 0 : ref.tsconfigPaths) != null ? ref6 : true,
|
|
101
101
|
webOutput: (ref7 = (ref1 = exp.web) == null ? void 0 : ref1.output) != null ? ref7 : "single",
|
|
@@ -127,10 +127,8 @@ async function instantiateMetroAsync(metroBundler, options, { isExporting }) {
|
|
|
127
127
|
port: metroConfig.server.port,
|
|
128
128
|
watchFolders: metroConfig.watchFolders
|
|
129
129
|
});
|
|
130
|
-
// securityHeadersMiddleware does not support cross-origin requests
|
|
131
|
-
|
|
132
|
-
(0, _mutations).replaceMiddlewareWith(middleware, securityHeadersMiddleware, _remoteDevtoolsSecurityHeadersMiddleware.remoteDevtoolsSecurityHeadersMiddleware);
|
|
133
|
-
middleware.use(_remoteDevtoolsCorsMiddleware.remoteDevtoolsCorsMiddleware);
|
|
130
|
+
// The `securityHeadersMiddleware` does not support cross-origin requests, we replace with the enhanced version.
|
|
131
|
+
(0, _mutations).replaceMiddlewareWith(middleware, securityHeadersMiddleware, (0, _corsMiddleware).createCorsMiddleware(exp));
|
|
134
132
|
(0, _mutations).prependMiddleware(middleware, _suppressErrorMiddleware.suppressRemoteDebuggingErrorMiddleware);
|
|
135
133
|
// TODO: We can probably drop this now.
|
|
136
134
|
const customEnhanceMiddleware = metroConfig.server.enhanceMiddleware;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport { getDefaultConfig, LoadOptions } from '@expo/metro-config';\nimport chalk from 'chalk';\nimport { Server as ConnectServer } from 'connect';\nimport http from 'http';\nimport type Metro from 'metro';\nimport { loadConfig, resolveConfig, ConfigT } from 'metro-config';\nimport { Terminal } from 'metro-core';\nimport semver from 'semver';\nimport { URL } from 'url';\n\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { createDebugMiddleware } from './debugging/createDebugMiddleware';\nimport { runServer } from './runServer-fork';\nimport { withMetroMultiPlatformAsync } from './withMetroMultiPlatform';\nimport { MetroDevServerOptions } from '../../../export/fork-bundleAsync';\nimport { Log } from '../../../log';\nimport { getMetroProperties } from '../../../utils/analytics/getMetroProperties';\nimport { createDebuggerTelemetryMiddleware } from '../../../utils/analytics/metroDebuggerMiddleware';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport { env } from '../../../utils/env';\nimport { getMetroServerRoot } from '../middleware/ManifestMiddleware';\nimport { createJsInspectorMiddleware } from '../middleware/inspector/createJsInspectorMiddleware';\nimport { prependMiddleware, replaceMiddlewareWith } from '../middleware/mutations';\nimport { remoteDevtoolsCorsMiddleware } from '../middleware/remoteDevtoolsCorsMiddleware';\nimport { remoteDevtoolsSecurityHeadersMiddleware } from '../middleware/remoteDevtoolsSecurityHeadersMiddleware';\nimport { ServerNext, ServerRequest, ServerResponse } from '../middleware/server.types';\nimport { suppressRemoteDebuggingErrorMiddleware } from '../middleware/suppressErrorMiddleware';\nimport { getPlatformBundlers } from '../platformBundlers';\n\n// From expo/dev-server but with ability to use custom logger.\ntype MessageSocket = {\n broadcast: (method: string, params?: Record<string, any> | undefined) => void;\n};\n\nfunction gteSdkVersion(exp: Pick<ExpoConfig, 'sdkVersion'>, sdkVersion: string): boolean {\n if (!exp.sdkVersion) {\n return false;\n }\n\n if (exp.sdkVersion === 'UNVERSIONED') {\n return true;\n }\n\n try {\n return semver.gte(exp.sdkVersion, sdkVersion);\n } catch {\n throw new Error(`${exp.sdkVersion} is not a valid version. Must be in the form of x.y.z`);\n }\n}\n\nexport async function loadMetroConfigAsync(\n projectRoot: string,\n options: LoadOptions,\n {\n exp = getConfig(projectRoot, { skipSDKVersionRequirement: true }).exp,\n isExporting,\n }: { exp?: ExpoConfig; isExporting: boolean }\n) {\n let reportEvent: ((event: any) => void) | undefined;\n const serverRoot = getMetroServerRoot(projectRoot);\n\n const terminal = new Terminal(process.stdout);\n const terminalReporter = new MetroTerminalReporter(serverRoot, terminal);\n\n const hasConfig = await resolveConfig(options.config, projectRoot);\n let config: ConfigT = {\n ...(await loadConfig(\n { cwd: projectRoot, projectRoot, ...options },\n // If the project does not have a metro.config.js, then we use the default config.\n hasConfig.isEmpty ? getDefaultConfig(projectRoot) : undefined\n )),\n reporter: {\n update(event: any) {\n terminalReporter.update(event);\n if (reportEvent) {\n reportEvent(event);\n }\n },\n },\n };\n\n if (\n // Requires SDK 50 for expo-assets hashAssetPlugin change.\n !exp.sdkVersion ||\n gteSdkVersion(exp, '50.0.0')\n ) {\n if (isExporting) {\n // This token will be used in the asset plugin to ensure the path is correct for writing locally.\n // @ts-expect-error: typed as readonly.\n config.transformer.publicPath = `/assets?export_path=${\n (exp.experiments?.baseUrl ?? '') + '/assets'\n }`;\n } else {\n // @ts-expect-error: typed as readonly\n config.transformer.publicPath = '/assets/?unstable_path=.';\n }\n } else {\n if (isExporting && exp.experiments?.baseUrl) {\n // This token will be used in the asset plugin to ensure the path is correct for writing locally.\n // @ts-expect-error: typed as readonly.\n config.transformer.publicPath = exp.experiments?.baseUrl;\n }\n }\n\n const platformBundlers = getPlatformBundlers(exp);\n\n config = await withMetroMultiPlatformAsync(projectRoot, {\n config,\n platformBundlers,\n isTsconfigPathsEnabled: exp.experiments?.tsconfigPaths ?? true,\n webOutput: exp.web?.output ?? 'single',\n isFastResolverEnabled: env.EXPO_USE_FAST_RESOLVER,\n isExporting,\n });\n\n if (process.env.NODE_ENV !== 'test') {\n logEventAsync('metro config', getMetroProperties(projectRoot, exp, config));\n }\n\n return {\n config,\n setEventReporter: (logger: (event: any) => void) => (reportEvent = logger),\n reporter: terminalReporter,\n };\n}\n\n/** The most generic possible setup for Metro bundler. */\nexport async function instantiateMetroAsync(\n metroBundler: MetroBundlerDevServer,\n options: Omit<MetroDevServerOptions, 'logger'>,\n { isExporting }: { isExporting: boolean }\n): Promise<{\n metro: Metro.Server;\n server: http.Server;\n middleware: any;\n messageSocket: MessageSocket;\n}> {\n const projectRoot = metroBundler.projectRoot;\n\n // TODO: When we bring expo/metro-config into the expo/expo repo, then we can upstream this.\n const { exp } = getConfig(projectRoot, {\n skipSDKVersionRequirement: true,\n });\n\n const { config: metroConfig, setEventReporter } = await loadMetroConfigAsync(\n projectRoot,\n options,\n { exp, isExporting }\n );\n\n const { createDevServerMiddleware, securityHeadersMiddleware } =\n require('@react-native-community/cli-server-api') as typeof import('@react-native-community/cli-server-api');\n\n const { middleware, messageSocketEndpoint, eventsSocketEndpoint, websocketEndpoints } =\n createDevServerMiddleware({\n port: metroConfig.server.port,\n watchFolders: metroConfig.watchFolders,\n });\n\n // securityHeadersMiddleware does not support cross-origin requests for remote devtools to get the sourcemap.\n // We replace with the enhanced version.\n replaceMiddlewareWith(\n middleware as ConnectServer,\n securityHeadersMiddleware,\n remoteDevtoolsSecurityHeadersMiddleware\n );\n\n middleware.use(remoteDevtoolsCorsMiddleware);\n\n prependMiddleware(middleware, suppressRemoteDebuggingErrorMiddleware);\n\n // TODO: We can probably drop this now.\n const customEnhanceMiddleware = metroConfig.server.enhanceMiddleware;\n // @ts-expect-error: can't mutate readonly config\n metroConfig.server.enhanceMiddleware = (metroMiddleware: any, server: Metro.Server) => {\n if (customEnhanceMiddleware) {\n metroMiddleware = customEnhanceMiddleware(metroMiddleware, server);\n }\n return middleware.use(metroMiddleware);\n };\n\n middleware.use(createDebuggerTelemetryMiddleware(projectRoot, exp));\n\n // Initialize all React Native debug features\n const { debugMiddleware, debugWebsocketEndpoints } = createDebugMiddleware(metroBundler);\n prependMiddleware(middleware, debugMiddleware);\n middleware.use('/_expo/debugger', createJsInspectorMiddleware());\n\n const { server, metro } = await runServer(metroBundler, metroConfig, {\n // @ts-expect-error: Inconsistent `websocketEndpoints` type between metro and @react-native-community/cli-server-api\n websocketEndpoints: {\n ...websocketEndpoints,\n ...debugWebsocketEndpoints,\n },\n watch: !isExporting && isWatchEnabled(),\n });\n\n prependMiddleware(middleware, (req: ServerRequest, res: ServerResponse, next: ServerNext) => {\n // If the URL is a Metro asset request, then we need to skip all other middleware to prevent\n // the community CLI's serve-static from hosting `/assets/index.html` in place of all assets if it exists.\n // /assets/?unstable_path=.\n if (req.url) {\n const url = new URL(req.url!, 'http://localhost:8000');\n if (url.pathname.match(/^\\/assets\\/?/) && url.searchParams.get('unstable_path') != null) {\n return metro.processRequest(req, res, next);\n }\n }\n return next();\n });\n\n setEventReporter(eventsSocketEndpoint.reportEvent);\n\n return {\n metro,\n server,\n middleware,\n messageSocket: messageSocketEndpoint,\n };\n}\n\n/**\n * Simplify and communicate if Metro is running without watching file updates,.\n * Exposed for testing.\n */\nexport function isWatchEnabled() {\n if (env.CI) {\n Log.log(\n chalk`Metro is running in CI mode, reloads are disabled. Remove {bold CI=true} to enable watch mode.`\n );\n }\n\n return !env.CI;\n}\n"],"names":["loadMetroConfigAsync","instantiateMetroAsync","isWatchEnabled","gteSdkVersion","exp","sdkVersion","semver","gte","Error","projectRoot","options","getConfig","skipSDKVersionRequirement","isExporting","reportEvent","serverRoot","getMetroServerRoot","terminal","Terminal","process","stdout","terminalReporter","MetroTerminalReporter","hasConfig","resolveConfig","config","loadConfig","cwd","isEmpty","getDefaultConfig","undefined","reporter","update","event","transformer","publicPath","experiments","baseUrl","platformBundlers","getPlatformBundlers","withMetroMultiPlatformAsync","isTsconfigPathsEnabled","tsconfigPaths","webOutput","web","output","isFastResolverEnabled","env","EXPO_USE_FAST_RESOLVER","NODE_ENV","logEventAsync","getMetroProperties","setEventReporter","logger","metroBundler","metroConfig","createDevServerMiddleware","securityHeadersMiddleware","require","middleware","messageSocketEndpoint","eventsSocketEndpoint","websocketEndpoints","port","server","watchFolders","replaceMiddlewareWith","remoteDevtoolsSecurityHeadersMiddleware","use","remoteDevtoolsCorsMiddleware","prependMiddleware","suppressRemoteDebuggingErrorMiddleware","customEnhanceMiddleware","enhanceMiddleware","metroMiddleware","createDebuggerTelemetryMiddleware","debugMiddleware","debugWebsocketEndpoints","createDebugMiddleware","createJsInspectorMiddleware","metro","runServer","watch","req","res","next","url","URL","pathname","match","searchParams","get","processRequest","messageSocket","CI","Log","log","chalk"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport { getDefaultConfig, LoadOptions } from '@expo/metro-config';\nimport chalk from 'chalk';\nimport { Server as ConnectServer } from 'connect';\nimport http from 'http';\nimport type Metro from 'metro';\nimport { loadConfig, resolveConfig, ConfigT } from 'metro-config';\nimport { Terminal } from 'metro-core';\nimport semver from 'semver';\nimport { URL } from 'url';\n\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { createDebugMiddleware } from './debugging/createDebugMiddleware';\nimport { runServer } from './runServer-fork';\nimport { withMetroMultiPlatformAsync } from './withMetroMultiPlatform';\nimport { MetroDevServerOptions } from '../../../export/fork-bundleAsync';\nimport { Log } from '../../../log';\nimport { getMetroProperties } from '../../../utils/analytics/getMetroProperties';\nimport { createDebuggerTelemetryMiddleware } from '../../../utils/analytics/metroDebuggerMiddleware';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport { env } from '../../../utils/env';\nimport { createCorsMiddleware } from '../middleware/CorsMiddleware';\nimport { getMetroServerRoot } from '../middleware/ManifestMiddleware';\nimport { createJsInspectorMiddleware } from '../middleware/inspector/createJsInspectorMiddleware';\nimport { prependMiddleware, replaceMiddlewareWith } from '../middleware/mutations';\nimport { ServerNext, ServerRequest, ServerResponse } from '../middleware/server.types';\nimport { suppressRemoteDebuggingErrorMiddleware } from '../middleware/suppressErrorMiddleware';\nimport { getPlatformBundlers } from '../platformBundlers';\n\n// From expo/dev-server but with ability to use custom logger.\ntype MessageSocket = {\n broadcast: (method: string, params?: Record<string, any> | undefined) => void;\n};\n\nfunction gteSdkVersion(exp: Pick<ExpoConfig, 'sdkVersion'>, sdkVersion: string): boolean {\n if (!exp.sdkVersion) {\n return false;\n }\n\n if (exp.sdkVersion === 'UNVERSIONED') {\n return true;\n }\n\n try {\n return semver.gte(exp.sdkVersion, sdkVersion);\n } catch {\n throw new Error(`${exp.sdkVersion} is not a valid version. Must be in the form of x.y.z`);\n }\n}\n\nexport async function loadMetroConfigAsync(\n projectRoot: string,\n options: LoadOptions,\n {\n exp = getConfig(projectRoot, { skipSDKVersionRequirement: true }).exp,\n isExporting,\n }: { exp?: ExpoConfig; isExporting: boolean }\n) {\n let reportEvent: ((event: any) => void) | undefined;\n const serverRoot = getMetroServerRoot(projectRoot);\n\n const terminal = new Terminal(process.stdout);\n const terminalReporter = new MetroTerminalReporter(serverRoot, terminal);\n\n const hasConfig = await resolveConfig(options.config, projectRoot);\n let config: ConfigT = {\n ...(await loadConfig(\n { cwd: projectRoot, projectRoot, ...options },\n // If the project does not have a metro.config.js, then we use the default config.\n hasConfig.isEmpty ? getDefaultConfig(projectRoot) : undefined\n )),\n reporter: {\n update(event: any) {\n terminalReporter.update(event);\n if (reportEvent) {\n reportEvent(event);\n }\n },\n },\n };\n\n if (\n // Requires SDK 50 for expo-assets hashAssetPlugin change.\n !exp.sdkVersion ||\n gteSdkVersion(exp, '50.0.0')\n ) {\n if (isExporting) {\n // This token will be used in the asset plugin to ensure the path is correct for writing locally.\n // @ts-expect-error: typed as readonly.\n config.transformer.publicPath = `/assets?export_path=${\n (exp.experiments?.baseUrl ?? '') + '/assets'\n }`;\n } else {\n // @ts-expect-error: typed as readonly\n config.transformer.publicPath = '/assets/?unstable_path=.';\n }\n } else {\n if (isExporting && exp.experiments?.baseUrl) {\n // This token will be used in the asset plugin to ensure the path is correct for writing locally.\n // @ts-expect-error: typed as readonly.\n config.transformer.publicPath = exp.experiments?.baseUrl;\n }\n }\n\n const platformBundlers = getPlatformBundlers(projectRoot, exp);\n\n config = await withMetroMultiPlatformAsync(projectRoot, {\n config,\n exp,\n platformBundlers,\n isTsconfigPathsEnabled: exp.experiments?.tsconfigPaths ?? true,\n webOutput: exp.web?.output ?? 'single',\n isFastResolverEnabled: env.EXPO_USE_FAST_RESOLVER,\n isExporting,\n });\n\n if (process.env.NODE_ENV !== 'test') {\n logEventAsync('metro config', getMetroProperties(projectRoot, exp, config));\n }\n\n return {\n config,\n setEventReporter: (logger: (event: any) => void) => (reportEvent = logger),\n reporter: terminalReporter,\n };\n}\n\n/** The most generic possible setup for Metro bundler. */\nexport async function instantiateMetroAsync(\n metroBundler: MetroBundlerDevServer,\n options: Omit<MetroDevServerOptions, 'logger'>,\n { isExporting }: { isExporting: boolean }\n): Promise<{\n metro: Metro.Server;\n server: http.Server;\n middleware: any;\n messageSocket: MessageSocket;\n}> {\n const projectRoot = metroBundler.projectRoot;\n\n // TODO: When we bring expo/metro-config into the expo/expo repo, then we can upstream this.\n const { exp } = getConfig(projectRoot, {\n skipSDKVersionRequirement: true,\n });\n\n const { config: metroConfig, setEventReporter } = await loadMetroConfigAsync(\n projectRoot,\n options,\n { exp, isExporting }\n );\n\n const { createDevServerMiddleware, securityHeadersMiddleware } =\n require('@react-native-community/cli-server-api') as typeof import('@react-native-community/cli-server-api');\n\n const { middleware, messageSocketEndpoint, eventsSocketEndpoint, websocketEndpoints } =\n createDevServerMiddleware({\n port: metroConfig.server.port,\n watchFolders: metroConfig.watchFolders,\n });\n\n // The `securityHeadersMiddleware` does not support cross-origin requests, we replace with the enhanced version.\n replaceMiddlewareWith(\n middleware as ConnectServer,\n securityHeadersMiddleware,\n createCorsMiddleware(exp)\n );\n\n prependMiddleware(middleware, suppressRemoteDebuggingErrorMiddleware);\n\n // TODO: We can probably drop this now.\n const customEnhanceMiddleware = metroConfig.server.enhanceMiddleware;\n // @ts-expect-error: can't mutate readonly config\n metroConfig.server.enhanceMiddleware = (metroMiddleware: any, server: Metro.Server) => {\n if (customEnhanceMiddleware) {\n metroMiddleware = customEnhanceMiddleware(metroMiddleware, server);\n }\n return middleware.use(metroMiddleware);\n };\n\n middleware.use(createDebuggerTelemetryMiddleware(projectRoot, exp));\n\n // Initialize all React Native debug features\n const { debugMiddleware, debugWebsocketEndpoints } = createDebugMiddleware(metroBundler);\n prependMiddleware(middleware, debugMiddleware);\n middleware.use('/_expo/debugger', createJsInspectorMiddleware());\n\n const { server, metro } = await runServer(metroBundler, metroConfig, {\n // @ts-expect-error: Inconsistent `websocketEndpoints` type between metro and @react-native-community/cli-server-api\n websocketEndpoints: {\n ...websocketEndpoints,\n ...debugWebsocketEndpoints,\n },\n watch: !isExporting && isWatchEnabled(),\n });\n\n prependMiddleware(middleware, (req: ServerRequest, res: ServerResponse, next: ServerNext) => {\n // If the URL is a Metro asset request, then we need to skip all other middleware to prevent\n // the community CLI's serve-static from hosting `/assets/index.html` in place of all assets if it exists.\n // /assets/?unstable_path=.\n if (req.url) {\n const url = new URL(req.url!, 'http://localhost:8000');\n if (url.pathname.match(/^\\/assets\\/?/) && url.searchParams.get('unstable_path') != null) {\n return metro.processRequest(req, res, next);\n }\n }\n return next();\n });\n\n setEventReporter(eventsSocketEndpoint.reportEvent);\n\n return {\n metro,\n server,\n middleware,\n messageSocket: messageSocketEndpoint,\n };\n}\n\n/**\n * Simplify and communicate if Metro is running without watching file updates,.\n * Exposed for testing.\n */\nexport function isWatchEnabled() {\n if (env.CI) {\n Log.log(\n chalk`Metro is running in CI mode, reloads are disabled. Remove {bold CI=true} to enable watch mode.`\n );\n }\n\n return !env.CI;\n}\n"],"names":["loadMetroConfigAsync","instantiateMetroAsync","isWatchEnabled","gteSdkVersion","exp","sdkVersion","semver","gte","Error","projectRoot","options","getConfig","skipSDKVersionRequirement","isExporting","reportEvent","serverRoot","getMetroServerRoot","terminal","Terminal","process","stdout","terminalReporter","MetroTerminalReporter","hasConfig","resolveConfig","config","loadConfig","cwd","isEmpty","getDefaultConfig","undefined","reporter","update","event","transformer","publicPath","experiments","baseUrl","platformBundlers","getPlatformBundlers","withMetroMultiPlatformAsync","isTsconfigPathsEnabled","tsconfigPaths","webOutput","web","output","isFastResolverEnabled","env","EXPO_USE_FAST_RESOLVER","NODE_ENV","logEventAsync","getMetroProperties","setEventReporter","logger","metroBundler","metroConfig","createDevServerMiddleware","securityHeadersMiddleware","require","middleware","messageSocketEndpoint","eventsSocketEndpoint","websocketEndpoints","port","server","watchFolders","replaceMiddlewareWith","createCorsMiddleware","prependMiddleware","suppressRemoteDebuggingErrorMiddleware","customEnhanceMiddleware","enhanceMiddleware","metroMiddleware","use","createDebuggerTelemetryMiddleware","debugMiddleware","debugWebsocketEndpoints","createDebugMiddleware","createJsInspectorMiddleware","metro","runServer","watch","req","res","next","url","URL","pathname","match","searchParams","get","processRequest","messageSocket","CI","Log","log","chalk"],"mappings":"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"}
|
|
@@ -5,8 +5,11 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
exports.getAppRouterRelativeEntryPath = getAppRouterRelativeEntryPath;
|
|
6
6
|
exports.getRouterDirectoryModuleIdWithManifest = getRouterDirectoryModuleIdWithManifest;
|
|
7
7
|
exports.getRouterDirectory = getRouterDirectory;
|
|
8
|
+
exports.isApiRouteConvention = isApiRouteConvention;
|
|
8
9
|
exports.getApiRoutesForDirectory = getApiRoutesForDirectory;
|
|
9
10
|
exports.getRoutePaths = getRoutePaths;
|
|
11
|
+
exports.hasWarnedAboutApiRoutes = hasWarnedAboutApiRoutes;
|
|
12
|
+
exports.warnInvalidWebOutput = warnInvalidWebOutput;
|
|
10
13
|
var _chalk = _interopRequireDefault(require("chalk"));
|
|
11
14
|
var _glob = require("glob");
|
|
12
15
|
var _path = _interopRequireDefault(require("path"));
|
|
@@ -14,6 +17,7 @@ var _resolveFrom = _interopRequireDefault(require("resolve-from"));
|
|
|
14
17
|
var _log = require("../../../log");
|
|
15
18
|
var _dir = require("../../../utils/dir");
|
|
16
19
|
var _fn = require("../../../utils/fn");
|
|
20
|
+
var _link = require("../../../utils/link");
|
|
17
21
|
function _interopRequireDefault(obj) {
|
|
18
22
|
return obj && obj.__esModule ? obj : {
|
|
19
23
|
default: obj
|
|
@@ -56,6 +60,9 @@ function getRouterDirectory(projectRoot) {
|
|
|
56
60
|
debug("Using app as the root directory for Expo Router.");
|
|
57
61
|
return "app";
|
|
58
62
|
}
|
|
63
|
+
function isApiRouteConvention(name) {
|
|
64
|
+
return /\+api\.[tj]sx?$/.test(name);
|
|
65
|
+
}
|
|
59
66
|
function getApiRoutesForDirectory(cwd) {
|
|
60
67
|
return (0, _glob).sync("**/*+api.@(ts|tsx|js|jsx)", {
|
|
61
68
|
cwd,
|
|
@@ -71,5 +78,15 @@ function getRoutePaths(cwd) {
|
|
|
71
78
|
function normalizePaths(p) {
|
|
72
79
|
return p.replace(/\\/g, "/");
|
|
73
80
|
}
|
|
81
|
+
let hasWarnedAboutApiRouteOutput = false;
|
|
82
|
+
function hasWarnedAboutApiRoutes() {
|
|
83
|
+
return hasWarnedAboutApiRouteOutput;
|
|
84
|
+
}
|
|
85
|
+
function warnInvalidWebOutput() {
|
|
86
|
+
if (!hasWarnedAboutApiRouteOutput) {
|
|
87
|
+
_log.Log.warn(_chalk.default.yellow`Using API routes requires the {bold web.output} to be set to {bold "server"} in the project {bold app.json}. ${(0, _link).learnMore("https://docs.expo.dev/router/reference/api-routes/")}`);
|
|
88
|
+
}
|
|
89
|
+
hasWarnedAboutApiRouteOutput = true;
|
|
90
|
+
}
|
|
74
91
|
|
|
75
92
|
//# sourceMappingURL=router.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/router.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config';\nimport chalk from 'chalk';\nimport { sync as globSync } from 'glob';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { Log } from '../../../log';\nimport { directoryExistsSync } from '../../../utils/dir';\nimport { memoize } from '../../../utils/fn';\n\nconst debug = require('debug')('expo:start:server:metro:router') as typeof console.log;\n\n/**\n * Get the relative path for requiring the `/app` folder relative to the `expo-router/entry` file.\n * This mechanism does require the server to restart after the `expo-router` package is installed.\n */\nexport function getAppRouterRelativeEntryPath(\n projectRoot: string,\n routerDirectory: string = getRouterDirectory(projectRoot)\n): string | undefined {\n // Auto pick App entry\n const routerEntry =\n resolveFrom.silent(projectRoot, 'expo-router/entry') ?? getFallbackEntryRoot(projectRoot);\n if (!routerEntry) {\n return undefined;\n }\n // It doesn't matter if the app folder exists.\n const appFolder = path.join(projectRoot, routerDirectory);\n const appRoot = path.relative(path.dirname(routerEntry), appFolder);\n debug('expo-router entry', routerEntry, appFolder, appRoot);\n return appRoot;\n}\n\n/** If the `expo-router` package is not installed, then use the `expo` package to determine where the node modules are relative to the project. */\nfunction getFallbackEntryRoot(projectRoot: string): string {\n const expoRoot = resolveFrom.silent(projectRoot, 'expo/package.json');\n if (expoRoot) {\n return path.join(path.dirname(path.dirname(expoRoot)), 'expo-router/entry');\n }\n return path.join(projectRoot, 'node_modules/expo-router/entry');\n}\n\nexport function getRouterDirectoryModuleIdWithManifest(\n projectRoot: string,\n exp: ExpoConfig\n): string {\n return exp.extra?.router?.root ?? getRouterDirectory(projectRoot);\n}\n\nconst logSrcDir = memoize(() =>\n Log.log(chalk.gray('Using src/app as the root directory for Expo Router.'))\n);\n\nexport function getRouterDirectory(projectRoot: string): string {\n // more specific directories first\n if (directoryExistsSync(path.join(projectRoot, 'src/app'))) {\n logSrcDir();\n return 'src/app';\n }\n\n debug('Using app as the root directory for Expo Router.');\n return 'app';\n}\n\nexport function getApiRoutesForDirectory(cwd: string) {\n return globSync('**/*+api.@(ts|tsx|js|jsx)', {\n cwd,\n absolute: true,\n });\n}\n\n// Used to emulate a context module, but way faster. TODO: May need to adjust the extensions to stay in sync with Metro.\nexport function getRoutePaths(cwd: string) {\n return globSync('**/*.@(ts|tsx|js|jsx)', {\n cwd,\n }).map((p) => './' + normalizePaths(p));\n}\n\nfunction normalizePaths(p: string) {\n return p.replace(/\\\\/g, '/');\n}\n"],"names":["getAppRouterRelativeEntryPath","getRouterDirectoryModuleIdWithManifest","getRouterDirectory","getApiRoutesForDirectory","getRoutePaths","debug","require","projectRoot","routerDirectory","resolveFrom","routerEntry","silent","getFallbackEntryRoot","undefined","appFolder","path","join","appRoot","relative","dirname","expoRoot","exp","extra","router","root","logSrcDir","memoize","Log","log","chalk","gray","directoryExistsSync","cwd","globSync","absolute","map","p","normalizePaths","replace"],"mappings":"AAAA;;;;
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/router.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config';\nimport chalk from 'chalk';\nimport { sync as globSync } from 'glob';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { Log } from '../../../log';\nimport { directoryExistsSync } from '../../../utils/dir';\nimport { memoize } from '../../../utils/fn';\nimport { learnMore } from '../../../utils/link';\n\nconst debug = require('debug')('expo:start:server:metro:router') as typeof console.log;\n\n/**\n * Get the relative path for requiring the `/app` folder relative to the `expo-router/entry` file.\n * This mechanism does require the server to restart after the `expo-router` package is installed.\n */\nexport function getAppRouterRelativeEntryPath(\n projectRoot: string,\n routerDirectory: string = getRouterDirectory(projectRoot)\n): string | undefined {\n // Auto pick App entry\n const routerEntry =\n resolveFrom.silent(projectRoot, 'expo-router/entry') ?? getFallbackEntryRoot(projectRoot);\n if (!routerEntry) {\n return undefined;\n }\n // It doesn't matter if the app folder exists.\n const appFolder = path.join(projectRoot, routerDirectory);\n const appRoot = path.relative(path.dirname(routerEntry), appFolder);\n debug('expo-router entry', routerEntry, appFolder, appRoot);\n return appRoot;\n}\n\n/** If the `expo-router` package is not installed, then use the `expo` package to determine where the node modules are relative to the project. */\nfunction getFallbackEntryRoot(projectRoot: string): string {\n const expoRoot = resolveFrom.silent(projectRoot, 'expo/package.json');\n if (expoRoot) {\n return path.join(path.dirname(path.dirname(expoRoot)), 'expo-router/entry');\n }\n return path.join(projectRoot, 'node_modules/expo-router/entry');\n}\n\nexport function getRouterDirectoryModuleIdWithManifest(\n projectRoot: string,\n exp: ExpoConfig\n): string {\n return exp.extra?.router?.root ?? getRouterDirectory(projectRoot);\n}\n\nconst logSrcDir = memoize(() =>\n Log.log(chalk.gray('Using src/app as the root directory for Expo Router.'))\n);\n\nexport function getRouterDirectory(projectRoot: string): string {\n // more specific directories first\n if (directoryExistsSync(path.join(projectRoot, 'src/app'))) {\n logSrcDir();\n return 'src/app';\n }\n\n debug('Using app as the root directory for Expo Router.');\n return 'app';\n}\n\nexport function isApiRouteConvention(name: string): boolean {\n return /\\+api\\.[tj]sx?$/.test(name);\n}\n\nexport function getApiRoutesForDirectory(cwd: string) {\n return globSync('**/*+api.@(ts|tsx|js|jsx)', {\n cwd,\n absolute: true,\n });\n}\n\n// Used to emulate a context module, but way faster. TODO: May need to adjust the extensions to stay in sync with Metro.\nexport function getRoutePaths(cwd: string) {\n return globSync('**/*.@(ts|tsx|js|jsx)', {\n cwd,\n }).map((p) => './' + normalizePaths(p));\n}\n\nfunction normalizePaths(p: string) {\n return p.replace(/\\\\/g, '/');\n}\n\nlet hasWarnedAboutApiRouteOutput = false;\n\nexport function hasWarnedAboutApiRoutes() {\n return hasWarnedAboutApiRouteOutput;\n}\n\nexport function warnInvalidWebOutput() {\n if (!hasWarnedAboutApiRouteOutput) {\n Log.warn(\n chalk.yellow`Using API routes requires the {bold web.output} to be set to {bold \"server\"} in the project {bold app.json}. ${learnMore(\n 'https://docs.expo.dev/router/reference/api-routes/'\n )}`\n );\n }\n\n hasWarnedAboutApiRouteOutput = true;\n}\n"],"names":["getAppRouterRelativeEntryPath","getRouterDirectoryModuleIdWithManifest","getRouterDirectory","isApiRouteConvention","getApiRoutesForDirectory","getRoutePaths","hasWarnedAboutApiRoutes","warnInvalidWebOutput","debug","require","projectRoot","routerDirectory","resolveFrom","routerEntry","silent","getFallbackEntryRoot","undefined","appFolder","path","join","appRoot","relative","dirname","expoRoot","exp","extra","router","root","logSrcDir","memoize","Log","log","chalk","gray","directoryExistsSync","name","test","cwd","globSync","absolute","map","p","normalizePaths","replace","hasWarnedAboutApiRouteOutput","warn","yellow","learnMore"],"mappings":"AAAA;;;;QAiBgBA,6BAA6B,GAA7BA,6BAA6B;QA0B7BC,sCAAsC,GAAtCA,sCAAsC;QAWtCC,kBAAkB,GAAlBA,kBAAkB;QAWlBC,oBAAoB,GAApBA,oBAAoB;QAIpBC,wBAAwB,GAAxBA,wBAAwB;QAQxBC,aAAa,GAAbA,aAAa;QAYbC,uBAAuB,GAAvBA,uBAAuB;QAIvBC,oBAAoB,GAApBA,oBAAoB;AA5FlB,IAAA,MAAO,kCAAP,OAAO,EAAA;AACQ,IAAA,KAAM,WAAN,MAAM,CAAA;AACtB,IAAA,KAAM,kCAAN,MAAM,EAAA;AACC,IAAA,YAAc,kCAAd,cAAc,EAAA;AAElB,IAAA,IAAc,WAAd,cAAc,CAAA;AACE,IAAA,IAAoB,WAApB,oBAAoB,CAAA;AAChC,IAAA,GAAmB,WAAnB,mBAAmB,CAAA;AACjB,IAAA,KAAqB,WAArB,qBAAqB,CAAA;;;;;;AAE/C,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,gCAAgC,CAAC,AAAsB,AAAC;AAMhF,SAAST,6BAA6B,CAC3CU,WAAmB,EACnBC,eAAuB,GAAGT,kBAAkB,CAACQ,WAAW,CAAC,EACrC;QAGlBE,GAAoD;IAFtD,sBAAsB;IACtB,MAAMC,WAAW,GACfD,CAAAA,GAAoD,GAApDA,YAAW,QAAA,CAACE,MAAM,CAACJ,WAAW,EAAE,mBAAmB,CAAC,YAApDE,GAAoD,GAAIG,oBAAoB,CAACL,WAAW,CAAC,AAAC;IAC5F,IAAI,CAACG,WAAW,EAAE;QAChB,OAAOG,SAAS,CAAC;KAClB;IACD,8CAA8C;IAC9C,MAAMC,SAAS,GAAGC,KAAI,QAAA,CAACC,IAAI,CAACT,WAAW,EAAEC,eAAe,CAAC,AAAC;IAC1D,MAAMS,OAAO,GAAGF,KAAI,QAAA,CAACG,QAAQ,CAACH,KAAI,QAAA,CAACI,OAAO,CAACT,WAAW,CAAC,EAAEI,SAAS,CAAC,AAAC;IACpET,KAAK,CAAC,mBAAmB,EAAEK,WAAW,EAAEI,SAAS,EAAEG,OAAO,CAAC,CAAC;IAC5D,OAAOA,OAAO,CAAC;CAChB;AAED,kJAAkJ,CAClJ,SAASL,oBAAoB,CAACL,WAAmB,EAAU;IACzD,MAAMa,QAAQ,GAAGX,YAAW,QAAA,CAACE,MAAM,CAACJ,WAAW,EAAE,mBAAmB,CAAC,AAAC;IACtE,IAAIa,QAAQ,EAAE;QACZ,OAAOL,KAAI,QAAA,CAACC,IAAI,CAACD,KAAI,QAAA,CAACI,OAAO,CAACJ,KAAI,QAAA,CAACI,OAAO,CAACC,QAAQ,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;KAC7E;IACD,OAAOL,KAAI,QAAA,CAACC,IAAI,CAACT,WAAW,EAAE,gCAAgC,CAAC,CAAC;CACjE;AAEM,SAAST,sCAAsC,CACpDS,WAAmB,EACnBc,GAAe,EACP;QACDA,GAAS;QAATA,IAAuB;IAA9B,OAAOA,CAAAA,IAAuB,GAAvBA,CAAAA,GAAS,GAATA,GAAG,CAACC,KAAK,SAAQ,GAAjBD,KAAAA,CAAiB,GAAjBA,QAAAA,GAAS,CAAEE,MAAM,SAAA,GAAjBF,KAAAA,CAAiB,QAAEG,IAAI,AAAN,YAAjBH,IAAuB,GAAItB,kBAAkB,CAACQ,WAAW,CAAC,CAAC;CACnE;AAED,MAAMkB,SAAS,GAAGC,CAAAA,GAAAA,GAAO,AAExB,CAAA,QAFwB,CAAC,IACxBC,IAAG,IAAA,CAACC,GAAG,CAACC,MAAK,QAAA,CAACC,IAAI,CAAC,sDAAsD,CAAC,CAAC;AAAA,CAC5E,AAAC;AAEK,SAAS/B,kBAAkB,CAACQ,WAAmB,EAAU;IAC9D,kCAAkC;IAClC,IAAIwB,CAAAA,GAAAA,IAAmB,AAAmC,CAAA,oBAAnC,CAAChB,KAAI,QAAA,CAACC,IAAI,CAACT,WAAW,EAAE,SAAS,CAAC,CAAC,EAAE;QAC1DkB,SAAS,EAAE,CAAC;QACZ,OAAO,SAAS,CAAC;KAClB;IAEDpB,KAAK,CAAC,kDAAkD,CAAC,CAAC;IAC1D,OAAO,KAAK,CAAC;CACd;AAEM,SAASL,oBAAoB,CAACgC,IAAY,EAAW;IAC1D,OAAO,kBAAkBC,IAAI,CAACD,IAAI,CAAC,CAAC;CACrC;AAEM,SAAS/B,wBAAwB,CAACiC,GAAW,EAAE;IACpD,OAAOC,CAAAA,GAAAA,KAAQ,AAGb,CAAA,KAHa,CAAC,2BAA2B,EAAE;QAC3CD,GAAG;QACHE,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;CACJ;AAGM,SAASlC,aAAa,CAACgC,GAAW,EAAE;IACzC,OAAOC,CAAAA,GAAAA,KAAQ,AAEb,CAAA,KAFa,CAAC,uBAAuB,EAAE;QACvCD,GAAG;KACJ,CAAC,CAACG,GAAG,CAAC,CAACC,CAAC,GAAK,IAAI,GAAGC,cAAc,CAACD,CAAC,CAAC;IAAA,CAAC,CAAC;CACzC;AAED,SAASC,cAAc,CAACD,CAAS,EAAE;IACjC,OAAOA,CAAC,CAACE,OAAO,QAAQ,GAAG,CAAC,CAAC;CAC9B;AAED,IAAIC,4BAA4B,GAAG,KAAK,AAAC;AAElC,SAAStC,uBAAuB,GAAG;IACxC,OAAOsC,4BAA4B,CAAC;CACrC;AAEM,SAASrC,oBAAoB,GAAG;IACrC,IAAI,CAACqC,4BAA4B,EAAE;QACjCd,IAAG,IAAA,CAACe,IAAI,CACNb,MAAK,QAAA,CAACc,MAAM,CAAC,6GAA6G,EAAEC,CAAAA,GAAAA,KAAS,AAEpI,CAAA,UAFoI,CACnI,oDAAoD,CACrD,CAAC,CAAC,CACJ,CAAC;KACH;IAEDH,4BAA4B,GAAG,IAAI,CAAC;CACrC"}
|
|
@@ -70,7 +70,7 @@ function observeFileChanges(runner, files, callback) {
|
|
|
70
70
|
function observeAnyFileChanges(runner, callback) {
|
|
71
71
|
const watcher = runner.metro.getBundler().getBundler().getWatcher();
|
|
72
72
|
const listener = ({ eventsQueue })=>{
|
|
73
|
-
callback();
|
|
73
|
+
callback(eventsQueue);
|
|
74
74
|
};
|
|
75
75
|
watcher.addListener("change", listener);
|
|
76
76
|
const off = ()=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/waitForMetroToObserveTypeScriptFile.ts"],"sourcesContent":["import path from 'path';\n\nimport type { ServerLike } from '../BundlerDevServer';\n\nconst debug = require('debug')('expo:start:server:metro:waitForTypescript') as typeof console.log;\n\n/**\n * Use the native file watcher / Metro ruleset to detect if a\n * TypeScript file is added to the project during development.\n */\nexport function waitForMetroToObserveTypeScriptFile(\n projectRoot: string,\n runner: {\n metro: import('metro').Server;\n server: ServerLike;\n },\n callback: () => Promise<void>\n): () => void {\n const watcher = runner.metro.getBundler().getBundler().getWatcher();\n\n const tsconfigPath = path.join(projectRoot, 'tsconfig.json');\n\n const listener = ({
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/waitForMetroToObserveTypeScriptFile.ts"],"sourcesContent":["import path from 'path';\n\nimport type { ServerLike } from '../BundlerDevServer';\n\nconst debug = require('debug')('expo:start:server:metro:waitForTypescript') as typeof console.log;\n\nexport type FileChangeEvent = {\n filePath: string;\n metadata?: {\n type: 'f' | 'd' | 'l'; // Regular file / Directory / Symlink\n } | null;\n type: string;\n};\n\n/**\n * Use the native file watcher / Metro ruleset to detect if a\n * TypeScript file is added to the project during development.\n */\nexport function waitForMetroToObserveTypeScriptFile(\n projectRoot: string,\n runner: {\n metro: import('metro').Server;\n server: ServerLike;\n },\n callback: () => Promise<void>\n): () => void {\n const watcher = runner.metro.getBundler().getBundler().getWatcher();\n\n const tsconfigPath = path.join(projectRoot, 'tsconfig.json');\n\n const listener = ({ eventsQueue }: { eventsQueue: FileChangeEvent[] }) => {\n for (const event of eventsQueue) {\n if (\n event.type === 'add' &&\n event.metadata?.type !== 'd' &&\n // We need to ignore node_modules because Metro will add all of the files in node_modules to the watcher.\n !/node_modules/.test(event.filePath)\n ) {\n const { filePath } = event;\n // Is TypeScript?\n if (\n // If the user adds a TypeScript file to the observable files in their project.\n /\\.tsx?$/.test(filePath) ||\n // Or if the user adds a tsconfig.json file to the project root.\n filePath === tsconfigPath\n ) {\n debug('Detected TypeScript file added to the project: ', filePath);\n callback();\n off();\n return;\n }\n }\n }\n };\n\n debug('Waiting for TypeScript files to be added to the project...');\n watcher.addListener('change', listener);\n\n const off = () => {\n watcher.removeListener('change', listener);\n };\n\n runner.server.addListener?.('close', off);\n return off;\n}\n\nexport function observeFileChanges(\n runner: {\n metro: import('metro').Server;\n server: ServerLike;\n },\n files: string[],\n callback: () => void | Promise<void>\n): () => void {\n const watcher = runner.metro.getBundler().getBundler().getWatcher();\n\n const listener = ({\n eventsQueue,\n }: {\n eventsQueue: {\n filePath: string;\n metadata?: {\n type: 'f' | 'd' | 'l'; // Regular file / Directory / Symlink\n } | null;\n type: string;\n }[];\n }) => {\n for (const event of eventsQueue) {\n if (\n // event.type === 'add' &&\n event.metadata?.type !== 'd' &&\n // We need to ignore node_modules because Metro will add all of the files in node_modules to the watcher.\n !/node_modules/.test(event.filePath)\n ) {\n const { filePath } = event;\n // Is TypeScript?\n if (files.includes(filePath)) {\n debug('Observed change:', filePath);\n callback();\n return;\n }\n }\n }\n };\n\n debug('Watching file changes:', files);\n watcher.addListener('change', listener);\n\n const off = () => {\n watcher.removeListener('change', listener);\n };\n\n runner.server.addListener?.('close', off);\n return off;\n}\n\nexport function observeAnyFileChanges(\n runner: {\n metro: import('metro').Server;\n server: ServerLike;\n },\n callback: (events: FileChangeEvent[]) => void | Promise<void>\n): () => void {\n const watcher = runner.metro.getBundler().getBundler().getWatcher();\n\n const listener = ({ eventsQueue }: { eventsQueue: FileChangeEvent[] }) => {\n callback(eventsQueue);\n };\n\n watcher.addListener('change', listener);\n\n const off = () => {\n watcher.removeListener('change', listener);\n };\n\n runner.server.addListener?.('close', off);\n return off;\n}\n"],"names":["waitForMetroToObserveTypeScriptFile","observeFileChanges","observeAnyFileChanges","debug","require","projectRoot","runner","callback","watcher","metro","getBundler","getWatcher","tsconfigPath","path","join","listener","eventsQueue","event","type","metadata","test","filePath","off","addListener","removeListener","server","files","includes"],"mappings":"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"}
|
|
@@ -335,7 +335,8 @@ function shouldAliasModule(input, alias) {
|
|
|
335
335
|
var ref, ref6;
|
|
336
336
|
return input.platform === alias.platform && ((ref = input.result) == null ? void 0 : ref.type) === "sourceFile" && typeof ((ref6 = input.result) == null ? void 0 : ref6.filePath) === "string" && normalizeSlashes(input.result.filePath).endsWith(alias.output);
|
|
337
337
|
}
|
|
338
|
-
async function withMetroMultiPlatformAsync(projectRoot, { config , platformBundlers , isTsconfigPathsEnabled , webOutput , isFastResolverEnabled , isExporting }) {
|
|
338
|
+
async function withMetroMultiPlatformAsync(projectRoot, { config , exp , platformBundlers , isTsconfigPathsEnabled , webOutput , isFastResolverEnabled , isExporting }) {
|
|
339
|
+
var ref7;
|
|
339
340
|
if (!config.projectRoot) {
|
|
340
341
|
// @ts-expect-error: read-only types
|
|
341
342
|
config.projectRoot = projectRoot;
|
|
@@ -363,7 +364,7 @@ async function withMetroMultiPlatformAsync(projectRoot, { config , platformBundl
|
|
|
363
364
|
config.transformer._expoRouterWebRendering = webOutput;
|
|
364
365
|
// @ts-expect-error: Invalidate the cache when the location of expo-router changes on-disk.
|
|
365
366
|
config.transformer._expoRouterPath = _resolveFrom.default.silent(projectRoot, "expo-router");
|
|
366
|
-
if (platformBundlers.web === "metro") {
|
|
367
|
+
if (((ref7 = exp.platforms) == null ? void 0 : ref7.includes("web")) && platformBundlers.web === "metro") {
|
|
367
368
|
await new _webSupportProjectPrerequisite.WebSupportProjectPrerequisite(projectRoot).assertAsync();
|
|
368
369
|
}
|
|
369
370
|
let tsconfig = null;
|
|
@@ -372,8 +373,10 @@ async function withMetroMultiPlatformAsync(projectRoot, { config , platformBundl
|
|
|
372
373
|
}
|
|
373
374
|
await (0, _externals).setupShimFiles(projectRoot);
|
|
374
375
|
await (0, _externals).setupNodeExternals(projectRoot);
|
|
375
|
-
let expoConfigPlatforms = Object.entries(platformBundlers).filter(([, bundler])=>
|
|
376
|
-
|
|
376
|
+
let expoConfigPlatforms = Object.entries(platformBundlers).filter(([platform, bundler])=>{
|
|
377
|
+
var ref;
|
|
378
|
+
return bundler === "metro" && ((ref = exp.platforms) == null ? void 0 : ref.includes(platform));
|
|
379
|
+
}).map(([platform])=>platform
|
|
377
380
|
);
|
|
378
381
|
if (Array.isArray(config.resolver.platforms)) {
|
|
379
382
|
expoConfigPlatforms = [
|