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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/README.md +934 -40
  2. package/build/commands/authz_catalog_diff.d.ts.map +1 -1
  3. package/build/commands/authz_catalog_diff.js +1 -2
  4. package/build/commands/authz_catalog_diff.js.map +1 -1
  5. package/build/commands/authz_catalog_prune_orphans.d.ts +78 -0
  6. package/build/commands/authz_catalog_prune_orphans.d.ts.map +1 -0
  7. package/build/commands/authz_catalog_prune_orphans.js +135 -0
  8. package/build/commands/authz_catalog_prune_orphans.js.map +1 -0
  9. package/build/commands/authz_catalog_sync.d.ts +17 -0
  10. package/build/commands/authz_catalog_sync.d.ts.map +1 -1
  11. package/build/commands/authz_catalog_sync.js +27 -4
  12. package/build/commands/authz_catalog_sync.js.map +1 -1
  13. package/build/commands/authz_freeze.d.ts +44 -0
  14. package/build/commands/authz_freeze.d.ts.map +1 -0
  15. package/build/commands/authz_freeze.js +94 -0
  16. package/build/commands/authz_freeze.js.map +1 -0
  17. package/build/commands/authz_reconcile.d.ts +111 -0
  18. package/build/commands/authz_reconcile.d.ts.map +1 -0
  19. package/build/commands/authz_reconcile.js +417 -0
  20. package/build/commands/authz_reconcile.js.map +1 -0
  21. package/build/commands/authz_relations_reconcile.d.ts +144 -0
  22. package/build/commands/authz_relations_reconcile.d.ts.map +1 -0
  23. package/build/commands/authz_relations_reconcile.js +438 -0
  24. package/build/commands/authz_relations_reconcile.js.map +1 -0
  25. package/build/commands/authz_scopes_relay.d.ts +97 -0
  26. package/build/commands/authz_scopes_relay.d.ts.map +1 -0
  27. package/build/commands/authz_scopes_relay.js +344 -0
  28. package/build/commands/authz_scopes_relay.js.map +1 -0
  29. package/build/commands/authz_scopes_requeue.d.ts +80 -0
  30. package/build/commands/authz_scopes_requeue.d.ts.map +1 -0
  31. package/build/commands/authz_scopes_requeue.js +230 -0
  32. package/build/commands/authz_scopes_requeue.js.map +1 -0
  33. package/build/commands/authz_unfreeze.d.ts +45 -0
  34. package/build/commands/authz_unfreeze.d.ts.map +1 -0
  35. package/build/commands/authz_unfreeze.js +157 -0
  36. package/build/commands/authz_unfreeze.js.map +1 -0
  37. package/build/commands/main.d.ts +16 -8
  38. package/build/commands/main.d.ts.map +1 -1
  39. package/build/commands/main.js +59 -6
  40. package/build/commands/main.js.map +1 -1
  41. package/build/commands/openfga_provision.d.ts +92 -4
  42. package/build/commands/openfga_provision.d.ts.map +1 -1
  43. package/build/commands/openfga_provision.js +155 -7
  44. package/build/commands/openfga_provision.js.map +1 -1
  45. package/build/configure.d.ts +11 -0
  46. package/build/configure.d.ts.map +1 -1
  47. package/build/configure.js +37 -1
  48. package/build/configure.js.map +1 -1
  49. package/build/index.d.ts +50 -11
  50. package/build/index.d.ts.map +1 -1
  51. package/build/index.js +49 -7
  52. package/build/index.js.map +1 -1
  53. package/build/providers/authz_provider.d.ts +31 -2
  54. package/build/providers/authz_provider.d.ts.map +1 -1
  55. package/build/providers/authz_provider.js +65 -2
  56. package/build/providers/authz_provider.js.map +1 -1
  57. package/build/services/relations.d.ts +14 -0
  58. package/build/services/relations.d.ts.map +1 -0
  59. package/build/services/relations.js +17 -0
  60. package/build/services/relations.js.map +1 -0
  61. package/build/src/{catalog.d.ts → catalog/catalog.d.ts} +41 -2
  62. package/build/src/catalog/catalog.d.ts.map +1 -0
  63. package/build/src/{catalog.js → catalog/catalog.js} +120 -14
  64. package/build/src/catalog/catalog.js.map +1 -0
  65. package/build/src/{catalog_cache.d.ts → catalog/catalog_cache.d.ts} +46 -22
  66. package/build/src/catalog/catalog_cache.d.ts.map +1 -0
  67. package/build/src/{catalog_cache.js → catalog/catalog_cache.js} +53 -43
  68. package/build/src/catalog/catalog_cache.js.map +1 -0
  69. package/build/src/define_config.d.ts +206 -3
  70. package/build/src/define_config.d.ts.map +1 -1
  71. package/build/src/define_config.js +11 -0
  72. package/build/src/define_config.js.map +1 -1
  73. package/build/src/drivers/database_driver.d.ts +128 -7
  74. package/build/src/drivers/database_driver.d.ts.map +1 -1
  75. package/build/src/drivers/database_driver.js +510 -24
  76. package/build/src/drivers/database_driver.js.map +1 -1
  77. package/build/src/drivers/database_relations_driver.d.ts +140 -0
  78. package/build/src/drivers/database_relations_driver.d.ts.map +1 -0
  79. package/build/src/drivers/database_relations_driver.js +748 -0
  80. package/build/src/drivers/database_relations_driver.js.map +1 -0
  81. package/build/src/drivers/openfga_driver.d.ts +777 -122
  82. package/build/src/drivers/openfga_driver.d.ts.map +1 -1
  83. package/build/src/drivers/openfga_driver.js +2228 -477
  84. package/build/src/drivers/openfga_driver.js.map +1 -1
  85. package/build/src/drivers/openfga_facts.d.ts +384 -0
  86. package/build/src/drivers/openfga_facts.d.ts.map +1 -0
  87. package/build/src/drivers/openfga_facts.js +836 -0
  88. package/build/src/drivers/openfga_facts.js.map +1 -0
  89. package/build/src/drivers/openfga_relations_driver.d.ts +186 -0
  90. package/build/src/drivers/openfga_relations_driver.d.ts.map +1 -0
  91. package/build/src/drivers/openfga_relations_driver.js +724 -0
  92. package/build/src/drivers/openfga_relations_driver.js.map +1 -0
  93. package/build/src/errors.d.ts +430 -6
  94. package/build/src/errors.d.ts.map +1 -1
  95. package/build/src/errors.js +453 -6
  96. package/build/src/errors.js.map +1 -1
  97. package/build/src/freeze.d.ts +200 -0
  98. package/build/src/freeze.d.ts.map +1 -0
  99. package/build/src/freeze.js +306 -0
  100. package/build/src/freeze.js.map +1 -0
  101. package/build/src/http/app_access_middleware.d.ts.map +1 -0
  102. package/build/src/http/app_access_middleware.js.map +1 -0
  103. package/build/src/http/resource_access_middleware.d.ts +105 -0
  104. package/build/src/http/resource_access_middleware.d.ts.map +1 -0
  105. package/build/src/http/resource_access_middleware.js +81 -0
  106. package/build/src/http/resource_access_middleware.js.map +1 -0
  107. package/build/src/identity.d.ts +74 -1
  108. package/build/src/identity.d.ts.map +1 -1
  109. package/build/src/identity.js +100 -2
  110. package/build/src/identity.js.map +1 -1
  111. package/build/src/manager.d.ts +549 -6
  112. package/build/src/manager.d.ts.map +1 -1
  113. package/build/src/manager.js +2243 -193
  114. package/build/src/manager.js.map +1 -1
  115. package/build/src/models/authz_assignment.d.ts +7 -7
  116. package/build/src/models/authz_assignment.d.ts.map +1 -1
  117. package/build/src/models/authz_deny.d.ts +7 -7
  118. package/build/src/models/authz_deny.d.ts.map +1 -1
  119. package/build/src/models/authz_permission.d.ts +7 -7
  120. package/build/src/models/authz_permission.d.ts.map +1 -1
  121. package/build/src/models/authz_role.d.ts +7 -7
  122. package/build/src/models/authz_role.d.ts.map +1 -1
  123. package/build/src/models/authz_role_permission.d.ts +7 -7
  124. package/build/src/models/authz_role_permission.d.ts.map +1 -1
  125. package/build/src/openfga.d.ts +18 -2
  126. package/build/src/openfga.d.ts.map +1 -1
  127. package/build/src/openfga.js +15 -1
  128. package/build/src/openfga.js.map +1 -1
  129. package/build/src/reconcile.d.ts +37 -0
  130. package/build/src/reconcile.d.ts.map +1 -0
  131. package/build/src/reconcile.js +69 -0
  132. package/build/src/reconcile.js.map +1 -0
  133. package/build/src/relation_partition_trigger.d.ts +8 -0
  134. package/build/src/relation_partition_trigger.d.ts.map +1 -0
  135. package/build/src/relation_partition_trigger.js +93 -0
  136. package/build/src/relation_partition_trigger.js.map +1 -0
  137. package/build/src/relations/define_relations_config.d.ts +109 -0
  138. package/build/src/relations/define_relations_config.d.ts.map +1 -0
  139. package/build/src/relations/define_relations_config.js +211 -0
  140. package/build/src/relations/define_relations_config.js.map +1 -0
  141. package/build/src/relations/manager.d.ts +138 -0
  142. package/build/src/relations/manager.d.ts.map +1 -0
  143. package/build/src/relations/manager.js +494 -0
  144. package/build/src/relations/manager.js.map +1 -0
  145. package/build/src/relations/reconcile.d.ts +137 -0
  146. package/build/src/relations/reconcile.d.ts.map +1 -0
  147. package/build/src/relations/reconcile.js +294 -0
  148. package/build/src/relations/reconcile.js.map +1 -0
  149. package/build/src/relations_config_store.d.ts +22 -0
  150. package/build/src/relations_config_store.d.ts.map +1 -0
  151. package/build/src/relations_config_store.js +74 -0
  152. package/build/src/relations_config_store.js.map +1 -0
  153. package/build/src/scope_outbox.d.ts +123 -0
  154. package/build/src/scope_outbox.d.ts.map +1 -0
  155. package/build/src/scope_outbox.js +532 -0
  156. package/build/src/scope_outbox.js.map +1 -0
  157. package/build/src/{drivers → shared}/backend_guard.d.ts +42 -0
  158. package/build/src/shared/backend_guard.d.ts.map +1 -0
  159. package/build/src/{drivers → shared}/backend_guard.js +78 -1
  160. package/build/src/shared/backend_guard.js.map +1 -0
  161. package/build/src/{drivers → shared}/sql_expiry.d.ts +2 -0
  162. package/build/src/shared/sql_expiry.d.ts.map +1 -0
  163. package/build/src/{drivers → shared}/sql_expiry.js +4 -0
  164. package/build/src/shared/sql_expiry.js.map +1 -0
  165. package/build/src/shared/transaction_guard.d.ts +53 -0
  166. package/build/src/shared/transaction_guard.d.ts.map +1 -0
  167. package/build/src/shared/transaction_guard.js +74 -0
  168. package/build/src/shared/transaction_guard.js.map +1 -0
  169. package/build/src/sql_descendants.d.ts +55 -1
  170. package/build/src/sql_descendants.d.ts.map +1 -1
  171. package/build/src/sql_descendants.js +75 -1
  172. package/build/src/sql_descendants.js.map +1 -1
  173. package/build/src/testing/contract.d.ts +129 -4
  174. package/build/src/testing/contract.d.ts.map +1 -1
  175. package/build/src/testing/contract.js +915 -177
  176. package/build/src/testing/contract.js.map +1 -1
  177. package/build/src/testing/main.d.ts +10 -2
  178. package/build/src/testing/main.d.ts.map +1 -1
  179. package/build/src/testing/main.js +5 -1
  180. package/build/src/testing/main.js.map +1 -1
  181. package/build/src/testing/migration_contract.d.ts +293 -0
  182. package/build/src/testing/migration_contract.d.ts.map +1 -0
  183. package/build/src/testing/migration_contract.js +589 -0
  184. package/build/src/testing/migration_contract.js.map +1 -0
  185. package/build/src/testing/relations_contract.d.ts +73 -0
  186. package/build/src/testing/relations_contract.d.ts.map +1 -0
  187. package/build/src/testing/relations_contract.js +1238 -0
  188. package/build/src/testing/relations_contract.js.map +1 -0
  189. package/build/src/testing/relations_reconcile_contract.d.ts +24 -0
  190. package/build/src/testing/relations_reconcile_contract.d.ts.map +1 -0
  191. package/build/src/testing/relations_reconcile_contract.js +220 -0
  192. package/build/src/testing/relations_reconcile_contract.js.map +1 -0
  193. package/build/src/testing/scope_outbox_contract.d.ts +98 -0
  194. package/build/src/testing/scope_outbox_contract.d.ts.map +1 -0
  195. package/build/src/testing/scope_outbox_contract.js +677 -0
  196. package/build/src/testing/scope_outbox_contract.js.map +1 -0
  197. package/build/src/traits/authz_scopes.js +1 -1
  198. package/build/src/traits/authz_scopes.js.map +1 -1
  199. package/build/src/traits/has_uuid.d.ts +8 -8
  200. package/build/src/traits/has_uuid.d.ts.map +1 -1
  201. package/build/src/types.d.ts +1537 -84
  202. package/build/src/types.d.ts.map +1 -1
  203. package/build/src/types.js +65 -0
  204. package/build/src/types.js.map +1 -1
  205. package/build/stubs/config/authorization.stub +149 -5
  206. package/build/stubs/migration.stub +136 -0
  207. package/build/stubs/scopes_outbox_migration.stub +57 -0
  208. package/package.json +4 -2
  209. package/build/commands/openfga_import.d.ts +0 -34
  210. package/build/commands/openfga_import.d.ts.map +0 -1
  211. package/build/commands/openfga_import.js +0 -97
  212. package/build/commands/openfga_import.js.map +0 -1
  213. package/build/src/catalog.d.ts.map +0 -1
  214. package/build/src/catalog.js.map +0 -1
  215. package/build/src/catalog_cache.d.ts.map +0 -1
  216. package/build/src/catalog_cache.js.map +0 -1
  217. package/build/src/drivers/backend_guard.d.ts.map +0 -1
  218. package/build/src/drivers/backend_guard.js.map +0 -1
  219. package/build/src/drivers/sql_expiry.d.ts.map +0 -1
  220. package/build/src/drivers/sql_expiry.js.map +0 -1
  221. package/build/src/middleware/app_access_middleware.d.ts.map +0 -1
  222. package/build/src/middleware/app_access_middleware.js.map +0 -1
  223. /package/build/src/{middleware → http}/app_access_middleware.d.ts +0 -0
  224. /package/build/src/{middleware → http}/app_access_middleware.js +0 -0
