@usethrottle/checkout-sdk 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,51 @@
1
1
  # @usethrottle/checkout-sdk
2
2
 
3
+ ## 1.4.0
4
+
5
+ ### Minor Changes
6
+
7
+ - c10acce: Add `checkout.cancelSession(sessionId)` to cancel an in-flight checkout session
8
+ (`DELETE /api/v1/checkout/sessions/{id}`). Idempotent; a completed session
9
+ returns `422 already_completed`. The server endpoint previously no-op'd — it now
10
+ marks the session `cancelled` and re-opens an associated cart still in
11
+ `checkout` status (never a terminal `converted` cart).
12
+ - c4bbad5: Stop silently ignoring `allowedMethods` on the payment-only embed.
13
+
14
+ `POST /api/v1/checkout-sessions/embed-token` now rejects `allowedMethods` with
15
+ `400 allowed_methods_unsupported` instead of accepting it and rendering all
16
+ connection-configured methods anyway (a payment-only Gr4vy embed cannot restrict
17
+ methods — the embed token has no method-restriction field). `allowedMethods`
18
+ still filters the full hosted checkout.
19
+ - `@usethrottle/checkout-sdk`: `CreateEmbedTokenInput` no longer includes
20
+ `allowedMethods` (`createSession` still accepts it for full checkout).
21
+ - `@usethrottle/api-client`: regenerated — the embed-token request body no longer
22
+ documents `allowedMethods`.
23
+
24
+ ### Patch Changes
25
+
26
+ - Updated dependencies [b6336a0]
27
+ - @usethrottle/checkout-react@1.2.0
28
+
29
+ ## 1.3.0
30
+
31
+ ### Minor Changes
32
+
33
+ - Unify SDK error classes under a single shared `ThrottleError` from the new
34
+ `@usethrottle/errors` package.
35
+
36
+ Every Throttle SDK previously threw its own structurally-identical error class
37
+ (`ThrottleApiError`, `ThrottleCheckoutError`, `ThrottleDiscountsError`,
38
+ `ThrottleSubscriptionsError`), so catching across two packages meant catching
39
+ two names. Each of those classes now **extends** the shared `ThrottleError`,
40
+ and every SDK re-exports `ThrottleError` + `isThrottleError`. A single
41
+ `catch (e) { if (e instanceof ThrottleError) … }` now handles errors from all
42
+ SDKs.
43
+
44
+ Backward compatible: the original class names are unchanged subclasses, so
45
+ `instanceof ThrottleApiError` / `instanceof ThrottleCheckoutError` keep working,
46
+ and `@usethrottle/cart`'s `ThrottleApiError.details` stays typed as
47
+ `Record<string, unknown>`.
48
+
3
49
  ## 1.2.0
4
50
 
5
51
  ### Minor Changes
package/README.md CHANGED
@@ -85,7 +85,7 @@ const nextCursor = ordersPage.pagination?.cursor;
85
85
  | ----------------------------- | --------------------------------------------- | --------------------------------------------------------- |
86
86
  | `createSession(input)` | `POST /api/v1/checkout/sessions` | Creates a cart-backed hosted/embed checkout session. |
87
87
  | `completeSession(id, input)` | `POST /api/v1/checkout/sessions/:id/complete` | Completes a checkout session from server-side proxy mode. |
88
- | `createEmbedToken(input)` | `POST /api/v1/checkout-sessions/embed-token` | Mints a Gr4vy Embed token for proxy-mode card capture. |
88
+ | `createEmbedToken(input)` | `POST /api/v1/checkout-sessions/embed-token` | Mints an embed token for proxy-mode card capture. |
89
89
  | `getOrder(id)` | `GET /api/v1/orders/:id` | Reads public-safe order totals/status. |
90
90
  | `listOrders(options)` | `GET /api/v1/orders` | Lists public-safe orders with optional filters. |
91
91
  | `listOrderPayments(id)` | `GET /api/v1/orders/:id/payments` | Lists payments for an order. |
package/dist/index.cjs CHANGED
@@ -20,7 +20,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
- ThrottleCheckout: () => ThrottleCheckout
23
+ ThrottleCheckout: () => ThrottleCheckout,
24
+ ThrottleError: () => import_errors.ThrottleError,
25
+ isThrottleError: () => import_errors.isThrottleError
24
26
  });
25
27
  module.exports = __toCommonJS(index_exports);
26
28
 
@@ -92,8 +94,13 @@ function ThrottleCheckout({
92
94
  }
93
95
  );
94
96
  }
97
+
98
+ // src/index.ts
99
+ var import_errors = require("@usethrottle/errors");
95
100
  // Annotate the CommonJS export names for ESM import in node:
96
101
  0 && (module.exports = {
97
- ThrottleCheckout
102
+ ThrottleCheckout,
103
+ ThrottleError,
104
+ isThrottleError
98
105
  });
99
106
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/ThrottleCheckout.tsx"],"sourcesContent":["export { ThrottleCheckout } from './ThrottleCheckout.js';\nexport type { BrandTheme, TelemetryEvent, ThrottleCheckoutProps } from './types.js';\n","import { useCallback, useEffect, useRef } from 'react';\nimport { PaymentEmbed } from '@usethrottle/checkout-react';\nimport type { ThrottleCheckoutProps, TelemetryEvent } from './types.js';\n\n/**\n * ThrottleCheckout — Phase 1 platform SDK wrapper.\n *\n * Wraps `<PaymentEmbed>` from `@usethrottle/checkout-react` and adds:\n * 1. Idempotency — settledRef ensures `onSucceeded` / `onFailed` fire at most once\n * per component lifetime, even if the iframe sends duplicate events.\n * 2. Telemetry — `onTelemetry` callback receives every lifecycle event with a\n * typed payload so workspaces can pipe to Datadog / Segment / etc.\n * 3. Brand theming — `theme.primary` + `theme.logo` are forwarded to the underlying\n * `<PaymentEmbed>` which appends them as URL query params on the\n * hosted checkout iframe src.\n */\nexport function ThrottleCheckout({\n sessionId,\n parentOrigin = '',\n baseUrl,\n theme,\n onSucceeded,\n onFailed,\n onCancelled,\n onTelemetry,\n}: ThrottleCheckoutProps): JSX.Element {\n // Idempotency guard — once a terminal event (success or failure) fires,\n // all subsequent duplicate events from the iframe are silently dropped.\n const settledRef = useRef(false);\n\n const emit = useCallback(\n (event: TelemetryEvent) => {\n onTelemetry?.(event);\n },\n [onTelemetry],\n );\n\n // Fire \"mounted\" telemetry once on initial render.\n useEffect(() => {\n emit({ type: 'mounted', sessionId, timestamp: Date.now() });\n // intentionally only on mount — sessionId identity change re-mounts anyway\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleReady = useCallback(() => {\n emit({ type: 'ready', sessionId, timestamp: Date.now() });\n }, [emit, sessionId]);\n\n const handleProcessing = useCallback(() => {\n emit({ type: 'processing', sessionId, timestamp: Date.now() });\n }, [emit, sessionId]);\n\n const handleSucceeded = useCallback(\n ({ orderId, paymentId }: { orderId: string; paymentId: string }) => {\n if (settledRef.current) return;\n settledRef.current = true;\n emit({ type: 'succeeded', sessionId, orderId, paymentId, timestamp: Date.now() });\n onSucceeded?.({ orderId, paymentId });\n },\n [emit, sessionId, onSucceeded],\n );\n\n const handleFailed = useCallback(\n ({ code, message }: { code: string; message: string }) => {\n if (settledRef.current) return;\n settledRef.current = true;\n emit({ type: 'failed', sessionId, code, message, timestamp: Date.now() });\n onFailed?.({ code, message });\n },\n [emit, sessionId, onFailed],\n );\n\n const handleCanceled = useCallback(() => {\n emit({ type: 'cancelled', sessionId, timestamp: Date.now() });\n onCancelled?.();\n }, [emit, sessionId, onCancelled]);\n\n return (\n <PaymentEmbed\n sessionId={sessionId}\n parentOrigin={parentOrigin}\n {...(baseUrl !== undefined ? { baseUrl } : {})}\n primary={theme?.primary}\n logo={theme?.logo}\n onReady={handleReady}\n onProcessing={handleProcessing}\n onSucceeded={handleSucceeded}\n onFailed={handleFailed}\n onCanceled={handleCanceled}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAA+C;AAC/C,4BAA6B;AA6EzB;AA9DG,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuC;AAGrC,QAAM,iBAAa,qBAAO,KAAK;AAE/B,QAAM,WAAO;AAAA,IACX,CAAC,UAA0B;AACzB,oBAAc,KAAK;AAAA,IACrB;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAGA,8BAAU,MAAM;AACd,SAAK,EAAE,MAAM,WAAW,WAAW,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,EAG5D,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAc,0BAAY,MAAM;AACpC,SAAK,EAAE,MAAM,SAAS,WAAW,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,EAC1D,GAAG,CAAC,MAAM,SAAS,CAAC;AAEpB,QAAM,uBAAmB,0BAAY,MAAM;AACzC,SAAK,EAAE,MAAM,cAAc,WAAW,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,EAC/D,GAAG,CAAC,MAAM,SAAS,CAAC;AAEpB,QAAM,sBAAkB;AAAA,IACtB,CAAC,EAAE,SAAS,UAAU,MAA8C;AAClE,UAAI,WAAW,QAAS;AACxB,iBAAW,UAAU;AACrB,WAAK,EAAE,MAAM,aAAa,WAAW,SAAS,WAAW,WAAW,KAAK,IAAI,EAAE,CAAC;AAChF,oBAAc,EAAE,SAAS,UAAU,CAAC;AAAA,IACtC;AAAA,IACA,CAAC,MAAM,WAAW,WAAW;AAAA,EAC/B;AAEA,QAAM,mBAAe;AAAA,IACnB,CAAC,EAAE,MAAM,QAAQ,MAAyC;AACxD,UAAI,WAAW,QAAS;AACxB,iBAAW,UAAU;AACrB,WAAK,EAAE,MAAM,UAAU,WAAW,MAAM,SAAS,WAAW,KAAK,IAAI,EAAE,CAAC;AACxE,iBAAW,EAAE,MAAM,QAAQ,CAAC;AAAA,IAC9B;AAAA,IACA,CAAC,MAAM,WAAW,QAAQ;AAAA,EAC5B;AAEA,QAAM,qBAAiB,0BAAY,MAAM;AACvC,SAAK,EAAE,MAAM,aAAa,WAAW,WAAW,KAAK,IAAI,EAAE,CAAC;AAC5D,kBAAc;AAAA,EAChB,GAAG,CAAC,MAAM,WAAW,WAAW,CAAC;AAEjC,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACC,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC5C,SAAS,OAAO;AAAA,MAChB,MAAM,OAAO;AAAA,MACb,SAAS;AAAA,MACT,cAAc;AAAA,MACd,aAAa;AAAA,MACb,UAAU;AAAA,MACV,YAAY;AAAA;AAAA,EACd;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/ThrottleCheckout.tsx"],"sourcesContent":["export { ThrottleCheckout } from './ThrottleCheckout.js';\nexport { ThrottleError, isThrottleError } from '@usethrottle/errors';\nexport type { BrandTheme, TelemetryEvent, ThrottleCheckoutProps } from './types.js';\n","import { useCallback, useEffect, useRef } from 'react';\nimport { PaymentEmbed } from '@usethrottle/checkout-react';\nimport type { ThrottleCheckoutProps, TelemetryEvent } from './types.js';\n\n/**\n * ThrottleCheckout — Phase 1 platform SDK wrapper.\n *\n * Wraps `<PaymentEmbed>` from `@usethrottle/checkout-react` and adds:\n * 1. Idempotency — settledRef ensures `onSucceeded` / `onFailed` fire at most once\n * per component lifetime, even if the iframe sends duplicate events.\n * 2. Telemetry — `onTelemetry` callback receives every lifecycle event with a\n * typed payload so workspaces can pipe to Datadog / Segment / etc.\n * 3. Brand theming — `theme.primary` + `theme.logo` are forwarded to the underlying\n * `<PaymentEmbed>` which appends them as URL query params on the\n * hosted checkout iframe src.\n */\nexport function ThrottleCheckout({\n sessionId,\n parentOrigin = '',\n baseUrl,\n theme,\n onSucceeded,\n onFailed,\n onCancelled,\n onTelemetry,\n}: ThrottleCheckoutProps): JSX.Element {\n // Idempotency guard — once a terminal event (success or failure) fires,\n // all subsequent duplicate events from the iframe are silently dropped.\n const settledRef = useRef(false);\n\n const emit = useCallback(\n (event: TelemetryEvent) => {\n onTelemetry?.(event);\n },\n [onTelemetry],\n );\n\n // Fire \"mounted\" telemetry once on initial render.\n useEffect(() => {\n emit({ type: 'mounted', sessionId, timestamp: Date.now() });\n // intentionally only on mount — sessionId identity change re-mounts anyway\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleReady = useCallback(() => {\n emit({ type: 'ready', sessionId, timestamp: Date.now() });\n }, [emit, sessionId]);\n\n const handleProcessing = useCallback(() => {\n emit({ type: 'processing', sessionId, timestamp: Date.now() });\n }, [emit, sessionId]);\n\n const handleSucceeded = useCallback(\n ({ orderId, paymentId }: { orderId: string; paymentId: string }) => {\n if (settledRef.current) return;\n settledRef.current = true;\n emit({ type: 'succeeded', sessionId, orderId, paymentId, timestamp: Date.now() });\n onSucceeded?.({ orderId, paymentId });\n },\n [emit, sessionId, onSucceeded],\n );\n\n const handleFailed = useCallback(\n ({ code, message }: { code: string; message: string }) => {\n if (settledRef.current) return;\n settledRef.current = true;\n emit({ type: 'failed', sessionId, code, message, timestamp: Date.now() });\n onFailed?.({ code, message });\n },\n [emit, sessionId, onFailed],\n );\n\n const handleCanceled = useCallback(() => {\n emit({ type: 'cancelled', sessionId, timestamp: Date.now() });\n onCancelled?.();\n }, [emit, sessionId, onCancelled]);\n\n return (\n <PaymentEmbed\n sessionId={sessionId}\n parentOrigin={parentOrigin}\n {...(baseUrl !== undefined ? { baseUrl } : {})}\n primary={theme?.primary}\n logo={theme?.logo}\n onReady={handleReady}\n onProcessing={handleProcessing}\n onSucceeded={handleSucceeded}\n onFailed={handleFailed}\n onCanceled={handleCanceled}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAA+C;AAC/C,4BAA6B;AA6EzB;AA9DG,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuC;AAGrC,QAAM,iBAAa,qBAAO,KAAK;AAE/B,QAAM,WAAO;AAAA,IACX,CAAC,UAA0B;AACzB,oBAAc,KAAK;AAAA,IACrB;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAGA,8BAAU,MAAM;AACd,SAAK,EAAE,MAAM,WAAW,WAAW,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,EAG5D,GAAG,CAAC,CAAC;AAEL,QAAM,kBAAc,0BAAY,MAAM;AACpC,SAAK,EAAE,MAAM,SAAS,WAAW,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,EAC1D,GAAG,CAAC,MAAM,SAAS,CAAC;AAEpB,QAAM,uBAAmB,0BAAY,MAAM;AACzC,SAAK,EAAE,MAAM,cAAc,WAAW,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,EAC/D,GAAG,CAAC,MAAM,SAAS,CAAC;AAEpB,QAAM,sBAAkB;AAAA,IACtB,CAAC,EAAE,SAAS,UAAU,MAA8C;AAClE,UAAI,WAAW,QAAS;AACxB,iBAAW,UAAU;AACrB,WAAK,EAAE,MAAM,aAAa,WAAW,SAAS,WAAW,WAAW,KAAK,IAAI,EAAE,CAAC;AAChF,oBAAc,EAAE,SAAS,UAAU,CAAC;AAAA,IACtC;AAAA,IACA,CAAC,MAAM,WAAW,WAAW;AAAA,EAC/B;AAEA,QAAM,mBAAe;AAAA,IACnB,CAAC,EAAE,MAAM,QAAQ,MAAyC;AACxD,UAAI,WAAW,QAAS;AACxB,iBAAW,UAAU;AACrB,WAAK,EAAE,MAAM,UAAU,WAAW,MAAM,SAAS,WAAW,KAAK,IAAI,EAAE,CAAC;AACxE,iBAAW,EAAE,MAAM,QAAQ,CAAC;AAAA,IAC9B;AAAA,IACA,CAAC,MAAM,WAAW,QAAQ;AAAA,EAC5B;AAEA,QAAM,qBAAiB,0BAAY,MAAM;AACvC,SAAK,EAAE,MAAM,aAAa,WAAW,WAAW,KAAK,IAAI,EAAE,CAAC;AAC5D,kBAAc;AAAA,EAChB,GAAG,CAAC,MAAM,WAAW,WAAW,CAAC;AAEjC,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACC,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC5C,SAAS,OAAO;AAAA,MAChB,MAAM,OAAO;AAAA,MACb,SAAS;AAAA,MACT,cAAc;AAAA,MACd,aAAa;AAAA,MACb,UAAU;AAAA,MACV,YAAY;AAAA;AAAA,EACd;AAEJ;;;AD1FA,oBAA+C;","names":[]}
package/dist/index.d.cts CHANGED
@@ -1,3 +1,5 @@
1
+ export { ThrottleError, isThrottleError } from '@usethrottle/errors';
2
+
1
3
  /**
2
4
  * @usethrottle/checkout-sdk — Phase 1 types.
3
5
  */
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ export { ThrottleError, isThrottleError } from '@usethrottle/errors';
2
+
1
3
  /**
2
4
  * @usethrottle/checkout-sdk — Phase 1 types.
3
5
  */
package/dist/index.js CHANGED
@@ -66,7 +66,12 @@ function ThrottleCheckout({
66
66
  }
67
67
  );
68
68
  }
