@zudojs/database 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.
Files changed (105) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +38 -0
  3. package/dist/cache/cache.memory.d.ts.map +1 -0
  4. package/dist/cache/cache.memory.js +226 -0
  5. package/dist/cache/cache.memory.js.map +1 -0
  6. package/dist/cache/index.d.ts +7 -0
  7. package/dist/cache/index.d.ts.map +1 -0
  8. package/dist/cache/index.js +7 -0
  9. package/dist/cache/index.js.map +1 -0
  10. package/dist/database/database.core.d.ts.map +1 -0
  11. package/dist/database/index.d.ts +7 -0
  12. package/dist/database/index.d.ts.map +1 -0
  13. package/dist/database/index.js +7 -0
  14. package/dist/database/index.js.map +1 -0
  15. package/dist/databaseClient/databaseClient.core.d.ts +42 -0
  16. package/dist/databaseClient/databaseClient.core.d.ts.map +1 -0
  17. package/dist/databaseClient/databaseClient.core.js +203 -0
  18. package/dist/databaseClient/databaseClient.core.js.map +1 -0
  19. package/dist/databaseClient/databaseClient.logger.d.ts +9 -0
  20. package/dist/databaseClient/databaseClient.logger.d.ts.map +1 -0
  21. package/dist/databaseClient/databaseClient.logger.js +27 -0
  22. package/dist/databaseClient/databaseClient.logger.js.map +1 -0
  23. package/dist/databaseClient/index.d.ts +7 -0
  24. package/dist/databaseClient/index.d.ts.map +1 -0
  25. package/dist/databaseClient/index.js +7 -0
  26. package/dist/databaseClient/index.js.map +1 -0
  27. package/dist/databaseConnection/databaseConnection.manager.d.ts.map +1 -0
  28. package/dist/databaseConnection/databaseConnection.manager.js +219 -0
  29. package/dist/databaseConnection/databaseConnection.manager.js.map +1 -0
  30. package/dist/databaseConnection/index.d.ts +7 -0
  31. package/dist/databaseConnection/index.d.ts.map +1 -0
  32. package/dist/databaseConnection/index.js +7 -0
  33. package/dist/databaseConnection/index.js.map +1 -0
  34. package/dist/databaseType/index.d.ts +7 -0
  35. package/dist/databaseType/index.d.ts.map +1 -0
  36. package/dist/databaseType/index.js +7 -0
  37. package/dist/databaseType/index.js.map +1 -0
  38. package/dist/health/health.check.d.ts.map +1 -0
  39. package/dist/health/health.check.js +159 -0
  40. package/dist/health/health.check.js.map +1 -0
  41. package/dist/health/index.d.ts +7 -0
  42. package/dist/health/index.d.ts.map +1 -0
  43. package/dist/health/index.js +7 -0
  44. package/dist/health/index.js.map +1 -0
  45. package/dist/index.d.ts +36 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +49 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/locks/index.d.ts +7 -0
  50. package/dist/locks/index.d.ts.map +1 -0
  51. package/dist/locks/index.js +7 -0
  52. package/dist/locks/index.js.map +1 -0
  53. package/dist/locks/locks.core.d.ts.map +1 -0
  54. package/dist/locks/locks.core.js +204 -0
  55. package/dist/locks/locks.core.js.map +1 -0
  56. package/dist/migration/index.d.ts +7 -0
  57. package/dist/migration/index.d.ts.map +1 -0
  58. package/dist/migration/index.js +7 -0
  59. package/dist/migration/index.js.map +1 -0
  60. package/dist/migration/migration.helpers.d.ts.map +1 -0
  61. package/dist/migration/migration.runner.d.ts.map +1 -0
  62. package/dist/migration/migration.runner.js +209 -0
  63. package/dist/migration/migration.runner.js.map +1 -0
  64. package/dist/migration/migration.types.d.ts.map +1 -0
  65. package/dist/pagination/index.d.ts +7 -0
  66. package/dist/pagination/index.d.ts.map +1 -0
  67. package/dist/pagination/index.js +7 -0
  68. package/dist/pagination/index.js.map +1 -0
  69. package/dist/queryBuilder/index.d.ts +10 -0
  70. package/dist/queryBuilder/index.d.ts.map +1 -0
  71. package/dist/queryBuilder/index.js +9 -0
  72. package/dist/queryBuilder/index.js.map +1 -0
  73. package/dist/relations/index.d.ts +7 -0
  74. package/dist/relations/index.d.ts.map +1 -0
  75. package/dist/relations/index.js +7 -0
  76. package/dist/relations/index.js.map +1 -0
  77. package/dist/repository/index.d.ts +7 -0
  78. package/dist/repository/index.d.ts.map +1 -0
  79. package/dist/repository/index.js +7 -0
  80. package/dist/repository/index.js.map +1 -0
  81. package/dist/repository/repository.base.d.ts.map +1 -0
  82. package/dist/repository/repository.base.js +248 -0
  83. package/dist/repository/repository.base.js.map +1 -0
  84. package/dist/seed/index.d.ts +7 -0
  85. package/dist/seed/index.d.ts.map +1 -0
  86. package/dist/seed/index.js +7 -0
  87. package/dist/seed/index.js.map +1 -0
  88. package/dist/seed/seed.runner.d.ts.map +1 -0
  89. package/dist/seed/seed.runner.js +402 -0
  90. package/dist/seed/seed.runner.js.map +1 -0
  91. package/dist/transaction/index.d.ts +7 -0
  92. package/dist/transaction/index.d.ts.map +1 -0
  93. package/dist/transaction/index.js +7 -0
  94. package/dist/transaction/index.js.map +1 -0
  95. package/dist/transaction/transaction.core.d.ts.map +1 -0
  96. package/dist/transaction/transaction.core.js +158 -0
  97. package/dist/transaction/transaction.core.js.map +1 -0
  98. package/dist/unitOfWork/index.d.ts +7 -0
  99. package/dist/unitOfWork/index.d.ts.map +1 -0
  100. package/dist/unitOfWork/index.js +7 -0
  101. package/dist/unitOfWork/index.js.map +1 -0
  102. package/dist/unitOfWork/unitOfWork.core.d.ts.map +1 -0
  103. package/dist/unitOfWork/unitOfWork.core.js +64 -0
  104. package/dist/unitOfWork/unitOfWork.core.js.map +1 -0
  105. package/package.json +66 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Zudojs Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,38 @@
