@pasosdejesus/m 0.24.0 → 0.26.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 (169) hide show
  1. package/dist/CHANGELOG.md +75 -1
  2. package/dist/base-model/baseline.generated.d.ts +48 -0
  3. package/dist/base-model/baseline.generated.d.ts.map +1 -0
  4. package/dist/base-model/baseline.generated.js +930 -0
  5. package/dist/base-model/baseline.generated.js.map +1 -0
  6. package/dist/base-model/check.d.ts +6 -0
  7. package/dist/base-model/check.d.ts.map +1 -0
  8. package/dist/base-model/check.js +195 -0
  9. package/dist/base-model/check.js.map +1 -0
  10. package/dist/base-model/generate.d.ts +42 -0
  11. package/dist/base-model/generate.d.ts.map +1 -0
  12. package/dist/base-model/generate.js +241 -0
  13. package/dist/base-model/generate.js.map +1 -0
  14. package/dist/base-model/guidelines.d.ts +13 -0
  15. package/dist/base-model/guidelines.d.ts.map +1 -0
  16. package/dist/base-model/guidelines.js +61 -0
  17. package/dist/base-model/guidelines.js.map +1 -0
  18. package/dist/base-model/index.d.ts +22 -0
  19. package/dist/base-model/index.d.ts.map +1 -0
  20. package/dist/base-model/index.js +26 -0
  21. package/dist/base-model/index.js.map +1 -0
  22. package/dist/base-model/parse-structure.d.ts +4 -0
  23. package/dist/base-model/parse-structure.d.ts.map +1 -0
  24. package/dist/base-model/parse-structure.js +170 -0
  25. package/dist/base-model/parse-structure.js.map +1 -0
  26. package/dist/base-model/queries.d.ts +34 -0
  27. package/dist/base-model/queries.d.ts.map +1 -0
  28. package/dist/base-model/queries.js +118 -0
  29. package/dist/base-model/queries.js.map +1 -0
  30. package/dist/base-model/references/learn-tg.d.ts +21 -0
  31. package/dist/base-model/references/learn-tg.d.ts.map +1 -0
  32. package/dist/base-model/references/learn-tg.js +65 -0
  33. package/dist/base-model/references/learn-tg.js.map +1 -0
  34. package/dist/base-model/references/msip.d.ts +29 -0
  35. package/dist/base-model/references/msip.d.ts.map +1 -0
  36. package/dist/base-model/references/msip.js +33 -0
  37. package/dist/base-model/references/msip.js.map +1 -0
  38. package/dist/base-model/types.d.ts +207 -0
  39. package/dist/base-model/types.d.ts.map +1 -0
  40. package/dist/base-model/types.js +10 -0
  41. package/dist/base-model/types.js.map +1 -0
  42. package/dist/base-model/version.d.ts +19 -0
  43. package/dist/base-model/version.d.ts.map +1 -0
  44. package/dist/base-model/version.js +26 -0
  45. package/dist/base-model/version.js.map +1 -0
  46. package/dist/base-model/wallet-link.d.ts +69 -0
  47. package/dist/base-model/wallet-link.d.ts.map +1 -0
  48. package/dist/base-model/wallet-link.js +220 -0
  49. package/dist/base-model/wallet-link.js.map +1 -0
  50. package/dist/base-model/wallet-link.test.d.ts +2 -0
  51. package/dist/base-model/wallet-link.test.d.ts.map +1 -0
  52. package/dist/base-model/wallet-link.test.js +147 -0
  53. package/dist/base-model/wallet-link.test.js.map +1 -0
  54. package/dist/e2e/full-wallet.d.ts +19 -0
  55. package/dist/e2e/full-wallet.d.ts.map +1 -1
  56. package/dist/e2e/full-wallet.js +12 -4
  57. package/dist/e2e/full-wallet.js.map +1 -1
  58. package/dist/e2e/full-wallet.test.js +26 -0
  59. package/dist/e2e/full-wallet.test.js.map +1 -1
  60. package/dist/e2e/in-app-wallet.d.ts +23 -0
  61. package/dist/e2e/in-app-wallet.d.ts.map +1 -0
  62. package/dist/e2e/in-app-wallet.js +40 -0
  63. package/dist/e2e/in-app-wallet.js.map +1 -0
  64. package/dist/e2e/in-app-wallet.test.d.ts +2 -0
  65. package/dist/e2e/in-app-wallet.test.d.ts.map +1 -0
  66. package/dist/e2e/in-app-wallet.test.js +52 -0
  67. package/dist/e2e/in-app-wallet.test.js.map +1 -0
  68. package/dist/e2e/index.d.ts +5 -1
  69. package/dist/e2e/index.d.ts.map +1 -1
  70. package/dist/e2e/index.js +2 -0
  71. package/dist/e2e/index.js.map +1 -1
  72. package/dist/e2e/warmup.d.ts +38 -0
  73. package/dist/e2e/warmup.d.ts.map +1 -0
  74. package/dist/e2e/warmup.js +84 -0
  75. package/dist/e2e/warmup.js.map +1 -0
  76. package/dist/e2e/warmup.test.d.ts +2 -0
  77. package/dist/e2e/warmup.test.d.ts.map +1 -0
  78. package/dist/e2e/warmup.test.js +67 -0
  79. package/dist/e2e/warmup.test.js.map +1 -0
  80. package/dist/i18n/locales/cli.d.ts.map +1 -1
  81. package/dist/i18n/locales/cli.js +10 -0
  82. package/dist/i18n/locales/cli.js.map +1 -1
  83. package/dist/m.js +19 -1
  84. package/dist/m.js.map +1 -1
  85. package/dist/tasks/base-model.d.ts +4 -0
  86. package/dist/tasks/base-model.d.ts.map +1 -0
  87. package/dist/tasks/base-model.js +260 -0
  88. package/dist/tasks/base-model.js.map +1 -0
  89. package/dist/tasks/db.d.ts.map +1 -1
  90. package/dist/tasks/db.js +27 -0
  91. package/dist/tasks/db.js.map +1 -1
  92. package/dist/tasks/e2e-summary.d.ts +13 -0
  93. package/dist/tasks/e2e-summary.d.ts.map +1 -0
  94. package/dist/tasks/e2e-summary.js +117 -0
  95. package/dist/tasks/e2e-summary.js.map +1 -0
  96. package/dist/tasks/e2e.d.ts +29 -0
  97. package/dist/tasks/e2e.d.ts.map +1 -1
  98. package/dist/tasks/e2e.js +130 -36
  99. package/dist/tasks/e2e.js.map +1 -1
  100. package/dist/tasks/e2e.test.d.ts +2 -0
  101. package/dist/tasks/e2e.test.d.ts.map +1 -0
  102. package/dist/tasks/e2e.test.js +108 -0
  103. package/dist/tasks/e2e.test.js.map +1 -0
  104. package/dist/tasks/warmup.d.ts +4 -0
  105. package/dist/tasks/warmup.d.ts.map +1 -0
  106. package/dist/tasks/warmup.js +67 -0
  107. package/dist/tasks/warmup.js.map +1 -0
  108. package/dist/tasks/warmup.test.d.ts +2 -0
  109. package/dist/tasks/warmup.test.d.ts.map +1 -0
  110. package/dist/tasks/warmup.test.js +40 -0
  111. package/dist/tasks/warmup.test.js.map +1 -0
  112. package/dist/templates/apps/nextjs/package.json.hbs +1 -1
  113. package/dist/test-utils/console.d.ts +37 -0
  114. package/dist/test-utils/console.d.ts.map +1 -0
  115. package/dist/test-utils/console.js +52 -0
  116. package/dist/test-utils/console.js.map +1 -0
  117. package/dist/test-utils/console.test.d.ts +2 -0
  118. package/dist/test-utils/console.test.d.ts.map +1 -0
  119. package/dist/test-utils/console.test.js +57 -0
  120. package/dist/test-utils/console.test.js.map +1 -0
  121. package/dist/test-utils/index.d.ts +1 -0
  122. package/dist/test-utils/index.d.ts.map +1 -1
  123. package/dist/test-utils/index.js +1 -0
  124. package/dist/test-utils/index.js.map +1 -1
  125. package/dist/test-utils/kysely-mocks.d.ts +163 -33
  126. package/dist/test-utils/kysely-mocks.d.ts.map +1 -1
  127. package/dist/test-utils/kysely-mocks.js +147 -18
  128. package/dist/test-utils/kysely-mocks.js.map +1 -1
  129. package/dist/test-utils/kysely-mocks.test.d.ts +2 -0
  130. package/dist/test-utils/kysely-mocks.test.d.ts.map +1 -0
  131. package/dist/test-utils/kysely-mocks.test.js +94 -0
  132. package/dist/test-utils/kysely-mocks.test.js.map +1 -0
  133. package/dist/wallet/next/components/InAppWalletSetup.d.ts +11 -0
  134. package/dist/wallet/next/components/InAppWalletSetup.d.ts.map +1 -0
  135. package/dist/wallet/next/components/InAppWalletSetup.js +55 -0
  136. package/dist/wallet/next/components/InAppWalletSetup.js.map +1 -0
  137. package/dist/wallet/next/components/InAppWalletUnlock.d.ts +9 -0
  138. package/dist/wallet/next/components/InAppWalletUnlock.d.ts.map +1 -0
  139. package/dist/wallet/next/components/InAppWalletUnlock.js +29 -0
  140. package/dist/wallet/next/components/InAppWalletUnlock.js.map +1 -0
  141. package/dist/wallet/next/components.test.d.ts +2 -0
  142. package/dist/wallet/next/components.test.d.ts.map +1 -0
  143. package/dist/wallet/next/components.test.js +122 -0
  144. package/dist/wallet/next/components.test.js.map +1 -0
  145. package/dist/wallet/next/i18n.d.ts +63 -0
  146. package/dist/wallet/next/i18n.d.ts.map +1 -0
  147. package/dist/wallet/next/i18n.js +64 -0
  148. package/dist/wallet/next/i18n.js.map +1 -0
  149. package/dist/wallet/next/index.d.ts +7 -0
  150. package/dist/wallet/next/index.d.ts.map +1 -0
  151. package/dist/wallet/next/index.js +12 -0
  152. package/dist/wallet/next/index.js.map +1 -0
  153. package/dist/wallet/next/namespaces.d.ts +17 -0
  154. package/dist/wallet/next/namespaces.d.ts.map +1 -0
  155. package/dist/wallet/next/namespaces.js +17 -0
  156. package/dist/wallet/next/namespaces.js.map +1 -0
  157. package/dist/wallet/next/useInAppWallet.d.ts +55 -0
  158. package/dist/wallet/next/useInAppWallet.d.ts.map +1 -0
  159. package/dist/wallet/next/useInAppWallet.js +261 -0
  160. package/dist/wallet/next/useInAppWallet.js.map +1 -0
  161. package/dist/wallet/next/useInAppWallet.test.d.ts +2 -0
  162. package/dist/wallet/next/useInAppWallet.test.d.ts.map +1 -0
  163. package/dist/wallet/next/useInAppWallet.test.js +261 -0
  164. package/dist/wallet/next/useInAppWallet.test.js.map +1 -0
  165. package/package.json +9 -1
  166. package/src/e2e/README.md +58 -0
  167. package/src/tasks/README.md +1 -0
  168. package/src/test-utils/README.md +28 -0
  169. package/src/wallet/README.md +25 -2
