@pasosdejesus/m 0.22.3 → 0.23.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.
Files changed (46) hide show
  1. package/dist/CHANGELOG.md +110 -0
  2. package/dist/e2e/env.d.ts +8 -0
  3. package/dist/e2e/env.d.ts.map +1 -1
  4. package/dist/e2e/env.js +29 -2
  5. package/dist/e2e/env.js.map +1 -1
  6. package/dist/e2e/env.test.d.ts +2 -0
  7. package/dist/e2e/env.test.d.ts.map +1 -0
  8. package/dist/e2e/env.test.js +59 -0
  9. package/dist/e2e/env.test.js.map +1 -0
  10. package/dist/e2e/index.d.ts +5 -1
  11. package/dist/e2e/index.d.ts.map +1 -1
  12. package/dist/e2e/index.js +3 -1
  13. package/dist/e2e/index.js.map +1 -1
  14. package/dist/e2e/retry.d.ts +40 -0
  15. package/dist/e2e/retry.d.ts.map +1 -0
  16. package/dist/e2e/retry.js +45 -0
  17. package/dist/e2e/retry.js.map +1 -0
  18. package/dist/e2e/retry.test.d.ts +2 -0
  19. package/dist/e2e/retry.test.d.ts.map +1 -0
  20. package/dist/e2e/retry.test.js +43 -0
  21. package/dist/e2e/retry.test.js.map +1 -0
  22. package/dist/e2e/signer.d.ts +23 -0
  23. package/dist/e2e/signer.d.ts.map +1 -0
  24. package/dist/e2e/signer.js +28 -0
  25. package/dist/e2e/signer.js.map +1 -0
  26. package/dist/e2e/siwe-mock.d.ts.map +1 -1
  27. package/dist/e2e/siwe-mock.js +4 -8
  28. package/dist/e2e/siwe-mock.js.map +1 -1
  29. package/dist/e2e/wallet-mock.d.ts +10 -6
  30. package/dist/e2e/wallet-mock.d.ts.map +1 -1
  31. package/dist/e2e/wallet-mock.js +32 -3
  32. package/dist/e2e/wallet-mock.js.map +1 -1
  33. package/dist/e2e/wallet-mock.test.d.ts +2 -0
  34. package/dist/e2e/wallet-mock.test.d.ts.map +1 -0
  35. package/dist/e2e/wallet-mock.test.js +28 -0
  36. package/dist/e2e/wallet-mock.test.js.map +1 -0
  37. package/dist/shadcn_components/ui/form.d.ts +4 -2
  38. package/dist/shadcn_components/ui/form.d.ts.map +1 -1
  39. package/dist/shadcn_components/ui/sheet.d.ts +1 -0
  40. package/dist/shadcn_components/ui/sheet.d.ts.map +1 -1
  41. package/dist/shadcn_components/ui/sheet.js.map +1 -1
  42. package/dist/templates/apps/nextjs/Makefile +5 -3
  43. package/dist/templates/apps/nextjs/next-env.d.ts +2 -0
  44. package/dist/templates/apps/nextjs/package.json.hbs +5 -5
  45. package/dist/templates/apps/nextjs/tsconfig.json +4 -3
  46. package/package.json +2 -2
package/dist/CHANGELOG.md CHANGED
@@ -2,6 +2,116 @@
2
2
 
3
3
  All notable changes to `@pasosdejesus/m` are documented in this file.
4
4
 
