@umituz/web-payment 0.0.0-stage → 1.0.0

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.
Files changed (150) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +349 -2
  3. package/dist/billing-adapter.interface-CDkeeowZ.d.mts +94 -0
  4. package/dist/billing-adapter.interface-m7yE50I0.d.ts +94 -0
  5. package/dist/billing-cycle.enum--hJRYlgP.d.mts +10 -0
  6. package/dist/billing-cycle.enum--hJRYlgP.d.ts +10 -0
  7. package/dist/billing-env-D4YjvA3M.d.mts +8 -0
  8. package/dist/billing-env-D4YjvA3M.d.ts +8 -0
  9. package/dist/checkout-metadata-D7Wp_DAD.d.mts +27 -0
  10. package/dist/checkout-metadata-D7Wp_DAD.d.ts +27 -0
  11. package/dist/chunk-2KV7JFYF.mjs +61 -0
  12. package/dist/chunk-2NH5DOLT.mjs +101 -0
  13. package/dist/chunk-3AXPZOCV.mjs +106 -0
  14. package/dist/chunk-4N3BASZ6.mjs +51 -0
  15. package/dist/chunk-NHKK3ENU.mjs +1128 -0
  16. package/dist/chunk-PIWNUAKW.mjs +30 -0
  17. package/dist/chunk-QFB7AOSQ.mjs +33 -0
  18. package/dist/chunk-RQTMBR74.mjs +30 -0
  19. package/dist/chunk-U45FS4FF.mjs +110 -0
  20. package/dist/chunk-X6R76FZT.mjs +0 -0
  21. package/dist/chunk-XQ2HJTTA.mjs +252 -0
  22. package/dist/core.d.mts +17 -0
  23. package/dist/core.d.ts +17 -0
  24. package/dist/core.js +425 -0
  25. package/dist/core.mjs +66 -0
  26. package/dist/http.d.mts +12 -0
  27. package/dist/http.d.ts +12 -0
  28. package/dist/http.js +115 -0
  29. package/dist/http.mjs +88 -0
  30. package/dist/index.d.mts +17 -0
  31. package/dist/index.d.ts +17 -0
  32. package/dist/index.js +1929 -0
  33. package/dist/index.mjs +153 -0
  34. package/dist/memory.d.mts +14 -0
  35. package/dist/memory.d.ts +14 -0
  36. package/dist/memory.js +130 -0
  37. package/dist/memory.mjs +6 -0
  38. package/dist/portal.d.mts +445 -0
  39. package/dist/portal.d.ts +445 -0
  40. package/dist/portal.js +2927 -0
  41. package/dist/portal.mjs +2737 -0
  42. package/dist/product.mapper-CnY1ISOp.d.ts +97 -0
  43. package/dist/product.mapper-noVl-sel.d.mts +97 -0
  44. package/dist/products.d.mts +64 -0
  45. package/dist/products.d.ts +64 -0
  46. package/dist/products.js +370 -0
  47. package/dist/products.mjs +21 -0
  48. package/dist/react.d.mts +182 -0
  49. package/dist/react.d.ts +182 -0
  50. package/dist/react.js +1874 -0
  51. package/dist/react.mjs +105 -0
  52. package/dist/server.d.mts +177 -0
  53. package/dist/server.d.ts +177 -0
  54. package/dist/server.js +622 -0
  55. package/dist/server.mjs +417 -0
  56. package/dist/visual-tokens-BCLVR85G.d.mts +94 -0
  57. package/dist/visual-tokens-BCLVR85G.d.ts +94 -0
  58. package/package.json +122 -4
  59. package/src/core.ts +81 -0
  60. package/src/domain/entities/cancellation.entity.ts +28 -0
  61. package/src/domain/entities/checkout.entity.ts +21 -0
  62. package/src/domain/entities/index.ts +10 -0
  63. package/src/domain/entities/order.entity.ts +15 -0
  64. package/src/domain/entities/product.entity.ts +16 -0
  65. package/src/domain/entities/subscription.entity.ts +24 -0
  66. package/src/domain/entities/sync.entity.ts +4 -0
  67. package/src/domain/enums/amount-type.enum.ts +10 -0
  68. package/src/domain/enums/billing-cycle.enum.ts +30 -0
  69. package/src/domain/enums/index.ts +5 -0
  70. package/src/domain/enums/payment-provider.enum.ts +14 -0
  71. package/src/domain/enums/subscription-status.enum.ts +32 -0
  72. package/src/domain/index.ts +5 -0
  73. package/src/domain/interfaces/billing-adapter.interface.ts +18 -0
  74. package/src/domain/interfaces/index.ts +1 -0
  75. package/src/domain/mappers/product.mapper.ts +176 -0
  76. package/src/domain/utils/minor-units.ts +20 -0
  77. package/src/domain/utils/percent-discount.ts +17 -0
  78. package/src/http.ts +3 -0
  79. package/src/index.ts +12 -0
  80. package/src/infrastructure/browser/hosted-checkout.ts +26 -0
  81. package/src/infrastructure/config/billing-env.ts +31 -0
  82. package/src/infrastructure/constants/billing.constants.ts +10 -0
  83. package/src/infrastructure/http/http-client.ts +83 -0
  84. package/src/infrastructure/pagination/page-iterator.ts +43 -0
  85. package/src/infrastructure/query/query-builder.ts +26 -0
  86. package/src/infrastructure/services/billing.client.ts +300 -0
  87. package/src/infrastructure/services/create-billing-client.ts +23 -0
  88. package/src/infrastructure/services/http/create-http-adapter.ts +123 -0
  89. package/src/infrastructure/services/memory/create-memory-adapter.ts +126 -0
  90. package/src/infrastructure/services/product.repository.ts +198 -0
  91. package/src/infrastructure/utils/checkout-metadata.ts +55 -0
  92. package/src/infrastructure/utils/date-renderer.ts +53 -0
  93. package/src/infrastructure/utils/money-formatter.ts +39 -0
  94. package/src/infrastructure/utils/normalization.util.ts +22 -0
  95. package/src/infrastructure/utils/pagination-clamp.ts +11 -0
  96. package/src/infrastructure/utils/receipt.util.ts +6 -0
  97. package/src/infrastructure/utils/security.util.ts +23 -0
  98. package/src/infrastructure/utils/type-guards.util.ts +23 -0
  99. package/src/infrastructure/utils/validation.util.ts +10 -0
  100. package/src/infrastructure/webhook/parse-event.ts +135 -0
  101. package/src/infrastructure/webhook/verify-webhook.ts +124 -0
  102. package/src/memory.ts +3 -0
  103. package/src/portal.ts +2 -0
  104. package/src/presentation/components/BillingHistoryList.tsx +172 -0
  105. package/src/presentation/components/BillingProvider.tsx +179 -0
  106. package/src/presentation/components/CancelSubscriptionButton.tsx +155 -0
  107. package/src/presentation/components/CheckoutButton.tsx +76 -0
  108. package/src/presentation/components/CustomerPortalLink.tsx +71 -0
  109. package/src/presentation/components/PricingTable.tsx +225 -0
  110. package/src/presentation/components/SubscriptionStatusBadge.tsx +102 -0
  111. package/src/presentation/context/billing-context.ts +30 -0
  112. package/src/presentation/hooks/useBilling.ts +3 -0
  113. package/src/presentation/hooks/useCancelSubscription.ts +47 -0
  114. package/src/presentation/hooks/useCheckoutButton.ts +49 -0
  115. package/src/presentation/hooks/useProducts.ts +76 -0
  116. package/src/presentation/navigation/navigation.strategy.ts +16 -0
  117. package/src/presentation/portal/TurnkeyBillingPage.tsx +144 -0
  118. package/src/presentation/portal/components/BillingLayout.tsx +163 -0
  119. package/src/presentation/portal/components/BillingPage.tsx +22 -0
  120. package/src/presentation/portal/components/BillingPortal.tsx +248 -0
  121. package/src/presentation/portal/components/InvoiceCard.tsx +275 -0
  122. package/src/presentation/portal/components/OverviewTab.tsx +137 -0
  123. package/src/presentation/portal/components/PaymentMethodsList.tsx +268 -0
  124. package/src/presentation/portal/components/PlanComparison.tsx +405 -0
  125. package/src/presentation/portal/components/PlanTab.tsx +197 -0
  126. package/src/presentation/portal/components/PortalButton.tsx +89 -0
  127. package/src/presentation/portal/components/PortalSpinner.tsx +30 -0
  128. package/src/presentation/portal/components/UsageCard.tsx +158 -0
  129. package/src/presentation/portal/components/index.ts +11 -0
  130. package/src/presentation/portal/constants.ts +44 -0
  131. package/src/presentation/portal/create-portal-client.ts +202 -0
  132. package/src/presentation/portal/hooks/index.ts +3 -0
  133. package/src/presentation/portal/hooks/useBilling.ts +240 -0
  134. package/src/presentation/portal/index.ts +97 -0
  135. package/src/presentation/portal/labels.tsx +218 -0
  136. package/src/presentation/portal/styles.ts +70 -0
  137. package/src/presentation/portal/types.ts +213 -0
  138. package/src/presentation/portal/utils/billing.ts +193 -0
  139. package/src/presentation/portal/utils/index.ts +27 -0
  140. package/src/presentation/portal/utils/plans.ts +71 -0
  141. package/src/presentation/theme/visual-tokens.ts +103 -0
  142. package/src/presentation/utils/cancellation-reason-catalog.ts +18 -0
  143. package/src/presentation/utils/checkout-button-visual.ts +50 -0
  144. package/src/presentation/utils/inline-error-visual.ts +21 -0
  145. package/src/presentation/utils/product-pricing.ts +33 -0
  146. package/src/presentation/utils/status-label.ts +23 -0
  147. package/src/presentation/utils/status-tone.ts +25 -0
  148. package/src/products.ts +20 -0
  149. package/src/react.tsx +63 -0
  150. package/src/server.ts +79 -0
