All files / lib/esm/Interfaces/Credential PasskeyCustomFieldInterface.js

0% Statements 0/19
0% Branches 0/26
0% Functions 0/5
0% Lines 0/19

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64                                                                                                                               
/** Custom-field `field_type` used for software passkeys. */
export const PASSKEY_CUSTOM_FIELD_TYPE = 'passkey';
/** Fixed label for passkey custom fields (hide in credential editors). */
export const PASSKEY_CUSTOM_FIELD_LABEL = 'Passkey';
function isNonEmptyString(value) {
    return typeof value === 'string' && value.length > 0;
}
/**
 * Type guard for a parsed passkey payload (object form).
 */
export function isPasskeyData(value) {
    if (value === null || typeof value !== 'object') {
        return false;
    }
    const data = value;
    return data.v === 1
        && isNonEmptyString(data.domain)
        && isNonEmptyString(data.credentialId)
        && typeof data.userName === 'string'
        && typeof data.userDisplayName === 'string'
        && isNonEmptyString(data.userId)
        && isNonEmptyString(data.key)
        && (data.rpId === undefined || typeof data.rpId === 'string');
}
/**
 * Normalize a custom-field value that may be a PasskeyData object or a JSON string.
 */
export function parsePasskeyValue(value) {
    let candidate = value;
    if (typeof candidate === 'string') {
        try {
            candidate = JSON.parse(candidate);
        }
        catch {
            return null;
        }
    }
    return isPasskeyData(candidate) ? candidate : null;
}
/**
 * True when the custom field is a secret passkey field with a valid v1 payload.
 */
export function isPasskeyCustomField(field) {
    if (!field || field.field_type !== PASSKEY_CUSTOM_FIELD_TYPE || field.secret !== true) {
        return false;
    }
    return parsePasskeyValue(field.value) !== null;
}
/**
 * Build a secret passkey custom field ready to store on a credential.
 * @throws Error when `passkey` is not a valid {@link PasskeyData} v1 object
 */
export function createPasskeyCustomField(passkey) {
    if (!isPasskeyData(passkey)) {
        throw new Error('Invalid passkey data: expected a complete PasskeyData v1 object');
    }
    return {
        label: PASSKEY_CUSTOM_FIELD_LABEL,
        secret: true,
        field_type: PASSKEY_CUSTOM_FIELD_TYPE,
        value: { ...passkey }
    };
}