@zudojs/database 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +47 -0
  2. package/dist/cache/cache.memory.d.ts +0 -1
  3. package/dist/cache/cache.memory.js +0 -1
  4. package/dist/cache/index.d.ts +0 -1
  5. package/dist/cache/index.js +0 -1
  6. package/dist/database/database.core.d.ts +0 -1
  7. package/dist/database/database.core.js +0 -1
  8. package/dist/database/index.d.ts +0 -1
  9. package/dist/database/index.js +0 -1
  10. package/dist/databaseClient/databaseClient.core.d.ts +0 -1
  11. package/dist/databaseClient/databaseClient.core.js +0 -1
  12. package/dist/databaseClient/databaseClient.errors.d.ts +19 -2
  13. package/dist/databaseClient/databaseClient.errors.js +8 -1
  14. package/dist/databaseClient/databaseClient.logger.d.ts +0 -1
  15. package/dist/databaseClient/databaseClient.logger.js +0 -1
  16. package/dist/databaseClient/databaseClient.type.d.ts +0 -1
  17. package/dist/databaseClient/databaseClient.type.js +0 -1
  18. package/dist/databaseClient/index.d.ts +1 -2
  19. package/dist/databaseClient/index.js +1 -2
  20. package/dist/databaseConnection/databaseConnection.manager.d.ts +0 -1
  21. package/dist/databaseConnection/databaseConnection.manager.js +0 -1
  22. package/dist/databaseConnection/index.d.ts +0 -1
  23. package/dist/databaseConnection/index.js +0 -1
  24. package/dist/databaseType/databaseType.type.d.ts +6 -5
  25. package/dist/databaseType/databaseType.type.js +0 -1
  26. package/dist/databaseType/index.d.ts +0 -1
  27. package/dist/databaseType/index.js +0 -1
  28. package/dist/health/health.check.d.ts +0 -1
  29. package/dist/health/health.check.js +0 -1
  30. package/dist/health/index.d.ts +0 -1
  31. package/dist/health/index.js +0 -1
  32. package/dist/index.d.ts +3 -4
  33. package/dist/index.js +2 -3
  34. package/dist/locks/index.d.ts +0 -1
  35. package/dist/locks/index.js +0 -1
  36. package/dist/locks/locks.core.d.ts +0 -1
  37. package/dist/locks/locks.core.js +0 -1
  38. package/dist/migration/index.d.ts +0 -1
  39. package/dist/migration/index.js +0 -1
  40. package/dist/migration/migration.dialect.d.ts +0 -1
  41. package/dist/migration/migration.dialect.js +0 -1
  42. package/dist/migration/migration.helpers.d.ts +0 -1
  43. package/dist/migration/migration.helpers.js +4 -1
  44. package/dist/migration/migration.runner.d.ts +12 -1
  45. package/dist/migration/migration.runner.js +69 -17
  46. package/dist/migration/migration.types.d.ts +12 -1
  47. package/dist/migration/migration.types.js +0 -1
  48. package/dist/pagination/index.d.ts +1 -1
  49. package/dist/pagination/index.js +1 -1
  50. package/dist/pagination/pagination.core.d.ts +0 -1
  51. package/dist/pagination/pagination.core.js +0 -1
  52. package/dist/pagination/pagination.cursorError.d.ts +0 -1
  53. package/dist/pagination/pagination.cursorError.js +0 -1
  54. package/dist/pagination/pagination.keyset.d.ts +12 -1
  55. package/dist/pagination/pagination.keyset.js +15 -3
  56. package/dist/pagination/pagination.keysetDirection.d.ts +0 -1
  57. package/dist/pagination/pagination.keysetDirection.js +0 -1
  58. package/dist/pagination/pagination.keysetValue.d.ts +37 -0
  59. package/dist/pagination/pagination.keysetValue.js +55 -0
  60. package/dist/queryBuilder/index.d.ts +0 -1
  61. package/dist/queryBuilder/index.js +0 -1
  62. package/dist/queryBuilder/queryBuilder.core.d.ts +0 -1
  63. package/dist/queryBuilder/queryBuilder.core.js +0 -1
  64. package/dist/queryBuilder/queryBuilder.factory.d.ts +0 -1
  65. package/dist/queryBuilder/queryBuilder.factory.js +0 -1
  66. package/dist/queryBuilder/queryBuilder.filter.d.ts +0 -1
  67. package/dist/queryBuilder/queryBuilder.filter.js +0 -1
  68. package/dist/queryBuilder/queryBuilder.prisma.d.ts +0 -1
  69. package/dist/queryBuilder/queryBuilder.prisma.js +0 -1
  70. package/dist/queryBuilder/queryBuilder.type.d.ts +0 -1
  71. package/dist/queryBuilder/queryBuilder.type.js +0 -1
  72. package/dist/relations/index.d.ts +0 -1
  73. package/dist/relations/index.js +0 -1
  74. package/dist/relations/relations.definition.d.ts +0 -1
  75. package/dist/relations/relations.definition.js +0 -1
  76. package/dist/repository/index.d.ts +1 -2
  77. package/dist/repository/index.js +0 -1
  78. package/dist/repository/repository.base.d.ts +27 -1
  79. package/dist/repository/repository.base.js +13 -2
  80. package/dist/repository/repository.delegate.d.ts +0 -1
  81. package/dist/repository/repository.delegate.js +0 -1
  82. package/dist/repository/repository.errors.d.ts +3 -1
  83. package/dist/repository/repository.errors.js +17 -2
  84. package/dist/seed/index.d.ts +0 -1
  85. package/dist/seed/index.js +0 -1
  86. package/dist/seed/seed.runner.d.ts +0 -1
  87. package/dist/seed/seed.runner.js +0 -1
  88. package/dist/transaction/index.d.ts +0 -1
  89. package/dist/transaction/index.js +0 -1
  90. package/dist/transaction/transaction.backoff.d.ts +0 -1
  91. package/dist/transaction/transaction.backoff.js +0 -1
  92. package/dist/transaction/transaction.core.d.ts +16 -3
  93. package/dist/transaction/transaction.core.js +8 -2
  94. package/dist/unitOfWork/index.d.ts +0 -1
  95. package/dist/unitOfWork/index.js +0 -1
  96. package/dist/unitOfWork/unitOfWork.core.d.ts +0 -1
  97. package/dist/unitOfWork/unitOfWork.core.js +0 -1
  98. package/package.json +4 -4
