@jantstack/adonis-authz 2.0.0-alpha.1 → 2.4.0-alpha.10

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 (224) hide show
  1. package/README.md +934 -40
  2. package/build/commands/authz_catalog_diff.d.ts.map +1 -1
  3. package/build/commands/authz_catalog_diff.js +1 -2
  4. package/build/commands/authz_catalog_diff.js.map +1 -1
  5. package/build/commands/authz_catalog_prune_orphans.d.ts +78 -0
  6. package/build/commands/authz_catalog_prune_orphans.d.ts.map +1 -0
  7. package/build/commands/authz_catalog_prune_orphans.js +135 -0
  8. package/build/commands/authz_catalog_prune_orphans.js.map +1 -0
  9. package/build/commands/authz_catalog_sync.d.ts +17 -0
  10. package/build/commands/authz_catalog_sync.d.ts.map +1 -1
  11. package/build/commands/authz_catalog_sync.js +27 -4
  12. package/build/commands/authz_catalog_sync.js.map +1 -1
  13. package/build/commands/authz_freeze.d.ts +44 -0
  14. package/build/commands/authz_freeze.d.ts.map +1 -0
  15. package/build/commands/authz_freeze.js +94 -0
  16. package/build/commands/authz_freeze.js.map +1 -0
  17. package/build/commands/authz_reconcile.d.ts +111 -0
  18. package/build/commands/authz_reconcile.d.ts.map +1 -0
  19. package/build/commands/authz_reconcile.js +417 -0
  20. package/build/commands/authz_reconcile.js.map +1 -0
  21. package/build/commands/authz_relations_reconcile.d.ts +144 -0
  22. package/build/commands/authz_relations_reconcile.d.ts.map +1 -0
  23. package/build/commands/authz_relations_reconcile.js +438 -0
  24. package/build/commands/authz_relations_reconcile.js.map +1 -0
  25. package/build/commands/authz_scopes_relay.d.ts +97 -0
  26. package/build/commands/authz_scopes_relay.d.ts.map +1 -0
  27. package/build/commands/authz_scopes_relay.js +344 -0
  28. package/build/commands/authz_scopes_relay.js.map +1 -0
  29. package/build/commands/authz_scopes_requeue.d.ts +80 -0
  30. package/build/commands/authz_scopes_requeue.d.ts.map +1 -0
  31. package/build/commands/authz_scopes_requeue.js +230 -0
  32. package/build/commands/authz_scopes_requeue.js.map +1 -0
  33. package/build/commands/authz_unfreeze.d.ts +45 -0
  34. package/build/commands/authz_unfreeze.d.ts.map +1 -0
  35. package/build/commands/authz_unfreeze.js +157 -0
  36. package/build/commands/authz_unfreeze.js.map +1 -0
  37. package/build/commands/main.d.ts +16 -8
  38. package/build/commands/main.d.ts.map +1 -1
  39. package/build/commands/main.js +59 -6
  40. package/build/commands/main.js.map +1 -1
  41. package/build/commands/openfga_provision.d.ts +92 -4
  42. package/build/commands/openfga_provision.d.ts.map +1 -1
  43. package/build/commands/openfga_provision.js +155 -7
  44. package/build/commands/openfga_provision.js.map +1 -1
  45. package/build/configure.d.ts +11 -0
  46. package/build/configure.d.ts.map +1 -1
  47. package/build/configure.js +37 -1
  48. package/build/configure.js.map +1 -1
  49. package/build/index.d.ts +50 -11
  50. package/build/index.d.ts.map +1 -1
  51. package/build/index.js +49 -7
  52. package/build/index.js.map +1 -1
  53. package/build/providers/authz_provider.d.ts +31 -2
  54. package/build/providers/authz_provider.d.ts.map +1 -1
  55. package/build/providers/authz_provider.js +65 -2
  56. package/build/providers/authz_provider.js.map +1 -1
  57. package/build/services/relations.d.ts +14 -0
  58. package/build/services/relations.d.ts.map +1 -0
  59. package/build/services/relations.js +17 -0
  60. package/build/services/relations.js.map +1 -0
  61. package/build/src/{catalog.d.ts → catalog/catalog.d.ts} +41 -2
  62. package/build/src/catalog/catalog.d.ts.map +1 -0
  63. package/build/src/{catalog.js → catalog/catalog.js} +120 -14
  64. package/build/src/catalog/catalog.js.map +1 -0
  65. package/build/src/{catalog_cache.d.ts → catalog/catalog_cache.d.ts} +46 -22
  66. package/build/src/catalog/catalog_cache.d.ts.map +1 -0
  67. package/build/src/{catalog_cache.js → catalog/catalog_cache.js} +53 -43
  68. package/build/src/catalog/catalog_cache.js.map +1 -0
  69. package/build/src/define_config.d.ts +206 -3
  70. package/build/src/define_config.d.ts.map +1 -1
  71. package/build/src/define_config.js +11 -0
  72. package/build/src/define_config.js.map +1 -1
  73. package/build/src/drivers/database_driver.d.ts +128 -7
  74. package/build/src/drivers/database_driver.d.ts.map +1 -1
  75. package/build/src/drivers/database_driver.js +510 -24
  76. package/build/src/drivers/database_driver.js.map +1 -1
  77. package/build/src/drivers/database_relations_driver.d.ts +140 -0
  78. package/build/src/drivers/database_relations_driver.d.ts.map +1 -0
  79. package/build/src/drivers/database_relations_driver.js +748 -0
  80. package/build/src/drivers/database_relations_driver.js.map +1 -0
  81. package/build/src/drivers/openfga_driver.d.ts +777 -122
  82. package/build/src/drivers/openfga_driver.d.ts.map +1 -1
  83. package/build/src/drivers/openfga_driver.js +2228 -477
  84. package/build/src/drivers/openfga_driver.js.map +1 -1
  85. package/build/src/drivers/openfga_facts.d.ts +384 -0
  86. package/build/src/drivers/openfga_facts.d.ts.map +1 -0
  87. package/build/src/drivers/openfga_facts.js +836 -0
  88. package/build/src/drivers/openfga_facts.js.map +1 -0
  89. package/build/src/drivers/openfga_relations_driver.d.ts +186 -0
  90. package/build/src/drivers/openfga_relations_driver.d.ts.map +1 -0
  91. package/build/src/drivers/openfga_relations_driver.js +724 -0
  92. package/build/src/drivers/openfga_relations_driver.js.map +1 -0
  93. package/build/src/errors.d.ts +430 -6
  94. package/build/src/errors.d.ts.map +1 -1
  95. package/build/src/errors.js +453 -6
  96. package/build/src/errors.js.map +1 -1
  97. package/build/src/freeze.d.ts +200 -0
  98. package/build/src/freeze.d.ts.map +1 -0
  99. package/build/src/freeze.js +306 -0
  100. package/build/src/freeze.js.map +1 -0
  101. package/build/src/http/app_access_middleware.d.ts.map +1 -0
  102. package/build/src/http/app_access_middleware.js.map +1 -0
  103. package/build/src/http/resource_access_middleware.d.ts +105 -0
  104. package/build/src/http/resource_access_middleware.d.ts.map +1 -0
  105. package/build/src/http/resource_access_middleware.js +81 -0
  106. package/build/src/http/resource_access_middleware.js.map +1 -0
  107. package/build/src/identity.d.ts +74 -1
  108. package/build/src/identity.d.ts.map +1 -1
  109. package/build/src/identity.js +100 -2
  110. package/build/src/identity.js.map +1 -1
  111. package/build/src/manager.d.ts +549 -6
  112. package/build/src/manager.d.ts.map +1 -1
  113. package/build/src/manager.js +2243 -193
  114. package/build/src/manager.js.map +1 -1
  115. package/build/src/models/authz_assignment.d.ts +7 -7
  116. package/build/src/models/authz_assignment.d.ts.map +1 -1
  117. package/build/src/models/authz_deny.d.ts +7 -7
  118. package/build/src/models/authz_deny.d.ts.map +1 -1
  119. package/build/src/models/authz_permission.d.ts +7 -7
  120. package/build/src/models/authz_permission.d.ts.map +1 -1
  121. package/build/src/models/authz_role.d.ts +7 -7
  122. package/build/src/models/authz_role.d.ts.map +1 -1
  123. package/build/src/models/authz_role_permission.d.ts +7 -7
  124. package/build/src/models/authz_role_permission.d.ts.map +1 -1
  125. package/build/src/openfga.d.ts +18 -2
  126. package/build/src/openfga.d.ts.map +1 -1
  127. package/build/src/openfga.js +15 -1
  128. package/build/src/openfga.js.map +1 -1
  129. package/build/src/reconcile.d.ts +37 -0
  130. package/build/src/reconcile.d.ts.map +1 -0
  131. package/build/src/reconcile.js +69 -0
  132. package/build/src/reconcile.js.map +1 -0
  133. package/build/src/relation_partition_trigger.d.ts +8 -0
  134. package/build/src/relation_partition_trigger.d.ts.map +1 -0
  135. package/build/src/relation_partition_trigger.js +93 -0
  136. package/build/src/relation_partition_trigger.js.map +1 -0
  137. package/build/src/relations/define_relations_config.d.ts +109 -0
  138. package/build/src/relations/define_relations_config.d.ts.map +1 -0
  139. package/build/src/relations/define_relations_config.js +211 -0
  140. package/build/src/relations/define_relations_config.js.map +1 -0
  141. package/build/src/relations/manager.d.ts +138 -0
  142. package/build/src/relations/manager.d.ts.map +1 -0
  143. package/build/src/relations/manager.js +494 -0
  144. package/build/src/relations/manager.js.map +1 -0
  145. package/build/src/relations/reconcile.d.ts +137 -0
  146. package/build/src/relations/reconcile.d.ts.map +1 -0
  147. package/build/src/relations/reconcile.js +294 -0
  148. package/build/src/relations/reconcile.js.map +1 -0
  149. package/build/src/relations_config_store.d.ts +22 -0
  150. package/build/src/relations_config_store.d.ts.map +1 -0
  151. package/build/src/relations_config_store.js +74 -0
  152. package/build/src/relations_config_store.js.map +1 -0
  153. package/build/src/scope_outbox.d.ts +123 -0
  154. package/build/src/scope_outbox.d.ts.map +1 -0
  155. package/build/src/scope_outbox.js +532 -0
  156. package/build/src/scope_outbox.js.map +1 -0
  157. package/build/src/{drivers → shared}/backend_guard.d.ts +42 -0
  158. package/build/src/shared/backend_guard.d.ts.map +1 -0
  159. package/build/src/{drivers → shared}/backend_guard.js +78 -1
  160. package/build/src/shared/backend_guard.js.map +1 -0
  161. package/build/src/{drivers → shared}/sql_expiry.d.ts +2 -0
  162. package/build/src/shared/sql_expiry.d.ts.map +1 -0
  163. package/build/src/{drivers → shared}/sql_expiry.js +4 -0
  164. package/build/src/shared/sql_expiry.js.map +1 -0
  165. package/build/src/shared/transaction_guard.d.ts +53 -0
  166. package/build/src/shared/transaction_guard.d.ts.map +1 -0
  167. package/build/src/shared/transaction_guard.js +74 -0
  168. package/build/src/shared/transaction_guard.js.map +1 -0
  169. package/build/src/sql_descendants.d.ts +55 -1
  170. package/build/src/sql_descendants.d.ts.map +1 -1
  171. package/build/src/sql_descendants.js +75 -1
  172. package/build/src/sql_descendants.js.map +1 -1
  173. package/build/src/testing/contract.d.ts +129 -4
  174. package/build/src/testing/contract.d.ts.map +1 -1
  175. package/build/src/testing/contract.js +915 -177
  176. package/build/src/testing/contract.js.map +1 -1
  177. package/build/src/testing/main.d.ts +10 -2
  178. package/build/src/testing/main.d.ts.map +1 -1
  179. package/build/src/testing/main.js +5 -1
  180. package/build/src/testing/main.js.map +1 -1
  181. package/build/src/testing/migration_contract.d.ts +293 -0
  182. package/build/src/testing/migration_contract.d.ts.map +1 -0
  183. package/build/src/testing/migration_contract.js +589 -0
  184. package/build/src/testing/migration_contract.js.map +1 -0
  185. package/build/src/testing/relations_contract.d.ts +73 -0
  186. package/build/src/testing/relations_contract.d.ts.map +1 -0
  187. package/build/src/testing/relations_contract.js +1238 -0
  188. package/build/src/testing/relations_contract.js.map +1 -0
  189. package/build/src/testing/relations_reconcile_contract.d.ts +24 -0
  190. package/build/src/testing/relations_reconcile_contract.d.ts.map +1 -0
  191. package/build/src/testing/relations_reconcile_contract.js +220 -0
  192. package/build/src/testing/relations_reconcile_contract.js.map +1 -0
  193. package/build/src/testing/scope_outbox_contract.d.ts +98 -0
  194. package/build/src/testing/scope_outbox_contract.d.ts.map +1 -0
  195. package/build/src/testing/scope_outbox_contract.js +677 -0
  196. package/build/src/testing/scope_outbox_contract.js.map +1 -0
  197. package/build/src/traits/authz_scopes.js +1 -1
  198. package/build/src/traits/authz_scopes.js.map +1 -1
  199. package/build/src/traits/has_uuid.d.ts +8 -8
  200. package/build/src/traits/has_uuid.d.ts.map +1 -1
  201. package/build/src/types.d.ts +1537 -84
  202. package/build/src/types.d.ts.map +1 -1
  203. package/build/src/types.js +65 -0
  204. package/build/src/types.js.map +1 -1
  205. package/build/stubs/config/authorization.stub +149 -5
  206. package/build/stubs/migration.stub +136 -0
  207. package/build/stubs/scopes_outbox_migration.stub +57 -0
  208. package/package.json +4 -2
  209. package/build/commands/openfga_import.d.ts +0 -34
  210. package/build/commands/openfga_import.d.ts.map +0 -1
  211. package/build/commands/openfga_import.js +0 -97
  212. package/build/commands/openfga_import.js.map +0 -1
  213. package/build/src/catalog.d.ts.map +0 -1
  214. package/build/src/catalog.js.map +0 -1
  215. package/build/src/catalog_cache.d.ts.map +0 -1
  216. package/build/src/catalog_cache.js.map +0 -1
  217. package/build/src/drivers/backend_guard.d.ts.map +0 -1
  218. package/build/src/drivers/backend_guard.js.map +0 -1
  219. package/build/src/drivers/sql_expiry.d.ts.map +0 -1
  220. package/build/src/drivers/sql_expiry.js.map +0 -1
  221. package/build/src/middleware/app_access_middleware.d.ts.map +0 -1
  222. package/build/src/middleware/app_access_middleware.js.map +0 -1
  223. /package/build/src/{middleware → http}/app_access_middleware.d.ts +0 -0
  224. /package/build/src/{middleware → http}/app_access_middleware.js +0 -0
