@fuzdev/fuz_app 0.104.0 → 0.106.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 +2 -2
- package/dist/actions/action_bridge.d.ts.map +1 -1
- package/dist/actions/action_bridge.js +2 -2
- package/dist/actions/action_codegen.d.ts.map +1 -1
- package/dist/actions/action_codegen.js +3 -3
- package/dist/actions/action_dispatcher.d.ts.map +1 -1
- package/dist/actions/action_dispatcher.js +3 -3
- package/dist/actions/action_event.d.ts.map +1 -1
- package/dist/actions/action_event.js +11 -11
- package/dist/actions/action_event_data.d.ts.map +1 -1
- package/dist/actions/action_event_data.js +2 -2
- package/dist/actions/action_event_helpers.d.ts.map +1 -1
- package/dist/actions/action_event_helpers.js +2 -2
- package/dist/actions/action_event_types.d.ts.map +1 -1
- package/dist/actions/action_event_types.js +4 -4
- package/dist/actions/action_rpc.d.ts.map +1 -1
- package/dist/actions/action_rpc.js +14 -13
- package/dist/actions/action_spec.d.ts.map +1 -1
- package/dist/actions/action_spec.js +6 -6
- package/dist/actions/action_types.d.ts.map +1 -1
- package/dist/actions/broadcast_api.d.ts.map +1 -1
- package/dist/actions/broadcast_api.js +1 -1
- package/dist/actions/cancel.d.ts.map +1 -1
- package/dist/actions/cancel.js +3 -3
- package/dist/actions/compile_action_registry.d.ts.map +1 -1
- package/dist/actions/frontend_rpc_client.d.ts.map +1 -1
- package/dist/actions/frontend_rpc_client.js +3 -3
- package/dist/actions/heartbeat.d.ts.map +1 -1
- package/dist/actions/heartbeat.js +2 -2
- package/dist/actions/peer_ping.d.ts.map +1 -1
- package/dist/actions/peer_ping.js +6 -6
- package/dist/actions/peer_request.d.ts.map +1 -1
- package/dist/actions/perform_action.d.ts +8 -0
- package/dist/actions/perform_action.d.ts.map +1 -1
- package/dist/actions/perform_action.js +41 -23
- package/dist/actions/protocol.d.ts.map +1 -1
- package/dist/actions/protocol.js +1 -1
- package/dist/actions/register_action_ws.d.ts.map +1 -1
- package/dist/actions/register_action_ws.js +39 -12
- package/dist/actions/register_ws_endpoint.d.ts.map +1 -1
- package/dist/actions/register_ws_endpoint.js +3 -3
- package/dist/actions/request_tracker.svelte.d.ts.map +1 -1
- package/dist/actions/request_tracker.svelte.js +2 -2
- package/dist/actions/rpc_client.d.ts.map +1 -1
- package/dist/actions/rpc_client.js +7 -7
- package/dist/actions/socket.svelte.d.ts.map +1 -1
- package/dist/actions/socket.svelte.js +4 -3
- package/dist/actions/transports.d.ts.map +1 -1
- package/dist/actions/transports_http.d.ts.map +1 -1
- package/dist/actions/transports_http.js +7 -7
- package/dist/actions/transports_ws.d.ts.map +1 -1
- package/dist/actions/transports_ws.js +3 -3
- package/dist/actions/transports_ws_auth_guard.d.ts +4 -4
- package/dist/actions/transports_ws_auth_guard.d.ts.map +1 -1
- package/dist/actions/transports_ws_auth_guard.js +5 -5
- package/dist/actions/transports_ws_backend.d.ts.map +1 -1
- package/dist/actions/transports_ws_backend.js +2 -2
- package/dist/actions/ws_endpoint_spec.d.ts +2 -2
- package/dist/actions/ws_endpoint_spec.d.ts.map +1 -1
- package/dist/auth/CLAUDE.md +11 -7
- package/dist/auth/account_action_specs.d.ts +32 -9
- package/dist/auth/account_action_specs.d.ts.map +1 -1
- package/dist/auth/account_action_specs.js +35 -23
- package/dist/auth/account_actions.d.ts +3 -3
- package/dist/auth/account_actions.d.ts.map +1 -1
- package/dist/auth/account_actions.js +25 -12
- package/dist/auth/account_queries.d.ts.map +1 -1
- package/dist/auth/account_queries.js +6 -6
- package/dist/auth/account_route_schema.d.ts.map +1 -1
- package/dist/auth/account_route_schema.js +19 -19
- package/dist/auth/account_routes.d.ts +2 -2
- package/dist/auth/account_routes.d.ts.map +1 -1
- package/dist/auth/account_routes.js +27 -27
- package/dist/auth/account_schema.d.ts +26 -2
- package/dist/auth/account_schema.d.ts.map +1 -1
- package/dist/auth/account_schema.js +28 -10
- package/dist/auth/actor_lookup_action_specs.d.ts.map +1 -1
- package/dist/auth/actor_lookup_action_specs.js +5 -5
- package/dist/auth/actor_lookup_actions.d.ts +4 -2
- package/dist/auth/actor_lookup_actions.d.ts.map +1 -1
- package/dist/auth/actor_lookup_actions.js +3 -3
- package/dist/auth/actor_lookup_queries.d.ts.map +1 -1
- package/dist/auth/actor_search_action_specs.d.ts.map +1 -1
- package/dist/auth/actor_search_action_specs.js +6 -6
- package/dist/auth/actor_search_actions.d.ts +4 -2
- package/dist/auth/actor_search_actions.d.ts.map +1 -1
- package/dist/auth/actor_search_actions.js +5 -5
- package/dist/auth/actor_search_queries.d.ts.map +1 -1
- package/dist/auth/admin_action_specs.d.ts +2 -2
- package/dist/auth/admin_action_specs.d.ts.map +1 -1
- package/dist/auth/admin_action_specs.js +55 -55
- package/dist/auth/admin_actions.d.ts +5 -5
- package/dist/auth/admin_actions.d.ts.map +1 -1
- package/dist/auth/admin_actions.js +45 -44
- package/dist/auth/all_action_spec_registries.d.ts.map +1 -1
- package/dist/auth/all_action_spec_registries.js +1 -1
- package/dist/auth/all_cell_actions.d.ts.map +1 -1
- package/dist/auth/all_cell_actions.js +1 -1
- package/dist/auth/api_token.d.ts.map +1 -1
- package/dist/auth/api_token_queries.d.ts +9 -3
- package/dist/auth/api_token_queries.d.ts.map +1 -1
- package/dist/auth/api_token_queries.js +29 -8
- package/dist/auth/app_settings_queries.d.ts.map +1 -1
- package/dist/auth/app_settings_schema.d.ts.map +1 -1
- package/dist/auth/app_settings_schema.js +3 -3
- package/dist/auth/audit_emitter.d.ts +28 -20
- package/dist/auth/audit_emitter.d.ts.map +1 -1
- package/dist/auth/audit_emitter.js +37 -19
- package/dist/auth/audit_log_ddl.js +1 -1
- package/dist/auth/audit_log_queries.d.ts.map +1 -1
- package/dist/auth/audit_log_queries.js +2 -2
- package/dist/auth/audit_log_route_schema.d.ts.map +1 -1
- package/dist/auth/audit_log_route_schema.js +1 -1
- package/dist/auth/audit_log_routes.d.ts.map +1 -1
- package/dist/auth/audit_log_routes.js +12 -4
- package/dist/auth/audit_log_schema.d.ts +2 -2
- package/dist/auth/audit_log_schema.d.ts.map +1 -1
- package/dist/auth/audit_log_schema.js +69 -68
- package/dist/auth/auth_ddl.js +3 -3
- package/dist/auth/auth_guard_resolver.d.ts.map +1 -1
- package/dist/auth/bearer_auth.d.ts.map +1 -1
- package/dist/auth/bearer_auth.js +6 -1
- package/dist/auth/bootstrap_account.d.ts.map +1 -1
- package/dist/auth/bootstrap_account.js +5 -5
- package/dist/auth/bootstrap_route_schema.d.ts.map +1 -1
- package/dist/auth/bootstrap_route_schema.js +6 -6
- package/dist/auth/bootstrap_routes.d.ts.map +1 -1
- package/dist/auth/bootstrap_routes.js +7 -7
- package/dist/auth/cell_action_specs.d.ts +1 -1
- package/dist/auth/cell_action_specs.d.ts.map +1 -1
- package/dist/auth/cell_action_specs.js +47 -47
- package/dist/auth/cell_actions.d.ts +2 -2
- package/dist/auth/cell_actions.d.ts.map +1 -1
- package/dist/auth/cell_actions.js +37 -37
- package/dist/auth/cell_audit_action_specs.d.ts.map +1 -1
- package/dist/auth/cell_audit_action_specs.js +4 -4
- package/dist/auth/cell_audit_actions.d.ts.map +1 -1
- package/dist/auth/cell_audit_actions.js +3 -3
- package/dist/auth/cell_audit_events.d.ts.map +1 -1
- package/dist/auth/cell_audit_events.js +5 -5
- package/dist/auth/cell_audit_metadata.d.ts.map +1 -1
- package/dist/auth/cell_audit_metadata.js +3 -3
- package/dist/auth/cell_authorize.d.ts.map +1 -1
- package/dist/auth/cell_data_schema.d.ts.map +1 -1
- package/dist/auth/cell_data_schema.js +1 -1
- package/dist/auth/cell_field_action_specs.d.ts.map +1 -1
- package/dist/auth/cell_field_action_specs.js +16 -16
- package/dist/auth/cell_field_actions.d.ts +2 -2
- package/dist/auth/cell_field_actions.d.ts.map +1 -1
- package/dist/auth/cell_field_actions.js +11 -11
- package/dist/auth/cell_field_audit_metadata.d.ts.map +1 -1
- package/dist/auth/cell_field_audit_metadata.js +2 -2
- package/dist/auth/cell_grant_action_specs.d.ts.map +1 -1
- package/dist/auth/cell_grant_action_specs.js +15 -15
- package/dist/auth/cell_grant_actions.d.ts +2 -2
- package/dist/auth/cell_grant_actions.d.ts.map +1 -1
- package/dist/auth/cell_grant_actions.js +12 -12
- package/dist/auth/cell_grant_audit_metadata.d.ts.map +1 -1
- package/dist/auth/cell_grant_audit_metadata.js +3 -3
- package/dist/auth/cell_item_action_specs.d.ts +6 -2
- package/dist/auth/cell_item_action_specs.d.ts.map +1 -1
- package/dist/auth/cell_item_action_specs.js +25 -21
- package/dist/auth/cell_item_actions.d.ts +2 -2
- package/dist/auth/cell_item_actions.d.ts.map +1 -1
- package/dist/auth/cell_item_actions.js +14 -14
- package/dist/auth/cell_item_audit_metadata.d.ts.map +1 -1
- package/dist/auth/cell_item_audit_metadata.js +3 -3
- package/dist/auth/cell_relation_visibility.d.ts.map +1 -1
- package/dist/auth/cleanup.d.ts.map +1 -1
- package/dist/auth/cleanup.js +2 -2
- package/dist/auth/credential_type_schema.d.ts.map +1 -1
- package/dist/auth/credential_type_schema.js +5 -5
- package/dist/auth/daemon_token.d.ts.map +1 -1
- package/dist/auth/daemon_token_middleware.d.ts.map +1 -1
- package/dist/auth/daemon_token_middleware.js +7 -3
- package/dist/auth/deps.d.ts +20 -5
- package/dist/auth/deps.d.ts.map +1 -1
- package/dist/auth/grant_path_schema.d.ts.map +1 -1
- package/dist/auth/grant_path_schema.js +8 -8
- package/dist/auth/invite_queries.d.ts.map +1 -1
- package/dist/auth/invite_schema.d.ts.map +1 -1
- package/dist/auth/invite_schema.js +2 -2
- package/dist/auth/keyring.d.ts.map +1 -1
- package/dist/auth/keyring.js +1 -1
- package/dist/auth/middleware.d.ts.map +1 -1
- package/dist/auth/middleware.js +7 -7
- package/dist/auth/migrations.d.ts.map +1 -1
- package/dist/auth/migrations.js +54 -19
- package/dist/auth/password.d.ts.map +1 -1
- package/dist/auth/password_argon2.d.ts.map +1 -1
- package/dist/auth/password_argon2.js +2 -2
- package/dist/auth/request_context.d.ts +18 -0
- package/dist/auth/request_context.d.ts.map +1 -1
- package/dist/auth/request_context.js +33 -7
- package/dist/auth/role_grant_offer_action_specs.d.ts +12 -0
- package/dist/auth/role_grant_offer_action_specs.d.ts.map +1 -1
- package/dist/auth/role_grant_offer_action_specs.js +47 -36
- package/dist/auth/role_grant_offer_actions.d.ts +7 -4
- package/dist/auth/role_grant_offer_actions.d.ts.map +1 -1
- package/dist/auth/role_grant_offer_actions.js +43 -43
- package/dist/auth/role_grant_offer_notifications.d.ts.map +1 -1
- package/dist/auth/role_grant_offer_notifications.js +13 -13
- package/dist/auth/role_grant_offer_queries.d.ts +1 -1
- package/dist/auth/role_grant_offer_queries.d.ts.map +1 -1
- package/dist/auth/role_grant_offer_queries.js +11 -11
- package/dist/auth/role_grant_offer_schema.d.ts.map +1 -1
- package/dist/auth/role_grant_offer_schema.js +7 -7
- package/dist/auth/role_grant_queries.d.ts.map +1 -1
- package/dist/auth/role_grant_queries.js +3 -3
- package/dist/auth/role_schema.d.ts.map +1 -1
- package/dist/auth/role_schema.js +7 -7
- package/dist/auth/scope_kind_schema.d.ts.map +1 -1
- package/dist/auth/self_service_role_action_specs.d.ts +7 -0
- package/dist/auth/self_service_role_action_specs.d.ts.map +1 -1
- package/dist/auth/self_service_role_action_specs.js +12 -6
- package/dist/auth/self_service_role_actions.d.ts +3 -3
- package/dist/auth/self_service_role_actions.d.ts.map +1 -1
- package/dist/auth/self_service_role_actions.js +9 -9
- package/dist/auth/session_cookie.d.ts.map +1 -1
- package/dist/auth/session_cookie.js +3 -3
- package/dist/auth/session_middleware.d.ts.map +1 -1
- package/dist/auth/session_middleware.js +4 -4
- package/dist/auth/session_queries.d.ts +14 -4
- package/dist/auth/session_queries.d.ts.map +1 -1
- package/dist/auth/session_queries.js +13 -3
- package/dist/auth/signup_route_schema.d.ts.map +1 -1
- package/dist/auth/signup_route_schema.js +6 -6
- package/dist/auth/signup_routes.d.ts.map +1 -1
- package/dist/auth/signup_routes.js +11 -11
- package/dist/auth/standard_action_specs.d.ts.map +1 -1
- package/dist/auth/standard_action_specs.js +1 -1
- package/dist/auth/standard_rpc_actions.d.ts +4 -4
- package/dist/auth/standard_rpc_actions.d.ts.map +1 -1
- package/dist/auth/standard_rpc_actions.js +3 -3
- package/dist/auth/token_scope.d.ts +155 -0
- package/dist/auth/token_scope.d.ts.map +1 -0
- package/dist/auth/token_scope.js +190 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/daemon.js +3 -3
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +1 -1
- package/dist/cli/logger.d.ts.map +1 -1
- package/dist/cli/logger.js +1 -1
- package/dist/cli/util.d.ts.map +1 -1
- package/dist/cli/util.js +1 -1
- package/dist/db/CLAUDE.md +1 -1
- package/dist/db/cell_audit_queries.d.ts.map +1 -1
- package/dist/db/cell_audit_queries.js +1 -1
- package/dist/db/cell_ddl.d.ts.map +1 -1
- package/dist/db/cell_ddl.js +7 -7
- package/dist/db/cell_field_queries.d.ts.map +1 -1
- package/dist/db/cell_grant_queries.d.ts.map +1 -1
- package/dist/db/cell_grant_queries.js +1 -1
- package/dist/db/cell_history_ddl.d.ts.map +1 -1
- package/dist/db/cell_history_ddl.js +4 -4
- package/dist/db/cell_item_queries.d.ts.map +1 -1
- package/dist/db/cell_queries.d.ts +1 -1
- package/dist/db/cell_queries.d.ts.map +1 -1
- package/dist/db/cell_queries.js +3 -3
- package/dist/db/create_db.d.ts.map +1 -1
- package/dist/db/create_db.js +1 -1
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db_pg.d.ts.map +1 -1
- package/dist/db/db_pg.js +1 -1
- package/dist/db/db_pglite.d.ts.map +1 -1
- package/dist/db/db_pglite.js +1 -1
- package/dist/db/fact_ddl.d.ts.map +1 -1
- package/dist/db/fact_ddl.js +3 -3
- package/dist/db/fact_disk_storage.d.ts +1 -1
- package/dist/db/fact_disk_storage.d.ts.map +1 -1
- package/dist/db/fact_disk_storage.js +6 -6
- package/dist/db/fact_queries.d.ts +1 -1
- package/dist/db/fact_queries.d.ts.map +1 -1
- package/dist/db/fact_queries.js +2 -2
- package/dist/db/fact_store.d.ts +1 -1
- package/dist/db/fact_store.d.ts.map +1 -1
- package/dist/db/fact_store.js +9 -9
- package/dist/db/fact_store_errors.d.ts.map +1 -1
- package/dist/db/file_fact_url.d.ts +1 -1
- package/dist/db/file_fact_url.d.ts.map +1 -1
- package/dist/db/file_fact_url.js +1 -1
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/pg_error.d.ts.map +1 -1
- package/dist/db/query_deps.d.ts.map +1 -1
- package/dist/db/schema_ready.d.ts.map +1 -1
- package/dist/db/schema_ready.js +2 -2
- package/dist/db/status.d.ts.map +1 -1
- package/dist/db/status.js +6 -6
- package/dist/dev/setup.d.ts.map +1 -1
- package/dist/dev/setup.js +6 -6
- package/dist/env/dotenv.d.ts.map +1 -1
- package/dist/env/load.d.ts.map +1 -1
- package/dist/env/resolve.d.ts.map +1 -1
- package/dist/hono_context.d.ts +23 -0
- package/dist/hono_context.d.ts.map +1 -1
- package/dist/hono_context.js +16 -2
- package/dist/http/auth_shape.d.ts.map +1 -1
- package/dist/http/auth_shape.js +6 -6
- package/dist/http/client_ip.d.ts.map +1 -1
- package/dist/http/common_routes.d.ts.map +1 -1
- package/dist/http/common_routes.js +8 -8
- package/dist/http/db_routes.d.ts.map +1 -1
- package/dist/http/db_routes.js +27 -23
- package/dist/http/error_schemas.d.ts +13 -1
- package/dist/http/error_schemas.d.ts.map +1 -1
- package/dist/http/error_schemas.js +25 -13
- package/dist/http/jsonrpc.d.ts.map +1 -1
- package/dist/http/jsonrpc.js +9 -9
- package/dist/http/jsonrpc_errors.d.ts.map +1 -1
- package/dist/http/jsonrpc_errors.js +21 -21
- package/dist/http/jsonrpc_helpers.d.ts.map +1 -1
- package/dist/http/jsonrpc_helpers.js +7 -7
- package/dist/http/middleware_spec.d.ts.map +1 -1
- package/dist/http/origin.d.ts.map +1 -1
- package/dist/http/pending_effects.d.ts.map +1 -1
- package/dist/http/proxy.d.ts.map +1 -1
- package/dist/http/proxy.js +1 -1
- package/dist/http/route_spec.d.ts.map +1 -1
- package/dist/http/route_spec.js +6 -6
- package/dist/http/schema_helpers.d.ts.map +1 -1
- package/dist/http/schema_helpers.js +1 -1
- package/dist/http/surface.d.ts.map +1 -1
- package/dist/http/surface.js +11 -11
- package/dist/http/surface_query.d.ts.map +1 -1
- package/dist/http/surface_query.js +1 -1
- package/dist/primitive_schemas.d.ts.map +1 -1
- package/dist/primitive_schemas.js +1 -1
- package/dist/rate_limiter.d.ts.map +1 -1
- package/dist/rate_limiter.js +4 -4
- package/dist/realtime/sse.d.ts.map +1 -1
- package/dist/realtime/sse.js +2 -2
- package/dist/realtime/sse_auth_guard.d.ts +4 -4
- package/dist/realtime/sse_auth_guard.d.ts.map +1 -1
- package/dist/realtime/sse_auth_guard.js +8 -8
- package/dist/realtime/subscriber_registry.d.ts.map +1 -1
- package/dist/runtime/deno.d.ts.map +1 -1
- package/dist/runtime/deno.js +7 -7
- package/dist/runtime/deps.d.ts.map +1 -1
- package/dist/runtime/fs.d.ts.map +1 -1
- package/dist/runtime/mock.d.ts.map +1 -1
- package/dist/runtime/mock.js +3 -3
- package/dist/runtime/node.d.ts.map +1 -1
- package/dist/runtime/node.js +7 -7
- package/dist/schema_meta.d.ts.map +1 -1
- package/dist/server/app_backend.d.ts +3 -3
- package/dist/server/app_backend.d.ts.map +1 -1
- package/dist/server/app_backend.js +3 -3
- package/dist/server/app_server.d.ts +6 -6
- package/dist/server/app_server.d.ts.map +1 -1
- package/dist/server/app_server.js +32 -32
- package/dist/server/app_server_context.d.ts.map +1 -1
- package/dist/server/env.d.ts.map +1 -1
- package/dist/server/env.js +9 -9
- package/dist/server/file_fact_fetcher.d.ts.map +1 -1
- package/dist/server/file_fact_fetcher.js +1 -1
- package/dist/server/serve_fact_route.d.ts.map +1 -1
- package/dist/server/serve_fact_route.js +23 -13
- package/dist/server/startup.d.ts.map +1 -1
- package/dist/server/static.d.ts.map +1 -1
- package/dist/server/x_accel.d.ts +2 -4
- package/dist/server/x_accel.d.ts.map +1 -1
- package/dist/server/x_accel.js +3 -5
- package/dist/testing/CLAUDE.md +2 -2
- package/dist/testing/admin_integration.d.ts.map +1 -1
- package/dist/testing/admin_integration.js +64 -64
- package/dist/testing/adversarial_404.d.ts.map +1 -1
- package/dist/testing/adversarial_404.js +1 -1
- package/dist/testing/adversarial_headers.d.ts.map +1 -1
- package/dist/testing/adversarial_headers.js +15 -15
- package/dist/testing/adversarial_input.d.ts.map +1 -1
- package/dist/testing/adversarial_input.js +22 -22
- package/dist/testing/app_server.d.ts.map +1 -1
- package/dist/testing/app_server.js +34 -33
- package/dist/testing/assertions.d.ts.map +1 -1
- package/dist/testing/attack_surface.d.ts.map +1 -1
- package/dist/testing/attack_surface.js +12 -12
- package/dist/testing/audit_completeness.d.ts.map +1 -1
- package/dist/testing/audit_completeness.js +42 -42
- package/dist/testing/audit_drift_guard.d.ts +3 -1
- package/dist/testing/audit_drift_guard.d.ts.map +1 -1
- package/dist/testing/audit_drift_guard.js +12 -6
- package/dist/testing/auth_apps.d.ts.map +1 -1
- package/dist/testing/auth_apps.js +4 -4
- package/dist/testing/bootstrap_success.d.ts.map +1 -1
- package/dist/testing/bootstrap_success.js +11 -11
- package/dist/testing/connection_closer_helpers.d.ts.map +1 -1
- package/dist/testing/connection_closer_helpers.js +1 -1
- package/dist/testing/cross_backend/account_lifecycle.d.ts.map +1 -1
- package/dist/testing/cross_backend/account_lifecycle.js +1 -1
- package/dist/testing/cross_backend/action_manifest.d.ts.map +1 -1
- package/dist/testing/cross_backend/action_manifest.js +4 -4
- package/dist/testing/cross_backend/action_manifest_parity.d.ts.map +1 -1
- package/dist/testing/cross_backend/actor_lookup.d.ts.map +1 -1
- package/dist/testing/cross_backend/actor_lookup.js +3 -3
- package/dist/testing/cross_backend/actor_search.d.ts.map +1 -1
- package/dist/testing/cross_backend/actor_search.js +5 -5
- package/dist/testing/cross_backend/app_settings.d.ts.map +1 -1
- package/dist/testing/cross_backend/app_settings.js +6 -6
- package/dist/testing/cross_backend/backend_config.d.ts.map +1 -1
- package/dist/testing/cross_backend/bench/bench_report.d.ts.map +1 -1
- package/dist/testing/cross_backend/bench/bench_report.js +5 -5
- package/dist/testing/cross_backend/bench/run_cross_impl_bench.d.ts.map +1 -1
- package/dist/testing/cross_backend/bench/run_cross_impl_bench.js +2 -2
- package/dist/testing/cross_backend/bench/scenario.d.ts.map +1 -1
- package/dist/testing/cross_backend/bench/scenario.js +1 -1
- package/dist/testing/cross_backend/body_size.d.ts.map +1 -1
- package/dist/testing/cross_backend/body_size.js +1 -1
- package/dist/testing/cross_backend/bootstrap_backend.d.ts.map +1 -1
- package/dist/testing/cross_backend/bootstrap_backend.js +2 -2
- package/dist/testing/cross_backend/build_test_backend_paths.js +1 -1
- package/dist/testing/cross_backend/capabilities.js +2 -2
- package/dist/testing/cross_backend/cell_cross_helpers.d.ts.map +1 -1
- package/dist/testing/cross_backend/cell_crud.d.ts.map +1 -1
- package/dist/testing/cross_backend/cell_crud.js +5 -2
- package/dist/testing/cross_backend/cell_gated_create.d.ts.map +1 -1
- package/dist/testing/cross_backend/cell_gated_create.js +8 -7
- package/dist/testing/cross_backend/cell_grant_role.d.ts.map +1 -1
- package/dist/testing/cross_backend/cell_grant_role.js +2 -2
- package/dist/testing/cross_backend/cell_relations.d.ts.map +1 -1
- package/dist/testing/cross_backend/cell_relations.js +13 -13
- package/dist/testing/cross_backend/conformance_case.d.ts +23 -0
- package/dist/testing/cross_backend/conformance_case.d.ts.map +1 -1
- package/dist/testing/cross_backend/conformance_case.js +32 -11
- package/dist/testing/cross_backend/conformance_table.d.ts.map +1 -1
- package/dist/testing/cross_backend/conformance_table.js +68 -15
- package/dist/testing/cross_backend/cookie_attributes.d.ts.map +1 -1
- package/dist/testing/cross_backend/cookie_attributes.js +4 -4
- package/dist/testing/cross_backend/create_cross_backend_global_setup.d.ts +1 -1
- package/dist/testing/cross_backend/create_cross_backend_global_setup.d.ts.map +1 -1
- package/dist/testing/cross_backend/create_cross_backend_global_setup.js +1 -1
- package/dist/testing/cross_backend/create_dual_spawn_global_setup.d.ts +1 -1
- package/dist/testing/cross_backend/create_dual_spawn_global_setup.d.ts.map +1 -1
- package/dist/testing/cross_backend/create_dual_spawn_global_setup.js +1 -1
- package/dist/testing/cross_backend/credential_header_robustness.js +1 -1
- package/dist/testing/cross_backend/default_backend_configs.d.ts.map +1 -1
- package/dist/testing/cross_backend/default_backend_configs.js +12 -12
- package/dist/testing/cross_backend/default_spine_surface.d.ts.map +1 -1
- package/dist/testing/cross_backend/default_spine_surface.js +9 -9
- package/dist/testing/cross_backend/expected_schema.json +1 -0
- package/dist/testing/cross_backend/fact_serving.d.ts.map +1 -1
- package/dist/testing/cross_backend/fact_serving.js +2 -2
- package/dist/testing/cross_backend/full_spine_mount.d.ts.map +1 -1
- package/dist/testing/cross_backend/full_spine_mount.js +4 -4
- package/dist/testing/cross_backend/identity_parity.d.ts.map +1 -1
- package/dist/testing/cross_backend/identity_parity.js +28 -24
- package/dist/testing/cross_backend/in_process_setup.d.ts.map +1 -1
- package/dist/testing/cross_backend/in_process_setup.js +9 -9
- package/dist/testing/cross_backend/login_security.d.ts.map +1 -1
- package/dist/testing/cross_backend/login_security.js +2 -2
- package/dist/testing/cross_backend/make_cross_backend_project.d.ts +1 -1
- package/dist/testing/cross_backend/make_cross_backend_project.d.ts.map +1 -1
- package/dist/testing/cross_backend/make_cross_backend_project.js +3 -3
- package/dist/testing/cross_backend/method_coverage.d.ts.map +1 -1
- package/dist/testing/cross_backend/origin.d.ts.map +1 -1
- package/dist/testing/cross_backend/origin.js +4 -4
- package/dist/testing/cross_backend/peer_ping_ws.d.ts.map +1 -1
- package/dist/testing/cross_backend/peer_ping_ws.js +6 -6
- package/dist/testing/cross_backend/ready.d.ts.map +1 -1
- package/dist/testing/cross_backend/role_grant_offer_enumeration.d.ts.map +1 -1
- package/dist/testing/cross_backend/role_grant_offer_enumeration.js +1 -1
- package/dist/testing/cross_backend/role_grant_offer_notification_ws.d.ts.map +1 -1
- package/dist/testing/cross_backend/role_grant_offer_notification_ws.js +1 -1
- package/dist/testing/cross_backend/role_grant_participation.d.ts.map +1 -1
- package/dist/testing/cross_backend/rust_spine_stub_backend_config.d.ts.map +1 -1
- package/dist/testing/cross_backend/rust_spine_stub_backend_config.js +5 -5
- package/dist/testing/cross_backend/setup.d.ts.map +1 -1
- package/dist/testing/cross_backend/setup.js +41 -37
- package/dist/testing/cross_backend/spawn_backend.d.ts.map +1 -1
- package/dist/testing/cross_backend/spawn_backend.js +1 -1
- package/dist/testing/cross_backend/sse_round_trip.d.ts.map +1 -1
- package/dist/testing/cross_backend/sse_round_trip.js +10 -7
- package/dist/testing/cross_backend/standard.d.ts.map +1 -1
- package/dist/testing/cross_backend/standard.js +5 -5
- package/dist/testing/cross_backend/testing_backdoor.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_backdoor.js +7 -7
- package/dist/testing/cross_backend/testing_reset_actions.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_reset_actions.js +24 -23
- package/dist/testing/cross_backend/testing_server_bun.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_server_bun.js +3 -3
- package/dist/testing/cross_backend/testing_server_core.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_server_core.js +1 -1
- package/dist/testing/cross_backend/testing_server_deno.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_server_deno.js +1 -1
- package/dist/testing/cross_backend/testing_server_node.d.ts.map +1 -1
- package/dist/testing/cross_backend/testing_server_node.js +3 -3
- package/dist/testing/cross_backend/ts_spine_backend_config.d.ts.map +1 -1
- package/dist/testing/cross_backend/ts_spine_backend_config.js +13 -13
- package/dist/testing/cross_backend/ws_round_trip.d.ts.map +1 -1
- package/dist/testing/cross_backend/ws_round_trip.js +2 -2
- package/dist/testing/data_exposure.d.ts.map +1 -1
- package/dist/testing/data_exposure.js +8 -8
- package/dist/testing/db.d.ts.map +1 -1
- package/dist/testing/db.js +3 -3
- package/dist/testing/db_entities.d.ts.map +1 -1
- package/dist/testing/db_entities.js +1 -1
- package/dist/testing/entities.d.ts.map +1 -1
- package/dist/testing/entities.js +5 -5
- package/dist/testing/error_coverage.d.ts.map +1 -1
- package/dist/testing/integration.d.ts.map +1 -1
- package/dist/testing/integration.js +109 -109
- package/dist/testing/integration_helpers.d.ts.map +1 -1
- package/dist/testing/integration_helpers.js +3 -3
- package/dist/testing/middleware.d.ts.map +1 -1
- package/dist/testing/middleware.js +11 -11
- package/dist/testing/mock_fs.js +1 -1
- package/dist/testing/rate_limiting.d.ts.map +1 -1
- package/dist/testing/rate_limiting.js +23 -23
- package/dist/testing/role_grant_helpers.d.ts.map +1 -1
- package/dist/testing/role_grant_helpers.js +3 -3
- package/dist/testing/round_trip.d.ts.map +1 -1
- package/dist/testing/round_trip.js +6 -6
- package/dist/testing/rpc_attack_surface.d.ts.map +1 -1
- package/dist/testing/rpc_attack_surface.js +12 -12
- package/dist/testing/rpc_helpers.d.ts.map +1 -1
- package/dist/testing/rpc_helpers.js +11 -11
- package/dist/testing/rpc_round_trip.d.ts.map +1 -1
- package/dist/testing/rpc_round_trip.js +3 -3
- package/dist/testing/schema_generators.d.ts.map +1 -1
- package/dist/testing/schema_generators.js +3 -3
- package/dist/testing/schema_introspect.d.ts.map +1 -1
- package/dist/testing/schema_introspect.js +12 -12
- package/dist/testing/schema_parity.d.ts.map +1 -1
- package/dist/testing/schema_parity.js +7 -7
- package/dist/testing/schema_ready_fixture.d.ts.map +1 -1
- package/dist/testing/sse_round_trip.d.ts.map +1 -1
- package/dist/testing/sse_round_trip.js +8 -8
- package/dist/testing/standard.d.ts.map +1 -1
- package/dist/testing/standard.js +8 -8
- package/dist/testing/stubs.d.ts +6 -6
- package/dist/testing/stubs.d.ts.map +1 -1
- package/dist/testing/stubs.js +26 -23
- package/dist/testing/surface_invariants.d.ts.map +1 -1
- package/dist/testing/surface_invariants.js +5 -5
- package/dist/testing/testing_rate_limiter.d.ts.map +1 -1
- package/dist/testing/transports/bootstrap.d.ts.map +1 -1
- package/dist/testing/transports/bootstrap.js +4 -4
- package/dist/testing/transports/fetch_transport.d.ts.map +1 -1
- package/dist/testing/transports/sse_frame_reader.d.ts.map +1 -1
- package/dist/testing/transports/sse_transport.js +1 -1
- package/dist/testing/transports/ws_client.d.ts.map +1 -1
- package/dist/testing/transports/ws_client.js +1 -1
- package/dist/testing/transports/ws_transport.js +4 -4
- package/dist/testing/ws_round_trip.d.ts.map +1 -1
- package/dist/testing/ws_round_trip.js +21 -21
- package/dist/ui/AccountSessions.svelte +11 -11
- package/dist/ui/AdminAccounts.svelte +10 -10
- package/dist/ui/AdminAuditLog.svelte +14 -14
- package/dist/ui/AdminInvites.svelte +13 -13
- package/dist/ui/AdminOverview.svelte +22 -22
- package/dist/ui/AdminRoleGrantHistory.svelte +11 -11
- package/dist/ui/AdminSessions.svelte +12 -12
- package/dist/ui/AdminSettings.svelte +1 -1
- package/dist/ui/AdminSurface.svelte +3 -3
- package/dist/ui/AppShell.svelte +8 -8
- package/dist/ui/AppShell.svelte.d.ts.map +1 -1
- package/dist/ui/BootstrapForm.svelte +9 -9
- package/dist/ui/CLAUDE.md +1 -1
- package/dist/ui/ColumnLayout.svelte +2 -2
- package/dist/ui/ColumnLayout.svelte.d.ts.map +1 -1
- package/dist/ui/ConfirmButton.svelte +8 -8
- package/dist/ui/ConfirmButton.svelte.d.ts.map +1 -1
- package/dist/ui/Datatable.svelte +6 -6
- package/dist/ui/Datatable.svelte.d.ts.map +1 -1
- package/dist/ui/LoginForm.svelte +6 -6
- package/dist/ui/LogoutButton.svelte +2 -2
- package/dist/ui/LogoutButton.svelte.d.ts.map +1 -1
- package/dist/ui/MenuLink.svelte +5 -5
- package/dist/ui/MenuLink.svelte.d.ts.map +1 -1
- package/dist/ui/OpenSignupToggle.svelte +2 -2
- package/dist/ui/PopoverButton.svelte +10 -10
- package/dist/ui/PopoverButton.svelte.d.ts.map +1 -1
- package/dist/ui/RoleGrantOfferForm.svelte +8 -11
- package/dist/ui/RoleGrantOfferForm.svelte.d.ts.map +1 -1
- package/dist/ui/RoleGrantOfferHistory.svelte +11 -11
- package/dist/ui/RoleGrantOfferHistory.svelte.d.ts.map +1 -1
- package/dist/ui/RoleGrantOfferInbox.svelte +6 -6
- package/dist/ui/RoleGrantOfferInbox.svelte.d.ts.map +1 -1
- package/dist/ui/SignupForm.svelte +9 -9
- package/dist/ui/SurfaceExplorer.svelte +11 -11
- package/dist/ui/SurfaceExplorer.svelte.d.ts.map +1 -1
- package/dist/ui/account_sessions_state.svelte.d.ts.map +1 -1
- package/dist/ui/admin_accounts_state.svelte.d.ts.map +1 -1
- package/dist/ui/admin_accounts_state.svelte.js +2 -2
- package/dist/ui/admin_invites_state.svelte.d.ts.map +1 -1
- package/dist/ui/admin_rpc_adapters.d.ts.map +1 -1
- package/dist/ui/admin_rpc_adapters.js +5 -5
- package/dist/ui/admin_sessions_state.svelte.d.ts.map +1 -1
- package/dist/ui/app_settings_state.svelte.d.ts.map +1 -1
- package/dist/ui/async_slot.svelte.d.ts.map +1 -1
- package/dist/ui/audit_log_state.svelte.d.ts.map +1 -1
- package/dist/ui/audit_log_state.svelte.js +1 -1
- package/dist/ui/auth_state.svelte.js +4 -4
- package/dist/ui/form_state.svelte.d.ts.map +1 -1
- package/dist/ui/format_scope.d.ts.map +1 -1
- package/dist/ui/keyed_async_slot.svelte.d.ts.map +1 -1
- package/dist/ui/popover.svelte.d.ts.map +1 -1
- package/dist/ui/popover.svelte.js +1 -1
- package/dist/ui/position_helpers.js +1 -1
- package/dist/ui/role_grant_offers_state.svelte.d.ts.map +1 -1
- package/dist/ui/role_grant_offers_state.svelte.js +1 -1
- package/dist/ui/table_state.svelte.d.ts.map +1 -1
- package/dist/ui/ui_fetch.d.ts.map +1 -1
- package/dist/ui/ui_format.js +2 -2
- package/package.json +13 -12
- package/dist/server/fact_write.d.ts +0 -32
- package/dist/server/fact_write.d.ts.map +0 -1
- package/dist/server/fact_write.js +0 -56
- package/dist/server/validate_nginx.d.ts +0 -34
- package/dist/server/validate_nginx.d.ts.map +0 -1
- package/dist/server/validate_nginx.js +0 -169
|
@@ -66,6 +66,15 @@ import { z } from 'zod';
|
|
|
66
66
|
* be replayed from a browser — wire-indistinguishable from sending no
|
|
67
67
|
* credential (the `token` principal is the honored counterpart: it suppresses
|
|
68
68
|
* `Origin`, so the same token authenticates).
|
|
69
|
+
* - `scoped_token` — the keeper authenticated via a bearer api-token minted
|
|
70
|
+
* with a **narrowed** `TokenScope` (`{kind: 'methods', methods:
|
|
71
|
+
* [SCOPED_TOKEN_ADMITTED_METHOD]}`), non-browser context. Minted through the
|
|
72
|
+
* production `account_token_create` path over the keeper's session, not
|
|
73
|
+
* seeded — `_testing_reset` deliberately seeds a `full` token, and a harness
|
|
74
|
+
* that narrowed the seed would silently re-scope every other bearer case.
|
|
75
|
+
* The scope gate sits between the credential gate and the role gate, so this
|
|
76
|
+
* principal is what distinguishes `token_scope_required` from the
|
|
77
|
+
* credential-type and role denials on either side of it.
|
|
69
78
|
* - `anonymous` — no credential, fresh cookie jar.
|
|
70
79
|
* - `fresh_non_admin` — a freshly minted account with no roles, session
|
|
71
80
|
* credential (via the production invite → signup → login flow).
|
|
@@ -87,18 +96,30 @@ export const ConformancePrincipal = z.enum([
|
|
|
87
96
|
'daemon_browser',
|
|
88
97
|
'token',
|
|
89
98
|
'bearer_browser',
|
|
99
|
+
'scoped_token',
|
|
90
100
|
'anonymous',
|
|
91
101
|
'fresh_non_admin',
|
|
92
102
|
'role_holder',
|
|
93
103
|
'wrong_role',
|
|
94
|
-
'expired_session'
|
|
104
|
+
'expired_session'
|
|
95
105
|
]);
|
|
106
|
+
/**
|
|
107
|
+
* The single RPC method the `scoped_token` principal's narrowed token admits.
|
|
108
|
+
*
|
|
109
|
+
* Part of the principal's contract, so the runner (which mints the token) and
|
|
110
|
+
* the cases (which assert the denials) agree on one value. `account_verify` is
|
|
111
|
+
* the minimal `credential_types: any` read on the spine: it clears the
|
|
112
|
+
* credential gate a bearer must pass first, and holds no role gate that could
|
|
113
|
+
* shadow the scope denial — so a case naming any *other* method isolates the
|
|
114
|
+
* scope gate and nothing else.
|
|
115
|
+
*/
|
|
116
|
+
export const SCOPED_TOKEN_ADMITTED_METHOD = 'account_verify';
|
|
96
117
|
/** The request a conformance case issues. */
|
|
97
118
|
export const ConformanceCaseRequest = z.strictObject({
|
|
98
119
|
method: z.string().meta({
|
|
99
120
|
description: 'RPC method name (e.g. `admin_account_list`) or a REST auth-route suffix ' +
|
|
100
121
|
'(e.g. `/login`). A leading `/` selects the REST branch; otherwise the ' +
|
|
101
|
-
'runner resolves the RPC action from the spec registry.'
|
|
122
|
+
'runner resolves the RPC action from the spec registry.'
|
|
102
123
|
}),
|
|
103
124
|
params: z
|
|
104
125
|
.unknown()
|
|
@@ -108,7 +129,7 @@ export const ConformanceCaseRequest = z.strictObject({
|
|
|
108
129
|
verb: z
|
|
109
130
|
.enum(['POST', 'GET'])
|
|
110
131
|
.optional()
|
|
111
|
-
.meta({ description: 'HTTP verb. Defaults to POST; use GET for `side_effects: false` reads.' })
|
|
132
|
+
.meta({ description: 'HTTP verb. Defaults to POST; use GET for `side_effects: false` reads.' })
|
|
112
133
|
});
|
|
113
134
|
/** The expected response shape a conformance case asserts. */
|
|
114
135
|
export const ConformanceCaseExpectation = z.strictObject({
|
|
@@ -121,14 +142,14 @@ export const ConformanceCaseExpectation = z.strictObject({
|
|
|
121
142
|
'`http/error_schemas.ts`, never a string literal. Asserted against the RPC ' +
|
|
122
143
|
'`error.data.reason` (when the denial carries one) or the REST flat-body ' +
|
|
123
144
|
'`error` field. The pre-validation 401 carries `data.reason` too; a denial ' +
|
|
124
|
-
'that genuinely omits it falls back to the `status` assertion to pin the class.'
|
|
145
|
+
'that genuinely omits it falls back to the `status` assertion to pin the class.'
|
|
125
146
|
}),
|
|
126
147
|
fields: z
|
|
127
148
|
.record(z.string(), z.unknown())
|
|
128
149
|
.optional()
|
|
129
150
|
.meta({
|
|
130
151
|
description: 'Specific field-value assertions on the success `result` (2xx) or the error ' +
|
|
131
|
-
'`error.data` (non-2xx). Each key must deep-equal the corresponding response field.'
|
|
152
|
+
'`error.data` (non-2xx). Each key must deep-equal the corresponding response field.'
|
|
132
153
|
}),
|
|
133
154
|
absent_fields: z
|
|
134
155
|
.array(z.string())
|
|
@@ -141,7 +162,7 @@ export const ConformanceCaseExpectation = z.strictObject({
|
|
|
141
162
|
'(top-level, inside a list element) fails the case. Pins "this secret never ' +
|
|
142
163
|
'serializes" on BOTH spines — a serialization regression would otherwise leak ' +
|
|
143
164
|
'identically and silently on each. Non-vacuous only when the body is known ' +
|
|
144
|
-
'non-empty (e.g. a list that always contains the caller); note that in the case.'
|
|
165
|
+
'non-empty (e.g. a list that always contains the caller); note that in the case.'
|
|
145
166
|
}),
|
|
146
167
|
headers: z
|
|
147
168
|
.record(z.string(), z.string().nullable())
|
|
@@ -153,7 +174,7 @@ export const ConformanceCaseExpectation = z.strictObject({
|
|
|
153
174
|
'runner enforces an unconditional no-fingerprint invariant on EVERY response ' +
|
|
154
175
|
'(`Server` / `X-Powered-By` / `WWW-Authenticate` must stay absent on both ' +
|
|
155
176
|
'spines), so a case only needs `headers` to pin a header beyond that ' +
|
|
156
|
-
'always-on floor.'
|
|
177
|
+
'always-on floor.'
|
|
157
178
|
}),
|
|
158
179
|
equivalence_group: z
|
|
159
180
|
.string()
|
|
@@ -167,8 +188,8 @@ export const ConformanceCaseExpectation = z.strictObject({
|
|
|
167
188
|
'and holds BOTH impls to it: a prober hitting either spine cannot tell the ' +
|
|
168
189
|
'members apart. A group needs >= 2 members; a member may still set `fields`. ' +
|
|
169
190
|
'The negative-space twin of the positive `output`-schema parity the runner ' +
|
|
170
|
-
'already asserts.'
|
|
171
|
-
})
|
|
191
|
+
'already asserts.'
|
|
192
|
+
})
|
|
172
193
|
});
|
|
173
194
|
/**
|
|
174
195
|
* Marks a case as a deferred-by-design gap. The runner routes it through
|
|
@@ -181,7 +202,7 @@ export const ConformanceCaseXfail = z.strictObject({
|
|
|
181
202
|
tracking_id: z
|
|
182
203
|
.string()
|
|
183
204
|
.meta({ description: 'Tracking id for the deferred gap (issue id or tracking slug).' }),
|
|
184
|
-
reason: z.string().meta({ description: 'Why this case is deferred-by-design.' })
|
|
205
|
+
reason: z.string().meta({ description: 'Why this case is deferred-by-design.' })
|
|
185
206
|
});
|
|
186
207
|
/**
|
|
187
208
|
* A single conformance case. `name` is the assertion; the optional
|
|
@@ -201,5 +222,5 @@ export const ConformanceCase = z.strictObject({
|
|
|
201
222
|
.string()
|
|
202
223
|
.optional()
|
|
203
224
|
.meta({ description: 'Free-text note printed in the label / failure output.' }),
|
|
204
|
-
xfail: ConformanceCaseXfail.optional()
|
|
225
|
+
xfail: ConformanceCaseXfail.optional()
|
|
205
226
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conformance_table.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/conformance_table.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA8B9B,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"conformance_table.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/conformance_table.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA8B9B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAOnE,OAAO,EAMN,KAAK,uBAAuB,EAC5B,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAEN,KAAK,eAAe,EAEpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAe,MAAM,YAAY,CAAC;AAGzD;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IAC1C,iEAAiE;IACjE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,gEAAgE;IAChE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,sDAAsD;AACtD,MAAM,WAAW,uBAAuB;IACvC,8CAA8C;IAC9C,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IAC/C,+DAA+D;IAC/D,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,oEAAoE;IACpE,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC,0EAA0E;IAC1E,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAC3C,kEAAkE;IAClE,QAAQ,CAAC,aAAa,EAAE,uBAAuB,CAAC;IAChD,4EAA4E;IAC5E,QAAQ,CAAC,eAAe,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACjD,4EAA4E;IAC5E,QAAQ,CAAC,UAAU,CAAC,EAAE,0BAA0B,CAAC;IACjD,iEAAiE;IACjE,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC7B;AAoPD;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,EAAE,aAAa,CAAC,MAAM,CAIrD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,6BAA6B,GACzC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,OAAO,MAAM,KACX,IAQF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,GACnC,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,UAAU,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,EACvC,OAAO,MAAM,KACX,IAYF,CAAC;AAwKF;;;;;GAKG;AACH,eAAO,MAAM,gCAAgC,GAAI,SAAS,uBAAuB,KAAG,IAkEnF,CAAC"}
|
|
@@ -26,9 +26,10 @@ import '../assert_dev_env.js';
|
|
|
26
26
|
*/
|
|
27
27
|
import { assert, describe, test } from 'vitest';
|
|
28
28
|
import { DAEMON_TOKEN_HEADER } from '../../auth/daemon_token.js';
|
|
29
|
-
import { find_auth_route, rest_auth_route_suffixes
|
|
30
|
-
import { find_rpc_action, headers_to_record, rpc_call,
|
|
31
|
-
import {} from '
|
|
29
|
+
import { find_auth_route, rest_auth_route_suffixes } from '../integration_helpers.js';
|
|
30
|
+
import { find_rpc_action, headers_to_record, rpc_call, rpc_call_for_spec, resolve_rpc_endpoints_for_setup } from '../rpc_helpers.js';
|
|
31
|
+
import { account_token_create_action_spec } from '../../auth/account_action_specs.js';
|
|
32
|
+
import { SCOPED_TOKEN_ADMITTED_METHOD } from './conformance_case.js';
|
|
32
33
|
import { xfail_until } from './xfail.js';
|
|
33
34
|
/**
|
|
34
35
|
* A deliberately malformed `X-Daemon-Token` value for the `invalid_daemon`
|
|
@@ -40,15 +41,56 @@ import { xfail_until } from './xfail.js';
|
|
|
40
41
|
* invalid-token path, not the browser-context discard.
|
|
41
42
|
*/
|
|
42
43
|
const INVALID_DAEMON_TOKEN_VALUE = 'not-a-valid-daemon-token';
|
|
44
|
+
/**
|
|
45
|
+
* Mint the `scoped_token` principal's narrowed bearer token over the
|
|
46
|
+
* production `account_token_create` path.
|
|
47
|
+
*
|
|
48
|
+
* Minted rather than seeded, and minted *here* rather than in a case. The
|
|
49
|
+
* seed stays `full` because `_testing_reset`'s api token backs every other
|
|
50
|
+
* bearer principal, and a case that minted its own credential would be the
|
|
51
|
+
* setup-DSL trap the case schema exists to avoid.
|
|
52
|
+
*
|
|
53
|
+
* `account_token_create` is session-only, so this runs over the keeper's
|
|
54
|
+
* session — which also makes the mint itself a live assertion that a narrowed
|
|
55
|
+
* scope is *accepted* at the mint boundary, not merely stored.
|
|
56
|
+
*/
|
|
57
|
+
const mint_scoped_token = async (fixture, resolved_rpc_endpoints) => {
|
|
58
|
+
const found = find_rpc_action(resolved_rpc_endpoints, account_token_create_action_spec.method);
|
|
59
|
+
if (!found) {
|
|
60
|
+
throw new Error(`conformance: principal 'scoped_token' needs '${account_token_create_action_spec.method}' ` +
|
|
61
|
+
`on the surface to mint its narrowed token, but the method is not registered on ` +
|
|
62
|
+
`rpc_endpoints.`);
|
|
63
|
+
}
|
|
64
|
+
// Spec-bound rather than a loose `rpc_call`: `params` type-checks against
|
|
65
|
+
// `TokenCreateInput` (so dropping `scope` is a compile error, not a runtime
|
|
66
|
+
// 400 in every test at once), and `result.token` comes back typed and
|
|
67
|
+
// output-validated — no cast, no hand-rolled presence check.
|
|
68
|
+
const res = await rpc_call_for_spec({
|
|
69
|
+
app: fixture.transport,
|
|
70
|
+
path: found.path,
|
|
71
|
+
spec: account_token_create_action_spec,
|
|
72
|
+
params: {
|
|
73
|
+
name: 'conformance scoped token',
|
|
74
|
+
scope: { kind: 'methods', methods: [SCOPED_TOKEN_ADMITTED_METHOD] }
|
|
75
|
+
},
|
|
76
|
+
headers: fixture.create_session_headers()
|
|
77
|
+
});
|
|
78
|
+
if (!res.ok) {
|
|
79
|
+
throw new Error(`conformance: minting the 'scoped_token' principal failed with ${res.status}: ` +
|
|
80
|
+
JSON.stringify(res.error));
|
|
81
|
+
}
|
|
82
|
+
return res.result.token;
|
|
83
|
+
};
|
|
43
84
|
/**
|
|
44
85
|
* Map a `ConformancePrincipal` onto the transport + headers it
|
|
45
86
|
* authenticates with, reading exclusively from the per-test `TestFixture`.
|
|
46
87
|
*
|
|
47
88
|
* The five always-available principals resolve from fixture accessors;
|
|
48
89
|
* `role_holder` / `wrong_role` read a seeded `extra_accounts` entry named
|
|
49
|
-
* via `options.principals` (throws a clear setup error when unconfigured)
|
|
90
|
+
* via `options.principals` (throws a clear setup error when unconfigured);
|
|
91
|
+
* `scoped_token` mints its narrowed credential over the production path.
|
|
50
92
|
*/
|
|
51
|
-
const resolve_principal = async (fixture, as, principals) => {
|
|
93
|
+
const resolve_principal = async (fixture, as, principals, resolved_rpc_endpoints) => {
|
|
52
94
|
switch (as) {
|
|
53
95
|
case 'keeper':
|
|
54
96
|
// Keeper carries its session cookie via `create_session_headers`
|
|
@@ -60,7 +102,7 @@ const resolve_principal = async (fixture, as, principals) => {
|
|
|
60
102
|
return {
|
|
61
103
|
transport: fixture.fresh_transport({ origin: null }),
|
|
62
104
|
headers: fixture.create_daemon_token_headers(),
|
|
63
|
-
suppress_default_origin: true
|
|
105
|
+
suppress_default_origin: true
|
|
64
106
|
};
|
|
65
107
|
case 'invalid_daemon':
|
|
66
108
|
// A malformed `X-Daemon-Token` carried ALONGSIDE the keeper's session
|
|
@@ -76,9 +118,9 @@ const resolve_principal = async (fixture, as, principals) => {
|
|
|
76
118
|
return {
|
|
77
119
|
transport: fixture.fresh_transport({ origin: null }),
|
|
78
120
|
headers: fixture.create_session_headers({
|
|
79
|
-
[DAEMON_TOKEN_HEADER]: INVALID_DAEMON_TOKEN_VALUE
|
|
121
|
+
[DAEMON_TOKEN_HEADER]: INVALID_DAEMON_TOKEN_VALUE
|
|
80
122
|
}),
|
|
81
|
-
suppress_default_origin: true
|
|
123
|
+
suppress_default_origin: true
|
|
82
124
|
};
|
|
83
125
|
case 'daemon_browser':
|
|
84
126
|
// A VALID `X-Daemon-Token` carried in a browser context (default Origin
|
|
@@ -93,14 +135,14 @@ const resolve_principal = async (fixture, as, principals) => {
|
|
|
93
135
|
// guard), the 403 here proves the valid token was discarded, not honored.
|
|
94
136
|
return {
|
|
95
137
|
transport: fixture.transport,
|
|
96
|
-
headers: fixture.create_session_headers(fixture.create_daemon_token_headers())
|
|
138
|
+
headers: fixture.create_session_headers(fixture.create_daemon_token_headers())
|
|
97
139
|
};
|
|
98
140
|
case 'token':
|
|
99
141
|
// Bearer is discarded in a browser context — empty jar + no Origin.
|
|
100
142
|
return {
|
|
101
143
|
transport: fixture.fresh_transport({ origin: null }),
|
|
102
144
|
headers: fixture.create_bearer_headers(),
|
|
103
|
-
suppress_default_origin: true
|
|
145
|
+
suppress_default_origin: true
|
|
104
146
|
};
|
|
105
147
|
case 'bearer_browser':
|
|
106
148
|
// A VALID bearer api-token in a browser context (default Origin
|
|
@@ -114,8 +156,19 @@ const resolve_principal = async (fixture, as, principals) => {
|
|
|
114
156
|
// honored (a non-discarding leg would authenticate → 200).
|
|
115
157
|
return {
|
|
116
158
|
transport: fixture.fresh_transport(),
|
|
117
|
-
headers: fixture.create_bearer_headers()
|
|
159
|
+
headers: fixture.create_bearer_headers()
|
|
118
160
|
};
|
|
161
|
+
case 'scoped_token': {
|
|
162
|
+
// A narrowed bearer, otherwise identical to `token` — empty jar + no
|
|
163
|
+
// Origin, so the credential is honored rather than browser-discarded
|
|
164
|
+
// and the scope gate is what any denial comes from.
|
|
165
|
+
const token = await mint_scoped_token(fixture, resolved_rpc_endpoints);
|
|
166
|
+
return {
|
|
167
|
+
transport: fixture.fresh_transport({ origin: null }),
|
|
168
|
+
headers: { authorization: `Bearer ${token}` },
|
|
169
|
+
suppress_default_origin: true
|
|
170
|
+
};
|
|
171
|
+
}
|
|
119
172
|
case 'anonymous':
|
|
120
173
|
// Fresh jar so the keeper cookie (cross-process) can't leak in.
|
|
121
174
|
return { transport: fixture.fresh_transport(), headers: {} };
|
|
@@ -189,7 +242,7 @@ const assert_absent_fields = (body, absent, label) => {
|
|
|
189
242
|
export const FINGERPRINT_HEADERS = [
|
|
190
243
|
'server',
|
|
191
244
|
'x-powered-by',
|
|
192
|
-
'www-authenticate'
|
|
245
|
+
'www-authenticate'
|
|
193
246
|
];
|
|
194
247
|
/**
|
|
195
248
|
* Assert a response carries none of the `FINGERPRINT_HEADERS`. Run on every
|
|
@@ -237,7 +290,7 @@ const is_success_status = (status) => status >= 200 && status < 300;
|
|
|
237
290
|
*/
|
|
238
291
|
const run_case = async (c, options, resolved_rpc_endpoints) => {
|
|
239
292
|
const fixture = await options.setup_test();
|
|
240
|
-
const { transport, headers, suppress_default_origin } = await resolve_principal(fixture, c.request.as, options.principals);
|
|
293
|
+
const { transport, headers, suppress_default_origin } = await resolve_principal(fixture, c.request.as, options.principals, resolved_rpc_endpoints);
|
|
241
294
|
const normalized = c.request.method.startsWith('/')
|
|
242
295
|
? await run_rest_case(c, options, transport, headers)
|
|
243
296
|
: await run_rpc_case(c, transport, headers, suppress_default_origin, resolved_rpc_endpoints);
|
|
@@ -263,7 +316,7 @@ const run_rpc_case = async (c, transport, headers, suppress_default_origin, reso
|
|
|
263
316
|
params: c.request.params,
|
|
264
317
|
headers,
|
|
265
318
|
...(c.request.verb && { verb: c.request.verb }),
|
|
266
|
-
...(suppress_default_origin && { suppress_default_origin: true })
|
|
319
|
+
...(suppress_default_origin && { suppress_default_origin: true })
|
|
267
320
|
});
|
|
268
321
|
assert_response_headers(res.headers, c);
|
|
269
322
|
if (is_success_status(c.expect.status)) {
|
|
@@ -308,7 +361,7 @@ const run_rest_case = async (c, options, transport, headers) => {
|
|
|
308
361
|
method: verb,
|
|
309
362
|
headers: { 'Content-Type': 'application/json', ...headers },
|
|
310
363
|
...(verb !== 'GET' &&
|
|
311
|
-
c.request.params !== undefined && { body: JSON.stringify(c.request.params) })
|
|
364
|
+
c.request.params !== undefined && { body: JSON.stringify(c.request.params) })
|
|
312
365
|
};
|
|
313
366
|
const response = await transport(route.path, init);
|
|
314
367
|
assert_response_headers(headers_to_record(response.headers), c);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cookie_attributes.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cookie_attributes.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA+C9B,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"cookie_attributes.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/cookie_attributes.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AA+C9B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,6DAA6D;AAC7D,MAAM,WAAW,gCAAgC;IAChD,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,6DAA6D;IAC7D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC9B;AAoED,eAAO,MAAM,sCAAsC,GAClD,SAAS,gCAAgC,KACvC,IAmFF,CAAC"}
|
|
@@ -110,7 +110,7 @@ export const describe_cookie_attributes_cross_tests = (options) => {
|
|
|
110
110
|
const res = await fixture.fresh_transport()(login_path, {
|
|
111
111
|
method: 'POST',
|
|
112
112
|
headers: { 'content-type': 'application/json' },
|
|
113
|
-
body: JSON.stringify({ username, password: DEFAULT_TEST_PASSWORD })
|
|
113
|
+
body: JSON.stringify({ username, password: DEFAULT_TEST_PASSWORD })
|
|
114
114
|
});
|
|
115
115
|
assert.strictEqual(res.status, 200, 'valid credentials must log in');
|
|
116
116
|
const cookie = find_session_cookie(res, cookie_name);
|
|
@@ -126,7 +126,7 @@ export const describe_cookie_attributes_cross_tests = (options) => {
|
|
|
126
126
|
const res = await fixture.fresh_transport()(login_path, {
|
|
127
127
|
method: 'POST',
|
|
128
128
|
headers: { 'content-type': 'application/json' },
|
|
129
|
-
body: JSON.stringify({ username, password: `wrong-${DEFAULT_TEST_PASSWORD}` })
|
|
129
|
+
body: JSON.stringify({ username, password: `wrong-${DEFAULT_TEST_PASSWORD}` })
|
|
130
130
|
});
|
|
131
131
|
assert.strictEqual(res.status, 401, 'wrong password must be rejected');
|
|
132
132
|
assert.strictEqual(find_session_cookie(res, cookie_name), undefined, 'a failed login must not Set-Cookie a session — no credential is minted on denial');
|
|
@@ -140,13 +140,13 @@ export const describe_cookie_attributes_cross_tests = (options) => {
|
|
|
140
140
|
const login_res = await transport(login_path, {
|
|
141
141
|
method: 'POST',
|
|
142
142
|
headers: { 'content-type': 'application/json' },
|
|
143
|
-
body: JSON.stringify({ username, password: DEFAULT_TEST_PASSWORD })
|
|
143
|
+
body: JSON.stringify({ username, password: DEFAULT_TEST_PASSWORD })
|
|
144
144
|
});
|
|
145
145
|
assert.strictEqual(login_res.status, 200, 'precondition: login must succeed');
|
|
146
146
|
const res = await transport(logout_path, {
|
|
147
147
|
method: 'POST',
|
|
148
148
|
headers: { 'content-type': 'application/json' },
|
|
149
|
-
body: JSON.stringify({})
|
|
149
|
+
body: JSON.stringify({})
|
|
150
150
|
});
|
|
151
151
|
assert.strictEqual(res.status, 200, 'logout must succeed for an authenticated session');
|
|
152
152
|
const cookie = find_session_cookie(res, cookie_name);
|
|
@@ -53,5 +53,5 @@ export interface CrossBackendGlobalSetupOptions {
|
|
|
53
53
|
* Build a vitest `globalSetup` default export. Returns the
|
|
54
54
|
* `(project) => teardown` function vitest 4 expects.
|
|
55
55
|
*/
|
|
56
|
-
export declare const create_cross_backend_global_setup: ({ configs, derive_name, provide_key
|
|
56
|
+
export declare const create_cross_backend_global_setup: ({ configs, derive_name, provide_key }: CrossBackendGlobalSetupOptions) => ((project: TestProject) => Promise<() => Promise<void>>);
|
|
57
57
|
//# sourceMappingURL=create_cross_backend_global_setup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create_cross_backend_global_setup.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/create_cross_backend_global_setup.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"create_cross_backend_global_setup.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/create_cross_backend_global_setup.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAYzD,MAAM,WAAW,8BAA8B;IAC9C;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,aAAa,CAAC,CAAC,CAAC;IAChE;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC;IACxD;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;GAGG;AACH,eAAO,MAAM,iCAAiC,GAAI,uCAI/C,8BAA8B,KAAG,CAAC,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAqB1F,CAAC"}
|
|
@@ -12,7 +12,7 @@ const DEFAULT_PROJECT_NAME_PREFIX = /^cross_backend_(?:ts_)?/;
|
|
|
12
12
|
* Build a vitest `globalSetup` default export. Returns the
|
|
13
13
|
* `(project) => teardown` function vitest 4 expects.
|
|
14
14
|
*/
|
|
15
|
-
export const create_cross_backend_global_setup = ({ configs, derive_name = (project_name) => project_name.replace(DEFAULT_PROJECT_NAME_PREFIX, ''), provide_key = 'backend_handle'
|
|
15
|
+
export const create_cross_backend_global_setup = ({ configs, derive_name = (project_name) => project_name.replace(DEFAULT_PROJECT_NAME_PREFIX, ''), provide_key = 'backend_handle' }) => {
|
|
16
16
|
return async (project) => {
|
|
17
17
|
const name = derive_name(project.name);
|
|
18
18
|
const factory = configs[name];
|
|
@@ -60,5 +60,5 @@ export interface DualSpawnGlobalSetupOptions {
|
|
|
60
60
|
/**
|
|
61
61
|
* Build a vitest `globalSetup` default export that spawns both backends.
|
|
62
62
|
*/
|
|
63
|
-
export declare const create_dual_spawn_global_setup: ({ configs, provide_keys
|
|
63
|
+
export declare const create_dual_spawn_global_setup: ({ configs, provide_keys }: DualSpawnGlobalSetupOptions) => ((project: TestProject) => Promise<() => Promise<void>>);
|
|
64
64
|
//# sourceMappingURL=create_dual_spawn_global_setup.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create_dual_spawn_global_setup.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/create_dual_spawn_global_setup.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"create_dual_spawn_global_setup.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/create_dual_spawn_global_setup.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD,MAAM,WAAW,2BAA2B;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,aAAa,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,aAAa,CAAA;KAAE,CAAC;IACvF;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACnE;AAED;;GAEG;AACH,eAAO,MAAM,8BAA8B,GAAI,2BAG5C,2BAA2B,KAAG,CAAC,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAmBvF,CAAC"}
|
|
@@ -4,7 +4,7 @@ import { serialize_bootstrapped_handle } from './setup.js';
|
|
|
4
4
|
/**
|
|
5
5
|
* Build a vitest `globalSetup` default export that spawns both backends.
|
|
6
6
|
*/
|
|
7
|
-
export const create_dual_spawn_global_setup = ({ configs, provide_keys = { a: 'parity_handle_a', b: 'parity_handle_b' }
|
|
7
|
+
export const create_dual_spawn_global_setup = ({ configs, provide_keys = { a: 'parity_handle_a', b: 'parity_handle_b' } }) => {
|
|
8
8
|
return async (project) => {
|
|
9
9
|
const a = await bootstrap_backend(configs.a());
|
|
10
10
|
// Tear `a` down if `b` fails to spawn — no orphaned child process.
|
|
@@ -152,7 +152,7 @@ export const describe_credential_header_robustness_cross_tests = (options) => {
|
|
|
152
152
|
// parser may close without a readable response — that's also "no smuggle".
|
|
153
153
|
const malformed = [
|
|
154
154
|
{ label: 'CRLF header-split', value: `${GARBAGE_TOKEN}\r\nX-Injected: 1` },
|
|
155
|
-
{ label: 'bare CR', value: `${GARBAGE_TOKEN}\rX-Injected: 1` }
|
|
155
|
+
{ label: 'bare CR', value: `${GARBAGE_TOKEN}\rX-Injected: 1` }
|
|
156
156
|
];
|
|
157
157
|
for (const { label, value } of malformed) {
|
|
158
158
|
const req = rpc_post(host, rpc_path, [`${DAEMON_TOKEN_HEADER}: ${value}`], purge_body('ctrl-char'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default_backend_configs.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/default_backend_configs.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"default_backend_configs.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/default_backend_configs.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAA4B,KAAK,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAQhG;;;;;;;;;;GAUG;AACH,eAAO,MAAM,4BAA4B,iCAAiC,CAAC;AAE3E;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,mBA2BpC,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAE,mBAsBtC,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,EAAE,iBAInC,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,EAAE,iBAIrC,CAAC;AAeH,MAAM,WAAW,iCAAiC;IACjD,gFAAgF;IAChF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sCAAsC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C,oDAAoD;IACpD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,6CAA6C;IAC7C,QAAQ,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAAC;IAC5C,wEAAwE;IACxE,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAClC,sEAAsE;IACtE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC/D;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;;OAMG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,GAC1C,MAAM,iCAAiC,KACrC,aAoCF,CAAC;AAEF,MAAM,WAAW,mCAAmC;IACnD,gFAAgF;IAChF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sCAAsC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,4DAA4D;IAC5D,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C;;;;OAIG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,+CAA+C;IAC/C,QAAQ,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAAC;IAC5C,wEAAwE;IACxE,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAClC,sEAAsE;IACtE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC/D;;;;OAIG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED;;;;;GAKG;AACH,eAAO,MAAM,gCAAgC,GAC5C,MAAM,mCAAmC,KACvC,aA4CF,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import '../assert_dev_env.js';
|
|
2
2
|
import { build_test_backend_paths } from './build_test_backend_paths.js';
|
|
3
|
-
import { default_test_bootstrap_token, default_test_cookie_keys, default_test_keeper_password, default_test_keeper_username
|
|
3
|
+
import { default_test_bootstrap_token, default_test_cookie_keys, default_test_keeper_password, default_test_keeper_username } from './default_secrets.js';
|
|
4
4
|
/**
|
|
5
5
|
* Env var both spine binaries read to enable their login rate limiters
|
|
6
6
|
* (`'true'` on / unset off). The cross-language contract for the login-security
|
|
@@ -44,7 +44,7 @@ export const ts_default_capabilities = Object.freeze({
|
|
|
44
44
|
// Off by default — the `cell_gated_create` test policy is a fuz_app test
|
|
45
45
|
// fixture, mounted only on the spine binaries (`ts_spine_*`), not generic
|
|
46
46
|
// consumers.
|
|
47
|
-
cell_gated_create: false
|
|
47
|
+
cell_gated_create: false
|
|
48
48
|
});
|
|
49
49
|
/**
|
|
50
50
|
* Capabilities for the Rust family. The non-gating wiring facts live in
|
|
@@ -72,7 +72,7 @@ export const rust_default_capabilities = Object.freeze({
|
|
|
72
72
|
peer_request: true,
|
|
73
73
|
// Off by default — the `testing_spine_stub` preset opts in (it mounts the
|
|
74
74
|
// `TestCellGatedCreateAuthorize` policy); a generic Rust consumer doesn't.
|
|
75
|
-
cell_gated_create: false
|
|
75
|
+
cell_gated_create: false
|
|
76
76
|
});
|
|
77
77
|
/**
|
|
78
78
|
* Shape notes for TS-family backends — wiring facts, not gating flags.
|
|
@@ -84,7 +84,7 @@ export const rust_default_capabilities = Object.freeze({
|
|
|
84
84
|
export const ts_default_shape_notes = Object.freeze({
|
|
85
85
|
bearer_auth: true,
|
|
86
86
|
trusted_proxy: false,
|
|
87
|
-
login_rate_limit: false
|
|
87
|
+
login_rate_limit: false
|
|
88
88
|
});
|
|
89
89
|
/**
|
|
90
90
|
* Shape notes for Rust-family backends — wiring facts, not gating flags. Adds
|
|
@@ -96,7 +96,7 @@ export const ts_default_shape_notes = Object.freeze({
|
|
|
96
96
|
export const rust_default_shape_notes = Object.freeze({
|
|
97
97
|
bearer_auth: true,
|
|
98
98
|
trusted_proxy: true,
|
|
99
|
-
login_rate_limit: true
|
|
99
|
+
login_rate_limit: true
|
|
100
100
|
});
|
|
101
101
|
/** Bootstrap block built from the default secrets + supplied paths. */
|
|
102
102
|
const build_default_bootstrap = (paths, overrides) => ({
|
|
@@ -105,7 +105,7 @@ const build_default_bootstrap = (paths, overrides) => ({
|
|
|
105
105
|
username: default_test_keeper_username,
|
|
106
106
|
password: default_test_keeper_password,
|
|
107
107
|
daemon_token_path: paths.daemon_token_path,
|
|
108
|
-
...overrides
|
|
108
|
+
...overrides
|
|
109
109
|
});
|
|
110
110
|
/**
|
|
111
111
|
* Shared builder for TS-family backends (Deno + Node). Owns the common
|
|
@@ -114,7 +114,7 @@ const build_default_bootstrap = (paths, overrides) => ({
|
|
|
114
114
|
* genuinely differs.
|
|
115
115
|
*/
|
|
116
116
|
export const make_default_ts_backend_config = (opts) => {
|
|
117
|
-
const { name, port, start_command, database_url = 'memory://', extra_env, capabilities = ts_default_capabilities, paths = build_test_backend_paths(name), bootstrap_overrides, port_env_var = 'PORT', cookie_name = 'fuz_session'
|
|
117
|
+
const { name, port, start_command, database_url = 'memory://', extra_env, capabilities = ts_default_capabilities, paths = build_test_backend_paths(name), bootstrap_overrides, port_env_var = 'PORT', cookie_name = 'fuz_session' } = opts;
|
|
118
118
|
return {
|
|
119
119
|
name,
|
|
120
120
|
start_command,
|
|
@@ -133,10 +133,10 @@ export const make_default_ts_backend_config = (opts) => {
|
|
|
133
133
|
SECRET_FUZ_COOKIE_KEYS: default_test_cookie_keys,
|
|
134
134
|
FUZ_ALLOWED_ORIGINS: 'http://localhost:*',
|
|
135
135
|
FUZ_BOOTSTRAP_TOKEN_PATH: paths.bootstrap_token_path,
|
|
136
|
-
...extra_env
|
|
136
|
+
...extra_env
|
|
137
137
|
},
|
|
138
138
|
bootstrap: build_default_bootstrap(paths, bootstrap_overrides),
|
|
139
|
-
capabilities
|
|
139
|
+
capabilities
|
|
140
140
|
};
|
|
141
141
|
};
|
|
142
142
|
/**
|
|
@@ -146,7 +146,7 @@ export const make_default_ts_backend_config = (opts) => {
|
|
|
146
146
|
* the 120s startup window for cargo's first-run build cost.
|
|
147
147
|
*/
|
|
148
148
|
export const make_default_rust_backend_config = (opts) => {
|
|
149
|
-
const { name, port, start_command, database_url, extra_env, capabilities = rust_default_capabilities, paths = build_test_backend_paths(name), bootstrap_overrides, port_env_var = 'PORT', rust_log = 'info', cookie_name = 'fuz_session'
|
|
149
|
+
const { name, port, start_command, database_url, extra_env, capabilities = rust_default_capabilities, paths = build_test_backend_paths(name), bootstrap_overrides, port_env_var = 'PORT', rust_log = 'info', cookie_name = 'fuz_session' } = opts;
|
|
150
150
|
return {
|
|
151
151
|
name,
|
|
152
152
|
start_command,
|
|
@@ -172,9 +172,9 @@ export const make_default_rust_backend_config = (opts) => {
|
|
|
172
172
|
// `fuz_db::run_migrations`. The `_testing_reset` RPC action
|
|
173
173
|
// (per-test reset) is orthogonal.
|
|
174
174
|
FUZ_TESTING_RESET_DB_ON_STARTUP: 'true',
|
|
175
|
-
...extra_env
|
|
175
|
+
...extra_env
|
|
176
176
|
},
|
|
177
177
|
bootstrap: build_default_bootstrap(paths, bootstrap_overrides),
|
|
178
|
-
capabilities
|
|
178
|
+
capabilities
|
|
179
179
|
};
|
|
180
180
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default_spine_surface.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/default_spine_surface.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"default_spine_surface.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/default_spine_surface.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAItD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8CAA8C,CAAC;AACvF,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAEtF,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAI1F,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAe3E;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,cAAc,CAAC,MAAM,CAAwC,CAAC;AAElG;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW,EAAE,gBAGxB,CAAC;AAEH,+CAA+C;AAC/C,MAAM,WAAW,wBAAwB;IACxC;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACzD;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,mBAAmB,GAC/B,KAAK,gBAAgB,EACrB,UAAU,wBAAwB,KAChC,KAAK,CAAC,eAAe,CAQvB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,wBAAwB,GAAI,KAAK,gBAAgB,KAAG,KAAK,CAAC,SAAS,CA+B/E,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,6BAA6B,GAAI,MAAM,MAAM,KAAG,SAC+B,CAAC;AAE7F;;;;;;;;GAQG;AACH,eAAO,MAAM,yBAAyB,QAAO,cAM1C,CAAC"}
|
|
@@ -14,7 +14,7 @@ import { create_test_app_surface_spec } from '../stubs.js';
|
|
|
14
14
|
// without dragging this module's eager in-process route handlers
|
|
15
15
|
// (→ `session_middleware` → `hono/cookie`). Import only the constants this
|
|
16
16
|
// module uses internally; callers that need a bare constant reach for the leaf.
|
|
17
|
-
import { SPINE_CELL_EDITOR_ROLE, SPINE_EXPECTED_SCHEMA_URL, SPINE_PARTICIPANT_ROLE, SPINE_RPC_PATH
|
|
17
|
+
import { SPINE_CELL_EDITOR_ROLE, SPINE_EXPECTED_SCHEMA_URL, SPINE_PARTICIPANT_ROLE, SPINE_RPC_PATH } from './spine_surface_constants.js';
|
|
18
18
|
/**
|
|
19
19
|
* Session config — cookie name matches the binary's issued session cookie
|
|
20
20
|
* (`fuz_session`) so cookie-attribute assertions + jar extraction line up.
|
|
@@ -33,7 +33,7 @@ export const spine_session_options = create_session_config('fuz_session');
|
|
|
33
33
|
*/
|
|
34
34
|
export const spine_roles = create_role_schema([
|
|
35
35
|
{ name: SPINE_CELL_EDITOR_ROLE, grant_paths: [] },
|
|
36
|
-
{ name: SPINE_PARTICIPANT_ROLE, grant_paths: [GRANT_PATH_ADMIN] }
|
|
36
|
+
{ name: SPINE_PARTICIPANT_ROLE, grant_paths: [GRANT_PATH_ADMIN] }
|
|
37
37
|
]);
|
|
38
38
|
/**
|
|
39
39
|
* Factory-form RPC endpoints over the per-test `ctx.deps`. `create_app_server`
|
|
@@ -53,8 +53,8 @@ export const spine_roles = create_role_schema([
|
|
|
53
53
|
export const spine_rpc_endpoints = (ctx, options) => [
|
|
54
54
|
{
|
|
55
55
|
path: SPINE_RPC_PATH,
|
|
56
|
-
actions: create_standard_rpc_actions({ ...ctx.deps, notification_sender: options?.notification_sender ?? null }, { roles: spine_roles })
|
|
57
|
-
}
|
|
56
|
+
actions: create_standard_rpc_actions({ ...ctx.deps, notification_sender: options?.notification_sender ?? null }, { roles: spine_roles })
|
|
57
|
+
}
|
|
58
58
|
];
|
|
59
59
|
/**
|
|
60
60
|
* Account REST + signup route specs under `/api/account` (bootstrap
|
|
@@ -81,7 +81,7 @@ export const create_spine_route_specs = (ctx) => [
|
|
|
81
81
|
ip_rate_limiter: ctx.ip_rate_limiter,
|
|
82
82
|
login_account_rate_limiter: ctx.login_account_rate_limiter,
|
|
83
83
|
login_fail_floor_ms: 0,
|
|
84
|
-
bootstrap_status: ctx.bootstrap_status
|
|
84
|
+
bootstrap_status: ctx.bootstrap_status
|
|
85
85
|
}),
|
|
86
86
|
...create_signup_route_specs(ctx.deps, {
|
|
87
87
|
session_options: spine_session_options,
|
|
@@ -92,12 +92,12 @@ export const create_spine_route_specs = (ctx) => [
|
|
|
92
92
|
// don't each pay the 250ms timing floor. Mirrors `login_fail_floor_ms: 0`
|
|
93
93
|
// above — the floor is a production timing-oracle defense, not
|
|
94
94
|
// behavior any cross test asserts.
|
|
95
|
-
signup_fail_floor_ms: 0
|
|
96
|
-
})
|
|
95
|
+
signup_fail_floor_ms: 0
|
|
96
|
+
})
|
|
97
97
|
]),
|
|
98
98
|
...(ctx.audit_sse
|
|
99
99
|
? prefix_route_specs('/api/admin', create_audit_log_route_specs({ stream: ctx.audit_sse }))
|
|
100
|
-
: [])
|
|
100
|
+
: [])
|
|
101
101
|
];
|
|
102
102
|
/**
|
|
103
103
|
* The spine's `/ready` route spec — the column-presence schema-drift deploy
|
|
@@ -123,5 +123,5 @@ export const create_spine_surface_spec = () => create_test_app_surface_spec({
|
|
|
123
123
|
session_options: spine_session_options,
|
|
124
124
|
create_route_specs: create_spine_route_specs,
|
|
125
125
|
rpc_endpoints: spine_rpc_endpoints,
|
|
126
|
-
bootstrap: { mode: 'surface_only' }
|
|
126
|
+
bootstrap: { mode: 'surface_only' }
|
|
127
127
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fact_serving.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/fact_serving.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAiD9B,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"fact_serving.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/fact_serving.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAiD9B,OAAO,KAAK,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEtE;;;;;GAKG;AACH,MAAM,WAAW,2BAA4B,SAAQ,wBAAwB;IAC5E,QAAQ,CAAC,sBAAsB,CAAC,EAAE,SAAS,CAAC;CAC5C;AA8BD,eAAO,MAAM,iCAAiC,GAAI,SAAS,2BAA2B,KAAG,IAiOxF,CAAC"}
|
|
@@ -38,7 +38,7 @@ import '../assert_dev_env.js';
|
|
|
38
38
|
*/
|
|
39
39
|
import { describe, assert } from 'vitest';
|
|
40
40
|
import { z } from 'zod';
|
|
41
|
-
import { FactHashSchema } from '@fuzdev/fuz_util/
|
|
41
|
+
import { FactHashSchema } from '@fuzdev/fuz_util/hash_schemas.ts';
|
|
42
42
|
import { CellCreateOutput } from '../../auth/cell_action_specs.js';
|
|
43
43
|
import { test_if } from './capabilities.js';
|
|
44
44
|
import { cross_rpc_call, expect_output } from './cell_cross_helpers.js';
|
|
@@ -61,7 +61,7 @@ const fact_get = async (transport, path, headers) => {
|
|
|
61
61
|
return {
|
|
62
62
|
status: res.status,
|
|
63
63
|
content_type: res.headers.get('content-type'),
|
|
64
|
-
text: await res.text()
|
|
64
|
+
text: await res.text()
|
|
65
65
|
};
|
|
66
66
|
};
|
|
67
67
|
export const describe_fact_serving_cross_tests = (options) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"full_spine_mount.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/full_spine_mount.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"full_spine_mount.d.ts","sourceRoot":"../src/lib/","sources":["../../../src/lib/testing/cross_backend/full_spine_mount.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8CAA8C,CAAC;AAKvF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AAS3E,2FAA2F;AAC3F,MAAM,WAAW,qBAAqB;IACrC;;;;;;OAMG;IACH,QAAQ,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;IAC9C;;;;OAIG;IACH,QAAQ,CAAC,mBAAmB,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACzD;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,4BAA4B,GACxC,MAAM,OAAO,EACb,SAAS,qBAAqB,KAC5B,KAAK,CAAC,SAAS,CAoCjB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,GACpC,KAAK,gBAAgB,EACrB,SAAS,qBAAqB,KAC5B,KAAK,CAAC,eAAe,CAEvB,CAAC"}
|