@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
@@ -2,13 +2,22 @@ import { BaseCommand } from '@adonisjs/core/ace';
2
2
  import { CommandOptions } from '@adonisjs/core/types/ace';
3
3
  /**
4
4
  * Provisiona OpenFGA para el driver `openfga` del motor de autorización:
5
- * crea un store y escribe el authorization model del chasis. Imprime los
6
- * ids para el .env (OPENFGA_STORE_ID / OPENFGA_MODEL_ID).
5
+ * crea un store y escribe el authorization model **`facts` (c2r)** del
6
+ * chasis. Imprime los ids para el .env (OPENFGA_STORE_ID / OPENFGA_MODEL_ID).
7
+ *
8
+ * **Publica el modelo `facts`** (3b-2k · K2): hasta 2.2 publicaba el del modo
9
+ * `resolver`, que ya no existe. Ese modelo declara CUATRO relaciones por
10
+ * permiso (`<P>`, `can_<P>`, `denied_<P>`, `permits_<P>`), así que necesita
11
+ * la lista de permisos: sale de los `catalogs` del config, resueltos aquí
12
+ * mismo (son funciones y no tocan la base). Sin `catalogs` no hay modelo que
13
+ * publicar y el comando sale ≠ 0 en vez de dejar un store que no responde a
14
+ * ninguna pregunta.
7
15
  *
8
16
  * Idempotencia: cada ejecución crea un store NUEVO (los stores son baratos y
9
17
  * aislados); re-ejecutar sobre un store existente no es necesario salvo que
10
- * cambie el modelo — en ese caso usar --store-id para escribir un model nuevo
11
- * versionado sobre el mismo store.
18
+ * cambie el modelo —añadir o quitar un permiso del catálogo lo cambia— y en
19
+ * ese caso se usa --store-id para escribir un model nuevo versionado sobre el
20
+ * mismo store.
12
21
  *
13
22
  * @example
14
23
  * node ace openfga:provision # usa OPENFGA_URL del .env
@@ -23,5 +32,38 @@ export default class OpenFgaProvision extends BaseCommand {
23
32
  storeId: string | undefined;
24
33
  name: string | undefined;
25
34
  run(): Promise<void>;
35
+ /**
36
+ * Los permisos del modelo, o `null` (y exit 1) si no hay ninguno: un modelo
37
+ * `facts` sin permisos no puede responder a nada, y descubrirlo aquí es
38
+ * mucho mejor que descubrirlo en el primer `authorize`.
39
+ */
40
+ private resolvePermissions;
26
41
  }
42
+ /**
43
+ * Los slugs de permiso de TODOS los catálogos del config, sin duplicados y en
44
+ * orden estable (3b-2k · K2). Se exporta —y no es un método— para que se
45
+ * pueda juzgar sin montar un comando de ace: es la pieza que decide qué
46
+ * relaciones lleva el modelo `facts`, y una lista vacía es lo que hace que el
47
+ * comando se niegue a provisionar.
48
+ *
49
+ * Los catálogos del config son FUNCIONES del consumidor (pueden cargar otro
50
+ * módulo perezosamente) y no tocan la base: el modelo se publica antes de que
51
+ * haya una sola fila.
52
+ */
53
+ export declare function permissionsOfCatalogs(config: any): Promise<string[]>;
54
+ /**
55
+ * Los tipos de relación (ReBAC) que van FUSIONADOS en el modelo `facts`
56
+ * (Fase 4-8), leídos del CONFIG estático `relations.config` — o `undefined` si
57
+ * el consumidor no declaró relaciones (modelo facts-only, como hasta 4-8). Se
58
+ * exporta —y no es un método— para juzgar la decisión sin montar un ace: es la
59
+ * pieza que decide si un store recién aprovisionado acepta tuplas de relación.
60
+ *
61
+ * La fuente es el config (`relations.config`), NO `authz_relations_config` de
62
+ * la base: `openfga:provision` es `startApp: false` (bootstrap sin base) y el
63
+ * config es lo único que tiene cargado — igual que los permisos salen de
64
+ * `catalogs` y no de `authz_permissions`.
65
+ */
66
+ export declare function relationsConfigOf(config: any): {
67
+ objectTypes: readonly any[];
68
+ } | undefined;
27
69
  //# sourceMappingURL=openfga_provision.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openfga_provision.d.ts","sourceRoot":"","sources":["../../commands/openfga_provision.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAS,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAEzD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,WAAW;IACvD,MAAM,CAAC,WAAW,SAAsB;IACxC,MAAM,CAAC,WAAW,SAAoE;IAEtF,MAAM,CAAC,OAAO,EAAE,cAAc,CAE7B;IAGO,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IAGvB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAG3B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IAE1B,GAAG;CAqCV"}
