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