@spaire/adapter-utils 1.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.cjs ADDED
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ EntitlementStrategy: () => EntitlementStrategy,
24
+ Entitlements: () => Entitlements,
25
+ handleWebhookPayload: () => handleWebhookPayload
26
+ });
27
+ module.exports = __toCommonJS(index_exports);
28
+
29
+ // src/webhooks/webhooks.ts
30
+ var handleWebhookPayload = async (payload, { webhookSecret, entitlements, onPayload, ...eventHandlers }) => {
31
+ const promises = [];
32
+ if (onPayload) {
33
+ promises.push(onPayload(payload));
34
+ }
35
+ switch (payload.type) {
36
+ case "checkout.created":
37
+ if (eventHandlers.onCheckoutCreated) {
38
+ promises.push(eventHandlers.onCheckoutCreated(payload));
39
+ }
40
+ break;
41
+ case "checkout.updated":
42
+ if (eventHandlers.onCheckoutUpdated) {
43
+ promises.push(eventHandlers.onCheckoutUpdated(payload));
44
+ }
45
+ break;
46
+ case "order.created":
47
+ if (eventHandlers.onOrderCreated) {
48
+ promises.push(eventHandlers.onOrderCreated(payload));
49
+ }
50
+ break;
51
+ case "order.updated":
52
+ if (eventHandlers.onOrderUpdated) {
53
+ promises.push(eventHandlers.onOrderUpdated(payload));
54
+ }
55
+ break;
56
+ case "order.paid":
57
+ if (eventHandlers.onOrderPaid) {
58
+ promises.push(eventHandlers.onOrderPaid(payload));
59
+ }
60
+ break;
61
+ case "subscription.created":
62
+ if (eventHandlers.onSubscriptionCreated) {
63
+ promises.push(eventHandlers.onSubscriptionCreated(payload));
64
+ }
65
+ break;
66
+ case "subscription.updated":
67
+ if (eventHandlers.onSubscriptionUpdated) {
68
+ promises.push(eventHandlers.onSubscriptionUpdated(payload));
69
+ }
70
+ break;
71
+ case "subscription.active":
72
+ if (eventHandlers.onSubscriptionActive) {
73
+ promises.push(eventHandlers.onSubscriptionActive(payload));
74
+ }
75
+ break;
76
+ case "subscription.canceled":
77
+ if (eventHandlers.onSubscriptionCanceled) {
78
+ promises.push(eventHandlers.onSubscriptionCanceled(payload));
79
+ }
80
+ break;
81
+ case "subscription.uncanceled":
82
+ if (eventHandlers.onSubscriptionUncanceled) {
83
+ promises.push(eventHandlers.onSubscriptionUncanceled(payload));
84
+ }
85
+ break;
86
+ case "subscription.revoked":
87
+ if (eventHandlers.onSubscriptionRevoked) {
88
+ promises.push(eventHandlers.onSubscriptionRevoked(payload));
89
+ }
90
+ break;
91
+ case "product.created":
92
+ if (eventHandlers.onProductCreated) {
93
+ promises.push(eventHandlers.onProductCreated(payload));
94
+ }
95
+ break;
96
+ case "product.updated":
97
+ if (eventHandlers.onProductUpdated) {
98
+ promises.push(eventHandlers.onProductUpdated(payload));
99
+ }
100
+ break;
101
+ case "organization.updated":
102
+ if (eventHandlers.onOrganizationUpdated) {
103
+ promises.push(eventHandlers.onOrganizationUpdated(payload));
104
+ }
105
+ break;
106
+ case "benefit.created":
107
+ if (eventHandlers.onBenefitCreated) {
108
+ promises.push(eventHandlers.onBenefitCreated(payload));
109
+ }
110
+ break;
111
+ case "benefit.updated":
112
+ if (eventHandlers.onBenefitUpdated) {
113
+ promises.push(eventHandlers.onBenefitUpdated(payload));
114
+ }
115
+ break;
116
+ case "benefit_grant.created":
117
+ if (eventHandlers.onBenefitGrantCreated) {
118
+ promises.push(eventHandlers.onBenefitGrantCreated(payload));
119
+ }
120
+ break;
121
+ case "benefit_grant.updated":
122
+ if (eventHandlers.onBenefitGrantUpdated) {
123
+ promises.push(eventHandlers.onBenefitGrantUpdated(payload));
124
+ }
125
+ break;
126
+ case "benefit_grant.revoked":
127
+ if (eventHandlers.onBenefitGrantRevoked) {
128
+ promises.push(eventHandlers.onBenefitGrantRevoked(payload));
129
+ }
130
+ break;
131
+ case "customer.created":
132
+ if (eventHandlers.onCustomerCreated) {
133
+ promises.push(eventHandlers.onCustomerCreated(payload));
134
+ }
135
+ break;
136
+ case "customer.updated":
137
+ if (eventHandlers.onCustomerUpdated) {
138
+ promises.push(eventHandlers.onCustomerUpdated(payload));
139
+ }
140
+ break;
141
+ case "customer.deleted":
142
+ if (eventHandlers.onCustomerDeleted) {
143
+ promises.push(eventHandlers.onCustomerDeleted(payload));
144
+ }
145
+ break;
146
+ case "customer.state_changed":
147
+ if (eventHandlers.onCustomerStateChanged) {
148
+ promises.push(eventHandlers.onCustomerStateChanged(payload));
149
+ }
150
+ break;
151
+ case "order.refunded":
152
+ if (eventHandlers.onOrderRefunded) {
153
+ promises.push(eventHandlers.onOrderRefunded(payload));
154
+ }
155
+ break;
156
+ case "refund.created":
157
+ if (eventHandlers.onRefundCreated) {
158
+ promises.push(eventHandlers.onRefundCreated(payload));
159
+ }
160
+ break;
161
+ case "refund.updated":
162
+ if (eventHandlers.onRefundUpdated) {
163
+ promises.push(eventHandlers.onRefundUpdated(payload));
164
+ }
165
+ break;
166
+ }
167
+ switch (payload.type) {
168
+ case "benefit_grant.created":
169
+ case "benefit_grant.revoked":
170
+ if (entitlements) {
171
+ for (const handler of entitlements.handlers) {
172
+ promises.push(handler(payload));
173
+ }
174
+ }
175
+ }
176
+ return Promise.all(promises);
177
+ };
178
+
179
+ // src/entitlement/entitlement.ts
180
+ var EntitlementStrategy = class {
181
+ grantCallbacks = [];
182
+ revokeCallbacks = [];
183
+ grant(callback) {
184
+ this.grantCallbacks.push(callback);
185
+ return this;
186
+ }
187
+ revoke(callback) {
188
+ this.revokeCallbacks.push(callback);
189
+ return this;
190
+ }
191
+ handler(slug) {
192
+ return async (payload) => {
193
+ if (payload.data.benefit.description === slug) {
194
+ switch (payload.type) {
195
+ case "benefit_grant.created":
196
+ await Promise.all(
197
+ this.grantCallbacks.map(
198
+ (callback) => callback({
199
+ customer: payload.data.customer,
200
+ properties: payload.data.properties,
201
+ payload
202
+ })
203
+ )
204
+ );
205
+ break;
206
+ case "benefit_grant.revoked":
207
+ await Promise.all(
208
+ this.revokeCallbacks.map(
209
+ (callback) => callback({
210
+ customer: payload.data.customer,
211
+ properties: payload.data.properties,
212
+ payload
213
+ })
214
+ )
215
+ );
216
+ break;
217
+ }
218
+ }
219
+ };
220
+ }
221
+ };
222
+ var Entitlements = class {
223
+ static handlers = [];
224
+ static use(slug, strategy) {
225
+ this.handlers.push(strategy.handler(slug));
226
+ return this;
227
+ }
228
+ };
229
+ // Annotate the CommonJS export names for ESM import in node:
230
+ 0 && (module.exports = {
231
+ EntitlementStrategy,
232
+ Entitlements,
233
+ handleWebhookPayload
234
+ });
@@ -0,0 +1,82 @@
1
+ import { validateEvent } from '@spaire/sdk/webhooks';
2
+ import { WebhookBenefitCreatedPayload } from '@spaire/sdk/models/components/webhookbenefitcreatedpayload';
3
+ import { WebhookBenefitGrantCreatedPayload } from '@spaire/sdk/models/components/webhookbenefitgrantcreatedpayload';
4
+ import { WebhookBenefitGrantRevokedPayload } from '@spaire/sdk/models/components/webhookbenefitgrantrevokedpayload';
5
+ import { WebhookBenefitGrantUpdatedPayload } from '@spaire/sdk/models/components/webhookbenefitgrantupdatedpayload';
6
+ import { WebhookBenefitUpdatedPayload } from '@spaire/sdk/models/components/webhookbenefitupdatedpayload';
7
+ import { WebhookCheckoutCreatedPayload } from '@spaire/sdk/models/components/webhookcheckoutcreatedpayload';
8
+ import { WebhookCheckoutUpdatedPayload } from '@spaire/sdk/models/components/webhookcheckoutupdatedpayload';
9
+ import { WebhookOrderCreatedPayload } from '@spaire/sdk/models/components/webhookordercreatedpayload';
10
+ import { WebhookOrderPaidPayload } from '@spaire/sdk/models/components/webhookorderpaidpayload';
11
+ import { WebhookOrderRefundedPayload } from '@spaire/sdk/models/components/webhookorderrefundedpayload';
12
+ import { WebhookOrderUpdatedPayload } from '@spaire/sdk/models/components/webhookorderupdatedpayload';
13
+ import { WebhookOrganizationUpdatedPayload } from '@spaire/sdk/models/components/webhookorganizationupdatedpayload';
14
+ import { WebhookProductCreatedPayload } from '@spaire/sdk/models/components/webhookproductcreatedpayload';
15
+ import { WebhookProductUpdatedPayload } from '@spaire/sdk/models/components/webhookproductupdatedpayload';
16
+ import { WebhookRefundCreatedPayload } from '@spaire/sdk/models/components/webhookrefundcreatedpayload';
17
+ import { WebhookRefundUpdatedPayload } from '@spaire/sdk/models/components/webhookrefundupdatedpayload';
18
+ import { WebhookSubscriptionActivePayload } from '@spaire/sdk/models/components/webhooksubscriptionactivepayload';
19
+ import { WebhookSubscriptionCanceledPayload } from '@spaire/sdk/models/components/webhooksubscriptioncanceledpayload';
20
+ import { WebhookSubscriptionCreatedPayload } from '@spaire/sdk/models/components/webhooksubscriptioncreatedpayload';
21
+ import { WebhookSubscriptionRevokedPayload } from '@spaire/sdk/models/components/webhooksubscriptionrevokedpayload';
22
+ import { WebhookSubscriptionUncanceledPayload } from '@spaire/sdk/models/components/webhooksubscriptionuncanceledpayload';
23
+ import { WebhookSubscriptionUpdatedPayload } from '@spaire/sdk/models/components/webhooksubscriptionupdatedpayload';
24
+ import { Customer } from '@spaire/sdk/models/components/customer';
25
+ import { WebhookCustomerUpdatedPayload } from '@spaire/sdk/models/components/webhookcustomerupdatedpayload';
26
+ import { WebhookCustomerDeletedPayload } from '@spaire/sdk/models/components/webhookcustomerdeletedpayload';
27
+ import { WebhookCustomerCreatedPayload } from '@spaire/sdk/models/components/webhookcustomercreatedpayload';
28
+ import { WebhookCustomerStateChangedPayload } from '@spaire/sdk/models/components/webhookcustomerstatechangedpayload';
29
+
30
+ type EntitlementProperties = Record<string, string>;
31
+ type EntitlementHandler = (payload: WebhookBenefitGrantCreatedPayload | WebhookBenefitGrantRevokedPayload) => Promise<void>;
32
+ interface EntitlementContext<T extends EntitlementProperties> {
33
+ customer: Customer;
34
+ properties: T;
35
+ payload: WebhookBenefitGrantCreatedPayload | WebhookBenefitGrantRevokedPayload;
36
+ }
37
+ declare class EntitlementStrategy<T extends EntitlementProperties> {
38
+ private grantCallbacks;
39
+ private revokeCallbacks;
40
+ grant(callback: (context: EntitlementContext<T>) => Promise<void>): this;
41
+ revoke(callback: (context: EntitlementContext<T>) => Promise<void>): this;
42
+ handler(slug: string): EntitlementHandler;
43
+ }
44
+ declare class Entitlements {
45
+ static handlers: EntitlementHandler[];
46
+ static use<T extends EntitlementProperties = EntitlementProperties>(slug: string, strategy: EntitlementStrategy<T>): typeof Entitlements;
47
+ }
48
+
49
+ interface WebhooksConfig {
50
+ webhookSecret: string;
51
+ entitlements?: typeof Entitlements;
52
+ onPayload?: (payload: ReturnType<typeof validateEvent>) => Promise<void>;
53
+ onCheckoutCreated?: (payload: WebhookCheckoutCreatedPayload) => Promise<void>;
54
+ onCheckoutUpdated?: (payload: WebhookCheckoutUpdatedPayload) => Promise<void>;
55
+ onOrderCreated?: (payload: WebhookOrderCreatedPayload) => Promise<void>;
56
+ onOrderUpdated?: (payload: WebhookOrderUpdatedPayload) => Promise<void>;
57
+ onOrderPaid?: (payload: WebhookOrderPaidPayload) => Promise<void>;
58
+ onOrderRefunded?: (payload: WebhookOrderRefundedPayload) => Promise<void>;
59
+ onRefundCreated?: (payload: WebhookRefundCreatedPayload) => Promise<void>;
60
+ onRefundUpdated?: (payload: WebhookRefundUpdatedPayload) => Promise<void>;
61
+ onSubscriptionCreated?: (payload: WebhookSubscriptionCreatedPayload) => Promise<void>;
62
+ onSubscriptionUpdated?: (payload: WebhookSubscriptionUpdatedPayload) => Promise<void>;
63
+ onSubscriptionActive?: (payload: WebhookSubscriptionActivePayload) => Promise<void>;
64
+ onSubscriptionCanceled?: (payload: WebhookSubscriptionCanceledPayload) => Promise<void>;
65
+ onSubscriptionRevoked?: (payload: WebhookSubscriptionRevokedPayload) => Promise<void>;
66
+ onSubscriptionUncanceled?: (payload: WebhookSubscriptionUncanceledPayload) => Promise<void>;
67
+ onProductCreated?: (payload: WebhookProductCreatedPayload) => Promise<void>;
68
+ onProductUpdated?: (payload: WebhookProductUpdatedPayload) => Promise<void>;
69
+ onOrganizationUpdated?: (payload: WebhookOrganizationUpdatedPayload) => Promise<void>;
70
+ onBenefitCreated?: (payload: WebhookBenefitCreatedPayload) => Promise<void>;
71
+ onBenefitUpdated?: (payload: WebhookBenefitUpdatedPayload) => Promise<void>;
72
+ onBenefitGrantCreated?: (payload: WebhookBenefitGrantCreatedPayload) => Promise<void>;
73
+ onBenefitGrantUpdated?: (payload: WebhookBenefitGrantUpdatedPayload) => Promise<void>;
74
+ onBenefitGrantRevoked?: (payload: WebhookBenefitGrantRevokedPayload) => Promise<void>;
75
+ onCustomerCreated?: (payload: WebhookCustomerCreatedPayload) => Promise<void>;
76
+ onCustomerUpdated?: (payload: WebhookCustomerUpdatedPayload) => Promise<void>;
77
+ onCustomerDeleted?: (payload: WebhookCustomerDeletedPayload) => Promise<void>;
78
+ onCustomerStateChanged?: (payload: WebhookCustomerStateChangedPayload) => Promise<void>;
79
+ }
80
+ declare const handleWebhookPayload: (payload: ReturnType<typeof validateEvent>, { webhookSecret, entitlements, onPayload, ...eventHandlers }: WebhooksConfig) => Promise<void[]>;
81
+
82
+ export { type EntitlementContext, type EntitlementHandler, type EntitlementProperties, EntitlementStrategy, Entitlements, type WebhooksConfig, handleWebhookPayload };
@@ -0,0 +1,82 @@
1
+ import { validateEvent } from '@spaire/sdk/webhooks';
2
+ import { WebhookBenefitCreatedPayload } from '@spaire/sdk/models/components/webhookbenefitcreatedpayload';
3
+ import { WebhookBenefitGrantCreatedPayload } from '@spaire/sdk/models/components/webhookbenefitgrantcreatedpayload';
4
+ import { WebhookBenefitGrantRevokedPayload } from '@spaire/sdk/models/components/webhookbenefitgrantrevokedpayload';
5
+ import { WebhookBenefitGrantUpdatedPayload } from '@spaire/sdk/models/components/webhookbenefitgrantupdatedpayload';
6
+ import { WebhookBenefitUpdatedPayload } from '@spaire/sdk/models/components/webhookbenefitupdatedpayload';
7
+ import { WebhookCheckoutCreatedPayload } from '@spaire/sdk/models/components/webhookcheckoutcreatedpayload';
8
+ import { WebhookCheckoutUpdatedPayload } from '@spaire/sdk/models/components/webhookcheckoutupdatedpayload';
9
+ import { WebhookOrderCreatedPayload } from '@spaire/sdk/models/components/webhookordercreatedpayload';
10
+ import { WebhookOrderPaidPayload } from '@spaire/sdk/models/components/webhookorderpaidpayload';
11
+ import { WebhookOrderRefundedPayload } from '@spaire/sdk/models/components/webhookorderrefundedpayload';
12
+ import { WebhookOrderUpdatedPayload } from '@spaire/sdk/models/components/webhookorderupdatedpayload';
13
+ import { WebhookOrganizationUpdatedPayload } from '@spaire/sdk/models/components/webhookorganizationupdatedpayload';
14
+ import { WebhookProductCreatedPayload } from '@spaire/sdk/models/components/webhookproductcreatedpayload';
15
+ import { WebhookProductUpdatedPayload } from '@spaire/sdk/models/components/webhookproductupdatedpayload';
16
+ import { WebhookRefundCreatedPayload } from '@spaire/sdk/models/components/webhookrefundcreatedpayload';
17
+ import { WebhookRefundUpdatedPayload } from '@spaire/sdk/models/components/webhookrefundupdatedpayload';
18
+ import { WebhookSubscriptionActivePayload } from '@spaire/sdk/models/components/webhooksubscriptionactivepayload';
19
+ import { WebhookSubscriptionCanceledPayload } from '@spaire/sdk/models/components/webhooksubscriptioncanceledpayload';
20
+ import { WebhookSubscriptionCreatedPayload } from '@spaire/sdk/models/components/webhooksubscriptioncreatedpayload';
21
+ import { WebhookSubscriptionRevokedPayload } from '@spaire/sdk/models/components/webhooksubscriptionrevokedpayload';
22
+ import { WebhookSubscriptionUncanceledPayload } from '@spaire/sdk/models/components/webhooksubscriptionuncanceledpayload';
23
+ import { WebhookSubscriptionUpdatedPayload } from '@spaire/sdk/models/components/webhooksubscriptionupdatedpayload';
24
+ import { Customer } from '@spaire/sdk/models/components/customer';
25
+ import { WebhookCustomerUpdatedPayload } from '@spaire/sdk/models/components/webhookcustomerupdatedpayload';
26
+ import { WebhookCustomerDeletedPayload } from '@spaire/sdk/models/components/webhookcustomerdeletedpayload';
27
+ import { WebhookCustomerCreatedPayload } from '@spaire/sdk/models/components/webhookcustomercreatedpayload';
28
+ import { WebhookCustomerStateChangedPayload } from '@spaire/sdk/models/components/webhookcustomerstatechangedpayload';
29
+
30
+ type EntitlementProperties = Record<string, string>;
31
+ type EntitlementHandler = (payload: WebhookBenefitGrantCreatedPayload | WebhookBenefitGrantRevokedPayload) => Promise<void>;
32
+ interface EntitlementContext<T extends EntitlementProperties> {
33
+ customer: Customer;
34
+ properties: T;
35
+ payload: WebhookBenefitGrantCreatedPayload | WebhookBenefitGrantRevokedPayload;
36
+ }
37
+ declare class EntitlementStrategy<T extends EntitlementProperties> {
38
+ private grantCallbacks;
39
+ private revokeCallbacks;
40
+ grant(callback: (context: EntitlementContext<T>) => Promise<void>): this;
41
+ revoke(callback: (context: EntitlementContext<T>) => Promise<void>): this;
42
+ handler(slug: string): EntitlementHandler;
43
+ }
44
+ declare class Entitlements {
45
+ static handlers: EntitlementHandler[];
46
+ static use<T extends EntitlementProperties = EntitlementProperties>(slug: string, strategy: EntitlementStrategy<T>): typeof Entitlements;
47
+ }
48
+
49
+ interface WebhooksConfig {
50
+ webhookSecret: string;
51
+ entitlements?: typeof Entitlements;
52
+ onPayload?: (payload: ReturnType<typeof validateEvent>) => Promise<void>;
53
+ onCheckoutCreated?: (payload: WebhookCheckoutCreatedPayload) => Promise<void>;
54
+ onCheckoutUpdated?: (payload: WebhookCheckoutUpdatedPayload) => Promise<void>;
55
+ onOrderCreated?: (payload: WebhookOrderCreatedPayload) => Promise<void>;
56
+ onOrderUpdated?: (payload: WebhookOrderUpdatedPayload) => Promise<void>;
57
+ onOrderPaid?: (payload: WebhookOrderPaidPayload) => Promise<void>;
58
+ onOrderRefunded?: (payload: WebhookOrderRefundedPayload) => Promise<void>;
59
+ onRefundCreated?: (payload: WebhookRefundCreatedPayload) => Promise<void>;
60
+ onRefundUpdated?: (payload: WebhookRefundUpdatedPayload) => Promise<void>;
61
+ onSubscriptionCreated?: (payload: WebhookSubscriptionCreatedPayload) => Promise<void>;
62
+ onSubscriptionUpdated?: (payload: WebhookSubscriptionUpdatedPayload) => Promise<void>;
63
+ onSubscriptionActive?: (payload: WebhookSubscriptionActivePayload) => Promise<void>;
64
+ onSubscriptionCanceled?: (payload: WebhookSubscriptionCanceledPayload) => Promise<void>;
65
+ onSubscriptionRevoked?: (payload: WebhookSubscriptionRevokedPayload) => Promise<void>;
66
+ onSubscriptionUncanceled?: (payload: WebhookSubscriptionUncanceledPayload) => Promise<void>;
67
+ onProductCreated?: (payload: WebhookProductCreatedPayload) => Promise<void>;
68
+ onProductUpdated?: (payload: WebhookProductUpdatedPayload) => Promise<void>;
69
+ onOrganizationUpdated?: (payload: WebhookOrganizationUpdatedPayload) => Promise<void>;
70
+ onBenefitCreated?: (payload: WebhookBenefitCreatedPayload) => Promise<void>;
71
+ onBenefitUpdated?: (payload: WebhookBenefitUpdatedPayload) => Promise<void>;
72
+ onBenefitGrantCreated?: (payload: WebhookBenefitGrantCreatedPayload) => Promise<void>;
73
+ onBenefitGrantUpdated?: (payload: WebhookBenefitGrantUpdatedPayload) => Promise<void>;
74
+ onBenefitGrantRevoked?: (payload: WebhookBenefitGrantRevokedPayload) => Promise<void>;
75
+ onCustomerCreated?: (payload: WebhookCustomerCreatedPayload) => Promise<void>;
76
+ onCustomerUpdated?: (payload: WebhookCustomerUpdatedPayload) => Promise<void>;
77
+ onCustomerDeleted?: (payload: WebhookCustomerDeletedPayload) => Promise<void>;
78
+ onCustomerStateChanged?: (payload: WebhookCustomerStateChangedPayload) => Promise<void>;
79
+ }
80
+ declare const handleWebhookPayload: (payload: ReturnType<typeof validateEvent>, { webhookSecret, entitlements, onPayload, ...eventHandlers }: WebhooksConfig) => Promise<void[]>;
81
+
82
+ export { type EntitlementContext, type EntitlementHandler, type EntitlementProperties, EntitlementStrategy, Entitlements, type WebhooksConfig, handleWebhookPayload };
package/dist/index.js ADDED
@@ -0,0 +1,205 @@
1
+ // src/webhooks/webhooks.ts
2
+ var handleWebhookPayload = async (payload, { webhookSecret, entitlements, onPayload, ...eventHandlers }) => {
3
+ const promises = [];
4
+ if (onPayload) {
5
+ promises.push(onPayload(payload));
6
+ }
7
+ switch (payload.type) {
8
+ case "checkout.created":
9
+ if (eventHandlers.onCheckoutCreated) {
10
+ promises.push(eventHandlers.onCheckoutCreated(payload));
11
+ }
12
+ break;
13
+ case "checkout.updated":
14
+ if (eventHandlers.onCheckoutUpdated) {
15
+ promises.push(eventHandlers.onCheckoutUpdated(payload));
16
+ }
17
+ break;
18
+ case "order.created":
19
+ if (eventHandlers.onOrderCreated) {
20
+ promises.push(eventHandlers.onOrderCreated(payload));
21
+ }
22
+ break;
23
+ case "order.updated":
24
+ if (eventHandlers.onOrderUpdated) {
25
+ promises.push(eventHandlers.onOrderUpdated(payload));
26
+ }
27
+ break;
28
+ case "order.paid":
29
+ if (eventHandlers.onOrderPaid) {
30
+ promises.push(eventHandlers.onOrderPaid(payload));
31
+ }
32
+ break;
33
+ case "subscription.created":
34
+ if (eventHandlers.onSubscriptionCreated) {
35
+ promises.push(eventHandlers.onSubscriptionCreated(payload));
36
+ }
37
+ break;
38
+ case "subscription.updated":
39
+ if (eventHandlers.onSubscriptionUpdated) {
40
+ promises.push(eventHandlers.onSubscriptionUpdated(payload));
41
+ }
42
+ break;
43
+ case "subscription.active":
44
+ if (eventHandlers.onSubscriptionActive) {
45
+ promises.push(eventHandlers.onSubscriptionActive(payload));
46
+ }
47
+ break;
48
+ case "subscription.canceled":
49
+ if (eventHandlers.onSubscriptionCanceled) {
50
+ promises.push(eventHandlers.onSubscriptionCanceled(payload));
51
+ }
52
+ break;
53
+ case "subscription.uncanceled":
54
+ if (eventHandlers.onSubscriptionUncanceled) {
55
+ promises.push(eventHandlers.onSubscriptionUncanceled(payload));
56
+ }
57
+ break;
58
+ case "subscription.revoked":
59
+ if (eventHandlers.onSubscriptionRevoked) {
60
+ promises.push(eventHandlers.onSubscriptionRevoked(payload));
61
+ }
62
+ break;
63
+ case "product.created":
64
+ if (eventHandlers.onProductCreated) {
65
+ promises.push(eventHandlers.onProductCreated(payload));
66
+ }
67
+ break;
68
+ case "product.updated":
69
+ if (eventHandlers.onProductUpdated) {
70
+ promises.push(eventHandlers.onProductUpdated(payload));
71
+ }
72
+ break;
73
+ case "organization.updated":
74
+ if (eventHandlers.onOrganizationUpdated) {
75
+ promises.push(eventHandlers.onOrganizationUpdated(payload));
76
+ }
77
+ break;
78
+ case "benefit.created":
79
+ if (eventHandlers.onBenefitCreated) {
80
+ promises.push(eventHandlers.onBenefitCreated(payload));
81
+ }
82
+ break;
83
+ case "benefit.updated":
84
+ if (eventHandlers.onBenefitUpdated) {
85
+ promises.push(eventHandlers.onBenefitUpdated(payload));
86
+ }
87
+ break;
88
+ case "benefit_grant.created":
89
+ if (eventHandlers.onBenefitGrantCreated) {
90
+ promises.push(eventHandlers.onBenefitGrantCreated(payload));
91
+ }
92
+ break;
93
+ case "benefit_grant.updated":
94
+ if (eventHandlers.onBenefitGrantUpdated) {
95
+ promises.push(eventHandlers.onBenefitGrantUpdated(payload));
96
+ }
97
+ break;
98
+ case "benefit_grant.revoked":
99
+ if (eventHandlers.onBenefitGrantRevoked) {
100
+ promises.push(eventHandlers.onBenefitGrantRevoked(payload));
101
+ }
102
+ break;
103
+ case "customer.created":
104
+ if (eventHandlers.onCustomerCreated) {
105
+ promises.push(eventHandlers.onCustomerCreated(payload));
106
+ }
107
+ break;
108
+ case "customer.updated":
109
+ if (eventHandlers.onCustomerUpdated) {
110
+ promises.push(eventHandlers.onCustomerUpdated(payload));
111
+ }
112
+ break;
113
+ case "customer.deleted":
114
+ if (eventHandlers.onCustomerDeleted) {
115
+ promises.push(eventHandlers.onCustomerDeleted(payload));
116
+ }
117
+ break;
118
+ case "customer.state_changed":
119
+ if (eventHandlers.onCustomerStateChanged) {
120
+ promises.push(eventHandlers.onCustomerStateChanged(payload));
121
+ }
122
+ break;
123
+ case "order.refunded":
124
+ if (eventHandlers.onOrderRefunded) {
125
+ promises.push(eventHandlers.onOrderRefunded(payload));
126
+ }
127
+ break;
128
+ case "refund.created":
129
+ if (eventHandlers.onRefundCreated) {
130
+ promises.push(eventHandlers.onRefundCreated(payload));
131
+ }
132
+ break;
133
+ case "refund.updated":
134
+ if (eventHandlers.onRefundUpdated) {
135
+ promises.push(eventHandlers.onRefundUpdated(payload));
136
+ }
137
+ break;
138
+ }
139
+ switch (payload.type) {
140
+ case "benefit_grant.created":
141
+ case "benefit_grant.revoked":
142
+ if (entitlements) {
143
+ for (const handler of entitlements.handlers) {
144
+ promises.push(handler(payload));
145
+ }
146
+ }
147
+ }
148
+ return Promise.all(promises);
149
+ };
150
+
151
+ // src/entitlement/entitlement.ts
152
+ var EntitlementStrategy = class {
153
+ grantCallbacks = [];
154
+ revokeCallbacks = [];
155
+ grant(callback) {
156
+ this.grantCallbacks.push(callback);
157
+ return this;
158
+ }
159
+ revoke(callback) {
160
+ this.revokeCallbacks.push(callback);
161
+ return this;
162
+ }
163
+ handler(slug) {
164
+ return async (payload) => {
165
+ if (payload.data.benefit.description === slug) {
166
+ switch (payload.type) {
167
+ case "benefit_grant.created":
168
+ await Promise.all(
169
+ this.grantCallbacks.map(
170
+ (callback) => callback({
171
+ customer: payload.data.customer,
172
+ properties: payload.data.properties,
173
+ payload
174
+ })
175
+ )
176
+ );
177
+ break;
178
+ case "benefit_grant.revoked":
179
+ await Promise.all(
180
+ this.revokeCallbacks.map(
181
+ (callback) => callback({
182
+ customer: payload.data.customer,
183
+ properties: payload.data.properties,
184
+ payload
185
+ })
186
+ )
187
+ );
188
+ break;
189
+ }
190
+ }
191
+ };
192
+ }
193
+ };
194
+ var Entitlements = class {
195
+ static handlers = [];
196
+ static use(slug, strategy) {
197
+ this.handlers.push(strategy.handler(slug));
198
+ return this;
199
+ }
200
+ };
201
+ export {
202
+ EntitlementStrategy,
203
+ Entitlements,
204
+ handleWebhookPayload
205
+ };
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@spaire/adapter-utils",
3
+ "version": "1.0.1",
4
+ "description": "Core package for Spaire adapters",
5
+ "files": [
6
+ "dist"
7
+ ],
8
+ "main": "./dist/index.cjs",
9
+ "module": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "type": "module",
12
+ "exports": {
13
+ "import": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.js"
16
+ },
17
+ "require": {
18
+ "types": "./dist/index.d.cts",
19
+ "require": "./dist/index.cjs"
20
+ }
21
+ },
22
+ "scripts": {
23
+ "build": "tsup src/index.ts --format esm,cjs --dts --outDir dist",
24
+ "test": "vitest"
25
+ },
26
+ "keywords": [],
27
+ "author": "",
28
+ "license": "Apache-2.0",
29
+ "dependencies": {
30
+ "@spaire/sdk": "^0.45.1"
31
+ },
32
+ "devDependencies": {
33
+ "@sindresorhus/tsconfig": "^7.0.0",
34
+ "tsup": "^8.5.1",
35
+ "typescript": "^5.9.3",
36
+ "vitest": "^2.1.8"
37
+ }
38
+ }