@jantstack/adonis-authz 2.5.0-alpha.2 → 2.5.0-alpha.4

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 (275) hide show
  1. package/README.md +743 -28
  2. package/build/commands/authz_catalog_diff.d.ts +0 -1
  3. package/build/commands/authz_catalog_diff.js +0 -1
  4. package/build/commands/authz_catalog_prune_orphans.d.ts +0 -1
  5. package/build/commands/authz_catalog_prune_orphans.js +0 -1
  6. package/build/commands/authz_catalog_sync.d.ts +0 -1
  7. package/build/commands/authz_catalog_sync.js +0 -1
  8. package/build/commands/authz_freeze.d.ts +0 -1
  9. package/build/commands/authz_freeze.js +0 -1
  10. package/build/commands/authz_reconcile.d.ts +0 -1
  11. package/build/commands/authz_reconcile.js +0 -1
  12. package/build/commands/authz_relations_reconcile.d.ts +6 -1
  13. package/build/commands/authz_relations_reconcile.js +163 -5
  14. package/build/commands/authz_scopes_relay.d.ts +0 -1
  15. package/build/commands/authz_scopes_relay.js +49 -5
  16. package/build/commands/authz_scopes_requeue.d.ts +0 -1
  17. package/build/commands/authz_scopes_requeue.js +14 -2
  18. package/build/commands/authz_unfreeze.d.ts +0 -1
  19. package/build/commands/authz_unfreeze.js +0 -1
  20. package/build/commands/main.d.ts +0 -1
  21. package/build/commands/main.js +0 -1
  22. package/build/commands/openfga_provision.d.ts +72 -1
  23. package/build/commands/openfga_provision.js +236 -4
  24. package/build/configure.d.ts +0 -1
  25. package/build/configure.js +0 -1
  26. package/build/index.d.ts +11 -9
  27. package/build/index.js +12 -5
  28. package/build/providers/authz_provider.d.ts +0 -1
  29. package/build/providers/authz_provider.js +0 -1
  30. package/build/services/main.d.ts +0 -1
  31. package/build/services/main.js +0 -1
  32. package/build/services/relations.d.ts +0 -1
  33. package/build/services/relations.js +0 -1
  34. package/build/src/catalog/catalog.d.ts +0 -1
  35. package/build/src/catalog/catalog.js +0 -1
  36. package/build/src/catalog/catalog_cache.d.ts +13 -1
  37. package/build/src/catalog/catalog_cache.js +25 -1
  38. package/build/src/clock.d.ts +0 -1
  39. package/build/src/clock.js +0 -1
  40. package/build/src/define_config.d.ts +0 -1
  41. package/build/src/define_config.js +24 -1
  42. package/build/src/drivers/database_driver.d.ts +6 -1
  43. package/build/src/drivers/database_driver.js +22 -2
  44. package/build/src/drivers/database_relations_driver.d.ts +46 -5
  45. package/build/src/drivers/database_relations_driver.js +297 -59
  46. package/build/src/drivers/openfga_driver.d.ts +159 -26
  47. package/build/src/drivers/openfga_driver.js +980 -231
  48. package/build/src/drivers/openfga_facts.d.ts +112 -1
  49. package/build/src/drivers/openfga_facts.js +351 -11
  50. package/build/src/drivers/openfga_relations_driver.d.ts +109 -8
  51. package/build/src/drivers/openfga_relations_driver.js +817 -53
  52. package/build/src/errors.d.ts +233 -1
  53. package/build/src/errors.js +283 -1
  54. package/build/src/expiry.d.ts +51 -2
  55. package/build/src/expiry.js +96 -2
  56. package/build/src/freeze.d.ts +0 -1
  57. package/build/src/freeze.js +0 -1
  58. package/build/src/hierarchical_resolver.d.ts +0 -1
  59. package/build/src/hierarchical_resolver.js +0 -1
  60. package/build/src/http/app_access_middleware.d.ts +0 -1
  61. package/build/src/http/app_access_middleware.js +0 -1
  62. package/build/src/http/resource_access_middleware.d.ts +0 -1
  63. package/build/src/http/resource_access_middleware.js +0 -1
  64. package/build/src/identity.d.ts +2 -1
  65. package/build/src/identity.js +4 -1
  66. package/build/src/manager.d.ts +0 -1
  67. package/build/src/manager.js +164 -31
  68. package/build/src/memoize_ancestors.d.ts +0 -1
  69. package/build/src/memoize_ancestors.js +0 -1
  70. package/build/src/models/authz_assignment.d.ts +5 -6
  71. package/build/src/models/authz_assignment.js +0 -1
  72. package/build/src/models/authz_deny.d.ts +5 -6
  73. package/build/src/models/authz_deny.js +0 -1
  74. package/build/src/models/authz_permission.d.ts +5 -6
  75. package/build/src/models/authz_permission.js +0 -1
  76. package/build/src/models/authz_role.d.ts +5 -6
  77. package/build/src/models/authz_role.js +0 -1
  78. package/build/src/models/authz_role_permission.d.ts +5 -6
  79. package/build/src/models/authz_role_permission.js +0 -1
  80. package/build/src/openfga.d.ts +3 -4
  81. package/build/src/openfga.js +5 -3
  82. package/build/src/reconcile.d.ts +0 -1
  83. package/build/src/reconcile.js +0 -1
  84. package/build/src/relation_partition_trigger.d.ts +0 -1
  85. package/build/src/relation_partition_trigger.js +0 -1
  86. package/build/src/relations/check_many.d.ts +1 -2
  87. package/build/src/relations/check_many.js +6 -5
  88. package/build/src/relations/define_relations_config.d.ts +140 -5
  89. package/build/src/relations/define_relations_config.js +205 -6
  90. package/build/src/relations/deny_reach.d.ts +102 -0
  91. package/build/src/relations/deny_reach.js +230 -0
  92. package/build/src/relations/group_depth.d.ts +215 -0
  93. package/build/src/relations/group_depth.js +453 -0
  94. package/build/src/relations/manager.d.ts +46 -8
  95. package/build/src/relations/manager.js +178 -16
  96. package/build/src/relations/page.d.ts +19 -0
  97. package/build/src/relations/page.js +74 -0
  98. package/build/src/relations/reconcile.d.ts +274 -2
  99. package/build/src/relations/reconcile.js +1006 -162
  100. package/build/src/relations/tuple_key.d.ts +0 -1
  101. package/build/src/relations/tuple_key.js +0 -1
  102. package/build/src/relations/tuple_order.d.ts +127 -0
  103. package/build/src/relations/tuple_order.js +599 -0
  104. package/build/src/relations_config_store.d.ts +57 -2
  105. package/build/src/relations_config_store.js +155 -5
  106. package/build/src/relations_reconcile.d.ts +0 -1
  107. package/build/src/relations_reconcile.js +0 -1
  108. package/build/src/scope_outbox.d.ts +0 -1
  109. package/build/src/scope_outbox.js +0 -1
  110. package/build/src/shared/backend_guard.d.ts +60 -1
  111. package/build/src/shared/backend_guard.js +179 -2
  112. package/build/src/shared/sql_expiry.d.ts +0 -1
  113. package/build/src/shared/sql_expiry.js +0 -1
  114. package/build/src/shared/transaction_guard.d.ts +0 -1
  115. package/build/src/shared/transaction_guard.js +0 -1
  116. package/build/src/sql_descendants.d.ts +0 -1
  117. package/build/src/sql_descendants.js +0 -1
  118. package/build/src/testing/contract.d.ts +7 -1
  119. package/build/src/testing/contract.js +77 -1
  120. package/build/src/testing/main.d.ts +1 -2
  121. package/build/src/testing/main.js +1 -2
  122. package/build/src/testing/migration_contract.d.ts +0 -1
  123. package/build/src/testing/migration_contract.js +0 -1
  124. package/build/src/testing/relations_contract.d.ts +25 -1
  125. package/build/src/testing/relations_contract.js +996 -49
  126. package/build/src/testing/relations_reconcile_contract.d.ts +9 -1
  127. package/build/src/testing/relations_reconcile_contract.js +207 -1
  128. package/build/src/testing/scope_outbox_contract.d.ts +0 -1
  129. package/build/src/testing/scope_outbox_contract.js +0 -1
  130. package/build/src/testing/scope_tree.d.ts +0 -1
  131. package/build/src/testing/scope_tree.js +0 -1
  132. package/build/src/testing/test_clock.d.ts +0 -1
  133. package/build/src/testing/test_clock.js +0 -1
  134. package/build/src/traits/authz_scopes.d.ts +0 -1
  135. package/build/src/traits/authz_scopes.js +0 -1
  136. package/build/src/traits/has_uuid.d.ts +5 -6
  137. package/build/src/traits/has_uuid.js +0 -1
  138. package/build/src/types.d.ts +170 -15
  139. package/build/src/types.js +6 -1
  140. package/build/stubs/config/authorization.stub +22 -6
  141. package/build/stubs/main.d.ts +0 -1
  142. package/build/stubs/main.js +0 -1
  143. package/package.json +4 -3
  144. package/build/commands/authz_catalog_diff.d.ts.map +0 -1
  145. package/build/commands/authz_catalog_diff.js.map +0 -1
  146. package/build/commands/authz_catalog_prune_orphans.d.ts.map +0 -1
  147. package/build/commands/authz_catalog_prune_orphans.js.map +0 -1
  148. package/build/commands/authz_catalog_sync.d.ts.map +0 -1
  149. package/build/commands/authz_catalog_sync.js.map +0 -1
  150. package/build/commands/authz_freeze.d.ts.map +0 -1
  151. package/build/commands/authz_freeze.js.map +0 -1
  152. package/build/commands/authz_reconcile.d.ts.map +0 -1
  153. package/build/commands/authz_reconcile.js.map +0 -1
  154. package/build/commands/authz_relations_reconcile.d.ts.map +0 -1
  155. package/build/commands/authz_relations_reconcile.js.map +0 -1
  156. package/build/commands/authz_scopes_relay.d.ts.map +0 -1
  157. package/build/commands/authz_scopes_relay.js.map +0 -1
  158. package/build/commands/authz_scopes_requeue.d.ts.map +0 -1
  159. package/build/commands/authz_scopes_requeue.js.map +0 -1
  160. package/build/commands/authz_unfreeze.d.ts.map +0 -1
  161. package/build/commands/authz_unfreeze.js.map +0 -1
  162. package/build/commands/main.d.ts.map +0 -1
  163. package/build/commands/main.js.map +0 -1
  164. package/build/commands/openfga_provision.d.ts.map +0 -1
  165. package/build/commands/openfga_provision.js.map +0 -1
  166. package/build/configure.d.ts.map +0 -1
  167. package/build/configure.js.map +0 -1
  168. package/build/index.d.ts.map +0 -1
  169. package/build/index.js.map +0 -1
  170. package/build/providers/authz_provider.d.ts.map +0 -1
  171. package/build/providers/authz_provider.js.map +0 -1
  172. package/build/services/main.d.ts.map +0 -1
  173. package/build/services/main.js.map +0 -1
  174. package/build/services/relations.d.ts.map +0 -1
  175. package/build/services/relations.js.map +0 -1
  176. package/build/src/catalog/catalog.d.ts.map +0 -1
  177. package/build/src/catalog/catalog.js.map +0 -1
  178. package/build/src/catalog/catalog_cache.d.ts.map +0 -1
  179. package/build/src/catalog/catalog_cache.js.map +0 -1
  180. package/build/src/clock.d.ts.map +0 -1
  181. package/build/src/clock.js.map +0 -1
  182. package/build/src/define_config.d.ts.map +0 -1
  183. package/build/src/define_config.js.map +0 -1
  184. package/build/src/drivers/database_driver.d.ts.map +0 -1
  185. package/build/src/drivers/database_driver.js.map +0 -1
  186. package/build/src/drivers/database_relations_driver.d.ts.map +0 -1
  187. package/build/src/drivers/database_relations_driver.js.map +0 -1
  188. package/build/src/drivers/openfga_driver.d.ts.map +0 -1
  189. package/build/src/drivers/openfga_driver.js.map +0 -1
  190. package/build/src/drivers/openfga_facts.d.ts.map +0 -1
  191. package/build/src/drivers/openfga_facts.js.map +0 -1
  192. package/build/src/drivers/openfga_relations_driver.d.ts.map +0 -1
  193. package/build/src/drivers/openfga_relations_driver.js.map +0 -1
  194. package/build/src/errors.d.ts.map +0 -1
  195. package/build/src/errors.js.map +0 -1
  196. package/build/src/expiry.d.ts.map +0 -1
  197. package/build/src/expiry.js.map +0 -1
  198. package/build/src/freeze.d.ts.map +0 -1
  199. package/build/src/freeze.js.map +0 -1
  200. package/build/src/hierarchical_resolver.d.ts.map +0 -1
  201. package/build/src/hierarchical_resolver.js.map +0 -1
  202. package/build/src/http/app_access_middleware.d.ts.map +0 -1
  203. package/build/src/http/app_access_middleware.js.map +0 -1
  204. package/build/src/http/resource_access_middleware.d.ts.map +0 -1
  205. package/build/src/http/resource_access_middleware.js.map +0 -1
  206. package/build/src/identity.d.ts.map +0 -1
  207. package/build/src/identity.js.map +0 -1
  208. package/build/src/manager.d.ts.map +0 -1
  209. package/build/src/manager.js.map +0 -1
  210. package/build/src/memoize_ancestors.d.ts.map +0 -1
  211. package/build/src/memoize_ancestors.js.map +0 -1
  212. package/build/src/models/authz_assignment.d.ts.map +0 -1
  213. package/build/src/models/authz_assignment.js.map +0 -1
  214. package/build/src/models/authz_deny.d.ts.map +0 -1
  215. package/build/src/models/authz_deny.js.map +0 -1
  216. package/build/src/models/authz_permission.d.ts.map +0 -1
  217. package/build/src/models/authz_permission.js.map +0 -1
  218. package/build/src/models/authz_role.d.ts.map +0 -1
  219. package/build/src/models/authz_role.js.map +0 -1
  220. package/build/src/models/authz_role_permission.d.ts.map +0 -1
  221. package/build/src/models/authz_role_permission.js.map +0 -1
  222. package/build/src/openfga.d.ts.map +0 -1
  223. package/build/src/openfga.js.map +0 -1
  224. package/build/src/reconcile.d.ts.map +0 -1
  225. package/build/src/reconcile.js.map +0 -1
  226. package/build/src/relation_partition_trigger.d.ts.map +0 -1
  227. package/build/src/relation_partition_trigger.js.map +0 -1
  228. package/build/src/relations/check_many.d.ts.map +0 -1
  229. package/build/src/relations/check_many.js.map +0 -1
  230. package/build/src/relations/define_relations_config.d.ts.map +0 -1
  231. package/build/src/relations/define_relations_config.js.map +0 -1
  232. package/build/src/relations/manager.d.ts.map +0 -1
  233. package/build/src/relations/manager.js.map +0 -1
  234. package/build/src/relations/reconcile.d.ts.map +0 -1
  235. package/build/src/relations/reconcile.js.map +0 -1
  236. package/build/src/relations/tuple_key.d.ts.map +0 -1
  237. package/build/src/relations/tuple_key.js.map +0 -1
  238. package/build/src/relations_config_store.d.ts.map +0 -1
  239. package/build/src/relations_config_store.js.map +0 -1
  240. package/build/src/relations_reconcile.d.ts.map +0 -1
  241. package/build/src/relations_reconcile.js.map +0 -1
  242. package/build/src/scope_outbox.d.ts.map +0 -1
  243. package/build/src/scope_outbox.js.map +0 -1
  244. package/build/src/shared/backend_guard.d.ts.map +0 -1
  245. package/build/src/shared/backend_guard.js.map +0 -1
  246. package/build/src/shared/sql_expiry.d.ts.map +0 -1
  247. package/build/src/shared/sql_expiry.js.map +0 -1
  248. package/build/src/shared/transaction_guard.d.ts.map +0 -1
  249. package/build/src/shared/transaction_guard.js.map +0 -1
  250. package/build/src/sql_descendants.d.ts.map +0 -1
  251. package/build/src/sql_descendants.js.map +0 -1
  252. package/build/src/testing/contract.d.ts.map +0 -1
  253. package/build/src/testing/contract.js.map +0 -1
  254. package/build/src/testing/main.d.ts.map +0 -1
  255. package/build/src/testing/main.js.map +0 -1
  256. package/build/src/testing/migration_contract.d.ts.map +0 -1
  257. package/build/src/testing/migration_contract.js.map +0 -1
  258. package/build/src/testing/relations_contract.d.ts.map +0 -1
  259. package/build/src/testing/relations_contract.js.map +0 -1
  260. package/build/src/testing/relations_reconcile_contract.d.ts.map +0 -1
  261. package/build/src/testing/relations_reconcile_contract.js.map +0 -1
  262. package/build/src/testing/scope_outbox_contract.d.ts.map +0 -1
  263. package/build/src/testing/scope_outbox_contract.js.map +0 -1
  264. package/build/src/testing/scope_tree.d.ts.map +0 -1
  265. package/build/src/testing/scope_tree.js.map +0 -1
  266. package/build/src/testing/test_clock.d.ts.map +0 -1
  267. package/build/src/testing/test_clock.js.map +0 -1
  268. package/build/src/traits/authz_scopes.d.ts.map +0 -1
  269. package/build/src/traits/authz_scopes.js.map +0 -1
  270. package/build/src/traits/has_uuid.d.ts.map +0 -1
  271. package/build/src/traits/has_uuid.js.map +0 -1
  272. package/build/src/types.d.ts.map +0 -1
  273. package/build/src/types.js.map +0 -1
  274. package/build/stubs/main.d.ts.map +0 -1
  275. package/build/stubs/main.js.map +0 -1
