@textjs/app 0.0.0-stage → 1.0.2

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 (335) hide show
  1. package/README.md +34 -2
  2. package/bin/text.js +29 -0
  3. package/bin/text.ts +13 -0
  4. package/dist/.tsbuildinfo +1 -0
  5. package/dist/cli/build.d.ts +39 -0
  6. package/dist/cli/build.d.ts.map +1 -0
  7. package/dist/cli/build.js +157 -0
  8. package/dist/cli/build.js.map +1 -0
  9. package/dist/cli/config.d.ts +22 -0
  10. package/dist/cli/config.d.ts.map +1 -0
  11. package/dist/cli/config.js +73 -0
  12. package/dist/cli/config.js.map +1 -0
  13. package/dist/cli/dev.d.ts +12 -0
  14. package/dist/cli/dev.d.ts.map +1 -0
  15. package/dist/cli/dev.js +49 -0
  16. package/dist/cli/dev.js.map +1 -0
  17. package/dist/cli/index.d.ts +26 -0
  18. package/dist/cli/index.d.ts.map +1 -0
  19. package/dist/cli/index.js +192 -0
  20. package/dist/cli/index.js.map +1 -0
  21. package/dist/cli/run.d.ts +31 -0
  22. package/dist/cli/run.d.ts.map +1 -0
  23. package/dist/cli/run.js +111 -0
  24. package/dist/cli/run.js.map +1 -0
  25. package/dist/cli/start.d.ts +14 -0
  26. package/dist/cli/start.d.ts.map +1 -0
  27. package/dist/cli/start.js +183 -0
  28. package/dist/cli/start.js.map +1 -0
  29. package/dist/cli/ui.d.ts +35 -0
  30. package/dist/cli/ui.d.ts.map +1 -0
  31. package/dist/cli/ui.js +73 -0
  32. package/dist/cli/ui.js.map +1 -0
  33. package/dist/client.d.ts +34 -0
  34. package/dist/client.d.ts.map +1 -0
  35. package/dist/client.js +93 -0
  36. package/dist/client.js.map +1 -0
  37. package/dist/config.d.ts +143 -0
  38. package/dist/config.d.ts.map +1 -0
  39. package/dist/config.js +28 -0
  40. package/dist/config.js.map +1 -0
  41. package/dist/context.d.ts +44 -0
  42. package/dist/context.d.ts.map +1 -0
  43. package/dist/context.js +26 -0
  44. package/dist/context.js.map +1 -0
  45. package/dist/dev-errors.d.ts +68 -0
  46. package/dist/dev-errors.d.ts.map +1 -0
  47. package/dist/dev-errors.js +121 -0
  48. package/dist/dev-errors.js.map +1 -0
  49. package/dist/devtools.d.ts +64 -0
  50. package/dist/devtools.d.ts.map +1 -0
  51. package/dist/devtools.js +186 -0
  52. package/dist/devtools.js.map +1 -0
  53. package/dist/frame-mirror.d.ts +19 -0
  54. package/dist/frame-mirror.d.ts.map +1 -0
  55. package/dist/frame-mirror.js +141 -0
  56. package/dist/frame-mirror.js.map +1 -0
  57. package/dist/frame-protocol.d.ts +175 -0
  58. package/dist/frame-protocol.d.ts.map +1 -0
  59. package/dist/frame-protocol.js +369 -0
  60. package/dist/frame-protocol.js.map +1 -0
  61. package/dist/history.d.ts +54 -0
  62. package/dist/history.d.ts.map +1 -0
  63. package/dist/history.js +152 -0
  64. package/dist/history.js.map +1 -0
  65. package/dist/index.d.ts +9 -0
  66. package/dist/index.d.ts.map +1 -0
  67. package/dist/index.js +8 -0
  68. package/dist/index.js.map +1 -0
  69. package/dist/link.d.ts +32 -0
  70. package/dist/link.d.ts.map +1 -0
  71. package/dist/link.js +54 -0
  72. package/dist/link.js.map +1 -0
  73. package/dist/live-player.d.ts +83 -0
  74. package/dist/live-player.d.ts.map +1 -0
  75. package/dist/live-player.js +413 -0
  76. package/dist/live-player.js.map +1 -0
  77. package/dist/live-protocol.d.ts +132 -0
  78. package/dist/live-protocol.d.ts.map +1 -0
  79. package/dist/live-protocol.js +278 -0
  80. package/dist/live-protocol.js.map +1 -0
  81. package/dist/live-stub.d.ts +10 -0
  82. package/dist/live-stub.d.ts.map +1 -0
  83. package/dist/live-stub.js +32 -0
  84. package/dist/live-stub.js.map +1 -0
  85. package/dist/mcp/cli.d.ts +22 -0
  86. package/dist/mcp/cli.d.ts.map +1 -0
  87. package/dist/mcp/cli.js +177 -0
  88. package/dist/mcp/cli.js.map +1 -0
  89. package/dist/mcp/frame.d.ts +58 -0
  90. package/dist/mcp/frame.d.ts.map +1 -0
  91. package/dist/mcp/frame.js +169 -0
  92. package/dist/mcp/frame.js.map +1 -0
  93. package/dist/mcp/index.d.ts +15 -0
  94. package/dist/mcp/index.d.ts.map +1 -0
  95. package/dist/mcp/index.js +15 -0
  96. package/dist/mcp/index.js.map +1 -0
  97. package/dist/mcp/inspect.d.ts +95 -0
  98. package/dist/mcp/inspect.d.ts.map +1 -0
  99. package/dist/mcp/inspect.js +386 -0
  100. package/dist/mcp/inspect.js.map +1 -0
  101. package/dist/mcp/keys.d.ts +20 -0
  102. package/dist/mcp/keys.d.ts.map +1 -0
  103. package/dist/mcp/keys.js +87 -0
  104. package/dist/mcp/keys.js.map +1 -0
  105. package/dist/mcp/logs.d.ts +63 -0
  106. package/dist/mcp/logs.d.ts.map +1 -0
  107. package/dist/mcp/logs.js +217 -0
  108. package/dist/mcp/logs.js.map +1 -0
  109. package/dist/mcp/server.d.ts +64 -0
  110. package/dist/mcp/server.d.ts.map +1 -0
  111. package/dist/mcp/server.js +485 -0
  112. package/dist/mcp/server.js.map +1 -0
  113. package/dist/mcp/session.d.ts +230 -0
  114. package/dist/mcp/session.d.ts.map +1 -0
  115. package/dist/mcp/session.js +742 -0
  116. package/dist/mcp/session.js.map +1 -0
  117. package/dist/navigation-errors.d.ts +28 -0
  118. package/dist/navigation-errors.d.ts.map +1 -0
  119. package/dist/navigation-errors.js +43 -0
  120. package/dist/navigation-errors.js.map +1 -0
  121. package/dist/navigation.d.ts +21 -0
  122. package/dist/navigation.d.ts.map +1 -0
  123. package/dist/navigation.js +33 -0
  124. package/dist/navigation.js.map +1 -0
  125. package/dist/router.d.ts +76 -0
  126. package/dist/router.d.ts.map +1 -0
  127. package/dist/router.js +296 -0
  128. package/dist/router.js.map +1 -0
  129. package/dist/routing.d.ts +101 -0
  130. package/dist/routing.d.ts.map +1 -0
  131. package/dist/routing.js +286 -0
  132. package/dist/routing.js.map +1 -0
  133. package/dist/server/adapters/build-step.d.ts +34 -0
  134. package/dist/server/adapters/build-step.d.ts.map +1 -0
  135. package/dist/server/adapters/build-step.js +112 -0
  136. package/dist/server/adapters/build-step.js.map +1 -0
  137. package/dist/server/adapters/bun.d.ts +8 -0
  138. package/dist/server/adapters/bun.d.ts.map +1 -0
  139. package/dist/server/adapters/bun.js +89 -0
  140. package/dist/server/adapters/bun.js.map +1 -0
  141. package/dist/server/adapters/bundle.d.ts +21 -0
  142. package/dist/server/adapters/bundle.d.ts.map +1 -0
  143. package/dist/server/adapters/bundle.js +86 -0
  144. package/dist/server/adapters/bundle.js.map +1 -0
  145. package/dist/server/adapters/cloudflare.d.ts +29 -0
  146. package/dist/server/adapters/cloudflare.d.ts.map +1 -0
  147. package/dist/server/adapters/cloudflare.js +105 -0
  148. package/dist/server/adapters/cloudflare.js.map +1 -0
  149. package/dist/server/adapters/index.d.ts +10 -0
  150. package/dist/server/adapters/index.d.ts.map +1 -0
  151. package/dist/server/adapters/index.js +24 -0
  152. package/dist/server/adapters/index.js.map +1 -0
  153. package/dist/server/adapters/runtime-node.d.ts +16 -0
  154. package/dist/server/adapters/runtime-node.d.ts.map +1 -0
  155. package/dist/server/adapters/runtime-node.js +29 -0
  156. package/dist/server/adapters/runtime-node.js.map +1 -0
  157. package/dist/server/adapters/runtime.d.ts +42 -0
  158. package/dist/server/adapters/runtime.d.ts.map +1 -0
  159. package/dist/server/adapters/runtime.js +115 -0
  160. package/dist/server/adapters/runtime.js.map +1 -0
  161. package/dist/server/adapters/shared.d.ts +66 -0
  162. package/dist/server/adapters/shared.d.ts.map +1 -0
  163. package/dist/server/adapters/shared.js +124 -0
  164. package/dist/server/adapters/shared.js.map +1 -0
  165. package/dist/server/adapters/static.d.ts +9 -0
  166. package/dist/server/adapters/static.d.ts.map +1 -0
  167. package/dist/server/adapters/static.js +70 -0
  168. package/dist/server/adapters/static.js.map +1 -0
  169. package/dist/server/adapters/vercel.d.ts +43 -0
  170. package/dist/server/adapters/vercel.d.ts.map +1 -0
  171. package/dist/server/adapters/vercel.js +119 -0
  172. package/dist/server/adapters/vercel.js.map +1 -0
  173. package/dist/server/bun-jsx.d.ts +18 -0
  174. package/dist/server/bun-jsx.d.ts.map +1 -0
  175. package/dist/server/bun-jsx.js +56 -0
  176. package/dist/server/bun-jsx.js.map +1 -0
  177. package/dist/server/cache-route.d.ts +38 -0
  178. package/dist/server/cache-route.d.ts.map +1 -0
  179. package/dist/server/cache-route.js +109 -0
  180. package/dist/server/cache-route.js.map +1 -0
  181. package/dist/server/cache.d.ts +131 -0
  182. package/dist/server/cache.d.ts.map +1 -0
  183. package/dist/server/cache.js +409 -0
  184. package/dist/server/cache.js.map +1 -0
  185. package/dist/server/frames.d.ts +45 -0
  186. package/dist/server/frames.d.ts.map +1 -0
  187. package/dist/server/frames.js +294 -0
  188. package/dist/server/frames.js.map +1 -0
  189. package/dist/server/http.d.ts +80 -0
  190. package/dist/server/http.d.ts.map +1 -0
  191. package/dist/server/http.js +453 -0
  192. package/dist/server/http.js.map +1 -0
  193. package/dist/server/jsx-dev-runtime.d.ts +5 -0
  194. package/dist/server/jsx-dev-runtime.d.ts.map +1 -0
  195. package/dist/server/jsx-dev-runtime.js +6 -0
  196. package/dist/server/jsx-dev-runtime.js.map +1 -0
  197. package/dist/server/jsx-runtime.d.ts +10 -0
  198. package/dist/server/jsx-runtime.d.ts.map +1 -0
  199. package/dist/server/jsx-runtime.js +11 -0
  200. package/dist/server/jsx-runtime.js.map +1 -0
  201. package/dist/server/live-app.d.ts +87 -0
  202. package/dist/server/live-app.d.ts.map +1 -0
  203. package/dist/server/live-app.js +307 -0
  204. package/dist/server/live-app.js.map +1 -0
  205. package/dist/server/live-build.d.ts +70 -0
  206. package/dist/server/live-build.d.ts.map +1 -0
  207. package/dist/server/live-build.js +222 -0
  208. package/dist/server/live-build.js.map +1 -0
  209. package/dist/server/live-dev.d.ts +62 -0
  210. package/dist/server/live-dev.d.ts.map +1 -0
  211. package/dist/server/live-dev.js +313 -0
  212. package/dist/server/live-dev.js.map +1 -0
  213. package/dist/server/live-manifest.d.ts +23 -0
  214. package/dist/server/live-manifest.d.ts.map +1 -0
  215. package/dist/server/live-manifest.js +7 -0
  216. package/dist/server/live-manifest.js.map +1 -0
  217. package/dist/server/live-prod.d.ts +30 -0
  218. package/dist/server/live-prod.d.ts.map +1 -0
  219. package/dist/server/live-prod.js +97 -0
  220. package/dist/server/live-prod.js.map +1 -0
  221. package/dist/server/live-routes.d.ts +72 -0
  222. package/dist/server/live-routes.d.ts.map +1 -0
  223. package/dist/server/live-routes.js +274 -0
  224. package/dist/server/live-routes.js.map +1 -0
  225. package/dist/server/live-web.d.ts +16 -0
  226. package/dist/server/live-web.d.ts.map +1 -0
  227. package/dist/server/live-web.js +159 -0
  228. package/dist/server/live-web.js.map +1 -0
  229. package/dist/server/live.d.ts +138 -0
  230. package/dist/server/live.d.ts.map +1 -0
  231. package/dist/server/live.js +542 -0
  232. package/dist/server/live.js.map +1 -0
  233. package/dist/server/middleware-node.d.ts +48 -0
  234. package/dist/server/middleware-node.d.ts.map +1 -0
  235. package/dist/server/middleware-node.js +167 -0
  236. package/dist/server/middleware-node.js.map +1 -0
  237. package/dist/server/middleware-runtime.d.ts +97 -0
  238. package/dist/server/middleware-runtime.d.ts.map +1 -0
  239. package/dist/server/middleware-runtime.js +447 -0
  240. package/dist/server/middleware-runtime.js.map +1 -0
  241. package/dist/server/middleware.d.ts +145 -0
  242. package/dist/server/middleware.d.ts.map +1 -0
  243. package/dist/server/middleware.js +365 -0
  244. package/dist/server/middleware.js.map +1 -0
  245. package/dist/server/ppr.d.ts +22 -0
  246. package/dist/server/ppr.d.ts.map +1 -0
  247. package/dist/server/ppr.js +58 -0
  248. package/dist/server/ppr.js.map +1 -0
  249. package/dist/server/scan.d.ts +48 -0
  250. package/dist/server/scan.d.ts.map +1 -0
  251. package/dist/server/scan.js +161 -0
  252. package/dist/server/scan.js.map +1 -0
  253. package/dist/server/server-components.d.ts +65 -0
  254. package/dist/server/server-components.d.ts.map +1 -0
  255. package/dist/server/server-components.js +215 -0
  256. package/dist/server/server-components.js.map +1 -0
  257. package/dist/terminal.d.ts +5 -0
  258. package/dist/terminal.d.ts.map +1 -0
  259. package/dist/terminal.js +5 -0
  260. package/dist/terminal.js.map +1 -0
  261. package/dist/testing.d.ts +5 -0
  262. package/dist/testing.d.ts.map +1 -0
  263. package/dist/testing.js +5 -0
  264. package/dist/testing.js.map +1 -0
  265. package/dist/vite-plugin.d.ts +51 -0
  266. package/dist/vite-plugin.d.ts.map +1 -0
  267. package/dist/vite-plugin.js +403 -0
  268. package/dist/vite-plugin.js.map +1 -0
  269. package/package.json +130 -4
  270. package/src/cli/build.ts +182 -0
  271. package/src/cli/config.ts +72 -0
  272. package/src/cli/dev.ts +54 -0
  273. package/src/cli/index.ts +185 -0
  274. package/src/cli/run.ts +124 -0
  275. package/src/cli/start.ts +194 -0
  276. package/src/cli/ui.ts +93 -0
  277. package/src/client.tsx +122 -0
  278. package/src/config.ts +155 -0
  279. package/src/context.ts +69 -0
  280. package/src/dev-errors.ts +167 -0
  281. package/src/devtools.tsx +419 -0
  282. package/src/frame-mirror.ts +145 -0
  283. package/src/frame-protocol.ts +435 -0
  284. package/src/history.ts +201 -0
  285. package/src/index.ts +9 -0
  286. package/src/link.tsx +108 -0
  287. package/src/live-player.ts +449 -0
  288. package/src/live-protocol.ts +317 -0
  289. package/src/live-stub.tsx +32 -0
  290. package/src/mcp/cli.ts +188 -0
  291. package/src/mcp/frame.ts +224 -0
  292. package/src/mcp/index.ts +15 -0
  293. package/src/mcp/inspect.ts +445 -0
  294. package/src/mcp/keys.ts +86 -0
  295. package/src/mcp/logs.ts +225 -0
  296. package/src/mcp/server.ts +595 -0
  297. package/src/mcp/session.ts +821 -0
  298. package/src/navigation-errors.ts +60 -0
  299. package/src/navigation.ts +44 -0
  300. package/src/router.tsx +497 -0
  301. package/src/routing.ts +344 -0
  302. package/src/server/adapters/build-step.ts +135 -0
  303. package/src/server/adapters/bun.ts +92 -0
  304. package/src/server/adapters/bundle.ts +97 -0
  305. package/src/server/adapters/cloudflare.ts +111 -0
  306. package/src/server/adapters/index.ts +29 -0
  307. package/src/server/adapters/runtime-node.ts +34 -0
  308. package/src/server/adapters/runtime.ts +145 -0
  309. package/src/server/adapters/shared.ts +159 -0
  310. package/src/server/adapters/static.ts +68 -0
  311. package/src/server/adapters/vercel.ts +149 -0
  312. package/src/server/bun-jsx.ts +65 -0
  313. package/src/server/cache-route.ts +139 -0
  314. package/src/server/cache.ts +498 -0
  315. package/src/server/frames.ts +326 -0
  316. package/src/server/http.ts +467 -0
  317. package/src/server/jsx-dev-runtime.ts +9 -0
  318. package/src/server/jsx-runtime.ts +13 -0
  319. package/src/server/live-app.tsx +374 -0
  320. package/src/server/live-build.ts +258 -0
  321. package/src/server/live-dev.ts +357 -0
  322. package/src/server/live-manifest.ts +25 -0
  323. package/src/server/live-prod.ts +120 -0
  324. package/src/server/live-routes.ts +298 -0
  325. package/src/server/live-web.ts +170 -0
  326. package/src/server/live.ts +551 -0
  327. package/src/server/middleware-node.ts +168 -0
  328. package/src/server/middleware-runtime.ts +478 -0
  329. package/src/server/middleware.ts +451 -0
  330. package/src/server/ppr.ts +62 -0
  331. package/src/server/scan.ts +190 -0
  332. package/src/server/server-components.ts +224 -0
  333. package/src/terminal.ts +5 -0
  334. package/src/testing.ts +5 -0
  335. package/src/vite-plugin.ts +413 -0