@@ -1,5 +1,5 @@
1
1
  import { DatabaseError, DatabaseOperation, ErrorCode, } from "@zudojs/errors";
2
- import { isDatabaseErrorLike } from "../databaseClient/databaseClient.errors.js";
2
+ import { getPrismaCodeMapping, isDatabaseErrorLike, } from "../databaseClient/databaseClient.errors.js";
3
3
  const PRISMA_CODE_PATTERN = /^P\d{4}$/;
4
4
  /**
5
5
  * Determines whether a value looks like a Prisma known request error.
@@ -53,6 +53,9 @@ export function toDatabaseOperation(operation) {
53
53
  * - `P2034` serialization failure → `ERR_DATABASE_TRANSACTION` / 409 (retryable)
54
54
  * - `P2024` pool timeout → `ERR_DATABASE_TIMEOUT` / 503
55
55
  * - `P1xxx` connection failures → `ERR_DATABASE_CONNECTION` / 503
56
+ * - every other code `normalizeDatabaseError` knows (`P2000` value too
57
+ * long / 400, `P2004` constraint / 409, `P2011` null / 400, `P2014`,
58
+ * `P2015`, `P2018`, `P2028`) → the same status, code and exposure
56
59
  *
57
60
  * Existing `DatabaseError`s are returned unchanged.
58
61
  */
@@ -139,6 +142,16 @@ export function mapRepositoryError(error, context) {
139
142
  statusCode: 503,
140
143
  });
141
144
  }