@@ -75,6 +75,11 @@ declare const AuthzPermission_base: {
75
75
  <Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelPaginatorContract<InstanceType<Model>>, "paginate">): void;
76
76
  <Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
77
77
  };
78
+ before: {
79
+ <Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends "find" | "fetch">(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, Event>): void;
80
+ <Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<[import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>], "paginate">): void;
81
+ <Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
82
+ };
78
83
  readonly booted: boolean;
79
84
  $columnsDefinitions: Map<string, import("@adonisjs/lucid/types/model").ModelColumnOptions>;
80
85
  $relationsDefinitions: Map<string, import("@adonisjs/lucid/types/relations").RelationshipsContract>;
@@ -111,11 +116,6 @@ declare const AuthzPermission_base: {
111
116
  };
112
117
  $defineProperty: <Model extends import("@adonisjs/lucid/types/model").LucidModel, Prop extends keyof Model>(this: Model, propertyName: Prop, defaultValue: Model[Prop], strategy: "inherit" | "define" | ((value: Model[Prop]) => Model[Prop])) => void;
113
118
  boot: () => void;
114
- before: {
115
- <Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends "find" | "fetch">(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, Event>): void;
116
- <Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<[import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>], "paginate">): void;
117
- <Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
118
- };
119
119
  create: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
120
120
  createQuietly: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
