@fuzdev/fuz_app 0.1.0
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/LICENSE +21 -0
- package/README.md +49 -0
- package/dist/actions/action_bridge.d.ts +65 -0
- package/dist/actions/action_bridge.d.ts.map +1 -0
- package/dist/actions/action_bridge.js +76 -0
- package/dist/actions/action_codegen.d.ts +97 -0
- package/dist/actions/action_codegen.d.ts.map +1 -0
- package/dist/actions/action_codegen.js +280 -0
- package/dist/actions/action_registry.d.ts +35 -0
- package/dist/actions/action_registry.d.ts.map +1 -0
- package/dist/actions/action_registry.js +83 -0
- package/dist/actions/action_spec.d.ts +169 -0
- package/dist/actions/action_spec.d.ts.map +1 -0
- package/dist/actions/action_spec.js +76 -0
- package/dist/auth/account_queries.d.ts +96 -0
- package/dist/auth/account_queries.d.ts.map +1 -0
- package/dist/auth/account_queries.js +172 -0
- package/dist/auth/account_routes.d.ts +86 -0
- package/dist/auth/account_routes.d.ts.map +1 -0
- package/dist/auth/account_routes.js +406 -0
- package/dist/auth/account_schema.d.ts +192 -0
- package/dist/auth/account_schema.d.ts.map +1 -0
- package/dist/auth/account_schema.js +105 -0
- package/dist/auth/admin_routes.d.ts +29 -0
- package/dist/auth/admin_routes.d.ts.map +1 -0
- package/dist/auth/admin_routes.js +193 -0
- package/dist/auth/api_token.d.ts +33 -0
- package/dist/auth/api_token.d.ts.map +1 -0
- package/dist/auth/api_token.js +36 -0
- package/dist/auth/api_token_queries.d.ts +80 -0
- package/dist/auth/api_token_queries.d.ts.map +1 -0
- package/dist/auth/api_token_queries.js +116 -0
- package/dist/auth/app_settings_queries.d.ts +33 -0
- package/dist/auth/app_settings_queries.d.ts.map +1 -0
- package/dist/auth/app_settings_queries.js +51 -0
- package/dist/auth/app_settings_routes.d.ts +27 -0
- package/dist/auth/app_settings_routes.d.ts.map +1 -0
- package/dist/auth/app_settings_routes.js +66 -0
- package/dist/auth/app_settings_schema.d.ts +35 -0
- package/dist/auth/app_settings_schema.d.ts.map +1 -0
- package/dist/auth/app_settings_schema.js +22 -0
- package/dist/auth/audit_log_queries.d.ts +90 -0
- package/dist/auth/audit_log_queries.d.ts.map +1 -0
- package/dist/auth/audit_log_queries.js +205 -0
- package/dist/auth/audit_log_routes.d.ts +33 -0
- package/dist/auth/audit_log_routes.d.ts.map +1 -0
- package/dist/auth/audit_log_routes.js +106 -0
- package/dist/auth/audit_log_schema.d.ts +259 -0
- package/dist/auth/audit_log_schema.d.ts.map +1 -0
- package/dist/auth/audit_log_schema.js +123 -0
- package/dist/auth/bearer_auth.d.ts +32 -0
- package/dist/auth/bearer_auth.d.ts.map +1 -0
- package/dist/auth/bearer_auth.js +90 -0
- package/dist/auth/bootstrap_account.d.ts +82 -0
- package/dist/auth/bootstrap_account.d.ts.map +1 -0
- package/dist/auth/bootstrap_account.js +97 -0
- package/dist/auth/bootstrap_routes.d.ts +74 -0
- package/dist/auth/bootstrap_routes.d.ts.map +1 -0
- package/dist/auth/bootstrap_routes.js +154 -0
- package/dist/auth/daemon_token.d.ts +49 -0
- package/dist/auth/daemon_token.d.ts.map +1 -0
- package/dist/auth/daemon_token.js +49 -0
- package/dist/auth/daemon_token_middleware.d.ts +93 -0
- package/dist/auth/daemon_token_middleware.d.ts.map +1 -0
- package/dist/auth/daemon_token_middleware.js +167 -0
- package/dist/auth/ddl.d.ts +27 -0
- package/dist/auth/ddl.d.ts.map +1 -0
- package/dist/auth/ddl.js +111 -0
- package/dist/auth/deps.d.ts +52 -0
- package/dist/auth/deps.d.ts.map +1 -0
- package/dist/auth/deps.js +10 -0
- package/dist/auth/invite_queries.d.ts +68 -0
- package/dist/auth/invite_queries.d.ts.map +1 -0
- package/dist/auth/invite_queries.js +105 -0
- package/dist/auth/invite_routes.d.ts +18 -0
- package/dist/auth/invite_routes.d.ts.map +1 -0
- package/dist/auth/invite_routes.js +129 -0
- package/dist/auth/invite_schema.d.ts +51 -0
- package/dist/auth/invite_schema.d.ts.map +1 -0
- package/dist/auth/invite_schema.js +25 -0
- package/dist/auth/keyring.d.ts +87 -0
- package/dist/auth/keyring.d.ts.map +1 -0
- package/dist/auth/keyring.js +142 -0
- package/dist/auth/middleware.d.ts +40 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +64 -0
- package/dist/auth/migrations.d.ts +42 -0
- package/dist/auth/migrations.d.ts.map +1 -0
- package/dist/auth/migrations.js +79 -0
- package/dist/auth/password.d.ts +39 -0
- package/dist/auth/password.d.ts.map +1 -0
- package/dist/auth/password.js +25 -0
- package/dist/auth/password_argon2.d.ts +43 -0
- package/dist/auth/password_argon2.d.ts.map +1 -0
- package/dist/auth/password_argon2.js +76 -0
- package/dist/auth/permit_queries.d.ts +72 -0
- package/dist/auth/permit_queries.d.ts.map +1 -0
- package/dist/auth/permit_queries.js +116 -0
- package/dist/auth/request_context.d.ts +114 -0
- package/dist/auth/request_context.d.ts.map +1 -0
- package/dist/auth/request_context.js +176 -0
- package/dist/auth/require_keeper.d.ts +20 -0
- package/dist/auth/require_keeper.d.ts.map +1 -0
- package/dist/auth/require_keeper.js +35 -0
- package/dist/auth/role_schema.d.ts +69 -0
- package/dist/auth/role_schema.d.ts.map +1 -0
- package/dist/auth/role_schema.js +70 -0
- package/dist/auth/route_guards.d.ts +21 -0
- package/dist/auth/route_guards.d.ts.map +1 -0
- package/dist/auth/route_guards.js +32 -0
- package/dist/auth/session_cookie.d.ts +158 -0
- package/dist/auth/session_cookie.d.ts.map +1 -0
- package/dist/auth/session_cookie.js +135 -0
- package/dist/auth/session_lifecycle.d.ts +35 -0
- package/dist/auth/session_lifecycle.d.ts.map +1 -0
- package/dist/auth/session_lifecycle.js +27 -0
- package/dist/auth/session_middleware.d.ts +33 -0
- package/dist/auth/session_middleware.d.ts.map +1 -0
- package/dist/auth/session_middleware.js +62 -0
- package/dist/auth/session_queries.d.ts +135 -0
- package/dist/auth/session_queries.d.ts.map +1 -0
- package/dist/auth/session_queries.js +186 -0
- package/dist/auth/signup_routes.d.ts +32 -0
- package/dist/auth/signup_routes.d.ts.map +1 -0
- package/dist/auth/signup_routes.js +150 -0
- package/dist/cli/args.d.ts +48 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +76 -0
- package/dist/cli/config.d.ts +48 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +77 -0
- package/dist/cli/daemon.d.ts +82 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +149 -0
- package/dist/cli/help.d.ts +85 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +138 -0
- package/dist/cli/logger.d.ts +46 -0
- package/dist/cli/logger.d.ts.map +1 -0
- package/dist/cli/logger.js +48 -0
- package/dist/cli/util.d.ts +36 -0
- package/dist/cli/util.d.ts.map +1 -0
- package/dist/cli/util.js +50 -0
- package/dist/crypto.d.ts +13 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +19 -0
- package/dist/db/assert_row.d.ts +18 -0
- package/dist/db/assert_row.d.ts.map +1 -0
- package/dist/db/assert_row.js +24 -0
- package/dist/db/create_db.d.ts +38 -0
- package/dist/db/create_db.d.ts.map +1 -0
- package/dist/db/create_db.js +57 -0
- package/dist/db/db.d.ts +97 -0
- package/dist/db/db.d.ts.map +1 -0
- package/dist/db/db.js +76 -0
- package/dist/db/db_pg.d.ts +21 -0
- package/dist/db/db_pg.d.ts.map +1 -0
- package/dist/db/db_pg.js +45 -0
- package/dist/db/db_pglite.d.ts +21 -0
- package/dist/db/db_pglite.d.ts.map +1 -0
- package/dist/db/db_pglite.js +28 -0
- package/dist/db/migrate.d.ts +67 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +118 -0
- package/dist/db/pg_error.d.ts +16 -0
- package/dist/db/pg_error.d.ts.map +1 -0
- package/dist/db/pg_error.js +15 -0
- package/dist/db/query_deps.d.ts +14 -0
- package/dist/db/query_deps.d.ts.map +1 -0
- package/dist/db/query_deps.js +9 -0
- package/dist/db/sql_identifier.d.ts +27 -0
- package/dist/db/sql_identifier.d.ts.map +1 -0
- package/dist/db/sql_identifier.js +31 -0
- package/dist/db/status.d.ts +62 -0
- package/dist/db/status.d.ts.map +1 -0
- package/dist/db/status.js +116 -0
- package/dist/dev/setup.d.ts +159 -0
- package/dist/dev/setup.d.ts.map +1 -0
- package/dist/dev/setup.js +265 -0
- package/dist/env/dotenv.d.ts +25 -0
- package/dist/env/dotenv.d.ts.map +1 -0
- package/dist/env/dotenv.js +52 -0
- package/dist/env/load.d.ts +52 -0
- package/dist/env/load.d.ts.map +1 -0
- package/dist/env/load.js +79 -0
- package/dist/env/mask.d.ts +19 -0
- package/dist/env/mask.d.ts.map +1 -0
- package/dist/env/mask.js +26 -0
- package/dist/env/resolve.d.ts +126 -0
- package/dist/env/resolve.d.ts.map +1 -0
- package/dist/env/resolve.js +200 -0
- package/dist/hono_context.d.ts +48 -0
- package/dist/hono_context.d.ts.map +1 -0
- package/dist/hono_context.js +22 -0
- package/dist/http/common_routes.d.ts +52 -0
- package/dist/http/common_routes.d.ts.map +1 -0
- package/dist/http/common_routes.js +65 -0
- package/dist/http/db_routes.d.ts +57 -0
- package/dist/http/db_routes.d.ts.map +1 -0
- package/dist/http/db_routes.js +176 -0
- package/dist/http/error_schemas.d.ts +169 -0
- package/dist/http/error_schemas.d.ts.map +1 -0
- package/dist/http/error_schemas.js +178 -0
- package/dist/http/middleware_spec.d.ts +19 -0
- package/dist/http/middleware_spec.d.ts.map +1 -0
- package/dist/http/middleware_spec.js +9 -0
- package/dist/http/origin.d.ts +57 -0
- package/dist/http/origin.d.ts.map +1 -0
- package/dist/http/origin.js +207 -0
- package/dist/http/proxy.d.ts +112 -0
- package/dist/http/proxy.d.ts.map +1 -0
- package/dist/http/proxy.js +240 -0
- package/dist/http/route_spec.d.ts +197 -0
- package/dist/http/route_spec.d.ts.map +1 -0
- package/dist/http/route_spec.js +243 -0
- package/dist/http/schema_helpers.d.ts +64 -0
- package/dist/http/schema_helpers.d.ts.map +1 -0
- package/dist/http/schema_helpers.js +90 -0
- package/dist/http/surface.d.ts +132 -0
- package/dist/http/surface.d.ts.map +1 -0
- package/dist/http/surface.js +156 -0
- package/dist/http/surface_query.d.ts +77 -0
- package/dist/http/surface_query.d.ts.map +1 -0
- package/dist/http/surface_query.js +86 -0
- package/dist/rate_limiter.d.ts +94 -0
- package/dist/rate_limiter.d.ts.map +1 -0
- package/dist/rate_limiter.js +156 -0
- package/dist/realtime/sse.d.ts +80 -0
- package/dist/realtime/sse.d.ts.map +1 -0
- package/dist/realtime/sse.js +109 -0
- package/dist/realtime/sse_auth_guard.d.ts +93 -0
- package/dist/realtime/sse_auth_guard.d.ts.map +1 -0
- package/dist/realtime/sse_auth_guard.js +111 -0
- package/dist/realtime/subscriber_registry.d.ts +85 -0
- package/dist/realtime/subscriber_registry.d.ts.map +1 -0
- package/dist/realtime/subscriber_registry.js +108 -0
- package/dist/runtime/deno.d.ts +21 -0
- package/dist/runtime/deno.d.ts.map +1 -0
- package/dist/runtime/deno.js +83 -0
- package/dist/runtime/deps.d.ts +113 -0
- package/dist/runtime/deps.d.ts.map +1 -0
- package/dist/runtime/deps.js +10 -0
- package/dist/runtime/fs.d.ts +15 -0
- package/dist/runtime/fs.d.ts.map +1 -0
- package/dist/runtime/fs.js +17 -0
- package/dist/runtime/mock.d.ts +81 -0
- package/dist/runtime/mock.d.ts.map +1 -0
- package/dist/runtime/mock.js +195 -0
- package/dist/runtime/node.d.ts +17 -0
- package/dist/runtime/node.d.ts.map +1 -0
- package/dist/runtime/node.js +117 -0
- package/dist/schema_meta.d.ts +16 -0
- package/dist/schema_meta.d.ts.map +1 -0
- package/dist/schema_meta.js +9 -0
- package/dist/sensitivity.d.ts +15 -0
- package/dist/sensitivity.d.ts.map +1 -0
- package/dist/sensitivity.js +9 -0
- package/dist/server/app_backend.d.ts +74 -0
- package/dist/server/app_backend.d.ts.map +1 -0
- package/dist/server/app_backend.js +39 -0
- package/dist/server/app_server.d.ts +201 -0
- package/dist/server/app_server.d.ts.map +1 -0
- package/dist/server/app_server.js +266 -0
- package/dist/server/env.d.ts +68 -0
- package/dist/server/env.d.ts.map +1 -0
- package/dist/server/env.js +95 -0
- package/dist/server/startup.d.ts +22 -0
- package/dist/server/startup.d.ts.map +1 -0
- package/dist/server/startup.js +48 -0
- package/dist/server/static.d.ts +39 -0
- package/dist/server/static.d.ts.map +1 -0
- package/dist/server/static.js +38 -0
- package/dist/server/validate_nginx.d.ts +34 -0
- package/dist/server/validate_nginx.d.ts.map +1 -0
- package/dist/server/validate_nginx.js +118 -0
- package/dist/testing/CLAUDE.md +3 -0
- package/dist/testing/admin_integration.d.ts +45 -0
- package/dist/testing/admin_integration.d.ts.map +1 -0
- package/dist/testing/admin_integration.js +840 -0
- package/dist/testing/adversarial_404.d.ts +15 -0
- package/dist/testing/adversarial_404.d.ts.map +1 -0
- package/dist/testing/adversarial_404.js +118 -0
- package/dist/testing/adversarial_headers.d.ts +36 -0
- package/dist/testing/adversarial_headers.d.ts.map +1 -0
- package/dist/testing/adversarial_headers.js +128 -0
- package/dist/testing/adversarial_input.d.ts +56 -0
- package/dist/testing/adversarial_input.d.ts.map +1 -0
- package/dist/testing/adversarial_input.js +494 -0
- package/dist/testing/app_server.d.ts +169 -0
- package/dist/testing/app_server.d.ts.map +1 -0
- package/dist/testing/app_server.js +240 -0
- package/dist/testing/assert_dev_env.d.ts +10 -0
- package/dist/testing/assert_dev_env.d.ts.map +1 -0
- package/dist/testing/assert_dev_env.js +13 -0
- package/dist/testing/assertions.d.ts +61 -0
- package/dist/testing/assertions.d.ts.map +1 -0
- package/dist/testing/assertions.js +96 -0
- package/dist/testing/attack_surface.d.ts +63 -0
- package/dist/testing/attack_surface.d.ts.map +1 -0
- package/dist/testing/attack_surface.js +224 -0
- package/dist/testing/audit_completeness.d.ts +29 -0
- package/dist/testing/audit_completeness.d.ts.map +1 -0
- package/dist/testing/audit_completeness.js +410 -0
- package/dist/testing/auth_apps.d.ts +55 -0
- package/dist/testing/auth_apps.d.ts.map +1 -0
- package/dist/testing/auth_apps.js +122 -0
- package/dist/testing/data_exposure.d.ts +62 -0
- package/dist/testing/data_exposure.d.ts.map +1 -0
- package/dist/testing/data_exposure.js +297 -0
- package/dist/testing/db.d.ts +111 -0
- package/dist/testing/db.d.ts.map +1 -0
- package/dist/testing/db.js +258 -0
- package/dist/testing/entities.d.ts +21 -0
- package/dist/testing/entities.d.ts.map +1 -0
- package/dist/testing/entities.js +42 -0
- package/dist/testing/error_coverage.d.ts +78 -0
- package/dist/testing/error_coverage.d.ts.map +1 -0
- package/dist/testing/error_coverage.js +135 -0
- package/dist/testing/integration.d.ts +37 -0
- package/dist/testing/integration.d.ts.map +1 -0
- package/dist/testing/integration.js +1139 -0
- package/dist/testing/integration_helpers.d.ts +107 -0
- package/dist/testing/integration_helpers.d.ts.map +1 -0
- package/dist/testing/integration_helpers.js +246 -0
- package/dist/testing/middleware.d.ts +125 -0
- package/dist/testing/middleware.d.ts.map +1 -0
- package/dist/testing/middleware.js +210 -0
- package/dist/testing/rate_limiting.d.ts +43 -0
- package/dist/testing/rate_limiting.d.ts.map +1 -0
- package/dist/testing/rate_limiting.js +216 -0
- package/dist/testing/round_trip.d.ts +37 -0
- package/dist/testing/round_trip.d.ts.map +1 -0
- package/dist/testing/round_trip.js +128 -0
- package/dist/testing/schema_generators.d.ts +33 -0
- package/dist/testing/schema_generators.d.ts.map +1 -0
- package/dist/testing/schema_generators.js +137 -0
- package/dist/testing/standard.d.ts +49 -0
- package/dist/testing/standard.d.ts.map +1 -0
- package/dist/testing/standard.js +16 -0
- package/dist/testing/stubs.d.ts +96 -0
- package/dist/testing/stubs.d.ts.map +1 -0
- package/dist/testing/stubs.js +192 -0
- package/dist/testing/surface_invariants.d.ts +189 -0
- package/dist/testing/surface_invariants.d.ts.map +1 -0
- package/dist/testing/surface_invariants.js +450 -0
- package/dist/ui/AccountSessions.svelte +75 -0
- package/dist/ui/AccountSessions.svelte.d.ts +19 -0
- package/dist/ui/AccountSessions.svelte.d.ts.map +1 -0
- package/dist/ui/AdminAccounts.svelte +107 -0
- package/dist/ui/AdminAccounts.svelte.d.ts +19 -0
- package/dist/ui/AdminAccounts.svelte.d.ts.map +1 -0
- package/dist/ui/AdminAuditLog.svelte +144 -0
- package/dist/ui/AdminAuditLog.svelte.d.ts +4 -0
- package/dist/ui/AdminAuditLog.svelte.d.ts.map +1 -0
- package/dist/ui/AdminInvites.svelte +142 -0
- package/dist/ui/AdminInvites.svelte.d.ts +4 -0
- package/dist/ui/AdminInvites.svelte.d.ts.map +1 -0
- package/dist/ui/AdminOverview.svelte +337 -0
- package/dist/ui/AdminOverview.svelte.d.ts +4 -0
- package/dist/ui/AdminOverview.svelte.d.ts.map +1 -0
- package/dist/ui/AdminPermitHistory.svelte +61 -0
- package/dist/ui/AdminPermitHistory.svelte.d.ts +19 -0
- package/dist/ui/AdminPermitHistory.svelte.d.ts.map +1 -0
- package/dist/ui/AdminSessions.svelte +85 -0
- package/dist/ui/AdminSessions.svelte.d.ts +19 -0
- package/dist/ui/AdminSessions.svelte.d.ts.map +1 -0
- package/dist/ui/AdminSettings.svelte +32 -0
- package/dist/ui/AdminSettings.svelte.d.ts +19 -0
- package/dist/ui/AdminSettings.svelte.d.ts.map +1 -0
- package/dist/ui/AdminSurface.svelte +42 -0
- package/dist/ui/AdminSurface.svelte.d.ts +4 -0
- package/dist/ui/AdminSurface.svelte.d.ts.map +1 -0
- package/dist/ui/AppShell.svelte +93 -0
- package/dist/ui/AppShell.svelte.d.ts +20 -0
- package/dist/ui/AppShell.svelte.d.ts.map +1 -0
- package/dist/ui/BootstrapForm.svelte +105 -0
- package/dist/ui/BootstrapForm.svelte.d.ts +4 -0
- package/dist/ui/BootstrapForm.svelte.d.ts.map +1 -0
- package/dist/ui/ColumnLayout.svelte +46 -0
- package/dist/ui/ColumnLayout.svelte.d.ts +11 -0
- package/dist/ui/ColumnLayout.svelte.d.ts.map +1 -0
- package/dist/ui/ConfirmButton.svelte +125 -0
- package/dist/ui/ConfirmButton.svelte.d.ts +54 -0
- package/dist/ui/ConfirmButton.svelte.d.ts.map +1 -0
- package/dist/ui/Datatable.svelte +185 -0
- package/dist/ui/Datatable.svelte.d.ts +35 -0
- package/dist/ui/Datatable.svelte.d.ts.map +1 -0
- package/dist/ui/LoginForm.svelte +82 -0
- package/dist/ui/LoginForm.svelte.d.ts +8 -0
- package/dist/ui/LoginForm.svelte.d.ts.map +1 -0
- package/dist/ui/LogoutButton.svelte +36 -0
- package/dist/ui/LogoutButton.svelte.d.ts +10 -0
- package/dist/ui/LogoutButton.svelte.d.ts.map +1 -0
- package/dist/ui/MenuLink.svelte +35 -0
- package/dist/ui/MenuLink.svelte.d.ts +12 -0
- package/dist/ui/MenuLink.svelte.d.ts.map +1 -0
- package/dist/ui/OpenSignupToggle.svelte +36 -0
- package/dist/ui/OpenSignupToggle.svelte.d.ts +19 -0
- package/dist/ui/OpenSignupToggle.svelte.d.ts.map +1 -0
- package/dist/ui/PopoverButton.svelte +136 -0
- package/dist/ui/PopoverButton.svelte.d.ts +63 -0
- package/dist/ui/PopoverButton.svelte.d.ts.map +1 -0
- package/dist/ui/SignupForm.svelte +117 -0
- package/dist/ui/SignupForm.svelte.d.ts +7 -0
- package/dist/ui/SignupForm.svelte.d.ts.map +1 -0
- package/dist/ui/SurfaceExplorer.svelte +287 -0
- package/dist/ui/SurfaceExplorer.svelte.d.ts +8 -0
- package/dist/ui/SurfaceExplorer.svelte.d.ts.map +1 -0
- package/dist/ui/account_sessions_state.svelte.d.ts +15 -0
- package/dist/ui/account_sessions_state.svelte.d.ts.map +1 -0
- package/dist/ui/account_sessions_state.svelte.js +45 -0
- package/dist/ui/admin_accounts_state.svelte.d.ts +19 -0
- package/dist/ui/admin_accounts_state.svelte.d.ts.map +1 -0
- package/dist/ui/admin_accounts_state.svelte.js +65 -0
- package/dist/ui/admin_invites_state.svelte.d.ts +19 -0
- package/dist/ui/admin_invites_state.svelte.d.ts.map +1 -0
- package/dist/ui/admin_invites_state.svelte.js +71 -0
- package/dist/ui/admin_sessions_state.svelte.d.ts +18 -0
- package/dist/ui/admin_sessions_state.svelte.d.ts.map +1 -0
- package/dist/ui/admin_sessions_state.svelte.js +62 -0
- package/dist/ui/app_settings_state.svelte.d.ts +14 -0
- package/dist/ui/app_settings_state.svelte.d.ts.map +1 -0
- package/dist/ui/app_settings_state.svelte.js +44 -0
- package/dist/ui/audit_log_state.svelte.d.ts +40 -0
- package/dist/ui/audit_log_state.svelte.d.ts.map +1 -0
- package/dist/ui/audit_log_state.svelte.js +153 -0
- package/dist/ui/auth_state.svelte.d.ts +85 -0
- package/dist/ui/auth_state.svelte.d.ts.map +1 -0
- package/dist/ui/auth_state.svelte.js +238 -0
- package/dist/ui/datatable.d.ts +25 -0
- package/dist/ui/datatable.d.ts.map +1 -0
- package/dist/ui/datatable.js +9 -0
- package/dist/ui/enter_advance.d.ts +13 -0
- package/dist/ui/enter_advance.d.ts.map +1 -0
- package/dist/ui/enter_advance.js +30 -0
- package/dist/ui/loadable.svelte.d.ts +55 -0
- package/dist/ui/loadable.svelte.d.ts.map +1 -0
- package/dist/ui/loadable.svelte.js +75 -0
- package/dist/ui/popover.svelte.d.ts +137 -0
- package/dist/ui/popover.svelte.d.ts.map +1 -0
- package/dist/ui/popover.svelte.js +288 -0
- package/dist/ui/position_helpers.d.ts +27 -0
- package/dist/ui/position_helpers.d.ts.map +1 -0
- package/dist/ui/position_helpers.js +81 -0
- package/dist/ui/sidebar_state.svelte.d.ts +30 -0
- package/dist/ui/sidebar_state.svelte.d.ts.map +1 -0
- package/dist/ui/sidebar_state.svelte.js +39 -0
- package/dist/ui/table_state.svelte.d.ts +63 -0
- package/dist/ui/table_state.svelte.d.ts.map +1 -0
- package/dist/ui/table_state.svelte.js +117 -0
- package/dist/ui/ui_fetch.d.ts +29 -0
- package/dist/ui/ui_fetch.d.ts.map +1 -0
- package/dist/ui/ui_fetch.js +37 -0
- package/dist/ui/ui_format.d.ts +63 -0
- package/dist/ui/ui_format.d.ts.map +1 -0
- package/dist/ui/ui_format.js +196 -0
- package/package.json +121 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API token query functions for token CRUD and validation.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import type { Logger } from '@fuzdev/fuz_util/log.js';
|
|
7
|
+
import type { QueryDeps } from '../db/query_deps.js';
|
|
8
|
+
import type { ApiToken } from './account_schema.js';
|
|
9
|
+
/** Extended deps for `query_validate_api_token` which needs a logger. */
|
|
10
|
+
export interface ApiTokenQueryDeps extends QueryDeps {
|
|
11
|
+
log: Logger;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Store a new API token (the hash, not the raw token).
|
|
15
|
+
*
|
|
16
|
+
* @param deps - query dependencies
|
|
17
|
+
* @param id - the public token id (e.g. `tok_abc123`)
|
|
18
|
+
* @param account_id - the owning account
|
|
19
|
+
* @param name - human-readable name
|
|
20
|
+
* @param token_hash - blake3 hash of the raw token
|
|
21
|
+
* @param expires_at - optional expiration
|
|
22
|
+
* @returns the stored token record
|
|
23
|
+
*/
|
|
24
|
+
export declare const query_create_api_token: (deps: QueryDeps, id: string, account_id: string, name: string, token_hash: string, expires_at?: Date | null) => Promise<ApiToken>;
|
|
25
|
+
/**
|
|
26
|
+
* Validate a raw API token and return the token record.
|
|
27
|
+
*
|
|
28
|
+
* Hashes the token with blake3, looks up the hash, and checks
|
|
29
|
+
* expiration. Updates `last_used_at` and `last_used_ip` on success
|
|
30
|
+
* (fire-and-forget — errors logged, never thrown).
|
|
31
|
+
*
|
|
32
|
+
* @param deps - query dependencies with logger
|
|
33
|
+
* @param raw_token - the raw API token from the Authorization header
|
|
34
|
+
* @param ip - the client IP address (for audit)
|
|
35
|
+
* @param pending_effects - optional array to register the usage-tracking effect for later awaiting
|
|
36
|
+
* @returns the token record if valid, or `undefined`
|
|
37
|
+
*/
|
|
38
|
+
export declare const query_validate_api_token: (deps: ApiTokenQueryDeps, raw_token: string, ip: string | undefined, pending_effects: Array<Promise<void>> | undefined) => Promise<ApiToken | undefined>;
|
|
39
|
+
/**
|
|
40
|
+
* Revoke all tokens for an account.
|
|
41
|
+
*
|
|
42
|
+
* @param deps - query dependencies
|
|
43
|
+
* @param account_id - the account whose tokens to revoke
|
|
44
|
+
* @returns the number of tokens revoked
|
|
45
|
+
*/
|
|
46
|
+
export declare const query_revoke_all_api_tokens_for_account: (deps: QueryDeps, account_id: string) => Promise<number>;
|
|
47
|
+
/**
|
|
48
|
+
* Revoke a token only if it belongs to the specified account.
|
|
49
|
+
*
|
|
50
|
+
* Prevents cross-account token revocation.
|
|
51
|
+
*
|
|
52
|
+
* @param deps - query dependencies
|
|
53
|
+
* @param id - the public token id
|
|
54
|
+
* @param account_id - the account that must own the token
|
|
55
|
+
* @returns `true` if a token was revoked, `false` if not found or wrong account
|
|
56
|
+
*/
|
|
57
|
+
export declare const query_revoke_api_token_for_account: (deps: QueryDeps, id: string, account_id: string) => Promise<boolean>;
|
|
58
|
+
/**
|
|
59
|
+
* List all tokens for an account (does not include hashes).
|
|
60
|
+
*
|
|
61
|
+
* Columns are enumerated explicitly to exclude `token_hash`.
|
|
62
|
+
* Must be updated if the `api_token` table gains new columns.
|
|
63
|
+
*/
|
|
64
|
+
export declare const query_api_token_list_for_account: (deps: QueryDeps, account_id: string) => Promise<Array<Omit<ApiToken, "token_hash">>>;
|
|
65
|
+
/**
|
|
66
|
+
* Enforce a per-account token limit by evicting the oldest tokens.
|
|
67
|
+
*
|
|
68
|
+
* Race safety: this function must run inside a transaction alongside the
|
|
69
|
+
* INSERT that created the new token. The caller (`POST /tokens/create`)
|
|
70
|
+
* uses the default `transaction: true` (framework-managed transaction
|
|
71
|
+
* wrapping in `apply_route_specs`), ensuring the INSERT + enforce_limit
|
|
72
|
+
* pair is atomic — concurrent token creation cannot interleave.
|
|
73
|
+
*
|
|
74
|
+
* @param deps - query dependencies (must be transaction-scoped)
|
|
75
|
+
* @param account_id - the account to enforce the limit for
|
|
76
|
+
* @param max_tokens - maximum number of tokens to keep
|
|
77
|
+
* @returns the number of tokens evicted
|
|
78
|
+
*/
|
|
79
|
+
export declare const query_api_token_enforce_limit: (deps: QueryDeps, account_id: string, max_tokens: number) => Promise<number>;
|
|
80
|
+
//# sourceMappingURL=api_token_queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api_token_queries.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/api_token_queries.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAEpD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAEnD,OAAO,KAAK,EAAC,QAAQ,EAAC,MAAM,qBAAqB,CAAC;AAGlD,yEAAyE;AACzE,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IACnD,GAAG,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,GAClC,MAAM,SAAS,EACf,IAAI,MAAM,EACV,YAAY,MAAM,EAClB,MAAM,MAAM,EACZ,YAAY,MAAM,EAClB,aAAa,IAAI,GAAG,IAAI,KACtB,OAAO,CAAC,QAAQ,CAQlB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,wBAAwB,GACpC,MAAM,iBAAiB,EACvB,WAAW,MAAM,EACjB,IAAI,MAAM,GAAG,SAAS,EACtB,iBAAiB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,SAAS,KAC/C,OAAO,CAAC,QAAQ,GAAG,SAAS,CAuB9B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,uCAAuC,GACnD,MAAM,SAAS,EACf,YAAY,MAAM,KAChB,OAAO,CAAC,MAAM,CAMhB,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,kCAAkC,GAC9C,MAAM,SAAS,EACf,IAAI,MAAM,EACV,YAAY,MAAM,KAChB,OAAO,CAAC,OAAO,CAMjB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gCAAgC,GAC5C,MAAM,SAAS,EACf,YAAY,MAAM,KAChB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAM7C,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,6BAA6B,GACzC,MAAM,SAAS,EACf,YAAY,MAAM,EAClB,YAAY,MAAM,KAChB,OAAO,CAAC,MAAM,CAYhB,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API token query functions for token CRUD and validation.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { assert_row } from '../db/assert_row.js';
|
|
7
|
+
import { hash_api_token } from './api_token.js';
|
|
8
|
+
/**
|
|
9
|
+
* Store a new API token (the hash, not the raw token).
|
|
10
|
+
*
|
|
11
|
+
* @param deps - query dependencies
|
|
12
|
+
* @param id - the public token id (e.g. `tok_abc123`)
|
|
13
|
+
* @param account_id - the owning account
|
|
14
|
+
* @param name - human-readable name
|
|
15
|
+
* @param token_hash - blake3 hash of the raw token
|
|
16
|
+
* @param expires_at - optional expiration
|
|
17
|
+
* @returns the stored token record
|
|
18
|
+
*/
|
|
19
|
+
export const query_create_api_token = async (deps, id, account_id, name, token_hash, expires_at) => {
|
|
20
|
+
const row = await deps.db.query_one(`INSERT INTO api_token (id, account_id, name, token_hash, expires_at)
|
|
21
|
+
VALUES ($1, $2, $3, $4, $5)
|
|
22
|
+
RETURNING *`, [id, account_id, name, token_hash, expires_at?.toISOString() ?? null]);
|
|
23
|
+
return assert_row(row, 'INSERT INTO api_token');
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Validate a raw API token and return the token record.
|
|
27
|
+
*
|
|
28
|
+
* Hashes the token with blake3, looks up the hash, and checks
|
|
29
|
+
* expiration. Updates `last_used_at` and `last_used_ip` on success
|
|
30
|
+
* (fire-and-forget — errors logged, never thrown).
|
|
31
|
+
*
|
|
32
|
+
* @param deps - query dependencies with logger
|
|
33
|
+
* @param raw_token - the raw API token from the Authorization header
|
|
34
|
+
* @param ip - the client IP address (for audit)
|
|
35
|
+
* @param pending_effects - optional array to register the usage-tracking effect for later awaiting
|
|
36
|
+
* @returns the token record if valid, or `undefined`
|
|
37
|
+
*/
|
|
38
|
+
export const query_validate_api_token = async (deps, raw_token, ip, pending_effects) => {
|
|
39
|
+
const token_hash = hash_api_token(raw_token);
|
|
40
|
+
const row = await deps.db.query_one(`SELECT * FROM api_token
|
|
41
|
+
WHERE token_hash = $1
|
|
42
|
+
AND (expires_at IS NULL OR expires_at > NOW())`, [token_hash]);
|
|
43
|
+
if (!row)
|
|
44
|
+
return undefined;
|
|
45
|
+
// Fire-and-forget usage tracking
|
|
46
|
+
const p = deps.db
|
|
47
|
+
.query(`UPDATE api_token SET last_used_at = NOW(), last_used_ip = $1 WHERE id = $2`, [
|
|
48
|
+
ip ?? null,
|
|
49
|
+
row.id,
|
|
50
|
+
])
|
|
51
|
+
.then(() => { }) // eslint-disable-line @typescript-eslint/no-empty-function
|
|
52
|
+
.catch((err) => {
|
|
53
|
+
deps.log.error('Failed to update last_used_at:', err);
|
|
54
|
+
});
|
|
55
|
+
pending_effects?.push(p);
|
|
56
|
+
return row;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Revoke all tokens for an account.
|
|
60
|
+
*
|
|
61
|
+
* @param deps - query dependencies
|
|
62
|
+
* @param account_id - the account whose tokens to revoke
|
|
63
|
+
* @returns the number of tokens revoked
|
|
64
|
+
*/
|
|
65
|
+
export const query_revoke_all_api_tokens_for_account = async (deps, account_id) => {
|
|
66
|
+
const rows = await deps.db.query(`DELETE FROM api_token WHERE account_id = $1 RETURNING id`, [account_id]);
|
|
67
|
+
return rows.length;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Revoke a token only if it belongs to the specified account.
|
|
71
|
+
*
|
|
72
|
+
* Prevents cross-account token revocation.
|
|
73
|
+
*
|
|
74
|
+
* @param deps - query dependencies
|
|
75
|
+
* @param id - the public token id
|
|
76
|
+
* @param account_id - the account that must own the token
|
|
77
|
+
* @returns `true` if a token was revoked, `false` if not found or wrong account
|
|
78
|
+
*/
|
|
79
|
+
export const query_revoke_api_token_for_account = async (deps, id, account_id) => {
|
|
80
|
+
const rows = await deps.db.query(`DELETE FROM api_token WHERE id = $1 AND account_id = $2 RETURNING id`, [id, account_id]);
|
|
81
|
+
return rows.length > 0;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* List all tokens for an account (does not include hashes).
|
|
85
|
+
*
|
|
86
|
+
* Columns are enumerated explicitly to exclude `token_hash`.
|
|
87
|
+
* Must be updated if the `api_token` table gains new columns.
|
|
88
|
+
*/
|
|
89
|
+
export const query_api_token_list_for_account = async (deps, account_id) => {
|
|
90
|
+
return deps.db.query(`SELECT id, account_id, name, expires_at, last_used_at, last_used_ip, created_at
|
|
91
|
+
FROM api_token WHERE account_id = $1 ORDER BY created_at DESC`, [account_id]);
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* Enforce a per-account token limit by evicting the oldest tokens.
|
|
95
|
+
*
|
|
96
|
+
* Race safety: this function must run inside a transaction alongside the
|
|
97
|
+
* INSERT that created the new token. The caller (`POST /tokens/create`)
|
|
98
|
+
* uses the default `transaction: true` (framework-managed transaction
|
|
99
|
+
* wrapping in `apply_route_specs`), ensuring the INSERT + enforce_limit
|
|
100
|
+
* pair is atomic — concurrent token creation cannot interleave.
|
|
101
|
+
*
|
|
102
|
+
* @param deps - query dependencies (must be transaction-scoped)
|
|
103
|
+
* @param account_id - the account to enforce the limit for
|
|
104
|
+
* @param max_tokens - maximum number of tokens to keep
|
|
105
|
+
* @returns the number of tokens evicted
|
|
106
|
+
*/
|
|
107
|
+
export const query_api_token_enforce_limit = async (deps, account_id, max_tokens) => {
|
|
108
|
+
const rows = await deps.db.query(`DELETE FROM api_token
|
|
109
|
+
WHERE id IN (
|
|
110
|
+
SELECT id FROM api_token
|
|
111
|
+
WHERE account_id = $1
|
|
112
|
+
ORDER BY created_at DESC
|
|
113
|
+
OFFSET $2
|
|
114
|
+
) RETURNING id`, [account_id, max_tokens]);
|
|
115
|
+
return rows.length;
|
|
116
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App settings database queries.
|
|
3
|
+
*
|
|
4
|
+
* Single-row table queries for global app configuration.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import type { QueryDeps } from '../db/query_deps.js';
|
|
9
|
+
import type { AppSettings, AppSettingsWithUsernameJson } from './app_settings_schema.js';
|
|
10
|
+
/**
|
|
11
|
+
* Load the current app settings.
|
|
12
|
+
*
|
|
13
|
+
* @param deps - query dependencies
|
|
14
|
+
* @returns the app settings row
|
|
15
|
+
*/
|
|
16
|
+
export declare const query_app_settings_load: (deps: QueryDeps) => Promise<AppSettings>;
|
|
17
|
+
/**
|
|
18
|
+
* Load the current app settings with resolved updater username.
|
|
19
|
+
*
|
|
20
|
+
* @param deps - query dependencies
|
|
21
|
+
* @returns the app settings with `updated_by_username`
|
|
22
|
+
*/
|
|
23
|
+
export declare const query_app_settings_load_with_username: (deps: QueryDeps) => Promise<AppSettingsWithUsernameJson>;
|
|
24
|
+
/**
|
|
25
|
+
* Update app settings and return the updated row.
|
|
26
|
+
*
|
|
27
|
+
* @param deps - query dependencies
|
|
28
|
+
* @param open_signup - new value for the open_signup toggle
|
|
29
|
+
* @param actor_id - the actor making the change
|
|
30
|
+
* @returns the updated app settings row
|
|
31
|
+
*/
|
|
32
|
+
export declare const query_app_settings_update: (deps: QueryDeps, open_signup: boolean, actor_id: string) => Promise<AppSettings>;
|
|
33
|
+
//# sourceMappingURL=app_settings_queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app_settings_queries.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/app_settings_queries.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAC,WAAW,EAAE,2BAA2B,EAAC,MAAM,0BAA0B,CAAC;AAEvF;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,GAAU,MAAM,SAAS,KAAG,OAAO,CAAC,WAAW,CAQlF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,qCAAqC,GACjD,MAAM,SAAS,KACb,OAAO,CAAC,2BAA2B,CAWrC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,yBAAyB,GACrC,MAAM,SAAS,EACf,aAAa,OAAO,EACpB,UAAU,MAAM,KACd,OAAO,CAAC,WAAW,CASrB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App settings database queries.
|
|
3
|
+
*
|
|
4
|
+
* Single-row table queries for global app configuration.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Load the current app settings.
|
|
10
|
+
*
|
|
11
|
+
* @param deps - query dependencies
|
|
12
|
+
* @returns the app settings row
|
|
13
|
+
*/
|
|
14
|
+
export const query_app_settings_load = async (deps) => {
|
|
15
|
+
const row = await deps.db.query_one(`SELECT open_signup, updated_at, updated_by FROM app_settings WHERE id = 1`);
|
|
16
|
+
if (!row) {
|
|
17
|
+
throw new Error('app_settings row not found — migration may not have run');
|
|
18
|
+
}
|
|
19
|
+
return row;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Load the current app settings with resolved updater username.
|
|
23
|
+
*
|
|
24
|
+
* @param deps - query dependencies
|
|
25
|
+
* @returns the app settings with `updated_by_username`
|
|
26
|
+
*/
|
|
27
|
+
export const query_app_settings_load_with_username = async (deps) => {
|
|
28
|
+
const row = await deps.db.query_one(`SELECT s.open_signup, s.updated_at, s.updated_by, act.name AS updated_by_username
|
|
29
|
+
FROM app_settings s
|
|
30
|
+
LEFT JOIN actor act ON act.id = s.updated_by
|
|
31
|
+
WHERE s.id = 1`);
|
|
32
|
+
if (!row) {
|
|
33
|
+
throw new Error('app_settings row not found — migration may not have run');
|
|
34
|
+
}
|
|
35
|
+
return row;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Update app settings and return the updated row.
|
|
39
|
+
*
|
|
40
|
+
* @param deps - query dependencies
|
|
41
|
+
* @param open_signup - new value for the open_signup toggle
|
|
42
|
+
* @param actor_id - the actor making the change
|
|
43
|
+
* @returns the updated app settings row
|
|
44
|
+
*/
|
|
45
|
+
export const query_app_settings_update = async (deps, open_signup, actor_id) => {
|
|
46
|
+
const row = await deps.db.query_one(`UPDATE app_settings SET open_signup = $1, updated_at = NOW(), updated_by = $2 WHERE id = 1 RETURNING open_signup, updated_at, updated_by`, [open_signup, actor_id]);
|
|
47
|
+
if (!row) {
|
|
48
|
+
throw new Error('app_settings row not found — migration may not have run');
|
|
49
|
+
}
|
|
50
|
+
return row;
|
|
51
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin app settings route specs.
|
|
3
|
+
*
|
|
4
|
+
* GET and PATCH routes for managing global app settings (e.g. open signup toggle).
|
|
5
|
+
* All routes require the `admin` role.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { type RouteSpec } from '../http/route_spec.js';
|
|
10
|
+
import { type AppSettings } from './app_settings_schema.js';
|
|
11
|
+
import type { RouteFactoryDeps } from './deps.js';
|
|
12
|
+
/**
|
|
13
|
+
* Per-factory configuration for app settings route specs.
|
|
14
|
+
*/
|
|
15
|
+
export interface AppSettingsRouteOptions {
|
|
16
|
+
/** Mutable ref to the in-memory app settings — mutated on PATCH. */
|
|
17
|
+
app_settings: AppSettings;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create admin app settings route specs.
|
|
21
|
+
*
|
|
22
|
+
* @param deps - stateless capabilities (log, on_audit_event)
|
|
23
|
+
* @param options - per-factory configuration
|
|
24
|
+
* @returns route specs for app settings management
|
|
25
|
+
*/
|
|
26
|
+
export declare const create_app_settings_route_specs: (deps: Pick<RouteFactoryDeps, "log" | "on_audit_event">, options: AppSettingsRouteOptions) => Array<RouteSpec>;
|
|
27
|
+
//# sourceMappingURL=app_settings_routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app_settings_routes.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/app_settings_routes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAkB,KAAK,SAAS,EAAC,MAAM,uBAAuB,CAAC;AAQtE,OAAO,EAGN,KAAK,WAAW,EAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,WAAW,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACvC,oEAAoE;IACpE,YAAY,EAAE,WAAW,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,+BAA+B,GAC3C,MAAM,IAAI,CAAC,gBAAgB,EAAE,KAAK,GAAG,gBAAgB,CAAC,EACtD,SAAS,uBAAuB,KAC9B,KAAK,CAAC,SAAS,CAoDjB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Admin app settings route specs.
|
|
3
|
+
*
|
|
4
|
+
* GET and PATCH routes for managing global app settings (e.g. open signup toggle).
|
|
5
|
+
* All routes require the `admin` role.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { get_route_input } from '../http/route_spec.js';
|
|
11
|
+
import { require_request_context } from './request_context.js';
|
|
12
|
+
import { get_client_ip } from '../http/proxy.js';
|
|
13
|
+
import { audit_log_fire_and_forget } from './audit_log_queries.js';
|
|
14
|
+
import { query_app_settings_load_with_username, query_app_settings_update, } from './app_settings_queries.js';
|
|
15
|
+
import { AppSettingsWithUsernameJson, UpdateAppSettingsInput, } from './app_settings_schema.js';
|
|
16
|
+
/**
|
|
17
|
+
* Create admin app settings route specs.
|
|
18
|
+
*
|
|
19
|
+
* @param deps - stateless capabilities (log, on_audit_event)
|
|
20
|
+
* @param options - per-factory configuration
|
|
21
|
+
* @returns route specs for app settings management
|
|
22
|
+
*/
|
|
23
|
+
export const create_app_settings_route_specs = (deps, options) => {
|
|
24
|
+
const { app_settings } = options;
|
|
25
|
+
return [
|
|
26
|
+
{
|
|
27
|
+
method: 'GET',
|
|
28
|
+
path: '/settings',
|
|
29
|
+
auth: { type: 'role', role: 'admin' },
|
|
30
|
+
description: 'Get app settings',
|
|
31
|
+
input: z.null(),
|
|
32
|
+
output: z.strictObject({ settings: AppSettingsWithUsernameJson }),
|
|
33
|
+
handler: async (c, route) => {
|
|
34
|
+
const settings = await query_app_settings_load_with_username(route);
|
|
35
|
+
return c.json({ settings });
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
method: 'PATCH',
|
|
40
|
+
path: '/settings',
|
|
41
|
+
auth: { type: 'role', role: 'admin' },
|
|
42
|
+
description: 'Update app settings',
|
|
43
|
+
input: UpdateAppSettingsInput,
|
|
44
|
+
output: z.strictObject({ ok: z.literal(true), settings: AppSettingsWithUsernameJson }),
|
|
45
|
+
handler: async (c, route) => {
|
|
46
|
+
const ctx = require_request_context(c);
|
|
47
|
+
const { open_signup } = get_route_input(c);
|
|
48
|
+
const old_value = app_settings.open_signup;
|
|
49
|
+
const updated = await query_app_settings_update(route, open_signup, ctx.actor.id);
|
|
50
|
+
// Mutate the in-memory ref so GET reads are consistent
|
|
51
|
+
app_settings.open_signup = updated.open_signup;
|
|
52
|
+
app_settings.updated_at = updated.updated_at;
|
|
53
|
+
app_settings.updated_by = updated.updated_by;
|
|
54
|
+
void audit_log_fire_and_forget(route, {
|
|
55
|
+
event_type: 'app_settings_update',
|
|
56
|
+
actor_id: ctx.actor.id,
|
|
57
|
+
account_id: ctx.account.id,
|
|
58
|
+
ip: get_client_ip(c),
|
|
59
|
+
metadata: { setting: 'open_signup', old_value, new_value: open_signup },
|
|
60
|
+
}, deps.log, deps.on_audit_event);
|
|
61
|
+
const settings_with_username = await query_app_settings_load_with_username(route);
|
|
62
|
+
return c.json({ ok: true, settings: settings_with_username });
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
];
|
|
66
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App settings types and client-safe schemas.
|
|
3
|
+
*
|
|
4
|
+
* Single-row table for global app configuration (e.g. open signup toggle).
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
/** App settings row from the database. */
|
|
10
|
+
export interface AppSettings {
|
|
11
|
+
open_signup: boolean;
|
|
12
|
+
updated_at: string | null;
|
|
13
|
+
updated_by: string | null;
|
|
14
|
+
}
|
|
15
|
+
/** Zod schema for client-safe app settings data. */
|
|
16
|
+
export declare const AppSettingsJson: z.ZodObject<{
|
|
17
|
+
open_signup: z.ZodBoolean;
|
|
18
|
+
updated_at: z.ZodNullable<z.ZodString>;
|
|
19
|
+
updated_by: z.ZodNullable<z.ZodString>;
|
|
20
|
+
}, z.core.$strict>;
|
|
21
|
+
export type AppSettingsJson = z.infer<typeof AppSettingsJson>;
|
|
22
|
+
/** Zod schema for admin app settings with resolved updater username. */
|
|
23
|
+
export declare const AppSettingsWithUsernameJson: z.ZodObject<{
|
|
24
|
+
open_signup: z.ZodBoolean;
|
|
25
|
+
updated_at: z.ZodNullable<z.ZodString>;
|
|
26
|
+
updated_by: z.ZodNullable<z.ZodString>;
|
|
27
|
+
updated_by_username: z.ZodNullable<z.ZodString>;
|
|
28
|
+
}, z.core.$strict>;
|
|
29
|
+
export type AppSettingsWithUsernameJson = z.infer<typeof AppSettingsWithUsernameJson>;
|
|
30
|
+
/** Zod schema for updating app settings. */
|
|
31
|
+
export declare const UpdateAppSettingsInput: z.ZodObject<{
|
|
32
|
+
open_signup: z.ZodBoolean;
|
|
33
|
+
}, z.core.$strict>;
|
|
34
|
+
export type UpdateAppSettingsInput = z.infer<typeof UpdateAppSettingsInput>;
|
|
35
|
+
//# sourceMappingURL=app_settings_schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app_settings_schema.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/app_settings_schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,0CAA0C;AAC1C,MAAM,WAAW,WAAW;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,oDAAoD;AACpD,eAAO,MAAM,eAAe;;;;kBAI1B,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,wEAAwE;AACxE,eAAO,MAAM,2BAA2B;;;;;kBAEtC,CAAC;AACH,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEtF,4CAA4C;AAC5C,eAAO,MAAM,sBAAsB;;kBAEjC,CAAC;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App settings types and client-safe schemas.
|
|
3
|
+
*
|
|
4
|
+
* Single-row table for global app configuration (e.g. open signup toggle).
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
/** Zod schema for client-safe app settings data. */
|
|
10
|
+
export const AppSettingsJson = z.strictObject({
|
|
11
|
+
open_signup: z.boolean(),
|
|
12
|
+
updated_at: z.string().nullable(),
|
|
13
|
+
updated_by: z.string().nullable(),
|
|
14
|
+
});
|
|
15
|
+
/** Zod schema for admin app settings with resolved updater username. */
|
|
16
|
+
export const AppSettingsWithUsernameJson = AppSettingsJson.extend({
|
|
17
|
+
updated_by_username: z.string().nullable(),
|
|
18
|
+
});
|
|
19
|
+
/** Zod schema for updating app settings. */
|
|
20
|
+
export const UpdateAppSettingsInput = z.strictObject({
|
|
21
|
+
open_signup: z.boolean(),
|
|
22
|
+
});
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit log database queries.
|
|
3
|
+
*
|
|
4
|
+
* Records and retrieves auth mutation events for security monitoring.
|
|
5
|
+
* All write operations should use `audit_log_fire_and_forget` to
|
|
6
|
+
* ensure audit logging never blocks or breaks auth flows.
|
|
7
|
+
*
|
|
8
|
+
* Rollback resilience: `audit_log_fire_and_forget` writes to `background_db`
|
|
9
|
+
* (pool-level), not the handler's transaction-scoped `db`, so audit entries
|
|
10
|
+
* persist even when the request transaction rolls back.
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
import type { Logger } from '@fuzdev/fuz_util/log.js';
|
|
15
|
+
import type { QueryDeps } from '../db/query_deps.js';
|
|
16
|
+
import type { RouteContext } from '../http/route_spec.js';
|
|
17
|
+
import { type AuditEventType, type AuditLogEvent, type AuditLogInput, type AuditLogListOptions, type AuditLogEventWithUsernamesJson, type PermitHistoryEventJson } from './audit_log_schema.js';
|
|
18
|
+
/** Default limit for audit log listings. */
|
|
19
|
+
export declare const AUDIT_LOG_DEFAULT_LIMIT = 50;
|
|
20
|
+
/**
|
|
21
|
+
* Insert an audit log entry.
|
|
22
|
+
*
|
|
23
|
+
* Uses `RETURNING *` to return the full inserted row including
|
|
24
|
+
* DB-assigned fields (`id`, `seq`, `created_at`).
|
|
25
|
+
*
|
|
26
|
+
* In DEV mode, validates metadata against the per-event-type schema
|
|
27
|
+
* before writing (warns on mismatch, never throws).
|
|
28
|
+
*
|
|
29
|
+
* @param deps - query dependencies
|
|
30
|
+
* @param input - the audit event to record
|
|
31
|
+
* @returns the inserted audit log row
|
|
32
|
+
*/
|
|
33
|
+
export declare const query_audit_log: <T extends AuditEventType>(deps: QueryDeps, input: AuditLogInput<T>) => Promise<AuditLogEvent>;
|
|
34
|
+
/**
|
|
35
|
+
* List audit log entries, newest first.
|
|
36
|
+
*
|
|
37
|
+
* @param deps - query dependencies
|
|
38
|
+
* @param options - filters and pagination
|
|
39
|
+
* @returns matching audit log entries
|
|
40
|
+
*/
|
|
41
|
+
export declare const query_audit_log_list: (deps: QueryDeps, options?: AuditLogListOptions) => Promise<Array<AuditLogEvent>>;
|
|
42
|
+
/**
|
|
43
|
+
* List audit log entries with resolved usernames, newest first.
|
|
44
|
+
*
|
|
45
|
+
* @param deps - query dependencies
|
|
46
|
+
* @param options - filters and pagination
|
|
47
|
+
* @returns matching audit log entries with `username` and `target_username`
|
|
48
|
+
*/
|
|
49
|
+
export declare const query_audit_log_list_with_usernames: (deps: QueryDeps, options?: AuditLogListOptions) => Promise<Array<AuditLogEventWithUsernamesJson>>;
|
|
50
|
+
/**
|
|
51
|
+
* List audit log entries related to an account (as actor or target).
|
|
52
|
+
*
|
|
53
|
+
* @param deps - query dependencies
|
|
54
|
+
* @param account_id - the account to query for
|
|
55
|
+
* @param limit - maximum entries to return
|
|
56
|
+
*/
|
|
57
|
+
export declare const query_audit_log_list_for_account: (deps: QueryDeps, account_id: string, limit?: number) => Promise<Array<AuditLogEvent>>;
|
|
58
|
+
/**
|
|
59
|
+
* List permit grant/revoke events with resolved usernames.
|
|
60
|
+
*
|
|
61
|
+
* @param deps - query dependencies
|
|
62
|
+
* @param limit - maximum entries to return
|
|
63
|
+
* @param offset - number of entries to skip
|
|
64
|
+
* @returns permit history events with `username` and `target_username`
|
|
65
|
+
*/
|
|
66
|
+
export declare const query_audit_log_list_permit_history: (deps: QueryDeps, limit?: number, offset?: number) => Promise<Array<PermitHistoryEventJson>>;
|
|
67
|
+
/**
|
|
68
|
+
* Delete audit log entries older than the given date.
|
|
69
|
+
*
|
|
70
|
+
* @param deps - query dependencies
|
|
71
|
+
* @param before - delete entries created before this date
|
|
72
|
+
* @returns the number of entries deleted
|
|
73
|
+
*/
|
|
74
|
+
export declare const query_audit_log_cleanup_before: (deps: QueryDeps, before: Date) => Promise<number>;
|
|
75
|
+
/**
|
|
76
|
+
* Log an audit event without blocking the caller.
|
|
77
|
+
*
|
|
78
|
+
* Errors are logged to console — audit logging never breaks auth flows.
|
|
79
|
+
* Uses `background_db` so audit entries persist even if the request transaction rolls back.
|
|
80
|
+
* Write failures and `on_event` callback failures are logged separately
|
|
81
|
+
* so the error message indicates which phase failed.
|
|
82
|
+
*
|
|
83
|
+
* @param route - `background_db` and `pending_effects` from the route context
|
|
84
|
+
* @param input - the audit event to record
|
|
85
|
+
* @param log - the logger instance
|
|
86
|
+
* @param on_event - callback invoked with the inserted row after a successful write
|
|
87
|
+
* @returns the settled promise (callers may ignore it — fire-and-forget semantics preserved)
|
|
88
|
+
*/
|
|
89
|
+
export declare const audit_log_fire_and_forget: <T extends AuditEventType>(route: Pick<RouteContext, "background_db" | "pending_effects">, input: AuditLogInput<T>, log: Logger, on_event: (event: AuditLogEvent) => void) => Promise<void>;
|
|
90
|
+
//# sourceMappingURL=audit_log_queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit_log_queries.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/auth/audit_log_queries.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAGpD,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAEnD,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAEN,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACxB,KAAK,8BAA8B,EACnC,KAAK,sBAAsB,EAC3B,MAAM,uBAAuB,CAAC;AAE/B,4CAA4C;AAC5C,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,eAAe,GAAU,CAAC,SAAS,cAAc,EAC7D,MAAM,SAAS,EACf,OAAO,aAAa,CAAC,CAAC,CAAC,KACrB,OAAO,CAAC,aAAa,CAuBvB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAChC,MAAM,SAAS,EACf,UAAU,mBAAmB,KAC3B,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAwC9B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mCAAmC,GAC/C,MAAM,SAAS,EACf,UAAU,mBAAmB,KAC3B,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CA8C/C,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,gCAAgC,GAC5C,MAAM,SAAS,EACf,YAAY,MAAM,EAClB,cAA+B,KAC7B,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAO9B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,mCAAmC,GAC/C,MAAM,SAAS,EACf,cAA+B,EAC/B,eAAU,KACR,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAYvC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,8BAA8B,GAC1C,MAAM,SAAS,EACf,QAAQ,IAAI,KACV,OAAO,CAAC,MAAM,CAMhB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,yBAAyB,GAAI,CAAC,SAAS,cAAc,EACjE,OAAO,IAAI,CAAC,YAAY,EAAE,eAAe,GAAG,iBAAiB,CAAC,EAC9D,OAAO,aAAa,CAAC,CAAC,CAAC,EACvB,KAAK,MAAM,EACX,UAAU,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,KACtC,OAAO,CAAC,IAAI,CAcd,CAAC"}
|