payload-authjs
Version:
A Payload CMS 3 plugin for Auth.js 5
72 lines (71 loc) • 3.68 kB
JavaScript
import NextAuth from "next-auth";
import { setAuthjsInstance } from "../authjs/getAuthjsInstance";
import { getProviderMetadata } from "../authjs/utils/config";
import { withPayloadAuthjs } from "../authjs/withPayloadAuthjs";
import { generateUsersCollection } from "./collection";
/**
* The Auth.js plugin for Payload CMS
*/ export const authjsPlugin = (pluginOptions)=>(incomingConfig)=>{
const config = {
...incomingConfig
};
// If the plugin is disabled, return the config as is
if (pluginOptions.enabled === false) {
return config;
}
// Generate users collection
config.collections = config.collections ?? [];
const collection = generateUsersCollection(config.collections, pluginOptions);
// Add the SignInButton component to the admin login page (only if the user collection is the admin user collection)
if (incomingConfig.admin?.user === collection.slug && pluginOptions.components?.SignInButton !== false) {
const signInButtonOptions = pluginOptions.components?.SignInButton;
config.admin = {
...config.admin,
components: {
...config.admin?.components,
providers: [
...config.admin?.components?.providers ?? [],
// Add the Auth.js SessionProvider to set the custom basePath
...pluginOptions.authjsConfig.basePath ? [
{
path: "next-auth/react#SessionProvider",
clientProps: {
basePath: pluginOptions.authjsConfig.basePath
}
}
] : []
],
afterLogin: [
...config.admin?.components?.afterLogin ?? [],
...pluginOptions.authjsConfig.providers.map((provider)=>getProviderMetadata(provider)).filter((provider)=>[
"oauth",
"oidc",
"webauthn"
].includes(provider.type)).map((provider)=>({
path: provider.type === "webauthn" ? "payload-authjs/components/webauthn#SignInButtonWebauthn" : "payload-authjs/components#SignInButton",
clientProps: {
icon: typeof signInButtonOptions?.icon === "function" ? signInButtonOptions.icon(provider) : signInButtonOptions?.icon,
text: typeof signInButtonOptions?.text === "function" ? signInButtonOptions.text(provider) : signInButtonOptions?.text,
provider
}
}))
]
}
};
}
config.onInit = async (payload)=>{
payload.logger.debug(`Initializing Auth.js instance for collection '${collection.slug}'`);
// Initialize Auth.js instance
const authjs = NextAuth(withPayloadAuthjs({
payload,
config: pluginOptions.authjsConfig,
collectionSlug: collection.slug
}));
// Expose Auth.js instance to the payload instance
setAuthjsInstance(payload, collection.slug, authjs);
// Execute the incoming onInit hook
await incomingConfig.onInit?.(payload);
};
return config;
};
//# sourceMappingURL=plugin.js.map