@pasosdejesus/m 0.31.2 → 0.32.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/dist/CHANGELOG.md CHANGED
@@ -2,6 +2,50 @@
2
2
 
3
3
  All notable changes to `@pasosdejesus/m` are documented in this file.
4
4
 
5
+ ## [0.32.0] - 2026-10-18
6
+
7
+ ### Changed — pnpm 11 across the repo, the template and CI
8
+
9
+ - `packageManager` is now **`pnpm@11.28.6`** in the root and every package, and `.gitlab-ci.yml`
10
+ uses pnpm 11. Measured on OpenBSD/adJ: build, typecheck, `dist-check`, unit suites, integration
11
+ suite, `m:create` plus the generated project, and the consumers `sivel3`, `learn.tg` and
12
+ `stable-sl` (REQ/54).
13
+ - **Settings moved**: `pnpm.overrides` lives in `pnpm-workspace.yaml` (pnpm 11 ignores the field in
14
+ `package.json`), `onlyBuiltDependencies`/`trustedDependencies` became `allowBuilds`, and
15
+ `packageManagerStrict*` was removed (no longer recognized).
16
+ - **`allowBuilds` is mandatory**: pnpm 11 fails with `ERR_PNPM_IGNORED_BUILDS` when a dependency
17
+ with an install script is missing (`@pasosdejesus/m`, `secp256k1`, `esbuild`, …). `secp256k1@4.0.5`
18
+ compiles natively on OpenBSD.
19
+ - **Supply-chain policy**: `minimumReleaseAge` (24 h) rejects a lockfile containing freshly published
20
+ packages, even with `--frozen-lockfile`; consumers that update right after a release need
21
+ `minimumReleaseAgeExclude: ['@pasosdejesus/*']` (validated in `learn.tg` and `stable-sl`).
22
+ - The **template** and the test project generate a pnpm 11 workspace (same `apps/*` layout and
23
+ `catalog:`); `apps/hardhat`/`apps/nextjs` were already renamed in `0.31.0`.
24
+ - **Docs**: `doc/pnpm.md` describes v11 and the settings that changed; `packages/mpdj/SKILL.md` no
25
+ longer claims that v11 breaks React; the template README installs `pnpm@11`.
26
+
27
+
28
+ ### Changed — `@pasosdejesus/wallet` panel: locked send
29
+
30
+ - The **Send** tab now always states why it cannot send. A locked wallet shows the
31
+ `needWallet` reason plus an **Unlock wallet** button (`onRequestUnlock`); a locked
32
+ panel no longer shows the generic "invalid address" while the real cause is the
33
+ lock. Terminal reason is still `validateSend()`.
34
+ - **Diagnostics**: the panel logs to `@pasosdejesus/m/debug` (tag `wallet-panel`)
35
+ its open state (address, tokens), whether a signer is available, blocked /
36
+ started / failed sends with the `validateSend()` reason and the error
37
+ code/message, per-token balance failures, and refused `Max` presses. They are
38
+ console output always and DebugConsole output when enabled.
39
+
40
+ ### Documentation — `@pasosdejesus/m/wba`
41
+
42
+ - `wba/README.md` now documents the **connection lifecycle**: `makeEventHandler` and
43
+ `makeSummaryHandler` never destroy the Kysely client (the factory owns the pool), a shared `pg.Pool`
44
+ must be a module-level singleton preserved through hot reload and bounded with `max`, and
45
+ `destroy()` is only for the code that created and owns the pool (CLI or migration scripts). The
46
+ previous example called `db.destroy()`, which would end a shared pool for every later request
47
+ ("Cannot use a pool after calling end on the pool"). `makeSummaryHandler`'s docblock says the same.
48
+
5
49
  ## [0.31.2] - 2026-10-17
6
50
 
7
51
  ### Added — `m:check` (project layout verification)
@@ -26,7 +26,7 @@ pnpm is not in OpenBSD ports. Install via npm:
26
26
 
27
27
  ```bash
28
28
  doas pkg_add node
29
- npm install -g pnpm@10
29
+ npm install -g pnpm@11
30
30
  ```
31
31
 
32
32
  If using Hardhat on OpenBSD/adJ, run the preparation script:
