@fuzdev/fuz_app 0.130.0 → 0.132.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 (148) hide show
  1. package/dist/actions/action_dispatcher.js +0 -1
  2. package/dist/actions/action_event_data.d.ts +2 -2
  3. package/dist/actions/action_event_types.d.ts +2 -2
  4. package/dist/actions/action_rpc.js +0 -1
  5. package/dist/actions/action_spec.d.ts +19 -19
  6. package/dist/actions/perform_action.js +0 -1
  7. package/dist/actions/register_action_ws.d.ts.map +1 -1
  8. package/dist/actions/register_action_ws.js +3 -1
  9. package/dist/actions/rpc_client.d.ts.map +1 -1
  10. package/dist/actions/transports_http.d.ts +7 -0
  11. package/dist/actions/transports_http.d.ts.map +1 -1
  12. package/dist/actions/transports_http.js +18 -1
  13. package/dist/actions/transports_ws_backend.d.ts +4 -3
  14. package/dist/actions/transports_ws_backend.d.ts.map +1 -1
  15. package/dist/actions/transports_ws_backend.js +4 -3
  16. package/dist/auth/CLAUDE.md +1 -1
  17. package/dist/auth/account_routes.js +1 -1
  18. package/dist/auth/audit_log_routes.d.ts.map +1 -1
  19. package/dist/auth/audit_log_routes.js +3 -1
  20. package/dist/auth/audit_log_schema.d.ts +5 -5
  21. package/dist/auth/cell_action_specs.d.ts +3 -3
  22. package/dist/auth/credential_type_schema.d.ts +1 -1
  23. package/dist/auth/middleware.d.ts +13 -10
  24. package/dist/auth/middleware.d.ts.map +1 -1
  25. package/dist/auth/middleware.js +14 -10
  26. package/dist/auth/scope_kind_schema.d.ts.map +1 -1
  27. package/dist/auth/scope_kind_schema.js +1 -3
  28. package/dist/cli/daemon.js +0 -1
  29. package/dist/cli/logger.js +0 -1
  30. package/dist/db/db_pg.js +1 -1
  31. package/dist/env/load.js +0 -1
  32. package/dist/hono_context.d.ts +1 -1
  33. package/dist/http/CLAUDE.md +2 -1
  34. package/dist/http/auth_shape.d.ts +6 -6
  35. package/dist/http/error_schemas.d.ts +12 -2
  36. package/dist/http/error_schemas.d.ts.map +1 -1
  37. package/dist/http/error_schemas.js +10 -1
  38. package/dist/http/jsonrpc_errors.d.ts.map +1 -1
  39. package/dist/http/origin.d.ts +10 -6
  40. package/dist/http/origin.d.ts.map +1 -1
  41. package/dist/http/origin.js +10 -6
  42. package/dist/http/route_spec.d.ts +19 -12
  43. package/dist/http/route_spec.d.ts.map +1 -1
  44. package/dist/http/route_spec.js +33 -6
  45. package/dist/http/schema_helpers.d.ts +3 -1
  46. package/dist/http/schema_helpers.d.ts.map +1 -1
  47. package/dist/http/schema_helpers.js +3 -2
  48. package/dist/http/simple_request.d.ts +63 -0
  49. package/dist/http/simple_request.d.ts.map +1 -0
  50. package/dist/http/simple_request.js +84 -0
  51. package/dist/http/surface.js +0 -1
  52. package/dist/realtime/sse.js +0 -1
  53. package/dist/runtime/mock.js +1 -1
  54. package/dist/server/app_server.d.ts +2 -2
  55. package/dist/server/app_server.d.ts.map +1 -1
  56. package/dist/server/app_server.js +5 -2
  57. package/dist/testing/CLAUDE.md +21 -6
  58. package/dist/testing/admin_integration.d.ts.map +1 -1
  59. package/dist/testing/admin_integration.js +2 -1
  60. package/dist/testing/attack_surface.d.ts.map +1 -1
  61. package/dist/testing/attack_surface.js +14 -15
  62. package/dist/testing/audit_completeness.js +1 -1
  63. package/dist/testing/cross_backend/account_lifecycle.d.ts.map +1 -1
  64. package/dist/testing/cross_backend/account_lifecycle.js +0 -3
  65. package/dist/testing/cross_backend/action_manifest.d.ts +10 -14
  66. package/dist/testing/cross_backend/action_manifest.d.ts.map +1 -1
  67. package/dist/testing/cross_backend/action_manifest.js +0 -4
  68. package/dist/testing/cross_backend/actor_lookup.d.ts.map +1 -1
  69. package/dist/testing/cross_backend/actor_lookup.js +0 -3
  70. package/dist/testing/cross_backend/actor_search.d.ts.map +1 -1
  71. package/dist/testing/cross_backend/actor_search.js +0 -2
  72. package/dist/testing/cross_backend/app_settings.d.ts.map +1 -1
  73. package/dist/testing/cross_backend/app_settings.js +0 -2
  74. package/dist/testing/cross_backend/body_size.d.ts.map +1 -1
  75. package/dist/testing/cross_backend/body_size.js +0 -3
  76. package/dist/testing/cross_backend/body_size_smuggling.d.ts.map +1 -1
  77. package/dist/testing/cross_backend/body_size_smuggling.js +0 -2
  78. package/dist/testing/cross_backend/cell_cross_helpers.d.ts.map +1 -1
  79. package/dist/testing/cross_backend/cell_cross_helpers.js +0 -3
  80. package/dist/testing/cross_backend/cell_crud.d.ts.map +1 -1
  81. package/dist/testing/cross_backend/cell_crud.js +0 -3
  82. package/dist/testing/cross_backend/cell_gated_create.d.ts +0 -2
  83. package/dist/testing/cross_backend/cell_gated_create.d.ts.map +1 -1
  84. package/dist/testing/cross_backend/cell_gated_create.js +0 -4
  85. package/dist/testing/cross_backend/cell_grant_role.d.ts.map +1 -1
  86. package/dist/testing/cross_backend/cell_grant_role.js +0 -2
  87. package/dist/testing/cross_backend/cell_relations.d.ts.map +1 -1
  88. package/dist/testing/cross_backend/cell_relations.js +0 -3
  89. package/dist/testing/cross_backend/cookie_attributes.d.ts.map +1 -1
  90. package/dist/testing/cross_backend/cookie_attributes.js +0 -3
  91. package/dist/testing/cross_backend/credential_header_robustness.d.ts.map +1 -1
  92. package/dist/testing/cross_backend/credential_header_robustness.js +0 -2
  93. package/dist/testing/cross_backend/default_spine_surface.d.ts +0 -7
  94. package/dist/testing/cross_backend/default_spine_surface.d.ts.map +1 -1
  95. package/dist/testing/cross_backend/fact_serving.d.ts.map +1 -1
  96. package/dist/testing/cross_backend/fact_serving.js +0 -3
  97. package/dist/testing/cross_backend/full_spine_mount.d.ts +0 -5
  98. package/dist/testing/cross_backend/full_spine_mount.d.ts.map +1 -1
  99. package/dist/testing/cross_backend/identity_parity.d.ts.map +1 -1
  100. package/dist/testing/cross_backend/identity_parity.js +0 -2
  101. package/dist/testing/cross_backend/login_security.d.ts.map +1 -1
  102. package/dist/testing/cross_backend/login_security.js +0 -3
  103. package/dist/testing/cross_backend/origin.d.ts.map +1 -1
  104. package/dist/testing/cross_backend/origin.js +0 -3
  105. package/dist/testing/cross_backend/query_shape.d.ts.map +1 -1
  106. package/dist/testing/cross_backend/query_shape.js +0 -3
  107. package/dist/testing/cross_backend/ready.d.ts.map +1 -1
  108. package/dist/testing/cross_backend/ready.js +0 -3
  109. package/dist/testing/cross_backend/role_grant_offer_enumeration.d.ts.map +1 -1
  110. package/dist/testing/cross_backend/role_grant_offer_enumeration.js +0 -3
  111. package/dist/testing/cross_backend/role_grant_participation.d.ts.map +1 -1
  112. package/dist/testing/cross_backend/role_grant_participation.js +0 -3
  113. package/dist/testing/cross_backend/session_cap.d.ts.map +1 -1
  114. package/dist/testing/cross_backend/session_cap.js +0 -3
  115. package/dist/testing/cross_backend/simple_request.d.ts +11 -0
  116. package/dist/testing/cross_backend/simple_request.d.ts.map +1 -0
  117. package/dist/testing/cross_backend/simple_request.js +142 -0
  118. package/dist/testing/cross_backend/test_cell_gated_create_authorize.d.ts.map +1 -1
  119. package/dist/testing/cross_backend/test_cell_gated_create_authorize.js +0 -3
  120. package/dist/testing/cross_backend/testing_backdoor.d.ts.map +1 -1
  121. package/dist/testing/cross_backend/testing_backdoor.js +0 -3
  122. package/dist/testing/cross_backend/testing_reset_actions.d.ts +5 -5
  123. package/dist/testing/cross_backend/testing_server_bun.js +1 -1
  124. package/dist/testing/cross_backend/token_lifetime.d.ts.map +1 -1
  125. package/dist/testing/cross_backend/token_lifetime.js +0 -4
  126. package/dist/testing/cross_backend/token_scope_surface.d.ts.map +1 -1
  127. package/dist/testing/cross_backend/token_scope_surface.js +0 -3
  128. package/dist/testing/cross_backend/ts_spine_backend_config.d.ts +1 -1
  129. package/dist/testing/cross_backend/ts_spine_backend_config.js +1 -1
  130. package/dist/testing/cross_backend/ws_action_rate_limit.d.ts.map +1 -1
  131. package/dist/testing/cross_backend/ws_action_rate_limit.js +0 -3
  132. package/dist/testing/cross_backend/ws_connection_cap.d.ts.map +1 -1
  133. package/dist/testing/cross_backend/ws_connection_cap.js +0 -3
  134. package/dist/testing/integration.d.ts.map +1 -1
  135. package/dist/testing/integration.js +40 -11
  136. package/dist/testing/rpc_helpers.d.ts.map +1 -1
  137. package/dist/testing/rpc_helpers.js +19 -7
  138. package/dist/testing/stubs.d.ts.map +1 -1
  139. package/dist/testing/stubs.js +3 -0
  140. package/dist/testing/transports/sse_frame_reader.d.ts.map +1 -1
  141. package/dist/testing/transports/sse_frame_reader.js +4 -1
  142. package/dist/testing/transports/ws_client.js +0 -1
  143. package/dist/ui/Datatable.svelte +2 -2
  144. package/dist/ui/auth_state.svelte.d.ts.map +1 -1
  145. package/dist/ui/auth_state.svelte.js +5 -1
  146. package/dist/ui/ui_format.d.ts.map +1 -1
  147. package/dist/ui/ui_format.js +2 -0
  148. package/package.json +19 -19
