@fuzdev/fuz_app 0.53.0 → 0.55.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/CLAUDE.md +68 -13
- package/dist/actions/action_codegen.d.ts +13 -0
- package/dist/actions/action_codegen.d.ts.map +1 -1
- package/dist/actions/action_codegen.js +15 -1
- package/dist/actions/action_rpc.d.ts +60 -7
- package/dist/actions/action_rpc.d.ts.map +1 -1
- package/dist/actions/action_rpc.js +158 -44
- package/dist/actions/register_action_ws.d.ts +4 -4
- package/dist/actions/register_action_ws.js +6 -6
- package/dist/actions/register_ws_endpoint.d.ts +20 -7
- package/dist/actions/register_ws_endpoint.d.ts.map +1 -1
- package/dist/actions/register_ws_endpoint.js +30 -5
- package/dist/actions/transports.d.ts.map +1 -1
- package/dist/actions/transports.js +0 -4
- package/dist/auth/CLAUDE.md +230 -63
- package/dist/auth/account_actions.d.ts +6 -6
- package/dist/auth/account_actions.d.ts.map +1 -1
- package/dist/auth/account_actions.js +8 -11
- package/dist/auth/account_queries.d.ts +6 -3
- package/dist/auth/account_queries.d.ts.map +1 -1
- package/dist/auth/account_queries.js +14 -5
- package/dist/auth/account_routes.d.ts +7 -10
- package/dist/auth/account_routes.d.ts.map +1 -1
- package/dist/auth/account_routes.js +70 -23
- package/dist/auth/account_schema.d.ts +19 -0
- package/dist/auth/account_schema.d.ts.map +1 -1
- package/dist/auth/account_schema.js +20 -0
- package/dist/auth/admin_action_specs.d.ts +45 -11
- package/dist/auth/admin_action_specs.d.ts.map +1 -1
- package/dist/auth/admin_action_specs.js +23 -8
- package/dist/auth/admin_actions.d.ts +8 -7
- package/dist/auth/admin_actions.d.ts.map +1 -1
- package/dist/auth/admin_actions.js +11 -18
- package/dist/auth/audit_log_queries.d.ts +53 -14
- package/dist/auth/audit_log_queries.d.ts.map +1 -1
- package/dist/auth/audit_log_queries.js +45 -2
- package/dist/auth/audit_log_schema.d.ts +55 -1
- package/dist/auth/audit_log_schema.d.ts.map +1 -1
- package/dist/auth/audit_log_schema.js +19 -3
- package/dist/auth/bearer_auth.d.ts +9 -7
- package/dist/auth/bearer_auth.d.ts.map +1 -1
- package/dist/auth/bearer_auth.js +13 -21
- package/dist/auth/cleanup.d.ts.map +1 -1
- package/dist/auth/cleanup.js +5 -0
- package/dist/auth/daemon_token_middleware.d.ts +23 -11
- package/dist/auth/daemon_token_middleware.d.ts.map +1 -1
- package/dist/auth/daemon_token_middleware.js +26 -20
- package/dist/auth/deps.d.ts +14 -0
- package/dist/auth/deps.d.ts.map +1 -1
- package/dist/auth/middleware.d.ts.map +1 -1
- package/dist/auth/middleware.js +4 -2
- package/dist/auth/migrations.d.ts +15 -7
- package/dist/auth/migrations.d.ts.map +1 -1
- package/dist/auth/migrations.js +15 -7
- package/dist/auth/permit_offer_action_specs.d.ts +45 -6
- package/dist/auth/permit_offer_action_specs.d.ts.map +1 -1
- package/dist/auth/permit_offer_action_specs.js +38 -7
- package/dist/auth/permit_offer_actions.d.ts +2 -2
- package/dist/auth/permit_offer_actions.d.ts.map +1 -1
- package/dist/auth/permit_offer_actions.js +106 -95
- package/dist/auth/permit_offer_notifications.d.ts +10 -0
- package/dist/auth/permit_offer_notifications.d.ts.map +1 -1
- package/dist/auth/permit_offer_queries.d.ts +68 -9
- package/dist/auth/permit_offer_queries.d.ts.map +1 -1
- package/dist/auth/permit_offer_queries.js +147 -35
- package/dist/auth/permit_offer_schema.d.ts +23 -1
- package/dist/auth/permit_offer_schema.d.ts.map +1 -1
- package/dist/auth/permit_offer_schema.js +5 -0
- package/dist/auth/permit_queries.d.ts +17 -5
- package/dist/auth/permit_queries.d.ts.map +1 -1
- package/dist/auth/permit_queries.js +19 -8
- package/dist/auth/request_context.d.ts +360 -32
- package/dist/auth/request_context.d.ts.map +1 -1
- package/dist/auth/request_context.js +442 -60
- package/dist/auth/route_guards.d.ts +10 -4
- package/dist/auth/route_guards.d.ts.map +1 -1
- package/dist/auth/route_guards.js +14 -8
- package/dist/auth/self_service_role_action_specs.d.ts +2 -0
- package/dist/auth/self_service_role_action_specs.d.ts.map +1 -1
- package/dist/auth/self_service_role_action_specs.js +2 -0
- package/dist/auth/self_service_role_actions.d.ts +6 -5
- package/dist/auth/self_service_role_actions.d.ts.map +1 -1
- package/dist/auth/self_service_role_actions.js +32 -19
- package/dist/db/migrate.d.ts +11 -7
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +9 -6
- package/dist/dev/setup.d.ts.map +1 -1
- package/dist/dev/setup.js +5 -3
- package/dist/hono_context.d.ts +77 -0
- package/dist/hono_context.d.ts.map +1 -1
- package/dist/hono_context.js +50 -0
- package/dist/http/CLAUDE.md +80 -17
- package/dist/http/error_schemas.d.ts +92 -1
- package/dist/http/error_schemas.d.ts.map +1 -1
- package/dist/http/error_schemas.js +73 -16
- package/dist/http/jsonrpc_errors.d.ts +27 -2
- package/dist/http/jsonrpc_errors.d.ts.map +1 -1
- package/dist/http/jsonrpc_errors.js +26 -2
- package/dist/http/route_spec.d.ts +62 -4
- package/dist/http/route_spec.d.ts.map +1 -1
- package/dist/http/route_spec.js +117 -21
- package/dist/http/schema_helpers.d.ts +13 -1
- package/dist/http/schema_helpers.d.ts.map +1 -1
- package/dist/http/schema_helpers.js +21 -2
- package/dist/http/surface.d.ts +10 -1
- package/dist/http/surface.d.ts.map +1 -1
- package/dist/http/surface.js +2 -2
- package/dist/server/app_server.d.ts.map +1 -1
- package/dist/server/app_server.js +11 -1
- package/dist/testing/CLAUDE.md +23 -17
- package/dist/testing/admin_integration.d.ts.map +1 -1
- package/dist/testing/admin_integration.js +15 -13
- package/dist/testing/adversarial_headers.js +1 -1
- package/dist/testing/app_server.js +2 -2
- package/dist/testing/audit_completeness.d.ts.map +1 -1
- package/dist/testing/audit_completeness.js +21 -7
- package/dist/testing/auth_apps.d.ts.map +1 -1
- package/dist/testing/auth_apps.js +6 -3
- package/dist/testing/entities.d.ts +2 -1
- package/dist/testing/entities.d.ts.map +1 -1
- package/dist/testing/entities.js +1 -0
- package/dist/testing/integration_helpers.d.ts +4 -2
- package/dist/testing/integration_helpers.d.ts.map +1 -1
- package/dist/testing/integration_helpers.js +9 -5
- package/dist/testing/middleware.d.ts +12 -8
- package/dist/testing/middleware.d.ts.map +1 -1
- package/dist/testing/middleware.js +67 -25
- package/dist/testing/rpc_helpers.d.ts.map +1 -1
- package/dist/testing/rpc_helpers.js +3 -1
- package/dist/testing/schema_generators.d.ts.map +1 -1
- package/dist/testing/schema_generators.js +12 -0
- package/dist/testing/ws_round_trip.d.ts.map +1 -1
- package/dist/testing/ws_round_trip.js +5 -1
- package/dist/ui/CLAUDE.md +16 -10
- package/dist/ui/PermitOfferForm.svelte +14 -0
- package/dist/ui/PermitOfferForm.svelte.d.ts +6 -0
- package/dist/ui/PermitOfferForm.svelte.d.ts.map +1 -1
- package/dist/ui/admin_accounts_state.svelte.d.ts +8 -1
- package/dist/ui/admin_accounts_state.svelte.d.ts.map +1 -1
- package/dist/ui/admin_accounts_state.svelte.js +14 -3
- package/dist/ui/permit_offers_state.svelte.d.ts +9 -1
- package/dist/ui/permit_offers_state.svelte.d.ts.map +1 -1
- package/dist/ui/permit_offers_state.svelte.js +7 -1
- package/package.json +1 -1
|
@@ -41,6 +41,39 @@ export declare const ERROR_BEARER_REJECTED_BROWSER: "bearer_token_rejected_in_br
|
|
|
41
41
|
export declare const ERROR_INVALID_TOKEN: "invalid_token";
|
|
42
42
|
/** Token references a deleted account. */
|
|
43
43
|
export declare const ERROR_ACCOUNT_NOT_FOUND: "account_not_found";
|
|
44
|
+
/**
|
|
45
|
+
* Multi-actor account requires the request to carry an explicit `acting`
|
|
46
|
+
* field naming the actor the request is acting as, so the dispatcher's
|
|
47
|
+
* authorization phase doesn't pick a default actor silently. Returned
|
|
48
|
+
* with the available actors so the client can prompt.
|
|
49
|
+
*/
|
|
50
|
+
export declare const ERROR_ACTOR_REQUIRED: "actor_required";
|
|
51
|
+
/**
|
|
52
|
+
* Supplied `acting` field does not name an actor on the authenticated
|
|
53
|
+
* account.
|
|
54
|
+
*/
|
|
55
|
+
export declare const ERROR_ACTOR_NOT_ON_ACCOUNT: "actor_not_on_account";
|
|
56
|
+
/**
|
|
57
|
+
* Authenticated account exists but has no actors. Server invariant
|
|
58
|
+
* violation — signup / bootstrap always create an actor in the same
|
|
59
|
+
* transaction. Surfaced from the dispatcher's authorization phase as a
|
|
60
|
+
* 500 so the operator sees the corruption signal rather than a confusing
|
|
61
|
+
* 4xx. Distinct from `ERROR_ACCOUNT_VANISHED`: the actor list was
|
|
62
|
+
* enumerated successfully and came back empty.
|
|
63
|
+
*/
|
|
64
|
+
export declare const ERROR_NO_ACTORS_ON_ACCOUNT: "no_actors_on_account";
|
|
65
|
+
/**
|
|
66
|
+
* Authentication validated an account, but a follow-up read in the
|
|
67
|
+
* authorization phase came back null — the account or its named actor
|
|
68
|
+
* row was deleted between the credential check and the dispatcher's
|
|
69
|
+
* `build_request_context` / `build_account_context` step. Torn read,
|
|
70
|
+
* not a missing-actor invariant violation. Surfaced as 500 so the
|
|
71
|
+
* operator sees the race signal; clients can retry. Distinct from
|
|
72
|
+
* `ERROR_ACCOUNT_NOT_FOUND` (stale token referencing a long-deleted
|
|
73
|
+
* account, raised at credential validation) and
|
|
74
|
+
* `ERROR_NO_ACTORS_ON_ACCOUNT` (the actor list enumerated empty).
|
|
75
|
+
*/
|
|
76
|
+
export declare const ERROR_ACCOUNT_VANISHED: "account_vanished";
|
|
44
77
|
/** Keeper routes require daemon_token credential type. */
|
|
45
78
|
export declare const ERROR_KEEPER_REQUIRES_DAEMON_TOKEN: "keeper_requires_daemon_token";
|
|
46
79
|
/** Daemon token header present but malformed or not matching current/previous token. */
|
|
@@ -132,6 +165,44 @@ export declare const ForeignKeyError: z.ZodObject<{
|
|
|
132
165
|
error: z.ZodLiteral<"foreign_key_violation">;
|
|
133
166
|
}, z.core.$loose>;
|
|
134
167
|
export type ForeignKeyError = z.infer<typeof ForeignKeyError>;
|
|
168
|
+
/**
|
|
169
|
+
* Authorization-phase failure shapes. Surfaced when the dispatcher's
|
|
170
|
+
* `apply_authorization_phase` rejects a request before the handler runs —
|
|
171
|
+
* the route is acting-aware (input declares `acting?: ActingActor` or
|
|
172
|
+
* auth requires permits), but actor resolution failed.
|
|
173
|
+
*
|
|
174
|
+
* 400: `actor_required` (with `available[]`) for unspecified-actor on
|
|
175
|
+
* a multi-actor account; `actor_not_on_account` for a supplied actor
|
|
176
|
+
* id that doesn't belong to the authenticated account.
|
|
177
|
+
*
|
|
178
|
+
* 500: `no_actors_on_account` for a signup-invariant violation (the
|
|
179
|
+
* actor list enumerated empty); `account_vanished` for a torn-read
|
|
180
|
+
* race (account/actor row deleted between credential validation and
|
|
181
|
+
* the dispatcher's follow-up read).
|
|
182
|
+
*
|
|
183
|
+
* Used by `derive_error_schemas` when `acting_aware` is true so the
|
|
184
|
+
* merged error surface matches what the dispatcher actually emits.
|
|
185
|
+
*/
|
|
186
|
+
export declare const ActorRequiredError: z.ZodObject<{
|
|
187
|
+
error: z.ZodLiteral<"actor_required">;
|
|
188
|
+
available: z.ZodArray<z.ZodObject<{
|
|
189
|
+
id: z.ZodString;
|
|
190
|
+
name: z.ZodString;
|
|
191
|
+
}, z.core.$loose>>;
|
|
192
|
+
}, z.core.$loose>;
|
|
193
|
+
export type ActorRequiredError = z.infer<typeof ActorRequiredError>;
|
|
194
|
+
export declare const ActorNotOnAccountError: z.ZodObject<{
|
|
195
|
+
error: z.ZodLiteral<"actor_not_on_account">;
|
|
196
|
+
}, z.core.$loose>;
|
|
197
|
+
export type ActorNotOnAccountError = z.infer<typeof ActorNotOnAccountError>;
|
|
198
|
+
export declare const NoActorsOnAccountError: z.ZodObject<{
|
|
199
|
+
error: z.ZodLiteral<"no_actors_on_account">;
|
|
200
|
+
}, z.core.$loose>;
|
|
201
|
+
export type NoActorsOnAccountError = z.infer<typeof NoActorsOnAccountError>;
|
|
202
|
+
export declare const AccountVanishedError: z.ZodObject<{
|
|
203
|
+
error: z.ZodLiteral<"account_vanished">;
|
|
204
|
+
}, z.core.$loose>;
|
|
205
|
+
export type AccountVanishedError = z.infer<typeof AccountVanishedError>;
|
|
135
206
|
/**
|
|
136
207
|
* Error schema map — maps HTTP status codes to Zod schemas.
|
|
137
208
|
*
|
|
@@ -167,6 +238,26 @@ export type RateLimitKey = z.infer<typeof RateLimitKey>;
|
|
|
167
238
|
* - **auth: role**: 401 + 403 (with `required_role`)
|
|
168
239
|
* - **auth: keeper**: 401 + 403 (keeper-specific)
|
|
169
240
|
* - **rate_limit**: 429 (rate limit exceeded with `retry_after`)
|
|
241
|
+
* - **acting_aware**: extends 400 with `ActorRequiredError` / `ActorNotOnAccountError`
|
|
242
|
+
* and adds 500 union of `NoActorsOnAccountError` / `AccountVanishedError`. The
|
|
243
|
+
* dispatcher's authorization phase emits these on routes whose input declares
|
|
244
|
+
* `acting?: ActingActor` or whose auth requires permits (`role` / `keeper`); the
|
|
245
|
+
* route's surface must reflect them so DEV-mode error-schema validation in
|
|
246
|
+
* `wrap_output_validation` doesn't fail when the auth phase fires before the
|
|
247
|
+
* handler. See `http/CLAUDE.md` § Three-layer error-schema merge.
|
|
248
|
+
*
|
|
249
|
+
* `acting_aware` is computed at the merge call site (it requires inspecting
|
|
250
|
+
* the input schema for `acting?: ActingActor`, which lives in `auth/`). This
|
|
251
|
+
* keeps `http/` auth-agnostic — the per-route flag flows in via the optional
|
|
252
|
+
* `is_acting_aware` callback on `apply_route_specs` / `generate_app_surface`.
|
|
170
253
|
*/
|
|
171
|
-
export
|
|
254
|
+
export interface DeriveErrorSchemasOptions {
|
|
255
|
+
auth: RouteAuth;
|
|
256
|
+
has_input?: boolean;
|
|
257
|
+
has_params?: boolean;
|
|
258
|
+
has_query?: boolean;
|
|
259
|
+
rate_limit?: RateLimitKey;
|
|
260
|
+
acting_aware?: boolean;
|
|
261
|
+
}
|
|
262
|
+
export declare const derive_error_schemas: ({ auth, has_input, has_params, has_query, rate_limit, acting_aware, }: DeriveErrorSchemasOptions) => RouteErrorSchemas;
|
|
172
263
|
//# sourceMappingURL=error_schemas.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error_schemas.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/http/error_schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAEtB,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAI/C,0CAA0C;AAC1C,eAAO,MAAM,0BAA0B,EAAG,sBAA+B,CAAC;AAE1E,uDAAuD;AACvD,eAAO,MAAM,uBAAuB,EAAG,mBAA4B,CAAC;AAEpE,6CAA6C;AAC7C,eAAO,MAAM,0BAA0B,EAAG,sBAA+B,CAAC;AAE1E,8CAA8C;AAC9C,eAAO,MAAM,0BAA0B,EAAG,sBAA+B,CAAC;AAI1E,wCAAwC;AACxC,eAAO,MAAM,6BAA6B,EAAG,yBAAkC,CAAC;AAEhF,+CAA+C;AAC/C,eAAO,MAAM,8BAA8B,EAAG,0BAAmC,CAAC;AAElF,yCAAyC;AACzC,eAAO,MAAM,yBAAyB,EAAG,qBAA8B,CAAC;AAExE,sFAAsF;AACtF,eAAO,MAAM,yBAAyB,EAAG,qBAA8B,CAAC;AAExE,qDAAqD;AACrD,eAAO,MAAM,uBAAuB,EAAG,mBAA4B,CAAC;AAIpE,uCAAuC;AACvC,eAAO,MAAM,sBAAsB,EAAG,kBAA2B,CAAC;AAElE,wCAAwC;AACxC,eAAO,MAAM,uBAAuB,EAAG,mBAA4B,CAAC;AAEpE,sEAAsE;AACtE,eAAO,MAAM,6BAA6B,EAAG,0CAAmD,CAAC;AAEjG,uEAAuE;AACvE,eAAO,MAAM,mBAAmB,EAAG,eAAwB,CAAC;AAE5D,0CAA0C;AAC1C,eAAO,MAAM,uBAAuB,EAAG,mBAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"error_schemas.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/http/error_schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,6 +43,39 @@ export const ERROR_BEARER_REJECTED_BROWSER = 'bearer_token_rejected_in_browser_c
|
|
|
43
43
|
export const ERROR_INVALID_TOKEN = 'invalid_token';
|
|
44
44
|
/** Token references a deleted account. */
|
|
45
45
|
export const ERROR_ACCOUNT_NOT_FOUND = 'account_not_found';
|
|
46
|
+
/**
|
|
47
|
+
* Multi-actor account requires the request to carry an explicit `acting`
|
|
48
|
+
* field naming the actor the request is acting as, so the dispatcher's
|
|
49
|
+
* authorization phase doesn't pick a default actor silently. Returned
|
|
50
|
+
* with the available actors so the client can prompt.
|
|
51
|
+
*/
|
|
52
|
+
export const ERROR_ACTOR_REQUIRED = 'actor_required';
|
|
53
|
+
/**
|
|
54
|
+
* Supplied `acting` field does not name an actor on the authenticated
|
|
55
|
+
* account.
|
|
56
|
+
*/
|
|
57
|
+
export const ERROR_ACTOR_NOT_ON_ACCOUNT = 'actor_not_on_account';
|
|
58
|
+
/**
|
|
59
|
+
* Authenticated account exists but has no actors. Server invariant
|
|
60
|
+
* violation — signup / bootstrap always create an actor in the same
|
|
61
|
+
* transaction. Surfaced from the dispatcher's authorization phase as a
|
|
62
|
+
* 500 so the operator sees the corruption signal rather than a confusing
|
|
63
|
+
* 4xx. Distinct from `ERROR_ACCOUNT_VANISHED`: the actor list was
|
|
64
|
+
* enumerated successfully and came back empty.
|
|
65
|
+
*/
|
|
66
|
+
export const ERROR_NO_ACTORS_ON_ACCOUNT = 'no_actors_on_account';
|
|
67
|
+
/**
|
|
68
|
+
* Authentication validated an account, but a follow-up read in the
|
|
69
|
+
* authorization phase came back null — the account or its named actor
|
|
70
|
+
* row was deleted between the credential check and the dispatcher's
|
|
71
|
+
* `build_request_context` / `build_account_context` step. Torn read,
|
|
72
|
+
* not a missing-actor invariant violation. Surfaced as 500 so the
|
|
73
|
+
* operator sees the race signal; clients can retry. Distinct from
|
|
74
|
+
* `ERROR_ACCOUNT_NOT_FOUND` (stale token referencing a long-deleted
|
|
75
|
+
* account, raised at credential validation) and
|
|
76
|
+
* `ERROR_NO_ACTORS_ON_ACCOUNT` (the actor list enumerated empty).
|
|
77
|
+
*/
|
|
78
|
+
export const ERROR_ACCOUNT_VANISHED = 'account_vanished';
|
|
46
79
|
// --- Keeper / daemon token ---
|
|
47
80
|
/** Keeper routes require daemon_token credential type. */
|
|
48
81
|
export const ERROR_KEEPER_REQUIRES_DAEMON_TOKEN = 'keeper_requires_daemon_token';
|
|
@@ -132,6 +165,37 @@ export const PayloadTooLargeError = z.looseObject({
|
|
|
132
165
|
export const ForeignKeyError = z.looseObject({
|
|
133
166
|
error: z.literal(ERROR_FOREIGN_KEY_VIOLATION),
|
|
134
167
|
});
|
|
168
|
+
/**
|
|
169
|
+
* Authorization-phase failure shapes. Surfaced when the dispatcher's
|
|
170
|
+
* `apply_authorization_phase` rejects a request before the handler runs —
|
|
171
|
+
* the route is acting-aware (input declares `acting?: ActingActor` or
|
|
172
|
+
* auth requires permits), but actor resolution failed.
|
|
173
|
+
*
|
|
174
|
+
* 400: `actor_required` (with `available[]`) for unspecified-actor on
|
|
175
|
+
* a multi-actor account; `actor_not_on_account` for a supplied actor
|
|
176
|
+
* id that doesn't belong to the authenticated account.
|
|
177
|
+
*
|
|
178
|
+
* 500: `no_actors_on_account` for a signup-invariant violation (the
|
|
179
|
+
* actor list enumerated empty); `account_vanished` for a torn-read
|
|
180
|
+
* race (account/actor row deleted between credential validation and
|
|
181
|
+
* the dispatcher's follow-up read).
|
|
182
|
+
*
|
|
183
|
+
* Used by `derive_error_schemas` when `acting_aware` is true so the
|
|
184
|
+
* merged error surface matches what the dispatcher actually emits.
|
|
185
|
+
*/
|
|
186
|
+
export const ActorRequiredError = z.looseObject({
|
|
187
|
+
error: z.literal(ERROR_ACTOR_REQUIRED),
|
|
188
|
+
available: z.array(z.looseObject({ id: z.string(), name: z.string() })),
|
|
189
|
+
});
|
|
190
|
+
export const ActorNotOnAccountError = z.looseObject({
|
|
191
|
+
error: z.literal(ERROR_ACTOR_NOT_ON_ACCOUNT),
|
|
192
|
+
});
|
|
193
|
+
export const NoActorsOnAccountError = z.looseObject({
|
|
194
|
+
error: z.literal(ERROR_NO_ACTORS_ON_ACCOUNT),
|
|
195
|
+
});
|
|
196
|
+
export const AccountVanishedError = z.looseObject({
|
|
197
|
+
error: z.literal(ERROR_ACCOUNT_VANISHED),
|
|
198
|
+
});
|
|
135
199
|
/**
|
|
136
200
|
* Rate limit key type — declares what a route or RPC action's rate limiter
|
|
137
201
|
* is keyed on.
|
|
@@ -143,23 +207,16 @@ export const ForeignKeyError = z.looseObject({
|
|
|
143
207
|
* - `'both'` — both keys.
|
|
144
208
|
*/
|
|
145
209
|
export const RateLimitKey = z.enum(['ip', 'account', 'both']);
|
|
146
|
-
|
|
147
|
-
* Derive error schemas from a route's auth requirement, input schema, and rate limit config.
|
|
148
|
-
*
|
|
149
|
-
* Returns the error schemas that middleware will auto-produce for this route.
|
|
150
|
-
* Route handlers can declare additional error schemas via `RouteSpec.errors`;
|
|
151
|
-
* explicit entries override auto-derived ones for the same status code.
|
|
152
|
-
*
|
|
153
|
-
* Derivation rules:
|
|
154
|
-
* - **Has input schema** (non-null) or **has params schema** or **has query schema**: 400 (validation error with issues)
|
|
155
|
-
* - **auth: authenticated**: 401
|
|
156
|
-
* - **auth: role**: 401 + 403 (with `required_role`)
|
|
157
|
-
* - **auth: keeper**: 401 + 403 (keeper-specific)
|
|
158
|
-
* - **rate_limit**: 429 (rate limit exceeded with `retry_after`)
|
|
159
|
-
*/
|
|
160
|
-
export const derive_error_schemas = (auth, has_input, has_params = false, has_query = false, rate_limit) => {
|
|
210
|
+
export const derive_error_schemas = ({ auth, has_input = false, has_params = false, has_query = false, rate_limit, acting_aware = false, }) => {
|
|
161
211
|
const errors = {};
|
|
162
|
-
|
|
212
|
+
const has_validation = has_input || has_params || has_query;
|
|
213
|
+
if (acting_aware) {
|
|
214
|
+
errors[400] = has_validation
|
|
215
|
+
? z.union([ValidationError, ActorRequiredError, ActorNotOnAccountError])
|
|
216
|
+
: z.union([ActorRequiredError, ActorNotOnAccountError]);
|
|
217
|
+
errors[500] = z.union([NoActorsOnAccountError, AccountVanishedError]);
|
|
218
|
+
}
|
|
219
|
+
else if (has_validation) {
|
|
163
220
|
errors[400] = ValidationError;
|
|
164
221
|
}
|
|
165
222
|
switch (auth.type) {
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
*
|
|
17
17
|
* @module
|
|
18
18
|
*/
|
|
19
|
+
import type { ContentfulStatusCode } from 'hono/utils/http-status';
|
|
19
20
|
import { type JsonrpcErrorCode, type JsonrpcErrorObject } from './jsonrpc.js';
|
|
20
21
|
/** Default message for unknown errors. */
|
|
21
22
|
export declare const UNKNOWN_ERROR_MESSAGE = "unknown error";
|
|
@@ -97,13 +98,37 @@ export declare const HTTP_STATUS_TO_JSONRPC_ERROR_CODE: Record<number, JsonrpcEr
|
|
|
97
98
|
* Map a JSON-RPC error code to an HTTP status code.
|
|
98
99
|
*
|
|
99
100
|
* Returns 500 for unrecognized codes (consumer-defined codes
|
|
100
|
-
* without a mapping default to internal server error).
|
|
101
|
+
* without a mapping default to internal server error). The return
|
|
102
|
+
* is narrowed to Hono's `ContentfulStatusCode` so call sites can
|
|
103
|
+
* pass the result to `c.json(body, status)` without `as any` —
|
|
104
|
+
* 499 (nginx "client closed request") is non-standard and gets
|
|
105
|
+
* absorbed by the cast here rather than at every dispatcher branch.
|
|
101
106
|
*/
|
|
102
|
-
export declare const jsonrpc_error_code_to_http_status: (code: JsonrpcErrorCode) =>
|
|
107
|
+
export declare const jsonrpc_error_code_to_http_status: (code: JsonrpcErrorCode) => ContentfulStatusCode;
|
|
103
108
|
/**
|
|
104
109
|
* Map an HTTP status code to a JSON-RPC error code.
|
|
105
110
|
*
|
|
106
111
|
* Returns `internal_error` (-32603) for unrecognized status codes.
|
|
107
112
|
*/
|
|
108
113
|
export declare const http_status_to_jsonrpc_error_code: (status: number) => JsonrpcErrorCode;
|
|
114
|
+
/**
|
|
115
|
+
* Reverse map of `JSONRPC_ERROR_CODES` — JSON-RPC error code → name.
|
|
116
|
+
*
|
|
117
|
+
* Used by REST emitters that need a stable string identifier for the
|
|
118
|
+
* code in their flat-shape error body (`{error: '<name>', ...}`)
|
|
119
|
+
* without inventing a separate vocabulary. Built once at module load
|
|
120
|
+
* from the canonical `JSONRPC_ERROR_CODES` map so the two cannot drift.
|
|
121
|
+
*
|
|
122
|
+
* Consumer-defined codes outside the standard taxonomy are not present;
|
|
123
|
+
* `jsonrpc_error_code_to_name` falls back to `'internal_error'` so the
|
|
124
|
+
* REST shape always carries some reason rather than `undefined`.
|
|
125
|
+
*/
|
|
126
|
+
export declare const JSONRPC_ERROR_CODE_TO_NAME: Readonly<Record<number, JsonrpcErrorName>>;
|
|
127
|
+
/**
|
|
128
|
+
* Map a JSON-RPC error code to its canonical name (`'not_found'`,
|
|
129
|
+
* `'forbidden'`, etc.). Falls back to `'internal_error'` for codes
|
|
130
|
+
* outside the standard taxonomy so REST emitters that read this for
|
|
131
|
+
* their `error` field always have a stable string to emit.
|
|
132
|
+
*/
|
|
133
|
+
export declare const jsonrpc_error_code_to_name: (code: JsonrpcErrorCode) => JsonrpcErrorName;
|
|
109
134
|
//# sourceMappingURL=jsonrpc_errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonrpc_errors.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/http/jsonrpc_errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAMN,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,MAAM,cAAc,CAAC;AAEtB,0CAA0C;AAC1C,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AAErD,sEAAsE;AACtE,MAAM,MAAM,gBAAgB,GACzB,aAAa,GACb,iBAAiB,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,gBAAgB,GAChB,iBAAiB,GACjB,WAAW,GACX,WAAW,GACX,UAAU,GACV,kBAAkB,GAClB,cAAc,GACd,qBAAqB,GACrB,SAAS,GACT,gBAAgB,GAChB,mBAAmB,CAAC;AAEvB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,EA0C1B,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAE3D;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,EAmG7B,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,kBAAkB,CAAC,CAAC,CAAC;AAEtF;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;gBAEH,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,YAAY;CAK3F;AAWD;;;;GAIG;AACH,eAAO,MAAM,cAAc;8CAXQ,kBAAkB;kDAAlB,kBAAkB;mDAAlB,kBAAkB;iDAAlB,kBAAkB;iDAAlB,kBAAkB;kDAAlB,kBAAkB;4CAAlB,kBAAkB;4CAAlB,kBAAkB;2CAAlB,kBAAkB;mDAAlB,kBAAkB;+CAAlB,kBAAkB;sDAAlB,kBAAkB;0CAAlB,kBAAkB;iDAAlB,kBAAkB;oDAAlB,kBAAkB;CA2BqC,CAAC;AAI3F;;;;;;;GAOG;AACH,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAkBpE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAMzC,CAAC;AAEvC
|
|
1
|
+
{"version":3,"file":"jsonrpc_errors.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/http/jsonrpc_errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,wBAAwB,CAAC;AAEjE,OAAO,EAMN,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,MAAM,cAAc,CAAC;AAEtB,0CAA0C;AAC1C,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AAErD,sEAAsE;AACtE,MAAM,MAAM,gBAAgB,GACzB,aAAa,GACb,iBAAiB,GACjB,kBAAkB,GAClB,gBAAgB,GAChB,gBAAgB,GAChB,iBAAiB,GACjB,WAAW,GACX,WAAW,GACX,UAAU,GACV,kBAAkB,GAClB,cAAc,GACd,qBAAqB,GACrB,SAAS,GACT,gBAAgB,GAChB,mBAAmB,CAAC;AAEvB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,EA0C1B,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAE3D;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,EAmG7B,QAAQ,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,kBAAkB,CAAC,CAAC,CAAC;AAEtF;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC5C,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,CAAC,EAAE,OAAO,CAAC;gBAEH,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,YAAY;CAK3F;AAWD;;;;GAIG;AACH,eAAO,MAAM,cAAc;8CAXQ,kBAAkB;kDAAlB,kBAAkB;mDAAlB,kBAAkB;iDAAlB,kBAAkB;iDAAlB,kBAAkB;kDAAlB,kBAAkB;4CAAlB,kBAAkB;4CAAlB,kBAAkB;2CAAlB,kBAAkB;mDAAlB,kBAAkB;+CAAlB,kBAAkB;sDAAlB,kBAAkB;0CAAlB,kBAAkB;iDAAlB,kBAAkB;oDAAlB,kBAAkB;CA2BqC,CAAC;AAI3F;;;;;;;GAOG;AACH,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAkBpE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAMzC,CAAC;AAEvC;;;;;;;;;GASG;AACH,eAAO,MAAM,iCAAiC,GAAI,MAAM,gBAAgB,KAAG,oBACQ,CAAC;AAEpF;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,GAAI,QAAQ,MAAM,KAAG,gBACa,CAAC;AAEjF;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAMjF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,GAAI,MAAM,gBAAgB,KAAG,gBACL,CAAC"}
|
|
@@ -242,12 +242,36 @@ export const HTTP_STATUS_TO_JSONRPC_ERROR_CODE = Object.fromEntries(Object.entri
|
|
|
242
242
|
* Map a JSON-RPC error code to an HTTP status code.
|
|
243
243
|
*
|
|
244
244
|
* Returns 500 for unrecognized codes (consumer-defined codes
|
|
245
|
-
* without a mapping default to internal server error).
|
|
245
|
+
* without a mapping default to internal server error). The return
|
|
246
|
+
* is narrowed to Hono's `ContentfulStatusCode` so call sites can
|
|
247
|
+
* pass the result to `c.json(body, status)` without `as any` —
|
|
248
|
+
* 499 (nginx "client closed request") is non-standard and gets
|
|
249
|
+
* absorbed by the cast here rather than at every dispatcher branch.
|
|
246
250
|
*/
|
|
247
|
-
export const jsonrpc_error_code_to_http_status = (code) => JSONRPC_ERROR_CODE_TO_HTTP_STATUS[code] ?? 500;
|
|
251
|
+
export const jsonrpc_error_code_to_http_status = (code) => (JSONRPC_ERROR_CODE_TO_HTTP_STATUS[code] ?? 500);
|
|
248
252
|
/**
|
|
249
253
|
* Map an HTTP status code to a JSON-RPC error code.
|
|
250
254
|
*
|
|
251
255
|
* Returns `internal_error` (-32603) for unrecognized status codes.
|
|
252
256
|
*/
|
|
253
257
|
export const http_status_to_jsonrpc_error_code = (status) => HTTP_STATUS_TO_JSONRPC_ERROR_CODE[status] ?? JSONRPC_ERROR_CODES.internal_error;
|
|
258
|
+
/**
|
|
259
|
+
* Reverse map of `JSONRPC_ERROR_CODES` — JSON-RPC error code → name.
|
|
260
|
+
*
|
|
261
|
+
* Used by REST emitters that need a stable string identifier for the
|
|
262
|
+
* code in their flat-shape error body (`{error: '<name>', ...}`)
|
|
263
|
+
* without inventing a separate vocabulary. Built once at module load
|
|
264
|
+
* from the canonical `JSONRPC_ERROR_CODES` map so the two cannot drift.
|
|
265
|
+
*
|
|
266
|
+
* Consumer-defined codes outside the standard taxonomy are not present;
|
|
267
|
+
* `jsonrpc_error_code_to_name` falls back to `'internal_error'` so the
|
|
268
|
+
* REST shape always carries some reason rather than `undefined`.
|
|
269
|
+
*/
|
|
270
|
+
export const JSONRPC_ERROR_CODE_TO_NAME = Object.freeze(Object.fromEntries(Object.entries(JSONRPC_ERROR_CODES).map(([name, code]) => [code, name])));
|
|
271
|
+
/**
|
|
272
|
+
* Map a JSON-RPC error code to its canonical name (`'not_found'`,
|
|
273
|
+
* `'forbidden'`, etc.). Falls back to `'internal_error'` for codes
|
|
274
|
+
* outside the standard taxonomy so REST emitters that read this for
|
|
275
|
+
* their `error` field always have a stable string to emit.
|
|
276
|
+
*/
|
|
277
|
+
export const jsonrpc_error_code_to_name = (code) => JSONRPC_ERROR_CODE_TO_NAME[code] ?? 'internal_error';
|
|
@@ -34,6 +34,19 @@ export type RouteAuth = {
|
|
|
34
34
|
} | {
|
|
35
35
|
type: 'keeper';
|
|
36
36
|
};
|
|
37
|
+
/**
|
|
38
|
+
* Two-phase auth guard set returned by `AuthGuardResolver`.
|
|
39
|
+
*
|
|
40
|
+
* `pre_validation` runs before input validation — 401 checks live here
|
|
41
|
+
* so unauthenticated callers never see route-shape information from
|
|
42
|
+
* input parsing failures. `post_authorization` runs after the
|
|
43
|
+
* authorization phase has populated `RequestContext` — role / keeper
|
|
44
|
+
* checks live here because they read `c.var.request_context.permits`.
|
|
45
|
+
*/
|
|
46
|
+
export interface AuthGuards {
|
|
47
|
+
pre_validation: Array<MiddlewareHandler>;
|
|
48
|
+
post_authorization: Array<MiddlewareHandler>;
|
|
49
|
+
}
|
|
37
50
|
/**
|
|
38
51
|
* Resolves a `RouteAuth` to middleware guard handlers.
|
|
39
52
|
*
|
|
@@ -41,7 +54,37 @@ export type RouteAuth = {
|
|
|
41
54
|
* from auth-specific middleware. See `fuz_auth_guard_resolver` in
|
|
42
55
|
* `auth/route_guards.ts` for the standard implementation.
|
|
43
56
|
*/
|
|
44
|
-
export type AuthGuardResolver = (auth: RouteAuth) =>
|
|
57
|
+
export type AuthGuardResolver = (auth: RouteAuth) => AuthGuards;
|
|
58
|
+
/**
|
|
59
|
+
* Per-route authorization phase. Runs after the pre-validation auth guards
|
|
60
|
+
* and before input validation; resolves the acting actor (when the route's
|
|
61
|
+
* input declares `acting?: ActingActor` or auth requires permits) and sets
|
|
62
|
+
* the request context on the Hono context. Per-route order in
|
|
63
|
+
* `apply_route_specs`: params → query → pre-validation auth (401) →
|
|
64
|
+
* authorization → post-authorization auth (403) → input validation →
|
|
65
|
+
* handler.
|
|
66
|
+
*
|
|
67
|
+
* Returns a `Response` to short-circuit (resolution failure → 400 / 500),
|
|
68
|
+
* or `void` to continue. The http framework stays auth-agnostic — fuz_app
|
|
69
|
+
* provides the implementation via `create_fuz_authorization_handler` in
|
|
70
|
+
* `auth/request_context.ts`.
|
|
71
|
+
*/
|
|
72
|
+
export type AuthorizationHandler = (c: Context, spec: RouteSpec) => Promise<Response | void>;
|
|
73
|
+
/**
|
|
74
|
+
* Predicate that decides whether a route is "acting-aware" — i.e. whether
|
|
75
|
+
* the dispatcher's authorization phase may emit `actor_required` /
|
|
76
|
+
* `actor_not_on_account` (400) or `no_actors_on_account` /
|
|
77
|
+
* `account_vanished` (500) on this spec. When the predicate returns true
|
|
78
|
+
* the merged error schema is widened to accept those shapes so DEV-mode
|
|
79
|
+
* `wrap_output_validation` doesn't reject them.
|
|
80
|
+
*
|
|
81
|
+
* Computed at the call site because the canonical "input declares
|
|
82
|
+
* `acting?: ActingActor`" check lives in `auth/request_context.ts` (it
|
|
83
|
+
* uses reference equality with the canonical `ActingActor` schema). The
|
|
84
|
+
* `http/` framework receives the predicate via this callback so it stays
|
|
85
|
+
* auth-agnostic. See `http/CLAUDE.md` § Three-layer error-schema merge.
|
|
86
|
+
*/
|
|
87
|
+
export type IsActingAware = (spec: Pick<RouteSpec, 'auth' | 'input'>) => boolean;
|
|
45
88
|
/** HTTP methods supported by route specs. */
|
|
46
89
|
export type RouteMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
|
|
47
90
|
/**
|
|
@@ -153,8 +196,22 @@ export declare const apply_middleware_specs: (app: Hono, specs: Array<Middleware
|
|
|
153
196
|
*
|
|
154
197
|
* For each spec: resolves auth to guards via the provided resolver,
|
|
155
198
|
* adds input validation middleware (for routes with non-null input schemas),
|
|
156
|
-
*
|
|
157
|
-
*
|
|
199
|
+
* runs the optional authorization phase to resolve the acting actor + build
|
|
200
|
+
* the request context, wraps handler with DEV-only output and error
|
|
201
|
+
* validation, wraps with error catch layer (catches `ThrownJsonrpcError`
|
|
202
|
+
* and generic errors), and registers the route.
|
|
203
|
+
*
|
|
204
|
+
* Per-route middleware order: params → query → pre-validation auth
|
|
205
|
+
* guards (401) → authorization phase → post-authorization auth guards
|
|
206
|
+
* (403) → input validation → handler. The 401 check runs before any
|
|
207
|
+
* body parsing so unauthenticated callers never see route-shape
|
|
208
|
+
* information from parse failures. The authorization phase runs before
|
|
209
|
+
* input validation (matches the RPC dispatcher's order) so role /
|
|
210
|
+
* keeper denials surface 403 before 400 invalid_params; it extracts
|
|
211
|
+
* `acting` from raw query (GET) or pre-parsed JSON body (POST/PUT/...)
|
|
212
|
+
* — Hono caches the parsed body internally so the subsequent input-
|
|
213
|
+
* validation step does not re-parse. The role / keeper guards consume
|
|
214
|
+
* the `RequestContext` populated by the authorization phase.
|
|
158
215
|
*
|
|
159
216
|
* Each handler receives a `RouteContext` with:
|
|
160
217
|
* - `db`: transaction-scoped (for non-GET) or pool-level (for GET)
|
|
@@ -162,11 +219,12 @@ export declare const apply_middleware_specs: (app: Hono, specs: Array<Middleware
|
|
|
162
219
|
* - `pending_effects`: fire-and-forget effect queue
|
|
163
220
|
*
|
|
164
221
|
* @param resolve_auth_guards - maps `RouteAuth` to middleware — use `fuz_auth_guard_resolver` from `auth/route_guards.ts`
|
|
222
|
+
* @param authorize - optional authorization phase; runs between guards and input validation
|
|
165
223
|
* @param db - used for transaction wrapping and `RouteContext`
|
|
166
224
|
* @mutates `app`
|
|
167
225
|
* @throws Error if two specs share the same `method` + `path` (each combination must be unique)
|
|
168
226
|
*/
|
|
169
|
-
export declare const apply_route_specs: (app: Hono, specs: Array<RouteSpec>, resolve_auth_guards: AuthGuardResolver, log: Logger, db: Db) => void;
|
|
227
|
+
export declare const apply_route_specs: (app: Hono, specs: Array<RouteSpec>, resolve_auth_guards: AuthGuardResolver, log: Logger, db: Db, authorize?: AuthorizationHandler, is_acting_aware?: IsActingAware) => void;
|
|
170
228
|
/**
|
|
171
229
|
* Prepend a prefix to all route spec paths.
|
|
172
230
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route_spec.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/http/route_spec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAC,OAAO,EAAW,IAAI,EAAE,iBAAiB,EAAC,MAAM,MAAM,CAAC;AACpE,OAAO,KAAK,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAE3B,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,yBAAyB,CAAC;AAEpD,OAAO,KAAK,EAAC,EAAE,EAAC,MAAM,aAAa,CAAC;AACpC,OAAO,EACN,KAAK,iBAAiB,EACtB,KAAK,YAAY,EAKjB,MAAM,oBAAoB,CAAC;AAQ5B,OAAO,KAAK,EAAC,cAAc,EAAC,MAAM,sBAAsB,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,MAAM,SAAS,GAClB;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,GACd;IAAC,IAAI,EAAE,eAAe,CAAA;CAAC,GACvB;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAC,GAC5B;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAC,CAAC;AAEpB;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,SAAS,KAAK,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"route_spec.d.ts","sourceRoot":"../src/lib/","sources":["../../src/lib/http/route_spec.ts"],"names":[],"mappings":"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"}
|