69
+
70
+ // src/index.ts
71
+ import { ThrottleError, isThrottleError } from "@usethrottle/errors";
69
72
  export {
70
- ThrottleCheckout
73
+ ThrottleCheckout,
74
+ ThrottleError,
75
+ isThrottleError
71
76
  };
72
77
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ThrottleCheckout.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nimport { PaymentEmbed } from '@usethrottle/checkout-react';\nimport type { ThrottleCheckoutProps, TelemetryEvent } from './types.js';\n\n/**\n * ThrottleCheckout — Phase 1 platform SDK wrapper.\n *\n * Wraps `<PaymentEmbed>` from `@usethrottle/checkout-react` and adds:\n * 1. Idempotency — settledRef ensures `onSucceeded` / `onFailed` fire at most once\n * per component lifetime, even if the iframe sends duplicate events.\n * 2. Telemetry — `onTelemetry` callback receives every lifecycle event with a\n * typed payload so workspaces can pipe to Datadog / Segment / etc.\n * 3. Brand theming — `theme.primary` + `theme.logo` are forwarded to the underlying\n * `<PaymentEmbed>` which appends them as URL query params on the\n * hosted checkout iframe src.\n */\nexport function ThrottleCheckout({\n sessionId,\n parentOrigin = '',\n baseUrl,\n theme,\n onSucceeded,\n onFailed,\n onCancelled,\n onTelemetry,\n}: ThrottleCheckoutProps): JSX.Element {\n // Idempotency guard — once a terminal event (success or failure) fires,\n // all subsequent duplicate events from the iframe are silently dropped.\n const settledRef = useRef(false);\n\n const emit = useCallback(\n (event: TelemetryEvent) => {\n onTelemetry?.(event);\n },\n [onTelemetry],\n );\n\n // Fire \"mounted\" telemetry once on initial render.\n useEffect(() => {\n emit({ type: 'mounted', sessionId, timestamp: Date.now() });\n // intentionally only on mount — sessionId identity change re-mounts anyway\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleReady = useCallback(() => {\n emit({ type: 'ready', sessionId, timestamp: Date.now() });\n }, [emit, sessionId]);\n\n const handleProcessing = useCallback(() => {\n emit({ type: 'processing', sessionId, timestamp: Date.now() });\n }, [emit, sessionId]);\n\n const handleSucceeded = useCallback(\n ({ orderId, paymentId }: { orderId: string; paymentId: string }) => {\n if (settledRef.current) return;\n settledRef.current = true;\n emit({ type: 'succeeded', sessionId, orderId, paymentId, timestamp: Date.now() });\n onSucceeded?.({ orderId, paymentId });\n },\n [emit, sessionId, onSucceeded],\n );\n\n const handleFailed = useCallback(\n ({ code, message }: { code: string; message: string }) => {\n if (settledRef.current) return;\n settledRef.current = true;\n emit({ type: 'failed', sessionId, code, message, timestamp: Date.now() });\n onFailed?.({ code, message });\n },\n [emit, sessionId, onFailed],\n );\n\n const handleCanceled = useCallback(() => {\n emit({ type: 'cancelled', sessionId, timestamp: Date.now() });\n onCancelled?.();\n }, [emit, sessionId, onCancelled]);\n\n return (\n <PaymentEmbed\n sessionId={sessionId}\n parentOrigin={parentOrigin}\n {...(baseUrl !== undefined ? { baseUrl } : {})}\n primary={theme?.primary}\n logo={theme?.logo}\n onReady={handleReady}\n onProcessing={handleProcessing}\n onSucceeded={handleSucceeded}\n onFailed={handleFailed}\n onCanceled={handleCanceled}\n />\n );\n}\n"],"mappings":";AAAA,SAAS,aAAa,WAAW,cAAc;AAC/C,SAAS,oBAAoB;AA6EzB;AA9DG,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuC;AAGrC,QAAM,aAAa,OAAO,KAAK;AAE/B,QAAM,OAAO;AAAA,IACX,CAAC,UAA0B;AACzB,oBAAc,KAAK;AAAA,IACrB;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAGA,YAAU,MAAM;AACd,SAAK,EAAE,MAAM,WAAW,WAAW,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,EAG5D,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,YAAY,MAAM;AACpC,SAAK,EAAE,MAAM,SAAS,WAAW,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,EAC1D,GAAG,CAAC,MAAM,SAAS,CAAC;AAEpB,QAAM,mBAAmB,YAAY,MAAM;AACzC,SAAK,EAAE,MAAM,cAAc,WAAW,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,EAC/D,GAAG,CAAC,MAAM,SAAS,CAAC;AAEpB,QAAM,kBAAkB;AAAA,IACtB,CAAC,EAAE,SAAS,UAAU,MAA8C;AAClE,UAAI,WAAW,QAAS;AACxB,iBAAW,UAAU;AACrB,WAAK,EAAE,MAAM,aAAa,WAAW,SAAS,WAAW,WAAW,KAAK,IAAI,EAAE,CAAC;AAChF,oBAAc,EAAE,SAAS,UAAU,CAAC;AAAA,IACtC;AAAA,IACA,CAAC,MAAM,WAAW,WAAW;AAAA,EAC/B;AAEA,QAAM,eAAe;AAAA,IACnB,CAAC,EAAE,MAAM,QAAQ,MAAyC;AACxD,UAAI,WAAW,QAAS;AACxB,iBAAW,UAAU;AACrB,WAAK,EAAE,MAAM,UAAU,WAAW,MAAM,SAAS,WAAW,KAAK,IAAI,EAAE,CAAC;AACxE,iBAAW,EAAE,MAAM,QAAQ,CAAC;AAAA,IAC9B;AAAA,IACA,CAAC,MAAM,WAAW,QAAQ;AAAA,EAC5B;AAEA,QAAM,iBAAiB,YAAY,MAAM;AACvC,SAAK,EAAE,MAAM,aAAa,WAAW,WAAW,KAAK,IAAI,EAAE,CAAC;AAC5D,kBAAc;AAAA,EAChB,GAAG,CAAC,MAAM,WAAW,WAAW,CAAC;AAEjC,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACC,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC5C,SAAS,OAAO;AAAA,MAChB,MAAM,OAAO;AAAA,MACb,SAAS;AAAA,MACT,cAAc;AAAA,MACd,aAAa;AAAA,MACb,UAAU;AAAA,MACV,YAAY;AAAA;AAAA,EACd;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../src/ThrottleCheckout.tsx","../src/index.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nimport { PaymentEmbed } from '@usethrottle/checkout-react';\nimport type { ThrottleCheckoutProps, TelemetryEvent } from './types.js';\n\n/**\n * ThrottleCheckout — Phase 1 platform SDK wrapper.\n *\n * Wraps `<PaymentEmbed>` from `@usethrottle/checkout-react` and adds:\n * 1. Idempotency — settledRef ensures `onSucceeded` / `onFailed` fire at most once\n * per component lifetime, even if the iframe sends duplicate events.\n * 2. Telemetry — `onTelemetry` callback receives every lifecycle event with a\n * typed payload so workspaces can pipe to Datadog / Segment / etc.\n * 3. Brand theming — `theme.primary` + `theme.logo` are forwarded to the underlying\n * `<PaymentEmbed>` which appends them as URL query params on the\n * hosted checkout iframe src.\n */\nexport function ThrottleCheckout({\n sessionId,\n parentOrigin = '',\n baseUrl,\n theme,\n onSucceeded,\n onFailed,\n onCancelled,\n onTelemetry,\n}: ThrottleCheckoutProps): JSX.Element {\n // Idempotency guard — once a terminal event (success or failure) fires,\n // all subsequent duplicate events from the iframe are silently dropped.\n const settledRef = useRef(false);\n\n const emit = useCallback(\n (event: TelemetryEvent) => {\n onTelemetry?.(event);\n },\n [onTelemetry],\n );\n\n // Fire \"mounted\" telemetry once on initial render.\n useEffect(() => {\n emit({ type: 'mounted', sessionId, timestamp: Date.now() });\n // intentionally only on mount — sessionId identity change re-mounts anyway\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleReady = useCallback(() => {\n emit({ type: 'ready', sessionId, timestamp: Date.now() });\n }, [emit, sessionId]);\n\n const handleProcessing = useCallback(() => {\n emit({ type: 'processing', sessionId, timestamp: Date.now() });\n }, [emit, sessionId]);\n\n const handleSucceeded = useCallback(\n ({ orderId, paymentId }: { orderId: string; paymentId: string }) => {\n if (settledRef.current) return;\n settledRef.current = true;\n emit({ type: 'succeeded', sessionId, orderId, paymentId, timestamp: Date.now() });\n onSucceeded?.({ orderId, paymentId });\n },\n [emit, sessionId, onSucceeded],\n );\n\n const handleFailed = useCallback(\n ({ code, message }: { code: string; message: string }) => {\n if (settledRef.current) return;\n settledRef.current = true;\n emit({ type: 'failed', sessionId, code, message, timestamp: Date.now() });\n onFailed?.({ code, message });\n },\n [emit, sessionId, onFailed],\n );\n\n const handleCanceled = useCallback(() => {\n emit({ type: 'cancelled', sessionId, timestamp: Date.now() });\n onCancelled?.();\n }, [emit, sessionId, onCancelled]);\n\n return (\n <PaymentEmbed\n sessionId={sessionId}\n parentOrigin={parentOrigin}\n {...(baseUrl !== undefined ? { baseUrl } : {})}\n primary={theme?.primary}\n logo={theme?.logo}\n onReady={handleReady}\n onProcessing={handleProcessing}\n onSucceeded={handleSucceeded}\n onFailed={handleFailed}\n onCanceled={handleCanceled}\n />\n );\n}\n","export { ThrottleCheckout } from './ThrottleCheckout.js';\nexport { ThrottleError, isThrottleError } from '@usethrottle/errors';\nexport type { BrandTheme, TelemetryEvent, ThrottleCheckoutProps } from './types.js';\n"],"mappings":";AAAA,SAAS,aAAa,WAAW,cAAc;AAC/C,SAAS,oBAAoB;AA6EzB;AA9DG,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuC;AAGrC,QAAM,aAAa,OAAO,KAAK;AAE/B,QAAM,OAAO;AAAA,IACX,CAAC,UAA0B;AACzB,oBAAc,KAAK;AAAA,IACrB;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAGA,YAAU,MAAM;AACd,SAAK,EAAE,MAAM,WAAW,WAAW,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,EAG5D,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,YAAY,MAAM;AACpC,SAAK,EAAE,MAAM,SAAS,WAAW,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,EAC1D,GAAG,CAAC,MAAM,SAAS,CAAC;AAEpB,QAAM,mBAAmB,YAAY,MAAM;AACzC,SAAK,EAAE,MAAM,cAAc,WAAW,WAAW,KAAK,IAAI,EAAE,CAAC;AAAA,EAC/D,GAAG,CAAC,MAAM,SAAS,CAAC;AAEpB,QAAM,kBAAkB;AAAA,IACtB,CAAC,EAAE,SAAS,UAAU,MAA8C;AAClE,UAAI,WAAW,QAAS;AACxB,iBAAW,UAAU;AACrB,WAAK,EAAE,MAAM,aAAa,WAAW,SAAS,WAAW,WAAW,KAAK,IAAI,EAAE,CAAC;AAChF,oBAAc,EAAE,SAAS,UAAU,CAAC;AAAA,IACtC;AAAA,IACA,CAAC,MAAM,WAAW,WAAW;AAAA,EAC/B;AAEA,QAAM,eAAe;AAAA,IACnB,CAAC,EAAE,MAAM,QAAQ,MAAyC;AACxD,UAAI,WAAW,QAAS;AACxB,iBAAW,UAAU;AACrB,WAAK,EAAE,MAAM,UAAU,WAAW,MAAM,SAAS,WAAW,KAAK,IAAI,EAAE,CAAC;AACxE,iBAAW,EAAE,MAAM,QAAQ,CAAC;AAAA,IAC9B;AAAA,IACA,CAAC,MAAM,WAAW,QAAQ;AAAA,EAC5B;AAEA,QAAM,iBAAiB,YAAY,MAAM;AACvC,SAAK,EAAE,MAAM,aAAa,WAAW,WAAW,KAAK,IAAI,EAAE,CAAC;AAC5D,kBAAc;AAAA,EAChB,GAAG,CAAC,MAAM,WAAW,WAAW,CAAC;AAEjC,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACC,GAAI,YAAY,SAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,MAC5C,SAAS,OAAO;AAAA,MAChB,MAAM,OAAO;AAAA,MACb,SAAS;AAAA,MACT,cAAc;AAAA,MACd,aAAa;AAAA,MACb,UAAU;AAAA,MACV,YAAY;AAAA;AAAA,EACd;AAEJ;;;AC1FA,SAAS,eAAe,uBAAuB;","names":[]}
package/dist/server.cjs CHANGED
@@ -22,19 +22,19 @@ var server_exports = {};
22
22
  __export(server_exports, {
23
23
  CheckoutClient: () => CheckoutClient,
24
24
  ThrottleCheckoutError: () => ThrottleCheckoutError,
25
+ ThrottleError: () => import_errors2.ThrottleError,
25
26
  buildCheckoutEmbedUrl: () => buildCheckoutEmbedUrl,
26
27
  buildCheckoutHostedUrl: () => buildCheckoutHostedUrl,
27
- createCheckoutClient: () => createCheckoutClient
28
+ createCheckoutClient: () => createCheckoutClient,
29
+ isThrottleError: () => import_errors2.isThrottleError
28
30
  });
29
31
  module.exports = __toCommonJS(server_exports);
30
- var ThrottleCheckoutError = class extends Error {
32
+ var import_errors = require("@usethrottle/errors");
33
+ var import_errors2 = require("@usethrottle/errors");
34
+ var ThrottleCheckoutError = class extends import_errors.ThrottleError {
31
35
  constructor(args) {
32
- super(args.message);
36
+ super(args);
33
37
  this.name = "ThrottleCheckoutError";
34
- this.code = args.code;
35
- this.statusCode = args.statusCode;
36
- this.details = args.details;
37
- this.body = args.body;
38
38
  }
39
39
  };
40
40
  var CheckoutClient = class {
@@ -95,6 +95,17 @@ var CheckoutClient = class {
95
95
  );
96
96
  return normalizeCompleteResult(data);
97
97
  }
98
+ /**
99
+ * Cancel an in-flight checkout session (e.g. the buyer abandoned the embed).
100
+ * Idempotent — cancelling an already-cancelled session is a no-op; a completed
101
+ * session cannot be cancelled (the API returns 422 `already_completed`).
102
+ */
103
+ async cancelSession(sessionId) {
104
+ await this.request(
105
+ "DELETE",
106
+ `/api/v1/checkout/sessions/${encodeURIComponent(sessionId)}`
107
+ );
108
+ }
98
109
  async createEmbedToken(input) {
99
110
  const data = await this.request("POST", "/api/v1/checkout-sessions/embed-token", input);
100
111
  return normalizeEmbedToken(data);
@@ -280,8 +291,10 @@ function objectOrUndefined(value) {
280
291
  0 && (module.exports = {
281
292
  CheckoutClient,
282
293
  ThrottleCheckoutError,
294
+ ThrottleError,
283
295
  buildCheckoutEmbedUrl,
284
296
  buildCheckoutHostedUrl,
285
- createCheckoutClient
297
+ createCheckoutClient,
298
+ isThrottleError
286
299
  });
287
300
  //# sourceMappingURL=server.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.ts"],"sourcesContent":["export type PaymentMethod = 'net30' | 'card' | 'gr4vy';\nexport type SubscriptionInterval = 'weekly' | 'monthly' | 'quarterly' | 'yearly';\nexport type CheckoutEmbedMode = 'checkout-full' | 'payment-only';\nexport type CheckoutEmbedRoute = 'c' | 's';\n\nexport interface CheckoutClientOptions {\n apiKey: string;\n baseUrl?: string;\n fetch?: typeof globalThis.fetch;\n timeoutMs?: number;\n}\n\nexport interface CheckoutAddress {\n firstName: string;\n lastName: string;\n company?: string;\n addressLine1: string;\n addressLine2?: string;\n city: string;\n stateProvince: string;\n postalCode: string;\n countryCode: string;\n phone?: string;\n}\n\nexport interface CheckoutCustomerAddressInput {\n firstName?: string;\n lastName?: string;\n phone?: string;\n addressLine1?: string;\n addressLine2?: string;\n city?: string;\n state?: string;\n postalCode?: string;\n country?: string;\n}\n\nexport interface CheckoutCustomerInput {\n customerId?: string;\n externalCustomerId?: string;\n email?: string;\n firstName?: string;\n lastName?: string;\n phone?: string;\n shippingAddress?: CheckoutCustomerAddressInput;\n billingAddress?: CheckoutCustomerAddressInput;\n metadata?: Record<string, unknown>;\n}\n\nexport interface RecurringIntentInput {\n plan: string;\n interval: SubscriptionInterval;\n amount?: number;\n trialDays?: number;\n planName?: string;\n create?: 'auto' | 'manual';\n}\n\nexport interface CheckoutCollectInput {\n shippingAddress?: boolean;\n billingAddress?: boolean;\n}\n\nexport interface CheckoutPaymentTermsInput {\n netN?: number | null;\n}\n\nexport interface CreateCheckoutSessionInput {\n applicationId: string;\n cartId?: string;\n externalCartId?: string;\n customerEmail?: string;\n customer?: CheckoutCustomerInput;\n returnUrl: string;\n cancelUrl: string;\n allowedMethods?: string[];\n paymentTerms?: CheckoutPaymentTermsInput;\n recurring?: RecurringIntentInput;\n collect?: CheckoutCollectInput;\n metadata?: Record<string, unknown>;\n discountCode?: string;\n}\n\nexport interface CheckoutSession {\n sessionId: string;\n id?: string;\n checkoutUrl?: string;\n hostedUrl?: string;\n embedUrl?: string;\n embedToken?: string;\n expiresAt?: string;\n [key: string]: unknown;\n}\n\nexport interface Net30Acceptance {\n termsHash: string;\n acceptedAt: string;\n companyName: string;\n billingEmail: string;\n}\n\nexport interface CompleteCheckoutSessionInput {\n email?: string;\n shippingAddress?: CheckoutAddress;\n billingAddress?: CheckoutAddress;\n billingSameAsShipping?: boolean;\n paymentMethod: PaymentMethod;\n netDays?: number;\n termsAccepted?: boolean;\n termsSnapshot?: string;\n invoiceNumber?: string;\n net30Acceptance?: Net30Acceptance;\n paymentToken?: string;\n gr4vyCheckoutSessionId?: string;\n gr4vyTransactionId?: string;\n}\n\nexport interface CompleteCheckoutSessionResult {\n orderId: string;\n orderNumber?: string;\n paymentId?: string;\n total?: number;\n currency?: string;\n status?: string;\n paymentStatus?: string;\n [key: string]: unknown;\n}\n\nexport interface CreateEmbedTokenInput {\n externalCartId?: string;\n amount: number;\n currency: string;\n country?: string;\n allowedMethods?: string[];\n}\n\nexport interface CreateEmbedTokenResult {\n embedToken: string;\n checkoutSessionId: string;\n amount: number;\n currency: string;\n hostedUrl?: string;\n embedUrl?: string;\n gr4vyId?: string;\n merchantAccountId?: string;\n [key: string]: unknown;\n}\n\nexport interface CheckoutOrder {\n id: string;\n orderNumber?: string;\n status: string;\n paymentStatus: string | null;\n currency: string;\n subtotal: number;\n taxTotal: number;\n shippingTotal: number;\n total: number;\n metadata?: Record<string, unknown>;\n payments?: CheckoutPayment[];\n [key: string]: unknown;\n}\n\nexport interface ListOrdersOptions {\n customerId?: string;\n cursor?: string;\n limit?: number;\n status?: string;\n paymentStatus?: string;\n}\n\nexport interface PaginatedOrders {\n data: CheckoutOrder[];\n pagination?: {\n cursor: string | null;\n hasMore: boolean;\n };\n}\n\nexport interface CheckoutPayment {\n id: string;\n orderId?: string;\n processor?: string;\n processorTransactionId?: string | null;\n amount?: number;\n currency?: string;\n status?: string;\n method?: string;\n createdAt?: string;\n transactions?: CheckoutPaymentTransaction[];\n [key: string]: unknown;\n}\n\nexport interface CheckoutPaymentTransaction {\n id: string;\n paymentId?: string;\n type?: string;\n amount?: number;\n currency?: string;\n status?: string;\n createdAt?: string;\n [key: string]: unknown;\n}\n\nexport interface BuildCheckoutUrlOptions {\n checkoutOrigin?: string;\n sessionId: string;\n parentOrigin?: string;\n mode?: CheckoutEmbedMode;\n route?: CheckoutEmbedRoute;\n primary?: string;\n logo?: string;\n}\n\nexport interface ThrottleEnvelope<T> {\n data?: T;\n meta?: Record<string, unknown>;\n error?: {\n code?: string;\n message?: string;\n details?: unknown;\n };\n}\n\nexport class ThrottleCheckoutError extends Error {\n readonly code: string;\n readonly statusCode: number;\n readonly details?: unknown;\n readonly body?: unknown;\n\n constructor(args: {\n code: string;\n message: string;\n statusCode: number;\n details?: unknown;\n body?: unknown;\n }) {\n super(args.message);\n this.name = 'ThrottleCheckoutError';\n this.code = args.code;\n this.statusCode = args.statusCode;\n this.details = args.details;\n this.body = args.body;\n }\n}\n\nexport class CheckoutClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof globalThis.fetch;\n private readonly timeoutMs: number;\n\n constructor(opts: CheckoutClientOptions) {\n if (!opts.apiKey) throw new Error('CheckoutClient: apiKey is required');\n const fetchImpl = opts.fetch ?? globalThis.fetch;\n if (!fetchImpl) throw new Error('CheckoutClient: fetch is required');\n this.apiKey = opts.apiKey;\n this.baseUrl = (opts.baseUrl ?? 'https://api.usethrottle.dev').replace(/\\/+$/, '');\n this.fetchImpl = fetchImpl;\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n }\n\n async request<T = unknown>(method: string, path: string, body?: unknown): Promise<T> {\n const envelope = await this.requestEnvelope<T>(method, path, body);\n if (Object.prototype.hasOwnProperty.call(envelope, 'data')) {\n return envelope.data as T;\n }\n return envelope as T;\n }\n\n async requestEnvelope<T = unknown>(\n method: string,\n path: string,\n body?: unknown,\n ): Promise<ThrottleEnvelope<T>> {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n\n try {\n const res = await this.fetchImpl(toAbsoluteUrl(this.baseUrl, path), {\n method,\n headers: {\n 'content-type': 'application/json',\n 'x-api-key': this.apiKey,\n },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: ctrl.signal,\n });\n\n if (res.status === 204) return { data: undefined as T };\n\n const json = (await res.json().catch(() => ({}))) as ThrottleEnvelope<T>;\n if (!res.ok) {\n throw new ThrottleCheckoutError({\n code: json.error?.code ?? 'unknown_error',\n message: json.error?.message ?? `HTTP ${res.status}`,\n statusCode: res.status,\n details: json.error?.details,\n body: json,\n });\n }\n return json;\n } finally {\n clearTimeout(timer);\n }\n }\n\n async createSession(input: CreateCheckoutSessionInput): Promise<CheckoutSession> {\n const data = await this.request<unknown>('POST', '/api/v1/checkout/sessions', input);\n return normalizeCheckoutSession(data);\n }\n\n async completeSession(\n sessionId: string,\n input: CompleteCheckoutSessionInput,\n ): Promise<CompleteCheckoutSessionResult> {\n const data = await this.request<unknown>(\n 'POST',\n `/api/v1/checkout/sessions/${encodeURIComponent(sessionId)}/complete`,\n input,\n );\n return normalizeCompleteResult(data);\n }\n\n async createEmbedToken(input: CreateEmbedTokenInput): Promise<CreateEmbedTokenResult> {\n const data = await this.request<unknown>('POST', '/api/v1/checkout-sessions/embed-token', input);\n return normalizeEmbedToken(data);\n }\n\n async getOrder(orderId: string): Promise<CheckoutOrder> {\n const data = await this.request<unknown>('GET', `/api/v1/orders/${encodeURIComponent(orderId)}`);\n return normalizeOrder(data);\n }\n\n async listOrders(options: ListOrdersOptions = {}): Promise<PaginatedOrders> {\n const params = new URLSearchParams();\n if (options.customerId) params.set('customerId', options.customerId);\n if (options.cursor) params.set('cursor', options.cursor);\n if (options.limit !== undefined) params.set('limit', String(options.limit));\n if (options.status) params.set('status', options.status);\n if (options.paymentStatus) params.set('paymentStatus', options.paymentStatus);\n\n const query = params.toString();\n const envelope = await this.requestEnvelope<unknown[]>(\n 'GET',\n `/api/v1/orders${query ? `?${query}` : ''}`,\n );\n return {\n data: (envelope.data ?? []).map(normalizeOrder),\n pagination: envelope.meta?.pagination as PaginatedOrders['pagination'],\n };\n }\n\n async listOrderPayments(orderId: string): Promise<CheckoutPayment[]> {\n const data = await this.request<unknown[]>(\n 'GET',\n `/api/v1/orders/${encodeURIComponent(orderId)}/payments`,\n );\n return (data ?? []).map(normalizePayment);\n }\n\n async listPaymentTransactions(paymentId: string): Promise<CheckoutPaymentTransaction[]> {\n const data = await this.request<unknown[]>(\n 'GET',\n `/api/v1/payments/${encodeURIComponent(paymentId)}/transactions`,\n );\n return (data ?? []).map(normalizeTransaction);\n }\n\n async getOrderWithPayments(orderId: string): Promise<CheckoutOrder> {\n const order = await this.getOrder(orderId);\n const payments = await this.listOrderPayments(orderId);\n return {\n ...order,\n payments: await Promise.all(\n payments.map(async (payment) => ({\n ...payment,\n transactions: payment.id ? await this.listPaymentTransactions(payment.id) : [],\n })),\n ),\n };\n }\n}\n\nexport function createCheckoutClient(opts: CheckoutClientOptions): CheckoutClient {\n return new CheckoutClient(opts);\n}\n\nexport function buildCheckoutHostedUrl(options: BuildCheckoutUrlOptions): string {\n const route = options.route ?? 's';\n const base = (options.checkoutOrigin ?? 'https://checkout.usethrottle.dev').replace(/\\/+$/, '');\n return `${base}/${route}/${encodeURIComponent(options.sessionId)}`;\n}\n\nexport function buildCheckoutEmbedUrl(options: BuildCheckoutUrlOptions): string {\n const baseUrl = buildCheckoutHostedUrl({\n checkoutOrigin: options.checkoutOrigin,\n sessionId: options.sessionId,\n route: options.route ?? 'c',\n });\n const params = new URLSearchParams({\n embed: '1',\n mode: options.mode ?? 'payment-only',\n ...(options.parentOrigin ? { parentOrigin: options.parentOrigin.replace(/\\/+$/, '') } : {}),\n });\n if (options.primary) params.set('primary', options.primary);\n if (options.logo) params.set('logo', options.logo);\n return `${baseUrl}?${params.toString()}`;\n}\n\nfunction toAbsoluteUrl(baseUrl: string, path: string): string {\n if (/^https?:\\/\\//i.test(path)) return path;\n return `${baseUrl}${path.startsWith('/') ? path : `/${path}`}`;\n}\n\nfunction normalizeCheckoutSession(raw: any): CheckoutSession {\n const sessionId = raw?.sessionId ?? raw?.id;\n return {\n ...withoutSnakeKeys(raw),\n id: optionalString(raw?.id) ?? undefined,\n sessionId: requiredString(sessionId, 'checkoutSession.sessionId'),\n checkoutUrl: optionalString(raw?.checkoutUrl) ?? undefined,\n hostedUrl: optionalString(raw?.hostedUrl) ?? undefined,\n embedUrl: optionalString(raw?.embedUrl) ?? undefined,\n embedToken: optionalString(raw?.embedToken) ?? undefined,\n expiresAt: optionalString(raw?.expiresAt) ?? undefined,\n };\n}\n\nfunction normalizeCompleteResult(raw: any): CompleteCheckoutSessionResult {\n const orderId = raw?.orderId ?? raw?.id;\n return {\n ...withoutSnakeKeys(raw),\n orderId: requiredString(orderId, 'checkoutComplete.orderId'),\n orderNumber: optionalString(raw?.orderNumber) ?? undefined,\n paymentId: optionalString(raw?.paymentId) ?? undefined,\n total: optionalNumber(raw?.total),\n currency: optionalString(raw?.currency) ?? undefined,\n status: optionalString(raw?.status) ?? undefined,\n paymentStatus: optionalString(raw?.paymentStatus) ?? undefined,\n };\n}\n\nfunction normalizeEmbedToken(raw: any): CreateEmbedTokenResult {\n return {\n ...withoutSnakeKeys(raw),\n embedToken: requiredString(raw?.embedToken, 'embedToken.embedToken'),\n checkoutSessionId: requiredString(raw?.checkoutSessionId, 'embedToken.checkoutSessionId'),\n amount: Number(raw?.amount ?? 0),\n currency: optionalString(raw?.currency) ?? 'USD',\n hostedUrl: optionalString(raw?.hostedUrl) ?? undefined,\n embedUrl: optionalString(raw?.embedUrl) ?? undefined,\n gr4vyId: optionalString(raw?.gr4vyId) ?? undefined,\n merchantAccountId: optionalString(raw?.merchantAccountId) ?? undefined,\n };\n}\n\nfunction normalizeOrder(raw: any): CheckoutOrder {\n return {\n ...withoutSnakeKeys(raw),\n id: requiredString(raw?.id, 'order.id'),\n orderNumber: optionalString(raw?.orderNumber) ?? undefined,\n status: optionalString(raw?.status) ?? 'processing',\n paymentStatus: optionalString(raw?.paymentStatus),\n currency: optionalString(raw?.currency) ?? 'USD',\n subtotal: Number(raw?.subtotal ?? 0),\n taxTotal: Number(raw?.taxTotal ?? 0),\n shippingTotal: Number(raw?.shippingTotal ?? 0),\n total: Number(raw?.total ?? 0),\n metadata: objectOrUndefined(raw?.metadata),\n payments: Array.isArray(raw?.payments) ? raw.payments.map(normalizePayment) : undefined,\n };\n}\n\nfunction normalizePayment(raw: any): CheckoutPayment {\n return {\n ...withoutSnakeKeys(raw),\n id: requiredString(raw?.id, 'payment.id'),\n orderId: optionalString(raw?.orderId) ?? undefined,\n processor: optionalString(raw?.processor) ?? undefined,\n processorTransactionId:\n optionalString(raw?.processorTransactionId) ?? undefined,\n amount: optionalNumber(raw?.amount),\n currency: optionalString(raw?.currency) ?? undefined,\n status: optionalString(raw?.status) ?? undefined,\n method: optionalString(raw?.method) ?? undefined,\n createdAt: optionalString(raw?.createdAt) ?? undefined,\n transactions: Array.isArray(raw?.transactions)\n ? raw.transactions.map(normalizeTransaction)\n : undefined,\n };\n}\n\nfunction normalizeTransaction(raw: any): CheckoutPaymentTransaction {\n return {\n ...withoutSnakeKeys(raw),\n id: requiredString(raw?.id, 'transaction.id'),\n paymentId: optionalString(raw?.paymentId) ?? undefined,\n type: optionalString(raw?.type) ?? undefined,\n amount: optionalNumber(raw?.amount),\n currency: optionalString(raw?.currency) ?? undefined,\n status: optionalString(raw?.status) ?? undefined,\n createdAt: optionalString(raw?.createdAt) ?? undefined,\n };\n}\n\nfunction withoutSnakeKeys(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return {};\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).filter(([key]) => !key.includes('_')),\n );\n}\n\nfunction requiredString(value: unknown, label: string): string {\n if (typeof value === 'string' && value.length > 0) return value;\n throw new Error(`Invalid Throttle response: missing ${label}`);\n}\n\nfunction optionalString(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction optionalNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction objectOrUndefined(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/server.ts"],"sourcesContent":["import { ThrottleError } from '@usethrottle/errors';\n\nexport type PaymentMethod = 'net30' | 'card' | 'gr4vy';\nexport type SubscriptionInterval = 'weekly' | 'monthly' | 'quarterly' | 'yearly';\nexport type CheckoutEmbedMode = 'checkout-full' | 'payment-only';\nexport type CheckoutEmbedRoute = 'c' | 's';\n\nexport interface CheckoutClientOptions {\n apiKey: string;\n baseUrl?: string;\n fetch?: typeof globalThis.fetch;\n timeoutMs?: number;\n}\n\nexport interface CheckoutAddress {\n firstName: string;\n lastName: string;\n company?: string;\n addressLine1: string;\n addressLine2?: string;\n city: string;\n stateProvince: string;\n postalCode: string;\n countryCode: string;\n phone?: string;\n}\n\nexport interface CheckoutCustomerAddressInput {\n firstName?: string;\n lastName?: string;\n phone?: string;\n addressLine1?: string;\n addressLine2?: string;\n city?: string;\n state?: string;\n postalCode?: string;\n country?: string;\n}\n\nexport interface CheckoutCustomerInput {\n customerId?: string;\n externalCustomerId?: string;\n email?: string;\n firstName?: string;\n lastName?: string;\n phone?: string;\n shippingAddress?: CheckoutCustomerAddressInput;\n billingAddress?: CheckoutCustomerAddressInput;\n metadata?: Record<string, unknown>;\n}\n\nexport interface RecurringIntentInput {\n plan: string;\n interval: SubscriptionInterval;\n amount?: number;\n trialDays?: number;\n planName?: string;\n create?: 'auto' | 'manual';\n}\n\nexport interface CheckoutCollectInput {\n shippingAddress?: boolean;\n billingAddress?: boolean;\n}\n\nexport interface CheckoutPaymentTermsInput {\n netN?: number | null;\n}\n\nexport interface CreateCheckoutSessionInput {\n applicationId: string;\n cartId?: string;\n externalCartId?: string;\n customerEmail?: string;\n customer?: CheckoutCustomerInput;\n returnUrl: string;\n cancelUrl: string;\n allowedMethods?: string[];\n paymentTerms?: CheckoutPaymentTermsInput;\n recurring?: RecurringIntentInput;\n collect?: CheckoutCollectInput;\n metadata?: Record<string, unknown>;\n discountCode?: string;\n}\n\nexport interface CheckoutSession {\n sessionId: string;\n id?: string;\n checkoutUrl?: string;\n hostedUrl?: string;\n embedUrl?: string;\n embedToken?: string;\n expiresAt?: string;\n [key: string]: unknown;\n}\n\nexport interface Net30Acceptance {\n termsHash: string;\n acceptedAt: string;\n companyName: string;\n billingEmail: string;\n}\n\nexport interface CompleteCheckoutSessionInput {\n email?: string;\n shippingAddress?: CheckoutAddress;\n billingAddress?: CheckoutAddress;\n billingSameAsShipping?: boolean;\n paymentMethod: PaymentMethod;\n netDays?: number;\n termsAccepted?: boolean;\n termsSnapshot?: string;\n invoiceNumber?: string;\n net30Acceptance?: Net30Acceptance;\n paymentToken?: string;\n gr4vyCheckoutSessionId?: string;\n gr4vyTransactionId?: string;\n}\n\nexport interface CompleteCheckoutSessionResult {\n orderId: string;\n orderNumber?: string;\n paymentId?: string;\n total?: number;\n currency?: string;\n status?: string;\n paymentStatus?: string;\n [key: string]: unknown;\n}\n\nexport interface CreateEmbedTokenInput {\n externalCartId?: string;\n amount: number;\n currency: string;\n country?: string;\n // NOTE: `allowedMethods` is intentionally NOT accepted here. A payment-only\n // Gr4vy embed cannot restrict payment methods (the Gr4vy widget renders the\n // methods configured on your Gr4vy connection). The server rejects it with\n // `allowed_methods_unsupported`. To restrict methods, configure the connection\n // or use the full hosted checkout, where allowedMethods filters the selection.\n}\n\nexport interface CreateEmbedTokenResult {\n embedToken: string;\n checkoutSessionId: string;\n amount: number;\n currency: string;\n hostedUrl?: string;\n embedUrl?: string;\n gr4vyId?: string;\n merchantAccountId?: string;\n [key: string]: unknown;\n}\n\nexport interface CheckoutOrder {\n id: string;\n orderNumber?: string;\n status: string;\n paymentStatus: string | null;\n currency: string;\n subtotal: number;\n taxTotal: number;\n shippingTotal: number;\n total: number;\n metadata?: Record<string, unknown>;\n payments?: CheckoutPayment[];\n [key: string]: unknown;\n}\n\nexport interface ListOrdersOptions {\n customerId?: string;\n cursor?: string;\n limit?: number;\n status?: string;\n paymentStatus?: string;\n}\n\nexport interface PaginatedOrders {\n data: CheckoutOrder[];\n pagination?: {\n cursor: string | null;\n hasMore: boolean;\n };\n}\n\nexport interface CheckoutPayment {\n id: string;\n orderId?: string;\n processor?: string;\n processorTransactionId?: string | null;\n amount?: number;\n currency?: string;\n status?: string;\n method?: string;\n createdAt?: string;\n transactions?: CheckoutPaymentTransaction[];\n [key: string]: unknown;\n}\n\nexport interface CheckoutPaymentTransaction {\n id: string;\n paymentId?: string;\n type?: string;\n amount?: number;\n currency?: string;\n status?: string;\n createdAt?: string;\n [key: string]: unknown;\n}\n\nexport interface BuildCheckoutUrlOptions {\n checkoutOrigin?: string;\n sessionId: string;\n parentOrigin?: string;\n mode?: CheckoutEmbedMode;\n route?: CheckoutEmbedRoute;\n primary?: string;\n logo?: string;\n}\n\nexport interface ThrottleEnvelope<T> {\n data?: T;\n meta?: Record<string, unknown>;\n error?: {\n code?: string;\n message?: string;\n details?: unknown;\n };\n}\n\n/**\n * Thrown on a non-2xx response from the Throttle Checkout API.\n *\n * Extends the shared {@link ThrottleError} so a single\n * `catch (e) { if (e instanceof ThrottleError) … }` covers errors from every\n * Throttle SDK. `instanceof ThrottleCheckoutError` keeps working for existing\n * code.\n */\nexport class ThrottleCheckoutError extends ThrottleError {\n constructor(args: {\n code: string;\n message: string;\n statusCode: number;\n details?: unknown;\n body?: unknown;\n }) {\n super(args);\n this.name = 'ThrottleCheckoutError';\n }\n}\n\nexport { ThrottleError, isThrottleError } from '@usethrottle/errors';\n\nexport class CheckoutClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof globalThis.fetch;\n private readonly timeoutMs: number;\n\n constructor(opts: CheckoutClientOptions) {\n if (!opts.apiKey) throw new Error('CheckoutClient: apiKey is required');\n const fetchImpl = opts.fetch ?? globalThis.fetch;\n if (!fetchImpl) throw new Error('CheckoutClient: fetch is required');\n this.apiKey = opts.apiKey;\n this.baseUrl = (opts.baseUrl ?? 'https://api.usethrottle.dev').replace(/\\/+$/, '');\n this.fetchImpl = fetchImpl;\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n }\n\n async request<T = unknown>(method: string, path: string, body?: unknown): Promise<T> {\n const envelope = await this.requestEnvelope<T>(method, path, body);\n if (Object.prototype.hasOwnProperty.call(envelope, 'data')) {\n return envelope.data as T;\n }\n return envelope as T;\n }\n\n async requestEnvelope<T = unknown>(\n method: string,\n path: string,\n body?: unknown,\n ): Promise<ThrottleEnvelope<T>> {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n\n try {\n const res = await this.fetchImpl(toAbsoluteUrl(this.baseUrl, path), {\n method,\n headers: {\n 'content-type': 'application/json',\n 'x-api-key': this.apiKey,\n },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: ctrl.signal,\n });\n\n if (res.status === 204) return { data: undefined as T };\n\n const json = (await res.json().catch(() => ({}))) as ThrottleEnvelope<T>;\n if (!res.ok) {\n throw new ThrottleCheckoutError({\n code: json.error?.code ?? 'unknown_error',\n message: json.error?.message ?? `HTTP ${res.status}`,\n statusCode: res.status,\n details: json.error?.details,\n body: json,\n });\n }\n return json;\n } finally {\n clearTimeout(timer);\n }\n }\n\n async createSession(input: CreateCheckoutSessionInput): Promise<CheckoutSession> {\n const data = await this.request<unknown>('POST', '/api/v1/checkout/sessions', input);\n return normalizeCheckoutSession(data);\n }\n\n async completeSession(\n sessionId: string,\n input: CompleteCheckoutSessionInput,\n ): Promise<CompleteCheckoutSessionResult> {\n const data = await this.request<unknown>(\n 'POST',\n `/api/v1/checkout/sessions/${encodeURIComponent(sessionId)}/complete`,\n input,\n );\n return normalizeCompleteResult(data);\n }\n\n /**\n * Cancel an in-flight checkout session (e.g. the buyer abandoned the embed).\n * Idempotent — cancelling an already-cancelled session is a no-op; a completed\n * session cannot be cancelled (the API returns 422 `already_completed`).\n */\n async cancelSession(sessionId: string): Promise<void> {\n await this.request<unknown>(\n 'DELETE',\n `/api/v1/checkout/sessions/${encodeURIComponent(sessionId)}`,\n );\n }\n\n async createEmbedToken(input: CreateEmbedTokenInput): Promise<CreateEmbedTokenResult> {\n const data = await this.request<unknown>('POST', '/api/v1/checkout-sessions/embed-token', input);\n return normalizeEmbedToken(data);\n }\n\n async getOrder(orderId: string): Promise<CheckoutOrder> {\n const data = await this.request<unknown>('GET', `/api/v1/orders/${encodeURIComponent(orderId)}`);\n return normalizeOrder(data);\n }\n\n async listOrders(options: ListOrdersOptions = {}): Promise<PaginatedOrders> {\n const params = new URLSearchParams();\n if (options.customerId) params.set('customerId', options.customerId);\n if (options.cursor) params.set('cursor', options.cursor);\n if (options.limit !== undefined) params.set('limit', String(options.limit));\n if (options.status) params.set('status', options.status);\n if (options.paymentStatus) params.set('paymentStatus', options.paymentStatus);\n\n const query = params.toString();\n const envelope = await this.requestEnvelope<unknown[]>(\n 'GET',\n `/api/v1/orders${query ? `?${query}` : ''}`,\n );\n return {\n data: (envelope.data ?? []).map(normalizeOrder),\n pagination: envelope.meta?.pagination as PaginatedOrders['pagination'],\n };\n }\n\n async listOrderPayments(orderId: string): Promise<CheckoutPayment[]> {\n const data = await this.request<unknown[]>(\n 'GET',\n `/api/v1/orders/${encodeURIComponent(orderId)}/payments`,\n );\n return (data ?? []).map(normalizePayment);\n }\n\n async listPaymentTransactions(paymentId: string): Promise<CheckoutPaymentTransaction[]> {\n const data = await this.request<unknown[]>(\n 'GET',\n `/api/v1/payments/${encodeURIComponent(paymentId)}/transactions`,\n );\n return (data ?? []).map(normalizeTransaction);\n }\n\n async getOrderWithPayments(orderId: string): Promise<CheckoutOrder> {\n const order = await this.getOrder(orderId);\n const payments = await this.listOrderPayments(orderId);\n return {\n ...order,\n payments: await Promise.all(\n payments.map(async (payment) => ({\n ...payment,\n transactions: payment.id ? await this.listPaymentTransactions(payment.id) : [],\n })),\n ),\n };\n }\n}\n\nexport function createCheckoutClient(opts: CheckoutClientOptions): CheckoutClient {\n return new CheckoutClient(opts);\n}\n\nexport function buildCheckoutHostedUrl(options: BuildCheckoutUrlOptions): string {\n const route = options.route ?? 's';\n const base = (options.checkoutOrigin ?? 'https://checkout.usethrottle.dev').replace(/\\/+$/, '');\n return `${base}/${route}/${encodeURIComponent(options.sessionId)}`;\n}\n\nexport function buildCheckoutEmbedUrl(options: BuildCheckoutUrlOptions): string {\n const baseUrl = buildCheckoutHostedUrl({\n checkoutOrigin: options.checkoutOrigin,\n sessionId: options.sessionId,\n route: options.route ?? 'c',\n });\n const params = new URLSearchParams({\n embed: '1',\n mode: options.mode ?? 'payment-only',\n ...(options.parentOrigin ? { parentOrigin: options.parentOrigin.replace(/\\/+$/, '') } : {}),\n });\n if (options.primary) params.set('primary', options.primary);\n if (options.logo) params.set('logo', options.logo);\n return `${baseUrl}?${params.toString()}`;\n}\n\nfunction toAbsoluteUrl(baseUrl: string, path: string): string {\n if (/^https?:\\/\\//i.test(path)) return path;\n return `${baseUrl}${path.startsWith('/') ? path : `/${path}`}`;\n}\n\nfunction normalizeCheckoutSession(raw: any): CheckoutSession {\n const sessionId = raw?.sessionId ?? raw?.id;\n return {\n ...withoutSnakeKeys(raw),\n id: optionalString(raw?.id) ?? undefined,\n sessionId: requiredString(sessionId, 'checkoutSession.sessionId'),\n checkoutUrl: optionalString(raw?.checkoutUrl) ?? undefined,\n hostedUrl: optionalString(raw?.hostedUrl) ?? undefined,\n embedUrl: optionalString(raw?.embedUrl) ?? undefined,\n embedToken: optionalString(raw?.embedToken) ?? undefined,\n expiresAt: optionalString(raw?.expiresAt) ?? undefined,\n };\n}\n\nfunction normalizeCompleteResult(raw: any): CompleteCheckoutSessionResult {\n const orderId = raw?.orderId ?? raw?.id;\n return {\n ...withoutSnakeKeys(raw),\n orderId: requiredString(orderId, 'checkoutComplete.orderId'),\n orderNumber: optionalString(raw?.orderNumber) ?? undefined,\n paymentId: optionalString(raw?.paymentId) ?? undefined,\n total: optionalNumber(raw?.total),\n currency: optionalString(raw?.currency) ?? undefined,\n status: optionalString(raw?.status) ?? undefined,\n paymentStatus: optionalString(raw?.paymentStatus) ?? undefined,\n };\n}\n\nfunction normalizeEmbedToken(raw: any): CreateEmbedTokenResult {\n return {\n ...withoutSnakeKeys(raw),\n embedToken: requiredString(raw?.embedToken, 'embedToken.embedToken'),\n checkoutSessionId: requiredString(raw?.checkoutSessionId, 'embedToken.checkoutSessionId'),\n amount: Number(raw?.amount ?? 0),\n currency: optionalString(raw?.currency) ?? 'USD',\n hostedUrl: optionalString(raw?.hostedUrl) ?? undefined,\n embedUrl: optionalString(raw?.embedUrl) ?? undefined,\n gr4vyId: optionalString(raw?.gr4vyId) ?? undefined,\n merchantAccountId: optionalString(raw?.merchantAccountId) ?? undefined,\n };\n}\n\nfunction normalizeOrder(raw: any): CheckoutOrder {\n return {\n ...withoutSnakeKeys(raw),\n id: requiredString(raw?.id, 'order.id'),\n orderNumber: optionalString(raw?.orderNumber) ?? undefined,\n status: optionalString(raw?.status) ?? 'processing',\n paymentStatus: optionalString(raw?.paymentStatus),\n currency: optionalString(raw?.currency) ?? 'USD',\n subtotal: Number(raw?.subtotal ?? 0),\n taxTotal: Number(raw?.taxTotal ?? 0),\n shippingTotal: Number(raw?.shippingTotal ?? 0),\n total: Number(raw?.total ?? 0),\n metadata: objectOrUndefined(raw?.metadata),\n payments: Array.isArray(raw?.payments) ? raw.payments.map(normalizePayment) : undefined,\n };\n}\n\nfunction normalizePayment(raw: any): CheckoutPayment {\n return {\n ...withoutSnakeKeys(raw),\n id: requiredString(raw?.id, 'payment.id'),\n orderId: optionalString(raw?.orderId) ?? undefined,\n processor: optionalString(raw?.processor) ?? undefined,\n processorTransactionId:\n optionalString(raw?.processorTransactionId) ?? undefined,\n amount: optionalNumber(raw?.amount),\n currency: optionalString(raw?.currency) ?? undefined,\n status: optionalString(raw?.status) ?? undefined,\n method: optionalString(raw?.method) ?? undefined,\n createdAt: optionalString(raw?.createdAt) ?? undefined,\n transactions: Array.isArray(raw?.transactions)\n ? raw.transactions.map(normalizeTransaction)\n : undefined,\n };\n}\n\nfunction normalizeTransaction(raw: any): CheckoutPaymentTransaction {\n return {\n ...withoutSnakeKeys(raw),\n id: requiredString(raw?.id, 'transaction.id'),\n paymentId: optionalString(raw?.paymentId) ?? undefined,\n type: optionalString(raw?.type) ?? undefined,\n amount: optionalNumber(raw?.amount),\n currency: optionalString(raw?.currency) ?? undefined,\n status: optionalString(raw?.status) ?? undefined,\n createdAt: optionalString(raw?.createdAt) ?? undefined,\n };\n}\n\nfunction withoutSnakeKeys(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return {};\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).filter(([key]) => !key.includes('_')),\n );\n}\n\nfunction requiredString(value: unknown, label: string): string {\n if (typeof value === 'string' && value.length > 0) return value;\n throw new Error(`Invalid Throttle response: missing ${label}`);\n}\n\nfunction optionalString(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction optionalNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction objectOrUndefined(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n"],"mappings":"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","names":["import_errors"]}
package/dist/server.d.cts CHANGED
@@ -1,3 +1,6 @@
1
+ import { ThrottleError } from '@usethrottle/errors';
2
+ export { ThrottleError, isThrottleError } from '@usethrottle/errors';
3
+
1
4
  type PaymentMethod = 'net30' | 'card' | 'gr4vy';
2
5
  type SubscriptionInterval = 'weekly' | 'monthly' | 'quarterly' | 'yearly';
3
6
  type CheckoutEmbedMode = 'checkout-full' | 'payment-only';
@@ -118,7 +121,6 @@ interface CreateEmbedTokenInput {
118
121
  amount: number;
119
122
  currency: string;
120
123
  country?: string;
121
- allowedMethods?: string[];
122
124
  }
123
125
  interface CreateEmbedTokenResult {
124
126
  embedToken: string;
@@ -200,11 +202,15 @@ interface ThrottleEnvelope<T> {
200
202
  details?: unknown;
201
203
  };
202
204
  }
203
- declare class ThrottleCheckoutError extends Error {
204
- readonly code: string;
205
- readonly statusCode: number;
206
- readonly details?: unknown;
207
- readonly body?: unknown;
205
+ /**
206
+ * Thrown on a non-2xx response from the Throttle Checkout API.
207
+ *
208
+ * Extends the shared {@link ThrottleError} so a single
209
+ * `catch (e) { if (e instanceof ThrottleError) … }` covers errors from every
210
+ * Throttle SDK. `instanceof ThrottleCheckoutError` keeps working for existing
211
+ * code.
212
+ */
213
+ declare class ThrottleCheckoutError extends ThrottleError {
208
214
  constructor(args: {
209
215
  code: string;
210
216
  message: string;
@@ -213,6 +219,7 @@ declare class ThrottleCheckoutError extends Error {
213
219
  body?: unknown;
214
220
  });
215
221
  }
222
+
216
223
  declare class CheckoutClient {
217
224
  private readonly apiKey;
218
225
  private readonly baseUrl;
@@ -223,6 +230,12 @@ declare class CheckoutClient {
223
230
  requestEnvelope<T = unknown>(method: string, path: string, body?: unknown): Promise<ThrottleEnvelope<T>>;
224
231
  createSession(input: CreateCheckoutSessionInput): Promise<CheckoutSession>;
225
232
  completeSession(sessionId: string, input: CompleteCheckoutSessionInput): Promise<CompleteCheckoutSessionResult>;
233
+ /**
234
+ * Cancel an in-flight checkout session (e.g. the buyer abandoned the embed).
235
+ * Idempotent — cancelling an already-cancelled session is a no-op; a completed
236
+ * session cannot be cancelled (the API returns 422 `already_completed`).
237
+ */
238
+ cancelSession(sessionId: string): Promise<void>;
226
239
  createEmbedToken(input: CreateEmbedTokenInput): Promise<CreateEmbedTokenResult>;
227
240
  getOrder(orderId: string): Promise<CheckoutOrder>;
228
241
  listOrders(options?: ListOrdersOptions): Promise<PaginatedOrders>;
package/dist/server.d.ts CHANGED
@@ -1,3 +1,6 @@
1
+ import { ThrottleError } from '@usethrottle/errors';
2
+ export { ThrottleError, isThrottleError } from '@usethrottle/errors';
3
+
1
4
  type PaymentMethod = 'net30' | 'card' | 'gr4vy';
2
5
  type SubscriptionInterval = 'weekly' | 'monthly' | 'quarterly' | 'yearly';
3
6
  type CheckoutEmbedMode = 'checkout-full' | 'payment-only';
@@ -118,7 +121,6 @@ interface CreateEmbedTokenInput {
118
121
  amount: number;
119
122
  currency: string;
120
123
  country?: string;
121
- allowedMethods?: string[];
122
124
  }
123
125
  interface CreateEmbedTokenResult {
124
126
  embedToken: string;
@@ -200,11 +202,15 @@ interface ThrottleEnvelope<T> {
200
202
  details?: unknown;
201
203
  };
202
204
  }
203
- declare class ThrottleCheckoutError extends Error {
204
- readonly code: string;
205
- readonly statusCode: number;
206
- readonly details?: unknown;
207
- readonly body?: unknown;
205
+ /**
206
+ * Thrown on a non-2xx response from the Throttle Checkout API.
207
+ *
208
+ * Extends the shared {@link ThrottleError} so a single
209
+ * `catch (e) { if (e instanceof ThrottleError) … }` covers errors from every
210
+ * Throttle SDK. `instanceof ThrottleCheckoutError` keeps working for existing
211
+ * code.
212
+ */
213
+ declare class ThrottleCheckoutError extends ThrottleError {
208
214
  constructor(args: {
209
215
  code: string;
210
216
  message: string;
@@ -213,6 +219,7 @@ declare class ThrottleCheckoutError extends Error {
213
219
  body?: unknown;
214
220
  });
215
221
  }
222
+
216
223
  declare class CheckoutClient {
217
224
  private readonly apiKey;
218
225
  private readonly baseUrl;
@@ -223,6 +230,12 @@ declare class CheckoutClient {
223
230
  requestEnvelope<T = unknown>(method: string, path: string, body?: unknown): Promise<ThrottleEnvelope<T>>;
224
231
  createSession(input: CreateCheckoutSessionInput): Promise<CheckoutSession>;
225
232
  completeSession(sessionId: string, input: CompleteCheckoutSessionInput): Promise<CompleteCheckoutSessionResult>;
233
+ /**
234
+ * Cancel an in-flight checkout session (e.g. the buyer abandoned the embed).
235
+ * Idempotent — cancelling an already-cancelled session is a no-op; a completed
236
+ * session cannot be cancelled (the API returns 422 `already_completed`).
237
+ */
238
+ cancelSession(sessionId: string): Promise<void>;
226
239
  createEmbedToken(input: CreateEmbedTokenInput): Promise<CreateEmbedTokenResult>;
227
240
  getOrder(orderId: string): Promise<CheckoutOrder>;
228
241
  listOrders(options?: ListOrdersOptions): Promise<PaginatedOrders>;
package/dist/server.js CHANGED
@@ -1,12 +1,10 @@
1
1
  // src/server.ts
2
- var ThrottleCheckoutError = class extends Error {
2
+ import { ThrottleError } from "@usethrottle/errors";
3
+ import { ThrottleError as ThrottleError2, isThrottleError } from "@usethrottle/errors";
4
+ var ThrottleCheckoutError = class extends ThrottleError {
3
5
  constructor(args) {
4
- super(args.message);
6
+ super(args);
5
7
  this.name = "ThrottleCheckoutError";
6
- this.code = args.code;
7
- this.statusCode = args.statusCode;
8
- this.details = args.details;
9
- this.body = args.body;
10
8
  }
11
9
  };
12
10
  var CheckoutClient = class {
@@ -67,6 +65,17 @@ var CheckoutClient = class {
67
65
  );
68
66
  return normalizeCompleteResult(data);
69
67
  }
68
+ /**
69
+ * Cancel an in-flight checkout session (e.g. the buyer abandoned the embed).
70
+ * Idempotent — cancelling an already-cancelled session is a no-op; a completed
71
+ * session cannot be cancelled (the API returns 422 `already_completed`).
72
+ */
73
+ async cancelSession(sessionId) {
74
+ await this.request(
75
+ "DELETE",
76
+ `/api/v1/checkout/sessions/${encodeURIComponent(sessionId)}`
77
+ );
78
+ }
70
79
  async createEmbedToken(input) {
71
80
  const data = await this.request("POST", "/api/v1/checkout-sessions/embed-token", input);
72
81
  return normalizeEmbedToken(data);
@@ -251,8 +260,10 @@ function objectOrUndefined(value) {
251
260
  export {
252
261
  CheckoutClient,
253
262
  ThrottleCheckoutError,
263
+ ThrottleError2 as ThrottleError,
254
264
  buildCheckoutEmbedUrl,
255
265
  buildCheckoutHostedUrl,
256
- createCheckoutClient
266
+ createCheckoutClient,
267
+ isThrottleError
257
268
  };
258
269
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.ts"],"sourcesContent":["export type PaymentMethod = 'net30' | 'card' | 'gr4vy';\nexport type SubscriptionInterval = 'weekly' | 'monthly' | 'quarterly' | 'yearly';\nexport type CheckoutEmbedMode = 'checkout-full' | 'payment-only';\nexport type CheckoutEmbedRoute = 'c' | 's';\n\nexport interface CheckoutClientOptions {\n apiKey: string;\n baseUrl?: string;\n fetch?: typeof globalThis.fetch;\n timeoutMs?: number;\n}\n\nexport interface CheckoutAddress {\n firstName: string;\n lastName: string;\n company?: string;\n addressLine1: string;\n addressLine2?: string;\n city: string;\n stateProvince: string;\n postalCode: string;\n countryCode: string;\n phone?: string;\n}\n\nexport interface CheckoutCustomerAddressInput {\n firstName?: string;\n lastName?: string;\n phone?: string;\n addressLine1?: string;\n addressLine2?: string;\n city?: string;\n state?: string;\n postalCode?: string;\n country?: string;\n}\n\nexport interface CheckoutCustomerInput {\n customerId?: string;\n externalCustomerId?: string;\n email?: string;\n firstName?: string;\n lastName?: string;\n phone?: string;\n shippingAddress?: CheckoutCustomerAddressInput;\n billingAddress?: CheckoutCustomerAddressInput;\n metadata?: Record<string, unknown>;\n}\n\nexport interface RecurringIntentInput {\n plan: string;\n interval: SubscriptionInterval;\n amount?: number;\n trialDays?: number;\n planName?: string;\n create?: 'auto' | 'manual';\n}\n\nexport interface CheckoutCollectInput {\n shippingAddress?: boolean;\n billingAddress?: boolean;\n}\n\nexport interface CheckoutPaymentTermsInput {\n netN?: number | null;\n}\n\nexport interface CreateCheckoutSessionInput {\n applicationId: string;\n cartId?: string;\n externalCartId?: string;\n customerEmail?: string;\n customer?: CheckoutCustomerInput;\n returnUrl: string;\n cancelUrl: string;\n allowedMethods?: string[];\n paymentTerms?: CheckoutPaymentTermsInput;\n recurring?: RecurringIntentInput;\n collect?: CheckoutCollectInput;\n metadata?: Record<string, unknown>;\n discountCode?: string;\n}\n\nexport interface CheckoutSession {\n sessionId: string;\n id?: string;\n checkoutUrl?: string;\n hostedUrl?: string;\n embedUrl?: string;\n embedToken?: string;\n expiresAt?: string;\n [key: string]: unknown;\n}\n\nexport interface Net30Acceptance {\n termsHash: string;\n acceptedAt: string;\n companyName: string;\n billingEmail: string;\n}\n\nexport interface CompleteCheckoutSessionInput {\n email?: string;\n shippingAddress?: CheckoutAddress;\n billingAddress?: CheckoutAddress;\n billingSameAsShipping?: boolean;\n paymentMethod: PaymentMethod;\n netDays?: number;\n termsAccepted?: boolean;\n termsSnapshot?: string;\n invoiceNumber?: string;\n net30Acceptance?: Net30Acceptance;\n paymentToken?: string;\n gr4vyCheckoutSessionId?: string;\n gr4vyTransactionId?: string;\n}\n\nexport interface CompleteCheckoutSessionResult {\n orderId: string;\n orderNumber?: string;\n paymentId?: string;\n total?: number;\n currency?: string;\n status?: string;\n paymentStatus?: string;\n [key: string]: unknown;\n}\n\nexport interface CreateEmbedTokenInput {\n externalCartId?: string;\n amount: number;\n currency: string;\n country?: string;\n allowedMethods?: string[];\n}\n\nexport interface CreateEmbedTokenResult {\n embedToken: string;\n checkoutSessionId: string;\n amount: number;\n currency: string;\n hostedUrl?: string;\n embedUrl?: string;\n gr4vyId?: string;\n merchantAccountId?: string;\n [key: string]: unknown;\n}\n\nexport interface CheckoutOrder {\n id: string;\n orderNumber?: string;\n status: string;\n paymentStatus: string | null;\n currency: string;\n subtotal: number;\n taxTotal: number;\n shippingTotal: number;\n total: number;\n metadata?: Record<string, unknown>;\n payments?: CheckoutPayment[];\n [key: string]: unknown;\n}\n\nexport interface ListOrdersOptions {\n customerId?: string;\n cursor?: string;\n limit?: number;\n status?: string;\n paymentStatus?: string;\n}\n\nexport interface PaginatedOrders {\n data: CheckoutOrder[];\n pagination?: {\n cursor: string | null;\n hasMore: boolean;\n };\n}\n\nexport interface CheckoutPayment {\n id: string;\n orderId?: string;\n processor?: string;\n processorTransactionId?: string | null;\n amount?: number;\n currency?: string;\n status?: string;\n method?: string;\n createdAt?: string;\n transactions?: CheckoutPaymentTransaction[];\n [key: string]: unknown;\n}\n\nexport interface CheckoutPaymentTransaction {\n id: string;\n paymentId?: string;\n type?: string;\n amount?: number;\n currency?: string;\n status?: string;\n createdAt?: string;\n [key: string]: unknown;\n}\n\nexport interface BuildCheckoutUrlOptions {\n checkoutOrigin?: string;\n sessionId: string;\n parentOrigin?: string;\n mode?: CheckoutEmbedMode;\n route?: CheckoutEmbedRoute;\n primary?: string;\n logo?: string;\n}\n\nexport interface ThrottleEnvelope<T> {\n data?: T;\n meta?: Record<string, unknown>;\n error?: {\n code?: string;\n message?: string;\n details?: unknown;\n };\n}\n\nexport class ThrottleCheckoutError extends Error {\n readonly code: string;\n readonly statusCode: number;\n readonly details?: unknown;\n readonly body?: unknown;\n\n constructor(args: {\n code: string;\n message: string;\n statusCode: number;\n details?: unknown;\n body?: unknown;\n }) {\n super(args.message);\n this.name = 'ThrottleCheckoutError';\n this.code = args.code;\n this.statusCode = args.statusCode;\n this.details = args.details;\n this.body = args.body;\n }\n}\n\nexport class CheckoutClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof globalThis.fetch;\n private readonly timeoutMs: number;\n\n constructor(opts: CheckoutClientOptions) {\n if (!opts.apiKey) throw new Error('CheckoutClient: apiKey is required');\n const fetchImpl = opts.fetch ?? globalThis.fetch;\n if (!fetchImpl) throw new Error('CheckoutClient: fetch is required');\n this.apiKey = opts.apiKey;\n this.baseUrl = (opts.baseUrl ?? 'https://api.usethrottle.dev').replace(/\\/+$/, '');\n this.fetchImpl = fetchImpl;\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n }\n\n async request<T = unknown>(method: string, path: string, body?: unknown): Promise<T> {\n const envelope = await this.requestEnvelope<T>(method, path, body);\n if (Object.prototype.hasOwnProperty.call(envelope, 'data')) {\n return envelope.data as T;\n }\n return envelope as T;\n }\n\n async requestEnvelope<T = unknown>(\n method: string,\n path: string,\n body?: unknown,\n ): Promise<ThrottleEnvelope<T>> {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n\n try {\n const res = await this.fetchImpl(toAbsoluteUrl(this.baseUrl, path), {\n method,\n headers: {\n 'content-type': 'application/json',\n 'x-api-key': this.apiKey,\n },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: ctrl.signal,\n });\n\n if (res.status === 204) return { data: undefined as T };\n\n const json = (await res.json().catch(() => ({}))) as ThrottleEnvelope<T>;\n if (!res.ok) {\n throw new ThrottleCheckoutError({\n code: json.error?.code ?? 'unknown_error',\n message: json.error?.message ?? `HTTP ${res.status}`,\n statusCode: res.status,\n details: json.error?.details,\n body: json,\n });\n }\n return json;\n } finally {\n clearTimeout(timer);\n }\n }\n\n async createSession(input: CreateCheckoutSessionInput): Promise<CheckoutSession> {\n const data = await this.request<unknown>('POST', '/api/v1/checkout/sessions', input);\n return normalizeCheckoutSession(data);\n }\n\n async completeSession(\n sessionId: string,\n input: CompleteCheckoutSessionInput,\n ): Promise<CompleteCheckoutSessionResult> {\n const data = await this.request<unknown>(\n 'POST',\n `/api/v1/checkout/sessions/${encodeURIComponent(sessionId)}/complete`,\n input,\n );\n return normalizeCompleteResult(data);\n }\n\n async createEmbedToken(input: CreateEmbedTokenInput): Promise<CreateEmbedTokenResult> {\n const data = await this.request<unknown>('POST', '/api/v1/checkout-sessions/embed-token', input);\n return normalizeEmbedToken(data);\n }\n\n async getOrder(orderId: string): Promise<CheckoutOrder> {\n const data = await this.request<unknown>('GET', `/api/v1/orders/${encodeURIComponent(orderId)}`);\n return normalizeOrder(data);\n }\n\n async listOrders(options: ListOrdersOptions = {}): Promise<PaginatedOrders> {\n const params = new URLSearchParams();\n if (options.customerId) params.set('customerId', options.customerId);\n if (options.cursor) params.set('cursor', options.cursor);\n if (options.limit !== undefined) params.set('limit', String(options.limit));\n if (options.status) params.set('status', options.status);\n if (options.paymentStatus) params.set('paymentStatus', options.paymentStatus);\n\n const query = params.toString();\n const envelope = await this.requestEnvelope<unknown[]>(\n 'GET',\n `/api/v1/orders${query ? `?${query}` : ''}`,\n );\n return {\n data: (envelope.data ?? []).map(normalizeOrder),\n pagination: envelope.meta?.pagination as PaginatedOrders['pagination'],\n };\n }\n\n async listOrderPayments(orderId: string): Promise<CheckoutPayment[]> {\n const data = await this.request<unknown[]>(\n 'GET',\n `/api/v1/orders/${encodeURIComponent(orderId)}/payments`,\n );\n return (data ?? []).map(normalizePayment);\n }\n\n async listPaymentTransactions(paymentId: string): Promise<CheckoutPaymentTransaction[]> {\n const data = await this.request<unknown[]>(\n 'GET',\n `/api/v1/payments/${encodeURIComponent(paymentId)}/transactions`,\n );\n return (data ?? []).map(normalizeTransaction);\n }\n\n async getOrderWithPayments(orderId: string): Promise<CheckoutOrder> {\n const order = await this.getOrder(orderId);\n const payments = await this.listOrderPayments(orderId);\n return {\n ...order,\n payments: await Promise.all(\n payments.map(async (payment) => ({\n ...payment,\n transactions: payment.id ? await this.listPaymentTransactions(payment.id) : [],\n })),\n ),\n };\n }\n}\n\nexport function createCheckoutClient(opts: CheckoutClientOptions): CheckoutClient {\n return new CheckoutClient(opts);\n}\n\nexport function buildCheckoutHostedUrl(options: BuildCheckoutUrlOptions): string {\n const route = options.route ?? 's';\n const base = (options.checkoutOrigin ?? 'https://checkout.usethrottle.dev').replace(/\\/+$/, '');\n return `${base}/${route}/${encodeURIComponent(options.sessionId)}`;\n}\n\nexport function buildCheckoutEmbedUrl(options: BuildCheckoutUrlOptions): string {\n const baseUrl = buildCheckoutHostedUrl({\n checkoutOrigin: options.checkoutOrigin,\n sessionId: options.sessionId,\n route: options.route ?? 'c',\n });\n const params = new URLSearchParams({\n embed: '1',\n mode: options.mode ?? 'payment-only',\n ...(options.parentOrigin ? { parentOrigin: options.parentOrigin.replace(/\\/+$/, '') } : {}),\n });\n if (options.primary) params.set('primary', options.primary);\n if (options.logo) params.set('logo', options.logo);\n return `${baseUrl}?${params.toString()}`;\n}\n\nfunction toAbsoluteUrl(baseUrl: string, path: string): string {\n if (/^https?:\\/\\//i.test(path)) return path;\n return `${baseUrl}${path.startsWith('/') ? path : `/${path}`}`;\n}\n\nfunction normalizeCheckoutSession(raw: any): CheckoutSession {\n const sessionId = raw?.sessionId ?? raw?.id;\n return {\n ...withoutSnakeKeys(raw),\n id: optionalString(raw?.id) ?? undefined,\n sessionId: requiredString(sessionId, 'checkoutSession.sessionId'),\n checkoutUrl: optionalString(raw?.checkoutUrl) ?? undefined,\n hostedUrl: optionalString(raw?.hostedUrl) ?? undefined,\n embedUrl: optionalString(raw?.embedUrl) ?? undefined,\n embedToken: optionalString(raw?.embedToken) ?? undefined,\n expiresAt: optionalString(raw?.expiresAt) ?? undefined,\n };\n}\n\nfunction normalizeCompleteResult(raw: any): CompleteCheckoutSessionResult {\n const orderId = raw?.orderId ?? raw?.id;\n return {\n ...withoutSnakeKeys(raw),\n orderId: requiredString(orderId, 'checkoutComplete.orderId'),\n orderNumber: optionalString(raw?.orderNumber) ?? undefined,\n paymentId: optionalString(raw?.paymentId) ?? undefined,\n total: optionalNumber(raw?.total),\n currency: optionalString(raw?.currency) ?? undefined,\n status: optionalString(raw?.status) ?? undefined,\n paymentStatus: optionalString(raw?.paymentStatus) ?? undefined,\n };\n}\n\nfunction normalizeEmbedToken(raw: any): CreateEmbedTokenResult {\n return {\n ...withoutSnakeKeys(raw),\n embedToken: requiredString(raw?.embedToken, 'embedToken.embedToken'),\n checkoutSessionId: requiredString(raw?.checkoutSessionId, 'embedToken.checkoutSessionId'),\n amount: Number(raw?.amount ?? 0),\n currency: optionalString(raw?.currency) ?? 'USD',\n hostedUrl: optionalString(raw?.hostedUrl) ?? undefined,\n embedUrl: optionalString(raw?.embedUrl) ?? undefined,\n gr4vyId: optionalString(raw?.gr4vyId) ?? undefined,\n merchantAccountId: optionalString(raw?.merchantAccountId) ?? undefined,\n };\n}\n\nfunction normalizeOrder(raw: any): CheckoutOrder {\n return {\n ...withoutSnakeKeys(raw),\n id: requiredString(raw?.id, 'order.id'),\n orderNumber: optionalString(raw?.orderNumber) ?? undefined,\n status: optionalString(raw?.status) ?? 'processing',\n paymentStatus: optionalString(raw?.paymentStatus),\n currency: optionalString(raw?.currency) ?? 'USD',\n subtotal: Number(raw?.subtotal ?? 0),\n taxTotal: Number(raw?.taxTotal ?? 0),\n shippingTotal: Number(raw?.shippingTotal ?? 0),\n total: Number(raw?.total ?? 0),\n metadata: objectOrUndefined(raw?.metadata),\n payments: Array.isArray(raw?.payments) ? raw.payments.map(normalizePayment) : undefined,\n };\n}\n\nfunction normalizePayment(raw: any): CheckoutPayment {\n return {\n ...withoutSnakeKeys(raw),\n id: requiredString(raw?.id, 'payment.id'),\n orderId: optionalString(raw?.orderId) ?? undefined,\n processor: optionalString(raw?.processor) ?? undefined,\n processorTransactionId:\n optionalString(raw?.processorTransactionId) ?? undefined,\n amount: optionalNumber(raw?.amount),\n currency: optionalString(raw?.currency) ?? undefined,\n status: optionalString(raw?.status) ?? undefined,\n method: optionalString(raw?.method) ?? undefined,\n createdAt: optionalString(raw?.createdAt) ?? undefined,\n transactions: Array.isArray(raw?.transactions)\n ? raw.transactions.map(normalizeTransaction)\n : undefined,\n };\n}\n\nfunction normalizeTransaction(raw: any): CheckoutPaymentTransaction {\n return {\n ...withoutSnakeKeys(raw),\n id: requiredString(raw?.id, 'transaction.id'),\n paymentId: optionalString(raw?.paymentId) ?? undefined,\n type: optionalString(raw?.type) ?? undefined,\n amount: optionalNumber(raw?.amount),\n currency: optionalString(raw?.currency) ?? undefined,\n status: optionalString(raw?.status) ?? undefined,\n createdAt: optionalString(raw?.createdAt) ?? undefined,\n };\n}\n\nfunction withoutSnakeKeys(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return {};\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).filter(([key]) => !key.includes('_')),\n );\n}\n\nfunction requiredString(value: unknown, label: string): string {\n if (typeof value === 'string' && value.length > 0) return value;\n throw new Error(`Invalid Throttle response: missing ${label}`);\n}\n\nfunction optionalString(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction optionalNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction objectOrUndefined(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/server.ts"],"sourcesContent":["import { ThrottleError } from '@usethrottle/errors';\n\nexport type PaymentMethod = 'net30' | 'card' | 'gr4vy';\nexport type SubscriptionInterval = 'weekly' | 'monthly' | 'quarterly' | 'yearly';\nexport type CheckoutEmbedMode = 'checkout-full' | 'payment-only';\nexport type CheckoutEmbedRoute = 'c' | 's';\n\nexport interface CheckoutClientOptions {\n apiKey: string;\n baseUrl?: string;\n fetch?: typeof globalThis.fetch;\n timeoutMs?: number;\n}\n\nexport interface CheckoutAddress {\n firstName: string;\n lastName: string;\n company?: string;\n addressLine1: string;\n addressLine2?: string;\n city: string;\n stateProvince: string;\n postalCode: string;\n countryCode: string;\n phone?: string;\n}\n\nexport interface CheckoutCustomerAddressInput {\n firstName?: string;\n lastName?: string;\n phone?: string;\n addressLine1?: string;\n addressLine2?: string;\n city?: string;\n state?: string;\n postalCode?: string;\n country?: string;\n}\n\nexport interface CheckoutCustomerInput {\n customerId?: string;\n externalCustomerId?: string;\n email?: string;\n firstName?: string;\n lastName?: string;\n phone?: string;\n shippingAddress?: CheckoutCustomerAddressInput;\n billingAddress?: CheckoutCustomerAddressInput;\n metadata?: Record<string, unknown>;\n}\n\nexport interface RecurringIntentInput {\n plan: string;\n interval: SubscriptionInterval;\n amount?: number;\n trialDays?: number;\n planName?: string;\n create?: 'auto' | 'manual';\n}\n\nexport interface CheckoutCollectInput {\n shippingAddress?: boolean;\n billingAddress?: boolean;\n}\n\nexport interface CheckoutPaymentTermsInput {\n netN?: number | null;\n}\n\nexport interface CreateCheckoutSessionInput {\n applicationId: string;\n cartId?: string;\n externalCartId?: string;\n customerEmail?: string;\n customer?: CheckoutCustomerInput;\n returnUrl: string;\n cancelUrl: string;\n allowedMethods?: string[];\n paymentTerms?: CheckoutPaymentTermsInput;\n recurring?: RecurringIntentInput;\n collect?: CheckoutCollectInput;\n metadata?: Record<string, unknown>;\n discountCode?: string;\n}\n\nexport interface CheckoutSession {\n sessionId: string;\n id?: string;\n checkoutUrl?: string;\n hostedUrl?: string;\n embedUrl?: string;\n embedToken?: string;\n expiresAt?: string;\n [key: string]: unknown;\n}\n\nexport interface Net30Acceptance {\n termsHash: string;\n acceptedAt: string;\n companyName: string;\n billingEmail: string;\n}\n\nexport interface CompleteCheckoutSessionInput {\n email?: string;\n shippingAddress?: CheckoutAddress;\n billingAddress?: CheckoutAddress;\n billingSameAsShipping?: boolean;\n paymentMethod: PaymentMethod;\n netDays?: number;\n termsAccepted?: boolean;\n termsSnapshot?: string;\n invoiceNumber?: string;\n net30Acceptance?: Net30Acceptance;\n paymentToken?: string;\n gr4vyCheckoutSessionId?: string;\n gr4vyTransactionId?: string;\n}\n\nexport interface CompleteCheckoutSessionResult {\n orderId: string;\n orderNumber?: string;\n paymentId?: string;\n total?: number;\n currency?: string;\n status?: string;\n paymentStatus?: string;\n [key: string]: unknown;\n}\n\nexport interface CreateEmbedTokenInput {\n externalCartId?: string;\n amount: number;\n currency: string;\n country?: string;\n // NOTE: `allowedMethods` is intentionally NOT accepted here. A payment-only\n // Gr4vy embed cannot restrict payment methods (the Gr4vy widget renders the\n // methods configured on your Gr4vy connection). The server rejects it with\n // `allowed_methods_unsupported`. To restrict methods, configure the connection\n // or use the full hosted checkout, where allowedMethods filters the selection.\n}\n\nexport interface CreateEmbedTokenResult {\n embedToken: string;\n checkoutSessionId: string;\n amount: number;\n currency: string;\n hostedUrl?: string;\n embedUrl?: string;\n gr4vyId?: string;\n merchantAccountId?: string;\n [key: string]: unknown;\n}\n\nexport interface CheckoutOrder {\n id: string;\n orderNumber?: string;\n status: string;\n paymentStatus: string | null;\n currency: string;\n subtotal: number;\n taxTotal: number;\n shippingTotal: number;\n total: number;\n metadata?: Record<string, unknown>;\n payments?: CheckoutPayment[];\n [key: string]: unknown;\n}\n\nexport interface ListOrdersOptions {\n customerId?: string;\n cursor?: string;\n limit?: number;\n status?: string;\n paymentStatus?: string;\n}\n\nexport interface PaginatedOrders {\n data: CheckoutOrder[];\n pagination?: {\n cursor: string | null;\n hasMore: boolean;\n };\n}\n\nexport interface CheckoutPayment {\n id: string;\n orderId?: string;\n processor?: string;\n processorTransactionId?: string | null;\n amount?: number;\n currency?: string;\n status?: string;\n method?: string;\n createdAt?: string;\n transactions?: CheckoutPaymentTransaction[];\n [key: string]: unknown;\n}\n\nexport interface CheckoutPaymentTransaction {\n id: string;\n paymentId?: string;\n type?: string;\n amount?: number;\n currency?: string;\n status?: string;\n createdAt?: string;\n [key: string]: unknown;\n}\n\nexport interface BuildCheckoutUrlOptions {\n checkoutOrigin?: string;\n sessionId: string;\n parentOrigin?: string;\n mode?: CheckoutEmbedMode;\n route?: CheckoutEmbedRoute;\n primary?: string;\n logo?: string;\n}\n\nexport interface ThrottleEnvelope<T> {\n data?: T;\n meta?: Record<string, unknown>;\n error?: {\n code?: string;\n message?: string;\n details?: unknown;\n };\n}\n\n/**\n * Thrown on a non-2xx response from the Throttle Checkout API.\n *\n * Extends the shared {@link ThrottleError} so a single\n * `catch (e) { if (e instanceof ThrottleError) … }` covers errors from every\n * Throttle SDK. `instanceof ThrottleCheckoutError` keeps working for existing\n * code.\n */\nexport class ThrottleCheckoutError extends ThrottleError {\n constructor(args: {\n code: string;\n message: string;\n statusCode: number;\n details?: unknown;\n body?: unknown;\n }) {\n super(args);\n this.name = 'ThrottleCheckoutError';\n }\n}\n\nexport { ThrottleError, isThrottleError } from '@usethrottle/errors';\n\nexport class CheckoutClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof globalThis.fetch;\n private readonly timeoutMs: number;\n\n constructor(opts: CheckoutClientOptions) {\n if (!opts.apiKey) throw new Error('CheckoutClient: apiKey is required');\n const fetchImpl = opts.fetch ?? globalThis.fetch;\n if (!fetchImpl) throw new Error('CheckoutClient: fetch is required');\n this.apiKey = opts.apiKey;\n this.baseUrl = (opts.baseUrl ?? 'https://api.usethrottle.dev').replace(/\\/+$/, '');\n this.fetchImpl = fetchImpl;\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n }\n\n async request<T = unknown>(method: string, path: string, body?: unknown): Promise<T> {\n const envelope = await this.requestEnvelope<T>(method, path, body);\n if (Object.prototype.hasOwnProperty.call(envelope, 'data')) {\n return envelope.data as T;\n }\n return envelope as T;\n }\n\n async requestEnvelope<T = unknown>(\n method: string,\n path: string,\n body?: unknown,\n ): Promise<ThrottleEnvelope<T>> {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n\n try {\n const res = await this.fetchImpl(toAbsoluteUrl(this.baseUrl, path), {\n method,\n headers: {\n 'content-type': 'application/json',\n 'x-api-key': this.apiKey,\n },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: ctrl.signal,\n });\n\n if (res.status === 204) return { data: undefined as T };\n\n const json = (await res.json().catch(() => ({}))) as ThrottleEnvelope<T>;\n if (!res.ok) {\n throw new ThrottleCheckoutError({\n code: json.error?.code ?? 'unknown_error',\n message: json.error?.message ?? `HTTP ${res.status}`,\n statusCode: res.status,\n details: json.error?.details,\n body: json,\n });\n }\n return json;\n } finally {\n clearTimeout(timer);\n }\n }\n\n async createSession(input: CreateCheckoutSessionInput): Promise<CheckoutSession> {\n const data = await this.request<unknown>('POST', '/api/v1/checkout/sessions', input);\n return normalizeCheckoutSession(data);\n }\n\n async completeSession(\n sessionId: string,\n input: CompleteCheckoutSessionInput,\n ): Promise<CompleteCheckoutSessionResult> {\n const data = await this.request<unknown>(\n 'POST',\n `/api/v1/checkout/sessions/${encodeURIComponent(sessionId)}/complete`,\n input,\n );\n return normalizeCompleteResult(data);\n }\n\n /**\n * Cancel an in-flight checkout session (e.g. the buyer abandoned the embed).\n * Idempotent — cancelling an already-cancelled session is a no-op; a completed\n * session cannot be cancelled (the API returns 422 `already_completed`).\n */\n async cancelSession(sessionId: string): Promise<void> {\n await this.request<unknown>(\n 'DELETE',\n `/api/v1/checkout/sessions/${encodeURIComponent(sessionId)}`,\n );\n }\n\n async createEmbedToken(input: CreateEmbedTokenInput): Promise<CreateEmbedTokenResult> {\n const data = await this.request<unknown>('POST', '/api/v1/checkout-sessions/embed-token', input);\n return normalizeEmbedToken(data);\n }\n\n async getOrder(orderId: string): Promise<CheckoutOrder> {\n const data = await this.request<unknown>('GET', `/api/v1/orders/${encodeURIComponent(orderId)}`);\n return normalizeOrder(data);\n }\n\n async listOrders(options: ListOrdersOptions = {}): Promise<PaginatedOrders> {\n const params = new URLSearchParams();\n if (options.customerId) params.set('customerId', options.customerId);\n if (options.cursor) params.set('cursor', options.cursor);\n if (options.limit !== undefined) params.set('limit', String(options.limit));\n if (options.status) params.set('status', options.status);\n if (options.paymentStatus) params.set('paymentStatus', options.paymentStatus);\n\n const query = params.toString();\n const envelope = await this.requestEnvelope<unknown[]>(\n 'GET',\n `/api/v1/orders${query ? `?${query}` : ''}`,\n );\n return {\n data: (envelope.data ?? []).map(normalizeOrder),\n pagination: envelope.meta?.pagination as PaginatedOrders['pagination'],\n };\n }\n\n async listOrderPayments(orderId: string): Promise<CheckoutPayment[]> {\n const data = await this.request<unknown[]>(\n 'GET',\n `/api/v1/orders/${encodeURIComponent(orderId)}/payments`,\n );\n return (data ?? []).map(normalizePayment);\n }\n\n async listPaymentTransactions(paymentId: string): Promise<CheckoutPaymentTransaction[]> {\n const data = await this.request<unknown[]>(\n 'GET',\n `/api/v1/payments/${encodeURIComponent(paymentId)}/transactions`,\n );\n return (data ?? []).map(normalizeTransaction);\n }\n\n async getOrderWithPayments(orderId: string): Promise<CheckoutOrder> {\n const order = await this.getOrder(orderId);\n const payments = await this.listOrderPayments(orderId);\n return {\n ...order,\n payments: await Promise.all(\n payments.map(async (payment) => ({\n ...payment,\n transactions: payment.id ? await this.listPaymentTransactions(payment.id) : [],\n })),\n ),\n };\n }\n}\n\nexport function createCheckoutClient(opts: CheckoutClientOptions): CheckoutClient {\n return new CheckoutClient(opts);\n}\n\nexport function buildCheckoutHostedUrl(options: BuildCheckoutUrlOptions): string {\n const route = options.route ?? 's';\n const base = (options.checkoutOrigin ?? 'https://checkout.usethrottle.dev').replace(/\\/+$/, '');\n return `${base}/${route}/${encodeURIComponent(options.sessionId)}`;\n}\n\nexport function buildCheckoutEmbedUrl(options: BuildCheckoutUrlOptions): string {\n const baseUrl = buildCheckoutHostedUrl({\n checkoutOrigin: options.checkoutOrigin,\n sessionId: options.sessionId,\n route: options.route ?? 'c',\n });\n const params = new URLSearchParams({\n embed: '1',\n mode: options.mode ?? 'payment-only',\n ...(options.parentOrigin ? { parentOrigin: options.parentOrigin.replace(/\\/+$/, '') } : {}),\n });\n if (options.primary) params.set('primary', options.primary);\n if (options.logo) params.set('logo', options.logo);\n return `${baseUrl}?${params.toString()}`;\n}\n\nfunction toAbsoluteUrl(baseUrl: string, path: string): string {\n if (/^https?:\\/\\//i.test(path)) return path;\n return `${baseUrl}${path.startsWith('/') ? path : `/${path}`}`;\n}\n\nfunction normalizeCheckoutSession(raw: any): CheckoutSession {\n const sessionId = raw?.sessionId ?? raw?.id;\n return {\n ...withoutSnakeKeys(raw),\n id: optionalString(raw?.id) ?? undefined,\n sessionId: requiredString(sessionId, 'checkoutSession.sessionId'),\n checkoutUrl: optionalString(raw?.checkoutUrl) ?? undefined,\n hostedUrl: optionalString(raw?.hostedUrl) ?? undefined,\n embedUrl: optionalString(raw?.embedUrl) ?? undefined,\n embedToken: optionalString(raw?.embedToken) ?? undefined,\n expiresAt: optionalString(raw?.expiresAt) ?? undefined,\n };\n}\n\nfunction normalizeCompleteResult(raw: any): CompleteCheckoutSessionResult {\n const orderId = raw?.orderId ?? raw?.id;\n return {\n ...withoutSnakeKeys(raw),\n orderId: requiredString(orderId, 'checkoutComplete.orderId'),\n orderNumber: optionalString(raw?.orderNumber) ?? undefined,\n paymentId: optionalString(raw?.paymentId) ?? undefined,\n total: optionalNumber(raw?.total),\n currency: optionalString(raw?.currency) ?? undefined,\n status: optionalString(raw?.status) ?? undefined,\n paymentStatus: optionalString(raw?.paymentStatus) ?? undefined,\n };\n}\n\nfunction normalizeEmbedToken(raw: any): CreateEmbedTokenResult {\n return {\n ...withoutSnakeKeys(raw),\n embedToken: requiredString(raw?.embedToken, 'embedToken.embedToken'),\n checkoutSessionId: requiredString(raw?.checkoutSessionId, 'embedToken.checkoutSessionId'),\n amount: Number(raw?.amount ?? 0),\n currency: optionalString(raw?.currency) ?? 'USD',\n hostedUrl: optionalString(raw?.hostedUrl) ?? undefined,\n embedUrl: optionalString(raw?.embedUrl) ?? undefined,\n gr4vyId: optionalString(raw?.gr4vyId) ?? undefined,\n merchantAccountId: optionalString(raw?.merchantAccountId) ?? undefined,\n };\n}\n\nfunction normalizeOrder(raw: any): CheckoutOrder {\n return {\n ...withoutSnakeKeys(raw),\n id: requiredString(raw?.id, 'order.id'),\n orderNumber: optionalString(raw?.orderNumber) ?? undefined,\n status: optionalString(raw?.status) ?? 'processing',\n paymentStatus: optionalString(raw?.paymentStatus),\n currency: optionalString(raw?.currency) ?? 'USD',\n subtotal: Number(raw?.subtotal ?? 0),\n taxTotal: Number(raw?.taxTotal ?? 0),\n shippingTotal: Number(raw?.shippingTotal ?? 0),\n total: Number(raw?.total ?? 0),\n metadata: objectOrUndefined(raw?.metadata),\n payments: Array.isArray(raw?.payments) ? raw.payments.map(normalizePayment) : undefined,\n };\n}\n\nfunction normalizePayment(raw: any): CheckoutPayment {\n return {\n ...withoutSnakeKeys(raw),\n id: requiredString(raw?.id, 'payment.id'),\n orderId: optionalString(raw?.orderId) ?? undefined,\n processor: optionalString(raw?.processor) ?? undefined,\n processorTransactionId:\n optionalString(raw?.processorTransactionId) ?? undefined,\n amount: optionalNumber(raw?.amount),\n currency: optionalString(raw?.currency) ?? undefined,\n status: optionalString(raw?.status) ?? undefined,\n method: optionalString(raw?.method) ?? undefined,\n createdAt: optionalString(raw?.createdAt) ?? undefined,\n transactions: Array.isArray(raw?.transactions)\n ? raw.transactions.map(normalizeTransaction)\n : undefined,\n };\n}\n\nfunction normalizeTransaction(raw: any): CheckoutPaymentTransaction {\n return {\n ...withoutSnakeKeys(raw),\n id: requiredString(raw?.id, 'transaction.id'),\n paymentId: optionalString(raw?.paymentId) ?? undefined,\n type: optionalString(raw?.type) ?? undefined,\n amount: optionalNumber(raw?.amount),\n currency: optionalString(raw?.currency) ?? undefined,\n status: optionalString(raw?.status) ?? undefined,\n createdAt: optionalString(raw?.createdAt) ?? undefined,\n };\n}\n\nfunction withoutSnakeKeys(value: unknown): Record<string, unknown> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return {};\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).filter(([key]) => !key.includes('_')),\n );\n}\n\nfunction requiredString(value: unknown, label: string): string {\n if (typeof value === 'string' && value.length > 0) return value;\n throw new Error(`Invalid Throttle response: missing ${label}`);\n}\n\nfunction optionalString(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction optionalNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\nfunction objectOrUndefined(value: unknown): Record<string, unknown> | undefined {\n return value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n"],"mappings":"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","names":["ThrottleError"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@usethrottle/checkout-sdk",
3
- "version": "1.2.0",
3
+ "version": "1.4.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",
@@ -27,7 +27,8 @@
27
27
  "react-dom": ">=18 <20"
28
28
  },
29
29
  "dependencies": {
30
- "@usethrottle/checkout-react": "1.0.1"
30
+ "@usethrottle/checkout-react": "1.2.0",
31
+ "@usethrottle/errors": "^1.0.0"
31
32
  },
32
33
  "devDependencies": {
33
34
  "@testing-library/react": "^16.0.0",