gorsee 0.2.3 → 0.2.5

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 (532) hide show
  1. package/README.md +261 -213
  2. package/dist-pkg/ai/artifact-lifecycle.d.ts +25 -0
  3. package/dist-pkg/ai/artifact-lifecycle.js +98 -0
  4. package/dist-pkg/ai/bridge.d.ts +26 -0
  5. package/dist-pkg/ai/bridge.js +82 -0
  6. package/dist-pkg/ai/bundle.d.ts +46 -0
  7. package/dist-pkg/ai/bundle.js +247 -0
  8. package/dist-pkg/ai/contracts.d.ts +1 -0
  9. package/dist-pkg/ai/contracts.js +1 -0
  10. package/dist-pkg/ai/ide.d.ts +37 -0
  11. package/dist-pkg/ai/ide.js +56 -0
  12. package/dist-pkg/ai/index.d.ts +85 -0
  13. package/dist-pkg/ai/index.js +267 -0
  14. package/dist-pkg/ai/json.d.ts +6 -0
  15. package/dist-pkg/ai/json.js +14 -0
  16. package/dist-pkg/ai/mcp.d.ts +28 -0
  17. package/dist-pkg/ai/mcp.js +152 -0
  18. package/dist-pkg/ai/session-pack.d.ts +28 -0
  19. package/dist-pkg/ai/session-pack.js +57 -0
  20. package/dist-pkg/ai/store.d.ts +67 -0
  21. package/dist-pkg/ai/store.js +174 -0
  22. package/dist-pkg/ai/summary.d.ts +57 -0
  23. package/dist-pkg/ai/summary.js +148 -0
  24. package/dist-pkg/ai/watch.d.ts +15 -0
  25. package/dist-pkg/ai/watch.js +66 -0
  26. package/dist-pkg/auth/action-tokens.d.ts +50 -0
  27. package/dist-pkg/auth/action-tokens.js +79 -0
  28. package/dist-pkg/auth/index.d.ts +70 -0
  29. package/dist-pkg/auth/index.js +199 -0
  30. package/dist-pkg/auth/redis-session-store.d.ts +7 -0
  31. package/dist-pkg/auth/redis-session-store.js +42 -0
  32. package/dist-pkg/auth/signing.d.ts +4 -0
  33. package/dist-pkg/auth/signing.js +33 -0
  34. package/dist-pkg/auth/sqlite-session-store.d.ts +12 -0
  35. package/dist-pkg/auth/sqlite-session-store.js +83 -0
  36. package/dist-pkg/auth/store-utils.d.ts +2 -0
  37. package/dist-pkg/auth/store-utils.js +20 -0
  38. package/dist-pkg/bin/gorsee.js +2 -0
  39. package/dist-pkg/build/backends/experimental-rolldown.d.ts +6 -0
  40. package/dist-pkg/build/backends/experimental-rolldown.js +9 -0
  41. package/dist-pkg/build/backends/register.d.ts +7 -0
  42. package/dist-pkg/build/backends/register.js +24 -0
  43. package/dist-pkg/build/backends/rolldown.d.ts +16 -0
  44. package/dist-pkg/build/backends/rolldown.js +176 -0
  45. package/dist-pkg/build/client-backend.d.ts +31 -0
  46. package/dist-pkg/build/client-backend.js +97 -0
  47. package/dist-pkg/build/client.d.ts +12 -0
  48. package/dist-pkg/build/client.js +93 -0
  49. package/dist-pkg/build/css-modules.d.ts +10 -0
  50. package/dist-pkg/build/css-modules.js +51 -0
  51. package/dist-pkg/build/devalue-parse.d.ts +1 -0
  52. package/dist-pkg/build/devalue-parse.js +1 -0
  53. package/dist-pkg/build/diagnostics.d.ts +20 -0
  54. package/dist-pkg/build/diagnostics.js +35 -0
  55. package/dist-pkg/build/fixtures.d.ts +7 -0
  56. package/dist-pkg/build/fixtures.js +60 -0
  57. package/dist-pkg/build/framework-imports.d.ts +4 -0
  58. package/dist-pkg/build/framework-imports.js +58 -0
  59. package/dist-pkg/build/init.d.ts +1 -0
  60. package/dist-pkg/build/init.js +6 -0
  61. package/dist-pkg/build/manifest.d.ts +3 -0
  62. package/dist-pkg/build/manifest.js +23 -0
  63. package/dist-pkg/build/parity.d.ts +32 -0
  64. package/dist-pkg/build/parity.js +71 -0
  65. package/dist-pkg/build/plugin.d.ts +11 -0
  66. package/dist-pkg/build/plugin.js +8 -0
  67. package/dist-pkg/build/readiness.d.ts +11 -0
  68. package/dist-pkg/build/readiness.js +18 -0
  69. package/dist-pkg/build/route-client-transform.d.ts +17 -0
  70. package/dist-pkg/build/route-client-transform.js +48 -0
  71. package/dist-pkg/build/route-metadata.d.ts +6 -0
  72. package/dist-pkg/build/route-metadata.js +8 -0
  73. package/dist-pkg/build/rpc-transform.d.ts +1 -0
  74. package/dist-pkg/build/rpc-transform.js +44 -0
  75. package/dist-pkg/build/server-bundle.d.ts +4 -0
  76. package/dist-pkg/build/server-bundle.js +261 -0
  77. package/dist-pkg/build/server-strip.d.ts +2 -0
  78. package/dist-pkg/build/server-strip.js +32 -0
  79. package/dist-pkg/build/ssg.d.ts +12 -0
  80. package/dist-pkg/build/ssg.js +36 -0
  81. package/dist-pkg/cli/bun-plugin.d.ts +2 -0
  82. package/dist-pkg/cli/bun-plugin.js +14 -0
  83. package/dist-pkg/cli/canonical-import-rewrite.d.ts +18 -0
  84. package/dist-pkg/cli/canonical-import-rewrite.js +94 -0
  85. package/dist-pkg/cli/canonical-imports.d.ts +8 -0
  86. package/dist-pkg/cli/canonical-imports.js +131 -0
  87. package/dist-pkg/cli/check-ast.d.ts +20 -0
  88. package/dist-pkg/cli/check-ast.js +126 -0
  89. package/dist-pkg/cli/cmd-ai.d.ts +4 -0
  90. package/dist-pkg/cli/cmd-ai.js +290 -0
  91. package/dist-pkg/cli/cmd-build.d.ts +12 -0
  92. package/dist-pkg/cli/cmd-build.js +198 -0
  93. package/dist-pkg/cli/cmd-check.d.ts +25 -0
  94. package/dist-pkg/cli/cmd-check.js +573 -0
  95. package/dist-pkg/cli/cmd-create.d.ts +6 -0
  96. package/dist-pkg/cli/cmd-create.js +600 -0
  97. package/dist-pkg/cli/cmd-deploy.d.ts +6 -0
  98. package/dist-pkg/cli/cmd-deploy.js +381 -0
  99. package/dist-pkg/cli/cmd-dev.d.ts +5 -0
  100. package/dist-pkg/cli/cmd-dev.js +5 -0
  101. package/dist-pkg/cli/cmd-docs.d.ts +50 -0
  102. package/dist-pkg/cli/cmd-docs.js +122 -0
  103. package/dist-pkg/cli/cmd-generate.d.ts +12 -0
  104. package/dist-pkg/cli/cmd-generate.js +320 -0
  105. package/dist-pkg/cli/cmd-migrate.d.ts +7 -0
  106. package/dist-pkg/cli/cmd-migrate.js +42 -0
  107. package/dist-pkg/cli/cmd-routes.d.ts +6 -0
  108. package/dist-pkg/cli/cmd-routes.js +24 -0
  109. package/dist-pkg/cli/cmd-start.d.ts +13 -0
  110. package/dist-pkg/cli/cmd-start.js +32 -0
  111. package/dist-pkg/cli/cmd-test.d.ts +20 -0
  112. package/dist-pkg/cli/cmd-test.js +103 -0
  113. package/dist-pkg/cli/cmd-typegen.d.ts +7 -0
  114. package/dist-pkg/cli/cmd-typegen.js +66 -0
  115. package/dist-pkg/cli/cmd-upgrade.d.ts +38 -0
  116. package/dist-pkg/cli/cmd-upgrade.js +232 -0
  117. package/dist-pkg/cli/context.d.ts +4 -0
  118. package/dist-pkg/cli/context.js +4 -0
  119. package/dist-pkg/cli/framework-md.d.ts +1 -0
  120. package/dist-pkg/cli/framework-md.js +391 -0
  121. package/dist-pkg/cli/index.d.ts +6 -0
  122. package/dist-pkg/cli/index.js +106 -0
  123. package/dist-pkg/cli/release-version.d.ts +2 -0
  124. package/dist-pkg/cli/release-version.js +33 -0
  125. package/dist-pkg/client.d.ts +16 -0
  126. package/dist-pkg/client.js +71 -0
  127. package/dist-pkg/compat.d.ts +1 -0
  128. package/dist-pkg/compat.js +1 -0
  129. package/dist-pkg/compiler/analysis-backend.d.ts +20 -0
  130. package/dist-pkg/compiler/analysis-backend.js +164 -0
  131. package/dist-pkg/compiler/backends/experimental-oxc.d.ts +6 -0
  132. package/dist-pkg/compiler/backends/experimental-oxc.js +9 -0
  133. package/dist-pkg/compiler/backends/oxc.d.ts +16 -0
  134. package/dist-pkg/compiler/backends/oxc.js +198 -0
  135. package/dist-pkg/compiler/backends/register.d.ts +7 -0
  136. package/dist-pkg/compiler/backends/register.js +22 -0
  137. package/dist-pkg/compiler/fixtures.d.ts +2 -0
  138. package/dist-pkg/compiler/fixtures.js +118 -0
  139. package/dist-pkg/compiler/init.d.ts +1 -0
  140. package/dist-pkg/compiler/init.js +6 -0
  141. package/dist-pkg/compiler/module-analysis.d.ts +13 -0
  142. package/dist-pkg/compiler/module-analysis.js +50 -0
  143. package/dist-pkg/compiler/parity.d.ts +35 -0
  144. package/dist-pkg/compiler/parity.js +89 -0
  145. package/dist-pkg/compiler/readiness.d.ts +11 -0
  146. package/dist-pkg/compiler/readiness.js +18 -0
  147. package/dist-pkg/compiler/route-facts.d.ts +34 -0
  148. package/dist-pkg/compiler/route-facts.js +75 -0
  149. package/dist-pkg/content/index.d.ts +27 -0
  150. package/dist-pkg/content/index.js +287 -0
  151. package/dist-pkg/db/index.d.ts +3 -0
  152. package/dist-pkg/db/index.js +6 -0
  153. package/dist-pkg/db/migrate.d.ts +7 -0
  154. package/dist-pkg/db/migrate.js +53 -0
  155. package/dist-pkg/db/postgres.d.ts +29 -0
  156. package/dist-pkg/db/postgres.js +59 -0
  157. package/dist-pkg/db/sqlite.d.ts +10 -0
  158. package/dist-pkg/db/sqlite.js +22 -0
  159. package/dist-pkg/deploy/cloudflare.d.ts +8 -0
  160. package/{src/deploy/cloudflare.ts → dist-pkg/deploy/cloudflare.js} +24 -26
  161. package/dist-pkg/deploy/conformance.d.ts +21 -0
  162. package/dist-pkg/deploy/conformance.js +98 -0
  163. package/dist-pkg/deploy/dockerfile.d.ts +3 -0
  164. package/{src/deploy/dockerfile.ts → dist-pkg/deploy/dockerfile.js} +8 -10
  165. package/dist-pkg/deploy/fly.d.ts +3 -0
  166. package/{src/deploy/fly.ts → dist-pkg/deploy/fly.js} +11 -12
  167. package/dist-pkg/deploy/index.d.ts +6 -0
  168. package/dist-pkg/deploy/index.js +26 -0
  169. package/dist-pkg/deploy/netlify.d.ts +2 -0
  170. package/{src/deploy/netlify.ts → dist-pkg/deploy/netlify.js} +17 -11
  171. package/dist-pkg/deploy/runtime.d.ts +2 -0
  172. package/dist-pkg/deploy/runtime.js +3 -0
  173. package/dist-pkg/deploy/vercel.d.ts +22 -0
  174. package/dist-pkg/deploy/vercel.js +53 -0
  175. package/dist-pkg/dev/error-overlay.d.ts +1 -0
  176. package/{src/dev/error-overlay.ts → dist-pkg/dev/error-overlay.js} +13 -23
  177. package/dist-pkg/dev/hmr.d.ts +30 -0
  178. package/dist-pkg/dev/hmr.js +86 -0
  179. package/dist-pkg/dev/partial-handler.d.ts +9 -0
  180. package/dist-pkg/dev/partial-handler.js +24 -0
  181. package/dist-pkg/dev/request-handler.d.ts +30 -0
  182. package/dist-pkg/dev/request-handler.js +67 -0
  183. package/dist-pkg/dev/watcher.d.ts +6 -0
  184. package/dist-pkg/dev/watcher.js +34 -0
  185. package/dist-pkg/dev.d.ts +11 -0
  186. package/dist-pkg/dev.js +268 -0
  187. package/dist-pkg/env/index.d.ts +3 -0
  188. package/dist-pkg/env/index.js +57 -0
  189. package/dist-pkg/errors/catalog.d.ts +9 -0
  190. package/{src/errors/catalog.ts → dist-pkg/errors/catalog.js} +8 -24
  191. package/dist-pkg/errors/formatter.d.ts +22 -0
  192. package/dist-pkg/errors/formatter.js +43 -0
  193. package/dist-pkg/errors/index.d.ts +2 -0
  194. package/dist-pkg/errors/index.js +2 -0
  195. package/dist-pkg/forms/action.d.ts +15 -0
  196. package/dist-pkg/forms/action.js +20 -0
  197. package/dist-pkg/forms/index.d.ts +4 -0
  198. package/dist-pkg/forms/index.js +12 -0
  199. package/dist-pkg/i18n/index.d.ts +61 -0
  200. package/dist-pkg/i18n/index.js +147 -0
  201. package/dist-pkg/index-client.d.ts +1 -0
  202. package/dist-pkg/index-client.js +1 -0
  203. package/dist-pkg/index.d.ts +32 -0
  204. package/dist-pkg/index.js +79 -0
  205. package/dist-pkg/jsx-runtime-client.d.ts +8 -0
  206. package/dist-pkg/jsx-runtime-client.js +1 -0
  207. package/dist-pkg/jsx-runtime.d.ts +13 -0
  208. package/dist-pkg/jsx-runtime.js +5 -0
  209. package/dist-pkg/jsx-types-html.d.ts +221 -0
  210. package/dist-pkg/jsx-types-html.js +0 -0
  211. package/dist-pkg/log/index.d.ts +8 -0
  212. package/dist-pkg/log/index.js +55 -0
  213. package/dist-pkg/plugins/drizzle.d.ts +16 -0
  214. package/dist-pkg/plugins/drizzle.js +50 -0
  215. package/dist-pkg/plugins/index.d.ts +62 -0
  216. package/dist-pkg/plugins/index.js +147 -0
  217. package/dist-pkg/plugins/lucia.d.ts +26 -0
  218. package/dist-pkg/plugins/lucia.js +63 -0
  219. package/dist-pkg/plugins/prisma.d.ts +14 -0
  220. package/dist-pkg/plugins/prisma.js +57 -0
  221. package/dist-pkg/plugins/resend.d.ts +21 -0
  222. package/dist-pkg/plugins/resend.js +45 -0
  223. package/dist-pkg/plugins/s3.d.ts +18 -0
  224. package/dist-pkg/plugins/s3.js +63 -0
  225. package/dist-pkg/plugins/stripe.d.ts +32 -0
  226. package/dist-pkg/plugins/stripe.js +69 -0
  227. package/dist-pkg/plugins/tailwind.d.ts +15 -0
  228. package/dist-pkg/plugins/tailwind.js +58 -0
  229. package/dist-pkg/prod.d.ts +21 -0
  230. package/dist-pkg/prod.js +347 -0
  231. package/dist-pkg/reactive/computed.d.ts +3 -0
  232. package/dist-pkg/reactive/computed.js +15 -0
  233. package/dist-pkg/reactive/data.d.ts +25 -0
  234. package/dist-pkg/reactive/data.js +56 -0
  235. package/dist-pkg/reactive/diagnostics.d.ts +100 -0
  236. package/dist-pkg/reactive/diagnostics.js +363 -0
  237. package/dist-pkg/reactive/effect.d.ts +3 -0
  238. package/dist-pkg/reactive/effect.js +6 -0
  239. package/dist-pkg/reactive/index.d.ts +9 -0
  240. package/dist-pkg/reactive/index.js +18 -0
  241. package/dist-pkg/reactive/live.d.ts +15 -0
  242. package/dist-pkg/reactive/live.js +58 -0
  243. package/dist-pkg/reactive/optimistic.d.ts +20 -0
  244. package/dist-pkg/reactive/optimistic.js +54 -0
  245. package/dist-pkg/reactive/resource.d.ts +25 -0
  246. package/dist-pkg/reactive/resource.js +97 -0
  247. package/dist-pkg/reactive/signal.d.ts +4 -0
  248. package/dist-pkg/reactive/signal.js +17 -0
  249. package/dist-pkg/reactive/store.d.ts +6 -0
  250. package/dist-pkg/reactive/store.js +19 -0
  251. package/dist-pkg/router/index.d.ts +2 -0
  252. package/dist-pkg/router/index.js +2 -0
  253. package/dist-pkg/router/matcher.d.ts +7 -0
  254. package/dist-pkg/router/matcher.js +40 -0
  255. package/dist-pkg/router/scanner.d.ts +14 -0
  256. package/dist-pkg/router/scanner.js +141 -0
  257. package/dist-pkg/routes/index.d.ts +1 -0
  258. package/dist-pkg/routes/index.js +10 -0
  259. package/dist-pkg/runtime/app-config.d.ts +26 -0
  260. package/dist-pkg/runtime/app-config.js +69 -0
  261. package/dist-pkg/runtime/client.d.ts +3 -0
  262. package/dist-pkg/runtime/client.js +31 -0
  263. package/dist-pkg/runtime/devtools.d.ts +64 -0
  264. package/dist-pkg/runtime/devtools.js +132 -0
  265. package/dist-pkg/runtime/error-boundary.d.ts +6 -0
  266. package/dist-pkg/runtime/error-boundary.js +17 -0
  267. package/dist-pkg/runtime/event-replay.d.ts +3 -0
  268. package/{src/runtime/event-replay.ts → dist-pkg/runtime/event-replay.js} +7 -22
  269. package/dist-pkg/runtime/event-source.d.ts +7 -0
  270. package/dist-pkg/runtime/event-source.js +24 -0
  271. package/dist-pkg/runtime/form.d.ts +24 -0
  272. package/dist-pkg/runtime/form.js +59 -0
  273. package/dist-pkg/runtime/head.d.ts +7 -0
  274. package/dist-pkg/runtime/head.js +90 -0
  275. package/dist-pkg/runtime/html-escape.d.ts +7 -0
  276. package/dist-pkg/runtime/html-escape.js +39 -0
  277. package/dist-pkg/runtime/hydration.d.ts +15 -0
  278. package/dist-pkg/runtime/hydration.js +103 -0
  279. package/dist-pkg/runtime/image.d.ts +49 -0
  280. package/dist-pkg/runtime/image.js +144 -0
  281. package/dist-pkg/runtime/index.d.ts +17 -0
  282. package/dist-pkg/runtime/index.js +59 -0
  283. package/dist-pkg/runtime/island-hydrator.d.ts +12 -0
  284. package/dist-pkg/runtime/island-hydrator.js +49 -0
  285. package/dist-pkg/runtime/island.d.ts +19 -0
  286. package/dist-pkg/runtime/island.js +36 -0
  287. package/dist-pkg/runtime/jsx-runtime.d.ts +12 -0
  288. package/dist-pkg/runtime/jsx-runtime.js +173 -0
  289. package/dist-pkg/runtime/link.d.ts +16 -0
  290. package/dist-pkg/runtime/link.js +47 -0
  291. package/dist-pkg/runtime/project.d.ts +37 -0
  292. package/dist-pkg/runtime/project.js +36 -0
  293. package/dist-pkg/runtime/renderable.d.ts +6 -0
  294. package/dist-pkg/runtime/renderable.js +0 -0
  295. package/dist-pkg/runtime/router.d.ts +47 -0
  296. package/dist-pkg/runtime/router.js +476 -0
  297. package/dist-pkg/runtime/server.d.ts +8 -0
  298. package/dist-pkg/runtime/server.js +71 -0
  299. package/dist-pkg/runtime/stream.d.ts +29 -0
  300. package/dist-pkg/runtime/stream.js +106 -0
  301. package/dist-pkg/runtime/suspense.d.ts +6 -0
  302. package/dist-pkg/runtime/suspense.js +16 -0
  303. package/dist-pkg/runtime/typed-routes.d.ts +24 -0
  304. package/dist-pkg/runtime/typed-routes.js +77 -0
  305. package/dist-pkg/runtime/validated-form.d.ts +40 -0
  306. package/dist-pkg/runtime/validated-form.js +120 -0
  307. package/dist-pkg/security/cors.d.ts +10 -0
  308. package/dist-pkg/security/cors.js +56 -0
  309. package/dist-pkg/security/csrf.d.ts +9 -0
  310. package/dist-pkg/security/csrf.js +53 -0
  311. package/dist-pkg/security/headers.d.ts +11 -0
  312. package/dist-pkg/security/headers.js +31 -0
  313. package/dist-pkg/security/index.d.ts +5 -0
  314. package/dist-pkg/security/index.js +5 -0
  315. package/dist-pkg/security/rate-limit.d.ts +10 -0
  316. package/dist-pkg/security/rate-limit.js +49 -0
  317. package/dist-pkg/security/redis-rate-limit.d.ts +14 -0
  318. package/dist-pkg/security/redis-rate-limit.js +23 -0
  319. package/dist-pkg/server/action.d.ts +21 -0
  320. package/dist-pkg/server/action.js +64 -0
  321. package/dist-pkg/server/cache-utils.d.ts +2 -0
  322. package/dist-pkg/server/cache-utils.js +26 -0
  323. package/dist-pkg/server/cache.d.ts +33 -0
  324. package/dist-pkg/server/cache.js +236 -0
  325. package/dist-pkg/server/compress.d.ts +2 -0
  326. package/dist-pkg/server/compress.js +49 -0
  327. package/dist-pkg/server/endpoint-execution.d.ts +28 -0
  328. package/dist-pkg/server/endpoint-execution.js +37 -0
  329. package/dist-pkg/server/etag.d.ts +3 -0
  330. package/dist-pkg/server/etag.js +18 -0
  331. package/dist-pkg/server/guard.d.ts +16 -0
  332. package/dist-pkg/server/guard.js +45 -0
  333. package/dist-pkg/server/html-shell.d.ts +12 -0
  334. package/dist-pkg/server/html-shell.js +52 -0
  335. package/dist-pkg/server/index.d.ts +36 -0
  336. package/dist-pkg/server/index.js +170 -0
  337. package/dist-pkg/server/jobs.d.ts +41 -0
  338. package/dist-pkg/server/jobs.js +81 -0
  339. package/dist-pkg/server/manifest.d.ts +19 -0
  340. package/dist-pkg/server/manifest.js +36 -0
  341. package/dist-pkg/server/middleware.d.ts +39 -0
  342. package/dist-pkg/server/middleware.js +122 -0
  343. package/dist-pkg/server/mime.d.ts +1 -0
  344. package/{src/server/mime.ts → dist-pkg/server/mime.js} +6 -17
  345. package/dist-pkg/server/not-found.d.ts +6 -0
  346. package/dist-pkg/server/not-found.js +24 -0
  347. package/dist-pkg/server/page-render.d.ts +29 -0
  348. package/dist-pkg/server/page-render.js +67 -0
  349. package/dist-pkg/server/partial-navigation.d.ts +4 -0
  350. package/dist-pkg/server/partial-navigation.js +16 -0
  351. package/dist-pkg/server/pipe.d.ts +9 -0
  352. package/dist-pkg/server/pipe.js +32 -0
  353. package/dist-pkg/server/redis-cache-store.d.ts +10 -0
  354. package/dist-pkg/server/redis-cache-store.js +73 -0
  355. package/dist-pkg/server/redis-client.d.ts +37 -0
  356. package/dist-pkg/server/redis-client.js +37 -0
  357. package/dist-pkg/server/request-policy.d.ts +55 -0
  358. package/dist-pkg/server/request-policy.js +216 -0
  359. package/dist-pkg/server/request-preflight.d.ts +23 -0
  360. package/dist-pkg/server/request-preflight.js +45 -0
  361. package/dist-pkg/server/request-security-policy.d.ts +17 -0
  362. package/dist-pkg/server/request-security-policy.js +34 -0
  363. package/dist-pkg/server/request-surface.d.ts +8 -0
  364. package/dist-pkg/server/request-surface.js +19 -0
  365. package/dist-pkg/server/route-request.d.ts +31 -0
  366. package/dist-pkg/server/route-request.js +112 -0
  367. package/dist-pkg/server/route-response.d.ts +22 -0
  368. package/dist-pkg/server/route-response.js +58 -0
  369. package/dist-pkg/server/rpc-hash.d.ts +2 -0
  370. package/dist-pkg/server/rpc-hash.js +7 -0
  371. package/dist-pkg/server/rpc-protocol.d.ts +22 -0
  372. package/dist-pkg/server/rpc-protocol.js +28 -0
  373. package/dist-pkg/server/rpc-utils.d.ts +2 -0
  374. package/dist-pkg/server/rpc-utils.js +26 -0
  375. package/dist-pkg/server/rpc.d.ts +20 -0
  376. package/dist-pkg/server/rpc.js +147 -0
  377. package/dist-pkg/server/runtime-dispatch.d.ts +19 -0
  378. package/dist-pkg/server/runtime-dispatch.js +67 -0
  379. package/dist-pkg/server/server-execution.d.ts +22 -0
  380. package/dist-pkg/server/server-execution.js +53 -0
  381. package/dist-pkg/server/sqlite-cache-store.d.ts +13 -0
  382. package/dist-pkg/server/sqlite-cache-store.js +88 -0
  383. package/dist-pkg/server/sse.d.ts +9 -0
  384. package/dist-pkg/server/sse.js +34 -0
  385. package/dist-pkg/server/static-file.d.ts +9 -0
  386. package/dist-pkg/server/static-file.js +43 -0
  387. package/dist-pkg/server/ws.d.ts +18 -0
  388. package/dist-pkg/server/ws.js +40 -0
  389. package/dist-pkg/server-entry.d.ts +19 -0
  390. package/dist-pkg/server-entry.js +93 -0
  391. package/dist-pkg/testing/index.d.ts +98 -0
  392. package/dist-pkg/testing/index.js +254 -0
  393. package/dist-pkg/types/index.d.ts +4 -0
  394. package/dist-pkg/types/index.js +4 -0
  395. package/dist-pkg/types/safe-html.d.ts +7 -0
  396. package/dist-pkg/types/safe-html.js +19 -0
  397. package/dist-pkg/types/safe-sql.d.ts +8 -0
  398. package/dist-pkg/types/safe-sql.js +14 -0
  399. package/dist-pkg/types/safe-url.d.ts +7 -0
  400. package/dist-pkg/types/safe-url.js +20 -0
  401. package/dist-pkg/types/user-input.d.ts +9 -0
  402. package/dist-pkg/types/user-input.js +3 -0
  403. package/dist-pkg/unsafe/index.d.ts +12 -0
  404. package/dist-pkg/unsafe/index.js +6 -0
  405. package/package.json +102 -44
  406. package/bin/gorsee.js +0 -14
  407. package/src/auth/index.ts +0 -178
  408. package/src/auth/redis-session-store.ts +0 -46
  409. package/src/auth/sqlite-session-store.ts +0 -98
  410. package/src/auth/store-utils.ts +0 -21
  411. package/src/build/client.ts +0 -139
  412. package/src/build/css-modules.ts +0 -69
  413. package/src/build/devalue-parse.ts +0 -2
  414. package/src/build/manifest.ts +0 -34
  415. package/src/build/route-metadata.ts +0 -12
  416. package/src/build/rpc-transform.ts +0 -62
  417. package/src/build/server-strip.ts +0 -87
  418. package/src/build/ssg.ts +0 -70
  419. package/src/cli/bun-plugin.ts +0 -58
  420. package/src/cli/cmd-build.ts +0 -153
  421. package/src/cli/cmd-check.ts +0 -239
  422. package/src/cli/cmd-create.ts +0 -328
  423. package/src/cli/cmd-deploy.ts +0 -149
  424. package/src/cli/cmd-dev.ts +0 -13
  425. package/src/cli/cmd-docs.ts +0 -152
  426. package/src/cli/cmd-generate.ts +0 -155
  427. package/src/cli/cmd-migrate.ts +0 -53
  428. package/src/cli/cmd-routes.ts +0 -36
  429. package/src/cli/cmd-start.ts +0 -30
  430. package/src/cli/cmd-test.ts +0 -129
  431. package/src/cli/cmd-typegen.ts +0 -93
  432. package/src/cli/cmd-upgrade.ts +0 -143
  433. package/src/cli/context.ts +0 -12
  434. package/src/cli/framework-md.ts +0 -223
  435. package/src/cli/index.ts +0 -107
  436. package/src/client.ts +0 -26
  437. package/src/db/index.ts +0 -2
  438. package/src/db/migrate.ts +0 -89
  439. package/src/db/sqlite.ts +0 -40
  440. package/src/deploy/index.ts +0 -31
  441. package/src/deploy/vercel.ts +0 -94
  442. package/src/dev/hmr.ts +0 -31
  443. package/src/dev/partial-handler.ts +0 -52
  444. package/src/dev/request-handler.ts +0 -127
  445. package/src/dev/watcher.ts +0 -48
  446. package/src/dev.ts +0 -208
  447. package/src/env/index.ts +0 -74
  448. package/src/errors/formatter.ts +0 -63
  449. package/src/errors/index.ts +0 -2
  450. package/src/i18n/index.ts +0 -72
  451. package/src/index-client.ts +0 -4
  452. package/src/index.ts +0 -43
  453. package/src/jsx-runtime-client.ts +0 -13
  454. package/src/jsx-runtime.ts +0 -20
  455. package/src/jsx-types-html.ts +0 -242
  456. package/src/log/index.ts +0 -44
  457. package/src/plugins/drizzle.ts +0 -84
  458. package/src/plugins/index.ts +0 -86
  459. package/src/plugins/lucia.ts +0 -111
  460. package/src/plugins/prisma.ts +0 -85
  461. package/src/plugins/resend.ts +0 -78
  462. package/src/plugins/s3.ts +0 -102
  463. package/src/plugins/stripe.ts +0 -133
  464. package/src/plugins/tailwind.ts +0 -92
  465. package/src/prod.ts +0 -252
  466. package/src/reactive/computed.ts +0 -7
  467. package/src/reactive/effect.ts +0 -7
  468. package/src/reactive/index.ts +0 -7
  469. package/src/reactive/live.ts +0 -97
  470. package/src/reactive/optimistic.ts +0 -83
  471. package/src/reactive/resource.ts +0 -138
  472. package/src/reactive/signal.ts +0 -20
  473. package/src/reactive/store.ts +0 -36
  474. package/src/router/index.ts +0 -2
  475. package/src/router/matcher.ts +0 -53
  476. package/src/router/scanner.ts +0 -206
  477. package/src/runtime/client.ts +0 -28
  478. package/src/runtime/error-boundary.ts +0 -35
  479. package/src/runtime/form.ts +0 -49
  480. package/src/runtime/head.ts +0 -113
  481. package/src/runtime/html-escape.ts +0 -30
  482. package/src/runtime/hydration.ts +0 -95
  483. package/src/runtime/image.ts +0 -48
  484. package/src/runtime/index.ts +0 -12
  485. package/src/runtime/island-hydrator.ts +0 -84
  486. package/src/runtime/island.ts +0 -88
  487. package/src/runtime/jsx-runtime.ts +0 -167
  488. package/src/runtime/link.ts +0 -45
  489. package/src/runtime/project.ts +0 -73
  490. package/src/runtime/router.ts +0 -224
  491. package/src/runtime/server.ts +0 -102
  492. package/src/runtime/stream.ts +0 -182
  493. package/src/runtime/suspense.ts +0 -37
  494. package/src/runtime/typed-routes.ts +0 -26
  495. package/src/runtime/validated-form.ts +0 -106
  496. package/src/security/cors.ts +0 -80
  497. package/src/security/csrf.ts +0 -85
  498. package/src/security/headers.ts +0 -50
  499. package/src/security/index.ts +0 -4
  500. package/src/security/rate-limit.ts +0 -80
  501. package/src/server/action.ts +0 -48
  502. package/src/server/cache-utils.ts +0 -23
  503. package/src/server/cache.ts +0 -125
  504. package/src/server/compress.ts +0 -60
  505. package/src/server/etag.ts +0 -23
  506. package/src/server/guard.ts +0 -69
  507. package/src/server/html-shell.ts +0 -69
  508. package/src/server/index.ts +0 -57
  509. package/src/server/manifest.ts +0 -36
  510. package/src/server/middleware.ts +0 -159
  511. package/src/server/not-found.ts +0 -35
  512. package/src/server/page-render.ts +0 -123
  513. package/src/server/pipe.ts +0 -46
  514. package/src/server/redis-cache-store.ts +0 -87
  515. package/src/server/redis-client.ts +0 -71
  516. package/src/server/request-preflight.ts +0 -45
  517. package/src/server/route-request.ts +0 -72
  518. package/src/server/rpc-hash.ts +0 -17
  519. package/src/server/rpc-utils.ts +0 -27
  520. package/src/server/rpc.ts +0 -177
  521. package/src/server/sqlite-cache-store.ts +0 -109
  522. package/src/server/sse.ts +0 -96
  523. package/src/server/static-file.ts +0 -63
  524. package/src/server/ws.ts +0 -56
  525. package/src/server-entry.ts +0 -36
  526. package/src/testing/index.ts +0 -74
  527. package/src/types/index.ts +0 -4
  528. package/src/types/safe-html.ts +0 -32
  529. package/src/types/safe-sql.ts +0 -28
  530. package/src/types/safe-url.ts +0 -40
  531. package/src/types/user-input.ts +0 -12
  532. package/src/unsafe/index.ts +0 -18
