@fiado/type-kit 3.57.0 → 3.58.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.
- package/_test_/unit/cognitoBackofficeConnector/dtos/CreateUserRequest.test.ts +53 -0
- package/bin/cognitoBackofficeConnector/dtos/CreateUserRequest.js +2 -1
- package/bin/cognitoBackofficeConnector/dtos/PoolConfigResponse.d.ts +20 -0
- package/bin/cognitoBackofficeConnector/dtos/PoolConfigResponse.js +11 -0
- package/bin/cognitoBackofficeConnector/dtos/PoolsListResponse.d.ts +4 -0
- package/bin/cognitoBackofficeConnector/dtos/PoolsListResponse.js +6 -0
- package/bin/rbac/enums/PoolKind.d.ts +16 -0
- package/bin/rbac/enums/PoolKind.js +20 -0
- package/bin/rbac/index.d.ts +1 -0
- package/bin/rbac/index.js +17 -0
- package/bin/remittance/dtos/RemittanceConfirmRequest.d.ts +41 -0
- package/bin/remittance/dtos/RemittanceSendPreviewResponse.d.ts +15 -0
- package/bin/remittance/dtos/index.d.ts +1 -0
- package/bin/remittance/dtos/index.js +1 -0
- package/package.json +1 -1
- package/src/cognitoBackofficeConnector/dtos/CreateUserRequest.ts +2 -2
- package/src/remittance/dtos/RemittanceConfirmRequest.ts +42 -0
- package/src/remittance/dtos/RemittanceSendPreviewResponse.ts +17 -0
- package/src/remittance/dtos/index.ts +1 -0
- package/bin/benefitCenter/dtos/BackofficeLeafOverrideUpsertRequest.d.ts +0 -22
- package/bin/benefitCenter/dtos/BackofficeLeafOverrideUpsertRequest.js +0 -91
- package/bin/benefitCenter/dtos/FieldOverrideRequest.d.ts +0 -19
- package/bin/benefitCenter/dtos/FieldOverrideRequest.js +0 -80
- package/bin/benefitCenter/dtos/InputSchemaOverrideRequest.d.ts +0 -9
- package/bin/benefitCenter/dtos/InputSchemaOverrideRequest.js +0 -29
- package/bin/benefitCenter/enums/LeafOverrideStatusEnum.d.ts +0 -10
- package/bin/benefitCenter/enums/LeafOverrideStatusEnum.js +0 -14
- package/bin/cognitoConnector/dtos/SignUpBackofficeRequest.d.ts +0 -13
- package/bin/cognitoConnector/dtos/SignUpBackofficeRequest.js +0 -71
- package/bin/comission-business/dtos/GenerateReportRequest.d.ts +0 -10
- package/bin/comission-business/dtos/GenerateReportResponse.d.ts +0 -6
- package/bin/comission-business/dtos/GenerateReportResponse.js +0 -2
- package/bin/comission-business/enums/PaymentStatusEnum.d.ts +0 -5
- package/bin/comission-business/enums/PaymentStatusEnum.js +0 -9
- package/bin/credit/dtos/CreditBannerStateResponse.d.ts +0 -10
- package/bin/credit/dtos/CreditBannerStateResponse.js +0 -6
- package/bin/credit/dtos/CreditDetailResponse.d.ts +0 -23
- package/bin/credit/dtos/CreditDetailResponse.js +0 -6
- package/bin/credit/dtos/CreditEligibilityResponse.d.ts +0 -9
- package/bin/credit/dtos/CreditEligibilityResponse.js +0 -6
- package/bin/credit/dtos/CreditMovementResponse.d.ts +0 -20
- package/bin/credit/dtos/CreditMovementResponse.js +0 -9
- package/bin/credit/dtos/CreditRequestCreate.d.ts +0 -4
- package/bin/credit/dtos/CreditRequestCreate.js +0 -26
- package/bin/credit/dtos/CreditRequestResponse.d.ts +0 -7
- package/bin/credit/dtos/CreditRequestResponse.js +0 -6
- package/bin/credit/dtos/CreditScheduleResponse.d.ts +0 -18
- package/bin/credit/dtos/CreditScheduleResponse.js +0 -9
- package/bin/credit/dtos/CreditStatementResponse.d.ts +0 -11
- package/bin/credit/dtos/CreditStatementResponse.js +0 -9
- package/bin/credit/dtos/EarlyPaymentRequest.d.ts +0 -7
- package/bin/credit/dtos/EarlyPaymentRequest.js +0 -37
- package/bin/credit/dtos/EarlyPaymentResponse.d.ts +0 -11
- package/bin/credit/dtos/EarlyPaymentResponse.js +0 -6
- package/bin/credit/dtos/internal/CreditBalanceRequest.d.ts +0 -3
- package/bin/credit/dtos/internal/CreditBalanceRequest.js +0 -21
- package/bin/credit/dtos/internal/CreditCollectionRequest.d.ts +0 -11
- package/bin/credit/dtos/internal/CreditCollectionRequest.js +0 -59
- package/bin/credit/dtos/internal/CreditCollectionResponse.d.ts +0 -12
- package/bin/credit/dtos/internal/CreditCollectionResponse.js +0 -6
- package/bin/credit/dtos/internal/CreditDisbursementRequest.d.ts +0 -7
- package/bin/credit/dtos/internal/CreditDisbursementRequest.js +0 -43
- package/bin/credit/dtos/internal/CreditDisbursementResponse.d.ts +0 -8
- package/bin/credit/dtos/internal/CreditDisbursementResponse.js +0 -6
- package/bin/credit/dtos/internal/CreditProfileRequest.d.ts +0 -3
- package/bin/credit/dtos/internal/CreditProfileRequest.js +0 -23
- package/bin/credit/dtos/internal/CreditReversalRequest.d.ts +0 -5
- package/bin/credit/dtos/internal/CreditReversalRequest.js +0 -31
- package/bin/credit/dtos/internal/CreditReversalResponse.d.ts +0 -7
- package/bin/credit/dtos/internal/CreditReversalResponse.js +0 -6
- package/bin/credit/dtos/internal/CreditTransferLoancoRequest.d.ts +0 -8
- package/bin/credit/dtos/internal/CreditTransferLoancoRequest.js +0 -46
- package/bin/credit/dtos/internal/CreditTransferLoancoResponse.d.ts +0 -8
- package/bin/credit/dtos/internal/CreditTransferLoancoResponse.js +0 -6
- package/bin/credit/dtos/internal/DocumentSignRequest.d.ts +0 -3
- package/bin/credit/dtos/internal/DocumentSignRequest.js +0 -21
- package/bin/credit/dtos/internal/LienApplyRequest.d.ts +0 -7
- package/bin/credit/dtos/internal/LienApplyRequest.js +0 -45
- package/bin/credit/enums/CollectionFrequencyEnum.d.ts +0 -5
- package/bin/credit/enums/CollectionFrequencyEnum.js +0 -9
- package/bin/credit/enums/CreditOperationEnum.d.ts +0 -11
- package/bin/credit/enums/CreditOperationEnum.js +0 -15
- package/bin/credit/enums/CreditStatusEnum.d.ts +0 -12
- package/bin/credit/enums/CreditStatusEnum.js +0 -16
- package/bin/credit/enums/DelinquencyLevelEnum.d.ts +0 -9
- package/bin/credit/enums/DelinquencyLevelEnum.js +0 -13
- package/bin/credit/enums/DocumentTypeEnum.d.ts +0 -8
- package/bin/credit/enums/DocumentTypeEnum.js +0 -12
- package/bin/credit/enums/OfferStatusEnum.d.ts +0 -8
- package/bin/credit/enums/OfferStatusEnum.js +0 -12
- package/bin/credit/enums/PaymentTypeEnum.d.ts +0 -9
- package/bin/credit/enums/PaymentTypeEnum.js +0 -13
- package/bin/credit/enums/ReconciliationStatusEnum.d.ts +0 -6
- package/bin/credit/enums/ReconciliationStatusEnum.js +0 -10
- package/bin/credit/enums/TransferStatusEnum.d.ts +0 -8
- package/bin/credit/enums/TransferStatusEnum.js +0 -12
- package/docs/superpowers/plans/2026-05-22-http-client-inversify-v8.md +0 -243
- package/docs/superpowers/specs/2026-05-22-inversify-v8-migration-design.md +0 -191
- /package/bin/{comission-business/dtos/GenerateReportRequest.js → remittance/dtos/RemittanceConfirmRequest.js} +0 -0
|
@@ -1,243 +0,0 @@
|
|
|
1
|
-
# http-client → inversify v8 (2.0.0) Implementation Plan
|
|
2
|
-
|
|
3
|
-
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
|
4
|
-
|
|
5
|
-
**Goal:** Migrar `@fiado/http-client` a inversify 8 (última) y dejarlo listo como major **2.0.0**, con la línea v6 (1.x) como rama de mantenimiento. **No se publica** hasta terminar los cambios y tener visto bueno.
|
|
6
|
-
|
|
7
|
-
**Architecture:** http-client solo usa `@injectable()` sobre `AxiosHttpRequest` (sin inyección por constructor). El cambio es: (1) introducir un smoke test que prueba que la clase se resuelve desde un `Container`, como guardia de regresión; (2) subir inversify a 8 moviéndola a `peerDependency` + `devDependency`; (3) dejar 2.0.0 listo (publicación diferida). Es la lib hoja (sin deps `@fiado`), por eso va primero.
|
|
8
|
-
|
|
9
|
-
**Tech Stack:** TypeScript 5.4, inversify 8.x (^8.1.0), reflect-metadata 0.2.2, axios 1.8, jest + ts-jest (nuevo).
|
|
10
|
-
|
|
11
|
-
**Nota de versión:** se va de v6 directo a **v8** (la última); se salta v7. Confirmado contra las guías oficiales ([v6](https://inversify.io/docs/guides/migrating-from-v6/), [v7](https://inversify.io/docs/guides/migrating-from-v7/)): http-client solo usa `@injectable()`, que **no cambió**.
|
|
12
|
-
|
|
13
|
-
**Constraint ESM:** inversify 8 es **ESM-only**; CommonJS lo consume vía `require(esm)` solo en **Node ≥20**. El build de la lib (tsconfig commonjs) no cambia, pero el harness de jest debe correr en Node 20+ y puede requerir ajuste si jest no resuelve el paquete ESM (ver Task 3 Step 3).
|
|
14
|
-
|
|
15
|
-
**Repo:** `/Users/yhon/fsrc/fiado-http-client` (rama base: `develop`, hoy en 1.0.10, limpia tras pull).
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## Estructura de archivos
|
|
20
|
-
|
|
21
|
-
- `fiado-http-client/jest.config.js` — **crear**: config jest con preset ts-jest.
|
|
22
|
-
- `fiado-http-client/test/AxiosHttpRequest.di.test.ts` — **crear**: smoke test de resolución por container.
|
|
23
|
-
- `fiado-http-client/package.json` — **modificar**: scripts.test, devDependencies (jest, ts-jest, @types/jest, inversify, reflect-metadata), peerDependencies (inversify, reflect-metadata), quitar inversify de dependencies, bump version.
|
|
24
|
-
- `fiado-http-client/src/AxiosHttpRequest.ts` — **modificar solo si v8 lo exige** (no se espera cambio: `@injectable()` sigue igual).
|
|
25
|
-
- `fiado-http-client/tsconfig.json` — **modificar**: excluir `test/` del build de producción.
|
|
26
|
-
|
|
27
|
-
---
|
|
28
|
-
|
|
29
|
-
## Task 1: Montar harness de tests + smoke test (baseline en inversify 6)
|
|
30
|
-
|
|
31
|
-
**Files:**
|
|
32
|
-
- Modify: `fiado-http-client/package.json`
|
|
33
|
-
- Create: `fiado-http-client/jest.config.js`
|
|
34
|
-
- Create: `fiado-http-client/test/AxiosHttpRequest.di.test.ts`
|
|
35
|
-
- Modify: `fiado-http-client/tsconfig.json`
|
|
36
|
-
|
|
37
|
-
- [ ] **Step 1: Instalar dependencias de test**
|
|
38
|
-
|
|
39
|
-
Run:
|
|
40
|
-
```bash
|
|
41
|
-
cd /Users/yhon/fsrc/fiado-http-client
|
|
42
|
-
npm install -D jest@^29 ts-jest@^29 @types/jest@^29
|
|
43
|
-
```
|
|
44
|
-
Expected: se agregan a `devDependencies`, sin errores de peer deps.
|
|
45
|
-
|
|
46
|
-
- [ ] **Step 2: Crear `jest.config.js`**
|
|
47
|
-
|
|
48
|
-
```js
|
|
49
|
-
/** @type {import('ts-jest').JestConfigWithTsJest} */
|
|
50
|
-
module.exports = {
|
|
51
|
-
preset: 'ts-jest',
|
|
52
|
-
testEnvironment: 'node',
|
|
53
|
-
testMatch: ['**/test/**/*.test.ts'],
|
|
54
|
-
setupFiles: ['reflect-metadata'],
|
|
55
|
-
};
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
- [ ] **Step 3: Actualizar el script de test en `package.json`**
|
|
59
|
-
|
|
60
|
-
Reemplazar la línea `"test": "test",` por:
|
|
61
|
-
```json
|
|
62
|
-
"test": "jest",
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
- [ ] **Step 4: Excluir `test/` del build en `tsconfig.json`**
|
|
66
|
-
|
|
67
|
-
Agregar a `exclude` (junto a `node_modules`):
|
|
68
|
-
```json
|
|
69
|
-
"exclude": [
|
|
70
|
-
"node_modules",
|
|
71
|
-
"test"
|
|
72
|
-
]
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
- [ ] **Step 5: Escribir el smoke test (debe pasar con inversify 6 actual)**
|
|
76
|
-
|
|
77
|
-
Create `test/AxiosHttpRequest.di.test.ts`:
|
|
78
|
-
```ts
|
|
79
|
-
import 'reflect-metadata';
|
|
80
|
-
import { Container } from 'inversify';
|
|
81
|
-
import { AxiosHttpRequest } from '../src/AxiosHttpRequest';
|
|
82
|
-
import { IHttpRequest } from '../src/IHttpRequest';
|
|
83
|
-
|
|
84
|
-
describe('AxiosHttpRequest DI', () => {
|
|
85
|
-
it('se resuelve como IHttpRequest desde un Container de inversify', () => {
|
|
86
|
-
const container = new Container();
|
|
87
|
-
container.bind<IHttpRequest>('IHttpRequest').to(AxiosHttpRequest);
|
|
88
|
-
|
|
89
|
-
const instance = container.get<IHttpRequest>('IHttpRequest');
|
|
90
|
-
|
|
91
|
-
expect(instance).toBeInstanceOf(AxiosHttpRequest);
|
|
92
|
-
expect(typeof instance.get).toBe('function');
|
|
93
|
-
expect(typeof instance.post).toBe('function');
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
- [ ] **Step 6: Correr el test (baseline verde en inversify 6)**
|
|
99
|
-
|
|
100
|
-
Run:
|
|
101
|
-
```bash
|
|
102
|
-
cd /Users/yhon/fsrc/fiado-http-client && npm test
|
|
103
|
-
```
|
|
104
|
-
Expected: PASS (1 test). Esto fija el baseline antes del bump.
|
|
105
|
-
|
|
106
|
-
- [ ] **Step 7: Commit**
|
|
107
|
-
|
|
108
|
-
```bash
|
|
109
|
-
cd /Users/yhon/fsrc/fiado-http-client
|
|
110
|
-
git add jest.config.js test/AxiosHttpRequest.di.test.ts package.json package-lock.json tsconfig.json
|
|
111
|
-
git commit -m "test: add DI smoke test and jest harness for http-client"
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
---
|
|
115
|
-
|
|
116
|
-
## Task 2: Crear rama de mantenimiento v6 antes de subir develop a v8
|
|
117
|
-
|
|
118
|
-
**Files:** ninguno (operación de git/branch)
|
|
119
|
-
|
|
120
|
-
- [ ] **Step 1: Cortar la rama de mantenimiento desde el develop actual (1.x)**
|
|
121
|
-
|
|
122
|
-
Run:
|
|
123
|
-
```bash
|
|
124
|
-
cd /Users/yhon/fsrc/fiado-http-client
|
|
125
|
-
git checkout -b release/1.x
|
|
126
|
-
git push -u origin release/1.x
|
|
127
|
-
git checkout develop
|
|
128
|
-
```
|
|
129
|
-
Expected: `release/1.x` creada en remoto desde 1.0.10. `develop` será la línea v8.
|
|
130
|
-
|
|
131
|
-
---
|
|
132
|
-
|
|
133
|
-
## Task 3: Subir inversify a v8 como peerDependency
|
|
134
|
-
|
|
135
|
-
**Files:**
|
|
136
|
-
- Modify: `fiado-http-client/package.json`
|
|
137
|
-
- (posible) Modify: `fiado-http-client/src/AxiosHttpRequest.ts`
|
|
138
|
-
|
|
139
|
-
- [ ] **Step 1: Quitar inversify de `dependencies` e instalar v8 como peer + dev**
|
|
140
|
-
|
|
141
|
-
Editar `package.json`:
|
|
142
|
-
- Quitar `"inversify": "^6.0.2"` de `dependencies` (dejar ahí solo `axios` y `typescript`).
|
|
143
|
-
- Agregar bloque:
|
|
144
|
-
```json
|
|
145
|
-
"peerDependencies": {
|
|
146
|
-
"inversify": "^8.0.0",
|
|
147
|
-
"reflect-metadata": "^0.2.2"
|
|
148
|
-
},
|
|
149
|
-
```
|
|
150
|
-
- Agregar a `devDependencies`: `"inversify": "^8.1.0"`, `"reflect-metadata": "^0.2.2"`.
|
|
151
|
-
|
|
152
|
-
Luego instalar:
|
|
153
|
-
```bash
|
|
154
|
-
cd /Users/yhon/fsrc/fiado-http-client
|
|
155
|
-
npm install
|
|
156
|
-
```
|
|
157
|
-
Expected: inversify 8.x en `node_modules`, sin errores.
|
|
158
|
-
|
|
159
|
-
- [ ] **Step 2: Compilar contra v8**
|
|
160
|
-
|
|
161
|
-
Run:
|
|
162
|
-
```bash
|
|
163
|
-
cd /Users/yhon/fsrc/fiado-http-client && npm run build
|
|
164
|
-
```
|
|
165
|
-
Expected: PASS. Si falla por la API de decoradores, ajustar el import de `@injectable` según la guía v8 (no se espera; `import { injectable } from 'inversify'` sigue válido).
|
|
166
|
-
|
|
167
|
-
- [ ] **Step 3: Correr el smoke test contra v8 (debe seguir verde)**
|
|
168
|
-
|
|
169
|
-
Run:
|
|
170
|
-
```bash
|
|
171
|
-
node --version # debe ser >= 20 (inversify 8 es ESM-only)
|
|
172
|
-
cd /Users/yhon/fsrc/fiado-http-client && npm test
|
|
173
|
-
```
|
|
174
|
-
Expected: PASS. Notas según la guía oficial:
|
|
175
|
-
- `container.get()` **sigue síncrono** en v8 (convención sync-first), así que el test no debería requerir `getAsync`.
|
|
176
|
-
- Si jest falla al cargar inversify 8 por ser **ESM-only** (error tipo `Cannot use import statement outside a module` o `ERR_REQUIRE_ESM`), habilitar ESM en jest: correr con `NODE_OPTIONS=--experimental-vm-modules`, `preset: 'ts-jest/presets/default-esm'` y `extensionsToTreatAsEsm: ['.ts']` en `jest.config.js`. Documentar el ajuste final para reutilizarlo en las demás libs.
|
|
177
|
-
|
|
178
|
-
- [ ] **Step 4: Commit**
|
|
179
|
-
|
|
180
|
-
```bash
|
|
181
|
-
cd /Users/yhon/fsrc/fiado-http-client
|
|
182
|
-
git add package.json package-lock.json src/
|
|
183
|
-
git commit -m "feat!: bump inversify to v8 as peerDependency
|
|
184
|
-
|
|
185
|
-
BREAKING CHANGE: requires inversify ^8 in the consumer. inversify ya no
|
|
186
|
-
es dependency directa; ahora es peerDependency para compartir una sola
|
|
187
|
-
instancia con el container del consumidor."
|
|
188
|
-
```
|
|
189
|
-
|
|
190
|
-
---
|
|
191
|
-
|
|
192
|
-
## Task 4: Bump a 2.0.0 (sin publicar)
|
|
193
|
-
|
|
194
|
-
**Files:**
|
|
195
|
-
- Modify: `fiado-http-client/package.json`
|
|
196
|
-
|
|
197
|
-
- [ ] **Step 1: Subir la versión a 2.0.0**
|
|
198
|
-
|
|
199
|
-
Run:
|
|
200
|
-
```bash
|
|
201
|
-
cd /Users/yhon/fsrc/fiado-http-client
|
|
202
|
-
npm version 2.0.0 --no-git-tag-version
|
|
203
|
-
```
|
|
204
|
-
Expected: `package.json` queda en `"version": "2.0.0"`.
|
|
205
|
-
|
|
206
|
-
- [ ] **Step 2: Build limpio y verificación final**
|
|
207
|
-
|
|
208
|
-
Run:
|
|
209
|
-
```bash
|
|
210
|
-
cd /Users/yhon/fsrc/fiado-http-client && npm run build && npm test
|
|
211
|
-
```
|
|
212
|
-
Expected: build OK + test PASS.
|
|
213
|
-
|
|
214
|
-
- [ ] **Step 3: Commit y tag (sin publicar a npm)**
|
|
215
|
-
|
|
216
|
-
```bash
|
|
217
|
-
cd /Users/yhon/fsrc/fiado-http-client
|
|
218
|
-
git add package.json
|
|
219
|
-
git commit -m "2.0.0"
|
|
220
|
-
git tag v2.0.0
|
|
221
|
-
git push origin develop --tags
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
- [ ] **Step 4: Publicación — EN ESPERA**
|
|
225
|
-
|
|
226
|
-
> **NO publicar todavía.** Por instrucción del usuario, ninguna lib se publica a
|
|
227
|
-
> npm hasta terminar todos los cambios del set (http-client, gateway-adapter,
|
|
228
|
-
> api-invoker) y tener visto bueno explícito. Cuando se autorice, el publish
|
|
229
|
-
> será (resolviendo antes el token de npm del `.npmrc`, ver spec §Seguridad):
|
|
230
|
-
>
|
|
231
|
-
> ```bash
|
|
232
|
-
> npm publish # 2.0.0 como dist-tag "latest"
|
|
233
|
-
> npm dist-tag add @fiado/http-client@1.0.10 legacy-v6
|
|
234
|
-
> ```
|
|
235
|
-
|
|
236
|
-
---
|
|
237
|
-
|
|
238
|
-
## Self-Review
|
|
239
|
-
|
|
240
|
-
- **Cobertura del spec:** http-client es la primera lib del §5 del spec; este plan cubre su migración (v8), la creación de la línea de mantenimiento (§6) y deja el publish documentado pero **en espera** (instrucción del usuario). gateway-adapter + api-invoker y las lambdas son planes aparte.
|
|
241
|
-
- **peerDependency:** decisión añadida sobre el spec para garantizar una sola instancia de inversify a través de la frontera lib↔lambda. Coherente con la causa raíz del §2.
|
|
242
|
-
- **Sin placeholders:** todos los pasos tienen comando o código concreto.
|
|
243
|
-
- **Riesgo abierto:** si `container.get` resultara async en 8.x, el Step 3 de Task 3 lo detecta y obliga a actualizar el test; ese hallazgo se documenta para el codemod de las lambdas.
|
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
# Migración a inversify v8 (última) con soporte gradual de lambdas en v6
|
|
2
|
-
|
|
3
|
-
Fecha: 2026-05-22
|
|
4
|
-
Estado: diseño aprobado (estrategia), pendiente de revisión del spec
|
|
5
|
-
Versión objetivo: inversify **8.x** (la última, hoy 8.1.0). Se salta v7; se va de v6 directo a v8.
|
|
6
|
-
|
|
7
|
-
## 1. Contexto y objetivo
|
|
8
|
-
|
|
9
|
-
Las libs compartidas (`@fiado/api-invoker`, `@fiado/gateway-adapter`,
|
|
10
|
-
`@fiado/http-client`) dependen hoy de `inversify ^6.x` como dependencia normal.
|
|
11
|
-
122 repos de lambdas las consumen y todos declaran `inversify` directamente,
|
|
12
|
-
repartidos entre el major 1 (~80 repos, `^1.x`) y el major 3 (~30, `^3.x`).
|
|
13
|
-
Las libs se publican a npm público (`registry.npmjs.org`).
|
|
14
|
-
|
|
15
|
-
**Objetivo:** subir las libs a inversify 8 y migrar las 122 lambdas **de forma
|
|
16
|
-
gradual**, manteniendo las lambdas no migradas funcionando en inversify 6,
|
|
17
|
-
incluyendo la capacidad de sacar hotfixes a las libs para esas lambdas v6.
|
|
18
|
-
|
|
19
|
-
## 2. Restricciones técnicas (la causa raíz)
|
|
20
|
-
|
|
21
|
-
- **La DI cruza la frontera lib↔lambda.** Cada lambda hace
|
|
22
|
-
`const c = new Container(); c.load(gatewayAdapterBindings); c.load(apiInvokerBindings)`
|
|
23
|
-
y además `c.bind("IHttpRequest").to(AxiosHttpRequest)`. Los `ContainerModule`
|
|
24
|
-
y las clases `@injectable` viajan desde la lib al container de la lambda.
|
|
25
|
-
- **Consecuencia:** el `ContainerModule`/decoradores producidos por la lib y el
|
|
26
|
-
`Container` de la lambda **deben ser de la misma versión de inversify**.
|
|
27
|
-
inversify 6 y 8 no se pueden mezclar en un mismo container (cambian la firma
|
|
28
|
-
del callback de `ContainerModule`, se elimina el namespace `interfaces`, y
|
|
29
|
-
cambian APIs de binding). Por eso **no existe una sola versión de lib que
|
|
30
|
-
sirva para ambos** sin un shim frágil.
|
|
31
|
-
- **Atomicidad de la migración por lambda:** una lambda no puede mezclar
|
|
32
|
-
`gateway-adapter` v6 con `api-invoker` v8. Debe subir **en un solo PR**:
|
|
33
|
-
`inversify` 6→8 + el set completo de libs que tocan su container
|
|
34
|
-
(`api-invoker`, `gateway-adapter`, `http-client`).
|
|
35
|
-
- **Ciclo entre libs:** `gateway-adapter` depende de `api-invoker` y
|
|
36
|
-
`api-invoker` depende de `gateway-adapter`. No se pueden publicar "uno a la
|
|
37
|
-
vez"; sus majors nuevos se publican coordinados (ver §5).
|
|
38
|
-
- **Libs sin inversify:** `logger` y `type-kit` no usan el container ni
|
|
39
|
-
decoradores → **no se tocan** en esta migración.
|
|
40
|
-
|
|
41
|
-
## 3. Estrategia elegida: majors paralelos (dual-track)
|
|
42
|
-
|
|
43
|
-
Sacar un **major nuevo** de cada lib del set, construido sobre inversify 8.
|
|
44
|
-
Los majors v6 actuales quedan como **línea de mantenimiento** para backports.
|
|
45
|
-
Cada lambda migra cuando le toca, en un PR atómico. Cada container en runtime
|
|
46
|
-
ve **una sola** versión de inversify.
|
|
47
|
-
|
|
48
|
-
Líneas resultantes por lib (los majors de NUESTRAS libs son independientes del
|
|
49
|
-
número de versión de inversify):
|
|
50
|
-
|
|
51
|
-
| Lib | Línea v6 (mantenimiento) | Línea v8 (nueva) |
|
|
52
|
-
|----------------|--------------------------|----------------------|
|
|
53
|
-
| http-client | 1.x | 2.0.0 |
|
|
54
|
-
| gateway-adapter| 1.x | 2.0.0 |
|
|
55
|
-
| api-invoker | 3.x | 4.0.0 |
|
|
56
|
-
| logger | — (sin cambio) | — |
|
|
57
|
-
| type-kit | — (sin cambio) | — |
|
|
58
|
-
|
|
59
|
-
(Estrategias descartadas: desacoplar las libs de inversify por completo —
|
|
60
|
-
refactor enorme incompatible con "gradual"; peerDependency + shim dual-API —
|
|
61
|
-
frágil por las diferencias de API entre v6 y v8.)
|
|
62
|
-
|
|
63
|
-
## 4. Breaking changes confirmados (v6 → v8)
|
|
64
|
-
|
|
65
|
-
Verificado contra las guías oficiales ([migrating-from-v6](https://inversify.io/docs/guides/migrating-from-v6/)
|
|
66
|
-
y [migrating-from-v7](https://inversify.io/docs/guides/migrating-from-v7/)).
|
|
67
|
-
Lo que toca este código:
|
|
68
|
-
|
|
69
|
-
1. **`ContainerModule`**: el callback recibe ahora un objeto
|
|
70
|
-
`ContainerModuleLoadOptions`; se usa `options.bind(...)`. Afecta
|
|
71
|
-
`apiInvokerBindings` y `gatewayAdapterBindings`.
|
|
72
|
-
```ts
|
|
73
|
-
// v6
|
|
74
|
-
export const apiInvokerBindings = new ContainerModule((bind: interfaces.Bind) => {
|
|
75
|
-
bind<IDirectoryApi>("IDirectoryApi").to(DirectoryApi);
|
|
76
|
-
});
|
|
77
|
-
// v8
|
|
78
|
-
export const apiInvokerBindings = new ContainerModule((options) => {
|
|
79
|
-
options.bind<IDirectoryApi>("IDirectoryApi").to(DirectoryApi);
|
|
80
|
-
});
|
|
81
|
-
```
|
|
82
|
-
2. **Namespace `interfaces` eliminado**: importar los tipos directamente.
|
|
83
|
-
`interfaces.Context → ResolutionContext`, `interfaces.Factory → Factory`,
|
|
84
|
-
`interfaces.Newable → Newable`, `interfaces.Request → BindingConstraints`.
|
|
85
|
-
Afecta `import { ContainerModule, interfaces } from "inversify"`.
|
|
86
|
-
3. **`toAutoFactory` eliminado** → reescribir con `toFactory`:
|
|
87
|
-
```ts
|
|
88
|
-
// v6 (auth-business)
|
|
89
|
-
.toAutoFactory("EventBridgeMessageSubscriber")
|
|
90
|
-
// v8
|
|
91
|
-
.toFactory((ctx) => () => ctx.get("EventBridgeMessageSubscriber"))
|
|
92
|
-
```
|
|
93
|
-
También: `toProvider → toFactory` (con función async),
|
|
94
|
-
`toConstructor → toConstantValue`, `toFunction → toConstantValue`.
|
|
95
|
-
4. **`container.load()` SIGUE SIENDO SÍNCRONO en v8** (convención "sync-first":
|
|
96
|
-
el nombre por defecto es sync, el async es `loadAsync()`). Como nuestros
|
|
97
|
-
módulos de binding son síncronos, **el patrón `const container = new
|
|
98
|
-
Container(); container.load(...); export { container }` se conserva** — NO
|
|
99
|
-
hay que volverlo async. (En v7 sí era async; v8 lo revirtió, a nuestro favor.)
|
|
100
|
-
`container.get()` también sigue síncrono.
|
|
101
|
-
5. **Opciones del `Container`**: `autoBindInjectable → autobind`;
|
|
102
|
-
`container.createChild()` → `new Container({ parent })`. Revisar usos.
|
|
103
|
-
6. **`@injectable`/`@inject` sin cambios**; nuevo `@injectFromBase` solo si una
|
|
104
|
-
clase hereda de una base injectable (revisar herencia).
|
|
105
|
-
7. **inversify 8 es ESM-only**, pero proyectos CommonJS lo consumen vía
|
|
106
|
-
`require(esm)` en **Node 20+**. ⇒ todas las lambdas deben correr en runtime
|
|
107
|
-
**Node 20.x o superior**. Verificar el runtime de cada lambda antes de migrar.
|
|
108
|
-
|
|
109
|
-
Entregable de esta fase: un **codemod / guía** reproducible para
|
|
110
|
-
`container.config.ts` (reescritura de `toAutoFactory`, import de `interfaces`,
|
|
111
|
-
firma de `ContainerModule`), ya que el patrón se repite en las 122 lambdas.
|
|
112
|
-
|
|
113
|
-
## 5. Orden de trabajo en las libs (un proyecto a la vez)
|
|
114
|
-
|
|
115
|
-
Para cada lib, antes de tocar: `git checkout develop && git pull`.
|
|
116
|
-
|
|
117
|
-
1. **http-client** (hoja, solo `@injectable` en `AxiosHttpRequest`):
|
|
118
|
-
migrar a v8, publicar **2.0.0**. dist-tag `latest` → 2.x, `legacy-v6` → 1.x.
|
|
119
|
-
2. **gateway-adapter + api-invoker** (ciclo): migrar el código de ambos a v8 en
|
|
120
|
-
ramas, desarrollando con enlaces locales (`npm link` / `file:`) para que
|
|
121
|
-
compilen uno contra otro. Publicar coordinado con prerelease:
|
|
122
|
-
- `gateway-adapter@2.0.0-rc.0` con dep `@fiado/api-invoker@^4.0.0-rc`
|
|
123
|
-
- `api-invoker@4.0.0-rc.0` con dep `@fiado/gateway-adapter@^2.0.0-rc`
|
|
124
|
-
- validar en 1 lambda piloto, luego promover a `2.0.0` / `4.0.0` finales.
|
|
125
|
-
3. **logger / type-kit**: sin cambios.
|
|
126
|
-
|
|
127
|
-
> **Publicación en espera:** no se publica ninguna lib a npm hasta terminar los
|
|
128
|
-
> cambios y tener el visto bueno explícito del usuario.
|
|
129
|
-
|
|
130
|
-
## 6. Política de branching y backport (soporte v6)
|
|
131
|
-
|
|
132
|
-
- Cortar una rama de mantenimiento por línea v6 en el último release v6:
|
|
133
|
-
`release/3.x` en api-invoker (desde 3.18.0), `release/1.x` en
|
|
134
|
-
gateway-adapter y http-client. `develop` pasa a ser la línea v8.
|
|
135
|
-
- **Hotfix que toca una lib mientras una lambda sigue en v6:**
|
|
136
|
-
1. El fix se hace en la línea natural y se hace `git cherry-pick` a la otra.
|
|
137
|
-
La mayoría de hotfixes (lógica de negocio, no inversify) tienen archivos
|
|
138
|
-
idénticos entre líneas → cherry-pick limpio.
|
|
139
|
-
2. Publicar patch en la línea v6 (ej. `3.18.1`) y, si aplica, en la nueva.
|
|
140
|
-
3. La lambda v6 (pineada `^3.x`) hace `npm update` y recibe el fix: cero
|
|
141
|
-
cambio de inversify, cero cambio en su `container.config.ts`.
|
|
142
|
-
- **Disciplina clave:** mantener el major nuevo como un **diff quirúrgico** sobre
|
|
143
|
-
v6 (tocar solo archivos que tocan inversify) para que los cherry-picks no
|
|
144
|
-
choquen.
|
|
145
|
-
- **Ventana de soporte:** se backportea **solo al último major v6** (api-invoker
|
|
146
|
-
3.x). Las ~80 lambdas aún en `^1.x` deben consolidarse a `^3` como parte de
|
|
147
|
-
(o antes de) la migración, porque hoy ya no pueden recibir fixes limpios.
|
|
148
|
-
|
|
149
|
-
## 7. Playbook de migración por lambda (gradual)
|
|
150
|
-
|
|
151
|
-
Por cada lambda, en un PR atómico:
|
|
152
|
-
|
|
153
|
-
1. `inversify` 6→8 y `reflect-metadata` a la versión alineada.
|
|
154
|
-
2. Subir el set de libs nuevas: `api-invoker` `^4`, `gateway-adapter` `^2`,
|
|
155
|
-
`http-client` `^2`.
|
|
156
|
-
3. Aplicar el codemod/guía a `container.config.ts`: reescribir `toAutoFactory`
|
|
157
|
-
→ `toFactory`, ajustar imports del namespace `interfaces`. El patrón
|
|
158
|
-
síncrono `export { container }` **no cambia** (load/get siguen sync en v8).
|
|
159
|
-
4. Verificar que el runtime de la lambda sea **Node ≥20** (inversify 8 ESM-only).
|
|
160
|
-
5. Correr tests + smoke test del handler. Merge y deploy.
|
|
161
|
-
|
|
162
|
-
Las lambdas no migradas siguen en v6 sin cambios.
|
|
163
|
-
|
|
164
|
-
## 8. Riesgos
|
|
165
|
-
|
|
166
|
-
- **Divergencia de líneas v6/v8** si el major nuevo refactoriza de más →
|
|
167
|
-
mitigado con el "diff quirúrgico".
|
|
168
|
-
- **Ciclo api-invoker↔gateway-adapter** en el publish → mitigado con prerelease
|
|
169
|
-
rc + dist-tags.
|
|
170
|
-
- **Cola de migración larga** (122 lambdas) → mantener línea v6 viva y priorizar
|
|
171
|
-
consolidar los `^1.x` a `^3.x`.
|
|
172
|
-
- **Runtime Node <20**: inversify 8 es ESM-only; lambdas en Node 18 o menor no
|
|
173
|
-
podrán hacer `require(esm)`. Mitigación: auditar y subir a Node 20+ el runtime
|
|
174
|
-
de cada lambda como prerrequisito de su PR de migración.
|
|
175
|
-
- **Saltar v7→v8 directo** acumula breaking changes; mitigado validando lib por
|
|
176
|
-
lib con su smoke test antes de avanzar. (El cambio más riesgoso de v7 —`load`
|
|
177
|
-
async— quedó revertido en v8, así que el bootstrap síncrono se conserva.)
|
|
178
|
-
|
|
179
|
-
## 9. Criterios de éxito
|
|
180
|
-
|
|
181
|
-
- http-client@2, gateway-adapter@2, api-invoker@4 construidos sobre inversify 8
|
|
182
|
-
y validados en 1 lambda piloto (publicación pendiente de visto bueno).
|
|
183
|
-
- Línea v6 (`release/*`) capaz de recibir y publicar un hotfix backporteado.
|
|
184
|
-
- Guía/codemod de `container.config.ts` documentada y reutilizable.
|
|
185
|
-
- Lambdas no migradas siguen desplegando sin cambios.
|
|
186
|
-
|
|
187
|
-
## Seguridad (fuera de alcance, pero a atender)
|
|
188
|
-
|
|
189
|
-
`fiado-api-invoker/.npmrc` contiene un token de publicación de npm en texto
|
|
190
|
-
plano. Si está versionado, debe **revocarse/rotarse** en npmjs.com y moverse a
|
|
191
|
-
una variable de entorno / secret de CI.
|
|
File without changes
|