@@ -101,7 +101,7 @@ Desde la raíz: `make test` y `make type` corren ambos; `make all` instala (y co
101
101
  ## Troubleshooting
102
102
 
103
103
  ### pnpm issues on OpenBSD
104
- Install from npm: `npm install -g pnpm@10`. If it fails, use npm.
104
+ Install from npm: `npm install -g pnpm@11`. If it fails, use npm.
105
105
 
106
106
  ### Database connection
107
107
  ```bash
File without changes
File without changes
File without changes
File without changes
@@ -2,7 +2,7 @@
2
2
  "name": "{{name}}",
3
3
  "private": true,
4
4
  "description": "{{description}}",
5
- "packageManager": "pnpm@10.34.5",
5
+ "packageManager": "pnpm@11.28.6",
6
6
  "scripts": {
7
7
  "dev": "pnpm -r dev",
8
8
  "build": "pnpm -r build",
@@ -11,7 +11,7 @@ packages:
11
11
  catalog:
12
12
  # ecosistema y motores
13
13
  '@pasosdejesus/m': ^{{m_version}}
14
- '@pasosdejesus/mpdj': ^0.2.14
14
+ '@pasosdejesus/mpdj': ^0.2.15
15
15
  '@pasosdejesus/usdt': ^0.1.3
16
16
  # compartidas por apps/web y apps/contracts
17
17
  typescript: 5.9.3
@@ -28,6 +28,7 @@ catalog:
28
28
  # Paquetes cuyo script de instalación se permite ejecutar (OpenBSD/adJ).
29
29
  allowBuilds:
30
30
  '@pasosdejesus/m': true
31
+ secp256k1: true
31
32
  bufferutil: true
32
33
  esbuild: true
33
34
  keccak: true
@@ -36,6 +36,10 @@ type DbFactory = () => Kysely<unknown>;
36
36
  *
37
37
  * @param dbFactory Function that returns a fresh Kysely instance per request.
38
38
  * @param opts Optional overrides (e.g. transaction table name).
39
+ *
40
+ * The handler never destroys the client; the factory owns the pool and its
41
+ * lifecycle. Destroying a client backed by a shared pool would end it for
42
+ * every later request ("Cannot use a pool after calling end on the pool").
39
43
  */
40
44
  export declare function makeSummaryHandler(dbFactory: DbFactory, opts?: SummaryOptions): (_request: NextRequest) => Promise<NextResponse<SummaryResponse> | NextResponse<{
41
45
  error: string;
@@ -1 +1 @@
1
- {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../../src/wba/routes/summary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAO,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAEhB,MAAM,aAAa,CAAA;AAEpB;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,SAAc;;;;UAmBtF;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,SAAgB,iBAmB3F;AAED,KAAK,SAAS,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAA;AAStC;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,EACpB,IAAI,CAAC,EAAE,cAAc,IAIK,UAAU,WAAW;;IA6GhD"}
1
+ {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../../src/wba/routes/summary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAO,KAAK,MAAM,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAEhB,MAAM,aAAa,CAAA;AAEpB;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,SAAc;;;;UAmBtF;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,SAAgB,iBAmB3F;AAED,KAAK,SAAS,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAA;AAStC;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,EACpB,IAAI,CAAC,EAAE,cAAc,IAIK,UAAU,WAAW;;IA6GhD"}
@@ -64,6 +64,10 @@ const toStr = (rows, fallback = '0') => rows?.[0] ? String(rows[0].v ?? fallback
64
64
  *
65
65
  * @param dbFactory Function that returns a fresh Kysely instance per request.
66
66
  * @param opts Optional overrides (e.g. transaction table name).
67
+ *
68
+ * The handler never destroys the client; the factory owns the pool and its
69
+ * lifecycle. Destroying a client backed by a shared pool would end it for
70
+ * every later request ("Cannot use a pool after calling end on the pool").
67
71
  */
68
72
  export function makeSummaryHandler(dbFactory, opts) {
69
73
  const txTable = opts?.transactionTable ?? 'transaction';
@@ -1 +1 @@
1
- {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../../src/wba/routes/summary.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../../src/wba/routes/summary.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pasosdejesus/m",
3
- "version": "0.31.2",
3
+ "version": "0.32.0",
4
4
  "description": "Motor para crear y gestionar proyectos al estilo Pasos de Jesus.",
5
5
  "author": "",
6
6
  "license": "ISC",
@@ -145,6 +145,7 @@
145
145
  "@pasosdejesus/edr": "0.1.2"
146
146
  },
147
147
  "devDependencies": {
148
+ "@pasosdejesus/msip": "1.1.0",
148
149
  "@radix-ui/react-accordion": "^1.2.12",
149
150
  "@radix-ui/react-alert-dialog": "^1.1.15",
150
151
  "@radix-ui/react-avatar": "^1.1.11",
@@ -194,8 +195,7 @@
194
195
  "typescript": "^5.9.3",
195
196
  "viem": "^2.55.0",
196
197
  "vitest": "3.2.6",
197
- "wagmi": "^2.19.5",
198
- "@pasosdejesus/msip": "1.1.0"
198
+ "wagmi": "^2.19.5"
199
199
  },
200
200
  "optionalPeerDependencies": {
201
201
  "@radix-ui/react-accordion": "^1.2.12",
package/src/wba/README.md CHANGED
@@ -20,8 +20,8 @@ Eliminates code duplication between sivel.xyz and learn.tg.
20
20
 
21
21
  | Export | Type | Purpose |
22
22
  |--------|------|---------|
23
- | `makeEventHandler(dbFactory, tableName?)` | factory | Returns a Next.js `POST` handler that enriches with headers and calls `recordEvent`. |
24
- | `makeSummaryHandler(dbFactory, opts?)` | factory | Returns a Next.js `GET` handler with web + on-chain analytics. |
23
+ | `makeEventHandler(dbFactory, tableName?)` | factory | Returns a Next.js `POST` handler that enriches with headers and calls `recordEvent`. It never destroys the client; the factory owns the pool. |
24
+ | `makeSummaryHandler(dbFactory, opts?)` | factory | Returns a Next.js `GET` handler with web + on-chain analytics. It never destroys the client; the factory owns the pool. |
25
25
 
26
26
  ## Usage
27
27
 
@@ -168,8 +168,53 @@ export async function GET(req: NextRequest) {
168
168
  `.execute(db)
169
169
  data.onChain.totalLearningPoints = lpRows.rows[0]?.v || '0'
170
170
 
171
- await db.destroy()
171
+ // Do not destroy the client: m does not own it. If dbFactory returns a
172
+ // client backed by a shared pg.Pool, destroy() closes it for every request.
172
173
  return NextResponse.json(data)
173
174
  }
