@expo/cli 0.15.0 → 0.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/build/bin/cli +10 -3
  2. package/build/bin/cli.map +1 -1
  3. package/build/src/api/user/actions.js +1 -1
  4. package/build/src/api/user/actions.js.map +1 -1
  5. package/build/src/export/createMetadataJson.js +2 -1
  6. package/build/src/export/createMetadataJson.js.map +1 -1
  7. package/build/src/export/embed/exportEmbedAsync.js +50 -3
  8. package/build/src/export/embed/exportEmbedAsync.js.map +1 -1
  9. package/build/src/export/embed/xcodeCompilerLogger.js +97 -0
  10. package/build/src/export/embed/xcodeCompilerLogger.js.map +1 -0
  11. package/build/src/export/exportApp.js +90 -103
  12. package/build/src/export/exportApp.js.map +1 -1
  13. package/build/src/export/exportAssets.js +18 -23
  14. package/build/src/export/exportAssets.js.map +1 -1
  15. package/build/src/export/exportAsync.js +1 -1
  16. package/build/src/export/exportAsync.js.map +1 -1
  17. package/build/src/export/exportHermes.js +0 -90
  18. package/build/src/export/exportHermes.js.map +1 -1
  19. package/build/src/export/exportStaticAsync.js +137 -108
  20. package/build/src/export/exportStaticAsync.js.map +1 -1
  21. package/build/src/export/favicon.js +12 -4
  22. package/build/src/export/favicon.js.map +1 -1
  23. package/build/src/export/fork-bundleAsync.js +74 -49
  24. package/build/src/export/fork-bundleAsync.js.map +1 -1
  25. package/build/src/export/metroAssetLocalPath.js +1 -1
  26. package/build/src/export/metroAssetLocalPath.js.map +1 -1
  27. package/build/src/export/persistMetroAssets.js +28 -17
  28. package/build/src/export/persistMetroAssets.js.map +1 -1
  29. package/build/src/export/publicFolder.js +7 -0
  30. package/build/src/export/publicFolder.js.map +1 -1
  31. package/build/src/export/saveAssets.js +176 -12
  32. package/build/src/export/saveAssets.js.map +1 -1
  33. package/build/src/export/writeContents.js +8 -107
  34. package/build/src/export/writeContents.js.map +1 -1
  35. package/build/src/install/installAsync.js +29 -10
  36. package/build/src/install/installAsync.js.map +1 -1
  37. package/build/src/prebuild/prebuildAsync.js +9 -2
  38. package/build/src/prebuild/prebuildAsync.js.map +1 -1
  39. package/build/src/run/hints.js +4 -0
  40. package/build/src/run/hints.js.map +1 -1
  41. package/build/src/run/index.js +101 -0
  42. package/build/src/run/index.js.map +1 -0
  43. package/build/src/start/doctor/dependencies/bundledNativeModules.js +2 -2
  44. package/build/src/start/doctor/dependencies/bundledNativeModules.js.map +1 -1
  45. package/build/src/start/doctor/dependencies/getVersionedPackages.js +10 -3
  46. package/build/src/start/doctor/dependencies/getVersionedPackages.js.map +1 -1
  47. package/build/src/start/doctor/dependencies/resolvePackages.js +66 -0
  48. package/build/src/start/doctor/dependencies/resolvePackages.js.map +1 -0
  49. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +2 -30
  50. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -1
  51. package/build/src/start/interface/interactiveActions.js +24 -8
  52. package/build/src/start/interface/interactiveActions.js.map +1 -1
  53. package/build/src/start/server/getStaticRenderFunctions.js +8 -4
  54. package/build/src/start/server/getStaticRenderFunctions.js.map +1 -1
  55. package/build/src/start/server/metro/MetroBundlerDevServer.js +39 -16
  56. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  57. package/build/src/start/server/metro/MetroTerminalReporter.js +6 -2
  58. package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
  59. package/build/src/start/server/metro/TerminalReporter.js +18 -1
  60. package/build/src/start/server/metro/TerminalReporter.js.map +1 -1
  61. package/build/src/start/server/metro/bundleApiRoutes.js +3 -2
  62. package/build/src/start/server/metro/bundleApiRoutes.js.map +1 -1
  63. package/build/src/start/server/metro/createExpoMetroResolver.js +22 -5
  64. package/build/src/start/server/metro/createExpoMetroResolver.js.map +1 -1
  65. package/build/src/start/server/metro/createJResolver.js +5 -2
  66. package/build/src/start/server/metro/createJResolver.js.map +1 -1
  67. package/build/src/start/server/metro/createServerRouteMiddleware.js +2 -1
  68. package/build/src/start/server/metro/createServerRouteMiddleware.js.map +1 -1
  69. package/build/src/start/server/metro/{inspector-proxy/device.js → debugging/InspectorDevice.js} +8 -38
  70. package/build/src/start/server/metro/debugging/InspectorDevice.js.map +1 -0
  71. package/build/src/start/server/metro/debugging/InspectorProxy.js +116 -0
  72. package/build/src/start/server/metro/debugging/InspectorProxy.js.map +1 -0
  73. package/build/src/start/server/metro/debugging/createDebugMiddleware.js +45 -0
  74. package/build/src/start/server/metro/debugging/createDebugMiddleware.js.map +1 -0
  75. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/NetworkResponse.js +3 -4
  76. package/build/src/start/server/metro/debugging/inspectorHandlers/NetworkResponse.js.map +1 -0
  77. package/build/src/start/server/metro/debugging/inspectorHandlers/PageReload.js.map +1 -0
  78. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeDebuggerGetPossibleBreakpoints.js +2 -2
  79. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeDebuggerGetPossibleBreakpoints.js.map +1 -0
  80. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeDebuggerScriptParsed.js +3 -2
  81. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeDebuggerScriptParsed.js.map +1 -0
  82. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeDebuggerSetBreakpointByUrl.js +3 -2
  83. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeDebuggerSetBreakpointByUrl.js.map +1 -0
  84. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeRuntimeCallFunctionOn.js +2 -2
  85. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeRuntimeCallFunctionOn.js.map +1 -0
  86. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeRuntimeGetProperties.js +5 -4
  87. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeRuntimeGetProperties.js.map +1 -0
  88. package/build/src/start/server/metro/debugging/inspectorHandlers/types.js.map +1 -0
  89. package/build/src/start/server/metro/debugging/inspectorHandlers/utils.js +20 -0
  90. package/build/src/start/server/metro/debugging/inspectorHandlers/utils.js.map +1 -0
  91. package/build/src/start/server/metro/getCssModulesFromBundler.js.map +1 -1
  92. package/build/src/start/server/metro/instantiateMetro.js +10 -5
  93. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  94. package/build/src/start/server/metro/metroErrorInterface.js +3 -2
  95. package/build/src/start/server/metro/metroErrorInterface.js.map +1 -1
  96. package/build/src/start/server/metro/router.js +1 -5
  97. package/build/src/start/server/metro/router.js.map +1 -1
  98. package/build/src/start/server/metro/runServer-fork.js +0 -19
  99. package/build/src/start/server/metro/runServer-fork.js.map +1 -1
  100. package/build/src/start/server/metro/serializeHtml.js +20 -4
  101. package/build/src/start/server/metro/serializeHtml.js.map +1 -1
  102. package/build/src/start/server/metro/withMetroMultiPlatform.js +48 -85
  103. package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
  104. package/build/src/start/server/middleware/ManifestMiddleware.js +12 -5
  105. package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
  106. package/build/src/start/server/middleware/inspector/JsInspector.js +22 -1
  107. package/build/src/start/server/middleware/inspector/JsInspector.js.map +1 -1
  108. package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js +12 -12
  109. package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js.map +1 -1
  110. package/build/src/start/server/middleware/metroOptions.js +62 -9
  111. package/build/src/start/server/middleware/metroOptions.js.map +1 -1
  112. package/build/src/start/server/type-generation/__typetests__/fixtures/basic.js.map +1 -1
  113. package/build/src/start/server/type-generation/__typetests__/route.test.js +11 -3
  114. package/build/src/start/server/type-generation/__typetests__/route.test.js.map +1 -1
  115. package/build/src/start/server/type-generation/routes.js +6 -4
  116. package/build/src/start/server/type-generation/routes.js.map +1 -1
  117. package/build/src/start/server/type-generation/startTypescriptTypeGeneration.js +1 -1
  118. package/build/src/start/server/type-generation/startTypescriptTypeGeneration.js.map +1 -1
  119. package/build/src/utils/analytics/rudderstackClient.js +2 -2
  120. package/build/src/utils/codesigning.js +11 -1
  121. package/build/src/utils/codesigning.js.map +1 -1
  122. package/build/src/utils/env.js +7 -1
  123. package/build/src/utils/env.js.map +1 -1
  124. package/build/src/utils/tsconfig/loadTsConfigPaths.js +3 -11
  125. package/build/src/utils/tsconfig/loadTsConfigPaths.js.map +1 -1
  126. package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js +22 -12
  127. package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js.map +1 -1
  128. package/package.json +10 -10
  129. package/static/template/index.html +14 -95
  130. package/build/src/export/printBundleSizes.js +0 -101
  131. package/build/src/export/printBundleSizes.js.map +0 -1
  132. package/build/src/start/server/metro/inspector-proxy/device.js.map +0 -1
  133. package/build/src/start/server/metro/inspector-proxy/handlers/NetworkResponse.js.map +0 -1
  134. package/build/src/start/server/metro/inspector-proxy/handlers/PageReload.js.map +0 -1
  135. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeDebuggerGetPossibleBreakpoints.js.map +0 -1
  136. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeDebuggerScriptParsed.js.map +0 -1
  137. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeDebuggerSetBreakpointByUrl.js.map +0 -1
  138. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeRuntimeCallFunctionOn.js.map +0 -1
  139. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeRuntimeGetProperties.js.map +0 -1
  140. package/build/src/start/server/metro/inspector-proxy/handlers/types.js.map +0 -1
  141. package/build/src/start/server/metro/inspector-proxy/handlers/utils.js +0 -11
  142. package/build/src/start/server/metro/inspector-proxy/handlers/utils.js.map +0 -1
  143. package/build/src/start/server/metro/inspector-proxy/index.js +0 -30
  144. package/build/src/start/server/metro/inspector-proxy/index.js.map +0 -1
  145. package/build/src/start/server/metro/inspector-proxy/proxy.js +0 -169
  146. package/build/src/start/server/metro/inspector-proxy/proxy.js.map +0 -1
  147. /package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/PageReload.js +0 -0
  148. /package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/types.js +0 -0
@@ -6,15 +6,36 @@ exports.openJsInspector = openJsInspector;
6
6
  exports.closeJsInspector = closeJsInspector;
7
7
  exports.queryInspectorAppAsync = queryInspectorAppAsync;
8
8
  exports.queryAllInspectorAppsAsync = queryAllInspectorAppsAsync;
9
+ var _chalk = _interopRequireDefault(require("chalk"));
9
10
  var _nodeFetch = _interopRequireDefault(require("node-fetch"));
10
11
  var _launchBrowser = require("./LaunchBrowser");
12
+ var _log = require("../../../../log");
13
+ var _env = require("../../../../utils/env");
11
14
  function _interopRequireDefault(obj) {
12
15
  return obj && obj.__esModule ? obj : {
13
16
  default: obj
14
17
  };
15
18
  }
16
19
  let openingBrowserInstance = null;