@@ -1,6 +1,6 @@
1
1
  import '@japa/assert';
2
2
  import type { Assert } from '@japa/assert';
3
- import type { AuthorizationDriver, CatalogSpec } from '../types.js';
3
+ import type { AuthorizationDriver, CatalogSpec, SubjectRef } from '../types.js';
4
4
  import type { ContractScopeTree } from './scope_tree.js';
5
5
  /**
6
6
  * Suite de contrato del sistema de autorización — EL JUEZ.
@@ -12,7 +12,7 @@ import type { ContractScopeTree } from './scope_tree.js';
12
12
  * runAuthorizationDriverContract({
13
13
  * name: 'mi-driver',
14
14
  * level: '2.0', // omitido = 'core': solo los casos de 1.x
15
- * capabilities: { hierarchyFacts: false, transactions: false, truncationSignal: false,
15
+ * capabilities: { hierarchyFacts: false, transactionalWrites: false, truncationSignal: false,
16
16
  * singleCheckAuthorize: false, injectableClock: false },
17
17
  * seedCatalog: (catalog) => ..., // materializa roles/permisos
18
18
  * makeDriver: (tree) => new MiDriver({ resolveChain: ... }), // recibe el árbol
@@ -41,8 +41,29 @@ import type { ContractScopeTree } from './scope_tree.js';
41
41
  export interface DriverCapabilities {
42
42
  /** El driver materializa el árbol como hechos propios (Fase 3b). */