package/dist/react.mjs ADDED
@@ -0,0 +1,105 @@
1
+ import {
2
+ BillingContext,
3
+ BillingHistoryList,
4
+ BillingProvider,
5
+ CANCELLATION_REASON_CATALOG,
6
+ CancelSubscriptionButton,
7
+ CheckoutButton,
8
+ CustomerPortalLink,
9
+ PricingTable,
10
+ SubscriptionStatusBadge,
11
+ useBilling,
12
+ useCancelSubscription,
13
+ useCheckoutButton,
14
+ useProducts
15
+ } from "./chunk-NHKK3ENU.mjs";
16
+ import {
17
+ CANCELLATION_REASON,
18
+ CANCELLATION_REASON_VALUES,
19
+ POLAR_AMOUNT_TYPE,
20
+ applyPercentDiscount,
21
+ normalizeCouponCode
22
+ } from "./chunk-4N3BASZ6.mjs";
23
+ import {
24
+ FREE_SUBSCRIPTION_STATUS,
25
+ createMemoryBillingAdapter,
26
+ isActiveSubscription
27
+ } from "./chunk-3AXPZOCV.mjs";
28
+ import {
29
+ NoopNavigationStrategy,
30
+ TONE_PAIRS,
31
+ VisualTokens,
32
+ WindowNavigationStrategy
33
+ } from "./chunk-2NH5DOLT.mjs";
34
+ import {
35
+ PAYMENT_PROVIDER,
36
+ PAYMENT_PROVIDER_VALUES,
37
+ buildCheckoutMetadata,
38
+ formatReceiptNumber,
39
+ isKnownPaymentProvider,
40
+ readCheckoutMetadata
41
+ } from "./chunk-2KV7JFYF.mjs";
42
+ import {
43
+ minorUnitDivisor,
44
+ toMajorUnits,
45
+ toMinorUnits
46
+ } from "./chunk-PIWNUAKW.mjs";
47
+ import "./chunk-XQ2HJTTA.mjs";
48
+ import {
49
+ SUBSCRIPTION_STATUS,
50
+ SUBSCRIPTION_STATUS_VALUES,
51
+ isKnownSubscriptionStatus,
52
+ mapProduct,
53
+ mapProductList
54
+ } from "./chunk-U45FS4FF.mjs";
55
+ import {
56
+ BILLING_CYCLE,
57
+ BILLING_CYCLE_VALUES,
58
+ isKnownBillingCycle,
59
+ parseBillingCycle
60
+ } from "./chunk-RQTMBR74.mjs";
61
+ export {
62
+ BILLING_CYCLE,
63
+ BILLING_CYCLE_VALUES,
64
+ BillingContext,
65
+ BillingHistoryList,
66
+ BillingProvider,
67
+ CANCELLATION_REASON,
68
+ CANCELLATION_REASON_CATALOG,
69
+ CANCELLATION_REASON_VALUES,
70
+ CancelSubscriptionButton,
71
+ CheckoutButton,
72
+ CustomerPortalLink,
73
+ FREE_SUBSCRIPTION_STATUS,
74
+ NoopNavigationStrategy,
75
+ PAYMENT_PROVIDER,
76
+ PAYMENT_PROVIDER_VALUES,
77
+ POLAR_AMOUNT_TYPE,
78
+ PricingTable,
79
+ SUBSCRIPTION_STATUS,
80
+ SUBSCRIPTION_STATUS_VALUES,
81
+ SubscriptionStatusBadge,
82
+ TONE_PAIRS,
83
+ VisualTokens,
84
+ WindowNavigationStrategy,
85
+ applyPercentDiscount,
86
+ buildCheckoutMetadata,
87
+ createMemoryBillingAdapter,
88
+ formatReceiptNumber,
89
+ isActiveSubscription,
90
+ isKnownBillingCycle,
91
+ isKnownPaymentProvider,
92
+ isKnownSubscriptionStatus,
93
+ mapProduct,
94
+ mapProductList,
95
+ minorUnitDivisor,
96
+ normalizeCouponCode,
97
+ parseBillingCycle,
98
+ readCheckoutMetadata,
99
+ toMajorUnits,
100
+ toMinorUnits,
101
+ useBilling,
102
+ useCancelSubscription,
103
+ useCheckoutButton,
104
+ useProducts
105
+ };
@@ -0,0 +1,177 @@
1
+ import { b as PaymentProvider } from './checkout-metadata-D7Wp_DAD.mjs';
2
+ export { B as BuildCheckoutMetadataInput, C as CheckoutOrderMetadata, P as PAYMENT_PROVIDER, a as PAYMENT_PROVIDER_VALUES, c as buildCheckoutMetadata, f as formatReceiptNumber, i as isKnownPaymentProvider, r as readCheckoutMetadata } from './checkout-metadata-D7Wp_DAD.mjs';
3
+ import { HttpClient } from './products.mjs';
4
+ export { BillingApiError, isBillingApiError } from './products.mjs';
5
+ export { C as CHECKOUT_ID_PARAM, a as CHECKOUT_ID_PLACEHOLDER, P as ProductIdMap, p as parseProductIds, b as productIdOf, s as successUrlWithCheckoutId } from './billing-env-D4YjvA3M.mjs';
6
+ import './product.mapper-noVl-sel.mjs';
7
+ import './billing-cycle.enum--hJRYlgP.mjs';
8
+
9
+ declare const SANDBOX_API_BASE_URL = "https://sandbox-api.polar.sh/v1";
10
+ interface PaymentServerClient {
11
+ readonly provider: PaymentProvider;
12
+ createProduct?(params: CreateProductParams): Promise<CreatedProduct>;
13
+ createCheckout(params: CheckoutSessionParams): Promise<CheckoutSession>;
14
+ getCheckout(id: string): Promise<CheckoutSession>;
15
+ createPortalSession?(customerId: string, returnUrl?: string): Promise<PortalSession>;
16
+ getSubscription?(id: string): Promise<SubscriptionRecord>;
17
+ listSubscriptions?(filter?: {
18
+ customerId?: string;
19
+ productId?: string;
20
+ }): Promise<SubscriptionRecord[]>;
21
+ updateSubscription?(id: string, patch: {
22
+ cancelAtPeriodEnd?: boolean;
23
+ }): Promise<SubscriptionRecord>;
24
+ }
25
+ interface BillingClientConfig {
26
+ apiToken: string;
27
+ baseUrl?: string;
28
+ sandbox?: boolean;
29
+ http?: HttpClient;
30
+ }
31
+ type CheckoutMetadata = Record<string, string | number | boolean>;
32
+ interface CheckoutSessionParams {
33
+ productId: string;
34
+ successUrl?: string;
35
+ customerId?: string;
36
+ customerEmail?: string;
37
+ externalCustomerId?: string;
38
+ amountCents?: number;
39
+ currency?: string;
40
+ allowDiscountCodes?: boolean;
41
+ metadata?: CheckoutMetadata;
42
+ }
43
+ interface CheckoutSession {
44
+ id: string;
45
+ url: string;
46
+ status?: string;
47
+ customerId?: string;
48
+ customerEmail?: string;
49
+ subscriptionId?: string | null;
50
+ metadata?: CheckoutMetadata;
51
+ }
52
+ interface SubscriptionRecord {
53
+ id: string;
54
+ status: string;
55
+ productId: string;
56
+ amountCents: number;
57
+ currency: string;
58
+ currentPeriodStart?: string;
59
+ currentPeriodEnd?: string;
60
+ cancelAtPeriodEnd: boolean;
61
+ canceledAt?: string | null;
62
+ endsAt?: string | null;
63
+ startedAt?: string | null;
64
+ customerId: string;
65
+ metadata: Record<string, string>;
66
+ }
67
+ interface PortalSession {
68
+ url: string;
69
+ }
70
+ interface CreateProductParams {
71
+ name: string;
72
+ description?: string;
73
+ amountCents: number;
74
+ currency?: string;
75
+ metadata?: CheckoutMetadata;
76
+ }
77
+ interface CreatedProduct {
78
+ id: string;
79
+ name: string;
80
+ }
81
+ declare class PolarBillingClient implements PaymentServerClient {
82
+ readonly provider: "polar";
83
+ private readonly http;
84
+ private readonly baseUrl;
85
+ private readonly headers;
86
+ constructor(config: BillingClientConfig);
87
+ private request;
88
+ createProduct(params: CreateProductParams): Promise<CreatedProduct>;
89
+ createCheckout(params: CheckoutSessionParams): Promise<CheckoutSession>;
90
+ getCheckout(id: string): Promise<CheckoutSession>;
91
+ createPortalSession(customerId: string, returnUrl?: string): Promise<PortalSession>;
92
+ getSubscription(id: string): Promise<SubscriptionRecord>;
93
+ listSubscriptions(filter?: {
94
+ customerId?: string;
95
+ productId?: string;
96
+ }): Promise<SubscriptionRecord[]>;
97
+ updateSubscription(id: string, patch: {
98
+ cancelAtPeriodEnd?: boolean;
99
+ }): Promise<SubscriptionRecord>;
100
+ }
101
+ declare const BillingClient: typeof PolarBillingClient;
102
+ type BillingClient = PolarBillingClient;
103
+ type PaymentClientConfig = ({
104
+ provider?: 'polar';
105
+ } & BillingClientConfig) | {
106
+ provider: 'stripe';
107
+ apiKey: string;
108
+ [key: string]: unknown;
109
+ };
110
+ declare function createPaymentClient(config: PaymentClientConfig): PaymentServerClient;
111
+
112
+ interface WebhookHeadersLike {
113
+ get(name: string): string | null | undefined;
114
+ }
115
+ declare const DEFAULT_WEBHOOK_TOLERANCE_MS: number;
116
+ interface VerifyWebhookOptions {
117
+ toleranceMs?: number;
118
+ }
119
+ declare function verifyWebhook(rawBody: string, headers: WebhookHeadersLike | Record<string, string>, secret: string, options?: VerifyWebhookOptions): Promise<boolean>;
120
+ declare const verifyPolarWebhook: typeof verifyWebhook;
121
+
122
+ interface WebhookEvent {
123
+ type: string;
124
+ data: Record<string, unknown>;
125
+ }
126
+ interface CheckoutCompleted {
127
+ checkoutId: string | null;
128
+ productId: string | null;
129
+ customerEmail: string | null;
130
+ customerName: string | null;
131
+ amount: number | null;
132
+ currency: string | null;
133
+ metadata: Record<string, string>;
134
+ createdAt: string | null;
135
+ }
136
+ interface SubscriptionChanged {
137
+ subscriptionId: string | null;
138
+ status: string | null;
139
+ productId: string | null;
140
+ amount: number | null;
141
+ currency: string | null;
142
+ currentPeriodEnd: string | null;
143
+ cancelAtPeriodEnd: boolean;
144
+ canceledAt: string | null;
145
+ endsAt: string | null;
146
+ customerId: string | null;
147
+ metadata: Record<string, string>;
148
+ }
149
+ interface OrderPaid {
150
+ orderId: string | null;
151
+ productId: string | null;
152
+ productName: string | null;
153
+ amount: number | null;
154
+ currency: string | null;
155
+ customerEmail: string | null;
156
+ metadata: Record<string, string>;
157
+ createdAt: string | null;
158
+ }
159
+ declare function parseWebhookEvent(rawBody: string): WebhookEvent | null;
160
+ declare function asCheckoutCompleted(event: WebhookEvent): CheckoutCompleted | null;
161
+ declare function asSubscriptionChanged(event: WebhookEvent): SubscriptionChanged | null;
162
+ declare function asOrderPaid(event: WebhookEvent): OrderPaid | null;
163
+ declare const parsePolarWebhookEvent: typeof parseWebhookEvent;
164
+
165
+ declare const API_BASE_URL = "https://api.polar.sh/v1";
166
+
167
+ declare function sandboxEnabled(raw: string | boolean | undefined): boolean;
168
+ declare function createPolarClient(config: {
169
+ apiToken: string | undefined;
170
+ sandbox?: string | boolean | undefined;
171
+ }): PolarBillingClient;
172
+ declare function createBillingClient(config: {
173
+ apiToken: string | undefined;
174
+ sandbox?: string | boolean | undefined;
175
+ }): BillingClient;
176
+
177
+ export { API_BASE_URL, BillingClient, type BillingClientConfig, type CheckoutCompleted, type CheckoutMetadata, type CheckoutSession, type CheckoutSessionParams, type CreateProductParams, type CreatedProduct, DEFAULT_WEBHOOK_TOLERANCE_MS, type OrderPaid, type PaymentClientConfig, PaymentProvider, type PaymentServerClient, PolarBillingClient, type PortalSession, SANDBOX_API_BASE_URL, type SubscriptionChanged, type SubscriptionRecord, type VerifyWebhookOptions, type WebhookEvent, type WebhookHeadersLike, asCheckoutCompleted, asOrderPaid, asSubscriptionChanged, createBillingClient, createPaymentClient, createPolarClient, parsePolarWebhookEvent, parseWebhookEvent, sandboxEnabled, verifyPolarWebhook, verifyWebhook };
@@ -0,0 +1,177 @@
1
+ import { b as PaymentProvider } from './checkout-metadata-D7Wp_DAD.js';
2
+ export { B as BuildCheckoutMetadataInput, C as CheckoutOrderMetadata, P as PAYMENT_PROVIDER, a as PAYMENT_PROVIDER_VALUES, c as buildCheckoutMetadata, f as formatReceiptNumber, i as isKnownPaymentProvider, r as readCheckoutMetadata } from './checkout-metadata-D7Wp_DAD.js';
3
+ import { HttpClient } from './products.js';
4
+ export { BillingApiError, isBillingApiError } from './products.js';
5
+ export { C as CHECKOUT_ID_PARAM, a as CHECKOUT_ID_PLACEHOLDER, P as ProductIdMap, p as parseProductIds, b as productIdOf, s as successUrlWithCheckoutId } from './billing-env-D4YjvA3M.js';
6
+ import './product.mapper-CnY1ISOp.js';
7
+ import './billing-cycle.enum--hJRYlgP.js';
8
+
9
+ declare const SANDBOX_API_BASE_URL = "https://sandbox-api.polar.sh/v1";
10
+ interface PaymentServerClient {
11
+ readonly provider: PaymentProvider;
12
+ createProduct?(params: CreateProductParams): Promise<CreatedProduct>;
13
+ createCheckout(params: CheckoutSessionParams): Promise<CheckoutSession>;
14
+ getCheckout(id: string): Promise<CheckoutSession>;
15
+ createPortalSession?(customerId: string, returnUrl?: string): Promise<PortalSession>;
16
+ getSubscription?(id: string): Promise<SubscriptionRecord>;
17
+ listSubscriptions?(filter?: {
18
+ customerId?: string;
19
+ productId?: string;
20
+ }): Promise<SubscriptionRecord[]>;
21
+ updateSubscription?(id: string, patch: {
22
+ cancelAtPeriodEnd?: boolean;
23
+ }): Promise<SubscriptionRecord>;
24
+ }
25
+ interface BillingClientConfig {
26
+ apiToken: string;
27
+ baseUrl?: string;
28
+ sandbox?: boolean;
29
+ http?: HttpClient;
30
+ }
31
+ type CheckoutMetadata = Record<string, string | number | boolean>;
32
+ interface CheckoutSessionParams {
33
+ productId: string;
34
+ successUrl?: string;
35
+ customerId?: string;
36
+ customerEmail?: string;
37
+ externalCustomerId?: string;
38
+ amountCents?: number;
39
+ currency?: string;
40
+ allowDiscountCodes?: boolean;
41
+ metadata?: CheckoutMetadata;
42
+ }
43
+ interface CheckoutSession {
44
+ id: string;
45
+ url: string;
46
+ status?: string;
47
+ customerId?: string;
48
+ customerEmail?: string;
49
+ subscriptionId?: string | null;
50
+ metadata?: CheckoutMetadata;
51
+ }
52
+ interface SubscriptionRecord {
53
+ id: string;
54
+ status: string;
55
+ productId: string;
56
+ amountCents: number;
57
+ currency: string;
58
+ currentPeriodStart?: string;
59
+ currentPeriodEnd?: string;
60
+ cancelAtPeriodEnd: boolean;
61
+ canceledAt?: string | null;
62
+ endsAt?: string | null;
63
+ startedAt?: string | null;
64
+ customerId: string;
65
+ metadata: Record<string, string>;
66
+ }
67
+ interface PortalSession {
68
+ url: string;
69
+ }
70
+ interface CreateProductParams {
71
+ name: string;
72
+ description?: string;
73
+ amountCents: number;
74
+ currency?: string;
75
+ metadata?: CheckoutMetadata;
76
+ }
77
+ interface CreatedProduct {
78
+ id: string;
79
+ name: string;
80
+ }
81
+ declare class PolarBillingClient implements PaymentServerClient {
82
+ readonly provider: "polar";
83
+ private readonly http;
84
+ private readonly baseUrl;
85
+ private readonly headers;
86
+ constructor(config: BillingClientConfig);
87
+ private request;
88
+ createProduct(params: CreateProductParams): Promise<CreatedProduct>;
89
+ createCheckout(params: CheckoutSessionParams): Promise<CheckoutSession>;
90
+ getCheckout(id: string): Promise<CheckoutSession>;
91
+ createPortalSession(customerId: string, returnUrl?: string): Promise<PortalSession>;
92
+ getSubscription(id: string): Promise<SubscriptionRecord>;
93
+ listSubscriptions(filter?: {
94
+ customerId?: string;
95
+ productId?: string;
96
+ }): Promise<SubscriptionRecord[]>;
97
+ updateSubscription(id: string, patch: {
98
+ cancelAtPeriodEnd?: boolean;
99
+ }): Promise<SubscriptionRecord>;
100
+ }
101
+ declare const BillingClient: typeof PolarBillingClient;
102
+ type BillingClient = PolarBillingClient;
103
+ type PaymentClientConfig = ({
104
+ provider?: 'polar';
105
+ } & BillingClientConfig) | {
106
+ provider: 'stripe';
107
+ apiKey: string;
108
+ [key: string]: unknown;
109
+ };
110
+ declare function createPaymentClient(config: PaymentClientConfig): PaymentServerClient;
111
+
112
+ interface WebhookHeadersLike {
113
+ get(name: string): string | null | undefined;
114
+ }
115
+ declare const DEFAULT_WEBHOOK_TOLERANCE_MS: number;
116
+ interface VerifyWebhookOptions {
117
+ toleranceMs?: number;
118
+ }
119
+ declare function verifyWebhook(rawBody: string, headers: WebhookHeadersLike | Record<string, string>, secret: string, options?: VerifyWebhookOptions): Promise<boolean>;
120
+ declare const verifyPolarWebhook: typeof verifyWebhook;
121
+
122
+ interface WebhookEvent {
123
+ type: string;
124
+ data: Record<string, unknown>;
125
+ }
126
+ interface CheckoutCompleted {
127
+ checkoutId: string | null;
128
+ productId: string | null;
129
+ customerEmail: string | null;
130
+ customerName: string | null;
131
+ amount: number | null;
132
+ currency: string | null;
133
+ metadata: Record<string, string>;
134
+ createdAt: string | null;
135
+ }
136
+ interface SubscriptionChanged {
137
+ subscriptionId: string | null;
138
+ status: string | null;
139
+ productId: string | null;
140
+ amount: number | null;
141
+ currency: string | null;
142
+ currentPeriodEnd: string | null;
143
+ cancelAtPeriodEnd: boolean;
144
+ canceledAt: string | null;
145
+ endsAt: string | null;
146
+ customerId: string | null;
147
+ metadata: Record<string, string>;
148
+ }
149
+ interface OrderPaid {
150
+ orderId: string | null;
151
+ productId: string | null;
152
+ productName: string | null;
153
+ amount: number | null;
154
+ currency: string | null;
155
+ customerEmail: string | null;
156
+ metadata: Record<string, string>;
157
+ createdAt: string | null;
158
+ }
159
+ declare function parseWebhookEvent(rawBody: string): WebhookEvent | null;
160
+ declare function asCheckoutCompleted(event: WebhookEvent): CheckoutCompleted | null;
161
+ declare function asSubscriptionChanged(event: WebhookEvent): SubscriptionChanged | null;
162
+ declare function asOrderPaid(event: WebhookEvent): OrderPaid | null;
163
+ declare const parsePolarWebhookEvent: typeof parseWebhookEvent;
164
+
165
+ declare const API_BASE_URL = "https://api.polar.sh/v1";
166
+
167
+ declare function sandboxEnabled(raw: string | boolean | undefined): boolean;
168
+ declare function createPolarClient(config: {
169
+ apiToken: string | undefined;
170
+ sandbox?: string | boolean | undefined;
171
+ }): PolarBillingClient;
172
+ declare function createBillingClient(config: {
173
+ apiToken: string | undefined;
174
+ sandbox?: string | boolean | undefined;
175
+ }): BillingClient;
176
+
177
+ export { API_BASE_URL, BillingClient, type BillingClientConfig, type CheckoutCompleted, type CheckoutMetadata, type CheckoutSession, type CheckoutSessionParams, type CreateProductParams, type CreatedProduct, DEFAULT_WEBHOOK_TOLERANCE_MS, type OrderPaid, type PaymentClientConfig, PaymentProvider, type PaymentServerClient, PolarBillingClient, type PortalSession, SANDBOX_API_BASE_URL, type SubscriptionChanged, type SubscriptionRecord, type VerifyWebhookOptions, type WebhookEvent, type WebhookHeadersLike, asCheckoutCompleted, asOrderPaid, asSubscriptionChanged, createBillingClient, createPaymentClient, createPolarClient, parsePolarWebhookEvent, parseWebhookEvent, sandboxEnabled, verifyPolarWebhook, verifyWebhook };