@paygood1/collect-core 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +30 -9
  2. package/dist/adapters/basistheory/customer-details-mount.d.ts +18 -0
  3. package/dist/adapters/basistheory/customer-details-mount.d.ts.map +1 -0
  4. package/dist/adapters/basistheory/customer-details-mount.js +282 -0
  5. package/dist/adapters/basistheory/customer-details-mount.js.map +1 -0
  6. package/dist/adapters/basistheory/prepare-mount-root.d.ts +8 -0
  7. package/dist/adapters/basistheory/prepare-mount-root.d.ts.map +1 -0
  8. package/dist/adapters/basistheory/prepare-mount-root.js +34 -0
  9. package/dist/adapters/basistheory/prepare-mount-root.js.map +1 -0
  10. package/dist/adapters/basistheory/provider.d.ts +2 -2
  11. package/dist/adapters/basistheory/provider.d.ts.map +1 -1
  12. package/dist/adapters/basistheory/provider.js +58 -38
  13. package/dist/adapters/basistheory/provider.js.map +1 -1
  14. package/dist/core/card-collect-core.d.ts +4 -2
  15. package/dist/core/card-collect-core.d.ts.map +1 -1
  16. package/dist/core/card-collect-core.js +12 -6
  17. package/dist/core/card-collect-core.js.map +1 -1
  18. package/dist/customer-details/mount.d.ts +18 -0
  19. package/dist/customer-details/mount.d.ts.map +1 -0
  20. package/dist/customer-details/mount.js +282 -0
  21. package/dist/customer-details/mount.js.map +1 -0
  22. package/dist/customer-details/regions.d.ts +18 -0
  23. package/dist/customer-details/regions.d.ts.map +1 -0
  24. package/dist/customer-details/regions.js +79 -0
  25. package/dist/customer-details/regions.js.map +1 -0
  26. package/dist/customer-details/types.d.ts +24 -0
  27. package/dist/customer-details/types.d.ts.map +1 -0
  28. package/dist/customer-details/types.js +57 -0
  29. package/dist/customer-details/types.js.map +1 -0
  30. package/dist/index.d.ts +7 -1
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +4 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/ports/tokenization-provider.d.ts +2 -2
  35. package/dist/ports/tokenization-provider.d.ts.map +1 -1
  36. package/dist/runtime/element-manager.d.ts +6 -2
  37. package/dist/runtime/element-manager.d.ts.map +1 -1
  38. package/dist/runtime/element-manager.js +28 -2
  39. package/dist/runtime/element-manager.js.map +1 -1
  40. package/dist/runtime/prepare-mount-root.d.ts +8 -0
  41. package/dist/runtime/prepare-mount-root.d.ts.map +1 -0
  42. package/dist/runtime/prepare-mount-root.js +35 -0
  43. package/dist/runtime/prepare-mount-root.js.map +1 -0
  44. package/dist/runtime/tokenize.d.ts +2 -2
  45. package/dist/runtime/tokenize.d.ts.map +1 -1
  46. package/dist/runtime/tokenize.js +2 -2
  47. package/dist/runtime/tokenize.js.map +1 -1
  48. package/dist/types.d.ts +23 -3
  49. package/dist/types.d.ts.map +1 -1
  50. package/dist/types.js +2 -0
  51. package/dist/types.js.map +1 -1
  52. package/dist/validation/config.d.ts +1 -0
  53. package/dist/validation/config.d.ts.map +1 -1
  54. package/dist/validation/config.js +10 -1
  55. package/dist/validation/config.js.map +1 -1
  56. package/package.json +2 -2
package/README.md CHANGED
@@ -112,14 +112,24 @@ const core = await createCardCollectCore(
112
112
  },
113
113
  {
114
114
  onReady: () => console.log("ready"),
115
- onTokenized: (result) => console.log(result.tokenId),
115
+ onTokenized: (result) => {
116
+ if (result.kind === "token_intent") {
117
+ console.log(result.tokenIntentId);
118
+ } else {
119
+ console.log(result.tokenId);
120
+ }
121
+ },
116
122
  onError: (error) => console.error(error)
117
123
  }
118
124
  );
119
125
 
120
126
  await core.mount({ targetId: "card-element-target" });