17
- async function openJsInspector(app) {
20
+ function openJsInspector(metroBaseUrl, app) {
21
+ if (_env.env.EXPO_USE_UNSTABLE_DEBUGGER) {
22
+ return openExperimentalJsInspector(metroBaseUrl, app);
23
+ } else {
24
+ return openClassicJsInspector(app);
25
+ }
26
+ }
27
+ async function openExperimentalJsInspector(metroBaseUrl, app) {
28
+ const device = encodeURIComponent(app.id);
29
+ const appId = encodeURIComponent(app.description);
30
+ await (0, _nodeFetch).default(`${metroBaseUrl}/open-debugger?device=${device}&appId=${appId}`, {
31
+ method: "POST"
32
+ });
33
+ }
34
+ /**
35
+ * Chrome DevTools UI implemented for SDK <49.
36
+ * TODO(cedric): Remove this when we fully swap over to the new React Native JS Inspector.
37
+ */ async function openClassicJsInspector(app) {
38
+ _log.Log.log(_chalk.default`{bold Debug:} Opening JavaScript inspector in the browser...`);
18
39
  // To update devtoolsFrontendRev, find the full commit hash in the url:
19
40
  // https://chromium.googlesource.com/chromium/src.git/+log/refs/tags/{CHROME_VERSION}/chrome/VERSION
20
41
  //
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/start/server/middleware/inspector/JsInspector.ts"],"sourcesContent":["import fetch from 'node-fetch';\n\nimport { launchInspectorBrowserAsync, type LaunchBrowserInstance } from './LaunchBrowser';\nexport interface MetroInspectorProxyApp {\n description: string;\n devtoolsFrontendUrl: string;\n faviconUrl: string;\n id: string;\n title: string;\n type: 'node';\n vm: 'Hermes' | \"don't use\";\n webSocketDebuggerUrl: string;\n}\n\nlet openingBrowserInstance: LaunchBrowserInstance | null = null;\n\nexport async function openJsInspector(app: MetroInspectorProxyApp) {\n // To update devtoolsFrontendRev, find the full commit hash in the url:\n // https://chromium.googlesource.com/chromium/src.git/+log/refs/tags/{CHROME_VERSION}/chrome/VERSION\n //\n // 1. Replace {CHROME_VERSION} with the target chrome version\n // 2. Click the first log item in the webpage\n // 3. The full commit hash is the desired revision\n const devtoolsFrontendRev = 'd9568d04d7dd79269c5a655d7ada69650c5a8336'; // Chrome 100.0.4896.75\n\n const urlBase = `https://chrome-devtools-frontend.appspot.com/serve_rev/@${devtoolsFrontendRev}/devtools_app.html`;\n const ws = app.webSocketDebuggerUrl.replace(/^ws:\\/\\//, '');\n const url = `${urlBase}?panel=console&ws=${encodeURIComponent(ws)}`;\n await closeJsInspector();\n openingBrowserInstance = await launchInspectorBrowserAsync(url);\n}\n\nexport async function closeJsInspector() {\n await openingBrowserInstance?.close();\n openingBrowserInstance = null;\n}\n\nexport async function queryInspectorAppAsync(\n metroServerOrigin: string,\n appId: string\n): Promise<MetroInspectorProxyApp | null> {\n const apps = await queryAllInspectorAppsAsync(metroServerOrigin);\n return apps.find((app) => app.description === appId) ?? null;\n}\n\nexport async function queryAllInspectorAppsAsync(\n metroServerOrigin: string\n): Promise<MetroInspectorProxyApp[]> {\n const resp = await fetch(`${metroServerOrigin}/json/list`);\n const apps: MetroInspectorProxyApp[] = transformApps(await resp.json());\n // Only use targets with better reloading support\n return apps.filter((app) => app.title === 'React Native Experimental (Improved Chrome Reloads)');\n}\n\n// The description of `React Native Experimental (Improved Chrome Reloads)` target is `don't use` from metro.\n// This function tries to transform the unmeaningful description to appId\nfunction transformApps(apps: MetroInspectorProxyApp[]): MetroInspectorProxyApp[] {\n const deviceIdToAppId: Record<string, string> = {};\n\n for (const app of apps) {\n if (app.description !== \"don't use\") {\n const deviceId = app.id.split('-')[0];\n const appId = app.description;\n deviceIdToAppId[deviceId] = appId;\n }\n }\n\n return apps.map((app) => {\n if (app.description === \"don't use\") {\n const deviceId = app.id.split('-')[0];\n app.description = deviceIdToAppId[deviceId] ?? app.description;\n }\n return app;\n });\n}\n"],"names":["openJsInspector","closeJsInspector","queryInspectorAppAsync","queryAllInspectorAppsAsync","openingBrowserInstance","app","devtoolsFrontendRev","urlBase","ws","webSocketDebuggerUrl","replace","url","encodeURIComponent","launchInspectorBrowserAsync","close","metroServerOrigin","appId","apps","find","description","resp","fetch","transformApps","json","filter","title","deviceIdToAppId","deviceId","id","split","map"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../src/start/server/middleware/inspector/JsInspector.ts"],"sourcesContent":["import chalk from 'chalk';\nimport fetch from 'node-fetch';\n\nimport { launchInspectorBrowserAsync, type LaunchBrowserInstance } from './LaunchBrowser';\nimport { Log } from '../../../../log';\nimport { env } from '../../../../utils/env';\n\nexport interface MetroInspectorProxyApp {\n id: string;\n description: string;\n title: string;\n faviconUrl: string;\n devtoolsFrontendUrl: string;\n type: 'node';\n webSocketDebuggerUrl: string;\n vm: 'Hermes' | \"don't use\";\n /** Added since React Native 0.73.x */\n deviceName?: string;\n}\n\nlet openingBrowserInstance: LaunchBrowserInstance | null = null;\n\nexport function openJsInspector(metroBaseUrl: string, app: MetroInspectorProxyApp) {\n if (env.EXPO_USE_UNSTABLE_DEBUGGER) {\n return openExperimentalJsInspector(metroBaseUrl, app);\n } else {\n return openClassicJsInspector(app);\n }\n}\n\nasync function openExperimentalJsInspector(metroBaseUrl: string, app: MetroInspectorProxyApp) {\n const device = encodeURIComponent(app.id);\n const appId = encodeURIComponent(app.description);\n await fetch(`${metroBaseUrl}/open-debugger?device=${device}&appId=${appId}`, { method: 'POST' });\n}\n\n/**\n * Chrome DevTools UI implemented for SDK <49.\n * TODO(cedric): Remove this when we fully swap over to the new React Native JS Inspector.\n */\nasync function openClassicJsInspector(app: MetroInspectorProxyApp) {\n Log.log(chalk`{bold Debug:} Opening JavaScript inspector in the browser...`);\n\n // To update devtoolsFrontendRev, find the full commit hash in the url:\n // https://chromium.googlesource.com/chromium/src.git/+log/refs/tags/{CHROME_VERSION}/chrome/VERSION\n //\n // 1. Replace {CHROME_VERSION} with the target chrome version\n // 2. Click the first log item in the webpage\n // 3. The full commit hash is the desired revision\n const devtoolsFrontendRev = 'd9568d04d7dd79269c5a655d7ada69650c5a8336'; // Chrome 100.0.4896.75\n\n const urlBase = `https://chrome-devtools-frontend.appspot.com/serve_rev/@${devtoolsFrontendRev}/devtools_app.html`;\n const ws = app.webSocketDebuggerUrl.replace(/^ws:\\/\\//, '');\n const url = `${urlBase}?panel=console&ws=${encodeURIComponent(ws)}`;\n await closeJsInspector();\n openingBrowserInstance = await launchInspectorBrowserAsync(url);\n}\n\nexport async function closeJsInspector() {\n await openingBrowserInstance?.close();\n openingBrowserInstance = null;\n}\n\nexport async function queryInspectorAppAsync(\n metroServerOrigin: string,\n appId: string\n): Promise<MetroInspectorProxyApp | null> {\n const apps = await queryAllInspectorAppsAsync(metroServerOrigin);\n return apps.find((app) => app.description === appId) ?? null;\n}\n\nexport async function queryAllInspectorAppsAsync(\n metroServerOrigin: string\n): Promise<MetroInspectorProxyApp[]> {\n const resp = await fetch(`${metroServerOrigin}/json/list`);\n const apps: MetroInspectorProxyApp[] = transformApps(await resp.json());\n // Only use targets with better reloading support\n return apps.filter((app) => app.title === 'React Native Experimental (Improved Chrome Reloads)');\n}\n\n// The description of `React Native Experimental (Improved Chrome Reloads)` target is `don't use` from metro.\n// This function tries to transform the unmeaningful description to appId\nfunction transformApps(apps: MetroInspectorProxyApp[]): MetroInspectorProxyApp[] {\n const deviceIdToAppId: Record<string, string> = {};\n\n for (const app of apps) {\n if (app.description !== \"don't use\") {\n const deviceId = app.id.split('-')[0];\n const appId = app.description;\n deviceIdToAppId[deviceId] = appId;\n }\n }\n\n return apps.map((app) => {\n if (app.description === \"don't use\") {\n const deviceId = app.id.split('-')[0];\n app.description = deviceIdToAppId[deviceId] ?? app.description;\n }\n return app;\n });\n}\n"],"names":["openJsInspector","closeJsInspector","queryInspectorAppAsync","queryAllInspectorAppsAsync","openingBrowserInstance","metroBaseUrl","app","env","EXPO_USE_UNSTABLE_DEBUGGER","openExperimentalJsInspector","openClassicJsInspector","device","encodeURIComponent","id","appId","description","fetch","method","Log","log","chalk","devtoolsFrontendRev","urlBase","ws","webSocketDebuggerUrl","replace","url","launchInspectorBrowserAsync","close","metroServerOrigin","apps","find","resp","transformApps","json","filter","title","deviceIdToAppId","deviceId","split","map"],"mappings":"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"}
@@ -2,24 +2,29 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- exports.default = createJsInspectorMiddleware;
5
+ exports.createJsInspectorMiddleware = createJsInspectorMiddleware;
6
6
  var _chalk = _interopRequireDefault(require("chalk"));
7
7
  var _net = _interopRequireDefault(require("net"));
8
8
  var _tls = require("tls");
9
9
  var _url = require("url");
10
10
  var _jsInspector = require("./JsInspector");
11
+ function _interopRequireDefault(obj) {
12
+ return obj && obj.__esModule ? obj : {
13
+ default: obj
14
+ };
15
+ }
11
16
  function createJsInspectorMiddleware() {
12
17
  return async function(req, res, next) {
13
18
  var _url1;
14
19
  const { origin , searchParams } = new _url.URL((_url1 = req.url) != null ? _url1 : "/", getServerBase(req));
15
- const applicationId = searchParams.get("applicationId");
16
- if (!applicationId) {
17
- res.writeHead(400).end("Missing applicationId");
20
+ const appId = searchParams.get("appId") || searchParams.get("applicationId");
21
+ if (!appId) {
22
+ res.writeHead(400).end('Missing application identifier ("?appId=...")');
18
23
  return;
19
24
  }
20
- const app = await (0, _jsInspector).queryInspectorAppAsync(origin, applicationId);
25
+ const app = await (0, _jsInspector).queryInspectorAppAsync(origin, appId);
21
26
  if (!app) {
22
- res.writeHead(404).end("Unable to find inspector target from metro-inspector-proxy");
27
+ res.writeHead(404).end("Unable to find inspector target from @react-native/dev-middleware");
23
28
  console.warn(_chalk.default.yellow("No compatible apps connected. JavaScript Debugging can only be used with the Hermes engine."));
24
29
  return;
25
30
  }
@@ -33,7 +38,7 @@ function createJsInspectorMiddleware() {
33
38
  res.end(data);
34
39
  } else if (req.method === "POST" || req.method === "PUT") {
35
40
  try {
36
- await (0, _jsInspector).openJsInspector(app);
41
+ await (0, _jsInspector).openJsInspector(origin, app);
37
42
  } catch (error) {
38
43
  var ref;
39
44
  // abort(Error: Command failed: osascript -e POSIX path of (path to application "google chrome")
@@ -49,11 +54,6 @@ function createJsInspectorMiddleware() {
49
54
  }
50
55
  };
51
56
  }
52
- function _interopRequireDefault(obj) {
53
- return obj && obj.__esModule ? obj : {
54
- default: obj
55
- };
56
- }
57
57
  function getServerBase(req) {
58
58
  const scheme = req.socket instanceof _tls.TLSSocket && req.socket.encrypted === true ? "https" : "http";
59
59
  const { localAddress , localPort } = req.socket;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/start/server/middleware/inspector/createJsInspectorMiddleware.ts"],"sourcesContent":["import chalk from 'chalk';\nimport type { NextHandleFunction } from 'connect';\nimport type { IncomingMessage, ServerResponse } from 'http';\nimport net from 'net';\nimport { TLSSocket } from 'tls';\nimport { URL } from 'url';\n\nimport { openJsInspector, queryInspectorAppAsync } from './JsInspector';\n\nexport default function createJsInspectorMiddleware(): NextHandleFunction {\n return async function (req: IncomingMessage, res: ServerResponse, next: (err?: Error) => void) {\n const { origin, searchParams } = new URL(req.url ?? '/', getServerBase(req));\n const applicationId = searchParams.get('applicationId');\n if (!applicationId) {\n res.writeHead(400).end('Missing applicationId');\n return;\n }\n\n const app = await queryInspectorAppAsync(origin, applicationId);\n if (!app) {\n res.writeHead(404).end('Unable to find inspector target from metro-inspector-proxy');\n console.warn(\n chalk.yellow(\n 'No compatible apps connected. JavaScript Debugging can only be used with the Hermes engine.'\n )\n );\n return;\n }\n\n if (req.method === 'GET') {\n const data = JSON.stringify(app);\n res.writeHead(200, {\n 'Content-Type': 'application/json; charset=UTF-8',\n 'Cache-Control': 'no-cache',\n 'Content-Length': data.length.toString(),\n });\n res.end(data);\n } else if (req.method === 'POST' || req.method === 'PUT') {\n try {\n await openJsInspector(app);\n } catch (error: any) {\n // abort(Error: Command failed: osascript -e POSIX path of (path to application \"google chrome\")\n // 15:50: execution error: Google Chrome got an error: Application isn’t running. (-600)\n\n console.error(\n chalk.red('Error launching JS inspector: ' + (error?.message ?? 'Unknown error occurred'))\n );\n res.writeHead(500);\n res.end();\n return;\n }\n res.end();\n } else {\n res.writeHead(405);\n }\n };\n}\n\nfunction getServerBase(req: IncomingMessage): string {\n const scheme =\n req.socket instanceof TLSSocket && req.socket.encrypted === true ? 'https' : 'http';\n const { localAddress, localPort } = req.socket;\n const address = localAddress && net.isIPv6(localAddress) ? `[${localAddress}]` : localAddress;\n return `${scheme}:${address}:${localPort}`;\n}\n"],"names":["createJsInspectorMiddleware","req","res","next","origin","searchParams","URL","url","getServerBase","applicationId","get","writeHead","end","app","queryInspectorAppAsync","console","warn","chalk","yellow","method","data","JSON","stringify","length","toString","openJsInspector","error","red","message","scheme","socket","TLSSocket","encrypted","localAddress","localPort","address","net","isIPv6"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../src/start/server/middleware/inspector/createJsInspectorMiddleware.ts"],"sourcesContent":["import chalk from 'chalk';\nimport type { NextHandleFunction } from 'connect';\nimport type { IncomingMessage, ServerResponse } from 'http';\nimport net from 'net';\nimport { TLSSocket } from 'tls';\nimport { URL } from 'url';\n\nimport { openJsInspector, queryInspectorAppAsync } from './JsInspector';\n\n/**\n * Create a middleware that handles new requests to open the debugger from the dev menu.\n * @todo(cedric): delete this middleware once we fully swap over to the new React Native JS Inspector.\n */\nexport function createJsInspectorMiddleware(): NextHandleFunction {\n return async function (req: IncomingMessage, res: ServerResponse, next: (err?: Error) => void) {\n const { origin, searchParams } = new URL(req.url ?? '/', getServerBase(req));\n const appId = searchParams.get('appId') || searchParams.get('applicationId');\n if (!appId) {\n res.writeHead(400).end('Missing application identifier (\"?appId=...\")');\n return;\n }\n\n const app = await queryInspectorAppAsync(origin, appId);\n if (!app) {\n res.writeHead(404).end('Unable to find inspector target from @react-native/dev-middleware');\n console.warn(\n chalk.yellow(\n 'No compatible apps connected. JavaScript Debugging can only be used with the Hermes engine.'\n )\n );\n return;\n }\n\n if (req.method === 'GET') {\n const data = JSON.stringify(app);\n res.writeHead(200, {\n 'Content-Type': 'application/json; charset=UTF-8',\n 'Cache-Control': 'no-cache',\n 'Content-Length': data.length.toString(),\n });\n res.end(data);\n } else if (req.method === 'POST' || req.method === 'PUT') {\n try {\n await openJsInspector(origin, app);\n } catch (error: any) {\n // abort(Error: Command failed: osascript -e POSIX path of (path to application \"google chrome\")\n // 15:50: execution error: Google Chrome got an error: Application isn’t running. (-600)\n\n console.error(\n chalk.red('Error launching JS inspector: ' + (error?.message ?? 'Unknown error occurred'))\n );\n res.writeHead(500);\n res.end();\n return;\n }\n res.end();\n } else {\n res.writeHead(405);\n }\n };\n}\n\nfunction getServerBase(req: IncomingMessage): string {\n const scheme =\n req.socket instanceof TLSSocket && req.socket.encrypted === true ? 'https' : 'http';\n const { localAddress, localPort } = req.socket;\n const address = localAddress && net.isIPv6(localAddress) ? `[${localAddress}]` : localAddress;\n return `${scheme}:${address}:${localPort}`;\n}\n"],"names":["createJsInspectorMiddleware","req","res","next","origin","searchParams","URL","url","getServerBase","appId","get","writeHead","end","app","queryInspectorAppAsync","console","warn","chalk","yellow","method","data","JSON","stringify","length","toString","openJsInspector","error","red","message","scheme","socket","TLSSocket","encrypted","localAddress","localPort","address","net","isIPv6"],"mappings":"AAAA;;;;QAagBA,2BAA2B,GAA3BA,2BAA2B;AAbzB,IAAA,MAAO,kCAAP,OAAO,EAAA;AAGT,IAAA,IAAK,kCAAL,KAAK,EAAA;AACK,IAAA,IAAK,WAAL,KAAK,CAAA;AACX,IAAA,IAAK,WAAL,KAAK,CAAA;AAE+B,IAAA,YAAe,WAAf,eAAe,CAAA;;;;;;AAMhE,SAASA,2BAA2B,GAAuB;IAChE,OAAO,eAAgBC,GAAoB,EAAEC,GAAmB,EAAEC,IAA2B,EAAE;YACpDF,KAAO;QAAhD,MAAM,EAAEG,MAAM,CAAA,EAAEC,YAAY,CAAA,EAAE,GAAG,IAAIC,IAAG,IAAA,CAACL,CAAAA,KAAO,GAAPA,GAAG,CAACM,GAAG,YAAPN,KAAO,GAAI,GAAG,EAAEO,aAAa,CAACP,GAAG,CAAC,CAAC,AAAC;QAC7E,MAAMQ,KAAK,GAAGJ,YAAY,CAACK,GAAG,CAAC,OAAO,CAAC,IAAIL,YAAY,CAACK,GAAG,CAAC,eAAe,CAAC,AAAC;QAC7E,IAAI,CAACD,KAAK,EAAE;YACVP,GAAG,CAACS,SAAS,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,+CAA+C,CAAC,CAAC;YACxE,OAAO;SACR;QAED,MAAMC,GAAG,GAAG,MAAMC,CAAAA,GAAAA,YAAsB,AAAe,CAAA,uBAAf,CAACV,MAAM,EAAEK,KAAK,CAAC,AAAC;QACxD,IAAI,CAACI,GAAG,EAAE;YACRX,GAAG,CAACS,SAAS,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,mEAAmE,CAAC,CAAC;YAC5FG,OAAO,CAACC,IAAI,CACVC,MAAK,QAAA,CAACC,MAAM,CACV,6FAA6F,CAC9F,CACF,CAAC;YACF,OAAO;SACR;QAED,IAAIjB,GAAG,CAACkB,MAAM,KAAK,KAAK,EAAE;YACxB,MAAMC,IAAI,GAAGC,IAAI,CAACC,SAAS,CAACT,GAAG,CAAC,AAAC;YACjCX,GAAG,CAACS,SAAS,CAAC,GAAG,EAAE;gBACjB,cAAc,EAAE,iCAAiC;gBACjD,eAAe,EAAE,UAAU;gBAC3B,gBAAgB,EAAES,IAAI,CAACG,MAAM,CAACC,QAAQ,EAAE;aACzC,CAAC,CAAC;YACHtB,GAAG,CAACU,GAAG,CAACQ,IAAI,CAAC,CAAC;SACf,MAAM,IAAInB,GAAG,CAACkB,MAAM,KAAK,MAAM,IAAIlB,GAAG,CAACkB,MAAM,KAAK,KAAK,EAAE;YACxD,IAAI;gBACF,MAAMM,CAAAA,GAAAA,YAAe,AAAa,CAAA,gBAAb,CAACrB,MAAM,EAAES,GAAG,CAAC,CAAC;aACpC,CAAC,OAAOa,KAAK,EAAO;oBAK6BA,GAAc;gBAJ9D,gGAAgG;gBAChG,0FAAwF;gBAExFX,OAAO,CAACW,KAAK,CACXT,MAAK,QAAA,CAACU,GAAG,CAAC,gCAAgC,GAAG,CAACD,CAAAA,GAAc,GAAdA,KAAK,QAAS,GAAdA,KAAAA,CAAc,GAAdA,KAAK,CAAEE,OAAO,YAAdF,GAAc,GAAI,wBAAwB,CAAC,CAAC,CAC3F,CAAC;gBACFxB,GAAG,CAACS,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnBT,GAAG,CAACU,GAAG,EAAE,CAAC;gBACV,OAAO;aACR;YACDV,GAAG,CAACU,GAAG,EAAE,CAAC;SACX,MAAM;YACLV,GAAG,CAACS,SAAS,CAAC,GAAG,CAAC,CAAC;SACpB;KACF,CAAC;CACH;AAED,SAASH,aAAa,CAACP,GAAoB,EAAU;IACnD,MAAM4B,MAAM,GACV5B,GAAG,CAAC6B,MAAM,YAAYC,IAAS,UAAA,IAAI9B,GAAG,CAAC6B,MAAM,CAACE,SAAS,KAAK,IAAI,GAAG,OAAO,GAAG,MAAM,AAAC;IACtF,MAAM,EAAEC,YAAY,CAAA,EAAEC,SAAS,CAAA,EAAE,GAAGjC,GAAG,CAAC6B,MAAM,AAAC;IAC/C,MAAMK,OAAO,GAAGF,YAAY,IAAIG,IAAG,QAAA,CAACC,MAAM,CAACJ,YAAY,CAAC,GAAG,CAAC,CAAC,EAAEA,YAAY,CAAC,CAAC,CAAC,GAAGA,YAAY,AAAC;IAC9F,OAAO,CAAC,EAAEJ,MAAM,CAAC,CAAC,EAAEM,OAAO,CAAC,CAAC,EAAED,SAAS,CAAC,CAAC,CAAC;CAC5C"}
@@ -4,10 +4,14 @@ Object.defineProperty(exports, "__esModule", {
4
4
  });
5
5
  exports.shouldEnableAsyncImports = shouldEnableAsyncImports;
6
6
  exports.getBaseUrlFromExpoConfig = getBaseUrlFromExpoConfig;
7
+ exports.getAsyncRoutesFromExpoConfig = getAsyncRoutesFromExpoConfig;
8
+ exports.getMetroDirectBundleOptionsForExpoConfig = getMetroDirectBundleOptionsForExpoConfig;
7
9
  exports.getMetroDirectBundleOptions = getMetroDirectBundleOptions;
10
+ exports.createBundleUrlPathFromExpoConfig = createBundleUrlPathFromExpoConfig;
8
11
  exports.createBundleUrlPath = createBundleUrlPath;
9
12
  var _resolveFrom = _interopRequireDefault(require("resolve-from"));
10
13
  var _env = require("../../../utils/env");
14
+ var _router = require("../metro/router");
11
15
  function _interopRequireDefault(obj) {
12
16
  return obj && obj.__esModule ? obj : {
13
17
  default: obj
@@ -24,11 +28,12 @@ function shouldEnableAsyncImports(projectRoot) {
24
28
  // Expo Router automatically pulls this in, so we can check for it.
25
29
  return _resolveFrom.default.silent(projectRoot, "@expo/metro-runtime") != null;
26
30
  }
27
- function withDefaults({ mode ="development" , minify =mode === "production" , preserveEnvVars =_env.env.EXPO_NO_CLIENT_ENV_VARS , ...props }) {
31
+ function withDefaults({ mode ="development" , minify =mode === "production" , preserveEnvVars =_env.env.EXPO_NO_CLIENT_ENV_VARS , lazy , ...props }) {
28
32
  return {
29
33
  mode,
30
34
  minify,
31
35
  preserveEnvVars,
36
+ lazy: !props.isExporting && lazy,
32
37
  ...props
33
38
  };
34
39
  }
@@ -37,18 +42,47 @@ function getBaseUrlFromExpoConfig(exp) {
37
42
  var ref2;
38
43
  return (ref2 = (ref = exp.experiments) == null ? void 0 : (ref1 = ref.baseUrl) == null ? void 0 : ref1.trim().replace(/\/+$/, "")) != null ? ref2 : "";
39
44
  }
45
+ function getAsyncRoutesFromExpoConfig(exp, mode, platform) {
46
+ var ref, ref3;
47
+ let asyncRoutesSetting;
48
+ if ((ref = exp.extra) == null ? void 0 : (ref3 = ref.router) == null ? void 0 : ref3.asyncRoutes) {
49
+ var ref4, ref5;
50
+ const asyncRoutes = (ref4 = exp.extra) == null ? void 0 : (ref5 = ref4.router) == null ? void 0 : ref5.asyncRoutes;
51
+ if ([
52
+ "boolean",
53
+ "string"
54
+ ].includes(typeof asyncRoutes)) {
55
+ asyncRoutesSetting = asyncRoutes;
56
+ } else if (typeof asyncRoutes === "object") {
57
+ var _platform;
58
+ asyncRoutesSetting = (_platform = asyncRoutes[platform]) != null ? _platform : asyncRoutes.default;
59
+ }
60
+ }
61
+ return [
62
+ mode,
63
+ true
64
+ ].includes(asyncRoutesSetting);
65
+ }
66
+ function getMetroDirectBundleOptionsForExpoConfig(projectRoot, exp, options) {
67
+ return getMetroDirectBundleOptions({
68
+ ...options,
69
+ baseUrl: getBaseUrlFromExpoConfig(exp),
70
+ routerRoot: (0, _router).getRouterDirectoryModuleIdWithManifest(projectRoot, exp),
71
+ asyncRoutes: getAsyncRoutesFromExpoConfig(exp, options.mode, options.platform)
72
+ });
73
+ }
40
74
  function getMetroDirectBundleOptions(options) {
41
- const { mainModuleName , platform , mode , minify , environment , serializerOutput , serializerIncludeMaps , lazy , engine , preserveEnvVars , baseUrl , } = withDefaults(options);
75
+ const { mainModuleName , platform , mode , minify , environment , serializerOutput , serializerIncludeMaps , serializerIncludeBytecode , lazy , engine , preserveEnvVars , asyncRoutes , baseUrl , routerRoot , isExporting , } = withDefaults(options);
42
76
  const dev = mode !== "production";
43
77
  const isHermes = engine === "hermes";
44
- if (!dev && platform !== "web") {
45
- debug("Disabling lazy bundling for non-web platform in production mode");
78
+ if (isExporting) {
79
+ debug("Disabling lazy bundling for export build");
46
80
  options.lazy = false;
47
81
  }
48
82
  let fakeSourceUrl;
49
83
  let fakeSourceMapUrl;
50
84
  // TODO: Upstream support to Metro for passing custom serializer options.
51
- if (serializerIncludeMaps != null || serializerOutput != null) {
85
+ if (serializerIncludeMaps != null || serializerOutput != null || serializerIncludeBytecode != null) {
52
86
  fakeSourceUrl = new URL(createBundleUrlPath(options).replace(/^\//, ""), "http://localhost:8081").toString();
53
87
  if (serializerIncludeMaps) {
54
88
  fakeSourceMapUrl = fakeSourceUrl.replace(".bundle?", ".map?");
@@ -66,8 +100,10 @@ function getMetroDirectBundleOptions(options) {
66
100
  __proto__: null,
67
101
  engine,
68
102
  preserveEnvVars,
103
+ asyncRoutes,
69
104
  environment,
70
- baseUrl
105
+ baseUrl,
106
+ routerRoot
71
107
  },
72
108
  customResolverOptions: {
73
109
  __proto__: null,
@@ -77,13 +113,21 @@ function getMetroDirectBundleOptions(options) {
77
113
  sourceUrl: fakeSourceUrl,
78
114
  serializerOptions: {
79
115
  output: serializerOutput,
80
- includeMaps: serializerIncludeMaps
116
+ includeSourceMaps: serializerIncludeMaps,
117
+ includeBytecode: serializerIncludeBytecode
81
118
  }
82
119
  };
83
120
  return bundleOptions;
84
121
  }
122
+ function createBundleUrlPathFromExpoConfig(projectRoot, exp, options) {
123
+ return createBundleUrlPath({
124
+ ...options,
125
+ baseUrl: getBaseUrlFromExpoConfig(exp),
126
+ routerRoot: (0, _router).getRouterDirectoryModuleIdWithManifest(projectRoot, exp)
127
+ });
128
+ }
85
129
  function createBundleUrlPath(options) {
86
- const { platform , mainModuleName , mode , minify , environment , serializerOutput , serializerIncludeMaps , lazy , engine , preserveEnvVars , baseUrl , } = withDefaults(options);
130
+ const { platform , mainModuleName , mode , minify , environment , serializerOutput , serializerIncludeMaps , serializerIncludeBytecode , lazy , engine , preserveEnvVars , asyncRoutes , baseUrl , routerRoot , isExporting , } = withDefaults(options);
87
131
  const dev = String(mode !== "production");
88
132
  const queryParams = new URLSearchParams({
89
133
  platform: encodeURIComponent(platform),
@@ -92,7 +136,7 @@ function createBundleUrlPath(options) {
92
136
  hot: String(false)
93
137
  });
94
138
  // Lazy bundling must be disabled for bundle splitting to work.
95
- if (lazy && !dev) {
139
+ if (!isExporting && lazy) {
96
140
  queryParams.append("lazy", String(lazy));
97
141
  }
98
142
  if (minify) {
@@ -101,12 +145,18 @@ function createBundleUrlPath(options) {
101
145
  if (engine) {
102
146
  queryParams.append("transform.engine", engine);
103
147
  }
148
+ if (asyncRoutes) {
149
+ queryParams.append("transform.asyncRoutes", String(asyncRoutes));
150
+ }
104
151
  if (preserveEnvVars) {
105
152
  queryParams.append("transform.preserveEnvVars", String(preserveEnvVars));
106
153
  }
107
154
  if (baseUrl) {
108
155
  queryParams.append("transform.baseUrl", baseUrl);
109
156
  }
157
+ if (routerRoot != null) {
158
+ queryParams.append("transform.routerRoot", routerRoot);
159
+ }
110
160
  if (environment) {
111
161
  queryParams.append("resolver.environment", environment);
112
162
  queryParams.append("transform.environment", environment);
@@ -117,6 +167,9 @@ function createBundleUrlPath(options) {
117
167
  if (serializerIncludeMaps) {
118
168
  queryParams.append("serializer.map", String(serializerIncludeMaps));
119
169
  }
170
+ if (serializerIncludeBytecode) {
171
+ queryParams.append("serializer.bytecode", String(serializerIncludeBytecode));
172
+ }
120
173
  return `/${encodeURI(mainModuleName)}.bundle?${queryParams.toString()}`;
121
174
  }
122
175
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/middleware/metroOptions.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config';\nimport type { BundleOptions as MetroBundleOptions } from 'metro/src/shared/types';\nimport resolveFrom from 'resolve-from';\n\nimport { env } from '../../../utils/env';\n\nconst debug = require('debug')('expo:metro:options') as typeof console.log;\n\nexport function shouldEnableAsyncImports(projectRoot: string): boolean {\n if (env.EXPO_NO_METRO_LAZY) {\n return false;\n }\n\n // `@expo/metro-runtime` includes support for the fetch + eval runtime code required\n // to support async imports. If it's not installed, we can't support async imports.\n // If it is installed, the user MUST import it somewhere in their project.\n // Expo Router automatically pulls this in, so we can check for it.\n return resolveFrom.silent(projectRoot, '@expo/metro-runtime') != null;\n}\n\nexport type ExpoMetroOptions = {\n platform: string;\n mainModuleName: string;\n mode: string;\n minify?: boolean;\n environment?: string;\n serializerOutput?: 'static';\n serializerIncludeMaps?: boolean;\n lazy?: boolean;\n engine?: 'hermes';\n preserveEnvVars?: boolean;\n baseUrl?: string;\n};\n\nfunction withDefaults({\n mode = 'development',\n minify = mode === 'production',\n preserveEnvVars = env.EXPO_NO_CLIENT_ENV_VARS,\n ...props\n}: ExpoMetroOptions): ExpoMetroOptions {\n return {\n mode,\n minify,\n preserveEnvVars,\n ...props,\n };\n}\n\nexport type SerializerOptions = {\n includeMaps?: boolean;\n output?: 'static';\n};\n\nexport type ExpoMetroBundleOptions = MetroBundleOptions & {\n serializerOptions?: SerializerOptions;\n};\n\nexport function getBaseUrlFromExpoConfig(exp: ExpoConfig) {\n return exp.experiments?.baseUrl?.trim().replace(/\\/+$/, '') ?? '';\n}\n\nexport function getMetroDirectBundleOptions(\n options: ExpoMetroOptions\n): Partial<ExpoMetroBundleOptions> {\n const {\n mainModuleName,\n platform,\n mode,\n minify,\n environment,\n serializerOutput,\n serializerIncludeMaps,\n lazy,\n engine,\n preserveEnvVars,\n baseUrl,\n } = withDefaults(options);\n\n const dev = mode !== 'production';\n const isHermes = engine === 'hermes';\n\n if (!dev && platform !== 'web') {\n debug('Disabling lazy bundling for non-web platform in production mode');\n options.lazy = false;\n }\n\n let fakeSourceUrl: string | undefined;\n let fakeSourceMapUrl: string | undefined;\n\n // TODO: Upstream support to Metro for passing custom serializer options.\n if (serializerIncludeMaps != null || serializerOutput != null) {\n fakeSourceUrl = new URL(\n createBundleUrlPath(options).replace(/^\\//, ''),\n 'http://localhost:8081'\n ).toString();\n if (serializerIncludeMaps) {\n fakeSourceMapUrl = fakeSourceUrl.replace('.bundle?', '.map?');\n }\n }\n\n const bundleOptions: Partial<ExpoMetroBundleOptions> = {\n platform,\n entryFile: mainModuleName,\n dev,\n minify: !isHermes && (minify ?? !dev),\n inlineSourceMap: false,\n lazy,\n unstable_transformProfile: isHermes ? 'hermes-stable' : 'default',\n customTransformOptions: {\n __proto__: null,\n engine,\n preserveEnvVars,\n environment,\n baseUrl,\n },\n customResolverOptions: {\n __proto__: null,\n environment,\n },\n sourceMapUrl: fakeSourceMapUrl,\n sourceUrl: fakeSourceUrl,\n serializerOptions: {\n output: serializerOutput,\n includeMaps: serializerIncludeMaps,\n },\n };\n\n return bundleOptions;\n}\n\nexport function createBundleUrlPath(options: ExpoMetroOptions): string {\n const {\n platform,\n mainModuleName,\n mode,\n minify,\n environment,\n serializerOutput,\n serializerIncludeMaps,\n lazy,\n engine,\n preserveEnvVars,\n baseUrl,\n } = withDefaults(options);\n\n const dev = String(mode !== 'production');\n const queryParams = new URLSearchParams({\n platform: encodeURIComponent(platform),\n dev,\n // TODO: Is this still needed?\n hot: String(false),\n });\n\n // Lazy bundling must be disabled for bundle splitting to work.\n if (lazy && !dev) {\n queryParams.append('lazy', String(lazy));\n }\n\n if (minify) {\n queryParams.append('minify', String(minify));\n }\n\n if (engine) {\n queryParams.append('transform.engine', engine);\n }\n\n if (preserveEnvVars) {\n queryParams.append('transform.preserveEnvVars', String(preserveEnvVars));\n }\n if (baseUrl) {\n queryParams.append('transform.baseUrl', baseUrl);\n }\n\n if (environment) {\n queryParams.append('resolver.environment', environment);\n queryParams.append('transform.environment', environment);\n }\n\n if (serializerOutput) {\n queryParams.append('serializer.output', serializerOutput);\n }\n if (serializerIncludeMaps) {\n queryParams.append('serializer.map', String(serializerIncludeMaps));\n }\n\n return `/${encodeURI(mainModuleName)}.bundle?${queryParams.toString()}`;\n}\n"],"names":["shouldEnableAsyncImports","getBaseUrlFromExpoConfig","getMetroDirectBundleOptions","createBundleUrlPath","debug","require","projectRoot","env","EXPO_NO_METRO_LAZY","resolveFrom","silent","withDefaults","mode","minify","preserveEnvVars","EXPO_NO_CLIENT_ENV_VARS","props","exp","experiments","baseUrl","trim","replace","options","mainModuleName","platform","environment","serializerOutput","serializerIncludeMaps","lazy","engine","dev","isHermes","fakeSourceUrl","fakeSourceMapUrl","URL","toString","bundleOptions","entryFile","inlineSourceMap","unstable_transformProfile","customTransformOptions","__proto__","customResolverOptions","sourceMapUrl","sourceUrl","serializerOptions","output","includeMaps","String","queryParams","URLSearchParams","encodeURIComponent","hot","append","encodeURI"],"mappings":"AAAA;;;;QAQgBA,wBAAwB,GAAxBA,wBAAwB;QAiDxBC,wBAAwB,GAAxBA,wBAAwB;QAIxBC,2BAA2B,GAA3BA,2BAA2B;QAqE3BC,mBAAmB,GAAnBA,mBAAmB;AAhIX,IAAA,YAAc,kCAAd,cAAc,EAAA;AAElB,IAAA,IAAoB,WAApB,oBAAoB,CAAA;;;;;;AAExC,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,AAAsB,AAAC;AAEpE,SAASL,wBAAwB,CAACM,WAAmB,EAAW;IACrE,IAAIC,IAAG,IAAA,CAACC,kBAAkB,EAAE;QAC1B,OAAO,KAAK,CAAC;KACd;IAED,oFAAoF;IACpF,mFAAmF;IACnF,0EAA0E;IAC1E,mEAAmE;IACnE,OAAOC,YAAW,QAAA,CAACC,MAAM,CAACJ,WAAW,EAAE,qBAAqB,CAAC,IAAI,IAAI,CAAC;CACvE;AAgBD,SAASK,YAAY,CAAC,EACpBC,IAAI,EAAG,aAAa,CAAA,EACpBC,MAAM,EAAGD,IAAI,KAAK,YAAY,CAAA,EAC9BE,eAAe,EAAGP,IAAG,IAAA,CAACQ,uBAAuB,CAAA,EAC7C,GAAGC,KAAK,EACS,EAAoB;IACrC,OAAO;QACLJ,IAAI;QACJC,MAAM;QACNC,eAAe;QACf,GAAGE,KAAK;KACT,CAAC;CACH;AAWM,SAASf,wBAAwB,CAACgB,GAAe,EAAE;QACjDA,GAAe;QAAfA,IAAoD;IAA3D,OAAOA,CAAAA,IAAoD,GAApDA,CAAAA,GAAe,GAAfA,GAAG,CAACC,WAAW,SAAS,GAAxBD,KAAAA,CAAwB,GAAxBA,QAAAA,GAAe,CAAEE,OAAO,SAAA,GAAxBF,KAAAA,CAAwB,GAAxBA,KAA0BG,IAAI,EAAE,CAACC,OAAO,SAAS,EAAE,CAAC,YAApDJ,IAAoD,GAAI,EAAE,CAAC;CACnE;AAEM,SAASf,2BAA2B,CACzCoB,OAAyB,EACQ;IACjC,MAAM,EACJC,cAAc,CAAA,EACdC,QAAQ,CAAA,EACRZ,IAAI,CAAA,EACJC,MAAM,CAAA,EACNY,WAAW,CAAA,EACXC,gBAAgB,CAAA,EAChBC,qBAAqB,CAAA,EACrBC,IAAI,CAAA,EACJC,MAAM,CAAA,EACNf,eAAe,CAAA,EACfK,OAAO,CAAA,IACR,GAAGR,YAAY,CAACW,OAAO,CAAC,AAAC;IAE1B,MAAMQ,GAAG,GAAGlB,IAAI,KAAK,YAAY,AAAC;IAClC,MAAMmB,QAAQ,GAAGF,MAAM,KAAK,QAAQ,AAAC;IAErC,IAAI,CAACC,GAAG,IAAIN,QAAQ,KAAK,KAAK,EAAE;QAC9BpB,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACzEkB,OAAO,CAACM,IAAI,GAAG,KAAK,CAAC;KACtB;IAED,IAAII,aAAa,AAAoB,AAAC;IACtC,IAAIC,gBAAgB,AAAoB,AAAC;IAEzC,yEAAyE;IACzE,IAAIN,qBAAqB,IAAI,IAAI,IAAID,gBAAgB,IAAI,IAAI,EAAE;QAC7DM,aAAa,GAAG,IAAIE,GAAG,CACrB/B,mBAAmB,CAACmB,OAAO,CAAC,CAACD,OAAO,QAAQ,EAAE,CAAC,EAC/C,uBAAuB,CACxB,CAACc,QAAQ,EAAE,CAAC;QACb,IAAIR,qBAAqB,EAAE;YACzBM,gBAAgB,GAAGD,aAAa,CAACX,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;SAC/D;KACF;IAED,MAAMe,aAAa,GAAoC;QACrDZ,QAAQ;QACRa,SAAS,EAAEd,cAAc;QACzBO,GAAG;QACHjB,MAAM,EAAE,CAACkB,QAAQ,IAAI,CAAClB,MAAM,WAANA,MAAM,GAAI,CAACiB,GAAG,CAAC;QACrCQ,eAAe,EAAE,KAAK;QACtBV,IAAI;QACJW,yBAAyB,EAAER,QAAQ,GAAG,eAAe,GAAG,SAAS;QACjES,sBAAsB,EAAE;YACtBC,SAAS,EAAE,IAAI;YACfZ,MAAM;YACNf,eAAe;YACfW,WAAW;YACXN,OAAO;SACR;QACDuB,qBAAqB,EAAE;YACrBD,SAAS,EAAE,IAAI;YACfhB,WAAW;SACZ;QACDkB,YAAY,EAAEV,gBAAgB;QAC9BW,SAAS,EAAEZ,aAAa;QACxBa,iBAAiB,EAAE;YACjBC,MAAM,EAAEpB,gBAAgB;YACxBqB,WAAW,EAAEpB,qBAAqB;SACnC;KACF,AAAC;IAEF,OAAOS,aAAa,CAAC;CACtB;AAEM,SAASjC,mBAAmB,CAACmB,OAAyB,EAAU;IACrE,MAAM,EACJE,QAAQ,CAAA,EACRD,cAAc,CAAA,EACdX,IAAI,CAAA,EACJC,MAAM,CAAA,EACNY,WAAW,CAAA,EACXC,gBAAgB,CAAA,EAChBC,qBAAqB,CAAA,EACrBC,IAAI,CAAA,EACJC,MAAM,CAAA,EACNf,eAAe,CAAA,EACfK,OAAO,CAAA,IACR,GAAGR,YAAY,CAACW,OAAO,CAAC,AAAC;IAE1B,MAAMQ,GAAG,GAAGkB,MAAM,CAACpC,IAAI,KAAK,YAAY,CAAC,AAAC;IAC1C,MAAMqC,WAAW,GAAG,IAAIC,eAAe,CAAC;QACtC1B,QAAQ,EAAE2B,kBAAkB,CAAC3B,QAAQ,CAAC;QACtCM,GAAG;QACH,8BAA8B;QAC9BsB,GAAG,EAAEJ,MAAM,CAAC,KAAK,CAAC;KACnB,CAAC,AAAC;IAEH,+DAA+D;IAC/D,IAAIpB,IAAI,IAAI,CAACE,GAAG,EAAE;QAChBmB,WAAW,CAACI,MAAM,CAAC,MAAM,EAAEL,MAAM,CAACpB,IAAI,CAAC,CAAC,CAAC;KAC1C;IAED,IAAIf,MAAM,EAAE;QACVoC,WAAW,CAACI,MAAM,CAAC,QAAQ,EAAEL,MAAM,CAACnC,MAAM,CAAC,CAAC,CAAC;KAC9C;IAED,IAAIgB,MAAM,EAAE;QACVoB,WAAW,CAACI,MAAM,CAAC,kBAAkB,EAAExB,MAAM,CAAC,CAAC;KAChD;IAED,IAAIf,eAAe,EAAE;QACnBmC,WAAW,CAACI,MAAM,CAAC,2BAA2B,EAAEL,MAAM,CAAClC,eAAe,CAAC,CAAC,CAAC;KAC1E;IACD,IAAIK,OAAO,EAAE;QACX8B,WAAW,CAACI,MAAM,CAAC,mBAAmB,EAAElC,OAAO,CAAC,CAAC;KAClD;IAED,IAAIM,WAAW,EAAE;QACfwB,WAAW,CAACI,MAAM,CAAC,sBAAsB,EAAE5B,WAAW,CAAC,CAAC;QACxDwB,WAAW,CAACI,MAAM,CAAC,uBAAuB,EAAE5B,WAAW,CAAC,CAAC;KAC1D;IAED,IAAIC,gBAAgB,EAAE;QACpBuB,WAAW,CAACI,MAAM,CAAC,mBAAmB,EAAE3B,gBAAgB,CAAC,CAAC;KAC3D;IACD,IAAIC,qBAAqB,EAAE;QACzBsB,WAAW,CAACI,MAAM,CAAC,gBAAgB,EAAEL,MAAM,CAACrB,qBAAqB,CAAC,CAAC,CAAC;KACrE;IAED,OAAO,CAAC,CAAC,EAAE2B,SAAS,CAAC/B,cAAc,CAAC,CAAC,QAAQ,EAAE0B,WAAW,CAACd,QAAQ,EAAE,CAAC,CAAC,CAAC;CACzE"}
1
+ {"version":3,"sources":["../../../../../src/start/server/middleware/metroOptions.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config';\nimport type { BundleOptions as MetroBundleOptions } from 'metro/src/shared/types';\nimport resolveFrom from 'resolve-from';\n\nimport { env } from '../../../utils/env';\nimport { getRouterDirectoryModuleIdWithManifest } from '../metro/router';\n\nconst debug = require('debug')('expo:metro:options') as typeof console.log;\n\nexport type ExpoMetroOptions = {\n platform: string;\n mainModuleName: string;\n mode: string;\n minify?: boolean;\n environment?: string;\n serializerOutput?: 'static';\n serializerIncludeMaps?: boolean;\n serializerIncludeBytecode?: boolean;\n lazy?: boolean;\n engine?: 'hermes';\n preserveEnvVars?: boolean;\n asyncRoutes?: boolean;\n\n baseUrl?: string;\n isExporting: boolean;\n /** Module ID relative to the projectRoot for the Expo Router app directory. */\n routerRoot: string;\n};\n\nexport type SerializerOptions = {\n includeSourceMaps?: boolean;\n includeBytecode?: boolean;\n output?: 'static';\n};\n\nexport type ExpoMetroBundleOptions = MetroBundleOptions & {\n serializerOptions?: SerializerOptions;\n};\n\nexport function shouldEnableAsyncImports(projectRoot: string): boolean {\n if (env.EXPO_NO_METRO_LAZY) {\n return false;\n }\n\n // `@expo/metro-runtime` includes support for the fetch + eval runtime code required\n // to support async imports. If it's not installed, we can't support async imports.\n // If it is installed, the user MUST import it somewhere in their project.\n // Expo Router automatically pulls this in, so we can check for it.\n return resolveFrom.silent(projectRoot, '@expo/metro-runtime') != null;\n}\n\nfunction withDefaults({\n mode = 'development',\n minify = mode === 'production',\n preserveEnvVars = env.EXPO_NO_CLIENT_ENV_VARS,\n lazy,\n ...props\n}: ExpoMetroOptions): ExpoMetroOptions {\n return {\n mode,\n minify,\n preserveEnvVars,\n lazy: !props.isExporting && lazy,\n ...props,\n };\n}\n\nexport function getBaseUrlFromExpoConfig(exp: ExpoConfig) {\n return exp.experiments?.baseUrl?.trim().replace(/\\/+$/, '') ?? '';\n}\nexport function getAsyncRoutesFromExpoConfig(exp: ExpoConfig, mode: string, platform: string) {\n let asyncRoutesSetting;\n\n if (exp.extra?.router?.asyncRoutes) {\n const asyncRoutes = exp.extra?.router?.asyncRoutes;\n if (['boolean', 'string'].includes(typeof asyncRoutes)) {\n asyncRoutesSetting = asyncRoutes;\n } else if (typeof asyncRoutes === 'object') {\n asyncRoutesSetting = asyncRoutes[platform] ?? asyncRoutes.default;\n }\n }\n\n return [mode, true].includes(asyncRoutesSetting);\n}\n\nexport function getMetroDirectBundleOptionsForExpoConfig(\n projectRoot: string,\n exp: ExpoConfig,\n options: Omit<ExpoMetroOptions, 'baseUrl' | 'routerRoot' | 'asyncRoutes'>\n): Partial<ExpoMetroBundleOptions> {\n return getMetroDirectBundleOptions({\n ...options,\n baseUrl: getBaseUrlFromExpoConfig(exp),\n routerRoot: getRouterDirectoryModuleIdWithManifest(projectRoot, exp),\n asyncRoutes: getAsyncRoutesFromExpoConfig(exp, options.mode, options.platform),\n });\n}\n\nexport function getMetroDirectBundleOptions(\n options: ExpoMetroOptions\n): Partial<ExpoMetroBundleOptions> {\n const {\n mainModuleName,\n platform,\n mode,\n minify,\n environment,\n serializerOutput,\n serializerIncludeMaps,\n serializerIncludeBytecode,\n lazy,\n engine,\n preserveEnvVars,\n asyncRoutes,\n baseUrl,\n routerRoot,\n isExporting,\n } = withDefaults(options);\n\n const dev = mode !== 'production';\n const isHermes = engine === 'hermes';\n\n if (isExporting) {\n debug('Disabling lazy bundling for export build');\n options.lazy = false;\n }\n\n let fakeSourceUrl: string | undefined;\n let fakeSourceMapUrl: string | undefined;\n\n // TODO: Upstream support to Metro for passing custom serializer options.\n if (\n serializerIncludeMaps != null ||\n serializerOutput != null ||\n serializerIncludeBytecode != null\n ) {\n fakeSourceUrl = new URL(\n createBundleUrlPath(options).replace(/^\\//, ''),\n 'http://localhost:8081'\n ).toString();\n if (serializerIncludeMaps) {\n fakeSourceMapUrl = fakeSourceUrl.replace('.bundle?', '.map?');\n }\n }\n\n const bundleOptions: Partial<ExpoMetroBundleOptions> = {\n platform,\n entryFile: mainModuleName,\n dev,\n minify: !isHermes && (minify ?? !dev),\n inlineSourceMap: false,\n lazy,\n unstable_transformProfile: isHermes ? 'hermes-stable' : 'default',\n customTransformOptions: {\n __proto__: null,\n engine,\n preserveEnvVars,\n asyncRoutes,\n environment,\n baseUrl,\n routerRoot,\n },\n customResolverOptions: {\n __proto__: null,\n environment,\n },\n sourceMapUrl: fakeSourceMapUrl,\n sourceUrl: fakeSourceUrl,\n serializerOptions: {\n output: serializerOutput,\n includeSourceMaps: serializerIncludeMaps,\n includeBytecode: serializerIncludeBytecode,\n },\n };\n\n return bundleOptions;\n}\n\nexport function createBundleUrlPathFromExpoConfig(\n projectRoot: string,\n exp: ExpoConfig,\n options: Omit<ExpoMetroOptions, 'baseUrl' | 'routerRoot'>\n): string {\n return createBundleUrlPath({\n ...options,\n baseUrl: getBaseUrlFromExpoConfig(exp),\n routerRoot: getRouterDirectoryModuleIdWithManifest(projectRoot, exp),\n });\n}\n\nexport function createBundleUrlPath(options: ExpoMetroOptions): string {\n const {\n platform,\n mainModuleName,\n mode,\n minify,\n environment,\n serializerOutput,\n serializerIncludeMaps,\n serializerIncludeBytecode,\n lazy,\n engine,\n preserveEnvVars,\n asyncRoutes,\n baseUrl,\n routerRoot,\n isExporting,\n } = withDefaults(options);\n\n const dev = String(mode !== 'production');\n const queryParams = new URLSearchParams({\n platform: encodeURIComponent(platform),\n dev,\n // TODO: Is this still needed?\n hot: String(false),\n });\n\n // Lazy bundling must be disabled for bundle splitting to work.\n if (!isExporting && lazy) {\n queryParams.append('lazy', String(lazy));\n }\n\n if (minify) {\n queryParams.append('minify', String(minify));\n }\n\n if (engine) {\n queryParams.append('transform.engine', engine);\n }\n\n if (asyncRoutes) {\n queryParams.append('transform.asyncRoutes', String(asyncRoutes));\n }\n if (preserveEnvVars) {\n queryParams.append('transform.preserveEnvVars', String(preserveEnvVars));\n }\n if (baseUrl) {\n queryParams.append('transform.baseUrl', baseUrl);\n }\n if (routerRoot != null) {\n queryParams.append('transform.routerRoot', routerRoot);\n }\n\n if (environment) {\n queryParams.append('resolver.environment', environment);\n queryParams.append('transform.environment', environment);\n }\n\n if (serializerOutput) {\n queryParams.append('serializer.output', serializerOutput);\n }\n if (serializerIncludeMaps) {\n queryParams.append('serializer.map', String(serializerIncludeMaps));\n }\n if (serializerIncludeBytecode) {\n queryParams.append('serializer.bytecode', String(serializerIncludeBytecode));\n }\n\n return `/${encodeURI(mainModuleName)}.bundle?${queryParams.toString()}`;\n}\n"],"names":["shouldEnableAsyncImports","getBaseUrlFromExpoConfig","getAsyncRoutesFromExpoConfig","getMetroDirectBundleOptionsForExpoConfig","getMetroDirectBundleOptions","createBundleUrlPathFromExpoConfig","createBundleUrlPath","debug","require","projectRoot","env","EXPO_NO_METRO_LAZY","resolveFrom","silent","withDefaults","mode","minify","preserveEnvVars","EXPO_NO_CLIENT_ENV_VARS","lazy","props","isExporting","exp","experiments","baseUrl","trim","replace","platform","asyncRoutesSetting","extra","router","asyncRoutes","includes","default","options","routerRoot","getRouterDirectoryModuleIdWithManifest","mainModuleName","environment","serializerOutput","serializerIncludeMaps","serializerIncludeBytecode","engine","dev","isHermes","fakeSourceUrl","fakeSourceMapUrl","URL","toString","bundleOptions","entryFile","inlineSourceMap","unstable_transformProfile","customTransformOptions","__proto__","customResolverOptions","sourceMapUrl","sourceUrl","serializerOptions","output","includeSourceMaps","includeBytecode","String","queryParams","URLSearchParams","encodeURIComponent","hot","append","encodeURI"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../src/start/server/type-generation/__typetests__/fixtures/basic.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable import/export */\n/* eslint-disable @typescript-eslint/ban-types */\n\nimport type { LinkProps as OriginalLinkProps } from 'expo-router/build/link/Link';\nimport type { Router as OriginalRouter } from 'expo-router/src/types';\nexport * from 'expo-router/build';\n\n// prettier-ignore\ntype StaticRoutes = `/apple` | `/banana`;\n// prettier-ignore\ntype DynamicRoutes<T extends string> = `/colors/${SingleRoutePart<T>}` | `/animals/${CatchAllRoutePart<T>}` | `/mix/${SingleRoutePart<T>}/${SingleRoutePart<T>}/${CatchAllRoutePart<T>}`;\n// prettier-ignore\ntype DynamicRouteTemplate = `/colors/[color]` | `/animals/[...animal]` | `/mix/[fruit]/[color]/[...animals]`;\n\ntype RelativePathString = `./${string}` | `../${string}` | '..';\ntype AbsoluteRoute = DynamicRouteTemplate | StaticRoutes;\ntype ExternalPathString = `http${string}`;\ntype ExpoRouterRoutes = DynamicRouteTemplate | StaticRoutes | RelativePathString;\ntype AllRoutes = ExpoRouterRoutes | ExternalPathString;\n\n/****************\n * Route Utils *\n ****************/\n\ntype SearchOrHash = `?${string}` | `#${string}`;\ntype UnknownInputParams = Record<string, string | number | (string | number)[]>;\ntype UnknownOutputParams = Record<string, string | string[]>;\n\n/**\n * Return only the RoutePart of a string. If the string has multiple parts return never\n *\n * string | type\n * ---------|------\n * 123 | 123\n * /123/abc | never\n * 123?abc | never\n * ./123 | never\n * /123 | never\n * 123/../ | never\n */\ntype SingleRoutePart<S extends string> = S extends `${string}/${string}`\n ? never\n : S extends `${string}${SearchOrHash}`\n ? never\n : S extends ''\n ? never\n : S extends `(${string})`\n ? never\n : S extends `[${string}]`\n ? never\n : S;\n\n/**\n * Return only the CatchAll router part. If the string has search parameters or a hash return never\n */\ntype CatchAllRoutePart<S extends string> = S extends `${string}${SearchOrHash}`\n ? never\n : S extends ''\n ? never\n : S extends `${string}(${string})${string}`\n ? never\n : S extends `${string}[${string}]${string}`\n ? never\n : S;\n\n// type OptionalCatchAllRoutePart<S extends string> = S extends `${string}${SearchOrHash}` ? never : S\n\n/**\n * Return the name of a route parameter\n * '[test]' -> 'test'\n * 'test' -> never\n * '[...test]' -> '...test'\n */\ntype IsParameter<Part> = Part extends `[${infer ParamName}]` ? ParamName : never;\n\n/**\n * Return a union of all parameter names. If there are no names return never\n *\n * /[test] -> 'test'\n * /[abc]/[...def] -> 'abc'|'...def'\n */\ntype ParameterNames<Path> = Path extends `${infer PartA}/${infer PartB}`\n ? IsParameter<PartA> | ParameterNames<PartB>\n : IsParameter<Path>;\n\n/**\n * Returns all segements of a route.\n *\n * /(group)/123/abc/[id]/[...rest] -> ['(group)', '123', 'abc', '[id]', '[...rest]'\n */\ntype RouteSegments<Path> = Path extends `${infer PartA}/${infer PartB}`\n ? PartA extends '' | '.'\n ? [...RouteSegments<PartB>]\n : [PartA, ...RouteSegments<PartB>]\n : Path extends ''\n ? []\n : [Path];\n\n/**\n * Returns a Record of the routes parameters as strings and CatchAll parameters\n *\n * There are two versions, input and output, as you can input 'string | number' but\n * the output will always be 'string'\n *\n * /[id]/[...rest] -> { id: string, rest: string[] }\n * /no-params -> {}\n */\ntype InputRouteParams<Path> = {\n [Key in ParameterNames<Path> as Key extends `...${infer Name}`\n ? Name\n : Key]: Key extends `...${string}` ? (string | number)[] : string | number;\n} & UnknownInputParams;\n\ntype OutputRouteParams<Path> = {\n [Key in ParameterNames<Path> as Key extends `...${infer Name}`\n ? Name\n : Key]: Key extends `...${string}` ? string[] : string;\n} & UnknownOutputParams;\n\n/**\n * Returns the search parameters for a route.\n */\nexport type SearchParams<T extends AllRoutes> = T extends DynamicRouteTemplate\n ? OutputRouteParams<T>\n : T extends StaticRoutes\n ? never\n : UnknownOutputParams;\n\n/**\n * Route is mostly used as part of Href to ensure that a valid route is provided\n *\n * Given a dynamic route, this will return never. This is helpful for conditional logic\n *\n * /test -> /test, /test2, etc\n * /test/[abc] -> never\n * /test/resolve -> /test, /test2, etc\n *\n * Note that if we provide a value for [abc] then the route is allowed\n *\n * This is named Route to prevent confusion, as users they will often see it in tooltips\n */\nexport type Route<T> = T extends string\n ? T extends DynamicRouteTemplate\n ? never\n :\n | StaticRoutes\n | RelativePathString\n | ExternalPathString\n | (T extends `${infer P}${SearchOrHash}`\n ? P extends DynamicRoutes<infer _>\n ? T\n : never\n : T extends DynamicRoutes<infer _>\n ? T\n : never)\n : never;\n\n/*********\n * Href *\n *********/\n\nexport type Href<T> = T extends Record<'pathname', string> ? HrefObject<T> : Route<T>;\n\nexport type HrefObject<\n R extends Record<'pathname', string>,\n P = R['pathname'],\n> = P extends DynamicRouteTemplate\n ? { pathname: P; params: InputRouteParams<P> }\n : P extends Route<P>\n ? { pathname: Route<P> | DynamicRouteTemplate; params?: never | InputRouteParams<never> }\n : never;\n\n/***********************\n * Expo Router Exports *\n ***********************/\n\nexport type Router = Omit<OriginalRouter, 'push' | 'replace' | 'setParams'> & {\n /** Navigate to the provided href. */\n push: <T>(href: Href<T>) => void;\n /** Navigate to route without appending to the history. */\n replace: <T>(href: Href<T>) => void;\n /** Update the current route query params. */\n setParams: <T = ''>(params?: T extends '' ? Record<string, string> : InputRouteParams<T>) => void;\n};\n\n/** The imperative router. */\nexport declare const router: Router;\n\n/************\n * <Link /> *\n ************/\nexport interface LinkProps<T> extends OriginalLinkProps {\n href: Href<T>;\n}\n\nexport interface LinkComponent {\n <T>(props: React.PropsWithChildren<LinkProps<T>>): JSX.Element;\n /** Helper method to resolve an Href object into a string. */\n resolveHref: <T>(href: Href<T>) => string;\n}\n\n/**\n * Component to render link to another route using a path.\n * Uses an anchor tag on the web.\n *\n * @param props.href Absolute path to route (e.g. `/feeds/hot`).\n * @param props.replace Should replace the current route without adding to the history.\n * @param props.asChild Forward props to child component. Useful for custom buttons.\n * @param props.children Child elements to render the content.\n * @param props.className On web, this sets the HTML `class` directly. On native, this can be used with CSS interop tools like Nativewind.\n */\nexport declare const Link: LinkComponent;\n\n/** Redirects to the href as soon as the component is mounted. */\nexport declare const Redirect: <T>(\n props: React.PropsWithChildren<{ href: Href<T> }>\n) => JSX.Element;\n\n/************\n * Hooks *\n ************/\nexport declare function useRouter(): Router;\n\nexport declare function useLocalSearchParams<\n T extends AllRoutes | UnknownOutputParams = UnknownOutputParams,\n>(): T extends AllRoutes ? SearchParams<T> : T;\n\n/** @deprecated renamed to `useGlobalSearchParams` */\nexport declare function useSearchParams<\n T extends AllRoutes | UnknownOutputParams = UnknownOutputParams,\n>(): T extends AllRoutes ? SearchParams<T> : T;\n\nexport declare function useGlobalSearchParams<\n T extends AllRoutes | UnknownOutputParams = UnknownOutputParams,\n>(): T extends AllRoutes ? SearchParams<T> : T;\n\nexport declare function useSegments<\n T extends AbsoluteRoute | RouteSegments<AbsoluteRoute> | RelativePathString,\n>(): T extends AbsoluteRoute ? RouteSegments<T> : T extends string ? string[] : T;\n"],"names":[],"mappings":"AAIA;;;;6CAEc,mBAAmB;AAAjC,YAAA,MAAkC;;2CAAlC,MAAkC;;;;mBAAlC,MAAkC;;;EAAA"}
1
+ {"version":3,"sources":["../../../../../../../src/start/server/type-generation/__typetests__/fixtures/basic.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable import/export */\n/* eslint-disable @typescript-eslint/ban-types */\n\nimport type { LinkProps as OriginalLinkProps } from 'expo-router/build/link/Link';\nimport type { Router as OriginalRouter } from 'expo-router/src/types';\nexport * from 'expo-router/build';\n\n// prettier-ignore\ntype StaticRoutes = `/apple` | `/banana`;\n// prettier-ignore\ntype DynamicRoutes<T extends string> = `/colors/${SingleRoutePart<T>}` | `/animals/${CatchAllRoutePart<T>}` | `/mix/${SingleRoutePart<T>}/${SingleRoutePart<T>}/${CatchAllRoutePart<T>}`;\n// prettier-ignore\ntype DynamicRouteTemplate = `/colors/[color]` | `/animals/[...animal]` | `/mix/[fruit]/[color]/[...animals]`;\n\ntype RelativePathString = `./${string}` | `../${string}` | '..';\ntype AbsoluteRoute = DynamicRouteTemplate | StaticRoutes;\ntype ExternalPathString = `${string}:${string}`;\n\ntype ExpoRouterRoutes = DynamicRouteTemplate | StaticRoutes | RelativePathString;\ntype AllRoutes = ExpoRouterRoutes | ExternalPathString;\n\n/****************\n * Route Utils *\n ****************/\n\ntype SearchOrHash = `?${string}` | `#${string}`;\ntype UnknownInputParams = Record<string, string | number | (string | number)[]>;\ntype UnknownOutputParams = Record<string, string | string[]>;\n\n/**\n * Return only the RoutePart of a string. If the string has multiple parts return never\n *\n * string | type\n * ---------|------\n * 123 | 123\n * /123/abc | never\n * 123?abc | never\n * ./123 | never\n * /123 | never\n * 123/../ | never\n */\ntype SingleRoutePart<S extends string> = S extends `${string}/${string}`\n ? never\n : S extends `${string}${SearchOrHash}`\n ? never\n : S extends ''\n ? never\n : S extends `(${string})`\n ? never\n : S extends `[${string}]`\n ? never\n : S;\n\n/**\n * Return only the CatchAll router part. If the string has search parameters or a hash return never\n */\ntype CatchAllRoutePart<S extends string> = S extends `${string}${SearchOrHash}`\n ? never\n : S extends ''\n ? never\n : S extends `${string}(${string})${string}`\n ? never\n : S extends `${string}[${string}]${string}`\n ? never\n : S;\n\n// type OptionalCatchAllRoutePart<S extends string> = S extends `${string}${SearchOrHash}` ? never : S\n\n/**\n * Return the name of a route parameter\n * '[test]' -> 'test'\n * 'test' -> never\n * '[...test]' -> '...test'\n */\ntype IsParameter<Part> = Part extends `[${infer ParamName}]` ? ParamName : never;\n\n/**\n * Return a union of all parameter names. If there are no names return never\n *\n * /[test] -> 'test'\n * /[abc]/[...def] -> 'abc'|'...def'\n */\ntype ParameterNames<Path> = Path extends `${infer PartA}/${infer PartB}`\n ? IsParameter<PartA> | ParameterNames<PartB>\n : IsParameter<Path>;\n\n/**\n * Returns all segements of a route.\n *\n * /(group)/123/abc/[id]/[...rest] -> ['(group)', '123', 'abc', '[id]', '[...rest]'\n */\ntype RouteSegments<Path> = Path extends `${infer PartA}/${infer PartB}`\n ? PartA extends '' | '.'\n ? [...RouteSegments<PartB>]\n : [PartA, ...RouteSegments<PartB>]\n : Path extends ''\n ? []\n : [Path];\n\n/**\n * Returns a Record of the routes parameters as strings and CatchAll parameters\n *\n * There are two versions, input and output, as you can input 'string | number' but\n * the output will always be 'string'\n *\n * /[id]/[...rest] -> { id: string, rest: string[] }\n * /no-params -> {}\n */\ntype InputRouteParams<Path> = {\n [Key in ParameterNames<Path> as Key extends `...${infer Name}`\n ? Name\n : Key]: Key extends `...${string}` ? (string | number)[] : string | number;\n} & UnknownInputParams;\n\ntype OutputRouteParams<Path> = {\n [Key in ParameterNames<Path> as Key extends `...${infer Name}`\n ? Name\n : Key]: Key extends `...${string}` ? string[] : string;\n} & UnknownOutputParams;\n\n/**\n * Returns the search parameters for a route.\n */\nexport type SearchParams<T extends AllRoutes> = T extends DynamicRouteTemplate\n ? OutputRouteParams<T>\n : T extends StaticRoutes\n ? never\n : UnknownOutputParams;\n\n/**\n * Route is mostly used as part of Href to ensure that a valid route is provided\n *\n * Given a dynamic route, this will return never. This is helpful for conditional logic\n *\n * /test -> /test, /test2, etc\n * /test/[abc] -> never\n * /test/resolve -> /test, /test2, etc\n *\n * Note that if we provide a value for [abc] then the route is allowed\n *\n * This is named Route to prevent confusion, as users they will often see it in tooltips\n */\nexport type Route<T> = T extends string\n ? T extends DynamicRouteTemplate\n ? never\n :\n | StaticRoutes\n | RelativePathString\n | ExternalPathString\n | (T extends `${infer P}${SearchOrHash}`\n ? P extends DynamicRoutes<infer _>\n ? T\n : never\n : T extends DynamicRoutes<infer _>\n ? T\n : never)\n : never;\n\n/*********\n * Href *\n *********/\n\nexport type Href<T> = T extends Record<'pathname', string> ? HrefObject<T> : Route<T>;\n\nexport type HrefObject<\n R extends Record<'pathname', string>,\n P = R['pathname'],\n> = P extends DynamicRouteTemplate\n ? { pathname: P; params: InputRouteParams<P> }\n : P extends Route<P>\n ? { pathname: Route<P> | DynamicRouteTemplate; params?: never | InputRouteParams<never> }\n : never;\n\n/***********************\n * Expo Router Exports *\n ***********************/\n\nexport type Router = Omit<OriginalRouter, 'push' | 'replace' | 'setParams'> & {\n /** Navigate to the provided href. */\n push: <T>(href: Href<T>) => void;\n /** Navigate to route without appending to the history. */\n replace: <T>(href: Href<T>) => void;\n /** Update the current route query params. */\n setParams: <T = ''>(params?: T extends '' ? Record<string, string> : InputRouteParams<T>) => void;\n};\n\n/** The imperative router. */\nexport declare const router: Router;\n\n/************\n * <Link /> *\n ************/\nexport interface LinkProps<T> extends OriginalLinkProps {\n href: Href<T>;\n}\n\nexport interface LinkComponent {\n <T>(props: React.PropsWithChildren<LinkProps<T>>): JSX.Element;\n /** Helper method to resolve an Href object into a string. */\n resolveHref: <T>(href: Href<T>) => string;\n}\n\n/**\n * Component to render link to another route using a path.\n * Uses an anchor tag on the web.\n *\n * @param props.href Absolute path to route (e.g. `/feeds/hot`).\n * @param props.replace Should replace the current route without adding to the history.\n * @param props.asChild Forward props to child component. Useful for custom buttons.\n * @param props.children Child elements to render the content.\n * @param props.className On web, this sets the HTML `class` directly. On native, this can be used with CSS interop tools like Nativewind.\n */\nexport declare const Link: LinkComponent;\n\n/** Redirects to the href as soon as the component is mounted. */\nexport declare const Redirect: <T>(\n props: React.PropsWithChildren<{ href: Href<T> }>\n) => JSX.Element;\n\n/************\n * Hooks *\n ************/\nexport declare function useRouter(): Router;\n\nexport declare function useLocalSearchParams<\n T extends AllRoutes | UnknownOutputParams = UnknownOutputParams,\n>(): T extends AllRoutes ? SearchParams<T> : T;\n\n/** @deprecated renamed to `useGlobalSearchParams` */\nexport declare function useSearchParams<\n T extends AllRoutes | UnknownOutputParams = UnknownOutputParams,\n>(): T extends AllRoutes ? SearchParams<T> : T;\n\nexport declare function useGlobalSearchParams<\n T extends AllRoutes | UnknownOutputParams = UnknownOutputParams,\n>(): T extends AllRoutes ? SearchParams<T> : T;\n\nexport declare function useSegments<\n T extends AbsoluteRoute | RouteSegments<AbsoluteRoute> | RelativePathString,\n>(): T extends AbsoluteRoute ? RouteSegments<T> : T extends string ? string[] : T;\n"],"names":[],"mappings":"AAIA;;;;6CAEc,mBAAmB;AAAjC,YAAA,MAAkC;;2CAAlC,MAAkC;;;;mBAAlC,MAAkC;;;EAAA"}
@@ -36,9 +36,6 @@ describe("router.push()", ()=>{
36
36
  (0, _tsdLite).expectError(router.push("/mix/apple"));
37
37
  (0, _tsdLite).expectError(router.push("/mix/apple/cat"));
38
38
  });
39
- it("can accept any external url", ()=>{
40
- (0, _tsdLite).expectType(router.push("http://expo.dev"));
41
- });
42
39
  });
43
40
  describe("HrefObject", ()=>{
44
41
  it("will error on non-urls", ()=>{
@@ -172,5 +169,16 @@ describe("useSegments", ()=>{
172
169
  (0, _tsdLite).expectError((0, _basic).useSegments());
173
170
  });
174
171
  });
172
+ describe("external routes", ()=>{
173
+ it("can accept any external url", ()=>{
174
+ (0, _tsdLite).expectType(router.push("http://expo.dev"));
175
+ });
176
+ it("can accept any schema url", ()=>{
177
+ (0, _tsdLite).expectType(router.push("custom-schema://expo.dev"));
178
+ });
179
+ it("can accept mailto url", ()=>{
180
+ (0, _tsdLite).expectType(router.push("mailto:test@test.com"));
181
+ });
182
+ });
175
183
 
176
184
  //# sourceMappingURL=route.test.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/start/server/type-generation/__typetests__/route.test.ts"],"sourcesContent":["import { expectType, expectError } from 'tsd-lite';\n\nimport {\n useGlobalSearchParams,\n useSegments,\n useRouter,\n useSearchParams,\n useLocalSearchParams,\n} from './fixtures/basic';\n\n// eslint-disable-next-line react-hooks/rules-of-hooks\nconst router = useRouter();\n\ndescribe('router.push()', () => {\n // router.push will return void when the type matches, otherwise it should error\n\n describe('href', () => {\n it('will error on non-urls', () => {\n expectError(router.push('should-error'));\n });\n\n it('can accept an absolute url', () => {\n expectType<void>(router.push('/apple'));\n expectType<void>(router.push('/banana'));\n });\n\n it('can accept a ANY relative url', () => {\n // We only type-check absolute urls\n expectType<void>(router.push('./this/work/but/is/not/valid'));\n });\n\n it('works for dynamic urls', () => {\n expectType<void>(router.push('/colors/blue'));\n });\n\n it('works for CatchAll routes', () => {\n expectType<void>(router.push('/animals/bear'));\n expectType<void>(router.push('/animals/bear/cat/dog'));\n expectType<void>(router.push('/mix/apple/blue/cat/dog'));\n });\n\n it.skip('works for optional CatchAll routes', () => {\n // CatchAll routes are not currently optional\n // expectType<void>(router.push('/animals/'));\n });\n\n it('will error when providing extra parameters', () => {\n expectError(router.push('/colors/blue/test'));\n });\n\n it('will error when providing too few parameters', () => {\n expectError(router.push('/mix/apple'));\n expectError(router.push('/mix/apple/cat'));\n });\n\n it('can accept any external url', () => {\n expectType<void>(router.push('http://expo.dev'));\n });\n });\n\n describe('HrefObject', () => {\n it('will error on non-urls', () => {\n expectError(router.push({ pathname: 'should-error' }));\n });\n\n it('can accept an absolute url', () => {\n expectType<void>(router.push({ pathname: '/apple' }));\n expectType<void>(router.push({ pathname: '/banana' }));\n });\n\n it('can accept a ANY relative url', () => {\n // We only type-check absolute urls\n expectType<void>(router.push({ pathname: './this/work/but/is/not/valid' }));\n });\n\n it('works for dynamic urls', () => {\n expectType<void>(\n router.push({\n pathname: '/colors/[color]',\n params: { color: 'blue' },\n })\n );\n });\n\n it('requires a valid pathname', () => {\n expectError(\n router.push({\n pathname: '/colors/[invalid]',\n params: { color: 'blue' },\n })\n );\n });\n\n it('requires a valid param', () => {\n expectError(\n router.push({\n pathname: '/colors/[color]',\n params: { invalid: 'blue' },\n })\n );\n });\n\n it('works for catch all routes', () => {\n expectType<void>(\n router.push({\n pathname: '/animals/[...animal]',\n params: { animal: ['cat', 'dog'] },\n })\n );\n });\n\n it('allows numeric inputs', () => {\n expectType<void>(\n router.push({\n pathname: '/mix/[fruit]/[color]/[...animals]',\n params: { color: 1, fruit: 'apple', animals: [2, 'cat'] },\n })\n );\n });\n\n it('requires an array for catch all routes', () => {\n expectError(\n router.push({\n pathname: '/animals/[...animal]',\n params: { animal: 'cat' },\n })\n );\n });\n\n it('works for mixed routes', () => {\n expectType<void>(\n router.push({\n pathname: '/mix/[fruit]/[color]/[...animals]',\n params: { color: 'red', fruit: 'apple', animals: [] },\n })\n );\n });\n\n it('requires all params in mixed routes', () => {\n expectError(\n router.push({\n pathname: '/mix/[fruit]/[color]/[...animals]',\n params: { color: 'red', animals: ['cat', 'dog'] },\n })\n );\n });\n });\n});\n\ndescribe('useSearchParams', () => {\n expectType<Record<'color', string>>(useSearchParams<Record<'color', string>>());\n expectType<Record<'color', string> & Record<string, string | string[]>>(\n useSearchParams<'/colors/[color]'>()\n );\n\n expectError(useSearchParams<'/invalid'>());\n expectError(useSearchParams<Record<'custom', Function>>());\n});\n\ndescribe('useLocalSearchParams', () => {\n expectType<Record<'color', string>>(useLocalSearchParams<Record<'color', string>>());\n expectType<Record<'color', string> & Record<string, string | string[]>>(\n useLocalSearchParams<'/colors/[color]'>()\n );\n\n expectError(useSearchParams<'/invalid'>());\n expectError(useSearchParams<Record<'custom', Function>>());\n});\n\ndescribe('useGlobalSearchParams', () => {\n expectType<Record<'color', string>>(useGlobalSearchParams<Record<'color', string>>());\n expectType<Record<'color', string> & Record<string, string | string[]>>(\n useGlobalSearchParams<'/colors/[color]'>()\n );\n\n expectError(useGlobalSearchParams<'/invalid'>());\n expectError(useGlobalSearchParams<Record<'custom', Function>>());\n});\n\ndescribe('useSegments', () => {\n it('can accept an absolute url', () => {\n expectType<['apple']>(useSegments<'/apple'>());\n });\n\n it('only accepts valid possible urls', () => {\n expectError(useSegments<'/invalid'>());\n });\n\n it('can accept an array of segments', () => {\n expectType<['apple']>(useSegments<['apple']>());\n });\n\n it('only accepts valid possible segments', () => {\n expectError(useSegments<['invalid segment']>());\n });\n});\n"],"names":["router","useRouter","describe","it","expectError","push","expectType","skip","pathname","params","color","invalid","animal","fruit","animals","useSearchParams","useLocalSearchParams","useGlobalSearchParams","useSegments"],"mappings":"AAAA;AAAwC,IAAA,QAAU,WAAV,UAAU,CAAA;AAQ3C,IAAA,MAAkB,WAAlB,kBAAkB,CAAA;AAEzB,sDAAsD;AACtD,MAAMA,MAAM,GAAGC,CAAAA,GAAAA,MAAS,AAAE,CAAA,UAAF,EAAE,AAAC;AAE3BC,QAAQ,CAAC,eAAe,EAAE,IAAM;IAC9B,gFAAgF;IAEhFA,QAAQ,CAAC,MAAM,EAAE,IAAM;QACrBC,EAAE,CAAC,wBAAwB,EAAE,IAAM;YACjCC,CAAAA,GAAAA,QAAW,AAA6B,CAAA,YAA7B,CAACJ,MAAM,CAACK,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;SAC1C,CAAC,CAAC;QAEHF,EAAE,CAAC,4BAA4B,EAAE,IAAM;YACrCG,CAAAA,GAAAA,QAAU,AAA6B,CAAA,WAA7B,CAAON,MAAM,CAACK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACxCC,CAAAA,GAAAA,QAAU,AAA8B,CAAA,WAA9B,CAAON,MAAM,CAACK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;SAC1C,CAAC,CAAC;QAEHF,EAAE,CAAC,+BAA+B,EAAE,IAAM;YACxC,mCAAmC;YACnCG,CAAAA,GAAAA,QAAU,AAAmD,CAAA,WAAnD,CAAON,MAAM,CAACK,IAAI,CAAC,8BAA8B,CAAC,CAAC,CAAC;SAC/D,CAAC,CAAC;QAEHF,EAAE,CAAC,wBAAwB,EAAE,IAAM;YACjCG,CAAAA,GAAAA,QAAU,AAAmC,CAAA,WAAnC,CAAON,MAAM,CAACK,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;SAC/C,CAAC,CAAC;QAEHF,EAAE,CAAC,2BAA2B,EAAE,IAAM;YACpCG,CAAAA,GAAAA,QAAU,AAAoC,CAAA,WAApC,CAAON,MAAM,CAACK,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;YAC/CC,CAAAA,GAAAA,QAAU,AAA4C,CAAA,WAA5C,CAAON,MAAM,CAACK,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;YACvDC,CAAAA,GAAAA,QAAU,AAA8C,CAAA,WAA9C,CAAON,MAAM,CAACK,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;SAC1D,CAAC,CAAC;QAEHF,EAAE,CAACI,IAAI,CAAC,oCAAoC,EAAE,IAAM;QAClD,6CAA6C;QAC7C,8CAA8C;SAC/C,CAAC,CAAC;QAEHJ,EAAE,CAAC,4CAA4C,EAAE,IAAM;YACrDC,CAAAA,GAAAA,QAAW,AAAkC,CAAA,YAAlC,CAACJ,MAAM,CAACK,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;SAC/C,CAAC,CAAC;QAEHF,EAAE,CAAC,8CAA8C,EAAE,IAAM;YACvDC,CAAAA,GAAAA,QAAW,AAA2B,CAAA,YAA3B,CAACJ,MAAM,CAACK,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;YACvCD,CAAAA,GAAAA,QAAW,AAA+B,CAAA,YAA/B,CAACJ,MAAM,CAACK,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;SAC5C,CAAC,CAAC;QAEHF,EAAE,CAAC,6BAA6B,EAAE,IAAM;YACtCG,CAAAA,GAAAA,QAAU,AAAsC,CAAA,WAAtC,CAAON,MAAM,CAACK,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;SAClD,CAAC,CAAC;KACJ,CAAC,CAAC;IAEHH,QAAQ,CAAC,YAAY,EAAE,IAAM;QAC3BC,EAAE,CAAC,wBAAwB,EAAE,IAAM;YACjCC,CAAAA,GAAAA,QAAW,AAA2C,CAAA,YAA3C,CAACJ,MAAM,CAACK,IAAI,CAAC;gBAAEG,QAAQ,EAAE,cAAc;aAAE,CAAC,CAAC,CAAC;SACxD,CAAC,CAAC;QAEHL,EAAE,CAAC,4BAA4B,EAAE,IAAM;YACrCG,CAAAA,GAAAA,QAAU,AAA2C,CAAA,WAA3C,CAAON,MAAM,CAACK,IAAI,CAAC;gBAAEG,QAAQ,EAAE,QAAQ;aAAE,CAAC,CAAC,CAAC;YACtDF,CAAAA,GAAAA,QAAU,AAA4C,CAAA,WAA5C,CAAON,MAAM,CAACK,IAAI,CAAC;gBAAEG,QAAQ,EAAE,SAAS;aAAE,CAAC,CAAC,CAAC;SACxD,CAAC,CAAC;QAEHL,EAAE,CAAC,+BAA+B,EAAE,IAAM;YACxC,mCAAmC;YACnCG,CAAAA,GAAAA,QAAU,AAAiE,CAAA,WAAjE,CAAON,MAAM,CAACK,IAAI,CAAC;gBAAEG,QAAQ,EAAE,8BAA8B;aAAE,CAAC,CAAC,CAAC;SAC7E,CAAC,CAAC;QAEHL,EAAE,CAAC,wBAAwB,EAAE,IAAM;YACjCG,CAAAA,GAAAA,QAAU,AAKT,CAAA,WALS,CACRN,MAAM,CAACK,IAAI,CAAC;gBACVG,QAAQ,EAAE,iBAAiB;gBAC3BC,MAAM,EAAE;oBAAEC,KAAK,EAAE,MAAM;iBAAE;aAC1B,CAAC,CACH,CAAC;SACH,CAAC,CAAC;QAEHP,EAAE,CAAC,2BAA2B,EAAE,IAAM;YACpCC,CAAAA,GAAAA,QAAW,AAKV,CAAA,YALU,CACTJ,MAAM,CAACK,IAAI,CAAC;gBACVG,QAAQ,EAAE,mBAAmB;gBAC7BC,MAAM,EAAE;oBAAEC,KAAK,EAAE,MAAM;iBAAE;aAC1B,CAAC,CACH,CAAC;SACH,CAAC,CAAC;QAEHP,EAAE,CAAC,wBAAwB,EAAE,IAAM;YACjCC,CAAAA,GAAAA,QAAW,AAKV,CAAA,YALU,CACTJ,MAAM,CAACK,IAAI,CAAC;gBACVG,QAAQ,EAAE,iBAAiB;gBAC3BC,MAAM,EAAE;oBAAEE,OAAO,EAAE,MAAM;iBAAE;aAC5B,CAAC,CACH,CAAC;SACH,CAAC,CAAC;QAEHR,EAAE,CAAC,4BAA4B,EAAE,IAAM;YACrCG,CAAAA,GAAAA,QAAU,AAKT,CAAA,WALS,CACRN,MAAM,CAACK,IAAI,CAAC;gBACVG,QAAQ,EAAE,sBAAsB;gBAChCC,MAAM,EAAE;oBAAEG,MAAM,EAAE;wBAAC,KAAK;wBAAE,KAAK;qBAAC;iBAAE;aACnC,CAAC,CACH,CAAC;SACH,CAAC,CAAC;QAEHT,EAAE,CAAC,uBAAuB,EAAE,IAAM;YAChCG,CAAAA,GAAAA,QAAU,AAKT,CAAA,WALS,CACRN,MAAM,CAACK,IAAI,CAAC;gBACVG,QAAQ,EAAE,mCAAmC;gBAC7CC,MAAM,EAAE;oBAAEC,KAAK,EAAE,CAAC;oBAAEG,KAAK,EAAE,OAAO;oBAAEC,OAAO,EAAE;AAAC,yBAAC;wBAAE,KAAK;qBAAC;iBAAE;aAC1D,CAAC,CACH,CAAC;SACH,CAAC,CAAC;QAEHX,EAAE,CAAC,wCAAwC,EAAE,IAAM;YACjDC,CAAAA,GAAAA,QAAW,AAKV,CAAA,YALU,CACTJ,MAAM,CAACK,IAAI,CAAC;gBACVG,QAAQ,EAAE,sBAAsB;gBAChCC,MAAM,EAAE;oBAAEG,MAAM,EAAE,KAAK;iBAAE;aAC1B,CAAC,CACH,CAAC;SACH,CAAC,CAAC;QAEHT,EAAE,CAAC,wBAAwB,EAAE,IAAM;YACjCG,CAAAA,GAAAA,QAAU,AAKT,CAAA,WALS,CACRN,MAAM,CAACK,IAAI,CAAC;gBACVG,QAAQ,EAAE,mCAAmC;gBAC7CC,MAAM,EAAE;oBAAEC,KAAK,EAAE,KAAK;oBAAEG,KAAK,EAAE,OAAO;oBAAEC,OAAO,EAAE,EAAE;iBAAE;aACtD,CAAC,CACH,CAAC;SACH,CAAC,CAAC;QAEHX,EAAE,CAAC,qCAAqC,EAAE,IAAM;YAC9CC,CAAAA,GAAAA,QAAW,AAKV,CAAA,YALU,CACTJ,MAAM,CAACK,IAAI,CAAC;gBACVG,QAAQ,EAAE,mCAAmC;gBAC7CC,MAAM,EAAE;oBAAEC,KAAK,EAAE,KAAK;oBAAEI,OAAO,EAAE;wBAAC,KAAK;wBAAE,KAAK;qBAAC;iBAAE;aAClD,CAAC,CACH,CAAC;SACH,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ,CAAC,CAAC;AAEHZ,QAAQ,CAAC,iBAAiB,EAAE,IAAM;IAChCI,CAAAA,GAAAA,QAAU,AAAqE,CAAA,WAArE,CAA0BS,CAAAA,GAAAA,MAAe,AAA2B,CAAA,gBAA3B,EAA2B,CAAC,CAAC;IAChFT,CAAAA,GAAAA,QAAU,AAET,CAAA,WAFS,CACRS,CAAAA,GAAAA,MAAe,AAAqB,CAAA,gBAArB,EAAqB,CACrC,CAAC;IAEFX,CAAAA,GAAAA,QAAW,AAA+B,CAAA,YAA/B,CAACW,CAAAA,GAAAA,MAAe,AAAc,CAAA,gBAAd,EAAc,CAAC,CAAC;IAC3CX,CAAAA,GAAAA,QAAW,AAA+C,CAAA,YAA/C,CAACW,CAAAA,GAAAA,MAAe,AAA8B,CAAA,gBAA9B,EAA8B,CAAC,CAAC;CAC5D,CAAC,CAAC;AAEHb,QAAQ,CAAC,sBAAsB,EAAE,IAAM;IACrCI,CAAAA,GAAAA,QAAU,AAA0E,CAAA,WAA1E,CAA0BU,CAAAA,GAAAA,MAAoB,AAA2B,CAAA,qBAA3B,EAA2B,CAAC,CAAC;IACrFV,CAAAA,GAAAA,QAAU,AAET,CAAA,WAFS,CACRU,CAAAA,GAAAA,MAAoB,AAAqB,CAAA,qBAArB,EAAqB,CAC1C,CAAC;IAEFZ,CAAAA,GAAAA,QAAW,AAA+B,CAAA,YAA/B,CAACW,CAAAA,GAAAA,MAAe,AAAc,CAAA,gBAAd,EAAc,CAAC,CAAC;IAC3CX,CAAAA,GAAAA,QAAW,AAA+C,CAAA,YAA/C,CAACW,CAAAA,GAAAA,MAAe,AAA8B,CAAA,gBAA9B,EAA8B,CAAC,CAAC;CAC5D,CAAC,CAAC;AAEHb,QAAQ,CAAC,uBAAuB,EAAE,IAAM;IACtCI,CAAAA,GAAAA,QAAU,AAA2E,CAAA,WAA3E,CAA0BW,CAAAA,GAAAA,MAAqB,AAA2B,CAAA,sBAA3B,EAA2B,CAAC,CAAC;IACtFX,CAAAA,GAAAA,QAAU,AAET,CAAA,WAFS,CACRW,CAAAA,GAAAA,MAAqB,AAAqB,CAAA,sBAArB,EAAqB,CAC3C,CAAC;IAEFb,CAAAA,GAAAA,QAAW,AAAqC,CAAA,YAArC,CAACa,CAAAA,GAAAA,MAAqB,AAAc,CAAA,sBAAd,EAAc,CAAC,CAAC;IACjDb,CAAAA,GAAAA,QAAW,AAAqD,CAAA,YAArD,CAACa,CAAAA,GAAAA,MAAqB,AAA8B,CAAA,sBAA9B,EAA8B,CAAC,CAAC;CAClE,CAAC,CAAC;AAEHf,QAAQ,CAAC,aAAa,EAAE,IAAM;IAC5BC,EAAE,CAAC,4BAA4B,EAAE,IAAM;QACrCG,CAAAA,GAAAA,QAAU,AAAoC,CAAA,WAApC,CAAYY,CAAAA,GAAAA,MAAW,AAAY,CAAA,YAAZ,EAAY,CAAC,CAAC;KAChD,CAAC,CAAC;IAEHf,EAAE,CAAC,kCAAkC,EAAE,IAAM;QAC3CC,CAAAA,GAAAA,QAAW,AAA2B,CAAA,YAA3B,CAACc,CAAAA,GAAAA,MAAW,AAAc,CAAA,YAAd,EAAc,CAAC,CAAC;KACxC,CAAC,CAAC;IAEHf,EAAE,CAAC,iCAAiC,EAAE,IAAM;QAC1CG,CAAAA,GAAAA,QAAU,AAAqC,CAAA,WAArC,CAAYY,CAAAA,GAAAA,MAAW,AAAa,CAAA,YAAb,EAAa,CAAC,CAAC;KACjD,CAAC,CAAC;IAEHf,EAAE,CAAC,sCAAsC,EAAE,IAAM;QAC/CC,CAAAA,GAAAA,QAAW,AAAoC,CAAA,YAApC,CAACc,CAAAA,GAAAA,MAAW,AAAuB,CAAA,YAAvB,EAAuB,CAAC,CAAC;KACjD,CAAC,CAAC;CACJ,CAAC,CAAC"}
1
+ {"version":3,"sources":["../../../../../../src/start/server/type-generation/__typetests__/route.test.ts"],"sourcesContent":["import { expectType, expectError } from 'tsd-lite';\n\nimport {\n useGlobalSearchParams,\n useSegments,\n useRouter,\n useSearchParams,\n useLocalSearchParams,\n} from './fixtures/basic';\n\n// eslint-disable-next-line react-hooks/rules-of-hooks\nconst router = useRouter();\n\ndescribe('router.push()', () => {\n // router.push will return void when the type matches, otherwise it should error\n\n describe('href', () => {\n it('will error on non-urls', () => {\n expectError(router.push('should-error'));\n });\n\n it('can accept an absolute url', () => {\n expectType<void>(router.push('/apple'));\n expectType<void>(router.push('/banana'));\n });\n\n it('can accept a ANY relative url', () => {\n // We only type-check absolute urls\n expectType<void>(router.push('./this/work/but/is/not/valid'));\n });\n\n it('works for dynamic urls', () => {\n expectType<void>(router.push('/colors/blue'));\n });\n\n it('works for CatchAll routes', () => {\n expectType<void>(router.push('/animals/bear'));\n expectType<void>(router.push('/animals/bear/cat/dog'));\n expectType<void>(router.push('/mix/apple/blue/cat/dog'));\n });\n\n it.skip('works for optional CatchAll routes', () => {\n // CatchAll routes are not currently optional\n // expectType<void>(router.push('/animals/'));\n });\n\n it('will error when providing extra parameters', () => {\n expectError(router.push('/colors/blue/test'));\n });\n\n it('will error when providing too few parameters', () => {\n expectError(router.push('/mix/apple'));\n expectError(router.push('/mix/apple/cat'));\n });\n });\n\n describe('HrefObject', () => {\n it('will error on non-urls', () => {\n expectError(router.push({ pathname: 'should-error' }));\n });\n\n it('can accept an absolute url', () => {\n expectType<void>(router.push({ pathname: '/apple' }));\n expectType<void>(router.push({ pathname: '/banana' }));\n });\n\n it('can accept a ANY relative url', () => {\n // We only type-check absolute urls\n expectType<void>(router.push({ pathname: './this/work/but/is/not/valid' }));\n });\n\n it('works for dynamic urls', () => {\n expectType<void>(\n router.push({\n pathname: '/colors/[color]',\n params: { color: 'blue' },\n })\n );\n });\n\n it('requires a valid pathname', () => {\n expectError(\n router.push({\n pathname: '/colors/[invalid]',\n params: { color: 'blue' },\n })\n );\n });\n\n it('requires a valid param', () => {\n expectError(\n router.push({\n pathname: '/colors/[color]',\n params: { invalid: 'blue' },\n })\n );\n });\n\n it('works for catch all routes', () => {\n expectType<void>(\n router.push({\n pathname: '/animals/[...animal]',\n params: { animal: ['cat', 'dog'] },\n })\n );\n });\n\n it('allows numeric inputs', () => {\n expectType<void>(\n router.push({\n pathname: '/mix/[fruit]/[color]/[...animals]',\n params: { color: 1, fruit: 'apple', animals: [2, 'cat'] },\n })\n );\n });\n\n it('requires an array for catch all routes', () => {\n expectError(\n router.push({\n pathname: '/animals/[...animal]',\n params: { animal: 'cat' },\n })\n );\n });\n\n it('works for mixed routes', () => {\n expectType<void>(\n router.push({\n pathname: '/mix/[fruit]/[color]/[...animals]',\n params: { color: 'red', fruit: 'apple', animals: [] },\n })\n );\n });\n\n it('requires all params in mixed routes', () => {\n expectError(\n router.push({\n pathname: '/mix/[fruit]/[color]/[...animals]',\n params: { color: 'red', animals: ['cat', 'dog'] },\n })\n );\n });\n });\n});\n\ndescribe('useSearchParams', () => {\n expectType<Record<'color', string>>(useSearchParams<Record<'color', string>>());\n expectType<Record<'color', string> & Record<string, string | string[]>>(\n useSearchParams<'/colors/[color]'>()\n );\n\n expectError(useSearchParams<'/invalid'>());\n expectError(useSearchParams<Record<'custom', Function>>());\n});\n\ndescribe('useLocalSearchParams', () => {\n expectType<Record<'color', string>>(useLocalSearchParams<Record<'color', string>>());\n expectType<Record<'color', string> & Record<string, string | string[]>>(\n useLocalSearchParams<'/colors/[color]'>()\n );\n\n expectError(useSearchParams<'/invalid'>());\n expectError(useSearchParams<Record<'custom', Function>>());\n});\n\ndescribe('useGlobalSearchParams', () => {\n expectType<Record<'color', string>>(useGlobalSearchParams<Record<'color', string>>());\n expectType<Record<'color', string> & Record<string, string | string[]>>(\n useGlobalSearchParams<'/colors/[color]'>()\n );\n\n expectError(useGlobalSearchParams<'/invalid'>());\n expectError(useGlobalSearchParams<Record<'custom', Function>>());\n});\n\ndescribe('useSegments', () => {\n it('can accept an absolute url', () => {\n expectType<['apple']>(useSegments<'/apple'>());\n });\n\n it('only accepts valid possible urls', () => {\n expectError(useSegments<'/invalid'>());\n });\n\n it('can accept an array of segments', () => {\n expectType<['apple']>(useSegments<['apple']>());\n });\n\n it('only accepts valid possible segments', () => {\n expectError(useSegments<['invalid segment']>());\n });\n});\n\ndescribe('external routes', () => {\n it('can accept any external url', () => {\n expectType<void>(router.push('http://expo.dev'));\n });\n\n it('can accept any schema url', () => {\n expectType<void>(router.push('custom-schema://expo.dev'));\n });\n\n it('can accept mailto url', () => {\n expectType<void>(router.push('mailto:test@test.com'));\n });\n});\n"],"names":["router","useRouter","describe","it","expectError","push","expectType","skip","pathname","params","color","invalid","animal","fruit","animals","useSearchParams","useLocalSearchParams","useGlobalSearchParams","useSegments"],"mappings":"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"}
@@ -6,7 +6,7 @@ exports.setupTypedRoutes = setupTypedRoutes;
6
6
  exports.getTemplateString = getTemplateString;
7
7
  exports.getTypedRoutesUtils = getTypedRoutesUtils;
8
8
  exports.extrapolateGroupRoutes = extrapolateGroupRoutes;
9
- exports.setToUnionType = exports.CAPTURE_GROUP_REGEX = exports.ARRAY_GROUP_REGEX = exports.SLUG = exports.CATCH_ALL = exports.CAPTURE_DYNAMIC_PARAMS = void 0;
9
+ exports.setToUnionType = exports.TYPED_ROUTES_EXCLUSION_REGEX = exports.CAPTURE_GROUP_REGEX = exports.ARRAY_GROUP_REGEX = exports.SLUG = exports.CATCH_ALL = exports.CAPTURE_DYNAMIC_PARAMS = void 0;
10
10
  var _promises = _interopRequireDefault(require("fs/promises"));
11
11
  var _lodash = require("lodash");
12
12
  var _path = _interopRequireDefault(require("path"));
@@ -28,6 +28,8 @@ const ARRAY_GROUP_REGEX = /\(\s*\w[\w\s]*?,.*?\)/g;
28
28
  exports.ARRAY_GROUP_REGEX = ARRAY_GROUP_REGEX;
29
29
  const CAPTURE_GROUP_REGEX = /[\\(,]\s*(\w[\w\s]*?)\s*(?=[,\\)])/g;
30
30
  exports.CAPTURE_GROUP_REGEX = CAPTURE_GROUP_REGEX;
31
+ const TYPED_ROUTES_EXCLUSION_REGEX = /(_layout|[^/]*?\+[^/]*?)\.[tj]sx?$/;
32
+ exports.TYPED_ROUTES_EXCLUSION_REGEX = TYPED_ROUTES_EXCLUSION_REGEX;
31
33
  async function setupTypedRoutes({ server , metro , typesDirectory , projectRoot , routerDirectory }) {
32
34
  const { filePathToRoute , staticRoutes , dynamicRoutes , addFilePath , isRouteFile } = getTypedRoutesUtils(routerDirectory);
33
35
  if (metro && server) {
@@ -126,8 +128,7 @@ function getTypedRoutesUtils(appRoot, filePathSeperator = _path.default.sep) {
126
128
  return normalizedFilePath(filePath).replace(normalizedAppRoot, "").replace(/index\.[jt]sx?/, "").replace(/\.[jt]sx?$/, "");
127
129
  };
128
130
  const isRouteFile = (filePath)=>{
129
- // Layout and filenames starting with `+` are not routes
130
- if (filePath.match(/_layout\.[tj]sx?$/) || filePath.match(/\/\+/)) {
131
+ if (filePath.match(TYPED_ROUTES_EXCLUSION_REGEX)) {
131
132
  return false;
132
133
  }
133
134
  // Route files must be nested with in the appRoot
@@ -245,7 +246,8 @@ declare module "expo-router" {
245
246
 
246
247
  type RelativePathString = \`./\${string}\` | \`../\${string}\` | '..';
247
248
  type AbsoluteRoute = DynamicRouteTemplate | StaticRoutes;
248
- type ExternalPathString = \`http\${string}\`;
249
+ type ExternalPathString = \`\${string}:\${string}\`;
250
+
249
251
  type ExpoRouterRoutes = DynamicRouteTemplate | StaticRoutes | RelativePathString;
250
252
  type AllRoutes = ExpoRouterRoutes | ExternalPathString;
251
253