crudora 0.2.0 → 0.2.1

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 +1692 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +404 -0
  6. package/dist/index.d.ts +404 -15
  7. package/dist/index.js +1685 -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,202 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.CrudoraServer = void 0;
7
- const express_1 = __importDefault(require("express"));
8
- const crypto_1 = require("crypto");
9
- const crudora_1 = require("./crudora");
10
- function createRateLimiter(config) {
11
- // Per-key sliding window: key → array of hit timestamps
12
- const store = new Map();
13
- // Sweep expired entries once per window so the Map doesn't grow unboundedly
14
- const timer = setInterval(() => {
15
- const cutoff = Date.now() - config.windowMs;
16
- for (const [key, hits] of store.entries()) {
17
- const active = hits.filter((t) => t > cutoff);
18
- if (active.length === 0)
19
- store.delete(key);
20
- else
21
- store.set(key, active);
22
- }
23
- }, config.windowMs);
24
- // Don't prevent the process from exiting naturally
25
- if (timer.unref)
26
- timer.unref();
27
- return (req, res, next) => {
28
- const key = config.keyGenerator(req);
29
- const now = Date.now();
30
- const cutoff = now - config.windowMs;
31
- const hits = (store.get(key) ?? []).filter((t) => t > cutoff);
32
- const remaining = Math.max(0, config.max - hits.length - 1);
33
- const resetAt = Math.ceil((now + config.windowMs) / 1000);
34
- res.setHeader('X-RateLimit-Limit', config.max);
35
- res.setHeader('X-RateLimit-Remaining', remaining);
36
- res.setHeader('X-RateLimit-Reset', resetAt);
37
- if (hits.length >= config.max) {
38
- res.setHeader('Retry-After', Math.ceil(config.windowMs / 1000));
39
- return res.status(429).json({
40
- success: false,
41
- error: { code: 'RATE_LIMIT_EXCEEDED', message: config.message },
42
- });
43
- }
44
- hits.push(now);
45
- store.set(key, hits);
46
- next();
47
- };
48
- }
49
- // ─── Logger ───────────────────────────────────────────────────────────────────
50
- function createDefaultLogger() {
51
- const fmt = (level, msg, ctx) => JSON.stringify({ level, time: new Date().toISOString(), msg, ...ctx });
52
- return {
53
- error: (msg, ctx) => console.error(fmt('error', msg, ctx)),
54
- warn: (msg, ctx) => console.warn(fmt('warn', msg, ctx)),
55
- info: (msg, ctx) => console.info(fmt('info', msg, ctx)),
56
- debug: (msg, ctx) => console.debug(fmt('debug', msg, ctx)),
57
- };
58
- }
59
- // ─── Server ───────────────────────────────────────────────────────────────────
60
- class CrudoraServer {
61
- constructor(config) {
62
- const resolvedLogger = config.logger === undefined ? createDefaultLogger() : config.logger;
63
- const resolvedRateLimit = config.rateLimit === false
64
- ? false
65
- : {
66
- windowMs: config.rateLimit?.windowMs ?? 60000,
67
- max: config.rateLimit?.max ?? 100,
68
- message: config.rateLimit?.message ?? 'Too many requests',
69
- keyGenerator: config.rateLimit?.keyGenerator ?? ((req) => String(req.ip ?? 'unknown')),
70
- };
71
- this.config = {
72
- port: 3000,
73
- cors: true,
74
- bodyParser: true,
75
- bodyParserLimit: '100kb',
76
- basePath: '/api',
77
- ...config,
78
- logger: resolvedLogger,
79
- rateLimit: resolvedRateLimit,
80
- };
81
- this.app = (0, express_1.default)();
82
- this.crudora = new crudora_1.Crudora(config.db, config.dialect, resolvedLogger === false ? undefined : resolvedLogger);
83
- this.setupMiddleware();
84
- }
85
- setupMiddleware() {
86
- // Security headers — applied unconditionally on every response
87
- this.app.use((_req, res, next) => {
88
- // Prevent MIME-type sniffing (XSS vector for browsers that ignore Content-Type)
89
- res.setHeader('X-Content-Type-Options', 'nosniff');
90
- // Disallow embedding in iframes — protects against clickjacking
91
- res.setHeader('X-Frame-Options', 'DENY');
92
- // Explicitly disable the legacy XSS auditor — it can itself be abused
93
- res.setHeader('X-XSS-Protection', '0');
94
- next();
95
- });
96
- // Attach a unique correlation ID to every incoming request
97
- this.app.use((req, _res, next) => {
98
- req.correlationId = (0, crypto_1.randomUUID)();
99
- next();
100
- });
101
- // Rate limiting — applied before body parsing so abusive requests are rejected
102
- // before we spend CPU deserializing their body
103
- if (this.config.rateLimit !== false) {
104
- this.app.use(createRateLimiter(this.config.rateLimit));
105
- }
106
- if (this.config.bodyParser) {
107
- this.app.use(express_1.default.json({ limit: this.config.bodyParserLimit }));
108
- this.app.use(express_1.default.urlencoded({ extended: true, limit: this.config.bodyParserLimit }));
109
- }
110
- if (this.config.cors !== false) {
111
- this.app.use((req, res, next) => {
112
- const cors = this.config.cors;
113
- if (cors === true || cors === undefined) {
114
- res.header('Access-Control-Allow-Origin', '*');
115
- }
116
- else if (typeof cors === 'string') {
117
- res.header('Access-Control-Allow-Origin', cors);
118
- res.header('Vary', 'Origin');
119
- }
120
- else if (Array.isArray(cors)) {
121
- const requestOrigin = req.headers.origin;
122
- if (requestOrigin && cors.includes(requestOrigin)) {
123
- res.header('Access-Control-Allow-Origin', requestOrigin);
124
- res.header('Vary', 'Origin');
125
- }
126
- }
127
- res.header('Access-Control-Allow-Methods', 'GET,PUT,PATCH,POST,DELETE,OPTIONS');
128
- res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
129
- if (req.method === 'OPTIONS') {
130
- res.sendStatus(204);
131
- }
132
- else {
133
- next();
134
- }
135
- });
136
- }
137
- }
138
- registerModel(...modelClasses) {
139
- this.crudora.registerModel(...modelClasses);
140
- return this;
141
- }
142
- registerTable(modelClass, table) {
143
- this.crudora.registerTable(modelClass, table);
144
- return this;
145
- }
146
- generateRoutes() {
147
- this.crudora.generateRoutes(this.app, this.config.basePath);
148
- return this;
149
- }
150
- use(middleware) {
151
- this.app.use(middleware);
152
- return this;
153
- }
154
- listen(callback) {
155
- this.app.listen(this.config.port, () => {
156
- console.log(`🚀 Crudora server running on port ${this.config.port}`);
157
- console.log(`📚 API available at http://localhost:${this.config.port}${this.config.basePath}`);
158
- if (callback)
159
- callback();
160
- });
161
- }
162
- getApp() {
163
- return this.app;
164
- }
165
- getCrudora() {
166
- return this.crudora;
167
- }
168
- /**
169
- * Returns the Drizzle table object for a registered model — delegates to `Crudora.getTable()`.
170
- * Use this when you need raw DB access to columns excluded by `static hidden`
171
- * (e.g. a login route that must read the password hash).
172
- *
173
- * @example
174
- * const usersTable = server.getTable(User);
175
- * const [row] = await db.select().from(usersTable).where(eq(usersTable.email, email)).limit(1);
176
- */
177
- getTable(modelClass) {
178
- return this.crudora.getTable(modelClass);
179
- }
180
- get(path, ...handlers) {
181
- this.crudora.get(path, ...handlers);
182
- return this;
183
- }
184
- post(path, ...handlers) {
185
- this.crudora.post(path, ...handlers);
186
- return this;
187
- }
188
- put(path, ...handlers) {
189
- this.crudora.put(path, ...handlers);
190
- return this;
191
- }
192
- delete(path, ...handlers) {
193
- this.crudora.delete(path, ...handlers);
194
- return this;
195
- }
196
- patch(path, ...handlers) {
197
- this.crudora.patch(path, ...handlers);
198
- return this;
199
- }
200
- }
201
- exports.CrudoraServer = CrudoraServer;
202
- //# sourceMappingURL=crudoraServer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"crudoraServer.js","sourceRoot":"","sources":["../../src/core/crudoraServer.ts"],"names":[],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- import { Dialect } from '../types/model.type';
2
- import { ModelConstructor } from './model';
3
- export declare class DrizzleTableBuilder {
4
- static build(modelClass: ModelConstructor, dialect: Dialect): any;
5
- }
6
- //# sourceMappingURL=drizzleTableBuilder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"drizzleTableBuilder.d.ts","sourceRoot":"","sources":["../../src/core/drizzleTableBuilder.ts"],"names":[],"mappings":"AA8BA,OAAO,EAAE,OAAO,EAA2B,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AA+J3C,qBAAa,mBAAmB;IAC9B,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,GAAG,GAAG;CAqBlE"}
@@ -1,175 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DrizzleTableBuilder = void 0;
4
- const pg_core_1 = require("drizzle-orm/pg-core");
5
- const mysql_core_1 = require("drizzle-orm/mysql-core");
6
- const model_1 = require("../decorators/model");
7
- function buildPgColumn(name, opts) {
8
- const type = opts.type;
9
- let col;
10
- switch (type) {
11
- case 'uuid':
12
- col = (0, pg_core_1.uuid)(name);
13
- break;
14
- case 'text':
15
- col = (0, pg_core_1.text)(name);
16
- break;
17
- case 'integer':
18
- col = (0, pg_core_1.integer)(name);
19
- break;
20
- case 'number':
21
- col = (0, pg_core_1.doublePrecision)(name);
22
- break;
23
- case 'boolean':
24
- col = (0, pg_core_1.boolean)(name);
25
- break;
26
- case 'date':
27
- col = (0, pg_core_1.timestamp)(name, { mode: 'date' });
28
- break;
29
- case 'decimal':
30
- col = (0, pg_core_1.decimal)(name, {
31
- precision: opts.precision ?? 10,
32
- scale: opts.scale ?? 2,
33
- });
34
- break;
35
- case 'json':
36
- col = (0, pg_core_1.json)(name);
37
- break;
38
- case 'enum':
39
- // PostgreSQL: no native column-level enum without pgEnum (a named type).
40
- // Use text column — Zod validates allowed values at the API layer.
41
- col = (0, pg_core_1.text)(name);
42
- break;
43
- case 'bigint':
44
- col = (0, pg_core_1.bigint)(name, { mode: 'number' });
45
- break;
46
- case 'serial':
47
- col = (0, pg_core_1.serial)(name);
48
- break;
49
- case 'array':
50
- col = (0, pg_core_1.text)(name).array();
51
- break;
52
- case 'string':
53
- default:
54
- col = (0, pg_core_1.varchar)(name, { length: opts.length ?? 255 });
55
- }
56
- if (opts.primary)
57
- col = col.primaryKey();
58
- // serial columns are implicitly NOT NULL with a default — skip notNull()
59
- if (opts.required && !opts.nullable && opts.type !== 'serial')
60
- col = col.notNull();
61
- if (opts.unique)
62
- col = col.unique();
63
- if (opts.default !== undefined && opts.type !== 'serial')
64
- col = col.default(opts.default);
65
- return col;
66
- }
67
- function buildMysqlColumn(name, opts) {
68
- const type = opts.type;
69
- let col;
70
- switch (type) {
71
- case 'uuid':
72
- col = (0, mysql_core_1.varchar)(name, { length: 36 });
73
- break;
74
- case 'text':
75
- col = (0, mysql_core_1.text)(name);
76
- break;
77
- case 'integer':
78
- col = (0, mysql_core_1.int)(name);
79
- break;
80
- case 'number':
81
- col = (0, mysql_core_1.double)(name);
82
- break;
83
- case 'boolean':
84
- col = (0, mysql_core_1.boolean)(name);
85
- break;
86
- case 'date':
87
- col = (0, mysql_core_1.datetime)(name, { mode: 'date' });
88
- break;
89
- case 'decimal':
90
- col = (0, mysql_core_1.decimal)(name, {
91
- precision: opts.precision ?? 10,
92
- scale: opts.scale ?? 2,
93
- });
94
- break;
95
- case 'json':
96
- col = (0, mysql_core_1.json)(name);
97
- break;
98
- case 'enum':
99
- if (!opts.enumValues?.length) {
100
- throw new Error(`Field "${name}" of type "enum" requires the enumValues option`);
101
- }
102
- col = (0, mysql_core_1.mysqlEnum)(name, opts.enumValues);
103
- break;
104
- case 'bigint':
105
- col = (0, mysql_core_1.bigint)(name, { mode: 'number' });
106
- break;
107
- case 'serial':
108
- col = (0, mysql_core_1.int)(name).autoincrement();
109
- break;
110
- case 'array':
111
- throw new Error(`Field type "array" is not supported in MySQL dialect. Use "json" instead.`);
112
- case 'string':
113
- default:
114
- col = (0, mysql_core_1.varchar)(name, { length: opts.length ?? 255 });
115
- }
116
- if (opts.primary)
117
- col = col.primaryKey();
118
- if (opts.required && !opts.nullable && opts.type !== 'serial')
119
- col = col.notNull();
120
- if (opts.unique)
121
- col = col.unique();
122
- if (opts.default !== undefined && opts.type !== 'serial')
123
- col = col.default(opts.default);
124
- return col;
125
- }
126
- function buildPgColumns(fields, modelClass) {
127
- const cols = {};
128
- for (const [name, opts] of Object.entries(fields)) {
129
- cols[name] = buildPgColumn(name, opts);
130
- }
131
- if (modelClass.timestamps !== false) {
132
- cols.createdAt = (0, pg_core_1.timestamp)('createdAt', { mode: 'date' }).defaultNow().notNull();
133
- cols.updatedAt = (0, pg_core_1.timestamp)('updatedAt', { mode: 'date' }).defaultNow().notNull();
134
- }
135
- if (modelClass.softDelete) {
136
- cols.deletedAt = (0, pg_core_1.timestamp)('deletedAt', { mode: 'date' });
137
- }
138
- return cols;
139
- }
140
- function buildMysqlColumns(fields, modelClass) {
141
- const cols = {};
142
- for (const [name, opts] of Object.entries(fields)) {
143
- cols[name] = buildMysqlColumn(name, opts);
144
- }
145
- if (modelClass.timestamps !== false) {
146
- cols.createdAt = (0, mysql_core_1.datetime)('createdAt', { mode: 'date' }).notNull();
147
- cols.updatedAt = (0, mysql_core_1.datetime)('updatedAt', { mode: 'date' }).notNull();
148
- }
149
- if (modelClass.softDelete) {
150
- cols.deletedAt = (0, mysql_core_1.datetime)('deletedAt', { mode: 'date' });
151
- }
152
- return cols;
153
- }
154
- class DrizzleTableBuilder {
155
- static build(modelClass, dialect) {
156
- const fields = (0, model_1.getFieldMetadata)(modelClass);
157
- const tableName = modelClass.getTableName();
158
- const schemaName = modelClass.schema;
159
- if (dialect === 'postgresql') {
160
- const cols = buildPgColumns(fields, modelClass);
161
- return schemaName
162
- ? (0, pg_core_1.pgSchema)(schemaName).table(tableName, cols)
163
- : (0, pg_core_1.pgTable)(tableName, cols);
164
- }
165
- if (dialect === 'mysql') {
166
- const cols = buildMysqlColumns(fields, modelClass);
167
- return schemaName
168
- ? (0, mysql_core_1.mysqlSchema)(schemaName).table(tableName, cols)
169
- : (0, mysql_core_1.mysqlTable)(tableName, cols);
170
- }
171
- throw new Error(`Unsupported dialect: ${dialect}. Use 'postgresql' or 'mysql'.`);
172
- }
173
- }
174
- exports.DrizzleTableBuilder = DrizzleTableBuilder;
175
- //# sourceMappingURL=drizzleTableBuilder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"drizzleTableBuilder.js","sourceRoot":"","sources":["../../src/core/drizzleTableBuilder.ts"],"names":[],"mappings":"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"}
@@ -1,58 +0,0 @@
1
- /**
2
- * Base class for all Crudora models. Extend this to define your table schema,
3
- * configure lifecycle hooks, and control API behaviour via static properties.
4
- *
5
- * Use `@Field()` decorators on instance properties to describe columns.
6
- * Use `@HasMany()`, `@HasOne()`, `@BelongsTo()`, `@BelongsToMany()` for relations.
7
- *
8
- * This is a plain class — **not** a decorator. Extend it:
9
- * ```ts
10
- * class User extends Model {
11
- * static tableName = 'users';
12
- * }
13
- * ```
14
- */
15
- export declare abstract class Model {
16
- static tableName?: string;
17
- static primaryKey?: string;
18
- static timestamps?: boolean;
19
- static softDelete?: boolean;
20
- static fillable?: string[];
21
- static hidden?: string[];
22
- static schema?: string;
23
- static getTableName(): string;
24
- static getPrimaryKey(): string;
25
- static beforeCreate?(_data: any): Promise<any>;
26
- static afterCreate?(_data: any, result: any): Promise<any>;
27
- static afterCreateMany?(_records: any[]): Promise<any[]>;
28
- static beforeUpdate?(_id: string, _data: any): Promise<any>;
29
- static afterUpdate?(_id: string, _data: any, result: any): Promise<any>;
30
- static beforeDelete?(_id: string): Promise<void>;
31
- static afterDelete?(_id: string, result: any): Promise<any>;
32
- static beforeFind?(options?: any): Promise<any>;
33
- static afterFind?(results: any[]): Promise<any[]>;
34
- beforeSave?(): Promise<void>;
35
- afterSave?(): Promise<void>;
36
- }
37
- export type ModelConstructor<T extends Model = Model> = {
38
- new (): T;
39
- tableName?: string;
40
- primaryKey?: string;
41
- timestamps?: boolean;
42
- softDelete?: boolean;
43
- fillable?: string[];
44
- hidden?: string[];
45
- schema?: string;
46
- getTableName(): string;
47
- getPrimaryKey(): string;
48
- beforeCreate?(data: any): Promise<any>;
49
- afterCreate?(data: any, result: any): Promise<any>;
50
- afterCreateMany?(records: any[]): Promise<any[]>;
51
- beforeUpdate?(id: string, data: any): Promise<any>;
52
- afterUpdate?(id: string, data: any, result: any): Promise<any>;
53
- beforeDelete?(id: string): Promise<void>;
54
- afterDelete?(id: string, result: any): Promise<any>;
55
- beforeFind?(options?: any): Promise<any>;
56
- afterFind?(results: any[]): Promise<any[]>;
57
- } & typeof Model;
58
- //# sourceMappingURL=model.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/core/model.ts"],"names":[],"mappings":"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"}
@@ -1,64 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Model = void 0;
4
- /**
5
- * Base class for all Crudora models. Extend this to define your table schema,
6
- * configure lifecycle hooks, and control API behaviour via static properties.
7
- *
8
- * Use `@Field()` decorators on instance properties to describe columns.
9
- * Use `@HasMany()`, `@HasOne()`, `@BelongsTo()`, `@BelongsToMany()` for relations.
10
- *
11
- * This is a plain class — **not** a decorator. Extend it:
12
- * ```ts
13
- * class User extends Model {
14
- * static tableName = 'users';
15
- * }
16
- * ```
17
- */
18
- class Model {
19
- static getTableName() {
20
- return this.tableName || this.name.toLowerCase() + 's';
21
- }
22
- static getPrimaryKey() {
23
- return this.primaryKey || 'id';
24
- }
25
- // Lifecycle Hooks
26
- static async beforeCreate(_data) {
27
- return _data;
28
- }
29
- static async afterCreate(_data, result) {
30
- return result;
31
- }
32
- static async afterCreateMany(_records) {
33
- return _records;
34
- }
35
- static async beforeUpdate(_id, _data) {
36
- return _data;
37
- }
38
- static async afterUpdate(_id, _data, result) {
39
- return result;
40
- }
41
- static async beforeDelete(_id) {
42
- // Default implementation - do nothing
43
- }
44
- static async afterDelete(_id, result) {
45
- return result;
46
- }
47
- static async beforeFind(options) {
48
- return options;
49
- }
50
- static async afterFind(results) {
51
- return results;
52
- }
53
- async beforeSave() {
54
- // Default implementation - do nothing
55
- }
56
- async afterSave() {
57
- // Default implementation - do nothing
58
- }
59
- }
60
- exports.Model = Model;
61
- Model.primaryKey = 'id';
62
- Model.timestamps = true;
63
- Model.softDelete = false;
64
- //# sourceMappingURL=model.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/core/model.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;GAaG;AACH,MAAsB,KAAK;IASzB,MAAM,CAAC,YAAY;QACjB,OAAO,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,OAAO,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;IACjC,CAAC;IAED,kBAAkB;IAClB,MAAM,CAAC,KAAK,CAAC,YAAY,CAAE,KAAU;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,WAAW,CAAE,KAAU,EAAE,MAAW;QAC/C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,eAAe,CAAE,QAAe;QAC3C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,YAAY,CAAE,GAAW,EAAE,KAAU;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,WAAW,CAAE,GAAW,EAAE,KAAU,EAAE,MAAW;QAC5D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,YAAY,CAAE,GAAW;QACpC,sCAAsC;IACxC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,WAAW,CAAE,GAAW,EAAE,MAAW;QAChD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,UAAU,CAAE,OAAa;QACpC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,SAAS,CAAE,OAAc;QACpC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,sCAAsC;IACxC,CAAC;IAED,KAAK,CAAC,SAAS;QACb,sCAAsC;IACxC,CAAC;;AA5DH,sBA6DC;AA3DQ,gBAAU,GAAY,IAAI,CAAC;AAC3B,gBAAU,GAAa,IAAI,CAAC;AAC5B,gBAAU,GAAa,KAAK,CAAC"}
@@ -1,106 +0,0 @@
1
- import { Model, ModelConstructor } from './model';
2
- export interface FindAllOptions {
3
- skip?: number;
4
- take?: number;
5
- where?: Record<string, any>;
6
- orderBy?: string | string[];
7
- order?: 'asc' | 'desc' | Array<'asc' | 'desc'>;
8
- select?: string[];
9
- with?: string[];
10
- withDeleted?: boolean;
11
- /** When true, fields listed in `static hidden` are included in the result. */
12
- includeHidden?: boolean;
13
- }
14
- export interface FindByIdOptions {
15
- select?: string[];
16
- with?: string[];
17
- withDeleted?: boolean;
18
- /** When true, fields listed in `static hidden` are included in the result. */
19
- includeHidden?: boolean;
20
- }
21
- export interface CursorPaginationOptions {
22
- take?: number;
23
- cursor?: string | null;
24
- cursorField?: string;
25
- order?: 'asc' | 'desc';
26
- where?: Record<string, any>;
27
- select?: string[];
28
- with?: string[];
29
- withDeleted?: boolean;
30
- /** When true, fields listed in `static hidden` are included in the result. */
31
- includeHidden?: boolean;
32
- }
33
- export interface CursorResult<T> {
34
- data: T[];
35
- nextCursor: string | null;
36
- hasMore: boolean;
37
- }
38
- export declare class NotFoundError extends Error {
39
- readonly code = "NOT_FOUND";
40
- constructor(message: string);
41
- }
42
- export declare class Repository<T extends Model> {
43
- private modelClass;
44
- private db;
45
- private table;
46
- /** Shared registry — same Map instance as Crudora holds; populated lazily. */
47
- private registry?;
48
- constructor(modelClass: ModelConstructor<T>, db: any, table: any,
49
- /** Shared registry — same Map instance as Crudora holds; populated lazily. */
50
- registry?: Map<string, Repository<any>> | undefined);
51
- /**
52
- * Builds the Drizzle select-column object, merging hidden-field exclusion with
53
- * an optional explicit field list. Returns `undefined` to select all columns.
54
- */
55
- private buildSelectCols;
56
- private buildWhere;
57
- private softDeleteClause;
58
- private combineWhere;
59
- /**
60
- * Batch-loads relations for a list of records. Uses the _in operator so the
61
- * total number of DB round-trips equals the number of requested relations.
62
- */
63
- private loadRelations;
64
- create(data: Partial<T>): Promise<T>;
65
- findById(id: string, opts?: FindByIdOptions): Promise<T | null>;
66
- findAll(options?: FindAllOptions): Promise<T[]>;
67
- /**
68
- * Cursor-based pagination — more efficient than offset for large datasets.
69
- *
70
- * @example
71
- * const page1 = await userRepo.findWithCursor({ take: 10 });
72
- * const page2 = await userRepo.findWithCursor({ take: 10, cursor: page1.nextCursor });
73
- */
74
- findWithCursor(options: CursorPaginationOptions): Promise<CursorResult<T>>;
75
- update(id: string, data: Partial<T>): Promise<T>;
76
- delete(id: string): Promise<T>;
77
- hardDelete(id: string): Promise<T>;
78
- restore(id: string): Promise<T>;
79
- count(where?: any, withDeleted?: boolean): Promise<number>;
80
- /** Returns the first record matching `where`, or null. Builds a direct LIMIT 1 query — does not delegate to findAll. */
81
- findOne(where?: Record<string, any>, opts?: FindByIdOptions): Promise<T | null>;
82
- /**
83
- * Returns true if at least one record matches `where`.
84
- * Uses SELECT pk LIMIT 1 — more efficient than COUNT(*) because the DB stops at the first match.
85
- */
86
- exists(where?: Record<string, any>, withDeleted?: boolean): Promise<boolean>;
87
- /**
88
- * Inserts multiple records in a single INSERT statement.
89
- * Calls `beforeCreate` for each row. Calls `afterCreateMany` once with all
90
- * results — use this hook for batch-aware side effects (e.g. bulk notifications).
91
- * Individual `afterCreate` is intentionally NOT called per row for performance.
92
- */
93
- createMany(data: Partial<T>[]): Promise<T[]>;
94
- /**
95
- * Runs `fn` inside a database transaction. The callback receives a new
96
- * Repository bound to the transaction connection.
97
- *
98
- * @example
99
- * await userRepo.transaction(async (trx) => {
100
- * await trx.create({ name: 'Alice' });
101
- * await trx.update(id, { name: 'Bob' });
102
- * });
103
- */
104
- transaction<R>(fn: (trx: Repository<T>) => Promise<R>): Promise<R>;
105
- }
106
- //# sourceMappingURL=repository.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../src/core/repository.ts"],"names":[],"mappings":"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"}