@jantstack/adonis-authz 1.1.0 → 2.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +417 -58
  3. package/build/commands/authz_catalog_diff.d.ts +28 -0
  4. package/build/commands/authz_catalog_diff.d.ts.map +1 -0
  5. package/build/commands/authz_catalog_diff.js +67 -0
  6. package/build/commands/authz_catalog_diff.js.map +1 -0
  7. package/build/commands/authz_catalog_sync.d.ts +20 -0
  8. package/build/commands/authz_catalog_sync.d.ts.map +1 -0
  9. package/build/commands/authz_catalog_sync.js +58 -0
  10. package/build/commands/authz_catalog_sync.js.map +1 -0
  11. package/build/commands/main.d.ts +2 -0
  12. package/build/commands/main.d.ts.map +1 -1
  13. package/build/commands/main.js +2 -0
  14. package/build/commands/main.js.map +1 -1
  15. package/build/commands/openfga_import.d.ts +8 -2
  16. package/build/commands/openfga_import.d.ts.map +1 -1
  17. package/build/commands/openfga_import.js +29 -6
  18. package/build/commands/openfga_import.js.map +1 -1
  19. package/build/commands/openfga_provision.d.ts.map +1 -1
  20. package/build/commands/openfga_provision.js +2 -1
  21. package/build/commands/openfga_provision.js.map +1 -1
  22. package/build/index.d.ts +45 -6
  23. package/build/index.d.ts.map +1 -1
  24. package/build/index.js +37 -4
  25. package/build/index.js.map +1 -1
  26. package/build/src/catalog.d.ts +249 -2
  27. package/build/src/catalog.d.ts.map +1 -1
  28. package/build/src/catalog.js +709 -59
  29. package/build/src/catalog.js.map +1 -1
  30. package/build/src/catalog_cache.d.ts +300 -0
  31. package/build/src/catalog_cache.d.ts.map +1 -0
  32. package/build/src/catalog_cache.js +656 -0
  33. package/build/src/catalog_cache.js.map +1 -0
  34. package/build/src/clock.d.ts +24 -0
  35. package/build/src/clock.d.ts.map +1 -0
  36. package/build/src/clock.js +7 -0
  37. package/build/src/clock.js.map +1 -0
  38. package/build/src/define_config.d.ts +102 -6
  39. package/build/src/define_config.d.ts.map +1 -1
  40. package/build/src/define_config.js.map +1 -1
  41. package/build/src/drivers/backend_guard.d.ts +92 -0
  42. package/build/src/drivers/backend_guard.d.ts.map +1 -0
  43. package/build/src/drivers/backend_guard.js +221 -0
  44. package/build/src/drivers/backend_guard.js.map +1 -0
  45. package/build/src/drivers/database_driver.d.ts +242 -15
  46. package/build/src/drivers/database_driver.d.ts.map +1 -1
  47. package/build/src/drivers/database_driver.js +692 -127
  48. package/build/src/drivers/database_driver.js.map +1 -1
  49. package/build/src/drivers/openfga_driver.d.ts +341 -27
  50. package/build/src/drivers/openfga_driver.d.ts.map +1 -1
  51. package/build/src/drivers/openfga_driver.js +1020 -271
  52. package/build/src/drivers/openfga_driver.js.map +1 -1
  53. package/build/src/drivers/sql_expiry.d.ts +53 -0
  54. package/build/src/drivers/sql_expiry.d.ts.map +1 -0
  55. package/build/src/drivers/sql_expiry.js +66 -0
  56. package/build/src/drivers/sql_expiry.js.map +1 -0
  57. package/build/src/errors.d.ts +333 -0
  58. package/build/src/errors.d.ts.map +1 -1
  59. package/build/src/errors.js +352 -0
  60. package/build/src/errors.js.map +1 -1
  61. package/build/src/expiry.d.ts +27 -0
  62. package/build/src/expiry.d.ts.map +1 -0
  63. package/build/src/expiry.js +50 -0
  64. package/build/src/expiry.js.map +1 -0
  65. package/build/src/hierarchical_resolver.d.ts +56 -0
  66. package/build/src/hierarchical_resolver.d.ts.map +1 -0
  67. package/build/src/hierarchical_resolver.js +87 -0
  68. package/build/src/hierarchical_resolver.js.map +1 -0
  69. package/build/src/identity.d.ts +155 -0
  70. package/build/src/identity.d.ts.map +1 -0
  71. package/build/src/identity.js +359 -0
  72. package/build/src/identity.js.map +1 -0
  73. package/build/src/manager.d.ts +225 -7
  74. package/build/src/manager.d.ts.map +1 -1
  75. package/build/src/manager.js +1670 -23
  76. package/build/src/manager.js.map +1 -1
  77. package/build/src/memoize_ancestors.d.ts +23 -0
  78. package/build/src/memoize_ancestors.d.ts.map +1 -0
  79. package/build/src/memoize_ancestors.js +42 -0
  80. package/build/src/memoize_ancestors.js.map +1 -0
  81. package/build/src/middleware/app_access_middleware.d.ts +8 -6
  82. package/build/src/middleware/app_access_middleware.d.ts.map +1 -1
  83. package/build/src/middleware/app_access_middleware.js +10 -26
  84. package/build/src/middleware/app_access_middleware.js.map +1 -1
  85. package/build/src/models/authz_assignment.d.ts +5 -5
  86. package/build/src/models/authz_assignment.d.ts.map +1 -1
  87. package/build/src/models/authz_deny.d.ts +5 -5
  88. package/build/src/models/authz_deny.d.ts.map +1 -1
  89. package/build/src/models/authz_permission.d.ts +11 -5
  90. package/build/src/models/authz_permission.d.ts.map +1 -1
  91. package/build/src/models/authz_permission.js +4 -0
  92. package/build/src/models/authz_permission.js.map +1 -1
  93. package/build/src/models/authz_role.d.ts +13 -6
  94. package/build/src/models/authz_role.d.ts.map +1 -1
  95. package/build/src/models/authz_role.js +6 -1
  96. package/build/src/models/authz_role.js.map +1 -1
  97. package/build/src/models/authz_role_permission.d.ts +5 -5
  98. package/build/src/models/authz_role_permission.d.ts.map +1 -1
  99. package/build/src/openfga.d.ts +13 -0
  100. package/build/src/openfga.d.ts.map +1 -0
  101. package/build/src/openfga.js +12 -0
  102. package/build/src/openfga.js.map +1 -0
  103. package/build/src/sql_descendants.d.ts +51 -0
  104. package/build/src/sql_descendants.d.ts.map +1 -0
  105. package/build/src/sql_descendants.js +129 -0
  106. package/build/src/sql_descendants.js.map +1 -0
  107. package/build/src/testing/contract.d.ts +138 -7
  108. package/build/src/testing/contract.d.ts.map +1 -1
  109. package/build/src/testing/contract.js +2946 -24
  110. package/build/src/testing/contract.js.map +1 -1
  111. package/build/src/testing/main.d.ts +4 -2
  112. package/build/src/testing/main.d.ts.map +1 -1
  113. package/build/src/testing/main.js +2 -1
  114. package/build/src/testing/main.js.map +1 -1
  115. package/build/src/testing/scope_tree.d.ts +65 -0
  116. package/build/src/testing/scope_tree.d.ts.map +1 -0
  117. package/build/src/testing/scope_tree.js +145 -0
  118. package/build/src/testing/scope_tree.js.map +1 -0
  119. package/build/src/traits/authz_scopes.d.ts +30 -6
  120. package/build/src/traits/authz_scopes.d.ts.map +1 -1
  121. package/build/src/traits/authz_scopes.js +30 -18
  122. package/build/src/traits/authz_scopes.js.map +1 -1
  123. package/build/src/traits/has_uuid.d.ts +5 -5
  124. package/build/src/traits/has_uuid.d.ts.map +1 -1
  125. package/build/src/types.d.ts +530 -28
  126. package/build/src/types.d.ts.map +1 -1
  127. package/build/src/types.js +10 -4
  128. package/build/src/types.js.map +1 -1
  129. package/build/stubs/config/app_acl.stub +4 -2
  130. package/build/stubs/config/authorization.stub +66 -12
  131. package/build/stubs/migration.stub +57 -13
  132. package/package.json +11 -6