@@ -0,0 +1,230 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { BaseCommand, flags } from '@adonisjs/core/ace';
11
+ /** Una entrada de la cola, en una línea (misma forma que en `authz:scopes:relay`). */
12
+ function linea(item) {
13
+ const { change } = item;
14
+ const scope = (s) => `${s.type}:${s.uuid ?? ''}`;
15
+ const destino = change.op === 'detached' ? '' : ` → ${scope(change.parent)}`;
16
+ const intentos = item.attempts ? ` (intentos: ${item.attempts})` : '';
17
+ const causa = item.lastError ? ` — ${item.lastError}` : '';
18
+ return `#${item.id} ${change.op} ${scope(change.child)}${destino}${intentos}${causa}`;
19
+ }
20
+ /**
21
+ * Las líneas del comando y si la ejecución es «limpia», en una función PURA
22
+ * (mismo patrón que `reconcileLines`/`orphanLines`): es lo único del comando
23
+ * que decide algo, y así tiene su caso sin montar un ace.
24
+ *
25
+ * - `refused`: el manager se NEGÓ (500 `E_AUTHZ_REQUEUE_REFUSED`). Se imprime
26
+ * el DIFF entero —cada aparcada y cada entrada APLICADA posterior que
27
+ * reaplicarla revertiría— y se sale ≠ 0, con las dos salidas: `--force`
28
+ * (que entra igual, con este mismo diff delante) y `authz:reconcile`.
29
+ * - `report`: se reencoló. Con `forced` y `overrides`, el diff se imprime
30
+ * como AVISO: forzar no es un éxito mudo.
31
+ * - `report.relay` (con `--apply`, 2.4.0-alpha.8): la pasada que relevó SOLO
32
+ * lo reencolado, bajo el mismo lease. `busy` ⇒ NO se reencoló nada (todo o
33
+ * nada) y se sale ≠ 0 con la letra («otra pasada tiene el lease; reintenta,
34
+ * o `requeue` sin `--apply`»); cada entrada dice si se aplicó, falló o quedó
35
+ * aplazada, y solo es limpio si TODO lo reencolado se aplicó.
36
+ */
37
+ export function requeueLines(input) {
38
+ const lines = [];
39
+ const diff = (level, conflict) => {
40
+ lines.push({
41
+ level,
42
+ message: `${level === 'error' ? 'NEGADO' : 'FORZADO'}: ${linea(conflict.parked)} está APARCADA y hay ` +
43
+ `${conflict.applied.length} entrada(s) APLICADA(s) después sobre la misma clave de scope. Reencolarla las REVERTIRÍA ` +
44
+ `(el store quedaría con un árbol que nunca existió, y con UN solo padre nada lo delata):`,
45
+ });
46
+ for (const applied of conflict.applied)
47
+ lines.push({ level, message: ` revertiría ${linea(applied)}` });
48
+ if (conflict.truncated) {
49
+ lines.push({
50
+ level,
51
+ message: ` … y más: solo se listan las primeras ${conflict.applied.length} aplicadas posteriores sobre esa clave; el diff está CORTADO.`,
52
+ });
53
+ }
54
+ };
55
+ if (input.refused !== undefined) {
56
+ for (const conflict of input.refused)
57
+ diff('error', conflict);
58
+ lines.push({
59
+ level: 'warning',
60
+ message: 'No se ha reencolado NADA (todo o nada). Para recalcular el store con el árbol de HOY: ' +
61
+ 'node ace authz:reconcile --to=<driver>. Si de verdad quieres revertir esas entradas, repite con --force: ' +
62
+ 'imprime este mismo diff y entra igual.',
63
+ });
64
+ return { lines, clean: false };
65
+ }
66
+ const report = input.report;
67
+ if (report.relay?.busy) {
68
+ lines.push({
69
+ level: 'error',
70
+ message: 'Otra pasada del relay tiene el lease de la cola: con --apply no se ha reencolado NADA (todo o nada: reencolar y no ' +
71
+ 'aplicar dejaría la entrada con un solo intento, que la siguiente pasada gastaría). Reintenta (--wait-lease-ms espera ' +
72
+ 'a que la suelten), o reencola sin --apply y deja que la próxima pasada la aplique.',
73
+ });
74
+ return { lines, clean: false };
75
+ }
76
+ if (report.forced)
77
+ for (const conflict of report.overrides)
78
+ diff('warning', conflict);
79
+ for (const item of report.requeued)
80
+ lines.push({ level: 'log', message: `reencolada: ${linea(item)}` });
81
+ if (report.relay === undefined) {
82
+ lines.push({
83
+ level: 'success',
84
+ message: `${report.requeued.length} entrada(s) devuelta(s) a la cola con attempts = maxAttempts − 1: si la causa sigue rota ` +
85
+ 'vuelve(n) a aparcarse en UNA pasada; si la arreglaste, entra(n) a la primera. Corre node ace authz:scopes:relay.',
86
+ });
87
+ return { lines, clean: true };
88
+ }
89
+ // --apply: qué fue de cada reencolada en la pasada que corrió bajo el mismo lease.
90
+ const relay = report.relay;
91
+ let clean = true;
92
+ for (const entry of relay.entries) {
93
+ if (entry.status === 'applied')
94
+ lines.push({ level: 'log', message: `aplicada: ${linea(entry)}` });
95
+ else if (entry.status === 'deferred') {
96
+ clean = false;
97
+ lines.push({ level: 'warning', message: `aplazada (${entry.reason ?? 'depende de una entrada anterior'}): ${linea(entry)} — no se ha aplicado` });
98
+ }
99
+ else if (entry.status === 'failed') {
100
+ clean = false;
101
+ lines.push({ level: 'error', message: `falló: ${linea(entry)} — ${entry.reason ?? ''}` });
102
+ }
103
+ else if (entry.status === 'dead') {
104
+ clean = false;
105
+ lines.push({ level: 'error', message: `sigue APARCADA: ${linea(entry)}${entry.reason ? ` — ${entry.reason}` : ''}` });
106
+ }
107
+ }
108
+ if (relay.applied.length !== report.requeued.length)
109
+ clean = false;
110
+ if (relay.remaining) {
111
+ lines.push({
112
+ level: 'warning',
113
+ message: 'Quedan entradas pendientes en la cola (--apply releva SOLO lo reencolado; lo que dependía de ello sigue aplazado): ' +
114
+ 'corre node ace authz:scopes:relay, o releva su recibo con --only.',
115
+ });
116
+ }
117
+ lines.push({
118
+ level: clean ? 'success' : 'warning',
119
+ message: clean
120
+ ? `${relay.applied.length} entrada(s) reencolada(s) y aplicada(s) en la misma pasada.`
121
+ : `${relay.applied.length} de ${report.requeued.length} reencolada(s) aplicada(s): mira las líneas de arriba (la causa sigue rota, o el backend no respondió).`,
122
+ });
123
+ return { lines, clean };
124
+ }
125
+ /**
126
+ * **Devuelve entradas APARCADAS de la outbox a la cola** (2.4.0-alpha.5 · R2b;
127
+ * panel relay, cuestión 2).
128
+ *
129
+ * node ace authz:scopes:requeue --id=12 # una
130
+ * node ace authz:scopes:requeue --id=12,13 # varias (o --id repetido)
131
+ * node ace authz:scopes:requeue --id=12 --force # aunque revierta lo aplicado después (diff impreso)
132
+ * node ace authz:scopes:requeue --id=12 --apply # y la aplica en la MISMA llamada (2.4.0-alpha.8)
133
+ * node ace authz:scopes:requeue --id=12 --apply --wait-lease-ms=5000 # esperando el lease si el cron lo tiene
134
+ *
135
+ * Una entrada aparcada (`sqlScopeOutbox({ maxAttempts })`, 5 por defecto)
136
+ * no se reintenta sola: el relay la reporta en cada pasada y sale ≠ 0. Cuando
137
+ * el operador arregla la causa —el padre que faltaba vuelve, el store se
138
+ * reconcilia— este comando la devuelve a `pending()` con **`attempts =
139
+ * maxAttempts − 1`**: entra a la primera si está arreglada y vuelve a
140
+ * aparcarse en UNA sola pasada si no (así un requeue automatizado de lo
141
+ * irreparable no es un grifo de aplazamiento para el resto del scope).
142
+ *
143
+ * **La sonda anti-reversión es del manager y no tiene excepción**: si después
144
+ * de la aparcada se APLICÓ otra entrada sobre la misma clave de scope,
145
+ * reencolarla reaplicaría el cambio viejo por encima del nuevo —un `moved`
146
+ * viejo tras el nuevo deja el store con el padre VIEJO y un solo padre—. El
147
+ * comando imprime ese diff y sale ≠ 0. **`--force` existe SOLO aquí**
148
+ * (decisión del dueño del 2026-09-09 (2)): imprime el diff y entra igual. Nunca
149
+ * en una ruta alcanzable por HTTP.
150
+ *
151
+ * **`--apply` (2.4.0-alpha.8)**: reencola Y releva SOLO esas entradas en la
152
+ * misma llamada, bajo UN lease (medido: sin esto la reencolada volvía con su
153
+ * id original y la siguiente pasada `only` del tenant salía `depends-on`; el
154
+ * incidente no se cerraba con un comando). Explícito, jamás por defecto: el
155
+ * comando pasa a ESCRIBIR en el backend. No compone con `--force` (500). Pasa
156
+ * la barrera del freeze. Con el lease tomado por otra pasada NO reencola nada
157
+ * y sale ≠ 0 (`--wait-lease-ms` espera, acotado).
158
+ *
159
+ * Es una operación de PLATAFORMA (como `authz:scopes:relay`): sin actor, sin
160
+ * `within`, y no se expone por HTTP.
161
+ */
162
+ export default class AuthzScopesRequeue extends BaseCommand {
163
+ static commandName = 'authz:scopes:requeue';
164
+ static description = 'Return parked scope-tree outbox entries to the queue (refuses to revert later applied changes unless --force)';
165
+ static options = {
166
+ startApp: true,
167
+ };
168
+ /** `--id=12,13` o `--id=12 --id=13`: ids numéricos como número, el resto como cadena. */
169
+ static parseIds(values) {
170
+ if (values === undefined)
171
+ return undefined;
172
+ return values
173
+ .flatMap((value) => String(value).split(','))
174
+ .map((value) => value.trim())
175
+ .filter((value) => value.length > 0)
176
+ .map((value) => (/^\d+$/.test(value) ? Number(value) : value));
177
+ }
178
+ async run() {
179
+ const ids = AuthzScopesRequeue.parseIds(this.id);
180
+ if (ids === undefined || ids.length === 0) {
181
+ this.logger.error('Falta --id: di QUÉ entradas aparcadas reencolar (las que reporta authz:scopes:relay). Sin ids no se reencola nada.');
182
+ this.exitCode = 1;
183
+ return;
184
+ }
185
+ const { default: authorization } = await import('../services/main.js');
186
+ let result;
187
+ try {
188
+ const report = await authorization.requeueScopeChanges(ids, {
189
+ force: this.force === true,
190
+ apply: this.apply === true,
191
+ ...(this.waitLeaseMs === undefined ? {} : { waitForLeaseMs: this.waitLeaseMs }),
192
+ });
193
+ result = requeueLines({ report });
194
+ }
195
+ catch (error) {
196
+ if (error?.code !== 'E_AUTHZ_REQUEUE_REFUSED')
197
+ throw error;
198
+ result = requeueLines({ refused: error.conflicts });
199
+ }
200
+ for (const line of result.lines)
201
+ this.logger[line.level](line.message);
202
+ if (!result.clean)
203
+ this.exitCode = 1;
204
+ }
205
+ }
206
+ __decorate([
207
+ flags.array({
208
+ description: 'Outbox ids to requeue (the parked entries the relay reports), comma-separated or repeated',
209
+ }),
210
+ __metadata("design:type", Object)
211
+ ], AuthzScopesRequeue.prototype, "id", void 0);
212
+ __decorate([
213
+ flags.boolean({
214
+ description: 'Requeue even if a later APPLIED entry shares a scope key (the diff is printed; the store WILL be reverted)',
215
+ }),
216
+ __metadata("design:type", Object)
217
+ ], AuthzScopesRequeue.prototype, "force", void 0);
218
+ __decorate([
219
+ flags.boolean({
220
+ description: 'Also relay ONLY the requeued entries in the same call, under one lease (writes to the backend; not with --force)',
221
+ }),
222
+ __metadata("design:type", Object)
223
+ ], AuthzScopesRequeue.prototype, "apply", void 0);
224
+ __decorate([
225
+ flags.number({
226
+ description: 'With --apply: wait up to this many ms for the relay lease instead of failing at once (pool >= 2)',
227
+ }),
228
+ __metadata("design:type", Object)
229
+ ], AuthzScopesRequeue.prototype, "waitLeaseMs", void 0);
230
+ //# sourceMappingURL=authz_scopes_requeue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authz_scopes_requeue.js","sourceRoot":"","sources":["../../commands/authz_scopes_requeue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { BaseCommand } from '@adonisjs/core/ace';
2
+ import { CommandOptions } from '@adonisjs/core/types/ace';
3
+ import type { FreezeStatus } from '../src/manager.js';
4
+ /**
5
+ * Qué hacer con el freeze vivo, en una función PURA (mismo patrón que
6
+ * `reconcileLines`): es la única decisión del comando y así tiene su caso
7
+ * sin montar un ace.
8
+ *
9
+ * Reglas:
10
+ * - Sin freeze (nunca hubo, o ya levantado: motivo `null`) ⇒ no-op en verde
11
+ * (idempotente: descongelar lo descongelado no es un incidente).
12
+ * - Ventana CADUCADA (2.4.0-alpha.10: motivo puesto y `untilMs` en el pasado,
13
+ * `lastFreezeStatus().expired`) ⇒ `expired`: ERROR con cuándo venció, exit
14
+ * ≠ 0, y el comando limpia la fila para que el segundo `unfreeze` sea
15
+ * no-op. No es «nada que levantar»: es un intervalo en el que la flota
16
+ * escribió — en un cutover, escrituras que el motor nuevo no vio.
17
+ * - Freeze de OPERADOR ⇒ se levanta (este comando es su otra mitad).
18
+ * - Freeze de OTRO dueño (`reconcile`, `platform`) ⇒ NO se levanta sin
19
+ * `--fence`: levantar la barrera de una pasada viva es exactamente el
20
+ * A1.3 que el token cierra. `--fence=<n>` es la decisión humana explícita
21
+ * («ese proceso murió sin lease»), y tiene que coincidir con el fence
22
+ * vivo — un fence viejo no levanta la ventana de otro.
23
+ */
24
+ export declare function unfreezePlan(status: (FreezeStatus & {
25
+ expired?: boolean;
26
+ checkedAtMs?: number;
27
+ }) | null, fence: number | undefined, nowMs?: number): {
28
+ action: 'noop' | 'lift' | 'refuse' | 'expired';
29
+ message: string;
30
+ };
31
+ /**
32
+ * **Cierra la ventana de cutover** (3b-7): levanta el freeze de operador que
33
+ * abrió `authz:freeze`. La otra mitad de ese comando; ver su docblock.
34
+ *
35
+ * node ace authz:unfreeze # levanta la ventana del operador
36
+ * node ace authz:unfreeze --fence=7 # decisión humana: levanta ESE freeze aunque no sea de operador
37
+ */
38
+ export default class AuthzUnfreeze extends BaseCommand {
39
+ static commandName: string;
40
+ static description: string;
41
+ static options: CommandOptions;
42
+ fence: number | undefined;
43
+ run(): Promise<void>;
44
+ }
45
+ //# sourceMappingURL=authz_unfreeze.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authz_unfreeze.d.ts","sourceRoot":"","sources":["../../commands/authz_unfreeze.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAS,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,CAAC,YAAY,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,IAAI,EAC3E,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,KAAK,CAAC,EAAE,MAAM,GACb;IAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA2CrE;AAED;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,MAAM,CAAC,WAAW,SAAmB;IACrC,MAAM,CAAC,WAAW,SAAqF;IAEvG,MAAM,CAAC,OAAO,EAAE,cAAc,CAE7B;IAKO,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IAE3B,GAAG;CAwEV"}
@@ -0,0 +1,157 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { BaseCommand, flags } from '@adonisjs/core/ace';
11
+ /**
12
+ * Qué hacer con el freeze vivo, en una función PURA (mismo patrón que
13
+ * `reconcileLines`): es la única decisión del comando y así tiene su caso
14
+ * sin montar un ace.
15
+ *
16
+ * Reglas:
17
+ * - Sin freeze (nunca hubo, o ya levantado: motivo `null`) ⇒ no-op en verde
18
+ * (idempotente: descongelar lo descongelado no es un incidente).
19
+ * - Ventana CADUCADA (2.4.0-alpha.10: motivo puesto y `untilMs` en el pasado,
20
+ * `lastFreezeStatus().expired`) ⇒ `expired`: ERROR con cuándo venció, exit
21
+ * ≠ 0, y el comando limpia la fila para que el segundo `unfreeze` sea
22
+ * no-op. No es «nada que levantar»: es un intervalo en el que la flota
23
+ * escribió — en un cutover, escrituras que el motor nuevo no vio.
24
+ * - Freeze de OPERADOR ⇒ se levanta (este comando es su otra mitad).
25
+ * - Freeze de OTRO dueño (`reconcile`, `platform`) ⇒ NO se levanta sin
26
+ * `--fence`: levantar la barrera de una pasada viva es exactamente el
27
+ * A1.3 que el token cierra. `--fence=<n>` es la decisión humana explícita
28
+ * («ese proceso murió sin lease»), y tiene que coincidir con el fence
29
+ * vivo — un fence viejo no levanta la ventana de otro.
30
+ */
31
+ export function unfreezePlan(status, fence, nowMs) {
32
+ if (status === null) {
33
+ return { action: 'noop', message: 'No hay ningún freeze vivo: nada que levantar.' };
34
+ }
35
+ // **La ventana CADUCADA** (2.4.0-alpha.10): va antes que `--fence` porque el
36
+ // incidente es el mismo lo pida quien lo pida — no queda barrera que
37
+ // levantar, queda un intervalo en el que la flota ESCRIBIÓ.
38
+ if (status.expired === true) {
39
+ const when = status.untilMs === null ? '?' : new Date(status.untilMs).toISOString();
40
+ const at = nowMs ?? status.checkedAtMs;
41
+ const since = status.untilMs !== null && at !== undefined ? ` (hace ${Math.max(0, at - status.untilMs)} ms)` : '';
42
+ return {
43
+ action: 'expired',
44
+ message: `La ventana de ${status.holder} (${status.reason}, fence ${status.fence}) CADUCÓ el ${when}${since} y nadie ` +
45
+ `la cerró: desde entonces las escrituras volvieron a entrar en toda la flota. En un cutover eso son ` +
46
+ `escrituras que el motor nuevo no vio si la migración ya había corrido: no des el cutover por cerrado — ` +
47
+ `repite la migración (authz:reconcile) dentro de una ventana sin caducidad (authz:freeze sin --lease-ms) ` +
48
+ `antes de cambiar de driver.`,
49
+ };
50
+ }
51
+ if (fence !== undefined && fence !== status.fence) {
52
+ return {
53
+ action: 'refuse',
54
+ message: `El fence vivo es ${status.fence} y pediste levantar el ${fence}: ese freeze ya no existe. ` +
55
+ `Mira el estado y repite con el fence actual si de verdad quieres levantarlo.`,
56
+ };
57
+ }
58
+ if (status.kind !== 'operator' && fence === undefined) {
59
+ return {
60
+ action: 'refuse',
61
+ message: `El freeze vivo NO es de operador: lo sostiene ${status.holder} (${status.reason}). ` +
62
+ `Levantárselo dejaría su pasada corriendo sin barrera (y su reporte lo delatará como lapsed). ` +
63
+ `Espera a que termine${status.untilMs === null ? '' : ' — o a que su lease venza solo'}; si su proceso ` +
64
+ `murió sin lease, la decisión humana es --fence=${status.fence}.`,
65
+ };
66
+ }
67
+ return {
68
+ action: 'lift',
69
+ message: `Freeze de ${status.holder} (${status.reason}, fence ${status.fence}) levantado: la flota vuelve a escribir.`,
70
+ };
71
+ }
72
+ /**
73
+ * **Cierra la ventana de cutover** (3b-7): levanta el freeze de operador que
74
+ * abrió `authz:freeze`. La otra mitad de ese comando; ver su docblock.
75
+ *
76
+ * node ace authz:unfreeze # levanta la ventana del operador
77
+ * node ace authz:unfreeze --fence=7 # decisión humana: levanta ESE freeze aunque no sea de operador
78
+ */
79
+ export default class AuthzUnfreeze extends BaseCommand {
80
+ static commandName = 'authz:unfreeze';
81
+ static description = 'Close the cutover window: lift the operator freeze and let the fleet write again';
82
+ static options = {
83
+ startApp: true,
84
+ };
85
+ async run() {
86
+ const { default: authorization } = await import('../services/main.js');
87
+ // `lastFreezeStatus()` y no `freezeStatus()` (2.4.0-alpha.10): este es el
88
+ // único lector que tiene que ver también la ventana CADUCADA.
89
+ const status = await authorization.lastFreezeStatus();
90
+ const plan = unfreezePlan(status, this.fence);
91
+ if (plan.action === 'noop') {
92
+ this.logger.success(plan.message);
93
+ return;
94
+ }
95
+ if (plan.action === 'refuse') {
96
+ this.logger.error(plan.message);
97
+ this.exitCode = 1;
98
+ return;
99
+ }
100
+ // Levantar (o limpiar la caducada) es CONDICIONAL por token: si otro proceso
101
+ // cambió la fila entre la lectura y el UPDATE no se toca nada. Cierre del
102
+ // auditor de alpha.10 (⚪ 4): la letra la decide el RESULTADO, releyendo la
103
+ // fila — hasta el cierre la rama caducada afirmaba «la fila queda limpia»
104
+ // sin mirar el booleano, y la de levantar decía «o venció su lease» en verde
105
+ // (vencer no hace fallar el UPDATE: `releaseFreeze` no mira `untilMs`).
106
+ const done = await authorization.unfreeze({ fence: status.fence, holder: status.holder });
107
+ const after = done ? null : await authorization.lastFreezeStatus();
108
+ const ahora = (s) => `${s.holder} (${s.reason}, fence ${s.fence}, ${s.expired ? 'CADUCADA' : 'viva'})`;
109
+ // Cierre-2 · C4: si el UPDATE no casó pero la fila releída es LA MISMA (holder,
110
+ // fence y motivo), nadie la cambió: la letra no puede afirmar «otro proceso».
111
+ const unchanged = after !== null && after.fence === status.fence && after.holder === status.holder && after.reason === status.reason;
112
+ if (plan.action === 'expired') {
113
+ this.logger.error(plan.message);
114
+ if (done) {
115
+ this.logger.info('La fila queda limpia: un segundo authz:unfreeze ya no repite este error.');
116
+ }
117
+ else if (after === null) {
118
+ this.logger.warning('La fila ya la había limpiado otro proceso entre la lectura y la limpieza: no se ha tocado nada.');
119
+ }
120
+ else if (unchanged) {
121
+ this.logger.error(`La fila NO se ha limpiado y la fila NO cambió: sigue siendo ${ahora(after)}, pero el UPDATE condicional por ` +
122
+ 'su token no casó (rama «token no casa»). Es un defecto del paquete, no una carrera: repórtalo con esta línea.');
123
+ }
124
+ else {
125
+ this.logger.error(`La fila NO se ha limpiado: entre la lectura y la limpieza otro proceso la cambió y ahora es ${ahora(after)}. ` +
126
+ 'Vuelve a ejecutar authz:unfreeze para ver su estado.');
127
+ }
128
+ this.exitCode = 1;
129
+ return;
130
+ }
131
+ if (done) {
132
+ this.logger.success(plan.message);
133
+ return;
134
+ }
135
+ if (after === null) {
136
+ // Nadie lo sostiene ya: otro lo levantó entre medias. El objetivo del operador se cumple.
137
+ this.logger.success('El freeze ya no estaba: otro proceso lo levantó entre la lectura y el levantamiento. Nada que hacer.');
138
+ return;
139
+ }
140
+ if (unchanged) {
141
+ this.logger.error(`No se ha levantado nada y la fila NO cambió: sigue siendo ${ahora(after)}, pero el UPDATE condicional por su ` +
142
+ 'token no casó (rama «token no casa»). Es un defecto del paquete, no una carrera: repórtalo con esta línea.');
143
+ this.exitCode = 1;
144
+ return;
145
+ }
146
+ this.logger.error(`No se ha levantado nada: entre la lectura y el levantamiento la fila cambió y ahora es ${ahora(after)}. ` +
147
+ 'Vuelve a ejecutar authz:unfreeze para decidir sobre ese freeze.');
148
+ this.exitCode = 1;
149
+ }
150
+ }
151
+ __decorate([
152
+ flags.number({
153
+ description: 'Lift exactly this freeze even if it is not an operator window (its owner died without a lease)',
154
+ }),
155
+ __metadata("design:type", Object)
156
+ ], AuthzUnfreeze.prototype, "fence", void 0);
157
+ //# sourceMappingURL=authz_unfreeze.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authz_unfreeze.js","sourceRoot":"","sources":["../../commands/authz_unfreeze.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,17 @@
1
- /**
2
- * Comandos ace del paquete. Se registran con:
3
- * node ace configure @jantstack/adonis-authz
4
- */
5
- export { default as OpenFgaProvision } from './openfga_provision.js';
6
- export { default as OpenFgaImport } from './openfga_import.js';
7
- export { default as AuthzCatalogDiff } from './authz_catalog_diff.js';
8
- export { default as AuthzCatalogSync } from './authz_catalog_sync.js';
1
+ import type { CommandMetaData } from '@adonisjs/core/types/ace';
2
+ import OpenFgaProvision from './openfga_provision.js';
3
+ import AuthzCatalogDiff from './authz_catalog_diff.js';
4
+ import AuthzCatalogSync from './authz_catalog_sync.js';
5
+ import AuthzCatalogPruneOrphans from './authz_catalog_prune_orphans.js';
6
+ import AuthzScopesRelay from './authz_scopes_relay.js';
7
+ import AuthzScopesRequeue from './authz_scopes_requeue.js';
8
+ import AuthzReconcile from './authz_reconcile.js';
9
+ import AuthzRelationsReconcile from './authz_relations_reconcile.js';
10
+ import AuthzFreeze from './authz_freeze.js';
11
+ import AuthzUnfreeze from './authz_unfreeze.js';
12
+ export { OpenFgaProvision, AuthzCatalogDiff, AuthzCatalogSync, AuthzCatalogPruneOrphans, AuthzScopesRelay, AuthzScopesRequeue, AuthzReconcile, AuthzRelationsReconcile, AuthzFreeze, AuthzUnfreeze, };
13
+ /** Contrato de loader de ace (`LoadersContract.getMetaData`). */
14
+ export declare function getMetaData(): Promise<CommandMetaData[]>;
15
+ /** Contrato de loader de ace (`LoadersContract.getCommand`): la clase, o `null` si el nombre no es nuestro. */
16
+ export declare function getCommand(metaData: CommandMetaData): Promise<any>;
9
17
  //# sourceMappingURL=main.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../commands/main.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACpE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAA"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../commands/main.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,gBAAgB,MAAM,wBAAwB,CAAA;AACrD,OAAO,gBAAgB,MAAM,yBAAyB,CAAA;AACtD,OAAO,gBAAgB,MAAM,yBAAyB,CAAA;AACtD,OAAO,wBAAwB,MAAM,kCAAkC,CAAA;AACvE,OAAO,gBAAgB,MAAM,yBAAyB,CAAA;AACtD,OAAO,kBAAkB,MAAM,2BAA2B,CAAA;AAC1D,OAAO,cAAc,MAAM,sBAAsB,CAAA;AACjD,OAAO,uBAAuB,MAAM,gCAAgC,CAAA;AACpE,OAAO,WAAW,MAAM,mBAAmB,CAAA;AAC3C,OAAO,aAAa,MAAM,qBAAqB,CAAA;AAE/C,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACxB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,uBAAuB,EACvB,WAAW,EACX,aAAa,GACd,CAAA;AAgBD,iEAAiE;AACjE,wBAAgB,WAAW,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAExD;AAED,+GAA+G;AAC/G,wBAAgB,UAAU,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CAElE"}