@@ -72,6 +72,17 @@ export const describe_standard_integration_tests = (options) => {
72
72
  const { cookie_name } = options.session_options;
73
73
  // Error coverage tracking across test groups
74
74
  const error_collector = new ErrorCoverageCollector();
75
+ // the auth routes this suite drives: login / logout / password, signup
76
+ // (when wired), and the shared RPC endpoint — admin-role routes belong to
77
+ // the admin suite
78
+ const is_suite_auth_route = (s) => {
79
+ if (s.auth.roles?.includes('admin') ?? false)
80
+ return false;
81
+ const rest_suffixes = ['/login', '/logout', '/password', '/signup'];
82
+ if (rest_suffixes.some((suffix) => s.path.endsWith(suffix)))
83
+ return true;
84
+ return s.path === rpc_path;
85
+ };
75
86
  afterAll(() => {
76
87
  // Scope coverage to auth routes this suite actually exercises:
77
88
  // login / logout / password drivers + signup invite edge cases
@@ -83,14 +94,7 @@ export const describe_standard_integration_tests = (options) => {
83
94
  // `create_test_app_for_bootstrap`. Consumer-specific
84
95
  // routes would dilute the ratio; admin-role routes are scoped to
85
96
  // the admin suite instead.
86
- const auth_routes = route_specs.filter((s) => {
87
- if (s.auth.roles?.includes('admin') ?? false)
88
- return false;
89
- const rest_suffixes = ['/login', '/logout', '/password', '/signup'];
90
- if (rest_suffixes.some((suffix) => s.path.endsWith(suffix)))
91
- return true;
92
- return s.path === rpc_path;
93
- });
97
+ const auth_routes = route_specs.filter(is_suite_auth_route);
94
98
  assert_error_coverage(error_collector, auth_routes.length > 0 ? auth_routes : route_specs, {
95
99
  min_coverage: options.error_coverage_min ?? DEFAULT_INTEGRATION_ERROR_COVERAGE,
96
100
  // Authorization denials (403) on these scoped auth routes — the
@@ -233,7 +237,7 @@ export const describe_standard_integration_tests = (options) => {
233
237
  // Logout
234
238
  const logout_res = await fixture.transport(logout_route.path, {
235
239
  method: 'POST',
236
- headers: create_headers()
240
+ headers: { ...create_headers(), 'content-type': 'application/json' }
237
241
  });
238
242
  assert.strictEqual(logout_res.status, 200);
239
243
  const logout_body = await logout_res.json();
@@ -633,7 +637,11 @@ export const describe_standard_integration_tests = (options) => {
633
637
  path: rpc_path,
634
638
  spec: account_verify_action_spec,
635
639
  params: undefined,
636
- headers: { ...bearer_headers, origin: 'http://localhost:5173' }
640
+ headers: {
641
+ ...bearer_headers,
642
+ origin: 'http://localhost:5173',
643
+ 'content-type': 'application/json'
644
+ }
637
645
  });
638
646
  assert.strictEqual(res.status, 401);
639
647
  });
@@ -1029,7 +1037,11 @@ export const describe_standard_integration_tests = (options) => {
1029
1037
  });
1030
1038
  const res = await fixture.fresh_transport()(logout_route.path, {
1031
1039
  method: 'POST',
1032
- headers: { ...bearer_headers, origin: 'http://localhost:5173' }
1040
+ headers: {
1041
+ ...bearer_headers,
1042
+ origin: 'http://localhost:5173',
1043
+ 'content-type': 'application/json'
1044
+ }
1033
1045
  });
1034
1046
  assert.strictEqual(res.status, 401, 'Bearer with Origin should be discarded → unauthenticated');
1035
1047
  error_collector.record(route_specs, 'POST', logout_route.path, 401);
@@ -1049,6 +1061,23 @@ export const describe_standard_integration_tests = (options) => {
1049
1061
  error_collector.record(route_specs, 'POST', password_route.path, 401);
1050
1062
  });
1051
1063
  });
