@endge/utils 0.24.13 → 0.25.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/collection/RingBuffer.d.ts +12 -0
  2. package/dist/collection/collection.d.ts +51 -0
  3. package/dist/collection/collection.types.d.ts +35 -0
  4. package/dist/collection/indexed-collection.d.ts +140 -0
  5. package/dist/database/PayloadHttpClient.d.ts +13 -0
  6. package/dist/events/ChangeNotifier.d.ts +8 -0
  7. package/dist/events/EventBus.d.ts +117 -0
  8. package/dist/execute/NamedExecutor.d.ts +39 -0
  9. package/dist/execute/delay-executor.d.ts +31 -0
  10. package/dist/index.d.ts +36 -1320
  11. package/dist/serialize/Serialize.d.ts +14 -0
  12. package/dist/serialize/decorators/json.d.ts +10 -0
  13. package/dist/serialize/decorators/jsonString.d.ts +1 -0
  14. package/dist/serialize/decorators/onDeserialized.d.ts +2 -0
  15. package/dist/serialize/decorators/script.d.ts +10 -0
  16. package/dist/serialize/decorators/typeMap.d.ts +55 -0
  17. package/dist/serialize/decorators/typeRecord.d.ts +59 -0
  18. package/dist/shared/serialize/decorator.d.ts +15 -0
  19. package/dist/shared/serialize/parse.d.ts +3 -0
  20. package/dist/shared/types/getter-fn.d.ts +3 -0
  21. package/dist/shared/types/maybe.d.ts +2 -0
  22. package/dist/shared/utils/compare.d.ts +1 -0
  23. package/dist/shared/utils/generate.d.ts +2 -0
  24. package/dist/shared/utils/keyboard.d.ts +9 -0
  25. package/dist/shared/utils/text.d.ts +1 -0
  26. package/dist/shared/utils/time.d.ts +41 -0
  27. package/dist/tools/compare.d.ts +1 -0
  28. package/dist/tools/console.d.ts +4 -0
  29. package/dist/tools/debug.d.ts +2 -0
  30. package/dist/tools/generate.d.ts +1 -0
  31. package/dist/tools/geometry.d.ts +15 -0
  32. package/dist/tools/hotkeys.d.ts +56 -0
  33. package/dist/tools/keyboard.d.ts +21 -0
  34. package/dist/tools/logs.d.ts +176 -0
  35. package/dist/tools/reflect.d.ts +12 -0
  36. package/dist/tools/state.d.ts +1 -0
  37. package/dist/tools/system-clock.d.ts +14 -0
  38. package/dist/tools/text.d.ts +1 -0
  39. package/dist/tools/time.d.ts +1 -0
  40. package/dist/tools/tools.types.d.ts +101 -0
  41. package/dist/ui/tree.types.d.ts +7 -0
  42. package/dist/updates/SSEManager.d.ts +26 -0
  43. package/dist/updates/UPSMeter_Service.d.ts +8 -0
  44. package/dist/utils.js +347 -445
  45. package/package.json +13 -18