43
43
  hierarchyFacts: boolean;
44
- /** Acepta `{ trx }` externa en las escrituras (Fase 2.5). */
45
- transactions: boolean;
44
+ /**
45
+ * **`{ transaction }` en `grant`/`revoke`/`deny`/`removeDeny` ESCRIBE en
46
+ * la transacción del consumidor** — «los dos o ninguno con TU transacción»,
47
+ * nunca «no se pierde» (L-2, panel `{trx}` (C); mismo nombre que
48
+ * `AuthorizationDriverCapabilities.transactionalWrites` y que su par de
49
+ * relaciones). Es el ÚNICO par del juez con las DOS caras obligatorias:
50
+ * `true` sin caso `whenTrue` Y `false` sin caso `whenFalse` hacen que la
51
+ * suite lance al registrarse (los demás pares solo exigen la cara `true`;
52
+ * la lección de 4-2 es que una `whenFalse` ausente se salta en silencio).
53
+ * Con `false` el juez fija que `{ transaction }` es 500 `E_AUTHZ_UNSUPPORTED`
54
+ * nombrando driver y operación con CERO llamadas al driver (espía), y que
55
+ * `requireTransactionalWrites: true` lo convierte en 500 `E_AUTHZ_CONFIG`
56
+ * al RESOLVER. Con `true` (L-3) el juez abre una transacción de la conexión
57
+ * del driver (`DriverContractHarness.transactions`, default Lucid +
58
+ * `authz_*`) y fija, para las cuatro escrituras, que **rollback ⇒ CERO
59
+ * filas por CENSO** (no solo `authorize`), commit ⇒ aplicado, la escritura
60
+ * sin confirmar invisible para la autoridad, y que una transacción ajena es
61
+ * 500 `E_AUTHZ_CONFIG` sin una sentencia. `database` declara `true` (con
62
+ * pool ≥ 2; en `:memory:` el harness del paquete declara `false` porque la
63
+ * autoridad no tendría por dónde leer); `openfga` no puede ser otra cosa que
64
+ * `false`: una tupla no entra en una transacción SQL.
65
+ */
66
+ transactionalWrites: boolean;
46
67
  /**
47
68
  * Los `list*` lanzan si el backend trunca. Ningún driver del paquete trunca
48
69
  * (L0.7 se cerró enumerando con `Read` paginado), así que no hay caso para
@@ -89,6 +110,19 @@ export interface DriverCapabilities {
89
110
  * store entero. En un harness por debajo de `'2.2'` declara `false`.
90
111
  */
