@fuzdev/fuz_app 0.3.2 → 0.4.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 (46) hide show
  1. package/dist/cli/daemon.d.ts +14 -1
  2. package/dist/cli/daemon.d.ts.map +1 -1
  3. package/dist/cli/daemon.js +26 -0
  4. package/dist/runtime/deno.d.ts.map +1 -1
  5. package/dist/runtime/deno.js +2 -0
  6. package/dist/runtime/deps.d.ts +8 -1
  7. package/dist/runtime/deps.d.ts.map +1 -1
  8. package/dist/runtime/mock.d.ts +7 -0
  9. package/dist/runtime/mock.d.ts.map +1 -1
  10. package/dist/runtime/mock.js +16 -0
  11. package/dist/runtime/node.d.ts.map +1 -1
  12. package/dist/runtime/node.js +2 -0
  13. package/dist/ui/AdminAuditLog.svelte +2 -2
  14. package/dist/ui/AdminInvites.svelte +2 -2
  15. package/dist/ui/AdminSurface.svelte +3 -3
  16. package/dist/ui/BootstrapForm.svelte +4 -4
  17. package/dist/ui/Datatable.svelte +3 -3
  18. package/dist/ui/LoginForm.svelte +2 -2
  19. package/dist/ui/LogoutButton.svelte +1 -1
  20. package/dist/ui/SignupForm.svelte +4 -4
  21. package/dist/ui/SurfaceExplorer.svelte +3 -3
  22. package/dist/ui/account_sessions_state.svelte.d.ts.map +1 -1
  23. package/dist/ui/account_sessions_state.svelte.js +1 -1
  24. package/dist/ui/admin_accounts_state.svelte.d.ts.map +1 -1
  25. package/dist/ui/admin_accounts_state.svelte.js +2 -2
  26. package/dist/ui/admin_invites_state.svelte.d.ts.map +1 -1
  27. package/dist/ui/admin_invites_state.svelte.js +2 -2
  28. package/dist/ui/admin_sessions_state.svelte.d.ts.map +1 -1
  29. package/dist/ui/admin_sessions_state.svelte.js +1 -1
  30. package/dist/ui/app_settings_state.svelte.d.ts.map +1 -1
  31. package/dist/ui/app_settings_state.svelte.js +2 -2
  32. package/dist/ui/audit_log_state.svelte.d.ts.map +1 -1
  33. package/dist/ui/audit_log_state.svelte.js +3 -3
  34. package/dist/ui/auth_state.svelte.d.ts.map +1 -1
  35. package/dist/ui/auth_state.svelte.js +6 -6
  36. package/dist/ui/form_state.svelte.d.ts +1 -1
  37. package/dist/ui/form_state.svelte.js +2 -2
  38. package/dist/ui/loadable.svelte.d.ts +1 -1
  39. package/dist/ui/loadable.svelte.d.ts.map +1 -1
  40. package/dist/ui/loadable.svelte.js +4 -4
  41. package/dist/ui/popover.svelte.d.ts.map +1 -1
  42. package/dist/ui/popover.svelte.js +6 -6
  43. package/dist/ui/sidebar_state.svelte.js +2 -2
  44. package/dist/ui/table_state.svelte.d.ts.map +1 -1
  45. package/dist/ui/table_state.svelte.js +9 -9
  46. package/package.json +1 -1
@@ -8,7 +8,7 @@
8
8
  * @module
9
9
  */
10
10
  import { z } from 'zod';
11
- import { type CommandDeps, type EnvDeps, type FsReadDeps, type FsRemoveDeps, type FsWriteDeps, type LogDeps } from '../runtime/deps.js';
11
+ import { type CommandDeps, type EnvDeps, type FetchDeps, type FsReadDeps, type FsRemoveDeps, type FsWriteDeps, type LogDeps } from '../runtime/deps.js';
12
12
  /**
13
13
  * Daemon info schema for `~/.{name}/run/daemon.json`.
14
14
  */
