@dodopayments/fastify 0.2.4 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -4178,7 +4178,7 @@ const safeJSON = (text) => {
4178
4178
  // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
4179
4179
  const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
4180
4180
 
4181
- const VERSION = '2.4.6'; // x-release-please-version
4181
+ const VERSION = '2.23.2'; // x-release-please-version
4182
4182
 
4183
4183
  // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
4184
4184
  /**
@@ -4388,6 +4388,25 @@ const FallbackEncoder = ({ headers, body }) => {
4388
4388
  };
4389
4389
  };
4390
4390
 
4391
+ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
4392
+ /**
4393
+ * Basic re-implementation of `qs.stringify` for primitive types.
4394
+ */
4395
+ function stringifyQuery(query) {
4396
+ return Object.entries(query)
4397
+ .filter(([_, value]) => typeof value !== 'undefined')
4398
+ .map(([key, value]) => {
4399
+ if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
4400
+ return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
4401
+ }
4402
+ if (value === null) {
4403
+ return `${encodeURIComponent(key)}=`;
4404
+ }
4405
+ throw new DodoPaymentsError(`Cannot stringify type ${typeof value}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`);
4406
+ })
4407
+ .join('&');
4408
+ }
4409
+
4391
4410
  // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
4392
4411
  const levelNumbers = {
4393
4412
  off: 0,
@@ -4481,6 +4500,11 @@ async function defaultParseResponse(client, props) {
4481
4500
  const mediaType = contentType?.split(';')[0]?.trim();
4482
4501
  const isJSON = mediaType?.includes('application/json') || mediaType?.endsWith('+json');
4483
4502
  if (isJSON) {
4503
+ const contentLength = response.headers.get('content-length');
4504
+ if (contentLength === '0') {
4505
+ // if there is no content we can't do anything
4506
+ return undefined;
4507
+ }
4484
4508
  const json = await response.json();
4485
4509
  return json;
4486
4510
  }
@@ -4901,6 +4925,16 @@ class Addons extends APIResource {
4901
4925
  }
4902
4926
  }
4903
4927
 
4928
+ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
4929
+ let Balances$1 = class Balances extends APIResource {
4930
+ retrieveLedger(query = {}, options) {
4931
+ return this._client.getAPIList('/balances/ledger', (DefaultPageNumberPagination), {
4932
+ query,
4933
+ ...options,
4934
+ });
4935
+ }
4936
+ };
4937
+
4904
4938
  // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
4905
4939
  class Brands extends APIResource {
4906
4940
  create(body, options) {
@@ -4931,66 +4965,155 @@ class CheckoutSessions extends APIResource {
4931
4965
  retrieve(id, options) {
4932
4966
  return this._client.get(path `/checkouts/${id}`, options);
4933
4967
  }
4934
- }
4935
-
4936
- // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
4937
- let CustomerPortal$1 = class CustomerPortal extends APIResource {
4938
- create(customerID, params = {}, options) {
4939
- const { send_email } = params ?? {};
4940
- return this._client.post(path `/customers/${customerID}/customer-portal/session`, {
4941
- query: { send_email },
4942
- ...options,
4943
- });
4944
- }
4945
- };
4946
-
4947
- // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
4948
- class LedgerEntries extends APIResource {
4949
- create(customerID, body, options) {
4950
- return this._client.post(path `/customers/${customerID}/wallets/ledger-entries`, { body, ...options });
4951
- }
4952
- list(customerID, query = {}, options) {
4953
- return this._client.getAPIList(path `/customers/${customerID}/wallets/ledger-entries`, (DefaultPageNumberPagination), { query, ...options });
4954
- }
4955
- }
4956
-
4957
- // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
4958
- class Wallets extends APIResource {
4959
- constructor() {
4960
- super(...arguments);
4961
- this.ledgerEntries = new LedgerEntries(this._client);
4962
- }
4963
- list(customerID, options) {
4964
- return this._client.get(path `/customers/${customerID}/wallets`, options);
4968
+ preview(body, options) {
4969
+ return this._client.post('/checkouts/preview', { body, ...options });
4965
4970
  }
4966
4971
  }
4967
- Wallets.LedgerEntries = LedgerEntries;
4968
4972
 
4969
4973
  // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
4970
- class Customers extends APIResource {
4971
- constructor() {
4972
- super(...arguments);
4973
- this.customerPortal = new CustomerPortal$1(this._client);
4974
- this.wallets = new Wallets(this._client);
4974
+ class Balances extends APIResource {
4975
+ /**
4976
+ * Returns the credit balance details for a specific customer and credit
4977
+ * entitlement.
4978
+ *
4979
+ * # Authentication
4980
+ *
4981
+ * Requires an API key with `Viewer` role or higher.
4982
+ *
4983
+ * # Path Parameters
4984
+ *
4985
+ * - `credit_entitlement_id` - The unique identifier of the credit entitlement
4986
+ * - `customer_id` - The unique identifier of the customer
4987
+ *
4988
+ * # Responses
4989
+ *
4990
+ * - `200 OK` - Returns the customer's balance
4991
+ * - `404 Not Found` - Credit entitlement or customer balance not found
4992
+ * - `500 Internal Server Error` - Database or server error
4993
+ */
4994
+ retrieve(customerID, params, options) {
4995
+ const { credit_entitlement_id } = params;
4996
+ return this._client.get(path `/credit-entitlements/${credit_entitlement_id}/balances/${customerID}`, options);
4975
4997
  }
4976
- create(body, options) {
4977
- return this._client.post('/customers', { body, ...options });
4998
+ /**
4999
+ * Returns a paginated list of customer credit balances for the given credit
5000
+ * entitlement.
5001
+ *
5002
+ * # Authentication
5003
+ *
5004
+ * Requires an API key with `Viewer` role or higher.
5005
+ *
5006
+ * # Path Parameters
5007
+ *
5008
+ * - `credit_entitlement_id` - The unique identifier of the credit entitlement
5009
+ *
5010
+ * # Query Parameters
5011
+ *
5012
+ * - `page_size` - Number of items per page (default: 10, max: 100)
5013
+ * - `page_number` - Zero-based page number (default: 0)
5014
+ * - `customer_id` - Optional filter by specific customer
5015
+ *
5016
+ * # Responses
5017
+ *
5018
+ * - `200 OK` - Returns list of customer balances
5019
+ * - `404 Not Found` - Credit entitlement not found
5020
+ * - `500 Internal Server Error` - Database or server error
5021
+ */
5022
+ list(creditEntitlementID, query = {}, options) {
5023
+ return this._client.getAPIList(path `/credit-entitlements/${creditEntitlementID}/balances`, (DefaultPageNumberPagination), { query, ...options });
4978
5024
  }
4979
- retrieve(customerID, options) {
4980
- return this._client.get(path `/customers/${customerID}`, options);
5025
+ /**
5026
+ * For credit entries, a new grant is created. For debit entries, credits are
5027
+ * deducted from existing grants using FIFO (oldest first).
5028
+ *
5029
+ * # Authentication
5030
+ *
5031
+ * Requires an API key with `Editor` role.
5032
+ *
5033
+ * # Path Parameters
5034
+ *
5035
+ * - `credit_entitlement_id` - The unique identifier of the credit entitlement
5036
+ * - `customer_id` - The unique identifier of the customer
5037
+ *
5038
+ * # Request Body
5039
+ *
5040
+ * - `entry_type` - "credit" or "debit"
5041
+ * - `amount` - Amount to credit or debit
5042
+ * - `reason` - Optional human-readable reason
5043
+ * - `expires_at` - Optional expiration for credited amount (only for credit type)
5044
+ * - `idempotency_key` - Optional key to prevent duplicate entries
5045
+ *
5046
+ * # Responses
5047
+ *
5048
+ * - `201 Created` - Ledger entry created successfully
5049
+ * - `400 Bad Request` - Invalid request (e.g., debit with insufficient balance)
5050
+ * - `404 Not Found` - Credit entitlement or customer not found
5051
+ * - `409 Conflict` - Idempotency key already exists
5052
+ * - `500 Internal Server Error` - Database or server error
5053
+ */
5054
+ createLedgerEntry(customerID, params, options) {
5055
+ const { credit_entitlement_id, ...body } = params;
5056
+ return this._client.post(path `/credit-entitlements/${credit_entitlement_id}/balances/${customerID}/ledger-entries`, { body, ...options });
4981
5057
  }
4982
- update(customerID, body, options) {
4983
- return this._client.patch(path `/customers/${customerID}`, { body, ...options });
5058
+ /**
5059
+ * Returns a paginated list of credit grants with optional filtering by status.
5060
+ *
5061
+ * # Authentication
5062
+ *
5063
+ * Requires an API key with `Viewer` role or higher.
5064
+ *
5065
+ * # Path Parameters
5066
+ *
5067
+ * - `credit_entitlement_id` - The unique identifier of the credit entitlement
5068
+ * - `customer_id` - The unique identifier of the customer
5069
+ *
5070
+ * # Query Parameters
5071
+ *
5072
+ * - `page_size` - Number of items per page (default: 10, max: 100)
5073
+ * - `page_number` - Zero-based page number (default: 0)
5074
+ * - `status` - Filter by status: active, expired, depleted
5075
+ *
5076
+ * # Responses
5077
+ *
5078
+ * - `200 OK` - Returns list of grants
5079
+ * - `404 Not Found` - Credit entitlement not found
5080
+ * - `500 Internal Server Error` - Database or server error
5081
+ */
5082
+ listGrants(customerID, params, options) {
5083
+ const { credit_entitlement_id, ...query } = params;
5084
+ return this._client.getAPIList(path `/credit-entitlements/${credit_entitlement_id}/balances/${customerID}/grants`, (DefaultPageNumberPagination), { query, ...options });
4984
5085
  }
4985
- list(query = {}, options) {
4986
- return this._client.getAPIList('/customers', (DefaultPageNumberPagination), {
4987
- query,
4988
- ...options,
4989
- });
5086
+ /**
5087
+ * Returns a paginated list of credit transaction history with optional filtering.
5088
+ *
5089
+ * # Authentication
5090
+ *
5091
+ * Requires an API key with `Viewer` role or higher.
5092
+ *
5093
+ * # Path Parameters
5094
+ *
5095
+ * - `credit_entitlement_id` - The unique identifier of the credit entitlement
5096
+ * - `customer_id` - The unique identifier of the customer
5097
+ *
5098
+ * # Query Parameters
5099
+ *
5100
+ * - `page_size` - Number of items per page (default: 10, max: 100)
5101
+ * - `page_number` - Zero-based page number (default: 0)
5102
+ * - `transaction_type` - Filter by transaction type
5103
+ * - `start_date` - Filter entries from this date
5104
+ * - `end_date` - Filter entries until this date
5105
+ *
5106
+ * # Responses
5107
+ *
5108
+ * - `200 OK` - Returns list of ledger entries
5109
+ * - `404 Not Found` - Credit entitlement not found
5110
+ * - `500 Internal Server Error` - Database or server error
5111
+ */
5112
+ listLedger(customerID, params, options) {
5113
+ const { credit_entitlement_id, ...query } = params;
5114
+ return this._client.getAPIList(path `/credit-entitlements/${credit_entitlement_id}/balances/${customerID}/ledger`, (DefaultPageNumberPagination), { query, ...options });
4990
5115
  }
4991
5116
  }
4992
- Customers.CustomerPortal = CustomerPortal$1;
4993
- Customers.Wallets = Wallets;
4994
5117
 
4995
5118
  // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
4996
5119
  const brand_privateNullableHeaders = /* @__PURE__ */ Symbol('brand.privateNullableHeaders');
@@ -5060,6 +5183,313 @@ const buildHeaders = (newHeaders) => {
5060
5183
  return { [brand_privateNullableHeaders]: true, values: targetHeaders, nulls: nullHeaders };
5061
5184
  };
5062
5185
 
5186
+ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
5187
+ class CreditEntitlements extends APIResource {
5188
+ constructor() {
5189
+ super(...arguments);
5190
+ this.balances = new Balances(this._client);
5191
+ }
5192
+ /**
5193
+ * Credit entitlements define reusable credit templates that can be attached to
5194
+ * products. Each entitlement defines how credits behave in terms of expiration,
5195
+ * rollover, and overage.
5196
+ *
5197
+ * # Authentication
5198
+ *
5199
+ * Requires an API key with `Editor` role.
5200
+ *
5201
+ * # Request Body
5202
+ *
5203
+ * - `name` - Human-readable name of the credit entitlement (1-255 characters,
5204
+ * required)
5205
+ * - `description` - Optional description (max 1000 characters)
5206
+ * - `precision` - Decimal precision for credit amounts (0-10 decimal places)
5207
+ * - `unit` - Unit of measurement for the credit (e.g., "API Calls", "Tokens",
5208
+ * "Credits")
5209
+ * - `expires_after_days` - Number of days after which credits expire (optional)
5210
+ * - `rollover_enabled` - Whether unused credits can rollover to the next period
5211
+ * - `rollover_percentage` - Percentage of unused credits that rollover (0-100)
5212
+ * - `rollover_timeframe_count` - Count of timeframe periods for rollover limit
5213
+ * - `rollover_timeframe_interval` - Interval type (day, week, month, year)
5214
+ * - `max_rollover_count` - Maximum number of times credits can be rolled over
5215
+ * - `overage_enabled` - Whether overage charges apply when credits run out
5216
+ * (requires price_per_unit)
5217
+ * - `overage_limit` - Maximum overage units allowed (optional)
5218
+ * - `currency` - Currency for pricing (required if price_per_unit is set)
5219
+ * - `price_per_unit` - Price per credit unit (decimal)
5220
+ *
5221
+ * # Responses
5222
+ *
5223
+ * - `201 Created` - Credit entitlement created successfully, returns the full
5224
+ * entitlement object
5225
+ * - `422 Unprocessable Entity` - Invalid request parameters or validation failure
5226
+ * - `500 Internal Server Error` - Database or server error
5227
+ *
5228
+ * # Business Logic
5229
+ *
5230
+ * - A unique ID with prefix `cde_` is automatically generated for the entitlement
5231
+ * - Created and updated timestamps are automatically set
5232
+ * - Currency is required when price_per_unit is set
5233
+ * - price_per_unit is required when overage_enabled is true
5234
+ * - rollover_timeframe_count and rollover_timeframe_interval must both be set or
5235
+ * both be null
5236
+ */
5237
+ create(body, options) {
5238
+ return this._client.post('/credit-entitlements', { body, ...options });
5239
+ }
5240
+ /**
5241
+ * Returns the full details of a single credit entitlement including all
5242
+ * configuration settings for expiration, rollover, and overage policies.
5243
+ *
5244
+ * # Authentication
5245
+ *
5246
+ * Requires an API key with `Viewer` role or higher.
5247
+ *
5248
+ * # Path Parameters
5249
+ *
5250
+ * - `id` - The unique identifier of the credit entitlement (format: `cde_...`)
5251
+ *
5252
+ * # Responses
5253
+ *
5254
+ * - `200 OK` - Returns the full credit entitlement object
5255
+ * - `404 Not Found` - Credit entitlement does not exist or does not belong to the
5256
+ * authenticated business
5257
+ * - `500 Internal Server Error` - Database or server error
5258
+ *
5259
+ * # Business Logic
5260
+ *
5261
+ * - Only non-deleted credit entitlements can be retrieved through this endpoint
5262
+ * - The entitlement must belong to the authenticated business (business_id check)
5263
+ * - Deleted entitlements return a 404 error and must be retrieved via the list
5264
+ * endpoint with `deleted=true`
5265
+ */
5266
+ retrieve(id, options) {
5267
+ return this._client.get(path `/credit-entitlements/${id}`, options);
5268
+ }
5269
+ /**
5270
+ * Allows partial updates to a credit entitlement's configuration. Only the fields
5271
+ * provided in the request body will be updated; all other fields remain unchanged.
5272
+ * This endpoint supports nullable fields using the double option pattern.
5273
+ *
5274
+ * # Authentication
5275
+ *
5276
+ * Requires an API key with `Editor` role.
5277
+ *
5278
+ * # Path Parameters
5279
+ *
5280
+ * - `id` - The unique identifier of the credit entitlement to update (format:
5281
+ * `cde_...`)
5282
+ *
5283
+ * # Request Body (all fields optional)
5284
+ *
5285
+ * - `name` - Human-readable name of the credit entitlement (1-255 characters)
5286
+ * - `description` - Optional description (max 1000 characters)
5287
+ * - `unit` - Unit of measurement for the credit (1-50 characters)
5288
+ *
5289
+ * Note: `precision` cannot be modified after creation as it would invalidate
5290
+ * existing grants.
5291
+ *
5292
+ * - `expires_after_days` - Number of days after which credits expire (use `null`
5293
+ * to remove expiration)
5294
+ * - `rollover_enabled` - Whether unused credits can rollover to the next period
5295
+ * - `rollover_percentage` - Percentage of unused credits that rollover (0-100,
5296
+ * nullable)
5297
+ * - `rollover_timeframe_count` - Count of timeframe periods for rollover limit
5298
+ * (nullable)
5299
+ * - `rollover_timeframe_interval` - Interval type (day, week, month, year,
5300
+ * nullable)
5301
+ * - `max_rollover_count` - Maximum number of times credits can be rolled over
5302
+ * (nullable)
5303
+ * - `overage_enabled` - Whether overage charges apply when credits run out
5304
+ * - `overage_limit` - Maximum overage units allowed (nullable)
5305
+ * - `currency` - Currency for pricing (nullable)
5306
+ * - `price_per_unit` - Price per credit unit (decimal, nullable)
5307
+ *
5308
+ * # Responses
5309
+ *
5310
+ * - `200 OK` - Credit entitlement updated successfully
5311
+ * - `404 Not Found` - Credit entitlement does not exist or does not belong to the
5312
+ * authenticated business
5313
+ * - `422 Unprocessable Entity` - Invalid request parameters or validation failure
5314
+ * - `500 Internal Server Error` - Database or server error
5315
+ *
5316
+ * # Business Logic
5317
+ *
5318
+ * - Only non-deleted credit entitlements can be updated
5319
+ * - Fields set to `null` explicitly will clear the database value (using double
5320
+ * option pattern)
5321
+ * - The `updated_at` timestamp is automatically updated on successful modification
5322
+ * - Changes take effect immediately but do not retroactively affect existing
5323
+ * credit grants
5324
+ * - The merged state is validated: currency required with price, rollover
5325
+ * timeframe fields together, price required for overage
5326
+ */
5327
+ update(id, body, options) {
5328
+ return this._client.patch(path `/credit-entitlements/${id}`, {
5329
+ body,
5330
+ ...options,
5331
+ headers: buildHeaders([{ Accept: '*/*' }, options?.headers]),
5332
+ });
5333
+ }
5334
+ /**
5335
+ * Returns a paginated list of credit entitlements, allowing filtering of deleted
5336
+ * entitlements. By default, only non-deleted entitlements are returned.
5337
+ *
5338
+ * # Authentication
5339
+ *
5340
+ * Requires an API key with `Viewer` role or higher.
5341
+ *
5342
+ * # Query Parameters
5343
+ *
5344
+ * - `page_size` - Number of items per page (default: 10, max: 100)
5345
+ * - `page_number` - Zero-based page number (default: 0)
5346
+ * - `deleted` - Boolean flag to list deleted entitlements instead of active ones
5347
+ * (default: false)
5348
+ *
5349
+ * # Responses
5350
+ *
5351
+ * - `200 OK` - Returns a list of credit entitlements wrapped in a response object
5352
+ * - `422 Unprocessable Entity` - Invalid query parameters (e.g., page_size > 100)
5353
+ * - `500 Internal Server Error` - Database or server error
5354
+ *
5355
+ * # Business Logic
5356
+ *
5357
+ * - Results are ordered by creation date in descending order (newest first)
5358
+ * - Only entitlements belonging to the authenticated business are returned
5359
+ * - The `deleted` parameter controls visibility of soft-deleted entitlements
5360
+ * - Pagination uses offset-based pagination (offset = page_number \* page_size)
5361
+ */
5362
+ list(query = {}, options) {
5363
+ return this._client.getAPIList('/credit-entitlements', (DefaultPageNumberPagination), {
5364
+ query,
5365
+ ...options,
5366
+ });
5367
+ }
5368
+ delete(id, options) {
5369
+ return this._client.delete(path `/credit-entitlements/${id}`, {
5370
+ ...options,
5371
+ headers: buildHeaders([{ Accept: '*/*' }, options?.headers]),
5372
+ });
5373
+ }
5374
+ /**
5375
+ * Undeletes a soft-deleted credit entitlement by clearing `deleted_at`, making it
5376
+ * available again through standard list and get endpoints.
5377
+ *
5378
+ * # Authentication
5379
+ *
5380
+ * Requires an API key with `Editor` role.
5381
+ *
5382
+ * # Path Parameters
5383
+ *
5384
+ * - `id` - The unique identifier of the credit entitlement to restore (format:
5385
+ * `cde_...`)
5386
+ *
5387
+ * # Responses
5388
+ *
5389
+ * - `200 OK` - Credit entitlement restored successfully
5390
+ * - `500 Internal Server Error` - Database error, entitlement not found, or
5391
+ * entitlement is not deleted
5392
+ *
5393
+ * # Business Logic
5394
+ *
5395
+ * - Only deleted credit entitlements can be restored
5396
+ * - The query filters for `deleted_at IS NOT NULL`, so non-deleted entitlements
5397
+ * will result in 0 rows affected
5398
+ * - If no rows are affected (entitlement doesn't exist, doesn't belong to
5399
+ * business, or is not deleted), returns 500
5400
+ * - The `updated_at` timestamp is automatically updated on successful restoration
5401
+ * - Once restored, the entitlement becomes immediately available in the standard
5402
+ * list and get endpoints
5403
+ * - All configuration settings are preserved during delete/restore operations
5404
+ *
5405
+ * # Error Handling
5406
+ *
5407
+ * This endpoint returns 500 Internal Server Error in several cases:
5408
+ *
5409
+ * - The credit entitlement does not exist
5410
+ * - The credit entitlement belongs to a different business
5411
+ * - The credit entitlement is not currently deleted (already active)
5412
+ *
5413
+ * Callers should verify the entitlement exists and is deleted before calling this
5414
+ * endpoint.
5415
+ */
5416
+ undelete(id, options) {
5417
+ return this._client.post(path `/credit-entitlements/${id}/undelete`, {
5418
+ ...options,
5419
+ headers: buildHeaders([{ Accept: '*/*' }, options?.headers]),
5420
+ });
5421
+ }
5422
+ }
5423
+ CreditEntitlements.Balances = Balances;
5424
+
5425
+ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
5426
+ let CustomerPortal$1 = class CustomerPortal extends APIResource {
5427
+ create(customerID, params = {}, options) {
5428
+ const { send_email } = params ?? {};
5429
+ return this._client.post(path `/customers/${customerID}/customer-portal/session`, {
5430
+ query: { send_email },
5431
+ ...options,
5432
+ });
5433
+ }
5434
+ };
5435
+
5436
+ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
5437
+ class LedgerEntries extends APIResource {
5438
+ create(customerID, body, options) {
5439
+ return this._client.post(path `/customers/${customerID}/wallets/ledger-entries`, { body, ...options });
5440
+ }
5441
+ list(customerID, query = {}, options) {
5442
+ return this._client.getAPIList(path `/customers/${customerID}/wallets/ledger-entries`, (DefaultPageNumberPagination), { query, ...options });
5443
+ }
5444
+ }
5445
+
5446
+ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
5447
+ class Wallets extends APIResource {
5448
+ constructor() {
5449
+ super(...arguments);
5450
+ this.ledgerEntries = new LedgerEntries(this._client);
5451
+ }
5452
+ list(customerID, options) {
5453
+ return this._client.get(path `/customers/${customerID}/wallets`, options);
5454
+ }
5455
+ }
5456
+ Wallets.LedgerEntries = LedgerEntries;
5457
+
5458
+ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
5459
+ class Customers extends APIResource {
5460
+ constructor() {
5461
+ super(...arguments);
5462
+ this.customerPortal = new CustomerPortal$1(this._client);
5463
+ this.wallets = new Wallets(this._client);
5464
+ }
5465
+ create(body, options) {
5466
+ return this._client.post('/customers', { body, ...options });
5467
+ }
5468
+ retrieve(customerID, options) {
5469
+ return this._client.get(path `/customers/${customerID}`, options);
5470
+ }
5471
+ update(customerID, body, options) {
5472
+ return this._client.patch(path `/customers/${customerID}`, { body, ...options });
5473
+ }
5474
+ list(query = {}, options) {
5475
+ return this._client.getAPIList('/customers', (DefaultPageNumberPagination), {
5476
+ query,
5477
+ ...options,
5478
+ });
5479
+ }
5480
+ /**
5481
+ * List all credit entitlements for a customer with their current balances
5482
+ */
5483
+ listCreditEntitlements(customerID, options) {
5484
+ return this._client.get(path `/customers/${customerID}/credit-entitlements`, options);
5485
+ }
5486
+ retrievePaymentMethods(customerID, options) {
5487
+ return this._client.get(path `/customers/${customerID}/payment-methods`, options);
5488
+ }
5489
+ }
5490
+ Customers.CustomerPortal = CustomerPortal$1;
5491
+ Customers.Wallets = Wallets;
5492
+
5063
5493
  // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
5064
5494
  class Discounts extends APIResource {
5065
5495
  /**
@@ -5099,6 +5529,14 @@ class Discounts extends APIResource {
5099
5529
  headers: buildHeaders([{ Accept: '*/*' }, options?.headers]),
5100
5530
  });
5101
5531
  }
5532
+ /**
5533
+ * Validate and fetch a discount by its code name (e.g., "SAVE20"). This allows
5534
+ * real-time validation directly against the API using the human-readable discount
5535
+ * code instead of requiring the internal discount_id.
5536
+ */
5537
+ retrieveByCode(code, options) {
5538
+ return this._client.get(path `/discounts/code/${code}`, options);
5539
+ }
5102
5540
  }
5103
5541
 
5104
5542
  // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
@@ -5297,6 +5735,9 @@ class Misc extends APIResource {
5297
5735
 
5298
5736
  // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
5299
5737
  class Payments extends APIResource {
5738
+ /**
5739
+ * @deprecated
5740
+ */
5300
5741
  create(body, options) {
5301
5742
  return this._client.post('/payments', { body, ...options });
5302
5743
  }
@@ -5332,11 +5773,29 @@ class Images extends APIResource {
5332
5773
  }
5333
5774
  }
5334
5775
 
5776
+ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
5777
+ class ShortLinks extends APIResource {
5778
+ /**
5779
+ * Gives a Short Checkout URL with custom slug for a product. Uses a Static
5780
+ * Checkout URL under the hood.
5781
+ */
5782
+ create(id, body, options) {
5783
+ return this._client.post(path `/products/${id}/short_links`, { body, ...options });
5784
+ }
5785
+ /**
5786
+ * Lists all short links created by the business.
5787
+ */
5788
+ list(query = {}, options) {
5789
+ return this._client.getAPIList('/products/short_links', (DefaultPageNumberPagination), { query, ...options });
5790
+ }
5791
+ }
5792
+
5335
5793
  // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
5336
5794
  class Products extends APIResource {
5337
5795
  constructor() {
5338
5796
  super(...arguments);
5339
5797
  this.images = new Images(this._client);
5798
+ this.shortLinks = new ShortLinks(this._client);
5340
5799
  }
5341
5800
  create(body, options) {
5342
5801
  return this._client.post('/products', { body, ...options });
@@ -5374,6 +5833,7 @@ class Products extends APIResource {
5374
5833
  }
5375
5834
  }
5376
5835
  Products.Images = Images;
5836
+ Products.ShortLinks = ShortLinks;
5377
5837
 
5378
5838
  // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
5379
5839
  class Refunds extends APIResource {
@@ -5393,6 +5853,9 @@ class Refunds extends APIResource {
5393
5853
 
5394
5854
  // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
5395
5855
  class Subscriptions extends APIResource {
5856
+ /**
5857
+ * @deprecated
5858
+ */
5396
5859
  create(body, options) {
5397
5860
  return this._client.post('/subscriptions', { body, ...options });
5398
5861
  }
@@ -5418,6 +5881,15 @@ class Subscriptions extends APIResource {
5418
5881
  charge(subscriptionID, body, options) {
5419
5882
  return this._client.post(path `/subscriptions/${subscriptionID}/charge`, { body, ...options });
5420
5883
  }
5884
+ previewChangePlan(subscriptionID, body, options) {
5885
+ return this._client.post(path `/subscriptions/${subscriptionID}/change-plan/preview`, {
5886
+ body,
5887
+ ...options,
5888
+ });
5889
+ }
5890
+ retrieveCreditUsage(subscriptionID, options) {
5891
+ return this._client.get(path `/subscriptions/${subscriptionID}/credit-usage`, options);
5892
+ }
5421
5893
  /**
5422
5894
  * Get detailed usage history for a subscription that includes usage-based billing
5423
5895
  * (metered components). This endpoint provides insights into customer usage
@@ -5465,6 +5937,12 @@ class Subscriptions extends APIResource {
5465
5937
  retrieveUsageHistory(subscriptionID, query = {}, options) {
5466
5938
  return this._client.getAPIList(path `/subscriptions/${subscriptionID}/usage-history`, (DefaultPageNumberPagination), { query, ...options });
5467
5939
  }
5940
+ updatePaymentMethod(subscriptionID, body, options) {
5941
+ return this._client.post(path `/subscriptions/${subscriptionID}/update-payment-method`, {
5942
+ body,
5943
+ ...options,
5944
+ });
5945
+ }
5468
5946
  }
5469
5947
 
5470
5948
  // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
@@ -6586,6 +7064,8 @@ class DodoPayments {
6586
7064
  this.webhookEvents = new WebhookEvents(this);
6587
7065
  this.usageEvents = new UsageEvents(this);
6588
7066
  this.meters = new Meters(this);
7067
+ this.balances = new Balances$1(this);
7068
+ this.creditEntitlements = new CreditEntitlements(this);
6589
7069
  if (bearerToken === undefined) {
6590
7070
  throw new DodoPaymentsError("The DODO_PAYMENTS_API_KEY environment variable is missing or empty; either provide it, or instantiate the DodoPayments client with an bearerToken option, like new DodoPayments({ bearerToken: 'My Bearer Token' }).");
6591
7071
  }
@@ -6650,18 +7130,7 @@ class DodoPayments {
6650
7130
  * Basic re-implementation of `qs.stringify` for primitive types.
6651
7131
  */
6652
7132
  stringifyQuery(query) {
6653
- return Object.entries(query)
6654
- .filter(([_, value]) => typeof value !== 'undefined')
6655
- .map(([key, value]) => {
6656
- if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
6657
- return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
6658
- }
6659
- if (value === null) {
6660
- return `${encodeURIComponent(key)}=`;
6661
- }
6662
- throw new DodoPaymentsError(`Cannot stringify type ${typeof value}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`);
6663
- })
6664
- .join('&');
7133
+ return stringifyQuery(query);
6665
7134
  }
6666
7135
  getUserAgent() {
6667
7136
  return `${this.constructor.name}/JS ${VERSION}`;
@@ -6825,7 +7294,9 @@ class DodoPayments {
6825
7294
  return { response, options, controller, requestLogID, retryOfRequestLogID, startTime };
6826
7295
  }
6827
7296
  getAPIList(path, Page, opts) {
6828
- return this.requestAPIList(Page, { method: 'get', path, ...opts });
7297
+ return this.requestAPIList(Page, opts && 'then' in opts ?
7298
+ opts.then((opts) => ({ method: 'get', path, ...opts }))
7299
+ : { method: 'get', path, ...opts });
6829
7300
  }
6830
7301
  requestAPIList(Page, options) {
6831
7302
  const request = this.makeRequest(options, null, undefined);
@@ -6833,9 +7304,10 @@ class DodoPayments {
6833
7304
  }
6834
7305
  async fetchWithTimeout(url, init, ms, controller) {
6835
7306
  const { signal, method, ...options } = init || {};
7307
+ const abort = this._makeAbort(controller);
6836
7308
  if (signal)
6837
- signal.addEventListener('abort', () => controller.abort());
6838
- const timeout = setTimeout(() => controller.abort(), ms);
7309
+ signal.addEventListener('abort', abort, { once: true });
7310
+ const timeout = setTimeout(abort, ms);
6839
7311
  const isReadableBody = (globalThis.ReadableStream && options.body instanceof globalThis.ReadableStream) ||
6840
7312
  (typeof options.body === 'object' && options.body !== null && Symbol.asyncIterator in options.body);
6841
7313
  const fetchOptions = {
@@ -6900,9 +7372,9 @@ class DodoPayments {
6900
7372
  timeoutMillis = Date.parse(retryAfterHeader) - Date.now();
6901
7373
  }
6902
7374
  }
6903
- // If the API asks us to wait a certain amount of time (and it's a reasonable amount),
6904
- // just do what it says, but otherwise calculate a default
6905
- if (!(timeoutMillis && 0 <= timeoutMillis && timeoutMillis < 60 * 1000)) {
7375
+ // If the API asks us to wait a certain amount of time, just do what it
7376
+ // says, but otherwise calculate a default
7377
+ if (timeoutMillis === undefined) {
6906
7378
  const maxRetries = options.maxRetries ?? this.maxRetries;
6907
7379
  timeoutMillis = this.calculateDefaultRetryTimeoutMillis(retriesRemaining, maxRetries);
6908
7380
  }
@@ -6964,6 +7436,11 @@ class DodoPayments {
6964
7436
  this.validateHeaders(headers);
6965
7437
  return headers.values;
6966
7438
  }
7439
+ _makeAbort(controller) {
7440
+ // note: we can't just inline this method inside `fetchWithTimeout()` because then the closure
7441
+ // would capture all request options, and cause a memory leak.
7442
+ return () => controller.abort();
7443
+ }
6967
7444
  buildBody({ options: { body, headers: rawHeaders } }) {
6968
7445
  if (!body) {
6969
7446
  return { bodyHeaders: undefined, body: undefined };
@@ -6992,6 +7469,13 @@ class DodoPayments {
6992
7469
  (Symbol.iterator in body && 'next' in body && typeof body.next === 'function'))) {
6993
7470
  return { bodyHeaders: undefined, body: ReadableStreamFrom(body) };
6994
7471
  }
7472
+ else if (typeof body === 'object' &&
7473
+ headers.values.get('content-type') === 'application/x-www-form-urlencoded') {
7474
+ return {
7475
+ bodyHeaders: { 'content-type': 'application/x-www-form-urlencoded' },
7476
+ body: this.stringifyQuery(body),
7477
+ };
7478
+ }
6995
7479
  else {
6996
7480
  return __classPrivateFieldGet(this, _DodoPayments_encoder, "f").call(this, { body, headers });
6997
7481
  }
@@ -7036,6 +7520,8 @@ DodoPayments.Webhooks = Webhooks$1;
7036
7520
  DodoPayments.WebhookEvents = WebhookEvents;
7037
7521
  DodoPayments.UsageEvents = UsageEvents;
7038
7522
  DodoPayments.Meters = Meters;
7523
+ DodoPayments.Balances = Balances$1;
7524
+ DodoPayments.CreditEntitlements = CreditEntitlements;
7039
7525
 
7040
7526
  // src/checkout/checkout.ts
7041
7527
  var checkoutQuerySchema = objectType({
@@ -7506,6 +7992,32 @@ var buildCheckoutUrl = async ({
7506
7992
  }
7507
7993
  };
7508
7994
 
7995
+ var __create = Object.create;
7996
+ var __defProp = Object.defineProperty;
7997
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
7998
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7999
+ var __getProtoOf = Object.getPrototypeOf;
8000
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8001
+ var __commonJS = (cb, mod) => function __require2() {
8002
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
8003
+ };
8004
+ var __copyProps = (to, from, except, desc) => {
8005
+ if (from && typeof from === "object" || typeof from === "function") {
8006
+ for (let key of __getOwnPropNames(from))
8007
+ if (!__hasOwnProp.call(to, key) && key !== except)
8008
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
8009
+ }
8010
+ return to;
8011
+ };
8012
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
8013
+ // If the importer is in node compatibility mode or this is not an ESM
8014
+ // file that has been converted to a CommonJS file using a Babel-
8015
+ // compatible transform (i.e. "__esModule" has not been set), then set
8016
+ // "default" to the CommonJS "module.exports" for node compatibility.
8017
+ __defProp(target, "default", { value: mod, enumerable: true }) ,
8018
+ mod
8019
+ ));
8020
+
7509
8021
  const Checkout = (config) => {
7510
8022
  // GET handler for static checkout
7511
8023
  const getHandler = async (request, reply) => {
@@ -7590,23 +8102,33 @@ var PaymentSchema = objectType({
7590
8102
  payload_type: literalType("Payment"),
7591
8103
  billing: objectType({
7592
8104
  city: stringType().nullable(),
7593
- country: stringType().nullable(),
8105
+ country: stringType(),
7594
8106
  state: stringType().nullable(),
7595
8107
  street: stringType().nullable(),
7596
8108
  zipcode: stringType().nullable()
7597
8109
  }),
7598
8110
  brand_id: stringType(),
7599
8111
  business_id: stringType(),
8112
+ card_holder_name: stringType().nullable(),
7600
8113
  card_issuing_country: stringType().nullable(),
7601
8114
  card_last_four: stringType().nullable(),
7602
8115
  card_network: stringType().nullable(),
7603
8116
  card_type: stringType().nullable(),
8117
+ checkout_session_id: stringType().nullable(),
7604
8118
  created_at: stringType().transform((d) => new Date(d)),
7605
8119
  currency: stringType(),
8120
+ custom_field_responses: arrayType(
8121
+ objectType({
8122
+ key: stringType(),
8123
+ value: stringType()
8124
+ })
8125
+ ).nullable(),
7606
8126
  customer: objectType({
7607
8127
  customer_id: stringType(),
7608
8128
  email: stringType(),
7609
- name: stringType().nullable()
8129
+ metadata: recordType(anyType()),
8130
+ name: stringType(),
8131
+ phone_number: stringType().nullable()
7610
8132
  }),
7611
8133
  digital_products_delivered: booleanType(),
7612
8134
  discount_id: stringType().nullable(),
@@ -7617,27 +8139,25 @@ var PaymentSchema = objectType({
7617
8139
  created_at: stringType().transform((d) => new Date(d)),
7618
8140
  currency: stringType(),
7619
8141
  dispute_id: stringType(),
7620
- dispute_stage: enumType([
7621
- "pre_dispute",
7622
- "dispute_opened",
7623
- "dispute_won",
7624
- "dispute_lost"
7625
- ]),
8142
+ dispute_stage: enumType(["pre_dispute", "dispute", "pre_arbitration"]),
7626
8143
  dispute_status: enumType([
7627
8144
  "dispute_opened",
7628
- "dispute_won",
7629
- "dispute_lost",
8145
+ "dispute_expired",
7630
8146
  "dispute_accepted",
7631
8147
  "dispute_cancelled",
7632
- "dispute_challenged"
8148
+ "dispute_challenged",
8149
+ "dispute_won",
8150
+ "dispute_lost"
7633
8151
  ]),
7634
8152
  payment_id: stringType(),
7635
8153
  remarks: stringType().nullable()
7636
8154
  })
7637
- ).nullable(),
8155
+ ).default([]),
7638
8156
  error_code: stringType().nullable(),
7639
8157
  error_message: stringType().nullable(),
7640
- metadata: recordType(anyType()).nullable(),
8158
+ invoice_id: stringType().nullable(),
8159
+ invoice_url: stringType().nullable(),
8160
+ metadata: recordType(anyType()),
7641
8161
  payment_id: stringType(),
7642
8162
  payment_link: stringType().nullable(),
7643
8163
  payment_method: stringType().nullable(),
@@ -7650,21 +8170,34 @@ var PaymentSchema = objectType({
7650
8170
  ).nullable(),
7651
8171
  refunds: arrayType(
7652
8172
  objectType({
7653
- amount: numberType(),
8173
+ amount: numberType().nullable(),
7654
8174
  business_id: stringType(),
7655
8175
  created_at: stringType().transform((d) => new Date(d)),
7656
- currency: stringType(),
8176
+ currency: stringType().nullable(),
7657
8177
  is_partial: booleanType(),
7658
8178
  payment_id: stringType(),
7659
8179
  reason: stringType().nullable(),
7660
8180
  refund_id: stringType(),
7661
- status: enumType(["succeeded", "failed", "pending"])
8181
+ status: enumType(["succeeded", "failed", "pending", "review"])
7662
8182
  })
7663
- ).nullable(),
8183
+ ),
8184
+ refund_status: enumType(["partial", "full"]).nullable(),
7664
8185
  settlement_amount: numberType(),
7665
8186
  settlement_currency: stringType(),
7666
8187
  settlement_tax: numberType().nullable(),
7667
- status: enumType(["succeeded", "failed", "pending", "processing", "cancelled"]),
8188
+ status: enumType([
8189
+ "succeeded",
8190
+ "failed",
8191
+ "cancelled",
8192
+ "processing",
8193
+ "requires_customer_action",
8194
+ "requires_merchant_action",
8195
+ "requires_payment_method",
8196
+ "requires_confirmation",
8197
+ "requires_capture",
8198
+ "partially_captured",
8199
+ "partially_captured_and_capturable"
8200
+ ]).nullable(),
7668
8201
  subscription_id: stringType().nullable(),
7669
8202
  tax: numberType().nullable(),
7670
8203
  total_amount: numberType(),
@@ -7677,10 +8210,10 @@ var SubscriptionSchema = objectType({
7677
8210
  addon_id: stringType(),
7678
8211
  quantity: numberType()
7679
8212
  })
7680
- ).nullable(),
8213
+ ),
7681
8214
  billing: objectType({
7682
8215
  city: stringType().nullable(),
7683
- country: stringType().nullable(),
8216
+ country: stringType(),
7684
8217
  state: stringType().nullable(),
7685
8218
  street: stringType().nullable(),
7686
8219
  zipcode: stringType().nullable()
@@ -7692,15 +8225,72 @@ var SubscriptionSchema = objectType({
7692
8225
  customer: objectType({
7693
8226
  customer_id: stringType(),
7694
8227
  email: stringType(),
7695
- name: stringType().nullable()
8228
+ metadata: recordType(anyType()),
8229
+ name: stringType(),
8230
+ phone_number: stringType().nullable()
7696
8231
  }),
8232
+ custom_field_responses: arrayType(
8233
+ objectType({
8234
+ key: stringType(),
8235
+ value: stringType()
8236
+ })
8237
+ ).nullable(),
8238
+ discount_cycles_remaining: numberType().nullable(),
7697
8239
  discount_id: stringType().nullable(),
7698
- metadata: recordType(anyType()).nullable(),
7699
- next_billing_date: stringType().transform((d) => new Date(d)).nullable(),
8240
+ expires_at: stringType().transform((d) => new Date(d)).nullable(),
8241
+ credit_entitlement_cart: arrayType(
8242
+ objectType({
8243
+ credit_entitlement_id: stringType(),
8244
+ credit_entitlement_name: stringType(),
8245
+ credits_amount: stringType(),
8246
+ overage_balance: stringType(),
8247
+ overage_behavior: enumType([
8248
+ "forgive_at_reset",
8249
+ "invoice_at_billing",
8250
+ "carry_deficit",
8251
+ "carry_deficit_auto_repay"
8252
+ ]),
8253
+ overage_enabled: booleanType(),
8254
+ product_id: stringType(),
8255
+ remaining_balance: stringType(),
8256
+ rollover_enabled: booleanType(),
8257
+ unit: stringType(),
8258
+ expires_after_days: numberType().nullable(),
8259
+ low_balance_threshold_percent: numberType().nullable(),
8260
+ max_rollover_count: numberType().nullable(),
8261
+ overage_limit: stringType().nullable(),
8262
+ rollover_percentage: numberType().nullable(),
8263
+ rollover_timeframe_count: numberType().nullable(),
8264
+ rollover_timeframe_interval: enumType(["Day", "Week", "Month", "Year"]).nullable()
8265
+ })
8266
+ ),
8267
+ meter_credit_entitlement_cart: arrayType(
8268
+ objectType({
8269
+ credit_entitlement_id: stringType(),
8270
+ meter_id: stringType(),
8271
+ meter_name: stringType(),
8272
+ meter_units_per_credit: stringType(),
8273
+ product_id: stringType()
8274
+ })
8275
+ ),
8276
+ meters: arrayType(
8277
+ objectType({
8278
+ currency: stringType(),
8279
+ description: stringType().nullable(),
8280
+ free_threshold: numberType(),
8281
+ measurement_unit: stringType(),
8282
+ meter_id: stringType(),
8283
+ name: stringType(),
8284
+ price_per_unit: stringType().nullable()
8285
+ })
8286
+ ),
8287
+ metadata: recordType(anyType()),
8288
+ next_billing_date: stringType().transform((d) => new Date(d)),
7700
8289
  on_demand: booleanType(),
7701
8290
  payment_frequency_count: numberType(),
7702
8291
  payment_frequency_interval: enumType(["Day", "Week", "Month", "Year"]),
7703
- previous_billing_date: stringType().transform((d) => new Date(d)).nullable(),
8292
+ payment_method_id: stringType().nullable(),
8293
+ previous_billing_date: stringType().transform((d) => new Date(d)),
7704
8294
  product_id: stringType(),
7705
8295
  quantity: numberType(),
7706
8296
  recurring_pre_tax_amount: numberType(),
@@ -7708,7 +8298,6 @@ var SubscriptionSchema = objectType({
7708
8298
  "pending",
7709
8299
  "active",
7710
8300
  "on_hold",
7711
- "paused",
7712
8301
  "cancelled",
7713
8302
  "expired",
7714
8303
  "failed"
@@ -7716,20 +8305,29 @@ var SubscriptionSchema = objectType({
7716
8305
  subscription_id: stringType(),
7717
8306
  subscription_period_count: numberType(),
7718
8307
  subscription_period_interval: enumType(["Day", "Week", "Month", "Year"]),
8308
+ tax_id: stringType().nullable(),
7719
8309
  tax_inclusive: booleanType(),
7720
8310
  trial_period_days: numberType()
7721
8311
  });
7722
8312
  var RefundSchema = objectType({
7723
8313
  payload_type: literalType("Refund"),
7724
- amount: numberType(),
8314
+ amount: numberType().nullable(),
7725
8315
  business_id: stringType(),
7726
8316
  created_at: stringType().transform((d) => new Date(d)),
7727
- currency: stringType(),
8317
+ customer: objectType({
8318
+ customer_id: stringType(),
8319
+ email: stringType(),
8320
+ metadata: recordType(anyType()),
8321
+ name: stringType(),
8322
+ phone_number: stringType().nullable()
8323
+ }),
8324
+ currency: stringType().nullable(),
7728
8325
  is_partial: booleanType(),
8326
+ metadata: recordType(anyType()),
7729
8327
  payment_id: stringType(),
7730
8328
  reason: stringType().nullable(),
7731
8329
  refund_id: stringType(),
7732
- status: enumType(["succeeded", "failed", "pending"])
8330
+ status: enumType(["succeeded", "failed", "pending", "review"])
7733
8331
  });
7734
8332
  var DisputeSchema = objectType({
7735
8333
  payload_type: literalType("Dispute"),
@@ -7737,27 +8335,31 @@ var DisputeSchema = objectType({
7737
8335
  business_id: stringType(),
7738
8336
  created_at: stringType().transform((d) => new Date(d)),
7739
8337
  currency: stringType(),
8338
+ customer: objectType({
8339
+ customer_id: stringType(),
8340
+ email: stringType(),
8341
+ metadata: recordType(anyType()),
8342
+ name: stringType(),
8343
+ phone_number: stringType().nullable()
8344
+ }),
7740
8345
  dispute_id: stringType(),
7741
- dispute_stage: enumType([
7742
- "pre_dispute",
7743
- "dispute_opened",
7744
- "dispute_won",
7745
- "dispute_lost"
7746
- ]),
8346
+ dispute_stage: enumType(["pre_dispute", "dispute", "pre_arbitration"]),
7747
8347
  dispute_status: enumType([
7748
8348
  "dispute_opened",
7749
- "dispute_won",
7750
- "dispute_lost",
8349
+ "dispute_expired",
7751
8350
  "dispute_accepted",
7752
8351
  "dispute_cancelled",
7753
- "dispute_challenged"
8352
+ "dispute_challenged",
8353
+ "dispute_won",
8354
+ "dispute_lost"
7754
8355
  ]),
7755
8356
  payment_id: stringType(),
8357
+ reason: stringType().nullable(),
7756
8358
  remarks: stringType().nullable()
7757
8359
  });
7758
8360
  var LicenseKeySchema = objectType({
7759
8361
  payload_type: literalType("LicenseKey"),
7760
- activations_limit: numberType(),
8362
+ activations_limit: numberType().nullable(),
7761
8363
  business_id: stringType(),
7762
8364
  created_at: stringType().transform((d) => new Date(d)),
7763
8365
  customer_id: stringType(),
@@ -7767,7 +8369,7 @@ var LicenseKeySchema = objectType({
7767
8369
  key: stringType(),
7768
8370
  payment_id: stringType(),
7769
8371
  product_id: stringType(),
7770
- status: enumType(["active", "inactive", "expired"]),
8372
+ status: enumType(["active", "expired", "disabled"]),
7771
8373
  subscription_id: stringType().nullable()
7772
8374
  });
7773
8375
  var PaymentSucceededPayloadSchema = objectType({
@@ -7866,12 +8468,6 @@ var SubscriptionRenewedPayloadSchema = objectType({
7866
8468
  timestamp: stringType().transform((d) => new Date(d)),
7867
8469
  data: SubscriptionSchema
7868
8470
  });
7869
- var SubscriptionPausedPayloadSchema = objectType({
7870
- business_id: stringType(),
7871
- type: literalType("subscription.paused"),
7872
- timestamp: stringType().transform((d) => new Date(d)),
7873
- data: SubscriptionSchema
7874
- });
7875
8471
  var SubscriptionPlanChangedPayloadSchema = objectType({
7876
8472
  business_id: stringType(),
7877
8473
  type: literalType("subscription.plan_changed"),
@@ -7908,6 +8504,94 @@ var LicenseKeyCreatedPayloadSchema = objectType({
7908
8504
  timestamp: stringType().transform((d) => new Date(d)),
7909
8505
  data: LicenseKeySchema
7910
8506
  });
8507
+ var CreditLedgerEntrySchema = objectType({
8508
+ payload_type: literalType("CreditLedgerEntry"),
8509
+ id: stringType(),
8510
+ amount: stringType(),
8511
+ balance_after: stringType(),
8512
+ balance_before: stringType(),
8513
+ business_id: stringType(),
8514
+ created_at: stringType().transform((d) => new Date(d)),
8515
+ credit_entitlement_id: stringType(),
8516
+ customer_id: stringType(),
8517
+ is_credit: booleanType(),
8518
+ overage_after: stringType(),
8519
+ overage_before: stringType(),
8520
+ transaction_type: enumType([
8521
+ "credit_added",
8522
+ "credit_deducted",
8523
+ "credit_expired",
8524
+ "credit_rolled_over",
8525
+ "rollover_forfeited",
8526
+ "overage_charged",
8527
+ "auto_top_up",
8528
+ "manual_adjustment",
8529
+ "refund"
8530
+ ]),
8531
+ description: stringType().nullable(),
8532
+ grant_id: stringType().nullable(),
8533
+ reference_id: stringType().nullable(),
8534
+ reference_type: stringType().nullable()
8535
+ });
8536
+ var CreditBalanceLowSchema = objectType({
8537
+ payload_type: literalType("CreditBalanceLow"),
8538
+ customer_id: stringType(),
8539
+ subscription_id: stringType(),
8540
+ credit_entitlement_id: stringType(),
8541
+ credit_entitlement_name: stringType(),
8542
+ available_balance: stringType(),
8543
+ subscription_credits_amount: stringType(),
8544
+ threshold_percent: numberType(),
8545
+ threshold_amount: stringType()
8546
+ });
8547
+ var CreditAddedPayloadSchema = objectType({
8548
+ business_id: stringType(),
8549
+ type: literalType("credit.added"),
8550
+ timestamp: stringType().transform((d) => new Date(d)),
8551
+ data: CreditLedgerEntrySchema
8552
+ });
8553
+ var CreditDeductedPayloadSchema = objectType({
8554
+ business_id: stringType(),
8555
+ type: literalType("credit.deducted"),
8556
+ timestamp: stringType().transform((d) => new Date(d)),
8557
+ data: CreditLedgerEntrySchema
8558
+ });
8559
+ var CreditExpiredPayloadSchema = objectType({
8560
+ business_id: stringType(),
8561
+ type: literalType("credit.expired"),
8562
+ timestamp: stringType().transform((d) => new Date(d)),
8563
+ data: CreditLedgerEntrySchema
8564
+ });
8565
+ var CreditRolledOverPayloadSchema = objectType({
8566
+ business_id: stringType(),
8567
+ type: literalType("credit.rolled_over"),
8568
+ timestamp: stringType().transform((d) => new Date(d)),
8569
+ data: CreditLedgerEntrySchema
8570
+ });
8571
+ var CreditRolloverForfeitedPayloadSchema = objectType({
8572
+ business_id: stringType(),
8573
+ type: literalType("credit.rollover_forfeited"),
8574
+ timestamp: stringType().transform((d) => new Date(d)),
8575
+ data: CreditLedgerEntrySchema
8576
+ });
8577
+ var CreditOverageChargedPayloadSchema = objectType({
8578
+ business_id: stringType(),
8579
+ type: literalType("credit.overage_charged"),
8580
+ timestamp: stringType().transform((d) => new Date(d)),
8581
+ data: CreditLedgerEntrySchema
8582
+ });
8583
+ var CreditManualAdjustmentPayloadSchema = objectType({
8584
+ business_id: stringType(),
8585
+ type: literalType("credit.manual_adjustment"),
8586
+ timestamp: stringType().transform((d) => new Date(d)),
8587
+ data: CreditLedgerEntrySchema
8588
+ });
8589
+ var CreditBalanceLowPayloadSchema = objectType({
8590
+ business_id: stringType(),
8591
+ type: literalType("credit.balance_low"),
8592
+ timestamp: stringType().transform((d) => new Date(d)),
8593
+ data: CreditBalanceLowSchema
8594
+ });
7911
8595
  var WebhookPayloadSchema = discriminatedUnionType("type", [
7912
8596
  PaymentSucceededPayloadSchema,
7913
8597
  PaymentFailedPayloadSchema,
@@ -7925,15 +8609,691 @@ var WebhookPayloadSchema = discriminatedUnionType("type", [
7925
8609
  SubscriptionActivePayloadSchema,
7926
8610
  SubscriptionOnHoldPayloadSchema,
7927
8611
  SubscriptionRenewedPayloadSchema,
7928
- SubscriptionPausedPayloadSchema,
7929
8612
  SubscriptionPlanChangedPayloadSchema,
7930
8613
  SubscriptionCancelledPayloadSchema,
7931
8614
  SubscriptionFailedPayloadSchema,
7932
8615
  SubscriptionExpiredPayloadSchema,
7933
8616
  SubscriptionUpdatedPayloadSchema,
7934
- LicenseKeyCreatedPayloadSchema
8617
+ LicenseKeyCreatedPayloadSchema,
8618
+ CreditAddedPayloadSchema,
8619
+ CreditDeductedPayloadSchema,
8620
+ CreditExpiredPayloadSchema,
8621
+ CreditRolledOverPayloadSchema,
8622
+ CreditRolloverForfeitedPayloadSchema,
8623
+ CreditOverageChargedPayloadSchema,
8624
+ CreditManualAdjustmentPayloadSchema,
8625
+ CreditBalanceLowPayloadSchema
7935
8626
  ]);
7936
8627
 
8628
+ // ../../node_modules/@stablelib/base64/lib/base64.js
8629
+ var require_base64 = __commonJS({
8630
+ "../../node_modules/@stablelib/base64/lib/base64.js"(exports) {
8631
+ var __extends = exports && exports.__extends || /* @__PURE__ */ function() {
8632
+ var extendStatics = function(d, b) {
8633
+ extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {
8634
+ d2.__proto__ = b2;
8635
+ } || function(d2, b2) {
8636
+ for (var p in b2) if (b2.hasOwnProperty(p)) d2[p] = b2[p];
8637
+ };
8638
+ return extendStatics(d, b);
8639
+ };
8640
+ return function(d, b) {
8641
+ extendStatics(d, b);
8642
+ function __() {
8643
+ this.constructor = d;
8644
+ }
8645
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
8646
+ };
8647
+ }();
8648
+ Object.defineProperty(exports, "__esModule", { value: true });
8649
+ var INVALID_BYTE = 256;
8650
+ var Coder = (
8651
+ /** @class */
8652
+ function() {
8653
+ function Coder2(_paddingCharacter) {
8654
+ if (_paddingCharacter === void 0) {
8655
+ _paddingCharacter = "=";
8656
+ }
8657
+ this._paddingCharacter = _paddingCharacter;
8658
+ }
8659
+ Coder2.prototype.encodedLength = function(length) {
8660
+ if (!this._paddingCharacter) {
8661
+ return (length * 8 + 5) / 6 | 0;
8662
+ }
8663
+ return (length + 2) / 3 * 4 | 0;
8664
+ };
8665
+ Coder2.prototype.encode = function(data) {
8666
+ var out = "";
8667
+ var i = 0;
8668
+ for (; i < data.length - 2; i += 3) {
8669
+ var c = data[i] << 16 | data[i + 1] << 8 | data[i + 2];
8670
+ out += this._encodeByte(c >>> 3 * 6 & 63);
8671
+ out += this._encodeByte(c >>> 2 * 6 & 63);
8672
+ out += this._encodeByte(c >>> 1 * 6 & 63);
8673
+ out += this._encodeByte(c >>> 0 * 6 & 63);
8674
+ }
8675
+ var left = data.length - i;
8676
+ if (left > 0) {
8677
+ var c = data[i] << 16 | (left === 2 ? data[i + 1] << 8 : 0);
8678
+ out += this._encodeByte(c >>> 3 * 6 & 63);
8679
+ out += this._encodeByte(c >>> 2 * 6 & 63);
8680
+ if (left === 2) {
8681
+ out += this._encodeByte(c >>> 1 * 6 & 63);
8682
+ } else {
8683
+ out += this._paddingCharacter || "";
8684
+ }
8685
+ out += this._paddingCharacter || "";
8686
+ }
8687
+ return out;
8688
+ };
8689
+ Coder2.prototype.maxDecodedLength = function(length) {
8690
+ if (!this._paddingCharacter) {
8691
+ return (length * 6 + 7) / 8 | 0;
8692
+ }
8693
+ return length / 4 * 3 | 0;
8694
+ };
8695
+ Coder2.prototype.decodedLength = function(s) {
8696
+ return this.maxDecodedLength(s.length - this._getPaddingLength(s));
8697
+ };
8698
+ Coder2.prototype.decode = function(s) {
8699
+ if (s.length === 0) {
8700
+ return new Uint8Array(0);
8701
+ }
8702
+ var paddingLength = this._getPaddingLength(s);
8703
+ var length = s.length - paddingLength;
8704
+ var out = new Uint8Array(this.maxDecodedLength(length));
8705
+ var op = 0;
8706
+ var i = 0;
8707
+ var haveBad = 0;
8708
+ var v0 = 0, v1 = 0, v2 = 0, v3 = 0;
8709
+ for (; i < length - 4; i += 4) {
8710
+ v0 = this._decodeChar(s.charCodeAt(i + 0));
8711
+ v1 = this._decodeChar(s.charCodeAt(i + 1));
8712
+ v2 = this._decodeChar(s.charCodeAt(i + 2));
8713
+ v3 = this._decodeChar(s.charCodeAt(i + 3));
8714
+ out[op++] = v0 << 2 | v1 >>> 4;
8715
+ out[op++] = v1 << 4 | v2 >>> 2;
8716
+ out[op++] = v2 << 6 | v3;
8717
+ haveBad |= v0 & INVALID_BYTE;
8718
+ haveBad |= v1 & INVALID_BYTE;
8719
+ haveBad |= v2 & INVALID_BYTE;
8720
+ haveBad |= v3 & INVALID_BYTE;
8721
+ }
8722
+ if (i < length - 1) {
8723
+ v0 = this._decodeChar(s.charCodeAt(i));
8724
+ v1 = this._decodeChar(s.charCodeAt(i + 1));
8725
+ out[op++] = v0 << 2 | v1 >>> 4;
8726
+ haveBad |= v0 & INVALID_BYTE;
8727
+ haveBad |= v1 & INVALID_BYTE;
8728
+ }
8729
+ if (i < length - 2) {
8730
+ v2 = this._decodeChar(s.charCodeAt(i + 2));
8731
+ out[op++] = v1 << 4 | v2 >>> 2;
8732
+ haveBad |= v2 & INVALID_BYTE;
8733
+ }
8734
+ if (i < length - 3) {
8735
+ v3 = this._decodeChar(s.charCodeAt(i + 3));
8736
+ out[op++] = v2 << 6 | v3;
8737
+ haveBad |= v3 & INVALID_BYTE;
8738
+ }
8739
+ if (haveBad !== 0) {
8740
+ throw new Error("Base64Coder: incorrect characters for decoding");
8741
+ }
8742
+ return out;
8743
+ };
8744
+ Coder2.prototype._encodeByte = function(b) {
8745
+ var result = b;
8746
+ result += 65;
8747
+ result += 25 - b >>> 8 & 0 - 65 - 26 + 97;
8748
+ result += 51 - b >>> 8 & 26 - 97 - 52 + 48;
8749
+ result += 61 - b >>> 8 & 52 - 48 - 62 + 43;
8750
+ result += 62 - b >>> 8 & 62 - 43 - 63 + 47;
8751
+ return String.fromCharCode(result);
8752
+ };
8753
+ Coder2.prototype._decodeChar = function(c) {
8754
+ var result = INVALID_BYTE;
8755
+ result += (42 - c & c - 44) >>> 8 & -INVALID_BYTE + c - 43 + 62;
8756
+ result += (46 - c & c - 48) >>> 8 & -INVALID_BYTE + c - 47 + 63;
8757
+ result += (47 - c & c - 58) >>> 8 & -INVALID_BYTE + c - 48 + 52;
8758
+ result += (64 - c & c - 91) >>> 8 & -INVALID_BYTE + c - 65 + 0;
8759
+ result += (96 - c & c - 123) >>> 8 & -INVALID_BYTE + c - 97 + 26;
8760
+ return result;
8761
+ };
8762
+ Coder2.prototype._getPaddingLength = function(s) {
8763
+ var paddingLength = 0;
8764
+ if (this._paddingCharacter) {
8765
+ for (var i = s.length - 1; i >= 0; i--) {
8766
+ if (s[i] !== this._paddingCharacter) {
8767
+ break;
8768
+ }
8769
+ paddingLength++;
8770
+ }
8771
+ if (s.length < 4 || paddingLength > 2) {
8772
+ throw new Error("Base64Coder: incorrect padding");
8773
+ }
8774
+ }
8775
+ return paddingLength;
8776
+ };
8777
+ return Coder2;
8778
+ }()
8779
+ );
8780
+ exports.Coder = Coder;
8781
+ var stdCoder = new Coder();
8782
+ function encode2(data) {
8783
+ return stdCoder.encode(data);
8784
+ }
8785
+ exports.encode = encode2;
8786
+ function decode2(s) {
8787
+ return stdCoder.decode(s);
8788
+ }
8789
+ exports.decode = decode2;
8790
+ var URLSafeCoder = (
8791
+ /** @class */
8792
+ function(_super) {
8793
+ __extends(URLSafeCoder2, _super);
8794
+ function URLSafeCoder2() {
8795
+ return _super !== null && _super.apply(this, arguments) || this;
8796
+ }
8797
+ URLSafeCoder2.prototype._encodeByte = function(b) {
8798
+ var result = b;
8799
+ result += 65;
8800
+ result += 25 - b >>> 8 & 0 - 65 - 26 + 97;
8801
+ result += 51 - b >>> 8 & 26 - 97 - 52 + 48;
8802
+ result += 61 - b >>> 8 & 52 - 48 - 62 + 45;
8803
+ result += 62 - b >>> 8 & 62 - 45 - 63 + 95;
8804
+ return String.fromCharCode(result);
8805
+ };
8806
+ URLSafeCoder2.prototype._decodeChar = function(c) {
8807
+ var result = INVALID_BYTE;
8808
+ result += (44 - c & c - 46) >>> 8 & -INVALID_BYTE + c - 45 + 62;
8809
+ result += (94 - c & c - 96) >>> 8 & -INVALID_BYTE + c - 95 + 63;
8810
+ result += (47 - c & c - 58) >>> 8 & -INVALID_BYTE + c - 48 + 52;
8811
+ result += (64 - c & c - 91) >>> 8 & -INVALID_BYTE + c - 65 + 0;
8812
+ result += (96 - c & c - 123) >>> 8 & -INVALID_BYTE + c - 97 + 26;
8813
+ return result;
8814
+ };
8815
+ return URLSafeCoder2;
8816
+ }(Coder)
8817
+ );
8818
+ exports.URLSafeCoder = URLSafeCoder;
8819
+ var urlSafeCoder = new URLSafeCoder();
8820
+ function encodeURLSafe(data) {
8821
+ return urlSafeCoder.encode(data);
8822
+ }
8823
+ exports.encodeURLSafe = encodeURLSafe;
8824
+ function decodeURLSafe(s) {
8825
+ return urlSafeCoder.decode(s);
8826
+ }
8827
+ exports.decodeURLSafe = decodeURLSafe;
8828
+ exports.encodedLength = function(length) {
8829
+ return stdCoder.encodedLength(length);
8830
+ };
8831
+ exports.maxDecodedLength = function(length) {
8832
+ return stdCoder.maxDecodedLength(length);
8833
+ };
8834
+ exports.decodedLength = function(s) {
8835
+ return stdCoder.decodedLength(s);
8836
+ };
8837
+ }
8838
+ });
8839
+
8840
+ // ../../node_modules/fast-sha256/sha256.js
8841
+ var require_sha256 = __commonJS({
8842
+ "../../node_modules/fast-sha256/sha256.js"(exports, module) {
8843
+ (function(root, factory) {
8844
+ var exports2 = {};
8845
+ factory(exports2);
8846
+ var sha2562 = exports2["default"];
8847
+ for (var k in exports2) {
8848
+ sha2562[k] = exports2[k];
8849
+ }
8850
+ if (typeof module === "object" && typeof module.exports === "object") {
8851
+ module.exports = sha2562;
8852
+ } else if (typeof define === "function" && define.amd) {
8853
+ define(function() {
8854
+ return sha2562;
8855
+ });
8856
+ } else {
8857
+ root.sha256 = sha2562;
8858
+ }
8859
+ })(exports, function(exports2) {
8860
+ exports2.__esModule = true;
8861
+ exports2.digestLength = 32;
8862
+ exports2.blockSize = 64;
8863
+ var K = new Uint32Array([
8864
+ 1116352408,
8865
+ 1899447441,
8866
+ 3049323471,
8867
+ 3921009573,
8868
+ 961987163,
8869
+ 1508970993,
8870
+ 2453635748,
8871
+ 2870763221,
8872
+ 3624381080,
8873
+ 310598401,
8874
+ 607225278,
8875
+ 1426881987,
8876
+ 1925078388,
8877
+ 2162078206,
8878
+ 2614888103,
8879
+ 3248222580,
8880
+ 3835390401,
8881
+ 4022224774,
8882
+ 264347078,
8883
+ 604807628,
8884
+ 770255983,
8885
+ 1249150122,
8886
+ 1555081692,
8887
+ 1996064986,
8888
+ 2554220882,
8889
+ 2821834349,
8890
+ 2952996808,
8891
+ 3210313671,
8892
+ 3336571891,
8893
+ 3584528711,
8894
+ 113926993,
8895
+ 338241895,
8896
+ 666307205,
8897
+ 773529912,
8898
+ 1294757372,
8899
+ 1396182291,
8900
+ 1695183700,
8901
+ 1986661051,
8902
+ 2177026350,
8903
+ 2456956037,
8904
+ 2730485921,
8905
+ 2820302411,
8906
+ 3259730800,
8907
+ 3345764771,
8908
+ 3516065817,
8909
+ 3600352804,
8910
+ 4094571909,
8911
+ 275423344,
8912
+ 430227734,
8913
+ 506948616,
8914
+ 659060556,
8915
+ 883997877,
8916
+ 958139571,
8917
+ 1322822218,
8918
+ 1537002063,
8919
+ 1747873779,
8920
+ 1955562222,
8921
+ 2024104815,
8922
+ 2227730452,
8923
+ 2361852424,
8924
+ 2428436474,
8925
+ 2756734187,
8926
+ 3204031479,
8927
+ 3329325298
8928
+ ]);
8929
+ function hashBlocks(w, v, p, pos, len) {
8930
+ var a, b, c, d, e, f, g, h, u, i, j, t1, t2;
8931
+ while (len >= 64) {
8932
+ a = v[0];
8933
+ b = v[1];
8934
+ c = v[2];
8935
+ d = v[3];
8936
+ e = v[4];
8937
+ f = v[5];
8938
+ g = v[6];
8939
+ h = v[7];
8940
+ for (i = 0; i < 16; i++) {
8941
+ j = pos + i * 4;
8942
+ w[i] = (p[j] & 255) << 24 | (p[j + 1] & 255) << 16 | (p[j + 2] & 255) << 8 | p[j + 3] & 255;
8943
+ }
8944
+ for (i = 16; i < 64; i++) {
8945
+ u = w[i - 2];
8946
+ t1 = (u >>> 17 | u << 32 - 17) ^ (u >>> 19 | u << 32 - 19) ^ u >>> 10;
8947
+ u = w[i - 15];
8948
+ t2 = (u >>> 7 | u << 32 - 7) ^ (u >>> 18 | u << 32 - 18) ^ u >>> 3;
8949
+ w[i] = (t1 + w[i - 7] | 0) + (t2 + w[i - 16] | 0);
8950
+ }
8951
+ for (i = 0; i < 64; i++) {
8952
+ t1 = (((e >>> 6 | e << 32 - 6) ^ (e >>> 11 | e << 32 - 11) ^ (e >>> 25 | e << 32 - 25)) + (e & f ^ ~e & g) | 0) + (h + (K[i] + w[i] | 0) | 0) | 0;
8953
+ t2 = ((a >>> 2 | a << 32 - 2) ^ (a >>> 13 | a << 32 - 13) ^ (a >>> 22 | a << 32 - 22)) + (a & b ^ a & c ^ b & c) | 0;
8954
+ h = g;
8955
+ g = f;
8956
+ f = e;
8957
+ e = d + t1 | 0;
8958
+ d = c;
8959
+ c = b;
8960
+ b = a;
8961
+ a = t1 + t2 | 0;
8962
+ }
8963
+ v[0] += a;
8964
+ v[1] += b;
8965
+ v[2] += c;
8966
+ v[3] += d;
8967
+ v[4] += e;
8968
+ v[5] += f;
8969
+ v[6] += g;
8970
+ v[7] += h;
8971
+ pos += 64;
8972
+ len -= 64;
8973
+ }
8974
+ return pos;
8975
+ }
8976
+ var Hash = (
8977
+ /** @class */
8978
+ function() {
8979
+ function Hash2() {
8980
+ this.digestLength = exports2.digestLength;
8981
+ this.blockSize = exports2.blockSize;
8982
+ this.state = new Int32Array(8);
8983
+ this.temp = new Int32Array(64);
8984
+ this.buffer = new Uint8Array(128);
8985
+ this.bufferLength = 0;
8986
+ this.bytesHashed = 0;
8987
+ this.finished = false;
8988
+ this.reset();
8989
+ }
8990
+ Hash2.prototype.reset = function() {
8991
+ this.state[0] = 1779033703;
8992
+ this.state[1] = 3144134277;
8993
+ this.state[2] = 1013904242;
8994
+ this.state[3] = 2773480762;
8995
+ this.state[4] = 1359893119;
8996
+ this.state[5] = 2600822924;
8997
+ this.state[6] = 528734635;
8998
+ this.state[7] = 1541459225;
8999
+ this.bufferLength = 0;
9000
+ this.bytesHashed = 0;
9001
+ this.finished = false;
9002
+ return this;
9003
+ };
9004
+ Hash2.prototype.clean = function() {
9005
+ for (var i = 0; i < this.buffer.length; i++) {
9006
+ this.buffer[i] = 0;
9007
+ }
9008
+ for (var i = 0; i < this.temp.length; i++) {
9009
+ this.temp[i] = 0;
9010
+ }
9011
+ this.reset();
9012
+ };
9013
+ Hash2.prototype.update = function(data, dataLength) {
9014
+ if (dataLength === void 0) {
9015
+ dataLength = data.length;
9016
+ }
9017
+ if (this.finished) {
9018
+ throw new Error("SHA256: can't update because hash was finished.");
9019
+ }
9020
+ var dataPos = 0;
9021
+ this.bytesHashed += dataLength;
9022
+ if (this.bufferLength > 0) {
9023
+ while (this.bufferLength < 64 && dataLength > 0) {
9024
+ this.buffer[this.bufferLength++] = data[dataPos++];
9025
+ dataLength--;
9026
+ }
9027
+ if (this.bufferLength === 64) {
9028
+ hashBlocks(this.temp, this.state, this.buffer, 0, 64);
9029
+ this.bufferLength = 0;
9030
+ }
9031
+ }
9032
+ if (dataLength >= 64) {
9033
+ dataPos = hashBlocks(this.temp, this.state, data, dataPos, dataLength);
9034
+ dataLength %= 64;
9035
+ }
9036
+ while (dataLength > 0) {
9037
+ this.buffer[this.bufferLength++] = data[dataPos++];
9038
+ dataLength--;
9039
+ }
9040
+ return this;
9041
+ };
9042
+ Hash2.prototype.finish = function(out) {
9043
+ if (!this.finished) {
9044
+ var bytesHashed = this.bytesHashed;
9045
+ var left = this.bufferLength;
9046
+ var bitLenHi = bytesHashed / 536870912 | 0;
9047
+ var bitLenLo = bytesHashed << 3;
9048
+ var padLength = bytesHashed % 64 < 56 ? 64 : 128;
9049
+ this.buffer[left] = 128;
9050
+ for (var i = left + 1; i < padLength - 8; i++) {
9051
+ this.buffer[i] = 0;
9052
+ }
9053
+ this.buffer[padLength - 8] = bitLenHi >>> 24 & 255;
9054
+ this.buffer[padLength - 7] = bitLenHi >>> 16 & 255;
9055
+ this.buffer[padLength - 6] = bitLenHi >>> 8 & 255;
9056
+ this.buffer[padLength - 5] = bitLenHi >>> 0 & 255;
9057
+ this.buffer[padLength - 4] = bitLenLo >>> 24 & 255;
9058
+ this.buffer[padLength - 3] = bitLenLo >>> 16 & 255;
9059
+ this.buffer[padLength - 2] = bitLenLo >>> 8 & 255;
9060
+ this.buffer[padLength - 1] = bitLenLo >>> 0 & 255;
9061
+ hashBlocks(this.temp, this.state, this.buffer, 0, padLength);
9062
+ this.finished = true;
9063
+ }
9064
+ for (var i = 0; i < 8; i++) {
9065
+ out[i * 4 + 0] = this.state[i] >>> 24 & 255;
9066
+ out[i * 4 + 1] = this.state[i] >>> 16 & 255;
9067
+ out[i * 4 + 2] = this.state[i] >>> 8 & 255;
9068
+ out[i * 4 + 3] = this.state[i] >>> 0 & 255;
9069
+ }
9070
+ return this;
9071
+ };
9072
+ Hash2.prototype.digest = function() {
9073
+ var out = new Uint8Array(this.digestLength);
9074
+ this.finish(out);
9075
+ return out;
9076
+ };
9077
+ Hash2.prototype._saveState = function(out) {
9078
+ for (var i = 0; i < this.state.length; i++) {
9079
+ out[i] = this.state[i];
9080
+ }
9081
+ };
9082
+ Hash2.prototype._restoreState = function(from, bytesHashed) {
9083
+ for (var i = 0; i < this.state.length; i++) {
9084
+ this.state[i] = from[i];
9085
+ }
9086
+ this.bytesHashed = bytesHashed;
9087
+ this.finished = false;
9088
+ this.bufferLength = 0;
9089
+ };
9090
+ return Hash2;
9091
+ }()
9092
+ );
9093
+ exports2.Hash = Hash;
9094
+ var HMAC = (
9095
+ /** @class */
9096
+ function() {
9097
+ function HMAC2(key) {
9098
+ this.inner = new Hash();
9099
+ this.outer = new Hash();
9100
+ this.blockSize = this.inner.blockSize;
9101
+ this.digestLength = this.inner.digestLength;
9102
+ var pad = new Uint8Array(this.blockSize);
9103
+ if (key.length > this.blockSize) {
9104
+ new Hash().update(key).finish(pad).clean();
9105
+ } else {
9106
+ for (var i = 0; i < key.length; i++) {
9107
+ pad[i] = key[i];
9108
+ }
9109
+ }
9110
+ for (var i = 0; i < pad.length; i++) {
9111
+ pad[i] ^= 54;
9112
+ }
9113
+ this.inner.update(pad);
9114
+ for (var i = 0; i < pad.length; i++) {
9115
+ pad[i] ^= 54 ^ 92;
9116
+ }
9117
+ this.outer.update(pad);
9118
+ this.istate = new Uint32Array(8);
9119
+ this.ostate = new Uint32Array(8);
9120
+ this.inner._saveState(this.istate);
9121
+ this.outer._saveState(this.ostate);
9122
+ for (var i = 0; i < pad.length; i++) {
9123
+ pad[i] = 0;
9124
+ }
9125
+ }
9126
+ HMAC2.prototype.reset = function() {
9127
+ this.inner._restoreState(this.istate, this.inner.blockSize);
9128
+ this.outer._restoreState(this.ostate, this.outer.blockSize);
9129
+ return this;
9130
+ };
9131
+ HMAC2.prototype.clean = function() {
9132
+ for (var i = 0; i < this.istate.length; i++) {
9133
+ this.ostate[i] = this.istate[i] = 0;
9134
+ }
9135
+ this.inner.clean();
9136
+ this.outer.clean();
9137
+ };
9138
+ HMAC2.prototype.update = function(data) {
9139
+ this.inner.update(data);
9140
+ return this;
9141
+ };
9142
+ HMAC2.prototype.finish = function(out) {
9143
+ if (this.outer.finished) {
9144
+ this.outer.finish(out);
9145
+ } else {
9146
+ this.inner.finish(out);
9147
+ this.outer.update(out, this.digestLength).finish(out);
9148
+ }
9149
+ return this;
9150
+ };
9151
+ HMAC2.prototype.digest = function() {
9152
+ var out = new Uint8Array(this.digestLength);
9153
+ this.finish(out);
9154
+ return out;
9155
+ };
9156
+ return HMAC2;
9157
+ }()
9158
+ );
9159
+ exports2.HMAC = HMAC;
9160
+ function hash(data) {
9161
+ var h = new Hash().update(data);
9162
+ var digest = h.digest();
9163
+ h.clean();
9164
+ return digest;
9165
+ }
9166
+ exports2.hash = hash;
9167
+ exports2["default"] = hash;
9168
+ function hmac2(key, data) {
9169
+ var h = new HMAC(key).update(data);
9170
+ var digest = h.digest();
9171
+ h.clean();
9172
+ return digest;
9173
+ }
9174
+ exports2.hmac = hmac2;
9175
+ function fillBuffer(buffer, hmac3, info, counter) {
9176
+ var num = counter[0];
9177
+ if (num === 0) {
9178
+ throw new Error("hkdf: cannot expand more");
9179
+ }
9180
+ hmac3.reset();
9181
+ if (num > 1) {
9182
+ hmac3.update(buffer);
9183
+ }
9184
+ if (info) {
9185
+ hmac3.update(info);
9186
+ }
9187
+ hmac3.update(counter);
9188
+ hmac3.finish(buffer);
9189
+ counter[0]++;
9190
+ }
9191
+ var hkdfSalt = new Uint8Array(exports2.digestLength);
9192
+ function hkdf(key, salt, info, length) {
9193
+ if (salt === void 0) {
9194
+ salt = hkdfSalt;
9195
+ }
9196
+ if (length === void 0) {
9197
+ length = 32;
9198
+ }
9199
+ var counter = new Uint8Array([1]);
9200
+ var okm = hmac2(salt, key);
9201
+ var hmac_ = new HMAC(okm);
9202
+ var buffer = new Uint8Array(hmac_.digestLength);
9203
+ var bufpos = buffer.length;
9204
+ var out = new Uint8Array(length);
9205
+ for (var i = 0; i < length; i++) {
9206
+ if (bufpos === buffer.length) {
9207
+ fillBuffer(buffer, hmac_, info, counter);
9208
+ bufpos = 0;
9209
+ }
9210
+ out[i] = buffer[bufpos++];
9211
+ }
9212
+ hmac_.clean();
9213
+ buffer.fill(0);
9214
+ counter.fill(0);
9215
+ return out;
9216
+ }
9217
+ exports2.hkdf = hkdf;
9218
+ function pbkdf2(password, salt, iterations, dkLen) {
9219
+ var prf = new HMAC(password);
9220
+ var len = prf.digestLength;
9221
+ var ctr = new Uint8Array(4);
9222
+ var t = new Uint8Array(len);
9223
+ var u = new Uint8Array(len);
9224
+ var dk = new Uint8Array(dkLen);
9225
+ for (var i = 0; i * len < dkLen; i++) {
9226
+ var c = i + 1;
9227
+ ctr[0] = c >>> 24 & 255;
9228
+ ctr[1] = c >>> 16 & 255;
9229
+ ctr[2] = c >>> 8 & 255;
9230
+ ctr[3] = c >>> 0 & 255;
9231
+ prf.reset();
9232
+ prf.update(salt);
9233
+ prf.update(ctr);
9234
+ prf.finish(u);
9235
+ for (var j = 0; j < len; j++) {
9236
+ t[j] = u[j];
9237
+ }
9238
+ for (var j = 2; j <= iterations; j++) {
9239
+ prf.reset();
9240
+ prf.update(u).finish(u);
9241
+ for (var k = 0; k < len; k++) {
9242
+ t[k] ^= u[k];
9243
+ }
9244
+ }
9245
+ for (var j = 0; j < len && i * len + j < dkLen; j++) {
9246
+ dk[i * len + j] = t[j];
9247
+ }
9248
+ }
9249
+ for (var i = 0; i < len; i++) {
9250
+ t[i] = u[i] = 0;
9251
+ }
9252
+ for (var i = 0; i < 4; i++) {
9253
+ ctr[i] = 0;
9254
+ }
9255
+ prf.clean();
9256
+ return dk;
9257
+ }
9258
+ exports2.pbkdf2 = pbkdf2;
9259
+ });
9260
+ }
9261
+ });
9262
+
9263
+ // src/webhook/vendor/standardwebhook.ts
9264
+ __toESM(require_base64());
9265
+ __toESM(require_sha256());
9266
+ /**
9267
+ * The MIT License
9268
+ *
9269
+ * Copyright (c) 2023 Svix (https://www.svix.com)
9270
+ *
9271
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
9272
+ * of this software and associated documentation files (the "Software"), to deal
9273
+ * in the Software without restriction, including without limitation the rights
9274
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9275
+ * copies of the Software, and to permit persons to whom the Software is
9276
+ * furnished to do so, subject to the following conditions:
9277
+ *
9278
+ * The above copyright notice and this permission notice shall be included in
9279
+ * all copies or substantial portions of the Software.
9280
+ *
9281
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
9282
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
9283
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
9284
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
9285
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
9286
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
9287
+ * THE SOFTWARE.
9288
+ *
9289
+ * @fileoverview Server-only webhook verification implementation.
9290
+ * @description Vendored from standardwebhooks package to avoid bundling issues.
9291
+ * Uses Node.js crypto module - DO NOT import in client/browser code.
9292
+ * @license MIT
9293
+ * @internal
9294
+ */
9295
+
9296
+ // src/webhook/webhook.ts
7937
9297
  async function handleWebhookPayload(payload, config, context) {
7938
9298
  const callHandler = (handler, payload2) => {
7939
9299
  if (!handler) return;
@@ -7990,9 +9350,6 @@ async function handleWebhookPayload(payload, config, context) {
7990
9350
  if (payload.type === "subscription.renewed") {
7991
9351
  await callHandler(config.onSubscriptionRenewed, payload);
7992
9352
  }
7993
- if (payload.type === "subscription.paused") {
7994
- await callHandler(config.onSubscriptionPaused, payload);
7995
- }
7996
9353
  if (payload.type === "subscription.plan_changed") {
7997
9354
  await callHandler(config.onSubscriptionPlanChanged, payload);
7998
9355
  }
@@ -8011,6 +9368,30 @@ async function handleWebhookPayload(payload, config, context) {
8011
9368
  if (payload.type === "license_key.created") {
8012
9369
  await callHandler(config.onLicenseKeyCreated, payload);
8013
9370
  }
9371
+ if (payload.type === "credit.added") {
9372
+ await callHandler(config.onCreditAdded, payload);
9373
+ }
9374
+ if (payload.type === "credit.deducted") {
9375
+ await callHandler(config.onCreditDeducted, payload);
9376
+ }
9377
+ if (payload.type === "credit.expired") {
9378
+ await callHandler(config.onCreditExpired, payload);
9379
+ }
9380
+ if (payload.type === "credit.rolled_over") {
9381
+ await callHandler(config.onCreditRolledOver, payload);
9382
+ }
9383
+ if (payload.type === "credit.rollover_forfeited") {
9384
+ await callHandler(config.onCreditRolloverForfeited, payload);
9385
+ }
9386
+ if (payload.type === "credit.overage_charged") {
9387
+ await callHandler(config.onCreditOverageCharged, payload);
9388
+ }
9389
+ if (payload.type === "credit.manual_adjustment") {
9390
+ await callHandler(config.onCreditManualAdjustment, payload);
9391
+ }
9392
+ if (payload.type === "credit.balance_low") {
9393
+ await callHandler(config.onCreditBalanceLow, payload);
9394
+ }
8014
9395
  }
8015
9396
 
8016
9397
  const Webhooks = ({ webhookKey, ...eventHandlers }) => {
@@ -8060,14 +9441,19 @@ const CustomerPortal = ({ bearerToken, environment, }) => {
8060
9441
  const getHandler = async (request, reply) => {
8061
9442
  // Extract customerId from query parameters
8062
9443
  const { customer_id: customerId, send_email } = request.query;
8063
- const params = {
8064
- send_email: false,
8065
- };
8066
- const sendEmail = Boolean(send_email);
8067
- if (sendEmail) {
8068
- params.send_email = sendEmail;
8069
- }
8070
- if (!customerId) {
9444
+ // Normalize customer_id to string (handle array case)
9445
+ const customerIdValue = customerId
9446
+ ? Array.isArray(customerId)
9447
+ ? customerId[0]
9448
+ : customerId
9449
+ : undefined;
9450
+ const params = {};
9451
+ if (send_email !== undefined) {
9452
+ // Normalize to string (handle array case)
9453
+ const sendEmailValue = Array.isArray(send_email) ? send_email[0] : send_email;
9454
+ params.send_email = sendEmailValue === "true";
9455
+ }
9456
+ if (!customerIdValue) {
8071
9457
  return reply.status(400).send("Missing customerId in query parameters");
8072
9458
  }
8073
9459
  const dodopayments = new DodoPayments({
@@ -8075,7 +9461,7 @@ const CustomerPortal = ({ bearerToken, environment, }) => {
8075
9461
  environment,
8076
9462
  });
8077
9463
  try {
8078
- const session = await dodopayments.customers.customerPortal.create(customerId, params);
9464
+ const session = await dodopayments.customers.customerPortal.create(customerIdValue, params);
8079
9465
  return reply.redirect(session.link);
8080
9466
  }
8081
9467
  catch (error) {