crudora 0.2.0 → 0.3.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.
Files changed (52) hide show
  1. package/dist/cli.js +55 -65
  2. package/dist/cli.js.map +1 -1
  3. package/dist/index.cjs +1732 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +438 -0
  6. package/dist/index.d.ts +438 -15
  7. package/dist/index.js +1725 -27
  8. package/dist/index.js.map +1 -1
  9. package/dist/scripts/copy-assets.js +0 -21
  10. package/package.json +5 -4
  11. package/scripts/copy-assets.js +0 -21
  12. package/dist/core/crudora.d.ts +0 -49
  13. package/dist/core/crudora.d.ts.map +0 -1
  14. package/dist/core/crudora.js +0 -370
  15. package/dist/core/crudora.js.map +0 -1
  16. package/dist/core/crudoraServer.d.ts +0 -84
  17. package/dist/core/crudoraServer.d.ts.map +0 -1
  18. package/dist/core/crudoraServer.js +0 -202
  19. package/dist/core/crudoraServer.js.map +0 -1
  20. package/dist/core/drizzleTableBuilder.d.ts +0 -6
  21. package/dist/core/drizzleTableBuilder.d.ts.map +0 -1
  22. package/dist/core/drizzleTableBuilder.js +0 -175
  23. package/dist/core/drizzleTableBuilder.js.map +0 -1
  24. package/dist/core/model.d.ts +0 -58
  25. package/dist/core/model.d.ts.map +0 -1
  26. package/dist/core/model.js +0 -64
  27. package/dist/core/model.js.map +0 -1
  28. package/dist/core/repository.d.ts +0 -106
  29. package/dist/core/repository.d.ts.map +0 -1
  30. package/dist/core/repository.js +0 -607
  31. package/dist/core/repository.js.map +0 -1
  32. package/dist/core/schemaGenerator.d.ts +0 -6
  33. package/dist/core/schemaGenerator.d.ts.map +0 -1
  34. package/dist/core/schemaGenerator.js +0 -248
  35. package/dist/core/schemaGenerator.js.map +0 -1
  36. package/dist/decorators/model.d.ts +0 -64
  37. package/dist/decorators/model.d.ts.map +0 -1
  38. package/dist/decorators/model.js +0 -138
  39. package/dist/decorators/model.js.map +0 -1
  40. package/dist/index.d.ts.map +0 -1
  41. package/dist/types/logger.type.d.ts +0 -7
  42. package/dist/types/logger.type.d.ts.map +0 -1
  43. package/dist/types/logger.type.js +0 -3
  44. package/dist/types/logger.type.js.map +0 -1
  45. package/dist/types/model.type.d.ts +0 -38
  46. package/dist/types/model.type.d.ts.map +0 -1
  47. package/dist/types/model.type.js +0 -3
  48. package/dist/types/model.type.js.map +0 -1
  49. package/dist/utils/validation.d.ts +0 -7
  50. package/dist/utils/validation.d.ts.map +0 -1
  51. package/dist/utils/validation.js +0 -107
  52. package/dist/utils/validation.js.map +0 -1
