payload-auth 1.0.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.
- package/LICENSE.md +17 -0
- package/dist/authjs/index.d.ts +1 -0
- package/dist/authjs/index.js +3 -0
- package/dist/authjs/index.js.map +1 -0
- package/dist/better-auth/adapter/dev/bin/run.d.ts +1 -0
- package/dist/better-auth/adapter/dev/bin/run.js +64 -0
- package/dist/better-auth/adapter/dev/bin/run.js.map +1 -0
- package/dist/better-auth/adapter/dev/bin/schema.d.ts +22 -0
- package/dist/better-auth/adapter/dev/bin/schema.js +160 -0
- package/dist/better-auth/adapter/dev/bin/schema.js.map +1 -0
- package/dist/better-auth/adapter/dev/collections.d.ts +3 -0
- package/dist/better-auth/adapter/dev/collections.js +212 -0
- package/dist/better-auth/adapter/dev/collections.js.map +1 -0
- package/dist/better-auth/adapter/dev/index.d.ts +3 -0
- package/dist/better-auth/adapter/dev/index.js +168 -0
- package/dist/better-auth/adapter/dev/index.js.map +1 -0
- package/dist/better-auth/adapter/generate-schema/generate-schema-builder.d.ts +23 -0
- package/dist/better-auth/adapter/generate-schema/generate-schema-builder.js +326 -0
- package/dist/better-auth/adapter/generate-schema/generate-schema-builder.js.map +1 -0
- package/dist/better-auth/adapter/generate-schema/get-payload-schema.d.ts +1 -0
- package/dist/better-auth/adapter/generate-schema/get-payload-schema.js +23 -0
- package/dist/better-auth/adapter/generate-schema/get-payload-schema.js.map +1 -0
- package/dist/better-auth/adapter/generate-schema/index.d.ts +4 -0
- package/dist/better-auth/adapter/generate-schema/index.js +19 -0
- package/dist/better-auth/adapter/generate-schema/index.js.map +1 -0
- package/dist/better-auth/adapter/generate-schema/utils.d.ts +2 -0
- package/dist/better-auth/adapter/generate-schema/utils.js +20 -0
- package/dist/better-auth/adapter/generate-schema/utils.js.map +1 -0
- package/dist/better-auth/adapter/index.d.ts +5 -0
- package/dist/better-auth/adapter/index.js +578 -0
- package/dist/better-auth/adapter/index.js.map +1 -0
- package/dist/better-auth/adapter/test/adapter.test.d.ts +1 -0
- package/dist/better-auth/adapter/test/adapter.test.js +181 -0
- package/dist/better-auth/adapter/test/adapter.test.js.map +1 -0
- package/dist/better-auth/adapter/test/better-auth-adapter-test.d.ts +7 -0
- package/dist/better-auth/adapter/test/better-auth-adapter-test.js +425 -0
- package/dist/better-auth/adapter/test/better-auth-adapter-test.js.map +1 -0
- package/dist/better-auth/adapter/test/schema.test.d.ts +1 -0
- package/dist/better-auth/adapter/test/schema.test.js +796 -0
- package/dist/better-auth/adapter/test/schema.test.js.map +1 -0
- package/dist/better-auth/adapter/test/test_payload1/schema.d.ts +23 -0
- package/dist/better-auth/adapter/test/test_payload1/schema.js +177 -0
- package/dist/better-auth/adapter/test/test_payload1/schema.js.map +1 -0
- package/dist/better-auth/adapter/test/test_payload2/schema.d.ts +23 -0
- package/dist/better-auth/adapter/test/test_payload2/schema.js +167 -0
- package/dist/better-auth/adapter/test/test_payload2/schema.js.map +1 -0
- package/dist/better-auth/adapter/test/test_payload3/schema.d.ts +23 -0
- package/dist/better-auth/adapter/test/test_payload3/schema.js +198 -0
- package/dist/better-auth/adapter/test/test_payload3/schema.js.map +1 -0
- package/dist/better-auth/adapter/transform/index.d.ts +16 -0
- package/dist/better-auth/adapter/transform/index.js +252 -0
- package/dist/better-auth/adapter/transform/index.js.map +1 -0
- package/dist/better-auth/adapter/types.d.ts +6 -0
- package/dist/better-auth/adapter/types.js +3 -0
- package/dist/better-auth/adapter/types.js.map +1 -0
- package/dist/better-auth/index.d.ts +6 -0
- package/dist/better-auth/index.js +8 -0
- package/dist/better-auth/index.js.map +1 -0
- package/dist/better-auth/plugin/collections/accounts/hooks/sync-password-to-user.d.ts +7 -0
- package/dist/better-auth/plugin/collections/accounts/hooks/sync-password-to-user.js +47 -0
- package/dist/better-auth/plugin/collections/accounts/hooks/sync-password-to-user.js.map +1 -0
- package/dist/better-auth/plugin/collections/users/endpoints/refresh-token.d.ts +6 -0
- package/dist/better-auth/plugin/collections/users/endpoints/refresh-token.js +106 -0
- package/dist/better-auth/plugin/collections/users/endpoints/refresh-token.js.map +1 -0
- package/dist/better-auth/plugin/collections/users/hooks/after-login.d.ts +11 -0
- package/dist/better-auth/plugin/collections/users/hooks/after-login.js +71 -0
- package/dist/better-auth/plugin/collections/users/hooks/after-login.js.map +1 -0
- package/dist/better-auth/plugin/collections/users/hooks/after-logout.d.ts +6 -0
- package/dist/better-auth/plugin/collections/users/hooks/after-logout.js +49 -0
- package/dist/better-auth/plugin/collections/users/hooks/after-logout.js.map +1 -0
- package/dist/better-auth/plugin/collections/users/hooks/before-login.d.ts +5 -0
- package/dist/better-auth/plugin/collections/users/hooks/before-login.js +18 -0
- package/dist/better-auth/plugin/collections/users/hooks/before-login.js.map +1 -0
- package/dist/better-auth/plugin/collections/users/hooks/clean-up-user-after-delete.d.ts +5 -0
- package/dist/better-auth/plugin/collections/users/hooks/clean-up-user-after-delete.js +33 -0
- package/dist/better-auth/plugin/collections/users/hooks/clean-up-user-after-delete.js.map +1 -0
- package/dist/better-auth/plugin/collections/users/hooks/on-verified-change.d.ts +2 -0
- package/dist/better-auth/plugin/collections/users/hooks/on-verified-change.js +14 -0
- package/dist/better-auth/plugin/collections/users/hooks/on-verified-change.js.map +1 -0
- package/dist/better-auth/plugin/collections/users/hooks/sync-account.d.ts +7 -0
- package/dist/better-auth/plugin/collections/users/hooks/sync-account.js +82 -0
- package/dist/better-auth/plugin/collections/users/hooks/sync-account.js.map +1 -0
- package/dist/better-auth/plugin/helpers/generate-verify-email-url.d.ts +29 -0
- package/dist/better-auth/plugin/helpers/generate-verify-email-url.js +46 -0
- package/dist/better-auth/plugin/helpers/generate-verify-email-url.js.map +1 -0
- package/dist/better-auth/plugin/helpers/get-ip.d.ts +2 -0
- package/dist/better-auth/plugin/helpers/get-ip.js +31 -0
- package/dist/better-auth/plugin/helpers/get-ip.js.map +1 -0
- package/dist/better-auth/plugin/helpers/index.d.ts +1 -0
- package/dist/better-auth/plugin/helpers/index.js +3 -0
- package/dist/better-auth/plugin/helpers/index.js.map +1 -0
- package/dist/better-auth/plugin/helpers/serialize-cookie.d.ts +104 -0
- package/dist/better-auth/plugin/helpers/serialize-cookie.js +186 -0
- package/dist/better-auth/plugin/helpers/serialize-cookie.js.map +1 -0
- package/dist/better-auth/plugin/index.d.ts +7 -0
- package/dist/better-auth/plugin/index.js +64 -0
- package/dist/better-auth/plugin/index.js.map +1 -0
- package/dist/better-auth/plugin/lib/auth-strategy.d.ts +8 -0
- package/dist/better-auth/plugin/lib/auth-strategy.js +48 -0
- package/dist/better-auth/plugin/lib/auth-strategy.js.map +1 -0
- package/dist/better-auth/plugin/lib/build-collection-configs.d.ts +11 -0
- package/dist/better-auth/plugin/lib/build-collection-configs.js +1558 -0
- package/dist/better-auth/plugin/lib/build-collection-configs.js.map +1 -0
- package/dist/better-auth/plugin/lib/config.d.ts +41 -0
- package/dist/better-auth/plugin/lib/config.js +43 -0
- package/dist/better-auth/plugin/lib/config.js.map +1 -0
- package/dist/better-auth/plugin/lib/ensure-password-set-before-create.d.ts +7 -0
- package/dist/better-auth/plugin/lib/ensure-password-set-before-create.js +24 -0
- package/dist/better-auth/plugin/lib/ensure-password-set-before-create.js.map +1 -0
- package/dist/better-auth/plugin/lib/get-payload-auth.d.ts +5 -0
- package/dist/better-auth/plugin/lib/get-payload-auth.js +9 -0
- package/dist/better-auth/plugin/lib/get-payload-auth.js.map +1 -0
- package/dist/better-auth/plugin/lib/get-required-collection-slugs.d.ts +9 -0
- package/dist/better-auth/plugin/lib/get-required-collection-slugs.js +52 -0
- package/dist/better-auth/plugin/lib/get-required-collection-slugs.js.map +1 -0
- package/dist/better-auth/plugin/lib/init-better-auth.d.ts +6 -0
- package/dist/better-auth/plugin/lib/init-better-auth.js +13 -0
- package/dist/better-auth/plugin/lib/init-better-auth.js.map +1 -0
- package/dist/better-auth/plugin/lib/password.d.ts +25 -0
- package/dist/better-auth/plugin/lib/password.js +63 -0
- package/dist/better-auth/plugin/lib/password.js.map +1 -0
- package/dist/better-auth/plugin/lib/payload-access.d.ts +14 -0
- package/dist/better-auth/plugin/lib/payload-access.js +64 -0
- package/dist/better-auth/plugin/lib/payload-access.js.map +1 -0
- package/dist/better-auth/plugin/lib/prepare-session-data.d.ts +21 -0
- package/dist/better-auth/plugin/lib/prepare-session-data.js +42 -0
- package/dist/better-auth/plugin/lib/prepare-session-data.js.map +1 -0
- package/dist/better-auth/plugin/lib/respect-save-to-jwt-fields-middleware.d.ts +15 -0
- package/dist/better-auth/plugin/lib/respect-save-to-jwt-fields-middleware.js +30 -0
- package/dist/better-auth/plugin/lib/respect-save-to-jwt-fields-middleware.js.map +1 -0
- package/dist/better-auth/plugin/lib/sanitize-auth-options.d.ts +5 -0
- package/dist/better-auth/plugin/lib/sanitize-auth-options.js +298 -0
- package/dist/better-auth/plugin/lib/sanitize-auth-options.js.map +1 -0
- package/dist/better-auth/plugin/payload/components/admin-buttons.d.ts +5 -0
- package/dist/better-auth/plugin/payload/components/admin-buttons.js +222 -0
- package/dist/better-auth/plugin/payload/components/admin-buttons.js.map +1 -0
- package/dist/better-auth/plugin/payload/components/login-redirect.d.ts +1 -0
- package/dist/better-auth/plugin/payload/components/login-redirect.js +6 -0
- package/dist/better-auth/plugin/payload/components/login-redirect.js.map +1 -0
- package/dist/better-auth/plugin/payload/components/logo.d.ts +1 -0
- package/dist/better-auth/plugin/payload/components/logo.js +36 -0
- package/dist/better-auth/plugin/payload/components/logo.js.map +1 -0
- package/dist/better-auth/plugin/payload/components/logout.d.ts +1 -0
- package/dist/better-auth/plugin/payload/components/logout.js +61 -0
- package/dist/better-auth/plugin/payload/components/logout.js.map +1 -0
- package/dist/better-auth/plugin/payload/components/sign-in.d.ts +3 -0
- package/dist/better-auth/plugin/payload/components/sign-in.js +384 -0
- package/dist/better-auth/plugin/payload/components/sign-in.js.map +1 -0
- package/dist/better-auth/plugin/payload/components/sign-up.d.ts +6 -0
- package/dist/better-auth/plugin/payload/components/sign-up.js +502 -0
- package/dist/better-auth/plugin/payload/components/sign-up.js.map +1 -0
- package/dist/better-auth/plugin/payload/components/styles.css +73 -0
- package/dist/better-auth/plugin/payload/components/ui/button.d.ts +10 -0
- package/dist/better-auth/plugin/payload/components/ui/button.js +42 -0
- package/dist/better-auth/plugin/payload/components/ui/button.js.map +1 -0
- package/dist/better-auth/plugin/payload/components/ui/card.d.ts +9 -0
- package/dist/better-auth/plugin/payload/components/ui/card.js +55 -0
- package/dist/better-auth/plugin/payload/components/ui/card.js.map +1 -0
- package/dist/better-auth/plugin/payload/components/ui/checkbox.d.ts +4 -0
- package/dist/better-auth/plugin/payload/components/ui/checkbox.js +23 -0
- package/dist/better-auth/plugin/payload/components/ui/checkbox.js.map +1 -0
- package/dist/better-auth/plugin/payload/components/ui/cn.d.ts +2 -0
- package/dist/better-auth/plugin/payload/components/ui/cn.js +7 -0
- package/dist/better-auth/plugin/payload/components/ui/cn.js.map +1 -0
- package/dist/better-auth/plugin/payload/components/ui/input.d.ts +3 -0
- package/dist/better-auth/plugin/payload/components/ui/input.js +14 -0
- package/dist/better-auth/plugin/payload/components/ui/input.js.map +1 -0
- package/dist/better-auth/plugin/payload/components/ui/label.d.ts +4 -0
- package/dist/better-auth/plugin/payload/components/ui/label.js +15 -0
- package/dist/better-auth/plugin/payload/components/ui/label.js.map +1 -0
- package/dist/better-auth/plugin/payload/components/ui/password-input.d.ts +2 -0
- package/dist/better-auth/plugin/payload/components/ui/password-input.js +55 -0
- package/dist/better-auth/plugin/payload/components/ui/password-input.js.map +1 -0
- package/dist/better-auth/plugin/payload/exports/client.d.ts +3 -0
- package/dist/better-auth/plugin/payload/exports/client.js +5 -0
- package/dist/better-auth/plugin/payload/exports/client.js.map +1 -0
- package/dist/better-auth/plugin/payload/exports/rsc.d.ts +5 -0
- package/dist/better-auth/plugin/payload/exports/rsc.js +7 -0
- package/dist/better-auth/plugin/payload/exports/rsc.js.map +1 -0
- package/dist/better-auth/plugin/payload/views/create-first-admin/index.d.ts +4 -0
- package/dist/better-auth/plugin/payload/views/create-first-admin/index.js +112 -0
- package/dist/better-auth/plugin/payload/views/create-first-admin/index.js.map +1 -0
- package/dist/better-auth/plugin/payload/views/login/index.d.ts +4 -0
- package/dist/better-auth/plugin/payload/views/login/index.js +78 -0
- package/dist/better-auth/plugin/payload/views/login/index.js.map +1 -0
- package/dist/better-auth/plugin/types.d.ts +224 -0
- package/dist/better-auth/plugin/types.js +3 -0
- package/dist/better-auth/plugin/types.js.map +1 -0
- package/dist/better-auth/types.d.ts +2 -0
- package/dist/better-auth/types.js +4 -0
- package/dist/better-auth/types.js.map +1 -0
- package/dist/clerk/index.d.ts +1 -0
- package/dist/clerk/index.js +3 -0
- package/dist/clerk/index.js.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/kinde/index.d.ts +1 -0
- package/dist/kinde/index.js +3 -0
- package/dist/kinde/index.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
export const isAdminWithRoles = (config = {})=>({ req })=>{
|
|
2
|
+
const { adminRoles = [
|
|
3
|
+
'admin'
|
|
4
|
+
] } = config;
|
|
5
|
+
if (!req?.user || !req.user.role || !adminRoles.includes(req.user.role)) return false;
|
|
6
|
+
return true;
|
|
7
|
+
};
|
|
8
|
+
export const isAdminOrCurrentUserWithRoles = (config = {})=>({ req })=>{
|
|
9
|
+
const { adminRoles = [
|
|
10
|
+
'admin'
|
|
11
|
+
], idField = 'id' } = config;
|
|
12
|
+
if (isAdminWithRoles({
|
|
13
|
+
adminRoles
|
|
14
|
+
})({
|
|
15
|
+
req
|
|
16
|
+
})) return true;
|
|
17
|
+
if (!req?.user) return false;
|
|
18
|
+
return {
|
|
19
|
+
[idField]: {
|
|
20
|
+
equals: req?.user?.id
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
export const isAdminOrCurrentUserUpdateWithAllowedFields = (config)=>{
|
|
25
|
+
return async ({ req, id, data })=>{
|
|
26
|
+
const { adminRoles = [
|
|
27
|
+
'admin'
|
|
28
|
+
], allowedFields = [], userSlug, idField = 'id' } = config;
|
|
29
|
+
const user = req.user;
|
|
30
|
+
if (isAdminWithRoles({
|
|
31
|
+
adminRoles
|
|
32
|
+
})({
|
|
33
|
+
req
|
|
34
|
+
})) return true;
|
|
35
|
+
if (!user) return false;
|
|
36
|
+
if (user[idField] === id && data) {
|
|
37
|
+
const dataKeys = Object.keys(data);
|
|
38
|
+
const hasCurrentPassword = dataKeys.includes('currentPassword');
|
|
39
|
+
const hasPassword = dataKeys.includes('password');
|
|
40
|
+
if (hasPassword || hasCurrentPassword) {
|
|
41
|
+
if (!(hasCurrentPassword && hasPassword)) return false;
|
|
42
|
+
try {
|
|
43
|
+
if (!user.email) return false;
|
|
44
|
+
const result = await req.payload.login({
|
|
45
|
+
collection: userSlug,
|
|
46
|
+
data: {
|
|
47
|
+
email: user.email,
|
|
48
|
+
password: data.currentPassword
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
if (!result) return false;
|
|
52
|
+
allowedFields.push('password', 'currentPassword');
|
|
53
|
+
} catch (error) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const hasDisallowedField = dataKeys.some((key)=>!allowedFields.includes(key));
|
|
58
|
+
return !hasDisallowedField;
|
|
59
|
+
}
|
|
60
|
+
return false;
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
//# sourceMappingURL=payload-access.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/plugin/lib/payload-access.ts"],"sourcesContent":["import type { Access, FieldAccess } from 'payload'\n\nexport type AdminRolesConfig = {\n adminRoles?: string[]\n}\n\nexport type AdminOrCurrentUserConfig = AdminRolesConfig & {\n idField?: string\n}\n\nexport type AdminOrCurrentUserUpdateConfig = AdminOrCurrentUserConfig & {\n allowedFields?: string[]\n userSlug: string\n}\n\nexport const isAdminWithRoles =\n (config: AdminRolesConfig = {}): FieldAccess =>\n ({ req }) => {\n const { adminRoles = ['admin'] } = config\n if (!req?.user || !req.user.role || !adminRoles.includes(req.user.role)) return false\n return true\n }\n\nexport const isAdminOrCurrentUserWithRoles =\n (config: AdminOrCurrentUserConfig = {}): Access =>\n ({ req }) => {\n const { adminRoles = ['admin'], idField = 'id' } = config\n if (isAdminWithRoles({ adminRoles })({ req })) return true\n if (!req?.user) return false\n return {\n [idField]: {\n equals: req?.user?.id,\n },\n }\n }\n\nexport const isAdminOrCurrentUserUpdateWithAllowedFields = (\n config: AdminOrCurrentUserUpdateConfig,\n): Access => {\n return async ({ req, id, data }) => {\n const { adminRoles = ['admin'], allowedFields = [], userSlug, idField = 'id' } = config\n const user = req.user\n\n if (isAdminWithRoles({ adminRoles })({ req })) return true\n\n if (!user) return false\n\n if (user[idField] === id && data) {\n const dataKeys = Object.keys(data)\n\n const hasCurrentPassword = dataKeys.includes('currentPassword')\n const hasPassword = dataKeys.includes('password')\n\n if (hasPassword || hasCurrentPassword) {\n if (!(hasCurrentPassword && hasPassword)) return false\n try {\n if (!user.email) return false\n\n const result = await req.payload.login({\n collection: userSlug,\n data: {\n email: user.email,\n password: data.currentPassword,\n },\n })\n\n if (!result) return false\n\n allowedFields.push('password', 'currentPassword')\n } catch (error) {\n return false\n }\n }\n\n const hasDisallowedField = dataKeys.some((key) => !allowedFields.includes(key))\n\n return !hasDisallowedField\n }\n\n return false\n }\n}\n"],"names":["isAdminWithRoles","config","req","adminRoles","user","role","includes","isAdminOrCurrentUserWithRoles","idField","equals","id","isAdminOrCurrentUserUpdateWithAllowedFields","data","allowedFields","userSlug","dataKeys","Object","keys","hasCurrentPassword","hasPassword","email","result","payload","login","collection","password","currentPassword","push","error","hasDisallowedField","some","key"],"mappings":"AAeA,OAAO,MAAMA,mBACX,CAACC,SAA2B,CAAC,CAAC,GAC9B,CAAC,EAAEC,GAAG,EAAE;QACN,MAAM,EAAEC,aAAa;YAAC;SAAQ,EAAE,GAAGF;QACnC,IAAI,CAACC,KAAKE,QAAQ,CAACF,IAAIE,IAAI,CAACC,IAAI,IAAI,CAACF,WAAWG,QAAQ,CAACJ,IAAIE,IAAI,CAACC,IAAI,GAAG,OAAO;QAChF,OAAO;IACT,EAAC;AAEH,OAAO,MAAME,gCACX,CAACN,SAAmC,CAAC,CAAC,GACtC,CAAC,EAAEC,GAAG,EAAE;QACN,MAAM,EAAEC,aAAa;YAAC;SAAQ,EAAEK,UAAU,IAAI,EAAE,GAAGP;QACnD,IAAID,iBAAiB;YAAEG;QAAW,GAAG;YAAED;QAAI,IAAI,OAAO;QACtD,IAAI,CAACA,KAAKE,MAAM,OAAO;QACvB,OAAO;YACL,CAACI,QAAQ,EAAE;gBACTC,QAAQP,KAAKE,MAAMM;YACrB;QACF;IACF,EAAC;AAEH,OAAO,MAAMC,8CAA8C,CACzDV;IAEA,OAAO,OAAO,EAAEC,GAAG,EAAEQ,EAAE,EAAEE,IAAI,EAAE;QAC7B,MAAM,EAAET,aAAa;YAAC;SAAQ,EAAEU,gBAAgB,EAAE,EAAEC,QAAQ,EAAEN,UAAU,IAAI,EAAE,GAAGP;QACjF,MAAMG,OAAOF,IAAIE,IAAI;QAErB,IAAIJ,iBAAiB;YAAEG;QAAW,GAAG;YAAED;QAAI,IAAI,OAAO;QAEtD,IAAI,CAACE,MAAM,OAAO;QAElB,IAAIA,IAAI,CAACI,QAAQ,KAAKE,MAAME,MAAM;YAChC,MAAMG,WAAWC,OAAOC,IAAI,CAACL;YAE7B,MAAMM,qBAAqBH,SAAST,QAAQ,CAAC;YAC7C,MAAMa,cAAcJ,SAAST,QAAQ,CAAC;YAEtC,IAAIa,eAAeD,oBAAoB;gBACrC,IAAI,CAAEA,CAAAA,sBAAsBC,WAAU,GAAI,OAAO;gBACjD,IAAI;oBACF,IAAI,CAACf,KAAKgB,KAAK,EAAE,OAAO;oBAExB,MAAMC,SAAS,MAAMnB,IAAIoB,OAAO,CAACC,KAAK,CAAC;wBACrCC,YAAYV;wBACZF,MAAM;4BACJQ,OAAOhB,KAAKgB,KAAK;4BACjBK,UAAUb,KAAKc,eAAe;wBAChC;oBACF;oBAEA,IAAI,CAACL,QAAQ,OAAO;oBAEpBR,cAAcc,IAAI,CAAC,YAAY;gBACjC,EAAE,OAAOC,OAAO;oBACd,OAAO;gBACT;YACF;YAEA,MAAMC,qBAAqBd,SAASe,IAAI,CAAC,CAACC,MAAQ,CAAClB,cAAcP,QAAQ,CAACyB;YAE1E,OAAO,CAACF;QACV;QAEA,OAAO;IACT;AACF,EAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Config, Payload } from 'payload';
|
|
2
|
+
type CollectionSlugs = {
|
|
3
|
+
userCollectionSlug: string;
|
|
4
|
+
sessionCollectionSlug: string;
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Prepares session data for cookie cache by filtering user and session objects
|
|
8
|
+
* based on the payload configuration's 'saveToJwt' property
|
|
9
|
+
*/
|
|
10
|
+
export declare function prepareSessionData({ newSession, payloadConfig, collectionSlugs, }: {
|
|
11
|
+
newSession: {
|
|
12
|
+
user: any;
|
|
13
|
+
session: any;
|
|
14
|
+
};
|
|
15
|
+
payloadConfig: Payload['config'] | Config;
|
|
16
|
+
collectionSlugs: CollectionSlugs;
|
|
17
|
+
}): Promise<{
|
|
18
|
+
user: Record<string, unknown>;
|
|
19
|
+
session: any;
|
|
20
|
+
} | null>;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { getFieldsToSign } from 'payload';
|
|
2
|
+
/**
|
|
3
|
+
* Prepares session data for cookie cache by filtering user and session objects
|
|
4
|
+
* based on the payload configuration's 'saveToJwt' property
|
|
5
|
+
*/ export async function prepareSessionData({ newSession, payloadConfig, collectionSlugs }) {
|
|
6
|
+
if (!newSession || !newSession.user) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
const { userCollectionSlug, sessionCollectionSlug } = collectionSlugs;
|
|
10
|
+
const userCollection = payloadConfig?.collections?.find((c)=>c.slug === userCollectionSlug);
|
|
11
|
+
const sessionCollection = payloadConfig?.collections?.find((c)=>c.slug === sessionCollectionSlug);
|
|
12
|
+
if (!userCollection) {
|
|
13
|
+
throw new Error(`User collection with slug '${userCollectionSlug}' not found`);
|
|
14
|
+
}
|
|
15
|
+
const filteredUser = getFieldsToSign({
|
|
16
|
+
collectionConfig: userCollection,
|
|
17
|
+
email: newSession.user.email,
|
|
18
|
+
user: newSession.user
|
|
19
|
+
});
|
|
20
|
+
let filteredSession = newSession.session;
|
|
21
|
+
const isImpersonated = newSession.session.impersonatedBy;
|
|
22
|
+
if (sessionCollection && newSession.session) {
|
|
23
|
+
filteredSession = getFieldsToSign({
|
|
24
|
+
collectionConfig: sessionCollection,
|
|
25
|
+
email: newSession.user.email,
|
|
26
|
+
user: newSession.session
|
|
27
|
+
});
|
|
28
|
+
// getFieldsToSign is meant for auth collections so we remove the email and collection fields
|
|
29
|
+
delete filteredSession.email;
|
|
30
|
+
delete filteredSession.collection;
|
|
31
|
+
}
|
|
32
|
+
if (isImpersonated) {
|
|
33
|
+
filteredSession.impersonatedBy = newSession.session.impersonatedBy;
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
...newSession,
|
|
37
|
+
user: filteredUser,
|
|
38
|
+
session: filteredSession
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=prepare-session-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/plugin/lib/prepare-session-data.ts"],"sourcesContent":["import { getFieldsToSign } from 'payload'\nimport type { Config, Payload } from 'payload'\n\ntype CollectionSlugs = {\n userCollectionSlug: string\n sessionCollectionSlug: string\n}\n\n/**\n * Prepares session data for cookie cache by filtering user and session objects\n * based on the payload configuration's 'saveToJwt' property\n */\nexport async function prepareSessionData({\n newSession,\n payloadConfig,\n collectionSlugs,\n}: {\n newSession: {\n user: any\n session: any\n }\n payloadConfig: Payload['config'] | Config\n collectionSlugs: CollectionSlugs\n}) {\n if (!newSession || !newSession.user) {\n return null\n }\n\n const { userCollectionSlug, sessionCollectionSlug } = collectionSlugs\n\n const userCollection = payloadConfig?.collections?.find((c) => c.slug === userCollectionSlug)\n const sessionCollection = payloadConfig?.collections?.find(\n (c) => c.slug === sessionCollectionSlug,\n )\n\n if (!userCollection) {\n throw new Error(`User collection with slug '${userCollectionSlug}' not found`)\n }\n\n const filteredUser = getFieldsToSign({\n collectionConfig: userCollection,\n email: newSession.user.email,\n user: newSession.user,\n })\n\n let filteredSession = newSession.session\n const isImpersonated = newSession.session.impersonatedBy\n if (sessionCollection && newSession.session) {\n filteredSession = getFieldsToSign({\n collectionConfig: sessionCollection,\n email: newSession.user.email,\n user: newSession.session,\n }) as typeof newSession.session\n\n // getFieldsToSign is meant for auth collections so we remove the email and collection fields\n delete filteredSession.email\n delete filteredSession.collection\n }\n\n if (isImpersonated) {\n filteredSession.impersonatedBy = newSession.session.impersonatedBy\n }\n\n return {\n ...newSession,\n user: filteredUser,\n session: filteredSession,\n }\n}\n"],"names":["getFieldsToSign","prepareSessionData","newSession","payloadConfig","collectionSlugs","user","userCollectionSlug","sessionCollectionSlug","userCollection","collections","find","c","slug","sessionCollection","Error","filteredUser","collectionConfig","email","filteredSession","session","isImpersonated","impersonatedBy","collection"],"mappings":"AAAA,SAASA,eAAe,QAAQ,UAAS;AAQzC;;;CAGC,GACD,OAAO,eAAeC,mBAAmB,EACvCC,UAAU,EACVC,aAAa,EACbC,eAAe,EAQhB;IACC,IAAI,CAACF,cAAc,CAACA,WAAWG,IAAI,EAAE;QACnC,OAAO;IACT;IAEA,MAAM,EAAEC,kBAAkB,EAAEC,qBAAqB,EAAE,GAAGH;IAEtD,MAAMI,iBAAiBL,eAAeM,aAAaC,KAAK,CAACC,IAAMA,EAAEC,IAAI,KAAKN;IAC1E,MAAMO,oBAAoBV,eAAeM,aAAaC,KACpD,CAACC,IAAMA,EAAEC,IAAI,KAAKL;IAGpB,IAAI,CAACC,gBAAgB;QACnB,MAAM,IAAIM,MAAM,CAAC,2BAA2B,EAAER,mBAAmB,WAAW,CAAC;IAC/E;IAEA,MAAMS,eAAef,gBAAgB;QACnCgB,kBAAkBR;QAClBS,OAAOf,WAAWG,IAAI,CAACY,KAAK;QAC5BZ,MAAMH,WAAWG,IAAI;IACvB;IAEA,IAAIa,kBAAkBhB,WAAWiB,OAAO;IACxC,MAAMC,iBAAiBlB,WAAWiB,OAAO,CAACE,cAAc;IACxD,IAAIR,qBAAqBX,WAAWiB,OAAO,EAAE;QAC3CD,kBAAkBlB,gBAAgB;YAChCgB,kBAAkBH;YAClBI,OAAOf,WAAWG,IAAI,CAACY,KAAK;YAC5BZ,MAAMH,WAAWiB,OAAO;QAC1B;QAEA,6FAA6F;QAC7F,OAAOD,gBAAgBD,KAAK;QAC5B,OAAOC,gBAAgBI,UAAU;IACnC;IAEA,IAAIF,gBAAgB;QAClBF,gBAAgBG,cAAc,GAAGnB,WAAWiB,OAAO,CAACE,cAAc;IACpE;IAEA,OAAO;QACL,GAAGnB,UAAU;QACbG,MAAMU;QACNI,SAASD;IACX;AACF"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { SanitizedBetterAuthOptions, PayloadBetterAuthPluginOptions } from '..';
|
|
2
|
+
import type { Config, Payload } from 'payload';
|
|
3
|
+
/**
|
|
4
|
+
* Sets up a middleware that enforces the saveToJwt configuration when setting session data.
|
|
5
|
+
* This ensures that only fields specified in saveToJwt are included in the cookie cache
|
|
6
|
+
* for both user and session objects.
|
|
7
|
+
*
|
|
8
|
+
* The middleware runs after authentication and filters the session data based on
|
|
9
|
+
* the collection configurations before storing it in the cookie cache.
|
|
10
|
+
*/
|
|
11
|
+
export declare function respectSaveToJwtFieldsMiddleware({ sanitizedOptions, payloadConfig, pluginOptions, }: {
|
|
12
|
+
sanitizedOptions: SanitizedBetterAuthOptions;
|
|
13
|
+
payloadConfig: Payload['config'] | Config;
|
|
14
|
+
pluginOptions: PayloadBetterAuthPluginOptions;
|
|
15
|
+
}): void;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { setCookieCache } from 'better-auth/cookies';
|
|
2
|
+
import { createAuthMiddleware } from 'better-auth/api';
|
|
3
|
+
import { prepareSessionData } from './prepare-session-data';
|
|
4
|
+
/**
|
|
5
|
+
* Sets up a middleware that enforces the saveToJwt configuration when setting session data.
|
|
6
|
+
* This ensures that only fields specified in saveToJwt are included in the cookie cache
|
|
7
|
+
* for both user and session objects.
|
|
8
|
+
*
|
|
9
|
+
* The middleware runs after authentication and filters the session data based on
|
|
10
|
+
* the collection configurations before storing it in the cookie cache.
|
|
11
|
+
*/ export function respectSaveToJwtFieldsMiddleware({ sanitizedOptions, payloadConfig, pluginOptions }) {
|
|
12
|
+
if (typeof sanitizedOptions.hooks !== 'object') sanitizedOptions.hooks = {};
|
|
13
|
+
sanitizedOptions.hooks.after = createAuthMiddleware(async (ctx)=>{
|
|
14
|
+
const newSession = ctx.context?.newSession;
|
|
15
|
+
if (!newSession) return;
|
|
16
|
+
const filteredSessionData = await prepareSessionData({
|
|
17
|
+
newSession,
|
|
18
|
+
payloadConfig,
|
|
19
|
+
collectionSlugs: {
|
|
20
|
+
userCollectionSlug: pluginOptions.users?.slug ?? 'users',
|
|
21
|
+
sessionCollectionSlug: pluginOptions.sessions?.slug ?? 'sessions'
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
if (filteredSessionData) {
|
|
25
|
+
await setCookieCache(ctx, filteredSessionData);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=respect-save-to-jwt-fields-middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/plugin/lib/respect-save-to-jwt-fields-middleware.ts"],"sourcesContent":["import { setCookieCache } from 'better-auth/cookies'\nimport { createAuthMiddleware } from 'better-auth/api'\nimport type { SanitizedBetterAuthOptions, PayloadBetterAuthPluginOptions } from '..'\nimport type { Config, Payload } from 'payload'\nimport { prepareSessionData } from './prepare-session-data'\n\n/**\n * Sets up a middleware that enforces the saveToJwt configuration when setting session data.\n * This ensures that only fields specified in saveToJwt are included in the cookie cache\n * for both user and session objects.\n *\n * The middleware runs after authentication and filters the session data based on\n * the collection configurations before storing it in the cookie cache.\n */\nexport function respectSaveToJwtFieldsMiddleware({\n sanitizedOptions,\n payloadConfig,\n pluginOptions,\n}: {\n sanitizedOptions: SanitizedBetterAuthOptions\n payloadConfig: Payload['config'] | Config\n pluginOptions: PayloadBetterAuthPluginOptions\n}) {\n if (typeof sanitizedOptions.hooks !== 'object') sanitizedOptions.hooks = {}\n\n sanitizedOptions.hooks.after = createAuthMiddleware(async (ctx) => {\n const newSession = ctx.context?.newSession\n if (!newSession) return\n\n const filteredSessionData = await prepareSessionData({\n newSession,\n payloadConfig,\n collectionSlugs: {\n userCollectionSlug: pluginOptions.users?.slug ?? 'users',\n sessionCollectionSlug: pluginOptions.sessions?.slug ?? 'sessions',\n },\n })\n\n if (filteredSessionData) {\n await setCookieCache(ctx, filteredSessionData as any)\n }\n })\n}\n"],"names":["setCookieCache","createAuthMiddleware","prepareSessionData","respectSaveToJwtFieldsMiddleware","sanitizedOptions","payloadConfig","pluginOptions","hooks","after","ctx","newSession","context","filteredSessionData","collectionSlugs","userCollectionSlug","users","slug","sessionCollectionSlug","sessions"],"mappings":"AAAA,SAASA,cAAc,QAAQ,sBAAqB;AACpD,SAASC,oBAAoB,QAAQ,kBAAiB;AAGtD,SAASC,kBAAkB,QAAQ,yBAAwB;AAE3D;;;;;;;CAOC,GACD,OAAO,SAASC,iCAAiC,EAC/CC,gBAAgB,EAChBC,aAAa,EACbC,aAAa,EAKd;IACC,IAAI,OAAOF,iBAAiBG,KAAK,KAAK,UAAUH,iBAAiBG,KAAK,GAAG,CAAC;IAE1EH,iBAAiBG,KAAK,CAACC,KAAK,GAAGP,qBAAqB,OAAOQ;QACzD,MAAMC,aAAaD,IAAIE,OAAO,EAAED;QAChC,IAAI,CAACA,YAAY;QAEjB,MAAME,sBAAsB,MAAMV,mBAAmB;YACnDQ;YACAL;YACAQ,iBAAiB;gBACfC,oBAAoBR,cAAcS,KAAK,EAAEC,QAAQ;gBACjDC,uBAAuBX,cAAcY,QAAQ,EAAEF,QAAQ;YACzD;QACF;QAEA,IAAIJ,qBAAqB;YACvB,MAAMZ,eAAeS,KAAKG;QAC5B;IACF;AACF"}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { supportedBetterAuthPluginIds, betterAuthPluginSlugs, baseCollectionSlugs } from './config';
|
|
2
|
+
import { ensurePasswordSetBeforeUserCreate } from './ensure-password-set-before-create';
|
|
3
|
+
import { verifyPassword, hashPassword } from './password';
|
|
4
|
+
/**
|
|
5
|
+
* Sanitizes the BetterAuth options
|
|
6
|
+
*/ export function sanitizeBetterAuthOptions(options) {
|
|
7
|
+
const baOptions = options.betterAuthOptions;
|
|
8
|
+
const userCollectionSlug = options.users?.slug ?? 'users';
|
|
9
|
+
const accountCollectionSlug = options.accounts?.slug ?? 'accounts';
|
|
10
|
+
const sessionCollectionSlug = options.sessions?.slug ?? 'sessions';
|
|
11
|
+
const verificationCollectionSlug = options.verifications?.slug ?? 'verifications';
|
|
12
|
+
const res = {
|
|
13
|
+
...baOptions
|
|
14
|
+
};
|
|
15
|
+
res.user = {
|
|
16
|
+
...baOptions?.user ?? {},
|
|
17
|
+
modelName: userCollectionSlug
|
|
18
|
+
};
|
|
19
|
+
res.account = {
|
|
20
|
+
...baOptions?.account ?? {},
|
|
21
|
+
modelName: accountCollectionSlug,
|
|
22
|
+
fields: {
|
|
23
|
+
userId: 'user'
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
res.session = {
|
|
27
|
+
...baOptions?.session ?? {},
|
|
28
|
+
modelName: sessionCollectionSlug,
|
|
29
|
+
fields: {
|
|
30
|
+
userId: 'user'
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
res.verification = {
|
|
34
|
+
...baOptions?.verification ?? {},
|
|
35
|
+
modelName: verificationCollectionSlug
|
|
36
|
+
};
|
|
37
|
+
res.emailAndPassword = {
|
|
38
|
+
...baOptions?.emailAndPassword ?? {},
|
|
39
|
+
enabled: baOptions?.emailAndPassword?.enabled ?? true
|
|
40
|
+
};
|
|
41
|
+
if (res.emailAndPassword.enabled) {
|
|
42
|
+
res.emailAndPassword.password = {
|
|
43
|
+
...res.emailAndPassword.password ?? {},
|
|
44
|
+
verify: async ({ hash, password })=>{
|
|
45
|
+
return await verifyPassword({
|
|
46
|
+
hash,
|
|
47
|
+
password
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
hash: async (password)=>{
|
|
51
|
+
return await hashPassword(password);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if (Boolean(options.users?.blockFirstBetterAuthVerificationEmail)) {
|
|
56
|
+
const originalSendVerificationEmail = baOptions?.emailVerification?.sendVerificationEmail;
|
|
57
|
+
// Only override sendVerificationEmail if the developer provided their own implementation
|
|
58
|
+
if (typeof originalSendVerificationEmail === 'function') {
|
|
59
|
+
res.emailVerification = res?.emailVerification || {};
|
|
60
|
+
res.emailVerification.sendVerificationEmail = async (data, request)=>{
|
|
61
|
+
try {
|
|
62
|
+
const user = data.user;
|
|
63
|
+
const createdAt = new Date(user.createdAt);
|
|
64
|
+
const now = new Date();
|
|
65
|
+
// If the user was created less than one minute ago, don't send the verification email
|
|
66
|
+
// as we rely on payload to send the initial email
|
|
67
|
+
if (now.getTime() - createdAt.getTime() < 60000) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
await originalSendVerificationEmail(data, request);
|
|
71
|
+
} catch (error) {
|
|
72
|
+
console.error('Error sending verification email:', error);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
ensurePasswordSetBeforeUserCreate(res);
|
|
78
|
+
if (res.plugins) {
|
|
79
|
+
try {
|
|
80
|
+
const supportedPlugins = res.plugins.filter((plugin)=>{
|
|
81
|
+
return Object.values(supportedBetterAuthPluginIds).includes(plugin.id);
|
|
82
|
+
});
|
|
83
|
+
if (supportedPlugins.length !== res.plugins.length) {
|
|
84
|
+
console.warn(`Unsupported BetterAuth plugins detected: ${res.plugins.filter((p)=>!Object.values(supportedBetterAuthPluginIds).includes(p.id)).map((p)=>p.id).join(', ')}. Supported plugins are: ${Object.values(supportedBetterAuthPluginIds).join(', ')}.
|
|
85
|
+
These plugins will be ignored.`);
|
|
86
|
+
}
|
|
87
|
+
// Add the schema to the supported plugins
|
|
88
|
+
if (supportedPlugins.length > 0) {
|
|
89
|
+
supportedPlugins.forEach((plugin)=>{
|
|
90
|
+
const pluginId = plugin.id;
|
|
91
|
+
switch(pluginId){
|
|
92
|
+
case supportedBetterAuthPluginIds.admin:
|
|
93
|
+
const adminPlugin = plugin;
|
|
94
|
+
if (!adminPlugin.adminRoles) adminPlugin.adminRoles = options.users?.adminRoles ?? [
|
|
95
|
+
'admin'
|
|
96
|
+
];
|
|
97
|
+
adminPlugin.adminRoles = options.users?.adminRoles ?? [
|
|
98
|
+
'admin'
|
|
99
|
+
];
|
|
100
|
+
Object.assign(plugin, adminPlugin);
|
|
101
|
+
break;
|
|
102
|
+
case supportedBetterAuthPluginIds.apiKey:
|
|
103
|
+
const apiKeyPlugin = plugin;
|
|
104
|
+
if (!apiKeyPlugin.schema) apiKeyPlugin.schema = {};
|
|
105
|
+
if (!apiKeyPlugin.schema.apikey) apiKeyPlugin.schema.apikey = {};
|
|
106
|
+
apiKeyPlugin.schema.apikey = {
|
|
107
|
+
...apiKeyPlugin.schema.apikey,
|
|
108
|
+
modelName: betterAuthPluginSlugs.apiKeys,
|
|
109
|
+
fields: {
|
|
110
|
+
...plugin.schema?.apikey?.fields ?? {},
|
|
111
|
+
userId: {
|
|
112
|
+
...plugin.schema?.apikey?.fields?.userId ?? {},
|
|
113
|
+
fieldName: 'user'
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
Object.assign(plugin, apiKeyPlugin);
|
|
118
|
+
break;
|
|
119
|
+
case supportedBetterAuthPluginIds.passkey:
|
|
120
|
+
const passkeyPlugin = plugin;
|
|
121
|
+
if (!passkeyPlugin.schema) passkeyPlugin.schema = {};
|
|
122
|
+
if (!passkeyPlugin.schema.passkey) passkeyPlugin.schema.passkey = {};
|
|
123
|
+
passkeyPlugin.schema.passkey = {
|
|
124
|
+
...passkeyPlugin.schema.passkey,
|
|
125
|
+
modelName: betterAuthPluginSlugs.passkeys,
|
|
126
|
+
fields: {
|
|
127
|
+
...passkeyPlugin.schema.passkey.fields || {},
|
|
128
|
+
userId: {
|
|
129
|
+
...passkeyPlugin.schema.passkey.fields.userId,
|
|
130
|
+
fieldName: 'user'
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
Object.assign(plugin, passkeyPlugin);
|
|
135
|
+
break;
|
|
136
|
+
case supportedBetterAuthPluginIds.organization:
|
|
137
|
+
const organizationPlugin = plugin;
|
|
138
|
+
if (!organizationPlugin.schema) organizationPlugin.schema = {};
|
|
139
|
+
if (!organizationPlugin.schema.organization) organizationPlugin.schema.member = {};
|
|
140
|
+
if (!organizationPlugin.schema.invitation) organizationPlugin.schema.invitation = {};
|
|
141
|
+
if (!organizationPlugin.schema.team) organizationPlugin.schema.team = {};
|
|
142
|
+
if (!organizationPlugin.schema.session) organizationPlugin.schema.session = {};
|
|
143
|
+
organizationPlugin.schema = {
|
|
144
|
+
...organizationPlugin.schema,
|
|
145
|
+
organization: {
|
|
146
|
+
...organizationPlugin.schema.organization,
|
|
147
|
+
modelName: betterAuthPluginSlugs.organizations,
|
|
148
|
+
fields: {
|
|
149
|
+
...organizationPlugin.schema.organization.fields ?? {}
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
member: {
|
|
153
|
+
...organizationPlugin.schema.member,
|
|
154
|
+
modelName: betterAuthPluginSlugs.members,
|
|
155
|
+
fields: {
|
|
156
|
+
...organizationPlugin.schema.member.fields ?? {},
|
|
157
|
+
organizationId: {
|
|
158
|
+
...organizationPlugin.schema.member.fields?.organizationId ?? {},
|
|
159
|
+
fieldName: 'organization'
|
|
160
|
+
},
|
|
161
|
+
userId: {
|
|
162
|
+
...organizationPlugin.schema.member.fields?.userId ?? {},
|
|
163
|
+
fieldName: 'user'
|
|
164
|
+
},
|
|
165
|
+
teamId: {
|
|
166
|
+
...organizationPlugin.schema.member.fields?.teamId ?? {},
|
|
167
|
+
fieldName: 'team'
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
invitation: {
|
|
172
|
+
...organizationPlugin.schema.invitation,
|
|
173
|
+
modelName: betterAuthPluginSlugs.invitations,
|
|
174
|
+
fields: {
|
|
175
|
+
...organizationPlugin.schema.invitation.fields ?? {},
|
|
176
|
+
organizationId: {
|
|
177
|
+
...organizationPlugin.schema.invitation.fields?.organizationId ?? {},
|
|
178
|
+
fieldName: 'organization'
|
|
179
|
+
},
|
|
180
|
+
inviterId: {
|
|
181
|
+
...organizationPlugin.schema.invitation.fields?.inviterId ?? {},
|
|
182
|
+
fieldName: 'inviter'
|
|
183
|
+
},
|
|
184
|
+
teamId: {
|
|
185
|
+
...organizationPlugin.schema.invitation.fields?.teamId ?? {},
|
|
186
|
+
fieldName: 'team'
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
},
|
|
190
|
+
team: {
|
|
191
|
+
...organizationPlugin.schema.team,
|
|
192
|
+
modelName: betterAuthPluginSlugs.teams,
|
|
193
|
+
fields: {
|
|
194
|
+
...organizationPlugin.schema.team.fields ?? {},
|
|
195
|
+
organizationId: {
|
|
196
|
+
...organizationPlugin.schema.team.fields?.organizationId ?? {},
|
|
197
|
+
fieldName: 'organization'
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
session: {
|
|
202
|
+
...organizationPlugin.schema.session,
|
|
203
|
+
modelName: baseCollectionSlugs.sessions,
|
|
204
|
+
fields: {
|
|
205
|
+
...organizationPlugin.schema.session.fields ?? {},
|
|
206
|
+
activeOrganizationId: {
|
|
207
|
+
...organizationPlugin.schema.session.fields?.activeOrganizationId ?? {},
|
|
208
|
+
fieldName: 'activeOrganization'
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
};
|
|
213
|
+
Object.assign(plugin, organizationPlugin);
|
|
214
|
+
break;
|
|
215
|
+
case supportedBetterAuthPluginIds.sso:
|
|
216
|
+
const ssoPlugin = plugin;
|
|
217
|
+
if (!ssoPlugin.schema) ssoPlugin.schema = {};
|
|
218
|
+
if (!ssoPlugin.schema.sso) ssoPlugin.schema.sso = {};
|
|
219
|
+
ssoPlugin.schema.sso = {
|
|
220
|
+
...ssoPlugin.schema.sso,
|
|
221
|
+
modelName: betterAuthPluginSlugs.ssoProviders,
|
|
222
|
+
fields: {
|
|
223
|
+
...ssoPlugin.schema.sso.fields ?? {},
|
|
224
|
+
userId: {
|
|
225
|
+
...ssoPlugin.schema.sso.fields?.userId ?? {},
|
|
226
|
+
fieldName: 'user'
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
Object.assign(plugin, ssoPlugin);
|
|
231
|
+
break;
|
|
232
|
+
case supportedBetterAuthPluginIds.oidc:
|
|
233
|
+
const oidcPlugin = plugin;
|
|
234
|
+
if (!oidcPlugin.schema) oidcPlugin.schema = {};
|
|
235
|
+
if (!oidcPlugin.schema.oauthApplication) oidcPlugin.schema.oauthApplication = {};
|
|
236
|
+
if (!oidcPlugin.schema.oauthAccessToken) oidcPlugin.schema.oauthAccessToken = {};
|
|
237
|
+
if (!oidcPlugin.schema.oauthConsent) oidcPlugin.schema.oauthConsent = {};
|
|
238
|
+
oidcPlugin.schema = {
|
|
239
|
+
...oidcPlugin.schema,
|
|
240
|
+
oauthApplication: {
|
|
241
|
+
...oidcPlugin.schema.oauthApplication,
|
|
242
|
+
modelName: betterAuthPluginSlugs.oauthApplications,
|
|
243
|
+
fields: {
|
|
244
|
+
...oidcPlugin.schema.oauthApplication.fields ?? {},
|
|
245
|
+
userId: {
|
|
246
|
+
...oidcPlugin.schema.oauthApplication.fields?.userId ?? {},
|
|
247
|
+
fieldName: 'user'
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
oauthAccessToken: {
|
|
252
|
+
...oidcPlugin.schema.oauthAccessToken,
|
|
253
|
+
modelName: betterAuthPluginSlugs.oauthAccessTokens,
|
|
254
|
+
fields: {
|
|
255
|
+
...oidcPlugin.schema.oauthAccessToken.fields ?? {},
|
|
256
|
+
userId: {
|
|
257
|
+
...oidcPlugin.schema.oauthAccessToken.fields?.userId ?? {},
|
|
258
|
+
fieldName: 'user'
|
|
259
|
+
},
|
|
260
|
+
clientId: {
|
|
261
|
+
...oidcPlugin.schema.oauthAccessToken.fields?.clientId ?? {},
|
|
262
|
+
fieldName: 'client'
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
},
|
|
266
|
+
oauthConsent: {
|
|
267
|
+
...oidcPlugin.schema.oauthConsent,
|
|
268
|
+
modelName: betterAuthPluginSlugs.oauthConsents,
|
|
269
|
+
fields: {
|
|
270
|
+
...oidcPlugin.schema.oauthConsent.fields ?? {},
|
|
271
|
+
userId: {
|
|
272
|
+
...oidcPlugin.schema.oauthConsent.fields?.userId ?? {},
|
|
273
|
+
fieldName: 'user'
|
|
274
|
+
},
|
|
275
|
+
clientId: {
|
|
276
|
+
...oidcPlugin.schema.oauthConsent.fields?.clientId ?? {},
|
|
277
|
+
fieldName: 'client'
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
Object.assign(plugin, oidcPlugin);
|
|
283
|
+
break;
|
|
284
|
+
default:
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
// Make sure only the supported plugins are used
|
|
290
|
+
Object.assign(res.plugins, supportedPlugins);
|
|
291
|
+
} catch (error) {
|
|
292
|
+
throw new Error(`Error sanitizing BetterAuth plugins: ${error}`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return res;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
//# sourceMappingURL=sanitize-auth-options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/plugin/lib/sanitize-auth-options.ts"],"sourcesContent":["import type { PayloadBetterAuthPluginOptions, SanitizedBetterAuthOptions } from '..'\nimport { supportedBetterAuthPluginIds, betterAuthPluginSlugs, baseCollectionSlugs } from './config'\nimport { ensurePasswordSetBeforeUserCreate } from './ensure-password-set-before-create'\nimport { verifyPassword, hashPassword } from './password'\n\n/**\n * Sanitizes the BetterAuth options\n */\nexport function sanitizeBetterAuthOptions(\n options: PayloadBetterAuthPluginOptions,\n): SanitizedBetterAuthOptions {\n const baOptions = options.betterAuthOptions\n const userCollectionSlug = options.users?.slug ?? 'users'\n const accountCollectionSlug = options.accounts?.slug ?? 'accounts'\n const sessionCollectionSlug = options.sessions?.slug ?? 'sessions'\n const verificationCollectionSlug = options.verifications?.slug ?? 'verifications'\n\n const res: SanitizedBetterAuthOptions = { ...baOptions }\n\n res.user = {\n ...(baOptions?.user ?? {}),\n modelName: userCollectionSlug,\n }\n\n res.account = {\n ...(baOptions?.account ?? {}),\n modelName: accountCollectionSlug,\n fields: {\n userId: 'user',\n },\n }\n\n res.session = {\n ...(baOptions?.session ?? {}),\n modelName: sessionCollectionSlug,\n fields: {\n userId: 'user',\n },\n }\n\n res.verification = {\n ...(baOptions?.verification ?? {}),\n modelName: verificationCollectionSlug,\n }\n\n res.emailAndPassword = {\n ...(baOptions?.emailAndPassword ?? {}),\n enabled: baOptions?.emailAndPassword?.enabled ?? true,\n }\n\n if (res.emailAndPassword.enabled) {\n res.emailAndPassword.password = {\n ...(res.emailAndPassword.password ?? {}),\n verify: async ({ hash, password }) => {\n return await verifyPassword({ hash, password })\n },\n hash: async (password) => {\n return await hashPassword(password)\n },\n }\n }\n\n if (Boolean(options.users?.blockFirstBetterAuthVerificationEmail)) {\n const originalSendVerificationEmail = baOptions?.emailVerification?.sendVerificationEmail\n // Only override sendVerificationEmail if the developer provided their own implementation\n if (typeof originalSendVerificationEmail === 'function') {\n res.emailVerification = res?.emailVerification || {}\n res.emailVerification.sendVerificationEmail = async (data, request) => {\n try {\n const user = data.user\n const createdAt = new Date(user.createdAt)\n const now = new Date()\n // If the user was created less than one minute ago, don't send the verification email\n // as we rely on payload to send the initial email\n if (now.getTime() - createdAt.getTime() < 60000) {\n return\n }\n\n await originalSendVerificationEmail(data, request)\n } catch (error) {\n console.error('Error sending verification email:', error)\n }\n }\n }\n }\n\n ensurePasswordSetBeforeUserCreate(res)\n\n if (res.plugins) {\n try {\n const supportedPlugins = res.plugins.filter((plugin) => {\n return Object.values(supportedBetterAuthPluginIds).includes(\n plugin.id as (typeof supportedBetterAuthPluginIds)[keyof typeof supportedBetterAuthPluginIds],\n )\n })\n\n if (supportedPlugins.length !== res.plugins.length) {\n console.warn(\n `Unsupported BetterAuth plugins detected: ${res.plugins\n .filter(\n (p) =>\n !Object.values(supportedBetterAuthPluginIds).includes(\n p.id as (typeof supportedBetterAuthPluginIds)[keyof typeof supportedBetterAuthPluginIds],\n ),\n )\n .map((p) => p.id)\n .join(', ')}. Supported plugins are: ${Object.values(supportedBetterAuthPluginIds).join(\n ', ',\n )}. \n These plugins will be ignored.`,\n )\n }\n\n // Add the schema to the supported plugins\n if (supportedPlugins.length > 0) {\n supportedPlugins.forEach((plugin) => {\n const pluginId =\n plugin.id as (typeof supportedBetterAuthPluginIds)[keyof typeof supportedBetterAuthPluginIds]\n\n switch (pluginId) {\n case supportedBetterAuthPluginIds.admin:\n const adminPlugin = plugin as any\n if (!adminPlugin.adminRoles)\n adminPlugin.adminRoles = options.users?.adminRoles ?? ['admin']\n adminPlugin.adminRoles = options.users?.adminRoles ?? ['admin']\n Object.assign(plugin, adminPlugin)\n break\n case supportedBetterAuthPluginIds.apiKey:\n const apiKeyPlugin = plugin as any\n if (!apiKeyPlugin.schema) apiKeyPlugin.schema = {}\n if (!apiKeyPlugin.schema.apikey) apiKeyPlugin.schema.apikey = {}\n apiKeyPlugin.schema.apikey = {\n ...apiKeyPlugin.schema.apikey,\n modelName: betterAuthPluginSlugs.apiKeys,\n fields: {\n ...(plugin.schema?.apikey?.fields ?? {}),\n userId: {\n ...(plugin.schema?.apikey?.fields?.userId ?? {}),\n fieldName: 'user',\n },\n },\n }\n Object.assign(plugin, apiKeyPlugin)\n break\n case supportedBetterAuthPluginIds.passkey:\n const passkeyPlugin = plugin as any\n if (!passkeyPlugin.schema) passkeyPlugin.schema = {}\n if (!passkeyPlugin.schema.passkey) passkeyPlugin.schema.passkey = {}\n passkeyPlugin.schema.passkey = {\n ...passkeyPlugin.schema.passkey,\n modelName: betterAuthPluginSlugs.passkeys,\n fields: {\n ...(passkeyPlugin.schema.passkey.fields || {}),\n userId: {\n ...passkeyPlugin.schema.passkey.fields.userId,\n fieldName: 'user',\n },\n },\n }\n Object.assign(plugin, passkeyPlugin)\n break\n case supportedBetterAuthPluginIds.organization:\n const organizationPlugin = plugin as any\n if (!organizationPlugin.schema) organizationPlugin.schema = {}\n if (!organizationPlugin.schema.organization) organizationPlugin.schema.member = {}\n if (!organizationPlugin.schema.invitation) organizationPlugin.schema.invitation = {}\n if (!organizationPlugin.schema.team) organizationPlugin.schema.team = {}\n if (!organizationPlugin.schema.session) organizationPlugin.schema.session = {}\n organizationPlugin.schema = {\n ...organizationPlugin.schema,\n organization: {\n ...organizationPlugin.schema.organization,\n modelName: betterAuthPluginSlugs.organizations,\n fields: {\n ...(organizationPlugin.schema.organization.fields ?? {}),\n },\n },\n member: {\n ...organizationPlugin.schema.member,\n modelName: betterAuthPluginSlugs.members,\n fields: {\n ...(organizationPlugin.schema.member.fields ?? {}),\n organizationId: {\n ...(organizationPlugin.schema.member.fields?.organizationId ?? {}),\n fieldName: 'organization',\n },\n userId: {\n ...(organizationPlugin.schema.member.fields?.userId ?? {}),\n fieldName: 'user',\n },\n teamId: {\n ...(organizationPlugin.schema.member.fields?.teamId ?? {}),\n fieldName: 'team',\n },\n },\n },\n invitation: {\n ...organizationPlugin.schema.invitation,\n modelName: betterAuthPluginSlugs.invitations,\n fields: {\n ...(organizationPlugin.schema.invitation.fields ?? {}),\n organizationId: {\n ...(organizationPlugin.schema.invitation.fields?.organizationId ?? {}),\n fieldName: 'organization',\n },\n inviterId: {\n ...(organizationPlugin.schema.invitation.fields?.inviterId ?? {}),\n fieldName: 'inviter',\n },\n teamId: {\n ...(organizationPlugin.schema.invitation.fields?.teamId ?? {}),\n fieldName: 'team',\n },\n },\n },\n team: {\n ...organizationPlugin.schema.team,\n modelName: betterAuthPluginSlugs.teams,\n fields: {\n ...(organizationPlugin.schema.team.fields ?? {}),\n organizationId: {\n ...(organizationPlugin.schema.team.fields?.organizationId ?? {}),\n fieldName: 'organization',\n },\n },\n },\n session: {\n ...organizationPlugin.schema.session,\n modelName: baseCollectionSlugs.sessions,\n fields: {\n ...(organizationPlugin.schema.session.fields ?? {}),\n activeOrganizationId: {\n ...(organizationPlugin.schema.session.fields?.activeOrganizationId ?? {}),\n fieldName: 'activeOrganization',\n },\n },\n },\n }\n Object.assign(plugin, organizationPlugin)\n break\n case supportedBetterAuthPluginIds.sso:\n const ssoPlugin = plugin as any\n if (!ssoPlugin.schema) ssoPlugin.schema = {}\n if (!ssoPlugin.schema.sso) ssoPlugin.schema.sso = {}\n ssoPlugin.schema.sso = {\n ...ssoPlugin.schema.sso,\n modelName: betterAuthPluginSlugs.ssoProviders,\n fields: {\n ...(ssoPlugin.schema.sso.fields ?? {}),\n userId: {\n ...(ssoPlugin.schema.sso.fields?.userId ?? {}),\n fieldName: 'user',\n },\n },\n }\n Object.assign(plugin, ssoPlugin)\n break\n case supportedBetterAuthPluginIds.oidc:\n const oidcPlugin = plugin as any\n if (!oidcPlugin.schema) oidcPlugin.schema = {}\n if (!oidcPlugin.schema.oauthApplication) oidcPlugin.schema.oauthApplication = {}\n if (!oidcPlugin.schema.oauthAccessToken) oidcPlugin.schema.oauthAccessToken = {}\n if (!oidcPlugin.schema.oauthConsent) oidcPlugin.schema.oauthConsent = {}\n oidcPlugin.schema = {\n ...oidcPlugin.schema,\n oauthApplication: {\n ...oidcPlugin.schema.oauthApplication,\n modelName: betterAuthPluginSlugs.oauthApplications,\n fields: {\n ...(oidcPlugin.schema.oauthApplication.fields ?? {}),\n userId: {\n ...(oidcPlugin.schema.oauthApplication.fields?.userId ?? {}),\n fieldName: 'user',\n },\n },\n },\n oauthAccessToken: {\n ...oidcPlugin.schema.oauthAccessToken,\n modelName: betterAuthPluginSlugs.oauthAccessTokens,\n fields: {\n ...(oidcPlugin.schema.oauthAccessToken.fields ?? {}),\n userId: {\n ...(oidcPlugin.schema.oauthAccessToken.fields?.userId ?? {}),\n fieldName: 'user',\n },\n clientId: {\n ...(oidcPlugin.schema.oauthAccessToken.fields?.clientId ?? {}),\n fieldName: 'client',\n },\n },\n },\n oauthConsent: {\n ...oidcPlugin.schema.oauthConsent,\n modelName: betterAuthPluginSlugs.oauthConsents,\n fields: {\n ...(oidcPlugin.schema.oauthConsent.fields ?? {}),\n userId: {\n ...(oidcPlugin.schema.oauthConsent.fields?.userId ?? {}),\n fieldName: 'user',\n },\n clientId: {\n ...(oidcPlugin.schema.oauthConsent.fields?.clientId ?? {}),\n fieldName: 'client',\n },\n },\n },\n }\n Object.assign(plugin, oidcPlugin)\n break\n default:\n break\n }\n })\n }\n // Make sure only the supported plugins are used\n Object.assign(res.plugins, supportedPlugins)\n } catch (error) {\n throw new Error(`Error sanitizing BetterAuth plugins: ${error}`)\n }\n }\n\n return res\n}\n"],"names":["supportedBetterAuthPluginIds","betterAuthPluginSlugs","baseCollectionSlugs","ensurePasswordSetBeforeUserCreate","verifyPassword","hashPassword","sanitizeBetterAuthOptions","options","baOptions","betterAuthOptions","userCollectionSlug","users","slug","accountCollectionSlug","accounts","sessionCollectionSlug","sessions","verificationCollectionSlug","verifications","res","user","modelName","account","fields","userId","session","verification","emailAndPassword","enabled","password","verify","hash","Boolean","blockFirstBetterAuthVerificationEmail","originalSendVerificationEmail","emailVerification","sendVerificationEmail","data","request","createdAt","Date","now","getTime","error","console","plugins","supportedPlugins","filter","plugin","Object","values","includes","id","length","warn","p","map","join","forEach","pluginId","admin","adminPlugin","adminRoles","assign","apiKey","apiKeyPlugin","schema","apikey","apiKeys","fieldName","passkey","passkeyPlugin","passkeys","organization","organizationPlugin","member","invitation","team","organizations","members","organizationId","teamId","invitations","inviterId","teams","activeOrganizationId","sso","ssoPlugin","ssoProviders","oidc","oidcPlugin","oauthApplication","oauthAccessToken","oauthConsent","oauthApplications","oauthAccessTokens","clientId","oauthConsents","Error"],"mappings":"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"}
|