@fiado/type-kit 3.71.0 → 3.72.0

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.
@@ -1,3 +1,4 @@
1
+ import { TokenValidationMode } from '../enums/TokenValidationMode';
1
2
  /**
2
3
  * Input del POST backoffice de creación de tenant (F-11 — onboarding de tenant en SureKeep).
3
4
  * Consumido por el controller `backofficeCreateTenant` del platform-rbac-business y, a futuro,
@@ -14,4 +15,5 @@ export declare class CreateTenantRequest {
14
15
  region: string;
15
16
  mfaRequired?: boolean;
16
17
  passwordMinLength?: number;
18
+ tokenValidationMode?: TokenValidationMode;
17
19
  }
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.CreateTenantRequest = void 0;
13
13
  const class_transformer_1 = require("class-transformer");
14
14
  const class_validator_1 = require("class-validator");
15
+ const TokenValidationMode_1 = require("../enums/TokenValidationMode");
15
16
  /**
16
17
  * Input del POST backoffice de creación de tenant (F-11 — onboarding de tenant en SureKeep).
17
18
  * Consumido por el controller `backofficeCreateTenant` del platform-rbac-business y, a futuro,
@@ -66,3 +67,9 @@ __decorate([
66
67
  (0, class_validator_1.Min)(8),
67
68
  __metadata("design:type", Number)
68
69
  ], CreateTenantRequest.prototype, "passwordMinLength", void 0);
70
+ __decorate([
71
+ (0, class_transformer_1.Expose)(),
72
+ (0, class_validator_1.IsOptional)(),
73
+ (0, class_validator_1.IsEnum)(TokenValidationMode_1.TokenValidationMode),
74
+ __metadata("design:type", String)
75
+ ], CreateTenantRequest.prototype, "tokenValidationMode", void 0);
@@ -6,7 +6,25 @@
6
6
  *
7
7
  * Copy-paste literal de los valores del spec (DEC-003).
8
8
  * Convención: `<category>.<resource>.<action>` (snake_case en action si multi-palabra).
9
- * Cualquier cambio aquí requiere PR + bump minor + redeploy de consumers.
9
+ *
10
+ * ⚠️ ESTE ES EL CATÁLOGO GLOBAL Y ÚNICO. Todo permiso del sistema vive acá. Los tenants
11
+ * NO inventan permisos: cada `tenantType` arma su lista (techo) ELIGIENDO de este catálogo
12
+ * (`TenantTypePermissionCatalog_GT` en platform-rbac-business, DEC-062), y cada tenant arma
13
+ * sus roles combinando esos permisos. El vocabulario es global; lo que varía por tenant es
14
+ * QUÉ permisos usa, no CUÁLES existen.
15
+ *
16
+ * ⚠️⚠️ AL AGREGAR / QUITAR / RENOMBRAR UN PERMISO — PROCEDIMIENTO OBLIGATORIO:
17
+ * 1. Agregar el valor a ESTE enum.
18
+ * 2. Agregarlo TAMBIÉN al FINAL de `PERMISSION_BIT_ORDER` (abajo) — append-only, NUNCA en
19
+ * el medio ni reordenando: ese array define el bit de cada permiso en el token (bitset).
20
+ * Reordenar/insertar en medio desalinea TODOS los tokens ya emitidos (escalada/pérdida
21
+ * de permisos silenciosa). Un permiso deprecado CONSERVA su posición (no se borra del array).
22
+ * 3. Recién entonces un `tenantType` puede incluirlo en su lista. Un permiso que NO esté en
23
+ * este enum + bit-order NO tiene bit → no viaja en el token (el gateway-adapter no lo ve).
24
+ * 4. `PERMS_VERSION` (hash del orden) cambia solo → bump minor del type-kit + redeploy de
25
+ * consumers (jwt-inyector-trigger, gateway-adapter, platform-rbac-business). Tokens viejos
26
+ * caen al fallback (resolver DDB) hasta refrescar — by-design, no rompe.
27
+ * El test `permissionBits.test.ts` falla si el enum y `PERMISSION_BIT_ORDER` se desincronizan.
10
28
  *
11
29
  * Coexiste con módulo `rbac/` oficial cuando yhonhansen publique componente 01 — TD-RBAC-002.
12
30
  */
