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.
- package/dist/cli.js +55 -65
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +1732 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +438 -0
- package/dist/index.d.ts +438 -15
- package/dist/index.js +1725 -27
- package/dist/index.js.map +1 -1
- package/dist/scripts/copy-assets.js +0 -21
- package/package.json +5 -4
- package/scripts/copy-assets.js +0 -21
- package/dist/core/crudora.d.ts +0 -49
- package/dist/core/crudora.d.ts.map +0 -1
- package/dist/core/crudora.js +0 -370
- package/dist/core/crudora.js.map +0 -1
- package/dist/core/crudoraServer.d.ts +0 -84
- package/dist/core/crudoraServer.d.ts.map +0 -1
- package/dist/core/crudoraServer.js +0 -202
- package/dist/core/crudoraServer.js.map +0 -1
- package/dist/core/drizzleTableBuilder.d.ts +0 -6
- package/dist/core/drizzleTableBuilder.d.ts.map +0 -1
- package/dist/core/drizzleTableBuilder.js +0 -175
- package/dist/core/drizzleTableBuilder.js.map +0 -1
- package/dist/core/model.d.ts +0 -58
- package/dist/core/model.d.ts.map +0 -1
- package/dist/core/model.js +0 -64
- package/dist/core/model.js.map +0 -1
- package/dist/core/repository.d.ts +0 -106
- package/dist/core/repository.d.ts.map +0 -1
- package/dist/core/repository.js +0 -607
- package/dist/core/repository.js.map +0 -1
- package/dist/core/schemaGenerator.d.ts +0 -6
- package/dist/core/schemaGenerator.d.ts.map +0 -1
- package/dist/core/schemaGenerator.js +0 -248
- package/dist/core/schemaGenerator.js.map +0 -1
- package/dist/decorators/model.d.ts +0 -64
- package/dist/decorators/model.d.ts.map +0 -1
- package/dist/decorators/model.js +0 -138
- package/dist/decorators/model.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/types/logger.type.d.ts +0 -7
- package/dist/types/logger.type.d.ts.map +0 -1
- package/dist/types/logger.type.js +0 -3
- package/dist/types/logger.type.js.map +0 -1
- package/dist/types/model.type.d.ts +0 -38
- package/dist/types/model.type.d.ts.map +0 -1
- package/dist/types/model.type.js +0 -3
- package/dist/types/model.type.js.map +0 -1
- package/dist/utils/validation.d.ts +0 -7
- package/dist/utils/validation.d.ts.map +0 -1
- package/dist/utils/validation.js +0 -107
- package/dist/utils/validation.js.map +0 -1
package/dist/core/repository.js
DELETED
|
@@ -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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"}
|