@jantstack/adonis-authz 1.1.0 → 2.4.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +837 -51
  3. package/build/commands/authz_catalog_diff.d.ts +28 -0
  4. package/build/commands/authz_catalog_diff.d.ts.map +1 -0
  5. package/build/commands/authz_catalog_diff.js +67 -0
  6. package/build/commands/authz_catalog_diff.js.map +1 -0
  7. package/build/commands/authz_catalog_prune_orphans.d.ts +78 -0
  8. package/build/commands/authz_catalog_prune_orphans.d.ts.map +1 -0
  9. package/build/commands/authz_catalog_prune_orphans.js +136 -0
  10. package/build/commands/authz_catalog_prune_orphans.js.map +1 -0
  11. package/build/commands/authz_catalog_sync.d.ts +37 -0
  12. package/build/commands/authz_catalog_sync.d.ts.map +1 -0
  13. package/build/commands/authz_catalog_sync.js +81 -0
  14. package/build/commands/authz_catalog_sync.js.map +1 -0
  15. package/build/commands/authz_freeze.d.ts +44 -0
  16. package/build/commands/authz_freeze.d.ts.map +1 -0
  17. package/build/commands/authz_freeze.js +95 -0
  18. package/build/commands/authz_freeze.js.map +1 -0
  19. package/build/commands/authz_reconcile.d.ts +102 -0
  20. package/build/commands/authz_reconcile.d.ts.map +1 -0
  21. package/build/commands/authz_reconcile.js +294 -0
  22. package/build/commands/authz_reconcile.js.map +1 -0
  23. package/build/commands/authz_relations_reconcile.d.ts +73 -0
  24. package/build/commands/authz_relations_reconcile.d.ts.map +1 -0
  25. package/build/commands/authz_relations_reconcile.js +225 -0
  26. package/build/commands/authz_relations_reconcile.js.map +1 -0
  27. package/build/commands/authz_scopes_relay.d.ts +47 -0
  28. package/build/commands/authz_scopes_relay.d.ts.map +1 -0
  29. package/build/commands/authz_scopes_relay.js +141 -0
  30. package/build/commands/authz_scopes_relay.js.map +1 -0
  31. package/build/commands/authz_unfreeze.d.ts +37 -0
  32. package/build/commands/authz_unfreeze.d.ts.map +1 -0
  33. package/build/commands/authz_unfreeze.js +92 -0
  34. package/build/commands/authz_unfreeze.js.map +1 -0
  35. package/build/commands/main.d.ts +8 -1
  36. package/build/commands/main.d.ts.map +1 -1
  37. package/build/commands/main.js +8 -1
  38. package/build/commands/main.js.map +1 -1
  39. package/build/commands/openfga_provision.d.ts +46 -4
  40. package/build/commands/openfga_provision.d.ts.map +1 -1
  41. package/build/commands/openfga_provision.js +91 -7
  42. package/build/commands/openfga_provision.js.map +1 -1
  43. package/build/configure.d.ts +11 -0
  44. package/build/configure.d.ts.map +1 -1
  45. package/build/configure.js +37 -1
  46. package/build/configure.js.map +1 -1
  47. package/build/index.d.ts +75 -7
  48. package/build/index.d.ts.map +1 -1
  49. package/build/index.js +67 -5
  50. package/build/index.js.map +1 -1
  51. package/build/providers/authz_provider.d.ts +26 -2
  52. package/build/providers/authz_provider.d.ts.map +1 -1
  53. package/build/providers/authz_provider.js +48 -2
  54. package/build/providers/authz_provider.js.map +1 -1
  55. package/build/services/relations.d.ts +14 -0
  56. package/build/services/relations.d.ts.map +1 -0
  57. package/build/services/relations.js +17 -0
  58. package/build/services/relations.js.map +1 -0
  59. package/build/src/catalog/catalog.d.ts +289 -0
  60. package/build/src/catalog/catalog.d.ts.map +1 -0
  61. package/build/src/catalog/catalog.js +859 -0
  62. package/build/src/catalog/catalog.js.map +1 -0
  63. package/build/src/catalog/catalog_cache.d.ts +324 -0
  64. package/build/src/catalog/catalog_cache.d.ts.map +1 -0
  65. package/build/src/catalog/catalog_cache.js +666 -0
  66. package/build/src/catalog/catalog_cache.js.map +1 -0
  67. package/build/src/clock.d.ts +24 -0
  68. package/build/src/clock.d.ts.map +1 -0
  69. package/build/src/clock.js +7 -0
  70. package/build/src/clock.js.map +1 -0
  71. package/build/src/define_config.d.ts +201 -7
  72. package/build/src/define_config.d.ts.map +1 -1
  73. package/build/src/define_config.js.map +1 -1
  74. package/build/src/drivers/database_driver.d.ts +324 -15
  75. package/build/src/drivers/database_driver.d.ts.map +1 -1
  76. package/build/src/drivers/database_driver.js +1107 -128
  77. package/build/src/drivers/database_driver.js.map +1 -1
  78. package/build/src/drivers/database_relations_driver.d.ts +75 -0
  79. package/build/src/drivers/database_relations_driver.d.ts.map +1 -0
  80. package/build/src/drivers/database_relations_driver.js +450 -0
  81. package/build/src/drivers/database_relations_driver.js.map +1 -0
  82. package/build/src/drivers/openfga_driver.d.ts +963 -55
  83. package/build/src/drivers/openfga_driver.d.ts.map +1 -1
  84. package/build/src/drivers/openfga_driver.js +2693 -372
  85. package/build/src/drivers/openfga_driver.js.map +1 -1
  86. package/build/src/drivers/openfga_facts.d.ts +369 -0
  87. package/build/src/drivers/openfga_facts.d.ts.map +1 -0
  88. package/build/src/drivers/openfga_facts.js +813 -0
  89. package/build/src/drivers/openfga_facts.js.map +1 -0
  90. package/build/src/drivers/openfga_relations_driver.d.ts +120 -0
  91. package/build/src/drivers/openfga_relations_driver.d.ts.map +1 -0
  92. package/build/src/drivers/openfga_relations_driver.js +466 -0
  93. package/build/src/drivers/openfga_relations_driver.js.map +1 -0
  94. package/build/src/errors.d.ts +586 -0
  95. package/build/src/errors.d.ts.map +1 -1
  96. package/build/src/errors.js +583 -0
  97. package/build/src/errors.js.map +1 -1
  98. package/build/src/expiry.d.ts +27 -0
  99. package/build/src/expiry.d.ts.map +1 -0
  100. package/build/src/expiry.js +50 -0
  101. package/build/src/expiry.js.map +1 -0
  102. package/build/src/freeze.d.ts +120 -0
  103. package/build/src/freeze.d.ts.map +1 -0
  104. package/build/src/freeze.js +172 -0
  105. package/build/src/freeze.js.map +1 -0
  106. package/build/src/hierarchical_resolver.d.ts +56 -0
  107. package/build/src/hierarchical_resolver.d.ts.map +1 -0
  108. package/build/src/hierarchical_resolver.js +87 -0
  109. package/build/src/hierarchical_resolver.js.map +1 -0
  110. package/build/src/{middleware → http}/app_access_middleware.d.ts +8 -6
  111. package/build/src/http/app_access_middleware.d.ts.map +1 -0
  112. package/build/src/{middleware → http}/app_access_middleware.js +10 -26
  113. package/build/src/http/app_access_middleware.js.map +1 -0
  114. package/build/src/http/resource_access_middleware.d.ts +105 -0
  115. package/build/src/http/resource_access_middleware.d.ts.map +1 -0
  116. package/build/src/http/resource_access_middleware.js +81 -0
  117. package/build/src/http/resource_access_middleware.js.map +1 -0
  118. package/build/src/identity.d.ts +228 -0
  119. package/build/src/identity.d.ts.map +1 -0
  120. package/build/src/identity.js +457 -0
  121. package/build/src/identity.js.map +1 -0
  122. package/build/src/manager.d.ts +536 -7
  123. package/build/src/manager.d.ts.map +1 -1
  124. package/build/src/manager.js +2676 -23
  125. package/build/src/manager.js.map +1 -1
  126. package/build/src/memoize_ancestors.d.ts +23 -0
  127. package/build/src/memoize_ancestors.d.ts.map +1 -0
  128. package/build/src/memoize_ancestors.js +42 -0
  129. package/build/src/memoize_ancestors.js.map +1 -0
  130. package/build/src/models/authz_assignment.d.ts +11 -11
  131. package/build/src/models/authz_assignment.d.ts.map +1 -1
  132. package/build/src/models/authz_deny.d.ts +11 -11
  133. package/build/src/models/authz_deny.d.ts.map +1 -1
  134. package/build/src/models/authz_permission.d.ts +17 -11
  135. package/build/src/models/authz_permission.d.ts.map +1 -1
  136. package/build/src/models/authz_permission.js +4 -0
  137. package/build/src/models/authz_permission.js.map +1 -1
  138. package/build/src/models/authz_role.d.ts +19 -12
  139. package/build/src/models/authz_role.d.ts.map +1 -1
  140. package/build/src/models/authz_role.js +6 -1
  141. package/build/src/models/authz_role.js.map +1 -1
  142. package/build/src/models/authz_role_permission.d.ts +11 -11
  143. package/build/src/models/authz_role_permission.d.ts.map +1 -1
  144. package/build/src/openfga.d.ts +29 -0
  145. package/build/src/openfga.d.ts.map +1 -0
  146. package/build/src/openfga.js +26 -0
  147. package/build/src/openfga.js.map +1 -0
  148. package/build/src/reconcile.d.ts +37 -0
  149. package/build/src/reconcile.d.ts.map +1 -0
  150. package/build/src/reconcile.js +69 -0
  151. package/build/src/reconcile.js.map +1 -0
  152. package/build/src/relation_partition_trigger.d.ts +8 -0
  153. package/build/src/relation_partition_trigger.d.ts.map +1 -0
  154. package/build/src/relation_partition_trigger.js +85 -0
  155. package/build/src/relation_partition_trigger.js.map +1 -0
  156. package/build/src/relations/define_relations_config.d.ts +58 -0
  157. package/build/src/relations/define_relations_config.d.ts.map +1 -0
  158. package/build/src/relations/define_relations_config.js +144 -0
  159. package/build/src/relations/define_relations_config.js.map +1 -0
  160. package/build/src/relations/manager.d.ts +38 -0
  161. package/build/src/relations/manager.d.ts.map +1 -0
  162. package/build/src/relations/manager.js +156 -0
  163. package/build/src/relations/manager.js.map +1 -0
  164. package/build/src/relations/reconcile.d.ts +62 -0
  165. package/build/src/relations/reconcile.d.ts.map +1 -0
  166. package/build/src/relations/reconcile.js +138 -0
  167. package/build/src/relations/reconcile.js.map +1 -0
  168. package/build/src/relations_config_store.d.ts +22 -0
  169. package/build/src/relations_config_store.d.ts.map +1 -0
  170. package/build/src/relations_config_store.js +74 -0
  171. package/build/src/relations_config_store.js.map +1 -0
  172. package/build/src/scope_outbox.d.ts +69 -0
  173. package/build/src/scope_outbox.d.ts.map +1 -0
  174. package/build/src/scope_outbox.js +291 -0
  175. package/build/src/scope_outbox.js.map +1 -0
  176. package/build/src/shared/backend_guard.d.ts +106 -0
  177. package/build/src/shared/backend_guard.d.ts.map +1 -0
  178. package/build/src/shared/backend_guard.js +246 -0
  179. package/build/src/shared/backend_guard.js.map +1 -0
  180. package/build/src/shared/sql_expiry.d.ts +53 -0
  181. package/build/src/shared/sql_expiry.d.ts.map +1 -0
  182. package/build/src/shared/sql_expiry.js +66 -0
  183. package/build/src/shared/sql_expiry.js.map +1 -0
  184. package/build/src/sql_descendants.d.ts +97 -0
  185. package/build/src/sql_descendants.d.ts.map +1 -0
  186. package/build/src/sql_descendants.js +203 -0
  187. package/build/src/sql_descendants.js.map +1 -0
  188. package/build/src/testing/contract.d.ts +212 -7
  189. package/build/src/testing/contract.d.ts.map +1 -1
  190. package/build/src/testing/contract.js +3449 -24
  191. package/build/src/testing/contract.js.map +1 -1
  192. package/build/src/testing/main.d.ts +10 -2
  193. package/build/src/testing/main.d.ts.map +1 -1
  194. package/build/src/testing/main.js +5 -1
  195. package/build/src/testing/main.js.map +1 -1
  196. package/build/src/testing/migration_contract.d.ts +284 -0
  197. package/build/src/testing/migration_contract.d.ts.map +1 -0
  198. package/build/src/testing/migration_contract.js +586 -0
  199. package/build/src/testing/migration_contract.js.map +1 -0
  200. package/build/src/testing/relations_contract.d.ts +51 -0
  201. package/build/src/testing/relations_contract.d.ts.map +1 -0
  202. package/build/src/testing/relations_contract.js +654 -0
  203. package/build/src/testing/relations_contract.js.map +1 -0
  204. package/build/src/testing/relations_reconcile_contract.d.ts +24 -0
  205. package/build/src/testing/relations_reconcile_contract.d.ts.map +1 -0
  206. package/build/src/testing/relations_reconcile_contract.js +172 -0
  207. package/build/src/testing/relations_reconcile_contract.js.map +1 -0
  208. package/build/src/testing/scope_tree.d.ts +65 -0
  209. package/build/src/testing/scope_tree.d.ts.map +1 -0
  210. package/build/src/testing/scope_tree.js +145 -0
  211. package/build/src/testing/scope_tree.js.map +1 -0
  212. package/build/src/traits/authz_scopes.d.ts +30 -6
  213. package/build/src/traits/authz_scopes.d.ts.map +1 -1
  214. package/build/src/traits/authz_scopes.js +30 -18
  215. package/build/src/traits/authz_scopes.js.map +1 -1
  216. package/build/src/traits/has_uuid.d.ts +12 -12
  217. package/build/src/traits/has_uuid.d.ts.map +1 -1
  218. package/build/src/types.d.ts +1313 -28
  219. package/build/src/types.d.ts.map +1 -1
  220. package/build/src/types.js +20 -4
  221. package/build/src/types.js.map +1 -1
  222. package/build/stubs/config/app_acl.stub +4 -2
  223. package/build/stubs/config/authorization.stub +168 -14
  224. package/build/stubs/migration.stub +183 -13
  225. package/build/stubs/scopes_outbox_migration.stub +57 -0
  226. package/package.json +14 -7
  227. package/build/commands/openfga_import.d.ts +0 -28
  228. package/build/commands/openfga_import.d.ts.map +0 -1
  229. package/build/commands/openfga_import.js +0 -74
  230. package/build/commands/openfga_import.js.map +0 -1
  231. package/build/src/catalog.d.ts +0 -3
  232. package/build/src/catalog.d.ts.map +0 -1
  233. package/build/src/catalog.js +0 -103
  234. package/build/src/catalog.js.map +0 -1
  235. package/build/src/middleware/app_access_middleware.d.ts.map +0 -1
  236. package/build/src/middleware/app_access_middleware.js.map +0 -1
