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,15 @@
|
|
|
1
|
+
import type { GorseePlugin } from "./index.js";
|
|
2
|
+
export interface TailwindPluginConfig {
|
|
3
|
+
configPath?: string;
|
|
4
|
+
inputCSS?: string;
|
|
5
|
+
outputCSS?: string;
|
|
6
|
+
}
|
|
7
|
+
/** Generates tailwind.config.ts content */
|
|
8
|
+
export declare function generateTailwindConfig(options?: {
|
|
9
|
+
content?: string[];
|
|
10
|
+
theme?: Record<string, unknown>;
|
|
11
|
+
}): string;
|
|
12
|
+
/** Generates base CSS with @tailwind directives */
|
|
13
|
+
export declare function generateTailwindCSS(): string;
|
|
14
|
+
/** Creates a Tailwind CSS integration plugin */
|
|
15
|
+
export declare function tailwindPlugin(config?: TailwindPluginConfig): GorseePlugin;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { defineBuildPlugin } from "../build/plugin.js";
|
|
2
|
+
import { definePlugin } from "./index.js";
|
|
3
|
+
export function generateTailwindConfig(options) {
|
|
4
|
+
const content = options?.content ?? [
|
|
5
|
+
"./routes/**/*.{tsx,ts}",
|
|
6
|
+
"./components/**/*.{tsx,ts}"
|
|
7
|
+
], themeStr = options?.theme ? JSON.stringify(options.theme, null, 4) : "{}";
|
|
8
|
+
return `/** @type {import('tailwindcss').Config} */
|
|
9
|
+
export default {
|
|
10
|
+
content: ${JSON.stringify(content, null, 4)},
|
|
11
|
+
theme: {
|
|
12
|
+
extend: ${themeStr},
|
|
13
|
+
},
|
|
14
|
+
plugins: [],
|
|
15
|
+
}
|
|
16
|
+
`;
|
|
17
|
+
}
|
|
18
|
+
export function generateTailwindCSS() {
|
|
19
|
+
return `@tailwind base;
|
|
20
|
+
@tailwind components;
|
|
21
|
+
@tailwind utilities;
|
|
22
|
+
`;
|
|
23
|
+
}
|
|
24
|
+
export function tailwindPlugin(config = {}) {
|
|
25
|
+
const inputCSS = config.inputCSS ?? "./styles/globals.css", outputCSS = config.outputCSS ?? "./.gorsee/client/tailwind.css";
|
|
26
|
+
return definePlugin({
|
|
27
|
+
name: "gorsee-tailwind",
|
|
28
|
+
capabilities: ["styling"],
|
|
29
|
+
async setup() {
|
|
30
|
+
const configPath = config.configPath ?? "./tailwind.config.ts";
|
|
31
|
+
if (!await Bun.file(configPath).exists())
|
|
32
|
+
await Bun.write(configPath, generateTailwindConfig());
|
|
33
|
+
},
|
|
34
|
+
buildPlugins() {
|
|
35
|
+
return [
|
|
36
|
+
defineBuildPlugin({
|
|
37
|
+
name: "gorsee-tailwind-transform",
|
|
38
|
+
bun: {
|
|
39
|
+
name: "gorsee-tailwind-transform",
|
|
40
|
+
setup(build) {
|
|
41
|
+
build.onLoad({ filter: /\.css$/ }, async (args) => {
|
|
42
|
+
const source = await Bun.file(args.path).text();
|
|
43
|
+
if (source.includes("@tailwind"))
|
|
44
|
+
try {
|
|
45
|
+
await Bun.spawn(["bunx", "tailwindcss", "-i", args.path, "-o", outputCSS, "--minify"], { stdin: "inherit", stdout: "pipe", stderr: "pipe" }).exited;
|
|
46
|
+
return { contents: await Bun.file(outputCSS).text(), loader: "css" };
|
|
47
|
+
} catch {
|
|
48
|
+
return { contents: source, loader: "css" };
|
|
49
|
+
}
|
|
50
|
+
return;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
})
|
|
55
|
+
];
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { MiddlewareFn } from "./server/middleware.js";
|
|
2
|
+
import { type RuntimeOptions } from "./runtime/project.js";
|
|
3
|
+
import { type AIObservabilityConfig } from "./ai/index.js";
|
|
4
|
+
interface StartProductionServerOptions extends RuntimeOptions {
|
|
5
|
+
port?: number;
|
|
6
|
+
registerSignalHandlers?: boolean;
|
|
7
|
+
rpcMiddlewares?: MiddlewareFn[];
|
|
8
|
+
ai?: AIObservabilityConfig;
|
|
9
|
+
}
|
|
10
|
+
export interface NodeProductionServer {
|
|
11
|
+
port: number;
|
|
12
|
+
stop(): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
export declare function startProductionServer(options?: StartProductionServerOptions): Promise<Bun.Server<undefined>>;
|
|
15
|
+
export declare function startNodeProductionServer(options?: StartProductionServerOptions): Promise<NodeProductionServer>;
|
|
16
|
+
export declare function createProductionFetchHandler(options?: Pick<StartProductionServerOptions, "cwd" | "env" | "rpcMiddlewares" | "ai" | "pathOverrides">): Promise<(request: Request, server?: {
|
|
17
|
+
requestIP(request: Request): {
|
|
18
|
+
address: string;
|
|
19
|
+
} | null;
|
|
20
|
+
}) => Promise<Response>>;
|
|
21
|
+
export {};
|
package/dist-pkg/prod.js
ADDED
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import { createRouter, matchRoute, buildStaticMap } from "./router/index.js";
|
|
2
|
+
import { securityHeaders } from "./security/headers.js";
|
|
3
|
+
import { createRateLimiter } from "./security/rate-limit.js";
|
|
4
|
+
import { compress } from "./server/compress.js";
|
|
5
|
+
import { log, setLogLevel } from "./log/index.js";
|
|
6
|
+
import { loadEnv } from "./env/index.js";
|
|
7
|
+
import { generateNonce, wrapHTML } from "./server/html-shell.js";
|
|
8
|
+
import { renderNotFoundPage } from "./server/not-found.js";
|
|
9
|
+
import { createRateLimitResponse, handleRPCWithHeaders } from "./server/request-preflight.js";
|
|
10
|
+
import {
|
|
11
|
+
createClientScriptPath
|
|
12
|
+
} from "./server/page-render.js";
|
|
13
|
+
import { createRequestSecurityPolicy } from "./server/request-security-policy.js";
|
|
14
|
+
import {
|
|
15
|
+
renderRoutePageResponse,
|
|
16
|
+
renderRoutePartialResponse
|
|
17
|
+
} from "./server/route-response.js";
|
|
18
|
+
import { handleRouteRequest } from "./server/route-request.js";
|
|
19
|
+
import { dispatchRuntimeRequestPlan } from "./server/runtime-dispatch.js";
|
|
20
|
+
import { createRuntimeRequestPlan } from "./server/request-surface.js";
|
|
21
|
+
import { servePrefixedStaticFile, serveStaticFile } from "./server/static-file.js";
|
|
22
|
+
import {
|
|
23
|
+
BUILD_MANIFEST_SCHEMA_VERSION,
|
|
24
|
+
getClientBundleForRoute,
|
|
25
|
+
getPrerenderedHtmlPath,
|
|
26
|
+
isPrerenderedRoute,
|
|
27
|
+
loadBuildManifest
|
|
28
|
+
} from "./server/manifest.js";
|
|
29
|
+
import { createServer } from "node:http";
|
|
30
|
+
import { join } from "node:path";
|
|
31
|
+
import { Readable } from "node:stream";
|
|
32
|
+
import { createProjectContext, resolveRuntimeEnv } from "./runtime/project.js";
|
|
33
|
+
import {
|
|
34
|
+
loadAppConfig,
|
|
35
|
+
resolveAIConfig,
|
|
36
|
+
resolveRPCMiddlewares,
|
|
37
|
+
resolveTrustedHosts,
|
|
38
|
+
resolveTrustedForwardedHops,
|
|
39
|
+
resolveTrustedOrigin,
|
|
40
|
+
resolveTrustForwardedHeaders
|
|
41
|
+
} from "./runtime/app-config.js";
|
|
42
|
+
import {
|
|
43
|
+
configureAIObservability,
|
|
44
|
+
createTraceIds,
|
|
45
|
+
emitAIEvent
|
|
46
|
+
} from "./ai/index.js";
|
|
47
|
+
function requireTrustedOrigin(trustedOrigin) {
|
|
48
|
+
if (!trustedOrigin)
|
|
49
|
+
throw Error("Missing trusted origin for production runtime. Set security.origin in app.config.ts or APP_ORIGIN in the environment.");
|
|
50
|
+
return trustedOrigin;
|
|
51
|
+
}
|
|
52
|
+
async function tryServeStatic(pathname, request, publicDir, clientDir, secHeaders) {
|
|
53
|
+
if (pathname === "/")
|
|
54
|
+
return null;
|
|
55
|
+
const bundleResponse = await servePrefixedStaticFile(pathname, "/_gorsee/", clientDir, {
|
|
56
|
+
contentType: "application/javascript",
|
|
57
|
+
cacheControl: "public, max-age=31536000, immutable",
|
|
58
|
+
extraHeaders: secHeaders
|
|
59
|
+
});
|
|
60
|
+
if (bundleResponse)
|
|
61
|
+
return bundleResponse;
|
|
62
|
+
return serveStaticFile(publicDir, pathname.slice(1), {
|
|
63
|
+
request,
|
|
64
|
+
etag: !0,
|
|
65
|
+
cacheControl: "public, max-age=3600",
|
|
66
|
+
extraHeaders: secHeaders
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
async function tryServePrerenderedPage(pathname, request, manifest, distDir, secHeaders) {
|
|
70
|
+
if (request.method !== "GET")
|
|
71
|
+
return null;
|
|
72
|
+
if (!isPrerenderedRoute(manifest, pathname))
|
|
73
|
+
return null;
|
|
74
|
+
return serveStaticFile(join(distDir, "static"), getPrerenderedHtmlPath(pathname), {
|
|
75
|
+
request,
|
|
76
|
+
etag: !0,
|
|
77
|
+
cacheControl: "public, max-age=3600",
|
|
78
|
+
contentType: "text/html; charset=utf-8",
|
|
79
|
+
extraHeaders: secHeaders
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
export async function startProductionServer(options = {}) {
|
|
83
|
+
const runtime = createProjectContext(options), registerSignalHandlers = options.registerSignalHandlers ?? !0;
|
|
84
|
+
await loadEnv(runtime.cwd);
|
|
85
|
+
const envConfig = resolveRuntimeEnv(process.env), port = options.port ?? envConfig.port, fetchHandler = await createProductionFetchHandler({
|
|
86
|
+
cwd: runtime.cwd,
|
|
87
|
+
env: process.env,
|
|
88
|
+
rpcMiddlewares: options.rpcMiddlewares,
|
|
89
|
+
ai: options.ai,
|
|
90
|
+
pathOverrides: options.pathOverrides
|
|
91
|
+
});
|
|
92
|
+
log.info("production server starting", { cwd: runtime.cwd });
|
|
93
|
+
const server = Bun.serve({
|
|
94
|
+
port,
|
|
95
|
+
fetch: fetchHandler
|
|
96
|
+
});
|
|
97
|
+
log.info("production server started", { url: `http://localhost:${server.port}` });
|
|
98
|
+
if (registerSignalHandlers) {
|
|
99
|
+
const shutdown = () => {
|
|
100
|
+
log.info("shutting down...");
|
|
101
|
+
server.stop(!0);
|
|
102
|
+
process.exit(0);
|
|
103
|
+
};
|
|
104
|
+
process.on("SIGTERM", shutdown);
|
|
105
|
+
process.on("SIGINT", shutdown);
|
|
106
|
+
}
|
|
107
|
+
return server;
|
|
108
|
+
}
|
|
109
|
+
export async function startNodeProductionServer(options = {}) {
|
|
110
|
+
const runtime = createProjectContext(options), registerSignalHandlers = options.registerSignalHandlers ?? !0;
|
|
111
|
+
await loadEnv(runtime.cwd);
|
|
112
|
+
const envConfig = resolveRuntimeEnv(process.env), port = options.port ?? envConfig.port, fetchHandler = await createProductionFetchHandler({
|
|
113
|
+
cwd: runtime.cwd,
|
|
114
|
+
env: process.env,
|
|
115
|
+
rpcMiddlewares: options.rpcMiddlewares,
|
|
116
|
+
ai: options.ai,
|
|
117
|
+
pathOverrides: options.pathOverrides
|
|
118
|
+
});
|
|
119
|
+
log.info("node production server starting", { cwd: runtime.cwd });
|
|
120
|
+
const server = createServer(async (req, res) => {
|
|
121
|
+
try {
|
|
122
|
+
const request = createNodeRequest(req), response = await fetchHandler(request, {
|
|
123
|
+
requestIP(input) {
|
|
124
|
+
const address = req.socket.remoteAddress;
|
|
125
|
+
return address ? { address } : null;
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
await writeNodeResponse(res, response);
|
|
129
|
+
} catch (error) {
|
|
130
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
131
|
+
log.error("node production request failed", { error: message });
|
|
132
|
+
if (!res.headersSent) {
|
|
133
|
+
res.statusCode = 500;
|
|
134
|
+
res.setHeader("Content-Type", "text/plain; charset=utf-8");
|
|
135
|
+
}
|
|
136
|
+
res.end("Internal Server Error");
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
await new Promise((resolve) => {
|
|
140
|
+
server.listen(port, resolve);
|
|
141
|
+
});
|
|
142
|
+
const address = server.address(), resolvedPort = typeof address === "object" && address ? address.port : port;
|
|
143
|
+
log.info("node production server started", { url: `http://localhost:${resolvedPort}` });
|
|
144
|
+
if (registerSignalHandlers) {
|
|
145
|
+
const shutdown = () => {
|
|
146
|
+
log.info("shutting down node server...");
|
|
147
|
+
new Promise((resolve) => server.close(() => resolve())).finally(() => process.exit(0));
|
|
148
|
+
};
|
|
149
|
+
process.on("SIGTERM", shutdown);
|
|
150
|
+
process.on("SIGINT", shutdown);
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
port: resolvedPort,
|
|
154
|
+
stop() {
|
|
155
|
+
return new Promise((resolve, reject) => {
|
|
156
|
+
server.close((error) => error ? reject(error) : resolve());
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
export async function createProductionFetchHandler(options = {}) {
|
|
162
|
+
const state = await loadProductionRuntimeState(options), appConfig = await loadAppConfig(state.cwd, state.appConfigFile), rpcMiddlewares = resolveRPCMiddlewares(appConfig, options.rpcMiddlewares), trustedOrigin = requireTrustedOrigin(resolveTrustedOrigin(appConfig, options.env ?? process.env)), trustForwardedHeaders = resolveTrustForwardedHeaders(appConfig), trustedForwardedHops = resolveTrustedForwardedHops(appConfig), requestSecurityPolicy = createRequestSecurityPolicy({
|
|
163
|
+
trustedOrigin,
|
|
164
|
+
trustForwardedHeaders,
|
|
165
|
+
trustedForwardedHops,
|
|
166
|
+
trustedHosts: resolveTrustedHosts(appConfig)
|
|
167
|
+
});
|
|
168
|
+
configureAIObservability(resolveAIConfig(state.cwd, appConfig, options.ai));
|
|
169
|
+
return async (request, server) => {
|
|
170
|
+
const pathname = new URL(request.url).pathname, trace = createTraceIds(), startTs = performance.now();
|
|
171
|
+
await emitAIEvent({
|
|
172
|
+
kind: "request.start",
|
|
173
|
+
severity: "info",
|
|
174
|
+
source: "runtime",
|
|
175
|
+
message: "incoming production request",
|
|
176
|
+
requestId: trace.requestId,
|
|
177
|
+
traceId: trace.traceId,
|
|
178
|
+
spanId: trace.spanId,
|
|
179
|
+
data: { method: request.method, pathname }
|
|
180
|
+
});
|
|
181
|
+
const ip = server?.requestIP(request)?.address ?? "unknown", rateLimitResponse = await createRateLimitResponse(state.rateLimiter, ip);
|
|
182
|
+
if (rateLimitResponse)
|
|
183
|
+
return rateLimitResponse;
|
|
184
|
+
const nonce = generateNonce(), secHeaders = securityHeaders({}, nonce), match = matchRoute(state.routes, pathname, state.staticMap), requestPlan = createRuntimeRequestPlan({
|
|
185
|
+
pathname,
|
|
186
|
+
hasRouteMatch: Boolean(match),
|
|
187
|
+
allowPrerendered: !0
|
|
188
|
+
}), dispatch = await dispatchRuntimeRequestPlan({
|
|
189
|
+
plan: requestPlan.filter((surface) => surface !== "hmr"),
|
|
190
|
+
pathname,
|
|
191
|
+
request,
|
|
192
|
+
trace,
|
|
193
|
+
startTs,
|
|
194
|
+
source: "runtime",
|
|
195
|
+
route: match?.route.path,
|
|
196
|
+
handlers: {
|
|
197
|
+
rpc: async () => handleRPCWithHeaders(request, secHeaders, {
|
|
198
|
+
middlewares: rpcMiddlewares,
|
|
199
|
+
securityPolicy: requestSecurityPolicy
|
|
200
|
+
}),
|
|
201
|
+
bundle: async () => tryServeStatic(pathname, request, state.publicDir, state.clientDir, secHeaders),
|
|
202
|
+
static: async () => tryServeStatic(pathname, request, state.publicDir, state.clientDir, secHeaders),
|
|
203
|
+
prerendered: async () => tryServePrerenderedPage(pathname, request, state.manifest, state.distDir, secHeaders),
|
|
204
|
+
route: async () => {
|
|
205
|
+
if (!match)
|
|
206
|
+
return null;
|
|
207
|
+
await emitAIEvent({
|
|
208
|
+
kind: "route.match",
|
|
209
|
+
severity: "info",
|
|
210
|
+
source: "runtime",
|
|
211
|
+
message: "route matched",
|
|
212
|
+
requestId: trace.requestId,
|
|
213
|
+
traceId: trace.traceId,
|
|
214
|
+
spanId: trace.spanId,
|
|
215
|
+
route: match.route.path,
|
|
216
|
+
data: { pathname, file: match.route.filePath }
|
|
217
|
+
});
|
|
218
|
+
try {
|
|
219
|
+
return await handleRouteRequest({
|
|
220
|
+
match,
|
|
221
|
+
request,
|
|
222
|
+
trace,
|
|
223
|
+
extraMiddlewares: [state.compressMiddleware],
|
|
224
|
+
trustedOrigin,
|
|
225
|
+
trustForwardedHeaders,
|
|
226
|
+
securityPolicy: requestSecurityPolicy,
|
|
227
|
+
onPartialRequest: async ({ ctx, resolved }) => {
|
|
228
|
+
const clientScript = createClientScriptPath(getClientBundleForRoute(state.manifest, match.route.path));
|
|
229
|
+
return renderRoutePartialResponse({
|
|
230
|
+
match,
|
|
231
|
+
ctx,
|
|
232
|
+
resolved,
|
|
233
|
+
clientScript,
|
|
234
|
+
secHeaders
|
|
235
|
+
});
|
|
236
|
+
},
|
|
237
|
+
onPageRequest: async ({ ctx, resolved }) => {
|
|
238
|
+
const clientScript = createClientScriptPath(getClientBundleForRoute(state.manifest, match.route.path));
|
|
239
|
+
return renderRoutePageResponse({
|
|
240
|
+
match,
|
|
241
|
+
ctx,
|
|
242
|
+
resolved,
|
|
243
|
+
clientScript,
|
|
244
|
+
nonce,
|
|
245
|
+
secHeaders,
|
|
246
|
+
wrapHTML
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
} catch (err) {
|
|
251
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
252
|
+
log.error("request error", { path: pathname, error: message });
|
|
253
|
+
await emitAIEvent({
|
|
254
|
+
kind: "request.error",
|
|
255
|
+
severity: "error",
|
|
256
|
+
source: "runtime",
|
|
257
|
+
message,
|
|
258
|
+
requestId: trace.requestId,
|
|
259
|
+
traceId: trace.traceId,
|
|
260
|
+
spanId: trace.spanId,
|
|
261
|
+
route: match.route.path,
|
|
262
|
+
durationMs: Number((performance.now() - startTs).toFixed(2)),
|
|
263
|
+
data: { method: request.method, pathname, error: message }
|
|
264
|
+
});
|
|
265
|
+
return new Response(wrapHTML("<h1>500</h1><p>Internal Server Error</p>", nonce), {
|
|
266
|
+
status: 500,
|
|
267
|
+
headers: { "Content-Type": "text/html", ...secHeaders }
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
},
|
|
271
|
+
"not-found": async () => new Response(await renderNotFoundPage(state.routesDir, nonce), {
|
|
272
|
+
status: 404,
|
|
273
|
+
headers: { "Content-Type": "text/html", ...secHeaders }
|
|
274
|
+
})
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
if (dispatch)
|
|
278
|
+
return dispatch.response;
|
|
279
|
+
throw Error(`Unhandled request plan for ${pathname}`);
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
async function loadProductionRuntimeState(options = {}) {
|
|
283
|
+
const runtime = createProjectContext(options);
|
|
284
|
+
await loadEnv(runtime.cwd);
|
|
285
|
+
const envConfig = resolveRuntimeEnv(process.env);
|
|
286
|
+
setLogLevel(envConfig.logLevel);
|
|
287
|
+
const manifest = await loadBuildManifest(runtime.paths.distDir);
|
|
288
|
+
log.info("loaded manifest", {
|
|
289
|
+
routes: Object.keys(manifest.routes).length,
|
|
290
|
+
built: manifest.buildTime,
|
|
291
|
+
schemaVersion: manifest.schemaVersion,
|
|
292
|
+
expectedSchemaVersion: BUILD_MANIFEST_SCHEMA_VERSION
|
|
293
|
+
});
|
|
294
|
+
const routes = await createRouter(runtime.paths.routesDir), staticMap = buildStaticMap(routes), rateLimiter = createRateLimiter(envConfig.rateLimit, envConfig.rateWindow);
|
|
295
|
+
return {
|
|
296
|
+
cwd: runtime.cwd,
|
|
297
|
+
routesDir: runtime.paths.routesDir,
|
|
298
|
+
publicDir: runtime.paths.publicDir,
|
|
299
|
+
distDir: runtime.paths.distDir,
|
|
300
|
+
clientDir: runtime.paths.clientDir,
|
|
301
|
+
appConfigFile: runtime.paths.appConfigFile,
|
|
302
|
+
manifest,
|
|
303
|
+
routes,
|
|
304
|
+
staticMap,
|
|
305
|
+
rateLimiter,
|
|
306
|
+
compressMiddleware: compress()
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
function createNodeRequest(req) {
|
|
310
|
+
const headers = new Headers;
|
|
311
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
312
|
+
if (Array.isArray(value)) {
|
|
313
|
+
for (const item of value)
|
|
314
|
+
headers.append(key, item);
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
if (typeof value === "string")
|
|
318
|
+
headers.set(key, value);
|
|
319
|
+
}
|
|
320
|
+
const host = headers.get("host") ?? "127.0.0.1", url = new URL(req.url ?? "/", `http://${host}`), method = req.method ?? "GET";
|
|
321
|
+
if (method === "GET" || method === "HEAD")
|
|
322
|
+
return new Request(url, { method, headers });
|
|
323
|
+
return new Request(url, {
|
|
324
|
+
method,
|
|
325
|
+
headers,
|
|
326
|
+
body: Readable.toWeb(req),
|
|
327
|
+
duplex: "half"
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
async function writeNodeResponse(res, response) {
|
|
331
|
+
res.statusCode = response.status;
|
|
332
|
+
res.statusMessage = response.statusText;
|
|
333
|
+
const setCookie = response.headers.getSetCookie?.() ?? [];
|
|
334
|
+
if (setCookie.length > 0)
|
|
335
|
+
res.setHeader("Set-Cookie", setCookie);
|
|
336
|
+
response.headers.forEach((value, key) => {
|
|
337
|
+
if (key.toLowerCase() === "set-cookie" && setCookie.length > 0)
|
|
338
|
+
return;
|
|
339
|
+
res.setHeader(key, value);
|
|
340
|
+
});
|
|
341
|
+
if (!response.body) {
|
|
342
|
+
res.end();
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
const body = Buffer.from(await response.arrayBuffer());
|
|
346
|
+
res.end(body);
|
|
347
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { computed as alienComputed } from "alien-signals";
|
|
2
|
+
import {
|
|
3
|
+
runTrackedComputation,
|
|
4
|
+
trackComputedCreated,
|
|
5
|
+
trackComputedRead
|
|
6
|
+
} from "./diagnostics.js";
|
|
7
|
+
import { GORSEE_SIGNAL_MARKER } from "../runtime/html-escape.js";
|
|
8
|
+
export function createComputed(fn, options = {}) {
|
|
9
|
+
const nodeId = trackComputedCreated(options.label), computed = alienComputed(() => runTrackedComputation(nodeId, "computed", options.label, fn)), getter = () => {
|
|
10
|
+
trackComputedRead(nodeId, options.label);
|
|
11
|
+
return computed();
|
|
12
|
+
};
|
|
13
|
+
getter[GORSEE_SIGNAL_MARKER] = !0;
|
|
14
|
+
return getter;
|
|
15
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type Mutation, type MutationOptions } from "./optimistic.js";
|
|
2
|
+
import { type ResourceOptions } from "./resource.js";
|
|
3
|
+
import type { SignalGetter } from "./signal.js";
|
|
4
|
+
export interface DataQueryOptions<T> extends Omit<ResourceOptions, "key"> {
|
|
5
|
+
key: string;
|
|
6
|
+
queryFn: () => Promise<T>;
|
|
7
|
+
}
|
|
8
|
+
export interface DataQuery<T> {
|
|
9
|
+
key: string;
|
|
10
|
+
data: SignalGetter<T | undefined>;
|
|
11
|
+
loading: SignalGetter<boolean>;
|
|
12
|
+
error: SignalGetter<Error | undefined>;
|
|
13
|
+
refetch: () => void;
|
|
14
|
+
setData: (value: T | undefined | ((prev: T | undefined) => T | undefined)) => void;
|
|
15
|
+
invalidate: () => void;
|
|
16
|
+
}
|
|
17
|
+
export interface DataMutationOptions<T, V> extends MutationOptions<T, V> {
|
|
18
|
+
invalidate?: string[] | ((data: T, variables: V) => string[] | "all");
|
|
19
|
+
}
|
|
20
|
+
export interface DataMutation<T, V> extends Mutation<T, V> {
|
|
21
|
+
optimisticQuery: <S>(query: Pick<DataQuery<S>, "data" | "setData">, update: (current: S | undefined, variables: V) => S, variables: V) => Promise<T>;
|
|
22
|
+
invalidateQueries: (keys?: string[] | "all") => void;
|
|
23
|
+
}
|
|
24
|
+
export declare function createDataQuery<T>(options: DataQueryOptions<T>): DataQuery<T>;
|
|
25
|
+
export declare function createDataMutation<T, V = void>(options: DataMutationOptions<T, V>): DataMutation<T, V>;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { createMutation } from "./optimistic.js";
|
|
2
|
+
import {
|
|
3
|
+
createResource,
|
|
4
|
+
invalidateAll,
|
|
5
|
+
invalidateResource
|
|
6
|
+
} from "./resource.js";
|
|
7
|
+
export function createDataQuery(options) {
|
|
8
|
+
const [data, state] = createResource(options.queryFn, {
|
|
9
|
+
...options,
|
|
10
|
+
key: options.key
|
|
11
|
+
});
|
|
12
|
+
return {
|
|
13
|
+
key: options.key,
|
|
14
|
+
data,
|
|
15
|
+
loading: state.loading,
|
|
16
|
+
error: state.error,
|
|
17
|
+
refetch: state.refetch,
|
|
18
|
+
setData: state.mutate,
|
|
19
|
+
invalidate() {
|
|
20
|
+
invalidateResource(options.key);
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function createDataMutation(options) {
|
|
25
|
+
let lastInvalidatedKeys;
|
|
26
|
+
const mutation = createMutation({
|
|
27
|
+
...options,
|
|
28
|
+
onSuccess(data, variables) {
|
|
29
|
+
lastInvalidatedKeys = resolveInvalidationTargets(options.invalidate, data, variables);
|
|
30
|
+
applyInvalidationTargets(lastInvalidatedKeys);
|
|
31
|
+
options.onSuccess?.(data, variables);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
return {
|
|
35
|
+
...mutation,
|
|
36
|
+
async optimisticQuery(query, update, variables) {
|
|
37
|
+
return mutation.optimistic(query.data, (value) => query.setData(() => value), update, variables);
|
|
38
|
+
},
|
|
39
|
+
invalidateQueries(keys = lastInvalidatedKeys ?? []) {
|
|
40
|
+
applyInvalidationTargets(keys);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function resolveInvalidationTargets(invalidate, data, variables) {
|
|
45
|
+
if (typeof invalidate === "function")
|
|
46
|
+
return invalidate(data, variables);
|
|
47
|
+
return invalidate ?? [];
|
|
48
|
+
}
|
|
49
|
+
function applyInvalidationTargets(keys) {
|
|
50
|
+
if (keys === "all") {
|
|
51
|
+
invalidateAll();
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
for (const key of keys)
|
|
55
|
+
invalidateResource(key);
|
|
56
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
export declare const REACTIVE_TRACE_SCHEMA_VERSION = 1;
|
|
2
|
+
type ReactiveNodeKind = "signal" | "computed" | "effect" | "resource" | "mutation";
|
|
3
|
+
type ReactiveInvalidationReason = "write" | "resource.invalidate" | "resource.invalidateAll";
|
|
4
|
+
export interface ReactiveDiagnosticsSnapshot {
|
|
5
|
+
signalsCreated: number;
|
|
6
|
+
signalReads: number;
|
|
7
|
+
signalWrites: number;
|
|
8
|
+
computedCreated: number;
|
|
9
|
+
computedReads: number;
|
|
10
|
+
computedRuns: number;
|
|
11
|
+
effectCreated: number;
|
|
12
|
+
effectRuns: number;
|
|
13
|
+
resourcesCreated: number;
|
|
14
|
+
resourceLoadsStarted: number;
|
|
15
|
+
resourceLoadsSucceeded: number;
|
|
16
|
+
resourceLoadsFailed: number;
|
|
17
|
+
resourceInvalidations: number;
|
|
18
|
+
resourceMutations: number;
|
|
19
|
+
mutationsCreated: number;
|
|
20
|
+
mutationRuns: number;
|
|
21
|
+
mutationSuccesses: number;
|
|
22
|
+
mutationFailures: number;
|
|
23
|
+
mutationRollbacks: number;
|
|
24
|
+
mutationResets: number;
|
|
25
|
+
}
|
|
26
|
+
export interface ReactiveDiagnosticsConfig {
|
|
27
|
+
enabled?: boolean;
|
|
28
|
+
captureEvents?: boolean;
|
|
29
|
+
maxEvents?: number;
|
|
30
|
+
}
|
|
31
|
+
export interface ReactiveDiagnosticOptions {
|
|
32
|
+
label?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface ReactiveGraphNode {
|
|
35
|
+
id: number;
|
|
36
|
+
kind: ReactiveNodeKind;
|
|
37
|
+
label?: string;
|
|
38
|
+
reads: number;
|
|
39
|
+
writes: number;
|
|
40
|
+
runs: number;
|
|
41
|
+
invalidations: number;
|
|
42
|
+
}
|
|
43
|
+
export interface ReactiveDependencyEdge {
|
|
44
|
+
sourceNodeId: number;
|
|
45
|
+
targetNodeId: number;
|
|
46
|
+
sourceKind: ReactiveNodeKind;
|
|
47
|
+
targetKind: ReactiveNodeKind;
|
|
48
|
+
sourceLabel?: string;
|
|
49
|
+
targetLabel?: string;
|
|
50
|
+
reads: number;
|
|
51
|
+
}
|
|
52
|
+
export interface ReactiveDiagnosticEvent {
|
|
53
|
+
seq: number;
|
|
54
|
+
kind: "signal:create" | "signal:read" | "signal:write" | "computed:create" | "computed:read" | "computed:run" | "effect:create" | "effect:run" | "resource:create" | "resource:load.start" | "resource:load.success" | "resource:load.error" | "resource:refetch" | "resource:mutate" | "resource:invalidate" | "mutation:create" | "mutation:start" | "mutation:success" | "mutation:error" | "mutation:settled" | "mutation:rollback" | "mutation:reset" | "invalidation";
|
|
55
|
+
nodeId: number;
|
|
56
|
+
label?: string;
|
|
57
|
+
relatedNodeId?: number;
|
|
58
|
+
relatedLabel?: string;
|
|
59
|
+
reason?: ReactiveInvalidationReason;
|
|
60
|
+
causeNodeIds?: number[];
|
|
61
|
+
causeLabels?: string[];
|
|
62
|
+
cacheKey?: string;
|
|
63
|
+
detail?: string;
|
|
64
|
+
}
|
|
65
|
+
export interface ReactiveTraceArtifact {
|
|
66
|
+
schemaVersion: typeof REACTIVE_TRACE_SCHEMA_VERSION;
|
|
67
|
+
snapshot: ReactiveDiagnosticsSnapshot;
|
|
68
|
+
nodes: ReactiveGraphNode[];
|
|
69
|
+
edges: ReactiveDependencyEdge[];
|
|
70
|
+
events: ReactiveDiagnosticEvent[];
|
|
71
|
+
}
|
|
72
|
+
export declare function configureReactiveDiagnostics(config?: ReactiveDiagnosticsConfig): void;
|
|
73
|
+
export declare function resetReactiveDiagnostics(): void;
|
|
74
|
+
export declare function getReactiveDiagnosticsSnapshot(): ReactiveDiagnosticsSnapshot;
|
|
75
|
+
export declare function getReactiveGraphNodes(): ReactiveGraphNode[];
|
|
76
|
+
export declare function getReactiveDependencyEdges(): ReactiveDependencyEdge[];
|
|
77
|
+
export declare function getReactiveDiagnosticsEvents(): ReactiveDiagnosticEvent[];
|
|
78
|
+
export declare function getReactiveTraceArtifact(): ReactiveTraceArtifact;
|
|
79
|
+
export declare function trackSignalCreated(label?: string): number | null;
|
|
80
|
+
export declare function trackSignalRead(nodeId?: number | null, label?: string): void;
|
|
81
|
+
export declare function trackSignalWrite(nodeId?: number | null, label?: string): void;
|
|
82
|
+
export declare function trackComputedCreated(label?: string): number | null;
|
|
83
|
+
export declare function trackComputedRead(nodeId?: number | null, label?: string): void;
|
|
84
|
+
export declare function trackEffectCreated(label?: string): number | null;
|
|
85
|
+
export declare function trackResourceCreated(label?: string, cacheKey?: string): number | null;
|
|
86
|
+
export declare function trackResourceLoadStart(nodeId?: number | null, label?: string, cacheKey?: string, detail?: string): void;
|
|
87
|
+
export declare function trackResourceLoadSuccess(nodeId?: number | null, label?: string, cacheKey?: string): void;
|
|
88
|
+
export declare function trackResourceLoadError(nodeId?: number | null, label?: string, cacheKey?: string, detail?: string): void;
|
|
89
|
+
export declare function trackResourceRefetch(nodeId?: number | null, label?: string, cacheKey?: string): void;
|
|
90
|
+
export declare function trackResourceMutate(nodeId?: number | null, label?: string, cacheKey?: string): void;
|
|
91
|
+
export declare function trackResourceInvalidation(cacheKey: string, reason: ReactiveInvalidationReason): void;
|
|
92
|
+
export declare function trackMutationCreated(label?: string): number | null;
|
|
93
|
+
export declare function trackMutationStart(nodeId?: number | null, label?: string): void;
|
|
94
|
+
export declare function trackMutationSuccess(nodeId?: number | null, label?: string): void;
|
|
95
|
+
export declare function trackMutationError(nodeId?: number | null, label?: string, detail?: string): void;
|
|
96
|
+
export declare function trackMutationSettled(nodeId?: number | null, label?: string): void;
|
|
97
|
+
export declare function trackMutationRollback(nodeId?: number | null, label?: string): void;
|
|
98
|
+
export declare function trackMutationReset(nodeId?: number | null, label?: string): void;
|
|
99
|
+
export declare function runTrackedComputation<T>(nodeId: number | null | undefined, kind: "computed" | "effect", label: string | undefined, fn: () => T): T;
|
|
100
|
+
export {};
|