@textjs/app 0.0.0-stage → 1.0.3

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,72 @@
1
+ /**
2
+ * Build-time knowledge of server-rendered routes: which pages opt in with
3
+ * `export const runtime = "server"`, the virtual modules that render them, and
4
+ * the HTML document that boots the frame player.
5
+ */
6
+ import { type AppScan } from "./scan.js";
7
+ export declare const VIRTUAL_LIVE = "virtual:textjs/live";
8
+ export declare const VIRTUAL_PLAYER = "virtual:textjs/player";
9
+ /** Script `src` of the frame player in `text dev`. */
10
+ export declare const PLAYER_URL = "/@textjs/player";
11
+ /**
12
+ * Framework modules are imported by package specifier (not file path) so the
13
+ * virtual modules resolve them exactly like user code does, sharing one
14
+ * instance of the router context in the SSR graph.
15
+ */
16
+ export declare const LIVE_APP_MODULE = "@textjs/app/live-app";
17
+ export declare const LIVE_PLAYER_MODULE = "@textjs/app/live-player";
18
+ export declare const LIVE_STUB_MODULE = "@textjs/app/live-stub";
19
+ /** Suffix marking a server page import in the client manifest; the plugin loads the stub instead. */
20
+ export declare const SERVER_STUB_QUERY = "?textjs-server-stub";
21
+ /**
22
+ * Suffix for layouts / loading / error / not-found files of segments that only
23
+ * contain server pages: the browser never renders them, so they (and what they
24
+ * import) stay out of the client bundle.
25
+ */
26
+ export declare const SERVER_ONLY_QUERY = "?textjs-server-only";
27
+ export declare const JSX_RUNTIME_MODULE = "@textjs/app/server/jsx-runtime";
28
+ export declare const JSX_DEV_RUNTIME_MODULE = "@textjs/app/server/jsx-dev-runtime";
29
+ /**
30
+ * The value of a module's `runtime` export when it is a static string, read
31
+ * with a real parser: `export const runtime = "server"`, with a type
32
+ * annotation or `as const`, a template literal, `export { runtime }`,
33
+ * `export { x as runtime }` and re-exports (`export { runtime } from "./x"`).
34
+ * Comments and strings never match.
35
+ */
36
+ export declare function readRuntimeExport(file: string, depth?: number): string | undefined;
37
+ export declare function isServerRuntimeFile(file: string | undefined): boolean;
38
+ export interface ServerPage {
39
+ pattern: string;
40
+ /** Project-relative page file. */
41
+ file: string;
42
+ dynamic: boolean;
43
+ }
44
+ /** Pages that render on the server. */
45
+ export declare function listServerPages(scan: AppScan): ServerPage[];
46
+ /** Route matcher for HTML requests: does `pathname` resolve to a server page? */
47
+ export declare function createRuntimeMatcher(scan: AppScan): (pathname: string) => "server" | "client";
48
+ /**
49
+ * The scan with every server page swapped for the client stub, so the browser
50
+ * bundle never contains server route modules (or anything they import).
51
+ */
52
+ export declare function withServerStubs(scan: AppScan): AppScan;
53
+ /** `virtual:textjs/live`: the SSR entry rendering live sessions and PPR shells. */
54
+ export declare function generateLiveEntryModule(scan: AppScan): string;
55
+ export declare function generatePlayerEntryModule(): string;
56
+ /** JSON safe to inline in a `<script>` element. */
57
+ export declare function inlineJson(value: unknown): string;
58
+ export interface LiveHtmlOptions {
59
+ title: string;
60
+ playerSrc: string;
61
+ basePath: string;
62
+ viewport?: {
63
+ width?: number;
64
+ height?: number;
65
+ responsive?: boolean;
66
+ };
67
+ /** Inline PPR shell `<script>` (painted before the player loads). */
68
+ shell?: string;
69
+ }
70
+ /** The document for a server-rendered route: a static page pad plus the frame player. */
71
+ export declare function createLiveHtml(o: LiveHtmlOptions): string;
72
+ //# sourceMappingURL=live-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-routes.d.ts","sourceRoot":"","sources":["../../src/server/live-routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,OAAO,EAAqD,KAAK,OAAO,EAAuB,MAAM,QAAQ,CAAC;AAE9G,eAAO,MAAM,YAAY,wBAAwB,CAAC;AAClD,eAAO,MAAM,cAAc,0BAA0B,CAAC;AACtD,sDAAsD;AACtD,eAAO,MAAM,UAAU,oBAAoB,CAAC;AAG5C;;;;GAIG;AACH,eAAO,MAAM,eAAe,yBAAyB,CAAC;AACtD,eAAO,MAAM,kBAAkB,4BAA4B,CAAC;AAC5D,eAAO,MAAM,gBAAgB,0BAA0B,CAAC;AACxD,qGAAqG;AACrG,eAAO,MAAM,iBAAiB,wBAAwB,CAAC;AACvD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,wBAAwB,CAAC;AACvD,eAAO,MAAM,kBAAkB,mCAAmC,CAAC;AACnE,eAAO,MAAM,sBAAsB,uCAAuC,CAAC;AAqC3E;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,MAAM,GAAG,SAAS,CAuB7E;AAqED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAErE;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,uCAAuC;AACvC,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,EAAE,CAI3D;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,QAAQ,GAAG,QAAQ,CAS7F;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAgBtD;AAED,mFAAmF;AACnF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAI7D;AAED,wBAAgB,yBAAyB,IAAI,MAAM,CAIlD;AAMD,mDAAmD;AACnD,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEjD;AAMD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACrE,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,yFAAyF;AACzF,wBAAgB,cAAc,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAoCzD"}
@@ -0,0 +1,274 @@
1
+ /**
2
+ * Build-time knowledge of server-rendered routes: which pages opt in with
3
+ * `export const runtime = "server"`, the virtual modules that render them, and
4
+ * the HTML document that boots the frame player.
5
+ */
6
+ import { readFileSync, statSync } from "node:fs";
7
+ import { createRequire } from "node:module";
8
+ import { dirname, join, resolve } from "node:path";
9
+ import { parseAst } from "vite";
10
+ import { BRAND_MARK, ENGINE_NAME, VERSION } from "@textjs/core";
11
+ import { matchAppRoutes } from "../routing.js";
12
+ import { generateRoutesModule, listPages, toStaticManifest } from "./scan.js";
13
+ export const VIRTUAL_LIVE = "virtual:textjs/live";
14
+ export const VIRTUAL_PLAYER = "virtual:textjs/player";
15
+ /** Script `src` of the frame player in `text dev`. */
16
+ export const PLAYER_URL = "/@textjs/player";
17
+ /**
18
+ * Framework modules are imported by package specifier (not file path) so the
19
+ * virtual modules resolve them exactly like user code does, sharing one
20
+ * instance of the router context in the SSR graph.
21
+ */
22
+ export const LIVE_APP_MODULE = "@textjs/app/live-app";
23
+ export const LIVE_PLAYER_MODULE = "@textjs/app/live-player";
24
+ export const LIVE_STUB_MODULE = "@textjs/app/live-stub";
25
+ /** Suffix marking a server page import in the client manifest; the plugin loads the stub instead. */
26
+ export const SERVER_STUB_QUERY = "?textjs-server-stub";
27
+ /**
28
+ * Suffix for layouts / loading / error / not-found files of segments that only
29
+ * contain server pages: the browser never renders them, so they (and what they
30
+ * import) stay out of the client bundle.
31
+ */
32
+ export const SERVER_ONLY_QUERY = "?textjs-server-only";
33
+ export const JSX_RUNTIME_MODULE = "@textjs/app/server/jsx-runtime";
34
+ export const JSX_DEV_RUNTIME_MODULE = "@textjs/app/server/jsx-dev-runtime";
35
+ let transformSync = null;
36
+ /** esbuild's `transformSync` (a dependency of Vite, which Text.js depends on). */
37
+ function esbuild() {
38
+ if (transformSync === null) {
39
+ const require = createRequire(import.meta.url);
40
+ const fromVite = createRequire(require.resolve("vite/package.json"));
41
+ transformSync = fromVite("esbuild").transformSync;
42
+ }
43
+ return transformSync;
44
+ }
45
+ const LOADERS = { ".ts": "ts", ".mts": "ts", ".cts": "ts", ".tsx": "tsx", ".js": "jsx", ".mjs": "js", ".cjs": "js", ".jsx": "jsx" };
46
+ function stringValue(node) {
47
+ const n = node;
48
+ if (!n)
49
+ return undefined;
50
+ if (n.type === "Literal" && typeof n.value === "string")
51
+ return n.value;
52
+ if (n.type === "TemplateLiteral" && n.expressions.length === 0)
53
+ return n.quasis[0]?.value?.cooked;
54
+ return undefined;
55
+ }
56
+ function exportName(node) {
57
+ const n = node;
58
+ return n.type === "Identifier" ? n.name : stringValue(n);
59
+ }
60
+ const runtimeCache = new Map();
61
+ /**
62
+ * The value of a module's `runtime` export when it is a static string, read
63
+ * with a real parser: `export const runtime = "server"`, with a type
64
+ * annotation or `as const`, a template literal, `export { runtime }`,
65
+ * `export { x as runtime }` and re-exports (`export { runtime } from "./x"`).
66
+ * Comments and strings never match.
67
+ */
68
+ export function readRuntimeExport(file, depth = 0) {
69
+ let mtime;
70
+ let code;
71
+ try {
72
+ mtime = statSync(file).mtimeMs;
73
+ const hit = runtimeCache.get(file);
74
+ if (hit && hit.mtime === mtime)
75
+ return hit.value;
76
+ code = readFileSync(file, "utf8");
77
+ }
78
+ catch {
79
+ return undefined;
80
+ }
81
+ let value;
82
+ if (/\bruntime\b/.test(code)) {
83
+ try {
84
+ const ext = /\.[^.\\/]+$/.exec(file)?.[0] ?? ".ts";
85
+ const js = esbuild()(code, { loader: LOADERS[ext] ?? "tsx", format: "esm", jsx: "automatic", sourcefile: file }).code;
86
+ value = exportedString(parseAst(js), file, "runtime", depth);
87
+ }
88
+ catch {
89
+ value = undefined;
90
+ }
91
+ }
92
+ runtimeCache.set(file, { mtime, value });
93
+ return value;
94
+ }
95
+ /** The static string value of export `name` in a (transpiled) module, following relative re-exports. */
96
+ function exportedString(program, file, name, depth) {
97
+ const body = program.body;
98
+ const constants = new Map();
99
+ // esbuild turns `export { runtime } from "./x"` into an import plus a local export.
100
+ const imports = new Map();
101
+ for (const node of body) {
102
+ if (node.type !== "ImportDeclaration")
103
+ continue;
104
+ for (const spec of node.specifiers) {
105
+ if (spec.type === "ImportSpecifier")
106
+ imports.set(spec.local.name, { source: stringValue(node.source), name: exportName(spec.imported) });
107
+ }
108
+ }
109
+ const follow = (source, name) => {
110
+ if (depth >= 8 || !source.startsWith("."))
111
+ return undefined;
112
+ const target = resolveRelative(dirname(file), source);
113
+ return target ? readRuntimeExportNamed(target, name, depth + 1) : undefined;
114
+ };
115
+ for (const node of body) {
116
+ const decl = (node.type === "ExportNamedDeclaration" ? node.declaration : node);
117
+ if (decl?.type !== "VariableDeclaration")
118
+ continue;
119
+ for (const d of decl.declarations) {
120
+ const id = d.id;
121
+ if (id.type === "Identifier")
122
+ constants.set(id.name, decl.kind === "const" ? stringValue(d.init) : undefined);
123
+ }
124
+ }
125
+ for (const node of body) {
126
+ if (node.type !== "ExportNamedDeclaration")
127
+ continue;
128
+ const decl = node.declaration;
129
+ if (decl?.type === "VariableDeclaration") {
130
+ for (const d of decl.declarations)
131
+ if (d.id.type === "Identifier" && d.id.name === name)
132
+ return constants.get(name);
133
+ continue;
134
+ }
135
+ for (const spec of node.specifiers ?? []) {
136
+ if (exportName(spec.exported) !== name)
137
+ continue;
138
+ const local = exportName(spec.local);
139
+ const source = stringValue(node.source);
140
+ if (source !== undefined)
141
+ return follow(source, local);
142
+ const imported = imports.get(local);
143
+ return imported ? follow(imported.source, imported.name) : constants.get(local);
144
+ }
145
+ }
146
+ return undefined;
147
+ }
148
+ function readRuntimeExportNamed(file, name, depth) {
149
+ if (name === "runtime")
150
+ return readRuntimeExport(file, depth);
151
+ try {
152
+ const ext = /\.[^.\\/]+$/.exec(file)?.[0] ?? ".ts";
153
+ const js = esbuild()(readFileSync(file, "utf8"), { loader: LOADERS[ext] ?? "tsx", format: "esm", jsx: "automatic", sourcefile: file }).code;
154
+ return exportedString(parseAst(js), file, name, depth);
155
+ }
156
+ catch {
157
+ return undefined;
158
+ }
159
+ }
160
+ function resolveRelative(dir, spec) {
161
+ const base = resolve(dir, spec);
162
+ for (const candidate of [base, ...Object.keys(LOADERS).map((e) => base + e), ...Object.keys(LOADERS).map((e) => join(base, `index${e}`))]) {
163
+ try {
164
+ if (statSync(candidate).isFile())
165
+ return candidate;
166
+ }
167
+ catch {
168
+ // try the next
169
+ }
170
+ }
171
+ return null;
172
+ }
173
+ export function isServerRuntimeFile(file) {
174
+ return file ? readRuntimeExport(file) === "server" : false;
175
+ }
176
+ /** Pages that render on the server. */
177
+ export function listServerPages(scan) {
178
+ return listPages(scan)
179
+ .filter((p) => p.file !== undefined && isServerRuntimeFile(join(scan.root, p.file)))
180
+ .map((p) => ({ pattern: p.pattern, file: p.file, dynamic: p.dynamic }));
181
+ }
182
+ /** Route matcher for HTML requests: does `pathname` resolve to a server page? */
183
+ export function createRuntimeMatcher(scan) {
184
+ const manifest = toStaticManifest(scan);
185
+ const server = new Set(listServerPages(scan).map((p) => p.file));
186
+ return (pathname) => {
187
+ if (server.size === 0)
188
+ return "client";
189
+ const m = matchAppRoutes(manifest, pathname);
190
+ const file = m?.chain[m.chain.length - 1]?.files?.page;
191
+ return file !== undefined && server.has(file) ? "server" : "client";
192
+ };
193
+ }
194
+ /**
195
+ * The scan with every server page swapped for the client stub, so the browser
196
+ * bundle never contains server route modules (or anything they import).
197
+ */
198
+ export function withServerStubs(scan) {
199
+ const hasClientPage = (s) => (s.files.page !== undefined && !isServerRuntimeFile(s.files.page)) || s.children.some(hasClientPage);
200
+ const swap = (s) => {
201
+ const files = { ...s.files };
202
+ const page = s.files.page;
203
+ if (page && isServerRuntimeFile(page))
204
+ files.page = `${page}${SERVER_STUB_QUERY}`;
205
+ // Nothing under this segment renders in the browser: keep its boundaries and layout out of the bundle too.
206
+ if (!hasClientPage(s)) {
207
+ for (const kind of ["layout", "loading", "error", "not-found"]) {
208
+ const f = s.files[kind];
209
+ if (f)
210
+ files[kind] = `${f}${SERVER_ONLY_QUERY}`;
211
+ }
212
+ }
213
+ return { ...s, files, children: s.children.map(swap) };
214
+ };
215
+ return { ...scan, tree: swap(scan.tree) };
216
+ }
217
+ /** `virtual:textjs/live`: the SSR entry rendering live sessions and PPR shells. */
218
+ export function generateLiveEntryModule(scan) {
219
+ return `${generateRoutesModule(scan)}
220
+ export { createLiveApp, isServerPage, prerenderShell, routeRuntime } from ${JSON.stringify(LIVE_APP_MODULE)};
221
+ `;
222
+ }
223
+ export function generatePlayerEntryModule() {
224
+ return `import { bootFramePlayer } from ${JSON.stringify(LIVE_PLAYER_MODULE)};
225
+ bootFramePlayer();
226
+ `;
227
+ }
228
+ function escapeHtml(s) {
229
+ return s.replace(/[&<>"]/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;" })[c]);
230
+ }
231
+ /** JSON safe to inline in a `<script>` element. */
232
+ export function inlineJson(value) {
233
+ return JSON.stringify(value).replace(/</g, "\\u003c").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
234
+ }
235
+ const FAVICON = `data:image/svg+xml,${encodeURIComponent(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><rect width="32" height="32" rx="7" fill="#0a0a0a"/><path d="M7 10h18L16 25z" fill="#ededed"/></svg>`)}`;
236
+ /** The document for a server-rendered route: a static page pad plus the frame player. */
237
+ export function createLiveHtml(o) {
238
+ const config = { basePath: o.basePath, viewport: o.viewport ?? {}, title: o.title };
239
+ return `<!doctype html>
240
+ <html lang="en">
241
+ <head>
242
+ <meta charset="utf-8" />
243
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
244
+ <meta name="generator" content="Text.js ${VERSION} (${ENGINE_NAME})" />
245
+ <meta name="color-scheme" content="dark" />
246
+ <title>${escapeHtml(o.title)}</title>
247
+ <link rel="icon" href="${FAVICON}" />
248
+ <style>
249
+ html, body { margin: 0; min-height: 100%; background: #0a0a0a; color: #ededed; }
250
+ body { min-height: 100vh; display: flex; align-items: center; justify-content: center;
251
+ font-family: Geist, Inter, system-ui, -apple-system, "Segoe UI", sans-serif; -webkit-font-smoothing: antialiased; }
252
+ #__textjs { text-align: center; line-height: 1.6; padding: 24px; }
253
+ #__textjs .mark { font-size: 28px; margin: 0 0 8px; }
254
+ #__textjs .title { font-size: 18px; font-weight: 600; margin: 0; }
255
+ #__textjs .hint { color: #a1a1a1; margin: 8px 0 0; }
256
+ #__textjs kbd { font-family: "SF Mono", Menlo, Consolas, monospace; font-size: 12px; border: 1px solid #333; border-radius: 4px; padding: 1px 5px; color: #ededed; }
257
+ #__textjs .status { color: #666; font-size: 12px; margin: 16px 0 0; font-family: "SF Mono", Menlo, Consolas, monospace; }
258
+ </style>
259
+ </head>
260
+ <body>
261
+ <div id="__textjs" data-textjs-runtime="server">
262
+ <p class="mark">${BRAND_MARK}</p>
263
+ <p class="title">${escapeHtml(o.title)}</p>
264
+ <p class="hint">Open the console: <kbd>⌥⌘J</kbd> on macOS, <kbd>Ctrl+Shift+J</kbd> elsewhere. Then click here and type.</p>
265
+ <p class="status">Rendered on the server · <span data-textjs-status>connecting</span></p>
266
+ </div>
267
+ <noscript>${BRAND_MARK} Text.js apps render into console.log, which requires JavaScript.</noscript>
268
+ <script type="application/json" id="__textjs-live">${inlineJson(config)}</script>${o.shell ? `\n ${o.shell}` : ""}
269
+ <script type="module" src="${escapeHtml(o.playerSrc)}"></script>
270
+ </body>
271
+ </html>
272
+ `;
273
+ }
274
+ //# sourceMappingURL=live-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-routes.js","sourceRoot":"","sources":["../../src/server/live-routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,cAAc,EAAsB,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,gBAAgB,EAAqC,MAAM,QAAQ,CAAC;AAE9G,MAAM,CAAC,MAAM,YAAY,GAAG,qBAAqB,CAAC;AAClD,MAAM,CAAC,MAAM,cAAc,GAAG,uBAAuB,CAAC;AACtD,sDAAsD;AACtD,MAAM,CAAC,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAG5C;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,sBAAsB,CAAC;AACtD,MAAM,CAAC,MAAM,kBAAkB,GAAG,yBAAyB,CAAC;AAC5D,MAAM,CAAC,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AACxD,qGAAqG;AACrG,MAAM,CAAC,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;AACvD;;;;GAIG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,qBAAqB,CAAC;AACvD,MAAM,CAAC,MAAM,kBAAkB,GAAG,gCAAgC,CAAC;AACnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,oCAAoC,CAAC;AAG3E,IAAI,aAAa,GAAgC,IAAI,CAAC;AAEtD,kFAAkF;AAClF,SAAS,OAAO;IACd,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACrE,aAAa,GAAI,QAAQ,CAAC,SAAS,CAA6C,CAAC,aAAa,CAAC;IACjG,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,OAAO,GAA2B,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAO5J,SAAS,WAAW,CAAC,IAAa;IAChC,MAAM,CAAC,GAAG,IAAsB,CAAC;IACjC,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,KAAK,CAAC;IACxE,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB,IAAK,CAAC,CAAC,WAAyB,CAAC,MAAM,KAAK,CAAC;QAAE,OAAS,CAAC,CAAC,MAAoB,CAAC,CAAC,CAAC,EAAE,KAA6B,EAAE,MAAM,CAAC;IACzJ,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,IAAa;IAC/B,MAAM,CAAC,GAAG,IAAe,CAAC;IAC1B,OAAO,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAE,CAAC,CAAC,IAAe,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,YAAY,GAAG,IAAI,GAAG,EAAwD,CAAC;AAErF;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,KAAK,GAAG,CAAC;IACvD,IAAI,KAAa,CAAC;IAClB,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;QAC/B,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,KAAK;YAAE,OAAO,GAAG,CAAC,KAAK,CAAC;QACjD,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,KAAyB,CAAC;IAC9B,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;YACnD,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;YACtH,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAuB,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACrF,CAAC;QAAC,MAAM,CAAC;YACP,KAAK,GAAG,SAAS,CAAC;QACpB,CAAC;IACH,CAAC;IACD,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,wGAAwG;AACxG,SAAS,cAAc,CAAC,OAAgB,EAAE,IAAY,EAAE,IAAY,EAAE,KAAa;IACjF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAiB,CAAC;IACvC,MAAM,SAAS,GAAG,IAAI,GAAG,EAA8B,CAAC;IACxD,oFAAoF;IACpF,MAAM,OAAO,GAAG,IAAI,GAAG,EAA4C,CAAC;IACpE,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB;YAAE,SAAS;QAChD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAuB,EAAE,CAAC;YAChD,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB;gBAAE,OAAO,CAAC,GAAG,CAAE,IAAI,CAAC,KAAiB,CAAC,IAAc,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,MAAM,CAAW,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAW,EAAE,CAAC,CAAC;QACtL,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,MAAc,EAAE,IAAY,EAAsB,EAAE;QAClE,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QAC5D,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;QACtD,OAAO,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,CAAC,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAmB,CAAC;QAClG,IAAI,IAAI,EAAE,IAAI,KAAK,qBAAqB;YAAE,SAAS;QACnD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,YAAyB,EAAE,CAAC;YAC/C,MAAM,EAAE,GAAG,CAAC,CAAC,EAAa,CAAC;YAC3B,IAAI,EAAE,CAAC,IAAI,KAAK,YAAY;gBAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAc,EAAE,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC1H,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,IAAI,KAAK,wBAAwB;YAAE,SAAS;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,WAA6B,CAAC;QAChD,IAAI,IAAI,EAAE,IAAI,KAAK,qBAAqB,EAAE,CAAC;YACzC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,YAAyB;gBAAE,IAAK,CAAC,CAAC,EAAc,CAAC,IAAI,KAAK,YAAY,IAAK,CAAC,CAAC,EAAc,CAAC,IAAI,KAAK,IAAI;oBAAE,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3J,SAAS;QACX,CAAC;QACD,KAAK,MAAM,IAAI,IAAK,IAAI,CAAC,UAAoC,IAAI,EAAE,EAAE,CAAC;YACpE,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI;gBAAE,SAAS;YACjD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAW,CAAC;YAC/C,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACpC,OAAO,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY,EAAE,IAAY,EAAE,KAAa;IACvE,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC;QACnD,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;QAC5I,OAAO,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAuB,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,GAAW,EAAE,IAAY;IAChD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAChC,KAAK,MAAM,SAAS,IAAI,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1I,IAAI,CAAC;YACH,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE;gBAAE,OAAO,SAAS,CAAC;QACrD,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAwB;IAC1D,OAAO,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7D,CAAC;AASD,uCAAuC;AACvC,MAAM,UAAU,eAAe,CAAC,IAAa;IAC3C,OAAO,SAAS,CAAC,IAAI,CAAC;SACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;SACnF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAc,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,oBAAoB,CAAC,IAAa;IAChD,MAAM,QAAQ,GAAkB,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,OAAO,CAAC,QAAQ,EAAE,EAAE;QAClB,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAC;QACvC,MAAM,CAAC,GAAG,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC;QACvD,OAAO,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IACtE,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAa;IAC3C,MAAM,aAAa,GAAG,CAAC,CAAiB,EAAW,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC3J,MAAM,IAAI,GAAG,CAAC,CAAiB,EAAkB,EAAE;QACjD,MAAM,KAAK,GAA4B,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QAC1B,IAAI,IAAI,IAAI,mBAAmB,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,GAAG,GAAG,IAAI,GAAG,iBAAiB,EAAE,CAAC;QAClF,2GAA2G;QAC3G,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAU,EAAE,CAAC;gBACxE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACxB,IAAI,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,iBAAiB,EAAE,CAAC;YAClD,CAAC;QACH,CAAC;QACD,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;IACzD,CAAC,CAAC;IACF,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC5C,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,uBAAuB,CAAC,IAAa;IACnD,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC;4EACsC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;CAC1G,CAAC;AACF,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,OAAO,mCAAmC,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC;;CAE7E,CAAC;AACF,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAW,CAAC,CAAC;AAC/G,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AACpH,CAAC;AAED,MAAM,OAAO,GAAG,sBAAsB,kBAAkB,CACtD,kKAAkK,CACnK,EAAE,CAAC;AAWJ,yFAAyF;AACzF,MAAM,UAAU,cAAc,CAAC,CAAkB;IAC/C,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IACpF,OAAO;;;;;8CAKqC,OAAO,KAAK,WAAW;;aAExD,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;6BACH,OAAO;;;;;;;;;;;;;;;wBAeZ,UAAU;yBACT,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;;;;gBAI5B,UAAU;yDAC+B,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;iCACvF,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;;;CAGvD,CAAC;AACF,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Run a Node-style `(req, res)` handler (the live session server) inside a
3
+ * Web-standard `(Request) => Response` server such as `Bun.serve`: the
4
+ * response streams as soon as the handler flushes headers or writes, and the
5
+ * handler sees `close` when the client goes away.
6
+ */
7
+ import type { IncomingMessage, ServerResponse } from "node:http";
8
+ type NodeStyleHandler = (req: IncomingMessage, res: ServerResponse) => Promise<boolean> | boolean;
9
+ /**
10
+ * Call `handler` with Node-compatible request / response objects. Resolves to
11
+ * the response, or `null` when the handler declined the request (`false`)
12
+ * without writing anything.
13
+ */
14
+ export declare function runNodeStyle(request: Request, url: string, handler: NodeStyleHandler, remoteAddress?: string): Promise<Response | null>;
15
+ export {};
16
+ //# sourceMappingURL=live-web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-web.d.ts","sourceRoot":"","sources":["../../src/server/live-web.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAKjE,KAAK,gBAAgB,GAAG,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AA+IlG;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAQ7I"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Run a Node-style `(req, res)` handler (the live session server) inside a
3
+ * Web-standard `(Request) => Response` server such as `Bun.serve`: the
4
+ * response streams as soon as the handler flushes headers or writes, and the
5
+ * handler sees `close` when the client goes away.
6
+ */
7
+ import { EventEmitter } from "node:events";
8
+ /** Read by `readRequestBody()` (see `server/http.ts`). */
9
+ const WEB_REQUEST = Symbol.for("textjs.webRequest");
10
+ class RequestShim extends EventEmitter {
11
+ method;
12
+ url;
13
+ headers = {};
14
+ destroyed = false;
15
+ socket;
16
+ constructor(request, url, remoteAddress) {
17
+ super();
18
+ this.socket = { remoteAddress };
19
+ this.method = request.method.toUpperCase();
20
+ this.url = url;
21
+ request.headers.forEach((value, key) => {
22
+ this.headers[key] = value;
23
+ });
24
+ this[WEB_REQUEST] = request;
25
+ }
26
+ setEncoding() {
27
+ return this;
28
+ }
29
+ destroy() {
30
+ this.destroyed = true;
31
+ return this;
32
+ }
33
+ }
34
+ class ResponseShim extends EventEmitter {
35
+ statusCode = 200;
36
+ statusMessage = "";
37
+ headersSent = false;
38
+ writableEnded = false;
39
+ destroyed = false;
40
+ ready;
41
+ #headers = new Headers();
42
+ #controller = null;
43
+ #resolve;
44
+ #pendingDrain = false;
45
+ #encoder = new TextEncoder();
46
+ constructor(signal) {
47
+ super();
48
+ this.ready = new Promise((r) => {
49
+ this.#resolve = r;
50
+ });
51
+ signal.addEventListener("abort", () => this.#closed(), { once: true });
52
+ }
53
+ setHeader(name, value) {
54
+ this.#headers.delete(name);
55
+ for (const v of Array.isArray(value) ? value : [String(value)])
56
+ this.#headers.append(name, v);
57
+ return this;
58
+ }
59
+ getHeader(name) {
60
+ return this.#headers.get(name) ?? undefined;
61
+ }
62
+ hasHeader(name) {
63
+ return this.#headers.has(name);
64
+ }
65
+ removeHeader(name) {
66
+ this.#headers.delete(name);
67
+ }
68
+ flushHeaders() {
69
+ this.#start();
70
+ }
71
+ write(chunk) {
72
+ if (this.writableEnded || this.destroyed)
73
+ return false;
74
+ this.#start();
75
+ const controller = this.#controller;
76
+ if (!controller)
77
+ return false;
78
+ try {
79
+ controller.enqueue(typeof chunk === "string" ? this.#encoder.encode(chunk) : chunk);
80
+ }
81
+ catch {
82
+ this.#closed();
83
+ return false;
84
+ }
85
+ if ((controller.desiredSize ?? 1) > 0)
86
+ return true;
87
+ this.#pendingDrain = true;
88
+ return false;
89
+ }
90
+ end(chunk) {
91
+ if (this.writableEnded)
92
+ return this;
93
+ if (!this.headersSent) {
94
+ // Nothing streamed yet: answer with a complete body.
95
+ this.writableEnded = true;
96
+ this.headersSent = true;
97
+ const body = chunk === undefined ? null : typeof chunk === "string" ? chunk : chunk;
98
+ this.#resolve(new Response(this.#bodyless() ? null : body, { status: this.statusCode, headers: this.#headers }));
99
+ queueMicrotask(() => this.#closed());
100
+ return this;
101
+ }
102
+ if (chunk !== undefined)
103
+ this.write(chunk);
104
+ this.writableEnded = true;
105
+ try {
106
+ this.#controller?.close();
107
+ }
108
+ catch {
109
+ // already closed by the client
110
+ }
111
+ queueMicrotask(() => this.#closed());
112
+ return this;
113
+ }
114
+ #bodyless() {
115
+ return this.statusCode === 204 || this.statusCode === 304;
116
+ }
117
+ #start() {
118
+ if (this.headersSent)
119
+ return;
120
+ this.headersSent = true;
121
+ const stream = new ReadableStream({
122
+ start: (controller) => {
123
+ this.#controller = controller;
124
+ },
125
+ pull: () => {
126
+ if (!this.#pendingDrain)
127
+ return;
128
+ this.#pendingDrain = false;
129
+ this.emit("drain");
130
+ },
131
+ cancel: () => this.#closed(),
132
+ }, { highWaterMark: 64 * 1024, size: (chunk) => chunk?.byteLength ?? 0 });
133
+ this.#resolve(new Response(stream, { status: this.statusCode, headers: this.#headers }));
134
+ }
135
+ #closed() {
136
+ if (this.destroyed)
137
+ return;
138
+ this.destroyed = true;
139
+ this.writableEnded = true;
140
+ this.emit("close");
141
+ }
142
+ }
143
+ /**
144
+ * Call `handler` with Node-compatible request / response objects. Resolves to
145
+ * the response, or `null` when the handler declined the request (`false`)
146
+ * without writing anything.
147
+ */
148
+ export async function runNodeStyle(request, url, handler, remoteAddress) {
149
+ const req = new RequestShim(request, url, remoteAddress);
150
+ const res = new ResponseShim(request.signal);
151
+ const handled = Promise.resolve(handler(req, res));
152
+ const first = await Promise.race([res.ready.then((r) => ({ response: r })), handled.then((ok) => ({ ok }))]);
153
+ if ("response" in first)
154
+ return first.response;
155
+ if (!first.ok && !res.headersSent)
156
+ return null;
157
+ return res.ready;
158
+ }
159
+ //# sourceMappingURL=live-web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-web.js","sourceRoot":"","sources":["../../src/server/live-web.ts"],"names":[],"mappings":"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"}