@convex-dev/better-auth 0.11.2 → 0.11.4
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.
- package/dist/auth-config.d.ts +1 -1
- package/dist/auth-config.d.ts.map +1 -1
- package/dist/auth-options.d.ts.map +1 -1
- package/dist/auth-options.js +11 -2
- package/dist/auth-options.js.map +1 -1
- package/dist/client/create-client.d.ts +12 -0
- package/dist/client/create-client.d.ts.map +1 -1
- package/dist/client/create-client.js +92 -0
- package/dist/client/create-client.js.map +1 -1
- package/dist/component/_generated/component.d.ts +0 -1
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/adapterTest.d.ts +0 -1
- package/dist/component/adapterTest.d.ts.map +1 -1
- package/dist/component/adapterTest.js +11 -21
- package/dist/component/adapterTest.js.map +1 -1
- package/dist/component/testProfiles/auth-options.profile-rename-joins.js +1 -1
- package/dist/component/testProfiles/auth-options.profile-rename-joins.js.map +1 -1
- package/dist/plugins/convex/index.d.ts +1 -1
- package/dist/plugins/convex/index.d.ts.map +1 -1
- package/dist/plugins/convex/index.js +3 -1
- package/dist/plugins/convex/index.js.map +1 -1
- package/dist/plugins/cross-domain/index.d.ts.map +1 -1
- package/dist/plugins/cross-domain/index.js +1 -1
- package/dist/plugins/cross-domain/index.js.map +1 -1
- package/dist/test/adapter-factory/auth-flow.d.ts +1 -21
- package/dist/test/adapter-factory/auth-flow.d.ts.map +1 -1
- package/dist/test/adapter-factory/auth-flow.js +32 -37
- package/dist/test/adapter-factory/auth-flow.js.map +1 -1
- package/dist/test/adapter-factory/basic.d.ts +11 -34
- package/dist/test/adapter-factory/basic.d.ts.map +1 -1
- package/dist/test/adapter-factory/basic.js +54 -2626
- package/dist/test/adapter-factory/basic.js.map +1 -1
- package/dist/test/adapter-factory/index.d.ts +0 -6
- package/dist/test/adapter-factory/index.d.ts.map +1 -1
- package/dist/test/adapter-factory/index.js +0 -6
- package/dist/test/adapter-factory/index.js.map +1 -1
- package/dist/test/adapter-factory/profile-additional-fields.d.ts.map +1 -1
- package/dist/test/adapter-factory/profile-additional-fields.js +14 -1
- package/dist/test/adapter-factory/profile-additional-fields.js.map +1 -1
- package/dist/test/adapter-factory/profile-plugin-table.d.ts.map +1 -1
- package/dist/test/adapter-factory/profile-plugin-table.js +8 -1
- package/dist/test/adapter-factory/profile-plugin-table.js.map +1 -1
- package/dist/test/adapter-factory/profile-rename-joins.d.ts +3 -3
- package/dist/test/adapter-factory/profile-rename-joins.d.ts.map +1 -1
- package/dist/test/adapter-factory/profile-rename-joins.js +11 -10
- package/dist/test/adapter-factory/profile-rename-joins.js.map +1 -1
- package/dist/utils/index.d.ts +3 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js.map +1 -1
- package/package.json +5 -7
- package/src/auth-config.ts +1 -1
- package/src/auth-options.ts +11 -15
- package/src/client/adapter.test.ts +20 -5
- package/src/client/create-client.test.ts +149 -0
- package/src/client/create-client.ts +127 -0
- package/src/component/_generated/component.ts +0 -1
- package/src/component/adapterTest.ts +12 -26
- package/src/component/testProfiles/auth-options.profile-rename-joins.ts +1 -1
- package/src/plugins/convex/index.ts +4 -6
- package/src/plugins/cross-domain/index.ts +1 -1
- package/src/test/adapter-factory/auth-flow.ts +146 -160
- package/src/test/adapter-factory/basic.ts +185 -3187
- package/src/test/adapter-factory/index.ts +0 -6
- package/src/test/adapter-factory/profile-additional-fields.ts +75 -57
- package/src/test/adapter-factory/profile-plugin-table.ts +10 -2
- package/src/test/adapter-factory/profile-rename-joins.ts +13 -11
- package/src/utils/index.ts +3 -2
- package/dist/test/adapter-factory/joins.d.ts +0 -18
- package/dist/test/adapter-factory/joins.d.ts.map +0 -1
- package/dist/test/adapter-factory/joins.js +0 -22
- package/dist/test/adapter-factory/joins.js.map +0 -1
- package/dist/test/adapter-factory/number-id.d.ts +0 -18
- package/dist/test/adapter-factory/number-id.d.ts.map +0 -1
- package/dist/test/adapter-factory/number-id.js +0 -36
- package/dist/test/adapter-factory/number-id.js.map +0 -1
- package/dist/test/adapter-factory/transactions.d.ts +0 -21
- package/dist/test/adapter-factory/transactions.d.ts.map +0 -1
- package/dist/test/adapter-factory/transactions.js +0 -28
- package/dist/test/adapter-factory/transactions.js.map +0 -1
- package/dist/test/adapter-factory/uuid.d.ts +0 -18
- package/dist/test/adapter-factory/uuid.d.ts.map +0 -1
- package/dist/test/adapter-factory/uuid.js +0 -58
- package/dist/test/adapter-factory/uuid.js.map +0 -1
- package/src/test/adapter-factory/joins.ts +0 -28
- package/src/test/adapter-factory/number-id.ts +0 -45
- package/src/test/adapter-factory/transactions.ts +0 -38
- package/src/test/adapter-factory/uuid.ts +0 -67
|
@@ -1,170 +1,156 @@
|
|
|
1
1
|
import type { Session, User } from "@better-auth/core/db";
|
|
2
|
-
import { createTestSuite } from "@better-auth/test-utils/adapter";
|
|
2
|
+
import type { createTestSuite } from "@better-auth/test-utils/adapter";
|
|
3
3
|
import { setCookieToHeader } from "better-auth/cookies";
|
|
4
4
|
import { expect } from "vitest";
|
|
5
5
|
|
|
6
6
|
export const AUTH_FLOW_DEFAULT_BETTER_AUTH_OPTIONS = {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
7
|
+
emailAndPassword: {
|
|
8
|
+
enabled: true,
|
|
9
|
+
password: {
|
|
10
|
+
hash: async (password: string) => password,
|
|
11
|
+
async verify(data: { hash: string; password: string }) {
|
|
12
|
+
return data.hash === data.password;
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
16
|
};
|
|
17
17
|
|
|
18
18
|
export const getAuthFlowSuiteTests = (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
{
|
|
20
|
+
generate,
|
|
21
|
+
getAuth,
|
|
22
|
+
modifyBetterAuthOptions,
|
|
23
|
+
tryCatch,
|
|
24
|
+
}: Parameters<Parameters<typeof createTestSuite>[2]>[0],
|
|
25
25
|
) => ({
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
26
|
+
"should successfully sign up": async () => {
|
|
27
|
+
const auth = await getAuth();
|
|
28
|
+
const user = await generate("user");
|
|
29
|
+
const result = await auth.api.signUpEmail({
|
|
30
|
+
body: {
|
|
31
|
+
email: user.email,
|
|
32
|
+
password: crypto.randomUUID(),
|
|
33
|
+
name: user.name,
|
|
34
|
+
image: user.image || "",
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
expect(result.user).toBeDefined();
|
|
38
|
+
expect(result.user.email).toBe(user.email);
|
|
39
|
+
expect(result.user.name).toBe(user.name);
|
|
40
|
+
expect(result.user.image).toBe(user.image || "");
|
|
41
|
+
expect(result.user.emailVerified).toBe(false);
|
|
42
|
+
expect(result.user.createdAt).toBeDefined();
|
|
43
|
+
expect(result.user.updatedAt).toBeDefined();
|
|
44
|
+
},
|
|
45
|
+
"should successfully sign in": async () => {
|
|
46
|
+
const auth = await getAuth();
|
|
47
|
+
const user = await generate("user");
|
|
48
|
+
const password = crypto.randomUUID();
|
|
49
|
+
const signUpResult = await auth.api.signUpEmail({
|
|
50
|
+
body: {
|
|
51
|
+
email: user.email,
|
|
52
|
+
password,
|
|
53
|
+
name: user.name,
|
|
54
|
+
image: user.image || "",
|
|
55
|
+
},
|
|
56
|
+
});
|
|
57
|
+
const result = await auth.api.signInEmail({
|
|
58
|
+
body: { email: user.email, password },
|
|
59
|
+
});
|
|
60
|
+
expect(result.user).toBeDefined();
|
|
61
|
+
expect(result.user.id).toBe(signUpResult.user.id);
|
|
62
|
+
},
|
|
63
|
+
"should successfully get session": async () => {
|
|
64
|
+
const auth = await getAuth();
|
|
65
|
+
const user = await generate("user");
|
|
66
|
+
const password = crypto.randomUUID();
|
|
67
|
+
const response = await auth.api.signUpEmail({
|
|
68
|
+
body: {
|
|
69
|
+
email: user.email,
|
|
70
|
+
password,
|
|
71
|
+
name: user.name,
|
|
72
|
+
image: user.image || "",
|
|
73
|
+
},
|
|
74
|
+
asResponse: true,
|
|
75
|
+
});
|
|
76
|
+
const headers = new Headers();
|
|
77
|
+
setCookieToHeader(headers)({ response });
|
|
78
|
+
const result = await auth.api.getSession({
|
|
79
|
+
headers,
|
|
80
|
+
});
|
|
81
|
+
const signUpResult = (await response.json()) as {
|
|
82
|
+
user: User;
|
|
83
|
+
session: Session;
|
|
84
|
+
};
|
|
85
|
+
signUpResult.user.createdAt = new Date(signUpResult.user.createdAt).getTime() as unknown as Date;
|
|
86
|
+
signUpResult.user.updatedAt = new Date(signUpResult.user.updatedAt).getTime() as unknown as Date;
|
|
87
|
+
expect(result?.user).toBeDefined();
|
|
88
|
+
expect(result?.user).toStrictEqual(signUpResult.user);
|
|
89
|
+
expect(result?.session).toBeDefined();
|
|
90
|
+
},
|
|
91
|
+
"should not sign in with invalid email": async () => {
|
|
92
|
+
const auth = await getAuth();
|
|
93
|
+
const user = await generate("user");
|
|
94
|
+
const { data, error } = await tryCatch(
|
|
95
|
+
auth.api.signInEmail({
|
|
96
|
+
body: { email: user.email, password: crypto.randomUUID() },
|
|
97
|
+
}),
|
|
98
|
+
);
|
|
99
|
+
expect(data).toBeNull();
|
|
100
|
+
expect(error).toBeDefined();
|
|
101
|
+
},
|
|
102
|
+
"should store and retrieve timestamps correctly across timezones": async () => {
|
|
103
|
+
const originalTZ = process.env.TZ;
|
|
104
|
+
try {
|
|
105
|
+
const auth = await getAuth();
|
|
106
|
+
const user = await generate("user");
|
|
107
|
+
const password = crypto.randomUUID();
|
|
108
|
+
const userSignUp = await auth.api.signUpEmail({
|
|
109
|
+
body: {
|
|
110
|
+
email: user.email,
|
|
111
|
+
password,
|
|
112
|
+
name: user.name,
|
|
113
|
+
image: user.image || "",
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
process.env.TZ = "Europe/London";
|
|
117
|
+
const userSignIn = await auth.api.signInEmail({
|
|
118
|
+
body: { email: user.email, password },
|
|
119
|
+
});
|
|
120
|
+
process.env.TZ = "America/Los_Angeles";
|
|
121
|
+
expect(userSignUp.user.createdAt).toStrictEqual(userSignIn.user.createdAt);
|
|
122
|
+
} finally {
|
|
123
|
+
if (originalTZ === undefined) {
|
|
124
|
+
delete process.env.TZ;
|
|
125
|
+
} else {
|
|
126
|
+
process.env.TZ = originalTZ;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
"should sign up with additional fields": async () => {
|
|
131
|
+
await modifyBetterAuthOptions(
|
|
132
|
+
{ user: { additionalFields: { dateField: { type: "date" } } } },
|
|
133
|
+
true,
|
|
134
|
+
);
|
|
135
|
+
const auth = await getAuth();
|
|
136
|
+
const user = await generate("user");
|
|
137
|
+
const dateField = new Date();
|
|
138
|
+
const response = await auth.api.signUpEmail({
|
|
139
|
+
body: {
|
|
140
|
+
email: user.email,
|
|
141
|
+
name: user.name,
|
|
142
|
+
password: crypto.randomUUID(),
|
|
143
|
+
//@ts-expect-error - we are testing with additional fields
|
|
144
|
+
dateField: dateField.toISOString(),
|
|
145
|
+
},
|
|
146
|
+
asResponse: true,
|
|
147
|
+
});
|
|
148
|
+
const headers = new Headers();
|
|
149
|
+
setCookieToHeader(headers)({ response });
|
|
150
|
+
const result = await auth.api.getSession({
|
|
151
|
+
headers,
|
|
152
|
+
});
|
|
153
|
+
//@ts-expect-error - we are testing with additional fields
|
|
154
|
+
expect(result?.user.dateField).toStrictEqual(dateField.getTime());
|
|
155
|
+
},
|
|
150
156
|
});
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* This test suite tests basic authentication flow using the adapter.
|
|
154
|
-
*/
|
|
155
|
-
export const authFlowTestSuite = createTestSuite(
|
|
156
|
-
"auth-flow",
|
|
157
|
-
{
|
|
158
|
-
defaultBetterAuthOptions: AUTH_FLOW_DEFAULT_BETTER_AUTH_OPTIONS,
|
|
159
|
-
},
|
|
160
|
-
(helpers) => getAuthFlowSuiteTests(helpers),
|
|
161
|
-
);
|
|
162
|
-
|
|
163
|
-
function recoverProcessTZ() {
|
|
164
|
-
const originalTZ = process.env.TZ;
|
|
165
|
-
return {
|
|
166
|
-
[Symbol.dispose]: () => {
|
|
167
|
-
process.env.TZ = originalTZ;
|
|
168
|
-
},
|
|
169
|
-
};
|
|
170
|
-
}
|