@frak-labs/core-sdk 0.1.0-beta.8d103039 → 0.1.0-beta.b0bd1f8a

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 (90) hide show
  1. package/cdn/bundle.iife.js +14 -0
  2. package/dist/actions-CEEObPYc.js +1 -0
  3. package/dist/actions-DbQhWYx8.cjs +1 -0
  4. package/dist/actions.cjs +1 -1
  5. package/dist/actions.d.cts +3 -1481
  6. package/dist/actions.d.ts +3 -1481
  7. package/dist/actions.js +1 -1
  8. package/dist/bundle.cjs +1 -13
  9. package/dist/bundle.d.cts +6 -2087
  10. package/dist/bundle.d.ts +6 -2087
  11. package/dist/bundle.js +1 -13
  12. package/dist/index-7OZ39x1U.d.ts +195 -0
  13. package/dist/index-C6FxkWPC.d.cts +511 -0
  14. package/dist/index-UFX7xCg3.d.ts +351 -0
  15. package/dist/index-d8xS4ryI.d.ts +511 -0
  16. package/dist/index-p4FqSp8z.d.cts +351 -0
  17. package/dist/index-zDq-VlKx.d.cts +195 -0
  18. package/dist/index.cjs +1 -13
  19. package/dist/index.d.cts +4 -1387
  20. package/dist/index.d.ts +4 -1387
  21. package/dist/index.js +1 -13
  22. package/dist/interaction-DMJ3ZfaF.d.cts +45 -0
  23. package/dist/interaction-KX1h9a7V.d.ts +45 -0
  24. package/dist/interactions-DnfM3oe0.js +1 -0
  25. package/dist/interactions-EIXhNLf6.cjs +1 -0
  26. package/dist/interactions.cjs +1 -1
  27. package/dist/interactions.d.cts +2 -182
  28. package/dist/interactions.d.ts +2 -182
  29. package/dist/interactions.js +1 -1
  30. package/dist/openSso-D--Airj6.d.cts +1018 -0
  31. package/dist/openSso-DsKJ4y0j.d.ts +1018 -0
  32. package/dist/productTypes-BUkXJKZ7.cjs +1 -0
  33. package/dist/productTypes-CGb1MmBF.js +1 -0
  34. package/dist/src-B_xO0AR6.cjs +13 -0
  35. package/dist/src-D2d52OZa.js +13 -0
  36. package/dist/trackEvent-CHnYa85W.js +1 -0
  37. package/dist/trackEvent-GuQm_1Nm.cjs +1 -0
  38. package/package.json +21 -17
  39. package/src/actions/displayEmbeddedWallet.test.ts +194 -0
  40. package/src/actions/displayModal.test.ts +387 -0
  41. package/src/actions/getProductInformation.test.ts +133 -0
  42. package/src/actions/index.ts +19 -19
  43. package/src/actions/openSso.test.ts +407 -0
  44. package/src/actions/prepareSso.test.ts +223 -0
  45. package/src/actions/referral/processReferral.ts +1 -1
  46. package/src/actions/referral/referralInteraction.ts +1 -1
  47. package/src/actions/sendInteraction.test.ts +219 -0
  48. package/src/actions/trackPurchaseStatus.test.ts +287 -0
  49. package/src/actions/watchWalletStatus.test.ts +372 -0
  50. package/src/bundle.ts +1 -1
  51. package/src/clients/createIFrameFrakClient.ts +2 -2
  52. package/src/clients/index.ts +1 -1
  53. package/src/clients/setupClient.test.ts +343 -0
  54. package/src/clients/setupClient.ts +3 -1
  55. package/src/clients/transports/iframeLifecycleManager.test.ts +399 -0
  56. package/src/clients/transports/iframeLifecycleManager.ts +3 -1
  57. package/src/index.ts +72 -74
  58. package/src/interactions/index.ts +2 -2
  59. package/src/interactions/pressEncoder.test.ts +215 -0
  60. package/src/interactions/pressEncoder.ts +1 -1
  61. package/src/interactions/purchaseEncoder.test.ts +291 -0
  62. package/src/interactions/purchaseEncoder.ts +8 -3
  63. package/src/interactions/referralEncoder.test.ts +170 -0
  64. package/src/interactions/retailEncoder.test.ts +107 -0
  65. package/src/interactions/retailEncoder.ts +1 -1
  66. package/src/interactions/webshopEncoder.test.ts +56 -0
  67. package/src/types/index.ts +51 -50
  68. package/src/types/lifecycle/index.ts +1 -1
  69. package/src/types/rpc/embedded/loggedIn.ts +1 -1
  70. package/src/types/rpc/embedded/loggedOut.ts +1 -1
  71. package/src/types/rpc/modal/index.ts +11 -11
  72. package/src/utils/FrakContext.test.ts +407 -0
  73. package/src/utils/FrakContext.ts +8 -2
  74. package/src/utils/compression/b64.test.ts +181 -0
  75. package/src/utils/compression/compress.test.ts +123 -0
  76. package/src/utils/compression/decompress.test.ts +145 -0
  77. package/src/utils/compression/index.ts +1 -1
  78. package/src/utils/computeProductId.test.ts +80 -0
  79. package/src/utils/constants.test.ts +23 -0
  80. package/src/utils/formatAmount.test.ts +113 -0
  81. package/src/utils/getCurrencyAmountKey.test.ts +44 -0
  82. package/src/utils/getSupportedCurrency.test.ts +51 -0
  83. package/src/utils/getSupportedLocale.test.ts +64 -0
  84. package/src/utils/iframeHelper.test.ts +450 -0
  85. package/src/utils/iframeHelper.ts +4 -3
  86. package/src/utils/index.ts +12 -12
  87. package/src/utils/sso.test.ts +361 -0
  88. package/src/utils/trackEvent.test.ts +162 -0
  89. package/cdn/bundle.js +0 -19
  90. package/cdn/bundle.js.LICENSE.txt +0 -10