145
+ const mapping = getPrismaCodeMapping(error.code);
146
+ if (mapping !== undefined) {
147
+ return new DatabaseError(`${context.model} ${context.operation} failed: ${lowerFirst(mapping.message)}`, {
148
+ ...options,
149
+ code: mapping.code,
150
+ statusCode: mapping.statusCode,
151
+ expose: mapping.expose,
152
+ metadata: { ...metadata, kind: mapping.kind },
153
+ });
154
+ }
142
155
  return new DatabaseError(`${context.model} ${context.operation} failed.`, {
143
156
  ...options,
144
157
  code: ErrorCode.DATABASE_QUERY,
@@ -222,6 +235,9 @@ function toMetadataValue(value) {
222
235
  }
223
236
  return String(value);
224
237
  }
238
+ function lowerFirst(value) {
239
+ return value.length === 0 ? value : value[0].toLowerCase() + value.slice(1);
240
+ }
225
241
  function extractTarget(meta) {
226
242
  const target = meta?.["target"];
227
243
  if (typeof target === "string") {
@@ -232,4 +248,3 @@ function extractTarget(meta) {
232
248
  }
233
249
  return undefined;
234
250
  }
235
- //# sourceMappingURL=repository.errors.js.map
@@ -4,4 +4,3 @@
4
4
  * Database seed runner with execution tracking (PostgreSQL).
5
5
  */
6
6
  export { SeedRunner, createSeedRunner, normalizeSeeds, validateSeed, DEFAULT_SEED_TABLE, DEFAULT_SEED_LOCK, type Seed, type SeedRecord, type SeedResult, type SeedStatus, type SeedRunnerOptions, } from "./seed.runner.js";
7
- //# sourceMappingURL=index.d.ts.map
@@ -4,4 +4,3 @@
4
4
  * Database seed runner with execution tracking (PostgreSQL).
5
5
  */
6
6
  export { SeedRunner, createSeedRunner, normalizeSeeds, validateSeed, DEFAULT_SEED_TABLE, DEFAULT_SEED_LOCK, } from "./seed.runner.js";
7
- //# sourceMappingURL=index.js.map
@@ -160,4 +160,3 @@ export declare function normalizeSeeds<TTransaction extends DatabaseTransactionC
160
160
  * Validates one seed definition.
161
161
  */
162
162
  export declare function validateSeed<TTransaction extends DatabaseTransactionContext = DatabaseTransactionContext>(seed: Seed<TTransaction>): void;
163
- //# sourceMappingURL=seed.runner.d.ts.map
@@ -368,4 +368,3 @@ function validateSeedName(name) {
368
368
  throw new TypeError("Seed name cannot exceed 255 characters.");
369
369
  }
370
370
  }
371
- //# sourceMappingURL=seed.runner.js.map
@@ -4,4 +4,3 @@
4
4
  * Managed transaction execution with retry support.
5
5
  */
6
6
  export { TransactionManager, createTransactionManager, withTransaction, withTransactionRetry, createTransactionContext, createTransactionId, getTransactionContextFromError, isTransactionActive, isTransactionCommitted, isTransactionFailed, type TransactionStatus, type TransactionContext, type TransactionOutcome, type TransactionRetryOptions, type ManagedTransactionOptions, } from "./transaction.core.js";
7
- //# sourceMappingURL=index.d.ts.map
@@ -4,4 +4,3 @@
4
4
  * Managed transaction execution with retry support.
5
5
  */
6
6
  export { TransactionManager, createTransactionManager, withTransaction, withTransactionRetry, createTransactionContext, createTransactionId, getTransactionContextFromError, isTransactionActive, isTransactionCommitted, isTransactionFailed, } from "./transaction.core.js";
7
- //# sourceMappingURL=index.js.map
@@ -30,4 +30,3 @@ export interface RetryDelayOptions {
30
30
  * @returns A finite delay in `[0, min(maxRetryDelayMs, 2^31-1)]`.
31
31
  */
32
32
  export declare function computeRetryDelay(attempt: number, options: RetryDelayOptions): number;
33
- //# sourceMappingURL=transaction.backoff.d.ts.map
@@ -29,4 +29,3 @@ export function computeRetryDelay(attempt, options) {
29
29
  const random = options.random ?? Math.random;
30
30
  return Math.floor(random() * (capped + 1));
31
31
  }
32
- //# sourceMappingURL=transaction.backoff.js.map
@@ -5,7 +5,14 @@ import type { TransactionIsolationLevel, TransactionOptions } from "../databaseT
5
5
  */
6
6
  export type TransactionStatus = "idle" | "active" | "committed" | "rolled-back" | "failed";
7
7
  /**
8
- * Runtime transaction information.
8
+ * Runtime transaction information: the immutable status record
9
+ * `TransactionManager.run` reports in its `TransactionOutcome` and attaches
10
+ * to failures (see `getTransactionContextFromError`).
11
+ *
12
+ * Not the `TransactionContext` of `@zudojs/transactions`, which is the
13
+ * AsyncLocalStorage store its manager propagates transactions through.
14
+ * The two packages share the name but not the concept; import from the
15
+ * package whose manager you use.
9
16
  */
10
17
  export interface TransactionContext {
11
18
  readonly transactionId: string;
@@ -117,7 +124,14 @@ export declare function withTransaction<TResult, TTransaction extends DatabaseTr
117
124
  */
118
125
  export declare function withTransactionRetry<TResult, TTransaction extends DatabaseTransactionContext = DatabaseTransactionContext>(client: DatabaseClient<TTransaction>, callback: (transaction: TTransaction, context: TransactionContext) => Promise<TResult>, options?: TransactionRetryOptions): Promise<TResult>;
119
126
  /**
120
- * Creates an immutable transaction context.
127
+ * Creates an immutable transaction status record (see
128
+ * {@link TransactionContext}), as `TransactionManager.run` does for every
129
+ * transaction it opens.
130
+ *
131
+ * Unrelated to `createTransactionContext` from `@zudojs/transactions`,
132
+ * which creates the AsyncLocalStorage propagation store that package's
133
+ * manager runs callbacks in. This one holds no transaction and propagates
134
+ * nothing; it is data for logging and error reporting.
121
135
  */
122
136
  export declare function createTransactionContext(options?: ManagedTransactionOptions): TransactionContext;
123
137
  /**
@@ -137,4 +151,3 @@ export declare function isTransactionCommitted(context: TransactionContext): boo
137
151
  * Determines whether a transaction failed.
138
152
  */
139
153
  export declare function isTransactionFailed(context: TransactionContext): boolean;
140
- //# sourceMappingURL=transaction.core.d.ts.map
@@ -123,7 +123,14 @@ export async function withTransactionRetry(client, callback, options = {}) {
123
123
  }
124
124
  }
125
125
  /**
126
- * Creates an immutable transaction context.
126
+ * Creates an immutable transaction status record (see
127
+ * {@link TransactionContext}), as `TransactionManager.run` does for every
128
+ * transaction it opens.
129
+ *
130
+ * Unrelated to `createTransactionContext` from `@zudojs/transactions`,
131
+ * which creates the AsyncLocalStorage propagation store that package's
132
+ * manager runs callbacks in. This one holds no transaction and propagates
133
+ * nothing; it is data for logging and error reporting.
127
134
  */
128
135
  export function createTransactionContext(options = {}) {
129
136
  return Object.freeze({
@@ -204,4 +211,3 @@ function sleep(milliseconds) {
204
211
  setTimeout(resolve, milliseconds);
205
212
  });
206
213
  }
207
- //# sourceMappingURL=transaction.core.js.map
@@ -4,4 +4,3 @@
4
4
  * Groups multiple repository operations into a single transaction.
5
5
  */
6
6
  export { DatabaseUnitOfWork, createUnitOfWork, executeUnitOfWork, type UnitOfWork, type UnitOfWorkOptions, } from "./unitOfWork.core.js";
7
- //# sourceMappingURL=index.d.ts.map
@@ -4,4 +4,3 @@
4
4
  * Groups multiple repository operations into a single transaction.
5
5
  */
6
6
  export { DatabaseUnitOfWork, createUnitOfWork, executeUnitOfWork, } from "./unitOfWork.core.js";
7
- //# sourceMappingURL=index.js.map
@@ -43,4 +43,3 @@ export declare function createUnitOfWork<TTransaction extends DatabaseTransactio
43
43
  * Executes a callback as a single database transaction.
44
44
  */
45
45
  export declare function executeUnitOfWork<TResult, TTransaction extends DatabaseTransactionContext = DatabaseTransactionContext>(client: DatabaseClient<TTransaction>, callback: TransactionCallback<TTransaction, TResult>, options?: TransactionOptions): Promise<TResult>;
46
- //# sourceMappingURL=unitOfWork.core.d.ts.map
@@ -52,4 +52,3 @@ export function createUnitOfWork(client) {
52
52
  export async function executeUnitOfWork(client, callback, options) {
53
53
  return createUnitOfWork(client).execute(callback, options);
54
54
  }
55
- //# sourceMappingURL=unitOfWork.core.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zudojs/database",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "Database abstraction layer with clients, repositories, transactions, and query building for Zudojs applications.",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -41,9 +41,9 @@
41
41
  "!dist/.tsbuildinfo"
42
42
  ],
43
43
  "dependencies": {
44
- "@zudojs/errors": "1.3.2",
45
- "@zudojs/logger": "1.4.3",
46
- "@zudojs/types": "1.2.0"
44
+ "@zudojs/errors": "1.4.0",
45
+ "@zudojs/logger": "1.5.0",
46
+ "@zudojs/types": "1.3.0"
47
47
  },
48
48
  "peerDependencies": {
49
49
  "@prisma/client": ">=7.0.0 <8"