@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,7 +1,46 @@
1
1
  import { AuthorizationManager } from '../src/manager.js';
2
+ import { RelationsManager } from '../src/relations/manager.js';
2
3
  /**
3
- * Registra el manager de autorización como singleton del contenedor,
4
- * construido desde `config/authorization.ts` de la aplicación.
4
+ * **Construye el `RelationsManager` de servicio desde el config** (Fase 4-8) —
5
+ * el análogo de resolver el `AuthorizationManager` del provider, pero para el
6
+ * puerto de relaciones. Función PURA (no toca el contenedor) para tener su caso
7
+ * sin montar la app: recibe el config y devuelve el manager cableado.
8
+ *
9
+ * El driver ACTIVO sale de `relations.drivers[relations.default ?? default]`
10
+ * (los drivers de relaciones se nombran igual que los de roles); la config, de
11
+ * `relations.config` (la MISMA que capturan las factories de `drivers`, así que
12
+ * la frontera F-05 del manager y la del driver son la misma). `requireActor` se
13
+ * hereda del config de roles: la política de auditoría es una sola.
14
+ *
15
+ * Sin `relations.config` o sin el driver activo lanza con la receta: las
16
+ * relaciones son OPT-IN y este servicio solo existe si el consumidor las
17
+ * declaró.
18
+ */
19
+ export async function buildRelationsManager(config) {
20
+ const relations = config.relations;
21
+ if (!relations?.config) {
22
+ throw new Error('No hay `relations.config` en config/authorization.ts: declara `relations: { config: ' +
23
+ 'defineRelationsConfig({...}), drivers: {...} }` para usar el servicio de relaciones ' +
24
+ '(@jantstack/adonis-authz/services/relations).');
25
+ }
26
+ const driverKey = relations.default ?? config.default;
27
+ const factory = relations.drivers?.[driverKey];
28
+ if (!factory) {
29
+ throw new Error(`No hay driver de relaciones '${driverKey}' en \`relations.drivers\` de config/authorization.ts ` +
30
+ `(declara la factory bajo esa clave, o fija \`relations.default\`).`);
31
+ }
32
+ const driver = await factory();
33
+ return new RelationsManager(driver, relations.config, {
34
+ requireActor: config.requireActor,
35
+ });
36
+ }
37
+ /**
38
+ * Registra los managers de autorización como singletons del contenedor,
39
+ * construidos desde `config/authorization.ts` de la aplicación:
40
+ *
41
+ * - `authz.manager`: el motor de roles (siempre).
42
+ * - `authz.relations`: el motor de ReBAC (solo si el consumidor declaró
43
+ * `relations.config`; si no, resolverlo lanza con la receta).
5
44
  */
6
45
  export default class AuthzProvider {
7
46
  app;
@@ -16,6 +55,13 @@ export default class AuthzProvider {
16
55
  }
17
56
  return new AuthorizationManager(config);
18
57
  });
58
+ this.app.container.singleton('authz.relations', async () => {
59
+ const config = this.app.config.get('authorization');
60
+ if (!config) {
61
+ throw new Error('Falta config/authorization.ts — ejecuta: node ace configure @jantstack/adonis-authz');
62
+ }
63
+ return buildRelationsManager(config);
64
+ });
19
65
  }
20
66
  }
21
67
  //# sourceMappingURL=authz_provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"authz_provider.js","sourceRoot":"","sources":["../../providers/authz_provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAQxD;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,aAAa;IACV;IAAtB,YAAsB,GAAuB;QAAvB,QAAG,GAAH,GAAG,CAAoB;IAAG,CAAC;IAEjD,QAAQ;QACN,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAQ,CAAA;YAC1D,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CACb,qFAAqF,CACtF,CAAA;YACH,CAAC;YACD,OAAO,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"authz_provider.js","sourceRoot":"","sources":["../../providers/authz_provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAU9D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAA2B;IACrE,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAA;IAClC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,sFAAsF;YACpF,sFAAsF;YACtF,+CAA+C,CAClD,CAAA;IACH,CAAC;IACD,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAA;IACrD,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAA;IAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,gCAAgC,SAAS,wDAAwD;YAC/F,oEAAoE,CACvE,CAAA;IACH,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAA;IAC9B,OAAO,IAAI,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE;QACpD,YAAY,EAAE,MAAM,CAAC,YAAY;KAClC,CAAC,CAAA;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,OAAO,aAAa;IACV;IAAtB,YAAsB,GAAuB;QAAvB,QAAG,GAAH,GAAG,CAAoB;IAAG,CAAC;IAEjD,QAAQ;QACN,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,eAAe,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAQ,CAAA;YAC1D,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CACb,qFAAqF,CACtF,CAAA;YACH,CAAC;YACD,OAAO,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAQ,CAAA;YAC1D,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CACb,qFAAqF,CACtF,CAAA;YACH,CAAC;YACD,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAA;QACtC,CAAC,CAAC,CAAA;IACJ,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import type { RelationsManager } from '../src/relations/manager.js';
