@payload-auth/better-auth-plugin
Version:
A Payload CMS plugin for Better Auth
255 lines (254 loc) • 14.4 kB
JavaScript
import { supportedBetterAuthPluginIds, betterAuthPluginSlugs, baseCollectionSlugs } from './config.js';
/**
* Sanitizes the BetterAuth options
*/ export function sanitizeBetterAuthOptions(options) {
const baOptions = options.betterAuthOptions;
const userCollectionSlug = options.users?.slug ?? 'users';
const accountCollectionSlug = options.accounts?.slug ?? 'accounts';
const sessionCollectionSlug = options.sessions?.slug ?? 'sessions';
const verificationCollectionSlug = options.verifications?.slug ?? 'verifications';
const res = {
...baOptions
};
res.user = {
...baOptions?.user ?? {},
modelName: userCollectionSlug
};
res.account = {
...baOptions?.account ?? {},
modelName: accountCollectionSlug,
fields: {
userId: 'user'
}
};
res.session = {
...baOptions?.session ?? {},
modelName: sessionCollectionSlug,
fields: {
userId: 'user'
}
};
res.verification = {
...baOptions?.verification ?? {},
modelName: verificationCollectionSlug
};
if (res.plugins) {
try {
const supportedPlugins = res.plugins.filter((plugin)=>{
return Object.values(supportedBetterAuthPluginIds).includes(plugin.id);
});
if (supportedPlugins.length !== res.plugins.length) {
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(', ')}.
These plugins will be ignored.`);
}
// Add the schema to the supported plugins
if (supportedPlugins.length > 0) {
supportedPlugins.forEach((plugin)=>{
const pluginId = plugin.id;
switch(pluginId){
case supportedBetterAuthPluginIds.admin:
const adminPlugin = plugin;
if (!adminPlugin.adminRoles) adminPlugin.adminRoles = options.users?.adminRoles ?? [
'admin'
];
adminPlugin.adminRoles = options.users?.adminRoles ?? [
'admin'
];
Object.assign(plugin, adminPlugin);
break;
case supportedBetterAuthPluginIds.apiKey:
const apiKeyPlugin = plugin;
if (!apiKeyPlugin.schema) apiKeyPlugin.schema = {};
if (!apiKeyPlugin.schema.apikey) apiKeyPlugin.schema.apikey = {};
apiKeyPlugin.schema.apikey = {
...apiKeyPlugin.schema.apikey,
modelName: betterAuthPluginSlugs.apiKeys,
fields: {
...plugin.schema?.apikey?.fields ?? {},
userId: {
...plugin.schema?.apikey?.fields?.userId ?? {},
fieldName: 'user'
}
}
};
Object.assign(plugin, apiKeyPlugin);
break;
case supportedBetterAuthPluginIds.passkey:
const passkeyPlugin = plugin;
if (!passkeyPlugin.schema) passkeyPlugin.schema = {};
if (!passkeyPlugin.schema.passkey) passkeyPlugin.schema.passkey = {};
passkeyPlugin.schema.passkey = {
...passkeyPlugin.schema.passkey,
modelName: betterAuthPluginSlugs.passkeys,
fields: {
...passkeyPlugin.schema.passkey.fields || {},
userId: {
...passkeyPlugin.schema.passkey.fields.userId,
fieldName: 'user'
}
}
};
Object.assign(plugin, passkeyPlugin);
break;
case supportedBetterAuthPluginIds.organization:
const organizationPlugin = plugin;
if (!organizationPlugin.schema) organizationPlugin.schema = {};
if (!organizationPlugin.schema.organization) organizationPlugin.schema.member = {};
if (!organizationPlugin.schema.invitation) organizationPlugin.schema.invitation = {};
if (!organizationPlugin.schema.team) organizationPlugin.schema.team = {};
if (!organizationPlugin.schema.session) organizationPlugin.schema.session = {};
organizationPlugin.schema = {
...organizationPlugin.schema,
organization: {
...organizationPlugin.schema.organization,
modelName: betterAuthPluginSlugs.organizations,
fields: {
...organizationPlugin.schema.organization.fields ?? {}
}
},
member: {
...organizationPlugin.schema.member,
modelName: betterAuthPluginSlugs.members,
fields: {
...organizationPlugin.schema.member.fields ?? {},
organizationId: {
...organizationPlugin.schema.member.fields?.organizationId ?? {},
fieldName: 'organization'
},
userId: {
...organizationPlugin.schema.member.fields?.userId ?? {},
fieldName: 'user'
},
teamId: {
...organizationPlugin.schema.member.fields?.teamId ?? {},
fieldName: 'team'
}
}
},
invitation: {
...organizationPlugin.schema.invitation,
modelName: betterAuthPluginSlugs.invitations,
fields: {
...organizationPlugin.schema.invitation.fields ?? {},
organizationId: {
...organizationPlugin.schema.invitation.fields?.organizationId ?? {},
fieldName: 'organization'
},
inviterId: {
...organizationPlugin.schema.invitation.fields?.inviterId ?? {},
fieldName: 'inviter'
},
teamId: {
...organizationPlugin.schema.invitation.fields?.teamId ?? {},
fieldName: 'team'
}
}
},
team: {
...organizationPlugin.schema.team,
modelName: betterAuthPluginSlugs.teams,
fields: {
...organizationPlugin.schema.team.fields ?? {},
organizationId: {
...organizationPlugin.schema.team.fields?.organizationId ?? {},
fieldName: 'organization'
}
}
},
session: {
...organizationPlugin.schema.session,
modelName: baseCollectionSlugs.sessions,
fields: {
...organizationPlugin.schema.session.fields ?? {},
activeOrganizationId: {
...organizationPlugin.schema.session.fields?.activeOrganizationId ?? {},
fieldName: 'activeOrganization'
}
}
}
};
Object.assign(plugin, organizationPlugin);
break;
case supportedBetterAuthPluginIds.sso:
const ssoPlugin = plugin;
if (!ssoPlugin.schema) ssoPlugin.schema = {};
if (!ssoPlugin.schema.sso) ssoPlugin.schema.sso = {};
ssoPlugin.schema.sso = {
...ssoPlugin.schema.sso,
modelName: betterAuthPluginSlugs.ssoProviders,
fields: {
...ssoPlugin.schema.sso.fields ?? {},
userId: {
...ssoPlugin.schema.sso.fields?.userId ?? {},
fieldName: 'user'
}
}
};
Object.assign(plugin, ssoPlugin);
break;
case supportedBetterAuthPluginIds.oidc:
const oidcPlugin = plugin;
if (!oidcPlugin.schema) oidcPlugin.schema = {};
if (!oidcPlugin.schema.oauthApplication) oidcPlugin.schema.oauthApplication = {};
if (!oidcPlugin.schema.oauthAccessToken) oidcPlugin.schema.oauthAccessToken = {};
if (!oidcPlugin.schema.oauthConsent) oidcPlugin.schema.oauthConsent = {};
oidcPlugin.schema = {
...oidcPlugin.schema,
oauthApplication: {
...oidcPlugin.schema.oauthApplication,
modelName: betterAuthPluginSlugs.oauthApplications,
fields: {
...oidcPlugin.schema.oauthApplication.fields ?? {},
userId: {
...oidcPlugin.schema.oauthApplication.fields?.userId ?? {},
fieldName: 'user'
}
}
},
oauthAccessToken: {
...oidcPlugin.schema.oauthAccessToken,
modelName: betterAuthPluginSlugs.oauthAccessTokens,
fields: {
...oidcPlugin.schema.oauthAccessToken.fields ?? {},
userId: {
...oidcPlugin.schema.oauthAccessToken.fields?.userId ?? {},
fieldName: 'user'
},
clientId: {
...oidcPlugin.schema.oauthAccessToken.fields?.clientId ?? {},
fieldName: 'client'
}
}
},
oauthConsent: {
...oidcPlugin.schema.oauthConsent,
modelName: betterAuthPluginSlugs.oauthConsents,
fields: {
...oidcPlugin.schema.oauthConsent.fields ?? {},
userId: {
...oidcPlugin.schema.oauthConsent.fields?.userId ?? {},
fieldName: 'user'
},
clientId: {
...oidcPlugin.schema.oauthConsent.fields?.clientId ?? {},
fieldName: 'client'
}
}
}
};
Object.assign(plugin, oidcPlugin);
break;
default:
break;
}
});
}
// Make sure only the supported plugins are used
Object.assign(res.plugins, supportedPlugins);
} catch (error) {
throw new Error(`Error sanitizing BetterAuth plugins: ${error}`);
}
}
return res;
}
//# sourceMappingURL=sanitize-auth-options.js.map