@arch-cadre/core 0.0.41 → 0.0.42

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 (213) hide show
  1. package/dist/_virtual/_rolldown/runtime.mjs +1 -0
  2. package/dist/core/auth/augment.d.mts +20 -0
  3. package/dist/core/auth/augment.d.mts.map +1 -0
  4. package/dist/core/auth/augment.mjs +2 -0
  5. package/dist/core/auth/augment.mjs.map +1 -0
  6. package/dist/core/auth/email-verification.d.mts +62 -0
  7. package/dist/core/auth/email-verification.d.mts.map +1 -0
  8. package/dist/core/auth/email-verification.mjs +2 -0
  9. package/dist/core/auth/email-verification.mjs.map +1 -0
  10. package/dist/core/auth/logic.d.mts +110 -0
  11. package/dist/core/auth/logic.d.mts.map +1 -0
  12. package/dist/core/auth/logic.mjs +2 -0
  13. package/dist/core/auth/logic.mjs.map +1 -0
  14. package/dist/core/auth/password-reset.d.mts +39 -0
  15. package/dist/core/auth/password-reset.d.mts.map +1 -0
  16. package/dist/core/auth/password-reset.mjs +2 -0
  17. package/dist/core/auth/password-reset.mjs.map +1 -0
  18. package/dist/core/auth/rbac.d.mts +61 -0
  19. package/dist/core/auth/rbac.d.mts.map +1 -0
  20. package/dist/core/auth/rbac.mjs +2 -0
  21. package/dist/core/auth/rbac.mjs.map +1 -0
  22. package/dist/core/auth/session.d.mts +54 -0
  23. package/dist/core/auth/session.d.mts.map +1 -0
  24. package/dist/core/auth/session.mjs +2 -0
  25. package/dist/core/auth/session.mjs.map +1 -0
  26. package/dist/core/auth/types.d.mts +55 -0
  27. package/dist/core/auth/types.d.mts.map +1 -0
  28. package/dist/core/auth/utils/encode.d.mts +15 -0
  29. package/dist/core/auth/utils/encode.d.mts.map +1 -0
  30. package/dist/core/auth/utils/encode.mjs +2 -0
  31. package/dist/core/auth/utils/encode.mjs.map +1 -0
  32. package/dist/core/auth/utils/{encryption.d.ts → encryption.d.mts} +8 -5
  33. package/dist/core/auth/utils/encryption.d.mts.map +1 -0
  34. package/dist/core/auth/utils/encryption.mjs +2 -0
  35. package/dist/core/auth/utils/encryption.mjs.map +1 -0
  36. package/dist/core/auth/validation.d.mts +48 -0
  37. package/dist/core/auth/validation.d.mts.map +1 -0
  38. package/dist/core/auth/validation.mjs +2 -0
  39. package/dist/core/auth/validation.mjs.map +1 -0
  40. package/dist/core/bootstrap.d.mts +5 -0
  41. package/dist/core/bootstrap.d.mts.map +1 -0
  42. package/dist/core/bootstrap.mjs +2 -0
  43. package/dist/core/bootstrap.mjs.map +1 -0
  44. package/dist/core/config.d.mts +11 -0
  45. package/dist/core/config.d.mts.map +1 -0
  46. package/dist/core/config.mjs +2 -0
  47. package/dist/core/config.mjs.map +1 -0
  48. package/dist/core/config.server.d.mts +16 -0
  49. package/dist/core/config.server.d.mts.map +1 -0
  50. package/dist/core/config.server.mjs +2 -0
  51. package/dist/core/config.server.mjs.map +1 -0
  52. package/dist/core/event-bus.d.mts +17 -0
  53. package/dist/core/event-bus.d.mts.map +1 -0
  54. package/dist/core/event-bus.mjs +2 -0
  55. package/dist/core/event-bus.mjs.map +1 -0
  56. package/dist/core/filesystem/index.mjs +2 -0
  57. package/dist/core/filesystem/index.mjs.map +1 -0
  58. package/dist/core/filesystem/providers/local.mjs +2 -0
  59. package/dist/core/filesystem/providers/local.mjs.map +1 -0
  60. package/dist/core/filesystem/service.d.mts +19 -0
  61. package/dist/core/filesystem/service.d.mts.map +1 -0
  62. package/dist/core/filesystem/service.mjs +2 -0
  63. package/dist/core/filesystem/service.mjs.map +1 -0
  64. package/dist/core/filesystem/types.d.mts +22 -0
  65. package/dist/core/filesystem/types.d.mts.map +1 -0
  66. package/dist/core/notifications/actions.d.mts +58 -0
  67. package/dist/core/notifications/actions.d.mts.map +1 -0
  68. package/dist/core/notifications/actions.mjs +2 -0
  69. package/dist/core/notifications/actions.mjs.map +1 -0
  70. package/dist/core/notifications/index.mjs +1 -0
  71. package/dist/core/notifications/service.d.mts +9 -0
  72. package/dist/core/notifications/service.d.mts.map +1 -0
  73. package/dist/core/notifications/service.mjs +2 -0
  74. package/dist/core/notifications/service.mjs.map +1 -0
  75. package/dist/core/notifications/types.d.mts +21 -0
  76. package/dist/core/notifications/types.d.mts.map +1 -0
  77. package/dist/core/setup.d.mts +9 -0
  78. package/dist/core/setup.d.mts.map +1 -0
  79. package/dist/core/setup.mjs +2 -0
  80. package/dist/core/setup.mjs.map +1 -0
  81. package/dist/core/types.d.mts +13 -0
  82. package/dist/core/types.d.mts.map +1 -0
  83. package/dist/index.d.mts +8 -0
  84. package/dist/index.mjs +1 -0
  85. package/dist/server/auth/email.d.mts +13 -0
  86. package/dist/server/auth/email.d.mts.map +1 -0
  87. package/dist/server/auth/email.mjs +2 -0
  88. package/dist/server/auth/email.mjs.map +1 -0
  89. package/dist/server/auth/{password.d.ts → password.d.mts} +7 -4
  90. package/dist/server/auth/password.d.mts.map +1 -0
  91. package/dist/server/auth/password.mjs +2 -0
  92. package/dist/server/auth/password.mjs.map +1 -0
  93. package/dist/server/auth/user.d.mts +58 -0
  94. package/dist/server/auth/user.d.mts.map +1 -0
  95. package/dist/server/auth/user.mjs +2 -0
  96. package/dist/server/auth/user.mjs.map +1 -0
  97. package/dist/server/database/inject.d.mts +15 -0
  98. package/dist/server/database/inject.d.mts.map +1 -0
  99. package/dist/server/database/inject.mjs +2 -0
  100. package/dist/server/database/inject.mjs.map +1 -0
  101. package/dist/server/database/schema.d.mts +2962 -0
  102. package/dist/server/database/{schema.d.ts.map → schema.d.mts.map} +1 -1
  103. package/dist/server/database/schema.mjs +2 -0
  104. package/dist/server/database/schema.mjs.map +1 -0
  105. package/dist/server/emails/index.d.mts +26 -0
  106. package/dist/server/emails/index.d.mts.map +1 -0
  107. package/dist/server/emails/index.mjs +2 -0
  108. package/dist/server/emails/index.mjs.map +1 -0
  109. package/dist/server.d.mts +26 -0
  110. package/dist/server.mjs +1 -0
  111. package/package.json +4 -5
  112. package/dist/core/auth/augment.d.ts +0 -18
  113. package/dist/core/auth/augment.d.ts.map +0 -1
  114. package/dist/core/auth/augment.js +0 -53
  115. package/dist/core/auth/email-verification.d.ts +0 -58
  116. package/dist/core/auth/email-verification.d.ts.map +0 -1
  117. package/dist/core/auth/email-verification.js +0 -115
  118. package/dist/core/auth/events.d.ts +0 -53
  119. package/dist/core/auth/events.d.ts.map +0 -1
  120. package/dist/core/auth/events.js +0 -2
  121. package/dist/core/auth/logic.d.ts +0 -106
  122. package/dist/core/auth/logic.d.ts.map +0 -1
  123. package/dist/core/auth/logic.js +0 -264
  124. package/dist/core/auth/password-reset.d.ts +0 -35
  125. package/dist/core/auth/password-reset.d.ts.map +0 -1
  126. package/dist/core/auth/password-reset.js +0 -132
  127. package/dist/core/auth/rbac.d.ts +0 -56
  128. package/dist/core/auth/rbac.d.ts.map +0 -1
  129. package/dist/core/auth/rbac.js +0 -151
  130. package/dist/core/auth/session.d.ts +0 -50
  131. package/dist/core/auth/session.d.ts.map +0 -1
  132. package/dist/core/auth/session.js +0 -167
  133. package/dist/core/auth/types.d.ts +0 -52
  134. package/dist/core/auth/types.d.ts.map +0 -1
  135. package/dist/core/auth/types.js +0 -2
  136. package/dist/core/auth/utils/encode.d.ts +0 -12
  137. package/dist/core/auth/utils/encode.d.ts.map +0 -1
  138. package/dist/core/auth/utils/encode.js +0 -24
  139. package/dist/core/auth/utils/encryption.d.ts.map +0 -1
  140. package/dist/core/auth/utils/encryption.js +0 -68
  141. package/dist/core/auth/validation.d.ts +0 -44
  142. package/dist/core/auth/validation.d.ts.map +0 -1
  143. package/dist/core/auth/validation.js +0 -44
  144. package/dist/core/bootstrap.d.ts +0 -2
  145. package/dist/core/bootstrap.d.ts.map +0 -1
  146. package/dist/core/bootstrap.js +0 -54
  147. package/dist/core/config.d.ts +0 -9
  148. package/dist/core/config.d.ts.map +0 -1
  149. package/dist/core/config.js +0 -6
  150. package/dist/core/config.server.d.ts +0 -12
  151. package/dist/core/config.server.d.ts.map +0 -1
  152. package/dist/core/config.server.js +0 -101
  153. package/dist/core/event-bus.d.ts +0 -14
  154. package/dist/core/event-bus.d.ts.map +0 -1
  155. package/dist/core/event-bus.js +0 -54
  156. package/dist/core/filesystem/index.d.ts +0 -4
  157. package/dist/core/filesystem/index.d.ts.map +0 -1
  158. package/dist/core/filesystem/index.js +0 -27
  159. package/dist/core/filesystem/providers/local.d.ts +0 -8
  160. package/dist/core/filesystem/providers/local.d.ts.map +0 -1
  161. package/dist/core/filesystem/providers/local.js +0 -49
  162. package/dist/core/filesystem/service.d.ts +0 -16
  163. package/dist/core/filesystem/service.d.ts.map +0 -1
  164. package/dist/core/filesystem/service.js +0 -54
  165. package/dist/core/filesystem/types.d.ts +0 -19
  166. package/dist/core/filesystem/types.d.ts.map +0 -1
  167. package/dist/core/filesystem/types.js +0 -2
  168. package/dist/core/notifications/actions.d.ts +0 -54
  169. package/dist/core/notifications/actions.d.ts.map +0 -1
  170. package/dist/core/notifications/actions.js +0 -49
  171. package/dist/core/notifications/index.d.ts +0 -4
  172. package/dist/core/notifications/index.d.ts.map +0 -1
  173. package/dist/core/notifications/index.js +0 -19
  174. package/dist/core/notifications/service.d.ts +0 -7
  175. package/dist/core/notifications/service.d.ts.map +0 -1
  176. package/dist/core/notifications/service.js +0 -35
  177. package/dist/core/notifications/types.d.ts +0 -17
  178. package/dist/core/notifications/types.d.ts.map +0 -1
  179. package/dist/core/notifications/types.js +0 -2
  180. package/dist/core/setup.d.ts +0 -6
  181. package/dist/core/setup.d.ts.map +0 -1
  182. package/dist/core/setup.js +0 -28
  183. package/dist/core/types.d.ts +0 -10
  184. package/dist/core/types.d.ts.map +0 -1
  185. package/dist/core/types.js +0 -2
  186. package/dist/index.d.ts +0 -8
  187. package/dist/index.d.ts.map +0 -1
  188. package/dist/index.js +0 -32
  189. package/dist/server/auth/email.d.ts +0 -10
  190. package/dist/server/auth/email.d.ts.map +0 -1
  191. package/dist/server/auth/email.js +0 -24
  192. package/dist/server/auth/password.d.ts.map +0 -1
  193. package/dist/server/auth/password.js +0 -38
  194. package/dist/server/auth/types.d.ts +0 -13
  195. package/dist/server/auth/types.d.ts.map +0 -1
  196. package/dist/server/auth/types.js +0 -17
  197. package/dist/server/auth/user.d.ts +0 -54
  198. package/dist/server/auth/user.d.ts.map +0 -1
  199. package/dist/server/auth/user.js +0 -237
  200. package/dist/server/database/inject.d.ts +0 -11
  201. package/dist/server/database/inject.d.ts.map +0 -1
  202. package/dist/server/database/inject.js +0 -33
  203. package/dist/server/database/schema.d.ts +0 -2953
  204. package/dist/server/database/schema.js +0 -195
  205. package/dist/server/database/types.d.ts +0 -12
  206. package/dist/server/database/types.d.ts.map +0 -1
  207. package/dist/server/database/types.js +0 -2
  208. package/dist/server/emails/index.d.ts +0 -23
  209. package/dist/server/emails/index.d.ts.map +0 -1
  210. package/dist/server/emails/index.js +0 -73
  211. package/dist/server.d.ts +0 -25
  212. package/dist/server.d.ts.map +0 -1
  213. package/dist/server.js +0 -48
