alepha 0.14.3 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. package/README.md +2 -5
  2. package/dist/api/audits/index.d.ts +620 -811
  3. package/dist/api/audits/index.d.ts.map +1 -1
  4. package/dist/api/files/index.d.ts +185 -377
  5. package/dist/api/files/index.d.ts.map +1 -1
  6. package/dist/api/files/index.js +0 -1
  7. package/dist/api/files/index.js.map +1 -1
  8. package/dist/api/jobs/index.d.ts +245 -435
  9. package/dist/api/jobs/index.d.ts.map +1 -1
  10. package/dist/api/notifications/index.d.ts +238 -429
  11. package/dist/api/notifications/index.d.ts.map +1 -1
  12. package/dist/api/parameters/index.d.ts +236 -427
  13. package/dist/api/parameters/index.d.ts.map +1 -1
  14. package/dist/api/users/index.browser.js +1 -2
  15. package/dist/api/users/index.browser.js.map +1 -1
  16. package/dist/api/users/index.d.ts +1010 -1196
  17. package/dist/api/users/index.d.ts.map +1 -1
  18. package/dist/api/users/index.js +178 -151
  19. package/dist/api/users/index.js.map +1 -1
  20. package/dist/api/verifications/index.d.ts +17 -17
  21. package/dist/api/verifications/index.d.ts.map +1 -1
  22. package/dist/batch/index.d.ts +122 -122
  23. package/dist/batch/index.d.ts.map +1 -1
  24. package/dist/batch/index.js +1 -2
  25. package/dist/batch/index.js.map +1 -1
  26. package/dist/bucket/index.d.ts +163 -163
  27. package/dist/bucket/index.d.ts.map +1 -1
  28. package/dist/cache/core/index.d.ts +46 -46
  29. package/dist/cache/core/index.d.ts.map +1 -1
  30. package/dist/cache/redis/index.d.ts.map +1 -1
  31. package/dist/cli/index.d.ts +384 -285
  32. package/dist/cli/index.d.ts.map +1 -1
  33. package/dist/cli/index.js +1113 -623
  34. package/dist/cli/index.js.map +1 -1
  35. package/dist/command/index.d.ts +299 -300
  36. package/dist/command/index.d.ts.map +1 -1
  37. package/dist/command/index.js +13 -9
  38. package/dist/command/index.js.map +1 -1
  39. package/dist/core/index.browser.js +445 -103
  40. package/dist/core/index.browser.js.map +1 -1
  41. package/dist/core/index.d.ts +733 -625
  42. package/dist/core/index.d.ts.map +1 -1
  43. package/dist/core/index.js +446 -103
  44. package/dist/core/index.js.map +1 -1
  45. package/dist/core/index.native.js +445 -103
  46. package/dist/core/index.native.js.map +1 -1
  47. package/dist/datetime/index.d.ts +44 -44
  48. package/dist/datetime/index.d.ts.map +1 -1
  49. package/dist/datetime/index.js +4 -4
  50. package/dist/datetime/index.js.map +1 -1
  51. package/dist/email/index.d.ts +97 -50
  52. package/dist/email/index.d.ts.map +1 -1
  53. package/dist/email/index.js +129 -33
  54. package/dist/email/index.js.map +1 -1
  55. package/dist/fake/index.d.ts +7981 -14
  56. package/dist/fake/index.d.ts.map +1 -1
  57. package/dist/file/index.d.ts +523 -390
  58. package/dist/file/index.d.ts.map +1 -1
  59. package/dist/file/index.js +253 -1
  60. package/dist/file/index.js.map +1 -1
  61. package/dist/lock/core/index.d.ts +208 -208
  62. package/dist/lock/core/index.d.ts.map +1 -1
  63. package/dist/lock/redis/index.d.ts.map +1 -1
  64. package/dist/logger/index.d.ts +25 -26
  65. package/dist/logger/index.d.ts.map +1 -1
  66. package/dist/logger/index.js +12 -2
  67. package/dist/logger/index.js.map +1 -1
  68. package/dist/mcp/index.d.ts +197 -197
  69. package/dist/mcp/index.d.ts.map +1 -1
  70. package/dist/mcp/index.js +1 -1
  71. package/dist/mcp/index.js.map +1 -1
  72. package/dist/orm/chunk-DtkW-qnP.js +38 -0
  73. package/dist/orm/index.browser.js.map +1 -1
  74. package/dist/orm/index.bun.js +2814 -0
  75. package/dist/orm/index.bun.js.map +1 -0
  76. package/dist/orm/index.d.ts +1228 -1216
  77. package/dist/orm/index.d.ts.map +1 -1
  78. package/dist/orm/index.js +2041 -1967
  79. package/dist/orm/index.js.map +1 -1
  80. package/dist/queue/core/index.d.ts +248 -248
  81. package/dist/queue/core/index.d.ts.map +1 -1
  82. package/dist/queue/redis/index.d.ts.map +1 -1
  83. package/dist/redis/index.bun.js +285 -0
  84. package/dist/redis/index.bun.js.map +1 -0
  85. package/dist/redis/index.d.ts +118 -136
  86. package/dist/redis/index.d.ts.map +1 -1
  87. package/dist/redis/index.js +18 -38
  88. package/dist/redis/index.js.map +1 -1
  89. package/dist/retry/index.d.ts +69 -69
  90. package/dist/retry/index.d.ts.map +1 -1
  91. package/dist/router/index.d.ts +6 -6
  92. package/dist/router/index.d.ts.map +1 -1
  93. package/dist/scheduler/index.d.ts +25 -25
  94. package/dist/scheduler/index.d.ts.map +1 -1
  95. package/dist/security/index.browser.js +5 -1
  96. package/dist/security/index.browser.js.map +1 -1
  97. package/dist/security/index.d.ts +417 -254
  98. package/dist/security/index.d.ts.map +1 -1
  99. package/dist/security/index.js +386 -86
  100. package/dist/security/index.js.map +1 -1
  101. package/dist/server/auth/index.d.ts +110 -110
  102. package/dist/server/auth/index.d.ts.map +1 -1
  103. package/dist/server/auth/index.js +20 -20
  104. package/dist/server/auth/index.js.map +1 -1
  105. package/dist/server/cache/index.d.ts +62 -47
  106. package/dist/server/cache/index.d.ts.map +1 -1
  107. package/dist/server/cache/index.js +56 -3
  108. package/dist/server/cache/index.js.map +1 -1
  109. package/dist/server/compress/index.d.ts +6 -0
  110. package/dist/server/compress/index.d.ts.map +1 -1
  111. package/dist/server/compress/index.js +36 -1
  112. package/dist/server/compress/index.js.map +1 -1
  113. package/dist/server/cookies/index.d.ts +6 -6
  114. package/dist/server/cookies/index.d.ts.map +1 -1
  115. package/dist/server/cookies/index.js +3 -3
  116. package/dist/server/cookies/index.js.map +1 -1
  117. package/dist/server/core/index.browser.js +2 -2
  118. package/dist/server/core/index.browser.js.map +1 -1
  119. package/dist/server/core/index.d.ts +242 -150
  120. package/dist/server/core/index.d.ts.map +1 -1
  121. package/dist/server/core/index.js +294 -125
  122. package/dist/server/core/index.js.map +1 -1
  123. package/dist/server/cors/index.d.ts +11 -12
  124. package/dist/server/cors/index.d.ts.map +1 -1
  125. package/dist/server/health/index.d.ts +0 -1
  126. package/dist/server/health/index.d.ts.map +1 -1
  127. package/dist/server/helmet/index.d.ts +2 -2
  128. package/dist/server/helmet/index.d.ts.map +1 -1
  129. package/dist/server/links/index.browser.js.map +1 -1
  130. package/dist/server/links/index.d.ts +123 -124
  131. package/dist/server/links/index.d.ts.map +1 -1
  132. package/dist/server/links/index.js +1 -2
  133. package/dist/server/links/index.js.map +1 -1
  134. package/dist/server/metrics/index.d.ts.map +1 -1
  135. package/dist/server/multipart/index.d.ts +6 -6
  136. package/dist/server/multipart/index.d.ts.map +1 -1
  137. package/dist/server/proxy/index.d.ts +102 -103
  138. package/dist/server/proxy/index.d.ts.map +1 -1
  139. package/dist/server/rate-limit/index.d.ts +16 -16
  140. package/dist/server/rate-limit/index.d.ts.map +1 -1
  141. package/dist/server/static/index.d.ts +44 -44
  142. package/dist/server/static/index.d.ts.map +1 -1
  143. package/dist/server/static/index.js +4 -0
  144. package/dist/server/static/index.js.map +1 -1
  145. package/dist/server/swagger/index.d.ts +48 -49
  146. package/dist/server/swagger/index.d.ts.map +1 -1
  147. package/dist/server/swagger/index.js +3 -5
  148. package/dist/server/swagger/index.js.map +1 -1
  149. package/dist/sms/index.d.ts +13 -11
  150. package/dist/sms/index.d.ts.map +1 -1
  151. package/dist/sms/index.js +7 -7
  152. package/dist/sms/index.js.map +1 -1
  153. package/dist/thread/index.d.ts +71 -72
  154. package/dist/thread/index.d.ts.map +1 -1
  155. package/dist/topic/core/index.d.ts +318 -318
  156. package/dist/topic/core/index.d.ts.map +1 -1
  157. package/dist/topic/redis/index.d.ts +6 -6
  158. package/dist/topic/redis/index.d.ts.map +1 -1
  159. package/dist/vite/index.d.ts +5805 -249
  160. package/dist/vite/index.d.ts.map +1 -1
  161. package/dist/vite/index.js +599 -513
  162. package/dist/vite/index.js.map +1 -1
  163. package/dist/websocket/index.browser.js +6 -6
  164. package/dist/websocket/index.browser.js.map +1 -1
  165. package/dist/websocket/index.d.ts +247 -247
  166. package/dist/websocket/index.d.ts.map +1 -1
  167. package/dist/websocket/index.js +6 -6
  168. package/dist/websocket/index.js.map +1 -1
  169. package/package.json +9 -14
  170. package/src/api/files/controllers/AdminFileStatsController.ts +0 -1
  171. package/src/api/users/atoms/realmAuthSettingsAtom.ts +5 -0
  172. package/src/api/users/controllers/{UserRealmController.ts → RealmController.ts} +11 -11
  173. package/src/api/users/entities/users.ts +1 -1
  174. package/src/api/users/index.ts +8 -8
  175. package/src/api/users/primitives/{$userRealm.ts → $realm.ts} +17 -19
  176. package/src/api/users/providers/{UserRealmProvider.ts → RealmProvider.ts} +26 -30
  177. package/src/api/users/schemas/{userRealmConfigSchema.ts → realmConfigSchema.ts} +2 -2
  178. package/src/api/users/services/CredentialService.ts +7 -7
  179. package/src/api/users/services/IdentityService.ts +4 -4
  180. package/src/api/users/services/RegistrationService.spec.ts +25 -27
  181. package/src/api/users/services/RegistrationService.ts +38 -27
  182. package/src/api/users/services/SessionCrudService.ts +3 -3
  183. package/src/api/users/services/SessionService.spec.ts +3 -3
  184. package/src/api/users/services/SessionService.ts +28 -9
  185. package/src/api/users/services/UserService.ts +7 -7
  186. package/src/batch/providers/BatchProvider.ts +1 -2
  187. package/src/cli/apps/AlephaCli.ts +0 -2
  188. package/src/cli/apps/AlephaPackageBuilderCli.ts +38 -19
  189. package/src/cli/assets/apiHelloControllerTs.ts +18 -0
  190. package/src/cli/assets/apiIndexTs.ts +16 -0
  191. package/src/cli/assets/claudeMd.ts +303 -0
  192. package/src/cli/assets/mainBrowserTs.ts +2 -2
  193. package/src/cli/assets/mainServerTs.ts +24 -0
  194. package/src/cli/assets/webAppRouterTs.ts +15 -0
  195. package/src/cli/assets/webHelloComponentTsx.ts +16 -0
  196. package/src/cli/assets/webIndexTs.ts +16 -0
  197. package/src/cli/atoms/buildOptions.ts +88 -0
  198. package/src/cli/commands/build.ts +70 -87
  199. package/src/cli/commands/db.ts +21 -22
  200. package/src/cli/commands/deploy.ts +17 -5
  201. package/src/cli/commands/dev.ts +22 -14
  202. package/src/cli/commands/format.ts +8 -2
  203. package/src/cli/commands/gen/env.ts +53 -0
  204. package/src/cli/commands/gen/openapi.ts +1 -1
  205. package/src/cli/commands/gen/resource.ts +15 -0
  206. package/src/cli/commands/gen.ts +7 -1
  207. package/src/cli/commands/init.ts +74 -30
  208. package/src/cli/commands/lint.ts +8 -2
  209. package/src/cli/commands/test.ts +8 -3
  210. package/src/cli/commands/typecheck.ts +5 -1
  211. package/src/cli/commands/verify.ts +5 -3
  212. package/src/cli/defineConfig.ts +49 -7
  213. package/src/cli/index.ts +0 -1
  214. package/src/cli/services/AlephaCliUtils.ts +39 -589
  215. package/src/cli/services/PackageManagerUtils.ts +301 -0
  216. package/src/cli/services/ProjectScaffolder.ts +306 -0
  217. package/src/command/helpers/Runner.spec.ts +2 -2
  218. package/src/command/helpers/Runner.ts +16 -4
  219. package/src/command/primitives/$command.ts +0 -6
  220. package/src/command/providers/CliProvider.ts +1 -3
  221. package/src/core/Alepha.ts +42 -0
  222. package/src/core/__tests__/Alepha-graph.spec.ts +4 -0
  223. package/src/core/index.shared.ts +1 -0
  224. package/src/core/index.ts +2 -0
  225. package/src/core/primitives/$hook.ts +6 -2
  226. package/src/core/primitives/$module.spec.ts +4 -0
  227. package/src/core/providers/AlsProvider.ts +1 -1
  228. package/src/core/providers/CodecManager.spec.ts +12 -6
  229. package/src/core/providers/CodecManager.ts +26 -6
  230. package/src/core/providers/EventManager.ts +169 -13
  231. package/src/core/providers/KeylessJsonSchemaCodec.spec.ts +621 -0
  232. package/src/core/providers/KeylessJsonSchemaCodec.ts +407 -0
  233. package/src/core/providers/StateManager.spec.ts +27 -16
  234. package/src/email/providers/LocalEmailProvider.spec.ts +111 -87
  235. package/src/email/providers/LocalEmailProvider.ts +52 -15
  236. package/src/email/providers/NodemailerEmailProvider.ts +167 -56
  237. package/src/file/errors/FileError.ts +7 -0
  238. package/src/file/index.ts +9 -1
  239. package/src/file/providers/MemoryFileSystemProvider.ts +393 -0
  240. package/src/logger/index.ts +15 -3
  241. package/src/mcp/transports/StdioMcpTransport.ts +1 -1
  242. package/src/orm/index.browser.ts +1 -19
  243. package/src/orm/index.bun.ts +77 -0
  244. package/src/orm/index.shared-server.ts +22 -0
  245. package/src/orm/index.shared.ts +15 -0
  246. package/src/orm/index.ts +13 -39
  247. package/src/orm/providers/drivers/BunPostgresProvider.ts +3 -5
  248. package/src/orm/providers/drivers/BunSqliteProvider.ts +1 -1
  249. package/src/orm/providers/drivers/CloudflareD1Provider.ts +4 -0
  250. package/src/orm/providers/drivers/DatabaseProvider.ts +4 -0
  251. package/src/orm/providers/drivers/PglitePostgresProvider.ts +4 -0
  252. package/src/orm/services/Repository.ts +8 -0
  253. package/src/queue/core/providers/WorkerProvider.spec.ts +48 -32
  254. package/src/redis/index.bun.ts +35 -0
  255. package/src/redis/providers/BunRedisProvider.ts +12 -43
  256. package/src/redis/providers/BunRedisSubscriberProvider.ts +2 -3
  257. package/src/redis/providers/NodeRedisProvider.ts +16 -34
  258. package/src/{server/security → security}/__tests__/BasicAuth.spec.ts +11 -11
  259. package/src/{server/security → security}/__tests__/ServerSecurityProvider-realm.spec.ts +21 -16
  260. package/src/{server/security/providers → security/__tests__}/ServerSecurityProvider.spec.ts +5 -5
  261. package/src/security/index.browser.ts +5 -0
  262. package/src/security/index.ts +90 -7
  263. package/src/security/primitives/{$realm.spec.ts → $issuer.spec.ts} +11 -11
  264. package/src/security/primitives/{$realm.ts → $issuer.ts} +20 -17
  265. package/src/security/primitives/$role.ts +5 -5
  266. package/src/security/primitives/$serviceAccount.spec.ts +5 -5
  267. package/src/security/primitives/$serviceAccount.ts +3 -3
  268. package/src/{server/security → security}/providers/ServerSecurityProvider.ts +5 -7
  269. package/src/server/auth/primitives/$auth.ts +10 -10
  270. package/src/server/auth/primitives/$authCredentials.ts +3 -3
  271. package/src/server/auth/primitives/$authGithub.ts +3 -3
  272. package/src/server/auth/primitives/$authGoogle.ts +3 -3
  273. package/src/server/auth/providers/ServerAuthProvider.ts +13 -13
  274. package/src/server/cache/providers/ServerCacheProvider.spec.ts +183 -0
  275. package/src/server/cache/providers/ServerCacheProvider.ts +95 -10
  276. package/src/server/compress/providers/ServerCompressProvider.ts +61 -2
  277. package/src/server/cookies/providers/ServerCookiesProvider.ts +3 -3
  278. package/src/server/core/helpers/ServerReply.ts +2 -2
  279. package/src/server/core/providers/NodeHttpServerProvider.ts +25 -6
  280. package/src/server/core/providers/ServerBodyParserProvider.ts +19 -23
  281. package/src/server/core/providers/ServerLoggerProvider.ts +23 -19
  282. package/src/server/core/providers/ServerProvider.ts +155 -22
  283. package/src/server/core/providers/ServerRouterProvider.ts +259 -115
  284. package/src/server/core/providers/ServerTimingProvider.ts +2 -2
  285. package/src/server/links/index.ts +1 -1
  286. package/src/server/links/providers/LinkProvider.ts +1 -1
  287. package/src/server/static/providers/ServerStaticProvider.ts +10 -0
  288. package/src/server/swagger/index.ts +1 -1
  289. package/src/server/swagger/providers/ServerSwaggerProvider.ts +5 -8
  290. package/src/sms/providers/LocalSmsProvider.spec.ts +153 -111
  291. package/src/sms/providers/LocalSmsProvider.ts +8 -7
  292. package/src/vite/helpers/boot.ts +28 -17
  293. package/src/vite/helpers/importViteReact.ts +13 -0
  294. package/src/vite/index.ts +1 -21
  295. package/src/vite/plugins/viteAlephaDev.ts +16 -1
  296. package/src/vite/plugins/viteAlephaSsrPreload.ts +222 -0
  297. package/src/vite/tasks/buildClient.ts +11 -0
  298. package/src/vite/tasks/buildServer.ts +59 -4
  299. package/src/vite/tasks/devServer.ts +71 -0
  300. package/src/vite/tasks/generateCloudflare.ts +7 -0
  301. package/src/vite/tasks/index.ts +2 -1
  302. package/dist/server/security/index.browser.js +0 -13
  303. package/dist/server/security/index.browser.js.map +0 -1
  304. package/dist/server/security/index.d.ts +0 -173
  305. package/dist/server/security/index.d.ts.map +0 -1
  306. package/dist/server/security/index.js +0 -311
  307. package/dist/server/security/index.js.map +0 -1
  308. package/src/cli/assets/appRouterTs.ts +0 -9
  309. package/src/cli/assets/mainTs.ts +0 -13
  310. package/src/cli/assets/viteConfigTs.ts +0 -14
  311. package/src/cli/commands/run.ts +0 -24
  312. package/src/server/security/index.browser.ts +0 -10
  313. package/src/server/security/index.ts +0 -94
  314. package/src/vite/plugins/viteAlepha.ts +0 -37
  315. package/src/vite/plugins/viteAlephaBuild.ts +0 -281
  316. /package/src/{server/security → security}/primitives/$basicAuth.ts +0 -0
  317. /package/src/{server/security → security}/providers/ServerBasicAuthProvider.ts +0 -0