@@ -1,607 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Repository = exports.NotFoundError = void 0;
4
- const drizzle_orm_1 = require("drizzle-orm");
5
- const crypto_1 = require("crypto");
6
- const model_1 = require("../decorators/model");
7
- // ─── Constants ────────────────────────────────────────────────────────────────
8
- /** Fields managed by the ORM — never writable via user input. */
9
- const SYSTEM_FIELDS = ['createdAt', 'updatedAt', 'deletedAt'];
10
- /** Maximum number of values allowed in a single _in filter. */
11
- const MAX_IN_VALUES = 500;
12
- /** Maximum character length for a _like search term. */
13
- const MAX_LIKE_LENGTH = 200;
14
- /** Maximum number of relations that can be loaded in a single query. */
15
- const MAX_RELATIONS = 5;
16
- /** Maximum rows per INSERT batch in createMany. */
17
- const INSERT_BATCH_SIZE = 500;
18
- /** Validates a where-clause key: column name with optional operator suffix. */
19
- const SAFE_KEY_RE = /^[a-zA-Z_][a-zA-Z0-9_]*(_gt|_gte|_lt|_lte|_ne|_like|_in)?$/;
20
- // ─── Advanced filter operators ────────────────────────────────────────────────
21
- const OPERATOR_MAP = {
22
- _gt: (col, val) => (0, drizzle_orm_1.gt)(col, val),
23
- _gte: (col, val) => (0, drizzle_orm_1.gte)(col, val),
24
- _lt: (col, val) => (0, drizzle_orm_1.lt)(col, val),
25
- _lte: (col, val) => (0, drizzle_orm_1.lte)(col, val),
26
- _ne: (col, val) => (0, drizzle_orm_1.ne)(col, val),
27
- _like: (col, val) => (0, drizzle_orm_1.like)(col, `%${String(val).slice(0, MAX_LIKE_LENGTH)}%`),
28
- // _in splits on literal commas. Values that contain commas must be URL-encoded (%2C)
29
- // before reaching this layer. This is safe for UUID/integer FK values which never contain commas.
30
- _in: (col, val) => (0, drizzle_orm_1.inArray)(col, String(val).split(',').filter((v) => v !== '').slice(0, MAX_IN_VALUES)),
31
- };
32
- // ─── Cursor helpers ───────────────────────────────────────────────────────────
33
- function encodeCursor(cursorField, cursorValue, pk, pkValue) {
34
- return Buffer.from(JSON.stringify({ [cursorField]: cursorValue, [pk]: pkValue })).toString('base64');
35
- }
36
- function decodeCursor(cursor) {
37
- try {
38
- return JSON.parse(Buffer.from(cursor, 'base64').toString('utf-8'));
39
- }
40
- catch {
41
- return {};
42
- }
43
- }
44
- // ─── Errors ───────────────────────────────────────────────────────────────────
45
- class NotFoundError extends Error {
46
- constructor(message) {
47
- super(message);
48
- this.code = 'NOT_FOUND';
49
- this.name = 'NotFoundError';
50
- }
51
- }
52
- exports.NotFoundError = NotFoundError;
53
- // ─── Repository ───────────────────────────────────────────────────────────────
54
- class Repository {
55
- constructor(modelClass, db, table,
56
- /** Shared registry — same Map instance as Crudora holds; populated lazily. */
57
- registry) {
58
- this.modelClass = modelClass;
59
- this.db = db;
60
- this.table = table;
61
- this.registry = registry;
62
- }
63
- // ─── Internal helpers ───────────────────────────────────────────────────────
64
- /**
65
- * Builds the Drizzle select-column object, merging hidden-field exclusion with
66
- * an optional explicit field list. Returns `undefined` to select all columns.
67
- */
68
- buildSelectCols(selectFields, includeHidden = false) {
69
- const hidden = [
70
- ...(includeHidden ? [] : (this.modelClass.hidden ?? [])),
71
- // deletedAt is an internal implementation detail — never expose it by default
72
- ...(this.modelClass.softDelete ? ['deletedAt'] : []),
73
- ];
74
- if (!hidden.length && !selectFields?.length)
75
- return undefined;
76
- const all = (0, drizzle_orm_1.getTableColumns)(this.table);
77
- let entries = Object.entries(all).filter(([col]) => !hidden.includes(col));
78
- if (selectFields?.length) {
79
- entries = entries.filter(([col]) => selectFields.includes(col));
80
- }
81
- return Object.fromEntries(entries);
82
- }
83
- buildWhere(where) {
84
- if (!where)
85
- return undefined;
86
- const cols = this.table;
87
- const conds = [];
88
- for (const [key, val] of Object.entries(where)) {
89
- // Prototype-pollution guard + key whitelist
90
- if (!Object.prototype.hasOwnProperty.call(where, key))
91
- continue;
92
- if (!SAFE_KEY_RE.test(key))
93
- continue;
94
- if (val === undefined || val === '')
95
- continue;
96
- const suffix = Object.keys(OPERATOR_MAP).find((op) => key.endsWith(op));
97
- if (suffix) {
98
- const colName = key.slice(0, -suffix.length);
99
- if (Object.prototype.hasOwnProperty.call(cols, colName)) {
100
- conds.push(OPERATOR_MAP[suffix](cols[colName], val));
101
- }
102
- }
103
- else {
104
- if (Object.prototype.hasOwnProperty.call(cols, key)) {
105
- conds.push((0, drizzle_orm_1.eq)(cols[key], val));
106
- }
107
- }
108
- }
109
- if (conds.length === 0)
110
- return undefined;
111
- return conds.length === 1 ? conds[0] : (0, drizzle_orm_1.and)(...conds);
112
- }
113
- softDeleteClause() {
114
- if (!this.modelClass.softDelete)
115
- return undefined;
116
- const cols = this.table;
117
- if (!cols.deletedAt) {
118
- throw new Error(`Model "${this.modelClass.name}" has softDelete enabled but the table is missing a "deletedAt" column.`);
119
- }
120
- return (0, drizzle_orm_1.isNull)(cols.deletedAt);
121
- }
122
- combineWhere(...clauses) {
123
- const active = clauses.filter(Boolean);
124
- if (active.length === 0)
125
- return undefined;
126
- if (active.length === 1)
127
- return active[0];
128
- return (0, drizzle_orm_1.and)(...active);
129
- }
130
- // ─── Relation loading ───────────────────────────────────────────────────────
131
- /**
132
- * Batch-loads relations for a list of records. Uses the _in operator so the
133
- * total number of DB round-trips equals the number of requested relations.
134
- */
135
- async loadRelations(items, withRelations) {
136
- if (!this.registry || !items.length || !withRelations.length)
137
- return items;
138
- const relDefs = (0, model_1.getRelationMetadata)(this.modelClass);
139
- let result = [...items];
140
- for (const relName of withRelations.slice(0, MAX_RELATIONS)) {
141
- const relDef = relDefs[relName];
142
- if (!relDef)
143
- continue;
144
- const RelModel = relDef.model();
145
- const relRepo = this.registry.get(RelModel.name);
146
- if (!relRepo)
147
- continue;
148
- const pk = this.modelClass.getPrimaryKey();
149
- if (relDef.type === 'hasMany' || relDef.type === 'hasOne') {
150
- const localKey = relDef.relatedKey ?? pk;
151
- const localVals = [...new Set(result.map((r) => r[localKey]).filter(Boolean))];
152
- if (!localVals.length) {
153
- result = result.map((r) => ({ ...r, [relName]: relDef.type === 'hasOne' ? null : [] }));
154
- continue;
155
- }
156
- const related = await relRepo.findAll({
157
- where: { [`${relDef.foreignKey}_in`]: localVals.join(',') },
158
- });
159
- result = result.map((r) => {
160
- const matches = related.filter((rel) => rel[relDef.foreignKey] === r[localKey]);
161
- return { ...r, [relName]: relDef.type === 'hasOne' ? (matches[0] ?? null) : matches };
162
- });
163
- }
164
- else if (relDef.type === 'belongsTo') {
165
- const ownerKey = relDef.relatedKey ?? RelModel.getPrimaryKey();
166
- const fkVals = [...new Set(result.map((r) => r[relDef.foreignKey]).filter(Boolean))];
167
- if (!fkVals.length) {
168
- result = result.map((r) => ({ ...r, [relName]: null }));
169
- continue;
170
- }
171
- const related = await relRepo.findAll({
172
- where: { [`${ownerKey}_in`]: fkVals.join(',') },
173
- });
174
- result = result.map((r) => {
175
- const match = related.find((rel) => rel[ownerKey] === r[relDef.foreignKey]);
176
- return { ...r, [relName]: match ?? null };
177
- });
178
- }
179
- else if (relDef.type === 'belongsToMany') {
180
- const localKey = relDef.relatedKey ?? pk;
181
- const localVals = [...new Set(result.map((r) => r[localKey]).filter(Boolean))];
182
- if (!localVals.length) {
183
- result = result.map((r) => ({ ...r, [relName]: [] }));
184
- continue;
185
- }
186
- const PivotModel = relDef.pivotModel();
187
- const pivotRepo = this.registry.get(PivotModel.name);
188
- if (!pivotRepo)
189
- continue;
190
- const pivotRows = await pivotRepo.findAll({
191
- where: { [`${relDef.foreignKey}_in`]: localVals.join(',') },
192
- });
193
- const relatedIds = [
194
- ...new Set(pivotRows.map((p) => p[relDef.pivotRelatedKey]).filter(Boolean)),
195
- ];
196
- if (!relatedIds.length) {
197
- result = result.map((r) => ({ ...r, [relName]: [] }));
198
- continue;
199
- }
200
- const relatedPk = RelModel.getPrimaryKey();
201
- const relatedRows = await relRepo.findAll({
202
- where: { [`${relatedPk}_in`]: relatedIds.join(',') },
203
- });
204
- result = result.map((r) => {
205
- const myPivots = pivotRows.filter((p) => p[relDef.foreignKey] === r[localKey]);
206
- const myIds = new Set(myPivots.map((p) => p[relDef.pivotRelatedKey]));
207
- return { ...r, [relName]: relatedRows.filter((rel) => myIds.has(rel[relatedPk])) };
208
- });
209
- }
210
- }
211
- return result;
212
- }
213
- // ─── Public API ─────────────────────────────────────────────────────────────
214
- async create(data) {
215
- let processed = { ...data };
216
- // Strip system-managed fields — never allow user to set these
217
- for (const f of SYSTEM_FIELDS)
218
- delete processed[f];
219
- if (this.modelClass.beforeCreate) {
220
- processed = await this.modelClass.beforeCreate(processed);
221
- }
222
- const pkField = this.modelClass.getPrimaryKey();
223
- if (!processed[pkField]) {
224
- processed[pkField] = (0, crypto_1.randomUUID)();
225
- }
226
- // Strip again after hook — prevents hook from re-injecting system fields
227
- for (const f of SYSTEM_FIELDS)
228
- delete processed[f];
229
- await this.db.insert(this.table).values(processed);
230
- const result = await this.findById(processed[pkField]);
231
- if (!result)
232
- throw new Error(`Create failed: could not retrieve record after insert (id: ${processed[pkField]})`);
233
- let final = result;
234
- if (this.modelClass.afterCreate) {
235
- final = await this.modelClass.afterCreate(processed, result);
236
- }
237
- return final;
238
- }
239
- async findById(id, opts) {
240
- const pk = this.modelClass.getPrimaryKey();
241
- const selectCols = this.buildSelectCols(opts?.select, opts?.includeHidden);
242
- // Note: only the `where` key of the beforeFind return value is respected here.
243
- // Properties like `skip`, `take`, and `orderBy` are ignored — they are only
244
- // meaningful in findAll(). Use afterFind to transform the result instead.
245
- let hookOptions = { where: { [pk]: id } };
246
- if (this.modelClass.beforeFind) {
247
- hookOptions = await this.modelClass.beforeFind(hookOptions);
248
- }
249
- const extraWhere = this.buildWhere(hookOptions?.where ? { ...hookOptions.where, [pk]: undefined } : undefined);
250
- let query = selectCols
251
- ? this.db.select(selectCols).from(this.table)
252
- : this.db.select().from(this.table);
253
- const whereClause = this.combineWhere((0, drizzle_orm_1.eq)(this.table[pk], id), opts?.withDeleted ? undefined : this.softDeleteClause(), extraWhere);
254
- query = query.where(whereClause).limit(1);
255
- const [result] = await query;
256
- let found = result ?? null;
257
- if (found && this.modelClass.afterFind) {
258
- [found] = await this.modelClass.afterFind([found]);
259
- }
260
- if (found && opts?.with?.length) {
261
- const [withResult] = await this.loadRelations([found], opts.with);
262
- return withResult ?? null;
263
- }
264
- return found;
265
- }
266
- async findAll(options) {
267
- let queryOptions = options ? { ...options } : undefined;
268
- if (this.modelClass.beforeFind) {
269
- queryOptions = await this.modelClass.beforeFind(queryOptions);
270
- }
271
- const selectCols = this.buildSelectCols(queryOptions?.select, queryOptions?.includeHidden);
272
- const whereClause = this.combineWhere(this.buildWhere(queryOptions?.where), queryOptions?.withDeleted ? undefined : this.softDeleteClause());
273
- let query = selectCols
274
- ? this.db.select(selectCols).from(this.table)
275
- : this.db.select().from(this.table);
276
- if (whereClause)
277
- query = query.where(whereClause);
278
- if (queryOptions?.orderBy) {
279
- const fields = Array.isArray(queryOptions.orderBy) ? queryOptions.orderBy : [queryOptions.orderBy];
280
- const orders = Array.isArray(queryOptions.order) ? queryOptions.order : [queryOptions.order ?? 'asc'];
281
- const orderClauses = fields
282
- .map((field, i) => {
283
- // Validate field name before property access to prevent prototype traversal
284
- if (!SAFE_KEY_RE.test(field))
285
- return null;
286
- if (!Object.prototype.hasOwnProperty.call(this.table, field))
287
- return null;
288
- const col = this.table[field];
289
- return (orders[i] ?? orders[0] ?? 'asc') === 'desc' ? (0, drizzle_orm_1.desc)(col) : (0, drizzle_orm_1.asc)(col);
290
- })
291
- .filter(Boolean);
292
- if (orderClauses.length)
293
- query = query.orderBy(...orderClauses);
294
- }
295
- if (queryOptions?.skip !== undefined)
296
- query = query.offset(queryOptions.skip);
297
- if (queryOptions?.take !== undefined)
298
- query = query.limit(queryOptions.take);
299
- let results = await query;
300
- if (this.modelClass.afterFind) {
301
- results = await this.modelClass.afterFind(results);
302
- }
303
- if (queryOptions?.with?.length) {
304
- results = await this.loadRelations(results, queryOptions.with);
305
- }
306
- return results;
307
- }
308
- /**
309
- * Cursor-based pagination — more efficient than offset for large datasets.
310
- *
311
- * @example
312
- * const page1 = await userRepo.findWithCursor({ take: 10 });
313
- * const page2 = await userRepo.findWithCursor({ take: 10, cursor: page1.nextCursor });
314
- */
315
- async findWithCursor(options) {
316
- const { take = 10, cursor, order = 'asc', where, select, with: withRelations, withDeleted, includeHidden, } = options;
317
- const pk = this.modelClass.getPrimaryKey();
318
- // Validate cursorField against known columns to prevent prototype traversal
319
- const requestedCursorField = options.cursorField ?? pk;
320
- const cursorField = SAFE_KEY_RE.test(requestedCursorField) &&
321
- Object.prototype.hasOwnProperty.call(this.table, requestedCursorField)
322
- ? requestedCursorField
323
- : pk;
324
- const col = this.table[cursorField];
325
- const pkCol = this.table[pk];
326
- const cursorFieldIsPk = cursorField === pk;
327
- // Decode cursor — stores both cursorField value and pk value for composite tie-breaking
328
- let cursorValue = null;
329
- let cursorPkValue = null;
330
- if (cursor) {
331
- const decoded = decodeCursor(cursor);
332
- cursorValue = decoded[cursorField] ?? null;
333
- cursorPkValue = decoded[pk] ?? null;
334
- }
335
- // Build cursor condition.
336
- // When cursorField is non-unique, use a composite condition to avoid skipping
337
- // rows that share the same cursorField value:
338
- // (cursorField > val) OR (cursorField = val AND pk > pkVal)
339
- let cursorCond = undefined;
340
- if (cursorValue !== null && col) {
341
- if (cursorFieldIsPk || cursorPkValue === null) {
342
- // PK is always unique — simple GT/LT is safe
343
- cursorCond = order === 'desc' ? (0, drizzle_orm_1.lt)(col, cursorValue) : (0, drizzle_orm_1.gt)(col, cursorValue);
344
- }
345
- else {
346
- cursorCond = (0, drizzle_orm_1.or)(order === 'desc' ? (0, drizzle_orm_1.lt)(col, cursorValue) : (0, drizzle_orm_1.gt)(col, cursorValue), (0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(col, cursorValue), order === 'desc' ? (0, drizzle_orm_1.lt)(pkCol, cursorPkValue) : (0, drizzle_orm_1.gt)(pkCol, cursorPkValue)));
347
- }
348
- }
349
- const whereClause = this.combineWhere(this.buildWhere(where), withDeleted ? undefined : this.softDeleteClause(), cursorCond);
350
- const selectCols = this.buildSelectCols(select, includeHidden);
351
- let query = selectCols
352
- ? this.db.select(selectCols).from(this.table)
353
- : this.db.select().from(this.table);
354
- if (whereClause)
355
- query = query.where(whereClause);
356
- // Sort by cursorField; add pk as tie-breaker when cursorField is non-unique
357
- if (col) {
358
- query = !cursorFieldIsPk && pkCol
359
- ? query.orderBy(order === 'desc' ? (0, drizzle_orm_1.desc)(col) : (0, drizzle_orm_1.asc)(col), order === 'desc' ? (0, drizzle_orm_1.desc)(pkCol) : (0, drizzle_orm_1.asc)(pkCol))
360
- : query.orderBy(order === 'desc' ? (0, drizzle_orm_1.desc)(col) : (0, drizzle_orm_1.asc)(col));
361
- }
362
- // Fetch one extra to detect whether there are more pages
363
- query = query.limit(take + 1);
364
- let results = await query;
365
- const hasMore = results.length > take;
366
- const data = hasMore ? results.slice(0, take) : results;
367
- const nextCursor = hasMore && data.length > 0
368
- ? encodeCursor(cursorField, data[data.length - 1][cursorField], pk, data[data.length - 1][pk])
369
- : null;
370
- if (this.modelClass.afterFind) {
371
- const processed = await this.modelClass.afterFind(data);
372
- const finalData = withRelations?.length
373
- ? await this.loadRelations(processed, withRelations)
374
- : processed;
375
- return { data: finalData, nextCursor, hasMore };
376
- }
377
- const finalData = withRelations?.length
378
- ? await this.loadRelations(data, withRelations)
379
- : data;
380
- return { data: finalData, nextCursor, hasMore };
381
- }
382
- async update(id, data) {
383
- let processed = { ...data };
384
- // Strip fields that must never be overwritten by user input
385
- const pk = this.modelClass.getPrimaryKey();
386
- delete processed[pk];
387
- delete processed['createdAt'];
388
- delete processed['deletedAt'];
389
- if (this.modelClass.beforeUpdate) {
390
- processed = await this.modelClass.beforeUpdate(id, processed);
391
- }
392
- // Strip again after hook — prevents hook from re-injecting immutable fields
393
- delete processed[pk];
394
- delete processed['createdAt'];
395
- delete processed['deletedAt'];
396
- // Guard before timestamp injection — empty body truly short-circuits here
397
- if (Object.keys(processed).length === 0) {
398
- const existing = await this.findById(id);
399
- if (!existing)
400
- throw new NotFoundError(`Record with id "${id}" not found`);
401
- return existing;
402
- }
403
- if (this.modelClass.timestamps !== false) {
404
- const cols = (0, drizzle_orm_1.getTableColumns)(this.table);
405
- if ('updatedAt' in cols) {
406
- processed.updatedAt = new Date();
407
- }
408
- }
409
- // For soft-delete models, distinguish "not found" from "soft-deleted" before updating
410
- if (this.modelClass.softDelete) {
411
- const tbl = this.table;
412
- const [row] = await this.db
413
- .select({ _deleted: tbl.deletedAt })
414
- .from(this.table)
415
- .where((0, drizzle_orm_1.eq)(tbl[pk], id))
416
- .limit(1);
417
- if (!row)
418
- throw new NotFoundError(`Record with id "${id}" not found`);
419
- if (row._deleted !== null && row._deleted !== undefined) {
420
- throw new NotFoundError(`Record with id "${id}" is soft-deleted and cannot be updated`);
421
- }
422
- }
423
- const updateWhere = this.combineWhere((0, drizzle_orm_1.eq)(this.table[pk], id), this.softDeleteClause());
424
- await this.db.update(this.table).set(processed).where(updateWhere);
425
- const result = await this.findById(id);
426
- if (!result)
427
- throw new NotFoundError(`Record with id "${id}" not found`);
428
- let final = result;
429
- if (this.modelClass.afterUpdate) {
430
- final = await this.modelClass.afterUpdate(id, processed, result);
431
- }
432
- return final;
433
- }
434
- async delete(id) {
435
- // Check existence first — beforeDelete must not fire for non-existent records
436
- const existing = await this.findById(id);
437
- if (!existing)
438
- throw new NotFoundError(`Record with id "${id}" not found`);
439
- if (this.modelClass.beforeDelete) {
440
- await this.modelClass.beforeDelete(id);
441
- }
442
- const pk = this.modelClass.getPrimaryKey();
443
- if (this.modelClass.softDelete) {
444
- await this.db
445
- .update(this.table)
446
- .set({ deletedAt: new Date() })
447
- .where((0, drizzle_orm_1.eq)(this.table[pk], id));
448
- }
449
- else {
450
- await this.db.delete(this.table).where((0, drizzle_orm_1.eq)(this.table[pk], id));
451
- }
452
- let final = existing;
453
- if (this.modelClass.afterDelete) {
454
- final = await this.modelClass.afterDelete(id, existing);
455
- }
456
- return final;
457
- }
458
- async hardDelete(id) {
459
- const existing = await this.findById(id, { withDeleted: true });
460
- if (!existing)
461
- throw new NotFoundError(`Record with id "${id}" not found`);
462
- const pk = this.modelClass.getPrimaryKey();
463
- await this.db.delete(this.table).where((0, drizzle_orm_1.eq)(this.table[pk], id));
464
- return existing;
465
- }
466
- async restore(id) {
467
- const pk = this.modelClass.getPrimaryKey();
468
- const cols = this.table;
469
- if (!cols.deletedAt)
470
- throw new Error('softDelete is not enabled on this model');
471
- // Fetch the raw row (including deletedAt) to verify it exists AND is soft-deleted
472
- const [raw] = await this.db.select().from(this.table)
473
- .where((0, drizzle_orm_1.eq)(cols[pk], id)).limit(1);
474
- if (!raw)
475
- throw new NotFoundError(`Record with id "${id}" not found`);
476
- if (!raw.deletedAt)
477
- throw new Error(`Record with id "${id}" is not soft-deleted`);
478
- await this.db
479
- .update(this.table)
480
- .set({ deletedAt: null })
481
- .where((0, drizzle_orm_1.eq)(cols[pk], id));
482
- const selectCols = this.buildSelectCols();
483
- let query = selectCols
484
- ? this.db.select(selectCols).from(this.table)
485
- : this.db.select().from(this.table);
486
- query = query.where((0, drizzle_orm_1.eq)(cols[pk], id)).limit(1);
487
- const [result] = await query;
488
- return result ?? null;
489
- }
490
- async count(where, withDeleted) {
491
- const whereClause = this.combineWhere(this.buildWhere(where), withDeleted ? undefined : this.softDeleteClause());
492
- let query = this.db.select({ count: (0, drizzle_orm_1.count)() }).from(this.table);
493
- if (whereClause)
494
- query = query.where(whereClause);
495
- const [result] = await query;
496
- return Number(result.count);
497
- }
498
- /** Returns the first record matching `where`, or null. Builds a direct LIMIT 1 query — does not delegate to findAll. */
499
- async findOne(where, opts) {
500
- const selectCols = this.buildSelectCols(opts?.select, opts?.includeHidden);
501
- const whereClause = this.combineWhere(this.buildWhere(where), opts?.withDeleted ? undefined : this.softDeleteClause());
502
- let query = selectCols
503
- ? this.db.select(selectCols).from(this.table)
504
- : this.db.select().from(this.table);
505
- if (whereClause)
506
- query = query.where(whereClause);
507
- query = query.limit(1);
508
- const [result] = await query;
509
- let found = result ?? null;
510
- if (found && this.modelClass.afterFind) {
511
- [found] = await this.modelClass.afterFind([found]);
512
- }
513
- if (found && opts?.with?.length) {
514
- const [withResult] = await this.loadRelations([found], opts.with);
515
- return withResult ?? null;
516
- }
517
- return found;
518
- }
519
- /**
520
- * Returns true if at least one record matches `where`.
521
- * Uses SELECT pk LIMIT 1 — more efficient than COUNT(*) because the DB stops at the first match.
522
- */
523
- async exists(where, withDeleted) {
524
- const pk = this.modelClass.getPrimaryKey();
525
- const whereClause = this.combineWhere(this.buildWhere(where), withDeleted ? undefined : this.softDeleteClause());
526
- let query = this.db.select({ _pk: this.table[pk] }).from(this.table);
527
- if (whereClause)
528
- query = query.where(whereClause);
529
- query = query.limit(1);
530
- const [result] = await query;
531
- return result !== undefined;
532
- }
533
- /**
534
- * Inserts multiple records in a single INSERT statement.
535
- * Calls `beforeCreate` for each row. Calls `afterCreateMany` once with all
536
- * results — use this hook for batch-aware side effects (e.g. bulk notifications).
537
- * Individual `afterCreate` is intentionally NOT called per row for performance.
538
- */
539
- async createMany(data) {
540
- if (data.length === 0)
541
- return [];
542
- const pk = this.modelClass.getPrimaryKey();
543
- const processed = await Promise.all(data.map(async (item) => {
544
- let row = { ...item };
545
- for (const f of SYSTEM_FIELDS)
546
- delete row[f];
547
- if (this.modelClass.beforeCreate) {
548
- row = await this.modelClass.beforeCreate(row);
549
- }
550
- // Strip again after hook — mirrors the defense-in-depth in create()
551
- for (const f of SYSTEM_FIELDS)
552
- delete row[f];
553
- if (!row[pk])
554
- row[pk] = (0, crypto_1.randomUUID)();
555
- return row;
556
- }));
557
- // Batch inserts to avoid DB packet/lock limits
558
- for (let i = 0; i < processed.length; i += INSERT_BATCH_SIZE) {
559
- await this.db.insert(this.table).values(processed.slice(i, i + INSERT_BATCH_SIZE));
560
- }
561
- // Fetch results in batches matching MAX_IN_VALUES so >500 inserts all return
562
- const pks = processed.map((r) => r[pk]);
563
- const results = [];
564
- for (let i = 0; i < pks.length; i += MAX_IN_VALUES) {
565
- const batch = pks.slice(i, i + MAX_IN_VALUES);
566
- const rows = await this.findAll({ where: { [`${pk}_in`]: batch.join(',') } });
567
- results.push(...rows);
568
- }
569
- // Re-order to match input insertion order — DB IN queries don't guarantee row order
570
- const pkOrder = new Map(pks.map((id, i) => [id, i]));
571
- results.sort((a, b) => (pkOrder.get(a[pk]) ?? 0) - (pkOrder.get(b[pk]) ?? 0));
572
- if (this.modelClass.afterCreateMany) {
573
- return this.modelClass.afterCreateMany(results);
574
- }
575
- return results;
576
- }
577
- /**
578
- * Runs `fn` inside a database transaction. The callback receives a new
579
- * Repository bound to the transaction connection.
580
- *
581
- * @example
582
- * await userRepo.transaction(async (trx) => {
583
- * await trx.create({ name: 'Alice' });
584
- * await trx.update(id, { name: 'Bob' });
585
- * });
586
- */
587
- async transaction(fn) {
588
- return this.db.transaction(async (trx) => {
589
- // Rebuild the registry so every relation load inside the transaction
590
- // uses the same transactional connection — not the outer db connection.
591
- //
592
- // Pass `trxRegistry` by reference at construction time so all repos
593
- // share the same Map. Lookups happen lazily (in loadRelations), so
594
- // the Map is fully populated before any repo needs to use it.
595
- let trxRegistry;
596
- if (this.registry) {
597
- trxRegistry = new Map();
598
- for (const [name, repo] of this.registry.entries()) {
599
- trxRegistry.set(name, new Repository(repo.modelClass, trx, repo.table, trxRegistry));
600
- }
601
- }
602
- return fn(new Repository(this.modelClass, trx, this.table, trxRegistry));
603
- });
604
- }
605
- }
606
- exports.Repository = Repository;
607
- //# sourceMappingURL=repository.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"repository.js","sourceRoot":"","sources":["../../src/core/repository.ts"],"names":[],"mappings":"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"}