@weavix/sdk-core 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -35
- package/dist/bridge/bridge.d.ts +24 -0
- package/dist/bridge/bridge.d.ts.map +1 -0
- package/dist/bridge/types/BaseMessage.d.ts +4 -0
- package/dist/bridge/types/BaseMessage.d.ts.map +1 -0
- package/dist/bridge/types/ErrorCodes.d.ts +13 -0
- package/dist/bridge/types/ErrorCodes.d.ts.map +1 -0
- package/dist/bridge/types/PluginActionError.d.ts +6 -0
- package/dist/bridge/types/PluginActionError.d.ts.map +1 -0
- package/dist/bridge/types/UiContract.d.ts +35 -0
- package/dist/bridge/types/UiContract.d.ts.map +1 -0
- package/dist/common/types/Theme.d.ts +2 -0
- package/dist/common/types/Theme.d.ts.map +1 -0
- package/dist/events/eventBus.d.ts +38 -0
- package/dist/events/eventBus.d.ts.map +1 -0
- package/dist/events/types.d.ts +46 -0
- package/dist/events/types.d.ts.map +1 -0
- package/dist/handlers/handlers.d.ts +12 -0
- package/dist/handlers/handlers.d.ts.map +1 -0
- package/dist/host/hostApi.d.ts +50 -0
- package/dist/host/hostApi.d.ts.map +1 -0
- package/dist/host/types/ContentSizeUpdateRequest.d.ts +7 -0
- package/dist/host/types/ContentSizeUpdateRequest.d.ts.map +1 -0
- package/dist/host/types/NavigateRequest.d.ts +11 -0
- package/dist/host/types/NavigateRequest.d.ts.map +1 -0
- package/dist/host/utils/autoResize.d.ts +15 -0
- package/dist/host/utils/autoResize.d.ts.map +1 -0
- package/dist/index.d.ts +24 -518
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +101 -124
- package/dist/index.mjs.map +1 -1
- package/dist/ui/Confirm.d.ts +14 -0
- package/dist/ui/Confirm.d.ts.map +1 -0
- package/dist/ui/Toaster.d.ts +24 -0
- package/dist/ui/Toaster.d.ts.map +1 -0
- package/dist/ui/uiApi.d.ts +11 -0
- package/dist/ui/uiApi.d.ts.map +1 -0
- package/dist/utils/getField.d.ts +27 -0
- package/dist/utils/getField.d.ts.map +1 -0
- package/dist/utils/localization.d.ts +18 -0
- package/dist/utils/localization.d.ts.map +1 -0
- package/package.json +2 -11
package/dist/index.mjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
const g = /* @__PURE__ */ new Map(),
|
|
2
|
-
function
|
|
1
|
+
const g = /* @__PURE__ */ new Map(), m = /* @__PURE__ */ new Map();
|
|
2
|
+
function w(i, e) {
|
|
3
3
|
let t = g.get(i);
|
|
4
4
|
t || (t = /* @__PURE__ */ new Set(), g.set(i, t));
|
|
5
5
|
const s = e;
|
|
6
|
-
if (t.add(s),
|
|
6
|
+
if (t.add(s), m.has(i))
|
|
7
7
|
try {
|
|
8
|
-
s(
|
|
8
|
+
s(m.get(i));
|
|
9
9
|
} catch (n) {
|
|
10
10
|
console.error(`[EventBus] Error replaying cached value for "${i}":`, n);
|
|
11
11
|
}
|
|
@@ -13,9 +13,9 @@ function R(i, e) {
|
|
|
13
13
|
t.delete(s), t.size === 0 && g.delete(i);
|
|
14
14
|
};
|
|
15
15
|
}
|
|
16
|
-
function
|
|
16
|
+
function R(i) {
|
|
17
17
|
const e = i.method;
|
|
18
|
-
|
|
18
|
+
m.set(e, i.result);
|
|
19
19
|
const t = g.get(e);
|
|
20
20
|
if (t)
|
|
21
21
|
for (const s of t)
|
|
@@ -25,23 +25,27 @@ function M(i) {
|
|
|
25
25
|
console.error(`[EventBus] Error in subscriber for "${i.method}":`, n);
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
-
function
|
|
29
|
-
|
|
28
|
+
function _() {
|
|
29
|
+
m.clear(), g.clear();
|
|
30
30
|
}
|
|
31
|
-
const
|
|
32
|
-
|
|
31
|
+
const P = {
|
|
32
|
+
on(i, e) {
|
|
33
|
+
return w(i, e);
|
|
34
|
+
}
|
|
35
|
+
}, E = {};
|
|
36
|
+
function H(i, e) {
|
|
33
37
|
E[i] = e;
|
|
34
38
|
}
|
|
35
|
-
function
|
|
39
|
+
function S(i) {
|
|
36
40
|
return E[i];
|
|
37
41
|
}
|
|
38
|
-
const
|
|
39
|
-
class
|
|
42
|
+
const q = 1e3, N = 1001, B = 1002, k = 1003, D = 1004, I = 6666;
|
|
43
|
+
class y extends Error {
|
|
40
44
|
constructor(e, t, s) {
|
|
41
45
|
super(t), this.name = "PluginActionError", this.code = e, this.errorData = s;
|
|
42
46
|
}
|
|
43
47
|
}
|
|
44
|
-
class
|
|
48
|
+
class v {
|
|
45
49
|
constructor(e, t, s, n, r, o) {
|
|
46
50
|
this.pendingRequests = /* @__PURE__ */ new Map(), this.messageListener = null, this.requestTimeout = 1e4, this.pluginId = e, this.elementId = t, this.targetOrigin = r, this.entityId = n, this.entityMeta = o, this.slot = s, this.initListener();
|
|
47
51
|
}
|
|
@@ -57,8 +61,8 @@ class C {
|
|
|
57
61
|
this.pendingRequests.set(o, { resolve: n, reject: r, timeoutId: a });
|
|
58
62
|
try {
|
|
59
63
|
this.send(l);
|
|
60
|
-
} catch (
|
|
61
|
-
clearTimeout(a), this.pendingRequests.delete(o), r(
|
|
64
|
+
} catch (d) {
|
|
65
|
+
clearTimeout(a), this.pendingRequests.delete(o), r(d);
|
|
62
66
|
}
|
|
63
67
|
});
|
|
64
68
|
}
|
|
@@ -94,7 +98,7 @@ class C {
|
|
|
94
98
|
}
|
|
95
99
|
const t = e.data;
|
|
96
100
|
if (console.info("[Bridge] Received message:", t), t.type === "event") {
|
|
97
|
-
console.info("[Bridge] Dispatching host event:", t.method, t.result),
|
|
101
|
+
console.info("[Bridge] Dispatching host event:", t.method, t.result), R(t);
|
|
98
102
|
return;
|
|
99
103
|
}
|
|
100
104
|
if (console.info("[Bridge] Received message:", e.data), !t.messageId) {
|
|
@@ -104,13 +108,13 @@ class C {
|
|
|
104
108
|
const s = t, n = this.pendingRequests.get(s.messageId);
|
|
105
109
|
if (!n) {
|
|
106
110
|
if (s.type === "request") {
|
|
107
|
-
const c = s.result.method, l =
|
|
111
|
+
const c = s.result.method, l = S(c);
|
|
108
112
|
if (!l) {
|
|
109
113
|
this.send({
|
|
110
114
|
messageId: s.messageId,
|
|
111
115
|
type: "response",
|
|
112
116
|
result: null,
|
|
113
|
-
errorCode:
|
|
117
|
+
errorCode: I,
|
|
114
118
|
error: `No handler for method ${c}`
|
|
115
119
|
});
|
|
116
120
|
return;
|
|
@@ -124,13 +128,13 @@ class C {
|
|
|
124
128
|
type: "response"
|
|
125
129
|
});
|
|
126
130
|
} catch (a) {
|
|
127
|
-
const
|
|
131
|
+
const d = a instanceof Error ? a : new Error(String(a)), f = d instanceof y ? d.code : I;
|
|
128
132
|
this.send({
|
|
129
133
|
messageId: s.messageId,
|
|
130
134
|
type: "response",
|
|
131
135
|
result: null,
|
|
132
|
-
errorCode:
|
|
133
|
-
error:
|
|
136
|
+
errorCode: f,
|
|
137
|
+
error: d.message
|
|
134
138
|
});
|
|
135
139
|
}
|
|
136
140
|
}
|
|
@@ -139,7 +143,7 @@ class C {
|
|
|
139
143
|
clearTimeout(n.timeoutId), this.pendingRequests.delete(s.messageId);
|
|
140
144
|
const r = s;
|
|
141
145
|
r.type === "response" && r.errorCode ? n.reject(
|
|
142
|
-
new
|
|
146
|
+
new y(
|
|
143
147
|
r.errorCode,
|
|
144
148
|
r.error ?? "Unknown error",
|
|
145
149
|
r.errorData
|
|
@@ -152,8 +156,8 @@ class C {
|
|
|
152
156
|
}
|
|
153
157
|
}
|
|
154
158
|
let h = null;
|
|
155
|
-
function
|
|
156
|
-
return h && h.destroy(), h = new
|
|
159
|
+
function M(i, e, t, s, n, r) {
|
|
160
|
+
return h && h.destroy(), h = new v(
|
|
157
161
|
i,
|
|
158
162
|
e,
|
|
159
163
|
t,
|
|
@@ -162,23 +166,23 @@ function O(i, e, t, s, n, r) {
|
|
|
162
166
|
r
|
|
163
167
|
), h;
|
|
164
168
|
}
|
|
165
|
-
function
|
|
169
|
+
function C() {
|
|
166
170
|
if (!h)
|
|
167
171
|
throw new Error("Bridge not initialized. Call initBridge first.");
|
|
168
172
|
return h;
|
|
169
173
|
}
|
|
170
|
-
function
|
|
171
|
-
return
|
|
174
|
+
function u(i, e, t) {
|
|
175
|
+
return C().request(i, e, t);
|
|
172
176
|
}
|
|
173
|
-
const
|
|
174
|
-
class
|
|
177
|
+
const O = 3e5;
|
|
178
|
+
class T {
|
|
175
179
|
show(e) {
|
|
176
|
-
return
|
|
177
|
-
timeout:
|
|
180
|
+
return u("confirm.show", e, {
|
|
181
|
+
timeout: O
|
|
178
182
|
});
|
|
179
183
|
}
|
|
180
184
|
}
|
|
181
|
-
class
|
|
185
|
+
class L {
|
|
182
186
|
constructor() {
|
|
183
187
|
this.callbackMap = /* @__PURE__ */ new Map(), this.toastActionIds = /* @__PURE__ */ new Map(), this.eventSubscribed = !1;
|
|
184
188
|
}
|
|
@@ -187,7 +191,7 @@ class A {
|
|
|
187
191
|
const t = [], s = e.actions?.map((o) => {
|
|
188
192
|
const c = crypto.randomUUID();
|
|
189
193
|
return this.callbackMap.set(c, o.onClick), t.push(c), { id: c, label: o.label };
|
|
190
|
-
}), n = await
|
|
194
|
+
}), n = await u("toast.add", {
|
|
191
195
|
name: e.name,
|
|
192
196
|
title: e.title,
|
|
193
197
|
content: e.content,
|
|
@@ -201,7 +205,7 @@ class A {
|
|
|
201
205
|
return setTimeout(() => this.cleanupCallbacksForToast(n.name), r + 1e3), n;
|
|
202
206
|
}
|
|
203
207
|
ensureEventSubscription() {
|
|
204
|
-
this.eventSubscribed || (this.eventSubscribed = !0,
|
|
208
|
+
this.eventSubscribed || (this.eventSubscribed = !0, w("toast.action.clicked", ({ name: e, actionId: t }) => {
|
|
205
209
|
this.callbackMap.get(t)?.(), this.cleanupCallbacksForToast(e);
|
|
206
210
|
}));
|
|
207
211
|
}
|
|
@@ -214,13 +218,16 @@ class A {
|
|
|
214
218
|
}
|
|
215
219
|
}
|
|
216
220
|
}
|
|
217
|
-
class
|
|
221
|
+
class z {
|
|
218
222
|
constructor() {
|
|
219
|
-
this.toaster = new
|
|
223
|
+
this.toaster = new L(), this.confirm = new T();
|
|
224
|
+
}
|
|
225
|
+
navigate(e) {
|
|
226
|
+
return u("navigate", e);
|
|
220
227
|
}
|
|
221
228
|
}
|
|
222
|
-
const
|
|
223
|
-
function
|
|
229
|
+
const x = new z();
|
|
230
|
+
function F(i, e, t) {
|
|
224
231
|
if (e === "")
|
|
225
232
|
return t;
|
|
226
233
|
const s = e.split(".");
|
|
@@ -232,13 +239,13 @@ function X(i, e, t) {
|
|
|
232
239
|
return t;
|
|
233
240
|
return n ?? t;
|
|
234
241
|
}
|
|
235
|
-
function
|
|
242
|
+
function $(i, e, t = "ru") {
|
|
236
243
|
if (typeof i == "string")
|
|
237
244
|
return i;
|
|
238
245
|
const s = (e ?? t).toLowerCase(), n = t.toLowerCase();
|
|
239
246
|
return i[s] || i[n] || i.ru || i.en || "";
|
|
240
247
|
}
|
|
241
|
-
class
|
|
248
|
+
class A {
|
|
242
249
|
constructor(e) {
|
|
243
250
|
this.lastHeight = 0, this.isUpdating = !1, this.consecutiveSmallIncreases = 0, this.MAX_CONSECUTIVE_SMALL_INCREASES = 5, this.SMALL_INCREASE_THRESHOLD_PX = 10, this.resizeCallback = e;
|
|
244
251
|
}
|
|
@@ -286,78 +293,40 @@ class U {
|
|
|
286
293
|
this.resizeObserver?.disconnect(), clearTimeout(this.resizeTimeout), this.isUpdating = !1, this.consecutiveSmallIncreases = 0;
|
|
287
294
|
}
|
|
288
295
|
}
|
|
289
|
-
|
|
290
|
-
return {
|
|
291
|
-
version: s,
|
|
292
|
-
method: i,
|
|
293
|
-
url: e,
|
|
294
|
-
pathParams: t.pathParams ?? {},
|
|
295
|
-
queryParams: t.queryParams ?? {},
|
|
296
|
-
bodyParams: t.bodyParams ?? {},
|
|
297
|
-
file: t.file
|
|
298
|
-
};
|
|
299
|
-
}
|
|
300
|
-
const p = class p {
|
|
301
|
-
get v3() {
|
|
302
|
-
return {
|
|
303
|
-
get: this.createMethodProxy("GET"),
|
|
304
|
-
post: this.createMethodProxy("POST"),
|
|
305
|
-
put: this.createMethodProxy("PUT"),
|
|
306
|
-
patch: this.createMethodProxy("PATCH"),
|
|
307
|
-
delete: this.createMethodProxy("DELETE")
|
|
308
|
-
};
|
|
309
|
-
}
|
|
310
|
-
createMethodProxy(e) {
|
|
311
|
-
const t = this;
|
|
312
|
-
return new Proxy({}, {
|
|
313
|
-
get(s, n) {
|
|
314
|
-
return (r) => t.call(e, n, r, p.V3_VERSION);
|
|
315
|
-
}
|
|
316
|
-
});
|
|
317
|
-
}
|
|
318
|
-
call(e, t, s = {}, n) {
|
|
319
|
-
const r = H(e, t, s, n);
|
|
320
|
-
return d("api.tracker.call", r);
|
|
321
|
-
}
|
|
322
|
-
};
|
|
323
|
-
p.V3_VERSION = "v3";
|
|
324
|
-
let I = p;
|
|
325
|
-
const q = new I();
|
|
326
|
-
class N {
|
|
296
|
+
class U {
|
|
327
297
|
constructor() {
|
|
328
|
-
this.slot = null, this.service = null, this.origin = null, this.innerUrl = null, this.queryParams = null;
|
|
298
|
+
this.slot = null, this.service = null, this.origin = null, this.innerUrl = null, this.queryParams = null, this.entityId = null, this.entityMeta = void 0, this.contextLevel = "full";
|
|
329
299
|
}
|
|
330
300
|
getTheme() {
|
|
331
|
-
return
|
|
301
|
+
return u("theme.get");
|
|
332
302
|
}
|
|
333
303
|
getLanguage() {
|
|
334
|
-
return
|
|
304
|
+
return u("language.get");
|
|
335
305
|
}
|
|
336
306
|
getUserId() {
|
|
337
|
-
return
|
|
307
|
+
return u("userId.get");
|
|
338
308
|
}
|
|
339
309
|
getIsYateam() {
|
|
340
|
-
return
|
|
310
|
+
return u("isYateam.get");
|
|
341
311
|
}
|
|
342
312
|
getContext() {
|
|
343
|
-
return
|
|
313
|
+
return u("context.get");
|
|
344
314
|
}
|
|
345
315
|
updateContentSize(e) {
|
|
346
|
-
return
|
|
316
|
+
return u("contentSize.update", e);
|
|
347
317
|
}
|
|
348
318
|
notifyReady() {
|
|
349
|
-
return
|
|
319
|
+
return u("plugin.ready");
|
|
350
320
|
}
|
|
351
321
|
close(e) {
|
|
352
|
-
return
|
|
353
|
-
}
|
|
354
|
-
navigate(e) {
|
|
355
|
-
return d("navigate", e);
|
|
322
|
+
return u("plugin.close", e);
|
|
356
323
|
}
|
|
357
324
|
init(e) {
|
|
358
325
|
const { autoResize: t = !0 } = e, s = new URLSearchParams(location.search);
|
|
359
326
|
if (this.service = s.get("service"), this.service === null)
|
|
360
|
-
throw new Error(
|
|
327
|
+
throw new Error(
|
|
328
|
+
'Missing required URL parameter "service". A plugin cannot run outside the host application context. Open the plugin from the host application.'
|
|
329
|
+
);
|
|
361
330
|
const n = s.get("slot");
|
|
362
331
|
if (!n)
|
|
363
332
|
throw new Error("Slot is not defined");
|
|
@@ -370,11 +339,13 @@ class N {
|
|
|
370
339
|
const c = s.get("elementId");
|
|
371
340
|
if (!c)
|
|
372
341
|
throw new Error("Element id is not defined");
|
|
373
|
-
const l = s.get("entityId"), a = s.get("entityMeta"),
|
|
374
|
-
|
|
375
|
-
const
|
|
376
|
-
this.
|
|
377
|
-
|
|
342
|
+
const l = s.get("entityId"), a = s.get("entityMeta"), d = a ? JSON.parse(a) : void 0;
|
|
343
|
+
M(o, c, n, l, r, d), this.slot = n, this.origin = r, this.entityId = l, this.entityMeta = d;
|
|
344
|
+
const f = s.get("contextLevel");
|
|
345
|
+
this.contextLevel = f === "basic" ? "basic" : "full", this.innerUrl = s.get("innerUrl") ?? "";
|
|
346
|
+
const p = s.get("queryParams");
|
|
347
|
+
this.queryParams = p ? JSON.parse(decodeURIComponent(p)) : {}, t && (this.autoResizeManager = new A(
|
|
348
|
+
(b) => this.updateContentSize({ height: b })
|
|
378
349
|
), this.autoResizeManager.enable());
|
|
379
350
|
}
|
|
380
351
|
getSlot() {
|
|
@@ -402,37 +373,43 @@ class N {
|
|
|
402
373
|
throw new Error("Plugin not initialized. Call init() first.");
|
|
403
374
|
return this.queryParams;
|
|
404
375
|
}
|
|
376
|
+
getEntityId() {
|
|
377
|
+
return this.entityId;
|
|
378
|
+
}
|
|
379
|
+
getEntityMeta() {
|
|
380
|
+
return this.entityMeta;
|
|
381
|
+
}
|
|
382
|
+
getContextLevel() {
|
|
383
|
+
return this.contextLevel;
|
|
384
|
+
}
|
|
405
385
|
disableAutoResize() {
|
|
406
386
|
this.autoResizeManager?.disable();
|
|
407
387
|
}
|
|
408
388
|
}
|
|
409
|
-
const
|
|
410
|
-
function Y(i, e) {
|
|
411
|
-
P(i, e);
|
|
412
|
-
}
|
|
413
|
-
function j(i) {
|
|
414
|
-
return b(i);
|
|
415
|
-
}
|
|
416
|
-
function K(i, e, t = "ru") {
|
|
417
|
-
return _(i, e, t);
|
|
418
|
-
}
|
|
389
|
+
const X = new U();
|
|
419
390
|
export {
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
391
|
+
A as AutoResizeManager,
|
|
392
|
+
T as Confirm,
|
|
393
|
+
U as HostApi,
|
|
394
|
+
k as METHOD_NOT_SUPPORTED,
|
|
395
|
+
D as MISSING_REQUIRED_SCOPE,
|
|
396
|
+
N as PLUGIN_ID_IS_NOT_CORRECT,
|
|
397
|
+
q as PLUGIN_ID_OR_SLOT_NOT_PROVIDED,
|
|
398
|
+
y as PluginActionError,
|
|
399
|
+
L as Toaster,
|
|
400
|
+
I as UNKNOWN_ERROR,
|
|
401
|
+
B as VALIDATION_ERROR,
|
|
402
|
+
R as dispatchHostEvent,
|
|
403
|
+
P as eventBus,
|
|
404
|
+
F as getField,
|
|
405
|
+
S as getHandler,
|
|
406
|
+
$ as getLocalizedString,
|
|
407
|
+
X as hostApi,
|
|
408
|
+
M as initBridge,
|
|
409
|
+
w as on,
|
|
410
|
+
_ as resetEventBus,
|
|
411
|
+
u as sendRequest,
|
|
412
|
+
H as setHandler,
|
|
413
|
+
x as uiApi
|
|
437
414
|
};
|
|
438
415
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../core-shared/src/events/eventBus.ts","../../core-shared/src/handlers/handlers.ts","../../core-shared/src/bridge/types/ErrorCodes.ts","../../core-shared/src/bridge/types/PluginActionError.ts","../../core-shared/src/bridge/bridge.ts","../../core-shared/src/ui/Confirm.ts","../../core-shared/src/ui/Toaster.ts","../../core-shared/src/ui/uiApi.ts","../../core-shared/src/utils/getField.ts","../../core-shared/src/utils/localization.ts","../../core-shared/src/host/utils/autoResize.ts","../../core-shared/src/api/trackerApi.ts","../../core-shared/src/host/hostApi.ts","../src/api/trackerApi.ts","../src/host/hostApi.ts","../src/handlers/handlers.ts","../src/utils/localization.ts"],"sourcesContent":["import type {\n EventMessage,\n HostEventCallback,\n HostEventContract,\n HostEventMethod,\n Unsubscribe,\n} from './types';\n\nconst subscribers = new Map<HostEventMethod, Set<(result: unknown) => void>>();\nconst lastValues = new Map<HostEventMethod, unknown>();\n\n/**\n * Subscribe to a host-pushed event.\n * If a value was already dispatched for this method, the callback is called\n * synchronously with the cached value before returning.\n * @param method - Event method name (e.g. `'theme.changed'`)\n * @param callback - Function called with the typed event payload\n * @returns An `Unsubscribe` function that removes this subscription\n */\nexport function on<M extends HostEventMethod>(\n method: M,\n callback: HostEventCallback<M>,\n): Unsubscribe {\n let set = subscribers.get(method);\n if (!set) {\n set = new Set();\n subscribers.set(method, set);\n }\n\n const cb = callback as (result: unknown) => void;\n set.add(cb);\n\n // Replay last known value to the new subscriber immediately\n if (lastValues.has(method)) {\n try {\n cb(lastValues.get(method));\n } catch (err) {\n console.error(`[EventBus] Error replaying cached value for \"${method}\":`, err);\n }\n }\n\n return () => {\n set.delete(cb);\n if (set.size === 0) {\n subscribers.delete(method);\n }\n };\n}\n\n/**\n * Dispatch an incoming event message to all registered subscribers.\n * Caches the value so late subscribers receive it on subscription.\n */\nexport function dispatchHostEvent(message: EventMessage): void {\n const method = message.method as HostEventMethod;\n lastValues.set(method, message.result);\n\n const set = subscribers.get(method);\n if (!set) {\n return;\n }\n for (const cb of set) {\n try {\n cb(message.result);\n } catch (err) {\n console.error(`[EventBus] Error in subscriber for \"${message.method}\":`, err);\n }\n }\n}\n\n/**\n * Clears all cached last values and subscribers from the event bus.\n * Intended for use in tests to prevent state leaking between test cases.\n */\nexport function resetEventBus(): void {\n lastValues.clear();\n subscribers.clear();\n}\n\n/**\n * Public event emitter — subscribe to host-pushed events.\n * Only events defined in `HostEventContract` are accepted.\n * @example\n * ```ts\n * import { eventBus } from '@yandex-data-ui/tracker-plugin-sdk-core';\n *\n * const unsubscribe = eventBus.on('theme.changed', (theme) => {\n * console.log('Theme:', theme);\n * });\n *\n * unsubscribe();\n * ```\n */\nexport const eventBus = {\n on<M extends HostEventMethod>(\n method: M,\n callback: (result: HostEventContract[M]['result']) => void,\n ): Unsubscribe {\n return on(method, callback);\n },\n};\n","type AnyHandler = (...args: unknown[]) => unknown;\n\nconst handlers: Record<string, AnyHandler> = {};\n\n/**\n * Регистрирует handler по имени. Тип не проверяется на runtime'е;\n * type-safety обеспечивается typed wrapper'ом в публикуемых пакетах.\n */\nexport function setHandler(name: string, handler: AnyHandler): void {\n handlers[name] = handler;\n}\n\n/**\n * Возвращает зарегистрированный handler по имени, или undefined.\n */\nexport function getHandler(name: string): AnyHandler | undefined {\n return handlers[name];\n}\n","/** Код ошибки: не переданы обязательные параметры инициализации плагина (pluginId или slot). */\nexport const PLUGIN_ID_OR_SLOT_NOT_PROVIDED = 1000;\n\n/** Код ошибки: переданный pluginId не совпадает с зарегистрированным плагином или неверного формата. */\nexport const PLUGIN_ID_IS_NOT_CORRECT = 1001;\n\n/** Код ошибки: данные запроса не прошли валидацию (неверный формат, обязательные поля отсутствуют и т.п.). */\nexport const VALIDATION_ERROR = 1002;\n\n/** Код ошибки: запрошенный метод API не поддерживается в данной конфигурации или версии. */\nexport const METHOD_NOT_SUPPORTED = 1003;\n\n/** Код ошибки: у плагина нет необходимого scope (разрешения) для выполнения операции. */\nexport const MISSING_REQUIRED_SCOPE = 1004;\n\n/** Код ошибки: непредвиденная или неклассифицированная ошибка. */\nexport const UNKNOWN_ERROR = 6666;\n","export class PluginActionError extends Error {\n readonly code: number;\n\n readonly errorData?: unknown;\n\n constructor(code: number, message: string, errorData?: unknown) {\n super(message);\n this.name = 'PluginActionError';\n this.code = code;\n this.errorData = errorData;\n }\n}\n","import { dispatchHostEvent } from '../events/eventBus';\nimport type { EventMessage } from '../events/types';\nimport { getHandler } from '../handlers/handlers';\nimport { UNKNOWN_ERROR } from './types/ErrorCodes';\nimport type { BaseMessage } from './types/BaseMessage';\nimport { PluginActionError } from './types/PluginActionError';\n\ntype RequestOptions = { timeout?: number };\n\ntype PendingRequest = {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeoutId: ReturnType<typeof setTimeout>;\n};\n\ntype RawRequestMessage = BaseMessage & {\n method: string;\n payload: unknown;\n};\n\ntype RawResponseMessage = BaseMessage & {\n type: 'response';\n result: unknown;\n error?: string;\n errorCode?: number;\n errorData?: unknown;\n};\n\ntype RawIncomingRequestMessage = BaseMessage & {\n type: 'request';\n result: { method: string; payload: unknown };\n error?: string;\n};\n\nclass PluginBridge {\n private pluginId: string;\n private elementId: string;\n private targetOrigin: string;\n private slot: string;\n private entityId: string | null;\n private entityMeta: Record<string, string> | undefined;\n private pendingRequests: Map<string, PendingRequest> = new Map();\n private messageListener: ((event: MessageEvent) => void) | null = null;\n private readonly requestTimeout = 10000;\n\n constructor(\n pluginId: string,\n elementId: string,\n slot: string,\n entityId: string | null,\n targetOrigin: string,\n entityMeta?: Record<string, string>,\n ) {\n this.pluginId = pluginId;\n this.elementId = elementId;\n this.targetOrigin = targetOrigin;\n this.entityId = entityId;\n this.entityMeta = entityMeta;\n this.slot = slot;\n this.initListener();\n }\n\n request(method: string, payload?: unknown, options?: RequestOptions): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const messageId = this.generateMessageId();\n const timeoutMs = options?.timeout ?? this.requestTimeout;\n\n const requestMessage: RawRequestMessage = {\n messageId,\n method,\n payload,\n };\n\n const timeoutId = setTimeout(() => {\n const pending = this.pendingRequests.get(messageId);\n if (pending) {\n this.pendingRequests.delete(messageId);\n reject(new Error(`Request timeout: ${method} exceeded ${timeoutMs}ms`));\n }\n }, timeoutMs);\n\n this.pendingRequests.set(messageId, { resolve, reject, timeoutId });\n\n try {\n this.send(requestMessage);\n } catch (e) {\n clearTimeout(timeoutId);\n this.pendingRequests.delete(messageId);\n reject(e as Error);\n }\n });\n }\n\n send<T = unknown>(message: T): void {\n window.parent.postMessage(\n {\n pluginId: this.pluginId,\n elementId: this.elementId,\n slot: this.slot,\n entityId: this.entityId,\n entityMeta: this.entityMeta,\n ...message,\n },\n this.targetOrigin,\n );\n }\n\n destroy(): void {\n if (this.messageListener) {\n window.removeEventListener('message', this.messageListener);\n this.messageListener = null;\n }\n\n this.pendingRequests.forEach((pending) => {\n clearTimeout(pending.timeoutId);\n });\n this.pendingRequests.clear();\n }\n\n private initListener(): void {\n this.messageListener = async (event: MessageEvent) => {\n if (event.origin !== this.targetOrigin) {\n console.info(\n '[Bridge] Ignored message from origin:',\n event.origin,\n '(expected:',\n this.targetOrigin,\n ')',\n );\n return;\n }\n\n const message = event.data;\n console.info('[Bridge] Received message:', message);\n\n if (message.type === 'event') {\n console.info('[Bridge] Dispatching host event:', message.method, message.result);\n dispatchHostEvent(message as EventMessage);\n return;\n }\n\n console.info('[Bridge] Received message:', event.data);\n\n if (!message.messageId) {\n console.info('[Bridge] Ignored message without messageId:', message);\n return;\n }\n\n const typedMessage = message as RawResponseMessage | RawIncomingRequestMessage;\n const pending = this.pendingRequests.get(typedMessage.messageId);\n\n if (!pending) {\n if (typedMessage.type === 'request') {\n const incoming = typedMessage as RawIncomingRequestMessage;\n const method = incoming.result.method;\n const handler = getHandler(method);\n\n if (!handler) {\n this.send({\n messageId: typedMessage.messageId,\n type: 'response',\n result: null,\n errorCode: UNKNOWN_ERROR,\n error: `No handler for method ${method}`,\n });\n return;\n }\n\n try {\n const data = handler();\n this.send({\n messageId: typedMessage.messageId,\n payload: data,\n method: 'responseData',\n type: 'response',\n });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n const errorCode =\n err instanceof PluginActionError ? err.code : UNKNOWN_ERROR;\n this.send({\n messageId: typedMessage.messageId,\n type: 'response',\n result: null,\n errorCode,\n error: err.message,\n });\n }\n }\n\n return;\n }\n\n clearTimeout(pending.timeoutId);\n this.pendingRequests.delete(typedMessage.messageId);\n\n const response = typedMessage as RawResponseMessage;\n if (response.type === 'response' && response.errorCode) {\n pending.reject(\n new PluginActionError(\n response.errorCode,\n response.error ?? 'Unknown error',\n response.errorData,\n ),\n );\n } else {\n pending.resolve(response.result);\n }\n };\n\n window.addEventListener('message', this.messageListener);\n }\n\n private generateMessageId(): string {\n return crypto.randomUUID();\n }\n}\n\nlet bridgeInstance: PluginBridge | null = null;\n\nexport function initBridge(\n pluginId: string,\n elementId: string,\n slot: string,\n entityId: string | null,\n targetOrigin: string,\n entityMeta?: Record<string, string>,\n): PluginBridge {\n if (bridgeInstance) {\n bridgeInstance.destroy();\n }\n bridgeInstance = new PluginBridge(\n pluginId,\n elementId,\n slot,\n entityId,\n targetOrigin,\n entityMeta,\n );\n return bridgeInstance;\n}\n\nfunction getBridge(): PluginBridge {\n if (!bridgeInstance) {\n throw new Error('Bridge not initialized. Call initBridge first.');\n }\n return bridgeInstance;\n}\n\nexport function sendRequest(\n method: string,\n payload?: unknown,\n options?: RequestOptions,\n): Promise<unknown> {\n return getBridge().request(method, payload, options);\n}\n","import { sendRequest } from '../bridge/bridge';\n\nexport type ConfirmOptions = {\n title?: string;\n message: string;\n textButtonApply?: string;\n textButtonCancel?: string;\n theme?: 'normal' | 'danger';\n};\n\nexport type ConfirmResult = { confirmed: boolean };\n\nconst CONFIRM_TIMEOUT_MS = 300_000;\n\nexport class Confirm {\n show(options: ConfirmOptions): Promise<ConfirmResult> {\n return sendRequest('confirm.show', options, {\n timeout: CONFIRM_TIMEOUT_MS,\n }) as Promise<ConfirmResult>;\n }\n}\n","import { sendRequest } from '../bridge/bridge';\nimport { on } from '../events/eventBus';\n\nexport type ToastAction = {\n label: string;\n onClick: () => void;\n};\n\nexport type ToastOptions = {\n name?: string;\n title: string;\n content?: string;\n theme?: 'success' | 'danger' | 'warning' | 'info';\n autoHiding?: number;\n isClosable?: boolean;\n actions?: ToastAction[];\n};\n\nexport class Toaster {\n private callbackMap = new Map<string, () => void>();\n private toastActionIds = new Map<string, string[]>();\n private eventSubscribed = false;\n\n async add(options: ToastOptions): Promise<{ name: string }> {\n this.ensureEventSubscription();\n\n const actionIds: string[] = [];\n const serializedActions = options.actions?.map((action) => {\n const actionId = crypto.randomUUID();\n\n this.callbackMap.set(actionId, action.onClick);\n actionIds.push(actionId);\n\n return { id: actionId, label: action.label };\n });\n\n const result = (await sendRequest('toast.add', {\n name: options.name,\n title: options.title,\n content: options.content,\n theme: options.theme,\n autoHiding: options.autoHiding,\n isClosable: options.isClosable,\n actions: serializedActions,\n })) as { name: string };\n\n if (actionIds.length > 0) {\n this.toastActionIds.set(result.name, actionIds);\n }\n\n const autoHiding = options.autoHiding ?? 5000;\n\n setTimeout(() => this.cleanupCallbacksForToast(result.name), autoHiding + 1000);\n\n return result;\n }\n\n private ensureEventSubscription() {\n if (this.eventSubscribed) return;\n this.eventSubscribed = true;\n\n on('toast.action.clicked', ({ name, actionId }) => {\n const callback = this.callbackMap.get(actionId);\n\n callback?.();\n this.cleanupCallbacksForToast(name);\n });\n }\n\n private cleanupCallbacksForToast(name: string) {\n const actionIds = this.toastActionIds.get(name);\n\n if (actionIds) {\n for (const id of actionIds) {\n this.callbackMap.delete(id);\n }\n this.toastActionIds.delete(name);\n }\n }\n}\n","import { Confirm } from './Confirm';\nimport { Toaster } from './Toaster';\n\nclass UiApi {\n readonly toaster = new Toaster();\n readonly confirm = new Confirm();\n}\n\nexport const uiApi = new UiApi();\n","/**\n * Извлекает значение из объекта по точечному пути (dot notation).\n * Предназначена для работы с полями типа Record<string, unknown>, например со значениями полей задачи (Issue).\n *\n * Поддерживает вложенные пути: `'priority.display'`, `'assignee.display.ru'` и т.д.\n * Если любой сегмент пути отсутствует или не является объектом — возвращается defaultValue или undefined.\n * @param obj - Объект с произвольной структурой (например, issue или issue.values)\n * @param path - Путь к полю через точку, например `'priority.display'` или `'summary'`\n * @param defaultValue - Значение по умолчанию, если путь не найден\n * @returns Значение по пути, defaultValue или undefined\n * @example\n * ```ts\n * // Поле верхнего уровня\n * getField(issue, 'key'); // 'QUEUE-123'\n *\n * // Вложенное поле (например, приоритет с display)\n * getField(issue, 'priority.display'); // 'много' | undefined\n *\n * // С типизацией и значением по умолчанию\n * const name = getField<string>(issue, 'summary', 'Без названия');\n *\n * // Элемент массива по индексу (массивы — объекты с числовыми ключами)\n * getField(tags, '0'); // первый элемент\n * ```\n */\nexport function getField<T = unknown>(\n obj: Record<string, unknown>,\n path: string,\n defaultValue?: T,\n): T | undefined {\n if (path === '') {\n return defaultValue;\n }\n\n const keys = path.split('.');\n let result: unknown = obj;\n\n for (const key of keys) {\n if (\n result !== null &&\n typeof result === 'object' &&\n Object.prototype.hasOwnProperty.call(result, key)\n ) {\n result = (result as Record<string, unknown>)[key];\n } else {\n return defaultValue;\n }\n }\n\n return (result as T | undefined) ?? defaultValue;\n}\n","/**\n * Структурный shape `LocalizedString` — общая база, к которой структурно\n * совместимы api-types `LocalizedString` обоих flavors. Реальная функция\n * `getLocalizedString` читает только ключи `ru` и `en`, поэтому более\n * узкие api-types-варианты (с дополнительными ключами) совместимы.\n */\nexport type LocalizedString = string | { ru?: string; en?: string };\n\n/**\n * Получить локализованную строку на основе языка\n * @param value - Локализованная строка\n * @param language - Код языка ('ru' или 'en')\n * @param fallbackLanguage - Резервный язык (по умолчанию 'ru')\n */\nexport function getLocalizedString(\n value: LocalizedString,\n language: string | undefined,\n fallbackLanguage = 'ru',\n): string {\n if (typeof value === 'string') {\n return value;\n }\n\n const lang = (language ?? fallbackLanguage).toLowerCase() as 'ru' | 'en';\n const fallback = fallbackLanguage.toLowerCase() as 'ru' | 'en';\n\n return value[lang] || value[fallback] || value.ru || value.en || '';\n}\n","export type ResizeCallback = (height: number) => Promise<void> | void;\n\nexport class AutoResizeManager {\n private resizeCallback: ResizeCallback;\n private resizeObserver?: ResizeObserver;\n private resizeTimeout?: ReturnType<typeof setTimeout>;\n private lastHeight = 0;\n private isUpdating = false;\n private consecutiveSmallIncreases = 0;\n private readonly MAX_CONSECUTIVE_SMALL_INCREASES = 5;\n private readonly SMALL_INCREASE_THRESHOLD_PX = 10;\n\n constructor(resizeCallback: ResizeCallback) {\n this.resizeCallback = resizeCallback;\n }\n\n enable(): void {\n if (!document.body) {\n console.error('[AutoResize] document.body does not exist yet');\n return;\n }\n\n const sendHeight = async () => {\n if (this.isUpdating) {\n return;\n }\n\n // Use body.scrollHeight as primary source in iframe\n // documentElement.scrollHeight can cache old values\n const root = document.getElementById('root');\n const bodyStyles = window.getComputedStyle(document.body);\n const marginTop = parseInt(bodyStyles.marginTop, 10) || 0;\n const marginBottom = parseInt(bodyStyles.marginBottom, 10) || 0;\n\n const measuredHeight = Math.max(\n document.body.scrollHeight,\n document.body.offsetHeight,\n root ? root.scrollHeight + marginTop + marginBottom : 0,\n );\n\n // Add small buffer to compensate for rounding errors\n const height = measuredHeight + 4;\n\n if (height !== this.lastHeight) {\n // Detect infinite loop: if height keeps increasing by small amounts\n // This prevents issues with elements using viewport units (vh, %)\n if (height > this.lastHeight) {\n const increase = height - this.lastHeight;\n\n // Only count small increases as potential loop indicators\n // Large increases are normal (user adding content)\n if (increase <= this.SMALL_INCREASE_THRESHOLD_PX) {\n this.consecutiveSmallIncreases++;\n\n if (this.consecutiveSmallIncreases > this.MAX_CONSECUTIVE_SMALL_INCREASES) {\n console.warn(\n '[AutoResize] Infinite loop detected. Stopping auto-resize. ' +\n 'This may be caused by elements with viewport-relative units (vh, %).',\n );\n this.disable();\n return;\n }\n } else {\n // Large increase - reset counter (normal content addition)\n this.consecutiveSmallIncreases = 0;\n }\n } else {\n // Height decreased - reset counter\n this.consecutiveSmallIncreases = 0;\n }\n\n this.isUpdating = true;\n this.lastHeight = height;\n\n try {\n await this.resizeCallback(height);\n } catch (error) {\n console.error('[AutoResize] Failed to update content size:', error);\n } finally {\n this.isUpdating = false;\n }\n }\n };\n\n const debouncedSendHeight = () => {\n clearTimeout(this.resizeTimeout);\n this.resizeTimeout = setTimeout(sendHeight, 100);\n };\n\n this.resizeObserver = new ResizeObserver(debouncedSendHeight);\n this.resizeObserver.observe(document.body);\n\n // Send initial height\n sendHeight();\n }\n\n disable(): void {\n this.resizeObserver?.disconnect();\n clearTimeout(this.resizeTimeout);\n this.isUpdating = false;\n this.consecutiveSmallIncreases = 0;\n }\n}\n","import { sendRequest } from '../bridge/bridge';\nimport type { ApiCallPayload, ApiCallResult } from './types';\n\nexport interface TrackerApiCallOptions {\n pathParams?: Record<string, string>;\n queryParams?: Record<string, unknown>;\n bodyParams?: Record<string, unknown>;\n file?: File;\n}\n\nfunction buildPayload(\n method: string,\n url: string,\n options: TrackerApiCallOptions = {},\n version: string,\n): ApiCallPayload {\n return {\n version,\n method,\n url,\n pathParams: options.pathParams ?? {},\n queryParams: options.queryParams ?? {},\n bodyParams: options.bodyParams ?? {},\n file: options.file,\n };\n}\n\nexport interface TrackerApiInitOptions {\n apiVersion?: string;\n}\n\n/**\n * Untyped runtime API класс. v3-методы возвращают Proxy, который при обращении\n * по любому ключу строит call. Типизация добавляется в публикуемых пакетах\n * через cast (см. typed wrapper).\n */\nexport class TrackerApi {\n private static readonly V3_VERSION = 'v3';\n\n get v3(): {\n get: Record<string, (opts: TrackerApiCallOptions) => Promise<unknown>>;\n post: Record<string, (opts: TrackerApiCallOptions) => Promise<unknown>>;\n put: Record<string, (opts: TrackerApiCallOptions) => Promise<unknown>>;\n patch: Record<string, (opts: TrackerApiCallOptions) => Promise<unknown>>;\n delete: Record<string, (opts: TrackerApiCallOptions) => Promise<unknown>>;\n } {\n return {\n get: this.createMethodProxy('GET'),\n post: this.createMethodProxy('POST'),\n put: this.createMethodProxy('PUT'),\n patch: this.createMethodProxy('PATCH'),\n delete: this.createMethodProxy('DELETE'),\n };\n }\n\n private createMethodProxy(\n method: string,\n ): Record<string, (opts: TrackerApiCallOptions) => Promise<unknown>> {\n const self = this;\n return new Proxy({} as Record<string, (opts: TrackerApiCallOptions) => Promise<unknown>>, {\n get(_, path: string) {\n return (payload: TrackerApiCallOptions) =>\n self.call(method, path, payload, TrackerApi.V3_VERSION);\n },\n });\n }\n\n private call(\n method: string,\n url: string,\n options: TrackerApiCallOptions = {},\n requestVersion: string,\n ): Promise<ApiCallResult> {\n const payload: ApiCallPayload = buildPayload(method, url, options, requestVersion);\n return sendRequest('api.tracker.call', payload) as Promise<ApiCallResult>;\n }\n}\n\nexport const trackerApi = new TrackerApi();\n","import { initBridge, sendRequest } from '../bridge/bridge';\nimport type { ContentSizeUpdateRequest } from './types/ContentSizeUpdateRequest';\nimport type { NavigateRequest } from './types/NavigateRequest';\nimport { AutoResizeManager } from './utils/autoResize';\n\nexport interface HostInitOptions {\n /**\n * Автоматически изменять размер контейнера плагина\n * при изменении содержимого\n * @default true\n */\n autoResize?: boolean;\n}\n\n/**\n * Untyped runtime класс HostApi. Methods, которые возвращают значения,\n * зависящие от SlotContextMap, типизированы как `unknown` или `string`.\n * Type-safety добавляется в публикуемых пакетах через typed wrapper.\n */\nexport class HostApi {\n private autoResizeManager?: AutoResizeManager;\n private slot: string | null = null;\n private service: string | null = null;\n private origin: string | null = null;\n private innerUrl: string | null = null;\n private queryParams: Record<string, string> | null = null;\n\n getTheme(): Promise<unknown> {\n return sendRequest('theme.get');\n }\n\n getLanguage(): Promise<unknown> {\n return sendRequest('language.get');\n }\n\n getUserId(): Promise<unknown> {\n return sendRequest('userId.get');\n }\n\n getIsYateam(): Promise<unknown> {\n return sendRequest('isYateam.get');\n }\n\n getContext(): Promise<unknown> {\n return sendRequest('context.get');\n }\n\n updateContentSize(payload: ContentSizeUpdateRequest): Promise<unknown> {\n return sendRequest('contentSize.update', payload);\n }\n\n notifyReady(): Promise<unknown> {\n return sendRequest('plugin.ready');\n }\n\n close(payload: unknown): Promise<unknown> {\n return sendRequest('plugin.close', payload);\n }\n\n navigate(payload: NavigateRequest): Promise<unknown> {\n return sendRequest('navigate', payload);\n }\n\n init(options: HostInitOptions): void {\n const { autoResize = true } = options;\n\n const searchParams = new URLSearchParams(location.search);\n this.service = searchParams.get('service');\n if (this.service === null) {\n throw new Error('Service is not defined');\n }\n const slot = searchParams.get('slot');\n if (!slot) {\n throw new Error('Slot is not defined');\n }\n const targetOrigin = searchParams.get('parentOrigin');\n if (!targetOrigin) {\n throw new Error('Target origin is not defined');\n }\n const pluginId = searchParams.get('id');\n if (!pluginId) {\n throw new Error('Plugin id is not defined');\n }\n const elementId = searchParams.get('elementId');\n if (!elementId) {\n throw new Error('Element id is not defined');\n }\n const entityId = searchParams.get('entityId');\n const entityMetaRaw = searchParams.get('entityMeta');\n const entityMeta = entityMetaRaw\n ? (JSON.parse(entityMetaRaw) as Record<string, string>)\n : undefined;\n initBridge(pluginId, elementId, slot, entityId, targetOrigin, entityMeta);\n\n this.slot = slot;\n this.origin = targetOrigin;\n\n this.innerUrl = searchParams.get('innerUrl') ?? '';\n const queryParamsRaw = searchParams.get('queryParams');\n this.queryParams = queryParamsRaw ? JSON.parse(decodeURIComponent(queryParamsRaw)) : {};\n\n if (autoResize) {\n this.autoResizeManager = new AutoResizeManager(\n (height) => this.updateContentSize({ height }) as unknown as Promise<void>,\n );\n this.autoResizeManager.enable();\n }\n }\n\n getSlot(): string {\n if (this.slot === null) {\n throw new Error('Plugin not initialized. Call init() first.');\n }\n return this.slot;\n }\n\n getService(): string {\n if (this.service === null) {\n throw new Error('Service not initialized. Call init() first.');\n }\n return this.service;\n }\n\n getOrigin(): string {\n if (this.origin === null) {\n throw new Error('Origin not initialized. Call init() first.');\n }\n return this.origin;\n }\n\n getInnerUrl(): string {\n if (this.innerUrl === null) {\n throw new Error('Plugin not initialized. Call init() first.');\n }\n return this.innerUrl;\n }\n\n getQueryParams(): Record<string, string> {\n if (this.queryParams === null) {\n throw new Error('Plugin not initialized. Call init() first.');\n }\n return this.queryParams;\n }\n\n disableAutoResize(): void {\n this.autoResizeManager?.disable();\n }\n}\n\nexport const hostApi = new HostApi();\n","import type {\n ApiV3DeleteMethods,\n ApiV3GetMethods,\n ApiV3PatchMethods,\n ApiV3PostMethods,\n ApiV3PutMethods,\n} from '@weavix/tracker-api-types';\nimport {\n type TrackerApiCallOptions as BaseCallOptions,\n type TrackerApiInitOptions as BaseInitOptions,\n trackerApi as trackerApiBase,\n} from '@tracker-plugin-sdk/core-shared';\n\nexport type TrackerApiCallOptions = BaseCallOptions;\nexport type TrackerApiInitOptions = BaseInitOptions;\n\ntype ApiResult<M> = {\n [K in keyof M]: M[K] extends (...args: infer A) => Promise<infer R>\n ? (...args: A) => Promise<{ data: R; headers: Record<string, string> }>\n : never;\n};\n\nexport interface TrackerApiV3 {\n get: ApiResult<ApiV3GetMethods>;\n post: ApiResult<ApiV3PostMethods>;\n put: ApiResult<ApiV3PutMethods>;\n patch: ApiResult<ApiV3PatchMethods>;\n delete: ApiResult<ApiV3DeleteMethods>;\n}\n\nexport interface TrackerApi {\n v3: TrackerApiV3;\n}\n\nexport const trackerApi = trackerApiBase as unknown as TrackerApi;\n","import {\n ContentSizeUpdateRequest,\n type HostInitOptions,\n NavigateRequest,\n Theme,\n hostApi as hostApiBase,\n} from '@tracker-plugin-sdk/core-shared';\nimport type { SlotContextMap } from '../common/types/SlotContextMap';\nimport type { PluginClosePayloadMap } from './types/ClosePluginPayload';\n\nexport type { HostInitOptions };\n\n/**\n * Типизированный интерфейс HostApi для публичного API публикуемого core'а.\n */\nexport interface HostApi<TSlot extends keyof SlotContextMap = keyof SlotContextMap> {\n /**\n * Текущая тема хоста\n */\n getTheme(): Promise<Theme>;\n\n /**\n * Текущий язык хоста\n */\n getLanguage(): Promise<string>;\n\n /**\n * Id пользователя\n */\n getUserId(): Promise<string>;\n\n /**\n * Сборка для ятима\n */\n getIsYateam(): Promise<boolean>;\n\n /**\n * Получить текущий контекст, в котором запущен плагин.\n * Тип возвращаемого значения зависит от слота.\n */\n getContext(): Promise<SlotContextMap[TSlot]>;\n\n /**\n * Изменить размер окна, в котором запущен плагин\n */\n updateContentSize(payload: ContentSizeUpdateRequest): Promise<void>;\n\n /**\n * Сообщить, что плагин готов к работе\n */\n notifyReady(): Promise<void>;\n\n /**\n * Сообщить, что плагин закрыт\n */\n close(payload: PluginClosePayloadMap[TSlot]): Promise<void>;\n\n /**\n * Выполнить навигацию в хосте\n */\n navigate(payload: NavigateRequest): Promise<void>;\n\n /**\n * Инициализация плагина\n */\n init(options: HostInitOptions): void;\n\n /**\n * Текущий слот, в котором открыт плагин.\n * Вызов до init() приведёт к ошибке.\n */\n getSlot(): TSlot;\n\n /**\n * Сервис, в котором открылся плагин.\n * Вызов до init() приведёт к ошибке.\n */\n getService(): string;\n\n /**\n * Origin родительского окна (хоста).\n * Вызов до init() приведёт к ошибке.\n */\n getOrigin(): string;\n\n /**\n * Внутренний урл плагина.\n * Вызов до init() приведёт к ошибке.\n */\n getInnerUrl(): string;\n\n /**\n * Query-параметры плагина.\n * Вызов до init() приведёт к ошибке.\n */\n getQueryParams(): Record<string, string>;\n\n /**\n * Выключить автоматическое изменение размера контейнера\n */\n disableAutoResize(): void;\n}\n\nexport const hostApi = hostApiBase as unknown as HostApi;\n","import {\n getHandler as baseGetHandler,\n setHandler as baseSetHandler,\n} from '@tracker-plugin-sdk/core-shared';\nimport type { GetDataResultMap, HandlerFunction, Handlers } from './types';\n\n/**\n * Регистрирует обработчик. Тип возвращаемого значения задаётся слотом (GetDataResultMap).\n */\nexport function setHandler<TSlot extends keyof GetDataResultMap>(\n name: 'getData',\n handler: () => GetDataResultMap[TSlot],\n): void;\nexport function setHandler<TKey extends keyof Handlers>(\n name: TKey,\n handler: HandlerFunction<TKey>,\n): void;\nexport function setHandler(name: string, handler: (...args: unknown[]) => unknown): void {\n baseSetHandler(name, handler);\n}\n\n/**\n * Возвращает обработчик getData. При указании TSlot — () => GetDataResultMap[TSlot].\n */\nexport function getHandler<TSlot extends keyof GetDataResultMap>(\n name: 'getData',\n): (() => GetDataResultMap[TSlot]) | undefined;\nexport function getHandler<TKey extends keyof Handlers>(\n name: TKey,\n): HandlerFunction<TKey> | undefined;\nexport function getHandler(name: string): ((...args: unknown[]) => unknown) | undefined {\n return baseGetHandler(name);\n}\n","import type { LocalizedString } from '@weavix/tracker-api-types';\nimport {\n type LocalizedString as StructuralLocalizedString,\n getLocalizedString as baseGetLocalizedString,\n} from '@tracker-plugin-sdk/core-shared';\n\n// Compile-time проверка совместимости api-types LocalizedString\n// со структурным типом из shared'а. Если api-types когда-то добавят\n// несовместимое поле — здесь будет TS ошибка.\nconst _typeCheck: (value: LocalizedString) => StructuralLocalizedString = (v) => v;\n\n/**\n * Получить локализованную строку на основе языка.\n * Принимает api-types `LocalizedString` (Yandex flavor).\n */\nexport function getLocalizedString(\n value: LocalizedString,\n language: string | undefined,\n fallbackLanguage = 'ru',\n): string {\n return baseGetLocalizedString(value as StructuralLocalizedString, language, fallbackLanguage);\n}\n"],"names":["subscribers","lastValues","on","method","callback","set","cb","err","dispatchHostEvent","message","resetEventBus","handlers","setHandler","name","handler","getHandler","PLUGIN_ID_OR_SLOT_NOT_PROVIDED","PLUGIN_ID_IS_NOT_CORRECT","VALIDATION_ERROR","METHOD_NOT_SUPPORTED","MISSING_REQUIRED_SCOPE","UNKNOWN_ERROR","PluginActionError","code","errorData","PluginBridge","pluginId","elementId","slot","entityId","targetOrigin","entityMeta","payload","options","resolve","reject","messageId","timeoutMs","requestMessage","timeoutId","e","pending","event","typedMessage","data","errorCode","response","bridgeInstance","initBridge","getBridge","sendRequest","CONFIRM_TIMEOUT_MS","Confirm","Toaster","actionIds","serializedActions","action","actionId","result","autoHiding","id","UiApi","uiApi","getField","obj","path","defaultValue","keys","key","getLocalizedString","value","language","fallbackLanguage","lang","fallback","AutoResizeManager","resizeCallback","sendHeight","root","bodyStyles","marginTop","marginBottom","height","error","debouncedSendHeight","buildPayload","url","version","_TrackerApi","self","_","requestVersion","TrackerApi","trackerApi","HostApi","autoResize","searchParams","entityMetaRaw","queryParamsRaw","hostApi","trackerApiBase","hostApiBase","baseSetHandler","baseGetHandler","baseGetLocalizedString"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/events/eventBus.ts","../src/handlers/handlers.ts","../src/bridge/types/ErrorCodes.ts","../src/bridge/types/PluginActionError.ts","../src/bridge/bridge.ts","../src/ui/Confirm.ts","../src/ui/Toaster.ts","../src/ui/uiApi.ts","../src/utils/getField.ts","../src/utils/localization.ts","../src/host/utils/autoResize.ts","../src/host/hostApi.ts"],"sourcesContent":["import type {\n EventMessage,\n HostEventCallback,\n HostEventContract,\n HostEventMethod,\n Unsubscribe,\n} from './types';\n\nconst subscribers = new Map<HostEventMethod, Set<(result: unknown) => void>>();\nconst lastValues = new Map<HostEventMethod, unknown>();\n\n/**\n * Subscribe to a host-pushed event.\n * If a value was already dispatched for this method, the callback is called\n * synchronously with the cached value before returning.\n * @param method - Event method name (e.g. `'theme.changed'`)\n * @param callback - Function called with the typed event payload\n * @returns An `Unsubscribe` function that removes this subscription\n */\nexport function on<M extends HostEventMethod>(\n method: M,\n callback: HostEventCallback<M>,\n): Unsubscribe {\n let set = subscribers.get(method);\n if (!set) {\n set = new Set();\n subscribers.set(method, set);\n }\n\n const cb = callback as (result: unknown) => void;\n set.add(cb);\n\n // Replay last known value to the new subscriber immediately\n if (lastValues.has(method)) {\n try {\n // eslint-disable-next-line callback-return -- sync replay to new subscriber; return value unused\n cb(lastValues.get(method));\n } catch (err) {\n console.error(`[EventBus] Error replaying cached value for \"${method}\":`, err);\n }\n }\n\n return () => {\n set.delete(cb);\n if (set.size === 0) {\n subscribers.delete(method);\n }\n };\n}\n\n/**\n * Dispatch an incoming event message to all registered subscribers.\n * Caches the value so late subscribers receive it on subscription.\n */\nexport function dispatchHostEvent(message: EventMessage): void {\n const method = message.method as HostEventMethod;\n lastValues.set(method, message.result);\n\n const set = subscribers.get(method);\n if (!set) {\n return;\n }\n for (const cb of set) {\n try {\n // eslint-disable-next-line callback-return -- notify subscribers; return value unused\n cb(message.result);\n } catch (err) {\n console.error(`[EventBus] Error in subscriber for \"${message.method}\":`, err);\n }\n }\n}\n\n/**\n * Clears all cached last values and subscribers from the event bus.\n * Intended for use in tests to prevent state leaking between test cases.\n */\nexport function resetEventBus(): void {\n lastValues.clear();\n subscribers.clear();\n}\n\n/**\n * Public event emitter — subscribe to host-pushed events.\n * Only events defined in `HostEventContract` are accepted.\n * @example\n * ```ts\n * import { eventBus } from '@yandex-data-ui/tracker-plugin-sdk-core';\n *\n * const unsubscribe = eventBus.on('theme.changed', (theme) => {\n * console.log('Theme:', theme);\n * });\n *\n * unsubscribe();\n * ```\n */\nexport const eventBus = {\n on<M extends HostEventMethod>(\n method: M,\n callback: (result: HostEventContract[M]['result']) => void,\n ): Unsubscribe {\n return on(method, callback);\n },\n};\n","type AnyHandler = (...args: unknown[]) => unknown;\n\nconst handlers: Record<string, AnyHandler> = {};\n\n/**\n * Регистрирует handler по имени. Тип не проверяется на runtime'е;\n * type-safety обеспечивается typed wrapper'ом в публикуемых пакетах.\n */\nexport function setHandler(name: string, handler: AnyHandler): void {\n handlers[name] = handler;\n}\n\n/**\n * Возвращает зарегистрированный handler по имени, или undefined.\n */\nexport function getHandler(name: string): AnyHandler | undefined {\n return handlers[name];\n}\n","/** Код ошибки: не переданы обязательные параметры инициализации плагина (pluginId или slot). */\nexport const PLUGIN_ID_OR_SLOT_NOT_PROVIDED = 1000;\n\n/** Код ошибки: переданный pluginId не совпадает с зарегистрированным плагином или неверного формата. */\nexport const PLUGIN_ID_IS_NOT_CORRECT = 1001;\n\n/** Код ошибки: данные запроса не прошли валидацию (неверный формат, обязательные поля отсутствуют и т.п.). */\nexport const VALIDATION_ERROR = 1002;\n\n/** Код ошибки: запрошенный метод API не поддерживается в данной конфигурации или версии. */\nexport const METHOD_NOT_SUPPORTED = 1003;\n\n/** Код ошибки: у плагина нет необходимого scope (разрешения) для выполнения операции. */\nexport const MISSING_REQUIRED_SCOPE = 1004;\n\n/** Код ошибки: непредвиденная или неклассифицированная ошибка. */\nexport const UNKNOWN_ERROR = 6666;\n","export class PluginActionError extends Error {\n readonly code: number;\n\n readonly errorData?: unknown;\n\n constructor(code: number, message: string, errorData?: unknown) {\n super(message);\n this.name = 'PluginActionError';\n this.code = code;\n this.errorData = errorData;\n }\n}\n","import { dispatchHostEvent } from '../events/eventBus';\nimport type { EventMessage } from '../events/types';\nimport { getHandler } from '../handlers/handlers';\nimport { UNKNOWN_ERROR } from './types/ErrorCodes';\nimport type { BaseMessage } from './types/BaseMessage';\nimport { PluginActionError } from './types/PluginActionError';\n\ntype RequestOptions = { timeout?: number };\n\ntype PendingRequest = {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeoutId: ReturnType<typeof setTimeout>;\n};\n\ntype RawRequestMessage = BaseMessage & {\n method: string;\n payload: unknown;\n};\n\ntype RawResponseMessage = BaseMessage & {\n type: 'response';\n result: unknown;\n error?: string;\n errorCode?: number;\n errorData?: unknown;\n};\n\ntype RawIncomingRequestMessage = BaseMessage & {\n type: 'request';\n result: { method: string; payload: unknown };\n error?: string;\n};\n\nclass PluginBridge {\n private pluginId: string;\n private elementId: string;\n private targetOrigin: string;\n private slot: string;\n private entityId: string | null;\n private entityMeta: Record<string, string> | undefined;\n private pendingRequests: Map<string, PendingRequest> = new Map();\n private messageListener: ((event: MessageEvent) => void) | null = null;\n private readonly requestTimeout = 10000;\n\n constructor(\n pluginId: string,\n elementId: string,\n slot: string,\n entityId: string | null,\n targetOrigin: string,\n entityMeta?: Record<string, string>,\n ) {\n this.pluginId = pluginId;\n this.elementId = elementId;\n this.targetOrigin = targetOrigin;\n this.entityId = entityId;\n this.entityMeta = entityMeta;\n this.slot = slot;\n this.initListener();\n }\n\n request(method: string, payload?: unknown, options?: RequestOptions): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const messageId = this.generateMessageId();\n const timeoutMs = options?.timeout ?? this.requestTimeout;\n\n const requestMessage: RawRequestMessage = {\n messageId,\n method,\n payload,\n };\n\n const timeoutId = setTimeout(() => {\n const pending = this.pendingRequests.get(messageId);\n if (pending) {\n this.pendingRequests.delete(messageId);\n reject(new Error(`Request timeout: ${method} exceeded ${timeoutMs}ms`));\n }\n }, timeoutMs);\n\n this.pendingRequests.set(messageId, { resolve, reject, timeoutId });\n\n try {\n this.send(requestMessage);\n } catch (e) {\n clearTimeout(timeoutId);\n this.pendingRequests.delete(messageId);\n reject(e as Error);\n }\n });\n }\n\n send<T = unknown>(message: T): void {\n window.parent.postMessage(\n {\n pluginId: this.pluginId,\n elementId: this.elementId,\n slot: this.slot,\n entityId: this.entityId,\n entityMeta: this.entityMeta,\n ...message,\n },\n this.targetOrigin,\n );\n }\n\n destroy(): void {\n if (this.messageListener) {\n window.removeEventListener('message', this.messageListener);\n this.messageListener = null;\n }\n\n this.pendingRequests.forEach((pending) => {\n clearTimeout(pending.timeoutId);\n });\n this.pendingRequests.clear();\n }\n\n private initListener(): void {\n this.messageListener = async (event: MessageEvent) => {\n if (event.origin !== this.targetOrigin) {\n console.info(\n '[Bridge] Ignored message from origin:',\n event.origin,\n '(expected:',\n this.targetOrigin,\n ')',\n );\n return;\n }\n\n const message = event.data;\n console.info('[Bridge] Received message:', message);\n\n if (message.type === 'event') {\n console.info('[Bridge] Dispatching host event:', message.method, message.result);\n dispatchHostEvent(message as EventMessage);\n return;\n }\n\n console.info('[Bridge] Received message:', event.data);\n\n if (!message.messageId) {\n console.info('[Bridge] Ignored message without messageId:', message);\n return;\n }\n\n const typedMessage = message as RawResponseMessage | RawIncomingRequestMessage;\n const pending = this.pendingRequests.get(typedMessage.messageId);\n\n if (!pending) {\n if (typedMessage.type === 'request') {\n const incoming = typedMessage as RawIncomingRequestMessage;\n const method = incoming.result.method;\n const handler = getHandler(method);\n\n if (!handler) {\n this.send({\n messageId: typedMessage.messageId,\n type: 'response',\n result: null,\n errorCode: UNKNOWN_ERROR,\n error: `No handler for method ${method}`,\n });\n return;\n }\n\n try {\n const data = handler();\n this.send({\n messageId: typedMessage.messageId,\n payload: data,\n method: 'responseData',\n type: 'response',\n });\n } catch (e) {\n const err = e instanceof Error ? e : new Error(String(e));\n const errorCode =\n err instanceof PluginActionError ? err.code : UNKNOWN_ERROR;\n this.send({\n messageId: typedMessage.messageId,\n type: 'response',\n result: null,\n errorCode,\n error: err.message,\n });\n }\n }\n\n return;\n }\n\n clearTimeout(pending.timeoutId);\n this.pendingRequests.delete(typedMessage.messageId);\n\n const response = typedMessage as RawResponseMessage;\n if (response.type === 'response' && response.errorCode) {\n pending.reject(\n new PluginActionError(\n response.errorCode,\n response.error ?? 'Unknown error',\n response.errorData,\n ),\n );\n } else {\n pending.resolve(response.result);\n }\n };\n\n window.addEventListener('message', this.messageListener);\n }\n\n private generateMessageId(): string {\n return crypto.randomUUID();\n }\n}\n\nlet bridgeInstance: PluginBridge | null = null;\n\nexport function initBridge(\n pluginId: string,\n elementId: string,\n slot: string,\n entityId: string | null,\n targetOrigin: string,\n entityMeta?: Record<string, string>,\n): PluginBridge {\n if (bridgeInstance) {\n bridgeInstance.destroy();\n }\n bridgeInstance = new PluginBridge(\n pluginId,\n elementId,\n slot,\n entityId,\n targetOrigin,\n entityMeta,\n );\n return bridgeInstance;\n}\n\nfunction getBridge(): PluginBridge {\n if (!bridgeInstance) {\n throw new Error('Bridge not initialized. Call initBridge first.');\n }\n return bridgeInstance;\n}\n\nexport function sendRequest(\n method: string,\n payload?: unknown,\n options?: RequestOptions,\n): Promise<unknown> {\n return getBridge().request(method, payload, options);\n}\n","import { sendRequest } from '../bridge/bridge';\n\nexport type ConfirmOptions = {\n title?: string;\n message: string;\n textButtonApply?: string;\n textButtonCancel?: string;\n theme?: 'normal' | 'danger';\n};\n\nexport type ConfirmResult = { confirmed: boolean };\n\nconst CONFIRM_TIMEOUT_MS = 300_000;\n\nexport class Confirm {\n show(options: ConfirmOptions): Promise<ConfirmResult> {\n return sendRequest('confirm.show', options, {\n timeout: CONFIRM_TIMEOUT_MS,\n }) as Promise<ConfirmResult>;\n }\n}\n","import { sendRequest } from '../bridge/bridge';\nimport { on } from '../events/eventBus';\n\nexport type ToastAction = {\n label: string;\n onClick: () => void;\n};\n\nexport type ToastOptions = {\n name?: string;\n title: string;\n content?: string;\n theme?: 'success' | 'danger' | 'warning' | 'info';\n autoHiding?: number;\n isClosable?: boolean;\n actions?: ToastAction[];\n};\n\nexport class Toaster {\n private callbackMap = new Map<string, () => void>();\n private toastActionIds = new Map<string, string[]>();\n private eventSubscribed = false;\n\n async add(options: ToastOptions): Promise<{ name: string }> {\n this.ensureEventSubscription();\n\n const actionIds: string[] = [];\n const serializedActions = options.actions?.map((action) => {\n const actionId = crypto.randomUUID();\n\n this.callbackMap.set(actionId, action.onClick);\n actionIds.push(actionId);\n\n return { id: actionId, label: action.label };\n });\n\n const result = (await sendRequest('toast.add', {\n name: options.name,\n title: options.title,\n content: options.content,\n theme: options.theme,\n autoHiding: options.autoHiding,\n isClosable: options.isClosable,\n actions: serializedActions,\n })) as { name: string };\n\n if (actionIds.length > 0) {\n this.toastActionIds.set(result.name, actionIds);\n }\n\n const autoHiding = options.autoHiding ?? 5000;\n\n setTimeout(() => this.cleanupCallbacksForToast(result.name), autoHiding + 1000);\n\n return result;\n }\n\n private ensureEventSubscription() {\n if (this.eventSubscribed) return;\n this.eventSubscribed = true;\n\n on('toast.action.clicked', ({ name, actionId }) => {\n const callback = this.callbackMap.get(actionId);\n\n // eslint-disable-next-line callback-return -- optional void callback for side effects\n callback?.();\n this.cleanupCallbacksForToast(name);\n });\n }\n\n private cleanupCallbacksForToast(name: string) {\n const actionIds = this.toastActionIds.get(name);\n\n if (actionIds) {\n for (const id of actionIds) {\n this.callbackMap.delete(id);\n }\n this.toastActionIds.delete(name);\n }\n }\n}\n","import { sendRequest } from '../bridge/bridge';\nimport type { NavigateRequest } from '../host/types/NavigateRequest';\nimport { Confirm } from './Confirm';\nimport { Toaster } from './Toaster';\n\nclass UiApi {\n readonly toaster = new Toaster();\n readonly confirm = new Confirm();\n\n navigate(payload: NavigateRequest): Promise<unknown> {\n return sendRequest('navigate', payload);\n }\n}\n\nexport const uiApi = new UiApi();\n","/**\n * Извлекает значение из объекта по точечному пути (dot notation).\n * Предназначена для работы с полями типа Record<string, unknown>, например со значениями полей задачи (Issue).\n *\n * Поддерживает вложенные пути: `'priority.display'`, `'assignee.display.ru'` и т.д.\n * Если любой сегмент пути отсутствует или не является объектом — возвращается defaultValue или undefined.\n * @param obj - Объект с произвольной структурой (например, issue или issue.values)\n * @param path - Путь к полю через точку, например `'priority.display'` или `'summary'`\n * @param defaultValue - Значение по умолчанию, если путь не найден\n * @returns Значение по пути, defaultValue или undefined\n * @example\n * ```ts\n * // Поле верхнего уровня\n * getField(issue, 'key'); // 'QUEUE-123'\n *\n * // Вложенное поле (например, приоритет с display)\n * getField(issue, 'priority.display'); // 'много' | undefined\n *\n * // С типизацией и значением по умолчанию\n * const name = getField<string>(issue, 'summary', 'Без названия');\n *\n * // Элемент массива по индексу (массивы — объекты с числовыми ключами)\n * getField(tags, '0'); // первый элемент\n * ```\n */\nexport function getField<T = unknown>(\n obj: Record<string, unknown>,\n path: string,\n defaultValue?: T,\n): T | undefined {\n if (path === '') {\n return defaultValue;\n }\n\n const keys = path.split('.');\n let result: unknown = obj;\n\n for (const key of keys) {\n if (\n result !== null &&\n typeof result === 'object' &&\n Object.prototype.hasOwnProperty.call(result, key)\n ) {\n result = (result as Record<string, unknown>)[key];\n } else {\n return defaultValue;\n }\n }\n\n return (result as T | undefined) ?? defaultValue;\n}\n","/**\n * Структурный shape `LocalizedString` — общая база, к которой структурно\n * совместимы api-types `LocalizedString` обоих flavors. Реальная функция\n * `getLocalizedString` читает только ключи `ru` и `en`, поэтому более\n * узкие api-types-варианты (с дополнительными ключами) совместимы.\n */\nexport type LocalizedString = string | { ru?: string; en?: string };\n\n/**\n * Получить локализованную строку на основе языка\n * @param value - Локализованная строка\n * @param language - Код языка ('ru' или 'en')\n * @param fallbackLanguage - Резервный язык (по умолчанию 'ru')\n */\nexport function getLocalizedString(\n value: LocalizedString,\n language: string | undefined,\n fallbackLanguage = 'ru',\n): string {\n if (typeof value === 'string') {\n return value;\n }\n\n const lang = (language ?? fallbackLanguage).toLowerCase() as 'ru' | 'en';\n const fallback = fallbackLanguage.toLowerCase() as 'ru' | 'en';\n\n return value[lang] || value[fallback] || value.ru || value.en || '';\n}\n","export type ResizeCallback = (height: number) => Promise<void> | void;\n\nexport class AutoResizeManager {\n private resizeCallback: ResizeCallback;\n private resizeObserver?: ResizeObserver;\n private resizeTimeout?: ReturnType<typeof setTimeout>;\n private lastHeight = 0;\n private isUpdating = false;\n private consecutiveSmallIncreases = 0;\n private readonly MAX_CONSECUTIVE_SMALL_INCREASES = 5;\n private readonly SMALL_INCREASE_THRESHOLD_PX = 10;\n\n constructor(resizeCallback: ResizeCallback) {\n this.resizeCallback = resizeCallback;\n }\n\n enable(): void {\n if (!document.body) {\n console.error('[AutoResize] document.body does not exist yet');\n return;\n }\n\n const sendHeight = async () => {\n if (this.isUpdating) {\n return;\n }\n\n // Use body.scrollHeight as primary source in iframe\n // documentElement.scrollHeight can cache old values\n const root = document.getElementById('root');\n const bodyStyles = window.getComputedStyle(document.body);\n const marginTop = parseInt(bodyStyles.marginTop, 10) || 0;\n const marginBottom = parseInt(bodyStyles.marginBottom, 10) || 0;\n\n const measuredHeight = Math.max(\n document.body.scrollHeight,\n document.body.offsetHeight,\n root ? root.scrollHeight + marginTop + marginBottom : 0,\n );\n\n // Add small buffer to compensate for rounding errors\n const height = measuredHeight + 4;\n\n if (height !== this.lastHeight) {\n // Detect infinite loop: if height keeps increasing by small amounts\n // This prevents issues with elements using viewport units (vh, %)\n if (height > this.lastHeight) {\n const increase = height - this.lastHeight;\n\n // Only count small increases as potential loop indicators\n // Large increases are normal (user adding content)\n if (increase <= this.SMALL_INCREASE_THRESHOLD_PX) {\n this.consecutiveSmallIncreases++;\n\n if (this.consecutiveSmallIncreases > this.MAX_CONSECUTIVE_SMALL_INCREASES) {\n console.warn(\n '[AutoResize] Infinite loop detected. Stopping auto-resize. ' +\n 'This may be caused by elements with viewport-relative units (vh, %).',\n );\n this.disable();\n return;\n }\n } else {\n // Large increase - reset counter (normal content addition)\n this.consecutiveSmallIncreases = 0;\n }\n } else {\n // Height decreased - reset counter\n this.consecutiveSmallIncreases = 0;\n }\n\n this.isUpdating = true;\n this.lastHeight = height;\n\n try {\n await this.resizeCallback(height);\n } catch (error) {\n console.error('[AutoResize] Failed to update content size:', error);\n } finally {\n this.isUpdating = false;\n }\n }\n };\n\n const debouncedSendHeight = () => {\n clearTimeout(this.resizeTimeout);\n this.resizeTimeout = setTimeout(sendHeight, 100);\n };\n\n this.resizeObserver = new ResizeObserver(debouncedSendHeight);\n this.resizeObserver.observe(document.body);\n\n // Send initial height\n sendHeight();\n }\n\n disable(): void {\n this.resizeObserver?.disconnect();\n clearTimeout(this.resizeTimeout);\n this.isUpdating = false;\n this.consecutiveSmallIncreases = 0;\n }\n}\n","import { initBridge, sendRequest } from '../bridge/bridge';\nimport type { ContentSizeUpdateRequest } from './types/ContentSizeUpdateRequest';\nimport { AutoResizeManager } from './utils/autoResize';\n\nexport interface HostInitOptions {\n /**\n * Автоматически изменять размер контейнера плагина\n * при изменении содержимого\n * @default true\n */\n autoResize?: boolean;\n}\n\n/**\n * Untyped runtime класс HostApi. Methods, которые возвращают значения,\n * зависящие от SlotContextMap, типизированы как `unknown` или `string`.\n * Type-safety добавляется в публикуемых пакетах через typed wrapper.\n */\nexport type ContextLevel = 'basic' | 'full';\n\nexport type BasicContext = {\n entityId: string;\n entityMeta?: Record<string, string>;\n};\n\nexport class HostApi {\n private autoResizeManager?: AutoResizeManager;\n private slot: string | null = null;\n private service: string | null = null;\n private origin: string | null = null;\n private innerUrl: string | null = null;\n private queryParams: Record<string, string> | null = null;\n private entityId: string | null = null;\n private entityMeta: Record<string, string> | undefined = undefined;\n private contextLevel: ContextLevel = 'full';\n\n getTheme(): Promise<unknown> {\n return sendRequest('theme.get');\n }\n\n getLanguage(): Promise<unknown> {\n return sendRequest('language.get');\n }\n\n getUserId(): Promise<unknown> {\n return sendRequest('userId.get');\n }\n\n getIsYateam(): Promise<unknown> {\n return sendRequest('isYateam.get');\n }\n\n getContext(): Promise<unknown> {\n return sendRequest('context.get');\n }\n\n updateContentSize(payload: ContentSizeUpdateRequest): Promise<unknown> {\n return sendRequest('contentSize.update', payload);\n }\n\n notifyReady(): Promise<unknown> {\n return sendRequest('plugin.ready');\n }\n\n close(payload: unknown): Promise<unknown> {\n return sendRequest('plugin.close', payload);\n }\n\n init(options: HostInitOptions): void {\n const { autoResize = true } = options;\n\n const searchParams = new URLSearchParams(location.search);\n this.service = searchParams.get('service');\n if (this.service === null) {\n throw new Error(\n 'Missing required URL parameter \"service\". A plugin cannot run outside the host application context. ' +\n 'Open the plugin from the host application.',\n );\n }\n const slot = searchParams.get('slot');\n if (!slot) {\n throw new Error('Slot is not defined');\n }\n const targetOrigin = searchParams.get('parentOrigin');\n if (!targetOrigin) {\n throw new Error('Target origin is not defined');\n }\n const pluginId = searchParams.get('id');\n if (!pluginId) {\n throw new Error('Plugin id is not defined');\n }\n const elementId = searchParams.get('elementId');\n if (!elementId) {\n throw new Error('Element id is not defined');\n }\n const entityId = searchParams.get('entityId');\n const entityMetaRaw = searchParams.get('entityMeta');\n const entityMeta = entityMetaRaw\n ? (JSON.parse(entityMetaRaw) as Record<string, string>)\n : undefined;\n initBridge(pluginId, elementId, slot, entityId, targetOrigin, entityMeta);\n\n this.slot = slot;\n this.origin = targetOrigin;\n this.entityId = entityId;\n this.entityMeta = entityMeta;\n\n const contextLevelParam = searchParams.get('contextLevel');\n this.contextLevel = contextLevelParam === 'basic' ? 'basic' : 'full';\n\n this.innerUrl = searchParams.get('innerUrl') ?? '';\n const queryParamsRaw = searchParams.get('queryParams');\n this.queryParams = queryParamsRaw ? JSON.parse(decodeURIComponent(queryParamsRaw)) : {};\n\n if (autoResize) {\n this.autoResizeManager = new AutoResizeManager(\n (height) => this.updateContentSize({ height }) as unknown as Promise<void>,\n );\n this.autoResizeManager.enable();\n }\n }\n\n getSlot(): string {\n if (this.slot === null) {\n throw new Error('Plugin not initialized. Call init() first.');\n }\n return this.slot;\n }\n\n getService(): string {\n if (this.service === null) {\n throw new Error('Service not initialized. Call init() first.');\n }\n return this.service;\n }\n\n getOrigin(): string {\n if (this.origin === null) {\n throw new Error('Origin not initialized. Call init() first.');\n }\n return this.origin;\n }\n\n getInnerUrl(): string {\n if (this.innerUrl === null) {\n throw new Error('Plugin not initialized. Call init() first.');\n }\n return this.innerUrl;\n }\n\n getQueryParams(): Record<string, string> {\n if (this.queryParams === null) {\n throw new Error('Plugin not initialized. Call init() first.');\n }\n return this.queryParams;\n }\n\n getEntityId(): string | null {\n return this.entityId;\n }\n\n getEntityMeta(): Record<string, string> | undefined {\n return this.entityMeta;\n }\n\n getContextLevel(): ContextLevel {\n return this.contextLevel;\n }\n\n disableAutoResize(): void {\n this.autoResizeManager?.disable();\n }\n}\n\nexport const hostApi = new HostApi();\n"],"names":["subscribers","lastValues","on","method","callback","set","cb","err","dispatchHostEvent","message","resetEventBus","eventBus","handlers","setHandler","name","handler","getHandler","PLUGIN_ID_OR_SLOT_NOT_PROVIDED","PLUGIN_ID_IS_NOT_CORRECT","VALIDATION_ERROR","METHOD_NOT_SUPPORTED","MISSING_REQUIRED_SCOPE","UNKNOWN_ERROR","PluginActionError","code","errorData","PluginBridge","pluginId","elementId","slot","entityId","targetOrigin","entityMeta","payload","options","resolve","reject","messageId","timeoutMs","requestMessage","timeoutId","e","pending","event","typedMessage","data","errorCode","response","bridgeInstance","initBridge","getBridge","sendRequest","CONFIRM_TIMEOUT_MS","Confirm","Toaster","actionIds","serializedActions","action","actionId","result","autoHiding","id","UiApi","uiApi","getField","obj","path","defaultValue","keys","key","getLocalizedString","value","language","fallbackLanguage","lang","fallback","AutoResizeManager","resizeCallback","sendHeight","root","bodyStyles","marginTop","marginBottom","height","error","debouncedSendHeight","HostApi","autoResize","searchParams","entityMetaRaw","contextLevelParam","queryParamsRaw","hostApi"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type ConfirmOptions = {
|
|
2
|
+
title?: string;
|
|
3
|
+
message: string;
|
|
4
|
+
textButtonApply?: string;
|
|
5
|
+
textButtonCancel?: string;
|
|
6
|
+
theme?: 'normal' | 'danger';
|
|
7
|
+
};
|
|
8
|
+
export type ConfirmResult = {
|
|
9
|
+
confirmed: boolean;
|
|
10
|
+
};
|
|
11
|
+
export declare class Confirm {
|
|
12
|
+
show(options: ConfirmOptions): Promise<ConfirmResult>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=Confirm.d.ts.map
|