@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 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. Called when FiasProvider unmounts.
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;
@@ -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;;IAYhE;;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;;OAEG;IACH,OAAO,IAAI,IAAI;IAaf,OAAO,CAAC,aAAa,CAiDnB;IAEF,OAAO,CAAC,IAAI;CAWb;AAOD,wBAAgB,SAAS,IAAI,UAAU,CAKtC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAGlC"}
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
- if (typeof window !== 'undefined') {
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. Called when FiasProvider unmounts.
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. Created lazily on first access.
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();
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":";;;AAoNA,8BAKC;AAKD,kCAGC;AAxND,IAAI,cAAc,GAAG,CAAC,CAAC;AAEvB,SAAS,iBAAiB;IACxB,OAAO,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;AACjD,CAAC;AAQD,MAAM,kBAAkB,GAAG,KAAM,CAAC;AAElC;;;GAGG;AACH,MAAa,UAAU;IAYrB;QAXQ,oBAAe,GAAG,IAAI,GAAG,EAA0B,CAAC;QACpD,gBAAW,GAAG,KAAK,CAAC;QACpB,gBAAW,GAAyB,IAAI,CAAC;QACzC,gBAAW,GAAwB,IAAI,CAAC;QACxC,WAAM,GAAW,EAAE,CAAC;QACpB,gBAAW,GAAuB,EAAE,CAAC;QACrC,UAAK,GAAqB,IAAI,CAAC;QAC/B,gBAAW,GAAW,EAAE,CAAC;QACzB,mBAAc,GAAG,IAAI,GAAG,EAA8B,CAAC;QACvD,wBAAmB,GAAG,IAAI,GAAG,EAA0B,CAAC;QA0GxD,kBAAa,GAAG,CAAC,KAAmB,EAAQ,EAAE;YACpD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YACxB,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,OAAO;YAE5D,gCAAgC;YAChC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,IAAyB,CAAC;gBAC1C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;gBACrC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;gBAC/C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;gBACnC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;gBAC/C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;gBACxB,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,uBAAuB;YACvB,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBACjC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAoB,CAAC;gBACvC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBAC3C,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACvB,CAAC;gBACD,OAAO;YACT,CAAC;YAED,4BAA4B;YAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBACpC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAiB,CAAC;gBAC1C,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBAChD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC7B,CAAC;gBACD,OAAO;YACT,CAAC;YAED,2BAA2B;YAC3B,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,IAAsB,CAAC;gBACxC,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAC7D,IAAI,CAAC,OAAO;oBAAE,OAAO;gBAErB,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC5B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAEhD,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;oBACnB,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC5C,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAxJA,IAAI,CAAC,WAAW,GAAG,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACzC,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAC7B,OAAO,IAAI,CAAC,WAAY,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,MAAc;QACnB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,OAAe,EAAE,UAAoD,MAAM;QACnF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAI,IAA6B,EAAE,OAAgB;QAC9D,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAEzB,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,MAAM,SAAS,GAAG,iBAAiB,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACvC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC,CAAC;YACzD,CAAC,EAAE,kBAAkB,CAAC,CAAC;YAEvB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE;gBAClC,OAAO,EAAE,OAAmC;gBAC5C,MAAM;gBACN,KAAK;aACN,CAAC,CAAC;YAEH,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,cAAc;QACZ,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,aAAa,CAAC,QAAoC;QAChD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,kBAAkB,CAAC,QAAgC;QACjD,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5D,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC;YACpD,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5B,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;IACnC,CAAC;IAqDO,IAAI,CAAC,IAA6B,EAAE,OAAgB,EAAE,SAAkB;QAC9E,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAE1C,MAAM,OAAO,GAAkB;YAC7B,IAAI;YACJ,SAAS,EAAE,SAAS,IAAI,iBAAiB,EAAE;YAC3C,OAAO;SACR,CAAC;QAEF,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC;CACF;AAlLD,gCAkLC;AAED;;GAEG;AACH,IAAI,cAAc,GAAsB,IAAI,CAAC;AAE7C,SAAgB,SAAS;IACvB,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,cAAc,GAAG,IAAI,UAAU,EAAE,CAAC;IACpC,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW;IACzB,cAAc,EAAE,OAAO,EAAE,CAAC;IAC1B,cAAc,GAAG,IAAI,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bridge.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fias.test.d.ts.map
@@ -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
- if (typeof window !== "undefined") {
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. Called when FiasProvider unmounts.
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(() => new FiasBridge(), []);
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) {
@@ -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,kDA0B3D"}
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)(() => new bridge_1.FiasBridge(), []);
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) {
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":";;AA0BA,oCA0BC;;AApDD,iCAA4D;AAC5D,uCAA8C;AAC9C,qCAAsC;AAMtC;;;;;;;;;;;;;;;;;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,IAAI,mBAAU,EAAE,EAAE,EAAE,CAAC,CAAC;IAEnD,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,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,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"}
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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fias/arche-sdk",
3
- "version": "1.1.1",
3
+ "version": "1.1.3",
4
4
  "description": "SDK for building FIAS platform plugin arches",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",