@prisma/client-engine-runtime 6.7.0-dev.17 → 6.7.0-dev.19
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/dist/QueryPlan.d.ts +2 -0
- package/dist/index.d.mts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +69 -16
- package/dist/index.mjs +69 -16
- package/package.json +3 -3
package/dist/QueryPlan.d.ts
CHANGED
package/dist/index.d.mts
CHANGED
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -224,6 +224,7 @@ var GeneratorRegistry = class {
|
|
|
224
224
|
this.register("cuid", new CuidGenerator());
|
|
225
225
|
this.register("ulid", new UlidGenerator());
|
|
226
226
|
this.register("nanoid", new NanoIdGenerator());
|
|
227
|
+
this.register("product", new ProductGenerator());
|
|
227
228
|
}
|
|
228
229
|
/**
|
|
229
230
|
* Returns a snapshot of the generator registry. It's 'frozen' in time at the moment of this
|
|
@@ -286,6 +287,22 @@ var NanoIdGenerator = class {
|
|
|
286
287
|
}
|
|
287
288
|
}
|
|
288
289
|
};
|
|
290
|
+
var ProductGenerator = class {
|
|
291
|
+
generate(lhs, rhs) {
|
|
292
|
+
if (lhs === void 0 || rhs === void 0) {
|
|
293
|
+
throw new Error("Invalid Product generator arguments");
|
|
294
|
+
}
|
|
295
|
+
if (Array.isArray(lhs) && Array.isArray(rhs)) {
|
|
296
|
+
return lhs.flatMap((l) => rhs.map((r) => [l, r]));
|
|
297
|
+
} else if (Array.isArray(lhs)) {
|
|
298
|
+
return lhs.map((l) => [l, rhs]);
|
|
299
|
+
} else if (Array.isArray(rhs)) {
|
|
300
|
+
return rhs.map((r) => [lhs, r]);
|
|
301
|
+
} else {
|
|
302
|
+
return [[lhs, rhs]];
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
};
|
|
289
306
|
|
|
290
307
|
// src/QueryPlan.ts
|
|
291
308
|
function isPrismaValuePlaceholder(value) {
|
|
@@ -300,36 +317,44 @@ function renderQuery(dbQuery, scope, generators) {
|
|
|
300
317
|
const queryType = dbQuery.type;
|
|
301
318
|
switch (queryType) {
|
|
302
319
|
case "rawSql":
|
|
303
|
-
return renderRawSql(dbQuery.sql,
|
|
320
|
+
return renderRawSql(dbQuery.sql, evaluateParams(dbQuery.params, scope, generators));
|
|
304
321
|
case "templateSql":
|
|
305
322
|
return renderTemplateSql(
|
|
306
323
|
dbQuery.fragments,
|
|
307
324
|
dbQuery.placeholderFormat,
|
|
308
|
-
|
|
325
|
+
evaluateParams(dbQuery.params, scope, generators)
|
|
309
326
|
);
|
|
310
327
|
default:
|
|
311
328
|
assertNever(queryType, `Invalid query type`);
|
|
312
329
|
}
|
|
313
330
|
}
|
|
314
|
-
function
|
|
315
|
-
return params.map((param) =>
|
|
316
|
-
|
|
317
|
-
|
|
331
|
+
function evaluateParams(params, scope, generators) {
|
|
332
|
+
return params.map((param) => evaluateParam(param, scope, generators));
|
|
333
|
+
}
|
|
334
|
+
function evaluateParam(param, scope, generators) {
|
|
335
|
+
let value = param;
|
|
336
|
+
while (doesRequireEvaluation(value)) {
|
|
337
|
+
if (isPrismaValuePlaceholder(value)) {
|
|
338
|
+
const found = scope[value.prisma__value.name];
|
|
339
|
+
if (found === void 0) {
|
|
340
|
+
throw new Error(`Missing value for query variable ${value.prisma__value.name}`);
|
|
341
|
+
}
|
|
342
|
+
value = found;
|
|
343
|
+
} else if (isPrismaValueGenerator(value)) {
|
|
344
|
+
const { name, args } = value.prisma__value;
|
|
318
345
|
const generator = generators[name];
|
|
319
346
|
if (!generator) {
|
|
320
347
|
throw new Error(`Encountered an unknown generator '${name}'`);
|
|
321
348
|
}
|
|
322
|
-
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
return param;
|
|
326
|
-
}
|
|
327
|
-
const value = scope[param.prisma__value.name];
|
|
328
|
-
if (value === void 0) {
|
|
329
|
-
throw new Error(`Missing value for query variable ${param.prisma__value.name}`);
|
|
349
|
+
value = generator.generate(...args.map((arg) => evaluateParam(arg, scope, generators)));
|
|
350
|
+
} else {
|
|
351
|
+
assertNever(value, `Unexpected unevaluated value type: ${value}`);
|
|
330
352
|
}
|
|
331
|
-
|
|
332
|
-
|
|
353
|
+
}
|
|
354
|
+
if (Array.isArray(value)) {
|
|
355
|
+
value = value.map((el) => evaluateParam(el, scope, generators));
|
|
356
|
+
}
|
|
357
|
+
return value;
|
|
333
358
|
}
|
|
334
359
|
function renderTemplateSql(fragments, placeholderFormat, params) {
|
|
335
360
|
let paramIndex = 0;
|
|
@@ -358,6 +383,29 @@ function renderTemplateSql(fragments, placeholderFormat, params) {
|
|
|
358
383
|
}).join(",");
|
|
359
384
|
return `(${placeholders})`;
|
|
360
385
|
}
|
|
386
|
+
case "parameterTupleList": {
|
|
387
|
+
if (paramIndex >= params.length) {
|
|
388
|
+
throw new Error(`Malformed query template. Fragments attempt to read over ${params.length} parameters.`);
|
|
389
|
+
}
|
|
390
|
+
const paramValue = params[paramIndex++];
|
|
391
|
+
if (!Array.isArray(paramValue)) {
|
|
392
|
+
throw new Error(`Malformed query template. Tuple list expected.`);
|
|
393
|
+
}
|
|
394
|
+
if (paramValue.length === 0) {
|
|
395
|
+
throw new Error(`Malformed query template. Tuple list cannot be empty.`);
|
|
396
|
+
}
|
|
397
|
+
const tupleList = paramValue.map((tuple) => {
|
|
398
|
+
if (!Array.isArray(tuple)) {
|
|
399
|
+
throw new Error(`Malformed query template. Tuple expected.`);
|
|
400
|
+
}
|
|
401
|
+
const elements = tuple.map((value) => {
|
|
402
|
+
flattenedParams.push(value);
|
|
403
|
+
return formatPlaceholder(placeholderFormat, placeholderNumber++);
|
|
404
|
+
}).join(",");
|
|
405
|
+
return `(${elements})`;
|
|
406
|
+
}).join(",");
|
|
407
|
+
return tupleList;
|
|
408
|
+
}
|
|
361
409
|
default:
|
|
362
410
|
assertNever(fragmentType, "Invalid fragment type");
|
|
363
411
|
}
|
|
@@ -416,6 +464,9 @@ function placeholderTypeToArgType(type) {
|
|
|
416
464
|
}
|
|
417
465
|
return mappedType;
|
|
418
466
|
}
|
|
467
|
+
function doesRequireEvaluation(param) {
|
|
468
|
+
return isPrismaValuePlaceholder(param) || isPrismaValueGenerator(param);
|
|
469
|
+
}
|
|
419
470
|
|
|
420
471
|
// src/interpreter/serialize.ts
|
|
421
472
|
function serialize(resultSet) {
|
|
@@ -633,6 +684,8 @@ function attachChildrenToParent(parentRecord, children) {
|
|
|
633
684
|
function filterChildRecords(records, parentRecord, joinExpr) {
|
|
634
685
|
if (Array.isArray(records)) {
|
|
635
686
|
return records.filter((record) => childRecordMatchesParent(asRecord(record), parentRecord, joinExpr));
|
|
687
|
+
} else if (records === null) {
|
|
688
|
+
return null;
|
|
636
689
|
} else {
|
|
637
690
|
const record = asRecord(records);
|
|
638
691
|
return childRecordMatchesParent(record, parentRecord, joinExpr) ? record : null;
|
package/dist/index.mjs
CHANGED
|
@@ -182,6 +182,7 @@ var GeneratorRegistry = class {
|
|
|
182
182
|
this.register("cuid", new CuidGenerator());
|
|
183
183
|
this.register("ulid", new UlidGenerator());
|
|
184
184
|
this.register("nanoid", new NanoIdGenerator());
|
|
185
|
+
this.register("product", new ProductGenerator());
|
|
185
186
|
}
|
|
186
187
|
/**
|
|
187
188
|
* Returns a snapshot of the generator registry. It's 'frozen' in time at the moment of this
|
|
@@ -244,6 +245,22 @@ var NanoIdGenerator = class {
|
|
|
244
245
|
}
|
|
245
246
|
}
|
|
246
247
|
};
|
|
248
|
+
var ProductGenerator = class {
|
|
249
|
+
generate(lhs, rhs) {
|
|
250
|
+
if (lhs === void 0 || rhs === void 0) {
|
|
251
|
+
throw new Error("Invalid Product generator arguments");
|
|
252
|
+
}
|
|
253
|
+
if (Array.isArray(lhs) && Array.isArray(rhs)) {
|
|
254
|
+
return lhs.flatMap((l) => rhs.map((r) => [l, r]));
|
|
255
|
+
} else if (Array.isArray(lhs)) {
|
|
256
|
+
return lhs.map((l) => [l, rhs]);
|
|
257
|
+
} else if (Array.isArray(rhs)) {
|
|
258
|
+
return rhs.map((r) => [lhs, r]);
|
|
259
|
+
} else {
|
|
260
|
+
return [[lhs, rhs]];
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
};
|
|
247
264
|
|
|
248
265
|
// src/QueryPlan.ts
|
|
249
266
|
function isPrismaValuePlaceholder(value) {
|
|
@@ -258,36 +275,44 @@ function renderQuery(dbQuery, scope, generators) {
|
|
|
258
275
|
const queryType = dbQuery.type;
|
|
259
276
|
switch (queryType) {
|
|
260
277
|
case "rawSql":
|
|
261
|
-
return renderRawSql(dbQuery.sql,
|
|
278
|
+
return renderRawSql(dbQuery.sql, evaluateParams(dbQuery.params, scope, generators));
|
|
262
279
|
case "templateSql":
|
|
263
280
|
return renderTemplateSql(
|
|
264
281
|
dbQuery.fragments,
|
|
265
282
|
dbQuery.placeholderFormat,
|
|
266
|
-
|
|
283
|
+
evaluateParams(dbQuery.params, scope, generators)
|
|
267
284
|
);
|
|
268
285
|
default:
|
|
269
286
|
assertNever(queryType, `Invalid query type`);
|
|
270
287
|
}
|
|
271
288
|
}
|
|
272
|
-
function
|
|
273
|
-
return params.map((param) =>
|
|
274
|
-
|
|
275
|
-
|
|
289
|
+
function evaluateParams(params, scope, generators) {
|
|
290
|
+
return params.map((param) => evaluateParam(param, scope, generators));
|
|
291
|
+
}
|
|
292
|
+
function evaluateParam(param, scope, generators) {
|
|
293
|
+
let value = param;
|
|
294
|
+
while (doesRequireEvaluation(value)) {
|
|
295
|
+
if (isPrismaValuePlaceholder(value)) {
|
|
296
|
+
const found = scope[value.prisma__value.name];
|
|
297
|
+
if (found === void 0) {
|
|
298
|
+
throw new Error(`Missing value for query variable ${value.prisma__value.name}`);
|
|
299
|
+
}
|
|
300
|
+
value = found;
|
|
301
|
+
} else if (isPrismaValueGenerator(value)) {
|
|
302
|
+
const { name, args } = value.prisma__value;
|
|
276
303
|
const generator = generators[name];
|
|
277
304
|
if (!generator) {
|
|
278
305
|
throw new Error(`Encountered an unknown generator '${name}'`);
|
|
279
306
|
}
|
|
280
|
-
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
return param;
|
|
284
|
-
}
|
|
285
|
-
const value = scope[param.prisma__value.name];
|
|
286
|
-
if (value === void 0) {
|
|
287
|
-
throw new Error(`Missing value for query variable ${param.prisma__value.name}`);
|
|
307
|
+
value = generator.generate(...args.map((arg) => evaluateParam(arg, scope, generators)));
|
|
308
|
+
} else {
|
|
309
|
+
assertNever(value, `Unexpected unevaluated value type: ${value}`);
|
|
288
310
|
}
|
|
289
|
-
|
|
290
|
-
|
|
311
|
+
}
|
|
312
|
+
if (Array.isArray(value)) {
|
|
313
|
+
value = value.map((el) => evaluateParam(el, scope, generators));
|
|
314
|
+
}
|
|
315
|
+
return value;
|
|
291
316
|
}
|
|
292
317
|
function renderTemplateSql(fragments, placeholderFormat, params) {
|
|
293
318
|
let paramIndex = 0;
|
|
@@ -316,6 +341,29 @@ function renderTemplateSql(fragments, placeholderFormat, params) {
|
|
|
316
341
|
}).join(",");
|
|
317
342
|
return `(${placeholders})`;
|
|
318
343
|
}
|
|
344
|
+
case "parameterTupleList": {
|
|
345
|
+
if (paramIndex >= params.length) {
|
|
346
|
+
throw new Error(`Malformed query template. Fragments attempt to read over ${params.length} parameters.`);
|
|
347
|
+
}
|
|
348
|
+
const paramValue = params[paramIndex++];
|
|
349
|
+
if (!Array.isArray(paramValue)) {
|
|
350
|
+
throw new Error(`Malformed query template. Tuple list expected.`);
|
|
351
|
+
}
|
|
352
|
+
if (paramValue.length === 0) {
|
|
353
|
+
throw new Error(`Malformed query template. Tuple list cannot be empty.`);
|
|
354
|
+
}
|
|
355
|
+
const tupleList = paramValue.map((tuple) => {
|
|
356
|
+
if (!Array.isArray(tuple)) {
|
|
357
|
+
throw new Error(`Malformed query template. Tuple expected.`);
|
|
358
|
+
}
|
|
359
|
+
const elements = tuple.map((value) => {
|
|
360
|
+
flattenedParams.push(value);
|
|
361
|
+
return formatPlaceholder(placeholderFormat, placeholderNumber++);
|
|
362
|
+
}).join(",");
|
|
363
|
+
return `(${elements})`;
|
|
364
|
+
}).join(",");
|
|
365
|
+
return tupleList;
|
|
366
|
+
}
|
|
319
367
|
default:
|
|
320
368
|
assertNever(fragmentType, "Invalid fragment type");
|
|
321
369
|
}
|
|
@@ -374,6 +422,9 @@ function placeholderTypeToArgType(type) {
|
|
|
374
422
|
}
|
|
375
423
|
return mappedType;
|
|
376
424
|
}
|
|
425
|
+
function doesRequireEvaluation(param) {
|
|
426
|
+
return isPrismaValuePlaceholder(param) || isPrismaValueGenerator(param);
|
|
427
|
+
}
|
|
377
428
|
|
|
378
429
|
// src/interpreter/serialize.ts
|
|
379
430
|
function serialize(resultSet) {
|
|
@@ -591,6 +642,8 @@ function attachChildrenToParent(parentRecord, children) {
|
|
|
591
642
|
function filterChildRecords(records, parentRecord, joinExpr) {
|
|
592
643
|
if (Array.isArray(records)) {
|
|
593
644
|
return records.filter((record) => childRecordMatchesParent(asRecord(record), parentRecord, joinExpr));
|
|
645
|
+
} else if (records === null) {
|
|
646
|
+
return null;
|
|
594
647
|
} else {
|
|
595
648
|
const record = asRecord(records);
|
|
596
649
|
return childRecordMatchesParent(record, parentRecord, joinExpr) ? record : null;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prisma/client-engine-runtime",
|
|
3
|
-
"version": "6.7.0-dev.
|
|
3
|
+
"version": "6.7.0-dev.19",
|
|
4
4
|
"description": "This package is intended for Prisma's internal use",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
"nanoid": "5.1.5",
|
|
31
31
|
"ulid": "3.0.0",
|
|
32
32
|
"uuid": "11.1.0",
|
|
33
|
-
"@prisma/debug": "6.7.0-dev.
|
|
34
|
-
"@prisma/driver-adapter-utils": "6.7.0-dev.
|
|
33
|
+
"@prisma/debug": "6.7.0-dev.19",
|
|
34
|
+
"@prisma/driver-adapter-utils": "6.7.0-dev.19"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/jest": "29.5.14",
|