gorsee 0.2.4 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +261 -213
- package/dist-pkg/ai/artifact-lifecycle.d.ts +25 -0
- package/dist-pkg/ai/artifact-lifecycle.js +98 -0
- package/dist-pkg/ai/bridge.d.ts +26 -0
- package/dist-pkg/ai/bridge.js +82 -0
- package/dist-pkg/ai/bundle.d.ts +46 -0
- package/dist-pkg/ai/bundle.js +247 -0
- package/dist-pkg/ai/contracts.d.ts +1 -0
- package/dist-pkg/ai/contracts.js +1 -0
- package/dist-pkg/ai/ide.d.ts +37 -0
- package/dist-pkg/ai/ide.js +56 -0
- package/dist-pkg/ai/index.d.ts +85 -0
- package/dist-pkg/ai/index.js +267 -0
- package/dist-pkg/ai/json.d.ts +6 -0
- package/dist-pkg/ai/json.js +14 -0
- package/dist-pkg/ai/mcp.d.ts +28 -0
- package/dist-pkg/ai/mcp.js +152 -0
- package/dist-pkg/ai/session-pack.d.ts +28 -0
- package/dist-pkg/ai/session-pack.js +57 -0
- package/dist-pkg/ai/store.d.ts +67 -0
- package/dist-pkg/ai/store.js +174 -0
- package/dist-pkg/ai/summary.d.ts +57 -0
- package/dist-pkg/ai/summary.js +148 -0
- package/dist-pkg/ai/watch.d.ts +15 -0
- package/dist-pkg/ai/watch.js +66 -0
- package/dist-pkg/auth/action-tokens.d.ts +50 -0
- package/dist-pkg/auth/action-tokens.js +79 -0
- package/dist-pkg/auth/index.d.ts +70 -0
- package/dist-pkg/auth/index.js +199 -0
- package/dist-pkg/auth/redis-session-store.d.ts +7 -0
- package/dist-pkg/auth/redis-session-store.js +42 -0
- package/dist-pkg/auth/signing.d.ts +4 -0
- package/dist-pkg/auth/signing.js +33 -0
- package/dist-pkg/auth/sqlite-session-store.d.ts +12 -0
- package/dist-pkg/auth/sqlite-session-store.js +83 -0
- package/dist-pkg/auth/store-utils.d.ts +2 -0
- package/dist-pkg/auth/store-utils.js +20 -0
- package/dist-pkg/bin/gorsee.js +2 -0
- package/dist-pkg/build/backends/experimental-rolldown.d.ts +6 -0
- package/dist-pkg/build/backends/experimental-rolldown.js +9 -0
- package/dist-pkg/build/backends/register.d.ts +7 -0
- package/dist-pkg/build/backends/register.js +24 -0
- package/dist-pkg/build/backends/rolldown.d.ts +16 -0
- package/dist-pkg/build/backends/rolldown.js +176 -0
- package/dist-pkg/build/client-backend.d.ts +31 -0
- package/dist-pkg/build/client-backend.js +97 -0
- package/dist-pkg/build/client.d.ts +12 -0
- package/dist-pkg/build/client.js +93 -0
- package/dist-pkg/build/css-modules.d.ts +10 -0
- package/dist-pkg/build/css-modules.js +51 -0
- package/dist-pkg/build/devalue-parse.d.ts +1 -0
- package/dist-pkg/build/devalue-parse.js +1 -0
- package/dist-pkg/build/diagnostics.d.ts +20 -0
- package/dist-pkg/build/diagnostics.js +35 -0
- package/dist-pkg/build/fixtures.d.ts +7 -0
- package/dist-pkg/build/fixtures.js +60 -0
- package/dist-pkg/build/framework-imports.d.ts +4 -0
- package/dist-pkg/build/framework-imports.js +58 -0
- package/dist-pkg/build/init.d.ts +1 -0
- package/dist-pkg/build/init.js +6 -0
- package/dist-pkg/build/manifest.d.ts +3 -0
- package/dist-pkg/build/manifest.js +23 -0
- package/dist-pkg/build/parity.d.ts +32 -0
- package/dist-pkg/build/parity.js +71 -0
- package/dist-pkg/build/plugin.d.ts +11 -0
- package/dist-pkg/build/plugin.js +8 -0
- package/dist-pkg/build/readiness.d.ts +11 -0
- package/dist-pkg/build/readiness.js +18 -0
- package/dist-pkg/build/route-client-transform.d.ts +17 -0
- package/dist-pkg/build/route-client-transform.js +48 -0
- package/dist-pkg/build/route-metadata.d.ts +6 -0
- package/dist-pkg/build/route-metadata.js +8 -0
- package/dist-pkg/build/rpc-transform.d.ts +1 -0
- package/dist-pkg/build/rpc-transform.js +44 -0
- package/dist-pkg/build/server-bundle.d.ts +4 -0
- package/dist-pkg/build/server-bundle.js +261 -0
- package/dist-pkg/build/server-strip.d.ts +2 -0
- package/dist-pkg/build/server-strip.js +32 -0
- package/dist-pkg/build/ssg.d.ts +12 -0
- package/dist-pkg/build/ssg.js +36 -0
- package/dist-pkg/cli/bun-plugin.d.ts +2 -0
- package/dist-pkg/cli/bun-plugin.js +14 -0
- package/dist-pkg/cli/canonical-import-rewrite.d.ts +18 -0
- package/dist-pkg/cli/canonical-import-rewrite.js +94 -0
- package/dist-pkg/cli/canonical-imports.d.ts +8 -0
- package/dist-pkg/cli/canonical-imports.js +131 -0
- package/dist-pkg/cli/check-ast.d.ts +20 -0
- package/dist-pkg/cli/check-ast.js +126 -0
- package/dist-pkg/cli/cmd-ai.d.ts +4 -0
- package/dist-pkg/cli/cmd-ai.js +290 -0
- package/dist-pkg/cli/cmd-build.d.ts +12 -0
- package/dist-pkg/cli/cmd-build.js +198 -0
- package/dist-pkg/cli/cmd-check.d.ts +25 -0
- package/dist-pkg/cli/cmd-check.js +573 -0
- package/dist-pkg/cli/cmd-create.d.ts +6 -0
- package/dist-pkg/cli/cmd-create.js +600 -0
- package/dist-pkg/cli/cmd-deploy.d.ts +6 -0
- package/dist-pkg/cli/cmd-deploy.js +381 -0
- package/dist-pkg/cli/cmd-dev.d.ts +5 -0
- package/dist-pkg/cli/cmd-dev.js +5 -0
- package/dist-pkg/cli/cmd-docs.d.ts +50 -0
- package/dist-pkg/cli/cmd-docs.js +122 -0
- package/dist-pkg/cli/cmd-generate.d.ts +12 -0
- package/dist-pkg/cli/cmd-generate.js +320 -0
- package/dist-pkg/cli/cmd-migrate.d.ts +7 -0
- package/dist-pkg/cli/cmd-migrate.js +42 -0
- package/dist-pkg/cli/cmd-routes.d.ts +6 -0
- package/dist-pkg/cli/cmd-routes.js +24 -0
- package/dist-pkg/cli/cmd-start.d.ts +13 -0
- package/dist-pkg/cli/cmd-start.js +32 -0
- package/dist-pkg/cli/cmd-test.d.ts +20 -0
- package/dist-pkg/cli/cmd-test.js +103 -0
- package/dist-pkg/cli/cmd-typegen.d.ts +7 -0
- package/dist-pkg/cli/cmd-typegen.js +66 -0
- package/dist-pkg/cli/cmd-upgrade.d.ts +38 -0
- package/dist-pkg/cli/cmd-upgrade.js +232 -0
- package/dist-pkg/cli/context.d.ts +4 -0
- package/dist-pkg/cli/context.js +4 -0
- package/dist-pkg/cli/framework-md.d.ts +1 -0
- package/dist-pkg/cli/framework-md.js +391 -0
- package/dist-pkg/cli/index.d.ts +6 -0
- package/dist-pkg/cli/index.js +106 -0
- package/dist-pkg/cli/release-version.d.ts +2 -0
- package/dist-pkg/cli/release-version.js +33 -0
- package/dist-pkg/client.d.ts +16 -0
- package/dist-pkg/client.js +71 -0
- package/dist-pkg/compat.d.ts +1 -0
- package/dist-pkg/compat.js +1 -0
- package/dist-pkg/compiler/analysis-backend.d.ts +20 -0
- package/dist-pkg/compiler/analysis-backend.js +164 -0
- package/dist-pkg/compiler/backends/experimental-oxc.d.ts +6 -0
- package/dist-pkg/compiler/backends/experimental-oxc.js +9 -0
- package/dist-pkg/compiler/backends/oxc.d.ts +16 -0
- package/dist-pkg/compiler/backends/oxc.js +198 -0
- package/dist-pkg/compiler/backends/register.d.ts +7 -0
- package/dist-pkg/compiler/backends/register.js +22 -0
- package/dist-pkg/compiler/fixtures.d.ts +2 -0
- package/dist-pkg/compiler/fixtures.js +118 -0
- package/dist-pkg/compiler/init.d.ts +1 -0
- package/dist-pkg/compiler/init.js +6 -0
- package/dist-pkg/compiler/module-analysis.d.ts +13 -0
- package/dist-pkg/compiler/module-analysis.js +50 -0
- package/dist-pkg/compiler/parity.d.ts +35 -0
- package/dist-pkg/compiler/parity.js +89 -0
- package/dist-pkg/compiler/readiness.d.ts +11 -0
- package/dist-pkg/compiler/readiness.js +18 -0
- package/dist-pkg/compiler/route-facts.d.ts +34 -0
- package/dist-pkg/compiler/route-facts.js +75 -0
- package/dist-pkg/content/index.d.ts +27 -0
- package/dist-pkg/content/index.js +287 -0
- package/dist-pkg/db/index.d.ts +3 -0
- package/dist-pkg/db/index.js +6 -0
- package/dist-pkg/db/migrate.d.ts +7 -0
- package/dist-pkg/db/migrate.js +53 -0
- package/dist-pkg/db/postgres.d.ts +29 -0
- package/dist-pkg/db/postgres.js +59 -0
- package/dist-pkg/db/sqlite.d.ts +10 -0
- package/dist-pkg/db/sqlite.js +22 -0
- package/dist-pkg/deploy/cloudflare.d.ts +8 -0
- package/{src/deploy/cloudflare.ts → dist-pkg/deploy/cloudflare.js} +24 -26
- package/dist-pkg/deploy/conformance.d.ts +21 -0
- package/dist-pkg/deploy/conformance.js +98 -0
- package/dist-pkg/deploy/dockerfile.d.ts +3 -0
- package/{src/deploy/dockerfile.ts → dist-pkg/deploy/dockerfile.js} +8 -10
- package/dist-pkg/deploy/fly.d.ts +3 -0
- package/{src/deploy/fly.ts → dist-pkg/deploy/fly.js} +11 -12
- package/dist-pkg/deploy/index.d.ts +6 -0
- package/dist-pkg/deploy/index.js +26 -0
- package/dist-pkg/deploy/netlify.d.ts +2 -0
- package/{src/deploy/netlify.ts → dist-pkg/deploy/netlify.js} +17 -11
- package/dist-pkg/deploy/runtime.d.ts +2 -0
- package/dist-pkg/deploy/runtime.js +3 -0
- package/dist-pkg/deploy/vercel.d.ts +22 -0
- package/dist-pkg/deploy/vercel.js +53 -0
- package/dist-pkg/dev/error-overlay.d.ts +1 -0
- package/{src/dev/error-overlay.ts → dist-pkg/dev/error-overlay.js} +13 -23
- package/dist-pkg/dev/hmr.d.ts +30 -0
- package/dist-pkg/dev/hmr.js +86 -0
- package/dist-pkg/dev/partial-handler.d.ts +9 -0
- package/dist-pkg/dev/partial-handler.js +24 -0
- package/dist-pkg/dev/request-handler.d.ts +30 -0
- package/dist-pkg/dev/request-handler.js +67 -0
- package/dist-pkg/dev/watcher.d.ts +6 -0
- package/dist-pkg/dev/watcher.js +34 -0
- package/dist-pkg/dev.d.ts +11 -0
- package/dist-pkg/dev.js +268 -0
- package/dist-pkg/env/index.d.ts +3 -0
- package/dist-pkg/env/index.js +57 -0
- package/dist-pkg/errors/catalog.d.ts +9 -0
- package/{src/errors/catalog.ts → dist-pkg/errors/catalog.js} +8 -24
- package/dist-pkg/errors/formatter.d.ts +22 -0
- package/dist-pkg/errors/formatter.js +43 -0
- package/dist-pkg/errors/index.d.ts +2 -0
- package/dist-pkg/errors/index.js +2 -0
- package/dist-pkg/forms/action.d.ts +15 -0
- package/dist-pkg/forms/action.js +20 -0
- package/dist-pkg/forms/index.d.ts +4 -0
- package/dist-pkg/forms/index.js +12 -0
- package/dist-pkg/i18n/index.d.ts +61 -0
- package/dist-pkg/i18n/index.js +147 -0
- package/dist-pkg/index-client.d.ts +1 -0
- package/dist-pkg/index-client.js +1 -0
- package/dist-pkg/index.d.ts +32 -0
- package/dist-pkg/index.js +79 -0
- package/dist-pkg/jsx-runtime-client.d.ts +8 -0
- package/dist-pkg/jsx-runtime-client.js +1 -0
- package/dist-pkg/jsx-runtime.d.ts +13 -0
- package/dist-pkg/jsx-runtime.js +5 -0
- package/dist-pkg/jsx-types-html.d.ts +221 -0
- package/dist-pkg/jsx-types-html.js +0 -0
- package/dist-pkg/log/index.d.ts +8 -0
- package/dist-pkg/log/index.js +55 -0
- package/dist-pkg/plugins/drizzle.d.ts +16 -0
- package/dist-pkg/plugins/drizzle.js +50 -0
- package/dist-pkg/plugins/index.d.ts +62 -0
- package/dist-pkg/plugins/index.js +147 -0
- package/dist-pkg/plugins/lucia.d.ts +26 -0
- package/dist-pkg/plugins/lucia.js +63 -0
- package/dist-pkg/plugins/prisma.d.ts +14 -0
- package/dist-pkg/plugins/prisma.js +57 -0
- package/dist-pkg/plugins/resend.d.ts +21 -0
- package/dist-pkg/plugins/resend.js +45 -0
- package/dist-pkg/plugins/s3.d.ts +18 -0
- package/dist-pkg/plugins/s3.js +63 -0
- package/dist-pkg/plugins/stripe.d.ts +32 -0
- package/dist-pkg/plugins/stripe.js +69 -0
- package/dist-pkg/plugins/tailwind.d.ts +15 -0
- package/dist-pkg/plugins/tailwind.js +58 -0
- package/dist-pkg/prod.d.ts +21 -0
- package/dist-pkg/prod.js +347 -0
- package/dist-pkg/reactive/computed.d.ts +3 -0
- package/dist-pkg/reactive/computed.js +15 -0
- package/dist-pkg/reactive/data.d.ts +25 -0
- package/dist-pkg/reactive/data.js +56 -0
- package/dist-pkg/reactive/diagnostics.d.ts +100 -0
- package/dist-pkg/reactive/diagnostics.js +363 -0
- package/dist-pkg/reactive/effect.d.ts +3 -0
- package/dist-pkg/reactive/effect.js +6 -0
- package/dist-pkg/reactive/index.d.ts +9 -0
- package/dist-pkg/reactive/index.js +18 -0
- package/dist-pkg/reactive/live.d.ts +15 -0
- package/dist-pkg/reactive/live.js +58 -0
- package/dist-pkg/reactive/optimistic.d.ts +20 -0
- package/dist-pkg/reactive/optimistic.js +54 -0
- package/dist-pkg/reactive/resource.d.ts +25 -0
- package/dist-pkg/reactive/resource.js +97 -0
- package/dist-pkg/reactive/signal.d.ts +4 -0
- package/dist-pkg/reactive/signal.js +17 -0
- package/dist-pkg/reactive/store.d.ts +6 -0
- package/dist-pkg/reactive/store.js +19 -0
- package/dist-pkg/router/index.d.ts +2 -0
- package/dist-pkg/router/index.js +2 -0
- package/dist-pkg/router/matcher.d.ts +7 -0
- package/dist-pkg/router/matcher.js +40 -0
- package/dist-pkg/router/scanner.d.ts +14 -0
- package/dist-pkg/router/scanner.js +141 -0
- package/dist-pkg/routes/index.d.ts +1 -0
- package/dist-pkg/routes/index.js +10 -0
- package/dist-pkg/runtime/app-config.d.ts +26 -0
- package/dist-pkg/runtime/app-config.js +69 -0
- package/dist-pkg/runtime/client.d.ts +3 -0
- package/dist-pkg/runtime/client.js +31 -0
- package/dist-pkg/runtime/devtools.d.ts +64 -0
- package/dist-pkg/runtime/devtools.js +132 -0
- package/dist-pkg/runtime/error-boundary.d.ts +6 -0
- package/dist-pkg/runtime/error-boundary.js +17 -0
- package/dist-pkg/runtime/event-replay.d.ts +3 -0
- package/{src/runtime/event-replay.ts → dist-pkg/runtime/event-replay.js} +7 -22
- package/dist-pkg/runtime/event-source.d.ts +7 -0
- package/dist-pkg/runtime/event-source.js +24 -0
- package/dist-pkg/runtime/form.d.ts +24 -0
- package/dist-pkg/runtime/form.js +59 -0
- package/dist-pkg/runtime/head.d.ts +7 -0
- package/dist-pkg/runtime/head.js +90 -0
- package/dist-pkg/runtime/html-escape.d.ts +7 -0
- package/dist-pkg/runtime/html-escape.js +39 -0
- package/dist-pkg/runtime/hydration.d.ts +15 -0
- package/dist-pkg/runtime/hydration.js +103 -0
- package/dist-pkg/runtime/image.d.ts +49 -0
- package/dist-pkg/runtime/image.js +144 -0
- package/dist-pkg/runtime/index.d.ts +17 -0
- package/dist-pkg/runtime/index.js +59 -0
- package/dist-pkg/runtime/island-hydrator.d.ts +12 -0
- package/dist-pkg/runtime/island-hydrator.js +49 -0
- package/dist-pkg/runtime/island.d.ts +19 -0
- package/dist-pkg/runtime/island.js +36 -0
- package/dist-pkg/runtime/jsx-runtime.d.ts +12 -0
- package/dist-pkg/runtime/jsx-runtime.js +173 -0
- package/dist-pkg/runtime/link.d.ts +16 -0
- package/dist-pkg/runtime/link.js +47 -0
- package/dist-pkg/runtime/project.d.ts +37 -0
- package/dist-pkg/runtime/project.js +36 -0
- package/dist-pkg/runtime/renderable.d.ts +6 -0
- package/dist-pkg/runtime/renderable.js +0 -0
- package/dist-pkg/runtime/router.d.ts +47 -0
- package/dist-pkg/runtime/router.js +476 -0
- package/dist-pkg/runtime/server.d.ts +8 -0
- package/dist-pkg/runtime/server.js +71 -0
- package/dist-pkg/runtime/stream.d.ts +29 -0
- package/dist-pkg/runtime/stream.js +106 -0
- package/dist-pkg/runtime/suspense.d.ts +6 -0
- package/dist-pkg/runtime/suspense.js +16 -0
- package/dist-pkg/runtime/typed-routes.d.ts +24 -0
- package/dist-pkg/runtime/typed-routes.js +77 -0
- package/dist-pkg/runtime/validated-form.d.ts +40 -0
- package/dist-pkg/runtime/validated-form.js +120 -0
- package/dist-pkg/security/cors.d.ts +10 -0
- package/dist-pkg/security/cors.js +56 -0
- package/dist-pkg/security/csrf.d.ts +9 -0
- package/dist-pkg/security/csrf.js +53 -0
- package/dist-pkg/security/headers.d.ts +11 -0
- package/dist-pkg/security/headers.js +31 -0
- package/dist-pkg/security/index.d.ts +5 -0
- package/dist-pkg/security/index.js +5 -0
- package/dist-pkg/security/rate-limit.d.ts +10 -0
- package/dist-pkg/security/rate-limit.js +49 -0
- package/dist-pkg/security/redis-rate-limit.d.ts +14 -0
- package/dist-pkg/security/redis-rate-limit.js +23 -0
- package/dist-pkg/server/action.d.ts +21 -0
- package/dist-pkg/server/action.js +64 -0
- package/dist-pkg/server/cache-utils.d.ts +2 -0
- package/dist-pkg/server/cache-utils.js +26 -0
- package/dist-pkg/server/cache.d.ts +33 -0
- package/dist-pkg/server/cache.js +236 -0
- package/dist-pkg/server/compress.d.ts +2 -0
- package/dist-pkg/server/compress.js +49 -0
- package/dist-pkg/server/endpoint-execution.d.ts +28 -0
- package/dist-pkg/server/endpoint-execution.js +37 -0
- package/dist-pkg/server/etag.d.ts +3 -0
- package/dist-pkg/server/etag.js +18 -0
- package/dist-pkg/server/guard.d.ts +16 -0
- package/dist-pkg/server/guard.js +45 -0
- package/dist-pkg/server/html-shell.d.ts +12 -0
- package/dist-pkg/server/html-shell.js +52 -0
- package/dist-pkg/server/index.d.ts +36 -0
- package/dist-pkg/server/index.js +170 -0
- package/dist-pkg/server/jobs.d.ts +41 -0
- package/dist-pkg/server/jobs.js +81 -0
- package/dist-pkg/server/manifest.d.ts +19 -0
- package/dist-pkg/server/manifest.js +36 -0
- package/dist-pkg/server/middleware.d.ts +39 -0
- package/dist-pkg/server/middleware.js +122 -0
- package/dist-pkg/server/mime.d.ts +1 -0
- package/{src/server/mime.ts → dist-pkg/server/mime.js} +6 -17
- package/dist-pkg/server/not-found.d.ts +6 -0
- package/dist-pkg/server/not-found.js +24 -0
- package/dist-pkg/server/page-render.d.ts +29 -0
- package/dist-pkg/server/page-render.js +67 -0
- package/dist-pkg/server/partial-navigation.d.ts +4 -0
- package/dist-pkg/server/partial-navigation.js +16 -0
- package/dist-pkg/server/pipe.d.ts +9 -0
- package/dist-pkg/server/pipe.js +32 -0
- package/dist-pkg/server/redis-cache-store.d.ts +10 -0
- package/dist-pkg/server/redis-cache-store.js +73 -0
- package/dist-pkg/server/redis-client.d.ts +37 -0
- package/dist-pkg/server/redis-client.js +37 -0
- package/dist-pkg/server/request-policy.d.ts +55 -0
- package/dist-pkg/server/request-policy.js +216 -0
- package/dist-pkg/server/request-preflight.d.ts +23 -0
- package/dist-pkg/server/request-preflight.js +45 -0
- package/dist-pkg/server/request-security-policy.d.ts +17 -0
- package/dist-pkg/server/request-security-policy.js +34 -0
- package/dist-pkg/server/request-surface.d.ts +8 -0
- package/dist-pkg/server/request-surface.js +19 -0
- package/dist-pkg/server/route-request.d.ts +31 -0
- package/dist-pkg/server/route-request.js +112 -0
- package/dist-pkg/server/route-response.d.ts +22 -0
- package/dist-pkg/server/route-response.js +58 -0
- package/dist-pkg/server/rpc-hash.d.ts +2 -0
- package/dist-pkg/server/rpc-hash.js +7 -0
- package/dist-pkg/server/rpc-protocol.d.ts +22 -0
- package/dist-pkg/server/rpc-protocol.js +28 -0
- package/dist-pkg/server/rpc-utils.d.ts +2 -0
- package/dist-pkg/server/rpc-utils.js +26 -0
- package/dist-pkg/server/rpc.d.ts +20 -0
- package/dist-pkg/server/rpc.js +147 -0
- package/dist-pkg/server/runtime-dispatch.d.ts +19 -0
- package/dist-pkg/server/runtime-dispatch.js +67 -0
- package/dist-pkg/server/server-execution.d.ts +22 -0
- package/dist-pkg/server/server-execution.js +53 -0
- package/dist-pkg/server/sqlite-cache-store.d.ts +13 -0
- package/dist-pkg/server/sqlite-cache-store.js +88 -0
- package/dist-pkg/server/sse.d.ts +9 -0
- package/dist-pkg/server/sse.js +34 -0
- package/dist-pkg/server/static-file.d.ts +9 -0
- package/dist-pkg/server/static-file.js +43 -0
- package/dist-pkg/server/ws.d.ts +18 -0
- package/dist-pkg/server/ws.js +40 -0
- package/dist-pkg/server-entry.d.ts +19 -0
- package/dist-pkg/server-entry.js +93 -0
- package/dist-pkg/testing/index.d.ts +98 -0
- package/dist-pkg/testing/index.js +254 -0
- package/dist-pkg/types/index.d.ts +4 -0
- package/dist-pkg/types/index.js +4 -0
- package/dist-pkg/types/safe-html.d.ts +7 -0
- package/dist-pkg/types/safe-html.js +19 -0
- package/dist-pkg/types/safe-sql.d.ts +8 -0
- package/dist-pkg/types/safe-sql.js +14 -0
- package/dist-pkg/types/safe-url.d.ts +7 -0
- package/dist-pkg/types/safe-url.js +20 -0
- package/dist-pkg/types/user-input.d.ts +9 -0
- package/dist-pkg/types/user-input.js +3 -0
- package/dist-pkg/unsafe/index.d.ts +12 -0
- package/dist-pkg/unsafe/index.js +6 -0
- package/package.json +101 -45
- package/bin/gorsee.js +0 -2
- package/src/auth/index.ts +0 -178
- package/src/auth/redis-session-store.ts +0 -46
- package/src/auth/sqlite-session-store.ts +0 -98
- package/src/auth/store-utils.ts +0 -21
- package/src/build/client.ts +0 -139
- package/src/build/css-modules.ts +0 -69
- package/src/build/devalue-parse.ts +0 -2
- package/src/build/manifest.ts +0 -34
- package/src/build/route-metadata.ts +0 -12
- package/src/build/rpc-transform.ts +0 -62
- package/src/build/server-strip.ts +0 -87
- package/src/build/ssg.ts +0 -70
- package/src/cli/bun-plugin.ts +0 -58
- package/src/cli/cmd-build.ts +0 -153
- package/src/cli/cmd-check.ts +0 -239
- package/src/cli/cmd-create.ts +0 -328
- package/src/cli/cmd-deploy.ts +0 -149
- package/src/cli/cmd-dev.ts +0 -13
- package/src/cli/cmd-docs.ts +0 -152
- package/src/cli/cmd-generate.ts +0 -155
- package/src/cli/cmd-migrate.ts +0 -53
- package/src/cli/cmd-routes.ts +0 -36
- package/src/cli/cmd-start.ts +0 -30
- package/src/cli/cmd-test.ts +0 -129
- package/src/cli/cmd-typegen.ts +0 -93
- package/src/cli/cmd-upgrade.ts +0 -143
- package/src/cli/context.ts +0 -12
- package/src/cli/framework-md.ts +0 -223
- package/src/cli/index.ts +0 -107
- package/src/client.ts +0 -26
- package/src/db/index.ts +0 -2
- package/src/db/migrate.ts +0 -89
- package/src/db/sqlite.ts +0 -40
- package/src/deploy/index.ts +0 -31
- package/src/deploy/vercel.ts +0 -94
- package/src/dev/hmr.ts +0 -31
- package/src/dev/partial-handler.ts +0 -52
- package/src/dev/request-handler.ts +0 -127
- package/src/dev/watcher.ts +0 -48
- package/src/dev.ts +0 -208
- package/src/env/index.ts +0 -74
- package/src/errors/formatter.ts +0 -63
- package/src/errors/index.ts +0 -2
- package/src/i18n/index.ts +0 -72
- package/src/index-client.ts +0 -4
- package/src/index.ts +0 -43
- package/src/jsx-runtime-client.ts +0 -13
- package/src/jsx-runtime.ts +0 -20
- package/src/jsx-types-html.ts +0 -242
- package/src/log/index.ts +0 -44
- package/src/plugins/drizzle.ts +0 -84
- package/src/plugins/index.ts +0 -86
- package/src/plugins/lucia.ts +0 -111
- package/src/plugins/prisma.ts +0 -85
- package/src/plugins/resend.ts +0 -78
- package/src/plugins/s3.ts +0 -102
- package/src/plugins/stripe.ts +0 -133
- package/src/plugins/tailwind.ts +0 -92
- package/src/prod.ts +0 -252
- package/src/reactive/computed.ts +0 -7
- package/src/reactive/effect.ts +0 -7
- package/src/reactive/index.ts +0 -7
- package/src/reactive/live.ts +0 -97
- package/src/reactive/optimistic.ts +0 -83
- package/src/reactive/resource.ts +0 -138
- package/src/reactive/signal.ts +0 -20
- package/src/reactive/store.ts +0 -36
- package/src/router/index.ts +0 -2
- package/src/router/matcher.ts +0 -53
- package/src/router/scanner.ts +0 -206
- package/src/runtime/client.ts +0 -28
- package/src/runtime/error-boundary.ts +0 -35
- package/src/runtime/form.ts +0 -49
- package/src/runtime/head.ts +0 -113
- package/src/runtime/html-escape.ts +0 -30
- package/src/runtime/hydration.ts +0 -95
- package/src/runtime/image.ts +0 -48
- package/src/runtime/index.ts +0 -12
- package/src/runtime/island-hydrator.ts +0 -84
- package/src/runtime/island.ts +0 -88
- package/src/runtime/jsx-runtime.ts +0 -167
- package/src/runtime/link.ts +0 -45
- package/src/runtime/project.ts +0 -73
- package/src/runtime/router.ts +0 -224
- package/src/runtime/server.ts +0 -102
- package/src/runtime/stream.ts +0 -182
- package/src/runtime/suspense.ts +0 -37
- package/src/runtime/typed-routes.ts +0 -26
- package/src/runtime/validated-form.ts +0 -106
- package/src/security/cors.ts +0 -80
- package/src/security/csrf.ts +0 -85
- package/src/security/headers.ts +0 -50
- package/src/security/index.ts +0 -4
- package/src/security/rate-limit.ts +0 -80
- package/src/server/action.ts +0 -48
- package/src/server/cache-utils.ts +0 -23
- package/src/server/cache.ts +0 -125
- package/src/server/compress.ts +0 -60
- package/src/server/etag.ts +0 -23
- package/src/server/guard.ts +0 -69
- package/src/server/html-shell.ts +0 -69
- package/src/server/index.ts +0 -57
- package/src/server/manifest.ts +0 -36
- package/src/server/middleware.ts +0 -159
- package/src/server/not-found.ts +0 -35
- package/src/server/page-render.ts +0 -123
- package/src/server/pipe.ts +0 -46
- package/src/server/redis-cache-store.ts +0 -87
- package/src/server/redis-client.ts +0 -71
- package/src/server/request-preflight.ts +0 -45
- package/src/server/route-request.ts +0 -72
- package/src/server/rpc-hash.ts +0 -17
- package/src/server/rpc-utils.ts +0 -27
- package/src/server/rpc.ts +0 -177
- package/src/server/sqlite-cache-store.ts +0 -109
- package/src/server/sse.ts +0 -96
- package/src/server/static-file.ts +0 -63
- package/src/server/ws.ts +0 -56
- package/src/server-entry.ts +0 -36
- package/src/testing/index.ts +0 -74
- package/src/types/index.ts +0 -4
- package/src/types/safe-html.ts +0 -32
- package/src/types/safe-sql.ts +0 -28
- package/src/types/safe-url.ts +0 -40
- package/src/types/user-input.ts +0 -12
- package/src/unsafe/index.ts +0 -18
|
@@ -0,0 +1,476 @@
|
|
|
1
|
+
import { hydrate } from "./client.js";
|
|
2
|
+
let currentPath = "";
|
|
3
|
+
const subscribers = [], beforeNavigateHooks = [];
|
|
4
|
+
let navigating = !1, loadingElement = null, activeNavigationController = null, latestNavigationToken = 0, pendingPopScrollY = null, activeNavigationUrl = null, activeNavigationPushState = !0, lastFocusedPreserveKey = null, currentRouteScript = null;
|
|
5
|
+
export function createHTMLFragment(html) {
|
|
6
|
+
const template = document.createElement("template");
|
|
7
|
+
template.innerHTML = html;
|
|
8
|
+
return template.content;
|
|
9
|
+
}
|
|
10
|
+
export function replaceHTMLFragment(container, html) {
|
|
11
|
+
const fragment = createHTMLFragment(html);
|
|
12
|
+
container.replaceChildren(...Array.from(fragment.childNodes));
|
|
13
|
+
}
|
|
14
|
+
function getPreserveKey(element) {
|
|
15
|
+
if (!element)
|
|
16
|
+
return null;
|
|
17
|
+
const preserveKey = element.getAttribute("data-g-preserve-key");
|
|
18
|
+
if (preserveKey)
|
|
19
|
+
return preserveKey;
|
|
20
|
+
if ("name" in element && typeof element.name === "string" && element.name)
|
|
21
|
+
return element.name;
|
|
22
|
+
if ("id" in element && typeof element.id === "string" && element.id)
|
|
23
|
+
return element.id;
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
function isCheckableInput(element) {
|
|
27
|
+
return "type" in element && element.type === "checkbox";
|
|
28
|
+
}
|
|
29
|
+
function isFormControlElement(element) {
|
|
30
|
+
if (!element)
|
|
31
|
+
return !1;
|
|
32
|
+
const tagName = element.tagName?.toLowerCase();
|
|
33
|
+
return tagName === "input" || tagName === "textarea" || tagName === "select";
|
|
34
|
+
}
|
|
35
|
+
function getFocusablePreserveKey(element) {
|
|
36
|
+
if (!element)
|
|
37
|
+
return null;
|
|
38
|
+
if (element.getAttribute("data-g-preserve-key"))
|
|
39
|
+
return getPreserveKey(element);
|
|
40
|
+
if (isFormControlElement(element))
|
|
41
|
+
return getPreserveKey(element);
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
function getControlSelector(key) {
|
|
45
|
+
return `[data-g-preserve-key="${key}"], [name="${key}"], #${key}`;
|
|
46
|
+
}
|
|
47
|
+
function focusPreservedTarget(target) {
|
|
48
|
+
const focusable = target, runFocus = () => {
|
|
49
|
+
if (focusable.isConnected === !1)
|
|
50
|
+
return !1;
|
|
51
|
+
if (typeof focusable.focus === "function")
|
|
52
|
+
focusable.focus?.();
|
|
53
|
+
else if (typeof HTMLElement < "u" && target instanceof HTMLElement)
|
|
54
|
+
HTMLElement.prototype.focus.call(target);
|
|
55
|
+
if (typeof document > "u" || !("activeElement" in document))
|
|
56
|
+
return !1;
|
|
57
|
+
return document.activeElement === target;
|
|
58
|
+
};
|
|
59
|
+
if (runFocus())
|
|
60
|
+
return;
|
|
61
|
+
const retryDelays = [0, 16, 48, 96, 160];
|
|
62
|
+
for (const delayMs of retryDelays)
|
|
63
|
+
setTimeout(() => {
|
|
64
|
+
if (typeof document < "u" && "activeElement" in document && document.activeElement === target)
|
|
65
|
+
return;
|
|
66
|
+
runFocus();
|
|
67
|
+
}, delayMs);
|
|
68
|
+
if (typeof requestAnimationFrame === "function")
|
|
69
|
+
requestAnimationFrame(() => {
|
|
70
|
+
if (typeof document < "u" && "activeElement" in document && document.activeElement === target)
|
|
71
|
+
return;
|
|
72
|
+
runFocus();
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
function schedulePostNavigationFocusRestore(container, snapshot) {
|
|
76
|
+
const focusKey = snapshot.focusKey ?? snapshot.controls[0]?.key;
|
|
77
|
+
if (!focusKey)
|
|
78
|
+
return;
|
|
79
|
+
const selector = getControlSelector(focusKey), commit = () => {
|
|
80
|
+
const target = container.querySelector(selector);
|
|
81
|
+
if (!target)
|
|
82
|
+
return;
|
|
83
|
+
focusPreservedTarget(target);
|
|
84
|
+
lastFocusedPreserveKey = focusKey;
|
|
85
|
+
};
|
|
86
|
+
commit();
|
|
87
|
+
if (typeof requestAnimationFrame === "function")
|
|
88
|
+
requestAnimationFrame(() => commit());
|
|
89
|
+
setTimeout(() => commit(), 32);
|
|
90
|
+
}
|
|
91
|
+
export function captureNavigationSnapshot(container) {
|
|
92
|
+
const controls = [], activeFocusKey = typeof container.contains === "function" && container.contains(document.activeElement) ? getFocusablePreserveKey(document.activeElement) ?? void 0 : void 0, formControls = typeof container.querySelectorAll === "function" ? container.querySelectorAll("input, textarea, select") : [];
|
|
93
|
+
for (const control of formControls) {
|
|
94
|
+
const key = getPreserveKey(control);
|
|
95
|
+
if (!key)
|
|
96
|
+
continue;
|
|
97
|
+
if (isCheckableInput(control)) {
|
|
98
|
+
controls.push({ key, mode: "checked", value: control.checked });
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
if ("value" in control && typeof control.value === "string")
|
|
102
|
+
controls.push({ key, mode: "value", value: control.value });
|
|
103
|
+
}
|
|
104
|
+
return { focusKey: activeFocusKey ?? lastFocusedPreserveKey ?? controls[0]?.key, controls };
|
|
105
|
+
}
|
|
106
|
+
export function restoreNavigationSnapshot(container, snapshot) {
|
|
107
|
+
for (const controlState of snapshot.controls) {
|
|
108
|
+
const control = container.querySelector(getControlSelector(controlState.key));
|
|
109
|
+
if (!control)
|
|
110
|
+
continue;
|
|
111
|
+
if (controlState.mode === "checked" && "checked" in control) {
|
|
112
|
+
control.checked = controlState.value === !0;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (controlState.mode === "value" && "value" in control && typeof controlState.value === "string")
|
|
116
|
+
control.value = controlState.value;
|
|
117
|
+
}
|
|
118
|
+
const focusKey = snapshot.focusKey ?? snapshot.controls[0]?.key;
|
|
119
|
+
if (focusKey) {
|
|
120
|
+
const focusTarget = container.querySelector(getControlSelector(focusKey));
|
|
121
|
+
if (focusTarget) {
|
|
122
|
+
focusPreservedTarget(focusTarget);
|
|
123
|
+
lastFocusedPreserveKey = focusKey;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function readCurrentScrollY() {
|
|
128
|
+
if (typeof window > "u")
|
|
129
|
+
return 0;
|
|
130
|
+
if (typeof window.scrollY === "number")
|
|
131
|
+
return window.scrollY;
|
|
132
|
+
const windowWithPageOffset = window;
|
|
133
|
+
if (typeof windowWithPageOffset.pageYOffset === "number")
|
|
134
|
+
return windowWithPageOffset.pageYOffset;
|
|
135
|
+
return 0;
|
|
136
|
+
}
|
|
137
|
+
function rememberCurrentHistoryScroll(url) {
|
|
138
|
+
if (typeof history > "u" || typeof history.replaceState !== "function")
|
|
139
|
+
return;
|
|
140
|
+
const currentState = typeof history.state === "object" && history.state !== null ? history.state : {};
|
|
141
|
+
history.replaceState({
|
|
142
|
+
...currentState,
|
|
143
|
+
gorsee: !0,
|
|
144
|
+
gorseeScrollY: readCurrentScrollY()
|
|
145
|
+
}, "", url);
|
|
146
|
+
}
|
|
147
|
+
function applyNavigationScroll(pushState) {
|
|
148
|
+
if (pushState) {
|
|
149
|
+
window.scrollTo(0, 0);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
if (pendingPopScrollY !== null) {
|
|
153
|
+
window.scrollTo(0, pendingPopScrollY);
|
|
154
|
+
pendingPopScrollY = null;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
export function setLoadingElement(el) {
|
|
158
|
+
loadingElement = el;
|
|
159
|
+
}
|
|
160
|
+
function showLoading() {
|
|
161
|
+
if (loadingElement) {
|
|
162
|
+
loadingElement.style.display = "";
|
|
163
|
+
loadingElement.removeAttribute("hidden");
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function hideLoading() {
|
|
167
|
+
if (loadingElement)
|
|
168
|
+
loadingElement.style.display = "none";
|
|
169
|
+
}
|
|
170
|
+
export function onNavigate(fn) {
|
|
171
|
+
subscribers.push(fn);
|
|
172
|
+
return () => {
|
|
173
|
+
const i = subscribers.indexOf(fn);
|
|
174
|
+
if (i >= 0)
|
|
175
|
+
subscribers.splice(i, 1);
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
export function beforeNavigate(fn) {
|
|
179
|
+
beforeNavigateHooks.push(fn);
|
|
180
|
+
return () => {
|
|
181
|
+
const i = beforeNavigateHooks.indexOf(fn);
|
|
182
|
+
if (i >= 0)
|
|
183
|
+
beforeNavigateHooks.splice(i, 1);
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
export function getCurrentPath() {
|
|
187
|
+
return currentPath;
|
|
188
|
+
}
|
|
189
|
+
export function getRouterNavigationDiagnostics() {
|
|
190
|
+
return {
|
|
191
|
+
currentPath,
|
|
192
|
+
navigating,
|
|
193
|
+
pendingPopScrollY,
|
|
194
|
+
latestNavigationToken,
|
|
195
|
+
activeNavigation: activeNavigationController && activeNavigationUrl ? { url: activeNavigationUrl, pushState: activeNavigationPushState } : null
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
async function fetchPage(url, signal) {
|
|
199
|
+
const res = await fetch(url, {
|
|
200
|
+
headers: {
|
|
201
|
+
Accept: "application/json",
|
|
202
|
+
"X-Gorsee-Navigate": "partial"
|
|
203
|
+
},
|
|
204
|
+
signal
|
|
205
|
+
});
|
|
206
|
+
if (!res.ok)
|
|
207
|
+
throw Error(`Navigation failed: ${res.status}`);
|
|
208
|
+
return res.json();
|
|
209
|
+
}
|
|
210
|
+
function updateHead(result) {
|
|
211
|
+
if (result.title)
|
|
212
|
+
document.title = result.title;
|
|
213
|
+
document.querySelectorAll("link[data-g-route-css]").forEach((el) => el.remove());
|
|
214
|
+
if (result.css)
|
|
215
|
+
for (const href of result.css) {
|
|
216
|
+
const link = document.createElement("link");
|
|
217
|
+
link.rel = "stylesheet";
|
|
218
|
+
link.href = href;
|
|
219
|
+
link.dataset.gRouteCss = "";
|
|
220
|
+
document.head.appendChild(link);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
function updateDataScript(result) {
|
|
224
|
+
let dataEl = document.getElementById("__GORSEE_DATA__");
|
|
225
|
+
if (result.data !== void 0) {
|
|
226
|
+
if (!dataEl) {
|
|
227
|
+
const script = document.createElement("script");
|
|
228
|
+
script.id = "__GORSEE_DATA__";
|
|
229
|
+
script.type = "application/json";
|
|
230
|
+
document.body.appendChild(script);
|
|
231
|
+
dataEl = script;
|
|
232
|
+
}
|
|
233
|
+
dataEl.textContent = JSON.stringify(result.data);
|
|
234
|
+
} else if (dataEl)
|
|
235
|
+
dataEl.remove();
|
|
236
|
+
if (result.params)
|
|
237
|
+
globalThis.__GORSEE_PARAMS__ = result.params;
|
|
238
|
+
}
|
|
239
|
+
function normalizeRouteScript(script) {
|
|
240
|
+
if (!script)
|
|
241
|
+
return null;
|
|
242
|
+
try {
|
|
243
|
+
return new URL(script, location.origin).pathname;
|
|
244
|
+
} catch {
|
|
245
|
+
return script;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
export function setCurrentRouteScript(script) {
|
|
249
|
+
currentRouteScript = normalizeRouteScript(script);
|
|
250
|
+
globalThis.__GORSEE_ROUTE_SCRIPT__ = currentRouteScript;
|
|
251
|
+
}
|
|
252
|
+
async function navigateInternal(url, pushState, force = !1) {
|
|
253
|
+
if (!force && url === currentPath)
|
|
254
|
+
return;
|
|
255
|
+
for (const hook of beforeNavigateHooks)
|
|
256
|
+
try {
|
|
257
|
+
if (hook(url) === !1)
|
|
258
|
+
return;
|
|
259
|
+
} catch {
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
const container = document.getElementById("app"), snapshot = container ? captureNavigationSnapshot(container) : { controls: [] };
|
|
263
|
+
if (pushState)
|
|
264
|
+
rememberCurrentHistoryScroll(currentPath || location.pathname + location.search);
|
|
265
|
+
activeNavigationController?.abort();
|
|
266
|
+
const controller = new AbortController;
|
|
267
|
+
activeNavigationController = controller;
|
|
268
|
+
activeNavigationUrl = url;
|
|
269
|
+
activeNavigationPushState = pushState;
|
|
270
|
+
const navigationToken = ++latestNavigationToken;
|
|
271
|
+
navigating = !0;
|
|
272
|
+
showLoading();
|
|
273
|
+
try {
|
|
274
|
+
const result = await fetchPage(url, controller.signal);
|
|
275
|
+
if (controller.signal.aborted || navigationToken !== latestNavigationToken)
|
|
276
|
+
return;
|
|
277
|
+
if (!container)
|
|
278
|
+
return;
|
|
279
|
+
replaceHTMLFragment(container, result.html);
|
|
280
|
+
updateHead(result);
|
|
281
|
+
updateDataScript(result);
|
|
282
|
+
if (result.script)
|
|
283
|
+
setCurrentRouteScript(result.script);
|
|
284
|
+
restoreNavigationSnapshot(container, snapshot);
|
|
285
|
+
if (pushState)
|
|
286
|
+
history.pushState({ gorsee: !0 }, "", url);
|
|
287
|
+
currentPath = url;
|
|
288
|
+
if (result.script) {
|
|
289
|
+
globalThis.__GORSEE_SUPPRESS_ENTRY_BOOTSTRAP__ = !0;
|
|
290
|
+
let mod;
|
|
291
|
+
try {
|
|
292
|
+
mod = await import(result.script);
|
|
293
|
+
} finally {
|
|
294
|
+
globalThis.__GORSEE_SUPPRESS_ENTRY_BOOTSTRAP__ = !1;
|
|
295
|
+
}
|
|
296
|
+
if (controller.signal.aborted || navigationToken !== latestNavigationToken)
|
|
297
|
+
return;
|
|
298
|
+
const renderRoute = mod.default;
|
|
299
|
+
if (renderRoute && typeof renderRoute === "function") {
|
|
300
|
+
const data = result.data ?? {}, params = result.params ?? {};
|
|
301
|
+
hydrate(() => renderRoute({ data, params }), container);
|
|
302
|
+
restoreNavigationSnapshot(container, snapshot);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
applyNavigationScroll(pushState);
|
|
306
|
+
for (const fn of subscribers)
|
|
307
|
+
fn(url);
|
|
308
|
+
observeViewportPrefetchAnchors(container);
|
|
309
|
+
schedulePostNavigationFocusRestore(container, snapshot);
|
|
310
|
+
} catch (error) {
|
|
311
|
+
if (controller.signal.aborted)
|
|
312
|
+
return;
|
|
313
|
+
throw error;
|
|
314
|
+
} finally {
|
|
315
|
+
if (activeNavigationController === controller) {
|
|
316
|
+
activeNavigationController = null;
|
|
317
|
+
activeNavigationUrl = null;
|
|
318
|
+
activeNavigationPushState = !0;
|
|
319
|
+
hideLoading();
|
|
320
|
+
navigating = !1;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
export async function navigate(url, pushState = !0) {
|
|
325
|
+
await navigateInternal(url, pushState, !1);
|
|
326
|
+
}
|
|
327
|
+
export async function refreshCurrentRoute() {
|
|
328
|
+
const target = currentPath || readLocationPath();
|
|
329
|
+
if (!target)
|
|
330
|
+
return;
|
|
331
|
+
await navigateInternal(target, !1, !0);
|
|
332
|
+
}
|
|
333
|
+
function refreshStylesheets(timestamp) {
|
|
334
|
+
const links = document.querySelectorAll?.('link[rel="stylesheet"]') ?? [];
|
|
335
|
+
for (const link of links) {
|
|
336
|
+
if (!("href" in link) || typeof link.href !== "string")
|
|
337
|
+
continue;
|
|
338
|
+
try {
|
|
339
|
+
const nextURL = new URL(link.href, location.origin);
|
|
340
|
+
if (nextURL.origin !== location.origin)
|
|
341
|
+
continue;
|
|
342
|
+
nextURL.searchParams.set("gorsee-hmr", String(timestamp));
|
|
343
|
+
link.href = nextURL.toString();
|
|
344
|
+
} catch {}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
function currentPathMatchesRoute(routePath) {
|
|
348
|
+
return (readLocationPath().split("?")[0] ?? readLocationPath()) === routePath;
|
|
349
|
+
}
|
|
350
|
+
function hmrTouchesCurrentRoute(update) {
|
|
351
|
+
if (update.refreshCurrentRoute)
|
|
352
|
+
return !0;
|
|
353
|
+
if (update.entryScripts?.length && currentRouteScript)
|
|
354
|
+
return update.entryScripts.some((script) => normalizeRouteScript(script) === currentRouteScript);
|
|
355
|
+
if (update.routePaths?.length)
|
|
356
|
+
return update.routePaths.some((routePath) => currentPathMatchesRoute(routePath));
|
|
357
|
+
return !1;
|
|
358
|
+
}
|
|
359
|
+
export async function applyHMRUpdate(update) {
|
|
360
|
+
if (!update || typeof update.kind !== "string") {
|
|
361
|
+
location.reload();
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
if (update.kind === "full-reload") {
|
|
365
|
+
location.reload();
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
if (update.kind === "css-update")
|
|
369
|
+
refreshStylesheets(update.timestamp);
|
|
370
|
+
if (!hmrTouchesCurrentRoute(update))
|
|
371
|
+
return;
|
|
372
|
+
await refreshCurrentRoute();
|
|
373
|
+
}
|
|
374
|
+
const prefetchCache = new Set, observedViewportPrefetchAnchors = new WeakSet;
|
|
375
|
+
let viewportPrefetchObserver = null;
|
|
376
|
+
export function prefetch(url) {
|
|
377
|
+
if (prefetchCache.has(url))
|
|
378
|
+
return;
|
|
379
|
+
prefetchCache.add(url);
|
|
380
|
+
const link = document.createElement("link");
|
|
381
|
+
link.rel = "prefetch";
|
|
382
|
+
link.href = url;
|
|
383
|
+
link.setAttribute("as", "fetch");
|
|
384
|
+
link.setAttribute("crossorigin", "");
|
|
385
|
+
document.head.appendChild(link);
|
|
386
|
+
}
|
|
387
|
+
function ensureViewportPrefetchObserver() {
|
|
388
|
+
if (viewportPrefetchObserver)
|
|
389
|
+
return viewportPrefetchObserver;
|
|
390
|
+
if (typeof IntersectionObserver > "u")
|
|
391
|
+
return null;
|
|
392
|
+
viewportPrefetchObserver = new IntersectionObserver((entries) => {
|
|
393
|
+
for (const entry of entries) {
|
|
394
|
+
if (!entry.isIntersecting)
|
|
395
|
+
continue;
|
|
396
|
+
const target = entry.target;
|
|
397
|
+
prefetch(target.pathname + target.search);
|
|
398
|
+
viewportPrefetchObserver?.unobserve(target);
|
|
399
|
+
}
|
|
400
|
+
}, {
|
|
401
|
+
rootMargin: "200px"
|
|
402
|
+
});
|
|
403
|
+
return viewportPrefetchObserver;
|
|
404
|
+
}
|
|
405
|
+
function observeViewportPrefetchAnchors(root = document) {
|
|
406
|
+
const observer = ensureViewportPrefetchObserver();
|
|
407
|
+
if (!observer || typeof root.querySelectorAll !== "function")
|
|
408
|
+
return;
|
|
409
|
+
const anchors = root.querySelectorAll('a[data-g-prefetch="viewport"][href]');
|
|
410
|
+
for (const anchor of anchors) {
|
|
411
|
+
if (!anchor || typeof anchor !== "object" || observedViewportPrefetchAnchors.has(anchor))
|
|
412
|
+
continue;
|
|
413
|
+
observedViewportPrefetchAnchors.add(anchor);
|
|
414
|
+
observer.observe(anchor);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
function shouldHandleClick(e, anchor) {
|
|
418
|
+
if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey)
|
|
419
|
+
return !1;
|
|
420
|
+
if (e.button !== 0)
|
|
421
|
+
return !1;
|
|
422
|
+
if (anchor.target && anchor.target !== "_self")
|
|
423
|
+
return !1;
|
|
424
|
+
if (anchor.origin !== location.origin)
|
|
425
|
+
return !1;
|
|
426
|
+
if (anchor.hasAttribute("download"))
|
|
427
|
+
return !1;
|
|
428
|
+
if (anchor.pathname === location.pathname && anchor.hash)
|
|
429
|
+
return !1;
|
|
430
|
+
return !0;
|
|
431
|
+
}
|
|
432
|
+
function readLocationPath() {
|
|
433
|
+
return `${location.pathname}${location.search}`;
|
|
434
|
+
}
|
|
435
|
+
export function initRouter() {
|
|
436
|
+
currentPath = readLocationPath();
|
|
437
|
+
setCurrentRouteScript(globalThis.__GORSEE_ROUTE_SCRIPT__);
|
|
438
|
+
globalThis.__gorseeHandleHMR = (update) => {
|
|
439
|
+
applyHMRUpdate(update);
|
|
440
|
+
};
|
|
441
|
+
if (typeof history.replaceState === "function") {
|
|
442
|
+
const currentState = typeof history.state === "object" && history.state !== null ? history.state : {};
|
|
443
|
+
history.replaceState({
|
|
444
|
+
...currentState,
|
|
445
|
+
gorsee: !0,
|
|
446
|
+
gorseeScrollY: readCurrentScrollY()
|
|
447
|
+
}, "", readLocationPath());
|
|
448
|
+
}
|
|
449
|
+
document.addEventListener("click", (e) => {
|
|
450
|
+
const anchor = e.target.closest?.("a[href]");
|
|
451
|
+
if (!anchor)
|
|
452
|
+
return;
|
|
453
|
+
if (anchor.dataset.gNoRouter !== void 0)
|
|
454
|
+
return;
|
|
455
|
+
if (shouldHandleClick(e, anchor)) {
|
|
456
|
+
e.preventDefault();
|
|
457
|
+
navigate(anchor.pathname + anchor.search);
|
|
458
|
+
}
|
|
459
|
+
});
|
|
460
|
+
document.addEventListener("focusin", (e) => {
|
|
461
|
+
const target = e.target, container = document.getElementById("app");
|
|
462
|
+
if (!target || !container || !container.contains(target))
|
|
463
|
+
return;
|
|
464
|
+
const key = getFocusablePreserveKey(target);
|
|
465
|
+
if (key)
|
|
466
|
+
lastFocusedPreserveKey = key;
|
|
467
|
+
});
|
|
468
|
+
window.addEventListener("popstate", (e) => {
|
|
469
|
+
const nextPath = readLocationPath();
|
|
470
|
+
if (e.state?.gorsee || currentPath !== nextPath) {
|
|
471
|
+
pendingPopScrollY = typeof e.state?.gorseeScrollY === "number" ? e.state.gorseeScrollY : 0;
|
|
472
|
+
navigate(nextPath, !1);
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
observeViewportPrefetchAnchors(document);
|
|
476
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Component } from "./jsx-runtime.js";
|
|
2
|
+
export type VNode = {
|
|
3
|
+
type: string | Component | symbol;
|
|
4
|
+
props: Record<string, unknown>;
|
|
5
|
+
};
|
|
6
|
+
export declare function ssrJsx(type: string | Component | symbol, props: Record<string, unknown> | null): VNode;
|
|
7
|
+
export declare const ssrJsxs: typeof ssrJsx;
|
|
8
|
+
export declare function renderToString(root: unknown): string;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { escapeHTML, escapeAttr, isRenderableThunk, VOID_ELEMENTS, resolveValue } from "./html-escape.js";
|
|
2
|
+
function renderChild(child) {
|
|
3
|
+
if (child == null || typeof child === "boolean")
|
|
4
|
+
return "";
|
|
5
|
+
if (Array.isArray(child)) {
|
|
6
|
+
let s = "";
|
|
7
|
+
for (let i = 0;i < child.length; i++)
|
|
8
|
+
s += renderChild(child[i]);
|
|
9
|
+
return s;
|
|
10
|
+
}
|
|
11
|
+
if (typeof child === "object" && child !== null && "type" in child)
|
|
12
|
+
return renderVNode(child);
|
|
13
|
+
if (isRenderableThunk(child))
|
|
14
|
+
return renderChild(child());
|
|
15
|
+
const resolved = resolveValue(child);
|
|
16
|
+
if (resolved == null || typeof resolved === "boolean")
|
|
17
|
+
return "";
|
|
18
|
+
return escapeHTML(String(resolved));
|
|
19
|
+
}
|
|
20
|
+
function renderAttrs(props) {
|
|
21
|
+
let result = "";
|
|
22
|
+
for (const key in props) {
|
|
23
|
+
if (key === "children" || key === "ref" || key.startsWith("on:"))
|
|
24
|
+
continue;
|
|
25
|
+
const value = resolveValue(props[key]);
|
|
26
|
+
if (key === "className" || key === "class") {
|
|
27
|
+
if (value != null)
|
|
28
|
+
result += ` class="${escapeAttr(String(value))}"`;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (key === "style" && typeof value === "object" && value !== null) {
|
|
32
|
+
let styles = "";
|
|
33
|
+
for (const p in value) {
|
|
34
|
+
if (styles)
|
|
35
|
+
styles += "; ";
|
|
36
|
+
const sv = resolveValue(value[p]);
|
|
37
|
+
if (sv != null)
|
|
38
|
+
styles += `${p}: ${sv}`;
|
|
39
|
+
}
|
|
40
|
+
result += ` style="${escapeAttr(styles)}"`;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (typeof value === "boolean") {
|
|
44
|
+
if (value)
|
|
45
|
+
result += ` ${key}`;
|
|
46
|
+
} else if (value != null)
|
|
47
|
+
result += ` ${key}="${escapeAttr(String(value))}"`;
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
}
|
|
51
|
+
function renderVNode(vnode) {
|
|
52
|
+
const { type, props } = vnode;
|
|
53
|
+
if (typeof type === "symbol")
|
|
54
|
+
return renderChild(props.children);
|
|
55
|
+
if (typeof type === "function") {
|
|
56
|
+
const result = type(props);
|
|
57
|
+
return renderChild(result);
|
|
58
|
+
}
|
|
59
|
+
const tag = type, attrs = renderAttrs(props);
|
|
60
|
+
if (VOID_ELEMENTS.has(tag))
|
|
61
|
+
return `<${tag}${attrs} />`;
|
|
62
|
+
const children = renderChild(props.children);
|
|
63
|
+
return `<${tag}${attrs}>${children}</${tag}>`;
|
|
64
|
+
}
|
|
65
|
+
export function ssrJsx(type, props) {
|
|
66
|
+
return { type, props: props ?? {} };
|
|
67
|
+
}
|
|
68
|
+
export const ssrJsxs = ssrJsx;
|
|
69
|
+
export function renderToString(root) {
|
|
70
|
+
return renderChild(root);
|
|
71
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Component } from "./jsx-runtime.js";
|
|
2
|
+
interface SuspenseSlot {
|
|
3
|
+
id: string;
|
|
4
|
+
fallback: unknown;
|
|
5
|
+
children: unknown;
|
|
6
|
+
resolve: () => Promise<unknown>;
|
|
7
|
+
}
|
|
8
|
+
interface StreamContext {
|
|
9
|
+
suspenseSlots: SuspenseSlot[];
|
|
10
|
+
nextId: number;
|
|
11
|
+
}
|
|
12
|
+
interface VNode {
|
|
13
|
+
type: string | Component | symbol;
|
|
14
|
+
props: Record<string, unknown>;
|
|
15
|
+
__gorsee_suspense?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function streamJsx(type: string | Component | symbol, props: Record<string, unknown> | null): VNode;
|
|
18
|
+
export declare const streamJsxs: typeof streamJsx;
|
|
19
|
+
export declare function StreamSuspense(props: {
|
|
20
|
+
fallback: unknown;
|
|
21
|
+
children: unknown;
|
|
22
|
+
__streamCtx?: StreamContext;
|
|
23
|
+
}): VNode;
|
|
24
|
+
export declare function buildStreamChunkScript(slotId: string, html: string): string;
|
|
25
|
+
export interface StreamOptions {
|
|
26
|
+
shell?: (body: string) => string;
|
|
27
|
+
}
|
|
28
|
+
export declare function renderToStream(root: unknown, options?: StreamOptions): ReadableStream<Uint8Array>;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { escapeHTML, escapeAttr, VOID_ELEMENTS, resolveValue } from "./html-escape.js";
|
|
2
|
+
export function streamJsx(type, props) {
|
|
3
|
+
return { type, props: props ?? {} };
|
|
4
|
+
}
|
|
5
|
+
export const streamJsxs = streamJsx;
|
|
6
|
+
export function StreamSuspense(props) {
|
|
7
|
+
const node = streamJsx("gorsee-suspense", {
|
|
8
|
+
fallback: props.fallback,
|
|
9
|
+
children: props.children
|
|
10
|
+
});
|
|
11
|
+
node.__gorsee_suspense = !0;
|
|
12
|
+
return node;
|
|
13
|
+
}
|
|
14
|
+
function renderAttrs(props) {
|
|
15
|
+
const parts = [];
|
|
16
|
+
for (const [key, rawValue] of Object.entries(props)) {
|
|
17
|
+
if (key === "children" || key === "ref" || key === "fallback" || key.startsWith("on:"))
|
|
18
|
+
continue;
|
|
19
|
+
const value = resolveValue(rawValue);
|
|
20
|
+
if (key === "className" || key === "class") {
|
|
21
|
+
if (value != null)
|
|
22
|
+
parts.push(` class="${escapeAttr(String(value))}"`);
|
|
23
|
+
} else if (typeof value === "boolean") {
|
|
24
|
+
if (value)
|
|
25
|
+
parts.push(` ${key}`);
|
|
26
|
+
} else if (value != null)
|
|
27
|
+
parts.push(` ${key}="${escapeAttr(String(value))}"`);
|
|
28
|
+
}
|
|
29
|
+
return parts.join("");
|
|
30
|
+
}
|
|
31
|
+
function renderShellNode(node, ctx) {
|
|
32
|
+
if (node == null || typeof node === "boolean")
|
|
33
|
+
return "";
|
|
34
|
+
if (Array.isArray(node))
|
|
35
|
+
return node.map((n) => renderShellNode(n, ctx)).join("");
|
|
36
|
+
if (typeof node === "object" && node !== null && "type" in node) {
|
|
37
|
+
const vnode = node;
|
|
38
|
+
if (vnode.__gorsee_suspense) {
|
|
39
|
+
const id = `s${ctx.nextId++}`, fallbackHtml = renderShellNode(vnode.props.fallback, ctx);
|
|
40
|
+
ctx.suspenseSlots.push({
|
|
41
|
+
id,
|
|
42
|
+
fallback: vnode.props.fallback,
|
|
43
|
+
children: vnode.props.children,
|
|
44
|
+
resolve: async () => {
|
|
45
|
+
const children = vnode.props.children;
|
|
46
|
+
if (typeof children === "function")
|
|
47
|
+
return await children();
|
|
48
|
+
return children;
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
return `<div data-g-suspense="${id}">${fallbackHtml}</div>`;
|
|
52
|
+
}
|
|
53
|
+
if (typeof vnode.type === "symbol")
|
|
54
|
+
return renderShellNode(vnode.props.children, ctx);
|
|
55
|
+
if (typeof vnode.type === "function") {
|
|
56
|
+
const result = vnode.type(vnode.props);
|
|
57
|
+
return renderShellNode(result, ctx);
|
|
58
|
+
}
|
|
59
|
+
const tag = vnode.type, attrs = renderAttrs(vnode.props);
|
|
60
|
+
if (VOID_ELEMENTS.has(tag))
|
|
61
|
+
return `<${tag}${attrs} />`;
|
|
62
|
+
const children = renderShellNode(vnode.props.children, ctx);
|
|
63
|
+
return `<${tag}${attrs}>${children}</${tag}>`;
|
|
64
|
+
}
|
|
65
|
+
const resolved = resolveValue(node);
|
|
66
|
+
if (resolved == null || typeof resolved === "boolean")
|
|
67
|
+
return "";
|
|
68
|
+
return escapeHTML(String(resolved));
|
|
69
|
+
}
|
|
70
|
+
export function buildStreamChunkScript(slotId, html) {
|
|
71
|
+
return [
|
|
72
|
+
`<template data-g-chunk="${slotId}">${html}</template>`,
|
|
73
|
+
"<script>",
|
|
74
|
+
"(function(){",
|
|
75
|
+
` var t=document.querySelector('[data-g-chunk="${slotId}"]');`,
|
|
76
|
+
` var s=document.querySelector('[data-g-suspense="${slotId}"]');`,
|
|
77
|
+
" if(t&&s){var f=t.content.cloneNode(true);s.replaceChildren(...Array.from(f.childNodes));t.remove();s.removeAttribute('data-g-suspense')}",
|
|
78
|
+
"})();",
|
|
79
|
+
"</script>"
|
|
80
|
+
].join("");
|
|
81
|
+
}
|
|
82
|
+
const defaultShell = (body) => `<!DOCTYPE html>
|
|
83
|
+
<html lang="en">
|
|
84
|
+
<head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Gorsee App</title></head>
|
|
85
|
+
<body><div id="app">${body}</div>`, STREAM_TAIL = "</body></html>";
|
|
86
|
+
export function renderToStream(root, options) {
|
|
87
|
+
const shell = options?.shell ?? defaultShell, encoder = new TextEncoder, ctx = { suspenseSlots: [], nextId: 0 };
|
|
88
|
+
return new ReadableStream({
|
|
89
|
+
async start(controller) {
|
|
90
|
+
const shellHtml = renderShellNode(root, ctx);
|
|
91
|
+
controller.enqueue(encoder.encode(shell(shellHtml)));
|
|
92
|
+
const promises = ctx.suspenseSlots.map(async (slot) => {
|
|
93
|
+
try {
|
|
94
|
+
const resolved = await slot.resolve(), html = renderShellNode(resolved, ctx), script = buildStreamChunkScript(slot.id, html);
|
|
95
|
+
controller.enqueue(encoder.encode(script));
|
|
96
|
+
} catch (err) {
|
|
97
|
+
const message = err instanceof Error ? err.message : String(err), errorHtml = `<div class="error">Error: ${escapeHTML(message)}</div>`, script = buildStreamChunkScript(slot.id, errorHtml);
|
|
98
|
+
controller.enqueue(encoder.encode(script));
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
await Promise.all(promises);
|
|
102
|
+
controller.enqueue(encoder.encode(STREAM_TAIL));
|
|
103
|
+
controller.close();
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
}
|