@katn30/trakr 1.0.0 → 1.1.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/TypedEvent.ts","../../src/Change.ts","../../src/Operation.ts","../../src/CollectionUtilities.ts","../../src/State.ts","../../src/DependencyTracker.ts","../../src/Registry.ts","../../src/Tracker.ts","../../src/OperationProperties.ts","../../src/ExternallyAssigned.ts","../../src/TrackedObjectStateMachine.ts","../../src/TrackedObject.ts","../../src/Tracked.ts","../../src/TrackedCollection.ts"],"sourcesContent":["export { Tracker } from './Tracker.js'\nexport { TrackedObject } from './TrackedObject.js'\nexport type { TrackedPropertyChanged } from './TrackedObject.js'\nexport { Tracked } from './Tracked.js'\nexport { TrackedCollection, TrackedCollectionChanged } from './TrackedCollection.js'\nexport { ITracked } from './ITracked.js'\nexport { AutoId } from './ExternallyAssigned.js'\nexport type { IdAssignment } from './ExternallyAssigned.js'\nexport { TypedEvent } from './TypedEvent.js'\nexport { State } from './State.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","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 enum State {\n Unchanged = 'Unchanged',\n Insert = 'Insert',\n Changed = 'Changed',\n Deleted = 'Deleted',\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 { IdAssignment } from \"./ExternallyAssigned\";\nimport { State } from \"./State\";\nimport { validate, validateSingleProperty } from \"./Registry\";\nimport { DependencyTracker, COLLECTION_VERSION_KEY } from \"./DependencyTracker\";\nimport { ITracked } from \"./ITracked\";\nimport { TrackedObject } from \"./TrackedObject\";\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 _placeholderCounter = -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 public _isReplaying: boolean = false;\n\n public readonly trackedObjects: TrackedObject[] = [];\n\n public get deletedObjects(): TrackedObject[] {\n return this.trackedObjects.filter(obj => obj.state === State.Deleted);\n }\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 /** @internal */\n public get _isTrackingSuppressed(): boolean {\n return this._suppressTrackingCounter > 0;\n }\n\n /** @internal */\n public get _isConstructing(): boolean {\n return this._constructionDepth > 0;\n }\n\n public constructor() {\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 /** @internal */\n public _trackObject(trackedObject: TrackedObject) {\n this.trackedObjects.push(trackedObject);\n }\n\n /** @internal */\n public _untrackObject(trackedObject: TrackedObject) {\n this.trackedObjects.splice(this.trackedObjects.indexOf(trackedObject), 1);\n if (!trackedObject.isValid) this._invalidCount--;\n this.isValid = this._invalidCount === 0;\n }\n\n /** @internal */\n public _trackCollection(trackedCollection: TrackedCollection<any>): void {\n this.trackedCollections.push(trackedCollection);\n }\n\n /** @internal */\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 /** @internal */\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 /** @internal */\n public _doAndTrack(\n redoAction: () => void,\n undoAction: () => void,\n properties: OperationProperties,\n ): void {\n if (this._isReplaying) return;\n\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 this.versionChanged.emit(this._version);\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 unknown 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!, properties.coalesceWithin!)\n );\n }\n\n private isCoalescibleType(properties: OperationProperties): boolean {\n return (\n properties.coalesceWithin !== undefined &&\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, coalesceWithin: number): boolean {\n return (\n new Date().getTime() -\n CollectionUtilities.getLast(lastOperation.actions)!.time.getTime() <\n coalesceWithin\n );\n }\n\n /** @internal */\n public _nextPlaceholder(): number {\n return this._placeholderCounter--;\n }\n\n public onCommit(keys?: IdAssignment[]): void {\n const lastOp = CollectionUtilities.getLast(this._undoOperations);\n this.trackedObjects.forEach((obj) => obj._onCommitted(lastOp, keys));\n this._commitStateOperation = lastOp;\n this.reset();\n }\n\n /** @internal */\n public _isInUndoStack(op: Operation): boolean {\n return this._undoOperations.includes(op);\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 startComposing(): void {\n if (this._composingBaseIndex !== undefined) return;\n this._composingBaseIndex = this._undoOperations.length;\n this._composingRedoLength = this._redoOperations.length;\n }\n\n public endComposing(): 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 rollbackComposing(): 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._isReplaying = true;\n this.withTrackingSuppressed(() => undoOperation.undo());\n this._isReplaying = false;\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._isReplaying = true;\n this.withTrackingSuppressed(() => redoOperation.redo());\n this._isReplaying = false;\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 coalesceWithin?: number,\n ) {}\n}","export interface IdAssignment {\n placeholder: number;\n value: number;\n}\n\nconst AUTO_ID = Symbol(\"autoId\");\n\nexport function AutoId<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), AUTO_ID, {\n value: String(context.name),\n configurable: true,\n });\n });\n}\n\nexport function getAutoIdProperty(\n proto: object,\n): string | undefined {\n return AUTO_ID in proto\n ? ((proto as any)[AUTO_ID] as string)\n : undefined;\n}\n","import { State } from \"./State\";\nimport { IdAssignment } from \"./ExternallyAssigned\";\n\nexport type StateEvent = 'added' | 'removed' | 'committed';\nexport type StateDirection = 'do' | 'undo';\n\nexport interface StateContext {\n prevState?: State;\n prevDirtyCounter?: number;\n autoIdProp?: string;\n realId?: number;\n}\n\nexport interface StateTarget {\n idPlaceholder: number | null;\n state: State;\n _setState(value: State): void;\n _getDirtyCounter(): number;\n _setDirtyCounter(value: number): void;\n readonly tracker: { _nextPlaceholder(): number };\n}\n\nexport function applyStateTransition(\n obj: StateTarget,\n event: StateEvent,\n direction: StateDirection,\n context?: StateContext,\n): void {\n if (event === 'added') {\n applyAdded(obj, direction);\n } else if (event === 'removed') {\n applyRemoved(obj, direction, context);\n } else {\n applyCommitted(obj, direction, context);\n }\n}\n\nfunction applyAdded(obj: StateTarget, direction: StateDirection): void {\n if (direction === 'undo') {\n obj._setState(State.Unchanged);\n obj.idPlaceholder = null;\n } else {\n obj._setState(State.Insert);\n obj.idPlaceholder = obj.tracker._nextPlaceholder();\n }\n}\n\nfunction applyRemoved(obj: StateTarget, direction: StateDirection, context?: StateContext): void {\n if (direction === 'undo') {\n const prev = context?.prevState ?? State.Unchanged;\n obj._setState(prev);\n if (prev === State.Insert) {\n obj.idPlaceholder = obj.tracker._nextPlaceholder();\n if (context?.prevDirtyCounter !== undefined) {\n obj._setDirtyCounter(context.prevDirtyCounter);\n }\n } else {\n obj.idPlaceholder = null;\n }\n } else {\n if (obj.state === State.Insert) {\n obj._setState(State.Unchanged);\n obj.idPlaceholder = null;\n obj._setDirtyCounter(0);\n } else {\n obj._setState(State.Deleted);\n }\n }\n}\n\nfunction applyCommitted(obj: StateTarget, direction: StateDirection, context?: StateContext): void {\n if (direction === 'undo') {\n const prev = context?.prevState ?? State.Unchanged;\n if (prev === State.Insert) {\n // committed insert was undone: item now exists on server → mark Deleted so save layer sends DELETE\n obj._setState(State.Deleted);\n obj.idPlaceholder = null;\n // @AutoId keeps the real server id — needed for the DELETE request\n } else if (prev === State.Deleted) {\n // committed delete was undone: re-insert needed → assign fresh placeholder\n obj._setState(State.Insert);\n obj.idPlaceholder = obj.tracker._nextPlaceholder();\n } else if (prev === State.Changed) {\n // committed update was undone: property undo closures restore values and dirtyCounter\n obj._setState(State.Changed);\n }\n // prevState=Unchanged: no state change needed\n } else {\n if (context?.prevState === State.Insert && context.autoIdProp && context.realId !== undefined) {\n (obj as any)[context.autoIdProp] = context.realId;\n }\n obj.idPlaceholder = null;\n obj._setState(State.Unchanged);\n obj._setDirtyCounter(0);\n }\n}\n\nexport function buildCommittedContext(\n obj: StateTarget & { [key: string]: any },\n autoIdProp: string | undefined,\n keys: IdAssignment[] | undefined,\n): StateContext {\n const prevState = obj.state;\n let realId: number | undefined;\n if (prevState === State.Insert && obj.idPlaceholder !== null && keys) {\n realId = keys.find((k) => k.placeholder === obj.idPlaceholder)?.value;\n }\n return { prevState, autoIdProp, realId };\n}\n","import { Tracker } from \"./Tracker\";\nimport { State } from \"./State\";\nimport { TypedEvent } from \"./TypedEvent\";\nimport { Operation } from \"./Operation\";\nimport { OperationProperties } from \"./OperationProperties\";\nimport { PropertyType } from \"./PropertyType\";\nimport { IdAssignment, getAutoIdProperty } from \"./ExternallyAssigned\";\nimport { DependencyTracker } from \"./DependencyTracker\";\nimport { ITracked } from \"./ITracked\";\nimport {\n StateTarget,\n applyStateTransition,\n buildCommittedContext,\n} from \"./TrackedObjectStateMachine\";\n\nexport interface TrackedPropertyChanged {\n property: string;\n oldValue: unknown;\n newValue: unknown;\n}\n\nexport abstract class TrackedObject implements ITracked, StateTarget {\n private _dirtyCounter: number = 0;\n private _validationMessages: Map<string, string | undefined> | undefined;\n private _isValid: boolean = true;\n private _state: State = State.Unchanged;\n\n public idPlaceholder: number | null = null;\n\n public readonly changed: TypedEvent<TrackedPropertyChanged> = new TypedEvent<TrackedPropertyChanged>();\n public readonly trackedChanged: TypedEvent<TrackedPropertyChanged> = new TypedEvent<TrackedPropertyChanged>();\n\n // ---- StateTarget interface (internal) ----\n\n /** @internal */\n get state(): State {\n return this._state;\n }\n\n /** @internal */\n _setState(value: State): void {\n this._state = value;\n }\n\n /** @internal */\n _getDirtyCounter(): number {\n return this._dirtyCounter;\n }\n\n /** @internal */\n _setDirtyCounter(value: number): void {\n this._dirtyCounter = value;\n }\n\n // ---- Public API ----\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 /** @internal */\n public _onCommitted(lastOp?: Operation, keys?: IdAssignment[]): void {\n const autoIdProp = getAutoIdProperty(Object.getPrototypeOf(this));\n const context = buildCommittedContext(this, autoIdProp, keys);\n\n const redoFn = () => applyStateTransition(this, 'committed', 'do', context);\n const undoFn = () => applyStateTransition(this, 'committed', 'undo', context);\n\n if (lastOp) {\n lastOp.updateOrAdd(redoFn, undoFn, new OperationProperties(this, '__state__', PropertyType.Object));\n }\n redoFn();\n }\n\n /** @internal */\n public _markRemoved(): void {\n const prevState = this._state;\n const prevDirtyCounter = this._dirtyCounter;\n\n this.tracker._doAndTrack(\n () => applyStateTransition(this, 'removed', 'do'),\n () => applyStateTransition(this, 'removed', 'undo', { prevState, prevDirtyCounter }),\n new OperationProperties(this, '__state__', PropertyType.Object),\n );\n }\n\n /** @internal */\n public _markAdded(): void {\n if (this._state !== State.Unchanged) return;\n if (this.tracker._isTrackingSuppressed) return;\n this.tracker._doAndTrack(\n () => applyStateTransition(this, 'added', 'do'),\n () => applyStateTransition(this, 'added', 'undo'),\n new OperationProperties(this, '__state__', PropertyType.Object),\n );\n }\n\n /** @internal */\n _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 /** @internal */\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","import { TrackedObject } from \"./TrackedObject\";\nimport { OperationProperties } from \"./OperationProperties\";\nimport { PropertyType } from \"./PropertyType\";\nimport { ITracked } from \"./ITracked\";\nimport { State } from \"./State\";\nimport { registerPropertyValidator } from \"./Registry\";\nimport { DependencyTracker } from \"./DependencyTracker\";\n\nexport function Tracked(\n validator?: (self: any, newValue: any) => string | undefined,\n onChange?: (self: any, newValue: any, oldValue: any) => void,\n options?: { coalesceWithin?: number },\n) {\n function decorator<T extends TrackedObject, V>(\n target: ClassAccessorDecoratorTarget<T, V>,\n context: ClassAccessorDecoratorContext<T, V>,\n ): ClassAccessorDecoratorResult<T, V>;\n function decorator<T extends TrackedObject, V>(\n target: (this: T, value: V) => void,\n context: ClassSetterDecoratorContext<T, V>,\n ): (this: T, value: V) => void;\n function decorator<T extends TrackedObject, V>(\n target: (this: T) => V,\n context: ClassGetterDecoratorContext<T, V>,\n ): (this: T) => V;\n function decorator(\n target: any,\n context: any,\n ): any {\n const propertyName = String(context.name);\n\n if (context.kind === \"getter\") {\n const getterFn = target as (this: any) => any;\n return function (this: any): any {\n DependencyTracker.record(this, propertyName);\n return getterFn.call(this);\n };\n }\n\n if (context.kind === \"accessor\") {\n const accessorTarget = target as ClassAccessorDecoratorTarget<any, any>;\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: any): any {\n DependencyTracker.record(this, propertyName);\n return accessorTarget.get.call(this);\n },\n set(this: any, newValue: any) {\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?.coalesceWithin,\n );\n\n this.tracker._doAndTrack(\n () => {\n accessorTarget.set.call(this, newValue);\n const tracked = this as unknown as ITracked;\n tracked.dirtyCounter++;\n if (tracked.state === State.Unchanged) tracked._setState(State.Changed);\n if (oldValue instanceof TrackedObject) oldValue._markRemoved();\n if (newValue instanceof TrackedObject) newValue._markAdded();\n if (!this.tracker._isReplaying && onChange) {\n onChange(this, newValue, oldValue);\n }\n this.changed.emit({ property: propertyName, oldValue, newValue });\n if (!this.tracker._isReplaying) {\n this.trackedChanged.emit({ property: propertyName, oldValue, newValue });\n }\n },\n () => {\n accessorTarget.set.call(this, oldValue);\n const tracked = this as unknown as ITracked;\n tracked.dirtyCounter--;\n if (tracked.dirtyCounter === 0 && tracked.state === State.Changed) tracked._setState(State.Unchanged);\n this.changed.emit({ property: propertyName, oldValue: newValue, newValue: oldValue });\n },\n properties,\n );\n },\n };\n } else {\n const setterFn = target as (this: any, value: any) => 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: any, newValue: any): void {\n const oldValue = (this as any)[propertyName];\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 options?.coalesceWithin,\n );\n\n this.tracker._doAndTrack(\n () => {\n setterFn.call(this, newValue);\n const tracked = this as unknown as ITracked;\n tracked.dirtyCounter++;\n if (tracked.state === State.Unchanged) tracked._setState(State.Changed);\n if (oldValue instanceof TrackedObject) oldValue._markRemoved();\n if (newValue instanceof TrackedObject) newValue._markAdded();\n this.changed.emit({ property: propertyName, oldValue, newValue });\n if (!this.tracker._isReplaying) {\n this.trackedChanged.emit({ property: propertyName, oldValue, newValue });\n }\n },\n () => {\n setterFn.call(this, oldValue);\n const tracked = this as unknown as ITracked;\n tracked.dirtyCounter--;\n if (tracked.dirtyCounter === 0 && tracked.state === State.Changed) tracked._setState(State.Unchanged);\n this.changed.emit({ property: propertyName, oldValue: newValue, newValue: oldValue });\n },\n properties,\n );\n };\n }\n }\n\n return decorator;\n}\n\nfunction isSameValue(value1: any, value2: any): boolean {\n return value1 === value2;\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 { State } from \"./State\";\nimport { Tracker } from \"./Tracker\";\nimport { OperationProperties } from \"./OperationProperties\";\nimport { PropertyType } from \"./PropertyType\";\nimport { TypedEvent } from \"./TypedEvent\";\nimport { TrackedObject } from \"./TrackedObject\";\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 public readonly trackedChanged: 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 /** @internal */\n readonly state = State.Unchanged as State;\n\n /** @internal */\n _setState(_value: State): void {\n // Collections do not have a State — this satisfies the ITracked interface only.\n }\n\n /** @internal */\n _validate(): void {\n this.error = this._validator ? this._validator(this.collection) : undefined;\n this.isValid = this.error === undefined;\n }\n\n /** @internal */\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 if (!this.tracker._isReplaying) {\n this.trackedChanged.emit(new TrackedCollectionChanged(items, removed, this._collection));\n }\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 TrackedObject) {\n item._markRemoved();\n }\n }\n }\n\n private trackAddedObjectInsertions(added: T[]): void {\n for (const item of added) {\n if (item instanceof TrackedObject) {\n item._markAdded();\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":["State"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/TypedEvent.ts","../../src/Change.ts","../../src/Operation.ts","../../src/CollectionUtilities.ts","../../src/State.ts","../../src/DependencyTracker.ts","../../src/Registry.ts","../../src/Tracker.ts","../../src/OperationProperties.ts","../../src/ExternallyAssigned.ts","../../src/TrackedObjectStateMachine.ts","../../src/TrackedObject.ts","../../src/Tracked.ts","../../src/TrackedCollection.ts"],"sourcesContent":["export { Tracker } from './Tracker.js'\nexport { TrackedObject } from './TrackedObject.js'\nexport type { TrackedPropertyChanged } from './TrackedObject.js'\nexport { Tracked } from './Tracked.js'\nexport { TrackedCollection, TrackedCollectionChanged } from './TrackedCollection.js'\nexport { ITracked } from './ITracked.js'\nexport { AutoId } from './ExternallyAssigned.js'\nexport type { IdAssignment } from './ExternallyAssigned.js'\nexport { TypedEvent } from './TypedEvent.js'\nexport { State } from './State.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","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 enum State {\n Unchanged = 'Unchanged',\n Insert = 'Insert',\n Changed = 'Changed',\n Deleted = 'Deleted',\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 { IdAssignment } from \"./ExternallyAssigned\";\nimport { State } from \"./State\";\nimport { validate, validateSingleProperty } from \"./Registry\";\nimport { DependencyTracker, COLLECTION_VERSION_KEY } from \"./DependencyTracker\";\nimport { ITracked } from \"./ITracked\";\nimport { TrackedObject } from \"./TrackedObject\";\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 _trackingIdCounter = 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 public _isReplaying: boolean = false;\n\n public readonly trackedObjects: TrackedObject[] = [];\n\n public get deletedObjects(): TrackedObject[] {\n return this.trackedObjects.filter(obj => obj.state === State.Deleted);\n }\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 /** @internal */\n public get _isTrackingSuppressed(): boolean {\n return this._suppressTrackingCounter > 0;\n }\n\n /** @internal */\n public get _isConstructing(): boolean {\n return this._constructionDepth > 0;\n }\n\n public constructor() {\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 /** @internal */\n public _trackObject(trackedObject: TrackedObject) {\n this.trackedObjects.push(trackedObject);\n }\n\n /** @internal */\n public _untrackObject(trackedObject: TrackedObject) {\n this.trackedObjects.splice(this.trackedObjects.indexOf(trackedObject), 1);\n if (!trackedObject.isValid) this._invalidCount--;\n this.isValid = this._invalidCount === 0;\n }\n\n /** @internal */\n public _trackCollection(trackedCollection: TrackedCollection<any>): void {\n this.trackedCollections.push(trackedCollection);\n }\n\n /** @internal */\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 /** @internal */\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 /** @internal */\n public _doAndTrack(\n redoAction: () => void,\n undoAction: () => void,\n properties: OperationProperties,\n ): void {\n if (this._isReplaying) return;\n\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 this.versionChanged.emit(this._version);\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 unknown 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!, properties.coalesceWithin!)\n );\n }\n\n private isCoalescibleType(properties: OperationProperties): boolean {\n return (\n properties.coalesceWithin !== undefined &&\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, coalesceWithin: number): boolean {\n return (\n new Date().getTime() -\n CollectionUtilities.getLast(lastOperation.actions)!.time.getTime() <\n coalesceWithin\n );\n }\n\n /** @internal */\n public _nextTrackingId(): number {\n return this._trackingIdCounter++;\n }\n\n public onCommit(keys?: IdAssignment[]): void {\n const lastOp = CollectionUtilities.getLast(this._undoOperations);\n this.trackedObjects.forEach((obj) => obj._onCommitted(lastOp, keys));\n this._commitStateOperation = lastOp;\n this.reset();\n }\n\n /** @internal */\n public _isInUndoStack(op: Operation): boolean {\n return this._undoOperations.includes(op);\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 startComposing(): void {\n if (this._composingBaseIndex !== undefined) return;\n this._composingBaseIndex = this._undoOperations.length;\n this._composingRedoLength = this._redoOperations.length;\n }\n\n public endComposing(): 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 rollbackComposing(): 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._isReplaying = true;\n this.withTrackingSuppressed(() => undoOperation.undo());\n this._isReplaying = false;\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._isReplaying = true;\n this.withTrackingSuppressed(() => redoOperation.redo());\n this._isReplaying = false;\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 coalesceWithin?: number,\n ) {}\n}","export interface IdAssignment {\n trackingId: number;\n value: number;\n}\n\nconst AUTO_ID = Symbol(\"autoId\");\n\nexport function AutoId<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), AUTO_ID, {\n value: String(context.name),\n configurable: true,\n });\n });\n}\n\nexport function getAutoIdProperty(\n proto: object,\n): string | undefined {\n return AUTO_ID in proto\n ? ((proto as any)[AUTO_ID] as string)\n : undefined;\n}\n","import { State } from \"./State\";\nimport { IdAssignment } from \"./ExternallyAssigned\";\n\nexport type StateEvent = 'added' | 'removed' | 'committed';\nexport type StateDirection = 'do' | 'undo';\n\nexport interface StateContext {\n prevState?: State;\n prevDirtyCounter?: number;\n autoIdProp?: string;\n realId?: number;\n}\n\nexport interface StateTarget {\n trackingId: number;\n state: State;\n _setState(value: State): void;\n _getDirtyCounter(): number;\n _setDirtyCounter(value: number): void;\n}\n\nexport function applyStateTransition(\n obj: StateTarget,\n event: StateEvent,\n direction: StateDirection,\n context?: StateContext,\n): void {\n if (event === 'added') {\n applyAdded(obj, direction);\n } else if (event === 'removed') {\n applyRemoved(obj, direction, context);\n } else {\n applyCommitted(obj, direction, context);\n }\n}\n\nfunction applyAdded(obj: StateTarget, direction: StateDirection): void {\n if (direction === 'undo') {\n obj._setState(State.Unchanged);\n } else {\n obj._setState(State.Insert);\n }\n}\n\nfunction applyRemoved(obj: StateTarget, direction: StateDirection, context?: StateContext): void {\n if (direction === 'undo') {\n const prev = context?.prevState ?? State.Unchanged;\n obj._setState(prev);\n if (prev === State.Insert) {\n if (context?.prevDirtyCounter !== undefined) {\n obj._setDirtyCounter(context.prevDirtyCounter);\n }\n }\n } else {\n if (obj.state === State.Insert) {\n obj._setState(State.Unchanged);\n obj._setDirtyCounter(0);\n } else {\n obj._setState(State.Deleted);\n }\n }\n}\n\nfunction applyCommitted(obj: StateTarget, direction: StateDirection, context?: StateContext): void {\n if (direction === 'undo') {\n const prev = context?.prevState ?? State.Unchanged;\n if (prev === State.Insert) {\n // committed insert was undone: item now exists on server → mark Deleted so save layer sends DELETE\n obj._setState(State.Deleted);\n // @AutoId keeps the real server id — needed for the DELETE request\n } else if (prev === State.Deleted) {\n // committed delete was undone: re-insert needed\n obj._setState(State.Insert);\n } else if (prev === State.Changed) {\n // committed update was undone: property undo closures restore values and dirtyCounter\n obj._setState(State.Changed);\n }\n // prevState=Unchanged: no state change needed\n } else {\n if (\n (context?.prevState === State.Insert || context?.prevState === State.Changed) &&\n context.autoIdProp &&\n context.realId !== undefined\n ) {\n (obj as any)[context.autoIdProp] = context.realId;\n }\n obj._setState(State.Unchanged);\n obj._setDirtyCounter(0);\n }\n}\n\nexport function buildCommittedContext(\n obj: StateTarget & { [key: string]: any },\n autoIdProp: string | undefined,\n keys: IdAssignment[] | undefined,\n): StateContext {\n const prevState = obj.state;\n let realId: number | undefined;\n if (\n (prevState === State.Insert || prevState === State.Changed) &&\n keys\n ) {\n realId = keys.find((k) => k.trackingId === obj.trackingId)?.value;\n }\n return { prevState, autoIdProp, realId };\n}\n","import { Tracker } from \"./Tracker\";\nimport { State } from \"./State\";\nimport { TypedEvent } from \"./TypedEvent\";\nimport { Operation } from \"./Operation\";\nimport { OperationProperties } from \"./OperationProperties\";\nimport { PropertyType } from \"./PropertyType\";\nimport { IdAssignment, getAutoIdProperty } from \"./ExternallyAssigned\";\nimport { DependencyTracker } from \"./DependencyTracker\";\nimport { ITracked } from \"./ITracked\";\nimport {\n StateTarget,\n applyStateTransition,\n buildCommittedContext,\n} from \"./TrackedObjectStateMachine\";\n\nexport interface TrackedPropertyChanged {\n property: string;\n oldValue: unknown;\n newValue: unknown;\n}\n\nexport abstract class TrackedObject implements ITracked, StateTarget {\n private _dirtyCounter: number = 0;\n private _validationMessages: Map<string, string | undefined> | undefined;\n private _isValid: boolean = true;\n private _state: State = State.Unchanged;\n\n public readonly trackingId: number;\n\n public readonly changed: TypedEvent<TrackedPropertyChanged> = new TypedEvent<TrackedPropertyChanged>();\n public readonly trackedChanged: TypedEvent<TrackedPropertyChanged> = new TypedEvent<TrackedPropertyChanged>();\n\n // ---- StateTarget interface (internal) ----\n\n /** @internal */\n get state(): State {\n return this._state;\n }\n\n /** @internal */\n _setState(value: State): void {\n this._state = value;\n }\n\n /** @internal */\n _getDirtyCounter(): number {\n return this._dirtyCounter;\n }\n\n /** @internal */\n _setDirtyCounter(value: number): void {\n this._dirtyCounter = value;\n }\n\n // ---- Public API ----\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.trackingId = tracker._nextTrackingId();\n this.validationMessages = new Map<string, string>();\n tracker._trackObject(this);\n }\n\n /** @internal */\n public _onCommitted(lastOp?: Operation, keys?: IdAssignment[]): void {\n const autoIdProp = getAutoIdProperty(Object.getPrototypeOf(this));\n const context = buildCommittedContext(this, autoIdProp, keys);\n\n const redoFn = () => applyStateTransition(this, 'committed', 'do', context);\n const undoFn = () => applyStateTransition(this, 'committed', 'undo', context);\n\n if (lastOp) {\n lastOp.updateOrAdd(redoFn, undoFn, new OperationProperties(this, '__state__', PropertyType.Object));\n }\n redoFn();\n }\n\n /** @internal */\n public _markRemoved(): void {\n const prevState = this._state;\n const prevDirtyCounter = this._dirtyCounter;\n\n this.tracker._doAndTrack(\n () => applyStateTransition(this, 'removed', 'do'),\n () => applyStateTransition(this, 'removed', 'undo', { prevState, prevDirtyCounter }),\n new OperationProperties(this, '__state__', PropertyType.Object),\n );\n }\n\n /** @internal */\n public _markAdded(): void {\n if (this._state !== State.Unchanged) return;\n if (this.tracker._isTrackingSuppressed) return;\n this.tracker._doAndTrack(\n () => applyStateTransition(this, 'added', 'do'),\n () => applyStateTransition(this, 'added', 'undo'),\n new OperationProperties(this, '__state__', PropertyType.Object),\n );\n }\n\n /** @internal */\n _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 /** @internal */\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","import { TrackedObject } from \"./TrackedObject\";\nimport { OperationProperties } from \"./OperationProperties\";\nimport { PropertyType } from \"./PropertyType\";\nimport { ITracked } from \"./ITracked\";\nimport { State } from \"./State\";\nimport { registerPropertyValidator } from \"./Registry\";\nimport { DependencyTracker } from \"./DependencyTracker\";\n\nexport function Tracked(\n validator?: (self: any, newValue: any) => string | undefined,\n onChange?: (self: any, newValue: any, oldValue: any) => void,\n options?: { coalesceWithin?: number },\n) {\n function decorator<T extends TrackedObject, V>(\n target: ClassAccessorDecoratorTarget<T, V>,\n context: ClassAccessorDecoratorContext<T, V>,\n ): ClassAccessorDecoratorResult<T, V>;\n function decorator<T extends TrackedObject, V>(\n target: (this: T, value: V) => void,\n context: ClassSetterDecoratorContext<T, V>,\n ): (this: T, value: V) => void;\n function decorator<T extends TrackedObject, V>(\n target: (this: T) => V,\n context: ClassGetterDecoratorContext<T, V>,\n ): (this: T) => V;\n function decorator(\n target: any,\n context: any,\n ): any {\n const propertyName = String(context.name);\n\n if (context.kind === \"getter\") {\n const getterFn = target as (this: any) => any;\n return function (this: any): any {\n DependencyTracker.record(this, propertyName);\n return getterFn.call(this);\n };\n }\n\n if (context.kind === \"accessor\") {\n const accessorTarget = target as ClassAccessorDecoratorTarget<any, any>;\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: any): any {\n DependencyTracker.record(this, propertyName);\n return accessorTarget.get.call(this);\n },\n set(this: any, newValue: any) {\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?.coalesceWithin,\n );\n\n this.tracker._doAndTrack(\n () => {\n accessorTarget.set.call(this, newValue);\n const tracked = this as unknown as ITracked;\n tracked.dirtyCounter++;\n if (tracked.state === State.Unchanged) tracked._setState(State.Changed);\n if (oldValue instanceof TrackedObject) oldValue._markRemoved();\n if (newValue instanceof TrackedObject) newValue._markAdded();\n if (!this.tracker._isReplaying && onChange) {\n onChange(this, newValue, oldValue);\n }\n this.changed.emit({ property: propertyName, oldValue, newValue });\n if (!this.tracker._isReplaying) {\n this.trackedChanged.emit({ property: propertyName, oldValue, newValue });\n }\n },\n () => {\n accessorTarget.set.call(this, oldValue);\n const tracked = this as unknown as ITracked;\n tracked.dirtyCounter--;\n if (tracked.dirtyCounter === 0 && tracked.state === State.Changed) tracked._setState(State.Unchanged);\n this.changed.emit({ property: propertyName, oldValue: newValue, newValue: oldValue });\n },\n properties,\n );\n },\n };\n } else {\n const setterFn = target as (this: any, value: any) => 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: any, newValue: any): void {\n const oldValue = (this as any)[propertyName];\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 options?.coalesceWithin,\n );\n\n this.tracker._doAndTrack(\n () => {\n setterFn.call(this, newValue);\n const tracked = this as unknown as ITracked;\n tracked.dirtyCounter++;\n if (tracked.state === State.Unchanged) tracked._setState(State.Changed);\n if (oldValue instanceof TrackedObject) oldValue._markRemoved();\n if (newValue instanceof TrackedObject) newValue._markAdded();\n this.changed.emit({ property: propertyName, oldValue, newValue });\n if (!this.tracker._isReplaying) {\n this.trackedChanged.emit({ property: propertyName, oldValue, newValue });\n }\n },\n () => {\n setterFn.call(this, oldValue);\n const tracked = this as unknown as ITracked;\n tracked.dirtyCounter--;\n if (tracked.dirtyCounter === 0 && tracked.state === State.Changed) tracked._setState(State.Unchanged);\n this.changed.emit({ property: propertyName, oldValue: newValue, newValue: oldValue });\n },\n properties,\n );\n };\n }\n }\n\n return decorator;\n}\n\nfunction isSameValue(value1: any, value2: any): boolean {\n return value1 === value2;\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 { State } from \"./State\";\nimport { Tracker } from \"./Tracker\";\nimport { OperationProperties } from \"./OperationProperties\";\nimport { PropertyType } from \"./PropertyType\";\nimport { TypedEvent } from \"./TypedEvent\";\nimport { TrackedObject } from \"./TrackedObject\";\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 public readonly trackedChanged: 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 /** @internal */\n readonly state = State.Unchanged as State;\n\n /** @internal */\n _setState(_value: State): void {\n // Collections do not have a State — this satisfies the ITracked interface only.\n }\n\n /** @internal */\n _validate(): void {\n this.error = this._validator ? this._validator(this.collection) : undefined;\n this.isValid = this.error === undefined;\n }\n\n /** @internal */\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 if (!this.tracker._isReplaying) {\n this.trackedChanged.emit(new TrackedCollectionChanged(items, removed, this._collection));\n }\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 TrackedObject) {\n item._markRemoved();\n }\n }\n }\n\n private trackAddedObjectInsertions(added: T[]): void {\n for (const item of added) {\n if (item instanceof TrackedObject) {\n item._markAdded();\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":["State"]}
@@ -217,20 +217,17 @@ declare global {
217
217
  }
