@weavix/tracker-core 0.0.1

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 ADDED
@@ -0,0 +1,3 @@
1
+ # @weavix/tracker-core
2
+
3
+ Общие TypeScript-типы для контекстов слотов плагина Tracker.
@@ -0,0 +1,856 @@
1
+ import { BaseMessage } from '@weavix/sdk-core';
2
+ import { ContentSizeUpdateRequest } from '@weavix/sdk-core';
3
+ import { ContextLevel } from '@weavix/sdk-core';
4
+ import { HostInitOptions } from '@weavix/sdk-core';
5
+ import { NavigateRequest } from '@weavix/sdk-core';
6
+ import { Theme } from '@weavix/sdk-core';
7
+ import { UiContract } from '@weavix/sdk-core';
8
+
9
+ export declare type ApiCallPayload = {
10
+ version: string;
11
+ method: string;
12
+ url: string;
13
+ pathParams: Record<string, string>;
14
+ queryParams: Record<string, unknown>;
15
+ bodyParams: Record<string, unknown>;
16
+ file?: File;
17
+ };
18
+
19
+ export declare type ApiCallResult = {
20
+ data: unknown;
21
+ headers: Record<string, string>;
22
+ };
23
+
24
+ export declare type ApiContract = {
25
+ 'api.tracker.call': {
26
+ payload: ApiCallPayload;
27
+ result: ApiCallResult;
28
+ };
29
+ };
30
+
31
+ export declare type Attachment = {
32
+ /** Format: uri */
33
+ self: string;
34
+ id: string;
35
+ name: string;
36
+ /** Format: uri */
37
+ content: string;
38
+ /** Format: uri */
39
+ thumbnail?: string | null;
40
+ createdBy: UserReferenceV2;
41
+ createdAt: DateTime;
42
+ mimetype: string;
43
+ /** Format: int64 */
44
+ size: number;
45
+ metadata: {
46
+ [key: string]: string;
47
+ };
48
+ commentId?: ObjectId;
49
+ /** @enum {string|null} */
50
+ status?: 'UPLOADING' | 'CHECK' | 'READY' | 'INFECTED' | 'ERROR' | null;
51
+ checkMessage?: LocalizedString;
52
+ downloadable?: boolean | null;
53
+ };
54
+
55
+ export declare type AttachmentViewerActionClosePayload = {
56
+ attachments: Attachment[];
57
+ };
58
+
59
+ export declare type AttachmentViewerActionSlotContext = {
60
+ attachmentBlob: Blob;
61
+ meta: {
62
+ id: string;
63
+ url: string;
64
+ date: string;
65
+ size: number;
66
+ mimetype: string;
67
+ };
68
+ };
69
+
70
+ export declare type BasicWebhookAuthContext = Omit<WebhookAuthContext, 'type'> & {
71
+ login?: string;
72
+ password?: string | null;
73
+ type?: string;
74
+ } & {
75
+ type: 'basic';
76
+ } & {
77
+ type: 'basic';
78
+ };
79
+
80
+ export declare type BoardTabSlotContext = {
81
+ id: number;
82
+ name: string;
83
+ boardType: string;
84
+ backlogAvailable: boolean;
85
+ sprintsAvailable: boolean;
86
+ projectId?: number;
87
+ activeSprint?: {
88
+ id: number;
89
+ name: string;
90
+ startDate: string;
91
+ endDate: string;
92
+ status: string;
93
+ };
94
+ };
95
+
96
+ export declare type ClosePluginPayload<TSlot extends keyof SlotContextMap> = PluginClosePayloadMap[TSlot];
97
+
98
+ export declare type DateTime = string;
99
+
100
+ export declare type Direction = 'INWARD' | 'OUTWARD';
101
+
102
+ export declare type EntityLink = {
103
+ id: Record<string, unknown>;
104
+ /** Format: uri */
105
+ self: string;
106
+ };
107
+
108
+ /**
109
+ * Маппинг trigger-слотов на тип возвращаемого значения getData.
110
+ */
111
+ export declare type GetDataResultMap = {
112
+ 'trigger.create.action': TriggerActionData;
113
+ 'trigger.edit.action': TriggerActionData;
114
+ };
115
+
116
+ /**
117
+ * Возвращает обработчик getData. При указании TSlot — () => GetDataResultMap[TSlot].
118
+ */
119
+ export declare function getHandler<TSlot extends keyof GetDataResultMap>(name: 'getData'): (() => GetDataResultMap[TSlot]) | undefined;
120
+
121
+ export declare function getHandler<TKey extends keyof Handlers>(name: TKey): HandlerFunction<TKey> | undefined;
122
+
123
+ /**
124
+ * Получить локализованную строку на основе языка.
125
+ * Принимает `LocalizedString` из @weavix/tracker-core.
126
+ */
127
+ export declare function getLocalizedString(value: LocalizedString, language: string | undefined, fallbackLanguage?: string): string;
128
+
129
+ export declare type GoalSlotContext = MetaEntityV2 & {
130
+ progress: {
131
+ closed: number;
132
+ total: number;
133
+ };
134
+ };
135
+
136
+ export declare type HandlerFunction<TKey extends keyof Handlers> = Handlers[TKey];
137
+
138
+ /**
139
+ * Обработчики, которые плагин регистрирует для ответов на запросы хоста.
140
+ * - getData — общий метод получения данных; тип зависит от слота (GetDataResultMap).
141
+ */
142
+ export declare type Handlers = {
143
+ getData: () => GetDataResultMap[keyof GetDataResultMap];
144
+ };
145
+
146
+ /**
147
+ * Типизированный интерфейс HostApi для публичного API публикуемого core'а.
148
+ */
149
+ export declare interface HostApi<TSlot extends keyof SlotContextMap = keyof SlotContextMap> {
150
+ /**
151
+ * Текущая тема хоста
152
+ */
153
+ getTheme(): Promise<Theme>;
154
+ /**
155
+ * Текущий язык хоста
156
+ */
157
+ getLanguage(): Promise<string>;
158
+ /**
159
+ * Id пользователя
160
+ */
161
+ getUserId(): Promise<string>;
162
+ /**
163
+ * Сборка для ятима
164
+ */
165
+ getIsYateam(): Promise<boolean>;
166
+ /**
167
+ * Получить текущий контекст, в котором запущен плагин.
168
+ * Тип возвращаемого значения зависит от слота.
169
+ */
170
+ getContext(): Promise<SlotContextMap[TSlot]>;
171
+ /**
172
+ * Изменить размер окна, в котором запущен плагин
173
+ */
174
+ updateContentSize(payload: ContentSizeUpdateRequest): Promise<void>;
175
+ /**
176
+ * Сообщить, что плагин готов к работе
177
+ */
178
+ notifyReady(): Promise<void>;
179
+ /**
180
+ * Сообщить, что плагин закрыт
181
+ */
182
+ close(payload: PluginClosePayloadMap[TSlot]): Promise<void>;
183
+ /**
184
+ * Инициализация плагина
185
+ */
186
+ init(options: HostInitOptions): void;
187
+ /**
188
+ * Текущий слот, в котором открыт плагин.
189
+ * Вызов до init() приведёт к ошибке.
190
+ */
191
+ getSlot(): TSlot;
192
+ /**
193
+ * Сервис, в котором открылся плагин.
194
+ * Вызов до init() приведёт к ошибке.
195
+ */
196
+ getService(): string;
197
+ /**
198
+ * Origin родительского окна (хоста).
199
+ * Вызов до init() приведёт к ошибке.
200
+ */
201
+ getOrigin(): string;
202
+ /**
203
+ * Внутренний урл плагина.
204
+ * Вызов до init() приведёт к ошибке.
205
+ */
206
+ getInnerUrl(): string;
207
+ /**
208
+ * Query-параметры плагина.
209
+ * Вызов до init() приведёт к ошибке.
210
+ */
211
+ getQueryParams(): Record<string, string>;
212
+ /**
213
+ * Идентификатор сущности, переданный хостом в параметрах iframe.
214
+ * Доступен сразу после init() без postMessage-запроса.
215
+ */
216
+ getEntityId(): string | null;
217
+ /**
218
+ * Метаданные сущности, переданные хостом в параметрах iframe.
219
+ * Доступны сразу после init() без postMessage-запроса.
220
+ */
221
+ getEntityMeta(): Record<string, string> | undefined;
222
+ /**
223
+ * Уровень контекста, объявленный в манифесте плагина.
224
+ * 'basic' — только entityId, 'full' — полный контекст слота.
225
+ */
226
+ getContextLevel(): ContextLevel;
227
+ /**
228
+ * Выключить автоматическое изменение размера контейнера
229
+ */
230
+ disableAutoResize(): void;
231
+ }
232
+
233
+ export declare const hostApi: HostApi;
234
+
235
+ export declare type HostContract<TSlot extends keyof SlotContextMap = keyof SlotContextMap> = {
236
+ 'theme.get': {
237
+ payload: never;
238
+ result: Theme;
239
+ };
240
+ 'language.get': {
241
+ payload: never;
242
+ result: string;
243
+ };
244
+ 'userId.get': {
245
+ payload: never;
246
+ result: string;
247
+ };
248
+ 'isYateam.get': {
249
+ payload: never;
250
+ result: boolean;
251
+ };
252
+ 'contentSize.update': {
253
+ payload: ContentSizeUpdateRequest;
254
+ result: void;
255
+ };
256
+ 'context.get': {
257
+ payload: never;
258
+ result: SlotContextMap[TSlot];
259
+ };
260
+ 'plugin.ready': {
261
+ payload: never;
262
+ result: void;
263
+ };
264
+ 'plugin.close': {
265
+ payload: PluginClosePayloadMap[TSlot];
266
+ result: void;
267
+ };
268
+ navigate: {
269
+ payload: NavigateRequest;
270
+ result: void;
271
+ };
272
+ };
273
+
274
+ export declare type HttpMethod = 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'OPTIONS' | 'LINK' | 'UNLINK';
275
+
276
+ export declare type Issue = {
277
+ expand: string;
278
+ embed: string;
279
+ /** Format: uri */
280
+ self: string;
281
+ id: string;
282
+ key: string;
283
+ /** Format: int64 */
284
+ version: number;
285
+ values: {
286
+ [key: string]: Record<string, unknown>;
287
+ };
288
+ attachments?: EntityLink[];
289
+ comments?: EntityLink[];
290
+ links?: {
291
+ /** Format: uri */
292
+ self: string;
293
+ id: string;
294
+ type: IssueLinkType;
295
+ direction: Direction;
296
+ object: Reference;
297
+ display: LocalizedString;
298
+ }[];
299
+ localLinkRefs?: {
300
+ /** Format: uri */
301
+ self: string;
302
+ id: string;
303
+ relationship: Relationship;
304
+ issueId: ObjectId;
305
+ }[];
306
+ remotelinks?: Reference[];
307
+ transitions?: EntityLink[];
308
+ permissions?: {
309
+ /** Format: uri */
310
+ self: string;
311
+ /** Format: int64 */
312
+ version?: number | null;
313
+ create?: {
314
+ /** Format: uri */
315
+ self: string;
316
+ users?: {
317
+ /** Format: uri */
318
+ self: string;
319
+ id: string;
320
+ /** Format: int64 */
321
+ version?: number | null;
322
+ key?: string | null;
323
+ display: LocalizedString;
324
+ department?: Reference;
325
+ cloudUid?: string | null;
326
+ /** Format: int64 */
327
+ passportUid?: number | null;
328
+ }[];
329
+ groups?: Reference[];
330
+ roles?: Reference[];
331
+ } | null;
332
+ read?: {
333
+ /** Format: uri */
334
+ self: string;
335
+ users?: {
336
+ /** Format: uri */
337
+ self: string;
338
+ id: string;
339
+ /** Format: int64 */
340
+ version?: number | null;
341
+ key?: string | null;
342
+ display: LocalizedString;
343
+ department?: Reference;
344
+ cloudUid?: string | null;
345
+ /** Format: int64 */
346
+ passportUid?: number | null;
347
+ }[];
348
+ groups?: Reference[];
349
+ roles?: Reference[];
350
+ } | null;
351
+ writeNoAssign?: {
352
+ /** Format: uri */
353
+ self: string;
354
+ users?: {
355
+ /** Format: uri */
356
+ self: string;
357
+ id: string;
358
+ /** Format: int64 */
359
+ version?: number | null;
360
+ key?: string | null;
361
+ display: LocalizedString;
362
+ department?: Reference;
363
+ cloudUid?: string | null;
364
+ /** Format: int64 */
365
+ passportUid?: number | null;
366
+ }[];
367
+ groups?: Reference[];
368
+ roles?: Reference[];
369
+ } | null;
370
+ write?: {
371
+ /** Format: uri */
372
+ self: string;
373
+ users?: {
374
+ /** Format: uri */
375
+ self: string;
376
+ id: string;
377
+ /** Format: int64 */
378
+ version?: number | null;
379
+ key?: string | null;
380
+ display: LocalizedString;
381
+ department?: Reference;
382
+ cloudUid?: string | null;
383
+ /** Format: int64 */
384
+ passportUid?: number | null;
385
+ }[];
386
+ groups?: Reference[];
387
+ roles?: Reference[];
388
+ } | null;
389
+ grant?: {
390
+ /** Format: uri */
391
+ self: string;
392
+ users?: {
393
+ /** Format: uri */
394
+ self: string;
395
+ id: string;
396
+ /** Format: int64 */
397
+ version?: number | null;
398
+ key?: string | null;
399
+ display: LocalizedString;
400
+ department?: Reference;
401
+ cloudUid?: string | null;
402
+ /** Format: int64 */
403
+ passportUid?: number | null;
404
+ }[];
405
+ groups?: Reference[];
406
+ roles?: Reference[];
407
+ } | null;
408
+ deny?: {
409
+ /** Format: uri */
410
+ self: string;
411
+ users?: {
412
+ /** Format: uri */
413
+ self: string;
414
+ id: string;
415
+ /** Format: int64 */
416
+ version?: number | null;
417
+ key?: string | null;
418
+ display: LocalizedString;
419
+ department?: Reference;
420
+ cloudUid?: string | null;
421
+ /** Format: int64 */
422
+ passportUid?: number | null;
423
+ }[];
424
+ groups?: Reference[];
425
+ roles?: Reference[];
426
+ } | null;
427
+ } | null;
428
+ participantPercents?: {
429
+ user: UserReferenceV2;
430
+ /** Format: double */
431
+ value: number;
432
+ /** Format: double */
433
+ participationSum: number;
434
+ }[];
435
+ favorite: boolean;
436
+ parentIssueLinkChain?: {
437
+ id: IssueLinkChainId;
438
+ chain?: {
439
+ issue: IssueIndexReference;
440
+ /** Format: int32 */
441
+ height: number;
442
+ }[];
443
+ } | null;
444
+ updateLimits?: {
445
+ /** Format: int32 */
446
+ eventsCount: number;
447
+ /** Format: int32 */
448
+ linksCount: number;
449
+ /** Format: int32 */
450
+ externalEventsCount: number;
451
+ /** Format: int32 */
452
+ userEventsLimit?: number | null;
453
+ /** Format: int32 */
454
+ robotEventsLimit?: number | null;
455
+ /** Format: int32 */
456
+ linksLimit?: number | null;
457
+ /** Format: int32 */
458
+ externalEventsLimit?: number | null;
459
+ } | null;
460
+ };
461
+
462
+ export declare type IssueCommentActionSlotContext = {
463
+ id: string;
464
+ createdAt: string;
465
+ updatedAt: string | null;
466
+ text: string;
467
+ type: string;
468
+ transport: string;
469
+ attachments: Attachment[];
470
+ issueVersion: number;
471
+ };
472
+
473
+ export declare type IssueIndexReference = {
474
+ id: ObjectId;
475
+ key: string;
476
+ summary: string;
477
+ };
478
+
479
+ export declare type IssueLinkChainId = {
480
+ issueId: ObjectId;
481
+ linkField: string | {
482
+ id?: string;
483
+ };
484
+ };
485
+
486
+ export declare type IssueLinkType = {
487
+ /** Format: uri */
488
+ self: string;
489
+ id: string;
490
+ inward: LocalizedString;
491
+ outward: LocalizedString;
492
+ };
493
+
494
+ export declare type LocalizedString = string | {
495
+ ru?: string;
496
+ en?: string;
497
+ };
498
+
499
+ export declare type Message<TSlot extends keyof SlotContextMap = keyof SlotContextMap, M extends keyof TrackerContract<TSlot> = keyof TrackerContract<TSlot>> = BaseMessage & ({
500
+ type: 'request';
501
+ result: ResponseDataRequest;
502
+ error?: string;
503
+ } | {
504
+ type: 'response';
505
+ result: TrackerContract<TSlot>[M]['result'] | null;
506
+ error?: string;
507
+ errorCode?: number;
508
+ errorData?: unknown;
509
+ });
510
+
511
+ export declare type MetaEntityV2 = {
512
+ /** Format: uri */
513
+ self: string;
514
+ id: string;
515
+ /** Format: int64 */
516
+ version: number;
517
+ /** Format: int64 */
518
+ shortId?: number | null;
519
+ /** @enum {string} */
520
+ entityType: 'PROJECT_PORTFOLIO' | 'PROJECT' | 'REPORT' | 'GOAL';
521
+ createdBy: Reference;
522
+ createdAt: DateTime;
523
+ updatedAt: DateTime;
524
+ fields: {
525
+ [key: string]: Record<string, unknown>;
526
+ };
527
+ attachments?: {
528
+ /** Format: uri */
529
+ self: string;
530
+ id: string;
531
+ name: string;
532
+ /** Format: uri */
533
+ content: string;
534
+ /** Format: uri */
535
+ thumbnail?: string | null;
536
+ createdBy: UserReferenceV2;
537
+ createdAt: DateTime;
538
+ mimetype: string;
539
+ /** Format: int64 */
540
+ size: number;
541
+ metadata: {
542
+ [key: string]: string;
543
+ };
544
+ commentId: ObjectId;
545
+ /** @enum {string|null} */
546
+ status?: 'UPLOADING' | 'CHECK' | 'READY' | 'INFECTED' | 'ERROR' | null;
547
+ checkMessage: LocalizedString;
548
+ downloadable?: boolean | null;
549
+ }[];
550
+ };
551
+
552
+ export declare type NoAuthWebhookAuthContext = Omit<WebhookAuthContext, 'type'> & {
553
+ type?: string;
554
+ } & {
555
+ type: 'noauth';
556
+ } & {
557
+ type: 'noauth';
558
+ };
559
+
560
+ export declare type OAuth2WebhookAuthContext = Omit<WebhookAuthContext, 'type'> & {
561
+ accessToken?: string | null;
562
+ headerName?: string;
563
+ tokenType?: string;
564
+ refreshToken?: string | null;
565
+ type?: string;
566
+ } & {
567
+ type: 'oauth';
568
+ } & {
569
+ type: 'oauth';
570
+ };
571
+
572
+ export declare type ObjectId = string;
573
+
574
+ declare function orgSharedGet(bucket?: string): Promise<StorageRecord | null>;
575
+
576
+ declare function orgSharedPatch({ bucket, data, version }: PatchOptions): Promise<StorageRecord>;
577
+
578
+ declare type PatchOptions = {
579
+ bucket?: string;
580
+ data: StorageData;
581
+ version?: number;
582
+ };
583
+
584
+ export declare type PluginClosePayloadMap = WithUndefinedDefaults<PluginClosePayloadOverrides, keyof SlotContextMap>;
585
+
586
+ declare type PluginClosePayloadOverrides = {
587
+ 'attachment.viewer.action': AttachmentViewerActionClosePayload;
588
+ };
589
+
590
+ export declare type PortfolioSlotContext = MetaEntityV2 & {
591
+ progress: {
592
+ closed: number;
593
+ total: number;
594
+ };
595
+ };
596
+
597
+ export declare type ProjectSlotContext = MetaEntityV2 & {
598
+ progress: {
599
+ closed: number;
600
+ total: number;
601
+ };
602
+ boardId: number;
603
+ };
604
+
605
+ export declare type Reference = {
606
+ /** Format: uri */
607
+ self: string;
608
+ id: string;
609
+ /** Format: int64 */
610
+ version?: number | null;
611
+ key?: string | null;
612
+ display: LocalizedString;
613
+ };
614
+
615
+ export declare type Relationship = 'RELATES' | 'IS_DEPENDENT_BY' | 'DEPENDS_ON' | 'IS_SUBTASK_FOR' | 'IS_PARENT_TASK_FOR' | 'DUPLICATES' | 'IS_DUPLICATED_BY' | 'IS_EPIC_OF' | 'HAS_EPIC' | 'CLONE' | 'ORIGINAL';
616
+
617
+ export declare type RequestMessage<TSlot extends keyof SlotContextMap = keyof SlotContextMap, M extends keyof TrackerContract<TSlot> = keyof TrackerContract<TSlot>> = BaseMessage & {
618
+ method: M;
619
+ payload: TrackerContract<TSlot>[M]['payload'];
620
+ };
621
+
622
+ export declare type ResponseDataRequest = {
623
+ method: string;
624
+ payload: unknown;
625
+ };
626
+
627
+ /**
628
+ * Регистрирует обработчик. Тип возвращаемого значения задаётся слотом (GetDataResultMap).
629
+ */
630
+ export declare function setHandler<TSlot extends keyof GetDataResultMap>(name: 'getData', handler: () => GetDataResultMap[TSlot]): void;
631
+
632
+ export declare function setHandler<TKey extends keyof Handlers>(name: TKey, handler: HandlerFunction<TKey>): void;
633
+
634
+ export declare type SlotContextMap = {
635
+ 'issue.action': Issue;
636
+ 'issue.block': Issue;
637
+ 'issue.tab': Issue;
638
+ navigation: Record<string, never>;
639
+ 'trigger.create.action': TriggerCreateActionsSlotContext;
640
+ 'trigger.edit.action': TriggerEditActionsSlotContext;
641
+ 'portfolio.action': PortfolioSlotContext;
642
+ 'portfolio.block': PortfolioSlotContext;
643
+ 'portfolio.tab': PortfolioSlotContext;
644
+ 'project.action': ProjectSlotContext;
645
+ 'project.block': ProjectSlotContext;
646
+ 'project.tab': ProjectSlotContext;
647
+ 'goal.action': GoalSlotContext;
648
+ 'goal.block': GoalSlotContext;
649
+ 'goal.tab': GoalSlotContext;
650
+ 'attachment.viewer.action': AttachmentViewerActionSlotContext;
651
+ 'issue.comment.action': IssueCommentActionSlotContext;
652
+ 'board.tab': BoardTabSlotContext;
653
+ };
654
+
655
+ export declare const storageApi: {
656
+ orgShared: {
657
+ get: typeof orgSharedGet;
658
+ patch: typeof orgSharedPatch;
659
+ };
660
+ };
661
+
662
+ export declare type StorageContextType = 'orgShared';
663
+
664
+ declare type StorageContract = {
665
+ 'storage.get': {
666
+ payload: StorageGetPayload;
667
+ result: StorageRecord | null;
668
+ };
669
+ 'storage.patch': {
670
+ payload: StoragePatchPayload;
671
+ result: StorageRecord;
672
+ };
673
+ };
674
+
675
+ declare type StorageData = Record<string, unknown>;
676
+
677
+ export declare type StorageGetPayload = {
678
+ contextType: StorageContextType;
679
+ bucket?: string;
680
+ };
681
+
682
+ export declare type StoragePatchPayload = {
683
+ contextType: StorageContextType;
684
+ bucket?: string;
685
+ data: Record<string, unknown>;
686
+ version: number;
687
+ };
688
+
689
+ export declare type StorageRecord = {
690
+ key: Array<{
691
+ organization_shared: string;
692
+ }>;
693
+ version: number;
694
+ data: Record<string, unknown>;
695
+ canWrite: boolean;
696
+ createdAt: string;
697
+ updatedAt: string;
698
+ };
699
+
700
+ /**
701
+ * Untyped runtime API класс. v3-методы возвращают Proxy, который при обращении
702
+ * по любому ключу строит call. Типизация добавляется в публикуемых пакетах
703
+ * через cast (см. typed wrapper).
704
+ */
705
+ declare class TrackerApi {
706
+ private static readonly V3_VERSION;
707
+ get v3(): {
708
+ get: Record<string, (opts: TrackerApiCallOptions) => Promise<unknown>>;
709
+ post: Record<string, (opts: TrackerApiCallOptions) => Promise<unknown>>;
710
+ put: Record<string, (opts: TrackerApiCallOptions) => Promise<unknown>>;
711
+ patch: Record<string, (opts: TrackerApiCallOptions) => Promise<unknown>>;
712
+ delete: Record<string, (opts: TrackerApiCallOptions) => Promise<unknown>>;
713
+ };
714
+ private createMethodProxy;
715
+ private call;
716
+ }
717
+
718
+ export declare const trackerApi: TrackerApi;
719
+
720
+ export declare interface TrackerApiCallOptions {
721
+ pathParams?: Record<string, string>;
722
+ queryParams?: Record<string, unknown>;
723
+ bodyParams?: Record<string, unknown>;
724
+ file?: File;
725
+ }
726
+
727
+ export declare interface TrackerApiInitOptions {
728
+ apiVersion?: string;
729
+ }
730
+
731
+ export declare type TrackerContract<TSlot extends keyof SlotContextMap = keyof SlotContextMap> = HostContract<TSlot> & ApiContract & UiContract & StorageContract;
732
+
733
+ export declare type TriggerActionData = Omit<WebhookTriggerActionInput, 'id' | 'type' | 'typeKey'>;
734
+
735
+ export declare type TriggerActionInput = {
736
+ /** Format: int32 */
737
+ id?: number | null;
738
+ typeKey: string;
739
+ type: string;
740
+ };
741
+
742
+ export declare type TriggerCreateActionsSlotContext = {
743
+ queue: string;
744
+ };
745
+
746
+ export declare type TriggerEditActionsSlotContext = {
747
+ queue: string;
748
+ data: TriggerActionData;
749
+ };
750
+
751
+ export declare type UserReferenceV2 = {
752
+ /** Format: uri */
753
+ self: string;
754
+ id: string;
755
+ /** Format: int64 */
756
+ version?: number | null;
757
+ key?: string | null;
758
+ display: LocalizedString;
759
+ department?: Reference;
760
+ cloudUid?: string | null;
761
+ /** Format: int64 */
762
+ passportUid?: number | null;
763
+ };
764
+
765
+ export declare type VaultBasicWebhookAuthContext = Omit<WebhookAuthContext, 'type'> & {
766
+ login?: string;
767
+ password?: {
768
+ sourceId?: VaultId;
769
+ token?: {
770
+ token?: string;
771
+ uuid?: string;
772
+ signature?: string | null;
773
+ } | null;
774
+ } | null;
775
+ type?: string;
776
+ } & {
777
+ type: 'basic-vault';
778
+ } & {
779
+ type: 'basic-vault';
780
+ };
781
+
782
+ export declare type VaultId = {
783
+ type: string;
784
+ };
785
+
786
+ export declare type VaultOAuth2WebhookAuthContext = Omit<WebhookAuthContext, 'type'> & {
787
+ headerName?: string;
788
+ tokenType?: string;
789
+ accessToken?: {
790
+ sourceId?: VaultId;
791
+ token?: {
792
+ token?: string;
793
+ uuid?: string;
794
+ signature?: string | null;
795
+ } | null;
796
+ } | null;
797
+ type?: string;
798
+ vaultEntry?: {
799
+ sourceId?: VaultId;
800
+ token?: {
801
+ token?: string;
802
+ uuid?: string;
803
+ signature?: string | null;
804
+ } | null;
805
+ } | null;
806
+ } & {
807
+ type: 'oauth-vault';
808
+ } & {
809
+ type: 'oauth-vault';
810
+ };
811
+
812
+ export declare type WebhookAuthContext = {
813
+ type: string;
814
+ };
815
+
816
+ export declare type WebhookTriggerActionInput = Omit<TriggerActionInput, 'type'> & {
817
+ endpoint?: string | null;
818
+ /** @enum {string|null} */
819
+ method?: 'GET' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'OPTIONS' | 'LINK' | 'UNLINK' | null;
820
+ contentType?: string | null;
821
+ headers?: {
822
+ [key: string]: string;
823
+ };
824
+ variables?: {
825
+ [key: string]: string;
826
+ } | null;
827
+ secrets?: {
828
+ [key: string]: {
829
+ sourceId?: VaultId;
830
+ token?: {
831
+ token?: string;
832
+ uuid?: string;
833
+ signature?: string | null;
834
+ } | null;
835
+ };
836
+ } | null;
837
+ authContext?: ({
838
+ type?: string;
839
+ } & (NoAuthWebhookAuthContext | OAuth2WebhookAuthContext | BasicWebhookAuthContext | VaultOAuth2WebhookAuthContext | VaultBasicWebhookAuthContext)) | null;
840
+ body?: string | null;
841
+ retryConfig?: {
842
+ retry500?: boolean;
843
+ } | null;
844
+ plugin?: string | null;
845
+ typeKey?: string;
846
+ } & {
847
+ type: 'Webhook';
848
+ } & {
849
+ type: 'Webhook';
850
+ };
851
+
852
+ declare type WithUndefinedDefaults<TMap, TKeys extends PropertyKey> = {
853
+ [K in TKeys]: K extends keyof TMap ? TMap[K] : undefined;
854
+ };
855
+
856
+ export { }
package/dist/index.mjs ADDED
@@ -0,0 +1,97 @@
1
+ import { sendRequest as h, hostApi as y, getHandler as f, setHandler as P, getLocalizedString as p, VERSION_CONFLICT as S } from "@weavix/sdk-core";
2
+ function E(t, e, r = {}, a) {
3
+ return {
4
+ version: a,
5
+ method: t,
6
+ url: e,
7
+ pathParams: r.pathParams ?? {},
8
+ queryParams: r.queryParams ?? {},
9
+ bodyParams: r.bodyParams ?? {},
10
+ file: r.file
11
+ };
12
+ }
13
+ const s = class s {
14
+ get v3() {
15
+ return {
16
+ get: this.createMethodProxy("GET"),
17
+ post: this.createMethodProxy("POST"),
18
+ put: this.createMethodProxy("PUT"),
19
+ patch: this.createMethodProxy("PATCH"),
20
+ delete: this.createMethodProxy("DELETE")
21
+ };
22
+ }
23
+ createMethodProxy(e) {
24
+ const r = this;
25
+ return new Proxy({}, {
26
+ get(a, o) {
27
+ return (n) => r.call(e, o, n, s.V3_VERSION);
28
+ }
29
+ });
30
+ }
31
+ call(e, r, a = {}, o) {
32
+ const n = E(e, r, a, o);
33
+ return h("api.tracker.call", n);
34
+ }
35
+ };
36
+ s.V3_VERSION = "v3";
37
+ let l = s;
38
+ const R = new l(), O = y;
39
+ function V(t, e) {
40
+ P(t, e);
41
+ }
42
+ function C(t) {
43
+ return f(t);
44
+ }
45
+ function H(t, e, r = "ru") {
46
+ return p(t, e, r);
47
+ }
48
+ const d = "orgShared", i = 2;
49
+ async function g(t) {
50
+ return await h("storage.get", { contextType: d, bucket: t });
51
+ }
52
+ async function u(t, e, r) {
53
+ return await h("storage.patch", {
54
+ contextType: d,
55
+ bucket: t,
56
+ data: e,
57
+ version: r
58
+ });
59
+ }
60
+ function T(t) {
61
+ return typeof t == "object" && t !== null && t.code === S;
62
+ }
63
+ function x(t) {
64
+ return g(t);
65
+ }
66
+ async function m({ bucket: t, data: e, version: r }) {
67
+ if (r !== void 0)
68
+ return u(t, e, r);
69
+ let a;
70
+ for (let o = 0; o <= i; o += 1) {
71
+ const n = (await g(t))?.version ?? 0;
72
+ try {
73
+ return await u(t, e, n);
74
+ } catch (c) {
75
+ if (!T(c)) throw c;
76
+ a = c, o < i && console.warn(
77
+ `[storageApi] orgShared.patch: VERSION_CONFLICT on version ${n}, retry ${o + 1}/${i}`
78
+ );
79
+ }
80
+ }
81
+ throw a;
82
+ }
83
+ const I = {
84
+ orgShared: {
85
+ get: x,
86
+ patch: m
87
+ }
88
+ };
89
+ export {
90
+ C as getHandler,
91
+ H as getLocalizedString,
92
+ O as hostApi,
93
+ V as setHandler,
94
+ I as storageApi,
95
+ R as trackerApi
96
+ };
97
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../src/api/trackerApiBase.ts","../src/host/hostApi.ts","../src/handlers/handlers.ts","../src/utils/localization.ts","../src/storage/storageApi.ts"],"sourcesContent":["import { sendRequest } from '@weavix/sdk-core';\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 {\n ContentSizeUpdateRequest,\n type ContextLevel,\n type HostInitOptions,\n Theme,\n hostApi as hostApiBase,\n} from '@weavix/sdk-core';\nimport type { SlotContextMap } from '../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 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 * Идентификатор сущности, переданный хостом в параметрах iframe.\n * Доступен сразу после init() без postMessage-запроса.\n */\n getEntityId(): string | null;\n\n /**\n * Метаданные сущности, переданные хостом в параметрах iframe.\n * Доступны сразу после init() без postMessage-запроса.\n */\n getEntityMeta(): Record<string, string> | undefined;\n\n /**\n * Уровень контекста, объявленный в манифесте плагина.\n * 'basic' — только entityId, 'full' — полный контекст слота.\n */\n getContextLevel(): ContextLevel;\n\n /**\n * Выключить автоматическое изменение размера контейнера\n */\n disableAutoResize(): void;\n}\n\nexport const hostApi = hostApiBase as unknown as HostApi;\n","import { getHandler as baseGetHandler, setHandler as baseSetHandler } from '@weavix/sdk-core';\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 {\n type LocalizedString as StructuralLocalizedString,\n getLocalizedString as baseGetLocalizedString,\n} from '@weavix/sdk-core';\nimport type { LocalizedString } from '../types/primitives';\n\n/**\n * Получить локализованную строку на основе языка.\n * Принимает `LocalizedString` из @weavix/tracker-core.\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","import { VERSION_CONFLICT, sendRequest } from '@weavix/sdk-core';\n\nimport type { StorageRecord } from './types';\n\nexport type StorageData = Record<string, unknown>;\n\nexport type PatchOptions = {\n bucket?: string;\n data: StorageData;\n version?: number;\n};\n\nconst CONTEXT_TYPE = 'orgShared' as const;\nconst MAX_RETRIES = 2;\n\nasync function readRecord(bucket: string | undefined): Promise<StorageRecord | null> {\n const result = await sendRequest('storage.get', { contextType: CONTEXT_TYPE, bucket });\n\n return result as StorageRecord | null;\n}\n\nasync function patchRecord(\n bucket: string | undefined,\n data: StorageData,\n version: number,\n): Promise<StorageRecord> {\n const result = await sendRequest('storage.patch', {\n contextType: CONTEXT_TYPE,\n bucket,\n data,\n version,\n });\n\n return result as StorageRecord;\n}\n\nfunction isVersionConflict(err: unknown): boolean {\n return (\n typeof err === 'object' &&\n err !== null &&\n (err as { code?: unknown }).code === VERSION_CONFLICT\n );\n}\n\nfunction orgSharedGet(bucket?: string): Promise<StorageRecord | null> {\n return readRecord(bucket);\n}\n\nasync function orgSharedPatch({ bucket, data, version }: PatchOptions): Promise<StorageRecord> {\n if (version !== undefined) {\n return patchRecord(bucket, data, version);\n }\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= MAX_RETRIES; attempt += 1) {\n const currentVersion = (await readRecord(bucket))?.version ?? 0;\n\n try {\n return await patchRecord(bucket, data, currentVersion);\n } catch (err) {\n if (!isVersionConflict(err)) throw err;\n lastError = err;\n\n if (attempt < MAX_RETRIES) {\n console.warn(\n `[storageApi] orgShared.patch: VERSION_CONFLICT on version ${currentVersion}, retry ${attempt + 1}/${MAX_RETRIES}`,\n );\n }\n }\n }\n\n throw lastError;\n}\n\nexport const storageApi = {\n orgShared: {\n get: orgSharedGet,\n patch: orgSharedPatch,\n },\n};\n"],"names":["buildPayload","method","url","options","version","_TrackerApi","self","_","path","payload","requestVersion","sendRequest","TrackerApi","trackerApi","hostApi","hostApiBase","setHandler","name","handler","baseSetHandler","getHandler","baseGetHandler","getLocalizedString","value","language","fallbackLanguage","baseGetLocalizedString","CONTEXT_TYPE","MAX_RETRIES","readRecord","bucket","patchRecord","data","isVersionConflict","err","VERSION_CONFLICT","orgSharedGet","orgSharedPatch","lastError","attempt","currentVersion","storageApi"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@weavix/tracker-core",
3
+ "version": "0.0.1",
4
+ "exports": {
5
+ ".": {
6
+ "types": "./dist/index.d.ts",
7
+ "import": "./dist/index.mjs"
8
+ }
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md"
13
+ ],
14
+ "keywords": [],
15
+ "author": "Tracker Team",
16
+ "license": "UNLICENSED",
17
+ "description": "Shared TypeScript types and bridge layer for Tracker plugins",
18
+ "peerDependencies": {
19
+ "@weavix/sdk-core": "^0.0.3"
20
+ },
21
+ "publishConfig": {
22
+ "registry": "https://registry.npmjs.org/",
23
+ "access": "public"
24
+ },
25
+ "devDependencies": {
26
+ "@types/jest": "*",
27
+ "@weavix/sdk-core": "0.0.0"
28
+ },
29
+ "scripts": {
30
+ "build": "vite build",
31
+ "typecheck": "tsc --noEmit"
32
+ }
33
+ }