@katn30/trakr 3.0.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/TypedEvent.ts","../../src/Change.ts","../../src/Operation.ts","../../src/CollectionUtilities.ts","../../src/State.ts","../../src/DependencyTracker.ts","../../src/Registry.ts","../../src/OperationProperties.ts","../../src/ExternallyAssigned.ts","../../src/TrackedObjectStateMachine.ts","../../src/TrackedObject.ts","../../src/TrackerSession.ts","../../src/Tracker.ts","../../src/Tracked.ts","../../src/TrackedCollection.ts","../../src/EventRegistry.ts","../../src/EventTracker.ts","../../src/EventTracked.ts","../../src/EventTrackedCollection.ts"],"sourcesContent":["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\nfunction hasOwnValidators(proto: object): boolean {\n return Object.prototype.hasOwnProperty.call(proto, VALIDATORS);\n}\n\nfunction ownValidators(proto: object): ValidatorMap | undefined {\n return hasOwnValidators(proto) ? ((proto as any)[VALIDATORS] as ValidatorMap) : undefined;\n}\n\nfunction mergeInheritedValidators(proto: object): ValidatorMap {\n const merged: ValidatorMap = new Map();\n let current: object | null = proto;\n while (current) {\n const own = ownValidators(current);\n if (own) {\n own.forEach((validator, property) => {\n if (!merged.has(property)) merged.set(property, validator);\n });\n }\n current = Object.getPrototypeOf(current);\n }\n return merged;\n}\n\nfunction findInheritedValidator(\n proto: object,\n property: string,\n): ((model: any) => string | undefined) | undefined {\n let current: object | null = proto;\n while (current) {\n const own = ownValidators(current);\n const validator = own?.get(property);\n if (validator) return validator;\n current = Object.getPrototypeOf(current);\n }\n return undefined;\n}\n\nexport function registerPropertyValidator(\n proto: object,\n property: string,\n validator: (model: any) => string | undefined,\n): void {\n if (!hasOwnValidators(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 const validators = mergeInheritedValidators(proto);\n if (validators.size === 0) return;\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 const validatorFn = findInheritedValidator(proto, 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 { 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 { State } from \"./State\";\nimport { ITrackerContext } from \"./ITrackerContext\";\nimport { TypedEvent } from \"./TypedEvent\";\n\nexport type PropertyScope = [TrackedObject, string[]];\n\ninterface ITrackerDelegate {\n readonly canUndo: boolean;\n readonly canRedo: boolean;\n undo(): void;\n redo(): void;\n readonly isDirtyChanged: TypedEvent<boolean>;\n readonly canCommitChanged: TypedEvent<boolean>;\n readonly versionChanged: TypedEvent<number>;\n}\n\nexport class TrackerSession implements ITrackerContext {\n private readonly _scope: Map<TrackedObject, Set<string>> | undefined;\n private _isDirty: boolean = false;\n\n constructor(\n scope: PropertyScope[] | undefined,\n private readonly _tracker: ITrackerDelegate,\n private readonly _end: () => void,\n private readonly _rollback: () => void,\n ) {\n if (scope && scope.length > 0) {\n this._scope = new Map(scope.map(([obj, props]) => [obj, new Set(props)]));\n }\n }\n\n /** @internal */\n _onWrite(obj: TrackedObject, property: string): void {\n if (this._scope === undefined) return;\n const declaredProps = this._scope.get(obj);\n if (declaredProps === undefined || !declaredProps.has(property)) return;\n this._isDirty = true;\n }\n\n get isDirty(): boolean {\n if (this._scope === undefined) return false;\n return this._isDirty;\n }\n\n get isValid(): boolean {\n if (this._scope === undefined) return true;\n for (const [obj, props] of this._scope) {\n for (const prop of props) {\n if (obj.validationMessages.has(prop)) return false;\n }\n }\n return true;\n }\n\n get canCommit(): boolean {\n return this.isDirty && this.isValid;\n }\n\n get canUndo(): boolean {\n return this._tracker.canUndo;\n }\n\n get canRedo(): boolean {\n return this._tracker.canRedo;\n }\n\n get trackedObjects(): TrackedObject[] {\n if (this._scope === undefined) return [];\n return [...this._scope.keys()];\n }\n\n get deletedObjects(): TrackedObject[] {\n return this.trackedObjects.filter(obj => obj.state === State.Deleted);\n }\n\n undo(): void {\n this._tracker.undo();\n }\n\n redo(): void {\n this._tracker.redo();\n }\n\n get isDirtyChanged(): TypedEvent<boolean> {\n return this._tracker.isDirtyChanged;\n }\n\n get canCommitChanged(): TypedEvent<boolean> {\n return this._tracker.canCommitChanged;\n }\n\n get versionChanged(): TypedEvent<number> {\n return this._tracker.versionChanged;\n }\n\n end(): void {\n this._end();\n }\n\n rollback(): void {\n this._rollback();\n }\n}\n","import { TypedEvent } from \"./TypedEvent\";\r\nimport { Operation } from \"./Operation\";\r\nimport { TrackedCollection } from \"./TrackedCollection\";\r\nimport { OperationProperties } from \"./OperationProperties\";\r\nimport { PropertyType } from \"./PropertyType\";\r\nimport { CollectionUtilities } from \"./CollectionUtilities\";\r\nimport { IdAssignment } from \"./ExternallyAssigned\";\r\nimport { State } from \"./State\";\r\nimport { validate, validateSingleProperty } from \"./Registry\";\r\nimport { DependencyTracker, COLLECTION_VERSION_KEY } from \"./DependencyTracker\";\r\nimport { ITracked } from \"./ITracked\";\r\nimport { TrackedObject } from \"./TrackedObject\";\r\nimport { TrackerSession, PropertyScope } from \"./TrackerSession\";\r\nimport { ITrackerContext } from \"./ITrackerContext\";\r\n\r\nexport class Tracker implements ITrackerContext {\r\n private _currentOperation: Operation | undefined;\r\n private readonly _redoOperations: Operation[];\r\n private readonly _undoOperations: Operation[];\r\n private _commitStateOperation: Operation | undefined;\r\n private _isDirty: boolean;\r\n private _canUndo: boolean;\r\n private _canRedo: boolean;\r\n private _suppressTrackingCounter = 0;\r\n private _currentOperationOwner: ITracked | undefined;\r\n private _currentOperationPropertyName: string | undefined;\r\n private _isValid: boolean;\r\n private _canCommit: boolean;\r\n private _trackingIdCounter = 1;\r\n private _invalidCount = 0;\r\n private _constructionDepth = 0;\r\n private _composingBaseIndex: number | undefined;\r\n private _composingRedoLength: number | undefined;\r\n private _currentSession: TrackerSession | undefined;\r\n private _version: number = 0;\r\n public _isReplaying: boolean = false;\r\n\r\n public readonly trackedObjects: TrackedObject[] = [];\r\n\r\n public get deletedObjects(): TrackedObject[] {\r\n return this.trackedObjects.filter(obj => obj.state === State.Deleted);\r\n }\r\n\r\n public readonly trackedCollections: TrackedCollection<any>[] = [];\r\n\r\n public get isDirty(): boolean {\r\n return this._isDirty;\r\n }\r\n public set isDirty(value: boolean) {\r\n if (this._isDirty !== value) {\r\n this._isDirty = value;\r\n this.isDirtyChanged.emit(value);\r\n this.updateCanCommit();\r\n }\r\n }\r\n\r\n public readonly isDirtyChanged: TypedEvent<boolean> = new TypedEvent<boolean>();\r\n\r\n public get version(): number {\r\n return this._version;\r\n }\r\n\r\n public readonly versionChanged: TypedEvent<number> = new TypedEvent<number>();\r\n\r\n public get isValid(): boolean {\r\n return this._isValid;\r\n }\r\n private set isValid(value: boolean) {\r\n if (this._isValid !== value) {\r\n this._isValid = value;\r\n this.isValidChanged.emit(value);\r\n this.updateCanCommit();\r\n }\r\n }\r\n\r\n public readonly isValidChanged: TypedEvent<boolean> = new TypedEvent<boolean>();\r\n\r\n public get canCommit(): boolean {\r\n return this._canCommit;\r\n }\r\n private set canCommit(value: boolean) {\r\n if (this._canCommit !== value) {\r\n this._canCommit = value;\r\n this.canCommitChanged.emit(value);\r\n }\r\n }\r\n\r\n public readonly canCommitChanged: TypedEvent<boolean> = new TypedEvent<boolean>();\r\n\r\n private updateCanCommit(): void {\r\n this.canCommit = this._isDirty && this._isValid;\r\n }\r\n\r\n public get canUndo(): boolean {\r\n return this._canUndo;\r\n }\r\n private set canUndo(value: boolean) {\r\n this._canUndo = value;\r\n }\r\n\r\n public get canRedo(): boolean {\r\n return this._canRedo;\r\n }\r\n private set canRedo(value: boolean) {\r\n this._canRedo = value;\r\n }\r\n\r\n /** @internal */\r\n public get _isTrackingSuppressed(): boolean {\r\n return this._suppressTrackingCounter > 0;\r\n }\r\n\r\n /** @internal */\r\n public get _isConstructing(): boolean {\r\n return this._constructionDepth > 0;\r\n }\r\n\r\n public constructor() {\r\n this._currentOperation = undefined;\r\n this._redoOperations = [];\r\n this._undoOperations = [];\r\n this._commitStateOperation = undefined;\r\n this._isDirty = false;\r\n this._canUndo = false;\r\n this._canRedo = false;\r\n this._suppressTrackingCounter = 0;\r\n this._currentOperationOwner = undefined;\r\n this._currentOperationPropertyName = undefined;\r\n this._isValid = true;\r\n this._canCommit = false;\r\n }\r\n\r\n /** @internal */\r\n public _trackObject(trackedObject: TrackedObject) {\r\n this.trackedObjects.push(trackedObject);\r\n }\r\n\r\n /** @internal */\r\n public _untrackObject(trackedObject: TrackedObject) {\r\n this.trackedObjects.splice(this.trackedObjects.indexOf(trackedObject), 1);\r\n if (!trackedObject.isValid) this._invalidCount--;\r\n this.isValid = this._invalidCount === 0;\r\n }\r\n\r\n /** @internal */\r\n public _trackCollection(trackedCollection: TrackedCollection<any>): void {\r\n this.trackedCollections.push(trackedCollection);\r\n }\r\n\r\n /** @internal */\r\n public _untrackCollection(trackedCollection: TrackedCollection<any>) {\r\n this.trackedCollections.splice(\r\n this.trackedCollections.indexOf(trackedCollection),\r\n 1,\r\n );\r\n if (!trackedCollection.isValid) this._invalidCount--;\r\n this.isValid = this._invalidCount === 0;\r\n }\r\n\r\n /** @internal */\r\n public _onValidityChanged(wasValid: boolean, isNowValid: boolean): void {\r\n if (wasValid && !isNowValid) this._invalidCount++;\r\n else if (!wasValid && isNowValid) this._invalidCount--;\r\n if (!this._isTrackingSuppressed) {\r\n this.isValid = this._invalidCount === 0;\r\n }\r\n }\r\n\r\n public construct<T>(action: () => T): T {\r\n const objectsBefore = this.trackedObjects.length;\r\n this._constructionDepth++;\r\n this._suppressTrackingCounter++;\r\n const result = action();\r\n for (let i = objectsBefore; i < this.trackedObjects.length; i++) {\r\n validate(this.trackedObjects[i]);\r\n }\r\n this._suppressTrackingCounter--;\r\n this._constructionDepth--;\r\n this.isValid = this._invalidCount === 0;\r\n return result;\r\n }\r\n\r\n public withTrackingSuppressed(action: () => void): void {\r\n this._suppressTrackingCounter++;\r\n action();\r\n this._suppressTrackingCounter--;\r\n }\r\n\r\n public beginSuppressTracking(): void {\r\n this._suppressTrackingCounter++;\r\n }\r\n\r\n public endSuppressTracking(): void {\r\n this._suppressTrackingCounter--;\r\n }\r\n\r\n /** @internal */\r\n public _doAndTrack(\r\n redoAction: () => void,\r\n undoAction: () => void,\r\n properties: OperationProperties,\r\n ): void {\r\n if (this._isReplaying) return;\r\n\r\n if (this._isTrackingSuppressed) {\r\n redoAction();\r\n if (!this._isConstructing) {\r\n this.revalidateTargeted(properties.trackedObject, properties.property);\r\n }\r\n return;\r\n }\r\n\r\n if (this.isStartingNewOperation()) {\r\n this._currentOperationOwner = properties.trackedObject;\r\n this._currentOperationPropertyName = properties.property;\r\n\r\n if (this.shouldCoalesceChanges(properties)) {\r\n this._currentOperation = CollectionUtilities.getLast(this._undoOperations)!;\r\n this._version++;\r\n this.versionChanged.emit(this._version);\r\n } else {\r\n this._currentOperation = new Operation();\r\n this._undoOperations.push(this._currentOperation);\r\n this._redoOperations.length = 0;\r\n this.reset();\r\n this._version++;\r\n this.versionChanged.emit(this._version);\r\n }\r\n }\r\n\r\n this._currentOperation?.add(\r\n () => redoAction(),\r\n () => undoAction(),\r\n properties,\r\n );\r\n redoAction();\r\n\r\n if (this._currentSession !== undefined &&\r\n properties.property !== undefined &&\r\n properties.trackedObject instanceof TrackedObject) {\r\n this._currentSession._onWrite(properties.trackedObject, properties.property);\r\n }\r\n\r\n if (this.isEndingCurrentOperation(properties)) {\r\n this._currentOperation = undefined;\r\n this._currentOperationOwner = undefined;\r\n this._currentOperationPropertyName = undefined;\r\n this.revalidateTargeted(properties.trackedObject, properties.property);\r\n }\r\n }\r\n\r\n private revalidateTargeted(changedObj: ITracked, changedProp: string | undefined): void {\r\n const depKey = changedProp ?? COLLECTION_VERSION_KEY;\r\n const dependents = [...DependencyTracker.getDependents(changedObj, depKey)];\r\n for (const { obj, prop } of dependents) {\r\n const error = validateSingleProperty(obj, prop);\r\n obj._validate(prop, error);\r\n }\r\n if (changedProp === undefined) {\r\n (changedObj as unknown as TrackedCollection<any>)._validate();\r\n }\r\n this.isValid = this._invalidCount === 0;\r\n }\r\n\r\n private isEndingCurrentOperation(properties: OperationProperties) {\r\n return this._currentOperationOwner === properties.trackedObject &&\r\n this._currentOperationPropertyName === properties.property;\r\n }\r\n\r\n private isStartingNewOperation() {\r\n return this._currentOperationOwner === undefined &&\r\n this._currentOperationPropertyName === undefined;\r\n }\r\n\r\n private shouldCoalesceChanges(properties: OperationProperties): boolean {\r\n const lastOperation = CollectionUtilities.getLast(this._undoOperations);\r\n return (\r\n this.isCoalescibleType(properties) &&\r\n this.hasLastOperation(lastOperation) &&\r\n this.lastOperationTargetsSameProperty(lastOperation!, properties) &&\r\n this.lastActionIsRecent(lastOperation!, properties.coalesceWithin!)\r\n );\r\n }\r\n\r\n private isCoalescibleType(properties: OperationProperties): boolean {\r\n return (\r\n properties.coalesceWithin !== undefined &&\r\n (properties.type === PropertyType.String ||\r\n properties.type === PropertyType.Number)\r\n );\r\n }\r\n\r\n private hasLastOperation(lastOperation: Operation | undefined): boolean {\r\n return !!lastOperation;\r\n }\r\n\r\n private lastOperationTargetsSameProperty(lastOperation: Operation, properties: OperationProperties): boolean {\r\n return lastOperation.actions.every(\r\n (x) =>\r\n x.properties.trackedObject === properties.trackedObject &&\r\n x.properties.property === properties.property,\r\n );\r\n }\r\n\r\n private lastActionIsRecent(lastOperation: Operation, coalesceWithin: number): boolean {\r\n return (\r\n new Date().getTime() -\r\n CollectionUtilities.getLast(lastOperation.actions)!.time.getTime() <\r\n coalesceWithin\r\n );\r\n }\r\n\r\n /** @internal */\r\n public _nextTrackingId(): number {\r\n return this._trackingIdCounter++;\r\n }\r\n\r\n public onCommit(keys?: IdAssignment[]): void {\r\n const lastOp = CollectionUtilities.getLast(this._undoOperations);\r\n this.trackedObjects.forEach((obj) => obj._onCommitted(lastOp, keys));\r\n this._commitStateOperation = lastOp;\r\n this.reset();\r\n }\r\n\r\n /** @internal */\r\n public _isInUndoStack(op: Operation): boolean {\r\n return this._undoOperations.includes(op);\r\n }\r\n\r\n private reset(): void {\r\n this.canUndo = this._undoOperations.length > 0;\r\n this.canRedo = this._redoOperations.length > 0;\r\n this.isDirty =\r\n CollectionUtilities.getLast(this._undoOperations) !==\r\n this._commitStateOperation;\r\n }\r\n\r\n public startSession(scope?: PropertyScope[]): TrackerSession {\r\n if (this._currentSession !== undefined) return this._currentSession;\r\n this._composingBaseIndex = this._undoOperations.length;\r\n this._composingRedoLength = this._redoOperations.length;\r\n this._currentSession = new TrackerSession(\r\n scope,\r\n this,\r\n () => this.endComposing(),\r\n () => this.rollbackComposing(),\r\n );\r\n return this._currentSession;\r\n }\r\n\r\n private endComposing(): void {\r\n if (this._composingBaseIndex === undefined) return;\r\n this._currentSession = undefined;\r\n\r\n const composed = this._undoOperations.splice(this._composingBaseIndex);\r\n this._redoOperations.splice(this._composingRedoLength!);\r\n this._composingBaseIndex = undefined;\r\n this._composingRedoLength = undefined;\r\n\r\n if (composed.length === 0) {\r\n this.reset();\r\n return;\r\n }\r\n\r\n if (composed.length === 1) {\r\n this._undoOperations.push(composed[0]);\r\n this.reset();\r\n return;\r\n }\r\n\r\n const merged = new Operation();\r\n for (const op of composed) {\r\n for (const action of op.actions) {\r\n merged.add(action.redoAction, action.undoAction, action.properties);\r\n }\r\n }\r\n this._undoOperations.push(merged);\r\n this.reset();\r\n }\r\n\r\n private rollbackComposing(): void {\r\n if (this._composingBaseIndex === undefined) return;\r\n this._currentSession = undefined;\r\n\r\n const toRevert = this._undoOperations.splice(this._composingBaseIndex);\r\n this._redoOperations.splice(this._composingRedoLength!);\r\n this._composingBaseIndex = undefined;\r\n this._composingRedoLength = undefined;\r\n\r\n this.withTrackingSuppressed(() => {\r\n for (let i = toRevert.length - 1; i >= 0; i--) {\r\n toRevert[i].undo();\r\n }\r\n });\r\n\r\n this.reset();\r\n this.revalidate();\r\n if (toRevert.length > 0) {\r\n this._version -= toRevert.length;\r\n this.versionChanged.emit(this._version);\r\n }\r\n }\r\n\r\n public undo(): void {\r\n if (!this.canUndo) {\r\n return;\r\n }\r\n\r\n const undoOperation = this._undoOperations.pop()!;\r\n this._isReplaying = true;\r\n this.withTrackingSuppressed(() => undoOperation.undo());\r\n this._isReplaying = false;\r\n this._redoOperations.push(undoOperation);\r\n\r\n this.reset();\r\n this.revalidate();\r\n this._version--;\r\n this.versionChanged.emit(this._version);\r\n }\r\n\r\n public redo(): void {\r\n if (!this.canRedo) {\r\n return;\r\n }\r\n\r\n const redoOperation = this._redoOperations.pop()!;\r\n this._isReplaying = true;\r\n this.withTrackingSuppressed(() => redoOperation.redo());\r\n this._isReplaying = false;\r\n this._undoOperations.push(redoOperation);\r\n\r\n this.reset();\r\n this.revalidate();\r\n this._version++;\r\n this.versionChanged.emit(this._version);\r\n }\r\n\r\n public revalidate(): void {\r\n this.trackedObjects.forEach((x) => validate(x));\r\n this.trackedCollections.forEach((x) => x._validate());\r\n this.isValid = this._invalidCount === 0;\r\n }\r\n}\r\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","import { TrackedObject } from \"./TrackedObject\";\n\nconst EVENT_METADATA = Symbol(\"eventMetadata\");\n\ntype EventMetadataMap = Map<string, string>;\n\ninterface EventFieldEntry {\n originalValue: unknown;\n currentValue: unknown;\n}\n\nconst instanceState = new WeakMap<TrackedObject, Map<string, EventFieldEntry>>();\nconst subscribedInstances = new WeakSet<TrackedObject>();\nconst itemOriginCollection = new WeakMap<TrackedObject, object>();\n\nfunction hasOwnEventMetadata(proto: object): boolean {\n return Object.prototype.hasOwnProperty.call(proto, EVENT_METADATA);\n}\n\nfunction ownEventMetadata(proto: object): EventMetadataMap | undefined {\n return hasOwnEventMetadata(proto)\n ? ((proto as unknown as Record<symbol, EventMetadataMap>)[EVENT_METADATA])\n : undefined;\n}\n\nexport function registerEventProperty(\n proto: object,\n property: string,\n eventType: string,\n): void {\n if (!hasOwnEventMetadata(proto)) {\n Object.defineProperty(proto, EVENT_METADATA, {\n value: new Map<string, string>(),\n configurable: true,\n });\n }\n const map = (proto as unknown as Record<symbol, EventMetadataMap>)[EVENT_METADATA];\n if (!map.has(property)) {\n map.set(property, eventType);\n }\n}\n\nexport function getEventMetadata(proto: object): EventMetadataMap {\n const chain: object[] = [];\n let current: object | null = proto;\n while (current) {\n chain.push(current);\n current = Object.getPrototypeOf(current);\n }\n const merged: EventMetadataMap = new Map();\n for (let i = chain.length - 1; i >= 0; i--) {\n const own = ownEventMetadata(chain[i]);\n if (!own) continue;\n own.forEach((eventType, property) => {\n if (!merged.has(property)) merged.set(property, eventType);\n });\n }\n return merged;\n}\n\nexport function hasAnyEventMetadata(proto: object): boolean {\n let current: object | null = proto;\n while (current) {\n if (hasOwnEventMetadata(current)) {\n const own = ownEventMetadata(current);\n if (own && own.size > 0) return true;\n }\n current = Object.getPrototypeOf(current);\n }\n return false;\n}\n\nexport function ensureEventStateSubscription(target: TrackedObject): void {\n if (subscribedInstances.has(target)) return;\n subscribedInstances.add(target);\n target.changed.subscribe((evt) => {\n const meta = getEventMetadata(Object.getPrototypeOf(target));\n if (!meta.has(evt.property)) return;\n const state = getOrCreateEventState(target);\n let entry = state.get(evt.property);\n if (!entry) {\n entry = { originalValue: evt.oldValue, currentValue: evt.newValue };\n state.set(evt.property, entry);\n } else {\n entry.currentValue = evt.newValue;\n }\n if (entry.currentValue === entry.originalValue) {\n state.delete(evt.property);\n }\n });\n}\n\nfunction getOrCreateEventState(target: TrackedObject): Map<string, EventFieldEntry> {\n let state = instanceState.get(target);\n if (!state) {\n state = new Map<string, EventFieldEntry>();\n instanceState.set(target, state);\n }\n return state;\n}\n\nexport function getEventState(target: TrackedObject): Map<string, EventFieldEntry> {\n return instanceState.get(target) ?? new Map<string, EventFieldEntry>();\n}\n\nexport function clearEventState(target: TrackedObject): void {\n instanceState.delete(target);\n}\n\nexport function recordItemOrigin(item: TrackedObject, collection: object): void {\n itemOriginCollection.set(item, collection);\n}\n\nexport function getItemOrigin(item: TrackedObject): object | undefined {\n return itemOriginCollection.get(item);\n}\n","import { Tracker } from \"./Tracker\";\nimport { TrackedObject } from \"./TrackedObject\";\nimport { State } from \"./State\";\nimport { IdAssignment, getAutoIdProperty } from \"./ExternallyAssigned\";\nimport { GeneratedEvent, EventLifecycleOptions } from \"./GeneratedEvent\";\nimport { EventTrackedCollection } from \"./EventTrackedCollection\";\nimport {\n getEventMetadata,\n getEventState,\n clearEventState,\n getItemOrigin,\n} from \"./EventRegistry\";\n\nexport class EventTracker extends Tracker {\n public override onCommit(keys?: IdAssignment[]): void {\n super.onCommit(keys);\n for (const obj of this.trackedObjects) {\n clearEventState(obj);\n }\n }\n\n public generateEvents<TEventType extends string = string>(): GeneratedEvent<TEventType>[] {\n const events: GeneratedEvent<TEventType>[] = [];\n\n for (const obj of this.trackedObjects) {\n const meta = getEventMetadata(Object.getPrototypeOf(obj));\n const origin = getItemOrigin(obj) as EventTrackedCollection<unknown> | undefined;\n const lifecycle: EventLifecycleOptions | undefined = origin?._lifecycleOptions;\n\n switch (obj.state) {\n case State.Insert:\n if (lifecycle?.itemAdded) {\n events.push(buildItemAddedEvent<TEventType>(obj, meta, lifecycle.itemAdded));\n }\n break;\n\n case State.Deleted:\n if (lifecycle?.itemRemoved) {\n events.push(buildItemRemovedEvent<TEventType>(obj, lifecycle.itemRemoved));\n }\n break;\n\n case State.Changed:\n pushFieldClusterEvents<TEventType>(obj, meta, events);\n break;\n\n case State.Unchanged:\n default:\n break;\n }\n }\n\n return events;\n }\n}\n\nfunction buildItemAddedEvent<TEventType extends string>(\n obj: TrackedObject,\n meta: Map<string, string>,\n eventType: string,\n): GeneratedEvent<TEventType> {\n const payload: Record<string, unknown> = {};\n for (const [propertyName] of meta) {\n const value = (obj as unknown as Record<string, unknown>)[propertyName];\n payload[propertyName] = normalizeValue(value);\n }\n return {\n eventType: eventType as TEventType,\n payload,\n trackingId: obj.trackingId,\n };\n}\n\nfunction buildItemRemovedEvent<TEventType extends string>(\n obj: TrackedObject,\n eventType: string,\n): GeneratedEvent<TEventType> {\n const autoIdProp = getAutoIdProperty(Object.getPrototypeOf(obj));\n const targetId = autoIdProp\n ? (obj as unknown as Record<string, unknown>)[autoIdProp]\n : undefined;\n const event: GeneratedEvent<TEventType> = {\n eventType: eventType as TEventType,\n payload: {},\n };\n if (typeof targetId === \"number\") {\n event.targetId = targetId;\n }\n return event;\n}\n\nfunction pushFieldClusterEvents<TEventType extends string>(\n obj: TrackedObject,\n meta: Map<string, string>,\n events: GeneratedEvent<TEventType>[],\n): void {\n const state = getEventState(obj);\n if (state.size === 0) return;\n\n const grouped = new Map<string, string[]>();\n for (const [propertyName, eventType] of meta) {\n if (!state.has(propertyName)) continue;\n let bucket = grouped.get(eventType);\n if (!bucket) {\n bucket = [];\n grouped.set(eventType, bucket);\n }\n bucket.push(propertyName);\n }\n\n const autoIdProp = getAutoIdProperty(Object.getPrototypeOf(obj));\n const targetIdRaw = autoIdProp\n ? (obj as unknown as Record<string, unknown>)[autoIdProp]\n : undefined;\n\n for (const [eventType, propertyNames] of grouped) {\n const payload: Record<string, unknown> = {};\n for (const propertyName of propertyNames) {\n payload[propertyName] = normalizeValue(state.get(propertyName)!.currentValue);\n }\n const event: GeneratedEvent<TEventType> = {\n eventType: eventType as TEventType,\n payload,\n trackingId: obj.trackingId,\n };\n if (typeof targetIdRaw === \"number\") {\n event.targetId = targetIdRaw;\n }\n events.push(event);\n }\n}\n\nfunction normalizeValue(value: unknown): unknown {\n return value === undefined ? null : value;\n}\n","import { TrackedObject } from \"./TrackedObject\";\nimport { Tracked } from \"./Tracked\";\nimport {\n registerEventProperty,\n ensureEventStateSubscription,\n} from \"./EventRegistry\";\n\nexport function EventTracked(\n eventType: string,\n validator?: (self: any, newValue: any) => string | undefined,\n onChange?: (self: any, newValue: any, oldValue: any) => void,\n options?: { coalesceWithin?: number },\n) {\n const trackedDecorator = Tracked(validator, onChange, options);\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(target: any, context: any): any {\n const result = (trackedDecorator as any)(target, context);\n const propertyName = String(context.name);\n\n context.addInitializer(function (this: TrackedObject) {\n registerEventProperty(\n Object.getPrototypeOf(this),\n propertyName,\n eventType,\n );\n ensureEventStateSubscription(this);\n });\n\n return result;\n }\n\n return decorator;\n}\n","import { Tracker } from \"./Tracker\";\nimport { TrackedCollection } from \"./TrackedCollection\";\nimport { TrackedObject } from \"./TrackedObject\";\nimport { EventLifecycleOptions } from \"./GeneratedEvent\";\nimport { recordItemOrigin } from \"./EventRegistry\";\n\nexport class EventTrackedCollection<\n T,\n TEventType extends string = string,\n> extends TrackedCollection<T> {\n private readonly _eventOptions: EventLifecycleOptions<TEventType> | undefined;\n\n public constructor(\n tracker: Tracker,\n items?: T[],\n validator?: (value: T[]) => string | undefined,\n eventOptions?: EventLifecycleOptions<TEventType>,\n ) {\n super(tracker, items, validator);\n this._eventOptions = eventOptions;\n\n for (const item of this.collection) {\n if (item instanceof TrackedObject) {\n recordItemOrigin(item, this);\n }\n }\n\n this.changed.subscribe((evt) => {\n for (const item of evt.added) {\n if (item instanceof TrackedObject) {\n recordItemOrigin(item, this);\n }\n }\n });\n }\n\n /** @internal */\n public get _lifecycleOptions(): EventLifecycleOptions<TEventType> | undefined {\n return this._eventOptions;\n }\n}\n"],"mappings":"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","names":["State"]}
1
+ {"version":3,"sources":["../../src/TypedEvent.ts","../../src/Change.ts","../../src/Operation.ts","../../src/CollectionUtilities.ts","../../src/State.ts","../../src/DependencyTracker.ts","../../src/Registry.ts","../../src/OperationProperties.ts","../../src/ExternallyAssigned.ts","../../src/TrackedObjectStateMachine.ts","../../src/TrackedObject.ts","../../src/TrackerSession.ts","../../src/Tracker.ts","../../src/Tracked.ts","../../src/TrackedCollection.ts","../../src/EventRegistry.ts","../../src/EventTrackedCollection.ts","../../src/EventTracker.ts","../../src/EventTracked.ts"],"sourcesContent":["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\nfunction hasOwnValidators(proto: object): boolean {\n return Object.prototype.hasOwnProperty.call(proto, VALIDATORS);\n}\n\nfunction ownValidators(proto: object): ValidatorMap | undefined {\n return hasOwnValidators(proto) ? ((proto as any)[VALIDATORS] as ValidatorMap) : undefined;\n}\n\nfunction mergeInheritedValidators(proto: object): ValidatorMap {\n const merged: ValidatorMap = new Map();\n let current: object | null = proto;\n while (current) {\n const own = ownValidators(current);\n if (own) {\n own.forEach((validator, property) => {\n if (!merged.has(property)) merged.set(property, validator);\n });\n }\n current = Object.getPrototypeOf(current);\n }\n return merged;\n}\n\nfunction findInheritedValidator(\n proto: object,\n property: string,\n): ((model: any) => string | undefined) | undefined {\n let current: object | null = proto;\n while (current) {\n const own = ownValidators(current);\n const validator = own?.get(property);\n if (validator) return validator;\n current = Object.getPrototypeOf(current);\n }\n return undefined;\n}\n\nexport function registerPropertyValidator(\n proto: object,\n property: string,\n validator: (model: any) => string | undefined,\n): void {\n if (!hasOwnValidators(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 const validators = mergeInheritedValidators(proto);\n if (validators.size === 0) return;\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 const validatorFn = findInheritedValidator(proto, 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 { 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\");\nconst ID_PROPS = Symbol(\"idProps\");\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 const proto = Object.getPrototypeOf(this);\n if (!Object.prototype.hasOwnProperty.call(proto, AUTO_ID)) {\n Object.defineProperty(proto, AUTO_ID, {\n value: String(context.name),\n configurable: true,\n });\n }\n addIdentityProp(proto, String(context.name));\n });\n}\n\nexport function Id<This extends object, Value>(\n _target: undefined,\n context: ClassFieldDecoratorContext<This, Value>,\n): void {\n context.addInitializer(function (this: This) {\n const proto = Object.getPrototypeOf(this);\n addIdentityProp(proto, String(context.name));\n });\n}\n\nfunction addIdentityProp(proto: object, propertyName: string): void {\n if (!Object.prototype.hasOwnProperty.call(proto, ID_PROPS)) {\n Object.defineProperty(proto, ID_PROPS, {\n value: [] as string[],\n configurable: true,\n writable: true,\n });\n }\n const list = (proto as any)[ID_PROPS] as string[];\n if (!list.includes(propertyName)) list.push(propertyName);\n}\n\nexport function getAutoIdProperty(proto: object): string | undefined {\n return AUTO_ID in proto ? ((proto as any)[AUTO_ID] as string) : undefined;\n}\n\nexport function getIdentityProperties(proto: object): string[] {\n const chain: object[] = [];\n let current: object | null = proto;\n while (current) {\n chain.push(current);\n current = Object.getPrototypeOf(current);\n }\n const merged: string[] = [];\n for (let i = chain.length - 1; i >= 0; i--) {\n const proto = chain[i];\n if (!Object.prototype.hasOwnProperty.call(proto, ID_PROPS)) continue;\n const list = (proto as any)[ID_PROPS] as string[];\n for (const name of list) {\n if (!merged.includes(name)) merged.push(name);\n }\n }\n return merged;\n}\n\nexport function getIdentity(obj: object): unknown {\n const props = getIdentityProperties(Object.getPrototypeOf(obj));\n if (props.length === 0) return undefined;\n if (props.length === 1) {\n return (obj as Record<string, unknown>)[props[0]];\n }\n const result: Record<string, unknown> = {};\n for (const p of props) result[p] = (obj as Record<string, unknown>)[p];\n return result;\n}\n\nexport function getIdentityObject(obj: object): Record<string, unknown> {\n const props = getIdentityProperties(Object.getPrototypeOf(obj));\n const result: Record<string, unknown> = {};\n for (const p of props) result[p] = (obj as Record<string, unknown>)[p];\n return result;\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 { State } from \"./State\";\nimport { ITrackerContext } from \"./ITrackerContext\";\nimport { TypedEvent } from \"./TypedEvent\";\n\nexport type PropertyScope = [TrackedObject, string[]];\n\ninterface ITrackerDelegate {\n readonly canUndo: boolean;\n readonly canRedo: boolean;\n undo(): void;\n redo(): void;\n readonly isDirtyChanged: TypedEvent<boolean>;\n readonly canCommitChanged: TypedEvent<boolean>;\n readonly versionChanged: TypedEvent<number>;\n}\n\nexport class TrackerSession implements ITrackerContext {\n private readonly _scope: Map<TrackedObject, Set<string>> | undefined;\n private _isDirty: boolean = false;\n\n constructor(\n scope: PropertyScope[] | undefined,\n private readonly _tracker: ITrackerDelegate,\n private readonly _end: () => void,\n private readonly _rollback: () => void,\n ) {\n if (scope && scope.length > 0) {\n this._scope = new Map(scope.map(([obj, props]) => [obj, new Set(props)]));\n }\n }\n\n /** @internal */\n _onWrite(obj: TrackedObject, property: string): void {\n if (this._scope === undefined) return;\n const declaredProps = this._scope.get(obj);\n if (declaredProps === undefined || !declaredProps.has(property)) return;\n this._isDirty = true;\n }\n\n get isDirty(): boolean {\n if (this._scope === undefined) return false;\n return this._isDirty;\n }\n\n get isValid(): boolean {\n if (this._scope === undefined) return true;\n for (const [obj, props] of this._scope) {\n for (const prop of props) {\n if (obj.validationMessages.has(prop)) return false;\n }\n }\n return true;\n }\n\n get canCommit(): boolean {\n return this.isDirty && this.isValid;\n }\n\n get canUndo(): boolean {\n return this._tracker.canUndo;\n }\n\n get canRedo(): boolean {\n return this._tracker.canRedo;\n }\n\n get trackedObjects(): TrackedObject[] {\n if (this._scope === undefined) return [];\n return [...this._scope.keys()];\n }\n\n get deletedObjects(): TrackedObject[] {\n return this.trackedObjects.filter(obj => obj.state === State.Deleted);\n }\n\n undo(): void {\n this._tracker.undo();\n }\n\n redo(): void {\n this._tracker.redo();\n }\n\n get isDirtyChanged(): TypedEvent<boolean> {\n return this._tracker.isDirtyChanged;\n }\n\n get canCommitChanged(): TypedEvent<boolean> {\n return this._tracker.canCommitChanged;\n }\n\n get versionChanged(): TypedEvent<number> {\n return this._tracker.versionChanged;\n }\n\n end(): void {\n this._end();\n }\n\n rollback(): void {\n this._rollback();\n }\n}\n","import { TypedEvent } from \"./TypedEvent\";\r\nimport { Operation } from \"./Operation\";\r\nimport { TrackedCollection } from \"./TrackedCollection\";\r\nimport { OperationProperties } from \"./OperationProperties\";\r\nimport { PropertyType } from \"./PropertyType\";\r\nimport { CollectionUtilities } from \"./CollectionUtilities\";\r\nimport { IdAssignment } from \"./ExternallyAssigned\";\r\nimport { State } from \"./State\";\r\nimport { validate, validateSingleProperty } from \"./Registry\";\r\nimport { DependencyTracker, COLLECTION_VERSION_KEY } from \"./DependencyTracker\";\r\nimport { ITracked } from \"./ITracked\";\r\nimport { TrackedObject } from \"./TrackedObject\";\r\nimport { TrackerSession, PropertyScope } from \"./TrackerSession\";\r\nimport { ITrackerContext } from \"./ITrackerContext\";\r\n\r\nexport class Tracker implements ITrackerContext {\r\n private _currentOperation: Operation | undefined;\r\n private readonly _redoOperations: Operation[];\r\n private readonly _undoOperations: Operation[];\r\n private _commitStateOperation: Operation | undefined;\r\n private _isDirty: boolean;\r\n private _canUndo: boolean;\r\n private _canRedo: boolean;\r\n private _suppressTrackingCounter = 0;\r\n private _currentOperationOwner: ITracked | undefined;\r\n private _currentOperationPropertyName: string | undefined;\r\n private _isValid: boolean;\r\n private _canCommit: boolean;\r\n private _trackingIdCounter = 1;\r\n private _invalidCount = 0;\r\n private _constructionDepth = 0;\r\n private _composingBaseIndex: number | undefined;\r\n private _composingRedoLength: number | undefined;\r\n private _currentSession: TrackerSession | undefined;\r\n private _version: number = 0;\r\n public _isReplaying: boolean = false;\r\n\r\n public readonly trackedObjects: TrackedObject[] = [];\r\n\r\n public get deletedObjects(): TrackedObject[] {\r\n return this.trackedObjects.filter(obj => obj.state === State.Deleted);\r\n }\r\n\r\n public readonly trackedCollections: TrackedCollection<any>[] = [];\r\n\r\n public get isDirty(): boolean {\r\n return this._isDirty;\r\n }\r\n public set isDirty(value: boolean) {\r\n if (this._isDirty !== value) {\r\n this._isDirty = value;\r\n this.isDirtyChanged.emit(value);\r\n this.updateCanCommit();\r\n }\r\n }\r\n\r\n public readonly isDirtyChanged: TypedEvent<boolean> = new TypedEvent<boolean>();\r\n\r\n public get version(): number {\r\n return this._version;\r\n }\r\n\r\n public readonly versionChanged: TypedEvent<number> = new TypedEvent<number>();\r\n\r\n public get isValid(): boolean {\r\n return this._isValid;\r\n }\r\n private set isValid(value: boolean) {\r\n if (this._isValid !== value) {\r\n this._isValid = value;\r\n this.isValidChanged.emit(value);\r\n this.updateCanCommit();\r\n }\r\n }\r\n\r\n public readonly isValidChanged: TypedEvent<boolean> = new TypedEvent<boolean>();\r\n\r\n public get canCommit(): boolean {\r\n return this._canCommit;\r\n }\r\n private set canCommit(value: boolean) {\r\n if (this._canCommit !== value) {\r\n this._canCommit = value;\r\n this.canCommitChanged.emit(value);\r\n }\r\n }\r\n\r\n public readonly canCommitChanged: TypedEvent<boolean> = new TypedEvent<boolean>();\r\n\r\n private updateCanCommit(): void {\r\n this.canCommit = this._isDirty && this._isValid;\r\n }\r\n\r\n public get canUndo(): boolean {\r\n return this._canUndo;\r\n }\r\n private set canUndo(value: boolean) {\r\n this._canUndo = value;\r\n }\r\n\r\n public get canRedo(): boolean {\r\n return this._canRedo;\r\n }\r\n private set canRedo(value: boolean) {\r\n this._canRedo = value;\r\n }\r\n\r\n /** @internal */\r\n public get _isTrackingSuppressed(): boolean {\r\n return this._suppressTrackingCounter > 0;\r\n }\r\n\r\n /** @internal */\r\n public get _isConstructing(): boolean {\r\n return this._constructionDepth > 0;\r\n }\r\n\r\n public constructor() {\r\n this._currentOperation = undefined;\r\n this._redoOperations = [];\r\n this._undoOperations = [];\r\n this._commitStateOperation = undefined;\r\n this._isDirty = false;\r\n this._canUndo = false;\r\n this._canRedo = false;\r\n this._suppressTrackingCounter = 0;\r\n this._currentOperationOwner = undefined;\r\n this._currentOperationPropertyName = undefined;\r\n this._isValid = true;\r\n this._canCommit = false;\r\n }\r\n\r\n /** @internal */\r\n public _trackObject(trackedObject: TrackedObject) {\r\n this.trackedObjects.push(trackedObject);\r\n }\r\n\r\n /** @internal */\r\n public _untrackObject(trackedObject: TrackedObject) {\r\n this.trackedObjects.splice(this.trackedObjects.indexOf(trackedObject), 1);\r\n if (!trackedObject.isValid) this._invalidCount--;\r\n this.isValid = this._invalidCount === 0;\r\n }\r\n\r\n /** @internal */\r\n public _trackCollection(trackedCollection: TrackedCollection<any>): void {\r\n this.trackedCollections.push(trackedCollection);\r\n }\r\n\r\n /** @internal */\r\n public _untrackCollection(trackedCollection: TrackedCollection<any>) {\r\n this.trackedCollections.splice(\r\n this.trackedCollections.indexOf(trackedCollection),\r\n 1,\r\n );\r\n if (!trackedCollection.isValid) this._invalidCount--;\r\n this.isValid = this._invalidCount === 0;\r\n }\r\n\r\n /** @internal */\r\n public _onValidityChanged(wasValid: boolean, isNowValid: boolean): void {\r\n if (wasValid && !isNowValid) this._invalidCount++;\r\n else if (!wasValid && isNowValid) this._invalidCount--;\r\n if (!this._isTrackingSuppressed) {\r\n this.isValid = this._invalidCount === 0;\r\n }\r\n }\r\n\r\n public construct<T>(action: () => T): T {\r\n const objectsBefore = this.trackedObjects.length;\r\n this._constructionDepth++;\r\n this._suppressTrackingCounter++;\r\n const result = action();\r\n for (let i = objectsBefore; i < this.trackedObjects.length; i++) {\r\n validate(this.trackedObjects[i]);\r\n }\r\n this._suppressTrackingCounter--;\r\n this._constructionDepth--;\r\n this.isValid = this._invalidCount === 0;\r\n return result;\r\n }\r\n\r\n public withTrackingSuppressed(action: () => void): void {\r\n this._suppressTrackingCounter++;\r\n action();\r\n this._suppressTrackingCounter--;\r\n }\r\n\r\n public beginSuppressTracking(): void {\r\n this._suppressTrackingCounter++;\r\n }\r\n\r\n public endSuppressTracking(): void {\r\n this._suppressTrackingCounter--;\r\n }\r\n\r\n /** @internal */\r\n public _doAndTrack(\r\n redoAction: () => void,\r\n undoAction: () => void,\r\n properties: OperationProperties,\r\n ): void {\r\n if (this._isReplaying) return;\r\n\r\n if (this._isTrackingSuppressed) {\r\n redoAction();\r\n if (!this._isConstructing) {\r\n this.revalidateTargeted(properties.trackedObject, properties.property);\r\n }\r\n return;\r\n }\r\n\r\n if (this.isStartingNewOperation()) {\r\n this._currentOperationOwner = properties.trackedObject;\r\n this._currentOperationPropertyName = properties.property;\r\n\r\n if (this.shouldCoalesceChanges(properties)) {\r\n this._currentOperation = CollectionUtilities.getLast(this._undoOperations)!;\r\n this._version++;\r\n this.versionChanged.emit(this._version);\r\n } else {\r\n this._currentOperation = new Operation();\r\n this._undoOperations.push(this._currentOperation);\r\n this._redoOperations.length = 0;\r\n this.reset();\r\n this._version++;\r\n this.versionChanged.emit(this._version);\r\n }\r\n }\r\n\r\n this._currentOperation?.add(\r\n () => redoAction(),\r\n () => undoAction(),\r\n properties,\r\n );\r\n redoAction();\r\n\r\n if (this._currentSession !== undefined &&\r\n properties.property !== undefined &&\r\n properties.trackedObject instanceof TrackedObject) {\r\n this._currentSession._onWrite(properties.trackedObject, properties.property);\r\n }\r\n\r\n if (this.isEndingCurrentOperation(properties)) {\r\n this._currentOperation = undefined;\r\n this._currentOperationOwner = undefined;\r\n this._currentOperationPropertyName = undefined;\r\n this.revalidateTargeted(properties.trackedObject, properties.property);\r\n }\r\n }\r\n\r\n private revalidateTargeted(changedObj: ITracked, changedProp: string | undefined): void {\r\n const depKey = changedProp ?? COLLECTION_VERSION_KEY;\r\n const dependents = [...DependencyTracker.getDependents(changedObj, depKey)];\r\n for (const { obj, prop } of dependents) {\r\n const error = validateSingleProperty(obj, prop);\r\n obj._validate(prop, error);\r\n }\r\n if (changedProp === undefined) {\r\n (changedObj as unknown as TrackedCollection<any>)._validate();\r\n }\r\n this.isValid = this._invalidCount === 0;\r\n }\r\n\r\n private isEndingCurrentOperation(properties: OperationProperties) {\r\n return this._currentOperationOwner === properties.trackedObject &&\r\n this._currentOperationPropertyName === properties.property;\r\n }\r\n\r\n private isStartingNewOperation() {\r\n return this._currentOperationOwner === undefined &&\r\n this._currentOperationPropertyName === undefined;\r\n }\r\n\r\n private shouldCoalesceChanges(properties: OperationProperties): boolean {\r\n const lastOperation = CollectionUtilities.getLast(this._undoOperations);\r\n return (\r\n this.isCoalescibleType(properties) &&\r\n this.hasLastOperation(lastOperation) &&\r\n this.lastOperationTargetsSameProperty(lastOperation!, properties) &&\r\n this.lastActionIsRecent(lastOperation!, properties.coalesceWithin!)\r\n );\r\n }\r\n\r\n private isCoalescibleType(properties: OperationProperties): boolean {\r\n return (\r\n properties.coalesceWithin !== undefined &&\r\n (properties.type === PropertyType.String ||\r\n properties.type === PropertyType.Number)\r\n );\r\n }\r\n\r\n private hasLastOperation(lastOperation: Operation | undefined): boolean {\r\n return !!lastOperation;\r\n }\r\n\r\n private lastOperationTargetsSameProperty(lastOperation: Operation, properties: OperationProperties): boolean {\r\n return lastOperation.actions.every(\r\n (x) =>\r\n x.properties.trackedObject === properties.trackedObject &&\r\n x.properties.property === properties.property,\r\n );\r\n }\r\n\r\n private lastActionIsRecent(lastOperation: Operation, coalesceWithin: number): boolean {\r\n return (\r\n new Date().getTime() -\r\n CollectionUtilities.getLast(lastOperation.actions)!.time.getTime() <\r\n coalesceWithin\r\n );\r\n }\r\n\r\n /** @internal */\r\n public _nextTrackingId(): number {\r\n return this._trackingIdCounter++;\r\n }\r\n\r\n public onCommit(keys?: IdAssignment[]): void {\r\n const lastOp = CollectionUtilities.getLast(this._undoOperations);\r\n this.trackedObjects.forEach((obj) => obj._onCommitted(lastOp, keys));\r\n this._commitStateOperation = lastOp;\r\n this.reset();\r\n }\r\n\r\n /** @internal */\r\n public _isInUndoStack(op: Operation): boolean {\r\n return this._undoOperations.includes(op);\r\n }\r\n\r\n private reset(): void {\r\n this.canUndo = this._undoOperations.length > 0;\r\n this.canRedo = this._redoOperations.length > 0;\r\n this.isDirty =\r\n CollectionUtilities.getLast(this._undoOperations) !==\r\n this._commitStateOperation;\r\n }\r\n\r\n public startSession(scope?: PropertyScope[]): TrackerSession {\r\n if (this._currentSession !== undefined) return this._currentSession;\r\n this._composingBaseIndex = this._undoOperations.length;\r\n this._composingRedoLength = this._redoOperations.length;\r\n this._currentSession = new TrackerSession(\r\n scope,\r\n this,\r\n () => this.endComposing(),\r\n () => this.rollbackComposing(),\r\n );\r\n return this._currentSession;\r\n }\r\n\r\n private endComposing(): void {\r\n if (this._composingBaseIndex === undefined) return;\r\n this._currentSession = undefined;\r\n\r\n const composed = this._undoOperations.splice(this._composingBaseIndex);\r\n this._redoOperations.splice(this._composingRedoLength!);\r\n this._composingBaseIndex = undefined;\r\n this._composingRedoLength = undefined;\r\n\r\n if (composed.length === 0) {\r\n this.reset();\r\n return;\r\n }\r\n\r\n if (composed.length === 1) {\r\n this._undoOperations.push(composed[0]);\r\n this.reset();\r\n return;\r\n }\r\n\r\n const merged = new Operation();\r\n for (const op of composed) {\r\n for (const action of op.actions) {\r\n merged.add(action.redoAction, action.undoAction, action.properties);\r\n }\r\n }\r\n this._undoOperations.push(merged);\r\n this.reset();\r\n }\r\n\r\n private rollbackComposing(): void {\r\n if (this._composingBaseIndex === undefined) return;\r\n this._currentSession = undefined;\r\n\r\n const toRevert = this._undoOperations.splice(this._composingBaseIndex);\r\n this._redoOperations.splice(this._composingRedoLength!);\r\n this._composingBaseIndex = undefined;\r\n this._composingRedoLength = undefined;\r\n\r\n this.withTrackingSuppressed(() => {\r\n for (let i = toRevert.length - 1; i >= 0; i--) {\r\n toRevert[i].undo();\r\n }\r\n });\r\n\r\n this.reset();\r\n this.revalidate();\r\n if (toRevert.length > 0) {\r\n this._version -= toRevert.length;\r\n this.versionChanged.emit(this._version);\r\n }\r\n }\r\n\r\n public undo(): void {\r\n if (!this.canUndo) {\r\n return;\r\n }\r\n\r\n const undoOperation = this._undoOperations.pop()!;\r\n this._isReplaying = true;\r\n this.withTrackingSuppressed(() => undoOperation.undo());\r\n this._isReplaying = false;\r\n this._redoOperations.push(undoOperation);\r\n\r\n this.reset();\r\n this.revalidate();\r\n this._version--;\r\n this.versionChanged.emit(this._version);\r\n }\r\n\r\n public redo(): void {\r\n if (!this.canRedo) {\r\n return;\r\n }\r\n\r\n const redoOperation = this._redoOperations.pop()!;\r\n this._isReplaying = true;\r\n this.withTrackingSuppressed(() => redoOperation.redo());\r\n this._isReplaying = false;\r\n this._undoOperations.push(redoOperation);\r\n\r\n this.reset();\r\n this.revalidate();\r\n this._version++;\r\n this.versionChanged.emit(this._version);\r\n }\r\n\r\n public revalidate(): void {\r\n this.trackedObjects.forEach((x) => validate(x));\r\n this.trackedCollections.forEach((x) => x._validate());\r\n this.isValid = this._invalidCount === 0;\r\n }\r\n}\r\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","import { TrackedObject } from \"./TrackedObject\";\nimport { Change } from \"./Change\";\n\nconst EVENT_METADATA = Symbol(\"eventMetadata\");\n\nexport interface HistoryOptions<TSelf = any, TValue = any> {\n entryFactory: (\n self: TSelf,\n newValue: TValue,\n oldValue: TValue,\n change: Change,\n ctx?: unknown,\n ) => unknown;\n}\n\nexport type HistoryConfig = boolean | HistoryOptions;\n\nexport interface EventPropertyOptions {\n eventType?: string;\n history?: HistoryConfig;\n coalesceWithin?: number;\n}\n\ntype EventMetadataMap = Map<string, EventPropertyOptions>;\n\ninterface EventFieldEntry {\n originalValue: unknown;\n currentValue: unknown;\n}\n\nconst instanceState = new WeakMap<TrackedObject, Map<string, EventFieldEntry>>();\nconst instanceHistory = new WeakMap<TrackedObject, Map<string, unknown[]>>();\nconst instanceHistoryTimes = new WeakMap<TrackedObject, Map<string, number>>();\nconst subscribedInstances = new WeakSet<TrackedObject>();\nconst itemOriginCollection = new WeakMap<TrackedObject, object>();\n\n// Symbol used to sentinel the \"default\" (ungrouped) bucket in event emission.\nexport const DEFAULT_GROUP = \"\";\n\nfunction hasOwnEventMetadata(proto: object): boolean {\n return Object.prototype.hasOwnProperty.call(proto, EVENT_METADATA);\n}\n\nfunction ownEventMetadata(proto: object): EventMetadataMap | undefined {\n return hasOwnEventMetadata(proto)\n ? ((proto as unknown as Record<symbol, EventMetadataMap>)[EVENT_METADATA])\n : undefined;\n}\n\nexport function registerEventProperty(\n proto: object,\n property: string,\n options: EventPropertyOptions,\n): void {\n if (!hasOwnEventMetadata(proto)) {\n Object.defineProperty(proto, EVENT_METADATA, {\n value: new Map<string, EventPropertyOptions>(),\n configurable: true,\n });\n }\n const map = (proto as unknown as Record<symbol, EventMetadataMap>)[EVENT_METADATA];\n if (!map.has(property)) {\n map.set(property, options);\n }\n}\n\nexport function getEventMetadata(proto: object): EventMetadataMap {\n const chain: object[] = [];\n let current: object | null = proto;\n while (current) {\n chain.push(current);\n current = Object.getPrototypeOf(current);\n }\n const merged: EventMetadataMap = new Map();\n for (let i = chain.length - 1; i >= 0; i--) {\n const own = ownEventMetadata(chain[i]);\n if (!own) continue;\n own.forEach((options, property) => {\n if (!merged.has(property)) merged.set(property, options);\n });\n }\n return merged;\n}\n\nexport function hasAnyEventMetadata(proto: object): boolean {\n let current: object | null = proto;\n while (current) {\n if (hasOwnEventMetadata(current)) {\n const own = ownEventMetadata(current);\n if (own && own.size > 0) return true;\n }\n current = Object.getPrototypeOf(current);\n }\n return false;\n}\n\n// ------------------------------------------------------------------ tracker context stack\n\nconst contextStacks = new WeakMap<object, unknown[]>();\n\nexport function pushContext(tracker: object, ctx: unknown): void {\n let stack = contextStacks.get(tracker);\n if (!stack) {\n stack = [];\n contextStacks.set(tracker, stack);\n }\n stack.push(ctx);\n}\n\nexport function popContext(tracker: object): void {\n const stack = contextStacks.get(tracker);\n if (stack && stack.length > 0) stack.pop();\n}\n\nexport function peekContext(tracker: object): unknown {\n const stack = contextStacks.get(tracker);\n return stack && stack.length > 0 ? stack[stack.length - 1] : undefined;\n}\n\n// ------------------------------------------------------------------ instance subscription\n\nexport function ensureEventStateSubscription(target: TrackedObject): void {\n if (subscribedInstances.has(target)) return;\n subscribedInstances.add(target);\n target.changed.subscribe((evt) => {\n const meta = getEventMetadata(Object.getPrototypeOf(target));\n const propMeta = meta.get(evt.property);\n if (!propMeta) return;\n\n if (propMeta.history) {\n appendHistoryEntry(\n target,\n evt.property,\n evt.newValue,\n evt.oldValue,\n propMeta.history,\n propMeta.coalesceWithin,\n );\n } else {\n updateFinalValue(target, evt.property, evt.newValue, evt.oldValue);\n }\n });\n}\n\nfunction updateFinalValue(\n target: TrackedObject,\n property: string,\n newValue: unknown,\n oldValue: unknown,\n): void {\n const state = getOrCreateEventState(target);\n let entry = state.get(property);\n if (!entry) {\n entry = { originalValue: oldValue, currentValue: newValue };\n state.set(property, entry);\n } else {\n entry.currentValue = newValue;\n }\n if (entry.currentValue === entry.originalValue) {\n state.delete(property);\n }\n}\n\nfunction appendHistoryEntry(\n target: TrackedObject,\n property: string,\n newValue: unknown,\n oldValue: unknown,\n historyConfig: HistoryConfig,\n coalesceWithin: number | undefined,\n): void {\n const chains = getOrCreateHistoryState(target);\n let chain = chains.get(property);\n if (!chain) {\n chain = [];\n chains.set(property, chain);\n }\n\n const times = getOrCreateHistoryTimes(target);\n const now = Date.now();\n const lastTime = times.get(property);\n const shouldReplace =\n coalesceWithin !== undefined &&\n lastTime !== undefined &&\n now - lastTime < coalesceWithin &&\n chain.length > 0;\n\n let entry: unknown;\n if (typeof historyConfig === \"object\" && historyConfig.entryFactory) {\n const ctx = peekContext(target.tracker);\n const change = { time: new Date() } as unknown as Change;\n entry = historyConfig.entryFactory(target, newValue, oldValue, change, ctx);\n } else {\n entry = { property, value: newValue };\n }\n\n if (shouldReplace) {\n chain[chain.length - 1] = entry;\n } else {\n chain.push(entry);\n }\n times.set(property, now);\n}\n\nfunction getOrCreateHistoryTimes(target: TrackedObject): Map<string, number> {\n let times = instanceHistoryTimes.get(target);\n if (!times) {\n times = new Map<string, number>();\n instanceHistoryTimes.set(target, times);\n }\n return times;\n}\n\nfunction getOrCreateEventState(target: TrackedObject): Map<string, EventFieldEntry> {\n let state = instanceState.get(target);\n if (!state) {\n state = new Map<string, EventFieldEntry>();\n instanceState.set(target, state);\n }\n return state;\n}\n\nfunction getOrCreateHistoryState(target: TrackedObject): Map<string, unknown[]> {\n let state = instanceHistory.get(target);\n if (!state) {\n state = new Map<string, unknown[]>();\n instanceHistory.set(target, state);\n }\n return state;\n}\n\nexport function getEventState(target: TrackedObject): Map<string, EventFieldEntry> {\n return instanceState.get(target) ?? new Map<string, EventFieldEntry>();\n}\n\nexport function getHistoryState(target: TrackedObject): Map<string, unknown[]> {\n return instanceHistory.get(target) ?? new Map<string, unknown[]>();\n}\n\nexport function clearEventState(target: TrackedObject): void {\n instanceState.delete(target);\n instanceHistory.delete(target);\n instanceHistoryTimes.delete(target);\n}\n\nexport function popHistoryEntry(target: TrackedObject, property: string): void {\n const chains = instanceHistory.get(target);\n if (!chains) return;\n const chain = chains.get(property);\n if (!chain) return;\n chain.pop();\n if (chain.length === 0) chains.delete(property);\n}\n\nexport function recordItemOrigin(item: TrackedObject, collection: object): void {\n itemOriginCollection.set(item, collection);\n}\n\nexport function getItemOrigin(item: TrackedObject): object | undefined {\n return itemOriginCollection.get(item);\n}\n","import { Tracker } from \"./Tracker\";\nimport { TrackedCollection } from \"./TrackedCollection\";\nimport { TrackedObject } from \"./TrackedObject\";\nimport { EventLifecycleOptions } from \"./GeneratedEvent\";\nimport {\n recordItemOrigin,\n HistoryConfig,\n HistoryOptions,\n peekContext,\n} from \"./EventRegistry\";\nimport {\n getIdentityProperties,\n getIdentity,\n getAutoIdProperty,\n} from \"./ExternallyAssigned\";\nimport { getEventMetadata } from \"./EventRegistry\";\nimport { Change } from \"./Change\";\n\nexport interface CollectionHistoryOptions<T = any> {\n entryFactory: (self: T, change: Change, ctx?: unknown) => unknown;\n}\n\nexport type CollectionHistoryConfig = boolean | CollectionHistoryOptions;\n\nexport interface EventTrackedCollectionOptions<T = any, TEventType extends string = string>\n extends EventLifecycleOptions<TEventType> {\n eventType?: TEventType;\n history?: CollectionHistoryConfig;\n owner?: { object: TrackedObject; property: string };\n}\n\ninterface CollectionOp {\n op: \"add\" | \"remove\" | \"change\";\n item?: TrackedObject;\n identity?: unknown;\n diff?: Record<string, unknown>;\n raw?: unknown;\n snapshot?: Record<string, unknown>;\n}\n\nexport class EventTrackedCollection<\n T,\n TEventType extends string = string,\n> extends TrackedCollection<T> {\n private readonly _eventOptions: EventTrackedCollectionOptions<T, TEventType> | undefined;\n private readonly _historyOps: CollectionOp[] = [];\n private readonly _baselineItems: Set<T> = new Set();\n\n public constructor(\n tracker: Tracker,\n items?: T[],\n validator?: (value: T[]) => string | undefined,\n options?: EventTrackedCollectionOptions<T, TEventType>,\n ) {\n super(tracker, items, validator);\n this._eventOptions = options;\n\n for (const item of this.collection) {\n this._baselineItems.add(item);\n if (item instanceof TrackedObject) {\n recordItemOrigin(item, this);\n this._validateItemHasIdentity(item);\n }\n }\n\n this.changed.subscribe((evt) => {\n for (const item of evt.added) {\n if (item instanceof TrackedObject) {\n recordItemOrigin(item, this);\n this._validateItemHasIdentity(item);\n }\n }\n if (this._isAggregateMode() && !this.tracker._isReplaying) {\n for (const item of evt.added) {\n if (item instanceof TrackedObject) {\n this._recordAddOp(item);\n }\n }\n for (const item of evt.removed) {\n if (item instanceof TrackedObject) {\n this._recordRemoveOp(item);\n }\n }\n }\n });\n\n // For history mode, watch item property changes to record change ops.\n if (this._isHistoryMode()) {\n this._attachItemChangeWatchers();\n }\n }\n\n /** @internal */\n public get _lifecycleOptions(): EventLifecycleOptions<TEventType> | undefined {\n if (!this._eventOptions) return undefined;\n if (this._isAggregateMode()) return undefined;\n return {\n itemAdded: this._eventOptions.itemAdded,\n itemRemoved: this._eventOptions.itemRemoved,\n };\n }\n\n /** @internal */\n public get _aggregateOptions(): EventTrackedCollectionOptions<T, TEventType> | undefined {\n return this._isAggregateMode() ? this._eventOptions : undefined;\n }\n\n /** @internal */\n public get _historyOpsList(): CollectionOp[] {\n return this._historyOps;\n }\n\n /** @internal */\n public _clearHistoryOps(): void {\n this._historyOps.length = 0;\n // Rebaseline: current collection items become baseline.\n this._baselineItems.clear();\n for (const item of this.collection) this._baselineItems.add(item);\n }\n\n /** @internal */\n public _isInBaseline(item: T): boolean {\n return this._baselineItems.has(item);\n }\n\n /** @internal */\n public _baselineListSnapshot(): T[] {\n return [...this._baselineItems];\n }\n\n /** @internal */\n public _rebaseline(): void {\n this._baselineItems.clear();\n for (const item of this.collection) this._baselineItems.add(item);\n }\n\n private _isAggregateMode(): boolean {\n if (!this._eventOptions) return false;\n return (\n this._eventOptions.eventType !== undefined ||\n this._eventOptions.history !== undefined\n );\n }\n\n private _isHistoryMode(): boolean {\n return !!this._eventOptions?.history;\n }\n\n private _validateItemHasIdentity(item: TrackedObject): void {\n const props = getIdentityProperties(Object.getPrototypeOf(item));\n if (props.length === 0) {\n throw new Error(\n `EventTrackedCollection item type ${item.constructor.name} must declare at least one @Id or @AutoId property when used with eventType or history mode`,\n );\n }\n }\n\n private _attachItemChangeWatchers(): void {\n const watchItem = (item: TrackedObject) => {\n item.changed.subscribe((_evt) => {\n // Only record if item is currently in the collection AND we're not replaying.\n if (this.tracker._isReplaying) return;\n if (!this.collection.includes(item as unknown as T)) return;\n this._recordChangeOp(item);\n });\n };\n for (const item of this.collection) {\n if (item instanceof TrackedObject) watchItem(item);\n }\n this.changed.subscribe((evt) => {\n for (const item of evt.added) {\n if (item instanceof TrackedObject) watchItem(item);\n }\n });\n }\n\n private _recordAddOp(item: TrackedObject): void {\n const opts = this._eventOptions;\n if (typeof opts?.history === \"object\" && opts.history.entryFactory) {\n const ctx = peekContext(this.tracker);\n const change = { time: new Date() } as unknown as Change;\n this._historyOps.push({\n op: \"add\",\n raw: opts.history.entryFactory(item as any, change, ctx),\n });\n } else if (opts?.history === true) {\n this._historyOps.push({ op: \"add\", item, snapshot: snapshotItemAtRecordTime(item) });\n }\n }\n\n private _recordRemoveOp(item: TrackedObject): void {\n const opts = this._eventOptions;\n const identity = getIdentity(item);\n if (typeof opts?.history === \"object\" && opts.history.entryFactory) {\n const ctx = peekContext(this.tracker);\n const change = { time: new Date() } as unknown as Change;\n this._historyOps.push({\n op: \"remove\",\n raw: opts.history.entryFactory(item as any, change, ctx),\n });\n } else if (opts?.history === true) {\n this._historyOps.push({ op: \"remove\", identity });\n }\n }\n\n private _recordChangeOpDiff(item: TrackedObject): Record<string, unknown> {\n const proto = Object.getPrototypeOf(item);\n const idProps = getIdentityProperties(proto);\n const meta = getEventMetadata(proto);\n const rec = item as unknown as Record<string, unknown>;\n const diff: Record<string, unknown> = {};\n for (const [propName] of meta) {\n if (idProps.includes(propName)) continue;\n const v = rec[propName];\n diff[propName] = v === undefined ? null : v;\n }\n return diff;\n }\n\n private _recordChangeOp(item: TrackedObject): void {\n const opts = this._eventOptions;\n if (typeof opts?.history === \"object\" && opts.history.entryFactory) {\n const ctx = peekContext(this.tracker);\n const change = { time: new Date() } as unknown as Change;\n this._historyOps.push({\n op: \"change\",\n raw: opts.history.entryFactory(item as any, change, ctx),\n });\n } else if (opts?.history === true) {\n const identity = getIdentity(item);\n const diff = this._recordChangeOpDiff(item);\n this._historyOps.push({ op: \"change\", identity, item, diff });\n }\n }\n}\n\nfunction snapshotItemAtRecordTime(item: TrackedObject): Record<string, unknown> {\n const proto = Object.getPrototypeOf(item);\n const meta = getEventMetadata(proto);\n const idProps = getIdentityProperties(proto);\n const autoIdProp = getAutoIdProperty(proto);\n const rec = item as unknown as Record<string, unknown>;\n const snap: Record<string, unknown> = {};\n for (const idProp of idProps) {\n if (idProp === autoIdProp) snap[idProp] = null;\n else snap[idProp] = rec[idProp];\n }\n for (const [propName] of meta) {\n if (idProps.includes(propName)) continue;\n const v = rec[propName];\n snap[propName] = v === undefined ? null : v;\n }\n return snap;\n}\n","import { Tracker } from \"./Tracker\";\nimport { TrackedObject } from \"./TrackedObject\";\nimport { State } from \"./State\";\nimport {\n IdAssignment,\n getAutoIdProperty,\n getIdentity,\n getIdentityObject,\n getIdentityProperties,\n} from \"./ExternallyAssigned\";\nimport { GeneratedEvent } from \"./GeneratedEvent\";\nimport {\n EventTrackedCollection,\n EventTrackedCollectionOptions,\n} from \"./EventTrackedCollection\";\nimport {\n getEventMetadata,\n getEventState,\n getHistoryState,\n clearEventState,\n getItemOrigin,\n pushContext,\n popContext,\n DEFAULT_GROUP,\n} from \"./EventRegistry\";\n\nexport class EventTracker extends Tracker {\n public withContext<T>(ctx: unknown, action: () => T): T {\n pushContext(this, ctx);\n try {\n return action();\n } finally {\n popContext(this);\n }\n }\n\n public override onCommit(keys?: IdAssignment[]): void {\n super.onCommit(keys);\n for (const obj of this.trackedObjects) {\n clearEventState(obj);\n }\n for (const col of this.trackedCollections) {\n if (col instanceof EventTrackedCollection) {\n (col as EventTrackedCollection<unknown>)._clearHistoryOps();\n }\n }\n }\n\n public generateEvents<TEventType extends string = string>(): GeneratedEvent<TEventType>[] {\n const events: GeneratedEvent<TEventType>[] = [];\n\n // Legacy per-op events for collections in itemAdded/itemRemoved-only mode.\n for (const obj of this.trackedObjects) {\n const origin = getItemOrigin(obj) as EventTrackedCollection<unknown> | undefined;\n if (!origin) continue;\n const legacy = origin._lifecycleOptions;\n if (!legacy) continue;\n\n const meta = getEventMetadata(Object.getPrototypeOf(obj));\n switch (obj.state) {\n case State.Insert:\n if (legacy.itemAdded) {\n events.push(buildItemAddedEvent<TEventType>(obj, meta, legacy.itemAdded));\n }\n break;\n case State.Deleted:\n if (legacy.itemRemoved) {\n events.push(buildItemRemovedEvent<TEventType>(obj, legacy.itemRemoved));\n }\n break;\n case State.Changed:\n pushFieldClusterEvents<TEventType>(obj, meta, events);\n break;\n }\n }\n\n // Aggregate: index owned collections by owner\n const ownedCollections = new Map<TrackedObject, EventTrackedCollection<unknown>[]>();\n for (const col of this.trackedCollections) {\n if (!(col instanceof EventTrackedCollection)) continue;\n const agg = (col as EventTrackedCollection<unknown>)._aggregateOptions;\n if (!agg?.owner) continue;\n const owner = agg.owner.object;\n let list = ownedCollections.get(owner);\n if (!list) {\n list = [];\n ownedCollections.set(owner, list);\n }\n list.push(col as EventTrackedCollection<unknown>);\n }\n\n // Top-level events for objects not inside a collection\n for (const obj of this.trackedObjects) {\n const origin = getItemOrigin(obj);\n if (origin) continue;\n\n const groups = new Map<string, Record<string, unknown>>();\n const meta = getEventMetadata(Object.getPrototypeOf(obj));\n\n const stateMap = getEventState(obj);\n const historyMap = getHistoryState(obj);\n for (const [propName, propMeta] of meta) {\n const group = propMeta.eventType ?? DEFAULT_GROUP;\n if (propMeta.history) {\n const chain = historyMap.get(propName);\n if (chain && chain.length > 0) {\n addToGroup(groups, group, propName, [...chain]);\n }\n } else {\n const entry = stateMap.get(propName);\n if (entry) {\n addToGroup(groups, group, propName, normalizeValue(entry.currentValue));\n }\n }\n }\n\n const owned = ownedCollections.get(obj) ?? [];\n for (const col of owned) {\n const slot = computeCollectionSlot(col, this);\n if (slot === undefined) continue;\n const agg = col._aggregateOptions!;\n const group = agg.eventType ?? DEFAULT_GROUP;\n const propertyName = agg.owner!.property;\n addToGroup(groups, group, propertyName, slot);\n }\n\n if (groups.size === 0) continue;\n\n const identity = getIdentity(obj);\n for (const [group, payload] of groups) {\n const event: GeneratedEvent<TEventType> = {\n eventType: group as TEventType,\n payload,\n trackingId: obj.trackingId,\n };\n if (identity !== undefined) {\n event.targetId = identity;\n }\n events.push(event);\n }\n }\n\n // Standalone aggregate collections (no owner) — emit their own event\n for (const col of this.trackedCollections) {\n if (!(col instanceof EventTrackedCollection)) continue;\n const agg = (col as EventTrackedCollection<unknown>)._aggregateOptions;\n if (!agg || agg.owner) continue;\n const slot = computeCollectionSlot(col as EventTrackedCollection<unknown>, this);\n if (slot === undefined) continue;\n const eventType = (agg.eventType ?? DEFAULT_GROUP) as TEventType;\n events.push({\n eventType,\n payload: slot as Record<string, unknown>,\n });\n }\n\n return events;\n }\n}\n\nfunction addToGroup(\n groups: Map<string, Record<string, unknown>>,\n group: string,\n key: string,\n value: unknown,\n): void {\n let payload = groups.get(group);\n if (!payload) {\n payload = {};\n groups.set(group, payload);\n }\n payload[key] = value;\n}\n\nfunction buildItemAddedEvent<TEventType extends string>(\n obj: TrackedObject,\n meta: Map<string, { eventType?: string }>,\n eventType: string,\n): GeneratedEvent<TEventType> {\n const payload: Record<string, unknown> = {};\n for (const [propertyName] of meta) {\n const value = (obj as unknown as Record<string, unknown>)[propertyName];\n payload[propertyName] = normalizeValue(value);\n }\n return {\n eventType: eventType as TEventType,\n payload,\n trackingId: obj.trackingId,\n };\n}\n\nfunction buildItemRemovedEvent<TEventType extends string>(\n obj: TrackedObject,\n eventType: string,\n): GeneratedEvent<TEventType> {\n const autoIdProp = getAutoIdProperty(Object.getPrototypeOf(obj));\n const targetId = autoIdProp\n ? (obj as unknown as Record<string, unknown>)[autoIdProp]\n : undefined;\n const event: GeneratedEvent<TEventType> = {\n eventType: eventType as TEventType,\n payload: {},\n };\n if (typeof targetId === \"number\") {\n event.targetId = targetId;\n }\n return event;\n}\n\nfunction pushFieldClusterEvents<TEventType extends string>(\n obj: TrackedObject,\n meta: Map<string, { eventType?: string }>,\n events: GeneratedEvent<TEventType>[],\n): void {\n const state = getEventState(obj);\n if (state.size === 0) return;\n\n const grouped = new Map<string, string[]>();\n for (const [propertyName, propMeta] of meta) {\n if (!state.has(propertyName)) continue;\n if (!propMeta.eventType) continue;\n let bucket = grouped.get(propMeta.eventType);\n if (!bucket) {\n bucket = [];\n grouped.set(propMeta.eventType, bucket);\n }\n bucket.push(propertyName);\n }\n\n const autoIdProp = getAutoIdProperty(Object.getPrototypeOf(obj));\n const targetIdRaw = autoIdProp\n ? (obj as unknown as Record<string, unknown>)[autoIdProp]\n : undefined;\n\n for (const [eventType, propertyNames] of grouped) {\n const payload: Record<string, unknown> = {};\n for (const propertyName of propertyNames) {\n payload[propertyName] = normalizeValue(state.get(propertyName)!.currentValue);\n }\n const event: GeneratedEvent<TEventType> = {\n eventType: eventType as TEventType,\n payload,\n trackingId: obj.trackingId,\n };\n if (typeof targetIdRaw === \"number\") {\n event.targetId = targetIdRaw;\n }\n events.push(event);\n }\n}\n\nfunction computeCollectionSlot(\n col: EventTrackedCollection<unknown>,\n tracker: EventTracker,\n): unknown | undefined {\n const agg = col._aggregateOptions!;\n const isHistory = agg.history !== undefined && agg.history !== false;\n if (isHistory) return computeHistoryOps(col, agg);\n return computeBucketedSlot(col, tracker);\n}\n\nfunction computeHistoryOps(\n col: EventTrackedCollection<unknown>,\n agg: EventTrackedCollectionOptions,\n): unknown {\n const opsList = col._historyOpsList;\n const hasFactory =\n typeof agg.history === \"object\" && (agg.history as any).entryFactory;\n\n const ops: unknown[] = [];\n for (const op of opsList) {\n if (hasFactory) {\n ops.push(op.raw);\n continue;\n }\n if (op.op === \"add\") {\n ops.push({ op: \"add\", item: op.snapshot ?? (op.item ? snapshotItemForAdded(op.item) : {}) });\n } else if (op.op === \"remove\") {\n const idObj = op.identity && typeof op.identity === \"object\"\n ? (op.identity as Record<string, unknown>)\n : identityToSingleKeyObject(op.identity, col);\n ops.push({ op: \"remove\", ...idObj });\n } else if (op.op === \"change\" && op.item) {\n const idObj = getIdentityObject(op.item);\n const diff = op.diff ?? computeItemDiff(op.item);\n ops.push({ op: \"change\", ...idObj, ...diff });\n }\n }\n\n if (ops.length === 0) return undefined;\n return { ops };\n}\n\nfunction identityToSingleKeyObject(\n identity: unknown,\n col: EventTrackedCollection<unknown>,\n): Record<string, unknown> {\n const baseline = col._baselineListSnapshot();\n const sample = baseline.find((i) => i instanceof TrackedObject) as\n | TrackedObject\n | undefined;\n const currentSample = col.collection.find(\n (i) => i instanceof TrackedObject,\n ) as TrackedObject | undefined;\n const proto = sample\n ? Object.getPrototypeOf(sample)\n : currentSample\n ? Object.getPrototypeOf(currentSample)\n : undefined;\n if (!proto) return {};\n const props = getIdentityProperties(proto);\n if (props.length === 1) return { [props[0]]: identity };\n return identity && typeof identity === \"object\"\n ? (identity as Record<string, unknown>)\n : {};\n}\n\nfunction computeBucketedSlot(\n col: EventTrackedCollection<unknown>,\n tracker: EventTracker,\n): unknown | undefined {\n const added: unknown[] = [];\n const changed: unknown[] = [];\n const removed: unknown[] = [];\n\n const isPrimitive = !hasTrackedObjectItems(col);\n\n for (const item of col.collection) {\n if (item instanceof TrackedObject) {\n if (item.state === State.Insert) {\n added.push(snapshotItemForAdded(item));\n } else if (item.state === State.Changed) {\n const entry = buildChangedEntry(item);\n if (entry) changed.push(entry);\n }\n }\n }\n\n if (isPrimitive) {\n for (const item of col.collection) {\n if (!col._isInBaseline(item)) added.push(item);\n }\n for (const baselineItem of col._baselineListSnapshot()) {\n if (!col.collection.includes(baselineItem)) removed.push(baselineItem);\n }\n } else {\n for (const obj of tracker.trackedObjects) {\n if (obj.state !== State.Deleted) continue;\n if (getItemOrigin(obj) !== col) continue;\n const identity = getIdentity(obj);\n removed.push(identity);\n }\n }\n\n if (added.length === 0 && changed.length === 0 && removed.length === 0) {\n return undefined;\n }\n\n const slot: Record<string, unknown> = { added, removed };\n if (!isPrimitive) slot.changed = changed;\n return slot;\n}\n\nfunction hasTrackedObjectItems(col: EventTrackedCollection<unknown>): boolean {\n for (const item of col.collection) {\n if (item instanceof TrackedObject) return true;\n }\n for (const item of col._baselineListSnapshot()) {\n if (item instanceof TrackedObject) return true;\n }\n return false;\n}\n\nfunction snapshotItemForAdded(item: TrackedObject): Record<string, unknown> {\n const proto = Object.getPrototypeOf(item);\n const meta = getEventMetadata(proto);\n const idProps = getIdentityProperties(proto);\n const autoIdProp = getAutoIdProperty(proto);\n const snapshot: Record<string, unknown> = {};\n\n const rec = item as unknown as Record<string, unknown>;\n for (const idProp of idProps) {\n if (idProp === autoIdProp) {\n snapshot[idProp] = null;\n } else {\n snapshot[idProp] = rec[idProp];\n }\n }\n for (const [propName] of meta) {\n if (idProps.includes(propName)) continue;\n snapshot[propName] = normalizeValue(rec[propName]);\n }\n return snapshot;\n}\n\nfunction buildChangedEntry(item: TrackedObject): Record<string, unknown> | undefined {\n const state = getEventState(item);\n const history = getHistoryState(item);\n if (state.size === 0 && history.size === 0) return undefined;\n\n const proto = Object.getPrototypeOf(item);\n const idProps = getIdentityProperties(proto);\n const rec = item as unknown as Record<string, unknown>;\n\n const entry: Record<string, unknown> = {};\n for (const idProp of idProps) {\n entry[idProp] = rec[idProp];\n }\n for (const [propName, e] of state) {\n if (idProps.includes(propName)) continue;\n entry[propName] = normalizeValue(e.currentValue);\n }\n for (const [propName, chain] of history) {\n if (idProps.includes(propName)) continue;\n entry[propName] = [...chain];\n }\n return entry;\n}\n\nfunction computeItemDiff(item: TrackedObject): Record<string, unknown> {\n const state = getEventState(item);\n const proto = Object.getPrototypeOf(item);\n const idProps = getIdentityProperties(proto);\n const diff: Record<string, unknown> = {};\n for (const [propName, e] of state) {\n if (idProps.includes(propName)) continue;\n diff[propName] = normalizeValue(e.currentValue);\n }\n return diff;\n}\n\nfunction normalizeValue(value: unknown): unknown {\n return value === undefined ? null : value;\n}\n","import { TrackedObject } from \"./TrackedObject\";\nimport { Tracked } from \"./Tracked\";\nimport {\n registerEventProperty,\n ensureEventStateSubscription,\n HistoryConfig,\n} from \"./EventRegistry\";\n\nexport interface EventTrackedOptions {\n coalesceWithin?: number;\n eventType?: string;\n history?: HistoryConfig;\n}\n\nexport function EventTracked(\n validator?: (self: any, newValue: any) => string | undefined,\n onChange?: (self: any, newValue: any, oldValue: any) => void,\n options?: EventTrackedOptions,\n) {\n const trackedDecorator = Tracked(validator, onChange, {\n coalesceWithin: options?.coalesceWithin,\n });\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(target: any, context: any): any {\n const result = (trackedDecorator as any)(target, context);\n const propertyName = String(context.name);\n\n context.addInitializer(function (this: TrackedObject) {\n registerEventProperty(Object.getPrototypeOf(this), propertyName, {\n eventType: options?.eventType,\n history: options?.history,\n coalesceWithin: options?.coalesceWithin,\n });\n ensureEventStateSubscription(this);\n });\n\n return result;\n }\n\n return decorator;\n}\n"],"mappings":"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","names":["State","proto"]}