@querykitjs/prisma-pg 1.0.1 → 2.0.0

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/index.cjs CHANGED
@@ -1,845 +1,2 @@
1
- 'use strict';
2
-
3
- var core = require('@querykitjs/core');
4
- var async_hooks = require('async_hooks');
5
-
6
- // src/registry.ts
7
-
8
- // src/internal/fields.ts
9
- function isDelegate(value) {
10
- if (typeof value !== "object" || value === null) return false;
11
- const d = value;
12
- return typeof d.findMany === "function" && typeof d.findFirst === "function" && typeof d.count === "function";
13
- }
14
- function delegateKeys(client) {
15
- return Object.keys(client).filter((key) => !key.startsWith("$") && !key.startsWith("_") && key !== "constructor" && isDelegate(client[key]));
16
- }
17
- var uncapitalize = (name) => name ? name[0].toLowerCase() + name.slice(1) : name;
18
- var KINDS = /* @__PURE__ */ new Set(["scalar", "enum", "object", "unsupported"]);
19
- var normalizeKind = (kind) => typeof kind === "string" && KINDS.has(kind) ? kind : "scalar";
20
- function fromRuntimeDataModel(client, delegateKey) {
21
- const rdm = client._runtimeDataModel;
22
- const models = rdm?.models;
23
- if (!models || typeof models !== "object") return void 0;
24
- const modelName = Object.keys(models).find((name) => uncapitalize(name) === delegateKey);
25
- if (!modelName) return void 0;
26
- const raw = models[modelName]?.fields;
27
- if (!Array.isArray(raw)) return void 0;
28
- const fields = [];
29
- for (const field of raw) {
30
- if (typeof field?.name !== "string") continue;
31
- fields.push({
32
- name: field.name,
33
- type: typeof field.type === "string" ? field.type : "",
34
- kind: normalizeKind(field.kind),
35
- isId: field.isId === true,
36
- isUpdatedAt: field.isUpdatedAt === true,
37
- isList: field.isList === true,
38
- ...typeof field.dbName === "string" && field.dbName ? { dbName: field.dbName } : {}
39
- });
40
- }
41
- return fields.length ? { name: modelName, fields, primaryKey: models[modelName]?.primaryKey ?? null } : void 0;
42
- }
43
- function fromDelegateFields(delegate, delegateKey) {
44
- const refs = delegate?.fields;
45
- if (!refs || typeof refs !== "object") return void 0;
46
- const fields = [];
47
- let modelName;
48
- for (const ref of Object.values(refs)) {
49
- const r = ref;
50
- if (typeof r.name !== "string") continue;
51
- if (typeof r.modelName === "string") modelName ??= r.modelName;
52
- fields.push({
53
- name: r.name,
54
- type: typeof r.typeName === "string" ? r.typeName : "",
55
- kind: r.isEnum === true ? "enum" : "scalar",
56
- isId: r.name === "id",
57
- isUpdatedAt: false,
58
- isList: r.isList === true
59
- });
60
- }
61
- return fields.length ? { name: modelName ?? delegateKey, fields } : void 0;
62
- }
63
- function readModelMeta(client, delegateKey, override) {
64
- const delegate = client[delegateKey];
65
- if (!isDelegate(delegate)) {
66
- const available = delegateKeys(client);
67
- throw new Error(
68
- `createRegistry: "${delegateKey}" is not a model delegate on this Prisma client. Available models: ${available.join(", ") || "(none)"}. Note the key is camelCase \u2014 model "LegalEntity" is "legalEntity".`
69
- );
70
- }
71
- const discovered = fromRuntimeDataModel(client, delegateKey) ?? fromDelegateFields(delegate, delegateKey);
72
- const source = override?.length ? { name: discovered?.name ?? delegateKey, fields: [...override] } : discovered;
73
- if (!source) {
74
- throw new Error(
75
- `createRegistry: could not read field metadata for model "${delegateKey}". This adapter reads it from the Prisma client at runtime (\`_runtimeDataModel\`, then \`delegate.fields\`); both were unavailable, which usually means an unsupported @prisma/client version (>=5 expected). Pass \`fields\` in the repository options to supply it explicitly.`
76
- );
77
- }
78
- const fields = /* @__PURE__ */ new Map();
79
- const byDbName = /* @__PURE__ */ new Map();
80
- for (const field of source.fields) {
81
- fields.set(field.name, field);
82
- if (field.dbName && field.dbName !== field.name) byDbName.set(field.dbName, field.name);
83
- }
84
- for (const name of fields.keys()) byDbName.delete(name);
85
- const idField = fields.get("id")?.name ?? [...fields.values()].find((f2) => f2.isId)?.name;
86
- const updatedAt = fields.get("updatedAt");
87
- const compositeRaw = source.primaryKey;
88
- const compositeFields = Array.isArray(compositeRaw?.fields) ? compositeRaw.fields.filter((f2) => typeof f2 === "string") : [];
89
- const primaryKey = idField ? [idField] : compositeFields.filter((f2) => fields.has(f2));
90
- const primaryKeyName = idField ? void 0 : (typeof compositeRaw?.name === "string" && compositeRaw.name ? compositeRaw.name : primaryKey.join("_")) || void 0;
91
- return {
92
- name: source.name,
93
- fields,
94
- byDbName,
95
- primaryKey,
96
- primaryKeyName,
97
- idField,
98
- hasDeletedAt: fields.has("deletedAt"),
99
- // Prisma maintains `@updatedAt` itself; stamping it again would be redundant
100
- // (mongoose does the same dance around schema `timestamps`).
101
- stampUpdatedAt: updatedAt && !updatedAt.isUpdatedAt ? updatedAt.name : void 0,
102
- hasCreatedAt: fields.has("createdAt")
103
- };
104
- }
105
- function resolveField(meta, key) {
106
- if (key === "id") return meta.fields.has("id") ? "id" : meta.idField;
107
- if (meta.fields.has(key)) return key;
108
- return meta.byDbName.get(key);
109
- }
110
- function fieldMeta(meta, field) {
111
- return meta.fields.get(field);
112
- }
113
- function isDateField(meta, field) {
114
- return meta.fields.get(field)?.type === "DateTime";
115
- }
116
- function isStringField(meta, field) {
117
- return meta.fields.get(field)?.type === "String";
118
- }
119
- function castValue(meta, field, value) {
120
- if (!isDateField(meta, field)) return value;
121
- if (value === null || value === void 0 || value instanceof Date) return value;
122
- if (typeof value !== "string" && typeof value !== "number") return value;
123
- const date = new Date(value);
124
- return Number.isNaN(date.getTime()) ? value : date;
125
- }
126
- function reportSkip(diag, info) {
127
- if (!diag) return;
128
- const full = { ...info, source: diag.source };
129
- if (diag.strict) throw new core.QueryKitError(full);
130
- diag.onSkipped?.(full);
131
- }
132
-
133
- // src/internal/projection.ts
134
- function truthyKeys(selection) {
135
- return Object.entries(selection).filter(([, on]) => on).map(([key]) => key);
136
- }
137
- function pickColumns(guard, columns) {
138
- if (guard.forcedKeys) return guard.forcedKeys;
139
- const requested = columns ? truthyKeys(columns) : [];
140
- if (!guard.allowed) return requested.length > 0 ? requested : void 0;
141
- const intersection = requested.filter((key) => guard.allowed.has(key));
142
- return intersection.length > 0 ? intersection : [...guard.allowed];
143
- }
144
- function buildProjection(meta, guard, columns, withRelations, forceKeys = []) {
145
- const relations = {};
146
- if (withRelations) {
147
- for (const [key, value] of Object.entries(withRelations)) {
148
- if (value) relations[key] = value;
149
- }
150
- }
151
- const hasRelations = Object.keys(relations).length > 0;
152
- const keys = pickColumns(guard, columns);
153
- const select = {};
154
- if (keys) {
155
- for (const key of [...keys, ...forceKeys]) {
156
- const field = resolveField(meta, key);
157
- if (field) select[field] = true;
158
- }
159
- }
160
- const hasSelect = Object.keys(select).length > 0;
161
- if (!hasSelect) return hasRelations ? { include: relations } : {};
162
- if (hasRelations) return { select: { ...select, ...relations } };
163
- return { select };
164
- }
165
-
166
- // src/internal/cursor.ts
167
- function encodeCursor(value) {
168
- const normalized = value instanceof Date ? value.toISOString() : value;
169
- const json = JSON.stringify({ v: normalized });
170
- return Buffer.from(json, "utf8").toString("base64url");
171
- }
172
- function decodeCursor(cursor) {
173
- if (!cursor) return void 0;
174
- try {
175
- const json = Buffer.from(cursor, "base64url").toString("utf8");
176
- const payload = JSON.parse(json);
177
- return payload.v;
178
- } catch {
179
- return void 0;
180
- }
181
- }
182
-
183
- // src/internal/order-by.ts
184
- function normalize(sort) {
185
- if (!sort) return [];
186
- return sort.filter((item) => item && item.key).map((item) => ({ key: item.key, direction: item.direction ?? "asc" }));
187
- }
188
- function buildOrderBy(meta, sort, diag) {
189
- const orderBy = [];
190
- for (const { key, direction } of normalize(sort)) {
191
- const field = resolveField(meta, key);
192
- if (field) orderBy.push({ [field]: direction });
193
- else reportSkip(diag, { site: "sort", key, reason: "unknown-key" });
194
- }
195
- if (orderBy.length > 0) return orderBy;
196
- if (meta.hasCreatedAt) return [{ createdAt: "desc" }];
197
- return meta.idField ? [{ [meta.idField]: "desc" }] : [];
198
- }
199
- var TEXT_OPERATORS = new Set(core.TEXT_FILTER_OPERATORS);
200
- var INVALID_VALUE = /* @__PURE__ */ Symbol("querykit.invalid-value");
201
- var isTextOperator = (operator) => TEXT_OPERATORS.has(operator);
202
- function castForField(meta, field, value) {
203
- if (value === null || value === void 0) return value;
204
- const type = fieldMeta(meta, field)?.type;
205
- if (type === "DateTime") {
206
- if (value instanceof Date) return Number.isNaN(value.getTime()) ? INVALID_VALUE : value;
207
- const cast = castValue(meta, field, value);
208
- if (cast instanceof Date) return Number.isNaN(cast.getTime()) ? INVALID_VALUE : cast;
209
- return INVALID_VALUE;
210
- }
211
- if (type === "Int" || type === "BigInt") {
212
- if (typeof value === "number") return Number.isInteger(value) ? value : INVALID_VALUE;
213
- if (typeof value === "bigint") return value;
214
- if (typeof value === "string" && value.trim() !== "") {
215
- const n = Number(value);
216
- return Number.isInteger(n) ? n : INVALID_VALUE;
217
- }
218
- return INVALID_VALUE;
219
- }
220
- if (type === "Float" || type === "Decimal") {
221
- if (typeof value === "number") return Number.isFinite(value) ? value : INVALID_VALUE;
222
- if (typeof value === "string" && value.trim() !== "") {
223
- const n = Number(value);
224
- return Number.isFinite(n) ? n : INVALID_VALUE;
225
- }
226
- return INVALID_VALUE;
227
- }
228
- if (type === "Boolean") {
229
- if (typeof value === "boolean") return value;
230
- if (value === "true" || value === "1" || value === 1) return true;
231
- if (value === "false" || value === "0" || value === 0) return false;
232
- return INVALID_VALUE;
233
- }
234
- return value;
235
- }
236
- function coerceCondition(meta, field, operator, value) {
237
- if (value === void 0 || TEXT_OPERATORS.has(operator)) return value;
238
- if (Array.isArray(value)) {
239
- const items = [];
240
- for (const item of value) {
241
- const cast2 = castForField(meta, field, item);
242
- if (cast2 === INVALID_VALUE) return INVALID_VALUE;
243
- items.push(cast2);
244
- }
245
- return items;
246
- }
247
- const cast = castForField(meta, field, value);
248
- return cast === INVALID_VALUE ? INVALID_VALUE : cast;
249
- }
250
-
251
- // src/internal/operators.ts
252
- var isWhereFragment = (value) => typeof value?.buildFor === "function";
253
- var text = (value) => String(value ?? "");
254
- var asTuple = (value) => Array.isArray(value) && value.length === 2 ? [value[0], value[1]] : void 0;
255
- var insensitive = (fragment, ctx) => ctx.isString ? { ...fragment, mode: "insensitive" } : fragment;
256
- function tokenizeLike(pattern) {
257
- const tokens = [];
258
- for (let i = 0; i < pattern.length; i++) {
259
- const ch = pattern[i];
260
- if (ch === "\\") {
261
- const next = pattern[i + 1];
262
- if (next === void 0) return void 0;
263
- tokens.push({ kind: "lit", char: next });
264
- i++;
265
- continue;
266
- }
267
- if (ch === "%") tokens.push({ kind: "any", char: "%" });
268
- else if (ch === "_") tokens.push({ kind: "one", char: "_" });
269
- else tokens.push({ kind: "lit", char: ch });
270
- }
271
- return tokens;
272
- }
273
- var renderPattern = (tokens) => tokens.map((t) => t.kind === "lit" && (t.char === "%" || t.char === "_" || t.char === "\\") ? `\\${t.char}` : t.char).join("");
274
- function parseLikePattern(pattern) {
275
- const tokens = tokenizeLike(pattern);
276
- if (!tokens) return void 0;
277
- let start = 0;
278
- let end = tokens.length;
279
- let leading = false;
280
- let trailing = false;
281
- while (start < end && tokens[start].kind === "any") {
282
- leading = true;
283
- start++;
284
- }
285
- while (end > start && tokens[end - 1].kind === "any") {
286
- trailing = true;
287
- end--;
288
- }
289
- const core = tokens.slice(start, end);
290
- if (core.some((t) => t.kind !== "lit")) return void 0;
291
- const value = core.map((t) => t.char).join("");
292
- const op = leading && trailing ? "contains" : leading ? "endsWith" : trailing ? "startsWith" : "equals";
293
- if (op !== "equals" && /[%_]/.test(value)) return void 0;
294
- return { op, value };
295
- }
296
- function rawLikePlan(pattern, ctx, caseInsensitive) {
297
- const tokens = tokenizeLike(pattern);
298
- if (!tokens) return void 0;
299
- const mode = (fragment) => caseInsensitive ? insensitive(fragment, ctx) : fragment;
300
- const raw = renderPattern(tokens);
301
- return {
302
- buildFor(field) {
303
- if (tokens[tokens.length - 1]?.kind === "any") {
304
- return { [field]: mode({ startsWith: raw.replace(/%$/, "") }) };
305
- }
306
- const lastAny = tokens.map((t) => t.kind).lastIndexOf("any");
307
- if (lastAny >= 0) {
308
- const tail = renderPattern(tokens.slice(lastAny + 1));
309
- return { AND: [{ [field]: mode({ startsWith: raw }) }, { [field]: mode({ endsWith: tail }) }] };
310
- }
311
- return { AND: [{ [field]: mode({ startsWith: raw }) }, { NOT: { [field]: mode({ startsWith: `${raw}_` }) } }] };
312
- }
313
- };
314
- }
315
- var likeFragment = (value, ctx, caseInsensitive) => {
316
- const pattern = text(value);
317
- const shape = parseLikePattern(pattern);
318
- if (shape) {
319
- const fragment = { [shape.op]: shape.value };
320
- return caseInsensitive ? insensitive(fragment, ctx) : fragment;
321
- }
322
- return rawLikePlan(pattern, ctx, caseInsensitive);
323
- };
324
- var operators = {
325
- "=": (v) => ({ equals: v }),
326
- eq: (v) => ({ equals: v }),
327
- "!=": (v) => ({ not: v }),
328
- ne: (v) => ({ not: v }),
329
- ">": (v) => ({ gt: v }),
330
- gt: (v) => ({ gt: v }),
331
- ">=": (v) => ({ gte: v }),
332
- gte: (v) => ({ gte: v }),
333
- "<": (v) => ({ lt: v }),
334
- lt: (v) => ({ lt: v }),
335
- "<=": (v) => ({ lte: v }),
336
- lte: (v) => ({ lte: v }),
337
- contains: (v, ctx) => insensitive({ contains: text(v) }, ctx),
338
- "%_%": (v, ctx) => insensitive({ contains: text(v) }, ctx),
339
- startsWith: (v, ctx) => insensitive({ startsWith: text(v) }, ctx),
340
- "%_": (v, ctx) => insensitive({ startsWith: text(v) }, ctx),
341
- endsWith: (v, ctx) => insensitive({ endsWith: text(v) }, ctx),
342
- "_%": (v, ctx) => insensitive({ endsWith: text(v) }, ctx),
343
- like: (v, ctx) => likeFragment(v, ctx, false),
344
- ilike: (v, ctx) => likeFragment(v, ctx, true),
345
- notLike: (v, ctx) => {
346
- const inner = likeFragment(v, ctx, false);
347
- if (!inner) return void 0;
348
- if (isWhereFragment(inner)) return { buildFor: (field) => ({ NOT: inner.buildFor(field) }) };
349
- return { not: inner };
350
- },
351
- in: (v) => Array.isArray(v) ? { in: v } : void 0,
352
- notIn: (v) => Array.isArray(v) ? { notIn: v } : void 0,
353
- between: (v) => {
354
- const t = asTuple(v);
355
- return t ? { gte: t[0], lte: t[1] } : void 0;
356
- },
357
- notBetween: (v) => {
358
- const t = asTuple(v);
359
- if (!t) return void 0;
360
- return { buildFor: (field) => ({ NOT: { [field]: { gte: t[0], lte: t[1] } } }) };
361
- },
362
- isNull: () => ({ equals: null }),
363
- isNotNull: () => ({ not: null })
364
- };
365
-
366
- // src/internal/where.ts
367
- var isObject = (node) => typeof node === "object" && node !== null;
368
- var isFieldCondition = (node) => isObject(node) && "key" in node && !("and" in node) && !("or" in node) && !("not" in node);
369
- function combine(kind, parts) {
370
- const valid = parts.filter((part) => part !== void 0);
371
- if (valid.length === 0) return void 0;
372
- if (valid.length === 1) return valid[0];
373
- return { [kind]: valid };
374
- }
375
- function buildCondition(meta, condition, diag) {
376
- const operator = condition.operation ?? "=";
377
- const build = operators[operator];
378
- if (!build) throw new Error(`Unsupported filter operator: "${operator}"`);
379
- const field = resolveField(meta, condition.key);
380
- if (!field) {
381
- reportSkip(diag, { site: "filter", key: condition.key, operation: operator, reason: "unknown-key" });
382
- return void 0;
383
- }
384
- const isString = isStringField(meta, field);
385
- if (isTextOperator(operator) && !isString) {
386
- reportSkip(diag, { site: "filter", key: condition.key, operation: operator, reason: "invalid-value" });
387
- return void 0;
388
- }
389
- const value = coerceCondition(meta, field, operator, condition.value);
390
- if (value === INVALID_VALUE) {
391
- reportSkip(diag, { site: "filter", key: condition.key, operation: operator, reason: "invalid-value" });
392
- return void 0;
393
- }
394
- const fragment = build(value, { isString });
395
- if (fragment === void 0) {
396
- reportSkip(diag, { site: "filter", key: condition.key, operation: operator, reason: "invalid-value" });
397
- return void 0;
398
- }
399
- if (isWhereFragment(fragment)) return fragment.buildFor(field);
400
- return { [field]: fragment };
401
- }
402
- function buildNode(meta, node, diag) {
403
- if (isFieldCondition(node)) return buildCondition(meta, node, diag);
404
- if (!isObject(node)) return void 0;
405
- if ("and" in node) {
406
- return combine(
407
- "AND",
408
- node.and.map((child) => buildNode(meta, child, diag))
409
- );
410
- }
411
- if ("or" in node) {
412
- return combine(
413
- "OR",
414
- node.or.map((child) => buildNode(meta, child, diag))
415
- );
416
- }
417
- if ("not" in node) {
418
- const inner = buildNode(meta, node.not, diag);
419
- return inner ? { NOT: inner } : void 0;
420
- }
421
- return node;
422
- }
423
- function buildWhere(meta, filter, diag) {
424
- if (filter === void 0) return void 0;
425
- if (Array.isArray(filter)) {
426
- return combine(
427
- "AND",
428
- filter.map((node) => buildNode(meta, node, diag))
429
- );
430
- }
431
- return buildNode(meta, filter, diag);
432
- }
433
- function andWhere(parts) {
434
- return combine("AND", parts);
435
- }
436
-
437
- // src/repository.ts
438
- var CHUNK_SIZE = 1e3;
439
- var clampPageSize = (requested, fallback, max) => Math.min(max, Math.max(1, Math.trunc(requested ?? fallback)));
440
- var toArray = (value) => value === void 0 ? [] : Array.isArray(value) ? value : [value];
441
- function buildRepository(runtime, modelKey, config = {}) {
442
- const meta = readModelMeta(runtime.baseClient, modelKey, config.fields);
443
- const delegate = () => runtime.getExecutor()[modelKey];
444
- const diag = {
445
- source: meta.name,
446
- strict: runtime.strict,
447
- onSkipped: runtime.onSkippedCondition
448
- };
449
- const requirePrimaryKey = (method) => {
450
- if (meta.primaryKey.length === 0) {
451
- throw new Error(
452
- `${method}: model "${meta.name}" has no primary key, so a row cannot be addressed individually. Use updateWhere/deleteWhere with an explicit filter instead.`
453
- );
454
- }
455
- return meta.primaryKey;
456
- };
457
- const keySelect = (key) => Object.fromEntries(key.map((field) => [field, true]));
458
- const uniqueWhere = (key, row) => {
459
- if (key.length === 1) return { [key[0]]: row[key[0]] };
460
- return { [meta.primaryKeyName ?? key.join("_")]: Object.fromEntries(key.map((field) => [field, row[field]])) };
461
- };
462
- const keyedIn = (key, rows) => {
463
- if (key.length === 1) return { [key[0]]: { in: rows.map((row) => row[key[0]]) } };
464
- return { OR: rows.map((row) => Object.fromEntries(key.map((field) => [field, row[field]]))) };
465
- };
466
- const scopeConditions = config.scope ? Object.entries(config.scope).map(([key, value]) => ({ key, operation: "=", value })) : [];
467
- for (const condition of scopeConditions) {
468
- if (!resolveField(meta, condition.key)) {
469
- throw new core.QueryKitError({ source: meta.name, site: "filter", key: condition.key, reason: "unknown-key" });
470
- }
471
- }
472
- const scopeWhere = scopeConditions.length ? buildWhere(meta, scopeConditions) : void 0;
473
- const composeWhere = (userFilter, withDeleted) => andWhere([buildWhere(meta, userFilter, diag), scopeWhere, meta.hasDeletedAt && !withDeleted ? { deletedAt: null } : void 0]);
474
- const withId = (filter, idKey, id) => {
475
- if (!resolveField(meta, idKey)) {
476
- throw new core.QueryKitError({ source: meta.name, site: "filter", key: idKey, reason: "unknown-key" });
477
- }
478
- const idCondition = { key: idKey, operation: "=", value: id };
479
- if (!filter) return [idCondition];
480
- if (Array.isArray(filter)) return [...filter, idCondition];
481
- return { and: [filter, idCondition] };
482
- };
483
- const forcedKeys = config.forcedColumns ? truthyKeys(config.forcedColumns) : void 0;
484
- if (config.forcedColumns && forcedKeys.length === 0) {
485
- throw new Error("buildRepository: forcedColumns must select at least one field (an empty selection would return the full row).");
486
- }
487
- const allowed = config.allowedColumns ? new Set(config.allowedColumns) : void 0;
488
- if (config.allowedColumns && allowed.size === 0) {
489
- throw new Error("buildRepository: allowedColumns must list at least one field (an empty allowlist would return the full row).");
490
- }
491
- const guard = { forcedKeys, allowed };
492
- const guarded = Boolean(forcedKeys ?? allowed);
493
- const permits = (key) => forcedKeys ? forcedKeys.includes(key) : allowed ? allowed.has(key) : true;
494
- const projection = (columns, withRelations, forceKeys) => buildProjection(meta, guard, columns, withRelations, forceKeys);
495
- const forInsert = (values) => ({
496
- ...config.scope,
497
- ...values,
498
- ...config.scope
499
- });
500
- const forUpdate = (patch) => {
501
- const stamped = { ...patch };
502
- if (meta.stampUpdatedAt) stamped[meta.stampUpdatedAt] = /* @__PURE__ */ new Date();
503
- return stamped;
504
- };
505
- const countWhere = (where) => delegate().count({ where });
506
- const upsertWhere = (targets, values) => {
507
- const fields = targets.map((key) => {
508
- const field = resolveField(meta, key);
509
- if (!field) throw new Error(`upsert: unknown target field "${key}".`);
510
- return field;
511
- });
512
- if (fields.length === 1) return { [fields[0]]: values[fields[0]] };
513
- return { [fields.join("_")]: Object.fromEntries(fields.map((field) => [field, values[field]])) };
514
- };
515
- const defaultConflictSet = (values, targetKeys) => {
516
- const skip = /* @__PURE__ */ new Set([...targetKeys, "createdAt"]);
517
- const set = {};
518
- for (const [key, value] of Object.entries(values)) {
519
- if (!skip.has(key)) set[key] = value;
520
- }
521
- return forUpdate(set);
522
- };
523
- const repository = {
524
- get delegate() {
525
- return delegate();
526
- },
527
- async findAll(params = {}) {
528
- const rows = await delegate().findMany({
529
- where: composeWhere(params.filter, params.withDeleted),
530
- orderBy: buildOrderBy(meta, params.sort, diag),
531
- ...projection(params.columns, params.with)
532
- });
533
- return rows;
534
- },
535
- async findOne(params = {}) {
536
- const row = await delegate().findFirst({
537
- where: composeWhere(params.filter, params.withDeleted),
538
- orderBy: buildOrderBy(meta, params.sort, diag),
539
- ...projection(params.columns, params.with)
540
- });
541
- return row ?? void 0;
542
- },
543
- async findById(id, params = {}) {
544
- const { idKey = "id", filter } = params;
545
- const row = await delegate().findFirst({
546
- where: composeWhere(withId(filter, idKey, id), params.withDeleted),
547
- ...projection(params.columns, params.with)
548
- });
549
- return row ?? void 0;
550
- },
551
- async findList(params = {}) {
552
- const page = Math.max(1, Math.trunc(params.page ?? 1));
553
- const perPage = clampPageSize(params.perPage, runtime.defaultPerPage, runtime.maxPerPage);
554
- const where = composeWhere(params.filter, params.withDeleted);
555
- const [data, total_items] = await Promise.all([
556
- delegate().findMany({
557
- where,
558
- orderBy: buildOrderBy(meta, params.sort, diag),
559
- take: perPage,
560
- skip: (page - 1) * perPage,
561
- ...projection(params.columns, params.with)
562
- }),
563
- countWhere(where)
564
- ]);
565
- const total_pages = Math.ceil(total_items / perPage);
566
- return {
567
- data,
568
- meta: {
569
- total_items,
570
- total_pages,
571
- current_page: page,
572
- per_page: perPage,
573
- has_next: page < total_pages,
574
- has_prev: page > 1
575
- }
576
- };
577
- },
578
- async findInfinite(params = {}) {
579
- const limit = clampPageSize(params.limit, runtime.defaultLimit, runtime.maxLimit);
580
- const offset = Math.max(0, Math.trunc(params.offset ?? 0));
581
- const rows = await delegate().findMany({
582
- where: composeWhere(params.filter, params.withDeleted),
583
- orderBy: buildOrderBy(meta, params.sort, diag),
584
- take: limit + 1,
585
- skip: offset,
586
- ...projection(params.columns, params.with)
587
- });
588
- const has_more = rows.length > limit;
589
- const data = has_more ? rows.slice(0, limit) : rows;
590
- return {
591
- data,
592
- meta: { limit, offset, count: data.length, has_more, next_offset: has_more ? offset + limit : null }
593
- };
594
- },
595
- async findCursor(params = {}) {
596
- const limit = clampPageSize(params.limit, runtime.defaultLimit, runtime.maxLimit);
597
- const cursorKey = params.cursorKey ?? "id";
598
- const order = params.order ?? "asc";
599
- const direction = params.direction ?? "forward";
600
- const field = resolveField(meta, cursorKey);
601
- if (!field) throw new core.QueryKitError({ source: diag.source, site: "cursorKey", key: cursorKey, reason: "unknown-key" });
602
- const decoded = decodeCursor(params.cursor);
603
- const cursorValue = decoded === void 0 ? void 0 : castValue(meta, field, decoded);
604
- const baseWhere = composeWhere(params.filter, params.withDeleted);
605
- const ascInQuery = direction === "forward" ? order === "asc" : order === "desc";
606
- const seek = cursorValue !== void 0 ? { [field]: ascInQuery ? { gt: cursorValue } : { lt: cursorValue } } : void 0;
607
- const where = andWhere([baseWhere, seek]);
608
- const selected = pickColumns(guard, params.columns);
609
- const leaksCursorField = guarded && selected !== void 0 && !permits(cursorKey) && !permits(field);
610
- const rows = await delegate().findMany({
611
- where,
612
- orderBy: [{ [field]: ascInQuery ? "asc" : "desc" }],
613
- take: limit + 1,
614
- ...projection(params.columns, params.with, [field])
615
- });
616
- const hasExtra = rows.length > limit;
617
- let page = hasExtra ? rows.slice(0, limit) : rows;
618
- if (direction === "backward") page = [...page].reverse();
619
- const first = page[0];
620
- const last = page[page.length - 1];
621
- const has_next = direction === "forward" ? hasExtra : cursorValue !== void 0;
622
- const has_prev = direction === "forward" ? cursorValue !== void 0 : hasExtra;
623
- const meta_ = {
624
- limit,
625
- has_next,
626
- has_prev,
627
- next_cursor: has_next && last ? encodeCursor(last[field]) : null,
628
- prev_cursor: has_prev && first ? encodeCursor(first[field]) : null
629
- };
630
- if (leaksCursorField) {
631
- page = page.map((row) => {
632
- const { [field]: _cursor, ...rest } = row;
633
- return rest;
634
- });
635
- }
636
- return { data: page, meta: meta_ };
637
- },
638
- count(filter) {
639
- return countWhere(composeWhere(filter));
640
- },
641
- async exists(filter) {
642
- return await countWhere(composeWhere(filter)) > 0;
643
- },
644
- /* ------------------------------- writes ------------------------------- */
645
- async create(values) {
646
- const row = await delegate().create({ data: forInsert(values) });
647
- return row;
648
- },
649
- async createMany(values) {
650
- if (values.length === 0) return [];
651
- const data = values.map((v) => forInsert(v));
652
- const d = delegate();
653
- if (typeof d.createManyAndReturn === "function") {
654
- return await d.createManyAndReturn({ data });
655
- }
656
- const out = [];
657
- for (const item of data) out.push(await d.create({ data: item }));
658
- return out;
659
- },
660
- async upsert(values, options) {
661
- const targetKeys = toArray(options.target);
662
- const inserted = forInsert(values);
663
- const update = options.set ? forUpdate(options.set) : defaultConflictSet(inserted, targetKeys);
664
- const row = await delegate().upsert({
665
- where: upsertWhere(targetKeys, inserted),
666
- create: inserted,
667
- update
668
- });
669
- return row;
670
- },
671
- async upsertMany(values, options) {
672
- if (values.length === 0) return [];
673
- const targetKeys = toArray(options.target);
674
- const out = [];
675
- for (let i = 0; i < values.length; i += CHUNK_SIZE) {
676
- for (const value of values.slice(i, i + CHUNK_SIZE)) {
677
- const inserted = forInsert(value);
678
- const update = options.set ? forUpdate(options.set) : defaultConflictSet(inserted, targetKeys);
679
- out.push(
680
- await delegate().upsert({
681
- where: upsertWhere(targetKeys, inserted),
682
- create: inserted,
683
- update
684
- })
685
- );
686
- }
687
- }
688
- return out;
689
- },
690
- async updateById(id, patch, idKey = "id") {
691
- return updateOne(composeWhere(withId(void 0, idKey, id)), forUpdate(patch), "updateById");
692
- },
693
- async updateWhere(filter, patch) {
694
- const key = requirePrimaryKey("updateWhere");
695
- const where = composeWhere(filter);
696
- const d = delegate();
697
- const found = await d.findMany({ where, select: keySelect(key) });
698
- if (found.length === 0) return [];
699
- const keyed = keyedIn(key, found);
700
- await d.updateMany({ where: keyed, data: forUpdate(patch) });
701
- return await d.findMany({ where: keyed });
702
- },
703
- async deleteById(id, idKey = "id") {
704
- const key = requirePrimaryKey("deleteById");
705
- const d = delegate();
706
- const target = await d.findFirst({ where: composeWhere(withId(void 0, idKey, id)) });
707
- if (!target) return void 0;
708
- return await d.delete({ where: uniqueWhere(key, target) });
709
- },
710
- async deleteWhere(filter) {
711
- const key = requirePrimaryKey("deleteWhere");
712
- const d = delegate();
713
- const where = composeWhere(filter);
714
- const rows = await d.findMany({ where });
715
- if (rows.length === 0) return [];
716
- await d.deleteMany({ where: keyedIn(key, rows) });
717
- return rows;
718
- },
719
- async softDelete(id, idKey = "id") {
720
- if (!meta.hasDeletedAt) throw new Error("softDelete: model has no deletedAt field.");
721
- return updateOne(composeWhere(withId(void 0, idKey, id), false), forUpdate({ deletedAt: /* @__PURE__ */ new Date() }), "softDelete");
722
- },
723
- async restore(id, idKey = "id") {
724
- if (!meta.hasDeletedAt) throw new Error("restore: model has no deletedAt field.");
725
- return updateOne(composeWhere(withId(void 0, idKey, id), true), forUpdate({ deletedAt: null }), "restore");
726
- },
727
- async aggregate(spec) {
728
- const aggregable = (key) => {
729
- const field = permits(key) ? resolveField(meta, key) : void 0;
730
- if (!field) reportSkip(diag, { site: "aggregate", key, reason: "unknown-key" });
731
- return field;
732
- };
733
- const groupFields = toArray(spec.groupBy).map(aggregable).filter((field) => Boolean(field));
734
- const selectionFor = (keys) => {
735
- const picked = {};
736
- for (const key of keys) {
737
- const field = aggregable(key);
738
- if (field) picked[field] = true;
739
- }
740
- return Object.keys(picked).length ? picked : void 0;
741
- };
742
- const sum = selectionFor(toArray(spec.sum));
743
- const avg = selectionFor(toArray(spec.avg));
744
- const min = selectionFor(toArray(spec.min));
745
- const max = selectionFor(toArray(spec.max));
746
- const args = { where: composeWhere(spec.filter, spec.withDeleted) };
747
- if (spec.count) args._count = true;
748
- if (sum) args._sum = sum;
749
- if (avg) args._avg = avg;
750
- if (min) args._min = min;
751
- if (max) args._max = max;
752
- const flatten = (row) => {
753
- const out = {};
754
- for (const [key, value] of Object.entries(row)) {
755
- if (!key.startsWith("_")) {
756
- out[key] = value;
757
- continue;
758
- }
759
- if (key === "_count") {
760
- if (typeof value === "number") out.count = value;
761
- continue;
762
- }
763
- const prefix = key.slice(1);
764
- for (const [field, aggregated] of Object.entries(value ?? {})) {
765
- if (aggregated !== void 0) out[`${prefix}_${field}`] = aggregated;
766
- }
767
- }
768
- return out;
769
- };
770
- if (groupFields.length > 0) {
771
- const rows = await delegate().groupBy({ ...args, by: groupFields });
772
- return rows.map(flatten);
773
- }
774
- return [flatten(await delegate().aggregate(args))];
775
- },
776
- scoped(scope) {
777
- return buildRepository(runtime, modelKey, { ...config, scope: { ...config.scope, ...scope } });
778
- }
779
- };
780
- async function updateOne(where, data, method) {
781
- const key = requirePrimaryKey(method);
782
- const d = delegate();
783
- const target = await d.findFirst({ where, select: keySelect(key) });
784
- if (!target) return void 0;
785
- return await d.update({ where: uniqueWhere(key, target), data });
786
- }
787
- return repository;
788
- }
789
- function createContextStore() {
790
- const als = new async_hooks.AsyncLocalStorage();
791
- return {
792
- get: () => als.getStore(),
793
- run: (patch, fn) => als.run({ ...als.getStore(), ...patch }, fn)
794
- };
795
- }
796
-
797
- // src/registry.ts
798
- function resolveModelKey(client, model) {
799
- if (typeof model === "string") return model;
800
- const keys = delegateKeys(client);
801
- const found = keys.find((key) => client[key] === model);
802
- if (!found) {
803
- throw new Error(
804
- `createRegistry: the given delegate does not belong to this Prisma client. Pass a model from the same client you passed to createRegistry (available: ${keys.join(", ") || "(none)"}), or use its name, e.g. repository("user").`
805
- );
806
- }
807
- return found;
808
- }
809
- function createRegistry(prisma, options = {}) {
810
- const ctx = createContextStore();
811
- const runtime = {
812
- baseClient: prisma,
813
- getExecutor: () => ctx.get()?.executor ?? prisma,
814
- defaultPerPage: options.defaultPerPage ?? core.DEFAULT_PER_PAGE,
815
- defaultLimit: options.defaultLimit ?? core.DEFAULT_LIMIT,
816
- maxPerPage: options.maxPerPage ?? core.DEFAULT_MAX_PER_PAGE,
817
- maxLimit: options.maxLimit ?? core.DEFAULT_MAX_LIMIT,
818
- strict: options.strict ?? false,
819
- onSkippedCondition: options.onSkippedCondition
820
- };
821
- function repository(model, arg2, arg3) {
822
- const repoOptions = typeof arg2 === "function" ? void 0 : arg2;
823
- const extend = typeof arg2 === "function" ? arg2 : arg3;
824
- const base = buildRepository(runtime, resolveModelKey(prisma, model), repoOptions);
825
- return extend ? { ...base, ...extend(base) } : base;
826
- }
827
- const transaction = (fn) => {
828
- if (ctx.get()?.executor) return fn();
829
- return prisma.$transaction((tx) => ctx.run({ executor: tx }, fn));
830
- };
831
- return { client: prisma, repository, transaction };
832
- }
833
- function createFilters() {
834
- return core.createFilters();
835
- }
836
-
837
- Object.defineProperty(exports, "f", {
838
- enumerable: true,
839
- get: function () { return core.f; }
840
- });
841
- exports.buildRepository = buildRepository;
842
- exports.createFilters = createFilters;
843
- exports.createRegistry = createRegistry;
844
- //# sourceMappingURL=index.cjs.map
1
+ 'use strict';var core=require('@querykitjs/core'),internal=require('@querykitjs/core/internal');function H(e){if(typeof e!="object"||e===null)return false;let t=e;return typeof t.findMany=="function"&&typeof t.findFirst=="function"&&typeof t.count=="function"}function U(e){return Object.keys(e).filter(t=>!t.startsWith("$")&&!t.startsWith("_")&&t!=="constructor"&&H(e[t]))}var Me=e=>e&&e[0].toLowerCase()+e.slice(1),Pe=new Set(["scalar","enum","object","unsupported"]),Oe=e=>typeof e=="string"&&Pe.has(e)?e:"scalar";function We(e,t){let n=e._runtimeDataModel,r=n?.models;if(!r||typeof r!="object")return;let i=Object.keys(r).find(a=>Me(a)===t);if(!i)return;let o=r[i]?.fields;if(!Array.isArray(o))return;let s=[];for(let a of o)typeof a?.name=="string"&&s.push({name:a.name,type:typeof a.type=="string"?a.type:"",kind:Oe(a.kind),isId:a.isId===true,isUpdatedAt:a.isUpdatedAt===true,isList:a.isList===true,...typeof a.dbName=="string"&&a.dbName?{dbName:a.dbName}:{},...Ne(n?.enums,a),...typeof a.isRequired=="boolean"?{isRequired:a.isRequired}:{},...Se(a.nativeType)});return s.length?{name:i,fields:s,primaryKey:r[i]?.primaryKey??null}:void 0}function Ce(e,t){let n=e?.fields;if(!n||typeof n!="object")return;let r=[],i;for(let o of Object.values(n)){let s=o;typeof s.name=="string"&&(typeof s.modelName=="string"&&(i??=s.modelName),r.push({name:s.name,type:typeof s.typeName=="string"?s.typeName:"",kind:s.isEnum===true?"enum":"scalar",isId:s.name==="id",isUpdatedAt:false,isList:s.isList===true}));}return r.length?{name:i??t,fields:r}:void 0}function Z(e,t,n){let r=e[t];if(!H(r)){let g=U(e);throw new Error(`createRegistry: "${t}" is not a model delegate on this Prisma client. Available models: ${g.join(", ")||"(none)"}. Note the key is camelCase \u2014 model "LegalEntity" is "legalEntity".`)}let i=We(e,t)??Ce(r,t),o=n?.length?{name:i?.name??t,fields:Ie(i?.fields??[],n)}:i;if(!o)throw new Error(`createRegistry: could not read field metadata for model "${t}". This adapter reads it from the Prisma client at runtime (\`_runtimeDataModel\`, then \`delegate.fields\`); both were unavailable, which usually means an unsupported @prisma/client version (^6.19 or ^7.10 expected). Pass \`fields\` in the repository options to supply it explicitly.`);let s=new Map,a=new Map;for(let g of o.fields)s.set(g.name,g),g.dbName&&g.dbName!==g.name&&a.set(g.dbName,g.name);for(let g of s.keys())a.delete(g);let p=s.get("id")?.name??[...s.values()].find(g=>g.isId)?.name,f=s.get("updatedAt"),h=o.primaryKey,d=Array.isArray(h?.fields)?h.fields.filter(g=>typeof g=="string"):[],c=p?[p]:d.filter(g=>s.has(g)),R=p?void 0:(typeof h?.name=="string"&&h.name?h.name:c.join("_"))||void 0;return {name:o.name,fields:s,byDbName:a,primaryKey:c,primaryKeyName:R,idField:p,hasDeletedAt:s.has("deletedAt"),stampUpdatedAt:f&&!f.isUpdatedAt?f.name:void 0,hasCreatedAt:s.has("createdAt")}}function x(e,t){return t==="id"?e.fields.has("id")?"id":e.idField:e.fields.has(t)?t:e.byDbName.get(t)}function J(e,t){return e.fields.get(t)}function Ee(e,t){return e.fields.get(t)?.type==="DateTime"}function Y(e,t){return e.fields.get(t)?.type==="String"}function ee(e,t,n){if(!Ee(e,t)||n==null||n instanceof Date||typeof n!="string"&&typeof n!="number")return n;let r=new Date(n);return Number.isNaN(r.getTime())?n:r}function Ne(e,t){if(t.kind!=="enum"||typeof t.type!="string")return {};let n=e?.[t.type]?.values?.map(r=>r.name).filter(r=>typeof r=="string");return n&&n.length>0?{enumValues:n}:{}}function Ie(e,t){let n=new Map(t.map(o=>[o.name,o])),r=e.map(o=>({...o,...n.get(o.name)})),i=new Set(e.map(o=>o.name));for(let o of t)i.has(o.name)||r.push({type:"",kind:"scalar",isId:false,isUpdatedAt:false,isList:false,...o});return r}function Se(e){let t=Array.isArray(e)?e[0]:e;return typeof t=="string"&&t?{nativeType:t}:{}}function te(e,t,n,r=e.hasCreatedAt?"createdAt":void 0){let i=[];for(let{key:o,direction:s}of internal.normalizeSort(t,n)){let a=x(e,o);a?i.push({[a]:e.fields.get(a)?.isRequired===false?{sort:s,nulls:s==="asc"?"first":"last"}:s}):internal.reportSkip(n,{site:"sort",key:o,reason:"unknown-key"});}return i.length>0?i:r?[{[r]:"desc"}]:e.idField?[{[e.idField]:"desc"}]:[]}function V(e){return Object.entries(e).filter(([,t])=>t).map(([t])=>t)}function q(e,t){if(e.forcedKeys)return e.forcedKeys;let n=t?V(t):[];if(!e.allowed)return n.length>0?n:void 0;let r=n.filter(i=>e.allowed.has(i));return r.length>0?r:[...e.allowed]}function ne(e,t,n,r,i=[]){let o={};if(r)for(let[h,d]of Object.entries(r))d&&(o[h]=d);let s=Object.keys(o).length>0,a=q(t,n),p={};if(a)for(let h of [...a,...i]){let d=x(e,h);d&&(p[d]=true);}return Object.keys(p).length>0?s?{select:{...p,...o}}:{select:p}:s?{include:o}:{}}var re=new Set(core.TEXT_FILTER_OPERATORS),T=Symbol("querykit.invalid-value"),oe=e=>re.has(e),_e=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function E(e,t,n){if(n==null)return n;let r=J(e,t)?.type;if(r==="DateTime"){if(n instanceof Date)return Number.isNaN(n.getTime())?T:n;let o=ee(e,t,n);return o instanceof Date?Number.isNaN(o.getTime())?T:o:T}if(r==="Int"||r==="BigInt"){if(typeof n=="number")return Number.isInteger(n)?n:T;if(typeof n=="bigint")return n;if(typeof n=="string"&&n.trim()!==""){let o=Number(n);return Number.isInteger(o)?o:T}return T}if(r==="Float"||r==="Decimal"){if(typeof n=="number")return Number.isFinite(n)?n:T;if(typeof n=="string"&&n.trim()!==""){let o=Number(n);return Number.isFinite(o)?o:T}return T}if(r==="Boolean")return typeof n=="boolean"?n:n==="true"||n==="1"||n===1?true:n==="false"||n==="0"||n===0?false:T;if(e.fields.get(t)?.nativeType==="Uuid")return typeof n=="string"&&_e.test(n)?n:T;let i=e.fields.get(t)?.enumValues;return i?typeof n=="string"&&i.includes(n)?n:T:n}function ie(e,t,n,r){if(r===void 0||re.has(n))return r;if(Array.isArray(r)){let o=[];for(let s of r){let a=E(e,t,s);if(a===T)return T;o.push(a);}return o}let i=E(e,t,r);return i===T?T:i}var Q=e=>typeof e?.buildFor=="function",W=e=>String(e??""),se=e=>Array.isArray(e)&&e.length===2?[e[0],e[1]]:void 0,P=(e,t)=>t.isString?{...e,mode:"insensitive"}:e;function v(e){let t=[];for(let n=0;n<e.length;n++){let r=e[n];if(r==="\\"){let i=e[n+1];if(i===void 0)return;t.push({kind:"lit",char:i}),n++;continue}r==="%"?t.push({kind:"any",char:"%"}):r==="_"?t.push({kind:"one",char:"_"}):t.push({kind:"lit",char:r});}return t}var ae=e=>e.map(t=>t.kind==="lit"&&(t.char==="%"||t.char==="_"||t.char==="\\")?`\\${t.char}`:t.char).join("");function Be(e){let t=v(e);if(!t)return;let n=0,r=t.length,i=false,o=false;for(;n<r&&t[n].kind==="any";)i=true,n++;for(;r>n&&t[r-1].kind==="any";)o=true,r--;let s=t.slice(n,r);if(s.some(f=>f.kind!=="lit"))return;let a=s.map(f=>f.char).join(""),p=i&&o?"contains":i?"endsWith":o?"startsWith":"equals";if(!(p!=="equals"&&/[%_]/.test(a)))return {op:p,value:a}}function Ue(e,t,n){let r=v(e);if(!r)return;let i=s=>n?P(s,t):s,o=ae(r);return {buildFor(s){if(r[r.length-1]?.kind==="any")return {[s]:i({startsWith:o.replace(/%$/,"")})};let a=r.map(p=>p.kind).lastIndexOf("any");if(a>=0){let p=ae(r.slice(a+1));return {AND:[{[s]:i({startsWith:o})},{[s]:i({endsWith:p})}]}}return {AND:[{[s]:i({startsWith:o})},{NOT:{[s]:i({startsWith:`${o}_`})}}]}}}}var $=(e,t,n)=>{let r=W(e);if(v(r)?.some(o=>o.kind==="one"))return;let i=Be(r);if(i){let o={[i.op]:i.value};return n?P(o,t):o}return Ue(r,t,n)},de={"=":e=>({equals:e}),eq:e=>({equals:e}),"!=":e=>({not:e}),ne:e=>({not:e}),">":e=>({gt:e}),gt:e=>({gt:e}),">=":e=>({gte:e}),gte:e=>({gte:e}),"<":e=>({lt:e}),lt:e=>({lt:e}),"<=":e=>({lte:e}),lte:e=>({lte:e}),contains:(e,t)=>P({contains:W(e)},t),"%_%":(e,t)=>P({contains:W(e)},t),startsWith:(e,t)=>P({startsWith:W(e)},t),"%_":(e,t)=>P({startsWith:W(e)},t),endsWith:(e,t)=>P({endsWith:W(e)},t),"_%":(e,t)=>P({endsWith:W(e)},t),like:(e,t)=>$(e,t,false),ilike:(e,t)=>$(e,t,true),notLike:(e,t)=>{let n=$(e,t,false);if(n)return Q(n)?{buildFor:r=>({NOT:n.buildFor(r)})}:{not:n}},in:e=>Array.isArray(e)?{in:e}:void 0,notIn:e=>Array.isArray(e)?{notIn:e}:void 0,between:e=>{let t=se(e);return t?{gte:t[0],lte:t[1]}:void 0},notBetween:e=>{let t=se(e);if(t)return {buildFor:n=>({NOT:{[n]:{gte:t[0],lte:t[1]}}})}},isNull:()=>({equals:null}),isNotNull:()=>({not:null})};var ue=e=>typeof e=="object"&&e!==null,$e=e=>ue(e)&&"key"in e&&!("and"in e)&&!("or"in e)&&!("not"in e);function S(e,t){let n=t.filter(r=>r!==void 0);if(n.length!==0)return n.length===1?n[0]:{[e]:n}}function Qe(e,t,n){let r=t.operation??"=",i=de[r];if(!i)throw new Error(`Unsupported filter operator: "${r}"`);let o=x(e,t.key);if(!o){internal.reportSkip(n,{site:"filter",key:t.key,operation:r,reason:"unknown-key"});return}let s=Y(e,o);if(oe(r)&&!s){internal.reportSkip(n,{site:"filter",key:t.key,operation:r,reason:"invalid-value"});return}let a=ie(e,o,r,t.value);if(a===T){internal.reportSkip(n,{site:"filter",key:t.key,operation:r,reason:"invalid-value"});return}let p=i(a,{isString:s});if(p===void 0){internal.reportSkip(n,{site:"filter",key:t.key,operation:r,reason:"invalid-value"});return}return Q(p)?p.buildFor(o):{[o]:p}}function N(e,t,n){if($e(t))return Qe(e,t,n);if(ue(t)){if("and"in t)return S("AND",t.and.map(r=>N(e,r,n)));if("or"in t)return S("OR",t.or.map(r=>N(e,r,n)));if("not"in t){let r=N(e,t.not,n);return r?{NOT:r}:void 0}if(internal.isRaw(t))return t;throw new core.QueryKitError({source:e.name,site:"filter",key:Object.keys(t)[0]??"",reason:"forbidden-key"})}}function j(e,t,n){if(t!==void 0)return Array.isArray(t)?S("AND",t.map(r=>N(e,r,n))):N(e,t,n)}function K(e){return S("AND",e)}function fe(e,t,n){let r=Z(e.baseClient,t,n.fields),i=()=>e.getExecutor()[t],o={source:r.name,strict:e.strict,onSkipped:e.onSkippedCondition},s=x(r,e.timestamps?.deletedAt??"deletedAt"),a=x(r,e.timestamps?.createdAt??"createdAt"),p=w=>te(r,w,o,a),f=w=>internal.checkWith(w,n.relations,Ye,o.source),h=Ze(r,n),d=et(r,n,e.limits,a),c=(w,b)=>K([w,h,s&&!b?{[s]:null}:void 0]),R=(w,b)=>c(j(r,w,o),b),g=(w,b)=>{if(internal.isAllRows(w))return c(void 0);internal.isEmptyFilter(w)&&internal.refuseEmptyFilter(o.source,b),d.checkFilter(w);let A=j(r,w,o);return A===void 0?internal.refuseEmptyFilter(o.source,b):c(A)},D=(w,b,A)=>{if(!x(r,b))throw new core.QueryKitError({source:r.name,site:"filter",key:b,reason:"unknown-key"});let C={key:b,operation:"=",value:A};return w?Array.isArray(w)?[...w,C]:{and:[w,C]}:[C]},F=Je(n),{forcedKeys:u,allowed:l}=F;return {runtime:e,meta:r,diag:o,delegate:i,guard:F,policy:d,guarded:!!(u??l),permits:w=>u?u.includes(w):l?l.has(w):true,projection:(w,b,A)=>ne(r,F,w,b,A),deletedAtField:s,createdAtField:a,sortBy:p,withOf:f,composeWhere:R,mutationWhere:g,withId:D,countWhere:w=>i().count({where:w})}}var M=e=>e===void 0?[]:Array.isArray(e)?e:[e];function Ze(e,t){let n=internal.scopeConditions(t.scope);for(let r of n)if(!x(e,r.key))throw new core.QueryKitError({source:e.name,site:"filter",key:r.key,reason:"unknown-key"});return n.length?j(e,n):void 0}function Je(e){let t=e.forcedColumns?V(e.forcedColumns):void 0;if(e.forcedColumns&&t.length===0)throw new Error("buildRepository: forcedColumns must select at least one field (an empty selection would return the full row).");let n=e.allowedColumns?new Set(e.allowedColumns):void 0;if(e.allowedColumns&&n.size===0)throw new Error("buildRepository: allowedColumns must list at least one field (an empty allowlist would return the full row).");return {forcedKeys:t,allowed:n}}var Ye={columns:"select",nested:"include",filters:["where"],logical:["AND","OR","NOT"],paging:["take","skip"],orderBy:"orderBy"};function et(e,t,n,r){let i=o=>{let s=o.indexOf(".");return s<0?x(e,o):e.fields.get(o.slice(0,s))?.kind==="object"?o:void 0};return internal.resolvePolicy({source:e.name,fieldOf:i,primaryKey:e.idField??"id",createdAt:r,filterable:t.filterable,sortable:t.sortable,allowedColumns:t.allowedColumns,forcedColumns:t.forcedColumns,limits:{...n,...t.limits}})}function ge(e){let t={};for(let[n,r]of Object.entries(e)){if(!n.startsWith("_")){t[n]=r;continue}if(n==="_count"){typeof r=="number"&&(t.count=r);continue}let i=n.slice(1);for(let[o,s]of Object.entries(r??{}))s!==void 0&&(t[`${i}_${o}`]=s);}return t}function pe(e){let{meta:t,diag:n,delegate:r,permits:i,policy:o,composeWhere:s}=e,a=f=>{let h=i(f)?x(t,f):void 0;return h||internal.reportSkip(n,{site:"aggregate",key:f,reason:"unknown-key"}),h},p=f=>{let h={};for(let d of f){let c=a(d);c&&(h[c]=true);}return Object.keys(h).length?h:void 0};return {async aggregate(f){o.checkFilter(f.filter);for(let F of [f.groupBy,f.sum,f.avg,f.min,f.max].flatMap(u=>M(u)))o.checkAggregateKey(F);let h=M(f.groupBy).map(a).filter(F=>!!F),d=p(M(f.sum)),c=p(M(f.avg)),R=p(M(f.min)),g=p(M(f.max)),D={where:s(f.filter,f.withDeleted)};return f.count&&(D._count=true),d&&(D._sum=d),c&&(D._avg=c),R&&(D._min=R),g&&(D._max=g),h.length>0?(await r().groupBy({...D,by:h})).map(ge):[ge(await r().aggregate(D))]}}}function me(e){let{runtime:t,meta:n,diag:r,delegate:i,guard:o,guarded:s,permits:a,projection:p,policy:f,withOf:h,composeWhere:d}=e;return {async findCursor(c={}){let R=internal.clampPageSize(c.limit,t.defaultLimit,t.maxLimit),g=c.cursorKey??"id";f.checkFilter(c.filter),c.cursorKey!==void 0&&f.checkCursorKey(g);let D=c.order??"asc",F=c.direction??"forward",u=x(n,g);if(!u)throw new core.QueryKitError({source:r.source,site:"cursorKey",key:g,reason:"unknown-key"});let l=n.idField??"id",y=await internal.decodeCursorToken(c.cursor,{source:r.source,secret:t.cursorSecret,key:g}),m=y===void 0?void 0:E(n,u,y.k),k=y===void 0?void 0:E(n,l,y.id);if(m===T||k===T)throw new core.QueryKitError({source:r.source,site:"cursorKey",key:g,reason:"invalid-value"});let w=d(c.filter,c.withDeleted),b=F==="forward"?D==="asc":D==="desc",A=b?"gt":"lt",C=u!==l,xe=y===void 0?void 0:C?{OR:[{[u]:{[A]:m}},{AND:[{[u]:{equals:m}},{[l]:{[A]:k}}]}]}:{[u]:{[A]:m}},Fe=K([w,xe]),_=q(o,c.columns),X=_===void 0?[]:[u,l].filter(O=>s&&(!a(O)||!_.includes(O))||O===l&&O!==u&&!_.includes(O)),be=await i().findMany({where:Fe,orderBy:C?[{[u]:b?"asc":"desc"},{[l]:b?"asc":"desc"}]:[{[u]:b?"asc":"desc"}],take:R+1,...p(c.columns,h(c.with),[u,l])}),B=await internal.cursorPage(be,{limit:R,direction:F,hasCursor:y!==void 0,cursorField:u,idField:l,secret:t.cursorSecret});return X.length>0&&(B.data=B.data.map(O=>Object.fromEntries(Object.entries(O).filter(([Ae])=>!X.includes(Ae))))),B}}}function G(e,t){if(e.primaryKey.length===0)throw new Error(`${t}: model "${e.name}" has no primary key, so a row cannot be addressed individually. Use updateWhere/deleteWhere with an explicit filter instead.`);return e.primaryKey}var we=e=>Object.fromEntries(e.map(t=>[t,true]));function z(e,t,n){return t.length===1?{[t[0]]:n[t[0]]}:{[e.primaryKeyName??t.join("_")]:Object.fromEntries(t.map(r=>[r,n[r]]))}}var ke=1e3;function Re(e,t){let{runtime:n,meta:r,delegate:i,deletedAtField:o,createdAtField:s,composeWhere:a,mutationWhere:p,withId:f}=e,h=u=>internal.clampPageSize(u.limit,n.defaultLimit,n.maxLimit),d=u=>({...internal.scopeDefaults(t.scope),...u,...internal.scopeDefaults(t.scope)}),c=u=>{let l={...u};return r.stampUpdatedAt&&(l[r.stampUpdatedAt]=new Date),l},R=(u,l)=>{let y=u.map(m=>{let k=x(r,m);if(!k)throw new Error(`upsert: unknown target field "${m}".`);return k});return y.length===1?{[y[0]]:l[y[0]]}:{[y.join("_")]:Object.fromEntries(y.map(m=>[m,l[m]]))}},g=(u,l)=>{let y=new Set([...l,s??"createdAt"]),m={};for(let[k,w]of Object.entries(u))y.has(k)||(m[k]=w);return c(m)},D=async(u,l,y)=>{let m=d(u),k=l.set?c(l.set):g(m,y);return await i().upsert({where:R(y,m),create:m,update:k})},F=async(u,l,y)=>{let m=G(r,y),k=i(),w=await k.findFirst({where:u,select:we(m)});if(w)return await k.update({where:z(r,m,w),data:l})};return {async create(u){return await i().create({data:d(u)})},async createMany(u){if(u.length===0)return [];let l=u.map(k=>d(k)),y=i();if(typeof y.createManyAndReturn=="function")return await y.createManyAndReturn({data:l});let m=[];for(let k of l)m.push(await y.create({data:k}));return m},upsert(u,l){return D(u,l,M(l.target))},async upsertMany(u,l){if(u.length===0)return [];let y=M(l.target),m=[];for(let k=0;k<u.length;k+=ke)for(let w of u.slice(k,k+ke))m.push(await D(w,l,y));return m},async updateById(u,l,y="id"){return F(a(f(void 0,y,u)),c(l),"updateById")},async updateWhere(u,l,y={}){let m=p(u,"updateWhere"),k=c(l);if(!y.returning)return {count:(await i().updateMany({where:m,data:k})).count};let w=await i().updateManyAndReturn({where:m,data:k});return {count:w.length,rows:w.slice(0,h(y.returning))}},async deleteById(u,l="id"){let y=G(r,"deleteById"),m=i(),k=await m.findFirst({where:a(f(void 0,l,u))});if(k)return await m.delete({where:z(r,y,k)})},async deleteWhere(u,l={}){let y=p(u,"deleteWhere"),m=l.returning?await i().findMany({where:y,take:h(l.returning)}):void 0,{count:k}=await i().deleteMany({where:y});return m?{count:k,rows:m}:{count:k}},async softDelete(u,l="id"){if(!o)throw new Error("softDelete: model has no deletedAt field.");return F(a(f(void 0,l,u),false),c({[o]:new Date}),"softDelete")},async restore(u,l="id"){if(!o)throw new Error("restore: model has no deletedAt field.");return F(a(f(void 0,l,u),true),c({[o]:null}),"restore")}}}function De(e){let{runtime:t,delegate:n,projection:r,policy:i,sortBy:o,withOf:s,composeWhere:a,withId:p,countWhere:f}=e,h=d=>{i.checkFilter(d.filter),i.checkSort(d.sort);};return {async findAll(d={}){return h(d),await n().findMany({where:a(d.filter,d.withDeleted),orderBy:o(d.sort),...r(d.columns,s(d.with))})},async findOne(d={}){return h(d),await n().findFirst({where:a(d.filter,d.withDeleted),orderBy:o(d.sort),...r(d.columns,s(d.with))})??void 0},async findById(d,c={}){let{idKey:R="id",filter:g}=c;return i.checkFilter(g),await n().findFirst({where:a(p(g,R,d),c.withDeleted),...r(c.columns,s(c.with))})??void 0},async findList(d={}){h(d);let c=internal.clampPage(d.page),R=internal.clampPageSize(d.perPage,t.defaultPerPage,t.maxPerPage);i.checkPage({page:c,perPage:R});let g=a(d.filter,d.withDeleted),D=l=>n().findMany({where:g,orderBy:o(d.sort),take:l,skip:(c-1)*R,...r(d.columns,s(d.with))});if(d.withTotal===false)return internal.offsetPageWithoutTotal(await D(R+1),c,R);let[F,u]=await Promise.all([D(R),f(g)]);return {data:F,meta:internal.offsetMeta(c,R,u)}},async findInfinite(d={}){let c=internal.clampPageSize(d.limit,t.defaultLimit,t.maxLimit),R=internal.clampOffset(d.offset);h(d),i.checkPage({offset:R});let g=await n().findMany({where:a(d.filter,d.withDeleted),orderBy:o(d.sort),take:c+1,skip:R,...r(d.columns,s(d.with))});return internal.infinitePage(g,c,R)},async count(d){return i.checkFilter(d),f(a(d))},async exists(d){return i.checkFilter(d),await f(a(d))>0}}}function L(e,t,n={}){let r=fe(e,t,n);return {get delegate(){return r.delegate()},...De(r),...me(r),...Re(r,n),...pe(r),scoped(o){return L(e,t,{...n,scope:{...n.scope,...o}})}}}function mt(e,t){if(typeof t=="string")return t;let n=U(e),r=n.find(i=>e[i]===t);if(!r)throw new Error(`createRegistry: the given delegate does not belong to this Prisma client. Pass a model from the same client you passed to createRegistry (available: ${n.join(", ")||"(none)"}), or use its name, e.g. repository("user").`);return r}function wt(e,t={}){let n=internal.createContextStore(),r={baseClient:e,getExecutor:()=>n.get()?.executor??e,defaultPerPage:t.defaultPerPage??core.DEFAULT_PER_PAGE,defaultLimit:t.defaultLimit??core.DEFAULT_LIMIT,maxPerPage:t.maxPerPage??core.DEFAULT_MAX_PER_PAGE,maxLimit:t.maxLimit??core.DEFAULT_MAX_LIMIT,strict:t.strict??false,onSkippedCondition:t.onSkippedCondition,limits:t.limits,cursorSecret:t.cursorSecret,timestamps:t.timestamps};function i(s,a,p){let f=typeof a=="function"?void 0:a,h=typeof a=="function"?a:p,d=L(r,mt(e,s),f);return h?{...d,...h(d)}:d}return {client:e,repository:i,transaction:s=>n.get()?.executor?s():e.$transaction(a=>n.run({executor:a},s))}}function Rt(){return core.createFilters()}Object.defineProperty(exports,"f",{enumerable:true,get:function(){return core.f}});exports.buildRepository=L;exports.createFilters=Rt;exports.createRegistry=wt;//# sourceMappingURL=index.cjs.map
845
2
  //# sourceMappingURL=index.cjs.map