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
package/src/server/guard.ts
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
// Route guards — declarative access control for routes
|
|
2
|
-
// Usage: export const guard = requireRole("admin")
|
|
3
|
-
|
|
4
|
-
import type { Context, MiddlewareFn } from "./middleware.ts"
|
|
5
|
-
|
|
6
|
-
type GuardFn = (ctx: Context) => boolean | Promise<boolean>
|
|
7
|
-
|
|
8
|
-
interface GuardOptions {
|
|
9
|
-
onFail?: (ctx: Context) => Response | Promise<Response>
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
const DEFAULT_DENY = (_ctx: Context) => new Response("Forbidden", { status: 403 })
|
|
13
|
-
|
|
14
|
-
/** Create a guard middleware from a predicate */
|
|
15
|
-
export function createGuard(check: GuardFn, options?: GuardOptions): MiddlewareFn {
|
|
16
|
-
const onFail = options?.onFail ?? DEFAULT_DENY
|
|
17
|
-
return async (ctx, next) => {
|
|
18
|
-
const allowed = await check(ctx)
|
|
19
|
-
if (!allowed) return onFail(ctx)
|
|
20
|
-
return next()
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/** Guard: require authenticated session */
|
|
25
|
-
export function requireAuth(loginPath = "/login"): MiddlewareFn {
|
|
26
|
-
return createGuard(
|
|
27
|
-
(ctx) => !!ctx.locals.session,
|
|
28
|
-
{ onFail: (ctx) => ctx.redirect(loginPath) },
|
|
29
|
-
)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/** Guard: require specific role (reads from session.data.role) */
|
|
33
|
-
export function requireRole(role: string, options?: GuardOptions): MiddlewareFn {
|
|
34
|
-
return createGuard((ctx) => {
|
|
35
|
-
const session = ctx.locals.session as { data?: { role?: string } } | undefined
|
|
36
|
-
return session?.data?.role === role
|
|
37
|
-
}, options)
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/** Guard: combine multiple guards (all must pass) */
|
|
41
|
-
export function allGuards(...guards: MiddlewareFn[]): MiddlewareFn {
|
|
42
|
-
return async (ctx, next) => {
|
|
43
|
-
for (const guard of guards) {
|
|
44
|
-
let passed = false
|
|
45
|
-
const guardNext = async () => {
|
|
46
|
-
passed = true
|
|
47
|
-
return new Response(null)
|
|
48
|
-
}
|
|
49
|
-
const result = await guard(ctx, guardNext)
|
|
50
|
-
if (!passed) return result
|
|
51
|
-
}
|
|
52
|
-
return next()
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/** Guard: any one guard passing is sufficient */
|
|
57
|
-
export function anyGuard(...guards: MiddlewareFn[]): MiddlewareFn {
|
|
58
|
-
return async (ctx, next) => {
|
|
59
|
-
for (const guard of guards) {
|
|
60
|
-
let passed = false
|
|
61
|
-
await guard(ctx, async () => {
|
|
62
|
-
passed = true
|
|
63
|
-
return new Response(null)
|
|
64
|
-
})
|
|
65
|
-
if (passed) return next()
|
|
66
|
-
}
|
|
67
|
-
return new Response("Forbidden", { status: 403 })
|
|
68
|
-
}
|
|
69
|
-
}
|
package/src/server/html-shell.ts
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
export interface HTMLWrapOptions {
|
|
2
|
-
title?: string
|
|
3
|
-
clientScript?: string
|
|
4
|
-
loaderData?: unknown
|
|
5
|
-
params?: Record<string, string>
|
|
6
|
-
cssFiles?: string[]
|
|
7
|
-
headElements?: string[]
|
|
8
|
-
bodyPrefix?: string[]
|
|
9
|
-
bodySuffix?: string[]
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function generateNonce(): string {
|
|
13
|
-
const bytes = new Uint8Array(16)
|
|
14
|
-
crypto.getRandomValues(bytes)
|
|
15
|
-
return btoa(String.fromCharCode(...bytes))
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function wrapHTML(
|
|
19
|
-
body: string,
|
|
20
|
-
nonce: string | undefined,
|
|
21
|
-
options: HTMLWrapOptions = {},
|
|
22
|
-
): string {
|
|
23
|
-
const {
|
|
24
|
-
title = "Gorsee App",
|
|
25
|
-
clientScript,
|
|
26
|
-
loaderData,
|
|
27
|
-
params,
|
|
28
|
-
cssFiles = [],
|
|
29
|
-
headElements = [],
|
|
30
|
-
bodyPrefix = [],
|
|
31
|
-
bodySuffix = [],
|
|
32
|
-
} = options
|
|
33
|
-
|
|
34
|
-
let dataScript = ""
|
|
35
|
-
if (loaderData !== undefined) {
|
|
36
|
-
const json = JSON.stringify(loaderData).replace(/</g, "\\u003c")
|
|
37
|
-
dataScript = `\n <script id="__GORSEE_DATA__" type="application/json"${renderNonceAttr(nonce)}>${json}</script>`
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
let paramsScript = ""
|
|
41
|
-
if (params && Object.keys(params).length > 0) {
|
|
42
|
-
paramsScript = `\n <script${renderNonceAttr(nonce)}>window.__GORSEE_PARAMS__=${JSON.stringify(params)}</script>`
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const clientTag = clientScript
|
|
46
|
-
? `\n <script type="module" src="${clientScript}"${renderNonceAttr(nonce)}></script>`
|
|
47
|
-
: ""
|
|
48
|
-
|
|
49
|
-
return `<!DOCTYPE html>
|
|
50
|
-
<html lang="en">
|
|
51
|
-
<head>
|
|
52
|
-
<meta charset="UTF-8" />
|
|
53
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
54
|
-
<title>${title}</title>
|
|
55
|
-
<link rel="stylesheet" href="/styles.css" />
|
|
56
|
-
${cssFiles.map((file) => ` <link rel="stylesheet" href="${file}" />`).join("\n")}
|
|
57
|
-
${headElements.join("\n")}
|
|
58
|
-
</head>
|
|
59
|
-
<body>
|
|
60
|
-
${bodyPrefix.join("\n")}
|
|
61
|
-
<div id="app">${body}</div>${dataScript}${paramsScript}${clientTag}
|
|
62
|
-
${bodySuffix.join("\n")}
|
|
63
|
-
</body>
|
|
64
|
-
</html>`
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function renderNonceAttr(nonce?: string): string {
|
|
68
|
-
return nonce ? ` nonce="${nonce}"` : ""
|
|
69
|
-
}
|
package/src/server/index.ts
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
export {
|
|
2
|
-
server,
|
|
3
|
-
handleRPCRequest,
|
|
4
|
-
__registerRPC,
|
|
5
|
-
getRPCHandler,
|
|
6
|
-
createMemoryRPCRegistry,
|
|
7
|
-
handleRPCRequestWithRegistry,
|
|
8
|
-
type RPCHandler,
|
|
9
|
-
type RPCRegistry,
|
|
10
|
-
} from "./rpc.ts"
|
|
11
|
-
export {
|
|
12
|
-
middleware,
|
|
13
|
-
createContext,
|
|
14
|
-
runMiddlewareChain,
|
|
15
|
-
type Context,
|
|
16
|
-
type MiddlewareFn,
|
|
17
|
-
type NextFn,
|
|
18
|
-
} from "./middleware.ts"
|
|
19
|
-
export { defineAction, handleAction, parseFormData, type ActionFn, type ActionResult } from "./action.ts"
|
|
20
|
-
export { joinRoom, leaveRoom, broadcastToRoom, getRoomSize, createWSContext, type WSContext, type WSHandler } from "./ws.ts"
|
|
21
|
-
export { compress } from "./compress.ts"
|
|
22
|
-
export { getMimeType } from "./mime.ts"
|
|
23
|
-
export { fileETag, generateETag, isNotModified } from "./etag.ts"
|
|
24
|
-
export { redirect, RedirectError, type CookieOptions } from "./middleware.ts"
|
|
25
|
-
export { createSSEStream, createEventSource, type SSEOptions, type SSEStream, type EventSourceSignal } from "./sse.ts"
|
|
26
|
-
export {
|
|
27
|
-
routeCache,
|
|
28
|
-
invalidateCache,
|
|
29
|
-
clearCache,
|
|
30
|
-
createMemoryCacheStore,
|
|
31
|
-
type CacheOptions,
|
|
32
|
-
type CacheEntry,
|
|
33
|
-
type CacheStore,
|
|
34
|
-
} from "./cache.ts"
|
|
35
|
-
export { createGuard, requireAuth, requireRole, allGuards, anyGuard } from "./guard.ts"
|
|
36
|
-
export { pipe, when, forMethods, forPaths } from "./pipe.ts"
|
|
37
|
-
export { createNamespacedCacheStore } from "./cache-utils.ts"
|
|
38
|
-
export { createRedisCacheStore } from "./redis-cache-store.ts"
|
|
39
|
-
export { createScopedRPCRegistry } from "./rpc-utils.ts"
|
|
40
|
-
export { createSQLiteCacheStore } from "./sqlite-cache-store.ts"
|
|
41
|
-
export {
|
|
42
|
-
type RedisLikeClient,
|
|
43
|
-
type NodeRedisClientLike,
|
|
44
|
-
type IORedisClientLike,
|
|
45
|
-
createNodeRedisLikeClient,
|
|
46
|
-
createIORedisLikeClient,
|
|
47
|
-
deleteExpiredRedisKeys,
|
|
48
|
-
} from "./redis-client.ts"
|
|
49
|
-
export {
|
|
50
|
-
loadBuildManifest,
|
|
51
|
-
getRouteBuildEntry,
|
|
52
|
-
getClientBundleForRoute,
|
|
53
|
-
isPrerenderedRoute,
|
|
54
|
-
getPrerenderedHtmlPath,
|
|
55
|
-
type BuildManifest,
|
|
56
|
-
type BuildManifestRoute,
|
|
57
|
-
} from "./manifest.ts"
|
package/src/server/manifest.ts
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { join } from "node:path"
|
|
2
|
-
import { readFile } from "node:fs/promises"
|
|
3
|
-
|
|
4
|
-
export interface BuildManifestRoute {
|
|
5
|
-
js?: string
|
|
6
|
-
hasLoader: boolean
|
|
7
|
-
prerendered?: boolean
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export interface BuildManifest {
|
|
11
|
-
routes: Record<string, BuildManifestRoute>
|
|
12
|
-
chunks: string[]
|
|
13
|
-
prerendered: string[]
|
|
14
|
-
buildTime: string
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export async function loadBuildManifest(distDir: string): Promise<BuildManifest> {
|
|
18
|
-
const raw = await readFile(join(distDir, "manifest.json"), "utf-8")
|
|
19
|
-
return JSON.parse(raw) as BuildManifest
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export function getRouteBuildEntry(manifest: BuildManifest, pathname: string): BuildManifestRoute | undefined {
|
|
23
|
-
return manifest.routes[pathname]
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export function getClientBundleForRoute(manifest: BuildManifest, pathname: string): string | undefined {
|
|
27
|
-
return getRouteBuildEntry(manifest, pathname)?.js
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export function isPrerenderedRoute(manifest: BuildManifest, pathname: string): boolean {
|
|
31
|
-
return getRouteBuildEntry(manifest, pathname)?.prerendered === true
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function getPrerenderedHtmlPath(pathname: string): string {
|
|
35
|
-
return pathname === "/" ? "index.html" : join(pathname.slice(1), "index.html")
|
|
36
|
-
}
|
package/src/server/middleware.ts
DELETED
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
// Server context, middleware chain, and cookie management
|
|
2
|
-
|
|
3
|
-
export interface CookieOptions {
|
|
4
|
-
maxAge?: number
|
|
5
|
-
expires?: Date
|
|
6
|
-
path?: string
|
|
7
|
-
domain?: string
|
|
8
|
-
secure?: boolean
|
|
9
|
-
httpOnly?: boolean
|
|
10
|
-
sameSite?: "Strict" | "Lax" | "None"
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export interface Context {
|
|
14
|
-
request: Request
|
|
15
|
-
url: URL
|
|
16
|
-
params: Record<string, string>
|
|
17
|
-
cookies: Map<string, string>
|
|
18
|
-
locals: Record<string, unknown>
|
|
19
|
-
/** Response headers to be merged into the final response */
|
|
20
|
-
responseHeaders: Headers
|
|
21
|
-
redirect(url: string, status?: number): Response
|
|
22
|
-
setCookie(name: string, value: string, options?: CookieOptions): void
|
|
23
|
-
deleteCookie(name: string, options?: Pick<CookieOptions, "path" | "domain">): void
|
|
24
|
-
setHeader(name: string, value: string): void
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export type NextFn = () => Promise<Response>
|
|
28
|
-
export type MiddlewareFn = (ctx: Context, next: NextFn) => Promise<Response>
|
|
29
|
-
|
|
30
|
-
/** Throwable redirect — use in loaders to interrupt and redirect */
|
|
31
|
-
export class RedirectError {
|
|
32
|
-
constructor(public url: string, public status: number = 302) {}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export function redirect(url: string, status = 302): never {
|
|
36
|
-
throw new RedirectError(url, status)
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export function middleware(fn: MiddlewareFn): MiddlewareFn {
|
|
40
|
-
return fn
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function sanitizeCookiePart(str: string): string {
|
|
44
|
-
return str.replace(/[\r\n;,]/g, "")
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function serializeCookie(name: string, value: string, options: CookieOptions = {}): string {
|
|
48
|
-
let cookie = `${sanitizeCookiePart(name)}=${sanitizeCookiePart(value)}`
|
|
49
|
-
if (options.maxAge !== undefined) cookie += `; Max-Age=${options.maxAge}`
|
|
50
|
-
if (options.expires) cookie += `; Expires=${options.expires.toUTCString()}`
|
|
51
|
-
cookie += `; Path=${options.path ?? "/"}`
|
|
52
|
-
if (options.domain) cookie += `; Domain=${options.domain}`
|
|
53
|
-
if (options.secure) cookie += "; Secure"
|
|
54
|
-
if (options.httpOnly) cookie += "; HttpOnly"
|
|
55
|
-
if (options.sameSite) cookie += `; SameSite=${options.sameSite}`
|
|
56
|
-
return cookie
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
function parseCookies(request: Request): Map<string, string> {
|
|
60
|
-
const cookieHeader = request.headers.get("cookie") ?? ""
|
|
61
|
-
const cookies = new Map<string, string>()
|
|
62
|
-
for (const pair of cookieHeader.split(";")) {
|
|
63
|
-
const [key, ...rest] = pair.trim().split("=")
|
|
64
|
-
if (key) cookies.set(key, rest.join("="))
|
|
65
|
-
}
|
|
66
|
-
return cookies
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export function createContext(request: Request, params: Record<string, string> = {}): Context {
|
|
70
|
-
const url = new URL(request.url)
|
|
71
|
-
const cookies = parseCookies(request)
|
|
72
|
-
const responseHeaders = new Headers()
|
|
73
|
-
const pendingCookies: string[] = []
|
|
74
|
-
|
|
75
|
-
return {
|
|
76
|
-
request,
|
|
77
|
-
url,
|
|
78
|
-
params,
|
|
79
|
-
cookies,
|
|
80
|
-
locals: {},
|
|
81
|
-
responseHeaders,
|
|
82
|
-
|
|
83
|
-
redirect(target: string, status = 302) {
|
|
84
|
-
// Prevent open redirect: only allow relative paths or same-origin URLs
|
|
85
|
-
let safeTarget = target
|
|
86
|
-
if (target.startsWith("//") || /^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(target)) {
|
|
87
|
-
try {
|
|
88
|
-
const targetUrl = new URL(target)
|
|
89
|
-
if (targetUrl.origin !== url.origin) {
|
|
90
|
-
safeTarget = "/"
|
|
91
|
-
}
|
|
92
|
-
} catch {
|
|
93
|
-
safeTarget = "/"
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
const res = new Response(null, {
|
|
97
|
-
status,
|
|
98
|
-
headers: { Location: safeTarget },
|
|
99
|
-
})
|
|
100
|
-
// Apply pending cookies to redirect response
|
|
101
|
-
for (const cookie of pendingCookies) {
|
|
102
|
-
res.headers.append("Set-Cookie", cookie)
|
|
103
|
-
}
|
|
104
|
-
return res
|
|
105
|
-
},
|
|
106
|
-
|
|
107
|
-
setCookie(name: string, value: string, options?: CookieOptions) {
|
|
108
|
-
const cookie = serializeCookie(name, value, options)
|
|
109
|
-
pendingCookies.push(cookie)
|
|
110
|
-
responseHeaders.append("Set-Cookie", cookie)
|
|
111
|
-
cookies.set(name, value)
|
|
112
|
-
},
|
|
113
|
-
|
|
114
|
-
deleteCookie(name: string, options?: Pick<CookieOptions, "path" | "domain">) {
|
|
115
|
-
const cookie = serializeCookie(name, "", {
|
|
116
|
-
...options,
|
|
117
|
-
maxAge: 0,
|
|
118
|
-
expires: new Date(0),
|
|
119
|
-
})
|
|
120
|
-
pendingCookies.push(cookie)
|
|
121
|
-
responseHeaders.append("Set-Cookie", cookie)
|
|
122
|
-
cookies.delete(name)
|
|
123
|
-
},
|
|
124
|
-
|
|
125
|
-
setHeader(name: string, value: string) {
|
|
126
|
-
responseHeaders.set(name, value)
|
|
127
|
-
},
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
export async function runMiddlewareChain(
|
|
132
|
-
middlewares: MiddlewareFn[],
|
|
133
|
-
ctx: Context,
|
|
134
|
-
handler: () => Promise<Response>
|
|
135
|
-
): Promise<Response> {
|
|
136
|
-
let index = 0
|
|
137
|
-
|
|
138
|
-
const next = async (): Promise<Response> => {
|
|
139
|
-
if (index < middlewares.length) {
|
|
140
|
-
const mw = middlewares[index]!
|
|
141
|
-
index++
|
|
142
|
-
return mw(ctx, next)
|
|
143
|
-
}
|
|
144
|
-
return handler()
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
const response = await next()
|
|
148
|
-
|
|
149
|
-
// Merge ctx.responseHeaders into response
|
|
150
|
-
for (const [key, value] of ctx.responseHeaders.entries()) {
|
|
151
|
-
if (key.toLowerCase() === "set-cookie") {
|
|
152
|
-
response.headers.append(key, value)
|
|
153
|
-
} else {
|
|
154
|
-
response.headers.set(key, value)
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
return response
|
|
159
|
-
}
|
package/src/server/not-found.ts
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { join } from "node:path"
|
|
2
|
-
import { wrapHTML, type HTMLWrapOptions } from "./html-shell.ts"
|
|
3
|
-
|
|
4
|
-
interface NotFoundOptions extends Pick<HTMLWrapOptions, "bodyPrefix" | "bodySuffix" | "headElements"> {
|
|
5
|
-
title?: string
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export async function renderNotFoundPage(
|
|
9
|
-
routesDir: string,
|
|
10
|
-
nonce: string,
|
|
11
|
-
options: NotFoundOptions = {},
|
|
12
|
-
): Promise<string> {
|
|
13
|
-
const { title = "404 - Not Found", bodyPrefix, bodySuffix, headElements } = options
|
|
14
|
-
|
|
15
|
-
try {
|
|
16
|
-
const notFoundPath = join(routesDir, "404.tsx")
|
|
17
|
-
const file = Bun.file(notFoundPath)
|
|
18
|
-
if (await file.exists()) {
|
|
19
|
-
const mod = await import(notFoundPath)
|
|
20
|
-
if (typeof mod.default === "function") {
|
|
21
|
-
const { ssrJsx, renderToString } = await import("../runtime/server.ts")
|
|
22
|
-
const vnode = ssrJsx(mod.default as any, {})
|
|
23
|
-
const body = renderToString(vnode)
|
|
24
|
-
return wrapHTML(body, nonce, { title, bodyPrefix, bodySuffix, headElements })
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
} catch {}
|
|
28
|
-
|
|
29
|
-
return wrapHTML("<h1>404</h1><p>Page not found</p>", nonce, {
|
|
30
|
-
title,
|
|
31
|
-
bodyPrefix,
|
|
32
|
-
bodySuffix,
|
|
33
|
-
headElements,
|
|
34
|
-
})
|
|
35
|
-
}
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import { resetServerHead, getServerHead } from "../runtime/head.ts"
|
|
2
|
-
import { renderToString, ssrJsx } from "../runtime/server.ts"
|
|
3
|
-
import type { Context } from "./middleware.ts"
|
|
4
|
-
import type { MatchResult } from "../router/matcher.ts"
|
|
5
|
-
|
|
6
|
-
type PageModule = Record<string, unknown>
|
|
7
|
-
|
|
8
|
-
export interface ResolvedPageRoute {
|
|
9
|
-
component: Function
|
|
10
|
-
pageComponent: Function
|
|
11
|
-
loaderData: unknown
|
|
12
|
-
cssFiles: string[]
|
|
13
|
-
renderMode: string
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface RenderedPage {
|
|
17
|
-
html: string
|
|
18
|
-
headElements: string[]
|
|
19
|
-
title?: string
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface PartialResponsePayload {
|
|
23
|
-
html: string
|
|
24
|
-
data?: unknown
|
|
25
|
-
params?: Record<string, string>
|
|
26
|
-
title?: string
|
|
27
|
-
css?: string[]
|
|
28
|
-
script?: string
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export async function resolvePageRoute(
|
|
32
|
-
mod: PageModule,
|
|
33
|
-
match: MatchResult,
|
|
34
|
-
ctx: Context,
|
|
35
|
-
): Promise<ResolvedPageRoute | null> {
|
|
36
|
-
const component = mod.default as Function | undefined
|
|
37
|
-
if (typeof component !== "function") return null
|
|
38
|
-
|
|
39
|
-
const layoutPaths = match.route.layoutPaths ?? []
|
|
40
|
-
const layoutImportPromises = layoutPaths.map((layoutPath) => import(layoutPath))
|
|
41
|
-
const pageLoaderPromise = typeof mod.loader === "function" ? mod.loader(ctx) : undefined
|
|
42
|
-
|
|
43
|
-
const [layoutMods, loaderData] = await Promise.all([
|
|
44
|
-
Promise.all(layoutImportPromises),
|
|
45
|
-
pageLoaderPromise,
|
|
46
|
-
])
|
|
47
|
-
|
|
48
|
-
const layoutLoaderPromises = layoutMods.map((layoutMod) =>
|
|
49
|
-
typeof layoutMod.loader === "function" ? layoutMod.loader(ctx) : undefined,
|
|
50
|
-
)
|
|
51
|
-
const layoutLoaderResults = await Promise.all(layoutLoaderPromises)
|
|
52
|
-
|
|
53
|
-
const cssFiles: string[] = []
|
|
54
|
-
if (typeof mod.css === "string") cssFiles.push(mod.css)
|
|
55
|
-
if (Array.isArray(mod.css)) cssFiles.push(...(mod.css as string[]))
|
|
56
|
-
|
|
57
|
-
let pageComponent: Function = component
|
|
58
|
-
for (let i = layoutMods.length - 1; i >= 0; i--) {
|
|
59
|
-
const Layout = layoutMods[i]!.default
|
|
60
|
-
if (typeof Layout === "function") {
|
|
61
|
-
const inner = pageComponent
|
|
62
|
-
const layoutData = layoutLoaderResults[i]
|
|
63
|
-
pageComponent = (props: Record<string, unknown>) =>
|
|
64
|
-
Layout({ ...props, data: layoutData, children: inner(props) })
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
return {
|
|
69
|
-
component,
|
|
70
|
-
pageComponent,
|
|
71
|
-
loaderData,
|
|
72
|
-
cssFiles,
|
|
73
|
-
renderMode: (mod.render as string) ?? "async",
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export function createClientScriptPath(entryFile?: string): string | undefined {
|
|
78
|
-
return entryFile ? `/_gorsee/${entryFile}` : undefined
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export function renderPageDocument(
|
|
82
|
-
pageComponent: Function,
|
|
83
|
-
ctx: Context,
|
|
84
|
-
params: Record<string, string>,
|
|
85
|
-
loaderData: unknown,
|
|
86
|
-
): RenderedPage {
|
|
87
|
-
resetServerHead()
|
|
88
|
-
const pageProps = { params, ctx, data: loaderData }
|
|
89
|
-
const vnode = ssrJsx(pageComponent as any, pageProps)
|
|
90
|
-
const html = renderToString(vnode)
|
|
91
|
-
const headElements = getServerHead()
|
|
92
|
-
|
|
93
|
-
return {
|
|
94
|
-
html,
|
|
95
|
-
headElements,
|
|
96
|
-
title: extractTitle(headElements),
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
export function buildPartialResponsePayload(
|
|
101
|
-
rendered: RenderedPage,
|
|
102
|
-
loaderData: unknown,
|
|
103
|
-
params: Record<string, string>,
|
|
104
|
-
cssFiles: string[],
|
|
105
|
-
clientScript?: string,
|
|
106
|
-
): PartialResponsePayload {
|
|
107
|
-
return {
|
|
108
|
-
html: rendered.html,
|
|
109
|
-
data: loaderData,
|
|
110
|
-
params: Object.keys(params).length > 0 ? params : undefined,
|
|
111
|
-
title: rendered.title,
|
|
112
|
-
css: cssFiles.length > 0 ? cssFiles : undefined,
|
|
113
|
-
script: clientScript,
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
export function extractTitle(headElements: string[]): string | undefined {
|
|
118
|
-
for (const element of headElements) {
|
|
119
|
-
const titleMatch = element.match(/<title>(.+?)<\/title>/)
|
|
120
|
-
if (titleMatch) return titleMatch[1]
|
|
121
|
-
}
|
|
122
|
-
return undefined
|
|
123
|
-
}
|
package/src/server/pipe.ts
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
// Middleware pipe — compose middleware functions into a pipeline
|
|
2
|
-
// Usage: pipe(cors(), compress(), rateLimit(), auth())
|
|
3
|
-
// Killer DX: declarative route-level middleware composition
|
|
4
|
-
|
|
5
|
-
import type { MiddlewareFn } from "./middleware.ts"
|
|
6
|
-
|
|
7
|
-
/** Compose multiple middleware into a single middleware function */
|
|
8
|
-
export function pipe(...middlewares: MiddlewareFn[]): MiddlewareFn {
|
|
9
|
-
if (middlewares.length === 0) return async (_ctx, next) => next()
|
|
10
|
-
if (middlewares.length === 1) return middlewares[0]!
|
|
11
|
-
|
|
12
|
-
return async (ctx, next) => {
|
|
13
|
-
let index = 0
|
|
14
|
-
const run = async (): Promise<Response> => {
|
|
15
|
-
if (index < middlewares.length) {
|
|
16
|
-
const mw = middlewares[index]!
|
|
17
|
-
index++
|
|
18
|
-
return mw(ctx, run)
|
|
19
|
-
}
|
|
20
|
-
return next()
|
|
21
|
-
}
|
|
22
|
-
return run()
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/** Create a conditional middleware — runs inner only if predicate passes */
|
|
27
|
-
export function when(
|
|
28
|
-
predicate: (ctx: import("./middleware.ts").Context) => boolean,
|
|
29
|
-
middleware: MiddlewareFn,
|
|
30
|
-
): MiddlewareFn {
|
|
31
|
-
return async (ctx, next) => {
|
|
32
|
-
if (predicate(ctx)) return middleware(ctx, next)
|
|
33
|
-
return next()
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/** Create a middleware that runs only for specific HTTP methods */
|
|
38
|
-
export function forMethods(methods: string[], middleware: MiddlewareFn): MiddlewareFn {
|
|
39
|
-
const methodSet = new Set(methods.map((m) => m.toUpperCase()))
|
|
40
|
-
return when((ctx) => methodSet.has(ctx.request.method), middleware)
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/** Create a middleware that runs only for specific path prefixes */
|
|
44
|
-
export function forPaths(prefixes: string[], middleware: MiddlewareFn): MiddlewareFn {
|
|
45
|
-
return when((ctx) => prefixes.some((p) => ctx.url.pathname.startsWith(p)), middleware)
|
|
46
|
-
}
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import type { CacheEntry, CacheStore } from "./cache.ts"
|
|
2
|
-
import {
|
|
3
|
-
buildRedisKey,
|
|
4
|
-
deleteExpiredRedisKeys,
|
|
5
|
-
stripRedisPrefix,
|
|
6
|
-
type RedisLikeClient,
|
|
7
|
-
} from "./redis-client.ts"
|
|
8
|
-
|
|
9
|
-
interface RedisCacheStoreOptions {
|
|
10
|
-
prefix?: string
|
|
11
|
-
maxEntryAgeMs?: number
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
interface StoredCacheEntry {
|
|
15
|
-
entry: CacheEntry
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
function isExpired(entry: CacheEntry, maxEntryAgeMs: number): boolean {
|
|
19
|
-
return Date.now() - entry.createdAt > maxEntryAgeMs
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export function createRedisCacheStore(
|
|
23
|
-
client: RedisLikeClient,
|
|
24
|
-
options: RedisCacheStoreOptions = {},
|
|
25
|
-
): CacheStore & { deleteExpired(): Promise<number> } {
|
|
26
|
-
const prefix = options.prefix ?? "gorsee:cache"
|
|
27
|
-
const maxEntryAgeMs = options.maxEntryAgeMs ?? 24 * 60 * 60 * 1000
|
|
28
|
-
|
|
29
|
-
return {
|
|
30
|
-
async get(key) {
|
|
31
|
-
const raw = await client.get(buildRedisKey(prefix, key))
|
|
32
|
-
if (!raw) return undefined
|
|
33
|
-
const payload = JSON.parse(raw) as StoredCacheEntry
|
|
34
|
-
if (isExpired(payload.entry, maxEntryAgeMs)) {
|
|
35
|
-
await client.del(buildRedisKey(prefix, key))
|
|
36
|
-
return undefined
|
|
37
|
-
}
|
|
38
|
-
return payload.entry
|
|
39
|
-
},
|
|
40
|
-
async set(key, entry) {
|
|
41
|
-
const redisKey = buildRedisKey(prefix, key)
|
|
42
|
-
await client.set(redisKey, JSON.stringify({ entry } satisfies StoredCacheEntry))
|
|
43
|
-
if (client.expire) {
|
|
44
|
-
await client.expire(redisKey, Math.max(1, Math.ceil(maxEntryAgeMs / 1000)))
|
|
45
|
-
}
|
|
46
|
-
},
|
|
47
|
-
async delete(key) {
|
|
48
|
-
await client.del(buildRedisKey(prefix, key))
|
|
49
|
-
},
|
|
50
|
-
async clear() {
|
|
51
|
-
const keys = await client.keys(`${prefix}:*`)
|
|
52
|
-
if (keys.length === 0) return
|
|
53
|
-
for (const key of keys) await client.del(key)
|
|
54
|
-
},
|
|
55
|
-
async keys() {
|
|
56
|
-
const keys = await client.keys(`${prefix}:*`)
|
|
57
|
-
const visibleKeys: string[] = []
|
|
58
|
-
for (const key of keys) {
|
|
59
|
-
const raw = await client.get(key)
|
|
60
|
-
if (!raw) continue
|
|
61
|
-
const payload = JSON.parse(raw) as StoredCacheEntry
|
|
62
|
-
if (isExpired(payload.entry, maxEntryAgeMs)) {
|
|
63
|
-
await client.del(key)
|
|
64
|
-
continue
|
|
65
|
-
}
|
|
66
|
-
visibleKeys.push(stripRedisPrefix(prefix, key))
|
|
67
|
-
}
|
|
68
|
-
return visibleKeys
|
|
69
|
-
},
|
|
70
|
-
async deleteExpired() {
|
|
71
|
-
return deleteExpiredRedisKeys(
|
|
72
|
-
client,
|
|
73
|
-
`${prefix}:*`,
|
|
74
|
-
Date.now(),
|
|
75
|
-
(raw) => {
|
|
76
|
-
try {
|
|
77
|
-
const payload = JSON.parse(raw) as StoredCacheEntry
|
|
78
|
-
return payload.entry.createdAt
|
|
79
|
-
} catch {
|
|
80
|
-
return undefined
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
|
-
maxEntryAgeMs,
|
|
84
|
-
)
|
|
85
|
-
},
|
|
86
|
-
}
|
|
87
|
-
}
|