@fias/arche-sdk 1.1.1 → 1.1.3
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/bridge.d.ts +8 -1
- package/dist/bridge.d.ts.map +1 -1
- package/dist/bridge.js +18 -5
- package/dist/bridge.js.map +1 -1
- package/dist/bridge.test.d.ts +2 -0
- package/dist/bridge.test.d.ts.map +1 -0
- package/dist/bridge.test.js +407 -0
- package/dist/bridge.test.js.map +1 -0
- package/dist/cli/create-plugin.test.d.ts +1 -0
- package/dist/cli/create-plugin.test.d.ts.map +1 -0
- package/dist/cli/create-plugin.test.js +90 -0
- package/dist/cli/create-plugin.test.js.map +1 -0
- package/dist/fias.test.d.ts +2 -0
- package/dist/fias.test.d.ts.map +1 -0
- package/dist/fias.test.js +49 -0
- package/dist/fias.test.js.map +1 -0
- package/dist/hooks.test.d.ts +9 -0
- package/dist/hooks.test.d.ts.map +1 -0
- package/dist/hooks.test.js +180 -0
- package/dist/hooks.test.js.map +1 -0
- package/dist/index.mjs +16 -6
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +6 -2
- package/dist/provider.js.map +1 -1
- package/dist/provider.test.d.ts +10 -0
- package/dist/provider.test.d.ts.map +1 -0
- package/dist/provider.test.js +96 -0
- package/dist/provider.test.js.map +1 -0
- package/package.json +1 -1
package/dist/bridge.d.ts
CHANGED
|
@@ -14,7 +14,13 @@ export declare class FiasBridge {
|
|
|
14
14
|
private currentPath;
|
|
15
15
|
private themeListeners;
|
|
16
16
|
private navigationListeners;
|
|
17
|
+
private listening;
|
|
17
18
|
constructor();
|
|
19
|
+
/**
|
|
20
|
+
* Register the message listener. Safe to call multiple times —
|
|
21
|
+
* will not add duplicate listeners.
|
|
22
|
+
*/
|
|
23
|
+
attach(): void;
|
|
18
24
|
/**
|
|
19
25
|
* Wait for the host to send the init message.
|
|
20
26
|
*/
|
|
@@ -42,7 +48,8 @@ export declare class FiasBridge {
|
|
|
42
48
|
onThemeUpdate(listener: (theme: FiasTheme) => void): () => void;
|
|
43
49
|
onNavigationUpdate(listener: (path: string) => void): () => void;
|
|
44
50
|
/**
|
|
45
|
-
* Clean up event listeners
|
|
51
|
+
* Clean up event listeners and pending requests.
|
|
52
|
+
* After destroy(), the bridge can be re-activated by calling attach().
|
|
46
53
|
*/
|
|
47
54
|
destroy(): void;
|
|
48
55
|
private handleMessage;
|
package/dist/bridge.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,uBAAuB,EACvB,SAAS,EACT,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAgBjB;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,mBAAmB,CAAqC;;
|
|
1
|
+
{"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,uBAAuB,EACvB,SAAS,EACT,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAgBjB;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,WAAW,CAA0B;IAC7C,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,cAAc,CAAyC;IAC/D,OAAO,CAAC,mBAAmB,CAAqC;IAChE,OAAO,CAAC,SAAS,CAAS;;IAU1B;;;OAGG;IACH,MAAM,IAAI,IAAI;IAOd;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAKlC;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI5B;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAgB,GAAG,IAAI;IAI5F;;OAEG;IACG,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAoB7E,SAAS,IAAI,MAAM;IAInB,cAAc,IAAI,gBAAgB,EAAE;IAIpC,QAAQ,IAAI,SAAS,GAAG,IAAI;IAI5B,cAAc,IAAI,MAAM;IAIxB,aAAa,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI;IAK/D,kBAAkB,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;IAKhE;;;OAGG;IACH,OAAO,IAAI,IAAI;IAcf,OAAO,CAAC,aAAa,CAiDnB;IAEF,OAAO,CAAC,IAAI;CAWb;AASD,wBAAgB,SAAS,IAAI,UAAU,CAKtC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAGlC"}
|
package/dist/bridge.js
CHANGED
|
@@ -24,6 +24,7 @@ class FiasBridge {
|
|
|
24
24
|
this.currentPath = '';
|
|
25
25
|
this.themeListeners = new Set();
|
|
26
26
|
this.navigationListeners = new Set();
|
|
27
|
+
this.listening = false;
|
|
27
28
|
this.handleMessage = (event) => {
|
|
28
29
|
const data = event.data;
|
|
29
30
|
if (!data || typeof data !== 'object' || !data.type)
|
|
@@ -74,8 +75,16 @@ class FiasBridge {
|
|
|
74
75
|
this.initPromise = new Promise((resolve) => {
|
|
75
76
|
this.initResolve = resolve;
|
|
76
77
|
});
|
|
77
|
-
|
|
78
|
+
this.attach();
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Register the message listener. Safe to call multiple times —
|
|
82
|
+
* will not add duplicate listeners.
|
|
83
|
+
*/
|
|
84
|
+
attach() {
|
|
85
|
+
if (typeof window !== 'undefined' && !this.listening) {
|
|
78
86
|
window.addEventListener('message', this.handleMessage);
|
|
87
|
+
this.listening = true;
|
|
79
88
|
}
|
|
80
89
|
}
|
|
81
90
|
/**
|
|
@@ -144,11 +153,13 @@ class FiasBridge {
|
|
|
144
153
|
return () => this.navigationListeners.delete(listener);
|
|
145
154
|
}
|
|
146
155
|
/**
|
|
147
|
-
* Clean up event listeners
|
|
156
|
+
* Clean up event listeners and pending requests.
|
|
157
|
+
* After destroy(), the bridge can be re-activated by calling attach().
|
|
148
158
|
*/
|
|
149
159
|
destroy() {
|
|
150
|
-
if (typeof window !== 'undefined') {
|
|
160
|
+
if (typeof window !== 'undefined' && this.listening) {
|
|
151
161
|
window.removeEventListener('message', this.handleMessage);
|
|
162
|
+
this.listening = false;
|
|
152
163
|
}
|
|
153
164
|
for (const pending of this.pendingRequests.values()) {
|
|
154
165
|
clearTimeout(pending.timer);
|
|
@@ -171,9 +182,11 @@ class FiasBridge {
|
|
|
171
182
|
}
|
|
172
183
|
exports.FiasBridge = FiasBridge;
|
|
173
184
|
/**
|
|
174
|
-
* Singleton bridge instance.
|
|
185
|
+
* Singleton bridge instance. Eagerly created at module scope so the
|
|
186
|
+
* message listener is registered synchronously during import, before
|
|
187
|
+
* the iframe `load` event fires and the host sends the init message.
|
|
175
188
|
*/
|
|
176
|
-
let bridgeInstance = null;
|
|
189
|
+
let bridgeInstance = typeof window !== 'undefined' ? new FiasBridge() : null;
|
|
177
190
|
function getBridge() {
|
|
178
191
|
if (!bridgeInstance) {
|
|
179
192
|
bridgeInstance = new FiasBridge();
|
package/dist/bridge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.test.d.ts","sourceRoot":"","sources":["../src/bridge.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const bridge_1 = require("./bridge");
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Window mock helpers
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
const listeners = {};
|
|
8
|
+
const postMessageSpy = jest.fn();
|
|
9
|
+
function setupWindowMock() {
|
|
10
|
+
global.window = {
|
|
11
|
+
addEventListener: jest.fn((type, handler) => {
|
|
12
|
+
if (!listeners[type])
|
|
13
|
+
listeners[type] = [];
|
|
14
|
+
listeners[type].push(handler);
|
|
15
|
+
}),
|
|
16
|
+
removeEventListener: jest.fn((type, handler) => {
|
|
17
|
+
if (listeners[type]) {
|
|
18
|
+
listeners[type] = listeners[type].filter((h) => h !== handler);
|
|
19
|
+
}
|
|
20
|
+
}),
|
|
21
|
+
parent: { postMessage: postMessageSpy },
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function teardownWindowMock() {
|
|
25
|
+
for (const key of Object.keys(listeners)) {
|
|
26
|
+
delete listeners[key];
|
|
27
|
+
}
|
|
28
|
+
postMessageSpy.mockReset();
|
|
29
|
+
delete global.window;
|
|
30
|
+
}
|
|
31
|
+
function dispatchMessage(data) {
|
|
32
|
+
const handlers = [...(listeners['message'] || [])];
|
|
33
|
+
for (const handler of handlers) {
|
|
34
|
+
handler({ data, source: null });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** Flush microtask queue (let awaited promises resolve) */
|
|
38
|
+
function flushMicrotasks() {
|
|
39
|
+
return new Promise((r) => process.nextTick(r));
|
|
40
|
+
}
|
|
41
|
+
const MOCK_THEME = {
|
|
42
|
+
mode: 'dark',
|
|
43
|
+
colors: {
|
|
44
|
+
primary: '#6d28d9',
|
|
45
|
+
secondary: '#1e1b4b',
|
|
46
|
+
background: '#0a0a0f',
|
|
47
|
+
surface: '#27272a',
|
|
48
|
+
text: '#e4e4e7',
|
|
49
|
+
textSecondary: '#a1a1aa',
|
|
50
|
+
border: '#3f3f46',
|
|
51
|
+
error: '#ef4444',
|
|
52
|
+
warning: '#f59e0b',
|
|
53
|
+
success: '#22c55e',
|
|
54
|
+
},
|
|
55
|
+
spacing: { xs: '4px', sm: '8px', md: '16px', lg: '24px', xl: '32px' },
|
|
56
|
+
fonts: {
|
|
57
|
+
body: 'sans-serif',
|
|
58
|
+
heading: 'sans-serif',
|
|
59
|
+
mono: 'monospace',
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
function sendInit(overrides = {}) {
|
|
63
|
+
dispatchMessage({
|
|
64
|
+
type: 'init',
|
|
65
|
+
messageId: 'init_0',
|
|
66
|
+
payload: {
|
|
67
|
+
archId: 'arche_test',
|
|
68
|
+
permissions: ['theme:read', 'entities:invoke'],
|
|
69
|
+
theme: MOCK_THEME,
|
|
70
|
+
currentPath: '/test',
|
|
71
|
+
...overrides,
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/** Find the last postMessage call matching a given type */
|
|
76
|
+
function findSentMessage(type) {
|
|
77
|
+
const calls = postMessageSpy.mock.calls;
|
|
78
|
+
for (let i = calls.length - 1; i >= 0; i--) {
|
|
79
|
+
if (calls[i][0]?.type === type)
|
|
80
|
+
return calls[i][0];
|
|
81
|
+
}
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
// Tests
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
describe('FiasBridge', () => {
|
|
88
|
+
beforeEach(() => {
|
|
89
|
+
setupWindowMock();
|
|
90
|
+
});
|
|
91
|
+
afterEach(() => {
|
|
92
|
+
teardownWindowMock();
|
|
93
|
+
});
|
|
94
|
+
describe('constructor / attach', () => {
|
|
95
|
+
it('registers a message listener on construction', () => {
|
|
96
|
+
new bridge_1.FiasBridge();
|
|
97
|
+
expect(window.addEventListener).toHaveBeenCalledWith('message', expect.any(Function));
|
|
98
|
+
});
|
|
99
|
+
it('does not register duplicate listeners on multiple attach() calls', () => {
|
|
100
|
+
const bridge = new bridge_1.FiasBridge();
|
|
101
|
+
bridge.attach();
|
|
102
|
+
bridge.attach();
|
|
103
|
+
expect(window.addEventListener).toHaveBeenCalledTimes(1);
|
|
104
|
+
});
|
|
105
|
+
it('can re-attach after destroy', () => {
|
|
106
|
+
const bridge = new bridge_1.FiasBridge();
|
|
107
|
+
bridge.destroy();
|
|
108
|
+
bridge.attach();
|
|
109
|
+
expect(window.addEventListener).toHaveBeenCalledTimes(2);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
describe('waitForInit', () => {
|
|
113
|
+
it('resolves when init message is received', async () => {
|
|
114
|
+
const bridge = new bridge_1.FiasBridge();
|
|
115
|
+
const initPromise = bridge.waitForInit();
|
|
116
|
+
sendInit();
|
|
117
|
+
await expect(initPromise).resolves.toBeUndefined();
|
|
118
|
+
});
|
|
119
|
+
it('resolves immediately if already initialized', async () => {
|
|
120
|
+
const bridge = new bridge_1.FiasBridge();
|
|
121
|
+
sendInit();
|
|
122
|
+
await bridge.waitForInit();
|
|
123
|
+
await expect(bridge.waitForInit()).resolves.toBeUndefined();
|
|
124
|
+
});
|
|
125
|
+
it('stores init payload data', async () => {
|
|
126
|
+
const bridge = new bridge_1.FiasBridge();
|
|
127
|
+
sendInit();
|
|
128
|
+
await bridge.waitForInit();
|
|
129
|
+
expect(bridge.getArchId()).toBe('arche_test');
|
|
130
|
+
expect(bridge.getPermissions()).toEqual(['theme:read', 'entities:invoke']);
|
|
131
|
+
expect(bridge.getTheme()).toEqual(MOCK_THEME);
|
|
132
|
+
expect(bridge.getCurrentPath()).toBe('/test');
|
|
133
|
+
});
|
|
134
|
+
it('returns a copy of permissions (not a reference)', async () => {
|
|
135
|
+
const bridge = new bridge_1.FiasBridge();
|
|
136
|
+
sendInit();
|
|
137
|
+
await bridge.waitForInit();
|
|
138
|
+
const perms1 = bridge.getPermissions();
|
|
139
|
+
const perms2 = bridge.getPermissions();
|
|
140
|
+
expect(perms1).not.toBe(perms2);
|
|
141
|
+
expect(perms1).toEqual(perms2);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe('ready / resize / showToast', () => {
|
|
145
|
+
it('sends ready message via postMessage', () => {
|
|
146
|
+
const bridge = new bridge_1.FiasBridge();
|
|
147
|
+
bridge.ready();
|
|
148
|
+
expect(postMessageSpy).toHaveBeenCalledWith(expect.objectContaining({ type: 'ready', payload: {} }), '*');
|
|
149
|
+
});
|
|
150
|
+
it('sends resize message with height', () => {
|
|
151
|
+
const bridge = new bridge_1.FiasBridge();
|
|
152
|
+
bridge.resize(500);
|
|
153
|
+
expect(postMessageSpy).toHaveBeenCalledWith(expect.objectContaining({ type: 'resize', payload: { height: 500 } }), '*');
|
|
154
|
+
});
|
|
155
|
+
it('sends toast message with default variant', () => {
|
|
156
|
+
const bridge = new bridge_1.FiasBridge();
|
|
157
|
+
bridge.showToast('Hello');
|
|
158
|
+
expect(postMessageSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
159
|
+
type: 'toast',
|
|
160
|
+
payload: { message: 'Hello', variant: 'info' },
|
|
161
|
+
}), '*');
|
|
162
|
+
});
|
|
163
|
+
it('sends toast message with custom variant', () => {
|
|
164
|
+
const bridge = new bridge_1.FiasBridge();
|
|
165
|
+
bridge.showToast('Error!', 'error');
|
|
166
|
+
expect(postMessageSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
167
|
+
type: 'toast',
|
|
168
|
+
payload: { message: 'Error!', variant: 'error' },
|
|
169
|
+
}), '*');
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
describe('request', () => {
|
|
173
|
+
it('sends a request and resolves on response', async () => {
|
|
174
|
+
const bridge = new bridge_1.FiasBridge();
|
|
175
|
+
sendInit();
|
|
176
|
+
await bridge.waitForInit();
|
|
177
|
+
postMessageSpy.mockClear();
|
|
178
|
+
const requestPromise = bridge.request('get_user', {});
|
|
179
|
+
// Flush microtasks so the awaited waitForInit() inside request() resolves
|
|
180
|
+
await flushMicrotasks();
|
|
181
|
+
const sentMessage = findSentMessage('get_user');
|
|
182
|
+
expect(sentMessage).toBeDefined();
|
|
183
|
+
dispatchMessage({
|
|
184
|
+
type: 'response',
|
|
185
|
+
messageId: sentMessage.messageId,
|
|
186
|
+
payload: { userId: 'user_123', displayName: 'Test', avatar: null },
|
|
187
|
+
});
|
|
188
|
+
await expect(requestPromise).resolves.toEqual({
|
|
189
|
+
userId: 'user_123',
|
|
190
|
+
displayName: 'Test',
|
|
191
|
+
avatar: null,
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
it('rejects on error response', async () => {
|
|
195
|
+
const bridge = new bridge_1.FiasBridge();
|
|
196
|
+
sendInit();
|
|
197
|
+
await bridge.waitForInit();
|
|
198
|
+
postMessageSpy.mockClear();
|
|
199
|
+
const requestPromise = bridge.request('storage_read', { path: '/test' });
|
|
200
|
+
await flushMicrotasks();
|
|
201
|
+
const sentMessage = findSentMessage('storage_read');
|
|
202
|
+
expect(sentMessage).toBeDefined();
|
|
203
|
+
dispatchMessage({
|
|
204
|
+
type: 'response',
|
|
205
|
+
messageId: sentMessage.messageId,
|
|
206
|
+
payload: null,
|
|
207
|
+
error: 'Permission denied',
|
|
208
|
+
});
|
|
209
|
+
await expect(requestPromise).rejects.toThrow('Permission denied');
|
|
210
|
+
});
|
|
211
|
+
it('rejects on timeout', async () => {
|
|
212
|
+
jest.useFakeTimers();
|
|
213
|
+
try {
|
|
214
|
+
const bridge = new bridge_1.FiasBridge();
|
|
215
|
+
sendInit();
|
|
216
|
+
const requestPromise = bridge.request('get_theme', {});
|
|
217
|
+
// Set up the assertion before advancing timers so the rejection is caught
|
|
218
|
+
const assertion = expect(requestPromise).rejects.toThrow('Bridge request timed out: get_theme');
|
|
219
|
+
await jest.advanceTimersByTimeAsync(30001);
|
|
220
|
+
await assertion;
|
|
221
|
+
}
|
|
222
|
+
finally {
|
|
223
|
+
jest.useRealTimers();
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
it('waits for init before sending', () => {
|
|
227
|
+
const bridge = new bridge_1.FiasBridge();
|
|
228
|
+
postMessageSpy.mockClear();
|
|
229
|
+
// Start request without await — blocks on waitForInit which never resolves
|
|
230
|
+
const promise = bridge.request('get_user', {});
|
|
231
|
+
promise.catch(() => { }); // suppress unhandled rejection on cleanup
|
|
232
|
+
// Synchronously: no message sent because init hasn't happened
|
|
233
|
+
expect(findSentMessage('get_user')).toBeUndefined();
|
|
234
|
+
// Clean up dangling promise
|
|
235
|
+
bridge.destroy();
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
describe('theme updates', () => {
|
|
239
|
+
it('notifies theme listeners', () => {
|
|
240
|
+
const bridge = new bridge_1.FiasBridge();
|
|
241
|
+
const listener = jest.fn();
|
|
242
|
+
bridge.onThemeUpdate(listener);
|
|
243
|
+
const newTheme = { ...MOCK_THEME, mode: 'light' };
|
|
244
|
+
dispatchMessage({ type: 'theme_update', payload: newTheme });
|
|
245
|
+
expect(listener).toHaveBeenCalledWith(newTheme);
|
|
246
|
+
expect(bridge.getTheme()).toEqual(newTheme);
|
|
247
|
+
});
|
|
248
|
+
it('allows unsubscribing from theme updates', () => {
|
|
249
|
+
const bridge = new bridge_1.FiasBridge();
|
|
250
|
+
const listener = jest.fn();
|
|
251
|
+
const unsubscribe = bridge.onThemeUpdate(listener);
|
|
252
|
+
unsubscribe();
|
|
253
|
+
dispatchMessage({ type: 'theme_update', payload: MOCK_THEME });
|
|
254
|
+
expect(listener).not.toHaveBeenCalled();
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
describe('navigation updates', () => {
|
|
258
|
+
it('notifies navigation listeners', () => {
|
|
259
|
+
const bridge = new bridge_1.FiasBridge();
|
|
260
|
+
const listener = jest.fn();
|
|
261
|
+
bridge.onNavigationUpdate(listener);
|
|
262
|
+
dispatchMessage({ type: 'navigate_update', payload: '/new-path' });
|
|
263
|
+
expect(listener).toHaveBeenCalledWith('/new-path');
|
|
264
|
+
expect(bridge.getCurrentPath()).toBe('/new-path');
|
|
265
|
+
});
|
|
266
|
+
it('allows unsubscribing from navigation updates', () => {
|
|
267
|
+
const bridge = new bridge_1.FiasBridge();
|
|
268
|
+
const listener = jest.fn();
|
|
269
|
+
const unsubscribe = bridge.onNavigationUpdate(listener);
|
|
270
|
+
unsubscribe();
|
|
271
|
+
dispatchMessage({ type: 'navigate_update', payload: '/new-path' });
|
|
272
|
+
expect(listener).not.toHaveBeenCalled();
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
describe('destroy', () => {
|
|
276
|
+
it('removes the message listener', () => {
|
|
277
|
+
const bridge = new bridge_1.FiasBridge();
|
|
278
|
+
bridge.destroy();
|
|
279
|
+
expect(window.removeEventListener).toHaveBeenCalledWith('message', expect.any(Function));
|
|
280
|
+
});
|
|
281
|
+
it('rejects pending requests', async () => {
|
|
282
|
+
jest.useFakeTimers();
|
|
283
|
+
try {
|
|
284
|
+
const bridge = new bridge_1.FiasBridge();
|
|
285
|
+
sendInit();
|
|
286
|
+
const requestPromise = bridge.request('get_user', {});
|
|
287
|
+
// Flush microtasks so request() passes waitForInit and registers the pending request
|
|
288
|
+
await jest.advanceTimersByTimeAsync(0);
|
|
289
|
+
bridge.destroy();
|
|
290
|
+
await expect(requestPromise).rejects.toThrow('Bridge destroyed');
|
|
291
|
+
}
|
|
292
|
+
finally {
|
|
293
|
+
jest.useRealTimers();
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
it('clears theme and navigation listeners', () => {
|
|
297
|
+
const bridge = new bridge_1.FiasBridge();
|
|
298
|
+
const themeListener = jest.fn();
|
|
299
|
+
const navListener = jest.fn();
|
|
300
|
+
bridge.onThemeUpdate(themeListener);
|
|
301
|
+
bridge.onNavigationUpdate(navListener);
|
|
302
|
+
bridge.destroy();
|
|
303
|
+
bridge.attach();
|
|
304
|
+
dispatchMessage({ type: 'theme_update', payload: MOCK_THEME });
|
|
305
|
+
dispatchMessage({ type: 'navigate_update', payload: '/path' });
|
|
306
|
+
expect(themeListener).not.toHaveBeenCalled();
|
|
307
|
+
expect(navListener).not.toHaveBeenCalled();
|
|
308
|
+
});
|
|
309
|
+
it('is safe to call multiple times', () => {
|
|
310
|
+
const bridge = new bridge_1.FiasBridge();
|
|
311
|
+
bridge.destroy();
|
|
312
|
+
expect(() => bridge.destroy()).not.toThrow();
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
describe('handleMessage edge cases', () => {
|
|
316
|
+
it('ignores null messages', () => {
|
|
317
|
+
new bridge_1.FiasBridge();
|
|
318
|
+
expect(() => dispatchMessage(null)).not.toThrow();
|
|
319
|
+
});
|
|
320
|
+
it('ignores non-object messages', () => {
|
|
321
|
+
new bridge_1.FiasBridge();
|
|
322
|
+
expect(() => dispatchMessage('hello')).not.toThrow();
|
|
323
|
+
});
|
|
324
|
+
it('ignores messages without a type field', () => {
|
|
325
|
+
new bridge_1.FiasBridge();
|
|
326
|
+
expect(() => dispatchMessage({ payload: 'test' })).not.toThrow();
|
|
327
|
+
});
|
|
328
|
+
it('ignores response messages with unknown messageId', () => {
|
|
329
|
+
new bridge_1.FiasBridge();
|
|
330
|
+
expect(() => dispatchMessage({
|
|
331
|
+
type: 'response',
|
|
332
|
+
messageId: 'unknown_123',
|
|
333
|
+
payload: {},
|
|
334
|
+
})).not.toThrow();
|
|
335
|
+
});
|
|
336
|
+
});
|
|
337
|
+
describe('send without window', () => {
|
|
338
|
+
it('does not throw when window is undefined', () => {
|
|
339
|
+
teardownWindowMock();
|
|
340
|
+
const bridge = new bridge_1.FiasBridge();
|
|
341
|
+
expect(() => bridge.ready()).not.toThrow();
|
|
342
|
+
setupWindowMock();
|
|
343
|
+
});
|
|
344
|
+
});
|
|
345
|
+
});
|
|
346
|
+
describe('getBridge / resetBridge', () => {
|
|
347
|
+
beforeEach(() => {
|
|
348
|
+
setupWindowMock();
|
|
349
|
+
(0, bridge_1.resetBridge)();
|
|
350
|
+
});
|
|
351
|
+
afterEach(() => {
|
|
352
|
+
(0, bridge_1.resetBridge)();
|
|
353
|
+
teardownWindowMock();
|
|
354
|
+
});
|
|
355
|
+
it('returns the same singleton instance', () => {
|
|
356
|
+
const a = (0, bridge_1.getBridge)();
|
|
357
|
+
const b = (0, bridge_1.getBridge)();
|
|
358
|
+
expect(a).toBe(b);
|
|
359
|
+
});
|
|
360
|
+
it('creates a new instance after resetBridge()', () => {
|
|
361
|
+
const a = (0, bridge_1.getBridge)();
|
|
362
|
+
(0, bridge_1.resetBridge)();
|
|
363
|
+
const b = (0, bridge_1.getBridge)();
|
|
364
|
+
expect(a).not.toBe(b);
|
|
365
|
+
});
|
|
366
|
+
it('resetBridge destroys the existing instance', () => {
|
|
367
|
+
const bridge = (0, bridge_1.getBridge)();
|
|
368
|
+
const destroySpy = jest.spyOn(bridge, 'destroy');
|
|
369
|
+
(0, bridge_1.resetBridge)();
|
|
370
|
+
expect(destroySpy).toHaveBeenCalled();
|
|
371
|
+
});
|
|
372
|
+
it('resetBridge is safe to call when no instance exists', () => {
|
|
373
|
+
(0, bridge_1.resetBridge)();
|
|
374
|
+
expect(() => (0, bridge_1.resetBridge)()).not.toThrow();
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
describe('StrictMode resilience', () => {
|
|
378
|
+
beforeEach(() => {
|
|
379
|
+
setupWindowMock();
|
|
380
|
+
(0, bridge_1.resetBridge)();
|
|
381
|
+
});
|
|
382
|
+
afterEach(() => {
|
|
383
|
+
(0, bridge_1.resetBridge)();
|
|
384
|
+
teardownWindowMock();
|
|
385
|
+
});
|
|
386
|
+
it('bridge survives destroy + re-attach cycle (simulates StrictMode)', async () => {
|
|
387
|
+
const bridge = (0, bridge_1.getBridge)();
|
|
388
|
+
const firstInit = bridge.waitForInit();
|
|
389
|
+
// StrictMode cleanup
|
|
390
|
+
bridge.destroy();
|
|
391
|
+
// StrictMode re-mount
|
|
392
|
+
bridge.attach();
|
|
393
|
+
const secondInit = bridge.waitForInit();
|
|
394
|
+
// Host sends init after re-mount
|
|
395
|
+
sendInit();
|
|
396
|
+
await expect(secondInit).resolves.toBeUndefined();
|
|
397
|
+
expect(bridge.getArchId()).toBe('arche_test');
|
|
398
|
+
await expect(firstInit).resolves.toBeUndefined();
|
|
399
|
+
});
|
|
400
|
+
it('singleton pattern means FiasProvider reuses the same bridge', () => {
|
|
401
|
+
const bridge1 = (0, bridge_1.getBridge)();
|
|
402
|
+
const bridge2 = (0, bridge_1.getBridge)();
|
|
403
|
+
expect(bridge1).toBe(bridge2);
|
|
404
|
+
expect(window.addEventListener).toHaveBeenCalledTimes(1);
|
|
405
|
+
});
|
|
406
|
+
});
|
|
407
|
+
//# sourceMappingURL=bridge.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.test.js","sourceRoot":"","sources":["../src/bridge.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=create-plugin.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-plugin.test.d.ts","sourceRoot":"","sources":["../../src/cli/create-plugin.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
describe('create-plugin CLI', () => {
|
|
3
|
+
let mockExit;
|
|
4
|
+
let consoleSpy;
|
|
5
|
+
let consoleErrorSpy;
|
|
6
|
+
const originalArgv = process.argv;
|
|
7
|
+
// Shared mock functions — configured per-test
|
|
8
|
+
const mockExistsSync = jest.fn();
|
|
9
|
+
const mockMkdirSync = jest.fn();
|
|
10
|
+
const mockReaddirSync = jest.fn();
|
|
11
|
+
const mockReadFileSync = jest.fn();
|
|
12
|
+
const mockWriteFileSync = jest.fn();
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
jest.resetModules();
|
|
15
|
+
mockExit = jest.spyOn(process, 'exit').mockImplementation(((code) => {
|
|
16
|
+
throw new Error(`process.exit(${code})`);
|
|
17
|
+
}));
|
|
18
|
+
consoleSpy = jest.spyOn(console, 'log').mockImplementation(() => { });
|
|
19
|
+
consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => { });
|
|
20
|
+
mockExistsSync.mockReset();
|
|
21
|
+
mockMkdirSync.mockReset();
|
|
22
|
+
mockReaddirSync.mockReset();
|
|
23
|
+
mockReadFileSync.mockReset();
|
|
24
|
+
mockWriteFileSync.mockReset();
|
|
25
|
+
});
|
|
26
|
+
afterEach(() => {
|
|
27
|
+
process.argv = originalArgv;
|
|
28
|
+
mockExit.mockRestore();
|
|
29
|
+
consoleSpy.mockRestore();
|
|
30
|
+
consoleErrorSpy.mockRestore();
|
|
31
|
+
});
|
|
32
|
+
function runCLI() {
|
|
33
|
+
jest.isolateModules(() => {
|
|
34
|
+
jest.doMock('fs', () => ({
|
|
35
|
+
existsSync: mockExistsSync,
|
|
36
|
+
mkdirSync: mockMkdirSync,
|
|
37
|
+
readdirSync: mockReaddirSync,
|
|
38
|
+
readFileSync: mockReadFileSync,
|
|
39
|
+
writeFileSync: mockWriteFileSync,
|
|
40
|
+
}));
|
|
41
|
+
require('./create-plugin');
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
it('exits with error when no project name provided', () => {
|
|
45
|
+
process.argv = ['node', 'create-plugin'];
|
|
46
|
+
expect(() => runCLI()).toThrow('process.exit(1)');
|
|
47
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith('Usage: create-fias-plugin <project-name>');
|
|
48
|
+
});
|
|
49
|
+
it('exits with error when target directory already exists', () => {
|
|
50
|
+
process.argv = ['node', 'create-plugin', 'my-plugin'];
|
|
51
|
+
mockExistsSync.mockReturnValue(true);
|
|
52
|
+
expect(() => runCLI()).toThrow('process.exit(1)');
|
|
53
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith('Error: Directory "my-plugin" already exists.');
|
|
54
|
+
});
|
|
55
|
+
it('creates plugin from template when directory does not exist', () => {
|
|
56
|
+
process.argv = ['node', 'create-plugin', 'test-plugin'];
|
|
57
|
+
mockExistsSync.mockReturnValue(false);
|
|
58
|
+
mockReaddirSync.mockReturnValue([{ name: 'package.json', isDirectory: () => false }]);
|
|
59
|
+
mockReadFileSync.mockReturnValue('{ "name": "{{name}}" }');
|
|
60
|
+
runCLI();
|
|
61
|
+
expect(mockMkdirSync).toHaveBeenCalled();
|
|
62
|
+
expect(mockWriteFileSync).toHaveBeenCalledWith(expect.stringContaining('package.json'), '{ "name": "test-plugin" }');
|
|
63
|
+
expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('test-plugin'));
|
|
64
|
+
});
|
|
65
|
+
it('recursively copies subdirectories', () => {
|
|
66
|
+
process.argv = ['node', 'create-plugin', 'nested-plugin'];
|
|
67
|
+
mockExistsSync.mockReturnValue(false);
|
|
68
|
+
let callCount = 0;
|
|
69
|
+
mockReaddirSync.mockImplementation(() => {
|
|
70
|
+
callCount++;
|
|
71
|
+
if (callCount === 1) {
|
|
72
|
+
return [{ name: 'src', isDirectory: () => true }];
|
|
73
|
+
}
|
|
74
|
+
return [{ name: 'index.ts', isDirectory: () => false }];
|
|
75
|
+
});
|
|
76
|
+
mockReadFileSync.mockReturnValue('console.log("{{name}}")');
|
|
77
|
+
runCLI();
|
|
78
|
+
expect(mockMkdirSync).toHaveBeenCalledTimes(2);
|
|
79
|
+
expect(mockWriteFileSync).toHaveBeenCalledWith(expect.stringContaining('index.ts'), 'console.log("nested-plugin")');
|
|
80
|
+
});
|
|
81
|
+
it('replaces multiple template variables', () => {
|
|
82
|
+
process.argv = ['node', 'create-plugin', 'multi-replace'];
|
|
83
|
+
mockExistsSync.mockReturnValue(false);
|
|
84
|
+
mockReaddirSync.mockReturnValue([{ name: 'readme.md', isDirectory: () => false }]);
|
|
85
|
+
mockReadFileSync.mockReturnValue('# {{name}}\nWelcome to {{name}}');
|
|
86
|
+
runCLI();
|
|
87
|
+
expect(mockWriteFileSync).toHaveBeenCalledWith(expect.stringContaining('readme.md'), '# multi-replace\nWelcome to multi-replace');
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=create-plugin.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-plugin.test.js","sourceRoot":"","sources":["../../src/cli/create-plugin.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fias.test.d.ts","sourceRoot":"","sources":["../src/fias.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const fias_1 = require("./fias");
|
|
4
|
+
const bridge_1 = require("./bridge");
|
|
5
|
+
const postMessageSpy = jest.fn();
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
global.window = {
|
|
8
|
+
addEventListener: jest.fn(),
|
|
9
|
+
removeEventListener: jest.fn(),
|
|
10
|
+
parent: { postMessage: postMessageSpy },
|
|
11
|
+
};
|
|
12
|
+
(0, bridge_1.resetBridge)();
|
|
13
|
+
});
|
|
14
|
+
afterEach(() => {
|
|
15
|
+
(0, bridge_1.resetBridge)();
|
|
16
|
+
delete global.window;
|
|
17
|
+
postMessageSpy.mockReset();
|
|
18
|
+
});
|
|
19
|
+
describe('fias utility namespace', () => {
|
|
20
|
+
it('fias.ready() sends a ready message', () => {
|
|
21
|
+
fias_1.fias.ready();
|
|
22
|
+
expect(postMessageSpy).toHaveBeenCalledWith(expect.objectContaining({ type: 'ready', payload: {} }), '*');
|
|
23
|
+
});
|
|
24
|
+
it('fias.resize() sends a resize message', () => {
|
|
25
|
+
fias_1.fias.resize(400);
|
|
26
|
+
expect(postMessageSpy).toHaveBeenCalledWith(expect.objectContaining({ type: 'resize', payload: { height: 400 } }), '*');
|
|
27
|
+
});
|
|
28
|
+
it('fias.showToast() sends a toast with default variant', () => {
|
|
29
|
+
fias_1.fias.showToast('Done');
|
|
30
|
+
expect(postMessageSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
31
|
+
type: 'toast',
|
|
32
|
+
payload: { message: 'Done', variant: 'info' },
|
|
33
|
+
}), '*');
|
|
34
|
+
});
|
|
35
|
+
it('fias.showToast() sends a toast with custom variant', () => {
|
|
36
|
+
fias_1.fias.showToast('Oops', 'warning');
|
|
37
|
+
expect(postMessageSpy).toHaveBeenCalledWith(expect.objectContaining({
|
|
38
|
+
type: 'toast',
|
|
39
|
+
payload: { message: 'Oops', variant: 'warning' },
|
|
40
|
+
}), '*');
|
|
41
|
+
});
|
|
42
|
+
it('uses the getBridge singleton', () => {
|
|
43
|
+
const bridge = (0, bridge_1.getBridge)();
|
|
44
|
+
const readySpy = jest.spyOn(bridge, 'ready');
|
|
45
|
+
fias_1.fias.ready();
|
|
46
|
+
expect(readySpy).toHaveBeenCalled();
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=fias.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fias.test.js","sourceRoot":"","sources":["../src/fias.test.ts"],"names":[],"mappings":";;AAAA,iCAA8B;AAC9B,qCAAkD;AAElD,MAAM,cAAc,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AAEjC,UAAU,CAAC,GAAG,EAAE;IACb,MAAc,CAAC,MAAM,GAAG;QACvB,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE;QAC3B,mBAAmB,EAAE,IAAI,CAAC,EAAE,EAAE;QAC9B,MAAM,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE;KACxC,CAAC;IACF,IAAA,oBAAW,GAAE,CAAC;AAChB,CAAC,CAAC,CAAC;AAEH,SAAS,CAAC,GAAG,EAAE;IACb,IAAA,oBAAW,GAAE,CAAC;IACd,OAAQ,MAAc,CAAC,MAAM,CAAC;IAC9B,cAAc,CAAC,SAAS,EAAE,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,WAAI,CAAC,KAAK,EAAE,CAAC;QACb,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CACzC,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EACvD,GAAG,CACJ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,WAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjB,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CACzC,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,EACrE,GAAG,CACJ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,WAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACvB,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CACzC,MAAM,CAAC,gBAAgB,CAAC;YACtB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;SAC9C,CAAC,EACF,GAAG,CACJ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,WAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAClC,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CACzC,MAAM,CAAC,gBAAgB,CAAC;YACtB,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE;SACjD,CAAC,EACF,GAAG,CACJ,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,IAAA,kBAAS,GAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7C,WAAI,CAAC,KAAK,EAAE,CAAC;QACb,MAAM,CAAC,QAAQ,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for SDK hooks.
|
|
3
|
+
*
|
|
4
|
+
* These test the hook logic by mocking React primitives and the bridge context.
|
|
5
|
+
* We mock `react` to control useState/useEffect/useCallback/useContext behavior,
|
|
6
|
+
* and verify hooks call the correct bridge methods.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=hooks.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.test.d.ts","sourceRoot":"","sources":["../src/hooks.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tests for SDK hooks.
|
|
4
|
+
*
|
|
5
|
+
* These test the hook logic by mocking React primitives and the bridge context.
|
|
6
|
+
* We mock `react` to control useState/useEffect/useCallback/useContext behavior,
|
|
7
|
+
* and verify hooks call the correct bridge methods.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
// Build a mock bridge that tracks calls
|
|
11
|
+
function createMockBridge() {
|
|
12
|
+
return {
|
|
13
|
+
waitForInit: jest.fn().mockResolvedValue(undefined),
|
|
14
|
+
ready: jest.fn(),
|
|
15
|
+
resize: jest.fn(),
|
|
16
|
+
showToast: jest.fn(),
|
|
17
|
+
request: jest.fn().mockResolvedValue({}),
|
|
18
|
+
getArchId: jest.fn().mockReturnValue('arche_test'),
|
|
19
|
+
getPermissions: jest.fn().mockReturnValue(['theme:read']),
|
|
20
|
+
getTheme: jest.fn().mockReturnValue(null),
|
|
21
|
+
getCurrentPath: jest.fn().mockReturnValue('/'),
|
|
22
|
+
onThemeUpdate: jest.fn().mockReturnValue(() => { }),
|
|
23
|
+
onNavigationUpdate: jest.fn().mockReturnValue(() => { }),
|
|
24
|
+
attach: jest.fn(),
|
|
25
|
+
destroy: jest.fn(),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
// Mock React hooks
|
|
29
|
+
let mockContextValue = null;
|
|
30
|
+
const mockSetState = jest.fn();
|
|
31
|
+
let capturedEffectCleanup = null;
|
|
32
|
+
jest.mock('react', () => ({
|
|
33
|
+
createContext: jest.fn(() => ({})),
|
|
34
|
+
useContext: jest.fn(() => mockContextValue),
|
|
35
|
+
useState: jest.fn((initial) => [initial, mockSetState]),
|
|
36
|
+
useEffect: jest.fn((cb) => {
|
|
37
|
+
const cleanup = cb();
|
|
38
|
+
if (typeof cleanup === 'function') {
|
|
39
|
+
capturedEffectCleanup = cleanup;
|
|
40
|
+
}
|
|
41
|
+
}),
|
|
42
|
+
useCallback: jest.fn((fn) => fn),
|
|
43
|
+
}));
|
|
44
|
+
describe('SDK hooks', () => {
|
|
45
|
+
let mockBridge;
|
|
46
|
+
beforeEach(() => {
|
|
47
|
+
jest.clearAllMocks();
|
|
48
|
+
mockBridge = createMockBridge();
|
|
49
|
+
mockContextValue = mockBridge;
|
|
50
|
+
capturedEffectCleanup = null;
|
|
51
|
+
});
|
|
52
|
+
describe('useFiasUser', () => {
|
|
53
|
+
it('requests user profile from bridge', () => {
|
|
54
|
+
const { useFiasUser } = require('./hooks');
|
|
55
|
+
mockBridge.request.mockResolvedValue({
|
|
56
|
+
userId: 'user_1',
|
|
57
|
+
displayName: 'Test',
|
|
58
|
+
avatar: null,
|
|
59
|
+
});
|
|
60
|
+
const result = useFiasUser();
|
|
61
|
+
// Initial state is null
|
|
62
|
+
expect(result).toBeNull();
|
|
63
|
+
// Effect should have called bridge.request
|
|
64
|
+
expect(mockBridge.request).toHaveBeenCalledWith('get_user', {});
|
|
65
|
+
});
|
|
66
|
+
it('throws when used outside FiasProvider', () => {
|
|
67
|
+
mockContextValue = null;
|
|
68
|
+
const { useFiasUser } = require('./hooks');
|
|
69
|
+
expect(() => useFiasUser()).toThrow('useBridge must be used within a <FiasProvider>');
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe('useFiasTheme', () => {
|
|
73
|
+
it('returns initial theme from bridge and subscribes to updates', () => {
|
|
74
|
+
const { useFiasTheme } = require('./hooks');
|
|
75
|
+
const theme = { mode: 'dark', colors: {} };
|
|
76
|
+
mockBridge.getTheme.mockReturnValue(theme);
|
|
77
|
+
const result = useFiasTheme();
|
|
78
|
+
expect(result).toEqual(theme);
|
|
79
|
+
expect(mockBridge.onThemeUpdate).toHaveBeenCalled();
|
|
80
|
+
});
|
|
81
|
+
it('returns cleanup function from onThemeUpdate', () => {
|
|
82
|
+
const unsubscribe = jest.fn();
|
|
83
|
+
mockBridge.onThemeUpdate.mockReturnValue(unsubscribe);
|
|
84
|
+
const { useFiasTheme } = require('./hooks');
|
|
85
|
+
useFiasTheme();
|
|
86
|
+
// The effect cleanup should be the unsubscribe
|
|
87
|
+
expect(capturedEffectCleanup).toBe(unsubscribe);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
describe('useFiasStorage', () => {
|
|
91
|
+
it('returns storage API methods that call bridge.request', async () => {
|
|
92
|
+
const { useFiasStorage } = require('./hooks');
|
|
93
|
+
const storage = useFiasStorage();
|
|
94
|
+
mockBridge.request.mockResolvedValue('file content');
|
|
95
|
+
await storage.readFile('/test.txt');
|
|
96
|
+
expect(mockBridge.request).toHaveBeenCalledWith('storage_read', { path: '/test.txt' });
|
|
97
|
+
mockBridge.request.mockResolvedValue(undefined);
|
|
98
|
+
await storage.writeFile('/test.txt', 'data');
|
|
99
|
+
expect(mockBridge.request).toHaveBeenCalledWith('storage_write', {
|
|
100
|
+
path: '/test.txt',
|
|
101
|
+
content: 'data',
|
|
102
|
+
});
|
|
103
|
+
mockBridge.request.mockResolvedValue(['a.txt', 'b.txt']);
|
|
104
|
+
await storage.listFiles('/prefix');
|
|
105
|
+
expect(mockBridge.request).toHaveBeenCalledWith('storage_list', { prefix: '/prefix' });
|
|
106
|
+
mockBridge.request.mockResolvedValue(undefined);
|
|
107
|
+
await storage.deleteFile('/test.txt');
|
|
108
|
+
expect(mockBridge.request).toHaveBeenCalledWith('storage_delete', { path: '/test.txt' });
|
|
109
|
+
});
|
|
110
|
+
it('calls listFiles without prefix', async () => {
|
|
111
|
+
const { useFiasStorage } = require('./hooks');
|
|
112
|
+
const storage = useFiasStorage();
|
|
113
|
+
mockBridge.request.mockResolvedValue([]);
|
|
114
|
+
await storage.listFiles();
|
|
115
|
+
expect(mockBridge.request).toHaveBeenCalledWith('storage_list', { prefix: undefined });
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe('useEntityInvocation', () => {
|
|
119
|
+
it('returns invoke function and initial state', () => {
|
|
120
|
+
const { useEntityInvocation } = require('./hooks');
|
|
121
|
+
const api = useEntityInvocation();
|
|
122
|
+
expect(api.invoke).toBeInstanceOf(Function);
|
|
123
|
+
expect(api.isLoading).toBe(false);
|
|
124
|
+
expect(api.result).toBeNull();
|
|
125
|
+
expect(api.error).toBeNull();
|
|
126
|
+
});
|
|
127
|
+
it('invoke calls bridge.request with entity params', async () => {
|
|
128
|
+
const { useEntityInvocation } = require('./hooks');
|
|
129
|
+
const mockResult = { output: 'response', metadata: {} };
|
|
130
|
+
mockBridge.request.mockResolvedValue(mockResult);
|
|
131
|
+
const api = useEntityInvocation();
|
|
132
|
+
const result = await api.invoke({
|
|
133
|
+
entityId: 'ent_test',
|
|
134
|
+
input: 'hello',
|
|
135
|
+
parameters: { temp: 0.7 },
|
|
136
|
+
});
|
|
137
|
+
expect(mockBridge.request).toHaveBeenCalledWith('entity_invoke', {
|
|
138
|
+
entityId: 'ent_test',
|
|
139
|
+
input: 'hello',
|
|
140
|
+
parameters: { temp: 0.7 },
|
|
141
|
+
});
|
|
142
|
+
expect(result).toEqual(mockResult);
|
|
143
|
+
});
|
|
144
|
+
it('invoke throws and sets error on failure', async () => {
|
|
145
|
+
const { useEntityInvocation } = require('./hooks');
|
|
146
|
+
mockBridge.request.mockRejectedValue(new Error('Credit limit'));
|
|
147
|
+
const api = useEntityInvocation();
|
|
148
|
+
await expect(api.invoke({ entityId: 'ent_test', input: 'hello' })).rejects.toThrow('Credit limit');
|
|
149
|
+
});
|
|
150
|
+
it('invoke wraps non-Error rejections', async () => {
|
|
151
|
+
const { useEntityInvocation } = require('./hooks');
|
|
152
|
+
mockBridge.request.mockRejectedValue('string error');
|
|
153
|
+
const api = useEntityInvocation();
|
|
154
|
+
await expect(api.invoke({ entityId: 'ent_test', input: 'hello' })).rejects.toThrow('string error');
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
describe('useFiasNavigation', () => {
|
|
158
|
+
it('returns current path and subscribes to updates', () => {
|
|
159
|
+
mockBridge.getCurrentPath.mockReturnValue('/current');
|
|
160
|
+
const { useFiasNavigation } = require('./hooks');
|
|
161
|
+
const nav = useFiasNavigation();
|
|
162
|
+
expect(nav.currentPath).toBe('/current');
|
|
163
|
+
expect(mockBridge.onNavigationUpdate).toHaveBeenCalled();
|
|
164
|
+
});
|
|
165
|
+
it('navigateTo calls bridge.request', () => {
|
|
166
|
+
const { useFiasNavigation } = require('./hooks');
|
|
167
|
+
const nav = useFiasNavigation();
|
|
168
|
+
nav.navigateTo('/new-path');
|
|
169
|
+
expect(mockBridge.request).toHaveBeenCalledWith('navigate', { path: '/new-path' });
|
|
170
|
+
});
|
|
171
|
+
it('returns cleanup function from onNavigationUpdate', () => {
|
|
172
|
+
const unsubscribe = jest.fn();
|
|
173
|
+
mockBridge.onNavigationUpdate.mockReturnValue(unsubscribe);
|
|
174
|
+
const { useFiasNavigation } = require('./hooks');
|
|
175
|
+
useFiasNavigation();
|
|
176
|
+
expect(capturedEffectCleanup).toBe(unsubscribe);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
//# sourceMappingURL=hooks.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.test.js","sourceRoot":"","sources":["../src/hooks.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -23,6 +23,7 @@ var FiasBridge = class {
|
|
|
23
23
|
this.currentPath = "";
|
|
24
24
|
this.themeListeners = /* @__PURE__ */ new Set();
|
|
25
25
|
this.navigationListeners = /* @__PURE__ */ new Set();
|
|
26
|
+
this.listening = false;
|
|
26
27
|
this.handleMessage = (event) => {
|
|
27
28
|
const data = event.data;
|
|
28
29
|
if (!data || typeof data !== "object" || !data.type) return;
|
|
@@ -66,8 +67,16 @@ var FiasBridge = class {
|
|
|
66
67
|
this.initPromise = new Promise((resolve) => {
|
|
67
68
|
this.initResolve = resolve;
|
|
68
69
|
});
|
|
69
|
-
|
|
70
|
+
this.attach();
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Register the message listener. Safe to call multiple times —
|
|
74
|
+
* will not add duplicate listeners.
|
|
75
|
+
*/
|
|
76
|
+
attach() {
|
|
77
|
+
if (typeof window !== "undefined" && !this.listening) {
|
|
70
78
|
window.addEventListener("message", this.handleMessage);
|
|
79
|
+
this.listening = true;
|
|
71
80
|
}
|
|
72
81
|
}
|
|
73
82
|
/**
|
|
@@ -135,11 +144,13 @@ var FiasBridge = class {
|
|
|
135
144
|
return () => this.navigationListeners.delete(listener);
|
|
136
145
|
}
|
|
137
146
|
/**
|
|
138
|
-
* Clean up event listeners
|
|
147
|
+
* Clean up event listeners and pending requests.
|
|
148
|
+
* After destroy(), the bridge can be re-activated by calling attach().
|
|
139
149
|
*/
|
|
140
150
|
destroy() {
|
|
141
|
-
if (typeof window !== "undefined") {
|
|
151
|
+
if (typeof window !== "undefined" && this.listening) {
|
|
142
152
|
window.removeEventListener("message", this.handleMessage);
|
|
153
|
+
this.listening = false;
|
|
143
154
|
}
|
|
144
155
|
for (const pending of this.pendingRequests.values()) {
|
|
145
156
|
clearTimeout(pending.timer);
|
|
@@ -159,7 +170,7 @@ var FiasBridge = class {
|
|
|
159
170
|
window.parent.postMessage(message, "*");
|
|
160
171
|
}
|
|
161
172
|
};
|
|
162
|
-
var bridgeInstance = null;
|
|
173
|
+
var bridgeInstance = typeof window !== "undefined" ? new FiasBridge() : null;
|
|
163
174
|
function getBridge() {
|
|
164
175
|
if (!bridgeInstance) {
|
|
165
176
|
bridgeInstance = new FiasBridge();
|
|
@@ -175,7 +186,7 @@ function resetBridge() {
|
|
|
175
186
|
import { jsx } from "react/jsx-runtime";
|
|
176
187
|
function FiasProvider({ children }) {
|
|
177
188
|
const [ready, setReady] = useState(false);
|
|
178
|
-
const bridge = useMemo(() =>
|
|
189
|
+
const bridge = useMemo(() => getBridge(), []);
|
|
179
190
|
useEffect(() => {
|
|
180
191
|
let mounted = true;
|
|
181
192
|
bridge.waitForInit().then(() => {
|
|
@@ -186,7 +197,6 @@ function FiasProvider({ children }) {
|
|
|
186
197
|
});
|
|
187
198
|
return () => {
|
|
188
199
|
mounted = false;
|
|
189
|
-
bridge.destroy();
|
|
190
200
|
};
|
|
191
201
|
}, [bridge]);
|
|
192
202
|
if (!ready) {
|
package/dist/provider.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAI5D,UAAU,iBAAiB;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAI5D,UAAU,iBAAiB;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE,iBAAiB,kDA8B3D"}
|
package/dist/provider.js
CHANGED
|
@@ -25,7 +25,7 @@ const bridge_1 = require("./bridge");
|
|
|
25
25
|
*/
|
|
26
26
|
function FiasProvider({ children }) {
|
|
27
27
|
const [ready, setReady] = (0, react_1.useState)(false);
|
|
28
|
-
const bridge = (0, react_1.useMemo)(() =>
|
|
28
|
+
const bridge = (0, react_1.useMemo)(() => (0, bridge_1.getBridge)(), []);
|
|
29
29
|
(0, react_1.useEffect)(() => {
|
|
30
30
|
let mounted = true;
|
|
31
31
|
bridge.waitForInit().then(() => {
|
|
@@ -36,7 +36,11 @@ function FiasProvider({ children }) {
|
|
|
36
36
|
});
|
|
37
37
|
return () => {
|
|
38
38
|
mounted = false;
|
|
39
|
-
bridge.destroy()
|
|
39
|
+
// Do NOT call bridge.destroy() here. The bridge singleton must persist
|
|
40
|
+
// for the lifetime of the page. React StrictMode runs effects twice
|
|
41
|
+
// (mount → cleanup → mount), and destroying the bridge on the first
|
|
42
|
+
// cleanup permanently removes the message listener, causing the second
|
|
43
|
+
// mount's waitForInit() to hang forever.
|
|
40
44
|
};
|
|
41
45
|
}, [bridge]);
|
|
42
46
|
if (!ready) {
|
package/dist/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":";;AA0BA,
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":";;AA0BA,oCA8BC;;AAxDD,iCAA4D;AAC5D,uCAA8C;AAC9C,qCAAqC;AAMrC;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,YAAY,CAAC,EAAE,QAAQ,EAAqB;IAC1D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAC;IAE1C,MAAM,MAAM,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,IAAA,kBAAS,GAAE,EAAE,EAAE,CAAC,CAAC;IAE9C,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YAC7B,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,QAAQ,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,OAAO,GAAG,KAAK,CAAC;YAChB,uEAAuE;YACvE,oEAAoE;YACpE,oEAAoE;YACpE,uEAAuE;YACvE,yCAAyC;QAC3C,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,uBAAC,2BAAiB,CAAC,QAAQ,IAAC,KAAK,EAAE,MAAM,YAAG,QAAQ,GAA8B,CAAC;AAC5F,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for FiasProvider.
|
|
3
|
+
*
|
|
4
|
+
* Verifies that FiasProvider:
|
|
5
|
+
* 1. Uses the getBridge() singleton (not new FiasBridge())
|
|
6
|
+
* 2. Does NOT call bridge.destroy() on cleanup (StrictMode safety)
|
|
7
|
+
* 3. Waits for init before rendering children
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=provider.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.test.d.ts","sourceRoot":"","sources":["../src/provider.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tests for FiasProvider.
|
|
4
|
+
*
|
|
5
|
+
* Verifies that FiasProvider:
|
|
6
|
+
* 1. Uses the getBridge() singleton (not new FiasBridge())
|
|
7
|
+
* 2. Does NOT call bridge.destroy() on cleanup (StrictMode safety)
|
|
8
|
+
* 3. Waits for init before rendering children
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
// Mock bridge returned by getBridge
|
|
12
|
+
const mockBridge = {
|
|
13
|
+
waitForInit: jest.fn().mockResolvedValue(undefined),
|
|
14
|
+
ready: jest.fn(),
|
|
15
|
+
getTheme: jest.fn().mockReturnValue(null),
|
|
16
|
+
getCurrentPath: jest.fn().mockReturnValue('/'),
|
|
17
|
+
destroy: jest.fn(),
|
|
18
|
+
};
|
|
19
|
+
jest.mock('./bridge', () => ({
|
|
20
|
+
getBridge: jest.fn(() => mockBridge),
|
|
21
|
+
}));
|
|
22
|
+
// Mock context module so provider.tsx doesn't hit real createContext
|
|
23
|
+
const MockProvider = jest.fn(({ children }) => children);
|
|
24
|
+
jest.mock('./context', () => ({
|
|
25
|
+
FiasBridgeContext: { Provider: MockProvider },
|
|
26
|
+
}));
|
|
27
|
+
// Capture React hook calls
|
|
28
|
+
let capturedEffectCleanup = null;
|
|
29
|
+
const mockSetReady = jest.fn();
|
|
30
|
+
jest.mock('react', () => {
|
|
31
|
+
const actual = jest.requireActual('react');
|
|
32
|
+
return {
|
|
33
|
+
...actual,
|
|
34
|
+
useState: jest.fn((initial) => [initial, mockSetReady]),
|
|
35
|
+
useMemo: jest.fn((factory) => factory()),
|
|
36
|
+
useEffect: jest.fn((cb) => {
|
|
37
|
+
const cleanup = cb();
|
|
38
|
+
if (typeof cleanup === 'function') {
|
|
39
|
+
capturedEffectCleanup = cleanup;
|
|
40
|
+
}
|
|
41
|
+
}),
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
describe('FiasProvider', () => {
|
|
45
|
+
beforeEach(() => {
|
|
46
|
+
jest.clearAllMocks();
|
|
47
|
+
capturedEffectCleanup = null;
|
|
48
|
+
mockBridge.waitForInit.mockResolvedValue(undefined);
|
|
49
|
+
});
|
|
50
|
+
it('uses getBridge() singleton via useMemo', () => {
|
|
51
|
+
const { FiasProvider } = require('./provider');
|
|
52
|
+
const { getBridge } = require('./bridge');
|
|
53
|
+
FiasProvider({ children: null });
|
|
54
|
+
expect(getBridge).toHaveBeenCalled();
|
|
55
|
+
});
|
|
56
|
+
it('calls bridge.waitForInit and then bridge.ready', async () => {
|
|
57
|
+
const { FiasProvider } = require('./provider');
|
|
58
|
+
FiasProvider({ children: null });
|
|
59
|
+
expect(mockBridge.waitForInit).toHaveBeenCalled();
|
|
60
|
+
// Let the waitForInit promise resolve
|
|
61
|
+
await Promise.resolve();
|
|
62
|
+
await Promise.resolve();
|
|
63
|
+
expect(mockBridge.ready).toHaveBeenCalled();
|
|
64
|
+
expect(mockSetReady).toHaveBeenCalledWith(true);
|
|
65
|
+
});
|
|
66
|
+
it('does NOT call bridge.destroy() on cleanup (StrictMode safety)', () => {
|
|
67
|
+
const { FiasProvider } = require('./provider');
|
|
68
|
+
FiasProvider({ children: null });
|
|
69
|
+
expect(capturedEffectCleanup).toBeDefined();
|
|
70
|
+
capturedEffectCleanup();
|
|
71
|
+
expect(mockBridge.destroy).not.toHaveBeenCalled();
|
|
72
|
+
});
|
|
73
|
+
it('does not call ready if unmounted before init resolves', async () => {
|
|
74
|
+
let resolveInit = () => { };
|
|
75
|
+
mockBridge.waitForInit.mockReturnValue(new Promise((r) => {
|
|
76
|
+
resolveInit = r;
|
|
77
|
+
}));
|
|
78
|
+
const { FiasProvider } = require('./provider');
|
|
79
|
+
FiasProvider({ children: null });
|
|
80
|
+
// Run cleanup before init resolves (simulates unmount)
|
|
81
|
+
capturedEffectCleanup();
|
|
82
|
+
resolveInit();
|
|
83
|
+
await Promise.resolve();
|
|
84
|
+
await Promise.resolve();
|
|
85
|
+
expect(mockBridge.ready).not.toHaveBeenCalled();
|
|
86
|
+
expect(mockSetReady).not.toHaveBeenCalledWith(true);
|
|
87
|
+
});
|
|
88
|
+
it('returns null when not ready (initial state)', () => {
|
|
89
|
+
const react = require('react');
|
|
90
|
+
react.useState.mockReturnValue([false, mockSetReady]);
|
|
91
|
+
const { FiasProvider } = require('./provider');
|
|
92
|
+
const result = FiasProvider({ children: 'child' });
|
|
93
|
+
expect(result).toBeNull();
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
//# sourceMappingURL=provider.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.test.js","sourceRoot":"","sources":["../src/provider.test.ts"],"names":[],"mappings":"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"}
|