@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,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options for configuring a `SidebarState`.
|
|
3
|
+
*
|
|
4
|
+
* @param enabled Optional reactive getter that controls whether the sidebar is enabled.
|
|
5
|
+
* When provided, overrides the internal `enabled` state.
|
|
6
|
+
* `show_sidebar` automatically returns `false` when `enabled` is `false`.
|
|
7
|
+
*/
|
|
8
|
+
export interface SidebarStateOptions {
|
|
9
|
+
enabled?: () => boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare class SidebarState {
|
|
12
|
+
#private;
|
|
13
|
+
get enabled(): boolean;
|
|
14
|
+
set enabled(value: boolean);
|
|
15
|
+
get show_sidebar(): boolean;
|
|
16
|
+
set show_sidebar(value: boolean);
|
|
17
|
+
constructor(options?: SidebarStateOptions);
|
|
18
|
+
toggle_sidebar(value?: boolean): void;
|
|
19
|
+
/**
|
|
20
|
+
* Activates the sidebar, showing it and enabling the toggle.
|
|
21
|
+
* Returns a cleanup function that deactivates.
|
|
22
|
+
*/
|
|
23
|
+
activate(): () => void;
|
|
24
|
+
}
|
|
25
|
+
export declare const sidebar_state_context: {
|
|
26
|
+
get: (error_message?: string) => () => SidebarState;
|
|
27
|
+
get_maybe: () => (() => SidebarState) | undefined;
|
|
28
|
+
set: (value: () => SidebarState) => () => SidebarState;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=sidebar_state.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sidebar_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/sidebar_state.svelte.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IACnC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC;CACxB;AAED,qBAAa,YAAY;;IAKxB,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAEzB;IAED,IAAI,YAAY,IAAI,OAAO,CAG1B;IAED,IAAI,YAAY,CAAC,KAAK,EAAE,OAAO,EAE9B;gBAEW,OAAO,CAAC,EAAE,mBAAmB;IAIzC,cAAc,CAAC,KAAK,GAAE,OAA4B,GAAG,IAAI;IAIzD;;;OAGG;IACH,QAAQ,IAAI,MAAM,IAAI;CAQtB;AAED,eAAO,MAAM,qBAAqB;2CAAwB,YAAY;4BAAZ,YAAY;uBAAZ,YAAY,WAAZ,YAAY;CAAG,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { create_context } from '@fuzdev/fuz_ui/context_helpers.js';
|
|
2
|
+
export class SidebarState {
|
|
3
|
+
#get_enabled;
|
|
4
|
+
#enabled = $state(true);
|
|
5
|
+
#show_sidebar = $state(true);
|
|
6
|
+
get enabled() {
|
|
7
|
+
return this.#get_enabled?.() ?? this.#enabled;
|
|
8
|
+
}
|
|
9
|
+
set enabled(value) {
|
|
10
|
+
this.#enabled = value;
|
|
11
|
+
}
|
|
12
|
+
get show_sidebar() {
|
|
13
|
+
if (!this.enabled)
|
|
14
|
+
return false;
|
|
15
|
+
return this.#show_sidebar;
|
|
16
|
+
}
|
|
17
|
+
set show_sidebar(value) {
|
|
18
|
+
this.#show_sidebar = value;
|
|
19
|
+
}
|
|
20
|
+
constructor(options) {
|
|
21
|
+
this.#get_enabled = options?.enabled;
|
|
22
|
+
}
|
|
23
|
+
toggle_sidebar(value = !this.show_sidebar) {
|
|
24
|
+
this.show_sidebar = value;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Activates the sidebar, showing it and enabling the toggle.
|
|
28
|
+
* Returns a cleanup function that deactivates.
|
|
29
|
+
*/
|
|
30
|
+
activate() {
|
|
31
|
+
this.enabled = true;
|
|
32
|
+
this.show_sidebar = true;
|
|
33
|
+
return () => {
|
|
34
|
+
this.enabled = false;
|
|
35
|
+
this.show_sidebar = false;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export const sidebar_state_context = create_context();
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reactive state for database table pagination and data fetching.
|
|
3
|
+
*
|
|
4
|
+
* Extends `Loadable` to manage paginated table data with column metadata,
|
|
5
|
+
* row deletion, and derived pagination controls.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* const table = new TableState();
|
|
10
|
+
* await table.fetch('accounts', 0, 50);
|
|
11
|
+
*
|
|
12
|
+
* // pagination
|
|
13
|
+
* if (table.has_next) table.go_next();
|
|
14
|
+
* await table.fetch(table.table_name, table.offset, table.limit);
|
|
15
|
+
*
|
|
16
|
+
* // deletion
|
|
17
|
+
* const deleted = await table.delete_row(table.rows[0]);
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```svelte
|
|
22
|
+
* <script lang="ts">
|
|
23
|
+
* import {TableState} from '@fuzdev/fuz_app/ui/table_state.svelte.js';
|
|
24
|
+
*
|
|
25
|
+
* const table = new TableState();
|
|
26
|
+
* table.fetch('accounts');
|
|
27
|
+
* </script>
|
|
28
|
+
*
|
|
29
|
+
* {#if table.loading}
|
|
30
|
+
* <p>loading…</p>
|
|
31
|
+
* {:else if table.error}
|
|
32
|
+
* <p>{table.error}</p>
|
|
33
|
+
* {:else}
|
|
34
|
+
* <p>showing {table.showing_start}–{table.showing_end} of {table.total}</p>
|
|
35
|
+
* {/if}
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* @module
|
|
39
|
+
*/
|
|
40
|
+
import { Loadable } from './loadable.svelte.js';
|
|
41
|
+
import type { ColumnInfo } from '../http/db_routes.js';
|
|
42
|
+
/** Maximum number of rows that can be fetched in a single page. */
|
|
43
|
+
export declare const TABLE_LIMIT_MAX = 1000;
|
|
44
|
+
export declare class TableState extends Loadable {
|
|
45
|
+
table_name: string;
|
|
46
|
+
columns: Array<ColumnInfo>;
|
|
47
|
+
rows: Array<Record<string, unknown>>;
|
|
48
|
+
total: number;
|
|
49
|
+
offset: number;
|
|
50
|
+
limit: number;
|
|
51
|
+
primary_key: string | null;
|
|
52
|
+
deleting: string | null;
|
|
53
|
+
delete_error: string | null;
|
|
54
|
+
readonly showing_start: number;
|
|
55
|
+
readonly showing_end: number;
|
|
56
|
+
readonly has_prev: boolean;
|
|
57
|
+
readonly has_next: boolean;
|
|
58
|
+
fetch(table_name: string, offset?: number, limit?: number): Promise<void>;
|
|
59
|
+
go_prev(): void;
|
|
60
|
+
go_next(): void;
|
|
61
|
+
delete_row(row: Record<string, unknown>): Promise<boolean>;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=table_state.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/table_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAG9C,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,sBAAsB,CAAC;AAErD,mEAAmE;AACnE,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC,qBAAa,UAAW,SAAQ,QAAQ;IACvC,UAAU,EAAE,MAAM,CAAc;IAChC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAc;IACxC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAc;IAClD,KAAK,SAAa;IAClB,MAAM,SAAa;IACnB,KAAK,SAAe;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAgB;IAC1C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAgB;IACvC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAgB;IAG3C,QAAQ,CAAC,aAAa,SAAoD;IAC1E,QAAQ,CAAC,WAAW,SAAkE;IACtF,QAAQ,CAAC,QAAQ,UAA6B;IAC9C,QAAQ,CAAC,QAAQ,UAAmD;IAE9D,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,SAAI,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBvE,OAAO,IAAI,IAAI;IAIf,OAAO,IAAI,IAAI;IAIT,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;CAoChE"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reactive state for database table pagination and data fetching.
|
|
3
|
+
*
|
|
4
|
+
* Extends `Loadable` to manage paginated table data with column metadata,
|
|
5
|
+
* row deletion, and derived pagination controls.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* const table = new TableState();
|
|
10
|
+
* await table.fetch('accounts', 0, 50);
|
|
11
|
+
*
|
|
12
|
+
* // pagination
|
|
13
|
+
* if (table.has_next) table.go_next();
|
|
14
|
+
* await table.fetch(table.table_name, table.offset, table.limit);
|
|
15
|
+
*
|
|
16
|
+
* // deletion
|
|
17
|
+
* const deleted = await table.delete_row(table.rows[0]);
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```svelte
|
|
22
|
+
* <script lang="ts">
|
|
23
|
+
* import {TableState} from '@fuzdev/fuz_app/ui/table_state.svelte.js';
|
|
24
|
+
*
|
|
25
|
+
* const table = new TableState();
|
|
26
|
+
* table.fetch('accounts');
|
|
27
|
+
* </script>
|
|
28
|
+
*
|
|
29
|
+
* {#if table.loading}
|
|
30
|
+
* <p>loading…</p>
|
|
31
|
+
* {:else if table.error}
|
|
32
|
+
* <p>{table.error}</p>
|
|
33
|
+
* {:else}
|
|
34
|
+
* <p>showing {table.showing_start}–{table.showing_end} of {table.total}</p>
|
|
35
|
+
* {/if}
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* @module
|
|
39
|
+
*/
|
|
40
|
+
import { Loadable } from './loadable.svelte.js';
|
|
41
|
+
import { parse_response_error, ui_fetch } from './ui_fetch.js';
|
|
42
|
+
import { format_value } from './ui_format.js';
|
|
43
|
+
/** Maximum number of rows that can be fetched in a single page. */
|
|
44
|
+
export const TABLE_LIMIT_MAX = 1000;
|
|
45
|
+
export class TableState extends Loadable {
|
|
46
|
+
table_name = $state('');
|
|
47
|
+
columns = $state([]);
|
|
48
|
+
rows = $state([]);
|
|
49
|
+
total = $state(0);
|
|
50
|
+
offset = $state(0);
|
|
51
|
+
limit = $state(100);
|
|
52
|
+
primary_key = $state(null);
|
|
53
|
+
deleting = $state(null);
|
|
54
|
+
delete_error = $state(null);
|
|
55
|
+
// Pagination computed values
|
|
56
|
+
showing_start = $derived(this.total === 0 ? 0 : this.offset + 1);
|
|
57
|
+
showing_end = $derived(Math.min(this.offset + this.rows.length, this.total));
|
|
58
|
+
has_prev = $derived(this.offset > 0);
|
|
59
|
+
has_next = $derived(this.offset + this.limit < this.total);
|
|
60
|
+
async fetch(table_name, offset = 0, limit = 100) {
|
|
61
|
+
this.table_name = table_name;
|
|
62
|
+
this.offset = offset;
|
|
63
|
+
this.limit = Math.max(1, Math.min(TABLE_LIMIT_MAX, limit));
|
|
64
|
+
await this.run(async () => {
|
|
65
|
+
const response = await ui_fetch(`/api/db/tables/${table_name}?offset=${this.offset}&limit=${this.limit}`);
|
|
66
|
+
if (!response.ok) {
|
|
67
|
+
throw new Error(await parse_response_error(response, 'Failed to fetch table'));
|
|
68
|
+
}
|
|
69
|
+
const data = await response.json();
|
|
70
|
+
this.columns = data.columns ?? [];
|
|
71
|
+
this.rows = data.rows ?? [];
|
|
72
|
+
this.total = data.total ?? 0;
|
|
73
|
+
this.primary_key = data.primary_key ?? null;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
go_prev() {
|
|
77
|
+
this.offset = Math.max(0, this.offset - this.limit);
|
|
78
|
+
}
|
|
79
|
+
go_next() {
|
|
80
|
+
this.offset += this.limit;
|
|
81
|
+
}
|
|
82
|
+
async delete_row(row) {
|
|
83
|
+
if (!this.primary_key)
|
|
84
|
+
return false;
|
|
85
|
+
const pk_value = row[this.primary_key];
|
|
86
|
+
if (pk_value === null || pk_value === undefined)
|
|
87
|
+
return false;
|
|
88
|
+
const pk_str = format_value(pk_value);
|
|
89
|
+
this.deleting = pk_str;
|
|
90
|
+
this.delete_error = null;
|
|
91
|
+
try {
|
|
92
|
+
const response = await ui_fetch(`/api/db/tables/${this.table_name}/rows/${encodeURIComponent(pk_str)}`, { method: 'DELETE' });
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
try {
|
|
95
|
+
const data = await response.json();
|
|
96
|
+
const error_msg = data.error || 'unknown error';
|
|
97
|
+
this.delete_error = data.detail ? `${error_msg}: ${data.detail}` : error_msg;
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
this.delete_error = `Error: ${response.status}`;
|
|
101
|
+
}
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
// Remove from UI
|
|
105
|
+
this.rows = this.rows.filter((r) => r[this.primary_key] !== pk_value);
|
|
106
|
+
this.total -= 1;
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
this.delete_error = e instanceof Error ? e.message : 'Delete failed';
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
this.deleting = null;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authenticated fetch helper for cookie-based session auth.
|
|
3
|
+
*
|
|
4
|
+
* Wraps the standard `fetch` with `credentials: 'include'` so cookies
|
|
5
|
+
* are sent with every request. Use for all API calls in apps
|
|
6
|
+
* that rely on `@fuzdev/fuz_app` session middleware.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Fetch with credentials included (sends cookies).
|
|
12
|
+
*
|
|
13
|
+
* @param input - the request URL or Request object
|
|
14
|
+
* @param init - optional fetch init options
|
|
15
|
+
* @returns fetch response promise
|
|
16
|
+
*/
|
|
17
|
+
export declare const ui_fetch: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
|
|
18
|
+
/**
|
|
19
|
+
* Safely extract an error message from a non-ok response.
|
|
20
|
+
*
|
|
21
|
+
* Handles responses with non-JSON bodies (e.g. HTML 404 pages)
|
|
22
|
+
* that would throw on `response.json()`.
|
|
23
|
+
*
|
|
24
|
+
* @param response - the non-ok response
|
|
25
|
+
* @param fallback - fallback message when no `.error` field is found
|
|
26
|
+
* @returns error message string
|
|
27
|
+
*/
|
|
28
|
+
export declare const parse_response_error: (response: Response, fallback?: string) => Promise<string>;
|
|
29
|
+
//# sourceMappingURL=ui_fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui_fetch.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/ui_fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,GAAI,OAAO,WAAW,GAAG,GAAG,EAAE,OAAO,WAAW,KAAG,OAAO,CAAC,QAAQ,CACxC,CAAC;AAEjD;;;;;;;;;GASG;AACH,eAAO,MAAM,oBAAoB,GAChC,UAAU,QAAQ,EAClB,WAAW,MAAM,KACf,OAAO,CAAC,MAAM,CAQhB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authenticated fetch helper for cookie-based session auth.
|
|
3
|
+
*
|
|
4
|
+
* Wraps the standard `fetch` with `credentials: 'include'` so cookies
|
|
5
|
+
* are sent with every request. Use for all API calls in apps
|
|
6
|
+
* that rely on `@fuzdev/fuz_app` session middleware.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Fetch with credentials included (sends cookies).
|
|
12
|
+
*
|
|
13
|
+
* @param input - the request URL or Request object
|
|
14
|
+
* @param init - optional fetch init options
|
|
15
|
+
* @returns fetch response promise
|
|
16
|
+
*/
|
|
17
|
+
export const ui_fetch = (input, init) => fetch(input, { ...init, credentials: 'include' });
|
|
18
|
+
/**
|
|
19
|
+
* Safely extract an error message from a non-ok response.
|
|
20
|
+
*
|
|
21
|
+
* Handles responses with non-JSON bodies (e.g. HTML 404 pages)
|
|
22
|
+
* that would throw on `response.json()`.
|
|
23
|
+
*
|
|
24
|
+
* @param response - the non-ok response
|
|
25
|
+
* @param fallback - fallback message when no `.error` field is found
|
|
26
|
+
* @returns error message string
|
|
27
|
+
*/
|
|
28
|
+
export const parse_response_error = async (response, fallback) => {
|
|
29
|
+
const default_message = fallback ?? `Error: ${response.status}`;
|
|
30
|
+
try {
|
|
31
|
+
const data = await response.json();
|
|
32
|
+
return typeof data?.error === 'string' ? data.error : default_message;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return default_message;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formatting utilities for UI display.
|
|
3
|
+
*
|
|
4
|
+
* Value formatting, relative timestamps, uptime display,
|
|
5
|
+
* absolute timestamp formatting, and audit metadata formatting.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import type { AuditEventType } from '../auth/audit_log_schema.js';
|
|
10
|
+
/**
|
|
11
|
+
* Format a timestamp as a relative time string.
|
|
12
|
+
*
|
|
13
|
+
* @param timestamp - a date value (`string`, `number`, or `Date`)
|
|
14
|
+
* @param now - reference time in ms since epoch, defaults to `Date.now()`
|
|
15
|
+
* @returns human-friendly relative time (e.g. "2m ago", "3h ago", "5d ago", "2mo ago", "1y ago")
|
|
16
|
+
*/
|
|
17
|
+
export declare const format_relative_time: (timestamp: string | number | Date, now?: number) => string;
|
|
18
|
+
/**
|
|
19
|
+
* Format milliseconds as a human-friendly uptime string.
|
|
20
|
+
*
|
|
21
|
+
* @param ms - duration in milliseconds
|
|
22
|
+
* @returns human-friendly duration (e.g. "45s", "12m", "3h 15m", "2d 5h")
|
|
23
|
+
*/
|
|
24
|
+
export declare const format_uptime: (ms: number) => string;
|
|
25
|
+
/**
|
|
26
|
+
* Truncate a string by keeping the start and end, with a separator in the middle.
|
|
27
|
+
*
|
|
28
|
+
* @param str - the string to truncate
|
|
29
|
+
* @param max_length - maximum total length including separator
|
|
30
|
+
* @param separator - the middle separator
|
|
31
|
+
* @returns the truncated string, or the original if it fits
|
|
32
|
+
*/
|
|
33
|
+
export declare const truncate_middle: (str: string, max_length: number, separator?: string) => string;
|
|
34
|
+
/**
|
|
35
|
+
* Truncate a UUID for display, keeping start and end visible.
|
|
36
|
+
*
|
|
37
|
+
* @param uuid - the UUID string to truncate
|
|
38
|
+
* @returns a 12-character truncated UUID like `a1b2c…7890`
|
|
39
|
+
*/
|
|
40
|
+
export declare const truncate_uuid: (uuid: string) => string;
|
|
41
|
+
/**
|
|
42
|
+
* Format an arbitrary value for table cell display.
|
|
43
|
+
*
|
|
44
|
+
* @param value - the value to format
|
|
45
|
+
* @returns string representation suitable for UI display
|
|
46
|
+
*/
|
|
47
|
+
export declare const format_value: (value: unknown) => string;
|
|
48
|
+
/**
|
|
49
|
+
* Format a timestamp as an absolute datetime string for title attributes.
|
|
50
|
+
*
|
|
51
|
+
* @param timestamp - a date value
|
|
52
|
+
* @returns readable absolute datetime like `"2026-03-21 14:30:00 UTC"`
|
|
53
|
+
*/
|
|
54
|
+
export declare const format_datetime_local: (timestamp: string | number | Date) => string;
|
|
55
|
+
/**
|
|
56
|
+
* Format audit event metadata for display based on event type.
|
|
57
|
+
*
|
|
58
|
+
* @param event_type - the audit event type
|
|
59
|
+
* @param metadata - the metadata object (may be null)
|
|
60
|
+
* @returns human-readable summary string
|
|
61
|
+
*/
|
|
62
|
+
export declare const format_audit_metadata: (event_type: AuditEventType, metadata: Record<string, unknown> | null) => string;
|
|
63
|
+
//# sourceMappingURL=ui_format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui_format.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/ui_format.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,6BAA6B,CAAC;AAEhE;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAChC,WAAW,MAAM,GAAG,MAAM,GAAG,IAAI,EACjC,MAAK,MAAmB,KACtB,MA2BF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GAAI,IAAI,MAAM,KAAG,MAY1C,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,EAAE,YAAY,MAAM,EAAE,kBAAe,KAAG,MAOlF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,MAAmC,CAAC;AAEjF;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,MAS7C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAAI,WAAW,MAAM,GAAG,MAAM,GAAG,IAAI,KAAG,MAOzE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,GACjC,YAAY,cAAc,EAC1B,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,KACtC,MAuDF,CAAC"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formatting utilities for UI display.
|
|
3
|
+
*
|
|
4
|
+
* Value formatting, relative timestamps, uptime display,
|
|
5
|
+
* absolute timestamp formatting, and audit metadata formatting.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Format a timestamp as a relative time string.
|
|
11
|
+
*
|
|
12
|
+
* @param timestamp - a date value (`string`, `number`, or `Date`)
|
|
13
|
+
* @param now - reference time in ms since epoch, defaults to `Date.now()`
|
|
14
|
+
* @returns human-friendly relative time (e.g. "2m ago", "3h ago", "5d ago", "2mo ago", "1y ago")
|
|
15
|
+
*/
|
|
16
|
+
export const format_relative_time = (timestamp, now = Date.now()) => {
|
|
17
|
+
const ts = typeof timestamp === 'number'
|
|
18
|
+
? timestamp
|
|
19
|
+
: timestamp instanceof Date
|
|
20
|
+
? timestamp.getTime()
|
|
21
|
+
: new Date(timestamp).getTime();
|
|
22
|
+
const diff_ms = now - ts;
|
|
23
|
+
if (Number.isNaN(diff_ms))
|
|
24
|
+
return 'just now';
|
|
25
|
+
const abs_ms = Math.abs(diff_ms);
|
|
26
|
+
const past = diff_ms >= 0;
|
|
27
|
+
const abs_mins = Math.floor(abs_ms / 60000);
|
|
28
|
+
const abs_hours = Math.floor(abs_ms / 3600000);
|
|
29
|
+
const abs_days = Math.floor(abs_ms / 86400000);
|
|
30
|
+
const abs_weeks = Math.floor(abs_days / 7);
|
|
31
|
+
const abs_months = Math.floor(abs_days / 30);
|
|
32
|
+
const abs_years = Math.floor(abs_days / 365);
|
|
33
|
+
if (abs_mins <= 0)
|
|
34
|
+
return 'just now';
|
|
35
|
+
const suffix = past ? ' ago' : '';
|
|
36
|
+
const prefix = past ? '' : 'in ';
|
|
37
|
+
if (abs_mins < 60)
|
|
38
|
+
return `${prefix}${abs_mins}m${suffix}`;
|
|
39
|
+
if (abs_hours < 24)
|
|
40
|
+
return `${prefix}${abs_hours}h${suffix}`;
|
|
41
|
+
if (abs_days < 7)
|
|
42
|
+
return `${prefix}${abs_days}d${suffix}`;
|
|
43
|
+
if (abs_weeks < 5)
|
|
44
|
+
return `${prefix}${abs_weeks}w${suffix}`;
|
|
45
|
+
if (abs_months < 12)
|
|
46
|
+
return `${prefix}${abs_months}mo${suffix}`;
|
|
47
|
+
return `${prefix}${abs_years}y${suffix}`;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Format milliseconds as a human-friendly uptime string.
|
|
51
|
+
*
|
|
52
|
+
* @param ms - duration in milliseconds
|
|
53
|
+
* @returns human-friendly duration (e.g. "45s", "12m", "3h 15m", "2d 5h")
|
|
54
|
+
*/
|
|
55
|
+
export const format_uptime = (ms) => {
|
|
56
|
+
if (ms < 0)
|
|
57
|
+
return `-${format_uptime(-ms)}`;
|
|
58
|
+
const seconds = Math.floor(ms / 1000);
|
|
59
|
+
if (seconds < 60)
|
|
60
|
+
return `${seconds}s`;
|
|
61
|
+
const minutes = Math.floor(seconds / 60);
|
|
62
|
+
if (minutes < 60)
|
|
63
|
+
return `${minutes}m`;
|
|
64
|
+
const hours = Math.floor(minutes / 60);
|
|
65
|
+
const remaining_mins = minutes % 60;
|
|
66
|
+
if (hours < 24)
|
|
67
|
+
return remaining_mins > 0 ? `${hours}h ${remaining_mins}m` : `${hours}h`;
|
|
68
|
+
const days = Math.floor(hours / 24);
|
|
69
|
+
const remaining_hours = hours % 24;
|
|
70
|
+
return remaining_hours > 0 ? `${days}d ${remaining_hours}h` : `${days}d`;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Truncate a string by keeping the start and end, with a separator in the middle.
|
|
74
|
+
*
|
|
75
|
+
* @param str - the string to truncate
|
|
76
|
+
* @param max_length - maximum total length including separator
|
|
77
|
+
* @param separator - the middle separator
|
|
78
|
+
* @returns the truncated string, or the original if it fits
|
|
79
|
+
*/
|
|
80
|
+
export const truncate_middle = (str, max_length, separator = '…') => {
|
|
81
|
+
if (str.length <= max_length)
|
|
82
|
+
return str;
|
|
83
|
+
const available = max_length - separator.length;
|
|
84
|
+
if (available <= 0)
|
|
85
|
+
return separator.slice(0, max_length);
|
|
86
|
+
const start_length = Math.ceil(available / 2);
|
|
87
|
+
const end_length = Math.floor(available / 2);
|
|
88
|
+
return str.slice(0, start_length) + separator + str.slice(str.length - end_length);
|
|
89
|
+
};
|
|
90
|
+
/**
|
|
91
|
+
* Truncate a UUID for display, keeping start and end visible.
|
|
92
|
+
*
|
|
93
|
+
* @param uuid - the UUID string to truncate
|
|
94
|
+
* @returns a 12-character truncated UUID like `a1b2c…7890`
|
|
95
|
+
*/
|
|
96
|
+
export const truncate_uuid = (uuid) => truncate_middle(uuid, 12);
|
|
97
|
+
/**
|
|
98
|
+
* Format an arbitrary value for table cell display.
|
|
99
|
+
*
|
|
100
|
+
* @param value - the value to format
|
|
101
|
+
* @returns string representation suitable for UI display
|
|
102
|
+
*/
|
|
103
|
+
export const format_value = (value) => {
|
|
104
|
+
if (value === null)
|
|
105
|
+
return 'NULL';
|
|
106
|
+
if (value === undefined)
|
|
107
|
+
return 'undefined';
|
|
108
|
+
if (typeof value === 'object')
|
|
109
|
+
return JSON.stringify(value);
|
|
110
|
+
if (typeof value === 'string')
|
|
111
|
+
return value;
|
|
112
|
+
if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint')
|
|
113
|
+
return String(value);
|
|
114
|
+
if (typeof value === 'symbol')
|
|
115
|
+
return value.toString();
|
|
116
|
+
return String(value);
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* Format a timestamp as an absolute datetime string for title attributes.
|
|
120
|
+
*
|
|
121
|
+
* @param timestamp - a date value
|
|
122
|
+
* @returns readable absolute datetime like `"2026-03-21 14:30:00 UTC"`
|
|
123
|
+
*/
|
|
124
|
+
export const format_datetime_local = (timestamp) => {
|
|
125
|
+
const date = timestamp instanceof Date ? timestamp : new Date(timestamp);
|
|
126
|
+
if (Number.isNaN(date.getTime()))
|
|
127
|
+
return '';
|
|
128
|
+
return date
|
|
129
|
+
.toISOString()
|
|
130
|
+
.replace('T', ' ')
|
|
131
|
+
.replace(/\.\d+Z$/, ' UTC');
|
|
132
|
+
};
|
|
133
|
+
/**
|
|
134
|
+
* Format audit event metadata for display based on event type.
|
|
135
|
+
*
|
|
136
|
+
* @param event_type - the audit event type
|
|
137
|
+
* @param metadata - the metadata object (may be null)
|
|
138
|
+
* @returns human-readable summary string
|
|
139
|
+
*/
|
|
140
|
+
export const format_audit_metadata = (event_type, metadata) => {
|
|
141
|
+
if (!metadata)
|
|
142
|
+
return '';
|
|
143
|
+
switch (event_type) {
|
|
144
|
+
case 'login':
|
|
145
|
+
return metadata.username ? `user: ${metadata.username}` : '';
|
|
146
|
+
case 'logout':
|
|
147
|
+
return '';
|
|
148
|
+
case 'bootstrap':
|
|
149
|
+
return metadata.error ? `error: ${metadata.error}` : '';
|
|
150
|
+
case 'signup':
|
|
151
|
+
return [
|
|
152
|
+
metadata.username ? `user: ${metadata.username}` : '',
|
|
153
|
+
metadata.invite_id ? 'via invite' : '',
|
|
154
|
+
metadata.open_signup ? 'open signup' : '',
|
|
155
|
+
]
|
|
156
|
+
.filter(Boolean)
|
|
157
|
+
.join(', ');
|
|
158
|
+
case 'password_change':
|
|
159
|
+
return metadata.sessions_revoked != null
|
|
160
|
+
? `${metadata.sessions_revoked} sessions revoked`
|
|
161
|
+
: '';
|
|
162
|
+
case 'session_revoke':
|
|
163
|
+
return metadata.session_id
|
|
164
|
+
? `session: ${truncate_middle(metadata.session_id, 12)}`
|
|
165
|
+
: '';
|
|
166
|
+
case 'session_revoke_all':
|
|
167
|
+
return metadata.count != null ? `${metadata.count} sessions` : '';
|
|
168
|
+
case 'token_create':
|
|
169
|
+
return metadata.name ? `"${metadata.name}"` : '';
|
|
170
|
+
case 'token_revoke':
|
|
171
|
+
return metadata.token_id ? `token: ${truncate_middle(metadata.token_id, 12)}` : '';
|
|
172
|
+
case 'token_revoke_all':
|
|
173
|
+
return metadata.count != null ? `${metadata.count} tokens` : '';
|
|
174
|
+
case 'permit_grant':
|
|
175
|
+
return metadata.role ? `role: ${metadata.role}` : '';
|
|
176
|
+
case 'permit_revoke':
|
|
177
|
+
return metadata.role ? `role: ${metadata.role}` : '';
|
|
178
|
+
case 'invite_create':
|
|
179
|
+
return [
|
|
180
|
+
metadata.email ? `email: ${metadata.email}` : '',
|
|
181
|
+
metadata.username ? `user: ${metadata.username}` : '',
|
|
182
|
+
]
|
|
183
|
+
.filter(Boolean)
|
|
184
|
+
.join(', ');
|
|
185
|
+
case 'invite_delete':
|
|
186
|
+
return metadata.invite_id
|
|
187
|
+
? `invite: ${truncate_middle(metadata.invite_id, 12)}`
|
|
188
|
+
: '';
|
|
189
|
+
case 'app_settings_update':
|
|
190
|
+
return metadata.setting
|
|
191
|
+
? `${metadata.setting}: ${JSON.stringify(metadata.old_value)} → ${JSON.stringify(metadata.new_value)}`
|
|
192
|
+
: '';
|
|
193
|
+
default:
|
|
194
|
+
return JSON.stringify(metadata);
|
|
195
|
+
}
|
|
196
|
+
};
|