@@ -0,0 +1,307 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * The React half of server-rendered console routes: mounts the App Router in a
4
+ * headless console root on the server (Bun / Node), applies forwarded input
5
+ * and exposes the painted `CellBuffer` for the live transport and for Partial
6
+ * Prerendering. Loaded through Vite's SSR graph in `text dev` and bundled into
7
+ * `.text/server/live.mjs` by `text build`, so route modules, `@textjs/react`
8
+ * and this module share one React instance.
9
+ */
10
+ import { useContext, useEffect } from "react";
11
+ import { CssConsoleDriver, initYoga, InputEngine, } from "@textjs/core";
12
+ import { createConsoleRootSync } from "@textjs/react";
13
+ import { RouterContext } from "../context.js";
14
+ import { createMemoryHistory, parseHref } from "../history.js";
15
+ import { AppRouter } from "../router.js";
16
+ import { resolveRoute } from "../routing.js";
17
+ import { isAsyncComponent, serverComponent, ServerComponentCache, ServerComponentsProvider } from "./server-components.js";
18
+ const NULL_CONSOLE = { clear() { }, log() { } };
19
+ const timeoutScheduler = {
20
+ request: (cb) => setTimeout(cb, 0),
21
+ cancel: (h) => clearTimeout(h),
22
+ };
23
+ const prepared = new WeakMap();
24
+ /** Wrap async `default` exports (pages, layouts, …) so they render on the console reconciler. */
25
+ export function prepareServerManifest(routes) {
26
+ const hit = prepared.get(routes);
27
+ if (hit)
28
+ return hit;
29
+ const wrapRef = (ref) => {
30
+ if (ref === undefined || typeof ref === "function")
31
+ return ref;
32
+ return isAsyncComponent(ref.default) ? { ...ref, default: serverComponent(ref.default) } : ref;
33
+ };
34
+ const walk = (node) => {
35
+ const out = { ...node };
36
+ for (const k of ["layout", "page", "loading", "error", "notFound"]) {
37
+ if (node[k] !== undefined)
38
+ out[k] = wrapRef(node[k]);
39
+ }
40
+ if (node.children)
41
+ out.children = node.children.map(walk);
42
+ return out;
43
+ };
44
+ const result = walk(routes);
45
+ prepared.set(routes, result);
46
+ return result;
47
+ }
48
+ /** `true` only when `pathname` matches a page that opts into `runtime = "server"` (HTML routing, new sessions). */
49
+ export function isServerPage(routes, pathname) {
50
+ const match = resolveRoute(routes, pathname);
51
+ if (match.notFound)
52
+ return false;
53
+ const page = match.chain[match.chain.length - 1]?.page;
54
+ return page !== undefined && typeof page !== "function" && page.runtime === "server";
55
+ }
56
+ /** The runtime of the page `pathname` resolves to (in-app navigation: not-found pages render where they are requested). */
57
+ export function routeRuntime(routes, pathname) {
58
+ const match = resolveRoute(routes, pathname);
59
+ if (match.notFound)
60
+ return "server";
61
+ const page = match.chain[match.chain.length - 1]?.page;
62
+ return page !== undefined && typeof page !== "function" && page.runtime === "server" ? "server" : "client";
63
+ }
64
+ function TitleReporter({ fallback, onTitle }) {
65
+ const state = useContext(RouterContext);
66
+ const title = state?.metadata.title ?? fallback;
67
+ useEffect(() => {
68
+ if (title !== undefined && onTitle)
69
+ onTitle(title);
70
+ }, [title, onTitle]);
71
+ return null;
72
+ }
73
+ function pathOf(href) {
74
+ const q = href.search(/[?#]/);
75
+ return q < 0 ? href : href.slice(0, q);
76
+ }
77
+ /** Mount a live session's App Router on the server. */
78
+ export async function createLiveApp(options) {
79
+ await initYoga();
80
+ const engine = new InputEngine({ document: null });
81
+ engine.setFocused(options.focused ?? true);
82
+ const root = createConsoleRootSync({
83
+ width: options.cols,
84
+ height: options.rows,
85
+ responsive: false,
86
+ theme: options.theme,
87
+ input: engine,
88
+ console: NULL_CONSOLE,
89
+ clear: "never",
90
+ scheduler: timeoutScheduler,
91
+ minFrameInterval: 0,
92
+ registerGlobal: false,
93
+ onFrame: (frame) => {
94
+ if (!frame.skipped)
95
+ options.onFrame?.();
96
+ },
97
+ onCaughtError: (error) => options.onError?.(error),
98
+ onUncaughtError: (error) => options.onError?.(error),
99
+ onRecoverableError: () => undefined,
100
+ });
101
+ const inner = createMemoryHistory(options.path);
102
+ const cache = new ServerComponentCache();
103
+ let routes = prepareServerManifest(options.routes);
104
+ let fromClient = false;
105
+ let disposed = false;
106
+ let lastIndex = inner.index;
107
+ let navSeq = 0;
108
+ const unlisten = inner.listen((location, action) => {
109
+ const delta = inner.index - lastIndex;
110
+ lastIndex = inner.index;
111
+ if (fromClient)
112
+ return;
113
+ options.onNavigate?.(location.href, action, routeRuntime(routes, location.pathname), action === "pop" ? delta : undefined);
114
+ });
115
+ /**
116
+ * Route transitions to server pages wait for `authorize` (middleware for the
117
+ * target). Denied ones become a document load of the target, which runs
118
+ * middleware over HTTP (redirects, 401s, rewrites).
119
+ */
120
+ const guard = (href, action, apply) => {
121
+ const target = parseHref(href, inner.location.pathname).href;
122
+ if (!options.authorize || routeRuntime(routes, pathOf(target)) === "client") {
123
+ navSeq++;
124
+ apply();
125
+ return;
126
+ }
127
+ const seq = ++navSeq;
128
+ options.authorize(target).then((ok) => {
129
+ if (disposed || seq !== navSeq)
130
+ return;
131
+ if (ok)
132
+ apply();
133
+ else
134
+ options.onNavigate?.(target, action, "client");
135
+ }, (error) => {
136
+ options.onError?.(error);
137
+ if (!disposed && seq === navSeq)
138
+ options.onNavigate?.(target, action, "client");
139
+ });
140
+ };
141
+ const history = Object.create(inner, {
142
+ push: { value: (href) => guard(href, "push", () => inner.push(href)) },
143
+ replace: { value: (href) => guard(href, "replace", () => inner.replace(href)) },
144
+ go: {
145
+ value: (delta) => {
146
+ const target = inner.entries[inner.index + delta];
147
+ if (target)
148
+ guard(target.href, "pop", () => inner.go(delta));
149
+ },
150
+ },
151
+ back: { value: () => history.go(-1) },
152
+ forward: { value: () => history.go(1) },
153
+ });
154
+ const render = () => {
155
+ root.render(_jsx(ServerComponentsProvider, { cache: cache, children: _jsx(AppRouter, { routes: routes, history: history, theme: options.theme, documentTitle: false, errorStore: null, children: _jsx(TitleReporter, { fallback: options.defaultTitle, onTitle: options.onTitle }) }) }));
156
+ };
157
+ render();
158
+ let active = true;
159
+ const applyInput = (event) => {
160
+ if (root.unmounted)
161
+ return;
162
+ switch (event.type) {
163
+ case "key":
164
+ case "paste":
165
+ case "wheel":
166
+ engine.emit(event.type, event);
167
+ break;
168
+ case "focus":
169
+ engine.setFocused(event.focused);
170
+ break;
171
+ case "resize":
172
+ root.renderer.resize(event.cols, event.rows);
173
+ break;
174
+ case "nav": {
175
+ const href = parseHref(event.href, inner.location.pathname).href;
176
+ if (href === inner.location.href)
177
+ break;
178
+ // Browser Back / Forward: move through the same entries when they line up, so both histories agree.
179
+ const delta = event.delta;
180
+ const aligned = delta !== undefined && inner.entries[inner.index + delta]?.href === href;
181
+ guard(href, "pop", () => {
182
+ fromClient = true;
183
+ try {
184
+ if (aligned)
185
+ inner.go(delta);
186
+ else
187
+ inner.push(href);
188
+ }
189
+ finally {
190
+ fromClient = false;
191
+ }
192
+ // Onto a client-rendered route: hand the document over.
193
+ if (routeRuntime(routes, inner.location.pathname) === "client")
194
+ options.onNavigate?.(inner.location.href, "pop", "client");
195
+ });
196
+ break;
197
+ }
198
+ }
199
+ };
200
+ return {
201
+ root,
202
+ history,
203
+ get buffer() {
204
+ return root.renderer.buffer;
205
+ },
206
+ input: applyInput,
207
+ inputMany(events) {
208
+ if (events.length <= 1 || !active) {
209
+ for (const e of events)
210
+ applyInput(e);
211
+ return;
212
+ }
213
+ // One paint for the whole batch; React still commits between events.
214
+ root.renderer.pause();
215
+ try {
216
+ for (const e of events)
217
+ applyInput(e);
218
+ }
219
+ finally {
220
+ if (!root.unmounted)
221
+ root.renderer.resume();
222
+ }
223
+ },
224
+ setActive(next) {
225
+ if (next === active || root.unmounted)
226
+ return;
227
+ active = next;
228
+ if (next)
229
+ root.renderer.resume();
230
+ else
231
+ root.renderer.pause();
232
+ },
233
+ setRoutes(next) {
234
+ routes = prepareServerManifest(next);
235
+ cache.clear();
236
+ if (!root.unmounted)
237
+ render();
238
+ },
239
+ flush() {
240
+ if (!root.unmounted)
241
+ root.flushSyncRender();
242
+ },
243
+ dispose() {
244
+ disposed = true;
245
+ unlisten();
246
+ cache.clear();
247
+ if (!root.unmounted)
248
+ root.unmount();
249
+ },
250
+ };
251
+ }
252
+ /**
253
+ * Render the static shell of a route: the first committed frame, with every
254
+ * `<Suspense>` boundary that is still waiting (async server components,
255
+ * `use()`, lazy modules) showing its fallback. `fetch` never resolves while
256
+ * rendering, so data loaded in effects stays in its loading state too.
257
+ *
258
+ * Returns the exact `console.clear()` / `console.log()` calls the client's
259
+ * driver would make for this frame (curtain included).
260
+ */
261
+ export async function prerenderShell(options) {
262
+ await initYoga();
263
+ const g = globalThis;
264
+ const realFetch = g.fetch;
265
+ g.fetch = (() => new Promise(() => undefined));
266
+ // Any error the render hit (caught by an error boundary, `redirect()` / `notFound()` included)
267
+ // means the first frame is not the route's shell: never bake it into HTML.
268
+ const errors = [];
269
+ const root = createConsoleRootSync({
270
+ width: options.cols,
271
+ height: options.rows,
272
+ responsive: false,
273
+ theme: options.theme,
274
+ input: new InputEngine({ document: null }),
275
+ console: NULL_CONSOLE,
276
+ clear: "never",
277
+ scheduler: { request: () => null, cancel: () => undefined },
278
+ minFrameInterval: 0,
279
+ registerGlobal: false,
280
+ onCaughtError: (error) => void errors.push(error),
281
+ onUncaughtError: (error) => void errors.push(error),
282
+ onRecoverableError: () => undefined,
283
+ });
284
+ try {
285
+ const history = createMemoryHistory(options.path);
286
+ root.render(_jsx(ServerComponentsProvider, { cache: new ServerComponentCache(), children: _jsx(AppRouter, { routes: prepareServerManifest(options.routes), history: history, theme: options.theme, documentTitle: false, errorStore: null }) }));
287
+ root.flushSyncRender();
288
+ if (errors.length > 0) {
289
+ const first = errors[0];
290
+ throw new Error(`rendering ${options.path} threw: ${first instanceof Error ? first.message : String(first)}`, { cause: first });
291
+ }
292
+ if (history.location.href !== parseHref(options.path).href)
293
+ throw new Error(`rendering ${options.path} navigated to ${history.location.href}`);
294
+ const calls = [];
295
+ const capture = {
296
+ clear: () => void calls.push({ method: "clear", args: [] }),
297
+ log: (...args) => void calls.push({ method: "log", args: args.map(String) }),
298
+ };
299
+ new CssConsoleDriver({ console: capture, curtain: true }).render(root.renderer.buffer);
300
+ return calls;
301
+ }
302
+ finally {
303
+ root.unmount();
304
+ g.fetch = realFetch;
305
+ }
306
+ }
307
+ //# sourceMappingURL=live-app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-app.js","sourceRoot":"","sources":["../../src/server/live-app.tsx"],"names":[],"mappings":";AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAkB,MAAM,OAAO,CAAC;AAC9D,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,WAAW,GAIZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,qBAAqB,EAAoC,MAAM,eAAe,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAA0C,MAAM,YAAY,CAAC;AAEpG,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAoF,MAAM,YAAY,CAAC;AAC5H,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAiDxH,MAAM,YAAY,GAAkB,EAAE,KAAK,KAAI,CAAC,EAAE,GAAG,KAAI,CAAC,EAAE,CAAC;AAE7D,MAAM,gBAAgB,GAAsB;IAC1C,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;IAClC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAkC,CAAC;CAChE,CAAC;AAEF,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAgC,CAAC;AAE7D,iGAAiG;AACjG,MAAM,UAAU,qBAAqB,CAAC,MAAqB;IACzD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IACpB,MAAM,OAAO,GAAG,CAAC,GAA+B,EAA8B,EAAE;QAC9E,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,GAAG,KAAK,UAAU;YAAE,OAAO,GAAG,CAAC;QAC/D,OAAO,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,OAAgB,CAAC,EAAkB,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3H,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,IAAsB,EAAoB,EAAE;QACxD,MAAM,GAAG,GAAqB,EAAE,GAAG,IAAI,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,CAAU,EAAE,CAAC;YAC5E,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS;gBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ;YAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1D,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC5B,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,mHAAmH;AACnH,MAAM,UAAU,YAAY,CAAC,MAAqB,EAAE,QAAgB;IAClE,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7C,IAAI,KAAK,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IACjC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC;IACvD,OAAO,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC;AACvF,CAAC;AAED,2HAA2H;AAC3H,MAAM,UAAU,YAAY,CAAC,MAAqB,EAAE,QAAgB;IAClE,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7C,IAAI,KAAK,CAAC,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACpC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC;IACvD,OAAO,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC7G,CAAC;AAED,SAAS,aAAa,CAAC,EAAE,QAAQ,EAAE,OAAO,EAA4D;IACpG,MAAM,KAAK,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC;IAChD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO;YAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACrB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,MAAM,CAAC,IAAY;IAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAuB;IACzD,MAAM,QAAQ,EAAE,CAAC;IACjB,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,qBAAqB,CAAC;QACjC,KAAK,EAAE,OAAO,CAAC,IAAI;QACnB,MAAM,EAAE,OAAO,CAAC,IAAI;QACpB,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,MAAM;QACb,OAAO,EAAE,YAAY;QACrB,KAAK,EAAE,OAAO;QACd,SAAS,EAAE,gBAAgB;QAC3B,gBAAgB,EAAE,CAAC;QACnB,cAAc,EAAE,KAAK;QACrB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACjB,IAAI,CAAC,KAAK,CAAC,OAAO;gBAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1C,CAAC;QACD,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC;QAClD,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC;QACpD,kBAAkB,EAAE,GAAG,EAAE,CAAC,SAAS;KACpC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAC;IACzC,IAAI,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;IAC5B,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;QACjD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;QACtC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;QACxB,IAAI,UAAU;YAAE,OAAO;QACvB,OAAO,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAC7H,CAAC,CAAC,CAAC;IAEH;;;;OAIG;IACH,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,MAAqB,EAAE,KAAiB,EAAQ,EAAE;QAC7E,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;QAC7D,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC5E,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,CAAC;YACR,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,EAAE,MAAM,CAAC;QACrB,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAC5B,CAAC,EAAE,EAAE,EAAE;YACL,IAAI,QAAQ,IAAI,GAAG,KAAK,MAAM;gBAAE,OAAO;YACvC,IAAI,EAAE;gBAAE,KAAK,EAAE,CAAC;;gBACX,OAAO,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACtD,CAAC,EACD,CAAC,KAAc,EAAE,EAAE;YACjB,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,QAAQ,IAAI,GAAG,KAAK,MAAM;gBAAE,OAAO,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAClF,CAAC,CACF,CAAC;IACJ,CAAC,CAAC;IACF,MAAM,OAAO,GAAkB,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;QAClD,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE;QAC9E,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE;QACvF,EAAE,EAAE;YACF,KAAK,EAAE,CAAC,KAAa,EAAE,EAAE;gBACvB,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;gBAClD,IAAI,MAAM;oBAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/D,CAAC;SACF;QACD,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;QACrC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;KACxC,CAAkB,CAAC;IAEpB,MAAM,MAAM,GAAG,GAAS,EAAE;QACxB,IAAI,CAAC,MAAM,CACT,KAAC,wBAAwB,IAAC,KAAK,EAAE,KAAK,YACpC,KAAC,SAAS,IAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,YACvG,KAAC,aAAa,IAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,GAAI,GACjE,GACa,CAC5B,CAAC;IACJ,CAAC,CAAC;IACF,MAAM,EAAE,CAAC;IAET,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,MAAM,UAAU,GAAG,CAAC,KAAgB,EAAQ,EAAE;QAC5C,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,KAAK,CAAC;YACX,KAAK,OAAO,CAAC;YACb,KAAK,OAAO;gBACV,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAc,CAAC,CAAC;gBACxC,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACjC,MAAM;YACR,KAAK,QAAQ;gBACX,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC7C,MAAM;YACR,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC;gBACjE,IAAI,IAAI,KAAK,KAAK,CAAC,QAAQ,CAAC,IAAI;oBAAE,MAAM;gBACxC,oGAAoG;gBACpG,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;gBAC1B,MAAM,OAAO,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,EAAE,IAAI,KAAK,IAAI,CAAC;gBACzF,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE;oBACtB,UAAU,GAAG,IAAI,CAAC;oBAClB,IAAI,CAAC;wBACH,IAAI,OAAO;4BAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;;4BACxB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACxB,CAAC;4BAAS,CAAC;wBACT,UAAU,GAAG,KAAK,CAAC;oBACrB,CAAC;oBACD,wDAAwD;oBACxD,IAAI,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,QAAQ;wBAAE,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAC7H,CAAC,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,OAAO;QACL,IAAI;QACJ,OAAO;QACP,IAAI,MAAM;YACR,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC9B,CAAC;QACD,KAAK,EAAE,UAAU;QACjB,SAAS,CAAC,MAAM;YACd,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAClC,KAAK,MAAM,CAAC,IAAI,MAAM;oBAAE,UAAU,CAAC,CAAC,CAAC,CAAC;gBACtC,OAAO;YACT,CAAC;YACD,qEAAqE;YACrE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,KAAK,MAAM,CAAC,IAAI,MAAM;oBAAE,UAAU,CAAC,CAAC,CAAC,CAAC;YACxC,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,SAAS;oBAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC9C,CAAC;QACH,CAAC;QACD,SAAS,CAAC,IAAI;YACZ,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS;gBAAE,OAAO;YAC9C,MAAM,GAAG,IAAI,CAAC;YACd,IAAI,IAAI;gBAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;;gBAC5B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC7B,CAAC;QACD,SAAS,CAAC,IAAI;YACZ,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;YACrC,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,SAAS;gBAAE,MAAM,EAAE,CAAC;QAChC,CAAC;QACD,KAAK;YACH,IAAI,CAAC,IAAI,CAAC,SAAS;gBAAE,IAAI,CAAC,eAAe,EAAE,CAAC;QAC9C,CAAC;QACD,OAAO;YACL,QAAQ,GAAG,IAAI,CAAC;YAChB,QAAQ,EAAE,CAAC;YACX,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,SAAS;gBAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QACtC,CAAC;KACF,CAAC;AACJ,CAAC;AAmBD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA8B;IACjE,MAAM,QAAQ,EAAE,CAAC;IACjB,MAAM,CAAC,GAAG,UAAsC,CAAC;IACjD,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC;IAC1B,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,OAAO,CAAW,GAAG,EAAE,CAAC,SAAS,CAAC,CAA4B,CAAC;IACpF,+FAA+F;IAC/F,2EAA2E;IAC3E,MAAM,MAAM,GAAc,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,qBAAqB,CAAC;QACjC,KAAK,EAAE,OAAO,CAAC,IAAI;QACnB,MAAM,EAAE,OAAO,CAAC,IAAI;QACpB,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,IAAI,WAAW,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QAC1C,OAAO,EAAE,YAAY;QACrB,KAAK,EAAE,OAAO;QACd,SAAS,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE;QAC3D,gBAAgB,EAAE,CAAC;QACnB,cAAc,EAAE,KAAK;QACrB,aAAa,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QACjD,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QACnD,kBAAkB,EAAE,GAAG,EAAE,CAAC,SAAS;KACpC,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CACT,KAAC,wBAAwB,IAAC,KAAK,EAAE,IAAI,oBAAoB,EAAE,YACzD,KAAC,SAAS,IAAC,MAAM,EAAE,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,GAAI,GACnH,CAC5B,CAAC;QACF,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,aAAa,OAAO,CAAC,IAAI,WAAW,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAClI,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,aAAa,OAAO,CAAC,IAAI,iBAAiB,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/I,MAAM,KAAK,GAAgB,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAkB;YAC7B,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;YAC3D,GAAG,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;SACxF,CAAC;QACF,IAAI,gBAAgB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACvF,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC;IACtB,CAAC;AACH,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * `text build` step for server-rendered routes and Partial Prerendering:
3
+ *
4
+ * 1. `.text/server/live.mjs` — the SSR bundle (every route, the App Router and
5
+ * the console renderer) that renders live sessions in `text start` and
6
+ * the static shells below.
7
+ * 2. `assets/player-[hash].js` — the frame player, when any page is
8
+ * `export const runtime = "server"`.
9
+ * 3. Static shells: each static route's first frame inlined into its HTML
10
+ * (`index.html`, `<route>/index.html`; server routes under `.text/pages/`).
11
+ * 4. `.text/live-manifest.json` — what `text start` needs to serve them.
12
+ */
13
+ import { type InlineConfig } from "vite";
14
+ import { type TextConfig } from "../config.js";
15
+ import type { ShellCall } from "./live-app.js";
16
+ import { type LiveManifest } from "./live-manifest.js";
17
+ import { type AppScan } from "./scan.js";
18
+ export { LIVE_MANIFEST, type LiveManifest } from "./live-manifest.js";
19
+ /** How long one route may take to prerender before it streams without a shell. */
20
+ export declare const PRERENDER_TIMEOUT_MS = 10000;
21
+ type PrerenderResult = {
22
+ calls: ShellCall[];
23
+ } | {
24
+ error: string;
25
+ };
26
+ /**
27
+ * Prerender shells in a disposable child process: route modules' top-level
28
+ * side effects (timers, sockets, a patched `fetch`) can't hang or leak into the
29
+ * build, and each route gets `timeoutMs`. The child exits once its results are
30
+ * written.
31
+ */
32
+ export declare function prerenderInChild(liveBundle: string, job: {
33
+ paths: string[];
34
+ cols: number;
35
+ rows: number;
36
+ theme?: string;
37
+ timeoutMs: number;
38
+ }): Promise<Record<string, PrerenderResult>>;
39
+ export interface LiveBuildOptions {
40
+ root: string;
41
+ config: TextConfig;
42
+ outDir: string;
43
+ scan: AppScan;
44
+ /** Build plugins (the caller passes `textjsVitePlugin(config)`). */
45
+ plugins: InlineConfig["plugins"];
46
+ /** Per-route prerender budget (default {@link PRERENDER_TIMEOUT_MS}). */
47
+ prerenderTimeoutMs?: number;
48
+ }
49
+ export interface LiveBuildResult {
50
+ manifest: LiveManifest;
51
+ shells: number;
52
+ staticRoutes: number;
53
+ /** Routes whose shell could not be prerendered, with the reason. */
54
+ skipped: Array<{
55
+ pattern: string;
56
+ reason: string;
57
+ }>;
58
+ player: {
59
+ bytes: number;
60
+ gzip: number;
61
+ } | null;
62
+ }
63
+ /** Run after the client build. Returns `null` when there is nothing to do. */
64
+ export declare function buildLiveRoutes(o: LiveBuildOptions): Promise<LiveBuildResult | null>;
65
+ /** Bytes of every client `.js` asset except the frame player (for size comparisons). */
66
+ export declare function clientBundleBytes(outDir: string): {
67
+ bytes: number;
68
+ gzip: number;
69
+ };
70
+ //# sourceMappingURL=live-build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-build.d.ts","sourceRoot":"","sources":["../../src/server/live-build.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,EAAsB,KAAK,YAAY,EAAe,MAAM,MAAM,CAAC;AAC1E,OAAO,EAAqB,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAa,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEnE,kFAAkF;AAClF,eAAO,MAAM,oBAAoB,QAAS,CAAC;AAE3C,KAAK,eAAe,GAAG;IAAE,KAAK,EAAE,SAAS,EAAE,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAIlE;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GACtF,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAiD1C;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,oEAAoE;IACpE,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IACjC,yEAAyE;IACzE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,oEAAoE;IACpE,OAAO,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAChD;AAUD,8EAA8E;AAC9E,wBAAsB,eAAe,CAAC,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAqH1F;AAED,wFAAwF;AACxF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAYjF"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * `text build` step for server-rendered routes and Partial Prerendering:
3
+ *
4
+ * 1. `.text/server/live.mjs` — the SSR bundle (every route, the App Router and
5
+ * the console renderer) that renders live sessions in `text start` and
6
+ * the static shells below.
7
+ * 2. `assets/player-[hash].js` — the frame player, when any page is
8
+ * `export const runtime = "server"`.
9
+ * 3. Static shells: each static route's first frame inlined into its HTML
10
+ * (`index.html`, `<route>/index.html`; server routes under `.text/pages/`).
11
+ * 4. `.text/live-manifest.json` — what `text start` needs to serve them.
12
+ */
13
+ import { spawn } from "node:child_process";
14
+ import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
15
+ import { dirname, join } from "node:path";
16
+ import { pathToFileURL } from "node:url";
17
+ import { gzipSync } from "node:zlib";
18
+ import { build, mergeConfig } from "vite";
19
+ import { normalizeBasePath } from "../config.js";
20
+ import { textjsLivePlugin } from "./live-dev.js";
21
+ import { createLiveHtml, listServerPages, VIRTUAL_LIVE, VIRTUAL_PLAYER } from "./live-routes.js";
22
+ import { injectShell, shellPath, shellScript } from "./ppr.js";
23
+ import { LIVE_MANIFEST } from "./live-manifest.js";
24
+ import { listPages } from "./scan.js";
25
+ export { LIVE_MANIFEST } from "./live-manifest.js";
26
+ /** How long one route may take to prerender before it streams without a shell. */
27
+ export const PRERENDER_TIMEOUT_MS = 10_000;
28
+ const RESULT_MARK = "\u0000textjs-prerender:";
29
+ /**
30
+ * Prerender shells in a disposable child process: route modules' top-level
31
+ * side effects (timers, sockets, a patched `fetch`) can't hang or leak into the
32
+ * build, and each route gets `timeoutMs`. The child exits once its results are
33
+ * written.
34
+ */
35
+ export async function prerenderInChild(liveBundle, job) {
36
+ if (job.paths.length === 0)
37
+ return {};
38
+ const runner = join(dirname(liveBundle), `prerender-${process.pid}-${Date.now()}.mjs`);
39
+ writeFileSync(runner, `const job = JSON.parse(process.argv[3]);
40
+ const out = {};
41
+ const timeout = (ms) => new Promise((_, reject) => setTimeout(() => reject(new Error("timed out after " + ms + "ms")), ms).unref?.());
42
+ try {
43
+ const entry = await Promise.race([import(process.argv[2]), timeout(job.timeoutMs)]);
44
+ for (const path of job.paths) {
45
+ try {
46
+ const calls = await Promise.race([entry.prerenderShell({ routes: entry.routes, path, cols: job.cols, rows: job.rows, theme: job.theme }), timeout(job.timeoutMs)]);
47
+ out[path] = { calls };
48
+ } catch (error) {
49
+ out[path] = { error: error instanceof Error ? error.message : String(error) };
50
+ }
51
+ }
52
+ } catch (error) {
53
+ for (const path of job.paths) out[path] ??= { error: error instanceof Error ? error.message : String(error) };
54
+ }
55
+ process.stdout.write(${JSON.stringify(RESULT_MARK)} + JSON.stringify(out) + "\\n", () => process.exit(0));
56
+ `);
57
+ try {
58
+ const budget = job.timeoutMs * job.paths.length + 30_000;
59
+ const output = await new Promise((resolveRun) => {
60
+ const child = spawn(process.execPath, [runner, pathToFileURL(liveBundle).href, JSON.stringify(job)], { stdio: ["ignore", "pipe", "inherit"], env: process.env });
61
+ let stdout = "";
62
+ child.stdout.setEncoding("utf8");
63
+ child.stdout.on("data", (chunk) => {
64
+ stdout += chunk;
65
+ });
66
+ const timer = setTimeout(() => child.kill("SIGKILL"), budget);
67
+ child.on("close", () => {
68
+ clearTimeout(timer);
69
+ resolveRun(stdout);
70
+ });
71
+ child.on("error", () => {
72
+ clearTimeout(timer);
73
+ resolveRun(stdout);
74
+ });
75
+ });
76
+ const line = output.split("\n").find((l) => l.startsWith(RESULT_MARK));
77
+ if (line === undefined)
78
+ return Object.fromEntries(job.paths.map((p) => [p, { error: "the prerender process exited without results" }]));
79
+ return JSON.parse(line.slice(RESULT_MARK.length));
80
+ }
81
+ finally {
82
+ rmSync(runner, { force: true });
83
+ }
84
+ }
85
+ const META = ".text";
86
+ function htmlFileFor(pattern, server) {
87
+ const dir = pattern === "/" ? "" : pattern.slice(1);
88
+ if (server)
89
+ return join(META, "pages", dir, "index.html");
90
+ return dir ? join(dir, "index.html") : "index.html";
91
+ }
92
+ /** Run after the client build. Returns `null` when there is nothing to do. */
93
+ export async function buildLiveRoutes(o) {
94
+ const { config, outDir, scan } = o;
95
+ const basePath = normalizeBasePath(config.basePath);
96
+ const serverPages = listServerPages(scan);
97
+ const serverSet = new Set(serverPages.map((p) => p.pattern));
98
+ const pages = listPages(scan);
99
+ const ppr = config.ppr !== false;
100
+ const staticPages = ppr ? pages.filter((p) => !p.dynamic) : [];
101
+ if (serverPages.length === 0 && staticPages.length === 0)
102
+ return null;
103
+ const withVite = (c) => (config.vite ? mergeConfig(c, config.vite) : c);
104
+ const serverDir = join(outDir, META, "server");
105
+ await build(withVite({
106
+ configFile: false,
107
+ root: o.root,
108
+ mode: "production",
109
+ logLevel: "error",
110
+ clearScreen: false,
111
+ build: {
112
+ ssr: VIRTUAL_LIVE,
113
+ outDir: serverDir,
114
+ emptyOutDir: false,
115
+ target: "node18",
116
+ rollupOptions: { output: { entryFileNames: "live.mjs", format: "es" } },
117
+ },
118
+ ssr: { noExternal: [/^@textjs\//] },
119
+ plugins: o.plugins,
120
+ }));
121
+ let player = null;
122
+ let playerUrl = null;
123
+ if (serverPages.length > 0) {
124
+ const out = (await build(withVite({
125
+ configFile: false,
126
+ root: o.root,
127
+ base: basePath ? `${basePath}/` : "/",
128
+ mode: "production",
129
+ logLevel: "error",
130
+ clearScreen: false,
131
+ publicDir: false,
132
+ build: {
133
+ outDir,
134
+ emptyOutDir: false,
135
+ target: "es2022",
136
+ modulePreload: false,
137
+ rollupOptions: { input: { player: VIRTUAL_PLAYER }, output: { entryFileNames: "assets/player-[hash].js", format: "es" } },
138
+ },
139
+ // The player imports only @textjs/core: no React, no route modules.
140
+ plugins: textjsLivePlugin({ appDir: config.appDir, root: o.root }),
141
+ })));
142
+ const outputs = Array.isArray(out) ? out : [out];
143
+ const chunk = outputs.flatMap((r) => r.output).find((c) => c.type === "chunk" && c.isEntry);
144
+ if (chunk) {
145
+ const code = readFileSync(join(outDir, chunk.fileName));
146
+ player = { bytes: code.length, gzip: gzipSync(code).length };
147
+ playerUrl = `${basePath}/${chunk.fileName}`;
148
+ }
149
+ }
150
+ const title = config.title ?? "\u25BC Text.js";
151
+ const manifest = {
152
+ version: 1,
153
+ basePath,
154
+ title,
155
+ viewport: config.viewport ?? {},
156
+ player: playerUrl,
157
+ serverRoutes: serverPages.map((p) => p.pattern),
158
+ pages: {},
159
+ liveHtml: null,
160
+ ...(config.live ? { live: config.live } : {}),
161
+ };
162
+ const write = (rel, html) => {
163
+ const file = join(outDir, rel);
164
+ mkdirSync(dirname(file), { recursive: true });
165
+ writeFileSync(file, html);
166
+ };
167
+ const liveDoc = (shell) => createLiveHtml({ title, basePath, viewport: config.viewport, playerSrc: playerUrl ?? "", shell });
168
+ if (playerUrl) {
169
+ manifest.liveHtml = join(META, "live.html");
170
+ write(manifest.liveHtml, liveDoc());
171
+ }
172
+ const skipped = [];
173
+ let shells = 0;
174
+ if (staticPages.length > 0) {
175
+ const indexFile = join(outDir, "index.html");
176
+ const template = existsSync(indexFile) ? readFileSync(indexFile, "utf8") : null;
177
+ const vp = config.viewport ?? {};
178
+ const wanted = staticPages.filter((p) => serverSet.has(p.pattern) || template !== null);
179
+ const results = await prerenderInChild(join(serverDir, "live.mjs"), {
180
+ paths: wanted.map((p) => p.pattern),
181
+ cols: vp.width ?? 120,
182
+ rows: vp.height ?? 36,
183
+ theme: vp.theme,
184
+ timeoutMs: o.prerenderTimeoutMs ?? PRERENDER_TIMEOUT_MS,
185
+ });
186
+ for (const page of wanted) {
187
+ const server = serverSet.has(page.pattern);
188
+ try {
189
+ const result = results[page.pattern] ?? { error: "prerendering did not finish" };
190
+ if ("error" in result)
191
+ throw new Error(result.error);
192
+ const script = shellScript(result.calls, shellPath(basePath, page.pattern));
193
+ const rel = htmlFileFor(page.pattern, server);
194
+ write(rel, server ? liveDoc(script) : injectShell(template, script));
195
+ manifest.pages[page.pattern] = rel;
196
+ shells++;
197
+ }
198
+ catch (error) {
199
+ skipped.push({ pattern: page.pattern, reason: error instanceof Error ? error.message : String(error) });
200
+ }
201
+ }
202
+ }
203
+ write(join(META, LIVE_MANIFEST), `${JSON.stringify(manifest, null, 2)}\n`);
204
+ return { manifest, shells, staticRoutes: staticPages.length, skipped, player };
205
+ }
206
+ /** Bytes of every client `.js` asset except the frame player (for size comparisons). */
207
+ export function clientBundleBytes(outDir) {
208
+ let bytes = 0;
209
+ let gzip = 0;
210
+ const dir = join(outDir, "assets");
211
+ if (!existsSync(dir))
212
+ return { bytes, gzip };
213
+ for (const name of readdirSync(dir)) {
214
+ if (!name.endsWith(".js") || name.startsWith("player-"))
215
+ continue;
216
+ const buf = readFileSync(join(dir, name));
217
+ bytes += buf.length;
218
+ gzip += gzipSync(buf).length;
219
+ }
220
+ return { bytes, gzip };
221
+ }
222
+ //# sourceMappingURL=live-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-build.js","sourceRoot":"","sources":["../../src/server/live-build.ts"],"names":[],"mappings":"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"}