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,320 @@
|
|
|
1
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { createMigration } from "../db/migrate.js";
|
|
4
|
+
import { createProjectContext } from "../runtime/project.js";
|
|
5
|
+
function capitalize(s) {
|
|
6
|
+
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
7
|
+
}
|
|
8
|
+
function singularize(s) {
|
|
9
|
+
if (s.endsWith("ies"))
|
|
10
|
+
return s.slice(0, -3) + "y";
|
|
11
|
+
if (s.endsWith("ses") || s.endsWith("xes") || s.endsWith("zes"))
|
|
12
|
+
return s.slice(0, -2);
|
|
13
|
+
if (s.endsWith("s") && !s.endsWith("ss"))
|
|
14
|
+
return s.slice(0, -1);
|
|
15
|
+
return s;
|
|
16
|
+
}
|
|
17
|
+
function repoImportPath(entity) {
|
|
18
|
+
return `../../shared/${entity}.ts`;
|
|
19
|
+
}
|
|
20
|
+
export function parseGenerateFlags(args) {
|
|
21
|
+
const positional = [];
|
|
22
|
+
let data = null;
|
|
23
|
+
for (let index = 0;index < args.length; index += 1) {
|
|
24
|
+
const arg = args[index];
|
|
25
|
+
if (arg === "--data" && args[index + 1]) {
|
|
26
|
+
const value = args[++index];
|
|
27
|
+
if (value === "memory" || value === "sqlite" || value === "postgres")
|
|
28
|
+
data = value;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
positional.push(arg);
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
entity: positional[0] ?? null,
|
|
35
|
+
data
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async function inferGenerateDataMode(cwd) {
|
|
39
|
+
try {
|
|
40
|
+
const appConfig = await readFile(join(cwd, "app.config.ts"), "utf-8");
|
|
41
|
+
if (/driver\s*:\s*"postgres"/.test(appConfig) || /driver\s*:\s*'postgres'/.test(appConfig))
|
|
42
|
+
return "postgres";
|
|
43
|
+
if (/driver\s*:\s*"sqlite"/.test(appConfig) || /driver\s*:\s*'sqlite'/.test(appConfig))
|
|
44
|
+
return "sqlite";
|
|
45
|
+
} catch {}
|
|
46
|
+
return "memory";
|
|
47
|
+
}
|
|
48
|
+
function listRoute(entity, singular) {
|
|
49
|
+
const cap = capitalize(singular), routesName = `${singular}Routes`;
|
|
50
|
+
return `import { Head, Link } from "gorsee/client"
|
|
51
|
+
import { list${cap}s, ${routesName} } from "${repoImportPath(entity)}"
|
|
52
|
+
|
|
53
|
+
export async function load() {
|
|
54
|
+
return { ${entity}: await list${cap}s() }
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export default function ${capitalize(entity)}ListPage(props: { data: { ${entity}: { id: number; title: string }[] } }) {
|
|
58
|
+
return (
|
|
59
|
+
<div>
|
|
60
|
+
<Head><title>${capitalize(entity)}</title></Head>
|
|
61
|
+
<h1>${capitalize(entity)}</h1>
|
|
62
|
+
<Link href={${routesName}.create}>Create New ${cap}</Link>
|
|
63
|
+
<ul>
|
|
64
|
+
{props.data.${entity}.map((item) => (
|
|
65
|
+
<li>
|
|
66
|
+
<Link href={${routesName}.detail} params={{ id: String(item.id) }}>{item.title}</Link>
|
|
67
|
+
</li>
|
|
68
|
+
))}
|
|
69
|
+
</ul>
|
|
70
|
+
</div>
|
|
71
|
+
)
|
|
72
|
+
}
|
|
73
|
+
`;
|
|
74
|
+
}
|
|
75
|
+
function detailRoute(entity, singular) {
|
|
76
|
+
const cap = capitalize(singular), routesName = `${singular}Routes`;
|
|
77
|
+
return `import { Head, Link } from "gorsee/client"
|
|
78
|
+
import { get${cap}ById, ${routesName} } from "${repoImportPath(entity)}"
|
|
79
|
+
import type { Context } from "gorsee/server"
|
|
80
|
+
|
|
81
|
+
export async function load(ctx: Context) {
|
|
82
|
+
const id = Number(ctx.params.id)
|
|
83
|
+
const ${singular} = await get${cap}ById(id)
|
|
84
|
+
if (!${singular}) {
|
|
85
|
+
throw new Error("${cap} not found")
|
|
86
|
+
}
|
|
87
|
+
return { ${singular} }
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export default function ${cap}DetailPage(props: { data: { ${singular}: { id: number; title: string } } }) {
|
|
91
|
+
const item = props.data.${singular}
|
|
92
|
+
return (
|
|
93
|
+
<div>
|
|
94
|
+
<Head><title>{item.title}</title></Head>
|
|
95
|
+
<h1>{item.title}</h1>
|
|
96
|
+
<Link href={${routesName}.list}>Back to ${capitalize(entity)}</Link>
|
|
97
|
+
</div>
|
|
98
|
+
)
|
|
99
|
+
}
|
|
100
|
+
`;
|
|
101
|
+
}
|
|
102
|
+
function newRoute(entity, singular) {
|
|
103
|
+
const cap = capitalize(singular), formName = `${singular}Form`, routesName = `${singular}Routes`;
|
|
104
|
+
return `import { Head, Link } from "gorsee/client"
|
|
105
|
+
import { defineFormAction, fieldAttrs } from "gorsee/forms"
|
|
106
|
+
import { create${cap}, ${formName}, ${routesName} } from "${repoImportPath(entity)}"
|
|
107
|
+
|
|
108
|
+
export const action = defineFormAction(${formName}, async ({ ctx, data }) => {
|
|
109
|
+
await create${cap}(data.title)
|
|
110
|
+
return ctx.redirect(${routesName}.list.build())
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
export default function New${cap}Page() {
|
|
114
|
+
const titleField = ${formName}.fields[0]!
|
|
115
|
+
|
|
116
|
+
return (
|
|
117
|
+
<div>
|
|
118
|
+
<Head><title>New ${cap}</title></Head>
|
|
119
|
+
<h1>New ${cap}</h1>
|
|
120
|
+
<form method="POST">
|
|
121
|
+
<label>
|
|
122
|
+
Title:
|
|
123
|
+
<input {...fieldAttrs(titleField)} />
|
|
124
|
+
</label>
|
|
125
|
+
<button type="submit">Create</button>
|
|
126
|
+
</form>
|
|
127
|
+
<Link href={${routesName}.list}>Cancel</Link>
|
|
128
|
+
</div>
|
|
129
|
+
)
|
|
130
|
+
}
|
|
131
|
+
`;
|
|
132
|
+
}
|
|
133
|
+
function repositorySharedPrelude(entity, singular) {
|
|
134
|
+
const cap = capitalize(singular), routesName = `${singular}Routes`, formName = `${singular}Form`;
|
|
135
|
+
return `import { defineForm } from "gorsee/forms"
|
|
136
|
+
import { createTypedRoute } from "gorsee/routes"
|
|
137
|
+
|
|
138
|
+
export interface ${cap}Record {
|
|
139
|
+
id: number
|
|
140
|
+
title: string
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export const ${routesName} = {
|
|
144
|
+
list: createTypedRoute("/${entity}"),
|
|
145
|
+
detail: createTypedRoute("/${entity}/[id]"),
|
|
146
|
+
create: createTypedRoute("/${entity}/new"),
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export const ${formName} = defineForm<{ title: string }>([
|
|
150
|
+
{
|
|
151
|
+
name: "title",
|
|
152
|
+
label: "Title",
|
|
153
|
+
rules: {
|
|
154
|
+
required: true,
|
|
155
|
+
minLength: 2,
|
|
156
|
+
maxLength: 120,
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
])
|
|
160
|
+
|
|
161
|
+
`;
|
|
162
|
+
}
|
|
163
|
+
function repositoryMemoryModule(entity, singular) {
|
|
164
|
+
const cap = capitalize(singular);
|
|
165
|
+
return `${repositorySharedPrelude(entity, singular)}const ${entity}: ${cap}Record[] = [
|
|
166
|
+
{ id: 1, title: "First ${cap}" },
|
|
167
|
+
{ id: 2, title: "Second ${cap}" },
|
|
168
|
+
]
|
|
169
|
+
|
|
170
|
+
export async function list${cap}s(): Promise<${cap}Record[]> {
|
|
171
|
+
return ${entity}.map((item) => ({ ...item }))
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export async function get${cap}ById(id: number): Promise<${cap}Record | undefined> {
|
|
175
|
+
const item = ${entity}.find((entry) => entry.id === id)
|
|
176
|
+
return item ? { ...item } : undefined
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export async function create${cap}(title: string): Promise<${cap}Record> {
|
|
180
|
+
const next: ${cap}Record = {
|
|
181
|
+
id: ${entity}.length === 0 ? 1 : Math.max(...${entity}.map((item) => item.id)) + 1,
|
|
182
|
+
title,
|
|
183
|
+
}
|
|
184
|
+
${entity}.push(next)
|
|
185
|
+
return { ...next }
|
|
186
|
+
}
|
|
187
|
+
`;
|
|
188
|
+
}
|
|
189
|
+
function repositorySqliteModule(entity, singular) {
|
|
190
|
+
const cap = capitalize(singular);
|
|
191
|
+
return `${repositorySharedPrelude(entity, singular)}import { createDB } from "gorsee/db"
|
|
192
|
+
import { SafeSQL } from "gorsee/types"
|
|
193
|
+
|
|
194
|
+
const db = createDB(process.env.DATABASE_URL ?? "./data.sqlite")
|
|
195
|
+
|
|
196
|
+
export async function list${cap}s(): Promise<${cap}Record[]> {
|
|
197
|
+
return db.all<${cap}Record>(SafeSQL\`SELECT id, title FROM ${entity} ORDER BY id DESC\`)
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export async function get${cap}ById(id: number): Promise<${cap}Record | undefined> {
|
|
201
|
+
return db.get<${cap}Record>(SafeSQL\`SELECT id, title FROM ${entity} WHERE id = \${id}\`) ?? undefined
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export async function create${cap}(title: string): Promise<${cap}Record> {
|
|
205
|
+
db.run(SafeSQL\`INSERT INTO ${entity} (title) VALUES (\${title})\`)
|
|
206
|
+
const created = db.get<${cap}Record>(SafeSQL\`SELECT id, title FROM ${entity} ORDER BY id DESC LIMIT 1\`)
|
|
207
|
+
if (!created) {
|
|
208
|
+
throw new Error("Failed to create ${singular}")
|
|
209
|
+
}
|
|
210
|
+
return created
|
|
211
|
+
}
|
|
212
|
+
`;
|
|
213
|
+
}
|
|
214
|
+
function repositoryPostgresModule(entity, singular) {
|
|
215
|
+
const cap = capitalize(singular);
|
|
216
|
+
return `${repositorySharedPrelude(entity, singular)}import { createPostgresDB, type PostgresPoolLike } from "gorsee/db"
|
|
217
|
+
import { SafeSQL } from "gorsee/types"
|
|
218
|
+
|
|
219
|
+
let postgresPool: PostgresPoolLike | null = null
|
|
220
|
+
|
|
221
|
+
export function configure${cap}Postgres(pool: PostgresPoolLike): void {
|
|
222
|
+
postgresPool = pool
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function getDB() {
|
|
226
|
+
if (!postgresPool) {
|
|
227
|
+
throw new Error("Postgres pool is not configured. Call configure${cap}Postgres() during server startup.")
|
|
228
|
+
}
|
|
229
|
+
return createPostgresDB(postgresPool)
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export async function list${cap}s(): Promise<${cap}Record[]> {
|
|
233
|
+
return getDB().all<${cap}Record>(SafeSQL\`SELECT id, title FROM ${entity} ORDER BY id DESC\`)
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
export async function get${cap}ById(id: number): Promise<${cap}Record | undefined> {
|
|
237
|
+
return (await getDB().get<${cap}Record>(SafeSQL\`SELECT id, title FROM ${entity} WHERE id = \${id}\`)) ?? undefined
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export async function create${cap}(title: string): Promise<${cap}Record> {
|
|
241
|
+
return getDB().transaction(async (db) => {
|
|
242
|
+
await db.run(SafeSQL\`INSERT INTO ${entity} (title) VALUES (\${title})\`)
|
|
243
|
+
const created = await db.get<${cap}Record>(SafeSQL\`SELECT id, title FROM ${entity} ORDER BY id DESC LIMIT 1\`)
|
|
244
|
+
if (!created) {
|
|
245
|
+
throw new Error("Failed to create ${singular}")
|
|
246
|
+
}
|
|
247
|
+
return created
|
|
248
|
+
})
|
|
249
|
+
}
|
|
250
|
+
`;
|
|
251
|
+
}
|
|
252
|
+
function repositoryModule(entity, singular, mode) {
|
|
253
|
+
switch (mode) {
|
|
254
|
+
case "sqlite":
|
|
255
|
+
return repositorySqliteModule(entity, singular);
|
|
256
|
+
case "postgres":
|
|
257
|
+
return repositoryPostgresModule(entity, singular);
|
|
258
|
+
default:
|
|
259
|
+
return repositoryMemoryModule(entity, singular);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
function migrationSQL(entity, mode) {
|
|
263
|
+
if (mode === "postgres")
|
|
264
|
+
return `-- Create ${entity} table
|
|
265
|
+
CREATE TABLE IF NOT EXISTS ${entity} (
|
|
266
|
+
id BIGSERIAL PRIMARY KEY,
|
|
267
|
+
title TEXT NOT NULL,
|
|
268
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
269
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
270
|
+
);
|
|
271
|
+
`;
|
|
272
|
+
return `-- Create ${entity} table
|
|
273
|
+
CREATE TABLE IF NOT EXISTS ${entity} (
|
|
274
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
275
|
+
title TEXT NOT NULL,
|
|
276
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
277
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
278
|
+
);
|
|
279
|
+
`;
|
|
280
|
+
}
|
|
281
|
+
export async function generateCrudScaffold(args, options = {}) {
|
|
282
|
+
const flags = parseGenerateFlags(args), entity = flags.entity;
|
|
283
|
+
if (!entity) {
|
|
284
|
+
console.error("Usage: gorsee generate <entity-name> [--data memory|sqlite|postgres]");
|
|
285
|
+
console.error("Example: gorsee generate posts --data sqlite");
|
|
286
|
+
process.exit(1);
|
|
287
|
+
}
|
|
288
|
+
const { cwd, paths } = createProjectContext(options), dataMode = flags.data ?? await inferGenerateDataMode(cwd), singular = singularize(entity), routeDir = join(paths.routesDir, entity), repoFile = join(paths.sharedDir, `${entity}.ts`);
|
|
289
|
+
console.log(`
|
|
290
|
+
Generating CRUD for: ${entity}`);
|
|
291
|
+
console.log(` Data mode: ${dataMode}
|
|
292
|
+
`);
|
|
293
|
+
await mkdir(routeDir, { recursive: !0 });
|
|
294
|
+
await mkdir(paths.sharedDir, { recursive: !0 });
|
|
295
|
+
await writeFile(join(routeDir, "index.tsx"), listRoute(entity, singular));
|
|
296
|
+
await writeFile(join(routeDir, "[id].tsx"), detailRoute(entity, singular));
|
|
297
|
+
await writeFile(join(routeDir, "new.tsx"), newRoute(entity, singular));
|
|
298
|
+
await writeFile(repoFile, repositoryModule(entity, singular, dataMode));
|
|
299
|
+
const migrationDir = paths.migrationsDir;
|
|
300
|
+
await mkdir(migrationDir, { recursive: !0 });
|
|
301
|
+
const migrationFile = await createMigration(migrationDir, `create_${entity}`), migrationPath = join(migrationDir, migrationFile);
|
|
302
|
+
await writeFile(migrationPath, migrationSQL(entity, dataMode));
|
|
303
|
+
console.log(" Created:");
|
|
304
|
+
console.log(` routes/${entity}/index.tsx -- list page`);
|
|
305
|
+
console.log(` routes/${entity}/[id].tsx -- detail page`);
|
|
306
|
+
console.log(` routes/${entity}/new.tsx -- validated create form`);
|
|
307
|
+
console.log(` shared/${entity}.ts -- ${dataMode} repository + typed routes + form schema`);
|
|
308
|
+
console.log(` migrations/${migrationFile}`);
|
|
309
|
+
console.log();
|
|
310
|
+
if (dataMode === "postgres")
|
|
311
|
+
console.log(` Next: run \`gorsee migrate\` and call \`configure${capitalize(singular)}Postgres(pool)\` during server startup`);
|
|
312
|
+
else if (dataMode === "memory")
|
|
313
|
+
console.log(" Next: run `gorsee migrate` and switch --data sqlite|postgres when wiring a production database");
|
|
314
|
+
else
|
|
315
|
+
console.log(" Next: run `gorsee migrate` to apply the generated table contract");
|
|
316
|
+
console.log();
|
|
317
|
+
}
|
|
318
|
+
export async function runGenerate(args, options = {}) {
|
|
319
|
+
return generateCrudScaffold(args, options);
|
|
320
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type RuntimeOptions } from "../runtime/project.js";
|
|
2
|
+
export interface MigrateCommandOptions extends RuntimeOptions {
|
|
3
|
+
dbPath?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function runProjectMigrations(args: string[], options?: MigrateCommandOptions): Promise<void>;
|
|
6
|
+
/** @deprecated Use runProjectMigrations() for programmatic access. */
|
|
7
|
+
export declare function runMigrate(args: string[], options?: MigrateCommandOptions): Promise<void>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { runMigrations, createMigration } from "../db/migrate.js";
|
|
2
|
+
import { createProjectContext } from "../runtime/project.js";
|
|
3
|
+
export async function runProjectMigrations(args, options = {}) {
|
|
4
|
+
const { env, paths } = createProjectContext(options);
|
|
5
|
+
if (args[0] === "create") {
|
|
6
|
+
const name = args[1];
|
|
7
|
+
if (!name) {
|
|
8
|
+
console.error("Usage: gorsee migrate create <migration-name>");
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
const filename = await createMigration(paths.migrationsDir, name);
|
|
12
|
+
console.log(`
|
|
13
|
+
Created: migrations/${filename}
|
|
14
|
+
`);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
const dbPath = options.dbPath ?? env.DATABASE_URL ?? paths.dataFile;
|
|
18
|
+
console.log(`
|
|
19
|
+
Running migrations...
|
|
20
|
+
`);
|
|
21
|
+
const result = await runMigrations(dbPath, paths.migrationsDir);
|
|
22
|
+
if (result.applied.length > 0) {
|
|
23
|
+
console.log(" Applied:");
|
|
24
|
+
for (const m of result.applied)
|
|
25
|
+
console.log(` + ${m}`);
|
|
26
|
+
}
|
|
27
|
+
if (result.skipped.length > 0)
|
|
28
|
+
console.log(` Skipped: ${result.skipped.length} (already applied)`);
|
|
29
|
+
if (result.errors.length > 0) {
|
|
30
|
+
console.log(`
|
|
31
|
+
Errors:`);
|
|
32
|
+
for (const e of result.errors)
|
|
33
|
+
console.error(` ! ${e}`);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
console.log(`
|
|
37
|
+
Done: ${result.applied.length} migration(s) applied
|
|
38
|
+
`);
|
|
39
|
+
}
|
|
40
|
+
export async function runMigrate(args, options = {}) {
|
|
41
|
+
return runProjectMigrations(args, options);
|
|
42
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type RuntimeOptions } from "../runtime/project.js";
|
|
2
|
+
export interface RoutesCommandOptions extends RuntimeOptions {
|
|
3
|
+
}
|
|
4
|
+
export declare function listRoutes(options?: RoutesCommandOptions): Promise<void>;
|
|
5
|
+
/** @deprecated Use listRoutes() for programmatic access. */
|
|
6
|
+
export declare function runRoutes(_args: string[], options?: RoutesCommandOptions): Promise<void>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createRouter } from "../router/scanner.js";
|
|
2
|
+
import { createProjectContext } from "../runtime/project.js";
|
|
3
|
+
export async function listRoutes(options = {}) {
|
|
4
|
+
const { cwd, paths } = createProjectContext(options), routes = await createRouter(paths.routesDir);
|
|
5
|
+
if (routes.length === 0) {
|
|
6
|
+
console.log(`
|
|
7
|
+
No routes found in routes/
|
|
8
|
+
`);
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
console.log(`
|
|
12
|
+
Routes:
|
|
13
|
+
`);
|
|
14
|
+
console.log(" " + "Path".padEnd(25) + "File".padEnd(40) + "Params");
|
|
15
|
+
console.log(" " + "-".repeat(70));
|
|
16
|
+
for (const route of routes) {
|
|
17
|
+
const params = route.params.length > 0 ? route.params.join(", ") : "-";
|
|
18
|
+
console.log(" " + route.path.padEnd(25) + route.filePath.replace(cwd + "/", "").padEnd(40) + params);
|
|
19
|
+
}
|
|
20
|
+
console.log();
|
|
21
|
+
}
|
|
22
|
+
export async function runRoutes(_args, options = {}) {
|
|
23
|
+
return listRoutes(options);
|
|
24
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type RuntimeOptions } from "../runtime/project.js";
|
|
2
|
+
export interface StartCommandOptions extends RuntimeOptions {
|
|
3
|
+
port?: number;
|
|
4
|
+
runtime?: "bun" | "node";
|
|
5
|
+
}
|
|
6
|
+
interface StartFlags {
|
|
7
|
+
runtime?: "bun" | "node";
|
|
8
|
+
}
|
|
9
|
+
export declare function parseStartFlags(args: string[]): StartFlags;
|
|
10
|
+
export declare function startBuiltProject(options?: StartCommandOptions): Promise<void>;
|
|
11
|
+
/** @deprecated Use startBuiltProject() for programmatic access. */
|
|
12
|
+
export declare function runStart(args: string[], options?: StartCommandOptions): Promise<void>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { pathToFileURL } from "node:url";
|
|
3
|
+
import { stat } from "node:fs/promises";
|
|
4
|
+
import { createProjectContext } from "../runtime/project.js";
|
|
5
|
+
export function parseStartFlags(args) {
|
|
6
|
+
const flags = {};
|
|
7
|
+
for (let index = 0;index < args.length; index++)
|
|
8
|
+
if (args[index] === "--runtime" && (args[index + 1] === "bun" || args[index + 1] === "node"))
|
|
9
|
+
flags.runtime = args[++index];
|
|
10
|
+
return flags;
|
|
11
|
+
}
|
|
12
|
+
export async function startBuiltProject(options = {}) {
|
|
13
|
+
const { paths } = createProjectContext(options), runtime = options.runtime ?? "bun";
|
|
14
|
+
try {
|
|
15
|
+
await stat(join(paths.distDir, "manifest.json"));
|
|
16
|
+
} catch {
|
|
17
|
+
console.error(`
|
|
18
|
+
Error: No production build found.`);
|
|
19
|
+
console.error(" Run `gorsee build` first.\n");
|
|
20
|
+
process.exit(1);
|
|
21
|
+
}
|
|
22
|
+
const entryFile = runtime === "node" ? "prod-node.js" : "prod.js", prodModule = await import(pathToFileURL(join(paths.distDir, entryFile)).href);
|
|
23
|
+
if (runtime === "node") {
|
|
24
|
+
await prodModule.startNodeProductionServer({ cwd: paths.cwd, port: options.port });
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
await prodModule.startProductionServer({ cwd: paths.cwd, port: options.port });
|
|
28
|
+
}
|
|
29
|
+
export async function runStart(args, options = {}) {
|
|
30
|
+
const flags = parseStartFlags(args);
|
|
31
|
+
return startBuiltProject({ ...options, runtime: flags.runtime ?? options.runtime });
|
|
32
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type RuntimeOptions } from "../runtime/project.js";
|
|
2
|
+
interface TestFlags {
|
|
3
|
+
watch: boolean;
|
|
4
|
+
coverage: boolean;
|
|
5
|
+
filter: string | null;
|
|
6
|
+
e2e: boolean;
|
|
7
|
+
unit: boolean;
|
|
8
|
+
integration: boolean;
|
|
9
|
+
}
|
|
10
|
+
declare function parseFlags(args: string[]): TestFlags;
|
|
11
|
+
declare function findTestFiles(dir: string, pattern: RegExp): Promise<string[]>;
|
|
12
|
+
declare function getTestPattern(flags: TestFlags): RegExp;
|
|
13
|
+
/** Build bun test args from parsed flags */
|
|
14
|
+
export declare function buildTestArgs(flags: TestFlags, files: string[]): string[];
|
|
15
|
+
export interface TestCommandOptions extends RuntimeOptions {
|
|
16
|
+
}
|
|
17
|
+
export declare function runTests(args: string[], options?: TestCommandOptions): Promise<void>;
|
|
18
|
+
/** @deprecated Use runTests() for programmatic access. */
|
|
19
|
+
export declare function runTest(args: string[], options?: TestCommandOptions): Promise<void>;
|
|
20
|
+
export { parseFlags, findTestFiles, getTestPattern };
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { readdir, stat } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { createProjectContext } from "../runtime/project.js";
|
|
4
|
+
function parseFlags(args) {
|
|
5
|
+
const flags = {
|
|
6
|
+
watch: !1,
|
|
7
|
+
coverage: !1,
|
|
8
|
+
filter: null,
|
|
9
|
+
e2e: !1,
|
|
10
|
+
unit: !1,
|
|
11
|
+
integration: !1
|
|
12
|
+
};
|
|
13
|
+
for (let i = 0;i < args.length; i++) {
|
|
14
|
+
const arg = args[i];
|
|
15
|
+
if (arg === "--watch")
|
|
16
|
+
flags.watch = !0;
|
|
17
|
+
else if (arg === "--coverage")
|
|
18
|
+
flags.coverage = !0;
|
|
19
|
+
else if (arg === "--filter" && args[i + 1])
|
|
20
|
+
flags.filter = args[++i];
|
|
21
|
+
else if (arg === "--e2e")
|
|
22
|
+
flags.e2e = !0;
|
|
23
|
+
else if (arg === "--unit")
|
|
24
|
+
flags.unit = !0;
|
|
25
|
+
else if (arg === "--integration")
|
|
26
|
+
flags.integration = !0;
|
|
27
|
+
}
|
|
28
|
+
return flags;
|
|
29
|
+
}
|
|
30
|
+
async function findTestFiles(dir, pattern) {
|
|
31
|
+
const results = [];
|
|
32
|
+
let entries;
|
|
33
|
+
try {
|
|
34
|
+
entries = await readdir(dir);
|
|
35
|
+
} catch {
|
|
36
|
+
return results;
|
|
37
|
+
}
|
|
38
|
+
for (const entry of entries) {
|
|
39
|
+
if (entry === "node_modules" || entry === "dist")
|
|
40
|
+
continue;
|
|
41
|
+
const fullPath = join(dir, entry);
|
|
42
|
+
if ((await stat(fullPath)).isDirectory())
|
|
43
|
+
results.push(...await findTestFiles(fullPath, pattern));
|
|
44
|
+
else if (pattern.test(fullPath))
|
|
45
|
+
results.push(fullPath);
|
|
46
|
+
}
|
|
47
|
+
return results;
|
|
48
|
+
}
|
|
49
|
+
function getTestPattern(flags) {
|
|
50
|
+
if (flags.e2e)
|
|
51
|
+
return /(?:\.e2e\.test\.ts$|e2e\/.*\.test\.ts$)/;
|
|
52
|
+
if (flags.integration)
|
|
53
|
+
return /(?:\.integration\.test\.ts$|tests\/integration\/.*\.test\.ts$)/;
|
|
54
|
+
if (flags.unit)
|
|
55
|
+
return /(?:\.unit\.test\.ts$|tests\/unit\/.*\.test\.ts$)/;
|
|
56
|
+
return /\.test\.ts$/;
|
|
57
|
+
}
|
|
58
|
+
export function buildTestArgs(flags, files) {
|
|
59
|
+
const bunArgs = ["test"];
|
|
60
|
+
if (flags.watch)
|
|
61
|
+
bunArgs.push("--watch");
|
|
62
|
+
if (flags.coverage)
|
|
63
|
+
bunArgs.push("--coverage");
|
|
64
|
+
if (flags.filter)
|
|
65
|
+
bunArgs.push("--bail", "--filter", flags.filter);
|
|
66
|
+
bunArgs.push(...files);
|
|
67
|
+
return bunArgs;
|
|
68
|
+
}
|
|
69
|
+
export async function runTests(args, options = {}) {
|
|
70
|
+
const { cwd, env } = createProjectContext(options), flags = parseFlags(args), pattern = getTestPattern(flags), files = await findTestFiles(cwd, pattern);
|
|
71
|
+
if (files.length === 0) {
|
|
72
|
+
const kind = flags.e2e ? "e2e" : flags.integration ? "integration" : flags.unit ? "unit" : "any";
|
|
73
|
+
console.log(`
|
|
74
|
+
No ${kind} test files found.
|
|
75
|
+
`);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
console.log(`
|
|
79
|
+
Running ${files.length} test file(s)...
|
|
80
|
+
`);
|
|
81
|
+
const bunArgs = buildTestArgs(flags, files), exitCode = await Bun.spawn(["bun", ...bunArgs], {
|
|
82
|
+
cwd,
|
|
83
|
+
stdout: "inherit",
|
|
84
|
+
stderr: "inherit",
|
|
85
|
+
env: {
|
|
86
|
+
...env,
|
|
87
|
+
NODE_ENV: "test",
|
|
88
|
+
GORSEE_TEST: "1"
|
|
89
|
+
}
|
|
90
|
+
}).exited;
|
|
91
|
+
console.log();
|
|
92
|
+
if (exitCode === 0)
|
|
93
|
+
console.log(` Tests passed (${files.length} file(s))`);
|
|
94
|
+
else {
|
|
95
|
+
console.log(` Tests failed (exit code ${exitCode})`);
|
|
96
|
+
process.exit(exitCode);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
export async function runTest(args, options = {}) {
|
|
100
|
+
return runTests(args, options);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export { parseFlags, findTestFiles, getTestPattern };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { type RuntimeOptions } from "../runtime/project.js";
|
|
2
|
+
export interface TypegenCommandOptions extends RuntimeOptions {
|
|
3
|
+
routesDir?: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function generateRouteTypes(args: string[], options?: TypegenCommandOptions): Promise<void>;
|
|
6
|
+
/** @deprecated Use generateRouteTypes() for programmatic access. */
|
|
7
|
+
export declare function runTypegen(args: string[], options?: TypegenCommandOptions): Promise<void>;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
3
|
+
import { createRouter } from "../router/index.js";
|
|
4
|
+
import { createProjectContext } from "../runtime/project.js";
|
|
5
|
+
import { initializeCompilerBackends } from "../compiler/init.js";
|
|
6
|
+
import {
|
|
7
|
+
createRouteFactsArtifact,
|
|
8
|
+
getRouteParamsRecord
|
|
9
|
+
} from "../compiler/route-facts.js";
|
|
10
|
+
const OUTPUT_DIR = ".gorsee", TYPES_FILE = "routes.d.ts", FACTS_FILE = "route-facts.json";
|
|
11
|
+
function formatParamsType(params) {
|
|
12
|
+
const entries = Object.entries(params);
|
|
13
|
+
if (entries.length === 0)
|
|
14
|
+
return "{}";
|
|
15
|
+
return `{ ${entries.map(([key, type]) => `${key}: ${type}`).join("; ")} }`;
|
|
16
|
+
}
|
|
17
|
+
function generateDeclaration(routes) {
|
|
18
|
+
const lines = [
|
|
19
|
+
"// Auto-generated by gorsee typegen",
|
|
20
|
+
"// Do not edit manually \u2014 re-run `gorsee typegen` after adding routes",
|
|
21
|
+
"",
|
|
22
|
+
'declare module "gorsee/routes" {',
|
|
23
|
+
" interface RouteParams {"
|
|
24
|
+
];
|
|
25
|
+
for (const route of routes) {
|
|
26
|
+
const params = getRouteParamsRecord(route), paramsType = formatParamsType(params);
|
|
27
|
+
lines.push(` "${route.path}": ${paramsType}`);
|
|
28
|
+
}
|
|
29
|
+
lines.push(" }");
|
|
30
|
+
lines.push("");
|
|
31
|
+
lines.push(" type RoutePath = keyof RouteParams");
|
|
32
|
+
lines.push("");
|
|
33
|
+
lines.push(" function typedLink<P extends RoutePath>(path: P, params: RouteParams[P]): string");
|
|
34
|
+
lines.push(" function typedNavigate<P extends RoutePath>(path: P, params: RouteParams[P]): Promise<void>");
|
|
35
|
+
lines.push("}");
|
|
36
|
+
lines.push("");
|
|
37
|
+
return lines.join(`
|
|
38
|
+
`);
|
|
39
|
+
}
|
|
40
|
+
export async function generateRouteTypes(args, options = {}) {
|
|
41
|
+
const { cwd, paths } = createProjectContext(options);
|
|
42
|
+
initializeCompilerBackends(options.env ?? process.env);
|
|
43
|
+
const routesDir = options.routesDir ?? args[0] ?? paths.routesDir;
|
|
44
|
+
console.log(`Scanning routes in: ${routesDir}`);
|
|
45
|
+
const routes = await createRouter(routesDir);
|
|
46
|
+
if (routes.length === 0) {
|
|
47
|
+
console.warn("No routes found. Make sure your routes/ directory exists.");
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const outputDir = join(cwd, OUTPUT_DIR);
|
|
51
|
+
await mkdir(outputDir, { recursive: !0 });
|
|
52
|
+
const routeFacts = await createRouteFactsArtifact(routes), declaration = generateDeclaration(routeFacts.routes), typesPath = join(outputDir, TYPES_FILE), factsPath = join(outputDir, FACTS_FILE);
|
|
53
|
+
await writeFile(typesPath, declaration, "utf-8");
|
|
54
|
+
await writeFile(factsPath, JSON.stringify(routeFacts, null, 2) + `
|
|
55
|
+
`, "utf-8");
|
|
56
|
+
console.log(`Generated ${typesPath}`);
|
|
57
|
+
console.log(`Generated ${factsPath}`);
|
|
58
|
+
console.log(` ${routes.length} route(s):`);
|
|
59
|
+
for (const route of routes) {
|
|
60
|
+
const params = route.params.length > 0 ? ` [${route.params.join(", ")}]` : "";
|
|
61
|
+
console.log(` ${route.path}${params}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export async function runTypegen(args, options = {}) {
|
|
65
|
+
return generateRouteTypes(args, options);
|
|
66
|
+
}
|