@@ -1,69 +0,0 @@
1
- // Route guards — declarative access control for routes
2
- // Usage: export const guard = requireRole("admin")
3
-
4
- import type { Context, MiddlewareFn } from "./middleware.ts"
5
-
6
- type GuardFn = (ctx: Context) => boolean | Promise<boolean>
7
-
8
- interface GuardOptions {
9
- onFail?: (ctx: Context) => Response | Promise<Response>
10
- }
11
-
12
- const DEFAULT_DENY = (_ctx: Context) => new Response("Forbidden", { status: 403 })
13
-
14
- /** Create a guard middleware from a predicate */
15
- export function createGuard(check: GuardFn, options?: GuardOptions): MiddlewareFn {
16
- const onFail = options?.onFail ?? DEFAULT_DENY
17
- return async (ctx, next) => {
18
- const allowed = await check(ctx)
19
- if (!allowed) return onFail(ctx)
20
- return next()
21
- }
22
- }
23
-
24
- /** Guard: require authenticated session */
25
- export function requireAuth(loginPath = "/login"): MiddlewareFn {
26
- return createGuard(
27
- (ctx) => !!ctx.locals.session,
28
- { onFail: (ctx) => ctx.redirect(loginPath) },
29
- )
30
- }
31
-
32
- /** Guard: require specific role (reads from session.data.role) */
33
- export function requireRole(role: string, options?: GuardOptions): MiddlewareFn {
34
- return createGuard((ctx) => {
35
- const session = ctx.locals.session as { data?: { role?: string } } | undefined
36
- return session?.data?.role === role
37
- }, options)
38
- }
39
-
40
- /** Guard: combine multiple guards (all must pass) */
41
- export function allGuards(...guards: MiddlewareFn[]): MiddlewareFn {
42
- return async (ctx, next) => {
43
- for (const guard of guards) {
44
- let passed = false
45
- const guardNext = async () => {
46
- passed = true
47
- return new Response(null)
48
- }
49
- const result = await guard(ctx, guardNext)
50
- if (!passed) return result
51
- }
52
- return next()
53
- }
54
- }
55
-
56
- /** Guard: any one guard passing is sufficient */
57
- export function anyGuard(...guards: MiddlewareFn[]): MiddlewareFn {
58
- return async (ctx, next) => {
59
- for (const guard of guards) {
60
- let passed = false
61
- await guard(ctx, async () => {
62
- passed = true
63
- return new Response(null)
64
- })
65
- if (passed) return next()
66
- }
67
- return new Response("Forbidden", { status: 403 })
68
- }
69
- }
@@ -1,69 +0,0 @@
1
- export interface HTMLWrapOptions {
2
- title?: string
3
- clientScript?: string
4
- loaderData?: unknown
5
- params?: Record<string, string>
6
- cssFiles?: string[]
7
- headElements?: string[]
8
- bodyPrefix?: string[]
9
- bodySuffix?: string[]
10
- }
11
-
12
- export function generateNonce(): string {
13
- const bytes = new Uint8Array(16)
14
- crypto.getRandomValues(bytes)
15
- return btoa(String.fromCharCode(...bytes))
16
- }
17
-
18
- export function wrapHTML(
19
- body: string,
20
- nonce: string | undefined,
21
- options: HTMLWrapOptions = {},
22
- ): string {
23
- const {
24
- title = "Gorsee App",
25
- clientScript,
26
- loaderData,
27
- params,
28
- cssFiles = [],
29
- headElements = [],
30
- bodyPrefix = [],
31
- bodySuffix = [],
32
- } = options
33
-
34
- let dataScript = ""
35
- if (loaderData !== undefined) {
36
- const json = JSON.stringify(loaderData).replace(/</g, "\\u003c")
37
- dataScript = `\n <script id="__GORSEE_DATA__" type="application/json"${renderNonceAttr(nonce)}>${json}</script>`
38
- }
39
-
40
- let paramsScript = ""
41
- if (params && Object.keys(params).length > 0) {
42
- paramsScript = `\n <script${renderNonceAttr(nonce)}>window.__GORSEE_PARAMS__=${JSON.stringify(params)}</script>`
43
- }
44
-
45
- const clientTag = clientScript
46
- ? `\n <script type="module" src="${clientScript}"${renderNonceAttr(nonce)}></script>`
47
- : ""
48
-
49
- return `<!DOCTYPE html>
50
- <html lang="en">
51
- <head>
52
- <meta charset="UTF-8" />
53
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
54
- <title>${title}</title>
55
- <link rel="stylesheet" href="/styles.css" />
56
- ${cssFiles.map((file) => ` <link rel="stylesheet" href="${file}" />`).join("\n")}
57
- ${headElements.join("\n")}
58
- </head>
59
- <body>
60
- ${bodyPrefix.join("\n")}
61
- <div id="app">${body}</div>${dataScript}${paramsScript}${clientTag}
62
- ${bodySuffix.join("\n")}
63
- </body>
64
- </html>`
65
- }
66
-
67
- function renderNonceAttr(nonce?: string): string {
68
- return nonce ? ` nonce="${nonce}"` : ""
69
- }
@@ -1,57 +0,0 @@
1
- export {
2
- server,
3
- handleRPCRequest,
4
- __registerRPC,
5
- getRPCHandler,
6
- createMemoryRPCRegistry,
7
- handleRPCRequestWithRegistry,
8
- type RPCHandler,
9
- type RPCRegistry,
10
- } from "./rpc.ts"
11
- export {
12
- middleware,
13
- createContext,
14
- runMiddlewareChain,
15
- type Context,
16
- type MiddlewareFn,
17
- type NextFn,
18
- } from "./middleware.ts"
19
- export { defineAction, handleAction, parseFormData, type ActionFn, type ActionResult } from "./action.ts"
20
- export { joinRoom, leaveRoom, broadcastToRoom, getRoomSize, createWSContext, type WSContext, type WSHandler } from "./ws.ts"
21
- export { compress } from "./compress.ts"
22
- export { getMimeType } from "./mime.ts"
23
- export { fileETag, generateETag, isNotModified } from "./etag.ts"
24
- export { redirect, RedirectError, type CookieOptions } from "./middleware.ts"
25
- export { createSSEStream, createEventSource, type SSEOptions, type SSEStream, type EventSourceSignal } from "./sse.ts"
26
- export {
27
- routeCache,
28
- invalidateCache,
29
- clearCache,
30
- createMemoryCacheStore,
31
- type CacheOptions,
32
- type CacheEntry,
33
- type CacheStore,
34
- } from "./cache.ts"
35
- export { createGuard, requireAuth, requireRole, allGuards, anyGuard } from "./guard.ts"
36
- export { pipe, when, forMethods, forPaths } from "./pipe.ts"
37
- export { createNamespacedCacheStore } from "./cache-utils.ts"
38
- export { createRedisCacheStore } from "./redis-cache-store.ts"
39
- export { createScopedRPCRegistry } from "./rpc-utils.ts"
40
- export { createSQLiteCacheStore } from "./sqlite-cache-store.ts"
41
- export {
42
- type RedisLikeClient,
43
- type NodeRedisClientLike,
44
- type IORedisClientLike,
45
- createNodeRedisLikeClient,
46
- createIORedisLikeClient,
47
- deleteExpiredRedisKeys,
48
- } from "./redis-client.ts"
49
- export {
50
- loadBuildManifest,
51
- getRouteBuildEntry,
52
- getClientBundleForRoute,
53
- isPrerenderedRoute,
54
- getPrerenderedHtmlPath,
55
- type BuildManifest,
56
- type BuildManifestRoute,
57
- } from "./manifest.ts"
@@ -1,36 +0,0 @@
1
- import { join } from "node:path"
2
- import { readFile } from "node:fs/promises"
3
-
4
- export interface BuildManifestRoute {
5
- js?: string
6
- hasLoader: boolean
7
- prerendered?: boolean
8
- }
9
-
10
- export interface BuildManifest {
11
- routes: Record<string, BuildManifestRoute>
12
- chunks: string[]
13
- prerendered: string[]
14
- buildTime: string
15
- }
16
-
17
- export async function loadBuildManifest(distDir: string): Promise<BuildManifest> {
18
- const raw = await readFile(join(distDir, "manifest.json"), "utf-8")
19
- return JSON.parse(raw) as BuildManifest
20
- }
21
-
22
- export function getRouteBuildEntry(manifest: BuildManifest, pathname: string): BuildManifestRoute | undefined {
23
- return manifest.routes[pathname]
24
- }
25
-
26
- export function getClientBundleForRoute(manifest: BuildManifest, pathname: string): string | undefined {
27
- return getRouteBuildEntry(manifest, pathname)?.js
28
- }
29
-
30
- export function isPrerenderedRoute(manifest: BuildManifest, pathname: string): boolean {
31
- return getRouteBuildEntry(manifest, pathname)?.prerendered === true
32
- }
33
-
34
- export function getPrerenderedHtmlPath(pathname: string): string {
35
- return pathname === "/" ? "index.html" : join(pathname.slice(1), "index.html")
36
- }
@@ -1,159 +0,0 @@
1
- // Server context, middleware chain, and cookie management
2
-
3
- export interface CookieOptions {
4
- maxAge?: number
5
- expires?: Date
6
- path?: string
7
- domain?: string
8
- secure?: boolean
9
- httpOnly?: boolean
10
- sameSite?: "Strict" | "Lax" | "None"
11
- }
12
-
13
- export interface Context {
14
- request: Request
15
- url: URL
16
- params: Record<string, string>
17
- cookies: Map<string, string>
18
- locals: Record<string, unknown>
19
- /** Response headers to be merged into the final response */
20
- responseHeaders: Headers
21
- redirect(url: string, status?: number): Response
22
- setCookie(name: string, value: string, options?: CookieOptions): void
23
- deleteCookie(name: string, options?: Pick<CookieOptions, "path" | "domain">): void
24
- setHeader(name: string, value: string): void
25
- }
26
-
27
- export type NextFn = () => Promise<Response>
28
- export type MiddlewareFn = (ctx: Context, next: NextFn) => Promise<Response>
29
-
30
- /** Throwable redirect — use in loaders to interrupt and redirect */
31
- export class RedirectError {
32
- constructor(public url: string, public status: number = 302) {}
33
- }
34
-
35
- export function redirect(url: string, status = 302): never {
36
- throw new RedirectError(url, status)
37
- }
38
-
39
- export function middleware(fn: MiddlewareFn): MiddlewareFn {
40
- return fn
41
- }
42
-
43
- function sanitizeCookiePart(str: string): string {
44
- return str.replace(/[\r\n;,]/g, "")
45
- }
46
-
47
- function serializeCookie(name: string, value: string, options: CookieOptions = {}): string {
48
- let cookie = `${sanitizeCookiePart(name)}=${sanitizeCookiePart(value)}`
49
- if (options.maxAge !== undefined) cookie += `; Max-Age=${options.maxAge}`
50
- if (options.expires) cookie += `; Expires=${options.expires.toUTCString()}`
51
- cookie += `; Path=${options.path ?? "/"}`
52
- if (options.domain) cookie += `; Domain=${options.domain}`
53
- if (options.secure) cookie += "; Secure"
54
- if (options.httpOnly) cookie += "; HttpOnly"
55
- if (options.sameSite) cookie += `; SameSite=${options.sameSite}`
56
- return cookie
57
- }
58
-
59
- function parseCookies(request: Request): Map<string, string> {
60
- const cookieHeader = request.headers.get("cookie") ?? ""
61
- const cookies = new Map<string, string>()
62
- for (const pair of cookieHeader.split(";")) {
63
- const [key, ...rest] = pair.trim().split("=")
64
- if (key) cookies.set(key, rest.join("="))
65
- }
66
- return cookies
67
- }
68
-
69
- export function createContext(request: Request, params: Record<string, string> = {}): Context {
70
- const url = new URL(request.url)
71
- const cookies = parseCookies(request)
72
- const responseHeaders = new Headers()
73
- const pendingCookies: string[] = []
74
-
75
- return {
76
- request,
77
- url,
78
- params,
79
- cookies,
80
- locals: {},
81
- responseHeaders,
82
-
83
- redirect(target: string, status = 302) {
84
- // Prevent open redirect: only allow relative paths or same-origin URLs
85
- let safeTarget = target
86
- if (target.startsWith("//") || /^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(target)) {
87
- try {
88
- const targetUrl = new URL(target)
89
- if (targetUrl.origin !== url.origin) {
90
- safeTarget = "/"
91
- }
92
- } catch {
93
- safeTarget = "/"
94
- }
95
- }
96
- const res = new Response(null, {
97
- status,
98
- headers: { Location: safeTarget },
99
- })
100
- // Apply pending cookies to redirect response
101
- for (const cookie of pendingCookies) {
102
- res.headers.append("Set-Cookie", cookie)
103
- }
104
- return res
105
- },
106
-
107
- setCookie(name: string, value: string, options?: CookieOptions) {
108
- const cookie = serializeCookie(name, value, options)
109
- pendingCookies.push(cookie)
110
- responseHeaders.append("Set-Cookie", cookie)
111
- cookies.set(name, value)
112
- },
113
-
114
- deleteCookie(name: string, options?: Pick<CookieOptions, "path" | "domain">) {
115
- const cookie = serializeCookie(name, "", {
116
- ...options,
117
- maxAge: 0,
118
- expires: new Date(0),
119
- })
120
- pendingCookies.push(cookie)
121
- responseHeaders.append("Set-Cookie", cookie)
122
- cookies.delete(name)
123
- },
124
-
125
- setHeader(name: string, value: string) {
126
- responseHeaders.set(name, value)
127
- },
128
- }
129
- }
130
-
131
- export async function runMiddlewareChain(
132
- middlewares: MiddlewareFn[],
133
- ctx: Context,
134
- handler: () => Promise<Response>
135
- ): Promise<Response> {
136
- let index = 0
137
-
138
- const next = async (): Promise<Response> => {
139
- if (index < middlewares.length) {
140
- const mw = middlewares[index]!
141
- index++
142
- return mw(ctx, next)
143
- }
144
- return handler()
145
- }
146
-
147
- const response = await next()
148
-
149
- // Merge ctx.responseHeaders into response
150
- for (const [key, value] of ctx.responseHeaders.entries()) {
151
- if (key.toLowerCase() === "set-cookie") {
152
- response.headers.append(key, value)
153
- } else {
154
- response.headers.set(key, value)
155
- }
156
- }
157
-
158
- return response
159
- }
@@ -1,35 +0,0 @@
1
- import { join } from "node:path"
2
- import { wrapHTML, type HTMLWrapOptions } from "./html-shell.ts"
3
-
4
- interface NotFoundOptions extends Pick<HTMLWrapOptions, "bodyPrefix" | "bodySuffix" | "headElements"> {
5
- title?: string
6
- }
7
-
8
- export async function renderNotFoundPage(
9
- routesDir: string,
10
- nonce: string,
11
- options: NotFoundOptions = {},
12
- ): Promise<string> {
13
- const { title = "404 - Not Found", bodyPrefix, bodySuffix, headElements } = options
14
-
15
- try {
16
- const notFoundPath = join(routesDir, "404.tsx")
17
- const file = Bun.file(notFoundPath)
18
- if (await file.exists()) {
19
- const mod = await import(notFoundPath)
20
- if (typeof mod.default === "function") {
21
- const { ssrJsx, renderToString } = await import("../runtime/server.ts")
22
- const vnode = ssrJsx(mod.default as any, {})
23
- const body = renderToString(vnode)
24
- return wrapHTML(body, nonce, { title, bodyPrefix, bodySuffix, headElements })
25
- }
26
- }
27
- } catch {}
28
-
29
- return wrapHTML("<h1>404</h1><p>Page not found</p>", nonce, {
30
- title,
31
- bodyPrefix,
32
- bodySuffix,
33
- headElements,
34
- })
35
- }
@@ -1,123 +0,0 @@
1
- import { resetServerHead, getServerHead } from "../runtime/head.ts"
2
- import { renderToString, ssrJsx } from "../runtime/server.ts"
3
- import type { Context } from "./middleware.ts"
4
- import type { MatchResult } from "../router/matcher.ts"
5
-
6
- type PageModule = Record<string, unknown>
7
-
8
- export interface ResolvedPageRoute {
9
- component: Function
10
- pageComponent: Function
11
- loaderData: unknown
12
- cssFiles: string[]
13
- renderMode: string
14
- }
15
-
16
- export interface RenderedPage {
17
- html: string
18
- headElements: string[]
19
- title?: string
20
- }
21
-
22
- export interface PartialResponsePayload {
23
- html: string
24
- data?: unknown
25
- params?: Record<string, string>
26
- title?: string
27
- css?: string[]
28
- script?: string
29
- }
30
-
31
- export async function resolvePageRoute(
32
- mod: PageModule,
33
- match: MatchResult,
34
- ctx: Context,
35
- ): Promise<ResolvedPageRoute | null> {
36
- const component = mod.default as Function | undefined
37
- if (typeof component !== "function") return null
38
-
39
- const layoutPaths = match.route.layoutPaths ?? []
40
- const layoutImportPromises = layoutPaths.map((layoutPath) => import(layoutPath))
41
- const pageLoaderPromise = typeof mod.loader === "function" ? mod.loader(ctx) : undefined
42
-
43
- const [layoutMods, loaderData] = await Promise.all([
44
- Promise.all(layoutImportPromises),
45
- pageLoaderPromise,
46
- ])
47
-
48
- const layoutLoaderPromises = layoutMods.map((layoutMod) =>
49
- typeof layoutMod.loader === "function" ? layoutMod.loader(ctx) : undefined,
50
- )
51
- const layoutLoaderResults = await Promise.all(layoutLoaderPromises)
52
-
53
- const cssFiles: string[] = []
54
- if (typeof mod.css === "string") cssFiles.push(mod.css)
55
- if (Array.isArray(mod.css)) cssFiles.push(...(mod.css as string[]))
56
-
57
- let pageComponent: Function = component
58
- for (let i = layoutMods.length - 1; i >= 0; i--) {
59
- const Layout = layoutMods[i]!.default
60
- if (typeof Layout === "function") {
61
- const inner = pageComponent
62
- const layoutData = layoutLoaderResults[i]
63
- pageComponent = (props: Record<string, unknown>) =>
64
- Layout({ ...props, data: layoutData, children: inner(props) })
65
- }
66
- }
67
-
68
- return {
69
- component,
70
- pageComponent,
71
- loaderData,
72
- cssFiles,
73
- renderMode: (mod.render as string) ?? "async",
74
- }
75
- }
76
-
77
- export function createClientScriptPath(entryFile?: string): string | undefined {
78
- return entryFile ? `/_gorsee/${entryFile}` : undefined
79
- }
80
-
81
- export function renderPageDocument(
82
- pageComponent: Function,
83
- ctx: Context,
84
- params: Record<string, string>,
85
- loaderData: unknown,
86
- ): RenderedPage {
87
- resetServerHead()
88
- const pageProps = { params, ctx, data: loaderData }
89
- const vnode = ssrJsx(pageComponent as any, pageProps)
90
- const html = renderToString(vnode)
91
- const headElements = getServerHead()
92
-
93
- return {
94
- html,
95
- headElements,
96
- title: extractTitle(headElements),
97
- }
98
- }
99
-
100
- export function buildPartialResponsePayload(
101
- rendered: RenderedPage,
102
- loaderData: unknown,
103
- params: Record<string, string>,
104
- cssFiles: string[],
105
- clientScript?: string,
106
- ): PartialResponsePayload {
107
- return {
108
- html: rendered.html,
109
- data: loaderData,
110
- params: Object.keys(params).length > 0 ? params : undefined,
111
- title: rendered.title,
112
- css: cssFiles.length > 0 ? cssFiles : undefined,
113
- script: clientScript,
114
- }
115
- }
116
-
117
- export function extractTitle(headElements: string[]): string | undefined {
118
- for (const element of headElements) {
119
- const titleMatch = element.match(/<title>(.+?)<\/title>/)
120
- if (titleMatch) return titleMatch[1]
121
- }
122
- return undefined
123
- }
@@ -1,46 +0,0 @@
1
- // Middleware pipe — compose middleware functions into a pipeline
2
- // Usage: pipe(cors(), compress(), rateLimit(), auth())
3
- // Killer DX: declarative route-level middleware composition
4
-
5
- import type { MiddlewareFn } from "./middleware.ts"
6
-
7
- /** Compose multiple middleware into a single middleware function */
8
- export function pipe(...middlewares: MiddlewareFn[]): MiddlewareFn {
9
- if (middlewares.length === 0) return async (_ctx, next) => next()
10
- if (middlewares.length === 1) return middlewares[0]!
11
-
12
- return async (ctx, next) => {
13
- let index = 0
14
- const run = async (): Promise<Response> => {
15
- if (index < middlewares.length) {
16
- const mw = middlewares[index]!
17
- index++
18
- return mw(ctx, run)
19
- }
20
- return next()
21
- }
22
- return run()
23
- }
24
- }
25
-
26
- /** Create a conditional middleware — runs inner only if predicate passes */
27
- export function when(
28
- predicate: (ctx: import("./middleware.ts").Context) => boolean,
29
- middleware: MiddlewareFn,
30
- ): MiddlewareFn {
31
- return async (ctx, next) => {
32
- if (predicate(ctx)) return middleware(ctx, next)
33
- return next()
34
- }
35
- }
36
-
37
- /** Create a middleware that runs only for specific HTTP methods */
38
- export function forMethods(methods: string[], middleware: MiddlewareFn): MiddlewareFn {
39
- const methodSet = new Set(methods.map((m) => m.toUpperCase()))
40
- return when((ctx) => methodSet.has(ctx.request.method), middleware)
41
- }
42
-
43
- /** Create a middleware that runs only for specific path prefixes */
44
- export function forPaths(prefixes: string[], middleware: MiddlewareFn): MiddlewareFn {
45
- return when((ctx) => prefixes.some((p) => ctx.url.pathname.startsWith(p)), middleware)
46
- }
@@ -1,87 +0,0 @@
1
- import type { CacheEntry, CacheStore } from "./cache.ts"
2
- import {
3
- buildRedisKey,
4
- deleteExpiredRedisKeys,
5
- stripRedisPrefix,
6
- type RedisLikeClient,
7
- } from "./redis-client.ts"
8
-
9
- interface RedisCacheStoreOptions {
10
- prefix?: string
11
- maxEntryAgeMs?: number
12
- }
13
-
14
- interface StoredCacheEntry {
15
- entry: CacheEntry
16
- }
17
-
18
- function isExpired(entry: CacheEntry, maxEntryAgeMs: number): boolean {
19
- return Date.now() - entry.createdAt > maxEntryAgeMs
20
- }
21
-
22
- export function createRedisCacheStore(
23
- client: RedisLikeClient,
24
- options: RedisCacheStoreOptions = {},
25
- ): CacheStore & { deleteExpired(): Promise<number> } {
26
- const prefix = options.prefix ?? "gorsee:cache"
27
- const maxEntryAgeMs = options.maxEntryAgeMs ?? 24 * 60 * 60 * 1000
28
-
29
- return {
30
- async get(key) {
31
- const raw = await client.get(buildRedisKey(prefix, key))
32
- if (!raw) return undefined
33
- const payload = JSON.parse(raw) as StoredCacheEntry
34
- if (isExpired(payload.entry, maxEntryAgeMs)) {
35
- await client.del(buildRedisKey(prefix, key))
36
- return undefined
37
- }
38
- return payload.entry
39
- },
40
- async set(key, entry) {
41
- const redisKey = buildRedisKey(prefix, key)
42
- await client.set(redisKey, JSON.stringify({ entry } satisfies StoredCacheEntry))
43
- if (client.expire) {
44
- await client.expire(redisKey, Math.max(1, Math.ceil(maxEntryAgeMs / 1000)))
45
- }
46
- },
47
- async delete(key) {
48
- await client.del(buildRedisKey(prefix, key))
49
- },
50
- async clear() {
51
- const keys = await client.keys(`${prefix}:*`)
52
- if (keys.length === 0) return
53
- for (const key of keys) await client.del(key)
54
- },
55
- async keys() {
56
- const keys = await client.keys(`${prefix}:*`)
57
- const visibleKeys: string[] = []
58
- for (const key of keys) {
59
- const raw = await client.get(key)
60
- if (!raw) continue
61
- const payload = JSON.parse(raw) as StoredCacheEntry
62
- if (isExpired(payload.entry, maxEntryAgeMs)) {
63
- await client.del(key)
64
- continue
65
- }
66
- visibleKeys.push(stripRedisPrefix(prefix, key))
67
- }
68
- return visibleKeys
69
- },
70
- async deleteExpired() {
71
- return deleteExpiredRedisKeys(
72
- client,
73
- `${prefix}:*`,
74
- Date.now(),
75
- (raw) => {
76
- try {
77
- const payload = JSON.parse(raw) as StoredCacheEntry
78
- return payload.entry.createdAt
79
- } catch {
80
- return undefined
81
- }
82
- },
83
- maxEntryAgeMs,
84
- )
85
- },
86
- }
87
- }