@pasosdejesus/m 0.31.1 → 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 +78 -0
- package/dist/compose/layout.d.ts +30 -0
- package/dist/compose/layout.d.ts.map +1 -0
- package/dist/compose/layout.js +289 -0
- package/dist/compose/layout.js.map +1 -0
- package/dist/i18n/locales/cli.d.ts.map +1 -1
- package/dist/i18n/locales/cli.js +2 -0
- package/dist/i18n/locales/cli.js.map +1 -1
- package/dist/m.js +9 -2
- package/dist/m.js.map +1 -1
- package/dist/tasks/check.d.ts +9 -0
- package/dist/tasks/check.d.ts.map +1 -0
- package/dist/tasks/check.js +197 -0
- package/dist/tasks/check.js.map +1 -0
- package/dist/tasks/e2e.d.ts +12 -0
- package/dist/tasks/e2e.d.ts.map +1 -1
- package/dist/tasks/e2e.js +34 -12
- package/dist/tasks/e2e.js.map +1 -1
- package/dist/templates/Makefile +5 -1
- 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/util/pnpm-workspace.d.ts +17 -0
- package/dist/util/pnpm-workspace.d.ts.map +1 -0
- package/dist/util/pnpm-workspace.js +138 -0
- package/dist/util/pnpm-workspace.js.map +1 -0
- 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/tasks/README.md +1 -0
- package/src/wba/README.md +48 -3
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// Lector/editor del subconjunto de `pnpm-workspace.yaml` que usa `m:check`
|
|
2
|
+
// (https://gitlab.com/pasosdeJesus/m/-/work_items/56). Sin dependencia YAML:
|
|
3
|
+
// el proyecto ya escribe ese archivo a mano en `m:create`/`m:update`.
|
|
4
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
5
|
+
const MAP_SECTIONS = [
|
|
6
|
+
'catalog',
|
|
7
|
+
'allowBuilds',
|
|
8
|
+
'overrides',
|
|
9
|
+
'patchedDependencies',
|
|
10
|
+
];
|
|
11
|
+
function unquote(value) {
|
|
12
|
+
const trimmed = value.trim();
|
|
13
|
+
if (trimmed.length >= 2) {
|
|
14
|
+
const first = trimmed[0];
|
|
15
|
+
const last = trimmed[trimmed.length - 1];
|
|
16
|
+
if ((first === "'" && last === "'") || (first === '"' && last === '"')) {
|
|
17
|
+
return trimmed.slice(1, -1);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return trimmed;
|
|
21
|
+
}
|
|
22
|
+
function stripComment(line) {
|
|
23
|
+
let quote = null;
|
|
24
|
+
for (let index = 0; index < line.length; index += 1) {
|
|
25
|
+
const char = line[index];
|
|
26
|
+
if (quote) {
|
|
27
|
+
if (char === quote)
|
|
28
|
+
quote = null;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (char === "'" || char === '"') {
|
|
32
|
+
quote = char;
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (char === '#' && (index === 0 || /\s/.test(line[index - 1]))) {
|
|
36
|
+
return line.slice(0, index);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return line;
|
|
40
|
+
}
|
|
41
|
+
export function parseWorkspaceYaml(text) {
|
|
42
|
+
const config = {
|
|
43
|
+
packages: [],
|
|
44
|
+
catalog: {},
|
|
45
|
+
allowBuilds: {},
|
|
46
|
+
overrides: {},
|
|
47
|
+
patchedDependencies: {},
|
|
48
|
+
raw: text,
|
|
49
|
+
};
|
|
50
|
+
let section = null;
|
|
51
|
+
for (const rawLine of text.split(/\r?\n/)) {
|
|
52
|
+
const line = stripComment(rawLine);
|
|
53
|
+
if (!line.trim())
|
|
54
|
+
continue;
|
|
55
|
+
if (!/^\s/.test(line)) {
|
|
56
|
+
const top = line.match(/^([A-Za-z][\w-]*):\s*(.*)$/);
|
|
57
|
+
if (top) {
|
|
58
|
+
section = top[1];
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (!section)
|
|
63
|
+
continue;
|
|
64
|
+
if (section === 'packages') {
|
|
65
|
+
const item = line.match(/^\s*-\s*(.+)$/);
|
|
66
|
+
if (item)
|
|
67
|
+
config.packages.push(unquote(item[1]));
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (!MAP_SECTIONS.includes(section))
|
|
71
|
+
continue;
|
|
72
|
+
const entry = line.match(/^\s+(.+?):\s*(.*)$/);
|
|
73
|
+
if (!entry)
|
|
74
|
+
continue;
|
|
75
|
+
const key = unquote(entry[1]);
|
|
76
|
+
const value = unquote(entry[2]);
|
|
77
|
+
if (!key || !value)
|
|
78
|
+
continue;
|
|
79
|
+
if (section === 'allowBuilds') {
|
|
80
|
+
config.allowBuilds[key] = value === 'true';
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
config[section][key] = value;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return config;
|
|
87
|
+
}
|
|
88
|
+
export function readWorkspaceYaml(file) {
|
|
89
|
+
if (!existsSync(file))
|
|
90
|
+
return null;
|
|
91
|
+
try {
|
|
92
|
+
return parseWorkspaceYaml(readFileSync(file, 'utf-8'));
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function formatKey(key) {
|
|
99
|
+
return /^[A-Za-z0-9_.-]+$/.test(key) ? key : `'${key}'`;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Adds the entries of `key` that are not already present to the top-level
|
|
103
|
+
* section `key:`, creating it at the end when absent. Existing lines are left
|
|
104
|
+
* untouched, so the diff stays small.
|
|
105
|
+
*/
|
|
106
|
+
export function setSectionEntries(text, key, entries) {
|
|
107
|
+
const wanted = Object.entries(entries);
|
|
108
|
+
if (wanted.length === 0)
|
|
109
|
+
return text;
|
|
110
|
+
const lines = text.split(/\r?\n/);
|
|
111
|
+
const start = lines.findIndex((line) => new RegExp(`^${key}:\\s*$`).test(line));
|
|
112
|
+
const formatValue = (value) => typeof value === 'boolean' ? String(value) : /^[A-Za-z0-9_.^~/*<>=|-]+$/.test(value) ? value : unquote(`'${value}'`);
|
|
113
|
+
if (start < 0) {
|
|
114
|
+
const block = ['', `${key}:`, ...wanted.map(([k, v]) => ` ${formatKey(k)}: ${formatValue(v)}`)];
|
|
115
|
+
return `${text.replace(/\s*$/, '')}\n${block.join('\n')}\n`;
|
|
116
|
+
}
|
|
117
|
+
let end = lines.length;
|
|
118
|
+
for (let index = start + 1; index < lines.length; index += 1) {
|
|
119
|
+
if (/^[A-Za-z][\w-]*:/.test(lines[index])) {
|
|
120
|
+
end = index;
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const body = lines.slice(start + 1, end);
|
|
125
|
+
const present = new Set();
|
|
126
|
+
for (const line of body) {
|
|
127
|
+
const entry = line.match(/^\s+(.+?):\s*(.*)$/);
|
|
128
|
+
if (entry)
|
|
129
|
+
present.add(unquote(entry[1]));
|
|
130
|
+
}
|
|
131
|
+
const missing = wanted.filter(([k]) => !present.has(k));
|
|
132
|
+
if (missing.length === 0)
|
|
133
|
+
return text;
|
|
134
|
+
const insert = missing.map(([k, v]) => ` ${formatKey(k)}: ${formatValue(v)}`);
|
|
135
|
+
const next = [...lines.slice(0, end), ...insert, ...lines.slice(end)];
|
|
136
|
+
return next.join('\n');
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=pnpm-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pnpm-workspace.js","sourceRoot":"","sources":["../../src/util/pnpm-workspace.ts"],"names":[],"mappings":"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"}
|
|
@@ -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/tasks/README.md
CHANGED
|
@@ -20,6 +20,7 @@ Each file in this directory exports a `runXxx()` function registered in `../m.ts
|
|
|
20
20
|
| `context-git.ts` | *(internal)* | Git queries (tracked, untracked, ignored, branch, log, status) and file collection |
|
|
21
21
|
| `context-reqs.ts` | *(internal)* | Parses `REQ/*.md` and keeps only open requirements |
|
|
22
22
|
| `context-render.ts` | *(internal)* | Structure and document rendering with a hard size budget |
|
|
23
|
+
| `check.ts` | `m:check` | Verifies the recommended project layout (root workspace, `apps/web`, `apps/contracts`, `catalog:`) and reports findings; `--fix` applies only reversible fixes |
|
|
23
24
|
| `create.ts` | `m:create` | Scaffolds new projects from `templates/` via direct recursive copy (replaced Plop.js) |
|
|
24
25
|
| `db.ts` | `db:create`, `db:drop`, `db:super:createuser`, `db:structure:dump`, `db:structure:load`, `db:migrate`, `db:rollback`, `db:mig:make`, `db:seed`, `db:console`, `db:test`, `db:dump`, `db:restore` | PostgreSQL database lifecycle, migration management, schema verification, and backup/restore |
|
|
25
26
|
| `e2e.ts` | `test:e2e` | E2E tests (Puppeteer specs, axios smoke) |
|
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
|
+
|