@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.
- package/README.md +934 -40
- package/build/commands/authz_catalog_diff.d.ts.map +1 -1
- package/build/commands/authz_catalog_diff.js +1 -2
- package/build/commands/authz_catalog_diff.js.map +1 -1
- package/build/commands/authz_catalog_prune_orphans.d.ts +78 -0
- package/build/commands/authz_catalog_prune_orphans.d.ts.map +1 -0
- package/build/commands/authz_catalog_prune_orphans.js +135 -0
- package/build/commands/authz_catalog_prune_orphans.js.map +1 -0
- package/build/commands/authz_catalog_sync.d.ts +17 -0
- package/build/commands/authz_catalog_sync.d.ts.map +1 -1
- package/build/commands/authz_catalog_sync.js +27 -4
- package/build/commands/authz_catalog_sync.js.map +1 -1
- package/build/commands/authz_freeze.d.ts +44 -0
- package/build/commands/authz_freeze.d.ts.map +1 -0
- package/build/commands/authz_freeze.js +94 -0
- package/build/commands/authz_freeze.js.map +1 -0
- package/build/commands/authz_reconcile.d.ts +111 -0
- package/build/commands/authz_reconcile.d.ts.map +1 -0
- package/build/commands/authz_reconcile.js +417 -0
- package/build/commands/authz_reconcile.js.map +1 -0
- package/build/commands/authz_relations_reconcile.d.ts +144 -0
- package/build/commands/authz_relations_reconcile.d.ts.map +1 -0
- package/build/commands/authz_relations_reconcile.js +438 -0
- package/build/commands/authz_relations_reconcile.js.map +1 -0
- package/build/commands/authz_scopes_relay.d.ts +97 -0
- package/build/commands/authz_scopes_relay.d.ts.map +1 -0
- package/build/commands/authz_scopes_relay.js +344 -0
- package/build/commands/authz_scopes_relay.js.map +1 -0
- package/build/commands/authz_scopes_requeue.d.ts +80 -0
- package/build/commands/authz_scopes_requeue.d.ts.map +1 -0
- package/build/commands/authz_scopes_requeue.js +230 -0
- package/build/commands/authz_scopes_requeue.js.map +1 -0
- package/build/commands/authz_unfreeze.d.ts +45 -0
- package/build/commands/authz_unfreeze.d.ts.map +1 -0
- package/build/commands/authz_unfreeze.js +157 -0
- package/build/commands/authz_unfreeze.js.map +1 -0
- package/build/commands/main.d.ts +16 -8
- package/build/commands/main.d.ts.map +1 -1
- package/build/commands/main.js +59 -6
- package/build/commands/main.js.map +1 -1
- package/build/commands/openfga_provision.d.ts +92 -4
- package/build/commands/openfga_provision.d.ts.map +1 -1
- package/build/commands/openfga_provision.js +155 -7
- package/build/commands/openfga_provision.js.map +1 -1
- package/build/configure.d.ts +11 -0
- package/build/configure.d.ts.map +1 -1
- package/build/configure.js +37 -1
- package/build/configure.js.map +1 -1
- package/build/index.d.ts +50 -11
- package/build/index.d.ts.map +1 -1
- package/build/index.js +49 -7
- package/build/index.js.map +1 -1
- package/build/providers/authz_provider.d.ts +31 -2
- package/build/providers/authz_provider.d.ts.map +1 -1
- package/build/providers/authz_provider.js +65 -2
- package/build/providers/authz_provider.js.map +1 -1
- package/build/services/relations.d.ts +14 -0
- package/build/services/relations.d.ts.map +1 -0
- package/build/services/relations.js +17 -0
- package/build/services/relations.js.map +1 -0
- package/build/src/{catalog.d.ts → catalog/catalog.d.ts} +41 -2
- package/build/src/catalog/catalog.d.ts.map +1 -0
- package/build/src/{catalog.js → catalog/catalog.js} +120 -14
- package/build/src/catalog/catalog.js.map +1 -0
- package/build/src/{catalog_cache.d.ts → catalog/catalog_cache.d.ts} +46 -22
- package/build/src/catalog/catalog_cache.d.ts.map +1 -0
- package/build/src/{catalog_cache.js → catalog/catalog_cache.js} +53 -43
- package/build/src/catalog/catalog_cache.js.map +1 -0
- package/build/src/define_config.d.ts +206 -3
- package/build/src/define_config.d.ts.map +1 -1
- package/build/src/define_config.js +11 -0
- package/build/src/define_config.js.map +1 -1
- package/build/src/drivers/database_driver.d.ts +128 -7
- package/build/src/drivers/database_driver.d.ts.map +1 -1
- package/build/src/drivers/database_driver.js +510 -24
- package/build/src/drivers/database_driver.js.map +1 -1
- package/build/src/drivers/database_relations_driver.d.ts +140 -0
- package/build/src/drivers/database_relations_driver.d.ts.map +1 -0
- package/build/src/drivers/database_relations_driver.js +748 -0
- package/build/src/drivers/database_relations_driver.js.map +1 -0
- package/build/src/drivers/openfga_driver.d.ts +777 -122
- package/build/src/drivers/openfga_driver.d.ts.map +1 -1
- package/build/src/drivers/openfga_driver.js +2228 -477
- package/build/src/drivers/openfga_driver.js.map +1 -1
- package/build/src/drivers/openfga_facts.d.ts +384 -0
- package/build/src/drivers/openfga_facts.d.ts.map +1 -0
- package/build/src/drivers/openfga_facts.js +836 -0
- package/build/src/drivers/openfga_facts.js.map +1 -0
- package/build/src/drivers/openfga_relations_driver.d.ts +186 -0
- package/build/src/drivers/openfga_relations_driver.d.ts.map +1 -0
- package/build/src/drivers/openfga_relations_driver.js +724 -0
- package/build/src/drivers/openfga_relations_driver.js.map +1 -0
- package/build/src/errors.d.ts +430 -6
- package/build/src/errors.d.ts.map +1 -1
- package/build/src/errors.js +453 -6
- package/build/src/errors.js.map +1 -1
- package/build/src/freeze.d.ts +200 -0
- package/build/src/freeze.d.ts.map +1 -0
- package/build/src/freeze.js +306 -0
- package/build/src/freeze.js.map +1 -0
- package/build/src/http/app_access_middleware.d.ts.map +1 -0
- package/build/src/http/app_access_middleware.js.map +1 -0
- package/build/src/http/resource_access_middleware.d.ts +105 -0
- package/build/src/http/resource_access_middleware.d.ts.map +1 -0
- package/build/src/http/resource_access_middleware.js +81 -0
- package/build/src/http/resource_access_middleware.js.map +1 -0
- package/build/src/identity.d.ts +74 -1
- package/build/src/identity.d.ts.map +1 -1
- package/build/src/identity.js +100 -2
- package/build/src/identity.js.map +1 -1
- package/build/src/manager.d.ts +549 -6
- package/build/src/manager.d.ts.map +1 -1
- package/build/src/manager.js +2243 -193
- package/build/src/manager.js.map +1 -1
- package/build/src/models/authz_assignment.d.ts +7 -7
- package/build/src/models/authz_assignment.d.ts.map +1 -1
- package/build/src/models/authz_deny.d.ts +7 -7
- package/build/src/models/authz_deny.d.ts.map +1 -1
- package/build/src/models/authz_permission.d.ts +7 -7
- package/build/src/models/authz_permission.d.ts.map +1 -1
- package/build/src/models/authz_role.d.ts +7 -7
- package/build/src/models/authz_role.d.ts.map +1 -1
- package/build/src/models/authz_role_permission.d.ts +7 -7
- package/build/src/models/authz_role_permission.d.ts.map +1 -1
- package/build/src/openfga.d.ts +18 -2
- package/build/src/openfga.d.ts.map +1 -1
- package/build/src/openfga.js +15 -1
- package/build/src/openfga.js.map +1 -1
- package/build/src/reconcile.d.ts +37 -0
- package/build/src/reconcile.d.ts.map +1 -0
- package/build/src/reconcile.js +69 -0
- package/build/src/reconcile.js.map +1 -0
- package/build/src/relation_partition_trigger.d.ts +8 -0
- package/build/src/relation_partition_trigger.d.ts.map +1 -0
- package/build/src/relation_partition_trigger.js +93 -0
- package/build/src/relation_partition_trigger.js.map +1 -0
- package/build/src/relations/define_relations_config.d.ts +109 -0
- package/build/src/relations/define_relations_config.d.ts.map +1 -0
- package/build/src/relations/define_relations_config.js +211 -0
- package/build/src/relations/define_relations_config.js.map +1 -0
- package/build/src/relations/manager.d.ts +138 -0
- package/build/src/relations/manager.d.ts.map +1 -0
- package/build/src/relations/manager.js +494 -0
- package/build/src/relations/manager.js.map +1 -0
- package/build/src/relations/reconcile.d.ts +137 -0
- package/build/src/relations/reconcile.d.ts.map +1 -0
- package/build/src/relations/reconcile.js +294 -0
- package/build/src/relations/reconcile.js.map +1 -0
- package/build/src/relations_config_store.d.ts +22 -0
- package/build/src/relations_config_store.d.ts.map +1 -0
- package/build/src/relations_config_store.js +74 -0
- package/build/src/relations_config_store.js.map +1 -0
- package/build/src/scope_outbox.d.ts +123 -0
- package/build/src/scope_outbox.d.ts.map +1 -0
- package/build/src/scope_outbox.js +532 -0
- package/build/src/scope_outbox.js.map +1 -0
- package/build/src/{drivers → shared}/backend_guard.d.ts +42 -0
- package/build/src/shared/backend_guard.d.ts.map +1 -0
- package/build/src/{drivers → shared}/backend_guard.js +78 -1
- package/build/src/shared/backend_guard.js.map +1 -0
- package/build/src/{drivers → shared}/sql_expiry.d.ts +2 -0
- package/build/src/shared/sql_expiry.d.ts.map +1 -0
- package/build/src/{drivers → shared}/sql_expiry.js +4 -0
- package/build/src/shared/sql_expiry.js.map +1 -0
- package/build/src/shared/transaction_guard.d.ts +53 -0
- package/build/src/shared/transaction_guard.d.ts.map +1 -0
- package/build/src/shared/transaction_guard.js +74 -0
- package/build/src/shared/transaction_guard.js.map +1 -0
- package/build/src/sql_descendants.d.ts +55 -1
- package/build/src/sql_descendants.d.ts.map +1 -1
- package/build/src/sql_descendants.js +75 -1
- package/build/src/sql_descendants.js.map +1 -1
- package/build/src/testing/contract.d.ts +129 -4
- package/build/src/testing/contract.d.ts.map +1 -1
- package/build/src/testing/contract.js +915 -177
- package/build/src/testing/contract.js.map +1 -1
- package/build/src/testing/main.d.ts +10 -2
- package/build/src/testing/main.d.ts.map +1 -1
- package/build/src/testing/main.js +5 -1
- package/build/src/testing/main.js.map +1 -1
- package/build/src/testing/migration_contract.d.ts +293 -0
- package/build/src/testing/migration_contract.d.ts.map +1 -0
- package/build/src/testing/migration_contract.js +589 -0
- package/build/src/testing/migration_contract.js.map +1 -0
- package/build/src/testing/relations_contract.d.ts +73 -0
- package/build/src/testing/relations_contract.d.ts.map +1 -0
- package/build/src/testing/relations_contract.js +1238 -0
- package/build/src/testing/relations_contract.js.map +1 -0
- package/build/src/testing/relations_reconcile_contract.d.ts +24 -0
- package/build/src/testing/relations_reconcile_contract.d.ts.map +1 -0
- package/build/src/testing/relations_reconcile_contract.js +220 -0
- package/build/src/testing/relations_reconcile_contract.js.map +1 -0
- package/build/src/testing/scope_outbox_contract.d.ts +98 -0
- package/build/src/testing/scope_outbox_contract.d.ts.map +1 -0
- package/build/src/testing/scope_outbox_contract.js +677 -0
- package/build/src/testing/scope_outbox_contract.js.map +1 -0
- package/build/src/traits/authz_scopes.js +1 -1
- package/build/src/traits/authz_scopes.js.map +1 -1
- package/build/src/traits/has_uuid.d.ts +8 -8
- package/build/src/traits/has_uuid.d.ts.map +1 -1
- package/build/src/types.d.ts +1537 -84
- package/build/src/types.d.ts.map +1 -1
- package/build/src/types.js +65 -0
- package/build/src/types.js.map +1 -1
- package/build/stubs/config/authorization.stub +149 -5
- package/build/stubs/migration.stub +136 -0
- package/build/stubs/scopes_outbox_migration.stub +57 -0
- package/package.json +4 -2
- package/build/commands/openfga_import.d.ts +0 -34
- package/build/commands/openfga_import.d.ts.map +0 -1
- package/build/commands/openfga_import.js +0 -97
- package/build/commands/openfga_import.js.map +0 -1
- package/build/src/catalog.d.ts.map +0 -1
- package/build/src/catalog.js.map +0 -1
- package/build/src/catalog_cache.d.ts.map +0 -1
- package/build/src/catalog_cache.js.map +0 -1
- package/build/src/drivers/backend_guard.d.ts.map +0 -1
- package/build/src/drivers/backend_guard.js.map +0 -1
- package/build/src/drivers/sql_expiry.d.ts.map +0 -1
- package/build/src/drivers/sql_expiry.js.map +0 -1
- package/build/src/middleware/app_access_middleware.d.ts.map +0 -1
- package/build/src/middleware/app_access_middleware.js.map +0 -1
- /package/build/src/{middleware → http}/app_access_middleware.d.ts +0 -0
- /package/build/src/{middleware → http}/app_access_middleware.js +0 -0
|
@@ -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
|
|
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 —
|
|
11
|
-
* versionado sobre el
|
|
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
|
|
@@ -18,10 +27,89 @@ import { CommandOptions } from '@adonisjs/core/types/ace';
|
|
|
18
27
|
export default class OpenFgaProvision extends BaseCommand {
|
|
19
28
|
static commandName: string;
|
|
20
29
|
static description: string;
|
|
30
|
+
/**
|
|
31
|
+
* **Bootstrap sin base: `startApp: false`, y el comando BOOTEA la app por su
|
|
32
|
+
* cuenta hasta `boot()`** (2.4.0-alpha.4, opción B del panel; el único de
|
|
33
|
+
* los nueve con `startApp: false`, a propósito).
|
|
34
|
+
*
|
|
35
|
+
* `this.app.config` NO existe hasta `app.boot()`: `Application.init()` no
|
|
36
|
+
* llama a `ConfigManager.process()`, `boot()` sí (`@adonisjs/application`
|
|
37
|
+
* 9.0.1; el docblock de `get config()` dice «after init» y es falso). Y el
|
|
38
|
+
* ignitor de ace solo hace `boot()`+`start()` con `startApp: true`. Hasta
|
|
39
|
+
* alpha.3 esto leía `this.app.config.get(...)` sobre `undefined`:
|
|
40
|
+
* `TypeError` en la primera línea de `run()`, en cualquier consumidor.
|
|
41
|
+
*
|
|
42
|
+
* Por qué NO `startApp: true` (opción A, la que recomendaba COGNITIV):
|
|
43
|
+
* `start()` ejecuta el `start()`/`ready()` de TODOS los providers del
|
|
44
|
+
* consumidor y sus preloads (`start/routes.ts`, `start/kernel.ts`…) —
|
|
45
|
+
* medido: un `ready()` que consulta la base mata este comando antes de
|
|
46
|
+
* `run()` con la base ausente, que es exactamente el escenario en el que
|
|
47
|
+
* corre; un preload que importe `services/relations` construye el driver
|
|
48
|
+
* de relaciones, que pide el `OPENFGA_STORE_ID` que este comando existe
|
|
49
|
+
* para producir (circular); y `app_provider.ready()` exige
|
|
50
|
+
* `config/encryption.ts` válido. Lo que este comando necesita es SOLO el
|
|
51
|
+
* config, y eso lo da `boot()` (≈80 ms: `config/*` + `register()`/`boot()`
|
|
52
|
+
* de los providers). Ver `prepare()`.
|
|
53
|
+
*/
|
|
21
54
|
static options: CommandOptions;
|
|
22
55
|
url: string | undefined;
|
|
23
56
|
storeId: string | undefined;
|
|
24
57
|
name: string | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* Arranca la app hasta `boot()` — sin `start()` — para que `config/*`
|
|
60
|
+
* exista. Va en `prepare()` y no en `run()` porque `BaseCommand.exec()`
|
|
61
|
+
* encadena `prepare()` → `interact()` → `run()` dentro del mismo `try`:
|
|
62
|
+
* el fallo se reporta igual y `run()` queda limpio de ciclo de vida.
|
|
63
|
+
*
|
|
64
|
+
* Las guardas de estado NO son decorativas: `Application.boot()` es un
|
|
65
|
+
* no-op SILENCIOSO si el estado no es `initiated` (⚪ 9 del auditor), así
|
|
66
|
+
* que desde `created` primero `init()`; desde `booted`/`ready` (comando
|
|
67
|
+
* invocado dentro de una app ya arrancada) no se hace nada: idempotente.
|
|
68
|
+
* Y si tras eso `app.config` sigue sin existir, se dice y se sale con 1
|
|
69
|
+
* en vez de repetir el `TypeError` con otro disfraz.
|
|
70
|
+
*
|
|
71
|
+
* **Lo que sí exige, escrito**: «antes de que haya base» sigue siendo
|
|
72
|
+
* verdad (cero conexiones, cero consultas, ningún `start`/`ready`, ningún
|
|
73
|
+
* preload), pero todo `config/*` tiene que poder IMPORTARSE — un
|
|
74
|
+
* `config/database.ts` que lance por un `.env` incompleto rompe esto igual
|
|
75
|
+
* que a cualquier otro comando.
|
|
76
|
+
*/
|
|
77
|
+
prepare(): Promise<void>;
|
|
25
78
|
run(): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Los permisos del modelo, o `null` (y exit 1) si no hay ninguno: un modelo
|
|
81
|
+
* `facts` sin permisos no puede responder a nada, y descubrirlo aquí es
|
|
82
|
+
* mucho mejor que descubrirlo en el primer `authorize`.
|
|
83
|
+
*/
|
|
84
|
+
private resolvePermissions;
|
|
26
85
|
}
|
|
86
|
+
/**
|
|
87
|
+
* Los slugs de permiso de TODOS los catálogos del config, sin duplicados y en
|
|
88
|
+
* orden estable (3b-2k · K2). Se exporta —y no es un método— para que se
|
|
89
|
+
* pueda juzgar sin montar un comando de ace: es la pieza que decide qué
|
|
90
|
+
* relaciones lleva el modelo `facts`, y una lista vacía es lo que hace que el
|
|
91
|
+
* comando se niegue a provisionar.
|
|
92
|
+
*
|
|
93
|
+
* Los catálogos del config son FUNCIONES del consumidor (pueden cargar otro
|
|
94
|
+
* módulo perezosamente) y no tocan la base: el modelo se publica antes de que
|
|
95
|
+
* haya una sola fila.
|
|
96
|
+
*/
|
|
97
|
+
export declare function permissionsOfCatalogs(config: any): Promise<string[]>;
|
|
98
|
+
/**
|
|
99
|
+
* Los tipos de relación (ReBAC) que van FUSIONADOS en el modelo `facts`
|
|
100
|
+
* (Fase 4-8), leídos del CONFIG estático `relations.config` — o `undefined` si
|
|
101
|
+
* el consumidor no declaró relaciones (modelo facts-only, como hasta 4-8). Se
|
|
102
|
+
* exporta —y no es un método— para juzgar la decisión sin montar un ace: es la
|
|
103
|
+
* pieza que decide si un store recién aprovisionado acepta tuplas de relación.
|
|
104
|
+
*
|
|
105
|
+
* La fuente es el config (`relations.config`), NO `authz_relations_config` de
|
|
106
|
+
* la base: `openfga:provision` es bootstrap sin base (`startApp: false`;
|
|
107
|
+
* arranca hasta `boot()` para cargar `config/*`, que tiene que poder
|
|
108
|
+
* importarse; no ejecuta `start`/`ready` ni preloads) y el config es lo único
|
|
109
|
+
* que tiene cargado — igual que los permisos salen de `catalogs` y no de
|
|
110
|
+
* `authz_permissions`.
|
|
111
|
+
*/
|
|
112
|
+
export declare function relationsConfigOf(config: any): {
|
|
113
|
+
objectTypes: readonly any[];
|
|
114
|
+
} | undefined;
|
|
27
115
|
//# 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
|
|
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;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,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;IAEhC;;;;;;;;;;;;;;;;;;OAkBG;IACG,OAAO;IAaP,GAAG;IAkET;;;;OAIG;YACW,kBAAkB;CAajC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQ1E;AAED;;;;;;;;;;;;;GAaG;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
|
|
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 —
|
|
19
|
-
* versionado sobre el
|
|
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
|
|
@@ -26,10 +35,67 @@ import { BaseCommand, flags } from '@adonisjs/core/ace';
|
|
|
26
35
|
export default class OpenFgaProvision extends BaseCommand {
|
|
27
36
|
static commandName = 'openfga:provision';
|
|
28
37
|
static description = 'Create an OpenFGA store + write the chassis authorization model';
|
|
38
|
+
/**
|
|
39
|
+
* **Bootstrap sin base: `startApp: false`, y el comando BOOTEA la app por su
|
|
40
|
+
* cuenta hasta `boot()`** (2.4.0-alpha.4, opción B del panel; el único de
|
|
41
|
+
* los nueve con `startApp: false`, a propósito).
|
|
42
|
+
*
|
|
43
|
+
* `this.app.config` NO existe hasta `app.boot()`: `Application.init()` no
|
|
44
|
+
* llama a `ConfigManager.process()`, `boot()` sí (`@adonisjs/application`
|
|
45
|
+
* 9.0.1; el docblock de `get config()` dice «after init» y es falso). Y el
|
|
46
|
+
* ignitor de ace solo hace `boot()`+`start()` con `startApp: true`. Hasta
|
|
47
|
+
* alpha.3 esto leía `this.app.config.get(...)` sobre `undefined`:
|
|
48
|
+
* `TypeError` en la primera línea de `run()`, en cualquier consumidor.
|
|
49
|
+
*
|
|
50
|
+
* Por qué NO `startApp: true` (opción A, la que recomendaba COGNITIV):
|
|
51
|
+
* `start()` ejecuta el `start()`/`ready()` de TODOS los providers del
|
|
52
|
+
* consumidor y sus preloads (`start/routes.ts`, `start/kernel.ts`…) —
|
|
53
|
+
* medido: un `ready()` que consulta la base mata este comando antes de
|
|
54
|
+
* `run()` con la base ausente, que es exactamente el escenario en el que
|
|
55
|
+
* corre; un preload que importe `services/relations` construye el driver
|
|
56
|
+
* de relaciones, que pide el `OPENFGA_STORE_ID` que este comando existe
|
|
57
|
+
* para producir (circular); y `app_provider.ready()` exige
|
|
58
|
+
* `config/encryption.ts` válido. Lo que este comando necesita es SOLO el
|
|
59
|
+
* config, y eso lo da `boot()` (≈80 ms: `config/*` + `register()`/`boot()`
|
|
60
|
+
* de los providers). Ver `prepare()`.
|
|
61
|
+
*/
|
|
29
62
|
static options = {
|
|
30
63
|
startApp: false,
|
|
31
64
|
};
|
|
65
|
+
/**
|
|
66
|
+
* Arranca la app hasta `boot()` — sin `start()` — para que `config/*`
|
|
67
|
+
* exista. Va en `prepare()` y no en `run()` porque `BaseCommand.exec()`
|
|
68
|
+
* encadena `prepare()` → `interact()` → `run()` dentro del mismo `try`:
|
|
69
|
+
* el fallo se reporta igual y `run()` queda limpio de ciclo de vida.
|
|
70
|
+
*
|
|
71
|
+
* Las guardas de estado NO son decorativas: `Application.boot()` es un
|
|
72
|
+
* no-op SILENCIOSO si el estado no es `initiated` (⚪ 9 del auditor), así
|
|
73
|
+
* que desde `created` primero `init()`; desde `booted`/`ready` (comando
|
|
74
|
+
* invocado dentro de una app ya arrancada) no se hace nada: idempotente.
|
|
75
|
+
* Y si tras eso `app.config` sigue sin existir, se dice y se sale con 1
|
|
76
|
+
* en vez de repetir el `TypeError` con otro disfraz.
|
|
77
|
+
*
|
|
78
|
+
* **Lo que sí exige, escrito**: «antes de que haya base» sigue siendo
|
|
79
|
+
* verdad (cero conexiones, cero consultas, ningún `start`/`ready`, ningún
|
|
80
|
+
* preload), pero todo `config/*` tiene que poder IMPORTARSE — un
|
|
81
|
+
* `config/database.ts` que lance por un `.env` incompleto rompe esto igual
|
|
82
|
+
* que a cualquier otro comando.
|
|
83
|
+
*/
|
|
84
|
+
async prepare() {
|
|
85
|
+
if (this.app.getState() === 'created')
|
|
86
|
+
await this.app.init();
|
|
87
|
+
if (this.app.getState() === 'initiated')
|
|
88
|
+
await this.app.boot();
|
|
89
|
+
if (!this.app.config) {
|
|
90
|
+
this.logger.error('config/* no está cargado: openfga:provision bootea la app hasta boot() para leer config/authorization.ts ' +
|
|
91
|
+
`y tras hacerlo app.config sigue sin existir (estado de la app: ${this.app.getState()}). ` +
|
|
92
|
+
'Comprueba que la app se puede inicializar y que todo config/* se puede importar.');
|
|
93
|
+
this.exitCode = 1;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
32
96
|
async run() {
|
|
97
|
+
if (this.exitCode === 1)
|
|
98
|
+
return;
|
|
33
99
|
const config = this.app.config.get('authorization');
|
|
34
100
|
const apiUrl = this.url ?? config?.openfga?.url;
|
|
35
101
|
if (!apiUrl) {
|
|
@@ -39,25 +105,66 @@ export default class OpenFgaProvision extends BaseCommand {
|
|
|
39
105
|
}
|
|
40
106
|
const { OpenFgaClient } = await import('@openfga/sdk');
|
|
41
107
|
// El subpath `/openfga` es la única puerta al SDK (D9).
|
|
42
|
-
const {
|
|
108
|
+
const { openFgaFactsModel, provisionOpenFgaStore, assertFactsModelPublishable } = await import('../src/openfga.js');
|
|
43
109
|
// Los holders del consumidor viven en SU config, no en el paquete.
|
|
44
110
|
const holderTypes = config?.holderTypes ?? {};
|
|
111
|
+
// Los PERMISOS del modelo (c2r) salen de los catálogos del config. Se
|
|
112
|
+
// resuelven aquí porque son funciones del consumidor (pueden cargar otro
|
|
113
|
+
// módulo) y no necesitan la base: el modelo se publica antes de que haya
|
|
114
|
+
// una sola fila.
|
|
115
|
+
const permissions = await this.resolvePermissions(config);
|
|
116
|
+
if (!permissions)
|
|
117
|
+
return;
|
|
118
|
+
// Los tipos de RELACIÓN (ReBAC) que el modelo lleva FUSIONADOS (Fase 4-8):
|
|
119
|
+
// salen del CONFIG estático (`relations.config`), igual que los permisos
|
|
120
|
+
// salen de `catalogs`. El comando es bootstrap sin base —`startApp: false`,
|
|
121
|
+
// arranca hasta `boot()` para cargar `config/*`, que tiene que poder
|
|
122
|
+
// importarse; no ejecuta `start`/`ready` ni preloads— y no puede leer
|
|
123
|
+
// `authz_relations_config` de la BD; el config sí. Sin `relations.config` el modelo es
|
|
124
|
+
// facts-only, como hasta ahora. Con él, un store recién aprovisionado ya
|
|
125
|
+
// acepta tuplas de relación sin un `authz:catalog:sync` previo.
|
|
126
|
+
const relations = relationsConfigOf(config);
|
|
45
127
|
if (this.storeId) {
|
|
128
|
+
// El mismo gate que la rama que CREA el store (L-F): la rama que
|
|
129
|
+
// ACTUALIZA el modelo es justo donde se toca el techo de bytes, y sin
|
|
130
|
+
// esto salía como error crudo del SDK con una request ya hecha (⚪ N1
|
|
131
|
+
// del auditor de alpha.4). Cero requests si no es publicable.
|
|
132
|
+
assertFactsModelPublishable(holderTypes, permissions, undefined, relations);
|
|
46
133
|
const client = new OpenFgaClient({ apiUrl, storeId: this.storeId });
|
|
47
|
-
const model = await client.writeAuthorizationModel(
|
|
134
|
+
const model = await client.writeAuthorizationModel(openFgaFactsModel(holderTypes, permissions, relations));
|
|
48
135
|
this.logger.success('Nuevo authorization model escrito en el store existente.');
|
|
136
|
+
if (relations)
|
|
137
|
+
this.logger.info(`Tipos de relación fusionados: ${relations.objectTypes.map((t) => t.type).join(', ')}`);
|
|
49
138
|
this.logger.log(`OPENFGA_STORE_ID=${this.storeId}`);
|
|
50
139
|
this.logger.log(`OPENFGA_MODEL_ID=${model.authorization_model_id}`);
|
|
51
140
|
return;
|
|
52
141
|
}
|
|
53
142
|
// El paquete no lee env: el default APP_NAME se resuelve aquí (chasis).
|
|
54
|
-
const { storeId, modelId } = await provisionOpenFgaStore(apiUrl, this.name ?? config?.openfga?.storeName ?? this.app.appName, holderTypes);
|
|
143
|
+
const { storeId, modelId } = await provisionOpenFgaStore(apiUrl, this.name ?? config?.openfga?.storeName ?? this.app.appName, holderTypes, permissions, relations);
|
|
144
|
+
if (relations)
|
|
145
|
+
this.logger.info(`Tipos de relación fusionados: ${relations.objectTypes.map((t) => t.type).join(', ')}`);
|
|
55
146
|
this.logger.success('Store + authorization model provisionados.');
|
|
56
147
|
this.logger.log('Añade al .env (junto a AUTHZ_DRIVER=openfga):');
|
|
57
148
|
this.logger.log(`OPENFGA_URL=${apiUrl}`);
|
|
58
149
|
this.logger.log(`OPENFGA_STORE_ID=${storeId}`);
|
|
59
150
|
this.logger.log(`OPENFGA_MODEL_ID=${modelId}`);
|
|
60
151
|
}
|
|
152
|
+
/**
|
|
153
|
+
* Los permisos del modelo, o `null` (y exit 1) si no hay ninguno: un modelo
|
|
154
|
+
* `facts` sin permisos no puede responder a nada, y descubrirlo aquí es
|
|
155
|
+
* mucho mejor que descubrirlo en el primer `authorize`.
|
|
156
|
+
*/
|
|
157
|
+
async resolvePermissions(config) {
|
|
158
|
+
const slugs = await permissionsOfCatalogs(config);
|
|
159
|
+
if (slugs.length === 0) {
|
|
160
|
+
this.logger.error('El modelo `facts` declara cuatro relaciones por permiso: sin `catalogs` en ' +
|
|
161
|
+
'config/authorization.ts no hay modelo que publicar. Declara tus catálogos y repite ' +
|
|
162
|
+
'(el store que se creara sin ellos denegaría todo).');
|
|
163
|
+
this.exitCode = 1;
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
return slugs;
|
|
167
|
+
}
|
|
61
168
|
}
|
|
62
169
|
__decorate([
|
|
63
170
|
flags.string({ description: 'OpenFGA API URL (defaults to OPENFGA_URL)' }),
|
|
@@ -71,4 +178,45 @@ __decorate([
|
|
|
71
178
|
flags.string({ description: 'Store name when creating one (default: APP_NAME del entorno)' }),
|
|
72
179
|
__metadata("design:type", Object)
|
|
73
180
|
], OpenFgaProvision.prototype, "name", void 0);
|
|
181
|
+
/**
|
|
182
|
+
* Los slugs de permiso de TODOS los catálogos del config, sin duplicados y en
|
|
183
|
+
* orden estable (3b-2k · K2). Se exporta —y no es un método— para que se
|
|
184
|
+
* pueda juzgar sin montar un comando de ace: es la pieza que decide qué
|
|
185
|
+
* relaciones lleva el modelo `facts`, y una lista vacía es lo que hace que el
|
|
186
|
+
* comando se niegue a provisionar.
|
|
187
|
+
*
|
|
188
|
+
* Los catálogos del config son FUNCIONES del consumidor (pueden cargar otro
|
|
189
|
+
* módulo perezosamente) y no tocan la base: el modelo se publica antes de que
|
|
190
|
+
* haya una sola fila.
|
|
191
|
+
*/
|
|
192
|
+
export async function permissionsOfCatalogs(config) {
|
|
193
|
+
const sources = config?.catalogs ?? [];
|
|
194
|
+
const slugs = new Set();
|
|
195
|
+
for (const source of sources) {
|
|
196
|
+
const catalog = await source();
|
|
197
|
+
for (const permission of catalog?.permissions ?? [])
|
|
198
|
+
slugs.add(permission.slug);
|
|
199
|
+
}
|
|
200
|
+
return [...slugs].sort();
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Los tipos de relación (ReBAC) que van FUSIONADOS en el modelo `facts`
|
|
204
|
+
* (Fase 4-8), leídos del CONFIG estático `relations.config` — o `undefined` si
|
|
205
|
+
* el consumidor no declaró relaciones (modelo facts-only, como hasta 4-8). Se
|
|
206
|
+
* exporta —y no es un método— para juzgar la decisión sin montar un ace: es la
|
|
207
|
+
* pieza que decide si un store recién aprovisionado acepta tuplas de relación.
|
|
208
|
+
*
|
|
209
|
+
* La fuente es el config (`relations.config`), NO `authz_relations_config` de
|
|
210
|
+
* la base: `openfga:provision` es bootstrap sin base (`startApp: false`;
|
|
211
|
+
* arranca hasta `boot()` para cargar `config/*`, que tiene que poder
|
|
212
|
+
* importarse; no ejecuta `start`/`ready` ni preloads) y el config es lo único
|
|
213
|
+
* que tiene cargado — igual que los permisos salen de `catalogs` y no de
|
|
214
|
+
* `authz_permissions`.
|
|
215
|
+
*/
|
|
216
|
+
export function relationsConfigOf(config) {
|
|
217
|
+
const objectTypes = config?.relations?.config?.objectTypes;
|
|
218
|
+
if (!Array.isArray(objectTypes) || objectTypes.length === 0)
|
|
219
|
+
return undefined;
|
|
220
|
+
return { objectTypes };
|
|
221
|
+
}
|
|
74
222
|
//# 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
|
|
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;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,WAAW;IACvD,MAAM,CAAC,WAAW,GAAG,mBAAmB,CAAA;IACxC,MAAM,CAAC,WAAW,GAAG,iEAAiE,CAAA;IAEtF;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,MAAM,CAAC,OAAO,GAAmB;QAC/B,QAAQ,EAAE,KAAK;KAChB,CAAA;IAWD;;;;;;;;;;;;;;;;;;OAkBG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,SAAS;YAAE,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;QAC5D,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,WAAW;YAAE,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;QAC9D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,2GAA2G;gBACzG,kEAAkE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK;gBAC1F,kFAAkF,CACrF,CAAA;YACD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG;QACP,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC;YAAE,OAAM;QAC/B,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,wDAAwD;QACxD,MAAM,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,2BAA2B,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;QACnH,mEAAmE;QACnE,MAAM,WAAW,GAAG,MAAM,EAAE,WAAW,IAAI,EAAE,CAAA;QAE7C,sEAAsE;QACtE,yEAAyE;QACzE,yEAAyE;QACzE,iBAAiB;QACjB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;QACzD,IAAI,CAAC,WAAW;YAAE,OAAM;QAExB,2EAA2E;QAC3E,yEAAyE;QACzE,4EAA4E;QAC5E,qEAAqE;QACrE,sEAAsE;QACtE,uFAAuF;QACvF,yEAAyE;QACzE,gEAAgE;QAChE,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAA;QAE3C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,iEAAiE;YACjE,sEAAsE;YACtE,qEAAqE;YACrE,8DAA8D;YAC9D,2BAA2B,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;YAC3E,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,CAChD,iBAAiB,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,CACvD,CAAA;YACD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAA;YAC/E,IAAI,SAAS;gBAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACvH,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,EACX,WAAW,EACX,SAAS,CACV,CAAA;QACD,IAAI,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAiC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACvH,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;IAED;;;;OAIG;IACK,KAAK,CAAC,kBAAkB,CAAC,MAAW;QAC1C,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAA;QACjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,6EAA6E;gBAC3E,qFAAqF;gBACrF,oDAAoD,CACvD,CAAA;YACD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;YACjB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;;AA3HO;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;AAwHlC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAW;IACrD,MAAM,OAAO,GAAoC,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAA;IACvE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;IAC/B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,MAAM,EAAE,CAAA;QAC9B,KAAK,MAAM,UAAU,IAAI,OAAO,EAAE,WAAW,IAAI,EAAE;YAAE,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IACjF,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;AAC1B,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAW;IAC3C,MAAM,WAAW,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,CAAA;IAC1D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAC7E,OAAO,EAAE,WAAW,EAAE,CAAA;AACxB,CAAC"}
|
package/build/configure.d.ts
CHANGED
|
@@ -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
|
package/build/configure.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure.d.ts","sourceRoot":"","sources":["../configure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,mCAAmC,CAAA;AAG9D
|
|
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"}
|
package/build/configure.js
CHANGED
|
@@ -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:
|
|
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
|
package/build/configure.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configure.js","sourceRoot":"","sources":["../configure.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C
|
|
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,12 +2,12 @@
|
|
|
2
2
|
* Entrada pública del paquete.
|
|
3
3
|
* import { AuthorizationManager, APP_SCOPE } from '@jantstack/adonis-authz'
|
|
4
4
|
*/
|
|
5
|
-
export { AuthorizationManager, DEFAULT_MAX_SCOPES, DEFAULT_MAX_DESCENDANTS, MAX_SCOPE_BOUND, DEFAULT_VIEW_MAX_AGE_MS, expandExcludedSubtrees } from './src/manager.js';
|
|
5
|
+
export { AuthorizationManager, DEFAULT_MAX_SCOPES, DEFAULT_MAX_DESCENDANTS, MAX_SCOPE_BOUND, DEFAULT_VIEW_MAX_AGE_MS, PARKED_CENSUS_MAX, RELAY_ORIGIN_MAX_HOPS, RELAY_LEASE_POLL_MS, expandExcludedSubtrees } from './src/manager.js';
|
|
6
6
|
export type { AuthorizationView, ForRequestOptions } from './src/manager.js';
|
|
7
7
|
export { defineConfig } from './src/define_config.js';
|
|
8
8
|
export type { AuthorizationConfig } from './src/define_config.js';
|
|
9
|
-
export { syncAuthzCatalog, diffAuthzCatalog, catalogInSync, formatCatalogDiff, formatScopedRoles, formatShadowedRoles, runCatalogDiff, syncCatalogs, } from './src/catalog.js';
|
|
10
|
-
export type { SyncCatalogOptions, CatalogDiff, CatalogLinkRef, CatalogSource } 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
11
|
/**
|
|
12
12
|
* Memo del catálogo (2.1): se revalida contra la versión compartida
|
|
13
13
|
* `authz_catalog_version`, que `syncAuthzCatalog` sube como última sentencia
|
|
@@ -16,8 +16,8 @@ export type { SyncCatalogOptions, CatalogDiff, CatalogLinkRef, CatalogSource } f
|
|
|
16
16
|
* final: todos los procesos lo ven) — `bumpAuthzCatalogVersion(trx)` exige
|
|
17
17
|
* ese trx; `invalidateAuthzCatalog()` solo alcanza a este proceso.
|
|
18
18
|
*/
|
|
19
|
-
export { CatalogCache, invalidateAuthzCatalog, bumpAuthzCatalogVersion, withAuthzCatalogWrite, readAuthzCatalogVersion, CATALOG_VERSION_TABLE, GLOBAL_OWNER_KEY, } from './src/catalog_cache.js';
|
|
20
|
-
export type { CatalogCacheOptions, CatalogRevalidate, CatalogView, CatalogRoleRef, CatalogPermission, AuthzCatalogWriteOptions, CatalogVersionClient, CatalogVersionTransaction, } from './src/catalog_cache.js';
|
|
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
21
|
/**
|
|
22
22
|
* Memo de ancestros de una instancia (2.1), solo para el camino de lectura.
|
|
23
23
|
* `authorization.forRequest()` ya lo aplica por ti.
|
|
@@ -30,23 +30,50 @@ export { memoizeAncestors } from './src/memoize_ancestors.js';
|
|
|
30
30
|
*/
|
|
31
31
|
export { hierarchicalScopeResolver } from './src/hierarchical_resolver.js';
|
|
32
32
|
export type { HierarchicalResolverOptions, NodeOf, ScopeNode } from './src/hierarchical_resolver.js';
|
|
33
|
-
export { sqlDescendantsOf } from './src/sql_descendants.js';
|
|
34
|
-
export type { SqlDescendantsOptions } from './src/sql_descendants.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';
|
|
35
47
|
/**
|
|
36
48
|
* El backend de autorización no respondió (503). Tipo PROPIO a propósito: sin
|
|
37
49
|
* él escaparía el error del SDK del driver, y distinguir "backend caído"
|
|
38
50
|
* obligaría a importar ese SDK — acoplando el call-site al backend que este
|
|
39
51
|
* paquete existe para abstraer.
|
|
40
52
|
*/
|
|
41
|
-
export { AuthorizationBackendError, AuthorizationBackendTimeoutError, ScopeResolverError, InvalidIdentityError, InvalidSlugError, AuthorizationConfigError, AuthorizationInternalError, UnknownScopeError, NoScopeResolverError, UnknownRoleError, UnknownPermissionError, CatalogConflictError, RoleIsNotAccessError, ScopeCycleError, PurgeIncompleteError,
|
|
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, ScopeDepthLimitError, ScopeRequeueRefusedError, UnsupportedOperationError, NoDescendantsResolverError, ViewExpiredError, RoleNotVisibleError, AmbiguousRoleError, RoleImmutableError, RoleLevelAboveOwnerError, RoleNotAssignableAtError, PermissionNotDelegableError, RankExceededError, ModelTooLargeError, RelationConfigError, RelationTypeUnknownError, RelationUnknownError, ScopeTreeDriftError, ScopeDriftUnguardedError, AuthorizationFrozenError, FreezeHeldError, MassReconcileRefusedError, StaleSourceRefusedError, OperatorWindowExpiredError, ReconcileTooLargeError, markPartialWrite, isPartialWrite, } from './src/errors.js';
|
|
42
54
|
/**
|
|
43
55
|
* Validación de identidad y de slugs (422). La aplica el manager en cada
|
|
44
56
|
* llamada y los drivers por defensa en profundidad; se exporta para que un
|
|
45
57
|
* consumidor valide en su borde (un formulario, un importador) con la MISMA
|
|
46
58
|
* regla y no con una copia.
|
|
47
59
|
*/
|
|
48
|
-
export { assertIdentity, assertSubject, assertScope, assertValidSlug, assertExpiresAt, assertNoSlugCollisions, normalizeRoleQuery, scopeKey, scopeFromKey, IDENTITY_LIMITS, MAX_SLUG_LENGTH, RESERVED_SLUGS, RESERVED_SLUG_PREFIXES, } from './src/identity.js';
|
|
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';
|
|
49
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 type { RelationsReconcileReport } from './src/relations/reconcile.js';
|
|
73
|
+
export { saveRelationsConfig, readRelationsConfig, readRelationsConfigSpec, } from './src/relations_config_store.js';
|
|
74
|
+
export type { RelationsConfigStoreOptions } from './src/relations_config_store.js';
|
|
75
|
+
export { DatabaseRelationsDriver } from './src/drivers/database_relations_driver.js';
|
|
76
|
+
export type { DatabaseRelationsDriverOptions } from './src/drivers/database_relations_driver.js';
|
|
50
77
|
export { resolveGrantExpiry, isActiveExpiry, sameInstant } from './src/expiry.js';
|
|
51
78
|
export { DatabaseAuthorizationDriver, APP_SCOPE_DB_UUID } from './src/drivers/database_driver.js';
|
|
52
79
|
export type { DatabaseDriverOptions } from './src/drivers/database_driver.js';
|
|
@@ -55,8 +82,20 @@ export type { DatabaseDriverOptions } from './src/drivers/database_driver.js';
|
|
|
55
82
|
* `@jantstack/adonis-authz/openfga`, que es lo único que importa el peer
|
|
56
83
|
* opcional `@openfga/sdk`. Un consumidor solo-database arranca sin él (D9).
|
|
57
84
|
*/
|
|
58
|
-
export { APP_SCOPE, APP_SCOPE_TYPE } from './src/types.js';
|
|
59
|
-
export type { AuthorizationDriver, AuthorizationDriverFactory, AuthorizedScopes, AuthzWriteEvent, AuthzCatalogWriteEvent, CatalogPermissionSpec, CatalogRole, CatalogRoleSpec, CatalogSpec, ScopedRoleChanges, ScopedRoleSpec, DenyOptions, DenyRef, ExcludedSubtree, GrantOptions, GrantOutcome, HolderTypeMap, RoleQuery, ScopeChainResolver, ScopeDescendantsResolver,
|
|
85
|
+
export { APP_SCOPE, APP_SCOPE_TYPE, DEFAULT_RECONCILE_MAX_TUPLES } from './src/types.js';
|
|
86
|
+
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, AuthorizationDriverCapabilities, RelationsDriver, RelationsDriverCapabilities, RelObject, RelSubject, RelUserset, RelationRef, RelationWriteEvent, RelationWriteOptions, RelationTransactionOptions, RelationPurgeOptions, RelationPage, RelationObjectsPage, RelationSubjectsPage, RelationTuple, RelationTuplePage, ScopeOutbox, ScopeOutboxContext, ScopeOutboxLease, ScopeOutboxPendingFilter, ScopeOutboxFailure, ScopeRequeueConflict, ScopeRequeueReport, ScopeTreeChange, PendingScopeTreeChange, RelayedScopeChange, ScopeRelayReport, ScopeRelayFailure, ScopeRelayEntry, ScopeRelayEntryStatus, ScopeEnqueueReceipt, } from './src/types.js';
|
|
87
|
+
export { isRelUserset } from './src/types.js';
|
|
88
|
+
/**
|
|
89
|
+
* **¿De quién es esta transacción?** (L-1 · 🟠 9, regla del puerto `{trx}`):
|
|
90
|
+
* la ÚNICA comprobación con la que una escritura del paquete —la outbox de
|
|
91
|
+
* `scopes.*` hoy; `grant`/`relate` de un driver con `transactionalWrites:
|
|
92
|
+
* true`— se inscribe en `{ transaction }`: tiene que ser una transacción
|
|
93
|
+
* ABIERTA de Lucid de la conexión de quien escribe (otra conexión, un
|
|
94
|
+
* `QueryClient` o el `db` entero son 500 `E_AUTHZ_CONFIG`). Un driver de
|
|
95
|
+
* terceros que declare `transactionalWrites: true` la llama con SU conexión.
|
|
96
|
+
*/
|
|
97
|
+
export { assertCallerTransaction } from './src/shared/transaction_guard.js';
|
|
98
|
+
export type { CallerTransaction, CallerTransactionOwner } from './src/shared/transaction_guard.js';
|
|
60
99
|
export { default as AuthzRole } from './src/models/authz_role.js';
|
|
61
100
|
export { default as AuthzPermission } from './src/models/authz_permission.js';
|
|
62
101
|
export { default as AuthzRolePermission } from './src/models/authz_role_permission.js';
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,eAAe,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|