@cinnabun/db 0.0.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.
- package/README.md +166 -0
- package/dist/__tests__/integration/drizzle-sqlite.integration.test.d.ts +1 -0
- package/dist/__tests__/integration/drizzle-sqlite.integration.test.js +135 -0
- package/dist/__tests__/integration/drizzle-sqlite.integration.test.js.map +1 -0
- package/dist/__tests__/unit/database-module.test.d.ts +1 -0
- package/dist/__tests__/unit/database-module.test.js +43 -0
- package/dist/__tests__/unit/database-module.test.js.map +1 -0
- package/dist/__tests__/unit/drizzle-adapter.test.d.ts +1 -0
- package/dist/__tests__/unit/drizzle-adapter.test.js +61 -0
- package/dist/__tests__/unit/drizzle-adapter.test.js.map +1 -0
- package/dist/__tests__/unit/exceptions.test.d.ts +1 -0
- package/dist/__tests__/unit/exceptions.test.js +37 -0
- package/dist/__tests__/unit/exceptions.test.js.map +1 -0
- package/dist/__tests__/unit/metadata.test.d.ts +1 -0
- package/dist/__tests__/unit/metadata.test.js +58 -0
- package/dist/__tests__/unit/metadata.test.js.map +1 -0
- package/dist/__tests__/unit/transactional.test.d.ts +1 -0
- package/dist/__tests__/unit/transactional.test.js +55 -0
- package/dist/__tests__/unit/transactional.test.js.map +1 -0
- package/dist/adapters/base/base.adapter.d.ts +20 -0
- package/dist/adapters/base/base.adapter.js +30 -0
- package/dist/adapters/base/base.adapter.js.map +1 -0
- package/dist/adapters/drizzle/drizzle-repository.d.ts +16 -0
- package/dist/adapters/drizzle/drizzle-repository.js +81 -0
- package/dist/adapters/drizzle/drizzle-repository.js.map +1 -0
- package/dist/adapters/drizzle/drizzle.adapter.d.ts +17 -0
- package/dist/adapters/drizzle/drizzle.adapter.js +94 -0
- package/dist/adapters/drizzle/drizzle.adapter.js.map +1 -0
- package/dist/adapters/prisma/prisma-repository.d.ts +16 -0
- package/dist/adapters/prisma/prisma-repository.js +56 -0
- package/dist/adapters/prisma/prisma-repository.js.map +1 -0
- package/dist/adapters/prisma/prisma.adapter.d.ts +11 -0
- package/dist/adapters/prisma/prisma.adapter.js +86 -0
- package/dist/adapters/prisma/prisma.adapter.js.map +1 -0
- package/dist/cli/commands/db-generate.command.d.ts +2 -0
- package/dist/cli/commands/db-generate.command.js +33 -0
- package/dist/cli/commands/db-generate.command.js.map +1 -0
- package/dist/cli/commands/db-migrate.command.d.ts +2 -0
- package/dist/cli/commands/db-migrate.command.js +35 -0
- package/dist/cli/commands/db-migrate.command.js.map +1 -0
- package/dist/cli/register-db-commands.d.ts +2 -0
- package/dist/cli/register-db-commands.js +10 -0
- package/dist/cli/register-db-commands.js.map +1 -0
- package/dist/cli/utils/config-loader.d.ts +2 -0
- package/dist/cli/utils/config-loader.js +34 -0
- package/dist/cli/utils/config-loader.js.map +1 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.js +3 -0
- package/dist/constants.js.map +1 -0
- package/dist/core/database.module.d.ts +12 -0
- package/dist/core/database.module.js +54 -0
- package/dist/core/database.module.js.map +1 -0
- package/dist/core/database.plugin.d.ts +6 -0
- package/dist/core/database.plugin.js +15 -0
- package/dist/core/database.plugin.js.map +1 -0
- package/dist/core/repository-factory.d.ts +6 -0
- package/dist/core/repository-factory.js +31 -0
- package/dist/core/repository-factory.js.map +1 -0
- package/dist/core/transaction-manager.d.ts +8 -0
- package/dist/core/transaction-manager.js +43 -0
- package/dist/core/transaction-manager.js.map +1 -0
- package/dist/decorators/inject-repository.decorator.d.ts +3 -0
- package/dist/decorators/inject-repository.decorator.js +35 -0
- package/dist/decorators/inject-repository.decorator.js.map +1 -0
- package/dist/decorators/transactional.decorator.d.ts +4 -0
- package/dist/decorators/transactional.decorator.js +22 -0
- package/dist/decorators/transactional.decorator.js.map +1 -0
- package/dist/exceptions/database.exception.d.ts +15 -0
- package/dist/exceptions/database.exception.js +31 -0
- package/dist/exceptions/database.exception.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/database-adapter.interface.d.ts +16 -0
- package/dist/interfaces/database-adapter.interface.js +2 -0
- package/dist/interfaces/database-adapter.interface.js.map +1 -0
- package/dist/interfaces/options.interface.d.ts +12 -0
- package/dist/interfaces/options.interface.js +2 -0
- package/dist/interfaces/options.interface.js.map +1 -0
- package/dist/interfaces/repository.interface.d.ts +16 -0
- package/dist/interfaces/repository.interface.js +2 -0
- package/dist/interfaces/repository.interface.js.map +1 -0
- package/dist/metadata/db-storage.d.ts +13 -0
- package/dist/metadata/db-storage.js +14 -0
- package/dist/metadata/db-storage.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Logger } from "@cinnabun/core";
|
|
2
|
+
import { ConnectionException } from "../../exceptions/database.exception.js";
|
|
3
|
+
export class BaseAdapter {
|
|
4
|
+
options;
|
|
5
|
+
client = null;
|
|
6
|
+
connected = false;
|
|
7
|
+
logger;
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.options = options;
|
|
10
|
+
this.logger = new Logger(this.constructor.name);
|
|
11
|
+
}
|
|
12
|
+
getClient() {
|
|
13
|
+
if (!this.client) {
|
|
14
|
+
throw new ConnectionException("Database client not initialized. Call connect() first.");
|
|
15
|
+
}
|
|
16
|
+
return this.client;
|
|
17
|
+
}
|
|
18
|
+
isConnected() {
|
|
19
|
+
return this.connected;
|
|
20
|
+
}
|
|
21
|
+
shouldLog(type) {
|
|
22
|
+
const { logging } = this.options;
|
|
23
|
+
if (typeof logging === "boolean")
|
|
24
|
+
return logging;
|
|
25
|
+
if (typeof logging === "object")
|
|
26
|
+
return logging[type] ?? false;
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=base.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.adapter.js","sourceRoot":"","sources":["../../../src/adapters/base/base.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAGxC,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAE7E,MAAM,OAAgB,WAAW;IAKT;IAJZ,MAAM,GAAmB,IAAI,CAAC;IAC9B,SAAS,GAAG,KAAK,CAAC;IAClB,MAAM,CAAS;IAEzB,YAAsB,OAA8B;QAA9B,YAAO,GAAP,OAAO,CAAuB;QAClD,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IAUD,SAAS;QACP,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,mBAAmB,CAAC,wDAAwD,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAES,SAAS,CAAC,IAAyC;QAC3D,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QACjC,IAAI,OAAO,OAAO,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC;QACjD,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;QAC/D,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Repository, QueryOptions } from "../../interfaces/repository.interface.js";
|
|
2
|
+
export declare class DrizzleRepository<T> implements Repository<T> {
|
|
3
|
+
private db;
|
|
4
|
+
private table;
|
|
5
|
+
constructor(db: any, table: any);
|
|
6
|
+
findAll(options?: QueryOptions): Promise<T[]>;
|
|
7
|
+
findById(id: string | number): Promise<T | null>;
|
|
8
|
+
findOne(where: Partial<T>): Promise<T | null>;
|
|
9
|
+
findMany(where: Partial<T>, options?: QueryOptions): Promise<T[]>;
|
|
10
|
+
create(data: Partial<T>): Promise<T>;
|
|
11
|
+
update(id: string | number, data: Partial<T>): Promise<T>;
|
|
12
|
+
delete(id: string | number): Promise<void>;
|
|
13
|
+
count(where?: Partial<T>): Promise<number>;
|
|
14
|
+
exists(where: Partial<T>): Promise<boolean>;
|
|
15
|
+
private buildWhere;
|
|
16
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { eq, and, sql } from "drizzle-orm";
|
|
2
|
+
export class DrizzleRepository {
|
|
3
|
+
db;
|
|
4
|
+
table;
|
|
5
|
+
constructor(db, table) {
|
|
6
|
+
this.db = db;
|
|
7
|
+
this.table = table;
|
|
8
|
+
}
|
|
9
|
+
async findAll(options) {
|
|
10
|
+
let query = this.db.select().from(this.table);
|
|
11
|
+
if (options?.limit)
|
|
12
|
+
query = query.limit(options.limit);
|
|
13
|
+
if (options?.offset)
|
|
14
|
+
query = query.offset(options.offset);
|
|
15
|
+
return query;
|
|
16
|
+
}
|
|
17
|
+
async findById(id) {
|
|
18
|
+
const result = await this.db
|
|
19
|
+
.select()
|
|
20
|
+
.from(this.table)
|
|
21
|
+
.where(eq(this.table.id, id))
|
|
22
|
+
.limit(1);
|
|
23
|
+
return result[0] ?? null;
|
|
24
|
+
}
|
|
25
|
+
async findOne(where) {
|
|
26
|
+
const conditions = this.buildWhere(where);
|
|
27
|
+
const result = await this.db
|
|
28
|
+
.select()
|
|
29
|
+
.from(this.table)
|
|
30
|
+
.where(conditions)
|
|
31
|
+
.limit(1);
|
|
32
|
+
return result[0] ?? null;
|
|
33
|
+
}
|
|
34
|
+
async findMany(where, options) {
|
|
35
|
+
const conditions = this.buildWhere(where);
|
|
36
|
+
let query = this.db.select().from(this.table).where(conditions);
|
|
37
|
+
if (options?.limit)
|
|
38
|
+
query = query.limit(options.limit);
|
|
39
|
+
if (options?.offset)
|
|
40
|
+
query = query.offset(options.offset);
|
|
41
|
+
return query;
|
|
42
|
+
}
|
|
43
|
+
async create(data) {
|
|
44
|
+
const result = await this.db
|
|
45
|
+
.insert(this.table)
|
|
46
|
+
.values(data)
|
|
47
|
+
.returning();
|
|
48
|
+
return result[0];
|
|
49
|
+
}
|
|
50
|
+
async update(id, data) {
|
|
51
|
+
const result = await this.db
|
|
52
|
+
.update(this.table)
|
|
53
|
+
.set(data)
|
|
54
|
+
.where(eq(this.table.id, id))
|
|
55
|
+
.returning();
|
|
56
|
+
return result[0];
|
|
57
|
+
}
|
|
58
|
+
async delete(id) {
|
|
59
|
+
await this.db
|
|
60
|
+
.delete(this.table)
|
|
61
|
+
.where(eq(this.table.id, id));
|
|
62
|
+
}
|
|
63
|
+
async count(where) {
|
|
64
|
+
const conditions = where ? this.buildWhere(where) : undefined;
|
|
65
|
+
let query = this.db
|
|
66
|
+
.select({ count: sql `COUNT(*)` })
|
|
67
|
+
.from(this.table);
|
|
68
|
+
if (conditions)
|
|
69
|
+
query = query.where(conditions);
|
|
70
|
+
const result = await query;
|
|
71
|
+
return Number(result[0].count);
|
|
72
|
+
}
|
|
73
|
+
async exists(where) {
|
|
74
|
+
return (await this.count(where)) > 0;
|
|
75
|
+
}
|
|
76
|
+
buildWhere(where) {
|
|
77
|
+
const conditions = Object.entries(where).map(([key, value]) => eq(this.table[key], value));
|
|
78
|
+
return conditions.length === 1 ? conditions[0] : and(...conditions);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=drizzle-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drizzle-repository.js","sourceRoot":"","sources":["../../../src/adapters/drizzle/drizzle-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { drizzle } from "drizzle-orm/bun-sqlite";
|
|
2
|
+
import { Database } from "bun:sqlite";
|
|
3
|
+
import { BaseAdapter } from "../base/base.adapter.js";
|
|
4
|
+
import type { TransactionContext } from "../../interfaces/database-adapter.interface.js";
|
|
5
|
+
type DrizzleClient = ReturnType<typeof drizzle>;
|
|
6
|
+
export declare class DrizzleAdapter extends BaseAdapter<DrizzleClient> {
|
|
7
|
+
private sqliteDb;
|
|
8
|
+
connect(): Promise<void>;
|
|
9
|
+
disconnect(): Promise<void>;
|
|
10
|
+
runMigrations(): Promise<void>;
|
|
11
|
+
generateMigration(name: string): Promise<string>;
|
|
12
|
+
beginTransaction(): Promise<TransactionContext>;
|
|
13
|
+
commitTransaction(tx: TransactionContext): Promise<void>;
|
|
14
|
+
rollbackTransaction(tx: TransactionContext): Promise<void>;
|
|
15
|
+
getSqliteDb(): InstanceType<typeof Database> | null;
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { drizzle } from "drizzle-orm/bun-sqlite";
|
|
2
|
+
import { migrate } from "drizzle-orm/bun-sqlite/migrator";
|
|
3
|
+
import { Database } from "bun:sqlite";
|
|
4
|
+
import { BaseAdapter } from "../base/base.adapter.js";
|
|
5
|
+
import { ConnectionException, MigrationException } from "../../exceptions/database.exception.js";
|
|
6
|
+
export class DrizzleAdapter extends BaseAdapter {
|
|
7
|
+
sqliteDb = null;
|
|
8
|
+
async connect() {
|
|
9
|
+
try {
|
|
10
|
+
const filePath = this.options.url.replace(/^file:/, "");
|
|
11
|
+
this.logger.info(`Connecting to SQLite database: ${filePath}`);
|
|
12
|
+
this.sqliteDb = new Database(filePath);
|
|
13
|
+
this.sqliteDb.exec("PRAGMA journal_mode = WAL;");
|
|
14
|
+
this.client = drizzle(this.sqliteDb);
|
|
15
|
+
this.connected = true;
|
|
16
|
+
if (this.options.autoMigrate) {
|
|
17
|
+
await this.runMigrations();
|
|
18
|
+
}
|
|
19
|
+
this.logger.info("Database connected successfully");
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
this.connected = false;
|
|
23
|
+
throw new ConnectionException(`Failed to connect to database: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async disconnect() {
|
|
27
|
+
try {
|
|
28
|
+
if (this.sqliteDb) {
|
|
29
|
+
this.sqliteDb.close();
|
|
30
|
+
this.sqliteDb = null;
|
|
31
|
+
}
|
|
32
|
+
this.client = null;
|
|
33
|
+
this.connected = false;
|
|
34
|
+
this.logger.info("Database disconnected");
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
throw new ConnectionException(`Failed to disconnect: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async runMigrations() {
|
|
41
|
+
try {
|
|
42
|
+
const migrationsFolder = this.options.migrationsDir || "drizzle";
|
|
43
|
+
if (this.shouldLog("migrations")) {
|
|
44
|
+
this.logger.info(`Running migrations from ${migrationsFolder}`);
|
|
45
|
+
}
|
|
46
|
+
migrate(this.getClient(), { migrationsFolder });
|
|
47
|
+
if (this.shouldLog("migrations")) {
|
|
48
|
+
this.logger.info("Migrations completed successfully");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
throw new MigrationException(`Migration failed: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async generateMigration(name) {
|
|
56
|
+
try {
|
|
57
|
+
const schemaPath = this.options.schema || "src/schema.ts";
|
|
58
|
+
const outDir = this.options.migrationsDir || "drizzle";
|
|
59
|
+
const proc = Bun.spawnSync([
|
|
60
|
+
"bunx", "drizzle-kit", "generate",
|
|
61
|
+
`--schema=${schemaPath}`,
|
|
62
|
+
`--out=${outDir}`,
|
|
63
|
+
"--dialect=sqlite",
|
|
64
|
+
]);
|
|
65
|
+
if (proc.exitCode !== 0) {
|
|
66
|
+
throw new Error(proc.stderr.toString());
|
|
67
|
+
}
|
|
68
|
+
const migrationPath = `${outDir}/${name}`;
|
|
69
|
+
this.logger.info(`Generated migration: ${migrationPath}`);
|
|
70
|
+
return migrationPath;
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
throw new MigrationException(`Failed to generate migration: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async beginTransaction() {
|
|
77
|
+
const db = this.getClient();
|
|
78
|
+
return {
|
|
79
|
+
id: crypto.randomUUID(),
|
|
80
|
+
client: db,
|
|
81
|
+
isActive: true,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
async commitTransaction(tx) {
|
|
85
|
+
tx.isActive = false;
|
|
86
|
+
}
|
|
87
|
+
async rollbackTransaction(tx) {
|
|
88
|
+
tx.isActive = false;
|
|
89
|
+
}
|
|
90
|
+
getSqliteDb() {
|
|
91
|
+
return this.sqliteDb;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=drizzle.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drizzle.adapter.js","sourceRoot":"","sources":["../../../src/adapters/drizzle/drizzle.adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Repository, QueryOptions } from "../../interfaces/repository.interface.js";
|
|
2
|
+
export declare class PrismaRepository<T> implements Repository<T> {
|
|
3
|
+
private client;
|
|
4
|
+
private modelName;
|
|
5
|
+
private model;
|
|
6
|
+
constructor(client: any, modelName: string);
|
|
7
|
+
findAll(options?: QueryOptions): Promise<T[]>;
|
|
8
|
+
findById(id: string | number): Promise<T | null>;
|
|
9
|
+
findOne(where: Partial<T>): Promise<T | null>;
|
|
10
|
+
findMany(where: Partial<T>, options?: QueryOptions): Promise<T[]>;
|
|
11
|
+
create(data: Partial<T>): Promise<T>;
|
|
12
|
+
update(id: string | number, data: Partial<T>): Promise<T>;
|
|
13
|
+
delete(id: string | number): Promise<void>;
|
|
14
|
+
count(where?: Partial<T>): Promise<number>;
|
|
15
|
+
exists(where: Partial<T>): Promise<boolean>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export class PrismaRepository {
|
|
2
|
+
client;
|
|
3
|
+
modelName;
|
|
4
|
+
model;
|
|
5
|
+
constructor(client, modelName) {
|
|
6
|
+
this.client = client;
|
|
7
|
+
this.modelName = modelName;
|
|
8
|
+
const name = typeof modelName === "string"
|
|
9
|
+
? modelName.charAt(0).toLowerCase() + modelName.slice(1)
|
|
10
|
+
: modelName;
|
|
11
|
+
this.model = client[name];
|
|
12
|
+
if (!this.model) {
|
|
13
|
+
throw new Error(`Prisma model "${modelName}" not found. Available models: ${Object.keys(client).filter((k) => !k.startsWith("$") && !k.startsWith("_")).join(", ")}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async findAll(options) {
|
|
17
|
+
return this.model.findMany({
|
|
18
|
+
take: options?.limit,
|
|
19
|
+
skip: options?.offset,
|
|
20
|
+
orderBy: options?.orderBy
|
|
21
|
+
? Object.entries(options.orderBy).map(([field, dir]) => ({
|
|
22
|
+
[field]: dir,
|
|
23
|
+
}))
|
|
24
|
+
: undefined,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async findById(id) {
|
|
28
|
+
return this.model.findUnique({ where: { id } });
|
|
29
|
+
}
|
|
30
|
+
async findOne(where) {
|
|
31
|
+
return this.model.findFirst({ where });
|
|
32
|
+
}
|
|
33
|
+
async findMany(where, options) {
|
|
34
|
+
return this.model.findMany({
|
|
35
|
+
where,
|
|
36
|
+
take: options?.limit,
|
|
37
|
+
skip: options?.offset,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
async create(data) {
|
|
41
|
+
return this.model.create({ data });
|
|
42
|
+
}
|
|
43
|
+
async update(id, data) {
|
|
44
|
+
return this.model.update({ where: { id }, data });
|
|
45
|
+
}
|
|
46
|
+
async delete(id) {
|
|
47
|
+
await this.model.delete({ where: { id } });
|
|
48
|
+
}
|
|
49
|
+
async count(where) {
|
|
50
|
+
return this.model.count({ where });
|
|
51
|
+
}
|
|
52
|
+
async exists(where) {
|
|
53
|
+
return (await this.count(where)) > 0;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=prisma-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-repository.js","sourceRoot":"","sources":["../../../src/adapters/prisma/prisma-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BaseAdapter } from "../base/base.adapter.js";
|
|
2
|
+
import type { TransactionContext } from "../../interfaces/database-adapter.interface.js";
|
|
3
|
+
export declare class PrismaAdapter extends BaseAdapter<any> {
|
|
4
|
+
connect(): Promise<void>;
|
|
5
|
+
disconnect(): Promise<void>;
|
|
6
|
+
runMigrations(): Promise<void>;
|
|
7
|
+
generateMigration(name: string): Promise<string>;
|
|
8
|
+
beginTransaction(): Promise<TransactionContext>;
|
|
9
|
+
commitTransaction(tx: TransactionContext): Promise<void>;
|
|
10
|
+
rollbackTransaction(tx: TransactionContext): Promise<void>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { BaseAdapter } from "../base/base.adapter.js";
|
|
2
|
+
import { ConnectionException, MigrationException } from "../../exceptions/database.exception.js";
|
|
3
|
+
export class PrismaAdapter extends BaseAdapter {
|
|
4
|
+
async connect() {
|
|
5
|
+
try {
|
|
6
|
+
this.logger.info("Connecting to database via Prisma");
|
|
7
|
+
const { PrismaClient } = await import("@prisma/client");
|
|
8
|
+
this.client = new PrismaClient({
|
|
9
|
+
datasources: {
|
|
10
|
+
db: { url: this.options.url },
|
|
11
|
+
},
|
|
12
|
+
});
|
|
13
|
+
await this.client.$connect();
|
|
14
|
+
this.connected = true;
|
|
15
|
+
if (this.options.autoMigrate) {
|
|
16
|
+
await this.runMigrations();
|
|
17
|
+
}
|
|
18
|
+
this.logger.info("Database connected successfully");
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
this.connected = false;
|
|
22
|
+
throw new ConnectionException(`Failed to connect: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async disconnect() {
|
|
26
|
+
try {
|
|
27
|
+
if (this.client) {
|
|
28
|
+
await this.client.$disconnect();
|
|
29
|
+
this.client = null;
|
|
30
|
+
}
|
|
31
|
+
this.connected = false;
|
|
32
|
+
this.logger.info("Database disconnected");
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
throw new ConnectionException(`Failed to disconnect: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async runMigrations() {
|
|
39
|
+
try {
|
|
40
|
+
if (this.shouldLog("migrations")) {
|
|
41
|
+
this.logger.info("Running Prisma migrations");
|
|
42
|
+
}
|
|
43
|
+
const proc = Bun.spawnSync(["bunx", "prisma", "migrate", "deploy"]);
|
|
44
|
+
if (proc.exitCode !== 0) {
|
|
45
|
+
throw new Error(proc.stderr.toString());
|
|
46
|
+
}
|
|
47
|
+
if (this.shouldLog("migrations")) {
|
|
48
|
+
this.logger.info("Migrations completed successfully");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
throw new MigrationException(`Migration failed: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async generateMigration(name) {
|
|
56
|
+
try {
|
|
57
|
+
const proc = Bun.spawnSync([
|
|
58
|
+
"bunx", "prisma", "migrate", "dev", "--name", name,
|
|
59
|
+
]);
|
|
60
|
+
if (proc.exitCode !== 0) {
|
|
61
|
+
throw new Error(proc.stderr.toString());
|
|
62
|
+
}
|
|
63
|
+
const migrationsDir = this.options.migrationsDir || "prisma/migrations";
|
|
64
|
+
const migrationPath = `${migrationsDir}/${name}`;
|
|
65
|
+
this.logger.info(`Generated migration: ${migrationPath}`);
|
|
66
|
+
return migrationPath;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
throw new MigrationException(`Failed to generate migration: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async beginTransaction() {
|
|
73
|
+
return {
|
|
74
|
+
id: crypto.randomUUID(),
|
|
75
|
+
client: this.getClient(),
|
|
76
|
+
isActive: true,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
async commitTransaction(tx) {
|
|
80
|
+
tx.isActive = false;
|
|
81
|
+
}
|
|
82
|
+
async rollbackTransaction(tx) {
|
|
83
|
+
tx.isActive = false;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=prisma.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma.adapter.js","sourceRoot":"","sources":["../../../src/adapters/prisma/prisma.adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { loadDatabaseConfig } from "../utils/config-loader.js";
|
|
2
|
+
import { DrizzleAdapter } from "../../adapters/drizzle/drizzle.adapter.js";
|
|
3
|
+
import { PrismaAdapter } from "../../adapters/prisma/prisma.adapter.js";
|
|
4
|
+
function createAdapter(config) {
|
|
5
|
+
switch (config.adapter) {
|
|
6
|
+
case "drizzle":
|
|
7
|
+
return new DrizzleAdapter(config);
|
|
8
|
+
case "prisma":
|
|
9
|
+
return new PrismaAdapter(config);
|
|
10
|
+
default:
|
|
11
|
+
throw new Error(`Unknown adapter: ${config.adapter}`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function registerDbGenerateCommand(dbCommand) {
|
|
15
|
+
dbCommand
|
|
16
|
+
.command("generate <name>")
|
|
17
|
+
.description("Generate a new database migration")
|
|
18
|
+
.option("-c, --config <path>", "Path to config file", "cinnabun.config.ts")
|
|
19
|
+
.action(async (name, options) => {
|
|
20
|
+
try {
|
|
21
|
+
console.log(`Generating migration: ${name}`);
|
|
22
|
+
const config = await loadDatabaseConfig(options.config);
|
|
23
|
+
const adapter = createAdapter(config);
|
|
24
|
+
const migrationPath = await adapter.generateMigration(name);
|
|
25
|
+
console.log(`Migration generated: ${migrationPath}`);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
console.error(`Failed to generate migration:`, error instanceof Error ? error.message : error);
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=db-generate.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-generate.command.js","sourceRoot":"","sources":["../../../src/cli/commands/db-generate.command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAIxE,SAAS,aAAa,CAAC,MAA6B;IAClD,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,SAAS;YACZ,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QACpC,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;QACnC;YACE,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,SAAkB;IAC1D,SAAS;SACN,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,EAAE,oBAAoB,CAAC;SAC1E,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAA2B,EAAE,EAAE;QAC1D,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;YAE7C,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAE5D,OAAO,CAAC,GAAG,CAAC,wBAAwB,aAAa,EAAE,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,+BAA+B,EAC/B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { loadDatabaseConfig } from "../utils/config-loader.js";
|
|
2
|
+
import { DrizzleAdapter } from "../../adapters/drizzle/drizzle.adapter.js";
|
|
3
|
+
import { PrismaAdapter } from "../../adapters/prisma/prisma.adapter.js";
|
|
4
|
+
function createAdapter(config) {
|
|
5
|
+
switch (config.adapter) {
|
|
6
|
+
case "drizzle":
|
|
7
|
+
return new DrizzleAdapter(config);
|
|
8
|
+
case "prisma":
|
|
9
|
+
return new PrismaAdapter(config);
|
|
10
|
+
default:
|
|
11
|
+
throw new Error(`Unknown adapter: ${config.adapter}`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function registerDbMigrateCommand(dbCommand) {
|
|
15
|
+
dbCommand
|
|
16
|
+
.command("migrate")
|
|
17
|
+
.description("Run pending database migrations")
|
|
18
|
+
.option("-c, --config <path>", "Path to config file", "cinnabun.config.ts")
|
|
19
|
+
.action(async (options) => {
|
|
20
|
+
try {
|
|
21
|
+
console.log("Running migrations...");
|
|
22
|
+
const config = await loadDatabaseConfig(options.config);
|
|
23
|
+
const adapter = createAdapter(config);
|
|
24
|
+
await adapter.connect();
|
|
25
|
+
await adapter.runMigrations();
|
|
26
|
+
await adapter.disconnect();
|
|
27
|
+
console.log("Migrations completed successfully");
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
console.error(`Migration failed:`, error instanceof Error ? error.message : error);
|
|
31
|
+
process.exit(1);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=db-migrate.command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db-migrate.command.js","sourceRoot":"","sources":["../../../src/cli/commands/db-migrate.command.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAIxE,SAAS,aAAa,CAAC,MAA6B;IAClD,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,SAAS;YACZ,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;QACpC,KAAK,QAAQ;YACX,OAAO,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;QACnC;YACE,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,SAAkB;IACzD,SAAS;SACN,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,EAAE,oBAAoB,CAAC;SAC1E,MAAM,CAAC,KAAK,EAAE,OAA2B,EAAE,EAAE;QAC5C,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YAErC,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YAEtC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;YAC9B,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;YAE3B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,mBAAmB,EACnB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { registerDbGenerateCommand } from "./commands/db-generate.command.js";
|
|
2
|
+
import { registerDbMigrateCommand } from "./commands/db-migrate.command.js";
|
|
3
|
+
export function registerDatabaseCommands(program) {
|
|
4
|
+
const dbCommand = program
|
|
5
|
+
.command("db")
|
|
6
|
+
.description("Database management commands");
|
|
7
|
+
registerDbGenerateCommand(dbCommand);
|
|
8
|
+
registerDbMigrateCommand(dbCommand);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=register-db-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-db-commands.js","sourceRoot":"","sources":["../../src/cli/register-db-commands.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,MAAM,UAAU,wBAAwB,CAAC,OAAgB;IACvD,MAAM,SAAS,GAAG,OAAO;SACtB,OAAO,CAAC,IAAI,CAAC;SACb,WAAW,CAAC,8BAA8B,CAAC,CAAC;IAE/C,yBAAyB,CAAC,SAAS,CAAC,CAAC;IACrC,wBAAwB,CAAC,SAAS,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { resolve } from "path";
|
|
2
|
+
export async function loadDatabaseConfig(configPath) {
|
|
3
|
+
const fullPath = resolve(process.cwd(), configPath);
|
|
4
|
+
try {
|
|
5
|
+
const config = await import(fullPath);
|
|
6
|
+
const dbConfig = config.database ?? config.default?.database;
|
|
7
|
+
if (!dbConfig) {
|
|
8
|
+
throw new Error(`Config file must export a 'database' object with DatabaseModuleOptions. ` +
|
|
9
|
+
`Example: export const database = { adapter: "drizzle", url: "file:./data.db" }`);
|
|
10
|
+
}
|
|
11
|
+
return dbConfig;
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
if (error.code === "ERR_MODULE_NOT_FOUND" || error.code === "MODULE_NOT_FOUND") {
|
|
15
|
+
return loadFromEnv();
|
|
16
|
+
}
|
|
17
|
+
throw error;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function loadFromEnv() {
|
|
21
|
+
const adapter = process.env.DB_ADAPTER;
|
|
22
|
+
const url = process.env.DATABASE_URL;
|
|
23
|
+
if (!adapter || !url) {
|
|
24
|
+
throw new Error(`Database config not found. Either create cinnabun.config.ts with a 'database' export, ` +
|
|
25
|
+
`or set DB_ADAPTER and DATABASE_URL environment variables.`);
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
adapter,
|
|
29
|
+
url,
|
|
30
|
+
schema: process.env.DB_SCHEMA,
|
|
31
|
+
migrationsDir: process.env.DB_MIGRATIONS_DIR,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=config-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../../src/cli/utils/config-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAG/B,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAAkB;IACzD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC;QAE7D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,0EAA0E;gBAC1E,gFAAgF,CACjF,CAAC;QACJ,CAAC;QAED,OAAO,QAAiC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YAC/E,OAAO,WAAW,EAAE,CAAC;QACvB,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,WAAW;IAClB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAA8C,CAAC;IAC3E,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAErC,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,wFAAwF;YACxF,2DAA2D,CAC5D,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO;QACP,GAAG;QACH,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS;QAC7B,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;KAC7C,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AACjE,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { DatabaseModuleOptions } from "../interfaces/options.interface.js";
|
|
2
|
+
import type { DatabaseAdapter } from "../interfaces/database-adapter.interface.js";
|
|
3
|
+
import { DatabasePlugin } from "./database.plugin.js";
|
|
4
|
+
export declare class DatabaseModule {
|
|
5
|
+
static forRoot(options: DatabaseModuleOptions): {
|
|
6
|
+
new (): {};
|
|
7
|
+
};
|
|
8
|
+
static getAdapter(): DatabaseAdapter;
|
|
9
|
+
static getOptions(): DatabaseModuleOptions;
|
|
10
|
+
static createPlugin(): DatabasePlugin;
|
|
11
|
+
private static createAdapter;
|
|
12
|
+
}
|