gorsee 0.2.4 → 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 +101 -45
- package/bin/gorsee.js +0 -2
- 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,131 @@
|
|
|
1
|
+
export const SERVER_SCOPED_IMPORTS = new Map([
|
|
2
|
+
["createAuth", "gorsee/auth"],
|
|
3
|
+
["createMemorySessionStore", "gorsee/auth"],
|
|
4
|
+
["createNamespacedSessionStore", "gorsee/auth"],
|
|
5
|
+
["createRedisSessionStore", "gorsee/auth"],
|
|
6
|
+
["createSQLiteSessionStore", "gorsee/auth"],
|
|
7
|
+
["createAuthActionTokenManager", "gorsee/auth"],
|
|
8
|
+
["createMemoryAuthActionTokenStore", "gorsee/auth"],
|
|
9
|
+
["sessionHasRole", "gorsee/auth"],
|
|
10
|
+
["sessionHasPermission", "gorsee/auth"],
|
|
11
|
+
["AuthConfig", "gorsee/auth"],
|
|
12
|
+
["AuthEvent", "gorsee/auth"],
|
|
13
|
+
["AuthEventHandler", "gorsee/auth"],
|
|
14
|
+
["AuthActionTokenClaims", "gorsee/auth"],
|
|
15
|
+
["AuthActionTokenPurpose", "gorsee/auth"],
|
|
16
|
+
["AuthActionTokenReplayStore", "gorsee/auth"],
|
|
17
|
+
["PermissionResolver", "gorsee/auth"],
|
|
18
|
+
["Session", "gorsee/auth"],
|
|
19
|
+
["SessionStore", "gorsee/auth"],
|
|
20
|
+
["createDB", "gorsee/db"],
|
|
21
|
+
["createPostgresDB", "gorsee/db"],
|
|
22
|
+
["toPostgresSQL", "gorsee/db"],
|
|
23
|
+
["runMigrations", "gorsee/db"],
|
|
24
|
+
["createMigration", "gorsee/db"],
|
|
25
|
+
["DB", "gorsee/db"],
|
|
26
|
+
["PostgresDB", "gorsee/db"],
|
|
27
|
+
["PostgresClientLike", "gorsee/db"],
|
|
28
|
+
["PostgresConnectionLike", "gorsee/db"],
|
|
29
|
+
["PostgresPoolLike", "gorsee/db"],
|
|
30
|
+
["PostgresQueryResult", "gorsee/db"],
|
|
31
|
+
["MigrationResult", "gorsee/db"],
|
|
32
|
+
["securityHeaders", "gorsee/security"],
|
|
33
|
+
["csrfProtection", "gorsee/security"],
|
|
34
|
+
["createCSRFMiddleware", "gorsee/security"],
|
|
35
|
+
["generateCSRFToken", "gorsee/security"],
|
|
36
|
+
["validateCSRFToken", "gorsee/security"],
|
|
37
|
+
["createRateLimiter", "gorsee/security"],
|
|
38
|
+
["createRedisRateLimiter", "gorsee/security"],
|
|
39
|
+
["parseRateLimitWindow", "gorsee/security"],
|
|
40
|
+
["cors", "gorsee/security"],
|
|
41
|
+
["SecurityConfig", "gorsee/security"],
|
|
42
|
+
["RateLimiter", "gorsee/security"],
|
|
43
|
+
["AsyncRateLimiter", "gorsee/security"],
|
|
44
|
+
["AsyncRateLimitResult", "gorsee/security"],
|
|
45
|
+
["CORSOptions", "gorsee/security"],
|
|
46
|
+
["env", "gorsee/env"],
|
|
47
|
+
["getPublicEnv", "gorsee/env"],
|
|
48
|
+
["loadEnv", "gorsee/env"],
|
|
49
|
+
["log", "gorsee/log"],
|
|
50
|
+
["setLogLevel", "gorsee/log"],
|
|
51
|
+
["setupI18n", "gorsee/i18n"],
|
|
52
|
+
["loadLocale", "gorsee/i18n"],
|
|
53
|
+
["getLocale", "gorsee/i18n"],
|
|
54
|
+
["getLocales", "gorsee/i18n"],
|
|
55
|
+
["getDefaultLocale", "gorsee/i18n"],
|
|
56
|
+
["getFallbackLocales", "gorsee/i18n"],
|
|
57
|
+
["setLocale", "gorsee/i18n"],
|
|
58
|
+
["t", "gorsee/i18n"],
|
|
59
|
+
["plural", "gorsee/i18n"],
|
|
60
|
+
["negotiateLocale", "gorsee/i18n"],
|
|
61
|
+
["resolveLocaleFromPath", "gorsee/i18n"],
|
|
62
|
+
["stripLocalePrefix", "gorsee/i18n"],
|
|
63
|
+
["withLocalePath", "gorsee/i18n"],
|
|
64
|
+
["buildHreflangLinks", "gorsee/i18n"],
|
|
65
|
+
["formatNumber", "gorsee/i18n"],
|
|
66
|
+
["formatDate", "gorsee/i18n"],
|
|
67
|
+
["formatRelativeTime", "gorsee/i18n"],
|
|
68
|
+
["I18nConfig", "gorsee/i18n"],
|
|
69
|
+
["LocaleNegotiationInput", "gorsee/i18n"],
|
|
70
|
+
["LocaleNegotiationResult", "gorsee/i18n"],
|
|
71
|
+
["loadContentCollection", "gorsee/content"],
|
|
72
|
+
["parseFrontmatter", "gorsee/content"],
|
|
73
|
+
["extractExcerpt", "gorsee/content"],
|
|
74
|
+
["queryContent", "gorsee/content"],
|
|
75
|
+
["getContentEntryBySlug", "gorsee/content"],
|
|
76
|
+
["ContentCollectionOptions", "gorsee/content"],
|
|
77
|
+
["ContentEntry", "gorsee/content"],
|
|
78
|
+
["ContentQueryOptions", "gorsee/content"]
|
|
79
|
+
]), CLIENT_SCOPED_IMPORTS = new Map([
|
|
80
|
+
["defineForm", "gorsee/forms"],
|
|
81
|
+
["defineFormAction", "gorsee/forms"],
|
|
82
|
+
["validateForm", "gorsee/forms"],
|
|
83
|
+
["validateAction", "gorsee/forms"],
|
|
84
|
+
["toFieldErrors", "gorsee/forms"],
|
|
85
|
+
["fieldAttrs", "gorsee/forms"],
|
|
86
|
+
["actionSuccess", "gorsee/forms"],
|
|
87
|
+
["actionFailure", "gorsee/forms"],
|
|
88
|
+
["FormField", "gorsee/forms"],
|
|
89
|
+
["FormSchema", "gorsee/forms"],
|
|
90
|
+
["ValidationResult", "gorsee/forms"],
|
|
91
|
+
["ActionValidationResult", "gorsee/forms"],
|
|
92
|
+
["ValidationError", "gorsee/forms"],
|
|
93
|
+
["DefineFormActionOptions", "gorsee/forms"],
|
|
94
|
+
["FormActionContext", "gorsee/forms"],
|
|
95
|
+
["ActionResult", "gorsee/forms"],
|
|
96
|
+
["typedLink", "gorsee/routes"],
|
|
97
|
+
["typedNavigate", "gorsee/routes"],
|
|
98
|
+
["typedPrefetch", "gorsee/routes"],
|
|
99
|
+
["resolveTypedRouteTarget", "gorsee/routes"],
|
|
100
|
+
["buildSearchParams", "gorsee/routes"],
|
|
101
|
+
["buildTypedPath", "gorsee/routes"],
|
|
102
|
+
["createTypedRoute", "gorsee/routes"],
|
|
103
|
+
["extractRouteParamKeys", "gorsee/routes"],
|
|
104
|
+
["TypedRouteDefinition", "gorsee/routes"],
|
|
105
|
+
["TypedRouteTarget", "gorsee/routes"]
|
|
106
|
+
]);
|
|
107
|
+
export function collectCanonicalImportDrift(imports) {
|
|
108
|
+
const drift = [];
|
|
109
|
+
for (const entry of imports) {
|
|
110
|
+
if (entry.specifier === "gorsee/server") {
|
|
111
|
+
const replacements = collectScopedReplacements(entry, SERVER_SCOPED_IMPORTS);
|
|
112
|
+
if (replacements.size > 0)
|
|
113
|
+
drift.push({ source: "gorsee/server", replacements });
|
|
114
|
+
}
|
|
115
|
+
if (entry.specifier === "gorsee/client") {
|
|
116
|
+
const replacements = collectScopedReplacements(entry, CLIENT_SCOPED_IMPORTS);
|
|
117
|
+
if (replacements.size > 0)
|
|
118
|
+
drift.push({ source: "gorsee/client", replacements });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return drift;
|
|
122
|
+
}
|
|
123
|
+
function collectScopedReplacements(entry, scopedMap) {
|
|
124
|
+
const replacements = new Map;
|
|
125
|
+
for (const name of entry.names) {
|
|
126
|
+
const target = scopedMap.get(name);
|
|
127
|
+
if (target)
|
|
128
|
+
replacements.set(name, target);
|
|
129
|
+
}
|
|
130
|
+
return replacements;
|
|
131
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type ModuleImportFact } from "../compiler/module-analysis.js";
|
|
2
|
+
export interface ASTCheckIssue {
|
|
3
|
+
code: string;
|
|
4
|
+
file: string;
|
|
5
|
+
line?: number;
|
|
6
|
+
message: string;
|
|
7
|
+
fix?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ASTFileFacts {
|
|
10
|
+
issues: ASTCheckIssue[];
|
|
11
|
+
hasServerCall: boolean;
|
|
12
|
+
hasRouteCacheCall: boolean;
|
|
13
|
+
hasCreateAuthCall: boolean;
|
|
14
|
+
hasRedirectCall: boolean;
|
|
15
|
+
hasCtxRedirectCall: boolean;
|
|
16
|
+
hasLegacyLoaderExport: boolean;
|
|
17
|
+
importsRootGorsee: boolean;
|
|
18
|
+
imports: ModuleImportFact[];
|
|
19
|
+
}
|
|
20
|
+
export declare function analyzeFileWithAST(file: string, cwd: string, content: string): Promise<ASTFileFacts | null>;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { relative } from "node:path";
|
|
2
|
+
import { analyzeModuleSource } from "../compiler/module-analysis.js";
|
|
3
|
+
let tsModulePromise = null;
|
|
4
|
+
async function loadTypeScript() {
|
|
5
|
+
if (!tsModulePromise)
|
|
6
|
+
tsModulePromise = import("typescript").catch(() => null);
|
|
7
|
+
return tsModulePromise;
|
|
8
|
+
}
|
|
9
|
+
function pushIssue(issues, seen, issue) {
|
|
10
|
+
const key = `${issue.code}:${issue.file}:${issue.line ?? 0}:${issue.message}`;
|
|
11
|
+
if (seen.has(key))
|
|
12
|
+
return;
|
|
13
|
+
seen.add(key);
|
|
14
|
+
issues.push(issue);
|
|
15
|
+
}
|
|
16
|
+
function isIdentifier(ts, node, name) {
|
|
17
|
+
return ts.isIdentifier(node) && node.text === name;
|
|
18
|
+
}
|
|
19
|
+
function getLine(ts, sourceFile, node) {
|
|
20
|
+
return sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1;
|
|
21
|
+
}
|
|
22
|
+
function isLiteralRedirectTarget(ts, node) {
|
|
23
|
+
if (!node)
|
|
24
|
+
return !1;
|
|
25
|
+
if (ts.isStringLiteralLike(node))
|
|
26
|
+
return !0;
|
|
27
|
+
if (ts.isNoSubstitutionTemplateLiteral(node))
|
|
28
|
+
return !0;
|
|
29
|
+
return !1;
|
|
30
|
+
}
|
|
31
|
+
function isDbCall(ts, expr) {
|
|
32
|
+
if (!ts.isPropertyAccessExpression(expr.expression))
|
|
33
|
+
return !1;
|
|
34
|
+
const target = expr.expression.expression, method = expr.expression.name.text;
|
|
35
|
+
return isIdentifier(ts, target, "db") && ["get", "all", "run"].includes(method);
|
|
36
|
+
}
|
|
37
|
+
function hasRouteCacheIntent(ts, expr) {
|
|
38
|
+
const firstArg = expr.arguments[0];
|
|
39
|
+
if (!firstArg || !ts.isObjectLiteralExpression(firstArg))
|
|
40
|
+
return !1;
|
|
41
|
+
return firstArg.properties.some((prop) => {
|
|
42
|
+
if (!ts.isPropertyAssignment(prop) && !ts.isShorthandPropertyAssignment(prop))
|
|
43
|
+
return !1;
|
|
44
|
+
const name = prop.name?.getText(firstArg.getSourceFile()).replace(/['"]/g, "");
|
|
45
|
+
return name === "includeAuthHeaders" || name === "vary" || name === "key" || name === "mode";
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
export async function analyzeFileWithAST(file, cwd, content) {
|
|
49
|
+
const ts = await loadTypeScript();
|
|
50
|
+
if (!ts)
|
|
51
|
+
return null;
|
|
52
|
+
const sourceFile = ts.createSourceFile(file, content, ts.ScriptTarget.Latest, !0, ts.ScriptKind.TSX), moduleFacts = analyzeModuleSource(file, content), rel = relative(cwd, file), issues = [], seen = new Set, facts = {
|
|
53
|
+
issues,
|
|
54
|
+
hasServerCall: !1,
|
|
55
|
+
hasRouteCacheCall: !1,
|
|
56
|
+
hasCreateAuthCall: !1,
|
|
57
|
+
hasRedirectCall: !1,
|
|
58
|
+
hasCtxRedirectCall: !1,
|
|
59
|
+
hasLegacyLoaderExport: moduleFacts.exportedNames.has("loader"),
|
|
60
|
+
importsRootGorsee: moduleFacts.imports.some((entry) => entry.specifier === "gorsee"),
|
|
61
|
+
imports: moduleFacts.imports
|
|
62
|
+
}, visit = (node) => {
|
|
63
|
+
if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.EqualsToken && ts.isPropertyAccessExpression(node.left) && node.left.name.text === "innerHTML")
|
|
64
|
+
pushIssue(issues, seen, {
|
|
65
|
+
code: "E002",
|
|
66
|
+
file: rel,
|
|
67
|
+
line: getLine(ts, sourceFile, node),
|
|
68
|
+
message: "Direct innerHTML assignment (XSS risk)",
|
|
69
|
+
fix: "Use SafeHTML`...`, sanitize(), or DOM fragment replacement helpers"
|
|
70
|
+
});
|
|
71
|
+
if (ts.isCallExpression(node)) {
|
|
72
|
+
if (isIdentifier(ts, node.expression, "server"))
|
|
73
|
+
facts.hasServerCall = !0;
|
|
74
|
+
if (isIdentifier(ts, node.expression, "createAuth"))
|
|
75
|
+
facts.hasCreateAuthCall = !0;
|
|
76
|
+
if (isIdentifier(ts, node.expression, "routeCache")) {
|
|
77
|
+
facts.hasRouteCacheCall = !0;
|
|
78
|
+
if (!hasRouteCacheIntent(ts, node))
|
|
79
|
+
pushIssue(issues, seen, {
|
|
80
|
+
code: "W904",
|
|
81
|
+
file: rel,
|
|
82
|
+
line: getLine(ts, sourceFile, node),
|
|
83
|
+
message: "routeCache() is used without explicit public/private cache intent",
|
|
84
|
+
fix: "Set includeAuthHeaders, vary, key, or mode explicitly to document cache boundary"
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
if (isIdentifier(ts, node.expression, "redirect")) {
|
|
88
|
+
facts.hasRedirectCall = !0;
|
|
89
|
+
if (!isLiteralRedirectTarget(ts, node.arguments[0]))
|
|
90
|
+
pushIssue(issues, seen, {
|
|
91
|
+
code: "W905",
|
|
92
|
+
file: rel,
|
|
93
|
+
line: getLine(ts, sourceFile, node),
|
|
94
|
+
message: "Throwable redirect() uses a non-literal target",
|
|
95
|
+
fix: "Prefer ctx.redirect() for user-controlled values or sanitize redirect targets explicitly before throwing redirect()"
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
if (ts.isPropertyAccessExpression(node.expression) && ts.isIdentifier(node.expression.expression) && node.expression.expression.text === "ctx" && node.expression.name.text === "redirect")
|
|
99
|
+
facts.hasCtxRedirectCall = !0;
|
|
100
|
+
if (isDbCall(ts, node)) {
|
|
101
|
+
const firstArg = node.arguments[0];
|
|
102
|
+
if (firstArg) {
|
|
103
|
+
if (ts.isNoSubstitutionTemplateLiteral(firstArg) || ts.isTemplateExpression(firstArg))
|
|
104
|
+
pushIssue(issues, seen, {
|
|
105
|
+
code: "E001",
|
|
106
|
+
file: rel,
|
|
107
|
+
line: getLine(ts, sourceFile, node),
|
|
108
|
+
message: "Raw template literal in database query (SQL injection risk)",
|
|
109
|
+
fix: "Use SafeSQL`...` tagged template: db.get(SafeSQL`SELECT ...`)"
|
|
110
|
+
});
|
|
111
|
+
else if (ts.isStringLiteral(firstArg) || ts.isBinaryExpression(firstArg))
|
|
112
|
+
pushIssue(issues, seen, {
|
|
113
|
+
code: "E001",
|
|
114
|
+
file: rel,
|
|
115
|
+
line: getLine(ts, sourceFile, node),
|
|
116
|
+
message: "String concatenation in database query (SQL injection risk)",
|
|
117
|
+
fix: "Use SafeSQL`...` tagged template with parameterized values"
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
ts.forEachChild(node, visit);
|
|
123
|
+
};
|
|
124
|
+
visit(sourceFile);
|
|
125
|
+
return facts;
|
|
126
|
+
}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { createProjectContext } from "../runtime/project.js";
|
|
2
|
+
import {
|
|
3
|
+
buildAIHealthReport,
|
|
4
|
+
buildAIContextBundle,
|
|
5
|
+
buildIDEProjection,
|
|
6
|
+
createIDEProjectionWatcher,
|
|
7
|
+
createAIBridgeServer,
|
|
8
|
+
createAIContextPacket,
|
|
9
|
+
createAIMCPServer,
|
|
10
|
+
createLineReader,
|
|
11
|
+
readAIDiagnosticsSnapshot,
|
|
12
|
+
readAIEvents,
|
|
13
|
+
readReactiveTraceArtifact,
|
|
14
|
+
renderAIContextMarkdown,
|
|
15
|
+
renderAIContextBundleMarkdown,
|
|
16
|
+
resolveAIStorePaths,
|
|
17
|
+
resolveAISessionPackPaths,
|
|
18
|
+
resolveIDEProjectionPaths,
|
|
19
|
+
writeAISessionPack,
|
|
20
|
+
writeIDEProjection
|
|
21
|
+
} from "../ai/index.js";
|
|
22
|
+
export async function runAI(args, options = {}) {
|
|
23
|
+
const subcommand = args[0] ?? "help", flags = parseAIFlags(args.slice(1)), { cwd } = createProjectContext(options), paths = resolveAIStorePaths(cwd);
|
|
24
|
+
switch (subcommand) {
|
|
25
|
+
case "tail":
|
|
26
|
+
return runAITail(paths.eventsPath, flags);
|
|
27
|
+
case "doctor":
|
|
28
|
+
return runAIDoctor(paths, flags);
|
|
29
|
+
case "replay":
|
|
30
|
+
return runAIReplay(paths.eventsPath, flags);
|
|
31
|
+
case "export":
|
|
32
|
+
return runAIExport(cwd, paths, flags);
|
|
33
|
+
case "pack":
|
|
34
|
+
return runAIPack(cwd, paths, flags);
|
|
35
|
+
case "ide-sync":
|
|
36
|
+
return runAIIDESync(cwd, paths, flags);
|
|
37
|
+
case "bridge":
|
|
38
|
+
return runAIBridge(paths.eventsPath, flags);
|
|
39
|
+
case "mcp":
|
|
40
|
+
return runAIMCP(paths, flags);
|
|
41
|
+
case "help":
|
|
42
|
+
default:
|
|
43
|
+
printAIHelp();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async function runAITail(eventsPath, flags) {
|
|
47
|
+
const events = await readAIEvents(eventsPath, { limit: flags.limit ?? 20 });
|
|
48
|
+
if (flags.json) {
|
|
49
|
+
console.log(JSON.stringify(events, null, 2));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (events.length === 0) {
|
|
53
|
+
console.log(`
|
|
54
|
+
No AI events found.
|
|
55
|
+
`);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
console.log();
|
|
59
|
+
for (const event of events) {
|
|
60
|
+
const loc = [event.route, event.file && event.line ? `${event.file}:${event.line}` : event.file].filter(Boolean).join(" ");
|
|
61
|
+
console.log(` [${event.severity}] ${event.kind} ${event.message}`);
|
|
62
|
+
console.log(` ${event.ts}${loc ? ` ${loc}` : ""}`);
|
|
63
|
+
}
|
|
64
|
+
console.log();
|
|
65
|
+
}
|
|
66
|
+
async function runAIDoctor(paths, flags) {
|
|
67
|
+
const report = await buildAIHealthReport(paths, { limit: flags.limit ?? 200 }), reactiveTrace = await readReactiveTraceArtifact(paths.reactiveTracePath);
|
|
68
|
+
if (flags.json) {
|
|
69
|
+
console.log(JSON.stringify({
|
|
70
|
+
...report,
|
|
71
|
+
reactiveTrace: reactiveTrace ? {
|
|
72
|
+
schemaVersion: reactiveTrace.schemaVersion,
|
|
73
|
+
nodes: reactiveTrace.nodes.length,
|
|
74
|
+
edges: reactiveTrace.edges.length,
|
|
75
|
+
events: reactiveTrace.events.length,
|
|
76
|
+
latestEventKind: reactiveTrace.events.at(-1)?.kind
|
|
77
|
+
} : null
|
|
78
|
+
}, null, 2));
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
console.log(`
|
|
82
|
+
Gorsee AI Doctor
|
|
83
|
+
`);
|
|
84
|
+
console.log(` Events: ${report.events.total}`);
|
|
85
|
+
console.log(` Diagnostics: ${report.diagnostics.total}`);
|
|
86
|
+
console.log(` Errors: ${report.diagnostics.errors}`);
|
|
87
|
+
console.log(` Warnings: ${report.diagnostics.warnings}`);
|
|
88
|
+
if (report.events.latest)
|
|
89
|
+
console.log(` Latest event: ${report.events.latest.kind} @ ${report.events.latest.ts}`);
|
|
90
|
+
if (report.diagnostics.latest?.code)
|
|
91
|
+
console.log(` Latest diagnostic: ${report.diagnostics.latest.code} ${report.diagnostics.latest.message ?? ""}`.trim());
|
|
92
|
+
if (report.incidents.length > 0) {
|
|
93
|
+
console.log(`
|
|
94
|
+
Recent incidents:`);
|
|
95
|
+
for (const incident of report.incidents.slice(0, 5)) {
|
|
96
|
+
const loc = incident.file ? ` (${incident.file}${incident.line ? `:${incident.line}` : ""})` : incident.route ? ` (${incident.route})` : "";
|
|
97
|
+
console.log(` - [${incident.kind}] ${incident.message}${loc}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (report.incidentClusters.length > 0) {
|
|
101
|
+
console.log(`
|
|
102
|
+
Incident clusters:`);
|
|
103
|
+
for (const cluster of report.incidentClusters.slice(0, 5)) {
|
|
104
|
+
const loc = cluster.file ? ` (${cluster.file})` : cluster.route ? ` (${cluster.route})` : "";
|
|
105
|
+
console.log(` - [${cluster.kind}] x${cluster.count}${loc}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (report.artifactRegressions.length > 0) {
|
|
109
|
+
console.log(`
|
|
110
|
+
Artifact regressions:`);
|
|
111
|
+
for (const artifact of report.artifactRegressions.slice(0, 5)) {
|
|
112
|
+
const details = [artifact.version, artifact.path].filter(Boolean).join(" ");
|
|
113
|
+
console.log(` - [${artifact.phase}] errors=${artifact.errors} warnings=${artifact.warnings} successes=${artifact.successes}${details ? ` (${details})` : ""}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (reactiveTrace) {
|
|
117
|
+
console.log(`
|
|
118
|
+
Reactive trace:`);
|
|
119
|
+
console.log(` - schema=${reactiveTrace.schemaVersion} nodes=${reactiveTrace.nodes.length} edges=${reactiveTrace.edges.length} events=${reactiveTrace.events.length}`);
|
|
120
|
+
if (reactiveTrace.events.at(-1)?.kind)
|
|
121
|
+
console.log(` - latest=${reactiveTrace.events.at(-1)?.kind}`);
|
|
122
|
+
}
|
|
123
|
+
console.log();
|
|
124
|
+
}
|
|
125
|
+
async function runAIReplay(eventsPath, flags) {
|
|
126
|
+
const events = await readAIEvents(eventsPath, { limit: flags.limit ?? 50 });
|
|
127
|
+
if (events.length === 0) {
|
|
128
|
+
console.log(`
|
|
129
|
+
No AI events found.
|
|
130
|
+
`);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
console.log(`
|
|
134
|
+
Gorsee AI Replay
|
|
135
|
+
`);
|
|
136
|
+
for (const event of events) {
|
|
137
|
+
const trace = [event.requestId, event.traceId, event.spanId].filter(Boolean).join(" / "), loc = [event.route, event.file && event.line ? `${event.file}:${event.line}` : event.file].filter(Boolean).join(" "), artifact = typeof event.data?.artifact === "string" ? event.data.artifact : void 0, version = typeof event.data?.version === "string" ? event.data.version : void 0;
|
|
138
|
+
console.log(` ${event.ts} [${event.severity}] ${event.kind}`);
|
|
139
|
+
console.log(` ${event.message}`);
|
|
140
|
+
if (trace)
|
|
141
|
+
console.log(` trace: ${trace}`);
|
|
142
|
+
if (loc)
|
|
143
|
+
console.log(` loc: ${loc}`);
|
|
144
|
+
if (version || artifact)
|
|
145
|
+
console.log(` data: ${[version, artifact].filter(Boolean).join(" ")}`);
|
|
146
|
+
}
|
|
147
|
+
console.log();
|
|
148
|
+
}
|
|
149
|
+
async function runAIExport(cwd, paths, flags) {
|
|
150
|
+
if (flags.bundle) {
|
|
151
|
+
const bundle = await buildAIContextBundle(cwd, paths, { limit: flags.limit ?? 200 });
|
|
152
|
+
if ((flags.format ?? "json") === "markdown") {
|
|
153
|
+
console.log(renderAIContextBundleMarkdown(bundle));
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
console.log(JSON.stringify(bundle, null, 2));
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const events = await readAIEvents(paths.eventsPath, { limit: flags.limit ?? 200 }), diagnostics = await readAIDiagnosticsSnapshot(paths.diagnosticsPath), reactiveTrace = await readReactiveTraceArtifact(paths.reactiveTracePath), report = await buildAIHealthReport(paths, { limit: flags.limit ?? 200 }), packet = createAIContextPacket(report, events, diagnostics?.latest, reactiveTrace);
|
|
160
|
+
if ((flags.format ?? "json") === "markdown") {
|
|
161
|
+
console.log(renderAIContextMarkdown(packet));
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
console.log(JSON.stringify(packet, null, 2));
|
|
165
|
+
}
|
|
166
|
+
async function runAIPack(cwd, paths, flags) {
|
|
167
|
+
const result = await writeAISessionPack(cwd, paths, {
|
|
168
|
+
enabled: !0,
|
|
169
|
+
outDir: resolveAISessionPackPaths(cwd).outDir,
|
|
170
|
+
limit: flags.limit ?? 200
|
|
171
|
+
});
|
|
172
|
+
if (flags.json) {
|
|
173
|
+
console.log(JSON.stringify({
|
|
174
|
+
generatedAt: result.bundle.generatedAt,
|
|
175
|
+
latestJsonPath: result.paths.latestJsonPath,
|
|
176
|
+
latestMarkdownPath: result.paths.latestMarkdownPath,
|
|
177
|
+
historyDir: result.paths.historyDir,
|
|
178
|
+
snippets: result.bundle.snippets.length
|
|
179
|
+
}, null, 2));
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
console.log(`
|
|
183
|
+
Gorsee AI Session Pack
|
|
184
|
+
`);
|
|
185
|
+
console.log(` latest json -> ${result.paths.latestJsonPath}`);
|
|
186
|
+
console.log(` latest md -> ${result.paths.latestMarkdownPath}`);
|
|
187
|
+
console.log(` history -> ${result.paths.historyDir}`);
|
|
188
|
+
console.log(` snippets -> ${result.bundle.snippets.length}`);
|
|
189
|
+
console.log();
|
|
190
|
+
}
|
|
191
|
+
async function runAIIDESync(cwd, paths, flags) {
|
|
192
|
+
const projection = await buildIDEProjection(paths, { limit: flags.limit ?? 100 }), projectionPaths = resolveIDEProjectionPaths(cwd);
|
|
193
|
+
await writeIDEProjection(projectionPaths, projection);
|
|
194
|
+
if (flags.watch) {
|
|
195
|
+
createIDEProjectionWatcher({
|
|
196
|
+
storePaths: paths,
|
|
197
|
+
projectionPaths,
|
|
198
|
+
limit: flags.limit ?? 100,
|
|
199
|
+
intervalMs: flags.intervalMs ?? 1000
|
|
200
|
+
}).start();
|
|
201
|
+
console.log(`
|
|
202
|
+
Gorsee AI IDE Sync --watch
|
|
203
|
+
`);
|
|
204
|
+
console.log(` diagnostics -> ${projectionPaths.diagnosticsPath}`);
|
|
205
|
+
console.log(` events -> ${projectionPaths.eventsPath}`);
|
|
206
|
+
console.log(` context -> ${projectionPaths.contextPath}`);
|
|
207
|
+
console.log(` interval -> ${flags.intervalMs ?? 1000}ms`);
|
|
208
|
+
console.log();
|
|
209
|
+
await new Promise(() => {});
|
|
210
|
+
}
|
|
211
|
+
if (flags.json) {
|
|
212
|
+
console.log(JSON.stringify({ projectionPaths, diagnostics: projection.diagnostics.length, events: projection.recentEvents.length }, null, 2));
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
console.log(`
|
|
216
|
+
Gorsee AI IDE Sync
|
|
217
|
+
`);
|
|
218
|
+
console.log(` diagnostics -> ${projectionPaths.diagnosticsPath}`);
|
|
219
|
+
console.log(` events -> ${projectionPaths.eventsPath}`);
|
|
220
|
+
console.log(` context -> ${projectionPaths.contextPath}`);
|
|
221
|
+
console.log();
|
|
222
|
+
}
|
|
223
|
+
async function runAIBridge(eventsPath, flags) {
|
|
224
|
+
const bridge = createAIBridgeServer({
|
|
225
|
+
port: flags.port ?? 4318,
|
|
226
|
+
host: flags.host ?? "127.0.0.1",
|
|
227
|
+
persistPath: flags.persistPath ?? eventsPath
|
|
228
|
+
});
|
|
229
|
+
console.log(`
|
|
230
|
+
Gorsee AI bridge listening on http://${flags.host ?? "127.0.0.1"}:${bridge.port}/gorsee/ai-events
|
|
231
|
+
`);
|
|
232
|
+
await new Promise(() => {});
|
|
233
|
+
}
|
|
234
|
+
async function runAIMCP(paths, flags) {
|
|
235
|
+
await createAIMCPServer({
|
|
236
|
+
paths,
|
|
237
|
+
limit: flags.limit ?? 50
|
|
238
|
+
}).serve(createLineReader(process.stdin), process.stdout);
|
|
239
|
+
}
|
|
240
|
+
function parseAIFlags(args) {
|
|
241
|
+
const flags = { json: !1, bundle: !1, watch: !1 };
|
|
242
|
+
for (let i = 0;i < args.length; i++) {
|
|
243
|
+
const arg = args[i];
|
|
244
|
+
if (arg === "--json")
|
|
245
|
+
flags.json = !0;
|
|
246
|
+
if (arg === "--bundle")
|
|
247
|
+
flags.bundle = !0;
|
|
248
|
+
if (arg === "--watch")
|
|
249
|
+
flags.watch = !0;
|
|
250
|
+
if (arg === "--limit")
|
|
251
|
+
flags.limit = Number(args[i + 1] ?? "0");
|
|
252
|
+
if (arg === "--interval")
|
|
253
|
+
flags.intervalMs = Number(args[i + 1] ?? "1000");
|
|
254
|
+
if (arg === "--port")
|
|
255
|
+
flags.port = Number(args[i + 1] ?? "4318");
|
|
256
|
+
if (arg === "--host")
|
|
257
|
+
flags.host = args[i + 1];
|
|
258
|
+
if (arg === "--persist")
|
|
259
|
+
flags.persistPath = args[i + 1];
|
|
260
|
+
if (arg === "--format") {
|
|
261
|
+
const format = args[i + 1];
|
|
262
|
+
if (format === "json" || format === "markdown")
|
|
263
|
+
flags.format = format;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return flags;
|
|
267
|
+
}
|
|
268
|
+
function printAIHelp() {
|
|
269
|
+
console.log(`
|
|
270
|
+
gorsee ai <subcommand>
|
|
271
|
+
`);
|
|
272
|
+
console.log(" Subcommands:");
|
|
273
|
+
console.log(" tail Read recent structured AI events");
|
|
274
|
+
console.log(" doctor Summarize diagnostics and recent incidents");
|
|
275
|
+
console.log(" replay Replay correlated AI events in timeline order");
|
|
276
|
+
console.log(" export Export a compact AI context packet or bundle");
|
|
277
|
+
console.log(" pack Write the latest agent-ready session pack to disk");
|
|
278
|
+
console.log(" ide-sync Write IDE-friendly diagnostics/events/context files");
|
|
279
|
+
console.log(" bridge Start local HTTP bridge for IDE/agent ingestion");
|
|
280
|
+
console.log(" mcp Start stdio MCP server over local AI state");
|
|
281
|
+
console.log();
|
|
282
|
+
console.log(" Common flags:");
|
|
283
|
+
console.log(" --json Render machine-readable output");
|
|
284
|
+
console.log(" --format <fmt> json | markdown");
|
|
285
|
+
console.log(" --limit <n> Limit the amount of AI history read");
|
|
286
|
+
console.log(" --bundle Include ranked code snippets in export output");
|
|
287
|
+
console.log(" --watch Keep IDE projection files in sync");
|
|
288
|
+
console.log(" --interval <ms> Watch/poll interval for ide-sync --watch");
|
|
289
|
+
console.log();
|
|
290
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type ClientBuildBackend } from "../build/client-backend.js";
|
|
2
|
+
import { type RuntimeOptions } from "../runtime/project.js";
|
|
3
|
+
import { type AIObservabilityConfig } from "../ai/index.js";
|
|
4
|
+
export interface BuildCommandOptions extends RuntimeOptions {
|
|
5
|
+
minify?: boolean;
|
|
6
|
+
sourcemap?: boolean;
|
|
7
|
+
ai?: AIObservabilityConfig;
|
|
8
|
+
clientBuildBackend?: ClientBuildBackend;
|
|
9
|
+
}
|
|
10
|
+
export declare function buildProject(options?: BuildCommandOptions): Promise<void>;
|
|
11
|
+
export declare function watchBuildProject(options?: BuildCommandOptions): Promise<void>;
|
|
12
|
+
export declare function runBuild(args: string[], options?: BuildCommandOptions): Promise<void>;
|