2
+ /**
3
+ * Singleton del motor de relaciones (ReBAC), resuelto del contenedor cuando la
4
+ * app ha booteado — el análogo de `services/main` para el puerto
5
+ * `RelationsDriver`. Solo existe si el consumidor declaró `relations.config` en
6
+ * `config/authorization.ts`; si no, resolverlo lanza con la receta.
7
+ *
8
+ * import relations from '@jantstack/adonis-authz/services/relations'
9
+ * await relations.relate(user, 'viewer', { type: 'document', id }, APP_SCOPE)
10
+ * await relations.check(user, 'viewer', { type: 'document', id }, APP_SCOPE)
11
+ */
12
+ declare let relations: RelationsManager;
13
+ export { relations as default };
14
+ //# sourceMappingURL=relations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.d.ts","sourceRoot":"","sources":["../../services/relations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAEnE;;;;;;;;;GASG;AACH,QAAA,IAAI,SAAS,EAAE,gBAAgB,CAAA;AAM/B,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,CAAA"}
@@ -0,0 +1,17 @@
1
+ import app from '@adonisjs/core/services/app';
2
+ /**
3
+ * Singleton del motor de relaciones (ReBAC), resuelto del contenedor cuando la
4
+ * app ha booteado — el análogo de `services/main` para el puerto
5
+ * `RelationsDriver`. Solo existe si el consumidor declaró `relations.config` en
6
+ * `config/authorization.ts`; si no, resolverlo lanza con la receta.
7
+ *
8
+ * import relations from '@jantstack/adonis-authz/services/relations'
9
+ * await relations.relate(user, 'viewer', { type: 'document', id }, APP_SCOPE)
10
+ * await relations.check(user, 'viewer', { type: 'document', id }, APP_SCOPE)
11
+ */
12
+ let relations;
13
+ await app.booted(async () => {
14
+ relations = await app.container.make('authz.relations');
15
+ });
16
+ export { relations as default };
17
+ //# sourceMappingURL=relations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.js","sourceRoot":"","sources":["../../services/relations.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,6BAA6B,CAAA;AAG7C;;;;;;;;;GASG;AACH,IAAI,SAA2B,CAAA;AAE/B,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;IAC1B,SAAS,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;AACzD,CAAC,CAAC,CAAA;AAEF,OAAO,EAAE,SAAS,IAAI,OAAO,EAAE,CAAA"}
@@ -0,0 +1,289 @@
1
+ import type { CatalogProjection, CatalogProjectionReport, CatalogProjectionSnapshot, CatalogRoleRef, CatalogSpec, ScopeChainResolver, ScopeType } from '../types.js';
2
+ /**
3
+ * `assignableAt` de un permiso tal como se GUARDA (`authz_permissions.assignable_at`):
4
+ * JSON ordenado y sin duplicados, o `null` = cualquier nivel. Ordenado para
5
+ * que dos specs equivalentes sean la misma cadena (el sync compara texto).
6
+ */
7
+ export declare function encodeAssignableAt(levels: ScopeType[] | undefined): string | null;
8
+ /**
9
+ * `assignable_at` tal como está EN LA BASE, normalizado a la forma en la que
10
+ * el spec lo codifica (3D · N5): es lo que permite que el sync y el diff
11
+ * comparen lo mismo. Hasta aquí el sync comparaba la cadena cruda y el diff
12
+ * la lista parseada, así que un valor desordenado a mano (`["unit","app"]`)
13
+ * salía «en sync» y el sync lo reescribía. Un valor CORRUPTO no lanza aquí:
14
+ * cuenta como distinto, para que el sync lo repare en vez de atragantarse
15
+ * (leerlo sí es 500, `parseAssignableAt`).
16
+ */
17
+ export declare function storedAssignableAt(slug: string, raw: unknown): string | null;
18
+ /** Marca de `storedAssignableAt` para una fila que no se puede leer (3D · N5). */
19
+ export declare const CORRUPT_ASSIGNABLE_AT = "\0corrupto";
20
+ /** Un rol de nivel `scopeType` que lleva `permission` con esos `levels` (o `null`): legal, o 422 `E_AUTHZ_ROLE_NOT_ASSIGNABLE_AT`. */
21
+ export declare function assertAssignableAt(role: {
22
+ slug: string;
23
+ scopeType: ScopeType;
24
+ }, permission: string, levels: readonly ScopeType[] | null): void;
25
+ /**
26
+ * Longitud de `authz_permissions.assignable_at` (`varchar(500)` en el stub y
27
+ * en el espejo). El JSON codificado tiene que caber (3D · N3).
28
+ */
29
+ export declare const ASSIGNABLE_AT_MAX = 500;
30
+ /** Deadline de cada consulta del catálogo (D15); configurable por `timeoutMs`. */
31
+ export declare const DEFAULT_CATALOG_TIMEOUT_MS = 5000;
32
+ /**
33
+ * Lo que un `syncAuthzCatalog` deja DICHO (3E · P1 b / P6). El sync del
34
+ * despliegue es todo-o-nada para lo que ESCRIBE, pero no puede abortar por
35
+ * lo que un tenant hizo en su scope: hasta 3E, un rol local homónimo tumbaba
36
+ * el catálogo entero de la plataforma (auditor A1: el actor de menor
37
+ * privilegio del sistema paraba el deploy). La política es **reportar y
38
+ * seguir**, nunca romper en silencio: se escribe el global —los globales
39
+ * ganan— y aquí queda quién se ve afectado.
40
+ */
41
+ export interface CatalogSyncReport {
42
+ /**
43
+ * Roles LOCALES cuyo `(slug, nivel)` acaba de ocupar un rol GLOBAL del
44
+ * spec (3E · P1 b). El global manda; el local sigue en la base pero desde
45
+ * ya toda ruta por slug en su cadena es 422 `E_AUTHZ_AMBIGUOUS_ROLE` (M1,
46
+ * fail-closed): su tenant tiene que direccionar por `{ uuid }` o pedir que
47
+ * lo purguen. `authz:catalog:diff` los lista y sale con código ≠ 0.
48
+ */
49
+ shadowedByGlobal: CatalogRoleRef[];
50
+ /**
51
+ * Vínculos rol→permiso que YA existían y que el `assignableAt` nuevo del
52
+ * config ya no admite (3E · P6): estrechar `assignableAt` no revalidaba
53
+ * los roles que ya llevaban el permiso —ni el diff los mencionaba—, así
54
+ * que la restricción entraba a medias y en silencio. No se borran (lo
55
+ * asignado sigue concediendo, invariante 1): se reportan para que el
56
+ * operador decida (`updateScopedRole`, `deleteScopedRole` o ampliar el
57
+ * `assignableAt`).
58
+ */
59
+ assignableAtViolations: Array<{
60
+ role: CatalogRoleRef;
61
+ permission: string;
62
+ }>;
63
+ /**
64
+ * Lo que movió la proyección del driver, si se pasó una (3b-2a · A5).
65
+ * Ausente sin `projection`. Nunca un booleano: una proyección que no dice
66
+ * cuánto escribió y cuánto borró no se vigila.
67
+ */
68
+ projection?: CatalogProjectionReport;
69
+ }
70
+ export interface SyncCatalogOptions {
71
+ /**
72
+ * Qué hacer con los vínculos rol→permiso que el spec YA NO lista, para los
73
+ * roles DEL SPEC (L0.9). `'links'` (default): se eliminan en la misma
74
+ * transacción. `'none'`: sync solo aditivo (el comportamiento de 1.x).
75
+ * Nunca se borran roles ni permisos, y los roles ajenos al spec no se
76
+ * tocan: dos catálogos (plataforma y tenant) coexisten.
77
+ */
78
+ prune?: 'links' | 'none';
79
+ /**
80
+ * Deadline de cada consulta en ms (default 5000). La base caída o lenta
81
+ * es 503 `E_AUTHZ_BACKEND_UNAVAILABLE`/`_TIMEOUT`, no un error crudo del
82
+ * cliente SQL: el sync corre en el arranque de un despliegue (D15).
83
+ */
84
+ timeoutMs?: number;
85
+ /**
86
+ * Proyección DERIVADA del catálogo en el backend de un driver (3b-2a · A5;
87
+ * regla del catálogo reescrita, panel 2 cruce 7). Se INYECTA en vez de
88
+ * importarse: este módulo es la ruta de un consumidor solo-database y no
89
+ * puede tirar del SDK de OpenFGA (regla 3 de `check_purity.mjs`).
90
+ *
91
+ * Con ella, el sync (a) comprueba ANTES de escribir que el catálogo que va
92
+ * a quedar es publicable en ese backend —cotas de nombre y techo del
93
+ * modelo, A3/A4—, y (b) rehace la proyección con el catálogo ya
94
+ * CONFIRMADO. En ese orden: la fuente de verdad son las tablas `authz_*`,
95
+ * y una proyección que se adelantara a la transacción concedería lo que la
96
+ * base no respalda. Si la proyección falla, el catálogo ya está escrito y
97
+ * lo que queda es deriva reconstruible (`authz:reconcile`), no una
98
+ * decisión inventada.
99
+ */
100
+ projection?: CatalogProjection;
101
+ }
102
+ /**
103
+ * Sincroniza un catálogo (roles + permisos + vínculos) a las tablas `authz_*`.
104
+ *
105
+ * Idempotente y transaccional. Permisos y roles se crean si faltan (nunca se
106
+ * borran: la limpieza de un rol o permiso retirado es una decisión explícita
107
+ * del consumidor, porque arrastra asignaciones). Los vínculos rol→permiso
108
+ * son la excepción: con `prune: 'links'` (default) el spec MANDA sobre los
109
+ * roles que declara. Antes el sync era solo aditivo y quitar un permiso de
110
+ * un rol en el config no lo quitaba de ningún entorno — la única fuente de
111
+ * verdad visible mentía sobre los permisos efectivos (L0.9, N1).
112
+ *
113
+ * Un rol que concede un permiso que no existe ni en este spec ni en la base
114
+ * (sincronizado por otro catálogo) es 422 `E_AUTHZ_UNKNOWN_PERMISSION`:
115
+ * antes se saltaba en silencio.
116
+ *
117
+ * Lo usan el seeder del nivel app, `authz:catalog:sync` y el harness de la
118
+ * suite de contrato. El catálogo es metadata compartida entre drivers: un
119
+ * driver externo (openfga) materializa aparte solo los hechos.
120
+ */
121
+ export declare function syncAuthzCatalog(catalog: CatalogSpec, options?: SyncCatalogOptions): Promise<CatalogSyncReport>;
122
+ /**
123
+ * **La foto del catálogo que se PROYECTA** (3b-2a · A5), leída de `authz_*`.
124
+ *
125
+ * Es el catálogo ENTERO, no el spec que se está sincronizando: la proyección
126
+ * es un espejo y lo que sobra en el backend solo se sabe comparando contra
127
+ * todo. `syncAuthzCatalog` la lee DENTRO de su transacción (coherente con lo
128
+ * que acaba de escribir) y `authz:reconcile` fuera, contra la base: las dos
129
+ * tienen que construir exactamente la misma foto, o reconcile "arreglaría" en
130
+ * cada pasada lo que el sync acaba de dejar bien. Por eso está aquí y no
131
+ * duplicada en el driver.
132
+ *
133
+ * `source` es cualquier cosa con `from(tabla)` (el `db` de Lucid o una
134
+ * transacción) y `sql` envuelve cada consulta con el deadline de quien llama.
135
+ */
136
+ export declare function readCatalogProjectionSnapshot(source: {
137
+ from(table: string): any;
138
+ }, sql?: <T>(operation: string, fn: () => Promise<T>) => Promise<T>): Promise<CatalogProjectionSnapshot>;
139
+ export interface CatalogLinkRef {
140
+ role: string;
141
+ scopeType: ScopeType;
142
+ permission: string;
143
+ }
144
+ export interface CatalogDiff {
145
+ /** Permisos del spec que no existen en la base. */
146
+ missingPermissions: string[];
147
+ /** Roles del spec que no existen en la base. */
148
+ missingRoles: Array<{
149
+ slug: string;
150
+ scopeType: ScopeType;
151
+ }>;
152
+ /** Vínculos que el spec declara y la base no tiene. */
153
+ missingLinks: CatalogLinkRef[];
154
+ /** Vínculos que la base tiene, en roles DEL SPEC, y el spec ya no lista (privilegio zombi). */
155
+ extraLinks: CatalogLinkRef[];
156
+ /** Roles cuyo rank en la base difiere del spec. */
157
+ rankMismatches: Array<{
158
+ role: string;
159
+ scopeType: ScopeType;
160
+ expected: number;
161
+ actual: number;
162
+ }>;
163
+ /**
164
+ * Permisos del spec cuyo `assignableAt` en la base difiere (3B · B5):
165
+ * `null` = cualquier nivel. `corrupt: true` (3E · P5) es una fila que no
166
+ * se puede leer (`assignable_at` que no es JSON de niveles): cuenta como
167
+ * diferencia —el sync la repara— y el diff la nombra en vez de morir.
168
+ */
169
+ assignableAtMismatches: Array<{
170
+ permission: string;
171
+ expected: ScopeType[] | null;
172
+ actual: ScopeType[] | null;
173
+ corrupt?: boolean;
174
+ }>;
175
+ /**
176
+ * Roles LOCALES (3B): propios de un scope, definidos con `defineScopedRole`.
177
+ * Informativo: no son sobrantes ni faltantes (el spec solo declara
178
+ * globales) y no afectan a `catalogInSync`.
179
+ */
180
+ scopedRoles: Array<{
181
+ slug: string;
182
+ scopeType: ScopeType;
183
+ owner: string;
184
+ }>;
185
+ /**
186
+ * `(slug, nivel)` con MÁS DE UN rol visible desde una misma cadena que la
187
+ * AUTORIDAD no sabe ordenar (3D · M2 d; 3F · S3). Desde 3F, la pareja
188
+ * global+local va a `shadowedByGlobal` y la de ancestro+descendiente a
189
+ * `shadowedByAncestor` —las dos son el orden de autoridad funcionando, no
190
+ * deriva—, así que aquí solo queda lo que NINGUNA regla ordena: dos
191
+ * locales que se declaran ancestro el uno del otro (un `resolveChain` con
192
+ * un ciclo o que se contradice). Eso sí es deriva REAL —`catalogInSync` es
193
+ * `false` y el comando sale con código ≠ 0—: mientras dure, toda ruta por
194
+ * slug ahí responde 422 `E_AUTHZ_AMBIGUOUS_ROLE` (M1) y el operador tiene
195
+ * que PURGAR uno (un rol local no se renombra: 3E · Q1). Las parejas de
196
+ * locales solo se juzgan con `resolveChain` (el árbol es del consumidor):
197
+ * sin resolutor se dice en el informe.
198
+ */
199
+ ambiguousRoles: Array<{
200
+ slug: string;
201
+ scopeType: ScopeType;
202
+ owners: string[];
203
+ }>;
204
+ /**
205
+ * Roles LOCALES ensombrecidos por un rol GLOBAL homónimo: el del spec que
206
+ * el sync va a escribir (3E · P1 b) o uno que ya está en la base. **No es
207
+ * deriva** desde 3F · S3: es el orden de AUTORIDAD funcionando (global >
208
+ * local), igual que `shadowedByAncestor`. Se listan para que el operador
209
+ * los vea —mientras duren, ese slug es 422 `E_AUTHZ_AMBIGUOUS_ROLE` en la
210
+ * cadena de esos owners y se opera por `{ uuid }`—, pero no dejan el gate
211
+ * de CI en rojo: un tenant que ocupa un nombre no puede parar el deploy de
212
+ * la plataforma, ni siquiera por la vía del `exit 1` (auditor N1).
213
+ */
214
+ shadowedByGlobal: Array<{
215
+ slug: string;
216
+ scopeType: ScopeType;
217
+ owner: string;
218
+ }>;
219
+ /**
220
+ * Roles LOCALES ensombrecidos por otro LOCAL homónimo cuyo owner es un
221
+ * ANCESTRO suyo (3F · S3): el dueño del árbol definió el suyo y el del
222
+ * descendiente queda tapado dentro de su propio subárbol. Como
223
+ * `shadowedByGlobal`: se lista, no es deriva.
224
+ */
225
+ shadowedByAncestor: Array<{
226
+ slug: string;
227
+ scopeType: ScopeType;
228
+ owner: string;
229
+ shadowedBy: string;
230
+ }>;
231
+ /**
232
+ * Vínculos rol→permiso vivos que el `assignableAt` del spec ya no admite
233
+ * (3E · P6), en roles que el sync no toca (locales y globales de otro
234
+ * catálogo). El sync los reporta igual; el diff los dice antes.
235
+ */
236
+ assignableAtViolations: Array<{
237
+ role: string;
238
+ scopeType: ScopeType;
239
+ owner: string;
240
+ permission: string;
241
+ }>;
242
+ }
243
+ /**
244
+ * Compara un spec con lo que hay en `authz_*`, sin escribir. Igual que el
245
+ * sync, solo mira los roles del spec: lo ajeno (otro catálogo) no es una
246
+ * diferencia. Un diff limpio significa que `syncAuthzCatalog(spec)` sería un
247
+ * no-op.
248
+ */
249
+ export declare function diffAuthzCatalog(catalog: CatalogSpec, options?: {
250
+ timeoutMs?: number;
251
+ resolveChain?: ScopeChainResolver;
252
+ }): Promise<CatalogDiff>;
253
+ export declare function catalogInSync(diff: CatalogDiff): boolean;
254
+ /** Líneas legibles del diff (vacío si está en sync). */
255
+ export declare function formatCatalogDiff(diff: CatalogDiff): string[];
256
+ /** Líneas informativas del diff (no son diferencias): los roles locales, propios de un scope. */
257
+ export declare function formatScopedRoles(diff: CatalogDiff): string[];
258
+ /**
259
+ * Líneas informativas del diff (3F · S3): los roles locales ENSOMBRECIDOS
260
+ * por una definición más autorizada —un global, o un local de un ancestro—.
261
+ * No son deriva: es el orden de autoridad funcionando. Se listan porque
262
+ * mientras duren, ese slug es 422 `E_AUTHZ_AMBIGUOUS_ROLE` en la cadena de
263
+ * su owner y hay que operar por `{ uuid }` (o purgar uno de los dos).
264
+ */
265
+ export declare function formatShadowedRoles(diff: Pick<CatalogDiff, 'shadowedByGlobal' | 'shadowedByAncestor'>): string[];
266
+ /** Fábricas de catálogo tal como se declaran en `config.catalogs`. */
267
+ export type CatalogSource = () => Promise<CatalogSpec> | CatalogSpec;
268
+ /**
269
+ * El diff de TODOS los catálogos del config. `inSync: false` ⇒ el comando
270
+ * sale con código ≠ 0 (para CI). Separado del comando para poder probarlo
271
+ * sin un kernel de ace.
272
+ */
273
+ export declare function runCatalogDiff(catalogs: CatalogSource[], options?: {
274
+ resolveChain?: ScopeChainResolver;
275
+ failOnShadows?: boolean;
276
+ }): Promise<{
277
+ inSync: boolean;
278
+ lines: string[];
279
+ }>;
280
+ /**
281
+ * Sincroniza todos los catálogos del config, en orden (lo que hace
282
+ * `authz:catalog:sync`). Devuelve cuántos y lo que hay que DECIR (3E · P1 b
283
+ * / P6): el comando lo imprime como aviso — reportar y seguir, nunca romper
284
+ * en silencio.
285
+ */
286
+ export declare function syncCatalogs(catalogs: CatalogSource[], options?: SyncCatalogOptions): Promise<{
287
+ count: number;
288
+ } & CatalogSyncReport>;
289
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/catalog/catalog.ts"],"names":[],"mappings":"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"}