121
121
  createMany: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
@@ -162,4 +162,3 @@ export default class AuthzPermission extends AuthzPermission_base {
162
162
  updatedAt: DateTime;
163
163
  }
164
164
  export {};
165
- //# sourceMappingURL=authz_permission.d.ts.map
@@ -43,4 +43,3 @@ __decorate([
43
43
  column.dateTime({ autoCreate: true, autoUpdate: true, columnName: 'updated_at' }),
44
44
  __metadata("design:type", DateTime)
45
45
  ], AuthzPermission.prototype, "updatedAt", void 0);
46
- //# sourceMappingURL=authz_permission.js.map
@@ -77,6 +77,11 @@ declare const AuthzRole_base: {
77
77
  <Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelPaginatorContract<InstanceType<Model>>, "paginate">): void;
78
78
  <Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
79
79
  };
80
+ before: {
81
+ <Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends "find" | "fetch">(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, Event>): void;
82
+ <Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<[import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>], "paginate">): void;
83
+ <Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
84
+ };
80
85
  readonly booted: boolean;
81
86
  $columnsDefinitions: Map<string, import("@adonisjs/lucid/types/model").ModelColumnOptions>;
82
87
  $relationsDefinitions: Map<string, import("@adonisjs/lucid/types/relations").RelationshipsContract>;