1
+ {"version":3,"file":"openfga_provision.d.ts","sourceRoot":"","sources":["../../commands/openfga_provision.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAS,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAEzD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,WAAW;IACvD,MAAM,CAAC,WAAW,SAAsB;IACxC,MAAM,CAAC,WAAW,SAAoE;IAEtF,MAAM,CAAC,OAAO,EAAE,cAAc,CAE7B;IAGO,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;IAGvB,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;IAG3B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IAE1B,GAAG;IA2DT;;;;OAIG;YACW,kBAAkB;CAajC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQ1E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,GAAG,GAAG;IAAE,WAAW,EAAE,SAAS,GAAG,EAAE,CAAA;CAAE,GAAG,SAAS,CAI1F"}
@@ -10,13 +10,22 @@ var __metadata = (this && this.__metadata) || function (k, v) {
10
10
  import { BaseCommand, flags } from '@adonisjs/core/ace';
11
11
  /**
12
12
  * Provisiona OpenFGA para el driver `openfga` del motor de autorización:
13
- * crea un store y escribe el authorization model del chasis. Imprime los
14
- * ids para el .env (OPENFGA_STORE_ID / OPENFGA_MODEL_ID).
13
+ * crea un store y escribe el authorization model **`facts` (c2r)** del
14
+ * chasis. Imprime los ids para el .env (OPENFGA_STORE_ID / OPENFGA_MODEL_ID).
15
+ *
16
+ * **Publica el modelo `facts`** (3b-2k · K2): hasta 2.2 publicaba el del modo
17
+ * `resolver`, que ya no existe. Ese modelo declara CUATRO relaciones por
18
+ * permiso (`<P>`, `can_<P>`, `denied_<P>`, `permits_<P>`), así que necesita
19
+ * la lista de permisos: sale de los `catalogs` del config, resueltos aquí
20
+ * mismo (son funciones y no tocan la base). Sin `catalogs` no hay modelo que
21
+ * publicar y el comando sale ≠ 0 en vez de dejar un store que no responde a
22
+ * ninguna pregunta.
15
23
  *
16
24
  * Idempotencia: cada ejecución crea un store NUEVO (los stores son baratos y
17
25
  * aislados); re-ejecutar sobre un store existente no es necesario salvo que
18
- * cambie el modelo — en ese caso usar --store-id para escribir un model nuevo
19
- * versionado sobre el mismo store.
26
+ * cambie el modelo —añadir o quitar un permiso del catálogo lo cambia— y en
27
+ * ese caso se usa --store-id para escribir un model nuevo versionado sobre el
28
+ * mismo store.
20
29
  *
21
30
  * @example
22
31
  * node ace openfga:provision # usa OPENFGA_URL del .env
@@ -38,25 +47,61 @@ export default class OpenFgaProvision extends BaseCommand {
38
47
  return;
39
48
  }
40
49
  const { OpenFgaClient } = await import('@openfga/sdk');
41
- const { openFgaAuthorizationModel, provisionOpenFgaStore } = await import('../src/drivers/openfga_driver.js');
50
+ // El subpath `/openfga` es la única puerta al SDK (D9).
51
+ const { openFgaFactsModel, provisionOpenFgaStore } = await import('../src/openfga.js');
42
52
  // Los holders del consumidor viven en SU config, no en el paquete.
43
53
  const holderTypes = config?.holderTypes ?? {};
54
+ // Los PERMISOS del modelo (c2r) salen de los catálogos del config. Se
55
+ // resuelven aquí porque son funciones del consumidor (pueden cargar otro
56
+ // módulo) y no necesitan la base: el modelo se publica antes de que haya
57
+ // una sola fila.
58
+ const permissions = await this.resolvePermissions(config);
59
+ if (!permissions)
60
+ return;
61
+ // Los tipos de RELACIÓN (ReBAC) que el modelo lleva FUSIONADOS (Fase 4-8):
62
+ // salen del CONFIG estático (`relations.config`), igual que los permisos
63
+ // salen de `catalogs`. El comando es `startApp: false` (bootstrap del
64
+ // appliance, ANTES de que haya base) y no puede leer `authz_relations_config`
65
+ // de la BD; el config sí está cargado. Sin `relations.config` el modelo es
66
+ // facts-only, como hasta ahora. Con él, un store recién aprovisionado ya
67
+ // acepta tuplas de relación sin un `authz:catalog:sync` previo.
68
+ const relations = relationsConfigOf(config);
44
69
  if (this.storeId) {
45
70
  const client = new OpenFgaClient({ apiUrl, storeId: this.storeId });
46
- const model = await client.writeAuthorizationModel(openFgaAuthorizationModel(holderTypes));
71
+ const model = await client.writeAuthorizationModel(openFgaFactsModel(holderTypes, permissions, relations));
47
72
  this.logger.success('Nuevo authorization model escrito en el store existente.');
73
+ if (relations)
74
+ this.logger.info(`Tipos de relación fusionados: ${relations.objectTypes.map((t) => t.type).join(', ')}`);
48
75
  this.logger.log(`OPENFGA_STORE_ID=${this.storeId}`);
49
76
  this.logger.log(`OPENFGA_MODEL_ID=${model.authorization_model_id}`);
50
77
  return;
51
78
  }
52
79
  // El paquete no lee env: el default APP_NAME se resuelve aquí (chasis).
53
- const { storeId, modelId } = await provisionOpenFgaStore(apiUrl, this.name ?? config?.openfga?.storeName ?? this.app.appName, holderTypes);
80
+ const { storeId, modelId } = await provisionOpenFgaStore(apiUrl, this.name ?? config?.openfga?.storeName ?? this.app.appName, holderTypes, permissions, relations);
81
+ if (relations)
82
+ this.logger.info(`Tipos de relación fusionados: ${relations.objectTypes.map((t) => t.type).join(', ')}`);
54
83
  this.logger.success('Store + authorization model provisionados.');
55
84
  this.logger.log('Añade al .env (junto a AUTHZ_DRIVER=openfga):');
56
85
  this.logger.log(`OPENFGA_URL=${apiUrl}`);
57
86
  this.logger.log(`OPENFGA_STORE_ID=${storeId}`);
58
87
  this.logger.log(`OPENFGA_MODEL_ID=${modelId}`);
59
88
  }
89
+ /**
90
+ * Los permisos del modelo, o `null` (y exit 1) si no hay ninguno: un modelo
91
+ * `facts` sin permisos no puede responder a nada, y descubrirlo aquí es
92
+ * mucho mejor que descubrirlo en el primer `authorize`.
93
+ */
94
+ async resolvePermissions(config) {
95
+ const slugs = await permissionsOfCatalogs(config);
96
+ if (slugs.length === 0) {
97
+ this.logger.error('El modelo `facts` declara cuatro relaciones por permiso: sin `catalogs` en ' +
98
+ 'config/authorization.ts no hay modelo que publicar. Declara tus catálogos y repite ' +
99
+ '(el store que se creara sin ellos denegaría todo).');
100
+ this.exitCode = 1;
101
+ return null;
102
+ }
103
+ return slugs;
104
+ }
60
105
  }
61
106
  __decorate([
62
107
  flags.string({ description: 'OpenFGA API URL (defaults to OPENFGA_URL)' }),
@@ -70,4 +115,43 @@ __decorate([
70
115
  flags.string({ description: 'Store name when creating one (default: APP_NAME del entorno)' }),
71
116
  __metadata("design:type", Object)
72
117
  ], OpenFgaProvision.prototype, "name", void 0);
118
+ /**
119
+ * Los slugs de permiso de TODOS los catálogos del config, sin duplicados y en
120
+ * orden estable (3b-2k · K2). Se exporta —y no es un método— para que se
121
+ * pueda juzgar sin montar un comando de ace: es la pieza que decide qué
122
+ * relaciones lleva el modelo `facts`, y una lista vacía es lo que hace que el
123
+ * comando se niegue a provisionar.
124
+ *
125
+ * Los catálogos del config son FUNCIONES del consumidor (pueden cargar otro
126
+ * módulo perezosamente) y no tocan la base: el modelo se publica antes de que
127
+ * haya una sola fila.
128
+ */
129
+ export async function permissionsOfCatalogs(config) {
130
+ const sources = config?.catalogs ?? [];
131
+ const slugs = new Set();
132
+ for (const source of sources) {
133
+ const catalog = await source();
134
+ for (const permission of catalog?.permissions ?? [])
135
+ slugs.add(permission.slug);
136
+ }
137
+ return [...slugs].sort();
138
+ }
139
+ /**
140
+ * Los tipos de relación (ReBAC) que van FUSIONADOS en el modelo `facts`
141
+ * (Fase 4-8), leídos del CONFIG estático `relations.config` — o `undefined` si
142
+ * el consumidor no declaró relaciones (modelo facts-only, como hasta 4-8). Se
143
+ * exporta —y no es un método— para juzgar la decisión sin montar un ace: es la
144
+ * pieza que decide si un store recién aprovisionado acepta tuplas de relación.
145
+ *
146
+ * La fuente es el config (`relations.config`), NO `authz_relations_config` de
147
+ * la base: `openfga:provision` es `startApp: false` (bootstrap sin base) y el
148
+ * config es lo único que tiene cargado — igual que los permisos salen de
149
+ * `catalogs` y no de `authz_permissions`.
150
+ */
151
+ export function relationsConfigOf(config) {
152
+ const objectTypes = config?.relations?.config?.objectTypes;
153
+ if (!Array.isArray(objectTypes) || objectTypes.length === 0)
154
+ return undefined;
155
+ return { objectTypes };
156
+ }
73
157
  //# sourceMappingURL=openfga_provision.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"openfga_provision.js","sourceRoot":"","sources":["../../commands/openfga_provision.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAGvD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,WAAW;IACvD,MAAM,CAAC,WAAW,GAAG,mBAAmB,CAAA;IACxC,MAAM,CAAC,WAAW,GAAG,iEAAiE,CAAA;IAEtF,MAAM,CAAC,OAAO,GAAmB;QAC/B,QAAQ,EAAE,KAAK;KAChB,CAAA;IAWD,KAAK,CAAC,GAAG;QACP,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAQ,CAAA;QAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,MAAM,EAAE,OAAO,EAAE,GAAG,CAAA;QAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6EAA6E,CAAC,CAAA;YAChG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;YACjB,OAAM;QACR,CAAC;QAED,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;QACtD,MAAM,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CACvE,kCAAkC,CACnC,CAAA;QACD,mEAAmE;QACnE,MAAM,WAAW,GAAG,MAAM,EAAE,WAAW,IAAI,EAAE,CAAA;QAE7C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;YACnE,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,uBAAuB,CAAC,yBAAyB,CAAC,WAAW,CAAC,CAAC,CAAA;YAC1F,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAA;YAC/E,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;YACnD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,sBAAsB,EAAE,CAAC,CAAA;YACnE,OAAM;QACR,CAAC;QAED,wEAAwE;QACxE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,qBAAqB,CACtD,MAAM,EACN,IAAI,CAAC,IAAI,IAAI,MAAM,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAC3D,WAAW,CACZ,CAAA;QACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAA;QACjE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAA;QAChE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,MAAM,EAAE,CAAC,CAAA;QACxC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAA;QAC9C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAA;IAChD,CAAC;;AA5CO;IADP,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,2CAA2C,EAAE,CAAC;;6CAC5C;AAGvB;IADP,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,0CAA0C,EAAE,CAAC;;iDACnD;AAG3B;IADP,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,8DAA8D,EAAE,CAAC;;8CAC9D"}
1
+ {"version":3,"file":"openfga_provision.js","sourceRoot":"","sources":["../../commands/openfga_provision.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,17 @@ import type Configure from '@adonisjs/core/commands/configure';
5
5
  * Registra el provider, los comandos y el middleware, define las variables
6
6
  * de entorno y PUBLICA en el proyecto lo que es suyo: la migración de las
7
7
  * tablas `authz_*` y los dos configs (drivers + catálogo del nivel app).
8
+ *
9
+ * Es INTERACTIVO: pregunta lo MÍNIMO que cambia lo publicado —el driver por
10
+ * defecto y si publicar la migración de la outbox del árbol (opt-in, ver
11
+ * README)— con `command.prompt`. Lo que NO cambia según la respuesta no se
12
+ * pregunta: los dos configs siempre se publican con las dos costuras cableadas
13
+ * (el stub arranca en cualquier driver leyendo `AUTHZ_DRIVER`), así que la
14
+ * elección solo fija el DEFAULT de esa variable, no ramifica el stub —el que
15
+ * `configure.spec` compila sigue siendo el mismo—. Y las relaciones (Fase 4)
16
+ * NO se preguntan: sus tablas ya están en la migración del motor y su config
17
+ * es `defineRelationsConfig` en el propio proyecto; un prompt ahí no publicaría
18
+ * nada distinto.
8
19
  */
9
20
  export declare function configure(command: Configure): Promise<void>;
10
21
  //# sourceMappingURL=configure.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../configure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,mCAAmC,CAAA;AAG9D;;;;;;GAMG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,SAAS,iBAuCjD"}
1
+ {"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../configure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,mCAAmC,CAAA;AAG9D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,SAAS,iBA4EjD"}
@@ -5,9 +5,30 @@ import { stubsRoot } from './stubs/main.js';
5
5
  * Registra el provider, los comandos y el middleware, define las variables
6
6
  * de entorno y PUBLICA en el proyecto lo que es suyo: la migración de las
7
7
  * tablas `authz_*` y los dos configs (drivers + catálogo del nivel app).
8
+ *
9
+ * Es INTERACTIVO: pregunta lo MÍNIMO que cambia lo publicado —el driver por
10
+ * defecto y si publicar la migración de la outbox del árbol (opt-in, ver
11
+ * README)— con `command.prompt`. Lo que NO cambia según la respuesta no se
12
+ * pregunta: los dos configs siempre se publican con las dos costuras cableadas
13
+ * (el stub arranca en cualquier driver leyendo `AUTHZ_DRIVER`), así que la
14
+ * elección solo fija el DEFAULT de esa variable, no ramifica el stub —el que
15
+ * `configure.spec` compila sigue siendo el mismo—. Y las relaciones (Fase 4)
16
+ * NO se preguntan: sus tablas ya están en la migración del motor y su config
17
+ * es `defineRelationsConfig` en el propio proyecto; un prompt ahí no publicaría
18
+ * nada distinto.
8
19
  */
9
20
  export async function configure(command) {
10
21
  const codemods = await command.createCodemods();
22
+ // ── Preguntas (las únicas que cambian lo que se publica) ──────────────────
23
+ const defaultDriver = await command.prompt.choice('¿Qué driver de autorización por defecto? (AUTHZ_DRIVER; puedes cambiarlo por entorno)', [
24
+ { name: 'database', message: 'database — SQL propio, sin infraestructura extra (recomendado)' },
25
+ { name: 'openfga', message: 'openfga — los hechos viven en un servidor OpenFGA (necesita @openfga/sdk)' },
26
+ ], { default: 'database' });
27
+ // La outbox del árbol de scopes es OPT-IN (README: «configure no la publica,
28
+ // porque la outbox es opcional»). Se ofrece porque, sin ella, el consumidor
29
+ // tenía que copiar el stub a mano; sigue siendo suya y hay que registrar
30
+ // `sqlScopeOutbox()` en el config para usarla.
31
+ const withOutbox = await command.prompt.confirm('¿Publicar la migración de la outbox del árbol de scopes? (opt-in; propaga los cambios de árbol en tu misma transacción)', { default: false });
11
32
  await codemods.updateRcFile((rcFile) => {
12
33
  rcFile
13
34
  .addProvider('@jantstack/adonis-authz/authz_provider')
@@ -18,8 +39,12 @@ export async function configure(command) {
18
39
  name: 'appAccess',
19
40
  path: '@jantstack/adonis-authz/app_access_middleware',
20
41
  },
42
+ {
43
+ name: 'resourceAccess',
44
+ path: '@jantstack/adonis-authz/resource_access_middleware',
45
+ },
21
46
  ]);
22
- await codemods.defineEnvVariables({ AUTHZ_DRIVER: 'database' });
47
+ await codemods.defineEnvVariables({ AUTHZ_DRIVER: defaultDriver });
23
48
  await codemods.defineEnvValidations({
24
49
  variables: {
25
50
  AUTHZ_DRIVER: `Env.schema.string.optional()`,
@@ -37,7 +62,18 @@ export async function configure(command) {
37
62
  fileName: `${new Date().getTime()}_create_authz_tables.ts`,
38
63
  },
39
64
  });
65
+ if (withOutbox) {
66
+ // El stub trae su propio destino fijo (`exports({ to: ... })`), sin plantilla.
67
+ await codemods.makeUsingStub(stubsRoot, 'scopes_outbox_migration.stub', {});
68
+ }
40
69
  command.logger.success('Autorización configurada.');
70
+ if (defaultDriver === 'openfga') {
71
+ command.logger.info('Driver por defecto: openfga. Instala su peer: npm i @openfga/sdk');
72
+ command.logger.info('Y aprovisiona el store: node ace openfga:provision');
73
+ }
74
+ if (withOutbox) {
75
+ command.logger.info('Outbox publicada. Registra `sqlScopeOutbox()` en config/authorization.ts (scopes.outbox y en el driver).');
76
+ }
41
77
  command.logger.info('Siguiente paso: node ace migration:run');
42
78
  }
43
79
  //# sourceMappingURL=configure.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"configure.js","sourceRoot":"","sources":["../configure.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAkB;IAChD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,CAAA;IAE/C,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC,MAAW,EAAE,EAAE;QAC1C,MAAM;aACH,WAAW,CAAC,wCAAwC,CAAC;aACrD,UAAU,CAAC,kCAAkC,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,MAAM,QAAQ,CAAC,kBAAkB,CAAC,OAAO,EAAE;QACzC;YACE,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,+CAA+C;SACtD;KACF,CAAC,CAAA;IAEF,MAAM,QAAQ,CAAC,kBAAkB,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAA;IAC/D,MAAM,QAAQ,CAAC,oBAAoB,CAAC;QAClC,SAAS,EAAE;YACT,YAAY,EAAE,8BAA8B;YAC5C,WAAW,EAAE,2DAA2D;YACxE,gBAAgB,EAAE,8BAA8B;YAChD,gBAAgB,EAAE,8BAA8B;SACjD;QACD,cAAc,EAAE,sCAAsC;KACvD,CAAC,CAAA;IAEF,MAAM,QAAQ,CAAC,aAAa,CAAC,SAAS,EAAE,2BAA2B,EAAE,EAAE,CAAC,CAAA;IACxE,MAAM,QAAQ,CAAC,aAAa,CAAC,SAAS,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAA;IAElE,MAAM,QAAQ,CAAC,aAAa,CAAC,SAAS,EAAE,gBAAgB,EAAE;QACxD,SAAS,EAAE;YACT,MAAM,EAAE,qBAAqB;YAC7B,QAAQ,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,yBAAyB;SAC3D;KACF,CAAC,CAAA;IAEF,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAA;IACnD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAA;AAC/D,CAAC"}
1
+ {"version":3,"file":"configure.js","sourceRoot":"","sources":["../configure.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAkB;IAChD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,CAAA;IAE/C,6EAA6E;IAC7E,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAC/C,uFAAuF,EACvF;QACE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,gEAAgE,EAAE;QAC/F,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,2EAA2E,EAAE;KAC1G,EACD,EAAE,OAAO,EAAE,UAAU,EAAE,CACxB,CAAA;IAED,6EAA6E;IAC7E,4EAA4E;IAC5E,yEAAyE;IACzE,+CAA+C;IAC/C,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAC7C,yHAAyH,EACzH,EAAE,OAAO,EAAE,KAAK,EAAE,CACnB,CAAA;IAED,MAAM,QAAQ,CAAC,YAAY,CAAC,CAAC,MAAW,EAAE,EAAE;QAC1C,MAAM;aACH,WAAW,CAAC,wCAAwC,CAAC;aACrD,UAAU,CAAC,kCAAkC,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,MAAM,QAAQ,CAAC,kBAAkB,CAAC,OAAO,EAAE;QACzC;YACE,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,+CAA+C;SACtD;QACD;YACE,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,oDAAoD;SAC3D;KACF,CAAC,CAAA;IAEF,MAAM,QAAQ,CAAC,kBAAkB,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC,CAAA;IAClE,MAAM,QAAQ,CAAC,oBAAoB,CAAC;QAClC,SAAS,EAAE;YACT,YAAY,EAAE,8BAA8B;YAC5C,WAAW,EAAE,2DAA2D;YACxE,gBAAgB,EAAE,8BAA8B;YAChD,gBAAgB,EAAE,8BAA8B;SACjD;QACD,cAAc,EAAE,sCAAsC;KACvD,CAAC,CAAA;IAEF,MAAM,QAAQ,CAAC,aAAa,CAAC,SAAS,EAAE,2BAA2B,EAAE,EAAE,CAAC,CAAA;IACxE,MAAM,QAAQ,CAAC,aAAa,CAAC,SAAS,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAA;IAElE,MAAM,QAAQ,CAAC,aAAa,CAAC,SAAS,EAAE,gBAAgB,EAAE;QACxD,SAAS,EAAE;YACT,MAAM,EAAE,qBAAqB;YAC7B,QAAQ,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,yBAAyB;SAC3D;KACF,CAAC,CAAA;IAEF,IAAI,UAAU,EAAE,CAAC;QACf,+EAA+E;QAC/E,MAAM,QAAQ,CAAC,aAAa,CAAC,SAAS,EAAE,8BAA8B,EAAE,EAAE,CAAC,CAAA;IAC7E,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAA;IACnD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAA;QACvF,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAA;IAC3E,CAAC;IACD,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,IAAI,CACjB,0GAA0G,CAC3G,CAAA;IACH,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAA;AAC/D,CAAC"}
package/build/index.d.ts CHANGED
@@ -2,22 +2,90 @@
2
2
  * Entrada pública del paquete.
3
3
  * import { AuthorizationManager, APP_SCOPE } from '@jantstack/adonis-authz'
4
4
  */
5
- export { AuthorizationManager } from './src/manager.js';
5
+ export { AuthorizationManager, DEFAULT_MAX_SCOPES, DEFAULT_MAX_DESCENDANTS, MAX_SCOPE_BOUND, DEFAULT_VIEW_MAX_AGE_MS, expandExcludedSubtrees } from './src/manager.js';
6
+ export type { AuthorizationView, ForRequestOptions } from './src/manager.js';
6
7
  export { defineConfig } from './src/define_config.js';
7
8
  export type { AuthorizationConfig } from './src/define_config.js';
8
- export { syncAuthzCatalog } from './src/catalog.js';
9
+ export { syncAuthzCatalog, diffAuthzCatalog, catalogInSync, formatCatalogDiff, formatScopedRoles, formatShadowedRoles, runCatalogDiff, syncCatalogs, } from './src/catalog/catalog.js';
10
+ export type { SyncCatalogOptions, CatalogDiff, CatalogLinkRef, CatalogSource } from './src/catalog/catalog.js';
11
+ /**
12
+ * Memo del catálogo (2.1): se revalida contra la versión compartida
13
+ * `authz_catalog_version`, que `syncAuthzCatalog` sube como última sentencia
14
+ * de su transacción. Quien escriba `authz_*` por fuera lo hace con
15
+ * `withAuthzCatalogWrite(async (trx) => …)` (misma transacción, bump al
16
+ * final: todos los procesos lo ven) — `bumpAuthzCatalogVersion(trx)` exige
17
+ * ese trx; `invalidateAuthzCatalog()` solo alcanza a este proceso.
18
+ */
19
+ export { CatalogCache, invalidateAuthzCatalog, bumpAuthzCatalogVersion, withAuthzCatalogWrite, readAuthzCatalogVersion, CATALOG_VERSION_TABLE, GLOBAL_OWNER_KEY, } from './src/catalog/catalog_cache.js';
20
+ export type { CatalogCacheOptions, CatalogRevalidate, CatalogView, CatalogRoleRef, CatalogPermission, AuthzCatalogWriteOptions, CatalogVersionClient, CatalogVersionTransaction, } from './src/catalog/catalog_cache.js';
21
+ /**
22
+ * Memo de ancestros de una instancia (2.1), solo para el camino de lectura.
23
+ * `authorization.forRequest()` ya lo aplica por ti.
24
+ */
25
+ export { memoizeAncestors } from './src/memoize_ancestors.js';
26
+ /**
27
+ * Arbol del consumidor (2.1): `hierarchicalScopeResolver` construye el
28
+ * resolutor de ancestros desde un `parentOf`; `sqlDescendantsOf` genera el
29
+ * `descendantsOf` opt-in (CTE recursiva, PG y SQLite) para `authorizedScopes`.
30
+ */
31
+ export { hierarchicalScopeResolver } from './src/hierarchical_resolver.js';
32
+ export type { HierarchicalResolverOptions, NodeOf, ScopeNode } from './src/hierarchical_resolver.js';
33
+ export { sqlDescendantsOf, sqlScopeEdges } from './src/sql_descendants.js';
34
+ export type { SqlDescendantsOptions, SqlScopeEdgesOptions } from './src/sql_descendants.js';
35
+ /**
36
+ * **La outbox del árbol** (3b-2d): `sqlScopeOutbox` implementa el puerto
37
+ * `ScopeOutbox` sobre Lucid, con la tabla de
38
+ * `stubs/scopes_outbox_migration.stub` (cópiala a tus migraciones:
39
+ * `configure` no la publica, porque la outbox es opt-in). Con
40
+ * `scopes.outbox` declarada, `authorization.scopes.attached/moved/detached`
41
+ * ENCOLAN el cambio en tu transacción en vez de escribir en el backend, y lo
42
+ * aplica `node ace authz:scopes:relay`. Cualquier implementación del puerto
43
+ * vale: el paquete no impone tabla.
44
+ */
45
+ export { sqlScopeOutbox } from './src/scope_outbox.js';
46
+ export type { SqlScopeOutboxOptions } from './src/scope_outbox.js';
9
47
  /**
10
48
  * El backend de autorización no respondió (503). Tipo PROPIO a propósito: sin
11
49
  * él escaparía el error del SDK del driver, y distinguir "backend caído"
12
50
  * obligaría a importar ese SDK — acoplando el call-site al backend que este
13
51
  * paquete existe para abstraer.
14
52
  */
15
- export { AuthorizationBackendError } from './src/errors.js';
53
+ export { AuthorizationBackendError, AuthorizationBackendTimeoutError, ScopeResolverError, InvalidIdentityError, InvalidSlugError, AuthorizationConfigError, AuthorizationInternalError, UnknownScopeError, NoScopeResolverError, UnknownRoleError, UnknownPermissionError, CatalogConflictError, RoleIsNotAccessError, ScopeCycleError, PurgeIncompleteError, WriteConflictError, ActorRequiredError, NotWithinError, WithinRequiredError, WithinRootForbiddenError, TooManyScopesError, TooManyLocalRolesError, MassPurgeRefusedError, PruneInterruptedError, UnsupportedDialectError, ScopeTooDeepError, UnsupportedOperationError, NoDescendantsResolverError, ViewExpiredError, RoleNotVisibleError, AmbiguousRoleError, RoleImmutableError, RoleLevelAboveOwnerError, RoleNotAssignableAtError, PermissionNotDelegableError, RankExceededError, ModelTooLargeError, RelationConfigError, RelationTypeUnknownError, RelationUnknownError, ScopeTreeDriftError, ScopeDriftUnguardedError, AuthorizationFrozenError, FreezeHeldError, MassReconcileRefusedError, ReconcileTooLargeError, } from './src/errors.js';
54
+ /**
55
+ * Validación de identidad y de slugs (422). La aplica el manager en cada
56
+ * llamada y los drivers por defensa en profundidad; se exporta para que un
57
+ * consumidor valide en su borde (un formulario, un importador) con la MISMA
58
+ * regla y no con una copia.
59
+ */
60
+ export { assertIdentity, assertSubject, assertScope, assertValidSlug, assertExpiresAt, assertNoSlugCollisions, normalizeRoleQuery, scopeKey, scopeFromKey, IDENTITY_LIMITS, MAX_SLUG_LENGTH, RESERVED_SLUGS, RESERVED_SLUG_PREFIXES, RESERVED_FACTS_TYPES, } from './src/identity.js';
61
+ export type { IdentityParts, SlugKind } from './src/identity.js';
62
+ /**
63
+ * ReBAC genérico (Fase 4, `relations/`). El puerto `RelationsDriver` vive en
64
+ * `./src/types.js` (el contrato); aquí salen la API declarativa
65
+ * `defineRelationsConfig`, la fachada `RelationsManager` (F-05 + `assertWrite`
66
+ * + `actor`) y los tipos de la config.
67
+ */
68
+ export { defineRelationsConfig } from './src/relations/define_relations_config.js';
69
+ export type { RelationsConfig, RelationsConfigSpec, RelationsDatabaseOptions, RelationObjectTypeSpec, RelationObjectRelationSpec, } from './src/relations/define_relations_config.js';
70
+ export { RelationsManager } from './src/relations/manager.js';
71
+ export type { RelationsManagerOptions } from './src/relations/manager.js';
72
+ export { reconcileRelations } from './src/relations/reconcile.js';
73
+ export type { RelationsReconcileOptions, RelationsReconcileReport } from './src/relations/reconcile.js';
74
+ export { saveRelationsConfig, readRelationsConfig, readRelationsConfigSpec, } from './src/relations_config_store.js';
75
+ export type { RelationsConfigStoreOptions } from './src/relations_config_store.js';
76
+ export { DatabaseRelationsDriver } from './src/drivers/database_relations_driver.js';
77
+ export type { DatabaseRelationsDriverOptions } from './src/drivers/database_relations_driver.js';
78
+ export { resolveGrantExpiry, isActiveExpiry, sameInstant } from './src/expiry.js';
16
79
  export { DatabaseAuthorizationDriver, APP_SCOPE_DB_UUID } from './src/drivers/database_driver.js';
17
- export { OpenFgaAuthorizationDriver, openFgaAuthorizationModel, provisionOpenFgaStore, importAuthzFactsToOpenFga, } from './src/drivers/openfga_driver.js';
18
- export type { HolderTypeMap, OpenFgaDriverOptions } from './src/drivers/openfga_driver.js';
19
- export { APP_SCOPE, APP_SCOPE_TYPE } from './src/types.js';
20
- export type { AuthorizationDriver, AuthorizationDriverFactory, AuthzWriteEvent, CatalogRoleSpec, CatalogSpec, GrantOptions, ScopeAncestorsResolver, ScopeRef, ScopeType, SubjectRef, } from './src/types.js';
80
+ export type { DatabaseDriverOptions } from './src/drivers/database_driver.js';
81
+ /**
82
+ * El driver `openfga` NO se exporta desde aquí: vive en el subpath
83
+ * `@jantstack/adonis-authz/openfga`, que es lo único que importa el peer
84
+ * opcional `@openfga/sdk`. Un consumidor solo-database arranca sin él (D9).
85
+ */
86
+ export { APP_SCOPE, APP_SCOPE_TYPE, DEFAULT_RECONCILE_MAX_TUPLES } from './src/types.js';
87
+ export type { AuthorizationDriver, AuthorizationDriverFactory, AuthorizedScopes, AuthzWriteEvent, AuthzCatalogWriteEvent, CatalogPermissionSpec, CatalogRole, CatalogRoleSpec, CatalogSpec, ScopedRoleChanges, ScopedRoleSpec, DenyOptions, DenyRef, ExcludedSubtree, GrantOptions, GrantOutcome, HolderTypeMap, ReconcileCounts, ReconcileFact, ReconcileFactPage, ReconcileFactsEnumerator, ReconcileOptions, ReconcileReport, ReconcileSkip, ReconcileSource, RoleQuery, ScopeChainResolver, ScopeDescendantsResolver, ScopeEdge, ScopeEdgePage, ScopeEdgesEnumerator, ScopedWriteOptions, ScopeRef, ScopeType, SubjectRef, WriteOptions, RelationsDriver, RelationsDriverCapabilities, RelObject, RelSubject, RelUserset, RelationRef, RelationWriteEvent, RelationWriteOptions, RelationPage, RelationObjectsPage, RelationSubjectsPage, RelationTuple, RelationTuplePage, } from './src/types.js';
88
+ export { isRelUserset } from './src/types.js';
21
89
  export { default as AuthzRole } from './src/models/authz_role.js';
22
90
  export { default as AuthzPermission } from './src/models/authz_permission.js';
23
91
  export { default as AuthzRolePermission } from './src/models/authz_role_permission.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEnD;;;;;GAKG;AACH,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAE3D,OAAO,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AACjG,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,iCAAiC,CAAA;AACxC,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAA;AAE1F,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC1D,YAAY,EACV,mBAAmB,EACnB,0BAA0B,EAC1B,eAAe,EACf,eAAe,EACf,WAAW,EACX,YAAY,EACZ,sBAAsB,EACtB,QAAQ,EACR,SAAS,EACT,UAAU,GACX,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAC7E,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uCAAuC,CAAA;AACtF,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAC7E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAEjE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
package/build/index.js CHANGED
@@ -2,19 +2,81 @@
2
2
  * Entrada pública del paquete.
3
3
  * import { AuthorizationManager, APP_SCOPE } from '@jantstack/adonis-authz'
4
4
  */
5
- export { AuthorizationManager } from './src/manager.js';
5
+ export { AuthorizationManager, DEFAULT_MAX_SCOPES, DEFAULT_MAX_DESCENDANTS, MAX_SCOPE_BOUND, DEFAULT_VIEW_MAX_AGE_MS, expandExcludedSubtrees } from './src/manager.js';
6
6
  export { defineConfig } from './src/define_config.js';
7
- export { syncAuthzCatalog } from './src/catalog.js';
7
+ export { syncAuthzCatalog, diffAuthzCatalog, catalogInSync, formatCatalogDiff, formatScopedRoles, formatShadowedRoles, runCatalogDiff, syncCatalogs, } from './src/catalog/catalog.js';
8
+ /**
9
+ * Memo del catálogo (2.1): se revalida contra la versión compartida
10
+ * `authz_catalog_version`, que `syncAuthzCatalog` sube como última sentencia
11
+ * de su transacción. Quien escriba `authz_*` por fuera lo hace con
12
+ * `withAuthzCatalogWrite(async (trx) => …)` (misma transacción, bump al
13
+ * final: todos los procesos lo ven) — `bumpAuthzCatalogVersion(trx)` exige
14
+ * ese trx; `invalidateAuthzCatalog()` solo alcanza a este proceso.
15
+ */
16
+ export { CatalogCache, invalidateAuthzCatalog, bumpAuthzCatalogVersion, withAuthzCatalogWrite, readAuthzCatalogVersion, CATALOG_VERSION_TABLE, GLOBAL_OWNER_KEY, } from './src/catalog/catalog_cache.js';
17
+ /**
18
+ * Memo de ancestros de una instancia (2.1), solo para el camino de lectura.
19
+ * `authorization.forRequest()` ya lo aplica por ti.
20
+ */
21
+ export { memoizeAncestors } from './src/memoize_ancestors.js';
22
+ /**
23
+ * Arbol del consumidor (2.1): `hierarchicalScopeResolver` construye el
24
+ * resolutor de ancestros desde un `parentOf`; `sqlDescendantsOf` genera el
25
+ * `descendantsOf` opt-in (CTE recursiva, PG y SQLite) para `authorizedScopes`.
26
+ */
27
+ export { hierarchicalScopeResolver } from './src/hierarchical_resolver.js';
28
+ export { sqlDescendantsOf, sqlScopeEdges } from './src/sql_descendants.js';
29
+ /**
30
+ * **La outbox del árbol** (3b-2d): `sqlScopeOutbox` implementa el puerto
31
+ * `ScopeOutbox` sobre Lucid, con la tabla de
32
+ * `stubs/scopes_outbox_migration.stub` (cópiala a tus migraciones:
33
+ * `configure` no la publica, porque la outbox es opt-in). Con
34
+ * `scopes.outbox` declarada, `authorization.scopes.attached/moved/detached`
35
+ * ENCOLAN el cambio en tu transacción en vez de escribir en el backend, y lo
36
+ * aplica `node ace authz:scopes:relay`. Cualquier implementación del puerto
37
+ * vale: el paquete no impone tabla.
38
+ */
39
+ export { sqlScopeOutbox } from './src/scope_outbox.js';
8
40
  /**
9
41
  * El backend de autorización no respondió (503). Tipo PROPIO a propósito: sin
10
42
  * él escaparía el error del SDK del driver, y distinguir "backend caído"
11
43
  * obligaría a importar ese SDK — acoplando el call-site al backend que este
12
44
  * paquete existe para abstraer.
13
45
  */
14
- export { AuthorizationBackendError } from './src/errors.js';
46
+ export { AuthorizationBackendError, AuthorizationBackendTimeoutError, ScopeResolverError, InvalidIdentityError, InvalidSlugError, AuthorizationConfigError, AuthorizationInternalError, UnknownScopeError, NoScopeResolverError, UnknownRoleError, UnknownPermissionError, CatalogConflictError, RoleIsNotAccessError, ScopeCycleError, PurgeIncompleteError, WriteConflictError, ActorRequiredError, NotWithinError, WithinRequiredError, WithinRootForbiddenError, TooManyScopesError, TooManyLocalRolesError, MassPurgeRefusedError, PruneInterruptedError, UnsupportedDialectError, ScopeTooDeepError, UnsupportedOperationError, NoDescendantsResolverError, ViewExpiredError, RoleNotVisibleError, AmbiguousRoleError, RoleImmutableError, RoleLevelAboveOwnerError, RoleNotAssignableAtError, PermissionNotDelegableError, RankExceededError, ModelTooLargeError, RelationConfigError, RelationTypeUnknownError, RelationUnknownError, ScopeTreeDriftError, ScopeDriftUnguardedError, AuthorizationFrozenError, FreezeHeldError, MassReconcileRefusedError, ReconcileTooLargeError, } from './src/errors.js';
47
+ /**
48
+ * Validación de identidad y de slugs (422). La aplica el manager en cada
49
+ * llamada y los drivers por defensa en profundidad; se exporta para que un
50
+ * consumidor valide en su borde (un formulario, un importador) con la MISMA
51
+ * regla y no con una copia.
52
+ */
53
+ export { assertIdentity, assertSubject, assertScope, assertValidSlug, assertExpiresAt, assertNoSlugCollisions, normalizeRoleQuery, scopeKey, scopeFromKey, IDENTITY_LIMITS, MAX_SLUG_LENGTH, RESERVED_SLUGS, RESERVED_SLUG_PREFIXES, RESERVED_FACTS_TYPES, } from './src/identity.js';
54
+ /**
55
+ * ReBAC genérico (Fase 4, `relations/`). El puerto `RelationsDriver` vive en
56
+ * `./src/types.js` (el contrato); aquí salen la API declarativa
57
+ * `defineRelationsConfig`, la fachada `RelationsManager` (F-05 + `assertWrite`
58
+ * + `actor`) y los tipos de la config.
59
+ */
60
+ export { defineRelationsConfig } from './src/relations/define_relations_config.js';
61
+ export { RelationsManager } from './src/relations/manager.js';
62
+ export { reconcileRelations } from './src/relations/reconcile.js';
63
+ // La config de relaciones PERSISTIDA (🟡3): API de PLATAFORMA (bajo el gate de
64
+ // versión, invariante 14). La CONSUME `authz:relations:reconcile` (config del
65
+ // destino, para la deriva del modelo fusionado en --dry-run).
66
+ export { saveRelationsConfig, readRelationsConfig, readRelationsConfigSpec, } from './src/relations_config_store.js';
67
+ // El driver `database` de relaciones (el consumidor lo cablea en
68
+ // `relations.drivers` de config/authorization.ts). El driver `openfga` de
69
+ // relaciones NO sale de aquí: vive en el subpath `/openfga` (peer opcional).
70
+ export { DatabaseRelationsDriver } from './src/drivers/database_relations_driver.js';
71
+ export { resolveGrantExpiry, isActiveExpiry, sameInstant } from './src/expiry.js';
15
72
  export { DatabaseAuthorizationDriver, APP_SCOPE_DB_UUID } from './src/drivers/database_driver.js';
16
- export { OpenFgaAuthorizationDriver, openFgaAuthorizationModel, provisionOpenFgaStore, importAuthzFactsToOpenFga, } from './src/drivers/openfga_driver.js';
17
- export { APP_SCOPE, APP_SCOPE_TYPE } from './src/types.js';
73
+ /**
74
+ * El driver `openfga` NO se exporta desde aquí: vive en el subpath
75
+ * `@jantstack/adonis-authz/openfga`, que es lo único que importa el peer
76
+ * opcional `@openfga/sdk`. Un consumidor solo-database arranca sin él (D9).
77
+ */
78
+ export { APP_SCOPE, APP_SCOPE_TYPE, DEFAULT_RECONCILE_MAX_TUPLES } from './src/types.js';
79
+ export { isRelUserset } from './src/types.js';
18
80
  export { default as AuthzRole } from './src/models/authz_role.js';
19
81
  export { default as AuthzPermission } from './src/models/authz_permission.js';
20
82
  export { default as AuthzRolePermission } from './src/models/authz_role_permission.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEnD;;;;;GAKG;AACH,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAA;AAE3D,OAAO,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AACjG,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,qBAAqB,EACrB,yBAAyB,GAC1B,MAAM,iCAAiC,CAAA;AAGxC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAc1D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAC7E,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,uCAAuC,CAAA;AACtF,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAC7E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAEjE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,37 @@
1
1
  import type { ApplicationService } from '@adonisjs/core/types';
2
2
  import { AuthorizationManager } from '../src/manager.js';
3
+ import { RelationsManager } from '../src/relations/manager.js';
4
+ import type { AuthorizationConfig } from '../src/define_config.js';
3
5
  declare module '@adonisjs/core/types' {
4
6
  interface ContainerBindings {
5
7
  'authz.manager': AuthorizationManager;
8
+ 'authz.relations': RelationsManager;
6
9
  }
7
10
  }
8
11
  /**
9
- * Registra el manager de autorización como singleton del contenedor,
10
- * construido desde `config/authorization.ts` de la aplicación.
12
+ * **Construye el `RelationsManager` de servicio desde el config** (Fase 4-8) —
13
+ * el análogo de resolver el `AuthorizationManager` del provider, pero para el
14
+ * puerto de relaciones. Función PURA (no toca el contenedor) para tener su caso
15
+ * sin montar la app: recibe el config y devuelve el manager cableado.
16
+ *
17
+ * El driver ACTIVO sale de `relations.drivers[relations.default ?? default]`
18
+ * (los drivers de relaciones se nombran igual que los de roles); la config, de
19
+ * `relations.config` (la MISMA que capturan las factories de `drivers`, así que
20
+ * la frontera F-05 del manager y la del driver son la misma). `requireActor` se
21
+ * hereda del config de roles: la política de auditoría es una sola.
22
+ *
23
+ * Sin `relations.config` o sin el driver activo lanza con la receta: las
24
+ * relaciones son OPT-IN y este servicio solo existe si el consumidor las
25
+ * declaró.
26
+ */
27
+ export declare function buildRelationsManager(config: AuthorizationConfig): Promise<RelationsManager>;
28
+ /**
29
+ * Registra los managers de autorización como singletons del contenedor,
30
+ * construidos desde `config/authorization.ts` de la aplicación:
31
+ *
32
+ * - `authz.manager`: el motor de roles (siempre).
33
+ * - `authz.relations`: el motor de ReBAC (solo si el consumidor declaró
34
+ * `relations.config`; si no, resolverlo lanza con la receta).
11
35
  */
12
36
  export default class AuthzProvider {
13
37
  protected app: ApplicationService;
@@ -1 +1 @@
1
- {"version":3,"file":"authz_provider.d.ts","sourceRoot":"","sources":["../../providers/authz_provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAExD,OAAO,QAAQ,sBAAsB,CAAC;IACpC,UAAiB,iBAAiB;QAChC,eAAe,EAAE,oBAAoB,CAAA;KACtC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,aAAa;IACpB,SAAS,CAAC,GAAG,EAAE,kBAAkB;gBAAvB,GAAG,EAAE,kBAAkB;IAE7C,QAAQ;CAWT"}
1
+ {"version":3,"file":"authz_provider.d.ts","sourceRoot":"","sources":["../../providers/authz_provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAC9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAElE,OAAO,QAAQ,sBAAsB,CAAC;IACpC,UAAiB,iBAAiB;QAChC,eAAe,EAAE,oBAAoB,CAAA;QACrC,iBAAiB,EAAE,gBAAgB,CAAA;KACpC;CACF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAqBlG;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,OAAO,aAAa;IACpB,SAAS,CAAC,GAAG,EAAE,kBAAkB;gBAAvB,GAAG,EAAE,kBAAkB;IAE7C,QAAQ;CAqBT"}