@@ -57,6 +57,19 @@ export declare const read_daemon_info: (runtime: Pick<EnvDeps, "env_get"> & Pick
57
57
  * @returns `true` if the process is running
58
58
  */
59
59
  export declare const is_daemon_running: (runtime: CommandDeps, pid: number) => Promise<boolean>;
60
+ /**
61
+ * Check if a daemon is healthy by probing its `/health` endpoint.
62
+ *
63
+ * Complements `is_daemon_running` (PID check) with an HTTP liveness probe.
64
+ * Requires the daemon to register a `/health` route (e.g. via `create_health_route_spec`).
65
+ *
66
+ * @param deps - runtime with fetch capability
67
+ * @param port - port the daemon should be listening on
68
+ * @param host - hostname (default `localhost`)
69
+ * @param timeout_ms - request timeout in milliseconds (default 2000)
70
+ * @returns `true` if the health endpoint responds with 2xx
71
+ */
72
+ export declare const check_daemon_health: (deps: FetchDeps, port: number, host?: string, timeout_ms?: number) => Promise<boolean>;
60
73
  /**
61
74
  * Result of a `stop_daemon` operation.
62
75
  */
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/cli/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,OAAO,EACN,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,MAAM,oBAAoB,CAAC;AAI5B;;GAEG;AACH,eAAO,MAAM,UAAU;IACtB,sBAAsB;;IAEtB,yBAAyB;;IAEzB,uCAAuC;;IAEvC,yCAAyC;;IAEzC,0CAA0C;;kBAEzC,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEpD;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAChC,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EACjC,MAAM,MAAM,KACV,MAAM,GAAG,IAGX,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAC7B,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,iBAAiB,GAAG,QAAQ,CAAC,EAC7F,MAAM,MAAM,EACZ,MAAM,UAAU,KACd,OAAO,CAAC,IAAI,CAWd,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAC5B,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAAC,GAAG,OAAO,EACzF,MAAM,MAAM,KACV,OAAO,CAAC,UAAU,GAAG,IAAI,CAwB3B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAAU,SAAS,WAAW,EAAE,KAAK,MAAM,KAAG,OAAO,CAAC,OAAO,CAG1F,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,GACvB,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAChC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAAC,GAC3C,YAAY,GACZ,WAAW,GACX,OAAO,EACR,MAAM,MAAM,KACV,OAAO,CAAC,gBAAgB,CA2C1B,CAAC"}
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/cli/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,OAAO,EACN,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,MAAM,oBAAoB,CAAC;AAI5B;;GAEG;AACH,eAAO,MAAM,UAAU;IACtB,sBAAsB;;IAEtB,yBAAyB;;IAEzB,uCAAuC;;IAEvC,yCAAyC;;IAEzC,0CAA0C;;kBAEzC,CAAC;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEpD;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAChC,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EACjC,MAAM,MAAM,KACV,MAAM,GAAG,IAGX,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAC7B,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,iBAAiB,GAAG,QAAQ,CAAC,EAC7F,MAAM,MAAM,EACZ,MAAM,UAAU,KACd,OAAO,CAAC,IAAI,CAWd,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAC5B,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAAC,GAAG,OAAO,EACzF,MAAM,MAAM,KACV,OAAO,CAAC,UAAU,GAAG,IAAI,CAwB3B,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAAU,SAAS,WAAW,EAAE,KAAK,MAAM,KAAG,OAAO,CAAC,OAAO,CAG1F,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,GAC/B,MAAM,SAAS,EACf,MAAM,MAAM,EACZ,aAAkB,EAClB,mBAAiB,KACf,OAAO,CAAC,OAAO,CAYjB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,GACvB,SAAS,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAChC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAAC,GAC3C,YAAY,GACZ,WAAW,GACX,OAAO,EACR,MAAM,MAAM,KACV,OAAO,CAAC,gBAAgB,CA2C1B,CAAC"}
@@ -96,6 +96,32 @@ export const is_daemon_running = async (runtime, pid) => {
96
96
  const result = await runtime.run_command('kill', ['-0', String(pid)]);
97
97
  return result.success;
98
98
  };
99
+ /**
100
+ * Check if a daemon is healthy by probing its `/health` endpoint.
101
+ *
102
+ * Complements `is_daemon_running` (PID check) with an HTTP liveness probe.
103
+ * Requires the daemon to register a `/health` route (e.g. via `create_health_route_spec`).
104
+ *
105
+ * @param deps - runtime with fetch capability
106
+ * @param port - port the daemon should be listening on
107
+ * @param host - hostname (default `localhost`)
108
+ * @param timeout_ms - request timeout in milliseconds (default 2000)
109
+ * @returns `true` if the health endpoint responds with 2xx
110
+ */
111
+ export const check_daemon_health = async (deps, port, host = 'localhost', timeout_ms = 2000) => {
112
+ try {
113
+ const controller = new AbortController();
114
+ const timer = setTimeout(() => controller.abort(), timeout_ms);
115
+ const response = await deps.fetch(`http://${host}:${port}/health`, {
116
+ signal: controller.signal,
117
+ });
118
+ clearTimeout(timer);
119
+ return response.ok;
120
+ }
121
+ catch {
122
+ return false;
123
+ }
124
+ };
99
125
  /**
100
126
  * Stop a running daemon by sending SIGTERM and cleaning up the PID file.
101
127
  *
@@ -1 +1 @@
1
- {"version":3,"file":"deno.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/runtime/deno.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,WAAW,EAA4B,MAAM,WAAW,CAAC;AAsCtE;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM,aAAa,CAAC,MAAM,CAAC,KAAG,WAqEhE,CAAC"}
1
+ {"version":3,"file":"deno.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/runtime/deno.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,WAAW,EAA4B,MAAM,WAAW,CAAC;AAsCtE;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,GAAI,MAAM,aAAa,CAAC,MAAM,CAAC,KAAG,WAwEhE,CAAC"}
@@ -42,6 +42,8 @@ export const create_deno_runtime = (args) => ({
42
42
  write_file: (path, data) => Deno.writeFile(path, data),
43
43
  rename: (old_path, new_path) => Deno.rename(old_path, new_path),
44
44
  remove: (path, options) => Deno.remove(path, options),
45
+ // === HTTP ===
46
+ fetch: globalThis.fetch,
45
47
  // === Local Commands ===
46
48
  run_command: async (cmd, args) => {
47
49
  try {
@@ -74,6 +74,13 @@ export interface CommandDeps {
74
74
  /** Run a command and return the result. */
75
75
  run_command: (cmd: string, args: Array<string>) => Promise<CommandResult>;
76
76
  }
77
+ /**
78
+ * HTTP fetch capability.
79
+ */
80
+ export interface FetchDeps {
81
+ /** Fetch a URL. Same signature as the global `fetch`. */
82
+ fetch: typeof globalThis.fetch;
83
+ }
77
84
  /**
78
85
  * Warning/diagnostic output.
79
86
  */