@@ -113,11 +118,6 @@ declare const AuthzRole_base: {
113
118
  };
114
119
  $defineProperty: <Model extends import("@adonisjs/lucid/types/model").LucidModel, Prop extends keyof Model>(this: Model, propertyName: Prop, defaultValue: Model[Prop], strategy: "inherit" | "define" | ((value: Model[Prop]) => Model[Prop])) => void;
115
120
  boot: () => void;
116
- before: {
117
- <Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends "find" | "fetch">(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, Event>): void;
118
- <Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<[import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>], "paginate">): void;
119
- <Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
120
- };
121
121
  create: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
122
122
  createQuietly: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
123
123
  createMany: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
@@ -170,4 +170,3 @@ export default class AuthzRole extends AuthzRole_base {
170
170
  updatedAt: DateTime;
171
171
  }
172
172
  export {};
173
- //# sourceMappingURL=authz_role.d.ts.map
@@ -68,4 +68,3 @@ __decorate([
68
68
  column.dateTime({ autoCreate: true, autoUpdate: true, columnName: 'updated_at' }),
69
69
  __metadata("design:type", DateTime)
70
70
  ], AuthzRole.prototype, "updatedAt", void 0);
71
- //# sourceMappingURL=authz_role.js.map
@@ -75,6 +75,11 @@ declare const AuthzRolePermission_base: {
75
75
  <Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelPaginatorContract<InstanceType<Model>>, "paginate">): void;
76
76
  <Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
77
77
  };
78
+ before: {
79
+ <Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends "find" | "fetch">(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, Event>): void;
80
+ <Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<[import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>], "paginate">): void;
81
+ <Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
82
+ };
78
83
  readonly booted: boolean;
79
84
  $columnsDefinitions: Map<string, import("@adonisjs/lucid/types/model").ModelColumnOptions>;
80
85
  $relationsDefinitions: Map<string, import("@adonisjs/lucid/types/relations").RelationshipsContract>;
@@ -111,11 +116,6 @@ declare const AuthzRolePermission_base: {
111
116
  };
112
117
  $defineProperty: <Model extends import("@adonisjs/lucid/types/model").LucidModel, Prop extends keyof Model>(this: Model, propertyName: Prop, defaultValue: Model[Prop], strategy: "inherit" | "define" | ((value: Model[Prop]) => Model[Prop])) => void;
113
118
  boot: () => void;
114
- before: {
115
- <Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends "find" | "fetch">(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, Event>): void;
116
- <Model extends import("@adonisjs/lucid/types/model").LucidModel>(this: Model, event: "paginate", handler: import("@adonisjs/lucid/types/model").HooksHandler<[import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>, import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model>], "paginate">): void;
117
- <Model extends import("@adonisjs/lucid/types/model").LucidModel, Event extends import("@adonisjs/lucid/types/model").EventsList>(this: Model, event: Event, handler: import("@adonisjs/lucid/types/model").HooksHandler<InstanceType<Model>, Event>): void;
118
- };
119
119
  create: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
120
120
  createQuietly: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
121
121
  createMany: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, values: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
@@ -152,4 +152,3 @@ export default class AuthzRolePermission extends AuthzRolePermission_base {
152
152
  createdAt: DateTime;
153
153
  }
154
154
  export {};
155
- //# sourceMappingURL=authz_role_permission.d.ts.map
@@ -32,4 +32,3 @@ __decorate([
32
32
  column.dateTime({ autoCreate: true, columnName: 'created_at' }),
33
33
  __metadata("design:type", DateTime)
34
34
  ], AuthzRolePermission.prototype, "createdAt", void 0);
35
- //# sourceMappingURL=authz_role_permission.js.map
@@ -15,7 +15,7 @@ export type { HolderTypeMap, OpenFgaDriverOptions } from './drivers/openfga_driv
15
15
  * sobre el MISMO store y `modelId` que el driver `facts` de roles. Vive detrás
16
16
  * de esta puerta como el resto de lo que toca `@openfga/sdk`.
17
17
  */
18
- export { OpenFgaRelationsDriver, DEFAULT_LIST_OBJECTS_DEADLINE_MS, LIST_OBJECTS_DEADLINE_RATIO } from './drivers/openfga_relations_driver.js';
18
+ export { OpenFgaRelationsDriver, DEFAULT_LIST_OBJECTS_DEADLINE_MS, LIST_OBJECTS_DEADLINE_RATIO, RELATIONS_PURGE_WRITE_MAX } from './drivers/openfga_relations_driver.js';
19
19
  export type { OpenFgaRelationsDriverOptions } from './drivers/openfga_relations_driver.js';
20
20
  /**
21
21
  * El modelo (c2r) y la proyección del catálogo (3b-2a; desde 3b-2k · K2 es
@@ -24,6 +24,5 @@ export type { OpenFgaRelationsDriverOptions } from './drivers/openfga_relations_
24
24
  * JSON y cadenas—, pero se publica por esta misma puerta: es material de
25
25
  * OpenFGA y solo lo usa quien lo elige.
26
26
  */
