@fiado/type-kit 3.11.0 → 3.12.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.
@@ -15,6 +15,12 @@ export declare class AuthorizeBenefitsMarketplaceTransactionRequest {
15
15
  * Reusa entradas existentes en `ProductCatalog_GT` del procesador
16
16
  * (`MEX_TOPUP`, `MEX_SERVICE_PAYMENT`, …). No se agregan entradas nuevas
17
17
  * en Fase 2 (ver doc §10).
18
+ *
19
+ * El factory dinámico `TransactionProcessorFactory.getMarketplaceInstance`
20
+ * deriva el token del binding desde aquí (`MEX_<X>` →
21
+ * `BenefitsMarketplace<X>TransactionService`). La regex impone el contrato
22
+ * y permite que el factory falle con 400 en lugar de 500 si llega algo
23
+ * fuera de la convención.
18
24
  */
19
25
  productCatalogId: string;
20
26
  /**
@@ -28,14 +34,32 @@ export declare class AuthorizeBenefitsMarketplaceTransactionRequest {
28
34
  * debe generar `transactionNumber` — por eso este DTO no lo expone.
29
35
  */
30
36
  idempotencyKey: string;
37
+ /**
38
+ * Monto en unidad mayor de la moneda (no centavos). Como mucho 2 decimales.
39
+ * El `Max` cap es defensivo — atrapa errores obvios (montos absurdos por
40
+ * bugs de UI) sin restringir casos legítimos. Ajustar si la operatoria
41
+ * requiere techos mayores.
42
+ */
31
43
  amount: number;
32
44
  /** ISO numeric (3 chars). Ej: "484" (MXN), "840" (USD). */
33
45
  currencyId: string;
34
46
  benefitId: string;
47
+ /**
48
+ * `leafId = base64url("<moduleName>::<idServicio>")`. Convención
49
+ * cross-componente del Centro (ver
50
+ * `docs/favorites/05b-favoritos-ligados-a-producto.md`). La regex
51
+ * enforce el charset base64url sin tener que decodificar acá.
52
+ */
35
53
  leafId: string;
36
54
  productId: string;
37
55
  reference: string;
38
- /** Decide a qué conector apuntar dentro del marketplace. */
56
+ /**
57
+ * Decide a qué conector apuntar dentro del marketplace. Va concatenado
58
+ * a la URL `POST /pay/{moduleName}` del marketplace privado. La regex
59
+ * restringe a charset seguro (kebab-case minúsculas), previene
60
+ * inyecciones de path y matchea la convención de naming de los
61
+ * lambdas Fiado.
62
+ */
39
63
  moduleName: string;
40
64
  /** Inputs dinámicos del leaf — opcionales según el servicio. */
41
65
  inputs?: Record<string, string | number | boolean>;
@@ -30,6 +30,9 @@ __decorate([
30
30
  (0, class_validator_1.IsString)(),
31
31
  (0, class_validator_1.IsNotEmpty)(),
32
32
  (0, class_validator_1.MaxLength)(64),
33
+ (0, class_validator_1.Matches)(/^MEX_[A-Z][A-Z_]*$/, {
34
+ message: "productCatalogId debe seguir el formato MEX_<UPPER_SNAKE>",
35
+ }),
33
36
  __metadata("design:type", String)
34
37
  ], AuthorizeBenefitsMarketplaceTransactionRequest.prototype, "productCatalogId", void 0);
35
38
  __decorate([
@@ -39,13 +42,16 @@ __decorate([
39
42
  __metadata("design:type", String)
40
43
  ], AuthorizeBenefitsMarketplaceTransactionRequest.prototype, "idempotencyKey", void 0);
41
44
  __decorate([
42
- (0, class_validator_1.IsNumber)(),
45
+ (0, class_validator_1.IsNumber)({ maxDecimalPlaces: 2 }),
43
46
  (0, class_validator_1.IsPositive)(),
47
+ (0, class_validator_1.Max)(1000000),
44
48
  __metadata("design:type", Number)
45
49
  ], AuthorizeBenefitsMarketplaceTransactionRequest.prototype, "amount", void 0);
46
50
  __decorate([
47
51
  (0, class_validator_1.IsString)(),
48
- (0, class_validator_1.Length)(3, 3),
52
+ (0, class_validator_1.Matches)(/^\d{3}$/, {
53
+ message: "currencyId debe ser ISO numérico de 3 dígitos",
54
+ }),
49
55
  __metadata("design:type", String)
50
56
  ], AuthorizeBenefitsMarketplaceTransactionRequest.prototype, "currencyId", void 0);
51
57
  __decorate([
@@ -58,6 +64,9 @@ __decorate([
58
64
  (0, class_validator_1.IsString)(),
59
65
  (0, class_validator_1.IsNotEmpty)(),
60
66
  (0, class_validator_1.MaxLength)(256),
67
+ (0, class_validator_1.Matches)(/^[A-Za-z0-9_-]+$/, {
68
+ message: "leafId debe estar codificado en base64url (charset A-Za-z0-9_-)",
69
+ }),
61
70
  __metadata("design:type", String)
62
71
  ], AuthorizeBenefitsMarketplaceTransactionRequest.prototype, "leafId", void 0);
63
72
  __decorate([
@@ -76,6 +85,9 @@ __decorate([
76
85
  (0, class_validator_1.IsString)(),
77
86
  (0, class_validator_1.IsNotEmpty)(),
78
87
  (0, class_validator_1.MaxLength)(128),
88
+ (0, class_validator_1.Matches)(/^[a-z][a-z0-9-]*$/, {
89
+ message: "moduleName debe ser kebab-case minúsculas",
90
+ }),
79
91
  __metadata("design:type", String)
80
92
  ], AuthorizeBenefitsMarketplaceTransactionRequest.prototype, "moduleName", void 0);
81
93
  __decorate([
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fiado/type-kit",
3
- "version": "3.11.0",
3
+ "version": "3.12.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "types": "bin/index.d.ts",
@@ -7,7 +7,8 @@ import {
7
7
  IsOptional,
8
8
  IsPositive,
9
9
  IsString,
10
- Length,
10
+ Matches,
11
+ Max,
11
12
  MaxLength,
12
13
  } from "class-validator";
13
14
 
@@ -28,10 +29,19 @@ export class AuthorizeBenefitsMarketplaceTransactionRequest {
28
29
  * Reusa entradas existentes en `ProductCatalog_GT` del procesador
29
30
  * (`MEX_TOPUP`, `MEX_SERVICE_PAYMENT`, …). No se agregan entradas nuevas
30
31
  * en Fase 2 (ver doc §10).
32
+ *
33
+ * El factory dinámico `TransactionProcessorFactory.getMarketplaceInstance`
34
+ * deriva el token del binding desde aquí (`MEX_<X>` →
35
+ * `BenefitsMarketplace<X>TransactionService`). La regex impone el contrato
36
+ * y permite que el factory falle con 400 en lugar de 500 si llega algo
37
+ * fuera de la convención.
31
38
  */
32
39
  @IsString()
33
40
  @IsNotEmpty()
34
41
  @MaxLength(64)
42
+ @Matches(/^MEX_[A-Z][A-Z_]*$/, {
43
+ message: "productCatalogId debe seguir el formato MEX_<UPPER_SNAKE>",
44
+ })
35
45
  productCatalogId!: string;
36
46
 
37
47
  /**
@@ -49,13 +59,22 @@ export class AuthorizeBenefitsMarketplaceTransactionRequest {
49
59
  @MaxLength(64)
50
60
  idempotencyKey!: string;
51
61
 
52
- @IsNumber()
62
+ /**
63
+ * Monto en unidad mayor de la moneda (no centavos). Como mucho 2 decimales.
64
+ * El `Max` cap es defensivo — atrapa errores obvios (montos absurdos por
65
+ * bugs de UI) sin restringir casos legítimos. Ajustar si la operatoria
66
+ * requiere techos mayores.
67
+ */
68
+ @IsNumber({maxDecimalPlaces: 2})
53
69
  @IsPositive()
70
+ @Max(1_000_000)
54
71
  amount!: number;
55
72
 
56
73
  /** ISO numeric (3 chars). Ej: "484" (MXN), "840" (USD). */
57
74
  @IsString()
58
- @Length(3, 3)
75
+ @Matches(/^\d{3}$/, {
76
+ message: "currencyId debe ser ISO numérico de 3 dígitos",
77
+ })
59
78
  currencyId!: string;
60
79
 
61
80
  // Campos del Centro de Beneficios — first-class, no opcionales
@@ -65,9 +84,18 @@ export class AuthorizeBenefitsMarketplaceTransactionRequest {
65
84
  @MaxLength(64)
66
85
  benefitId!: string;
67
86
 
87
+ /**
88
+ * `leafId = base64url("<moduleName>::<idServicio>")`. Convención
89
+ * cross-componente del Centro (ver
90
+ * `docs/favorites/05b-favoritos-ligados-a-producto.md`). La regex
91
+ * enforce el charset base64url sin tener que decodificar acá.
92
+ */
68
93
  @IsString()
69
94
  @IsNotEmpty()
70
95
  @MaxLength(256)
96
+ @Matches(/^[A-Za-z0-9_-]+$/, {
97
+ message: "leafId debe estar codificado en base64url (charset A-Za-z0-9_-)",
98
+ })
71
99
  leafId!: string;
72
100
 
73
101
  @IsString()
@@ -80,10 +108,19 @@ export class AuthorizeBenefitsMarketplaceTransactionRequest {
80
108
  @MaxLength(128)
81
109
  reference!: string;
82
110
 
83
- /** Decide a qué conector apuntar dentro del marketplace. */
111
+ /**
112
+ * Decide a qué conector apuntar dentro del marketplace. Va concatenado
113
+ * a la URL `POST /pay/{moduleName}` del marketplace privado. La regex
114
+ * restringe a charset seguro (kebab-case minúsculas), previene
115
+ * inyecciones de path y matchea la convención de naming de los
116
+ * lambdas Fiado.
117
+ */
84
118
  @IsString()
85
119
  @IsNotEmpty()
86
120
  @MaxLength(128)
121
+ @Matches(/^[a-z][a-z0-9-]*$/, {
122
+ message: "moduleName debe ser kebab-case minúsculas",
123
+ })
87
124
  moduleName!: string;
88
125
 
89
126
  /** Inputs dinámicos del leaf — opcionales según el servicio. */