@@ -0,0 +1,145 @@
1
+ import { APP_SCOPE, APP_SCOPE_TYPE } from '../types.js';
2
+ /** Separador no imprimible: un `type` con ':' no puede colisionar con otro. */
3
+ function key(scope) {
4
+ return `${scope.type}\u001f${scope.uuid ?? ''}`;
5
+ }
6
+ /**
7
+ * El resolutor que un harness inyecta al driver para que vea el árbol del
8
+ * juez: la cadena canónica del árbol (`chainOf`). Un scope que el árbol NO
9
+ * conoce resuelve a `null` tal cual: el driver deniega y rechaza escribir
10
+ * (L0.3). Es lo que hace que los casos de herencia dependan de verdad de
11
+ * `tree.attach` — con un fallback a `[APP_SCOPE]` un driver que ignorase el
12
+ * árbol seguiría pasando.
13
+ */
14
+ export function resolveChainFrom(tree) {
15
+ return (scope) => tree.chainOf(scope);
16
+ }
17
+ /**
18
+ * El `descendantsOf` que un harness inyecta al MANAGER para que las
19
+ * primitivas de enumeración (2.1: `authorizedScopes`) vean el árbol del
20
+ * juez. Se calcula desde `edges()` —lo único que el contrato exige a un
21
+ * árbol— así que vale para cualquier `ContractScopeTree`. Un scope que el
22
+ * árbol no conoce resuelve a `null`; más de `maxNodes` descendientes ⇒ lanza
23
+ * (el contrato del puerto: nunca una lista truncada en silencio).
24
+ */
25
+ export function descendantsFrom(tree) {
26
+ if (tree.descendantsOf)
27
+ return (scope, options) => tree.descendantsOf(scope, options);
28
+ return async (scope, { maxNodes }) => {
29
+ if (scope.type !== APP_SCOPE_TYPE && (await tree.chainOf(scope)) === null)
30
+ return null;
31
+ const children = new Map();
32
+ for await (const { child, parent } of tree.edges()) {
33
+ const k = key(parent);
34
+ if (!children.has(k))
35
+ children.set(k, []);
36
+ children.get(k).push(child);
37
+ }
38
+ const result = [];
39
+ const seen = new Set([key(scope)]);
40
+ const frontier = [scope];
41
+ while (frontier.length) {
42
+ const current = frontier.shift();
43
+ for (const child of children.get(key(current)) ?? []) {
44
+ if (seen.has(key(child)))
45
+ continue;
46
+ seen.add(key(child));
47
+ result.push(child);
48
+ if (result.length > maxNodes) {
49
+ throw new Error(`descendantsFrom: ${key(scope)} tiene más de ${maxNodes} descendientes`);
50
+ }
51
+ frontier.push(child);
52
+ }
53
+ }
54
+ return result;
55
+ };
56
+ }
57
+ /**
58
+ * Árbol en memoria para harness de test: un `Map` hijo→padre.
59
+ *
60
+ * El árbol de TEST también garantiza ser árbol (anti-ciclo, raíz única,
61
+ * padre existente), igual que hace el manager en `scopes.attached/moved`:
62
+ * el juez habla con el driver directamente, sin manager, y un test que
63
+ * construyera un ciclo por error pasaría en falso o se colgaría subiendo
64
+ * ancestros. Por eso aquí se lanza.
65
+ */
66
+ export function memoryScopeTree() {
67
+ const parents = new Map();
68
+ function isKnown(scope) {
69
+ return scope.type === APP_SCOPE_TYPE || parents.has(key(scope));
70
+ }
71
+ function descendantsOf(scope) {
72
+ const result = new Set();
73
+ let frontier = [key(scope)];
74
+ while (frontier.length) {
75
+ const next = [];
76
+ for (const entry of parents.values()) {
77
+ const childKey = key(entry.child);
78
+ if (frontier.includes(key(entry.parent)) && !result.has(childKey)) {
79
+ result.add(childKey);
80
+ next.push(childKey);
81
+ }
82
+ }
83
+ frontier = next;
84
+ }
85
+ return result;
86
+ }
87
+ function link(child, parent) {
88
+ if (child.type === APP_SCOPE_TYPE) {
89
+ throw new Error('memoryScopeTree: la raíz `app` no puede colgar de nada');
90
+ }
91
+ if (!isKnown(parent)) {
92
+ throw new Error(`memoryScopeTree: el padre ${key(parent)} no existe en el árbol`);
93
+ }
94
+ if (key(parent) === key(child) || descendantsOf(child).has(key(parent))) {
95
+ throw new Error(`memoryScopeTree: ciclo — ${key(parent)} desciende de ${key(child)}`);
96
+ }
97
+ parents.set(key(child), { child, parent });
98
+ }
99
+ return {
100
+ async attach(child, parent) {
101
+ link(child, parent);
102
+ },
103
+ async move(child, newParent) {
104
+ if (!parents.has(key(child))) {
105
+ throw new Error(`memoryScopeTree: no se puede mover ${key(child)}, no existe`);
106
+ }
107
+ link(child, newParent);
108
+ },
109
+ async detach(child) {
110
+ for (const k of descendantsOf(child))
111
+ parents.delete(k);
112
+ parents.delete(key(child));
113
+ },
114
+ async chainOf(scope) {
115
+ if (scope.type === APP_SCOPE_TYPE)
116
+ return [APP_SCOPE];
117
+ const own = parents.get(key(scope));
118
+ if (!own)
119
+ return null;
120
+ // El elemento 0 es el nodo tal como se colgó (canónico para este
121
+ // árbol); un `Map` compara por bytes, así que aquí un alias nunca casa.
122
+ const chain = [own.child];
123
+ // `link` ya impide ciclos; el conjunto de visitados es el cinturón por
124
+ // si alguien manipula el mapa por otra vía.
125
+ const visited = new Set([key(scope)]);
126
+ let current = own;
127
+ while (current) {
128
+ chain.push(current.parent);
129
+ const parentKey = key(current.parent);
130
+ if (visited.has(parentKey)) {
131
+ throw new Error(`memoryScopeTree: ciclo detectado al resolver ${key(scope)}`);
132
+ }
133
+ visited.add(parentKey);
134
+ current = parents.get(parentKey);
135
+ }
136
+ return chain;
137
+ },
138
+ async *edges() {
139
+ for (const entry of parents.values())
140
+ yield { child: entry.child, parent: entry.parent };
141
+ },
142
+ };
143
+ }
144
+ export { APP_SCOPE };
145
+ //# sourceMappingURL=scope_tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope_tree.js","sourceRoot":"","sources":["../../../src/testing/scope_tree.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import { scope } from '@adonisjs/lucid/orm';
2
+ import type { Clock } from '../clock.js';
1
3
  /**
2
4
  * Scopes de query sobre el motor de autorización propio — paridad con los
3
5
  * whereRoles/wherePermissions del paquete extirpado, ahora sobre `authz_*`.
@@ -10,12 +12,34 @@
10
12
  *
11
13
  * Admin.query().withScopes((s) => s.whereRoles('superadmin'))
12
14
  * User.query().withScopes((s) => s.wherePermissions('audit:read'))
15
+ *
16
+ * El reloj (2.5-B · K6, CR#5): la vigencia se decide con el reloj del
17
+ * sistema, salvo que se pase uno al componer — `compose(BaseModel,
18
+ * withAuthzScopes({ clock }))`. El trait no ve el manager ni su
19
+ * `config.clock`: si tu app fija el reloj, pásale el MISMO aquí; si no,
20
+ * este listado y `authorize` pueden discrepar sobre lo que ya venció.
13
21
  */
