@payload-auth/better-auth-plugin
Version:
A Payload CMS plugin for Better Auth
109 lines (108 loc) • 4.19 kB
JavaScript
import { getPayload } from 'payload';
import { sanitizeBetterAuthOptions } from './lib/sanitize-auth-options.js';
import { getRequiredCollectionSlugs } from './lib/get-required-collection-slugs.js';
import { buildCollectionConfigs } from './lib/build-collection-configs.js';
import { payloadAdapter } from '@payload-auth/better-auth-db-adapter';
import { betterAuth } from 'better-auth';
export * from './types.js';
function initBetterAuth({ payload, options }) {
const auth = betterAuth({
...options,
database: payloadAdapter(payload, {
enableDebugLogs: options.enableDebugLogs ?? false
})
});
return auth;
}
export function payloadBetterAuth(pluginOptions) {
return (config)=>{
if (pluginOptions.disabled) {
return config;
}
if (!config.collections) {
config.collections = [];
}
const sanitzedBetterAuthOptions = sanitizeBetterAuthOptions(pluginOptions);
// Determine which collections to add based on the options and plugins
const requiredCollectionSlugs = getRequiredCollectionSlugs({
logTables: pluginOptions.logTables ?? false,
pluginOptions,
sanitizedBAOptions: sanitzedBetterAuthOptions
});
// Update with the required collections + existing collections
config.collections = buildCollectionConfigs({
incomingCollections: config.collections ?? [],
requiredCollectionSlugs,
pluginOptions,
sanitizedBAOptions: sanitzedBetterAuthOptions
});
// Initialize admin configuration with defaults using deep merge pattern
config.admin = {
...config.admin,
components: {
...config.admin?.components,
afterLogin: [
{
path: '@payload-auth/better-auth-plugin/rsc#LoginRedirect'
},
...config.admin?.components?.afterLogin || []
],
logout: {
Button: '@payload-auth/better-auth-plugin/client#LogoutButton'
},
views: {
...config.admin?.components?.views,
login: {
path: '/login',
Component: {
path: '@payload-auth/better-auth-plugin/rsc#Login',
serverProps: {
defaultAdminRole: pluginOptions.users?.adminRoles?.[0]
}
}
},
createFirstAdmin: {
path: '/create-first-admin',
Component: {
path: '@payload-auth/better-auth-plugin/rsc#CreateFirstAdmin',
serverProps: {
defaultAdminRole: pluginOptions.users?.adminRoles?.[0]
}
}
}
}
},
routes: {
...config.admin?.routes,
login: '/login-redirect'
}
};
const incomingOnInit = config.onInit;
config.onInit = async (payload)=>{
// Ensure we are executing any existing onInit functions before running our own.
if (incomingOnInit) {
await incomingOnInit(payload);
}
// Initialize and set the betterAuth instance
const auth = initBetterAuth({
payload,
options: {
...sanitzedBetterAuthOptions,
enableDebugLogs: pluginOptions.enableDebugLogs,
plugins: [
...sanitzedBetterAuthOptions.plugins ?? []
]
}
});
payload.betterAuth = auth;
};
return config;
};
}
export async function getPayloadWithAuth(config) {
const payload = await getPayload({
config
});
return payload;
}
//# sourceMappingURL=index.js.map