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/reactive/live.ts
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { createSignal, type SignalGetter } from "./signal.ts"
|
|
2
|
-
|
|
3
|
-
export interface LiveOptions<T> {
|
|
4
|
-
url: string
|
|
5
|
-
initialValue: T
|
|
6
|
-
transform?: (data: unknown) => T
|
|
7
|
-
reconnect?: boolean
|
|
8
|
-
reconnectDelay?: number
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export interface LiveSignal<T> {
|
|
12
|
-
readonly value: SignalGetter<T>
|
|
13
|
-
readonly connected: SignalGetter<boolean>
|
|
14
|
-
send: (data: unknown) => void
|
|
15
|
-
close: () => void
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export function createLive<T>(options: LiveOptions<T>): LiveSignal<T> {
|
|
19
|
-
const {
|
|
20
|
-
url,
|
|
21
|
-
initialValue,
|
|
22
|
-
transform,
|
|
23
|
-
reconnect = true,
|
|
24
|
-
reconnectDelay = 1000,
|
|
25
|
-
} = options
|
|
26
|
-
|
|
27
|
-
const [value, setValue] = createSignal<T>(initialValue)
|
|
28
|
-
const [connected, setConnected] = createSignal(false)
|
|
29
|
-
|
|
30
|
-
let ws: WebSocket | null = null
|
|
31
|
-
let closed = false
|
|
32
|
-
let retryCount = 0
|
|
33
|
-
|
|
34
|
-
function handleMessage(event: MessageEvent): void {
|
|
35
|
-
try {
|
|
36
|
-
const parsed: unknown = JSON.parse(String(event.data))
|
|
37
|
-
const result = transform ? transform(parsed) : (parsed as T)
|
|
38
|
-
setValue(result)
|
|
39
|
-
} catch {
|
|
40
|
-
// ignore malformed messages
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
function handleOpen(): void {
|
|
45
|
-
retryCount = 0
|
|
46
|
-
setConnected(true)
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function handleClose(): void {
|
|
50
|
-
setConnected(false)
|
|
51
|
-
ws = null
|
|
52
|
-
if (!closed && reconnect) {
|
|
53
|
-
scheduleReconnect()
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function scheduleReconnect(): void {
|
|
58
|
-
const delay = Math.min(reconnectDelay * 2 ** retryCount, 30_000)
|
|
59
|
-
retryCount++
|
|
60
|
-
setTimeout(connect, delay)
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
function connect(): void {
|
|
64
|
-
if (closed) return
|
|
65
|
-
if (typeof globalThis.WebSocket === "undefined") return
|
|
66
|
-
|
|
67
|
-
ws = new WebSocket(url)
|
|
68
|
-
ws.addEventListener("open", handleOpen)
|
|
69
|
-
ws.addEventListener("message", handleMessage)
|
|
70
|
-
ws.addEventListener("close", handleClose)
|
|
71
|
-
ws.addEventListener("error", () => {
|
|
72
|
-
// error triggers close, handled there
|
|
73
|
-
})
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function send(data: unknown): void {
|
|
77
|
-
if (ws && ws.readyState === WebSocket.OPEN) {
|
|
78
|
-
ws.send(JSON.stringify(data))
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
function close(): void {
|
|
83
|
-
closed = true
|
|
84
|
-
if (ws) {
|
|
85
|
-
ws.close()
|
|
86
|
-
ws = null
|
|
87
|
-
}
|
|
88
|
-
setConnected(false)
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Only connect in browser environment
|
|
92
|
-
if (typeof globalThis.WebSocket !== "undefined") {
|
|
93
|
-
connect()
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
return { value, connected, send, close }
|
|
97
|
-
}
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
// Optimistic mutations — update UI instantly, rollback on server error
|
|
2
|
-
// Killer feature: no framework has this built-in at reactive level
|
|
3
|
-
|
|
4
|
-
import { createSignal, type SignalGetter } from "./signal.ts"
|
|
5
|
-
|
|
6
|
-
export interface MutationOptions<T, V> {
|
|
7
|
-
mutationFn: (variables: V) => Promise<T>
|
|
8
|
-
onSuccess?: (data: T, variables: V) => void
|
|
9
|
-
onError?: (error: Error, variables: V) => void
|
|
10
|
-
onSettled?: (data: T | undefined, error: Error | undefined) => void
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export interface MutationState<T> {
|
|
14
|
-
readonly data: SignalGetter<T | undefined>
|
|
15
|
-
readonly error: SignalGetter<Error | undefined>
|
|
16
|
-
readonly isPending: SignalGetter<boolean>
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface Mutation<T, V> extends MutationState<T> {
|
|
20
|
-
mutate: (variables: V) => Promise<T>
|
|
21
|
-
/** Optimistic: update signal immediately, rollback if server fails */
|
|
22
|
-
optimistic: <S>(
|
|
23
|
-
signal: SignalGetter<S>,
|
|
24
|
-
setter: (current: S) => void,
|
|
25
|
-
update: (current: S, variables: V) => S,
|
|
26
|
-
variables: V,
|
|
27
|
-
) => Promise<T>
|
|
28
|
-
reset: () => void
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export function createMutation<T, V = void>(
|
|
32
|
-
options: MutationOptions<T, V>,
|
|
33
|
-
): Mutation<T, V> {
|
|
34
|
-
const [data, setData] = createSignal<T | undefined>(undefined)
|
|
35
|
-
const [error, setError] = createSignal<Error | undefined>(undefined)
|
|
36
|
-
const [isPending, setIsPending] = createSignal(false)
|
|
37
|
-
|
|
38
|
-
async function mutate(variables: V): Promise<T> {
|
|
39
|
-
setIsPending(true)
|
|
40
|
-
setError(undefined)
|
|
41
|
-
try {
|
|
42
|
-
const result = await options.mutationFn(variables)
|
|
43
|
-
setData(result)
|
|
44
|
-
options.onSuccess?.(result, variables)
|
|
45
|
-
options.onSettled?.(result, undefined)
|
|
46
|
-
return result
|
|
47
|
-
} catch (err) {
|
|
48
|
-
const e = err instanceof Error ? err : new Error(String(err))
|
|
49
|
-
setError(e)
|
|
50
|
-
options.onError?.(e, variables)
|
|
51
|
-
options.onSettled?.(undefined, e)
|
|
52
|
-
throw e
|
|
53
|
-
} finally {
|
|
54
|
-
setIsPending(false)
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
async function optimistic<S>(
|
|
59
|
-
signal: SignalGetter<S>,
|
|
60
|
-
setter: (val: S) => void,
|
|
61
|
-
update: (current: S, variables: V) => S,
|
|
62
|
-
variables: V,
|
|
63
|
-
): Promise<T> {
|
|
64
|
-
const previous = signal()
|
|
65
|
-
// Apply optimistic update immediately
|
|
66
|
-
setter(update(previous, variables))
|
|
67
|
-
try {
|
|
68
|
-
return await mutate(variables)
|
|
69
|
-
} catch (err) {
|
|
70
|
-
// Rollback on failure
|
|
71
|
-
setter(previous)
|
|
72
|
-
throw err
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function reset(): void {
|
|
77
|
-
setData(undefined)
|
|
78
|
-
setError(undefined)
|
|
79
|
-
setIsPending(false)
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return { data, error, isPending, mutate, optimistic, reset }
|
|
83
|
-
}
|
package/src/reactive/resource.ts
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import { createSignal, type SignalGetter } from "./signal.ts"
|
|
2
|
-
|
|
3
|
-
export interface ResourceOptions {
|
|
4
|
-
/** Initial data (skip first fetch) */
|
|
5
|
-
initialData?: unknown
|
|
6
|
-
/** Retry count on failure (default: 0) */
|
|
7
|
-
retry?: number
|
|
8
|
-
/** Retry delay in ms (default: 1000) */
|
|
9
|
-
retryDelay?: number
|
|
10
|
-
/** Cache key for deduplication */
|
|
11
|
-
key?: string
|
|
12
|
-
/** Stale time in ms — refetch after this period */
|
|
13
|
-
staleTime?: number
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface ResourceState<T> {
|
|
17
|
-
loading: SignalGetter<boolean>
|
|
18
|
-
error: SignalGetter<Error | undefined>
|
|
19
|
-
refetch: () => void
|
|
20
|
-
mutate: (value: T | ((prev: T | undefined) => T)) => void
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export type ResourceReturn<T> = [SignalGetter<T | undefined>, ResourceState<T>]
|
|
24
|
-
|
|
25
|
-
// Simple in-memory cache for resource deduplication
|
|
26
|
-
interface CacheEntry {
|
|
27
|
-
data: unknown
|
|
28
|
-
fetchedAt: number
|
|
29
|
-
promise?: Promise<unknown>
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const resourceCache = new Map<string, CacheEntry>()
|
|
33
|
-
|
|
34
|
-
export function invalidateResource(key: string): void {
|
|
35
|
-
resourceCache.delete(key)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export function invalidateAll(): void {
|
|
39
|
-
resourceCache.clear()
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export function createResource<T>(
|
|
43
|
-
fetcher: () => Promise<T>,
|
|
44
|
-
options?: ResourceOptions,
|
|
45
|
-
): ResourceReturn<T> {
|
|
46
|
-
const retryCount = options?.retry ?? 0
|
|
47
|
-
const retryDelay = options?.retryDelay ?? 1000
|
|
48
|
-
const cacheKey = options?.key
|
|
49
|
-
const staleTime = options?.staleTime
|
|
50
|
-
|
|
51
|
-
// Check cache
|
|
52
|
-
const cached = cacheKey ? resourceCache.get(cacheKey) : undefined
|
|
53
|
-
const hasValidCache = cached && staleTime && (Date.now() - cached.fetchedAt < staleTime)
|
|
54
|
-
const initialValue = hasValidCache ? cached.data as T : options?.initialData as T | undefined
|
|
55
|
-
|
|
56
|
-
const [data, setData] = createSignal<T | undefined>(initialValue)
|
|
57
|
-
const [loading, setLoading] = createSignal(!hasValidCache)
|
|
58
|
-
const [error, setError] = createSignal<Error | undefined>(undefined)
|
|
59
|
-
|
|
60
|
-
async function fetchWithRetry(attempt: number): Promise<T> {
|
|
61
|
-
try {
|
|
62
|
-
return await fetcher()
|
|
63
|
-
} catch (err) {
|
|
64
|
-
if (attempt < retryCount) {
|
|
65
|
-
await new Promise((r) => setTimeout(r, retryDelay * (attempt + 1)))
|
|
66
|
-
return fetchWithRetry(attempt + 1)
|
|
67
|
-
}
|
|
68
|
-
throw err
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const load = () => {
|
|
73
|
-
// Deduplicate: if another resource with same key is already fetching, reuse promise
|
|
74
|
-
if (cacheKey) {
|
|
75
|
-
const entry = resourceCache.get(cacheKey)
|
|
76
|
-
if (entry?.promise) {
|
|
77
|
-
entry.promise.then((result) => {
|
|
78
|
-
setData(() => result as T)
|
|
79
|
-
setLoading(false)
|
|
80
|
-
}).catch((err) => {
|
|
81
|
-
setError(err instanceof Error ? err : new Error(String(err)))
|
|
82
|
-
setLoading(false)
|
|
83
|
-
})
|
|
84
|
-
return
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
setLoading(true)
|
|
89
|
-
setError(undefined)
|
|
90
|
-
|
|
91
|
-
const promise = fetchWithRetry(0)
|
|
92
|
-
|
|
93
|
-
// Store promise in cache for dedup
|
|
94
|
-
if (cacheKey) {
|
|
95
|
-
const entry = resourceCache.get(cacheKey) ?? { data: undefined, fetchedAt: 0 }
|
|
96
|
-
entry.promise = promise
|
|
97
|
-
resourceCache.set(cacheKey, entry)
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
promise
|
|
101
|
-
.then((result) => {
|
|
102
|
-
setData(() => result)
|
|
103
|
-
setLoading(false)
|
|
104
|
-
if (cacheKey) {
|
|
105
|
-
resourceCache.set(cacheKey, { data: result, fetchedAt: Date.now() })
|
|
106
|
-
}
|
|
107
|
-
})
|
|
108
|
-
.catch((err) => {
|
|
109
|
-
setError(err instanceof Error ? err : new Error(String(err)))
|
|
110
|
-
setLoading(false)
|
|
111
|
-
if (cacheKey) {
|
|
112
|
-
const entry = resourceCache.get(cacheKey)
|
|
113
|
-
if (entry) entry.promise = undefined
|
|
114
|
-
}
|
|
115
|
-
})
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// Don't fetch if we have valid cache
|
|
119
|
-
if (!hasValidCache) {
|
|
120
|
-
load()
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
return [
|
|
124
|
-
data,
|
|
125
|
-
{
|
|
126
|
-
loading,
|
|
127
|
-
error,
|
|
128
|
-
refetch: load,
|
|
129
|
-
mutate: (value) => {
|
|
130
|
-
if (typeof value === "function") {
|
|
131
|
-
setData(value as (prev: T | undefined) => T)
|
|
132
|
-
} else {
|
|
133
|
-
setData(() => value)
|
|
134
|
-
}
|
|
135
|
-
},
|
|
136
|
-
},
|
|
137
|
-
]
|
|
138
|
-
}
|
package/src/reactive/signal.ts
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { signal as alienSignal } from "alien-signals"
|
|
2
|
-
|
|
3
|
-
export type SignalGetter<T> = () => T
|
|
4
|
-
export type SignalSetter<T> = (value: T | ((prev: T) => T)) => void
|
|
5
|
-
|
|
6
|
-
export function createSignal<T>(initialValue: T): [SignalGetter<T>, SignalSetter<T>] {
|
|
7
|
-
const s = alienSignal(initialValue)
|
|
8
|
-
|
|
9
|
-
const getter: SignalGetter<T> = () => s()
|
|
10
|
-
|
|
11
|
-
const setter: SignalSetter<T> = (value) => {
|
|
12
|
-
if (typeof value === "function") {
|
|
13
|
-
s((value as (prev: T) => T)(s()))
|
|
14
|
-
} else {
|
|
15
|
-
s(value)
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
return [getter, setter]
|
|
20
|
-
}
|
package/src/reactive/store.ts
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { createSignal, type SignalGetter, type SignalSetter } from "./signal.ts"
|
|
2
|
-
|
|
3
|
-
export type Store<T extends Record<string, unknown>> = {
|
|
4
|
-
readonly [K in keyof T]: SignalGetter<T[K]>
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export type SetStore<T extends Record<string, unknown>> = <K extends keyof T>(
|
|
8
|
-
key: K,
|
|
9
|
-
value: T[K] | ((prev: T[K]) => T[K])
|
|
10
|
-
) => void
|
|
11
|
-
|
|
12
|
-
export function createStore<T extends Record<string, unknown>>(
|
|
13
|
-
initialValue: T
|
|
14
|
-
): [Store<T>, SetStore<T>] {
|
|
15
|
-
const signals = new Map<keyof T, [SignalGetter<unknown>, SignalSetter<unknown>]>()
|
|
16
|
-
|
|
17
|
-
for (const key of Object.keys(initialValue) as (keyof T)[]) {
|
|
18
|
-
signals.set(key, createSignal<unknown>(initialValue[key]))
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const store = new Proxy({} as Store<T>, {
|
|
22
|
-
get(_target, prop: string) {
|
|
23
|
-
const entry = signals.get(prop as keyof T)
|
|
24
|
-
if (!entry) return undefined
|
|
25
|
-
return entry[0]
|
|
26
|
-
},
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
const setStore: SetStore<T> = (key, value) => {
|
|
30
|
-
const entry = signals.get(key)
|
|
31
|
-
if (!entry) return
|
|
32
|
-
entry[1](value as unknown)
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return [store, setStore]
|
|
36
|
-
}
|
package/src/router/index.ts
DELETED
package/src/router/matcher.ts
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import type { Route } from "./scanner.ts"
|
|
2
|
-
|
|
3
|
-
export interface MatchResult {
|
|
4
|
-
route: Route
|
|
5
|
-
params: Record<string, string>
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
// Pre-build a lookup map for static routes (O(1) matching)
|
|
9
|
-
export function buildStaticMap(routes: Route[]): Map<string, Route> {
|
|
10
|
-
const map = new Map<string, Route>()
|
|
11
|
-
for (const route of routes) {
|
|
12
|
-
if (!route.isDynamic) map.set(route.path, route)
|
|
13
|
-
}
|
|
14
|
-
return map
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export function matchRoute(
|
|
18
|
-
routes: Route[],
|
|
19
|
-
pathname: string,
|
|
20
|
-
staticMap?: Map<string, Route>,
|
|
21
|
-
): MatchResult | null {
|
|
22
|
-
// Normalize: remove trailing slash (except root)
|
|
23
|
-
const normalized = pathname === "/" ? "/" : pathname.replace(/\/+$/, "")
|
|
24
|
-
|
|
25
|
-
// Fast O(1) lookup for static routes
|
|
26
|
-
if (staticMap) {
|
|
27
|
-
const staticRoute = staticMap.get(normalized)
|
|
28
|
-
if (staticRoute) return { route: staticRoute, params: {} }
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Fallback to regex matching for dynamic routes
|
|
32
|
-
for (const route of routes) {
|
|
33
|
-
if (!route.isDynamic && staticMap) continue
|
|
34
|
-
const match = route.pattern.exec(normalized)
|
|
35
|
-
if (!match) continue
|
|
36
|
-
|
|
37
|
-
const params: Record<string, string> = {}
|
|
38
|
-
for (let i = 0; i < route.params.length; i++) {
|
|
39
|
-
const value = match[i + 1]
|
|
40
|
-
if (value !== undefined) {
|
|
41
|
-
try {
|
|
42
|
-
params[route.params[i]!] = decodeURIComponent(value)
|
|
43
|
-
} catch {
|
|
44
|
-
params[route.params[i]!] = value
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return { route, params }
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
return null
|
|
53
|
-
}
|
package/src/router/scanner.ts
DELETED
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
// Route scanner -- reads routes/ directory, builds route tree
|
|
2
|
-
|
|
3
|
-
import { readdir, stat } from "node:fs/promises"
|
|
4
|
-
import { join, extname, basename } from "node:path"
|
|
5
|
-
|
|
6
|
-
export interface Route {
|
|
7
|
-
path: string
|
|
8
|
-
pattern: RegExp
|
|
9
|
-
filePath: string
|
|
10
|
-
isDynamic: boolean
|
|
11
|
-
params: string[]
|
|
12
|
-
layoutPath: string | null
|
|
13
|
-
layoutPaths: string[]
|
|
14
|
-
middlewarePath: string | null
|
|
15
|
-
middlewarePaths: string[]
|
|
16
|
-
errorPath: string | null
|
|
17
|
-
loadingPath: string | null
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const ROUTE_EXTENSIONS = new Set([".tsx", ".ts"])
|
|
21
|
-
const IGNORED_PREFIXES = ["_"]
|
|
22
|
-
|
|
23
|
-
function fileToRoutePath(relativePath: string): string {
|
|
24
|
-
let route = relativePath
|
|
25
|
-
.replace(/\\/g, "/")
|
|
26
|
-
.replace(/\.(tsx?|jsx?)$/, "")
|
|
27
|
-
|
|
28
|
-
// index files -> parent path
|
|
29
|
-
if (route === "index" || route.endsWith("/index")) {
|
|
30
|
-
route = route.slice(0, -"index".length) || "/"
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
if (!route.startsWith("/")) route = "/" + route
|
|
34
|
-
// Remove trailing slash (except root)
|
|
35
|
-
if (route.length > 1 && route.endsWith("/")) route = route.slice(0, -1)
|
|
36
|
-
return route
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function routeToPattern(routePath: string): { pattern: RegExp; params: string[] } {
|
|
40
|
-
const params: string[] = []
|
|
41
|
-
|
|
42
|
-
const regexStr = routePath
|
|
43
|
-
.split("/")
|
|
44
|
-
.map((segment) => {
|
|
45
|
-
if (!segment) return ""
|
|
46
|
-
|
|
47
|
-
// catch-all: [...path]
|
|
48
|
-
if (segment.startsWith("[...") && segment.endsWith("]")) {
|
|
49
|
-
const param = segment.slice(4, -1)
|
|
50
|
-
params.push(param)
|
|
51
|
-
return "(?:/(.+))?"
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// dynamic: [id]
|
|
55
|
-
if (segment.startsWith("[") && segment.endsWith("]")) {
|
|
56
|
-
const param = segment.slice(1, -1)
|
|
57
|
-
params.push(param)
|
|
58
|
-
return "/([^/]+)"
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return "/" + segment.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
|
|
62
|
-
})
|
|
63
|
-
.join("")
|
|
64
|
-
|
|
65
|
-
const finalRegex = regexStr || "/"
|
|
66
|
-
return {
|
|
67
|
-
pattern: new RegExp(`^${finalRegex}$`),
|
|
68
|
-
params,
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
interface ScanMaps {
|
|
73
|
-
layouts: Map<string, string>
|
|
74
|
-
middlewares: Map<string, string>
|
|
75
|
-
errors: Map<string, string>
|
|
76
|
-
loadings: Map<string, string>
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
async function scanDirectory(
|
|
80
|
-
dir: string,
|
|
81
|
-
basePath: string,
|
|
82
|
-
routes: Route[],
|
|
83
|
-
parent?: ScanMaps,
|
|
84
|
-
): Promise<ScanMaps> {
|
|
85
|
-
const layouts = new Map<string, string>(parent?.layouts)
|
|
86
|
-
const middlewares = new Map<string, string>(parent?.middlewares)
|
|
87
|
-
|
|
88
|
-
let entries: string[]
|
|
89
|
-
try {
|
|
90
|
-
entries = await readdir(dir)
|
|
91
|
-
} catch {
|
|
92
|
-
return { layouts, middlewares, errors: new Map(), loadings: new Map() }
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// First pass: find layouts, middleware, error boundaries, and loading states
|
|
96
|
-
const errors = new Map<string, string>(parent?.errors)
|
|
97
|
-
const loadings = new Map<string, string>(parent?.loadings)
|
|
98
|
-
for (const entry of entries) {
|
|
99
|
-
const fullPath = join(dir, entry)
|
|
100
|
-
const name = basename(entry, extname(entry))
|
|
101
|
-
|
|
102
|
-
if (name === "_layout") {
|
|
103
|
-
layouts.set(basePath || "/", fullPath)
|
|
104
|
-
}
|
|
105
|
-
if (name === "_middleware") {
|
|
106
|
-
middlewares.set(basePath || "/", fullPath)
|
|
107
|
-
}
|
|
108
|
-
if (name === "_error") {
|
|
109
|
-
errors.set(basePath || "/", fullPath)
|
|
110
|
-
}
|
|
111
|
-
if (name === "_loading") {
|
|
112
|
-
loadings.set(basePath || "/", fullPath)
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// Second pass: process routes and subdirectories
|
|
117
|
-
for (const entry of entries) {
|
|
118
|
-
const fullPath = join(dir, entry)
|
|
119
|
-
const entryStat = await stat(fullPath)
|
|
120
|
-
const name = basename(entry, extname(entry))
|
|
121
|
-
|
|
122
|
-
if (entryStat.isDirectory()) {
|
|
123
|
-
// Route groups: (group) directories don't add to URL path
|
|
124
|
-
const isGroup = entry.startsWith("(") && entry.endsWith(")")
|
|
125
|
-
const subPath = isGroup ? basePath : (basePath ? `${basePath}/${entry}` : entry)
|
|
126
|
-
const sub = await scanDirectory(fullPath, subPath, routes, { layouts, middlewares, errors, loadings })
|
|
127
|
-
for (const [k, v] of sub.layouts) layouts.set(k, v)
|
|
128
|
-
for (const [k, v] of sub.middlewares) middlewares.set(k, v)
|
|
129
|
-
for (const [k, v] of sub.errors) errors.set(k, v)
|
|
130
|
-
for (const [k, v] of sub.loadings) loadings.set(k, v)
|
|
131
|
-
continue
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
if (!ROUTE_EXTENSIONS.has(extname(entry))) continue
|
|
135
|
-
if (IGNORED_PREFIXES.some((p) => name.startsWith(p))) continue
|
|
136
|
-
|
|
137
|
-
const relPath = basePath ? `${basePath}/${entry}` : entry
|
|
138
|
-
const routePath = fileToRoutePath(relPath)
|
|
139
|
-
const { pattern, params } = routeToPattern(routePath)
|
|
140
|
-
|
|
141
|
-
// Build middleware chain: collect from root → current directory
|
|
142
|
-
const middlewarePaths: string[] = []
|
|
143
|
-
const segments = (basePath || "/").split("/").filter(Boolean)
|
|
144
|
-
const dirs = ["/"]
|
|
145
|
-
for (let i = 0; i < segments.length; i++) {
|
|
146
|
-
dirs.push(segments.slice(0, i + 1).join("/"))
|
|
147
|
-
}
|
|
148
|
-
for (const d of dirs) {
|
|
149
|
-
const mwPath = middlewares.get(d)
|
|
150
|
-
if (mwPath) middlewarePaths.push(mwPath)
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// Build layout chain: collect from root → current directory
|
|
154
|
-
const layoutPaths: string[] = []
|
|
155
|
-
for (const d of dirs) {
|
|
156
|
-
const lPath = layouts.get(d)
|
|
157
|
-
if (lPath) layoutPaths.push(lPath)
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// Find nearest loading component (walk up)
|
|
161
|
-
let loadingPath: string | null = null
|
|
162
|
-
for (let i = dirs.length - 1; i >= 0; i--) {
|
|
163
|
-
const lp = loadings.get(dirs[i]!)
|
|
164
|
-
if (lp) { loadingPath = lp; break }
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// Find nearest error boundary (walk up)
|
|
168
|
-
let errorPath: string | null = null
|
|
169
|
-
for (let i = dirs.length - 1; i >= 0; i--) {
|
|
170
|
-
const ep = errors.get(dirs[i]!)
|
|
171
|
-
if (ep) { errorPath = ep; break }
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
routes.push({
|
|
175
|
-
path: routePath,
|
|
176
|
-
pattern,
|
|
177
|
-
filePath: fullPath,
|
|
178
|
-
isDynamic: params.length > 0,
|
|
179
|
-
params,
|
|
180
|
-
layoutPath: layoutPaths[layoutPaths.length - 1] ?? null,
|
|
181
|
-
layoutPaths,
|
|
182
|
-
middlewarePath: middlewarePaths[middlewarePaths.length - 1] ?? null,
|
|
183
|
-
middlewarePaths,
|
|
184
|
-
errorPath,
|
|
185
|
-
loadingPath,
|
|
186
|
-
})
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
return { layouts, middlewares, errors, loadings }
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
export async function createRouter(routesDir: string): Promise<Route[]> {
|
|
193
|
-
const routes: Route[] = []
|
|
194
|
-
await scanDirectory(routesDir, "", routes)
|
|
195
|
-
|
|
196
|
-
// Sort: static routes first, then dynamic, then catch-all
|
|
197
|
-
routes.sort((a, b) => {
|
|
198
|
-
if (a.isDynamic !== b.isDynamic) return a.isDynamic ? 1 : -1
|
|
199
|
-
const aCatchAll = a.path.includes("[...")
|
|
200
|
-
const bCatchAll = b.path.includes("[...")
|
|
201
|
-
if (aCatchAll !== bCatchAll) return aCatchAll ? 1 : -1
|
|
202
|
-
return a.path.localeCompare(b.path)
|
|
203
|
-
})
|
|
204
|
-
|
|
205
|
-
return routes
|
|
206
|
-
}
|
package/src/runtime/client.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
// Client-side rendering and hydration
|
|
2
|
-
|
|
3
|
-
import type { GorseeNode } from "./jsx-runtime.ts"
|
|
4
|
-
import { enterHydration, exitHydration } from "./hydration.ts"
|
|
5
|
-
import { replayEvents } from "./event-replay.ts"
|
|
6
|
-
|
|
7
|
-
function insertResult(container: Element, result: GorseeNode): void {
|
|
8
|
-
if (result instanceof Node) {
|
|
9
|
-
container.appendChild(result)
|
|
10
|
-
} else if (Array.isArray(result)) {
|
|
11
|
-
for (const child of result) insertResult(container, child)
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function render(component: () => GorseeNode, container: Element): void {
|
|
16
|
-
container.replaceChildren()
|
|
17
|
-
insertResult(container, component())
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function hydrate(component: () => GorseeNode, container: Element): void {
|
|
21
|
-
// Cursor-based hydration: walks server-rendered DOM, attaches bindings
|
|
22
|
-
enterHydration(container)
|
|
23
|
-
component()
|
|
24
|
-
exitHydration()
|
|
25
|
-
|
|
26
|
-
// Replay events captured before hydration
|
|
27
|
-
replayEvents(container)
|
|
28
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
// Client-side ErrorBoundary component
|
|
2
|
-
// Catches errors during rendering and shows fallback UI
|
|
3
|
-
|
|
4
|
-
import { createSignal } from "../reactive/signal.ts"
|
|
5
|
-
|
|
6
|
-
export interface ErrorBoundaryProps {
|
|
7
|
-
fallback: unknown | ((error: Error) => unknown)
|
|
8
|
-
children: unknown
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function ErrorBoundary(props: ErrorBoundaryProps): unknown {
|
|
12
|
-
const [error, setError] = createSignal<Error | null>(null)
|
|
13
|
-
|
|
14
|
-
try {
|
|
15
|
-
// Try to evaluate children
|
|
16
|
-
const children = typeof props.children === "function"
|
|
17
|
-
? (props.children as Function)()
|
|
18
|
-
: props.children
|
|
19
|
-
return () => {
|
|
20
|
-
const err = error()
|
|
21
|
-
if (err) {
|
|
22
|
-
return typeof props.fallback === "function"
|
|
23
|
-
? (props.fallback as (e: Error) => unknown)(err)
|
|
24
|
-
: props.fallback
|
|
25
|
-
}
|
|
26
|
-
return children
|
|
27
|
-
}
|
|
28
|
-
} catch (err) {
|
|
29
|
-
const errObj = err instanceof Error ? err : new Error(String(err))
|
|
30
|
-
setError(errObj)
|
|
31
|
-
return typeof props.fallback === "function"
|
|
32
|
-
? (props.fallback as (e: Error) => unknown)(errObj)
|
|
33
|
-
: props.fallback
|
|
34
|
-
}
|
|
35
|
-
}
|