14
- export declare function withAuthzScopes<T extends {
15
- new (...args: any[]): {};
16
- }>(Base: T): {
22
+ export interface AuthzScopesOptions {
23
+ /** Reloj con el que se decide «vigente» (default: `systemClock`). */
24
+ clock?: Clock;
25
+ }
26
+ type Constructor = {
17
27
  new (...args: any[]): {};
18
- whereRoles: import("@adonisjs/lucid/types/model").QueryScope<import("@adonisjs/lucid/types/model").LucidModel, (query: any, ...roles: string[]) => void>;
19
- wherePermissions: import("@adonisjs/lucid/types/model").QueryScope<import("@adonisjs/lucid/types/model").LucidModel, (query: any, ...permissions: string[]) => void>;
20
- } & T;
28
+ };
29
+ /** Lo que el trait añade al modelo: dos scopes de query. */
30
+ export interface AuthzScopesStatics {
31
+ whereRoles: ReturnType<typeof scope<any, (query: any, ...roles: string[]) => void>>;
32
+ wherePermissions: ReturnType<typeof scope<any, (query: any, ...permissions: string[]) => void>>;
33
+ }
34
+ export type WithAuthzScopes<T extends Constructor> = T & AuthzScopesStatics;
35
+ /**
36
+ * Como mixin directo (`compose(BaseModel, withAuthzScopes)`: reloj del
37
+ * sistema) o con opciones (`compose(BaseModel, withAuthzScopes({ clock }))`).
38
+ * Una sola firma genérica y no dos overloads: TypeScript solo propaga la
39
+ * inferencia de orden superior de `compose` (`A` = la clase mezclada) cuando
40
+ * el argumento tiene UNA firma; con overloads `compose(BaseModel,
41
+ * withAuthzScopes)` perdía los estáticos del modelo.
42
+ */
43
+ export declare function withAuthzScopes<T extends Constructor | AuthzScopesOptions>(arg: T): T extends Constructor ? WithAuthzScopes<T> : <U extends Constructor>(Base: U) => WithAuthzScopes<U>;
44
+ export {};
21
45
  //# sourceMappingURL=authz_scopes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"authz_scopes.d.ts","sourceRoot":"","sources":["../../../src/traits/authz_scopes.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;CAAE,EAAE,IAAI,EAAE,CAAC;kBAArB,GAAG,EAAE;2HAEzB,GAAG,YAAY,MAAM,EAAE;iIAajB,GAAG,kBAAkB,MAAM,EAAE;MAcxE"}
