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,49 +0,0 @@
1
- // Form utilities for server actions
2
- // Provides useFormAction for client-side form handling with progressive enhancement
3
-
4
- import { createSignal, type SignalGetter } from "../reactive/signal.ts"
5
-
6
- export interface FormState<T = unknown> {
7
- submitting: SignalGetter<boolean>
8
- error: SignalGetter<string | undefined>
9
- data: SignalGetter<T | undefined>
10
- submit: (formData: FormData | Record<string, string>) => Promise<void>
11
- }
12
-
13
- export function useFormAction<T = unknown>(actionUrl?: string): FormState<T> {
14
- const [submitting, setSubmitting] = createSignal(false)
15
- const [error, setError] = createSignal<string | undefined>(undefined)
16
- const [data, setData] = createSignal<T | undefined>(undefined)
17
-
18
- async function submit(input: FormData | Record<string, string>): Promise<void> {
19
- setSubmitting(true)
20
- setError(undefined)
21
-
22
- try {
23
- const url = actionUrl ?? location.pathname
24
- const body = input instanceof FormData ? input : new URLSearchParams(input)
25
-
26
- const res = await fetch(url, {
27
- method: "POST",
28
- body,
29
- headers: {
30
- "Accept": "application/json",
31
- },
32
- })
33
-
34
- const result = await res.json()
35
-
36
- if (result.error) {
37
- setError(result.error)
38
- } else {
39
- setData(() => result.data as T)
40
- }
41
- } catch (err) {
42
- setError(err instanceof Error ? err.message : String(err))
43
- } finally {
44
- setSubmitting(false)
45
- }
46
- }
47
-
48
- return { submitting, error, data, submit }
49
- }
@@ -1,113 +0,0 @@
1
- // <Head> component -- manages document head (title, meta, links)
2
- // Server: collects head elements, injects into HTML shell
3
- // Client: directly manipulates document.head
4
-
5
- interface HeadProps {
6
- children?: unknown
7
- }
8
-
9
- // Server-side head collection
10
- let serverHeadElements: string[] = []
11
-
12
- export function resetServerHead(): void {
13
- serverHeadElements = []
14
- }
15
-
16
- export function getServerHead(): string[] {
17
- return serverHeadElements
18
- }
19
-
20
- export function Head(props: HeadProps): null {
21
- const children = props.children
22
- if (!children) return null
23
-
24
- if (typeof document !== "undefined") {
25
- // Client-side: apply to document.head
26
- applyClientHead(children)
27
- } else {
28
- // Server-side: collect for injection
29
- collectServerHead(children)
30
- }
31
-
32
- return null
33
- }
34
-
35
- interface VNode {
36
- type: string
37
- props: Record<string, unknown>
38
- }
39
-
40
- function isVNode(v: unknown): v is VNode {
41
- return typeof v === "object" && v !== null && "type" in v && "props" in v
42
- }
43
-
44
- function collectServerHead(children: unknown): void {
45
- if (Array.isArray(children)) {
46
- for (const child of children) collectServerHead(child)
47
- return
48
- }
49
- if (!isVNode(children)) return
50
-
51
- const { type, props } = children
52
- if (type === "title" && props.children) {
53
- serverHeadElements.push(`<title>${String(props.children)}</title>`)
54
- return
55
- }
56
-
57
- // Self-closing tags: meta, link, base
58
- let tag = `<${type}`
59
- for (const [key, value] of Object.entries(props)) {
60
- if (key === "children") continue
61
- if (value != null) tag += ` ${key}="${String(value)}"`
62
- }
63
- if (props.children) {
64
- tag += `>${String(props.children)}</${type}>`
65
- } else {
66
- tag += ` />`
67
- }
68
- serverHeadElements.push(tag)
69
- }
70
-
71
- function applyClientHead(children: unknown): void {
72
- if (Array.isArray(children)) {
73
- for (const child of children) applyClientHead(child)
74
- return
75
- }
76
- if (!isVNode(children)) return
77
-
78
- const { type, props } = children
79
-
80
- if (type === "title") {
81
- document.title = String(props.children ?? "")
82
- return
83
- }
84
-
85
- if (type === "meta") {
86
- // Find existing meta by name or property
87
- const name = (props.name ?? props.property) as string | undefined
88
- if (name) {
89
- const existing = document.querySelector(`meta[name="${name}"], meta[property="${name}"]`)
90
- if (existing) {
91
- existing.setAttribute("content", String(props.content ?? ""))
92
- return
93
- }
94
- }
95
- const meta = document.createElement("meta")
96
- for (const [key, value] of Object.entries(props)) {
97
- if (key === "children") continue
98
- if (value != null) meta.setAttribute(key, String(value))
99
- }
100
- document.head.appendChild(meta)
101
- return
102
- }
103
-
104
- if (type === "link") {
105
- const el = document.createElement("link")
106
- for (const [key, value] of Object.entries(props)) {
107
- if (key === "children") continue
108
- if (value != null) el.setAttribute(key, String(value))
109
- }
110
- el.dataset.gHead = ""
111
- document.head.appendChild(el)
112
- }
113
- }
@@ -1,30 +0,0 @@
1
- // Shared HTML/attribute escape utilities for SSR
2
-
3
- const HTML_ESCAPE_RE = /[&<>"']/g
4
- const ATTR_ESCAPE_RE = /["&]/g
5
-
6
- const HTML_ESCAPES: Record<string, string> = {
7
- "&": "&amp;", "<": "&lt;", ">": "&gt;",
8
- '"': "&quot;", "'": "&#x27;",
9
- }
10
-
11
- export function escapeHTML(value: string): string {
12
- return value.replace(HTML_ESCAPE_RE, (ch) => HTML_ESCAPES[ch] ?? ch)
13
- }
14
-
15
- export function escapeAttr(value: string): string {
16
- return value.replace(ATTR_ESCAPE_RE, (ch) => HTML_ESCAPES[ch] ?? ch)
17
- }
18
-
19
- export const VOID_ELEMENTS = new Set([
20
- "area", "base", "br", "col", "embed", "hr", "img", "input",
21
- "link", "meta", "param", "source", "track", "wbr",
22
- ])
23
-
24
- export function isSignal(value: unknown): value is () => unknown {
25
- return typeof value === "function" && value.length === 0
26
- }
27
-
28
- export function resolveValue(value: unknown): unknown {
29
- return isSignal(value) ? value() : value
30
- }
@@ -1,95 +0,0 @@
1
- // Hydration context -- cursor-based DOM reuse
2
- // During hydration, jsx() reuses server-rendered DOM nodes
3
- // instead of creating new ones, then attaches reactive bindings
4
-
5
- interface HydrationCursor {
6
- parent: Node
7
- index: number
8
- }
9
-
10
- const stack: HydrationCursor[] = []
11
- let active = false
12
- let mismatches = 0
13
-
14
- export function isHydrating(): boolean {
15
- return active
16
- }
17
-
18
- export function getHydrationMismatches(): number {
19
- return mismatches
20
- }
21
-
22
- export function enterHydration(root: Element): void {
23
- active = true
24
- mismatches = 0
25
- stack.length = 0
26
- stack.push({ parent: root, index: 0 })
27
- }
28
-
29
- export function exitHydration(): void {
30
- active = false
31
- stack.length = 0
32
- if (mismatches > 0 && typeof console !== "undefined") {
33
- console.warn(`[gorsee] Hydration completed with ${mismatches} mismatch(es). Server and client HTML may differ.`)
34
- }
35
- }
36
-
37
- export function claimElement(expectedTag?: string): Element | null {
38
- const cursor = stack[stack.length - 1]
39
- if (!cursor) return null
40
-
41
- // Skip whitespace-only text nodes and comments (server may differ from client)
42
- while (cursor.index < cursor.parent.childNodes.length) {
43
- const node = cursor.parent.childNodes[cursor.index]!
44
- if (node.nodeType === 1) {
45
- // Element node — check tag match if provided
46
- if (expectedTag && (node as Element).tagName.toLowerCase() !== expectedTag.toLowerCase()) {
47
- mismatches++
48
- // Skip mismatched element and continue looking
49
- cursor.index++
50
- continue
51
- }
52
- cursor.index++
53
- return node as Element
54
- }
55
- if (node.nodeType === 3 && node.textContent?.trim() === "") {
56
- cursor.index++
57
- continue
58
- }
59
- if (node.nodeType === 8) {
60
- // Comment node -- skip
61
- cursor.index++
62
- continue
63
- }
64
- break
65
- }
66
- return null
67
- }
68
-
69
- export function claimText(): Text | null {
70
- const cursor = stack[stack.length - 1]
71
- if (!cursor) return null
72
-
73
- while (cursor.index < cursor.parent.childNodes.length) {
74
- const node = cursor.parent.childNodes[cursor.index]!
75
- if (node.nodeType === 3) {
76
- cursor.index++
77
- return node as Text
78
- }
79
- // Skip comments
80
- if (node.nodeType === 8) {
81
- cursor.index++
82
- continue
83
- }
84
- break
85
- }
86
- return null
87
- }
88
-
89
- export function pushCursor(parent: Node): void {
90
- stack.push({ parent, index: 0 })
91
- }
92
-
93
- export function popCursor(): void {
94
- stack.pop()
95
- }
@@ -1,48 +0,0 @@
1
- // <Image> component -- optimized image rendering
2
- // Server: renders <img> with lazy loading, width/height, srcset
3
- // Prevents layout shift with explicit dimensions
4
-
5
- export interface ImageProps {
6
- src: string
7
- alt: string
8
- width?: number
9
- height?: number
10
- loading?: "lazy" | "eager"
11
- priority?: boolean
12
- sizes?: string
13
- class?: string
14
- className?: string
15
- [key: string]: unknown
16
- }
17
-
18
- export function Image(props: ImageProps): unknown {
19
- const {
20
- src,
21
- alt,
22
- width,
23
- height,
24
- loading: loadingProp,
25
- priority,
26
- sizes,
27
- ...rest
28
- } = props
29
-
30
- const loading = priority ? "eager" : (loadingProp ?? "lazy")
31
- const fetchpriority = priority ? "high" : undefined
32
- const decoding = priority ? "sync" : "async"
33
-
34
- const imgProps: Record<string, unknown> = {
35
- src,
36
- alt,
37
- loading,
38
- decoding,
39
- ...rest,
40
- }
41
-
42
- if (width !== undefined) imgProps.width = String(width)
43
- if (height !== undefined) imgProps.height = String(height)
44
- if (sizes) imgProps.sizes = sizes
45
- if (fetchpriority) imgProps.fetchpriority = fetchpriority
46
-
47
- return { type: "img", props: imgProps }
48
- }
@@ -1,12 +0,0 @@
1
- export { Suspense } from "./suspense.ts"
2
- export { render, hydrate } from "./client.ts"
3
- export { enterHydration, exitHydration, isHydrating } from "./hydration.ts"
4
- export { renderToString, ssrJsx, ssrJsxs } from "./server.ts"
5
- export { renderToStream, StreamSuspense, streamJsx, streamJsxs } from "./stream.ts"
6
- export { EVENT_REPLAY_SCRIPT, replayEvents, stopEventCapture } from "./event-replay.ts"
7
- export { Link } from "./link.ts"
8
- export { Head } from "./head.ts"
9
- export { navigate, onNavigate, beforeNavigate, getCurrentPath, prefetch, initRouter, setLoadingElement } from "./router.ts"
10
- export { useFormAction } from "./form.ts"
11
- export { island, isIsland } from "./island.ts"
12
- export { hydrateIslands, registerIsland } from "./island-hydrator.ts"
@@ -1,84 +0,0 @@
1
- // Client-side island hydration
2
- // Scans DOM for data-island elements, hydrates each independently
3
- // Static content around islands stays untouched (zero JS)
4
-
5
- import { enterHydration, exitHydration } from "./hydration.ts"
6
- import { replayEvents } from "./event-replay.ts"
7
-
8
- type IslandLoader = () => Promise<{ default: (props: Record<string, unknown>) => unknown }>
9
-
10
- const islandRegistry = new Map<string, IslandLoader>()
11
-
12
- /** Register an island component loader by name. */
13
- export function registerIsland(name: string, loader: IslandLoader): void {
14
- islandRegistry.set(name, loader)
15
- }
16
-
17
- /** Parse the escaped JSON props from a data-props attribute. */
18
- function parseIslandProps(raw: string): Record<string, unknown> {
19
- try {
20
- return JSON.parse(raw) as Record<string, unknown>
21
- } catch {
22
- console.warn(`[gorsee] Failed to parse island props: ${raw}`)
23
- return {}
24
- }
25
- }
26
-
27
- /** Hydrate a single island element. */
28
- async function hydrateOne(el: Element): Promise<void> {
29
- const name = el.getAttribute("data-island")
30
- if (!name) return
31
-
32
- const loader = islandRegistry.get(name)
33
- if (!loader) {
34
- console.warn(`[gorsee] Island "${name}" not found in registry`)
35
- return
36
- }
37
-
38
- const mod = await loader()
39
- const component = mod.default
40
- const rawProps = el.getAttribute("data-props") ?? "{}"
41
- const props = parseIslandProps(rawProps)
42
-
43
- enterHydration(el as HTMLElement)
44
- component(props)
45
- exitHydration()
46
-
47
- replayEvents(el as HTMLElement)
48
- }
49
-
50
- /**
51
- * Hydrate all island components on the page.
52
- * Finds all elements with data-island attribute and hydrates each independently.
53
- * Lazy islands use IntersectionObserver to defer until visible.
54
- */
55
- export function hydrateIslands(): void {
56
- const islands = document.querySelectorAll("[data-island]")
57
-
58
- for (let i = 0; i < islands.length; i++) {
59
- const el = islands[i]!
60
- const isLazy = el.hasAttribute("data-island-lazy")
61
-
62
- if (isLazy && typeof IntersectionObserver !== "undefined") {
63
- observeLazy(el)
64
- } else {
65
- void hydrateOne(el)
66
- }
67
- }
68
- }
69
-
70
- /** Observe a lazy island and hydrate when it enters the viewport. */
71
- function observeLazy(el: Element): void {
72
- const observer = new IntersectionObserver(
73
- (entries) => {
74
- for (const entry of entries) {
75
- if (entry.isIntersecting) {
76
- observer.unobserve(el)
77
- void hydrateOne(el)
78
- }
79
- }
80
- },
81
- { rootMargin: "200px" },
82
- )
83
- observer.observe(el)
84
- }
@@ -1,88 +0,0 @@
1
- // Island component wrapper -- marks components for client-side hydration
2
- // Usage: export default island(MyComponent) in route files
3
- // Server: renders component with data-island attribute + serialized props
4
- // Client: returns wrapped element for hydration
5
-
6
- import type { VNode } from "./server.ts"
7
-
8
- export interface IslandOptions {
9
- lazy?: boolean // load island JS lazily (IntersectionObserver)
10
- }
11
-
12
- // Symbol to mark island wrappers for identification
13
- export const ISLAND_MARKER = Symbol("gorsee-island")
14
-
15
- interface IslandWrapper<P extends Record<string, unknown>> {
16
- (props: P): unknown
17
- [ISLAND_MARKER]: true
18
- componentName: string
19
- originalComponent: (props: P) => unknown
20
- options: IslandOptions
21
- }
22
-
23
- /**
24
- * Escape a JSON string for safe embedding in HTML data attributes.
25
- * Prevents breaking out of attribute values or injecting HTML.
26
- */
27
- function escapePropsForAttr(json: string): string {
28
- return json
29
- .replace(/&/g, "&amp;")
30
- .replace(/"/g, "&quot;")
31
- .replace(/</g, "&lt;")
32
- .replace(/>/g, "&gt;")
33
- }
34
-
35
- /**
36
- * Wrap a component as an island -- only this component gets hydrated on the client.
37
- * Static surrounding content stays as server-rendered HTML with zero JS.
38
- */
39
- export function island<P extends Record<string, unknown>>(
40
- component: (props: P) => unknown,
41
- options: IslandOptions = {},
42
- ): IslandWrapper<P> {
43
- const name = component.name || "Anonymous"
44
-
45
- const wrapper = function islandWrapper(props: P): unknown {
46
- const propsWithoutChildren = extractSerializableProps(props)
47
- const serialized = escapePropsForAttr(JSON.stringify(propsWithoutChildren))
48
-
49
- const attrs: Record<string, unknown> = {
50
- "data-island": name,
51
- "data-props": serialized,
52
- children: component(props),
53
- }
54
-
55
- if (options.lazy) {
56
- attrs["data-island-lazy"] = "true"
57
- }
58
-
59
- // On server: ssrJsx produces VNode; on client: jsx produces DOM node
60
- // We return a plain object that both renderers understand
61
- return { type: "div", props: attrs } as VNode
62
- }
63
-
64
- wrapper[ISLAND_MARKER] = true as const
65
- wrapper.componentName = name
66
- wrapper.originalComponent = component
67
- wrapper.options = options
68
-
69
- return wrapper
70
- }
71
-
72
- /** Extract only serializable props (skip children, functions, symbols). */
73
- function extractSerializableProps(
74
- props: Record<string, unknown>,
75
- ): Record<string, unknown> {
76
- const result: Record<string, unknown> = {}
77
- for (const key in props) {
78
- if (key === "children") continue
79
- const val = props[key]
80
- if (typeof val === "function" || typeof val === "symbol") continue
81
- result[key] = val
82
- }
83
- return result
84
- }
85
-
86
- export function isIsland(fn: unknown): fn is IslandWrapper<Record<string, unknown>> {
87
- return typeof fn === "function" && ISLAND_MARKER in fn
88
- }
@@ -1,167 +0,0 @@
1
- // Gorsee.js JSX Runtime
2
- // Compiles JSX to direct DOM operations with reactive bindings
3
- // No Virtual DOM -- signals update DOM nodes directly
4
- // Supports hydration mode: reuses server-rendered DOM nodes
5
-
6
- import { createEffect } from "../reactive/effect.ts"
7
- import { isHydrating, claimElement, claimText, pushCursor, popCursor } from "./hydration.ts"
8
- import { isSignal } from "./html-escape.ts"
9
-
10
- export type GorseeNode = Node | string | number | boolean | null | undefined | GorseeNode[]
11
- export type Component = (props: Record<string, unknown>) => GorseeNode
12
-
13
- export const Fragment = Symbol("Fragment")
14
-
15
- export interface JSXElement {
16
- type: string | Component | typeof Fragment
17
- props: Record<string, unknown>
18
- children: unknown[]
19
- }
20
-
21
- function createTextNode(value: unknown): Text {
22
- return document.createTextNode(String(value ?? ""))
23
- }
24
-
25
- function bindProperty(el: HTMLElement, key: string, value: unknown): void {
26
- if (key === "children" || key === "ref") return
27
-
28
- if (key.startsWith("on:")) {
29
- el.addEventListener(key.slice(3), value as EventListener)
30
- return
31
- }
32
-
33
- if (key === "className" || key === "class") {
34
- if (isSignal(value)) {
35
- createEffect(() => { el.className = String(value()) })
36
- } else if (!isHydrating()) {
37
- el.className = String(value ?? "")
38
- }
39
- return
40
- }
41
-
42
- if (key === "style" && typeof value === "object" && value !== null) {
43
- const styles = value as Record<string, unknown>
44
- for (const [prop, val] of Object.entries(styles)) {
45
- if (isSignal(val)) {
46
- const p = prop
47
- createEffect(() => { el.style.setProperty(p, String(val())) })
48
- } else if (!isHydrating()) {
49
- el.style.setProperty(prop, String(val))
50
- }
51
- }
52
- return
53
- }
54
-
55
- if (isSignal(value)) {
56
- createEffect(() => { el.setAttribute(key, String(value())) })
57
- } else if (!isHydrating()) {
58
- if (typeof value === "boolean") {
59
- if (value) el.setAttribute(key, "")
60
- else el.removeAttribute(key)
61
- } else if (value != null) {
62
- el.setAttribute(key, String(value))
63
- }
64
- }
65
- }
66
-
67
- function hydrateChild(parent: Node, child: unknown): void {
68
- if (child == null || typeof child === "boolean") return
69
-
70
- if (Array.isArray(child)) {
71
- for (const c of child) hydrateChild(parent, c)
72
- return
73
- }
74
-
75
- if (typeof child === "function" && isSignal(child)) {
76
- const textNode = claimText() ?? createTextNode(child())
77
- createEffect(() => { textNode.textContent = String(child() ?? "") })
78
- return
79
- }
80
-
81
- if (typeof child === "object" && child instanceof Node) return
82
-
83
- // Static text -- just advance cursor
84
- claimText()
85
- }
86
-
87
- function insertChild(parent: Node, child: unknown): void {
88
- if (child == null || typeof child === "boolean") return
89
-
90
- if (Array.isArray(child)) {
91
- for (const c of child) insertChild(parent, c)
92
- return
93
- }
94
-
95
- if (child instanceof Node) {
96
- parent.appendChild(child)
97
- return
98
- }
99
-
100
- if (isSignal(child)) {
101
- const textNode = createTextNode(child())
102
- parent.appendChild(textNode)
103
- createEffect(() => { textNode.textContent = String(child() ?? "") })
104
- return
105
- }
106
-
107
- parent.appendChild(createTextNode(child))
108
- }
109
-
110
- export function jsx(
111
- type: string | Component | typeof Fragment,
112
- props: Record<string, unknown> | null
113
- ): Node | DocumentFragment {
114
- const allProps = props ?? {}
115
- const children = allProps.children
116
- const hydrating = isHydrating()
117
-
118
- // Fragment
119
- if (type === Fragment) {
120
- if (hydrating) {
121
- if (children != null) hydrateChild(document.createDocumentFragment(), children)
122
- return document.createDocumentFragment()
123
- }
124
- const frag = document.createDocumentFragment()
125
- if (children != null) insertChild(frag, children)
126
- return frag
127
- }
128
-
129
- // Component
130
- if (typeof type === "function") {
131
- const result = type(allProps)
132
- if (result instanceof Node) return result
133
- if (hydrating) return document.createDocumentFragment()
134
- const wrapper = document.createDocumentFragment()
135
- insertChild(wrapper, result)
136
- return wrapper
137
- }
138
-
139
- // HTML element
140
- if (hydrating) {
141
- const el = claimElement() as HTMLElement
142
- if (el) {
143
- // Attach event listeners and reactive bindings to existing element
144
- for (const [key, value] of Object.entries(allProps)) {
145
- if (key !== "children") bindProperty(el, key, value)
146
- }
147
- // Hydrate children
148
- if (children != null) {
149
- pushCursor(el)
150
- hydrateChild(el, children)
151
- popCursor()
152
- }
153
- return el
154
- }
155
- // Fallback: element missing from server HTML, create it
156
- }
157
-
158
- const el = document.createElement(type)
159
- for (const [key, value] of Object.entries(allProps)) {
160
- if (key !== "children") bindProperty(el, key, value)
161
- }
162
- if (children != null) insertChild(el, children)
163
- return el
164
- }
165
-
166
- export const jsxs = jsx
167
- export const jsxDEV = jsx