@@ -1,20 +1,23 @@
1
+ //#region src/server/auth/password.d.ts
1
2
  /**
2
3
  * Hashes the password using bcrypt.
3
4
  * @param password Password to be hashed.
4
5
  * @returns Returns the hashed password.
5
6
  */
6
- export declare function hashPassword(password: string): Promise<string>;
7
+ declare function hashPassword(password: string): Promise<string>;
7
8
  /**
8
9
  * Verifies the password hash.
9
10
  * @param hash bcrypt hash.
10
11
  * @param password Password for comparison.
11
12
  * @returns Returns true if the password is correct, false otherwise.
12
13
  */
13
- export declare function verifyPasswordHash(hash: string, password: string): Promise<boolean>;
14
+ declare function verifyPasswordHash(hash: string, password: string): Promise<boolean>;
14
15
  /**
15
16
  * Validates password strength.
16
17
  * @param password Password to validate.
17
18
  * @returns Returns true if the password meets complexity requirements.
18
19
  */
19
- export declare function verifyPasswordStrength(password: string): Promise<boolean>;
20
- //# sourceMappingURL=password.d.ts.map
20
+ declare function verifyPasswordStrength(password: string): Promise<boolean>;
21
+ //#endregion
22
+ export { hashPassword, verifyPasswordHash, verifyPasswordStrength };
23
+ //# sourceMappingURL=password.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password.d.mts","names":[],"sources":["../../../src/server/auth/password.ts"],"mappings":";;AASA;;;;iBAAsB,YAAA,CAAa,QAAA,WAAmB,OAAA;AAYtD;;;;;;AAAA,iBAAsB,kBAAA,CACpB,IAAA,UACA,QAAA,WACC,OAAA;;;AAUH;;;iBAAsB,sBAAA,CACpB,QAAA,WACC,OAAA"}
@@ -0,0 +1,2 @@
1
+ "use server";import e from"bcryptjs";async function t(t){return await e.hash(t,10)}async function n(t,n){return await e.compare(n,t)}async function r(e){return e.length>=8&&e.length<=255}export{t as hashPassword,n as verifyPasswordHash,r as verifyPasswordStrength};
2
+ //# sourceMappingURL=password.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"password.mjs","names":[],"sources":["../../../src/server/auth/password.ts"],"sourcesContent":["\"use server\";\n\nimport bcrypt from \"bcryptjs\";\n\n/**\n * Hashes the password using bcrypt.\n * @param password Password to be hashed.\n * @returns Returns the hashed password.\n */\nexport async function hashPassword(password: string): Promise<string> {\n const saltRounds = 10;\n return await bcrypt.hash(password, saltRounds);\n // return password;\n}\n\n/**\n * Verifies the password hash.\n * @param hash bcrypt hash.\n * @param password Password for comparison.\n * @returns Returns true if the password is correct, false otherwise.\n */\nexport async function verifyPasswordHash(\n hash: string,\n password: string,\n): Promise<boolean> {\n return await bcrypt.compare(password, hash);\n // return password === hash;\n}\n\n/**\n * Validates password strength.\n * @param password Password to validate.\n * @returns Returns true if the password meets complexity requirements.\n */\nexport async function verifyPasswordStrength(\n password: string,\n): Promise<boolean> {\n return password.length >= 8 && password.length <= 255;\n}\n"],"mappings":"qCASA,eAAsB,EAAa,EAAmC,CAEpE,OAAO,MAAM,EAAO,KAAK,EADN,GAC2B,CAUhD,eAAsB,EACpB,EACA,EACkB,CAClB,OAAO,MAAM,EAAO,QAAQ,EAAU,EAAK,CAS7C,eAAsB,EACpB,EACkB,CAClB,OAAO,EAAS,QAAU,GAAK,EAAS,QAAU"}
@@ -0,0 +1,58 @@
1
+ import { User } from "../../core/auth/types.mjs";
2
+
3
+ //#region src/server/auth/user.d.ts
4
+ /**
5
+ * Validates the username input.
6
+ */
7
+ declare function verifyUsernameInput(username: string): Promise<boolean>;
8
+ /**
9
+ * Creates a new user with an initial recovery code and default 'user' role.
10
+ */
11
+ declare function createUser(email: string, username: string, password: string): Promise<User>;
12
+ /**
13
+ * Creates a new user from an OAuth provider.
14
+ */
15
+ declare function createOAuthUser(email: string, name: string, image?: string): Promise<User>;
16
+ /**
17
+ * Returns a user by ID.
18
+ */
19
+ declare function getUserById(userId: string): Promise<User | null>;
20
+ /**
21
+ * Decrypts and returns the user's recovery code.
22
+ */
23
+ declare function getUserRecoverCode(userId: string): Promise<string>;
24
+ /**
25
+ * Generates and sets a new recovery code for the user.
26
+ */
27
+ declare function resetUserRecoveryCode(userId: string): Promise<string>;
28
+ /**
29
+ * Updates the user's password.
30
+ */
31
+ declare function updateUserPassword(userId: string, password: string): Promise<void>;
32
+ /**
33
+ * Updates the user's name.
34
+ */
35
+ declare function updateUserName(userId: string, name: string): Promise<void>;
36
+ /**
37
+ * Updates the user's image.
38
+ */
39
+ declare function updateUserAwatar(userId: string, image: string): Promise<void>;
40
+ /**
41
+ * Updates the user's email and marks it as verified.
42
+ */
43
+ declare function updateUserEmailAndSetEmailAsVerified(userId: string, email: string): Promise<void>;
44
+ /**
45
+ * Sets the user as email verified if the provided email matches.
46
+ */
47
+ declare function setUserAsEmailVerifiedIfEmailMatches(userId: string, email: string): Promise<boolean>;
48
+ /**
49
+ * Returns the user's password hash.
50
+ */
51
+ declare function getUserPasswordHash(userId: string): Promise<string | null>;
52
+ /**
53
+ * Returns a user by email.
54
+ */
55
+ declare function getUserFromEmail(email: string): Promise<User | null>;
56
+ //#endregion
57
+ export { createOAuthUser, createUser, getUserById, getUserFromEmail, getUserPasswordHash, getUserRecoverCode, resetUserRecoveryCode, setUserAsEmailVerifiedIfEmailMatches, updateUserAwatar, updateUserEmailAndSetEmailAsVerified, updateUserName, updateUserPassword, verifyUsernameInput };
58
+ //# sourceMappingURL=user.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.d.mts","names":[],"sources":["../../../src/server/auth/user.ts"],"mappings":";;;;;AAiBA;iBAAsB,mBAAA,CAAoB,QAAA,WAAmB,OAAA;;;;iBASvC,UAAA,CACpB,KAAA,UACA,QAAA,UACA,QAAA,WACC,OAAA,CAAQ,IAAA;;;;iBA+CW,eAAA,CACpB,KAAA,UACA,IAAA,UACA,KAAA,YACC,OAAA,CAAQ,IAAA;;;;iBAyCW,WAAA,CAAY,MAAA,WAAiB,OAAA,CAAQ,IAAA;;;AA7C3D;iBA2DsB,kBAAA,CAAmB,MAAA,WAAiB,OAAA;;;;iBAkBpC,qBAAA,CAAsB,MAAA,WAAiB,OAAA;;;;iBAuBvC,kBAAA,CACpB,MAAA,UACA,QAAA,WACC,OAAA;;AA1DH;;iBAwEsB,cAAA,CACpB,MAAA,UACA,IAAA,WACC,OAAA;;;;iBAWmB,gBAAA,CACpB,MAAA,UACA,KAAA,WACC,OAAA;;;AA3EH;iBAuFsB,oCAAA,CACpB,MAAA,UACA,KAAA,WACC,OAAA;;;;iBAamB,oCAAA,CACpB,MAAA,UACA,KAAA,WACC,OAAA;;;;iBAemB,mBAAA,CACpB,MAAA,WACC,OAAA;AAlFH;;;AAAA,iBAoGsB,gBAAA,CAAiB,KAAA,WAAgB,OAAA,CAAQ,IAAA"}
@@ -0,0 +1,2 @@
1
+ "use server";import{db as e}from"../database/inject.mjs";import{rolesTable as t,userTable as n,usersToRolesTable as r}from"../database/schema.mjs";import{hashPassword as i}from"./password.mjs";import{generateRandomRecoveryCode as a}from"../../core/auth/utils/encode.mjs";import{decryptToString as o,encryptString as s}from"../../core/auth/utils/encryption.mjs";import{sendRecoveryCode as c}from"../emails/index.mjs";import{and as l,eq as u}from"drizzle-orm";async function d(e){return e.length>3&&e.length<32&&e.trim()===e}async function f(o,l,d){let f=await i(d),p=a(),m=s(p);return await e.transaction(async e=>{let[i]=await e.insert(n).values({email:o,name:l,password:f,recovery_code:Buffer.from(m)}).returning();if(!i)throw Error(`Failed to create user`);let[a]=await e.select().from(t).where(u(t.name,`user`));return a||([a]=await e.insert(t).values({name:`user`,description:`Default user role`}).returning()),await e.insert(r).values({userId:i.id,roleId:a.id}),await c(i.email,p),i})}async function p(i,o,c){let l=s(a());return await e.transaction(async e=>{let[a]=await e.insert(n).values({email:i,name:o,image:c,emailVerifiedAt:new Date,recovery_code:Buffer.from(l)}).returning(),[s]=await e.select().from(t).where(u(t.name,`user`));return s||([s]=await e.insert(t).values({name:`user`,description:`Default user role`}).returning()),await e.insert(r).values({userId:a.id,roleId:s.id}),a})}async function m(t){let[r]=await e.select().from(n).where(u(n.id,t));if(!r)return null;let{password:i,recovery_code:a,...o}=r;return o}async function h(t){let[r]=await e.select({recovery_code:n.recovery_code}).from(n).where(u(n.id,t));if(!r||!r.recovery_code)throw Error(`Recovery code not found for user`);return o(r.recovery_code)}async function g(t){let r=a(),i=s(r),[o]=await e.update(n).set({recovery_code:Buffer.from(i)}).where(u(n.id,t)).returning();if(!o)throw Error(`User not found`);return await c(o.email,r),r}async function _(t,r){let a=await i(r);await e.update(n).set({password:a}).where(u(n.id,t))}async function v(t,r){await e.update(n).set({name:r}).where(u(n.id,t))}async function y(t,r){await e.update(n).set({image:r}).where(u(n.id,t))}async function b(t,r){await e.update(n).set({email:r,emailVerifiedAt:new Date}).where(u(n.id,t))}async function x(t,r){return(await e.update(n).set({emailVerifiedAt:new Date}).where(l(u(n.id,t),u(n.email,r))).returning({id:n.id})).length>0}async function S(t){let[r]=await e.select({password:n.password}).from(n).where(u(n.id,t));if(!r)throw Error(`User not found`);return r.password}async function C(t){let[r]=await e.select().from(n).where(u(n.email,t));if(!r)return null;let{password:i,recovery_code:a,...o}=r;return o}export{p as createOAuthUser,f as createUser,m as getUserById,C as getUserFromEmail,S as getUserPasswordHash,h as getUserRecoverCode,g as resetUserRecoveryCode,x as setUserAsEmailVerifiedIfEmailMatches,y as updateUserAwatar,b as updateUserEmailAndSetEmailAsVerified,v as updateUserName,_ as updateUserPassword,d as verifyUsernameInput};
2
+ //# sourceMappingURL=user.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.mjs","names":[],"sources":["../../../src/server/auth/user.ts"],"sourcesContent":["\"use server\";\n\nimport { and, eq } from \"drizzle-orm\";\nimport type { User } from \"../../core/auth/types\";\nimport { generateRandomRecoveryCode } from \"../../core/auth/utils/encode\";\nimport {\n decryptToString,\n encryptString,\n} from \"../../core/auth/utils/encryption\";\nimport { db } from \"../database/inject\";\nimport { rolesTable, usersToRolesTable, userTable } from \"../database/schema\";\nimport { sendRecoveryCode } from \"../emails/index\";\nimport { hashPassword } from \"./password\";\n\n/**\n * Validates the username input.\n */\nexport async function verifyUsernameInput(username: string): Promise<boolean> {\n return (\n username.length > 3 && username.length < 32 && username.trim() === username\n );\n}\n\n/**\n * Creates a new user with an initial recovery code and default 'user' role.\n */\nexport async function createUser(\n email: string,\n username: string,\n password: string,\n): Promise<User> {\n const passwordHash = await hashPassword(password);\n const recoveryCode = generateRandomRecoveryCode();\n const encryptedRecoveryCode = encryptString(recoveryCode);\n\n return await db.transaction(async (tx) => {\n const [row] = await tx\n .insert(userTable)\n .values({\n email: email,\n name: username,\n password: passwordHash,\n recovery_code: Buffer.from(encryptedRecoveryCode),\n })\n .returning();\n\n if (!row) {\n throw new Error(\"Failed to create user\");\n }\n\n // Assign default 'user' role\n let [role] = await tx\n .select()\n .from(rolesTable)\n .where(eq(rolesTable.name, \"user\"));\n\n if (!role) {\n [role] = await tx\n .insert(rolesTable)\n .values({ name: \"user\", description: \"Default user role\" })\n .returning();\n }\n\n await tx.insert(usersToRolesTable).values({\n userId: row.id,\n roleId: role.id,\n });\n\n await sendRecoveryCode(row.email, recoveryCode);\n\n return row;\n });\n}\n\n/**\n * Creates a new user from an OAuth provider.\n */\nexport async function createOAuthUser(\n email: string,\n name: string,\n image?: string,\n): Promise<User> {\n const recoveryCode = generateRandomRecoveryCode();\n const encryptedRecoveryCode = encryptString(recoveryCode);\n\n return await db.transaction(async (tx) => {\n const [row] = await tx\n .insert(userTable)\n .values({\n email: email,\n name: name,\n image: image,\n emailVerifiedAt: new Date(),\n recovery_code: Buffer.from(encryptedRecoveryCode),\n })\n .returning();\n\n // Assign default 'user' role\n let [role] = await tx\n .select()\n .from(rolesTable)\n .where(eq(rolesTable.name, \"user\"));\n\n if (!role) {\n [role] = await tx\n .insert(rolesTable)\n .values({ name: \"user\", description: \"Default user role\" })\n .returning();\n }\n\n await tx.insert(usersToRolesTable).values({\n userId: row.id,\n roleId: role.id,\n });\n\n return row;\n });\n}\n\n/**\n * Returns a user by ID.\n */\nexport async function getUserById(userId: string): Promise<User | null> {\n const [user] = await db\n .select()\n .from(userTable)\n .where(eq(userTable.id, userId));\n\n if (!user) return null;\n const { password, recovery_code, ...safeUser } = user;\n return safeUser as User;\n}\n\n/**\n * Decrypts and returns the user's recovery code.\n */\nexport async function getUserRecoverCode(userId: string): Promise<string> {\n const [user] = await db\n .select({\n recovery_code: userTable.recovery_code,\n })\n .from(userTable)\n .where(eq(userTable.id, userId));\n\n if (!user || !user.recovery_code) {\n throw new Error(\"Recovery code not found for user\");\n }\n\n return decryptToString(user.recovery_code);\n}\n\n/**\n * Generates and sets a new recovery code for the user.\n */\nexport async function resetUserRecoveryCode(userId: string): Promise<string> {\n const recoveryCode = generateRandomRecoveryCode();\n const encrypted = encryptString(recoveryCode);\n const [currentUser] = await db\n .update(userTable)\n .set({\n recovery_code: Buffer.from(encrypted),\n })\n .where(eq(userTable.id, userId))\n .returning();\n\n if (!currentUser) {\n throw new Error(\"User not found\");\n }\n\n await sendRecoveryCode(currentUser.email, recoveryCode);\n\n return recoveryCode;\n}\n\n/**\n * Updates the user's password.\n */\nexport async function updateUserPassword(\n userId: string,\n password: string,\n): Promise<void> {\n const passwordHash = await hashPassword(password);\n\n await db\n .update(userTable)\n .set({\n password: passwordHash,\n })\n .where(eq(userTable.id, userId));\n}\n\n/**\n * Updates the user's name.\n */\nexport async function updateUserName(\n userId: string,\n name: string,\n): Promise<void> {\n await db\n .update(userTable)\n .set({\n name: name,\n })\n .where(eq(userTable.id, userId));\n}\n/**\n * Updates the user's image.\n */\nexport async function updateUserAwatar(\n userId: string,\n image: string,\n): Promise<void> {\n await db\n .update(userTable)\n .set({\n image,\n })\n .where(eq(userTable.id, userId));\n}\n\n/**\n * Updates the user's email and marks it as verified.\n */\nexport async function updateUserEmailAndSetEmailAsVerified(\n userId: string,\n email: string,\n): Promise<void> {\n await db\n .update(userTable)\n .set({\n email: email,\n emailVerifiedAt: new Date(),\n })\n .where(eq(userTable.id, userId));\n}\n\n/**\n * Sets the user as email verified if the provided email matches.\n */\nexport async function setUserAsEmailVerifiedIfEmailMatches(\n userId: string,\n email: string,\n): Promise<boolean> {\n const result = await db\n .update(userTable)\n .set({\n emailVerifiedAt: new Date(),\n })\n .where(and(eq(userTable.id, userId), eq(userTable.email, email)))\n .returning({ id: userTable.id });\n\n return result.length > 0;\n}\n\n/**\n * Returns the user's password hash.\n */\nexport async function getUserPasswordHash(\n userId: string,\n): Promise<string | null> {\n const [user] = await db\n .select({\n password: userTable.password,\n })\n .from(userTable)\n .where(eq(userTable.id, userId));\n\n if (!user) {\n throw new Error(\"User not found\");\n }\n\n return user.password;\n}\n\n/**\n * Returns a user by email.\n */\nexport async function getUserFromEmail(email: string): Promise<User | null> {\n const [user] = await db\n .select()\n .from(userTable)\n .where(eq(userTable.email, email));\n\n if (!user) return null;\n const { password, recovery_code, ...safeUser } = user;\n return safeUser as User;\n}\n"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { schema_d_exports } from "./schema.mjs";
2
+ import { NodePgDatabase } from "drizzle-orm/node-postgres";
3
+
4
+ //#region src/server/database/inject.d.ts
5
+ type KryoDatabase = NodePgDatabase<typeof schema_d_exports>;
6
+ declare function injectDb(db: KryoDatabase): void;
7
+ /**
8
+ * Shared 'db' proxy.
9
+ * Resolves to globalThis.__KRYO_DB__ on every property access.
10
+ * Safe to import statically at top-level.
11
+ */
12
+ declare const db: KryoDatabase;
13
+ //#endregion
14
+ export { KryoDatabase, db, injectDb };
15
+ //# sourceMappingURL=inject.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject.d.mts","names":[],"sources":["../../../src/server/database/inject.ts"],"mappings":";;;;KAGY,YAAA,GAAe,cAAA,QAAsB,gBAAA;AAAA,iBAKjC,QAAA,CAAS,EAAA,EAAI,YAAA;AAL7B;;;;;AAAA,cAgBa,EAAA,EAAE,YAAA"}
@@ -0,0 +1,2 @@
1
+ const e=globalThis;function t(t){e.__KRYO_DB__||=(console.log(`[Kryo:Core] >>> DATABASE INJECTED <<<`),t)}const n=new Proxy({},{get(t,n){if(n===`then`)return;if(typeof n==`symbol`||n===`inspect`||n===`toString`)return e.__KRYO_DB__?.[n];let r=e.__KRYO_DB__;if(!r)throw Error(`[Kryo:Core] Database access error: tried to use "db.${String(n)}" but database is not injected yet. Ensure you call "ensureSystemInitialized()" before using the database.`);return r[n]}});export{n as db,t as injectDb};
2
+ //# sourceMappingURL=inject.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject.mjs","names":[],"sources":["../../../src/server/database/inject.ts"],"sourcesContent":["import type { NodePgDatabase } from \"drizzle-orm/node-postgres\";\nimport type * as schema from \"./schema\";\n\nexport type KryoDatabase = NodePgDatabase<typeof schema>;\n\n// Use globalThis to persist the DB across multiple bundles/instances\nconst globalForDb = globalThis as any;\n\nexport function injectDb(db: KryoDatabase) {\n if (globalForDb.__KRYO_DB__) return;\n console.log(\"[Kryo:Core] >>> DATABASE INJECTED <<<\");\n globalForDb.__KRYO_DB__ = db;\n}\n\n/**\n * Shared 'db' proxy.\n * Resolves to globalThis.__KRYO_DB__ on every property access.\n * Safe to import statically at top-level.\n */\nexport const db = new Proxy({} as KryoDatabase, {\n get(_, prop) {\n if (prop === \"then\") return undefined;\n\n // Internal Drizzle/Node/Debug checks\n if (typeof prop === \"symbol\" || prop === \"inspect\" || prop === \"toString\") {\n return (globalForDb.__KRYO_DB__ as any)?.[prop];\n }\n\n const database = globalForDb.__KRYO_DB__;\n\n if (!database) {\n throw new Error(\n `[Kryo:Core] Database access error: tried to use \"db.${String(prop)}\" but database is not injected yet. Ensure you call \"ensureSystemInitialized()\" before using the database.`,\n );\n }\n\n return (database as any)[prop];\n },\n});\n"],"mappings":"AAMA,MAAM,EAAc,WAEpB,SAAgB,EAAS,EAAkB,CACrC,AAEJ,EAAY,eADZ,QAAQ,IAAI,wCAAwC,CAC1B,GAQ5B,MAAa,EAAK,IAAI,MAAM,EAAE,CAAkB,CAC9C,IAAI,EAAG,EAAM,CACX,GAAI,IAAS,OAAQ,OAGrB,GAAI,OAAO,GAAS,UAAY,IAAS,WAAa,IAAS,WAC7D,OAAQ,EAAY,cAAsB,GAG5C,IAAM,EAAW,EAAY,YAE7B,GAAI,CAAC,EACH,MAAU,MACR,uDAAuD,OAAO,EAAK,CAAC,4GACrE,CAGH,OAAQ,EAAiB,IAE5B,CAAC"}