UNPKG

payload-authjs

Version:
171 lines (170 loc) 5.45 kB
/** * 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