218
218
 
219
219
  interface IdAssignment {
220
- placeholder: number;
220
+ trackingId: number;
221
221
  value: number;
222
222
  }
223
223
  declare function AutoId<This extends object, Value>(_target: undefined, context: ClassFieldDecoratorContext<This, Value>): void;
224
224
 
225
225
  interface StateTarget {
226
- idPlaceholder: number | null;
226
+ trackingId: number;
227
227
  state: State;
228
228
  _setState(value: State): void;
229
229
  _getDirtyCounter(): number;
230
230
  _setDirtyCounter(value: number): void;
231
- readonly tracker: {
232
- _nextPlaceholder(): number;
233
- };
234
231
  }
235
232
 
236
233
  interface TrackedPropertyChanged {
@@ -244,7 +241,7 @@ declare abstract class TrackedObject implements ITracked, StateTarget {
244
241
  private _validationMessages;
245
242
  private _isValid;
246
243
  private _state;
247
- idPlaceholder: number | null;
244
+ readonly trackingId: number;
248
245
  readonly changed: TypedEvent<TrackedPropertyChanged>;
249
246
  readonly trackedChanged: TypedEvent<TrackedPropertyChanged>;
250
247
  /** @internal */
@@ -289,7 +286,7 @@ declare class Tracker {
289
286
  private _currentOperationPropertyName;
290
287
  private _isValid;
291
288
  private _canCommit;
292
- private _placeholderCounter;
289
+ private _trackingIdCounter;
293
290
  private _invalidCount;
294
291
  private _constructionDepth;
295
292
  private _composingBaseIndex;
@@ -345,7 +342,7 @@ declare class Tracker {
345
342
  private lastOperationTargetsSameProperty;
346
343
  private lastActionIsRecent;
347
344
  /** @internal */
348
- _nextPlaceholder(): number;
345
+ _nextTrackingId(): number;
349
346
  onCommit(keys?: IdAssignment[]): void;
350
347
  /** @internal */
351
348
  _isInUndoStack(op: Operation): boolean;
@@ -217,20 +217,17 @@ declare global {
217
217
  }
218
218
 
219
219
  interface IdAssignment {
220
- placeholder: number;
220
+ trackingId: number;
221
221
  value: number;
222
222
  }
223
223
  declare function AutoId<This extends object, Value>(_target: undefined, context: ClassFieldDecoratorContext<This, Value>): void;
224
224
 
225
225
  interface StateTarget {
226
- idPlaceholder: number | null;
226
+ trackingId: number;
227
227
  state: State;
228
228
  _setState(value: State): void;
229
229
  _getDirtyCounter(): number;
230
230
  _setDirtyCounter(value: number): void;
231
- readonly tracker: {
232
- _nextPlaceholder(): number;
233
- };
234
231
  }
235
232
 
236
233
  interface TrackedPropertyChanged {
@@ -244,7 +241,7 @@ declare abstract class TrackedObject implements ITracked, StateTarget {
244
241
  private _validationMessages;
245
242
  private _isValid;
246
243
  private _state;
247
- idPlaceholder: number | null;
244
+ readonly trackingId: number;
248
245
  readonly changed: TypedEvent<TrackedPropertyChanged>;
249
246
  readonly trackedChanged: TypedEvent<TrackedPropertyChanged>;
250
247
  /** @internal */
@@ -289,7 +286,7 @@ declare class Tracker {
289
286
  private _currentOperationPropertyName;
290
287
  private _isValid;
291
288
  private _canCommit;
292
- private _placeholderCounter;
289
+ private _trackingIdCounter;
293
290
  private _invalidCount;
294
291
  private _constructionDepth;
295
292
  private _composingBaseIndex;
@@ -345,7 +342,7 @@ declare class Tracker {
345
342
  private lastOperationTargetsSameProperty;
346
343
  private lastActionIsRecent;
347
344
  /** @internal */
348
- _nextPlaceholder(): number;
345
+ _nextTrackingId(): number;
349
346
  onCommit(keys?: IdAssignment[]): void;
350
347
  /** @internal */
351
348
  _isInUndoStack(op: Operation): boolean;
package/dist/dev/index.js CHANGED
@@ -220,7 +220,7 @@ function validateSingleProperty(tracked, property) {
220
220
  var Tracker = class {
221
221
  constructor() {
222
222
  this._suppressTrackingCounter = 0;
223
- this._placeholderCounter = -1;
223
+ this._trackingIdCounter = 1;
224
224
  this._invalidCount = 0;
225
225
  this._constructionDepth = 0;
226
226
  this._version = 0;
@@ -432,8 +432,8 @@ var Tracker = class {
432
432
  return (/* @__PURE__ */ new Date()).getTime() - CollectionUtilities.getLast(lastOperation.actions).time.getTime() < coalesceWithin;
433
433
  }
434
434
  /** @internal */
435
- _nextPlaceholder() {
436
- return this._placeholderCounter--;
435
+ _nextTrackingId() {
436
+ return this._trackingIdCounter++;
437
437
  }
438
438
  onCommit(keys) {
439
439
  const lastOp = CollectionUtilities.getLast(this._undoOperations);
@@ -570,10 +570,8 @@ function applyStateTransition(obj, event, direction, context) {
570
570
  function applyAdded(obj, direction) {
571
571
  if (direction === "undo") {
572
572
  obj._setState("Unchanged" /* Unchanged */);
573
- obj.idPlaceholder = null;
574
573
  } else {
575
574
  obj._setState("Insert" /* Insert */);
576
- obj.idPlaceholder = obj.tracker._nextPlaceholder();
577
575
  }
578
576
  }
579
577
  function applyRemoved(obj, direction, context) {
@@ -581,17 +579,13 @@ function applyRemoved(obj, direction, context) {
581
579
  const prev = context?.prevState ?? "Unchanged" /* Unchanged */;
582
580
  obj._setState(prev);
583
581
  if (prev === "Insert" /* Insert */) {
584
- obj.idPlaceholder = obj.tracker._nextPlaceholder();
585
582
  if (context?.prevDirtyCounter !== void 0) {
586
583
  obj._setDirtyCounter(context.prevDirtyCounter);
587
584
  }
588
- } else {
589
- obj.idPlaceholder = null;
590
585
  }
591
586
  } else {
592
587
  if (obj.state === "Insert" /* Insert */) {
593
588
  obj._setState("Unchanged" /* Unchanged */);
594
- obj.idPlaceholder = null;
595
589
  obj._setDirtyCounter(0);
596
590
  } else {
597
591
  obj._setState("Deleted" /* Deleted */);
@@ -603,18 +597,15 @@ function applyCommitted(obj, direction, context) {
603
597
  const prev = context?.prevState ?? "Unchanged" /* Unchanged */;
604
598
  if (prev === "Insert" /* Insert */) {
605
599
  obj._setState("Deleted" /* Deleted */);
606
- obj.idPlaceholder = null;
607
600
  } else if (prev === "Deleted" /* Deleted */) {
608
601
  obj._setState("Insert" /* Insert */);
609
- obj.idPlaceholder = obj.tracker._nextPlaceholder();
610
602
  } else if (prev === "Changed" /* Changed */) {
611
603
  obj._setState("Changed" /* Changed */);
612
604
  }
613
605
  } else {
614
- if (context?.prevState === "Insert" /* Insert */ && context.autoIdProp && context.realId !== void 0) {
606
+ if ((context?.prevState === "Insert" /* Insert */ || context?.prevState === "Changed" /* Changed */) && context.autoIdProp && context.realId !== void 0) {
615
607
  obj[context.autoIdProp] = context.realId;
616
608
  }
617
- obj.idPlaceholder = null;
618
609
  obj._setState("Unchanged" /* Unchanged */);
619
610
  obj._setDirtyCounter(0);
620
611
  }
@@ -622,8 +613,8 @@ function applyCommitted(obj, direction, context) {
622
613
  function buildCommittedContext(obj, autoIdProp, keys) {
623
614
  const prevState = obj.state;
624
615
  let realId;
625
- if (prevState === "Insert" /* Insert */ && obj.idPlaceholder !== null && keys) {
626
- realId = keys.find((k) => k.placeholder === obj.idPlaceholder)?.value;
616
+ if ((prevState === "Insert" /* Insert */ || prevState === "Changed" /* Changed */) && keys) {
617
+ realId = keys.find((k) => k.trackingId === obj.trackingId)?.value;
627
618
  }
628
619
  return { prevState, autoIdProp, realId };
629
620
  }
@@ -635,12 +626,12 @@ var TrackedObject = class {
635
626
  this._dirtyCounter = 0;
636
627
  this._isValid = true;
637
628
  this._state = "Unchanged" /* Unchanged */;
638
- this.idPlaceholder = null;
639
629
  this.changed = new TypedEvent();
640
630
  this.trackedChanged = new TypedEvent();
641
631
  if (!tracker._isConstructing) {
642
632
  throw new Error(`${this.constructor.name} must be created inside tracker.construct()`);
643
633
  }
634
+ this.trackingId = tracker._nextTrackingId();
644
635
  this.validationMessages = /* @__PURE__ */ new Map();
645
636
  tracker._trackObject(this);
646
637
  }