@@ -104,7 +111,7 @@ export interface ProcessDeps {
104
111
  * Functions should accept narrow `*Deps` interfaces, not this full type —
105
112
  * this type is for the wiring layer that creates and passes the runtime.
106
113
  */
107
- export interface RuntimeDeps extends EnvDeps, FsReadDeps, FsWriteDeps, FsRemoveDeps, CommandDeps, TerminalDeps, ProcessDeps, LogDeps {
114
+ export interface RuntimeDeps extends EnvDeps, FsReadDeps, FsWriteDeps, FsRemoveDeps, CommandDeps, FetchDeps, TerminalDeps, ProcessDeps, LogDeps {
108
115
  /** Get all environment variables. */
109
116
  env_all: () => Record<string, string>;
110
117
  /** CLI arguments passed to the program. */
@@ -1 +1 @@
1
- {"version":3,"file":"deps.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/runtime/deps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deps.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/runtime/deps.ts"],"names":[],"mappings":"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"}
@@ -38,6 +38,13 @@ export interface MockRuntime extends RuntimeDeps {
38
38
  mock_command_results: Map<string, CommandResult>;
39
39
  /** Stdin buffer for input simulation. */
40
40
  stdin_buffer: Uint8Array | null;
41
+ /** Fetch calls recorded. */
42
+ fetch_calls: Array<{
43
+ input: string | URL | Request;
44
+ init?: RequestInit;
45
+ }>;
46
+ /** Mock fetch responses (URL substring -> Response). */
47
+ mock_fetch_responses: Map<string, Response>;
41
48
  }
42
49
  /**
43
50
  * Create a mock `RuntimeDeps` for testing.
@@ -1 +1 @@
1
- {"version":3,"file":"mock.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/runtime/mock.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,WAAW,EAAc,aAAa,EAAC,MAAM,WAAW,CAAC;AAItE;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC/C,kCAAkC;IAClC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,0CAA0C;IAC1C,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,+CAA+C;IAC/C,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACvC,mCAAmC;IACnC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,wCAAwC;IACxC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,yBAAyB;IACzB,aAAa,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;KAAC,CAAC,CAAC;IACzD,sCAAsC;IACtC,qBAAqB,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;KAAC,CAAC,CAAC;IACjE,8BAA8B;IAC9B,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,4CAA4C;IAC5C,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACjD,yCAAyC;IACzC,YAAY,EAAE,UAAU,GAAG,IAAI,CAAC;CAChC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,mBAAmB,GAAI,OAAM,KAAK,CAAC,MAAM,CAAM,KAAG,WA8J9D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,WAAW,KAAG,IAWzD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS,WAAW,EAAE,OAAO,MAAM,KAAG,IAEpE,CAAC;AAEF;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM;CAKxB"}
1
+ {"version":3,"file":"mock.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/runtime/mock.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAC,WAAW,EAAc,aAAa,EAAC,MAAM,WAAW,CAAC;AAItE;;GAEG;AACH,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC/C,kCAAkC;IAClC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,0CAA0C;IAC1C,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,+CAA+C;IAC/C,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACvC,mCAAmC;IACnC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,wCAAwC;IACxC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1B,yBAAyB;IACzB,aAAa,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;KAAC,CAAC,CAAC;IACzD,sCAAsC;IACtC,qBAAqB,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;KAAC,CAAC,CAAC;IACjE,8BAA8B;IAC9B,aAAa,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,4CAA4C;IAC5C,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACjD,yCAAyC;IACzC,YAAY,EAAE,UAAU,GAAG,IAAI,CAAC;IAChC,4BAA4B;IAC5B,WAAW,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,WAAW,CAAA;KAAC,CAAC,CAAC;IACxE,wDAAwD;IACxD,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CAC5C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,mBAAmB,GAAI,OAAM,KAAK,CAAC,MAAM,CAAM,KAAG,WA4K9D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,SAAS,WAAW,KAAG,IAazD,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS,WAAW,EAAE,OAAO,MAAM,KAAG,IAEpE,CAAC;AAEF;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM;CAKxB"}
@@ -35,6 +35,8 @@ export const create_mock_runtime = (args = []) => {
35
35
  const command_inherit_calls = [];
36
36
  const stdout_writes = [];
37
37
  const mock_command_results = new Map();
38
+ const fetch_calls = [];
39
+ const mock_fetch_responses = new Map();
38
40
  let stdin_buffer = null;
39
41
  const runtime = {
40
42
  args,
@@ -47,6 +49,8 @@ export const create_mock_runtime = (args = []) => {
47
49
  command_inherit_calls,
48
50
  stdout_writes,
49
51
  mock_command_results,
52
+ fetch_calls,
53
+ mock_fetch_responses,
50
54
  get stdin_buffer() {
51
55
  return stdin_buffer;
52
56
  },
@@ -148,6 +152,16 @@ export const create_mock_runtime = (args = []) => {
148
152
  }
149
153
  }
150
154
  },
155
+ // === HTTP ===
156
+ fetch: async (input, init) => {
157
+ fetch_calls.push({ input: input, init });
158
+ const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;
159
+ for (const [pattern, response] of mock_fetch_responses) {
160
+ if (url.includes(pattern))
161
+ return response.clone();
162
+ }
163
+ throw new TypeError(`fetch failed (no mock for ${url})`);
164
+ },
151
165
  // === Local Commands ===
152
166
  run_command: async (cmd, args) => {
153
167
  command_calls.push({ cmd, args });
@@ -198,6 +212,8 @@ export const reset_mock_runtime = (runtime) => {
198
212
  runtime.command_inherit_calls.length = 0;
199
213
  runtime.stdout_writes.length = 0;
200
214
  runtime.mock_command_results.clear();
215
+ runtime.fetch_calls.length = 0;
216
+ runtime.mock_fetch_responses.clear();
201
217
  runtime.stdin_buffer = null;
202
218
  };
203
219
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/runtime/node.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAC,WAAW,EAA4B,MAAM,WAAW,CAAC;AAEtE;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAC/B,OAAM,aAAa,CAAC,MAAM,CAAyB,KACjD,WA+GD,CAAC"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/runtime/node.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAC,WAAW,EAA4B,MAAM,WAAW,CAAC;AAEtE;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAC/B,OAAM,aAAa,CAAC,MAAM,CAAyB,KACjD,WAkHD,CAAC"}
@@ -46,6 +46,8 @@ export const create_node_runtime = (args = process.argv.slice(2)) => ({
46
46
  write_file: (path, data) => writeFile(path, data),
47
47
  rename: (old_path, new_path) => rename(old_path, new_path),
48
48
  remove: (path, options) => rm(path, options),
49
+ // === HTTP ===
50
+ fetch: globalThis.fetch,
49
51
  // === Local Commands ===
50
52
  run_command: (cmd, args) => {
51
53
  return new Promise((resolve) => {
@@ -17,8 +17,8 @@
17
17
 
18
18
  const audit_log = new AuditLogState();
19
19
 
20
- let filter_event_type: string = $state('');
21
- let streaming = $state(false);
20
+ let filter_event_type: string = $state.raw('');
21
+ let streaming = $state.raw(false);
22
22
 
23
23
  const load = (): void => {
24
24
  void audit_log.fetch(filter_event_type ? {event_type: filter_event_type} : undefined);
@@ -11,8 +11,8 @@
11
11
 
12
12
  const admin_invites = new AdminInvitesState();
13
13
 
14
- let invite_email = $state('');
15
- let invite_username = $state('');
14
+ let invite_email = $state.raw('');
15
+ let invite_username = $state.raw('');
16
16
 
17
17
  const can_create = $derived(
18
18
  (invite_email.trim() || invite_username.trim()) && !admin_invites.creating,
@@ -3,9 +3,9 @@
3
3
  import SurfaceExplorer from './SurfaceExplorer.svelte';
4
4
  import {ui_fetch} from './ui_fetch.js';
5
5
 
6
- let surface: AppSurface | null = $state(null);
7
- let loading = $state(true);
8
- let error: string | null = $state(null);
6
+ let surface: AppSurface | null = $state.raw(null);
7
+ let loading = $state.raw(true);
8
+ let error: string | null = $state.raw(null);
9
9
 
10
10
  const load = async (): Promise<void> => {
11
11
  loading = true;
@@ -10,10 +10,10 @@
10
10
  const auth_state = auth_state_context.get();
11
11
  const form_state = new FormState();
12
12
 
13
- let token = $state('');
14
- let username = $state('');
15
- let password = $state('');
16
- let password_confirm = $state('');
13
+ let token = $state.raw('');
14
+ let username = $state.raw('');
15
+ let password = $state.raw('');
16
+ let password_confirm = $state.raw('');
17
17
 
18
18
  const username_valid = $derived(Username.safeParse(username).success);
19
19
  const passwords_match = $derived(password === password_confirm);
@@ -44,9 +44,9 @@
44
44
  const grid_template_columns = $derived(column_widths.map((w) => `${w}px`).join(' '));
45
45
 
46
46
  // column resize
47
- let resize_col_index: number | null = $state(null);
48
- let resize_start_x = $state(0);
49
- let resize_start_width = $state(0);
47
+ let resize_col_index: number | null = $state.raw(null);
48
+ let resize_start_x = $state.raw(0);
49
+ let resize_start_width = $state.raw(0);
50
50
 
51
51
  const handle_resize_start = (e: PointerEvent, index: number): void => {
52
52
  e.preventDefault();
@@ -18,8 +18,8 @@
18
18
  const auth_state = auth_state_context.get();
19
19
  const form_state = new FormState();
20
20
 
21
- let username = $state('');
22
- let password = $state('');
21
+ let username = $state.raw('');
22
+ let password = $state.raw('');
23
23
 
24
24
  const handle_login = async (): Promise<void> => {
25
25
  const u = username.trim();
@@ -15,7 +15,7 @@
15
15
 
16
16
  const auth_state = auth_state_context.get();
17
17
 
18
- let pending = $state(false);
18
+ let pending = $state.raw(false);
19
19
  </script>
20
20
 
21
21
  <PendingButton
@@ -18,10 +18,10 @@
18
18
  const auth_state = auth_state_context.get();
19
19
  const form_state = new FormState();
20
20
 
21
- let username = $state('');
22
- let email = $state('');
23
- let password = $state('');
24
- let password_confirm = $state('');
21
+ let username = $state.raw('');
22
+ let email = $state.raw('');
23
+ let password = $state.raw('');
24
+ let password_confirm = $state.raw('');
25
25
 
26
26
  const username_valid = $derived(Username.safeParse(username).success);
27
27
  const passwords_match = $derived(password === password_confirm);
@@ -12,8 +12,8 @@
12
12
 
13
13
  const auth_types = ['all', 'none', 'authenticated', 'role', 'keeper'] as const;
14
14
 
15
- let auth_filter: (typeof auth_types)[number] = $state('all');
16
- let expanded_route: string | null = $state(null);
15
+ let auth_filter: (typeof auth_types)[number] = $state.raw('all');
16
+ let expanded_route: string | null = $state.raw(null);
17
17
 
18
18
  const summary = $derived(surface_auth_summary(surface));
19
19
 
@@ -23,7 +23,7 @@
23
23
  : surface.routes.filter((r) => r.auth.type === auth_filter),
24
24
  );
25
25
 
26
- let expanded_event: string | null = $state(null);
26
+ let expanded_event: string | null = $state.raw(null);
27
27
 
28
28
  const toggle_route = (key: string): void => {
29
29
  expanded_route = expanded_route === key ? null : key;
@@ -1 +1 @@
1
- {"version":3,"file":"account_sessions_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/account_sessions_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAE9C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,2BAA2B,CAAC;AAE3D,qBAAa,oBAAqB,SAAQ,QAAQ;IACjD,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,CAAc;IAE1C,QAAQ,CAAC,YAAY,SAAkC;IAEjD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAajC"}
1
+ {"version":3,"file":"account_sessions_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/account_sessions_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAE9C,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,2BAA2B,CAAC;AAE3D,qBAAa,oBAAqB,SAAQ,QAAQ;IACjD,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,CAAkB;IAE9C,QAAQ,CAAC,YAAY,SAAkC;IAEjD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAajC"}
@@ -6,7 +6,7 @@
6
6
  import { Loadable } from './loadable.svelte.js';
7
7
  import { parse_response_error, ui_fetch } from './ui_fetch.js';
8
8
  export class AccountSessionsState extends Loadable {
9
- sessions = $state([]);
9
+ sessions = $state.raw([]);
10
10
  active_count = $derived(this.sessions.length);
11
11
  async fetch() {
12
12
  await this.run(async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"admin_accounts_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/admin_accounts_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAE9C,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,2BAA2B,CAAC;AAErE,qBAAa,kBAAmB,SAAQ,QAAQ;IAC/C,QAAQ,EAAE,KAAK,CAAC,qBAAqB,CAAC,CAAc;IACpD,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,CAAc;IAC5C,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC,MAAM,CAAC,CAAmB;IAC5D,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC,CAAmB;IAE3D,QAAQ,CAAC,aAAa,SAAkC;IAElD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB7D,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAkBzE"}
1
+ {"version":3,"file":"admin_accounts_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/admin_accounts_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAE9C,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,2BAA2B,CAAC;AAErE,qBAAa,kBAAmB,SAAQ,QAAQ;IAC/C,QAAQ,EAAE,KAAK,CAAC,qBAAqB,CAAC,CAAkB;IACxD,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,CAAkB;IAChD,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC,MAAM,CAAC,CAAmB;IAC5D,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC,CAAmB;IAE3D,QAAQ,CAAC,aAAa,SAAkC;IAElD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB7D,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAkBzE"}
@@ -7,8 +7,8 @@ import { SvelteSet } from 'svelte/reactivity';
7
7
  import { Loadable } from './loadable.svelte.js';
8
8
  import { parse_response_error, ui_fetch } from './ui_fetch.js';
9
9
  export class AdminAccountsState extends Loadable {
10
- accounts = $state([]);
11
- grantable_roles = $state([]);
10
+ accounts = $state.raw([]);
11
+ grantable_roles = $state.raw([]);
12
12
  granting_keys = new SvelteSet();
13
13
  revoking_ids = new SvelteSet();
14
14
  account_count = $derived(this.accounts.length);
@@ -1 +1 @@
1
- {"version":3,"file":"admin_invites_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/admin_invites_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAE9C,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,0BAA0B,CAAC;AAEtE,qBAAa,iBAAkB,SAAQ,QAAQ;IAC9C,OAAO,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAc;IACrD,QAAQ,UAAiB;IACzB,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC,CAAmB;IAE3D,QAAQ,CAAC,YAAY,SAAiC;IACtD,QAAQ,CAAC,eAAe,SAA8D;IAEhF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2BlE,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAe9C"}
1
+ {"version":3,"file":"admin_invites_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/admin_invites_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAE9C,OAAO,KAAK,EAAC,uBAAuB,EAAC,MAAM,0BAA0B,CAAC;AAEtE,qBAAa,iBAAkB,SAAQ,QAAQ;IAC9C,OAAO,EAAE,KAAK,CAAC,uBAAuB,CAAC,CAAkB;IACzD,QAAQ,UAAqB;IAC7B,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC,CAAmB;IAE3D,QAAQ,CAAC,YAAY,SAAiC;IACtD,QAAQ,CAAC,eAAe,SAA8D;IAEhF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2BlE,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAe9C"}
@@ -7,8 +7,8 @@ import { SvelteSet } from 'svelte/reactivity';
7
7
  import { Loadable } from './loadable.svelte.js';
8
8
  import { parse_response_error, ui_fetch } from './ui_fetch.js';
9
9
  export class AdminInvitesState extends Loadable {
10
- invites = $state([]);
11
- creating = $state(false);
10
+ invites = $state.raw([]);
11
+ creating = $state.raw(false);
12
12
  deleting_ids = new SvelteSet();
13
13
  invite_count = $derived(this.invites.length);
14
14
  unclaimed_count = $derived(this.invites.filter((i) => !i.claimed_at).length);
@@ -1 +1 @@
1
- {"version":3,"file":"admin_sessions_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/admin_sessions_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAE9C,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,6BAA6B,CAAC;AAElE,qBAAa,kBAAmB,SAAQ,QAAQ;IAC/C,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAc;IAC/C,QAAQ,CAAC,oBAAoB,EAAE,SAAS,CAAC,MAAM,CAAC,CAAmB;IACnE,QAAQ,CAAC,0BAA0B,EAAE,SAAS,CAAC,MAAM,CAAC,CAAmB;IAEzE,QAAQ,CAAC,YAAY,SAAkC;IAEjD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBzD,6BAA6B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAiBtE"}
1
+ {"version":3,"file":"admin_sessions_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/admin_sessions_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAE5C,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAE9C,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,6BAA6B,CAAC;AAElE,qBAAa,kBAAmB,SAAQ,QAAQ;IAC/C,QAAQ,EAAE,KAAK,CAAC,gBAAgB,CAAC,CAAkB;IACnD,QAAQ,CAAC,oBAAoB,EAAE,SAAS,CAAC,MAAM,CAAC,CAAmB;IACnE,QAAQ,CAAC,0BAA0B,EAAE,SAAS,CAAC,MAAM,CAAC,CAAmB;IAEzE,QAAQ,CAAC,YAAY,SAAkC;IAEjD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBzD,6BAA6B,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAiBtE"}
@@ -7,7 +7,7 @@ import { SvelteSet } from 'svelte/reactivity';
7
7
  import { Loadable } from './loadable.svelte.js';
8
8
  import { parse_response_error, ui_fetch } from './ui_fetch.js';
9
9
  export class AdminSessionsState extends Loadable {
10
- sessions = $state([]);
10
+ sessions = $state.raw([]);
11
11
  revoking_account_ids = new SvelteSet();
12
12
  revoking_token_account_ids = new SvelteSet();
13
13
  active_count = $derived(this.sessions.length);
@@ -1 +1 @@
1
- {"version":3,"file":"app_settings_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/app_settings_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAE9C,OAAO,KAAK,EAAC,2BAA2B,EAAC,MAAM,gCAAgC,CAAC;AAEhF,qBAAa,gBAAiB,SAAQ,QAAQ;IAC7C,QAAQ,EAAE,2BAA2B,GAAG,IAAI,CAAgB;IAC5D,QAAQ,UAAiB;IAEnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAqBvD"}
1
+ {"version":3,"file":"app_settings_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/app_settings_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAE9C,OAAO,KAAK,EAAC,2BAA2B,EAAC,MAAM,gCAAgC,CAAC;AAEhF,qBAAa,gBAAiB,SAAQ,QAAQ;IAC7C,QAAQ,EAAE,2BAA2B,GAAG,IAAI,CAAoB;IAChE,QAAQ,UAAqB;IAEvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWtB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAqBvD"}
@@ -6,8 +6,8 @@
6
6
  import { Loadable } from './loadable.svelte.js';
7
7
  import { parse_response_error, ui_fetch } from './ui_fetch.js';
8
8
  export class AppSettingsState extends Loadable {
9
- settings = $state(null);
10
- updating = $state(false);
9
+ settings = $state.raw(null);
10
+ updating = $state.raw(false);
11
11
  async fetch() {
12
12
  await this.run(async () => {
13
13
  const response = await ui_fetch('/api/admin/settings');
@@ -1 +1 @@
1
- {"version":3,"file":"audit_log_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/audit_log_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAE9C,OAAO,KAAK,EAEX,8BAA8B,EAC9B,sBAAsB,EACtB,MAAM,6BAA6B,CAAC;AAGrC,6CAA6C;AAC7C,MAAM,WAAW,oBAAoB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,aAAc,SAAQ,QAAQ;;IAC1C,MAAM,EAAE,KAAK,CAAC,8BAA8B,CAAC,CAAc;IAC3D,qBAAqB,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAc;IAElE,QAAQ,CAAC,KAAK,SAAgC;IAE9C,qDAAqD;IACrD,SAAS,UAAiB;gBAWd,UAAU,SAAgC;IAKhD,KAAK,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBpD,oBAAoB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB1E;;;;;;;OAOG;IACH,SAAS,IAAI,MAAM,IAAI;IA0CvB,gCAAgC;IAChC,UAAU,IAAI,IAAI;CAmClB"}
1
+ {"version":3,"file":"audit_log_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/audit_log_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAE9C,OAAO,KAAK,EAEX,8BAA8B,EAC9B,sBAAsB,EACtB,MAAM,6BAA6B,CAAC;AAGrC,6CAA6C;AAC7C,MAAM,WAAW,oBAAoB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,aAAc,SAAQ,QAAQ;;IAC1C,MAAM,EAAE,KAAK,CAAC,8BAA8B,CAAC,CAAkB;IAC/D,qBAAqB,EAAE,KAAK,CAAC,sBAAsB,CAAC,CAAkB;IAEtE,QAAQ,CAAC,KAAK,SAAgC;IAE9C,qDAAqD;IACrD,SAAS,UAAqB;gBAWlB,UAAU,SAAgC;IAKhD,KAAK,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBpD,oBAAoB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB1E;;;;;;;OAOG;IACH,SAAS,IAAI,MAAM,IAAI;IA0CvB,gCAAgC;IAChC,UAAU,IAAI,IAAI;CAmClB"}
@@ -10,11 +10,11 @@ import { DEV } from 'esm-env';
10
10
  import { Loadable } from './loadable.svelte.js';
11
11
  import { parse_response_error, ui_fetch } from './ui_fetch.js';
12
12
  export class AuditLogState extends Loadable {
13
- events = $state([]);
14
- permit_history_events = $state([]);
13
+ events = $state.raw([]);
14
+ permit_history_events = $state.raw([]);
15
15
  count = $derived(this.events.length);
16
16
  /** Whether the SSE stream is currently connected. */
17
- connected = $state(false);
17
+ connected = $state.raw(false);
18
18
  /** The highest `seq` seen — used for gap fill on reconnection. */
19
19
  #last_seq = null;
20
20
  /** Active EventSource instance. */
@@ -1 +1 @@
1
- {"version":3,"file":"auth_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/auth_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAMH,OAAO,EAAC,KAAK,MAAM,EAAoB,KAAK,cAAc,EAAC,MAAM,2BAA2B,CAAC;AAE7F,qBAAa,SAAS;IACrB,SAAS,UAAiB;IAC1B,QAAQ,UAAiB;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAgB;IAC3C,OAAO,EAAE,cAAc,GAAG,IAAI,CAAgB;IAC9C,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAc;IACpC,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAEpC;IACF,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAoD;IAEjF,gEAAgE;IAChE,eAAe,UAAiB;IAEhC;;;;;;OAMG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BpC;;;;OAIG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwCjE;;;;OAIG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiCpF;;;;OAIG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4ClF;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAU7B;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;;CAA8B,CAAC"}
1
+ {"version":3,"file":"auth_state.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/auth_state.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAMH,OAAO,EAAC,KAAK,MAAM,EAAoB,KAAK,cAAc,EAAC,MAAM,2BAA2B,CAAC;AAE7F,qBAAa,SAAS;IACrB,SAAS,UAAqB;IAC9B,QAAQ,UAAqB;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAoB;IAC/C,OAAO,EAAE,cAAc,GAAG,IAAI,CAAoB;IAClD,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAkB;IACxC,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAEpC;IACF,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAoD;IAEjF,gEAAgE;IAChE,eAAe,UAAqB;IAEpC;;;;;;OAMG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BpC;;;;OAIG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwCjE;;;;OAIG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiCpF;;;;OAIG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA4ClF;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAU7B;AAED;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;;CAA8B,CAAC"}
@@ -35,15 +35,15 @@ import { create_context } from '@fuzdev/fuz_ui/context_helpers.js';
35
35
  import { ui_fetch } from './ui_fetch.js';
36
36
  import { is_permit_active } from '../auth/account_schema.js';
37
37
  export class AuthState {
38
- verifying = $state(false);
39
- verified = $state(false);
40
- verify_error = $state(null);
41
- account = $state(null);
42
- permits = $state([]);
38
+ verifying = $state.raw(false);
39
+ verified = $state.raw(false);
40
+ verify_error = $state.raw(null);
41
+ account = $state.raw(null);
42
+ permits = $state.raw([]);
43
43
  active_permits = $derived(this.permits.filter((p) => is_permit_active(p)));
44
44
  roles = $derived(this.active_permits.map((p) => p.role));
45
45
  /** True when bootstrap is available (no accounts exist yet). */
46
- needs_bootstrap = $state(false);
46
+ needs_bootstrap = $state.raw(false);
47
47
  /**
48
48
  * Check auth state and bootstrap availability.
49
49
  *
@@ -15,7 +15,7 @@
15
15
  * ```svelte
16
16
  * <script>
17
17
  * const form_state = new FormState();
18
- * let username = $state('');
18
+ * let username = $state.raw('');
19
19
  * const username_valid = $derived(Username.safeParse(username).success);
20
20
  * const can_submit = $derived(username.trim() && username_valid);
21
21
  *
@@ -15,7 +15,7 @@
15
15
  * ```svelte
16
16
  * <script>
17
17
  * const form_state = new FormState();
18
- * let username = $state('');
18
+ * let username = $state.raw('');
19
19
  * const username_valid = $derived(Username.safeParse(username).success);
20
20
  * const can_submit = $derived(username.trim() && username_valid);
21
21
  *
@@ -48,7 +48,7 @@ const FORM_INPUT_SELECTOR = 'input, textarea, select';
48
48
  export class FormState {
49
49
  #touched = new SvelteSet();
50
50
  #form = null;
51
- #attempted = $state(false);
51
+ #attempted = $state.raw(false);
52
52
  /**
53
53
  * Whether a submit attempt has been made.
54
54
  */
@@ -8,7 +8,7 @@
8
8
  * @example
9
9
  * ```ts
10
10
  * class ItemsState extends Loadable {
11
- * items: Array<Item> = $state([]);
11
+ * items: Array<Item> = $state.raw([]);
12
12
  *
13
13
  * async fetch(): Promise<void> {
14
14
  * await this.run(async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"loadable.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/loadable.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,qBAAa,QAAQ,CAAC,MAAM,GAAG,MAAM;IACpC,OAAO,UAAiB;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAgB;IAEpC,sFAAsF;IACtF,UAAU,EAAE,OAAO,CAAgB;IAEnC;;;;;;;OAOG;cACa,GAAG,CAAC,CAAC,EACpB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM,GAChC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAiBzB,wEAAwE;IACxE,KAAK,IAAI,IAAI;CAKb"}
1
+ {"version":3,"file":"loadable.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/loadable.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,qBAAa,QAAQ,CAAC,MAAM,GAAG,MAAM;IACpC,OAAO,UAAqB;IAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAoB;IAExC,sFAAsF;IACtF,UAAU,EAAE,OAAO,CAAoB;IAEvC;;;;;;;OAOG;cACa,GAAG,CAAC,CAAC,EACpB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,MAAM,GAChC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAiBzB,wEAAwE;IACxE,KAAK,IAAI,IAAI;CAKb"}
@@ -8,7 +8,7 @@
8
8
  * @example
9
9
  * ```ts
10
10
  * class ItemsState extends Loadable {
11
- * items: Array<Item> = $state([]);
11
+ * items: Array<Item> = $state.raw([]);
12
12
  *
13
13
  * async fetch(): Promise<void> {
14
14
  * await this.run(async () => {
@@ -36,10 +36,10 @@
36
36
  * @module
37
37
  */
38
38
  export class Loadable {
39
- loading = $state(false);
40
- error = $state(null);
39
+ loading = $state.raw(false);
40
+ error = $state.raw(null);
41
41
  /** The raw caught value from the last failed `run()`, for programmatic inspection. */
42
- error_data = $state(null);
42
+ error_data = $state.raw(null);
43
43
  /**
44
44
  * Run an async operation with loading/error handling.
45
45
  *
@@ -1 +1 @@
1
- {"version":3,"file":"popover.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/popover.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,QAAQ,CAAC;AAGpC,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAC,KAAK,QAAQ,EAAE,KAAK,SAAS,EAA2B,MAAM,uBAAuB,CAAC;AAS9F;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,uDAAuD;IACvD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,yCAAyC;IACzC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,iBAAiB;IAClE,uDAAuD;IACvD,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,WAAW,KAAK,gBAAgB,GAAG;IAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CAAC,CAAC;AAElG;;GAEG;AAEH,MAAM,WAAW,wBAAyB,SAAQ,iBAAiB;CAElE;AAED;;GAEG;AACH,qBAAa,OAAO;;IACnB,gDAAgD;IAChD,OAAO,UAAiB;IAExB,uDAAuD;IACvD,QAAQ,EAAE,QAAQ,CAAoB;IAEtC,yCAAyC;IACzC,KAAK,EAAE,SAAS,CAAoB;IAEpC,kCAAkC;IAClC,MAAM,SAAe;IAErB,wDAAwD;IACxD,qBAAqB,UAAiB;IAEtC,oCAAoC;IACpC,aAAa,SAAc;gBAoBf,MAAM,CAAC,EAAE,iBAAiB;IAiCtC;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAgEvC;;OAEG;IACH,IAAI,IAAI,IAAI;IAWZ;;OAEG;IACH,IAAI,IAAI,IAAI;IAWZ;;OAEG;IACH,MAAM,CAAC,OAAO,UAAgB,GAAG,IAAI;IAQrC;;OAEG;IACH,SAAS,EAAE,UAAU,CAAC,WAAW,CAAC,CAQhC;IAEF;;OAEG;IACH,OAAO,GAAI,SAAS,wBAAwB,KAAG,UAAU,CAAC,WAAW,CAAC,CAsBpE;IAEF;;OAEG;IACH,OAAO,GAAI,SAAS,wBAAwB,KAAG,UAAU,CAAC,WAAW,CAAC,CA2DpE;CACF"}
1
+ {"version":3,"file":"popover.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/popover.svelte.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,QAAQ,CAAC;AAGpC,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAC,KAAK,QAAQ,EAAE,KAAK,SAAS,EAA2B,MAAM,uBAAuB,CAAC;AAS9F;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,uDAAuD;IACvD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,yCAAyC;IACzC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,iBAAiB;IAClE,uDAAuD;IACvD,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,WAAW,KAAK,gBAAgB,GAAG;IAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;CAAC,CAAC;AAElG;;GAEG;AAEH,MAAM,WAAW,wBAAyB,SAAQ,iBAAiB;CAElE;AAED;;GAEG;AACH,qBAAa,OAAO;;IACnB,gDAAgD;IAChD,OAAO,UAAqB;IAE5B,uDAAuD;IACvD,QAAQ,EAAE,QAAQ,CAAwB;IAE1C,yCAAyC;IACzC,KAAK,EAAE,SAAS,CAAwB;IAExC,kCAAkC;IAClC,MAAM,SAAmB;IAEzB,wDAAwD;IACxD,qBAAqB,UAAqB;IAE1C,oCAAoC;IACpC,aAAa,SAAkB;gBAoBnB,MAAM,CAAC,EAAE,iBAAiB;IAiCtC;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI;IAgEvC;;OAEG;IACH,IAAI,IAAI,IAAI;IAWZ;;OAEG;IACH,IAAI,IAAI,IAAI;IAWZ;;OAEG;IACH,MAAM,CAAC,OAAO,UAAgB,GAAG,IAAI;IAQrC;;OAEG;IACH,SAAS,EAAE,UAAU,CAAC,WAAW,CAAC,CAQhC;IAEF;;OAEG;IACH,OAAO,GAAI,SAAS,wBAAwB,KAAG,UAAU,CAAC,WAAW,CAAC,CAsBpE;IAEF;;OAEG;IACH,OAAO,GAAI,SAAS,wBAAwB,KAAG,UAAU,CAAC,WAAW,CAAC,CA2DpE;CACF"}
@@ -55,17 +55,17 @@ const create_client_id = () => Math.random().toString(36).substring(2);
55
55
  */
56
56
  export class Popover {
57
57
  /** Whether the popover is currently visible. */
58
- visible = $state(false);
58
+ visible = $state.raw(false);
59
59
  /** Position of the popover relative to its trigger. */
60
- position = $state('bottom');
60
+ position = $state.raw('bottom');
61
61
  /** Alignment along the position edge. */
62
- align = $state('center');
62
+ align = $state.raw('center');
63
63
  /** Distance from the position. */
64
- offset = $state('0');
64
+ offset = $state.raw('0');
65
65
  /** Whether to disable closing when clicking outside. */
66
- disable_outside_click = $state(false);
66
+ disable_outside_click = $state.raw(false);
67
67
  /** Custom class for the popover. */
68
- popover_class = $state('');
68
+ popover_class = $state.raw('');
69
69
  /** Reference to the trigger element. */
70
70
  #trigger_element = null;
71
71
  /** Reference to the content element. */
@@ -1,8 +1,8 @@
1
1
  import { create_context } from '@fuzdev/fuz_ui/context_helpers.js';
2
2
  export class SidebarState {
3
3
  #get_enabled;
4
- #enabled = $state(true);
5
- #show_sidebar = $state(true);
4
+ #enabled = $state.raw(true);
5
+ #show_sidebar = $state.raw(true);
6
6
  get enabled() {
7
7
  return this.#get_enabled?.() ?? this.#enabled;
8
8
  }
@@ -1 +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"}
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,CAAkB;IACpC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAkB;IAC5C,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAkB;IACtD,KAAK,SAAiB;IACtB,MAAM,SAAiB;IACvB,KAAK,SAAmB;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAoB;IAC9C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAoB;IAC3C,YAAY,EAAE,MAAM,GAAG,IAAI,CAAoB;IAG/C,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"}
@@ -43,15 +43,15 @@ import { format_value } from './ui_format.js';
43
43
  /** Maximum number of rows that can be fetched in a single page. */
44
44
  export const TABLE_LIMIT_MAX = 1000;
45
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);
46
+ table_name = $state.raw('');
47
+ columns = $state.raw([]);
48
+ rows = $state.raw([]);
49
+ total = $state.raw(0);
50
+ offset = $state.raw(0);
51
+ limit = $state.raw(100);
52
+ primary_key = $state.raw(null);
53
+ deleting = $state.raw(null);
54
+ delete_error = $state.raw(null);
55
55
  // Pagination computed values
56
56
  showing_start = $derived(this.total === 0 ? 0 : this.offset + 1);
57
57
  showing_end = $derived(Math.min(this.offset + this.rows.length, this.total));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fuzdev/fuz_app",
3
- "version": "0.3.2",
3
+ "version": "0.4.0",
4
4
  "description": "fullstack app library",
5
5
  "glyph": "🗝",
6
6
  "logo": "logo.svg",