@runlot/pg 0.1.0-rc.11

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 (54) hide show
  1. package/README.md +60 -0
  2. package/dist/bundler.d.ts +33 -0
  3. package/dist/bundler.d.ts.map +1 -0
  4. package/dist/bundler.js +228 -0
  5. package/dist/bundler.js.map +1 -0
  6. package/dist/client.d.ts +118 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +365 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/emitter.d.ts +14 -0
  11. package/dist/emitter.d.ts.map +1 -0
  12. package/dist/emitter.js +62 -0
  13. package/dist/emitter.js.map +1 -0
  14. package/dist/errors.d.ts +32 -0
  15. package/dist/errors.d.ts.map +1 -0
  16. package/dist/errors.js +43 -0
  17. package/dist/errors.js.map +1 -0
  18. package/dist/index.d.ts +94 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +26 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/orm/drizzle.d.ts +9 -0
  23. package/dist/orm/drizzle.d.ts.map +1 -0
  24. package/dist/orm/drizzle.js +12 -0
  25. package/dist/orm/drizzle.js.map +1 -0
  26. package/dist/orm/knex.d.ts +6 -0
  27. package/dist/orm/knex.d.ts.map +1 -0
  28. package/dist/orm/knex.js +29 -0
  29. package/dist/orm/knex.js.map +1 -0
  30. package/dist/orm/kysely.d.ts +5 -0
  31. package/dist/orm/kysely.d.ts.map +1 -0
  32. package/dist/orm/kysely.js +14 -0
  33. package/dist/orm/kysely.js.map +1 -0
  34. package/dist/orm/prisma.d.ts +49 -0
  35. package/dist/orm/prisma.d.ts.map +1 -0
  36. package/dist/orm/prisma.js +340 -0
  37. package/dist/orm/prisma.js.map +1 -0
  38. package/dist/orm/sequelize.d.ts +4 -0
  39. package/dist/orm/sequelize.d.ts.map +1 -0
  40. package/dist/orm/sequelize.js +21 -0
  41. package/dist/orm/sequelize.js.map +1 -0
  42. package/dist/orm/typeorm.d.ts +11 -0
  43. package/dist/orm/typeorm.d.ts.map +1 -0
  44. package/dist/orm/typeorm.js +21 -0
  45. package/dist/orm/typeorm.js.map +1 -0
  46. package/dist/type-parsers.d.ts +155 -0
  47. package/dist/type-parsers.d.ts.map +1 -0
  48. package/dist/type-parsers.js +319 -0
  49. package/dist/type-parsers.js.map +1 -0
  50. package/dist/types.d.ts +79 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +7 -0
  53. package/dist/types.js.map +1 -0
  54. package/package.json +78 -0
