@basis-theory/web-elements 3.0.0-beta.4 → 3.0.0-beta.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.vite/manifest.json +22 -11
- package/dist/basis-theory-sdk.es.js +2 -2
- package/dist/basis-theory-sdk.umd.js +1 -1
- package/dist/basis-theory-sdk.umd.js.map +1 -1
- package/dist/{create-card-B5zEHyRg.js → create-card-C0MwL3Ou.js} +21 -14
- package/dist/create-card-C0MwL3Ou.js.map +1 -0
- package/dist/create-card-display-DscvxIs4.js +291 -0
- package/dist/create-card-display-DscvxIs4.js.map +1 -0
- package/dist/{create-copy-button-DrAz8g0m.js → create-copy-button-DlJ3VvAn.js} +40 -12
- package/dist/create-copy-button-DlJ3VvAn.js.map +1 -0
- package/dist/{index-BOedIhUN.js → index-DPhSs28B.js} +432 -121
- package/dist/index-DPhSs28B.js.map +1 -0
- package/dist/index.d.ts +1133 -0
- package/dist/loader/basis-theory.min.js +1 -1
- package/dist/sri.json +9 -9
- package/dist/stats.html +1 -1
- package/package.json +12 -12
- package/dist/api-client/src/api-client.d.ts +0 -11
- package/dist/api-client/src/api-client.d.ts.map +0 -1
- package/dist/api-client/src/bin-lookup-transform.d.ts +0 -35
- package/dist/api-client/src/bin-lookup-transform.d.ts.map +0 -1
- package/dist/api-client/src/http-client.d.ts +0 -24
- package/dist/api-client/src/http-client.d.ts.map +0 -1
- package/dist/api-client/src/index.d.ts +0 -9
- package/dist/api-client/src/index.d.ts.map +0 -1
- package/dist/api-client/src/services/sessions.d.ts +0 -19
- package/dist/api-client/src/services/sessions.d.ts.map +0 -1
- package/dist/api-client/src/services/token-intents.d.ts +0 -17
- package/dist/api-client/src/services/token-intents.d.ts.map +0 -1
- package/dist/api-client/src/services/tokens.d.ts +0 -19
- package/dist/api-client/src/services/tokens.d.ts.map +0 -1
- package/dist/api-client/src/types.d.ts +0 -421
- package/dist/api-client/src/types.d.ts.map +0 -1
- package/dist/create-card-B5zEHyRg.js.map +0 -1
- package/dist/create-copy-button-DrAz8g0m.js.map +0 -1
- package/dist/index-BOedIhUN.js.map +0 -1
- package/dist/postmessage/src/client.d.ts +0 -7
- package/dist/postmessage/src/client.d.ts.map +0 -1
- package/dist/postmessage/src/event-map.d.ts +0 -139
- package/dist/postmessage/src/event-map.d.ts.map +0 -1
- package/dist/postmessage/src/index.d.ts +0 -9
- package/dist/postmessage/src/index.d.ts.map +0 -1
- package/dist/postmessage/src/server.d.ts +0 -11
- package/dist/postmessage/src/server.d.ts.map +0 -1
- package/dist/postmessage/src/types.d.ts +0 -75
- package/dist/postmessage/src/types.d.ts.map +0 -1
- package/dist/shared/src/api-url-resolver.d.ts +0 -22
- package/dist/shared/src/api-url-resolver.d.ts.map +0 -1
- package/dist/shared/src/debug-logger.d.ts +0 -16
- package/dist/shared/src/debug-logger.d.ts.map +0 -1
- package/dist/shared/src/deep-sanitization.d.ts +0 -24
- package/dist/shared/src/deep-sanitization.d.ts.map +0 -1
- package/dist/shared/src/errors.d.ts +0 -93
- package/dist/shared/src/errors.d.ts.map +0 -1
- package/dist/shared/src/generate-id.d.ts +0 -13
- package/dist/shared/src/generate-id.d.ts.map +0 -1
- package/dist/shared/src/index.d.ts +0 -14
- package/dist/shared/src/index.d.ts.map +0 -1
- package/dist/shared/src/logger-context.d.ts +0 -25
- package/dist/shared/src/logger-context.d.ts.map +0 -1
- package/dist/shared/src/proxy-validation.d.ts +0 -93
- package/dist/shared/src/proxy-validation.d.ts.map +0 -1
- package/dist/web-elements/src/BasisTheory.d.ts +0 -47
- package/dist/web-elements/src/BasisTheory.d.ts.map +0 -1
- package/dist/web-elements/src/basis-theory.d.ts +0 -85
- package/dist/web-elements/src/basis-theory.d.ts.map +0 -1
- package/dist/web-elements/src/elements/create-card-number.d.ts +0 -15
- package/dist/web-elements/src/elements/create-card-number.d.ts.map +0 -1
- package/dist/web-elements/src/elements/create-card.d.ts +0 -50
- package/dist/web-elements/src/elements/create-card.d.ts.map +0 -1
- package/dist/web-elements/src/elements/create-copy-button.d.ts +0 -19
- package/dist/web-elements/src/elements/create-copy-button.d.ts.map +0 -1
- package/dist/web-elements/src/elements/create-cvv.d.ts +0 -11
- package/dist/web-elements/src/elements/create-cvv.d.ts.map +0 -1
- package/dist/web-elements/src/elements/create-expiry.d.ts +0 -11
- package/dist/web-elements/src/elements/create-expiry.d.ts.map +0 -1
- package/dist/web-elements/src/elements/create-text.d.ts +0 -14
- package/dist/web-elements/src/elements/create-text.d.ts.map +0 -1
- package/dist/web-elements/src/index.d.ts +0 -27
- package/dist/web-elements/src/index.d.ts.map +0 -1
- package/dist/web-elements/src/mounter/create-mounter.d.ts +0 -11
- package/dist/web-elements/src/mounter/create-mounter.d.ts.map +0 -1
- package/dist/web-elements/src/theme/default-theme.d.ts +0 -22
- package/dist/web-elements/src/theme/default-theme.d.ts.map +0 -1
- package/dist/web-elements/src/theme/inject-theme-dark.d.ts +0 -13
- package/dist/web-elements/src/theme/inject-theme-dark.d.ts.map +0 -1
- package/dist/web-elements/src/theme/inject-theme.d.ts +0 -20
- package/dist/web-elements/src/theme/inject-theme.d.ts.map +0 -1
- package/dist/web-elements/src/types/events.d.ts +0 -165
- package/dist/web-elements/src/types/events.d.ts.map +0 -1
- package/dist/web-elements/src/types/theme.d.ts +0 -91
- package/dist/web-elements/src/types/theme.d.ts.map +0 -1
- package/dist/web-elements/src/types.d.ts +0 -667
- package/dist/web-elements/src/types.d.ts.map +0 -1
- package/dist/web-elements/src/utils/create-event-dispatcher.d.ts +0 -47
- package/dist/web-elements/src/utils/create-event-dispatcher.d.ts.map +0 -1
- package/dist/web-elements/src/utils/create-iframe.d.ts +0 -10
- package/dist/web-elements/src/utils/create-iframe.d.ts.map +0 -1
- package/dist/web-elements/src/utils/resolve-element-references.d.ts +0 -20
- package/dist/web-elements/src/utils/resolve-element-references.d.ts.map +0 -1
- package/dist/web-elements/src/utils/validate-element-options.d.ts +0 -11
- package/dist/web-elements/src/utils/validate-element-options.d.ts.map +0 -1
- package/dist/web-elements/src/utils/validate-sdk-config.d.ts +0 -15
- package/dist/web-elements/src/utils/validate-sdk-config.d.ts.map +0 -1
- package/dist/web-elements/src/utils/warn-unknown-keys.d.ts +0 -15
- package/dist/web-elements/src/utils/warn-unknown-keys.d.ts.map +0 -1
- package/dist/web-elements/src/version.d.ts +0 -25
- package/dist/web-elements/src/version.d.ts.map +0 -1
|
@@ -1,421 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* BasisTheory API Client Types
|
|
3
|
-
*
|
|
4
|
-
* Type definitions for HTTP client, tokenization, and BIN lookup services
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Network connection information (Navigator.connection)
|
|
8
|
-
* Note: Not available in Safari/Firefox
|
|
9
|
-
*/
|
|
10
|
-
export interface NetworkInformation {
|
|
11
|
-
/** Connection type: '4g', '3g', '2g', 'slow-2g' */
|
|
12
|
-
effectiveType?: string;
|
|
13
|
-
/** Round-trip time in milliseconds */
|
|
14
|
-
rtt?: number;
|
|
15
|
-
/** Downlink speed in Mbps */
|
|
16
|
-
downlink?: number;
|
|
17
|
-
/** Data saver mode enabled */
|
|
18
|
-
saveData?: boolean;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Device information for fraud detection and 3DS
|
|
22
|
-
* Collected by coordinator and sent via BT-DEVICE-INFO header
|
|
23
|
-
*/
|
|
24
|
-
export interface DeviceInfo {
|
|
25
|
-
/** Browser brands and versions */
|
|
26
|
-
uaBrands?: Array<{
|
|
27
|
-
brand: string;
|
|
28
|
-
version: string;
|
|
29
|
-
}>;
|
|
30
|
-
/** Whether device is mobile */
|
|
31
|
-
uaMobile?: boolean;
|
|
32
|
-
/** Platform name */
|
|
33
|
-
uaPlatform?: string;
|
|
34
|
-
/** Preferred languages */
|
|
35
|
-
languages?: string[];
|
|
36
|
-
/** IANA timezone */
|
|
37
|
-
timeZone?: string;
|
|
38
|
-
/** Whether cookies are enabled */
|
|
39
|
-
cookiesEnabled?: boolean;
|
|
40
|
-
/** Whether localStorage is available */
|
|
41
|
-
localStorageEnabled?: boolean;
|
|
42
|
-
/** Whether sessionStorage is available */
|
|
43
|
-
sessionStorageEnabled?: boolean;
|
|
44
|
-
/** Platform string (navigator.platform) */
|
|
45
|
-
platform?: string;
|
|
46
|
-
/** Number of logical processors */
|
|
47
|
-
hardwareConcurrency?: number;
|
|
48
|
-
/** Device memory in GB (may be null if not available) */
|
|
49
|
-
deviceMemoryGb?: number | null;
|
|
50
|
-
/** Maximum touch points supported */
|
|
51
|
-
maxTouchPoints?: number;
|
|
52
|
-
/** Screen width in pixels */
|
|
53
|
-
screenWidth?: number;
|
|
54
|
-
/** Screen height in pixels */
|
|
55
|
-
screenHeight?: number;
|
|
56
|
-
/** Available screen width */
|
|
57
|
-
screenAvailWidth?: number;
|
|
58
|
-
/** Available screen height */
|
|
59
|
-
screenAvailHeight?: number;
|
|
60
|
-
/** Device pixel ratio */
|
|
61
|
-
devicePixelRatio?: number;
|
|
62
|
-
/** Network connection information */
|
|
63
|
-
network?: NetworkInformation;
|
|
64
|
-
/** Installed plugin names (max 20) */
|
|
65
|
-
plugins?: string[];
|
|
66
|
-
/** Supported MIME types (max 20) */
|
|
67
|
-
mimeTypes?: string[];
|
|
68
|
-
/** Whether WebDriver is detected */
|
|
69
|
-
webdriver?: boolean;
|
|
70
|
-
/** Whether headless browser is suspected */
|
|
71
|
-
suspectedHeadless?: boolean;
|
|
72
|
-
/** WebGL vendor string */
|
|
73
|
-
webglVendor?: string;
|
|
74
|
-
/** WebGL renderer string */
|
|
75
|
-
webglRenderer?: string;
|
|
76
|
-
/** Deterministic hash of canvas rendering */
|
|
77
|
-
canvasHash?: string;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* HTTP Client Configuration
|
|
81
|
-
*/
|
|
82
|
-
export interface HttpClientConfig {
|
|
83
|
-
/** BasisTheory API key */
|
|
84
|
-
apiKey: string;
|
|
85
|
-
/** Base URL for API requests (default: https://api.basistheory.com) */
|
|
86
|
-
baseUrl?: string;
|
|
87
|
-
/** Request timeout in milliseconds (default: 30000) */
|
|
88
|
-
timeout?: number;
|
|
89
|
-
/** Number of retry attempts (default: 3) */
|
|
90
|
-
retries?: number;
|
|
91
|
-
/** Initial retry delay in milliseconds (default: 1000, exponential backoff) */
|
|
92
|
-
retryDelay?: number;
|
|
93
|
-
/** Enable response caching for GET requests globally (default: false). Use useCache per-request for selective caching. */
|
|
94
|
-
cache?: boolean;
|
|
95
|
-
/** Enable debug logging (default: false) */
|
|
96
|
-
debug?: boolean;
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* HTTP Request Options
|
|
100
|
-
*/
|
|
101
|
-
export interface RequestOptions {
|
|
102
|
-
/** HTTP method */
|
|
103
|
-
method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
104
|
-
/** Request headers */
|
|
105
|
-
headers?: Record<string, string>;
|
|
106
|
-
/** Request body */
|
|
107
|
-
body?: unknown;
|
|
108
|
-
/** Request timeout (overrides config timeout) */
|
|
109
|
-
timeout?: number;
|
|
110
|
-
/** Skip caching for this request */
|
|
111
|
-
skipCache?: boolean;
|
|
112
|
-
/** Force enable caching for this request (overrides global cache: false) */
|
|
113
|
-
useCache?: boolean;
|
|
114
|
-
/** Override API key for this request (e.g., session key) */
|
|
115
|
-
apiKey?: string;
|
|
116
|
-
/** Idempotency key for safe retries */
|
|
117
|
-
idempotencyKey?: string;
|
|
118
|
-
/** Number of retries (overrides config retries, use 0 to disable) */
|
|
119
|
-
retries?: number;
|
|
120
|
-
/** Device fingerprint information for fraud detection and 3DS */
|
|
121
|
-
deviceInfo?: DeviceInfo;
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* HTTP Response
|
|
125
|
-
*/
|
|
126
|
-
export interface HttpResponse<T = unknown> {
|
|
127
|
-
/** Response data */
|
|
128
|
-
data: T;
|
|
129
|
-
/** HTTP status code */
|
|
130
|
-
status: number;
|
|
131
|
-
/** Response headers */
|
|
132
|
-
headers: Headers;
|
|
133
|
-
/** Whether response was from cache */
|
|
134
|
-
cached: boolean;
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* HTTP Error
|
|
138
|
-
*/
|
|
139
|
-
export interface HttpError extends Error {
|
|
140
|
-
/** HTTP status code */
|
|
141
|
-
status?: number;
|
|
142
|
-
/** Error response body */
|
|
143
|
-
body?: unknown;
|
|
144
|
-
/** Number of retry attempts made */
|
|
145
|
-
retryCount?: number;
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Token Data (for tokenization)
|
|
149
|
-
*/
|
|
150
|
-
export interface TokenData {
|
|
151
|
-
/** Token type (e.g., 'card', 'bank', 'generic') */
|
|
152
|
-
type?: string;
|
|
153
|
-
/** Sensitive data to tokenize */
|
|
154
|
-
data: Record<string, unknown>;
|
|
155
|
-
/** Token ID (for update operations) */
|
|
156
|
-
id?: string;
|
|
157
|
-
/** Token metadata */
|
|
158
|
-
metadata?: Record<string, string>;
|
|
159
|
-
/** Token search indexes */
|
|
160
|
-
search_indexes?: string[];
|
|
161
|
-
/** Fingerprint expression */
|
|
162
|
-
fingerprint_expression?: string;
|
|
163
|
-
/** Mask expression */
|
|
164
|
-
mask?: unknown;
|
|
165
|
-
/** Deduplicate token */
|
|
166
|
-
deduplicate_token?: boolean;
|
|
167
|
-
/** Token containers */
|
|
168
|
-
containers?: string[];
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Token Response (snake_case matches BasisTheory API)
|
|
172
|
-
*/
|
|
173
|
-
export interface Token {
|
|
174
|
-
/** Token ID */
|
|
175
|
-
id: string;
|
|
176
|
-
/** Token type */
|
|
177
|
-
type: string;
|
|
178
|
-
/** Tenant ID (snake_case) */
|
|
179
|
-
tenant_id: string;
|
|
180
|
-
/** Masked data (snake_case) */
|
|
181
|
-
data?: Record<string, unknown>;
|
|
182
|
-
/** Token metadata (snake_case) */
|
|
183
|
-
metadata?: Record<string, string>;
|
|
184
|
-
/** Creation timestamp (snake_case) */
|
|
185
|
-
created_at: string;
|
|
186
|
-
/** Created by application ID (snake_case) */
|
|
187
|
-
created_by?: string;
|
|
188
|
-
/** Modified timestamp (snake_case) */
|
|
189
|
-
modified_at?: string;
|
|
190
|
-
/** Modified by application ID (snake_case) */
|
|
191
|
-
modified_by?: string;
|
|
192
|
-
/** Fingerprint */
|
|
193
|
-
fingerprint?: string;
|
|
194
|
-
/** Token containers */
|
|
195
|
-
containers?: string[];
|
|
196
|
-
/** Search indexes (snake_case) */
|
|
197
|
-
search_indexes?: string[];
|
|
198
|
-
/** Fingerprint expression (snake_case) */
|
|
199
|
-
fingerprint_expression?: string;
|
|
200
|
-
}
|
|
201
|
-
/**
|
|
202
|
-
* Tokenize Request
|
|
203
|
-
*/
|
|
204
|
-
export interface TokenizeRequest extends Omit<TokenData, 'id'> {
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* Token Create Request
|
|
208
|
-
*/
|
|
209
|
-
export interface TokenCreateRequest extends TokenData {
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* Token Update Request
|
|
213
|
-
*/
|
|
214
|
-
export interface TokenUpdateRequest {
|
|
215
|
-
/** Updated data */
|
|
216
|
-
data?: Record<string, unknown>;
|
|
217
|
-
/** Updated metadata */
|
|
218
|
-
metadata?: Record<string, string>;
|
|
219
|
-
/** Updated search indexes */
|
|
220
|
-
search_indexes?: string[];
|
|
221
|
-
/** Updated mask */
|
|
222
|
-
mask?: unknown;
|
|
223
|
-
/** Updated fingerprint expression */
|
|
224
|
-
fingerprint_expression?: string;
|
|
225
|
-
/** Updated containers */
|
|
226
|
-
containers?: string[];
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* Token Intent Create Request
|
|
230
|
-
*/
|
|
231
|
-
export interface TokenIntentCreateRequest {
|
|
232
|
-
/** Token type (e.g., 'card', 'bank') */
|
|
233
|
-
type: string;
|
|
234
|
-
/** Sensitive data to validate */
|
|
235
|
-
data: Record<string, unknown>;
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* Token Intent Response
|
|
239
|
-
*/
|
|
240
|
-
export interface TokenIntent {
|
|
241
|
-
/** Token Intent ID */
|
|
242
|
-
id: string;
|
|
243
|
-
/** Tenant ID */
|
|
244
|
-
tenant_id: string;
|
|
245
|
-
/** Token type */
|
|
246
|
-
type: string;
|
|
247
|
-
/** Intent status (e.g. 'created') */
|
|
248
|
-
status?: string;
|
|
249
|
-
/** Card details (when type is 'card') */
|
|
250
|
-
card?: {
|
|
251
|
-
bin?: string;
|
|
252
|
-
last4?: string;
|
|
253
|
-
expiration_month?: number;
|
|
254
|
-
expiration_year?: number;
|
|
255
|
-
brand?: string;
|
|
256
|
-
funding?: string;
|
|
257
|
-
issuer_country?: {
|
|
258
|
-
alpha2?: string;
|
|
259
|
-
name?: string;
|
|
260
|
-
numeric?: string;
|
|
261
|
-
};
|
|
262
|
-
authentication?: string;
|
|
263
|
-
};
|
|
264
|
-
/** Bank details (when type is 'bank') */
|
|
265
|
-
bank?: {
|
|
266
|
-
routing_number?: string;
|
|
267
|
-
account_number_last4?: string;
|
|
268
|
-
};
|
|
269
|
-
/** Fingerprint */
|
|
270
|
-
fingerprint?: string;
|
|
271
|
-
/** Created by application ID */
|
|
272
|
-
created_by?: string;
|
|
273
|
-
/** Creation timestamp */
|
|
274
|
-
created_at: string;
|
|
275
|
-
/** Expiration timestamp */
|
|
276
|
-
expires_at: string;
|
|
277
|
-
}
|
|
278
|
-
/**
|
|
279
|
-
* BIN range segment from card enrichment (8-digit strings typical).
|
|
280
|
-
*/
|
|
281
|
-
export interface BinRangeSegment {
|
|
282
|
-
binMin?: string;
|
|
283
|
-
binMax?: string;
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Per-network BIN ranges for co-badge narrowing after the first 6 digits.
|
|
287
|
-
*/
|
|
288
|
-
export interface NetworkBinRangeEntry {
|
|
289
|
-
/** Normalized network id (kebab-case, e.g. `visa`) */
|
|
290
|
-
network: string;
|
|
291
|
-
/**
|
|
292
|
-
* Ranges for this network; omitted or empty means no narrowing (always eligible
|
|
293
|
-
* when filtering runs; see `filterNetworksByPanPrefix`).
|
|
294
|
-
*/
|
|
295
|
-
binRange?: BinRangeSegment[];
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* BIN Lookup Response
|
|
299
|
-
*/
|
|
300
|
-
export interface BinInfo {
|
|
301
|
-
/** BIN (first 6 digits) */
|
|
302
|
-
bin: string;
|
|
303
|
-
/** Card brand (e.g., 'visa', 'mastercard') */
|
|
304
|
-
card_brand?: string;
|
|
305
|
-
/** Card type (e.g., 'debit', 'credit', 'prepaid') */
|
|
306
|
-
card_type?: 'debit' | 'credit' | 'prepaid' | 'unknown';
|
|
307
|
-
/** Issuing country (ISO 3166-1 alpha-2) */
|
|
308
|
-
country?: string;
|
|
309
|
-
/** Issuing bank name */
|
|
310
|
-
bank?: string;
|
|
311
|
-
/** Supported networks (for co-badged cards) */
|
|
312
|
-
networks?: string[];
|
|
313
|
-
/**
|
|
314
|
-
* Per-network `binRange` from enrichment (primary + additional brands).
|
|
315
|
-
* Used to narrow visible co-badge networks when PAN length > 6.
|
|
316
|
-
*/
|
|
317
|
-
networkBinRanges?: NetworkBinRangeEntry[];
|
|
318
|
-
}
|
|
319
|
-
/**
|
|
320
|
-
* Session Response (snake_case matches BasisTheory API)
|
|
321
|
-
*/
|
|
322
|
-
export interface Session {
|
|
323
|
-
/** Session API key - use this for authenticating API calls after authorization */
|
|
324
|
-
session_key: string;
|
|
325
|
-
/** Session nonce - used to authorize the session */
|
|
326
|
-
nonce: string;
|
|
327
|
-
/** Session expiration timestamp (ISO 8601) */
|
|
328
|
-
expires_at?: string;
|
|
329
|
-
}
|
|
330
|
-
/**
|
|
331
|
-
* Proxy Request
|
|
332
|
-
*/
|
|
333
|
-
export interface ProxyRequest {
|
|
334
|
-
/** HTTP method */
|
|
335
|
-
method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
336
|
-
/** Request headers (forwarded to destination) */
|
|
337
|
-
headers?: Record<string, string>;
|
|
338
|
-
/** Request body */
|
|
339
|
-
body?: unknown;
|
|
340
|
-
/**
|
|
341
|
-
* Pre-configured proxy key — sent as `BT-PROXY-KEY` on the Basis Theory API request.
|
|
342
|
-
* When set, `url` passed to `proxy()` may be empty.
|
|
343
|
-
*/
|
|
344
|
-
proxyKey?: string;
|
|
345
|
-
/**
|
|
346
|
-
* When true, asks the API to include destination response headers in the payload shape.
|
|
347
|
-
*/
|
|
348
|
-
includeResponseHeaders?: boolean;
|
|
349
|
-
}
|
|
350
|
-
/**
|
|
351
|
-
* Cache Entry
|
|
352
|
-
*/
|
|
353
|
-
export interface CacheEntry<T = unknown> {
|
|
354
|
-
/** Cached data */
|
|
355
|
-
data: T;
|
|
356
|
-
/** Cache timestamp */
|
|
357
|
-
timestamp: number;
|
|
358
|
-
/** Cache TTL in milliseconds */
|
|
359
|
-
ttl: number;
|
|
360
|
-
}
|
|
361
|
-
/**
|
|
362
|
-
* BasisTheory API Client Interface
|
|
363
|
-
*/
|
|
364
|
-
export interface BasisTheoryClient {
|
|
365
|
-
/**
|
|
366
|
-
* Token operations
|
|
367
|
-
*/
|
|
368
|
-
tokens: {
|
|
369
|
-
/**
|
|
370
|
-
* Create a new token
|
|
371
|
-
*/
|
|
372
|
-
create: (data: TokenCreateRequest, options?: RequestOptions) => Promise<Token>;
|
|
373
|
-
/**
|
|
374
|
-
* Update an existing token
|
|
375
|
-
*/
|
|
376
|
-
update: (id: string, data: TokenUpdateRequest, options?: RequestOptions) => Promise<Token>;
|
|
377
|
-
/**
|
|
378
|
-
* Retrieve a token by ID
|
|
379
|
-
*/
|
|
380
|
-
retrieve: (id: string, options?: RequestOptions) => Promise<Token>;
|
|
381
|
-
};
|
|
382
|
-
/**
|
|
383
|
-
* Token Intent operations
|
|
384
|
-
*/
|
|
385
|
-
tokenIntents: {
|
|
386
|
-
/**
|
|
387
|
-
* Create a new token intent
|
|
388
|
-
*/
|
|
389
|
-
create: (data: TokenIntentCreateRequest, options?: RequestOptions) => Promise<TokenIntent>;
|
|
390
|
-
/**
|
|
391
|
-
* Retrieve a token intent by ID
|
|
392
|
-
*/
|
|
393
|
-
get: (id: string, options?: RequestOptions) => Promise<TokenIntent>;
|
|
394
|
-
};
|
|
395
|
-
/**
|
|
396
|
-
* Session operations
|
|
397
|
-
*/
|
|
398
|
-
sessions: {
|
|
399
|
-
/**
|
|
400
|
-
* Create a new session for temporary elevated access
|
|
401
|
-
*/
|
|
402
|
-
create: (options?: RequestOptions) => Promise<Session>;
|
|
403
|
-
};
|
|
404
|
-
/**
|
|
405
|
-
* Tokenize data (simplified token creation)
|
|
406
|
-
*/
|
|
407
|
-
tokenize: (data: TokenizeRequest, options?: RequestOptions) => Promise<Token>;
|
|
408
|
-
/**
|
|
409
|
-
* BIN lookup
|
|
410
|
-
*/
|
|
411
|
-
binLookup: (bin: string, options?: RequestOptions) => Promise<BinInfo>;
|
|
412
|
-
/**
|
|
413
|
-
* Proxy request through BasisTheory gateway
|
|
414
|
-
*/
|
|
415
|
-
proxy: (url: string, request: ProxyRequest, options?: RequestOptions) => Promise<unknown>;
|
|
416
|
-
/**
|
|
417
|
-
* Clear cache
|
|
418
|
-
*/
|
|
419
|
-
clearCache: () => void;
|
|
420
|
-
}
|
|
421
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../api-client/src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-card-B5zEHyRg.js","sources":["../src/elements/create-card.ts"],"sourcesContent":["/**\n * Card Element Factory (Unified)\n */\n\nimport type { PostMessageClient } from '@basis-theory-elements/postmessage';\nimport { createPostMessageClient } from '@basis-theory-elements/postmessage';\nimport { ElementError, log } from '@basis-theory-elements/shared';\nimport { createMounter } from '../mounter/create-mounter';\nimport type {\n CardElement,\n ElementMounter,\n ElementOptions,\n EventListener,\n EventType,\n SDKConfig,\n SubElementRef,\n} from '../types';\nimport { createIframe } from '../utils/create-iframe';\nimport { createEventDispatcher } from '../utils/create-event-dispatcher';\n\n/**\n * Default stack threshold in pixels for CardElement auto-layout\n * When container width is below this threshold, card inputs stack vertically\n */\nconst DEFAULT_CARD_STACK_THRESHOLD = 400;\n\n/**\n * Card element options\n */\nexport interface CardElementOptions {\n /** CSS styling */\n style?: Record<string, any>;\n\n /** Placeholder text for each sub-field */\n placeholder?: {\n cardNumber?: string;\n expiryDate?: string;\n cvc?: string;\n };\n\n /** Accessibility label */\n ariaLabel?: string;\n\n /** Disabled state (applies to all 3 sub-fields) */\n disabled?: boolean;\n\n /** Read-only state (applies to all 3 sub-fields) */\n readOnly?: boolean;\n\n /** Layout mode */\n layout?: 'row' | 'column' | 'auto';\n\n /** Stack threshold in pixels (only applies when layout: 'auto') */\n stackAt?: number;\n\n /** Icon position */\n iconPosition?: 'left' | 'right' | 'none';\n\n /** Restrict accepted card brands */\n cardBrands?: string[];\n\n /**\n * BIN enrichment for the card number field. If omitted but `coBadge` is set, enrichment\n * runs unless explicitly disabled (`false` or `{ enabled: false }`).\n */\n binLookup?: boolean | { enabled?: boolean; debounceMs?: number };\n\n /** Co-badge options; implies BIN enrichment when set (see `binLookup`). */\n coBadge?: {\n preferredNetworks?: string[];\n mode?: 'auto' | 'manual';\n };\n}\n\n/**\n * Factory function to create a unified card element\n * No class, pure functional approach with closure-based state\n */\nexport const createCardElement = (\n apiKey: string,\n sdkConfig: SDKConfig,\n options: CardElementOptions = {},\n coordinatorElementId: string,\n ensureCoordinatorReady: () => Promise<void>,\n notifyCoordinatorElementUnmount: (elementId: string) => Promise<void> // ← Notify coordinator on unmount\n): CardElement => {\n // Private state (closure)\n let iframe: HTMLIFrameElement | null = null;\n let client: PostMessageClient | null = null;\n let mounter: ElementMounter | null = null;\n let isMounted = false;\n let container: HTMLElement | null = null;\n let eventDispatcher: ReturnType<typeof createEventDispatcher> | null = null;\n\n // Event target for event emission\n const eventTarget = new EventTarget();\n\n // Use coordinator-generated ID for all references\n const id = coordinatorElementId;\n const type = 'card';\n\n // Setup event dispatcher\n const setupEventListeners = () => {\n if (!client) {\n return;\n }\n\n eventDispatcher = createEventDispatcher({\n elementType: type,\n elementId: id,\n client,\n eventTarget,\n });\n\n eventDispatcher.setupSubscriptions();\n };\n\n /**\n * Create sub-element reference for tokenization\n * These refs are used in bt.tokens.create() data payload\n */\n const createSubElementRef = (subId: string): SubElementRef => ({\n id: subId,\n type: 'card',\n get mounted() {\n return isMounted;\n },\n mount: () => {\n throw ElementError('Sub-field refs cannot be mounted independently');\n },\n unmount: () => {},\n update: () => Promise.resolve(),\n focus: () => {},\n blur: () => {},\n clear: () => {},\n on: () => () => {},\n });\n\n // Public API (Element interface with sub-field refs)\n const cardElement = {\n id,\n type,\n get mounted() {\n return isMounted;\n },\n\n // Sub-field references for tokenization\n fields: {\n number: createSubElementRef(`${id}__number`),\n expiryDate: createSubElementRef(`${id}__expiry`),\n cvc: createSubElementRef(`${id}__cvc`),\n },\n\n mount: async (selector: string | HTMLElement) => {\n if (isMounted) {\n throw ElementError('Element is already mounted');\n }\n\n // Resolve container\n container =\n typeof selector === 'string'\n ? document.querySelector(selector)\n : selector;\n\n if (!container) {\n throw ElementError(`Container not found: ${selector}`);\n }\n\n // Create iframe\n const parentOrigin = window.location.origin;\n const iframeUrl = new URL(`${sdkConfig.elementsBaseUrl}/card.html`);\n iframeUrl.searchParams.set('parentOrigin', parentOrigin);\n iframeUrl.searchParams.set('elementId', id);\n iframeUrl.searchParams.set(\n 'measurePerformance',\n String(sdkConfig.measurePerformance || false)\n );\n iframeUrl.searchParams.set('debug', String(sdkConfig.debug || false));\n\n iframe = createIframe({\n src: iframeUrl.toString(),\n sandbox: 'allow-scripts allow-same-origin',\n title: options.ariaLabel || 'Card Input',\n });\n\n // Add element ID and theme mode attributes\n iframe.setAttribute('data-bt-element-id', id);\n iframe.setAttribute('data-theme-mode', sdkConfig.themeMode || 'auto');\n\n // Create PostMessage client\n client = createPostMessageClient(iframe, {\n targetOrigin: sdkConfig.iframeOrigin,\n timeout: sdkConfig.timeoutMs,\n retries: sdkConfig.retryConfig.maxRetries,\n debug: sdkConfig.debug,\n });\n\n // Create mounter\n mounter = createMounter();\n\n // Set up event listeners\n setupEventListeners();\n\n // Subscribe to 'ready' event BEFORE mounting iframe\n const readyPromise = new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(\n ElementError(\n `Iframe EVENT_READY not received within ${sdkConfig.timeoutMs}ms`,\n id,\n { elementType: type, timeoutMs: sdkConfig.timeoutMs }\n )\n );\n }, sdkConfig.timeoutMs);\n\n const handleReady = () => {\n clearTimeout(timeout);\n resolve();\n };\n\n eventTarget.addEventListener('ready', handleReady, { once: true });\n });\n\n // Mount iframe to DOM (synchronous)\n mounter.mount(container, iframe, {\n timeoutMs: sdkConfig.timeoutMs,\n });\n\n isMounted = true;\n\n // Wait for coordinator + configuration to complete\n try {\n // Wait for coordinator (loads Core SDK if needed)\n await ensureCoordinatorReady();\n\n // Wait for EVENT_READY\n await readyPromise;\n\n // Send initial configuration with card-specific options.\n // Omit `binLookup` / `coBadge` when undefined so the iframe never receives\n // explicit `undefined` (object literals include own keys with undefined values).\n await client!.sendRequest('CMD_SET_CONFIG', {\n elementId: id,\n apiKey,\n apiTimeout: sdkConfig.timeoutMs,\n apiRetries: sdkConfig.retryConfig.maxRetries,\n theme: sdkConfig.theme,\n darkTheme: sdkConfig.darkTheme,\n themeMode: sdkConfig.themeMode,\n placeholder: options.placeholder,\n ...(options.style !== undefined && { style: options.style }),\n disabled: options.disabled,\n readOnly: options.readOnly,\n layout: options.layout || 'auto',\n stackAt: options.stackAt || DEFAULT_CARD_STACK_THRESHOLD,\n iconPosition: options.iconPosition || 'left',\n ...(options.cardBrands !== undefined && { cardBrands: options.cardBrands }),\n ...(options.binLookup !== undefined && { binLookup: options.binLookup }),\n ...(options.coBadge !== undefined && { coBadge: options.coBadge }),\n debug: sdkConfig.debug,\n });\n\n // Reveal iframe now that theme is fully applied\n if (iframe) iframe.style.opacity = '1';\n } catch (error) {\n // Dispatch error event before cleanup\n if (eventDispatcher) {\n eventDispatcher.dispatchError(\n 'MOUNT_ERROR',\n (error as Error).message,\n error as Error\n );\n }\n\n // Mount failed - clean up and mark as unmounted\n isMounted = false;\n\n if (client) {\n client.destroy();\n client = null;\n }\n\n if (mounter && iframe) {\n mounter.unmount(iframe);\n iframe = null;\n mounter = null;\n }\n\n eventDispatcher = null;\n container = null;\n\n throw error;\n }\n },\n\n unmount: () => {\n if (!isMounted) {\n throw ElementError('Element is not mounted');\n }\n\n // PCI DSS 3.2.1: Notify coordinator to broadcast ELEMENT_UNMOUNTED for all sub-fields\n // This clears cached values and notifies other elements (like CopyButton)\n // Card element has 3 sub-fields: __number, __expiry, __cvc\n const subFieldSuffixes = ['__number', '__expiry', '__cvc'];\n for (const suffix of subFieldSuffixes) {\n notifyCoordinatorElementUnmount(`${id}${suffix}`).catch((error) => {\n log('Failed to notify coordinator of element unmount', {\n elementId: `${id}${suffix}`,\n error: (error as Error).message,\n });\n });\n }\n\n if (client) {\n client.destroy();\n client = null;\n }\n\n if (mounter && iframe) {\n mounter.unmount(iframe);\n iframe = null;\n mounter = null;\n }\n\n eventDispatcher = null;\n container = null;\n isMounted = false;\n },\n\n update: async (newOptions: Partial<ElementOptions> & { themeMode?: string }) => {\n if (!isMounted || !client) {\n throw ElementError('Element must be mounted before updating');\n }\n\n const cardOptions = newOptions as Partial<CardElementOptions> & { themeMode?: string };\n\n // Only send fields that are present (matches create-card-number) so we never\n // overwrite iframe config with undefined/null over postMessage.\n const updatePayload: Record<string, any> = {\n elementId: id,\n };\n\n if (cardOptions.placeholder !== undefined) {\n updatePayload.placeholder = cardOptions.placeholder;\n }\n if (cardOptions.style !== undefined) {\n updatePayload.style = cardOptions.style;\n }\n if (cardOptions.disabled !== undefined) {\n updatePayload.disabled = cardOptions.disabled;\n }\n if (cardOptions.readOnly !== undefined) {\n updatePayload.readOnly = cardOptions.readOnly;\n }\n if (cardOptions.layout !== undefined) {\n updatePayload.layout = cardOptions.layout;\n }\n if (cardOptions.stackAt !== undefined) {\n updatePayload.stackAt = cardOptions.stackAt;\n }\n if (cardOptions.iconPosition !== undefined) {\n updatePayload.iconPosition = cardOptions.iconPosition;\n }\n if (cardOptions.cardBrands !== undefined) {\n updatePayload.cardBrands = cardOptions.cardBrands;\n }\n if (cardOptions.binLookup !== undefined) {\n updatePayload.binLookup = cardOptions.binLookup;\n }\n if (cardOptions.coBadge !== undefined) {\n updatePayload.coBadge = cardOptions.coBadge;\n }\n\n if (newOptions.themeMode !== undefined) {\n updatePayload.themeMode = newOptions.themeMode;\n updatePayload.theme = sdkConfig.theme;\n updatePayload.darkTheme = sdkConfig.darkTheme;\n }\n\n await client.sendRequest('CMD_UPDATE_CONFIG', updatePayload);\n },\n\n focus: () => {\n if (!isMounted || !client) {\n throw ElementError('Element must be mounted before focusing');\n }\n\n client.sendRequest('CMD_FOCUS', {});\n },\n\n blur: () => {\n if (!isMounted || !client) {\n throw ElementError('Element must be mounted before blurring');\n }\n\n client.sendRequest('CMD_BLUR', {});\n },\n\n clear: () => {\n if (!isMounted || !client) {\n throw ElementError('Element must be mounted before clearing');\n }\n\n client.sendRequest('CMD_CLEAR', {});\n },\n\n on: (eventType: EventType, listener: EventListener) => {\n eventTarget.addEventListener(\n eventType,\n listener as EventListenerOrEventListenerObject\n );\n\n // Return unsubscribe function\n return () =>\n eventTarget.removeEventListener(\n eventType,\n listener as EventListenerOrEventListenerObject\n );\n },\n\n setNetwork: async (network: string) => {\n if (!isMounted || !client) {\n throw ElementError('Element must be mounted before setNetwork');\n }\n await client.sendRequest('CMD_SET_NETWORK', { network });\n },\n };\n\n return cardElement as CardElement;\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"create-copy-button-DrAz8g0m.js","sources":["../src/elements/create-copy-button.ts"],"sourcesContent":["/**\n * Copy Button Element Factory\n *\n * Creates a secure button that copies values to clipboard.\n * Can copy either a static value or a value from a linked BT element.\n *\n * SECURITY NOTE: This element is opt-in only via allowClipboard: true.\n * Clipboard access for raw card data may not be PCI compliant and must\n * never be enabled inadvertently.\n */\n\nimport type { PostMessageClient } from '@basis-theory-elements/postmessage';\nimport { createPostMessageClient } from '@basis-theory-elements/postmessage';\nimport { ConfigurationError, ElementError, log } from '@basis-theory-elements/shared';\nimport { createMounter } from '../mounter/create-mounter';\nimport type {\n CopyButtonElement,\n CopyButtonOptions,\n Element,\n ElementMounter,\n ElementOptions,\n EventListener,\n EventType,\n SDKConfig,\n} from '../types';\nimport { createIframe } from '../utils/create-iframe';\nimport { createEventDispatcher } from '../utils/create-event-dispatcher';\n\n/**\n * Factory function to create a copy button element\n *\n * @throws ConfigurationError if allowClipboard is not set to true\n */\nexport const createCopyButtonElement = (\n _apiKey: string, // Reserved for future API calls\n sdkConfig: SDKConfig,\n inputOptions: ElementOptions | CopyButtonOptions | undefined,\n coordinatorElementId: string,\n ensureCoordinatorReady: () => Promise<void>,\n _notifyCoordinatorElementUnmount: (elementId: string) => Promise<void> // Not used - CopyButton doesn't cache sensitive values\n): CopyButtonElement => {\n // SECURITY: Defense-in-depth check for allowClipboard flag\n // Primary validation is in validate-element-options.ts, but we keep this\n // as a backup in case the factory is called directly (e.g., lazy loading)\n const options = inputOptions as CopyButtonOptions | undefined;\n if (options?.allowClipboard !== true) {\n throw ConfigurationError(\n 'CopyButton requires allowClipboard: true. ' +\n 'Clipboard access for raw card data may not be PCI compliant ' +\n 'and must be explicitly enabled.',\n {\n received: options?.allowClipboard,\n expected: true,\n elementType: 'copyButton',\n }\n );\n }\n\n // Private state (closure)\n let iframe: HTMLIFrameElement | null = null;\n let client: PostMessageClient | null = null;\n let mounter: ElementMounter | null = null;\n let isMounted = false;\n let container: HTMLElement | null = null;\n let eventDispatcher: ReturnType<typeof createEventDispatcher> | null = null;\n\n const eventTarget = new EventTarget();\n const id = coordinatorElementId;\n const type = 'copyButton' as const;\n\n // Setup event dispatcher (centralized event mapping logic)\n const setupEventListeners = () => {\n if (!client) return;\n\n eventDispatcher = createEventDispatcher({\n elementType: type,\n elementId: id,\n client,\n eventTarget,\n });\n\n eventDispatcher.setupSubscriptions();\n\n // Subscribe to copy events from the iframe\n client.subscribe('EVENT_COPY', (payload) => {\n const event = new CustomEvent('copy', {\n detail: {\n elementType: type,\n elementId: id,\n timestamp: Date.now(),\n success: payload?.success ?? false,\n error: payload?.error,\n },\n });\n eventTarget.dispatchEvent(event);\n });\n };\n\n const element: CopyButtonElement = {\n id,\n type,\n get mounted() {\n return isMounted;\n },\n\n mount: async (selector: string | HTMLElement) => {\n if (isMounted) {\n throw ElementError('Element is already mounted', id);\n }\n\n container =\n typeof selector === 'string'\n ? document.querySelector(selector)\n : selector;\n\n if (!container) {\n throw ElementError(`Container not found: ${selector}`);\n }\n\n // Generate signature for iframe authentication\n // Must match between URL param and CMD_SET_CONFIG to prevent\n // unauthorized iframe framing attacks\n const signature = crypto.randomUUID();\n\n // Pass parent origin + element ID + signature via URL parameters\n const parentOrigin = window.location.origin;\n const iframeUrl = new URL(`${sdkConfig.elementsBaseUrl}/copy-button.html`);\n iframeUrl.searchParams.set('parentOrigin', parentOrigin);\n iframeUrl.searchParams.set('elementId', id);\n iframeUrl.searchParams.set('signature', signature);\n iframeUrl.searchParams.set(\n 'measurePerformance',\n String(sdkConfig.measurePerformance || false)\n );\n iframeUrl.searchParams.set('debug', String(sdkConfig.debug || false));\n\n iframe = createIframe({\n src: iframeUrl.toString(),\n sandbox: 'allow-scripts allow-same-origin',\n // clipboard-write is required for Firefox/Safari clipboard access in iframes\n allow: 'clipboard-write',\n title: 'Copy Button',\n });\n\n // Add element ID attribute for debugging\n iframe.setAttribute('data-bt-element-id', id);\n\n client = createPostMessageClient(iframe, {\n targetOrigin: sdkConfig.iframeOrigin,\n timeout: sdkConfig.timeoutMs,\n retries: sdkConfig.retryConfig.maxRetries,\n debug: sdkConfig.debug,\n });\n\n mounter = createMounter();\n setupEventListeners();\n\n // Subscribe to 'ready' event BEFORE mounting iframe (prevents race condition)\n const readyPromise = new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(\n ElementError(\n `Iframe EVENT_READY not received within ${sdkConfig.timeoutMs}ms`,\n id,\n { elementType: type, timeoutMs: sdkConfig.timeoutMs }\n )\n );\n }, sdkConfig.timeoutMs);\n\n const handleReady = () => {\n clearTimeout(timeout);\n resolve();\n };\n\n eventTarget.addEventListener('ready', handleReady, { once: true });\n });\n\n // Mount iframe to DOM\n mounter.mount(container, iframe, {\n timeoutMs: sdkConfig.timeoutMs,\n });\n\n isMounted = true;\n\n // Wait for coordinator + configuration to complete\n try {\n await ensureCoordinatorReady();\n await readyPromise;\n\n // Send copy button config with signature for authentication\n await client!.sendRequest('CMD_SET_CONFIG', {\n elementId: id,\n signature, // Must match URL param signature for iframe to operate\n theme: sdkConfig.theme,\n darkTheme: sdkConfig.darkTheme,\n themeMode: sdkConfig.themeMode,\n text: options.text || 'Copy',\n value: options.value,\n disabled: options.disabled,\n debug: sdkConfig.debug,\n });\n\n // Reveal iframe now that theme is applied\n if (iframe) iframe.style.opacity = '1';\n } catch (error) {\n // Dispatch error event before cleanup\n if (eventDispatcher) {\n eventDispatcher.dispatchError(\n 'MOUNT_ERROR',\n (error as Error).message,\n error as Error\n );\n }\n\n // Mount failed - clean up\n isMounted = false;\n\n if (client) {\n client.destroy();\n client = null;\n }\n\n if (mounter && iframe) {\n mounter.unmount(iframe);\n iframe = null;\n mounter = null;\n }\n\n eventDispatcher = null;\n container = null;\n\n throw error;\n }\n },\n\n unmount: () => {\n if (!isMounted) {\n throw ElementError('Element is not mounted');\n }\n\n if (client) {\n client.destroy();\n client = null;\n }\n\n if (mounter && iframe) {\n mounter.unmount(iframe);\n iframe = null;\n mounter = null;\n }\n\n eventDispatcher = null;\n container = null;\n isMounted = false;\n },\n\n update: async (newOptions: Partial<CopyButtonOptions> & { themeMode?: string }) => {\n if (!isMounted || !client) {\n throw ElementError('Element must be mounted before updating', id);\n }\n\n // Only send fields that are present (matches create-card-number) so we never\n // overwrite iframe config with undefined/null over postMessage.\n const updatePayload: Record<string, any> = {};\n\n const copyButtonOptions = newOptions as Partial<CopyButtonOptions> & { themeMode?: string };\n\n if (copyButtonOptions.text !== undefined) {\n updatePayload.text = copyButtonOptions.text;\n }\n if (copyButtonOptions.value !== undefined) {\n updatePayload.value = copyButtonOptions.value;\n }\n if (copyButtonOptions.disabled !== undefined) {\n updatePayload.disabled = copyButtonOptions.disabled;\n }\n\n // Include theme mode update if provided\n if (newOptions.themeMode !== undefined) {\n updatePayload.themeMode = newOptions.themeMode;\n updatePayload.theme = sdkConfig.theme;\n updatePayload.darkTheme = sdkConfig.darkTheme;\n }\n\n await client.sendRequest('CMD_UPDATE_CONFIG', updatePayload);\n },\n\n focus: () => {\n if (!isMounted || !client) {\n throw ElementError('Element must be mounted before focusing', id);\n }\n\n client.sendRequest('CMD_FOCUS', {});\n },\n\n blur: () => {\n if (!isMounted || !client) {\n throw ElementError('Element must be mounted before blurring', id);\n }\n\n client.sendRequest('CMD_BLUR', {});\n },\n\n // No-op for CopyButton (nothing to clear in a button)\n clear: () => {},\n\n on: (eventType: EventType, listener: EventListener) => {\n eventTarget.addEventListener(\n eventType,\n listener as EventListenerOrEventListenerObject\n );\n\n return () =>\n eventTarget.removeEventListener(\n eventType,\n listener as EventListenerOrEventListenerObject\n );\n },\n\n /**\n * Link this copy button to another element's value\n * Sends CMD_SET_VALUE_REF to the iframe with the referenced element's ID\n * @returns Promise that resolves when the reference is set\n */\n setValueRef: async (refElement: Element): Promise<void> => {\n log('setValueRef called', {\n copyButtonId: id,\n refElementId: refElement?.id,\n });\n\n if (!refElement || !refElement.id) {\n throw ElementError('setValueRef requires a valid Element with an ID', id);\n }\n\n if (!isMounted || !client) {\n throw ElementError('Element must be mounted before calling setValueRef', id);\n }\n\n // Send command to iframe to link to the referenced element\n await client.sendRequest('CMD_SET_VALUE_REF', {\n referenceElementId: refElement.id,\n });\n },\n };\n\n return element;\n};\n"],"names":[],"mappings":"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"}
|