27
- export { openFgaFactsModel, factsRelationsOf, factsRelationMap, factsCatalogTuples, factsTupleId, factsModelBytes, assertFactsModelPublishable, assertFgaObjectId, FACTS_MODEL_MAX_BYTES, FACTS_MODEL_WARN_RATIO, FGA_MAX_RELATION_NAME, FGA_MAX_OBJECT_ID, FACTS_MAX_RESOLVE_DEPTH, FGA_MAX_BATCH_CHECK, factsScopeObject, factsParentTuple, FACTS_SCOPE_TYPE, FACTS_PARENT_RELATION, factsRootTuples, FACTS_ROOTED_RELATION, factsRelationTypeDefinitions, assertRelationsConfigPublishable, RESERVED_FACTS_TYPES, FACTS_GROUP_TYPE, FACTS_GROUP_MEMBER_RELATION, } from './drivers/openfga_facts.js';
28
- export type { FactsRelations, FactsCatalogTuple, FactsTuple, FactsRelationsConfig, RelationObjectType, RelationObjectRelation, } from './drivers/openfga_facts.js';
29
- //# sourceMappingURL=openfga.d.ts.map
27
+ export { openFgaFactsModel, factsRelationsOf, factsRelationMap, factsCatalogTuples, factsTupleId, factsModelBytes, assertFactsModelPublishable, assertFgaObjectId, FACTS_MODEL_MAX_BYTES, FACTS_MODEL_WARN_RATIO, FGA_MAX_RELATION_NAME, FGA_MAX_OBJECT_ID, FACTS_MAX_RESOLVE_DEPTH, FGA_MAX_BATCH_CHECK, factsScopeObject, factsParentTuple, FACTS_SCOPE_TYPE, FACTS_PARENT_RELATION, factsRootTuples, FACTS_ROOTED_RELATION, factsRelationTypeDefinitions, assertRelationsConfigPublishable, RESERVED_FACTS_TYPES, FACTS_GROUP_TYPE, FACTS_GROUP_MEMBER_RELATION, factsModelDifferences, } from './drivers/openfga_facts.js';
28
+ export type { FactsModelComparison, FactsModelDifference, FactsModelSlice, FactsRelations, FactsCatalogTuple, FactsTuple, FactsRelationsConfig, RelationObjectType, RelationObjectRelation, } from './drivers/openfga_facts.js';
@@ -14,7 +14,7 @@ export { OpenFgaAuthorizationDriver, provisionOpenFgaStore, assertHolderTypes, p
14
14
  * sobre el MISMO store y `modelId` que el driver `facts` de roles. Vive detrás
15
15
  * de esta puerta como el resto de lo que toca `@openfga/sdk`.
16
16
  */
17
- export { OpenFgaRelationsDriver, DEFAULT_LIST_OBJECTS_DEADLINE_MS, LIST_OBJECTS_DEADLINE_RATIO } from './drivers/openfga_relations_driver.js';
17
+ export { OpenFgaRelationsDriver, DEFAULT_LIST_OBJECTS_DEADLINE_MS, LIST_OBJECTS_DEADLINE_RATIO, RELATIONS_PURGE_WRITE_MAX } from './drivers/openfga_relations_driver.js';
18
18
  /**
19
19
  * El modelo (c2r) y la proyección del catálogo (3b-2a; desde 3b-2k · K2 es
20
20
  * el ÚNICO modelo: `openFgaAuthorizationModel` —el del modo `resolver`— y
@@ -22,5 +22,7 @@ export { OpenFgaRelationsDriver, DEFAULT_LIST_OBJECTS_DEADLINE_MS, LIST_OBJECTS_
22
22
  * JSON y cadenas—, pero se publica por esta misma puerta: es material de
23
23
  * OpenFGA y solo lo usa quien lo elige.
24
24
  */
25
- export { openFgaFactsModel, factsRelationsOf, factsRelationMap, factsCatalogTuples, factsTupleId, factsModelBytes, assertFactsModelPublishable, assertFgaObjectId, FACTS_MODEL_MAX_BYTES, FACTS_MODEL_WARN_RATIO, FGA_MAX_RELATION_NAME, FGA_MAX_OBJECT_ID, FACTS_MAX_RESOLVE_DEPTH, FGA_MAX_BATCH_CHECK, factsScopeObject, factsParentTuple, FACTS_SCOPE_TYPE, FACTS_PARENT_RELATION, factsRootTuples, FACTS_ROOTED_RELATION, factsRelationTypeDefinitions, assertRelationsConfigPublishable, RESERVED_FACTS_TYPES, FACTS_GROUP_TYPE, FACTS_GROUP_MEMBER_RELATION, } from './drivers/openfga_facts.js';
26
- //# sourceMappingURL=openfga.js.map
25
+ export { openFgaFactsModel, factsRelationsOf, factsRelationMap, factsCatalogTuples, factsTupleId, factsModelBytes, assertFactsModelPublishable, assertFgaObjectId, FACTS_MODEL_MAX_BYTES, FACTS_MODEL_WARN_RATIO, FGA_MAX_RELATION_NAME, FGA_MAX_OBJECT_ID, FACTS_MAX_RESOLVE_DEPTH, FGA_MAX_BATCH_CHECK, factsScopeObject, factsParentTuple, FACTS_SCOPE_TYPE, FACTS_PARENT_RELATION, factsRootTuples, FACTS_ROOTED_RELATION, factsRelationTypeDefinitions, assertRelationsConfigPublishable, RESERVED_FACTS_TYPES, FACTS_GROUP_TYPE, FACTS_GROUP_MEMBER_RELATION,
26
+ // L11 (lote «antes de RC»): la comparación modelo servido ↔ config, la que usan las dos puertas y la relectura de
27
+ // `openfga:provision`.
28
+ factsModelDifferences, } from './drivers/openfga_facts.js';
@@ -34,4 +34,3 @@ export declare function reconcileMaxTuples(value: number | undefined): number;
34
34
  export declare function emptyReconcileCounts(): ReconcileCounts;
35
35
  export declare function emptyReconcilePhases(): Record<ReconcileFamily, ReconcileCounts>;
36
36
  export declare function sumReconcilePhases(phases: Record<ReconcileFamily, ReconcileCounts>): ReconcileCounts;
37
- //# sourceMappingURL=reconcile.d.ts.map
@@ -66,4 +66,3 @@ export function sumReconcilePhases(phases) {
66
66
  }
67
67
  return total;
68
68
  }
69
- //# sourceMappingURL=reconcile.js.map
@@ -5,4 +5,3 @@ export declare function relationPartitionTrigger(dialect: string): string[];
5
5
  /** Las sentencias para soltar el trigger (y, en PG, su función) en el `down()`. */
6
6
  export declare function relationPartitionTriggerDrops(dialect: string): string[];
7
7
  export {};
8
- //# sourceMappingURL=relation_partition_trigger.d.ts.map
@@ -90,4 +90,3 @@ export function relationPartitionTriggerDrops(dialect) {
90
90
  'DROP TRIGGER IF EXISTS authz_relations_partition_bu',
91
91
  ];
92
92
  }
93
- //# sourceMappingURL=relation_partition_trigger.js.map
@@ -2,7 +2,7 @@ import type { RelObject } from '../types.js';
2
2
  /** Objetos por lote de `checkMany`. Es el tope de `batchCheck` del servidor FGA (50), para que un lote sea UNA request. */
3
3
  export declare const RELATIONS_CHECK_MANY_MAX = 50;
4
4
  /** `objects` es un array con 1..RELATIONS_CHECK_MANY_MAX elementos, o 422 (`E_AUTHZ_CHECK_MANY_BATCH`) sin tocar nada. */
5
- export declare function assertCheckManyObjects(objects: unknown): asserts objects is RelObject[];
5
+ export declare function assertCheckManyObjects(objects: unknown, operation?: 'checkMany' | 'decideMany' | string): asserts objects is RelObject[];
6
6
  /**
7
7
  * Los objetos DISTINTOS del lote (por `type:id`, en orden de primera aparición)
8
8
  * y, por posición del lote, el índice del distinto que la responde. Con
@@ -14,4 +14,3 @@ export declare function distinctObjects(objects: RelObject[]): {
14
14
  };
15
15
  /** Reparte las respuestas de los objetos DISTINTOS a las posiciones del lote. */
