Files
2026-10-05 12:59:22 +00:00

28 lines
1.4 KiB
TypeScript

import type { XOInvitation } from '@xo-cash/types';
import { buildErrorDescription } from '../errors.ts';
import { InvitationInvalidError } from './errors.ts';
import { xoInvitationSchema } from './schemas.ts';
/**
* Validates an untyped value against the XOInvitation schema and returns it as a typed invitation.
*
* The schema parser returns a rebuilt copy whose keys follow the schema order. Commit signatures cover the JSON text of
* each commit's data, and that text depends on key order, so a rebuilt copy no longer matches its signatures. Only the
* value that was received keeps the order it was signed with.
*
* The received value itself is returned, not a copy, so the key order its commit signatures were made over is kept.
*
* @param {unknown} invitationValue - Value to validate, such as the output of Extended JSON parsing.
* @returns {XOInvitation} - The validated invitation, as the same object that was passed in.
* @throws {@link InvitationInvalidError} - When any field is missing, has the wrong type, or is not part of the invitation type.
*/
export const parseInvitation = (invitationValue: unknown): XOInvitation => {
const parseResult = xoInvitationSchema.safeParse(invitationValue);
if (parseResult.success === false) {
throw new InvitationInvalidError(buildErrorDescription(parseResult.error.issues));
}
return invitationValue as XOInvitation;
};