trakked 1.1.0 → 1.2.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.
- package/README.md +34 -0
- package/dist/dev/index.cjs +58 -0
- package/dist/dev/index.cjs.map +1 -1
- package/dist/dev/index.d.cts +8 -0
- package/dist/dev/index.d.ts +8 -0
- package/dist/dev/index.js +58 -0
- package/dist/dev/index.js.map +1 -1
- package/dist/prod/index.cjs +58 -0
- package/dist/prod/index.cjs.map +1 -1
- package/dist/prod/index.js +58 -0
- package/dist/prod/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -229,6 +229,8 @@ const tracker = new Tracker(undefined); // coalescing disabled
|
|
|
229
229
|
| `isDirtyChanged` | `TypedEvent<boolean>` | Fires whenever `isDirty` changes |
|
|
230
230
|
| `isValidChanged` | `TypedEvent<boolean>` | Fires whenever `isValid` changes |
|
|
231
231
|
| `canCommitChanged` | `TypedEvent<boolean>` | Fires whenever `canCommit` changes |
|
|
232
|
+
| `version` | `number` | Monotonically changing counter — starts at `0`, increments on every new operation, decrements on undo, increments on redo |
|
|
233
|
+
| `versionChanged` | `TypedEvent<number>` | Fires with the new version every time `version` changes |
|
|
232
234
|
| `trackedObjects` | `TrackedObjectBase[]` | All registered models |
|
|
233
235
|
| `trackedCollections` | `TrackedCollection<any>[]` | All registered collections |
|
|
234
236
|
|
|
@@ -336,6 +338,38 @@ function openEditModal(model: PersonModel) {
|
|
|
336
338
|
}
|
|
337
339
|
```
|
|
338
340
|
|
|
341
|
+
**React integration — `useSyncExternalStore`**
|
|
342
|
+
|
|
343
|
+
`version` and `versionChanged` are designed to plug directly into React's `useSyncExternalStore`. Subscribe to `versionChanged` as the store and snapshot `tracker.version` — any component that calls the hook will automatically re-render on every tracked mutation, undo, or redo with no bridging code required:
|
|
344
|
+
|
|
345
|
+
```typescript
|
|
346
|
+
import { useSyncExternalStore } from 'react';
|
|
347
|
+
import { Tracker } from 'trakked';
|
|
348
|
+
|
|
349
|
+
function useTrackerVersion(tracker: Tracker): number {
|
|
350
|
+
return useSyncExternalStore(
|
|
351
|
+
(onStoreChange) => tracker.versionChanged.subscribe(onStoreChange),
|
|
352
|
+
() => tracker.version,
|
|
353
|
+
);
|
|
354
|
+
}
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
Any component that calls `useTrackerVersion(tracker)` will re-render whenever the tracker's state changes.
|
|
358
|
+
|
|
359
|
+
```tsx
|
|
360
|
+
function InvoiceForm({ tracker, invoice }: { tracker: Tracker; invoice: InvoiceModel }) {
|
|
361
|
+
useTrackerVersion(tracker); // re-renders on every mutation, undo, or redo
|
|
362
|
+
|
|
363
|
+
return (
|
|
364
|
+
<form>
|
|
365
|
+
<input value={invoice.status} onChange={(e) => { invoice.status = e.target.value; }} />
|
|
366
|
+
<button disabled={!tracker.canUndo} onClick={() => tracker.undo()}>Undo</button>
|
|
367
|
+
<button disabled={!tracker.canCommit} onClick={save}>Save</button>
|
|
368
|
+
</form>
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
```
|
|
372
|
+
|
|
339
373
|
---
|
|
340
374
|
|
|
341
375
|
### `TrackedObject`
|
package/dist/dev/index.cjs
CHANGED
|
@@ -277,9 +277,11 @@ var Tracker = class {
|
|
|
277
277
|
this._externallyAssignedPlaceholderCounter = -1;
|
|
278
278
|
this._invalidCount = 0;
|
|
279
279
|
this._constructionDepth = 0;
|
|
280
|
+
this._version = 0;
|
|
280
281
|
this.trackedObjects = [];
|
|
281
282
|
this.trackedCollections = [];
|
|
282
283
|
this.isDirtyChanged = new TypedEvent();
|
|
284
|
+
this.versionChanged = new TypedEvent();
|
|
283
285
|
this.isValidChanged = new TypedEvent();
|
|
284
286
|
this.canCommitChanged = new TypedEvent();
|
|
285
287
|
this.coalescingWindowMs = coalescingWindowMs;
|
|
@@ -306,6 +308,9 @@ var Tracker = class {
|
|
|
306
308
|
this.updateCanCommit();
|
|
307
309
|
}
|
|
308
310
|
}
|
|
311
|
+
get version() {
|
|
312
|
+
return this._version;
|
|
313
|
+
}
|
|
309
314
|
get isValid() {
|
|
310
315
|
return this._isValid;
|
|
311
316
|
}
|
|
@@ -414,6 +419,8 @@ var Tracker = class {
|
|
|
414
419
|
this._undoOperations.push(this._currentOperation);
|
|
415
420
|
this._redoOperations.length = 0;
|
|
416
421
|
this.reset();
|
|
422
|
+
this._version++;
|
|
423
|
+
this.versionChanged.emit(this._version);
|
|
417
424
|
}
|
|
418
425
|
}
|
|
419
426
|
this._currentOperation?.add(
|
|
@@ -493,6 +500,53 @@ var Tracker = class {
|
|
|
493
500
|
this.canRedo = this._redoOperations.length > 0;
|
|
494
501
|
this.isDirty = CollectionUtilities.getLast(this._undoOperations) !== this._commitStateOperation;
|
|
495
502
|
}
|
|
503
|
+
startCoalescing() {
|
|
504
|
+
if (this._composingBaseIndex !== void 0) return;
|
|
505
|
+
this._composingBaseIndex = this._undoOperations.length;
|
|
506
|
+
this._composingRedoLength = this._redoOperations.length;
|
|
507
|
+
}
|
|
508
|
+
endCoalescing() {
|
|
509
|
+
if (this._composingBaseIndex === void 0) return;
|
|
510
|
+
const composed = this._undoOperations.splice(this._composingBaseIndex);
|
|
511
|
+
this._redoOperations.splice(this._composingRedoLength);
|
|
512
|
+
this._composingBaseIndex = void 0;
|
|
513
|
+
this._composingRedoLength = void 0;
|
|
514
|
+
if (composed.length === 0) {
|
|
515
|
+
this.reset();
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
if (composed.length === 1) {
|
|
519
|
+
this._undoOperations.push(composed[0]);
|
|
520
|
+
this.reset();
|
|
521
|
+
return;
|
|
522
|
+
}
|
|
523
|
+
const merged = new Operation();
|
|
524
|
+
for (const op of composed) {
|
|
525
|
+
for (const action of op.actions) {
|
|
526
|
+
merged.add(action.redoAction, action.undoAction, action.properties);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
this._undoOperations.push(merged);
|
|
530
|
+
this.reset();
|
|
531
|
+
}
|
|
532
|
+
rollbackCoalescing() {
|
|
533
|
+
if (this._composingBaseIndex === void 0) return;
|
|
534
|
+
const toRevert = this._undoOperations.splice(this._composingBaseIndex);
|
|
535
|
+
this._redoOperations.splice(this._composingRedoLength);
|
|
536
|
+
this._composingBaseIndex = void 0;
|
|
537
|
+
this._composingRedoLength = void 0;
|
|
538
|
+
this.withTrackingSuppressed(() => {
|
|
539
|
+
for (let i = toRevert.length - 1; i >= 0; i--) {
|
|
540
|
+
toRevert[i].undo();
|
|
541
|
+
}
|
|
542
|
+
});
|
|
543
|
+
this.reset();
|
|
544
|
+
this.revalidate();
|
|
545
|
+
if (toRevert.length > 0) {
|
|
546
|
+
this._version -= toRevert.length;
|
|
547
|
+
this.versionChanged.emit(this._version);
|
|
548
|
+
}
|
|
549
|
+
}
|
|
496
550
|
undo() {
|
|
497
551
|
if (!this.canUndo) {
|
|
498
552
|
return;
|
|
@@ -502,6 +556,8 @@ var Tracker = class {
|
|
|
502
556
|
this._redoOperations.push(undoOperation);
|
|
503
557
|
this.reset();
|
|
504
558
|
this.revalidate();
|
|
559
|
+
this._version--;
|
|
560
|
+
this.versionChanged.emit(this._version);
|
|
505
561
|
}
|
|
506
562
|
redo() {
|
|
507
563
|
if (!this.canRedo) {
|
|
@@ -512,6 +568,8 @@ var Tracker = class {
|
|
|
512
568
|
this._undoOperations.push(redoOperation);
|
|
513
569
|
this.reset();
|
|
514
570
|
this.revalidate();
|
|
571
|
+
this._version++;
|
|
572
|
+
this.versionChanged.emit(this._version);
|
|
515
573
|
}
|
|
516
574
|
revalidate() {
|
|
517
575
|
this.trackedObjects.forEach((x) => validate(x));
|
package/dist/dev/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/TypedEvent.ts","../../src/Change.ts","../../src/Operation.ts","../../src/PropertyType.ts","../../src/CollectionUtilities.ts","../../src/ExternallyAssigned.ts","../../src/DependencyTracker.ts","../../src/Registry.ts","../../src/Tracker.ts","../../src/OperationProperties.ts","../../src/TrackedObjectBase.ts","../../src/ObjectState.ts","../../src/TrackedObject.ts","../../src/VersionedObjectState.ts","../../src/VersionedTrackedObject.ts","../../src/Tracked.ts","../../src/TrackedCollection.ts"],"sourcesContent":["export { Tracker } from './Tracker.js'\nexport { TrackedObjectBase } from './TrackedObjectBase.js'\nexport { TrackedObject } from './TrackedObject.js'\nexport { VersionedTrackedObject } from './VersionedTrackedObject.js'\nexport { Tracked } from './Tracked.js'\nexport { TrackedCollection, TrackedCollectionChanged } from './TrackedCollection.js'\nexport { ITracked } from './ITracked.js'\nexport { ExternallyAssigned } from './ExternallyAssigned.js'\nexport type { ExternalAssignment as ExternallyAssignment } from './ExternallyAssigned.js'\nexport { OperationProperties } from './OperationProperties.js'\nexport { PropertyType } from './PropertyType.js'\nexport { TypedEvent } from './TypedEvent.js'\nexport { ObjectState } from './ObjectState.js'\nexport { VersionedObjectState } from './VersionedObjectState.js'\n","export class TypedEvent<T> {\n private readonly _handlers: ((event: T) => void)[] = [];\n\n public subscribe(handler: (event: T) => void): () => void {\n this._handlers.push(handler);\n return () => this.unsubscribe(handler);\n }\n\n public unsubscribe(handler: (event: T) => void): void {\n const index = this._handlers.indexOf(handler);\n if (index >= 0) {\n this._handlers.splice(index, 1);\n }\n }\n\n public emit(event: T): void {\n this._handlers.forEach((h) => h(event));\n }\n}\n","import { OperationProperties } from \"./OperationProperties\";\n\nexport class Change {\n public readonly time: Date = new Date();\n\n constructor(\n public readonly number: number,\n public readonly redoAction: () => void,\n public readonly undoAction: () => void,\n public readonly properties: OperationProperties,\n ) {}\n}\n","import { Change } from \"./Change\";\nimport { OperationProperties } from \"./OperationProperties\";\n\nexport class Operation {\n public readonly time: Date = new Date();\n public readonly actions: Change[] = [];\n private _hasActions: boolean = false;\n public get hasActions(): boolean {\n return this._hasActions;\n }\n private set hasActions(value: boolean) {\n this._hasActions = value;\n }\n\n public add(\n redoAction: () => void,\n undoAction: () => void,\n properties: OperationProperties,\n ): void {\n const action = new Change(\n this.actions.length,\n redoAction,\n undoAction,\n properties,\n );\n this.actions.push(action);\n this.hasActions = true;\n }\n\n public updateOrAdd(\n redoAction: () => void,\n undoAction: () => void,\n properties: OperationProperties,\n ): void {\n const idx = this.actions.findLastIndex(\n (c) =>\n c.properties.trackedObject === properties.trackedObject &&\n c.properties.property === properties.property,\n );\n if (idx >= 0) {\n this.actions[idx] = new Change(this.actions[idx].number, redoAction, undoAction, properties);\n } else {\n this.add(redoAction, undoAction, properties);\n }\n }\n\n public redo(): void {\n this.actions.reverse().forEach((x) => x.redoAction());\n }\n\n public undo(): void {\n this.actions.reverse().forEach((x) => x.undoAction());\n }\n}\n","\r\nexport enum PropertyType {\r\n Boolean = 0,\r\n String = 1,\r\n Number = 2,\r\n Collection = 3,\r\n Object = 4,\r\n Date = 5\r\n}\r\n","export class CollectionUtilities {\n public static getLast<T>(array: T[]): T | undefined {\n return array.length > 0 ? array[array.length - 1] : undefined;\n }\n}\n","export interface ExternalAssignment {\n placeholder: number;\n value: number;\n}\n\nconst EXTERNALLY_ASSIGNED = Symbol(\"externallyAssigned\");\n\nexport function ExternallyAssigned<This extends object, Value>(\n _target: undefined,\n context: ClassFieldDecoratorContext<This, Value>,\n): void {\n context.addInitializer(function (this: This) {\n Object.defineProperty(Object.getPrototypeOf(this), EXTERNALLY_ASSIGNED, {\n value: String(context.name),\n configurable: true,\n });\n });\n}\n\nexport function getExternallyAssignedProperty(\n proto: object,\n): string | undefined {\n return EXTERNALLY_ASSIGNED in proto\n ? ((proto as any)[EXTERNALLY_ASSIGNED] as string)\n : undefined;\n}\n","import { ITracked } from \"./ITracked\";\n\nexport type DepMap = Map<object, Set<string>>;\n\n// Special property key used to represent \"any structural change\" in a TrackedCollection.\nexport const COLLECTION_VERSION_KEY = \"__version__\";\n\nlet collector: DepMap | null = null;\n\n// Forward: validatedObj → validatorProp → DepMap (what the validator read)\nconst forwardDeps = new WeakMap<object, Map<string, DepMap>>();\n\n// Reverse: depObj → depProp → [{validatedObj, validatorProp}]\nconst reverseDeps = new Map<\n object,\n Map<string, Array<{ obj: ITracked; prop: string }>>\n>();\n\nexport const DependencyTracker = {\n isActive(): boolean {\n return collector !== null;\n },\n\n record(object: object, property: string): void {\n if (!collector) return;\n let props = collector.get(object);\n if (!props) {\n props = new Set<string>();\n collector.set(object, props);\n }\n props.add(property);\n },\n\n collect(fn: () => void): DepMap {\n collector = new Map<object, Set<string>>();\n fn();\n const deps = collector;\n collector = null;\n return deps;\n },\n\n updateDeps(validatedObj: ITracked, validatorProp: string, newDeps: DepMap): void {\n // Remove old reverse entries for this validator\n const objForward = forwardDeps.get(validatedObj);\n const oldDeps = objForward?.get(validatorProp);\n if (oldDeps) {\n oldDeps.forEach((props, depObj) => {\n const propMap = reverseDeps.get(depObj);\n if (!propMap) return;\n props.forEach((prop) => {\n const list = propMap.get(prop);\n if (!list) return;\n const idx = list.findIndex(\n (x) => x.obj === validatedObj && x.prop === validatorProp,\n );\n if (idx >= 0) list.splice(idx, 1);\n });\n });\n }\n\n // Store new forward deps\n let fwd = forwardDeps.get(validatedObj);\n if (!fwd) {\n fwd = new Map<string, DepMap>();\n forwardDeps.set(validatedObj, fwd);\n }\n fwd.set(validatorProp, newDeps);\n\n // Add new reverse entries\n newDeps.forEach((props, depObj) => {\n let propMap = reverseDeps.get(depObj);\n if (!propMap) {\n propMap = new Map<string, Array<{ obj: ITracked; prop: string }>>();\n reverseDeps.set(depObj, propMap);\n }\n props.forEach((prop) => {\n let list = propMap!.get(prop);\n if (!list) {\n list = [];\n propMap!.set(prop, list);\n }\n if (!list.some((x) => x.obj === validatedObj && x.prop === validatorProp)) {\n list.push({ obj: validatedObj, prop: validatorProp });\n }\n });\n });\n },\n\n getDependents(\n depObj: object,\n depProp: string,\n ): Array<{ obj: ITracked; prop: string }> {\n return reverseDeps.get(depObj)?.get(depProp) ?? [];\n },\n\n clearDeps(validatedObj: ITracked): void {\n const objForward = forwardDeps.get(validatedObj);\n if (!objForward) return;\n objForward.forEach((depMap) => {\n depMap.forEach((props, depObj) => {\n const propMap = reverseDeps.get(depObj);\n if (!propMap) return;\n props.forEach((prop) => {\n const list = propMap.get(prop);\n if (!list) return;\n const idx = list.findIndex((x) => x.obj === validatedObj);\n if (idx >= 0) list.splice(idx, 1);\n });\n });\n });\n forwardDeps.delete(validatedObj);\n },\n};\n","import { ITracked as ITrackedItem } from \"./ITracked\";\nimport { DependencyTracker } from \"./DependencyTracker\";\n\ntype ValidatorMap = Map<string, (model: any) => string | undefined>;\nconst VALIDATORS = Symbol(\"validators\");\n\nexport function registerPropertyValidator(\n proto: object,\n property: string,\n validator: (model: any) => string | undefined,\n): void {\n if (!(VALIDATORS in proto)) {\n Object.defineProperty(proto, VALIDATORS, {\n value: new Map<string, (model: any) => string | undefined>(),\n configurable: true,\n });\n }\n const map = (proto as any)[VALIDATORS] as ValidatorMap;\n if (!map.has(property)) {\n map.set(property, validator);\n }\n}\n\nexport function validate(tracked: ITrackedItem): void {\n const proto = Object.getPrototypeOf(tracked);\n if (!(VALIDATORS in proto)) return;\n const validators = (proto as any)[VALIDATORS] as ValidatorMap;\n const messages = new Map<string, string>();\n validators.forEach((validatorFn, property) => {\n const deps = DependencyTracker.collect(() => {\n const error = validatorFn(tracked);\n if (error !== undefined) messages.set(property, error);\n });\n DependencyTracker.updateDeps(tracked, property, deps);\n });\n tracked.applyValidation(messages);\n}\n\nexport function validateSingleProperty(\n tracked: ITrackedItem,\n property: string,\n): string | undefined {\n const proto = Object.getPrototypeOf(tracked);\n if (!(VALIDATORS in proto)) return undefined;\n const validators = (proto as any)[VALIDATORS] as ValidatorMap;\n const validatorFn = validators.get(property);\n if (!validatorFn) return undefined;\n let error: string | undefined;\n const deps = DependencyTracker.collect(() => {\n error = validatorFn(tracked);\n });\n DependencyTracker.updateDeps(tracked, property, deps);\n return error;\n}\n","import { TypedEvent } from \"./TypedEvent\";\nimport { Operation } from \"./Operation\";\nimport { TrackedCollection } from \"./TrackedCollection\";\nimport { OperationProperties } from \"./OperationProperties\";\nimport { PropertyType } from \"./PropertyType\";\nimport { CollectionUtilities } from \"./CollectionUtilities\";\nimport {\n ExternalAssignment,\n getExternallyAssignedProperty,\n} from \"./ExternallyAssigned\";\nimport { validate, validateSingleProperty } from \"./Registry\";\nimport { DependencyTracker, COLLECTION_VERSION_KEY } from \"./DependencyTracker\";\nimport { ITracked } from \"./ITracked\";\nimport { TrackedObjectBase } from \"./TrackedObjectBase\";\n\nexport class Tracker {\n private _currentOperation: Operation | undefined;\n private readonly _redoOperations: Operation[];\n private readonly _undoOperations: Operation[];\n private _commitStateOperation: Operation | undefined;\n private _isDirty: boolean;\n private _canUndo: boolean;\n private _canRedo: boolean;\n private _suppressTrackingCounter = 0;\n private _currentOperationOwner: ITracked | undefined;\n private _currentOperationPropertyName: string | undefined;\n private _isValid: boolean;\n private _canCommit: boolean;\n private _externallyAssignedPlaceholderCounter = -1;\n private _invalidCount = 0;\n private _constructionDepth = 0;\n\n public readonly coalescingWindowMs: number | undefined;\n\n public readonly trackedObjects: TrackedObjectBase[] = [];\n\n public readonly trackedCollections: TrackedCollection<any>[] = [];\n\n public get isDirty(): boolean {\n return this._isDirty;\n }\n public set isDirty(value: boolean) {\n if (this._isDirty !== value) {\n this._isDirty = value;\n this.isDirtyChanged.emit(value);\n this.updateCanCommit();\n }\n }\n\n public readonly isDirtyChanged: TypedEvent<boolean> = new TypedEvent<boolean>();\n\n public get isValid(): boolean {\n return this._isValid;\n }\n private set isValid(value: boolean) {\n if (this._isValid !== value) {\n this._isValid = value;\n this.isValidChanged.emit(value);\n this.updateCanCommit();\n }\n }\n\n public readonly isValidChanged: TypedEvent<boolean> = new TypedEvent<boolean>();\n\n public get canCommit(): boolean {\n return this._canCommit;\n }\n private set canCommit(value: boolean) {\n if (this._canCommit !== value) {\n this._canCommit = value;\n this.canCommitChanged.emit(value);\n }\n }\n\n public readonly canCommitChanged: TypedEvent<boolean> = new TypedEvent<boolean>();\n\n private updateCanCommit(): void {\n this.canCommit = this._isDirty && this._isValid;\n }\n\n public get canUndo(): boolean {\n return this._canUndo;\n }\n private set canUndo(value: boolean) {\n this._canUndo = value;\n }\n\n public get canRedo(): boolean {\n return this._canRedo;\n }\n private set canRedo(value: boolean) {\n this._canRedo = value;\n }\n\n public get isTrackingSuppressed(): boolean {\n return this._suppressTrackingCounter > 0;\n }\n\n public get isConstructing(): boolean {\n return this._constructionDepth > 0;\n }\n\n public constructor(coalescingWindowMs: number | undefined = 3000) {\n this.coalescingWindowMs = coalescingWindowMs;\n this._currentOperation = undefined;\n this._redoOperations = [];\n this._undoOperations = [];\n this._commitStateOperation = undefined;\n this._isDirty = false;\n this._canUndo = false;\n this._canRedo = false;\n this._suppressTrackingCounter = 0;\n this._currentOperationOwner = undefined;\n this._currentOperationPropertyName = undefined;\n this._isValid = true;\n this._canCommit = false;\n }\n\n public trackObject(trackedObject: TrackedObjectBase) {\n this.trackedObjects.push(trackedObject);\n }\n\n public untrackObject(trackedObject: TrackedObjectBase) {\n this.trackedObjects.splice(this.trackedObjects.indexOf(trackedObject), 1);\n if (!trackedObject.isValid) this._invalidCount--;\n this.isValid = this._invalidCount === 0;\n }\n\n public trackCollection(trackedCollection: TrackedCollection<any>): void {\n this.trackedCollections.push(trackedCollection);\n }\n\n public untrackCollection(trackedCollection: TrackedCollection<any>) {\n this.trackedCollections.splice(\n this.trackedCollections.indexOf(trackedCollection),\n 1,\n );\n if (!trackedCollection.isValid) this._invalidCount--;\n this.isValid = this._invalidCount === 0;\n }\n\n public onValidityChanged(wasValid: boolean, isNowValid: boolean): void {\n if (wasValid && !isNowValid) this._invalidCount++;\n else if (!wasValid && isNowValid) this._invalidCount--;\n if (!this.isTrackingSuppressed) {\n this.isValid = this._invalidCount === 0;\n }\n }\n\n public construct<T>(action: () => T): T {\n const objectsBefore = this.trackedObjects.length;\n this._constructionDepth++;\n this._suppressTrackingCounter++;\n const result = action();\n for (let i = objectsBefore; i < this.trackedObjects.length; i++) {\n validate(this.trackedObjects[i]);\n }\n this._suppressTrackingCounter--;\n this._constructionDepth--;\n this.isValid = this._invalidCount === 0;\n return result;\n }\n\n public withTrackingSuppressed(action: () => void): void {\n this._suppressTrackingCounter++;\n action();\n this._suppressTrackingCounter--;\n }\n\n public beginSuppressTracking(): void {\n this._suppressTrackingCounter++;\n }\n\n public endSuppressTracking(): void {\n this._suppressTrackingCounter--;\n }\n\n public doAndTrack(\n redoAction: () => void,\n undoAction: () => void,\n properties: OperationProperties,\n ): void {\n if (this.isTrackingSuppressed) {\n redoAction();\n if (!this.isConstructing) {\n this.revalidateTargeted(properties.trackedObject, properties.property);\n }\n return;\n }\n\n if (this.isStartingNewOperation()) {\n this._currentOperationOwner = properties.trackedObject;\n this._currentOperationPropertyName = properties.property;\n\n if (this.shouldCoalesceChanges(properties)) {\n this._currentOperation = CollectionUtilities.getLast(this._undoOperations)!;\n } else {\n this._currentOperation = new Operation();\n this._undoOperations.push(this._currentOperation);\n this._redoOperations.length = 0;\n this.reset();\n }\n }\n\n this._currentOperation?.add(\n () => redoAction(),\n () => undoAction(),\n properties,\n );\n redoAction();\n\n if (this.isEndingCurrentOperation(properties)) {\n this._currentOperation = undefined;\n this._currentOperationOwner = undefined;\n this._currentOperationPropertyName = undefined;\n this.revalidateTargeted(properties.trackedObject, properties.property);\n }\n }\n\n private revalidateTargeted(changedObj: ITracked, changedProp: string | undefined): void {\n const depKey = changedProp ?? COLLECTION_VERSION_KEY;\n const dependents = [...DependencyTracker.getDependents(changedObj, depKey)];\n for (const { obj, prop } of dependents) {\n const error = validateSingleProperty(obj, prop);\n obj.validate(prop, error);\n }\n if (changedProp === undefined) {\n (changedObj as TrackedCollection<any>).validate();\n }\n this.isValid = this._invalidCount === 0;\n }\n\n private isEndingCurrentOperation(properties: OperationProperties) {\n return this._currentOperationOwner === properties.trackedObject &&\n this._currentOperationPropertyName === properties.property;\n }\n\n private isStartingNewOperation() {\n return this._currentOperationOwner === undefined &&\n this._currentOperationPropertyName === undefined;\n }\n\n private shouldCoalesceChanges(properties: OperationProperties): boolean {\n const lastOperation = CollectionUtilities.getLast(this._undoOperations);\n return (\n this.isCoalescibleType(properties) &&\n this.hasLastOperation(lastOperation) &&\n this.lastOperationTargetsSameProperty(lastOperation!, properties) &&\n this.lastActionIsRecent(lastOperation!)\n );\n }\n\n private isCoalescibleType(properties: OperationProperties): boolean {\n return (\n !properties.noCoalesce &&\n (properties.type === PropertyType.String ||\n properties.type === PropertyType.Number)\n );\n }\n\n private hasLastOperation(lastOperation: Operation | undefined): boolean {\n return !!lastOperation;\n }\n\n private lastOperationTargetsSameProperty(lastOperation: Operation, properties: OperationProperties): boolean {\n return lastOperation.actions.every(\n (x) =>\n x.properties.trackedObject === properties.trackedObject &&\n x.properties.property === properties.property,\n );\n }\n\n private lastActionIsRecent(lastOperation: Operation): boolean {\n if (this.coalescingWindowMs === undefined) return false;\n return (\n new Date().getTime() -\n CollectionUtilities.getLast(lastOperation.actions)!.time.getTime() <\n this.coalescingWindowMs\n );\n }\n\n public onCommit(keys?: ExternalAssignment[]): void {\n const lastOp = CollectionUtilities.getLast(this._undoOperations);\n if (keys) {\n this.trackedObjects.forEach((obj) => obj.applyExternalAssignments(keys, lastOp));\n }\n this.trackedObjects.forEach((obj) => obj.onCommitted(lastOp));\n this._commitStateOperation = lastOp;\n this.reset();\n }\n\n public isInUndoStack(op: Operation): boolean {\n return this._undoOperations.includes(op);\n }\n\n public beforeCommit() {\n this.trackedObjects.forEach((model) => {\n const propertyName = getExternallyAssignedProperty(\n Object.getPrototypeOf(model),\n );\n if (propertyName && (model as any)[propertyName] <= 0) {\n (model as any)[propertyName] = this._externallyAssignedPlaceholderCounter--;\n }\n });\n }\n\n private reset(): void {\n this.canUndo = this._undoOperations.length > 0;\n this.canRedo = this._redoOperations.length > 0;\n this.isDirty =\n CollectionUtilities.getLast(this._undoOperations) !==\n this._commitStateOperation;\n }\n\n public undo(): void {\n if (!this.canUndo) {\n return;\n }\n\n const undoOperation = this._undoOperations.pop()!;\n this.withTrackingSuppressed(() => undoOperation.undo());\n this._redoOperations.push(undoOperation);\n\n this.reset();\n this.revalidate();\n }\n\n public redo(): void {\n if (!this.canRedo) {\n return;\n }\n\n const redoOperation = this._redoOperations.pop()!;\n this.withTrackingSuppressed(() => redoOperation.redo());\n this._undoOperations.push(redoOperation);\n\n this.reset();\n this.revalidate();\n }\n\n public revalidate(): void {\n this.trackedObjects.forEach((x) => validate(x));\n this.trackedCollections.forEach((x) => x.validate());\n this.isValid = this._invalidCount === 0;\n }\n}\n","import { ITracked } from \"./ITracked\";\nimport { PropertyType } from \"./PropertyType\";\n\nexport class OperationProperties {\n constructor(\n public readonly trackedObject: ITracked,\n public readonly property: string | undefined,\n public readonly type: PropertyType,\n public readonly validator?: (\n trackedObjects: any,\n newValue: any,\n ) => string | undefined,\n public readonly noCoalesce?: boolean,\n ) {}\n}","import { Tracker } from \"./Tracker\";\nimport { validate } from \"./Registry\";\nimport { ITracked } from \"./ITracked\";\nimport { Operation } from \"./Operation\";\nimport { OperationProperties } from \"./OperationProperties\";\nimport { PropertyType } from \"./PropertyType\";\nimport { ExternalAssignment, getExternallyAssignedProperty } from \"./ExternallyAssigned\";\nimport { DependencyTracker } from \"./DependencyTracker\";\n\nexport abstract class TrackedObjectBase implements ITracked {\n private _dirtyCounter: number = 0;\n private _validationMessages: Map<string, string | undefined> | undefined;\n private _isValid: boolean = true;\n\n public get validationMessages(): Map<string, string | undefined> {\n return this._validationMessages ?? new Map<string, string>();\n }\n private set validationMessages(value: Map<string, string | undefined>) {\n this._validationMessages = value;\n }\n\n public get isValid(): boolean {\n return this._isValid;\n }\n private set isValid(value: boolean) {\n const wasValid = this._isValid;\n this._isValid = value;\n if (wasValid !== value) {\n this.tracker.onValidityChanged(wasValid, value);\n }\n }\n\n public get isDirty(): boolean {\n return this._dirtyCounter !== 0;\n }\n\n public get dirtyCounter(): number {\n return this._dirtyCounter;\n }\n protected set dirtyCounter(value: number) {\n this._dirtyCounter = value;\n }\n\n public constructor(public readonly tracker: Tracker) {\n if (process.env.NODE_ENV !== 'production' && !tracker.isConstructing) {\n throw new Error(`${this.constructor.name} must be created inside tracker.construct()`);\n }\n this.validationMessages = new Map<string, string>();\n tracker.trackObject(this);\n }\n\n public abstract onCommitted(lastOp?: Operation): void;\n public abstract markDeletion(): void;\n public abstract markAsNew(): void;\n\n public applyExternalAssignments(keys: ExternalAssignment[], lastOp?: Operation): void {\n const propertyName = getExternallyAssignedProperty(Object.getPrototypeOf(this));\n if (!propertyName || (this as any)[propertyName] >= 0) return;\n const response = keys.find((x) => x.placeholder === (this as any)[propertyName]);\n if (!response) return;\n const previousValue = (this as any)[propertyName];\n const newValue = response.value;\n const redoFn = () => { (this as any)[propertyName] = newValue; };\n const undoFn = () => { (this as any)[propertyName] = previousValue; };\n if (lastOp) {\n lastOp.add(redoFn, undoFn, new OperationProperties(this, propertyName, PropertyType.Number));\n }\n redoFn();\n }\n\n public validate(property: string, errorMessage: string | undefined): void {\n if (errorMessage) {\n this.validationMessages.set(property, errorMessage);\n } else {\n this.validationMessages.delete(property);\n }\n this.validationMessages = new Map(this.validationMessages);\n this.isValid = this.validationMessages.size === 0;\n }\n\n public applyValidation(messages: Map<string, string>): void {\n this.validationMessages = messages;\n this.isValid = messages.size === 0;\n }\n\n public destroy(): void {\n DependencyTracker.clearDeps(this);\n this.tracker.untrackObject(this);\n }\n}\n\nexport function validateDecorated(model: any): void {\n validate(model);\n}\n","export enum ObjectState {\n New = 'New',\n Unchanged = 'Unchanged',\n Edited = 'Edited',\n Deleted = 'Deleted',\n}\n","import { Tracker } from \"./Tracker\";\nimport { TrackedObjectBase } from \"./TrackedObjectBase\";\nimport { ObjectState } from \"./ObjectState\";\nimport { Operation } from \"./Operation\";\nimport { OperationProperties } from \"./OperationProperties\";\nimport { PropertyType } from \"./PropertyType\";\n\nexport abstract class TrackedObject extends TrackedObjectBase {\n public _committedState: ObjectState = ObjectState.Unchanged;\n\n public get state(): ObjectState {\n if (this._committedState === ObjectState.Unchanged && this.isDirty) {\n return ObjectState.Edited;\n }\n return this._committedState;\n }\n\n public constructor(tracker: Tracker, initialState: ObjectState = ObjectState.Unchanged) {\n super(tracker);\n this._committedState = initialState;\n }\n\n public onCommitted(_lastOp?: Operation): void {\n this.dirtyCounter = 0;\n }\n\n public markDeletion(): void {\n const prev = this._committedState;\n const target = prev === ObjectState.New ? ObjectState.Unchanged : ObjectState.Deleted;\n this.tracker.doAndTrack(\n () => { this._committedState = target; },\n () => { this._committedState = prev; },\n new OperationProperties(this, '__saveState__', PropertyType.Object),\n );\n }\n\n public markAsNew(): void {\n if (this._committedState !== ObjectState.Unchanged) return;\n if (this.tracker.isTrackingSuppressed) return;\n const prev = this._committedState;\n this.tracker.doAndTrack(\n () => { this._committedState = ObjectState.New; },\n () => { this._committedState = prev; },\n new OperationProperties(this, '__saveState__', PropertyType.Object),\n );\n }\n}\n","export enum VersionedObjectState {\n New = 'New',\n Unchanged = 'Unchanged',\n Edited = 'Edited',\n Deleted = 'Deleted',\n InsertReverted = 'InsertReverted',\n EditReverted = 'EditReverted',\n DeleteReverted = 'DeleteReverted',\n}\n","import { Tracker } from \"./Tracker\";\nimport { TrackedObjectBase } from \"./TrackedObjectBase\";\nimport { VersionedObjectState } from \"./VersionedObjectState\";\nimport { Operation } from \"./Operation\";\nimport { OperationProperties } from \"./OperationProperties\";\nimport { PropertyType } from \"./PropertyType\";\nimport { ExternalAssignment, getExternallyAssignedProperty } from \"./ExternallyAssigned\";\n\nexport abstract class VersionedTrackedObject extends TrackedObjectBase {\n public _committedState: VersionedObjectState = VersionedObjectState.Unchanged;\n public readonly pendingHardDeletes = new Set<number>();\n\n public get state(): VersionedObjectState {\n if (this._committedState === VersionedObjectState.Unchanged && this.isDirty) {\n return VersionedObjectState.Edited;\n }\n return this._committedState;\n }\n\n public constructor(tracker: Tracker, initialState: VersionedObjectState = VersionedObjectState.Unchanged) {\n super(tracker);\n this._committedState = initialState;\n }\n\n public onCommitted(lastOp?: Operation): void {\n const revertedState = this.revertedStateFor(this.state);\n if (revertedState !== null) {\n const reverted = revertedState;\n const redoFn = () => { this._committedState = VersionedObjectState.Unchanged; };\n const undoFn = () => { this._committedState = reverted; };\n if (lastOp) {\n lastOp.updateOrAdd(redoFn, undoFn, new OperationProperties(this, '__saveState__', PropertyType.Object));\n }\n redoFn();\n }\n this.dirtyCounter = 0;\n }\n\n public override applyExternalAssignments(keys: ExternalAssignment[], lastOp?: Operation): void {\n const propertyName = getExternallyAssignedProperty(Object.getPrototypeOf(this));\n const response = propertyName && (this as any)[propertyName] < 0\n ? keys.find((x) => x.placeholder === (this as any)[propertyName])\n : undefined;\n\n super.applyExternalAssignments(keys, lastOp);\n\n if (!response) return;\n const newValue = response.value;\n const redoFn = () => { this.pendingHardDeletes.delete(newValue); };\n const undoFn = () => { this.pendingHardDeletes.add(newValue); };\n if (lastOp) {\n lastOp.add(redoFn, undoFn, new OperationProperties(this, '__pendingHardDeletes__', PropertyType.Object));\n }\n redoFn();\n }\n\n public markAsNew(): void {\n if (this._committedState !== VersionedObjectState.Unchanged) return;\n if (this.tracker.isTrackingSuppressed) return;\n const prev = this._committedState;\n this.tracker.doAndTrack(\n () => { this._committedState = VersionedObjectState.New; },\n () => { this._committedState = prev; },\n new OperationProperties(this, '__saveState__', PropertyType.Object),\n );\n }\n\n public markDeletion(): void {\n const prev = this._committedState;\n const isNeverPersisted = prev === VersionedObjectState.New || prev === VersionedObjectState.InsertReverted;\n const target = isNeverPersisted ? VersionedObjectState.Unchanged : VersionedObjectState.Deleted;\n\n const propertyName = getExternallyAssignedProperty(Object.getPrototypeOf(this));\n const prevId = propertyName !== undefined ? (this as any)[propertyName] as number : undefined;\n const prevPendingHardDeletes = new Set(this.pendingHardDeletes);\n const prevDirtyCounter = this.dirtyCounter;\n\n this.tracker.doAndTrack(\n () => {\n this._committedState = target;\n if (isNeverPersisted) {\n this.dirtyCounter = 0;\n }\n if (propertyName !== undefined && prevId !== 0) {\n (this as any)[propertyName] = 0;\n }\n },\n () => {\n this._committedState = prev;\n if (isNeverPersisted) {\n this.dirtyCounter = prevDirtyCounter;\n }\n if (propertyName !== undefined) {\n (this as any)[propertyName] = prevId!;\n }\n this.pendingHardDeletes.clear();\n prevPendingHardDeletes.forEach(id => this.pendingHardDeletes.add(id));\n },\n new OperationProperties(this, '__saveState__', PropertyType.Object),\n );\n }\n\n private revertedStateFor(state: VersionedObjectState): VersionedObjectState | null {\n switch (state) {\n case VersionedObjectState.New: return VersionedObjectState.InsertReverted;\n case VersionedObjectState.Edited: return VersionedObjectState.EditReverted;\n case VersionedObjectState.Deleted: return VersionedObjectState.DeleteReverted;\n case VersionedObjectState.InsertReverted: return VersionedObjectState.InsertReverted;\n case VersionedObjectState.EditReverted: return VersionedObjectState.EditReverted;\n case VersionedObjectState.DeleteReverted: return VersionedObjectState.DeleteReverted;\n default: return null;\n }\n }\n}\n","import { TrackedObjectBase } from \"./TrackedObjectBase\";\nimport { OperationProperties } from \"./OperationProperties\";\nimport { PropertyType } from \"./PropertyType\";\nimport { ITracked } from \"./ITracked\";\nimport { registerPropertyValidator } from \"./Registry\";\nimport { DependencyTracker } from \"./DependencyTracker\";\n\nexport function Tracked<T extends TrackedObjectBase, V>(\n validator?: (self: T, newValue: V) => string | undefined,\n options?: { noCoalesce?: boolean },\n) {\n function decorator(\n target: ClassAccessorDecoratorTarget<T, V>,\n context: ClassAccessorDecoratorContext,\n ): ClassAccessorDecoratorResult<T, V>;\n function decorator(\n target: (this: T, value: V) => void,\n context: ClassSetterDecoratorContext,\n ): (this: T, value: V) => void;\n function decorator(\n target: ClassAccessorDecoratorTarget<T, V> | ((this: T, value: V) => void),\n context: ClassAccessorDecoratorContext | ClassSetterDecoratorContext,\n ): ClassAccessorDecoratorResult<T, V> | ((this: T, value: V) => void) {\n const propertyName = String(context.name);\n\n if (context.kind === \"accessor\") {\n const accessorTarget = target as ClassAccessorDecoratorTarget<T, V>;\n\n if (validator) {\n context.addInitializer(function (this: unknown) {\n registerPropertyValidator(\n Object.getPrototypeOf(this),\n propertyName,\n (model: any) => validator(model, (model as any)[propertyName]),\n );\n });\n }\n\n return {\n get(this: T): V {\n DependencyTracker.record(this, propertyName);\n return accessorTarget.get.call(this);\n },\n set(this: T, newValue: V) {\n const oldValue = accessorTarget.get.call(this);\n\n if (isSameValue(oldValue, newValue)) {\n return;\n }\n\n if (!this.tracker || this.tracker.isTrackingSuppressed) {\n accessorTarget.set.call(this, newValue);\n return;\n }\n\n const properties = new OperationProperties(\n this,\n propertyName,\n getPropertyType(newValue, oldValue),\n validator ? (model: any, v: any) => validator(model, v) : undefined,\n options?.noCoalesce,\n );\n\n this.tracker.doAndTrack(\n () => {\n accessorTarget.set.call(this, newValue);\n (this as unknown as ITracked).dirtyCounter++;\n },\n () => {\n accessorTarget.set.call(this, oldValue);\n (this as unknown as ITracked).dirtyCounter--;\n },\n properties,\n );\n },\n };\n } else {\n const setterFn = target as (this: T, value: V) => void;\n\n if (validator) {\n context.addInitializer(function (this: unknown) {\n registerPropertyValidator(\n Object.getPrototypeOf(this),\n propertyName,\n (model: any) => validator(model, (model as any)[propertyName]),\n );\n });\n }\n\n return function (this: T, newValue: V): void {\n const oldValue = (this as any)[propertyName] as V;\n\n if (isSameValue(oldValue, newValue)) {\n return;\n }\n\n if (!this.tracker || this.tracker.isTrackingSuppressed) {\n setterFn.call(this, newValue);\n return;\n }\n\n const properties = new OperationProperties(\n this,\n propertyName,\n getPropertyType(newValue, oldValue),\n validator ? (model: any, v: any) => validator(model, v) : undefined,\n );\n\n this.tracker.doAndTrack(\n () => {\n setterFn.call(this, newValue);\n (this as unknown as ITracked).dirtyCounter++;\n },\n () => {\n setterFn.call(this, oldValue);\n (this as unknown as ITracked).dirtyCounter--;\n },\n properties,\n );\n };\n }\n }\n\n return decorator;\n}\n\nfunction isSameValue(value1: any, value2: any): boolean {\n return (\n value1 === value2 ||\n ((value1 === undefined || value1 === null) && value2 === \"\") ||\n ((value2 === undefined || value2 === null) && value1 === \"\")\n );\n}\n\nfunction getPropertyType(newValue: any, oldValue: any): PropertyType {\n const v = newValue ?? oldValue;\n if (v instanceof Date) return PropertyType.Date;\n switch (typeof v) {\n case \"string\":\n return PropertyType.String;\n case \"boolean\":\n return PropertyType.Boolean;\n case \"number\":\n return PropertyType.Number;\n case \"object\":\n return PropertyType.Object;\n default:\n throw new Error(`Property type '${typeof v}' not supported`);\n }\n}\n","import { ITracked } from \"./ITracked\";\nimport { Tracker } from \"./Tracker\";\nimport { OperationProperties } from \"./OperationProperties\";\nimport { PropertyType } from \"./PropertyType\";\nimport { TypedEvent } from \"./TypedEvent\";\nimport { TrackedObjectBase } from \"./TrackedObjectBase\";\nimport { DependencyTracker, COLLECTION_VERSION_KEY } from \"./DependencyTracker\";\n\nexport class TrackedCollection<T> implements Array<T>, ITracked {\n private _collection: T[];\n private _isDirty: boolean;\n private _isValid: boolean;\n private _dirtyCounter: number = 0;\n private _error: string | undefined;\n private readAccess(): void {\n DependencyTracker.record(this, COLLECTION_VERSION_KEY);\n }\n\n public get dirtyCounter(): number {\n return this._dirtyCounter;\n }\n private set dirtyCounter(value: number) {\n this._dirtyCounter = value;\n }\n\n public get isDirty(): boolean {\n return this._isDirty;\n }\n private set isDirty(value: boolean) {\n this._isDirty = value;\n }\n\n public get isValid(): boolean {\n return this._isValid;\n }\n private set isValid(value: boolean) {\n const wasValid = this._isValid;\n this._isValid = value;\n if (wasValid !== value) {\n this.tracker.onValidityChanged(wasValid, value);\n }\n }\n\n public get length(): number {\n this.readAccess();\n return this._collection.length;\n }\n\n public get lastItemIndex(): number | undefined {\n this.readAccess();\n return this._collection.length > 0 ? this._collection.length - 1 : undefined;\n }\n\n public get collection(): T[] {\n return this._collection;\n }\n private set collection(value: T[]) {\n this._collection = value;\n }\n\n public get [Symbol.iterator]() {\n this.readAccess();\n return this.collection[Symbol.iterator].bind(this.collection);\n }\n\n public get [Symbol.unscopables]() {\n return this.collection[Symbol.unscopables];\n }\n\n public readonly changed: TypedEvent<TrackedCollectionChanged<T>> =\n new TypedEvent<TrackedCollectionChanged<T>>();\n\n [n: number]: T;\n\n public get error(): string | undefined {\n return this._error;\n }\n public set error(value: string | undefined) {\n this._error = value;\n }\n\n public constructor(\n public readonly tracker: Tracker,\n items?: T[],\n private readonly _validator?: (value: T[]) => string | undefined,\n ) {\n this._isValid = true;\n this._isDirty = false;\n this._collection = items ? [...items] : [];\n this.validate();\n this.tracker.trackCollection(this);\n }\n\n public validate(): void {\n this.error = this._validator ? this._validator(this.collection) : undefined;\n this.isValid = this.error === undefined;\n }\n\n public applyValidation(_messages: Map<string, string>): void {\n // Collections validate via validate() using their own validator, not the Registry.\n }\n\n public splice(start: number, deleteCount: number, ...items: T[]): T[] {\n let removed: T[];\n\n this.tracker.doAndTrack(\n () => {\n if (removed !== undefined) {\n this.doSplice(start, deleteCount, items, removed);\n } else {\n removed = this.doSplice(start, deleteCount, items);\n }\n this.trackRemovedObjectDeletions(removed);\n this.trackAddedObjectInsertions(items);\n },\n () => this.undoSplice(start, items, removed),\n new OperationProperties(this, undefined, PropertyType.Collection),\n );\n\n return removed!;\n }\n\n private doSplice(\n start: number,\n deleteCount: number,\n items: T[],\n reusedRemoved?: T[],\n ): T[] {\n let removed: T[];\n let event: TrackedCollectionChanged<T>;\n\n this.tracker.withTrackingSuppressed(() => {\n removed = this.collection.splice(start, deleteCount, ...items);\n this.collection = [...this.collection];\n event = new TrackedCollectionChanged<T>(items, removed, this.collection);\n });\n\n this.changed.emit(event!);\n\n return reusedRemoved ?? removed!;\n }\n\n private trackRemovedObjectDeletions(removed: T[]): void {\n for (const item of removed) {\n if (item instanceof TrackedObjectBase) {\n item.markDeletion();\n }\n }\n }\n\n private trackAddedObjectInsertions(added: T[]): void {\n for (const item of added) {\n if (item instanceof TrackedObjectBase) {\n item.markAsNew();\n }\n }\n }\n\n private undoSplice(start: number, items: T[], removed: T[]): void {\n this.tracker.withTrackingSuppressed(() => {\n this.collection.splice(start, items?.length ?? 0, ...removed);\n this.collection = [...this.collection];\n const event = new TrackedCollectionChanged<T>(\n removed,\n items,\n this.collection,\n );\n this.changed.emit(event);\n });\n }\n\n public reset(newItems: T[]): void {\n this.splice(0, this.collection.length, ...newItems);\n }\n\n public reverse(): T[] {\n this.collection.reverse();\n return this.collection;\n }\n\n public sort(compareFn?: (a: T, b: T) => number): this {\n if (this.length === 0) {\n return this;\n }\n this.collection.sort(compareFn);\n return this;\n }\n\n public clear(): void {\n if (this.length === 0) {\n return;\n }\n this.splice(0, this.length);\n }\n\n public remove(item: T): boolean {\n const itemIndex = this.collection.indexOf(item);\n if (itemIndex < 0) {\n return false;\n }\n\n this.splice(itemIndex, 1);\n\n return true;\n }\n\n public replace(item: T, replace: T): boolean {\n const itemIndex = this.collection.indexOf(item);\n if (itemIndex < 0) {\n return false;\n }\n\n this.splice(itemIndex, 1, replace);\n\n return true;\n }\n\n public replaceAt(index: number, replace: T): void {\n this.splice(index, 1, replace);\n }\n\n public pop(): T | undefined {\n return this.length === 0\n ? undefined\n : this.splice(this.collection.length - 1, 1)[0];\n }\n\n public push(...items: T[]): number {\n if (!items || items.length === 0) {\n return this.length;\n }\n this.splice((this.lastItemIndex ?? -1) + 1, 0, ...items);\n\n return this.length;\n }\n\n public concat(...items: (T | ConcatArray<T>)[]): T[] {\n this.readAccess();\n return this.collection.concat(...items);\n }\n\n public join(separator?: string): string {\n this.readAccess();\n return this.collection.join(separator);\n }\n\n public shift(): T | undefined {\n return this.length === 0 ? undefined : this.splice(0, 1)[0];\n }\n\n public slice(start?: number, end?: number): T[] {\n this.readAccess();\n return this.collection.slice(start, end);\n }\n\n public unshift(...items: T[]): number {\n this.splice(0, 0, ...items);\n return this.length;\n }\n\n public indexOf(searchElement: T, fromIndex?: number): number {\n this.readAccess();\n return this.collection.indexOf(searchElement, fromIndex);\n }\n\n public lastIndexOf(searchElement: T, fromIndex?: number): number {\n this.readAccess();\n return fromIndex !== undefined\n ? this.collection.lastIndexOf(searchElement, fromIndex)\n : this.collection.lastIndexOf(searchElement);\n }\n\n public every<S extends T>(\n predicate: (value: T, index: number, array: T[]) => value is S,\n thisArg?: any,\n ): this is S[];\n public every(\n predicate: (value: T, index: number, array: T[]) => unknown,\n thisArg?: any,\n ): boolean;\n public every(\n predicate: (value: T, index: number, array: T[]) => unknown,\n thisArg?: any,\n ): boolean {\n this.readAccess();\n return this.collection.every(predicate as any, thisArg);\n }\n\n public some(\n predicate: (value: T, index: number, array: T[]) => unknown,\n thisArg?: any,\n ): boolean {\n this.readAccess();\n return this.collection.some(predicate, thisArg);\n }\n\n public forEach(\n callbackfn: (value: T, index: number, array: T[]) => void,\n thisArg?: any,\n ): void {\n this.readAccess();\n this.collection.forEach(callbackfn, thisArg);\n }\n\n public map<U>(\n callbackfn: (value: T, index: number, array: T[]) => U,\n thisArg?: any,\n ): U[] {\n this.readAccess();\n return this.collection.map(callbackfn, thisArg);\n }\n\n public filter(\n predicate: (value: T, index: number, array: T[]) => unknown,\n thisArg?: any,\n ): T[] {\n this.readAccess();\n return this.collection.filter(predicate, thisArg);\n }\n\n public find(\n predicate: (value: T, index: number, obj: T[]) => unknown,\n thisArg?: any,\n ): T | undefined {\n this.readAccess();\n return this.collection.find(predicate, thisArg);\n }\n\n public findIndex(\n predicate: (value: T, index: number, obj: T[]) => unknown,\n thisArg?: any,\n ): number {\n this.readAccess();\n return this.collection.findIndex(predicate, thisArg);\n }\n\n public flatMap<U, This = undefined>(\n callback: (\n this: This,\n value: T,\n index: number,\n array: T[],\n ) => U | ReadonlyArray<U>,\n thisArg?: This,\n ): U[] {\n this.readAccess();\n return this.collection.flatMap(callback, thisArg);\n }\n\n public includes(searchElement: T, fromIndex?: number): boolean {\n this.readAccess();\n return this.collection.includes(searchElement, fromIndex);\n }\n\n public toString(): string {\n this.readAccess();\n return this.collection.toString();\n }\n\n public toLocaleString(): string {\n this.readAccess();\n return this.collection.toLocaleString();\n }\n\n public entries(): ArrayIterator<[number, T]> {\n this.readAccess();\n return this.collection.entries() as unknown as ArrayIterator<[number, T]>;\n }\n\n public keys(): ArrayIterator<number> {\n this.readAccess();\n return this.collection.keys() as unknown as ArrayIterator<number>;\n }\n\n public values(): ArrayIterator<T> {\n this.readAccess();\n return this.collection.values() as unknown as ArrayIterator<T>;\n }\n\n public at(index: number): T | undefined {\n this.readAccess();\n return this.collection.at(index);\n }\n\n public fill(value: T, start?: number, end?: number): this {\n const len = this.length;\n const s =\n start === undefined\n ? 0\n : start < 0\n ? Math.max(len + start, 0)\n : Math.min(start, len);\n const e =\n end === undefined\n ? len\n : end < 0\n ? Math.max(len + end, 0)\n : Math.min(end, len);\n if (s >= e) return this;\n this.splice(s, e - s, ...new Array<T>(e - s).fill(value));\n return this;\n }\n\n public copyWithin(target: number, start: number, end?: number): this {\n const len = this.length;\n const t = target < 0 ? Math.max(len + target, 0) : Math.min(target, len);\n const s = start < 0 ? Math.max(len + start, 0) : Math.min(start, len);\n const e =\n end === undefined\n ? len\n : end < 0\n ? Math.max(len + end, 0)\n : Math.min(end, len);\n const itemsToCopy = this.collection.slice(s, e);\n const count = Math.min(itemsToCopy.length, len - t);\n if (count > 0) {\n this.splice(t, count, ...itemsToCopy.slice(0, count));\n }\n return this;\n }\n\n public reduce(\n callbackfn: (\n previousValue: T,\n currentValue: T,\n currentIndex: number,\n array: T[],\n ) => T,\n initialValue?: T,\n ): T {\n this.readAccess();\n return initialValue !== undefined\n ? this.collection.reduce(callbackfn, initialValue)\n : this.collection.reduce(callbackfn);\n }\n\n public reduceRight(\n callbackfn: (\n previousValue: T,\n currentValue: T,\n currentIndex: number,\n array: T[],\n ) => T,\n initialValue?: T,\n ): T {\n this.readAccess();\n return initialValue !== undefined\n ? this.collection.reduceRight(callbackfn, initialValue)\n : this.collection.reduceRight(callbackfn);\n }\n\n public flat<A, D extends number = 1>(this: A, depth?: D): FlatArray<A, D>[] {\n DependencyTracker.record(this as object, COLLECTION_VERSION_KEY);\n return ((this as any)._collection as any[]).flat(depth) as FlatArray<\n A,\n D\n >[];\n }\n\n public findLast(\n predicate: (value: T, index: number, array: T[]) => unknown,\n thisArg?: any,\n ): T | undefined {\n this.readAccess();\n return this.collection.findLast(predicate, thisArg);\n }\n\n public findLastIndex(\n predicate: (value: T, index: number, array: T[]) => unknown,\n thisArg?: any,\n ): number {\n this.readAccess();\n return this.collection.findLastIndex(predicate, thisArg);\n }\n\n public toReversed(): T[] {\n this.readAccess();\n return this.collection.toReversed();\n }\n\n public toSorted(compareFn?: (a: T, b: T) => number): T[] {\n this.readAccess();\n return this.collection.toSorted(compareFn);\n }\n\n public toSpliced(start: number, deleteCount: number, ...items: T[]): T[] {\n this.readAccess();\n return this.collection.toSpliced(start, deleteCount, ...items);\n }\n\n public with(index: number, value: T): T[] {\n this.readAccess();\n return this.collection.with(index, value);\n }\n\n public first(): T | undefined {\n this.readAccess();\n return this._collection.length > 0 ? this._collection[0] : undefined;\n }\n\n public destroy(): void {\n this.tracker.untrackCollection(this);\n }\n}\n\nexport class TrackedCollectionChanged<T> {\n constructor(\n public readonly added: T[],\n public readonly removed: T[],\n public readonly newCollection: T[],\n ) {}\n}\n\ndeclare global {\n interface ArrayIterator<T> extends IterableIterator<T> {\n map<U>(callback: (value: T) => U): ArrayIterator<U>;\n filter(predicate: (value: T) => boolean): ArrayIterator<T>;\n take(count: number): ArrayIterator<T>;\n drop(count: number): ArrayIterator<T>;\n flatMap<U>(callback: (value: T) => U[]): ArrayIterator<U>;\n reduce<U>(callback: (acc: U, value: T) => U, initialValue: U): U;\n toArray(): T[];\n forEach(callback: (value: T) => void): void;\n some(predicate: (value: T) => boolean): boolean;\n every(predicate: (value: T) => boolean): boolean;\n find(predicate: (value: T) => boolean): T | undefined;\n }\n}\n"],"mappings":"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","names":["PropertyType","ObjectState","VersionedObjectState"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/TypedEvent.ts","../../src/Change.ts","../../src/Operation.ts","../../src/PropertyType.ts","../../src/CollectionUtilities.ts","../../src/ExternallyAssigned.ts","../../src/DependencyTracker.ts","../../src/Registry.ts","../../src/Tracker.ts","../../src/OperationProperties.ts","../../src/TrackedObjectBase.ts","../../src/ObjectState.ts","../../src/TrackedObject.ts","../../src/VersionedObjectState.ts","../../src/VersionedTrackedObject.ts","../../src/Tracked.ts","../../src/TrackedCollection.ts"],"sourcesContent":["export { Tracker } from './Tracker.js'\nexport { TrackedObjectBase } from './TrackedObjectBase.js'\nexport { TrackedObject } from './TrackedObject.js'\nexport { VersionedTrackedObject } from './VersionedTrackedObject.js'\nexport { Tracked } from './Tracked.js'\nexport { TrackedCollection, TrackedCollectionChanged } from './TrackedCollection.js'\nexport { ITracked } from './ITracked.js'\nexport { ExternallyAssigned } from './ExternallyAssigned.js'\nexport type { ExternalAssignment as ExternallyAssignment } from './ExternallyAssigned.js'\nexport { OperationProperties } from './OperationProperties.js'\nexport { PropertyType } from './PropertyType.js'\nexport { TypedEvent } from './TypedEvent.js'\nexport { ObjectState } from './ObjectState.js'\nexport { VersionedObjectState } from './VersionedObjectState.js'\n","export class TypedEvent<T> {\n private readonly _handlers: ((event: T) => void)[] = [];\n\n public subscribe(handler: (event: T) => void): () => void {\n this._handlers.push(handler);\n return () => this.unsubscribe(handler);\n }\n\n public unsubscribe(handler: (event: T) => void): void {\n const index = this._handlers.indexOf(handler);\n if (index >= 0) {\n this._handlers.splice(index, 1);\n }\n }\n\n public emit(event: T): void {\n this._handlers.forEach((h) => h(event));\n }\n}\n","import { OperationProperties } from \"./OperationProperties\";\n\nexport class Change {\n public readonly time: Date = new Date();\n\n constructor(\n public readonly number: number,\n public readonly redoAction: () => void,\n public readonly undoAction: () => void,\n public readonly properties: OperationProperties,\n ) {}\n}\n","import { Change } from \"./Change\";\nimport { OperationProperties } from \"./OperationProperties\";\n\nexport class Operation {\n public readonly time: Date = new Date();\n public readonly actions: Change[] = [];\n private _hasActions: boolean = false;\n public get hasActions(): boolean {\n return this._hasActions;\n }\n private set hasActions(value: boolean) {\n this._hasActions = value;\n }\n\n public add(\n redoAction: () => void,\n undoAction: () => void,\n properties: OperationProperties,\n ): void {\n const action = new Change(\n this.actions.length,\n redoAction,\n undoAction,\n properties,\n );\n this.actions.push(action);\n this.hasActions = true;\n }\n\n public updateOrAdd(\n redoAction: () => void,\n undoAction: () => void,\n properties: OperationProperties,\n ): void {\n const idx = this.actions.findLastIndex(\n (c) =>\n c.properties.trackedObject === properties.trackedObject &&\n c.properties.property === properties.property,\n );\n if (idx >= 0) {\n this.actions[idx] = new Change(this.actions[idx].number, redoAction, undoAction, properties);\n } else {\n this.add(redoAction, undoAction, properties);\n }\n }\n\n public redo(): void {\n this.actions.reverse().forEach((x) => x.redoAction());\n }\n\n public undo(): void {\n this.actions.reverse().forEach((x) => x.undoAction());\n }\n}\n","\r\nexport enum PropertyType {\r\n Boolean = 0,\r\n String = 1,\r\n Number = 2,\r\n Collection = 3,\r\n Object = 4,\r\n Date = 5\r\n}\r\n","export class CollectionUtilities {\n public static getLast<T>(array: T[]): T | undefined {\n return array.length > 0 ? array[array.length - 1] : undefined;\n }\n}\n","export interface ExternalAssignment {\n placeholder: number;\n value: number;\n}\n\nconst EXTERNALLY_ASSIGNED = Symbol(\"externallyAssigned\");\n\nexport function ExternallyAssigned<This extends object, Value>(\n _target: undefined,\n context: ClassFieldDecoratorContext<This, Value>,\n): void {\n context.addInitializer(function (this: This) {\n Object.defineProperty(Object.getPrototypeOf(this), EXTERNALLY_ASSIGNED, {\n value: String(context.name),\n configurable: true,\n });\n });\n}\n\nexport function getExternallyAssignedProperty(\n proto: object,\n): string | undefined {\n return EXTERNALLY_ASSIGNED in proto\n ? ((proto as any)[EXTERNALLY_ASSIGNED] as string)\n : undefined;\n}\n","import { ITracked } from \"./ITracked\";\n\nexport type DepMap = Map<object, Set<string>>;\n\n// Special property key used to represent \"any structural change\" in a TrackedCollection.\nexport const COLLECTION_VERSION_KEY = \"__version__\";\n\nlet collector: DepMap | null = null;\n\n// Forward: validatedObj → validatorProp → DepMap (what the validator read)\nconst forwardDeps = new WeakMap<object, Map<string, DepMap>>();\n\n// Reverse: depObj → depProp → [{validatedObj, validatorProp}]\nconst reverseDeps = new Map<\n object,\n Map<string, Array<{ obj: ITracked; prop: string }>>\n>();\n\nexport const DependencyTracker = {\n isActive(): boolean {\n return collector !== null;\n },\n\n record(object: object, property: string): void {\n if (!collector) return;\n let props = collector.get(object);\n if (!props) {\n props = new Set<string>();\n collector.set(object, props);\n }\n props.add(property);\n },\n\n collect(fn: () => void): DepMap {\n collector = new Map<object, Set<string>>();\n fn();\n const deps = collector;\n collector = null;\n return deps;\n },\n\n updateDeps(validatedObj: ITracked, validatorProp: string, newDeps: DepMap): void {\n // Remove old reverse entries for this validator\n const objForward = forwardDeps.get(validatedObj);\n const oldDeps = objForward?.get(validatorProp);\n if (oldDeps) {\n oldDeps.forEach((props, depObj) => {\n const propMap = reverseDeps.get(depObj);\n if (!propMap) return;\n props.forEach((prop) => {\n const list = propMap.get(prop);\n if (!list) return;\n const idx = list.findIndex(\n (x) => x.obj === validatedObj && x.prop === validatorProp,\n );\n if (idx >= 0) list.splice(idx, 1);\n });\n });\n }\n\n // Store new forward deps\n let fwd = forwardDeps.get(validatedObj);\n if (!fwd) {\n fwd = new Map<string, DepMap>();\n forwardDeps.set(validatedObj, fwd);\n }\n fwd.set(validatorProp, newDeps);\n\n // Add new reverse entries\n newDeps.forEach((props, depObj) => {\n let propMap = reverseDeps.get(depObj);\n if (!propMap) {\n propMap = new Map<string, Array<{ obj: ITracked; prop: string }>>();\n reverseDeps.set(depObj, propMap);\n }\n props.forEach((prop) => {\n let list = propMap!.get(prop);\n if (!list) {\n list = [];\n propMap!.set(prop, list);\n }\n if (!list.some((x) => x.obj === validatedObj && x.prop === validatorProp)) {\n list.push({ obj: validatedObj, prop: validatorProp });\n }\n });\n });\n },\n\n getDependents(\n depObj: object,\n depProp: string,\n ): Array<{ obj: ITracked; prop: string }> {\n return reverseDeps.get(depObj)?.get(depProp) ?? [];\n },\n\n clearDeps(validatedObj: ITracked): void {\n const objForward = forwardDeps.get(validatedObj);\n if (!objForward) return;\n objForward.forEach((depMap) => {\n depMap.forEach((props, depObj) => {\n const propMap = reverseDeps.get(depObj);\n if (!propMap) return;\n props.forEach((prop) => {\n const list = propMap.get(prop);\n if (!list) return;\n const idx = list.findIndex((x) => x.obj === validatedObj);\n if (idx >= 0) list.splice(idx, 1);\n });\n });\n });\n forwardDeps.delete(validatedObj);\n },\n};\n","import { ITracked as ITrackedItem } from \"./ITracked\";\nimport { DependencyTracker } from \"./DependencyTracker\";\n\ntype ValidatorMap = Map<string, (model: any) => string | undefined>;\nconst VALIDATORS = Symbol(\"validators\");\n\nexport function registerPropertyValidator(\n proto: object,\n property: string,\n validator: (model: any) => string | undefined,\n): void {\n if (!(VALIDATORS in proto)) {\n Object.defineProperty(proto, VALIDATORS, {\n value: new Map<string, (model: any) => string | undefined>(),\n configurable: true,\n });\n }\n const map = (proto as any)[VALIDATORS] as ValidatorMap;\n if (!map.has(property)) {\n map.set(property, validator);\n }\n}\n\nexport function validate(tracked: ITrackedItem): void {\n const proto = Object.getPrototypeOf(tracked);\n if (!(VALIDATORS in proto)) return;\n const validators = (proto as any)[VALIDATORS] as ValidatorMap;\n const messages = new Map<string, string>();\n validators.forEach((validatorFn, property) => {\n const deps = DependencyTracker.collect(() => {\n const error = validatorFn(tracked);\n if (error !== undefined) messages.set(property, error);\n });\n DependencyTracker.updateDeps(tracked, property, deps);\n });\n tracked.applyValidation(messages);\n}\n\nexport function validateSingleProperty(\n tracked: ITrackedItem,\n property: string,\n): string | undefined {\n const proto = Object.getPrototypeOf(tracked);\n if (!(VALIDATORS in proto)) return undefined;\n const validators = (proto as any)[VALIDATORS] as ValidatorMap;\n const validatorFn = validators.get(property);\n if (!validatorFn) return undefined;\n let error: string | undefined;\n const deps = DependencyTracker.collect(() => {\n error = validatorFn(tracked);\n });\n DependencyTracker.updateDeps(tracked, property, deps);\n return error;\n}\n","import { TypedEvent } from \"./TypedEvent\";\nimport { Operation } from \"./Operation\";\nimport { TrackedCollection } from \"./TrackedCollection\";\nimport { OperationProperties } from \"./OperationProperties\";\nimport { PropertyType } from \"./PropertyType\";\nimport { CollectionUtilities } from \"./CollectionUtilities\";\nimport {\n ExternalAssignment,\n getExternallyAssignedProperty,\n} from \"./ExternallyAssigned\";\nimport { validate, validateSingleProperty } from \"./Registry\";\nimport { DependencyTracker, COLLECTION_VERSION_KEY } from \"./DependencyTracker\";\nimport { ITracked } from \"./ITracked\";\nimport { TrackedObjectBase } from \"./TrackedObjectBase\";\n\nexport class Tracker {\n private _currentOperation: Operation | undefined;\n private readonly _redoOperations: Operation[];\n private readonly _undoOperations: Operation[];\n private _commitStateOperation: Operation | undefined;\n private _isDirty: boolean;\n private _canUndo: boolean;\n private _canRedo: boolean;\n private _suppressTrackingCounter = 0;\n private _currentOperationOwner: ITracked | undefined;\n private _currentOperationPropertyName: string | undefined;\n private _isValid: boolean;\n private _canCommit: boolean;\n private _externallyAssignedPlaceholderCounter = -1;\n private _invalidCount = 0;\n private _constructionDepth = 0;\n private _composingBaseIndex: number | undefined;\n private _composingRedoLength: number | undefined;\n private _version: number = 0;\n\n public readonly coalescingWindowMs: number | undefined;\n\n public readonly trackedObjects: TrackedObjectBase[] = [];\n\n public readonly trackedCollections: TrackedCollection<any>[] = [];\n\n public get isDirty(): boolean {\n return this._isDirty;\n }\n public set isDirty(value: boolean) {\n if (this._isDirty !== value) {\n this._isDirty = value;\n this.isDirtyChanged.emit(value);\n this.updateCanCommit();\n }\n }\n\n public readonly isDirtyChanged: TypedEvent<boolean> = new TypedEvent<boolean>();\n\n public get version(): number {\n return this._version;\n }\n\n public readonly versionChanged: TypedEvent<number> = new TypedEvent<number>();\n\n public get isValid(): boolean {\n return this._isValid;\n }\n private set isValid(value: boolean) {\n if (this._isValid !== value) {\n this._isValid = value;\n this.isValidChanged.emit(value);\n this.updateCanCommit();\n }\n }\n\n public readonly isValidChanged: TypedEvent<boolean> = new TypedEvent<boolean>();\n\n public get canCommit(): boolean {\n return this._canCommit;\n }\n private set canCommit(value: boolean) {\n if (this._canCommit !== value) {\n this._canCommit = value;\n this.canCommitChanged.emit(value);\n }\n }\n\n public readonly canCommitChanged: TypedEvent<boolean> = new TypedEvent<boolean>();\n\n private updateCanCommit(): void {\n this.canCommit = this._isDirty && this._isValid;\n }\n\n public get canUndo(): boolean {\n return this._canUndo;\n }\n private set canUndo(value: boolean) {\n this._canUndo = value;\n }\n\n public get canRedo(): boolean {\n return this._canRedo;\n }\n private set canRedo(value: boolean) {\n this._canRedo = value;\n }\n\n public get isTrackingSuppressed(): boolean {\n return this._suppressTrackingCounter > 0;\n }\n\n public get isConstructing(): boolean {\n return this._constructionDepth > 0;\n }\n\n public constructor(coalescingWindowMs: number | undefined = 3000) {\n this.coalescingWindowMs = coalescingWindowMs;\n this._currentOperation = undefined;\n this._redoOperations = [];\n this._undoOperations = [];\n this._commitStateOperation = undefined;\n this._isDirty = false;\n this._canUndo = false;\n this._canRedo = false;\n this._suppressTrackingCounter = 0;\n this._currentOperationOwner = undefined;\n this._currentOperationPropertyName = undefined;\n this._isValid = true;\n this._canCommit = false;\n }\n\n public trackObject(trackedObject: TrackedObjectBase) {\n this.trackedObjects.push(trackedObject);\n }\n\n public untrackObject(trackedObject: TrackedObjectBase) {\n this.trackedObjects.splice(this.trackedObjects.indexOf(trackedObject), 1);\n if (!trackedObject.isValid) this._invalidCount--;\n this.isValid = this._invalidCount === 0;\n }\n\n public trackCollection(trackedCollection: TrackedCollection<any>): void {\n this.trackedCollections.push(trackedCollection);\n }\n\n public untrackCollection(trackedCollection: TrackedCollection<any>) {\n this.trackedCollections.splice(\n this.trackedCollections.indexOf(trackedCollection),\n 1,\n );\n if (!trackedCollection.isValid) this._invalidCount--;\n this.isValid = this._invalidCount === 0;\n }\n\n public onValidityChanged(wasValid: boolean, isNowValid: boolean): void {\n if (wasValid && !isNowValid) this._invalidCount++;\n else if (!wasValid && isNowValid) this._invalidCount--;\n if (!this.isTrackingSuppressed) {\n this.isValid = this._invalidCount === 0;\n }\n }\n\n public construct<T>(action: () => T): T {\n const objectsBefore = this.trackedObjects.length;\n this._constructionDepth++;\n this._suppressTrackingCounter++;\n const result = action();\n for (let i = objectsBefore; i < this.trackedObjects.length; i++) {\n validate(this.trackedObjects[i]);\n }\n this._suppressTrackingCounter--;\n this._constructionDepth--;\n this.isValid = this._invalidCount === 0;\n return result;\n }\n\n public withTrackingSuppressed(action: () => void): void {\n this._suppressTrackingCounter++;\n action();\n this._suppressTrackingCounter--;\n }\n\n public beginSuppressTracking(): void {\n this._suppressTrackingCounter++;\n }\n\n public endSuppressTracking(): void {\n this._suppressTrackingCounter--;\n }\n\n public doAndTrack(\n redoAction: () => void,\n undoAction: () => void,\n properties: OperationProperties,\n ): void {\n if (this.isTrackingSuppressed) {\n redoAction();\n if (!this.isConstructing) {\n this.revalidateTargeted(properties.trackedObject, properties.property);\n }\n return;\n }\n\n if (this.isStartingNewOperation()) {\n this._currentOperationOwner = properties.trackedObject;\n this._currentOperationPropertyName = properties.property;\n\n if (this.shouldCoalesceChanges(properties)) {\n this._currentOperation = CollectionUtilities.getLast(this._undoOperations)!;\n } else {\n this._currentOperation = new Operation();\n this._undoOperations.push(this._currentOperation);\n this._redoOperations.length = 0;\n this.reset();\n this._version++;\n this.versionChanged.emit(this._version);\n }\n }\n\n this._currentOperation?.add(\n () => redoAction(),\n () => undoAction(),\n properties,\n );\n redoAction();\n\n if (this.isEndingCurrentOperation(properties)) {\n this._currentOperation = undefined;\n this._currentOperationOwner = undefined;\n this._currentOperationPropertyName = undefined;\n this.revalidateTargeted(properties.trackedObject, properties.property);\n }\n }\n\n private revalidateTargeted(changedObj: ITracked, changedProp: string | undefined): void {\n const depKey = changedProp ?? COLLECTION_VERSION_KEY;\n const dependents = [...DependencyTracker.getDependents(changedObj, depKey)];\n for (const { obj, prop } of dependents) {\n const error = validateSingleProperty(obj, prop);\n obj.validate(prop, error);\n }\n if (changedProp === undefined) {\n (changedObj as TrackedCollection<any>).validate();\n }\n this.isValid = this._invalidCount === 0;\n }\n\n private isEndingCurrentOperation(properties: OperationProperties) {\n return this._currentOperationOwner === properties.trackedObject &&\n this._currentOperationPropertyName === properties.property;\n }\n\n private isStartingNewOperation() {\n return this._currentOperationOwner === undefined &&\n this._currentOperationPropertyName === undefined;\n }\n\n private shouldCoalesceChanges(properties: OperationProperties): boolean {\n const lastOperation = CollectionUtilities.getLast(this._undoOperations);\n return (\n this.isCoalescibleType(properties) &&\n this.hasLastOperation(lastOperation) &&\n this.lastOperationTargetsSameProperty(lastOperation!, properties) &&\n this.lastActionIsRecent(lastOperation!)\n );\n }\n\n private isCoalescibleType(properties: OperationProperties): boolean {\n return (\n !properties.noCoalesce &&\n (properties.type === PropertyType.String ||\n properties.type === PropertyType.Number)\n );\n }\n\n private hasLastOperation(lastOperation: Operation | undefined): boolean {\n return !!lastOperation;\n }\n\n private lastOperationTargetsSameProperty(lastOperation: Operation, properties: OperationProperties): boolean {\n return lastOperation.actions.every(\n (x) =>\n x.properties.trackedObject === properties.trackedObject &&\n x.properties.property === properties.property,\n );\n }\n\n private lastActionIsRecent(lastOperation: Operation): boolean {\n if (this.coalescingWindowMs === undefined) return false;\n return (\n new Date().getTime() -\n CollectionUtilities.getLast(lastOperation.actions)!.time.getTime() <\n this.coalescingWindowMs\n );\n }\n\n public onCommit(keys?: ExternalAssignment[]): void {\n const lastOp = CollectionUtilities.getLast(this._undoOperations);\n if (keys) {\n this.trackedObjects.forEach((obj) => obj.applyExternalAssignments(keys, lastOp));\n }\n this.trackedObjects.forEach((obj) => obj.onCommitted(lastOp));\n this._commitStateOperation = lastOp;\n this.reset();\n }\n\n public isInUndoStack(op: Operation): boolean {\n return this._undoOperations.includes(op);\n }\n\n public beforeCommit() {\n this.trackedObjects.forEach((model) => {\n const propertyName = getExternallyAssignedProperty(\n Object.getPrototypeOf(model),\n );\n if (propertyName && (model as any)[propertyName] <= 0) {\n (model as any)[propertyName] = this._externallyAssignedPlaceholderCounter--;\n }\n });\n }\n\n private reset(): void {\n this.canUndo = this._undoOperations.length > 0;\n this.canRedo = this._redoOperations.length > 0;\n this.isDirty =\n CollectionUtilities.getLast(this._undoOperations) !==\n this._commitStateOperation;\n }\n\n public startCoalescing(): void {\n if (this._composingBaseIndex !== undefined) return;\n this._composingBaseIndex = this._undoOperations.length;\n this._composingRedoLength = this._redoOperations.length;\n }\n\n public endCoalescing(): void {\n if (this._composingBaseIndex === undefined) return;\n\n const composed = this._undoOperations.splice(this._composingBaseIndex);\n this._redoOperations.splice(this._composingRedoLength!);\n this._composingBaseIndex = undefined;\n this._composingRedoLength = undefined;\n\n if (composed.length === 0) {\n this.reset();\n return;\n }\n\n if (composed.length === 1) {\n this._undoOperations.push(composed[0]);\n this.reset();\n return;\n }\n\n const merged = new Operation();\n for (const op of composed) {\n for (const action of op.actions) {\n merged.add(action.redoAction, action.undoAction, action.properties);\n }\n }\n this._undoOperations.push(merged);\n this.reset();\n }\n\n public rollbackCoalescing(): void {\n if (this._composingBaseIndex === undefined) return;\n\n const toRevert = this._undoOperations.splice(this._composingBaseIndex);\n this._redoOperations.splice(this._composingRedoLength!);\n this._composingBaseIndex = undefined;\n this._composingRedoLength = undefined;\n\n this.withTrackingSuppressed(() => {\n for (let i = toRevert.length - 1; i >= 0; i--) {\n toRevert[i].undo();\n }\n });\n\n this.reset();\n this.revalidate();\n if (toRevert.length > 0) {\n this._version -= toRevert.length;\n this.versionChanged.emit(this._version);\n }\n }\n\n public undo(): void {\n if (!this.canUndo) {\n return;\n }\n\n const undoOperation = this._undoOperations.pop()!;\n this.withTrackingSuppressed(() => undoOperation.undo());\n this._redoOperations.push(undoOperation);\n\n this.reset();\n this.revalidate();\n this._version--;\n this.versionChanged.emit(this._version);\n }\n\n public redo(): void {\n if (!this.canRedo) {\n return;\n }\n\n const redoOperation = this._redoOperations.pop()!;\n this.withTrackingSuppressed(() => redoOperation.redo());\n this._undoOperations.push(redoOperation);\n\n this.reset();\n this.revalidate();\n this._version++;\n this.versionChanged.emit(this._version);\n }\n\n public revalidate(): void {\n this.trackedObjects.forEach((x) => validate(x));\n this.trackedCollections.forEach((x) => x.validate());\n this.isValid = this._invalidCount === 0;\n }\n}\n","import { ITracked } from \"./ITracked\";\nimport { PropertyType } from \"./PropertyType\";\n\nexport class OperationProperties {\n constructor(\n public readonly trackedObject: ITracked,\n public readonly property: string | undefined,\n public readonly type: PropertyType,\n public readonly validator?: (\n trackedObjects: any,\n newValue: any,\n ) => string | undefined,\n public readonly noCoalesce?: boolean,\n ) {}\n}","import { Tracker } from \"./Tracker\";\nimport { validate } from \"./Registry\";\nimport { ITracked } from \"./ITracked\";\nimport { Operation } from \"./Operation\";\nimport { OperationProperties } from \"./OperationProperties\";\nimport { PropertyType } from \"./PropertyType\";\nimport { ExternalAssignment, getExternallyAssignedProperty } from \"./ExternallyAssigned\";\nimport { DependencyTracker } from \"./DependencyTracker\";\n\nexport abstract class TrackedObjectBase implements ITracked {\n private _dirtyCounter: number = 0;\n private _validationMessages: Map<string, string | undefined> | undefined;\n private _isValid: boolean = true;\n\n public get validationMessages(): Map<string, string | undefined> {\n return this._validationMessages ?? new Map<string, string>();\n }\n private set validationMessages(value: Map<string, string | undefined>) {\n this._validationMessages = value;\n }\n\n public get isValid(): boolean {\n return this._isValid;\n }\n private set isValid(value: boolean) {\n const wasValid = this._isValid;\n this._isValid = value;\n if (wasValid !== value) {\n this.tracker.onValidityChanged(wasValid, value);\n }\n }\n\n public get isDirty(): boolean {\n return this._dirtyCounter !== 0;\n }\n\n public get dirtyCounter(): number {\n return this._dirtyCounter;\n }\n protected set dirtyCounter(value: number) {\n this._dirtyCounter = value;\n }\n\n public constructor(public readonly tracker: Tracker) {\n if (process.env.NODE_ENV !== 'production' && !tracker.isConstructing) {\n throw new Error(`${this.constructor.name} must be created inside tracker.construct()`);\n }\n this.validationMessages = new Map<string, string>();\n tracker.trackObject(this);\n }\n\n public abstract onCommitted(lastOp?: Operation): void;\n public abstract markDeletion(): void;\n public abstract markAsNew(): void;\n\n public applyExternalAssignments(keys: ExternalAssignment[], lastOp?: Operation): void {\n const propertyName = getExternallyAssignedProperty(Object.getPrototypeOf(this));\n if (!propertyName || (this as any)[propertyName] >= 0) return;\n const response = keys.find((x) => x.placeholder === (this as any)[propertyName]);\n if (!response) return;\n const previousValue = (this as any)[propertyName];\n const newValue = response.value;\n const redoFn = () => { (this as any)[propertyName] = newValue; };\n const undoFn = () => { (this as any)[propertyName] = previousValue; };\n if (lastOp) {\n lastOp.add(redoFn, undoFn, new OperationProperties(this, propertyName, PropertyType.Number));\n }\n redoFn();\n }\n\n public validate(property: string, errorMessage: string | undefined): void {\n if (errorMessage) {\n this.validationMessages.set(property, errorMessage);\n } else {\n this.validationMessages.delete(property);\n }\n this.validationMessages = new Map(this.validationMessages);\n this.isValid = this.validationMessages.size === 0;\n }\n\n public applyValidation(messages: Map<string, string>): void {\n this.validationMessages = messages;\n this.isValid = messages.size === 0;\n }\n\n public destroy(): void {\n DependencyTracker.clearDeps(this);\n this.tracker.untrackObject(this);\n }\n}\n\nexport function validateDecorated(model: any): void {\n validate(model);\n}\n","export enum ObjectState {\n New = 'New',\n Unchanged = 'Unchanged',\n Edited = 'Edited',\n Deleted = 'Deleted',\n}\n","import { Tracker } from \"./Tracker\";\nimport { TrackedObjectBase } from \"./TrackedObjectBase\";\nimport { ObjectState } from \"./ObjectState\";\nimport { Operation } from \"./Operation\";\nimport { OperationProperties } from \"./OperationProperties\";\nimport { PropertyType } from \"./PropertyType\";\n\nexport abstract class TrackedObject extends TrackedObjectBase {\n public _committedState: ObjectState = ObjectState.Unchanged;\n\n public get state(): ObjectState {\n if (this._committedState === ObjectState.Unchanged && this.isDirty) {\n return ObjectState.Edited;\n }\n return this._committedState;\n }\n\n public constructor(tracker: Tracker, initialState: ObjectState = ObjectState.Unchanged) {\n super(tracker);\n this._committedState = initialState;\n }\n\n public onCommitted(_lastOp?: Operation): void {\n this.dirtyCounter = 0;\n }\n\n public markDeletion(): void {\n const prev = this._committedState;\n const target = prev === ObjectState.New ? ObjectState.Unchanged : ObjectState.Deleted;\n this.tracker.doAndTrack(\n () => { this._committedState = target; },\n () => { this._committedState = prev; },\n new OperationProperties(this, '__saveState__', PropertyType.Object),\n );\n }\n\n public markAsNew(): void {\n if (this._committedState !== ObjectState.Unchanged) return;\n if (this.tracker.isTrackingSuppressed) return;\n const prev = this._committedState;\n this.tracker.doAndTrack(\n () => { this._committedState = ObjectState.New; },\n () => { this._committedState = prev; },\n new OperationProperties(this, '__saveState__', PropertyType.Object),\n );\n }\n}\n","export enum VersionedObjectState {\n New = 'New',\n Unchanged = 'Unchanged',\n Edited = 'Edited',\n Deleted = 'Deleted',\n InsertReverted = 'InsertReverted',\n EditReverted = 'EditReverted',\n DeleteReverted = 'DeleteReverted',\n}\n","import { Tracker } from \"./Tracker\";\nimport { TrackedObjectBase } from \"./TrackedObjectBase\";\nimport { VersionedObjectState } from \"./VersionedObjectState\";\nimport { Operation } from \"./Operation\";\nimport { OperationProperties } from \"./OperationProperties\";\nimport { PropertyType } from \"./PropertyType\";\nimport { ExternalAssignment, getExternallyAssignedProperty } from \"./ExternallyAssigned\";\n\nexport abstract class VersionedTrackedObject extends TrackedObjectBase {\n public _committedState: VersionedObjectState = VersionedObjectState.Unchanged;\n public readonly pendingHardDeletes = new Set<number>();\n\n public get state(): VersionedObjectState {\n if (this._committedState === VersionedObjectState.Unchanged && this.isDirty) {\n return VersionedObjectState.Edited;\n }\n return this._committedState;\n }\n\n public constructor(tracker: Tracker, initialState: VersionedObjectState = VersionedObjectState.Unchanged) {\n super(tracker);\n this._committedState = initialState;\n }\n\n public onCommitted(lastOp?: Operation): void {\n const revertedState = this.revertedStateFor(this.state);\n if (revertedState !== null) {\n const reverted = revertedState;\n const redoFn = () => { this._committedState = VersionedObjectState.Unchanged; };\n const undoFn = () => { this._committedState = reverted; };\n if (lastOp) {\n lastOp.updateOrAdd(redoFn, undoFn, new OperationProperties(this, '__saveState__', PropertyType.Object));\n }\n redoFn();\n }\n this.dirtyCounter = 0;\n }\n\n public override applyExternalAssignments(keys: ExternalAssignment[], lastOp?: Operation): void {\n const propertyName = getExternallyAssignedProperty(Object.getPrototypeOf(this));\n const response = propertyName && (this as any)[propertyName] < 0\n ? keys.find((x) => x.placeholder === (this as any)[propertyName])\n : undefined;\n\n super.applyExternalAssignments(keys, lastOp);\n\n if (!response) return;\n const newValue = response.value;\n const redoFn = () => { this.pendingHardDeletes.delete(newValue); };\n const undoFn = () => { this.pendingHardDeletes.add(newValue); };\n if (lastOp) {\n lastOp.add(redoFn, undoFn, new OperationProperties(this, '__pendingHardDeletes__', PropertyType.Object));\n }\n redoFn();\n }\n\n public markAsNew(): void {\n if (this._committedState !== VersionedObjectState.Unchanged) return;\n if (this.tracker.isTrackingSuppressed) return;\n const prev = this._committedState;\n this.tracker.doAndTrack(\n () => { this._committedState = VersionedObjectState.New; },\n () => { this._committedState = prev; },\n new OperationProperties(this, '__saveState__', PropertyType.Object),\n );\n }\n\n public markDeletion(): void {\n const prev = this._committedState;\n const isNeverPersisted = prev === VersionedObjectState.New || prev === VersionedObjectState.InsertReverted;\n const target = isNeverPersisted ? VersionedObjectState.Unchanged : VersionedObjectState.Deleted;\n\n const propertyName = getExternallyAssignedProperty(Object.getPrototypeOf(this));\n const prevId = propertyName !== undefined ? (this as any)[propertyName] as number : undefined;\n const prevPendingHardDeletes = new Set(this.pendingHardDeletes);\n const prevDirtyCounter = this.dirtyCounter;\n\n this.tracker.doAndTrack(\n () => {\n this._committedState = target;\n if (isNeverPersisted) {\n this.dirtyCounter = 0;\n }\n if (propertyName !== undefined && prevId !== 0) {\n (this as any)[propertyName] = 0;\n }\n },\n () => {\n this._committedState = prev;\n if (isNeverPersisted) {\n this.dirtyCounter = prevDirtyCounter;\n }\n if (propertyName !== undefined) {\n (this as any)[propertyName] = prevId!;\n }\n this.pendingHardDeletes.clear();\n prevPendingHardDeletes.forEach(id => this.pendingHardDeletes.add(id));\n },\n new OperationProperties(this, '__saveState__', PropertyType.Object),\n );\n }\n\n private revertedStateFor(state: VersionedObjectState): VersionedObjectState | null {\n switch (state) {\n case VersionedObjectState.New: return VersionedObjectState.InsertReverted;\n case VersionedObjectState.Edited: return VersionedObjectState.EditReverted;\n case VersionedObjectState.Deleted: return VersionedObjectState.DeleteReverted;\n case VersionedObjectState.InsertReverted: return VersionedObjectState.InsertReverted;\n case VersionedObjectState.EditReverted: return VersionedObjectState.EditReverted;\n case VersionedObjectState.DeleteReverted: return VersionedObjectState.DeleteReverted;\n default: return null;\n }\n }\n}\n","import { TrackedObjectBase } from \"./TrackedObjectBase\";\nimport { OperationProperties } from \"./OperationProperties\";\nimport { PropertyType } from \"./PropertyType\";\nimport { ITracked } from \"./ITracked\";\nimport { registerPropertyValidator } from \"./Registry\";\nimport { DependencyTracker } from \"./DependencyTracker\";\n\nexport function Tracked<T extends TrackedObjectBase, V>(\n validator?: (self: T, newValue: V) => string | undefined,\n options?: { noCoalesce?: boolean },\n) {\n function decorator(\n target: ClassAccessorDecoratorTarget<T, V>,\n context: ClassAccessorDecoratorContext,\n ): ClassAccessorDecoratorResult<T, V>;\n function decorator(\n target: (this: T, value: V) => void,\n context: ClassSetterDecoratorContext,\n ): (this: T, value: V) => void;\n function decorator(\n target: ClassAccessorDecoratorTarget<T, V> | ((this: T, value: V) => void),\n context: ClassAccessorDecoratorContext | ClassSetterDecoratorContext,\n ): ClassAccessorDecoratorResult<T, V> | ((this: T, value: V) => void) {\n const propertyName = String(context.name);\n\n if (context.kind === \"accessor\") {\n const accessorTarget = target as ClassAccessorDecoratorTarget<T, V>;\n\n if (validator) {\n context.addInitializer(function (this: unknown) {\n registerPropertyValidator(\n Object.getPrototypeOf(this),\n propertyName,\n (model: any) => validator(model, (model as any)[propertyName]),\n );\n });\n }\n\n return {\n get(this: T): V {\n DependencyTracker.record(this, propertyName);\n return accessorTarget.get.call(this);\n },\n set(this: T, newValue: V) {\n const oldValue = accessorTarget.get.call(this);\n\n if (isSameValue(oldValue, newValue)) {\n return;\n }\n\n if (!this.tracker || this.tracker.isTrackingSuppressed) {\n accessorTarget.set.call(this, newValue);\n return;\n }\n\n const properties = new OperationProperties(\n this,\n propertyName,\n getPropertyType(newValue, oldValue),\n validator ? (model: any, v: any) => validator(model, v) : undefined,\n options?.noCoalesce,\n );\n\n this.tracker.doAndTrack(\n () => {\n accessorTarget.set.call(this, newValue);\n (this as unknown as ITracked).dirtyCounter++;\n },\n () => {\n accessorTarget.set.call(this, oldValue);\n (this as unknown as ITracked).dirtyCounter--;\n },\n properties,\n );\n },\n };\n } else {\n const setterFn = target as (this: T, value: V) => void;\n\n if (validator) {\n context.addInitializer(function (this: unknown) {\n registerPropertyValidator(\n Object.getPrototypeOf(this),\n propertyName,\n (model: any) => validator(model, (model as any)[propertyName]),\n );\n });\n }\n\n return function (this: T, newValue: V): void {\n const oldValue = (this as any)[propertyName] as V;\n\n if (isSameValue(oldValue, newValue)) {\n return;\n }\n\n if (!this.tracker || this.tracker.isTrackingSuppressed) {\n setterFn.call(this, newValue);\n return;\n }\n\n const properties = new OperationProperties(\n this,\n propertyName,\n getPropertyType(newValue, oldValue),\n validator ? (model: any, v: any) => validator(model, v) : undefined,\n );\n\n this.tracker.doAndTrack(\n () => {\n setterFn.call(this, newValue);\n (this as unknown as ITracked).dirtyCounter++;\n },\n () => {\n setterFn.call(this, oldValue);\n (this as unknown as ITracked).dirtyCounter--;\n },\n properties,\n );\n };\n }\n }\n\n return decorator;\n}\n\nfunction isSameValue(value1: any, value2: any): boolean {\n return (\n value1 === value2 ||\n ((value1 === undefined || value1 === null) && value2 === \"\") ||\n ((value2 === undefined || value2 === null) && value1 === \"\")\n );\n}\n\nfunction getPropertyType(newValue: any, oldValue: any): PropertyType {\n const v = newValue ?? oldValue;\n if (v instanceof Date) return PropertyType.Date;\n switch (typeof v) {\n case \"string\":\n return PropertyType.String;\n case \"boolean\":\n return PropertyType.Boolean;\n case \"number\":\n return PropertyType.Number;\n case \"object\":\n return PropertyType.Object;\n default:\n throw new Error(`Property type '${typeof v}' not supported`);\n }\n}\n","import { ITracked } from \"./ITracked\";\nimport { Tracker } from \"./Tracker\";\nimport { OperationProperties } from \"./OperationProperties\";\nimport { PropertyType } from \"./PropertyType\";\nimport { TypedEvent } from \"./TypedEvent\";\nimport { TrackedObjectBase } from \"./TrackedObjectBase\";\nimport { DependencyTracker, COLLECTION_VERSION_KEY } from \"./DependencyTracker\";\n\nexport class TrackedCollection<T> implements Array<T>, ITracked {\n private _collection: T[];\n private _isDirty: boolean;\n private _isValid: boolean;\n private _dirtyCounter: number = 0;\n private _error: string | undefined;\n private readAccess(): void {\n DependencyTracker.record(this, COLLECTION_VERSION_KEY);\n }\n\n public get dirtyCounter(): number {\n return this._dirtyCounter;\n }\n private set dirtyCounter(value: number) {\n this._dirtyCounter = value;\n }\n\n public get isDirty(): boolean {\n return this._isDirty;\n }\n private set isDirty(value: boolean) {\n this._isDirty = value;\n }\n\n public get isValid(): boolean {\n return this._isValid;\n }\n private set isValid(value: boolean) {\n const wasValid = this._isValid;\n this._isValid = value;\n if (wasValid !== value) {\n this.tracker.onValidityChanged(wasValid, value);\n }\n }\n\n public get length(): number {\n this.readAccess();\n return this._collection.length;\n }\n\n public get lastItemIndex(): number | undefined {\n this.readAccess();\n return this._collection.length > 0 ? this._collection.length - 1 : undefined;\n }\n\n public get collection(): T[] {\n return this._collection;\n }\n private set collection(value: T[]) {\n this._collection = value;\n }\n\n public get [Symbol.iterator]() {\n this.readAccess();\n return this.collection[Symbol.iterator].bind(this.collection);\n }\n\n public get [Symbol.unscopables]() {\n return this.collection[Symbol.unscopables];\n }\n\n public readonly changed: TypedEvent<TrackedCollectionChanged<T>> =\n new TypedEvent<TrackedCollectionChanged<T>>();\n\n [n: number]: T;\n\n public get error(): string | undefined {\n return this._error;\n }\n public set error(value: string | undefined) {\n this._error = value;\n }\n\n public constructor(\n public readonly tracker: Tracker,\n items?: T[],\n private readonly _validator?: (value: T[]) => string | undefined,\n ) {\n this._isValid = true;\n this._isDirty = false;\n this._collection = items ? [...items] : [];\n this.validate();\n this.tracker.trackCollection(this);\n }\n\n public validate(): void {\n this.error = this._validator ? this._validator(this.collection) : undefined;\n this.isValid = this.error === undefined;\n }\n\n public applyValidation(_messages: Map<string, string>): void {\n // Collections validate via validate() using their own validator, not the Registry.\n }\n\n public splice(start: number, deleteCount: number, ...items: T[]): T[] {\n let removed: T[];\n\n this.tracker.doAndTrack(\n () => {\n if (removed !== undefined) {\n this.doSplice(start, deleteCount, items, removed);\n } else {\n removed = this.doSplice(start, deleteCount, items);\n }\n this.trackRemovedObjectDeletions(removed);\n this.trackAddedObjectInsertions(items);\n },\n () => this.undoSplice(start, items, removed),\n new OperationProperties(this, undefined, PropertyType.Collection),\n );\n\n return removed!;\n }\n\n private doSplice(\n start: number,\n deleteCount: number,\n items: T[],\n reusedRemoved?: T[],\n ): T[] {\n let removed: T[];\n let event: TrackedCollectionChanged<T>;\n\n this.tracker.withTrackingSuppressed(() => {\n removed = this.collection.splice(start, deleteCount, ...items);\n this.collection = [...this.collection];\n event = new TrackedCollectionChanged<T>(items, removed, this.collection);\n });\n\n this.changed.emit(event!);\n\n return reusedRemoved ?? removed!;\n }\n\n private trackRemovedObjectDeletions(removed: T[]): void {\n for (const item of removed) {\n if (item instanceof TrackedObjectBase) {\n item.markDeletion();\n }\n }\n }\n\n private trackAddedObjectInsertions(added: T[]): void {\n for (const item of added) {\n if (item instanceof TrackedObjectBase) {\n item.markAsNew();\n }\n }\n }\n\n private undoSplice(start: number, items: T[], removed: T[]): void {\n this.tracker.withTrackingSuppressed(() => {\n this.collection.splice(start, items?.length ?? 0, ...removed);\n this.collection = [...this.collection];\n const event = new TrackedCollectionChanged<T>(\n removed,\n items,\n this.collection,\n );\n this.changed.emit(event);\n });\n }\n\n public reset(newItems: T[]): void {\n this.splice(0, this.collection.length, ...newItems);\n }\n\n public reverse(): T[] {\n this.collection.reverse();\n return this.collection;\n }\n\n public sort(compareFn?: (a: T, b: T) => number): this {\n if (this.length === 0) {\n return this;\n }\n this.collection.sort(compareFn);\n return this;\n }\n\n public clear(): void {\n if (this.length === 0) {\n return;\n }\n this.splice(0, this.length);\n }\n\n public remove(item: T): boolean {\n const itemIndex = this.collection.indexOf(item);\n if (itemIndex < 0) {\n return false;\n }\n\n this.splice(itemIndex, 1);\n\n return true;\n }\n\n public replace(item: T, replace: T): boolean {\n const itemIndex = this.collection.indexOf(item);\n if (itemIndex < 0) {\n return false;\n }\n\n this.splice(itemIndex, 1, replace);\n\n return true;\n }\n\n public replaceAt(index: number, replace: T): void {\n this.splice(index, 1, replace);\n }\n\n public pop(): T | undefined {\n return this.length === 0\n ? undefined\n : this.splice(this.collection.length - 1, 1)[0];\n }\n\n public push(...items: T[]): number {\n if (!items || items.length === 0) {\n return this.length;\n }\n this.splice((this.lastItemIndex ?? -1) + 1, 0, ...items);\n\n return this.length;\n }\n\n public concat(...items: (T | ConcatArray<T>)[]): T[] {\n this.readAccess();\n return this.collection.concat(...items);\n }\n\n public join(separator?: string): string {\n this.readAccess();\n return this.collection.join(separator);\n }\n\n public shift(): T | undefined {\n return this.length === 0 ? undefined : this.splice(0, 1)[0];\n }\n\n public slice(start?: number, end?: number): T[] {\n this.readAccess();\n return this.collection.slice(start, end);\n }\n\n public unshift(...items: T[]): number {\n this.splice(0, 0, ...items);\n return this.length;\n }\n\n public indexOf(searchElement: T, fromIndex?: number): number {\n this.readAccess();\n return this.collection.indexOf(searchElement, fromIndex);\n }\n\n public lastIndexOf(searchElement: T, fromIndex?: number): number {\n this.readAccess();\n return fromIndex !== undefined\n ? this.collection.lastIndexOf(searchElement, fromIndex)\n : this.collection.lastIndexOf(searchElement);\n }\n\n public every<S extends T>(\n predicate: (value: T, index: number, array: T[]) => value is S,\n thisArg?: any,\n ): this is S[];\n public every(\n predicate: (value: T, index: number, array: T[]) => unknown,\n thisArg?: any,\n ): boolean;\n public every(\n predicate: (value: T, index: number, array: T[]) => unknown,\n thisArg?: any,\n ): boolean {\n this.readAccess();\n return this.collection.every(predicate as any, thisArg);\n }\n\n public some(\n predicate: (value: T, index: number, array: T[]) => unknown,\n thisArg?: any,\n ): boolean {\n this.readAccess();\n return this.collection.some(predicate, thisArg);\n }\n\n public forEach(\n callbackfn: (value: T, index: number, array: T[]) => void,\n thisArg?: any,\n ): void {\n this.readAccess();\n this.collection.forEach(callbackfn, thisArg);\n }\n\n public map<U>(\n callbackfn: (value: T, index: number, array: T[]) => U,\n thisArg?: any,\n ): U[] {\n this.readAccess();\n return this.collection.map(callbackfn, thisArg);\n }\n\n public filter(\n predicate: (value: T, index: number, array: T[]) => unknown,\n thisArg?: any,\n ): T[] {\n this.readAccess();\n return this.collection.filter(predicate, thisArg);\n }\n\n public find(\n predicate: (value: T, index: number, obj: T[]) => unknown,\n thisArg?: any,\n ): T | undefined {\n this.readAccess();\n return this.collection.find(predicate, thisArg);\n }\n\n public findIndex(\n predicate: (value: T, index: number, obj: T[]) => unknown,\n thisArg?: any,\n ): number {\n this.readAccess();\n return this.collection.findIndex(predicate, thisArg);\n }\n\n public flatMap<U, This = undefined>(\n callback: (\n this: This,\n value: T,\n index: number,\n array: T[],\n ) => U | ReadonlyArray<U>,\n thisArg?: This,\n ): U[] {\n this.readAccess();\n return this.collection.flatMap(callback, thisArg);\n }\n\n public includes(searchElement: T, fromIndex?: number): boolean {\n this.readAccess();\n return this.collection.includes(searchElement, fromIndex);\n }\n\n public toString(): string {\n this.readAccess();\n return this.collection.toString();\n }\n\n public toLocaleString(): string {\n this.readAccess();\n return this.collection.toLocaleString();\n }\n\n public entries(): ArrayIterator<[number, T]> {\n this.readAccess();\n return this.collection.entries() as unknown as ArrayIterator<[number, T]>;\n }\n\n public keys(): ArrayIterator<number> {\n this.readAccess();\n return this.collection.keys() as unknown as ArrayIterator<number>;\n }\n\n public values(): ArrayIterator<T> {\n this.readAccess();\n return this.collection.values() as unknown as ArrayIterator<T>;\n }\n\n public at(index: number): T | undefined {\n this.readAccess();\n return this.collection.at(index);\n }\n\n public fill(value: T, start?: number, end?: number): this {\n const len = this.length;\n const s =\n start === undefined\n ? 0\n : start < 0\n ? Math.max(len + start, 0)\n : Math.min(start, len);\n const e =\n end === undefined\n ? len\n : end < 0\n ? Math.max(len + end, 0)\n : Math.min(end, len);\n if (s >= e) return this;\n this.splice(s, e - s, ...new Array<T>(e - s).fill(value));\n return this;\n }\n\n public copyWithin(target: number, start: number, end?: number): this {\n const len = this.length;\n const t = target < 0 ? Math.max(len + target, 0) : Math.min(target, len);\n const s = start < 0 ? Math.max(len + start, 0) : Math.min(start, len);\n const e =\n end === undefined\n ? len\n : end < 0\n ? Math.max(len + end, 0)\n : Math.min(end, len);\n const itemsToCopy = this.collection.slice(s, e);\n const count = Math.min(itemsToCopy.length, len - t);\n if (count > 0) {\n this.splice(t, count, ...itemsToCopy.slice(0, count));\n }\n return this;\n }\n\n public reduce(\n callbackfn: (\n previousValue: T,\n currentValue: T,\n currentIndex: number,\n array: T[],\n ) => T,\n initialValue?: T,\n ): T {\n this.readAccess();\n return initialValue !== undefined\n ? this.collection.reduce(callbackfn, initialValue)\n : this.collection.reduce(callbackfn);\n }\n\n public reduceRight(\n callbackfn: (\n previousValue: T,\n currentValue: T,\n currentIndex: number,\n array: T[],\n ) => T,\n initialValue?: T,\n ): T {\n this.readAccess();\n return initialValue !== undefined\n ? this.collection.reduceRight(callbackfn, initialValue)\n : this.collection.reduceRight(callbackfn);\n }\n\n public flat<A, D extends number = 1>(this: A, depth?: D): FlatArray<A, D>[] {\n DependencyTracker.record(this as object, COLLECTION_VERSION_KEY);\n return ((this as any)._collection as any[]).flat(depth) as FlatArray<\n A,\n D\n >[];\n }\n\n public findLast(\n predicate: (value: T, index: number, array: T[]) => unknown,\n thisArg?: any,\n ): T | undefined {\n this.readAccess();\n return this.collection.findLast(predicate, thisArg);\n }\n\n public findLastIndex(\n predicate: (value: T, index: number, array: T[]) => unknown,\n thisArg?: any,\n ): number {\n this.readAccess();\n return this.collection.findLastIndex(predicate, thisArg);\n }\n\n public toReversed(): T[] {\n this.readAccess();\n return this.collection.toReversed();\n }\n\n public toSorted(compareFn?: (a: T, b: T) => number): T[] {\n this.readAccess();\n return this.collection.toSorted(compareFn);\n }\n\n public toSpliced(start: number, deleteCount: number, ...items: T[]): T[] {\n this.readAccess();\n return this.collection.toSpliced(start, deleteCount, ...items);\n }\n\n public with(index: number, value: T): T[] {\n this.readAccess();\n return this.collection.with(index, value);\n }\n\n public first(): T | undefined {\n this.readAccess();\n return this._collection.length > 0 ? this._collection[0] : undefined;\n }\n\n public destroy(): void {\n this.tracker.untrackCollection(this);\n }\n}\n\nexport class TrackedCollectionChanged<T> {\n constructor(\n public readonly added: T[],\n public readonly removed: T[],\n public readonly newCollection: T[],\n ) {}\n}\n\ndeclare global {\n interface ArrayIterator<T> extends IterableIterator<T> {\n map<U>(callback: (value: T) => U): ArrayIterator<U>;\n filter(predicate: (value: T) => boolean): ArrayIterator<T>;\n take(count: number): ArrayIterator<T>;\n drop(count: number): ArrayIterator<T>;\n flatMap<U>(callback: (value: T) => U[]): ArrayIterator<U>;\n reduce<U>(callback: (acc: U, value: T) => U, initialValue: U): U;\n toArray(): T[];\n forEach(callback: (value: T) => void): void;\n some(predicate: (value: T) => boolean): boolean;\n every(predicate: (value: T) => boolean): boolean;\n find(predicate: (value: T) => boolean): T | undefined;\n }\n}\n"],"mappings":"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","names":["PropertyType","ObjectState","VersionedObjectState"]}
|
package/dist/dev/index.d.cts
CHANGED
|
@@ -241,12 +241,17 @@ declare class Tracker {
|
|
|
241
241
|
private _externallyAssignedPlaceholderCounter;
|
|
242
242
|
private _invalidCount;
|
|
243
243
|
private _constructionDepth;
|
|
244
|
+
private _composingBaseIndex;
|
|
245
|
+
private _composingRedoLength;
|
|
246
|
+
private _version;
|
|
244
247
|
readonly coalescingWindowMs: number | undefined;
|
|
245
248
|
readonly trackedObjects: TrackedObjectBase[];
|
|
246
249
|
readonly trackedCollections: TrackedCollection<any>[];
|
|
247
250
|
get isDirty(): boolean;
|
|
248
251
|
set isDirty(value: boolean);
|
|
249
252
|
readonly isDirtyChanged: TypedEvent<boolean>;
|
|
253
|
+
get version(): number;
|
|
254
|
+
readonly versionChanged: TypedEvent<number>;
|
|
250
255
|
get isValid(): boolean;
|
|
251
256
|
private set isValid(value);
|
|
252
257
|
readonly isValidChanged: TypedEvent<boolean>;
|
|
@@ -283,6 +288,9 @@ declare class Tracker {
|
|
|
283
288
|
isInUndoStack(op: Operation): boolean;
|
|
284
289
|
beforeCommit(): void;
|
|
285
290
|
private reset;
|
|
291
|
+
startCoalescing(): void;
|
|
292
|
+
endCoalescing(): void;
|
|
293
|
+
rollbackCoalescing(): void;
|
|
286
294
|
undo(): void;
|
|
287
295
|
redo(): void;
|
|
288
296
|
revalidate(): void;
|
package/dist/dev/index.d.ts
CHANGED
|
@@ -241,12 +241,17 @@ declare class Tracker {
|
|
|
241
241
|
private _externallyAssignedPlaceholderCounter;
|
|
242
242
|
private _invalidCount;
|
|
243
243
|
private _constructionDepth;
|
|
244
|
+
private _composingBaseIndex;
|
|
245
|
+
private _composingRedoLength;
|
|
246
|
+
private _version;
|
|
244
247
|
readonly coalescingWindowMs: number | undefined;
|
|
245
248
|
readonly trackedObjects: TrackedObjectBase[];
|
|
246
249
|
readonly trackedCollections: TrackedCollection<any>[];
|
|
247
250
|
get isDirty(): boolean;
|
|
248
251
|
set isDirty(value: boolean);
|
|
249
252
|
readonly isDirtyChanged: TypedEvent<boolean>;
|
|
253
|
+
get version(): number;
|
|
254
|
+
readonly versionChanged: TypedEvent<number>;
|
|
250
255
|
get isValid(): boolean;
|
|
251
256
|
private set isValid(value);
|
|
252
257
|
readonly isValidChanged: TypedEvent<boolean>;
|
|
@@ -283,6 +288,9 @@ declare class Tracker {
|
|
|
283
288
|
isInUndoStack(op: Operation): boolean;
|
|
284
289
|
beforeCommit(): void;
|
|
285
290
|
private reset;
|
|
291
|
+
startCoalescing(): void;
|
|
292
|
+
endCoalescing(): void;
|
|
293
|
+
rollbackCoalescing(): void;
|
|
286
294
|
undo(): void;
|
|
287
295
|
redo(): void;
|
|
288
296
|
revalidate(): void;
|