@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/README.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# @runlot/pg
|
|
2
|
+
|
|
3
|
+
`env.db` 위에서 node-postgres(`pg`) 모양으로 쓰는 어댑터예요. 이미 `pg` 를 쓰는 코드와
|
|
4
|
+
ORM 을 고치지 않고 runlot 의 데이터베이스에 붙일 수 있어요.
|
|
5
|
+
|
|
6
|
+
```ts
|
|
7
|
+
import { Pool } from "@runlot/pg";
|
|
8
|
+
|
|
9
|
+
export default {
|
|
10
|
+
async fetch(req, env) {
|
|
11
|
+
const pool = new Pool({ db: env.db });
|
|
12
|
+
const { rows } = await pool.query("select id, name from users where id = $1", [1]);
|
|
13
|
+
return Response.json(rows);
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## 무엇이 되나요
|
|
19
|
+
|
|
20
|
+
- `Pool.query(text, values)` — 호출마다 새 세션이에요. 문장 하나짜리 질의에 알맞아요.
|
|
21
|
+
- `Pool.connect()` / `new Client({ db })` — 세션 하나를 쥐어요. `BEGIN … COMMIT`,
|
|
22
|
+
prepared statement, `SET` 이 그 안에서 유지돼요. `release()` 나 `end()` 로 돌려주세요.
|
|
23
|
+
- 오류는 `DatabaseError` 로 던지고 `err.code` 가 SQLSTATE 예요 (`23505` 같은 값).
|
|
24
|
+
- `types.setTypeParser(oid, fn)` 으로 타입 변환을 바꿀 수 있어요. 기본은 `pg` 와
|
|
25
|
+
같아요 — `timestamptz`·`date` 는 `Date`, `int8`·`numeric` 은 문자열이에요.
|
|
26
|
+
|
|
27
|
+
## ORM
|
|
28
|
+
|
|
29
|
+
| ORM | 쓰는 법 |
|
|
30
|
+
|---|---|
|
|
31
|
+
| Prisma | `import { PrismaRunlot } from "@runlot/pg/prisma"` → `new PrismaClient({ adapter: new PrismaRunlot(env.db) })` |
|
|
32
|
+
| Drizzle | `import { drizzle } from "@runlot/pg/drizzle"` → `drizzle(env.db, { schema })` |
|
|
33
|
+
| Kysely | `import { kysely } from "@runlot/pg/kysely"` → `kysely<DB>(env.db)` |
|
|
34
|
+
| TypeORM | `import { dataSource } from "@runlot/pg/typeorm"` → `dataSource(env.db, { entities })` |
|
|
35
|
+
| Sequelize | `import { sequelize } from "@runlot/pg/sequelize"` → `sequelize(env.db)` |
|
|
36
|
+
| Knex | `import { knex } from "@runlot/pg/knex"` → `knex(env.db)` |
|
|
37
|
+
|
|
38
|
+
`runlot deploy` 로 배포하면 따로 할 일이 없어요. 배포 번들러(`@runlot/pg/bundler`)가
|
|
39
|
+
`pg` 를 이 패키지로 풀고, ORM 이 node 내장 모듈을 쓰면 `nodejs_compat` 를,
|
|
40
|
+
Prisma 의 WASM 쿼리 컴파일러는 별도 모듈로 `runlot.json` 에 적어 줘요.
|
|
41
|
+
|
|
42
|
+
다른 도구로 직접 묶는다면 같은 일을 해 줘야 해요: `pg` → `@runlot/pg` alias,
|
|
43
|
+
node 내장은 `node:` 접두로 외부에 두고 매니페스트에 `"compatibilityFlags":
|
|
44
|
+
["nodejs_compat"]`, `fs`·`os`·`tty` 는 빈 스텁, `.wasm` 은 번들 밖 모듈로 두고
|
|
45
|
+
매니페스트 `modules` 에 `{ "name", "type": "wasm", "path" }` 로 적기. `buildWorker`
|
|
46
|
+
를 직접 불러도 돼요:
|
|
47
|
+
|
|
48
|
+
```ts
|
|
49
|
+
import { buildWorker } from "@runlot/pg/bundler";
|
|
50
|
+
const { code, report } = await buildWorker({ entry: "src/index.ts", absWorkingDir: process.cwd() });
|
|
51
|
+
// report.nodeImports 가 비어 있지 않으면 nodejs_compat, report.wasmModules 는 곁에 실을 파일
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 개발
|
|
55
|
+
|
|
56
|
+
```sh
|
|
57
|
+
pnpm --filter @runlot/pg test # 가짜 env.db 상대 단위 시험
|
|
58
|
+
pnpm --filter @runlot/pg e2e:build # e2e/*.ts → e2e-dist/*.js (실물 workerd 시험용)
|
|
59
|
+
go test ./node/internal/workerd -run TestLiveORM -v # 실물 workerd 위 ORM 별 E2E
|
|
60
|
+
```
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface WasmModule {
|
|
2
|
+
/** 워커가 import 하는 지정자이자 매니페스트 `modules[].name`. */
|
|
3
|
+
name: string;
|
|
4
|
+
/** 소스 파일의 절대 경로. */
|
|
5
|
+
path: string;
|
|
6
|
+
}
|
|
7
|
+
export interface WorkerBundleReport {
|
|
8
|
+
/** 워커가 외부에 남긴 node 내장 (`node:util` 꼴, 정렬). 비어 있지 않으면 `nodejs_compat` 가 필요하다. */
|
|
9
|
+
nodeImports: string[];
|
|
10
|
+
/** 곁에 실어야 하는 wasm 모듈. */
|
|
11
|
+
wasmModules: WasmModule[];
|
|
12
|
+
}
|
|
13
|
+
export interface BuildWorkerOptions {
|
|
14
|
+
/** 진입점. absWorkingDir 기준 상대 또는 절대 경로. */
|
|
15
|
+
entry: string;
|
|
16
|
+
absWorkingDir: string;
|
|
17
|
+
/** metafile 의 출력 이름. 기본 `worker/index.js`. 파일은 쓰지 않는다. */
|
|
18
|
+
outfile?: string;
|
|
19
|
+
/** `pg` 를 어디로 보낼지. 기본 `@runlot/pg`. 풀리지 않으면 `pg` 는 그대로 둔다. */
|
|
20
|
+
pgAlias?: string;
|
|
21
|
+
define?: Record<string, string>;
|
|
22
|
+
minify?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface WorkerBundle {
|
|
25
|
+
code: Uint8Array;
|
|
26
|
+
report: WorkerBundleReport;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 워커 하나를 묶는다. 파일은 쓰지 않는다 — 바이트와 보고서를 돌려주고, 어디에
|
|
30
|
+
* 어떤 이름으로 둘지는 부르는 쪽(배포 도구·E2E)이 정한다.
|
|
31
|
+
*/
|
|
32
|
+
export declare function buildWorker(opts: BuildWorkerOptions): Promise<WorkerBundle>;
|
|
33
|
+
//# sourceMappingURL=bundler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundler.d.ts","sourceRoot":"","sources":["../src/bundler.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,UAAU;IACzB,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,gFAAgF;IAChF,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,yBAAyB;IACzB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AA+JD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CA2CjF"}
|
package/dist/bundler.js
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
// 워커 번들러 — 사용자의 배포 도구(`runlot deploy`)와 이 패키지의 E2E 가 **같은**
|
|
2
|
+
// 규칙으로 워커를 묶는다 (docs/pg-driver-support.md §3.3 "번들러가 한 일과 그 뜻").
|
|
3
|
+
//
|
|
4
|
+
// 규칙이 한 곳에 있어야 하는 이유: E2E 가 실물 workerd 에서 재는 것은 "이 규칙으로
|
|
5
|
+
// 묶은 워커가 도는가" 다. 배포 도구가 다른 규칙으로 묶으면 그 초록은 사용자의
|
|
6
|
+
// 배포에 대한 답이 아니다.
|
|
7
|
+
//
|
|
8
|
+
// 하는 일:
|
|
9
|
+
// - `pg` → `@runlot/pg`. ORM 들이 `import pg from "pg"` 를 모듈 최상단에서 한다.
|
|
10
|
+
// - node 내장은 `node:` 접두로 외부에 남긴다 (workerd 의 `nodejs_compat` 가
|
|
11
|
+
// 푼다). 어느 내장을 요구했는지가 report.nodeImports 에 남고, 비어 있지
|
|
12
|
+
// 않으면 배포 도구가 매니페스트에 `nodejs_compat` 를 적는다.
|
|
13
|
+
// - 이 workerd 빌드의 `nodejs_compat` 에 **없는** 셋(`fs`·`os`·`tty`, 실측)과
|
|
14
|
+
// 로드 시점에 파일 URL 을 요구하는 `module` 은 스텁으로 채운다 — wrangler 가
|
|
15
|
+
// unenv 로 채우는 자리다. ORM 은 로드 시점에 이것들을 require 하고 우리가
|
|
16
|
+
// 도는 경로에서는 쓰지 않는다. 쓰면 던진다.
|
|
17
|
+
// - CJS 의 `require("util")` 은 배너의 require 표로 푼다. ESM 출력에서 동적
|
|
18
|
+
// require 는 남을 수 없고, esbuild 의 가교(`__toCommonJS`)는 객체를 만들어
|
|
19
|
+
// `assert(x)` 처럼 default 가 함수인 모듈이 죽는다 (실측). 그래서 정적으로
|
|
20
|
+
// import 한 네임스페이스를 돌려주는 표를 하나 만들고, default 가 함수면
|
|
21
|
+
// 그것을 준다. 표는 첫 번들이 무엇을 require 했는지 본 뒤 두 번째 번들에 얹는다.
|
|
22
|
+
// - `.wasm` 은 번들 밖 모듈 이름으로 남긴다. workerd 는 번들 안 WASM 컴파일을
|
|
23
|
+
// 막으므로("Wasm code generation disallowed by embedder") 설정의 `wasm = embed`
|
|
24
|
+
// 모듈로만 들어간다. report.wasmModules 가 어떤 파일을 어떤 이름으로 곁에
|
|
25
|
+
// 둬야 하는지 말하고, 배포 도구가 그것을 번들에 싣고 매니페스트 `modules`
|
|
26
|
+
// 에 적는다.
|
|
27
|
+
// - `debug` 는 브라우저 빌드로. node 빌드가 로드 시점에 `process.stderr.fd` 를 만진다.
|
|
28
|
+
// - 다른 DB 드라이버·선택 의존은 빈 모듈로. 워커에 없고 필요도 없다.
|
|
29
|
+
import { createHash } from "node:crypto";
|
|
30
|
+
import { build } from "esbuild";
|
|
31
|
+
/** node 내장 모듈 이름. bare 이름(`util`)을 `node:util` 로 바꿔 외부로 남긴다. */
|
|
32
|
+
const NODE_BUILTINS = new Set([
|
|
33
|
+
"assert", "async_hooks", "buffer", "child_process", "cluster", "console", "constants", "crypto", "dgram",
|
|
34
|
+
"diagnostics_channel", "dns", "domain", "events", "fs", "http", "http2", "https", "inspector", "module", "net",
|
|
35
|
+
"os", "path", "perf_hooks", "process", "punycode", "querystring", "readline", "repl", "stream", "string_decoder",
|
|
36
|
+
"sys", "timers", "tls", "trace_events", "tty", "url", "util", "v8", "vm", "wasi", "worker_threads", "zlib",
|
|
37
|
+
]);
|
|
38
|
+
/** 다른 DB 드라이버·선택 의존. 빈 모듈로 푼다. */
|
|
39
|
+
const EMPTY = new Set([
|
|
40
|
+
"mariadb/callback", "mariadb", "mysql", "mysql2", "sqlite3", "better-sqlite3", "oracledb", "tedious", "mssql",
|
|
41
|
+
"ibm_db", "pg-native", "pg-query-stream", "pg-hstore", "pg-copy-streams", "snowflake-sdk", "@sap/hana-client",
|
|
42
|
+
"hdb-pool", "mongodb", "typeorm-aurora-data-api-driver", "sql.js", "react-native-sqlite-storage",
|
|
43
|
+
"@google-cloud/spanner", "spanner", "libsql", "@libsql/client", "@sqlite.org/sqlite-wasm", "sap-hana-client",
|
|
44
|
+
"@sap/hana-client/extension/Stream", "pg-cloudflare", "cloudflare:sockets", "pgpass",
|
|
45
|
+
]);
|
|
46
|
+
/** `nodejs_compat` 에 없거나(fs·os·tty) 로드 시점에 파일 URL 을 요구하는(module) 내장의 스텁. */
|
|
47
|
+
const STUBS = {
|
|
48
|
+
fs: `// node:fs 의 빈 스텁. 이 workerd 빌드의 nodejs_compat 에는 fs 가 없다 (실측).
|
|
49
|
+
const missing = (name) => (..._a) => { throw new Error("node:fs." + name + " 은 워커에 없습니다"); };
|
|
50
|
+
export const existsSync = () => false;
|
|
51
|
+
export const readFileSync = missing("readFileSync");
|
|
52
|
+
export const writeFileSync = missing("writeFileSync");
|
|
53
|
+
export const appendFileSync = missing("appendFileSync");
|
|
54
|
+
export const statSync = missing("statSync");
|
|
55
|
+
export const lstatSync = missing("lstatSync");
|
|
56
|
+
export const readdirSync = missing("readdirSync");
|
|
57
|
+
export const mkdirSync = missing("mkdirSync");
|
|
58
|
+
export const unlinkSync = missing("unlinkSync");
|
|
59
|
+
export const realpathSync = missing("realpathSync");
|
|
60
|
+
export const createReadStream = missing("createReadStream");
|
|
61
|
+
export const createWriteStream = missing("createWriteStream");
|
|
62
|
+
export const readFile = missing("readFile");
|
|
63
|
+
export const writeFile = missing("writeFile");
|
|
64
|
+
export const readdir = missing("readdir");
|
|
65
|
+
export const realpath = missing("realpath");
|
|
66
|
+
export const stat = missing("stat");
|
|
67
|
+
export const lstat = missing("lstat");
|
|
68
|
+
export const mkdir = missing("mkdir");
|
|
69
|
+
export const unlink = missing("unlink");
|
|
70
|
+
export const access = missing("access");
|
|
71
|
+
export const promises = {
|
|
72
|
+
readFile: missing("readFile"), writeFile: missing("writeFile"), stat: missing("stat"), lstat: missing("lstat"),
|
|
73
|
+
access: missing("access"), readdir: missing("readdir"), realpath: missing("realpath"), mkdir: missing("mkdir"), unlink: missing("unlink"),
|
|
74
|
+
};
|
|
75
|
+
export const constants = { F_OK: 0, R_OK: 4, W_OK: 2, X_OK: 1 };
|
|
76
|
+
export default {
|
|
77
|
+
existsSync, readFileSync, writeFileSync, appendFileSync, statSync, lstatSync, readdirSync, mkdirSync, unlinkSync, realpathSync,
|
|
78
|
+
createReadStream, createWriteStream, readFile, writeFile, readdir, realpath, stat, lstat, mkdir, unlink, access, promises, constants,
|
|
79
|
+
};
|
|
80
|
+
`,
|
|
81
|
+
os: `// node:os 스텁. unenv 와 같은 값이다.
|
|
82
|
+
export const EOL = "\\n";
|
|
83
|
+
export const platform = () => "linux";
|
|
84
|
+
export const type = () => "Linux";
|
|
85
|
+
export const release = () => "";
|
|
86
|
+
export const hostname = () => "localhost";
|
|
87
|
+
export const homedir = () => "/";
|
|
88
|
+
export const tmpdir = () => "/tmp";
|
|
89
|
+
export const cpus = () => [];
|
|
90
|
+
export const totalmem = () => 0;
|
|
91
|
+
export const freemem = () => 0;
|
|
92
|
+
export const arch = () => "wasm";
|
|
93
|
+
export const endianness = () => "LE";
|
|
94
|
+
export const networkInterfaces = () => ({});
|
|
95
|
+
export const userInfo = () => ({ username: "", uid: -1, gid: -1, shell: null, homedir: "/" });
|
|
96
|
+
export default { EOL, platform, type, release, hostname, homedir, tmpdir, cpus, totalmem, freemem, arch, endianness, networkInterfaces, userInfo };
|
|
97
|
+
`,
|
|
98
|
+
tty: `// node:tty 스텁. colorette(knex) 가 색을 켤지 물을 때만 쓴다.
|
|
99
|
+
export const isatty = () => false;
|
|
100
|
+
export class ReadStream {}
|
|
101
|
+
export class WriteStream {}
|
|
102
|
+
export default { isatty, ReadStream, WriteStream };
|
|
103
|
+
`,
|
|
104
|
+
module: `// node:module 스텁. fdir(tinyglobby ← TypeORM) 가 모듈 최상단에서 createRequire(import.meta.url) 를
|
|
105
|
+
// 부르는데, 워커의 import.meta.url 은 파일 URL 이 아니라 실제 node:module 이 던진다. 로드만 지나가면 된다.
|
|
106
|
+
export function createRequire(_from) {
|
|
107
|
+
return (id) => { throw new Error("require(" + JSON.stringify(id) + ") 은 워커에 없습니다"); };
|
|
108
|
+
}
|
|
109
|
+
export const builtinModules = [];
|
|
110
|
+
export default { createRequire, builtinModules };
|
|
111
|
+
`,
|
|
112
|
+
};
|
|
113
|
+
const STUB_NS = "runlot-stub";
|
|
114
|
+
const EMPTY_NS = "runlot-empty";
|
|
115
|
+
function requireBanner(mods) {
|
|
116
|
+
const names = [...mods].sort();
|
|
117
|
+
const lines = [];
|
|
118
|
+
names.forEach((m, i) => lines.push(`import * as __rl_node_${i} from ${JSON.stringify(m)};`));
|
|
119
|
+
lines.push(`const __rl_node = { ${names.map((m, i) => `${JSON.stringify(m)}: __rl_node_${i}`).join(", ")} };`);
|
|
120
|
+
lines.push(`const require = (id) => { const k = id.startsWith("node:") ? id : "node:" + id; const ns = __rl_node[k]; ` +
|
|
121
|
+
`if (!ns) throw new Error("require(" + JSON.stringify(id) + ") 은 워커에 없습니다"); ` +
|
|
122
|
+
`return typeof ns.default === "function" ? ns.default : (ns.default && typeof ns.default === "object" && Object.keys(ns).length <= 1 ? ns.default : ns); };`);
|
|
123
|
+
return lines.join("\n");
|
|
124
|
+
}
|
|
125
|
+
/** wasm 파일의 모듈 이름. 기본은 파일 이름이고, 다른 파일이 같은 이름을 쓰면 해시를 붙인다. */
|
|
126
|
+
function wasmName(state, abs) {
|
|
127
|
+
const base = abs.slice(abs.lastIndexOf("/") + 1);
|
|
128
|
+
const have = state.wasm.get(base);
|
|
129
|
+
if (have === undefined || have === abs)
|
|
130
|
+
return base;
|
|
131
|
+
const h = createHash("sha256").update(abs).digest("hex").slice(0, 8);
|
|
132
|
+
return base.replace(/\.wasm$/, `-${h}.wasm`);
|
|
133
|
+
}
|
|
134
|
+
function workerPlugin(state, opts) {
|
|
135
|
+
const pgAlias = opts.pgAlias ?? "@runlot/pg";
|
|
136
|
+
return {
|
|
137
|
+
name: "runlot-worker",
|
|
138
|
+
setup(b) {
|
|
139
|
+
b.onResolve({ filter: /\.wasm(\?module)?$/ }, (args) => {
|
|
140
|
+
const rel = args.path.replace(/\?module$/, "");
|
|
141
|
+
const abs = rel.startsWith("/") ? rel : new URL(rel, "file://" + args.resolveDir + "/").pathname;
|
|
142
|
+
const name = wasmName(state, abs);
|
|
143
|
+
state.wasm.set(name, abs);
|
|
144
|
+
return { path: name, external: true };
|
|
145
|
+
});
|
|
146
|
+
b.onResolve({ filter: /^[^./]/ }, async (args) => {
|
|
147
|
+
if (args.namespace === STUB_NS || args.namespace === EMPTY_NS)
|
|
148
|
+
return undefined;
|
|
149
|
+
if (args.path === "pg" && args.kind !== "entry-point") {
|
|
150
|
+
const r = await b.resolve(pgAlias, { kind: args.kind, resolveDir: opts.absWorkingDir, importer: args.importer });
|
|
151
|
+
if (r.errors.length === 0 && r.path)
|
|
152
|
+
return { path: r.path };
|
|
153
|
+
return undefined;
|
|
154
|
+
}
|
|
155
|
+
if (args.path === "debug" && args.namespace !== "debug-browser") {
|
|
156
|
+
const r = await b.resolve("debug/src/browser.js", { kind: args.kind, resolveDir: args.resolveDir, namespace: "debug-browser" });
|
|
157
|
+
if (r.errors.length === 0 && r.path)
|
|
158
|
+
return { path: r.path };
|
|
159
|
+
}
|
|
160
|
+
const bare = args.path.startsWith("node:") ? args.path.slice(5) : args.path;
|
|
161
|
+
const bareBase = bare.split("/")[0];
|
|
162
|
+
if (NODE_BUILTINS.has(bare) || (NODE_BUILTINS.has(bareBase) && bare.startsWith(bareBase + "/"))) {
|
|
163
|
+
state.nodeBuiltins.add("node:" + bare);
|
|
164
|
+
if (bare in STUBS)
|
|
165
|
+
return { path: bare, namespace: STUB_NS };
|
|
166
|
+
if (args.kind === "require-call")
|
|
167
|
+
state.requireBuiltins.add("node:" + bare);
|
|
168
|
+
return { path: "node:" + bare, external: true };
|
|
169
|
+
}
|
|
170
|
+
if (EMPTY.has(args.path))
|
|
171
|
+
return { path: args.path, namespace: EMPTY_NS };
|
|
172
|
+
return undefined;
|
|
173
|
+
});
|
|
174
|
+
b.onLoad({ filter: /.*/, namespace: STUB_NS }, (args) => ({ contents: STUBS[args.path], loader: "js" }));
|
|
175
|
+
b.onLoad({ filter: /.*/, namespace: EMPTY_NS }, () => ({ contents: "export default {};", loader: "js" }));
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* 워커 하나를 묶는다. 파일은 쓰지 않는다 — 바이트와 보고서를 돌려주고, 어디에
|
|
181
|
+
* 어떤 이름으로 둘지는 부르는 쪽(배포 도구·E2E)이 정한다.
|
|
182
|
+
*/
|
|
183
|
+
export async function buildWorker(opts) {
|
|
184
|
+
const outfile = opts.outfile ?? "worker/index.js";
|
|
185
|
+
const pass = async (banner) => {
|
|
186
|
+
const state = { nodeBuiltins: new Set(), requireBuiltins: new Set(), wasm: new Map() };
|
|
187
|
+
const options = {
|
|
188
|
+
bundle: true,
|
|
189
|
+
// `browser` 조건·필드는 쓰지 않는다: TypeORM 의 package.json `browser` 맵이
|
|
190
|
+
// 모든 드라이버를 빈 스텁으로 바꿔 DataSource 가 드라이버 없이 뜬다 (실측).
|
|
191
|
+
platform: "neutral",
|
|
192
|
+
conditions: ["workerd", "worker", "node", "import", "default"],
|
|
193
|
+
mainFields: ["module", "main"],
|
|
194
|
+
format: "esm",
|
|
195
|
+
target: "es2022",
|
|
196
|
+
// 문자열의 비 ASCII 를 \u 로 풀지 않는다 — workerd 는 UTF-8 을 그대로 읽고, 스택의 한국어 메시지가 사람이 읽을 수 있어야 한다.
|
|
197
|
+
charset: "utf8",
|
|
198
|
+
entryPoints: [opts.entry],
|
|
199
|
+
outfile,
|
|
200
|
+
absWorkingDir: opts.absWorkingDir,
|
|
201
|
+
plugins: [workerPlugin(state, opts)],
|
|
202
|
+
external: ["node:*", "cloudflare:*"],
|
|
203
|
+
define: { "process.env.NODE_ENV": '"production"', ...(opts.define ?? {}) },
|
|
204
|
+
write: false,
|
|
205
|
+
logLevel: "silent",
|
|
206
|
+
...(opts.minify ? { minify: true } : {}),
|
|
207
|
+
...(banner !== undefined ? { banner: { js: banner } } : {}),
|
|
208
|
+
};
|
|
209
|
+
const r = await build(options);
|
|
210
|
+
const file = r.outputFiles?.[0];
|
|
211
|
+
if (!file)
|
|
212
|
+
throw new Error("esbuild가 결과를 내지 않았다");
|
|
213
|
+
return { code: file.contents, state };
|
|
214
|
+
};
|
|
215
|
+
let { code, state } = await pass();
|
|
216
|
+
// CJS 가 요구한 node 내장이 있으면 배너의 require 표를 갖고 한 번 더 묶는다.
|
|
217
|
+
if (state.requireBuiltins.size > 0) {
|
|
218
|
+
({ code, state } = await pass(requireBanner(state.requireBuiltins)));
|
|
219
|
+
}
|
|
220
|
+
return {
|
|
221
|
+
code,
|
|
222
|
+
report: {
|
|
223
|
+
nodeImports: [...state.nodeBuiltins].sort(),
|
|
224
|
+
wasmModules: [...state.wasm.entries()].map(([name, path]) => ({ name, path })).sort((a, b) => a.name.localeCompare(b.name)),
|
|
225
|
+
},
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=bundler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundler.js","sourceRoot":"","sources":["../src/bundler.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { Emitter } from "./emitter.js";
|
|
2
|
+
import { DatabaseError } from "./errors.js";
|
|
3
|
+
import { types, type TypeParser } from "./type-parsers.js";
|
|
4
|
+
import type { Db, DbSession } from "./types.js";
|
|
5
|
+
export interface FieldDef {
|
|
6
|
+
name: string;
|
|
7
|
+
tableID: number;
|
|
8
|
+
columnID: number;
|
|
9
|
+
dataTypeID: number;
|
|
10
|
+
dataTypeSize: number;
|
|
11
|
+
dataTypeModifier: number;
|
|
12
|
+
format: string;
|
|
13
|
+
}
|
|
14
|
+
export interface QueryResult<R = Record<string, unknown>> {
|
|
15
|
+
command: string;
|
|
16
|
+
rowCount: number | null;
|
|
17
|
+
oid: number;
|
|
18
|
+
rows: R[];
|
|
19
|
+
fields: FieldDef[];
|
|
20
|
+
}
|
|
21
|
+
export interface QueryConfig {
|
|
22
|
+
text: string;
|
|
23
|
+
values?: unknown[] | undefined;
|
|
24
|
+
name?: string | undefined;
|
|
25
|
+
rowMode?: "array" | undefined;
|
|
26
|
+
types?: {
|
|
27
|
+
getTypeParser(oid: number, format: "text"): TypeParser;
|
|
28
|
+
} | undefined;
|
|
29
|
+
}
|
|
30
|
+
export type QueryCallback<R = Record<string, unknown>> = (err: Error | null, result?: QueryResult<R>) => void;
|
|
31
|
+
/** `new Client({ db })` / `new Pool({ db })` 의 재료. 나머지 키는 pg 호환용이고 무시된다. */
|
|
32
|
+
export interface ClientConfig {
|
|
33
|
+
db?: Db | undefined;
|
|
34
|
+
[key: string]: unknown;
|
|
35
|
+
}
|
|
36
|
+
/** CommandComplete 태그를 pg 의 `command`·`rowCount`·`oid` 로 옮긴다. */
|
|
37
|
+
export declare function parseCommandTag(tag: string | null): {
|
|
38
|
+
command: string;
|
|
39
|
+
rowCount: number | null;
|
|
40
|
+
oid: number;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* 세션 하나를 쥐는 클라이언트. `connect()` 는 세션을 열고 `end()` 는 닫는다.
|
|
44
|
+
* `connect()` 전의 `query` 는 세션을 알아서 연다 — pg 는 거기서 던지지만,
|
|
45
|
+
* 여는 편이 ORM 이 다루기 쉽고 잃는 것이 없다.
|
|
46
|
+
*/
|
|
47
|
+
export declare class Client extends Emitter {
|
|
48
|
+
#private;
|
|
49
|
+
readonly db: Db;
|
|
50
|
+
/** Sequelize 가 `client.connection.on('parameterStatus')` 를 건다. */
|
|
51
|
+
readonly connection: Emitter;
|
|
52
|
+
readonly processID: number | null;
|
|
53
|
+
readonly secretKey: number | null;
|
|
54
|
+
_ending: boolean;
|
|
55
|
+
_connected: boolean;
|
|
56
|
+
_connecting: boolean;
|
|
57
|
+
constructor(config: ClientConfig | Db);
|
|
58
|
+
get session(): DbSession | null;
|
|
59
|
+
connect(): Promise<void>;
|
|
60
|
+
connect(cb: (err: Error | null) => void): void;
|
|
61
|
+
query<R = Record<string, unknown>>(text: string | QueryConfig, values?: unknown[]): Promise<QueryResult<R>>;
|
|
62
|
+
query<R = Record<string, unknown>>(text: string | QueryConfig, cb: QueryCallback<R>): void;
|
|
63
|
+
query<R = Record<string, unknown>>(text: string | QueryConfig, values: unknown[], cb: QueryCallback<R>): void;
|
|
64
|
+
end(): Promise<void>;
|
|
65
|
+
end(cb: (err?: Error) => void): void;
|
|
66
|
+
escapeIdentifier(s: string): string;
|
|
67
|
+
escapeLiteral(s: string): string;
|
|
68
|
+
}
|
|
69
|
+
export declare class PoolClient extends Client {
|
|
70
|
+
#private;
|
|
71
|
+
constructor(pool: Pool, db: Db);
|
|
72
|
+
/** pg 의 `release(err?)`. 오류를 주면 세션을 버린다 — 우리는 늘 버리므로 같다. */
|
|
73
|
+
release(_err?: Error | boolean): void;
|
|
74
|
+
}
|
|
75
|
+
export interface PoolConfig extends ClientConfig {
|
|
76
|
+
max?: number | undefined;
|
|
77
|
+
}
|
|
78
|
+
export declare class Pool extends Emitter {
|
|
79
|
+
#private;
|
|
80
|
+
readonly db: Db;
|
|
81
|
+
readonly options: PoolConfig;
|
|
82
|
+
constructor(config: PoolConfig | Db);
|
|
83
|
+
get totalCount(): number;
|
|
84
|
+
get idleCount(): number;
|
|
85
|
+
get waitingCount(): number;
|
|
86
|
+
get ended(): boolean;
|
|
87
|
+
connect(): Promise<PoolClient>;
|
|
88
|
+
connect(cb: (err: Error | null, client?: PoolClient, release?: (err?: Error) => void) => void): void;
|
|
89
|
+
_forget(c: PoolClient): void;
|
|
90
|
+
/** 세션 없는 질의. facade 의 호출당 세션이 pg 의 "빌려서 쓰고 돌려준다" 와 같다. */
|
|
91
|
+
query<R = Record<string, unknown>>(text: string | QueryConfig, values?: unknown[]): Promise<QueryResult<R>>;
|
|
92
|
+
query<R = Record<string, unknown>>(text: string | QueryConfig, cb: QueryCallback<R>): void;
|
|
93
|
+
query<R = Record<string, unknown>>(text: string | QueryConfig, values: unknown[], cb: QueryCallback<R>): void;
|
|
94
|
+
end(): Promise<void>;
|
|
95
|
+
end(cb: (err?: Error) => void): void;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* `db` 를 미리 묶은 pg 모양의 모듈.
|
|
99
|
+
*
|
|
100
|
+
* ORM 이 드라이버 모듈을 통째로 받는 자리(TypeORM 의 `driver`, Sequelize 의
|
|
101
|
+
* `dialectModule`, Knex 의 `_driver()`)에 넘긴다. 그 ORM 들은 `new Pool(옵션)` 을
|
|
102
|
+
* 자기 옵션으로 부르므로, `db` 를 옵션에 실어 줄 길이 없다 — 여기서 묶는다.
|
|
103
|
+
*/
|
|
104
|
+
export declare function pgModule(db: Db): PgModule;
|
|
105
|
+
export interface PgModule {
|
|
106
|
+
Client: typeof Client;
|
|
107
|
+
Pool: typeof Pool;
|
|
108
|
+
DatabaseError: typeof DatabaseError;
|
|
109
|
+
defaults: typeof defaults;
|
|
110
|
+
/** Sequelize 의 `lib.types.getTypeParser`, Drizzle 의 `types.builtins`. */
|
|
111
|
+
types: typeof types;
|
|
112
|
+
native: null;
|
|
113
|
+
escapeIdentifier(s: string): string;
|
|
114
|
+
escapeLiteral(s: string): string;
|
|
115
|
+
}
|
|
116
|
+
/** pg 의 `defaults`. TypeORM 이 `parseInt8` 을 만진다 — 우리는 int8 을 늘 문자열로 둔다. */
|
|
117
|
+
export declare const defaults: Record<string, unknown>;
|
|
118
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|