121
- const token = await core.tokenize();
122
- console.log(token.tokenId);
127
+
128
+ // One-off checkout: create a short-lived token intent (default)
129
+ const intent = await core.tokenize({ saveCard: false });
130
+
131
+ // Save card on file or subscription checkout: create a persistent token
132
+ const token = await core.tokenize({ saveCard: true });
123
133
  ```
124
134
 
125
135
  Bank account example:
@@ -146,16 +156,27 @@ await bankCore.mount({ targetId: "bank-element-target" });
146
156
 
147
157
  ## Tokenization result
148
158
 
149
- `core.tokenize()` and `onTokenized` receive a `TokenizationResult`:
159
+ `core.tokenize({ saveCard })` and `onTokenized` receive a discriminated
160
+ `TokenizationResult`:
150
161
 
151
162
  ```ts
152
- interface TokenizationResult {
153
- tokenId: string;
154
- fingerprint: string;
155
- type: "card" | "bank_account";
156
- }
163
+ type TokenizationResult =
164
+ | { kind: "token"; tokenId: string; fingerprint: string; type: "card" | "bank_account" }
165
+ | {
166
+ kind: "token_intent";
167
+ tokenIntentId: string;
168
+ fingerprint: string;
169
+ type: "card" | "bank_account";
170
+ };
157
171
  ```
158
172
 
173
+ Pass `saveCard: false` (default for one-off checkouts) to create a short-lived
174
+ token intent via Basis Theory. Pass `saveCard: true` when the payment method
175
+ should be stored on the customer (subscriptions, explicit save-card opt-in).
176
+
177
+ Your backend should charge one-off payments using `tokenIntentId` and store
178
+ saved payment methods using `tokenId`.
179
+
159
180
  `instrument` is an optional field you can pass in the `createCardCollectCore` init config object; it defaults to `"card"` when omitted.
160
181
 
161
182
  `allowedBankCountries` is optional and only applies when `instrument` is
@@ -0,0 +1,18 @@
1
+ import { type CustomerDetails } from "../../customer-details/types";
2
+ export interface CustomerDetailsMountOptions {
3
+ defaultBillingAddressExpanded?: boolean;
4
+ defaultCustomerDetails?: Partial<CustomerDetails>;
5
+ disabled?: boolean;
6
+ }
7
+ export interface CustomerDetailsMountCallbacks {
8
+ onChange?: (payload: unknown) => void;
9
+ onCustomerDetailsChange?: (details: CustomerDetails) => void;
10
+ }
11
+ export interface CustomerDetailsHandle {
12
+ getValue: () => CustomerDetails;
13
+ isComplete: () => boolean;
14
+ setDisabled: (disabled: boolean) => void;
15
+ cleanup: () => void;
16
+ }
17
+ export declare function mountCustomerDetailsSection(container: HTMLElement, options: CustomerDetailsMountOptions, callbacks: CustomerDetailsMountCallbacks): CustomerDetailsHandle;
18
+ //# sourceMappingURL=customer-details-mount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customer-details-mount.d.ts","sourceRoot":"","sources":["../../../src/adapters/basistheory/customer-details-mount.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,eAAe,EACrB,MAAM,8BAA8B,CAAC;AA4BtC,MAAM,WAAW,2BAA2B;IAC1C,6BAA6B,CAAC,EAAE,OAAO,CAAC;IACxC,sBAAsB,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,uBAAuB,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;CAC9D;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,eAAe,CAAC;IAChC,UAAU,EAAE,MAAM,OAAO,CAAC;IAC1B,WAAW,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE,2BAA2B,EACpC,SAAS,EAAE,6BAA6B,GACvC,qBAAqB,CAkSvB"}
@@ -0,0 +1,282 @@
1
+ import { createEmptyCustomerDetails, formatBillingAddressSummary, getBillingFieldLabels, isCustomerDetailsComplete } from "../../customer-details/types";
2
+ import { getBillingCountryOptions, getRegionOptions } from "../../customer-details/regions";
3
+ const FIELD_GAP = "0.625rem";
4
+ const INPUT_STYLE = {
5
+ width: "100%",
6
+ border: "1px solid #d0d5dd",
7
+ borderRadius: "10px",
8
+ background: "#ffffff",
9
+ padding: "10px 12px",
10
+ fontSize: "16px",
11
+ fontWeight: "500",
12
+ color: "#101828",
13
+ boxShadow: "inset 0 1px 2px rgba(16,24,40,0.05)",
14
+ boxSizing: "border-box"
15
+ };
16
+ function applyInputStyle(element) {
17
+ Object.assign(element.style, INPUT_STYLE);
18
+ }
19
+ function applySelectStyle(element, muted) {
20
+ applyInputStyle(element);
21
+ element.style.cursor = "pointer";
22
+ element.style.color = muted ? "#98a2b3" : "#101828";
23
+ }
24
+ export function mountCustomerDetailsSection(container, options, callbacks) {
25
+ let value = createEmptyCustomerDetails(options.defaultCustomerDetails);
26
+ const labels = () => getBillingFieldLabels(value.billingAddress.country);
27
+ const regionOptions = () => getRegionOptions(value.billingAddress.country);
28
+ const root = document.createElement("div");
29
+ root.dataset.paygoodCardCollect = "customer-details";
30
+ Object.assign(root.style, {
31
+ display: "flex",
32
+ flexDirection: "column",
33
+ gap: FIELD_GAP,
34
+ marginBottom: "0.75rem"
35
+ });
36
+ const fullNameInput = document.createElement("input");
37
+ fullNameInput.id = "paygood-customer-full-name";
38
+ fullNameInput.dataset.paygoodCardCollect = "customer-name";
39
+ fullNameInput.type = "text";
40
+ fullNameInput.autocomplete = "name";
41
+ fullNameInput.placeholder = "Full name";
42
+ fullNameInput.setAttribute("aria-label", "Full name");
43
+ fullNameInput.value = value.fullName;
44
+ applyInputStyle(fullNameInput);
45
+ root.appendChild(fullNameInput);
46
+ const billingDetails = document.createElement("details");
47
+ billingDetails.dataset.paygoodCardCollect = "billing-address";
48
+ billingDetails.open = options.defaultBillingAddressExpanded ?? false;
49
+ Object.assign(billingDetails.style, {
50
+ border: "1px solid #eaecf0",
51
+ borderRadius: "10px",
52
+ padding: "0.625rem 0.875rem",
53
+ background: "#fcfcfd"
54
+ });
55
+ const summary = document.createElement("summary");
56
+ Object.assign(summary.style, {
57
+ cursor: "pointer",
58
+ fontWeight: "600",
59
+ color: "#101828",
60
+ listStylePosition: "outside"
61
+ });
62
+ const summaryTitle = document.createElement("span");
63
+ summaryTitle.textContent = "Billing address";
64
+ summary.appendChild(summaryTitle);
65
+ const summaryPreview = document.createElement("span");
66
+ summaryPreview.dataset.paygoodCardCollect = "billing-address-summary";
67
+ Object.assign(summaryPreview.style, {
68
+ marginLeft: "0.5rem",
69
+ fontWeight: "400",
70
+ color: "#475467"
71
+ });
72
+ summary.appendChild(summaryPreview);
73
+ billingDetails.appendChild(summary);
74
+ const billingFields = document.createElement("div");
75
+ Object.assign(billingFields.style, {
76
+ display: "flex",
77
+ flexDirection: "column",
78
+ gap: FIELD_GAP,
79
+ marginTop: "0.625rem"
80
+ });
81
+ const countrySelect = document.createElement("select");
82
+ countrySelect.id = "paygood-billing-country";
83
+ countrySelect.dataset.paygoodCardCollect = "billing-country";
84
+ countrySelect.setAttribute("aria-label", "Country");
85
+ applySelectStyle(countrySelect, false);
86
+ countrySelect.style.width = "fit-content";
87
+ countrySelect.style.maxWidth = "100%";
88
+ for (const option of getBillingCountryOptions()) {
89
+ const optionElement = document.createElement("option");
90
+ optionElement.value = option.value;
91
+ optionElement.textContent = `${option.flag} ${option.label}`;
92
+ countrySelect.appendChild(optionElement);
93
+ }
94
+ countrySelect.value = value.billingAddress.country;
95
+ billingFields.appendChild(countrySelect);
96
+ const line1Input = document.createElement("input");
97
+ line1Input.id = "paygood-billing-line1";
98
+ line1Input.dataset.paygoodCardCollect = "billing-line1";
99
+ line1Input.type = "text";
100
+ line1Input.autocomplete = "billing address-line1";
101
+ line1Input.placeholder = "Address line 1";
102
+ line1Input.setAttribute("aria-label", "Address line 1");
103
+ applyInputStyle(line1Input);
104
+ billingFields.appendChild(line1Input);
105
+ const line2Input = document.createElement("input");
106
+ line2Input.id = "paygood-billing-line2";
107
+ line2Input.dataset.paygoodCardCollect = "billing-line2";
108
+ line2Input.type = "text";
109
+ line2Input.autocomplete = "billing address-line2";
110
+ line2Input.placeholder = "Address line 2 (optional)";
111
+ line2Input.setAttribute("aria-label", "Address line 2");
112
+ applyInputStyle(line2Input);
113
+ billingFields.appendChild(line2Input);
114
+ const cityInput = document.createElement("input");
115
+ cityInput.id = "paygood-billing-city";
116
+ cityInput.dataset.paygoodCardCollect = "billing-city";
117
+ cityInput.type = "text";
118
+ cityInput.autocomplete = "billing address-level2";
119
+ cityInput.placeholder = "City";
120
+ cityInput.setAttribute("aria-label", "City");
121
+ applyInputStyle(cityInput);
122
+ billingFields.appendChild(cityInput);
123
+ const regionPostalRow = document.createElement("div");
124
+ regionPostalRow.dataset.paygoodCardCollect = "billing-region-postal-row";
125
+ Object.assign(regionPostalRow.style, {
126
+ display: "flex",
127
+ flexWrap: "wrap",
128
+ gap: "12px",
129
+ alignItems: "flex-start"
130
+ });
131
+ const regionWrap = document.createElement("div");
132
+ Object.assign(regionWrap.style, { flex: "1.5 1 160px", minWidth: "0" });
133
+ const regionSelect = document.createElement("select");
134
+ regionSelect.id = "paygood-billing-region";
135
+ regionSelect.dataset.paygoodCardCollect = "billing-region";
136
+ applySelectStyle(regionSelect, true);
137
+ regionWrap.appendChild(regionSelect);
138
+ regionPostalRow.appendChild(regionWrap);
139
+ const postalWrap = document.createElement("div");
140
+ Object.assign(postalWrap.style, { flex: "1 1 120px", minWidth: "0" });
141
+ const postalInput = document.createElement("input");
142
+ postalInput.id = "paygood-billing-postal-code";
143
+ postalInput.dataset.paygoodCardCollect = "billing-postal-code";
144
+ postalInput.type = "text";
145
+ postalInput.autocomplete = "billing postal-code";
146
+ applyInputStyle(postalInput);
147
+ postalWrap.appendChild(postalInput);
148
+ regionPostalRow.appendChild(postalWrap);
149
+ billingFields.appendChild(regionPostalRow);
150
+ billingDetails.appendChild(billingFields);
151
+ root.appendChild(billingDetails);
152
+ container.appendChild(root);
153
+ function rebuildRegionSelect() {
154
+ const fieldLabels = labels();
155
+ regionSelect.setAttribute("aria-label", fieldLabels.region);
156
+ regionSelect.innerHTML = "";
157
+ const placeholder = document.createElement("option");
158
+ placeholder.value = "";
159
+ placeholder.textContent = fieldLabels.region;
160
+ regionSelect.appendChild(placeholder);
161
+ for (const option of regionOptions()) {
162
+ const optionElement = document.createElement("option");
163
+ optionElement.value = option.code;
164
+ optionElement.textContent = option.label;
165
+ regionSelect.appendChild(optionElement);
166
+ }
167
+ regionSelect.value = value.billingAddress.region;
168
+ applySelectStyle(regionSelect, !value.billingAddress.region);
169
+ }
170
+ function updateSummaryPreview() {
171
+ const preview = formatBillingAddressSummary(value.billingAddress);
172
+ if (billingDetails.open || !preview) {
173
+ summaryPreview.textContent = "";
174
+ summaryPreview.hidden = true;
175
+ return;
176
+ }
177
+ summaryPreview.textContent = `· ${preview}`;
178
+ summaryPreview.hidden = false;
179
+ }
180
+ function syncInputsFromValue() {
181
+ fullNameInput.value = value.fullName;
182
+ countrySelect.value = value.billingAddress.country;
183
+ line1Input.value = value.billingAddress.line1;
184
+ line2Input.value = value.billingAddress.line2;
185
+ cityInput.value = value.billingAddress.city;
186
+ rebuildRegionSelect();
187
+ postalInput.placeholder = labels().postalCode;
188
+ postalInput.setAttribute("aria-label", labels().postalCode);
189
+ postalInput.value = value.billingAddress.postalCode;
190
+ updateSummaryPreview();
191
+ }
192
+ function emitChange(field) {
193
+ const complete = isCustomerDetailsComplete(value);
194
+ callbacks.onCustomerDetailsChange?.(value);
195
+ callbacks.onChange?.({
196
+ field,
197
+ payload: { value, isComplete: complete }
198
+ });
199
+ callbacks.onChange?.({
200
+ field: "customer_details",
201
+ payload: { value, isComplete: complete }
202
+ });
203
+ }
204
+ function updateBillingAddress(patch) {
205
+ value = {
206
+ ...value,
207
+ billingAddress: {
208
+ ...value.billingAddress,
209
+ ...patch
210
+ }
211
+ };
212
+ syncInputsFromValue();
213
+ emitChange("billing_address");
214
+ }
215
+ billingDetails.addEventListener("toggle", updateSummaryPreview);
216
+ syncInputsFromValue();
217
+ fullNameInput.addEventListener("input", () => {
218
+ value = { ...value, fullName: fullNameInput.value };
219
+ emitChange("full_name");
220
+ });
221
+ countrySelect.addEventListener("change", () => {
222
+ updateBillingAddress({
223
+ country: countrySelect.value,
224
+ region: ""
225
+ });
226
+ emitChange("billing_country");
227
+ });
228
+ line1Input.addEventListener("input", () => {
229
+ updateBillingAddress({ line1: line1Input.value });
230
+ emitChange("billing_line1");
231
+ });
232
+ line2Input.addEventListener("input", () => {
233
+ updateBillingAddress({ line2: line2Input.value });
234
+ emitChange("billing_line2");
235
+ });
236
+ cityInput.addEventListener("input", () => {
237
+ updateBillingAddress({ city: cityInput.value });
238
+ emitChange("billing_city");
239
+ });
240
+ regionSelect.addEventListener("change", () => {
241
+ updateBillingAddress({ region: regionSelect.value });
242
+ applySelectStyle(regionSelect, !regionSelect.value);
243
+ emitChange("billing_region");
244
+ });
245
+ postalInput.addEventListener("input", () => {
246
+ updateBillingAddress({ postalCode: postalInput.value });
247
+ emitChange("billing_postal_code");
248
+ });
249
+ const disabled = options.disabled ?? false;
250
+ for (const element of [
251
+ fullNameInput,
252
+ countrySelect,
253
+ line1Input,
254
+ line2Input,
255
+ cityInput,
256
+ regionSelect,
257
+ postalInput
258
+ ]) {
259
+ element.disabled = disabled;
260
+ }
261
+ return {
262
+ getValue: () => value,
263
+ isComplete: () => isCustomerDetailsComplete(value),
264
+ setDisabled: (nextDisabled) => {
265
+ for (const element of [
266
+ fullNameInput,
267
+ countrySelect,
268
+ line1Input,
269
+ line2Input,
270
+ cityInput,
271
+ regionSelect,
272
+ postalInput
273
+ ]) {
274
+ element.disabled = nextDisabled;
275
+ }
276
+ },
277
+ cleanup: () => {
278
+ root.remove();
279
+ }
280
+ };
281
+ }
282
+ //# sourceMappingURL=customer-details-mount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customer-details-mount.js","sourceRoot":"","sources":["../../../src/adapters/basistheory/customer-details-mount.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { CollectCoreConfig, CollectCoreEvents } from "../../types";
2
+ import { type CustomerDetailsHandle } from "./customer-details-mount";
3
+ export interface PreparedMountRoot {
4
+ paymentRoot: HTMLElement;
5
+ customerDetailsHandle: CustomerDetailsHandle | null;
6
+ }
7
+ export declare function prepareMountRoot(parent: HTMLElement, config: CollectCoreConfig, events: Pick<CollectCoreEvents, "onChange" | "onCustomerDetailsChange">): PreparedMountRoot;
8
+ //# sourceMappingURL=prepare-mount-root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare-mount-root.d.ts","sourceRoot":"","sources":["../../../src/adapters/basistheory/prepare-mount-root.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,WAAW,CAAC;IACzB,qBAAqB,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACrD;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,UAAU,GAAG,yBAAyB,CAAC,GACtE,iBAAiB,CAuCnB"}
@@ -0,0 +1,34 @@
1
+ import { mountCustomerDetailsSection } from "./customer-details-mount";
2
+ export function prepareMountRoot(parent, config, events) {
3
+ parent.innerHTML = "";
4
+ const outerWrapper = document.createElement("div");
5
+ Object.assign(outerWrapper.style, {
6
+ display: "flex",
7
+ flexDirection: "column",
8
+ gap: "0.75rem",
9
+ width: "100%",
10
+ maxWidth: "100%",
11
+ boxSizing: "border-box"
12
+ });
13
+ let customerDetailsHandle = null;
14
+ if (config.collectCustomerDetails !== false) {
15
+ customerDetailsHandle = mountCustomerDetailsSection(outerWrapper, {
16
+ defaultBillingAddressExpanded: config.defaultBillingAddressExpanded,
17
+ defaultCustomerDetails: config.defaultCustomerDetails
18
+ }, {
19
+ onChange: events.onChange,
20
+ onCustomerDetailsChange: events.onCustomerDetailsChange
21
+ });
22
+ }
23
+ const paymentRoot = document.createElement("div");
24
+ paymentRoot.dataset.paygoodCardCollect = "payment-fields";
25
+ Object.assign(paymentRoot.style, {
26
+ width: "100%",
27
+ maxWidth: "100%",
28
+ boxSizing: "border-box"
29
+ });
30
+ outerWrapper.appendChild(paymentRoot);
31
+ parent.appendChild(outerWrapper);
32
+ return { paymentRoot, customerDetailsHandle };
33
+ }
34
+ //# sourceMappingURL=prepare-mount-root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare-mount-root.js","sourceRoot":"","sources":["../../../src/adapters/basistheory/prepare-mount-root.ts"],"names":[],"mappings":"AACA,OAAO,EACL,2BAA2B,EAE5B,MAAM,0BAA0B,CAAC;AAOlC,MAAM,UAAU,gBAAgB,CAC9B,MAAmB,EACnB,MAAyB,EACzB,MAAuE;IAEvE,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC;IAEtB,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE;QAChC,OAAO,EAAE,MAAM;QACf,aAAa,EAAE,QAAQ;QACvB,GAAG,EAAE,SAAS;QACd,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,YAAY;KACxB,CAAC,CAAC;IAEH,IAAI,qBAAqB,GAAiC,IAAI,CAAC;IAC/D,IAAI,MAAM,CAAC,sBAAsB,KAAK,KAAK,EAAE,CAAC;QAC5C,qBAAqB,GAAG,2BAA2B,CACjD,YAAY,EACZ;YACE,6BAA6B,EAAE,MAAM,CAAC,6BAA6B;YACnE,sBAAsB,EAAE,MAAM,CAAC,sBAAsB;SACtD,EACD;YACE,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,uBAAuB,EAAE,MAAM,CAAC,uBAAuB;SACxD,CACF,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAClD,WAAW,CAAC,OAAO,CAAC,kBAAkB,GAAG,gBAAgB,CAAC;IAC1D,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE;QAC/B,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,YAAY;KACxB,CAAC,CAAC;IACH,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IACtC,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAEjC,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC;AAChD,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { ElementProviderPort, MountedInstrument } from "../../ports/element-provider";
2
2
  import type { TokenizationProviderPort } from "../../ports/tokenization-provider";
3
- import type { CollectCoreConfig, InstrumentHandle, MountOptions, TokenizationResult } from "../../types";
3
+ import type { CollectCoreConfig, InstrumentHandle, MountOptions, TokenizationResult, TokenizeOptions } from "../../types";
4
4
  export declare class BasisTheoryAdapter implements ElementProviderPort, TokenizationProviderPort {
5
5
  private btClient;
6
6
  private config;
@@ -9,6 +9,6 @@ export declare class BasisTheoryAdapter implements ElementProviderPort, Tokeniza
9
9
  private createElementWithFallback;
10
10
  initialize(config: CollectCoreConfig): Promise<void>;
11
11
  mount(options: MountOptions): Promise<MountedInstrument>;
12
- tokenize(handle: InstrumentHandle): Promise<TokenizationResult>;
12
+ tokenize(handle: InstrumentHandle, options: TokenizeOptions): Promise<TokenizationResult>;
13
13
  }
14
14
  //# sourceMappingURL=provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/adapters/basistheory/provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAC3F,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EAGZ,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAgKrB,qBAAa,kBAAmB,YAAW,mBAAmB,EAAE,wBAAwB;IACtF,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,OAAO,CAAmD;IAClE,OAAO,CAAC,SAAS,CAAK;IAEtB,OAAO,CAAC,yBAAyB;IAwB3B,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAapD,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAuRxD,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAgDtE"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/adapters/basistheory/provider.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAC3F,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EAGZ,kBAAkB,EAClB,eAAe,EAChB,MAAM,aAAa,CAAC;AA2MrB,qBAAa,kBAAmB,YAAW,mBAAmB,EAAE,wBAAwB;IACtF,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,OAAO,CAAmD;IAClE,OAAO,CAAC,SAAS,CAAK;IAEtB,OAAO,CAAC,yBAAyB;IAwB3B,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAapD,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAgRxD,QAAQ,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;CA8ChG"}
@@ -60,12 +60,44 @@ function resolveFingerprintExpression(instrument, element) {
60
60
  }
61
61
  return "{{ data }}";
62
62
  }
63
+ function buildTokenizationPayload(instrument, element) {
64
+ const bankComposite = getBankComposite(element);
65
+ const cardComposite = isCompositeElement(element) && element.tokenType === "card" ? element : null;
66
+ return {
67
+ type: bankComposite
68
+ ? bankComposite.tokenType
69
+ : cardComposite
70
+ ? cardComposite.tokenType
71
+ : toBasisTheoryTokenType(instrument),
72
+ data: bankComposite
73
+ ? bankComposite.elements.reduce((acc, current) => {
74
+ acc[current.field] = current.element;
75
+ return acc;
76
+ }, {})
77
+ : cardComposite
78
+ ? buildCardTokenData(cardComposite.elements)
79
+ : element,
80
+ fingerprintExpression: resolveFingerprintExpression(instrument, element),
81
+ ...(bankComposite?.metadata ? { metadata: bankComposite.metadata } : {})
82
+ };
83
+ }
63
84
  function toMountSelector(targetId) {
64
85
  if (targetId.startsWith("#") || targetId.startsWith(".") || targetId.startsWith("[")) {
65
86
  return targetId;
66
87
  }
67
88
  return `#${targetId}`;
