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.
- package/README.md +261 -213
- package/dist-pkg/ai/artifact-lifecycle.d.ts +25 -0
- package/dist-pkg/ai/artifact-lifecycle.js +98 -0
- package/dist-pkg/ai/bridge.d.ts +26 -0
- package/dist-pkg/ai/bridge.js +82 -0
- package/dist-pkg/ai/bundle.d.ts +46 -0
- package/dist-pkg/ai/bundle.js +247 -0
- package/dist-pkg/ai/contracts.d.ts +1 -0
- package/dist-pkg/ai/contracts.js +1 -0
- package/dist-pkg/ai/ide.d.ts +37 -0
- package/dist-pkg/ai/ide.js +56 -0
- package/dist-pkg/ai/index.d.ts +85 -0
- package/dist-pkg/ai/index.js +267 -0
- package/dist-pkg/ai/json.d.ts +6 -0
- package/dist-pkg/ai/json.js +14 -0
- package/dist-pkg/ai/mcp.d.ts +28 -0
- package/dist-pkg/ai/mcp.js +152 -0
- package/dist-pkg/ai/session-pack.d.ts +28 -0
- package/dist-pkg/ai/session-pack.js +57 -0
- package/dist-pkg/ai/store.d.ts +67 -0
- package/dist-pkg/ai/store.js +174 -0
- package/dist-pkg/ai/summary.d.ts +57 -0
- package/dist-pkg/ai/summary.js +148 -0
- package/dist-pkg/ai/watch.d.ts +15 -0
- package/dist-pkg/ai/watch.js +66 -0
- package/dist-pkg/auth/action-tokens.d.ts +50 -0
- package/dist-pkg/auth/action-tokens.js +79 -0
- package/dist-pkg/auth/index.d.ts +70 -0
- package/dist-pkg/auth/index.js +199 -0
- package/dist-pkg/auth/redis-session-store.d.ts +7 -0
- package/dist-pkg/auth/redis-session-store.js +42 -0
- package/dist-pkg/auth/signing.d.ts +4 -0
- package/dist-pkg/auth/signing.js +33 -0
- package/dist-pkg/auth/sqlite-session-store.d.ts +12 -0
- package/dist-pkg/auth/sqlite-session-store.js +83 -0
- package/dist-pkg/auth/store-utils.d.ts +2 -0
- package/dist-pkg/auth/store-utils.js +20 -0
- package/dist-pkg/bin/gorsee.js +2 -0
- package/dist-pkg/build/backends/experimental-rolldown.d.ts +6 -0
- package/dist-pkg/build/backends/experimental-rolldown.js +9 -0
- package/dist-pkg/build/backends/register.d.ts +7 -0
- package/dist-pkg/build/backends/register.js +24 -0
- package/dist-pkg/build/backends/rolldown.d.ts +16 -0
- package/dist-pkg/build/backends/rolldown.js +176 -0
- package/dist-pkg/build/client-backend.d.ts +31 -0
- package/dist-pkg/build/client-backend.js +97 -0
- package/dist-pkg/build/client.d.ts +12 -0
- package/dist-pkg/build/client.js +93 -0
- package/dist-pkg/build/css-modules.d.ts +10 -0
- package/dist-pkg/build/css-modules.js +51 -0
- package/dist-pkg/build/devalue-parse.d.ts +1 -0
- package/dist-pkg/build/devalue-parse.js +1 -0
- package/dist-pkg/build/diagnostics.d.ts +20 -0
- package/dist-pkg/build/diagnostics.js +35 -0
- package/dist-pkg/build/fixtures.d.ts +7 -0
- package/dist-pkg/build/fixtures.js +60 -0
- package/dist-pkg/build/framework-imports.d.ts +4 -0
- package/dist-pkg/build/framework-imports.js +58 -0
- package/dist-pkg/build/init.d.ts +1 -0
- package/dist-pkg/build/init.js +6 -0
- package/dist-pkg/build/manifest.d.ts +3 -0
- package/dist-pkg/build/manifest.js +23 -0
- package/dist-pkg/build/parity.d.ts +32 -0
- package/dist-pkg/build/parity.js +71 -0
- package/dist-pkg/build/plugin.d.ts +11 -0
- package/dist-pkg/build/plugin.js +8 -0
- package/dist-pkg/build/readiness.d.ts +11 -0
- package/dist-pkg/build/readiness.js +18 -0
- package/dist-pkg/build/route-client-transform.d.ts +17 -0
- package/dist-pkg/build/route-client-transform.js +48 -0
- package/dist-pkg/build/route-metadata.d.ts +6 -0
- package/dist-pkg/build/route-metadata.js +8 -0
- package/dist-pkg/build/rpc-transform.d.ts +1 -0
- package/dist-pkg/build/rpc-transform.js +44 -0
- package/dist-pkg/build/server-bundle.d.ts +4 -0
- package/dist-pkg/build/server-bundle.js +261 -0
- package/dist-pkg/build/server-strip.d.ts +2 -0
- package/dist-pkg/build/server-strip.js +32 -0
- package/dist-pkg/build/ssg.d.ts +12 -0
- package/dist-pkg/build/ssg.js +36 -0
- package/dist-pkg/cli/bun-plugin.d.ts +2 -0
- package/dist-pkg/cli/bun-plugin.js +14 -0
- package/dist-pkg/cli/canonical-import-rewrite.d.ts +18 -0
- package/dist-pkg/cli/canonical-import-rewrite.js +94 -0
- package/dist-pkg/cli/canonical-imports.d.ts +8 -0
- package/dist-pkg/cli/canonical-imports.js +131 -0
- package/dist-pkg/cli/check-ast.d.ts +20 -0
- package/dist-pkg/cli/check-ast.js +126 -0
- package/dist-pkg/cli/cmd-ai.d.ts +4 -0
- package/dist-pkg/cli/cmd-ai.js +290 -0
- package/dist-pkg/cli/cmd-build.d.ts +12 -0
- package/dist-pkg/cli/cmd-build.js +198 -0
- package/dist-pkg/cli/cmd-check.d.ts +25 -0
- package/dist-pkg/cli/cmd-check.js +573 -0
- package/dist-pkg/cli/cmd-create.d.ts +6 -0
- package/dist-pkg/cli/cmd-create.js +600 -0
- package/dist-pkg/cli/cmd-deploy.d.ts +6 -0
- package/dist-pkg/cli/cmd-deploy.js +381 -0
- package/dist-pkg/cli/cmd-dev.d.ts +5 -0
- package/dist-pkg/cli/cmd-dev.js +5 -0
- package/dist-pkg/cli/cmd-docs.d.ts +50 -0
- package/dist-pkg/cli/cmd-docs.js +122 -0
- package/dist-pkg/cli/cmd-generate.d.ts +12 -0
- package/dist-pkg/cli/cmd-generate.js +320 -0
- package/dist-pkg/cli/cmd-migrate.d.ts +7 -0
- package/dist-pkg/cli/cmd-migrate.js +42 -0
- package/dist-pkg/cli/cmd-routes.d.ts +6 -0
- package/dist-pkg/cli/cmd-routes.js +24 -0
- package/dist-pkg/cli/cmd-start.d.ts +13 -0
- package/dist-pkg/cli/cmd-start.js +32 -0
- package/dist-pkg/cli/cmd-test.d.ts +20 -0
- package/dist-pkg/cli/cmd-test.js +103 -0
- package/dist-pkg/cli/cmd-typegen.d.ts +7 -0
- package/dist-pkg/cli/cmd-typegen.js +66 -0
- package/dist-pkg/cli/cmd-upgrade.d.ts +38 -0
- package/dist-pkg/cli/cmd-upgrade.js +232 -0
- package/dist-pkg/cli/context.d.ts +4 -0
- package/dist-pkg/cli/context.js +4 -0
- package/dist-pkg/cli/framework-md.d.ts +1 -0
- package/dist-pkg/cli/framework-md.js +391 -0
- package/dist-pkg/cli/index.d.ts +6 -0
- package/dist-pkg/cli/index.js +106 -0
- package/dist-pkg/cli/release-version.d.ts +2 -0
- package/dist-pkg/cli/release-version.js +33 -0
- package/dist-pkg/client.d.ts +16 -0
- package/dist-pkg/client.js +71 -0
- package/dist-pkg/compat.d.ts +1 -0
- package/dist-pkg/compat.js +1 -0
- package/dist-pkg/compiler/analysis-backend.d.ts +20 -0
- package/dist-pkg/compiler/analysis-backend.js +164 -0
- package/dist-pkg/compiler/backends/experimental-oxc.d.ts +6 -0
- package/dist-pkg/compiler/backends/experimental-oxc.js +9 -0
- package/dist-pkg/compiler/backends/oxc.d.ts +16 -0
- package/dist-pkg/compiler/backends/oxc.js +198 -0
- package/dist-pkg/compiler/backends/register.d.ts +7 -0
- package/dist-pkg/compiler/backends/register.js +22 -0
- package/dist-pkg/compiler/fixtures.d.ts +2 -0
- package/dist-pkg/compiler/fixtures.js +118 -0
- package/dist-pkg/compiler/init.d.ts +1 -0
- package/dist-pkg/compiler/init.js +6 -0
- package/dist-pkg/compiler/module-analysis.d.ts +13 -0
- package/dist-pkg/compiler/module-analysis.js +50 -0
- package/dist-pkg/compiler/parity.d.ts +35 -0
- package/dist-pkg/compiler/parity.js +89 -0
- package/dist-pkg/compiler/readiness.d.ts +11 -0
- package/dist-pkg/compiler/readiness.js +18 -0
- package/dist-pkg/compiler/route-facts.d.ts +34 -0
- package/dist-pkg/compiler/route-facts.js +75 -0
- package/dist-pkg/content/index.d.ts +27 -0
- package/dist-pkg/content/index.js +287 -0
- package/dist-pkg/db/index.d.ts +3 -0
- package/dist-pkg/db/index.js +6 -0
- package/dist-pkg/db/migrate.d.ts +7 -0
- package/dist-pkg/db/migrate.js +53 -0
- package/dist-pkg/db/postgres.d.ts +29 -0
- package/dist-pkg/db/postgres.js +59 -0
- package/dist-pkg/db/sqlite.d.ts +10 -0
- package/dist-pkg/db/sqlite.js +22 -0
- package/dist-pkg/deploy/cloudflare.d.ts +8 -0
- package/{src/deploy/cloudflare.ts → dist-pkg/deploy/cloudflare.js} +24 -26
- package/dist-pkg/deploy/conformance.d.ts +21 -0
- package/dist-pkg/deploy/conformance.js +98 -0
- package/dist-pkg/deploy/dockerfile.d.ts +3 -0
- package/{src/deploy/dockerfile.ts → dist-pkg/deploy/dockerfile.js} +8 -10
- package/dist-pkg/deploy/fly.d.ts +3 -0
- package/{src/deploy/fly.ts → dist-pkg/deploy/fly.js} +11 -12
- package/dist-pkg/deploy/index.d.ts +6 -0
- package/dist-pkg/deploy/index.js +26 -0
- package/dist-pkg/deploy/netlify.d.ts +2 -0
- package/{src/deploy/netlify.ts → dist-pkg/deploy/netlify.js} +17 -11
- package/dist-pkg/deploy/runtime.d.ts +2 -0
- package/dist-pkg/deploy/runtime.js +3 -0
- package/dist-pkg/deploy/vercel.d.ts +22 -0
- package/dist-pkg/deploy/vercel.js +53 -0
- package/dist-pkg/dev/error-overlay.d.ts +1 -0
- package/{src/dev/error-overlay.ts → dist-pkg/dev/error-overlay.js} +13 -23
- package/dist-pkg/dev/hmr.d.ts +30 -0
- package/dist-pkg/dev/hmr.js +86 -0
- package/dist-pkg/dev/partial-handler.d.ts +9 -0
- package/dist-pkg/dev/partial-handler.js +24 -0
- package/dist-pkg/dev/request-handler.d.ts +30 -0
- package/dist-pkg/dev/request-handler.js +67 -0
- package/dist-pkg/dev/watcher.d.ts +6 -0
- package/dist-pkg/dev/watcher.js +34 -0
- package/dist-pkg/dev.d.ts +11 -0
- package/dist-pkg/dev.js +268 -0
- package/dist-pkg/env/index.d.ts +3 -0
- package/dist-pkg/env/index.js +57 -0
- package/dist-pkg/errors/catalog.d.ts +9 -0
- package/{src/errors/catalog.ts → dist-pkg/errors/catalog.js} +8 -24
- package/dist-pkg/errors/formatter.d.ts +22 -0
- package/dist-pkg/errors/formatter.js +43 -0
- package/dist-pkg/errors/index.d.ts +2 -0
- package/dist-pkg/errors/index.js +2 -0
- package/dist-pkg/forms/action.d.ts +15 -0
- package/dist-pkg/forms/action.js +20 -0
- package/dist-pkg/forms/index.d.ts +4 -0
- package/dist-pkg/forms/index.js +12 -0
- package/dist-pkg/i18n/index.d.ts +61 -0
- package/dist-pkg/i18n/index.js +147 -0
- package/dist-pkg/index-client.d.ts +1 -0
- package/dist-pkg/index-client.js +1 -0
- package/dist-pkg/index.d.ts +32 -0
- package/dist-pkg/index.js +79 -0
- package/dist-pkg/jsx-runtime-client.d.ts +8 -0
- package/dist-pkg/jsx-runtime-client.js +1 -0
- package/dist-pkg/jsx-runtime.d.ts +13 -0
- package/dist-pkg/jsx-runtime.js +5 -0
- package/dist-pkg/jsx-types-html.d.ts +221 -0
- package/dist-pkg/jsx-types-html.js +0 -0
- package/dist-pkg/log/index.d.ts +8 -0
- package/dist-pkg/log/index.js +55 -0
- package/dist-pkg/plugins/drizzle.d.ts +16 -0
- package/dist-pkg/plugins/drizzle.js +50 -0
- package/dist-pkg/plugins/index.d.ts +62 -0
- package/dist-pkg/plugins/index.js +147 -0
- package/dist-pkg/plugins/lucia.d.ts +26 -0
- package/dist-pkg/plugins/lucia.js +63 -0
- package/dist-pkg/plugins/prisma.d.ts +14 -0
- package/dist-pkg/plugins/prisma.js +57 -0
- package/dist-pkg/plugins/resend.d.ts +21 -0
- package/dist-pkg/plugins/resend.js +45 -0
- package/dist-pkg/plugins/s3.d.ts +18 -0
- package/dist-pkg/plugins/s3.js +63 -0
- package/dist-pkg/plugins/stripe.d.ts +32 -0
- package/dist-pkg/plugins/stripe.js +69 -0
- package/dist-pkg/plugins/tailwind.d.ts +15 -0
- package/dist-pkg/plugins/tailwind.js +58 -0
- package/dist-pkg/prod.d.ts +21 -0
- package/dist-pkg/prod.js +347 -0
- package/dist-pkg/reactive/computed.d.ts +3 -0
- package/dist-pkg/reactive/computed.js +15 -0
- package/dist-pkg/reactive/data.d.ts +25 -0
- package/dist-pkg/reactive/data.js +56 -0
- package/dist-pkg/reactive/diagnostics.d.ts +100 -0
- package/dist-pkg/reactive/diagnostics.js +363 -0
- package/dist-pkg/reactive/effect.d.ts +3 -0
- package/dist-pkg/reactive/effect.js +6 -0
- package/dist-pkg/reactive/index.d.ts +9 -0
- package/dist-pkg/reactive/index.js +18 -0
- package/dist-pkg/reactive/live.d.ts +15 -0
- package/dist-pkg/reactive/live.js +58 -0
- package/dist-pkg/reactive/optimistic.d.ts +20 -0
- package/dist-pkg/reactive/optimistic.js +54 -0
- package/dist-pkg/reactive/resource.d.ts +25 -0
- package/dist-pkg/reactive/resource.js +97 -0
- package/dist-pkg/reactive/signal.d.ts +4 -0
- package/dist-pkg/reactive/signal.js +17 -0
- package/dist-pkg/reactive/store.d.ts +6 -0
- package/dist-pkg/reactive/store.js +19 -0
- package/dist-pkg/router/index.d.ts +2 -0
- package/dist-pkg/router/index.js +2 -0
- package/dist-pkg/router/matcher.d.ts +7 -0
- package/dist-pkg/router/matcher.js +40 -0
- package/dist-pkg/router/scanner.d.ts +14 -0
- package/dist-pkg/router/scanner.js +141 -0
- package/dist-pkg/routes/index.d.ts +1 -0
- package/dist-pkg/routes/index.js +10 -0
- package/dist-pkg/runtime/app-config.d.ts +26 -0
- package/dist-pkg/runtime/app-config.js +69 -0
- package/dist-pkg/runtime/client.d.ts +3 -0
- package/dist-pkg/runtime/client.js +31 -0
- package/dist-pkg/runtime/devtools.d.ts +64 -0
- package/dist-pkg/runtime/devtools.js +132 -0
- package/dist-pkg/runtime/error-boundary.d.ts +6 -0
- package/dist-pkg/runtime/error-boundary.js +17 -0
- package/dist-pkg/runtime/event-replay.d.ts +3 -0
- package/{src/runtime/event-replay.ts → dist-pkg/runtime/event-replay.js} +7 -22
- package/dist-pkg/runtime/event-source.d.ts +7 -0
- package/dist-pkg/runtime/event-source.js +24 -0
- package/dist-pkg/runtime/form.d.ts +24 -0
- package/dist-pkg/runtime/form.js +59 -0
- package/dist-pkg/runtime/head.d.ts +7 -0
- package/dist-pkg/runtime/head.js +90 -0
- package/dist-pkg/runtime/html-escape.d.ts +7 -0
- package/dist-pkg/runtime/html-escape.js +39 -0
- package/dist-pkg/runtime/hydration.d.ts +15 -0
- package/dist-pkg/runtime/hydration.js +103 -0
- package/dist-pkg/runtime/image.d.ts +49 -0
- package/dist-pkg/runtime/image.js +144 -0
- package/dist-pkg/runtime/index.d.ts +17 -0
- package/dist-pkg/runtime/index.js +59 -0
- package/dist-pkg/runtime/island-hydrator.d.ts +12 -0
- package/dist-pkg/runtime/island-hydrator.js +49 -0
- package/dist-pkg/runtime/island.d.ts +19 -0
- package/dist-pkg/runtime/island.js +36 -0
- package/dist-pkg/runtime/jsx-runtime.d.ts +12 -0
- package/dist-pkg/runtime/jsx-runtime.js +173 -0
- package/dist-pkg/runtime/link.d.ts +16 -0
- package/dist-pkg/runtime/link.js +47 -0
- package/dist-pkg/runtime/project.d.ts +37 -0
- package/dist-pkg/runtime/project.js +36 -0
- package/dist-pkg/runtime/renderable.d.ts +6 -0
- package/dist-pkg/runtime/renderable.js +0 -0
- package/dist-pkg/runtime/router.d.ts +47 -0
- package/dist-pkg/runtime/router.js +476 -0
- package/dist-pkg/runtime/server.d.ts +8 -0
- package/dist-pkg/runtime/server.js +71 -0
- package/dist-pkg/runtime/stream.d.ts +29 -0
- package/dist-pkg/runtime/stream.js +106 -0
- package/dist-pkg/runtime/suspense.d.ts +6 -0
- package/dist-pkg/runtime/suspense.js +16 -0
- package/dist-pkg/runtime/typed-routes.d.ts +24 -0
- package/dist-pkg/runtime/typed-routes.js +77 -0
- package/dist-pkg/runtime/validated-form.d.ts +40 -0
- package/dist-pkg/runtime/validated-form.js +120 -0
- package/dist-pkg/security/cors.d.ts +10 -0
- package/dist-pkg/security/cors.js +56 -0
- package/dist-pkg/security/csrf.d.ts +9 -0
- package/dist-pkg/security/csrf.js +53 -0
- package/dist-pkg/security/headers.d.ts +11 -0
- package/dist-pkg/security/headers.js +31 -0
- package/dist-pkg/security/index.d.ts +5 -0
- package/dist-pkg/security/index.js +5 -0
- package/dist-pkg/security/rate-limit.d.ts +10 -0
- package/dist-pkg/security/rate-limit.js +49 -0
- package/dist-pkg/security/redis-rate-limit.d.ts +14 -0
- package/dist-pkg/security/redis-rate-limit.js +23 -0
- package/dist-pkg/server/action.d.ts +21 -0
- package/dist-pkg/server/action.js +64 -0
- package/dist-pkg/server/cache-utils.d.ts +2 -0
- package/dist-pkg/server/cache-utils.js +26 -0
- package/dist-pkg/server/cache.d.ts +33 -0
- package/dist-pkg/server/cache.js +236 -0
- package/dist-pkg/server/compress.d.ts +2 -0
- package/dist-pkg/server/compress.js +49 -0
- package/dist-pkg/server/endpoint-execution.d.ts +28 -0
- package/dist-pkg/server/endpoint-execution.js +37 -0
- package/dist-pkg/server/etag.d.ts +3 -0
- package/dist-pkg/server/etag.js +18 -0
- package/dist-pkg/server/guard.d.ts +16 -0
- package/dist-pkg/server/guard.js +45 -0
- package/dist-pkg/server/html-shell.d.ts +12 -0
- package/dist-pkg/server/html-shell.js +52 -0
- package/dist-pkg/server/index.d.ts +36 -0
- package/dist-pkg/server/index.js +170 -0
- package/dist-pkg/server/jobs.d.ts +41 -0
- package/dist-pkg/server/jobs.js +81 -0
- package/dist-pkg/server/manifest.d.ts +19 -0
- package/dist-pkg/server/manifest.js +36 -0
- package/dist-pkg/server/middleware.d.ts +39 -0
- package/dist-pkg/server/middleware.js +122 -0
- package/dist-pkg/server/mime.d.ts +1 -0
- package/{src/server/mime.ts → dist-pkg/server/mime.js} +6 -17
- package/dist-pkg/server/not-found.d.ts +6 -0
- package/dist-pkg/server/not-found.js +24 -0
- package/dist-pkg/server/page-render.d.ts +29 -0
- package/dist-pkg/server/page-render.js +67 -0
- package/dist-pkg/server/partial-navigation.d.ts +4 -0
- package/dist-pkg/server/partial-navigation.js +16 -0
- package/dist-pkg/server/pipe.d.ts +9 -0
- package/dist-pkg/server/pipe.js +32 -0
- package/dist-pkg/server/redis-cache-store.d.ts +10 -0
- package/dist-pkg/server/redis-cache-store.js +73 -0
- package/dist-pkg/server/redis-client.d.ts +37 -0
- package/dist-pkg/server/redis-client.js +37 -0
- package/dist-pkg/server/request-policy.d.ts +55 -0
- package/dist-pkg/server/request-policy.js +216 -0
- package/dist-pkg/server/request-preflight.d.ts +23 -0
- package/dist-pkg/server/request-preflight.js +45 -0
- package/dist-pkg/server/request-security-policy.d.ts +17 -0
- package/dist-pkg/server/request-security-policy.js +34 -0
- package/dist-pkg/server/request-surface.d.ts +8 -0
- package/dist-pkg/server/request-surface.js +19 -0
- package/dist-pkg/server/route-request.d.ts +31 -0
- package/dist-pkg/server/route-request.js +112 -0
- package/dist-pkg/server/route-response.d.ts +22 -0
- package/dist-pkg/server/route-response.js +58 -0
- package/dist-pkg/server/rpc-hash.d.ts +2 -0
- package/dist-pkg/server/rpc-hash.js +7 -0
- package/dist-pkg/server/rpc-protocol.d.ts +22 -0
- package/dist-pkg/server/rpc-protocol.js +28 -0
- package/dist-pkg/server/rpc-utils.d.ts +2 -0
- package/dist-pkg/server/rpc-utils.js +26 -0
- package/dist-pkg/server/rpc.d.ts +20 -0
- package/dist-pkg/server/rpc.js +147 -0
- package/dist-pkg/server/runtime-dispatch.d.ts +19 -0
- package/dist-pkg/server/runtime-dispatch.js +67 -0
- package/dist-pkg/server/server-execution.d.ts +22 -0
- package/dist-pkg/server/server-execution.js +53 -0
- package/dist-pkg/server/sqlite-cache-store.d.ts +13 -0
- package/dist-pkg/server/sqlite-cache-store.js +88 -0
- package/dist-pkg/server/sse.d.ts +9 -0
- package/dist-pkg/server/sse.js +34 -0
- package/dist-pkg/server/static-file.d.ts +9 -0
- package/dist-pkg/server/static-file.js +43 -0
- package/dist-pkg/server/ws.d.ts +18 -0
- package/dist-pkg/server/ws.js +40 -0
- package/dist-pkg/server-entry.d.ts +19 -0
- package/dist-pkg/server-entry.js +93 -0
- package/dist-pkg/testing/index.d.ts +98 -0
- package/dist-pkg/testing/index.js +254 -0
- package/dist-pkg/types/index.d.ts +4 -0
- package/dist-pkg/types/index.js +4 -0
- package/dist-pkg/types/safe-html.d.ts +7 -0
- package/dist-pkg/types/safe-html.js +19 -0
- package/dist-pkg/types/safe-sql.d.ts +8 -0
- package/dist-pkg/types/safe-sql.js +14 -0
- package/dist-pkg/types/safe-url.d.ts +7 -0
- package/dist-pkg/types/safe-url.js +20 -0
- package/dist-pkg/types/user-input.d.ts +9 -0
- package/dist-pkg/types/user-input.js +3 -0
- package/dist-pkg/unsafe/index.d.ts +12 -0
- package/dist-pkg/unsafe/index.js +6 -0
- package/package.json +102 -44
- package/bin/gorsee.js +0 -14
- package/src/auth/index.ts +0 -178
- package/src/auth/redis-session-store.ts +0 -46
- package/src/auth/sqlite-session-store.ts +0 -98
- package/src/auth/store-utils.ts +0 -21
- package/src/build/client.ts +0 -139
- package/src/build/css-modules.ts +0 -69
- package/src/build/devalue-parse.ts +0 -2
- package/src/build/manifest.ts +0 -34
- package/src/build/route-metadata.ts +0 -12
- package/src/build/rpc-transform.ts +0 -62
- package/src/build/server-strip.ts +0 -87
- package/src/build/ssg.ts +0 -70
- package/src/cli/bun-plugin.ts +0 -58
- package/src/cli/cmd-build.ts +0 -153
- package/src/cli/cmd-check.ts +0 -239
- package/src/cli/cmd-create.ts +0 -328
- package/src/cli/cmd-deploy.ts +0 -149
- package/src/cli/cmd-dev.ts +0 -13
- package/src/cli/cmd-docs.ts +0 -152
- package/src/cli/cmd-generate.ts +0 -155
- package/src/cli/cmd-migrate.ts +0 -53
- package/src/cli/cmd-routes.ts +0 -36
- package/src/cli/cmd-start.ts +0 -30
- package/src/cli/cmd-test.ts +0 -129
- package/src/cli/cmd-typegen.ts +0 -93
- package/src/cli/cmd-upgrade.ts +0 -143
- package/src/cli/context.ts +0 -12
- package/src/cli/framework-md.ts +0 -223
- package/src/cli/index.ts +0 -107
- package/src/client.ts +0 -26
- package/src/db/index.ts +0 -2
- package/src/db/migrate.ts +0 -89
- package/src/db/sqlite.ts +0 -40
- package/src/deploy/index.ts +0 -31
- package/src/deploy/vercel.ts +0 -94
- package/src/dev/hmr.ts +0 -31
- package/src/dev/partial-handler.ts +0 -52
- package/src/dev/request-handler.ts +0 -127
- package/src/dev/watcher.ts +0 -48
- package/src/dev.ts +0 -208
- package/src/env/index.ts +0 -74
- package/src/errors/formatter.ts +0 -63
- package/src/errors/index.ts +0 -2
- package/src/i18n/index.ts +0 -72
- package/src/index-client.ts +0 -4
- package/src/index.ts +0 -43
- package/src/jsx-runtime-client.ts +0 -13
- package/src/jsx-runtime.ts +0 -20
- package/src/jsx-types-html.ts +0 -242
- package/src/log/index.ts +0 -44
- package/src/plugins/drizzle.ts +0 -84
- package/src/plugins/index.ts +0 -86
- package/src/plugins/lucia.ts +0 -111
- package/src/plugins/prisma.ts +0 -85
- package/src/plugins/resend.ts +0 -78
- package/src/plugins/s3.ts +0 -102
- package/src/plugins/stripe.ts +0 -133
- package/src/plugins/tailwind.ts +0 -92
- package/src/prod.ts +0 -252
- package/src/reactive/computed.ts +0 -7
- package/src/reactive/effect.ts +0 -7
- package/src/reactive/index.ts +0 -7
- package/src/reactive/live.ts +0 -97
- package/src/reactive/optimistic.ts +0 -83
- package/src/reactive/resource.ts +0 -138
- package/src/reactive/signal.ts +0 -20
- package/src/reactive/store.ts +0 -36
- package/src/router/index.ts +0 -2
- package/src/router/matcher.ts +0 -53
- package/src/router/scanner.ts +0 -206
- package/src/runtime/client.ts +0 -28
- package/src/runtime/error-boundary.ts +0 -35
- package/src/runtime/form.ts +0 -49
- package/src/runtime/head.ts +0 -113
- package/src/runtime/html-escape.ts +0 -30
- package/src/runtime/hydration.ts +0 -95
- package/src/runtime/image.ts +0 -48
- package/src/runtime/index.ts +0 -12
- package/src/runtime/island-hydrator.ts +0 -84
- package/src/runtime/island.ts +0 -88
- package/src/runtime/jsx-runtime.ts +0 -167
- package/src/runtime/link.ts +0 -45
- package/src/runtime/project.ts +0 -73
- package/src/runtime/router.ts +0 -224
- package/src/runtime/server.ts +0 -102
- package/src/runtime/stream.ts +0 -182
- package/src/runtime/suspense.ts +0 -37
- package/src/runtime/typed-routes.ts +0 -26
- package/src/runtime/validated-form.ts +0 -106
- package/src/security/cors.ts +0 -80
- package/src/security/csrf.ts +0 -85
- package/src/security/headers.ts +0 -50
- package/src/security/index.ts +0 -4
- package/src/security/rate-limit.ts +0 -80
- package/src/server/action.ts +0 -48
- package/src/server/cache-utils.ts +0 -23
- package/src/server/cache.ts +0 -125
- package/src/server/compress.ts +0 -60
- package/src/server/etag.ts +0 -23
- package/src/server/guard.ts +0 -69
- package/src/server/html-shell.ts +0 -69
- package/src/server/index.ts +0 -57
- package/src/server/manifest.ts +0 -36
- package/src/server/middleware.ts +0 -159
- package/src/server/not-found.ts +0 -35
- package/src/server/page-render.ts +0 -123
- package/src/server/pipe.ts +0 -46
- package/src/server/redis-cache-store.ts +0 -87
- package/src/server/redis-client.ts +0 -71
- package/src/server/request-preflight.ts +0 -45
- package/src/server/route-request.ts +0 -72
- package/src/server/rpc-hash.ts +0 -17
- package/src/server/rpc-utils.ts +0 -27
- package/src/server/rpc.ts +0 -177
- package/src/server/sqlite-cache-store.ts +0 -109
- package/src/server/sse.ts +0 -96
- package/src/server/static-file.ts +0 -63
- package/src/server/ws.ts +0 -56
- package/src/server-entry.ts +0 -36
- package/src/testing/index.ts +0 -74
- package/src/types/index.ts +0 -4
- package/src/types/safe-html.ts +0 -32
- package/src/types/safe-sql.ts +0 -28
- package/src/types/safe-url.ts +0 -40
- package/src/types/user-input.ts +0 -12
- package/src/unsafe/index.ts +0 -18
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type RuntimeOptions } from "../runtime/project.js";
|
|
2
|
+
interface UpgradeFlags {
|
|
3
|
+
check: boolean;
|
|
4
|
+
force: boolean;
|
|
5
|
+
report: string | null;
|
|
6
|
+
rewriteImports: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface UpgradeIssue {
|
|
9
|
+
code: string;
|
|
10
|
+
file: string;
|
|
11
|
+
severity: "info" | "warn";
|
|
12
|
+
message: string;
|
|
13
|
+
fix: string;
|
|
14
|
+
}
|
|
15
|
+
export interface UpgradeReport {
|
|
16
|
+
schemaVersion: 1;
|
|
17
|
+
generatedAt: string;
|
|
18
|
+
currentVersion: string | null;
|
|
19
|
+
latestVersion: string | null;
|
|
20
|
+
upgradeAvailable: boolean;
|
|
21
|
+
issues: UpgradeIssue[];
|
|
22
|
+
}
|
|
23
|
+
export declare function parseUpgradeFlags(args: string[]): UpgradeFlags;
|
|
24
|
+
/** Compare semver strings: -1 (a < b), 0 (equal), 1 (a > b) */
|
|
25
|
+
export declare function compareVersions(a: string, b: string): number;
|
|
26
|
+
export declare const NPM_REGISTRY_URL = "https://registry.npmjs.org/gorsee/latest";
|
|
27
|
+
export declare function collectUpgradeIssues(cwd: string): Promise<UpgradeIssue[]>;
|
|
28
|
+
export declare function collectUpgradeReport(cwd: string, versions: {
|
|
29
|
+
currentVersion: string | null;
|
|
30
|
+
latestVersion: string | null;
|
|
31
|
+
}): Promise<UpgradeReport>;
|
|
32
|
+
export declare function writeUpgradeReport(cwd: string, reportPath: string, report: UpgradeReport): Promise<void>;
|
|
33
|
+
export interface UpgradeCommandOptions extends RuntimeOptions {
|
|
34
|
+
}
|
|
35
|
+
export declare function upgradeFramework(args: string[], options?: UpgradeCommandOptions): Promise<void>;
|
|
36
|
+
/** @deprecated Use upgradeFramework() for programmatic access. */
|
|
37
|
+
export declare function runUpgrade(args: string[], options?: UpgradeCommandOptions): Promise<void>;
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { mkdir, readFile, readdir, stat, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, join, relative } from "node:path";
|
|
3
|
+
import { createProjectContext } from "../runtime/project.js";
|
|
4
|
+
import { analyzeModuleSource } from "../compiler/module-analysis.js";
|
|
5
|
+
import { collectCanonicalImportDrift } from "./canonical-imports.js";
|
|
6
|
+
import { rewriteCanonicalImportsInProject, rewriteLegacyLoadersInProject } from "./canonical-import-rewrite.js";
|
|
7
|
+
export function parseUpgradeFlags(args) {
|
|
8
|
+
const flags = { check: !1, force: !1, report: null, rewriteImports: !1 };
|
|
9
|
+
for (let index = 0;index < args.length; index += 1) {
|
|
10
|
+
const arg = args[index];
|
|
11
|
+
if (arg === "--check")
|
|
12
|
+
flags.check = !0;
|
|
13
|
+
else if (arg === "--force")
|
|
14
|
+
flags.force = !0;
|
|
15
|
+
else if (arg === "--rewrite-imports")
|
|
16
|
+
flags.rewriteImports = !0;
|
|
17
|
+
else if (arg === "--report" && args[index + 1])
|
|
18
|
+
flags.report = args[++index];
|
|
19
|
+
}
|
|
20
|
+
return flags;
|
|
21
|
+
}
|
|
22
|
+
export function compareVersions(a, b) {
|
|
23
|
+
const pa = a.replace(/^v/, "").split(".").map(Number), pb = b.replace(/^v/, "").split(".").map(Number);
|
|
24
|
+
for (let i = 0;i < 3; i++) {
|
|
25
|
+
const va = pa[i] ?? 0, vb = pb[i] ?? 0;
|
|
26
|
+
if (va < vb)
|
|
27
|
+
return -1;
|
|
28
|
+
if (va > vb)
|
|
29
|
+
return 1;
|
|
30
|
+
}
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
async function getCurrentVersion(cwd) {
|
|
34
|
+
try {
|
|
35
|
+
const pkg = await readFile(join(cwd, "node_modules/gorsee/package.json"), "utf-8");
|
|
36
|
+
return JSON.parse(pkg).version ?? null;
|
|
37
|
+
} catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export const NPM_REGISTRY_URL = "https://registry.npmjs.org/gorsee/latest";
|
|
42
|
+
async function fetchLatestVersion() {
|
|
43
|
+
try {
|
|
44
|
+
const res = await fetch(NPM_REGISTRY_URL);
|
|
45
|
+
if (!res.ok)
|
|
46
|
+
return null;
|
|
47
|
+
return (await res.json()).version ?? null;
|
|
48
|
+
} catch {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async function tryReadFile(path) {
|
|
53
|
+
try {
|
|
54
|
+
return await readFile(path, "utf-8");
|
|
55
|
+
} catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function getAllSourceFiles(cwd, dir) {
|
|
60
|
+
const path = join(cwd, dir);
|
|
61
|
+
try {
|
|
62
|
+
const entries = await readdir(path), files = [];
|
|
63
|
+
for (const entry of entries) {
|
|
64
|
+
if (entry === "node_modules" || entry === "dist" || entry === ".git")
|
|
65
|
+
continue;
|
|
66
|
+
const fullPath = join(path, entry);
|
|
67
|
+
if ((await stat(fullPath)).isDirectory())
|
|
68
|
+
files.push(...await getAllSourceFiles(cwd, relative(cwd, fullPath)));
|
|
69
|
+
else if (entry.endsWith(".ts") || entry.endsWith(".tsx"))
|
|
70
|
+
files.push(fullPath);
|
|
71
|
+
}
|
|
72
|
+
return files;
|
|
73
|
+
} catch {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function issue(code, file, message, fix, severity = "warn") {
|
|
78
|
+
return { code, file, severity, message, fix };
|
|
79
|
+
}
|
|
80
|
+
export async function collectUpgradeIssues(cwd) {
|
|
81
|
+
const issues = [], tsconfigSource = await tryReadFile(join(cwd, "tsconfig.json"));
|
|
82
|
+
if (tsconfigSource)
|
|
83
|
+
try {
|
|
84
|
+
const tsconfig = JSON.parse(tsconfigSource);
|
|
85
|
+
if (tsconfig.compilerOptions?.jsx !== "preserve")
|
|
86
|
+
issues.push(issue("UG001", "tsconfig.json", "Canonical Gorsee JSX mode is no longer configured", 'Set compilerOptions.jsx to "preserve"'));
|
|
87
|
+
if (tsconfig.compilerOptions?.jsxImportSource !== "gorsee")
|
|
88
|
+
issues.push(issue("UG002", "tsconfig.json", "Canonical jsxImportSource is missing", 'Set compilerOptions.jsxImportSource to "gorsee"'));
|
|
89
|
+
} catch {
|
|
90
|
+
issues.push(issue("UG003", "tsconfig.json", "Could not parse tsconfig.json for migration checks", "Fix tsconfig.json so upgrade checks can validate the canonical compiler contract"));
|
|
91
|
+
}
|
|
92
|
+
if ((await tryReadFile(join(cwd, "app.config.ts")))?.includes("ssr:"))
|
|
93
|
+
issues.push(issue("UG004", "app.config.ts", "Deprecated app.config.ts key 'ssr' is still present", "Replace 'ssr' with the canonical 'rendering' configuration surface"));
|
|
94
|
+
const packageJsonSource = await tryReadFile(join(cwd, "package.json"));
|
|
95
|
+
if (packageJsonSource)
|
|
96
|
+
try {
|
|
97
|
+
const pkg = JSON.parse(packageJsonSource);
|
|
98
|
+
if (!pkg.packageManager || !/^bun@\d+\.\d+\.\d+$/.test(pkg.packageManager))
|
|
99
|
+
issues.push(issue("UG005", "package.json", "packageManager should pin the exact Bun version used by the project", 'Set packageManager to an exact version such as "bun@1.3.9"'));
|
|
100
|
+
} catch {
|
|
101
|
+
issues.push(issue("UG006", "package.json", "Could not parse package.json for upgrade checks", "Fix package.json so upgrade checks can validate package-manager and dependency contracts"));
|
|
102
|
+
}
|
|
103
|
+
for (const deployFile of ["app.config.ts", "wrangler.toml", "netlify.toml", "fly.toml", "vercel.json"]) {
|
|
104
|
+
const source = await tryReadFile(join(cwd, deployFile));
|
|
105
|
+
if (!source)
|
|
106
|
+
continue;
|
|
107
|
+
if (/REPLACE_WITH_APP_ORIGIN|https:\/\/example\.com/.test(source))
|
|
108
|
+
issues.push(issue("UG007", deployFile, "Placeholder origin values are still present", "Replace placeholder origins with the canonical application origin before shipping the upgrade"));
|
|
109
|
+
}
|
|
110
|
+
const sourceFiles = [
|
|
111
|
+
...await getAllSourceFiles(cwd, "routes"),
|
|
112
|
+
...await getAllSourceFiles(cwd, "shared"),
|
|
113
|
+
...await getAllSourceFiles(cwd, "middleware")
|
|
114
|
+
];
|
|
115
|
+
for (const file of sourceFiles) {
|
|
116
|
+
const source = await tryReadFile(file);
|
|
117
|
+
if (!source)
|
|
118
|
+
continue;
|
|
119
|
+
const facts = analyzeModuleSource(file, source);
|
|
120
|
+
if (facts.imports.some((entry) => entry.specifier === "gorsee"))
|
|
121
|
+
issues.push(issue("UG008", relative(cwd, file), 'Compatibility-only root "gorsee" import is still used in application code', 'Move browser-safe imports to "gorsee/client", server code to "gorsee/server", or explicit compatibility bridges to "gorsee/compat"'));
|
|
122
|
+
for (const drift of collectCanonicalImportDrift(facts.imports)) {
|
|
123
|
+
const entries = [...drift.replacements.entries()].map(([name, target]) => `${name} -> ${target}`).join(", "), targets = [...new Set(drift.replacements.values())].join(", ");
|
|
124
|
+
issues.push(issue(drift.source === "gorsee/server" ? "UG009" : "UG010", relative(cwd, file), `Domain APIs still come from "${drift.source}" instead of scoped stable subpaths: ${entries}`, drift.source === "gorsee/server" ? `Keep runtime primitives on "gorsee/server" and move domain imports to ${targets}` : `Keep browser runtime primitives on "gorsee/client" and move domain imports to ${targets}`, "info"));
|
|
125
|
+
}
|
|
126
|
+
if (facts.exportedNames.has("loader"))
|
|
127
|
+
issues.push(issue("UG011", relative(cwd, file), 'Route module still exports "loader" instead of canonical "load"', 'Rename exported "loader" to "load", or run `gorsee upgrade --rewrite-imports` to rewrite obvious cases automatically', "info"));
|
|
128
|
+
}
|
|
129
|
+
return issues;
|
|
130
|
+
}
|
|
131
|
+
export async function collectUpgradeReport(cwd, versions) {
|
|
132
|
+
const issues = await collectUpgradeIssues(cwd), { currentVersion, latestVersion } = versions, upgradeAvailable = currentVersion !== null && latestVersion !== null && compareVersions(currentVersion, latestVersion) < 0;
|
|
133
|
+
return {
|
|
134
|
+
schemaVersion: 1,
|
|
135
|
+
generatedAt: new Date().toISOString(),
|
|
136
|
+
currentVersion,
|
|
137
|
+
latestVersion,
|
|
138
|
+
upgradeAvailable,
|
|
139
|
+
issues
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
export async function writeUpgradeReport(cwd, reportPath, report) {
|
|
143
|
+
const outputPath = join(cwd, reportPath);
|
|
144
|
+
await mkdir(dirname(outputPath), { recursive: !0 });
|
|
145
|
+
await writeFile(outputPath, JSON.stringify(report, null, 2) + `
|
|
146
|
+
`, "utf-8");
|
|
147
|
+
}
|
|
148
|
+
export async function upgradeFramework(args, options = {}) {
|
|
149
|
+
const { cwd } = createProjectContext(options), flags = parseUpgradeFlags(args);
|
|
150
|
+
if (flags.rewriteImports) {
|
|
151
|
+
const importRewrite = await rewriteCanonicalImportsInProject(cwd), loaderRewrite = await rewriteLegacyLoadersInProject(cwd), changedFiles = [...new Set([...importRewrite.changedFiles, ...loaderRewrite.changedFiles])].sort();
|
|
152
|
+
if (changedFiles.length > 0) {
|
|
153
|
+
console.log(`
|
|
154
|
+
Rewrote canonical imports and loader aliases:`);
|
|
155
|
+
for (const file of changedFiles)
|
|
156
|
+
console.log(` - ${file}`);
|
|
157
|
+
} else
|
|
158
|
+
console.log(`
|
|
159
|
+
Canonical import and loader rewrite found no changes.`);
|
|
160
|
+
}
|
|
161
|
+
const current = await getCurrentVersion(cwd);
|
|
162
|
+
if (!current) {
|
|
163
|
+
console.log(`
|
|
164
|
+
Gorsee.js not found in node_modules. Run: bun add gorsee
|
|
165
|
+
`);
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
console.log(`
|
|
169
|
+
Current version: v${current}`);
|
|
170
|
+
const latest = await fetchLatestVersion();
|
|
171
|
+
if (!latest) {
|
|
172
|
+
console.log(` Could not fetch latest version from npm registry.
|
|
173
|
+
`);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const report = await collectUpgradeReport(cwd, {
|
|
177
|
+
currentVersion: current,
|
|
178
|
+
latestVersion: latest
|
|
179
|
+
});
|
|
180
|
+
if (flags.report) {
|
|
181
|
+
await writeUpgradeReport(cwd, flags.report, report);
|
|
182
|
+
console.log(` Upgrade report: ${flags.report}`);
|
|
183
|
+
}
|
|
184
|
+
if (compareVersions(current, latest) >= 0) {
|
|
185
|
+
console.log(` Already up to date (v${current})`);
|
|
186
|
+
if (report.issues.length > 0) {
|
|
187
|
+
console.log(`
|
|
188
|
+
Migration audit:`);
|
|
189
|
+
for (const entry of report.issues)
|
|
190
|
+
console.log(` - [${entry.code}] ${entry.file}: ${entry.message}`);
|
|
191
|
+
}
|
|
192
|
+
console.log();
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
console.log(` Latest version: v${latest}`);
|
|
196
|
+
console.log(` Upgrade: v${current} -> v${latest}`);
|
|
197
|
+
if (report.issues.length > 0) {
|
|
198
|
+
console.log(`
|
|
199
|
+
Migration audit:`);
|
|
200
|
+
for (const entry of report.issues)
|
|
201
|
+
console.log(` - [${entry.code}] ${entry.file}: ${entry.message}`);
|
|
202
|
+
}
|
|
203
|
+
if (flags.check) {
|
|
204
|
+
console.log();
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
if (!flags.force) {
|
|
208
|
+
console.log(`
|
|
209
|
+
Run with --force to install after reviewing the migration audit.
|
|
210
|
+
`);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
console.log(`
|
|
214
|
+
Installing gorsee@latest...`);
|
|
215
|
+
const exitCode = await Bun.spawn(["bun", "add", "gorsee@latest"], {
|
|
216
|
+
cwd,
|
|
217
|
+
stdout: "inherit",
|
|
218
|
+
stderr: "inherit"
|
|
219
|
+
}).exited;
|
|
220
|
+
if (exitCode !== 0) {
|
|
221
|
+
console.log(`
|
|
222
|
+
Install failed (exit code ${exitCode})
|
|
223
|
+
`);
|
|
224
|
+
process.exit(exitCode);
|
|
225
|
+
}
|
|
226
|
+
console.log(`
|
|
227
|
+
Upgraded successfully to v${latest}
|
|
228
|
+
`);
|
|
229
|
+
}
|
|
230
|
+
export async function runUpgrade(args, options = {}) {
|
|
231
|
+
return upgradeFramework(args, options);
|
|
232
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** @deprecated Import shared project context from "../runtime/project" in new code. */
|
|
2
|
+
export { createProjectContext as createCommandContext, resolveProjectPaths, } from "../runtime/project.js";
|
|
3
|
+
/** @deprecated Import shared runtime types from "../runtime/project" in new code. */
|
|
4
|
+
export type { RuntimeOptions as CommandRuntimeOptions, ProjectContext as CommandContext, ProjectPaths, } from "../runtime/project.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function generateFrameworkMD(projectName: string): string;
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
export function generateFrameworkMD(projectName) {
|
|
2
|
+
return `# ${projectName} -- Gorsee.js Framework Reference
|
|
3
|
+
|
|
4
|
+
> This file is auto-generated. It provides complete context for AI assistants.
|
|
5
|
+
> Include this file in your AI context window for best results.
|
|
6
|
+
|
|
7
|
+
## Product Identity
|
|
8
|
+
|
|
9
|
+
Gorsee is an AI-first reactive full-stack framework designed for deterministic collaboration between humans and coding agents.
|
|
10
|
+
|
|
11
|
+
Treat it as a mature product framework:
|
|
12
|
+
|
|
13
|
+
- not a pet project
|
|
14
|
+
- not a toy runtime
|
|
15
|
+
- not a loose collection of optional recipes
|
|
16
|
+
|
|
17
|
+
The framework prefers one clear path, strict contracts, and product-grade discipline over flexibility for its own sake.
|
|
18
|
+
|
|
19
|
+
## Quick Reference
|
|
20
|
+
|
|
21
|
+
\`\`\`
|
|
22
|
+
Runtime: Bun | Language: TypeScript + JSX | Reactivity: Signals (no VDOM)
|
|
23
|
+
\`\`\`
|
|
24
|
+
|
|
25
|
+
## Project Structure
|
|
26
|
+
|
|
27
|
+
\`\`\`
|
|
28
|
+
routes/ Page and API routes (file-based routing)
|
|
29
|
+
index.ts / (home page)
|
|
30
|
+
about.tsx /about
|
|
31
|
+
users/
|
|
32
|
+
index.tsx /users
|
|
33
|
+
[id].tsx /users/:id (dynamic)
|
|
34
|
+
api/
|
|
35
|
+
health.ts API endpoint (no UI)
|
|
36
|
+
_layout.tsx Layout wrapper for folder
|
|
37
|
+
_middleware.ts Middleware for folder
|
|
38
|
+
shared/ Shared types and utilities
|
|
39
|
+
middleware/ Global middleware
|
|
40
|
+
migrations/ Database migrations (SQL)
|
|
41
|
+
public/ Static files
|
|
42
|
+
app.config.ts Configuration
|
|
43
|
+
\`\`\`
|
|
44
|
+
|
|
45
|
+
## Imports
|
|
46
|
+
|
|
47
|
+
\`\`\`typescript
|
|
48
|
+
// Browser-safe route code
|
|
49
|
+
import { createSignal, createComputed, createEffect, createResource, createStore } from "gorsee/client"
|
|
50
|
+
|
|
51
|
+
// Server runtime contracts
|
|
52
|
+
import { server, middleware, type Context } from "gorsee/server"
|
|
53
|
+
|
|
54
|
+
// Domain-focused server surfaces
|
|
55
|
+
import { createDB } from "gorsee/db"
|
|
56
|
+
import { createAuth } from "gorsee/auth"
|
|
57
|
+
import { cors } from "gorsee/security"
|
|
58
|
+
import { log } from "gorsee/log"
|
|
59
|
+
\`\`\`
|
|
60
|
+
|
|
61
|
+
## Import Boundaries
|
|
62
|
+
|
|
63
|
+
- \`gorsee/client\` for route components, islands, navigation, forms, and reactive primitives
|
|
64
|
+
- \`gorsee/server\` for middleware, \`load\`, \`action\`, RPC, cache, and route execution
|
|
65
|
+
- prefer scoped subpaths such as \`gorsee/auth\`, \`gorsee/db\`, \`gorsee/security\`, \`gorsee/env\`, and \`gorsee/log\` when the concern is already domain-specific
|
|
66
|
+
- Root \`gorsee\` is compatibility-only and should not be used in new code
|
|
67
|
+
- \`gorsee/compat\` is available as an explicit legacy migration entrypoint
|
|
68
|
+
|
|
69
|
+
## Engineering Doctrine
|
|
70
|
+
|
|
71
|
+
- Prefer deterministic architecture over multiple equivalent patterns.
|
|
72
|
+
- Prefer built-in framework guarantees over handwritten recipes.
|
|
73
|
+
- Preserve fine-grained reactivity and avoid VDOM-style architectural drift.
|
|
74
|
+
- Treat security, deploy assumptions, and AI diagnostics as part of the framework contract.
|
|
75
|
+
- If a pattern must exist, it should be easy for both humans and agents to infer from structure and docs.
|
|
76
|
+
|
|
77
|
+
## Adapter Recipes
|
|
78
|
+
|
|
79
|
+
\`\`\`typescript
|
|
80
|
+
import { createClient } from "redis"
|
|
81
|
+
import {
|
|
82
|
+
createRedisSessionStore,
|
|
83
|
+
createRedisCacheStore,
|
|
84
|
+
createNodeRedisLikeClient,
|
|
85
|
+
routeCache,
|
|
86
|
+
} from "gorsee/server"
|
|
87
|
+
import { createAuth } from "gorsee/auth"
|
|
88
|
+
import { createCSRFMiddleware } from "gorsee/security"
|
|
89
|
+
|
|
90
|
+
const redis = createClient({ url: process.env.REDIS_URL })
|
|
91
|
+
await redis.connect()
|
|
92
|
+
const redisClient = createNodeRedisLikeClient(redis)
|
|
93
|
+
|
|
94
|
+
const auth = createAuth({
|
|
95
|
+
secret: process.env.SESSION_SECRET!,
|
|
96
|
+
store: createRedisSessionStore(redisClient, { prefix: "app:sessions" }),
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
export const cache = routeCache({
|
|
100
|
+
maxAge: 60,
|
|
101
|
+
staleWhileRevalidate: 300,
|
|
102
|
+
mode: "public", // default mode is private/auth-aware
|
|
103
|
+
store: createRedisCacheStore(redisClient, {
|
|
104
|
+
prefix: "app:cache",
|
|
105
|
+
maxEntryAgeMs: 360_000,
|
|
106
|
+
}),
|
|
107
|
+
})
|
|
108
|
+
\`\`\`
|
|
109
|
+
|
|
110
|
+
- SQLite adapters are the default persistent single-node path
|
|
111
|
+
- Redis adapters are the default multi-instance path
|
|
112
|
+
- \`createNodeRedisLikeClient()\` and \`createIORedisLikeClient()\` normalize real Redis SDK clients to the framework adapter contract
|
|
113
|
+
- \`routeCache()\` defaults to \`mode: "private"\` and varies by \`Cookie\`, \`Authorization\`, \`Accept\`, and \`X-Gorsee-Navigate\`
|
|
114
|
+
- Use \`mode: "public"\` or \`mode: "shared"\` only for intentionally non-personalized cache entries
|
|
115
|
+
- RPC handlers remain process-local by design; do not try to distribute closures through Redis
|
|
116
|
+
|
|
117
|
+
## RPC Security
|
|
118
|
+
|
|
119
|
+
\`\`\`typescript
|
|
120
|
+
import { handleRPCRequestWithPolicy } from "gorsee/server"
|
|
121
|
+
import { createAuth } from "gorsee/auth"
|
|
122
|
+
import { createCSRFMiddleware } from "gorsee/security"
|
|
123
|
+
|
|
124
|
+
const auth = createAuth({ secret: process.env.SESSION_SECRET! })
|
|
125
|
+
|
|
126
|
+
const rpcResponse = await handleRPCRequestWithPolicy(request, {
|
|
127
|
+
middlewares: [
|
|
128
|
+
auth.protect(),
|
|
129
|
+
createCSRFMiddleware(process.env.SESSION_SECRET!),
|
|
130
|
+
],
|
|
131
|
+
})
|
|
132
|
+
\`\`\`
|
|
133
|
+
|
|
134
|
+
- RPC is \`POST\`-only
|
|
135
|
+
- RPC uses a versioned envelope over \`application/vnd.gorsee-rpc+json\`
|
|
136
|
+
- Route \`_middleware.ts\` does not automatically protect \`/api/_rpc/*\`
|
|
137
|
+
- Apply auth/CSRF policy explicitly at the RPC boundary
|
|
138
|
+
|
|
139
|
+
## AI Observability
|
|
140
|
+
|
|
141
|
+
\`\`\`typescript
|
|
142
|
+
export default {
|
|
143
|
+
ai: {
|
|
144
|
+
enabled: true,
|
|
145
|
+
jsonlPath: ".gorsee/ai-events.jsonl",
|
|
146
|
+
diagnosticsPath: ".gorsee/ai-diagnostics.json",
|
|
147
|
+
sessionPack: {
|
|
148
|
+
enabled: true,
|
|
149
|
+
outDir: ".gorsee/agent",
|
|
150
|
+
triggerKinds: ["diagnostic.issue", "request.error", "build.summary", "check.summary"],
|
|
151
|
+
},
|
|
152
|
+
bridge: {
|
|
153
|
+
url: "http://127.0.0.1:4318/gorsee/ai-events",
|
|
154
|
+
timeoutMs: 250,
|
|
155
|
+
events: ["diagnostic.issue", "check.summary", "build.summary", "request.error"],
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
}
|
|
159
|
+
\`\`\`
|
|
160
|
+
|
|
161
|
+
- AI observability is opt-in and must not change app behavior when disabled
|
|
162
|
+
- \`.gorsee/ai-events.jsonl\` is the canonical machine-readable event stream for agents and IDE tooling
|
|
163
|
+
- \`.gorsee/ai-diagnostics.json\` keeps the latest error/warning snapshot for fast IDE polling
|
|
164
|
+
- \`.gorsee/ide/diagnostics.json\`, \`.gorsee/ide/events.json\`, and \`.gorsee/ide/context.md\` are editor-facing projections produced by \`gorsee ai ide-sync\`
|
|
165
|
+
- \`.gorsee/ide/events.json\` now includes \`artifactRegressions\` plus event-level \`artifact\` / \`version\` metadata for release/deploy/build drift
|
|
166
|
+
- \`.gorsee/agent/latest.json\` and \`.gorsee/agent/latest.md\` are session packs for agents; they can be generated manually with \`gorsee ai pack\` or automatically after error/build/check triggers
|
|
167
|
+
- \`gorsee ai doctor\` clusters repeated failures by trace/request/file/route so agents can spot systemic regressions quickly
|
|
168
|
+
- \`gorsee ai doctor\` and \`gorsee ai export\` also surface artifact regressions, so agents can reason about broken tarballs, VSIX files, build outputs, and deploy configs without separate tooling
|
|
169
|
+
- Bridge delivery is best-effort only; a dead IDE bridge must never fail the request/build/check path
|
|
170
|
+
- Event schema carries \`requestId\`, \`traceId\`, \`spanId\`, \`route\`, \`code\`, \`file\`, \`line\`, and \`durationMs\`
|
|
171
|
+
- Prefer AI events over scraped console logs when automating analysis
|
|
172
|
+
- Use \`gorsee ai export --bundle\` when an agent needs a compact context packet plus root-cause-ranked code snippets
|
|
173
|
+
- Use \`gorsee ai pack\` when you want the latest context bundle written to disk for another tool to pick up
|
|
174
|
+
- Use \`bun run ai:package:vscode\` to stage and package the VS Code/Cursor extension consumer from \`integrations/vscode-gorsee-ai\`
|
|
175
|
+
- Use \`bun run release:extension\` to build a version-locked VSIX release artifact
|
|
176
|
+
- In the VS Code/Cursor extension, use \`Gorsee AI: Show Context\` for the full context packet and \`Gorsee AI: Show Artifact Regressions\` for release/deploy/build drift
|
|
177
|
+
|
|
178
|
+
## Failure References
|
|
179
|
+
|
|
180
|
+
- Use \`docs/RUNTIME_FAILURES.md\` for common production/runtime failures
|
|
181
|
+
- Use \`docs/RUNTIME_TRIAGE.md\` for operator triage flow
|
|
182
|
+
- Use \`docs/CACHE_INVALIDATION.md\` before widening cache scope
|
|
183
|
+
- Use \`docs/STREAMING_HYDRATION_FAILURES.md\` when streaming or hydration behavior drifts
|
|
184
|
+
- Use \`docs/STARTER_FAILURES.md\` for common scaffold/setup mistakes
|
|
185
|
+
|
|
186
|
+
## AI Workflow References
|
|
187
|
+
|
|
188
|
+
- Use \`docs/AI_WORKFLOWS.md\` for the overall human + agent operating model
|
|
189
|
+
- Use \`docs/AI_IDE_SYNC_WORKFLOW.md\` for editor projections
|
|
190
|
+
- Use \`docs/AI_MCP_WORKFLOW.md\` for MCP consumers
|
|
191
|
+
- Use \`docs/AI_BRIDGE_WORKFLOW.md\` for local bridge ingestion
|
|
192
|
+
- Use \`docs/AI_TOOL_BUILDERS.md\` when building external consumers
|
|
193
|
+
- Use \`docs/AI_SURFACE_STABILITY.md\` before changing AI-facing contracts
|
|
194
|
+
- Use \`docs/AI_SESSION_PACKS.md\` for cross-session handoff
|
|
195
|
+
- Use \`docs/AI_DEBUGGING_WORKFLOWS.md\` for diagnostics-first debugging
|
|
196
|
+
|
|
197
|
+
## Product DX References
|
|
198
|
+
|
|
199
|
+
- Use \`docs/STARTER_ONBOARDING.md\` to choose the right app class
|
|
200
|
+
- Use \`docs/MIGRATION_GUIDE.md\` when cleaning up compatibility imports
|
|
201
|
+
- Use \`docs/UPGRADE_PLAYBOOK.md\` before release-channel or contract upgrades
|
|
202
|
+
- Use \`docs/DEPLOY_TARGET_GUIDE.md\` before committing to a deploy target
|
|
203
|
+
- Use \`docs/FIRST_PRODUCTION_ROLLOUT.md\` for the first real launch
|
|
204
|
+
- Use \`docs/AUTH_CACHE_DATA_PATHS.md\` to choose auth/cache/data defaults by app class
|
|
205
|
+
- Use \`docs/RECIPE_BOUNDARIES.md\` when a recipe looks stretched beyond its intended shape
|
|
206
|
+
- Use \`docs/WORKSPACE_ADOPTION.md\` for monorepo/workspace layouts
|
|
207
|
+
- Use \`docs/TEAM_FAILURES.md\` for common team-level adoption mistakes
|
|
208
|
+
|
|
209
|
+
## Patterns
|
|
210
|
+
|
|
211
|
+
### Page Route
|
|
212
|
+
|
|
213
|
+
\`\`\`typescript
|
|
214
|
+
// routes/users/index.tsx
|
|
215
|
+
import { ssrJsx as h } from "gorsee/runtime"
|
|
216
|
+
import { SafeSQL } from "gorsee/types"
|
|
217
|
+
import { createDB } from "gorsee/db"
|
|
218
|
+
|
|
219
|
+
const db = createDB()
|
|
220
|
+
|
|
221
|
+
export default function UsersPage() {
|
|
222
|
+
const users = db.all<User>(SafeSQL\`SELECT * FROM users\`)
|
|
223
|
+
return h("ul", {
|
|
224
|
+
children: users.map(u => h("li", { children: u.name }))
|
|
225
|
+
})
|
|
226
|
+
}
|
|
227
|
+
\`\`\`
|
|
228
|
+
|
|
229
|
+
### Dynamic Route
|
|
230
|
+
|
|
231
|
+
\`\`\`typescript
|
|
232
|
+
// routes/users/[id].tsx
|
|
233
|
+
export default function UserPage(props: { params: { id: string } }) {
|
|
234
|
+
const user = db.get<User>(SafeSQL\`SELECT * FROM users WHERE id = \${Number(props.params.id)}\`)
|
|
235
|
+
if (!user) return h("div", { children: "Not found" })
|
|
236
|
+
return h("h1", { children: user.name })
|
|
237
|
+
}
|
|
238
|
+
\`\`\`
|
|
239
|
+
|
|
240
|
+
### API Route
|
|
241
|
+
|
|
242
|
+
\`\`\`typescript
|
|
243
|
+
// routes/api/users.ts
|
|
244
|
+
import type { Context } from "gorsee/server"
|
|
245
|
+
|
|
246
|
+
export function GET(ctx: Context): Response {
|
|
247
|
+
return Response.json({ users: [] })
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
export function POST(ctx: Context): Response {
|
|
251
|
+
return Response.json({ created: true }, { status: 201 })
|
|
252
|
+
}
|
|
253
|
+
\`\`\`
|
|
254
|
+
|
|
255
|
+
### Route Action
|
|
256
|
+
|
|
257
|
+
\`\`\`typescript
|
|
258
|
+
// routes/users/new.tsx
|
|
259
|
+
import { defineForm, defineFormAction } from "gorsee/forms"
|
|
260
|
+
|
|
261
|
+
const userForm = defineForm<{ name: string }>([
|
|
262
|
+
{ name: "name", rules: { required: true }, label: "Name" },
|
|
263
|
+
])
|
|
264
|
+
|
|
265
|
+
export const action = defineFormAction(userForm, async ({ data }) => {
|
|
266
|
+
await db.run(SafeSQL\`INSERT INTO users (name) VALUES (\${data.name})\`)
|
|
267
|
+
return { ok: true, data: { created: true } }
|
|
268
|
+
})
|
|
269
|
+
\`\`\`
|
|
270
|
+
|
|
271
|
+
### Middleware
|
|
272
|
+
|
|
273
|
+
\`\`\`typescript
|
|
274
|
+
// routes/_middleware.ts
|
|
275
|
+
import { middleware } from "gorsee/server"
|
|
276
|
+
|
|
277
|
+
export default middleware(async (ctx, next) => {
|
|
278
|
+
const session = ctx.cookies.get("session")
|
|
279
|
+
if (!session) return ctx.redirect("/login")
|
|
280
|
+
ctx.locals.user = await getUser(session)
|
|
281
|
+
return next()
|
|
282
|
+
})
|
|
283
|
+
\`\`\`
|
|
284
|
+
|
|
285
|
+
### Signals
|
|
286
|
+
|
|
287
|
+
\`\`\`typescript
|
|
288
|
+
const [count, setCount] = createSignal(0) // reactive value
|
|
289
|
+
const doubled = createComputed(() => count() * 2) // derived
|
|
290
|
+
createEffect(() => console.log(count())) // side effect
|
|
291
|
+
const [data] = createResource(fetchData) // async resource
|
|
292
|
+
const [store, setStore] = createStore({ a: 1 }) // reactive object
|
|
293
|
+
\`\`\`
|
|
294
|
+
|
|
295
|
+
### SafeSQL (prevents SQL injection at compile time)
|
|
296
|
+
|
|
297
|
+
\`\`\`typescript
|
|
298
|
+
// OK:
|
|
299
|
+
db.get(SafeSQL\`SELECT * FROM users WHERE id = \${id}\`)
|
|
300
|
+
|
|
301
|
+
// COMPILE ERROR -- string not assignable to SafeSQL:
|
|
302
|
+
db.get(\`SELECT * FROM users WHERE id = \${id}\`)
|
|
303
|
+
db.get("SELECT * FROM users WHERE id = " + id)
|
|
304
|
+
\`\`\`
|
|
305
|
+
|
|
306
|
+
## Configuration (app.config.ts)
|
|
307
|
+
|
|
308
|
+
\`\`\`typescript
|
|
309
|
+
export default {
|
|
310
|
+
port: 3000,
|
|
311
|
+
db: { driver: "sqlite", url: "./data.sqlite" },
|
|
312
|
+
log: "info", // off | error | info | verbose | debug
|
|
313
|
+
security: {
|
|
314
|
+
origin: process.env.APP_ORIGIN ?? "https://app.example.com",
|
|
315
|
+
proxy: {
|
|
316
|
+
preset: "none",
|
|
317
|
+
trustForwardedHeaders: false,
|
|
318
|
+
trustedForwardedHops: 1,
|
|
319
|
+
},
|
|
320
|
+
csp: true,
|
|
321
|
+
hsts: true,
|
|
322
|
+
csrf: true,
|
|
323
|
+
rateLimit: { requests: 100, window: "1m" },
|
|
324
|
+
},
|
|
325
|
+
// RPC is a separate boundary from route _middleware.ts
|
|
326
|
+
// security: { rpc: { middlewares: [auth.protect(), createCSRFMiddleware(process.env.SESSION_SECRET!)] } },
|
|
327
|
+
deploy: { target: "bun" }, // bun | cloudflare | deno | node
|
|
328
|
+
}
|
|
329
|
+
\`\`\`
|
|
330
|
+
|
|
331
|
+
- Replace placeholder origins in deploy configs and \`security.origin\` before production rollout.
|
|
332
|
+
- \`gorsee check --strict\` escalates floating runtime dependency versions and placeholder origin values to errors.
|
|
333
|
+
|
|
334
|
+
## Security Docs
|
|
335
|
+
|
|
336
|
+
- \`SECURITY.md\` defines disclosure policy, reporting path, and the rule that security bugs are treated as broken framework invariants.
|
|
337
|
+
- \`docs/PRODUCT_VISION.md\` defines the product position and market thesis.
|
|
338
|
+
- \`docs/FRAMEWORK_DOCTRINE.md\` defines non-negotiable engineering principles.
|
|
339
|
+
- \`docs/TOP_TIER_ROADMAP.md\` defines the maturity roadmap to top-tier framework quality.
|
|
340
|
+
- \`docs/CANONICAL_RECIPES.md\` defines the recommended production paths for secure SaaS apps, content sites, internal tools, and workspace-based apps.
|
|
341
|
+
- \`docs/API_STABILITY.md\` defines stable, compatibility, experimental, and internal API tiers.
|
|
342
|
+
- \`docs/AI_ARTIFACT_CONTRACT.md\` defines versioned AI packet, IDE projection, and session-pack artifact expectations.
|
|
343
|
+
- \`docs/SUPPORT_MATRIX.md\` defines what the product currently supports and validates.
|
|
344
|
+
- \`docs/DEPRECATION_POLICY.md\` defines how public behavior is deprecated and migrated.
|
|
345
|
+
- \`docs/SECURITY_MODEL.md\` defines framework guarantees around request ordering, canonical origin, internal/public boundaries, cache expectations, RPC, and adapter assumptions.
|
|
346
|
+
- \`docs/SECURE_PATTERNS.md\` lists preferred and unsafe usage patterns for auth, redirects, cache, RPC, origins, proxy headers, provider presets, dev server exposure, and file serving.
|
|
347
|
+
- \`docs/ADAPTER_SECURITY.md\` documents provider-specific deploy assumptions for Vercel, Cloudflare, Netlify, Fly.io, and Docker.
|
|
348
|
+
- \`docs/RELEASE_POLICY.md\` defines stable/canary/rc channel rules and the intended release train for security-sensitive changes.
|
|
349
|
+
- \`docs/RELEASE_CHECKLIST.md\` defines the operator-facing stable/canary/rc checklist and the invariants that must hold before publishing.
|
|
350
|
+
- \`docs/CI_POLICY.md\` defines the required CI gates, change-sensitive rules, release-train validation, and the exact Bun contract used in automation.
|
|
351
|
+
|
|
352
|
+
## CLI
|
|
353
|
+
|
|
354
|
+
\`\`\`
|
|
355
|
+
gorsee dev Start dev server
|
|
356
|
+
gorsee build Production build
|
|
357
|
+
gorsee check Type + safety + structure check
|
|
358
|
+
gorsee check --rewrite-imports --rewrite-loaders
|
|
359
|
+
Normalize canonical imports and loader aliases before auditing
|
|
360
|
+
gorsee ai doctor Summarize AI diagnostics and incidents
|
|
361
|
+
gorsee ai replay Reconstruct recent correlated AI event timeline
|
|
362
|
+
gorsee ai export Export a compact agent-ready context packet
|
|
363
|
+
gorsee ai ide-sync Write IDE-friendly diagnostics/events/context files
|
|
364
|
+
gorsee ai mcp Expose local AI state as a stdio MCP server
|
|
365
|
+
gorsee routes List all routes
|
|
366
|
+
gorsee migrate Run database migrations
|
|
367
|
+
gorsee generate X Generate CRUD for entity X
|
|
368
|
+
\`\`\`
|
|
369
|
+
|
|
370
|
+
- For migration cleanup, prefer \`gorsee upgrade --rewrite-imports --check --report docs/upgrade-report.json\`.
|
|
371
|
+
|
|
372
|
+
## Error Codes
|
|
373
|
+
|
|
374
|
+
| Code | Category | Description |
|
|
375
|
+
|------|----------|-------------|
|
|
376
|
+
| E001 | SafeSQL | Raw string in SQL query |
|
|
377
|
+
| E002 | SafeHTML | Unsanitized HTML |
|
|
378
|
+
| E003 | Server | Closure captures client variable |
|
|
379
|
+
| E004 | URL | Invalid URL |
|
|
380
|
+
| E005 | URL | Disallowed protocol |
|
|
381
|
+
|
|
382
|
+
## Security (enabled by default)
|
|
383
|
+
|
|
384
|
+
- CSP with nonce (no inline scripts except framework)
|
|
385
|
+
- HSTS (production)
|
|
386
|
+
- CSRF tokens (auto for POST)
|
|
387
|
+
- Rate limiting (100 req/min default)
|
|
388
|
+
- X-Frame-Options: DENY
|
|
389
|
+
- X-Content-Type-Options: nosniff
|
|
390
|
+
`;
|
|
391
|
+
}
|