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,97 +0,0 @@
1
- import { createSignal, type SignalGetter } from "./signal.ts"
2
-
3
- export interface LiveOptions<T> {
4
- url: string
5
- initialValue: T
6
- transform?: (data: unknown) => T
7
- reconnect?: boolean
8
- reconnectDelay?: number
9
- }
10
-
11
- export interface LiveSignal<T> {
12
- readonly value: SignalGetter<T>
13
- readonly connected: SignalGetter<boolean>
14
- send: (data: unknown) => void
15
- close: () => void
16
- }
17
-
18
- export function createLive<T>(options: LiveOptions<T>): LiveSignal<T> {
19
- const {
20
- url,
21
- initialValue,
22
- transform,
23
- reconnect = true,
24
- reconnectDelay = 1000,
25
- } = options
26
-
27
- const [value, setValue] = createSignal<T>(initialValue)
28
- const [connected, setConnected] = createSignal(false)
29
-
30
- let ws: WebSocket | null = null
31
- let closed = false
32
- let retryCount = 0
33
-
34
- function handleMessage(event: MessageEvent): void {
35
- try {
36
- const parsed: unknown = JSON.parse(String(event.data))
37
- const result = transform ? transform(parsed) : (parsed as T)
38
- setValue(result)
39
- } catch {
40
- // ignore malformed messages
41
- }
42
- }
43
-
44
- function handleOpen(): void {
45
- retryCount = 0
46
- setConnected(true)
47
- }
48
-
49
- function handleClose(): void {
50
- setConnected(false)
51
- ws = null
52
- if (!closed && reconnect) {
53
- scheduleReconnect()
54
- }
55
- }
56
-
57
- function scheduleReconnect(): void {
58
- const delay = Math.min(reconnectDelay * 2 ** retryCount, 30_000)
59
- retryCount++
60
- setTimeout(connect, delay)
61
- }
62
-
63
- function connect(): void {
64
- if (closed) return
65
- if (typeof globalThis.WebSocket === "undefined") return
66
-
67
- ws = new WebSocket(url)
68
- ws.addEventListener("open", handleOpen)
69
- ws.addEventListener("message", handleMessage)
70
- ws.addEventListener("close", handleClose)
71
- ws.addEventListener("error", () => {
72
- // error triggers close, handled there
73
- })
74
- }
75
-
76
- function send(data: unknown): void {
77
- if (ws && ws.readyState === WebSocket.OPEN) {
78
- ws.send(JSON.stringify(data))
79
- }
80
- }
81
-
82
- function close(): void {
83
- closed = true
84
- if (ws) {
85
- ws.close()
86
- ws = null
87
- }
88
- setConnected(false)
89
- }
90
-
91
- // Only connect in browser environment
92
- if (typeof globalThis.WebSocket !== "undefined") {
93
- connect()
94
- }
95
-
96
- return { value, connected, send, close }
97
- }
@@ -1,83 +0,0 @@
1
- // Optimistic mutations — update UI instantly, rollback on server error
2
- // Killer feature: no framework has this built-in at reactive level
3
-
4
- import { createSignal, type SignalGetter } from "./signal.ts"
5
-
6
- export interface MutationOptions<T, V> {
7
- mutationFn: (variables: V) => Promise<T>
8
- onSuccess?: (data: T, variables: V) => void
9
- onError?: (error: Error, variables: V) => void
10
- onSettled?: (data: T | undefined, error: Error | undefined) => void
11
- }
12
-
13
- export interface MutationState<T> {
14
- readonly data: SignalGetter<T | undefined>
15
- readonly error: SignalGetter<Error | undefined>
16
- readonly isPending: SignalGetter<boolean>
17
- }
18
-
19
- export interface Mutation<T, V> extends MutationState<T> {
20
- mutate: (variables: V) => Promise<T>
21
- /** Optimistic: update signal immediately, rollback if server fails */
22
- optimistic: <S>(
23
- signal: SignalGetter<S>,
24
- setter: (current: S) => void,
25
- update: (current: S, variables: V) => S,
26
- variables: V,
27
- ) => Promise<T>
28
- reset: () => void
29
- }
30
-
31
- export function createMutation<T, V = void>(
32
- options: MutationOptions<T, V>,
33
- ): Mutation<T, V> {
34
- const [data, setData] = createSignal<T | undefined>(undefined)
35
- const [error, setError] = createSignal<Error | undefined>(undefined)
36
- const [isPending, setIsPending] = createSignal(false)
37
-
38
- async function mutate(variables: V): Promise<T> {
39
- setIsPending(true)
40
- setError(undefined)
41
- try {
42
- const result = await options.mutationFn(variables)
43
- setData(result)
44
- options.onSuccess?.(result, variables)
45
- options.onSettled?.(result, undefined)
46
- return result
47
- } catch (err) {
48
- const e = err instanceof Error ? err : new Error(String(err))
49
- setError(e)
50
- options.onError?.(e, variables)
51
- options.onSettled?.(undefined, e)
52
- throw e
53
- } finally {
54
- setIsPending(false)
55
- }
56
- }
57
-
58
- async function optimistic<S>(
59
- signal: SignalGetter<S>,
60
- setter: (val: S) => void,
61
- update: (current: S, variables: V) => S,
62
- variables: V,
63
- ): Promise<T> {
64
- const previous = signal()
65
- // Apply optimistic update immediately
66
- setter(update(previous, variables))
67
- try {
68
- return await mutate(variables)
69
- } catch (err) {
70
- // Rollback on failure
71
- setter(previous)
72
- throw err
73
- }
74
- }
75
-
76
- function reset(): void {
77
- setData(undefined)
78
- setError(undefined)
79
- setIsPending(false)
80
- }
81
-
82
- return { data, error, isPending, mutate, optimistic, reset }
83
- }
@@ -1,138 +0,0 @@
1
- import { createSignal, type SignalGetter } from "./signal.ts"
2
-
3
- export interface ResourceOptions {
4
- /** Initial data (skip first fetch) */
5
- initialData?: unknown
6
- /** Retry count on failure (default: 0) */
7
- retry?: number
8
- /** Retry delay in ms (default: 1000) */
9
- retryDelay?: number
10
- /** Cache key for deduplication */
11
- key?: string
12
- /** Stale time in ms — refetch after this period */
13
- staleTime?: number
14
- }
15
-
16
- export interface ResourceState<T> {
17
- loading: SignalGetter<boolean>
18
- error: SignalGetter<Error | undefined>
19
- refetch: () => void
20
- mutate: (value: T | ((prev: T | undefined) => T)) => void
21
- }
22
-
23
- export type ResourceReturn<T> = [SignalGetter<T | undefined>, ResourceState<T>]
24
-
25
- // Simple in-memory cache for resource deduplication
26
- interface CacheEntry {
27
- data: unknown
28
- fetchedAt: number
29
- promise?: Promise<unknown>
30
- }
31
-
32
- const resourceCache = new Map<string, CacheEntry>()
33
-
34
- export function invalidateResource(key: string): void {
35
- resourceCache.delete(key)
36
- }
37
-
38
- export function invalidateAll(): void {
39
- resourceCache.clear()
40
- }
41
-
42
- export function createResource<T>(
43
- fetcher: () => Promise<T>,
44
- options?: ResourceOptions,
45
- ): ResourceReturn<T> {
46
- const retryCount = options?.retry ?? 0
47
- const retryDelay = options?.retryDelay ?? 1000
48
- const cacheKey = options?.key
49
- const staleTime = options?.staleTime
50
-
51
- // Check cache
52
- const cached = cacheKey ? resourceCache.get(cacheKey) : undefined
53
- const hasValidCache = cached && staleTime && (Date.now() - cached.fetchedAt < staleTime)
54
- const initialValue = hasValidCache ? cached.data as T : options?.initialData as T | undefined
55
-
56
- const [data, setData] = createSignal<T | undefined>(initialValue)
57
- const [loading, setLoading] = createSignal(!hasValidCache)
58
- const [error, setError] = createSignal<Error | undefined>(undefined)
59
-
60
- async function fetchWithRetry(attempt: number): Promise<T> {
61
- try {
62
- return await fetcher()
63
- } catch (err) {
64
- if (attempt < retryCount) {
65
- await new Promise((r) => setTimeout(r, retryDelay * (attempt + 1)))
66
- return fetchWithRetry(attempt + 1)
67
- }
68
- throw err
69
- }
70
- }
71
-
72
- const load = () => {
73
- // Deduplicate: if another resource with same key is already fetching, reuse promise
74
- if (cacheKey) {
75
- const entry = resourceCache.get(cacheKey)
76
- if (entry?.promise) {
77
- entry.promise.then((result) => {
78
- setData(() => result as T)
79
- setLoading(false)
80
- }).catch((err) => {
81
- setError(err instanceof Error ? err : new Error(String(err)))
82
- setLoading(false)
83
- })
84
- return
85
- }
86
- }
87
-
88
- setLoading(true)
89
- setError(undefined)
90
-
91
- const promise = fetchWithRetry(0)
92
-
93
- // Store promise in cache for dedup
94
- if (cacheKey) {
95
- const entry = resourceCache.get(cacheKey) ?? { data: undefined, fetchedAt: 0 }
96
- entry.promise = promise
97
- resourceCache.set(cacheKey, entry)
98
- }
99
-
100
- promise
101
- .then((result) => {
102
- setData(() => result)
103
- setLoading(false)
104
- if (cacheKey) {
105
- resourceCache.set(cacheKey, { data: result, fetchedAt: Date.now() })
106
- }
107
- })
108
- .catch((err) => {
109
- setError(err instanceof Error ? err : new Error(String(err)))
110
- setLoading(false)
111
- if (cacheKey) {
112
- const entry = resourceCache.get(cacheKey)
113
- if (entry) entry.promise = undefined
114
- }
115
- })
116
- }
117
-
118
- // Don't fetch if we have valid cache
119
- if (!hasValidCache) {
120
- load()
121
- }
122
-
123
- return [
124
- data,
125
- {
126
- loading,
127
- error,
128
- refetch: load,
129
- mutate: (value) => {
130
- if (typeof value === "function") {
131
- setData(value as (prev: T | undefined) => T)
132
- } else {
133
- setData(() => value)
134
- }
135
- },
136
- },
137
- ]
138
- }
@@ -1,20 +0,0 @@
1
- import { signal as alienSignal } from "alien-signals"
2
-
3
- export type SignalGetter<T> = () => T
4
- export type SignalSetter<T> = (value: T | ((prev: T) => T)) => void
5
-
6
- export function createSignal<T>(initialValue: T): [SignalGetter<T>, SignalSetter<T>] {
7
- const s = alienSignal(initialValue)
8
-
9
- const getter: SignalGetter<T> = () => s()
10
-
11
- const setter: SignalSetter<T> = (value) => {
12
- if (typeof value === "function") {
13
- s((value as (prev: T) => T)(s()))
14
- } else {
15
- s(value)
16
- }
17
- }
18
-
19
- return [getter, setter]
20
- }
@@ -1,36 +0,0 @@
1
- import { createSignal, type SignalGetter, type SignalSetter } from "./signal.ts"
2
-
3
- export type Store<T extends Record<string, unknown>> = {
4
- readonly [K in keyof T]: SignalGetter<T[K]>
5
- }
6
-
7
- export type SetStore<T extends Record<string, unknown>> = <K extends keyof T>(
8
- key: K,
9
- value: T[K] | ((prev: T[K]) => T[K])
10
- ) => void
11
-
12
- export function createStore<T extends Record<string, unknown>>(
13
- initialValue: T
14
- ): [Store<T>, SetStore<T>] {
15
- const signals = new Map<keyof T, [SignalGetter<unknown>, SignalSetter<unknown>]>()
16
-
17
- for (const key of Object.keys(initialValue) as (keyof T)[]) {
18
- signals.set(key, createSignal<unknown>(initialValue[key]))
19
- }
20
-
21
- const store = new Proxy({} as Store<T>, {
22
- get(_target, prop: string) {
23
- const entry = signals.get(prop as keyof T)
24
- if (!entry) return undefined
25
- return entry[0]
26
- },
27
- })
28
-
29
- const setStore: SetStore<T> = (key, value) => {
30
- const entry = signals.get(key)
31
- if (!entry) return
32
- entry[1](value as unknown)
33
- }
34
-
35
- return [store, setStore]
36
- }
@@ -1,2 +0,0 @@
1
- export { createRouter, type Route } from "./scanner.ts"
2
- export { matchRoute, buildStaticMap, type MatchResult } from "./matcher.ts"
@@ -1,53 +0,0 @@
1
- import type { Route } from "./scanner.ts"
2
-
3
- export interface MatchResult {
4
- route: Route
5
- params: Record<string, string>
6
- }
7
-
8
- // Pre-build a lookup map for static routes (O(1) matching)
9
- export function buildStaticMap(routes: Route[]): Map<string, Route> {
10
- const map = new Map<string, Route>()
11
- for (const route of routes) {
12
- if (!route.isDynamic) map.set(route.path, route)
13
- }
14
- return map
15
- }
16
-
17
- export function matchRoute(
18
- routes: Route[],
19
- pathname: string,
20
- staticMap?: Map<string, Route>,
21
- ): MatchResult | null {
22
- // Normalize: remove trailing slash (except root)
23
- const normalized = pathname === "/" ? "/" : pathname.replace(/\/+$/, "")
24
-
25
- // Fast O(1) lookup for static routes
26
- if (staticMap) {
27
- const staticRoute = staticMap.get(normalized)
28
- if (staticRoute) return { route: staticRoute, params: {} }
29
- }
30
-
31
- // Fallback to regex matching for dynamic routes
32
- for (const route of routes) {
33
- if (!route.isDynamic && staticMap) continue
34
- const match = route.pattern.exec(normalized)
35
- if (!match) continue
36
-
37
- const params: Record<string, string> = {}
38
- for (let i = 0; i < route.params.length; i++) {
39
- const value = match[i + 1]
40
- if (value !== undefined) {
41
- try {
42
- params[route.params[i]!] = decodeURIComponent(value)
43
- } catch {
44
- params[route.params[i]!] = value
45
- }
46
- }
47
- }
48
-
49
- return { route, params }
50
- }
51
-
52
- return null
53
- }
@@ -1,206 +0,0 @@
1
- // Route scanner -- reads routes/ directory, builds route tree
2
-
3
- import { readdir, stat } from "node:fs/promises"
4
- import { join, extname, basename } from "node:path"
5
-
6
- export interface Route {
7
- path: string
8
- pattern: RegExp
9
- filePath: string
10
- isDynamic: boolean
11
- params: string[]
12
- layoutPath: string | null
13
- layoutPaths: string[]
14
- middlewarePath: string | null
15
- middlewarePaths: string[]
16
- errorPath: string | null
17
- loadingPath: string | null
18
- }
19
-
20
- const ROUTE_EXTENSIONS = new Set([".tsx", ".ts"])
21
- const IGNORED_PREFIXES = ["_"]
22
-
23
- function fileToRoutePath(relativePath: string): string {
24
- let route = relativePath
25
- .replace(/\\/g, "/")
26
- .replace(/\.(tsx?|jsx?)$/, "")
27
-
28
- // index files -> parent path
29
- if (route === "index" || route.endsWith("/index")) {
30
- route = route.slice(0, -"index".length) || "/"
31
- }
32
-
33
- if (!route.startsWith("/")) route = "/" + route
34
- // Remove trailing slash (except root)
35
- if (route.length > 1 && route.endsWith("/")) route = route.slice(0, -1)
36
- return route
37
- }
38
-
39
- function routeToPattern(routePath: string): { pattern: RegExp; params: string[] } {
40
- const params: string[] = []
41
-
42
- const regexStr = routePath
43
- .split("/")
44
- .map((segment) => {
45
- if (!segment) return ""
46
-
47
- // catch-all: [...path]
48
- if (segment.startsWith("[...") && segment.endsWith("]")) {
49
- const param = segment.slice(4, -1)
50
- params.push(param)
51
- return "(?:/(.+))?"
52
- }
53
-
54
- // dynamic: [id]
55
- if (segment.startsWith("[") && segment.endsWith("]")) {
56
- const param = segment.slice(1, -1)
57
- params.push(param)
58
- return "/([^/]+)"
59
- }
60
-
61
- return "/" + segment.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
62
- })
63
- .join("")
64
-
65
- const finalRegex = regexStr || "/"
66
- return {
67
- pattern: new RegExp(`^${finalRegex}$`),
68
- params,
69
- }
70
- }
71
-
72
- interface ScanMaps {
73
- layouts: Map<string, string>
74
- middlewares: Map<string, string>
75
- errors: Map<string, string>
76
- loadings: Map<string, string>
77
- }
78
-
79
- async function scanDirectory(
80
- dir: string,
81
- basePath: string,
82
- routes: Route[],
83
- parent?: ScanMaps,
84
- ): Promise<ScanMaps> {
85
- const layouts = new Map<string, string>(parent?.layouts)
86
- const middlewares = new Map<string, string>(parent?.middlewares)
87
-
88
- let entries: string[]
89
- try {
90
- entries = await readdir(dir)
91
- } catch {
92
- return { layouts, middlewares, errors: new Map(), loadings: new Map() }
93
- }
94
-
95
- // First pass: find layouts, middleware, error boundaries, and loading states
96
- const errors = new Map<string, string>(parent?.errors)
97
- const loadings = new Map<string, string>(parent?.loadings)
98
- for (const entry of entries) {
99
- const fullPath = join(dir, entry)
100
- const name = basename(entry, extname(entry))
101
-
102
- if (name === "_layout") {
103
- layouts.set(basePath || "/", fullPath)
104
- }
105
- if (name === "_middleware") {
106
- middlewares.set(basePath || "/", fullPath)
107
- }
108
- if (name === "_error") {
109
- errors.set(basePath || "/", fullPath)
110
- }
111
- if (name === "_loading") {
112
- loadings.set(basePath || "/", fullPath)
113
- }
114
- }
115
-
116
- // Second pass: process routes and subdirectories
117
- for (const entry of entries) {
118
- const fullPath = join(dir, entry)
119
- const entryStat = await stat(fullPath)
120
- const name = basename(entry, extname(entry))
121
-
122
- if (entryStat.isDirectory()) {
123
- // Route groups: (group) directories don't add to URL path
124
- const isGroup = entry.startsWith("(") && entry.endsWith(")")
125
- const subPath = isGroup ? basePath : (basePath ? `${basePath}/${entry}` : entry)
126
- const sub = await scanDirectory(fullPath, subPath, routes, { layouts, middlewares, errors, loadings })
127
- for (const [k, v] of sub.layouts) layouts.set(k, v)
128
- for (const [k, v] of sub.middlewares) middlewares.set(k, v)
129
- for (const [k, v] of sub.errors) errors.set(k, v)
130
- for (const [k, v] of sub.loadings) loadings.set(k, v)
131
- continue
132
- }
133
-
134
- if (!ROUTE_EXTENSIONS.has(extname(entry))) continue
135
- if (IGNORED_PREFIXES.some((p) => name.startsWith(p))) continue
136
-
137
- const relPath = basePath ? `${basePath}/${entry}` : entry
138
- const routePath = fileToRoutePath(relPath)
139
- const { pattern, params } = routeToPattern(routePath)
140
-
141
- // Build middleware chain: collect from root → current directory
142
- const middlewarePaths: string[] = []
143
- const segments = (basePath || "/").split("/").filter(Boolean)
144
- const dirs = ["/"]
145
- for (let i = 0; i < segments.length; i++) {
146
- dirs.push(segments.slice(0, i + 1).join("/"))
147
- }
148
- for (const d of dirs) {
149
- const mwPath = middlewares.get(d)
150
- if (mwPath) middlewarePaths.push(mwPath)
151
- }
152
-
153
- // Build layout chain: collect from root → current directory
154
- const layoutPaths: string[] = []
155
- for (const d of dirs) {
156
- const lPath = layouts.get(d)
157
- if (lPath) layoutPaths.push(lPath)
158
- }
159
-
160
- // Find nearest loading component (walk up)
161
- let loadingPath: string | null = null
162
- for (let i = dirs.length - 1; i >= 0; i--) {
163
- const lp = loadings.get(dirs[i]!)
164
- if (lp) { loadingPath = lp; break }
165
- }
166
-
167
- // Find nearest error boundary (walk up)
168
- let errorPath: string | null = null
169
- for (let i = dirs.length - 1; i >= 0; i--) {
170
- const ep = errors.get(dirs[i]!)
171
- if (ep) { errorPath = ep; break }
172
- }
173
-
174
- routes.push({
175
- path: routePath,
176
- pattern,
177
- filePath: fullPath,
178
- isDynamic: params.length > 0,
179
- params,
180
- layoutPath: layoutPaths[layoutPaths.length - 1] ?? null,
181
- layoutPaths,
182
- middlewarePath: middlewarePaths[middlewarePaths.length - 1] ?? null,
183
- middlewarePaths,
184
- errorPath,
185
- loadingPath,
186
- })
187
- }
188
-
189
- return { layouts, middlewares, errors, loadings }
190
- }
191
-
192
- export async function createRouter(routesDir: string): Promise<Route[]> {
193
- const routes: Route[] = []
194
- await scanDirectory(routesDir, "", routes)
195
-
196
- // Sort: static routes first, then dynamic, then catch-all
197
- routes.sort((a, b) => {
198
- if (a.isDynamic !== b.isDynamic) return a.isDynamic ? 1 : -1
199
- const aCatchAll = a.path.includes("[...")
200
- const bCatchAll = b.path.includes("[...")
201
- if (aCatchAll !== bCatchAll) return aCatchAll ? 1 : -1
202
- return a.path.localeCompare(b.path)
203
- })
204
-
205
- return routes
206
- }
@@ -1,28 +0,0 @@
1
- // Client-side rendering and hydration
2
-
3
- import type { GorseeNode } from "./jsx-runtime.ts"
4
- import { enterHydration, exitHydration } from "./hydration.ts"
5
- import { replayEvents } from "./event-replay.ts"
6
-
7
- function insertResult(container: Element, result: GorseeNode): void {
8
- if (result instanceof Node) {
9
- container.appendChild(result)
10
- } else if (Array.isArray(result)) {
11
- for (const child of result) insertResult(container, child)
12
- }
13
- }
14
-
15
- export function render(component: () => GorseeNode, container: Element): void {
16
- container.replaceChildren()
17
- insertResult(container, component())
18
- }
19
-
20
- export function hydrate(component: () => GorseeNode, container: Element): void {
21
- // Cursor-based hydration: walks server-rendered DOM, attaches bindings
22
- enterHydration(container)
23
- component()
24
- exitHydration()
25
-
26
- // Replay events captured before hydration
27
- replayEvents(container)
28
- }
@@ -1,35 +0,0 @@
1
- // Client-side ErrorBoundary component
2
- // Catches errors during rendering and shows fallback UI
3
-
4
- import { createSignal } from "../reactive/signal.ts"
5
-
6
- export interface ErrorBoundaryProps {
7
- fallback: unknown | ((error: Error) => unknown)
8
- children: unknown
9
- }
10
-
11
- export function ErrorBoundary(props: ErrorBoundaryProps): unknown {
12
- const [error, setError] = createSignal<Error | null>(null)
13
-
14
- try {
15
- // Try to evaluate children
16
- const children = typeof props.children === "function"
17
- ? (props.children as Function)()
18
- : props.children
19
- return () => {
20
- const err = error()
21
- if (err) {
22
- return typeof props.fallback === "function"
23
- ? (props.fallback as (e: Error) => unknown)(err)
24
- : props.fallback
25
- }
26
- return children
27
- }
28
- } catch (err) {
29
- const errObj = err instanceof Error ? err : new Error(String(err))
30
- setError(errObj)
31
- return typeof props.fallback === "function"
32
- ? (props.fallback as (e: Error) => unknown)(errObj)
33
- : props.fallback
34
- }
35
- }