recur-tw 0.13.0 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2 -3
- package/dist/index.d.cts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +2 -3
- package/dist/recur.umd.js +1 -1
- package/dist/server.cjs +1 -1
- package/dist/server.js +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -2742,7 +2742,7 @@ function toCamelCase(obj) {
|
|
|
2742
2742
|
|
|
2743
2743
|
// package.json
|
|
2744
2744
|
var package_default = {
|
|
2745
|
-
version: "0.13.
|
|
2745
|
+
version: "0.13.1"};
|
|
2746
2746
|
var SDK_VERSION = package_default.version;
|
|
2747
2747
|
var SDK_TYPE = "react";
|
|
2748
2748
|
var RecurContext = React.createContext(null);
|
|
@@ -3090,8 +3090,7 @@ function RecurProvider({ children, config: initialConfig = {}, customer: custome
|
|
|
3090
3090
|
tokenExpired: checkoutResult.sdkTokenExpiresAt,
|
|
3091
3091
|
creditToken: "",
|
|
3092
3092
|
// No longer needed - creditHash stored in database
|
|
3093
|
-
environment: "SANDBOX"
|
|
3094
|
-
// Will be determined by organization settings
|
|
3093
|
+
environment: checkoutResult.livemode ? "PRODUCTION" : "SANDBOX"
|
|
3095
3094
|
};
|
|
3096
3095
|
console.log("[Recur SDK] SDK token extracted:", {
|
|
3097
3096
|
sdkToken: tokenResult.sdkToken.substring(0, 20) + "...",
|
package/dist/index.d.cts
CHANGED
|
@@ -357,6 +357,11 @@ interface CheckoutResult {
|
|
|
357
357
|
* Used internally for subscription credit binding
|
|
358
358
|
*/
|
|
359
359
|
sdkTimestamp?: number;
|
|
360
|
+
/**
|
|
361
|
+
* Whether the checkout is in live mode (production)
|
|
362
|
+
* false = sandbox, true = production
|
|
363
|
+
*/
|
|
364
|
+
livemode: boolean;
|
|
360
365
|
}
|
|
361
366
|
/**
|
|
362
367
|
* Payment failure codes from payment provider
|
package/dist/index.d.ts
CHANGED
|
@@ -357,6 +357,11 @@ interface CheckoutResult {
|
|
|
357
357
|
* Used internally for subscription credit binding
|
|
358
358
|
*/
|
|
359
359
|
sdkTimestamp?: number;
|
|
360
|
+
/**
|
|
361
|
+
* Whether the checkout is in live mode (production)
|
|
362
|
+
* false = sandbox, true = production
|
|
363
|
+
*/
|
|
364
|
+
livemode: boolean;
|
|
360
365
|
}
|
|
361
366
|
/**
|
|
362
367
|
* Payment failure codes from payment provider
|
package/dist/index.js
CHANGED
|
@@ -2736,7 +2736,7 @@ function toCamelCase(obj) {
|
|
|
2736
2736
|
|
|
2737
2737
|
// package.json
|
|
2738
2738
|
var package_default = {
|
|
2739
|
-
version: "0.13.
|
|
2739
|
+
version: "0.13.1"};
|
|
2740
2740
|
var SDK_VERSION = package_default.version;
|
|
2741
2741
|
var SDK_TYPE = "react";
|
|
2742
2742
|
var RecurContext = createContext(null);
|
|
@@ -3084,8 +3084,7 @@ function RecurProvider({ children, config: initialConfig = {}, customer: custome
|
|
|
3084
3084
|
tokenExpired: checkoutResult.sdkTokenExpiresAt,
|
|
3085
3085
|
creditToken: "",
|
|
3086
3086
|
// No longer needed - creditHash stored in database
|
|
3087
|
-
environment: "SANDBOX"
|
|
3088
|
-
// Will be determined by organization settings
|
|
3087
|
+
environment: checkoutResult.livemode ? "PRODUCTION" : "SANDBOX"
|
|
3089
3088
|
};
|
|
3090
3089
|
console.log("[Recur SDK] SDK token extracted:", {
|
|
3091
3090
|
sdkToken: tokenResult.sdkToken.substring(0, 20) + "...",
|
package/dist/recur.umd.js
CHANGED
|
@@ -2102,7 +2102,7 @@
|
|
|
2102
2102
|
<path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"/>
|
|
2103
2103
|
<circle cx="12" cy="7" r="4"/>
|
|
2104
2104
|
</svg>
|
|
2105
|
-
`}setupEventListeners(){let t=this.shadowRoot?.querySelector("button");t&&t.addEventListener("click",this.handleClick)}redirectToPortal(t){let r=this.getAttribute("target");this.dispatchEvent(new CustomEvent("portal-redirect",{detail:{url:t},bubbles:!0,composed:!0})),r==="_blank"?window.open(t,"_blank","noopener,noreferrer"):window.location.href=t}async fetchAndRedirect(t){let r=this.getAttribute("customer-id"),o=this.getAttribute("return-url");this._isLoading=!0,this.render(),this.setupEventListeners();try{let i={};r&&(i.customerId=r),o&&(i.returnUrl=o);let s=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!s.ok){let d=await s.json().catch(()=>({}));throw new Error(d.error?.message||d.message||`HTTP ${s.status}: Failed to create portal session`)}let a=await s.json(),c=a.url||a.portalUrl;if(!c)throw new Error("Portal URL not found in response");this._isLoading=!1,this.render(),this.setupEventListeners(),this.redirectToPortal(c)}catch(i){this._isLoading=!1,this.render(),this.setupEventListeners(),this.dispatchError(i instanceof Error?i.message:"Failed to create portal session")}}dispatchError(t){console.error("[recur-portal]",t),this.dispatchEvent(new CustomEvent("portal-error",{detail:{message:t},bubbles:!0,composed:!0}))}};typeof window<"u"&&!customElements.get("recur-portal")&&customElements.define("recur-portal",ue)});var jt={};C(jt,{RecurCheckout:()=>O,RecurElements:()=>z,create:()=>gt,createElements:()=>Te,default:()=>Kt,init:()=>ht});async function Dt(){if(typeof window>"u"){console.warn("[Recur SDK] Cannot register Web Components: window is not defined");return}await Promise.all([Promise.resolve().then(()=>(De(),Pe)),Promise.resolve().then(()=>(Le(),Me)),Promise.resolve().then(()=>(He(),Ue)),Promise.resolve().then(()=>(Ne(),Be)),Promise.resolve().then(()=>(Qe(),Ze)),Promise.resolve().then(()=>(tt(),et)),Promise.resolve().then(()=>(at(),nt)),Promise.resolve().then(()=>(lt(),ct)),Promise.resolve().then(()=>(ut(),dt))]);let e=["recur-loading-spinner","recur-success-message","recur-error-display","recur-skeleton-loader","recur-payment-form-skeleton","recur-toast","recur-toast-container","recur-payment-form","recur-checkout","recur-portal"].filter(t=>!customElements.get(t));e.length>0&&console.warn("[Recur SDK] The following components are not registered:",e)}typeof window<"u"&&Dt();function Mt(n){return n.replace(/_([a-z])/g,(e,t)=>t.toUpperCase())}function k(n){if(n==null)return n;if(Array.isArray(n))return n.map(e=>k(e));if(n instanceof Date)return n;if(typeof n=="object"){let e={};for(let[t,r]of Object.entries(n)){let o=Mt(t);e[o]=k(r)}return e}return n}var pe={name:"recur-tw",version:"0.13.
|
|
2105
|
+
`}setupEventListeners(){let t=this.shadowRoot?.querySelector("button");t&&t.addEventListener("click",this.handleClick)}redirectToPortal(t){let r=this.getAttribute("target");this.dispatchEvent(new CustomEvent("portal-redirect",{detail:{url:t},bubbles:!0,composed:!0})),r==="_blank"?window.open(t,"_blank","noopener,noreferrer"):window.location.href=t}async fetchAndRedirect(t){let r=this.getAttribute("customer-id"),o=this.getAttribute("return-url");this._isLoading=!0,this.render(),this.setupEventListeners();try{let i={};r&&(i.customerId=r),o&&(i.returnUrl=o);let s=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)});if(!s.ok){let d=await s.json().catch(()=>({}));throw new Error(d.error?.message||d.message||`HTTP ${s.status}: Failed to create portal session`)}let a=await s.json(),c=a.url||a.portalUrl;if(!c)throw new Error("Portal URL not found in response");this._isLoading=!1,this.render(),this.setupEventListeners(),this.redirectToPortal(c)}catch(i){this._isLoading=!1,this.render(),this.setupEventListeners(),this.dispatchError(i instanceof Error?i.message:"Failed to create portal session")}}dispatchError(t){console.error("[recur-portal]",t),this.dispatchEvent(new CustomEvent("portal-error",{detail:{message:t},bubbles:!0,composed:!0}))}};typeof window<"u"&&!customElements.get("recur-portal")&&customElements.define("recur-portal",ue)});var jt={};C(jt,{RecurCheckout:()=>O,RecurElements:()=>z,create:()=>gt,createElements:()=>Te,default:()=>Kt,init:()=>ht});async function Dt(){if(typeof window>"u"){console.warn("[Recur SDK] Cannot register Web Components: window is not defined");return}await Promise.all([Promise.resolve().then(()=>(De(),Pe)),Promise.resolve().then(()=>(Le(),Me)),Promise.resolve().then(()=>(He(),Ue)),Promise.resolve().then(()=>(Ne(),Be)),Promise.resolve().then(()=>(Qe(),Ze)),Promise.resolve().then(()=>(tt(),et)),Promise.resolve().then(()=>(at(),nt)),Promise.resolve().then(()=>(lt(),ct)),Promise.resolve().then(()=>(ut(),dt))]);let e=["recur-loading-spinner","recur-success-message","recur-error-display","recur-skeleton-loader","recur-payment-form-skeleton","recur-toast","recur-toast-container","recur-payment-form","recur-checkout","recur-portal"].filter(t=>!customElements.get(t));e.length>0&&console.warn("[Recur SDK] The following components are not registered:",e)}typeof window<"u"&&Dt();function Mt(n){return n.replace(/_([a-z])/g,(e,t)=>t.toUpperCase())}function k(n){if(n==null)return n;if(Array.isArray(n))return n.map(e=>k(e));if(n instanceof Date)return n;if(typeof n=="object"){let e={};for(let[t,r]of Object.entries(n)){let o=Mt(t);e[o]=k(r)}return e}return n}var pe={name:"recur-tw",version:"0.13.1",description:"React & Vanilla JS SDK for embedding subscription checkout flows (Taiwan / PAYUNi)",type:"module",private:!1,author:"Recur",license:"Elastic-2.0",keywords:["react","vanilla-js","subscription","checkout","payment","payuni","recurring-billing","taiwan","\u7E41\u9AD4\u4E2D\u6587","sdk","embedded-checkout"],homepage:"https://recur.tw/",bugs:{email:"support@recur.tw"},scripts:{build:"tsup",dev:"tsup --watch",lint:"eslint .","lint:fix":"eslint . --fix","type-check":"tsc --noEmit",examples:"npx http-server . -p 8080 -o /examples/"},main:"./dist/index.js",module:"./dist/index.js",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/index.cjs"},"./server":{types:"./dist/server.d.ts",import:"./dist/server.js",require:"./dist/server.cjs"},"./vanilla":"./dist/recur.umd.js","./checkout":"./dist/checkout.js","./widget":"./dist/widget.js","./package.json":"./package.json"},unpkg:"./dist/recur.umd.js",jsdelivr:"./dist/recur.umd.js",files:["dist","README.md","AGENTS.md","LICENSE"],sideEffects:["src/components/**/*.ts","src/components/**/*.js"],peerDependencies:{react:">=18.0.0","react-dom":">=18.0.0"},peerDependenciesMeta:{react:{optional:!0},"react-dom":{optional:!0}},devDependencies:{"@eslint/js":"^9.39.1","@types/node":"^20.19.9","@types/react":"^19.1.9","@types/react-dom":"^19.1.7","@workspace/typescript-config":"workspace:*",autoprefixer:"^10.4.22",eslint:"^9","eslint-plugin-react":"^7.37.5","eslint-plugin-react-hooks":"^7.0.1",postcss:"^8.5.6",react:"^19.2.1","react-dom":"^19.2.1",tailwindcss:"^4.1.11",tsup:"^8.3.5",typescript:"^5.9.2","typescript-eslint":"^8.47.0"},dependencies:{"lit-html":"^3.3.1"}};var Ut=pe.version,Ht="vanilla",me=class{constructor(e){l(this,"config");if(!e.publishableKey)throw new Error("publishableKey is required");this.config={baseUrl:"https://api.recur.tw",...e}}getHeaders(){return{"Content-Type":"application/json","X-Recur-Publishable-Key":this.config.publishableKey,"X-Recur-SDK-Type":Ht,"X-Recur-SDK-Version":Ut,"X-Recur-Source":typeof window<"u"?window.location.origin:"server"}}async createSubscription(e){let{customerName:t,customerEmail:r}=e,o=e.productId||e.planId,i=e.productSlug;if(!o&&!i)throw new Error("Either productId or productSlug is required");let s={customerName:t,customerEmail:r};o&&(s.productId=o),i&&(s.productSlug=i);let a=await fetch(`${this.config.baseUrl}/v1/subscriptions`,{method:"POST",headers:this.getHeaders(),body:JSON.stringify(s)});if(!a.ok){let d=await a.json().catch(()=>({}));throw{code:d.error||"CHECKOUT_FAILED",message:d.message||"Failed to initiate checkout",details:d}}let c=await a.json();return k(c)}async fetchProducts(e){let t=new URL(`${this.config.baseUrl}/v1/products`);e?.type&&t.searchParams.set("type",e.type);let r=await fetch(t.toString(),{method:"GET",headers:this.getHeaders()});if(!r.ok){let i=await r.json().catch(()=>({}));throw{code:i.error||"FETCH_PRODUCTS_FAILED",message:i.message||"Failed to fetch products",details:i}}let o=await r.json();return k(o)}async fetchPlans(){return{plans:(await this.fetchProducts({type:"SUBSCRIPTION"})).products}}getConfig(){return{...this.config}}};var he=class{constructor(e,t){l(this,"config");l(this,"options");l(this,"container");l(this,"checkoutId",null);l(this,"sdkToken",null);l(this,"sdkTimestamp",null);l(this,"creditToken",null);l(this,"sdkEnv","S");l(this,"payuniSDK",null);l(this,"isFormValid",!1);if(this.config=e,this.options=t,typeof t.container=="string"){let r=document.querySelector(t.container);if(!r)throw new Error(`Container not found: ${t.container}`);this.container=r}else this.container=t.container}async render(){try{await this.initCheckout(),this.renderHTML(),await this.loadPayUniSDK(),await this.initPayUniSDK(),this.setupFormSubmit()}catch(e){this.handleError(e)}}getBaseUrl(){if(this.config.baseUrl)return this.config.baseUrl;if(typeof window<"u"){let e=window.location.hostname;if(e==="localhost"||e.includes(".test")||e.includes(".local")||e==="127.0.0.1")return`${window.location.protocol}//${window.location.host}/api`}return"https://api.recur.tw"}async initCheckout(){let e=this.getBaseUrl(),t=await fetch(`${e}/v1/checkouts`,{method:"POST",headers:{"Content-Type":"application/json","X-Recur-Publishable-Key":this.config.publishableKey},body:JSON.stringify({productId:this.options.productId||this.options.planId,customerEmail:this.options.customerEmail,customerName:this.options.customerName})});if(!t.ok){let i=await t.json().catch(()=>({}));throw new Error(i.error||"Failed to initialize checkout")}let r=await t.json(),o=k(r);this.checkoutId=o.checkout.id,this.sdkToken=o.sdkToken,this.sdkTimestamp=o.sdkTimestamp||null,this.creditToken=o.creditToken||null,this.sdkEnv=this.config.publishableKey.startsWith("pk_test_")?"S":"P"}renderHTML(){this.container.innerHTML=`
|
|
2106
2106
|
<div class="recur-embedded-checkout" style="max-width: 400px; margin: 0 auto; padding: 20px; font-family: system-ui, -apple-system, sans-serif;">
|
|
2107
2107
|
<div class="recur-checkout-header" style="margin-bottom: 24px;">
|
|
2108
2108
|
<h2 style="margin: 0 0 8px 0; font-size: 20px; font-weight: 600; color: #111;">Subscribe</h2>
|
package/dist/server.cjs
CHANGED
package/dist/server.js
CHANGED