@@ -10,11 +10,11 @@ import { AlephaApiAudits, AuditService } from "alepha/api/audits";
10
10
  import { $logger } from "alepha/logger";
11
11
  import { $bucket } from "alepha/bucket";
12
12
  import { $client } from "alepha/server/links";
13
+ import { $authCredentials, $authGithub, $authGoogle, ServerAuthProvider, authenticationProviderSchema } from "alepha/server/auth";
13
14
  import { randomInt, randomUUID } from "node:crypto";
14
15
  import { $cache } from "alepha/cache";
15
16
  import { DateTimeProvider } from "alepha/datetime";
16
- import { $realm, CryptoProvider, InvalidCredentialsError, SecurityProvider } from "alepha/security";
17
- import { $authCredentials, $authGithub, $authGoogle, ServerAuthProvider, authenticationProviderSchema } from "alepha/server/auth";
17
+ import { $issuer, CryptoProvider, InvalidCredentialsError, SecurityProvider } from "alepha/security";
18
18
  import { FileSystemProvider } from "alepha/file";
19
19
  import { AlephaApiFiles } from "alepha/api/files";
20
20
 
@@ -37,8 +37,7 @@ const users = $entity({
37
37
  realm: db.default(t.text(), DEFAULT_USER_REALM_NAME),
38
38
  username: t.optional(t.shortText({
39
39
  minLength: 3,
40
- maxLength: 50,
41
- pattern: "^[a-zA-Z0-9._-]+$"
40
+ maxLength: 50
42
41
  })),
43
42
  email: t.optional(t.string({ format: "email" })),
44
43
  phoneNumber: t.optional(t.e164()),
@@ -99,6 +98,7 @@ const realmAuthSettingsAtom = $atom({
99
98
  emailRequired: t.boolean({ description: "Require email address for user accounts" }),
100
99
  usernameEnabled: t.boolean({ description: "Enable username as a login/registration credential" }),
101
100
  usernameRequired: t.boolean({ description: "Require username for user accounts" }),
101
+ usernameRegExp: t.string({ description: "Regular expression that usernames must match (if username is enabled)" }),
102
102
  phoneEnabled: t.boolean({ description: "Enable phone number as a login/registration credential" }),
103
103
  phoneRequired: t.boolean({ description: "Require phone number for user accounts" }),
104
104
  verifyEmailRequired: t.boolean({ description: "Require email verification for user accounts" }),
@@ -124,6 +124,7 @@ const realmAuthSettingsAtom = $atom({
124
124
  emailRequired: true,
125
125
  usernameEnabled: false,
126
126
  usernameRequired: false,
127
+ usernameRegExp: "^[a-zA-Z0-9_]{3,30}$",
127
128
  phoneEnabled: false,
128
129
  phoneRequired: false,
129
130
  verifyEmailRequired: false,
@@ -167,8 +168,8 @@ const sessions = $entity({
167
168
  });
168
169
 
169
170
  //#endregion
170
- //#region ../../src/api/users/providers/UserRealmProvider.ts
171
- var UserRealmProvider = class {
171
+ //#region ../../src/api/users/providers/RealmProvider.ts
172
+ var RealmProvider = class {
172
173
  alepha = $inject(Alepha);
173
174
  defaultIdentities = $repository(identities);
174
175
  defaultSessions = $repository(sessions);
@@ -193,46 +194,46 @@ var UserRealmProvider = class {
193
194
  });
194
195
  }
195
196
  });
196
- register(userRealmName, userRealmOptions = {}) {
197
- this.realms.set(userRealmName, {
198
- name: userRealmName,
197
+ register(realmName, realmOptions = {}) {
198
+ this.realms.set(realmName, {
199
+ name: realmName,
199
200
  repositories: {
200
- identities: userRealmOptions.entities?.identities ?? this.defaultIdentities,
201
- sessions: userRealmOptions.entities?.sessions ?? this.defaultSessions,
202
- users: userRealmOptions.entities?.users ?? this.defaultUsers
201
+ identities: realmOptions.entities?.identities ?? this.defaultIdentities,
202
+ sessions: realmOptions.entities?.sessions ?? this.defaultSessions,
203
+ users: realmOptions.entities?.users ?? this.defaultUsers
203
204
  },
204
205
  settings: {
205
206
  ...realmAuthSettingsAtom.options.default,
206
- ...userRealmOptions.settings,
207
+ ...realmOptions.settings,
207
208
  passwordPolicy: {
208
209
  ...realmAuthSettingsAtom.options.default.passwordPolicy,
209
- ...userRealmOptions.settings?.passwordPolicy
210
+ ...realmOptions.settings?.passwordPolicy
210
211
  }
211
212
  }
212
213
  });
213
- return this.getRealm(userRealmName);
214
+ return this.getRealm(realmName);
214
215
  }
215
216
  /**
216
217
  * Gets a registered realm by name, auto-creating default if needed.
217
218
  */
218
- getRealm(userRealmName = DEFAULT_USER_REALM_NAME) {
219
- let realm = this.realms.get(userRealmName);
219
+ getRealm(realmName = DEFAULT_USER_REALM_NAME) {
220
+ let realm = this.realms.get(realmName);
220
221
  if (!realm) {
221
222
  const firstRealm = Array.from(this.realms.values())[0];
222
- if (userRealmName === DEFAULT_USER_REALM_NAME && firstRealm) realm = firstRealm;
223
- else if (this.alepha.isTest()) realm = this.register(userRealmName);
224
- else throw new AlephaError(`Missing user realm '${userRealmName}', please declare $userRealm in your application.`);
223
+ if (realmName === DEFAULT_USER_REALM_NAME && firstRealm) realm = firstRealm;
224
+ else if (this.alepha.isTest()) realm = this.register(realmName);
225
+ else throw new AlephaError(`Missing realm '${realmName}', please declare $realm in your application.`);
225
226
  }
226
227
  return realm;
227
228
  }
228
- identityRepository(userRealmName = DEFAULT_USER_REALM_NAME) {
229
- return this.getRealm(userRealmName).repositories.identities;
229
+ identityRepository(realmName = DEFAULT_USER_REALM_NAME) {
230
+ return this.getRealm(realmName).repositories.identities;
230
231
  }
231
- sessionRepository(userRealmName = DEFAULT_USER_REALM_NAME) {
232
- return this.getRealm(userRealmName).repositories.sessions;
232
+ sessionRepository(realmName = DEFAULT_USER_REALM_NAME) {
233
+ return this.getRealm(realmName).repositories.sessions;
233
234
  }
234
- userRepository(userRealmName = DEFAULT_USER_REALM_NAME) {
235
- return this.getRealm(userRealmName).repositories.users;
235
+ userRepository(realmName = DEFAULT_USER_REALM_NAME) {
236
+ return this.getRealm(realmName).repositories.users;
236
237
  }
237
238
  };
238
239
 
@@ -240,10 +241,10 @@ var UserRealmProvider = class {
240
241
  //#region ../../src/api/users/services/IdentityService.ts
241
242
  var IdentityService = class {
242
243
  log = $logger();
243
- userRealmProvider = $inject(UserRealmProvider);
244
+ realmProvider = $inject(RealmProvider);
244
245
  auditService = $inject(AuditService);
245
246
  identities(userRealmName) {
246
- return this.userRealmProvider.identityRepository(userRealmName);
247
+ return this.realmProvider.identityRepository(userRealmName);
247
248
  }
248
249
  /**
249
250
  * Find identities with pagination and filtering.
@@ -295,7 +296,7 @@ var IdentityService = class {
295
296
  provider: identity.provider,
296
297
  userId: identity.userId
297
298
  });
298
- const realm = this.userRealmProvider.getRealm(userRealmName);
299
+ const realm = this.realmProvider.getRealm(userRealmName);
299
300
  await this.auditService.recordUser("update", {
300
301
  userRealm: realm.name,
301
302
  resourceId: identity.userId,
@@ -398,9 +399,9 @@ const sessionResourceSchema = t.object({
398
399
  //#region ../../src/api/users/services/SessionCrudService.ts
399
400
  var SessionCrudService = class {
400
401
  log = $logger();
401
- userRealmProvider = $inject(UserRealmProvider);
402
+ realmProvider = $inject(RealmProvider);
402
403
  sessions(userRealmName) {
403
- return this.userRealmProvider.sessionRepository(userRealmName);
404
+ return this.realmProvider.sessionRepository(userRealmName);
404
405
  }
405
406
  /**
406
407
  * Find sessions with pagination and filtering.
@@ -672,10 +673,10 @@ var UserService = class {
672
673
  log = $logger();
673
674
  verificationController = $client();
674
675
  userNotifications = $inject(UserNotifications);
675
- userRealmProvider = $inject(UserRealmProvider);
676
+ realmProvider = $inject(RealmProvider);
676
677
  auditService = $inject(AuditService);
677
678
  users(userRealmName) {
678
- return this.userRealmProvider.userRepository(userRealmName);
679
+ return this.realmProvider.userRepository(userRealmName);
679
680
  }
680
681
  /**
681
682
  * Request email verification for a user.
@@ -779,7 +780,7 @@ var UserService = class {
779
780
  userId: user.id,
780
781
  type
781
782
  });
782
- const realm = this.userRealmProvider.getRealm(userRealmName);
783
+ const realm = this.realmProvider.getRealm(userRealmName);
783
784
  await this.auditService.recordUser("update", {
784
785
  userId: user.id,
785
786
  userEmail: email,
@@ -843,7 +844,7 @@ var UserService = class {
843
844
  email: data.email,
844
845
  userRealmName
845
846
  });
846
- const realm = this.userRealmProvider.getRealm(userRealmName);
847
+ const realm = this.realmProvider.getRealm(userRealmName);
847
848
  if (data.username) {
848
849
  if (await this.users(userRealmName).findOne({ where: { username: { eq: data.username } } }).catch(() => void 0)) {
849
850
  this.log.debug("Username already taken", { username: data.username });
@@ -895,7 +896,7 @@ var UserService = class {
895
896
  const before = await this.getUserById(id, userRealmName);
896
897
  const user = await this.users(userRealmName).updateById(id, data);
897
898
  this.log.debug("User updated", { userId: id });
898
- const realm = this.userRealmProvider.getRealm(userRealmName);
899
+ const realm = this.realmProvider.getRealm(userRealmName);
899
900
  const changes = {};
900
901
  for (const key of Object.keys(data)) if (data[key] !== void 0 && before[key] !== data[key]) changes[key] = {
901
902
  from: before[key],
@@ -921,7 +922,7 @@ var UserService = class {
921
922
  const user = await this.getUserById(id, userRealmName);
922
923
  await this.users(userRealmName).deleteById(id);
923
924
  this.log.info("User deleted", { userId: id });
924
- const realm = this.userRealmProvider.getRealm(userRealmName);
925
+ const realm = this.realmProvider.getRealm(userRealmName);
925
926
  await this.auditService.recordUser("delete", {
926
927
  userRealm: realm.name,
927
928
  resourceId: id,
@@ -1025,6 +1026,67 @@ var AdminUserController = class {
1025
1026
  });
1026
1027
  };
1027
1028
 
1029
+ //#endregion
1030
+ //#region ../../src/api/users/schemas/realmConfigSchema.ts
1031
+ const realmConfigSchema = t.object({
1032
+ settings: realmAuthSettingsAtom.schema,
1033
+ realmName: t.string(),
1034
+ authenticationMethods: t.array(authenticationProviderSchema)
1035
+ });
1036
+
1037
+ //#endregion
1038
+ //#region ../../src/api/users/controllers/RealmController.ts
1039
+ /**
1040
+ * Controller for exposing realm configuration.
1041
+ * Uses $route instead of $action to keep endpoints hidden from API documentation.
1042
+ */
1043
+ var RealmController = class {
1044
+ url = "/realms";
1045
+ group = "realms";
1046
+ realmProvider = $inject(RealmProvider);
1047
+ serverAuthProvider = $inject(ServerAuthProvider);
1048
+ /**
1049
+ * Get realm configuration settings.
1050
+ * This endpoint is not exposed in the API documentation.
1051
+ */
1052
+ getRealmConfig = $action({
1053
+ group: this.group,
1054
+ method: "GET",
1055
+ path: `${this.url}/config`,
1056
+ secure: false,
1057
+ cache: {
1058
+ etag: true,
1059
+ control: { maxAge: [24, "hours"] }
1060
+ },
1061
+ schema: {
1062
+ query: t.object({ realmName: t.optional(t.string()) }),
1063
+ response: realmConfigSchema
1064
+ },
1065
+ handler: ({ query }) => {
1066
+ const { name: realmName, settings } = this.realmProvider.getRealm(query.realmName);
1067
+ return {
1068
+ settings,
1069
+ realmName,
1070
+ authenticationMethods: this.serverAuthProvider.getAuthenticationProviders({ realmName })
1071
+ };
1072
+ }
1073
+ });
1074
+ checkUsernameAvailability = $action({
1075
+ group: this.group,
1076
+ path: `${this.url}/check-username`,
1077
+ secure: false,
1078
+ schema: {
1079
+ query: t.object({ realmName: t.optional(t.text()) }),
1080
+ body: t.object({ username: t.text() }),
1081
+ response: t.object({ available: t.boolean() })
1082
+ },
1083
+ handler: async ({ query, body }) => {
1084
+ const realmName = query.realmName;
1085
+ return { available: !await this.realmProvider.userRepository(realmName).findOne({ where: { username: { eq: body.username } } }).catch(() => void 0) };
1086
+ }
1087
+ });
1088
+ };
1089
+
1028
1090
  //#endregion
1029
1091
  //#region ../../src/api/users/schemas/completePasswordResetRequestSchema.ts
1030
1092
  /**
@@ -1116,20 +1178,20 @@ var CredentialService = class {
1116
1178
  dateTimeProvider = $inject(DateTimeProvider);
1117
1179
  verificationController = $client();
1118
1180
  userNotifications = $inject(UserNotifications);
1119
- userRealmProvider = $inject(UserRealmProvider);
1181
+ realmProvider = $inject(RealmProvider);
1120
1182
  auditService = $inject(AuditService);
1121
1183
  intentCache = $cache({
1122
1184
  name: "password-reset-intents",
1123
1185
  ttl: [INTENT_TTL_MINUTES$1, "minutes"]
1124
1186
  });
1125
1187
  users(userRealmName) {
1126
- return this.userRealmProvider.userRepository(userRealmName);
1188
+ return this.realmProvider.userRepository(userRealmName);
1127
1189
  }
1128
1190
  sessions(userRealmName) {
1129
- return this.userRealmProvider.sessionRepository(userRealmName);
1191
+ return this.realmProvider.sessionRepository(userRealmName);
1130
1192
  }
1131
1193
  identities(userRealmName) {
1132
- return this.userRealmProvider.identityRepository(userRealmName);
1194
+ return this.realmProvider.identityRepository(userRealmName);
1133
1195
  }
1134
1196
  /**
1135
1197
  * Phase 1: Create a password reset intent.
@@ -1246,7 +1308,7 @@ var CredentialService = class {
1246
1308
  userId: intent.userId,
1247
1309
  email: intent.email
1248
1310
  });
1249
- const realm = this.userRealmProvider.getRealm(intent.realmName);
1311
+ const realm = this.realmProvider.getRealm(intent.realmName);
1250
1312
  await this.auditService.recordUser("update", {
1251
1313
  userId: intent.userId,
1252
1314
  userEmail: intent.email,
@@ -1305,7 +1367,7 @@ var CredentialService = class {
1305
1367
  const hashedPassword = await this.cryptoProvider.hashPassword(newPassword);
1306
1368
  await this.identities(userRealmName).updateById(identity.id, { password: hashedPassword });
1307
1369
  await this.sessions(userRealmName).deleteMany({ userId: { eq: user.id } });
1308
- const realm = this.userRealmProvider.getRealm(userRealmName);
1370
+ const realm = this.realmProvider.getRealm(userRealmName);
1309
1371
  await this.auditService.recordUser("update", {
1310
1372
  userId: user.id,
1311
1373
  userEmail: email,
@@ -1334,7 +1396,7 @@ var RegistrationService = class {
1334
1396
  cryptoProvider = $inject(CryptoProvider);
1335
1397
  verificationController = $client();
1336
1398
  userNotifications = $inject(UserNotifications);
1337
- userRealmProvider = $inject(UserRealmProvider);
1399
+ realmProvider = $inject(RealmProvider);
1338
1400
  auditService = $inject(AuditService);
1339
1401
  intentCache = $cache({
1340
1402
  name: "registration-intents",
@@ -1352,8 +1414,7 @@ var RegistrationService = class {
1352
1414
  username: body.username,
1353
1415
  userRealmName
1354
1416
  });
1355
- const realmSettings = this.userRealmProvider.getRealm(userRealmName).settings;
1356
- this.userRealmProvider.userRepository(userRealmName);
1417
+ const realmSettings = this.realmProvider.getRealm(userRealmName).settings;
1357
1418
  if (realmSettings?.registrationAllowed === false) {
1358
1419
  this.log.warn("Registration not allowed for realm", { userRealmName });
1359
1420
  throw new BadRequestError("Registration is not allowed");
@@ -1362,6 +1423,18 @@ var RegistrationService = class {
1362
1423
  this.log.debug("Registration rejected: username required", { userRealmName });
1363
1424
  throw new BadRequestError("Username is required");
1364
1425
  }
1426
+ if (body.username) {
1427
+ const usernameRegExp = realmSettings?.usernameRegExp;
1428
+ if (usernameRegExp) {
1429
+ if (!new RegExp(usernameRegExp).test(body.username)) {
1430
+ this.log.debug("Registration rejected: username regex mismatch", {
1431
+ userRealmName,
1432
+ username: body.username
1433
+ });
1434
+ throw new BadRequestError("Username does not meet the required format");
1435
+ }
1436
+ }
1437
+ }
1365
1438
  if (realmSettings?.emailRequired !== false && !body.email) {
1366
1439
  this.log.debug("Registration rejected: email required", { userRealmName });
1367
1440
  throw new BadRequestError("Email is required");
@@ -1428,8 +1501,8 @@ var RegistrationService = class {
1428
1501
  });
1429
1502
  }
1430
1503
  const userRealmName = intent.realmName;
1431
- const userRepository = this.userRealmProvider.userRepository(userRealmName);
1432
- const identityRepository = this.userRealmProvider.identityRepository(userRealmName);
1504
+ const userRepository = this.realmProvider.userRepository(userRealmName);
1505
+ const identityRepository = this.realmProvider.identityRepository(userRealmName);
1433
1506
  if (intent.requirements.email) {
1434
1507
  if (!body.emailCode) {
1435
1508
  this.log.debug("Registration completion missing email code", { intentId: body.intentId });
@@ -1477,7 +1550,7 @@ var RegistrationService = class {
1477
1550
  email: user.email,
1478
1551
  username: user.username
1479
1552
  });
1480
- const realm = this.userRealmProvider.getRealm(userRealmName);
1553
+ const realm = this.realmProvider.getRealm(userRealmName);
1481
1554
  await this.auditService.recordUser("create", {
1482
1555
  userId: user.id,
1483
1556
  userEmail: user.email ?? void 0,
@@ -1497,7 +1570,7 @@ var RegistrationService = class {
1497
1570
  * Check if username, email, and phone are available.
1498
1571
  */
1499
1572
  async checkUserAvailability(body, userRealmName) {
1500
- const userRepository = this.userRealmProvider.userRepository(userRealmName);
1573
+ const userRepository = this.realmProvider.userRepository(userRealmName);
1501
1574
  if (body.username) {
1502
1575
  if (await userRepository.findOne({ where: { username: { eq: body.username } } }).catch(() => void 0)) {
1503
1576
  this.log.debug("Username already taken", { username: body.username });
@@ -1522,23 +1595,19 @@ var RegistrationService = class {
1522
1595
  */
1523
1596
  async sendEmailVerification(email) {
1524
1597
  this.log.debug("Sending email verification code", { email });
1525
- try {
1526
- const verification = await this.verificationController.requestVerificationCode({
1527
- params: { type: "code" },
1528
- body: { target: email }
1529
- });
1530
- await this.userNotifications.emailVerification.push({
1531
- contact: email,
1532
- variables: {
1533
- email,
1534
- code: verification.token,
1535
- expiresInMinutes: Math.floor(verification.codeExpiration / 60)
1536
- }
1537
- });
1538
- this.log.debug("Email verification code sent", { email });
1539
- } catch (error) {
1540
- this.log.warn("Failed to send email verification code", error);
1541
- }
1598
+ const verification = await this.verificationController.requestVerificationCode({
1599
+ params: { type: "code" },
1600
+ body: { target: email }
1601
+ });
1602
+ await this.userNotifications.emailVerification.push({
1603
+ contact: email,
1604
+ variables: {
1605
+ email,
1606
+ code: verification.token,
1607
+ expiresInMinutes: Math.floor(verification.codeExpiration / 60)
1608
+ }
1609
+ });
1610
+ this.log.debug("Email verification code sent", { email });
1542
1611
  }
1543
1612
  /**
1544
1613
  * Send phone verification code.
@@ -1831,67 +1900,6 @@ var UserController = class {
1831
1900
  });
1832
1901
  };
1833
1902
 
1834
- //#endregion
1835
- //#region ../../src/api/users/schemas/userRealmConfigSchema.ts
1836
- const userRealmConfigSchema = t.object({
1837
- settings: realmAuthSettingsAtom.schema,
1838
- realmName: t.string(),
1839
- authenticationMethods: t.array(authenticationProviderSchema)
1840
- });
1841
-
1842
- //#endregion
1843
- //#region ../../src/api/users/controllers/UserRealmController.ts
1844
- /**
1845
- * Controller for exposing realm configuration.
1846
- * Uses $route instead of $action to keep endpoints hidden from API documentation.
1847
- */
1848
- var UserRealmController = class {
1849
- url = "/realms";
1850
- group = "realms";
1851
- userRealmProvider = $inject(UserRealmProvider);
1852
- serverAuthProvider = $inject(ServerAuthProvider);
1853
- /**
1854
- * Get realm configuration settings.
1855
- * This endpoint is not exposed in the API documentation.
1856
- */
1857
- getRealmConfig = $action({
1858
- group: this.group,
1859
- method: "GET",
1860
- path: `${this.url}/config`,
1861
- secure: false,
1862
- cache: {
1863
- etag: true,
1864
- control: { maxAge: [24, "hours"] }
1865
- },
1866
- schema: {
1867
- query: t.object({ userRealmName: t.optional(t.string()) }),
1868
- response: userRealmConfigSchema
1869
- },
1870
- handler: ({ query }) => {
1871
- const { name: realmName, settings } = this.userRealmProvider.getRealm(query.userRealmName);
1872
- return {
1873
- settings,
1874
- realmName,
1875
- authenticationMethods: this.serverAuthProvider.getAuthenticationProviders({ realmName })
1876
- };
1877
- }
1878
- });
1879
- checkUsernameAvailability = $action({
1880
- group: this.group,
1881
- path: `${this.url}/check-username`,
1882
- secure: false,
1883
- schema: {
1884
- query: t.object({ userRealmName: t.optional(t.text()) }),
1885
- body: t.object({ username: t.text() }),
1886
- response: t.object({ available: t.boolean() })
1887
- },
1888
- handler: async ({ query, body }) => {
1889
- const realmName = query.userRealmName;
1890
- return { available: !await this.userRealmProvider.userRepository(realmName).findOne({ where: { username: { eq: body.username } } }).catch(() => void 0) };
1891
- }
1892
- });
1893
- };
1894
-
1895
1903
  //#endregion
1896
1904
  //#region ../../src/api/users/services/SessionService.ts
1897
1905
  var SessionService = class {
@@ -1900,17 +1908,17 @@ var SessionService = class {
1900
1908
  dateTimeProvider = $inject(DateTimeProvider);
1901
1909
  cryptoProvider = $inject(CryptoProvider);
1902
1910
  log = $logger();
1903
- userRealmProvider = $inject(UserRealmProvider);
1911
+ realmProvider = $inject(RealmProvider);
1904
1912
  fileController = $client();
1905
1913
  auditService = $inject(AuditService);
1906
1914
  users(userRealmName) {
1907
- return this.userRealmProvider.userRepository(userRealmName);
1915
+ return this.realmProvider.userRepository(userRealmName);
1908
1916
  }
1909
1917
  sessions(userRealmName) {
1910
- return this.userRealmProvider.sessionRepository(userRealmName);
1918
+ return this.realmProvider.sessionRepository(userRealmName);
1911
1919
  }
1912
1920
  identities(userRealmName) {
1913
- return this.userRealmProvider.identityRepository(userRealmName);
1921
+ return this.realmProvider.identityRepository(userRealmName);
1914
1922
  }
1915
1923
  /**
1916
1924
  * Random delay to prevent timing attacks (50-200ms)
@@ -1923,7 +1931,7 @@ var SessionService = class {
1923
1931
  * Validate user credentials and return the user if valid.
1924
1932
  */
1925
1933
  async login(provider, username, password, userRealmName) {
1926
- const { settings, name } = this.userRealmProvider.getRealm(userRealmName);
1934
+ const { settings, name } = this.realmProvider.getRealm(userRealmName);
1927
1935
  const isEmail = username.includes("@");
1928
1936
  const isPhone = /^[+\d][\d\s()-]+$/.test(username);
1929
1937
  const isUsername = !isEmail && !isPhone;
@@ -1933,8 +1941,27 @@ var SessionService = class {
1933
1941
  try {
1934
1942
  const where = users$1.createQueryWhere();
1935
1943
  where.realm = name;
1936
- if (settings.usernameEnabled !== false && isUsername) where.username = username;
1937
- else if (settings.emailEnabled !== false && isEmail) where.email = username;
1944
+ if (settings.usernameEnabled !== false && isUsername) {
1945
+ if (settings.usernameRegExp) {
1946
+ if (!new RegExp(settings.usernameRegExp).test(username)) {
1947
+ this.log.warn("Username does not match required format", {
1948
+ provider,
1949
+ username,
1950
+ realm: name
1951
+ });
1952
+ await this.auditService.recordAuth("login_failed", {
1953
+ userRealm: name,
1954
+ description: "Username does not match required format",
1955
+ metadata: {
1956
+ provider,
1957
+ username
1958
+ }
1959
+ });
1960
+ throw new InvalidCredentialsError();
1961
+ }
1962
+ }
1963
+ where.username = username;
1964
+ } else if (settings.emailEnabled !== false && isEmail) where.email = username;
1938
1965
  else if (settings.phoneEnabled === true && isPhone) where.phoneNumber = username;
1939
1966
  else {
1940
1967
  this.log.warn("Invalid login identifier format", {
@@ -2061,7 +2088,7 @@ var SessionService = class {
2061
2088
  sessionId: session.id,
2062
2089
  userId: session.userId
2063
2090
  });
2064
- const { name } = this.userRealmProvider.getRealm(userRealmName);
2091
+ const { name } = this.realmProvider.getRealm(userRealmName);
2065
2092
  await this.auditService.recordAuth("token_refresh", {
2066
2093
  userId: user.id,
2067
2094
  userEmail: user.email ?? void 0,
@@ -2081,7 +2108,7 @@ var SessionService = class {
2081
2108
  await this.sessions(userRealmName).deleteOne({ refreshToken });
2082
2109
  this.log.debug("Session deleted");
2083
2110
  if (session) {
2084
- const { name } = this.userRealmProvider.getRealm(userRealmName);
2111
+ const { name } = this.realmProvider.getRealm(userRealmName);
2085
2112
  await this.auditService.recordAuth("logout", {
2086
2113
  userId: session.userId,
2087
2114
  userRealm: name,
@@ -2096,7 +2123,7 @@ var SessionService = class {
2096
2123
  profileSub: profile.sub,
2097
2124
  email: profile.email
2098
2125
  });
2099
- const realm = this.userRealmProvider.getRealm(userRealmName);
2126
+ const realm = this.realmProvider.getRealm(userRealmName);
2100
2127
  const identities$1 = this.identities(userRealmName);
2101
2128
  const users$1 = this.users(userRealmName);
2102
2129
  const identity = await identities$1.findOne({ where: {
@@ -2224,7 +2251,7 @@ var SessionService = class {
2224
2251
  };
2225
2252
 
2226
2253
  //#endregion
2227
- //#region ../../src/api/users/primitives/$userRealm.ts
2254
+ //#region ../../src/api/users/primitives/$realm.ts
2228
2255
  /**
2229
2256
  * Already configured realm for user management.
2230
2257
  *
@@ -2238,24 +2265,24 @@ var SessionService = class {
2238
2265
  * Environment Variables:
2239
2266
  * - `APP_SECRET`: Secret key for signing tokens (if not provided in options).
2240
2267
  */
2241
- const $userRealm = (options = {}) => {
2268
+ const $realm = (options = {}) => {
2242
2269
  const { alepha } = $context();
2243
2270
  const sessionService = alepha.inject(SessionService);
2244
2271
  const securityProvider = alepha.inject(SecurityProvider);
2245
- const userRealmProvider = alepha.inject(UserRealmProvider);
2246
- const name = options.realm?.name ?? DEFAULT_USER_REALM_NAME;
2272
+ const realmProvider = alepha.inject(RealmProvider);
2273
+ const name = options.issuer?.name ?? DEFAULT_USER_REALM_NAME;
2247
2274
  options.settings ??= {};
2248
2275
  if (options.settings.emailRequired) options.settings.emailEnabled = true;
2249
2276
  if (options.settings.usernameRequired) options.settings.usernameEnabled = true;
2250
2277
  if (options.settings.phoneRequired) options.settings.phoneEnabled = true;
2251
- const userRealm = userRealmProvider.register(name, options);
2278
+ const realmRegistration = realmProvider.register(name, options);
2252
2279
  alepha.with(AlephaApiFiles);
2253
2280
  alepha.with(AlephaApiAudits);
2254
- const realm = $realm({
2255
- ...options.realm,
2281
+ const realm = $issuer({
2282
+ ...options.issuer,
2256
2283
  name,
2257
2284
  secret: options.secret ?? securityProvider.secretKey,
2258
- roles: options.realm?.roles ?? [{
2285
+ roles: options.issuer?.roles ?? [{
2259
2286
  name: "admin",
2260
2287
  permissions: [{ name: "*" }]
2261
2288
  }, {
@@ -2278,7 +2305,7 @@ const $userRealm = (options = {}) => {
2278
2305
  onDeleteSession: async (refreshToken) => {
2279
2306
  await sessionService.deleteSession(refreshToken);
2280
2307
  },
2281
- ...options.realm?.settings
2308
+ ...options.issuer?.settings
2282
2309
  }
2283
2310
  });
2284
2311
  realm.link = (name$1) => {
@@ -2293,7 +2320,7 @@ const $userRealm = (options = {}) => {
2293
2320
  if (identities$1) {
2294
2321
  const auth = {};
2295
2322
  if (identities$1.credentials) auth.credentials = $authCredentials(realm);
2296
- else userRealm.settings.registrationAllowed = false;
2323
+ else realmRegistration.settings.registrationAllowed = false;
2297
2324
  if (identities$1.google) auth.google = $authGoogle(realm);
2298
2325
  if (identities$1.github) auth.github = $authGithub(realm);
2299
2326
  alepha.with(() => auth);
@@ -2376,7 +2403,7 @@ const AlephaApiUsers = $module({
2376
2403
  AlephaServerHelmet,
2377
2404
  AlephaServerCompress,
2378
2405
  AlephaEmail,
2379
- UserRealmProvider,
2406
+ RealmProvider,
2380
2407
  SessionService,
2381
2408
  SessionCrudService,
2382
2409
  CredentialService,
@@ -2387,11 +2414,11 @@ const AlephaApiUsers = $module({
2387
2414
  AdminUserController,
2388
2415
  AdminSessionController,
2389
2416
  AdminIdentityController,
2390
- UserRealmController,
2417
+ RealmController,
2391
2418
  UserNotifications
2392
2419
  ]
2393
2420
  });
2394
2421
 
2395
2422
  //#endregion
2396
- export { $userRealm, AdminIdentityController, AdminSessionController, AdminUserController, AlephaApiUsers, CredentialService, DEFAULT_USER_REALM_NAME, IdentityService, RegistrationService, SessionCrudService, SessionService, UserController, UserRealmController, UserRealmProvider, UserService, completePasswordResetRequestSchema, completeRegistrationRequestSchema, createUserSchema, identities, identityQuerySchema, identityResourceSchema, loginSchema, passwordResetIntentResponseSchema, realmAuthSettingsAtom, registerSchema, registrationIntentResponseSchema, resetPasswordRequestSchema, resetPasswordSchema, sessionQuerySchema, sessionResourceSchema, sessions, updateUserSchema, userQuerySchema, userRealmConfigSchema, userResourceSchema, users };
2423
+ export { $realm, AdminIdentityController, AdminSessionController, AdminUserController, AlephaApiUsers, CredentialService, DEFAULT_USER_REALM_NAME, IdentityService, RealmController, RealmProvider, RegistrationService, SessionCrudService, SessionService, UserController, UserService, completePasswordResetRequestSchema, completeRegistrationRequestSchema, createUserSchema, identities, identityQuerySchema, identityResourceSchema, loginSchema, passwordResetIntentResponseSchema, realmAuthSettingsAtom, realmConfigSchema, registerSchema, registrationIntentResponseSchema, resetPasswordRequestSchema, resetPasswordSchema, sessionQuerySchema, sessionResourceSchema, sessions, updateUserSchema, userQuerySchema, userResourceSchema, users };
2397
2424
  //# sourceMappingURL=index.js.map