/** * © 2025-2026 Visa * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **/ export type CardBrand = 'AMERICAN_EXPRESS' | 'DISCOVER' | 'ELO' | 'MASTER_CARD' | 'MAESTRO' | 'VISA'; export type CardValidator = { /** Regex to test if the BIN is valid. The card could still be short digits or invalid, and still have a valid BIN. */ binRegex: RegExp; /** * Regex testing the array should be treated as a logical OR (if any of these are true then it's a BIN match). * These are split for easier development, and each regex test for certain BIN ranges. These aren't currently used for validation, only development, so they are optional. */ binRegexes?: RegExp[]; /** Brand ID */ brand: Brand; /** Allowed number lengths for the card number */ lengths: number[]; /** Maximum length of the card number */ maxLength: number; } & ({ /** * Spacing pattern used to add spaces in card number string. * For example, if a card number should have 4 digits, space, 7 digits, space, 4 digits, set this as [4, 7, 4]. */ spacingPattern: number[]; spacingPatterns?: never; } | { spacingPattern?: never; /** * Spacing patterns map used to add spaces in card number string for particular card number lengths. * For example, if a 16 digit card number should have 10 digits, space, 6 digits, set this as { 16: [10, 6] }. */ spacingPatterns: Record; }); export declare const defaultSpacingPattern: number[]; /** * This is all based off the {@link https://design.visa.com/patterns/card-input/#card-number-field | card number guidance}. * @devNote This validator array is not comprehensive and is subject to change. VPDS does not maintain acceptance marks for all brands for legal reasons. */ export declare const cardValidators: Record; export declare const cardValidatorsArray: CardValidator[]; /** * Checks if the card number length is valid based on the card validator's lengths array. * @param {string} cleanCardNumber * @param {CardValidator['lengths']} lengths * @returns {boolean} */ export declare const cardNumberLengthCheck: (cleanCardNumber: string, lengths?: CardValidator["lengths"]) => boolean; /** * Finds the card validator for the given card number based on the BIN regex. * If it returns undefined then bin is invalid. It is assumed that the card number is already cleaned. * @param cardNumber * @param cardValidators * @returns {CardValidator | undefined} */ export declare const findCardValidatorFromBinRegex: (cardNumber: string, cardValidators?: CardValidator[]) => CardValidator | undefined; /** * Formats the card number with the given spacing pattern. * It is assumed that the card number is already cleaned. * @param cardNumber * @param spacingPattern * @returns {string} */ export declare const formatCardNumber: (cardNumber: string, spacingPattern?: number[]) => string; /** * Formats the card number with the given card validator's spacing pattern. * It is assumed that the card number is already cleaned. * @param {string} cardNumber * @param {CardValidator} cardValidator * @returns {string} */ export declare const formatCardNumberFromValidator: (cardNumber: string, cardValidator?: CardValidator) => string; /** * Based off {@link https://en.wikipedia.org/wiki/Luhn_algorithm | Luhn algorithm}. * This is typically used to verify the last digit of credit card numbers. * @param {string} numToCheck string as number to check * @param {number} mod check modulus, defaults to 10 * @returns {boolean} whether the mod check is true or false */ export declare const moduloCheck: (numToCheck: string, mod?: number) => boolean; /** * Removes all characters after the maxLength * @param {string} cardNumber raw card number input * @param {number | undefined} maxLength remove all characters after this length * @returns {string} */ export declare const removeCharactersAfterMaxLength: (cardNumber: string, maxLength?: number) => string; /** * Removes all non-numeric characters * @param {string} cardNumber raw card number input * @returns {string} */ export declare const removeNonDigits: (cardNumber: string) => string; declare const _default: { cardNumberLengthCheck: (cleanCardNumber: string, lengths?: CardValidator["lengths"]) => boolean; cardValidators: Record>; cardValidatorsArray: CardValidator[]; defaultSpacingPattern: number[]; findCardValidatorFromBinRegex: (cardNumber: string, cardValidators?: CardValidator[]) => CardValidator | undefined; formatCardNumber: (cardNumber: string, spacingPattern?: number[]) => string; formatCardNumberFromValidator: (cardNumber: string, cardValidator?: CardValidator) => string; moduloCheck: (numToCheck: string, mod?: number) => boolean; removeCharactersAfterMaxLength: (cardNumber: string, maxLength?: number) => string; removeNonDigits: (cardNumber: string) => string; }; export default _default;