1
+ # @zudojs/database
2
+
3
+ Database abstraction layer with clients, repositories, transactions, and query building for Zudojs applications.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @zudojs/database
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```typescript
14
+ import { createDatabaseClient } from "@zudojs/database";
15
+
16
+ const client = await createDatabaseClient({
17
+ connection: { url: "postgresql://localhost/mydb" },
18
+ });
19
+
20
+ const users = await client.repository("User").findMany();
21
+ ```
22
+
23
+ ## Features
24
+
25
+ - Database-agnostic query builder
26
+ - Repository pattern with CRUD operations
27
+ - Transaction management with savepoints
28
+ - Connection pooling and health checks
29
+ - Migration runner
30
+ - Seed runner for test data
31
+ - Unit of Work pattern
32
+
33
+ ## Use Cases
34
+
35
+ - Data access layer for applications
36
+ - Multi-database support (PostgreSQL, MySQL, SQLite)
37
+ - Transaction coordination across repositories
38
+ - Database migrations and seeding
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.memory.d.ts","sourceRoot":"","sources":["../../src/cache/cache.memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,226 @@
1
+ import { DatabaseError } from "@zudojs/errors";
2
+ /**
3
+ * In-memory cache implementation for database read results.
4
+ *
5
+ * This cache is intentionally process-local. It should not be used
6
+ * where multiple application instances require shared cache state.
7
+ */
8
+ export class MemoryDatabaseCache {
9
+ entries = new Map();
10
+ hits = 0;
11
+ misses = 0;
12
+ defaultTtlMs;
13
+ constructor(options = {}) {
14
+ this.defaultTtlMs = normalizeTtl(options.ttlMs);
15
+ }
16
+ /**
17
+ * Gets a cached value.
18
+ */
19
+ get(key) {
20
+ validateKey(key);
21
+ const entry = this.entries.get(key);
22
+ if (!entry) {
23
+ this.misses += 1;
24
+ return undefined;
25
+ }
26
+ if (isExpired(entry)) {
27
+ this.entries.delete(key);
28
+ this.misses += 1;
29
+ return undefined;
30
+ }
31
+ this.hits += 1;
32
+ return entry.value;
33
+ }
34
+ /**
35
+ * Sets a cached value.
36
+ */
37
+ set(key, value, options = {}) {
38
+ validateKey(key);
39
+ const ttlMs = normalizeTtl(options.ttlMs ?? this.defaultTtlMs);
40
+ const createdAt = Date.now();
41
+ this.entries.set(key, {
42
+ value,
43
+ createdAt,
44
+ expiresAt: ttlMs === undefined ? undefined : createdAt + ttlMs,
45
+ });
46
+ }
47
+ /**
48
+ * Checks whether a valid cached value exists.
49
+ */
50
+ has(key) {
51
+ validateKey(key);
52
+ const entry = this.entries.get(key);
53
+ if (!entry) {
54
+ return false;
55
+ }
56
+ if (isExpired(entry)) {
57
+ this.entries.delete(key);
58
+ return false;
59
+ }
60
+ return true;
61
+ }
62
+ /**
63
+ * Deletes a cache entry.
64
+ */
65
+ delete(key) {
66
+ validateKey(key);
67
+ return this.entries.delete(key);
68
+ }
69
+ /**
70
+ * Clears the entire cache.
71
+ */
72
+ clear() {
73
+ this.entries.clear();
74
+ }
75
+ /**
76
+ * Removes expired entries.
77
+ */
78
+ prune() {
79
+ let removed = 0;
80
+ for (const [key, entry] of this.entries) {
81
+ if (isExpired(entry)) {
82
+ this.entries.delete(key);
83
+ removed += 1;
84
+ }
85
+ }
86
+ return removed;
87
+ }
88
+ /**
89
+ * Returns the number of valid entries.
90
+ */
91
+ get size() {
92
+ this.prune();
93
+ return this.entries.size;
94
+ }
95
+ /**
96
+ * Returns cache statistics.
97
+ */
98
+ getStats() {
99
+ this.prune();
100
+ const total = this.hits + this.misses;
101
+ return {
102
+ size: this.entries.size,
103
+ hits: this.hits,
104
+ misses: this.misses,
105
+ hitRate: total === 0 ? 0 : this.hits / total,
106
+ };
107
+ }
108
+ /**
109
+ * Resets hit/miss counters.
110
+ */
111
+ resetStats() {
112
+ this.hits = 0;
113
+ this.misses = 0;
114
+ }
115
+ /**
116
+ * Returns all currently valid cache keys.
117
+ */
118
+ keys() {
119
+ this.prune();
120
+ return Object.freeze([...this.entries.keys()]);
121
+ }
122
+ }
123
+ /**
124
+ * Creates an in-memory database cache.
125
+ */
126
+ export function createDatabaseCache(options = {}) {
127
+ return new MemoryDatabaseCache(options);
128
+ }
129
+ /**
130
+ * Builds a stable cache key from a namespace and parts.
131
+ */
132
+ export function createCacheKey(namespace, ...parts) {
133
+ validateKey(namespace);
134
+ return [namespace, ...parts.map(serializeCachePart)].join(":");
135
+ }
136
+ /**
137
+ * Serializes a cache key component deterministically.
138
+ */
139
+ export function serializeCachePart(value) {
140
+ if (value === null) {
141
+ return "null";
142
+ }
143
+ if (value === undefined) {
144
+ return "undefined";
145
+ }
146
+ if (typeof value === "string" ||
147
+ typeof value === "number" ||
148
+ typeof value === "boolean" ||
149
+ typeof value === "bigint") {
150
+ return String(value);
151
+ }
152
+ if (value instanceof Date) {
153
+ return value.toISOString();
154
+ }
155
+ try {
156
+ return JSON.stringify(value, Object.keys(value).sort());
157
+ }
158
+ catch (error) {
159
+ throw new DatabaseError("Unable to serialize database cache key.", {
160
+ cause: error,
161
+ });
162
+ }
163
+ }
164
+ /**
165
+ * Wraps a cache around an asynchronous loader.
166
+ */
167
+ export async function getOrSet(cache, key, loader, options) {
168
+ validateKey(key);
169
+ if (typeof loader !== "function") {
170
+ throw new TypeError("A cache loader function is required.");
171
+ }
172
+ const cached = cache.get(key);
173
+ if (cached !== undefined) {
174
+ return cached;
175
+ }
176
+ const value = await loader();
177
+ cache.set(key, value, options);
178
+ return value;
179
+ }
180
+ /**
181
+ * Invalidates all entries whose keys start with a prefix.
182
+ *
183
+ * This is useful when a write invalidates a group of related reads.
184
+ */
185
+ export function invalidateByPrefix(cache, prefix) {
186
+ validateKey(prefix);
187
+ let removed = 0;
188
+ for (const key of cache.keys()) {
189
+ if (key.startsWith(prefix)) {
190
+ if (cache.delete(key)) {
191
+ removed += 1;
192
+ }
193
+ }
194
+ }
195
+ return removed;
196
+ }
197
+ /**
198
+ * Checks whether a cache entry has expired.
199
+ */
200
+ function isExpired(entry) {
201
+ return entry.expiresAt !== undefined && entry.expiresAt <= Date.now();
202
+ }
203
+ /**
204
+ * Normalizes a TTL value.
205
+ */
206
+ function normalizeTtl(ttlMs) {
207
+ if (ttlMs === undefined) {
208
+ return undefined;
209
+ }
210
+ if (!Number.isFinite(ttlMs)) {
211
+ throw new TypeError("Cache TTL must be a finite number.");
212
+ }
213
+ if (ttlMs < 0) {
214
+ throw new TypeError("Cache TTL cannot be negative.");
215
+ }
216
+ return Math.floor(ttlMs);
217
+ }
218
+ /**
219
+ * Validates a cache key.
220
+ */
221
+ function validateKey(key) {
222
+ if (typeof key !== "string" || key.trim().length === 0) {
223
+ throw new TypeError("A non-empty cache key is required.");
224
+ }
225
+ }
226
+ //# sourceMappingURL=cache.memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.memory.js","sourceRoot":"","sources":["../../src/cache/cache.memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @zudojs/database — Database Cache
3
+ *
4
+ * In-memory cache for database read results.
5
+ */
6
+ export { MemoryDatabaseCache, createDatabaseCache, createCacheKey, serializeCachePart, getOrSet, invalidateByPrefix, type CacheEntry, type CacheOptions, type CacheStats, type DatabaseCache, } from "./cache.memory.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,kBAAkB,EAClB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,aAAa,GACnB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @zudojs/database — Database Cache
3
+ *
4
+ * In-memory cache for database read results.
5
+ */
6
+ export { MemoryDatabaseCache, createDatabaseCache, createCacheKey, serializeCachePart, getOrSet, invalidateByPrefix, } from "./cache.memory.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,kBAAkB,GAKnB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.core.d.ts","sourceRoot":"","sources":["../../src/database/database.core.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,KAAK,0BAA0B,EAChC,MAAM,0CAA0C,CAAC;AAElD,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,sCAAsC,CAAC;AAE9C;;;;;;GAMG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IAExC,YAAY,OAAO,GAAE,qBAA0B,EAE9C;IAED;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpC;IAED;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAEvC;IAED;;OAEG;IACU,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAE5C;IAED;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAEjC;IAED;;OAEG;IACI,SAAS,IAAI,cAAc,CAEjC;IAED;;OAEG;IACU,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC,CAElD;IAED;;OAEG;IACU,WAAW,CAAC,OAAO,EAC9B,QAAQ,EAAE,mBAAmB,CAAC,0BAA0B,EAAE,OAAO,CAAC,EAClE,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,OAAO,CAAC,CAElB;IAED;;;;;OAKG;IACI,SAAS,IAAI,cAAc,CAEjC;IAED;;OAEG;IACI,SAAS,wEAEf;IAED;;OAEG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpC;CACF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,QAAQ,CAE5E;AAUD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,qBAA0B,GAAG,QAAQ,CAMzE;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,QAAQ,CAAC,CAMnB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAMxD;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAQnD"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @zudojs/database — Database Facade
3
+ *
4
+ * High-level database lifecycle entry point.
5
+ */
6
+ export { Database, createDatabase, getDatabase, connectDatabase, disconnectDatabase, resetDatabase, } from "./database.core.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,QAAQ,EACR,cAAc,EACd,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,aAAa,GACd,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @zudojs/database — Database Facade
3
+ *
4
+ * High-level database lifecycle entry point.
5
+ */
6
+ export { Database, createDatabase, getDatabase, connectDatabase, disconnectDatabase, resetDatabase, } from "./database.core.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,QAAQ,EACR,cAAc,EACd,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,aAAa,GACd,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @zudojs/database — Database Client Core
3
+ *
4
+ * Prisma-backed database client implementation.
5
+ */
6
+ import { PrismaClient, Prisma } from "@prisma/client";
7
+ import type { DatabaseClient as DatabaseClientContract, DatabaseConnectionOptions, DatabaseHealth, DatabaseLogger, DatabaseStatus, TransactionCallback, TransactionOptions } from "../databaseType/databaseType.type.js";
8
+ export type PrismaClientLike = PrismaClient;
9
+ export interface DatabaseClientOptions extends DatabaseConnectionOptions {
10
+ readonly logger?: DatabaseLogger;
11
+ readonly prisma?: PrismaClientLike;
12
+ }
13
+ export type DatabaseTransactionContext = Prisma.TransactionClient;
14
+ /** Prisma-backed database client. */
15
+ export declare class DatabaseClient implements DatabaseClientContract<DatabaseTransactionContext> {
16
+ private readonly prisma;
17
+ private readonly logger;
18
+ private readonly options;
19
+ private status;
20
+ private connectedAt?;
21
+ constructor(options?: DatabaseClientOptions);
22
+ getPrisma(): PrismaClientLike;
23
+ connect(): Promise<void>;
24
+ disconnect(): Promise<void>;
25
+ ping(): Promise<void>;
26
+ getStatus(): DatabaseStatus;
27
+ getConnectedAt(): Date | undefined;
28
+ healthCheck(): Promise<DatabaseHealth>;
29
+ transaction<TResult>(callback: TransactionCallback<DatabaseTransactionContext, TResult>, options?: TransactionOptions): Promise<TResult>;
30
+ executeRaw(query: Prisma.Sql): Promise<number>;
31
+ queryRaw<TResult = unknown>(query: Prisma.Sql): Promise<TResult>;
32
+ ensureConnected(): Promise<void>;
33
+ destroy(): Promise<void>;
34
+ private registerQueryLogging;
35
+ private buildTransactionOptions;
36
+ private mapIsolationLevel;
37
+ private withTimeout;
38
+ private normalizeError;
39
+ }
40
+ /** Creates a database client. */
41
+ export declare function createDatabaseClient(options?: DatabaseClientOptions): DatabaseClient;
42
+ //# sourceMappingURL=databaseClient.core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"databaseClient.core.d.ts","sourceRoot":"","sources":["../../src/databaseClient/databaseClient.core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAEtD,OAAO,KAAK,EACV,cAAc,IAAI,sBAAsB,EACxC,yBAAyB,EACzB,cAAc,EACd,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,sCAAsC,CAAC;AAG9C,MAAM,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAE5C,MAAM,WAAW,qBAAsB,SAAQ,yBAAyB;IACtE,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;CACpC;AAED,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAElE,qCAAqC;AACrC,qBAAa,cAAe,YAAW,sBAAsB,CAAC,0BAA0B,CAAC;IACvF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,WAAW,CAAC,CAAO;IAE3B,YAAY,OAAO,GAAE,qBAA0B,EAe9C;IAEM,SAAS,IAAI,gBAAgB,CAEnC;IAEY,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAqBpC;IAEY,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBvC;IAEY,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAOjC;IAEM,SAAS,IAAI,cAAc,CAEjC;IACM,cAAc,IAAI,IAAI,GAAG,SAAS,CAExC;IAEY,WAAW,IAAI,OAAO,CAAC,cAAc,CAAC,CAqBlD;IAEY,WAAW,CAAC,OAAO,EAC9B,QAAQ,EAAE,mBAAmB,CAAC,0BAA0B,EAAE,OAAO,CAAC,EAClE,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,OAAO,CAAC,CAkBlB;IAEY,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAO1D;IAEY,QAAQ,CAAC,OAAO,GAAG,OAAO,EACrC,KAAK,EAAE,MAAM,CAAC,GAAG,GAChB,OAAO,CAAC,OAAO,CAAC,CAOlB;IAEY,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAE5C;IAEY,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpC;IAED,OAAO,CAAC,oBAAoB;IAqB5B,OAAO,CAAC,uBAAuB;IAU/B,OAAO,CAAC,iBAAiB;YAmBX,WAAW;IAmBzB,OAAO,CAAC,cAAc;CAUvB;AAED,iCAAiC;AACjC,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,qBAA0B,GAClC,cAAc,CAEhB"}
@@ -0,0 +1,203 @@
1
+ /**
2
+ * @zudojs/database — Database Client Core
3
+ *
4
+ * Prisma-backed database client implementation.
5
+ */
6
+ import { PrismaClient, Prisma } from "@prisma/client";
7
+ import { DatabaseError } from "@zudojs/errors";
8
+ import { createDefaultLogger } from "./databaseClient.logger.js";
9
+ /** Prisma-backed database client. */
10
+ export class DatabaseClient {
11
+ prisma;
12
+ logger;
13
+ options;
14
+ status = "disconnected";
15
+ connectedAt;
16
+ constructor(options = {}) {
17
+ this.options = options;
18
+ this.logger = options.logger ?? createDefaultLogger();
19
+ this.prisma =
20
+ options.prisma ??
21
+ new PrismaClient({
22
+ log: options.logging
23
+ ? [
24
+ { emit: "event", level: "query" },
25
+ { emit: "stdout", level: "error" },
26
+ { emit: "stdout", level: "warn" },
27
+ ]
28
+ : [{ emit: "stdout", level: "error" }],
29
+ });
30
+ this.registerQueryLogging();
31
+ }
32
+ getPrisma() {
33
+ return this.prisma;
34
+ }
35
+ async connect() {
36
+ if (this.status === "connected" || this.status === "connecting")
37
+ return;
38
+ this.status = "connecting";
39
+ try {
40
+ await this.withTimeout(this.prisma.$connect(), this.options.connectionTimeoutMs ?? 10_000, "Database connection timed out.");
41
+ this.status = "connected";
42
+ this.connectedAt = new Date();
43
+ this.logger.info("Database connected.");
44
+ }
45
+ catch (error) {
46
+ this.status = "error";
47
+ const normalized = this.normalizeError(error, "Database connection failed.");
48
+ this.logger.error(normalized.message, normalized);
49
+ throw normalized;
50
+ }
51
+ }
52
+ async disconnect() {
53
+ if (this.status === "disconnected")
54
+ return;
55
+ this.status = "disconnecting";
56
+ try {
57
+ await this.prisma.$disconnect();
58
+ this.status = "disconnected";
59
+ this.connectedAt = undefined;
60
+ this.logger.info("Database disconnected.");
61
+ }
62
+ catch (error) {
63
+ this.status = "error";
64
+ const normalized = this.normalizeError(error, "Database disconnection failed.");
65
+ this.logger.error(normalized.message, normalized);
66
+ throw normalized;
67
+ }
68
+ }
69
+ async ping() {
70
+ try {
71
+ await this.prisma.$queryRaw `SELECT 1`;
72
+ }
73
+ catch (error) {
74
+ this.status = "error";
75
+ throw this.normalizeError(error, "Database ping failed.");
76
+ }
77
+ }
78
+ getStatus() {
79
+ return this.status;
80
+ }
81
+ getConnectedAt() {
82
+ return this.connectedAt;
83
+ }
84
+ async healthCheck() {
85
+ const startedAt = Date.now();
86
+ try {
87
+ await this.ping();
88
+ return {
89
+ status: "connected",
90
+ latencyMs: Date.now() - startedAt,
91
+ checkedAt: new Date(),
92
+ };
93
+ }
94
+ catch (error) {
95
+ const normalized = this.normalizeError(error, "Database health check failed.");
96
+ return {
97
+ status: "error",
98
+ latencyMs: Date.now() - startedAt,
99
+ checkedAt: new Date(),
100
+ error: normalized.message,
101
+ };
102
+ }
103
+ }
104
+ async transaction(callback, options = {}) {
105
+ if (typeof callback !== "function")
106
+ throw new TypeError("A transaction callback is required.");
107
+ await this.ensureConnected();
108
+ const transactionOptions = this.buildTransactionOptions(options);
109
+ try {
110
+ return await this.prisma.$transaction(async (transaction) => callback(transaction), transactionOptions);
111
+ }
112
+ catch (error) {
113
+ const normalized = this.normalizeError(error, "Database transaction failed.");
114
+ this.logger.error(normalized.message, normalized);
115
+ throw normalized;
116
+ }
117
+ }
118
+ async executeRaw(query) {
119
+ await this.ensureConnected();
120
+ try {
121
+ return await this.prisma.$executeRaw(query);
122
+ }
123
+ catch (error) {
124
+ throw this.normalizeError(error, "Raw database execution failed.");
125
+ }
126
+ }
127
+ async queryRaw(query) {
128
+ await this.ensureConnected();
129
+ try {
130
+ return (await this.prisma.$queryRaw(query));
131
+ }
132
+ catch (error) {
133
+ throw this.normalizeError(error, "Raw database query failed.");
134
+ }
135
+ }
136
+ async ensureConnected() {
137
+ if (this.status !== "connected")
138
+ await this.connect();
139
+ }
140
+ async destroy() {
141
+ await this.disconnect();
142
+ }
143
+ registerQueryLogging() {
144
+ if (!this.options.logging)
145
+ return;
146
+ const prisma = this.prisma;
147
+ prisma.$on?.("query", (event) => {
148
+ this.logger.debug("Database query executed.", {
149
+ durationMs: event.duration,
150
+ target: event.target,
151
+ });
152
+ });
153
+ }
154
+ buildTransactionOptions(options) {
155
+ return {
156
+ maxWait: options.maxWaitMs,
157
+ timeout: options.timeoutMs,
158
+ isolationLevel: options.isolationLevel
159
+ ? this.mapIsolationLevel(options.isolationLevel)
160
+ : undefined,
161
+ };
162
+ }
163
+ mapIsolationLevel(level) {
164
+ switch (level) {
165
+ case "ReadUncommitted":
166
+ return Prisma.TransactionIsolationLevel.ReadUncommitted;
167
+ case "ReadCommitted":
168
+ return Prisma.TransactionIsolationLevel.ReadCommitted;
169
+ case "RepeatableRead":
170
+ return Prisma.TransactionIsolationLevel.RepeatableRead;
171
+ case "Serializable":
172
+ return Prisma.TransactionIsolationLevel.Serializable;
173
+ default:
174
+ throw new TypeError(`Unsupported transaction isolation level: ${String(level)}`);
175
+ }
176
+ }
177
+ async withTimeout(promise, timeoutMs, message) {
178
+ if (timeoutMs <= 0)
179
+ return promise;
180
+ let timer;
181
+ const timeout = new Promise((_, reject) => {
182
+ timer = setTimeout(() => {
183
+ reject(new DatabaseError(message));
184
+ }, timeoutMs);
185
+ });
186
+ try {
187
+ return await Promise.race([promise, timeout]);
188
+ }
189
+ finally {
190
+ clearTimeout(timer);
191
+ }
192
+ }
193
+ normalizeError(error, fallbackMessage) {
194
+ if (error instanceof DatabaseError)
195
+ return error;
196
+ return new DatabaseError(error instanceof Error ? error.message : fallbackMessage, { cause: error });
197
+ }
198
+ }
199
+ /** Creates a database client. */
200
+ export function createDatabaseClient(options = {}) {
201
+ return new DatabaseClient(options);
202
+ }
203
+ //# sourceMappingURL=databaseClient.core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"databaseClient.core.js","sourceRoot":"","sources":["../../src/databaseClient/databaseClient.core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @zudojs/database — Default Logger
3
+ *
4
+ * Minimal logger for environments where no application logger has been configured yet.
5
+ */
6
+ import type { DatabaseLogger } from "../databaseType/databaseType.type.js";
7
+ /** Creates a minimal logger for environments where no application logger has been configured yet. */
8
+ export declare function createDefaultLogger(): DatabaseLogger;
9
+ //# sourceMappingURL=databaseClient.logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"databaseClient.logger.d.ts","sourceRoot":"","sources":["../../src/databaseClient/databaseClient.logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAE3E,qGAAqG;AACrG,wBAAgB,mBAAmB,IAAI,cAAc,CAmBpD"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @zudojs/database — Default Logger
3
+ *
4
+ * Minimal logger for environments where no application logger has been configured yet.
5
+ */
6
+ /** Creates a minimal logger for environments where no application logger has been configured yet. */
7
+ export function createDefaultLogger() {
8
+ return {
9
+ debug: (message, metadata) => {
10
+ if (process.env.NODE_ENV !== "production") {
11
+ console.debug(message, metadata);
12
+ }
13
+ },
14
+ info: (message, metadata) => {
15
+ if (process.env.NODE_ENV !== "production") {
16
+ console.info(message, metadata);
17
+ }
18
+ },
19
+ warn: (message, metadata) => {
20
+ console.warn(message, metadata);
21
+ },
22
+ error: (message, error, metadata) => {
23
+ console.error(message, error, metadata);
24
+ },
25
+ };
26
+ }
27
+ //# sourceMappingURL=databaseClient.logger.js.map