1064
+ // --- 12b. Content type: every JSON POST route refuses an untyped body ---
1065
+ describe('JSON routes refuse an untyped POST', () => {
1066
+ test('each scoped JSON POST route answers an untyped POST with 415', async () => {
1067
+ const fixture = await options.setup_test();
1068
+ const json_post_routes = route_specs.filter((s) => s.method === 'POST' && !s.raw_body && is_suite_auth_route(s));
1069
+ assert.ok(json_post_routes.length > 0, 'Expected JSON POST routes');
1070
+ for (const route of json_post_routes) {
1071
+ // a byte body, so `fetch` adds no `Content-Type` of its own
1072
+ const res = await fixture.fresh_transport()(route.path, {
1073
+ method: 'POST',
1074
+ body: new TextEncoder().encode('{}')
1075
+ });
1076
+ assert.strictEqual(res.status, 415, `untyped POST ${route.path}`);
1077
+ await error_collector.assert_and_record(route_specs, 'POST', route.path, res);
1078
+ }
1079
+ });
1080
+ });
1052
1081
  // --- 13. Password change revokes API tokens ---
1053
1082
  describe('password change revokes API tokens', () => {
1054
1083
  test('API tokens are invalidated after password change', async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"rpc_helpers.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/testing/rpc_helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rpc_helpers.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/testing/rpc_helpers.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,6 @@ import './assert_dev_env.js';
9
9
  * @module
10
10
  */
11
11
  import { assert } from 'vitest';
12
- import { z } from 'zod';
13
12
  import { JSONRPC_VERSION, JsonrpcErrorResponse, JsonrpcResponse } from '../http/jsonrpc.js';
14
13
  import { create_stub_app_server_context } from './stubs.js';
15
14
  /**
@@ -146,6 +145,23 @@ const RPC_CALL_DEFAULT_HEADERS_BASE = {
146
145
  host: 'localhost',
147
146
  'Content-Type': 'application/json'
148
147
  };
148
+ /**
149
+ * Merge header records case-insensitively, later sources replacing earlier
150
+ * ones — a plain spread would keep `Content-Type` and `content-type` as two
151
+ * keys, which `fetch` joins into one comma-separated value. Names come out
152
+ * lowercased; values pass through unvalidated, so a test can still send a
153
+ * malformed header to the server.
154
+ */
155
+ const merge_header_records = (...sources) => {
156
+ const merged = {};
157
+ for (const source of sources) {
158
+ if (!source)
159
+ continue;
160
+ for (const [name, value] of Object.entries(source))
161
+ merged[name.toLowerCase()] = value;
162
+ }
163
+ return merged;
164
+ };
149
165
  /** Default headers merged into every `rpc_call` request. Includes `origin`. */
150
166
  const RPC_CALL_DEFAULT_HEADERS = {
151
167
  ...RPC_CALL_DEFAULT_HEADERS_BASE,
@@ -172,18 +188,14 @@ export const rpc_call = async (args) => {
172
188
  let init;
173
189
  if (verb === 'GET') {
174
190
  url = create_rpc_get_url(path, method, params, id);
175
- init = { method: 'GET', headers: { ...defaults, ...headers } };
191
+ init = { method: 'GET', headers: merge_header_records(defaults, headers) };
176
192
  }
177
193
  else {
178
194
  url = path;
179
195
  const post = create_rpc_post_init(method, params, id);
180
196
  init = {
181
197
  method: 'POST',
182
- headers: {
183
- ...defaults,
184
- ...post.headers,
185
- ...headers
186
- },
198
+ headers: merge_header_records(defaults, post.headers, headers),
187
199
  body: post.body
188
200
  };
189
201
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stubs.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/testing/stubs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stubs.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/testing/stubs.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,CAAC;AAa7B,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAI3E,OAAO,EAEN,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAGN,KAAK,cAAc,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAmB,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAA+B,KAAK,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAS9F;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,GAAG,GAAG,EAAE,OAAO,MAAM,KAAG,CAqBtD,CAAC;AAET;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,GAAI,CAAC,GAAG,GAAG,EAAE,QAAQ,MAAM,EAAE,YAAY,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,CAOxF,CAAC;AAET,iEAAiE;AACjE,eAAO,MAAM,IAAI,EAAE,GAAkC,CAAC;AAEtD;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,QAAO,EAI/B,CAAC;AAEJ,gDAAgD;AAChD,eAAO,MAAM,YAAY,QAAO,QAAgC,CAAC;AAEjE,2CAA2C;AAC3C,eAAO,MAAM,OAAO,GAAU,IAAI,GAAG,EAAE,MAAM,GAAG,KAAG,OAAO,CAAC,IAAI,CAAW,CAAC;AAI3E;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,yBAAyB,QAAO,YAY3C,CAAC;AAEH;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,QAAO,WASxC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,QAAO,OAWtC,CAAC;AAEH,6CAA6C;AAC7C,MAAM,WAAW,2BAA2B;IAC3C,oEAAoE;IACpE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,GAAI,UAAU,2BAA2B,KAAG,UAM9E,CAAC;AAKH;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,GAAI,UAAU;IACpD,iDAAiD;IACjD,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAC/B,KAAG,KAAK,CAAC,cAAc,CA0BvB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,8BAA8B,GAC1C,iBAAiB,cAAc,CAAC,MAAM,CAAC,KACrC,gBAgBF,CAAC;AAEF,kDAAkD;AAClD,MAAM,WAAW,+BAA+B;IAC/C,6DAA6D;IAC7D,eAAe,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC,qFAAqF;IACrF,kBAAkB,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC;IAChE,oEAAoE;IACpE,UAAU,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC;IACzB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC/B;;;;;;;;OAQG;IACH,aAAa,CAAC,EAAE,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,gBAAgB,KAAK,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IAC7F;;;;;;;;OAQG;IACH,YAAY,CAAC,EACZ,aAAa,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,gBAAgB,KAAK,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC;IAC5F;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACxC;;;;;;;;OAQG;IACH,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,KAAK,CAAC,cAAc,CAAC,CAAC;IAC/E;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB;AAoBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,4BAA4B,GACxC,SAAS,+BAA+B,KACtC,cA+FF,CAAC"}
@@ -313,6 +313,9 @@ export const create_test_app_surface_spec = (options) => {
313
313
  { ...bootstrap_route_shape, handler: stub_handler }
314
314
  ])
315
315
  : [];
316
+ for (const route of bootstrap_route_specs) {
317
+ assert_endpoint_in_auth_scope('bootstrap.route_prefix', route.path);
318
+ }
316
319
  // the surface route mirrors `create_app_server`'s opt-in mount — its handler
317
320
  // serves the surface generated below, backfilled into the same ref
318
321
  const surface_ref = {
@@ -1 +1 @@
1
- {"version":3,"file":"sse_frame_reader.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/transports/sse_frame_reader.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;GAWG;AAEH,iDAAiD;AACjD,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,gEAAgE;AAChE,MAAM,WAAW,cAAc;IAC9B;;;;OAIG;IACH,UAAU,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD;;;OAGG;IACH,cAAc,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,sEAAsE;IACtE,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,GACnC,QAAQ,2BAA2B,CAAC,UAAU,CAAC,EAC/C,2BAA8C,KAC5C,cA6DF,CAAC"}
1
+ {"version":3,"file":"sse_frame_reader.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/transports/sse_frame_reader.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;GAWG;AAEH,iDAAiD;AACjD,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,gEAAgE;AAChE,MAAM,WAAW,cAAc;IAC9B;;;;OAIG;IACH,UAAU,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD;;;OAGG;IACH,cAAc,EAAE,CAAC,UAAU,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1D,sEAAsE;IACtE,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,GACnC,QAAQ,2BAA2B,CAAC,UAAU,CAAC,EAC/C,2BAA8C,KAC5C,cA+DF,CAAC"}
@@ -31,7 +31,10 @@ export const create_sse_frame_reader = (reader, default_timeout_ms = SSE_FRAME_R
31
31
  const timeout = new Promise((resolve) => {
32
32
  setTimeout(() => resolve({ timed_out: true }), timeout_ms);
33
33
  });
34
- const result = (await Promise.race([reader.read(), timeout]));
34
+ const result = await Promise.race([
35
+ reader.read(),
36
+ timeout
37
+ ]);
35
38
  if ('timed_out' in result) {
36
39
  throw new Error(`SSE read timed out after ${timeout_ms}ms`);
37
40
  }
@@ -19,7 +19,6 @@ import '../assert_dev_env.js';
19
19
  * @module
20
20
  */
21
21
  import { create_jsonrpc_error_response, create_jsonrpc_response, is_jsonrpc_error_response, is_jsonrpc_notification, is_jsonrpc_request, is_jsonrpc_response } from '../../http/jsonrpc_helpers.js';
22
- import { JSONRPC_VERSION } from '../../http/jsonrpc.js';
23
22
  // ---------------------------------------------------------------------
24
23
  // Predicates — compose with `WsClient.wait_for` and
25
24
  // `messages.filter(...)`. Both in-process and cross-process tests use
@@ -22,7 +22,7 @@
22
22
  const {
23
23
  columns,
24
24
  rows,
25
- row_key = 'id' as string & keyof T, // eslint-disable-line @typescript-eslint/no-duplicate-type-constituents
25
+ row_key = 'id',
26
26
  height,
27
27
  header,
28
28
  cell,
@@ -131,7 +131,7 @@
131
131
  {#if cell}
132
132
  {@render cell(column, row, row[column.key])}
133
133
  {:else if column.format}
134
- {column.format(row[column.key], row as any)}
134
+ {column.format(row[column.key], row)}
135
135
  {:else}
136
136
  {format_value(row[column.key])}
137
137
  {/if}
@@ -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,EACN,KAAK,gBAAgB,EAErB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,MAAM,2BAA2B,CAAC;AAGnC;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;;CAA8B,CAAC;AAE9D,qBAAa,SAAS;IACrB,SAAS,UAAqB;IAC9B,QAAQ,UAAqB;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAoB;IAC/C,OAAO,EAAE,cAAc,GAAG,IAAI,CAAoB;IAClD,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAoB;IAClD,WAAW,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAkB;IAC1D;;;;OAIG;IACH,QAAQ,CAAC,kBAAkB,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAEtD;IACF;;;;;;;;OAQG;IACH,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAExC;IACF,wFAAwF;IACxF,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAA+C;IAEzE,gEAAgE;IAChE,eAAe,UAAqB;IAEpC;;;;;;OAMG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAItC;;;;;;;;OAQG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BpC;;;;;;;OAOG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA0CjE;;;;;OAKG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiCpF;;;;;;;OAOG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA8ClF;;;;;OAKG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAW7B"}
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,EACN,KAAK,gBAAgB,EAErB,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,MAAM,2BAA2B,CAAC;AAGnC;;;GAGG;AACH,eAAO,MAAM,kBAAkB;;;;CAA8B,CAAC;AAE9D,qBAAa,SAAS;IACrB,SAAS,UAAqB;IAC9B,QAAQ,UAAqB;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAoB;IAC/C,OAAO,EAAE,cAAc,GAAG,IAAI,CAAoB;IAClD,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAAoB;IAClD,WAAW,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAAkB;IAC1D;;;;OAIG;IACH,QAAQ,CAAC,kBAAkB,EAAE,KAAK,CAAC,oBAAoB,CAAC,CAEtD;IACF;;;;;;;;OAQG;IACH,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAExC;IACF,wFAAwF;IACxF,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAA+C;IAEzE,gEAAgE;IAChE,eAAe,UAAqB;IAEpC;;;;;;OAMG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAItC;;;;;;;;OAQG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BpC;;;;;;;OAOG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA0CjE;;;;;OAKG;IACG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAiCpF;;;;;;;OAOG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA8ClF;;;;;OAKG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAe7B"}
@@ -268,7 +268,11 @@ export class AuthState {
268
268
  */
269
269
  async logout() {
270
270
  try {
271
- await ui_fetch('/api/account/logout', { method: 'POST' });
271
+ // the content type is required of every API POST, body or not
272
+ await ui_fetch('/api/account/logout', {
273
+ method: 'POST',
274
+ headers: { 'Content-Type': 'application/json' }
275
+ });
272
276
  }
273
277
  catch {
274
278
  // Best-effort — clear local state regardless
@@ -1 +1 @@
1
- {"version":3,"file":"ui_format.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/ui_format.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAChC,WAAW,MAAM,GAAG,MAAM,GAAG,IAAI,EACjC,MAAK,MAAmB,KACtB,MA2BF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,IAAI,MAAM,KAAG,MAY1C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,EAAE,YAAY,MAAM,EAAE,kBAAe,KAAG,MAOlF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,MAAmC,CAAC;AAEjF;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,MAS7C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,WAAW,MAAM,GAAG,MAAM,GAAG,IAAI,KAAG,MAOzE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GACjC,YAAY,MAAM,EAClB,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,KACtC,MAgEF,CAAC"}
1
+ {"version":3,"file":"ui_format.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/ui/ui_format.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAChC,WAAW,MAAM,GAAG,MAAM,GAAG,IAAI,EACjC,MAAK,MAAmB,KACtB,MA2BF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,IAAI,MAAM,KAAG,MAY1C,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,MAAM,EAAE,YAAY,MAAM,EAAE,kBAAe,KAAG,MAOlF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,MAAmC,CAAC;AAEjF;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,OAAO,KAAG,MAW7C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAAI,WAAW,MAAM,GAAG,MAAM,GAAG,IAAI,KAAG,MAOzE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GACjC,YAAY,MAAM,EAClB,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,KACtC,MAgEF,CAAC"}
@@ -104,6 +104,8 @@ export const format_value = (value) => {
104
104
  return String(value);
105
105
  if (typeof value === 'symbol')
106
106
  return value.toString();
107
+ // only functions reach here, whose source text is the intended display
108
+ // eslint-disable-next-line @typescript-eslint/no-base-to-string
107
109
  return String(value);
108
110
  };
109
111
  /**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fuzdev/fuz_app",
3
- "version": "0.130.0",
3
+ "version": "0.132.0",
4
4
  "description": "fullstack app library",
5
5
  "glyph": "🗝",
6
6
  "logo": "logo.svg",
@@ -40,7 +40,7 @@
40
40
  "@hono/node-server": ">=1",
41
41
  "@hono/node-ws": ">=1",
42
42
  "@node-rs/argon2": ">=2",
43
- "@sveltejs/kit": "^2",
43
+ "@sveltejs/kit": "^3",
44
44
  "esm-env": "^1",
45
45
  "hono": ">=4",
46
46
  "pg": ">=8",
@@ -84,25 +84,25 @@
84
84
  }
85
85
  },
86
86
  "devDependencies": {
87
- "@electric-sql/pglite": "^0.4.5",
87
+ "@electric-sql/pglite": "^0.5.8",
88
88
  "@fuzdev/blake3-wasm": "^0.2.0",
89
89
  "@fuzdev/fuz_code": "^0.50.0",
90
- "@fuzdev/fuz_css": "^0.65.3",
91
- "@fuzdev/fuz_ui": "^0.210.2",
92
- "@fuzdev/fuz_util": "^0.71.0",
93
- "@fuzdev/gro": "^0.213.0",
94
- "@fuzdev/mdz": "^0.3.0",
90
+ "@fuzdev/fuz_css": "^0.66.1",
91
+ "@fuzdev/fuz_ui": "^0.213.0",
92
+ "@fuzdev/fuz_util": "^0.72.0",
93
+ "@fuzdev/gro": "^0.214.0",
94
+ "@fuzdev/mdz": "^0.4.0",
95
95
  "@hono/bun": "^1.0.1",
96
96
  "@hono/deno": "^1.0.3",
97
97
  "@hono/node-server": "^1.19.14",
98
98
  "@hono/node-ws": "^1.3.1",
99
99
  "@node-rs/argon2": "^2.0.2",
100
- "@ryanatkn/eslint-config": "^0.12.2",
100
+ "@ryanatkn/eslint-config": "^0.13.0",
101
101
  "@sveltejs/acorn-typescript": "^1.0.9",
102
- "@sveltejs/adapter-static": "^3.0.10",
103
- "@sveltejs/kit": "^2.69.1",
104
- "@sveltejs/package": "^2.5.7",
105
- "@sveltejs/vite-plugin-svelte": "^6.2.4",
102
+ "@sveltejs/adapter-static": "^4.0.0",
103
+ "@sveltejs/kit": "^3.0.1",
104
+ "@sveltejs/package": "^3.0.0",
105
+ "@sveltejs/vite-plugin-svelte": "^7.3.1",
106
106
  "@types/estree": "^1.0.8",
107
107
  "@types/pg": "^8.18.0",
108
108
  "@types/ws": "^8.18.1",
@@ -114,14 +114,14 @@
114
114
  "jsdom": "^28.1.0",
115
115
  "magic-string": "^0.30.21",
116
116
  "pg": "^8.20.0",
117
- "svelte": "^5.56.4",
118
- "svelte-check": "^4.7.1",
119
- "svelte-docinfo": "^0.8.0",
117
+ "svelte": "^5.57.2",
118
+ "svelte-check": "^4.7.6",
119
+ "svelte-docinfo": "^0.8.1",
120
120
  "svelte2tsx": "^0.7.52",
121
121
  "tslib": "^2.8.1",
122
- "typescript": "^5.9.3",
123
- "typescript-eslint": "^8.57.0",
124
- "vite": "^7.3.1",
122
+ "typescript": "^6.0.3",
123
+ "typescript-eslint": "^8.71.1",
124
+ "vite": "^8.3.4",
125
125
  "vitest": "^5.0.0",
126
126
  "ws": "^8.20.1",
127
127
  "zimmerframe": "^1.1.4",