payload-authjs
Version:
A Payload CMS 3 plugin for Auth.js 5
171 lines (170 loc) • 5.45 kB
JavaScript
/**
* Transform payload objects and adapter objects back and forth
*
* @see https://authjs.dev/guides/creating-a-database-adapter#official-adapter-guidelines
*/ export const transform = {
user: {
/**
* Modifications:
* - ~`accounts`~
* - ~`sessions`~
* - ~`verificationTokens`~
* - ~`authenticators`~
*/ toAdapter: (user)=>{
const userWithoutRelations = omit(user, [
"accounts",
"sessions",
"verificationTokens",
"authenticators"
]);
return {
emailVerified: null,
...transformPayloadObjectToAdapterObject(userWithoutRelations)
};
},
/**
* No modifications
*/ fromAdapter: (adapterUser)=>{
return transformAdapterObjectToPayloadObject(adapterUser);
},
/**
* No modifications
*/ fromPartialAdapter: (adapterUser)=>{
return transformAdapterObjectToPayloadObject(adapterUser);
}
},
account: {
/**
* Modifications:
* - `user.id` --> `userId`
*/ toAdapter: (user, account)=>{
return {
userId: user.id,
...transformPayloadObjectToAdapterObject(account)
};
},
/**
* Modifications:
* - ~`userId`~
*/ fromAdapter: (adapterAccount)=>{
return transformAdapterObjectToPayloadObject(omit(adapterAccount, [
"userId"
]));
}
},
session: {
toAdapter: (user, session)=>{
return {
userId: user.id,
...transformPayloadObjectToAdapterObject(session)
};
},
/**
* Modifications:
* - ~`userId`~
*/ fromAdapter: (adapterSession)=>{
return transformAdapterObjectToPayloadObject(omit(adapterSession, [
"userId"
]));
},
/**
* Modifications:
* - ~`userId`~
*/ fromPartialAdapter: (adapterSession)=>{
return transformAdapterObjectToPayloadObject(omit(adapterSession, [
"userId"
]));
}
},
verificationToken: {
/**
* Modifications:
* - `user.email` --> `identifier`
*/ toAdapter: (user, verificationToken)=>{
return {
identifier: user.email,
...transformPayloadObjectToAdapterObject(verificationToken)
};
},
/**
* Modifications:
* - ~`identifier`~
*/ fromAdapter: (adapterVerificationToken)=>{
return transformAdapterObjectToPayloadObject(omit(adapterVerificationToken, [
"identifier"
]));
}
},
authenticator: {
/**
* Modifications:
* - `user.id` --> `userId`
* - `authenticator.credentialID` --> `providerAccountId`
*/ toAdapter: (user, authenticator)=>{
return {
userId: user.id,
providerAccountId: authenticator.credentialID,
...transformPayloadObjectToAdapterObject(authenticator)
};
},
/**
* Modifications:
* - ~`userId`~
* - ~`providerAccountId`~
*/ fromAdapter: (adapterAuthenticator)=>{
return transformAdapterObjectToPayloadObject(omit(adapterAuthenticator, [
"userId",
"providerAccountId"
]));
}
}
};
/**
* --- Utility functions for transforming data between Payload and Adapter ---
*/ // https://github.com/honeinc/is-iso-date/blob/8831e79b5b5ee615920dcb350a355ffc5cbf7aed/index.js#L5
const isoDateRE = // eslint-disable-next-line regexp/no-unused-capturing-group
/(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))/;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const isDate = (val)=>!!(val && isoDateRE.test(val) && !isNaN(Date.parse(val)));
/**
* Transform a Payload object to an Adapter object
*
* @param object The Payload object to transform
* @returns The transformed Adapter object
*/ const transformPayloadObjectToAdapterObject = (object)=>{
const adapterObject = {};
for (const [key, value] of Object.entries(object)){
adapterObject[key] = isDate(value) ? new Date(value) : value;
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
return adapterObject;
};
/**
* Transform an Adapter object to a Payload object
*
* @param adapterObject The Adapter object to transform
* @returns The transformed Payload object
*/ const transformAdapterObjectToPayloadObject = (adapterObject)=>{
const object = {};
for (const [key, value] of Object.entries(adapterObject)){
object[key] = value instanceof Date ? value.toISOString() : value;
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
return object;
};
/**
* Omit keys from an object
*
* @param obj The object to omit keys from
* @param keys The keys to omit
* @returns The object without the omitted keys
*/ const omit = (obj, keys)=>{
const result = {
...obj
};
for (const key of keys){
delete result[key];
}
return result;
};
//# sourceMappingURL=transform.js.map