@@ -0,0 +1,12 @@
1
+ export declare class RingBuffer<T> {
2
+ private readonly _cap;
3
+ private readonly _buf;
4
+ private _head;
5
+ private _len;
6
+ constructor(capacity: number);
7
+ get capacity(): number;
8
+ get length(): number;
9
+ push(value: T): void;
10
+ clear(): void;
11
+ toArray(): Array<T>;
12
+ }
@@ -0,0 +1,51 @@
1
+ import { CollectionEntity, CollectionEvents } from './collection.types';
2
+ import { ChangeNotifier } from '../events/ChangeNotifier';
3
+ /**
4
+ * Описывает ответственность Collection в архитектуре проекта.
5
+ */
6
+ export declare class Collection<T extends CollectionEntity> extends ChangeNotifier {
7
+ private items;
8
+ private indices;
9
+ private rootIds;
10
+ private bus;
11
+ /**
12
+ * Создает экземпляр Collection и подготавливает базовое состояние.
13
+ */
14
+ constructor(initialItems?: Array<T>);
15
+ /**
16
+ * Выполняет действие add в рамках ответственности Collection.
17
+ */
18
+ add(items: T | Array<T>): void;
19
+ /**
20
+ * Удаляет сущность из runtime-коллекции Collection.
21
+ */
22
+ remove(arg: string | T | Array<string | T>): void;
23
+ /**
24
+ * Обновляет runtime-состояние Collection.
25
+ */
26
+ update(itemOrItems: T | Array<T>): void;
27
+ /**
28
+ * Возвращает значение состояния Collection.
29
+ */
30
+ get(arg: string | Partial<T>): T | undefined;
31
+ /**
32
+ * Создает runtime-сущность Collection.
33
+ */
34
+ private createIndex;
35
+ /**
36
+ * Возвращает реактивный массив всех элементов.
37
+ */
38
+ get all(): Array<T>;
39
+ /**
40
+ * Возвращает массив корневых элементов (без parentId).
41
+ */
42
+ get allRoot(): Array<T>;
43
+ /**
44
+ * Обрабатывает входящее событие Collection.
45
+ */
46
+ on<K extends keyof CollectionEvents<T>>(event: K, cb: (payload: CollectionEvents<T>[K]) => void): void;
47
+ /**
48
+ * Выполняет действие off в рамках ответственности Collection.
49
+ */
50
+ off<K extends keyof CollectionEvents<T>>(event: K, cb: (payload: CollectionEvents<T>[K]) => void): void;
51
+ }
@@ -0,0 +1,35 @@
1
+ export interface CollectionEntity {
2
+ id: string;
3
+ parentId?: string | null;
4
+ }
5
+ export declare enum Events {
6
+ Add = "add",
7
+ Remove = "remove",
8
+ Update = "update",
9
+ IndexCreate = "indexCreate"
10
+ }
11
+ export interface CollectionEvents<T extends CollectionEntity> {
12
+ [Events.Add]: Array<T>;
13
+ [Events.Remove]: Array<T>;
14
+ [Events.Update]: Array<T>;
15
+ [Events.IndexCreate]: keyof T;
16
+ }
17
+ export interface IndexCollectionEntity<ID = string | null> {
18
+ id: ID;
19
+ index: number;
20
+ filteredIndex: number;
21
+ }
22
+ export interface CollectionOptions<T extends IndexCollectionEntity<ID>, ID = string | null> {
23
+ sortFn: (a: T, b: T) => number;
24
+ filterFn: (item: T) => boolean;
25
+ indexEnabled: boolean;
26
+ filterIndexEnabled: boolean;
27
+ }
28
+ export interface ReadonlyIndexCollection<T extends IndexCollectionEntity<ID>, ID = string | null> {
29
+ get: (id: ID) => T | undefined;
30
+ all: () => ReadonlyArray<T>;
31
+ size: () => number;
32
+ unfiltered: () => ReadonlyArray<T>;
33
+ has: (id: ID) => boolean;
34
+ forEach: (callback: (item: T) => void) => void;
35
+ }
@@ -0,0 +1,140 @@
1
+ import { CollectionOptions, IndexCollectionEntity } from './collection.types';
2
+ import { OneOrMany } from '../tools/tools.types';
3
+ /**
4
+ * Высокопроизводительная IndexedCollection
5
+ *
6
+ * Цели:
7
+ * - O(1) добавление, удаление и доступ по id
8
+ * - O(1) обновление membership фильтра (dense массив + swap-remove)
9
+ * - Ленивый sort, полный пересчет только по запросу
10
+ * - Инкрементальная поддержка filteredList (swap-remove) при включенном filterIndexEnabled
11
+ *
12
+ * Важно:
13
+ * - При sort list меняется порядок -> filteredList должен быть пересобран (иначе он останется в старом порядке).
14
+ * - При изменении filterFn можно пересобрать filteredList без пересортировки list.
15
+ */
16
+ export declare class IndexedCollection<T extends IndexCollectionEntity<ID>, ID = string | null> {
17
+ private list;
18
+ private filteredList;
19
+ private map;
20
+ private indexById;
21
+ private dirtySort;
22
+ private dirtyFilter;
23
+ private sortFn?;
24
+ private filterFn?;
25
+ private indexEnabled;
26
+ private filterIndexEnabled;
27
+ /**
28
+ * Создает экземпляр IndexedCollection и подготавливает базовое состояние.
29
+ */
30
+ constructor(opts?: Partial<CollectionOptions<T, ID>> | null);
31
+ /**
32
+ * Выполняет действие options в рамках ответственности IndexedCollection.
33
+ */
34
+ options(opts: Partial<CollectionOptions<T, ID>>): this;
35
+ /**
36
+ * Выполняет действие markDirty в рамках ответственности IndexedCollection.
37
+ */
38
+ markDirty(opts: {
39
+ filter?: boolean;
40
+ sort?: boolean;
41
+ }): void;
42
+ /**
43
+ * Выполняет действие ensure в рамках ответственности IndexedCollection.
44
+ */
45
+ ensure(): void;
46
+ /**
47
+ * Выполняет действие ensureSorted в рамках ответственности IndexedCollection.
48
+ */
49
+ ensureSorted(): void;
50
+ /**
51
+ * Выполняет действие ensureFiltered в рамках ответственности IndexedCollection.
52
+ */
53
+ ensureFiltered(): void;
54
+ /**
55
+ * Выполняет действие add в рамках ответственности IndexedCollection.
56
+ */
57
+ add(items: OneOrMany<T>): void;
58
+ /**
59
+ * Удаляет сущность из runtime-коллекции IndexedCollection.
60
+ */
61
+ remove(ids: OneOrMany<ID>): void;
62
+ /**
63
+ * Вызывать после изменения полей элемента
64
+ * mayAffectFilter если изменились поля фильтра
65
+ * mayAffectSort если изменились поля сортировки
66
+ */
67
+ touch(id: ID, opts?: {
68
+ mayAffectFilter?: boolean;
69
+ mayAffectSort?: boolean;
70
+ }): void;
71
+ /**
72
+ * Выполняет действие forEach в рамках ответственности IndexedCollection.
73
+ */
74
+ forEach(callback: (item: T, index: number) => void): void;
75
+ /**
76
+ * Отсортированный и/или отфильтрованный список (в зависимости от включенных функций).
77
+ */
78
+ all(): Array<T>;
79
+ /**
80
+ * Отсортированный полный список (без фильтра), если есть sortFn.
81
+ */
82
+ unfiltered(): Array<T>;
83
+ /**
84
+ * Отсортированный и отфильтрованный список (если есть filterFn).
85
+ * Если filterFn нет — возвращается list.
86
+ */
87
+ filtered(): Array<T>;
88
+ /**
89
+ * Выполняет действие pos в рамках ответственности IndexedCollection.
90
+ */
91
+ pos(index: number): T | null;
92
+ /**
93
+ * Выполняет действие first в рамках ответственности IndexedCollection.
94
+ */
95
+ first(): T | null;
96
+ /**
97
+ * Выполняет действие last в рамках ответственности IndexedCollection.
98
+ */
99
+ last(): T | null;
100
+ /**
101
+ * Выполняет действие has в рамках ответственности IndexedCollection.
102
+ */
103
+ has(id: ID): boolean;
104
+ /**
105
+ * Возвращает значение состояния IndexedCollection.
106
+ */
107
+ get(id: ID): T | undefined;
108
+ /**
109
+ * Выполняет действие size в рамках ответственности IndexedCollection.
110
+ */
111
+ size(): number;
112
+ /**
113
+ * Очищает накопленное состояние IndexedCollection.
114
+ */
115
+ clear(): void;
116
+ /**
117
+ * Выполняет внутренний шаг rebuildFilteredFromScratch для IndexedCollection.
118
+ */
119
+ private rebuildFilteredFromScratch;
120
+ /**
121
+ * Выполняет внутренний шаг addToFilteredIfPasses для IndexedCollection.
122
+ */
123
+ private addToFilteredIfPasses;
124
+ /**
125
+ * Добавляет сущность в runtime-коллекцию IndexedCollection.
126
+ */
127
+ private appendToFiltered;
128
+ /**
129
+ * Выполняет внутренний шаг refilterOneO1 для IndexedCollection.
130
+ */
131
+ private refilterOneO1;
132
+ /**
133
+ * Удаляет сущность из runtime-коллекции IndexedCollection.
134
+ */
135
+ private removeFromFilteredO1;
136
+ /**
137
+ * Удаляет сущность из runtime-коллекции IndexedCollection.
138
+ */
139
+ private removeFromListO1;
140
+ }
@@ -0,0 +1,13 @@
1
+ export interface PayloadClientOptions {
2
+ baseUrl: string;
3
+ }
4
+ export declare class PayloadHttpClient {
5
+ private readonly baseUrl;
6
+ constructor(opts: PayloadClientOptions);
7
+ private buildUrl;
8
+ private buildHeaders;
9
+ get<T>(path: string, query?: Record<string, unknown>, extraHeaders?: HeadersInit): Promise<T>;
10
+ post<T>(path: string, body?: unknown, extraHeaders?: HeadersInit): Promise<T>;
11
+ patch<T>(path: string, body?: unknown, extraHeaders?: HeadersInit): Promise<T>;
12
+ delete<T>(path: string, extraHeaders?: HeadersInit): Promise<T>;
13
+ }
@@ -0,0 +1,8 @@
1
+ /** Внутренний механизм уведомления generic utilities об изменениях. */
2
+ export declare class ChangeNotifier {
3
+ private readonly _listeners;
4
+ /** Подписывает listener на изменения utility owner. */
5
+ subscribe(listener: () => void): () => void;
6
+ /** Уведомляет текущих listeners об изменении. */
7
+ notify(): void;
8
+ }
@@ -0,0 +1,117 @@
1
+ import { OneOrMany } from '../tools/tools.types';
2
+ /**
3
+ * Тип колбэка для события.
4
+ * @template T Тип данных, передаваемых в событие.
5
+ */
6
+ export type EventCallback<T = any> = (payload: T) => void;
7
+ export type EventList = Record<string, any>;
8
+ /**
9
+ * EventBus реализует паттерн подписки на события.
10
+ *
11
+ * Поддерживает:
12
+ * - Типизированные события через дженерик StaticEvents;
13
+ * - Кастомные (непредопределённые) события;
14
+ * - Подписку `on`, одноразовую подписку `once`, отписку `off`;
15
+ * - Эмит `emit`, проверку `hasListeners` и список активных событий `eventNames`.
16
+ *
17
+ * Пример использования:
18
+ *
19
+ * ```ts
20
+ * type Events = {
21
+ * userLogin: { id: string }
22
+ * error: { message: string }
23
+ * }
24
+ *
25
+ * const bus = new EventBus<Events>(['userLogin', 'error'])
26
+ *
27
+ * bus.on('userLogin', ({ id }) => console.logFrame(`Login: ${id}`))
28
+ * bus.once('error', ({ message }) => console.warn('One-time error:', message))
29
+ *
30
+ * bus.emit('userLogin', { id: 'u42' }) // Login: u42
31
+ * bus.emit('error', { message: 'fail' }) // One-time error: fail
32
+ * bus.emit('error', { message: 'fail again' }) // уже не сработает
33
+ *
34
+ * console.logFrame(bus.hasListeners('userLogin')) // true
35
+ * console.logFrame(bus.eventNames()) // ['userLogin']
36
+ * ```
37
+ */
38
+ export declare class EventBus<StaticEvents extends Record<string, any>, CustomEventMap extends Record<string, any> = Record<string, any>> {
39
+ private listeners;
40
+ /**
41
+ * Создает экземпляр EventBus и подготавливает базовое состояние.
42
+ */
43
+ constructor(predefinedEvents?: Array<keyof StaticEvents>);
44
+ /**
45
+ * Обрабатывает входящее событие EventBus.
46
+ */
47
+ on<K extends keyof StaticEvents>(events: OneOrMany<K>, callback: EventCallback<StaticEvents[K]>): void;
48
+ /**
49
+ * Обрабатывает входящее событие EventBus.
50
+ */
51
+ once<K extends keyof StaticEvents>(events: OneOrMany<K>, callback: EventCallback<StaticEvents[K]>): void;
52
+ /**
53
+ * Выполняет действие off в рамках ответственности EventBus.
54
+ */
55
+ off<K extends keyof StaticEvents>(events: OneOrMany<K>, callback: EventCallback<StaticEvents[K]>): void;
56
+ /**
57
+ * Выполняет действие offAll в рамках ответственности EventBus.
58
+ */
59
+ offAll(): void;
60
+ /**
61
+ * Публикует событие во внутренний event bus EventBus.
62
+ */
63
+ emit<K extends keyof StaticEvents>(event: K, payload: StaticEvents[K]): void;
64
+ /**
65
+ * Обрабатывает входящее событие EventBus.
66
+ */
67
+ onCustom<K extends keyof CustomEventMap>(events: OneOrMany<K>, callback: EventCallback<CustomEventMap[K]>): void;
68
+ /**
69
+ * Обрабатывает входящее событие EventBus.
70
+ */
71
+ onceCustom<K extends keyof CustomEventMap>(events: OneOrMany<K>, callback: EventCallback<CustomEventMap[K]>): void;
72
+ /**
73
+ * Выполняет действие offCustom в рамках ответственности EventBus.
74
+ */
75
+ offCustom<K extends keyof CustomEventMap>(events: OneOrMany<K>, callback: EventCallback<CustomEventMap[K]>): void;
76
+ /**
77
+ * Публикует событие во внутренний event bus EventBus.
78
+ */
79
+ emitCustom<K extends keyof CustomEventMap>(event: K, payload: CustomEventMap[K]): void;
80
+ /**
81
+ * Обрабатывает входящее событие EventBus.
82
+ */
83
+ private _on;
84
+ /**
85
+ * Обрабатывает входящее событие EventBus.
86
+ */
87
+ private _once;
88
+ /**
89
+ * Выполняет внутренний шаг _off для EventBus.
90
+ */
91
+ private _off;
92
+ /**
93
+ * Публикует событие во внутренний event bus EventBus.
94
+ */
95
+ private _emit;
96
+ /**
97
+ * Выполняет действие hasListeners в рамках ответственности EventBus.
98
+ */
99
+ hasListeners(event: string): boolean;
100
+ /**
101
+ * Выполняет действие eventNames в рамках ответственности EventBus.
102
+ */
103
+ eventNames(): Array<string>;
104
+ /**
105
+ * Очищает накопленное состояние EventBus.
106
+ */
107
+ clear(event?: string): void;
108
+ }
109
+ export interface GlobalEvents {
110
+ notify: {
111
+ severity: 'success' | 'error' | 'info' | 'warn';
112
+ summary: string;
113
+ detail?: string;
114
+ life?: number;
115
+ };
116
+ }
117
+ export declare const AppBus: EventBus<GlobalEvents, Record<string, any>>;
@@ -0,0 +1,39 @@
1
+ interface NamedExecutorConfig {
2
+ delayMs: number;
3
+ maxMs: number;
4
+ }
5
+ /**
6
+ * Описывает ответственность NamedExecutor в архитектуре проекта.
7
+ */
8
+ export declare class NamedExecutor {
9
+ private readonly config;
10
+ private delayTimers;
11
+ private maxTimers;
12
+ private callbacks;
13
+ private firstCallTime;
14
+ /**
15
+ * Создает экземпляр NamedExecutor и подготавливает базовое состояние.
16
+ */
17
+ constructor(config: NamedExecutorConfig);
18
+ /**
19
+ * Выполняет действие run в рамках ответственности NamedExecutor.
20
+ */
21
+ run(id: string, callback: () => void): void;
22
+ /**
23
+ * Принудительно завершает накопленные изменения NamedExecutor.
24
+ */
25
+ flush(id: string): void;
26
+ /**
27
+ * Выполняет действие cancel в рамках ответственности NamedExecutor.
28
+ */
29
+ cancel(id: string): void;
30
+ /**
31
+ * Принудительно завершает накопленные изменения NamedExecutor.
32
+ */
33
+ flushAll(): void;
34
+ /**
35
+ * Очищает накопленное состояние NamedExecutor.
36
+ */
37
+ private clear;
38
+ }
39
+ export {};
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Описывает ответственность DelayedExecutor в архитектуре проекта.
3
+ */
4
+ export declare class DelayedExecutor<T extends Array<any> = []> {
5
+ private readonly fn;
6
+ private readonly firstExecuteImmediately;
7
+ private delayTimer;
8
+ private maxTimer;
9
+ private hasExecutedOnce;
10
+ private lastArgs;
11
+ /**
12
+ * Создает экземпляр DelayedExecutor и подготавливает базовое состояние.
13
+ */
14
+ constructor(fn: (...args: T) => void, firstExecuteImmediately?: boolean);
15
+ /**
16
+ * Выполняет действие run в рамках ответственности DelayedExecutor.
17
+ */
18
+ run(args: T, delayMs?: number, maxWaitMs?: number): void;
19
+ /**
20
+ * Принудительно завершает накопленные изменения DelayedExecutor.
21
+ */
22
+ flush(): void;
23
+ /**
24
+ * Выполняет действие cancel в рамках ответственности DelayedExecutor.
25
+ */
26
+ cancel(): void;
27
+ /**
28
+ * Очищает накопленное состояние DelayedExecutor.
29
+ */
30
+ private clear;
31
+ }