@better-auth/core 1.5.7-beta.1 → 1.6.0-beta.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 (273) hide show
  1. package/dist/api/index.d.mts +1 -2
  2. package/dist/api/index.mjs +0 -3
  3. package/dist/async_hooks/index.d.mts +1 -2
  4. package/dist/async_hooks/index.mjs +0 -2
  5. package/dist/async_hooks/pure.index.d.mts +1 -2
  6. package/dist/async_hooks/pure.index.mjs +0 -2
  7. package/dist/context/endpoint-context.d.mts +1 -2
  8. package/dist/context/endpoint-context.mjs +0 -2
  9. package/dist/context/global.d.mts +1 -2
  10. package/dist/context/global.mjs +1 -3
  11. package/dist/context/request-state.d.mts +1 -2
  12. package/dist/context/request-state.mjs +0 -2
  13. package/dist/context/transaction.d.mts +1 -2
  14. package/dist/context/transaction.mjs +0 -2
  15. package/dist/db/adapter/factory.d.mts +1 -2
  16. package/dist/db/adapter/factory.mjs +3 -6
  17. package/dist/db/adapter/get-default-field-name.d.mts +1 -2
  18. package/dist/db/adapter/get-default-field-name.mjs +0 -2
  19. package/dist/db/adapter/get-default-model-name.d.mts +1 -2
  20. package/dist/db/adapter/get-default-model-name.mjs +0 -2
  21. package/dist/db/adapter/get-field-attributes.d.mts +1 -2
  22. package/dist/db/adapter/get-field-attributes.mjs +0 -2
  23. package/dist/db/adapter/get-field-name.d.mts +1 -2
  24. package/dist/db/adapter/get-field-name.mjs +0 -2
  25. package/dist/db/adapter/get-id-field.d.mts +1 -2
  26. package/dist/db/adapter/get-id-field.mjs +0 -3
  27. package/dist/db/adapter/get-model-name.d.mts +1 -2
  28. package/dist/db/adapter/get-model-name.mjs +0 -2
  29. package/dist/db/adapter/index.d.mts +9 -2
  30. package/dist/db/adapter/index.mjs +0 -2
  31. package/dist/db/adapter/types.d.mts +1 -2
  32. package/dist/db/adapter/utils.d.mts +1 -2
  33. package/dist/db/adapter/utils.mjs +0 -2
  34. package/dist/db/get-tables.d.mts +1 -2
  35. package/dist/db/get-tables.mjs +0 -2
  36. package/dist/db/plugin.d.mts +1 -2
  37. package/dist/db/schema/account.d.mts +1 -2
  38. package/dist/db/schema/account.mjs +0 -2
  39. package/dist/db/schema/rate-limit.d.mts +1 -2
  40. package/dist/db/schema/rate-limit.mjs +0 -2
  41. package/dist/db/schema/session.d.mts +1 -2
  42. package/dist/db/schema/session.mjs +0 -2
  43. package/dist/db/schema/shared.d.mts +1 -2
  44. package/dist/db/schema/shared.mjs +0 -2
  45. package/dist/db/schema/user.d.mts +1 -2
  46. package/dist/db/schema/user.mjs +0 -2
  47. package/dist/db/schema/verification.d.mts +1 -2
  48. package/dist/db/schema/verification.mjs +0 -2
  49. package/dist/db/type.d.mts +1 -2
  50. package/dist/env/color-depth.d.mts +1 -2
  51. package/dist/env/color-depth.mjs +0 -2
  52. package/dist/env/env-impl.d.mts +1 -2
  53. package/dist/env/env-impl.mjs +0 -2
  54. package/dist/env/logger.d.mts +1 -2
  55. package/dist/env/logger.mjs +0 -2
  56. package/dist/error/codes.d.mts +1 -2
  57. package/dist/error/codes.mjs +0 -2
  58. package/dist/error/index.d.mts +1 -2
  59. package/dist/error/index.mjs +0 -2
  60. package/dist/instrumentation/attributes.d.mts +1 -2
  61. package/dist/instrumentation/attributes.mjs +0 -2
  62. package/dist/instrumentation/tracer.d.mts +1 -2
  63. package/dist/instrumentation/tracer.mjs +29 -15
  64. package/dist/oauth2/client-credentials-token.d.mts +1 -2
  65. package/dist/oauth2/client-credentials-token.mjs +0 -2
  66. package/dist/oauth2/create-authorization-url.d.mts +1 -2
  67. package/dist/oauth2/create-authorization-url.mjs +0 -2
  68. package/dist/oauth2/oauth-provider.d.mts +1 -2
  69. package/dist/oauth2/refresh-access-token.d.mts +1 -2
  70. package/dist/oauth2/refresh-access-token.mjs +0 -2
  71. package/dist/oauth2/utils.d.mts +1 -2
  72. package/dist/oauth2/utils.mjs +0 -2
  73. package/dist/oauth2/validate-authorization-code.d.mts +1 -2
  74. package/dist/oauth2/validate-authorization-code.mjs +0 -3
  75. package/dist/oauth2/verify.d.mts +1 -2
  76. package/dist/oauth2/verify.mjs +0 -3
  77. package/dist/social-providers/apple.d.mts +1 -2
  78. package/dist/social-providers/apple.mjs +0 -3
  79. package/dist/social-providers/atlassian.d.mts +1 -2
  80. package/dist/social-providers/atlassian.mjs +0 -4
  81. package/dist/social-providers/cognito.d.mts +1 -2
  82. package/dist/social-providers/cognito.mjs +0 -4
  83. package/dist/social-providers/discord.d.mts +1 -2
  84. package/dist/social-providers/discord.mjs +0 -3
  85. package/dist/social-providers/dropbox.d.mts +1 -2
  86. package/dist/social-providers/dropbox.mjs +0 -3
  87. package/dist/social-providers/facebook.d.mts +1 -2
  88. package/dist/social-providers/facebook.mjs +0 -3
  89. package/dist/social-providers/figma.d.mts +1 -2
  90. package/dist/social-providers/figma.mjs +0 -4
  91. package/dist/social-providers/github.d.mts +1 -2
  92. package/dist/social-providers/github.mjs +0 -4
  93. package/dist/social-providers/gitlab.d.mts +1 -2
  94. package/dist/social-providers/gitlab.mjs +0 -3
  95. package/dist/social-providers/google.d.mts +1 -2
  96. package/dist/social-providers/google.mjs +0 -4
  97. package/dist/social-providers/huggingface.d.mts +1 -2
  98. package/dist/social-providers/huggingface.mjs +0 -3
  99. package/dist/social-providers/index.d.mts +1 -2
  100. package/dist/social-providers/index.mjs +0 -2
  101. package/dist/social-providers/kakao.d.mts +1 -2
  102. package/dist/social-providers/kakao.mjs +0 -3
  103. package/dist/social-providers/kick.d.mts +1 -2
  104. package/dist/social-providers/kick.mjs +0 -3
  105. package/dist/social-providers/line.d.mts +1 -2
  106. package/dist/social-providers/line.mjs +0 -3
  107. package/dist/social-providers/linear.d.mts +1 -2
  108. package/dist/social-providers/linear.mjs +0 -3
  109. package/dist/social-providers/linkedin.d.mts +1 -2
  110. package/dist/social-providers/linkedin.mjs +0 -3
  111. package/dist/social-providers/microsoft-entra-id.d.mts +1 -2
  112. package/dist/social-providers/microsoft-entra-id.mjs +0 -4
  113. package/dist/social-providers/naver.d.mts +1 -2
  114. package/dist/social-providers/naver.mjs +0 -3
  115. package/dist/social-providers/notion.d.mts +1 -2
  116. package/dist/social-providers/notion.mjs +0 -3
  117. package/dist/social-providers/paybin.d.mts +1 -2
  118. package/dist/social-providers/paybin.mjs +0 -4
  119. package/dist/social-providers/paypal.d.mts +1 -2
  120. package/dist/social-providers/paypal.mjs +0 -4
  121. package/dist/social-providers/polar.d.mts +1 -2
  122. package/dist/social-providers/polar.mjs +0 -3
  123. package/dist/social-providers/railway.d.mts +1 -2
  124. package/dist/social-providers/railway.mjs +0 -3
  125. package/dist/social-providers/reddit.d.mts +1 -2
  126. package/dist/social-providers/reddit.mjs +0 -3
  127. package/dist/social-providers/roblox.d.mts +1 -2
  128. package/dist/social-providers/roblox.mjs +0 -3
  129. package/dist/social-providers/salesforce.d.mts +1 -2
  130. package/dist/social-providers/salesforce.mjs +0 -4
  131. package/dist/social-providers/slack.d.mts +1 -2
  132. package/dist/social-providers/slack.mjs +0 -3
  133. package/dist/social-providers/spotify.d.mts +1 -2
  134. package/dist/social-providers/spotify.mjs +0 -3
  135. package/dist/social-providers/tiktok.d.mts +1 -2
  136. package/dist/social-providers/tiktok.mjs +0 -3
  137. package/dist/social-providers/twitch.d.mts +1 -2
  138. package/dist/social-providers/twitch.mjs +0 -4
  139. package/dist/social-providers/twitter.d.mts +1 -2
  140. package/dist/social-providers/twitter.mjs +0 -3
  141. package/dist/social-providers/vercel.d.mts +1 -2
  142. package/dist/social-providers/vercel.mjs +0 -3
  143. package/dist/social-providers/vk.d.mts +1 -2
  144. package/dist/social-providers/vk.mjs +0 -3
  145. package/dist/social-providers/wechat.d.mts +1 -2
  146. package/dist/social-providers/wechat.mjs +0 -2
  147. package/dist/social-providers/zoom.d.mts +1 -2
  148. package/dist/social-providers/zoom.mjs +0 -3
  149. package/dist/types/context.d.mts +2 -2
  150. package/dist/types/cookie.d.mts +1 -2
  151. package/dist/types/helper.d.mts +1 -2
  152. package/dist/types/init-options.d.mts +14 -6
  153. package/dist/types/plugin-client.d.mts +2 -2
  154. package/dist/types/plugin.d.mts +2 -2
  155. package/dist/types/secret.d.mts +1 -2
  156. package/dist/utils/db.d.mts +1 -2
  157. package/dist/utils/db.mjs +0 -2
  158. package/dist/utils/deprecate.d.mts +1 -2
  159. package/dist/utils/deprecate.mjs +0 -2
  160. package/dist/utils/error-codes.d.mts +1 -2
  161. package/dist/utils/error-codes.mjs +0 -2
  162. package/dist/utils/fetch-metadata.d.mts +1 -2
  163. package/dist/utils/fetch-metadata.mjs +0 -2
  164. package/dist/utils/id.d.mts +1 -2
  165. package/dist/utils/id.mjs +0 -2
  166. package/dist/utils/ip.d.mts +1 -2
  167. package/dist/utils/ip.mjs +0 -2
  168. package/dist/utils/json.d.mts +1 -2
  169. package/dist/utils/json.mjs +0 -3
  170. package/dist/utils/string.d.mts +1 -2
  171. package/dist/utils/string.mjs +0 -2
  172. package/dist/utils/url.d.mts +1 -2
  173. package/dist/utils/url.mjs +0 -2
  174. package/package.json +9 -7
  175. package/src/db/adapter/factory.ts +2 -0
  176. package/src/db/adapter/index.ts +8 -0
  177. package/src/instrumentation/tracer.ts +40 -12
  178. package/src/social-providers/index.ts +0 -2
  179. package/src/types/context.ts +1 -0
  180. package/src/types/init-options.ts +13 -4
  181. package/src/types/plugin-client.ts +1 -0
  182. package/src/types/plugin.ts +1 -0
  183. package/dist/api/index.mjs.map +0 -1
  184. package/dist/async_hooks/index.mjs.map +0 -1
  185. package/dist/async_hooks/pure.index.mjs.map +0 -1
  186. package/dist/context/endpoint-context.mjs.map +0 -1
  187. package/dist/context/global.mjs.map +0 -1
  188. package/dist/context/request-state.mjs.map +0 -1
  189. package/dist/context/transaction.mjs.map +0 -1
  190. package/dist/db/adapter/factory.mjs.map +0 -1
  191. package/dist/db/adapter/get-default-field-name.mjs.map +0 -1
  192. package/dist/db/adapter/get-default-model-name.mjs.map +0 -1
  193. package/dist/db/adapter/get-field-attributes.mjs.map +0 -1
  194. package/dist/db/adapter/get-field-name.mjs.map +0 -1
  195. package/dist/db/adapter/get-id-field.mjs.map +0 -1
  196. package/dist/db/adapter/get-model-name.mjs.map +0 -1
  197. package/dist/db/adapter/index.mjs.map +0 -1
  198. package/dist/db/adapter/utils.mjs.map +0 -1
  199. package/dist/db/get-tables.mjs.map +0 -1
  200. package/dist/db/schema/account.mjs.map +0 -1
  201. package/dist/db/schema/rate-limit.mjs.map +0 -1
  202. package/dist/db/schema/session.mjs.map +0 -1
  203. package/dist/db/schema/shared.mjs.map +0 -1
  204. package/dist/db/schema/user.mjs.map +0 -1
  205. package/dist/db/schema/verification.mjs.map +0 -1
  206. package/dist/env/color-depth.mjs.map +0 -1
  207. package/dist/env/env-impl.mjs.map +0 -1
  208. package/dist/env/logger.mjs.map +0 -1
  209. package/dist/error/codes.mjs.map +0 -1
  210. package/dist/error/index.mjs.map +0 -1
  211. package/dist/instrumentation/attributes.mjs.map +0 -1
  212. package/dist/instrumentation/tracer.mjs.map +0 -1
  213. package/dist/oauth2/client-credentials-token.mjs.map +0 -1
  214. package/dist/oauth2/create-authorization-url.mjs.map +0 -1
  215. package/dist/oauth2/refresh-access-token.mjs.map +0 -1
  216. package/dist/oauth2/utils.mjs.map +0 -1
  217. package/dist/oauth2/validate-authorization-code.mjs.map +0 -1
  218. package/dist/oauth2/verify.mjs.map +0 -1
  219. package/dist/social-providers/apple.mjs.map +0 -1
  220. package/dist/social-providers/atlassian.mjs.map +0 -1
  221. package/dist/social-providers/cognito.mjs.map +0 -1
  222. package/dist/social-providers/discord.mjs.map +0 -1
  223. package/dist/social-providers/dropbox.mjs.map +0 -1
  224. package/dist/social-providers/facebook.mjs.map +0 -1
  225. package/dist/social-providers/figma.mjs.map +0 -1
  226. package/dist/social-providers/github.mjs.map +0 -1
  227. package/dist/social-providers/gitlab.mjs.map +0 -1
  228. package/dist/social-providers/google.mjs.map +0 -1
  229. package/dist/social-providers/huggingface.mjs.map +0 -1
  230. package/dist/social-providers/index.mjs.map +0 -1
  231. package/dist/social-providers/kakao.mjs.map +0 -1
  232. package/dist/social-providers/kick.mjs.map +0 -1
  233. package/dist/social-providers/line.mjs.map +0 -1
  234. package/dist/social-providers/linear.mjs.map +0 -1
  235. package/dist/social-providers/linkedin.mjs.map +0 -1
  236. package/dist/social-providers/microsoft-entra-id.mjs.map +0 -1
  237. package/dist/social-providers/naver.mjs.map +0 -1
  238. package/dist/social-providers/notion.mjs.map +0 -1
  239. package/dist/social-providers/paybin.mjs.map +0 -1
  240. package/dist/social-providers/paypal.mjs.map +0 -1
  241. package/dist/social-providers/polar.mjs.map +0 -1
  242. package/dist/social-providers/railway.mjs.map +0 -1
  243. package/dist/social-providers/reddit.mjs.map +0 -1
  244. package/dist/social-providers/roblox.mjs.map +0 -1
  245. package/dist/social-providers/salesforce.mjs.map +0 -1
  246. package/dist/social-providers/slack.mjs.map +0 -1
  247. package/dist/social-providers/spotify.mjs.map +0 -1
  248. package/dist/social-providers/tiktok.mjs.map +0 -1
  249. package/dist/social-providers/twitch.mjs.map +0 -1
  250. package/dist/social-providers/twitter.mjs.map +0 -1
  251. package/dist/social-providers/vercel.mjs.map +0 -1
  252. package/dist/social-providers/vk.mjs.map +0 -1
  253. package/dist/social-providers/wechat.mjs.map +0 -1
  254. package/dist/social-providers/zoom.mjs.map +0 -1
  255. package/dist/utils/db.mjs.map +0 -1
  256. package/dist/utils/deprecate.mjs.map +0 -1
  257. package/dist/utils/error-codes.mjs.map +0 -1
  258. package/dist/utils/fetch-metadata.mjs.map +0 -1
  259. package/dist/utils/id.mjs.map +0 -1
  260. package/dist/utils/ip.mjs.map +0 -1
  261. package/dist/utils/json.mjs.map +0 -1
  262. package/dist/utils/string.mjs.map +0 -1
  263. package/dist/utils/url.mjs.map +0 -1
  264. package/src/context/request-state.test.ts +0 -94
  265. package/src/db/adapter/get-id-field.test.ts +0 -222
  266. package/src/db/test/get-tables.test.ts +0 -116
  267. package/src/env/logger.test.ts +0 -34
  268. package/src/instrumentation/instrumentation.test.ts +0 -139
  269. package/src/oauth2/refresh-access-token.test.ts +0 -90
  270. package/src/oauth2/validate-token.test.ts +0 -229
  271. package/src/utils/deprecate.test.ts +0 -71
  272. package/src/utils/fetch-metadata.test.ts +0 -28
  273. package/src/utils/ip.test.ts +0 -255
