@basis-theory/web-elements 2.11.2 → 3.0.0-beta.2
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/README.md +668 -2
- package/dist/.vite/manifest.json +27 -0
- package/dist/api-client/src/api-client.d.ts +11 -0
- package/dist/api-client/src/api-client.d.ts.map +1 -0
- package/dist/api-client/src/http-client.d.ts +24 -0
- package/dist/api-client/src/http-client.d.ts.map +1 -0
- package/dist/api-client/src/index.d.ts +9 -0
- package/dist/api-client/src/index.d.ts.map +1 -0
- package/dist/api-client/src/services/sessions.d.ts +19 -0
- package/dist/api-client/src/services/sessions.d.ts.map +1 -0
- package/dist/api-client/src/services/token-intents.d.ts +17 -0
- package/dist/api-client/src/services/token-intents.d.ts.map +1 -0
- package/dist/api-client/src/services/tokens.d.ts +19 -0
- package/dist/api-client/src/services/tokens.d.ts.map +1 -0
- package/dist/api-client/src/types.d.ts +313 -0
- package/dist/api-client/src/types.d.ts.map +1 -0
- package/dist/basis-theory-sdk.es.js +6 -0
- package/dist/basis-theory-sdk.es.js.map +1 -0
- package/dist/basis-theory-sdk.umd.js +1 -0
- package/dist/basis-theory-sdk.umd.js.map +1 -0
- package/dist/create-card-BuOvimjH.js +232 -0
- package/dist/create-card-BuOvimjH.js.map +1 -0
- package/dist/index-oREjBjga.js +2317 -0
- package/dist/index-oREjBjga.js.map +1 -0
- package/dist/loader/basis-theory.min.js +1 -0
- package/dist/postmessage/src/client.d.ts +7 -0
- package/dist/postmessage/src/client.d.ts.map +1 -0
- package/dist/postmessage/src/event-map.d.ts +135 -0
- package/dist/postmessage/src/event-map.d.ts.map +1 -0
- package/dist/postmessage/src/index.d.ts +9 -0
- package/dist/postmessage/src/index.d.ts.map +1 -0
- package/dist/postmessage/src/server.d.ts +11 -0
- package/dist/postmessage/src/server.d.ts.map +1 -0
- package/dist/postmessage/src/types.d.ts +71 -0
- package/dist/postmessage/src/types.d.ts.map +1 -0
- package/dist/shared/src/api-url-resolver.d.ts +22 -0
- package/dist/shared/src/api-url-resolver.d.ts.map +1 -0
- package/dist/shared/src/debug-logger.d.ts +16 -0
- package/dist/shared/src/debug-logger.d.ts.map +1 -0
- package/dist/shared/src/deep-sanitization.d.ts +24 -0
- package/dist/shared/src/deep-sanitization.d.ts.map +1 -0
- package/dist/shared/src/errors.d.ts +93 -0
- package/dist/shared/src/errors.d.ts.map +1 -0
- package/dist/shared/src/generate-id.d.ts +13 -0
- package/dist/shared/src/generate-id.d.ts.map +1 -0
- package/dist/shared/src/index.d.ts +13 -0
- package/dist/shared/src/index.d.ts.map +1 -0
- package/dist/shared/src/logger-context.d.ts +25 -0
- package/dist/shared/src/logger-context.d.ts.map +1 -0
- package/dist/sri.json +22 -0
- package/dist/stats.html +4949 -0
- package/dist/web-elements/src/BasisTheory.d.ts +47 -0
- package/dist/web-elements/src/BasisTheory.d.ts.map +1 -0
- package/dist/web-elements/src/basis-theory.d.ts +62 -0
- package/dist/web-elements/src/basis-theory.d.ts.map +1 -0
- package/dist/web-elements/src/elements/create-card-number.d.ts +14 -0
- package/dist/web-elements/src/elements/create-card-number.d.ts.map +1 -0
- package/dist/web-elements/src/elements/create-card.d.ts +37 -0
- package/dist/web-elements/src/elements/create-card.d.ts.map +1 -0
- package/dist/web-elements/src/elements/create-cvv.d.ts +10 -0
- package/dist/web-elements/src/elements/create-cvv.d.ts.map +1 -0
- package/dist/web-elements/src/elements/create-expiry.d.ts +10 -0
- package/dist/web-elements/src/elements/create-expiry.d.ts.map +1 -0
- package/dist/web-elements/src/elements/create-text.d.ts +13 -0
- package/dist/web-elements/src/elements/create-text.d.ts.map +1 -0
- package/dist/web-elements/src/index.d.ts +27 -0
- package/dist/web-elements/src/index.d.ts.map +1 -0
- package/dist/web-elements/src/mounter/create-mounter.d.ts +11 -0
- package/dist/web-elements/src/mounter/create-mounter.d.ts.map +1 -0
- package/dist/web-elements/src/theme/default-theme.d.ts +22 -0
- package/dist/web-elements/src/theme/default-theme.d.ts.map +1 -0
- package/dist/web-elements/src/theme/inject-theme-dark.d.ts +13 -0
- package/dist/web-elements/src/theme/inject-theme-dark.d.ts.map +1 -0
- package/dist/web-elements/src/theme/inject-theme.d.ts +20 -0
- package/dist/web-elements/src/theme/inject-theme.d.ts.map +1 -0
- package/dist/web-elements/src/types/events.d.ts +137 -0
- package/dist/web-elements/src/types/events.d.ts.map +1 -0
- package/dist/web-elements/src/types/theme.d.ts +91 -0
- package/dist/web-elements/src/types/theme.d.ts.map +1 -0
- package/dist/web-elements/src/types.d.ts +537 -0
- package/dist/web-elements/src/types.d.ts.map +1 -0
- package/dist/web-elements/src/utils/create-event-dispatcher.d.ts +47 -0
- package/dist/web-elements/src/utils/create-event-dispatcher.d.ts.map +1 -0
- package/dist/web-elements/src/utils/create-iframe.d.ts +10 -0
- package/dist/web-elements/src/utils/create-iframe.d.ts.map +1 -0
- package/dist/web-elements/src/utils/resolve-element-references.d.ts +20 -0
- package/dist/web-elements/src/utils/resolve-element-references.d.ts.map +1 -0
- package/dist/web-elements/src/utils/validate-element-options.d.ts +11 -0
- package/dist/web-elements/src/utils/validate-element-options.d.ts.map +1 -0
- package/dist/web-elements/src/utils/validate-sdk-config.d.ts +15 -0
- package/dist/web-elements/src/utils/validate-sdk-config.d.ts.map +1 -0
- package/dist/web-elements/src/utils/warn-unknown-keys.d.ts +15 -0
- package/dist/web-elements/src/utils/warn-unknown-keys.d.ts.map +1 -0
- package/dist/web-elements/src/version.d.ts +25 -0
- package/dist/web-elements/src/version.d.ts.map +1 -0
- package/package.json +53 -72
- package/LICENSE +0 -202
- package/dist/LICENSE +0 -202
- package/dist/README.md +0 -3
- package/dist/bundle/index.js +0 -1
- package/dist/main/index.js +0 -1161
- package/dist/module/module.js +0 -1159
- package/dist/package.json +0 -37
- package/dist/types/index.d.ts +0 -732
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { E as ElementError, c as createIframe, a as createPostMessageClient, b as createEventDispatcher, l as log, d as createMounter } from "./index-oREjBjga.js";
|
|
2
|
+
const DEFAULT_CARD_STACK_THRESHOLD = 400;
|
|
3
|
+
const createCardElement = (apiKey, sdkConfig, options = {}, coordinatorElementId, ensureCoordinatorReady) => {
|
|
4
|
+
let iframe = null;
|
|
5
|
+
let client = null;
|
|
6
|
+
let mounter = null;
|
|
7
|
+
let isMounted = false;
|
|
8
|
+
let container = null;
|
|
9
|
+
let eventDispatcher = null;
|
|
10
|
+
const eventTarget = new EventTarget();
|
|
11
|
+
const id = coordinatorElementId;
|
|
12
|
+
const type = "card";
|
|
13
|
+
const setupEventListeners = () => {
|
|
14
|
+
if (!client) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
eventDispatcher = createEventDispatcher({
|
|
18
|
+
elementType: type,
|
|
19
|
+
elementId: id,
|
|
20
|
+
client,
|
|
21
|
+
eventTarget
|
|
22
|
+
});
|
|
23
|
+
eventDispatcher.setupSubscriptions();
|
|
24
|
+
};
|
|
25
|
+
const createSubElementRef = (subId) => ({
|
|
26
|
+
id: subId,
|
|
27
|
+
type: "card",
|
|
28
|
+
get mounted() {
|
|
29
|
+
return isMounted;
|
|
30
|
+
},
|
|
31
|
+
mount: () => {
|
|
32
|
+
throw ElementError("Sub-field refs cannot be mounted independently");
|
|
33
|
+
},
|
|
34
|
+
unmount: () => {
|
|
35
|
+
},
|
|
36
|
+
update: () => Promise.resolve(),
|
|
37
|
+
focus: () => {
|
|
38
|
+
},
|
|
39
|
+
blur: () => {
|
|
40
|
+
},
|
|
41
|
+
clear: () => {
|
|
42
|
+
},
|
|
43
|
+
on: () => () => {
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
const cardElement = {
|
|
47
|
+
id,
|
|
48
|
+
type,
|
|
49
|
+
get mounted() {
|
|
50
|
+
return isMounted;
|
|
51
|
+
},
|
|
52
|
+
// Sub-field references for tokenization
|
|
53
|
+
fields: {
|
|
54
|
+
number: createSubElementRef(`${id}__number`),
|
|
55
|
+
expiryDate: createSubElementRef(`${id}__expiry`),
|
|
56
|
+
cvc: createSubElementRef(`${id}__cvc`)
|
|
57
|
+
},
|
|
58
|
+
mount: async (selector) => {
|
|
59
|
+
if (isMounted) {
|
|
60
|
+
throw ElementError("Element is already mounted");
|
|
61
|
+
}
|
|
62
|
+
container = typeof selector === "string" ? document.querySelector(selector) : selector;
|
|
63
|
+
if (!container) {
|
|
64
|
+
throw ElementError(`Container not found: ${selector}`);
|
|
65
|
+
}
|
|
66
|
+
const parentOrigin = window.location.origin;
|
|
67
|
+
const iframeUrl = new URL(`${sdkConfig.elementsBaseUrl}/card.html`);
|
|
68
|
+
iframeUrl.searchParams.set("parentOrigin", parentOrigin);
|
|
69
|
+
iframeUrl.searchParams.set("elementId", id);
|
|
70
|
+
iframeUrl.searchParams.set(
|
|
71
|
+
"measurePerformance",
|
|
72
|
+
String(sdkConfig.measurePerformance || false)
|
|
73
|
+
);
|
|
74
|
+
iframeUrl.searchParams.set("debug", String(sdkConfig.debug || false));
|
|
75
|
+
iframe = createIframe({
|
|
76
|
+
src: iframeUrl.toString(),
|
|
77
|
+
sandbox: "allow-scripts allow-same-origin",
|
|
78
|
+
title: options.ariaLabel || "Card Input"
|
|
79
|
+
});
|
|
80
|
+
iframe.setAttribute("data-bt-element-id", id);
|
|
81
|
+
iframe.setAttribute("data-theme-mode", sdkConfig.themeMode || "auto");
|
|
82
|
+
client = createPostMessageClient(iframe, {
|
|
83
|
+
targetOrigin: sdkConfig.iframeOrigin,
|
|
84
|
+
timeout: sdkConfig.timeoutMs,
|
|
85
|
+
retries: sdkConfig.retryConfig.maxRetries,
|
|
86
|
+
debug: sdkConfig.debug
|
|
87
|
+
});
|
|
88
|
+
mounter = createMounter();
|
|
89
|
+
setupEventListeners();
|
|
90
|
+
const readyPromise = new Promise((resolve, reject) => {
|
|
91
|
+
const timeout = setTimeout(() => {
|
|
92
|
+
reject(
|
|
93
|
+
ElementError(
|
|
94
|
+
`Iframe EVENT_READY not received within ${sdkConfig.timeoutMs}ms`,
|
|
95
|
+
id,
|
|
96
|
+
{ elementType: type, timeoutMs: sdkConfig.timeoutMs }
|
|
97
|
+
)
|
|
98
|
+
);
|
|
99
|
+
}, sdkConfig.timeoutMs);
|
|
100
|
+
const handleReady = () => {
|
|
101
|
+
clearTimeout(timeout);
|
|
102
|
+
resolve();
|
|
103
|
+
};
|
|
104
|
+
eventTarget.addEventListener("ready", handleReady, { once: true });
|
|
105
|
+
});
|
|
106
|
+
mounter.mount(container, iframe, {
|
|
107
|
+
timeoutMs: sdkConfig.timeoutMs
|
|
108
|
+
});
|
|
109
|
+
isMounted = true;
|
|
110
|
+
try {
|
|
111
|
+
await ensureCoordinatorReady();
|
|
112
|
+
await readyPromise;
|
|
113
|
+
await client.sendRequest("CMD_SET_CONFIG", {
|
|
114
|
+
elementId: id,
|
|
115
|
+
apiKey,
|
|
116
|
+
apiTimeout: sdkConfig.timeoutMs,
|
|
117
|
+
apiRetries: sdkConfig.retryConfig.maxRetries,
|
|
118
|
+
theme: sdkConfig.theme,
|
|
119
|
+
darkTheme: sdkConfig.darkTheme,
|
|
120
|
+
themeMode: sdkConfig.themeMode,
|
|
121
|
+
placeholder: options.placeholder,
|
|
122
|
+
style: options.style,
|
|
123
|
+
disabled: options.disabled,
|
|
124
|
+
readOnly: options.readOnly,
|
|
125
|
+
layout: options.layout || "auto",
|
|
126
|
+
stackAt: options.stackAt || DEFAULT_CARD_STACK_THRESHOLD,
|
|
127
|
+
iconPosition: options.iconPosition || "left",
|
|
128
|
+
cardBrands: options.cardBrands,
|
|
129
|
+
debug: sdkConfig.debug
|
|
130
|
+
});
|
|
131
|
+
if (iframe) iframe.style.opacity = "1";
|
|
132
|
+
} catch (error) {
|
|
133
|
+
if (eventDispatcher) {
|
|
134
|
+
eventDispatcher.dispatchError(
|
|
135
|
+
"MOUNT_ERROR",
|
|
136
|
+
error.message,
|
|
137
|
+
error
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
isMounted = false;
|
|
141
|
+
if (client) {
|
|
142
|
+
client.destroy();
|
|
143
|
+
client = null;
|
|
144
|
+
}
|
|
145
|
+
if (mounter && iframe) {
|
|
146
|
+
mounter.unmount(iframe);
|
|
147
|
+
iframe = null;
|
|
148
|
+
mounter = null;
|
|
149
|
+
}
|
|
150
|
+
eventDispatcher = null;
|
|
151
|
+
container = null;
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
unmount: () => {
|
|
156
|
+
if (!isMounted) {
|
|
157
|
+
throw ElementError("Element is not mounted");
|
|
158
|
+
}
|
|
159
|
+
if (client) {
|
|
160
|
+
client.sendRequest("CMD_CLEAR_CACHE", {}).catch((error) => {
|
|
161
|
+
log("Failed to send clear cache command", {
|
|
162
|
+
error: error.message
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
client.destroy();
|
|
166
|
+
client = null;
|
|
167
|
+
}
|
|
168
|
+
if (mounter && iframe) {
|
|
169
|
+
mounter.unmount(iframe);
|
|
170
|
+
iframe = null;
|
|
171
|
+
mounter = null;
|
|
172
|
+
}
|
|
173
|
+
eventDispatcher = null;
|
|
174
|
+
container = null;
|
|
175
|
+
isMounted = false;
|
|
176
|
+
},
|
|
177
|
+
update: async (newOptions) => {
|
|
178
|
+
if (!isMounted || !client) {
|
|
179
|
+
throw ElementError("Element must be mounted before updating");
|
|
180
|
+
}
|
|
181
|
+
const cardOptions = newOptions;
|
|
182
|
+
const updatePayload = {
|
|
183
|
+
placeholder: cardOptions.placeholder,
|
|
184
|
+
style: cardOptions.style,
|
|
185
|
+
disabled: cardOptions.disabled,
|
|
186
|
+
readOnly: cardOptions.readOnly,
|
|
187
|
+
layout: cardOptions.layout,
|
|
188
|
+
stackAt: cardOptions.stackAt,
|
|
189
|
+
iconPosition: cardOptions.iconPosition,
|
|
190
|
+
cardBrands: cardOptions.cardBrands
|
|
191
|
+
};
|
|
192
|
+
if (newOptions.themeMode !== void 0) {
|
|
193
|
+
updatePayload.themeMode = newOptions.themeMode;
|
|
194
|
+
updatePayload.theme = sdkConfig.theme;
|
|
195
|
+
updatePayload.darkTheme = sdkConfig.darkTheme;
|
|
196
|
+
}
|
|
197
|
+
await client.sendRequest("CMD_UPDATE_CONFIG", updatePayload);
|
|
198
|
+
},
|
|
199
|
+
focus: () => {
|
|
200
|
+
if (!isMounted || !client) {
|
|
201
|
+
throw ElementError("Element must be mounted before focusing");
|
|
202
|
+
}
|
|
203
|
+
client.sendRequest("CMD_FOCUS", {});
|
|
204
|
+
},
|
|
205
|
+
blur: () => {
|
|
206
|
+
if (!isMounted || !client) {
|
|
207
|
+
throw ElementError("Element must be mounted before blurring");
|
|
208
|
+
}
|
|
209
|
+
client.sendRequest("CMD_BLUR", {});
|
|
210
|
+
},
|
|
211
|
+
clear: () => {
|
|
212
|
+
if (!isMounted || !client) {
|
|
213
|
+
throw ElementError("Element must be mounted before clearing");
|
|
214
|
+
}
|
|
215
|
+
client.sendRequest("CMD_CLEAR", {});
|
|
216
|
+
},
|
|
217
|
+
on: (eventType, listener) => {
|
|
218
|
+
eventTarget.addEventListener(
|
|
219
|
+
eventType,
|
|
220
|
+
listener
|
|
221
|
+
);
|
|
222
|
+
return () => eventTarget.removeEventListener(
|
|
223
|
+
eventType,
|
|
224
|
+
listener
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
return cardElement;
|
|
229
|
+
};
|
|
230
|
+
export {
|
|
231
|
+
createCardElement
|
|
232
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-card-BuOvimjH.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/**\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): 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 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 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 cardBrands: options.cardBrands,\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 // Tell iframe to notify coordinator to clear cached values (all 3 sub-fields)\n if (client) {\n client.sendRequest('CMD_CLEAR_CACHE', {}).catch((error) => {\n log('Failed to send clear cache command', {\n elementId: id,\n error: (error as Error).message,\n });\n });\n\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 // Cast to CardElementOptions to access card-specific properties\n const cardOptions = newOptions as Partial<CardElementOptions> & { themeMode?: string };\n\n // Build update payload\n const updatePayload: Record<string, any> = {\n placeholder: cardOptions.placeholder,\n style: cardOptions.style,\n disabled: cardOptions.disabled,\n readOnly: cardOptions.readOnly,\n layout: cardOptions.layout,\n stackAt: cardOptions.stackAt,\n iconPosition: cardOptions.iconPosition,\n cardBrands: cardOptions.cardBrands,\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');\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\n return cardElement as CardElement;\n};\n"],"names":[],"mappings":"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"}
|