@runlot/pg 0.1.0-rc.100
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 +276 -0
- package/dist/bundler.js.map +1 -0
- package/dist/client.d.ts +138 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +505 -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 +63 -0
- package/dist/emitter.js.map +1 -0
- package/dist/errors.d.ts +34 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +46 -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 +27 -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 +13 -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 +28 -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 +344 -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 +24 -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 +22 -0
- package/dist/orm/typeorm.js.map +1 -0
- package/dist/type-parsers.d.ts +159 -0
- package/dist/type-parsers.d.ts.map +1 -0
- package/dist/type-parsers.js +329 -0
- package/dist/type-parsers.js.map +1 -0
- package/dist/types.d.ts +93 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/package.json +83 -0
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
// An imitation of `pg.types`.
|
|
2
|
+
//
|
|
3
|
+
// ORMs touch this table in two ways: global registration through
|
|
4
|
+
// `types.setTypeParser(oid, fn)`, and per-query injection through the query
|
|
5
|
+
// config's `types.getTypeParser(oid, format)` (Drizzle and Prisma do that).
|
|
6
|
+
// Both expect a function that takes the **text representation**, so we turn a
|
|
7
|
+
// cell the facade has already decoded back into text and feed it in
|
|
8
|
+
// (`cellToText`).
|
|
9
|
+
//
|
|
10
|
+
// With no registration it follows pg's default conversion — that is what makes
|
|
11
|
+
// code that used plain `pg` see the same values after switching to the
|
|
12
|
+
// adapter.
|
|
13
|
+
/** pg-types' builtins. The OIDs are the stable values from pg_catalog. */
|
|
14
|
+
export const builtins = {
|
|
15
|
+
BOOL: 16,
|
|
16
|
+
BYTEA: 17,
|
|
17
|
+
CHAR: 18,
|
|
18
|
+
INT8: 20,
|
|
19
|
+
INT2: 21,
|
|
20
|
+
INT4: 23,
|
|
21
|
+
REGPROC: 24,
|
|
22
|
+
TEXT: 25,
|
|
23
|
+
OID: 26,
|
|
24
|
+
TID: 27,
|
|
25
|
+
XID: 28,
|
|
26
|
+
CID: 29,
|
|
27
|
+
JSON: 114,
|
|
28
|
+
XML: 142,
|
|
29
|
+
PG_NODE_TREE: 194,
|
|
30
|
+
SMGR: 210,
|
|
31
|
+
PATH: 602,
|
|
32
|
+
POLYGON: 604,
|
|
33
|
+
CIDR: 650,
|
|
34
|
+
FLOAT4: 700,
|
|
35
|
+
FLOAT8: 701,
|
|
36
|
+
ABSTIME: 702,
|
|
37
|
+
RELTIME: 703,
|
|
38
|
+
TINTERVAL: 704,
|
|
39
|
+
CIRCLE: 718,
|
|
40
|
+
MACADDR8: 774,
|
|
41
|
+
MONEY: 790,
|
|
42
|
+
MACADDR: 829,
|
|
43
|
+
INET: 869,
|
|
44
|
+
ACLITEM: 1033,
|
|
45
|
+
BPCHAR: 1042,
|
|
46
|
+
VARCHAR: 1043,
|
|
47
|
+
DATE: 1082,
|
|
48
|
+
TIME: 1083,
|
|
49
|
+
TIMESTAMP: 1114,
|
|
50
|
+
TIMESTAMPTZ: 1184,
|
|
51
|
+
INTERVAL: 1186,
|
|
52
|
+
TIMETZ: 1266,
|
|
53
|
+
BIT: 1560,
|
|
54
|
+
VARBIT: 1562,
|
|
55
|
+
NUMERIC: 1700,
|
|
56
|
+
REFCURSOR: 1790,
|
|
57
|
+
REGPROCEDURE: 2202,
|
|
58
|
+
REGOPER: 2203,
|
|
59
|
+
REGOPERATOR: 2204,
|
|
60
|
+
REGCLASS: 2205,
|
|
61
|
+
REGTYPE: 2206,
|
|
62
|
+
UUID: 2950,
|
|
63
|
+
TXID_SNAPSHOT: 2970,
|
|
64
|
+
PG_LSN: 3220,
|
|
65
|
+
PG_NDISTINCT: 3361,
|
|
66
|
+
PG_DEPENDENCIES: 3402,
|
|
67
|
+
TSVECTOR: 3614,
|
|
68
|
+
TSQUERY: 3615,
|
|
69
|
+
GTSVECTOR: 3642,
|
|
70
|
+
REGCONFIG: 3734,
|
|
71
|
+
REGDICTIONARY: 3769,
|
|
72
|
+
JSONB: 3802,
|
|
73
|
+
REGNAMESPACE: 4089,
|
|
74
|
+
REGROLE: 4096,
|
|
75
|
+
};
|
|
76
|
+
// ---- Text → value: the same rules as pg-types' defaults ----
|
|
77
|
+
function parseBool(t) {
|
|
78
|
+
return t === "t" || t === "true" || t === "TRUE";
|
|
79
|
+
}
|
|
80
|
+
function parseBytea(t) {
|
|
81
|
+
// The server gives it in hex form ('\x...'). pg-feather does not emit the
|
|
82
|
+
// escape form.
|
|
83
|
+
if (t.startsWith("\\x")) {
|
|
84
|
+
const hex = t.slice(2);
|
|
85
|
+
const out = new Uint8Array(hex.length >> 1);
|
|
86
|
+
for (let i = 0; i < out.length; i++)
|
|
87
|
+
out[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
|
|
88
|
+
return out;
|
|
89
|
+
}
|
|
90
|
+
const out = new Uint8Array(t.length);
|
|
91
|
+
for (let i = 0; i < t.length; i++)
|
|
92
|
+
out[i] = t.charCodeAt(i) & 0xff;
|
|
93
|
+
return out;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* timestamp/timestamptz/date → Date (pg's default).
|
|
97
|
+
*
|
|
98
|
+
* pg reads a timestamp (without time zone) as **local time**. A worker's local
|
|
99
|
+
* time is UTC, so in practice it is UTC. pg also makes a date at local
|
|
100
|
+
* midnight — for the same reason, UTC midnight.
|
|
101
|
+
*/
|
|
102
|
+
function parseDate(t) {
|
|
103
|
+
// The same as pg-types: infinity is the number Infinity, not a Date.
|
|
104
|
+
if (t === "infinity")
|
|
105
|
+
return Infinity;
|
|
106
|
+
if (t === "-infinity")
|
|
107
|
+
return -Infinity;
|
|
108
|
+
const m = /^(\d{4,})-(\d{2})-(\d{2})(?:[ T](\d{2}):(\d{2}):(\d{2})(\.\d+)?)?\s*(Z|[+-]\d{2}(?::?\d{2})?(?::?\d{2})?)?\s*(BC)?$/.exec(t);
|
|
109
|
+
if (!m) {
|
|
110
|
+
const d = new Date(t);
|
|
111
|
+
return Number.isNaN(d.getTime()) ? null : d;
|
|
112
|
+
}
|
|
113
|
+
let year = Number(m[1]);
|
|
114
|
+
if (m[9])
|
|
115
|
+
year = -year + 1;
|
|
116
|
+
const month = Number(m[2]) - 1;
|
|
117
|
+
const day = Number(m[3]);
|
|
118
|
+
const hour = m[4] ? Number(m[4]) : 0;
|
|
119
|
+
const minute = m[5] ? Number(m[5]) : 0;
|
|
120
|
+
const second = m[6] ? Number(m[6]) : 0;
|
|
121
|
+
const ms = m[7] ? Math.round(Number(m[7]) * 1000) : 0;
|
|
122
|
+
let offsetMin = 0;
|
|
123
|
+
const tz = m[8];
|
|
124
|
+
if (tz && tz !== "Z") {
|
|
125
|
+
const sign = tz[0] === "-" ? -1 : 1;
|
|
126
|
+
const parts = tz.slice(1).split(":");
|
|
127
|
+
const raw = parts.length === 1 && parts[0].length > 2 ? [parts[0].slice(0, 2), parts[0].slice(2, 4)] : parts;
|
|
128
|
+
offsetMin = sign * (Number(raw[0] ?? 0) * 60 + Number(raw[1] ?? 0));
|
|
129
|
+
}
|
|
130
|
+
const d = new Date(Date.UTC(2000, month, day, hour, minute, second, ms));
|
|
131
|
+
d.setUTCFullYear(year);
|
|
132
|
+
return new Date(d.getTime() - offsetMin * 60_000);
|
|
133
|
+
}
|
|
134
|
+
/** A parser for PostgreSQL array text ('{a,b}'). It handles nesting and
|
|
135
|
+
* quoting. */
|
|
136
|
+
export function parseArray(text, element = (s) => s) {
|
|
137
|
+
let i = 0;
|
|
138
|
+
// Skip the dimension prefix '[1:3]={...}'.
|
|
139
|
+
if (text[0] === "[")
|
|
140
|
+
i = text.indexOf("=") + 1;
|
|
141
|
+
function parseInner() {
|
|
142
|
+
const out = [];
|
|
143
|
+
if (text[i] !== "{")
|
|
144
|
+
throw new Error("Malformed array literal. It has to start with an opening brace ({): " + text);
|
|
145
|
+
i++;
|
|
146
|
+
if (text[i] === "}") {
|
|
147
|
+
i++;
|
|
148
|
+
return out;
|
|
149
|
+
}
|
|
150
|
+
for (;;) {
|
|
151
|
+
if (text[i] === "{") {
|
|
152
|
+
out.push(parseInner());
|
|
153
|
+
}
|
|
154
|
+
else if (text[i] === '"') {
|
|
155
|
+
i++;
|
|
156
|
+
let s = "";
|
|
157
|
+
while (i < text.length && text[i] !== '"') {
|
|
158
|
+
if (text[i] === "\\")
|
|
159
|
+
i++;
|
|
160
|
+
s += text[i];
|
|
161
|
+
i++;
|
|
162
|
+
}
|
|
163
|
+
i++;
|
|
164
|
+
out.push(element(s));
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
let s = "";
|
|
168
|
+
while (i < text.length && text[i] !== "," && text[i] !== "}") {
|
|
169
|
+
s += text[i];
|
|
170
|
+
i++;
|
|
171
|
+
}
|
|
172
|
+
out.push(s === "NULL" ? null : element(s));
|
|
173
|
+
}
|
|
174
|
+
if (text[i] === ",") {
|
|
175
|
+
i++;
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
if (text[i] === "}") {
|
|
179
|
+
i++;
|
|
180
|
+
return out;
|
|
181
|
+
}
|
|
182
|
+
throw new Error("Malformed array literal. An element has to be followed by a comma (,) or a closing brace (}): " + text);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return parseInner();
|
|
186
|
+
}
|
|
187
|
+
const identity = (s) => s;
|
|
188
|
+
const num = (s) => Number(s);
|
|
189
|
+
const json = (s) => JSON.parse(s);
|
|
190
|
+
/** pg-types' default text-parser table. An oid that is not here stays a
|
|
191
|
+
* string. */
|
|
192
|
+
const defaults = new Map([
|
|
193
|
+
[builtins.BOOL, parseBool],
|
|
194
|
+
[builtins.BYTEA, parseBytea],
|
|
195
|
+
[builtins.INT2, num],
|
|
196
|
+
[builtins.INT4, num],
|
|
197
|
+
[builtins.OID, num],
|
|
198
|
+
[builtins.FLOAT4, num],
|
|
199
|
+
[builtins.FLOAT8, num],
|
|
200
|
+
[builtins.JSON, json],
|
|
201
|
+
[builtins.JSONB, json],
|
|
202
|
+
[builtins.DATE, parseDate],
|
|
203
|
+
[builtins.TIMESTAMP, parseDate],
|
|
204
|
+
[builtins.TIMESTAMPTZ, parseDate],
|
|
205
|
+
// The array oids are the values of pg_type.typarray.
|
|
206
|
+
[1000, (s) => parseArray(s, parseBool)],
|
|
207
|
+
[1001, (s) => parseArray(s, parseBytea)],
|
|
208
|
+
[1005, (s) => parseArray(s, num)],
|
|
209
|
+
[1007, (s) => parseArray(s, num)],
|
|
210
|
+
[1016, (s) => parseArray(s, identity)],
|
|
211
|
+
[1021, (s) => parseArray(s, num)],
|
|
212
|
+
[1022, (s) => parseArray(s, num)],
|
|
213
|
+
[1028, (s) => parseArray(s, num)],
|
|
214
|
+
[1231, (s) => parseArray(s, identity)],
|
|
215
|
+
[1009, (s) => parseArray(s, identity)],
|
|
216
|
+
[1014, (s) => parseArray(s, identity)],
|
|
217
|
+
[1015, (s) => parseArray(s, identity)],
|
|
218
|
+
[1002, (s) => parseArray(s, identity)],
|
|
219
|
+
[2951, (s) => parseArray(s, identity)],
|
|
220
|
+
[199, (s) => parseArray(s, json)],
|
|
221
|
+
[3807, (s) => parseArray(s, json)],
|
|
222
|
+
[1182, (s) => parseArray(s, parseDate)],
|
|
223
|
+
[1115, (s) => parseArray(s, parseDate)],
|
|
224
|
+
[1185, (s) => parseArray(s, parseDate)],
|
|
225
|
+
[1183, (s) => parseArray(s, identity)],
|
|
226
|
+
]);
|
|
227
|
+
const overrides = new Map();
|
|
228
|
+
export function getTypeParser(oid, format = "text") {
|
|
229
|
+
if (format === "binary") {
|
|
230
|
+
// The facade carries text only. No caller asks for a binary parser, but
|
|
231
|
+
// pg takes this argument, so we match the signature.
|
|
232
|
+
return identity;
|
|
233
|
+
}
|
|
234
|
+
return overrides.get(oid) ?? defaults.get(oid) ?? identity;
|
|
235
|
+
}
|
|
236
|
+
export function setTypeParser(oid, format, parser) {
|
|
237
|
+
if (typeof format === "function") {
|
|
238
|
+
overrides.set(oid, format);
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
if (format === "text" && parser)
|
|
242
|
+
overrides.set(oid, parser);
|
|
243
|
+
}
|
|
244
|
+
/** The object handed over as `pg.types`. */
|
|
245
|
+
export const types = { builtins, getTypeParser, setTypeParser, arrayParser: { create: (s, p) => ({ parse: () => parseArray(s, p) }) } };
|
|
246
|
+
// ---- Value → text: turning a cell the facade decoded into what a parser eats ----
|
|
247
|
+
/**
|
|
248
|
+
* The facade hands cells over already decoded (the §8 table). The parser table
|
|
249
|
+
* takes text, so we turn them back. It is the lossless direction: a number was
|
|
250
|
+
* only made where the facade could hold it exactly, and json has the same value
|
|
251
|
+
* after being serialised back to a string.
|
|
252
|
+
*/
|
|
253
|
+
export function cellToText(cell, oid) {
|
|
254
|
+
if (cell === null || cell === undefined)
|
|
255
|
+
return null;
|
|
256
|
+
if (typeof cell === "string")
|
|
257
|
+
return cell;
|
|
258
|
+
if (typeof cell === "boolean")
|
|
259
|
+
return cell ? "t" : "f";
|
|
260
|
+
if (typeof cell === "number")
|
|
261
|
+
return oid === builtins.FLOAT4 || oid === builtins.FLOAT8 ? floatText(cell) : String(cell);
|
|
262
|
+
if (typeof cell === "bigint")
|
|
263
|
+
return String(cell);
|
|
264
|
+
if (cell instanceof ArrayBuffer)
|
|
265
|
+
return hexText(new Uint8Array(cell));
|
|
266
|
+
if (ArrayBuffer.isView(cell))
|
|
267
|
+
return hexText(new Uint8Array(cell.buffer, cell.byteOffset, cell.byteLength));
|
|
268
|
+
return JSON.stringify(cell);
|
|
269
|
+
}
|
|
270
|
+
function floatText(n) {
|
|
271
|
+
if (Number.isNaN(n))
|
|
272
|
+
return "NaN";
|
|
273
|
+
if (n === Infinity)
|
|
274
|
+
return "Infinity";
|
|
275
|
+
if (n === -Infinity)
|
|
276
|
+
return "-Infinity";
|
|
277
|
+
return String(n);
|
|
278
|
+
}
|
|
279
|
+
function hexText(bytes) {
|
|
280
|
+
let s = "\\x";
|
|
281
|
+
for (let i = 0; i < bytes.length; i++)
|
|
282
|
+
s += bytes[i].toString(16).padStart(2, "0");
|
|
283
|
+
return s;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Moves one cell into the public value.
|
|
287
|
+
*
|
|
288
|
+
* When there is a registered parser (global or per query), we turn the cell
|
|
289
|
+
* back into text and feed it to that. When there is not, we leave the facade's
|
|
290
|
+
* decoding alone and only fix the places where it differs from the pg default:
|
|
291
|
+
* date-like types become a Date, bytea becomes a Uint8Array, an array becomes
|
|
292
|
+
* an array.
|
|
293
|
+
*/
|
|
294
|
+
export function convertCell(cell, oid, lookup) {
|
|
295
|
+
if (cell === null || cell === undefined)
|
|
296
|
+
return null;
|
|
297
|
+
const custom = lookup ? lookup(oid, "text") : overrides.get(oid);
|
|
298
|
+
if (custom) {
|
|
299
|
+
const text = cellToText(cell, oid);
|
|
300
|
+
return text === null ? null : custom(text);
|
|
301
|
+
}
|
|
302
|
+
switch (oid) {
|
|
303
|
+
case builtins.BOOL:
|
|
304
|
+
case builtins.INT2:
|
|
305
|
+
case builtins.INT4:
|
|
306
|
+
case builtins.OID:
|
|
307
|
+
case builtins.FLOAT4:
|
|
308
|
+
case builtins.FLOAT8:
|
|
309
|
+
case builtins.JSON:
|
|
310
|
+
case builtins.JSONB:
|
|
311
|
+
case builtins.INT8:
|
|
312
|
+
case builtins.NUMERIC:
|
|
313
|
+
case builtins.TEXT:
|
|
314
|
+
case builtins.VARCHAR:
|
|
315
|
+
case builtins.UUID:
|
|
316
|
+
return cell;
|
|
317
|
+
case builtins.BYTEA:
|
|
318
|
+
if (cell instanceof ArrayBuffer)
|
|
319
|
+
return new Uint8Array(cell);
|
|
320
|
+
return typeof cell === "string" ? parseBytea(cell) : cell;
|
|
321
|
+
default: {
|
|
322
|
+
const d = defaults.get(oid);
|
|
323
|
+
if (!d || typeof cell !== "string")
|
|
324
|
+
return cell;
|
|
325
|
+
return d(cell);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=type-parsers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-parsers.js","sourceRoot":"","sources":["../src/type-parsers.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/** The error `tryExec` answers with as a value. The SQLSTATE is read from
|
|
2
|
+
* `code` and nowhere else. */
|
|
3
|
+
export interface DbErrorData {
|
|
4
|
+
code: string;
|
|
5
|
+
message: string;
|
|
6
|
+
detail: string | null;
|
|
7
|
+
hint: string | null;
|
|
8
|
+
position: string | null;
|
|
9
|
+
severity: string;
|
|
10
|
+
}
|
|
11
|
+
export interface DbColumn {
|
|
12
|
+
name: string;
|
|
13
|
+
typeOid: number;
|
|
14
|
+
}
|
|
15
|
+
export type TryExecResult = {
|
|
16
|
+
ok: true;
|
|
17
|
+
columns: DbColumn[];
|
|
18
|
+
/** Positional arrays. No cell is lost even when column names
|
|
19
|
+
* collide. */
|
|
20
|
+
values: unknown[][];
|
|
21
|
+
rows: Record<string, unknown>[];
|
|
22
|
+
commandTag: string | null;
|
|
23
|
+
transactionStatus: string | null;
|
|
24
|
+
} | {
|
|
25
|
+
ok: false;
|
|
26
|
+
error: DbErrorData;
|
|
27
|
+
transactionStatus?: string | null;
|
|
28
|
+
};
|
|
29
|
+
/** A request-scoped session handle (`env.db.session()`). Transactions,
|
|
30
|
+
* prepared statements and SET are kept inside it. */
|
|
31
|
+
export interface DbSession {
|
|
32
|
+
exec(sql: string, params?: unknown[]): Promise<unknown[]>;
|
|
33
|
+
tryExec(sql: string, params?: unknown[]): Promise<TryExecResult>;
|
|
34
|
+
close(): Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
/** What the user worker sees as `env.db`. */
|
|
37
|
+
export interface Db {
|
|
38
|
+
exec(sql: string, params?: unknown[]): Promise<unknown[]>;
|
|
39
|
+
tryExec(sql: string, params?: unknown[]): Promise<TryExecResult>;
|
|
40
|
+
session(): Promise<DbSession>;
|
|
41
|
+
identity(): Promise<{
|
|
42
|
+
project: string;
|
|
43
|
+
epoch: number;
|
|
44
|
+
}>;
|
|
45
|
+
}
|
|
46
|
+
export interface StorageObject {
|
|
47
|
+
key: string;
|
|
48
|
+
size: number;
|
|
49
|
+
etag: string;
|
|
50
|
+
contentType: string;
|
|
51
|
+
/** RFC 1123 (exactly the Last-Modified header). It can be empty. */
|
|
52
|
+
lastModified: string;
|
|
53
|
+
}
|
|
54
|
+
export interface StorageListPage {
|
|
55
|
+
objects: StorageObject[];
|
|
56
|
+
/** Empty means it is the last page. Pass it as the `cursor` of the next
|
|
57
|
+
* call. */
|
|
58
|
+
cursor: string;
|
|
59
|
+
}
|
|
60
|
+
/** What the user worker sees as `env.storage`. A key is a path relative to the
|
|
61
|
+
* project prefix. */
|
|
62
|
+
export interface Storage {
|
|
63
|
+
put(key: string, body: BodyInit | null, opts?: {
|
|
64
|
+
contentType?: string;
|
|
65
|
+
}): Promise<StorageObject>;
|
|
66
|
+
/** `null` when it is not there. A 404 is not an exception. */
|
|
67
|
+
get(key: string): Promise<(StorageObject & {
|
|
68
|
+
body: ReadableStream<Uint8Array> | null;
|
|
69
|
+
}) | null>;
|
|
70
|
+
head(key: string): Promise<StorageObject | null>;
|
|
71
|
+
/** Idempotent. Deleting a key that does not exist is a success. */
|
|
72
|
+
delete(key: string): Promise<void>;
|
|
73
|
+
list(opts?: {
|
|
74
|
+
prefix?: string;
|
|
75
|
+
cursor?: string;
|
|
76
|
+
limit?: number;
|
|
77
|
+
}): Promise<StorageListPage>;
|
|
78
|
+
/**
|
|
79
|
+
* A signed URL. GET and PUT only. ttl is in seconds (default 300, ceiling
|
|
80
|
+
* 3600).
|
|
81
|
+
*
|
|
82
|
+
* Passing `size` binds that byte count into the signature — uploading a
|
|
83
|
+
* different length gets refused by the store with a 403, and the quota is
|
|
84
|
+
* checked against that size at issue time. Without it there is no ceiling on
|
|
85
|
+
* how much this URL can upload. Used on PUT only.
|
|
86
|
+
*/
|
|
87
|
+
presign(key: string, opts?: {
|
|
88
|
+
method?: "GET" | "PUT";
|
|
89
|
+
ttl?: number;
|
|
90
|
+
size?: number;
|
|
91
|
+
}): Promise<string>;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// The surface of `env.db` (docs/env-db-assembly.md §8,
|
|
2
|
+
// docs/pg-driver-support.md §3.1).
|
|
3
|
+
//
|
|
4
|
+
// What is written here is everything the adapter expects. The system worker's
|
|
5
|
+
// `Db` facade is canonical and this file is a copy of its shape carried over
|
|
6
|
+
// into TypeScript — if the two drift apart the adapter quietly produces wrong
|
|
7
|
+
// values, so when the facade changes this changes with it.
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,mCAAmC;AACnC,EAAE;AACF,8EAA8E;AAC9E,6EAA6E;AAC7E,8EAA8E;AAC9E,2DAA2D"}
|
package/package.json
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@runlot/pg",
|
|
3
|
+
"version": "0.1.0-rc.100",
|
|
4
|
+
"description": "node-postgres-compatible adapter for env.db, with adapters for six ORMs",
|
|
5
|
+
"publishConfig": {
|
|
6
|
+
"access": "public"
|
|
7
|
+
},
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "https://github.com/runlot/runlot",
|
|
11
|
+
"directory": "web/packages/pg"
|
|
12
|
+
},
|
|
13
|
+
"type": "module",
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"default": "./dist/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./drizzle": {
|
|
22
|
+
"types": "./dist/orm/drizzle.d.ts",
|
|
23
|
+
"default": "./dist/orm/drizzle.js"
|
|
24
|
+
},
|
|
25
|
+
"./kysely": {
|
|
26
|
+
"types": "./dist/orm/kysely.d.ts",
|
|
27
|
+
"default": "./dist/orm/kysely.js"
|
|
28
|
+
},
|
|
29
|
+
"./knex": {
|
|
30
|
+
"types": "./dist/orm/knex.d.ts",
|
|
31
|
+
"default": "./dist/orm/knex.js"
|
|
32
|
+
},
|
|
33
|
+
"./typeorm": {
|
|
34
|
+
"types": "./dist/orm/typeorm.d.ts",
|
|
35
|
+
"default": "./dist/orm/typeorm.js"
|
|
36
|
+
},
|
|
37
|
+
"./sequelize": {
|
|
38
|
+
"types": "./dist/orm/sequelize.d.ts",
|
|
39
|
+
"default": "./dist/orm/sequelize.js"
|
|
40
|
+
},
|
|
41
|
+
"./prisma": {
|
|
42
|
+
"types": "./dist/orm/prisma.d.ts",
|
|
43
|
+
"default": "./dist/orm/prisma.js"
|
|
44
|
+
},
|
|
45
|
+
"./bundler": {
|
|
46
|
+
"types": "./dist/bundler.d.ts",
|
|
47
|
+
"default": "./dist/bundler.js"
|
|
48
|
+
},
|
|
49
|
+
"./type-parsers": {
|
|
50
|
+
"types": "./dist/type-parsers.d.ts",
|
|
51
|
+
"default": "./dist/type-parsers.js"
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"files": [
|
|
55
|
+
"dist"
|
|
56
|
+
],
|
|
57
|
+
"dependencies": {
|
|
58
|
+
"esbuild": "^0.24.2",
|
|
59
|
+
"@prisma/driver-adapter-utils": "7.10.0"
|
|
60
|
+
},
|
|
61
|
+
"devDependencies": {
|
|
62
|
+
"@types/node": "^22.10.2",
|
|
63
|
+
"@types/pg": "^8.23.1",
|
|
64
|
+
"typescript": "^5.7.2",
|
|
65
|
+
"drizzle-orm": "0.45.2",
|
|
66
|
+
"kysely": "0.29.5",
|
|
67
|
+
"knex": "3.3.0",
|
|
68
|
+
"typeorm": "1.1.1",
|
|
69
|
+
"reflect-metadata": "0.2.2",
|
|
70
|
+
"sequelize": "6.37.8",
|
|
71
|
+
"@prisma/client": "7.10.0",
|
|
72
|
+
"@prisma/driver-adapter-utils": "7.10.0",
|
|
73
|
+
"prisma": "7.10.0",
|
|
74
|
+
"@runlot/config": "0.1.0-rc.100"
|
|
75
|
+
},
|
|
76
|
+
"scripts": {
|
|
77
|
+
"build": "tsc -p tsconfig.build.json",
|
|
78
|
+
"test": "node build.mjs --test",
|
|
79
|
+
"prisma:generate": "prisma generate --config e2e/prisma/prisma.config.ts",
|
|
80
|
+
"typecheck": "pnpm run -s prisma:generate >/dev/null && tsc --noEmit",
|
|
81
|
+
"e2e:build": "node build.mjs --e2e"
|
|
82
|
+
}
|
|
83
|
+
}
|