68
89
  }
90
+ function resolvePaymentParent(options) {
91
+ if (options.paymentMount) {
92
+ return options.paymentMount;
93
+ }
94
+ const parent = document.querySelector(toMountSelector(options.targetId));
95
+ if (!parent) {
96
+ throw new Error(`Mount container not found: ${options.targetId}`);
97
+ }
98
+ parent.innerHTML = "";
99
+ return parent;
100
+ }
69
101
  function isCompositeElement(element) {
70
102
  return element.kind === "composite";
71
103
  }
@@ -135,10 +167,7 @@ export class BasisTheoryAdapter {
135
167
  let mountedElement;
136
168
  if (instrument === "bank_account") {
137
169
  const isMobileViewport = window.matchMedia("(max-width: 640px)").matches;
138
- const parent = document.querySelector(toMountSelector(options.targetId));
139
- if (!parent) {
140
- throw new Error(`Mount container not found: ${options.targetId}`);
141
- }
170
+ const paymentRoot = resolvePaymentParent(options);
142
171
  const wrapper = document.createElement("div");
143
172
  wrapper.style.display = "grid";
144
173
  wrapper.style.gap = "12px";
@@ -160,7 +189,7 @@ export class BasisTheoryAdapter {
160
189
  },
161
190
  changeCallbacks: [],
162
191
  cleanup: () => {
163
- parent.innerHTML = "";
192
+ paymentRoot.innerHTML = "";
164
193
  }
165
194
  };
166
195
  const remountBankFields = async (nextMarket) => {
@@ -196,17 +225,12 @@ export class BasisTheoryAdapter {
196
225
  wrapper.appendChild(countrySelect);
197
226
  }
198
227
  wrapper.appendChild(fieldsContainer);
199
- parent.innerHTML = "";
200
- parent.appendChild(wrapper);
228
+ paymentRoot.appendChild(wrapper);
201
229
  bankShell.composite = await mountBankFieldsForMarket(bankMarket, fieldsContainer, this.btClient, options.options ?? {}, uniqueId);
202
230
  mountedElement = bankShell;
203
231
  }
204
232
  else if (instrument === "card") {
205
- const parent = document.querySelector(toMountSelector(options.targetId));
206
- if (!parent) {
207
- throw new Error(`Mount container not found: ${options.targetId}`);
208
- }
209
- parent.innerHTML = "";
233
+ const paymentRoot = resolvePaymentParent(options);
210
234
  const isMobileViewport = window.matchMedia("(max-width: 640px)").matches;
211
235
  const wrapper = document.createElement("div");
212
236
  wrapper.style.display = "grid";
@@ -247,7 +271,7 @@ export class BasisTheoryAdapter {
247
271
  wrapper.appendChild(numberHost);
248
272
  wrapper.appendChild(expiryHost);
249
273
  wrapper.appendChild(cvcHost);
250
- parent.appendChild(wrapper);
274
+ paymentRoot.appendChild(wrapper);
251
275
  const cardOptions = (options.options ?? {});
252
276
  const placeholders = (cardOptions.placeholder ?? {});
253
277
  const cardStyle = (cardOptions.style ?? {});
@@ -295,7 +319,7 @@ export class BasisTheoryAdapter {
295
319
  ],
296
320
  tokenType: "card",
297
321
  cleanup: () => {
298
- parent.innerHTML = "";
322
+ paymentRoot.innerHTML = "";
299
323
  }
300
324
  };
301
325
  }
@@ -371,7 +395,7 @@ export class BasisTheoryAdapter {
371
395
  }
372
396
  };