91
112
  purgeRole: boolean;
113
+ /**
114
+ * `countRoleAssignments(uuids)` está implementado de verdad (3b-2j): el
115
+ * driver sabe decir cuántos hechos VIGENTES tiene cada rol, que es lo que
116
+ * hace verdadero el `stillGranting` de `pruneOrphanRoles` —el campo que se
117
+ * lee justo antes de un borrado destructivo—. Con `true` se juzga el
118
+ * conteo (caducidad estricta, por posición, 422 por uuid mal formado); con
119
+ * `false`, que el barrido diga `undefined` y **nunca** `false`: «no lo sé»
120
+ * no puede degradar a «no concede». Solo tiene casos en `level: '2.2'`.
121
+ *
122
+ * **Es la capacidad que este lote estrena y es breaking**: un driver de
123
+ * terceros de 2.2 la declara `false` hasta que traiga el método.
124
+ */
125
+ countRoleAssignments: boolean;
92
126
  /**
93
127
  * Las escrituras del CATÁLOGO se serializan de verdad en el motor (3E ·
94
128
  * R2, tester): dos `defineScopedRole` del mismo `(slug, nivel)` en
@@ -105,6 +139,67 @@ export interface DriverCapabilities {
105
139
  * convierte la colisión en 503. Solo tiene casos en `level: '2.2'`.
106
140
  */
