@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.
Files changed (457) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +49 -0
  3. package/dist/actions/action_bridge.d.ts +65 -0
  4. package/dist/actions/action_bridge.d.ts.map +1 -0
  5. package/dist/actions/action_bridge.js +76 -0
  6. package/dist/actions/action_codegen.d.ts +97 -0
  7. package/dist/actions/action_codegen.d.ts.map +1 -0
  8. package/dist/actions/action_codegen.js +280 -0
  9. package/dist/actions/action_registry.d.ts +35 -0
  10. package/dist/actions/action_registry.d.ts.map +1 -0
  11. package/dist/actions/action_registry.js +83 -0
  12. package/dist/actions/action_spec.d.ts +169 -0
  13. package/dist/actions/action_spec.d.ts.map +1 -0
  14. package/dist/actions/action_spec.js +76 -0
  15. package/dist/auth/account_queries.d.ts +96 -0
  16. package/dist/auth/account_queries.d.ts.map +1 -0
  17. package/dist/auth/account_queries.js +172 -0
  18. package/dist/auth/account_routes.d.ts +86 -0
  19. package/dist/auth/account_routes.d.ts.map +1 -0
  20. package/dist/auth/account_routes.js +406 -0
  21. package/dist/auth/account_schema.d.ts +192 -0
  22. package/dist/auth/account_schema.d.ts.map +1 -0
  23. package/dist/auth/account_schema.js +105 -0
  24. package/dist/auth/admin_routes.d.ts +29 -0
  25. package/dist/auth/admin_routes.d.ts.map +1 -0
  26. package/dist/auth/admin_routes.js +193 -0
  27. package/dist/auth/api_token.d.ts +33 -0
  28. package/dist/auth/api_token.d.ts.map +1 -0
  29. package/dist/auth/api_token.js +36 -0
  30. package/dist/auth/api_token_queries.d.ts +80 -0
  31. package/dist/auth/api_token_queries.d.ts.map +1 -0
  32. package/dist/auth/api_token_queries.js +116 -0
  33. package/dist/auth/app_settings_queries.d.ts +33 -0
  34. package/dist/auth/app_settings_queries.d.ts.map +1 -0
  35. package/dist/auth/app_settings_queries.js +51 -0
  36. package/dist/auth/app_settings_routes.d.ts +27 -0
  37. package/dist/auth/app_settings_routes.d.ts.map +1 -0
  38. package/dist/auth/app_settings_routes.js +66 -0
  39. package/dist/auth/app_settings_schema.d.ts +35 -0
  40. package/dist/auth/app_settings_schema.d.ts.map +1 -0
  41. package/dist/auth/app_settings_schema.js +22 -0
  42. package/dist/auth/audit_log_queries.d.ts +90 -0
  43. package/dist/auth/audit_log_queries.d.ts.map +1 -0
  44. package/dist/auth/audit_log_queries.js +205 -0
  45. package/dist/auth/audit_log_routes.d.ts +33 -0
  46. package/dist/auth/audit_log_routes.d.ts.map +1 -0
  47. package/dist/auth/audit_log_routes.js +106 -0
  48. package/dist/auth/audit_log_schema.d.ts +259 -0
  49. package/dist/auth/audit_log_schema.d.ts.map +1 -0
  50. package/dist/auth/audit_log_schema.js +123 -0
  51. package/dist/auth/bearer_auth.d.ts +32 -0
  52. package/dist/auth/bearer_auth.d.ts.map +1 -0
  53. package/dist/auth/bearer_auth.js +90 -0
  54. package/dist/auth/bootstrap_account.d.ts +82 -0
  55. package/dist/auth/bootstrap_account.d.ts.map +1 -0
  56. package/dist/auth/bootstrap_account.js +97 -0
  57. package/dist/auth/bootstrap_routes.d.ts +74 -0
  58. package/dist/auth/bootstrap_routes.d.ts.map +1 -0
  59. package/dist/auth/bootstrap_routes.js +154 -0
  60. package/dist/auth/daemon_token.d.ts +49 -0
  61. package/dist/auth/daemon_token.d.ts.map +1 -0
  62. package/dist/auth/daemon_token.js +49 -0
  63. package/dist/auth/daemon_token_middleware.d.ts +93 -0
  64. package/dist/auth/daemon_token_middleware.d.ts.map +1 -0
  65. package/dist/auth/daemon_token_middleware.js +167 -0
  66. package/dist/auth/ddl.d.ts +27 -0
  67. package/dist/auth/ddl.d.ts.map +1 -0
  68. package/dist/auth/ddl.js +111 -0
  69. package/dist/auth/deps.d.ts +52 -0
  70. package/dist/auth/deps.d.ts.map +1 -0
  71. package/dist/auth/deps.js +10 -0
  72. package/dist/auth/invite_queries.d.ts +68 -0
  73. package/dist/auth/invite_queries.d.ts.map +1 -0
  74. package/dist/auth/invite_queries.js +105 -0
  75. package/dist/auth/invite_routes.d.ts +18 -0
  76. package/dist/auth/invite_routes.d.ts.map +1 -0
  77. package/dist/auth/invite_routes.js +129 -0
  78. package/dist/auth/invite_schema.d.ts +51 -0
  79. package/dist/auth/invite_schema.d.ts.map +1 -0
  80. package/dist/auth/invite_schema.js +25 -0
  81. package/dist/auth/keyring.d.ts +87 -0
  82. package/dist/auth/keyring.d.ts.map +1 -0
  83. package/dist/auth/keyring.js +142 -0
  84. package/dist/auth/middleware.d.ts +40 -0
  85. package/dist/auth/middleware.d.ts.map +1 -0
  86. package/dist/auth/middleware.js +64 -0
  87. package/dist/auth/migrations.d.ts +42 -0
  88. package/dist/auth/migrations.d.ts.map +1 -0
  89. package/dist/auth/migrations.js +79 -0
  90. package/dist/auth/password.d.ts +39 -0
  91. package/dist/auth/password.d.ts.map +1 -0
  92. package/dist/auth/password.js +25 -0
  93. package/dist/auth/password_argon2.d.ts +43 -0
  94. package/dist/auth/password_argon2.d.ts.map +1 -0
  95. package/dist/auth/password_argon2.js +76 -0
  96. package/dist/auth/permit_queries.d.ts +72 -0
  97. package/dist/auth/permit_queries.d.ts.map +1 -0
  98. package/dist/auth/permit_queries.js +116 -0
  99. package/dist/auth/request_context.d.ts +114 -0
  100. package/dist/auth/request_context.d.ts.map +1 -0
  101. package/dist/auth/request_context.js +176 -0
  102. package/dist/auth/require_keeper.d.ts +20 -0
  103. package/dist/auth/require_keeper.d.ts.map +1 -0
  104. package/dist/auth/require_keeper.js +35 -0
  105. package/dist/auth/role_schema.d.ts +69 -0
  106. package/dist/auth/role_schema.d.ts.map +1 -0
  107. package/dist/auth/role_schema.js +70 -0
  108. package/dist/auth/route_guards.d.ts +21 -0
  109. package/dist/auth/route_guards.d.ts.map +1 -0
  110. package/dist/auth/route_guards.js +32 -0
  111. package/dist/auth/session_cookie.d.ts +158 -0
  112. package/dist/auth/session_cookie.d.ts.map +1 -0
  113. package/dist/auth/session_cookie.js +135 -0
  114. package/dist/auth/session_lifecycle.d.ts +35 -0
  115. package/dist/auth/session_lifecycle.d.ts.map +1 -0
  116. package/dist/auth/session_lifecycle.js +27 -0
  117. package/dist/auth/session_middleware.d.ts +33 -0
  118. package/dist/auth/session_middleware.d.ts.map +1 -0
  119. package/dist/auth/session_middleware.js +62 -0
  120. package/dist/auth/session_queries.d.ts +135 -0
  121. package/dist/auth/session_queries.d.ts.map +1 -0
  122. package/dist/auth/session_queries.js +186 -0
  123. package/dist/auth/signup_routes.d.ts +32 -0
  124. package/dist/auth/signup_routes.d.ts.map +1 -0
  125. package/dist/auth/signup_routes.js +150 -0
  126. package/dist/cli/args.d.ts +48 -0
  127. package/dist/cli/args.d.ts.map +1 -0
  128. package/dist/cli/args.js +76 -0
  129. package/dist/cli/config.d.ts +48 -0
  130. package/dist/cli/config.d.ts.map +1 -0
  131. package/dist/cli/config.js +77 -0
  132. package/dist/cli/daemon.d.ts +82 -0
  133. package/dist/cli/daemon.d.ts.map +1 -0
  134. package/dist/cli/daemon.js +149 -0
  135. package/dist/cli/help.d.ts +85 -0
  136. package/dist/cli/help.d.ts.map +1 -0
  137. package/dist/cli/help.js +138 -0
  138. package/dist/cli/logger.d.ts +46 -0
  139. package/dist/cli/logger.d.ts.map +1 -0
  140. package/dist/cli/logger.js +48 -0
  141. package/dist/cli/util.d.ts +36 -0
  142. package/dist/cli/util.d.ts.map +1 -0
  143. package/dist/cli/util.js +50 -0
  144. package/dist/crypto.d.ts +13 -0
  145. package/dist/crypto.d.ts.map +1 -0
  146. package/dist/crypto.js +19 -0
  147. package/dist/db/assert_row.d.ts +18 -0
  148. package/dist/db/assert_row.d.ts.map +1 -0
  149. package/dist/db/assert_row.js +24 -0
  150. package/dist/db/create_db.d.ts +38 -0
  151. package/dist/db/create_db.d.ts.map +1 -0
  152. package/dist/db/create_db.js +57 -0
  153. package/dist/db/db.d.ts +97 -0
  154. package/dist/db/db.d.ts.map +1 -0
  155. package/dist/db/db.js +76 -0
  156. package/dist/db/db_pg.d.ts +21 -0
  157. package/dist/db/db_pg.d.ts.map +1 -0
  158. package/dist/db/db_pg.js +45 -0
  159. package/dist/db/db_pglite.d.ts +21 -0
  160. package/dist/db/db_pglite.d.ts.map +1 -0
  161. package/dist/db/db_pglite.js +28 -0
  162. package/dist/db/migrate.d.ts +67 -0
  163. package/dist/db/migrate.d.ts.map +1 -0
  164. package/dist/db/migrate.js +118 -0
  165. package/dist/db/pg_error.d.ts +16 -0
  166. package/dist/db/pg_error.d.ts.map +1 -0
  167. package/dist/db/pg_error.js +15 -0
  168. package/dist/db/query_deps.d.ts +14 -0
  169. package/dist/db/query_deps.d.ts.map +1 -0
  170. package/dist/db/query_deps.js +9 -0
  171. package/dist/db/sql_identifier.d.ts +27 -0
  172. package/dist/db/sql_identifier.d.ts.map +1 -0
  173. package/dist/db/sql_identifier.js +31 -0
  174. package/dist/db/status.d.ts +62 -0
  175. package/dist/db/status.d.ts.map +1 -0
  176. package/dist/db/status.js +116 -0
  177. package/dist/dev/setup.d.ts +159 -0
  178. package/dist/dev/setup.d.ts.map +1 -0
  179. package/dist/dev/setup.js +265 -0
  180. package/dist/env/dotenv.d.ts +25 -0
  181. package/dist/env/dotenv.d.ts.map +1 -0
  182. package/dist/env/dotenv.js +52 -0
  183. package/dist/env/load.d.ts +52 -0
  184. package/dist/env/load.d.ts.map +1 -0
  185. package/dist/env/load.js +79 -0
  186. package/dist/env/mask.d.ts +19 -0
  187. package/dist/env/mask.d.ts.map +1 -0
  188. package/dist/env/mask.js +26 -0
  189. package/dist/env/resolve.d.ts +126 -0
  190. package/dist/env/resolve.d.ts.map +1 -0
  191. package/dist/env/resolve.js +200 -0
  192. package/dist/hono_context.d.ts +48 -0
  193. package/dist/hono_context.d.ts.map +1 -0
  194. package/dist/hono_context.js +22 -0
  195. package/dist/http/common_routes.d.ts +52 -0
  196. package/dist/http/common_routes.d.ts.map +1 -0
  197. package/dist/http/common_routes.js +65 -0
  198. package/dist/http/db_routes.d.ts +57 -0
  199. package/dist/http/db_routes.d.ts.map +1 -0
  200. package/dist/http/db_routes.js +176 -0
  201. package/dist/http/error_schemas.d.ts +169 -0
  202. package/dist/http/error_schemas.d.ts.map +1 -0
  203. package/dist/http/error_schemas.js +178 -0
  204. package/dist/http/middleware_spec.d.ts +19 -0
  205. package/dist/http/middleware_spec.d.ts.map +1 -0
  206. package/dist/http/middleware_spec.js +9 -0
  207. package/dist/http/origin.d.ts +57 -0
  208. package/dist/http/origin.d.ts.map +1 -0
  209. package/dist/http/origin.js +207 -0
  210. package/dist/http/proxy.d.ts +112 -0
  211. package/dist/http/proxy.d.ts.map +1 -0
  212. package/dist/http/proxy.js +240 -0
  213. package/dist/http/route_spec.d.ts +197 -0
  214. package/dist/http/route_spec.d.ts.map +1 -0
  215. package/dist/http/route_spec.js +243 -0
  216. package/dist/http/schema_helpers.d.ts +64 -0
  217. package/dist/http/schema_helpers.d.ts.map +1 -0
  218. package/dist/http/schema_helpers.js +90 -0
  219. package/dist/http/surface.d.ts +132 -0
  220. package/dist/http/surface.d.ts.map +1 -0
  221. package/dist/http/surface.js +156 -0
  222. package/dist/http/surface_query.d.ts +77 -0
  223. package/dist/http/surface_query.d.ts.map +1 -0
  224. package/dist/http/surface_query.js +86 -0
  225. package/dist/rate_limiter.d.ts +94 -0
  226. package/dist/rate_limiter.d.ts.map +1 -0
  227. package/dist/rate_limiter.js +156 -0
  228. package/dist/realtime/sse.d.ts +80 -0
  229. package/dist/realtime/sse.d.ts.map +1 -0
  230. package/dist/realtime/sse.js +109 -0
  231. package/dist/realtime/sse_auth_guard.d.ts +93 -0
  232. package/dist/realtime/sse_auth_guard.d.ts.map +1 -0
  233. package/dist/realtime/sse_auth_guard.js +111 -0
  234. package/dist/realtime/subscriber_registry.d.ts +85 -0
  235. package/dist/realtime/subscriber_registry.d.ts.map +1 -0
  236. package/dist/realtime/subscriber_registry.js +108 -0
  237. package/dist/runtime/deno.d.ts +21 -0
  238. package/dist/runtime/deno.d.ts.map +1 -0
  239. package/dist/runtime/deno.js +83 -0
  240. package/dist/runtime/deps.d.ts +113 -0
  241. package/dist/runtime/deps.d.ts.map +1 -0
  242. package/dist/runtime/deps.js +10 -0
  243. package/dist/runtime/fs.d.ts +15 -0
  244. package/dist/runtime/fs.d.ts.map +1 -0
  245. package/dist/runtime/fs.js +17 -0
  246. package/dist/runtime/mock.d.ts +81 -0
  247. package/dist/runtime/mock.d.ts.map +1 -0
  248. package/dist/runtime/mock.js +195 -0
  249. package/dist/runtime/node.d.ts +17 -0
  250. package/dist/runtime/node.d.ts.map +1 -0
  251. package/dist/runtime/node.js +117 -0
  252. package/dist/schema_meta.d.ts +16 -0
  253. package/dist/schema_meta.d.ts.map +1 -0
  254. package/dist/schema_meta.js +9 -0
  255. package/dist/sensitivity.d.ts +15 -0
  256. package/dist/sensitivity.d.ts.map +1 -0
  257. package/dist/sensitivity.js +9 -0
  258. package/dist/server/app_backend.d.ts +74 -0
  259. package/dist/server/app_backend.d.ts.map +1 -0
  260. package/dist/server/app_backend.js +39 -0
  261. package/dist/server/app_server.d.ts +201 -0
  262. package/dist/server/app_server.d.ts.map +1 -0
  263. package/dist/server/app_server.js +266 -0
  264. package/dist/server/env.d.ts +68 -0
  265. package/dist/server/env.d.ts.map +1 -0
  266. package/dist/server/env.js +95 -0
  267. package/dist/server/startup.d.ts +22 -0
  268. package/dist/server/startup.d.ts.map +1 -0
  269. package/dist/server/startup.js +48 -0
  270. package/dist/server/static.d.ts +39 -0
  271. package/dist/server/static.d.ts.map +1 -0
  272. package/dist/server/static.js +38 -0
  273. package/dist/server/validate_nginx.d.ts +34 -0
  274. package/dist/server/validate_nginx.d.ts.map +1 -0
  275. package/dist/server/validate_nginx.js +118 -0
  276. package/dist/testing/CLAUDE.md +3 -0
  277. package/dist/testing/admin_integration.d.ts +45 -0
  278. package/dist/testing/admin_integration.d.ts.map +1 -0
  279. package/dist/testing/admin_integration.js +840 -0
  280. package/dist/testing/adversarial_404.d.ts +15 -0
  281. package/dist/testing/adversarial_404.d.ts.map +1 -0
  282. package/dist/testing/adversarial_404.js +118 -0
  283. package/dist/testing/adversarial_headers.d.ts +36 -0
  284. package/dist/testing/adversarial_headers.d.ts.map +1 -0
  285. package/dist/testing/adversarial_headers.js +128 -0
  286. package/dist/testing/adversarial_input.d.ts +56 -0
  287. package/dist/testing/adversarial_input.d.ts.map +1 -0
  288. package/dist/testing/adversarial_input.js +494 -0
  289. package/dist/testing/app_server.d.ts +169 -0
  290. package/dist/testing/app_server.d.ts.map +1 -0
  291. package/dist/testing/app_server.js +240 -0
  292. package/dist/testing/assert_dev_env.d.ts +10 -0
  293. package/dist/testing/assert_dev_env.d.ts.map +1 -0
  294. package/dist/testing/assert_dev_env.js +13 -0
  295. package/dist/testing/assertions.d.ts +61 -0
  296. package/dist/testing/assertions.d.ts.map +1 -0
  297. package/dist/testing/assertions.js +96 -0
  298. package/dist/testing/attack_surface.d.ts +63 -0
  299. package/dist/testing/attack_surface.d.ts.map +1 -0
  300. package/dist/testing/attack_surface.js +224 -0
  301. package/dist/testing/audit_completeness.d.ts +29 -0
  302. package/dist/testing/audit_completeness.d.ts.map +1 -0
  303. package/dist/testing/audit_completeness.js +410 -0
  304. package/dist/testing/auth_apps.d.ts +55 -0
  305. package/dist/testing/auth_apps.d.ts.map +1 -0
  306. package/dist/testing/auth_apps.js +122 -0
  307. package/dist/testing/data_exposure.d.ts +62 -0
  308. package/dist/testing/data_exposure.d.ts.map +1 -0
  309. package/dist/testing/data_exposure.js +297 -0
  310. package/dist/testing/db.d.ts +111 -0
  311. package/dist/testing/db.d.ts.map +1 -0
  312. package/dist/testing/db.js +258 -0
  313. package/dist/testing/entities.d.ts +21 -0
  314. package/dist/testing/entities.d.ts.map +1 -0
  315. package/dist/testing/entities.js +42 -0
  316. package/dist/testing/error_coverage.d.ts +78 -0
  317. package/dist/testing/error_coverage.d.ts.map +1 -0
  318. package/dist/testing/error_coverage.js +135 -0
  319. package/dist/testing/integration.d.ts +37 -0
  320. package/dist/testing/integration.d.ts.map +1 -0
  321. package/dist/testing/integration.js +1139 -0
  322. package/dist/testing/integration_helpers.d.ts +107 -0
  323. package/dist/testing/integration_helpers.d.ts.map +1 -0
  324. package/dist/testing/integration_helpers.js +246 -0
  325. package/dist/testing/middleware.d.ts +125 -0
  326. package/dist/testing/middleware.d.ts.map +1 -0
  327. package/dist/testing/middleware.js +210 -0
  328. package/dist/testing/rate_limiting.d.ts +43 -0
  329. package/dist/testing/rate_limiting.d.ts.map +1 -0
  330. package/dist/testing/rate_limiting.js +216 -0
  331. package/dist/testing/round_trip.d.ts +37 -0
  332. package/dist/testing/round_trip.d.ts.map +1 -0
  333. package/dist/testing/round_trip.js +128 -0
  334. package/dist/testing/schema_generators.d.ts +33 -0
  335. package/dist/testing/schema_generators.d.ts.map +1 -0
  336. package/dist/testing/schema_generators.js +137 -0
  337. package/dist/testing/standard.d.ts +49 -0
  338. package/dist/testing/standard.d.ts.map +1 -0
  339. package/dist/testing/standard.js +16 -0
  340. package/dist/testing/stubs.d.ts +96 -0
  341. package/dist/testing/stubs.d.ts.map +1 -0
  342. package/dist/testing/stubs.js +192 -0
  343. package/dist/testing/surface_invariants.d.ts +189 -0
  344. package/dist/testing/surface_invariants.d.ts.map +1 -0
  345. package/dist/testing/surface_invariants.js +450 -0
  346. package/dist/ui/AccountSessions.svelte +75 -0
  347. package/dist/ui/AccountSessions.svelte.d.ts +19 -0
  348. package/dist/ui/AccountSessions.svelte.d.ts.map +1 -0
  349. package/dist/ui/AdminAccounts.svelte +107 -0
  350. package/dist/ui/AdminAccounts.svelte.d.ts +19 -0
  351. package/dist/ui/AdminAccounts.svelte.d.ts.map +1 -0
  352. package/dist/ui/AdminAuditLog.svelte +144 -0
  353. package/dist/ui/AdminAuditLog.svelte.d.ts +4 -0
  354. package/dist/ui/AdminAuditLog.svelte.d.ts.map +1 -0
  355. package/dist/ui/AdminInvites.svelte +142 -0
  356. package/dist/ui/AdminInvites.svelte.d.ts +4 -0
  357. package/dist/ui/AdminInvites.svelte.d.ts.map +1 -0
  358. package/dist/ui/AdminOverview.svelte +337 -0
  359. package/dist/ui/AdminOverview.svelte.d.ts +4 -0
  360. package/dist/ui/AdminOverview.svelte.d.ts.map +1 -0
  361. package/dist/ui/AdminPermitHistory.svelte +61 -0
  362. package/dist/ui/AdminPermitHistory.svelte.d.ts +19 -0
  363. package/dist/ui/AdminPermitHistory.svelte.d.ts.map +1 -0
  364. package/dist/ui/AdminSessions.svelte +85 -0
  365. package/dist/ui/AdminSessions.svelte.d.ts +19 -0
  366. package/dist/ui/AdminSessions.svelte.d.ts.map +1 -0
  367. package/dist/ui/AdminSettings.svelte +32 -0
  368. package/dist/ui/AdminSettings.svelte.d.ts +19 -0
  369. package/dist/ui/AdminSettings.svelte.d.ts.map +1 -0
  370. package/dist/ui/AdminSurface.svelte +42 -0
  371. package/dist/ui/AdminSurface.svelte.d.ts +4 -0
  372. package/dist/ui/AdminSurface.svelte.d.ts.map +1 -0
  373. package/dist/ui/AppShell.svelte +93 -0
  374. package/dist/ui/AppShell.svelte.d.ts +20 -0
  375. package/dist/ui/AppShell.svelte.d.ts.map +1 -0
  376. package/dist/ui/BootstrapForm.svelte +105 -0
  377. package/dist/ui/BootstrapForm.svelte.d.ts +4 -0
  378. package/dist/ui/BootstrapForm.svelte.d.ts.map +1 -0
  379. package/dist/ui/ColumnLayout.svelte +46 -0
  380. package/dist/ui/ColumnLayout.svelte.d.ts +11 -0
  381. package/dist/ui/ColumnLayout.svelte.d.ts.map +1 -0
  382. package/dist/ui/ConfirmButton.svelte +125 -0
  383. package/dist/ui/ConfirmButton.svelte.d.ts +54 -0
  384. package/dist/ui/ConfirmButton.svelte.d.ts.map +1 -0
  385. package/dist/ui/Datatable.svelte +185 -0
  386. package/dist/ui/Datatable.svelte.d.ts +35 -0
  387. package/dist/ui/Datatable.svelte.d.ts.map +1 -0
  388. package/dist/ui/LoginForm.svelte +82 -0
  389. package/dist/ui/LoginForm.svelte.d.ts +8 -0
  390. package/dist/ui/LoginForm.svelte.d.ts.map +1 -0
  391. package/dist/ui/LogoutButton.svelte +36 -0
  392. package/dist/ui/LogoutButton.svelte.d.ts +10 -0
  393. package/dist/ui/LogoutButton.svelte.d.ts.map +1 -0
  394. package/dist/ui/MenuLink.svelte +35 -0
  395. package/dist/ui/MenuLink.svelte.d.ts +12 -0
  396. package/dist/ui/MenuLink.svelte.d.ts.map +1 -0
  397. package/dist/ui/OpenSignupToggle.svelte +36 -0
  398. package/dist/ui/OpenSignupToggle.svelte.d.ts +19 -0
  399. package/dist/ui/OpenSignupToggle.svelte.d.ts.map +1 -0
  400. package/dist/ui/PopoverButton.svelte +136 -0
  401. package/dist/ui/PopoverButton.svelte.d.ts +63 -0
  402. package/dist/ui/PopoverButton.svelte.d.ts.map +1 -0
  403. package/dist/ui/SignupForm.svelte +117 -0
  404. package/dist/ui/SignupForm.svelte.d.ts +7 -0
  405. package/dist/ui/SignupForm.svelte.d.ts.map +1 -0
  406. package/dist/ui/SurfaceExplorer.svelte +287 -0
  407. package/dist/ui/SurfaceExplorer.svelte.d.ts +8 -0
  408. package/dist/ui/SurfaceExplorer.svelte.d.ts.map +1 -0
  409. package/dist/ui/account_sessions_state.svelte.d.ts +15 -0
  410. package/dist/ui/account_sessions_state.svelte.d.ts.map +1 -0
  411. package/dist/ui/account_sessions_state.svelte.js +45 -0
  412. package/dist/ui/admin_accounts_state.svelte.d.ts +19 -0
  413. package/dist/ui/admin_accounts_state.svelte.d.ts.map +1 -0
  414. package/dist/ui/admin_accounts_state.svelte.js +65 -0
  415. package/dist/ui/admin_invites_state.svelte.d.ts +19 -0
  416. package/dist/ui/admin_invites_state.svelte.d.ts.map +1 -0
  417. package/dist/ui/admin_invites_state.svelte.js +71 -0
  418. package/dist/ui/admin_sessions_state.svelte.d.ts +18 -0
  419. package/dist/ui/admin_sessions_state.svelte.d.ts.map +1 -0
  420. package/dist/ui/admin_sessions_state.svelte.js +62 -0
  421. package/dist/ui/app_settings_state.svelte.d.ts +14 -0
  422. package/dist/ui/app_settings_state.svelte.d.ts.map +1 -0
  423. package/dist/ui/app_settings_state.svelte.js +44 -0
  424. package/dist/ui/audit_log_state.svelte.d.ts +40 -0
  425. package/dist/ui/audit_log_state.svelte.d.ts.map +1 -0
  426. package/dist/ui/audit_log_state.svelte.js +153 -0
  427. package/dist/ui/auth_state.svelte.d.ts +85 -0
  428. package/dist/ui/auth_state.svelte.d.ts.map +1 -0
  429. package/dist/ui/auth_state.svelte.js +238 -0
  430. package/dist/ui/datatable.d.ts +25 -0
  431. package/dist/ui/datatable.d.ts.map +1 -0
  432. package/dist/ui/datatable.js +9 -0
  433. package/dist/ui/enter_advance.d.ts +13 -0
  434. package/dist/ui/enter_advance.d.ts.map +1 -0
  435. package/dist/ui/enter_advance.js +30 -0
  436. package/dist/ui/loadable.svelte.d.ts +55 -0
  437. package/dist/ui/loadable.svelte.d.ts.map +1 -0
  438. package/dist/ui/loadable.svelte.js +75 -0
  439. package/dist/ui/popover.svelte.d.ts +137 -0
  440. package/dist/ui/popover.svelte.d.ts.map +1 -0
  441. package/dist/ui/popover.svelte.js +288 -0
  442. package/dist/ui/position_helpers.d.ts +27 -0
  443. package/dist/ui/position_helpers.d.ts.map +1 -0
  444. package/dist/ui/position_helpers.js +81 -0
  445. package/dist/ui/sidebar_state.svelte.d.ts +30 -0
  446. package/dist/ui/sidebar_state.svelte.d.ts.map +1 -0
  447. package/dist/ui/sidebar_state.svelte.js +39 -0
  448. package/dist/ui/table_state.svelte.d.ts +63 -0
  449. package/dist/ui/table_state.svelte.d.ts.map +1 -0
  450. package/dist/ui/table_state.svelte.js +117 -0
  451. package/dist/ui/ui_fetch.d.ts +29 -0
  452. package/dist/ui/ui_fetch.d.ts.map +1 -0
  453. package/dist/ui/ui_fetch.js +37 -0
  454. package/dist/ui/ui_format.d.ts +63 -0
  455. package/dist/ui/ui_format.d.ts.map +1 -0
  456. package/dist/ui/ui_format.js +196 -0
  457. 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
+ };