5
+ ## [0.23.0] - 2026-10-08
6
+
7
+ ### Added
8
+
9
+ - **`@pasosdejesus/m/e2e` — firma real en el mock de billetera.** `installRealSigner(page,
10
+ { privateKey, name })` expone en la página un puente que firma con la llave del spec, y
11
+ `ethereumMockCode`/`eip6963MockCode`/`injectEIP6963` aceptan `privateKey`: con él,
12
+ `personal_sign` y `eth_signTypedData_v4` devuelven firmas EIP-191/EIP-712 **reales**; sin él,
13
+ el comportamiento es el anterior (firma falsa `0xabab…`). `setupSIWEMock` pasa a usar el mismo
14
+ puente. Permite a los consumidores (sivel3, learn.tg) probar flujos con firma real
15
+ (https://gitlab.com/pasosdeJesus/m/-/work_items/49).
16
+ - **`@pasosdejesus/m/e2e` — reintentos.** `retry`, `retrySpec` y `gotoWithRetry` (`retry.ts`),
17
+ con opción `quiet` para silenciar los logs `[retry:…]`. Estabilizan los specs contra el sitio
18
+ compartido (https://gitlab.com/pasosdeJesus/m/-/work_items/49).
19
+ - **`@pasosdejesus/m/e2e` — `SITE_URL`.** `initTestEnv()` ahora honra `SITE_URL` (http o https),
20
+ p. ej. `SITE_URL=http://localhost:4000`, y resuelve `base`/`host`/`domainPort` acordes (antes
21
+ armaba siempre `https://…`, así que no se podía correr contra un `next dev` local en HTTP).
22
+ Se exportan `parseSiteUrl` y `resolveSiteTarget`. Sin `SITE_URL` no cambia nada
23
+ (https://gitlab.com/pasosdeJesus/m/-/work_items/49).
24
+
25
+ ### Documentation
26
+
27
+ - `REQ/49` (helpers E2E), `REQ/36` (tablero único de coordinación), `REQ/47` (núcleo de
28
+ identidad) y `REQ/14` (billetera compartida: Fase 3 reutiliza el firmador de `REQ/49`).
29
+
30
+ ## [0.22.4] - 2026-10-06
31
+
32
+ ### Fixed
33
+
34
+ - **`mpdj@0.2.9`:** la banda inferior de las imágenes de credenciales (SBT) ya no
35
+ superpone el título del curso con el nombre del sitio. El ancho disponible se
36
+ calcula con el nombre y el tamaño de fuente reales (el nombre del sitio se achica,
37
+ nunca se recorta) y el título baja de 36px a 20px y recién ahí se recorta con `...`
38
+ hasta entrar. Antes el tamaño de fuente salía de **contar** caracteres, así que un
39
+ título de 20 caracteres a 36px se metía más de 130px sobre
40
+ `stable-sl.pdJ.app` (https://github.com/pasosdeJesus/learn.tg/issues/195).
41
+ - **`mpdj@0.2.10`:** la composición de la imagen de credencial ya no descarta el
42
+ `transform` de la raíz del SVG fuente. `extractSvgInner` devolvía el contenido sin
43
+ el atributo del tag `<svg>` raíz, así que un `<svg transform="...">` perdía su
44
+ escala/traslación y la ilustración salía descentrada y recortada (medido con el
45
+ curso "A relationship with Jesus" de learn.tg, tokens 9 y 10). Nuevo helper
46
+ `extractSvgInnerLayer` (envuelve el contenido en `<g transform="...">` cuando la
47
+ raíz tiene `transform`), usado en la capa del ícono y también en el logo del sitio,
48
+ el candado y el sello pdJ (m#48,
49
+ https://gitlab.com/pasosdeJesus/m/-/work_items/48).
50
+ - **`mpdj@0.2.10`:** los SVG de la credencial (`blockchain/img/`) no se copiaban a
51
+ `dist`, así que el compositor nunca encontraba el sello pdJ (`__dirname/img/
52
+ PdJ-badge.svg`) y las credenciales salían **sin sello**; además el logo del sitio
53
+ caía al dibujo de reserva. Ahora el build los copia y el sello vuelve a dibujarse:
54
+ dice "pdJ" en cursiva (`escuela-cursiva`, pasado a trazos con inkscape para no
55
+ depender de la fuente) y toma el color del tipo de credencial (`#currentColor`).
56
+ - **`mpdj@0.2.11`:** el ícono del curso se escala a un **cuadrado seguro centrado**
57
+ (`ICON_SAFE_SIDE = 288`) en vez de llenar el marco (`translate(11,11) scale(0.95)`),
58
+ para no pisar el sello pdJ (arriba-izquierda), el candado (arriba-derecha) ni el logo
59
+ del sitio (abajo-derecha). Un cuadrado a sangre llenaba 486×486 y tapaba el pdJ; ahora
60
+ el ícono queda de (112,112) a (400,400) (m#48 §8.1).
61
+ - **`mpdj@0.2.11`:** el candado se dibuja siempre en el mismo marco (`LOCK_FRAME`,
62
+ `translate(405,4) scale(2)`), tanto si viene del asset `lock-sbt.svg` (que ahora
63
+ también se busca en el paquete) como del fallback inline; antes el fallback caía en
64
+ `translate(452,4) scale(1.8)` y quedaba pegado al borde (m#48 §8.2).
65
+ - **`mpdj@0.2.11`:** el logo del sitio es un **parámetro** de la composición: el ícono de
66
+ learn.tg / sivel.xyz / stable-sl.pdJ.app **viaja en el paquete** (`blockchain/img/`,
67
+ `SHORT_NAMES`), así que `eng:credentials:recompose-image --site <sitio>` recompone con
68
+ el logo correcto sin depender de `credential_metadata.site` y sin pasar archivos (m#48
69
+ §8.3).
70
+ - **`m` 0.22.4:** `SheetContent` (shadcn) declara `children` explícito: con
71
+ `@radix-ui/react-dialog` 1.1.23 y los tipos de React 19, `ComponentPropsWithoutRef` ya
72
+ no lo expone y el `typecheck` del andamiaje fallaba en `app/testui/page.tsx`.
73
+ - **`mpdj` 0.2.13:** declara `react` como peer y `react`, `react-dom`, `@types/react` y
74
+ `@types/react-dom` como devDeps. Sus componentes de UI (`SlearnInfo`,
75
+ `AddSlearnButton`) los necesitan; antes dependían del hoisting del monorepo y el
76
+ `typecheck` se rompía al reinstalar dependencias.
77
+
78
+ ### Documentation
79
+
80
+ - **`mpdj@0.2.9`:** la tabla de exports de `blockchain/credential-images` del README
81
+ documenta `credentialTitleLayout`, `credentialTitle`, `estimateTextWidth`, `BAND` y
82
+ `MAX_TITLE_LENGTH`, y hay un test nuevo (`credential-images-band.test.ts`) que
83
+ renderiza la banda con `rsvg-convert` y exige que la tinta del título no toque la
84
+ del nombre del sitio.
85
+ - **`mpdj@0.2.10`:** cuatro instrumentos de alineación
86
+ (`alineacion_dinamica_poblaciones`, `alineacion_informacion`,
87
+ `alineacion_informacion_cadena`, `alineacion_mejor_marco_operativo`) no traían la
88
+ sección `## Detección de eco` ni la distinción entre adopción analítica y
89
+ afirmación metafísica que exige `__tests__/ia-alignment.test.ts` (los tres últimos
90
+ tampoco nombraban a Jesús, que `ai.framework` busca en el instrumento que elige al
91
+ azar). Se completaron: `dinamica_poblaciones` pasó de un prompt suelto a un
92
+ instrumento con sus tres niveles, y los cuatro comparten la sección de eco.
93
+
94
+ ### Changed
95
+
96
+ - **`mpdj@0.2.12`:** se quita la opción de logo externo que se había agregado en 0.2.11
97
+ (`--site-logo` en `recompose-image` y `register-type`, y `siteLogoPath` en
98
+ `composeCredentialImage`): por ahora solo se contemplan los logos que viajan en el
99
+ paquete, seleccionados con `--site`. Un proyecto con logo propio lo deja como
100
+ `public/img/logo-<corto>.svg`, que `getSiteLogo` busca antes de la copia del paquete
101
+ (m#48 §8.3).
102
+ - **`m` 0.22.4 / `mpdj` 0.2.13 — Next 16:** el andamiaje
103
+ (`packages/m/templates/apps/nextjs`) y el proyecto de prueba pasan a `next ^16.0.0`
104
+ (16.4.0) con `--webpack` en `dev` y `build`, porque Turbopack necesita bindings nativos
105
+ (`next-swc`) que no existen para `openbsd/x64`; el `Makefile` arranca el build con
106
+ `ulimit -d 7340032` (con el límite por defecto de 1.5G V8 crashea durante el build con
107
+ Webpack) y la meta `dev` usa `pnpm dev` en vez de un `bin/dev` inexistente. El override
108
+ `pnpm` de la raíz pasa de `next 15.5.22` a `^16.0.0` (era el bloqueo real: mantenía todo
109
+ el monorepo en 15), y `m`/`mpdj` fijan `next ^16.0.0` en devDeps (REQ/43).
110
+ - **`m` 0.22.4 / `mpdj` 0.2.13 — React:** el andamiaje y el proyecto de prueba pasan de
111
+ `react`/`react-dom` `19.2.7` a **`19.3.0`**, con el mismo criterio de pin exacto que ya
112
+ usaba el repo: con rangos (`^19.2.8`) el árbol terminaba con dos copias de React y los
113
+ componentes shadcn fallaban (`Cannot read properties of null (reading 'useRef')`).
114
+
5
115
  ## [0.22.3] - 2026-09-27
6
116
 
7
117
  ### Added
package/dist/e2e/env.d.ts CHANGED
@@ -24,4 +24,12 @@ export interface E2EEnv {
24
24
  }
25
25
  export declare function initTestEnv(): Promise<E2EEnv>;
26
26
  export declare function short(addr: string): string;
27
+ /** `SITE_URL` como URL absoluta, o `null` (con aviso) si no es válida. */
28
+ export declare function parseSiteUrl(raw: string | undefined): URL | null;
29
+ /** Campos de destino ya resueltos por `initTestEnv` (compatibilidad learn.tg). */
30
+ export declare function resolveSiteTarget(env: E2EEnv): {
31
+ base: string;
32
+ host: string;
33
+ domainPort: string;
34
+ };
27
35
  //# sourceMappingURL=env.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/e2e/env.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAC5D;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,OAAO,CAAA;IACjB,yDAAyD;IACzD,OAAO,EAAE,UAAU,CAAA;IACnB;;;;;OAKG;IACH,OAAO,EAAE,UAAU,EAAE,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CA8CnD;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1C"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/e2e/env.ts"],"names":[],"mappings":"AA8BA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CAC5D;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,OAAO,CAAA;IACjB,yDAAyD;IACzD,OAAO,EAAE,UAAU,CAAA;IACnB;;;;;OAKG;IACH,OAAO,EAAE,UAAU,EAAE,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CA0DnD;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,GAAG,GAAG,IAAI,CAQhE;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAEjG"}
package/dist/e2e/env.js CHANGED
@@ -31,7 +31,18 @@ export async function initTestEnv() {
31
31
  const port = process.env.PUERTOPRU || '443';
32
32
  const host = process.env.IPDES || 'learn.tg';
33
33
  const domainPort = port === '443' || port === '80' ? '' : `:${port}`;
34
- const base = `https://${host}${domainPort}`;
34
+ // SITE_URL (m/REQ/49, P2): apunta a un servidor explícito (http o https), p.
35
+ // ej. `SITE_URL=http://localhost:4000`, sin parchear cada spec. Sin SITE_URL
36
+ // el comportamiento es el de siempre.
37
+ const siteUrl = parseSiteUrl(process.env.SITE_URL);
38
+ const resolvedHost = siteUrl ? siteUrl.hostname : host;
39
+ const resolvedDomainPort = siteUrl
40
+ ? siteUrl.port ? `:${siteUrl.port}` : ''
41
+ : domainPort;
42
+ const resolvedPort = siteUrl
43
+ ? siteUrl.port || (siteUrl.protocol === 'https:' ? '443' : '80')
44
+ : port;
45
+ const base = siteUrl ? siteUrl.origin : `https://${host}${domainPort}`;
35
46
  const timeout = 60000;
36
47
  const headless = process.env.CONCABEZA ? false : true;
37
48
  // Prioridad de claves: TEST_PRIVATE_KEYS (lista) > TEST_PRIVATE_KEY >
@@ -68,9 +79,25 @@ export async function initTestEnv() {
68
79
  console.log(` Using Hardhat test key: ${account.address}`);
69
80
  }
70
81
  const chainId = parseInt(process.env.CHAIN_ID || '42220', 10);
71
- return { port, host, domainPort, base, timeout, headless, account, wallets, chainId };
82
+ return { port: resolvedPort, host: resolvedHost, domainPort: resolvedDomainPort, base, timeout, headless, account, wallets, chainId };
72
83
  }
73
84
  export function short(addr) {
74
85
  return addr.slice(0, 10) + '...';
75
86
  }
87
+ /** `SITE_URL` como URL absoluta, o `null` (con aviso) si no es válida. */
88
+ export function parseSiteUrl(raw) {
89
+ if (!raw)
90
+ return null;
91
+ try {
92
+ return new URL(raw);
93
+ }
94
+ catch {
95
+ console.warn(`[e2e] SITE_URL inválida, se ignora: ${raw}`);
96
+ return null;
97
+ }
98
+ }
99
+ /** Campos de destino ya resueltos por `initTestEnv` (compatibilidad learn.tg). */
100
+ export function resolveSiteTarget(env) {
101
+ return { base: env.base, host: env.host, domainPort: env.domainPort };
102
+ }
76
103
  //# sourceMappingURL=env.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/e2e/env.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/e2e/env.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,oEAAoE;AACpE,2EAA2E;AAC3E,8EAA8E;AAC9E,sCAAsC;AACtC,MAAM,cAAc,GAA0C;IAC5D,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE;IACpD,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE;IAC1D,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;CAC/B,CAAA;AAED,SAAS,WAAW;IAClB,KAAK,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,cAAc,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAA;YAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,SAAQ;YACrC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAChD,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YACtD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YAChE,IAAI,EAAE,IAAI,IAAI;gBAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;QACpD,CAAC;QAAC,MAAM,CAAC,CAAC,yBAAyB,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;AA0B9B,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,KAAK,CAAA;IAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,UAAU,CAAA;IAC5C,MAAM,UAAU,GAAG,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAA;IAEpE,6EAA6E;IAC7E,6EAA6E;IAC7E,sCAAsC;IACtC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAClD,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAA;IACtD,MAAM,kBAAkB,GAAG,OAAO;QAChC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE;QACxC,CAAC,CAAC,UAAU,CAAA;IACd,MAAM,YAAY,GAAG,OAAO;QAC1B,CAAC,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAChE,CAAC,CAAC,IAAI,CAAA;IACR,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,IAAI,GAAG,UAAU,EAAE,CAAA;IACtE,MAAM,OAAO,GAAG,KAAK,CAAA;IACrB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;IAErD,sEAAsE;IACtE,gCAAgC;IAChC,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;SAClD,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC,CAAA;IAClB,MAAM,GAAG,GAAa,OAAO,CAAC,MAAM,GAAG,CAAC;QACtC,CAAC,CAAC,OAAO;QACT,CAAC,CAAC;YACE,OAAO,CAAC,GAAG,CAAC,gBAAgB;gBAC1B,QAAQ,EAAE,EAAE;gBACZ,oEAAoE;SACvE,CAAA;IAEL,yDAAyD;IACzD,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAA;IAC7D,MAAM,OAAO,GAAiB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QAC3C,MAAM,GAAG,GAAG,mBAAmB,CAAC,EAAmB,CAAC,CAAA;QACpD,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAA;IACzE,CAAC,CAAC,CAAA;IAEF,uEAAuE;IACvE,0EAA0E;IAC1E,6EAA6E;IAC7E,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,GAAG,EAAE,EAAE,CAAC,CAAA;IACjE,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAErD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,CAAC,MAAM,YAAY,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IACtE,CAAC;SAAM,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,uBAAuB,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IACvD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,6BAA6B,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IAC7D,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,EAAE,EAAE,CAAC,CAAA;IAE7D,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAA;AACvI,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,IAAY;IAChC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAA;AAClC,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,YAAY,CAAC,GAAuB;IAClD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAA;IACrB,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,uCAAuC,GAAG,EAAE,CAAC,CAAA;QAC1D,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,CAAA;AACvE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=env.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.test.d.ts","sourceRoot":"","sources":["../../src/e2e/env.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,59 @@
1
+ import { afterEach, describe, expect, it } from 'vitest';
2
+ import { initTestEnv, parseSiteUrl, resolveSiteTarget } from './env.js';
3
+ // P2 (m/REQ/49): `SITE_URL` permite apuntar a un servidor explícito (http o
4
+ // https) sin parchear cada spec; sin `SITE_URL` el comportamiento no cambia.
5
+ const KEYS = ['SITE_URL', 'IPDES', 'PUERTOPRU'];
6
+ const saved = {};
7
+ for (const k of KEYS)
8
+ saved[k] = process.env[k];
9
+ function restore() {
10
+ for (const k of KEYS) {
11
+ if (saved[k] === undefined)
12
+ delete process.env[k];
13
+ else
14
+ process.env[k] = saved[k];
15
+ }
16
+ }
17
+ describe('e2e env — SITE_URL', () => {
18
+ afterEach(restore);
19
+ it('sin SITE_URL conserva el comportamiento anterior', async () => {
20
+ delete process.env.SITE_URL;
21
+ delete process.env.IPDES;
22
+ delete process.env.PUERTOPRU;
23
+ const env = await initTestEnv();
24
+ expect(env.base).toBe('https://learn.tg');
25
+ expect(env.host).toBe('learn.tg');
26
+ expect(env.domainPort).toBe('');
27
+ expect(env.port).toBe('443');
28
+ });
29
+ it('con SITE_URL http usa el origen tal cual y deriva host/domainPort', async () => {
30
+ process.env.SITE_URL = 'http://localhost:4000';
31
+ delete process.env.IPDES;
32
+ delete process.env.PUERTOPRU;
33
+ const env = await initTestEnv();
34
+ expect(env.base).toBe('http://localhost:4000');
35
+ expect(env.host).toBe('localhost');
36
+ expect(env.domainPort).toBe(':4000');
37
+ expect(env.port).toBe('4000');
38
+ expect(resolveSiteTarget(env)).toEqual({
39
+ base: 'http://localhost:4000',
40
+ host: 'localhost',
41
+ domainPort: ':4000',
42
+ });
43
+ });
44
+ it('SITE_URL https sin puerto explícito no añade domainPort', async () => {
45
+ process.env.SITE_URL = 'https://sivel.xyz';
46
+ const env = await initTestEnv();
47
+ expect(env.base).toBe('https://sivel.xyz');
48
+ expect(env.host).toBe('sivel.xyz');
49
+ expect(env.domainPort).toBe('');
50
+ expect(env.port).toBe('443');
51
+ });
52
+ it('parseSiteUrl ignora valores inválidos o vacíos', () => {
53
+ expect(parseSiteUrl(undefined)).toBeNull();
54
+ expect(parseSiteUrl('')).toBeNull();
55
+ expect(parseSiteUrl('no es una url')).toBeNull();
56
+ expect(parseSiteUrl('http://localhost:4000')?.hostname).toBe('localhost');
57
+ });
58
+ });
59
+ //# sourceMappingURL=env.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.test.js","sourceRoot":"","sources":["../../src/e2e/env.test.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,15 @@
1
1
  export { ok, fail, resetFailures, summary } from './assertions.js';
2
- export { initTestEnv, short } from './env.js';
2
+ export { initTestEnv, short, parseSiteUrl, resolveSiteTarget } from './env.js';
3
3
  export type { E2EEnv } from './env.js';
4
4
  export { findChrome, launchBrowser, newPage, newIncognitoContext, newIncognitoPage, clearBrowserCache } from './browser.js';
5
5
  export type { E2EPage, E2EBrowser, E2EBrowserContext } from './browser.js';
6
6
  export { safeNavigate, waitForText } from './navigation.js';
7
+ export { retry, retrySpec, gotoWithRetry } from './retry.js';
8
+ export type { RetryOpts, RetrySpecOpts, GotoRetryOpts } from './retry.js';
7
9
  export { simulateSIWE, checkSessionFull, checkPartialLogin } from './siwe.js';
8
10
  export { setupSIWEMock } from './siwe-mock.js';
11
+ export { installRealSigner, REAL_SIGNER_NAME, REAL_TYPED_DATA_SIGNER_NAME } from './signer.js';
12
+ export type { RealSigner, RealSignerOpts } from './signer.js';
9
13
  export { ethereumMockCode, eip6963MockCode, injectEIP6963 } from './wallet-mock.js';
10
14
  export type { EthereumMockOpts } from './wallet-mock.js';
11
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/e2e/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAC7C,YAAY,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAC3H,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAC1E,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACnF,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/e2e/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC9E,YAAY,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAC3H,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAC1E,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC5D,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AACzE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAC9F,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACnF,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA"}
package/dist/e2e/index.js CHANGED
@@ -1,9 +1,11 @@
1
1
  // Barrel export for @pasosdejesus/m/e2e
2
2
  export { ok, fail, resetFailures, summary } from './assertions.js';
3
- export { initTestEnv, short } from './env.js';
3
+ export { initTestEnv, short, parseSiteUrl, resolveSiteTarget } from './env.js';
4
4
  export { findChrome, launchBrowser, newPage, newIncognitoContext, newIncognitoPage, clearBrowserCache } from './browser.js';
5
5
  export { safeNavigate, waitForText } from './navigation.js';
6
+ export { retry, retrySpec, gotoWithRetry } from './retry.js';
6
7
  export { simulateSIWE, checkSessionFull, checkPartialLogin } from './siwe.js';
7
8
  export { setupSIWEMock } from './siwe-mock.js';
9
+ export { installRealSigner, REAL_SIGNER_NAME, REAL_TYPED_DATA_SIGNER_NAME } from './signer.js';
8
10
  export { ethereumMockCode, eip6963MockCode, injectEIP6963 } from './wallet-mock.js';
9
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/e2e/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAE7C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAE3H,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/e2e/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAE9E,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAE3H,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE5D,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAA;AAE9F,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1,40 @@
1
+ import type { E2EPage } from './browser.js';
2
+ export interface RetryOpts {
3
+ /** Reintentos además del primer intento (default 3 → 4 ejecuciones). */
4
+ retries?: number;
5
+ /** Espera entre intentos en ms (default 10000). */
6
+ delayMs?: number;
7
+ /** Etiqueta para los logs `[retry:label]`. */
8
+ label?: string;
9
+ /** Silencia los logs `[retry:…]` (los consumidores envuelven `console`). */
10
+ quiet?: boolean;
11
+ }
12
+ export interface RetrySpecOpts {
13
+ /** Intentos totales (default 2). */
14
+ attempts?: number;
15
+ /** Espera entre intentos en ms (default 20000). */
16
+ delayMs?: number;
17
+ label?: string;
18
+ /** Silencia los logs `[retrySpec:…]`. */
19
+ quiet?: boolean;
20
+ }
21
+ export interface GotoRetryOpts {
22
+ waitUntil?: string;
23
+ timeout?: number;
24
+ retries?: number;
25
+ delayMs?: number;
26
+ label?: string;
27
+ /** Silencia los logs `[retry:goto:…]`. */
28
+ quiet?: boolean;
29
+ }
30
+ /** Ejecuta `fn`, reintentando ante error. Propaga el último error si se agota. */
31
+ export declare function retry<T>(fn: () => Promise<T>, opts?: RetryOpts): Promise<T>;
32
+ /**
33
+ * Repite un spec completo. Solo para specs **seguros de re-correr** (billetera
34
+ * fresca o diagnóstico sin gasto on-chain): repetir un flujo con transacción
35
+ * real duplicaría el gasto.
36
+ */
37
+ export declare function retrySpec<T>(run: () => Promise<T>, opts?: RetrySpecOpts): Promise<T>;
38
+ /** `page.goto` con reintentos. */
39
+ export declare function gotoWithRetry(page: E2EPage, url: string, opts?: GotoRetryOpts): Promise<unknown>;
40
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/e2e/retry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAE3C,MAAM,WAAW,SAAS;IACxB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4EAA4E;IAC5E,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yCAAyC;IACzC,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,0CAA0C;IAC1C,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAID,kFAAkF;AAClF,wBAAsB,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAE,SAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAqBrF;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,CAAC,CAAC,CAO9F;AAED,kCAAkC;AAClC,wBAAsB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAM1G"}
@@ -0,0 +1,45 @@
1
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
2
+ /** Ejecuta `fn`, reintentando ante error. Propaga el último error si se agota. */
3
+ export async function retry(fn, opts = {}) {
4
+ const retries = opts.retries ?? 3;
5
+ const delayMs = opts.delayMs ?? 10000;
6
+ const label = opts.label || 'retry';
7
+ const log = opts.quiet ? () => { } : (msg) => console.log(msg);
8
+ let lastError;
9
+ for (let attempt = 0; attempt <= retries; attempt++) {
10
+ try {
11
+ return await fn();
12
+ }
13
+ catch (err) {
14
+ lastError = err;
15
+ const msg = err instanceof Error ? err.message : String(err);
16
+ if (attempt < retries) {
17
+ log(`[retry:${label}] intento ${attempt + 1}/${retries + 1} falló (${msg}); reintento en ${delayMs}ms`);
18
+ await sleep(delayMs);
19
+ }
20
+ else {
21
+ log(`[retry:${label}] agotado tras ${retries + 1} intento(s)`);
22
+ }
23
+ }
24
+ }
25
+ throw lastError;
26
+ }
27
+ /**
28
+ * Repite un spec completo. Solo para specs **seguros de re-correr** (billetera
29
+ * fresca o diagnóstico sin gasto on-chain): repetir un flujo con transacción
30
+ * real duplicaría el gasto.
31
+ */
32
+ export async function retrySpec(run, opts = {}) {
33
+ return retry(run, {
34
+ retries: Math.max(0, (opts.attempts ?? 2) - 1),
35
+ delayMs: opts.delayMs ?? 20000,
36
+ label: opts.label || 'retrySpec',
37
+ quiet: opts.quiet,
38
+ });
39
+ }
40
+ /** `page.goto` con reintentos. */
41
+ export async function gotoWithRetry(page, url, opts = {}) {
42
+ const label = opts.label || url;
43
+ return retry(() => page.goto(url, { waitUntil: opts.waitUntil || 'domcontentloaded', timeout: opts.timeout ?? 60000 }), { retries: opts.retries ?? 3, delayMs: opts.delayMs ?? 5000, label: `goto:${label}`, quiet: opts.quiet });
44
+ }
45
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/e2e/retry.ts"],"names":[],"mappings":"AAoCA,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAE9F,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,KAAK,CAAI,EAAoB,EAAE,OAAkB,EAAE;IACvE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,CAAA;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAA;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,OAAO,CAAA;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACrE,IAAI,SAAkB,CAAA;IACtB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;QACpD,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAA;QACnB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,GAAG,GAAG,CAAA;YACf,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAC5D,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;gBACtB,GAAG,CAAC,UAAU,KAAK,aAAa,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,WAAW,GAAG,mBAAmB,OAAO,IAAI,CAAC,CAAA;gBACvG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAA;YACtB,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,UAAU,KAAK,kBAAkB,OAAO,GAAG,CAAC,aAAa,CAAC,CAAA;YAChE,CAAC;QACH,CAAC;IACH,CAAC;IACD,MAAM,SAAS,CAAA;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAI,GAAqB,EAAE,OAAsB,EAAE;IAChF,OAAO,KAAK,CAAC,GAAG,EAAE;QAChB,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9C,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;QAC9B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,WAAW;QAChC,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAAA;AACJ,CAAC;AAED,kCAAkC;AAClC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAa,EAAE,GAAW,EAAE,OAAsB,EAAE;IACtF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAA;IAC/B,OAAO,KAAK,CACV,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,kBAAkB,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK,EAAE,CAAC,EACzG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,KAAK,EAAE,QAAQ,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CACzG,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=retry.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.test.d.ts","sourceRoot":"","sources":["../../src/e2e/retry.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,43 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { gotoWithRetry, retry, retrySpec } from './retry.js';
3
+ // P1 (m/REQ/49): estabilidad de los E2E ante fallos transitorios.
4
+ describe('retry — reintentos', () => {
5
+ it('devuelve el resultado si el primer intento pasa', async () => {
6
+ const fn = vi.fn().mockResolvedValue('ok');
7
+ await expect(retry(fn, { retries: 2, delayMs: 1 })).resolves.toBe('ok');
8
+ expect(fn).toHaveBeenCalledTimes(1);
9
+ });
10
+ it('reintenta hasta lograrlo', async () => {
11
+ let n = 0;
12
+ const fn = vi.fn().mockImplementation(async () => {
13
+ if (++n < 3)
14
+ throw new Error('boom');
15
+ return 'ok';
16
+ });
17
+ await expect(retry(fn, { retries: 3, delayMs: 1 })).resolves.toBe('ok');
18
+ expect(fn).toHaveBeenCalledTimes(3);
19
+ });
20
+ it('propaga el error al agotar los reintentos', async () => {
21
+ const fn = vi.fn().mockRejectedValue(new Error('siempre falla'));
22
+ await expect(retry(fn, { retries: 2, delayMs: 1 })).rejects.toThrow('siempre falla');
23
+ expect(fn).toHaveBeenCalledTimes(3);
24
+ });
25
+ it('retrySpec ejecuta hasta `attempts` veces', async () => {
26
+ const run = vi.fn().mockRejectedValue(new Error('x'));
27
+ await expect(retrySpec(run, { attempts: 2, delayMs: 0 })).rejects.toThrow('x');
28
+ expect(run).toHaveBeenCalledTimes(2);
29
+ });
30
+ it('gotoWithRetry reintenta page.goto', async () => {
31
+ let n = 0;
32
+ const page = {
33
+ goto: vi.fn().mockImplementation(async () => {
34
+ if (++n < 2)
35
+ throw new Error('net');
36
+ return 'page';
37
+ }),
38
+ };
39
+ await expect(gotoWithRetry(page, 'http://x', { retries: 3, delayMs: 0 })).resolves.toBe('page');
40
+ expect(page.goto).toHaveBeenCalledTimes(2);
41
+ });
42
+ });
43
+ //# sourceMappingURL=retry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.test.js","sourceRoot":"","sources":["../../src/e2e/retry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { E2EPage } from './browser.js';
2
+ /** Nombre por defecto del puente para `personal_sign`. */
3
+ export declare const REAL_SIGNER_NAME = "__signMessage";
4
+ /** Nombre por defecto del puente para `eth_signTypedData_v4`. */
5
+ export declare const REAL_TYPED_DATA_SIGNER_NAME = "__signTypedData";
6
+ export interface RealSignerOpts {
7
+ privateKey: `0x${string}`;
8
+ /** Nombre del puente de `personal_sign` (default `__signMessage`). */
9
+ name?: string;
10
+ /** Nombre del puente de `eth_signTypedData_v4` (default `__signTypedData`). */
11
+ typedDataName?: string;
12
+ }
13
+ export interface RealSigner {
14
+ address: string;
15
+ name: string;
16
+ typedDataName: string;
17
+ }
18
+ /**
19
+ * Instala en `page` el puente de firma real. Llamar **antes** de
20
+ * `evaluateOnNewDocument`/navegar. Devuelve la dirección derivada de la llave.
21
+ */
22
+ export declare function installRealSigner(page: E2EPage, opts: RealSignerOpts): Promise<RealSigner>;
23
+ //# sourceMappingURL=signer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.d.ts","sourceRoot":"","sources":["../../src/e2e/signer.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAE3C,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB,kBAAkB,CAAA;AAC/C,iEAAiE;AACjE,eAAO,MAAM,2BAA2B,oBAAoB,CAAA;AAE5D,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,KAAK,MAAM,EAAE,CAAA;IACzB,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,+EAA+E;IAC/E,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,MAAM,CAAA;CACtB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAqBhG"}
@@ -0,0 +1,28 @@
1
+ /** Nombre por defecto del puente para `personal_sign`. */
2
+ export const REAL_SIGNER_NAME = '__signMessage';
3
+ /** Nombre por defecto del puente para `eth_signTypedData_v4`. */
4
+ export const REAL_TYPED_DATA_SIGNER_NAME = '__signTypedData';
5
+ /**
6
+ * Instala en `page` el puente de firma real. Llamar **antes** de
7
+ * `evaluateOnNewDocument`/navegar. Devuelve la dirección derivada de la llave.
8
+ */
9
+ export async function installRealSigner(page, opts) {
10
+ const { privateKeyToAccount } = await import('viem/accounts');
11
+ const account = privateKeyToAccount(opts.privateKey);
12
+ const name = opts.name || REAL_SIGNER_NAME;
13
+ const typedDataName = opts.typedDataName || REAL_TYPED_DATA_SIGNER_NAME;
14
+ await page.exposeFunction(name, async (message) => {
15
+ const sig = await account.signMessage({ message });
16
+ return typeof sig === 'string' ? sig : sig.signature || sig;
17
+ });
18
+ await page.exposeFunction(typedDataName, async (json) => {
19
+ const typedData = typeof json === 'string' ? JSON.parse(json) : json;
20
+ const { domain, types, primaryType, message } = typedData;
21
+ // viem deriva `EIP712Domain` de `domain`; no debe ir en `types`.
22
+ const cleanTypes = { ...types };
23
+ delete cleanTypes.EIP712Domain;
24
+ return account.signTypedData({ domain, types: cleanTypes, primaryType, message });
25
+ });
26
+ return { address: account.address, name, typedDataName };
27
+ }
28
+ //# sourceMappingURL=signer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signer.js","sourceRoot":"","sources":["../../src/e2e/signer.ts"],"names":[],"mappings":"AAWA,0DAA0D;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,eAAe,CAAA;AAC/C,iEAAiE;AACjE,MAAM,CAAC,MAAM,2BAA2B,GAAG,iBAAiB,CAAA;AAgB5D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAa,EAAE,IAAoB;IACzE,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAA;IAC7D,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACpD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,gBAAgB,CAAA;IAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,2BAA2B,CAAA;IAEvE,MAAO,IAAY,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,OAAe,EAAE,EAAE;QACjE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;QAClD,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAE,GAAW,CAAC,SAAS,IAAI,GAAG,CAAA;IACtE,CAAC,CAAC,CAAA;IAEF,MAAO,IAAY,CAAC,cAAc,CAAC,aAAa,EAAE,KAAK,EAAE,IAAqB,EAAE,EAAE;QAChF,MAAM,SAAS,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QACpE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,SAAS,CAAA;QACzD,iEAAiE;QACjE,MAAM,UAAU,GAAG,EAAE,GAAG,KAAK,EAAE,CAAA;QAC/B,OAAO,UAAU,CAAC,YAAY,CAAA;QAC9B,OAAO,OAAO,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAA;IACnF,CAAC,CAAC,CAAA;IAEF,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAA;AAC1D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"siwe-mock.d.ts","sourceRoot":"","sources":["../../src/e2e/siwe-mock.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAe3C,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,MAAc,EACvB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,IAAI,CAAC,CA0Ef"}
1
+ {"version":3,"file":"siwe-mock.d.ts","sourceRoot":"","sources":["../../src/e2e/siwe-mock.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAgB3C,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,MAAc,EACvB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,IAAI,CAAC,CAqEf"}
@@ -21,6 +21,7 @@
21
21
  // const page = await browser.newPage()
22
22
  // await setupSIWEMock(page, address, privateKey, chainId)
23
23
  // await page.goto(url) // mock is ready before any page script runs
24
+ import { installRealSigner } from './signer.js';
24
25
  // Fake balance: 1000 * 10^18 wei (for native CELO / 18-decimal tokens)
25
26
  const FAKE_BALANCE_18 = '0x00000000000000000000000000000000000000000000003635C9ADC5DEA00000';
26
27
  // Fake balance: 1000 * 10^6 (for USDT / 6-decimal tokens)
@@ -38,13 +39,8 @@ export async function setupSIWEMock(page, address, privateKey, chainId = 42220,
38
39
  const fakeBalance = opts.fakeBalance || FAKE_BALANCE_18;
39
40
  const fakeCelo = opts.fakeCelo || FAKE_CELO;
40
41
  const fakeTxHash = opts.fakeTxHash || ('0x' + 'cd'.repeat(32));
41
- // Set up signing bridge BEFORE page loads
42
- await page.exposeFunction('__signSiwe', async (message) => {
43
- const { privateKeyToAccount } = await import('viem/accounts');
44
- const account = privateKeyToAccount(privateKey);
45
- const sig = await account.signMessage({ message });
46
- return typeof sig === 'string' ? sig : sig.signature || sig;
47
- });
42
+ // Puente de firma real (compartido con wallet-mock) ANTES de que cargue la página.
43
+ await installRealSigner(page, { privateKey: privateKey });
48
44
  // Inject full wallet mock BEFORE any page script runs
49
45
  // This survives page reloads (evaluateOnNewDocument)
50
46
  await page.evaluateOnNewDocument((addr, cid, bal, celo, txHash) => {
@@ -61,7 +57,7 @@ export async function setupSIWEMock(page, address, privateKey, chainId = 42220,
61
57
  if (method === 'eth_requestAccounts')
62
58
  return [addr];
63
59
  if (method === 'personal_sign')
64
- return window.__signSiwe(params[0]);
60
+ return window.__signMessage(params[0]);
65
61
  if (method === 'wallet_switchEthereumChain')
66
62
  return null;
67
63
  if (method === 'eth_getBalance')
@@ -1 +1 @@
1
- {"version":3,"file":"siwe-mock.js","sourceRoot":"","sources":["../../src/e2e/siwe-mock.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"siwe-mock.js","sourceRoot":"","sources":["../../src/e2e/siwe-mock.ts"],"names":[],"mappings":"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"}
@@ -2,12 +2,16 @@ import type { E2EPage } from './browser.js';
2
2
  export interface EthereumMockOpts {
3
3
  address: string;
4
4
  chainId?: number;
5
+ /** Si está, `personal_sign`/`eth_signTypedData_v4` firman de verdad (P6). */
6
+ privateKey?: string;
7
+ /** Nombre del puente de `personal_sign` (default `__signMessage`). */
8
+ signerName?: string;
9
+ /** Nombre del puente typed-data (default `__signTypedData`). */
10
+ typedDataSignerName?: string;
11
+ /** Nombre de la billetera anunciada por EIP-6963 (default `MockWallet`). */
12
+ walletName?: string;
5
13
  }
6
14
  export declare function ethereumMockCode(opts: EthereumMockOpts): string;
7
- export declare function eip6963MockCode(opts: EthereumMockOpts & {
8
- walletName?: string;
9
- }): string;
10
- export declare function injectEIP6963(page: E2EPage, opts: EthereumMockOpts & {
11
- walletName?: string;
12
- }): Promise<void>;
15
+ export declare function eip6963MockCode(opts: EthereumMockOpts): string;
16
+ export declare function injectEIP6963(page: E2EPage, opts: EthereumMockOpts): Promise<void>;
13
17
  //# sourceMappingURL=wallet-mock.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wallet-mock.d.ts","sourceRoot":"","sources":["../../src/e2e/wallet-mock.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAE3C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAsB/D;AAID,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG;IACvD,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,GAAG,MAAM,CAuCT;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,gBAAgB,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/C,OAAO,CAAC,IAAI,CAAC,CAmBf"}
1
+ {"version":3,"file":"wallet-mock.d.ts","sourceRoot":"","sources":["../../src/e2e/wallet-mock.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAG3C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAeD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAwB/D;AAID,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAyC9D;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BxF"}
@@ -2,11 +2,30 @@
2
2
  // into the browser page. Not detected by wagmi (EIP-6963), but prevents
3
3
  // console errors and enables basic dApp interaction.
4
4
  //
5
+ // Con `privateKey` (P6, m/REQ/14 Fase 3) `personal_sign` y
6
+ // `eth_signTypedData_v4` firman de VERDAD a través del puente de
7
+ // `installRealSigner`; sin `privateKey` devuelven firmas falsas
8
+ // (retrocompatible, comportamiento anterior).
9
+ //
5
10
  // For wagmi/RainbowKit compatibility, use eip6963MockCode() or injectEIP6963().
11
+ import { installRealSigner } from './signer.js';
12
+ /** Devuelve las expresiones de firma para el código inyectado. */
13
+ function signerCalls(opts) {
14
+ if (!opts.privateKey) {
15
+ return { personal: `'0x' + 'ab'.repeat(65)`, typed: `'0x' + 'ab'.repeat(65)` };
16
+ }
17
+ const name = opts.signerName || '__signMessage';
18
+ const typedName = opts.typedDataSignerName || '__signTypedData';
19
+ return {
20
+ personal: `(await window['${name}'](params[0]))`,
21
+ typed: `(await window['${typedName}'](params[1]))`,
22
+ };
23
+ }
6
24
  export function ethereumMockCode(opts) {
7
25
  const addr = opts.address;
8
26
  const cid = opts.chainId || 42220;
9
27
  const hexChainId = '0x' + cid.toString(16);
28
+ const { personal, typed } = signerCalls(opts);
10
29
  return `
11
30
  window.ethereum = {
12
31
  isMetaMask: true,
@@ -16,7 +35,8 @@ export function ethereumMockCode(opts) {
16
35
  if (method === 'eth_chainId') return '${hexChainId}'
17
36
  if (method === 'eth_accounts') return ['${addr}']
18
37
  if (method === 'eth_requestAccounts') return ['${addr}']
19
- if (method === 'personal_sign') return '0x' + 'ab'.repeat(65)
38
+ if (method === 'personal_sign') return ${personal}
39
+ if (method === 'eth_signTypedData_v4') return ${typed}
20
40
  if (method === 'wallet_switchEthereumChain') return null
21
41
  if (method === 'eth_sendTransaction') return '0x' + 'cd'.repeat(32)
22
42
  return null
@@ -33,6 +53,7 @@ export function eip6963MockCode(opts) {
33
53
  const cid = opts.chainId || 42220;
34
54
  const hexChainId = '0x' + cid.toString(16);
35
55
  const walletName = opts.walletName || 'MockWallet';
56
+ const { personal, typed } = signerCalls(opts);
36
57
  return `
37
58
  const __provider = {
38
59
  isMetaMask: true,
@@ -42,7 +63,8 @@ export function eip6963MockCode(opts) {
42
63
  if (method === 'eth_chainId') return '${hexChainId}'
43
64
  if (method === 'eth_accounts') return ['${addr}']
44
65
  if (method === 'eth_requestAccounts') return ['${addr}']
45
- if (method === 'personal_sign') return '0x' + 'ab'.repeat(65)
66
+ if (method === 'personal_sign') return ${personal}
67
+ if (method === 'eth_signTypedData_v4') return ${typed}
46
68
  if (method === 'wallet_switchEthereumChain') return null
47
69
  if (method === 'eth_sendTransaction') return '0x' + 'cd'.repeat(32)
48
70
  return null
@@ -69,7 +91,14 @@ export function eip6963MockCode(opts) {
69
91
  `;
70
92
  }
71
93
  export async function injectEIP6963(page, opts) {
72
- // Inject provider via evaluateOnNewDocument (runs before page scripts)
94
+ // Con `privateKey` instala el puente de firma real ANTES de inyectar el mock.
95
+ if (opts.privateKey) {
96
+ await installRealSigner(page, {
97
+ privateKey: opts.privateKey,
98
+ name: opts.signerName,
99
+ typedDataName: opts.typedDataSignerName,
100
+ });
101
+ }
73
102
  await page.evaluateOnNewDocument(eip6963MockCode(opts));
74
103
  // Re-dispatch EIP-6963 event after page loads so wagmi catches it
75
104
  page.on('load', async () => {
@@ -1 +1 @@
1
- {"version":3,"file":"wallet-mock.js","sourceRoot":"","sources":["../../src/e2e/wallet-mock.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,wEAAwE;AACxE,qDAAqD;AACrD,EAAE;AACF,gFAAgF;AAShF,MAAM,UAAU,gBAAgB,CAAC,IAAsB;IACrD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAA;IACzB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAA;IACjC,MAAM,UAAU,GAAG,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC1C,OAAO;;;kBAGS,UAAU;0BACF,IAAI;;gDAEkB,UAAU;kDACR,IAAI;yDACG,IAAI;;;;;;;;;GAS1D,CAAA;AACH,CAAC;AAED,2EAA2E;AAC3E,kFAAkF;AAClF,MAAM,UAAU,eAAe,CAAC,IAE/B;IACC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAA;IACzB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAA;IACjC,MAAM,UAAU,GAAG,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,YAAY,CAAA;IAClD,OAAO;;;kBAGS,UAAU;0BACF,IAAI;;gDAEkB,UAAU;kDACR,IAAI;yDACG,IAAI;;;;;;;;;;;;;;;;;;eAkB9C,UAAU;;;;;;;GAOtB,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAa,EACb,IAAgD;IAEhD,uEAAuE;IACvE,MAAM,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAA;IACvD,kEAAkE;IAClE,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;QACzB,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;YACvB,MAAM,QAAQ,GAAI,MAAc,CAAC,QAAQ,CAAA;YACzC,IAAI,CAAC,QAAQ;gBAAE,OAAM;YACrB,MAAM,IAAI,GAAG;gBACX,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,gBAAgB;gBAChE,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,8DAA8D;gBACpE,IAAI,EAAE,iBAAiB;aACxB,CAAA;YACD,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,0BAA0B,EAAE;gBAC/D,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC3B,CAAC,CAAC,CAAA;QACL,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"wallet-mock.js","sourceRoot":"","sources":["../../src/e2e/wallet-mock.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=wallet-mock.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet-mock.test.d.ts","sourceRoot":"","sources":["../../src/e2e/wallet-mock.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { eip6963MockCode, ethereumMockCode } from './wallet-mock.js';
3
+ // P6 (m/REQ/14 Fase 3): sin `privateKey` el mock firma en falso (retrocompatible);
4
+ // con `privateKey` delega en el puente de `installRealSigner`.
5
+ describe('wallet-mock — firma real con privateKey', () => {
6
+ it('sin privateKey devuelve la firma falsa (retrocompatible)', () => {
7
+ const code = ethereumMockCode({ address: '0xabc' });
8
+ expect(code).toContain(`'0x' + 'ab'.repeat(65)`);
9
+ expect(code).not.toContain('__signMessage');
10
+ });
11
+ it('con privateKey delega en el puente real', () => {
12
+ const code = ethereumMockCode({ address: '0xabc', privateKey: '0x' + '11'.repeat(32) });
13
+ expect(code).toContain(`window['__signMessage'](params[0])`);
14
+ expect(code).toContain(`window['__signTypedData'](params[1])`);
15
+ expect(code).not.toContain(`'0x' + 'ab'.repeat(65)`);
16
+ });
17
+ it('respeta los nombres de puente personalizados (EIP-6963)', () => {
18
+ const code = eip6963MockCode({
19
+ address: '0xabc',
20
+ privateKey: '0x' + '11'.repeat(32),
21
+ signerName: '__firma',
22
+ typedDataSignerName: '__firmaTyped',
23
+ });
24
+ expect(code).toContain(`window['__firma'](params[0])`);
25
+ expect(code).toContain(`window['__firmaTyped'](params[1])`);
26
+ });
27
+ });
28
+ //# sourceMappingURL=wallet-mock.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet-mock.test.js","sourceRoot":"","sources":["../../src/e2e/wallet-mock.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC7C,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEpE,mFAAmF;AACnF,+DAA+D;AAC/D,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,IAAI,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;QACnD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAA;QAChD,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,IAAI,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QACvF,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAA;QAC5D,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,sCAAsC,CAAC,CAAA;QAC9D,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,IAAI,GAAG,eAAe,CAAC;YAC3B,OAAO,EAAE,OAAO;YAChB,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,UAAU,EAAE,SAAS;YACrB,mBAAmB,EAAE,cAAc;SACpC,CAAC,CAAA;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAA;QACtD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -8,7 +8,7 @@ declare const useFormField: () => {
8
8
  isDirty: boolean;
9
9
  isTouched: boolean;
10
10
  isValidating: boolean;
11
- error?: import("react-hook-form").FieldError;
11
+ error?: import("react-hook-form").FieldError | undefined;
12
12
  id: string;
13
13
  name: string;
14
14
  formItemId: string;
@@ -17,7 +17,9 @@ declare const useFormField: () => {
17
17
  };
18
18
  declare const FormItem: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
19
19
  declare const FormLabel: React.ForwardRefExoticComponent<Omit<LabelPrimitive.LabelProps & React.RefAttributes<HTMLLabelElement>, "ref"> & React.RefAttributes<HTMLLabelElement>>;
20
- declare const FormControl: React.ForwardRefExoticComponent<Omit<import("@radix-ui/react-slot").SlotProps & React.RefAttributes<HTMLElement>, "ref"> & React.RefAttributes<HTMLElement>>;
20
+ declare const FormControl: React.ForwardRefExoticComponent<Omit<React.HTMLAttributes<HTMLElement> & {
21
+ children?: React.ReactNode;
22
+ } & React.RefAttributes<HTMLElement>, "ref"> & React.RefAttributes<HTMLElement>>;
21
23
  declare const FormDescription: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & React.RefAttributes<HTMLParagraphElement>>;
22
24
  declare const FormMessage: React.ForwardRefExoticComponent<React.HTMLAttributes<HTMLParagraphElement> & React.RefAttributes<HTMLParagraphElement>>;
23
25
  export { useFormField, Form, FormItem, FormLabel, FormControl, FormDescription, FormMessage, FormField, };
@@ -1 +1 @@
1
- {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../../src/shadcn_components/ui/form.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAA;AAEvD,OAAO,EAEL,YAAY,EAEZ,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAA;AAKxB,QAAA,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,YAAY,CAAC,CAAgB,CAAA;AAa9E,QAAA,MAAM,SAAS,GACb,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,KAAK,SAAS,SAAS,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC,YAAY,CAAC,EAC/D,cAEC,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC,sBAMtC,CAAA;AAED,QAAA,MAAM,YAAY;;;;;;;;;;;CAqBjB,CAAA;AAUD,QAAA,MAAM,QAAQ,6GAWZ,CAAA;AAGF,QAAA,MAAM,SAAS,yJAcb,CAAA;AAGF,QAAA,MAAM,WAAW,8JAmBf,CAAA;AAGF,QAAA,MAAM,eAAe,yHAcnB,CAAA;AAGF,QAAA,MAAM,WAAW,yHAqBf,CAAA;AAGF,OAAO,EACL,YAAY,EACZ,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,WAAW,EACX,eAAe,EACf,WAAW,EACX,SAAS,GACV,CAAA"}
1
+ {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../../src/shadcn_components/ui/form.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,cAAc,MAAM,uBAAuB,CAAA;AAEvD,OAAO,EAEL,YAAY,EAEZ,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAA;AAKxB,QAAA,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,YAAY,CAAC,CAAgB,CAAA;AAa9E,QAAA,MAAM,SAAS,GACb,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,KAAK,SAAS,SAAS,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC,YAAY,CAAC,EAC/D,cAEC,eAAe,CAAC,YAAY,EAAE,KAAK,CAAC,sBAMtC,CAAA;AAED,QAAA,MAAM,YAAY;;;;;;;;;;;CAqBjB,CAAA;AAUD,QAAA,MAAM,QAAQ,6GAWZ,CAAA;AAGF,QAAA,MAAM,SAAS,yJAcb,CAAA;AAGF,QAAA,MAAM,WAAW;;gFAmBf,CAAA;AAGF,QAAA,MAAM,eAAe,yHAcnB,CAAA;AAGF,QAAA,MAAM,WAAW,yHAqBf,CAAA;AAGF,OAAO,EACL,YAAY,EACZ,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,WAAW,EACX,eAAe,EACf,WAAW,EACX,SAAS,GACV,CAAA"}
@@ -10,6 +10,7 @@ declare const sheetVariants: (props?: ({
10
10
  side?: "top" | "right" | "bottom" | "left" | null | undefined;
11
11
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
12
12
  interface SheetContentProps extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>, VariantProps<typeof sheetVariants> {
13
+ children?: React.ReactNode;
13
14
  }
14
15
  declare const SheetContent: React.ForwardRefExoticComponent<SheetContentProps & React.RefAttributes<HTMLDivElement>>;
15
16
  declare const SheetHeader: {
@@ -1 +1 @@
1
- {"version":3,"file":"sheet.d.ts","sourceRoot":"","sources":["../../../src/shadcn_components/ui/sheet.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,cAAc,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAKjE,QAAA,MAAM,KAAK,sCAAsB,CAAA;AAEjC,QAAA,MAAM,YAAY,6GAAyB,CAAA;AAE3C,QAAA,MAAM,UAAU,2GAAuB,CAAA;AAEvC,QAAA,MAAM,WAAW,4CAAwB,CAAA;AAEzC,QAAA,MAAM,YAAY,6JAYhB,CAAA;AAGF,QAAA,MAAM,aAAa;;8EAiBlB,CAAA;AAED,UAAU,iBACR,SACE,KAAK,CAAC,wBAAwB,CAAC,OAAO,cAAc,CAAC,OAAO,CAAC,EAC7D,YAAY,CAAC,OAAO,aAAa,CAAC;CAAG;AAEzC,QAAA,MAAM,YAAY,0FAkBhB,CAAA;AAGF,QAAA,MAAM,WAAW;8BAGd,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;;CAQtC,CAAA;AAGD,QAAA,MAAM,WAAW;8BAGd,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;;CAQtC,CAAA;AAGD,QAAA,MAAM,UAAU,mKASd,CAAA;AAGF,QAAA,MAAM,gBAAgB,6KASpB,CAAA;AAGF,OAAO,EACL,KAAK,EACL,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,gBAAgB,GACjB,CAAA"}
1
+ {"version":3,"file":"sheet.d.ts","sourceRoot":"","sources":["../../../src/shadcn_components/ui/sheet.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,cAAc,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAKjE,QAAA,MAAM,KAAK,sCAAsB,CAAA;AAEjC,QAAA,MAAM,YAAY,6GAAyB,CAAA;AAE3C,QAAA,MAAM,UAAU,2GAAuB,CAAA;AAEvC,QAAA,MAAM,WAAW,4CAAwB,CAAA;AAEzC,QAAA,MAAM,YAAY,6JAYhB,CAAA;AAGF,QAAA,MAAM,aAAa;;8EAiBlB,CAAA;AAED,UAAU,iBACR,SACE,KAAK,CAAC,wBAAwB,CAAC,OAAO,cAAc,CAAC,OAAO,CAAC,EAC7D,YAAY,CAAC,OAAO,aAAa,CAAC;IAIpC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAC3B;AAED,QAAA,MAAM,YAAY,0FAkBhB,CAAA;AAGF,QAAA,MAAM,WAAW;8BAGd,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;;CAQtC,CAAA;AAGD,QAAA,MAAM,WAAW;8BAGd,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC;;CAQtC,CAAA;AAGD,QAAA,MAAM,UAAU,mKASd,CAAA;AAGF,QAAA,MAAM,gBAAgB,6KASpB,CAAA;AAGF,OAAO,EACL,KAAK,EACL,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,gBAAgB,GACjB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"sheet.js","sourceRoot":"","sources":["../../../src/shadcn_components/ui/sheet.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sheet.js","sourceRoot":"","sources":["../../../src/shadcn_components/ui/sheet.tsx"],"names":[],"mappings":"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"}
@@ -13,12 +13,14 @@ format:
13
13
  pnpm format
14
14
 
15
15
  dev:
16
- ./bin/dev
16
+ pnpm dev
17
17
 
18
+ # Next 16 con Webpack: V8 crashea (Trace/BPT trap) con el límite de data por
19
+ # defecto en adJ/OpenBSD, así que el build sube a 7G.
18
20
  prod:
19
- pnpm build
21
+ sh -c 'ulimit -d 7340032 && pnpm build'
20
22
  ./bin/start > prod.log 2>&1 &
21
23
 
22
24
  all:
23
25
  pnpm i
24
- pnpm build
26
+ sh -c 'ulimit -d 7340032 && pnpm build'
@@ -1,5 +1,7 @@
1
1
  /// <reference types="next" />
2
2
  /// <reference types="next/image-types/global" />
3
+ import "./.next/types/routes.d.ts";
4
+ import "./.next/types/root-params.d.ts";
3
5
 
4
6
  // NOTE: This file should not be edited
5
7
  // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
@@ -5,8 +5,8 @@
5
5
  "description": "{{description}}",
6
6
  "type": "module",
7
7
  "scripts": {
8
- "dev": "next dev",
9
- "build": "next build",
8
+ "dev": "next dev --webpack",
9
+ "build": "next build --webpack",
10
10
  "start": "next start",
11
11
  "lint": "next lint",
12
12
  "test": "dotenv -e ../.env.test -- vitest run",
@@ -19,10 +19,10 @@
19
19
  "@pasosdejesus/m": "gitlab:pasosdejesus/m",
20
20
  "dotenv": "^17.4.2",
21
21
  "kysely-postgres-js": "3.0.0",
22
- "next": "15.5.22",
22
+ "next": "^16.0.0",
23
23
  "pg": "8.17.2",
24
- "react": "19.2.7",
25
- "react-dom": "19.2.7"
24
+ "react": "19.3.0",
25
+ "react-dom": "19.3.0"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@testing-library/react": "16.3.2",
@@ -25,7 +25,7 @@
25
25
  "incremental": true,
26
26
  "resolveJsonModule": true,
27
27
  "isolatedModules": true,
28
- "jsx": "preserve",
28
+ "jsx": "react-jsx",
29
29
  "plugins": [
30
30
  {
31
31
  "name": "next"
@@ -36,9 +36,10 @@
36
36
  "src/**/*.ts",
37
37
  "app/**/*.ts",
38
38
  "app/**/*.tsx",
39
- ".next/types/**/*.ts"
39
+ ".next/types/**/*.ts",
40
+ ".next/dev/types/**/*.ts"
40
41
  ],
41
42
  "exclude": [
42
43
  "node_modules"
43
44
  ]
44
- }
45
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pasosdejesus/m",
3
- "version": "0.22.3",
3
+ "version": "0.23.0",
4
4
  "description": "Motor para crear y gestionar proyectos al estilo Pasos de Jesus.",
5
5
  "author": "",
6
6
  "license": "ISC",
@@ -166,7 +166,7 @@
166
166
  "kysely-codegen": "^0.20.0",
167
167
  "kysely-ctl": "^0.21.0",
168
168
  "lucide-react": "^1.16.0",
169
- "next": "^15.5.21",
169
+ "next": "^16.0.0",
170
170
  "next-auth": "^4.24.15",
171
171
  "pg": "^8.21.0",
172
172
  "postcss": "^8.5.15",