gorsee 0.2.3 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +261 -213
- package/dist-pkg/ai/artifact-lifecycle.d.ts +25 -0
- package/dist-pkg/ai/artifact-lifecycle.js +98 -0
- package/dist-pkg/ai/bridge.d.ts +26 -0
- package/dist-pkg/ai/bridge.js +82 -0
- package/dist-pkg/ai/bundle.d.ts +46 -0
- package/dist-pkg/ai/bundle.js +247 -0
- package/dist-pkg/ai/contracts.d.ts +1 -0
- package/dist-pkg/ai/contracts.js +1 -0
- package/dist-pkg/ai/ide.d.ts +37 -0
- package/dist-pkg/ai/ide.js +56 -0
- package/dist-pkg/ai/index.d.ts +85 -0
- package/dist-pkg/ai/index.js +267 -0
- package/dist-pkg/ai/json.d.ts +6 -0
- package/dist-pkg/ai/json.js +14 -0
- package/dist-pkg/ai/mcp.d.ts +28 -0
- package/dist-pkg/ai/mcp.js +152 -0
- package/dist-pkg/ai/session-pack.d.ts +28 -0
- package/dist-pkg/ai/session-pack.js +57 -0
- package/dist-pkg/ai/store.d.ts +67 -0
- package/dist-pkg/ai/store.js +174 -0
- package/dist-pkg/ai/summary.d.ts +57 -0
- package/dist-pkg/ai/summary.js +148 -0
- package/dist-pkg/ai/watch.d.ts +15 -0
- package/dist-pkg/ai/watch.js +66 -0
- package/dist-pkg/auth/action-tokens.d.ts +50 -0
- package/dist-pkg/auth/action-tokens.js +79 -0
- package/dist-pkg/auth/index.d.ts +70 -0
- package/dist-pkg/auth/index.js +199 -0
- package/dist-pkg/auth/redis-session-store.d.ts +7 -0
- package/dist-pkg/auth/redis-session-store.js +42 -0
- package/dist-pkg/auth/signing.d.ts +4 -0
- package/dist-pkg/auth/signing.js +33 -0
- package/dist-pkg/auth/sqlite-session-store.d.ts +12 -0
- package/dist-pkg/auth/sqlite-session-store.js +83 -0
- package/dist-pkg/auth/store-utils.d.ts +2 -0
- package/dist-pkg/auth/store-utils.js +20 -0
- package/dist-pkg/bin/gorsee.js +2 -0
- package/dist-pkg/build/backends/experimental-rolldown.d.ts +6 -0
- package/dist-pkg/build/backends/experimental-rolldown.js +9 -0
- package/dist-pkg/build/backends/register.d.ts +7 -0
- package/dist-pkg/build/backends/register.js +24 -0
- package/dist-pkg/build/backends/rolldown.d.ts +16 -0
- package/dist-pkg/build/backends/rolldown.js +176 -0
- package/dist-pkg/build/client-backend.d.ts +31 -0
- package/dist-pkg/build/client-backend.js +97 -0
- package/dist-pkg/build/client.d.ts +12 -0
- package/dist-pkg/build/client.js +93 -0
- package/dist-pkg/build/css-modules.d.ts +10 -0
- package/dist-pkg/build/css-modules.js +51 -0
- package/dist-pkg/build/devalue-parse.d.ts +1 -0
- package/dist-pkg/build/devalue-parse.js +1 -0
- package/dist-pkg/build/diagnostics.d.ts +20 -0
- package/dist-pkg/build/diagnostics.js +35 -0
- package/dist-pkg/build/fixtures.d.ts +7 -0
- package/dist-pkg/build/fixtures.js +60 -0
- package/dist-pkg/build/framework-imports.d.ts +4 -0
- package/dist-pkg/build/framework-imports.js +58 -0
- package/dist-pkg/build/init.d.ts +1 -0
- package/dist-pkg/build/init.js +6 -0
- package/dist-pkg/build/manifest.d.ts +3 -0
- package/dist-pkg/build/manifest.js +23 -0
- package/dist-pkg/build/parity.d.ts +32 -0
- package/dist-pkg/build/parity.js +71 -0
- package/dist-pkg/build/plugin.d.ts +11 -0
- package/dist-pkg/build/plugin.js +8 -0
- package/dist-pkg/build/readiness.d.ts +11 -0
- package/dist-pkg/build/readiness.js +18 -0
- package/dist-pkg/build/route-client-transform.d.ts +17 -0
- package/dist-pkg/build/route-client-transform.js +48 -0
- package/dist-pkg/build/route-metadata.d.ts +6 -0
- package/dist-pkg/build/route-metadata.js +8 -0
- package/dist-pkg/build/rpc-transform.d.ts +1 -0
- package/dist-pkg/build/rpc-transform.js +44 -0
- package/dist-pkg/build/server-bundle.d.ts +4 -0
- package/dist-pkg/build/server-bundle.js +261 -0
- package/dist-pkg/build/server-strip.d.ts +2 -0
- package/dist-pkg/build/server-strip.js +32 -0
- package/dist-pkg/build/ssg.d.ts +12 -0
- package/dist-pkg/build/ssg.js +36 -0
- package/dist-pkg/cli/bun-plugin.d.ts +2 -0
- package/dist-pkg/cli/bun-plugin.js +14 -0
- package/dist-pkg/cli/canonical-import-rewrite.d.ts +18 -0
- package/dist-pkg/cli/canonical-import-rewrite.js +94 -0
- package/dist-pkg/cli/canonical-imports.d.ts +8 -0
- package/dist-pkg/cli/canonical-imports.js +131 -0
- package/dist-pkg/cli/check-ast.d.ts +20 -0
- package/dist-pkg/cli/check-ast.js +126 -0
- package/dist-pkg/cli/cmd-ai.d.ts +4 -0
- package/dist-pkg/cli/cmd-ai.js +290 -0
- package/dist-pkg/cli/cmd-build.d.ts +12 -0
- package/dist-pkg/cli/cmd-build.js +198 -0
- package/dist-pkg/cli/cmd-check.d.ts +25 -0
- package/dist-pkg/cli/cmd-check.js +573 -0
- package/dist-pkg/cli/cmd-create.d.ts +6 -0
- package/dist-pkg/cli/cmd-create.js +600 -0
- package/dist-pkg/cli/cmd-deploy.d.ts +6 -0
- package/dist-pkg/cli/cmd-deploy.js +381 -0
- package/dist-pkg/cli/cmd-dev.d.ts +5 -0
- package/dist-pkg/cli/cmd-dev.js +5 -0
- package/dist-pkg/cli/cmd-docs.d.ts +50 -0
- package/dist-pkg/cli/cmd-docs.js +122 -0
- package/dist-pkg/cli/cmd-generate.d.ts +12 -0
- package/dist-pkg/cli/cmd-generate.js +320 -0
- package/dist-pkg/cli/cmd-migrate.d.ts +7 -0
- package/dist-pkg/cli/cmd-migrate.js +42 -0
- package/dist-pkg/cli/cmd-routes.d.ts +6 -0
- package/dist-pkg/cli/cmd-routes.js +24 -0
- package/dist-pkg/cli/cmd-start.d.ts +13 -0
- package/dist-pkg/cli/cmd-start.js +32 -0
- package/dist-pkg/cli/cmd-test.d.ts +20 -0
- package/dist-pkg/cli/cmd-test.js +103 -0
- package/dist-pkg/cli/cmd-typegen.d.ts +7 -0
- package/dist-pkg/cli/cmd-typegen.js +66 -0
- package/dist-pkg/cli/cmd-upgrade.d.ts +38 -0
- package/dist-pkg/cli/cmd-upgrade.js +232 -0
- package/dist-pkg/cli/context.d.ts +4 -0
- package/dist-pkg/cli/context.js +4 -0
- package/dist-pkg/cli/framework-md.d.ts +1 -0
- package/dist-pkg/cli/framework-md.js +391 -0
- package/dist-pkg/cli/index.d.ts +6 -0
- package/dist-pkg/cli/index.js +106 -0
- package/dist-pkg/cli/release-version.d.ts +2 -0
- package/dist-pkg/cli/release-version.js +33 -0
- package/dist-pkg/client.d.ts +16 -0
- package/dist-pkg/client.js +71 -0
- package/dist-pkg/compat.d.ts +1 -0
- package/dist-pkg/compat.js +1 -0
- package/dist-pkg/compiler/analysis-backend.d.ts +20 -0
- package/dist-pkg/compiler/analysis-backend.js +164 -0
- package/dist-pkg/compiler/backends/experimental-oxc.d.ts +6 -0
- package/dist-pkg/compiler/backends/experimental-oxc.js +9 -0
- package/dist-pkg/compiler/backends/oxc.d.ts +16 -0
- package/dist-pkg/compiler/backends/oxc.js +198 -0
- package/dist-pkg/compiler/backends/register.d.ts +7 -0
- package/dist-pkg/compiler/backends/register.js +22 -0
- package/dist-pkg/compiler/fixtures.d.ts +2 -0
- package/dist-pkg/compiler/fixtures.js +118 -0
- package/dist-pkg/compiler/init.d.ts +1 -0
- package/dist-pkg/compiler/init.js +6 -0
- package/dist-pkg/compiler/module-analysis.d.ts +13 -0
- package/dist-pkg/compiler/module-analysis.js +50 -0
- package/dist-pkg/compiler/parity.d.ts +35 -0
- package/dist-pkg/compiler/parity.js +89 -0
- package/dist-pkg/compiler/readiness.d.ts +11 -0
- package/dist-pkg/compiler/readiness.js +18 -0
- package/dist-pkg/compiler/route-facts.d.ts +34 -0
- package/dist-pkg/compiler/route-facts.js +75 -0
- package/dist-pkg/content/index.d.ts +27 -0
- package/dist-pkg/content/index.js +287 -0
- package/dist-pkg/db/index.d.ts +3 -0
- package/dist-pkg/db/index.js +6 -0
- package/dist-pkg/db/migrate.d.ts +7 -0
- package/dist-pkg/db/migrate.js +53 -0
- package/dist-pkg/db/postgres.d.ts +29 -0
- package/dist-pkg/db/postgres.js +59 -0
- package/dist-pkg/db/sqlite.d.ts +10 -0
- package/dist-pkg/db/sqlite.js +22 -0
- package/dist-pkg/deploy/cloudflare.d.ts +8 -0
- package/{src/deploy/cloudflare.ts → dist-pkg/deploy/cloudflare.js} +24 -26
- package/dist-pkg/deploy/conformance.d.ts +21 -0
- package/dist-pkg/deploy/conformance.js +98 -0
- package/dist-pkg/deploy/dockerfile.d.ts +3 -0
- package/{src/deploy/dockerfile.ts → dist-pkg/deploy/dockerfile.js} +8 -10
- package/dist-pkg/deploy/fly.d.ts +3 -0
- package/{src/deploy/fly.ts → dist-pkg/deploy/fly.js} +11 -12
- package/dist-pkg/deploy/index.d.ts +6 -0
- package/dist-pkg/deploy/index.js +26 -0
- package/dist-pkg/deploy/netlify.d.ts +2 -0
- package/{src/deploy/netlify.ts → dist-pkg/deploy/netlify.js} +17 -11
- package/dist-pkg/deploy/runtime.d.ts +2 -0
- package/dist-pkg/deploy/runtime.js +3 -0
- package/dist-pkg/deploy/vercel.d.ts +22 -0
- package/dist-pkg/deploy/vercel.js +53 -0
- package/dist-pkg/dev/error-overlay.d.ts +1 -0
- package/{src/dev/error-overlay.ts → dist-pkg/dev/error-overlay.js} +13 -23
- package/dist-pkg/dev/hmr.d.ts +30 -0
- package/dist-pkg/dev/hmr.js +86 -0
- package/dist-pkg/dev/partial-handler.d.ts +9 -0
- package/dist-pkg/dev/partial-handler.js +24 -0
- package/dist-pkg/dev/request-handler.d.ts +30 -0
- package/dist-pkg/dev/request-handler.js +67 -0
- package/dist-pkg/dev/watcher.d.ts +6 -0
- package/dist-pkg/dev/watcher.js +34 -0
- package/dist-pkg/dev.d.ts +11 -0
- package/dist-pkg/dev.js +268 -0
- package/dist-pkg/env/index.d.ts +3 -0
- package/dist-pkg/env/index.js +57 -0
- package/dist-pkg/errors/catalog.d.ts +9 -0
- package/{src/errors/catalog.ts → dist-pkg/errors/catalog.js} +8 -24
- package/dist-pkg/errors/formatter.d.ts +22 -0
- package/dist-pkg/errors/formatter.js +43 -0
- package/dist-pkg/errors/index.d.ts +2 -0
- package/dist-pkg/errors/index.js +2 -0
- package/dist-pkg/forms/action.d.ts +15 -0
- package/dist-pkg/forms/action.js +20 -0
- package/dist-pkg/forms/index.d.ts +4 -0
- package/dist-pkg/forms/index.js +12 -0
- package/dist-pkg/i18n/index.d.ts +61 -0
- package/dist-pkg/i18n/index.js +147 -0
- package/dist-pkg/index-client.d.ts +1 -0
- package/dist-pkg/index-client.js +1 -0
- package/dist-pkg/index.d.ts +32 -0
- package/dist-pkg/index.js +79 -0
- package/dist-pkg/jsx-runtime-client.d.ts +8 -0
- package/dist-pkg/jsx-runtime-client.js +1 -0
- package/dist-pkg/jsx-runtime.d.ts +13 -0
- package/dist-pkg/jsx-runtime.js +5 -0
- package/dist-pkg/jsx-types-html.d.ts +221 -0
- package/dist-pkg/jsx-types-html.js +0 -0
- package/dist-pkg/log/index.d.ts +8 -0
- package/dist-pkg/log/index.js +55 -0
- package/dist-pkg/plugins/drizzle.d.ts +16 -0
- package/dist-pkg/plugins/drizzle.js +50 -0
- package/dist-pkg/plugins/index.d.ts +62 -0
- package/dist-pkg/plugins/index.js +147 -0
- package/dist-pkg/plugins/lucia.d.ts +26 -0
- package/dist-pkg/plugins/lucia.js +63 -0
- package/dist-pkg/plugins/prisma.d.ts +14 -0
- package/dist-pkg/plugins/prisma.js +57 -0
- package/dist-pkg/plugins/resend.d.ts +21 -0
- package/dist-pkg/plugins/resend.js +45 -0
- package/dist-pkg/plugins/s3.d.ts +18 -0
- package/dist-pkg/plugins/s3.js +63 -0
- package/dist-pkg/plugins/stripe.d.ts +32 -0
- package/dist-pkg/plugins/stripe.js +69 -0
- package/dist-pkg/plugins/tailwind.d.ts +15 -0
- package/dist-pkg/plugins/tailwind.js +58 -0
- package/dist-pkg/prod.d.ts +21 -0
- package/dist-pkg/prod.js +347 -0
- package/dist-pkg/reactive/computed.d.ts +3 -0
- package/dist-pkg/reactive/computed.js +15 -0
- package/dist-pkg/reactive/data.d.ts +25 -0
- package/dist-pkg/reactive/data.js +56 -0
- package/dist-pkg/reactive/diagnostics.d.ts +100 -0
- package/dist-pkg/reactive/diagnostics.js +363 -0
- package/dist-pkg/reactive/effect.d.ts +3 -0
- package/dist-pkg/reactive/effect.js +6 -0
- package/dist-pkg/reactive/index.d.ts +9 -0
- package/dist-pkg/reactive/index.js +18 -0
- package/dist-pkg/reactive/live.d.ts +15 -0
- package/dist-pkg/reactive/live.js +58 -0
- package/dist-pkg/reactive/optimistic.d.ts +20 -0
- package/dist-pkg/reactive/optimistic.js +54 -0
- package/dist-pkg/reactive/resource.d.ts +25 -0
- package/dist-pkg/reactive/resource.js +97 -0
- package/dist-pkg/reactive/signal.d.ts +4 -0
- package/dist-pkg/reactive/signal.js +17 -0
- package/dist-pkg/reactive/store.d.ts +6 -0
- package/dist-pkg/reactive/store.js +19 -0
- package/dist-pkg/router/index.d.ts +2 -0
- package/dist-pkg/router/index.js +2 -0
- package/dist-pkg/router/matcher.d.ts +7 -0
- package/dist-pkg/router/matcher.js +40 -0
- package/dist-pkg/router/scanner.d.ts +14 -0
- package/dist-pkg/router/scanner.js +141 -0
- package/dist-pkg/routes/index.d.ts +1 -0
- package/dist-pkg/routes/index.js +10 -0
- package/dist-pkg/runtime/app-config.d.ts +26 -0
- package/dist-pkg/runtime/app-config.js +69 -0
- package/dist-pkg/runtime/client.d.ts +3 -0
- package/dist-pkg/runtime/client.js +31 -0
- package/dist-pkg/runtime/devtools.d.ts +64 -0
- package/dist-pkg/runtime/devtools.js +132 -0
- package/dist-pkg/runtime/error-boundary.d.ts +6 -0
- package/dist-pkg/runtime/error-boundary.js +17 -0
- package/dist-pkg/runtime/event-replay.d.ts +3 -0
- package/{src/runtime/event-replay.ts → dist-pkg/runtime/event-replay.js} +7 -22
- package/dist-pkg/runtime/event-source.d.ts +7 -0
- package/dist-pkg/runtime/event-source.js +24 -0
- package/dist-pkg/runtime/form.d.ts +24 -0
- package/dist-pkg/runtime/form.js +59 -0
- package/dist-pkg/runtime/head.d.ts +7 -0
- package/dist-pkg/runtime/head.js +90 -0
- package/dist-pkg/runtime/html-escape.d.ts +7 -0
- package/dist-pkg/runtime/html-escape.js +39 -0
- package/dist-pkg/runtime/hydration.d.ts +15 -0
- package/dist-pkg/runtime/hydration.js +103 -0
- package/dist-pkg/runtime/image.d.ts +49 -0
- package/dist-pkg/runtime/image.js +144 -0
- package/dist-pkg/runtime/index.d.ts +17 -0
- package/dist-pkg/runtime/index.js +59 -0
- package/dist-pkg/runtime/island-hydrator.d.ts +12 -0
- package/dist-pkg/runtime/island-hydrator.js +49 -0
- package/dist-pkg/runtime/island.d.ts +19 -0
- package/dist-pkg/runtime/island.js +36 -0
- package/dist-pkg/runtime/jsx-runtime.d.ts +12 -0
- package/dist-pkg/runtime/jsx-runtime.js +173 -0
- package/dist-pkg/runtime/link.d.ts +16 -0
- package/dist-pkg/runtime/link.js +47 -0
- package/dist-pkg/runtime/project.d.ts +37 -0
- package/dist-pkg/runtime/project.js +36 -0
- package/dist-pkg/runtime/renderable.d.ts +6 -0
- package/dist-pkg/runtime/renderable.js +0 -0
- package/dist-pkg/runtime/router.d.ts +47 -0
- package/dist-pkg/runtime/router.js +476 -0
- package/dist-pkg/runtime/server.d.ts +8 -0
- package/dist-pkg/runtime/server.js +71 -0
- package/dist-pkg/runtime/stream.d.ts +29 -0
- package/dist-pkg/runtime/stream.js +106 -0
- package/dist-pkg/runtime/suspense.d.ts +6 -0
- package/dist-pkg/runtime/suspense.js +16 -0
- package/dist-pkg/runtime/typed-routes.d.ts +24 -0
- package/dist-pkg/runtime/typed-routes.js +77 -0
- package/dist-pkg/runtime/validated-form.d.ts +40 -0
- package/dist-pkg/runtime/validated-form.js +120 -0
- package/dist-pkg/security/cors.d.ts +10 -0
- package/dist-pkg/security/cors.js +56 -0
- package/dist-pkg/security/csrf.d.ts +9 -0
- package/dist-pkg/security/csrf.js +53 -0
- package/dist-pkg/security/headers.d.ts +11 -0
- package/dist-pkg/security/headers.js +31 -0
- package/dist-pkg/security/index.d.ts +5 -0
- package/dist-pkg/security/index.js +5 -0
- package/dist-pkg/security/rate-limit.d.ts +10 -0
- package/dist-pkg/security/rate-limit.js +49 -0
- package/dist-pkg/security/redis-rate-limit.d.ts +14 -0
- package/dist-pkg/security/redis-rate-limit.js +23 -0
- package/dist-pkg/server/action.d.ts +21 -0
- package/dist-pkg/server/action.js +64 -0
- package/dist-pkg/server/cache-utils.d.ts +2 -0
- package/dist-pkg/server/cache-utils.js +26 -0
- package/dist-pkg/server/cache.d.ts +33 -0
- package/dist-pkg/server/cache.js +236 -0
- package/dist-pkg/server/compress.d.ts +2 -0
- package/dist-pkg/server/compress.js +49 -0
- package/dist-pkg/server/endpoint-execution.d.ts +28 -0
- package/dist-pkg/server/endpoint-execution.js +37 -0
- package/dist-pkg/server/etag.d.ts +3 -0
- package/dist-pkg/server/etag.js +18 -0
- package/dist-pkg/server/guard.d.ts +16 -0
- package/dist-pkg/server/guard.js +45 -0
- package/dist-pkg/server/html-shell.d.ts +12 -0
- package/dist-pkg/server/html-shell.js +52 -0
- package/dist-pkg/server/index.d.ts +36 -0
- package/dist-pkg/server/index.js +170 -0
- package/dist-pkg/server/jobs.d.ts +41 -0
- package/dist-pkg/server/jobs.js +81 -0
- package/dist-pkg/server/manifest.d.ts +19 -0
- package/dist-pkg/server/manifest.js +36 -0
- package/dist-pkg/server/middleware.d.ts +39 -0
- package/dist-pkg/server/middleware.js +122 -0
- package/dist-pkg/server/mime.d.ts +1 -0
- package/{src/server/mime.ts → dist-pkg/server/mime.js} +6 -17
- package/dist-pkg/server/not-found.d.ts +6 -0
- package/dist-pkg/server/not-found.js +24 -0
- package/dist-pkg/server/page-render.d.ts +29 -0
- package/dist-pkg/server/page-render.js +67 -0
- package/dist-pkg/server/partial-navigation.d.ts +4 -0
- package/dist-pkg/server/partial-navigation.js +16 -0
- package/dist-pkg/server/pipe.d.ts +9 -0
- package/dist-pkg/server/pipe.js +32 -0
- package/dist-pkg/server/redis-cache-store.d.ts +10 -0
- package/dist-pkg/server/redis-cache-store.js +73 -0
- package/dist-pkg/server/redis-client.d.ts +37 -0
- package/dist-pkg/server/redis-client.js +37 -0
- package/dist-pkg/server/request-policy.d.ts +55 -0
- package/dist-pkg/server/request-policy.js +216 -0
- package/dist-pkg/server/request-preflight.d.ts +23 -0
- package/dist-pkg/server/request-preflight.js +45 -0
- package/dist-pkg/server/request-security-policy.d.ts +17 -0
- package/dist-pkg/server/request-security-policy.js +34 -0
- package/dist-pkg/server/request-surface.d.ts +8 -0
- package/dist-pkg/server/request-surface.js +19 -0
- package/dist-pkg/server/route-request.d.ts +31 -0
- package/dist-pkg/server/route-request.js +112 -0
- package/dist-pkg/server/route-response.d.ts +22 -0
- package/dist-pkg/server/route-response.js +58 -0
- package/dist-pkg/server/rpc-hash.d.ts +2 -0
- package/dist-pkg/server/rpc-hash.js +7 -0
- package/dist-pkg/server/rpc-protocol.d.ts +22 -0
- package/dist-pkg/server/rpc-protocol.js +28 -0
- package/dist-pkg/server/rpc-utils.d.ts +2 -0
- package/dist-pkg/server/rpc-utils.js +26 -0
- package/dist-pkg/server/rpc.d.ts +20 -0
- package/dist-pkg/server/rpc.js +147 -0
- package/dist-pkg/server/runtime-dispatch.d.ts +19 -0
- package/dist-pkg/server/runtime-dispatch.js +67 -0
- package/dist-pkg/server/server-execution.d.ts +22 -0
- package/dist-pkg/server/server-execution.js +53 -0
- package/dist-pkg/server/sqlite-cache-store.d.ts +13 -0
- package/dist-pkg/server/sqlite-cache-store.js +88 -0
- package/dist-pkg/server/sse.d.ts +9 -0
- package/dist-pkg/server/sse.js +34 -0
- package/dist-pkg/server/static-file.d.ts +9 -0
- package/dist-pkg/server/static-file.js +43 -0
- package/dist-pkg/server/ws.d.ts +18 -0
- package/dist-pkg/server/ws.js +40 -0
- package/dist-pkg/server-entry.d.ts +19 -0
- package/dist-pkg/server-entry.js +93 -0
- package/dist-pkg/testing/index.d.ts +98 -0
- package/dist-pkg/testing/index.js +254 -0
- package/dist-pkg/types/index.d.ts +4 -0
- package/dist-pkg/types/index.js +4 -0
- package/dist-pkg/types/safe-html.d.ts +7 -0
- package/dist-pkg/types/safe-html.js +19 -0
- package/dist-pkg/types/safe-sql.d.ts +8 -0
- package/dist-pkg/types/safe-sql.js +14 -0
- package/dist-pkg/types/safe-url.d.ts +7 -0
- package/dist-pkg/types/safe-url.js +20 -0
- package/dist-pkg/types/user-input.d.ts +9 -0
- package/dist-pkg/types/user-input.js +3 -0
- package/dist-pkg/unsafe/index.d.ts +12 -0
- package/dist-pkg/unsafe/index.js +6 -0
- package/package.json +102 -44
- package/bin/gorsee.js +0 -14
- package/src/auth/index.ts +0 -178
- package/src/auth/redis-session-store.ts +0 -46
- package/src/auth/sqlite-session-store.ts +0 -98
- package/src/auth/store-utils.ts +0 -21
- package/src/build/client.ts +0 -139
- package/src/build/css-modules.ts +0 -69
- package/src/build/devalue-parse.ts +0 -2
- package/src/build/manifest.ts +0 -34
- package/src/build/route-metadata.ts +0 -12
- package/src/build/rpc-transform.ts +0 -62
- package/src/build/server-strip.ts +0 -87
- package/src/build/ssg.ts +0 -70
- package/src/cli/bun-plugin.ts +0 -58
- package/src/cli/cmd-build.ts +0 -153
- package/src/cli/cmd-check.ts +0 -239
- package/src/cli/cmd-create.ts +0 -328
- package/src/cli/cmd-deploy.ts +0 -149
- package/src/cli/cmd-dev.ts +0 -13
- package/src/cli/cmd-docs.ts +0 -152
- package/src/cli/cmd-generate.ts +0 -155
- package/src/cli/cmd-migrate.ts +0 -53
- package/src/cli/cmd-routes.ts +0 -36
- package/src/cli/cmd-start.ts +0 -30
- package/src/cli/cmd-test.ts +0 -129
- package/src/cli/cmd-typegen.ts +0 -93
- package/src/cli/cmd-upgrade.ts +0 -143
- package/src/cli/context.ts +0 -12
- package/src/cli/framework-md.ts +0 -223
- package/src/cli/index.ts +0 -107
- package/src/client.ts +0 -26
- package/src/db/index.ts +0 -2
- package/src/db/migrate.ts +0 -89
- package/src/db/sqlite.ts +0 -40
- package/src/deploy/index.ts +0 -31
- package/src/deploy/vercel.ts +0 -94
- package/src/dev/hmr.ts +0 -31
- package/src/dev/partial-handler.ts +0 -52
- package/src/dev/request-handler.ts +0 -127
- package/src/dev/watcher.ts +0 -48
- package/src/dev.ts +0 -208
- package/src/env/index.ts +0 -74
- package/src/errors/formatter.ts +0 -63
- package/src/errors/index.ts +0 -2
- package/src/i18n/index.ts +0 -72
- package/src/index-client.ts +0 -4
- package/src/index.ts +0 -43
- package/src/jsx-runtime-client.ts +0 -13
- package/src/jsx-runtime.ts +0 -20
- package/src/jsx-types-html.ts +0 -242
- package/src/log/index.ts +0 -44
- package/src/plugins/drizzle.ts +0 -84
- package/src/plugins/index.ts +0 -86
- package/src/plugins/lucia.ts +0 -111
- package/src/plugins/prisma.ts +0 -85
- package/src/plugins/resend.ts +0 -78
- package/src/plugins/s3.ts +0 -102
- package/src/plugins/stripe.ts +0 -133
- package/src/plugins/tailwind.ts +0 -92
- package/src/prod.ts +0 -252
- package/src/reactive/computed.ts +0 -7
- package/src/reactive/effect.ts +0 -7
- package/src/reactive/index.ts +0 -7
- package/src/reactive/live.ts +0 -97
- package/src/reactive/optimistic.ts +0 -83
- package/src/reactive/resource.ts +0 -138
- package/src/reactive/signal.ts +0 -20
- package/src/reactive/store.ts +0 -36
- package/src/router/index.ts +0 -2
- package/src/router/matcher.ts +0 -53
- package/src/router/scanner.ts +0 -206
- package/src/runtime/client.ts +0 -28
- package/src/runtime/error-boundary.ts +0 -35
- package/src/runtime/form.ts +0 -49
- package/src/runtime/head.ts +0 -113
- package/src/runtime/html-escape.ts +0 -30
- package/src/runtime/hydration.ts +0 -95
- package/src/runtime/image.ts +0 -48
- package/src/runtime/index.ts +0 -12
- package/src/runtime/island-hydrator.ts +0 -84
- package/src/runtime/island.ts +0 -88
- package/src/runtime/jsx-runtime.ts +0 -167
- package/src/runtime/link.ts +0 -45
- package/src/runtime/project.ts +0 -73
- package/src/runtime/router.ts +0 -224
- package/src/runtime/server.ts +0 -102
- package/src/runtime/stream.ts +0 -182
- package/src/runtime/suspense.ts +0 -37
- package/src/runtime/typed-routes.ts +0 -26
- package/src/runtime/validated-form.ts +0 -106
- package/src/security/cors.ts +0 -80
- package/src/security/csrf.ts +0 -85
- package/src/security/headers.ts +0 -50
- package/src/security/index.ts +0 -4
- package/src/security/rate-limit.ts +0 -80
- package/src/server/action.ts +0 -48
- package/src/server/cache-utils.ts +0 -23
- package/src/server/cache.ts +0 -125
- package/src/server/compress.ts +0 -60
- package/src/server/etag.ts +0 -23
- package/src/server/guard.ts +0 -69
- package/src/server/html-shell.ts +0 -69
- package/src/server/index.ts +0 -57
- package/src/server/manifest.ts +0 -36
- package/src/server/middleware.ts +0 -159
- package/src/server/not-found.ts +0 -35
- package/src/server/page-render.ts +0 -123
- package/src/server/pipe.ts +0 -46
- package/src/server/redis-cache-store.ts +0 -87
- package/src/server/redis-client.ts +0 -71
- package/src/server/request-preflight.ts +0 -45
- package/src/server/route-request.ts +0 -72
- package/src/server/rpc-hash.ts +0 -17
- package/src/server/rpc-utils.ts +0 -27
- package/src/server/rpc.ts +0 -177
- package/src/server/sqlite-cache-store.ts +0 -109
- package/src/server/sse.ts +0 -96
- package/src/server/static-file.ts +0 -63
- package/src/server/ws.ts +0 -56
- package/src/server-entry.ts +0 -36
- package/src/testing/index.ts +0 -74
- package/src/types/index.ts +0 -4
- package/src/types/safe-html.ts +0 -32
- package/src/types/safe-sql.ts +0 -28
- package/src/types/safe-url.ts +0 -40
- package/src/types/user-input.ts +0 -12
- package/src/unsafe/index.ts +0 -18
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { GORSEE_BUILD_BACKEND_ENV } from "./client-backend.js";
|
|
2
|
+
export interface BuildBackendReadiness {
|
|
3
|
+
envVar: typeof GORSEE_BUILD_BACKEND_ENV;
|
|
4
|
+
stableDefault: "rolldown";
|
|
5
|
+
preferredCanary: "experimental-rolldown";
|
|
6
|
+
selected: string;
|
|
7
|
+
resolvedFromEnv: string;
|
|
8
|
+
registered: string[];
|
|
9
|
+
experimental: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function getBuildBackendReadiness(env?: NodeJS.ProcessEnv): BuildBackendReadiness;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import {
|
|
2
|
+
GORSEE_BUILD_BACKEND_ENV,
|
|
3
|
+
getClientBuildBackend,
|
|
4
|
+
listClientBuildBackends,
|
|
5
|
+
resolveClientBuildBackendName
|
|
6
|
+
} from "./client-backend.js";
|
|
7
|
+
export function getBuildBackendReadiness(env = process.env) {
|
|
8
|
+
const registered = listClientBuildBackends();
|
|
9
|
+
return {
|
|
10
|
+
envVar: GORSEE_BUILD_BACKEND_ENV,
|
|
11
|
+
stableDefault: "rolldown",
|
|
12
|
+
preferredCanary: "experimental-rolldown",
|
|
13
|
+
selected: getClientBuildBackend().name,
|
|
14
|
+
resolvedFromEnv: resolveClientBuildBackendName(env),
|
|
15
|
+
registered,
|
|
16
|
+
experimental: registered.filter((name) => name.startsWith("experimental-"))
|
|
17
|
+
};
|
|
18
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare const SERVER_ONLY_MODULES: readonly ["gorsee/db", "gorsee/log"];
|
|
2
|
+
export declare const SERVER_STUB_MODULES: Record<string, string>;
|
|
3
|
+
export interface RouteClientTransformResult {
|
|
4
|
+
source: string;
|
|
5
|
+
removedLoader: boolean;
|
|
6
|
+
removedServerImports: number;
|
|
7
|
+
transformedServerCalls: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function stripRouteLoader(source: string): {
|
|
10
|
+
source: string;
|
|
11
|
+
removed: boolean;
|
|
12
|
+
};
|
|
13
|
+
export declare function stripServerOnlyImports(source: string): {
|
|
14
|
+
source: string;
|
|
15
|
+
removedCount: number;
|
|
16
|
+
};
|
|
17
|
+
export declare function applyRouteClientTransforms(source: string, filePath: string): RouteClientTransformResult;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { transformServerCalls } from "./rpc-transform.js";
|
|
2
|
+
export const SERVER_ONLY_MODULES = ["gorsee/db", "gorsee/log"], SERVER_STUB_MODULES = {
|
|
3
|
+
"gorsee/server": `export function server(fn) { return fn; }
|
|
4
|
+
export function middleware(fn) { return fn; }`
|
|
5
|
+
};
|
|
6
|
+
const SERVER_IMPORT_REGEXES = SERVER_ONLY_MODULES.map((mod) => new RegExp(`import\\s+.*?from\\s+["']${mod.replace("/", "\\/")}["'];?\\n?`, "g"));
|
|
7
|
+
export function stripRouteLoader(source) {
|
|
8
|
+
for (const hookName of ["load", "loader"]) {
|
|
9
|
+
const loaderRe = new RegExp(`export\\s+(async\\s+)?function\\s+${hookName}\\s*\\([^)]*\\)\\s*(\\{)`, "g"), match = loaderRe.exec(source);
|
|
10
|
+
if (!match)
|
|
11
|
+
continue;
|
|
12
|
+
const start = match.index;
|
|
13
|
+
let braces = 1, index = loaderRe.lastIndex;
|
|
14
|
+
while (index < source.length && braces > 0) {
|
|
15
|
+
if (source[index] === "{")
|
|
16
|
+
braces++;
|
|
17
|
+
else if (source[index] === "}")
|
|
18
|
+
braces--;
|
|
19
|
+
index++;
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
source: source.slice(0, start) + source.slice(index),
|
|
23
|
+
removed: !0
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
return { source, removed: !1 };
|
|
27
|
+
}
|
|
28
|
+
export function stripServerOnlyImports(source) {
|
|
29
|
+
let next = source, removedCount = 0;
|
|
30
|
+
for (const re of SERVER_IMPORT_REGEXES) {
|
|
31
|
+
re.lastIndex = 0;
|
|
32
|
+
const matches = [...next.matchAll(re)];
|
|
33
|
+
if (matches.length === 0)
|
|
34
|
+
continue;
|
|
35
|
+
removedCount += matches.length;
|
|
36
|
+
next = next.replace(re, "");
|
|
37
|
+
}
|
|
38
|
+
return { source: next, removedCount };
|
|
39
|
+
}
|
|
40
|
+
export function applyRouteClientTransforms(source, filePath) {
|
|
41
|
+
const loaderResult = stripRouteLoader(source), importResult = stripServerOnlyImports(loaderResult.source), rpcSource = transformServerCalls(importResult.source, filePath);
|
|
42
|
+
return {
|
|
43
|
+
source: rpcSource,
|
|
44
|
+
removedLoader: loaderResult.removed,
|
|
45
|
+
removedServerImports: importResult.removedCount,
|
|
46
|
+
transformedServerCalls: rpcSource !== importResult.source
|
|
47
|
+
};
|
|
48
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function transformServerCalls(source: string, filePath: string): string;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { hashRPC } from "../server/rpc-hash.js";
|
|
2
|
+
import { RPC_CONTENT_TYPE, RPC_PROTOCOL_VERSION } from "../server/rpc-protocol.js";
|
|
3
|
+
const DEVALUE_PARSE_MODULE = new URL("./devalue-parse.js", import.meta.url).pathname;
|
|
4
|
+
function stripTypeAnnotations(args) {
|
|
5
|
+
return args.split(",").map((arg) => {
|
|
6
|
+
return arg.trim().replace(/\s*:\s*[^,=]+$/, "").replace(/\s*:\s*[^,=]+(?=\s*=)/, "");
|
|
7
|
+
}).join(", ");
|
|
8
|
+
}
|
|
9
|
+
export function transformServerCalls(source, filePath) {
|
|
10
|
+
const matches = [...source.matchAll(/\bserver\s*\(\s*(?=async\s|function\s)/g)];
|
|
11
|
+
if (matches.length === 0)
|
|
12
|
+
return source;
|
|
13
|
+
let result = source;
|
|
14
|
+
for (let i = matches.length - 1;i >= 0; i--) {
|
|
15
|
+
const match = matches[i], start = match.index, id = hashRPC(filePath, i);
|
|
16
|
+
let depth = 0, end = start;
|
|
17
|
+
for (let j = start;j < source.length; j++)
|
|
18
|
+
if (source[j] === "(")
|
|
19
|
+
depth++;
|
|
20
|
+
else if (source[j] === ")") {
|
|
21
|
+
depth--;
|
|
22
|
+
if (depth === 0) {
|
|
23
|
+
end = j + 1;
|
|
24
|
+
break;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const argsMatch = source.slice(start + match[0].length, end - 1).match(/^(async\s+)?(?:\(([^)]*)\)|(\w+))\s*=>/), rawArgs = argsMatch ? argsMatch[2] ?? argsMatch[3] ?? "" : "", args = rawArgs ? stripTypeAnnotations(rawArgs) : "...args", stub = `(async (${args}) => {
|
|
28
|
+
const res = await fetch("/api/_rpc/${id}", {
|
|
29
|
+
method: "POST",
|
|
30
|
+
headers: { "Content-Type": "${RPC_CONTENT_TYPE}", "Accept": "${RPC_CONTENT_TYPE}" },
|
|
31
|
+
body: JSON.stringify({ v: ${RPC_PROTOCOL_VERSION}, args: [${args}] })
|
|
32
|
+
});
|
|
33
|
+
if (!res.ok) throw new Error("RPC failed: " + res.status);
|
|
34
|
+
const payload = await res.json();
|
|
35
|
+
if (!payload || payload.ok !== true || payload.v !== ${RPC_PROTOCOL_VERSION} || payload.encoding !== "devalue") {
|
|
36
|
+
throw new Error("RPC protocol mismatch");
|
|
37
|
+
}
|
|
38
|
+
return __gorseeDevalParse(payload.data);
|
|
39
|
+
})`;
|
|
40
|
+
result = result.slice(0, start) + stub + result.slice(end);
|
|
41
|
+
}
|
|
42
|
+
return `import { parse as __gorseeDevalParse } from "${DEVALUE_PARSE_MODULE}";
|
|
43
|
+
` + result;
|
|
44
|
+
}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { basename, join, relative, resolve } from "node:path";
|
|
3
|
+
import { mkdir, readFile, readdir, rename, rm, writeFile } from "node:fs/promises";
|
|
4
|
+
import ts from "typescript";
|
|
5
|
+
const FRAMEWORK_ROOT = resolve(import.meta.dir, "..");
|
|
6
|
+
function resolveFrameworkModule(stem) {
|
|
7
|
+
const tsPath = join(FRAMEWORK_ROOT, `${stem}.ts`);
|
|
8
|
+
if (existsSync(tsPath))
|
|
9
|
+
return tsPath;
|
|
10
|
+
const jsPath = join(FRAMEWORK_ROOT, `${stem}.js`);
|
|
11
|
+
if (existsSync(jsPath))
|
|
12
|
+
return jsPath;
|
|
13
|
+
return tsPath;
|
|
14
|
+
}
|
|
15
|
+
export async function buildServerArtifacts(cwd, distDir) {
|
|
16
|
+
const entryDir = join(cwd, ".gorsee", "server"), compiledAppDir = join(distDir, "server", "app"), runtimePathOverrides = {
|
|
17
|
+
routesDir: join(compiledAppDir, "routes"),
|
|
18
|
+
sharedDir: join(compiledAppDir, "shared"),
|
|
19
|
+
middlewareDir: join(compiledAppDir, "middleware"),
|
|
20
|
+
appConfigFile: join(compiledAppDir, "app.config.js")
|
|
21
|
+
};
|
|
22
|
+
await rm(entryDir, { recursive: !0, force: !0 });
|
|
23
|
+
await mkdir(entryDir, { recursive: !0 });
|
|
24
|
+
await compileServerAppForNode(cwd, compiledAppDir);
|
|
25
|
+
const prodEntry = join(entryDir, "prod-entry.ts"), prodNodeEntry = join(entryDir, "prod-node-entry.ts"), serverHandlerEntry = join(entryDir, "server-handler-entry.ts"), serverHandlerNodeEntry = join(entryDir, "server-handler-node-entry.ts"), workerEntry = join(entryDir, "worker-entry.ts");
|
|
26
|
+
await writeFile(prodEntry, createProdEntrySource(cwd, runtimePathOverrides), "utf-8");
|
|
27
|
+
await writeFile(prodNodeEntry, createProdNodeEntrySource(cwd, runtimePathOverrides), "utf-8");
|
|
28
|
+
await writeFile(serverHandlerEntry, createServerHandlerEntrySource(cwd, runtimePathOverrides), "utf-8");
|
|
29
|
+
await writeFile(serverHandlerNodeEntry, createServerHandlerNodeEntrySource(cwd, runtimePathOverrides), "utf-8");
|
|
30
|
+
await writeFile(workerEntry, createWorkerEntrySource(serverHandlerEntry), "utf-8");
|
|
31
|
+
await bundleServerEntry(prodEntry, join(distDir, "prod.js"));
|
|
32
|
+
await bundleServerEntry(prodNodeEntry, join(distDir, "prod-node.js"), "node");
|
|
33
|
+
await bundleServerEntry(serverHandlerEntry, join(distDir, "server-handler.js"));
|
|
34
|
+
await bundleServerEntry(serverHandlerNodeEntry, join(distDir, "server-handler-node.js"), "node");
|
|
35
|
+
await bundleServerEntry(workerEntry, join(distDir, "worker.js"));
|
|
36
|
+
return {
|
|
37
|
+
serverEntries: ["prod.js", "prod-node.js", "server-handler.js", "server-handler-node.js", "worker.js"]
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
async function bundleServerEntry(entrypoint, outfile, target = "bun") {
|
|
41
|
+
const outdir = join(dirnameOf(outfile), ".server-bundle");
|
|
42
|
+
await rm(outdir, { recursive: !0, force: !0 });
|
|
43
|
+
await mkdir(outdir, { recursive: !0 });
|
|
44
|
+
const result = await Bun.build({
|
|
45
|
+
entrypoints: [entrypoint],
|
|
46
|
+
outdir,
|
|
47
|
+
target,
|
|
48
|
+
format: "esm",
|
|
49
|
+
minify: !1,
|
|
50
|
+
sourcemap: "none",
|
|
51
|
+
naming: "[name].js"
|
|
52
|
+
});
|
|
53
|
+
if (!result.success) {
|
|
54
|
+
const message = result.logs.map((log) => log.message).join(`
|
|
55
|
+
`);
|
|
56
|
+
throw Error(message || `Server build failed for ${outfile}`);
|
|
57
|
+
}
|
|
58
|
+
const expectedName = `${basename(entrypoint).replace(/\.[^.]+$/, "")}.js`;
|
|
59
|
+
await rename(join(outdir, expectedName), outfile);
|
|
60
|
+
await rm(outdir, { recursive: !0, force: !0 });
|
|
61
|
+
}
|
|
62
|
+
function createProdEntrySource(cwd, pathOverrides) {
|
|
63
|
+
const prodModule = JSON.stringify(resolveFrameworkModule("prod")), projectCwd = JSON.stringify(cwd), serializedOverrides = JSON.stringify(pathOverrides, null, 2);
|
|
64
|
+
return `import {
|
|
65
|
+
createProductionFetchHandler as createBundledProductionFetchHandler,
|
|
66
|
+
startProductionServer as startBundledProductionServer,
|
|
67
|
+
} from ${prodModule}
|
|
68
|
+
|
|
69
|
+
const PROJECT_CWD = ${projectCwd}
|
|
70
|
+
const PATH_OVERRIDES = ${serializedOverrides}
|
|
71
|
+
|
|
72
|
+
export function createProductionFetchHandler(options = {}) {
|
|
73
|
+
return createBundledProductionFetchHandler({
|
|
74
|
+
cwd: PROJECT_CWD,
|
|
75
|
+
pathOverrides: PATH_OVERRIDES,
|
|
76
|
+
...options,
|
|
77
|
+
})
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function startProductionServer(options = {}) {
|
|
81
|
+
return startBundledProductionServer({
|
|
82
|
+
cwd: PROJECT_CWD,
|
|
83
|
+
pathOverrides: PATH_OVERRIDES,
|
|
84
|
+
...options,
|
|
85
|
+
})
|
|
86
|
+
}
|
|
87
|
+
`;
|
|
88
|
+
}
|
|
89
|
+
function createProdNodeEntrySource(cwd, pathOverrides) {
|
|
90
|
+
const prodModule = JSON.stringify(resolveFrameworkModule("prod")), projectCwd = JSON.stringify(cwd), serializedOverrides = JSON.stringify(pathOverrides, null, 2);
|
|
91
|
+
return `import {
|
|
92
|
+
createProductionFetchHandler as createBundledProductionFetchHandler,
|
|
93
|
+
startNodeProductionServer as startBundledNodeProductionServer,
|
|
94
|
+
} from ${prodModule}
|
|
95
|
+
|
|
96
|
+
const PROJECT_CWD = ${projectCwd}
|
|
97
|
+
const PATH_OVERRIDES = ${serializedOverrides}
|
|
98
|
+
|
|
99
|
+
export function createProductionFetchHandler(options = {}) {
|
|
100
|
+
return createBundledProductionFetchHandler({
|
|
101
|
+
cwd: PROJECT_CWD,
|
|
102
|
+
pathOverrides: PATH_OVERRIDES,
|
|
103
|
+
...options,
|
|
104
|
+
})
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export function startNodeProductionServer(options = {}) {
|
|
108
|
+
return startBundledNodeProductionServer({
|
|
109
|
+
cwd: PROJECT_CWD,
|
|
110
|
+
pathOverrides: PATH_OVERRIDES,
|
|
111
|
+
...options,
|
|
112
|
+
})
|
|
113
|
+
}
|
|
114
|
+
`;
|
|
115
|
+
}
|
|
116
|
+
function createServerHandlerEntrySource(cwd, pathOverrides) {
|
|
117
|
+
const prodModule = JSON.stringify(resolveFrameworkModule("prod")), projectCwd = JSON.stringify(cwd), serializedOverrides = JSON.stringify(pathOverrides, null, 2);
|
|
118
|
+
return `import { createProductionFetchHandler } from ${prodModule}
|
|
119
|
+
|
|
120
|
+
const PROJECT_CWD = ${projectCwd}
|
|
121
|
+
const PATH_OVERRIDES = ${serializedOverrides}
|
|
122
|
+
|
|
123
|
+
let cachedFetchHandlerPromise
|
|
124
|
+
|
|
125
|
+
async function getFetchHandler(options = {}) {
|
|
126
|
+
if (!cachedFetchHandlerPromise) {
|
|
127
|
+
cachedFetchHandlerPromise = createProductionFetchHandler({
|
|
128
|
+
cwd: PROJECT_CWD,
|
|
129
|
+
pathOverrides: PATH_OVERRIDES,
|
|
130
|
+
...options,
|
|
131
|
+
})
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return cachedFetchHandlerPromise
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export async function handleRequest(request, runtimeContext = {}, options = {}) {
|
|
138
|
+
const handler = await getFetchHandler(options)
|
|
139
|
+
const server = typeof runtimeContext?.requestIP === "function"
|
|
140
|
+
? { requestIP: (input) => runtimeContext.requestIP(input) }
|
|
141
|
+
: undefined
|
|
142
|
+
return handler(request, server)
|
|
143
|
+
}
|
|
144
|
+
`;
|
|
145
|
+
}
|
|
146
|
+
function createServerHandlerNodeEntrySource(cwd, pathOverrides) {
|
|
147
|
+
const prodModule = JSON.stringify(resolveFrameworkModule("prod")), projectCwd = JSON.stringify(cwd), serializedOverrides = JSON.stringify(pathOverrides, null, 2);
|
|
148
|
+
return `import { createProductionFetchHandler } from ${prodModule}
|
|
149
|
+
|
|
150
|
+
const PROJECT_CWD = ${projectCwd}
|
|
151
|
+
const PATH_OVERRIDES = ${serializedOverrides}
|
|
152
|
+
|
|
153
|
+
let cachedFetchHandlerPromise
|
|
154
|
+
|
|
155
|
+
async function getFetchHandler(options = {}) {
|
|
156
|
+
if (!cachedFetchHandlerPromise) {
|
|
157
|
+
cachedFetchHandlerPromise = createProductionFetchHandler({
|
|
158
|
+
cwd: PROJECT_CWD,
|
|
159
|
+
pathOverrides: PATH_OVERRIDES,
|
|
160
|
+
...options,
|
|
161
|
+
})
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
return cachedFetchHandlerPromise
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export async function handleRequest(request, runtimeContext = {}, options = {}) {
|
|
168
|
+
const handler = await getFetchHandler(options)
|
|
169
|
+
const server = typeof runtimeContext?.requestIP === "function"
|
|
170
|
+
? { requestIP: (input) => runtimeContext.requestIP(input) }
|
|
171
|
+
: undefined
|
|
172
|
+
return handler(request, server)
|
|
173
|
+
}
|
|
174
|
+
`;
|
|
175
|
+
}
|
|
176
|
+
function createWorkerEntrySource(serverHandlerEntry) {
|
|
177
|
+
return `import { handleRequest } from ${JSON.stringify(serverHandlerEntry)}
|
|
178
|
+
|
|
179
|
+
export default {
|
|
180
|
+
async fetch(request, env, ctx) {
|
|
181
|
+
void ctx
|
|
182
|
+
return handleRequest(request, env)
|
|
183
|
+
},
|
|
184
|
+
}
|
|
185
|
+
`;
|
|
186
|
+
}
|
|
187
|
+
function dirnameOf(path) {
|
|
188
|
+
const index = Math.max(path.lastIndexOf("/"), path.lastIndexOf("\\"));
|
|
189
|
+
return index >= 0 ? path.slice(0, index) : ".";
|
|
190
|
+
}
|
|
191
|
+
function replaceExtension(path, extension) {
|
|
192
|
+
return path.replace(/\.[^.]+$/, extension);
|
|
193
|
+
}
|
|
194
|
+
const SERVER_APP_EXTENSIONS = new Set([".ts", ".tsx", ".js", ".jsx", ".mjs"]), SERVER_APP_IGNORED_DIRS = new Set([".git", ".gorsee", "dist", "node_modules", "public"]);
|
|
195
|
+
async function compileServerAppForNode(cwd, outdir) {
|
|
196
|
+
await rm(outdir, { recursive: !0, force: !0 });
|
|
197
|
+
await mkdir(outdir, { recursive: !0 });
|
|
198
|
+
const entrypoints = await collectServerAppEntrypoints(cwd);
|
|
199
|
+
if (entrypoints.length === 0)
|
|
200
|
+
return;
|
|
201
|
+
for (const entrypoint of entrypoints) {
|
|
202
|
+
const rel = relative(cwd, entrypoint), source = await readFile(entrypoint, "utf-8"), rewritten = rewriteServerRuntimeSpecifiers(source, entrypoint), targetPath = join(outdir, replaceExtension(rel, ".js"));
|
|
203
|
+
await mkdir(dirnameOf(targetPath), { recursive: !0 });
|
|
204
|
+
await writeFile(targetPath, transpileServerRuntimeSource(entrypoint, rewritten), "utf-8");
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
async function collectServerAppEntrypoints(root, dir = root) {
|
|
208
|
+
const entries = await readdir(dir, { withFileTypes: !0 }).catch(() => []), files = [];
|
|
209
|
+
for (const entry of entries) {
|
|
210
|
+
if (SERVER_APP_IGNORED_DIRS.has(entry.name))
|
|
211
|
+
continue;
|
|
212
|
+
const fullPath = join(dir, entry.name);
|
|
213
|
+
if (entry.isDirectory()) {
|
|
214
|
+
files.push(...await collectServerAppEntrypoints(root, fullPath));
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
const extIndex = entry.name.lastIndexOf("."), ext = extIndex >= 0 ? entry.name.slice(extIndex) : "";
|
|
218
|
+
if (!SERVER_APP_EXTENSIONS.has(ext))
|
|
219
|
+
continue;
|
|
220
|
+
const rel = relative(root, fullPath);
|
|
221
|
+
if (rel.startsWith("tests/") || rel.startsWith("examples/") || rel.startsWith("benchmarks/"))
|
|
222
|
+
continue;
|
|
223
|
+
files.push(fullPath);
|
|
224
|
+
}
|
|
225
|
+
return files.sort((left, right) => left.localeCompare(right));
|
|
226
|
+
}
|
|
227
|
+
function transpileServerRuntimeSource(path, source) {
|
|
228
|
+
if (path.endsWith(".tsx") || path.endsWith(".ts"))
|
|
229
|
+
return ts.transpileModule(source, {
|
|
230
|
+
fileName: path,
|
|
231
|
+
compilerOptions: {
|
|
232
|
+
module: ts.ModuleKind.ESNext,
|
|
233
|
+
target: ts.ScriptTarget.ES2022,
|
|
234
|
+
jsx: path.endsWith(".tsx") ? ts.JsxEmit.ReactJSX : void 0,
|
|
235
|
+
jsxImportSource: path.endsWith(".tsx") ? "gorsee" : void 0
|
|
236
|
+
}
|
|
237
|
+
}).outputText;
|
|
238
|
+
return source;
|
|
239
|
+
}
|
|
240
|
+
function rewriteServerRuntimeSpecifiers(source, filePath) {
|
|
241
|
+
return source.replace(/((?:from\s*|import\s*\()\s*["'])(\.\.?\/[^"']+?)(["'])/g, (full, prefix, specifier, suffix) => {
|
|
242
|
+
const rewritten = resolveServerRuntimeSpecifier(filePath, specifier);
|
|
243
|
+
return `${prefix}${rewritten}${suffix}`;
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
function resolveServerRuntimeSpecifier(filePath, specifier) {
|
|
247
|
+
if (!specifier.startsWith("."))
|
|
248
|
+
return specifier;
|
|
249
|
+
if (/\.(?:css|json|svg|png|jpg|jpeg|gif|webp|woff2?)$/.test(specifier))
|
|
250
|
+
return specifier;
|
|
251
|
+
if (/\.(?:[cm]?js|jsx|[cm]?ts|tsx)$/.test(specifier))
|
|
252
|
+
return specifier.replace(/\.(?:[cm]?js|jsx|[cm]?ts|tsx)$/, ".js");
|
|
253
|
+
const resolvedBase = resolve(dirnameOf(filePath), specifier);
|
|
254
|
+
for (const ext of [".ts", ".tsx", ".js", ".jsx", ".mjs"])
|
|
255
|
+
if (existsSync(`${resolvedBase}${ext}`))
|
|
256
|
+
return `${specifier}.js`;
|
|
257
|
+
for (const ext of [".ts", ".tsx", ".js", ".jsx", ".mjs"])
|
|
258
|
+
if (existsSync(join(resolvedBase, `index${ext}`)))
|
|
259
|
+
return `${specifier}/index.js`;
|
|
260
|
+
return specifier;
|
|
261
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SERVER_ONLY_MODULES,
|
|
3
|
+
SERVER_STUB_MODULES,
|
|
4
|
+
applyRouteClientTransforms
|
|
5
|
+
} from "./route-client-transform.js";
|
|
6
|
+
export const serverStripPlugin = {
|
|
7
|
+
name: "gorsee-server-strip",
|
|
8
|
+
setup(build) {
|
|
9
|
+
for (const mod of SERVER_ONLY_MODULES)
|
|
10
|
+
build.onResolve({ filter: new RegExp(`^${mod.replace("/", "\\/")}$`) }, () => ({
|
|
11
|
+
path: mod,
|
|
12
|
+
namespace: "gorsee-empty"
|
|
13
|
+
}));
|
|
14
|
+
build.onLoad({ filter: /.*/, namespace: "gorsee-empty" }, () => ({
|
|
15
|
+
contents: "export default {}",
|
|
16
|
+
loader: "js"
|
|
17
|
+
}));
|
|
18
|
+
for (const mod of Object.keys(SERVER_STUB_MODULES))
|
|
19
|
+
build.onResolve({ filter: new RegExp(`^${mod.replace("/", "\\/")}$`) }, () => ({
|
|
20
|
+
path: mod,
|
|
21
|
+
namespace: "gorsee-stub"
|
|
22
|
+
}));
|
|
23
|
+
build.onLoad({ filter: /.*/, namespace: "gorsee-stub" }, (args) => ({
|
|
24
|
+
contents: SERVER_STUB_MODULES[args.path] ?? "export default {}",
|
|
25
|
+
loader: "js"
|
|
26
|
+
}));
|
|
27
|
+
build.onLoad({ filter: /routes\/.*\.tsx?$/ }, async (args) => {
|
|
28
|
+
const source = await Bun.file(args.path).text();
|
|
29
|
+
return { contents: applyRouteClientTransforms(source, args.path).source, loader: args.path.endsWith(".tsx") ? "tsx" : "ts" };
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type HTMLWrapOptions } from "../server/html-shell.js";
|
|
2
|
+
export interface SSGResult {
|
|
3
|
+
pages: Map<string, string>;
|
|
4
|
+
errors: string[];
|
|
5
|
+
}
|
|
6
|
+
interface SSGOptions {
|
|
7
|
+
routesDir: string;
|
|
8
|
+
outDir: string;
|
|
9
|
+
wrapHTML?: (body: string, options?: HTMLWrapOptions) => string;
|
|
10
|
+
}
|
|
11
|
+
export declare function generateStaticPages(options: SSGOptions): Promise<SSGResult>;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { createRouter } from "../router/scanner.js";
|
|
2
|
+
import { createContext } from "../server/middleware.js";
|
|
3
|
+
import { renderPageDocument, resolvePageRoute } from "../server/page-render.js";
|
|
4
|
+
import { wrapHTML } from "../server/html-shell.js";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
7
|
+
export async function generateStaticPages(options) {
|
|
8
|
+
const { routesDir, outDir, wrapHTML } = options, routes = await createRouter(routesDir), pages = new Map, errors = [];
|
|
9
|
+
for (const route of routes) {
|
|
10
|
+
if (route.isDynamic)
|
|
11
|
+
continue;
|
|
12
|
+
try {
|
|
13
|
+
const mod = await import(route.filePath);
|
|
14
|
+
if (!mod.prerender)
|
|
15
|
+
continue;
|
|
16
|
+
const fakeRequest = new Request(`http://localhost${route.path}`), ctx = createContext(fakeRequest, {}), resolved = await resolvePageRoute(mod, { route, params: {} }, ctx);
|
|
17
|
+
if (!resolved)
|
|
18
|
+
continue;
|
|
19
|
+
const rendered = renderPageDocument(resolved.pageComponent, ctx, {}, resolved.loaderData), html = (wrapHTML ?? defaultWrapHTML)(rendered.html, {
|
|
20
|
+
title: rendered.title,
|
|
21
|
+
loaderData: resolved.loaderData,
|
|
22
|
+
headElements: rendered.headElements,
|
|
23
|
+
cssFiles: resolved.cssFiles
|
|
24
|
+
}), outPath = route.path === "/" ? join(outDir, "index.html") : join(outDir, route.path, "index.html");
|
|
25
|
+
await mkdir(join(outPath, ".."), { recursive: !0 });
|
|
26
|
+
await writeFile(outPath, html);
|
|
27
|
+
pages.set(route.path, outPath);
|
|
28
|
+
} catch (err) {
|
|
29
|
+
errors.push(`${route.path}: ${err instanceof Error ? err.message : String(err)}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return { pages, errors };
|
|
33
|
+
}
|
|
34
|
+
function defaultWrapHTML(body, options = {}) {
|
|
35
|
+
return wrapHTML(body, void 0, options);
|
|
36
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { plugin } from "bun";
|
|
2
|
+
import { resolveFrameworkImport as resolveFrameworkImportImpl } from "../build/framework-imports.js";
|
|
3
|
+
export const resolveFrameworkImport = resolveFrameworkImportImpl;
|
|
4
|
+
plugin({
|
|
5
|
+
name: "gorsee-resolve",
|
|
6
|
+
setup(build) {
|
|
7
|
+
build.onResolve({ filter: /^gorsee(\/.*)?$/ }, (args) => {
|
|
8
|
+
const mapped = resolveFrameworkImport(args.path);
|
|
9
|
+
if (mapped)
|
|
10
|
+
return { path: mapped };
|
|
11
|
+
return;
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface CanonicalRewriteResult {
|
|
2
|
+
changed: boolean;
|
|
3
|
+
source: string;
|
|
4
|
+
}
|
|
5
|
+
export interface CanonicalRewriteReport {
|
|
6
|
+
changedFiles: string[];
|
|
7
|
+
}
|
|
8
|
+
export interface LoaderRewriteResult {
|
|
9
|
+
changed: boolean;
|
|
10
|
+
source: string;
|
|
11
|
+
}
|
|
12
|
+
export interface LoaderRewriteReport {
|
|
13
|
+
changedFiles: string[];
|
|
14
|
+
}
|
|
15
|
+
export declare function rewriteCanonicalImports(source: string): CanonicalRewriteResult;
|
|
16
|
+
export declare function rewriteCanonicalImportsInProject(cwd: string): Promise<CanonicalRewriteReport>;
|
|
17
|
+
export declare function rewriteLegacyLoaders(source: string): LoaderRewriteResult;
|
|
18
|
+
export declare function rewriteLegacyLoadersInProject(cwd: string): Promise<LoaderRewriteReport>;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { readFile, readdir, stat, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join, relative } from "node:path";
|
|
3
|
+
import { CLIENT_SCOPED_IMPORTS, SERVER_SCOPED_IMPORTS } from "./canonical-imports.js";
|
|
4
|
+
const IMPORT_RE = /import\s*\{([\s\S]*?)\}\s*from\s*(["'])(gorsee\/(?:server|client))\2/g;
|
|
5
|
+
export function rewriteCanonicalImports(source) {
|
|
6
|
+
let changed = !1;
|
|
7
|
+
const rewritten = source.replace(IMPORT_RE, (statement, bindings, _quote, specifier) => {
|
|
8
|
+
const scopedMap = specifier === "gorsee/server" ? SERVER_SCOPED_IMPORTS : CLIENT_SCOPED_IMPORTS, parsed = parseBindings(bindings), kept = [], moved = new Map;
|
|
9
|
+
for (const binding of parsed) {
|
|
10
|
+
const target = scopedMap.get(binding.importedName);
|
|
11
|
+
if (!target) {
|
|
12
|
+
kept.push(binding.raw);
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
const bucket = moved.get(target) ?? [];
|
|
16
|
+
bucket.push(binding.raw);
|
|
17
|
+
moved.set(target, bucket);
|
|
18
|
+
}
|
|
19
|
+
if (moved.size === 0)
|
|
20
|
+
return statement;
|
|
21
|
+
changed = !0;
|
|
22
|
+
const rewrittenImports = [];
|
|
23
|
+
if (kept.length > 0)
|
|
24
|
+
rewrittenImports.push(renderImport(specifier, kept));
|
|
25
|
+
for (const target of [...moved.keys()].sort())
|
|
26
|
+
rewrittenImports.push(renderImport(target, moved.get(target) ?? []));
|
|
27
|
+
return rewrittenImports.join(`
|
|
28
|
+
`);
|
|
29
|
+
});
|
|
30
|
+
return { changed, source: rewritten };
|
|
31
|
+
}
|
|
32
|
+
export async function rewriteCanonicalImportsInProject(cwd) {
|
|
33
|
+
const sourceFiles = [
|
|
34
|
+
...await getAllSourceFiles(cwd, "routes"),
|
|
35
|
+
...await getAllSourceFiles(cwd, "shared"),
|
|
36
|
+
...await getAllSourceFiles(cwd, "middleware")
|
|
37
|
+
], changedFiles = [];
|
|
38
|
+
for (const file of sourceFiles) {
|
|
39
|
+
const source = await readFile(file, "utf-8"), rewritten = rewriteCanonicalImports(source);
|
|
40
|
+
if (!rewritten.changed || rewritten.source === source)
|
|
41
|
+
continue;
|
|
42
|
+
await writeFile(file, rewritten.source, "utf-8");
|
|
43
|
+
changedFiles.push(relative(cwd, file));
|
|
44
|
+
}
|
|
45
|
+
changedFiles.sort();
|
|
46
|
+
return { changedFiles };
|
|
47
|
+
}
|
|
48
|
+
export function rewriteLegacyLoaders(source) {
|
|
49
|
+
const rewritten = source.replace(/\bexport\s+async\s+function\s+loader\b/g, "export async function load").replace(/\bexport\s+function\s+loader\b/g, "export function load").replace(/\bexport\s+const\s+loader\b/g, "export const load");
|
|
50
|
+
return { changed: rewritten !== source, source: rewritten };
|
|
51
|
+
}
|
|
52
|
+
export async function rewriteLegacyLoadersInProject(cwd) {
|
|
53
|
+
const sourceFiles = [
|
|
54
|
+
...await getAllSourceFiles(cwd, "routes"),
|
|
55
|
+
...await getAllSourceFiles(cwd, "shared"),
|
|
56
|
+
...await getAllSourceFiles(cwd, "middleware")
|
|
57
|
+
], changedFiles = [];
|
|
58
|
+
for (const file of sourceFiles) {
|
|
59
|
+
const source = await readFile(file, "utf-8"), rewritten = rewriteLegacyLoaders(source);
|
|
60
|
+
if (!rewritten.changed || rewritten.source === source)
|
|
61
|
+
continue;
|
|
62
|
+
await writeFile(file, rewritten.source, "utf-8");
|
|
63
|
+
changedFiles.push(relative(cwd, file));
|
|
64
|
+
}
|
|
65
|
+
changedFiles.sort();
|
|
66
|
+
return { changedFiles };
|
|
67
|
+
}
|
|
68
|
+
async function getAllSourceFiles(cwd, dir) {
|
|
69
|
+
const path = join(cwd, dir);
|
|
70
|
+
try {
|
|
71
|
+
const entries = await readdir(path), files = [];
|
|
72
|
+
for (const entry of entries) {
|
|
73
|
+
if (entry === "node_modules" || entry === "dist" || entry === ".git")
|
|
74
|
+
continue;
|
|
75
|
+
const fullPath = join(path, entry);
|
|
76
|
+
if ((await stat(fullPath)).isDirectory())
|
|
77
|
+
files.push(...await getAllSourceFiles(cwd, relative(cwd, fullPath)));
|
|
78
|
+
else if (entry.endsWith(".ts") || entry.endsWith(".tsx"))
|
|
79
|
+
files.push(fullPath);
|
|
80
|
+
}
|
|
81
|
+
return files;
|
|
82
|
+
} catch {
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function renderImport(specifier, bindings) {
|
|
87
|
+
return `import { ${bindings.join(", ")} } from "${specifier}"`;
|
|
88
|
+
}
|
|
89
|
+
function parseBindings(bindings) {
|
|
90
|
+
return bindings.split(",").map((entry) => entry.trim()).filter(Boolean).map((raw) => {
|
|
91
|
+
const importedName = (raw.startsWith("type ") ? raw.slice(5).trim() : raw).split(/\s+as\s+/)[0].trim();
|
|
92
|
+
return { raw, importedName };
|
|
93
|
+
});
|
|
94
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ModuleImportFact } from "../compiler/module-analysis.js";
|
|
2
|
+
export declare const SERVER_SCOPED_IMPORTS: Map<string, string>;
|
|
3
|
+
export declare const CLIENT_SCOPED_IMPORTS: Map<string, string>;
|
|
4
|
+
export interface CanonicalImportDrift {
|
|
5
|
+
source: "gorsee/server" | "gorsee/client";
|
|
6
|
+
replacements: Map<string, string>;
|
|
7
|
+
}
|
|
8
|
+
export declare function collectCanonicalImportDrift(imports: ModuleImportFact[]): CanonicalImportDrift[];
|