@@ -1,5 +1,10 @@
1
- import type { AuthorizationDriver, GrantOptions, ScopeRef, ScopeType, SubjectRef } from '../types.js';
2
- import type { ScopeAncestorsResolver } from '../types.js';
1
+ import db from '@adonisjs/lucid/services/db';
2
+ import type { AuthorizationDriver, CatalogRoleRef, DenyRef, GrantOptions, GrantOutcome, NormalizedRoleQuery, ReconcileOptions, ReconcileReport, ReconcileSource, RoleQuery, ScopeRef, ScopeType, SubjectRef } from '../types.js';
3
+ import type { ScopeChainResolver } from '../types.js';
4
+ import { CatalogCache } from '../catalog/catalog_cache.js';
5
+ import type { CatalogRevalidate, CatalogRole, CatalogView } from '../catalog/catalog_cache.js';
6
+ import type { Clock } from '../clock.js';
7
+ export type QueryBuilder = ReturnType<typeof db.from>;
3
8
  /**
4
9
  * UUID centinela para el scope 'app' en las columnas scope_uuid (NOT NULL):
5
10
  * permite que el unique de assignments/denies cubra también el nivel app
@@ -7,6 +12,129 @@ import type { ScopeAncestorsResolver } from '../types.js';
7
12
  * de ESTE driver — la API pública sigue usando uuid null para app.
8
13
  */