@@ -1,9 +1,62 @@
1
1
  /**
2
- * Comandos ace del paquete. Se registran con:
3
- * node ace configure @jantstack/adonis-authz
2
+ * **El loader de ace de los comandos del paquete** (2.4.0-alpha.4). Se
3
+ * registra con `node ace configure @jantstack/adonis-authz`, que escribe en el
4
+ * `adonisrc.ts` del consumidor:
5
+ *
6
+ * commands: [() => import('@jantstack/adonis-authz/commands')]
7
+ *
8
+ * y ace trata **el módulo importado como el loader**: `Kernel.boot()` llama
9
+ * `getMetaData()` y `getCommand(meta)` sobre el namespace del módulo, sin
10
+ * desenvolver `default` (mismo contrato que `@adonisjs/core/commands` y
11
+ * `@adonisjs/lucid/commands`, que leen un `commands.json` generado por el
12
+ * assembler; aquí no hay assembler, así que el loader es un `ListLoader`
13
+ * sobre las diez clases (nueve hasta alpha.4) y no hay índice que generar).
14
+ *
15
+ * Hasta alpha.3 este fichero re-exportaba las nueve clases y NADA más, de
16
+ * modo que en un consumidor configurado con `node ace configure` **`node ace`
17
+ * entero reventaba** al arrancar (`TypeError: loaderInstance.getMetaData is
18
+ * not a function`), no solo `openfga:provision`. Ningún caso lo vio porque
19
+ * ninguno registraba el barrel como lo registra `createAceKernel`
20
+ * (`tests/commands.spec.ts` · C-1 lo hace desde alpha.4).
21
+ *
22
+ * Las re-exportaciones con nombre se MANTIENEN (quien importe una clase
23
+ * suelta sigue funcionando). Lo que NO vale desde alpha.4 es envolver el
24
+ * módulo en un `ListLoader(Object.values(m))`: `Object.values` incluye ahora
25
+ * las dos funciones y `ListLoader.getMetaData()` llama `serialize()` sobre
26
+ * cada valor. Se registra el módulo directamente, como escribe `configure`.
27
+ * Y NO se exporta `default`: ace no lo cargaría.
4
28
  */