16
16
  export declare function expandByPosition(index: number[], answers: boolean[]): boolean[];
17
- //# sourceMappingURL=check_many.d.ts.map
@@ -17,15 +17,17 @@ import { CheckManyBatchError } from '../errors.js';
17
17
  /** Objetos por lote de `checkMany`. Es el tope de `batchCheck` del servidor FGA (50), para que un lote sea UNA request. */
18
18
  export const RELATIONS_CHECK_MANY_MAX = 50;
19
19
  /** `objects` es un array con 1..RELATIONS_CHECK_MANY_MAX elementos, o 422 (`E_AUTHZ_CHECK_MANY_BATCH`) sin tocar nada. */
20
- export function assertCheckManyObjects(objects) {
20
+ export function assertCheckManyObjects(objects, operation = 'checkMany') {
21
+ // Lote D · D9: `decideMany` tiene las MISMAS garantías que `checkMany` (tope, `[]`, forma), con la misma clase y el
22
+ // mismo `code`; el mensaje nombra la operación.
21
23
  if (!Array.isArray(objects)) {
22
- throw new CheckManyBatchError(`checkMany: 'objects' tiene que ser un array de objetos (llegó ${typeof objects}).`);
24
+ throw new CheckManyBatchError(`${operation}: 'objects' tiene que ser un array de objetos (llegó ${typeof objects}).`);
23
25
  }
24
26
  if (objects.length === 0) {
25
- throw new CheckManyBatchError('checkMany: el lote está VACÍO. Un lote sin objetos no es una pregunta (y `[]` ⇒ `[]` se leería como «todo denegado»): pasa al menos un objeto.');
27
+ throw new CheckManyBatchError(`${operation}: el lote está VACÍO. Un lote sin objetos no es una pregunta (y \`[]\` ⇒ \`[]\` se leería como «todo denegado»): pasa al menos un objeto.`);
26
28
  }
27
29
  if (objects.length > RELATIONS_CHECK_MANY_MAX) {
28
- throw new CheckManyBatchError(`checkMany: el lote tiene ${objects.length} objetos y el tope es ${RELATIONS_CHECK_MANY_MAX} (RELATIONS_CHECK_MANY_MAX, ` +
30
+ throw new CheckManyBatchError(`${operation}: el lote tiene ${objects.length} objetos y el tope es ${RELATIONS_CHECK_MANY_MAX} (RELATIONS_CHECK_MANY_MAX, ` +
29
31
  `= el tope de batchCheck del servidor): trocea en el llamante. No se ha preguntado nada.`);
30
32
  }
31
33
  }
@@ -54,4 +56,3 @@ export function distinctObjects(objects) {
54
56
  export function expandByPosition(index, answers) {
55
57
  return index.map((at) => answers[at]);
56
58
  }
57
- //# sourceMappingURL=check_many.js.map
@@ -1,4 +1,4 @@
1
- import type { RelObject, RelUserset } from '../types.js';
1
+ import type { RelObject, RelUserset, RelationDecision } from '../types.js';
2
2
  /**
3
3
  * **El ÚNICO userset que el modelo admite como sujeto** (plan 2.5 · lote B · B3):
4
4
  * `group#member`. El generador del modelo fusionado emite, para CADA relación de
@@ -7,6 +7,35 @@ import type { RelObject, RelUserset } from '../types.js';
7
7
  */
8
8
  export declare const RELATION_USERSET_TYPE = "group";
9
9
  export declare const RELATION_USERSET_RELATION = "member";
10
+ /**
11
+ * **El prefijo de la relación ALMACENADA de un deny** (plan 2.5 · lote D · D1): `deny(u, viewer, doc)` escribe la
12
+ * tupla `doc#denied_viewer@u` —en `authz_relations` (`database`) y en el store (`openfga`)—. Es el MISMO prefijo que
13
+ * la familia del deny de roles (`FACTS_DENIED_PREFIX`) y está en `RESERVED_SLUG_PREFIXES`: ninguna relación de dominio
14
+ * puede empezar por él (⚪4), así que el nombre público y el almacenado nunca colisionan.
15
+ */
16
+ export declare const RELATION_DENY_PREFIX = "denied_";
17
+ /**
18
+ * **La cota de una relación DENEGABLE** (D1, juez ronda 2 · fila D: «≤ 43 caracteres»): `denied_<rel>` tiene que caber
19
+ * en los 50 de FGA (y en la columna `relation` de `authz_relations`), así que una relación de un tipo con `deny`
20
+ * mide como mucho `50 − 'denied_'.length` = 43. DERIVADA, como `MAX_SLUG_LENGTH`. En un tipo SIN `deny` la cota sigue
21
+ * siendo 50 (D-18: una cota global sería una ruptura para quien no usa el deny).
22
+ */
23
+ export declare const DENIABLE_RELATION_NAME_MAX: number;
24
+ /**
25
+ * **El opt-in del deny, en DOS FASES** (D10, decisión del dueño 2026-10-14; auditor R2-2): un solo interruptor no
26
+ * tiene secuencia segura con pods de dos versiones (un pod nuevo escribe un deny y uno viejo —o uno con el `modelId`
27
+ * viejo— no lo mira). Por eso son dos valores y dos despliegues:
28
+ *
29
+ * - `'read'` (fase 1): el modelo publicado declara `denied_<rel>` (`<rel> … but not denied_<rel>`) y TODAS las
30
+ * lecturas lo honran; `deny()` sobre ese tipo es 422 `E_AUTHZ_RELATION_NOT_DENYABLE` (todavía no se escriben).
31
+ * `removeDeny`/`listDenies` sí funcionan (retirar el opt-in tiene que ser reversible).
32
+ * - `'write'` (fase 2): además se aceptan escrituras de deny.
33
+ *
34
+ * El runbook: (1) toda la flota en ≥ 2.5.0-alpha.3 con el tipo en `'read'`, el modelo publicado y todos los pods
35
+ * fijados al `modelId` nuevo; (2) verificar; (3) un SEGUNDO despliegue pasa a `'write'`. `deny: true` no existe a
36
+ * propósito (422 nombrando las dos fases): sería el interruptor único que R2-2 descartó.
37
+ */
38
+ export type RelationDenyPhase = 'read' | 'write';
10
39
  /**
11
40
  * **Listas blancas por nivel de la spec** (plan 2.5 · lote B · B2; linaje L5,
12
41
  * propiedad universal «ninguna clave de una spec de config se descarta»).
@@ -19,10 +48,10 @@ export declare const RELATION_USERSET_RELATION = "member";
19
48
  * Las claves del lote D entran AQUÍ, en el mismo commit que su efecto.
20
49
  */
21
50
  export declare const RELATIONS_SPEC_KEYS: Readonly<{
22
- root: readonly ["objectTypes", "holderTypes", "database"];
23
- objectType: readonly ["type", "relations"];
51
+ root: readonly ["objectTypes", "holderTypes", "database", "maxGroupDepth"];
52
+ objectType: readonly ["type", "relations", "deny"];
24
53
  relation: readonly ["name", "includes"];
25
- database: readonly ["membersOf"];
54
+ database: readonly ["membersOf", "enforceGroupDepth"];
26
55
  }>;
27
56
  /** Una relación de un tipo de objeto (`document#viewer`), con sus `includes` de un nivel. */
28
57
  export interface RelationObjectRelationSpec {
@@ -42,6 +71,12 @@ export interface RelationObjectTypeSpec {
42
71
  type: string;
43
72
  /** Sus relaciones, en orden de declaración. */
44
73
  relations: readonly RelationObjectRelationSpec[];
74
+ /**
75
+ * **Opt-in del deny para este tipo** (plan 2.5 · lote D, D10: dos fases, ver `RelationDenyPhase`). Ausente = el tipo
76
+ * no se puede denegar (`deny()` ⇒ 422) y su modelo es byte a byte el de 2.4.0-alpha.10 (D-29). Con `'read'` o
77
+ * `'write'` cada relación del tipo mide ≤ `DENIABLE_RELATION_NAME_MAX` (43) y el modelo publica `denied_<rel>`.
78
+ */
79
+ deny?: RelationDenyPhase;
45
80
  }
46
81
  /** Opciones específicas del driver `database`. */
47
82
  export interface RelationsDatabaseOptions {
@@ -52,6 +87,15 @@ export interface RelationsDatabaseOptions {
52
87
  * `database`.
53
88
  */
54
89
  membersOf?: boolean;
90
+ /**
91
+ * **El límite de anidación de grupos en `database`, OPT-IN** (lote «antes de RC» · R1, decisión del dueño 2026-10-17
92
+ * (5): «`database` SIN límite por defecto —no tiene techo técnico—, opt-in con mando explícito aparte del número»).
93
+ * `true` ⇒ el driver `database` rechaza con 422 `E_AUTHZ_GROUP_DEPTH_LIMIT` la arista `group#member` que deje una
94
+ * cadena más larga que `maxGroupDepth` (que entonces es OBLIGATORIO y numérico: 500 al arrancar si no). Mando aparte
95
+ * a propósito (V2-4 del auditor): el `maxGroupDepth` que pones para tu CI `openfga` NO activa el gate en tu producción
96
+ * `database`. Default `false`.
97
+ */
98
+ enforceGroupDepth?: boolean;
55
99
  }
56
100
  /** La config que declara el consumidor. */
57
101
  export interface RelationsConfigSpec {
@@ -65,12 +109,26 @@ export interface RelationsConfigSpec {
65
109
  holderTypes?: readonly string[];
66
110
  /** Opciones del driver `database` (donde vive `membersOf`). */
67
111
  database?: RelationsDatabaseOptions;
112
+ /**
113
+ * **El techo de anidación de grupos que declara la APP** (lote «antes de RC» · R1, decisiones del dueño 2026-10-17 (5)
114
+ * y (5-bis)): saltos `group⊂group` del camino MÁS LARGO. Cada driver declara su techo — `openfga` lo CALIBRA contra
115
+ * el servidor al primer uso (22 en OpenFGA v1.19 por defecto) y lo aplica SIEMPRE; `database` no tiene ninguno salvo
116
+ * `database.enforceGroupDepth` —; este valor solo puede BAJAR el de `openfga` (uno mayor que el calibrado ⇒ 500
117
+ * `E_AUTHZ_CONFIG` al calibrar, con las dos cifras) y es EL número en `database` con el opt-in. Entero 1..97 o `false`
118
+ * (apaga el de `openfga`, de forma explícita); cualquier otro valor ⇒ 500 al ARRANCAR. El paquete no lee variables de
119
+ * entorno: valida la tuya (`Env.schema.number.optional()`) y pásala aquí.
120
+ */
121
+ maxGroupDepth?: number | false;
68
122
  }
69
123
  /** La config ya validada y CONGELADA que consulta el manager de relaciones. */
70
124
  export interface RelationsConfig {
71
125
  readonly objectTypes: readonly RelationObjectTypeSpec[];
72
126
  /** ¿`membersOf` está habilitado (opción de `database`)? */
73
127
  readonly membersOf: boolean;
128
+ /** R1: el techo de anidación de grupos declarado por la app (`undefined` = el del driver; `false` = apagado explícito). */
129
+ readonly maxGroupDepth?: number | false;
130
+ /** R1: ¿el driver `database` aplica `maxGroupDepth`? (opt-in, `database.enforceGroupDepth`). */
131
+ readonly enforceGroupDepth?: boolean;
74
132
  /** ¿Existe el tipo de objeto? (F-05, cara del tipo). */
75
133
  hasType(objectType: string): boolean;
76
134
  /** ¿La relación está declarada para ese tipo? (F-05, cara de la relación). */
@@ -179,4 +237,81 @@ export declare const RELATION_USERSET_RESIDUE_DELETE = "DELETE FROM authz_relati
179
237
  * `E_AUTHZ_RELATION_CONFIG` (misma clase que el gate del modelo del lote 4-1).
180
238
  */
181
239
  export declare function defineRelationsConfig(spec: RelationsConfigSpec): RelationsConfig;
182
- //# sourceMappingURL=define_relations_config.d.ts.map
240
+ /** La fase del opt-in del deny de un tipo (`undefined` = sin opt-in; `group` nunca). */
241
+ export declare function denyPhaseOf(config: Pick<RelationsConfig, 'objectTypes'>, objectType: string): RelationDenyPhase | undefined;
242
+ /** ¿Algún tipo de la config declara el opt-in (en cualquier fase)? Decide D14 (`modelId` fijado obligatorio en `openfga`). */
243
+ export declare function hasDenyTypes(config: Pick<RelationsConfig, 'objectTypes'>): boolean;
244
+ /** La relación ALMACENADA del deny de `relation` (`viewer` ⇒ `denied_viewer`). */
245
+ export declare function deniedRelationOf(relation: string): string;
246
+ /**
247
+ * **La consulta del README §Upgrading que cuenta los denies VIVOS de relaciones** (plan 2.5 · lote D · D2; D12/S17: no
248
+ * hay rollback por debajo de 2.5 con denies vivos — antes de volver atrás tiene que dar 0). Portable a los tres motores
249
+ * (`substr` existe en SQLite, PostgreSQL y MySQL; `LIKE 'denied\_%'` no: SQLite no tiene escape por defecto). La ejecutan
250
+ * `tests/upgrade_recipe.spec.ts` (los cuatro modos, contra el README byte a byte) y el paso 21 del runbook.
251
+ */
252
+ export declare const RELATION_DENIES_COUNT_SQL = "SELECT count(*) AS n FROM authz_relations WHERE substr(relation, 1, 7) = 'denied_';";
253
+ /**
254
+ * **La relación ALMACENADA, leída de vuelta: nombre público + `kind`** (plan 2.5 · lote D · D2; el reconcile con
255
+ * `kind`). Es el PUNTO DE PASO ÚNICO de `enumerateRelations(Many)` en los dos drivers y en el doble: `denied_viewer`
256
+ * ⇒ `{ relation: 'viewer', kind: 'deny' }`; cualquier otra ⇒ `{ relation, kind: 'allow' }`. Inequívoco porque el
257
+ * prefijo está en `RESERVED_SLUG_PREFIXES` (ninguna relación de dominio puede empezar por `denied_`). Hasta D2 los
258
+ * drivers emitían `relation: 'denied_viewer'` sin `kind`, y `reconcileRelations` lo contaba como relación NO
259
+ * declarada (`skipped.undeclared`): una migración `database → openfga` no llevaba los denies.
260
+ */
261
+ export declare function storedRelationKind(stored: string): {
262
+ relation: string;
263
+ kind: 'allow' | 'deny';
264
+ };
265
+ /**
266
+ * **`down*(R)`: las relaciones cuyo hecho DIRECTO satisface `R`** (R y todo lo que incluye, transitivamente). Es el
267
+ * PUNTO DE PASO ÚNICO del grafo de `includes` hacia abajo (lote D: antes lo reimplementaban `#expandDown` del driver
268
+ * `database` y el doble; con el deny hacen falta las dos direcciones en tres sitios y, calculadas tres veces,
269
+ * divergen). En el retículo del contrato: `down*(viewer) = {viewer, editor, owner}`.
270
+ */
271
+ export declare function relationsDown(config: Pick<RelationsConfig, 'objectTypes'>, objectType: string, relation: string): string[];
272
+ /**
273
+ * **`up*(R)`: las relaciones que INCLUYEN a `R`** (R y todo lo que la incluye, transitivamente). Un deny en cualquiera
274
+ * de ellas CORTA un grant de `R` (D5, corte de camino): `up*(owner) = {owner, editor, viewer}` ⇒ un deny en `editor`
275
+ * anula entero un grant de `owner`.
276
+ */
277
+ export declare function relationsUp(config: Pick<RelationsConfig, 'objectTypes'>, objectType: string, relation: string): string[];
278
+ /**
279
+ * **D5 · CORTE DE CAMINO, la regla ÚNICA** (decisión del dueño 2026-10-14; tester §2.1, la tabla T1 de 64 estados):
280
+ * `check(s, Q, o) = T` sii existe un grant `T ∈ A ∩ down*(Q)` tal que `up*(T) ∩ D = ∅`, con `A` = las relaciones con
281
+ * allow vivo que alcanzan al sujeto (directo o por `group#member`, anidado) y `D` = las relaciones con deny que lo
282
+ * alcanzan igual. Es EXACTAMENTE lo que el modelo FGA evalúa en el servidor (`X = (this ∨ I…) but not denied_X`,
283
+ * `denied_X = this ∨ denied_P` por cada `P ⊇ X`), y es la función que usan el driver `database`, el doble y el
284
+ * oráculo de la suite: tres copias divergirían (L8).
285
+ */
286
+ export declare function cutPathAllows(config: Pick<RelationsConfig, 'objectTypes'>, objectType: string, relation: string, allowed: ReadonlySet<string>, denied: ReadonlySet<string>): boolean;
287
+ /** Las relaciones del deny que `decideMany`/`check` tienen que leer para `R`: `up*(down*(R))` (D9, definición AMPLIA). */
288
+ export declare function deniableAbove(config: Pick<RelationsConfig, 'objectTypes'>, objectType: string, relation: string): string[];
289
+ /**
290
+ * **D9 · `decideMany` AMPLIO, la regla ÚNICA** (decisión del dueño 2026-10-14; juez ronda 2 §4): `allow` si `check`
291
+ * concede (el deny ya está aplicado dentro del objeto por corte de camino); si no, `deny` si el sujeto tiene un deny
292
+ * vivo sobre ALGUNA relación de `up*(down*(R))` en el objeto; si no, `none`. Más amplia que `check` a propósito
293
+ * (fail-closed en la cadena del llamante): un `viewer` heredado con un deny(`editor`) en el hijo da `deny`.
294
+ */
295
+ export declare function decideFrom(config: Pick<RelationsConfig, 'objectTypes'>, objectType: string, relation: string, allowed: ReadonlySet<string>, denied: ReadonlySet<string>): RelationDecision;
296
+ /**
297
+ * **La puerta de ESCRITURA del deny** (D10/D-17): `deny()` solo entra sobre un tipo en fase `'write'`; sin opt-in, en
298
+ * `'read'` o sobre `group` ⇒ 422 `E_AUTHZ_RELATION_NOT_DENYABLE`. La aplican el manager, los dos drivers y el doble,
299
+ * DESPUÉS de F-05 (un tipo no declarado sigue siendo `E_AUTHZ_RELATION_TYPE_UNKNOWN`). `removeDeny`/`listDenies` NO
300
+ * pasan por aquí: aceptan cualquier tipo declarado (D8/R2-4 b: retirar el opt-in tiene que ser reversible).
301
+ */
302
+ export declare function assertRelationDenyable(config: Pick<RelationsConfig, 'objectTypes'>, object: {
303
+ type: string;
304
+ }, relation: string): void;
305
+ /**
306
+ * **El comodín `*` no es un sujeto de deny** (D-17): un deny a «todos» sería un apagado del objeto que nadie
307
+ * auditaría como tal. Hoy la gramática de holder ya rechaza `*` (422 `E_AUTHZ_INVALID_IDENTITY`); esta guarda lo dice
308
+ * con el código del deny ANTES de la gramática, para que un cambio de la gramática no lo abra en silencio.
309
+ */
310
+ export declare function assertDenySubject(subject: unknown): void;
311
+ /**
312
+ * **D3: el deny no caduca en v1.** `expiresAt` en las opciones de `deny`/`removeDeny` —incluso `null`, que en `relate`
313
+ * significa «quitar la caducidad»— es 422 `E_AUTHZ_DENY_EXPIRY_UNSUPPORTED` ANTES de tocar el backend, con la razón
314
+ * medida (M5). La clave PRESENTE es lo que se rechaza: un `null` aceptado sería una puerta para que la siguiente
315
+ * versión la lea como «permanente» sin que nadie lo decidiera.
316
+ */
317
+ export declare function assertDenyNoExpiry(options: unknown): void;