@hammadj/better-auth-core 1.5.0-beta.9

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 (353) hide show
  1. package/.turbo/turbo-build.log +266 -0
  2. package/.turbo/turbo-test.log +2 -0
  3. package/LICENSE.md +20 -0
  4. package/dist/api/index.d.mts +181 -0
  5. package/dist/api/index.mjs +34 -0
  6. package/dist/api/index.mjs.map +1 -0
  7. package/dist/async_hooks/index.d.mts +7 -0
  8. package/dist/async_hooks/index.mjs +22 -0
  9. package/dist/async_hooks/index.mjs.map +1 -0
  10. package/dist/async_hooks/pure.index.d.mts +7 -0
  11. package/dist/async_hooks/pure.index.mjs +35 -0
  12. package/dist/async_hooks/pure.index.mjs.map +1 -0
  13. package/dist/context/endpoint-context.d.mts +19 -0
  14. package/dist/context/endpoint-context.mjs +32 -0
  15. package/dist/context/endpoint-context.mjs.map +1 -0
  16. package/dist/context/global.d.mts +7 -0
  17. package/dist/context/global.mjs +38 -0
  18. package/dist/context/global.mjs.map +1 -0
  19. package/dist/context/index.d.mts +5 -0
  20. package/dist/context/index.mjs +6 -0
  21. package/dist/context/request-state.d.mts +26 -0
  22. package/dist/context/request-state.mjs +50 -0
  23. package/dist/context/request-state.mjs.map +1 -0
  24. package/dist/context/transaction.d.mts +25 -0
  25. package/dist/context/transaction.mjs +96 -0
  26. package/dist/context/transaction.mjs.map +1 -0
  27. package/dist/db/adapter/factory.d.mts +28 -0
  28. package/dist/db/adapter/factory.mjs +716 -0
  29. package/dist/db/adapter/factory.mjs.map +1 -0
  30. package/dist/db/adapter/get-default-field-name.d.mts +19 -0
  31. package/dist/db/adapter/get-default-field-name.mjs +39 -0
  32. package/dist/db/adapter/get-default-field-name.mjs.map +1 -0
  33. package/dist/db/adapter/get-default-model-name.d.mts +13 -0
  34. package/dist/db/adapter/get-default-model-name.mjs +33 -0
  35. package/dist/db/adapter/get-default-model-name.mjs.map +1 -0
  36. package/dist/db/adapter/get-field-attributes.d.mts +30 -0
  37. package/dist/db/adapter/get-field-attributes.mjs +40 -0
  38. package/dist/db/adapter/get-field-attributes.mjs.map +1 -0
  39. package/dist/db/adapter/get-field-name.d.mts +19 -0
  40. package/dist/db/adapter/get-field-name.mjs +34 -0
  41. package/dist/db/adapter/get-field-name.mjs.map +1 -0
  42. package/dist/db/adapter/get-id-field.d.mts +40 -0
  43. package/dist/db/adapter/get-id-field.mjs +68 -0
  44. package/dist/db/adapter/get-id-field.mjs.map +1 -0
  45. package/dist/db/adapter/get-model-name.d.mts +13 -0
  46. package/dist/db/adapter/get-model-name.mjs +24 -0
  47. package/dist/db/adapter/get-model-name.mjs.map +1 -0
  48. package/dist/db/adapter/index.d.mts +515 -0
  49. package/dist/db/adapter/index.mjs +10 -0
  50. package/dist/db/adapter/types.d.mts +140 -0
  51. package/dist/db/adapter/utils.d.mts +8 -0
  52. package/dist/db/adapter/utils.mjs +39 -0
  53. package/dist/db/adapter/utils.mjs.map +1 -0
  54. package/dist/db/get-tables.d.mts +9 -0
  55. package/dist/db/get-tables.mjs +267 -0
  56. package/dist/db/get-tables.mjs.map +1 -0
  57. package/dist/db/index.d.mts +10 -0
  58. package/dist/db/index.mjs +9 -0
  59. package/dist/db/plugin.d.mts +13 -0
  60. package/dist/db/schema/account.d.mts +27 -0
  61. package/dist/db/schema/account.mjs +20 -0
  62. package/dist/db/schema/account.mjs.map +1 -0
  63. package/dist/db/schema/rate-limit.d.mts +15 -0
  64. package/dist/db/schema/rate-limit.mjs +12 -0
  65. package/dist/db/schema/rate-limit.mjs.map +1 -0
  66. package/dist/db/schema/session.d.mts +22 -0
  67. package/dist/db/schema/session.mjs +15 -0
  68. package/dist/db/schema/session.mjs.map +1 -0
  69. package/dist/db/schema/shared.d.mts +11 -0
  70. package/dist/db/schema/shared.mjs +12 -0
  71. package/dist/db/schema/shared.mjs.map +1 -0
  72. package/dist/db/schema/user.d.mts +21 -0
  73. package/dist/db/schema/user.mjs +14 -0
  74. package/dist/db/schema/user.mjs.map +1 -0
  75. package/dist/db/schema/verification.d.mts +20 -0
  76. package/dist/db/schema/verification.mjs +13 -0
  77. package/dist/db/schema/verification.mjs.map +1 -0
  78. package/dist/db/type.d.mts +147 -0
  79. package/dist/env/color-depth.d.mts +5 -0
  80. package/dist/env/color-depth.mjs +89 -0
  81. package/dist/env/color-depth.mjs.map +1 -0
  82. package/dist/env/env-impl.d.mts +33 -0
  83. package/dist/env/env-impl.mjs +83 -0
  84. package/dist/env/env-impl.mjs.map +1 -0
  85. package/dist/env/index.d.mts +4 -0
  86. package/dist/env/index.mjs +5 -0
  87. package/dist/env/logger.d.mts +49 -0
  88. package/dist/env/logger.mjs +82 -0
  89. package/dist/env/logger.mjs.map +1 -0
  90. package/dist/error/codes.d.mts +199 -0
  91. package/dist/error/codes.mjs +57 -0
  92. package/dist/error/codes.mjs.map +1 -0
  93. package/dist/error/index.d.mts +20 -0
  94. package/dist/error/index.mjs +30 -0
  95. package/dist/error/index.mjs.map +1 -0
  96. package/dist/index.d.mts +8 -0
  97. package/dist/index.mjs +1 -0
  98. package/dist/oauth2/client-credentials-token.d.mts +37 -0
  99. package/dist/oauth2/client-credentials-token.mjs +55 -0
  100. package/dist/oauth2/client-credentials-token.mjs.map +1 -0
  101. package/dist/oauth2/create-authorization-url.d.mts +46 -0
  102. package/dist/oauth2/create-authorization-url.mjs +43 -0
  103. package/dist/oauth2/create-authorization-url.mjs.map +1 -0
  104. package/dist/oauth2/index.d.mts +8 -0
  105. package/dist/oauth2/index.mjs +8 -0
  106. package/dist/oauth2/oauth-provider.d.mts +195 -0
  107. package/dist/oauth2/refresh-access-token.d.mts +36 -0
  108. package/dist/oauth2/refresh-access-token.mjs +59 -0
  109. package/dist/oauth2/refresh-access-token.mjs.map +1 -0
  110. package/dist/oauth2/utils.d.mts +8 -0
  111. package/dist/oauth2/utils.mjs +28 -0
  112. package/dist/oauth2/utils.mjs.map +1 -0
  113. package/dist/oauth2/validate-authorization-code.d.mts +56 -0
  114. package/dist/oauth2/validate-authorization-code.mjs +72 -0
  115. package/dist/oauth2/validate-authorization-code.mjs.map +1 -0
  116. package/dist/oauth2/verify.d.mts +43 -0
  117. package/dist/oauth2/verify.mjs +96 -0
  118. package/dist/oauth2/verify.mjs.map +1 -0
  119. package/dist/social-providers/apple.d.mts +120 -0
  120. package/dist/social-providers/apple.mjs +105 -0
  121. package/dist/social-providers/apple.mjs.map +1 -0
  122. package/dist/social-providers/atlassian.d.mts +73 -0
  123. package/dist/social-providers/atlassian.mjs +84 -0
  124. package/dist/social-providers/atlassian.mjs.map +1 -0
  125. package/dist/social-providers/cognito.d.mts +88 -0
  126. package/dist/social-providers/cognito.mjs +166 -0
  127. package/dist/social-providers/cognito.mjs.map +1 -0
  128. package/dist/social-providers/discord.d.mts +127 -0
  129. package/dist/social-providers/discord.mjs +65 -0
  130. package/dist/social-providers/discord.mjs.map +1 -0
  131. package/dist/social-providers/dropbox.d.mts +72 -0
  132. package/dist/social-providers/dropbox.mjs +76 -0
  133. package/dist/social-providers/dropbox.mjs.map +1 -0
  134. package/dist/social-providers/facebook.d.mts +82 -0
  135. package/dist/social-providers/facebook.mjs +121 -0
  136. package/dist/social-providers/facebook.mjs.map +1 -0
  137. package/dist/social-providers/figma.d.mts +64 -0
  138. package/dist/social-providers/figma.mjs +87 -0
  139. package/dist/social-providers/figma.mjs.map +1 -0
  140. package/dist/social-providers/github.d.mts +105 -0
  141. package/dist/social-providers/github.mjs +97 -0
  142. package/dist/social-providers/github.mjs.map +1 -0
  143. package/dist/social-providers/gitlab.d.mts +126 -0
  144. package/dist/social-providers/gitlab.mjs +83 -0
  145. package/dist/social-providers/gitlab.mjs.map +1 -0
  146. package/dist/social-providers/google.d.mts +100 -0
  147. package/dist/social-providers/google.mjs +109 -0
  148. package/dist/social-providers/google.mjs.map +1 -0
  149. package/dist/social-providers/huggingface.d.mts +86 -0
  150. package/dist/social-providers/huggingface.mjs +76 -0
  151. package/dist/social-providers/huggingface.mjs.map +1 -0
  152. package/dist/social-providers/index.d.mts +1725 -0
  153. package/dist/social-providers/index.mjs +77 -0
  154. package/dist/social-providers/index.mjs.map +1 -0
  155. package/dist/social-providers/kakao.d.mts +164 -0
  156. package/dist/social-providers/kakao.mjs +73 -0
  157. package/dist/social-providers/kakao.mjs.map +1 -0
  158. package/dist/social-providers/kick.d.mts +76 -0
  159. package/dist/social-providers/kick.mjs +72 -0
  160. package/dist/social-providers/kick.mjs.map +1 -0
  161. package/dist/social-providers/line.d.mts +108 -0
  162. package/dist/social-providers/line.mjs +114 -0
  163. package/dist/social-providers/line.mjs.map +1 -0
  164. package/dist/social-providers/linear.d.mts +71 -0
  165. package/dist/social-providers/linear.mjs +89 -0
  166. package/dist/social-providers/linear.mjs.map +1 -0
  167. package/dist/social-providers/linkedin.d.mts +70 -0
  168. package/dist/social-providers/linkedin.mjs +77 -0
  169. package/dist/social-providers/linkedin.mjs.map +1 -0
  170. package/dist/social-providers/microsoft-entra-id.d.mts +175 -0
  171. package/dist/social-providers/microsoft-entra-id.mjs +107 -0
  172. package/dist/social-providers/microsoft-entra-id.mjs.map +1 -0
  173. package/dist/social-providers/naver.d.mts +95 -0
  174. package/dist/social-providers/naver.mjs +68 -0
  175. package/dist/social-providers/naver.mjs.map +1 -0
  176. package/dist/social-providers/notion.d.mts +67 -0
  177. package/dist/social-providers/notion.mjs +76 -0
  178. package/dist/social-providers/notion.mjs.map +1 -0
  179. package/dist/social-providers/paybin.d.mts +74 -0
  180. package/dist/social-providers/paybin.mjs +86 -0
  181. package/dist/social-providers/paybin.mjs.map +1 -0
  182. package/dist/social-providers/paypal.d.mts +132 -0
  183. package/dist/social-providers/paypal.mjs +145 -0
  184. package/dist/social-providers/paypal.mjs.map +1 -0
  185. package/dist/social-providers/polar.d.mts +77 -0
  186. package/dist/social-providers/polar.mjs +74 -0
  187. package/dist/social-providers/polar.mjs.map +1 -0
  188. package/dist/social-providers/reddit.d.mts +65 -0
  189. package/dist/social-providers/reddit.mjs +84 -0
  190. package/dist/social-providers/reddit.mjs.map +1 -0
  191. package/dist/social-providers/roblox.d.mts +73 -0
  192. package/dist/social-providers/roblox.mjs +60 -0
  193. package/dist/social-providers/roblox.mjs.map +1 -0
  194. package/dist/social-providers/salesforce.d.mts +82 -0
  195. package/dist/social-providers/salesforce.mjs +92 -0
  196. package/dist/social-providers/salesforce.mjs.map +1 -0
  197. package/dist/social-providers/slack.d.mts +86 -0
  198. package/dist/social-providers/slack.mjs +69 -0
  199. package/dist/social-providers/slack.mjs.map +1 -0
  200. package/dist/social-providers/spotify.d.mts +66 -0
  201. package/dist/social-providers/spotify.mjs +72 -0
  202. package/dist/social-providers/spotify.mjs.map +1 -0
  203. package/dist/social-providers/tiktok.d.mts +171 -0
  204. package/dist/social-providers/tiktok.mjs +63 -0
  205. package/dist/social-providers/tiktok.mjs.map +1 -0
  206. package/dist/social-providers/twitch.d.mts +82 -0
  207. package/dist/social-providers/twitch.mjs +79 -0
  208. package/dist/social-providers/twitch.mjs.map +1 -0
  209. package/dist/social-providers/twitter.d.mts +129 -0
  210. package/dist/social-providers/twitter.mjs +88 -0
  211. package/dist/social-providers/twitter.mjs.map +1 -0
  212. package/dist/social-providers/vercel.d.mts +65 -0
  213. package/dist/social-providers/vercel.mjs +62 -0
  214. package/dist/social-providers/vercel.mjs.map +1 -0
  215. package/dist/social-providers/vk.d.mts +73 -0
  216. package/dist/social-providers/vk.mjs +84 -0
  217. package/dist/social-providers/vk.mjs.map +1 -0
  218. package/dist/social-providers/zoom.d.mts +173 -0
  219. package/dist/social-providers/zoom.mjs +73 -0
  220. package/dist/social-providers/zoom.mjs.map +1 -0
  221. package/dist/types/context.d.mts +267 -0
  222. package/dist/types/cookie.d.mts +16 -0
  223. package/dist/types/helper.d.mts +10 -0
  224. package/dist/types/index.d.mts +8 -0
  225. package/dist/types/init-options.d.mts +1314 -0
  226. package/dist/types/plugin-client.d.mts +112 -0
  227. package/dist/types/plugin.d.mts +125 -0
  228. package/dist/utils/db.d.mts +12 -0
  229. package/dist/utils/db.mjs +17 -0
  230. package/dist/utils/db.mjs.map +1 -0
  231. package/dist/utils/deprecate.d.mts +10 -0
  232. package/dist/utils/deprecate.mjs +18 -0
  233. package/dist/utils/deprecate.mjs.map +1 -0
  234. package/dist/utils/error-codes.d.mts +13 -0
  235. package/dist/utils/error-codes.mjs +12 -0
  236. package/dist/utils/error-codes.mjs.map +1 -0
  237. package/dist/utils/id.d.mts +5 -0
  238. package/dist/utils/id.mjs +10 -0
  239. package/dist/utils/id.mjs.map +1 -0
  240. package/dist/utils/ip.d.mts +55 -0
  241. package/dist/utils/ip.mjs +119 -0
  242. package/dist/utils/ip.mjs.map +1 -0
  243. package/dist/utils/json.d.mts +5 -0
  244. package/dist/utils/json.mjs +26 -0
  245. package/dist/utils/json.mjs.map +1 -0
  246. package/dist/utils/string.d.mts +5 -0
  247. package/dist/utils/string.mjs +8 -0
  248. package/dist/utils/string.mjs.map +1 -0
  249. package/dist/utils/url.d.mts +21 -0
  250. package/dist/utils/url.mjs +33 -0
  251. package/dist/utils/url.mjs.map +1 -0
  252. package/package.json +147 -0
  253. package/src/api/index.ts +106 -0
  254. package/src/async_hooks/index.ts +40 -0
  255. package/src/async_hooks/pure.index.ts +46 -0
  256. package/src/context/endpoint-context.ts +50 -0
  257. package/src/context/global.ts +57 -0
  258. package/src/context/index.ts +23 -0
  259. package/src/context/request-state.test.ts +94 -0
  260. package/src/context/request-state.ts +91 -0
  261. package/src/context/transaction.ts +136 -0
  262. package/src/db/adapter/factory.ts +1362 -0
  263. package/src/db/adapter/get-default-field-name.ts +59 -0
  264. package/src/db/adapter/get-default-model-name.ts +51 -0
  265. package/src/db/adapter/get-field-attributes.ts +62 -0
  266. package/src/db/adapter/get-field-name.ts +43 -0
  267. package/src/db/adapter/get-id-field.ts +141 -0
  268. package/src/db/adapter/get-model-name.ts +36 -0
  269. package/src/db/adapter/index.ts +554 -0
  270. package/src/db/adapter/types.ts +171 -0
  271. package/src/db/adapter/utils.ts +61 -0
  272. package/src/db/get-tables.ts +296 -0
  273. package/src/db/index.ts +18 -0
  274. package/src/db/plugin.ts +11 -0
  275. package/src/db/schema/account.ts +34 -0
  276. package/src/db/schema/rate-limit.ts +21 -0
  277. package/src/db/schema/session.ts +17 -0
  278. package/src/db/schema/shared.ts +7 -0
  279. package/src/db/schema/user.ts +16 -0
  280. package/src/db/schema/verification.ts +15 -0
  281. package/src/db/test/get-tables.test.ts +116 -0
  282. package/src/db/type.ts +180 -0
  283. package/src/env/color-depth.ts +172 -0
  284. package/src/env/env-impl.ts +124 -0
  285. package/src/env/index.ts +23 -0
  286. package/src/env/logger.test.ts +34 -0
  287. package/src/env/logger.ts +145 -0
  288. package/src/error/codes.ts +58 -0
  289. package/src/error/index.ts +35 -0
  290. package/src/index.ts +1 -0
  291. package/src/oauth2/client-credentials-token.ts +102 -0
  292. package/src/oauth2/create-authorization-url.ts +87 -0
  293. package/src/oauth2/index.ts +26 -0
  294. package/src/oauth2/oauth-provider.ts +222 -0
  295. package/src/oauth2/refresh-access-token.ts +124 -0
  296. package/src/oauth2/utils.ts +38 -0
  297. package/src/oauth2/validate-authorization-code.ts +149 -0
  298. package/src/oauth2/validate-token.test.ts +174 -0
  299. package/src/oauth2/verify.ts +221 -0
  300. package/src/social-providers/apple.ts +223 -0
  301. package/src/social-providers/atlassian.ts +132 -0
  302. package/src/social-providers/cognito.ts +279 -0
  303. package/src/social-providers/discord.ts +169 -0
  304. package/src/social-providers/dropbox.ts +112 -0
  305. package/src/social-providers/facebook.ts +206 -0
  306. package/src/social-providers/figma.ts +117 -0
  307. package/src/social-providers/github.ts +184 -0
  308. package/src/social-providers/gitlab.ts +155 -0
  309. package/src/social-providers/google.ts +199 -0
  310. package/src/social-providers/huggingface.ts +118 -0
  311. package/src/social-providers/index.ts +127 -0
  312. package/src/social-providers/kakao.ts +178 -0
  313. package/src/social-providers/kick.ts +109 -0
  314. package/src/social-providers/line.ts +169 -0
  315. package/src/social-providers/linear.ts +121 -0
  316. package/src/social-providers/linkedin.ts +110 -0
  317. package/src/social-providers/microsoft-entra-id.ts +259 -0
  318. package/src/social-providers/naver.ts +112 -0
  319. package/src/social-providers/notion.ts +108 -0
  320. package/src/social-providers/paybin.ts +122 -0
  321. package/src/social-providers/paypal.ts +263 -0
  322. package/src/social-providers/polar.ts +110 -0
  323. package/src/social-providers/reddit.ts +122 -0
  324. package/src/social-providers/roblox.ts +111 -0
  325. package/src/social-providers/salesforce.ts +159 -0
  326. package/src/social-providers/slack.ts +111 -0
  327. package/src/social-providers/spotify.ts +93 -0
  328. package/src/social-providers/tiktok.ts +209 -0
  329. package/src/social-providers/twitch.ts +111 -0
  330. package/src/social-providers/twitter.ts +198 -0
  331. package/src/social-providers/vercel.ts +87 -0
  332. package/src/social-providers/vk.ts +124 -0
  333. package/src/social-providers/zoom.ts +238 -0
  334. package/src/types/context.ts +396 -0
  335. package/src/types/cookie.ts +10 -0
  336. package/src/types/helper.ts +26 -0
  337. package/src/types/index.ts +32 -0
  338. package/src/types/init-options.ts +1529 -0
  339. package/src/types/plugin-client.ts +127 -0
  340. package/src/types/plugin.ts +157 -0
  341. package/src/utils/db.ts +20 -0
  342. package/src/utils/deprecate.test.ts +72 -0
  343. package/src/utils/deprecate.ts +21 -0
  344. package/src/utils/error-codes.ts +65 -0
  345. package/src/utils/id.ts +5 -0
  346. package/src/utils/ip.test.ts +255 -0
  347. package/src/utils/ip.ts +211 -0
  348. package/src/utils/json.ts +25 -0
  349. package/src/utils/string.ts +3 -0
  350. package/src/utils/url.ts +43 -0
  351. package/tsconfig.json +7 -0
  352. package/tsdown.config.ts +35 -0
  353. package/vitest.config.ts +3 -0