package/src/e2e/README.md CHANGED
@@ -123,6 +123,30 @@ await setupFullWalletMock(page, { privateKey: process.env.PRIVATE_KEY })
123
123
  await setupFullWalletMock(page, { privateKey: process.env.PRIVATE_KEY, rpcUrl: process.env.RPC_URL })
124
124
  ```
125
125
 
126
+ **Mock parity (`m/REQ/49` 14).** Without `rpcUrl`, `eth_getTransactionReceipt` used to return
127
+ `null`, so a spec that sends and awaits confirmation hung. Now `setupFullWalletMock` (and
128
+ `fullWalletMockCode`) accept `fakeReceipt` (`{status, blockNumber, transactionHash, logs}`),
129
+ `fakeCelo`, `fakeCallResult` and `fakeTxHash`:
130
+
131
+ ```js
132
+ await setupFullWalletMock(page, {
133
+ privateKey: process.env.PRIVATE_KEY,
134
+ fakeReceipt: { status: '0x1', blockNumber: '0x1312D01', logs: [] },
135
+ })
136
+ ```
137
+
138
+ ### In-app wallet driver (`m/REQ/49` 15)
139
+
140
+ Drives the `m/wallet/next` components by their testids, so consumers do not rewrite selectors:
141
+
142
+ ```ts
143
+ setupInAppWallet(page, { password, mnemonic?, privateKey?, timeoutMs? }): Promise<void>
144
+ unlockInAppWallet(page, { password, timeoutMs? }): Promise<void>
145
+ ```
146
+
147
+ With `mnemonic`/`privateKey` it switches to import mode; otherwise it creates a new wallet. It
148
+ selects by testid/`type` (not by localized text), so it works with any `lang`.
149
+
126
150
  ### Local EVM node (`m/REQ/14`)
127
151
 
128
152
  ```ts