@@ -1,222 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import type { BetterAuthOptions } from "../../types";
3
- import type { BetterAuthDBSchema } from "../type";
4
- import { initGetIdField } from "./get-id-field";
5
-
6
- const minimalSchema: BetterAuthDBSchema = {
7
- user: {
8
- modelName: "user",
9
- fields: {
10
- name: { type: "string" },
11
- email: { type: "string" },
12
- },
13
- },
14
- };
15
-
16
- const uuidRegex =
17
- /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
18
-
19
- function getField(
20
- options: BetterAuthOptions,
21
- initExtra?: Partial<Parameters<typeof initGetIdField>[0]>,
22
- fieldExtra?: { customModelName?: string; forceAllowId?: boolean },
23
- ) {
24
- const idField = initGetIdField({
25
- schema: minimalSchema,
26
- options,
27
- ...initExtra,
28
- });
29
- return idField({
30
- customModelName: fieldExtra?.customModelName ?? "user",
31
- forceAllowId: fieldExtra?.forceAllowId,
32
- });
33
- }
34
-
35
- describe("defaultValue priority", () => {
36
- it("should return undefined when disableIdGeneration is true", () => {
37
- const field = getField(
38
- { database: {} as any },
39
- { disableIdGeneration: true },
40
- );
41
- expect(field.defaultValue).toBeUndefined();
42
- });
43
-
44
- it("should return undefined when generateId is false", () => {
45
- const value = getField({
46
- database: {} as any,
47
- advanced: { database: { generateId: false } },
48
- }).defaultValue?.();
49
- expect(value).toBeUndefined();
50
- });
51
-
52
- it("should return undefined when generateId is 'serial'", () => {
53
- const value = getField({
54
- database: {} as any,
55
- advanced: { database: { generateId: "serial" } },
56
- }).defaultValue?.();
57
- expect(value).toBeUndefined();
58
- });
59
-
60
- it("should use generateId function over 'uuid' and customIdGenerator", () => {
61
- const value = getField(
62
- {
63
- database: {} as any,
64
- advanced: { database: { generateId: () => "fn-id" } },
65
- },
66
- { customIdGenerator: () => "adapter-id" },
67
- ).defaultValue?.();
68
- expect(value).toBe("fn-id");
69
- });
70
-
71
- it("should use 'uuid' over customIdGenerator", () => {
72
- const value = getField(
73
- {
74
- database: {} as any,
75
- advanced: { database: { generateId: "uuid" } },
76
- },
77
- { customIdGenerator: () => "adapter-id", supportsUUIDs: false },
78
- ).defaultValue?.();
79
- expect(value).toMatch(uuidRegex);
80
- });
81
-
82
- it("should use customIdGenerator when generateId is not set", () => {
83
- const value = getField(
84
- { database: {} as any },
85
- { customIdGenerator: () => "adapter-id" },
86
- ).defaultValue?.();
87
- expect(value).toBe("adapter-id");
88
- });
89
-
90
- it("should fall back to default id generation", () => {
91
- const value = getField({ database: {} as any }).defaultValue?.();
92
- expect(typeof value).toBe("string");
93
- expect(value).not.toMatch(uuidRegex);
94
- });
95
- });
96
-
97
- describe("type and required", () => {
98
- it("should have type 'number' when generateId is 'serial'", () => {
99
- const field = getField({
100
- database: {} as any,
101
- advanced: { database: { generateId: "serial" } },
102
- });
103
- expect(field.type).toBe("number");
104
- expect(field.required).toBe(false);
105
- });
106
-
107
- it("should have type 'string' by default", () => {
108
- const field = getField({ database: {} as any });
109
- expect(field.type).toBe("string");
110
- expect(field.required).toBe(true);
111
- });
112
-
113
- it("should not generate id when useUUIDs and supportsUUIDs", () => {
114
- const field = getField(
115
- {
116
- database: {} as any,
117
- advanced: { database: { generateId: "uuid" } },
118
- },
119
- { supportsUUIDs: true },
120
- );
121
- expect(field.required).toBe(false);
122
- expect(field.defaultValue).toBeUndefined();
123
- });
124
- });
125
-
126
- describe("transform.input", () => {
127
- it("should return undefined for falsy value", () => {
128
- const field = getField({ database: {} as any });
129
- expect(field.transform.input(undefined)).toBeUndefined();
130
- expect(field.transform.input(null)).toBeUndefined();
131
- expect(field.transform.input("")).toBeUndefined();
132
- });
133
-
134
- it("should return value as-is by default", () => {
135
- const field = getField({ database: {} as any });
136
- expect(field.transform.input("some-id")).toBe("some-id");
137
- });
138
-
139
- describe("serial", () => {
140
- it("should convert string to number", () => {
141
- const field = getField({
142
- database: {} as any,
143
- advanced: { database: { generateId: "serial" } },
144
- });
145
- expect(field.transform.input("42")).toBe(42);
146
- });
147
-
148
- it("should return undefined for non-numeric string", () => {
149
- const field = getField({
150
- database: {} as any,
151
- advanced: { database: { generateId: "serial" } },
152
- });
153
- expect(field.transform.input("not-a-number")).toBeUndefined();
154
- });
155
- });
156
-
157
- describe("uuid", () => {
158
- it("should return value as-is when shouldGenerateId and not forceAllowId", () => {
159
- const field = getField(
160
- {
161
- database: {} as any,
162
- advanced: { database: { generateId: "uuid" } },
163
- },
164
- { supportsUUIDs: false },
165
- );
166
- const uuid = crypto.randomUUID();
167
- expect(field.transform.input(uuid)).toBe(uuid);
168
- });
169
-
170
- it("should return undefined when supportsUUIDs (DB handles it)", () => {
171
- const field = getField(
172
- {
173
- database: {} as any,
174
- advanced: { database: { generateId: "uuid" } },
175
- },
176
- { supportsUUIDs: true },
177
- );
178
- expect(field.transform.input("some-value")).toBeUndefined();
179
- });
180
-
181
- it("should accept valid UUID when forceAllowId is true", () => {
182
- const uuid = crypto.randomUUID();
183
- const field = getField(
184
- {
185
- database: {} as any,
186
- advanced: { database: { generateId: "uuid" } },
187
- },
188
- { supportsUUIDs: false },
189
- { forceAllowId: true },
190
- );
191
- expect(field.transform.input(uuid)).toBe(uuid);
192
- });
193
-
194
- it("should generate new UUID for non-string value when DB doesn't support UUIDs", () => {
195
- const field = getField(
196
- {
197
- database: {} as any,
198
- advanced: { database: { generateId: "uuid" } },
199
- },
200
- { supportsUUIDs: false },
201
- { forceAllowId: true },
202
- );
203
- const result = field.transform.input(123);
204
- expect(result).toMatch(uuidRegex);
205
- });
206
- });
207
- });
208
-
209
- describe("transform.output", () => {
210
- it("should return undefined for falsy value", () => {
211
- const field = getField({ database: {} as any });
212
- expect(field.transform.output(undefined)).toBeUndefined();
213
- expect(field.transform.output(null)).toBeUndefined();
214
- expect(field.transform.output("")).toBeUndefined();
215
- });
216
-
217
- it("should convert value to string", () => {
218
- const field = getField({ database: {} as any });
219
- expect(field.transform.output(123)).toBe("123");
220
- expect(field.transform.output("abc")).toBe("abc");
221
- });
222
- });
@@ -1,116 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import { getAuthTables } from "../get-tables";
3
-
4
- describe("getAuthTables", () => {
5
- it("should use correct field name for refreshTokenExpiresAt", () => {
6
- const tables = getAuthTables({
7
- account: {
8
- fields: {
9
- refreshTokenExpiresAt: "custom_refresh_token_expires_at",
10
- },
11
- },
12
- });
13
-
14
- const accountTable = tables.account;
15
- const refreshTokenExpiresAtField =
16
- accountTable!.fields.refreshTokenExpiresAt!;
17
-
18
- expect(refreshTokenExpiresAtField.fieldName).toBe(
19
- "custom_refresh_token_expires_at",
20
- );
21
- });
22
-
23
- it("should not use accessTokenExpiresAt field name for refreshTokenExpiresAt", () => {
24
- const tables = getAuthTables({
25
- account: {
26
- fields: {
27
- accessTokenExpiresAt: "custom_access_token_expires_at",
28
- refreshTokenExpiresAt: "custom_refresh_token_expires_at",
29
- },
30
- },
31
- });
32
-
33
- const accountTable = tables.account;
34
- const refreshTokenExpiresAtField =
35
- accountTable!.fields.refreshTokenExpiresAt!;
36
- const accessTokenExpiresAtField =
37
- accountTable!.fields.accessTokenExpiresAt!;
38
-
39
- expect(refreshTokenExpiresAtField.fieldName).toBe(
40
- "custom_refresh_token_expires_at",
41
- );
42
- expect(accessTokenExpiresAtField.fieldName).toBe(
43
- "custom_access_token_expires_at",
44
- );
45
- expect(refreshTokenExpiresAtField.fieldName).not.toBe(
46
- accessTokenExpiresAtField.fieldName,
47
- );
48
- });
49
-
50
- it("should use default field names when no custom names provided", () => {
51
- const tables = getAuthTables({});
52
-
53
- const accountTable = tables.account;
54
- const refreshTokenExpiresAtField =
55
- accountTable!.fields.refreshTokenExpiresAt!;
56
- const accessTokenExpiresAtField =
57
- accountTable!.fields.accessTokenExpiresAt!;
58
-
59
- expect(refreshTokenExpiresAtField.fieldName).toBe("refreshTokenExpiresAt");
60
- expect(accessTokenExpiresAtField.fieldName).toBe("accessTokenExpiresAt");
61
- });
62
-
63
- it("should merge additionalFields into verification table metadata", () => {
64
- const tables = getAuthTables({
65
- verification: {
66
- additionalFields: {
67
- newField: {
68
- fieldName: "new_field",
69
- type: "string",
70
- },
71
- },
72
- },
73
- });
74
-
75
- const verificationTable = tables.verification;
76
- const newField = verificationTable!.fields.newField!;
77
-
78
- console.log(newField);
79
- expect(newField).not.toBeUndefined();
80
- expect(newField.fieldName).toBe("new_field");
81
- expect(newField.type).toBe("string");
82
- });
83
-
84
- it("should exclude verification table when secondaryStorage is configured", () => {
85
- const tables = getAuthTables({
86
- secondaryStorage: {
87
- get: async () => null,
88
- set: async () => {},
89
- delete: async () => {},
90
- },
91
- });
92
-
93
- expect(tables.verification).toBeUndefined();
94
- });
95
-
96
- it("should include verification table when storeInDatabase is true", () => {
97
- const tables = getAuthTables({
98
- secondaryStorage: {
99
- get: async () => null,
100
- set: async () => {},
101
- delete: async () => {},
102
- },
103
- verification: {
104
- storeInDatabase: true,
105
- },
106
- });
107
-
108
- expect(tables.verification).toBeDefined();
109
- });
110
-
111
- it("should include verification table when no secondaryStorage", () => {
112
- const tables = getAuthTables({});
113
-
114
- expect(tables.verification).toBeDefined();
115
- });
116
- });
@@ -1,34 +0,0 @@
1
- import { describe, expect, it } from "vitest";
2
- import type { LogLevel } from "./logger";
3
- import { shouldPublishLog } from "./logger";
4
-
5
- describe("shouldPublishLog", () => {
6
- const testCases: {
7
- currentLogLevel: LogLevel;
8
- logLevel: LogLevel;
9
- expected: boolean;
10
- }[] = [
11
- { currentLogLevel: "debug", logLevel: "debug", expected: true },
12
- { currentLogLevel: "debug", logLevel: "info", expected: true },
13
- { currentLogLevel: "debug", logLevel: "warn", expected: true },
14
- { currentLogLevel: "debug", logLevel: "error", expected: true },
15
- { currentLogLevel: "info", logLevel: "debug", expected: false },
16
- { currentLogLevel: "info", logLevel: "info", expected: true },
17
- { currentLogLevel: "info", logLevel: "warn", expected: true },
18
- { currentLogLevel: "info", logLevel: "error", expected: true },
19
- { currentLogLevel: "warn", logLevel: "debug", expected: false },
20
- { currentLogLevel: "warn", logLevel: "info", expected: false },
21
- { currentLogLevel: "warn", logLevel: "warn", expected: true },
22
- { currentLogLevel: "warn", logLevel: "error", expected: true },
23
- { currentLogLevel: "error", logLevel: "debug", expected: false },
24
- { currentLogLevel: "error", logLevel: "info", expected: false },
25
- { currentLogLevel: "error", logLevel: "warn", expected: false },
26
- { currentLogLevel: "error", logLevel: "error", expected: true },
27
- ];
28
-
29
- testCases.forEach(({ currentLogLevel, logLevel, expected }) => {
30
- it(`should return "${expected}" when currentLogLevel is "${currentLogLevel}" and logLevel is "${logLevel}"`, () => {
31
- expect(shouldPublishLog(currentLogLevel, logLevel)).toBe(expected);
32
- });
33
- });
34
- });
@@ -1,139 +0,0 @@
1
- import { trace } from "@opentelemetry/api";
2
- import {
3
- InMemorySpanExporter,
4
- SimpleSpanProcessor,
5
- } from "@opentelemetry/sdk-trace-base";
6
- import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
7
- import { afterAll, beforeAll, beforeEach, describe, expect, it } from "vitest";
8
- import { withSpan } from ".";
9
- import { ATTR_DB_COLLECTION_NAME, ATTR_DB_OPERATION_NAME } from "./attributes";
10
-
11
- describe("instrumentation", () => {
12
- let provider: NodeTracerProvider;
13
- let exporter: InMemorySpanExporter;
14
-
15
- beforeAll(async () => {
16
- exporter = new InMemorySpanExporter();
17
- provider = new NodeTracerProvider({
18
- spanProcessors: [new SimpleSpanProcessor(exporter)],
19
- });
20
- trace.setGlobalTracerProvider(provider);
21
- });
22
-
23
- afterAll(async () => {
24
- await provider.shutdown();
25
- });
26
-
27
- beforeEach(() => {
28
- exporter.reset();
29
- });
30
-
31
- it("creates a span with name and attributes for sync function", () => {
32
- const result = withSpan(
33
- "test.sync",
34
- {
35
- [ATTR_DB_OPERATION_NAME]: "findOne",
36
- [ATTR_DB_COLLECTION_NAME]: "user",
37
- },
38
- () => 42,
39
- );
40
-
41
- expect(result).toBe(42);
42
-
43
- const spans = exporter.getFinishedSpans();
44
- expect(spans).toHaveLength(1);
45
- expect(spans[0]?.name).toBe("test.sync");
46
- expect(spans[0]?.attributes).toMatchObject({
47
- [ATTR_DB_OPERATION_NAME]: "findOne",
48
- [ATTR_DB_COLLECTION_NAME]: "user",
49
- });
50
- });
51
-
52
- it("creates a span for async function", async () => {
53
- const result = await withSpan(
54
- "test.async",
55
- { endpoint: "getSession" },
56
- async () => {
57
- await new Promise((r) => setTimeout(r, 5));
58
- return "session-id";
59
- },
60
- );
61
-
62
- expect(result).toBe("session-id");
63
-
64
- const spans = exporter.getFinishedSpans();
65
- expect(spans).toHaveLength(1);
66
- expect(spans[0]?.name).toBe("test.async");
67
- expect(spans[0]?.attributes).toMatchObject({ endpoint: "getSession" });
68
- });
69
-
70
- it("records error status and exception when sync function throws", () => {
71
- const err = new Error("sync failure");
72
-
73
- expect(() =>
74
- withSpan("test.sync.error", { foo: "bar" }, () => {
75
- throw err;
76
- }),
77
- ).toThrow("sync failure");
78
-
79
- const spans = exporter.getFinishedSpans();
80
- expect(spans).toHaveLength(1);
81
- expect(spans[0]?.name).toBe("test.sync.error");
82
- expect(spans[0]?.status).toMatchObject({
83
- code: 2,
84
- message: "sync failure",
85
- });
86
- });
87
-
88
- it("records error status and exception when async function rejects", async () => {
89
- const err = new Error("async failure");
90
-
91
- await expect(
92
- withSpan("test.async.error", { baz: 1 }, async () => {
93
- await Promise.resolve();
94
- throw err;
95
- }),
96
- ).rejects.toThrow("async failure");
97
-
98
- const spans = exporter.getFinishedSpans();
99
- expect(spans).toHaveLength(1);
100
- expect(spans[0]?.name).toBe("test.async.error");
101
- expect(spans[0]?.status).toMatchObject({
102
- code: 2,
103
- message: "async failure",
104
- });
105
- });
106
-
107
- it("creates multiple sequential spans", () => {
108
- void withSpan("first", { order: 1 }, () => 1);
109
- void withSpan("second", { order: 2 }, () => 2);
110
-
111
- const spans = exporter.getFinishedSpans();
112
- expect(spans).toHaveLength(2);
113
- expect(spans.map((s) => s.name)).toEqual(
114
- expect.arrayContaining(["first", "second"]),
115
- );
116
- });
117
-
118
- it("creates nested spans when withSpan is composed", () => {
119
- const result = withSpan("outer", { depth: 0 }, () => {
120
- return withSpan("inner", { depth: 1 }, () => "ok");
121
- });
122
-
123
- expect(result).toBe("ok");
124
-
125
- const spans = exporter.getFinishedSpans();
126
- expect(spans).toHaveLength(2);
127
- expect(spans.map((s) => s.name).sort()).toEqual(["inner", "outer"]);
128
- });
129
-
130
- it("uses better-auth instrumentation scope", () => {
131
- void withSpan("scope.check", {}, () => undefined);
132
-
133
- const spans = exporter.getFinishedSpans();
134
- expect(spans).toHaveLength(1);
135
-
136
- const span = spans[0];
137
- expect(span?.instrumentationLibrary?.name).toBe("better-auth");
138
- });
139
- });
@@ -1,90 +0,0 @@
1
- import { describe, expect, it, vi } from "vitest";
2
-
3
- vi.mock("@better-fetch/fetch", () => ({
4
- betterFetch: vi.fn(),
5
- }));
6
-
7
- import { betterFetch } from "@better-fetch/fetch";
8
- import { refreshAccessToken } from "./refresh-access-token";
9
-
10
- const mockedBetterFetch = vi.mocked(betterFetch);
11
-
12
- describe("refreshAccessToken", () => {
13
- it("should set accessTokenExpiresAt when expires_in is returned", async () => {
14
- const now = Date.now();
15
- mockedBetterFetch.mockResolvedValueOnce({
16
- data: {
17
- access_token: "new-access-token",
18
- refresh_token: "new-refresh-token",
19
- expires_in: 3600,
20
- token_type: "Bearer",
21
- },
22
- error: null,
23
- });
24
-
25
- const tokens = await refreshAccessToken({
26
- refreshToken: "old-refresh-token",
27
- options: { clientId: "test-client", clientSecret: "test-secret" },
28
- tokenEndpoint: "https://example.com/token",
29
- });
30
-
31
- expect(tokens.accessToken).toBe("new-access-token");
32
- expect(tokens.refreshToken).toBe("new-refresh-token");
33
- expect(tokens.accessTokenExpiresAt).toBeInstanceOf(Date);
34
- expect(tokens.accessTokenExpiresAt!.getTime()).toBeGreaterThanOrEqual(
35
- now + 3600 * 1000 - 1000,
36
- );
37
- expect(tokens.refreshTokenExpiresAt).toBeUndefined();
38
- });
39
-
40
- /**
41
- * @see https://github.com/better-auth/better-auth/issues/7682
42
- */
43
- it("should set refreshTokenExpiresAt when refresh_token_expires_in is returned", async () => {
44
- const now = Date.now();
45
- mockedBetterFetch.mockResolvedValueOnce({
46
- data: {
47
- access_token: "new-access-token",
48
- refresh_token: "new-refresh-token",
49
- expires_in: 3600,
50
- refresh_token_expires_in: 86400,
51
- token_type: "Bearer",
52
- },
53
- error: null,
54
- });
55
-
56
- const tokens = await refreshAccessToken({
57
- refreshToken: "old-refresh-token",
58
- options: { clientId: "test-client", clientSecret: "test-secret" },
59
- tokenEndpoint: "https://example.com/token",
60
- });
61
-
62
- expect(tokens.accessToken).toBe("new-access-token");
63
- expect(tokens.refreshToken).toBe("new-refresh-token");
64
- expect(tokens.accessTokenExpiresAt).toBeInstanceOf(Date);
65
- expect(tokens.refreshTokenExpiresAt).toBeInstanceOf(Date);
66
- expect(tokens.refreshTokenExpiresAt!.getTime()).toBeGreaterThanOrEqual(
67
- now + 86400 * 1000 - 1000,
68
- );
69
- });
70
-
71
- it("should not set refreshTokenExpiresAt when refresh_token_expires_in is not returned", async () => {
72
- mockedBetterFetch.mockResolvedValueOnce({
73
- data: {
74
- access_token: "new-access-token",
75
- refresh_token: "new-refresh-token",
76
- expires_in: 3600,
77
- token_type: "Bearer",
78
- },
79
- error: null,
80
- });
81
-
82
- const tokens = await refreshAccessToken({
83
- refreshToken: "old-refresh-token",
84
- options: { clientId: "test-client", clientSecret: "test-secret" },
85
- tokenEndpoint: "https://example.com/token",
86
- });
87
-
88
- expect(tokens.refreshTokenExpiresAt).toBeUndefined();
89
- });
90
- });