@@ -0,0 +1,343 @@
1
+ import { beforeEach, describe, expect, test, vi } from "vitest";
2
+
3
+ // Mock dependencies
4
+ vi.mock("../utils", () => ({
5
+ createIframe: vi.fn(),
6
+ getSupportedCurrency: vi.fn((currency) => currency || "eur"),
7
+ }));
8
+
9
+ vi.mock("./createIFrameFrakClient", () => ({
10
+ createIFrameFrakClient: vi.fn(),
11
+ }));
12
+
13
+ describe("setupClient", () => {
14
+ beforeEach(() => {
15
+ vi.clearAllMocks();
16
+ });
17
+
18
+ describe("client setup", () => {
19
+ test("should create iframe with prepared config", async () => {
20
+ const { setupClient } = await import("./setupClient");
21
+ const { createIframe } = await import("../utils");
22
+ const { createIFrameFrakClient } = await import(
23
+ "./createIFrameFrakClient"
24
+ );
25
+
26
+ const mockIframe = document.createElement("iframe");
27
+ const mockClient = {
28
+ waitForSetup: Promise.resolve(),
29
+ waitForConnection: Promise.resolve(true),
30
+ };
31
+
32
+ vi.mocked(createIframe).mockResolvedValue(mockIframe);
33
+ vi.mocked(createIFrameFrakClient).mockReturnValue(
34
+ mockClient as any
35
+ );
36
+
37
+ const config = {
38
+ metadata: {
39
+ name: "Test App",
40
+ },
41
+ };
42
+
43
+ await setupClient({ config });
44
+
45
+ expect(createIframe).toHaveBeenCalledWith({
46
+ config: expect.objectContaining({
47
+ metadata: expect.objectContaining({
48
+ name: "Test App",
49
+ currency: "eur",
50
+ }),
51
+ }),
52
+ });
53
+ });
54
+
55
+ test("should preserve custom currency in config", async () => {
56
+ const { setupClient } = await import("./setupClient");
57
+ const { createIframe } = await import("../utils");
58
+ const { createIFrameFrakClient } = await import(
59
+ "./createIFrameFrakClient"
60
+ );
61
+ const { getSupportedCurrency } = await import("../utils");
62
+
63
+ const mockIframe = document.createElement("iframe");
64
+ const mockClient = {
65
+ waitForSetup: Promise.resolve(),
66
+ waitForConnection: Promise.resolve(true),
67
+ };
68
+
69
+ vi.mocked(getSupportedCurrency).mockReturnValue("usd");
70
+ vi.mocked(createIframe).mockResolvedValue(mockIframe);
71
+ vi.mocked(createIFrameFrakClient).mockReturnValue(
72
+ mockClient as any
73
+ );
74
+
75
+ const config = {
76
+ metadata: {
77
+ name: "Test App",
78
+ currency: "usd" as const,
79
+ },
80
+ };
81
+
82
+ await setupClient({ config });
83
+
84
+ expect(getSupportedCurrency).toHaveBeenCalledWith("usd");
85
+ expect(createIframe).toHaveBeenCalledWith({
86
+ config: expect.objectContaining({
87
+ metadata: expect.objectContaining({
88
+ currency: "usd",
89
+ }),
90
+ }),
91
+ });
92
+ });
93
+
94
+ test("should return undefined when iframe creation fails", async () => {
95
+ const { setupClient } = await import("./setupClient");
96
+ const { createIframe } = await import("../utils");
97
+
98
+ vi.mocked(createIframe).mockResolvedValue(undefined);
99
+
100
+ const config = {
101
+ metadata: {
102
+ name: "Test App",
103
+ },
104
+ };
105
+
106
+ const result = await setupClient({ config });
107
+
108
+ expect(result).toBeUndefined();
109
+ });
110
+
111
+ test("should create FrakClient with iframe", async () => {
112
+ const { setupClient } = await import("./setupClient");
113
+ const { createIframe } = await import("../utils");
114
+ const { createIFrameFrakClient } = await import(
115
+ "./createIFrameFrakClient"
116
+ );
117
+
118
+ const mockIframe = document.createElement("iframe");
119
+ const mockClient = {
120
+ waitForSetup: Promise.resolve(),
121
+ waitForConnection: Promise.resolve(true),
122
+ };
123
+
124
+ vi.mocked(createIframe).mockResolvedValue(mockIframe);
125
+ vi.mocked(createIFrameFrakClient).mockReturnValue(
126
+ mockClient as any
127
+ );
128
+
129
+ const config = {
130
+ metadata: {
131
+ name: "Test App",
132
+ },
133
+ };
134
+
135
+ await setupClient({ config });
136
+
137
+ expect(createIFrameFrakClient).toHaveBeenCalledWith({
138
+ config: expect.objectContaining({
139
+ metadata: expect.objectContaining({
140
+ name: "Test App",
141
+ }),
142
+ }),
143
+ iframe: mockIframe,
144
+ });
145
+ });
146
+
147
+ test("should wait for client setup", async () => {
148
+ const { setupClient } = await import("./setupClient");
149
+ const { createIframe } = await import("../utils");
150
+ const { createIFrameFrakClient } = await import(
151
+ "./createIFrameFrakClient"
152
+ );
153
+
154
+ const mockIframe = document.createElement("iframe");
155
+ const setupPromise = Promise.resolve();
156
+ const mockClient = {
157
+ waitForSetup: setupPromise,
158
+ waitForConnection: Promise.resolve(true),
159
+ };
160
+
161
+ vi.mocked(createIframe).mockResolvedValue(mockIframe);
162
+ vi.mocked(createIFrameFrakClient).mockReturnValue(
163
+ mockClient as any
164
+ );
165
+
166
+ const config = {
167
+ metadata: {
168
+ name: "Test App",
169
+ },
170
+ };
171
+
172
+ await setupClient({ config });
173
+
174
+ // Verify setup was awaited
175
+ await expect(setupPromise).resolves.toBeUndefined();
176
+ });
177
+
178
+ test("should wait for connection", async () => {
179
+ const { setupClient } = await import("./setupClient");
180
+ const { createIframe } = await import("../utils");
181
+ const { createIFrameFrakClient } = await import(
182
+ "./createIFrameFrakClient"
183
+ );
184
+
185
+ const mockIframe = document.createElement("iframe");
186
+ const connectionPromise = Promise.resolve(true);
187
+ const mockClient = {
188
+ waitForSetup: Promise.resolve(),
189
+ waitForConnection: connectionPromise,
190
+ };
191
+
192
+ vi.mocked(createIframe).mockResolvedValue(mockIframe);
193
+ vi.mocked(createIFrameFrakClient).mockReturnValue(
194
+ mockClient as any
195
+ );
196
+
197
+ const config = {
198
+ metadata: {
199
+ name: "Test App",
200
+ },
201
+ };
202
+
203
+ await setupClient({ config });
204
+
205
+ // Verify connection was awaited
206
+ await expect(connectionPromise).resolves.toBe(true);
207
+ });
208
+
209
+ test("should return undefined when connection fails", async () => {
210
+ const { setupClient } = await import("./setupClient");
211
+ const { createIframe } = await import("../utils");
212
+ const { createIFrameFrakClient } = await import(
213
+ "./createIFrameFrakClient"
214
+ );
215
+
216
+ const mockIframe = document.createElement("iframe");
217
+ const mockClient = {
218
+ waitForSetup: Promise.resolve(),
219
+ waitForConnection: Promise.resolve(false),
220
+ };
221
+
222
+ vi.mocked(createIframe).mockResolvedValue(mockIframe);
223
+ vi.mocked(createIFrameFrakClient).mockReturnValue(
224
+ mockClient as any
225
+ );
226
+
227
+ const config = {
228
+ metadata: {
229
+ name: "Test App",
230
+ },
231
+ };
232
+
233
+ const result = await setupClient({ config });
234
+
235
+ expect(result).toBeUndefined();
236
+ });
237
+
238
+ test("should return client when setup successful", async () => {
239
+ const { setupClient } = await import("./setupClient");
240
+ const { createIframe } = await import("../utils");
241
+ const { createIFrameFrakClient } = await import(
242
+ "./createIFrameFrakClient"
243
+ );
244
+
245
+ const mockIframe = document.createElement("iframe");
246
+ const mockClient = {
247
+ waitForSetup: Promise.resolve(),
248
+ waitForConnection: Promise.resolve(true),
249
+ request: vi.fn(),
250
+ };
251
+
252
+ vi.mocked(createIframe).mockResolvedValue(mockIframe);
253
+ vi.mocked(createIFrameFrakClient).mockReturnValue(
254
+ mockClient as any
255
+ );
256
+
257
+ const config = {
258
+ metadata: {
259
+ name: "Test App",
260
+ },
261
+ };
262
+
263
+ const result = await setupClient({ config });
264
+
265
+ expect(result).toBe(mockClient);
266
+ });
267
+ });
268
+
269
+ describe("config preparation", () => {
270
+ test("should use default currency when none provided", async () => {
271
+ const { setupClient } = await import("./setupClient");
272
+ const { createIframe } = await import("../utils");
273
+ const { createIFrameFrakClient } = await import(
274
+ "./createIFrameFrakClient"
275
+ );
276
+ const { getSupportedCurrency } = await import("../utils");
277
+
278
+ const mockIframe = document.createElement("iframe");
279
+ const mockClient = {
280
+ waitForSetup: Promise.resolve(),
281
+ waitForConnection: Promise.resolve(true),
282
+ };
283
+
284
+ vi.mocked(getSupportedCurrency).mockReturnValue("eur");
285
+ vi.mocked(createIframe).mockResolvedValue(mockIframe);
286
+ vi.mocked(createIFrameFrakClient).mockReturnValue(
287
+ mockClient as any
288
+ );
289
+
290
+ const config = {
291
+ metadata: {
292
+ name: "Test App",
293
+ },
294
+ };
295
+
296
+ await setupClient({ config });
297
+
298
+ expect(getSupportedCurrency).toHaveBeenCalledWith(undefined);
299
+ });
300
+
301
+ test("should merge metadata with prepared config", async () => {
302
+ const { setupClient } = await import("./setupClient");
303
+ const { createIframe } = await import("../utils");
304
+ const { createIFrameFrakClient } = await import(
305
+ "./createIFrameFrakClient"
306
+ );
307
+
308
+ const mockIframe = document.createElement("iframe");
309
+ const mockClient = {
310
+ waitForSetup: Promise.resolve(),
311
+ waitForConnection: Promise.resolve(true),
312
+ };
313
+
314
+ vi.mocked(createIframe).mockResolvedValue(mockIframe);
315
+ vi.mocked(createIFrameFrakClient).mockReturnValue(
316
+ mockClient as any
317
+ );
318
+
319
+ const config = {
320
+ metadata: {
321
+ name: "Test App",
322
+ css: {
323
+ primaryColor: "#ff0000",
324
+ },
325
+ },
326
+ };
327
+
328
+ await setupClient({ config });
329
+
330
+ expect(createIframe).toHaveBeenCalledWith({
331
+ config: expect.objectContaining({
332
+ metadata: expect.objectContaining({
333
+ name: "Test App",
334
+ css: {
335
+ primaryColor: "#ff0000",
336
+ },
337
+ currency: "eur",
338
+ }),
339
+ }),
340
+ });
341
+ });
342
+ });
343
+ });
@@ -19,7 +19,9 @@ import { createIframe, getSupportedCurrency } from "../utils";
19
19
  */
20
20
  export async function setupClient({
21
21
  config,
22
- }: { config: FrakWalletSdkConfig }): Promise<FrakClient | undefined> {
22
+ }: {
23
+ config: FrakWalletSdkConfig;
24
+ }): Promise<FrakClient | undefined> {
23
25
  // Prepare the config
24
26
  const preparedConfig = prepareConfig(config);
25
27