@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,183 @@
1
+ import { createReadStream, existsSync, readFileSync, statSync } from "node:fs";
2
+ import { createServer } from "node:http";
3
+ import { extname, join, normalize, resolve, sep } from "node:path";
4
+ import { pathToFileURL } from "node:url";
5
+ import { BRAND_MARK, txError, txMessage } from "@textjs/core";
6
+ import { normalizeBasePath } from "../config.js";
7
+ import { matchApiRoute } from "../server/scan.js";
8
+ import { loadLiveProduction } from "../server/live-prod.js";
9
+ import { applyRewrites, compileRewrite, isAllowedHost, isValidHostHeader, normalizeRequestTarget, proxyRequest, requestOrigin, sendWebResponse, toWebRequest } from "../server/http.js";
10
+ import { loadServerRuntime } from "../server/adapters/runtime-node.js";
11
+ import { runRouteHandlerWithCache } from "../server/cache-route.js";
12
+ import { runNodeMiddleware } from "../server/middleware-node.js";
13
+ import { META_DIR } from "./build.js";
14
+ import { loadTextConfig } from "./config.js";
15
+ import { banner, color, fail, ok } from "./ui.js";
16
+ const MIME = {
17
+ ".html": "text/html; charset=utf-8",
18
+ ".js": "text/javascript; charset=utf-8",
19
+ ".mjs": "text/javascript; charset=utf-8",
20
+ ".css": "text/css; charset=utf-8",
21
+ ".json": "application/json; charset=utf-8",
22
+ ".svg": "image/svg+xml",
23
+ ".png": "image/png",
24
+ ".jpg": "image/jpeg",
25
+ ".ico": "image/x-icon",
26
+ ".wasm": "application/wasm",
27
+ ".txt": "text/plain; charset=utf-8",
28
+ ".woff2": "font/woff2",
29
+ ".map": "application/json; charset=utf-8",
30
+ };
31
+ export async function startProductionServer(opts) {
32
+ const started = performance.now();
33
+ const log = opts.log ?? true;
34
+ const { config } = await loadTextConfig(opts.root, "serve", "production");
35
+ const outDir = resolve(opts.root, config.outDir ?? "dist");
36
+ const indexFile = join(outDir, "index.html");
37
+ if (!existsSync(indexFile)) {
38
+ throw txError("TX017", config.outDir ?? "dist");
39
+ }
40
+ const basePath = normalizeBasePath(config.basePath);
41
+ const rewrites = (typeof config.rewrites === "function" ? await config.rewrites() : (config.rewrites ?? [])).map(compileRewrite);
42
+ const proxies = Object.entries(config.proxy ?? {}).map(([prefix, v]) => [prefix, typeof v === "string" ? { target: v } : v]);
43
+ const apiFile = join(outDir, META_DIR, "server", "api.mjs");
44
+ const api = existsSync(apiFile) ? (await import(pathToFileURL(apiFile).href)) : null;
45
+ const indexHtml = readFileSync(indexFile);
46
+ // `middleware.ts` and `cacheHandler` (bundled by `text build`).
47
+ const runtime = await loadServerRuntime(outDir);
48
+ // Prerendered console shells (PPR) and server-rendered routes (`runtime = "server"`).
49
+ const live = await loadLiveProduction(outDir, {
50
+ log: log ? (m) => console.log(color.gray(m)) : undefined,
51
+ onError: (e) => console.error(fail(e instanceof Error ? (e.stack ?? e.message) : String(e))),
52
+ middleware: runtime?.middleware,
53
+ trustProxy: config.server?.trustProxy ?? process.env.TRUST_PROXY === "1",
54
+ origin: config.server?.origin ?? process.env.TEXTJS_ORIGIN,
55
+ });
56
+ const port = opts.port ?? 3000;
57
+ // Loopback only unless `--host` is passed explicitly.
58
+ const host = opts.host ?? "127.0.0.1";
59
+ const loopback = host === "127.0.0.1" || host === "localhost" || host === "::1" || host === "[::1]";
60
+ const originOptions = {
61
+ origin: config.server?.origin ?? process.env.TEXTJS_ORIGIN,
62
+ trustProxy: config.server?.trustProxy ?? process.env.TRUST_PROXY === "1",
63
+ };
64
+ // DNS rebinding: a loopback-bound server only answers loopback / IP / allowed host names.
65
+ const allowedHosts = config.server?.allowedHosts ?? [];
66
+ const notFound = (res) => {
67
+ res.statusCode = 404;
68
+ res.setHeader("Content-Type", "text/plain; charset=utf-8");
69
+ res.end("404 | This page could not be found.");
70
+ };
71
+ const server = createServer((req, res) => {
72
+ const t0 = performance.now();
73
+ const done = () => {
74
+ if (log)
75
+ console.log(color.gray(` ${req.method} ${(req.url ?? "/").split("?")[0]} ${res.statusCode} in ${Math.round(performance.now() - t0)}ms`));
76
+ };
77
+ void (async () => {
78
+ if (loopback ? !isAllowedHost(req.headers.host, allowedHosts) : !isValidHostHeader(req.headers.host)) {
79
+ res.statusCode = loopback ? 403 : 400;
80
+ res.setHeader("Content-Type", "text/plain; charset=utf-8");
81
+ res.end(loopback ? `${BRAND_MARK} ${txMessage("TX028", JSON.stringify((req.headers.host ?? "").replace(/:\d+$/, "")), "server.allowedHosts")}` : "400 | Bad Request");
82
+ return;
83
+ }
84
+ req.url = normalizeRequestTarget(req.url);
85
+ const origin = requestOrigin(req, originOptions);
86
+ let url = req.url;
87
+ if (basePath) {
88
+ if (url === basePath || url.startsWith(`${basePath}/`) || url.startsWith(`${basePath}?`))
89
+ url = url.slice(basePath.length) || "/";
90
+ else
91
+ return notFound(res);
92
+ }
93
+ if (runtime?.middleware) {
94
+ const next = await runNodeMiddleware(runtime.middleware, req, res, { basePath, origin });
95
+ if (next === null)
96
+ return;
97
+ url = next;
98
+ }
99
+ const rewritten = rewrites.length > 0 ? applyRewrites(rewrites, url) : null;
100
+ if (rewritten) {
101
+ if (/^[a-z]+:\/\//i.test(rewritten))
102
+ return proxyRequest(req, res, rewritten, origin);
103
+ url = rewritten;
104
+ }
105
+ for (const [prefix, target] of proxies) {
106
+ if (url.startsWith(prefix)) {
107
+ const path = target.rewrite ? target.rewrite(url) : url;
108
+ return proxyRequest(req, res, new URL(path, target.target).href, origin);
109
+ }
110
+ }
111
+ if (live && (await live.handle(req, res, url)))
112
+ return;
113
+ let pathname;
114
+ try {
115
+ pathname = decodeURIComponent(url.split("?")[0] ?? "/");
116
+ }
117
+ catch {
118
+ res.statusCode = 400;
119
+ return res.end("400 | Bad Request");
120
+ }
121
+ if (api) {
122
+ const m = matchApiRoute(api.manifest, pathname);
123
+ const mod = m ? api.handlers[m.file] : undefined;
124
+ if (m && mod) {
125
+ const request = toWebRequest(Object.assign(req, { url }), origin, res);
126
+ return sendWebResponse(res, await runRouteHandlerWithCache(mod, request, { params: m.params, pattern: m.pattern, pathname }), request.method);
127
+ }
128
+ }
129
+ if (req.method !== "GET" && req.method !== "HEAD") {
130
+ res.statusCode = 405;
131
+ return res.end();
132
+ }
133
+ const filePath = normalize(join(outDir, pathname));
134
+ const inside = filePath === outDir || filePath.startsWith(outDir + sep);
135
+ const hidden = pathname.split(/[/\\]/).some((p) => p.startsWith(".") && p.length > 1);
136
+ if (inside && !hidden && existsSync(filePath) && statSync(filePath).isFile()) {
137
+ res.statusCode = 200;
138
+ res.setHeader("Content-Type", MIME[extname(filePath)] ?? "application/octet-stream");
139
+ res.setHeader("Cache-Control", pathname.startsWith("/assets/") ? "public, max-age=31536000, immutable" : "public, max-age=0, must-revalidate");
140
+ if (req.method === "HEAD")
141
+ return res.end();
142
+ createReadStream(filePath).pipe(res);
143
+ return;
144
+ }
145
+ const last = pathname.split("/").pop() ?? "";
146
+ if (last.includes(".") || hidden)
147
+ return notFound(res);
148
+ res.statusCode = 200;
149
+ res.setHeader("Content-Type", MIME[".html"]);
150
+ res.setHeader("Cache-Control", "public, max-age=0, must-revalidate");
151
+ res.end(req.method === "HEAD" ? undefined : indexHtml);
152
+ })()
153
+ .catch((error) => {
154
+ if (log)
155
+ console.error(fail(error instanceof Error ? (error.stack ?? error.message) : String(error)));
156
+ if (!res.headersSent)
157
+ res.statusCode = 500;
158
+ res.end();
159
+ })
160
+ .finally(done);
161
+ });
162
+ await new Promise((resolveListen, reject) => {
163
+ server.once("error", reject);
164
+ server.listen(port, host, () => resolveListen());
165
+ });
166
+ const addr = server.address();
167
+ const url = `http://${host === "0.0.0.0" || host === "127.0.0.1" ? "localhost" : host}:${addr.port}${basePath}`;
168
+ if (log) {
169
+ console.log(`\n${banner([["Local", color.cyan(url)]])}\n`);
170
+ console.log(ok("Starting..."));
171
+ console.log(ok(`Ready in ${Math.round(performance.now() - started)}ms`));
172
+ console.log("");
173
+ }
174
+ return {
175
+ server,
176
+ url,
177
+ close: () => new Promise((r) => {
178
+ live?.close();
179
+ server.close(() => r());
180
+ }),
181
+ };
182
+ }
183
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/cli/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { FlatRoute } from "../routing.js";
2
+ export declare const color: {
3
+ bold: (s: string) => string;
4
+ dim: (s: string) => string;
5
+ red: (s: string) => string;
6
+ green: (s: string) => string;
7
+ yellow: (s: string) => string;
8
+ cyan: (s: string) => string;
9
+ magenta: (s: string) => string;
10
+ gray: (s: string) => string;
11
+ };
12
+ export declare function stripAnsi(s: string): string;
13
+ export declare function brand(): string;
14
+ export declare function banner(lines: Array<[string, string]>): string;
15
+ export declare const ok: (msg: string) => string;
16
+ export declare const fail: (msg: string) => string;
17
+ export declare const info: (msg: string) => string;
18
+ export interface SummaryRoute {
19
+ pattern: string;
20
+ dynamic: boolean;
21
+ target: string;
22
+ /** `export const runtime = "server"`. */
23
+ server?: boolean;
24
+ }
25
+ /** The Next.js-style route summary table printed by `text build`. */
26
+ export declare function routeTable(routes: readonly SummaryRoute[]): string;
27
+ export declare const LEGEND: string;
28
+ /** Appended to {@link LEGEND} when the app has server-rendered routes. */
29
+ export declare const SERVER_LEGEND = "\u25C7 (Server) rendered on the server, streamed as frames";
30
+ export declare function summarize(pages: readonly FlatRoute[], api: ReadonlyArray<{
31
+ pattern: string;
32
+ }>, serverPatterns?: ReadonlySet<string>): SummaryRoute[];
33
+ export declare function formatBytes(n: number): string;
34
+ export declare function devtoolsHint(): string;
35
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/cli/ui.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAc5C,eAAO,MAAM,KAAK;cAHZ,MAAM,KAAG,MAAM;aAAf,MAAM,KAAG,MAAM;aAAf,MAAM,KAAG,MAAM;eAAf,MAAM,KAAG,MAAM;gBAAf,MAAM,KAAG,MAAM;cAAf,MAAM,KAAG,MAAM;iBAAf,MAAM,KAAG,MAAM;cAAf,MAAM,KAAG,MAAM;CAYpB,CAAC;AAEF,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAI7D;AAED,eAAO,MAAM,EAAE,GAAI,KAAK,MAAM,KAAG,MAAuC,CAAC;AACzE,eAAO,MAAM,IAAI,GAAI,KAAK,MAAM,KAAG,MAAqC,CAAC;AACzE,eAAO,MAAM,IAAI,GAAI,KAAK,MAAM,KAAG,MAAsC,CAAC;AAE1E,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAKD,qEAAqE;AACrE,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAUlE;AAED,eAAO,MAAM,MAAM,QAAqH,CAAC;AACzI,0EAA0E;AAC1E,eAAO,MAAM,aAAa,kEAA6D,CAAC;AAExF,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,EAAE,GAAG,EAAE,aAAa,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,cAAc,GAAE,WAAW,CAAC,MAAM,CAAa,GAAG,YAAY,EAAE,CAU/J;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,wBAAgB,YAAY,IAAI,MAAM,CAGrC"}
package/dist/cli/ui.js ADDED
@@ -0,0 +1,73 @@
1
+ import { BRAND_MARK, ENGINE_NAME, VERSION } from "@textjs/core";
2
+ const enabled = () => {
3
+ if (typeof process === "undefined")
4
+ return false;
5
+ if (process.env.NO_COLOR !== undefined && process.env.NO_COLOR !== "")
6
+ return false;
7
+ if (process.env.FORCE_COLOR !== undefined && process.env.FORCE_COLOR !== "0")
8
+ return true;
9
+ return Boolean(process.stdout && process.stdout.isTTY);
10
+ };
11
+ const wrap = (open, close) => (s) => enabled() ? `\x1b[${open}m${s}\x1b[${close}m` : s;
12
+ export const color = {
13
+ bold: wrap(1, 22),
14
+ dim: wrap(2, 22),
15
+ red: wrap(31, 39),
16
+ green: wrap(32, 39),
17
+ yellow: wrap(33, 39),
18
+ cyan: wrap(36, 39),
19
+ magenta: wrap(35, 39),
20
+ gray: wrap(90, 39),
21
+ };
22
+ export function stripAnsi(s) {
23
+ return s.replace(/\x1b\[[0-9;]*m/g, "");
24
+ }
25
+ export function brand() {
26
+ return `${color.bold(`${BRAND_MARK} Text.js ${VERSION}`)} ${color.dim(`(${ENGINE_NAME})`)}`;
27
+ }
28
+ export function banner(lines) {
29
+ const out = [` ${brand()}`];
30
+ for (const [k, v] of lines)
31
+ out.push(` - ${`${k}:`.padEnd(14)}${v}`);
32
+ return out.join("\n");
33
+ }
34
+ export const ok = (msg) => ` ${color.green("✓")} ${msg}`;
35
+ export const fail = (msg) => ` ${color.red("⨯")} ${msg}`;
36
+ export const info = (msg) => ` ${color.gray("○")} ${msg}`;
37
+ const ROUTE_COL = 37;
38
+ const TYPE_COL = 11;
39
+ /** The Next.js-style route summary table printed by `text build`. */
40
+ export function routeTable(routes) {
41
+ const lines = [`${color.bold("Route (app)".padEnd(ROUTE_COL + 4))}${color.bold("Type".padEnd(TYPE_COL))}${color.bold("Target")}`];
42
+ routes.forEach((r, i) => {
43
+ const corner = routes.length === 1 ? "─" : i === 0 ? "┌" : i === routes.length - 1 ? "└" : "├";
44
+ const sym = r.server ? "◇" : r.dynamic ? "ƒ" : "○";
45
+ const pattern = r.pattern.length > ROUTE_COL - 1 ? `${r.pattern.slice(0, ROUTE_COL - 2)}…` : r.pattern;
46
+ const type = r.server ? "Server" : r.dynamic ? "Dynamic" : "Static";
47
+ lines.push(`${color.gray(corner)} ${sym} ${pattern.padEnd(ROUTE_COL)}${type.padEnd(TYPE_COL)}${color.gray(r.target)}`);
48
+ });
49
+ return lines.join("\n");
50
+ }
51
+ export const LEGEND = ["○ (Static) prerendered as static console cells", "ƒ (Dynamic) on-demand console reconciliation"].join("\n");
52
+ /** Appended to {@link LEGEND} when the app has server-rendered routes. */
53
+ export const SERVER_LEGEND = "◇ (Server) rendered on the server, streamed as frames";
54
+ export function summarize(pages, api, serverPatterns = new Set()) {
55
+ const out = pages.map((p) => serverPatterns.has(p.pattern) ? { pattern: p.pattern, dynamic: true, server: true, target: "frame player (SSE)" } : { pattern: p.pattern, dynamic: p.dynamic, target: "console.log (%c)" });
56
+ if (!out.some((r) => r.pattern === "/_not-found")) {
57
+ const nf = { pattern: "/_not-found", dynamic: false, target: "console.log (%c)" };
58
+ out.splice(out[0]?.pattern === "/" ? 1 : 0, 0, nf);
59
+ }
60
+ for (const a of api)
61
+ out.push({ pattern: a.pattern, dynamic: true, target: "Route Handler" });
62
+ return out;
63
+ }
64
+ export function formatBytes(n) {
65
+ if (n < 1000)
66
+ return `${n} B`;
67
+ return `${(n / 1000).toFixed(1)} kB`;
68
+ }
69
+ export function devtoolsHint() {
70
+ const keys = process.platform === "darwin" ? "⌘⌥J" : "Ctrl+Shift+J";
71
+ return info(`Open DevTools Console (${keys}) to view your app`);
72
+ }
73
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/cli/ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * `@textjs/app/client` — browser bootstrap used by the virtual entry that `text dev`
3
+ * and `text build` generate: mounts the console root, the App Router, the
4
+ * Dev Overlay and the DOM `<FocusPad>`.
5
+ */
6
+ import { type ConsoleRoot } from "@textjs/react";
7
+ import { type ClientConfig } from "./config.js";
8
+ import { type HotContextLike } from "./devtools.js";
9
+ import { type RouterHistory } from "./history.js";
10
+ import type { RouteManifest } from "./routing.js";
11
+ export interface BootOptions {
12
+ routes: RouteManifest;
13
+ config?: Partial<ClientConfig>;
14
+ /** `import.meta.env.DEV`. */
15
+ dev?: boolean;
16
+ /** `import.meta.hot`. */
17
+ hot?: HotContextLike;
18
+ /** Element (or id) for the DOM `<FocusPad>` (default `#__textjs`, created when missing). */
19
+ container?: HTMLElement | string;
20
+ }
21
+ export interface TextApp {
22
+ root: ConsoleRoot;
23
+ history: RouterHistory;
24
+ /** Swap the route manifest (HMR when route files change). */
25
+ updateRoutes(routes: RouteManifest): void;
26
+ }
27
+ declare global {
28
+ interface Window {
29
+ __TEXTJS_APP__?: TextApp;
30
+ }
31
+ }
32
+ /** Boot a Text.js app into `console.log`. */
33
+ export declare function bootTextApp(options: BootOptions): Promise<TextApp>;
34
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAEpE,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAyE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAExH,OAAO,EAAwB,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAGrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC/B,6BAA6B;IAC7B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,yBAAyB;IACzB,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,4FAA4F;IAC5F,SAAS,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,aAAa,CAAC;IACvB,6DAA6D;IAC7D,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;CAC3C;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B;CACF;AAcD,6CAA6C;AAC7C,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAkExE"}
package/dist/client.js ADDED
@@ -0,0 +1,93 @@
1
+ /**
2
+ * `@textjs/app/client` — browser bootstrap used by the virtual entry that `text dev`
3
+ * and `text build` generate: mounts the console root, the App Router, the
4
+ * Dev Overlay and the DOM `<FocusPad>`.
5
+ */
6
+ import { createElement } from "react";
7
+ import { createRoot } from "react-dom/client";
8
+ import { createConsoleRoot } from "@textjs/react";
9
+ import { FocusPad } from "@textjs/react/dom";
10
+ import { toClientConfig } from "./config.js";
11
+ import { connectViteHmr, devErrors, installGlobalErrorHandlers, TextDevOverlay } from "./devtools.js";
12
+ import { connectFrameMirror } from "./frame-mirror.js";
13
+ import { createBrowserHistory } from "./history.js";
14
+ import { isNavigationError } from "./navigation-errors.js";
15
+ import { AppRouter } from "./router.js";
16
+ function resolveContainer(container) {
17
+ if (container instanceof HTMLElement)
18
+ return container;
19
+ const id = typeof container === "string" ? container : "__textjs";
20
+ let el = document.getElementById(id);
21
+ if (!el) {
22
+ el = document.createElement("div");
23
+ el.id = id;
24
+ document.body.appendChild(el);
25
+ }
26
+ return el;
27
+ }
28
+ /** Boot a Text.js app into `console.log`. */
29
+ export async function bootTextApp(options) {
30
+ const config = { ...toClientConfig({}), ...options.config };
31
+ const dev = options.dev ?? false;
32
+ const vp = config.viewport ?? {};
33
+ const seen = new WeakSet();
34
+ const root = await createConsoleRoot({
35
+ // Follows the docked DevTools console by default; width × height is the
36
+ // size used when it can't be measured (undocked DevTools) or when `responsive: false`.
37
+ width: vp.width ?? 120,
38
+ height: vp.height ?? 36,
39
+ responsive: vp.responsive ?? true,
40
+ theme: vp.theme,
41
+ // A prerendered shell (PPR) already cleared the console: append below it.
42
+ initialClear: typeof window === "undefined" || window.__TEXTJS_SHELL__ !== 1,
43
+ // …and its clear opened DevTools' post-clear pacing window.
44
+ previousFrameAt: typeof window === "undefined" ? undefined : window.__TEXTJS_SHELL_AT__,
45
+ onCaughtError: (error) => {
46
+ if (isNavigationError(error))
47
+ return;
48
+ if (typeof error === "object" && error !== null) {
49
+ if (seen.has(error))
50
+ return;
51
+ seen.add(error);
52
+ }
53
+ console.error(error);
54
+ },
55
+ });
56
+ const history = createBrowserHistory({ basePath: config.basePath });
57
+ const render = (routes) => {
58
+ root.render(createElement(AppRouter, {
59
+ routes,
60
+ history,
61
+ theme: vp.theme,
62
+ defaultTitle: config.title || undefined,
63
+ errorStore: dev ? devErrors : null,
64
+ devOverlay: dev && config.devIndicators ? createElement(TextDevOverlay) : null,
65
+ }));
66
+ };
67
+ render(options.routes);
68
+ if (typeof document !== "undefined") {
69
+ if (!document.title && config.title)
70
+ document.title = config.title;
71
+ const el = resolveContainer(options.container);
72
+ createRoot(el).render(createElement(FocusPad, {
73
+ root,
74
+ title: config.title || undefined,
75
+ hints: config.hints,
76
+ action: config.action,
77
+ showMirrorDefault: config.showMirrorDefault,
78
+ style: { width: "min(960px, calc(100vw - 48px))", minHeight: "min(640px, calc(100vh - 48px))", boxSizing: "border-box" },
79
+ }));
80
+ }
81
+ if (dev) {
82
+ if (options.hot)
83
+ connectViteHmr(options.hot);
84
+ if (options.hot && typeof options.hot.send === "function")
85
+ connectFrameMirror(root, options.hot, history);
86
+ installGlobalErrorHandlers();
87
+ }
88
+ const app = { root, history, updateRoutes: render };
89
+ if (typeof window !== "undefined")
90
+ window.__TEXTJS_APP__ = app;
91
+ return app;
92
+ }
93
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * `text.config.ts` and route `metadata` types.
3
+ *
4
+ * This module is imported by browser code, so Vite / Node types are referenced
5
+ * structurally and never imported at runtime.
6
+ */
7
+ import type { ThemeName } from "@textjs/react";
8
+ export interface ViewportConfig {
9
+ /** Grid width in cells when fixed, or when docked DevTools can't be measured (default `120`). */
10
+ width?: number;
11
+ /** Grid height in cells when fixed, or when docked DevTools can't be measured (default `36`). */
12
+ height?: number;
13
+ /** Follow the docked DevTools console size (default `true`); `false` pins `width × height`. */
14
+ responsive?: boolean;
15
+ /** Initial theme preset (default `"geistDark"`). */
16
+ theme?: ThemeName;
17
+ }
18
+ export interface Rewrite {
19
+ /** Path pattern: `/docs/:slug`, `/blog/:path*`. */
20
+ source: string;
21
+ /** Internal path or absolute URL (proxied). */
22
+ destination: string;
23
+ }
24
+ export interface ProxyTarget {
25
+ target: string;
26
+ changeOrigin?: boolean;
27
+ ws?: boolean;
28
+ rewrite?: (path: string) => string;
29
+ secure?: boolean;
30
+ headers?: Record<string, string>;
31
+ }
32
+ /** The subset of Vite's dev server the `configureServer` hook relies on. */
33
+ export interface TextDevServer {
34
+ middlewares: {
35
+ use(...args: unknown[]): unknown;
36
+ };
37
+ config: {
38
+ root: string;
39
+ server: {
40
+ port?: number;
41
+ };
42
+ };
43
+ [key: string]: unknown;
44
+ }
45
+ export interface TextConfig {
46
+ /** Console grid defaults. */
47
+ viewport?: ViewportConfig;
48
+ /** Mount the in-console Dev Overlay (the `[▼]` pill, its inspector and the Redbox) in development (default `true`). */
49
+ devIndicators?: boolean;
50
+ /** Open the FocusPad's inline console preview by default (default `false`). */
51
+ showMirrorDefault?: boolean;
52
+ /** Build output directory (default `"dist"`). */
53
+ outDir?: string;
54
+ /** App Router directory relative to the project root (default `"app"`). */
55
+ appDir?: string;
56
+ /** Mount the app under a sub-path, e.g. `"/console"`. */
57
+ basePath?: string;
58
+ /** Title shown in the FocusPad and as the default `document.title`. */
59
+ title?: string;
60
+ /** The two or three keys worth pressing, shown on the page's FocusPad, e.g. `[{ keys: "↑ ↓", label: "count" }]`. */
61
+ hints?: Array<{
62
+ keys: string;
63
+ label: string;
64
+ }>;
65
+ /** What to do first, shown as "Then click here and …" (default: `press <first hint>`). */
66
+ action?: string;
67
+ /** Dev / start server proxy rules, keyed by path prefix. */
68
+ proxy?: Record<string, string | ProxyTarget>;
69
+ /** Rewrites applied before routing. External destinations are proxied. */
70
+ rewrites?: Rewrite[] | (() => Rewrite[] | Promise<Rewrite[]>);
71
+ /** Extend the Vite dev server (custom middleware, local service discovery, …). */
72
+ configureServer?: (server: TextDevServer) => void | (() => void) | Promise<void | (() => void)>;
73
+ /** Module (relative to the root) default-exporting a `CacheStore` for `@textjs/app/cache`. */
74
+ cacheHandler?: string;
75
+ /** Escape hatch merged into the generated Vite config. */
76
+ vite?: Record<string, unknown>;
77
+ /**
78
+ * Partial Prerendering: `text build` renders each static route's first frame
79
+ * (with `<Suspense>` fallbacks for dynamic holes) into its HTML so the console
80
+ * paints before JavaScript loads (default `true`).
81
+ */
82
+ ppr?: boolean;
83
+ /** Server-rendered routes (`export const runtime = "server"`). */
84
+ live?: LiveConfig;
85
+ /** `text start` request handling: public origin, reverse proxies and allowed hosts. */
86
+ server?: ServerConfig;
87
+ }
88
+ export interface ServerConfig {
89
+ /**
90
+ * The public origin (`https://console.example.com`). When set, `request.url`
91
+ * always uses it instead of the `Host` header. Also `TEXTJS_ORIGIN`.
92
+ */
93
+ origin?: string;
94
+ /**
95
+ * Trust `X-Forwarded-Host` / `X-Forwarded-Proto` from a reverse proxy in
96
+ * front of `text start` (default `false`; also `TRUST_PROXY=1`).
97
+ */
98
+ trustProxy?: boolean;
99
+ /**
100
+ * Extra `Host` names `text start` answers when bound to loopback (default:
101
+ * `localhost`, `*.localhost` and IP addresses). `true` disables the check.
102
+ * A leading `.` allows subdomains.
103
+ */
104
+ allowedHosts?: string[] | true;
105
+ }
106
+ export interface LiveConfig {
107
+ /** Concurrent sessions per server process (default `256`). */
108
+ maxSessions?: number;
109
+ /** How long a disconnected tab's session waits to be resumed, in ms (default `30000`). */
110
+ reconnectGraceMs?: number;
111
+ }
112
+ /** Type-safe `text.config.ts` helper. */
113
+ export declare function defineConfig(config: TextConfig): TextConfig;
114
+ export interface MetadataTitleTemplate {
115
+ default: string;
116
+ template?: string;
117
+ absolute?: string;
118
+ }
119
+ export interface Metadata {
120
+ title?: string | MetadataTitleTemplate | {
121
+ absolute: string;
122
+ default?: string;
123
+ template?: string;
124
+ };
125
+ description?: string;
126
+ [key: string]: unknown;
127
+ }
128
+ /** Client-safe configuration serialized into the browser bundle. */
129
+ export interface ClientConfig {
130
+ viewport: ViewportConfig;
131
+ devIndicators: boolean;
132
+ showMirrorDefault: boolean;
133
+ basePath: string;
134
+ title: string;
135
+ hints?: Array<{
136
+ keys: string;
137
+ label: string;
138
+ }>;
139
+ action?: string;
140
+ }
141
+ export declare function toClientConfig(config: TextConfig): ClientConfig;
142
+ export declare function normalizeBasePath(basePath: string | undefined): string;
143
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/config.js ADDED
@@ -0,0 +1,28 @@
1
+ /**
2
+ * `text.config.ts` and route `metadata` types.
3
+ *
4
+ * This module is imported by browser code, so Vite / Node types are referenced
5
+ * structurally and never imported at runtime.
6
+ */
7
+ /** Type-safe `text.config.ts` helper. */
8
+ export function defineConfig(config) {
9
+ return config;
10
+ }
11
+ export function toClientConfig(config) {
12
+ return {
13
+ viewport: { ...config.viewport },
14
+ devIndicators: config.devIndicators ?? true,
15
+ showMirrorDefault: config.showMirrorDefault ?? false,
16
+ basePath: normalizeBasePath(config.basePath),
17
+ title: config.title ?? "",
18
+ ...(config.hints ? { hints: config.hints.map((h) => ({ keys: h.keys, label: h.label })) } : {}),
19
+ ...(config.action ? { action: config.action } : {}),
20
+ };
21
+ }
22
+ export function normalizeBasePath(basePath) {
23
+ if (!basePath || basePath === "/")
24
+ return "";
25
+ const withSlash = basePath.startsWith("/") ? basePath : `/${basePath}`;
26
+ return withSlash.replace(/\/+$/, "");
27
+ }
28
+ //# sourceMappingURL=config.js.map