@stratal/framework 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 (247) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +88 -0
  3. package/dist/auth/auth.module.d.ts +37 -0
  4. package/dist/auth/auth.module.d.ts.map +1 -0
  5. package/dist/auth/auth.module.js +74 -0
  6. package/dist/auth/auth.module.js.map +1 -0
  7. package/dist/auth/auth.tokens.d.ts +5 -0
  8. package/dist/auth/auth.tokens.d.ts.map +1 -0
  9. package/dist/auth/auth.tokens.js +5 -0
  10. package/dist/auth/auth.tokens.js.map +1 -0
  11. package/dist/auth/errors/auth-errors.d.ts +74 -0
  12. package/dist/auth/errors/auth-errors.d.ts.map +1 -0
  13. package/dist/auth/errors/auth-errors.js +122 -0
  14. package/dist/auth/errors/auth-errors.js.map +1 -0
  15. package/dist/auth/errors/index.d.ts +5 -0
  16. package/dist/auth/errors/index.d.ts.map +1 -0
  17. package/dist/auth/errors/index.js +5 -0
  18. package/dist/auth/errors/index.js.map +1 -0
  19. package/dist/auth/errors/invalid-token.error.d.ts +5 -0
  20. package/dist/auth/errors/invalid-token.error.d.ts.map +1 -0
  21. package/dist/auth/errors/invalid-token.error.js +7 -0
  22. package/dist/auth/errors/invalid-token.error.js.map +1 -0
  23. package/dist/auth/errors/token-required.error.d.ts +5 -0
  24. package/dist/auth/errors/token-required.error.d.ts.map +1 -0
  25. package/dist/auth/errors/token-required.error.js +7 -0
  26. package/dist/auth/errors/token-required.error.js.map +1 -0
  27. package/dist/auth/errors/verification-failed.error.d.ts +5 -0
  28. package/dist/auth/errors/verification-failed.error.d.ts.map +1 -0
  29. package/dist/auth/errors/verification-failed.error.js +7 -0
  30. package/dist/auth/errors/verification-failed.error.js.map +1 -0
  31. package/dist/auth/index.d.ts +7 -0
  32. package/dist/auth/index.d.ts.map +1 -0
  33. package/dist/auth/index.js +7 -0
  34. package/dist/auth/index.js.map +1 -0
  35. package/dist/auth/middleware/auth-context.middleware.d.ts +12 -0
  36. package/dist/auth/middleware/auth-context.middleware.d.ts.map +1 -0
  37. package/dist/auth/middleware/auth-context.middleware.js +28 -0
  38. package/dist/auth/middleware/auth-context.middleware.js.map +1 -0
  39. package/dist/auth/middleware/index.d.ts +3 -0
  40. package/dist/auth/middleware/index.d.ts.map +1 -0
  41. package/dist/auth/middleware/index.js +3 -0
  42. package/dist/auth/middleware/index.js.map +1 -0
  43. package/dist/auth/middleware/session-verification.middleware.d.ts +18 -0
  44. package/dist/auth/middleware/session-verification.middleware.d.ts.map +1 -0
  45. package/dist/auth/middleware/session-verification.middleware.js +48 -0
  46. package/dist/auth/middleware/session-verification.middleware.js.map +1 -0
  47. package/dist/auth/services/auth.service.d.ts +32 -0
  48. package/dist/auth/services/auth.service.d.ts.map +1 -0
  49. package/dist/auth/services/auth.service.js +62 -0
  50. package/dist/auth/services/auth.service.js.map +1 -0
  51. package/dist/auth/services/index.d.ts +2 -0
  52. package/dist/auth/services/index.d.ts.map +1 -0
  53. package/dist/auth/services/index.js +2 -0
  54. package/dist/auth/services/index.js.map +1 -0
  55. package/dist/auth/utils/auth-helpers.d.ts +11 -0
  56. package/dist/auth/utils/auth-helpers.d.ts.map +1 -0
  57. package/dist/auth/utils/auth-helpers.js +31 -0
  58. package/dist/auth/utils/auth-helpers.js.map +1 -0
  59. package/dist/auth/utils/better-auth-error-handler.d.ts +11 -0
  60. package/dist/auth/utils/better-auth-error-handler.d.ts.map +1 -0
  61. package/dist/auth/utils/better-auth-error-handler.js +95 -0
  62. package/dist/auth/utils/better-auth-error-handler.js.map +1 -0
  63. package/dist/auth/utils/index.d.ts +3 -0
  64. package/dist/auth/utils/index.d.ts.map +1 -0
  65. package/dist/auth/utils/index.js +3 -0
  66. package/dist/auth/utils/index.js.map +1 -0
  67. package/dist/context/auth-context.d.ts +35 -0
  68. package/dist/context/auth-context.d.ts.map +1 -0
  69. package/dist/context/auth-context.js +65 -0
  70. package/dist/context/auth-context.js.map +1 -0
  71. package/dist/context/errors/context-not-initialized.error.d.ts +5 -0
  72. package/dist/context/errors/context-not-initialized.error.d.ts.map +1 -0
  73. package/dist/context/errors/context-not-initialized.error.js +7 -0
  74. package/dist/context/errors/context-not-initialized.error.js.map +1 -0
  75. package/dist/context/errors/index.d.ts +4 -0
  76. package/dist/context/errors/index.d.ts.map +1 -0
  77. package/dist/context/errors/index.js +4 -0
  78. package/dist/context/errors/index.js.map +1 -0
  79. package/dist/context/errors/user-not-authenticated.error.d.ts +5 -0
  80. package/dist/context/errors/user-not-authenticated.error.d.ts.map +1 -0
  81. package/dist/context/errors/user-not-authenticated.error.js +7 -0
  82. package/dist/context/errors/user-not-authenticated.error.js.map +1 -0
  83. package/dist/context/errors/user-not-authorized.error.d.ts +5 -0
  84. package/dist/context/errors/user-not-authorized.error.d.ts.map +1 -0
  85. package/dist/context/errors/user-not-authorized.error.js +7 -0
  86. package/dist/context/errors/user-not-authorized.error.js.map +1 -0
  87. package/dist/context/index.d.ts +3 -0
  88. package/dist/context/index.d.ts.map +1 -0
  89. package/dist/context/index.js +3 -0
  90. package/dist/context/index.js.map +1 -0
  91. package/dist/database/custom-pg-types.d.ts +21 -0
  92. package/dist/database/custom-pg-types.d.ts.map +1 -0
  93. package/dist/database/custom-pg-types.js +41 -0
  94. package/dist/database/custom-pg-types.js.map +1 -0
  95. package/dist/database/database.helpers.d.ts +18 -0
  96. package/dist/database/database.helpers.d.ts.map +1 -0
  97. package/dist/database/database.helpers.js +27 -0
  98. package/dist/database/database.helpers.js.map +1 -0
  99. package/dist/database/database.module.d.ts +21 -0
  100. package/dist/database/database.module.d.ts.map +1 -0
  101. package/dist/database/database.module.js +62 -0
  102. package/dist/database/database.module.js.map +1 -0
  103. package/dist/database/database.service.d.ts +18 -0
  104. package/dist/database/database.service.d.ts.map +1 -0
  105. package/dist/database/database.service.js +2 -0
  106. package/dist/database/database.service.js.map +1 -0
  107. package/dist/database/database.tokens.d.ts +6 -0
  108. package/dist/database/database.tokens.d.ts.map +1 -0
  109. package/dist/database/database.tokens.js +8 -0
  110. package/dist/database/database.tokens.js.map +1 -0
  111. package/dist/database/decorators/inject-db.decorator.d.ts +3 -0
  112. package/dist/database/decorators/inject-db.decorator.d.ts.map +1 -0
  113. package/dist/database/decorators/inject-db.decorator.js +6 -0
  114. package/dist/database/decorators/inject-db.decorator.js.map +1 -0
  115. package/dist/database/errors/database-config.error.d.ts +5 -0
  116. package/dist/database/errors/database-config.error.d.ts.map +1 -0
  117. package/dist/database/errors/database-config.error.js +8 -0
  118. package/dist/database/errors/database-config.error.js.map +1 -0
  119. package/dist/database/errors/database-error.d.ts +14 -0
  120. package/dist/database/errors/database-error.d.ts.map +1 -0
  121. package/dist/database/errors/database-error.js +20 -0
  122. package/dist/database/errors/database-error.js.map +1 -0
  123. package/dist/database/errors/foreign-key-constraint.error.d.ts +14 -0
  124. package/dist/database/errors/foreign-key-constraint.error.d.ts.map +1 -0
  125. package/dist/database/errors/foreign-key-constraint.error.js +19 -0
  126. package/dist/database/errors/foreign-key-constraint.error.js.map +1 -0
  127. package/dist/database/errors/from-zenstack-error.d.ts +22 -0
  128. package/dist/database/errors/from-zenstack-error.d.ts.map +1 -0
  129. package/dist/database/errors/from-zenstack-error.js +114 -0
  130. package/dist/database/errors/from-zenstack-error.js.map +1 -0
  131. package/dist/database/errors/index.d.ts +8 -0
  132. package/dist/database/errors/index.d.ts.map +1 -0
  133. package/dist/database/errors/index.js +8 -0
  134. package/dist/database/errors/index.js.map +1 -0
  135. package/dist/database/errors/invalid-error-code-range.error.d.ts +12 -0
  136. package/dist/database/errors/invalid-error-code-range.error.d.ts.map +1 -0
  137. package/dist/database/errors/invalid-error-code-range.error.js +14 -0
  138. package/dist/database/errors/invalid-error-code-range.error.js.map +1 -0
  139. package/dist/database/errors/record-not-found.error.d.ts +15 -0
  140. package/dist/database/errors/record-not-found.error.d.ts.map +1 -0
  141. package/dist/database/errors/record-not-found.error.js +20 -0
  142. package/dist/database/errors/record-not-found.error.js.map +1 -0
  143. package/dist/database/errors/unique-constraint.error.d.ts +15 -0
  144. package/dist/database/errors/unique-constraint.error.d.ts.map +1 -0
  145. package/dist/database/errors/unique-constraint.error.js +20 -0
  146. package/dist/database/errors/unique-constraint.error.js.map +1 -0
  147. package/dist/database/event-types.d.ts +144 -0
  148. package/dist/database/event-types.d.ts.map +1 -0
  149. package/dist/database/event-types.js +13 -0
  150. package/dist/database/event-types.js.map +1 -0
  151. package/dist/database/index.d.ts +10 -0
  152. package/dist/database/index.d.ts.map +1 -0
  153. package/dist/database/index.js +10 -0
  154. package/dist/database/index.js.map +1 -0
  155. package/dist/database/plugins/error-handler.plugin.d.ts +21 -0
  156. package/dist/database/plugins/error-handler.plugin.d.ts.map +1 -0
  157. package/dist/database/plugins/error-handler.plugin.js +24 -0
  158. package/dist/database/plugins/error-handler.plugin.js.map +1 -0
  159. package/dist/database/plugins/event-emitter.plugin.d.ts +37 -0
  160. package/dist/database/plugins/event-emitter.plugin.d.ts.map +1 -0
  161. package/dist/database/plugins/event-emitter.plugin.js +43 -0
  162. package/dist/database/plugins/event-emitter.plugin.js.map +1 -0
  163. package/dist/database/plugins/index.d.ts +4 -0
  164. package/dist/database/plugins/index.d.ts.map +1 -0
  165. package/dist/database/plugins/index.js +4 -0
  166. package/dist/database/plugins/index.js.map +1 -0
  167. package/dist/database/plugins/schema-switcher.plugin.d.ts +32 -0
  168. package/dist/database/plugins/schema-switcher.plugin.d.ts.map +1 -0
  169. package/dist/database/plugins/schema-switcher.plugin.js +27 -0
  170. package/dist/database/plugins/schema-switcher.plugin.js.map +1 -0
  171. package/dist/database/types.d.ts +51 -0
  172. package/dist/database/types.d.ts.map +1 -0
  173. package/dist/database/types.js +2 -0
  174. package/dist/database/types.js.map +1 -0
  175. package/dist/factory/factory.d.ts +56 -0
  176. package/dist/factory/factory.d.ts.map +1 -0
  177. package/dist/factory/factory.js +86 -0
  178. package/dist/factory/factory.js.map +1 -0
  179. package/dist/factory/index.d.ts +3 -0
  180. package/dist/factory/index.d.ts.map +1 -0
  181. package/dist/factory/index.js +3 -0
  182. package/dist/factory/index.js.map +1 -0
  183. package/dist/factory/sequence.d.ts +38 -0
  184. package/dist/factory/sequence.d.ts.map +1 -0
  185. package/dist/factory/sequence.js +54 -0
  186. package/dist/factory/sequence.js.map +1 -0
  187. package/dist/guards/auth.guard.d.ts +33 -0
  188. package/dist/guards/auth.guard.d.ts.map +1 -0
  189. package/dist/guards/auth.guard.js +99 -0
  190. package/dist/guards/auth.guard.js.map +1 -0
  191. package/dist/guards/index.d.ts +3 -0
  192. package/dist/guards/index.d.ts.map +1 -0
  193. package/dist/guards/index.js +5 -0
  194. package/dist/guards/index.js.map +1 -0
  195. package/dist/index.d.ts +3 -0
  196. package/dist/index.d.ts.map +1 -0
  197. package/dist/index.js +2 -0
  198. package/dist/index.js.map +1 -0
  199. package/dist/rbac/adapters/custom-zenstack-adapter.d.ts +61 -0
  200. package/dist/rbac/adapters/custom-zenstack-adapter.d.ts.map +1 -0
  201. package/dist/rbac/adapters/custom-zenstack-adapter.js +159 -0
  202. package/dist/rbac/adapters/custom-zenstack-adapter.js.map +1 -0
  203. package/dist/rbac/adapters/index.d.ts +2 -0
  204. package/dist/rbac/adapters/index.d.ts.map +1 -0
  205. package/dist/rbac/adapters/index.js +2 -0
  206. package/dist/rbac/adapters/index.js.map +1 -0
  207. package/dist/rbac/constants.d.ts +8 -0
  208. package/dist/rbac/constants.d.ts.map +1 -0
  209. package/dist/rbac/constants.js +8 -0
  210. package/dist/rbac/constants.js.map +1 -0
  211. package/dist/rbac/errors/index.d.ts +2 -0
  212. package/dist/rbac/errors/index.d.ts.map +1 -0
  213. package/dist/rbac/errors/index.js +2 -0
  214. package/dist/rbac/errors/index.js.map +1 -0
  215. package/dist/rbac/errors/insufficient-permissions.error.d.ts +14 -0
  216. package/dist/rbac/errors/insufficient-permissions.error.d.ts.map +1 -0
  217. package/dist/rbac/errors/insufficient-permissions.error.js +19 -0
  218. package/dist/rbac/errors/insufficient-permissions.error.js.map +1 -0
  219. package/dist/rbac/index.d.ts +9 -0
  220. package/dist/rbac/index.d.ts.map +1 -0
  221. package/dist/rbac/index.js +8 -0
  222. package/dist/rbac/index.js.map +1 -0
  223. package/dist/rbac/rbac.module.d.ts +26 -0
  224. package/dist/rbac/rbac.module.d.ts.map +1 -0
  225. package/dist/rbac/rbac.module.js +62 -0
  226. package/dist/rbac/rbac.module.js.map +1 -0
  227. package/dist/rbac/services/casbin-enforcer.service.d.ts +37 -0
  228. package/dist/rbac/services/casbin-enforcer.service.d.ts.map +1 -0
  229. package/dist/rbac/services/casbin-enforcer.service.js +86 -0
  230. package/dist/rbac/services/casbin-enforcer.service.js.map +1 -0
  231. package/dist/rbac/services/casbin.service.d.ts +37 -0
  232. package/dist/rbac/services/casbin.service.d.ts.map +1 -0
  233. package/dist/rbac/services/casbin.service.js +174 -0
  234. package/dist/rbac/services/casbin.service.js.map +1 -0
  235. package/dist/rbac/services/index.d.ts +3 -0
  236. package/dist/rbac/services/index.d.ts.map +1 -0
  237. package/dist/rbac/services/index.js +3 -0
  238. package/dist/rbac/services/index.js.map +1 -0
  239. package/dist/rbac/tokens.d.ts +10 -0
  240. package/dist/rbac/tokens.d.ts.map +1 -0
  241. package/dist/rbac/tokens.js +10 -0
  242. package/dist/rbac/tokens.js.map +1 -0
  243. package/dist/rbac/types.d.ts +12 -0
  244. package/dist/rbac/types.d.ts.map +1 -0
  245. package/dist/rbac/types.js +2 -0
  246. package/dist/rbac/types.js.map +1 -0
  247. package/package.json +118 -0
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Custom pg types that auto-parse PostgreSQL array literals.
3
+ *
4
+ * pg-types handles known array types (text[], int[], etc.) but not
5
+ * custom enum arrays which have database-specific OIDs. This wrapper
6
+ * detects unparsed array strings and parses them automatically.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { customPgTypes } from '@stratal/framework/database';
11
+ *
12
+ * const pool = new Pool({
13
+ * connectionString,
14
+ * types: customPgTypes
15
+ * });
16
+ * ```
17
+ */
18
+ export declare const customPgTypes: {
19
+ getTypeParser: (oid: number, format?: "text" | "binary") => (val: string) => any;
20
+ };
21
+ //# sourceMappingURL=custom-pg-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-pg-types.d.ts","sourceRoot":"","sources":["../../src/database/custom-pg-types.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,aAAa;yBACH,MAAM,WAAW,MAAM,GAAG,QAAQ,MAI7C,KAAK,MAAM;CAkBtB,CAAA"}
@@ -0,0 +1,41 @@
1
+ import { types as pgTypes } from 'pg';
2
+ import { parse as parseArray } from 'postgres-array';
3
+ /**
4
+ * Custom pg types that auto-parse PostgreSQL array literals.
5
+ *
6
+ * pg-types handles known array types (text[], int[], etc.) but not
7
+ * custom enum arrays which have database-specific OIDs. This wrapper
8
+ * detects unparsed array strings and parses them automatically.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * import { customPgTypes } from '@stratal/framework/database';
13
+ *
14
+ * const pool = new Pool({
15
+ * connectionString,
16
+ * types: customPgTypes
17
+ * });
18
+ * ```
19
+ */
20
+ export const customPgTypes = {
21
+ getTypeParser: (oid, format) => {
22
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
23
+ const defaultParser = pgTypes.getTypeParser(oid, format);
24
+ return (val) => {
25
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call
26
+ const result = defaultParser(val);
27
+ // If result is a string that looks like a PostgreSQL array, parse it
28
+ // This handles custom enum arrays that pg-types doesn't know about
29
+ // Exclude JSON objects (start with `{"`) - only parse actual PostgreSQL arrays
30
+ if (typeof result === 'string' &&
31
+ result.startsWith('{') &&
32
+ result.endsWith('}') &&
33
+ !result.startsWith('{"')) {
34
+ return parseArray(result);
35
+ }
36
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
37
+ return result;
38
+ };
39
+ }
40
+ };
41
+ //# sourceMappingURL=custom-pg-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-pg-types.js","sourceRoot":"","sources":["../../src/database/custom-pg-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,IAAI,CAAA;AACrC,OAAO,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAEpD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,aAAa,EAAE,CAAC,GAAW,EAAE,MAA0B,EAAE,EAAE;QACzD,mEAAmE;QACnE,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QAExD,OAAO,CAAC,GAAW,EAAE,EAAE;YACrB,sGAAsG;YACtG,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAA;YAEjC,qEAAqE;YACrE,mEAAmE;YACnE,+EAA+E;YAC/E,IAAI,OAAO,MAAM,KAAK,QAAQ;gBAC1B,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC;gBACtB,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;gBACpB,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,OAAO,UAAU,CAAC,MAAM,CAAC,CAAA;YAC3B,CAAC;YAED,+DAA+D;YAC/D,OAAO,MAAM,CAAA;QACf,CAAC,CAAA;IACH,CAAC;CACF,CAAA"}
@@ -0,0 +1,18 @@
1
+ import { type AnyPlugin } from '@zenstackhq/orm';
2
+ import type { IEventRegistry } from 'stratal/events';
3
+ import { z } from 'stratal/validation';
4
+ import type { DatabaseConnectionConfig } from './database.module';
5
+ export declare const databaseModuleConfigSchema: z.ZodObject<{
6
+ default: z.ZodString;
7
+ connections: z.ZodArray<z.ZodObject<{
8
+ name: z.ZodString;
9
+ schema: z.ZodObject<{}, z.core.$loose>;
10
+ dialect: z.ZodObject<{}, z.core.$loose>;
11
+ plugins: z.ZodOptional<z.ZodArray<z.ZodObject<{}, z.core.$loose>>>;
12
+ }, z.core.$strip>>;
13
+ }, z.core.$strip>;
14
+ export declare function createDatabaseService(conn: DatabaseConnectionConfig, eventRegistry: IEventRegistry): import("@zenstackhq/orm").ClientContract<import("@zenstackhq/schema").SchemaDef, {
15
+ dialect: import("kysely").Dialect;
16
+ plugins: AnyPlugin[];
17
+ }, {}, {}>;
18
+ //# sourceMappingURL=database.helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.helpers.d.ts","sourceRoot":"","sources":["../../src/database/database.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAA;AACtC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAA;AAUjE,eAAO,MAAM,0BAA0B;;;;;;;;iBAYtC,CAAA;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,wBAAwB,EAC9B,aAAa,EAAE,cAAc;;;WAU9B"}
@@ -0,0 +1,27 @@
1
+ import { ZenStackClient } from '@zenstackhq/orm';
2
+ import { z } from 'stratal/validation';
3
+ import { ErrorHandlerPlugin, EventEmitterPlugin } from './plugins';
4
+ const databaseConnectionSchema = z.object({
5
+ name: z.string().min(1, 'Connection name is required'),
6
+ schema: z.object({}).loose(),
7
+ dialect: z.object({}).loose(),
8
+ plugins: z.array(z.object({}).loose()).optional(),
9
+ });
10
+ export const databaseModuleConfigSchema = z.object({
11
+ default: z.string().min(1, 'Default connection name is required'),
12
+ connections: z.array(databaseConnectionSchema).min(1, 'At least one connection is required'),
13
+ }).refine((config) => {
14
+ const names = config.connections.map(c => c.name);
15
+ return new Set(names).size === names.length;
16
+ }, { message: 'Duplicate connection names found' }).refine((config) => config.connections.some(c => c.name === config.default), { message: 'Default connection not found in connections' });
17
+ export function createDatabaseService(conn, eventRegistry) {
18
+ const plugins = [
19
+ new ErrorHandlerPlugin(),
20
+ new EventEmitterPlugin({
21
+ eventRegistry,
22
+ }),
23
+ ...(conn.plugins ?? []),
24
+ ];
25
+ return new ZenStackClient(conn.schema, { dialect: conn.dialect, plugins });
26
+ }
27
+ //# sourceMappingURL=database.helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.helpers.js","sourceRoot":"","sources":["../../src/database/database.helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAkB,MAAM,iBAAiB,CAAA;AAEhE,OAAO,EAAE,CAAC,EAAE,MAAM,oBAAoB,CAAA;AAEtC,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAElE,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,6BAA6B,CAAC;IACtD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE;IAC7B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,EAAE;CAClD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,qCAAqC,CAAC;IACjE,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,qCAAqC,CAAC;CAC7F,CAAC,CAAC,MAAM,CACP,CAAC,MAAM,EAAE,EAAE;IACT,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IACjD,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,CAAA;AAC7C,CAAC,EACD,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAChD,CAAC,MAAM,CACN,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,OAAO,CAAC,EACnE,EAAE,OAAO,EAAE,6CAA6C,EAAE,CAC3D,CAAA;AAED,MAAM,UAAU,qBAAqB,CACnC,IAA8B,EAC9B,aAA6B;IAE7B,MAAM,OAAO,GAAgB;QAC3B,IAAI,kBAAkB,EAAE;QACxB,IAAI,kBAAkB,CAAC;YACrB,aAAa;SACd,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;KACxB,CAAA;IACD,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;AAC5E,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { AnyPlugin } from '@zenstackhq/orm';
2
+ import type { SchemaDef } from '@zenstackhq/schema';
3
+ import type { Dialect } from 'kysely';
4
+ import { type AsyncModuleOptions, type DynamicModule, type ModuleContext, type OnInitialize, type OnShutdown } from 'stratal/module';
5
+ export interface DatabaseConnectionConfig {
6
+ name: string;
7
+ schema: SchemaDef;
8
+ dialect: Dialect;
9
+ plugins?: AnyPlugin[];
10
+ }
11
+ export interface DatabaseModuleConfig {
12
+ default: string;
13
+ connections: DatabaseConnectionConfig[];
14
+ }
15
+ export declare class DatabaseModule implements OnInitialize, OnShutdown {
16
+ static forRoot(config: DatabaseModuleConfig): DynamicModule;
17
+ static forRootAsync(options: AsyncModuleOptions<DatabaseModuleConfig>): DynamicModule;
18
+ onInitialize(context: ModuleContext): void;
19
+ onShutdown(context: ModuleContext): void;
20
+ }
21
+ //# sourceMappingURL=database.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.module.d.ts","sourceRoot":"","sources":["../../src/database/database.module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAGrC,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,UAAU,EAChB,MAAM,gBAAgB,CAAA;AAMvB,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,SAAS,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,SAAS,EAAE,CAAA;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,wBAAwB,EAAE,CAAA;CACxC;AAED,qBACa,cAAe,YAAW,YAAY,EAAE,UAAU;IAC7D,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,oBAAoB,GAAG,aAAa;IAS3D,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,kBAAkB,CAAC,oBAAoB,CAAC,GAAG,aAAa;IAarF,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IA2B1C,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;CAGzC"}
@@ -0,0 +1,62 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var DatabaseModule_1;
8
+ import { DI_TOKENS } from 'stratal/di';
9
+ import { Module, } from 'stratal/module';
10
+ import { instancePerContainerCachingFactory } from 'tsyringe';
11
+ import { createDatabaseService } from './database.helpers';
12
+ import { DATABASE_TOKENS, connectionSymbol } from './database.tokens';
13
+ import { DatabaseConfigError } from './errors/database-config.error';
14
+ let DatabaseModule = DatabaseModule_1 = class DatabaseModule {
15
+ static forRoot(config) {
16
+ return {
17
+ module: DatabaseModule_1,
18
+ providers: [
19
+ { provide: DATABASE_TOKENS.Options, useValue: config },
20
+ ],
21
+ };
22
+ }
23
+ static forRootAsync(options) {
24
+ return {
25
+ module: DatabaseModule_1,
26
+ providers: [
27
+ {
28
+ provide: DATABASE_TOKENS.Options,
29
+ useFactory: options.useFactory,
30
+ inject: options.inject,
31
+ },
32
+ ],
33
+ };
34
+ }
35
+ onInitialize(context) {
36
+ const config = context.container.resolve(DATABASE_TOKENS.Options);
37
+ const container = context.container.getTsyringeContainer();
38
+ for (const conn of config.connections) {
39
+ container.register(connectionSymbol(conn.name), {
40
+ useFactory: instancePerContainerCachingFactory((c) => {
41
+ const resolvedConfig = c.resolve(DATABASE_TOKENS.Options);
42
+ const resolvedConn = resolvedConfig.connections.find(connection => connection.name === conn.name);
43
+ if (!resolvedConn) {
44
+ throw new DatabaseConfigError('Connection not found');
45
+ }
46
+ const eventRegistry = c.resolve(DI_TOKENS.EventRegistry);
47
+ return createDatabaseService(resolvedConn, eventRegistry);
48
+ })
49
+ });
50
+ }
51
+ context.container.registerExisting(DI_TOKENS.Database, connectionSymbol(config.default));
52
+ context.logger.info('DatabaseModule initialized');
53
+ }
54
+ onShutdown(context) {
55
+ context.logger.info('DatabaseModule shutdown');
56
+ }
57
+ };
58
+ DatabaseModule = DatabaseModule_1 = __decorate([
59
+ Module({})
60
+ ], DatabaseModule);
61
+ export { DatabaseModule };
62
+ //# sourceMappingURL=database.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.module.js","sourceRoot":"","sources":["../../src/database/database.module.ts"],"names":[],"mappings":";;;;;;;AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEtC,OAAO,EACL,MAAM,GAMP,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,kCAAkC,EAAE,MAAM,UAAU,CAAA;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AAe7D,IAAM,cAAc,sBAApB,MAAM,cAAc;IACzB,MAAM,CAAC,OAAO,CAAC,MAA4B;QACzC,OAAO;YACL,MAAM,EAAE,gBAAc;YACtB,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,eAAe,CAAC,OAAO,EAAE,QAAQ,EAAE,MAA2B,EAAE;aAC5E;SACF,CAAA;IACH,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,OAAiD;QACnE,OAAO;YACL,MAAM,EAAE,gBAAc;YACtB,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,eAAe,CAAC,OAAO;oBAChC,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;iBACvB;aACF;SACF,CAAA;IACH,CAAC;IAED,YAAY,CAAC,OAAsB;QACjC,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,OAAO,CAAuB,eAAe,CAAC,OAAO,CAAC,CAAA;QACvF,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAA;QAE1D,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YACtC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC9C,UAAU,EAAE,kCAAkC,CAAC,CAAC,CAAC,EAAE,EAAE;oBACnD,MAAM,cAAc,GAAG,CAAC,CAAC,OAAO,CAAuB,eAAe,CAAC,OAAO,CAAC,CAAA;oBAC/E,MAAM,YAAY,GAAG,cAAc,CAAC,WAAW,CAAC,IAAI,CAClD,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAC5C,CAAA;oBAED,IAAI,CAAC,YAAY,EAAE,CAAC;wBAClB,MAAM,IAAI,mBAAmB,CAAC,sBAAsB,CAAC,CAAC;oBACxD,CAAC;oBAED,MAAM,aAAa,GAAG,CAAC,CAAC,OAAO,CAAiB,SAAS,CAAC,aAAa,CAAC,CAAA;oBACxE,OAAO,qBAAqB,CAAC,YAAY,EAAE,aAAa,CAAC,CAAA;gBAC3D,CAAC,CAAC;aACH,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,CAAC,SAAS,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,EAAE,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;QAExF,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAA;IACnD,CAAC;IAED,UAAU,CAAC,OAAsB;QAC/B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;IAChD,CAAC;CACF,CAAA;AArDY,cAAc;IAD1B,MAAM,CAAC,EAAE,CAAC;GACE,cAAc,CAqD1B"}
@@ -0,0 +1,18 @@
1
+ import type { ClientContract, ClientOptions } from '@zenstackhq/orm';
2
+ import type { ConnectionName, DefaultConnectionName, InferConnectionSchema } from './types';
3
+ /**
4
+ * DatabaseService type
5
+ *
6
+ * Provides strict typing per connection name via `DatabaseSchemaRegistry` augmentation.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * // Typed to default connection schema
11
+ * constructor(@inject(DI_TOKENS.Database) private db: DatabaseService) {}
12
+ *
13
+ * // Typed to a specific named connection schema
14
+ * constructor(@InjectDB('analytics') private analytics: DatabaseService<'analytics'>) {}
15
+ * ```
16
+ */
17
+ export type DatabaseService<K extends ConnectionName = DefaultConnectionName, Schema extends InferConnectionSchema<K> = InferConnectionSchema<K>> = ClientContract<Schema, ClientOptions<Schema>>;
18
+ //# sourceMappingURL=database.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.service.d.ts","sourceRoot":"","sources":["../../src/database/database.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpE,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAA;AAE3F;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,eAAe,CACzB,CAAC,SAAS,cAAc,GAAG,qBAAqB,EAChD,MAAM,SAAS,qBAAqB,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,IAChE,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=database.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.service.js","sourceRoot":"","sources":["../../src/database/database.service.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ export declare const DATABASE_TOKENS: {
2
+ readonly Options: symbol;
3
+ readonly Services: symbol;
4
+ };
5
+ export declare function connectionSymbol(name: string): symbol;
6
+ //# sourceMappingURL=database.tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.tokens.d.ts","sourceRoot":"","sources":["../../src/database/database.tokens.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe;;;CAGlB,CAAA;AAEV,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD"}
@@ -0,0 +1,8 @@
1
+ export const DATABASE_TOKENS = {
2
+ Options: Symbol.for('DatabaseModuleOptions'),
3
+ Services: Symbol.for('DatabaseServices'),
4
+ };
5
+ export function connectionSymbol(name) {
6
+ return Symbol.for(`DatabaseConnection:${name}`);
7
+ }
8
+ //# sourceMappingURL=database.tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.tokens.js","sourceRoot":"","sources":["../../src/database/database.tokens.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC;CAChC,CAAA;AAEV,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,MAAM,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAA;AACjD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ConnectionName } from '../types';
2
+ export declare function InjectDB(name: ConnectionName): ParameterDecorator;
3
+ //# sourceMappingURL=inject-db.decorator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject-db.decorator.d.ts","sourceRoot":"","sources":["../../../src/database/decorators/inject-db.decorator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAG9C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,kBAAkB,CAEjE"}
@@ -0,0 +1,6 @@
1
+ import { inject } from 'tsyringe';
2
+ import { connectionSymbol } from '../database.tokens';
3
+ export function InjectDB(name) {
4
+ return inject(connectionSymbol(name));
5
+ }
6
+ //# sourceMappingURL=inject-db.decorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject-db.decorator.js","sourceRoot":"","sources":["../../../src/database/decorators/inject-db.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAErD,MAAM,UAAU,QAAQ,CAAC,IAAoB;IAC3C,OAAO,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAA;AACvC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { DatabaseError } from './database-error';
2
+ export declare class DatabaseConfigError extends DatabaseError {
3
+ constructor(details: string);
4
+ }
5
+ //# sourceMappingURL=database-config.error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-config.error.d.ts","sourceRoot":"","sources":["../../../src/database/errors/database-config.error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD,qBAAa,mBAAoB,SAAQ,aAAa;gBACxC,OAAO,EAAE,MAAM;CAG5B"}
@@ -0,0 +1,8 @@
1
+ import { ERROR_CODES } from 'stratal/errors';
2
+ import { DatabaseError } from './database-error';
3
+ export class DatabaseConfigError extends DatabaseError {
4
+ constructor(details) {
5
+ super('errors.databaseGeneric', ERROR_CODES.DATABASE.GENERIC, { details });
6
+ }
7
+ }
8
+ //# sourceMappingURL=database-config.error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-config.error.js","sourceRoot":"","sources":["../../../src/database/errors/database-config.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD,MAAM,OAAO,mBAAoB,SAAQ,aAAa;IACpD,YAAY,OAAe;QACzB,KAAK,CAAC,wBAAwB,EAAE,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;IAC5E,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import type { MessageKeys } from 'stratal/i18n';
2
+ import { ApplicationError, type ErrorCode } from 'stratal/errors';
3
+ /**
4
+ * DatabaseError
5
+ *
6
+ * Generic database error thrown when a database operation fails
7
+ * and doesn't fit into a more specific error category.
8
+ *
9
+ * This is the base class for all database-related errors.
10
+ */
11
+ export declare class DatabaseError extends ApplicationError {
12
+ constructor(messageKey?: MessageKeys, code?: ErrorCode, metadata?: Record<string, unknown>);
13
+ }
14
+ //# sourceMappingURL=database-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-error.d.ts","sourceRoot":"","sources":["../../../src/database/errors/database-error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,gBAAgB,EAAe,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAG9E;;;;;;;GAOG;AACH,qBAAa,aAAc,SAAQ,gBAAgB;gBAE/C,UAAU,GAAE,WAAsC,EAClD,IAAI,GAAE,SAAwC,EAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CASrC"}
@@ -0,0 +1,20 @@
1
+ import { ApplicationError, ERROR_CODES } from 'stratal/errors';
2
+ import { InvalidErrorCodeRangeError } from './invalid-error-code-range.error';
3
+ /**
4
+ * DatabaseError
5
+ *
6
+ * Generic database error thrown when a database operation fails
7
+ * and doesn't fit into a more specific error category.
8
+ *
9
+ * This is the base class for all database-related errors.
10
+ */
11
+ export class DatabaseError extends ApplicationError {
12
+ constructor(messageKey = 'errors.databaseGeneric', code = ERROR_CODES.DATABASE.GENERIC, metadata) {
13
+ // Validate that code is in the database error range
14
+ if (code < 2000 || code >= 3000) {
15
+ throw new InvalidErrorCodeRangeError(code, '2000-2999');
16
+ }
17
+ super(messageKey, code, metadata);
18
+ }
19
+ }
20
+ //# sourceMappingURL=database-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-error.js","sourceRoot":"","sources":["../../../src/database/errors/database-error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAkB,MAAM,gBAAgB,CAAA;AAC9E,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAA;AAE7E;;;;;;;GAOG;AACH,MAAM,OAAO,aAAc,SAAQ,gBAAgB;IACjD,YACE,aAA0B,wBAAwB,EAClD,OAAkB,WAAW,CAAC,QAAQ,CAAC,OAAO,EAC9C,QAAkC;QAElC,oDAAoD;QACpD,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YAChC,MAAM,IAAI,0BAA0B,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;QACzD,CAAC;QAED,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;IACnC,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import { DatabaseError } from './database-error';
2
+ /**
3
+ * ForeignKeyConstraintError
4
+ *
5
+ * Thrown when a database foreign key constraint is violated.
6
+ * This typically occurs when:
7
+ * - Trying to insert a record with a foreign key that doesn't exist
8
+ * - Trying to delete a record that is referenced by other records
9
+ * - Trying to update a foreign key to a non-existent value
10
+ */
11
+ export declare class ForeignKeyConstraintError extends DatabaseError {
12
+ constructor(field?: string);
13
+ }
14
+ //# sourceMappingURL=foreign-key-constraint.error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foreign-key-constraint.error.d.ts","sourceRoot":"","sources":["../../../src/database/errors/foreign-key-constraint.error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD;;;;;;;;GAQG;AACH,qBAAa,yBAA0B,SAAQ,aAAa;gBAC9C,KAAK,CAAC,EAAE,MAAM;CAK3B"}
@@ -0,0 +1,19 @@
1
+ import { ERROR_CODES } from 'stratal/errors';
2
+ import { DatabaseError } from './database-error';
3
+ /**
4
+ * ForeignKeyConstraintError
5
+ *
6
+ * Thrown when a database foreign key constraint is violated.
7
+ * This typically occurs when:
8
+ * - Trying to insert a record with a foreign key that doesn't exist
9
+ * - Trying to delete a record that is referenced by other records
10
+ * - Trying to update a foreign key to a non-existent value
11
+ */
12
+ export class ForeignKeyConstraintError extends DatabaseError {
13
+ constructor(field) {
14
+ super('errors.databaseForeignKeyConstraint', ERROR_CODES.DATABASE.FOREIGN_KEY_CONSTRAINT, {
15
+ field,
16
+ });
17
+ }
18
+ }
19
+ //# sourceMappingURL=foreign-key-constraint.error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foreign-key-constraint.error.js","sourceRoot":"","sources":["../../../src/database/errors/foreign-key-constraint.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD;;;;;;;;GAQG;AACH,MAAM,OAAO,yBAA0B,SAAQ,aAAa;IAC1D,YAAY,KAAc;QACxB,KAAK,CAAC,qCAAqC,EAAE,WAAW,CAAC,QAAQ,CAAC,sBAAsB,EAAE;YACxF,KAAK;SACN,CAAC,CAAA;IACJ,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ import { DatabaseError } from './database-error';
2
+ /**
3
+ * Transform ZenStack ORM errors into ApplicationError instances
4
+ *
5
+ * This function maps ORMError codes to generic database error classes.
6
+ * Services can catch these generic errors and optionally refine them to
7
+ * more specific domain errors if needed.
8
+ *
9
+ * @param error - The error thrown by ZenStack ORM
10
+ * @returns An ApplicationError instance
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * try {
15
+ * await db.user.create({ data: { email: 'existing@example.com' } })
16
+ * } catch (error) {
17
+ * throw fromZenStackError(error) // Becomes UniqueConstraintError or other
18
+ * }
19
+ * ```
20
+ */
21
+ export declare function fromZenStackError(error: unknown): DatabaseError;
22
+ //# sourceMappingURL=from-zenstack-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from-zenstack-error.d.ts","sourceRoot":"","sources":["../../../src/database/errors/from-zenstack-error.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAKhD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,CAwD/D"}
@@ -0,0 +1,114 @@
1
+ import { ORMError, ORMErrorReason } from '@zenstackhq/orm';
2
+ import { ERROR_CODES } from 'stratal/errors';
3
+ import { DatabaseError } from './database-error';
4
+ import { ForeignKeyConstraintError } from './foreign-key-constraint.error';
5
+ import { RecordNotFoundError } from './record-not-found.error';
6
+ import { UniqueConstraintError } from './unique-constraint.error';
7
+ /**
8
+ * Transform ZenStack ORM errors into ApplicationError instances
9
+ *
10
+ * This function maps ORMError codes to generic database error classes.
11
+ * Services can catch these generic errors and optionally refine them to
12
+ * more specific domain errors if needed.
13
+ *
14
+ * @param error - The error thrown by ZenStack ORM
15
+ * @returns An ApplicationError instance
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * try {
20
+ * await db.user.create({ data: { email: 'existing@example.com' } })
21
+ * } catch (error) {
22
+ * throw fromZenStackError(error) // Becomes UniqueConstraintError or other
23
+ * }
24
+ * ```
25
+ */
26
+ export function fromZenStackError(error) {
27
+ // Handle ZenStack ORM Errors
28
+ if (error instanceof ORMError) {
29
+ const ormError = error;
30
+ switch (ormError.reason) {
31
+ case ORMErrorReason.NOT_FOUND:
32
+ return new RecordNotFoundError(ormError.model);
33
+ case ORMErrorReason.DB_QUERY_ERROR:
34
+ // Parse database-specific error codes
35
+ return parseDatabaseError(ormError);
36
+ case ORMErrorReason.INVALID_INPUT:
37
+ return new DatabaseError('errors.databaseInvalidQuery', ERROR_CODES.DATABASE.GENERIC, { message: ormError.message });
38
+ case ORMErrorReason.CONFIG_ERROR:
39
+ return new DatabaseError('errors.databaseConnectionFailed', ERROR_CODES.DATABASE.CONNECTION_FAILED, { message: ormError.message });
40
+ case ORMErrorReason.NOT_SUPPORTED:
41
+ return new DatabaseError('errors.databaseGeneric', ERROR_CODES.DATABASE.GENERIC, { message: ormError.message, reason: 'Operation not supported' });
42
+ case ORMErrorReason.INTERNAL_ERROR:
43
+ return new DatabaseError('errors.databaseGeneric', ERROR_CODES.DATABASE.GENERIC, { message: ormError.message });
44
+ default:
45
+ return new DatabaseError('errors.databaseGeneric', ERROR_CODES.DATABASE.GENERIC, { message: ormError.message, reason: ormError.reason });
46
+ }
47
+ }
48
+ // Handle unknown errors
49
+ return new DatabaseError('errors.databaseGeneric', ERROR_CODES.DATABASE.GENERIC, { originalError: String(error) });
50
+ }
51
+ /**
52
+ * Parse database-specific errors from the dbErrorCode field
53
+ */
54
+ function parseDatabaseError(error) {
55
+ // Cast dbErrorCode to string since ZenStack types it loosely
56
+ const dbErrorCode = error.dbErrorCode;
57
+ // PostgreSQL error codes
58
+ // https://www.postgresql.org/docs/current/errcodes-appendix.html
59
+ if (dbErrorCode) {
60
+ // Class 23 - Integrity Constraint Violation
61
+ if (dbErrorCode === '23505') {
62
+ // Unique violation
63
+ return new UniqueConstraintError([error.model ?? 'unknown']);
64
+ }
65
+ if (dbErrorCode === '23503') {
66
+ // Foreign key violation
67
+ return new ForeignKeyConstraintError(error.model ?? 'unknown');
68
+ }
69
+ if (dbErrorCode === '23502') {
70
+ // Not null violation
71
+ return new DatabaseError('errors.databaseNullConstraint', ERROR_CODES.DATABASE.NULL_CONSTRAINT, { dbErrorCode, message: error.dbErrorMessage });
72
+ }
73
+ if (dbErrorCode === '23514') {
74
+ // Check constraint violation
75
+ return new DatabaseError('errors.databaseConstraintFailed', ERROR_CODES.DATABASE.GENERIC, { dbErrorCode, message: error.dbErrorMessage });
76
+ }
77
+ // Class 42 - Syntax Error or Access Rule Violation
78
+ if (dbErrorCode.startsWith('42')) {
79
+ if (dbErrorCode === '42P01') {
80
+ // Undefined table
81
+ return new DatabaseError('errors.databaseTableNotFound', ERROR_CODES.DATABASE.GENERIC, { dbErrorCode, message: error.dbErrorMessage });
82
+ }
83
+ if (dbErrorCode === '42703') {
84
+ // Undefined column
85
+ return new DatabaseError('errors.databaseColumnNotFound', ERROR_CODES.DATABASE.GENERIC, { dbErrorCode, message: error.dbErrorMessage });
86
+ }
87
+ }
88
+ // Class 08 - Connection Exception
89
+ if (dbErrorCode.startsWith('08')) {
90
+ return new DatabaseError('errors.databaseConnectionFailed', ERROR_CODES.DATABASE.CONNECTION_FAILED, { dbErrorCode, message: error.dbErrorMessage });
91
+ }
92
+ // Class 57 - Operator Intervention
93
+ if (dbErrorCode === '57014') {
94
+ // Query cancelled
95
+ return new DatabaseError('errors.databaseTimeout', ERROR_CODES.DATABASE.TIMEOUT, { dbErrorCode, message: error.dbErrorMessage });
96
+ }
97
+ // Class 40 - Transaction Rollback
98
+ if (dbErrorCode.startsWith('40')) {
99
+ return new DatabaseError('errors.databaseTransactionConflict', ERROR_CODES.DATABASE.TRANSACTION_CONFLICT, { dbErrorCode, message: error.dbErrorMessage });
100
+ }
101
+ // Class 53 - Insufficient Resources
102
+ if (dbErrorCode === '53300') {
103
+ // Too many connections
104
+ return new DatabaseError('errors.databaseTooManyConnections', ERROR_CODES.DATABASE.TOO_MANY_CONNECTIONS, { dbErrorCode, message: error.dbErrorMessage });
105
+ }
106
+ }
107
+ // Default database error
108
+ return new DatabaseError('errors.databaseGeneric', ERROR_CODES.DATABASE.GENERIC, {
109
+ dbErrorCode,
110
+ dbErrorMessage: error.dbErrorMessage,
111
+ sql: error.sql,
112
+ });
113
+ }
114
+ //# sourceMappingURL=from-zenstack-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from-zenstack-error.js","sourceRoot":"","sources":["../../../src/database/errors/from-zenstack-error.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export * from './database-config.error';
2
+ export * from './database-error';
3
+ export * from './foreign-key-constraint.error';
4
+ export * from './invalid-error-code-range.error';
5
+ export * from './record-not-found.error';
6
+ export * from './unique-constraint.error';
7
+ export * from './from-zenstack-error';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/database/errors/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA;AACvC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,kCAAkC,CAAA;AAChD,cAAc,0BAA0B,CAAA;AACxC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA"}
@@ -0,0 +1,8 @@
1
+ export * from './database-config.error';
2
+ export * from './database-error';
3
+ export * from './foreign-key-constraint.error';
4
+ export * from './invalid-error-code-range.error';
5
+ export * from './record-not-found.error';
6
+ export * from './unique-constraint.error';
7
+ export * from './from-zenstack-error';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/database/errors/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA;AACvC,cAAc,kBAAkB,CAAA;AAChC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,kCAAkC,CAAA;AAChD,cAAc,0BAA0B,CAAA;AACxC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA"}
@@ -0,0 +1,12 @@
1
+ import { ApplicationError } from 'stratal/errors';
2
+ /**
3
+ * InvalidErrorCodeRangeError
4
+ *
5
+ * Thrown when a DatabaseError subclass is constructed with an error code
6
+ * outside the valid database error range (2000-2999).
7
+ * This is a developer-facing error to enforce error code conventions.
8
+ */
9
+ export declare class InvalidErrorCodeRangeError extends ApplicationError {
10
+ constructor(code: number, expectedRange: string);
11
+ }
12
+ //# sourceMappingURL=invalid-error-code-range.error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invalid-error-code-range.error.d.ts","sourceRoot":"","sources":["../../../src/database/errors/invalid-error-code-range.error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAe,MAAM,gBAAgB,CAAA;AAE9D;;;;;;GAMG;AACH,qBAAa,0BAA2B,SAAQ,gBAAgB;gBAClD,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;CAOhD"}