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
@@ -0,0 +1,573 @@
1
+ import { isAbsolute, join, relative, resolve } from "node:path";
2
+ import { readdir, stat, readFile } from "node:fs/promises";
3
+ import { createRouter } from "../router/scanner.js";
4
+ import { createProjectContext } from "../runtime/project.js";
5
+ import { analyzeFileWithAST } from "./check-ast.js";
6
+ import { initializeCompilerBackends } from "../compiler/init.js";
7
+ import { collectCanonicalImportDrift } from "./canonical-imports.js";
8
+ import { rewriteCanonicalImportsInProject, rewriteLegacyLoadersInProject } from "./canonical-import-rewrite.js";
9
+ import {
10
+ configureAIObservability,
11
+ emitAIDiagnostic,
12
+ emitAIEvent
13
+ } from "../ai/index.js";
14
+ import { loadAppConfig, resolveAIConfig } from "../runtime/app-config.js";
15
+ const MAX_FILE_LINES = 500;
16
+ async function getAllTsFiles(dir) {
17
+ const files = [];
18
+ let entries;
19
+ try {
20
+ entries = await readdir(dir);
21
+ } catch {
22
+ return files;
23
+ }
24
+ for (const entry of entries) {
25
+ if (entry === "node_modules" || entry === "dist" || entry === ".git")
26
+ continue;
27
+ const fullPath = join(dir, entry);
28
+ if ((await stat(fullPath)).isDirectory())
29
+ files.push(...await getAllTsFiles(fullPath));
30
+ else if (entry.endsWith(".ts") || entry.endsWith(".tsx"))
31
+ files.push(fullPath);
32
+ }
33
+ return files;
34
+ }
35
+ async function checkFileSize(file, cwd) {
36
+ const issues = [], lines = (await readFile(file, "utf-8")).split(`
37
+ `).length, rel = relative(cwd, file);
38
+ if (lines > MAX_FILE_LINES)
39
+ issues.push({
40
+ code: "E901",
41
+ file: rel,
42
+ message: `File has ${lines} lines (limit: ${MAX_FILE_LINES}). Must split before merge.`,
43
+ fix: "Extract logic into focused modules by responsibility"
44
+ });
45
+ else if (lines > 300)
46
+ issues.push({
47
+ code: "W901",
48
+ file: rel,
49
+ message: `File has ${lines} lines (warning threshold: 300). Plan to split.`,
50
+ fix: "Consider extracting into separate modules"
51
+ });
52
+ return issues;
53
+ }
54
+ async function checkUnsafePatterns(file, cwd) {
55
+ const issues = [], content = await readFile(file, "utf-8"), astFacts = await analyzeFileWithAST(file, cwd, content);
56
+ if (astFacts) {
57
+ issues.push(...astFacts.issues);
58
+ return issues;
59
+ }
60
+ const lines = content.split(`
61
+ `), rel = relative(cwd, file);
62
+ for (let i = 0;i < lines.length; i++) {
63
+ const line = lines[i], lineNum = i + 1;
64
+ if (line.match(/db\.(get|all|run)\s*\(\s*`/) && !line.includes("SafeSQL"))
65
+ issues.push({
66
+ code: "E001",
67
+ file: rel,
68
+ line: lineNum,
69
+ message: "Raw template literal in database query (SQL injection risk)",
70
+ fix: "Use SafeSQL`...` tagged template: db.get(SafeSQL`SELECT ...`)"
71
+ });
72
+ if (line.match(/db\.(get|all|run)\s*\(\s*["']/) || line.match(/db\.(get|all|run)\s*\([^S]*\+/))
73
+ issues.push({
74
+ code: "E001",
75
+ file: rel,
76
+ line: lineNum,
77
+ message: "String concatenation in database query (SQL injection risk)",
78
+ fix: "Use SafeSQL`...` tagged template with parameterized values"
79
+ });
80
+ if (line.includes(".innerHTML") && !line.includes("unsafeHTML"))
81
+ issues.push({
82
+ code: "E002",
83
+ file: rel,
84
+ line: lineNum,
85
+ message: "Direct innerHTML assignment (XSS risk)",
86
+ fix: "Use SafeHTML`...` or sanitize() from gorsee/types"
87
+ });
88
+ if (!line.includes("ctx.redirect(")) {
89
+ const redirectCall = line.match(/\bredirect\s*\(\s*([^,\)]+)/);
90
+ if (redirectCall) {
91
+ const targetExpr = redirectCall[1].trim();
92
+ if (!(targetExpr.startsWith('"') || targetExpr.startsWith("'") || targetExpr.startsWith("`") || targetExpr.startsWith("/")))
93
+ issues.push({
94
+ code: "W905",
95
+ file: rel,
96
+ line: lineNum,
97
+ message: "Throwable redirect() uses a non-literal target",
98
+ fix: "Prefer ctx.redirect() for user-controlled values or sanitize redirect targets explicitly before throwing redirect()"
99
+ });
100
+ }
101
+ }
102
+ }
103
+ return issues;
104
+ }
105
+ async function collectASTFacts(files, cwd) {
106
+ const facts = new Map;
107
+ for (const file of files) {
108
+ const content = await readFile(file, "utf-8"), ast = await analyzeFileWithAST(file, cwd, content);
109
+ if (ast)
110
+ facts.set(file, ast);
111
+ }
112
+ return facts;
113
+ }
114
+ async function checkProjectStructure(cwd) {
115
+ const issues = [];
116
+ try {
117
+ await stat(join(cwd, "routes"));
118
+ } catch {
119
+ issues.push({
120
+ code: "E902",
121
+ file: ".",
122
+ message: "Missing routes/ directory",
123
+ fix: "Create routes/ directory with at least routes/index.ts"
124
+ });
125
+ }
126
+ try {
127
+ await stat(join(cwd, "app.config.ts"));
128
+ } catch {
129
+ issues.push({
130
+ code: "W902",
131
+ file: ".",
132
+ message: "Missing app.config.ts",
133
+ fix: "Create app.config.ts with project configuration"
134
+ });
135
+ }
136
+ return issues;
137
+ }
138
+ async function checkSecurityContracts(cwd, files, astFacts) {
139
+ const issues = [], appConfigPath = join(cwd, "app.config.ts"), appConfigSource = await tryReadFile(appConfigPath), hasServerCalls = await projectUsesServerFunctions(files, astFacts), hasRouteCacheUsage = await projectUsesRouteCache(files, astFacts), needsTrustedOrigin = await projectNeedsTrustedOrigin(files, astFacts), hasRPCMiddlewares = appConfigDeclaresRPCMiddlewares(appConfigSource), hasTrustedOrigin = appConfigDeclaresTrustedOrigin(appConfigSource);
140
+ if (hasServerCalls && !hasRPCMiddlewares)
141
+ issues.push({
142
+ code: "W903",
143
+ file: "app.config.ts",
144
+ message: "Project uses server() calls but app.config.ts does not declare security.rpc.middlewares",
145
+ fix: "Add security.rpc.middlewares or pass rpcMiddlewares programmatically in dev/prod startup"
146
+ });
147
+ if (hasRouteCacheUsage)
148
+ for (const file of files) {
149
+ if (astFacts.has(file))
150
+ continue;
151
+ const content = await readFile(file, "utf-8"), rel = relative(cwd, file), lines = content.split(`
152
+ `);
153
+ for (let i = 0;i < lines.length; i++) {
154
+ if (!lines[i].includes("routeCache("))
155
+ continue;
156
+ const block = lines.slice(i, Math.min(i + 8, lines.length)).join(`
157
+ `);
158
+ if (!/includeAuthHeaders\s*:|key\s*:|vary\s*:/.test(block))
159
+ issues.push({
160
+ code: "W904",
161
+ file: rel,
162
+ line: i + 1,
163
+ message: "routeCache() is used without explicit public/private cache intent",
164
+ fix: "Set includeAuthHeaders, vary, or key explicitly to document cache boundary"
165
+ });
166
+ }
167
+ }
168
+ if (needsTrustedOrigin && !hasTrustedOrigin)
169
+ issues.push({
170
+ code: "W906",
171
+ file: "app.config.ts",
172
+ message: "Project uses origin-sensitive server features but app.config.ts does not declare security.origin",
173
+ fix: "Add security.origin (or APP_ORIGIN for runtime fallback) so redirects and origin checks use a canonical application origin"
174
+ });
175
+ return issues;
176
+ }
177
+ function checkImportContracts(cwd, astFacts) {
178
+ const issues = [];
179
+ for (const [file, facts] of astFacts) {
180
+ const rel = relative(cwd, file);
181
+ if (facts.importsRootGorsee)
182
+ issues.push({
183
+ code: "W911",
184
+ file: rel,
185
+ message: 'Importing from root "gorsee" weakens canonical client/server boundaries',
186
+ fix: 'Import browser-safe APIs from "gorsee/client", server APIs from "gorsee/server", and use "gorsee/compat" only for explicit compatibility bridges'
187
+ });
188
+ if (facts.hasLegacyLoaderExport)
189
+ issues.push({
190
+ code: "W916",
191
+ file: rel,
192
+ message: 'Route module still exports "loader" instead of canonical "load"',
193
+ fix: 'Rename exported "loader" to "load", or run `gorsee check --rewrite-loaders` / `gorsee upgrade --rewrite-imports` to rewrite obvious cases automatically'
194
+ });
195
+ for (const drift of collectCanonicalImportDrift(facts.imports)) {
196
+ const entries = [...drift.replacements.entries()].map(([name, target]) => `${name} -> ${target}`).join(", "), targets = [...new Set(drift.replacements.values())].join(", ");
197
+ issues.push({
198
+ code: drift.source === "gorsee/server" ? "W914" : "W915",
199
+ file: rel,
200
+ message: `Domain APIs imported from "${drift.source}" should use scoped stable subpaths: ${entries}`,
201
+ fix: drift.source === "gorsee/server" ? `Keep runtime primitives on "gorsee/server" and move domain imports to scoped entrypoints such as ${targets}` : `Keep browser runtime primitives on "gorsee/client" and move domain imports to scoped entrypoints such as ${targets}`
202
+ });
203
+ }
204
+ }
205
+ return issues;
206
+ }
207
+ async function checkDependencyPolicy(cwd) {
208
+ const issues = [], packageJsonPath = join(cwd, "package.json"), packageJsonSource = await tryReadFile(packageJsonPath);
209
+ if (!packageJsonSource)
210
+ return issues;
211
+ try {
212
+ const pkg = JSON.parse(packageJsonSource), workspaceContext = await findWorkspaceDependencyContext(cwd), effectivePackageManager = pkg.packageManager ?? workspaceContext?.packageManager ?? null, lockfileSource = workspaceContext?.lockfileSource ?? await tryReadFile(join(cwd, "bun.lock")), lockfileLabel = workspaceContext?.lockfileLabel ?? "bun.lock";
213
+ if (!effectivePackageManager || !/^bun@\d+\.\d+\.\d+$/.test(effectivePackageManager))
214
+ issues.push({
215
+ code: "W910",
216
+ file: "package.json",
217
+ message: "package.json should declare an exact Bun packageManager version",
218
+ fix: 'Set packageManager to an exact Bun version such as "bun@1.3.9" (on the app package or workspace root)'
219
+ });
220
+ for (const field of ["dependencies", "optionalDependencies"])
221
+ for (const [name, version] of Object.entries(pkg[field] ?? {}))
222
+ if (/^[\^~><=*]/.test(version))
223
+ issues.push({
224
+ code: "W907",
225
+ file: "package.json",
226
+ message: `Runtime dependency ${name} uses non-pinned version ${version}`,
227
+ fix: "Pin runtime dependency versions exactly to reduce supply-chain drift in production builds"
228
+ });
229
+ if (!lockfileSource) {
230
+ issues.push({
231
+ code: "W909",
232
+ file: lockfileLabel,
233
+ message: "Missing bun.lock for a Bun project",
234
+ fix: "Commit bun.lock so runtime dependency resolution is reproducible"
235
+ });
236
+ return issues;
237
+ }
238
+ const runtimeDeps = {
239
+ ...pkg.dependencies ?? {},
240
+ ...pkg.optionalDependencies ?? {}
241
+ };
242
+ for (const [name, version] of Object.entries(runtimeDeps)) {
243
+ if (version.startsWith("workspace:"))
244
+ continue;
245
+ const resolved = readLockedPackageVersion(lockfileSource, name);
246
+ if (!resolved) {
247
+ issues.push({
248
+ code: "W909",
249
+ file: lockfileLabel,
250
+ message: `bun.lock does not contain resolved package metadata for ${name}`,
251
+ fix: "Regenerate and commit bun.lock after updating runtime dependencies"
252
+ });
253
+ continue;
254
+ }
255
+ if (normalizeDependencyVersion(cwd, resolved) !== normalizeDependencyVersion(cwd, version))
256
+ issues.push({
257
+ code: "W909",
258
+ file: lockfileLabel,
259
+ message: `bun.lock resolves ${name}@${resolved} but package.json pins ${version}`,
260
+ fix: "Regenerate bun.lock or align package.json with the locked runtime dependency version"
261
+ });
262
+ }
263
+ } catch {
264
+ issues.push({
265
+ code: "W907",
266
+ file: "package.json",
267
+ message: "Could not parse package.json for dependency policy checks",
268
+ fix: "Ensure package.json is valid JSON"
269
+ });
270
+ }
271
+ return issues;
272
+ }
273
+ async function findWorkspaceDependencyContext(cwd) {
274
+ let current = resolve(cwd);
275
+ while (!0) {
276
+ const parent = resolve(current, "..");
277
+ if (parent === current)
278
+ return null;
279
+ const packageJsonSource = await tryReadFile(join(parent, "package.json"));
280
+ if (packageJsonSource)
281
+ try {
282
+ const pkg = JSON.parse(packageJsonSource);
283
+ if (Array.isArray(pkg.workspaces) || typeof pkg.workspaces === "object" || pkg.workspaces === !0) {
284
+ const lockfileSource = await tryReadFile(join(parent, "bun.lock"));
285
+ return {
286
+ packageManager: pkg.packageManager ?? null,
287
+ lockfileSource,
288
+ lockfileLabel: relative(cwd, join(parent, "bun.lock")) || "bun.lock"
289
+ };
290
+ }
291
+ } catch {}
292
+ current = parent;
293
+ }
294
+ }
295
+ async function checkTypeScriptContract(cwd) {
296
+ const issues = [], source = await tryReadFile(join(cwd, "tsconfig.json"));
297
+ if (!source)
298
+ return issues;
299
+ try {
300
+ const tsconfig = JSON.parse(source);
301
+ if (tsconfig.compilerOptions?.jsx !== "preserve")
302
+ issues.push({
303
+ code: "W912",
304
+ file: "tsconfig.json",
305
+ message: 'Canonical Gorsee TSX contract expects compilerOptions.jsx to be "preserve"',
306
+ fix: 'Set compilerOptions.jsx to "preserve" so the compiler/runtime pipeline stays aligned with Gorsee JSX semantics'
307
+ });
308
+ if (tsconfig.compilerOptions?.jsxImportSource !== "gorsee")
309
+ issues.push({
310
+ code: "W913",
311
+ file: "tsconfig.json",
312
+ message: 'Canonical Gorsee TSX contract expects compilerOptions.jsxImportSource to be "gorsee"',
313
+ fix: 'Set compilerOptions.jsxImportSource to "gorsee" so generated and handwritten route modules resolve the same JSX runtime contract'
314
+ });
315
+ } catch {
316
+ issues.push({
317
+ code: "W914",
318
+ file: "tsconfig.json",
319
+ message: "Could not parse tsconfig.json for canonical TypeScript contract checks",
320
+ fix: "Ensure tsconfig.json is valid JSON"
321
+ });
322
+ }
323
+ return issues;
324
+ }
325
+ async function checkOriginPlaceholderPolicy(cwd) {
326
+ const issues = [], filesToScan = [
327
+ "app.config.ts",
328
+ "wrangler.toml",
329
+ "netlify.toml",
330
+ "fly.toml",
331
+ "vercel.json"
332
+ ], placeholderPatterns = [
333
+ /REPLACE_WITH_APP_ORIGIN/,
334
+ /https:\/\/example\.com/
335
+ ];
336
+ for (const file of filesToScan) {
337
+ const source = await tryReadFile(join(cwd, file));
338
+ if (!source)
339
+ continue;
340
+ if (placeholderPatterns.some((pattern) => pattern.test(source)))
341
+ issues.push({
342
+ code: "W908",
343
+ file,
344
+ message: `${file} still contains placeholder origin values`,
345
+ fix: "Replace placeholder origins with the real canonical application origin before shipping"
346
+ });
347
+ }
348
+ return issues;
349
+ }
350
+ async function projectUsesServerFunctions(files, astFacts) {
351
+ for (const file of files) {
352
+ const ast = astFacts.get(file);
353
+ if (ast) {
354
+ if (ast.hasServerCall)
355
+ return !0;
356
+ continue;
357
+ }
358
+ const content = await readFile(file, "utf-8");
359
+ if (/server\s*\(/.test(content))
360
+ return !0;
361
+ }
362
+ return !1;
363
+ }
364
+ async function projectUsesRouteCache(files, astFacts) {
365
+ for (const file of files) {
366
+ const ast = astFacts.get(file);
367
+ if (ast) {
368
+ if (ast.hasRouteCacheCall)
369
+ return !0;
370
+ continue;
371
+ }
372
+ if ((await readFile(file, "utf-8")).includes("routeCache("))
373
+ return !0;
374
+ }
375
+ return !1;
376
+ }
377
+ async function projectNeedsTrustedOrigin(files, astFacts) {
378
+ for (const file of files) {
379
+ const ast = astFacts.get(file);
380
+ if (ast) {
381
+ if (ast.hasCreateAuthCall || ast.hasRedirectCall || ast.hasCtxRedirectCall || ast.hasServerCall)
382
+ return !0;
383
+ continue;
384
+ }
385
+ const content = await readFile(file, "utf-8");
386
+ if (content.includes("createAuth(") || content.includes("redirect(") || content.includes("ctx.redirect(") || /server\s*\(/.test(content))
387
+ return !0;
388
+ }
389
+ return !1;
390
+ }
391
+ function appConfigDeclaresRPCMiddlewares(source) {
392
+ if (!source)
393
+ return !1;
394
+ return /security\s*:\s*\{[\s\S]*rpc\s*:\s*\{[\s\S]*middlewares\s*:/m.test(source);
395
+ }
396
+ function appConfigDeclaresTrustedOrigin(source) {
397
+ if (!source)
398
+ return !1;
399
+ return /security\s*:\s*\{[\s\S]*origin\s*:/m.test(source);
400
+ }
401
+ function readLockedPackageVersion(lockfileSource, packageName) {
402
+ const escaped = packageName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
403
+ return lockfileSource.match(new RegExp(`"${escaped}": \\["${escaped}@([^"]+)"`))?.[1] ?? null;
404
+ }
405
+ function normalizeDependencyVersion(cwd, version) {
406
+ if (!version.startsWith("file:") && !version.endsWith(".tgz") && !version.startsWith(".") && !version.startsWith("/"))
407
+ return version;
408
+ const rawPath = version.startsWith("file:") ? version.slice(5) : version;
409
+ return `file:${isAbsolute(rawPath) ? rawPath : resolve(cwd, rawPath)}`;
410
+ }
411
+ async function tryReadFile(path) {
412
+ try {
413
+ return await readFile(path, "utf-8");
414
+ } catch {
415
+ return null;
416
+ }
417
+ }
418
+ export async function checkProject(options = {}) {
419
+ const { cwd, paths } = createProjectContext(options);
420
+ initializeCompilerBackends(options.env ?? process.env);
421
+ const runTypeScript = options.runTypeScript ?? !0, strictSecurity = options.strictSecurity ?? !1, rewriteImports = options.rewriteImports ?? !1, rewriteLoaders = options.rewriteLoaders ?? !1, result = { errors: [], warnings: [], info: [] }, appConfig = await loadAppConfig(cwd);
422
+ configureAIObservability(resolveAIConfig(cwd, appConfig, options.ai));
423
+ await emitAIEvent({
424
+ kind: "check.start",
425
+ severity: "info",
426
+ source: "check",
427
+ message: "project check started",
428
+ phase: "check",
429
+ data: { cwd, runTypeScript, strictSecurity, rewriteImports, rewriteLoaders }
430
+ });
431
+ if (rewriteImports) {
432
+ const rewrite = await rewriteCanonicalImportsInProject(cwd);
433
+ result.info.push(rewrite.changedFiles.length > 0 ? `Rewrote canonical imports in ${rewrite.changedFiles.length} file(s)` : "Canonical import rewrite found no changes");
434
+ }
435
+ if (rewriteLoaders) {
436
+ const rewrite = await rewriteLegacyLoadersInProject(cwd);
437
+ result.info.push(rewrite.changedFiles.length > 0 ? `Rewrote legacy loader exports in ${rewrite.changedFiles.length} file(s)` : "Legacy loader rewrite found no changes");
438
+ }
439
+ const structIssues = await checkProjectStructure(cwd);
440
+ for (const issue of structIssues)
441
+ if (issue.code.startsWith("E"))
442
+ result.errors.push(issue);
443
+ else
444
+ result.warnings.push(issue);
445
+ try {
446
+ const routes = await createRouter(paths.routesDir);
447
+ result.info.push(`Found ${routes.length} route(s)`);
448
+ } catch {
449
+ result.info.push("Could not scan routes");
450
+ }
451
+ const files = await getAllTsFiles(paths.routesDir);
452
+ files.push(...await getAllTsFiles(paths.sharedDir));
453
+ files.push(...await getAllTsFiles(paths.middlewareDir));
454
+ const astFacts = await collectASTFacts(files, cwd);
455
+ for (const file of files) {
456
+ const sizeIssues = await checkFileSize(file, cwd), safetyIssues = await checkUnsafePatterns(file, cwd);
457
+ for (const issue of [...sizeIssues, ...safetyIssues])
458
+ pushIssue(result, issue, strictSecurity);
459
+ }
460
+ const securityIssues = await checkSecurityContracts(cwd, files, astFacts);
461
+ for (const issue of securityIssues)
462
+ pushIssue(result, issue, strictSecurity);
463
+ const importIssues = checkImportContracts(cwd, astFacts);
464
+ for (const issue of importIssues)
465
+ pushIssue(result, issue, strictSecurity);
466
+ const dependencyIssues = await checkDependencyPolicy(cwd);
467
+ for (const issue of dependencyIssues)
468
+ pushIssue(result, issue, strictSecurity);
469
+ const tsconfigIssues = await checkTypeScriptContract(cwd);
470
+ for (const issue of tsconfigIssues)
471
+ pushIssue(result, issue, strictSecurity);
472
+ const placeholderIssues = await checkOriginPlaceholderPolicy(cwd);
473
+ for (const issue of placeholderIssues)
474
+ pushIssue(result, issue, strictSecurity);
475
+ if (runTypeScript) {
476
+ const tsc = Bun.spawn(["bun", "x", "tsc", "--noEmit"], {
477
+ cwd,
478
+ stdout: "pipe",
479
+ stderr: "pipe"
480
+ });
481
+ if (await tsc.exited !== 0) {
482
+ const stdout = await new Response(tsc.stdout).text(), details = [(await new Response(tsc.stderr).text()).trim(), stdout.trim()].filter(Boolean).join(`
483
+ `);
484
+ result.errors.push({
485
+ code: "TSC",
486
+ file: ".",
487
+ message: `TypeScript errors:
488
+ ${details}`
489
+ });
490
+ } else
491
+ result.info.push("TypeScript: no errors");
492
+ }
493
+ for (const issue of result.warnings)
494
+ await emitAIDiagnostic({
495
+ code: issue.code,
496
+ message: issue.message,
497
+ severity: "warn",
498
+ source: "check",
499
+ file: issue.file,
500
+ line: issue.line,
501
+ fix: issue.fix
502
+ });
503
+ for (const issue of result.errors)
504
+ await emitAIDiagnostic({
505
+ code: issue.code,
506
+ message: issue.message,
507
+ severity: "error",
508
+ source: "check",
509
+ file: issue.file,
510
+ line: issue.line,
511
+ fix: issue.fix
512
+ });
513
+ await emitAIEvent({
514
+ kind: "check.summary",
515
+ severity: result.errors.length > 0 ? "error" : result.warnings.length > 0 ? "warn" : "info",
516
+ source: "check",
517
+ message: "project check completed",
518
+ phase: "summary",
519
+ data: {
520
+ errors: result.errors.length,
521
+ warnings: result.warnings.length,
522
+ info: result.info.length,
523
+ strictSecurity,
524
+ runTypeScript,
525
+ rewriteImports,
526
+ rewriteLoaders
527
+ }
528
+ });
529
+ return result;
530
+ }
531
+ export async function runCheck(args, options = {}) {
532
+ const strictSecurity = options.strictSecurity ?? args.includes("--strict"), rewriteImports = options.rewriteImports ?? args.includes("--rewrite-imports"), rewriteLoaders = options.rewriteLoaders ?? args.includes("--rewrite-loaders");
533
+ console.log(`
534
+ Gorsee Check
535
+ `);
536
+ if (options.runTypeScript ?? !0)
537
+ console.log(" Running TypeScript check...");
538
+ if (strictSecurity)
539
+ console.log(" Security strict mode: enabled");
540
+ if (rewriteImports)
541
+ console.log(" Canonical import rewrite: enabled");
542
+ if (rewriteLoaders)
543
+ console.log(" Legacy loader rewrite: enabled");
544
+ const result = await checkProject({ ...options, strictSecurity, rewriteImports, rewriteLoaders });
545
+ for (const info of result.info)
546
+ console.log(` [info] ${info}`);
547
+ for (const warn of result.warnings) {
548
+ const loc = warn.line ? `${warn.file}:${warn.line}` : warn.file;
549
+ console.log(` [warn] ${warn.code} ${loc}: ${warn.message}`);
550
+ if (warn.fix)
551
+ console.log(` Fix: ${warn.fix}`);
552
+ }
553
+ for (const err of result.errors) {
554
+ const loc = err.line ? `${err.file}:${err.line}` : err.file;
555
+ console.log(` [ERROR] ${err.code} ${loc}: ${err.message}`);
556
+ if (err.fix)
557
+ console.log(` Fix: ${err.fix}`);
558
+ }
559
+ console.log();
560
+ if (result.errors.length === 0)
561
+ console.log(` Result: PASS (${result.warnings.length} warning(s))`);
562
+ else
563
+ console.log(` Result: FAIL (${result.errors.length} error(s), ${result.warnings.length} warning(s))`);
564
+ console.log();
565
+ process.exit(result.errors.length > 0 ? 1 : 0);
566
+ }
567
+ function pushIssue(result, issue, strictSecurity) {
568
+ const finalIssue = strictSecurity && issue.code.startsWith("W9") ? { ...issue, code: `E${issue.code.slice(1)}` } : issue;
569
+ if (finalIssue.code.startsWith("E"))
570
+ result.errors.push(finalIssue);
571
+ else
572
+ result.warnings.push(finalIssue);
573
+ }
@@ -0,0 +1,6 @@
1
+ import { type RuntimeOptions } from "../runtime/project.js";
2
+ export interface CreateCommandOptions extends RuntimeOptions {
3
+ }
4
+ export declare function createProject(args: string[], options?: CreateCommandOptions): Promise<void>;
5
+ /** @deprecated Use createProject() for programmatic access. */
6
+ export declare function runCreate(args: string[], options?: CreateCommandOptions): Promise<void>;