@@ -151,6 +175,40 @@ Lessons that cost time here (see also learn.tg's `doc/e2e-testing.md`):
151
175
  - **Receipt hashes**: the local node re-signs, so `setupFullWalletMock` re-keys the receipt
152
176
  under `keccak256(rawTransaction)` (the hash viem waits for).
153
177
 
178
+ ### Runner: retry and summary (`m/REQ/49` P3/P4)
179
+
180
+ ```sh
181
+ ./bin/m test:e2e --retry 2 --retry-delay 15000 # re-run failed specs (fresh WALLET_INDEX each)
182
+ ./bin/m test:e2e:summary /tmp/site.log /tmp/local.log # compare two runs
183
+ ```
184
+
185
+ - `--retry <N>` (default 0, or `E2E_RETRIES`): after the first pass, each failed spec is re-run
186
+ on its own up to N times; a spec is green **only by exit code**.
187
+ - `--retry-delay <ms>` (default 15000): pause before each retry round.
188
+ - `E2E_LOG_DIR` (default `/tmp`): the run writes `<dir>/e2e-<timestamp>.log` with one
189
+ `[e2e-result] <file> <ok|fail|skip>` line per spec per attempt (the machine-readable format).
190
+ - `test:e2e:summary <log…>` reads those lines (or the human format for older logs) and prints a
191
+ row per spec, one column per log, marking `<-- difiere` when a spec's state changes between
192
+ runs (environmental vs product failure).
193
+
194
+ ### Site warmup (`m/REQ/49` P5)
195
+
196
+ ```ts
197
+ warmup(baseUrl, { paths, mode?, filter?, sequentialTimeoutMs?, parallelTimeoutMs?,
198
+ rejectUnauthorized?, slowMs?, logger?, request? }): Promise<WarmupOutcome>
199
+ ```
200
+
201
+ Two passes: compile sequentially (a cold `next dev` dies under parallel load), then verify in
202
+ parallel. Reports routes that stay slow (>`slowMs`, default 15 s) and **does not fail on 4xx**
203
+ (only informs). `mode: 'sequential'` runs a single pass (the learn.tg local case).
204
+
205
+ ```sh
206
+ ./bin/m warmup [filter] [--sequential] # SITE_URL from env; paths from the consumer
207
+ ```
208
+
209
+ The route list lives in the consumer: `e2e/warmup-paths.json` (`["/en", "/api/x"]` or
210
+ `{"paths": […]}`) or `package.json:e2e.warmupPaths`.
211
+
154
212
  ## Environment Variables
155
213
 
156
214
  See [doc/e2e.md](../../../../doc/e2e.md) for full reference.
@@ -13,6 +13,7 @@ Each file in this directory exports a `runXxx()` function registered in `../m.ts
13
13
  | File | Commands | Purpose |
14
14
  |------|----------|---------|
15
15
  | `context.ts` | `ai:context` | Orchestrates the project context document (schema 1): detection, profiles, filters, budget and output |
16
+ | `base-model.ts` | `base-model:dump`, `base-model:verify` | Generates the base-model baseline from a reference and guards its derivation |
16
17
  | `context-workspaces.ts` | *(internal)* | Detects project types and workspace roots (`rails`, `nextjs`, `hardhat`, `monorepo`, `node`) |
17
18
  | `context-profiles.ts` | *(internal)* | Built-in task profiles plus JSON config loading, merging and validation |
18
19
  | `context-ignore.ts` | *(internal)* | Default exclusions, absolute secrets deny list and filter precedence |
@@ -284,6 +284,16 @@ beforeEach(() => {
284
284
  - Mock for `pg.Pool` of PostgreSQL
285
285
  - **Lesson learned:** The `sql.val()` method is crucial for queries using template tags
286
286
 
287
+ **Builder coverage (`m/REQ/49` U1):** `MockKysely`/`apiDbMocks` ahora cubren lo que usan las
288
+ rutas reales, así que puedes **borrar tu `GlobalMockKysely` escrito a mano**:
289
+ - `eb.or`/`eb.and`/`eb.not`/`eb.exists` y el callback `eb('col', 'in', cb => …)`. Si tienes el mock
290
+ de `kysely` a module scope, pásale `eb: apiDbMocks.mockEb` o importa `createExpressionBuilder()`.
291
+ - `where(sql`…`)`, `having`, `groupBy` y subconsulta-como-tabla (`db.selectFrom(base.as('lb'))`).
292
+ - `onConflict(b => b.column('id').doNothing())`, `transaction().execute(cb)` y `getExecutor()`.
293
+ - `fn.countAll/sum/avg/max/min` (`db.select(cb)` recibe `{ fn, eb, sql }`).
294
+ - `mockSql` (de `createMockSql()`) trae `raw`/`ref`/`val`/`literal`/`join`; `apiDbMocks.mockEb`
295
+ expone el `eb`. `GlobalMockKysely` se exporta como alias de `MockKysely`.
296
+
287
297
  ### 3. `radix-mocks.tsx` – UI Components
288
298
 
289
299
  **Purpose:** Mock Radix UI components for React component tests.
@@ -377,6 +387,24 @@ viemMocks.createPublicClient.mockReturnValue({ ... })
377
387
  - Mock chains are extensible; add new chains as needed
378
388
  - **Lesson learned:** Some functions like `privateKeyToAccount` and `formatUnits` are necessary for transaction tests
379
389
 
390
+ ### 6. `console.ts` – Silenciar ruido esperado de consola
391
+
392
+ **Purpose:** Ocultar ruido esperado en las pruebas (reintentos, navegaciones canceladas,
393
+ warnings de una dependencia simulada). Graduado de `NOISY_PATTERNS` de learn.tg (`m/REQ/49` U2).
394
+
395
+ ```typescript
396
+ import { silenceConsole } from '@pasosdejesus/m/test-utils/console'
397
+
398
+ const silence = silenceConsole(['[retry]', 'AbortError'])
399
+ // … ejercita el código …
400
+ silence.restore()
401
+ ```
402
+
403
+ - `silenceConsole(patterns, opts?)`: envuelve `console.log/warn/error` (configurable con
404
+ `opts.methods`) y suprime la llamada cuando algún argumento contiene un patrón; el resto pasa.
405
+ - Los argumentos no-cadena se comparan por su `message` (Error) o `String()`.
406
+ - Devuelve `{ restore(), suppressed }`; `suppressed` guarda los argumentos suprimidos.
407
+
380
408
  ## Complete Usage Examples
381
409
 
382
410
  ### Configuration for API Route Tests
@@ -68,6 +68,29 @@ setDestinationsPrefix('learn.tg.pdj-wallet.') // localStorage
68
68
  setRpName('learn.tg') // nombre de la credencial WebAuthn
69
69
  ```
70
70
 
71
+ ## React (`./wallet/next`)
72
+
73
+ Capa React de la billetera in-app (`m/REQ/37`, graduada de `learn.tg/packages/pdj-wallet-next`):
74
+
75
+ ```tsx
76
+ import {
77
+ useInAppWallet, InAppWalletSetup, InAppWalletUnlock, configureInAppWallet,
78
+ } from '@pasosdejesus/m/wallet/next'
79
+
80
+ // Conserva tu namespace si ya tienes billeteras creadas:
81
+ configureInAppWallet({
82
+ dbName: 'learn-tg-pdj-wallet',
83
+ destinationsPrefix: 'learn.tg.pdj-wallet.',
84
+ rpName: 'learn.tg',
85
+ })
86
+
87
+ // Textos: por defecto en/es; el host puede inyectar los suyos:
88
+ <InAppWalletSetup lang="es" messages={{ createTitle: 'Abrir cartera' }} onDone={(a) => {}} />
89
+ ```
90
+
91
+ `react` es un *optional peer*: el subpath está fuera del barrel, así que importar
92
+ `@pasosdejesus/m/wallet` no arrastra React.
93
+
71
94
  ## Pruebas
72
95
 
73
96
  Mocks en `@pasosdejesus/m/test-utils` (`installLocalStorage`, `installIndexedDB`,
@@ -91,6 +114,6 @@ O a mano: `import { setupWalletTests } from '@pasosdejesus/m/test-utils'; setupW
91
114
  ## Notas
92
115
 
93
116
  - Fase 1/2 de `m/REQ/14`: primitivas, estado, storage, provider, WebAuthn (L1/L2),
94
- destinos y resolutor EIP-6963. La billetera integrada (hook/UI React) vive en el
95
- consumidor o en un futuro `@pasosdejesus/m/wallet-react`.
117
+ destinos y resolutor EIP-6963. La capa React (hook + `InAppWalletSetup`/`InAppWalletUnlock`)
118
+ vive en el subpath `./wallet/next` (`m/REQ/37`).
96
119
  - E2E con firma real: `@pasosdejesus/m/e2e` (`injectEIP6963`, `setupFullWalletMock`).