@stratal/framework 0.0.13 → 0.0.15

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 (290) hide show
  1. package/dist/auth/index.d.mts +202 -0
  2. package/dist/auth/index.d.mts.map +1 -0
  3. package/dist/auth/index.mjs +323 -0
  4. package/dist/auth/index.mjs.map +1 -0
  5. package/dist/auth-context-BD2ApWg1.d.mts +38 -0
  6. package/dist/auth-context-BD2ApWg1.d.mts.map +1 -0
  7. package/dist/auth-context-CV3Ko1ew.mjs +55 -0
  8. package/dist/auth-context-CV3Ko1ew.mjs.map +1 -0
  9. package/dist/context/index.d.mts +20 -0
  10. package/dist/context/index.d.mts.map +1 -0
  11. package/dist/context/index.mjs +3 -0
  12. package/dist/database/index.d.mts +3 -0
  13. package/dist/database/index.mjs +374 -0
  14. package/dist/database/index.mjs.map +1 -0
  15. package/dist/decorate-RSane8dy.mjs +9 -0
  16. package/dist/decorateMetadata-CETItPez.mjs +6 -0
  17. package/dist/decorateParam-CcTvpNsw.mjs +8 -0
  18. package/dist/errors-C_KIIU1v.mjs +25 -0
  19. package/dist/errors-C_KIIU1v.mjs.map +1 -0
  20. package/dist/factory/index.d.mts +99 -0
  21. package/dist/factory/index.d.mts.map +1 -0
  22. package/dist/factory/index.mjs +138 -0
  23. package/dist/factory/index.mjs.map +1 -0
  24. package/dist/guards/{auth.guard.d.ts → index.d.mts} +7 -3
  25. package/dist/guards/index.d.mts.map +1 -0
  26. package/dist/guards/index.mjs +93 -0
  27. package/dist/guards/index.mjs.map +1 -0
  28. package/dist/index-Dlg8mNjq.d.mts +386 -0
  29. package/dist/index-Dlg8mNjq.d.mts.map +1 -0
  30. package/dist/index.d.mts +3 -0
  31. package/dist/index.mjs +1 -0
  32. package/dist/rbac/index.d.mts +206 -0
  33. package/dist/rbac/index.d.mts.map +1 -0
  34. package/dist/rbac/index.mjs +346 -0
  35. package/dist/rbac/index.mjs.map +1 -0
  36. package/dist/tokens-Di1ofovy.mjs +32 -0
  37. package/dist/tokens-Di1ofovy.mjs.map +1 -0
  38. package/dist/{database/types.d.ts → types-Gjk0d2qB.d.mts} +18 -15
  39. package/dist/types-Gjk0d2qB.d.mts.map +1 -0
  40. package/package.json +25 -24
  41. package/dist/auth/auth.module.d.ts +0 -37
  42. package/dist/auth/auth.module.d.ts.map +0 -1
  43. package/dist/auth/auth.module.js +0 -74
  44. package/dist/auth/auth.module.js.map +0 -1
  45. package/dist/auth/auth.tokens.d.ts +0 -5
  46. package/dist/auth/auth.tokens.d.ts.map +0 -1
  47. package/dist/auth/auth.tokens.js +0 -5
  48. package/dist/auth/auth.tokens.js.map +0 -1
  49. package/dist/auth/errors/auth-errors.d.ts +0 -74
  50. package/dist/auth/errors/auth-errors.d.ts.map +0 -1
  51. package/dist/auth/errors/auth-errors.js +0 -122
  52. package/dist/auth/errors/auth-errors.js.map +0 -1
  53. package/dist/auth/errors/index.d.ts +0 -5
  54. package/dist/auth/errors/index.d.ts.map +0 -1
  55. package/dist/auth/errors/index.js +0 -5
  56. package/dist/auth/errors/index.js.map +0 -1
  57. package/dist/auth/errors/invalid-token.error.d.ts +0 -5
  58. package/dist/auth/errors/invalid-token.error.d.ts.map +0 -1
  59. package/dist/auth/errors/invalid-token.error.js +0 -7
  60. package/dist/auth/errors/invalid-token.error.js.map +0 -1
  61. package/dist/auth/errors/token-required.error.d.ts +0 -5
  62. package/dist/auth/errors/token-required.error.d.ts.map +0 -1
  63. package/dist/auth/errors/token-required.error.js +0 -7
  64. package/dist/auth/errors/token-required.error.js.map +0 -1
  65. package/dist/auth/errors/verification-failed.error.d.ts +0 -5
  66. package/dist/auth/errors/verification-failed.error.d.ts.map +0 -1
  67. package/dist/auth/errors/verification-failed.error.js +0 -7
  68. package/dist/auth/errors/verification-failed.error.js.map +0 -1
  69. package/dist/auth/index.d.ts +0 -7
  70. package/dist/auth/index.d.ts.map +0 -1
  71. package/dist/auth/index.js +0 -7
  72. package/dist/auth/index.js.map +0 -1
  73. package/dist/auth/middleware/auth-context.middleware.d.ts +0 -12
  74. package/dist/auth/middleware/auth-context.middleware.d.ts.map +0 -1
  75. package/dist/auth/middleware/auth-context.middleware.js +0 -28
  76. package/dist/auth/middleware/auth-context.middleware.js.map +0 -1
  77. package/dist/auth/middleware/index.d.ts +0 -3
  78. package/dist/auth/middleware/index.d.ts.map +0 -1
  79. package/dist/auth/middleware/index.js +0 -3
  80. package/dist/auth/middleware/index.js.map +0 -1
  81. package/dist/auth/middleware/session-verification.middleware.d.ts +0 -18
  82. package/dist/auth/middleware/session-verification.middleware.d.ts.map +0 -1
  83. package/dist/auth/middleware/session-verification.middleware.js +0 -48
  84. package/dist/auth/middleware/session-verification.middleware.js.map +0 -1
  85. package/dist/auth/services/auth.service.d.ts +0 -32
  86. package/dist/auth/services/auth.service.d.ts.map +0 -1
  87. package/dist/auth/services/auth.service.js +0 -62
  88. package/dist/auth/services/auth.service.js.map +0 -1
  89. package/dist/auth/services/index.d.ts +0 -2
  90. package/dist/auth/services/index.d.ts.map +0 -1
  91. package/dist/auth/services/index.js +0 -2
  92. package/dist/auth/services/index.js.map +0 -1
  93. package/dist/auth/utils/auth-helpers.d.ts +0 -11
  94. package/dist/auth/utils/auth-helpers.d.ts.map +0 -1
  95. package/dist/auth/utils/auth-helpers.js +0 -31
  96. package/dist/auth/utils/auth-helpers.js.map +0 -1
  97. package/dist/auth/utils/better-auth-error-handler.d.ts +0 -11
  98. package/dist/auth/utils/better-auth-error-handler.d.ts.map +0 -1
  99. package/dist/auth/utils/better-auth-error-handler.js +0 -95
  100. package/dist/auth/utils/better-auth-error-handler.js.map +0 -1
  101. package/dist/auth/utils/index.d.ts +0 -3
  102. package/dist/auth/utils/index.d.ts.map +0 -1
  103. package/dist/auth/utils/index.js +0 -3
  104. package/dist/auth/utils/index.js.map +0 -1
  105. package/dist/context/auth-context.d.ts +0 -35
  106. package/dist/context/auth-context.d.ts.map +0 -1
  107. package/dist/context/auth-context.js +0 -65
  108. package/dist/context/auth-context.js.map +0 -1
  109. package/dist/context/errors/context-not-initialized.error.d.ts +0 -5
  110. package/dist/context/errors/context-not-initialized.error.d.ts.map +0 -1
  111. package/dist/context/errors/context-not-initialized.error.js +0 -7
  112. package/dist/context/errors/context-not-initialized.error.js.map +0 -1
  113. package/dist/context/errors/index.d.ts +0 -4
  114. package/dist/context/errors/index.d.ts.map +0 -1
  115. package/dist/context/errors/index.js +0 -4
  116. package/dist/context/errors/index.js.map +0 -1
  117. package/dist/context/errors/user-not-authenticated.error.d.ts +0 -5
  118. package/dist/context/errors/user-not-authenticated.error.d.ts.map +0 -1
  119. package/dist/context/errors/user-not-authenticated.error.js +0 -7
  120. package/dist/context/errors/user-not-authenticated.error.js.map +0 -1
  121. package/dist/context/errors/user-not-authorized.error.d.ts +0 -5
  122. package/dist/context/errors/user-not-authorized.error.d.ts.map +0 -1
  123. package/dist/context/errors/user-not-authorized.error.js +0 -7
  124. package/dist/context/errors/user-not-authorized.error.js.map +0 -1
  125. package/dist/context/index.d.ts +0 -3
  126. package/dist/context/index.d.ts.map +0 -1
  127. package/dist/context/index.js +0 -3
  128. package/dist/context/index.js.map +0 -1
  129. package/dist/database/custom-pg-types.d.ts +0 -21
  130. package/dist/database/custom-pg-types.d.ts.map +0 -1
  131. package/dist/database/custom-pg-types.js +0 -41
  132. package/dist/database/custom-pg-types.js.map +0 -1
  133. package/dist/database/database.helpers.d.ts +0 -15
  134. package/dist/database/database.helpers.d.ts.map +0 -1
  135. package/dist/database/database.helpers.js +0 -47
  136. package/dist/database/database.helpers.js.map +0 -1
  137. package/dist/database/database.module.d.ts +0 -22
  138. package/dist/database/database.module.d.ts.map +0 -1
  139. package/dist/database/database.module.js +0 -54
  140. package/dist/database/database.module.js.map +0 -1
  141. package/dist/database/database.service.d.ts +0 -18
  142. package/dist/database/database.service.d.ts.map +0 -1
  143. package/dist/database/database.service.js +0 -2
  144. package/dist/database/database.service.js.map +0 -1
  145. package/dist/database/database.tokens.d.ts +0 -7
  146. package/dist/database/database.tokens.d.ts.map +0 -1
  147. package/dist/database/database.tokens.js +0 -8
  148. package/dist/database/database.tokens.js.map +0 -1
  149. package/dist/database/decorators/inject-db.decorator.d.ts +0 -3
  150. package/dist/database/decorators/inject-db.decorator.d.ts.map +0 -1
  151. package/dist/database/decorators/inject-db.decorator.js +0 -6
  152. package/dist/database/decorators/inject-db.decorator.js.map +0 -1
  153. package/dist/database/errors/database-config.error.d.ts +0 -5
  154. package/dist/database/errors/database-config.error.d.ts.map +0 -1
  155. package/dist/database/errors/database-config.error.js +0 -8
  156. package/dist/database/errors/database-config.error.js.map +0 -1
  157. package/dist/database/errors/database-error.d.ts +0 -14
  158. package/dist/database/errors/database-error.d.ts.map +0 -1
  159. package/dist/database/errors/database-error.js +0 -20
  160. package/dist/database/errors/database-error.js.map +0 -1
  161. package/dist/database/errors/foreign-key-constraint.error.d.ts +0 -14
  162. package/dist/database/errors/foreign-key-constraint.error.d.ts.map +0 -1
  163. package/dist/database/errors/foreign-key-constraint.error.js +0 -19
  164. package/dist/database/errors/foreign-key-constraint.error.js.map +0 -1
  165. package/dist/database/errors/from-zenstack-error.d.ts +0 -22
  166. package/dist/database/errors/from-zenstack-error.d.ts.map +0 -1
  167. package/dist/database/errors/from-zenstack-error.js +0 -114
  168. package/dist/database/errors/from-zenstack-error.js.map +0 -1
  169. package/dist/database/errors/index.d.ts +0 -8
  170. package/dist/database/errors/index.d.ts.map +0 -1
  171. package/dist/database/errors/index.js +0 -8
  172. package/dist/database/errors/index.js.map +0 -1
  173. package/dist/database/errors/invalid-error-code-range.error.d.ts +0 -12
  174. package/dist/database/errors/invalid-error-code-range.error.d.ts.map +0 -1
  175. package/dist/database/errors/invalid-error-code-range.error.js +0 -14
  176. package/dist/database/errors/invalid-error-code-range.error.js.map +0 -1
  177. package/dist/database/errors/record-not-found.error.d.ts +0 -15
  178. package/dist/database/errors/record-not-found.error.d.ts.map +0 -1
  179. package/dist/database/errors/record-not-found.error.js +0 -20
  180. package/dist/database/errors/record-not-found.error.js.map +0 -1
  181. package/dist/database/errors/unique-constraint.error.d.ts +0 -15
  182. package/dist/database/errors/unique-constraint.error.d.ts.map +0 -1
  183. package/dist/database/errors/unique-constraint.error.js +0 -20
  184. package/dist/database/errors/unique-constraint.error.js.map +0 -1
  185. package/dist/database/event-types.d.ts +0 -137
  186. package/dist/database/event-types.d.ts.map +0 -1
  187. package/dist/database/event-types.js +0 -13
  188. package/dist/database/event-types.js.map +0 -1
  189. package/dist/database/i18n/en.d.ts +0 -15
  190. package/dist/database/i18n/en.d.ts.map +0 -1
  191. package/dist/database/i18n/en.js +0 -10
  192. package/dist/database/i18n/en.js.map +0 -1
  193. package/dist/database/i18n/index.d.ts +0 -2
  194. package/dist/database/i18n/index.d.ts.map +0 -1
  195. package/dist/database/i18n/index.js +0 -2
  196. package/dist/database/i18n/index.js.map +0 -1
  197. package/dist/database/index.d.ts +0 -11
  198. package/dist/database/index.d.ts.map +0 -1
  199. package/dist/database/index.js +0 -11
  200. package/dist/database/index.js.map +0 -1
  201. package/dist/database/plugins/error-handler.plugin.d.ts +0 -21
  202. package/dist/database/plugins/error-handler.plugin.d.ts.map +0 -1
  203. package/dist/database/plugins/error-handler.plugin.js +0 -24
  204. package/dist/database/plugins/error-handler.plugin.js.map +0 -1
  205. package/dist/database/plugins/event-emitter.plugin.d.ts +0 -37
  206. package/dist/database/plugins/event-emitter.plugin.d.ts.map +0 -1
  207. package/dist/database/plugins/event-emitter.plugin.js +0 -43
  208. package/dist/database/plugins/event-emitter.plugin.js.map +0 -1
  209. package/dist/database/plugins/index.d.ts +0 -4
  210. package/dist/database/plugins/index.d.ts.map +0 -1
  211. package/dist/database/plugins/index.js +0 -4
  212. package/dist/database/plugins/index.js.map +0 -1
  213. package/dist/database/plugins/schema-switcher.plugin.d.ts +0 -32
  214. package/dist/database/plugins/schema-switcher.plugin.d.ts.map +0 -1
  215. package/dist/database/plugins/schema-switcher.plugin.js +0 -27
  216. package/dist/database/plugins/schema-switcher.plugin.js.map +0 -1
  217. package/dist/database/types.d.ts.map +0 -1
  218. package/dist/database/types.js +0 -2
  219. package/dist/database/types.js.map +0 -1
  220. package/dist/factory/factory.d.ts +0 -56
  221. package/dist/factory/factory.d.ts.map +0 -1
  222. package/dist/factory/factory.js +0 -86
  223. package/dist/factory/factory.js.map +0 -1
  224. package/dist/factory/index.d.ts +0 -3
  225. package/dist/factory/index.d.ts.map +0 -1
  226. package/dist/factory/index.js +0 -3
  227. package/dist/factory/index.js.map +0 -1
  228. package/dist/factory/sequence.d.ts +0 -38
  229. package/dist/factory/sequence.d.ts.map +0 -1
  230. package/dist/factory/sequence.js +0 -54
  231. package/dist/factory/sequence.js.map +0 -1
  232. package/dist/guards/auth.guard.d.ts.map +0 -1
  233. package/dist/guards/auth.guard.js +0 -99
  234. package/dist/guards/auth.guard.js.map +0 -1
  235. package/dist/guards/index.d.ts +0 -3
  236. package/dist/guards/index.d.ts.map +0 -1
  237. package/dist/guards/index.js +0 -5
  238. package/dist/guards/index.js.map +0 -1
  239. package/dist/index.d.ts +0 -3
  240. package/dist/index.d.ts.map +0 -1
  241. package/dist/index.js +0 -2
  242. package/dist/index.js.map +0 -1
  243. package/dist/rbac/adapters/custom-zenstack-adapter.d.ts +0 -61
  244. package/dist/rbac/adapters/custom-zenstack-adapter.d.ts.map +0 -1
  245. package/dist/rbac/adapters/custom-zenstack-adapter.js +0 -159
  246. package/dist/rbac/adapters/custom-zenstack-adapter.js.map +0 -1
  247. package/dist/rbac/adapters/index.d.ts +0 -2
  248. package/dist/rbac/adapters/index.d.ts.map +0 -1
  249. package/dist/rbac/adapters/index.js +0 -2
  250. package/dist/rbac/adapters/index.js.map +0 -1
  251. package/dist/rbac/constants.d.ts +0 -8
  252. package/dist/rbac/constants.d.ts.map +0 -1
  253. package/dist/rbac/constants.js +0 -8
  254. package/dist/rbac/constants.js.map +0 -1
  255. package/dist/rbac/errors/index.d.ts +0 -2
  256. package/dist/rbac/errors/index.d.ts.map +0 -1
  257. package/dist/rbac/errors/index.js +0 -2
  258. package/dist/rbac/errors/index.js.map +0 -1
  259. package/dist/rbac/errors/insufficient-permissions.error.d.ts +0 -14
  260. package/dist/rbac/errors/insufficient-permissions.error.d.ts.map +0 -1
  261. package/dist/rbac/errors/insufficient-permissions.error.js +0 -19
  262. package/dist/rbac/errors/insufficient-permissions.error.js.map +0 -1
  263. package/dist/rbac/index.d.ts +0 -9
  264. package/dist/rbac/index.d.ts.map +0 -1
  265. package/dist/rbac/index.js +0 -8
  266. package/dist/rbac/index.js.map +0 -1
  267. package/dist/rbac/rbac.module.d.ts +0 -26
  268. package/dist/rbac/rbac.module.d.ts.map +0 -1
  269. package/dist/rbac/rbac.module.js +0 -62
  270. package/dist/rbac/rbac.module.js.map +0 -1
  271. package/dist/rbac/services/casbin-enforcer.service.d.ts +0 -37
  272. package/dist/rbac/services/casbin-enforcer.service.d.ts.map +0 -1
  273. package/dist/rbac/services/casbin-enforcer.service.js +0 -86
  274. package/dist/rbac/services/casbin-enforcer.service.js.map +0 -1
  275. package/dist/rbac/services/casbin.service.d.ts +0 -37
  276. package/dist/rbac/services/casbin.service.d.ts.map +0 -1
  277. package/dist/rbac/services/casbin.service.js +0 -174
  278. package/dist/rbac/services/casbin.service.js.map +0 -1
  279. package/dist/rbac/services/index.d.ts +0 -3
  280. package/dist/rbac/services/index.d.ts.map +0 -1
  281. package/dist/rbac/services/index.js +0 -3
  282. package/dist/rbac/services/index.js.map +0 -1
  283. package/dist/rbac/tokens.d.ts +0 -10
  284. package/dist/rbac/tokens.d.ts.map +0 -1
  285. package/dist/rbac/tokens.js +0 -10
  286. package/dist/rbac/tokens.js.map +0 -1
  287. package/dist/rbac/types.d.ts +0 -12
  288. package/dist/rbac/types.d.ts.map +0 -1
  289. package/dist/rbac/types.js +0 -2
  290. package/dist/rbac/types.js.map +0 -1