174
175
  ```
175
176
 
177
+ ## Connection lifecycle
178
+
179
+ Applies to **both** factories (`makeEventHandler` and `makeSummaryHandler`).
180
+ `dbFactory` returns a Kysely client for the handler to **use**. m never calls
181
+ `destroy()` on it; the factory (the project) owns the client and its pool.
182
+
183
+ - **Shared pool (recommended for long-lived servers).** One `pg.Pool` per
184
+ process, reused by every request (as sivel3 does). Never call `db.destroy()`
185
+ on these clients: Kysely ends the pool and every later request fails with
186
+ `Cannot use a pool after calling end on the pool`.
187
+ - **Per-call pool.** A fresh `pg.Pool` per factory call (as learn.tg does
188
+ today; tracked as technical debt in its own repository). `destroy()` closes
189
+ only that client's pool, but a pool per request can exhaust Postgres
190
+ connections under load.
191
+
192
+ ### Recommended pattern (Next.js)
193
+
194
+ One module-level pool, reused by every request and preserved through hot reload:
195
+
196
+ ```typescript
197
+ // lib/db.ts
198
+ import { Pool } from 'pg'
199
+ import { Kysely, PostgresDialect } from 'kysely'
200
+
201
+ const globalForDb = globalThis as unknown as { __pgPool?: Pool }
202
+
203
+ const pool = globalForDb.__pgPool ?? new Pool({
204
+ connectionString: process.env.DATABASE_URL,
205
+ max: Number(process.env.PG_POOL_MAX ?? 10),
206
+ })
207
+ if (process.env.NODE_ENV !== 'production') globalForDb.__pgPool = pool
208
+
209
+ export const db = new Kysely({ dialect: new PostgresDialect({ pool }) })
210
+ export const dbFactory = () => db
211
+ ```
212
+
213
+ `max` bounds the server connections: size it against PostgreSQL
214
+ `max_connections` and the number of application instances. Do not create the
215
+ pool inside the handler or the factory: each request would open its own pool.
216
+
217
+ Rule of thumb: call `destroy()` only when the same function created and owns
218
+ the pool and the process is about to exit (CLI or migration scripts). Server
219
+ routes should share one pool and never destroy it.
220
+