package/dist/client.js ADDED
@@ -0,0 +1,365 @@
1
+ // node-postgres 모양의 `Client`·`Pool`·`PoolClient` (docs/pg-driver-support.md §3.2).
2
+ //
3
+ // 연결은 없다. `Pool.query` 는 `env.db.tryExec` 로 가고 (호출당 세션), `Client`
4
+ // 와 `Pool.connect()` 가 주는 `PoolClient` 는 `env.db.session()` 하나를 쥔다 —
5
+ // `BEGIN…COMMIT`, prepared statement, `SET` 이 그 안에서 유지된다. `release()`
6
+ // 가 곧 `close()` 다.
7
+ import { Emitter } from "./emitter.js";
8
+ import { DatabaseError } from "./errors.js";
9
+ import { convertCell, types } from "./type-parsers.js";
10
+ // ---- 결과 모양 ----
11
+ /** CommandComplete 태그를 pg 의 `command`·`rowCount`·`oid` 로 옮긴다. */
12
+ export function parseCommandTag(tag) {
13
+ if (!tag)
14
+ return { command: "", rowCount: null, oid: 0 };
15
+ const parts = tag.split(" ");
16
+ const command = parts[0] ?? "";
17
+ let rowCount = null;
18
+ let oid = 0;
19
+ switch (command) {
20
+ case "INSERT":
21
+ oid = Number(parts[1] ?? 0);
22
+ rowCount = Number(parts[2] ?? 0);
23
+ break;
24
+ case "DELETE":
25
+ case "UPDATE":
26
+ case "MERGE":
27
+ case "SELECT":
28
+ case "MOVE":
29
+ case "FETCH":
30
+ case "COPY":
31
+ rowCount = Number(parts[1] ?? 0);
32
+ break;
33
+ }
34
+ if (rowCount !== null && Number.isNaN(rowCount))
35
+ rowCount = null;
36
+ return { command, rowCount, oid };
37
+ }
38
+ function shapeResult(r, cfg) {
39
+ const columns = r.columns ?? [];
40
+ const lookup = cfg.types?.getTypeParser ? cfg.types.getTypeParser.bind(cfg.types) : undefined;
41
+ const fields = columns.map((c) => ({
42
+ name: c.name,
43
+ tableID: 0,
44
+ columnID: 0,
45
+ dataTypeID: c.typeOid,
46
+ dataTypeSize: -1,
47
+ dataTypeModifier: -1,
48
+ format: "text",
49
+ }));
50
+ const values = r.values ?? [];
51
+ const converted = values.map((row) => row.map((cell, i) => convertCell(cell, columns[i]?.typeOid ?? 0, lookup)));
52
+ let rows;
53
+ if (cfg.rowMode === "array") {
54
+ rows = converted;
55
+ }
56
+ else {
57
+ rows = converted.map((v) => {
58
+ const o = {};
59
+ for (let i = 0; i < columns.length; i++) {
60
+ const name = columns[i].name;
61
+ // 열 이름이 "__proto__" 면 대입이 프로토타입 setter 를 부른다 (facade 와
62
+ // 같은 이유). 그 이름만 defineProperty 로 놓는다.
63
+ if (name === "__proto__") {
64
+ Object.defineProperty(o, name, { value: v[i], enumerable: true, writable: true, configurable: true });
65
+ }
66
+ else {
67
+ o[name] = v[i];
68
+ }
69
+ }
70
+ return o;
71
+ });
72
+ }
73
+ const tag = parseCommandTag(r.commandTag);
74
+ // 확장 프로토콜의 Execute 는 태그가 없을 수 있다. 열이 있으면 SELECT 로 본다.
75
+ if (tag.command === "" && columns.length > 0) {
76
+ tag.command = "SELECT";
77
+ tag.rowCount = rows.length;
78
+ }
79
+ return { command: tag.command, rowCount: tag.rowCount, oid: tag.oid, rows, fields };
80
+ }
81
+ function toConfig(a, b) {
82
+ const cfg = typeof a === "string" ? { text: a } : { ...a };
83
+ if (Array.isArray(b))
84
+ cfg.values = b;
85
+ return cfg;
86
+ }
87
+ function normalizeParams(values) {
88
+ if (!values)
89
+ return [];
90
+ return values.map((v) => {
91
+ if (v === undefined)
92
+ return null;
93
+ // pg 는 배열 파라미터를 PostgreSQL 배열 리터럴로 직렬화한다. facade 는 배열을
94
+ // JSON 으로 보내므로 여기서 pg 와 같은 모양으로 맞춘다.
95
+ if (Array.isArray(v))
96
+ return arrayLiteral(v);
97
+ if (v instanceof Uint8Array && !(v instanceof ArrayBuffer)) {
98
+ return v.buffer.slice(v.byteOffset, v.byteOffset + v.byteLength);
99
+ }
100
+ return v;
101
+ });
102
+ }
103
+ function arrayLiteral(arr) {
104
+ const items = arr.map((v) => {
105
+ if (v === null || v === undefined)
106
+ return "NULL";
107
+ if (Array.isArray(v))
108
+ return arrayLiteral(v);
109
+ let s;
110
+ if (v instanceof Date)
111
+ s = v.toISOString();
112
+ else if (typeof v === "object")
113
+ s = JSON.stringify(v);
114
+ else
115
+ s = String(v);
116
+ return '"' + s.replace(/\\/g, "\\\\").replace(/"/g, '\\"') + '"';
117
+ });
118
+ return "{" + items.join(",") + "}";
119
+ }
120
+ async function run(target, cfg) {
121
+ const r = await target.tryExec(cfg.text, normalizeParams(cfg.values));
122
+ if (!r.ok)
123
+ throw new DatabaseError(r.error);
124
+ return shapeResult(r, cfg);
125
+ }
126
+ function withCallback(p, cb) {
127
+ if (!cb)
128
+ return p;
129
+ p.then((res) => cb(null, res), (err) => cb(err));
130
+ return undefined;
131
+ }
132
+ function pickCallback(args) {
133
+ for (const a of args)
134
+ if (typeof a === "function")
135
+ return a;
136
+ return undefined;
137
+ }
138
+ // ---- Client ----
139
+ /**
140
+ * 세션 하나를 쥐는 클라이언트. `connect()` 는 세션을 열고 `end()` 는 닫는다.
141
+ * `connect()` 전의 `query` 는 세션을 알아서 연다 — pg 는 거기서 던지지만,
142
+ * 여는 편이 ORM 이 다루기 쉽고 잃는 것이 없다.
143
+ */
144
+ export class Client extends Emitter {
145
+ db;
146
+ /** Sequelize 가 `client.connection.on('parameterStatus')` 를 건다. */
147
+ connection = new Emitter();
148
+ processID = null;
149
+ secretKey = null;
150
+ _ending = false;
151
+ _connected = false;
152
+ _connecting = false;
153
+ #session = null;
154
+ #opening = null;
155
+ constructor(config) {
156
+ super();
157
+ const db = config.db ?? boundDb(config);
158
+ if (!db)
159
+ throw new Error("@runlot/pg: `db` 가 없습니다 — new Client({ db: env.db }) 로 만드세요.");
160
+ this.db = db;
161
+ }
162
+ get session() {
163
+ return this.#session;
164
+ }
165
+ connect(cb) {
166
+ const p = this.#open().then(() => undefined);
167
+ if (!cb)
168
+ return p;
169
+ p.then(() => cb(null), (e) => cb(e));
170
+ }
171
+ #open() {
172
+ if (this.#session)
173
+ return Promise.resolve(this.#session);
174
+ if (this.#opening)
175
+ return this.#opening;
176
+ this._connecting = true;
177
+ this.#opening = this.db.session().then((s) => {
178
+ this.#session = s;
179
+ this.#opening = null;
180
+ this._connecting = false;
181
+ this._connected = true;
182
+ this.emit("connect");
183
+ return s;
184
+ }, (e) => {
185
+ this.#opening = null;
186
+ this._connecting = false;
187
+ throw e;
188
+ });
189
+ return this.#opening;
190
+ }
191
+ query(a, b, c) {
192
+ const cb = pickCallback([b, c]);
193
+ const cfg = toConfig(a, b);
194
+ const p = this.#open().then((s) => run(s, cfg));
195
+ return withCallback(p, cb);
196
+ }
197
+ end(cb) {
198
+ this._ending = true;
199
+ const p = this.#close();
200
+ if (!cb)
201
+ return p;
202
+ p.then(() => cb(), (e) => cb(e));
203
+ }
204
+ async #close() {
205
+ const pending = this.#opening;
206
+ if (pending)
207
+ await pending.catch(() => undefined);
208
+ const s = this.#session;
209
+ this.#session = null;
210
+ this._connected = false;
211
+ if (s)
212
+ await s.close();
213
+ this.emit("end");
214
+ }
215
+ escapeIdentifier(s) {
216
+ return '"' + s.replace(/"/g, '""') + '"';
217
+ }
218
+ escapeLiteral(s) {
219
+ let hasBackslash = false;
220
+ let out = "'";
221
+ for (const ch of s) {
222
+ if (ch === "'")
223
+ out += "''";
224
+ else if (ch === "\\") {
225
+ out += "\\\\";
226
+ hasBackslash = true;
227
+ }
228
+ else
229
+ out += ch;
230
+ }
231
+ out += "'";
232
+ return hasBackslash ? " E" + out : out;
233
+ }
234
+ }
235
+ // ---- Pool ----
236
+ export class PoolClient extends Client {
237
+ #pool;
238
+ #released = false;
239
+ constructor(pool, db) {
240
+ super({ db });
241
+ this.#pool = pool;
242
+ }
243
+ /** pg 의 `release(err?)`. 오류를 주면 세션을 버린다 — 우리는 늘 버리므로 같다. */
244
+ release(_err) {
245
+ if (this.#released)
246
+ return;
247
+ this.#released = true;
248
+ this.#pool._forget(this);
249
+ // 닫기 실패는 보고할 곳이 없다. 세션은 액터가 TTL 로 거둔다 (§3.1).
250
+ void this.end().catch(() => undefined);
251
+ }
252
+ }
253
+ export class Pool extends Emitter {
254
+ db;
255
+ options;
256
+ #clients = new Set();
257
+ #ended = false;
258
+ constructor(config) {
259
+ super();
260
+ const db = config.db ?? boundDb(config);
261
+ if (!db)
262
+ throw new Error("@runlot/pg: `db` 가 없습니다 — new Pool({ db: env.db }) 로 만드세요.");
263
+ this.db = db;
264
+ this.options = { ...config };
265
+ }
266
+ get totalCount() {
267
+ return this.#clients.size;
268
+ }
269
+ get idleCount() {
270
+ return 0;
271
+ }
272
+ get waitingCount() {
273
+ return 0;
274
+ }
275
+ get ended() {
276
+ return this.#ended;
277
+ }
278
+ connect(cb) {
279
+ const p = this.#acquire();
280
+ if (!cb)
281
+ return p;
282
+ p.then((c) => cb(null, c, (err) => c.release(err)), (e) => cb(e));
283
+ }
284
+ async #acquire() {
285
+ if (this.#ended)
286
+ throw new Error("Cannot use a pool after calling end on the pool");
287
+ const c = new PoolClient(this, this.db);
288
+ // 세션은 여기서 연다. pg 도 connect() 가 돌아오면 연결이 살아 있다.
289
+ await c.connect();
290
+ this.#clients.add(c);
291
+ this.emit("connect", c);
292
+ return c;
293
+ }
294
+ _forget(c) {
295
+ this.#clients.delete(c);
296
+ this.emit("remove", c);
297
+ }
298
+ query(a, b, c) {
299
+ const cb = pickCallback([b, c]);
300
+ const cfg = toConfig(a, b);
301
+ const p = (this.#ended
302
+ ? Promise.reject(new Error("Cannot use a pool after calling end on the pool"))
303
+ : run(this.db, cfg));
304
+ return withCallback(p, cb);
305
+ }
306
+ end(cb) {
307
+ this.#ended = true;
308
+ const all = [...this.#clients];
309
+ this.#clients.clear();
310
+ const p = Promise.all(all.map((c) => c.end().catch(() => undefined))).then(() => undefined);
311
+ if (!cb)
312
+ return p;
313
+ p.then(() => cb(), (e) => cb(e));
314
+ }
315
+ }
316
+ // ---- 모듈 묶기 ----
317
+ const BOUND = Symbol.for("@runlot/pg.bound");
318
+ function boundDb(config) {
319
+ if (config && typeof config === "object" && typeof config.tryExec === "function")
320
+ return config;
321
+ const b = globalThis[BOUND];
322
+ return b;
323
+ }
324
+ /**
325
+ * `db` 를 미리 묶은 pg 모양의 모듈.
326
+ *
327
+ * ORM 이 드라이버 모듈을 통째로 받는 자리(TypeORM 의 `driver`, Sequelize 의
328
+ * `dialectModule`, Knex 의 `_driver()`)에 넘긴다. 그 ORM 들은 `new Pool(옵션)` 을
329
+ * 자기 옵션으로 부르므로, `db` 를 옵션에 실어 줄 길이 없다 — 여기서 묶는다.
330
+ */
331
+ export function pgModule(db) {
332
+ // ORM 이 자기 접속 옵션을 그대로 넘기므로 `db` 라는 키가 우연히 들어올 수
333
+ // 있다 (Knex 의 `connection` 은 통째로 Client 옵션이 된다). Db 모양일 때만 쓴다.
334
+ const pick = (c) => (isDb(c?.db) ? c.db : db);
335
+ class BoundClient extends Client {
336
+ constructor(config) {
337
+ super({ ...(config ?? {}), db: pick(config) });
338
+ }
339
+ }
340
+ class BoundPool extends Pool {
341
+ constructor(config) {
342
+ super({ ...(config ?? {}), db: pick(config) });
343
+ }
344
+ }
345
+ return {
346
+ Client: BoundClient,
347
+ Pool: BoundPool,
348
+ DatabaseError,
349
+ defaults,
350
+ types,
351
+ native: null,
352
+ escapeIdentifier: Client.prototype.escapeIdentifier,
353
+ escapeLiteral: Client.prototype.escapeLiteral,
354
+ };
355
+ }
356
+ function isDb(v) {
357
+ return !!v && typeof v === "object" && typeof v.tryExec === "function";
358
+ }
359
+ /** pg 의 `defaults`. TypeORM 이 `parseInt8` 을 만진다 — 우리는 int8 을 늘 문자열로 둔다. */
360
+ export const defaults = {
361
+ parseInt8: false,
362
+ ssl: false,
363
+ poolSize: 10,
364
+ };
365
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ type Listener = (...args: unknown[]) => void;
2
+ export declare class Emitter {
3
+ #private;
4
+ on(event: string, fn: Listener): this;
5
+ addListener(event: string, fn: Listener): this;
6
+ once(event: string, fn: Listener): this;
7
+ off(event: string, fn: Listener): this;
8
+ removeListener(event: string, fn: Listener): this;
9
+ removeAllListeners(event?: string): this;
10
+ listenerCount(event: string): number;
11
+ emit(event: string, ...args: unknown[]): boolean;
12
+ }
13
+ export {};
14
+ //# sourceMappingURL=emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"AAOA,KAAK,QAAQ,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;AAE7C,qBAAa,OAAO;;IAGlB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,IAAI;IAKrC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,IAAI;IAI9C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,IAAI;IAKvC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,IAAI;IAQtC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,GAAG,IAAI;IAIjD,kBAAkB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IAMxC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIpC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO;CAkBjD"}
@@ -0,0 +1,62 @@
1
+ // node:events 없이 쓰는 최소 emitter.
2
+ //
3
+ // 사용자 워커는 `nodejs_compat` 없이 뜬다 (config.go — `experimental` 하나).
4
+ // ORM 이 Client/Pool 에 거는 것은 `on('error')`·`once('end')`·`removeListener`
5
+ // 정도라, 그것만 있으면 된다. EventEmitter 전체를 들이면 그 순간 이 패키지가
6
+ // node 런타임을 요구하게 된다.
7
+ export class Emitter {
8
+ #listeners = new Map();
9
+ on(event, fn) {
10
+ this.#add(event, fn, false);
11
+ return this;
12
+ }
13
+ addListener(event, fn) {
14
+ return this.on(event, fn);
15
+ }
16
+ once(event, fn) {
17
+ this.#add(event, fn, true);
18
+ return this;
19
+ }
20
+ off(event, fn) {
21
+ const list = this.#listeners.get(event);
22
+ if (!list)
23
+ return this;
24
+ const i = list.findIndex((l) => l.fn === fn);
25
+ if (i >= 0)
26
+ list.splice(i, 1);
27
+ return this;
28
+ }
29
+ removeListener(event, fn) {
30
+ return this.off(event, fn);
31
+ }
32
+ removeAllListeners(event) {
33
+ if (event === undefined)
34
+ this.#listeners.clear();
35
+ else
36
+ this.#listeners.delete(event);
37
+ return this;
38
+ }
39
+ listenerCount(event) {
40
+ return this.#listeners.get(event)?.length ?? 0;
41
+ }
42
+ emit(event, ...args) {
43
+ const list = this.#listeners.get(event);
44
+ if (!list || list.length === 0)
45
+ return false;
46
+ for (const l of [...list]) {
47
+ if (l.once)
48
+ this.off(event, l.fn);
49
+ l.fn(...args);
50
+ }
51
+ return true;
52
+ }
53
+ #add(event, fn, once) {
54
+ let list = this.#listeners.get(event);
55
+ if (!list) {
56
+ list = [];
57
+ this.#listeners.set(event, list);
58
+ }
59
+ list.push({ fn, once });
60
+ }
61
+ }
62
+ //# sourceMappingURL=emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.js","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,EAAE;AACF,iEAAiE;AACjE,yEAAyE;AACzE,oDAAoD;AACpD,qBAAqB;AAIrB,MAAM,OAAO,OAAO;IAClB,UAAU,GAAG,IAAI,GAAG,EAA6C,CAAC;IAElE,EAAE,CAAC,KAAa,EAAE,EAAY;QAC5B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,WAAW,CAAC,KAAa,EAAE,EAAY;QACrC,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC,KAAa,EAAE,EAAY;QAC9B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,GAAG,CAAC,KAAa,EAAE,EAAY;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,cAAc,CAAC,KAAa,EAAE,EAAY;QACxC,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,kBAAkB,CAAC,KAAc;QAC/B,IAAI,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;;YAC5C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa,CAAC,KAAa;QACzB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,CAAC,KAAa,EAAE,GAAG,IAAe;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,CAAC,IAAI;gBAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;YAClC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAChB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,KAAa,EAAE,EAAY,EAAE,IAAa;QAC7C,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,GAAG,EAAE,CAAC;YACV,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,32 @@
1
+ import type { DbErrorData } from "./types.js";
2
+ /**
3
+ * node-postgres 의 `DatabaseError` 모양.
4
+ *
5
+ * ORM 들은 `err.code` 로 SQLSTATE 를 읽는다 (Prisma 의 23505 → unique violation
6
+ * 매핑, Knex 의 재시도 판단). `env.db.exec` 가 던지는 Error 는 RPC 경계에서
7
+ * 커스텀 필드를 잃지만, 이 어댑터는 워커 안 JS 라 자기 Error 를 만들 수 있다 —
8
+ * 그래서 `tryExec` 의 값을 받아 여기서 던진다.
9
+ */
10
+ export declare class DatabaseError extends Error {
11
+ readonly code: string;
12
+ readonly severity: string;
13
+ readonly detail: string | undefined;
14
+ readonly hint: string | undefined;
15
+ readonly position: string | undefined;
16
+ /** pg 는 이 필드를 늘 둔다. 우리는 값이 없어 undefined 로 둔다. */
17
+ readonly schema: string | undefined;
18
+ readonly table: string | undefined;
19
+ readonly column: string | undefined;
20
+ readonly constraint: string | undefined;
21
+ readonly dataType: string | undefined;
22
+ readonly file: string | undefined;
23
+ readonly line: string | undefined;
24
+ readonly routine: string | undefined;
25
+ readonly internalPosition: string | undefined;
26
+ readonly internalQuery: string | undefined;
27
+ readonly where: string | undefined;
28
+ readonly length: number;
29
+ constructor(e: DbErrorData);
30
+ }
31
+ export declare function isDatabaseError(e: unknown): e is DatabaseError;
32
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;GAOG;AACH,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,iDAAiD;IACjD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAa;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAa;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAa;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAa;IACpD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAa;IAClD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAa;IAC9C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAa;IAC9C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAa;IACjD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAa;IAC1D,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAa;IACvD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAa;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,CAAC,EAAE,WAAW;CAW3B;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,aAAa,CAE9D"}
package/dist/errors.js ADDED
@@ -0,0 +1,43 @@
1
+ /**
2
+ * node-postgres 의 `DatabaseError` 모양.
3
+ *
4
+ * ORM 들은 `err.code` 로 SQLSTATE 를 읽는다 (Prisma 의 23505 → unique violation
5
+ * 매핑, Knex 의 재시도 판단). `env.db.exec` 가 던지는 Error 는 RPC 경계에서
6
+ * 커스텀 필드를 잃지만, 이 어댑터는 워커 안 JS 라 자기 Error 를 만들 수 있다 —
7
+ * 그래서 `tryExec` 의 값을 받아 여기서 던진다.
8
+ */
9
+ export class DatabaseError extends Error {
10
+ code;
11
+ severity;
12
+ detail;
13
+ hint;
14
+ position;
15
+ /** pg 는 이 필드를 늘 둔다. 우리는 값이 없어 undefined 로 둔다. */
16
+ schema = undefined;
17
+ table = undefined;
18
+ column = undefined;
19
+ constraint = undefined;
20
+ dataType = undefined;
21
+ file = undefined;
22
+ line = undefined;
23
+ routine = undefined;
24
+ internalPosition = undefined;
25
+ internalQuery = undefined;
26
+ where = undefined;
27
+ length;
28
+ constructor(e) {
29
+ super(e.message);
30
+ // pg 의 DatabaseError 는 name 이 "error" 다. 그 값을 검사하는 코드가 있다.
31
+ this.name = "error";
32
+ this.code = e.code;
33
+ this.severity = e.severity;
34
+ this.detail = e.detail ?? undefined;
35
+ this.hint = e.hint ?? undefined;
36
+ this.position = e.position ?? undefined;
37
+ this.length = e.message.length;
38
+ }
39
+ }
40
+ export function isDatabaseError(e) {
41
+ return e instanceof DatabaseError;
42
+ }
43
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC7B,IAAI,CAAS;IACb,QAAQ,CAAS;IACjB,MAAM,CAAqB;IAC3B,IAAI,CAAqB;IACzB,QAAQ,CAAqB;IACtC,iDAAiD;IACxC,MAAM,GAAuB,SAAS,CAAC;IACvC,KAAK,GAAuB,SAAS,CAAC;IACtC,MAAM,GAAuB,SAAS,CAAC;IACvC,UAAU,GAAuB,SAAS,CAAC;IAC3C,QAAQ,GAAuB,SAAS,CAAC;IACzC,IAAI,GAAuB,SAAS,CAAC;IACrC,IAAI,GAAuB,SAAS,CAAC;IACrC,OAAO,GAAuB,SAAS,CAAC;IACxC,gBAAgB,GAAuB,SAAS,CAAC;IACjD,aAAa,GAAuB,SAAS,CAAC;IAC9C,KAAK,GAAuB,SAAS,CAAC;IACtC,MAAM,CAAS;IAExB,YAAY,CAAc;QACxB,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACjB,2DAA2D;QAC3D,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,SAAS,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,SAAS,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,SAAS,CAAC;QACxC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACjC,CAAC;CACF;AAED,MAAM,UAAU,eAAe,CAAC,CAAU;IACxC,OAAO,CAAC,YAAY,aAAa,CAAC;AACpC,CAAC"}
@@ -0,0 +1,94 @@
1
+ import { Client, Pool, PoolClient, pgModule } from "./client.js";
2
+ import { DatabaseError } from "./errors.js";
3
+ export { Client, Pool, PoolClient, defaults, pgModule, parseCommandTag } from "./client.js";
4
+ export type { ClientConfig, PoolConfig, QueryConfig, QueryResult, FieldDef, QueryCallback, PgModule } from "./client.js";
5
+ export { DatabaseError, isDatabaseError } from "./errors.js";
6
+ export { types, builtins, getTypeParser, setTypeParser, parseArray } from "./type-parsers.js";
7
+ export type { Db, DbSession, TryExecResult, DbErrorData, DbColumn, Storage, StorageObject, StorageListPage } from "./types.js";
8
+ declare const escapeIdentifier: (s: string) => string;
9
+ declare const escapeLiteral: (s: string) => string;
10
+ export { escapeIdentifier, escapeLiteral };
11
+ declare const _default: {
12
+ Client: typeof Client;
13
+ Pool: typeof Pool;
14
+ PoolClient: typeof PoolClient;
15
+ DatabaseError: typeof DatabaseError;
16
+ types: {
17
+ builtins: {
18
+ readonly BOOL: 16;
19
+ readonly BYTEA: 17;
20
+ readonly CHAR: 18;
21
+ readonly INT8: 20;
22
+ readonly INT2: 21;
23
+ readonly INT4: 23;
24
+ readonly REGPROC: 24;
25
+ readonly TEXT: 25;
26
+ readonly OID: 26;
27
+ readonly TID: 27;
28
+ readonly XID: 28;
29
+ readonly CID: 29;
30
+ readonly JSON: 114;
31
+ readonly XML: 142;
32
+ readonly PG_NODE_TREE: 194;
33
+ readonly SMGR: 210;
34
+ readonly PATH: 602;
35
+ readonly POLYGON: 604;
36
+ readonly CIDR: 650;
37
+ readonly FLOAT4: 700;
38
+ readonly FLOAT8: 701;
39
+ readonly ABSTIME: 702;
40
+ readonly RELTIME: 703;
41
+ readonly TINTERVAL: 704;
42
+ readonly CIRCLE: 718;
43
+ readonly MACADDR8: 774;
44
+ readonly MONEY: 790;
45
+ readonly MACADDR: 829;
46
+ readonly INET: 869;
47
+ readonly ACLITEM: 1033;
48
+ readonly BPCHAR: 1042;
49
+ readonly VARCHAR: 1043;
50
+ readonly DATE: 1082;
51
+ readonly TIME: 1083;
52
+ readonly TIMESTAMP: 1114;
53
+ readonly TIMESTAMPTZ: 1184;
54
+ readonly INTERVAL: 1186;
55
+ readonly TIMETZ: 1266;
56
+ readonly BIT: 1560;
57
+ readonly VARBIT: 1562;
58
+ readonly NUMERIC: 1700;
59
+ readonly REFCURSOR: 1790;
60
+ readonly REGPROCEDURE: 2202;
61
+ readonly REGOPER: 2203;
62
+ readonly REGOPERATOR: 2204;
63
+ readonly REGCLASS: 2205;
64
+ readonly REGTYPE: 2206;
65
+ readonly UUID: 2950;
66
+ readonly TXID_SNAPSHOT: 2970;
67
+ readonly PG_LSN: 3220;
68
+ readonly PG_NDISTINCT: 3361;
69
+ readonly PG_DEPENDENCIES: 3402;
70
+ readonly TSVECTOR: 3614;
71
+ readonly TSQUERY: 3615;
72
+ readonly GTSVECTOR: 3642;
73
+ readonly REGCONFIG: 3734;
74
+ readonly REGDICTIONARY: 3769;
75
+ readonly JSONB: 3802;
76
+ readonly REGNAMESPACE: 4089;
77
+ readonly REGROLE: 4096;
78
+ };
79
+ getTypeParser: typeof import("./type-parsers.js").getTypeParser;
80
+ setTypeParser: typeof import("./type-parsers.js").setTypeParser;
81
+ arrayParser: {
82
+ create: (s: string, p: import("./type-parsers.js").TypeParser) => {
83
+ parse: () => unknown[];
84
+ };
85
+ };
86
+ };
87
+ defaults: Record<string, unknown>;
88
+ pgModule: typeof pgModule;
89
+ native: null;
90
+ escapeIdentifier: (s: string) => string;
91
+ escapeLiteral: (s: string) => string;
92
+ };
93
+ export default _default;
94
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAY,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC5F,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACzH,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC9F,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE/H,QAAA,MAAM,gBAAgB,uBAAoC,CAAC;AAC3D,QAAA,MAAM,aAAa,uBAAiC,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE3C,wBAWE"}