@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.
@@ -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,6 @@
1
+ /**
2
+ * Adapter Exports
3
+ *
4
+ * Platform-specific adapters for RevenueCat SDK integration.
5
+ */
6
+ export { configureRevenueCatAdapter, createRevenueCatAdapter, setRevenueCatUser, clearRevenueCatUser, hasRevenueCatUser, } from './revenuecat-web';
@@ -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
+ }
@@ -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
@@ -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"}
@@ -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;IA6DvC;;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"}
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"}
@@ -132,6 +132,7 @@ export class SubscriptionService {
132
132
  ? new Date(firstEntitlement.expirationDate)
133
133
  : undefined,
134
134
  willRenew: firstEntitlement.willRenew,
135
+ managementUrl: customerInfo.managementUrl,
135
136
  };
136
137
  }
137
138
  finally {
@@ -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;AAOD;;;;;;;;;;;;;;;;;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,CAKzD;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"}
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"}
@@ -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
- /** Manually refetch the data */
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;AASjE;;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,gCAAgC;IAChC,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,CAsF3B"}
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 unsubscribe = onSubscriptionUserIdChange(() => {
79
+ const unsubscribeUserId = onSubscriptionUserIdChange(() => {
80
80
  console.log('[useUserSubscription] User ID changed, reloading...');
81
81
  loadData();
82
82
  });
83
- return unsubscribe;
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 refetch = useCallback(async () => {
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
@@ -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';
@@ -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":"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"}
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;CACrB;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"}
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",
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",