@@ -0,0 +1,386 @@
1
+ import { i as InferConnectionSchema, n as DefaultConnectionName, r as InferAnySchema, t as ConnectionName } from "./types-Gjk0d2qB.mjs";
2
+ import { AsyncModuleOptions, DynamicModule, ModuleContext, OnInitialize, OnShutdown } from "stratal/module";
3
+ import { ApplicationError, ErrorCode } from "stratal/errors";
4
+ import { AggregateArgs, AllCrudOperations, AnyPlugin, ClientContract, ClientOptions, CountArgs, CreateArgs, CreateManyArgs, DeleteArgs, DeleteManyArgs, FindFirstArgs, FindManyArgs, FindUniqueArgs, GroupByArgs, ModelResult, RuntimePlugin, UpdateArgs, UpdateManyArgs, UpsertArgs } from "@zenstackhq/orm";
5
+ import { SchemaDef } from "@zenstackhq/schema";
6
+ import { Dialect } from "kysely";
7
+ import { MessageKeys } from "stratal/i18n";
8
+ import { SchemaDef as SchemaDef$1 } from "@zenstackhq/orm/schema";
9
+ import { IEventRegistry } from "stratal/events";
10
+
11
+ //#region src/database/database.service.d.ts
12
+ /**
13
+ * DatabaseService type
14
+ *
15
+ * Each connection has its own schema. The service is typed to the connection's schema.
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * // Typed to default connection
20
+ * constructor(@inject(DI_TOKENS.Database) private db: DatabaseService) {}
21
+ *
22
+ * // Typed to a specific named connection
23
+ * constructor(@InjectDB('analytics') private analytics: DatabaseService<'analytics'>) {}
24
+ * ```
25
+ */
26
+ type DatabaseService<K extends ConnectionName = DefaultConnectionName> = ClientContract<InferConnectionSchema<K>, ClientOptions<InferConnectionSchema<K>>>;
27
+ //#endregion
28
+ //#region src/database/database.module.d.ts
29
+ interface DatabaseConnectionConfig<Schema extends SchemaDef = SchemaDef, Name extends ConnectionName = ConnectionName> {
30
+ name: Name;
31
+ schema: Schema;
32
+ dialect: () => Dialect;
33
+ plugins?: AnyPlugin[];
34
+ }
35
+ interface DatabaseModuleConfig {
36
+ default: DefaultConnectionName;
37
+ connections: DatabaseConnectionConfig[];
38
+ }
39
+ declare class DatabaseModule implements OnInitialize, OnShutdown {
40
+ static forRoot(config: DatabaseModuleConfig): DynamicModule;
41
+ static forRootAsync(options: AsyncModuleOptions<DatabaseModuleConfig>): DynamicModule;
42
+ onInitialize(context: ModuleContext): void;
43
+ onShutdown(context: ModuleContext): void;
44
+ }
45
+ //#endregion
46
+ //#region src/database/database.tokens.d.ts
47
+ declare const DATABASE_TOKENS: {
48
+ readonly Options: symbol;
49
+ readonly Services: symbol;
50
+ };
51
+ declare function connectionSymbol(name: ConnectionName): symbol;
52
+ //#endregion
53
+ //#region src/database/decorators/inject-db.decorator.d.ts
54
+ declare function InjectDB(name: ConnectionName): ParameterDecorator;
55
+ //#endregion
56
+ //#region src/database/event-types.d.ts
57
+ /**
58
+ * Event phase: before or after operation
59
+ */
60
+ type EventPhase = 'before' | 'after';
61
+ /**
62
+ * All database operations that can trigger events
63
+ */
64
+ type DatabaseOperation = AllCrudOperations;
65
+ /**
66
+ * Model names derived from the shared database schema.
67
+ * Falls back to `never` if no schema is registered.
68
+ */
69
+ type ModelName = InferAnySchema extends {
70
+ models: infer M;
71
+ } ? Extract<keyof M, string> : never;
72
+ /**
73
+ * Database event names with all supported patterns.
74
+ */
75
+ type DatabaseEventName = `${EventPhase}.${ModelName}.${DatabaseOperation}` | `${EventPhase}.${ModelName}` | `${EventPhase}.${DatabaseOperation}` | EventPhase;
76
+ /**
77
+ * Map operation name to ZenStack Args type for a given schema and model
78
+ */
79
+ type OperationArgsMap<S extends SchemaDef, M extends Extract<keyof S['models'], string>, O extends DatabaseOperation> = O extends 'create' ? CreateArgs<S, M> : O extends 'createMany' ? CreateManyArgs<S, M> : O extends 'update' ? UpdateArgs<S, M> : O extends 'updateMany' ? UpdateManyArgs<S, M> : O extends 'delete' ? DeleteArgs<S, M> : O extends 'deleteMany' ? DeleteManyArgs<S, M> : O extends 'findUnique' ? FindUniqueArgs<S, M> : O extends 'findFirst' ? FindFirstArgs<S, M> : O extends 'findMany' ? FindManyArgs<S, M> : O extends 'upsert' ? UpsertArgs<S, M> : O extends 'count' ? CountArgs<S, M> : O extends 'aggregate' ? AggregateArgs<S, M> : O extends 'groupBy' ? GroupByArgs<S, M> : never;
80
+ /**
81
+ * Extract the data/where property from operation args.
82
+ */
83
+ type GetData<M extends ModelName, O extends DatabaseOperation> = M extends Extract<keyof InferAnySchema['models'], string> ? OperationArgsMap<InferAnySchema, M, O> extends {
84
+ data: infer D;
85
+ } ? D : OperationArgsMap<InferAnySchema, M, O> extends {
86
+ where: infer W;
87
+ } ? W : OperationArgsMap<InferAnySchema, M, O> : unknown;
88
+ /**
89
+ * Extract result type for a model operation.
90
+ */
91
+ type GetResult<M extends ModelName, O extends DatabaseOperation> = M extends Extract<keyof InferAnySchema['models'], string> ? O extends 'findMany' | 'createMany' | 'updateMany' | 'deleteMany' ? ModelResult<InferAnySchema, M>[] : O extends 'count' ? number : ModelResult<InferAnySchema, M> : unknown;
92
+ /**
93
+ * Parse event string into structured type for discriminated unions
94
+ */
95
+ type ParseEvent<E extends string> = E extends `${infer Phase extends EventPhase}.${infer Model extends ModelName}.${infer Op extends DatabaseOperation}` ? {
96
+ phase: Phase;
97
+ model: Model;
98
+ operation: Op;
99
+ type: 'exact';
100
+ } : E extends `${infer Phase extends EventPhase}.${infer Second}` ? Second extends ModelName ? {
101
+ phase: Phase;
102
+ model: Second;
103
+ type: 'model-wildcard';
104
+ } : Second extends DatabaseOperation ? {
105
+ phase: Phase;
106
+ operation: Second;
107
+ type: 'operation-wildcard';
108
+ } : never : E extends EventPhase ? {
109
+ phase: E;
110
+ type: 'phase-wildcard';
111
+ } : never;
112
+ /** Base context fields present in all events */
113
+ interface BaseEventContext {}
114
+ /** Context for exact database events (e.g., "after.User.create") */
115
+ interface ExactDatabaseEventContext<M extends ModelName, O extends DatabaseOperation, Phase extends EventPhase> extends BaseEventContext {
116
+ data: Phase extends 'before' ? GetData<M, O> : Readonly<GetData<M, O>>;
117
+ result: Phase extends 'after' ? GetResult<M, O> : undefined;
118
+ }
119
+ /** Context for model wildcard events (e.g., "after.User") */
120
+ interface ModelWildcardEventContext<Phase extends EventPhase> extends BaseEventContext {
121
+ operation: DatabaseOperation;
122
+ data: Phase extends 'before' ? unknown : Readonly<unknown>;
123
+ result: Phase extends 'after' ? unknown : undefined;
124
+ }
125
+ /** Context for operation wildcard events (e.g., "after.create") */
126
+ interface OperationWildcardEventContext<Phase extends EventPhase> extends BaseEventContext {
127
+ model: ModelName;
128
+ data: Phase extends 'before' ? unknown : Readonly<unknown>;
129
+ result: Phase extends 'after' ? unknown : undefined;
130
+ }
131
+ /** Context for phase wildcard events (e.g., "after" or "before") */
132
+ interface PhaseWildcardEventContext<Phase extends EventPhase> extends BaseEventContext {
133
+ model: ModelName;
134
+ operation: DatabaseOperation;
135
+ data: Phase extends 'before' ? unknown : Readonly<unknown>;
136
+ result: Phase extends 'after' ? unknown : undefined;
137
+ }
138
+ /**
139
+ * Type-safe event context with discriminated unions.
140
+ */
141
+ type DatabaseEventContext<E extends string> = ParseEvent<E> extends {
142
+ phase: infer P extends EventPhase;
143
+ model: infer M extends ModelName;
144
+ operation: infer O extends DatabaseOperation;
145
+ type: 'exact';
146
+ } ? ExactDatabaseEventContext<M, O, P> : ParseEvent<E> extends {
147
+ phase: infer P extends EventPhase;
148
+ model: infer _M extends ModelName;
149
+ type: 'model-wildcard';
150
+ } ? ModelWildcardEventContext<P> : ParseEvent<E> extends {
151
+ phase: infer P extends EventPhase;
152
+ operation: infer _O extends DatabaseOperation;
153
+ type: 'operation-wildcard';
154
+ } ? OperationWildcardEventContext<P> : ParseEvent<E> extends {
155
+ phase: infer P extends EventPhase;
156
+ type: 'phase-wildcard';
157
+ } ? PhaseWildcardEventContext<P> : BaseEventContext;
158
+ /**
159
+ * Mapped type that produces all database event name to context pairs.
160
+ *
161
+ * Used to augment core's `CustomEventRegistry`:
162
+ *
163
+ * @example
164
+ * ```typescript
165
+ * declare module 'stratal/events' {
166
+ * interface CustomEventRegistry extends DatabaseEvents {}
167
+ * }
168
+ * ```
169
+ */
170
+ type DatabaseEvents = { [E in DatabaseEventName]: DatabaseEventContext<E> };
171
+ declare module 'stratal/events' {
172
+ interface CustomEventRegistry extends DatabaseEvents {}
173
+ }
174
+ //#endregion
175
+ //#region src/database/errors/database-error.d.ts
176
+ /**
177
+ * DatabaseError
178
+ *
179
+ * Generic database error thrown when a database operation fails
180
+ * and doesn't fit into a more specific error category.
181
+ *
182
+ * This is the base class for all database-related errors.
183
+ */
184
+ declare class DatabaseError extends ApplicationError {
185
+ constructor(messageKey?: MessageKeys, code?: ErrorCode, metadata?: Record<string, unknown>);
186
+ }
187
+ //#endregion
188
+ //#region src/database/errors/database-config.error.d.ts
189
+ declare class DatabaseConfigError extends DatabaseError {
190
+ constructor(details: string);
191
+ }
192
+ //#endregion
193
+ //#region src/database/errors/foreign-key-constraint.error.d.ts
194
+ /**
195
+ * ForeignKeyConstraintError
196
+ *
197
+ * Thrown when a database foreign key constraint is violated.
198
+ * This typically occurs when:
199
+ * - Trying to insert a record with a foreign key that doesn't exist
200
+ * - Trying to delete a record that is referenced by other records
201
+ * - Trying to update a foreign key to a non-existent value
202
+ */
203
+ declare class ForeignKeyConstraintError extends DatabaseError {
204
+ constructor(field?: string);
205
+ }
206
+ //#endregion
207
+ //#region src/database/errors/invalid-error-code-range.error.d.ts
208
+ /**
209
+ * InvalidErrorCodeRangeError
210
+ *
211
+ * Thrown when a DatabaseError subclass is constructed with an error code
212
+ * outside the valid database error range (2000-2999).
213
+ * This is a developer-facing error to enforce error code conventions.
214
+ */
215
+ declare class InvalidErrorCodeRangeError extends ApplicationError {
216
+ constructor(code: number, expectedRange: string);
217
+ }
218
+ //#endregion
219
+ //#region src/database/errors/record-not-found.error.d.ts
220
+ /**
221
+ * RecordNotFoundError
222
+ *
223
+ * Generic error thrown when a database record is not found.
224
+ * This is typically thrown when a findUnique or findFirst operation
225
+ * returns null, or when a required record doesn't exist.
226
+ *
227
+ * Services should catch this and optionally refine it to a more specific
228
+ * domain error (e.g., NoteNotFoundError, UserNotFoundError).
229
+ */
230
+ declare class RecordNotFoundError extends DatabaseError {
231
+ constructor(details?: string);
232
+ }
233
+ //#endregion
234
+ //#region src/database/errors/unique-constraint.error.d.ts
235
+ /**
236
+ * UniqueConstraintError
237
+ *
238
+ * Thrown when a database unique constraint is violated.
239
+ * This typically occurs when trying to insert or update a record
240
+ * with a value that already exists in a unique column.
241
+ *
242
+ * Services should catch this and optionally refine it to a more specific
243
+ * domain error (e.g., UserEmailAlreadyExistsError).
244
+ */
245
+ declare class UniqueConstraintError extends DatabaseError {
246
+ constructor(fields?: string[]);
247
+ }
248
+ //#endregion
249
+ //#region src/database/errors/from-zenstack-error.d.ts
250
+ /**
251
+ * Transform ZenStack ORM errors into ApplicationError instances
252
+ *
253
+ * This function maps ORMError codes to generic database error classes.
254
+ * Services can catch these generic errors and optionally refine them to
255
+ * more specific domain errors if needed.
256
+ *
257
+ * @param error - The error thrown by ZenStack ORM
258
+ * @returns An ApplicationError instance
259
+ *
260
+ * @example
261
+ * ```typescript
262
+ * try {
263
+ * await db.user.create({ data: { email: 'existing@example.com' } })
264
+ * } catch (error) {
265
+ * throw fromZenStackError(error) // Becomes UniqueConstraintError or other
266
+ * }
267
+ * ```
268
+ */
269
+ declare function fromZenStackError(error: unknown): DatabaseError;
270
+ //#endregion
271
+ //#region src/database/plugins/error-handler.plugin.d.ts
272
+ /**
273
+ * ZenStack runtime plugin that transforms ORM errors into ApplicationError instances.
274
+ *
275
+ * @example
276
+ * ```typescript
277
+ * super(schema, {
278
+ * dialect: new PostgresDialect({ pool }),
279
+ * plugins: [new ErrorHandlerPlugin()]
280
+ * })
281
+ * ```
282
+ */
283
+ declare class ErrorHandlerPlugin implements RuntimePlugin<SchemaDef$1, Record<string, unknown>, Record<string, unknown>> {
284
+ readonly id = "error-handler";
285
+ onQuery: ({
286
+ args,
287
+ proceed
288
+ }: {
289
+ args: Record<string, unknown> | undefined;
290
+ proceed: (args: Record<string, unknown> | undefined) => Promise<unknown>;
291
+ }) => Promise<unknown>;
292
+ }
293
+ //#endregion
294
+ //#region src/database/plugins/event-emitter.plugin.d.ts
295
+ interface EventEmitterPluginOptions {
296
+ eventRegistry: IEventRegistry;
297
+ }
298
+ /**
299
+ * ZenStack runtime plugin that emits before/after events for database operations.
300
+ *
301
+ * Emits events in the format:
302
+ * - `before.{Model}.{operation}` - Before the database operation
303
+ * - `after.{Model}.{operation}` - After the database operation
304
+ *
305
+ * @example
306
+ * ```typescript
307
+ * super(schema, {
308
+ * dialect: new PostgresDialect({ pool }),
309
+ * plugins: [
310
+ * new EventEmitterPlugin({
311
+ * eventRegistry,
312
+ * })
313
+ * ]
314
+ * })
315
+ * ```
316
+ */
317
+ declare class EventEmitterPlugin implements RuntimePlugin<SchemaDef$1, Record<string, unknown>, Record<string, unknown>> {
318
+ private options;
319
+ readonly id = "event-emitter";
320
+ constructor(options: EventEmitterPluginOptions);
321
+ onQuery: ({
322
+ model,
323
+ operation,
324
+ args,
325
+ proceed
326
+ }: {
327
+ model: string;
328
+ operation: string;
329
+ args: Record<string, unknown> | undefined;
330
+ proceed: (args: Record<string, unknown> | undefined) => Promise<unknown>;
331
+ }) => Promise<unknown>;
332
+ }
333
+ //#endregion
334
+ //#region src/database/plugins/schema-switcher.plugin.d.ts
335
+ interface SchemaSwitcherPluginOptions {
336
+ schemaName: string;
337
+ }
338
+ /**
339
+ * ZenStack runtime plugin that sets PostgreSQL search_path before each query.
340
+ * Used for tenant isolation in multi-tenant applications.
341
+ *
342
+ * @example
343
+ * ```typescript
344
+ * super(schema, {
345
+ * dialect: new PostgresDialect({ pool }),
346
+ * plugins: [
347
+ * new SchemaSwitcherPlugin({ schemaName: `tenant_${tenantId}` })
348
+ * ]
349
+ * })
350
+ * ```
351
+ */
352
+ declare class SchemaSwitcherPlugin implements RuntimePlugin<SchemaDef$1, Record<string, unknown>, Record<string, unknown>> {
353
+ private options;
354
+ readonly id = "schema-switcher";
355
+ constructor(options: SchemaSwitcherPluginOptions);
356
+ onQuery: ({
357
+ args,
358
+ proceed,
359
+ client
360
+ }: {
361
+ args: Record<string, unknown> | undefined;
362
+ proceed: (args: Record<string, unknown> | undefined) => Promise<unknown>;
363
+ client: {
364
+ $executeRawUnsafe: (sql: string) => Promise<unknown>;
365
+ };
366
+ }) => Promise<unknown>;
367
+ }
368
+ //#endregion
369
+ //#region src/database/i18n/en.d.ts
370
+ declare const databaseI18n: {
371
+ readonly database: {
372
+ readonly connectionNameRequired: "Connection name is required";
373
+ readonly defaultConnectionRequired: "Default connection name is required";
374
+ readonly connectionRequired: "At least one connection is required";
375
+ readonly duplicateConnections: "Duplicate connection names found";
376
+ readonly defaultConnectionNotFound: "Default connection not found in connections";
377
+ };
378
+ };
379
+ declare module 'stratal/i18n' {
380
+ interface AppMessages {
381
+ database: typeof databaseI18n['database'];
382
+ }
383
+ } //# sourceMappingURL=en.d.ts.map
384
+ //#endregion
385
+ export { DATABASE_TOKENS as C, DatabaseModuleConfig as D, DatabaseModule as E, DatabaseService as O, InjectDB as S, DatabaseConnectionConfig as T, EventPhase as _, EventEmitterPluginOptions as a, ModelName as b, UniqueConstraintError as c, ForeignKeyConstraintError as d, DatabaseConfigError as f, DatabaseOperation as g, DatabaseEvents as h, EventEmitterPlugin as i, RecordNotFoundError as l, DatabaseEventName as m, SchemaSwitcherPlugin as n, ErrorHandlerPlugin as o, DatabaseError as p, SchemaSwitcherPluginOptions as r, fromZenStackError as s, databaseI18n as t, InvalidErrorCodeRangeError as u, GetData as v, connectionSymbol as w, ParseEvent as x, GetResult as y };
386
+ //# sourceMappingURL=index-Dlg8mNjq.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-Dlg8mNjq.d.mts","names":[],"sources":["../src/database/database.service.ts","../src/database/database.module.ts","../src/database/database.tokens.ts","../src/database/decorators/inject-db.decorator.ts","../src/database/event-types.ts","../src/database/errors/database-error.ts","../src/database/errors/database-config.error.ts","../src/database/errors/foreign-key-constraint.error.ts","../src/database/errors/invalid-error-code-range.error.ts","../src/database/errors/record-not-found.error.ts","../src/database/errors/unique-constraint.error.ts","../src/database/errors/from-zenstack-error.ts","../src/database/plugins/error-handler.plugin.ts","../src/database/plugins/event-emitter.plugin.ts","../src/database/plugins/schema-switcher.plugin.ts","../src/database/i18n/en.ts"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { i as InferConnectionSchema, n as DefaultConnectionName, o as StratalDatabase, r as InferAnySchema, t as ConnectionName } from "./types-Gjk0d2qB.mjs";
2
+ import { CustomEventRegistry, EventName } from "stratal/events";
3
+ export { type ConnectionName, type CustomEventRegistry, type DefaultConnectionName, type EventName, type InferAnySchema, type InferConnectionSchema, type StratalDatabase };
package/dist/index.mjs ADDED
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,206 @@
1
+ import { t as AuthContext } from "../auth-context-BD2ApWg1.mjs";
2
+ import { AsyncModuleOptions, DynamicModule } from "stratal/module";
3
+ import { ApplicationError } from "stratal/errors";
4
+ import { Adapter, Enforcer, Model } from "casbin";
5
+
6
+ //#region src/rbac/constants.d.ts
7
+ /**
8
+ * RBAC Constants
9
+ */
10
+ declare const RBAC_CONTEXT_KEYS: {
11
+ /** Key for storing required authorization scopes (permissions) in context */readonly AUTH_SCOPES: symbol;
12
+ };
13
+ //#endregion
14
+ //#region src/rbac/errors/insufficient-permissions.error.d.ts
15
+ /**
16
+ * InsufficientPermissionsError
17
+ *
18
+ * Thrown when a user attempts to perform an action without the required permissions.
19
+ * This error is used by the auth guard after authorization check fails.
20
+ *
21
+ * HTTP Status: 403 Forbidden
22
+ * Error Code: 3102 (AUTHZ.INSUFFICIENT_PERMISSIONS)
23
+ */
24
+ declare class InsufficientPermissionsError extends ApplicationError {
25
+ constructor(requiredScopes: string[], userId?: string);
26
+ }
27
+ //#endregion
28
+ //#region src/rbac/adapters/custom-zenstack-adapter.d.ts
29
+ /**
30
+ * Minimal interface for the database client used by the adapter.
31
+ * The actual DatabaseService extends ZenStackClient which provides these methods
32
+ * when the schema includes a `casbinRule` model.
33
+ */
34
+ interface CasbinDbClient {
35
+ casbinRule: {
36
+ findMany(args?: {
37
+ where?: Record<string, unknown>;
38
+ }): Promise<unknown[]>;
39
+ create(args: {
40
+ data: CasbinRuleCreateInput;
41
+ }): Promise<unknown>;
42
+ createMany(args: {
43
+ data: CasbinRuleCreateInput[];
44
+ }): Promise<unknown>;
45
+ deleteMany(args: {
46
+ where: CasbinRuleCreateInput;
47
+ }): Promise<{
48
+ count: number;
49
+ }>;
50
+ };
51
+ $executeRawUnsafe(query: string, ...values: unknown[]): Promise<unknown>;
52
+ }
53
+ interface CasbinRuleCreateInput {
54
+ ptype: string;
55
+ v0?: string | null;
56
+ v1?: string | null;
57
+ v2?: string | null;
58
+ v3?: string | null;
59
+ v4?: string | null;
60
+ v5?: string | null;
61
+ }
62
+ /**
63
+ * Custom ZenStack adapter for Casbin that works with Cloudflare Workers.
64
+ *
65
+ * Based on the original casbin-prisma-adapter but modified to:
66
+ * - Work with ZenStack v3 ORM clients
67
+ * - Avoid bundling errors in Cloudflare Workers
68
+ * - Accept pre-connected ZenStack clients (request-scoped)
69
+ */
70
+ declare class CustomZenStackAdapter implements Adapter {
71
+ #private;
72
+ filtered: boolean;
73
+ isFiltered(): boolean;
74
+ enableFiltered(enabled: boolean): void;
75
+ constructor(db: CasbinDbClient);
76
+ loadPolicy(model: Model): Promise<void>;
77
+ loadFilteredPolicy(model: Model, filter: Record<string, string[][]>): Promise<void>;
78
+ savePolicy(model: Model): Promise<boolean>;
79
+ addPolicy(_sec: string, ptype: string, rule: string[]): Promise<void>;
80
+ addPolicies(_sec: string, ptype: string, rules: string[][]): Promise<void>;
81
+ removePolicy(_sec: string, ptype: string, rule: string[]): Promise<void>;
82
+ removePolicies(_sec: string, ptype: string, rules: string[][]): Promise<void>;
83
+ removeFilteredPolicy(_sec: string, ptype: string, fieldIndex: number, ...fieldValues: string[]): Promise<void>;
84
+ close(): Promise<void>;
85
+ static newAdapter(db: CasbinDbClient): CustomZenStackAdapter;
86
+ }
87
+ //#endregion
88
+ //#region src/rbac/types.d.ts
89
+ /**
90
+ * Configuration options for the RBAC module
91
+ */
92
+ interface RbacModuleOptions {
93
+ /** Casbin PERM model string */
94
+ model: string;
95
+ /** Default policies: [role, resource, action][] */
96
+ defaultPolicies?: readonly (readonly [string, string, string])[];
97
+ /** Role hierarchy: [childRole, parentRole][] */
98
+ roleHierarchy?: readonly (readonly [string, string])[];
99
+ }
100
+ //#endregion
101
+ //#region src/rbac/services/casbin-enforcer.service.d.ts
102
+ /**
103
+ * CasbinEnforcerService
104
+ *
105
+ * Manages the Casbin enforcer instance for authorization.
106
+ * Model, default policies, and role hierarchy are provided via DI options.
107
+ */
108
+ declare class CasbinEnforcerService {
109
+ protected readonly db: CasbinDbClient;
110
+ protected readonly options: RbacModuleOptions;
111
+ protected enforcer: Enforcer | null;
112
+ constructor(db: CasbinDbClient, options: RbacModuleOptions);
113
+ /**
114
+ * Get or create the enforcer instance
115
+ */
116
+ getEnforcer(): Promise<Enforcer>;
117
+ /**
118
+ * Create a new enforcer instance.
119
+ * Can be overridden by subclasses to customize enforcer creation.
120
+ */
121
+ protected createEnforcer(): Promise<Enforcer>;
122
+ /**
123
+ * Seed default policies into database
124
+ */
125
+ seedPolicies(): Promise<void>;
126
+ /**
127
+ * Clear cached enforcer instance
128
+ */
129
+ clearCache(): void;
130
+ /**
131
+ * Seed role hierarchy into database
132
+ */
133
+ seedRoleHierarchy(): Promise<void>;
134
+ }
135
+ //#endregion
136
+ //#region src/rbac/services/casbin.service.d.ts
137
+ /**
138
+ * CasbinService
139
+ *
140
+ * Request-scoped service that provides the full Casbin RBAC API.
141
+ * Uses AuthContext to get the current user.
142
+ */
143
+ declare class CasbinService {
144
+ protected readonly context: AuthContext;
145
+ protected readonly enforcerService: CasbinEnforcerService;
146
+ constructor(context: AuthContext, enforcerService: CasbinEnforcerService);
147
+ protected getEnforcer(): Promise<Enforcer>;
148
+ addRoleForUser(userId: string, role: string): Promise<boolean>;
149
+ deleteRoleForUser(userId: string, role: string): Promise<boolean>;
150
+ deleteRolesForUser(userId: string): Promise<boolean>;
151
+ getRolesForUser(userId: string): Promise<string[]>;
152
+ getImplicitRolesForUser(userId: string): Promise<string[]>;
153
+ getUsersForRole(role: string): Promise<string[]>;
154
+ getImplicitUsersForRole(role: string): Promise<string[]>;
155
+ hasRoleForUser(userId: string, role: string): Promise<boolean>;
156
+ addRoleInheritance(childRole: string, parentRole: string): Promise<boolean>;
157
+ deleteRoleInheritance(childRole: string, parentRole: string): Promise<boolean>;
158
+ deleteUser(userId: string): Promise<boolean>;
159
+ deleteRole(role: string): Promise<boolean>;
160
+ getCurrentUserRoles(): Promise<string[]>;
161
+ currentUserHasRole(role: string): Promise<boolean>;
162
+ setRolesForUser(userId: string, roles: string[]): Promise<void>;
163
+ hasPermission(userId: string, scope: string, action: string): Promise<boolean>;
164
+ currentUserHasPermission(scope: string, action: string): Promise<boolean>;
165
+ hasAnyPermission(userId: string, scopes: string[], action: string): Promise<boolean>;
166
+ currentUserHasAnyPermission(scopes: string[], action: string): Promise<boolean>;
167
+ getPermissionsForUserAsCasbinJs(userId: string): Promise<Record<string, string[]>>;
168
+ getCurrentUserPermissionsAsCasbinJs(): Promise<Record<string, string[]>>;
169
+ }
170
+ //#endregion
171
+ //#region src/rbac/rbac.module.d.ts
172
+ /**
173
+ * RBAC Module
174
+ *
175
+ * Provides role-based access control using Casbin.
176
+ * Fully configurable — no hardcoded roles, policies, or model.
177
+ *
178
+ * @example
179
+ * ```typescript
180
+ * @Module({
181
+ * imports: [
182
+ * RbacModule.forRoot({
183
+ * model: MY_RBAC_MODEL,
184
+ * defaultPolicies: [['admin', 'users:*', '.*']],
185
+ * roleHierarchy: [['super_admin', 'admin']],
186
+ * })
187
+ * ]
188
+ * })
189
+ * ```
190
+ */
191
+ declare class RbacModule {
192
+ static forRoot(options: RbacModuleOptions): DynamicModule;
193
+ static forRootAsync(options: AsyncModuleOptions<RbacModuleOptions>): DynamicModule;
194
+ }
195
+ //#endregion
196
+ //#region src/rbac/tokens.d.ts
197
+ /**
198
+ * RBAC DI Tokens
199
+ */
200
+ declare const RBAC_TOKENS: {
201
+ /** Request-scoped Casbin service with auto context resolution */readonly CasbinService: symbol; /** RBAC module options (model, policies, hierarchy) */
202
+ readonly Options: symbol;
203
+ };
204
+ //#endregion
205
+ export { CasbinEnforcerService, CasbinService, CustomZenStackAdapter, InsufficientPermissionsError, RBAC_CONTEXT_KEYS, RBAC_TOKENS, RbacModule, type RbacModuleOptions };
206
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/rbac/constants.ts","../../src/rbac/errors/insufficient-permissions.error.ts","../../src/rbac/adapters/custom-zenstack-adapter.ts","../../src/rbac/types.ts","../../src/rbac/services/casbin-enforcer.service.ts","../../src/rbac/services/casbin.service.ts","../../src/rbac/rbac.module.ts","../../src/rbac/tokens.ts"],"mappings":"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"}