@prisma/adapter-ppg 0.0.1 → 6.20.0-dev.8
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/LICENSE +201 -0
- package/README.md +44 -0
- package/dist/index.d.mts +41 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.js +600 -0
- package/dist/index.mjs +573 -0
- package/package.json +45 -3
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,573 @@
|
|
|
1
|
+
// src/ppg.ts
|
|
2
|
+
import { client } from "@prisma/ppg";
|
|
3
|
+
|
|
4
|
+
// src/conversion.ts
|
|
5
|
+
import { ColumnTypeEnum } from "@prisma/driver-adapter-utils";
|
|
6
|
+
import { getTypeParser } from "pg-types";
|
|
7
|
+
import { parse as parseArray } from "postgres-array";
|
|
8
|
+
function isolationLevelToSql(level) {
|
|
9
|
+
switch (level) {
|
|
10
|
+
case "READ UNCOMMITTED":
|
|
11
|
+
return "READ UNCOMMITTED";
|
|
12
|
+
case "READ COMMITTED":
|
|
13
|
+
return "READ COMMITTED";
|
|
14
|
+
case "REPEATABLE READ":
|
|
15
|
+
return "REPEATABLE READ";
|
|
16
|
+
case "SERIALIZABLE":
|
|
17
|
+
return "SERIALIZABLE";
|
|
18
|
+
case "SNAPSHOT":
|
|
19
|
+
return "REPEATABLE READ";
|
|
20
|
+
default:
|
|
21
|
+
throw new Error(`Unknown isolation level: ${level}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function convertArgs(args, argTypes) {
|
|
25
|
+
return args.map((arg, index) => {
|
|
26
|
+
const argType = argTypes[index];
|
|
27
|
+
if (arg === null || arg === void 0) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const scalarType = argType.scalarType;
|
|
31
|
+
switch (scalarType) {
|
|
32
|
+
case "int":
|
|
33
|
+
case "bigint":
|
|
34
|
+
case "float":
|
|
35
|
+
case "decimal":
|
|
36
|
+
case "string":
|
|
37
|
+
case "enum":
|
|
38
|
+
case "boolean":
|
|
39
|
+
return String(arg);
|
|
40
|
+
case "datetime":
|
|
41
|
+
if (arg instanceof Date) {
|
|
42
|
+
return arg.toISOString();
|
|
43
|
+
}
|
|
44
|
+
return arg;
|
|
45
|
+
case "json":
|
|
46
|
+
return typeof arg === "string" ? arg : JSON.stringify(arg);
|
|
47
|
+
case "bytes":
|
|
48
|
+
if (arg instanceof Uint8Array) {
|
|
49
|
+
return `\\x${Array.from(arg).map((b) => b.toString(16).padStart(2, "0")).join("")}`;
|
|
50
|
+
}
|
|
51
|
+
return arg;
|
|
52
|
+
case "uuid":
|
|
53
|
+
return String(arg);
|
|
54
|
+
case "unknown":
|
|
55
|
+
default:
|
|
56
|
+
return arg;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
var ScalarColumnType = {
|
|
61
|
+
BOOL: 16,
|
|
62
|
+
BYTEA: 17,
|
|
63
|
+
CHAR: 18,
|
|
64
|
+
INT8: 20,
|
|
65
|
+
INT2: 21,
|
|
66
|
+
INT4: 23,
|
|
67
|
+
REGPROC: 24,
|
|
68
|
+
TEXT: 25,
|
|
69
|
+
OID: 26,
|
|
70
|
+
TID: 27,
|
|
71
|
+
XID: 28,
|
|
72
|
+
CID: 29,
|
|
73
|
+
JSON: 114,
|
|
74
|
+
XML: 142,
|
|
75
|
+
PG_NODE_TREE: 194,
|
|
76
|
+
SMGR: 210,
|
|
77
|
+
PATH: 602,
|
|
78
|
+
POLYGON: 604,
|
|
79
|
+
CIDR: 650,
|
|
80
|
+
FLOAT4: 700,
|
|
81
|
+
FLOAT8: 701,
|
|
82
|
+
ABSTIME: 702,
|
|
83
|
+
RELTIME: 703,
|
|
84
|
+
TINTERVAL: 704,
|
|
85
|
+
CIRCLE: 718,
|
|
86
|
+
MACADDR8: 774,
|
|
87
|
+
MONEY: 790,
|
|
88
|
+
MACADDR: 829,
|
|
89
|
+
INET: 869,
|
|
90
|
+
ACLITEM: 1033,
|
|
91
|
+
BPCHAR: 1042,
|
|
92
|
+
VARCHAR: 1043,
|
|
93
|
+
DATE: 1082,
|
|
94
|
+
TIME: 1083,
|
|
95
|
+
TIMESTAMP: 1114,
|
|
96
|
+
TIMESTAMPTZ: 1184,
|
|
97
|
+
INTERVAL: 1186,
|
|
98
|
+
TIMETZ: 1266,
|
|
99
|
+
BIT: 1560,
|
|
100
|
+
VARBIT: 1562,
|
|
101
|
+
NUMERIC: 1700,
|
|
102
|
+
REFCURSOR: 1790,
|
|
103
|
+
REGPROCEDURE: 2202,
|
|
104
|
+
REGOPER: 2203,
|
|
105
|
+
REGOPERATOR: 2204,
|
|
106
|
+
REGCLASS: 2205,
|
|
107
|
+
REGTYPE: 2206,
|
|
108
|
+
UUID: 2950,
|
|
109
|
+
TXID_SNAPSHOT: 2970,
|
|
110
|
+
PG_LSN: 3220,
|
|
111
|
+
PG_NDISTINCT: 3361,
|
|
112
|
+
PG_DEPENDENCIES: 3402,
|
|
113
|
+
TSVECTOR: 3614,
|
|
114
|
+
TSQUERY: 3615,
|
|
115
|
+
GTSVECTOR: 3642,
|
|
116
|
+
REGCONFIG: 3734,
|
|
117
|
+
REGDICTIONARY: 3769,
|
|
118
|
+
JSONB: 3802,
|
|
119
|
+
REGNAMESPACE: 4089,
|
|
120
|
+
REGROLE: 4096
|
|
121
|
+
};
|
|
122
|
+
var ArrayColumnType = {
|
|
123
|
+
BIT_ARRAY: 1561,
|
|
124
|
+
BOOL_ARRAY: 1e3,
|
|
125
|
+
BYTEA_ARRAY: 1001,
|
|
126
|
+
BPCHAR_ARRAY: 1014,
|
|
127
|
+
CHAR_ARRAY: 1002,
|
|
128
|
+
CIDR_ARRAY: 651,
|
|
129
|
+
DATE_ARRAY: 1182,
|
|
130
|
+
FLOAT4_ARRAY: 1021,
|
|
131
|
+
FLOAT8_ARRAY: 1022,
|
|
132
|
+
INET_ARRAY: 1041,
|
|
133
|
+
INT2_ARRAY: 1005,
|
|
134
|
+
INT4_ARRAY: 1007,
|
|
135
|
+
INT8_ARRAY: 1016,
|
|
136
|
+
JSONB_ARRAY: 3807,
|
|
137
|
+
JSON_ARRAY: 199,
|
|
138
|
+
MONEY_ARRAY: 791,
|
|
139
|
+
NUMERIC_ARRAY: 1231,
|
|
140
|
+
OID_ARRAY: 1028,
|
|
141
|
+
TEXT_ARRAY: 1009,
|
|
142
|
+
TIMESTAMP_ARRAY: 1115,
|
|
143
|
+
TIMESTAMPTZ_ARRAY: 1185,
|
|
144
|
+
TIME_ARRAY: 1183,
|
|
145
|
+
UUID_ARRAY: 2951,
|
|
146
|
+
VARBIT_ARRAY: 1563,
|
|
147
|
+
VARCHAR_ARRAY: 1015,
|
|
148
|
+
XML_ARRAY: 143
|
|
149
|
+
};
|
|
150
|
+
function fieldToColumnType(fieldTypeId) {
|
|
151
|
+
switch (fieldTypeId) {
|
|
152
|
+
case ScalarColumnType.INT2:
|
|
153
|
+
case ScalarColumnType.INT4:
|
|
154
|
+
return ColumnTypeEnum.Int32;
|
|
155
|
+
case ScalarColumnType.INT8:
|
|
156
|
+
return ColumnTypeEnum.Int64;
|
|
157
|
+
case ScalarColumnType.FLOAT4:
|
|
158
|
+
return ColumnTypeEnum.Float;
|
|
159
|
+
case ScalarColumnType.FLOAT8:
|
|
160
|
+
return ColumnTypeEnum.Double;
|
|
161
|
+
case ScalarColumnType.BOOL:
|
|
162
|
+
return ColumnTypeEnum.Boolean;
|
|
163
|
+
case ScalarColumnType.DATE:
|
|
164
|
+
return ColumnTypeEnum.Date;
|
|
165
|
+
case ScalarColumnType.TIME:
|
|
166
|
+
case ScalarColumnType.TIMETZ:
|
|
167
|
+
return ColumnTypeEnum.Time;
|
|
168
|
+
case ScalarColumnType.TIMESTAMP:
|
|
169
|
+
case ScalarColumnType.TIMESTAMPTZ:
|
|
170
|
+
return ColumnTypeEnum.DateTime;
|
|
171
|
+
case ScalarColumnType.NUMERIC:
|
|
172
|
+
case ScalarColumnType.MONEY:
|
|
173
|
+
return ColumnTypeEnum.Numeric;
|
|
174
|
+
case ScalarColumnType.JSON:
|
|
175
|
+
case ScalarColumnType.JSONB:
|
|
176
|
+
return ColumnTypeEnum.Json;
|
|
177
|
+
case ScalarColumnType.UUID:
|
|
178
|
+
return ColumnTypeEnum.Uuid;
|
|
179
|
+
case ScalarColumnType.OID:
|
|
180
|
+
return ColumnTypeEnum.Int64;
|
|
181
|
+
case ScalarColumnType.BPCHAR:
|
|
182
|
+
case ScalarColumnType.TEXT:
|
|
183
|
+
case ScalarColumnType.VARCHAR:
|
|
184
|
+
case ScalarColumnType.BIT:
|
|
185
|
+
case ScalarColumnType.VARBIT:
|
|
186
|
+
case ScalarColumnType.INET:
|
|
187
|
+
case ScalarColumnType.CIDR:
|
|
188
|
+
case ScalarColumnType.XML:
|
|
189
|
+
return ColumnTypeEnum.Text;
|
|
190
|
+
case ScalarColumnType.BYTEA:
|
|
191
|
+
return ColumnTypeEnum.Bytes;
|
|
192
|
+
case ArrayColumnType.INT2_ARRAY:
|
|
193
|
+
case ArrayColumnType.INT4_ARRAY:
|
|
194
|
+
return ColumnTypeEnum.Int32Array;
|
|
195
|
+
case ArrayColumnType.FLOAT4_ARRAY:
|
|
196
|
+
return ColumnTypeEnum.FloatArray;
|
|
197
|
+
case ArrayColumnType.FLOAT8_ARRAY:
|
|
198
|
+
return ColumnTypeEnum.DoubleArray;
|
|
199
|
+
case ArrayColumnType.NUMERIC_ARRAY:
|
|
200
|
+
case ArrayColumnType.MONEY_ARRAY:
|
|
201
|
+
return ColumnTypeEnum.NumericArray;
|
|
202
|
+
case ArrayColumnType.BOOL_ARRAY:
|
|
203
|
+
return ColumnTypeEnum.BooleanArray;
|
|
204
|
+
case ArrayColumnType.CHAR_ARRAY:
|
|
205
|
+
return ColumnTypeEnum.CharacterArray;
|
|
206
|
+
case ArrayColumnType.BPCHAR_ARRAY:
|
|
207
|
+
case ArrayColumnType.TEXT_ARRAY:
|
|
208
|
+
case ArrayColumnType.VARCHAR_ARRAY:
|
|
209
|
+
case ArrayColumnType.VARBIT_ARRAY:
|
|
210
|
+
case ArrayColumnType.BIT_ARRAY:
|
|
211
|
+
case ArrayColumnType.INET_ARRAY:
|
|
212
|
+
case ArrayColumnType.CIDR_ARRAY:
|
|
213
|
+
case ArrayColumnType.XML_ARRAY:
|
|
214
|
+
return ColumnTypeEnum.TextArray;
|
|
215
|
+
case ArrayColumnType.DATE_ARRAY:
|
|
216
|
+
return ColumnTypeEnum.DateArray;
|
|
217
|
+
case ArrayColumnType.TIME_ARRAY:
|
|
218
|
+
return ColumnTypeEnum.TimeArray;
|
|
219
|
+
case ArrayColumnType.TIMESTAMP_ARRAY:
|
|
220
|
+
return ColumnTypeEnum.DateTimeArray;
|
|
221
|
+
case ArrayColumnType.JSON_ARRAY:
|
|
222
|
+
case ArrayColumnType.JSONB_ARRAY:
|
|
223
|
+
return ColumnTypeEnum.JsonArray;
|
|
224
|
+
case ArrayColumnType.BYTEA_ARRAY:
|
|
225
|
+
return ColumnTypeEnum.BytesArray;
|
|
226
|
+
case ArrayColumnType.UUID_ARRAY:
|
|
227
|
+
return ColumnTypeEnum.UuidArray;
|
|
228
|
+
case ArrayColumnType.INT8_ARRAY:
|
|
229
|
+
case ArrayColumnType.OID_ARRAY:
|
|
230
|
+
return ColumnTypeEnum.Int64Array;
|
|
231
|
+
default:
|
|
232
|
+
if (fieldTypeId >= 1e4) {
|
|
233
|
+
return ColumnTypeEnum.Text;
|
|
234
|
+
}
|
|
235
|
+
throw new UnsupportedNativeDataType(fieldTypeId);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
var UnsupportedNativeDataType = class extends Error {
|
|
239
|
+
constructor(code) {
|
|
240
|
+
super(`Unsupported column type id ${code}`);
|
|
241
|
+
}
|
|
242
|
+
};
|
|
243
|
+
var builtinParsers = Object.entries({
|
|
244
|
+
[ScalarColumnType.BOOL]: normalize_bool,
|
|
245
|
+
[ScalarColumnType.NUMERIC]: normalize_numeric,
|
|
246
|
+
[ArrayColumnType.NUMERIC_ARRAY]: normalize_array(normalize_numeric),
|
|
247
|
+
[ScalarColumnType.TIME]: normalize_time,
|
|
248
|
+
[ArrayColumnType.TIME_ARRAY]: normalize_array(normalize_time),
|
|
249
|
+
[ScalarColumnType.TIMETZ]: normalize_timez,
|
|
250
|
+
[ScalarColumnType.DATE]: normalize_date,
|
|
251
|
+
[ArrayColumnType.DATE_ARRAY]: normalize_array(normalize_date),
|
|
252
|
+
[ScalarColumnType.TIMESTAMP]: normalize_timestamp,
|
|
253
|
+
[ArrayColumnType.TIMESTAMP_ARRAY]: normalize_array(normalize_timestamp),
|
|
254
|
+
[ScalarColumnType.TIMESTAMPTZ]: normalize_timestamptz,
|
|
255
|
+
[ArrayColumnType.TIMESTAMPTZ_ARRAY]: normalize_array(normalize_timestamptz),
|
|
256
|
+
[ScalarColumnType.MONEY]: normalize_money,
|
|
257
|
+
[ArrayColumnType.MONEY_ARRAY]: normalize_array(normalize_money),
|
|
258
|
+
[ScalarColumnType.JSON]: toJson,
|
|
259
|
+
[ArrayColumnType.JSON_ARRAY]: normalize_array(toJson),
|
|
260
|
+
[ScalarColumnType.JSONB]: toJson,
|
|
261
|
+
[ArrayColumnType.JSONB_ARRAY]: normalize_array(toJson),
|
|
262
|
+
[ScalarColumnType.BYTEA]: convertBytes,
|
|
263
|
+
[ArrayColumnType.BYTEA_ARRAY]: normalizeByteaArray,
|
|
264
|
+
[ArrayColumnType.BIT_ARRAY]: normalize_array(normalizeBit),
|
|
265
|
+
[ArrayColumnType.VARBIT_ARRAY]: normalize_array(normalizeBit),
|
|
266
|
+
[ArrayColumnType.XML_ARRAY]: normalize_array(normalize_xml)
|
|
267
|
+
}).map(([k, v]) => ({
|
|
268
|
+
oid: Number(k),
|
|
269
|
+
parse: v
|
|
270
|
+
}));
|
|
271
|
+
function normalize_bool(x) {
|
|
272
|
+
return x === null ? null : x === "f" ? "false" : "true";
|
|
273
|
+
}
|
|
274
|
+
function normalize_array(element_normalizer) {
|
|
275
|
+
return (str) => parseArray(str, element_normalizer);
|
|
276
|
+
}
|
|
277
|
+
function normalize_numeric(numeric) {
|
|
278
|
+
return numeric;
|
|
279
|
+
}
|
|
280
|
+
function normalize_date(date) {
|
|
281
|
+
return date;
|
|
282
|
+
}
|
|
283
|
+
function normalize_timestamp(time) {
|
|
284
|
+
return `${time.replace(" ", "T")}+00:00`;
|
|
285
|
+
}
|
|
286
|
+
function normalize_timestamptz(time) {
|
|
287
|
+
return time.replace(" ", "T").replace(/[+-]\d{2}(:\d{2})?$/, "+00:00");
|
|
288
|
+
}
|
|
289
|
+
function normalize_time(time) {
|
|
290
|
+
return time;
|
|
291
|
+
}
|
|
292
|
+
function normalize_timez(time) {
|
|
293
|
+
return time.replace(/[+-]\d{2}(:\d{2})?$/, "");
|
|
294
|
+
}
|
|
295
|
+
function normalize_money(money) {
|
|
296
|
+
return money.slice(1);
|
|
297
|
+
}
|
|
298
|
+
function normalize_xml(xml) {
|
|
299
|
+
return xml;
|
|
300
|
+
}
|
|
301
|
+
function toJson(json) {
|
|
302
|
+
return json;
|
|
303
|
+
}
|
|
304
|
+
function encodeBuffer(buffer) {
|
|
305
|
+
return Array.from(new Uint8Array(buffer));
|
|
306
|
+
}
|
|
307
|
+
function parsePgBytes(x) {
|
|
308
|
+
return Buffer.from(x, "base64");
|
|
309
|
+
}
|
|
310
|
+
var builtInByteParser = getTypeParser(ScalarColumnType.BYTEA);
|
|
311
|
+
function parseBytesArray(x) {
|
|
312
|
+
return parseArray(x).map(builtInByteParser);
|
|
313
|
+
}
|
|
314
|
+
function normalizeByteaArray(serializedBytesArray) {
|
|
315
|
+
const buffers = parseBytesArray(serializedBytesArray);
|
|
316
|
+
return buffers.map((buf) => buf ? encodeBuffer(buf) : null);
|
|
317
|
+
}
|
|
318
|
+
function convertBytes(serializedBytes) {
|
|
319
|
+
const buffer = parsePgBytes(serializedBytes);
|
|
320
|
+
return encodeBuffer(buffer);
|
|
321
|
+
}
|
|
322
|
+
function normalizeBit(bit) {
|
|
323
|
+
return bit;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// src/errors.ts
|
|
327
|
+
function convertDriverError(error) {
|
|
328
|
+
if (isDriverError(error)) {
|
|
329
|
+
return {
|
|
330
|
+
originalCode: error.code,
|
|
331
|
+
originalMessage: error.message,
|
|
332
|
+
...mapDriverError(error)
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
throw error;
|
|
336
|
+
}
|
|
337
|
+
function mapDriverError(error) {
|
|
338
|
+
switch (error.code) {
|
|
339
|
+
case "22001":
|
|
340
|
+
return {
|
|
341
|
+
kind: "LengthMismatch",
|
|
342
|
+
column: error.details.column
|
|
343
|
+
};
|
|
344
|
+
case "22003":
|
|
345
|
+
return {
|
|
346
|
+
kind: "ValueOutOfRange",
|
|
347
|
+
cause: error.message
|
|
348
|
+
};
|
|
349
|
+
case "23505": {
|
|
350
|
+
const fields = error.details.detail?.match(/Key \(([^)]+)\)/)?.at(1)?.split(", ");
|
|
351
|
+
return {
|
|
352
|
+
kind: "UniqueConstraintViolation",
|
|
353
|
+
constraint: fields !== void 0 ? { fields } : void 0
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
case "23502": {
|
|
357
|
+
const fields = error.details.detail?.match(/Key \(([^)]+)\)/)?.at(1)?.split(", ");
|
|
358
|
+
return {
|
|
359
|
+
kind: "NullConstraintViolation",
|
|
360
|
+
constraint: fields !== void 0 ? { fields } : void 0
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
case "23503": {
|
|
364
|
+
let constraint;
|
|
365
|
+
if (error.details.column) {
|
|
366
|
+
constraint = { fields: [error.details.column] };
|
|
367
|
+
} else if (error.details.constraint) {
|
|
368
|
+
constraint = { index: error.details.constraint };
|
|
369
|
+
}
|
|
370
|
+
return {
|
|
371
|
+
kind: "ForeignKeyConstraintViolation",
|
|
372
|
+
constraint
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
case "3D000":
|
|
376
|
+
return {
|
|
377
|
+
kind: "DatabaseDoesNotExist",
|
|
378
|
+
db: error.message.split(" ").at(1)?.split('"').at(1)
|
|
379
|
+
};
|
|
380
|
+
case "28000":
|
|
381
|
+
return {
|
|
382
|
+
kind: "DatabaseAccessDenied",
|
|
383
|
+
db: error.message.split(",").find((s) => s.startsWith(" database"))?.split('"').at(1)
|
|
384
|
+
};
|
|
385
|
+
case "28P01":
|
|
386
|
+
return {
|
|
387
|
+
kind: "AuthenticationFailed",
|
|
388
|
+
user: error.message.split(" ").pop()?.split('"').at(1)
|
|
389
|
+
};
|
|
390
|
+
case "40001":
|
|
391
|
+
return {
|
|
392
|
+
kind: "TransactionWriteConflict"
|
|
393
|
+
};
|
|
394
|
+
case "42P01":
|
|
395
|
+
return {
|
|
396
|
+
kind: "TableDoesNotExist",
|
|
397
|
+
table: error.message.split(" ").at(1)?.split('"').at(1)
|
|
398
|
+
};
|
|
399
|
+
case "42703":
|
|
400
|
+
return {
|
|
401
|
+
kind: "ColumnNotFound",
|
|
402
|
+
column: error.message.split(" ").at(1)?.split('"').at(1)
|
|
403
|
+
};
|
|
404
|
+
case "42P04":
|
|
405
|
+
return {
|
|
406
|
+
kind: "DatabaseAlreadyExists",
|
|
407
|
+
db: error.message.split(" ").at(1)?.split('"').at(1)
|
|
408
|
+
};
|
|
409
|
+
case "53300":
|
|
410
|
+
return {
|
|
411
|
+
kind: "TooManyConnections",
|
|
412
|
+
cause: error.message
|
|
413
|
+
};
|
|
414
|
+
default:
|
|
415
|
+
return {
|
|
416
|
+
kind: "postgres",
|
|
417
|
+
code: error.code ?? "N/A",
|
|
418
|
+
severity: error.details.severity ?? "N/A",
|
|
419
|
+
message: error.message,
|
|
420
|
+
detail: error.details.detail,
|
|
421
|
+
column: error.details.column,
|
|
422
|
+
hint: error.details.hint
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
function isDriverError(error) {
|
|
427
|
+
return typeof error.code === "string" && typeof error.message === "string" && typeof error.details === "object" && typeof error.details.severity === "string" && (typeof error.details.detail === "string" || error.details.detail === void 0) && (typeof error.details.column === "string" || error.details.column === void 0) && (typeof error.details.hint === "string" || error.details.hint === void 0);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// src/ppg.ts
|
|
431
|
+
var PrismaPostgresAdapter = class {
|
|
432
|
+
#config;
|
|
433
|
+
adapterName = "@prisma/ppg-adapter";
|
|
434
|
+
provider = "postgres";
|
|
435
|
+
constructor(config) {
|
|
436
|
+
this.#config = config;
|
|
437
|
+
}
|
|
438
|
+
connect() {
|
|
439
|
+
return Promise.resolve(new PrismaPostgresConnection(this.#config));
|
|
440
|
+
}
|
|
441
|
+
};
|
|
442
|
+
var PrismaPostgresConnection = class {
|
|
443
|
+
#client;
|
|
444
|
+
adapterName = "@prisma/ppg-adapter";
|
|
445
|
+
provider = "postgres";
|
|
446
|
+
constructor(config) {
|
|
447
|
+
const existingParsers = "parsers" in config && config.parsers instanceof Array ? config.parsers : [];
|
|
448
|
+
this.#client = client({
|
|
449
|
+
...config,
|
|
450
|
+
parsers: [...existingParsers, ...builtinParsers]
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
async dispose() {
|
|
454
|
+
}
|
|
455
|
+
getConnectionInfo() {
|
|
456
|
+
return {
|
|
457
|
+
maxBindValues: 16 << 10,
|
|
458
|
+
schemaName: "public",
|
|
459
|
+
supportsRelationJoins: true
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
async executeRaw(params) {
|
|
463
|
+
return executeRawStatement(this.#client, params);
|
|
464
|
+
}
|
|
465
|
+
async executeScript(script) {
|
|
466
|
+
await this.#client.query(script);
|
|
467
|
+
}
|
|
468
|
+
async queryRaw(params) {
|
|
469
|
+
return executeQueryRaw(this.#client, params);
|
|
470
|
+
}
|
|
471
|
+
async startTransaction(isolationLevel) {
|
|
472
|
+
const session = await this.#client.newSession();
|
|
473
|
+
return new PrismaPostgresTransaction(session, isolationLevel);
|
|
474
|
+
}
|
|
475
|
+
};
|
|
476
|
+
var PrismaPostgresTransaction = class {
|
|
477
|
+
#session;
|
|
478
|
+
#isolationLevel;
|
|
479
|
+
#begun = false;
|
|
480
|
+
#finished = false;
|
|
481
|
+
adapterName = "@prisma/ppg-adapter";
|
|
482
|
+
provider = "postgres";
|
|
483
|
+
constructor(session, isolationLevel) {
|
|
484
|
+
this.#session = session;
|
|
485
|
+
this.#isolationLevel = isolationLevel;
|
|
486
|
+
}
|
|
487
|
+
get options() {
|
|
488
|
+
return {
|
|
489
|
+
usePhantomQuery: false
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
async #ensureBegun() {
|
|
493
|
+
if (this.#begun) return;
|
|
494
|
+
let beginSql = "BEGIN";
|
|
495
|
+
if (this.#isolationLevel) {
|
|
496
|
+
beginSql += ` ISOLATION LEVEL ${isolationLevelToSql(this.#isolationLevel)}`;
|
|
497
|
+
}
|
|
498
|
+
try {
|
|
499
|
+
await this.#session.query(beginSql);
|
|
500
|
+
this.#begun = true;
|
|
501
|
+
} catch (error) {
|
|
502
|
+
this.#session.close();
|
|
503
|
+
throw convertDriverError(error);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
async commit() {
|
|
507
|
+
if (this.#finished) {
|
|
508
|
+
throw new Error("Transaction already finished");
|
|
509
|
+
}
|
|
510
|
+
try {
|
|
511
|
+
await this.#ensureBegun();
|
|
512
|
+
await this.#session.query("COMMIT");
|
|
513
|
+
this.#finished = true;
|
|
514
|
+
} catch (error) {
|
|
515
|
+
throw convertDriverError(error);
|
|
516
|
+
} finally {
|
|
517
|
+
this.#session.close();
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
async rollback() {
|
|
521
|
+
if (this.#finished) {
|
|
522
|
+
throw new Error("Transaction already finished");
|
|
523
|
+
}
|
|
524
|
+
try {
|
|
525
|
+
if (this.#begun) {
|
|
526
|
+
await this.#session.query("ROLLBACK");
|
|
527
|
+
}
|
|
528
|
+
this.#finished = true;
|
|
529
|
+
} catch (error) {
|
|
530
|
+
throw convertDriverError(error);
|
|
531
|
+
} finally {
|
|
532
|
+
this.#session.close();
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
async executeRaw(params) {
|
|
536
|
+
await this.#ensureBegun();
|
|
537
|
+
return executeRawStatement(this.#session, params);
|
|
538
|
+
}
|
|
539
|
+
async queryRaw(params) {
|
|
540
|
+
await this.#ensureBegun();
|
|
541
|
+
return executeQueryRaw(this.#session, params);
|
|
542
|
+
}
|
|
543
|
+
};
|
|
544
|
+
async function executeQueryRaw(executor, params) {
|
|
545
|
+
const { sql, args } = params;
|
|
546
|
+
try {
|
|
547
|
+
const convertedArgs = convertArgs(args, params.argTypes);
|
|
548
|
+
const result = await executor.query(sql, ...convertedArgs);
|
|
549
|
+
const rows = await result.rows.collect();
|
|
550
|
+
const columnNames = result.columns.map((col) => col.name);
|
|
551
|
+
const columnTypes = result.columns.map((col) => fieldToColumnType(col.oid));
|
|
552
|
+
return {
|
|
553
|
+
columnNames,
|
|
554
|
+
columnTypes,
|
|
555
|
+
rows: rows.map((row) => row.values)
|
|
556
|
+
};
|
|
557
|
+
} catch (error) {
|
|
558
|
+
throw convertDriverError(error);
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
async function executeRawStatement(executor, params) {
|
|
562
|
+
const { sql, args } = params;
|
|
563
|
+
try {
|
|
564
|
+
const convertedArgs = convertArgs(args, params.argTypes);
|
|
565
|
+
const affected = await executor.exec(sql, ...convertedArgs);
|
|
566
|
+
return affected;
|
|
567
|
+
} catch (error) {
|
|
568
|
+
throw convertDriverError(error);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
export {
|
|
572
|
+
PrismaPostgresAdapter
|
|
573
|
+
};
|
package/package.json
CHANGED
|
@@ -1,5 +1,47 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma/adapter-ppg",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
|
|
3
|
+
"version": "6.20.0-dev.8",
|
|
4
|
+
"description": "Prisma Postgres Serverless driver adapter",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.mjs",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"require": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"import": {
|
|
15
|
+
"types": "./dist/index.d.mts",
|
|
16
|
+
"default": "./dist/index.mjs"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "https://github.com/prisma/prisma.git",
|
|
23
|
+
"directory": "packages/adapter-ppg"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"README.md"
|
|
28
|
+
],
|
|
29
|
+
"keywords": [],
|
|
30
|
+
"author": "Pierantonio Cangianiello (cangianiello@prisma.io)",
|
|
31
|
+
"license": "Apache-2.0",
|
|
32
|
+
"sideEffects": false,
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"postgres-array": "3.0.4",
|
|
35
|
+
"pg-types": "4.0.2",
|
|
36
|
+
"@prisma/ppg": "^1.0.1",
|
|
37
|
+
"@prisma/driver-adapter-utils": "6.20.0-dev.8"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@prisma/debug": "6.20.0-dev.8"
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"dev": "DEV=true tsx helpers/build.ts",
|
|
44
|
+
"build": "tsx helpers/build.ts",
|
|
45
|
+
"test": "vitest run"
|
|
46
|
+
}
|
|
47
|
+
}
|