107
141
  serializedCatalogWrites: boolean;
142
+ /**
143
+ * El backend resuelve la MEMBRESÍA por sí mismo (3b-2e · E2). **`false` en
144
+ * los dos drivers del paquete, también en el modo `facts`** (panel 2, cruce
145
+ * 6): `hasRole`, `listRoles`, `listRoleScopes`, `listSubjects` y
146
+ * `listScopes` siguen usando el `resolveChain` del consumidor. Con `false`
147
+ * el juez lo DEMUESTRA con un espía sobre el árbol, que es lo que impide
148
+ * vender «sin SQL en el camino caliente» a secas: lo cierto es «sin SQL por
149
+ * request en `authorize`». La cara `true` no tiene caso todavía: no hay
150
+ * driver que lo cumpla.
151
+ */
152
+ roleInheritanceNative: boolean;
153
+ /**
154
+ * Los `list*` enumeran también lo HEREDADO (3b-2e · E2). **`false` siempre
155
+ * en este paquete** (invariante 7): enumerar descendientes sería abierto, y
156
+ * en `openfga` obligaría a `ListObjects`, que trunca al tope del servidor
157
+ * SIN señal (S16, y `Check` y `ListObjects` ni siquiera coinciden en
158
+ * profundidad). Con `false` el juez fija que un grant en el ANCESTRO no
159
+ * aparece en las listas del descendiente aunque `authorize` diga `true`.
160
+ */
161
+ listObjectsInherited: boolean;
162
+ /**
163
+ * **Las LECTURAS canonizan la ortografía del scope contra el árbol del
164
+ * consumidor antes de buscar los hechos** (3b-2k · K1 · R2 (c)). El árbol
165
+ * del consumidor puede fundir dos formas del mismo id —el tipo `uuid` de
166
+ * PostgreSQL y la collation `*_ci` de MySQL leen `bbbb…` con y sin guiones
167
+ * como la MISMA fila—, y `authz_*` compara por bytes.
168
+ *
169
+ * Con `true` (driver `database`) `authorize` resuelve la cadena y usa
170
+ * `chain[0]`, la identidad CANÓNICA (invariante 17): un alias que el árbol
171
+ * funde con la fila real encuentra exactamente los mismos hechos que la
172
+ * forma canónica.
173
+ *
174
+ * Con `false` (`openfga` en modo `facts`) la DECISIÓN no pasa por el árbol
175
+ * —es la contrapartida de `singleCheckAuthorize`— así que el objeto del
176
+ * store se compone con la ortografía del LLAMANTE y un alias no encuentra
177
+ * nada: `authorize` responde `false` donde la forma canónica concede. Es
178
+ * fail-**CLOSED** y no evade ningún deny, pero **no es la misma respuesta
179
+ * que `database`** y por eso se declara. Lo que NO cambia es la ESCRITURA:
180
+ * `grant`/`revoke`/`removeDeny`/`purgeScope` sí canonizan en los dos
181
+ * drivers (3b-2h · 🟠 3 cerró la cara fail-open), y el juez lo fija en las
182
+ * DOS caras del par para que nadie lea esta capacidad como «en `facts` la
183
+ * ortografía da igual».
184
+ */
185
+ canonicalScopeReads: boolean;
186
+ /**
187
+ * El driver sabe ser el **ORIGEN** de `authz:reconcile` (3b-3b):
188
+ * `enumerateFacts` entrega sus hechos por páginas, con su caducidad y **sin
189
+ * filtrar** (una asignación caducada tiene que LLEGAR para que el destino
190
+ * la cuente en `skipped`; filtrarla la haría desaparecer sin rastro).
191
+ *
192
+ * Con `true` el juez pasea las páginas, comprueba que el cursor avanza,
193
+ * que no se devuelven más de `limit` hechos y que la caducada sale con su
194
+ * instante. Con `false` juzga que el driver no puede ser origen y que
195
+ * `authz:reconcile` lo DICE —500 `E_AUTHZ_UNSUPPORTED` nombrando el
196
+ * método— en vez de leer cero hechos y vaciar el destino con `--prune`.
197
+ *
198
+ * `false` en el driver `database` a propósito: sus hechos son
199
+ * `authz_assignments`/`authz_denies`, el esquema publicado del paquete, y
200
+ * el destino los lee de ahí. Solo tiene casos en `level: '2.2'`.
201
+ */
202
+ enumerateFacts: boolean;
108
203
  }