9
14
  export declare const APP_SCOPE_DB_UUID = "00000000-0000-0000-0000-000000000000";
15
+ /**
16
+ * La vuelta de `toDbScopeUuid`: el centinela de la raíz vuelve a ser `null`.
17
+ * **Exportada desde 3b-3b**: `authz:reconcile --to=openfga` lee estas mismas
18
+ * columnas y hacía `row.scope_uuid ?? null`, que con la columna NOT NULL
19
+ * nunca es null — un grant o un deny en la RAÍZ reventaban la migración con
20
+ * un 422 a mitad de pasada (`el scope 'app' no admite uuid`). Lo cazó el
21
+ * contrato de migración, cuya siembra fija sí concede en `app`.
22
+ */
23
+ export declare function fromDbScopeUuid(uuid: string): string | null;
24
+ /**
25
+ * El rol `(slug, scopeType)` que existe en el scope cuya cadena empieza por
26
+ * `chainKeys`, o 422: `E_AUTHZ_ROLE_NOT_VISIBLE` si hay roles con ese nombre
27
+ * pero todos son locales a otro contenedor; `E_AUTHZ_UNKNOWN_ROLE` si no hay
28
+ * ninguno. Compartido por ambos drivers (3B · B2).
29
+ */
30
+ export declare function visibleRoleOrFail(catalog: CatalogView, slug: string, scope: ScopeRef, chainKeys: readonly string[]): CatalogRole;
31
+ /**
32
+ * EL rol al que apunta un `RoleQuery` en un scope concreto (3D · M1), para
33
+ * las rutas que direccionan un rol exacto (`grant`, `listSubjects`):
34
+ *
35
+ * - `{ uuid }`: resolución EXACTA, sin ambigüedad posible. Fuera del
36
+ * catálogo ⇒ 422 `E_AUTHZ_UNKNOWN_ROLE`; declarado para otro nivel o con
37
+ * el owner fuera de la cadena ⇒ 422 `E_AUTHZ_ROLE_NOT_VISIBLE` (no existe
38
+ * AQUÍ, que es lo mismo que decía la ruta por slug).
39
+ * - slug (con nivel opcional): `visibleRoleOrFail`, que ahora falla cerrado
40
+ * si hay más de un homónimo visible (422 `E_AUTHZ_AMBIGUOUS_ROLE`).
41
+ *
42
+ * Compartido por ambos drivers.
43
+ */
44
+ export declare function resolveRoleQuery(catalog: CatalogView, role: RoleQuery, scope: ScopeRef, chainKeys: readonly string[]): CatalogRole;
45
+ /**
46
+ * EL rol al que apunta un `RoleQuery` en un scope, para el camino de LECTURA
47
+ * (`listSubjects`): `null` si el catálogo no declara ninguno que exista ahí
48
+ * (invariante 5: desconocido no lanza). La AMBIGÜEDAD sí lanza (3D · M1):
49
+ * elegir uno de dos homónimos era enumerar los holders del otro tenant.
50
+ */
51
+ export declare function visibleRoleFor(catalog: CatalogView, query: NormalizedRoleQuery, scope: ScopeRef, chainKeys: readonly string[]): CatalogRole | null;
52
+ /**
53
+ * Los roles a los que un `RoleQuery` puede referirse en un scope, para
54
+ * `revoke` (3D · M1): por uuid, ESE rol (422 si el catálogo no lo declara);
55
+ * por slug, TODOS los homónimos `(slug, nivel)` — quitar nunca concede y el
56
+ * scope puede no existir ya para el árbol (D8), así que no se resuelve la
57
+ * ambigüedad: se quitan todos. 422 `E_AUTHZ_UNKNOWN_ROLE` si no hay ninguno.
58
+ */
59
+ export declare function rolesToRevoke(catalog: CatalogView, role: RoleQuery, scope: ScopeRef): CatalogRole[];
60
+ /**
61
+ * Los niveles de la cadena donde una asignación de ESE rol contaría, para
62
+ * `hasRole` (3D · M1): los scopes del tipo del rol desde los que el rol es
63
+ * visible por owner. `null` = el catálogo no declara nada que responda (la
64
+ * membresía es `false`, nunca un throw: invariante 5).
65
+ */
66
+ export declare function hasRoleTargets(catalog: CatalogView, role: RoleQuery, chain: ScopeRef[]): Array<{
67
+ scope: ScopeRef;
68
+ roleUuid: string;
69
+ }>;
70
+ /**
71
+ * Control de COMPOSICIÓN en la escritura (3B · B5, defensa en profundidad):
72
+ * un rol de nivel L que lleve un permiso cuyo `assignableAt` no incluye L no
73
+ * se asigna (422 `E_AUTHZ_ROLE_NOT_ASSIGNABLE_AT`). El sync y
74
+ * `defineScopedRole` ya lo rechazan al componer; aquí se cierra el vínculo
75
+ * escrito a mano. `authorize` NUNCA lo mira: lo ya asignado sigue
76
+ * concediendo (invariante 1).
77
+ */
78
+ export declare function assertRoleAssignableAt(catalog: CatalogView, role: CatalogRole): void;
79
+ /**
80
+ * EL rol de un uuid, si EXISTE en un scope de nivel `scopeType` cuya cadena
81
+ * tiene esas claves: declarado para ese nivel (D5/L0.6) y global o con el
82
+ * owner en la cadena desde ahí (3B · B2). `null` si no. Es la regla de
83
+ * visibilidad por uuid, en UN sitio (3D · N5): la usan `listRoles`,
84
+ * `rolesInChain`, `listRoleScopes`/`listScopes` (`visibleAt`) en `database`
85
+ * y `declaredRole` en `openfga`.
86
+ */
87
+ export declare function declaredRoleAt(catalog: CatalogView, roleUuid: string, scopeType: ScopeType, chainKeys: readonly string[]): CatalogRole | null;
88
+ /**
89
+ * Filtro (scope_type, scope_uuid) ∈ scopes (centinela para el nivel app).
90
+ *
91
+ * Con `scopes` VACÍO no hay filtro que construir, y "sin filtro" en SQL es
92
+ * "todas las filas": la consulta de denies sobre-bloquearía (cerrado) pero la
93
+ * de asignaciones concedería en CUALQUIER scope (abierto) — L0.1. Hoy ningún
94
+ * call-site pasa un conjunto vacío (la cadena siempre contiene el scope), pero
95
+ * `descendantsOf`/`authorizedScopes` (Fase 2) lo harán alcanzable:
96
+ * - lectura ⇒ `null`: nada puede coincidir, el llamante responde vacío/false
97
+ * SIN ejecutar la consulta;
98
+ * - escritura ⇒ 500: escribir "en ningún scope" es un bug de programación.
99
+ * Exportada (no método privado) para poder fijarlo con un test.
100
+ */
101
+ export declare function whereScopeIn(query: QueryBuilder, column: string, scopes: ScopeRef[], intent: 'write'): QueryBuilder;
102
+ export declare function whereScopeIn(query: QueryBuilder, column: string, scopes: ScopeRef[], intent: 'read'): QueryBuilder | null;
103
+ export interface DatabaseDriverOptions {
104
+ /** Jerarquía del consumidor: la cadena canónica de cada scope (ver `ScopeChainResolver`). */
105
+ resolveChain?: ScopeChainResolver;
106
+ /**
107
+ * Deadline de cada consulta SQL en ms (default 5000). Vencido ⇒ 503
108
+ * `E_AUTHZ_BACKEND_TIMEOUT`. Sin deadline, una base saturada convertía cada
109
+ * request autorizada en un socket retenido para siempre (L0.13).
110
+ */
111
+ timeoutMs?: number;
112
+ /**
113
+ * Memo del catálogo compartido con otro driver del mismo proceso (2A). Si
114
+ * se omite, el driver construye el suyo. Se revalida contra la versión
115
+ * compartida de la base (`authz_catalog_version`) según `catalogRevalidate`.
116
+ */
117
+ catalog?: CatalogCache;
118
+ /**
119
+ * Cuándo contrastar el memo con la versión compartida (2D · F1): `'always'`
120
+ * (default; un SELECT por clave primaria por pregunta) o `{ everyMs }`
121
+ * (opt-in: ventana acotada en la que un sync de OTRO proceso aún no se ve).
122
+ * Solo aplica al memo que construye este driver.
123
+ */
124
+ catalogRevalidate?: CatalogRevalidate;
125
+ /**
126
+ * Reloj de pared con el que el driver DECIDE la caducidad (2.5 · J1):
127
+ * `expires_at > now()` en cada lectura y los tres estados del re-grant.
128
+ * Default `() => new Date()`. Inyectable para fijar el instante en tests;
129
+ * en producción lo normal es no tocarlo (o pasar `clock` en el config del
130
+ * manager, que lo aplica con `withClock`). Los sellos de auditoría
131
+ * (`created_at`) NO lo usan (2.5-B · K5): son «cuándo se escribió», no
132
+ * una decisión, y con `TIMESTAMP` de MySQL un reloj inyectado en 2040
133
+ * hacía imposible escribir.
134
+ */
135
+ now?: Clock;
136
+ }
137
+ export declare const DEFAULT_TIMEOUT_MS = 5000;
10
138
  /**
11
139
  * Driver `database`: motor de autorización propio sobre las tablas `authz_*`.
12
140
  * Default autosuficiente del chasis (cero piezas extra en el appliance).
@@ -16,33 +144,214 @@ export declare const APP_SCOPE_DB_UUID = "00000000-0000-0000-0000-000000000000";
16
144
  * permiso vía su rol. La cadena es `[scope, ...ancestros]` — herencia solo
17
145
  * hacia abajo. Solo SQL estándar vía query builder (regla M6: nada
18
146
  * específico de un motor).
147
+ *
148
+ * Toda consulta pasa por `sql()`: un fallo del cliente SQL (conexión, tabla,
149
+ * deadline) sale como `AuthorizationBackendError` 503, nunca como el error
150
+ * crudo de knex (L0.11).
19
151
  */
