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
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
// Event Replay -- captures user interactions before hydration completes
|
|
2
|
-
// Inspired by Angular's JSAction / Google Wiz
|
|
3
|
-
//
|
|
4
|
-
// This generates a small inline <script> (~400 bytes minified)
|
|
5
|
-
// that should be placed before any app content in the HTML.
|
|
6
|
-
|
|
7
1
|
export const EVENT_REPLAY_SCRIPT = `<script data-g-event-replay>
|
|
8
2
|
(function(){
|
|
9
3
|
var Q=[];
|
|
@@ -29,22 +23,13 @@ export const EVENT_REPLAY_SCRIPT = `<script data-g-event-replay>
|
|
|
29
23
|
}
|
|
30
24
|
};
|
|
31
25
|
})();
|
|
32
|
-
</script
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
queue: unknown[]
|
|
36
|
-
stop(): void
|
|
37
|
-
replay(root: Element): void
|
|
26
|
+
</script>`;
|
|
27
|
+
function getEventReplay() {
|
|
28
|
+
return globalThis.__gorsee_events;
|
|
38
29
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
return (globalThis as Record<string, unknown>).__gorsee_events as GorseeEventReplay | undefined
|
|
30
|
+
export function replayEvents(root) {
|
|
31
|
+
getEventReplay()?.replay(root);
|
|
42
32
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
getEventReplay()?.replay(root)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export function stopEventCapture(): void {
|
|
49
|
-
getEventReplay()?.stop()
|
|
33
|
+
export function stopEventCapture() {
|
|
34
|
+
getEventReplay()?.stop();
|
|
50
35
|
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type SignalGetter } from "../reactive/signal.js";
|
|
2
|
+
export interface EventSourceSignal<T> {
|
|
3
|
+
readonly value: SignalGetter<T>;
|
|
4
|
+
readonly connected: SignalGetter<boolean>;
|
|
5
|
+
close: () => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function createEventSource<T>(url: string, event: string, initialValue: T): EventSourceSignal<T>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createSignal } from "../reactive/signal.js";
|
|
2
|
+
export function createEventSource(url, event, initialValue) {
|
|
3
|
+
const [value, setValue] = createSignal(initialValue), [connected, setConnected] = createSignal(!1);
|
|
4
|
+
if (typeof globalThis.EventSource > "u")
|
|
5
|
+
return { value, connected, close: () => {} };
|
|
6
|
+
const source = new EventSource(url);
|
|
7
|
+
source.addEventListener("open", () => {
|
|
8
|
+
setConnected(!0);
|
|
9
|
+
});
|
|
10
|
+
source.addEventListener(event, (e) => {
|
|
11
|
+
try {
|
|
12
|
+
const parsed = JSON.parse(String(e.data));
|
|
13
|
+
setValue(parsed);
|
|
14
|
+
} catch {}
|
|
15
|
+
});
|
|
16
|
+
source.addEventListener("error", () => {
|
|
17
|
+
setConnected(!1);
|
|
18
|
+
});
|
|
19
|
+
function close() {
|
|
20
|
+
source.close();
|
|
21
|
+
setConnected(!1);
|
|
22
|
+
}
|
|
23
|
+
return { value, connected, close };
|
|
24
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type SignalGetter } from "../reactive/signal.js";
|
|
2
|
+
export interface FormActionResult<T = unknown> {
|
|
3
|
+
ok?: boolean;
|
|
4
|
+
status?: number;
|
|
5
|
+
data?: T;
|
|
6
|
+
error?: string;
|
|
7
|
+
fieldErrors?: Record<string, string[]>;
|
|
8
|
+
formErrors?: string[];
|
|
9
|
+
values?: Record<string, string>;
|
|
10
|
+
}
|
|
11
|
+
export interface FormSubmitOptions<T = unknown> {
|
|
12
|
+
optimisticData?: T;
|
|
13
|
+
}
|
|
14
|
+
export interface FormState<T = unknown> {
|
|
15
|
+
submitting: SignalGetter<boolean>;
|
|
16
|
+
status: SignalGetter<"idle" | "submitting" | "success" | "error">;
|
|
17
|
+
error: SignalGetter<string | undefined>;
|
|
18
|
+
formErrors: SignalGetter<string[]>;
|
|
19
|
+
fieldErrors: SignalGetter<Record<string, string[]>>;
|
|
20
|
+
data: SignalGetter<T | undefined>;
|
|
21
|
+
submit: (formData: FormData | Record<string, string>, options?: FormSubmitOptions<T>) => Promise<FormActionResult<T>>;
|
|
22
|
+
reset: () => void;
|
|
23
|
+
}
|
|
24
|
+
export declare function useFormAction<T = unknown>(actionUrl?: string): FormState<T>;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { createSignal } from "../reactive/signal.js";
|
|
2
|
+
function normalizeFormInput(input) {
|
|
3
|
+
return input instanceof FormData ? input : new URLSearchParams(input);
|
|
4
|
+
}
|
|
5
|
+
export function useFormAction(actionUrl) {
|
|
6
|
+
const [submitting, setSubmitting] = createSignal(!1), [status, setStatus] = createSignal("idle"), [error, setError] = createSignal(void 0), [formErrors, setFormErrors] = createSignal([]), [fieldErrors, setFieldErrors] = createSignal({}), [data, setData] = createSignal(void 0);
|
|
7
|
+
function reset() {
|
|
8
|
+
setSubmitting(!1);
|
|
9
|
+
setStatus("idle");
|
|
10
|
+
setError(void 0);
|
|
11
|
+
setFormErrors([]);
|
|
12
|
+
setFieldErrors({});
|
|
13
|
+
setData(void 0);
|
|
14
|
+
}
|
|
15
|
+
async function submit(input, options = {}) {
|
|
16
|
+
setSubmitting(!0);
|
|
17
|
+
setStatus("submitting");
|
|
18
|
+
setError(void 0);
|
|
19
|
+
setFormErrors([]);
|
|
20
|
+
setFieldErrors({});
|
|
21
|
+
if (options.optimisticData !== void 0)
|
|
22
|
+
setData(() => options.optimisticData);
|
|
23
|
+
try {
|
|
24
|
+
const url = actionUrl ?? location.pathname, res = await fetch(url, {
|
|
25
|
+
method: "POST",
|
|
26
|
+
body: normalizeFormInput(input),
|
|
27
|
+
headers: {
|
|
28
|
+
Accept: "application/json"
|
|
29
|
+
}
|
|
30
|
+
}), rawResult = await res.json(), result = {
|
|
31
|
+
ok: rawResult.ok ?? res.ok,
|
|
32
|
+
status: rawResult.status ?? res.status,
|
|
33
|
+
data: rawResult.data,
|
|
34
|
+
error: rawResult.error,
|
|
35
|
+
fieldErrors: rawResult.fieldErrors,
|
|
36
|
+
formErrors: rawResult.formErrors,
|
|
37
|
+
values: rawResult.values
|
|
38
|
+
};
|
|
39
|
+
if (result.ok === !1 || result.error || result.formErrors && result.formErrors.length > 0 || result.fieldErrors && Object.keys(result.fieldErrors).length > 0) {
|
|
40
|
+
setStatus("error");
|
|
41
|
+
setError(result.error);
|
|
42
|
+
setFormErrors(result.formErrors ?? []);
|
|
43
|
+
setFieldErrors(result.fieldErrors ?? {});
|
|
44
|
+
return result;
|
|
45
|
+
}
|
|
46
|
+
setStatus("success");
|
|
47
|
+
setData(() => result.data);
|
|
48
|
+
return result;
|
|
49
|
+
} catch (err) {
|
|
50
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
51
|
+
setStatus("error");
|
|
52
|
+
setError(message);
|
|
53
|
+
return { ok: !1, status: 500, error: message };
|
|
54
|
+
} finally {
|
|
55
|
+
setSubmitting(!1);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return { submitting, status, error, formErrors, fieldErrors, data, submit, reset };
|
|
59
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
let serverHeadElements = [];
|
|
2
|
+
export function resetServerHead() {
|
|
3
|
+
serverHeadElements = [];
|
|
4
|
+
}
|
|
5
|
+
export function getServerHead() {
|
|
6
|
+
return serverHeadElements;
|
|
7
|
+
}
|
|
8
|
+
export function Head(props) {
|
|
9
|
+
const children = props.children;
|
|
10
|
+
if (!children)
|
|
11
|
+
return null;
|
|
12
|
+
if (typeof document < "u")
|
|
13
|
+
applyClientHead(children);
|
|
14
|
+
else
|
|
15
|
+
collectServerHead(children);
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
function isVNode(v) {
|
|
19
|
+
return typeof v === "object" && v !== null && "type" in v && "props" in v;
|
|
20
|
+
}
|
|
21
|
+
function collectServerHead(children) {
|
|
22
|
+
if (Array.isArray(children)) {
|
|
23
|
+
for (const child of children)
|
|
24
|
+
collectServerHead(child);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (!isVNode(children))
|
|
28
|
+
return;
|
|
29
|
+
const { type, props } = children;
|
|
30
|
+
if (type === "title" && props.children) {
|
|
31
|
+
serverHeadElements.push(`<title>${String(props.children)}</title>`);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
let tag = `<${type}`;
|
|
35
|
+
for (const [key, value] of Object.entries(props)) {
|
|
36
|
+
if (key === "children")
|
|
37
|
+
continue;
|
|
38
|
+
if (value != null)
|
|
39
|
+
tag += ` ${key}="${String(value)}"`;
|
|
40
|
+
}
|
|
41
|
+
if (props.children)
|
|
42
|
+
tag += `>${String(props.children)}</${type}>`;
|
|
43
|
+
else
|
|
44
|
+
tag += " />";
|
|
45
|
+
serverHeadElements.push(tag);
|
|
46
|
+
}
|
|
47
|
+
function applyClientHead(children) {
|
|
48
|
+
if (Array.isArray(children)) {
|
|
49
|
+
for (const child of children)
|
|
50
|
+
applyClientHead(child);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (!isVNode(children))
|
|
54
|
+
return;
|
|
55
|
+
const { type, props } = children;
|
|
56
|
+
if (type === "title") {
|
|
57
|
+
document.title = String(props.children ?? "");
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (type === "meta") {
|
|
61
|
+
const name = props.name ?? props.property;
|
|
62
|
+
if (name) {
|
|
63
|
+
const existing = document.querySelector(`meta[name="${name}"], meta[property="${name}"]`);
|
|
64
|
+
if (existing) {
|
|
65
|
+
existing.setAttribute("content", String(props.content ?? ""));
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
const meta = document.createElement("meta");
|
|
70
|
+
for (const [key, value] of Object.entries(props)) {
|
|
71
|
+
if (key === "children")
|
|
72
|
+
continue;
|
|
73
|
+
if (value != null)
|
|
74
|
+
meta.setAttribute(key, String(value));
|
|
75
|
+
}
|
|
76
|
+
document.head.appendChild(meta);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (type === "link") {
|
|
80
|
+
const el = document.createElement("link");
|
|
81
|
+
for (const [key, value] of Object.entries(props)) {
|
|
82
|
+
if (key === "children")
|
|
83
|
+
continue;
|
|
84
|
+
if (value != null)
|
|
85
|
+
el.setAttribute(key, String(value));
|
|
86
|
+
}
|
|
87
|
+
el.dataset.gHead = "";
|
|
88
|
+
document.head.appendChild(el);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare const GORSEE_SIGNAL_MARKER = "__gorseeSignal";
|
|
2
|
+
export declare function escapeHTML(value: string): string;
|
|
3
|
+
export declare function escapeAttr(value: string): string;
|
|
4
|
+
export declare const VOID_ELEMENTS: Set<string>;
|
|
5
|
+
export declare function isSignal(value: unknown): value is () => unknown;
|
|
6
|
+
export declare function isRenderableThunk(value: unknown): value is () => unknown;
|
|
7
|
+
export declare function resolveValue(value: unknown): unknown;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const HTML_ESCAPE_RE = /[&<>"']/g, ATTR_ESCAPE_RE = /["&]/g, HTML_ESCAPES = {
|
|
2
|
+
"&": "&",
|
|
3
|
+
"<": "<",
|
|
4
|
+
">": ">",
|
|
5
|
+
'"': """,
|
|
6
|
+
"'": "'"
|
|
7
|
+
};
|
|
8
|
+
export const GORSEE_SIGNAL_MARKER = "__gorseeSignal";
|
|
9
|
+
export function escapeHTML(value) {
|
|
10
|
+
return value.replace(HTML_ESCAPE_RE, (ch) => HTML_ESCAPES[ch] ?? ch);
|
|
11
|
+
}
|
|
12
|
+
export function escapeAttr(value) {
|
|
13
|
+
return value.replace(ATTR_ESCAPE_RE, (ch) => HTML_ESCAPES[ch] ?? ch);
|
|
14
|
+
}
|
|
15
|
+
export const VOID_ELEMENTS = new Set([
|
|
16
|
+
"area",
|
|
17
|
+
"base",
|
|
18
|
+
"br",
|
|
19
|
+
"col",
|
|
20
|
+
"embed",
|
|
21
|
+
"hr",
|
|
22
|
+
"img",
|
|
23
|
+
"input",
|
|
24
|
+
"link",
|
|
25
|
+
"meta",
|
|
26
|
+
"param",
|
|
27
|
+
"source",
|
|
28
|
+
"track",
|
|
29
|
+
"wbr"
|
|
30
|
+
]);
|
|
31
|
+
export function isSignal(value) {
|
|
32
|
+
return typeof value === "function" && value[GORSEE_SIGNAL_MARKER] === !0;
|
|
33
|
+
}
|
|
34
|
+
export function isRenderableThunk(value) {
|
|
35
|
+
return typeof value === "function" && value.length === 0 && !isSignal(value);
|
|
36
|
+
}
|
|
37
|
+
export function resolveValue(value) {
|
|
38
|
+
return isSignal(value) ? value() : value;
|
|
39
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface HydrationDiagnostics {
|
|
2
|
+
active: boolean;
|
|
3
|
+
mismatches: number;
|
|
4
|
+
recoverableMismatch: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function isHydrating(): boolean;
|
|
7
|
+
export declare function getHydrationMismatches(): number;
|
|
8
|
+
export declare function getHydrationDiagnostics(): HydrationDiagnostics;
|
|
9
|
+
export declare function resetHydrationDiagnostics(): void;
|
|
10
|
+
export declare function enterHydration(root: Element): void;
|
|
11
|
+
export declare function exitHydration(): HydrationDiagnostics;
|
|
12
|
+
export declare function claimElement(expectedTag?: string): Element | null;
|
|
13
|
+
export declare function claimText(expectedText?: string): Text | null;
|
|
14
|
+
export declare function pushCursor(parent: Node): void;
|
|
15
|
+
export declare function popCursor(): void;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
const stack = [];
|
|
2
|
+
let active = !1, mismatches = 0;
|
|
3
|
+
export function isHydrating() {
|
|
4
|
+
return active;
|
|
5
|
+
}
|
|
6
|
+
export function getHydrationMismatches() {
|
|
7
|
+
return mismatches;
|
|
8
|
+
}
|
|
9
|
+
export function getHydrationDiagnostics() {
|
|
10
|
+
return { active, mismatches, recoverableMismatch: mismatches > 0 };
|
|
11
|
+
}
|
|
12
|
+
export function resetHydrationDiagnostics() {
|
|
13
|
+
mismatches = 0;
|
|
14
|
+
}
|
|
15
|
+
export function enterHydration(root) {
|
|
16
|
+
active = !0;
|
|
17
|
+
mismatches = 0;
|
|
18
|
+
stack.length = 0;
|
|
19
|
+
stack.push({ parent: root, index: 0 });
|
|
20
|
+
}
|
|
21
|
+
export function exitHydration() {
|
|
22
|
+
for (const cursor of stack)
|
|
23
|
+
mismatches += countRemainingMeaningfulNodes(cursor);
|
|
24
|
+
active = !1;
|
|
25
|
+
stack.length = 0;
|
|
26
|
+
if (mismatches > 0 && typeof console < "u")
|
|
27
|
+
console.warn(`[gorsee] Hydration completed with ${mismatches} mismatch(es). Server and client HTML may differ.`);
|
|
28
|
+
return getHydrationDiagnostics();
|
|
29
|
+
}
|
|
30
|
+
export function claimElement(expectedTag) {
|
|
31
|
+
const cursor = stack[stack.length - 1];
|
|
32
|
+
if (!cursor)
|
|
33
|
+
return null;
|
|
34
|
+
while (cursor.index < cursor.parent.childNodes.length) {
|
|
35
|
+
const node = cursor.parent.childNodes[cursor.index];
|
|
36
|
+
if (node.nodeType === 1) {
|
|
37
|
+
if (expectedTag && node.tagName.toLowerCase() !== expectedTag.toLowerCase()) {
|
|
38
|
+
mismatches++;
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
cursor.index++;
|
|
42
|
+
return node;
|
|
43
|
+
}
|
|
44
|
+
if (node.nodeType === 3 && node.textContent?.trim() === "") {
|
|
45
|
+
cursor.index++;
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (node.nodeType === 8) {
|
|
49
|
+
cursor.index++;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
export function claimText(expectedText) {
|
|
57
|
+
const cursor = stack[stack.length - 1];
|
|
58
|
+
if (!cursor)
|
|
59
|
+
return null;
|
|
60
|
+
while (cursor.index < cursor.parent.childNodes.length) {
|
|
61
|
+
const node = cursor.parent.childNodes[cursor.index];
|
|
62
|
+
if (node.nodeType === 3) {
|
|
63
|
+
cursor.index++;
|
|
64
|
+
const textNode = node;
|
|
65
|
+
if (expectedText !== void 0) {
|
|
66
|
+
const currentText = textNode.textContent ?? "";
|
|
67
|
+
if (currentText !== expectedText)
|
|
68
|
+
if (currentText.startsWith(expectedText) && expectedText.length < currentText.length) {
|
|
69
|
+
textNode.splitText(expectedText.length);
|
|
70
|
+
textNode.textContent = expectedText;
|
|
71
|
+
} else {
|
|
72
|
+
textNode.textContent = expectedText;
|
|
73
|
+
mismatches++;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return textNode;
|
|
77
|
+
}
|
|
78
|
+
if (node.nodeType === 8) {
|
|
79
|
+
cursor.index++;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
export function pushCursor(parent) {
|
|
87
|
+
stack.push({ parent, index: 0 });
|
|
88
|
+
}
|
|
89
|
+
export function popCursor() {
|
|
90
|
+
stack.pop();
|
|
91
|
+
}
|
|
92
|
+
function countRemainingMeaningfulNodes(cursor) {
|
|
93
|
+
let count = 0;
|
|
94
|
+
for (let i = cursor.index;i < cursor.parent.childNodes.length; i++) {
|
|
95
|
+
const node = cursor.parent.childNodes[i];
|
|
96
|
+
if (node.nodeType === 8)
|
|
97
|
+
continue;
|
|
98
|
+
if (node.nodeType === 3 && node.textContent?.trim() === "")
|
|
99
|
+
continue;
|
|
100
|
+
count++;
|
|
101
|
+
}
|
|
102
|
+
return count;
|
|
103
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { GorseeRenderable } from "./renderable.js";
|
|
2
|
+
export type ImageFormat = "avif" | "webp" | "jpeg" | "png";
|
|
3
|
+
export type ImageFit = "cover" | "contain" | "fill" | "inside" | "outside";
|
|
4
|
+
export interface ImageRemotePattern {
|
|
5
|
+
protocol?: "http:" | "https:";
|
|
6
|
+
hostname: string;
|
|
7
|
+
pathname?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ImageLoaderParams {
|
|
10
|
+
src: string;
|
|
11
|
+
width: number;
|
|
12
|
+
quality: number;
|
|
13
|
+
format?: ImageFormat;
|
|
14
|
+
}
|
|
15
|
+
export type ImageLoader = (params: ImageLoaderParams) => string;
|
|
16
|
+
export interface ImageRuntimeConfig {
|
|
17
|
+
widths?: number[];
|
|
18
|
+
formats?: ImageFormat[];
|
|
19
|
+
quality?: number;
|
|
20
|
+
fit?: ImageFit;
|
|
21
|
+
loader?: ImageLoader;
|
|
22
|
+
remotePatterns?: ImageRemotePattern[];
|
|
23
|
+
}
|
|
24
|
+
export interface ImageProps {
|
|
25
|
+
src: string;
|
|
26
|
+
alt: string;
|
|
27
|
+
width?: number;
|
|
28
|
+
height?: number;
|
|
29
|
+
loading?: "lazy" | "eager";
|
|
30
|
+
priority?: boolean;
|
|
31
|
+
sizes?: string;
|
|
32
|
+
quality?: number;
|
|
33
|
+
fit?: ImageFit;
|
|
34
|
+
format?: ImageFormat;
|
|
35
|
+
formats?: ImageFormat[];
|
|
36
|
+
optimize?: boolean;
|
|
37
|
+
placeholder?: "empty" | "blur";
|
|
38
|
+
blurDataURL?: string;
|
|
39
|
+
class?: string;
|
|
40
|
+
className?: string;
|
|
41
|
+
config?: ImageRuntimeConfig;
|
|
42
|
+
[key: string]: unknown;
|
|
43
|
+
}
|
|
44
|
+
export declare function isAllowedRemoteImage(src: string, patterns?: ImageRemotePattern[]): boolean;
|
|
45
|
+
export declare function defaultImageLoader(params: ImageLoaderParams): string;
|
|
46
|
+
export declare function getImageCandidateWidths(width: number | undefined, widths?: number[]): number[];
|
|
47
|
+
export declare function buildImageSrcSet(src: string, width: number | undefined, quality: number, loader: ImageLoader, format?: ImageFormat, widths?: number[]): string | undefined;
|
|
48
|
+
export declare function getImageProps(props: ImageProps): Record<string, unknown>;
|
|
49
|
+
export declare function Image(props: ImageProps): GorseeRenderable;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
const DEFAULT_IMAGE_CONFIG = {
|
|
2
|
+
widths: [320, 640, 960, 1200, 1600, 2048],
|
|
3
|
+
formats: ["webp"],
|
|
4
|
+
quality: 75,
|
|
5
|
+
fit: "cover"
|
|
6
|
+
};
|
|
7
|
+
function isRemoteSource(src) {
|
|
8
|
+
return /^https?:\/\//.test(src);
|
|
9
|
+
}
|
|
10
|
+
function matchesRemotePattern(url, pattern) {
|
|
11
|
+
if (pattern.protocol && url.protocol !== pattern.protocol)
|
|
12
|
+
return !1;
|
|
13
|
+
if (pattern.hostname !== url.hostname)
|
|
14
|
+
return !1;
|
|
15
|
+
if (!pattern.pathname)
|
|
16
|
+
return !0;
|
|
17
|
+
if (pattern.pathname.endsWith("/**")) {
|
|
18
|
+
const prefix = pattern.pathname.slice(0, -3);
|
|
19
|
+
return url.pathname.startsWith(prefix);
|
|
20
|
+
}
|
|
21
|
+
if (pattern.pathname.endsWith("/*")) {
|
|
22
|
+
const prefix = pattern.pathname.slice(0, -1);
|
|
23
|
+
return url.pathname.startsWith(prefix) && !url.pathname.slice(prefix.length).includes("/");
|
|
24
|
+
}
|
|
25
|
+
return url.pathname === pattern.pathname;
|
|
26
|
+
}
|
|
27
|
+
export function isAllowedRemoteImage(src, patterns = []) {
|
|
28
|
+
if (!isRemoteSource(src))
|
|
29
|
+
return !0;
|
|
30
|
+
const url = new URL(src);
|
|
31
|
+
return patterns.some((pattern) => matchesRemotePattern(url, pattern));
|
|
32
|
+
}
|
|
33
|
+
export function defaultImageLoader(params) {
|
|
34
|
+
const search = new URLSearchParams({
|
|
35
|
+
src: params.src,
|
|
36
|
+
w: String(params.width),
|
|
37
|
+
q: String(params.quality)
|
|
38
|
+
});
|
|
39
|
+
if (params.format)
|
|
40
|
+
search.set("fm", params.format);
|
|
41
|
+
return `/_gorsee/image?${search.toString()}`;
|
|
42
|
+
}
|
|
43
|
+
export function getImageCandidateWidths(width, widths = DEFAULT_IMAGE_CONFIG.widths) {
|
|
44
|
+
if (!width)
|
|
45
|
+
return [...widths];
|
|
46
|
+
const candidates = widths.filter((candidate) => candidate <= width * 2);
|
|
47
|
+
if (!candidates.includes(width))
|
|
48
|
+
candidates.push(width);
|
|
49
|
+
return [...new Set(candidates)].sort((a, b) => a - b);
|
|
50
|
+
}
|
|
51
|
+
export function buildImageSrcSet(src, width, quality, loader, format, widths = DEFAULT_IMAGE_CONFIG.widths) {
|
|
52
|
+
const candidates = getImageCandidateWidths(width, widths);
|
|
53
|
+
if (candidates.length === 0)
|
|
54
|
+
return;
|
|
55
|
+
return candidates.map((candidate) => `${loader({ src, width: candidate, quality, format })} ${candidate}w`).join(", ");
|
|
56
|
+
}
|
|
57
|
+
function buildPlaceholderStyle(props) {
|
|
58
|
+
if (props.placeholder !== "blur" || !props.blurDataURL)
|
|
59
|
+
return;
|
|
60
|
+
return {
|
|
61
|
+
backgroundImage: `url("${props.blurDataURL}")`,
|
|
62
|
+
backgroundSize: "cover",
|
|
63
|
+
backgroundPosition: "center"
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
function resolveImageConfig(props) {
|
|
67
|
+
const config = props.config ?? {};
|
|
68
|
+
return {
|
|
69
|
+
widths: config.widths ?? DEFAULT_IMAGE_CONFIG.widths,
|
|
70
|
+
formats: config.formats ?? DEFAULT_IMAGE_CONFIG.formats,
|
|
71
|
+
quality: props.quality ?? config.quality ?? DEFAULT_IMAGE_CONFIG.quality,
|
|
72
|
+
fit: props.fit ?? config.fit ?? DEFAULT_IMAGE_CONFIG.fit,
|
|
73
|
+
loader: config.loader,
|
|
74
|
+
remotePatterns: config.remotePatterns
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export function getImageProps(props) {
|
|
78
|
+
const {
|
|
79
|
+
src,
|
|
80
|
+
alt,
|
|
81
|
+
width,
|
|
82
|
+
height,
|
|
83
|
+
loading: loadingProp,
|
|
84
|
+
priority,
|
|
85
|
+
sizes,
|
|
86
|
+
format,
|
|
87
|
+
formats,
|
|
88
|
+
optimize = !0,
|
|
89
|
+
placeholder,
|
|
90
|
+
blurDataURL,
|
|
91
|
+
config,
|
|
92
|
+
style,
|
|
93
|
+
...rest
|
|
94
|
+
} = props, resolved = resolveImageConfig(props), loading = priority ? "eager" : loadingProp ?? "lazy", fetchpriority = priority ? "high" : void 0, decoding = priority ? "sync" : "async", loader = resolved.loader ?? defaultImageLoader;
|
|
95
|
+
if (isRemoteSource(src) && !isAllowedRemoteImage(src, resolved.remotePatterns ?? []))
|
|
96
|
+
throw Error(`Remote image source is not allowed: ${src}`);
|
|
97
|
+
const shouldOptimize = optimize && Boolean(width), primaryFormat = format ?? formats?.[0] ?? resolved.formats[0], optimizedSrc = shouldOptimize ? loader({ src, width, quality: resolved.quality, format: primaryFormat }) : src, srcSet = shouldOptimize ? buildImageSrcSet(src, width, resolved.quality, loader, primaryFormat, resolved.widths) : void 0, imgProps = {
|
|
98
|
+
src: optimizedSrc,
|
|
99
|
+
alt,
|
|
100
|
+
loading,
|
|
101
|
+
decoding,
|
|
102
|
+
...rest
|
|
103
|
+
};
|
|
104
|
+
if (width !== void 0)
|
|
105
|
+
imgProps.width = String(width);
|
|
106
|
+
if (height !== void 0)
|
|
107
|
+
imgProps.height = String(height);
|
|
108
|
+
if (sizes)
|
|
109
|
+
imgProps.sizes = sizes;
|
|
110
|
+
if (fetchpriority)
|
|
111
|
+
imgProps.fetchpriority = fetchpriority;
|
|
112
|
+
if (srcSet)
|
|
113
|
+
imgProps.srcset = srcSet;
|
|
114
|
+
const placeholderStyle = buildPlaceholderStyle({ ...props, placeholder, blurDataURL }), mergedStyle = {
|
|
115
|
+
...typeof style === "object" && style !== null ? style : {},
|
|
116
|
+
...placeholderStyle ?? {},
|
|
117
|
+
...shouldOptimize ? { "object-fit": resolved.fit } : {}
|
|
118
|
+
};
|
|
119
|
+
if (Object.keys(mergedStyle).length > 0)
|
|
120
|
+
imgProps.style = mergedStyle;
|
|
121
|
+
return imgProps;
|
|
122
|
+
}
|
|
123
|
+
export function Image(props) {
|
|
124
|
+
const resolved = resolveImageConfig(props), requestedFormats = props.formats ?? resolved.formats, primaryFormat = props.format ?? requestedFormats[0];
|
|
125
|
+
if (props.optimize === !1 || !props.width || requestedFormats.length <= 1)
|
|
126
|
+
return { type: "img", props: getImageProps({ ...props, format: primaryFormat }) };
|
|
127
|
+
const loader = resolved.loader ?? defaultImageLoader;
|
|
128
|
+
return {
|
|
129
|
+
type: "picture",
|
|
130
|
+
props: {
|
|
131
|
+
children: [
|
|
132
|
+
...requestedFormats.slice(0, -1).map((candidateFormat) => ({
|
|
133
|
+
type: "source",
|
|
134
|
+
props: {
|
|
135
|
+
type: `image/${candidateFormat}`,
|
|
136
|
+
srcset: buildImageSrcSet(props.src, props.width, resolved.quality, loader, candidateFormat, resolved.widths),
|
|
137
|
+
sizes: props.sizes
|
|
138
|
+
}
|
|
139
|
+
})),
|
|
140
|
+
{ type: "img", props: getImageProps({ ...props, format: primaryFormat }) }
|
|
141
|
+
]
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export { Suspense } from "./suspense.js";
|
|
2
|
+
export { render, hydrate } from "./client.js";
|
|
3
|
+
export { enterHydration, exitHydration, isHydrating, getHydrationMismatches, getHydrationDiagnostics, resetHydrationDiagnostics, } from "./hydration.js";
|
|
4
|
+
export { renderToString, ssrJsx, ssrJsxs } from "./server.js";
|
|
5
|
+
export { renderToStream, StreamSuspense, streamJsx, streamJsxs } from "./stream.js";
|
|
6
|
+
export { EVENT_REPLAY_SCRIPT, replayEvents, stopEventCapture } from "./event-replay.js";
|
|
7
|
+
export { Link } from "./link.js";
|
|
8
|
+
export { Head } from "./head.js";
|
|
9
|
+
export { navigate, onNavigate, beforeNavigate, getCurrentPath, getRouterNavigationDiagnostics, prefetch, initRouter, setLoadingElement, } from "./router.js";
|
|
10
|
+
export { RUNTIME_DEVTOOLS_SCHEMA_VERSION, createRuntimeDevtoolsSnapshot, renderRuntimeDevtoolsHTML, renderRuntimeDevtoolsOverlay, type RuntimeDevtoolsOptions, type RuntimeDevtoolsRouteEntry, type RuntimeDevtoolsRouteSummary, type RuntimeDevtoolsSnapshot, type RuntimeDevtoolsSummary, type RuntimeDevtoolsTopNode, } from "./devtools.js";
|
|
11
|
+
export { useFormAction, type FormActionResult, type FormState, type FormSubmitOptions } from "./form.js";
|
|
12
|
+
export { Image, getImageProps, buildImageSrcSet, getImageCandidateWidths, isAllowedRemoteImage, defaultImageLoader, type ImageProps, type ImageLoader, type ImageLoaderParams, type ImageRuntimeConfig, type ImageRemotePattern, type ImageFormat, } from "./image.js";
|
|
13
|
+
export { typedLink, typedNavigate, typedPrefetch, buildSearchParams, buildTypedPath, createTypedRoute, extractRouteParamKeys, } from "./typed-routes.js";
|
|
14
|
+
export { defineForm, validateForm, validateAction, toFieldErrors, fieldAttrs, type FormField, type FormSchema, type ValidationResult, type ActionValidationResult, type ValidationError, } from "./validated-form.js";
|
|
15
|
+
export { island, isIsland } from "./island.js";
|
|
16
|
+
export { hydrateIslands, registerIsland } from "./island-hydrator.js";
|
|
17
|
+
export { createEventSource, type EventSourceSignal } from "./event-source.js";
|