@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.
- package/README.md +60 -0
- package/dist/bundler.d.ts +33 -0
- package/dist/bundler.d.ts.map +1 -0
- package/dist/bundler.js +228 -0
- package/dist/bundler.js.map +1 -0
- package/dist/client.d.ts +118 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +365 -0
- package/dist/client.js.map +1 -0
- package/dist/emitter.d.ts +14 -0
- package/dist/emitter.d.ts.map +1 -0
- package/dist/emitter.js +62 -0
- package/dist/emitter.js.map +1 -0
- package/dist/errors.d.ts +32 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +43 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +94 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/orm/drizzle.d.ts +9 -0
- package/dist/orm/drizzle.d.ts.map +1 -0
- package/dist/orm/drizzle.js +12 -0
- package/dist/orm/drizzle.js.map +1 -0
- package/dist/orm/knex.d.ts +6 -0
- package/dist/orm/knex.d.ts.map +1 -0
- package/dist/orm/knex.js +29 -0
- package/dist/orm/knex.js.map +1 -0
- package/dist/orm/kysely.d.ts +5 -0
- package/dist/orm/kysely.d.ts.map +1 -0
- package/dist/orm/kysely.js +14 -0
- package/dist/orm/kysely.js.map +1 -0
- package/dist/orm/prisma.d.ts +49 -0
- package/dist/orm/prisma.d.ts.map +1 -0
- package/dist/orm/prisma.js +340 -0
- package/dist/orm/prisma.js.map +1 -0
- package/dist/orm/sequelize.d.ts +4 -0
- package/dist/orm/sequelize.d.ts.map +1 -0
- package/dist/orm/sequelize.js +21 -0
- package/dist/orm/sequelize.js.map +1 -0
- package/dist/orm/typeorm.d.ts +11 -0
- package/dist/orm/typeorm.d.ts.map +1 -0
- package/dist/orm/typeorm.js +21 -0
- package/dist/orm/typeorm.js.map +1 -0
- package/dist/type-parsers.d.ts +155 -0
- package/dist/type-parsers.d.ts.map +1 -0
- package/dist/type-parsers.js +319 -0
- package/dist/type-parsers.js.map +1 -0
- package/dist/types.d.ts +79 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +78 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// @runlot/pg — `env.db` 위의 node-postgres 호환 어댑터 (docs/pg-driver-support.md §3.2).
|
|
2
|
+
//
|
|
3
|
+
// 기본 export 는 `pg` 모듈 모양이다. ORM 이 `import pg from "pg"` 로 드라이버를
|
|
4
|
+
// 찾을 때 번들러 alias(`pg` → `@runlot/pg`)로 이 모듈을 준다.
|
|
5
|
+
import { Client, Pool, PoolClient, defaults, pgModule } from "./client.js";
|
|
6
|
+
import { DatabaseError } from "./errors.js";
|
|
7
|
+
import { types } from "./type-parsers.js";
|
|
8
|
+
export { Client, Pool, PoolClient, defaults, pgModule, parseCommandTag } from "./client.js";
|
|
9
|
+
export { DatabaseError, isDatabaseError } from "./errors.js";
|
|
10
|
+
export { types, builtins, getTypeParser, setTypeParser, parseArray } from "./type-parsers.js";
|
|
11
|
+
const escapeIdentifier = Client.prototype.escapeIdentifier;
|
|
12
|
+
const escapeLiteral = Client.prototype.escapeLiteral;
|
|
13
|
+
export { escapeIdentifier, escapeLiteral };
|
|
14
|
+
export default {
|
|
15
|
+
Client,
|
|
16
|
+
Pool,
|
|
17
|
+
PoolClient,
|
|
18
|
+
DatabaseError,
|
|
19
|
+
types,
|
|
20
|
+
defaults,
|
|
21
|
+
pgModule,
|
|
22
|
+
native: null,
|
|
23
|
+
escapeIdentifier,
|
|
24
|
+
escapeLiteral,
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,EAAE;AACF,gEAAgE;AAChE,iDAAiD;AACjD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE5F,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;AAG9F,MAAM,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC;AAC3D,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC;AAE3C,eAAe;IACb,MAAM;IACN,IAAI;IACJ,UAAU;IACV,aAAa;IACb,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,MAAM,EAAE,IAAI;IACZ,gBAAgB;IAChB,aAAa;CACd,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type NodePgDatabase } from "drizzle-orm/node-postgres";
|
|
2
|
+
import type { DrizzleConfig } from "drizzle-orm";
|
|
3
|
+
import { Pool } from "../client.js";
|
|
4
|
+
import type { Db } from "../types.js";
|
|
5
|
+
export type { NodePgDatabase };
|
|
6
|
+
export declare function drizzle<TSchema extends Record<string, unknown> = Record<string, never>>(db: Db, config?: DrizzleConfig<TSchema>): NodePgDatabase<TSchema> & {
|
|
7
|
+
$client: Pool;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=drizzle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drizzle.d.ts","sourceRoot":"","sources":["../../src/orm/drizzle.ts"],"names":[],"mappings":"AAKA,OAAO,EAAqB,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEtC,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B,wBAAgB,OAAO,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EACrF,EAAE,EAAE,EAAE,EACN,MAAM,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,GAC9B,cAAc,CAAC,OAAO,CAAC,GAAG;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,CAG7C"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Drizzle: `drizzle-orm/node-postgres` 에 우리 Pool 을 준다.
|
|
2
|
+
//
|
|
3
|
+
// Drizzle 은 `client.query({text, values, rowMode:'array', types})` 만 부른다
|
|
4
|
+
// (session.js). `types.getTypeParser` 로 날짜·간격을 문자열로 받으려 하고,
|
|
5
|
+
// 그것은 이 어댑터의 질의별 파서 주입이 그대로 지원한다.
|
|
6
|
+
import { drizzle as nodePg } from "drizzle-orm/node-postgres";
|
|
7
|
+
import { Pool } from "../client.js";
|
|
8
|
+
export function drizzle(db, config) {
|
|
9
|
+
const pool = new Pool({ db });
|
|
10
|
+
return nodePg({ client: pool, ...(config ?? {}) });
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=drizzle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drizzle.js","sourceRoot":"","sources":["../../src/orm/drizzle.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,EAAE;AACF,yEAAyE;AACzE,4DAA4D;AAC5D,kCAAkC;AAClC,OAAO,EAAE,OAAO,IAAI,MAAM,EAAuB,MAAM,2BAA2B,CAAC;AAInF,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAKpC,MAAM,UAAU,OAAO,CACrB,EAAM,EACN,MAA+B;IAE/B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9B,OAAO,MAAM,CAAC,EAAE,MAAM,EAAE,IAAyB,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAA2D,CAAC;AACpI,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type Knex } from "knex";
|
|
2
|
+
import PgClient from "knex/lib/dialects/postgres/index.js";
|
|
3
|
+
import type { Db } from "../types.js";
|
|
4
|
+
export declare function knexClient(db: Db): typeof PgClient;
|
|
5
|
+
export declare function knex(db: Db, config?: Omit<Knex.Config, "client" | "connection">): Knex;
|
|
6
|
+
//# sourceMappingURL=knex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knex.d.ts","sourceRoot":"","sources":["../../src/orm/knex.ts"],"names":[],"mappings":"AAOA,OAAoB,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,QAAQ,MAAM,qCAAqC,CAAC;AAG3D,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEtC,wBAAgB,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,QAAQ,CAOlD;AAED,wBAAgB,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,GAAG,YAAY,CAAC,GAAG,IAAI,CAStF"}
|
package/dist/orm/knex.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Knex: `client: 'pg'` 의 `_driver()` 가 `require('pg')` 를 한다. 그 자리를
|
|
2
|
+
// 우리 모듈로 바꾼 클라이언트 클래스를 만든다 — Knex 는 `client` 에 클래스를
|
|
3
|
+
// 받는다.
|
|
4
|
+
//
|
|
5
|
+
// Knex 의 pg 클라이언트는 연결마다 `new Client()` + `connect()` 를 하고
|
|
6
|
+
// 첫 연결에서 `select version()` 을 읽는다. 풀은 tarn 이 관리하며 최소 크기를
|
|
7
|
+
// 0 으로 두면 유휴 세션을 쥐지 않는다.
|
|
8
|
+
import knexFactory, {} from "knex";
|
|
9
|
+
import PgClient from "knex/lib/dialects/postgres/index.js";
|
|
10
|
+
import { pgModule } from "../client.js";
|
|
11
|
+
export function knexClient(db) {
|
|
12
|
+
const mod = pgModule(db);
|
|
13
|
+
return class RunlotPgClient extends PgClient {
|
|
14
|
+
_driver() {
|
|
15
|
+
return mod;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function knex(db, config) {
|
|
20
|
+
return knexFactory({
|
|
21
|
+
...(config ?? {}),
|
|
22
|
+
client: knexClient(db),
|
|
23
|
+
// 값이 있어야 Knex 가 "connection 이 없다" 로 경고하지 않는다. 이 객체가
|
|
24
|
+
// 그대로 `new Client(옵션)` 으로 가므로 `db` 키를 두지 않는다.
|
|
25
|
+
connection: { runlot: true },
|
|
26
|
+
pool: { min: 0, max: 4, ...(config?.pool ?? {}) },
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=knex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knex.js","sourceRoot":"","sources":["../../src/orm/knex.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,oDAAoD;AACpD,OAAO;AACP,EAAE;AACF,0DAA0D;AAC1D,yDAAyD;AACzD,yBAAyB;AACzB,OAAO,WAAW,EAAE,EAAa,MAAM,MAAM,CAAC;AAC9C,OAAO,QAAQ,MAAM,qCAAqC,CAAC;AAE3D,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAGxC,MAAM,UAAU,UAAU,CAAC,EAAM;IAC/B,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACzB,OAAO,MAAM,cAAe,SAAQ,QAAQ;QAC1C,OAAO;YACL,OAAO,GAAG,CAAC;QACb,CAAC;KACiB,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,EAAM,EAAE,MAAmD;IAC9E,OAAO,WAAW,CAAC;QACjB,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;QACjB,MAAM,EAAE,UAAU,CAAC,EAAE,CAAsB;QAC3C,oDAAoD;QACpD,8CAA8C;QAC9C,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,EAAuB;QACjD,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,EAAE;KAClD,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Kysely, PostgresDialect, type KyselyConfig } from "kysely";
|
|
2
|
+
import type { Db } from "../types.js";
|
|
3
|
+
export declare function kyselyDialect(db: Db): PostgresDialect;
|
|
4
|
+
export declare function kysely<DB>(db: Db, config?: Omit<KyselyConfig, "dialect">): Kysely<DB>;
|
|
5
|
+
//# sourceMappingURL=kysely.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kysely.d.ts","sourceRoot":"","sources":["../../src/orm/kysely.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGpE,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEtC,wBAAgB,aAAa,CAAC,EAAE,EAAE,EAAE,GAAG,eAAe,CAErD;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAErF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Kysely: `PostgresDialect({ pool })`.
|
|
2
|
+
//
|
|
3
|
+
// Kysely 는 `pool.connect()` → `client.query(sql, params)` → `client.release()`
|
|
4
|
+
// 만 부르고, 트랜잭션은 `begin/commit/rollback` 문장으로 한다. 세션 핸들 위의
|
|
5
|
+
// PoolClient 가 그대로 맞는다.
|
|
6
|
+
import { Kysely, PostgresDialect } from "kysely";
|
|
7
|
+
import { Pool } from "../client.js";
|
|
8
|
+
export function kyselyDialect(db) {
|
|
9
|
+
return new PostgresDialect({ pool: new Pool({ db }) });
|
|
10
|
+
}
|
|
11
|
+
export function kysely(db, config) {
|
|
12
|
+
return new Kysely({ ...(config ?? {}), dialect: kyselyDialect(db) });
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=kysely.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kysely.js","sourceRoot":"","sources":["../../src/orm/kysely.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,EAAE;AACF,+EAA+E;AAC/E,yDAAyD;AACzD,wBAAwB;AACxB,OAAO,EAAE,MAAM,EAAE,eAAe,EAAqB,MAAM,QAAQ,CAAC;AAEpE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAGpC,MAAM,UAAU,aAAa,CAAC,EAAM;IAClC,OAAO,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,EAAE,EAAE,CAAU,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,MAAM,CAAK,EAAM,EAAE,MAAsC;IACvE,OAAO,IAAI,MAAM,CAAK,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type ConnectionInfo, type IsolationLevel, type SqlDriverAdapter, type SqlDriverAdapterFactory, type SqlQuery, type SqlResultSet, type Transaction } from "@prisma/driver-adapter-utils";
|
|
2
|
+
import { Pool, type QueryResult } from "../client.js";
|
|
3
|
+
import { type TypeParser } from "../type-parsers.js";
|
|
4
|
+
import type { Db } from "../types.js";
|
|
5
|
+
declare class Queryable {
|
|
6
|
+
protected readonly client: {
|
|
7
|
+
query(cfg: {
|
|
8
|
+
text: string;
|
|
9
|
+
values: unknown[];
|
|
10
|
+
rowMode: "array";
|
|
11
|
+
types: {
|
|
12
|
+
getTypeParser(oid: number, format: "text"): TypeParser;
|
|
13
|
+
};
|
|
14
|
+
}): Promise<QueryResult<unknown>>;
|
|
15
|
+
};
|
|
16
|
+
readonly provider: "postgres";
|
|
17
|
+
readonly adapterName = "@runlot/pg/prisma";
|
|
18
|
+
constructor(client: {
|
|
19
|
+
query(cfg: {
|
|
20
|
+
text: string;
|
|
21
|
+
values: unknown[];
|
|
22
|
+
rowMode: "array";
|
|
23
|
+
types: {
|
|
24
|
+
getTypeParser(oid: number, format: "text"): TypeParser;
|
|
25
|
+
};
|
|
26
|
+
}): Promise<QueryResult<unknown>>;
|
|
27
|
+
});
|
|
28
|
+
queryRaw(query: SqlQuery): Promise<SqlResultSet>;
|
|
29
|
+
executeRaw(query: SqlQuery): Promise<number>;
|
|
30
|
+
protected perform(query: SqlQuery): Promise<QueryResult<unknown>>;
|
|
31
|
+
}
|
|
32
|
+
export declare class RunlotPrismaAdapter extends Queryable implements SqlDriverAdapter {
|
|
33
|
+
private readonly pool;
|
|
34
|
+
constructor(pool: Pool);
|
|
35
|
+
startTransaction(isolationLevel?: IsolationLevel): Promise<Transaction>;
|
|
36
|
+
executeScript(script: string): Promise<void>;
|
|
37
|
+
getConnectionInfo(): ConnectionInfo;
|
|
38
|
+
dispose(): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
/** `new PrismaClient({ adapter: new PrismaRunlot(env.db) })`. */
|
|
41
|
+
export declare class PrismaRunlot implements SqlDriverAdapterFactory {
|
|
42
|
+
private readonly db;
|
|
43
|
+
readonly provider: "postgres";
|
|
44
|
+
readonly adapterName = "@runlot/pg/prisma";
|
|
45
|
+
constructor(db: Db);
|
|
46
|
+
connect(): Promise<SqlDriverAdapter>;
|
|
47
|
+
}
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=prisma.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma.d.ts","sourceRoot":"","sources":["../../src/orm/prisma.ts"],"names":[],"mappings":"AAMA,OAAO,EAKL,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,WAAW,EAEjB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,IAAI,EAAc,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAElE,OAAO,EAAwB,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAyNtC,cAAM,SAAS;IAGD,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE;QAAE,KAAK,CAAC,GAAG,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YAAC,OAAO,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE;gBAAE,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAAA;aAAE,CAAA;SAAE,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA;KAAE;IAF9M,QAAQ,CAAC,QAAQ,EAAG,UAAU,CAAU;IACxC,QAAQ,CAAC,WAAW,uBAAgB;gBACL,MAAM,EAAE;QAAE,KAAK,CAAC,GAAG,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YAAC,OAAO,EAAE,OAAO,CAAC;YAAC,KAAK,EAAE;gBAAE,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAAA;aAAE,CAAA;SAAE,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAA;KAAE;IAExM,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC;IAShD,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;cAIlC,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;CAaxE;AAgCD,qBAAa,mBAAoB,SAAQ,SAAU,YAAW,gBAAgB;IAChE,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,IAAI;IAIjC,gBAAgB,CAAC,cAAc,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IAavE,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUlD,iBAAiB,IAAI,cAAc;IAI7B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B;AAED,iEAAiE;AACjE,qBAAa,YAAa,YAAW,uBAAuB;IAG9C,OAAO,CAAC,QAAQ,CAAC,EAAE;IAF/B,QAAQ,CAAC,QAAQ,EAAG,UAAU,CAAU;IACxC,QAAQ,CAAC,WAAW,uBAAgB;gBACP,EAAE,EAAE,EAAE;IAC7B,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC;CAG3C"}
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
// Prisma driver adapter — `@prisma/adapter-pg` 와 같은 모양을 `@runlot/pg` 위에
|
|
2
|
+
// 얹는다 (docs/pg-driver-support.md §3.3).
|
|
3
|
+
//
|
|
4
|
+
// Prisma 7 의 클라이언트는 쿼리 컴파일러가 WASM 이고 실행은 어댑터가 한다.
|
|
5
|
+
// 어댑터가 하는 일은 셋이다: 결과 열 OID → Prisma ColumnType, 인자 → 텍스트
|
|
6
|
+
// 파라미터, 트랜잭션 = PoolClient 위의 BEGIN/COMMIT.
|
|
7
|
+
import { ColumnTypeEnum, DriverAdapterError, } from "@prisma/driver-adapter-utils";
|
|
8
|
+
import { Pool, PoolClient } from "../client.js";
|
|
9
|
+
import { DatabaseError } from "../errors.js";
|
|
10
|
+
import { builtins, parseArray } from "../type-parsers.js";
|
|
11
|
+
const ADAPTER_NAME = "@runlot/pg/prisma";
|
|
12
|
+
const FIRST_NORMAL_OBJECT_ID = 16384;
|
|
13
|
+
const A = {
|
|
14
|
+
BIT_ARRAY: 1561, BOOL_ARRAY: 1000, BYTEA_ARRAY: 1001, BPCHAR_ARRAY: 1014, CHAR_ARRAY: 1002,
|
|
15
|
+
CIDR_ARRAY: 651, DATE_ARRAY: 1182, FLOAT4_ARRAY: 1021, FLOAT8_ARRAY: 1022, INET_ARRAY: 1041,
|
|
16
|
+
INT2_ARRAY: 1005, INT4_ARRAY: 1007, INT8_ARRAY: 1016, JSONB_ARRAY: 3807, JSON_ARRAY: 199,
|
|
17
|
+
MONEY_ARRAY: 791, NUMERIC_ARRAY: 1231, OID_ARRAY: 1028, TEXT_ARRAY: 1009, TIMESTAMP_ARRAY: 1115,
|
|
18
|
+
TIMESTAMPTZ_ARRAY: 1185, TIME_ARRAY: 1183, UUID_ARRAY: 2951, VARBIT_ARRAY: 1563, VARCHAR_ARRAY: 1015,
|
|
19
|
+
XML_ARRAY: 143,
|
|
20
|
+
};
|
|
21
|
+
function columnType(oid) {
|
|
22
|
+
switch (oid) {
|
|
23
|
+
case builtins.INT2:
|
|
24
|
+
case builtins.INT4:
|
|
25
|
+
return ColumnTypeEnum.Int32;
|
|
26
|
+
case builtins.INT8:
|
|
27
|
+
case builtins.OID:
|
|
28
|
+
return ColumnTypeEnum.Int64;
|
|
29
|
+
case builtins.FLOAT4:
|
|
30
|
+
return ColumnTypeEnum.Float;
|
|
31
|
+
case builtins.FLOAT8:
|
|
32
|
+
return ColumnTypeEnum.Double;
|
|
33
|
+
case builtins.BOOL:
|
|
34
|
+
return ColumnTypeEnum.Boolean;
|
|
35
|
+
case builtins.DATE:
|
|
36
|
+
return ColumnTypeEnum.Date;
|
|
37
|
+
case builtins.TIME:
|
|
38
|
+
case builtins.TIMETZ:
|
|
39
|
+
return ColumnTypeEnum.Time;
|
|
40
|
+
case builtins.TIMESTAMP:
|
|
41
|
+
case builtins.TIMESTAMPTZ:
|
|
42
|
+
return ColumnTypeEnum.DateTime;
|
|
43
|
+
case builtins.NUMERIC:
|
|
44
|
+
case builtins.MONEY:
|
|
45
|
+
return ColumnTypeEnum.Numeric;
|
|
46
|
+
case builtins.JSON:
|
|
47
|
+
case builtins.JSONB:
|
|
48
|
+
return ColumnTypeEnum.Json;
|
|
49
|
+
case builtins.UUID:
|
|
50
|
+
return ColumnTypeEnum.Uuid;
|
|
51
|
+
case builtins.BPCHAR:
|
|
52
|
+
case builtins.TEXT:
|
|
53
|
+
case builtins.VARCHAR:
|
|
54
|
+
case builtins.BIT:
|
|
55
|
+
case builtins.VARBIT:
|
|
56
|
+
case builtins.INET:
|
|
57
|
+
case builtins.CIDR:
|
|
58
|
+
case builtins.XML:
|
|
59
|
+
case 19: // name
|
|
60
|
+
return ColumnTypeEnum.Text;
|
|
61
|
+
case builtins.BYTEA:
|
|
62
|
+
return ColumnTypeEnum.Bytes;
|
|
63
|
+
case A.INT2_ARRAY:
|
|
64
|
+
case A.INT4_ARRAY:
|
|
65
|
+
return ColumnTypeEnum.Int32Array;
|
|
66
|
+
case A.FLOAT4_ARRAY:
|
|
67
|
+
return ColumnTypeEnum.FloatArray;
|
|
68
|
+
case A.FLOAT8_ARRAY:
|
|
69
|
+
return ColumnTypeEnum.DoubleArray;
|
|
70
|
+
case A.NUMERIC_ARRAY:
|
|
71
|
+
case A.MONEY_ARRAY:
|
|
72
|
+
return ColumnTypeEnum.NumericArray;
|
|
73
|
+
case A.BOOL_ARRAY:
|
|
74
|
+
return ColumnTypeEnum.BooleanArray;
|
|
75
|
+
case A.CHAR_ARRAY:
|
|
76
|
+
return ColumnTypeEnum.CharacterArray;
|
|
77
|
+
case A.BPCHAR_ARRAY:
|
|
78
|
+
case A.TEXT_ARRAY:
|
|
79
|
+
case A.VARCHAR_ARRAY:
|
|
80
|
+
case A.VARBIT_ARRAY:
|
|
81
|
+
case A.BIT_ARRAY:
|
|
82
|
+
case A.INET_ARRAY:
|
|
83
|
+
case A.CIDR_ARRAY:
|
|
84
|
+
case A.XML_ARRAY:
|
|
85
|
+
return ColumnTypeEnum.TextArray;
|
|
86
|
+
case A.DATE_ARRAY:
|
|
87
|
+
return ColumnTypeEnum.DateArray;
|
|
88
|
+
case A.TIME_ARRAY:
|
|
89
|
+
return ColumnTypeEnum.TimeArray;
|
|
90
|
+
case A.TIMESTAMP_ARRAY:
|
|
91
|
+
case A.TIMESTAMPTZ_ARRAY:
|
|
92
|
+
return ColumnTypeEnum.DateTimeArray;
|
|
93
|
+
case A.JSON_ARRAY:
|
|
94
|
+
case A.JSONB_ARRAY:
|
|
95
|
+
return ColumnTypeEnum.JsonArray;
|
|
96
|
+
case A.BYTEA_ARRAY:
|
|
97
|
+
return ColumnTypeEnum.BytesArray;
|
|
98
|
+
case A.UUID_ARRAY:
|
|
99
|
+
return ColumnTypeEnum.UuidArray;
|
|
100
|
+
case A.INT8_ARRAY:
|
|
101
|
+
case A.OID_ARRAY:
|
|
102
|
+
return ColumnTypeEnum.Int64Array;
|
|
103
|
+
default:
|
|
104
|
+
if (oid >= FIRST_NORMAL_OBJECT_ID)
|
|
105
|
+
return ColumnTypeEnum.Text;
|
|
106
|
+
throw new DriverAdapterError({ kind: "UnsupportedNativeDataType", type: String(oid) });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Prisma 는 날짜·숫자·json 을 **문자열**로 받고 자기가 해석한다 (adapter-pg 의
|
|
110
|
+
// customParsers). 그래서 질의별 파서로 텍스트를 그대로 넘긴다.
|
|
111
|
+
const text = (s) => s;
|
|
112
|
+
const timestamp = (s) => `${s.replace(" ", "T")}+00:00`;
|
|
113
|
+
const timestamptz = (s) => s.replace(" ", "T").replace(/[+-]\d{2}(:\d{2})?$/, "+00:00");
|
|
114
|
+
const timetz = (s) => s.replace(/[+-]\d{2}(:\d{2})?$/, "");
|
|
115
|
+
const money = (s) => s.slice(1);
|
|
116
|
+
const bytes = (s) => {
|
|
117
|
+
const hex = s.startsWith("\\x") ? s.slice(2) : "";
|
|
118
|
+
const out = new Uint8Array(hex.length >> 1);
|
|
119
|
+
for (let i = 0; i < out.length; i++)
|
|
120
|
+
out[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
|
|
121
|
+
return out;
|
|
122
|
+
};
|
|
123
|
+
const prismaParsers = new Map([
|
|
124
|
+
[builtins.NUMERIC, text],
|
|
125
|
+
[A.NUMERIC_ARRAY, (s) => parseArray(s, text)],
|
|
126
|
+
[builtins.TIME, text],
|
|
127
|
+
[A.TIME_ARRAY, (s) => parseArray(s, text)],
|
|
128
|
+
[builtins.TIMETZ, timetz],
|
|
129
|
+
[builtins.DATE, text],
|
|
130
|
+
[A.DATE_ARRAY, (s) => parseArray(s, text)],
|
|
131
|
+
[builtins.TIMESTAMP, timestamp],
|
|
132
|
+
[A.TIMESTAMP_ARRAY, (s) => parseArray(s, timestamp)],
|
|
133
|
+
[builtins.TIMESTAMPTZ, timestamptz],
|
|
134
|
+
[A.TIMESTAMPTZ_ARRAY, (s) => parseArray(s, timestamptz)],
|
|
135
|
+
[builtins.MONEY, money],
|
|
136
|
+
[A.MONEY_ARRAY, (s) => parseArray(s, money)],
|
|
137
|
+
[builtins.JSON, text],
|
|
138
|
+
[A.JSON_ARRAY, (s) => parseArray(s, text)],
|
|
139
|
+
[builtins.JSONB, text],
|
|
140
|
+
[A.JSONB_ARRAY, (s) => parseArray(s, text)],
|
|
141
|
+
[builtins.BYTEA, bytes],
|
|
142
|
+
[A.BYTEA_ARRAY, (s) => parseArray(s, bytes)],
|
|
143
|
+
[A.BIT_ARRAY, (s) => parseArray(s, text)],
|
|
144
|
+
[A.VARBIT_ARRAY, (s) => parseArray(s, text)],
|
|
145
|
+
[A.XML_ARRAY, (s) => parseArray(s, text)],
|
|
146
|
+
]);
|
|
147
|
+
const pad = (n, z = 2) => String(n).padStart(z, "0");
|
|
148
|
+
function fmtDateTime(d) {
|
|
149
|
+
const ms = d.getUTCMilliseconds();
|
|
150
|
+
return `${pad(d.getUTCFullYear(), 4)}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())} ${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}${ms ? "." + pad(ms, 3) : ""}`;
|
|
151
|
+
}
|
|
152
|
+
function fmtDate(d) {
|
|
153
|
+
return `${pad(d.getUTCFullYear(), 4)}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())}`;
|
|
154
|
+
}
|
|
155
|
+
function fmtTime(d) {
|
|
156
|
+
const ms = d.getUTCMilliseconds();
|
|
157
|
+
return `${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}${ms ? "." + pad(ms, 3) : ""}`;
|
|
158
|
+
}
|
|
159
|
+
function mapArg(arg, argType) {
|
|
160
|
+
if (arg === null)
|
|
161
|
+
return null;
|
|
162
|
+
if (Array.isArray(arg) && argType.arity === "list")
|
|
163
|
+
return arg.map((v) => mapArg(v, argType));
|
|
164
|
+
if (typeof arg === "string" && argType.scalarType === "datetime")
|
|
165
|
+
arg = new Date(arg);
|
|
166
|
+
if (arg instanceof Date) {
|
|
167
|
+
switch (argType.dbType) {
|
|
168
|
+
case "TIME":
|
|
169
|
+
case "TIMETZ":
|
|
170
|
+
return fmtTime(arg);
|
|
171
|
+
case "DATE":
|
|
172
|
+
return fmtDate(arg);
|
|
173
|
+
default:
|
|
174
|
+
return fmtDateTime(arg);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (typeof arg === "string" && argType.scalarType === "bytes") {
|
|
178
|
+
const bin = atob(arg);
|
|
179
|
+
const out = new Uint8Array(bin.length);
|
|
180
|
+
for (let i = 0; i < bin.length; i++)
|
|
181
|
+
out[i] = bin.charCodeAt(i);
|
|
182
|
+
return out;
|
|
183
|
+
}
|
|
184
|
+
if (ArrayBuffer.isView(arg))
|
|
185
|
+
return new Uint8Array(arg.buffer, arg.byteOffset, arg.byteLength);
|
|
186
|
+
return arg;
|
|
187
|
+
}
|
|
188
|
+
function convertError(e) {
|
|
189
|
+
if (e instanceof DatabaseError) {
|
|
190
|
+
const detail = e.detail;
|
|
191
|
+
const fields = detail?.match(/Key \(([^)]+)\)/)?.[1]?.split(", ");
|
|
192
|
+
switch (e.code) {
|
|
193
|
+
case "22001":
|
|
194
|
+
throw new DriverAdapterError({ kind: "LengthMismatch", originalCode: e.code, originalMessage: e.message });
|
|
195
|
+
case "23505":
|
|
196
|
+
throw new DriverAdapterError({ kind: "UniqueConstraintViolation", constraint: fields ? { fields } : undefined, originalCode: e.code, originalMessage: e.message });
|
|
197
|
+
case "23502":
|
|
198
|
+
throw new DriverAdapterError({ kind: "NullConstraintViolation", constraint: fields ? { fields } : undefined, originalCode: e.code, originalMessage: e.message });
|
|
199
|
+
case "23503":
|
|
200
|
+
throw new DriverAdapterError({ kind: "ForeignKeyConstraintViolation", originalCode: e.code, originalMessage: e.message });
|
|
201
|
+
case "40001":
|
|
202
|
+
case "40P01":
|
|
203
|
+
throw new DriverAdapterError({ kind: "TransactionWriteConflict", originalCode: e.code, originalMessage: e.message });
|
|
204
|
+
case "42P01":
|
|
205
|
+
throw new DriverAdapterError({ kind: "TableDoesNotExist", table: e.message.split(" ")[1]?.split('"')[1], originalCode: e.code, originalMessage: e.message });
|
|
206
|
+
case "42703":
|
|
207
|
+
throw new DriverAdapterError({ kind: "ColumnNotFound", column: e.message.match(/^column (.+) does not exist$/)?.[1], originalCode: e.code, originalMessage: e.message });
|
|
208
|
+
case "53300":
|
|
209
|
+
throw new DriverAdapterError({ kind: "TooManyConnections", cause: e.message, originalCode: e.code, originalMessage: e.message });
|
|
210
|
+
default:
|
|
211
|
+
throw new DriverAdapterError({
|
|
212
|
+
kind: "postgres",
|
|
213
|
+
code: e.code,
|
|
214
|
+
severity: e.severity,
|
|
215
|
+
message: e.message,
|
|
216
|
+
detail: e.detail,
|
|
217
|
+
column: undefined,
|
|
218
|
+
hint: e.hint,
|
|
219
|
+
originalCode: e.code,
|
|
220
|
+
originalMessage: e.message,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
throw e;
|
|
225
|
+
}
|
|
226
|
+
class Queryable {
|
|
227
|
+
client;
|
|
228
|
+
provider = "postgres";
|
|
229
|
+
adapterName = ADAPTER_NAME;
|
|
230
|
+
constructor(client) {
|
|
231
|
+
this.client = client;
|
|
232
|
+
}
|
|
233
|
+
async queryRaw(query) {
|
|
234
|
+
const { fields, rows } = await this.perform(query);
|
|
235
|
+
return {
|
|
236
|
+
columnNames: fields.map((f) => f.name),
|
|
237
|
+
columnTypes: fields.map((f) => columnType(f.dataTypeID)),
|
|
238
|
+
rows: rows,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
async executeRaw(query) {
|
|
242
|
+
return (await this.perform(query)).rowCount ?? 0;
|
|
243
|
+
}
|
|
244
|
+
async perform(query) {
|
|
245
|
+
const values = query.args.map((a, i) => mapArg(a, query.argTypes[i]));
|
|
246
|
+
try {
|
|
247
|
+
return await this.client.query({
|
|
248
|
+
text: query.sql,
|
|
249
|
+
values,
|
|
250
|
+
rowMode: "array",
|
|
251
|
+
types: { getTypeParser: (oid) => prismaParsers.get(oid) ?? defaultParser(oid) },
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
catch (e) {
|
|
255
|
+
convertError(e);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// Prisma 가 파서를 안 등록한 타입은 pg 기본 파서다 — 우리 어댑터의 기본 변환과
|
|
260
|
+
// 같다. 그 변환은 `convertCell` 이 lookup 없이 하는 것이므로, 여기서는 "등록
|
|
261
|
+
// 없음" 을 뜻하는 identity 를 주지 않고 undefined 를 돌려줘야 하는데, pg 의
|
|
262
|
+
// `types.getTypeParser` 는 늘 함수를 돌려준다. 그래서 텍스트 그대로를 준다.
|
|
263
|
+
// (int/bool/float 은 Prisma 가 ColumnType 으로 스스로 해석한다.)
|
|
264
|
+
function defaultParser(_oid) {
|
|
265
|
+
return text;
|
|
266
|
+
}
|
|
267
|
+
class RunlotTransaction extends Queryable {
|
|
268
|
+
conn;
|
|
269
|
+
options;
|
|
270
|
+
constructor(conn, options) {
|
|
271
|
+
super(conn);
|
|
272
|
+
this.conn = conn;
|
|
273
|
+
this.options = options;
|
|
274
|
+
}
|
|
275
|
+
async commit() {
|
|
276
|
+
this.conn.release();
|
|
277
|
+
}
|
|
278
|
+
async rollback() {
|
|
279
|
+
this.conn.release();
|
|
280
|
+
}
|
|
281
|
+
async createSavepoint(name) {
|
|
282
|
+
await this.executeRaw({ sql: `SAVEPOINT ${name}`, args: [], argTypes: [] });
|
|
283
|
+
}
|
|
284
|
+
async rollbackToSavepoint(name) {
|
|
285
|
+
await this.executeRaw({ sql: `ROLLBACK TO SAVEPOINT ${name}`, args: [], argTypes: [] });
|
|
286
|
+
}
|
|
287
|
+
async releaseSavepoint(name) {
|
|
288
|
+
await this.executeRaw({ sql: `RELEASE SAVEPOINT ${name}`, args: [], argTypes: [] });
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
export class RunlotPrismaAdapter extends Queryable {
|
|
292
|
+
pool;
|
|
293
|
+
constructor(pool) {
|
|
294
|
+
super(pool);
|
|
295
|
+
this.pool = pool;
|
|
296
|
+
}
|
|
297
|
+
async startTransaction(isolationLevel) {
|
|
298
|
+
const conn = await this.pool.connect().catch(convertError);
|
|
299
|
+
const tx = new RunlotTransaction(conn, { usePhantomQuery: false });
|
|
300
|
+
try {
|
|
301
|
+
await tx.executeRaw({ sql: "BEGIN", args: [], argTypes: [] });
|
|
302
|
+
if (isolationLevel)
|
|
303
|
+
await tx.executeRaw({ sql: `SET TRANSACTION ISOLATION LEVEL ${isolationLevel}`, args: [], argTypes: [] });
|
|
304
|
+
return tx;
|
|
305
|
+
}
|
|
306
|
+
catch (e) {
|
|
307
|
+
conn.release(e);
|
|
308
|
+
throw e;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
async executeScript(script) {
|
|
312
|
+
for (const stmt of script.split(";").map((s) => s.trim()).filter(Boolean)) {
|
|
313
|
+
try {
|
|
314
|
+
await this.pool.query(stmt);
|
|
315
|
+
}
|
|
316
|
+
catch (e) {
|
|
317
|
+
convertError(e);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
getConnectionInfo() {
|
|
322
|
+
return { supportsRelationJoins: true };
|
|
323
|
+
}
|
|
324
|
+
async dispose() {
|
|
325
|
+
await this.pool.end();
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/** `new PrismaClient({ adapter: new PrismaRunlot(env.db) })`. */
|
|
329
|
+
export class PrismaRunlot {
|
|
330
|
+
db;
|
|
331
|
+
provider = "postgres";
|
|
332
|
+
adapterName = ADAPTER_NAME;
|
|
333
|
+
constructor(db) {
|
|
334
|
+
this.db = db;
|
|
335
|
+
}
|
|
336
|
+
async connect() {
|
|
337
|
+
return new RunlotPrismaAdapter(new Pool({ db: this.db }));
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
//# sourceMappingURL=prisma.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma.js","sourceRoot":"","sources":["../../src/orm/prisma.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequelize.d.ts","sourceRoot":"","sources":["../../src/orm/sequelize.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpD,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEtC,wBAAgB,SAAS,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,eAAe,CAAC,GAAG,SAAS,CAWjG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Sequelize: `dialectModule` 에 우리 모듈을 준다.
|
|
2
|
+
//
|
|
3
|
+
// Sequelize 의 pg 연결 관리자는 `new Client(config)` + `connect(cb)` 를 부르고,
|
|
4
|
+
// `client.connection.on('parameterStatus')` 를 건 뒤 `SET client_min_messages`
|
|
5
|
+
// 등을 한 문장으로 보낸다. 그 뒤 `pg_type` 을 읽어 enum/range OID 를 캐시한다
|
|
6
|
+
// (`_refreshDynamicOIDs`) — 그래서 첫 연결이 한 번 더 비싸다.
|
|
7
|
+
import { Sequelize } from "sequelize";
|
|
8
|
+
import { pgModule } from "../client.js";
|
|
9
|
+
export function sequelize(db, options) {
|
|
10
|
+
return new Sequelize({
|
|
11
|
+
...(options ?? {}),
|
|
12
|
+
dialect: "postgres",
|
|
13
|
+
dialectModule: pgModule(db),
|
|
14
|
+
database: "runlot",
|
|
15
|
+
username: "runlot",
|
|
16
|
+
// Sequelize 는 pool 을 sequelize-pool 로 관리한다. 유휴 세션을 쥐지 않게 한다.
|
|
17
|
+
pool: { min: 0, max: 4, idle: 1000, ...(options?.pool ?? {}) },
|
|
18
|
+
logging: options?.logging ?? false,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=sequelize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequelize.js","sourceRoot":"","sources":["../../src/orm/sequelize.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,EAAE;AACF,qEAAqE;AACrE,4EAA4E;AAC5E,0DAA0D;AAC1D,iDAAiD;AACjD,OAAO,EAAE,SAAS,EAAgB,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAGxC,MAAM,UAAU,SAAS,CAAC,EAAM,EAAE,OAAoD;IACpF,OAAO,IAAI,SAAS,CAAC;QACnB,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;QAClB,OAAO,EAAE,UAAU;QACnB,aAAa,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC3B,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,QAAQ;QAClB,6DAA6D;QAC7D,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,EAAE;QAC9D,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,KAAK;KACnC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import { DataSource, type DataSourceOptions } from "typeorm";
|
|
3
|
+
import type { Db } from "../types.js";
|
|
4
|
+
type PostgresOptions = Extract<DataSourceOptions, {
|
|
5
|
+
type: "postgres";
|
|
6
|
+
}>;
|
|
7
|
+
export type TypeormOptions = Omit<PostgresOptions, "type" | "driver" | "url" | "host" | "port" | "username" | "password" | "database">;
|
|
8
|
+
export declare function dataSourceOptions(db: Db, options: TypeormOptions): DataSourceOptions;
|
|
9
|
+
export declare function dataSource(db: Db, options: TypeormOptions): DataSource;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=typeorm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeorm.d.ts","sourceRoot":"","sources":["../../src/orm/typeorm.ts"],"names":[],"mappings":"AAKA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAG7D,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEtC,KAAK,eAAe,GAAG,OAAO,CAAC,iBAAiB,EAAE;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC,CAAC;AACxE,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC,CAAC;AAEvI,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,iBAAiB,CAQpF;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,UAAU,CAEtE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// TypeORM: `postgres` 드라이버에 `driver` 옵션으로 모듈을 주입한다
|
|
2
|
+
// (PostgresDriver.loadDependencies). 그 모듈의 `Pool` 을 자기 옵션으로 만들므로
|
|
3
|
+
// `db` 를 묶은 모듈이 필요하다.
|
|
4
|
+
//
|
|
5
|
+
// TypeORM 은 `reflect-metadata` 를 전역에 요구한다 — 여기서 import 한다.
|
|
6
|
+
import "reflect-metadata";
|
|
7
|
+
import { DataSource } from "typeorm";
|
|
8
|
+
import { pgModule } from "../client.js";
|
|
9
|
+
export function dataSourceOptions(db, options) {
|
|
10
|
+
return {
|
|
11
|
+
...options,
|
|
12
|
+
type: "postgres",
|
|
13
|
+
driver: pgModule(db),
|
|
14
|
+
// 값은 쓰이지 않지만 TypeORM 이 빈 자격에 경고를 낸다.
|
|
15
|
+
database: "runlot",
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function dataSource(db, options) {
|
|
19
|
+
return new DataSource(dataSourceOptions(db, options));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=typeorm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeorm.js","sourceRoot":"","sources":["../../src/orm/typeorm.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,iEAAiE;AACjE,sBAAsB;AACtB,EAAE;AACF,2DAA2D;AAC3D,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAA0B,MAAM,SAAS,CAAC;AAE7D,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAMxC,MAAM,UAAU,iBAAiB,CAAC,EAAM,EAAE,OAAuB;IAC/D,OAAO;QACL,GAAG,OAAO;QACV,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;QACpB,qCAAqC;QACrC,QAAQ,EAAE,QAAQ;KACE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAM,EAAE,OAAuB;IACxD,OAAO,IAAI,UAAU,CAAC,iBAAiB,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;AACxD,CAAC"}
|