UNPKG

@vue-stripe/vue-stripe

Version:

Vue Stripe elements and composables for Stripe.js

1,353 lines (1,352 loc) 44.9 kB
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 };