@awesome-lang-auth/node 1.10.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 (262) hide show
  1. package/LICENSE +21 -0
  2. package/README.detailed.md +4059 -0
  3. package/README.md +248 -0
  4. package/dist/abstract/base-auth-strategy.abstract.d.ts +7 -0
  5. package/dist/abstract/base-auth-strategy.abstract.d.ts.map +1 -0
  6. package/dist/abstract/base-auth-strategy.abstract.js +7 -0
  7. package/dist/abstract/base-auth-strategy.abstract.js.map +1 -0
  8. package/dist/abstract/base-oauth-strategy.abstract.d.ts +27 -0
  9. package/dist/abstract/base-oauth-strategy.abstract.d.ts.map +1 -0
  10. package/dist/abstract/base-oauth-strategy.abstract.js +11 -0
  11. package/dist/abstract/base-oauth-strategy.abstract.js.map +1 -0
  12. package/dist/adapters/express.d.ts +45 -0
  13. package/dist/adapters/express.d.ts.map +1 -0
  14. package/dist/adapters/express.js +49 -0
  15. package/dist/adapters/express.js.map +1 -0
  16. package/dist/adapters/fastify.d.ts +72 -0
  17. package/dist/adapters/fastify.d.ts.map +1 -0
  18. package/dist/adapters/fastify.js +63 -0
  19. package/dist/adapters/fastify.js.map +1 -0
  20. package/dist/auth-configurator.d.ts +65 -0
  21. package/dist/auth-configurator.d.ts.map +1 -0
  22. package/dist/auth-configurator.js +127 -0
  23. package/dist/auth-configurator.js.map +1 -0
  24. package/dist/events/auth-event-bus.d.ts +68 -0
  25. package/dist/events/auth-event-bus.d.ts.map +1 -0
  26. package/dist/events/auth-event-bus.js +60 -0
  27. package/dist/events/auth-event-bus.js.map +1 -0
  28. package/dist/events/auth-event-names.d.ts +34 -0
  29. package/dist/events/auth-event-names.d.ts.map +1 -0
  30. package/dist/events/auth-event-names.js +41 -0
  31. package/dist/events/auth-event-names.js.map +1 -0
  32. package/dist/http-types.d.ts +135 -0
  33. package/dist/http-types.d.ts.map +1 -0
  34. package/dist/http-types.js +18 -0
  35. package/dist/http-types.js.map +1 -0
  36. package/dist/index.d.ts +80 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +88 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/interfaces/api-key-store.interface.d.ts +94 -0
  41. package/dist/interfaces/api-key-store.interface.d.ts.map +1 -0
  42. package/dist/interfaces/api-key-store.interface.js +3 -0
  43. package/dist/interfaces/api-key-store.interface.js.map +1 -0
  44. package/dist/interfaces/auth-strategy.interface.d.ts +6 -0
  45. package/dist/interfaces/auth-strategy.interface.d.ts.map +1 -0
  46. package/dist/interfaces/auth-strategy.interface.js +3 -0
  47. package/dist/interfaces/auth-strategy.interface.js.map +1 -0
  48. package/dist/interfaces/linked-accounts-store.interface.d.ts +74 -0
  49. package/dist/interfaces/linked-accounts-store.interface.d.ts.map +1 -0
  50. package/dist/interfaces/linked-accounts-store.interface.js +3 -0
  51. package/dist/interfaces/linked-accounts-store.interface.js.map +1 -0
  52. package/dist/interfaces/pending-link-store.interface.d.ts +77 -0
  53. package/dist/interfaces/pending-link-store.interface.d.ts.map +1 -0
  54. package/dist/interfaces/pending-link-store.interface.js +3 -0
  55. package/dist/interfaces/pending-link-store.interface.js.map +1 -0
  56. package/dist/interfaces/roles-permissions-store.interface.d.ts +129 -0
  57. package/dist/interfaces/roles-permissions-store.interface.d.ts.map +1 -0
  58. package/dist/interfaces/roles-permissions-store.interface.js +3 -0
  59. package/dist/interfaces/roles-permissions-store.interface.js.map +1 -0
  60. package/dist/interfaces/session-store.interface.d.ts +92 -0
  61. package/dist/interfaces/session-store.interface.d.ts.map +1 -0
  62. package/dist/interfaces/session-store.interface.js +3 -0
  63. package/dist/interfaces/session-store.interface.js.map +1 -0
  64. package/dist/interfaces/settings-store.interface.d.ts +91 -0
  65. package/dist/interfaces/settings-store.interface.d.ts.map +1 -0
  66. package/dist/interfaces/settings-store.interface.js +3 -0
  67. package/dist/interfaces/settings-store.interface.js.map +1 -0
  68. package/dist/interfaces/sse-distributor.interface.d.ts +25 -0
  69. package/dist/interfaces/sse-distributor.interface.d.ts.map +1 -0
  70. package/dist/interfaces/sse-distributor.interface.js +3 -0
  71. package/dist/interfaces/sse-distributor.interface.js.map +1 -0
  72. package/dist/interfaces/telemetry-store.interface.d.ts +72 -0
  73. package/dist/interfaces/telemetry-store.interface.d.ts.map +1 -0
  74. package/dist/interfaces/telemetry-store.interface.js +3 -0
  75. package/dist/interfaces/telemetry-store.interface.js.map +1 -0
  76. package/dist/interfaces/template-store.interface.d.ts +37 -0
  77. package/dist/interfaces/template-store.interface.d.ts.map +1 -0
  78. package/dist/interfaces/template-store.interface.js +3 -0
  79. package/dist/interfaces/template-store.interface.js.map +1 -0
  80. package/dist/interfaces/tenant-store.interface.d.ts +97 -0
  81. package/dist/interfaces/tenant-store.interface.d.ts.map +1 -0
  82. package/dist/interfaces/tenant-store.interface.js +3 -0
  83. package/dist/interfaces/tenant-store.interface.js.map +1 -0
  84. package/dist/interfaces/token-store.interface.d.ts +10 -0
  85. package/dist/interfaces/token-store.interface.d.ts.map +1 -0
  86. package/dist/interfaces/token-store.interface.js +3 -0
  87. package/dist/interfaces/token-store.interface.js.map +1 -0
  88. package/dist/interfaces/user-metadata-store.interface.d.ts +50 -0
  89. package/dist/interfaces/user-metadata-store.interface.d.ts.map +1 -0
  90. package/dist/interfaces/user-metadata-store.interface.js +3 -0
  91. package/dist/interfaces/user-metadata-store.interface.js.map +1 -0
  92. package/dist/interfaces/user-store.interface.d.ts +113 -0
  93. package/dist/interfaces/user-store.interface.d.ts.map +1 -0
  94. package/dist/interfaces/user-store.interface.js +3 -0
  95. package/dist/interfaces/user-store.interface.js.map +1 -0
  96. package/dist/interfaces/webhook-store.interface.d.ts +139 -0
  97. package/dist/interfaces/webhook-store.interface.d.ts.map +1 -0
  98. package/dist/interfaces/webhook-store.interface.js +3 -0
  99. package/dist/interfaces/webhook-store.interface.js.map +1 -0
  100. package/dist/middleware/api-key.middleware.d.ts +35 -0
  101. package/dist/middleware/api-key.middleware.d.ts.map +1 -0
  102. package/dist/middleware/api-key.middleware.js +45 -0
  103. package/dist/middleware/api-key.middleware.js.map +1 -0
  104. package/dist/middleware/auth.middleware.d.ts +13 -0
  105. package/dist/middleware/auth.middleware.d.ts.map +1 -0
  106. package/dist/middleware/auth.middleware.js +55 -0
  107. package/dist/middleware/auth.middleware.js.map +1 -0
  108. package/dist/middleware/jwks-auth.middleware.d.ts +18 -0
  109. package/dist/middleware/jwks-auth.middleware.d.ts.map +1 -0
  110. package/dist/middleware/jwks-auth.middleware.js +77 -0
  111. package/dist/middleware/jwks-auth.middleware.js.map +1 -0
  112. package/dist/models/api-key.model.d.ts +66 -0
  113. package/dist/models/api-key.model.d.ts.map +1 -0
  114. package/dist/models/api-key.model.js +3 -0
  115. package/dist/models/api-key.model.js.map +1 -0
  116. package/dist/models/auth-config.model.d.ts +387 -0
  117. package/dist/models/auth-config.model.d.ts.map +1 -0
  118. package/dist/models/auth-config.model.js +3 -0
  119. package/dist/models/auth-config.model.js.map +1 -0
  120. package/dist/models/errors.d.ts +7 -0
  121. package/dist/models/errors.d.ts.map +1 -0
  122. package/dist/models/errors.js +14 -0
  123. package/dist/models/errors.js.map +1 -0
  124. package/dist/models/session.model.d.ts +28 -0
  125. package/dist/models/session.model.d.ts.map +1 -0
  126. package/dist/models/session.model.js +3 -0
  127. package/dist/models/session.model.js.map +1 -0
  128. package/dist/models/tenant.model.d.ts +20 -0
  129. package/dist/models/tenant.model.d.ts.map +1 -0
  130. package/dist/models/tenant.model.js +3 -0
  131. package/dist/models/tenant.model.js.map +1 -0
  132. package/dist/models/token.model.d.ts +21 -0
  133. package/dist/models/token.model.d.ts.map +1 -0
  134. package/dist/models/token.model.js +3 -0
  135. package/dist/models/token.model.js.map +1 -0
  136. package/dist/models/user.model.d.ts +92 -0
  137. package/dist/models/user.model.d.ts.map +1 -0
  138. package/dist/models/user.model.js +3 -0
  139. package/dist/models/user.model.js.map +1 -0
  140. package/dist/router/admin.router.d.ts +188 -0
  141. package/dist/router/admin.router.d.ts.map +1 -0
  142. package/dist/router/admin.router.js +1507 -0
  143. package/dist/router/admin.router.js.map +1 -0
  144. package/dist/router/auth.router.d.ts +199 -0
  145. package/dist/router/auth.router.d.ts.map +1 -0
  146. package/dist/router/auth.router.js +1636 -0
  147. package/dist/router/auth.router.js.map +1 -0
  148. package/dist/router/openapi.d.ts +98 -0
  149. package/dist/router/openapi.d.ts.map +1 -0
  150. package/dist/router/openapi.js +1518 -0
  151. package/dist/router/openapi.js.map +1 -0
  152. package/dist/router/router-events.d.ts +38 -0
  153. package/dist/router/router-events.d.ts.map +1 -0
  154. package/dist/router/router-events.js +74 -0
  155. package/dist/router/router-events.js.map +1 -0
  156. package/dist/router/tools.router.d.ts +104 -0
  157. package/dist/router/tools.router.d.ts.map +1 -0
  158. package/dist/router/tools.router.js +227 -0
  159. package/dist/router/tools.router.js.map +1 -0
  160. package/dist/router/ui.router.d.ts +49 -0
  161. package/dist/router/ui.router.d.ts.map +1 -0
  162. package/dist/router/ui.router.js +272 -0
  163. package/dist/router/ui.router.js.map +1 -0
  164. package/dist/services/api-key.service.d.ts +53 -0
  165. package/dist/services/api-key.service.d.ts.map +1 -0
  166. package/dist/services/api-key.service.js +66 -0
  167. package/dist/services/api-key.service.js.map +1 -0
  168. package/dist/services/jwks.service.d.ts +73 -0
  169. package/dist/services/jwks.service.d.ts.map +1 -0
  170. package/dist/services/jwks.service.js +174 -0
  171. package/dist/services/jwks.service.js.map +1 -0
  172. package/dist/services/mailer.service.d.ts +30 -0
  173. package/dist/services/mailer.service.d.ts.map +1 -0
  174. package/dist/services/mailer.service.js +248 -0
  175. package/dist/services/mailer.service.js.map +1 -0
  176. package/dist/services/notification.service.d.ts +110 -0
  177. package/dist/services/notification.service.d.ts.map +1 -0
  178. package/dist/services/notification.service.js +79 -0
  179. package/dist/services/notification.service.js.map +1 -0
  180. package/dist/services/password.service.d.ts +5 -0
  181. package/dist/services/password.service.d.ts.map +1 -0
  182. package/dist/services/password.service.js +17 -0
  183. package/dist/services/password.service.js.map +1 -0
  184. package/dist/services/sms.service.d.ts +14 -0
  185. package/dist/services/sms.service.d.ts.map +1 -0
  186. package/dist/services/sms.service.js +51 -0
  187. package/dist/services/sms.service.js.map +1 -0
  188. package/dist/services/token.service.d.ts +62 -0
  189. package/dist/services/token.service.d.ts.map +1 -0
  190. package/dist/services/token.service.js +354 -0
  191. package/dist/services/token.service.js.map +1 -0
  192. package/dist/stores/memory-template.store.d.ts +12 -0
  193. package/dist/stores/memory-template.store.d.ts.map +1 -0
  194. package/dist/stores/memory-template.store.js +35 -0
  195. package/dist/stores/memory-template.store.js.map +1 -0
  196. package/dist/strategies/api-key/api-key.strategy.d.ts +72 -0
  197. package/dist/strategies/api-key/api-key.strategy.d.ts.map +1 -0
  198. package/dist/strategies/api-key/api-key.strategy.js +182 -0
  199. package/dist/strategies/api-key/api-key.strategy.js.map +1 -0
  200. package/dist/strategies/local/local.strategy.d.ts +19 -0
  201. package/dist/strategies/local/local.strategy.d.ts.map +1 -0
  202. package/dist/strategies/local/local.strategy.js +45 -0
  203. package/dist/strategies/local/local.strategy.js.map +1 -0
  204. package/dist/strategies/magic-link/magic-link.strategy.d.ts +8 -0
  205. package/dist/strategies/magic-link/magic-link.strategy.d.ts.map +1 -0
  206. package/dist/strategies/magic-link/magic-link.strategy.js +53 -0
  207. package/dist/strategies/magic-link/magic-link.strategy.js.map +1 -0
  208. package/dist/strategies/oauth/generic-oauth.strategy.d.ts +120 -0
  209. package/dist/strategies/oauth/generic-oauth.strategy.d.ts.map +1 -0
  210. package/dist/strategies/oauth/generic-oauth.strategy.js +88 -0
  211. package/dist/strategies/oauth/generic-oauth.strategy.js.map +1 -0
  212. package/dist/strategies/oauth/github.strategy.d.ts +31 -0
  213. package/dist/strategies/oauth/github.strategy.d.ts.map +1 -0
  214. package/dist/strategies/oauth/github.strategy.js +72 -0
  215. package/dist/strategies/oauth/github.strategy.js.map +1 -0
  216. package/dist/strategies/oauth/google.strategy.d.ts +31 -0
  217. package/dist/strategies/oauth/google.strategy.d.ts.map +1 -0
  218. package/dist/strategies/oauth/google.strategy.js +61 -0
  219. package/dist/strategies/oauth/google.strategy.js.map +1 -0
  220. package/dist/strategies/sms/sms.strategy.d.ts +7 -0
  221. package/dist/strategies/sms/sms.strategy.d.ts.map +1 -0
  222. package/dist/strategies/sms/sms.strategy.js +39 -0
  223. package/dist/strategies/sms/sms.strategy.js.map +1 -0
  224. package/dist/strategies/two-factor/totp.strategy.d.ts +12 -0
  225. package/dist/strategies/two-factor/totp.strategy.d.ts.map +1 -0
  226. package/dist/strategies/two-factor/totp.strategy.js +32 -0
  227. package/dist/strategies/two-factor/totp.strategy.js.map +1 -0
  228. package/dist/tools/auth-tools.d.ts +200 -0
  229. package/dist/tools/auth-tools.d.ts.map +1 -0
  230. package/dist/tools/auth-tools.js +232 -0
  231. package/dist/tools/auth-tools.js.map +1 -0
  232. package/dist/tools/sse-manager.d.ts +118 -0
  233. package/dist/tools/sse-manager.d.ts.map +1 -0
  234. package/dist/tools/sse-manager.js +163 -0
  235. package/dist/tools/sse-manager.js.map +1 -0
  236. package/dist/tools/sse-notify.decorator.d.ts +74 -0
  237. package/dist/tools/sse-notify.decorator.d.ts.map +1 -0
  238. package/dist/tools/sse-notify.decorator.js +78 -0
  239. package/dist/tools/sse-notify.decorator.js.map +1 -0
  240. package/dist/tools/webhook-action.d.ts +130 -0
  241. package/dist/tools/webhook-action.d.ts.map +1 -0
  242. package/dist/tools/webhook-action.js +144 -0
  243. package/dist/tools/webhook-action.js.map +1 -0
  244. package/dist/tools/webhook-sender.d.ts +31 -0
  245. package/dist/tools/webhook-sender.d.ts.map +1 -0
  246. package/dist/tools/webhook-sender.js +80 -0
  247. package/dist/tools/webhook-sender.js.map +1 -0
  248. package/dist/ui-assets/2fa.html +115 -0
  249. package/dist/ui-assets/account-conflict.html +108 -0
  250. package/dist/ui-assets/admin.css +263 -0
  251. package/dist/ui-assets/admin.js +1927 -0
  252. package/dist/ui-assets/auth.js +725 -0
  253. package/dist/ui-assets/base.css +219 -0
  254. package/dist/ui-assets/forgot-password.html +93 -0
  255. package/dist/ui-assets/link-verify.html +74 -0
  256. package/dist/ui-assets/login.html +135 -0
  257. package/dist/ui-assets/magic-link.html +112 -0
  258. package/dist/ui-assets/register.html +122 -0
  259. package/dist/ui-assets/reset-password.html +103 -0
  260. package/dist/ui-assets/ui-i18n-keys.json +78 -0
  261. package/dist/ui-assets/verify-email.html +66 -0
  262. package/package.json +89 -0
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=session-store.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store.interface.js","sourceRoot":"","sources":["../../src/interfaces/session-store.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Optional store for global authentication settings.
3
+ *
4
+ * Implement this interface when you need to persist global auth configuration
5
+ * (e.g., mandatory email verification, mandatory 2FA) that can be toggled by
6
+ * administrators at runtime via the admin UI's Control panel.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { ISettingsStore, AuthSettings } from '@awesome-lang-auth/node';
11
+ *
12
+ * export class MySettingsStore implements ISettingsStore {
13
+ * private settings: AuthSettings = {};
14
+ *
15
+ * async getSettings(): Promise<AuthSettings> {
16
+ * const row = await db.from('settings').first();
17
+ * return row ? JSON.parse(row.data) : {};
18
+ * }
19
+ *
20
+ * async updateSettings(settings: Partial<AuthSettings>): Promise<void> {
21
+ * const current = await this.getSettings();
22
+ * const merged = { ...current, ...settings };
23
+ * await db('settings').update({ data: JSON.stringify(merged) });
24
+ * }
25
+ * }
26
+ * ```
27
+ */
28
+ export interface ISettingsStore {
29
+ /**
30
+ * Retrieve all current authentication settings.
31
+ * Returns an empty object if no settings have been configured.
32
+ */
33
+ getSettings(): Promise<AuthSettings>;
34
+ /**
35
+ * Merge (shallow-patch) the provided settings into the store.
36
+ * Settings not present in the input are left untouched.
37
+ */
38
+ updateSettings(settings: Partial<AuthSettings>): Promise<void>;
39
+ }
40
+ /**
41
+ * Global authentication settings that can be toggled by admins at runtime.
42
+ */
43
+ export interface AuthSettings {
44
+ /** Whether email verification is mandatory for all users. */
45
+ requireEmailVerification?: boolean;
46
+ /**
47
+ * Global email-verification enforcement mode.
48
+ * When set, overrides `requireEmailVerification`.
49
+ * - `'none'` — not required.
50
+ * - `'lazy'` — user may log in until `emailVerificationDeadline` expires.
51
+ * - `'strict'` — login blocked until email is verified.
52
+ */
53
+ emailVerificationMode?: 'none' | 'lazy' | 'strict';
54
+ /**
55
+ * When `emailVerificationMode` is `'lazy'`, the number of days after
56
+ * account creation before the user must verify their email.
57
+ * Used by the admin UI to display and update the grace period.
58
+ * Defaults to `7` when not set.
59
+ */
60
+ lazyEmailVerificationGracePeriodDays?: number;
61
+ /** Whether two-factor authentication is mandatory for all users. */
62
+ require2FA?: boolean;
63
+ /**
64
+ * IDs of webhook actions that are globally enabled by the administrator.
65
+ *
66
+ * Only actions whose IDs appear in this array can be injected into the
67
+ * `vm` sandbox of an inbound webhook. This provides a global circuit-
68
+ * breaker on top of the per-webhook `allowedActions` list.
69
+ *
70
+ * Managed via the Admin UI's Control → Webhook Actions panel.
71
+ */
72
+ enabledWebhookActions?: string[];
73
+ /**
74
+ * Optional UI customization settings.
75
+ * Managed via the Admin UI's 🎨 UI Customization panel.
76
+ */
77
+ ui?: {
78
+ primaryColor: string;
79
+ secondaryColor: string;
80
+ logoUrl: string;
81
+ siteName: string;
82
+ logoPath: string;
83
+ /** Background color for the entire auth page (CSS color value, sets `--bg-color`). */
84
+ bgColor: string;
85
+ /** URL of a background image for the entire auth page (sets `--bg-image`). */
86
+ bgImage: string;
87
+ /** Background color for the form/card container (CSS color value, sets `--card-bg`). */
88
+ cardBg: string;
89
+ };
90
+ }
91
+ //# sourceMappingURL=settings-store.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-store.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/settings-store.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,WAAW,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;IAErC;;;OAGG;IACH,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,6DAA6D;IAC7D,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC;;;;;;OAMG;IACH,qBAAqB,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,CAAC;IACnD;;;;;OAKG;IACH,oCAAoC,CAAC,EAAE,MAAM,CAAC;IAC9C,oEAAoE;IACpE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;OAQG;IACH,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC;;;OAGG;IACH,EAAE,CAAC,EAAE;QACH,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,sFAAsF;QACtF,OAAO,EAAE,MAAM,CAAC;QAChB,8EAA8E;QAC9E,OAAO,EAAE,MAAM,CAAC;QAChB,wFAAwF;QACxF,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=settings-store.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-store.interface.js","sourceRoot":"","sources":["../../src/interfaces/settings-store.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Interface for cross-instance SSE event distribution.
3
+ *
4
+ * When awesome-node-auth runs in a multi-instance (clustered) environment, SSE
5
+ * connections are local to each server's memory. An implementation of this
6
+ * interface (e.g. using Redis Pub/Sub) allows broadcasting events across all
7
+ * instances so that every subscriber receives them regardless of which server
8
+ * they are connected to.
9
+ */
10
+ export interface ISseDistributor {
11
+ /**
12
+ * Publish an event to the distribution bus.
13
+ *
14
+ * @param topic The topic/channel name.
15
+ * @param event The event payload (must be serializable).
16
+ */
17
+ publish(topic: string, event: any): Promise<void>;
18
+ /**
19
+ * Subscribe to events from the distribution bus.
20
+ *
21
+ * @param callback Invoked whenever an event is received from another instance.
22
+ */
23
+ subscribe(callback: (topic: string, event: any) => void): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=sse-distributor.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-distributor.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/sse-distributor.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC5B;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAElD;;;;OAIG;IACH,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3E"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=sse-distributor.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-distributor.interface.js","sourceRoot":"","sources":["../../src/interfaces/sse-distributor.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * A single recorded telemetry event.
3
+ */
4
+ export interface TelemetryEvent {
5
+ /** Auto-generated unique identifier. */
6
+ id: string;
7
+ /** The event name (e.g. `identity.auth.login.success`). */
8
+ event: string;
9
+ /** ISO 8601 timestamp. */
10
+ timestamp: string;
11
+ /** Arbitrary event data. */
12
+ data?: unknown;
13
+ /** User ID (optional). */
14
+ userId?: string;
15
+ /** Tenant ID for multi-tenant partitioning (optional). */
16
+ tenantId?: string;
17
+ /** Session ID (optional). */
18
+ sessionId?: string;
19
+ /** Correlation ID (optional). */
20
+ correlationId?: string;
21
+ /** Client IP (optional). */
22
+ ip?: string;
23
+ /** Client User-Agent (optional). */
24
+ userAgent?: string;
25
+ }
26
+ /**
27
+ * Optional filter for querying telemetry events.
28
+ */
29
+ export interface TelemetryFilter {
30
+ event?: string;
31
+ userId?: string;
32
+ tenantId?: string;
33
+ sessionId?: string;
34
+ from?: Date;
35
+ to?: Date;
36
+ limit?: number;
37
+ offset?: number;
38
+ }
39
+ /**
40
+ * Interface for persisting and querying telemetry events.
41
+ *
42
+ * Implement this interface to store telemetry events in any database.
43
+ * When not provided, telemetry events are only emitted on the `AuthEventBus`
44
+ * and forwarded to configured webhooks without being persisted.
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * import { ITelemetryStore, TelemetryEvent } from '@awesome-lang-auth/node';
49
+ *
50
+ * export class MyTelemetryStore implements ITelemetryStore {
51
+ * async save(event: TelemetryEvent): Promise<void> {
52
+ * await db('telemetry').insert(event);
53
+ * }
54
+ * async query(filter: TelemetryFilter): Promise<TelemetryEvent[]> {
55
+ * return db('telemetry').where(filter).limit(filter.limit ?? 100);
56
+ * }
57
+ * }
58
+ * ```
59
+ */
60
+ export interface ITelemetryStore {
61
+ /**
62
+ * Persist a telemetry event.
63
+ */
64
+ save(event: TelemetryEvent): Promise<void>;
65
+ /**
66
+ * Query persisted events with optional filters.
67
+ * Implementing this method is optional but enables the
68
+ * `GET /tools/telemetry` query endpoint.
69
+ */
70
+ query?(filter: TelemetryFilter): Promise<TelemetryEvent[]>;
71
+ }
72
+ //# sourceMappingURL=telemetry-store.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry-store.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/telemetry-store.interface.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iCAAiC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,4BAA4B;IAC5B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,EAAE,CAAC,EAAE,IAAI,CAAC;IACV,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,IAAI,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3C;;;;OAIG;IACH,KAAK,CAAC,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;CAC5D"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=telemetry-store.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry-store.interface.js","sourceRoot":"","sources":["../../src/interfaces/telemetry-store.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ export interface MailTemplate {
2
+ id: string;
3
+ baseHtml: string;
4
+ baseText: string;
5
+ translations: Record<string, Record<string, string>>;
6
+ }
7
+ export interface UiTranslation {
8
+ page: string;
9
+ translations: Record<string, Record<string, string>>;
10
+ }
11
+ export interface ITemplateStore {
12
+ /**
13
+ * Get a mail template by ID.
14
+ */
15
+ getMailTemplate(id: string): Promise<MailTemplate | null>;
16
+ /**
17
+ * List all mail templates.
18
+ */
19
+ listMailTemplates(): Promise<MailTemplate[]>;
20
+ /**
21
+ * Update or create a mail template.
22
+ */
23
+ updateMailTemplate(id: string, template: Partial<MailTemplate>): Promise<void>;
24
+ /**
25
+ * Get UI translations for a specific page.
26
+ */
27
+ getUiTranslations(page: string): Promise<UiTranslation | null>;
28
+ /**
29
+ * List all UI translations.
30
+ */
31
+ listUiTranslations(): Promise<UiTranslation[]>;
32
+ /**
33
+ * Update or create UI translations for a page.
34
+ */
35
+ updateUiTranslations(page: string, translations: Record<string, Record<string, string>>): Promise<void>;
36
+ }
37
+ //# sourceMappingURL=template-store.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-store.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/template-store.interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,cAAc;IAC3B;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAE1D;;OAEG;IACH,iBAAiB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAE7C;;OAEG;IACH,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/E;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAE/D;;OAEG;IACH,kBAAkB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAE/C;;OAEG;IACH,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3G"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=template-store.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-store.interface.js","sourceRoot":"","sources":["../../src/interfaces/template-store.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,97 @@
1
+ import { Tenant } from '../models/tenant.model';
2
+ /**
3
+ * Optional store for multi-tenant applications.
4
+ *
5
+ * Implement this interface when your application serves multiple independent
6
+ * tenants (organisations, workspaces, teams, etc.) and you need to isolate
7
+ * users, data, and configuration per tenant.
8
+ *
9
+ * The interface covers three concerns:
10
+ * 1. **Tenant CRUD** — create, read, update and delete tenants.
11
+ * 2. **User ↔ Tenant association** — which users belong to which tenant.
12
+ * 3. **Per-tenant auth config** — optional overrides such as allowed auth
13
+ * methods, custom OAuth clients, or token lifetimes per tenant.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * import { ITenantStore } from '@awesome-lang-auth/node';
18
+ *
19
+ * export class MyTenantStore implements ITenantStore {
20
+ * async createTenant(data) {
21
+ * const id = slugify(data.name);
22
+ * await db('tenants').insert({ id, ...data });
23
+ * return { id, ...data };
24
+ * }
25
+ * async getTenantById(id) {
26
+ * return db('tenants').where({ id }).first() ?? null;
27
+ * }
28
+ * async getAllTenants() {
29
+ * return db('tenants').select();
30
+ * }
31
+ * async updateTenant(id, data) {
32
+ * await db('tenants').where({ id }).update(data);
33
+ * }
34
+ * async deleteTenant(id) {
35
+ * await db('tenants').where({ id }).delete();
36
+ * }
37
+ * async associateUserWithTenant(userId, tenantId) {
38
+ * await db('tenant_users').insert({ userId, tenantId });
39
+ * }
40
+ * async disassociateUserFromTenant(userId, tenantId) {
41
+ * await db('tenant_users').where({ userId, tenantId }).delete();
42
+ * }
43
+ * async getTenantsForUser(userId) {
44
+ * return db('tenant_users').join('tenants', ...).where({ userId });
45
+ * }
46
+ * async getUsersForTenant(tenantId) {
47
+ * return db('tenant_users').where({ tenantId }).pluck('userId');
48
+ * }
49
+ * }
50
+ * ```
51
+ */
52
+ export interface ITenantStore {
53
+ /**
54
+ * Create a new tenant. The `id` is generated by the implementation
55
+ * (e.g. a UUID or a URL-safe slug derived from `name`).
56
+ */
57
+ createTenant(data: Omit<Tenant, 'id'>): Promise<Tenant>;
58
+ /**
59
+ * Fetch a tenant by its unique identifier.
60
+ * Returns `null` when no tenant with that ID exists.
61
+ */
62
+ getTenantById(id: string): Promise<Tenant | null>;
63
+ /**
64
+ * Return all tenants. For large deployments consider adding pagination
65
+ * in your own implementation.
66
+ */
67
+ getAllTenants(): Promise<Tenant[]>;
68
+ /**
69
+ * Partially update a tenant's fields.
70
+ * Only the fields present in `data` are changed.
71
+ */
72
+ updateTenant(id: string, data: Partial<Omit<Tenant, 'id'>>): Promise<void>;
73
+ /**
74
+ * Permanently delete a tenant and all its associated data.
75
+ * This should also remove all user ↔ tenant associations for the tenant.
76
+ */
77
+ deleteTenant(id: string): Promise<void>;
78
+ /**
79
+ * Add `userId` as a member of `tenantId`.
80
+ * Idempotent — calling it when the association already exists should not throw.
81
+ */
82
+ associateUserWithTenant(userId: string, tenantId: string): Promise<void>;
83
+ /**
84
+ * Remove `userId` from `tenantId`.
85
+ * No-op when the association does not exist.
86
+ */
87
+ disassociateUserFromTenant(userId: string, tenantId: string): Promise<void>;
88
+ /**
89
+ * Return all tenants the given user belongs to.
90
+ */
91
+ getTenantsForUser(userId: string): Promise<Tenant[]>;
92
+ /**
93
+ * Return the IDs of all users that belong to the given tenant.
94
+ */
95
+ getUsersForTenant(tenantId: string): Promise<string[]>;
96
+ }
97
+ //# sourceMappingURL=tenant-store.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-store.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/tenant-store.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AACH,MAAM,WAAW,YAAY;IAK3B;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAExD;;;OAGG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAElD;;;OAGG;IACH,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEnC;;;OAGG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3E;;;OAGG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAMxC;;;OAGG;IACH,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzE;;;OAGG;IACH,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5E;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAErD;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CACxD"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=tenant-store.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-store.interface.js","sourceRoot":"","sources":["../../src/interfaces/tenant-store.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ export interface ITokenStore {
2
+ saveRefreshToken(userId: string, token: string, expiry: Date): Promise<void>;
3
+ findRefreshToken(token: string): Promise<{
4
+ userId: string;
5
+ expiry: Date;
6
+ } | null>;
7
+ deleteRefreshToken(token: string): Promise<void>;
8
+ deleteAllUserTokens(userId: string): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=token-store.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-store.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/token-store.interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAClF,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpD"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=token-store.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-store.interface.js","sourceRoot":"","sources":["../../src/interfaces/token-store.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Optional store for arbitrary per-user metadata.
3
+ *
4
+ * Implement this interface when you need to attach project-specific data to
5
+ * users without extending `BaseUser` (e.g. preferences, profile fields,
6
+ * feature flags, or any other key/value pairs).
7
+ *
8
+ * The interface is intentionally generic — your database schema can store
9
+ * metadata as a JSON column, a separate key-value table, or any other way
10
+ * that suits your project.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * import { IUserMetadataStore } from '@awesome-lang-auth/node';
15
+ *
16
+ * export class MyUserMetadataStore implements IUserMetadataStore {
17
+ * async getMetadata(userId: string) {
18
+ * const row = await db.from('user_metadata').where({ userId }).first();
19
+ * return row?.data ?? {};
20
+ * }
21
+ * async updateMetadata(userId: string, metadata: Record<string, unknown>) {
22
+ * await db('user_metadata')
23
+ * .insert({ userId, data: JSON.stringify(metadata) })
24
+ * .onConflict('userId')
25
+ * .merge();
26
+ * }
27
+ * async clearMetadata(userId: string) {
28
+ * await db('user_metadata').where({ userId }).delete();
29
+ * }
30
+ * }
31
+ * ```
32
+ */
33
+ export interface IUserMetadataStore {
34
+ /**
35
+ * Retrieve all metadata for the given user.
36
+ * Returns an empty object when no metadata exists.
37
+ */
38
+ getMetadata(userId: string): Promise<Record<string, unknown>>;
39
+ /**
40
+ * Merge (shallow-patch) the provided key/value pairs into the user's
41
+ * existing metadata. Fields not present in `metadata` are left untouched.
42
+ */
43
+ updateMetadata(userId: string, metadata: Record<string, unknown>): Promise<void>;
44
+ /**
45
+ * Delete all metadata for the given user.
46
+ * Useful when a user account is deleted.
47
+ */
48
+ clearMetadata(userId: string): Promise<void>;
49
+ }
50
+ //# sourceMappingURL=user-metadata-store.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-metadata-store.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/user-metadata-store.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAE9D;;;OAGG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjF;;;OAGG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9C"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=user-metadata-store.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-metadata-store.interface.js","sourceRoot":"","sources":["../../src/interfaces/user-metadata-store.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,113 @@
1
+ import { BaseUser } from '../models/user.model';
2
+ export interface IUserStore<U extends BaseUser = BaseUser> {
3
+ findByEmail(email: string): Promise<U | null>;
4
+ findById(id: string): Promise<U | null>;
5
+ create(data: Partial<U>): Promise<U>;
6
+ updateRefreshToken(userId: string, token: string | null, expiry: Date | null): Promise<void>;
7
+ updateLastLogin(userId: string): Promise<void>;
8
+ updateResetToken(userId: string, token: string | null, expiry: Date | null): Promise<void>;
9
+ updatePassword(userId: string, hashedPassword: string): Promise<void>;
10
+ updateTotpSecret(userId: string, secret: string | null): Promise<void>;
11
+ updateMagicLinkToken(userId: string, token: string | null, expiry: Date | null): Promise<void>;
12
+ updateSmsCode(userId: string, code: string | null, expiry: Date | null): Promise<void>;
13
+ /**
14
+ * Find a user by their password-reset token.
15
+ * Required to support the POST /auth/reset-password endpoint.
16
+ */
17
+ findByResetToken?(token: string): Promise<U | null>;
18
+ /**
19
+ * Find a user by their magic-link token.
20
+ * Required to support the POST /auth/magic-link/verify endpoint.
21
+ */
22
+ findByMagicLinkToken?(token: string): Promise<U | null>;
23
+ /**
24
+ * Set (or clear) the email-verification token and its expiry.
25
+ * Required to support POST /auth/send-verification-email and GET /auth/verify-email.
26
+ */
27
+ updateEmailVerificationToken?(userId: string, token: string | null, expiry: Date | null): Promise<void>;
28
+ /**
29
+ * Mark the user's primary email as verified (or unverified).
30
+ * Required to support GET /auth/verify-email.
31
+ */
32
+ updateEmailVerified?(userId: string, isVerified: boolean): Promise<void>;
33
+ /**
34
+ * Find a user by their email-verification token.
35
+ * Required to support GET /auth/verify-email.
36
+ */
37
+ findByEmailVerificationToken?(token: string): Promise<U | null>;
38
+ /**
39
+ * Store the pending new email address together with a confirmation token
40
+ * and expiry. Set all three to `null` to cancel an in-progress change.
41
+ * Required to support POST /auth/change-email/request and
42
+ * POST /auth/change-email/confirm.
43
+ */
44
+ updateEmailChangeToken?(userId: string, pendingEmail: string | null, token: string | null, expiry: Date | null): Promise<void>;
45
+ /**
46
+ * Commit the pending email change: overwrite the user's primary email with
47
+ * `newEmail` and clear the change-token fields.
48
+ * Required to support POST /auth/change-email/confirm.
49
+ */
50
+ updateEmail?(userId: string, newEmail: string): Promise<void>;
51
+ /**
52
+ * Find a user by their email-change confirmation token.
53
+ * Required to support POST /auth/change-email/confirm.
54
+ */
55
+ findByEmailChangeToken?(token: string): Promise<U | null>;
56
+ /**
57
+ * Store the pending link details (target email, provider, token, expiry)
58
+ * for an in-progress account-link flow.
59
+ * Set all four mutable args to `null` to cancel an in-progress link request.
60
+ * Required to support POST /auth/link-request and POST /auth/link-verify.
61
+ */
62
+ updateAccountLinkToken?(userId: string, pendingEmail: string | null, pendingProvider: string | null, token: string | null, expiry: Date | null): Promise<void>;
63
+ /**
64
+ * Find the user who initiated a link request by their pending link token.
65
+ * Required to support POST /auth/link-verify.
66
+ */
67
+ findByAccountLinkToken?(token: string): Promise<U | null>;
68
+ /**
69
+ * Set or clear the "2FA required" flag for a single user.
70
+ * Required to support `POST /admin/api/2fa-policy` (batch 2FA enforcement).
71
+ */
72
+ updateRequire2FA?(userId: string, required: boolean): Promise<void>;
73
+ /**
74
+ * Look up a user by their OAuth provider name and provider-specific user ID.
75
+ *
76
+ * Use this in your `findOrCreateUser` implementation instead of (or in
77
+ * addition to) `findByEmail` to avoid account-takeover attacks: two
78
+ * different OAuth providers can have the same email address without
79
+ * representing the same person.
80
+ *
81
+ * @param provider The provider name, e.g. `'google'` or `'github'`.
82
+ * @param providerAccountId The unique user ID returned by the provider
83
+ * (stored in `BaseUser.providerAccountId`).
84
+ */
85
+ findByProviderAccount?(provider: string, providerAccountId: string): Promise<U | null>;
86
+ /**
87
+ * Return a paginated list of users.
88
+ * Used by the optional admin router to display the users table.
89
+ *
90
+ * @param limit Maximum number of records to return.
91
+ * @param offset Zero-based offset for pagination.
92
+ */
93
+ listUsers?(limit: number, offset: number): Promise<U[]>;
94
+ /**
95
+ * Update the user's profile information (first name, last name).
96
+ * Required to support the PATCH /auth/profile endpoint.
97
+ */
98
+ updateProfile?(userId: string, data: {
99
+ firstName?: string | null;
100
+ lastName?: string | null;
101
+ }): Promise<void>;
102
+ /**
103
+ * Update the user's phone number.
104
+ * Required to support the POST /auth/add-phone endpoint.
105
+ */
106
+ updatePhoneNumber?(userId: string, phoneNumber: string | null): Promise<void>;
107
+ /**
108
+ * Apply a partial update to the user record.
109
+ * Optional helper used by admin bootstrap utilities such as promote/revoke.
110
+ */
111
+ update?(userId: string, patch: Partial<U>): Promise<void>;
112
+ }
113
+ //# sourceMappingURL=user-store.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-store.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/user-store.interface.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=user-store.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-store.interface.js","sourceRoot":"","sources":["../../src/interfaces/user-store.interface.ts"],"names":[],"mappings":""}