20
152
  export declare class DatabaseAuthorizationDriver implements AuthorizationDriver {
153
+ /**
154
+ * Lo que este driver declara (3b-2e · E2). El árbol es del consumidor
155
+ * (`resolveChain`), así que no hay hechos de jerarquía ni deriva que
156
+ * mitigar; `authorize` son varias consultas SQL; la membresía la resuelve
157
+ * el propio SQL contra la cadena que le pasan; los `list*` no enumeran
158
+ * herencia (invariante 7); y `purgeRole` está implementado en una
159
+ * transacción.
160
+ */
161
+ readonly capabilities: Readonly<{
162
+ hierarchyFacts: false;
163
+ singleCheckAuthorize: false;
164
+ roleInheritanceNative: false;
165
+ listObjectsInherited: false;
166
+ purgeRole: true;
167
+ countRoleAssignments: true;
168
+ canonicalScopeReads: true;
169
+ enumerateFacts: false;
170
+ }>;
21
171
  /**
22
172
  * Resolutor de jerarquía inyectado por el consumidor (el chasis pasa el
23
173
  * suyo, que conoce organizations/units, en `config/authorization.ts`).
24
- * Default puro sin dominio: todo cuelga directamente de `app`.
174
+ * Sin él, el driver solo conoce la raíz (L0.3: ya no hay default plano).
175
+ */
176
+ private chainResolver;
177
+ private timeoutMs;
178
+ /** Reloj de pared del driver (J1): el ÚNICO `now` de todas sus DECISIONES temporales (no de los sellos, K5). */
179
+ private now;
180
+ /**
181
+ * Cómo viaja `expires_at` con este motor (2.5-B · K2): cadena UTC explícita
182
+ * en MySQL (sin depender de `timezone`/`TZ`), identidad en el resto. Se
183
+ * decide por dialecto en el primer uso (la conexión puede no estar lista al
184
+ * construir el driver).
185
+ */
186
+ private expiryCodec;
187
+ /**
188
+ * Memo del catálogo (2A): `findPermission`/`findRole` leen de aquí; los
189
+ * hechos (asignaciones, denies y el join con los vínculos) siguen en SQL en
190
+ * cada pregunta. Se revalida contra `authz_catalog_version` (2D · F1);
191
+ * `catalog.invalidate()` fuerza la recarga de ESTE memo.
192
+ */
193
+ readonly catalog: CatalogCache;
194
+ constructor(options?: DatabaseDriverOptions);
195
+ /**
196
+ * Vista de este driver con OTRO resolutor de la cadena y el mismo estado
197
+ * (conexión, memo del catálogo, deadline). Es lo que usa
198
+ * `AuthorizationManager.forRequest()` para leer con un resolutor memoizado
199
+ * sin tocar el driver compartido: el objeto devuelto hereda del original
200
+ * por prototipo y solo sobrescribe el resolutor.
201
+ */
202
+ withChainResolver(resolveChain: ScopeChainResolver): AuthorizationDriver;
203
+ /**
204
+ * Vista de este driver con OTRO reloj de pared (2.5 · J1) y el mismo estado
205
+ * (conexión, memo, deadline, resolutor). Es lo que aplica el manager con
206
+ * `config.clock` y lo que el juez usa para fijar el instante. Misma
207
+ * técnica que `withChainResolver`: herencia por prototipo, un campo.
208
+ */
209
+ withClock(now: Clock): AuthorizationDriver;
210
+ /**
211
+ * `[scope canónico, ...ancestros]`, o `null` si el scope no existe
212
+ * (lecturas: denegar). `chain[0]` —la fila del consumidor, no lo que
213
+ * escribió el llamante— es la identidad con la que se leen y escriben los
214
+ * hechos de ese scope (2.5-B · K1): un alias del uuid que el árbol funde
215
+ * con la fila real (tipo `uuid` de PG, collation `*_ci`) llega aquí ya
216
+ * canónico y el deny escrito canónico casa.
25
217
  */
26
- private resolveAncestors;
27
- constructor(options?: {
28
- resolveAncestors?: ScopeAncestorsResolver;
29
- });
30
218
  private chain;
31
- /** Filtro (scope_type, scope_uuid) scopes (centinela para el nivel app). */
32
- private whereScopeIn;
33
- /** Asignación vigente: sin expiración o con expiración futura. */
219
+ /** La cadena o 422: una escritura no puede ir a un scope que nadie reconoce. */
220
+ private knownScope;
221
+ /** El scope canónico para `purgeScope` (ver `canonicalScope`). */
222
+ private canonicalOrSelf;
223
+ /** Los destinos de un delete de hechos (`revoke`/`removeDeny`): canónico, o el fan-out de alias (3b-8 · A4). */
224
+ private canonicalTargets;
225
+ /**
226
+ * Ejecuta una consulta clasificando su fallo (503 con código propio). `fn`
227
+ * devuelve el BUILDER sin ejecutar: el guard le fija el deadline y luego lo
228
+ * ejecuta. Por eso no se usa `.first()` de Lucid (ejecuta al instante, sin
229
+ * dejar poner el timeout): `first()` de abajo hace `limit(1)` y toma la fila.
230
+ */
231
+ private sql;
232
+ private first;
233
+ private get expiry();
234
+ /** Asignación vigente: sin expiración o con expiración futura (estricta: la que vence AHORA ya no cuenta). */
34
235
  private whereActive;
35
236
  private findPermission;
36
- private findRoleOrFail;
237
+ /**
238
+ * Filtro «asignación VISIBLE en algún nivel de la cadena» (3B · B2), en
239
+ * SQL, sobre `authz_assignments as a` unida a `authz_roles as r`: por cada
240
+ * nivel `i`, el scope exacto Y el rol declarado para ese nivel Y (global O
241
+ * owner en `chain.slice(i)`). Sustituye a `whereScopeIn(chain)` en la
242
+ * consulta de `authorize`: mismo número de consultas, ahora con el owner
243
+ * decidido en la base (`owner_scope_key IN (...) OR 'global'`). La cadena
244
+ * viene validada (nunca vacía); L0.1 se conserva por si acaso.
245
+ */
246
+ private whereVisibleAssignmentIn;
37
247
  authorize(subject: SubjectRef, permission: string, scope: ScopeRef): Promise<boolean>;
38
- grant(subject: SubjectRef, role: string, scope: ScopeRef, options?: GrantOptions): Promise<void>;
39
- revoke(subject: SubjectRef, role: string, scope: ScopeRef): Promise<void>;
40
- hasRole(subject: SubjectRef, role: string, scope: ScopeRef): Promise<boolean>;
248
+ grant(subject: SubjectRef, role: RoleQuery, scope: ScopeRef, options?: GrantOptions): Promise<GrantOutcome>;
249
+ /**
250
+ * Re-grant sobre una asignación existente (L0.4): omitido preserva una
251
+ * caducidad vigente (o revive una expirada sin caducidad), `null` la quita,
252
+ * `Date` la fija. Solo se escribe si la caducidad cambia de verdad; si el
253
+ * UPDATE no toca ninguna fila (otro proceso la borró entre la lectura y la
254
+ * escritura, K4) devuelve `null`: no hay «existed: true» sobre nada.
255
+ */
256
+ private refreshAssignment;
257
+ revoke(subject: SubjectRef, role: RoleQuery, scope: ScopeRef): Promise<void>;
258
+ hasRole(subject: SubjectRef, role: RoleQuery, scope: ScopeRef): Promise<boolean>;
41
259
  deny(subject: SubjectRef, permission: string, scope: ScopeRef): Promise<void>;
42
260
  removeDeny(subject: SubjectRef, permission: string, scope: ScopeRef): Promise<void>;
43
- listSubjects(role: string, scope: ScopeRef): Promise<SubjectRef[]>;
261
+ listSubjects(role: RoleQuery, scope: ScopeRef): Promise<SubjectRef[]>;
44
262
  listRoles(subject: SubjectRef, scope: ScopeRef): Promise<string[]>;
263
+ /**
264
+ * Roles directos vigentes del holder en cada scope de la cadena (2D · G5):
265
+ * UNA consulta con `whereScopeIn(chain)` en vez de un `listRoles` por
266
+ * nivel. El filtro por catálogo (D5) es el memo, por uuid (3A · A2): el
267
+ * rol tiene que existir y estar declarado para el nivel de la asignación.
268
+ * La cadena viene ya resuelta por el manager.
269
+ */
270
+ rolesInChain(subject: SubjectRef, chain: ScopeRef[]): Promise<Array<{
271
+ scope: ScopeRef;
272
+ role: CatalogRoleRef;
273
+ }>>;
45
274
  listRoleScopes(subject: SubjectRef, scopeType: ScopeType): Promise<ScopeRef[]>;
275
+ /** ¿El rol (por uuid) existe en el scope cuya cadena tiene esas claves? (3B · B2, `declaredRoleAt`) */
276
+ private visibleAt;
46
277
  listScopes(subject: SubjectRef, permission: string): Promise<ScopeRef[]>;
278
+ /**
279
+ * Denies directos del holder (2.1, B5): del scope exacto o todos. Solo los
280
+ * de permisos que el catálogo declara (memo); los de scopes que el árbol
281
+ * no conoce no se listan (D8), como en `listRoleScopes`.
282
+ */
283
+ listDenies(subject: SubjectRef, scope?: ScopeRef): Promise<DenyRef[]>;
284
+ /**
285
+ * Borra asignaciones y denies del scope exacto, en una transacción. Si el
286
+ * árbol aún lo conoce se purga su identidad canónica (K1); si ya no (el
287
+ * consumidor borró la fila antes de avisar) se purga tal cual llegó. Con
288
+ * `DELETE` en SQL la propia sentencia demuestra el cero: no hay residuo
289
+ * posible.
290
+ */
291
+ purgeScope(purged: ScopeRef): Promise<void>;
292
+ /**
293
+ * Purga un rol con sus hechos (3B · B4): sus asignaciones en TODOS los
294
+ * scopes, sus vínculos y la fila, en UNA transacción que sube la versión
295
+ * compartida del catálogo como última sentencia (`withAuthzCatalogWrite`):
296
+ * los demás procesos dejan de verlo en su siguiente pregunta. Se lee la
297
+ * fila en fresco (no el memo): purgar es escribir. Con `DELETE` la propia
298
+ * sentencia demuestra el cero. Global o local: la barrera «los globales son
299
+ * inmutables» es del manager (`deleteScopedRole`); por aquí (plataforma,
300
+ * `manager.driver()`) se purga lo que se pida.
301
+ */
302
+ purgeRole(roleUuid: string): Promise<void>;
303
+ /**
304
+ * Cuántos hechos VIGENTES tiene cada rol, en todos los scopes (3b-2j). Es
305
+ * lo que `pruneOrphanRoles` necesita para decir si un huérfano todavía
306
+ * concede, y es una pregunta del PUERTO porque los hechos son del driver:
307
+ * aquí son filas de `authz_assignments`, en `openfga` son tuplas del store.
308
+ *
309
+ * Una consulta agrupada para todos los uuids (no una por rol) y la misma
310
+ * caducidad ESTRICTA que el resto del driver, con SU reloj (`whereActive`,
311
+ * J1): la asignación que vence ahora ya no cuenta, como no cuenta en
312
+ * `authorize`. Un rol sin hechos —o que no está en la tabla— es `0`.
313
+ */
314
+ countRoleAssignments(roleUuids: string[]): Promise<number[]>;
315
+ /**
316
+ * **Rehace `authz_assignments`/`authz_denies` desde los hechos de OTRO
317
+ * driver** — la vuelta de la migración, y con ella la simetría que el dueño
318
+ * compró: «todo en un driver o todo en otro».
319
+ *
320
+ * Qué se migra y qué NO, y por qué:
321
+ * - **los HECHOS, sí**: es lo único que vive en el otro driver. Llegan por
322
+ * `source.facts` —el puerto `enumerateFacts`, paginado— y no por SQL:
323
+ * aquí el origen es un store, no una tabla de este paquete.
324
+ * - **el ÁRBOL, no**. En esta dirección el árbol NO se migra: el driver
325
+ * `database` lo lee de las tablas del CONSUMIDOR en cada pregunta
326
+ * (`resolveChain`), que son su fuente de verdad. Copiarlo a algún sitio
327
+ * sería inventarse una segunda copia y con ella una deriva que hoy no
328
+ * existe. Se usa, eso sí, para decidir qué hecho es migrable
329
+ * (`unknown-scope`) y bajo qué identidad CANÓNICA se escribe
330
+ * (invariante 17).
331
+ * - **el CATÁLOGO, tampoco**: es propiedad local SIEMPRE (regla de higiene
332
+ * del paquete), ya está en `authz_*` y ningún driver es su fuente. Aquí
333
+ * solo se usa para traducir: un `roleUuid` que el catálogo no declara y
334
+ * un permiso que no existe no son hechos migrables.
335
+ *
336
+ * Por eso `phases.root`, `phases.catalog` y `phases.tree` son CERO en esta
337
+ * dirección, y todo el movimiento está en `phases.facts`. Es una respuesta,
338
+ * no un hueco: los ceros dicen «aquí no hay nada derivado que rehacer».
339
+ *
340
+ * El resto del contrato es el mismo que en la ida (3b-3a): idempotente (la
341
+ * segunda pasada escribe cero), `dryRun` es el VERIFICADOR y es read-only
342
+ * por contrato —**un `--fix` está prohibido** (cruce 4 · S18) y no se
343
+ * implementa ni se deja preparado—, nunca silenciosa (`skipped{motivo}` +
344
+ * `details`), los hechos que sobran solo se borran con `prune`, y el
345
+ * seguro del origen ciego (`E_AUTHZ_MASS_RECONCILE_REFUSED`) se aplica
346
+ * igual: un origen que devuelve CERO hechos y un `--prune` detrás vacían
347
+ * la base, y eso es casi siempre apuntar al store equivocado.
348
+ */
349
+ reconcile(source: ReconcileSource, options?: ReconcileOptions): Promise<ReconcileReport>;
350
+ /**
351
+ * Pasea una tabla `authz_*` por lotes con cursor sobre `uuid` (PK: orden
352
+ * total y estable). Lo mismo que hace `openfga.reconcile` con el origen,
353
+ * por el mismo motivo: una base grande no entra entera de golpe.
354
+ */
355
+ private eachReconcileRow;
47
356
  }