@@ -0,0 +1,59 @@
1
+ import { BetterAuthError } from "../../error";
2
+ import type { BetterAuthDBSchema } from "../type";
3
+ import { initGetDefaultModelName } from "./get-default-model-name";
4
+
5
+ export const initGetDefaultFieldName = ({
6
+ schema,
7
+ usePlural,
8
+ }: {
9
+ schema: BetterAuthDBSchema;
10
+ usePlural: boolean | undefined;
11
+ }) => {
12
+ const getDefaultModelName = initGetDefaultModelName({
13
+ schema,
14
+ usePlural,
15
+ });
16
+
17
+ /**
18
+ * This function helps us get the default field name from the schema defined by devs.
19
+ * Often times, the user will be using the `fieldName` which could had been customized by the users.
20
+ * This function helps us get the actual field name useful to match against the schema. (eg: schema[model].fields[field])
21
+ *
22
+ * If it's still unclear what this does:
23
+ *
24
+ * 1. User can define a custom fieldName.
25
+ * 2. When using a custom fieldName, doing something like `schema[model].fields[field]` will not work.
26
+ */
27
+ const getDefaultFieldName = ({
28
+ field,
29
+ model: unsafeModel,
30
+ }: {
31
+ model: string;
32
+ field: string;
33
+ }) => {
34
+ // Plugin `schema`s can't define their own `id`. Better-auth auto provides `id` to every schema model.
35
+ // Given this, we can't just check if the `field` (that being `id`) is within the schema's fields, since it is never defined.
36
+ // So we check if the `field` is `id` and if so, we return `id` itself. Otherwise, we return the `field` from the schema.
37
+ if (field === "id" || field === "_id") {
38
+ return "id";
39
+ }
40
+ const model = getDefaultModelName(unsafeModel); // Just to make sure the model name is correct.
41
+
42
+ let f = schema[model]?.fields[field];
43
+ if (!f) {
44
+ const result = Object.entries(schema[model]!.fields!).find(
45
+ ([_, f]) => f.fieldName === field,
46
+ );
47
+ if (result) {
48
+ f = result[1];
49
+ field = result[0];
50
+ }
51
+ }
52
+ if (!f) {
53
+ throw new BetterAuthError(`Field ${field} not found in model ${model}`);
54
+ }
55
+ return field;
56
+ };
57
+
58
+ return getDefaultFieldName;
59
+ };
@@ -0,0 +1,51 @@
1
+ import { BetterAuthError } from "../../error";
2
+ import type { BetterAuthDBSchema } from "../type";
3
+
4
+ export const initGetDefaultModelName = ({
5
+ usePlural,
6
+ schema,
7
+ }: {
8
+ usePlural: boolean | undefined;
9
+ schema: BetterAuthDBSchema;
10
+ }) => {
11
+ /**
12
+ * This function helps us get the default model name from the schema defined by devs.
13
+ * Often times, the user will be using the `modelName` which could had been customized by the users.
14
+ * This function helps us get the actual model name useful to match against the schema. (eg: schema[model])
15
+ *
16
+ * If it's still unclear what this does:
17
+ *
18
+ * 1. User can define a custom modelName.
19
+ * 2. When using a custom modelName, doing something like `schema[model]` will not work.
20
+ * 3. Using this function helps us get the actual model name based on the user's defined custom modelName.
21
+ */
22
+ const getDefaultModelName = (model: string) => {
23
+ // It's possible this `model` could had applied `usePlural`.
24
+ // Thus we'll try the search but without the trailing `s`.
25
+ if (usePlural && model.charAt(model.length - 1) === "s") {
26
+ const pluralessModel = model.slice(0, -1);
27
+ let m = schema[pluralessModel] ? pluralessModel : undefined;
28
+ if (!m) {
29
+ m = Object.entries(schema).find(
30
+ ([_, f]) => f.modelName === pluralessModel,
31
+ )?.[0];
32
+ }
33
+
34
+ if (m) {
35
+ return m;
36
+ }
37
+ }
38
+
39
+ let m = schema[model] ? model : undefined;
40
+ if (!m) {
41
+ m = Object.entries(schema).find(([_, f]) => f.modelName === model)?.[0];
42
+ }
43
+
44
+ if (!m) {
45
+ throw new BetterAuthError(`Model "${model}" not found in schema`);
46
+ }
47
+ return m;
48
+ };
49
+
50
+ return getDefaultModelName;
51
+ };
@@ -0,0 +1,62 @@
1
+ import { BetterAuthError } from "../../error";
2
+ import type { BetterAuthOptions } from "../../types";
3
+ import type { BetterAuthDBSchema } from "../type";
4
+ import { initGetDefaultFieldName } from "./get-default-field-name";
5
+ import { initGetDefaultModelName } from "./get-default-model-name";
6
+ import { initGetIdField } from "./get-id-field";
7
+
8
+ export const initGetFieldAttributes = ({
9
+ usePlural,
10
+ schema,
11
+ options,
12
+ customIdGenerator,
13
+ disableIdGeneration,
14
+ }: {
15
+ usePlural?: boolean;
16
+ schema: BetterAuthDBSchema;
17
+ options: BetterAuthOptions;
18
+ disableIdGeneration?: boolean;
19
+ customIdGenerator?: ((props: { model: string }) => string) | undefined;
20
+ }) => {
21
+ const getDefaultModelName = initGetDefaultModelName({
22
+ usePlural,
23
+ schema,
24
+ });
25
+
26
+ const getDefaultFieldName = initGetDefaultFieldName({
27
+ usePlural,
28
+ schema,
29
+ });
30
+
31
+ const idField = initGetIdField({
32
+ usePlural,
33
+ schema,
34
+ options,
35
+ customIdGenerator,
36
+ disableIdGeneration,
37
+ });
38
+
39
+ const getFieldAttributes = ({
40
+ model,
41
+ field,
42
+ }: {
43
+ model: string;
44
+ field: string;
45
+ }) => {
46
+ const defaultModelName = getDefaultModelName(model);
47
+ const defaultFieldName = getDefaultFieldName({
48
+ field: field,
49
+ model: defaultModelName,
50
+ });
51
+
52
+ const fields = schema[defaultModelName]!.fields;
53
+ fields.id = idField({ customModelName: defaultModelName });
54
+ const fieldAttributes = fields[defaultFieldName];
55
+ if (!fieldAttributes) {
56
+ throw new BetterAuthError(`Field ${field} not found in model ${model}`);
57
+ }
58
+ return fieldAttributes;
59
+ };
60
+
61
+ return getFieldAttributes;
62
+ };
@@ -0,0 +1,43 @@
1
+ import type { BetterAuthDBSchema } from "../type";
2
+ import { initGetDefaultFieldName } from "./get-default-field-name";
3
+ import { initGetDefaultModelName } from "./get-default-model-name";
4
+
5
+ export const initGetFieldName = ({
6
+ schema,
7
+ usePlural,
8
+ }: {
9
+ schema: BetterAuthDBSchema;
10
+ usePlural: boolean | undefined;
11
+ }) => {
12
+ const getDefaultModelName = initGetDefaultModelName({
13
+ schema,
14
+ usePlural,
15
+ });
16
+
17
+ const getDefaultFieldName = initGetDefaultFieldName({
18
+ schema,
19
+ usePlural,
20
+ });
21
+
22
+ /**
23
+ * Get the field name which is expected to be saved in the database based on the user's schema.
24
+ *
25
+ * This function is useful if you need to save the field name to the database.
26
+ *
27
+ * For example, if the user has defined a custom field name for the `user` model, then you can use this function to get the actual field name from the schema.
28
+ */
29
+ function getFieldName({
30
+ model: modelName,
31
+ field: fieldName,
32
+ }: {
33
+ model: string;
34
+ field: string;
35
+ }) {
36
+ const model = getDefaultModelName(modelName);
37
+ const field = getDefaultFieldName({ model, field: fieldName });
38
+
39
+ return schema[model]?.fields[field]?.fieldName || field;
40
+ }
41
+
42
+ return getFieldName;
43
+ };
@@ -0,0 +1,141 @@
1
+ import { logger } from "../../env";
2
+ import type { BetterAuthOptions } from "../../types";
3
+ import { generateId as defaultGenerateId } from "../../utils/id";
4
+ import type { BetterAuthDBSchema, DBFieldAttribute } from "../type";
5
+ import { initGetDefaultModelName } from "./get-default-model-name";
6
+
7
+ export const initGetIdField = ({
8
+ usePlural,
9
+ schema,
10
+ disableIdGeneration,
11
+ options,
12
+ customIdGenerator,
13
+ supportsUUIDs,
14
+ }: {
15
+ usePlural?: boolean;
16
+ schema: BetterAuthDBSchema;
17
+ options: BetterAuthOptions;
18
+ disableIdGeneration?: boolean;
19
+ customIdGenerator?: ((props: { model: string }) => string) | undefined;
20
+ supportsUUIDs?: boolean;
21
+ }) => {
22
+ const getDefaultModelName = initGetDefaultModelName({
23
+ usePlural: usePlural,
24
+ schema,
25
+ });
26
+
27
+ const idField = ({
28
+ customModelName,
29
+ forceAllowId,
30
+ }: {
31
+ customModelName?: string;
32
+ forceAllowId?: boolean;
33
+ }) => {
34
+ const useNumberId =
35
+ options.advanced?.database?.useNumberId ||
36
+ options.advanced?.database?.generateId === "serial";
37
+ const useUUIDs = options.advanced?.database?.generateId === "uuid";
38
+
39
+ const shouldGenerateId: boolean = (() => {
40
+ if (disableIdGeneration) {
41
+ return false;
42
+ } else if (useNumberId && !forceAllowId) {
43
+ // if force allow is true, then we should be using their custom provided id.
44
+ return false;
45
+ } else if (useUUIDs) {
46
+ // should only generate UUIDs via JS if the database doesn't support natively generating UUIDs.
47
+ return !supportsUUIDs;
48
+ } else {
49
+ return true;
50
+ }
51
+ })();
52
+
53
+ const model = getDefaultModelName(customModelName ?? "id");
54
+ return {
55
+ type: useNumberId ? "number" : "string",
56
+ required: shouldGenerateId ? true : false,
57
+ ...(shouldGenerateId
58
+ ? {
59
+ defaultValue() {
60
+ if (disableIdGeneration) return undefined;
61
+ const generateId = options.advanced?.database?.generateId;
62
+ if (generateId === false || useNumberId) return undefined;
63
+ if (typeof generateId === "function") {
64
+ return generateId({
65
+ model,
66
+ });
67
+ }
68
+ if (customIdGenerator) {
69
+ return customIdGenerator({ model });
70
+ }
71
+ if (generateId === "uuid") {
72
+ return crypto.randomUUID();
73
+ }
74
+ return defaultGenerateId();
75
+ },
76
+ }
77
+ : {}),
78
+ transform: {
79
+ input: (value) => {
80
+ // Uncomment if need to debug id transformation
81
+ // console.log(`transforming id: `, {
82
+ // id: value,
83
+ // ...(useNumberId ? { useNumberId } : {}),
84
+ // ...(useUUIDs ? { useUUIDs } : {}),
85
+ // ...(forceAllowId ? { forceAllowId } : {}),
86
+ // });
87
+ if (!value) return undefined;
88
+
89
+ if (useNumberId) {
90
+ const numberValue = Number(value);
91
+ // if invalid number, fallback to DB generated number id.
92
+ if (isNaN(numberValue)) {
93
+ return undefined;
94
+ }
95
+ return numberValue;
96
+ }
97
+
98
+ if (useUUIDs) {
99
+ // if it's generated by us, then we should return the value as is.
100
+ if (shouldGenerateId && !forceAllowId) return value;
101
+ if (disableIdGeneration) return undefined;
102
+ // if DB will handle UUID generation, then we should return undefined.
103
+ if (supportsUUIDs) return undefined;
104
+ // if forceAllowId is true, it means we should be using the ID provided during the adapter call.
105
+ if (forceAllowId && typeof value === "string") {
106
+ const uuidRegex =
107
+ /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
108
+ if (uuidRegex.test(value)) {
109
+ return value;
110
+ } else {
111
+ const err = new Error();
112
+ const stack = err.stack
113
+ ?.split("\n")
114
+ .filter((_, i) => i !== 1)
115
+ .join("\n")
116
+ .replace("Error:", "");
117
+ logger.warn(
118
+ "[Adapter Factory] - Invalid UUID value for field `id` provided when `forceAllowId` is true. Generating a new UUID.",
119
+ stack,
120
+ );
121
+ }
122
+ }
123
+ // if the value is not a string, and the database doesn't support generating it's own UUIDs, then we should be generating the UUID.
124
+ if (typeof value !== "string" && !supportsUUIDs) {
125
+ return crypto.randomUUID();
126
+ }
127
+ return undefined;
128
+ }
129
+
130
+ return value;
131
+ },
132
+ output: (value) => {
133
+ if (!value) return undefined;
134
+ return String(value);
135
+ },
136
+ },
137
+ } satisfies DBFieldAttribute;
138
+ };
139
+
140
+ return idField;
141
+ };
@@ -0,0 +1,36 @@
1
+ import type { BetterAuthDBSchema } from "../type";
2
+ import { initGetDefaultModelName } from "./get-default-model-name";
3
+
4
+ export const initGetModelName = ({
5
+ usePlural,
6
+ schema,
7
+ }: {
8
+ usePlural: boolean | undefined;
9
+ schema: BetterAuthDBSchema;
10
+ }) => {
11
+ const getDefaultModelName = initGetDefaultModelName({
12
+ schema,
13
+ usePlural,
14
+ });
15
+ /**
16
+ * Users can overwrite the default model of some tables. This function helps find the correct model name.
17
+ * Furthermore, if the user passes `usePlural` as true in their adapter config,
18
+ * then we should return the model name ending with an `s`.
19
+ */
20
+ const getModelName = (model: string) => {
21
+ const defaultModelKey = getDefaultModelName(model);
22
+ const useCustomModelName =
23
+ schema &&
24
+ schema[defaultModelKey] &&
25
+ schema[defaultModelKey].modelName !== model;
26
+
27
+ if (useCustomModelName) {
28
+ return usePlural
29
+ ? `${schema[defaultModelKey]!.modelName}s`
30
+ : schema[defaultModelKey]!.modelName;
31
+ }
32
+
33
+ return usePlural ? `${model}s` : model;
34
+ };
35
+ return getModelName;
36
+ };