trakked 1.0.0

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.
@@ -0,0 +1,328 @@
1
+ declare class TypedEvent<T> {
2
+ private readonly _handlers;
3
+ subscribe(handler: (event: T) => void): () => void;
4
+ unsubscribe(handler: (event: T) => void): void;
5
+ emit(event: T): void;
6
+ }
7
+
8
+ interface ITracked {
9
+ tracker: Tracker;
10
+ isDirty: boolean;
11
+ dirtyCounter: number;
12
+ validate(property: string, errorMessage: string | undefined): void;
13
+ destroy(): void;
14
+ }
15
+
16
+ declare enum PropertyType {
17
+ Boolean = 0,
18
+ String = 1,
19
+ Number = 2,
20
+ Collection = 3,
21
+ Object = 4,
22
+ Date = 5
23
+ }
24
+
25
+ declare class OperationProperties {
26
+ readonly trackedObject: ITracked;
27
+ readonly property: string | undefined;
28
+ readonly type: PropertyType;
29
+ readonly validator?: ((trackedObjects: any, newValue: any) => string | undefined) | undefined;
30
+ readonly noCoalesce?: boolean | undefined;
31
+ constructor(trackedObject: ITracked, property: string | undefined, type: PropertyType, validator?: ((trackedObjects: any, newValue: any) => string | undefined) | undefined, noCoalesce?: boolean | undefined);
32
+ }
33
+
34
+ declare class Change {
35
+ readonly number: number;
36
+ readonly redoAction: () => void;
37
+ readonly undoAction: () => void;
38
+ readonly properties: OperationProperties;
39
+ readonly time: Date;
40
+ constructor(number: number, redoAction: () => void, undoAction: () => void, properties: OperationProperties);
41
+ }
42
+
43
+ declare class Operation {
44
+ readonly time: Date;
45
+ readonly actions: Change[];
46
+ private _hasActions;
47
+ get hasActions(): boolean;
48
+ private set hasActions(value);
49
+ add(redoAction: () => void, undoAction: () => void, properties: OperationProperties): void;
50
+ updateOrAdd(redoAction: () => void, undoAction: () => void, properties: OperationProperties): void;
51
+ redo(): void;
52
+ undo(): void;
53
+ }
54
+
55
+ declare class TrackedCollection<T> implements Array<T>, ITracked {
56
+ readonly tracker: Tracker;
57
+ private readonly _validator?;
58
+ private _collection;
59
+ private _isDirty;
60
+ private _isValid;
61
+ private _dirtyCounter;
62
+ private _error;
63
+ get dirtyCounter(): number;
64
+ private set dirtyCounter(value);
65
+ get isDirty(): boolean;
66
+ private set isDirty(value);
67
+ get isValid(): boolean;
68
+ private set isValid(value);
69
+ get length(): number;
70
+ get lastItemIndex(): number | undefined;
71
+ get collection(): T[];
72
+ private set collection(value);
73
+ get [Symbol.iterator](): () => ArrayIterator<T>;
74
+ get [Symbol.unscopables](): {
75
+ [x: number]: boolean | undefined;
76
+ length?: boolean | undefined;
77
+ toString?: boolean | undefined;
78
+ toLocaleString?: boolean | undefined;
79
+ pop?: boolean | undefined;
80
+ push?: boolean | undefined;
81
+ concat?: boolean | undefined;
82
+ join?: boolean | undefined;
83
+ reverse?: boolean | undefined;
84
+ shift?: boolean | undefined;
85
+ slice?: boolean | undefined;
86
+ sort?: boolean | undefined;
87
+ splice?: boolean | undefined;
88
+ unshift?: boolean | undefined;
89
+ indexOf?: boolean | undefined;
90
+ lastIndexOf?: boolean | undefined;
91
+ every?: boolean | undefined;
92
+ some?: boolean | undefined;
93
+ forEach?: boolean | undefined;
94
+ map?: boolean | undefined;
95
+ filter?: boolean | undefined;
96
+ reduce?: boolean | undefined;
97
+ reduceRight?: boolean | undefined;
98
+ find?: boolean | undefined;
99
+ findIndex?: boolean | undefined;
100
+ fill?: boolean | undefined;
101
+ copyWithin?: boolean | undefined;
102
+ entries?: boolean | undefined;
103
+ keys?: boolean | undefined;
104
+ values?: boolean | undefined;
105
+ includes?: boolean | undefined;
106
+ flatMap?: boolean | undefined;
107
+ flat?: boolean | undefined;
108
+ at?: boolean | undefined;
109
+ findLast?: boolean | undefined;
110
+ findLastIndex?: boolean | undefined;
111
+ toReversed?: boolean | undefined;
112
+ toSorted?: boolean | undefined;
113
+ toSpliced?: boolean | undefined;
114
+ with?: boolean | undefined;
115
+ [Symbol.iterator]?: boolean | undefined;
116
+ readonly [Symbol.unscopables]?: boolean | undefined;
117
+ };
118
+ readonly changed: TypedEvent<TrackedCollectionChanged<T>>;
119
+ [n: number]: T;
120
+ get error(): string | undefined;
121
+ set error(value: string | undefined);
122
+ constructor(tracker: Tracker, items?: T[], _validator?: ((value: T[]) => string | undefined) | undefined);
123
+ validate(): void;
124
+ splice(start: number, deleteCount: number, ...items: T[]): T[];
125
+ private doSplice;
126
+ private trackRemovedObjectDeletions;
127
+ private trackAddedObjectInsertions;
128
+ private undoSplice;
129
+ reset(newItems: T[]): void;
130
+ reverse(): T[];
131
+ sort(compareFn?: (a: T, b: T) => number): this;
132
+ clear(): void;
133
+ remove(item: T): boolean;
134
+ replace(item: T, replace: T): boolean;
135
+ replaceAt(index: number, replace: T): void;
136
+ pop(): T | undefined;
137
+ push(...items: T[]): number;
138
+ concat(...items: (T | ConcatArray<T>)[]): T[];
139
+ join(separator?: string): string;
140
+ shift(): T | undefined;
141
+ slice(start?: number, end?: number): T[];
142
+ unshift(...items: T[]): number;
143
+ indexOf(searchElement: T, fromIndex?: number): number;
144
+ lastIndexOf(searchElement: T, fromIndex?: number): number;
145
+ every<S extends T>(predicate: (value: T, index: number, array: T[]) => value is S, thisArg?: any): this is S[];
146
+ every(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): boolean;
147
+ some(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): boolean;
148
+ forEach(callbackfn: (value: T, index: number, array: T[]) => void, thisArg?: any): void;
149
+ map<U>(callbackfn: (value: T, index: number, array: T[]) => U, thisArg?: any): U[];
150
+ filter(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T[];
151
+ find(predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any): T | undefined;
152
+ findIndex(predicate: (value: T, index: number, obj: T[]) => unknown, thisArg?: any): number;
153
+ flatMap<U, This = undefined>(callback: (this: This, value: T, index: number, array: T[]) => U | ReadonlyArray<U>, thisArg?: This): U[];
154
+ includes(searchElement: T, fromIndex?: number): boolean;
155
+ toString(): string;
156
+ toLocaleString(): string;
157
+ entries(): ArrayIterator<[number, T]>;
158
+ keys(): ArrayIterator<number>;
159
+ values(): ArrayIterator<T>;
160
+ at(index: number): T | undefined;
161
+ fill(value: T, start?: number, end?: number): this;
162
+ copyWithin(target: number, start: number, end?: number): this;
163
+ reduce(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T;
164
+ reduceRight(callbackfn: (previousValue: T, currentValue: T, currentIndex: number, array: T[]) => T, initialValue?: T): T;
165
+ flat<A, D extends number = 1>(this: A, depth?: D): FlatArray<A, D>[];
166
+ findLast(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): T | undefined;
167
+ findLastIndex(predicate: (value: T, index: number, array: T[]) => unknown, thisArg?: any): number;
168
+ toReversed(): T[];
169
+ toSorted(compareFn?: (a: T, b: T) => number): T[];
170
+ toSpliced(start: number, deleteCount: number, ...items: T[]): T[];
171
+ with(index: number, value: T): T[];
172
+ first(): T | undefined;
173
+ destroy(): void;
174
+ }
175
+ declare class TrackedCollectionChanged<T> {
176
+ readonly added: T[];
177
+ readonly removed: T[];
178
+ readonly newCollection: T[];
179
+ constructor(added: T[], removed: T[], newCollection: T[]);
180
+ }
181
+ declare global {
182
+ interface ArrayIterator<T> extends IterableIterator<T> {
183
+ map<U>(callback: (value: T) => U): ArrayIterator<U>;
184
+ filter(predicate: (value: T) => boolean): ArrayIterator<T>;
185
+ take(count: number): ArrayIterator<T>;
186
+ drop(count: number): ArrayIterator<T>;
187
+ flatMap<U>(callback: (value: T) => U[]): ArrayIterator<U>;
188
+ reduce<U>(callback: (acc: U, value: T) => U, initialValue: U): U;
189
+ toArray(): T[];
190
+ forEach(callback: (value: T) => void): void;
191
+ some(predicate: (value: T) => boolean): boolean;
192
+ every(predicate: (value: T) => boolean): boolean;
193
+ find(predicate: (value: T) => boolean): T | undefined;
194
+ }
195
+ }
196
+
197
+ interface ExternalAssignment {
198
+ placeholder: number;
199
+ value: number;
200
+ }
201
+ declare function ExternallyAssigned<This extends object, Value>(_target: undefined, context: ClassFieldDecoratorContext<This, Value>): void;
202
+
203
+ declare abstract class TrackedObjectBase implements ITracked {
204
+ readonly tracker: Tracker;
205
+ private _dirtyCounter;
206
+ private _validationMessages;
207
+ private _isValid;
208
+ get validationMessages(): Map<string, string | undefined>;
209
+ private set validationMessages(value);
210
+ get isValid(): boolean;
211
+ private set isValid(value);
212
+ get isDirty(): boolean;
213
+ get dirtyCounter(): number;
214
+ protected set dirtyCounter(value: number);
215
+ constructor(tracker: Tracker);
216
+ abstract onCommitted(lastOp?: Operation): void;
217
+ abstract markDeletion(): void;
218
+ abstract markAsNew(): void;
219
+ applyExternalAssignments(keys: ExternalAssignment[], lastOp?: Operation): void;
220
+ validate(property: string, errorMessage: string | undefined): void;
221
+ destroy(): void;
222
+ }
223
+
224
+ declare class Tracker {
225
+ private _currentOperation;
226
+ private readonly _redoOperations;
227
+ private readonly _undoOperations;
228
+ private _commitStateOperation;
229
+ private _isDirty;
230
+ private _canUndo;
231
+ private _canRedo;
232
+ private _suppressTrackingCounter;
233
+ private _currentOperationOwner;
234
+ private _currentOperationPropertyName;
235
+ private _isValid;
236
+ private _canCommit;
237
+ private _externallyAssignedPlaceholderCounter;
238
+ readonly coalescingWindowMs: number | undefined;
239
+ readonly trackedObjects: TrackedObjectBase[];
240
+ readonly trackedCollections: TrackedCollection<any>[];
241
+ get isDirty(): boolean;
242
+ set isDirty(value: boolean);
243
+ readonly isDirtyChanged: TypedEvent<boolean>;
244
+ get isValid(): boolean;
245
+ private set isValid(value);
246
+ readonly isValidChanged: TypedEvent<boolean>;
247
+ get canCommit(): boolean;
248
+ private set canCommit(value);
249
+ readonly canCommitChanged: TypedEvent<boolean>;
250
+ private updateCanCommit;
251
+ get canUndo(): boolean;
252
+ private set canUndo(value);
253
+ get canRedo(): boolean;
254
+ private set canRedo(value);
255
+ get isTrackingSuppressed(): boolean;
256
+ constructor(coalescingWindowMs?: number | undefined);
257
+ trackObject(trackedObject: TrackedObjectBase): void;
258
+ untrackObject(trackedObject: TrackedObjectBase): void;
259
+ trackCollection(trackedCollection: TrackedCollection<any>): void;
260
+ untrackCollection(trackedCollection: TrackedCollection<any>): void;
261
+ withTrackingSuppressed(action: () => void): void;
262
+ beginSuppressTracking(): void;
263
+ endSuppressTracking(): void;
264
+ doAndTrack(redoAction: () => void, undoAction: () => void, properties: OperationProperties): void;
265
+ private isEndingCurrentOperation;
266
+ private isStartingNewOperation;
267
+ private shouldCoalesceChanges;
268
+ private isCoalescibleType;
269
+ private hasLastOperation;
270
+ private lastOperationTargetsSameProperty;
271
+ private lastActionIsRecent;
272
+ onCommit(keys?: ExternalAssignment[]): void;
273
+ isInUndoStack(op: Operation): boolean;
274
+ beforeCommit(): void;
275
+ private reset;
276
+ undo(): void;
277
+ redo(): void;
278
+ revalidate(): void;
279
+ }
280
+
281
+ declare enum ObjectState {
282
+ New = "New",
283
+ Unchanged = "Unchanged",
284
+ Edited = "Edited",
285
+ Deleted = "Deleted"
286
+ }
287
+
288
+ declare abstract class TrackedObject extends TrackedObjectBase {
289
+ _committedState: ObjectState;
290
+ get state(): ObjectState;
291
+ constructor(tracker: Tracker, initialState?: ObjectState);
292
+ onCommitted(_lastOp?: Operation): void;
293
+ markDeletion(): void;
294
+ markAsNew(): void;
295
+ }
296
+
297
+ declare enum VersionedObjectState {
298
+ New = "New",
299
+ Unchanged = "Unchanged",
300
+ Edited = "Edited",
301
+ Deleted = "Deleted",
302
+ InsertReverted = "InsertReverted",
303
+ EditReverted = "EditReverted",
304
+ DeleteReverted = "DeleteReverted"
305
+ }
306
+
307
+ declare abstract class VersionedTrackedObject extends TrackedObjectBase {
308
+ _committedState: VersionedObjectState;
309
+ readonly pendingHardDeletes: Set<number>;
310
+ get state(): VersionedObjectState;
311
+ constructor(tracker: Tracker, initialState?: VersionedObjectState);
312
+ onCommitted(lastOp?: Operation): void;
313
+ applyExternalAssignments(keys: ExternalAssignment[], lastOp?: Operation): void;
314
+ markAsNew(): void;
315
+ markDeletion(): void;
316
+ private revertedStateFor;
317
+ }
318
+
319
+ declare function InitializeTracked<T extends new (...args: any[]) => any>(target: T, context: ClassDecoratorContext): T;
320
+
321
+ declare function Tracked<T extends TrackedObjectBase, V>(validator?: (self: T, newValue: V) => string | undefined, options?: {
322
+ noCoalesce?: boolean;
323
+ }): {
324
+ (target: ClassAccessorDecoratorTarget<T, V>, context: ClassAccessorDecoratorContext): ClassAccessorDecoratorResult<T, V>;
325
+ (target: (this: T, value: V) => void, context: ClassSetterDecoratorContext): (this: T, value: V) => void;
326
+ };
327
+
328
+ export { ExternallyAssigned, type ExternalAssignment as ExternallyAssignment, type ITracked, InitializeTracked, ObjectState, OperationProperties, PropertyType, Tracked, TrackedCollection, TrackedCollectionChanged, TrackedObject, TrackedObjectBase, Tracker, TypedEvent, VersionedObjectState, VersionedTrackedObject };