48
357
  //# sourceMappingURL=database_driver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"database_driver.d.ts","sourceRoot":"","sources":["../../../src/drivers/database_driver.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,mBAAmB,EACnB,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,UAAU,EACX,MAAM,aAAa,CAAA;AAEpB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AAIzD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,yCAAyC,CAAA;AAUvE;;;;;;;;;GASG;AACH,qBAAa,2BAA4B,YAAW,mBAAmB;IACrE;;;;OAIG;IACH,OAAO,CAAC,gBAAgB,CAAwB;gBAEpC,OAAO,GAAE;QAAE,gBAAgB,CAAC,EAAE,sBAAsB,CAAA;KAAO;YAKzD,KAAK;IAInB,8EAA8E;IAC9E,OAAO,CAAC,YAAY;IAUpB,kEAAkE;IAClE,OAAO,CAAC,WAAW;YAML,cAAc;YAId,cAAc;IAetB,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAkCrF,KAAK,CACT,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,QAAQ,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,IAAI,CAAC;IAqDV,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBzE,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAkB7E,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA2C7E,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAenF,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAiBlE,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAgBlE,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAY9E,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;CAkC/E"}
1
+ {"version":3,"file":"database_driver.d.ts","sourceRoot":"","sources":["../../../src/drivers/database_driver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAE5C,OAAO,KAAK,EACV,mBAAmB,EACnB,cAAc,EACd,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EAEf,eAAe,EACf,SAAS,EACT,QAAQ,EACR,SAAS,EACT,UAAU,EACX,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAyBrD,OAAO,EAAE,YAAY,EAAoF,MAAM,6BAA6B,CAAA;AAC5I,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAE9F,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAIxC,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAA;AAErD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,yCAAyC,CAAA;AAUvE;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAE3D;AAoED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,CAgBhI;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,WAAW,CA0BlI;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,mBAAmB,EAC1B,KAAK,EAAE,QAAQ,EACf,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,WAAW,GAAG,IAAI,CAQpB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,GAAG,WAAW,EAAE,CAWnG;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,QAAQ,EAAE,GAChB,KAAK,CAAC;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAe9C;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAMpF;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,WAAW,EACpB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,WAAW,GAAG,IAAI,CAIpB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,QAAQ,EAAE,EAClB,MAAM,EAAE,OAAO,GACd,YAAY,CAAA;AACf,wBAAgB,YAAY,CAC1B,KAAK,EAAE,YAAY,EACnB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,QAAQ,EAAE,EAClB,MAAM,EAAE,MAAM,GACb,YAAY,GAAG,IAAI,CAAA;AAwBtB,MAAM,WAAW,qBAAqB;IACpC,6FAA6F;IAC7F,YAAY,CAAC,EAAE,kBAAkB,CAAA;IACjC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,iBAAiB,CAAA;IACrC;;;;;;;;;OASG;IACH,GAAG,CAAC,EAAE,KAAK,CAAA;CACZ;AAED,eAAO,MAAM,kBAAkB,OAAQ,CAAA;AAEvC;;;;;;;;;;;;;GAaG;AACH,qBAAa,2BAA4B,YAAW,mBAAmB;IACrE;;;;;;;OAOG;IACH,QAAQ,CAAC,YAAY;;;;;;;;;OAgBnB;IACF;;;;OAIG;IACH,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,SAAS,CAAQ;IACzB,gHAAgH;IAChH,OAAO,CAAC,GAAG,CAAO;IAClB;;;;;OAKG;IACH,OAAO,CAAC,WAAW,CAA2B;IAC9C;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;gBAElB,OAAO,GAAE,qBAA0B;IAe/C;;;;;;OAMG;IACH,iBAAiB,CAAC,YAAY,EAAE,kBAAkB,GAAG,mBAAmB;IAMxE;;;;;OAKG;IACH,SAAS,CAAC,GAAG,EAAE,KAAK,GAAG,mBAAmB;IAS1C;;;;;;;OAOG;IACH,OAAO,CAAC,KAAK;IAIb,gFAAgF;IAChF,OAAO,CAAC,UAAU;IAIlB,kEAAkE;IAClE,OAAO,CAAC,eAAe;IAIvB,gHAAgH;IAChH,OAAO,CAAC,gBAAgB;IAIxB;;;;;OAKG;IACH,OAAO,CAAC,GAAG;YAIG,KAAK;IAKnB,OAAO,KAAK,MAAM,GAMjB;IAED,8GAA8G;IAC9G,OAAO,CAAC,WAAW;YASL,cAAc;IAI5B;;;;;;;;OAQG;IACH,OAAO,CAAC,wBAAwB;IAkB1B,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IA0CrF,KAAK,CACT,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,QAAQ,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,YAAY,CAAC;IAyExB;;;;;;OAMG;YACW,iBAAiB;IAezB,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAgC5E,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BhF,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAyC7E,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBnF,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAiCrE,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA+BxE;;;;;;OAMG;IACG,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,KAAK,EAAE,QAAQ,CAAC;QAAC,IAAI,EAAE,cAAc,CAAA;KAAE,CAAC,CAAC;IAqC/G,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAiCpF,uGAAuG;IACvG,OAAO,CAAC,SAAS;IAIX,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAsD9E;;;;OAIG;IACG,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAuB3E;;;;;;OAMG;IACG,UAAU,CAAC,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BjD;;;;;;;;;OASG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBhD;;;;;;;;;;OAUG;IACG,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAgBlE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCG;IACG,SAAS,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;IAsSlG;;;;OAIG;YACW,gBAAgB;CAkB/B"}