import { Client } from "./client";
import { callback } from "./core";
export interface HostedFieldsFieldMaskInput {
/**
* The character to use when masking the input.
* @default '•'
*/
character?: string | undefined;
/**
* Only applicable for the credit card field. Whether or not to show the last 4 digits of the card when masking.
*/
showLastFour?: boolean | undefined;
}
export interface HostedFieldsFieldSupportedCardBrands {
/**
* The options for supporting card brands as either valid or invalid.
* Only applicable for the credit card number field.
* An object used in {@link module:braintree-web/hosted-fields~field field objects}
*/
visa?: boolean | undefined;
mastercard?: boolean | undefined;
"american-express"?: boolean | undefined;
"diners-club"?: boolean | undefined;
discover?: boolean | undefined;
jcb?: boolean | undefined;
"union-pay"?: boolean | undefined;
maestro?: boolean | undefined;
elo?: boolean | undefined;
mir?: boolean | undefined;
hiper?: boolean | undefined;
hipercard?: boolean | undefined;
}
/**
* Fields used in {@link module:braintree-web/hosted-fields~fieldOptions fields options}
*/
export interface HostedFieldsField {
/**
* @deprecated Now an alias for `container`.
*/
selector?: string | undefined;
container?: string | HTMLElement | undefined;
placeholder?: string | undefined;
type?: string | undefined;
formatInput?: boolean | undefined;
maskInput?: boolean | HostedFieldsFieldMaskInput | undefined;
select?: boolean | { options: string[] } | undefined;
maxCardLength?: number | undefined;
maxlength?: number | undefined;
minlength?: number | undefined;
prefill?: string | undefined;
rejectUnsupportedCards?: boolean | undefined;
supportedCardBrands?: HostedFieldsFieldSupportedCardBrands | undefined;
}
/**
* An object that has {@link module:braintree-web/hosted-fields~field field objects} for each field. Used in {@link module:braintree-web/hosted-fields~create create}.
*/
export interface HostedFieldFieldOptions {
cardholderName?: HostedFieldsField | undefined;
cvv?: HostedFieldsField | undefined;
expirationDate?: HostedFieldsField | undefined;
expirationMonth?: HostedFieldsField | undefined;
expirationYear?: HostedFieldsField | undefined;
number?: HostedFieldsField | undefined;
postalCode?: HostedFieldsField | undefined;
}
/**
* @description The event payload sent from {@link HostedFields#on|on} when the `binAvailable` event is emitted.
*/
export interface HostedFieldsBinPayload {
bin: string;
}
/**
* @description Information about the card type, sent in {@link HostedFields~stateObject|stateObjects}.
* - `american-express`
* - `diners-club`
* - `discover`
* - `jcb`
* - `maestro`
* - `master-card`
* - `unionpay`
* - `visa`
* - `American Express`
* - `Diners Club`
* - `Discover`
* - `JCB`
* - `Maestro`
* - `MasterCard`
* - `UnionPay`
* - `Visa`
* This object contains data relevant to the security code requirements of the card brand.
* For example, on a Visa card there will be a CVV of 3 digits, whereas an
* American Express card requires a 4-digit CID.
*/
export interface HostedFieldsCardCode {
name: string;
size: number;
}
export interface HostedFieldsHostedFieldsCard {
type: string;
niceType: string;
code: HostedFieldsCardCode;
}
/**
* @description Data about Hosted Fields fields, sent in {@link HostedFields~stateObject|stateObjects}.
* A determination based on the future validity of the input value.
* This is helpful when a user is entering a card number and types "41".
* While that value is not valid for submission, it is still possible for
* it to become a fully qualified entry. However, if the user enters "4x"
* it is clear that the card number can never become valid and isPotentiallyValid will
* return false.
*/
export interface HostedFieldsHostedFieldsFieldData {
container: HTMLElement;
isFocused: boolean;
isEmpty: boolean;
isPotentiallyValid: boolean;
isValid: boolean;
}
/**
* @description The event payload sent from {@link HostedFields#on|on} or {@link HostedFields#getState|getState}.
* This will return an array of potential {@link HostedFields~hostedFieldsCard|cards}. If the card type has been determined, the array will contain only one card.
* Internally, Hosted Fields uses credit-card-type,
* an open-source card detection library.
* The name of the field associated with an event. This will not be included if returned by {@link HostedFields#getState|getState}. It will be one of the following strings:
* - `"number"`
* - `"cvv"`
* - `"expirationDate"`
* - `"expirationMonth"`
* - `"expirationYear"`
* - `"postalCode"`
*/
export type HostedFieldsHostedFieldsFieldName =
| "number"
| "cvv"
| "expirationDate"
| "expirationMonth"
| "expirationYear"
| "postalCode"
| "cardholderName";
export type HostedFieldsFieldDataFields = {
[key in HostedFieldsHostedFieldsFieldName]: HostedFieldsHostedFieldsFieldData;
};
export interface HostedFieldsState {
cards: HostedFieldsHostedFieldsCard[];
fields: HostedFieldsFieldDataFields;
}
export interface HostedFieldsEvent extends HostedFieldsState {
emittedBy: HostedFieldsHostedFieldsFieldName;
}
/**
* @deprecated Turned into an alias. Use `HostedFieldsEvent` instead
*/
export type HostedFieldsStateObject = HostedFieldsEvent;
export interface HostedFieldsEventTypeMap {
blur: HostedFieldsEvent;
focus: HostedFieldsEvent;
empty: HostedFieldsEvent;
notEmpty: HostedFieldsEvent;
cardTypeChange: HostedFieldsEvent;
validityChange: HostedFieldsEvent;
inputSubmitRequest: HostedFieldsEvent;
binAvailable: HostedFieldsBinPayload;
}
export type HostedFieldEventType = keyof HostedFieldsEventTypeMap;
export interface HostedFieldsAccountDetails {
bin: string;
cardType: string;
expirationMonth: string;
expirationYear: string;
cardholderName: string;
lastTwo: string;
lastFour: string;
}
export interface HostedFieldsTokenizePayload {
nonce: string;
details: HostedFieldsAccountDetails;
type: string;
description: string;
/**
* Provides details about regulatory environment.
* See https://developer.paypal.com/braintree/docs/guides/3d-secure/migration/javascript/v3#authentication-insight.
*/
authenticationInsight?: {
regulationEnvironment?: "psd2" | "unregulated" | "unavailable";
};
}
/**
* @description The name of a HostedFields attribute.
*/
export type HostedFieldAttributeName = "aria-invalid" | "aria-required" | "disabled" | "placeholder";
/**
* @description Fields used in setAttribute() and removeAttribute() for modifying a HostedFields instance's attributes.
*/
export interface HostedFieldAttributeOptions {
field: HostedFieldsHostedFieldsFieldName;
attribute: HostedFieldAttributeName;
value?: string | boolean;
}
/**
* @description Fields used in setMessage() for modifying a HostedFields instance's visually hidden message.
*/
export interface HostedFieldMessageOptions {
field: HostedFieldsHostedFieldsFieldName;
message: string;
}
export interface HostedFieldsBillingAddress {
postalCode?: string | undefined;
firstName?: string | undefined;
lastName?: string | undefined;
company?: string | undefined;
streetAddress?: string | undefined;
extendedAddress?: string | undefined;
locality?: string | undefined;
region?: string | undefined;
countryCodeNumeric?: string | undefined;
countryCodeAlpha2?: string | undefined;
countryCodeAlpha3?: string | undefined;
countryName?: string | undefined;
}
export type TokenizationFields =
| "number"
| "cvv"
| "expirationDate"
| "expirationMonth"
| "expirationYear"
| "postalCode"
| "cardholderName";
export interface HostedFields {
/**
* An object that represents CSS that will be applied in each hosted field. This object looks similar to CSS.
* Typically, these styles involve fonts (such as `font-family` or `color`).
*
* These are the CSS properties that Hosted Fields supports. Any other CSS should be specified on your
* page and outside of any Braintree configuration. Trying to set unsupported properties will fail and put
* a warning in the console.
*
* Supported CSS properties are:
* `color`
* `font-family`
* `font-size-adjust`
* `font-size`
* `font-stretch`
* `font-style`
* `font-variant-alternates`
* `font-variant-caps`
* `font-variant-east-asian`
* `font-variant-ligatures`
* `font-variant-numeric`
* `font-variant`
* `font-weight`
* `font`
* `letter-spacing`
* `line-height`
* `opacity`
* `outline`
* `text-shadow`
* `transition`
* `-moz-osx-font-smoothing`
* `-moz-tap-highlight-color`
* `-moz-transition`
* `-webkit-font-smoothing`
* `-webkit-tap-highlight-color`
* `-webkit-transition`
*/
styleOptions: any;
on(
event: EventType,
handler: (event: HostedFieldsEventTypeMap[EventType]) => void,
): void;
off(
event: EventType,
handler: (event: HostedFieldsEventTypeMap[EventType]) => void,
): void;
teardown(): Promise;
teardown(callback?: callback): void;
/**
* Tokenizes fields and returns a nonce payload. * @example Tokenize a card
* hostedFieldsInstance.tokenize(function (tokenizeErr, payload) {
* if (tokenizeErr) {
* switch (tokenizeErr.code) {
* case 'HOSTED_FIELDS_FIELDS_EMPTY':
* console.error('All fields are empty! Please fill out the form.');
* break;
* case 'HOSTED_FIELDS_FIELDS_INVALID':
* console.error('Some fields are invalid:', tokenizeErr.details.invalidFieldKeys);
* break;
* case 'HOSTED_FIELDS_FAILED_TOKENIZATION':
* console.error('Tokenization failed server side. Is the card valid?');
* break;
* case 'HOSTED_FIELDS_TOKENIZATION_NETWORK_ERROR':
* console.error('Network error occurred when tokenizing.');
* break;
* default:
* console.error('Something bad happened!', tokenizeErr);
* }
* } else {
* console.log('Got nonce:', payload.nonce);
* }
* });
* @example Tokenize and vault a card
* hostedFieldsInstance.tokenize({
* vault: true
* }, function (tokenizeErr, payload) {
* if (tokenizeErr) {
* console.error(tokenizeErr);
* } else {
* console.log('Got nonce:', payload.nonce);
* }
* });
*/
tokenize(options?: {
vault?: boolean | undefined;
fieldsToTokenize?: Array | undefined;
cardholderName?: string | undefined;
billingAddress?: HostedFieldsBillingAddress | undefined;
}): Promise;
tokenize(
options: {
vault?: boolean | undefined;
fieldsToTokenize?: Array | undefined;
cardholderName?: string | undefined;
billingAddress?: HostedFieldsBillingAddress | undefined;
},
callback: callback,
): void;
tokenize(callback: callback): void;
/**
* Add a class to a {@link module:braintree-web/hosted-fields~field field}. Useful for updating field styles when events occur elsewhere in your checkout. *
* @example
* hostedFieldsInstance.addClass('number', 'custom-class', function (addClassErr) {
* if (addClassErr) {
* console.error(addClassErr);
* }
* });
*/
addClass(field: string, classname: string, callback?: callback): void;
/**
* Removes a class to a {@link module:braintree-web/hosted-fields~field field}. Useful for updating field styles when events occur elsewhere in your checkout. *
* @example
* hostedFieldsInstance.addClass('number', 'custom-class', function (addClassErr) {
* if (addClassErr) {
* console.error(addClassErr);
* return;
* }
*
* // some time later...
* hostedFieldsInstance.removeClass('number', 'custom-class');
* });
*/
removeClass(field: string, classname: string, callback?: callback): void;
/**
* Sets the placeholder of a {@link module:braintree-web/hosted-fields~field field}. *
* @example
* hostedFieldsInstance.setPlaceholder('number', '4111 1111 1111 1111', function (placeholderErr) {
* if (placeholderErr) {
* console.error(placeholderErr);
* }
* });
*
* @example Update CVV field on card type change
* hostedFieldsInstance.on('cardTypeChange', function (event) {
* // Update the placeholder value if there is only one possible card type
* if (event.cards.length === 1) {
* hostedFields.setPlaceholder('cvv', event.cards[0].code.name, function (placeholderErr) {
* if (placeholderErr) {
* // Handle errors, such as invalid field name
* console.error(placeholderErr);
* }
* });
* }
* });
*/
setPlaceholder(field: string, placeholder: string, callback?: callback): void;
/**
* @example
* hostedFieldsInstance.clear('number', function (clearErr) {
* if (clearErr) {
* console.error(clearErr);
* }
* });
*
* @example Clear several fields
* hostedFieldsInstance.clear('number');
* hostedFieldsInstance.clear('cvv');
* hostedFieldsInstance.clear('expirationDate');
*/
clear(field: string, callback?: callback): void;
/**
* Returns an {@link HostedFields~stateObject|object} that includes the state of all fields and possible card types.
* @example Check if all fields are valid
* var state = hostedFields.getState();
*
* var formValid = Object.keys(state.fields).every(function (key) {
* return state.fields[key].isValid;
* });
*/
getState(): HostedFieldsState;
/**
* Programmatically focus a {@link module:braintree-web/hosted-fields-field field}. *
* @example
* hostedFieldsInstance.focus('number', function (focusErr) {
* if (focusErr) {
* console.error(focusErr);
* }
* });
*/
focus(field: HostedFieldsHostedFieldsFieldName, callback?: callback): void;
/**
* Sets an attribute of a {@link module:braintree-web/hosted-fields~field field}.
* Supported attributes are `aria-invalid`, `aria-required`, `disabled`, and `placeholder`.
*
* @param options The options for the attribute you wish to set.
* @param options.field The field to which you wish to add an attribute. Must be a valid {@link module:braintree-web/hosted-fields~fieldOptions fieldOption}.
* @param options.attribute The name of the attribute you wish to add to the field.
* @param options.value The value for the attribute.
* @param callback Callback executed on completion, containing an error if one occurred. No data is returned if the attribute is set successfully.
*
* @example Set the placeholder attribute of a field
* hostedFieldsInstance.setAttribute({
* field: 'number',
* attribute: 'placeholder',
* value: '1111 1111 1111 1111'
* }, function (attributeErr) {
* if (attributeErr) {
* console.error(attributeErr);
* }
* });
*
* @example Set the aria-required attribute of a field
* hostedFieldsInstance.setAttribute({
* field: 'number',
* attribute: 'aria-required',
* value: true
* }, function (attributeErr) {
* if (attributeErr) {
* console.error(attributeErr);
* }
* });
*
* @returns Returns a promise if no callback is provided.
*/
setAttribute(options: HostedFieldAttributeOptions, callback?: callback): void;
/**
* Removes a supported attribute from a {@link module:braintree-web/hosted-fields~field field}.
*
* @param options The options for the attribute you wish to remove.
* @param options.field The field from which you wish to remove an attribute. Must be a valid {@link module:braintree-web/hosted-fields~fieldOptions fieldOption}.
* @param options.attribute The name of the attribute you wish to remove from the field.
* @param callback Callback executed on completion, containing an error if one occurred. No data is returned if the attribute is removed successfully.
*
* @example Remove the placeholder attribute of a field
* hostedFieldsInstance.removeAttribute({
* field: 'number',
* attribute: 'placeholder'
* }, function (attributeErr) {
* if (attributeErr) {
* console.error(attributeErr);
* }
* });
*
* @returns Returns a promise if no callback is provided.
*/
removeAttribute(options: HostedFieldAttributeOptions, callback?: callback): void;
/**
* Sets a visually hidden message (for screen readers) on a {@link module:braintree-web/hosted-fields~field field}.
*
* @param options The options for the attribute you wish to set.
* @param options.field The field to which you wish to add an attribute. Must be a valid {@link module:braintree-web/hosted-fields~fieldOptions fieldOption}.
* @param options.message The value for the attributeThe message to set.
*
* @example Set an error message on a field
* hostedFieldsInstance.setMessage({
* field: 'number',
* message: 'Invalid card number'
* });
*
* @example Remove the message on a field
* hostedFieldsInstance.setMessage({
* field: 'number',
* message: ''
* });
*/
setMessage(options: HostedFieldMessageOptions): void;
}
/**
* braintree.hostedFields.create({
* client: clientInstance,
* styles: {
* 'input': {
* 'font-size': '16pt',
* 'color': '#3A3A3A'
* },
* '.number': {
* 'font-family': 'monospace'
* },
* '.valid': {
* 'color': 'green'
* }
* },
* fields: {
* number: {
* selector: '#card-number'
* },
* cvv: {
* selector: '#cvv'
* },
* expirationDate: {
* selector: '#expiration-date'
* }
* }
* }, callback);
*/
export function create(options: {
client?: Client | undefined;
authorization?: string | undefined;
fields: HostedFieldFieldOptions;
styles?: any;
}): Promise;
export function create(
options: {
client?: Client | undefined;
authorization?: string | undefined;
fields: HostedFieldFieldOptions;
styles?: any;
},
callback: callback,
): void;