@billfn/provider-apple 0.0.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.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +654 -0
- package/dist/index.js.map +1 -0
- package/package.json +37 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { BillFnProviderAdapter } from '@billfn/core';
|
|
2
|
+
export interface AppleNotificationVerifierContext {
|
|
3
|
+
rawBody: string;
|
|
4
|
+
signedPayload: string;
|
|
5
|
+
}
|
|
6
|
+
export interface AppleAdvancedCommerceConfig {
|
|
7
|
+
tokenProvider: () => Promise<string>;
|
|
8
|
+
baseUrl?: string;
|
|
9
|
+
enabled?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface AppleProviderConfig {
|
|
12
|
+
fetch?: typeof fetch;
|
|
13
|
+
environment?: 'production' | 'sandbox';
|
|
14
|
+
tokenProvider: () => Promise<string>;
|
|
15
|
+
notificationVerifier?: (context: AppleNotificationVerifierContext) => Promise<Record<string, unknown> | null>;
|
|
16
|
+
advancedCommerce?: AppleAdvancedCommerceConfig;
|
|
17
|
+
}
|
|
18
|
+
export declare function createAppleProvider(config: AppleProviderConfig): BillFnProviderAdapter;
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAOV,qBAAqB,EAQtB,MAAM,cAAc,CAAC;AAGtB,MAAM,WAAW,gCAAgC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,2BAA2B;IAC1C,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,WAAW,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;IACvC,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE,gCAAgC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9G,gBAAgB,CAAC,EAAE,2BAA2B,CAAC;CAChD;AAQD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,qBAAqB,CAiPtF"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,654 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { createBillFnError } from '@billfn/core';
|
|
3
|
+
export function createAppleProvider(config) {
|
|
4
|
+
const fetchImpl = config.fetch ?? fetch;
|
|
5
|
+
return {
|
|
6
|
+
provider: 'apple',
|
|
7
|
+
capabilities: {
|
|
8
|
+
createCheckout: true,
|
|
9
|
+
verifyCheckout: true,
|
|
10
|
+
cancelSubscription: true,
|
|
11
|
+
syncSubscription: true,
|
|
12
|
+
restorePurchases: true,
|
|
13
|
+
webhookIngestion: true,
|
|
14
|
+
changeSubscription: true,
|
|
15
|
+
resumeSubscription: true,
|
|
16
|
+
refundCharge: true,
|
|
17
|
+
notificationHistory: Boolean(config.notificationVerifier)
|
|
18
|
+
},
|
|
19
|
+
async createCheckout(input) {
|
|
20
|
+
const appAccountToken = createAppleAppAccountToken(input.billingAccount.id);
|
|
21
|
+
return {
|
|
22
|
+
status: 'requires_action',
|
|
23
|
+
clientAction: {
|
|
24
|
+
type: 'apple-purchase',
|
|
25
|
+
productId: input.price.providerProductId,
|
|
26
|
+
metadata: { appAccountToken }
|
|
27
|
+
},
|
|
28
|
+
raw: { appAccountToken }
|
|
29
|
+
};
|
|
30
|
+
},
|
|
31
|
+
async verifyCheckout(input) {
|
|
32
|
+
const transactionId = readString(input.payload ?? {}, ['transactionId', 'originalTransactionId']);
|
|
33
|
+
if (!transactionId) {
|
|
34
|
+
throw createBillFnError({
|
|
35
|
+
code: 'BILLFN_VALIDATION_ERROR',
|
|
36
|
+
message: 'Apple verification requires a transactionId or originalTransactionId'
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
if (input.price.kind === 'subscription') {
|
|
40
|
+
const response = await requestStoreKitWithFallback(fetchImpl, config, `/inApps/v1/subscriptions/${transactionId}`);
|
|
41
|
+
return mapAppleSubscriptionResponse(response.payload, {
|
|
42
|
+
productId: input.price.providerProductId,
|
|
43
|
+
reference: transactionId,
|
|
44
|
+
appAccountToken: createAppleAppAccountToken(input.billingAccount.id)
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
const response = await requestStoreKitWithFallback(fetchImpl, config, `/inApps/v2/history/${transactionId}`);
|
|
48
|
+
return mapAppleHistoryResponse(response.payload, {
|
|
49
|
+
productId: input.price.providerProductId,
|
|
50
|
+
reference: transactionId,
|
|
51
|
+
appAccountToken: createAppleAppAccountToken(input.billingAccount.id)
|
|
52
|
+
});
|
|
53
|
+
},
|
|
54
|
+
async fetchSubscription(input) {
|
|
55
|
+
const transactionId = input.subscription.providerSubscriptionId ?? input.subscription.providerChargeId;
|
|
56
|
+
if (!transactionId) {
|
|
57
|
+
throw createBillFnError({
|
|
58
|
+
code: 'BILLFN_VALIDATION_ERROR',
|
|
59
|
+
message: 'Apple subscription sync requires a provider subscription reference'
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
const response = await requestStoreKitWithFallback(fetchImpl, config, `/inApps/v1/subscriptions/${transactionId}`);
|
|
63
|
+
return mapAppleSubscriptionResponse(response.payload, {
|
|
64
|
+
productId: input.price.providerProductId,
|
|
65
|
+
reference: transactionId,
|
|
66
|
+
appAccountToken: createAppleAppAccountToken(input.subscription.billingAccountId)
|
|
67
|
+
});
|
|
68
|
+
},
|
|
69
|
+
async cancelSubscription(input) {
|
|
70
|
+
const transactionId = input.subscription.providerChargeId ?? input.subscription.providerSubscriptionId;
|
|
71
|
+
if (!transactionId) {
|
|
72
|
+
throw createBillFnError({
|
|
73
|
+
code: 'BILLFN_VALIDATION_ERROR',
|
|
74
|
+
message: 'Apple cancellation requires a transaction reference'
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
if (!config.advancedCommerce?.enabled || !config.advancedCommerce.tokenProvider) {
|
|
78
|
+
return manageSubscriptionAction('Apple subscription management is handled by Apple-managed surfaces');
|
|
79
|
+
}
|
|
80
|
+
const response = await requestAdvancedCommerce(fetchImpl, config.advancedCommerce, `/subscription/cancel/${transactionId}`, {
|
|
81
|
+
method: 'POST'
|
|
82
|
+
});
|
|
83
|
+
return {
|
|
84
|
+
operationStatus: 'applied',
|
|
85
|
+
billingState: {
|
|
86
|
+
subscriptionStatus: 'canceled',
|
|
87
|
+
checkoutStatus: 'succeeded',
|
|
88
|
+
providerSubscriptionId: input.subscription.providerSubscriptionId,
|
|
89
|
+
providerChargeId: input.subscription.providerChargeId,
|
|
90
|
+
currentPeriodStart: input.subscription.currentPeriodStart,
|
|
91
|
+
currentPeriodEnd: input.subscription.currentPeriodEnd,
|
|
92
|
+
autoRenew: false,
|
|
93
|
+
raw: response
|
|
94
|
+
},
|
|
95
|
+
raw: response
|
|
96
|
+
};
|
|
97
|
+
},
|
|
98
|
+
async changeSubscription(_input) {
|
|
99
|
+
return manageSubscriptionAction('Apple plan changes are handled by Apple-managed subscription surfaces');
|
|
100
|
+
},
|
|
101
|
+
async resumeSubscription(_input) {
|
|
102
|
+
return manageSubscriptionAction('Apple subscription resume is handled by Apple-managed subscription surfaces');
|
|
103
|
+
},
|
|
104
|
+
async refundCharge(input) {
|
|
105
|
+
const transactionId = input.providerChargeId ?? input.subscription?.providerChargeId ?? input.subscription?.providerSubscriptionId;
|
|
106
|
+
if (!transactionId) {
|
|
107
|
+
throw createBillFnError({
|
|
108
|
+
code: 'BILLFN_VALIDATION_ERROR',
|
|
109
|
+
message: 'Apple refund requires a transaction reference'
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
if (!config.advancedCommerce?.enabled || !config.advancedCommerce.tokenProvider) {
|
|
113
|
+
return manageSubscriptionAction('Apple refunds require Advanced Commerce or Apple-managed support flows');
|
|
114
|
+
}
|
|
115
|
+
const response = await requestAdvancedCommerce(fetchImpl, config.advancedCommerce, `/subscription/revoke/${transactionId}`, {
|
|
116
|
+
method: 'POST',
|
|
117
|
+
body: JSON.stringify({
|
|
118
|
+
reason: input.reason
|
|
119
|
+
})
|
|
120
|
+
});
|
|
121
|
+
return {
|
|
122
|
+
operationStatus: 'applied',
|
|
123
|
+
providerRefundId: readString(response, ['requestReferenceId', 'refundId']) ?? undefined,
|
|
124
|
+
billingState: input.subscription
|
|
125
|
+
? {
|
|
126
|
+
subscriptionStatus: 'canceled',
|
|
127
|
+
checkoutStatus: 'succeeded',
|
|
128
|
+
providerSubscriptionId: input.subscription.providerSubscriptionId,
|
|
129
|
+
providerChargeId: input.subscription.providerChargeId,
|
|
130
|
+
currentPeriodStart: input.subscription.currentPeriodStart,
|
|
131
|
+
currentPeriodEnd: input.subscription.currentPeriodEnd,
|
|
132
|
+
autoRenew: false,
|
|
133
|
+
raw: response
|
|
134
|
+
}
|
|
135
|
+
: undefined,
|
|
136
|
+
raw: response
|
|
137
|
+
};
|
|
138
|
+
},
|
|
139
|
+
async restorePurchases(input) {
|
|
140
|
+
const response = await requestStoreKitWithFallback(fetchImpl, config, input.price.kind === 'subscription'
|
|
141
|
+
? `/inApps/v1/subscriptions/${input.purchaseReference}`
|
|
142
|
+
: `/inApps/v2/history/${input.purchaseReference}`);
|
|
143
|
+
const expectation = {
|
|
144
|
+
productId: input.price.providerProductId,
|
|
145
|
+
reference: input.purchaseReference,
|
|
146
|
+
appAccountToken: createAppleAppAccountToken(input.billingAccount.id)
|
|
147
|
+
};
|
|
148
|
+
return [input.price.kind === 'subscription'
|
|
149
|
+
? mapAppleSubscriptionResponse(response.payload, expectation)
|
|
150
|
+
: mapAppleHistoryResponse(response.payload, expectation)];
|
|
151
|
+
},
|
|
152
|
+
async parseWebhook(input) {
|
|
153
|
+
let payload;
|
|
154
|
+
try {
|
|
155
|
+
payload = JSON.parse(input.rawBody);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
throw createBillFnError({
|
|
159
|
+
code: 'BILLFN_VALIDATION_ERROR',
|
|
160
|
+
message: 'Apple webhook payload must be valid JSON'
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
const signedPayload = readString(payload, ['signedPayload']);
|
|
164
|
+
if (!signedPayload) {
|
|
165
|
+
throw createBillFnError({
|
|
166
|
+
code: 'BILLFN_VALIDATION_ERROR',
|
|
167
|
+
message: 'Apple webhook payload must include signedPayload'
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
const decoded = await decodeNotificationPayload(config, {
|
|
171
|
+
rawBody: input.rawBody,
|
|
172
|
+
signedPayload
|
|
173
|
+
});
|
|
174
|
+
return [mapAppleNotificationEvent(decoded, signedPayload)];
|
|
175
|
+
},
|
|
176
|
+
async fetchNotificationHistory(input) {
|
|
177
|
+
if (!config.notificationVerifier) {
|
|
178
|
+
throw createBillFnError({
|
|
179
|
+
code: 'BILLFN_FEATURE_UNAVAILABLE',
|
|
180
|
+
message: 'Apple notification history requires notificationVerifier'
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
const response = await requestStoreKitWithFallback(fetchImpl, config, buildNotificationHistoryPath(input.cursor), {
|
|
184
|
+
method: 'POST',
|
|
185
|
+
body: JSON.stringify(buildNotificationHistoryRequest())
|
|
186
|
+
});
|
|
187
|
+
const notifications = Array.isArray(response.payload.notificationHistory)
|
|
188
|
+
? response.payload.notificationHistory
|
|
189
|
+
: Array.isArray(response.payload.signedNotifications)
|
|
190
|
+
? response.payload.signedNotifications
|
|
191
|
+
: [];
|
|
192
|
+
const events = [];
|
|
193
|
+
for (const entry of notifications) {
|
|
194
|
+
const signedPayload = typeof entry === 'string'
|
|
195
|
+
? entry
|
|
196
|
+
: typeof entry === 'object' && entry !== null && typeof entry.signedPayload === 'string'
|
|
197
|
+
? entry.signedPayload
|
|
198
|
+
: null;
|
|
199
|
+
if (!signedPayload) {
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
const decoded = await decodeNotificationPayload(config, {
|
|
203
|
+
rawBody: JSON.stringify({ signedPayload }),
|
|
204
|
+
signedPayload
|
|
205
|
+
});
|
|
206
|
+
events.push(mapAppleNotificationEvent(decoded, signedPayload));
|
|
207
|
+
}
|
|
208
|
+
return {
|
|
209
|
+
events,
|
|
210
|
+
nextCursor: readString(response.payload, ['paginationToken', 'nextPaginationToken']) ?? undefined
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
async function requestStoreKitWithFallback(fetchImpl, config, path, init = {}) {
|
|
216
|
+
const initial = config.environment ?? 'production';
|
|
217
|
+
const environments = initial === 'production' ? ['production', 'sandbox'] : ['sandbox'];
|
|
218
|
+
let lastError;
|
|
219
|
+
for (const environment of environments) {
|
|
220
|
+
try {
|
|
221
|
+
const payload = await requestJson(fetchImpl, buildStoreKitBaseUrl(environment) + path, await config.tokenProvider(), init);
|
|
222
|
+
return {
|
|
223
|
+
environment,
|
|
224
|
+
payload
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
lastError = error;
|
|
229
|
+
if (!shouldFallbackToSandbox(error, environment)) {
|
|
230
|
+
throw error;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
throw lastError;
|
|
235
|
+
}
|
|
236
|
+
async function requestAdvancedCommerce(fetchImpl, config, path, init) {
|
|
237
|
+
const baseUrl = (config.baseUrl ?? 'https://api.storekit.itunes.apple.com/advancedCommerce/v1').replace(/\/$/, '');
|
|
238
|
+
const response = await fetchImpl(`${baseUrl}${path}`, {
|
|
239
|
+
...init,
|
|
240
|
+
headers: {
|
|
241
|
+
authorization: `Bearer ${await config.tokenProvider()}`,
|
|
242
|
+
'content-type': 'application/json',
|
|
243
|
+
...(init.headers ?? {})
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
const raw = await response.text();
|
|
247
|
+
if (!response.ok) {
|
|
248
|
+
throw createBillFnError({
|
|
249
|
+
code: 'BILLFN_PROVIDER_ERROR',
|
|
250
|
+
message: `Apple Advanced Commerce request failed with status ${response.status}`,
|
|
251
|
+
details: {
|
|
252
|
+
status: response.status,
|
|
253
|
+
body: raw
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
return raw ? JSON.parse(raw) : {};
|
|
258
|
+
}
|
|
259
|
+
async function requestJson(fetchImpl, url, token, init = {}) {
|
|
260
|
+
const response = await fetchImpl(url, {
|
|
261
|
+
...init,
|
|
262
|
+
method: init.method ?? 'GET',
|
|
263
|
+
headers: {
|
|
264
|
+
authorization: `Bearer ${token}`,
|
|
265
|
+
'content-type': 'application/json',
|
|
266
|
+
...(init.headers ?? {})
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
const raw = await response.text();
|
|
270
|
+
if (!response.ok) {
|
|
271
|
+
throw createProviderError(response.status, raw);
|
|
272
|
+
}
|
|
273
|
+
return raw ? JSON.parse(raw) : {};
|
|
274
|
+
}
|
|
275
|
+
function createProviderError(status, body) {
|
|
276
|
+
return createBillFnError({
|
|
277
|
+
code: 'BILLFN_PROVIDER_ERROR',
|
|
278
|
+
message: `Apple request failed with status ${status}`,
|
|
279
|
+
details: {
|
|
280
|
+
status,
|
|
281
|
+
body
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
function buildStoreKitBaseUrl(environment) {
|
|
286
|
+
return environment === 'production'
|
|
287
|
+
? 'https://api.storekit.itunes.apple.com'
|
|
288
|
+
: 'https://api.storekit-sandbox.itunes.apple.com';
|
|
289
|
+
}
|
|
290
|
+
function shouldFallbackToSandbox(error, environment) {
|
|
291
|
+
if (environment !== 'production') {
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
if (!error || typeof error !== 'object' || !('details' in error)) {
|
|
295
|
+
return false;
|
|
296
|
+
}
|
|
297
|
+
const details = error.details;
|
|
298
|
+
if (details?.status !== 404 || typeof details.body !== 'string') {
|
|
299
|
+
return false;
|
|
300
|
+
}
|
|
301
|
+
try {
|
|
302
|
+
const payload = JSON.parse(details.body);
|
|
303
|
+
return payload.errorCode === 4040010;
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
async function decodeNotificationPayload(config, context) {
|
|
310
|
+
if (config.notificationVerifier) {
|
|
311
|
+
const verified = await config.notificationVerifier(context);
|
|
312
|
+
if (!verified) {
|
|
313
|
+
throw createBillFnError({
|
|
314
|
+
code: 'BILLFN_WEBHOOK_SIGNATURE_INVALID',
|
|
315
|
+
message: 'Apple notification signature verification failed'
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
return {
|
|
319
|
+
payload: verified,
|
|
320
|
+
signatureVerified: true
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
const payload = decodeJwtPayload(context.signedPayload);
|
|
324
|
+
if (!payload) {
|
|
325
|
+
throw createBillFnError({
|
|
326
|
+
code: 'BILLFN_VALIDATION_ERROR',
|
|
327
|
+
message: 'Apple notification signedPayload could not be decoded'
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
return {
|
|
331
|
+
payload,
|
|
332
|
+
signatureVerified: false
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
function buildNotificationHistoryPath(cursor) {
|
|
336
|
+
const params = new URLSearchParams();
|
|
337
|
+
if (cursor) {
|
|
338
|
+
params.set('paginationToken', cursor);
|
|
339
|
+
}
|
|
340
|
+
const query = params.toString();
|
|
341
|
+
return query ? `/inApps/v1/notifications/history?${query}` : '/inApps/v1/notifications/history';
|
|
342
|
+
}
|
|
343
|
+
function buildNotificationHistoryRequest() {
|
|
344
|
+
const endDate = Date.now();
|
|
345
|
+
return {
|
|
346
|
+
startDate: endDate - 24 * 60 * 60 * 1000,
|
|
347
|
+
endDate
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
function mapAppleNotificationEvent(decoded, signedPayload) {
|
|
351
|
+
const notification = decoded.payload;
|
|
352
|
+
const data = asRecord(notification.data) ?? {};
|
|
353
|
+
const transaction = decodeSignedPayload(data, 'signedTransactionInfo');
|
|
354
|
+
const renewal = decodeSignedPayload(data, 'signedRenewalInfo');
|
|
355
|
+
const notificationType = readString(notification, ['notificationType']) ?? 'UNKNOWN';
|
|
356
|
+
const subtype = readString(notification, ['subtype']) ?? undefined;
|
|
357
|
+
const state = mapAppleNotificationState(notificationType, subtype, transaction, renewal);
|
|
358
|
+
return {
|
|
359
|
+
providerEventId: readString(notification, ['notificationUUID']) ?? readString(notification, ['notificationId']) ?? signedPayload,
|
|
360
|
+
type: subtype ? `${notificationType}.${subtype}` : notificationType,
|
|
361
|
+
signatureVerified: decoded.signatureVerified,
|
|
362
|
+
occurredAt: millisToIso(readTimestamp(notification, ['signedDate'])) ?? undefined,
|
|
363
|
+
providerSubscriptionId: readString(transaction ?? {}, ['originalTransactionId']) ?? undefined,
|
|
364
|
+
providerChargeId: readString(transaction ?? {}, ['transactionId']) ?? undefined,
|
|
365
|
+
priceId: readString(transaction ?? {}, ['productId']) ?? undefined,
|
|
366
|
+
billingState: state,
|
|
367
|
+
raw: notification
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
function mapAppleNotificationState(notificationType, subtype, transaction, renewal) {
|
|
371
|
+
if (notificationType === 'TEST') {
|
|
372
|
+
return undefined;
|
|
373
|
+
}
|
|
374
|
+
const transactionState = mapTransactionPayload(transaction, renewal);
|
|
375
|
+
if (!transactionState) {
|
|
376
|
+
return undefined;
|
|
377
|
+
}
|
|
378
|
+
switch (notificationType) {
|
|
379
|
+
case 'SUBSCRIBED':
|
|
380
|
+
case 'DID_RENEW':
|
|
381
|
+
return {
|
|
382
|
+
...transactionState,
|
|
383
|
+
subscriptionStatus: 'active',
|
|
384
|
+
checkoutStatus: 'succeeded'
|
|
385
|
+
};
|
|
386
|
+
case 'DID_FAIL_TO_RENEW':
|
|
387
|
+
return {
|
|
388
|
+
...transactionState,
|
|
389
|
+
subscriptionStatus: subtype === 'GRACE_PERIOD' ? 'grace' : 'past_due',
|
|
390
|
+
checkoutStatus: 'succeeded'
|
|
391
|
+
};
|
|
392
|
+
case 'EXPIRED':
|
|
393
|
+
return {
|
|
394
|
+
...transactionState,
|
|
395
|
+
subscriptionStatus: 'expired',
|
|
396
|
+
checkoutStatus: 'failed',
|
|
397
|
+
autoRenew: false
|
|
398
|
+
};
|
|
399
|
+
case 'REFUND':
|
|
400
|
+
case 'REFUND_DECLINED_RENEWAL':
|
|
401
|
+
case 'REVOKE':
|
|
402
|
+
case 'CANCEL':
|
|
403
|
+
return {
|
|
404
|
+
...transactionState,
|
|
405
|
+
subscriptionStatus: 'canceled',
|
|
406
|
+
checkoutStatus: 'succeeded',
|
|
407
|
+
autoRenew: false
|
|
408
|
+
};
|
|
409
|
+
case 'DID_CHANGE_RENEWAL_STATUS':
|
|
410
|
+
return {
|
|
411
|
+
...transactionState,
|
|
412
|
+
subscriptionStatus: 'active',
|
|
413
|
+
checkoutStatus: 'succeeded',
|
|
414
|
+
autoRenew: subtype === 'AUTO_RENEW_DISABLED' ? false : transactionState.autoRenew
|
|
415
|
+
};
|
|
416
|
+
case 'DID_CHANGE_RENEWAL_PREF':
|
|
417
|
+
return {
|
|
418
|
+
...transactionState,
|
|
419
|
+
subscriptionStatus: 'active',
|
|
420
|
+
checkoutStatus: 'succeeded'
|
|
421
|
+
};
|
|
422
|
+
default:
|
|
423
|
+
return transactionState;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
function mapAppleSubscriptionResponse(payload, expectation) {
|
|
427
|
+
const { record: lastTransaction, transaction } = selectAppleLastTransaction(payload, expectation);
|
|
428
|
+
const renewalInfo = decodeSignedPayload(lastTransaction, 'signedRenewalInfo');
|
|
429
|
+
const statusCode = readNumber(lastTransaction ?? {}, ['status']) ?? readNumber(transaction, ['status']) ?? 1;
|
|
430
|
+
const subscriptionStatus = normalizeAppleStatus(statusCode);
|
|
431
|
+
return {
|
|
432
|
+
subscriptionStatus,
|
|
433
|
+
checkoutStatus: subscriptionStatus === 'failed' || subscriptionStatus === 'expired' ? 'failed' : 'succeeded',
|
|
434
|
+
providerSubscriptionId: readString(transaction ?? {}, ['originalTransactionId']) ?? undefined,
|
|
435
|
+
providerChargeId: readString(transaction ?? {}, ['transactionId']) ?? undefined,
|
|
436
|
+
currentPeriodStart: millisToIso(readTimestamp(transaction, ['purchaseDate'])) ?? undefined,
|
|
437
|
+
currentPeriodEnd: millisToIso(readTimestamp(transaction, ['expiresDate'])) ?? undefined,
|
|
438
|
+
autoRenew: readNumber(renewalInfo, ['autoRenewStatus']) === 1,
|
|
439
|
+
raw: payload
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
function mapAppleHistoryResponse(payload, expectation) {
|
|
443
|
+
const transactions = extractHistoryTransactions(payload);
|
|
444
|
+
const transaction = selectAppleTransaction(transactions, expectation, 'history');
|
|
445
|
+
const expiresAt = millisToIso(readTimestamp(transaction, ['expiresDate'])) ?? undefined;
|
|
446
|
+
const revokedAt = millisToIso(readTimestamp(transaction, ['revocationDate'])) ?? undefined;
|
|
447
|
+
const isExpired = Boolean(expiresAt && new Date(expiresAt).getTime() < Date.now());
|
|
448
|
+
const subscriptionStatus = revokedAt ? 'canceled' : isExpired ? 'expired' : 'active';
|
|
449
|
+
return {
|
|
450
|
+
subscriptionStatus,
|
|
451
|
+
checkoutStatus: subscriptionStatus === 'expired' ? 'failed' : 'succeeded',
|
|
452
|
+
providerSubscriptionId: readString(transaction, ['originalTransactionId']) ?? undefined,
|
|
453
|
+
providerChargeId: readString(transaction, ['transactionId']) ?? undefined,
|
|
454
|
+
currentPeriodStart: millisToIso(readTimestamp(transaction, ['purchaseDate'])) ?? undefined,
|
|
455
|
+
currentPeriodEnd: expiresAt,
|
|
456
|
+
autoRenew: false,
|
|
457
|
+
raw: payload
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
function mapTransactionPayload(transaction, renewal) {
|
|
461
|
+
if (!transaction) {
|
|
462
|
+
return undefined;
|
|
463
|
+
}
|
|
464
|
+
const statusCode = readNumber(transaction, ['status']) ?? 1;
|
|
465
|
+
return {
|
|
466
|
+
subscriptionStatus: normalizeAppleStatus(statusCode),
|
|
467
|
+
checkoutStatus: statusCode === 2 ? 'failed' : 'succeeded',
|
|
468
|
+
providerSubscriptionId: readString(transaction, ['originalTransactionId']) ?? undefined,
|
|
469
|
+
providerChargeId: readString(transaction, ['transactionId']) ?? undefined,
|
|
470
|
+
currentPeriodStart: millisToIso(readTimestamp(transaction, ['purchaseDate'])) ?? undefined,
|
|
471
|
+
currentPeriodEnd: millisToIso(readTimestamp(transaction, ['expiresDate'])) ?? undefined,
|
|
472
|
+
autoRenew: readNumber(renewal, ['autoRenewStatus']) === 1,
|
|
473
|
+
raw: {
|
|
474
|
+
transaction,
|
|
475
|
+
renewal
|
|
476
|
+
}
|
|
477
|
+
};
|
|
478
|
+
}
|
|
479
|
+
function extractLastTransactionRecords(payload) {
|
|
480
|
+
const groups = Array.isArray(payload.data) ? payload.data : [];
|
|
481
|
+
return groups.flatMap((group) => asArrayOfRecords(asRecord(group)?.lastTransactions));
|
|
482
|
+
}
|
|
483
|
+
function selectAppleLastTransaction(payload, expectation) {
|
|
484
|
+
const candidates = extractLastTransactionRecords(payload)
|
|
485
|
+
.map((record) => ({ record, transaction: decodeSignedPayload(record, 'signedTransactionInfo') }))
|
|
486
|
+
.filter((candidate) => candidate.transaction !== null);
|
|
487
|
+
if (candidates.length === 0) {
|
|
488
|
+
throw createBillFnError({
|
|
489
|
+
code: 'BILLFN_NOT_FOUND',
|
|
490
|
+
message: 'Apple subscription response did not contain any transactions'
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
const match = candidates.find((candidate) => appleTransactionMatches(candidate.transaction, expectation));
|
|
494
|
+
if (!match) {
|
|
495
|
+
throwAppleTransactionConflict();
|
|
496
|
+
}
|
|
497
|
+
return match;
|
|
498
|
+
}
|
|
499
|
+
function selectAppleTransaction(transactions, expectation, responseKind) {
|
|
500
|
+
if (transactions.length === 0) {
|
|
501
|
+
throw createBillFnError({
|
|
502
|
+
code: 'BILLFN_NOT_FOUND',
|
|
503
|
+
message: `Apple ${responseKind} response did not contain any transactions`
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
const match = transactions.find((transaction) => appleTransactionMatches(transaction, expectation));
|
|
507
|
+
if (!match) {
|
|
508
|
+
throwAppleTransactionConflict();
|
|
509
|
+
}
|
|
510
|
+
return match;
|
|
511
|
+
}
|
|
512
|
+
function appleTransactionMatches(transaction, expectation) {
|
|
513
|
+
const transactionId = readString(transaction, ['transactionId']);
|
|
514
|
+
const originalTransactionId = readString(transaction, ['originalTransactionId']);
|
|
515
|
+
const productId = readString(transaction, ['productId']);
|
|
516
|
+
const appAccountToken = readString(transaction, ['appAccountToken']);
|
|
517
|
+
return (productId === expectation.productId &&
|
|
518
|
+
appAccountToken?.toLowerCase() === expectation.appAccountToken.toLowerCase() &&
|
|
519
|
+
(transactionId === expectation.reference || originalTransactionId === expectation.reference));
|
|
520
|
+
}
|
|
521
|
+
function throwAppleTransactionConflict() {
|
|
522
|
+
throw createBillFnError({
|
|
523
|
+
code: 'BILLFN_CONFLICT',
|
|
524
|
+
message: 'Apple transaction does not match the checkout product, reference, and billing account token'
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
function extractHistoryTransactions(payload) {
|
|
528
|
+
const signedTransactions = Array.isArray(payload.signedTransactions) ? payload.signedTransactions : [];
|
|
529
|
+
return signedTransactions
|
|
530
|
+
.map((entry) => (typeof entry === 'string' ? decodeJwtPayload(entry) : null))
|
|
531
|
+
.filter(Boolean);
|
|
532
|
+
}
|
|
533
|
+
function decodeSignedPayload(record, key) {
|
|
534
|
+
const token = record[key];
|
|
535
|
+
return typeof token === 'string' ? decodeJwtPayload(token) : null;
|
|
536
|
+
}
|
|
537
|
+
function decodeJwtPayload(token) {
|
|
538
|
+
const parts = token.split('.');
|
|
539
|
+
if (parts.length < 2) {
|
|
540
|
+
return null;
|
|
541
|
+
}
|
|
542
|
+
try {
|
|
543
|
+
const base = parts[1].replace(/-/g, '+').replace(/_/g, '/');
|
|
544
|
+
const padded = base.padEnd(Math.ceil(base.length / 4) * 4, '=');
|
|
545
|
+
return JSON.parse(Buffer.from(padded, 'base64').toString('utf8'));
|
|
546
|
+
}
|
|
547
|
+
catch {
|
|
548
|
+
return null;
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
function manageSubscriptionAction(message) {
|
|
552
|
+
return {
|
|
553
|
+
operationStatus: 'requires_action',
|
|
554
|
+
clientAction: {
|
|
555
|
+
type: 'manage-subscription',
|
|
556
|
+
metadata: {
|
|
557
|
+
provider: 'apple'
|
|
558
|
+
}
|
|
559
|
+
},
|
|
560
|
+
raw: {
|
|
561
|
+
message
|
|
562
|
+
}
|
|
563
|
+
};
|
|
564
|
+
}
|
|
565
|
+
function normalizeAppleStatus(statusCode) {
|
|
566
|
+
switch (statusCode) {
|
|
567
|
+
case 1:
|
|
568
|
+
return 'active';
|
|
569
|
+
case 2:
|
|
570
|
+
return 'expired';
|
|
571
|
+
case 3:
|
|
572
|
+
case 4:
|
|
573
|
+
return 'grace';
|
|
574
|
+
case 5:
|
|
575
|
+
return 'canceled';
|
|
576
|
+
default:
|
|
577
|
+
return 'failed';
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
function createAppleAppAccountToken(billingAccountId) {
|
|
581
|
+
const bytes = createHash('sha256')
|
|
582
|
+
.update(`billfn:apple:${billingAccountId}`, 'utf8')
|
|
583
|
+
.digest()
|
|
584
|
+
.subarray(0, 16);
|
|
585
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x50;
|
|
586
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
587
|
+
const value = bytes.toString('hex');
|
|
588
|
+
return [
|
|
589
|
+
value.slice(0, 8),
|
|
590
|
+
value.slice(8, 12),
|
|
591
|
+
value.slice(12, 16),
|
|
592
|
+
value.slice(16, 20),
|
|
593
|
+
value.slice(20)
|
|
594
|
+
].join('-');
|
|
595
|
+
}
|
|
596
|
+
function millisToIso(value) {
|
|
597
|
+
if (!value) {
|
|
598
|
+
return null;
|
|
599
|
+
}
|
|
600
|
+
const numeric = Number(value);
|
|
601
|
+
if (Number.isFinite(numeric)) {
|
|
602
|
+
return new Date(numeric).toISOString();
|
|
603
|
+
}
|
|
604
|
+
const date = new Date(value);
|
|
605
|
+
if (Number.isNaN(date.getTime())) {
|
|
606
|
+
return null;
|
|
607
|
+
}
|
|
608
|
+
return date.toISOString();
|
|
609
|
+
}
|
|
610
|
+
function readTimestamp(record, keys) {
|
|
611
|
+
if (!record) {
|
|
612
|
+
return null;
|
|
613
|
+
}
|
|
614
|
+
for (const key of keys) {
|
|
615
|
+
const value = record[key];
|
|
616
|
+
if (typeof value === 'string' && value.length > 0) {
|
|
617
|
+
return value;
|
|
618
|
+
}
|
|
619
|
+
if (typeof value === 'number' && Number.isFinite(value)) {
|
|
620
|
+
return String(value);
|
|
621
|
+
}
|
|
622
|
+
}
|
|
623
|
+
return null;
|
|
624
|
+
}
|
|
625
|
+
function readString(record, keys) {
|
|
626
|
+
for (const key of keys) {
|
|
627
|
+
const value = record[key];
|
|
628
|
+
if (typeof value === 'string' && value.length > 0) {
|
|
629
|
+
return value;
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
return null;
|
|
633
|
+
}
|
|
634
|
+
function readNumber(record, keys) {
|
|
635
|
+
if (!record) {
|
|
636
|
+
return null;
|
|
637
|
+
}
|
|
638
|
+
for (const key of keys) {
|
|
639
|
+
const value = record[key];
|
|
640
|
+
if (typeof value === 'number' && Number.isFinite(value)) {
|
|
641
|
+
return value;
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
return null;
|
|
645
|
+
}
|
|
646
|
+
function asRecord(value) {
|
|
647
|
+
return typeof value === 'object' && value !== null ? value : null;
|
|
648
|
+
}
|
|
649
|
+
function asArrayOfRecords(value) {
|
|
650
|
+
return Array.isArray(value)
|
|
651
|
+
? value.filter((entry) => typeof entry === 'object' && entry !== null)
|
|
652
|
+
: [];
|
|
653
|
+
}
|
|
654
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAiBzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AA2BjD,MAAM,UAAU,mBAAmB,CAAC,MAA2B;IAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;IAExC,OAAO;QACL,QAAQ,EAAE,OAAO;QACjB,YAAY,EAAE;YACZ,cAAc,EAAE,IAAI;YACpB,cAAc,EAAE,IAAI;YACpB,kBAAkB,EAAE,IAAI;YACxB,gBAAgB,EAAE,IAAI;YACtB,gBAAgB,EAAE,IAAI;YACtB,gBAAgB,EAAE,IAAI;YACtB,kBAAkB,EAAE,IAAI;YACxB,kBAAkB,EAAE,IAAI;YACxB,YAAY,EAAE,IAAI;YAClB,mBAAmB,EAAE,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC;SAC1D;QACD,KAAK,CAAC,cAAc,CAAC,KAAgC;YACnD,MAAM,eAAe,GAAG,0BAA0B,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAC5E,OAAO;gBACL,MAAM,EAAE,iBAAiB;gBACzB,YAAY,EAAE;oBACZ,IAAI,EAAE,gBAAgB;oBACtB,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,iBAAiB;oBACxC,QAAQ,EAAE,EAAE,eAAe,EAAE;iBAC9B;gBACD,GAAG,EAAE,EAAE,eAAe,EAAE;aACzB,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,cAAc,CAAC,KAAgC;YACnD,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,eAAe,EAAE,uBAAuB,CAAC,CAAC,CAAC;YAClG,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,iBAAiB,CAAC;oBACtB,IAAI,EAAE,yBAAyB;oBAC/B,OAAO,EAAE,sEAAsE;iBAChF,CAAC,CAAC;YACL,CAAC;YAED,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACxC,MAAM,QAAQ,GAAG,MAAM,2BAA2B,CAChD,SAAS,EACT,MAAM,EACN,4BAA4B,aAAa,EAAE,CAC5C,CAAC;gBACF,OAAO,4BAA4B,CAAC,QAAQ,CAAC,OAAO,EAAE;oBACpD,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,iBAAiB;oBACxC,SAAS,EAAE,aAAa;oBACxB,eAAe,EAAE,0BAA0B,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;iBACrE,CAAC,CAAC;YACL,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,sBAAsB,aAAa,EAAE,CAAC,CAAC;YAC7G,OAAO,uBAAuB,CAAC,QAAQ,CAAC,OAAO,EAAE;gBAC/C,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,iBAAiB;gBACxC,SAAS,EAAE,aAAa;gBACxB,eAAe,EAAE,0BAA0B,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;aACrE,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,iBAAiB,CAAC,KAAkC;YACxD,MAAM,aAAa,GAAG,KAAK,CAAC,YAAY,CAAC,sBAAsB,IAAI,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC;YACvG,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,iBAAiB,CAAC;oBACtB,IAAI,EAAE,yBAAyB;oBAC/B,OAAO,EAAE,oEAAoE;iBAC9E,CAAC,CAAC;YACL,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,4BAA4B,aAAa,EAAE,CAAC,CAAC;YACnH,OAAO,4BAA4B,CAAC,QAAQ,CAAC,OAAO,EAAE;gBACpD,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,iBAAiB;gBACxC,SAAS,EAAE,aAAa;gBACxB,eAAe,EAAE,0BAA0B,CAAC,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC;aACjF,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,kBAAkB,CAAC,KAAoC;YAC3D,MAAM,aAAa,GAAG,KAAK,CAAC,YAAY,CAAC,gBAAgB,IAAI,KAAK,CAAC,YAAY,CAAC,sBAAsB,CAAC;YACvG,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,iBAAiB,CAAC;oBACtB,IAAI,EAAE,yBAAyB;oBAC/B,OAAO,EAAE,qDAAqD;iBAC/D,CAAC,CAAC;YACL,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC;gBAChF,OAAO,wBAAwB,CAAC,oEAAoE,CAAC,CAAC;YACxG,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAC5C,SAAS,EACT,MAAM,CAAC,gBAAgB,EACvB,wBAAwB,aAAa,EAAE,EACvC;gBACE,MAAM,EAAE,MAAM;aACf,CACF,CAAC;YACF,OAAO;gBACL,eAAe,EAAE,SAAS;gBAC1B,YAAY,EAAE;oBACZ,kBAAkB,EAAE,UAAU;oBAC9B,cAAc,EAAE,WAAW;oBAC3B,sBAAsB,EAAE,KAAK,CAAC,YAAY,CAAC,sBAAsB;oBACjE,gBAAgB,EAAE,KAAK,CAAC,YAAY,CAAC,gBAAgB;oBACrD,kBAAkB,EAAE,KAAK,CAAC,YAAY,CAAC,kBAAkB;oBACzD,gBAAgB,EAAE,KAAK,CAAC,YAAY,CAAC,gBAAgB;oBACrD,SAAS,EAAE,KAAK;oBAChB,GAAG,EAAE,QAAQ;iBACd;gBACD,GAAG,EAAE,QAAQ;aAC0B,CAAC;QAC5C,CAAC;QACD,KAAK,CAAC,kBAAkB,CAAC,MAAqC;YAC5D,OAAO,wBAAwB,CAAC,uEAAuE,CAAC,CAAC;QAC3G,CAAC;QACD,KAAK,CAAC,kBAAkB,CAAC,MAAqC;YAC5D,OAAO,wBAAwB,CAAC,6EAA6E,CAAC,CAAC;QACjH,CAAC;QACD,KAAK,CAAC,YAAY,CAAC,KAA8B;YAC/C,MAAM,aAAa,GAAG,KAAK,CAAC,gBAAgB,IAAI,KAAK,CAAC,YAAY,EAAE,gBAAgB,IAAI,KAAK,CAAC,YAAY,EAAE,sBAAsB,CAAC;YACnI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,iBAAiB,CAAC;oBACtB,IAAI,EAAE,yBAAyB;oBAC/B,OAAO,EAAE,+CAA+C;iBACzD,CAAC,CAAC;YACL,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC;gBAChF,OAAO,wBAAwB,CAAC,wEAAwE,CAAC,CAAC;YAC5G,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAC5C,SAAS,EACT,MAAM,CAAC,gBAAgB,EACvB,wBAAwB,aAAa,EAAE,EACvC;gBACE,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,MAAM,EAAE,KAAK,CAAC,MAAM;iBACrB,CAAC;aACH,CACF,CAAC;YACF,OAAO;gBACL,eAAe,EAAE,SAAS;gBAC1B,gBAAgB,EAAE,UAAU,CAAC,QAAQ,EAAE,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC,IAAI,SAAS;gBACvF,YAAY,EAAE,KAAK,CAAC,YAAY;oBAC9B,CAAC,CAAC;wBACE,kBAAkB,EAAE,UAAU;wBAC9B,cAAc,EAAE,WAAW;wBAC3B,sBAAsB,EAAE,KAAK,CAAC,YAAY,CAAC,sBAAsB;wBACjE,gBAAgB,EAAE,KAAK,CAAC,YAAY,CAAC,gBAAgB;wBACrD,kBAAkB,EAAE,KAAK,CAAC,YAAY,CAAC,kBAAkB;wBACzD,gBAAgB,EAAE,KAAK,CAAC,YAAY,CAAC,gBAAgB;wBACrD,SAAS,EAAE,KAAK;wBAChB,GAAG,EAAE,QAAQ;qBACd;oBACH,CAAC,CAAC,SAAS;gBACb,GAAG,EAAE,QAAQ;aAC0B,CAAC;QAC5C,CAAC;QACD,KAAK,CAAC,gBAAgB,CAAC,KAAkC;YACvD,MAAM,QAAQ,GAAG,MAAM,2BAA2B,CAChD,SAAS,EACT,MAAM,EACN,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc;gBACjC,CAAC,CAAC,4BAA4B,KAAK,CAAC,iBAAiB,EAAE;gBACvD,CAAC,CAAC,sBAAsB,KAAK,CAAC,iBAAiB,EAAE,CACpD,CAAC;YACF,MAAM,WAAW,GAAG;gBAClB,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,iBAAiB;gBACxC,SAAS,EAAE,KAAK,CAAC,iBAAiB;gBAClC,eAAe,EAAE,0BAA0B,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;aACrE,CAAC;YACF,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc;oBACzC,CAAC,CAAC,4BAA4B,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;oBAC7D,CAAC,CAAC,uBAAuB,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,KAAK,CAAC,YAAY,CAAC,KAAK;YACtB,IAAI,OAAgC,CAAC;YACrC,IAAI,CAAC;gBACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;YACjE,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,iBAAiB,CAAC;oBACtB,IAAI,EAAE,yBAAyB;oBAC/B,OAAO,EAAE,0CAA0C;iBACpD,CAAC,CAAC;YACL,CAAC;YAED,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,iBAAiB,CAAC;oBACtB,IAAI,EAAE,yBAAyB;oBAC/B,OAAO,EAAE,kDAAkD;iBAC5D,CAAC,CAAC;YACL,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,yBAAyB,CAAC,MAAM,EAAE;gBACtD,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,aAAa;aACd,CAAC,CAAC;YAEH,OAAO,CAAC,yBAAyB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;QAC7D,CAAC;QACD,KAAK,CAAC,wBAAwB,CAAC,KAA0C;YACvE,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;gBACjC,MAAM,iBAAiB,CAAC;oBACtB,IAAI,EAAE,4BAA4B;oBAClC,OAAO,EAAE,0DAA0D;iBACpE,CAAC,CAAC;YACL,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,2BAA2B,CAChD,SAAS,EACT,MAAM,EACN,4BAA4B,CAAC,KAAK,CAAC,MAAM,CAAC,EAC1C;gBACE,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,+BAA+B,EAAE,CAAC;aACxD,CACF,CAAC;YACF,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC;gBACvE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,mBAAmB;gBACtC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC;oBACnD,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,mBAAmB;oBACtC,CAAC,CAAC,EAAE,CAAC;YAET,MAAM,MAAM,GAA+B,EAAE,CAAC;YAC9C,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;gBAClC,MAAM,aAAa,GAAG,OAAO,KAAK,KAAK,QAAQ;oBAC7C,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,OAAQ,KAAqC,CAAC,aAAa,KAAK,QAAQ;wBACvH,CAAC,CAAE,KAAmC,CAAC,aAAa;wBACpD,CAAC,CAAC,IAAI,CAAC;gBACX,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnB,SAAS;gBACX,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,yBAAyB,CAAC,MAAM,EAAE;oBACtD,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC;oBAC1C,aAAa;iBACd,CAAC,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;YACjE,CAAC;YAED,OAAO;gBACL,MAAM;gBACN,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CAAC,IAAI,SAAS;aAClG,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,2BAA2B,CACxC,SAAuB,EACvB,MAA2B,EAC3B,IAAY,EACZ,OAAoB,EAAE;IAEtB,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,IAAI,YAAY,CAAC;IACnD,MAAM,YAAY,GAAoC,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACzH,IAAI,SAAkB,CAAC;IAEvB,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,oBAAoB,CAAC,WAAW,CAAC,GAAG,IAAI,EAAE,MAAM,MAAM,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,CAAC;YAC3H,OAAO;gBACL,WAAW;gBACX,OAAO;aACR,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC;gBACjD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,uBAAuB,CACpC,SAAuB,EACvB,MAAmC,EACnC,IAAY,EACZ,IAAiB;IAEjB,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,2DAA2D,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,OAAO,GAAG,IAAI,EAAE,EAAE;QACpD,GAAG,IAAI;QACP,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,MAAM,MAAM,CAAC,aAAa,EAAE,EAAE;YACvD,cAAc,EAAE,kBAAkB;YAClC,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SACxB;KACF,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,iBAAiB,CAAC;YACtB,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,sDAAsD,QAAQ,CAAC,MAAM,EAAE;YAChF,OAAO,EAAE;gBACP,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,IAAI,EAAE,GAAG;aACV;SACF,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAA6B,CAAC,CAAC,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,SAAuB,EAAE,GAAW,EAAE,KAAa,EAAE,OAAoB,EAAE;IACpG,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;QACpC,GAAG,IAAI;QACP,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;QAC5B,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,KAAK,EAAE;YAChC,cAAc,EAAE,kBAAkB;YAClC,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;SACxB;KACF,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,mBAAmB,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,GAAG,CAAC,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAA6B,CAAC,CAAC,CAAC,EAAE,CAAC;AACjE,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc,EAAE,IAAY;IACvD,OAAO,iBAAiB,CAAC;QACvB,IAAI,EAAE,uBAAuB;QAC7B,OAAO,EAAE,oCAAoC,MAAM,EAAE;QACrD,OAAO,EAAE;YACP,MAAM;YACN,IAAI;SACL;KACF,CAAC,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAAC,WAAqC;IACjE,OAAO,WAAW,KAAK,YAAY;QACjC,CAAC,CAAC,uCAAuC;QACzC,CAAC,CAAC,+CAA+C,CAAC;AACtD,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAc,EAAE,WAAqC;IACpF,IAAI,WAAW,KAAK,YAAY,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,EAAE,CAAC;QACjE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,OAAO,GAAI,KAA4D,CAAC,OAAO,CAAC;IACtF,IAAI,OAAO,EAAE,MAAM,KAAK,GAAG,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAChE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAA4B,CAAC;QACpE,OAAO,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,MAA2B,EAC3B,OAAyC;IAEzC,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,iBAAiB,CAAC;gBACtB,IAAI,EAAE,kCAAkC;gBACxC,OAAO,EAAE,kDAAkD;aAC5D,CAAC,CAAC;QACL,CAAC;QACD,OAAO;YACL,OAAO,EAAE,QAAQ;YACjB,iBAAiB,EAAE,IAAI;SACxB,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,gBAAgB,CAA0B,OAAO,CAAC,aAAa,CAAC,CAAC;IACjF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,iBAAiB,CAAC;YACtB,IAAI,EAAE,yBAAyB;YAC/B,OAAO,EAAE,uDAAuD;SACjE,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,OAAO;QACP,iBAAiB,EAAE,KAAK;KACzB,CAAC;AACJ,CAAC;AAED,SAAS,4BAA4B,CAAC,MAAe;IACnD,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;IAChC,OAAO,KAAK,CAAC,CAAC,CAAC,oCAAoC,KAAK,EAAE,CAAC,CAAC,CAAC,kCAAkC,CAAC;AAClG,CAAC;AAED,SAAS,+BAA+B;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,OAAO;QACL,SAAS,EAAE,OAAO,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;QACxC,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAChC,OAGC,EACD,aAAqB;IAErB,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IACrC,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/C,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IAC/D,MAAM,gBAAgB,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC,kBAAkB,CAAC,CAAC,IAAI,SAAS,CAAC;IACrF,MAAM,OAAO,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC;IACnE,MAAM,KAAK,GAAG,yBAAyB,CAAC,gBAAgB,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAEzF,OAAO;QACL,eAAe,EAAE,UAAU,CAAC,YAAY,EAAE,CAAC,kBAAkB,CAAC,CAAC,IAAI,UAAU,CAAC,YAAY,EAAE,CAAC,gBAAgB,CAAC,CAAC,IAAI,aAAa;QAChI,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,gBAAgB,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,gBAAgB;QACnE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,UAAU,EAAE,WAAW,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,SAAS;QACjF,sBAAsB,EAAE,UAAU,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,uBAAuB,CAAC,CAAC,IAAI,SAAS;QAC7F,gBAAgB,EAAE,UAAU,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,IAAI,SAAS;QAC/E,OAAO,EAAE,UAAU,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,IAAI,SAAS;QAClE,YAAY,EAAE,KAAK;QACnB,GAAG,EAAE,YAAY;KAClB,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAChC,gBAAwB,EACxB,OAA2B,EAC3B,WAA2C,EAC3C,OAAuC;IAEvC,IAAI,gBAAgB,KAAK,MAAM,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACrE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,QAAQ,gBAAgB,EAAE,CAAC;QACzB,KAAK,YAAY,CAAC;QAClB,KAAK,WAAW;YACd,OAAO;gBACL,GAAG,gBAAgB;gBACnB,kBAAkB,EAAE,QAAQ;gBAC5B,cAAc,EAAE,WAAW;aAC5B,CAAC;QACJ,KAAK,mBAAmB;YACtB,OAAO;gBACL,GAAG,gBAAgB;gBACnB,kBAAkB,EAAE,OAAO,KAAK,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU;gBACrE,cAAc,EAAE,WAAW;aAC5B,CAAC;QACJ,KAAK,SAAS;YACZ,OAAO;gBACL,GAAG,gBAAgB;gBACnB,kBAAkB,EAAE,SAAS;gBAC7B,cAAc,EAAE,QAAQ;gBACxB,SAAS,EAAE,KAAK;aACjB,CAAC;QACJ,KAAK,QAAQ,CAAC;QACd,KAAK,yBAAyB,CAAC;QAC/B,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ;YACX,OAAO;gBACL,GAAG,gBAAgB;gBACnB,kBAAkB,EAAE,UAAU;gBAC9B,cAAc,EAAE,WAAW;gBAC3B,SAAS,EAAE,KAAK;aACjB,CAAC;QACJ,KAAK,2BAA2B;YAC9B,OAAO;gBACL,GAAG,gBAAgB;gBACnB,kBAAkB,EAAE,QAAQ;gBAC5B,cAAc,EAAE,WAAW;gBAC3B,SAAS,EAAE,OAAO,KAAK,qBAAqB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,SAAS;aAClF,CAAC;QACJ,KAAK,yBAAyB;YAC5B,OAAO;gBACL,GAAG,gBAAgB;gBACnB,kBAAkB,EAAE,QAAQ;gBAC5B,cAAc,EAAE,WAAW;aAC5B,CAAC;QACJ;YACE,OAAO,gBAAgB,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CACnC,OAAgC,EAChC,WAAwC;IAExC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,0BAA0B,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAClG,MAAM,WAAW,GAAG,mBAAmB,CAAC,eAAe,EAAE,mBAAmB,CAAC,CAAC;IAC9E,MAAM,UAAU,GAAG,UAAU,CAAC,eAAe,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7G,MAAM,kBAAkB,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;IAC5D,OAAO;QACL,kBAAkB;QAClB,cAAc,EAAE,kBAAkB,KAAK,QAAQ,IAAI,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW;QAC5G,sBAAsB,EAAE,UAAU,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,uBAAuB,CAAC,CAAC,IAAI,SAAS;QAC7F,gBAAgB,EAAE,UAAU,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,IAAI,SAAS;QAC/E,kBAAkB,EAAE,WAAW,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,SAAS;QAC1F,gBAAgB,EAAE,WAAW,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,SAAS;QACvF,SAAS,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC;QAC7D,GAAG,EAAE,OAAO;KACb,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAC9B,OAAgC,EAChC,WAAwC;IAExC,MAAM,YAAY,GAAG,0BAA0B,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,WAAW,GAAG,sBAAsB,CAAC,YAAY,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IACjF,MAAM,SAAS,GAAG,WAAW,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;IACxF,MAAM,SAAS,GAAG,WAAW,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;IAC3F,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACnF,MAAM,kBAAkB,GAAG,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IACrF,OAAO;QACL,kBAAkB;QAClB,cAAc,EAAE,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW;QACzE,sBAAsB,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,uBAAuB,CAAC,CAAC,IAAI,SAAS;QACvF,gBAAgB,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,eAAe,CAAC,CAAC,IAAI,SAAS;QACzE,kBAAkB,EAAE,WAAW,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,SAAS;QAC1F,gBAAgB,EAAE,SAAS;QAC3B,SAAS,EAAE,KAAK;QAChB,GAAG,EAAE,OAAO;KACb,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAC5B,WAA2C,EAC3C,OAAuC;IAEvC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO;QACL,kBAAkB,EAAE,oBAAoB,CAAC,UAAU,CAAC;QACpD,cAAc,EAAE,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW;QACzD,sBAAsB,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,uBAAuB,CAAC,CAAC,IAAI,SAAS;QACvF,gBAAgB,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC,eAAe,CAAC,CAAC,IAAI,SAAS;QACzE,kBAAkB,EAAE,WAAW,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,SAAS;QAC1F,gBAAgB,EAAE,WAAW,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,SAAS;QACvF,SAAS,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC;QACzD,GAAG,EAAE;YACH,WAAW;YACX,OAAO;SACR;KACF,CAAC;AACJ,CAAC;AAED,SAAS,6BAA6B,CAAC,OAAgC;IACrE,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC;AACxF,CAAC;AAED,SAAS,0BAA0B,CACjC,OAAgC,EAChC,WAAwC;IAExC,MAAM,UAAU,GAAG,6BAA6B,CAAC,OAAO,CAAC;SACtD,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,CAAC,MAAM,EAAE,uBAAuB,CAAC,EAAE,CAAC,CAAC;SAChG,MAAM,CAAC,CAAC,SAAS,EAA0F,EAAE,CAC5G,SAAS,CAAC,WAAW,KAAK,IAAI,CAC/B,CAAC;IACJ,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,iBAAiB,CAAC;YACtB,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,8DAA8D;SACxE,CAAC,CAAC;IACL,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,uBAAuB,CAAC,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;IAC1G,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,6BAA6B,EAAE,CAAC;IAClC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,sBAAsB,CAC7B,YAAuC,EACvC,WAAwC,EACxC,YAAoB;IAEpB,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,iBAAiB,CAAC;YACtB,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,SAAS,YAAY,4CAA4C;SAC3E,CAAC,CAAC;IACL,CAAC;IACD,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,uBAAuB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;IACpG,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,6BAA6B,EAAE,CAAC;IAClC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,uBAAuB,CAC9B,WAAoC,EACpC,WAAwC;IAExC,MAAM,aAAa,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IACjE,MAAM,qBAAqB,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACjF,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IACzD,MAAM,eAAe,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IACrE,OAAO,CACL,SAAS,KAAK,WAAW,CAAC,SAAS;QACnC,eAAe,EAAE,WAAW,EAAE,KAAK,WAAW,CAAC,eAAe,CAAC,WAAW,EAAE;QAC5E,CAAC,aAAa,KAAK,WAAW,CAAC,SAAS,IAAI,qBAAqB,KAAK,WAAW,CAAC,SAAS,CAAC,CAC7F,CAAC;AACJ,CAAC;AAED,SAAS,6BAA6B;IACpC,MAAM,iBAAiB,CAAC;QACtB,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,6FAA6F;KACvG,CAAC,CAAC;AACL,CAAC;AAED,SAAS,0BAA0B,CAAC,OAAgC;IAClE,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;IACvG,OAAO,kBAAkB;SACtB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAA0B,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SACrG,MAAM,CAAC,OAAO,CAA8B,CAAC;AAClD,CAAC;AAED,SAAS,mBAAmB,CAAC,MAA+B,EAAE,GAAW;IACvE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAA0B,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7F,CAAC;AAED,SAAS,gBAAgB,CAAoC,KAAa;IACxE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAM,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAe;IAC/C,OAAO;QACL,eAAe,EAAE,iBAAiB;QAClC,YAAY,EAAE;YACZ,IAAI,EAAE,qBAAqB;YAC3B,QAAQ,EAAE;gBACR,QAAQ,EAAE,OAAO;aAClB;SACF;QACD,GAAG,EAAE;YACH,OAAO;SACR;KACF,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAkB;IAC9C,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,CAAC;YACJ,OAAO,QAAQ,CAAC;QAClB,KAAK,CAAC;YACJ,OAAO,SAAS,CAAC;QACnB,KAAK,CAAC,CAAC;QACP,KAAK,CAAC;YACJ,OAAO,OAAO,CAAC;QACjB,KAAK,CAAC;YACJ,OAAO,UAAU,CAAC;QACpB;YACE,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,0BAA0B,CAAC,gBAAwB;IAC1D,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC;SAC/B,MAAM,CAAC,gBAAgB,gBAAgB,EAAE,EAAE,MAAM,CAAC;SAClD,MAAM,EAAE;SACR,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnB,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACpC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpC,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACjB,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAClB,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC;QACnB,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC;QACnB,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;KAChB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACd,CAAC;AAED,SAAS,WAAW,CAAC,KAAoB;IACvC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;IACzC,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,aAAa,CAAC,MAAsC,EAAE,IAAc;IAC3E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,MAA+B,EAAE,IAAc;IACjE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,MAAsC,EAAE,IAAc;IACxE,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAE,KAAiC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjG,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACzB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAoC,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;QACxG,CAAC,CAAC,EAAE,CAAC;AACT,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@billfn/provider-apple",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Apple provider adapter for billfn",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"test": "vitest run",
|
|
20
|
+
"typecheck": "tsc --noEmit",
|
|
21
|
+
"clean": "rm -rf dist"
|
|
22
|
+
},
|
|
23
|
+
"author": "21n",
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"publishConfig": {
|
|
26
|
+
"access": "public"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@billfn/core": "^0.0.1"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/node": "^22.0.0",
|
|
33
|
+
"typescript": "^5.6.0",
|
|
34
|
+
"vitest": "^3.2.4"
|
|
35
|
+
},
|
|
36
|
+
"gitHead": "f8eb29238bac5f1c40843c938335901ff6cf2a73"
|
|
37
|
+
}
|