@@ -107,6 +125,11 @@ export declare enum Permission {
107
125
  * Índice de cada permiso = su posición de bit. NUNCA reordenar ni borrar:
108
126
  * deprecados CONSERVAN su posición; los nuevos van SIEMPRE al final.
109
127
  * Derivado explícitamente (no Object.values, frágil ante edición del enum).
128
+ *
129
+ * ⚠️ Si agregás un permiso al enum `Permission` (arriba), agregalo TAMBIÉN acá, AL FINAL.
130
+ * Ver el procedimiento completo en el JSDoc del enum `Permission`. El test
131
+ * `permissionBits.test.ts` rompe si esto y el enum no coinciden, y el snapshot del orden
132
+ * completo rompe si reordenás (guard anti-desalineamiento de tokens emitidos).
110
133
  */
111
134
  export declare const PERMISSION_BIT_ORDER: readonly Permission[];
112
135
  /** Versión del catálogo = hash del orden. Cambia solo si el orden cambia. */
@@ -11,7 +11,25 @@ exports.bitsToPermissions = bitsToPermissions;
11
11
  *
12
12
  * Copy-paste literal de los valores del spec (DEC-003).
13
13
  * Convención: `<category>.<resource>.<action>` (snake_case en action si multi-palabra).
14
- * Cualquier cambio aquí requiere PR + bump minor + redeploy de consumers.
14
+ *
15
+ * ⚠️ ESTE ES EL CATÁLOGO GLOBAL Y ÚNICO. Todo permiso del sistema vive acá. Los tenants
16
+ * NO inventan permisos: cada `tenantType` arma su lista (techo) ELIGIENDO de este catálogo
17
+ * (`TenantTypePermissionCatalog_GT` en platform-rbac-business, DEC-062), y cada tenant arma
18
+ * sus roles combinando esos permisos. El vocabulario es global; lo que varía por tenant es
19
+ * QUÉ permisos usa, no CUÁLES existen.
20
+ *
21
+ * ⚠️⚠️ AL AGREGAR / QUITAR / RENOMBRAR UN PERMISO — PROCEDIMIENTO OBLIGATORIO:
22
+ * 1. Agregar el valor a ESTE enum.
23
+ * 2. Agregarlo TAMBIÉN al FINAL de `PERMISSION_BIT_ORDER` (abajo) — append-only, NUNCA en
24
+ * el medio ni reordenando: ese array define el bit de cada permiso en el token (bitset).
25
+ * Reordenar/insertar en medio desalinea TODOS los tokens ya emitidos (escalada/pérdida
26
+ * de permisos silenciosa). Un permiso deprecado CONSERVA su posición (no se borra del array).
27
+ * 3. Recién entonces un `tenantType` puede incluirlo en su lista. Un permiso que NO esté en
28
+ * este enum + bit-order NO tiene bit → no viaja en el token (el gateway-adapter no lo ve).
29
+ * 4. `PERMS_VERSION` (hash del orden) cambia solo → bump minor del type-kit + redeploy de
30
+ * consumers (jwt-inyector-trigger, gateway-adapter, platform-rbac-business). Tokens viejos
31
+ * caen al fallback (resolver DDB) hasta refrescar — by-design, no rompe.
32
+ * El test `permissionBits.test.ts` falla si el enum y `PERMISSION_BIT_ORDER` se desincronizan.
15
33
  *
16
34
  * Coexiste con módulo `rbac/` oficial cuando yhonhansen publique componente 01 — TD-RBAC-002.
17
35
  */
@@ -142,6 +160,11 @@ var Permission;
142
160
  * Índice de cada permiso = su posición de bit. NUNCA reordenar ni borrar:
143
161
  * deprecados CONSERVAN su posición; los nuevos van SIEMPRE al final.
144
162
  * Derivado explícitamente (no Object.values, frágil ante edición del enum).
163
+ *
164
+ * ⚠️ Si agregás un permiso al enum `Permission` (arriba), agregalo TAMBIÉN acá, AL FINAL.
165
+ * Ver el procedimiento completo en el JSDoc del enum `Permission`. El test
166
+ * `permissionBits.test.ts` rompe si esto y el enum no coinciden, y el snapshot del orden
167
+ * completo rompe si reordenás (guard anti-desalineamiento de tokens emitidos).
145
168
  */
146
169
  exports.PERMISSION_BIT_ORDER = [
147
170
  Permission.RBAC_CATALOG_MANAGE,
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Modo de validación de tokens por tenant (DEC-RBAC-002 del rbac-authorizer-trigger).
3
+ * Persistido como atributo no-key en PlatformTenantConfig_GT. Los valores string SON el
4
+ * contrato: el authorizer los espeja con un tipo local (no depende de type-kit, DT-7).
5
+ * - OFFLINE: solo firma (JWKS) + permsEpoch. Default. No pega a Cognito.
6
+ * - ONLINE_PREFERRED: AdminGetUser; negativo definitivo → Deny; fallo de infra → cae a offline.
7
+ * - ONLINE_STRICT: AdminGetUser; negativo definitivo O fallo de infra → Deny (fail-closed, regulado).
8
+ */
9
+ export declare enum TokenValidationMode {
10
+ OFFLINE = "offline",
11
+ ONLINE_PREFERRED = "online_preferred",
12
+ ONLINE_STRICT = "online_strict"
13
+ }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TokenValidationMode = void 0;
4
+ /**
5
+ * Modo de validación de tokens por tenant (DEC-RBAC-002 del rbac-authorizer-trigger).
6
+ * Persistido como atributo no-key en PlatformTenantConfig_GT. Los valores string SON el
7
+ * contrato: el authorizer los espeja con un tipo local (no depende de type-kit, DT-7).
8
+ * - OFFLINE: solo firma (JWKS) + permsEpoch. Default. No pega a Cognito.
9
+ * - ONLINE_PREFERRED: AdminGetUser; negativo definitivo → Deny; fallo de infra → cae a offline.
10
+ * - ONLINE_STRICT: AdminGetUser; negativo definitivo O fallo de infra → Deny (fail-closed, regulado).
11
+ */
12
+ var TokenValidationMode;
13
+ (function (TokenValidationMode) {
14
+ TokenValidationMode["OFFLINE"] = "offline";
15
+ TokenValidationMode["ONLINE_PREFERRED"] = "online_preferred";
16
+ TokenValidationMode["ONLINE_STRICT"] = "online_strict";
17
+ })(TokenValidationMode || (exports.TokenValidationMode = TokenValidationMode = {}));
@@ -6,6 +6,7 @@ export type { RoleAssignmentInfo } from './dtos/RoleAssignmentInfo';
6
6
  export type { PermissionMeta } from './dtos/PermissionMeta';
7
7
  export type { EffectivePermissionsResponse } from './dtos/EffectivePermissionsResponse';
8
8
  export * from './enums/MfaMethodEnum';
9
+ export * from './enums/TokenValidationMode';
9
10
  export * from './enums/ChallengeNameEnum';
10
11
  export * from './auth/DefineNextChallengeRequest';
11
12
  export * from './auth/DefineNextChallengeResponse';
@@ -37,6 +37,7 @@ Object.defineProperty(exports, "PermissionCategory", { enumerable: true, get: fu
37
37
  // Fase 1 — Custom Auth Challenge (Email OTP + TOTP) + MFA self-service.
38
38
  // Class values (no type-only) — los DTOs llevan decoradores class-validator y se hidratan con plainToInstance en runtime.
39
39
  __exportStar(require("./enums/MfaMethodEnum"), exports);
40
+ __exportStar(require("./enums/TokenValidationMode"), exports);
40
41
  __exportStar(require("./enums/ChallengeNameEnum"), exports);
41
42
  __exportStar(require("./auth/DefineNextChallengeRequest"), exports);
42
43
  __exportStar(require("./auth/DefineNextChallengeResponse"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.71.0",
3
+ "version": "3.72.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -1,5 +1,6 @@
1
1
  import { Expose } from 'class-transformer';
2
- import { IsBoolean, IsEmail, IsInt, IsOptional, IsString, Matches, Min } from 'class-validator';
2
+ import { IsBoolean, IsEmail, IsEnum, IsInt, IsOptional, IsString, Matches, Min } from 'class-validator';
3
+ import { TokenValidationMode } from '../enums/TokenValidationMode';
3
4
 
4
5
  /**
5
6
  * Input del POST backoffice de creación de tenant (F-11 — onboarding de tenant en SureKeep).
@@ -17,4 +18,5 @@ export class CreateTenantRequest {
17
18
  @Expose() @IsString() region!: string;
18
19
  @Expose() @IsOptional() @IsBoolean() mfaRequired?: boolean;
19
20
  @Expose() @IsOptional() @IsInt() @Min(8) passwordMinLength?: number;
21
+ @Expose() @IsOptional() @IsEnum(TokenValidationMode) tokenValidationMode?: TokenValidationMode;
20
22
  }
@@ -6,7 +6,25 @@
6
6
  *
7
7
  * Copy-paste literal de los valores del spec (DEC-003).
8
8
  * Convención: `<category>.<resource>.<action>` (snake_case en action si multi-palabra).
9
- * Cualquier cambio aquí requiere PR + bump minor + redeploy de consumers.
9
+ *
10
+ * ⚠️ ESTE ES EL CATÁLOGO GLOBAL Y ÚNICO. Todo permiso del sistema vive acá. Los tenants
11
+ * NO inventan permisos: cada `tenantType` arma su lista (techo) ELIGIENDO de este catálogo
12
+ * (`TenantTypePermissionCatalog_GT` en platform-rbac-business, DEC-062), y cada tenant arma
13
+ * sus roles combinando esos permisos. El vocabulario es global; lo que varía por tenant es
14
+ * QUÉ permisos usa, no CUÁLES existen.
15
+ *
16
+ * ⚠️⚠️ AL AGREGAR / QUITAR / RENOMBRAR UN PERMISO — PROCEDIMIENTO OBLIGATORIO:
17
+ * 1. Agregar el valor a ESTE enum.
18
+ * 2. Agregarlo TAMBIÉN al FINAL de `PERMISSION_BIT_ORDER` (abajo) — append-only, NUNCA en
19
+ * el medio ni reordenando: ese array define el bit de cada permiso en el token (bitset).
20
+ * Reordenar/insertar en medio desalinea TODOS los tokens ya emitidos (escalada/pérdida
21
+ * de permisos silenciosa). Un permiso deprecado CONSERVA su posición (no se borra del array).
22
+ * 3. Recién entonces un `tenantType` puede incluirlo en su lista. Un permiso que NO esté en
23
+ * este enum + bit-order NO tiene bit → no viaja en el token (el gateway-adapter no lo ve).
24
+ * 4. `PERMS_VERSION` (hash del orden) cambia solo → bump minor del type-kit + redeploy de
25
+ * consumers (jwt-inyector-trigger, gateway-adapter, platform-rbac-business). Tokens viejos
26
+ * caen al fallback (resolver DDB) hasta refrescar — by-design, no rompe.
27
+ * El test `permissionBits.test.ts` falla si el enum y `PERMISSION_BIT_ORDER` se desincronizan.
10
28
  *
11
29
  * Coexiste con módulo `rbac/` oficial cuando yhonhansen publique componente 01 — TD-RBAC-002.
12
30
  */
@@ -143,6 +161,11 @@ export enum Permission {
143
161
  * Índice de cada permiso = su posición de bit. NUNCA reordenar ni borrar:
144
162
  * deprecados CONSERVAN su posición; los nuevos van SIEMPRE al final.
145
163
  * Derivado explícitamente (no Object.values, frágil ante edición del enum).
164
+ *
165
+ * ⚠️ Si agregás un permiso al enum `Permission` (arriba), agregalo TAMBIÉN acá, AL FINAL.
166
+ * Ver el procedimiento completo en el JSDoc del enum `Permission`. El test
167
+ * `permissionBits.test.ts` rompe si esto y el enum no coinciden, y el snapshot del orden
168
+ * completo rompe si reordenás (guard anti-desalineamiento de tokens emitidos).
146
169
  */
147
170
  export const PERMISSION_BIT_ORDER: readonly Permission[] = [
148
171
  Permission.RBAC_CATALOG_MANAGE,
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Modo de validación de tokens por tenant (DEC-RBAC-002 del rbac-authorizer-trigger).
3
+ * Persistido como atributo no-key en PlatformTenantConfig_GT. Los valores string SON el
4
+ * contrato: el authorizer los espeja con un tipo local (no depende de type-kit, DT-7).
5
+ * - OFFLINE: solo firma (JWKS) + permsEpoch. Default. No pega a Cognito.
6
+ * - ONLINE_PREFERRED: AdminGetUser; negativo definitivo → Deny; fallo de infra → cae a offline.
7
+ * - ONLINE_STRICT: AdminGetUser; negativo definitivo O fallo de infra → Deny (fail-closed, regulado).
8
+ */
9
+ export enum TokenValidationMode {
10
+ OFFLINE = 'offline',
11
+ ONLINE_PREFERRED = 'online_preferred',
12
+ ONLINE_STRICT = 'online_strict',
13
+ }
@@ -26,6 +26,7 @@ export type { EffectivePermissionsResponse } from './dtos/EffectivePermissionsRe
26
26
  // Fase 1 — Custom Auth Challenge (Email OTP + TOTP) + MFA self-service.
27
27
  // Class values (no type-only) — los DTOs llevan decoradores class-validator y se hidratan con plainToInstance en runtime.
28
28
  export * from './enums/MfaMethodEnum';
29
+ export * from './enums/TokenValidationMode';
29
30
  export * from './enums/ChallengeNameEnum';
30
31
  export * from './auth/DefineNextChallengeRequest';
31
32
  export * from './auth/DefineNextChallengeResponse';