@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 +44 -0
- package/dist/templates/README.md.hbs +2 -2
- package/dist/templates/apps/contracts/bin/MusdtVerification +0 -0
- package/dist/templates/apps/contracts/bin/approveDepositOwner +0 -0
- package/dist/templates/apps/contracts/bin/contractVerification +0 -0
- package/dist/templates/apps/contracts/bin/deployMockUSDT +0 -0
- package/dist/templates/apps/contracts/bin/prepadJ.sh +0 -0
- package/dist/templates/apps/contracts/bin/verifyMockUSDT +0 -0
- package/dist/templates/apps/contracts/sync-abis.mjs +0 -0
- package/dist/templates/package.json.hbs +1 -1
- package/dist/templates/pnpm-workspace.yaml.hbs +2 -1
- package/dist/wba/routes/summary.d.ts +4 -0
- package/dist/wba/routes/summary.d.ts.map +1 -1
- package/dist/wba/routes/summary.js +4 -0
- package/dist/wba/routes/summary.js.map +1 -1
- package/package.json +3 -3
- package/src/wba/README.md +48 -3
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@
|
|
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@
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -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
|
+
'@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
|
|
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":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,GAAG,EAAe,MAAM,QAAQ,CAAA;AACzC,OAAO,EAAe,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAO1D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,EAAmB,EAAE,SAAS,GAAG,WAAW;IACrF,MAAM,MAAM,GAAG,MAAM,GAAG,CAA4C;;;yBAG7C,SAAS;;GAE/B,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAEb,MAAM,IAAI,GAAG,MAAM,CAAC,IAAa,CAAA;IACjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA,CAAC,qCAAqC;IAExE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAA;IACrD,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,CAAC,CAAA;IAC/D,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAErD,MAAM,QAAQ,GAA2B,EAAE,CAAA;IAC3C,KAAK,MAAM,CAAC,IAAI,IAAI;QAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,SAAS,CAAA;IAE3D,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,EAAmB,EAAE,SAAS,GAAG,aAAa;IAC1F,MAAM,MAAM,GAAG,MAAM,GAAG,CAA4C;;;yBAG7C,SAAS;;GAE/B,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAEb,MAAM,OAAO,GAAG,IAAI,GAAG,CAAE,MAAM,CAAC,IAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAA;IACvE,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAErD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,sBAAsB,SAAS,kCAAkC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;YACxF,wEAAwE;YACxE,wFAAwF,CACzF,CAAA;IACH,CAAC;AACH,CAAC;AAKD,MAAM,KAAK,GAAG,CAAC,IAA6B,EAAU,EAAE,CACtD,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAExC,MAAM,KAAK,GAAG,CAAC,IAA6B,EAAE,QAAQ,GAAG,GAAG,EAAU,EAAE,CACtE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;AAEtD
|
|
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.
|
|
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
|
-
|
|
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
|
+
|