@sudobility/subscription_lib 0.0.3 → 0.0.6
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/adapters/index.d.ts +7 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +6 -0
- package/dist/adapters/revenuecat-web.d.ts +31 -0
- package/dist/adapters/revenuecat-web.d.ts.map +1 -0
- package/dist/adapters/revenuecat-web.js +258 -0
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -1
- package/dist/core/service.d.ts.map +1 -1
- package/dist/core/service.js +1 -0
- package/dist/core/singleton.d.ts +7 -0
- package/dist/core/singleton.d.ts.map +1 -1
- package/dist/core/singleton.js +20 -0
- package/dist/hooks/useUserSubscription.d.ts +3 -1
- package/dist/hooks/useUserSubscription.d.ts.map +1 -1
- package/dist/hooks/useUserSubscription.js +18 -5
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/types/adapter.d.ts +2 -0
- package/dist/types/adapter.d.ts.map +1 -1
- package/dist/types/subscription.d.ts +2 -0
- package/dist/types/subscription.d.ts.map +1 -1
- package/package.json +9 -2
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter Exports
|
|
3
|
+
*
|
|
4
|
+
* Platform-specific adapters for RevenueCat SDK integration.
|
|
5
|
+
*/
|
|
6
|
+
export { configureRevenueCatAdapter, createRevenueCatAdapter, setRevenueCatUser, clearRevenueCatUser, hasRevenueCatUser, } from './revenuecat-web';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RevenueCat Web Adapter
|
|
3
|
+
*
|
|
4
|
+
* Adapter for RevenueCat web SDK (@revenuecat/purchases-js).
|
|
5
|
+
* Provides lazy loading of the SDK to minimize initial bundle size.
|
|
6
|
+
*/
|
|
7
|
+
import type { SubscriptionAdapter } from '../types/adapter';
|
|
8
|
+
/**
|
|
9
|
+
* Configure the RevenueCat adapter with API key.
|
|
10
|
+
* Call this before initializing subscription_lib.
|
|
11
|
+
* RevenueCat SDK is lazily loaded when first needed.
|
|
12
|
+
*/
|
|
13
|
+
export declare function configureRevenueCatAdapter(revenueCatApiKey: string): void;
|
|
14
|
+
/**
|
|
15
|
+
* Set the current user for RevenueCat.
|
|
16
|
+
* Call this when user logs in.
|
|
17
|
+
*/
|
|
18
|
+
export declare function setRevenueCatUser(userId: string, email?: string): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Clear the current user (on logout).
|
|
21
|
+
*/
|
|
22
|
+
export declare function clearRevenueCatUser(): void;
|
|
23
|
+
/**
|
|
24
|
+
* Check if RevenueCat has a user configured.
|
|
25
|
+
*/
|
|
26
|
+
export declare function hasRevenueCatUser(): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Create the subscription adapter for subscription_lib.
|
|
29
|
+
*/
|
|
30
|
+
export declare function createRevenueCatAdapter(): SubscriptionAdapter;
|
|
31
|
+
//# sourceMappingURL=revenuecat-web.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revenuecat-web.d.ts","sourceRoot":"","sources":["../../src/adapters/revenuecat-web.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAKV,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAW1B;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAEzE;AAmCD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAkCf;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAM1C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,mBAAmB,CA8L7D"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RevenueCat Web Adapter
|
|
3
|
+
*
|
|
4
|
+
* Adapter for RevenueCat web SDK (@revenuecat/purchases-js).
|
|
5
|
+
* Provides lazy loading of the SDK to minimize initial bundle size.
|
|
6
|
+
*/
|
|
7
|
+
// Module state
|
|
8
|
+
let purchasesInstance = null;
|
|
9
|
+
let currentUserId = null;
|
|
10
|
+
let apiKey = null;
|
|
11
|
+
/**
|
|
12
|
+
* Configure the RevenueCat adapter with API key.
|
|
13
|
+
* Call this before initializing subscription_lib.
|
|
14
|
+
* RevenueCat SDK is lazily loaded when first needed.
|
|
15
|
+
*/
|
|
16
|
+
export function configureRevenueCatAdapter(revenueCatApiKey) {
|
|
17
|
+
apiKey = revenueCatApiKey;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get or create an anonymous user ID for RevenueCat.
|
|
21
|
+
* RevenueCat web SDK requires a user ID, so we generate one for anonymous users.
|
|
22
|
+
*/
|
|
23
|
+
function getAnonymousUserId() {
|
|
24
|
+
const STORAGE_KEY = 'rc_anonymous_user_id';
|
|
25
|
+
let anonId = localStorage.getItem(STORAGE_KEY);
|
|
26
|
+
if (!anonId) {
|
|
27
|
+
anonId = `anon_${globalThis.crypto.randomUUID()}`;
|
|
28
|
+
localStorage.setItem(STORAGE_KEY, anonId);
|
|
29
|
+
}
|
|
30
|
+
return anonId;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Lazily initialize RevenueCat SDK when first needed.
|
|
34
|
+
* Uses anonymous user ID if no user is logged in.
|
|
35
|
+
*/
|
|
36
|
+
async function ensureInitialized() {
|
|
37
|
+
if (!apiKey) {
|
|
38
|
+
throw new Error('RevenueCat not configured');
|
|
39
|
+
}
|
|
40
|
+
if (!purchasesInstance) {
|
|
41
|
+
const SDK = await import('@revenuecat/purchases-js');
|
|
42
|
+
// Use current user ID or anonymous ID - RevenueCat web SDK requires a user ID
|
|
43
|
+
const userId = currentUserId || getAnonymousUserId();
|
|
44
|
+
purchasesInstance = SDK.Purchases.configure({ apiKey, appUserId: userId });
|
|
45
|
+
}
|
|
46
|
+
return purchasesInstance;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Set the current user for RevenueCat.
|
|
50
|
+
* Call this when user logs in.
|
|
51
|
+
*/
|
|
52
|
+
export async function setRevenueCatUser(userId, email) {
|
|
53
|
+
if (!apiKey) {
|
|
54
|
+
console.warn('[subscription] RevenueCat not configured');
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
// Skip if same user
|
|
58
|
+
if (currentUserId === userId && purchasesInstance) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
currentUserId = userId;
|
|
62
|
+
const SDK = await import('@revenuecat/purchases-js');
|
|
63
|
+
// Close existing instance
|
|
64
|
+
if (purchasesInstance) {
|
|
65
|
+
purchasesInstance.close();
|
|
66
|
+
}
|
|
67
|
+
// Configure new instance with user
|
|
68
|
+
purchasesInstance = SDK.Purchases.configure({
|
|
69
|
+
apiKey,
|
|
70
|
+
appUserId: userId,
|
|
71
|
+
});
|
|
72
|
+
// Set email attribute
|
|
73
|
+
if (email) {
|
|
74
|
+
try {
|
|
75
|
+
await purchasesInstance.setAttributes({ email });
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Ignore attribute errors
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Clear the current user (on logout).
|
|
84
|
+
*/
|
|
85
|
+
export function clearRevenueCatUser() {
|
|
86
|
+
if (purchasesInstance) {
|
|
87
|
+
purchasesInstance.close();
|
|
88
|
+
purchasesInstance = null;
|
|
89
|
+
}
|
|
90
|
+
currentUserId = null;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Check if RevenueCat has a user configured.
|
|
94
|
+
*/
|
|
95
|
+
export function hasRevenueCatUser() {
|
|
96
|
+
return currentUserId !== null && purchasesInstance !== null;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Create the subscription adapter for subscription_lib.
|
|
100
|
+
*/
|
|
101
|
+
export function createRevenueCatAdapter() {
|
|
102
|
+
return {
|
|
103
|
+
async setUserId(userId, email) {
|
|
104
|
+
if (userId) {
|
|
105
|
+
await setRevenueCatUser(userId, email);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
clearRevenueCatUser();
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
async getOfferings() {
|
|
112
|
+
try {
|
|
113
|
+
const purchases = await ensureInitialized();
|
|
114
|
+
const offerings = await purchases.getOfferings();
|
|
115
|
+
console.log('[revenuecat-web] Raw offerings from RevenueCat:', {
|
|
116
|
+
allKeys: Object.keys(offerings.all),
|
|
117
|
+
currentIdentifier: offerings.current?.identifier,
|
|
118
|
+
currentPackageCount: offerings.current?.availablePackages.length,
|
|
119
|
+
});
|
|
120
|
+
const convertPackage = (pkg) => ({
|
|
121
|
+
identifier: pkg.identifier,
|
|
122
|
+
packageType: pkg.packageType,
|
|
123
|
+
product: {
|
|
124
|
+
identifier: pkg.rcBillingProduct.identifier,
|
|
125
|
+
title: pkg.rcBillingProduct.title,
|
|
126
|
+
description: pkg.rcBillingProduct.description || null,
|
|
127
|
+
price: pkg.rcBillingProduct.currentPrice?.amountMicros
|
|
128
|
+
? pkg.rcBillingProduct.currentPrice.amountMicros / 1000000
|
|
129
|
+
: 0,
|
|
130
|
+
priceString: pkg.rcBillingProduct.currentPrice?.formattedPrice || '$0',
|
|
131
|
+
currencyCode: pkg.rcBillingProduct.currentPrice?.currency || 'USD',
|
|
132
|
+
normalPeriodDuration: pkg.rcBillingProduct.normalPeriodDuration || null,
|
|
133
|
+
subscriptionOptions: pkg.rcBillingProduct.defaultSubscriptionOption
|
|
134
|
+
? {
|
|
135
|
+
[pkg.rcBillingProduct.defaultSubscriptionOption.id]: {
|
|
136
|
+
id: pkg.rcBillingProduct.defaultSubscriptionOption.id,
|
|
137
|
+
trial: pkg.rcBillingProduct.defaultSubscriptionOption.trial
|
|
138
|
+
? {
|
|
139
|
+
periodDuration: pkg.rcBillingProduct.defaultSubscriptionOption.trial
|
|
140
|
+
.periodDuration || null,
|
|
141
|
+
price: pkg.rcBillingProduct.defaultSubscriptionOption
|
|
142
|
+
.trial.price?.amountMicros
|
|
143
|
+
? pkg.rcBillingProduct.defaultSubscriptionOption
|
|
144
|
+
.trial.price.amountMicros / 1000000
|
|
145
|
+
: 0,
|
|
146
|
+
priceString: pkg.rcBillingProduct.defaultSubscriptionOption.trial
|
|
147
|
+
.price?.formattedPrice || '$0',
|
|
148
|
+
cycleCount: pkg.rcBillingProduct.defaultSubscriptionOption.trial
|
|
149
|
+
.cycleCount || 1,
|
|
150
|
+
}
|
|
151
|
+
: null,
|
|
152
|
+
introPrice: pkg.rcBillingProduct.defaultSubscriptionOption
|
|
153
|
+
.introPrice
|
|
154
|
+
? {
|
|
155
|
+
periodDuration: pkg.rcBillingProduct.defaultSubscriptionOption
|
|
156
|
+
.introPrice.periodDuration || null,
|
|
157
|
+
price: pkg.rcBillingProduct.defaultSubscriptionOption
|
|
158
|
+
.introPrice.price?.amountMicros
|
|
159
|
+
? pkg.rcBillingProduct.defaultSubscriptionOption
|
|
160
|
+
.introPrice.price.amountMicros / 1000000
|
|
161
|
+
: 0,
|
|
162
|
+
priceString: pkg.rcBillingProduct.defaultSubscriptionOption
|
|
163
|
+
.introPrice.price?.formattedPrice || '$0',
|
|
164
|
+
cycleCount: pkg.rcBillingProduct.defaultSubscriptionOption
|
|
165
|
+
.introPrice.cycleCount || 1,
|
|
166
|
+
}
|
|
167
|
+
: null,
|
|
168
|
+
},
|
|
169
|
+
}
|
|
170
|
+
: undefined,
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
const all = {};
|
|
174
|
+
for (const [key, offering] of Object.entries(offerings.all)) {
|
|
175
|
+
all[key] = {
|
|
176
|
+
identifier: offering.identifier,
|
|
177
|
+
metadata: offering.metadata || null,
|
|
178
|
+
availablePackages: offering.availablePackages.map(convertPackage),
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
all,
|
|
183
|
+
current: offerings.current
|
|
184
|
+
? {
|
|
185
|
+
identifier: offerings.current.identifier,
|
|
186
|
+
metadata: offerings.current.metadata || null,
|
|
187
|
+
availablePackages: offerings.current.availablePackages.map(convertPackage),
|
|
188
|
+
}
|
|
189
|
+
: null,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
console.error('[revenuecat-web] Failed to get offerings:', error);
|
|
194
|
+
return { all: {}, current: null };
|
|
195
|
+
}
|
|
196
|
+
},
|
|
197
|
+
async getCustomerInfo() {
|
|
198
|
+
try {
|
|
199
|
+
const purchases = await ensureInitialized();
|
|
200
|
+
const customerInfo = await purchases.getCustomerInfo();
|
|
201
|
+
const active = {};
|
|
202
|
+
for (const [id, entitlement] of Object.entries(customerInfo.entitlements.active)) {
|
|
203
|
+
active[id] = {
|
|
204
|
+
identifier: entitlement.identifier,
|
|
205
|
+
productIdentifier: entitlement.productIdentifier,
|
|
206
|
+
expirationDate: entitlement.expirationDate?.toISOString() || null,
|
|
207
|
+
willRenew: entitlement.willRenew,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
// Get management URL from the customer info
|
|
211
|
+
// RevenueCat web SDK provides this for subscription management
|
|
212
|
+
const managementUrl = customerInfo.managementURL ?? undefined;
|
|
213
|
+
return {
|
|
214
|
+
activeSubscriptions: Array.from(customerInfo.activeSubscriptions),
|
|
215
|
+
entitlements: { active },
|
|
216
|
+
managementUrl,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
console.error('[revenuecat-web] Failed to get customer info:', error);
|
|
221
|
+
return { activeSubscriptions: [], entitlements: { active: {} } };
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
async purchase(params) {
|
|
225
|
+
const purchases = await ensureInitialized();
|
|
226
|
+
// Find the package across all offerings
|
|
227
|
+
const offerings = await purchases.getOfferings();
|
|
228
|
+
let packageToPurchase;
|
|
229
|
+
for (const offering of Object.values(offerings.all)) {
|
|
230
|
+
packageToPurchase = offering.availablePackages.find(pkg => pkg.identifier === params.packageId);
|
|
231
|
+
if (packageToPurchase)
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
if (!packageToPurchase) {
|
|
235
|
+
throw new Error(`Package not found: ${params.packageId}`);
|
|
236
|
+
}
|
|
237
|
+
const result = await purchases.purchase({
|
|
238
|
+
rcPackage: packageToPurchase,
|
|
239
|
+
});
|
|
240
|
+
// Convert customer info
|
|
241
|
+
const active = {};
|
|
242
|
+
for (const [id, entitlement] of Object.entries(result.customerInfo.entitlements.active)) {
|
|
243
|
+
active[id] = {
|
|
244
|
+
identifier: entitlement.identifier,
|
|
245
|
+
productIdentifier: entitlement.productIdentifier,
|
|
246
|
+
expirationDate: entitlement.expirationDate?.toISOString() || null,
|
|
247
|
+
willRenew: entitlement.willRenew,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
return {
|
|
251
|
+
customerInfo: {
|
|
252
|
+
activeSubscriptions: Array.from(result.customerInfo.activeSubscriptions),
|
|
253
|
+
entitlements: { active },
|
|
254
|
+
},
|
|
255
|
+
};
|
|
256
|
+
},
|
|
257
|
+
};
|
|
258
|
+
}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
* Core Exports
|
|
3
3
|
*/
|
|
4
4
|
export { SubscriptionService, type SubscriptionServiceConfig } from './service';
|
|
5
|
-
export { initializeSubscription, getSubscriptionInstance, isSubscriptionInitialized, resetSubscription, refreshSubscription, setSubscriptionUserId, getSubscriptionUserId, onSubscriptionUserIdChange, type SubscriptionConfig, } from './singleton';
|
|
5
|
+
export { initializeSubscription, getSubscriptionInstance, isSubscriptionInitialized, resetSubscription, refreshSubscription, setSubscriptionUserId, getSubscriptionUserId, onSubscriptionUserIdChange, onSubscriptionRefresh, type SubscriptionConfig, } from './singleton';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,KAAK,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAEhF,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,KAAK,kBAAkB,GACxB,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,KAAK,yBAAyB,EAAE,MAAM,WAAW,CAAC;AAEhF,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,KAAK,kBAAkB,GACxB,MAAM,aAAa,CAAC"}
|
package/dist/core/index.js
CHANGED
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
* Core Exports
|
|
3
3
|
*/
|
|
4
4
|
export { SubscriptionService } from './service';
|
|
5
|
-
export { initializeSubscription, getSubscriptionInstance, isSubscriptionInitialized, resetSubscription, refreshSubscription, setSubscriptionUserId, getSubscriptionUserId, onSubscriptionUserIdChange, } from './singleton';
|
|
5
|
+
export { initializeSubscription, getSubscriptionInstance, isSubscriptionInitialized, resetSubscription, refreshSubscription, setSubscriptionUserId, getSubscriptionUserId, onSubscriptionUserIdChange, onSubscriptionRefresh, } from './singleton';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/core/service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAGV,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EACV,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EAEpB,MAAM,uBAAuB,CAAC;AAG/B;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,wCAAwC;IACxC,OAAO,EAAE,mBAAmB,CAAC;IAC7B,8BAA8B;IAC9B,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,WAAW,CAA6C;IAChE,OAAO,CAAC,mBAAmB,CAAoC;IAC/D,OAAO,CAAC,oBAAoB,CAA8B;IAC1D,OAAO,CAAC,qBAAqB,CAAS;gBAE1B,MAAM,EAAE,yBAAyB;IAS7C;;;;OAIG;IACG,aAAa,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBlE;;OAEG;YACW,eAAe;IAe7B;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/core/service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAGV,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EACV,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EAEpB,MAAM,uBAAuB,CAAC;AAG/B;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,wCAAwC;IACxC,OAAO,EAAE,mBAAmB,CAAC;IAC7B,8BAA8B;IAC9B,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,WAAW,CAA6C;IAChE,OAAO,CAAC,mBAAmB,CAAoC;IAC/D,OAAO,CAAC,oBAAoB,CAA8B;IAC1D,OAAO,CAAC,qBAAqB,CAAS;gBAE1B,MAAM,EAAE,yBAAyB;IAS7C;;;;OAIG;IACG,aAAa,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBlE;;OAEG;YACW,eAAe;IAe7B;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IA8DvC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAInD;;OAEG;IACH,WAAW,IAAI,MAAM,EAAE;IAIvB;;OAEG;IACH,sBAAsB,IAAI,mBAAmB,GAAG,IAAI;IAIpD;;OAEG;IACH,kBAAkB,IAAI,mBAAmB;IASzC;;OAEG;IACH,iBAAiB,IAAI,cAAc;IAInC;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,qBAAqB,CAAC;IASjC;;OAEG;IACH,kBAAkB,IAAI,OAAO;IAI7B;;OAEG;IACH,qBAAqB,IAAI,OAAO;IAIhC;;;OAGG;IACH,iBAAiB,IAAI,IAAI;IAQzB,OAAO,CAAC,aAAa;IAsBrB,OAAO,CAAC,YAAY;IAgCpB,OAAO,CAAC,+BAA+B;CA6BxC"}
|
package/dist/core/service.js
CHANGED
package/dist/core/singleton.d.ts
CHANGED
|
@@ -92,4 +92,11 @@ export declare function getSubscriptionUserId(): string | undefined;
|
|
|
92
92
|
* @returns Unsubscribe function
|
|
93
93
|
*/
|
|
94
94
|
export declare function onSubscriptionUserIdChange(listener: () => void): () => void;
|
|
95
|
+
/**
|
|
96
|
+
* Subscribe to subscription data refresh events.
|
|
97
|
+
* Called after refreshSubscription() completes.
|
|
98
|
+
* @param listener Callback to invoke when subscription data is refreshed
|
|
99
|
+
* @returns Unsubscribe function
|
|
100
|
+
*/
|
|
101
|
+
export declare function onSubscriptionRefresh(listener: () => void): () => void;
|
|
95
102
|
//# sourceMappingURL=singleton.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"singleton.d.ts","sourceRoot":"","sources":["../../src/core/singleton.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,OAAO,EAAE,mBAAmB,CAAC;IAC7B,8BAA8B;IAC9B,QAAQ,EAAE,cAAc,CAAC;CAC1B;
|
|
1
|
+
{"version":3,"file":"singleton.d.ts","sourceRoot":"","sources":["../../src/core/singleton.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,OAAO,EAAE,mBAAmB,CAAC;IAC7B,8BAA8B;IAC9B,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAQD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAMvE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,IAAI,mBAAmB,CAO7D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,OAAO,CAEnD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAUzD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,SAAS,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAQ3E;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAQtE"}
|
package/dist/core/singleton.js
CHANGED
|
@@ -8,6 +8,7 @@ let instance = null;
|
|
|
8
8
|
let currentAdapter = null;
|
|
9
9
|
let currentUserId = undefined;
|
|
10
10
|
const userIdChangeListeners = [];
|
|
11
|
+
const subscriptionRefreshListeners = [];
|
|
11
12
|
/**
|
|
12
13
|
* Initialize the subscription singleton
|
|
13
14
|
*
|
|
@@ -74,6 +75,10 @@ export async function refreshSubscription() {
|
|
|
74
75
|
return;
|
|
75
76
|
}
|
|
76
77
|
await Promise.all([instance.loadOfferings(), instance.loadCustomerInfo()]);
|
|
78
|
+
// Notify listeners that subscription data has been refreshed
|
|
79
|
+
for (const listener of subscriptionRefreshListeners) {
|
|
80
|
+
listener();
|
|
81
|
+
}
|
|
77
82
|
}
|
|
78
83
|
/**
|
|
79
84
|
* Set the user ID for the subscription service.
|
|
@@ -134,3 +139,18 @@ export function onSubscriptionUserIdChange(listener) {
|
|
|
134
139
|
}
|
|
135
140
|
};
|
|
136
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Subscribe to subscription data refresh events.
|
|
144
|
+
* Called after refreshSubscription() completes.
|
|
145
|
+
* @param listener Callback to invoke when subscription data is refreshed
|
|
146
|
+
* @returns Unsubscribe function
|
|
147
|
+
*/
|
|
148
|
+
export function onSubscriptionRefresh(listener) {
|
|
149
|
+
subscriptionRefreshListeners.push(listener);
|
|
150
|
+
return () => {
|
|
151
|
+
const index = subscriptionRefreshListeners.indexOf(listener);
|
|
152
|
+
if (index >= 0) {
|
|
153
|
+
subscriptionRefreshListeners.splice(index, 1);
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
}
|
|
@@ -14,7 +14,9 @@ export interface UseUserSubscriptionResult {
|
|
|
14
14
|
isLoading: boolean;
|
|
15
15
|
/** Error if loading failed */
|
|
16
16
|
error: Error | null;
|
|
17
|
-
/**
|
|
17
|
+
/** Force refresh customer subscription data from the server */
|
|
18
|
+
update: () => Promise<void>;
|
|
19
|
+
/** @deprecated Use update() instead */
|
|
18
20
|
refetch: () => Promise<void>;
|
|
19
21
|
}
|
|
20
22
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUserSubscription.d.ts","sourceRoot":"","sources":["../../src/hooks/useUserSubscription.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"useUserSubscription.d.ts","sourceRoot":"","sources":["../../src/hooks/useUserSubscription.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAUjE;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,iDAAiD;IACjD,YAAY,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACzC,mCAAmC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,8BAA8B;IAC9B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,uCAAuC;IACvC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,yFAAyF;IACzF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,CAAC,EAAE,0BAA0B,GACnC,yBAAyB,CAoG3B"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Fetch and manage current user's subscription status.
|
|
5
5
|
*/
|
|
6
6
|
import { useCallback, useEffect, useState } from 'react';
|
|
7
|
-
import { getSubscriptionInstance, getSubscriptionUserId, isSubscriptionInitialized, onSubscriptionUserIdChange, setSubscriptionUserId, } from '../core/singleton';
|
|
7
|
+
import { getSubscriptionInstance, getSubscriptionUserId, isSubscriptionInitialized, onSubscriptionRefresh, onSubscriptionUserIdChange, setSubscriptionUserId, } from '../core/singleton';
|
|
8
8
|
/**
|
|
9
9
|
* Hook to get current user's subscription status
|
|
10
10
|
*
|
|
@@ -76,13 +76,26 @@ export function useUserSubscription(options) {
|
|
|
76
76
|
useEffect(() => {
|
|
77
77
|
loadData();
|
|
78
78
|
// Subscribe to user ID changes to reload
|
|
79
|
-
const
|
|
79
|
+
const unsubscribeUserId = onSubscriptionUserIdChange(() => {
|
|
80
80
|
console.log('[useUserSubscription] User ID changed, reloading...');
|
|
81
81
|
loadData();
|
|
82
82
|
});
|
|
83
|
-
|
|
83
|
+
// Subscribe to subscription refresh events (e.g., after purchase)
|
|
84
|
+
const unsubscribeRefresh = onSubscriptionRefresh(() => {
|
|
85
|
+
console.log('[useUserSubscription] Subscription refreshed, updating...');
|
|
86
|
+
// Get the updated subscription from the service
|
|
87
|
+
if (isSubscriptionInitialized()) {
|
|
88
|
+
const service = getSubscriptionInstance();
|
|
89
|
+
const currentSub = service.getCurrentSubscription();
|
|
90
|
+
setSubscription(currentSub);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
return () => {
|
|
94
|
+
unsubscribeUserId();
|
|
95
|
+
unsubscribeRefresh();
|
|
96
|
+
};
|
|
84
97
|
}, [loadData]);
|
|
85
|
-
const
|
|
98
|
+
const update = useCallback(async () => {
|
|
86
99
|
if (!isSubscriptionInitialized())
|
|
87
100
|
return;
|
|
88
101
|
const service = getSubscriptionInstance();
|
|
@@ -100,5 +113,5 @@ export function useUserSubscription(options) {
|
|
|
100
113
|
setIsLoading(false);
|
|
101
114
|
}
|
|
102
115
|
}, []);
|
|
103
|
-
return { subscription, isLoading, error, refetch };
|
|
116
|
+
return { subscription, isLoading, error, update, refetch: update };
|
|
104
117
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,9 +4,10 @@
|
|
|
4
4
|
* Cross-platform subscription management library with RevenueCat adapter pattern.
|
|
5
5
|
* Works with both React (web) and React Native.
|
|
6
6
|
*/
|
|
7
|
-
export { initializeSubscription, getSubscriptionInstance, isSubscriptionInitialized, resetSubscription, refreshSubscription, setSubscriptionUserId, getSubscriptionUserId, onSubscriptionUserIdChange, SubscriptionService, type SubscriptionConfig, type SubscriptionServiceConfig, } from './core';
|
|
7
|
+
export { initializeSubscription, getSubscriptionInstance, isSubscriptionInitialized, resetSubscription, refreshSubscription, setSubscriptionUserId, getSubscriptionUserId, onSubscriptionUserIdChange, onSubscriptionRefresh, SubscriptionService, type SubscriptionConfig, type SubscriptionServiceConfig, } from './core';
|
|
8
8
|
export { useSubscriptions, useUserSubscription, useSubscriptionPeriods, useSubscriptionForPeriod, useSubscribable, type UseSubscriptionsResult, type UseSubscriptionsOptions, type UseUserSubscriptionResult, type UseUserSubscriptionOptions, type UseSubscriptionPeriodsResult, type UseSubscriptionForPeriodResult, type UseSubscribableResult, type UseSubscribableOptions, } from './hooks';
|
|
9
9
|
export type { SubscriptionAdapter, AdapterOfferings, AdapterOffering, AdapterPackage, AdapterProduct, AdapterSubscriptionOption, AdapterPricingPhase, AdapterCustomerInfo, AdapterEntitlementInfo, AdapterPurchaseParams, AdapterPurchaseResult, SubscriptionProduct, SubscriptionPackage, SubscriptionOffer, CurrentSubscription, FreeTierConfig, PackageWithLevel, SubscriptionPeriod, } from './types';
|
|
10
10
|
export { PERIOD_RANKS, ALL_PERIODS } from './types';
|
|
11
11
|
export { parseISO8601Period, getPeriodRank, comparePeriods, isPeriodGreaterOrEqual, calculatePackageLevels, addLevelsToPackages, getPackageLevel, findUpgradeablePackages, } from './utils';
|
|
12
|
+
export { configureRevenueCatAdapter, createRevenueCatAdapter, setRevenueCatUser, clearRevenueCatUser, hasRevenueCatUser, } from './adapters';
|
|
12
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,mBAAmB,EACnB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,GAC/B,MAAM,QAAQ,CAAC;AAGhB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,eAAe,EACf,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,8BAA8B,EACnC,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,SAAS,CAAC;AAGjB,YAAY,EAEV,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,cAAc,EACd,yBAAyB,EACzB,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EAErB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAEhB,kBAAkB,GACnB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGpD,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,eAAe,EACf,uBAAuB,GACxB,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,EACnB,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,GAC/B,MAAM,QAAQ,CAAC;AAGhB,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,eAAe,EACf,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAC/B,KAAK,4BAA4B,EACjC,KAAK,8BAA8B,EACnC,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,SAAS,CAAC;AAGjB,YAAY,EAEV,mBAAmB,EACnB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,cAAc,EACd,yBAAyB,EACzB,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EAErB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAEhB,kBAAkB,GACnB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGpD,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,eAAe,EACf,uBAAuB,GACxB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,0BAA0B,EAC1B,uBAAuB,EACvB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,9 +5,11 @@
|
|
|
5
5
|
* Works with both React (web) and React Native.
|
|
6
6
|
*/
|
|
7
7
|
// Core
|
|
8
|
-
export { initializeSubscription, getSubscriptionInstance, isSubscriptionInitialized, resetSubscription, refreshSubscription, setSubscriptionUserId, getSubscriptionUserId, onSubscriptionUserIdChange, SubscriptionService, } from './core';
|
|
8
|
+
export { initializeSubscription, getSubscriptionInstance, isSubscriptionInitialized, resetSubscription, refreshSubscription, setSubscriptionUserId, getSubscriptionUserId, onSubscriptionUserIdChange, onSubscriptionRefresh, SubscriptionService, } from './core';
|
|
9
9
|
// Hooks
|
|
10
10
|
export { useSubscriptions, useUserSubscription, useSubscriptionPeriods, useSubscriptionForPeriod, useSubscribable, } from './hooks';
|
|
11
11
|
export { PERIOD_RANKS, ALL_PERIODS } from './types';
|
|
12
12
|
// Utils
|
|
13
13
|
export { parseISO8601Period, getPeriodRank, comparePeriods, isPeriodGreaterOrEqual, calculatePackageLevels, addLevelsToPackages, getPackageLevel, findUpgradeablePackages, } from './utils';
|
|
14
|
+
// Adapters (platform-specific)
|
|
15
|
+
export { configureRevenueCatAdapter, createRevenueCatAdapter, setRevenueCatUser, clearRevenueCatUser, hasRevenueCatUser, } from './adapters';
|
package/dist/types/adapter.d.ts
CHANGED
|
@@ -104,6 +104,8 @@ export interface AdapterCustomerInfo {
|
|
|
104
104
|
/** Active entitlements map */
|
|
105
105
|
active: Record<string, AdapterEntitlementInfo>;
|
|
106
106
|
};
|
|
107
|
+
/** URL to manage subscription (upgrade/downgrade/cancel) */
|
|
108
|
+
managementUrl?: string;
|
|
107
109
|
}
|
|
108
110
|
/**
|
|
109
111
|
* Parameters for making a purchase
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/types/adapter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,uDAAuD;IACvD,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iEAAiE;IACjE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,mDAAmD;IACnD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,wCAAwC;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,gDAAgD;IAChD,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAClC,uDAAuD;IACvD,UAAU,EAAE,mBAAmB,GAAG,IAAI,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,0BAA0B;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,yFAAyF;IACzF,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,iDAAiD;IACjD,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;CACjE;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,OAAO,EAAE,cAAc,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,0CAA0C;IAC1C,iBAAiB,EAAE,cAAc,EAAE,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACrC,+BAA+B;IAC/B,OAAO,EAAE,eAAe,GAAG,IAAI,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,6BAA6B;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uDAAuD;IACvD,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,2CAA2C;IAC3C,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,qDAAqD;IACrD,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,+BAA+B;IAC/B,YAAY,EAAE;QACZ,8BAA8B;QAC9B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;KAChD,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/types/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -75,6 +75,8 @@ export interface CurrentSubscription {
|
|
|
75
75
|
expirationDate?: Date;
|
|
76
76
|
/** Whether subscription will auto-renew */
|
|
77
77
|
willRenew?: boolean;
|
|
78
|
+
/** URL to manage subscription (upgrade/downgrade/cancel) */
|
|
79
|
+
managementUrl?: string;
|
|
78
80
|
}
|
|
79
81
|
/**
|
|
80
82
|
* Configuration for the free tier
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../src/types/subscription.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,mCAAmC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,sDAAsD;IACtD,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,6BAA6B;IAC7B,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,QAAQ,EAAE,OAAO,CAAC;IAClB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,kCAAkC;IAClC,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,mCAAmC;IACnC,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../src/types/subscription.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,mCAAmC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2CAA2C;IAC3C,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,sDAAsD;IACtD,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,6BAA6B;IAC7B,QAAQ,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,QAAQ,EAAE,OAAO,CAAC;IAClB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qCAAqC;IACrC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,kCAAkC;IAClC,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,mCAAmC;IACnC,cAAc,CAAC,EAAE,IAAI,CAAC;IACtB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,mBAAmB;IAC3D,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;CACf"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sudobility/subscription_lib",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.6",
|
|
4
4
|
"description": "Cross-platform subscription management with RevenueCat adapter pattern",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -29,9 +29,16 @@
|
|
|
29
29
|
"prepublishOnly": "bun run build"
|
|
30
30
|
},
|
|
31
31
|
"peerDependencies": {
|
|
32
|
-
"react": "^19.0.0"
|
|
32
|
+
"react": "^19.0.0",
|
|
33
|
+
"@revenuecat/purchases-js": "^1.0.0"
|
|
34
|
+
},
|
|
35
|
+
"peerDependenciesMeta": {
|
|
36
|
+
"@revenuecat/purchases-js": {
|
|
37
|
+
"optional": true
|
|
38
|
+
}
|
|
33
39
|
},
|
|
34
40
|
"devDependencies": {
|
|
41
|
+
"@revenuecat/purchases-js": "^1.1.3",
|
|
35
42
|
"vitest": "^4.0.4",
|
|
36
43
|
"@eslint/js": "^9.0.0",
|
|
37
44
|
"@types/bun": "^1.2.8",
|