@stratal/framework 0.0.13 → 0.0.14

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,99 @@
1
+ import { O as DatabaseService } from "../index-Dlg8mNjq.mjs";
2
+ import { Faker } from "@faker-js/faker";
3
+
4
+ //#region src/factory/factory.d.ts
5
+ /**
6
+ * Factory
7
+ *
8
+ * Abstract base class for creating test data.
9
+ * Integrates with Faker.js for data generation.
10
+ *
11
+ * @example Define a factory
12
+ * ```typescript
13
+ * import { Factory } from '@stratal/framework/factory'
14
+ * import type { User, UserCreateInput } from '@your-app/db'
15
+ *
16
+ * export class UserFactory extends Factory<User, UserCreateInput> {
17
+ * protected model = 'user'
18
+ *
19
+ * protected definition(): UserCreateInput {
20
+ * return {
21
+ * email: this.faker.internet.email(),
22
+ * firstName: this.faker.person.firstName(),
23
+ * lastName: this.faker.person.lastName(),
24
+ * emailVerified: true,
25
+ * }
26
+ * }
27
+ *
28
+ * admin() {
29
+ * return this.state(attrs => ({ ...attrs, role: 'admin' }))
30
+ * }
31
+ * }
32
+ * ```
33
+ *
34
+ * @example Usage
35
+ * ```typescript
36
+ * const user = await new UserFactory().create(ctx.db)
37
+ * const admin = await new UserFactory().admin().create(ctx.db)
38
+ * const users = await new UserFactory().count(10).createManyAndReturn(ctx.db)
39
+ * ```
40
+ */
41
+ declare abstract class Factory<TModel, TCreateInput> {
42
+ protected readonly faker: Faker;
43
+ protected abstract model: string;
44
+ protected abstract definition(): TCreateInput;
45
+ private states;
46
+ private _count;
47
+ state(modifier: (attrs: TCreateInput) => Partial<TCreateInput>): this;
48
+ count(n: number): this;
49
+ make(): TCreateInput;
50
+ makeMany(count?: number): TCreateInput[];
51
+ create(db: DatabaseService): Promise<TModel>;
52
+ createMany(db: DatabaseService, count?: number): Promise<{
53
+ count: number;
54
+ }>;
55
+ createManyAndReturn(db: DatabaseService, count?: number): Promise<TModel[]>;
56
+ protected clone(): this;
57
+ }
58
+ //#endregion
59
+ //#region src/factory/sequence.d.ts
60
+ /**
61
+ * Sequence
62
+ *
63
+ * Auto-incrementing sequence generator for creating unique values.
64
+ *
65
+ * @example Basic usage
66
+ * ```typescript
67
+ * const emailSeq = new Sequence((n) => `user${n}@example.com`)
68
+ *
69
+ * emailSeq.next() // 'user1@example.com'
70
+ * emailSeq.next() // 'user2@example.com'
71
+ * emailSeq.reset()
72
+ * emailSeq.next() // 'user1@example.com'
73
+ * ```
74
+ *
75
+ * @example With factory
76
+ * ```typescript
77
+ * const orderSeq = new Sequence((n) => `ORD-${String(n).padStart(6, '0')}`)
78
+ *
79
+ * export class OrderFactory extends Factory<Order, OrderCreateInput> {
80
+ * protected definition() {
81
+ * return {
82
+ * orderNumber: orderSeq.next(),
83
+ * // ...
84
+ * }
85
+ * }
86
+ * }
87
+ * ```
88
+ */
89
+ declare class Sequence<T = number> {
90
+ private readonly generator?;
91
+ private current;
92
+ constructor(generator?: ((n: number) => T) | undefined);
93
+ next(): T;
94
+ peek(): T;
95
+ reset(): void;
96
+ }
97
+ //#endregion
98
+ export { Factory, Sequence };
99
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/factory/factory.ts","../../src/factory/sequence.ts"],"mappings":";;;;;;AAuCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAAsB,OAAA;EAAA,mBACD,KAAA,EAAO,KAAA;EAAA,mBACP,KAAA;EAAA,mBACA,UAAA,CAAA,GAAc,YAAA;EAAA,QAEzB,MAAA;EAAA,QACA,MAAA;EAER,KAAA,CAAM,QAAA,GAAW,KAAA,EAAO,YAAA,KAAiB,OAAA,CAAQ,YAAA;EAMjD,KAAA,CAAM,CAAA;EAMN,IAAA,CAAA,GAAQ,YAAA;EAQR,QAAA,CAAS,KAAA,YAAiB,YAAA;EAKpB,MAAA,CAAO,EAAA,EAAI,eAAA,GAAkB,OAAA,CAAQ,MAAA;EAMrC,UAAA,CAAW,EAAA,EAAI,eAAA,EAAiB,KAAA,YAAiB,OAAA;IAAU,KAAA;EAAA;EAM3D,mBAAA,CAAoB,EAAA,EAAI,eAAA,EAAiB,KAAA,YAAiB,OAAA,CAAQ,MAAA;EAAA,UAM9D,KAAA,CAAA;AAAA;;;;;;;AAnDZ;;;;;;;;;;;;;;;;;;;;;;;;;cCVa,QAAA;EAAA,iBAGkB,SAAA;EAAA,QAFrB,OAAA;cAEqB,SAAA,KAAa,CAAA,aAAc,CAAA;EAExD,IAAA,CAAA,GAAQ,CAAA;EAQR,IAAA,CAAA,GAAQ,CAAA;EAQR,KAAA,CAAA;AAAA"}
@@ -0,0 +1,138 @@
1
+ import { faker } from "@faker-js/faker";
2
+ //#region src/factory/factory.ts
3
+ /**
4
+ * Factory
5
+ *
6
+ * Abstract base class for creating test data.
7
+ * Integrates with Faker.js for data generation.
8
+ *
9
+ * @example Define a factory
10
+ * ```typescript
11
+ * import { Factory } from '@stratal/framework/factory'
12
+ * import type { User, UserCreateInput } from '@your-app/db'
13
+ *
14
+ * export class UserFactory extends Factory<User, UserCreateInput> {
15
+ * protected model = 'user'
16
+ *
17
+ * protected definition(): UserCreateInput {
18
+ * return {
19
+ * email: this.faker.internet.email(),
20
+ * firstName: this.faker.person.firstName(),
21
+ * lastName: this.faker.person.lastName(),
22
+ * emailVerified: true,
23
+ * }
24
+ * }
25
+ *
26
+ * admin() {
27
+ * return this.state(attrs => ({ ...attrs, role: 'admin' }))
28
+ * }
29
+ * }
30
+ * ```
31
+ *
32
+ * @example Usage
33
+ * ```typescript
34
+ * const user = await new UserFactory().create(ctx.db)
35
+ * const admin = await new UserFactory().admin().create(ctx.db)
36
+ * const users = await new UserFactory().count(10).createManyAndReturn(ctx.db)
37
+ * ```
38
+ */
39
+ var Factory = class {
40
+ faker = faker;
41
+ states = [];
42
+ _count = 1;
43
+ state(modifier) {
44
+ const clone = this.clone();
45
+ clone.states.push(modifier);
46
+ return clone;
47
+ }
48
+ count(n) {
49
+ const clone = this.clone();
50
+ clone._count = n;
51
+ return clone;
52
+ }
53
+ make() {
54
+ let attrs = this.definition();
55
+ for (const modifier of this.states) attrs = {
56
+ ...attrs,
57
+ ...modifier(attrs)
58
+ };
59
+ return attrs;
60
+ }
61
+ makeMany(count) {
62
+ const n = count ?? this._count;
63
+ return Array.from({ length: n }, () => this.make());
64
+ }
65
+ async create(db) {
66
+ const data = this.make();
67
+ return db[this.model].create({ data });
68
+ }
69
+ async createMany(db, count) {
70
+ const data = this.makeMany(count);
71
+ return db[this.model].createMany({ data });
72
+ }
73
+ async createManyAndReturn(db, count) {
74
+ const data = this.makeMany(count);
75
+ return db[this.model].createManyAndReturn({ data });
76
+ }
77
+ clone() {
78
+ const FactoryClass = this.constructor;
79
+ const clone = new FactoryClass();
80
+ clone.states = [...this.states];
81
+ clone._count = this._count;
82
+ return clone;
83
+ }
84
+ };
85
+ //#endregion
86
+ //#region src/factory/sequence.ts
87
+ /**
88
+ * Sequence
89
+ *
90
+ * Auto-incrementing sequence generator for creating unique values.
91
+ *
92
+ * @example Basic usage
93
+ * ```typescript
94
+ * const emailSeq = new Sequence((n) => `user${n}@example.com`)
95
+ *
96
+ * emailSeq.next() // 'user1@example.com'
97
+ * emailSeq.next() // 'user2@example.com'
98
+ * emailSeq.reset()
99
+ * emailSeq.next() // 'user1@example.com'
100
+ * ```
101
+ *
102
+ * @example With factory
103
+ * ```typescript
104
+ * const orderSeq = new Sequence((n) => `ORD-${String(n).padStart(6, '0')}`)
105
+ *
106
+ * export class OrderFactory extends Factory<Order, OrderCreateInput> {
107
+ * protected definition() {
108
+ * return {
109
+ * orderNumber: orderSeq.next(),
110
+ * // ...
111
+ * }
112
+ * }
113
+ * }
114
+ * ```
115
+ */
116
+ var Sequence = class {
117
+ current = 0;
118
+ constructor(generator) {
119
+ this.generator = generator;
120
+ }
121
+ next() {
122
+ this.current++;
123
+ if (this.generator) return this.generator(this.current);
124
+ return this.current;
125
+ }
126
+ peek() {
127
+ const value = this.current + 1;
128
+ if (this.generator) return this.generator(value);
129
+ return value;
130
+ }
131
+ reset() {
132
+ this.current = 0;
133
+ }
134
+ };
135
+ //#endregion
136
+ export { Factory, Sequence };
137
+
138
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/factory/factory.ts","../../src/factory/sequence.ts"],"sourcesContent":["import { faker, type Faker } from '@faker-js/faker'\nimport type { DatabaseService } from '../database'\n\n/**\n * Factory\n *\n * Abstract base class for creating test data.\n * Integrates with Faker.js for data generation.\n *\n * @example Define a factory\n * ```typescript\n * import { Factory } from '@stratal/framework/factory'\n * import type { User, UserCreateInput } from '@your-app/db'\n *\n * export class UserFactory extends Factory<User, UserCreateInput> {\n * protected model = 'user'\n *\n * protected definition(): UserCreateInput {\n * return {\n * email: this.faker.internet.email(),\n * firstName: this.faker.person.firstName(),\n * lastName: this.faker.person.lastName(),\n * emailVerified: true,\n * }\n * }\n *\n * admin() {\n * return this.state(attrs => ({ ...attrs, role: 'admin' }))\n * }\n * }\n * ```\n *\n * @example Usage\n * ```typescript\n * const user = await new UserFactory().create(ctx.db)\n * const admin = await new UserFactory().admin().create(ctx.db)\n * const users = await new UserFactory().count(10).createManyAndReturn(ctx.db)\n * ```\n */\nexport abstract class Factory<TModel, TCreateInput> {\n protected readonly faker: Faker = faker\n protected abstract model: string\n protected abstract definition(): TCreateInput\n\n private states: ((attrs: TCreateInput) => Partial<TCreateInput>)[] = []\n private _count = 1\n\n state(modifier: (attrs: TCreateInput) => Partial<TCreateInput>): this {\n const clone = this.clone()\n clone.states.push(modifier)\n return clone\n }\n\n count(n: number): this {\n const clone = this.clone()\n clone._count = n\n return clone\n }\n\n make(): TCreateInput {\n let attrs = this.definition()\n for (const modifier of this.states) {\n attrs = { ...attrs, ...modifier(attrs) }\n }\n return attrs\n }\n\n makeMany(count?: number): TCreateInput[] {\n const n = count ?? this._count\n return Array.from({ length: n }, () => this.make())\n }\n\n async create(db: DatabaseService): Promise<TModel> {\n const data = this.make()\n const model = (db as unknown as Record<string, { create: (args: { data: TCreateInput }) => Promise<TModel> }>)[this.model]\n return model.create({ data })\n }\n\n async createMany(db: DatabaseService, count?: number): Promise<{ count: number }> {\n const data = this.makeMany(count)\n const model = (db as unknown as Record<string, { createMany: (args: { data: TCreateInput[] }) => Promise<{ count: number }> }>)[this.model]\n return model.createMany({ data })\n }\n\n async createManyAndReturn(db: DatabaseService, count?: number): Promise<TModel[]> {\n const data = this.makeMany(count)\n const model = (db as unknown as Record<string, { createManyAndReturn: (args: { data: TCreateInput[] }) => Promise<TModel[]> }>)[this.model]\n return model.createManyAndReturn({ data })\n }\n\n protected clone(): this {\n const FactoryClass = this.constructor as new () => this\n const clone = new FactoryClass()\n clone.states = [...this.states]\n clone._count = this._count\n return clone\n }\n}\n","/**\n * Sequence\n *\n * Auto-incrementing sequence generator for creating unique values.\n *\n * @example Basic usage\n * ```typescript\n * const emailSeq = new Sequence((n) => `user${n}@example.com`)\n *\n * emailSeq.next() // 'user1@example.com'\n * emailSeq.next() // 'user2@example.com'\n * emailSeq.reset()\n * emailSeq.next() // 'user1@example.com'\n * ```\n *\n * @example With factory\n * ```typescript\n * const orderSeq = new Sequence((n) => `ORD-${String(n).padStart(6, '0')}`)\n *\n * export class OrderFactory extends Factory<Order, OrderCreateInput> {\n * protected definition() {\n * return {\n * orderNumber: orderSeq.next(),\n * // ...\n * }\n * }\n * }\n * ```\n */\nexport class Sequence<T = number> {\n private current = 0\n\n constructor(private readonly generator?: (n: number) => T) {}\n\n next(): T {\n this.current++\n if (this.generator) {\n return this.generator(this.current)\n }\n return this.current as T\n }\n\n peek(): T {\n const value = this.current + 1\n if (this.generator) {\n return this.generator(value)\n }\n return value as T\n }\n\n reset(): void {\n this.current = 0\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,IAAsB,UAAtB,MAAoD;CAClD,QAAkC;CAIlC,SAAqE,EAAE;CACvE,SAAiB;CAEjB,MAAM,UAAgE;EACpE,MAAM,QAAQ,KAAK,OAAO;AAC1B,QAAM,OAAO,KAAK,SAAS;AAC3B,SAAO;;CAGT,MAAM,GAAiB;EACrB,MAAM,QAAQ,KAAK,OAAO;AAC1B,QAAM,SAAS;AACf,SAAO;;CAGT,OAAqB;EACnB,IAAI,QAAQ,KAAK,YAAY;AAC7B,OAAK,MAAM,YAAY,KAAK,OAC1B,SAAQ;GAAE,GAAG;GAAO,GAAG,SAAS,MAAM;GAAE;AAE1C,SAAO;;CAGT,SAAS,OAAgC;EACvC,MAAM,IAAI,SAAS,KAAK;AACxB,SAAO,MAAM,KAAK,EAAE,QAAQ,GAAG,QAAQ,KAAK,MAAM,CAAC;;CAGrD,MAAM,OAAO,IAAsC;EACjD,MAAM,OAAO,KAAK,MAAM;AAExB,SADe,GAAgG,KAAK,OACvG,OAAO,EAAE,MAAM,CAAC;;CAG/B,MAAM,WAAW,IAAqB,OAA4C;EAChF,MAAM,OAAO,KAAK,SAAS,MAAM;AAEjC,SADe,GAAiH,KAAK,OACxH,WAAW,EAAE,MAAM,CAAC;;CAGnC,MAAM,oBAAoB,IAAqB,OAAmC;EAChF,MAAM,OAAO,KAAK,SAAS,MAAM;AAEjC,SADe,GAAiH,KAAK,OACxH,oBAAoB,EAAE,MAAM,CAAC;;CAG5C,QAAwB;EACtB,MAAM,eAAe,KAAK;EAC1B,MAAM,QAAQ,IAAI,cAAc;AAChC,QAAM,SAAS,CAAC,GAAG,KAAK,OAAO;AAC/B,QAAM,SAAS,KAAK;AACpB,SAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AClEX,IAAa,WAAb,MAAkC;CAChC,UAAkB;CAElB,YAAY,WAA+C;AAA9B,OAAA,YAAA;;CAE7B,OAAU;AACR,OAAK;AACL,MAAI,KAAK,UACP,QAAO,KAAK,UAAU,KAAK,QAAQ;AAErC,SAAO,KAAK;;CAGd,OAAU;EACR,MAAM,QAAQ,KAAK,UAAU;AAC7B,MAAI,KAAK,UACP,QAAO,KAAK,UAAU,MAAM;AAE9B,SAAO;;CAGT,QAAc;AACZ,OAAK,UAAU"}
@@ -1,4 +1,6 @@
1
- import type { AuthGuardOptions, GuardClass } from 'stratal/guards';
1
+ import { AuthGuardOptions, AuthGuardOptions as AuthGuardOptions$1, CanActivate, GUARD_METADATA_KEY, Guard, GuardClass, GuardClass as GuardClass$1, GuardExecutionService, GuardMetadata, UseGuards, getControllerGuards, getMethodGuards } from "stratal/guards";
2
+
3
+ //#region src/guards/auth.guard.d.ts
2
4
  /**
3
5
  * AuthGuard Factory
4
6
  *
@@ -29,5 +31,7 @@ import type { AuthGuardOptions, GuardClass } from 'stratal/guards';
29
31
  * export class StudentsController { }
30
32
  * ```
31
33
  */
32
- export declare function AuthGuard(options?: AuthGuardOptions): GuardClass;
33
- //# sourceMappingURL=auth.guard.d.ts.map
34
+ declare function AuthGuard(options?: AuthGuardOptions$1): GuardClass$1;
35
+ //#endregion
36
+ export { AuthGuard, type AuthGuardOptions, type CanActivate, GUARD_METADATA_KEY, type Guard, type GuardClass, GuardExecutionService, type GuardMetadata, UseGuards, getControllerGuards, getMethodGuards };
37
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/guards/auth.guard.ts"],"mappings":";;;;;AAyCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,SAAA,CAAU,OAAA,GAAU,kBAAA,GAAmB,YAAA"}
@@ -0,0 +1,93 @@
1
+ import { n as UserNotAuthenticatedError } from "../errors-C_KIIU1v.mjs";
2
+ import { t as __decorate } from "../decorate-RSane8dy.mjs";
3
+ import { t as __decorateMetadata } from "../decorateMetadata-CETItPez.mjs";
4
+ import { t as __decorateParam } from "../decorateParam-CcTvpNsw.mjs";
5
+ import { n as InsufficientPermissionsError, t as RBAC_TOKENS } from "../tokens-Di1ofovy.mjs";
6
+ import { DI_TOKENS, Transient } from "stratal/di";
7
+ import { inject } from "tsyringe";
8
+ import { GUARD_METADATA_KEY, GuardExecutionService, UseGuards, getControllerGuards, getMethodGuards } from "stratal/guards";
9
+ import { LOGGER_TOKENS } from "stratal/logger";
10
+ //#region src/guards/auth.guard.ts
11
+ /**
12
+ * AuthGuard Factory
13
+ *
14
+ * Creates a guard class that enforces authentication and optional authorization.
15
+ *
16
+ * **Authentication (no scopes):**
17
+ * - Checks if user is authenticated via AuthContext.isAuthenticated()
18
+ * - Throws UserNotAuthenticatedError (401) if not authenticated
19
+ *
20
+ * **Authorization (with scopes):**
21
+ * - First verifies authentication
22
+ * - Then checks permissions via CasbinService
23
+ * - Throws InsufficientPermissionsError (403) if unauthorized
24
+ *
25
+ * @param options - Configuration options
26
+ * @param options.scopes - Required permissions for authorization
27
+ * @returns Guard class for use with @UseGuards decorator
28
+ *
29
+ * @example Authentication only
30
+ * ```typescript
31
+ * @UseGuards(AuthGuard())
32
+ * export class ProfileController { }
33
+ * ```
34
+ *
35
+ * @example Authentication with permissions
36
+ * ```typescript
37
+ * @UseGuards(AuthGuard({ scopes: ['students:read'] }))
38
+ * export class StudentsController { }
39
+ * ```
40
+ */
41
+ function AuthGuard(options) {
42
+ const scopes = options?.scopes;
43
+ let ConfiguredAuthGuard = class ConfiguredAuthGuard {
44
+ constructor(authContext, logger, casbinService) {
45
+ this.authContext = authContext;
46
+ this.logger = logger;
47
+ this.casbinService = casbinService;
48
+ }
49
+ async canActivate(context) {
50
+ if (!this.authContext.isAuthenticated()) {
51
+ this.logger.debug("Auth guard: User not authenticated");
52
+ throw new UserNotAuthenticatedError();
53
+ }
54
+ if (!scopes || scopes.length === 0) {
55
+ this.logger.debug("Auth guard: Authentication passed (no scopes required)");
56
+ return true;
57
+ }
58
+ const userId = this.authContext.getUserId();
59
+ if (!userId) {
60
+ this.logger.debug("Auth guard: No user ID in context");
61
+ throw new InsufficientPermissionsError(scopes, void 0);
62
+ }
63
+ const httpMethod = context.c.req.method.toLowerCase();
64
+ if (this.casbinService) {
65
+ const hasPermission = await this.casbinService.hasAnyPermission(userId, scopes, httpMethod);
66
+ this.logger.debug("Auth guard: Authorization check", {
67
+ userId,
68
+ scopes,
69
+ httpMethod,
70
+ hasPermission
71
+ });
72
+ if (!hasPermission) throw new InsufficientPermissionsError(scopes, userId);
73
+ }
74
+ return true;
75
+ }
76
+ };
77
+ ConfiguredAuthGuard = __decorate([
78
+ Transient(),
79
+ __decorateParam(0, inject(DI_TOKENS.AuthContext)),
80
+ __decorateParam(1, inject(LOGGER_TOKENS.LoggerService)),
81
+ __decorateParam(2, inject(RBAC_TOKENS.CasbinService, { isOptional: true })),
82
+ __decorateMetadata("design:paramtypes", [
83
+ Object,
84
+ Object,
85
+ Object
86
+ ])
87
+ ], ConfiguredAuthGuard);
88
+ return ConfiguredAuthGuard;
89
+ }
90
+ //#endregion
91
+ export { AuthGuard, GUARD_METADATA_KEY, GuardExecutionService, UseGuards, getControllerGuards, getMethodGuards };
92
+
93
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/guards/auth.guard.ts"],"sourcesContent":["import { DI_TOKENS, Transient } from 'stratal/di'\nimport type { AuthGuardOptions, CanActivate, GuardClass } from 'stratal/guards'\nimport { LOGGER_TOKENS, type LoggerService } from 'stratal/logger'\nimport type { RouterContext } from 'stratal/router'\nimport { inject } from 'tsyringe'\nimport type { AuthContext } from '../context/auth-context'\nimport { UserNotAuthenticatedError } from '../context/errors'\nimport { InsufficientPermissionsError } from '../rbac/errors/insufficient-permissions.error'\nimport type { CasbinService } from '../rbac/services/casbin.service'\nimport { RBAC_TOKENS } from '../rbac/tokens'\n\n/**\n * AuthGuard Factory\n *\n * Creates a guard class that enforces authentication and optional authorization.\n *\n * **Authentication (no scopes):**\n * - Checks if user is authenticated via AuthContext.isAuthenticated()\n * - Throws UserNotAuthenticatedError (401) if not authenticated\n *\n * **Authorization (with scopes):**\n * - First verifies authentication\n * - Then checks permissions via CasbinService\n * - Throws InsufficientPermissionsError (403) if unauthorized\n *\n * @param options - Configuration options\n * @param options.scopes - Required permissions for authorization\n * @returns Guard class for use with @UseGuards decorator\n *\n * @example Authentication only\n * ```typescript\n * @UseGuards(AuthGuard())\n * export class ProfileController { }\n * ```\n *\n * @example Authentication with permissions\n * ```typescript\n * @UseGuards(AuthGuard({ scopes: ['students:read'] }))\n * export class StudentsController { }\n * ```\n */\nexport function AuthGuard(options?: AuthGuardOptions): GuardClass {\n const scopes = options?.scopes\n\n @Transient()\n class ConfiguredAuthGuard implements CanActivate {\n constructor(\n @inject(DI_TOKENS.AuthContext) private readonly authContext: AuthContext,\n @inject(LOGGER_TOKENS.LoggerService) private readonly logger: LoggerService,\n @inject(RBAC_TOKENS.CasbinService, { isOptional: true }) private readonly casbinService?: CasbinService\n ) { }\n\n async canActivate(context: RouterContext): Promise<boolean> {\n if (!this.authContext.isAuthenticated()) {\n this.logger.debug('Auth guard: User not authenticated')\n throw new UserNotAuthenticatedError()\n }\n\n if (!scopes || scopes.length === 0) {\n this.logger.debug('Auth guard: Authentication passed (no scopes required)')\n return true\n }\n\n const userId = this.authContext.getUserId()\n if (!userId) {\n this.logger.debug('Auth guard: No user ID in context')\n throw new InsufficientPermissionsError(scopes, undefined)\n }\n\n const httpMethod = context.c.req.method.toLowerCase()\n\n if (this.casbinService) {\n const hasPermission = await this.casbinService.hasAnyPermission(\n userId,\n scopes,\n httpMethod\n )\n\n this.logger.debug('Auth guard: Authorization check', {\n userId,\n scopes,\n httpMethod,\n hasPermission,\n })\n\n if (!hasPermission) {\n throw new InsufficientPermissionsError(scopes, userId)\n }\n }\n\n return true\n }\n }\n\n return ConfiguredAuthGuard\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,SAAgB,UAAU,SAAwC;CAChE,MAAM,SAAS,SAAS;CAExB,IAAA,sBAAA,MACM,oBAA2C;EAC/C,YACE,aACA,QACA,eACA;AAHgD,QAAA,cAAA;AACM,QAAA,SAAA;AACoB,QAAA,gBAAA;;EAG5E,MAAM,YAAY,SAA0C;AAC1D,OAAI,CAAC,KAAK,YAAY,iBAAiB,EAAE;AACvC,SAAK,OAAO,MAAM,qCAAqC;AACvD,UAAM,IAAI,2BAA2B;;AAGvC,OAAI,CAAC,UAAU,OAAO,WAAW,GAAG;AAClC,SAAK,OAAO,MAAM,yDAAyD;AAC3E,WAAO;;GAGT,MAAM,SAAS,KAAK,YAAY,WAAW;AAC3C,OAAI,CAAC,QAAQ;AACX,SAAK,OAAO,MAAM,oCAAoC;AACtD,UAAM,IAAI,6BAA6B,QAAQ,KAAA,EAAU;;GAG3D,MAAM,aAAa,QAAQ,EAAE,IAAI,OAAO,aAAa;AAErD,OAAI,KAAK,eAAe;IACtB,MAAM,gBAAgB,MAAM,KAAK,cAAc,iBAC7C,QACA,QACA,WACD;AAED,SAAK,OAAO,MAAM,mCAAmC;KACnD;KACA;KACA;KACA;KACD,CAAC;AAEF,QAAI,CAAC,cACH,OAAM,IAAI,6BAA6B,QAAQ,OAAO;;AAI1D,UAAO;;;;EA9CV,WAAW;qBAGP,OAAO,UAAU,YAAY,CAAA;qBAC7B,OAAO,cAAc,cAAc,CAAA;qBACnC,OAAO,YAAY,eAAe,EAAE,YAAY,MAAM,CAAC,CAAA;;;;;;;AA6C5D,QAAO"}