@stripe/stripe-js
Version:
Stripe.js loading utility
630 lines (576 loc) • 17.9 kB
TypeScript
import {
LayoutObject,
Layout,
TermsOption,
StripePaymentElement,
} from './elements/payment';
import {ContactOption, StripeAddressElement} from './elements/address';
import {Appearance, CssFontSource, CustomFontSource} from './elements-group';
import {StripeError} from './stripe';
import {
StripeCurrencySelectorElement,
FieldsOption,
StripeElementBase,
StripeExpressCheckoutElement,
StripeExpressCheckoutElementConfirmEvent,
StripeExpressCheckoutElementOptions,
StripeExpressCheckoutElementReadyEvent,
StripeTaxIdElement,
StripeTaxIdElementOptions,
} from './elements';
type SavedPaymentMethodOption = {
enableSave?: 'auto' | 'never';
enableRedisplay?: 'auto' | 'never';
};
export interface StripeCheckoutElementsOptions {
appearance?: Appearance;
loader?: 'auto' | 'always' | 'never';
fonts?: Array<CssFontSource | CustomFontSource>;
savedPaymentMethod?: SavedPaymentMethodOption;
}
export interface StripeCheckoutOptions {
fetchClientSecret: () => Promise<string>;
elementsOptions?: StripeCheckoutElementsOptions;
}
/* Elements with CheckoutSessions API types */
export type StripeCheckoutAddress = {
country: string;
line1?: string | null;
line2?: string | null;
city?: string | null;
postal_code?: string | null;
state?: string | null;
};
export type StripeCheckoutAdjustableQuantity = {
maximum: number;
minimum: number;
};
export type StripeCheckoutBillingInterval = 'day' | 'month' | 'week' | 'year';
export type StripeCheckoutContact = {
name?: string | null;
address: StripeCheckoutAddress;
};
export type StripeCheckoutDeliveryEstimate = {
maximum: StripeCheckoutEstimate | null;
minimum: StripeCheckoutEstimate | null;
};
export type StripeCheckoutAmount = {minorUnitsAmount: number; amount: string};
export type StripeCheckoutDiscountAmount = StripeCheckoutAmount & {
displayName: string;
promotionCode: string | null;
recurring:
| {type: 'forever'}
| {type: 'repeating'; durationInMonths: number}
| null;
percentOff: number | null;
};
export type StripeCheckoutDueNext = {
subtotal: StripeCheckoutAmount;
total: StripeCheckoutAmount;
discount: StripeCheckoutAmount;
taxInclusive: StripeCheckoutAmount;
taxExclusive: StripeCheckoutAmount;
billingCycleAnchor: number | null;
};
export type StripeCheckoutEstimate = {
unit: 'business_day' | 'day' | 'hour' | 'week' | 'month';
value: number;
};
export type StripeCheckoutLastPaymentError = {
message: string;
};
export type StripeCheckoutRedirectBehavior = 'always' | 'if_required';
export type StripeCheckoutSavedPaymentMethod = {
id: string;
type: 'card';
card: {
brand: string;
expMonth: number;
expYear: number;
last4: string;
};
billingDetails: {
email?: string | null;
name?: string | null;
phone?: string | null;
address?: {
line1?: string | null;
line2?: string | null;
city?: string | null;
postal_code?: string | null;
state?: string | null;
country?: string | null;
} | null;
};
};
export type StripeCheckoutTaxAmount = StripeCheckoutAmount & {
inclusive: boolean;
displayName: string;
};
export type StripeCheckoutLineItem = {
id: string;
name: string;
discount: StripeCheckoutAmount;
subtotal: StripeCheckoutAmount;
total: StripeCheckoutAmount;
taxExclusive: StripeCheckoutAmount;
taxInclusive: StripeCheckoutAmount;
unitAmount: StripeCheckoutAmount;
description: string | null;
quantity: number;
discountAmounts: Array<StripeCheckoutDiscountAmount> | null;
taxAmounts: Array<StripeCheckoutTaxAmount> | null;
recurring: {
interval: StripeCheckoutBillingInterval;
intervalCount: number;
isProrated: boolean;
usageType: 'metered' | 'licensed';
} | null;
adjustableQuantity: StripeCheckoutAdjustableQuantity | null;
images: string[];
};
export type StripeCheckoutRecurring = {
interval: StripeCheckoutBillingInterval;
intervalCount: number;
dueNext: StripeCheckoutDueNext;
trial: StripeCheckoutTrial | null;
};
export type StripeCheckoutShipping = {
shippingOption: StripeCheckoutShippingOption;
taxAmounts: Array<StripeCheckoutTaxAmount> | null;
};
export type StripeCheckoutShippingOption = StripeCheckoutAmount & {
id: string;
currency: string;
displayName: string | null;
deliveryEstimate: StripeCheckoutDeliveryEstimate | null;
};
export type StripeCheckoutStatus =
| {type: 'open'}
| {type: 'expired'}
| {
type: 'complete';
paymentStatus: 'paid' | 'unpaid' | 'no_payment_required';
};
export type StripeCheckoutTaxStatus =
| {status: 'ready'}
| {status: 'requires_shipping_address'}
| {status: 'requires_billing_address'};
export type StripeCheckoutTotalSummary = {
appliedBalance: StripeCheckoutAmount;
balanceAppliedToNextInvoice: boolean;
discount: StripeCheckoutAmount;
shippingRate: StripeCheckoutAmount;
subtotal: StripeCheckoutAmount;
taxExclusive: StripeCheckoutAmount;
taxInclusive: StripeCheckoutAmount;
total: StripeCheckoutAmount;
};
export type StripeCheckoutTrial = {
trialEnd: number;
trialPeriodDays: number;
};
export type StripeCheckoutCurrencyOption = StripeCheckoutAmount & {
currency: string;
currencyConversion?: {fxRate: number; sourceCurrency: string};
};
export type StripeCheckoutTaxIdType =
| 'ad_nrt'
| 'ae_trn'
| 'al_tin'
| 'am_tin'
| 'ao_tin'
| 'ar_cuit'
| 'au_abn'
| 'au_arn'
| 'ba_tin'
| 'bb_tin'
| 'bg_uic'
| 'bh_vat'
| 'bo_tin'
| 'br_cnpj'
| 'br_cpf'
| 'bs_tin'
| 'by_tin'
| 'ca_bn'
| 'ca_gst_hst'
| 'ca_pst_bc'
| 'ca_pst_mb'
| 'ca_pst_sk'
| 'ca_qst'
| 'cd_nif'
| 'ch_uid'
| 'ch_vat'
| 'cl_tin'
| 'cn_tin'
| 'co_nit'
| 'cr_tin'
| 'de_stn'
| 'do_rcn'
| 'ec_ruc'
| 'eg_tin'
| 'es_cif'
| 'eu_oss_vat'
| 'eu_vat'
| 'gb_vat'
| 'ge_vat'
| 'gn_nif'
| 'hk_br'
| 'hr_oib'
| 'hu_tin'
| 'id_npwp'
| 'il_vat'
| 'in_gst'
| 'is_vat'
| 'jp_cn'
| 'jp_rn'
| 'jp_trn'
| 'ke_pin'
| 'kh_tin'
| 'kr_brn'
| 'kz_bin'
| 'li_uid'
| 'li_vat'
| 'ma_vat'
| 'md_vat'
| 'me_pib'
| 'mk_vat'
| 'mr_nif'
| 'mx_rfc'
| 'my_frp'
| 'my_itn'
| 'my_sst'
| 'ng_tin'
| 'no_vat'
| 'no_voec'
| 'np_pan'
| 'nz_gst'
| 'om_vat'
| 'pe_ruc'
| 'ph_tin'
| 'ro_tin'
| 'rs_pib'
| 'ru_inn'
| 'ru_kpp'
| 'sa_vat'
| 'sg_gst'
| 'sg_uen'
| 'si_tin'
| 'sn_ninea'
| 'sr_fin'
| 'sv_nit'
| 'th_vat'
| 'tj_tin'
| 'tr_tin'
| 'tw_vat'
| 'tz_vat'
| 'ua_vat'
| 'ug_tin'
| 'us_ein'
| 'uy_ruc'
| 'uz_tin'
| 'uz_vat'
| 've_rif'
| 'vn_tin'
| 'za_vat'
| 'zm_tin'
| 'zw_tin';
export type StripeCheckoutTaxId = {
type: StripeCheckoutTaxIdType;
value: string;
};
export type StripeCheckoutTaxIdInfo = {
taxId: StripeCheckoutTaxId;
businessName: string;
};
/* Custom Checkout session */
export interface StripeCheckoutSession {
billingAddress: StripeCheckoutContact | null;
businessName: string | null;
canConfirm: boolean;
currency: string;
currencyOptions: Array<StripeCheckoutCurrencyOption> | null;
discountAmounts: Array<StripeCheckoutDiscountAmount> | null;
email: string | null;
id: string;
lastPaymentError: StripeCheckoutLastPaymentError | null;
lineItems: Array<StripeCheckoutLineItem>;
livemode: boolean;
minorUnitsAmountDivisor: number;
phoneNumber: string | null;
recurring: StripeCheckoutRecurring | null;
savedPaymentMethods: Array<StripeCheckoutSavedPaymentMethod> | null;
shipping: StripeCheckoutShipping | null;
shippingAddress: StripeCheckoutContact | null;
shippingOptions: Array<StripeCheckoutShippingOption>;
status: StripeCheckoutStatus;
tax: StripeCheckoutTaxStatus;
taxAmounts: Array<StripeCheckoutTaxAmount> | null;
taxIdInfo: StripeCheckoutTaxIdInfo | null;
total: StripeCheckoutTotalSummary;
}
export type StripeCheckoutPaymentElementOptions = {
layout?: Layout | LayoutObject;
paymentMethodOrder?: Array<string>;
readonly?: boolean;
terms?: TermsOption;
fields?: FieldsOption;
};
export type StripeCheckoutAddressElementOptions = {
contacts?: ContactOption[];
display?: {
name?: 'full' | 'split' | 'organization';
};
};
export type StripeCheckoutExpressCheckoutElementOptions = {
buttonHeight: StripeExpressCheckoutElementOptions['buttonHeight'];
buttonTheme: StripeExpressCheckoutElementOptions['buttonTheme'];
buttonType: StripeExpressCheckoutElementOptions['buttonType'];
layout: StripeExpressCheckoutElementOptions['layout'];
paymentMethodOrder: StripeExpressCheckoutElementOptions['paymentMethodOrder'];
paymentMethods: StripeExpressCheckoutElementOptions['paymentMethods'];
};
export type StripeCheckoutUpdateHandler = (
session: StripeCheckoutSession
) => void;
export type StripeCheckoutExpressCheckoutElement = StripeElementBase & {
/**
* Triggered when the element is fully rendered.
*/
on(
eventType: 'ready',
handler: (event: StripeExpressCheckoutElementReadyEvent) => any
): StripeCheckoutExpressCheckoutElement;
once(
eventType: 'ready',
handler: (event: StripeExpressCheckoutElementReadyEvent) => any
): StripeCheckoutExpressCheckoutElement;
off(
eventType: 'ready',
handler?: (event: StripeExpressCheckoutElementReadyEvent) => any
): StripeCheckoutExpressCheckoutElement;
/**
* Triggered when the element gains focus.
*/
on(
eventType: 'focus',
handler: (event: {elementType: 'expressCheckout'}) => any
): StripeCheckoutExpressCheckoutElement;
once(
eventType: 'focus',
handler: (event: {elementType: 'expressCheckout'}) => any
): StripeCheckoutExpressCheckoutElement;
off(
eventType: 'focus',
handler?: (event: {elementType: 'expressCheckout'}) => any
): StripeCheckoutExpressCheckoutElement;
/**
* Triggered when the element loses focus.
*/
on(
eventType: 'blur',
handler: (event: {elementType: 'expressCheckout'}) => any
): StripeCheckoutExpressCheckoutElement;
once(
eventType: 'blur',
handler: (event: {elementType: 'expressCheckout'}) => any
): StripeCheckoutExpressCheckoutElement;
off(
eventType: 'blur',
handler?: (event: {elementType: 'expressCheckout'}) => any
): StripeCheckoutExpressCheckoutElement;
/**
* Triggered when the escape key is pressed within the element.
*/
on(
eventType: 'escape',
handler: (event: {elementType: 'expressCheckout'}) => any
): StripeCheckoutExpressCheckoutElement;
once(
eventType: 'escape',
handler: (event: {elementType: 'expressCheckout'}) => any
): StripeCheckoutExpressCheckoutElement;
off(
eventType: 'escape',
handler?: (event: {elementType: 'expressCheckout'}) => any
): StripeCheckoutExpressCheckoutElement;
/**
* Triggered when the element fails to load.
*/
on(
eventType: 'loaderror',
handler: (event: {
elementType: 'expressCheckout';
error: StripeError;
}) => any
): StripeCheckoutExpressCheckoutElement;
once(
eventType: 'loaderror',
handler: (event: {
elementType: 'expressCheckout';
error: StripeError;
}) => any
): StripeCheckoutExpressCheckoutElement;
off(
eventType: 'loaderror',
handler?: (event: {
elementType: 'expressCheckout';
error: StripeError;
}) => any
): StripeCheckoutExpressCheckoutElement;
/**
* Triggered when a buyer authorizes a payment within a supported payment method.
*/
on(
eventType: 'confirm',
handler: (event: StripeExpressCheckoutElementConfirmEvent) => any
): StripeCheckoutExpressCheckoutElement;
once(
eventType: 'confirm',
handler: (event: StripeExpressCheckoutElementConfirmEvent) => any
): StripeCheckoutExpressCheckoutElement;
off(
eventType: 'confirm',
handler?: (event: StripeExpressCheckoutElementConfirmEvent) => any
): StripeCheckoutExpressCheckoutElement;
/**
* Triggered when a payment interface is dismissed (e.g., a buyer closes the payment interface)
*/
on(
eventType: 'cancel',
handler: (event: {elementType: 'expressCheckout'}) => any
): StripeCheckoutExpressCheckoutElement;
once(
eventType: 'cancel',
handler: (event: {elementType: 'expressCheckout'}) => any
): StripeCheckoutExpressCheckoutElement;
off(
eventType: 'cancel',
handler?: (event: {elementType: 'expressCheckout'}) => any
): StripeCheckoutExpressCheckoutElement;
/**
* Updates the options the `ExpressCheckoutElement` was initialized with.
* Updates are merged into the existing configuration.
*/
update: StripeExpressCheckoutElement['update'];
};
type AnyBuyerError = {message: string; code: null};
type ApplyPromotionCodeError =
| {message: string; code: 'invalidCode'}
| AnyBuyerError;
export type StripeCheckoutApplyPromotionCodeResult =
| {type: 'success'; session: StripeCheckoutSession}
| {type: 'error'; error: ApplyPromotionCodeError};
export type StripeCheckoutRemovePromotionCodeResult =
| {type: 'success'; session: StripeCheckoutSession}
| {type: 'error'; error: AnyBuyerError};
export type StripeCheckoutUpdateAddressResult =
| {type: 'success'; session: StripeCheckoutSession}
| {type: 'error'; error: AnyBuyerError};
export type StripeCheckoutUpdatePhoneNumberResult =
| {type: 'success'; session: StripeCheckoutSession}
| {type: 'error'; error: never};
type UpdateEmailError =
| {message: string; code: 'incompleteEmail'}
| {message: string; code: 'invalidEmail'};
export type StripeCheckoutUpdateEmailResult =
| {type: 'success'; session: StripeCheckoutSession}
| {type: 'error'; error: UpdateEmailError};
export type StripeCheckoutUpdateLineItemQuantityResult =
| {type: 'success'; session: StripeCheckoutSession}
| {type: 'error'; error: AnyBuyerError};
export type StripeCheckoutUpdateShippingOptionResult =
| {type: 'success'; session: StripeCheckoutSession}
| {type: 'error'; error: AnyBuyerError};
type UpdateTaxIdInfoError =
| {message: string; code: 'invalidTaxId'}
| AnyBuyerError;
export type StripeCheckoutUpdateTaxIdInfoResult =
| {type: 'success'; session: StripeCheckoutSession}
| {type: 'error'; error: UpdateTaxIdInfoError};
type ConfirmError =
| {
message: string;
code: 'paymentFailed';
paymentFailed: {
declineCode: string | null;
};
}
| AnyBuyerError;
export type StripeCheckoutConfirmResult =
| {type: 'success'; session: StripeCheckoutSession}
| {type: 'error'; error: ConfirmError};
type RunServerUpdateFunction = () => Promise<unknown>;
export type StripeCheckoutRunServerUpdateResult =
| {type: 'success'; session: StripeCheckoutSession}
| {type: 'error'; error: AnyBuyerError};
export interface StripeCheckout {
/* Custom Checkout methods */
applyPromotionCode: (
promotionCode: string
) => Promise<StripeCheckoutApplyPromotionCodeResult>;
removePromotionCode: () => Promise<StripeCheckoutRemovePromotionCodeResult>;
updateShippingAddress: (
shippingAddress: StripeCheckoutContact | null
) => Promise<StripeCheckoutUpdateAddressResult>;
updateBillingAddress: (
billingAddress: StripeCheckoutContact | null
) => Promise<StripeCheckoutUpdateAddressResult>;
updatePhoneNumber: (
phoneNumber: string
) => Promise<StripeCheckoutUpdatePhoneNumberResult>;
updateEmail: (email: string) => Promise<StripeCheckoutUpdateEmailResult>;
updateLineItemQuantity: (args: {
lineItem: string;
quantity: number;
}) => Promise<StripeCheckoutUpdateLineItemQuantityResult>;
updateTaxIdInfo: (
taxIdInfo: StripeCheckoutTaxIdInfo | null
) => Promise<StripeCheckoutUpdateTaxIdInfoResult>;
updateShippingOption: (
shippingOption: string
) => Promise<StripeCheckoutUpdateShippingOptionResult>;
confirm: (args?: {
returnUrl?: string;
redirect?: StripeCheckoutRedirectBehavior;
paymentMethod?: string;
savePaymentMethod?: boolean;
email?: string;
phoneNumber?: string;
billingAddress?: StripeCheckoutContact;
shippingAddress?: StripeCheckoutContact;
expressCheckoutConfirmEvent?: StripeExpressCheckoutElementConfirmEvent;
}) => Promise<StripeCheckoutConfirmResult>;
session: () => StripeCheckoutSession;
on: (event: 'change', handler: StripeCheckoutUpdateHandler) => void;
runServerUpdate: (
userFunction: RunServerUpdateFunction
) => Promise<StripeCheckoutRunServerUpdateResult>;
/* Elements methods */
changeAppearance: (appearance: Appearance) => void;
loadFonts: (fonts: Array<CssFontSource | CustomFontSource>) => void;
getPaymentElement(): StripePaymentElement | null;
getBillingAddressElement(): StripeAddressElement | null;
getShippingAddressElement(): StripeAddressElement | null;
getExpressCheckoutElement(): StripeCheckoutExpressCheckoutElement | null;
/* Requires beta access: Contact [Stripe support](https://support.stripe.com/) for more information. */
getCurrencySelectorElement(): StripeCurrencySelectorElement | null;
/* Requires beta access: Contact [Stripe support](https://support.stripe.com/) for more information. */
getTaxIdElement(): StripeTaxIdElement | null;
createPaymentElement(
options?: StripeCheckoutPaymentElementOptions
): StripePaymentElement;
createBillingAddressElement(
options?: StripeCheckoutAddressElementOptions
): StripeAddressElement;
createShippingAddressElement(
options?: StripeCheckoutAddressElementOptions
): StripeAddressElement;
createExpressCheckoutElement(
options?: StripeCheckoutExpressCheckoutElementOptions
): StripeCheckoutExpressCheckoutElement;
/* Requires beta access: Contact [Stripe support](https://support.stripe.com/) for more information. */
createCurrencySelectorElement(): StripeCurrencySelectorElement;
/* Requires beta access: Contact [Stripe support](https://support.stripe.com/) for more information. */
createTaxIdElement(options?: StripeTaxIdElementOptions): StripeTaxIdElement;
}