1
+ {"version":3,"file":"authz_scopes.d.ts","sourceRoot":"","sources":["../../../src/traits/authz_scopes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAG3C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAIxC;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,kBAAkB;IACjC,qEAAqE;IACrE,KAAK,CAAC,EAAE,KAAK,CAAA;CACd;AAED,KAAK,WAAW,GAAG;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;CAAE,CAAA;AAE/C,4DAA4D;AAC5D,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,CAAC,CAAA;IACnF,gBAAgB,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,CAAC,CAAA;CAChG;AACD,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,WAAW,IAAI,CAAC,GAAG,kBAAkB,CAAA;AAgD3E;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,WAAW,GAAG,kBAAkB,EACxE,GAAG,EAAE,CAAC,GACL,CAAC,SAAS,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,EAAE,CAAC,KAAK,eAAe,CAAC,CAAC,CAAC,CAAA"}
@@ -1,19 +1,21 @@
1
1
  import { scope } from '@adonisjs/lucid/orm';
2
2
  import db from '@adonisjs/lucid/services/db';
3
- /**
4
- * Scopes de query sobre el motor de autorización propio — paridad con los
5
- * whereRoles/wherePermissions del paquete extirpado, ahora sobre `authz_*`.
6
- *
7
- * Filtra holders del modelo con asignación VIGENTE (sin expirar) del rol o
8
- * permiso, en cualquier scope. Es un listado grueso (¿quién tiene X?): el
9
- * enforcement fino por scope+denies lo hace `authorization.authorize()`.
10
- *
11
- * El morph name del holder sale del decorador @MorphMap del modelo.
12
- *
13
- * Admin.query().withScopes((s) => s.whereRoles('superadmin'))
14
- * User.query().withScopes((s) => s.wherePermissions('audit:read'))
15
- */
16
- export function withAuthzScopes(Base) {
3
+ import { isClock, systemClock } from '../clock.js';
4
+ import { AuthorizationConfigError } from '../errors.js';
5
+ import { dialectOf, sqlExpiryCodec } from '../drivers/sql_expiry.js';
6
+ /** La clave primaria del modelo comparable con `holder_uuid` en cualquier motor (K3). */
7
+ function comparablePrimaryKey(query) {
8
+ // En PostgreSQL una PK `uuid` nativa contra un subquery `varchar(64)` es
9
+ // el error 42883 («operator does not exist: uuid = character varying»):
10
+ // se compara como texto. MySQL y SQLite coaccionan y la columna vale tal
11
+ // cual. Se castea la PK y no el subquery: castear `holder_uuid` a `uuid`
12
+ // reventaría con un holder de OTRO morph cuyo id no sea un UUID.
13
+ const column = `${query.model.table}.${query.model.primaryKey}`;
14
+ return dialectOf(db.connection()) === 'postgres' ? db.raw('CAST(?? AS text)', [column]) : column;
15
+ }
16
+ function mixin(Base, clock) {
17
+ /** `expires_at` vigente con el reloj del trait y el codec del motor (K2: en MySQL, cadena UTC). */
18
+ const active = (b) => b.whereNull('a.expires_at').orWhere('a.expires_at', '>', sqlExpiryCodec(db.connection()).bind(clock()));
17
19
  return class extends Base {
18
20
  static whereRoles = scope((query, ...roles) => {
19
21
  const model = query.model;
@@ -23,9 +25,9 @@ export function withAuthzScopes(Base) {
23
25
  .join('authz_roles as r', 'r.uuid', 'a.role_uuid')
24
26
  .where('a.holder_type', morph)
25
27
  .whereIn('r.slug', roles)
26
- .where((b) => b.whereNull('a.expires_at').orWhere('a.expires_at', '>', new Date()))
28
+ .where(active)
27
29
  .select('a.holder_uuid');
28
- query.whereIn(model.primaryKey, sub);
30
+ query.whereIn(comparablePrimaryKey(query), sub);
29
31
  });
30
32
  static wherePermissions = scope((query, ...permissions) => {
31
33
  const model = query.model;
@@ -36,10 +38,20 @@ export function withAuthzScopes(Base) {
36
38
  .join('authz_permissions as p', 'p.uuid', 'rp.permission_uuid')
37
39
  .where('a.holder_type', morph)
38
40
  .whereIn('p.slug', permissions)
39
- .where((b) => b.whereNull('a.expires_at').orWhere('a.expires_at', '>', new Date()))
41
+ .where(active)
40
42
  .select('a.holder_uuid');
41
- query.whereIn(model.primaryKey, sub);
43
+ query.whereIn(comparablePrimaryKey(query), sub);
42
44
  });
43
45
  };
44
46
  }
47
+ export function withAuthzScopes(arg) {
48
+ if (typeof arg === 'function')
49
+ return mixin(arg, systemClock);
50
+ const options = arg ?? {};
51
+ if (options.clock !== undefined && !isClock(options.clock)) {
52
+ throw new AuthorizationConfigError(`withAuthzScopes: 'clock' debe ser una función () => Date (llegó ${typeof options.clock})`);
53
+ }
54
+ const clock = options.clock ?? systemClock;
55
+ return (Base) => mixin(Base, clock);
56
+ }
45
57
  //# sourceMappingURL=authz_scopes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"authz_scopes.js","sourceRoot":"","sources":["../../../src/traits/authz_scopes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAC3C,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAE5C;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAAyC,IAAO;IAC7E,OAAO,KAAM,SAAQ,IAAI;QACvB,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,KAAU,EAAE,GAAG,KAAe,EAAE,EAAE;YAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;YACzB,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,cAAc,CAAA;YAC5C,MAAM,GAAG,GAAG,EAAE;iBACX,IAAI,CAAC,wBAAwB,CAAC;iBAC9B,IAAI,CAAC,kBAAkB,EAAE,QAAQ,EAAE,aAAa,CAAC;iBACjD,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC;iBAC7B,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC;iBACxB,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;iBAClF,MAAM,CAAC,eAAe,CAAC,CAAA;YAC1B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;QACtC,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC,CAAC,KAAU,EAAE,GAAG,WAAqB,EAAE,EAAE;YACvE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;YACzB,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,cAAc,CAAA;YAC5C,MAAM,GAAG,GAAG,EAAE;iBACX,IAAI,CAAC,wBAAwB,CAAC;iBAC9B,IAAI,CAAC,8BAA8B,EAAE,cAAc,EAAE,aAAa,CAAC;iBACnE,IAAI,CAAC,wBAAwB,EAAE,QAAQ,EAAE,oBAAoB,CAAC;iBAC9D,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC;iBAC7B,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC;iBAC9B,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC;iBAClF,MAAM,CAAC,eAAe,CAAC,CAAA;YAC1B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;QACtC,CAAC,CAAC,CAAA;KACH,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"authz_scopes.js","sourceRoot":"","sources":["../../../src/traits/authz_scopes.ts"],"names":[],"mappings":"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"}
@@ -68,15 +68,18 @@ export declare const hasUuid: <Model extends NormalizeConstructor<typeof BaseMod
68
68
  generateUuid(model: any): void;
69
69
  /** Devuelve un nuevo UUID v7 (para uso en pivots u otros datos que no son instancias del modelo). */
70
70
  nextUuid(): string;
71
+ all: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>[]>;
71
72
  find: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, value: any, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<null | InstanceType<T>>;
73
+ table: string;
74
+ connection?: string | undefined;
75
+ first: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<null | InstanceType<T>>;
76
+ truncate: (cascade?: boolean) => Promise<void>;
72
77
  readonly booted: boolean;
73
78
  $columnsDefinitions: Map<string, import("@adonisjs/lucid/types/model").ModelColumnOptions>;
74
79
  $relationsDefinitions: Map<string, import("@adonisjs/lucid/types/relations").RelationshipsContract>;
75
80
  $computedDefinitions: Map<string, import("@adonisjs/lucid/types/model").ComputedOptions>;
76
81
  primaryKey: string;
77
- connection?: string | undefined;
78
82
  namingStrategy: import("@adonisjs/lucid/types/model").NamingStrategyContract;
79
- table: string;
80
83
  $adapter: import("@adonisjs/lucid/types/model").AdapterContract;
81
84
  useAdapter: (adapter: import("@adonisjs/lucid/types/model").AdapterContract) => void;
82
85
  $hooks: import("@poppinss/hooks").default<any>;
@@ -134,7 +137,6 @@ export declare const hasUuid: <Model extends NormalizeConstructor<typeof BaseMod
134
137
  <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, clause: Record<string, unknown>, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<InstanceType<T>[]>;
135
138
  <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, key: string, value: any, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<InstanceType<T>[]>;
136
139
  };
137
- first: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<null | InstanceType<T>>;
138
140
  firstOrFail: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>>;
139
141
  findMany: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, value: any[], options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>[]>;
140
142
  firstOrNew: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, searchPayload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, savePayload?: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
@@ -143,9 +145,7 @@ export declare const hasUuid: <Model extends NormalizeConstructor<typeof BaseMod
143
145
  fetchOrNewUpMany: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, predicate: keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>> | (keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>)[], payload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
144
146
  fetchOrCreateMany: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, predicate: keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>> | (keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>)[], payload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
145
147
  updateOrCreateMany: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, predicate: keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>> | (keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>)[], payload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
146
- all: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>[]>;
147
148
  query: <Model_1 extends import("@adonisjs/lucid/types/model").LucidModel, Result = InstanceType<Model_1>>(this: Model_1, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model_1, Result>;
148
149
  transaction: import("@adonisjs/lucid/types/database").TransactionFn;
149
- truncate: (cascade?: boolean) => Promise<void>;
150
150
  } & Model;
151
151
  //# sourceMappingURL=has_uuid.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"has_uuid.d.ts","sourceRoot":"","sources":["../../../src/traits/has_uuid.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAGxE;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,KAAK,SAAS,oBAAoB,CAAC,OAAO,SAAS,CAAC,EAC1E,YAAY,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAMY,GAAG;IAO9B,qGAAqG;gBAClF,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kaAM0jtB,oDAAiD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SADvotB,CAAA"}
1
+ {"version":3,"file":"has_uuid.d.ts","sourceRoot":"","sources":["../../../src/traits/has_uuid.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAGxE;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,KAAK,SAAS,oBAAoB,CAAC,OAAO,SAAS,CAAC,EAC1E,YAAY,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAMY,GAAG;IAO9B,qGAAqG;gBAClF,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kaAM0jtB,oDAAiD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SADvotB,CAAA"}