5
- export { default as OpenFgaProvision } from './openfga_provision.js';
6
- export { default as OpenFgaImport } from './openfga_import.js';
7
- export { default as AuthzCatalogDiff } from './authz_catalog_diff.js';
8
- export { default as AuthzCatalogSync } from './authz_catalog_sync.js';
29
+ import { ListLoader } from '@adonisjs/core/ace';
30
+ import OpenFgaProvision from './openfga_provision.js';
31
+ import AuthzCatalogDiff from './authz_catalog_diff.js';
32
+ import AuthzCatalogSync from './authz_catalog_sync.js';
33
+ import AuthzCatalogPruneOrphans from './authz_catalog_prune_orphans.js';
34
+ import AuthzScopesRelay from './authz_scopes_relay.js';
35
+ import AuthzScopesRequeue from './authz_scopes_requeue.js';
36
+ import AuthzReconcile from './authz_reconcile.js';
37
+ import AuthzRelationsReconcile from './authz_relations_reconcile.js';
38
+ import AuthzFreeze from './authz_freeze.js';
39
+ import AuthzUnfreeze from './authz_unfreeze.js';
40
+ export { OpenFgaProvision, AuthzCatalogDiff, AuthzCatalogSync, AuthzCatalogPruneOrphans, AuthzScopesRelay, AuthzScopesRequeue, AuthzReconcile, AuthzRelationsReconcile, AuthzFreeze, AuthzUnfreeze, };
41
+ /** Los diez (nueve hasta alpha.4; `authz:scopes:requeue` desde alpha.5), en el orden en que `node ace list` los enseña. */
42
+ const loader = new ListLoader([
43
+ OpenFgaProvision,
44
+ AuthzCatalogDiff,
45
+ AuthzCatalogSync,
46
+ AuthzCatalogPruneOrphans,
47
+ AuthzScopesRelay,
48
+ AuthzScopesRequeue,
49
+ AuthzReconcile,
50
+ AuthzRelationsReconcile,
51
+ AuthzFreeze,
52
+ AuthzUnfreeze,
53
+ ]);
54
+ /** Contrato de loader de ace (`LoadersContract.getMetaData`). */
55
+ export function getMetaData() {
56
+ return loader.getMetaData();
57
+ }
58
+ /** Contrato de loader de ace (`LoadersContract.getCommand`): la clase, o `null` si el nombre no es nuestro. */
59
+ export function getCommand(metaData) {
60
+ return loader.getCommand(metaData);
61
+ }
9
62
  //# sourceMappingURL=main.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../../commands/main.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACpE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAC9D,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,yBAAyB,CAAA"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../commands/main.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAE/C,OAAO,gBAAgB,MAAM,wBAAwB,CAAA;AACrD,OAAO,gBAAgB,MAAM,yBAAyB,CAAA;AACtD,OAAO,gBAAgB,MAAM,yBAAyB,CAAA;AACtD,OAAO,wBAAwB,MAAM,kCAAkC,CAAA;AACvE,OAAO,gBAAgB,MAAM,yBAAyB,CAAA;AACtD,OAAO,kBAAkB,MAAM,2BAA2B,CAAA;AAC1D,OAAO,cAAc,MAAM,sBAAsB,CAAA;AACjD,OAAO,uBAAuB,MAAM,gCAAgC,CAAA;AACpE,OAAO,WAAW,MAAM,mBAAmB,CAAA;AAC3C,OAAO,aAAa,MAAM,qBAAqB,CAAA;AAE/C,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,wBAAwB,EACxB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,uBAAuB,EACvB,WAAW,EACX,aAAa,GACd,CAAA;AAED,2HAA2H;AAC3H,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC;IAC5B,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,wBAAwB;IACxB,gBAAgB;IAChB,kBAAkB;IAClB,cAAc;IACd,uBAAuB;IACvB,WAAW;IACX,aAAa;CACP,CAAC,CAAA;AAET,iEAAiE;AACjE,MAAM,UAAU,WAAW;IACzB,OAAO,MAAM,CAAC,WAAW,EAAE,CAAA;AAC7B,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,UAAU,CAAC,QAAyB;IAClD,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;AACpC,CAAC"}