109
204
  export type ContractLevel = 'core' | '2.0' | '2.1' | '2.2';
110
205
  export interface DriverContractHarness {
@@ -133,7 +228,31 @@ export interface DriverContractHarness {
133
228
  */
134
229
  makeTwin?(driver: AuthorizationDriver, tree: ContractScopeTree): AuthorizationDriver | Promise<AuthorizationDriver>;
135
230
  cleanup(): Promise<void>;
231
+ /**
232
+ * Solo con `transactionalWrites: true` (L-3): cómo abre el juez una
233
+ * transacción de LA CONEXIÓN DEL DRIVER y cómo cuenta los hechos de un
234
+ * holder en el backend — el CENSO: el rollback se juzga por filas, no solo
235
+ * por la respuesta de `authorize` (la lección del contrato de migración).
236
+ * Default: `db.transaction()` de Lucid (conexión primaria) y
237
+ * `authz_assignments`/`authz_denies`, lo que vale para el driver `database`.
238
+ * Un driver de terceros con otra conexión u otras tablas trae el suyo.
239
+ */
240
+ transactions?: ContractTransactions;
241
+ }
242
+ /** Ver `DriverContractHarness.transactions`. */
243
+ export interface ContractTransactions {
244
+ begin(): Promise<{
245
+ client: unknown;
246
+ commit(): Promise<unknown>;
247
+ rollback(): Promise<unknown>;
248
+ }>;
249
+ census(subject: SubjectRef): Promise<{
250
+ assignments: number;
251
+ denies: number;
252
+ }>;
136
253
  }
254
+ /** El default de `DriverContractHarness.transactions`: Lucid + `authz_*`. */
255
+ export declare function lucidContractTransactions(): ContractTransactions;
137
256
  /**
138
257
  * Lo mínimo que el juez necesita del runner. En producción es el `test` de
139
258
  * Japa; en `tests/contract_harness.spec.ts` es una API falsa que solo anota
@@ -155,4 +274,10 @@ export interface ContractTestApi {
155
274
  }
156
275
  export declare function runAuthorizationDriverContract(harness: DriverContractHarness): void;
157
276
  export declare function registerAuthorizationDriverContract(harness: DriverContractHarness, api: ContractTestApi): void;
277
+ /**
278
+ * La regla del guard, PURA (para que `contract_harness.spec.ts` la juzgue sin
279
+ * borrar caras): una capacidad `true` sin caso registrado queda sin cubrir;
280
+ * y una de `BOTH_FACES_REQUIRED` queda sin cubrir con CUALQUIER valor.
281
+ */
282
+ export declare function uncoveredCapabilities(capabilities: DriverCapabilities, covered: ReadonlySet<keyof DriverCapabilities>): (keyof DriverCapabilities)[];
158
283
  //# sourceMappingURL=contract.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../../src/testing/contract.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,CAAA;AACrB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAG1C,OAAO,KAAK,EACV,mBAAmB,EAEnB,WAAW,EAKZ,MAAM,aAAa,CAAA;AAQpB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAExD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,oEAAoE;IACpE,cAAc,EAAE,OAAO,CAAA;IACvB,6DAA6D;IAC7D,YAAY,EAAE,OAAO,CAAA;IACrB;;;;;OAKG;IACH,gBAAgB,EAAE,OAAO,CAAA;IACzB,uEAAuE;IACvE,oBAAoB,EAAE,OAAO,CAAA;IAC7B;;;;;;;OAOG;IACH,eAAe,EAAE,OAAO,CAAA;IACxB;;;;;;OAMG;IACH,eAAe,EAAE,OAAO,CAAA;IACxB;;;;;;;OAOG;IACH,UAAU,EAAE,OAAO,CAAA;IACnB;;;;;;;;;OASG;IACH,SAAS,EAAE,OAAO,CAAA;IAClB;;;;;;;;;;;;;;OAcG;IACH,uBAAuB,EAAE,OAAO,CAAA;CACjC;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAA;AAE1D,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,kLAAkL;IAClL,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,YAAY,EAAE,kBAAkB,CAAA;IAChC,wFAAwF;IACxF,MAAM,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACpC;;;OAGG;IACH,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACnD,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACvC,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;IACvF;;;;;;OAMG;IACH,QAAQ,CAAC,CAAC,MAAM,EAAE,mBAAmB,EAAE,IAAI,EAAE,iBAAiB,GAAG,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;IACnH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACzB;AAiPD;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,CACH,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,CAAC,KAAK,EAAE;QACd,IAAI,EAAE;YAAE,KAAK,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAA;SAAE,CAAA;QACjD,QAAQ,CAAC,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAA;KAC3C,KAAK,IAAI,GACT,OAAO,CAAA;IACV,IAAI,CACF,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,CAAC,GAAG,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAC7C;QAAE,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAAG,SAAS,GAAG,IAAI,CAAA;CACvD;AAED,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,qBAAqB,QAK5E;AAED,wBAAgB,mCAAmC,CACjD,OAAO,EAAE,qBAAqB,EAC9B,GAAG,EAAE,eAAe,QAuyGrB"}
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../../src/testing/contract.ts"],"names":[],"mappings":"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"}