373
397
  }
374
- async tokenize(handle) {
398
+ async tokenize(handle, options) {
375
399
  if (!this.btClient || !this.config) {
376
400
  throw new Error("BasisTheoryAdapter must be initialized before tokenization.");
377
401
  }
@@ -380,35 +404,31 @@ export class BasisTheoryAdapter {
380
404
  if (!element) {
381
405
  throw new Error(`Unknown instrument handle: ${handle.id}`);
382
406
  }
383
- const bankComposite = getBankComposite(element);
384
- const cardComposite = isCompositeElement(element) && element.tokenType === "card" ? element : null;
385
- const response = await this.btClient.tokens.create({
386
- type: bankComposite
387
- ? bankComposite.tokenType
388
- : cardComposite
389
- ? cardComposite.tokenType
390
- : toBasisTheoryTokenType(instrument),
391
- data: bankComposite
392
- ? bankComposite.elements.reduce((acc, current) => {
393
- acc[current.field] = current.element;
394
- return acc;
395
- }, {})
396
- : cardComposite
397
- ? buildCardTokenData(cardComposite.elements)
398
- : element,
399
- fingerprintExpression: resolveFingerprintExpression(instrument, element),
400
- ...(bankComposite?.metadata ? { metadata: bankComposite.metadata } : {})
401
- });
402
- const tokenId = String(response.id ?? "");
403
- if (!tokenId) {
404
- throw new Error("Tokenization succeeded but no token id was returned.");
407
+ const payload = buildTokenizationPayload(instrument, element);
408
+ const response = options.saveCard
409
+ ? await this.btClient.tokens.create(payload)
410
+ : await this.btClient.tokenIntents.create(payload);
411
+ const id = String(response.id ?? "");
412
+ if (!id) {
413
+ throw new Error(options.saveCard
414
+ ? "Tokenization succeeded but no token id was returned."
415
+ : "Tokenization succeeded but no token intent id was returned.");
405
416
  }
406
417
  const fingerprint = String(response.fingerprint ?? "");
407
418
  if (!fingerprint) {
408
419
  throw new Error("Tokenization succeeded but no fingerprint was returned.");
409
420
  }
421
+ if (options.saveCard) {
422
+ return {
423
+ kind: "token",
424
+ tokenId: id,
425
+ fingerprint,
426
+ type: instrument
427
+ };
428
+ }
410
429
  return {
411
- tokenId,
430
+ kind: "token_intent",
431
+ tokenIntentId: id,
412
432
  fingerprint,
413
433
  type: instrument
414
434
  };