@vue-stripe/vue-stripe
Version:
Vue Stripe elements and composables for Stripe.js
1,353 lines (1,352 loc) • 44.9 kB
JavaScript
import { loadStripe as D } from "@stripe/stripe-js";
import { loadStripe as Tt } from "@stripe/stripe-js";
import { defineComponent as S, ref as m, onMounted as $, provide as B, createElementBlock as f, unref as p, openBlock as h, renderSlot as b, createElementVNode as g, toDisplayString as P, inject as _, watch as y, nextTick as J, onUnmounted as T, createCommentVNode as k, normalizeClass as x, h as M, onBeforeUnmount as Q, readonly as C, useSlots as Y, computed as Z, Fragment as N, createTextVNode as j, resolveComponent as O, withDirectives as ee, createVNode as te, vShow as re } from "vue-demi";
const A = Symbol("stripe"), w = Symbol("stripe-elements"), G = Symbol("vue-stripe-config");
class E extends Error {
constructor(d) {
super(d), this.name = "VueStripeProviderError";
}
}
class V extends Error {
constructor(d) {
super(d), this.name = "VueStripeElementsError";
}
}
class se extends Error {
constructor(d) {
super(d), this.name = "VueStripeLoadError";
}
}
function lt(o, d) {
switch (o) {
case "provider":
return new E(d);
case "elements":
return new V(d);
case "load":
return new se(d);
default:
return new Error(d);
}
}
const W = {
name: "vue-stripe",
version: "5.3.0",
url: "https://vuestripe.com",
partner_id: "pp_partner_IqtOXpBSuz0IE2"
}, ne = {
key: 0,
class: "vue-stripe-error"
}, ae = { class: "vue-stripe-error-message" }, le = {
key: 1,
class: "vue-stripe-loading"
}, oe = { key: 2 }, ue = /* @__PURE__ */ S({
__name: "VueStripeProvider",
props: {
publishableKey: {},
stripeKey: {},
stripeAccount: {},
apiVersion: {},
locale: {},
options: {}
},
emits: ["load", "error"],
setup(o, { emit: d }) {
const v = o, a = d, n = m(null), l = m(!0), e = m(null), r = v.publishableKey || v.stripeKey;
if (!r)
throw new E("publishableKey or stripeKey is required");
const s = {
publishableKey: r,
stripeAccount: v.stripeAccount || v.options?.stripeAccount,
apiVersion: v.apiVersion || v.options?.apiVersion,
locale: v.locale || v.options?.locale
}, u = async () => {
try {
l.value = !0, e.value = null;
const i = {}, t = v.stripeAccount || v.options?.stripeAccount, c = v.apiVersion || v.options?.apiVersion, R = v.locale || v.options?.locale;
if (t && (i.stripeAccount = t), c && (i.apiVersion = c), R && (i.locale = R), n.value = await D(r, i), !n.value)
throw new E("Failed to initialize Stripe");
n.value.registerAppInfo(W), a("load", n.value);
} catch (i) {
const t = i instanceof Error ? i.message : "Failed to load Stripe";
e.value = t, console.error("[Vue Stripe] Initialization error:", t), a("error", i instanceof Error ? i : new Error(t));
} finally {
l.value = !1;
}
};
return $(() => {
u();
}), B(G, s), B(A, {
stripe: n,
loading: l,
error: e
}), (i, t) => p(e) ? (h(), f("div", ne, [
b(i.$slots, "error", { error: p(e) }, () => [
g("div", ae, P(p(e)), 1)
], !0)
])) : p(l) ? (h(), f("div", le, [
b(i.$slots, "loading", {}, () => [
t[0] || (t[0] = g("div", { class: "vue-stripe-loading-message" }, " Loading Stripe... ", -1))
], !0)
])) : (h(), f("div", oe, [
b(i.$slots, "default", {}, void 0, !0)
]));
}
}), I = (o, d) => {
const v = o.__vccOpts || o;
for (const [a, n] of d)
v[a] = n;
return v;
}, ot = /* @__PURE__ */ I(ue, [["__scopeId", "data-v-573ddc51"]]), ie = {
key: 0,
class: "vue-stripe-elements-error"
}, ce = { class: "vue-stripe-error-message" }, ve = {
key: 1,
class: "vue-stripe-elements-loading"
}, de = { key: 2 }, pe = /* @__PURE__ */ S({
__name: "VueStripeElements",
props: {
clientSecret: {},
mode: {},
currency: {},
amount: {},
setupFutureUsage: {},
captureMethod: {},
paymentMethodTypes: {},
options: {}
},
emits: ["ready", "error"],
setup(o, { emit: d }) {
const v = d, a = o, n = _(A);
if (!n)
throw new E(
"VueStripeElements must be used within VueStripeProvider"
);
const l = m(null), e = m(!0), r = m(null), s = () => {
if (!n.stripe.value) {
r.value = "Stripe instance not available", e.value = !1;
return;
}
try {
r.value = null, e.value = !0;
const u = {
...a.options
};
a.clientSecret && (u.clientSecret = a.clientSecret), a.mode && (u.mode = a.mode), a.currency && (u.currency = a.currency), a.amount !== void 0 && (u.amount = a.amount), a.setupFutureUsage && (u.setupFutureUsage = a.setupFutureUsage), a.captureMethod && (u.captureMethod = a.captureMethod), a.paymentMethodTypes && (u.paymentMethodTypes = a.paymentMethodTypes), l.value = n.stripe.value.elements(u), e.value = !1, J(() => {
v("ready", l.value);
});
} catch (u) {
const i = u instanceof Error ? u.message : "Failed to create elements";
r.value = i, e.value = !1, console.error("[Vue Stripe] Elements creation error:", i), v("error", i);
}
};
return y(
() => n.stripe.value,
(u) => {
u && !l.value && s();
},
{ immediate: !0 }
), y(
() => a.clientSecret,
() => {
n.stripe.value && s();
}
), y(
() => [a.mode, a.currency, a.amount, a.setupFutureUsage],
() => {
n.stripe.value && s();
}
), $(() => {
n.stripe.value && !l.value && s();
}), B(w, {
elements: l,
loading: e,
error: r
}), (u, i) => p(r) ? (h(), f("div", ie, [
b(u.$slots, "error", { error: p(r) }, () => [
g("div", ce, P(p(r)), 1)
], !0)
])) : p(e) ? (h(), f("div", ve, [
b(u.$slots, "loading", {}, () => [
i[0] || (i[0] = g("div", { class: "vue-stripe-loading-message" }, " Initializing Elements... ", -1))
], !0)
])) : (h(), f("div", de, [
b(u.$slots, "default", {}, void 0, !0)
]));
}
}), ut = /* @__PURE__ */ I(pe, [["__scopeId", "data-v-c54b80f7"]]), me = { class: "vue-stripe-payment-element" }, fe = {
key: 0,
class: "vue-stripe-payment-element-error"
}, he = { class: "vue-stripe-error-message" }, ge = {
key: 1,
class: "vue-stripe-payment-element-loader"
}, be = /* @__PURE__ */ S({
__name: "VueStripePaymentElement",
props: {
options: {}
},
emits: ["ready", "change", "focus", "blur", "escape", "loaderstart", "loaderstop"],
setup(o, { expose: d, emit: v }) {
const a = o, n = v, l = m(), e = m(null), r = m(!0), s = m(null), u = _(w);
if (!u)
throw new V(
"VueStripePaymentElement must be used within VueStripeElements"
);
const i = () => {
if (!u.elements.value) {
s.value = "Elements instance not available", r.value = !1;
return;
}
if (!l.value) {
s.value = "Mount point not available", r.value = !1;
return;
}
try {
s.value = null, r.value = !0, e.value = u.elements.value.create("payment", a.options), e.value.on("ready", () => {
r.value = !1, n("ready", e.value);
}), e.value.on("change", (c) => {
n("change", c);
}), e.value.on("focus", () => {
n("focus");
}), e.value.on("blur", () => {
n("blur");
}), e.value.on("escape", () => {
n("escape");
});
const t = e.value;
t.on("loaderstart", () => {
n("loaderstart");
}), t.on("loaderstop", () => {
n("loaderstop");
}), e.value.mount(l.value);
} catch (t) {
const c = t instanceof Error ? t.message : "Failed to create payment element";
s.value = c, r.value = !1, console.error("[Vue Stripe] Payment element creation error:", c);
}
};
return y(
() => a.options,
(t) => {
e.value && t && e.value.update(t);
},
{ deep: !0 }
), y(
() => u.elements.value,
(t) => {
t && l.value && !e.value && i();
},
{ immediate: !0 }
), $(() => {
u.elements.value && l.value && !e.value && i();
}), T(() => {
e.value && e.value.destroy();
}), d({
element: e,
loading: r,
error: s
}), (t, c) => (h(), f("div", me, [
p(s) ? (h(), f("div", fe, [
b(t.$slots, "error", { error: p(s) }, () => [
g("div", he, P(p(s)), 1)
], !0)
])) : k("", !0),
g("div", {
ref_key: "elementRef",
ref: l,
class: x(["vue-stripe-payment-element-mount", { "vue-stripe-payment-element-loading": p(r) }])
}, null, 2),
p(r) ? (h(), f("div", ge, [
b(t.$slots, "loading", {}, () => [
c[0] || (c[0] = g("div", { class: "vue-stripe-loading-message" }, " Loading payment form... ", -1))
], !0)
])) : k("", !0)
]));
}
}), it = /* @__PURE__ */ I(be, [["__scopeId", "data-v-2477e9df"]]), ye = { class: "vue-stripe-express-checkout-element" }, Ee = {
key: 0,
class: "vue-stripe-express-checkout-element-error"
}, _e = { class: "vue-stripe-error-message" }, ke = {
key: 1,
class: "vue-stripe-express-checkout-element-loader"
}, Se = /* @__PURE__ */ S({
__name: "VueStripeExpressCheckoutElement",
props: {
options: {}
},
emits: ["ready", "click", "confirm", "cancel", "shippingaddresschange", "shippingratechange"],
setup(o, { expose: d, emit: v }) {
const a = o, n = v, l = m(), e = m(null), r = m(!0), s = m(null), u = _(w);
if (!u)
throw new V(
"VueStripeExpressCheckoutElement must be used within VueStripeElements"
);
const i = () => {
if (!u.elements.value) {
s.value = "Elements instance not available", r.value = !1;
return;
}
if (!l.value) {
s.value = "Mount point not available", r.value = !1;
return;
}
try {
s.value = null, r.value = !0, e.value = u.elements.value.create("expressCheckout", a.options), e.value.on("ready", (t) => {
r.value = !1, n("ready", t);
}), e.value.on("click", (t) => {
n("click", t);
}), e.value.on("confirm", (t) => {
n("confirm", t);
}), e.value.on("cancel", () => {
n("cancel");
}), e.value.on("shippingaddresschange", (t) => {
n("shippingaddresschange", t);
}), e.value.on("shippingratechange", (t) => {
n("shippingratechange", t);
}), e.value.mount(l.value);
} catch (t) {
const c = t instanceof Error ? t.message : "Failed to create express checkout element";
s.value = c, r.value = !1, console.error("[Vue Stripe] Express checkout element creation error:", c);
}
};
return y(
() => a.options,
(t) => {
e.value && t && e.value.update(t);
},
{ deep: !0 }
), y(
() => u.elements.value,
(t) => {
t && l.value && !e.value && i();
},
{ immediate: !0 }
), $(() => {
u.elements.value && l.value && !e.value && i();
}), T(() => {
e.value && e.value.destroy();
}), d({
element: e,
loading: r,
error: s
}), (t, c) => (h(), f("div", ye, [
p(s) ? (h(), f("div", Ee, [
b(t.$slots, "error", { error: p(s) }, () => [
g("div", _e, P(p(s)), 1)
], !0)
])) : k("", !0),
g("div", {
ref_key: "elementRef",
ref: l,
class: x(["vue-stripe-express-checkout-element-mount", { "vue-stripe-express-checkout-element-loading": p(r) }])
}, null, 2),
p(r) ? (h(), f("div", ke, [
b(t.$slots, "loading", {}, () => [
c[0] || (c[0] = g("div", { class: "vue-stripe-loading-message" }, " Loading express checkout... ", -1))
], !0)
])) : k("", !0)
]));
}
}), ct = /* @__PURE__ */ I(Se, [["__scopeId", "data-v-20294cda"]]), we = { class: "vue-stripe-card-element" }, Ve = {
key: 0,
class: "vue-stripe-card-element-error"
}, $e = { class: "vue-stripe-error-message" }, Ie = {
key: 1,
class: "vue-stripe-card-element-loader"
}, Ce = /* @__PURE__ */ S({
__name: "VueStripeCardElement",
props: {
options: {}
},
emits: ["ready", "change", "focus", "blur", "escape"],
setup(o, { expose: d, emit: v }) {
const a = o, n = v, l = m(), e = m(null), r = m(!0), s = m(null), u = _(w);
if (!u)
throw new V(
"VueStripeCardElement must be used within VueStripeElements"
);
const i = () => {
if (!u.elements.value) {
s.value = "Elements instance not available", r.value = !1;
return;
}
if (!l.value) {
s.value = "Mount point not available", r.value = !1;
return;
}
try {
s.value = null, r.value = !0, e.value = u.elements.value.create("card", a.options), e.value.on("ready", () => {
r.value = !1, n("ready", e.value);
}), e.value.on("change", (t) => {
t.error ? s.value = t.error.message : s.value = null, n("change", t);
}), e.value.on("focus", () => {
n("focus");
}), e.value.on("blur", () => {
n("blur");
}), e.value.on("escape", () => {
n("escape");
}), e.value.mount(l.value);
} catch (t) {
const c = t instanceof Error ? t.message : "Failed to create card element";
s.value = c, r.value = !1, console.error("[Vue Stripe] Card element creation error:", c);
}
};
return y(
() => a.options,
(t) => {
e.value && t && e.value.update(t);
},
{ deep: !0 }
), y(
() => u.elements.value,
(t) => {
t && l.value && !e.value && i();
},
{ immediate: !0 }
), $(() => {
u.elements.value && l.value && !e.value && i();
}), T(() => {
e.value && e.value.destroy();
}), d({
element: e,
loading: r,
error: s,
focus: () => e.value?.focus(),
blur: () => e.value?.blur(),
clear: () => e.value?.clear()
}), (t, c) => (h(), f("div", we, [
p(s) ? (h(), f("div", Ve, [
b(t.$slots, "error", { error: p(s) }, () => [
g("div", $e, P(p(s)), 1)
], !0)
])) : k("", !0),
g("div", {
ref_key: "elementRef",
ref: l,
class: x(["vue-stripe-card-element-mount", { "vue-stripe-card-element-loading": p(r) }])
}, null, 2),
p(r) ? (h(), f("div", Ie, [
b(t.$slots, "loading", {}, () => [
c[0] || (c[0] = g("div", { class: "vue-stripe-loading-message" }, " Loading card form... ", -1))
], !0)
])) : k("", !0)
]));
}
}), vt = /* @__PURE__ */ I(Ce, [["__scopeId", "data-v-a41a7ee5"]]);
function L({ elementType: o, componentName: d }) {
return S({
name: d,
props: {
options: {
type: Object,
default: () => ({})
}
},
emits: ["ready", "change", "focus", "blur", "escape"],
setup(v, { emit: a, expose: n }) {
const l = m(), e = m(null), r = m(!0), s = m(null), u = _(w);
if (!u)
throw new V(
`${d} must be used within VueStripeElements`
);
const i = () => {
if (!u.elements.value) {
s.value = "Elements instance not available", r.value = !1;
return;
}
if (!l.value) {
s.value = "Mount point not available", r.value = !1;
return;
}
try {
s.value = null, r.value = !0;
const t = u.elements.value.create(o, v.options);
e.value = t, t.on("ready", () => {
r.value = !1, a("ready", e.value);
}), t.on("change", (c) => {
const R = c;
R.error ? s.value = R.error.message : s.value = null, a("change", R);
}), t.on("focus", () => {
a("focus");
}), t.on("blur", () => {
a("blur");
}), t.on("escape", () => {
a("escape");
}), t.mount(l.value);
} catch (t) {
const c = t instanceof Error ? t.message : `Failed to create ${o} element`;
s.value = c, r.value = !1, console.error(`[Vue Stripe] ${d} creation error:`, c);
}
};
return y(
() => v.options,
(t) => {
e.value?.update && t && e.value.update(t);
},
{ deep: !0 }
), y(
() => u.elements.value,
(t) => {
t && l.value && !e.value && i();
},
{ immediate: !0 }
), $(() => {
u.elements.value && l.value && !e.value && i();
}), T(() => {
e.value && e.value.destroy();
}), n({
element: e,
loading: r,
error: s,
focus: () => {
e.value?.focus?.();
},
blur: () => {
e.value?.blur?.();
},
clear: () => {
e.value?.clear?.();
}
}), () => {
const t = `vue-stripe-${o}-element`;
return M("div", { class: t }, [
s.value && M("div", { class: `${t}-error` }, [
M("div", { class: "vue-stripe-error-message" }, s.value)
]),
M("div", {
ref: l,
class: {
[`${t}-mount`]: !0,
[`${t}-loading`]: r.value
}
}),
r.value && M("div", { class: `${t}-loader` }, [
M("div", { class: "vue-stripe-loading-message" }, `Loading ${o}...`)
])
]);
};
}
});
}
const dt = L({
elementType: "cardNumber",
componentName: "VueStripeCardNumberElement"
}), pt = L({
elementType: "cardExpiry",
componentName: "VueStripeCardExpiryElement"
}), mt = L({
elementType: "cardCvc",
componentName: "VueStripeCardCvcElement"
}), Pe = /* @__PURE__ */ S({
__name: "VueStripeLinkAuthenticationElement",
props: {
options: {}
},
emits: ["ready", "change"],
setup(o, { expose: d, emit: v }) {
const a = o, n = v, l = _(w);
if (!l)
throw new V(
"VueStripeLinkAuthenticationElement must be used within VueStripeElements"
);
const e = m(), r = m(null), s = () => {
if (!(!l.elements?.value || !e.value))
try {
r.value = l.elements?.value.create("linkAuthentication", a.options), r.value.mount(e.value), r.value.on("ready", () => {
r.value && n("ready", r.value);
}), r.value.on("change", (i) => {
n("change", i);
});
} catch (i) {
console.error("[Vue Stripe] Link authentication element creation error:", i);
}
}, u = () => {
r.value && (r.value.unmount(), r.value.destroy(), r.value = null);
};
return y(
() => l.elements?.value,
(i) => {
i && e.value && !r.value && s();
},
{ immediate: !0 }
), y(
() => a.options,
(i) => {
r.value && i && typeof r.value.update == "function" && r.value.update(i);
},
{ deep: !0 }
), $(() => {
l.elements?.value && e.value && s();
}), T(() => {
u();
}), d({
element: r,
focus: () => r.value?.focus(),
blur: () => r.value?.blur(),
clear: () => r.value?.clear()
}), (i, t) => (h(), f("div", {
ref_key: "elementRef",
ref: e,
class: "vue-stripe-link-auth-element"
}, null, 512));
}
}), ft = /* @__PURE__ */ I(Pe, [["__scopeId", "data-v-b79076eb"]]), Te = S({
name: "VueStripeAddressElement",
props: {
options: {
type: Object,
default: () => ({
mode: "shipping"
})
}
},
emits: ["ready", "change", "blur", "focus", "escape", "loadError"],
setup(o, { emit: d, expose: v }) {
const a = m(), n = m(null), l = _(w);
if (!l)
throw new V("VueStripeAddressElement must be used within VueStripeElements");
const e = () => {
d("ready");
}, r = (U) => {
d("change", U);
}, s = () => {
d("blur");
}, u = () => {
d("focus");
}, i = () => {
d("escape");
}, t = (U) => {
d("loadError", U);
}, c = () => {
!l.elements.value || !a.value || (n.value = l.elements.value.create("address", o.options), n.value.mount(a.value), n.value.on("ready", e), n.value.on("change", r), n.value.on("blur", s), n.value.on("focus", u), n.value.on("escape", i), n.value.on("loaderror", t));
}, R = () => {
n.value && n.value.update(o.options);
}, H = () => {
n.value && (n.value.off("ready", e), n.value.off("change", r), n.value.off("blur", s), n.value.off("focus", u), n.value.off("escape", i), n.value.off("loaderror", t), n.value.destroy(), n.value = null);
}, F = async () => {
if (!n.value)
throw new V("Address element not mounted");
return n.value.getValue();
}, z = () => {
n.value?.focus();
}, K = () => {
n.value?.clear();
};
return $(() => {
c();
}), Q(() => {
H();
}), y(() => o.options, () => {
R();
}, { deep: !0 }), v({
element: n,
getValue: F,
focus: z,
clear: K
}), {
addressRef: a,
element: n,
getValue: F,
focus: z,
clear: K
};
}
}), Re = { ref: "addressRef" };
function xe(o, d, v, a, n, l) {
return h(), f("div", Re, null, 512);
}
const ht = /* @__PURE__ */ I(Te, [["render", xe]]), Me = { class: "vue-stripe-iban-element" }, Ae = {
key: 0,
class: "vue-stripe-iban-element-error"
}, Ue = { class: "vue-stripe-error-message" }, Be = {
key: 1,
class: "vue-stripe-iban-element-loader"
}, Le = /* @__PURE__ */ S({
__name: "VueStripeIbanElement",
props: {
options: {}
},
emits: ["ready", "change", "focus", "blur", "escape"],
setup(o, { expose: d, emit: v }) {
const a = o, n = v, l = m(), e = m(null), r = m(!0), s = m(null), u = _(w);
if (!u)
throw new V(
"VueStripeIbanElement must be used within VueStripeElements"
);
const i = () => {
if (!u.elements.value) {
s.value = "Elements instance not available", r.value = !1;
return;
}
if (!l.value) {
s.value = "Mount point not available", r.value = !1;
return;
}
try {
s.value = null, r.value = !0;
const t = {
supportedCountries: ["SEPA"],
...a.options
};
e.value = u.elements.value.create("iban", t), e.value.on("ready", () => {
r.value = !1, n("ready", e.value);
}), e.value.on("change", (c) => {
c.error ? s.value = c.error.message : s.value = null, n("change", c);
}), e.value.on("focus", () => {
n("focus");
}), e.value.on("blur", () => {
n("blur");
}), e.value.on("escape", () => {
n("escape");
}), e.value.mount(l.value);
} catch (t) {
const c = t instanceof Error ? t.message : "Failed to create IBAN element";
s.value = c, r.value = !1, console.error("[Vue Stripe] IBAN element creation error:", c);
}
};
return y(
() => a.options,
(t) => {
e.value && t && e.value.update(t);
},
{ deep: !0 }
), y(
() => u.elements.value,
(t) => {
t && l.value && !e.value && i();
},
{ immediate: !0 }
), $(() => {
u.elements.value && l.value && !e.value && i();
}), T(() => {
e.value && e.value.destroy();
}), d({
element: e,
loading: r,
error: s,
focus: () => e.value?.focus(),
blur: () => e.value?.blur(),
clear: () => e.value?.clear()
}), (t, c) => (h(), f("div", Me, [
p(s) ? (h(), f("div", Ae, [
b(t.$slots, "error", { error: p(s) }, () => [
g("div", Ue, P(p(s)), 1)
], !0)
])) : k("", !0),
g("div", {
ref_key: "elementRef",
ref: l,
class: x(["vue-stripe-iban-element-mount", { "vue-stripe-iban-element-loading": p(r) }])
}, null, 2),
p(r) ? (h(), f("div", Be, [
b(t.$slots, "loading", {}, () => [
c[0] || (c[0] = g("div", { class: "vue-stripe-loading-message" }, " Loading IBAN form... ", -1))
], !0)
])) : k("", !0)
]));
}
}), gt = /* @__PURE__ */ I(Le, [["__scopeId", "data-v-f8ffb457"]]), Fe = { class: "vue-stripe-ideal-bank-element" }, ze = {
key: 0,
class: "vue-stripe-ideal-bank-element-error"
}, Ke = { class: "vue-stripe-error-message" }, Ne = {
key: 1,
class: "vue-stripe-ideal-bank-element-loader"
}, je = /* @__PURE__ */ S({
__name: "VueStripeIdealBankElement",
props: {
options: {}
},
emits: ["ready", "change", "focus", "blur", "escape"],
setup(o, { expose: d, emit: v }) {
const a = o, n = v, l = m(), e = m(null), r = m(!0), s = m(null), u = _(w);
if (!u)
throw new V(
"VueStripeIdealBankElement must be used within VueStripeElements"
);
const i = () => {
if (!u.elements.value) {
s.value = "Elements instance not available", r.value = !1;
return;
}
if (!l.value) {
s.value = "Mount point not available", r.value = !1;
return;
}
try {
s.value = null, r.value = !0, e.value = u.elements.value.create("idealBank", a.options), e.value.on("ready", () => {
r.value = !1, n("ready", e.value);
}), e.value.on("change", (t) => {
t.error ? s.value = t.error.message : s.value = null, n("change", t);
}), e.value.on("focus", () => {
n("focus");
}), e.value.on("blur", () => {
n("blur");
}), e.value.on("escape", () => {
n("escape");
}), e.value.mount(l.value);
} catch (t) {
const c = t instanceof Error ? t.message : "Failed to create iDEAL bank element";
s.value = c, r.value = !1, console.error("[Vue Stripe] iDEAL bank element creation error:", c);
}
};
return y(
() => a.options,
(t) => {
e.value && t && e.value.update(t);
},
{ deep: !0 }
), y(
() => u.elements.value,
(t) => {
t && l.value && !e.value && i();
},
{ immediate: !0 }
), $(() => {
u.elements.value && l.value && !e.value && i();
}), T(() => {
e.value && e.value.destroy();
}), d({
element: e,
loading: r,
error: s,
focus: () => e.value?.focus(),
blur: () => e.value?.blur(),
clear: () => e.value?.clear()
}), (t, c) => (h(), f("div", Fe, [
p(s) ? (h(), f("div", ze, [
b(t.$slots, "error", { error: p(s) }, () => [
g("div", Ke, P(p(s)), 1)
], !0)
])) : k("", !0),
g("div", {
ref_key: "elementRef",
ref: l,
class: x(["vue-stripe-ideal-bank-element-mount", { "vue-stripe-ideal-bank-element-loading": p(r) }])
}, null, 2),
p(r) ? (h(), f("div", Ne, [
b(t.$slots, "loading", {}, () => [
c[0] || (c[0] = g("div", { class: "vue-stripe-loading-message" }, " Loading iDEAL bank selector... ", -1))
], !0)
])) : k("", !0)
]));
}
}), bt = /* @__PURE__ */ I(je, [["__scopeId", "data-v-3d7f7e08"]]), qe = { class: "vue-stripe-p24-bank-element" }, De = {
key: 0,
class: "vue-stripe-p24-bank-element-error"
}, Ge = { class: "vue-stripe-error-message" }, We = {
key: 1,
class: "vue-stripe-p24-bank-element-loader"
}, Xe = /* @__PURE__ */ S({
__name: "VueStripeP24BankElement",
props: {
options: {}
},
emits: ["ready", "change", "focus", "blur", "escape"],
setup(o, { expose: d, emit: v }) {
const a = o, n = v, l = m(), e = m(null), r = m(!0), s = m(null), u = _(w);
if (!u)
throw new V(
"VueStripeP24BankElement must be used within VueStripeElements"
);
const i = () => {
if (!u.elements.value) {
s.value = "Elements instance not available", r.value = !1;
return;
}
if (!l.value) {
s.value = "Mount point not available", r.value = !1;
return;
}
try {
s.value = null, r.value = !0, e.value = u.elements.value.create("p24Bank", a.options || {}), e.value.on("ready", () => {
r.value = !1, n("ready", e.value);
}), e.value.on("change", (t) => {
t.error ? s.value = t.error.message : s.value = null, n("change", t);
}), e.value.on("focus", () => {
n("focus");
}), e.value.on("blur", () => {
n("blur");
}), e.value.on("escape", () => {
n("escape");
}), e.value.mount(l.value);
} catch (t) {
const c = t instanceof Error ? t.message : "Failed to create P24 bank element";
s.value = c, r.value = !1, console.error("[Vue Stripe] P24 bank element creation error:", c);
}
};
return y(
() => a.options,
(t) => {
e.value && t && e.value.update(t);
},
{ deep: !0 }
), y(
() => u.elements.value,
(t) => {
t && l.value && !e.value && i();
},
{ immediate: !0 }
), $(() => {
u.elements.value && l.value && !e.value && i();
}), T(() => {
e.value && e.value.destroy();
}), d({
element: e,
loading: r,
error: s,
focus: () => e.value?.focus(),
blur: () => e.value?.blur(),
clear: () => e.value?.clear()
}), (t, c) => (h(), f("div", qe, [
p(s) ? (h(), f("div", De, [
b(t.$slots, "error", { error: p(s) }, () => [
g("div", Ge, P(p(s)), 1)
], !0)
])) : k("", !0),
g("div", {
ref_key: "elementRef",
ref: l,
class: x(["vue-stripe-p24-bank-element-mount", { "vue-stripe-p24-bank-element-loading": p(r) }])
}, null, 2),
p(r) ? (h(), f("div", We, [
b(t.$slots, "loading", {}, () => [
c[0] || (c[0] = g("div", { class: "vue-stripe-loading-message" }, " Loading Przelewy24 bank selector... ", -1))
], !0)
])) : k("", !0)
]));
}
}), yt = /* @__PURE__ */ I(Xe, [["__scopeId", "data-v-29dc009e"]]), He = { class: "vue-stripe-eps-bank-element" }, Je = {
key: 0,
class: "vue-stripe-eps-bank-element-error"
}, Qe = { class: "vue-stripe-error-message" }, Ye = {
key: 1,
class: "vue-stripe-eps-bank-element-loader"
}, Ze = /* @__PURE__ */ S({
__name: "VueStripeEpsBankElement",
props: {
options: {}
},
emits: ["ready", "change", "focus", "blur", "escape"],
setup(o, { expose: d, emit: v }) {
const a = o, n = v, l = m(), e = m(null), r = m(!0), s = m(null), u = _(w);
if (!u)
throw new V(
"VueStripeEpsBankElement must be used within VueStripeElements"
);
const i = () => {
if (!u.elements.value) {
s.value = "Elements instance not available", r.value = !1;
return;
}
if (!l.value) {
s.value = "Mount point not available", r.value = !1;
return;
}
try {
s.value = null, r.value = !0, e.value = u.elements.value.create("epsBank", a.options || {}), e.value.on("ready", () => {
r.value = !1, n("ready", e.value);
}), e.value.on("change", (t) => {
t.error ? s.value = t.error.message : s.value = null, n("change", t);
}), e.value.on("focus", () => {
n("focus");
}), e.value.on("blur", () => {
n("blur");
}), e.value.on("escape", () => {
n("escape");
}), e.value.mount(l.value);
} catch (t) {
const c = t instanceof Error ? t.message : "Failed to create EPS bank element";
s.value = c, r.value = !1, console.error("[Vue Stripe] EPS bank element creation error:", c);
}
};
return y(
() => a.options,
(t) => {
e.value && t && e.value.update(t);
},
{ deep: !0 }
), y(
() => u.elements.value,
(t) => {
t && l.value && !e.value && i();
},
{ immediate: !0 }
), $(() => {
u.elements.value && l.value && !e.value && i();
}), T(() => {
e.value && e.value.destroy();
}), d({
element: e,
loading: r,
error: s,
focus: () => e.value?.focus(),
blur: () => e.value?.blur(),
clear: () => e.value?.clear()
}), (t, c) => (h(), f("div", He, [
p(s) ? (h(), f("div", Je, [
b(t.$slots, "error", { error: p(s) }, () => [
g("div", Qe, P(p(s)), 1)
], !0)
])) : k("", !0),
g("div", {
ref_key: "elementRef",
ref: l,
class: x(["vue-stripe-eps-bank-element-mount", { "vue-stripe-eps-bank-element-loading": p(r) }])
}, null, 2),
p(r) ? (h(), f("div", Ye, [
b(t.$slots, "loading", {}, () => [
c[0] || (c[0] = g("div", { class: "vue-stripe-loading-message" }, " Loading EPS bank selector... ", -1))
], !0)
])) : k("", !0)
]));
}
}), Et = /* @__PURE__ */ I(Ze, [["__scopeId", "data-v-27c62f72"]]);
function X() {
const o = _(A);
if (!o)
throw new E(
"useStripe must be called within a VueStripeProvider component"
);
return {
stripe: C(o.stripe),
loading: C(o.loading),
error: C(o.error),
initialize: async () => {
}
};
}
const Oe = ["disabled"], et = /* @__PURE__ */ S({
__name: "VueStripeCheckout",
props: {
sessionId: {},
sessionUrl: {},
priceId: {},
mode: { default: "payment" },
successUrl: {},
cancelUrl: {},
customerEmail: {},
clientReferenceId: {},
submitType: {},
buttonText: { default: "Checkout" },
loadingText: { default: "Redirecting..." },
disabled: { type: Boolean, default: !1 },
buttonClass: { default: "vue-stripe-checkout-button" }
},
emits: ["checkout", "success", "error", "before-redirect"],
setup(o, { expose: d, emit: v }) {
const a = o, n = v, { stripe: l } = X(), e = m(!1), r = Y(), s = Z(() => !!r.default), u = () => l.value !== null && typeof l.value.redirectToCheckout == "function", i = async () => {
e.value = !0, n("checkout");
try {
if (a.sessionUrl) {
n("before-redirect", { url: a.sessionUrl }), window.location.replace(a.sessionUrl), n("success");
return;
}
if (a.sessionId) {
if (!u())
throw new E(
"redirectToCheckout is not available. This method was removed in @stripe/stripe-js v8.x. Use sessionUrl prop with the checkout session URL instead."
);
if (!l.value)
throw new E("Stripe not initialized");
const t = await l.value.redirectToCheckout({
sessionId: a.sessionId
});
if (t.error)
throw new E(t.error.message || "Redirect to checkout failed");
n("success");
return;
}
if (a.priceId) {
if (!u())
throw new E(
"Price-based checkout using redirectToCheckout is not available in @stripe/stripe-js v8.x. Create a Checkout Session on your server and use sessionUrl prop instead."
);
if (!l.value)
throw new E("Stripe not initialized");
console.warn(
"[Vue Stripe] Price-based checkout is deprecated in v8.x. Create a Checkout Session on your server and use sessionUrl prop instead."
);
const t = await l.value.redirectToCheckout({
lineItems: [
{
price: a.priceId,
quantity: 1
}
],
mode: a.mode,
successUrl: a.successUrl || window.location.origin + "/success",
cancelUrl: a.cancelUrl || window.location.origin + "/cancel",
customerEmail: a.customerEmail,
clientReferenceId: a.clientReferenceId,
submitType: a.submitType
});
if (t.error)
throw new E(t.error.message || "Redirect to checkout failed");
n("success");
return;
}
throw new E(
"Either sessionUrl, sessionId, or priceId is required. For @stripe/stripe-js v8.x, use sessionUrl."
);
} catch (t) {
const c = t instanceof Error ? t : new Error("Checkout failed");
n("error", c), console.error("[Vue Stripe] Checkout error:", c);
} finally {
e.value = !1;
}
};
return d({ checkout: i, loading: e }), (t, c) => p(s) ? (h(), f("span", {
key: 0,
onClick: i,
class: "vue-stripe-checkout-wrapper"
}, [
b(t.$slots, "default", {
checkout: i,
loading: p(e),
disabled: o.disabled
}, void 0, !0)
])) : (h(), f("button", {
key: 1,
disabled: p(e) || o.disabled,
class: x(o.buttonClass),
onClick: i
}, [
p(e) ? (h(), f(N, { key: 1 }, [
c[0] || (c[0] = g("span", { class: "vue-stripe-loading-spinner" }, null, -1)),
j(" " + P(o.loadingText), 1)
], 64)) : (h(), f(N, { key: 0 }, [
j(P(o.buttonText), 1)
], 64))
], 10, Oe));
}
}), _t = /* @__PURE__ */ I(et, [["__scopeId", "data-v-8fe59422"]]), tt = { class: "vue-stripe-pricing-table" }, rt = { class: "vue-stripe-pricing-table-error" }, q = "https://js.stripe.com/v3/pricing-table.js", st = /* @__PURE__ */ S({
__name: "VueStripePricingTable",
props: {
pricingTableId: {},
customerEmail: {},
customerSessionClientSecret: {},
clientReferenceId: {}
},
emits: ["load", "error"],
setup(o, { expose: d, emit: v }) {
const a = o, n = v, l = _(G);
if (!l?.publishableKey)
throw new E(
"VueStripePricingTable must be used within a VueStripeProvider component"
);
const e = l.publishableKey, r = m(!0), s = m(null), u = () => new Promise((i, t) => {
if (document.querySelector(`script[src="${q}"]`)) {
i();
return;
}
const c = document.createElement("script");
c.src = q, c.async = !0, c.onload = () => i(), c.onerror = () => t(new Error("Failed to load Stripe pricing table script")), document.head.appendChild(c);
});
return $(async () => {
try {
r.value = !0, s.value = null, await u(), r.value = !1, n("load");
} catch (i) {
const t = i instanceof Error ? i.message : "Failed to load pricing table";
s.value = t, r.value = !1, n("error", i instanceof Error ? i : new Error(t)), console.error("[Vue Stripe] Pricing table error:", t);
}
}), d({
loading: r,
error: s
}), (i, t) => {
const c = O("stripe-pricing-table");
return h(), f("div", tt, [
p(r) ? b(i.$slots, "loading", { key: 0 }, () => [
t[0] || (t[0] = g("div", { class: "vue-stripe-pricing-table-loading" }, " Loading pricing table... ", -1))
], !0) : p(s) ? b(i.$slots, "error", {
key: 1,
error: p(s)
}, () => [
g("div", rt, P(p(s)), 1)
], !0) : k("", !0),
ee(te(c, {
"pricing-table-id": a.pricingTableId,
"publishable-key": p(e),
"customer-email": a.customerEmail,
"customer-session-client-secret": a.customerSessionClientSecret,
"client-reference-id": a.clientReferenceId
}, null, 8, ["pricing-table-id", "publishable-key", "customer-email", "customer-session-client-secret", "client-reference-id"]), [
[re, !p(r) && !p(s)]
])
]);
};
}
}), kt = /* @__PURE__ */ I(st, [["__scopeId", "data-v-2b89dbe1"]]);
function St() {
const o = _(A), d = _(w);
if (!o)
throw new E(
"usePaymentIntent must be called within a VueStripeProvider component"
);
const v = m(!1), a = m(null);
return {
confirmPayment: async (l) => {
if (!o.stripe.value)
return a.value = "Stripe not initialized", { error: { message: "Stripe not initialized" } };
v.value = !0, a.value = null;
try {
const e = l.elements ?? d?.elements.value;
if (e && !l.skipSubmit) {
const { error: s } = await e.submit();
if (s)
return a.value = s.message || "Form validation failed", { error: s };
}
const r = await o.stripe.value.confirmPayment({
elements: e ?? void 0,
clientSecret: l.clientSecret,
confirmParams: l.confirmParams ?? {},
redirect: l.redirect ?? "if_required"
});
return r.error && (a.value = r.error.message || "Payment confirmation failed"), r;
} catch (e) {
const r = e instanceof Error ? e.message : "Payment confirmation failed";
return a.value = r, { error: { message: r } };
} finally {
v.value = !1;
}
},
loading: C(v),
error: C(a)
};
}
function wt() {
const o = _(A), d = _(w);
if (!o)
throw new E(
"useSetupIntent must be called within a VueStripeProvider component"
);
const v = m(!1), a = m(null);
return {
confirmSetup: async (l) => {
if (!o.stripe.value)
return a.value = "Stripe not initialized", { error: { message: "Stripe not initialized" } };
v.value = !0, a.value = null;
try {
const e = l.elements ?? d?.elements.value;
if (e && !l.skipSubmit) {
const { error: s } = await e.submit();
if (s)
return a.value = s.message || "Form validation failed", { error: s };
}
const r = await o.stripe.value.confirmSetup({
elements: e ?? void 0,
clientSecret: l.clientSecret,
confirmParams: l.confirmParams ?? {},
redirect: l.redirect ?? "if_required"
});
return r.error && (a.value = r.error.message || "Setup confirmation failed"), r;
} catch (e) {
const r = e instanceof Error ? e.message : "Setup confirmation failed";
return a.value = r, { error: { message: r } };
} finally {
v.value = !1;
}
},
loading: C(v),
error: C(a)
};
}
function Vt() {
const { stripe: o } = X(), d = m(!1), v = m(null), a = () => o.value !== null && typeof o.value.redirectToCheckout == "function";
return {
redirectToCheckout: async (e) => {
d.value = !0, v.value = null;
try {
if ("url" in e && e.url) {
window.location.replace(e.url);
return;
}
const r = e;
if (!a())
throw new E(
"redirectToCheckout is not available. This method was removed in @stripe/stripe-js v8.x. Create a Checkout Session on your server and use redirectToUrl() or pass { url } instead."
);
if (!o.value)
throw new E("Stripe not initialized");
console.warn(
"[Vue Stripe] Legacy redirectToCheckout is deprecated in @stripe/stripe-js v8.x. Use redirectToUrl() with a session URL from your server instead."
);
const s = await o.value.redirectToCheckout(r);
if (s.error) {
const u = s.error.message || "Checkout redirect failed";
throw v.value = u, new E(u);
}
} catch (r) {
const s = r instanceof Error ? r.message : "Checkout redirect failed";
throw v.value = s, r;
} finally {
d.value = !1;
}
},
redirectToUrl: (e) => {
d.value = !0, v.value = null, window.location.replace(e);
},
loading: C(d),
error: C(v)
};
}
function $t() {
const o = _(w);
if (!o)
throw new V(
"Elements context not found. Make sure to wrap your component with VueStripeElements."
);
const d = async () => o.elements.value ? o.elements.value.submit() : { error: { message: "Elements not initialized" } };
return {
elements: C(o.elements),
submit: d,
loading: C(o.loading),
error: C(o.error)
};
}
function It(o) {
return {
install(d) {
d.provide("vue-stripe-config", o);
let v = null;
d.provide("vue-stripe-global", {
get stripe() {
if (!v) {
const a = {};
o.stripeAccount && (a.stripeAccount = o.stripeAccount), o.apiVersion && (a.apiVersion = o.apiVersion), o.locale && (a.locale = o.locale), v = D(o.publishableKey, a).then((n) => (n && n.registerAppInfo(W), n));
}
return v;
}
});
}
};
}
export {
ht as VueStripeAddressElement,
mt as VueStripeCardCvcElement,
vt as VueStripeCardElement,
pt as VueStripeCardExpiryElement,
dt as VueStripeCardNumberElement,
_t as VueStripeCheckout,
ut as VueStripeElements,
V as VueStripeElementsError,
Et as VueStripeEpsBankElement,
ct as VueStripeExpressCheckoutElement,
gt as VueStripeIbanElement,
bt as VueStripeIdealBankElement,
ft as VueStripeLinkAuthenticationElement,
se as VueStripeLoadError,
yt as VueStripeP24BankElement,
it as VueStripePaymentElement,
kt as VueStripePricingTable,
ot as VueStripeProvider,
E as VueStripeProviderError,
It as createVueStripe,
lt as createVueStripeError,
Tt as loadStripe,
Vt as useCheckout,
$t as useElements,
St as usePaymentIntent,
wt as useSetupIntent,
X as useStripe,
Vt as useStripeCheckout,
$t as useStripeElements
};