sia-reactor 0.0.46 → 0.0.47

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/ts/adapters/react.ts","../../src/ts/adapters/react/hooks/useReactor.ts","../../src/ts/adapters/react/utils.ts","../../src/ts/core/consts.ts","../../src/ts/utils/obj.ts","../../src/ts/core/event.ts","../../src/ts/core/reactor.ts","../../src/ts/core/mixins.ts","../../src/ts/adapters/autotracker.ts","../../src/ts/adapters/react/hooks/useSelector.ts","../../src/ts/adapters/react/hooks/usePath.ts","../../src/ts/adapters/react/TimeTravelConsole.tsx","../../src/ts/modules/base/index.ts","../../src/ts/utils/dom.ts","../../src/ts/utils/keys.ts","../../src/ts/adapters/vanilla/effect.ts","../../src/ts/adapters/vanilla/TimeTravelConsole.ts"],"sourcesContent":["export { useReactor, useAnyReactor, useReactorSnapshot } from \"./react/hooks/useReactor\";\r\n\r\nexport { useSelector, useAnySelector, useSelectorSnapshot } from \"./react/hooks/useSelector\";\r\n\r\nexport { usePath } from \"./react/hooks/usePath\";\r\n\r\nexport { useISOLayoutEffect } from \"./react/utils\";\r\n\r\nexport { type TimeTravelConsoleProps, TimeTravelConsole } from \"./react/TimeTravelConsole\";\r\n","import { useRef, useCallback, useSyncExternalStore, useMemo } from \"react\";\r\nimport { useISOLayoutEffect } from \"../utils\";\r\nimport { CTX, NIL, NOOP } from \"@core/consts\";\r\nimport { Reactor } from \"@core/reactor\";\r\nimport { type Reactive, getReactor } from \"@core/mixins\";\r\nimport type { EffectOptions, ReactorBuild } from \"@defs/reactor\";\r\nimport type { DeepReadonly } from \"@defs/obj\";\r\nimport { Autotracker } from \"../../autotracker\";\r\n\r\n/**\r\n * Subscribes a component to desired Reactor state and returns it.\r\n * The hook uses access tracking so re-renders occur only when accessed fields change.\r\n * @typeParam T Root state object type.\r\n * @param target Reactive object, Reactor instance, or plain object.\r\n * @param options Watcher options if `options.sync: false` else Listener options.\r\n * @param build Optional Reactor build options used when creating a scoped Reactor for plain objects.\r\n * @returns State for render usage if state is scoped locally or just desired.\r\n * @example\r\n * const a = useReactor({ user: { name: \"Kosi\" } }); // per-component scoped\r\n * @example\r\n * const state = reactive({ user: { name: \"Kosi\" } });\r\n * const b = useReactor(state);\r\n * @example\r\n * const rtr = new Reactor({ user: { name: \"Kosi\" } });\r\n * const c = useReactor(rtr);\r\n */\r\nexport function useReactor<T extends object>(target: T | Reactor<T> | Reactive<T>, options: EffectOptions = NIL, build?: ReactorBuild<T>): T {\r\n const versionRef = useRef(0),\r\n tgtRef = useRef<T | Reactor<T> | Reactive<T>>(), // HMR Survival\r\n rtrRef = useRef<Reactor<T>>(),\r\n rtr = tgtRef.current !== target || !rtrRef.current ? ((tgtRef.current = target), (rtrRef.current = getReactor(target, true, build))) : rtrRef.current,\r\n atrkrRef = useRef<Autotracker<T>>(),\r\n prevTrkr = CTX.autotracker,\r\n atrkr = (CTX.autotracker = atrkrRef.current ||= new Autotracker()),\r\n optsRef = useRef(options),\r\n notifyRef = useRef<() => void>(NOOP); // The uSES trigger bridge\r\n optsRef.current = options; // preventing staleness\r\n atrkr.unblock(rtr), queueMicrotask(() => CTX.autotracker === atrkr && (CTX.autotracker = prevTrkr)); // in case of abort\r\n const subscribe = useCallback((notify: () => void) => atrkr.callback((notifyRef.current = () => (versionRef.current++, notify()))), [atrkr]);\r\n const getSnapshot = useCallback(() => versionRef.current, []);\r\n useSyncExternalStore(subscribe, getSnapshot, getSnapshot); // Feed React a primitive number to track tearing, zero cloning.\r\n return useISOLayoutEffect(() => ((CTX.autotracker = prevTrkr), atrkr.callback(notifyRef.current, optsRef.current)), [atrkr]), rtr.core;\r\n}\r\n\r\n/**\r\n * Subscribes a component to any Reactor state.\r\n * The hook uses access tracking so re-renders occur only when accessed fields change.\r\n * @param options Watcher options if `options.sync: false` else Listener options.\r\n * @example\r\n * useAnyReactor();\r\n */\r\nexport function useAnyReactor(options: EffectOptions = NIL): void {\r\n const versionRef = useRef(0),\r\n atrkrRef = useRef<Autotracker<any>>(),\r\n prevTrkr = CTX.autotracker,\r\n atrkr = (CTX.autotracker = atrkrRef.current ||= new Autotracker()), // assigned after to avoid waste of new instances\r\n optsRef = useRef(options),\r\n notifyRef = useRef<() => void>(NOOP);\r\n optsRef.current = options; // preventing staleness\r\n atrkr.unblock(), queueMicrotask(() => CTX.autotracker === atrkr && (CTX.autotracker = prevTrkr)); // in case of abort\r\n const subscribe = useCallback((notify: () => void) => atrkr.callback((notifyRef.current = () => (versionRef.current++, notify()))), [atrkr]);\r\n const getSnapshot = useCallback(() => versionRef.current, []);\r\n useSyncExternalStore(subscribe, getSnapshot, getSnapshot); // Feed React a primitive number to track tearing, zero cloning.\r\n useISOLayoutEffect(() => ((CTX.autotracker = prevTrkr), atrkr.callback(notifyRef.current, optsRef.current)), [atrkr]);\r\n}\r\n\r\n/**\r\n * Subscribes a component to Reactor state and returns a readonly tracked snapshot.\r\n * Rule of thumb: read from snapshots, mutate the source.\r\n * The hook uses access tracking so re-renders occur only when accessed fields change.\r\n * @typeParam T Root state object type.\r\n * @param target Reactive object, Reactor instance, or plain object.\r\n * @param options Watcher options if `options.sync: false` else Listener options.\r\n * @param build Optional Reactor build options used when creating a scoped Reactor for plain objects.\r\n * @returns Tracked snapshot snap for render usage.\r\n * @example\r\n * const a = useReactorSnapshot({ user: { name: \"Kosi\" } }); // per-component scoped\r\n * @example\r\n * const state = reactive({ user: { name: \"Kosi\" } });\r\n * const b = useReactorSnapshot(state);\r\n * @example\r\n * const rtr = new Reactor({ user: { name: \"Kosi\" } });\r\n * const c = useReactorSnapshot(rtr);\r\n */\r\nexport function useReactorSnapshot<T extends object>(target: T | Reactor<T> | Reactive<T>, options?: EffectOptions, build: ReactorBuild<T> = { referenceTracking: true, smartCloning: true }): DeepReadonly<T> {\r\n const tgtRef = useRef<T | Reactor<T> | Reactive<T>>(),\r\n rtrRef = useRef<Reactor<T>>(),\r\n rtr = tgtRef.current !== target || !rtrRef.current ? ((tgtRef.current = target), (rtrRef.current = getReactor(target, true, build))) : rtrRef.current,\r\n atrkrRef = useRef<Autotracker<T>>(),\r\n atrkrRtrRef = useRef<Reactor<T>>(),\r\n atrkr = atrkrRtrRef.current !== rtr || !atrkrRef.current ? ((atrkrRtrRef.current = rtr), (atrkrRef.current = new Autotracker(rtr))) : atrkrRef.current,\r\n notifyRef = useRef<() => void>(NOOP),\r\n optsRef = useRef(options);\r\n rtr.config.referenceTracking = rtr.config.smartCloning = true;\r\n optsRef.current = options; // preventing staleness\r\n const subscribe = useCallback((notify: () => void) => (atrkr.callback((notifyRef.current = notify), optsRef.current), () => atrkr.cleanup()), [atrkr]);\r\n const getSnapshot = () => rtr.snapshot();\r\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\r\n const proxy = useMemo(() => atrkr.tracked(snapshot), [atrkr, snapshot]);\r\n return useISOLayoutEffect(() => atrkr.callback(notifyRef.current, optsRef.current), [atrkr, proxy]), proxy;\r\n} // Nothing much here, just rebuilding \"Valtio.js\" `useSnapshot`, Proof of Concept: Reactor is a core of cores\r\n","import { useLayoutEffect, useEffect } from \"react\";\r\n\r\n/** Isomorphic layout effect alias (`useLayoutEffect` in browser, `useEffect` otherwise). */\r\nexport const useISOLayoutEffect = \"undefined\" !== typeof window ? useLayoutEffect : useEffect;\r\n","import { ReactorBuild, ReactorMeta } from \"@defs/reactor\";\r\nimport { Autotracker } from \"@adapters/autotracker\";\r\n\r\n// ===========================================================================\r\n// The S.I.A (State & Intent Architecture) Constants\r\n// ===========================================================================\r\n\r\n/** Marker to access underlying raw object from a proxy. */\r\nexport const RAW: unique symbol = Symbol.for(\"S.I.A_RAW\"); // \"Get Original Obj\" Marker\r\n/** Marker to opt an object out of reactor proxy handling. */\r\nexport const INERTIA: unique symbol = Symbol.for(\"S.I.A_INERTIA\"); // \"No Proxy\" Marker\r\n/** Marker to mark a branch as intent (rejectable). */\r\nexport const REJECTABLE: unique symbol = Symbol.for(\"S.I.A_REJECTABLE\"); // \"State Vs. Intent\" Marker\r\n/** Marker to enable indifference/non-equality semantics for a branch. */\r\nexport const INDIFFABLE: unique symbol = Symbol.for(\"S.I.A_INDIFFABLE\"); // \"Equality Tracking\" Marker\r\n/** Sentinel return value that terminates a mediated operation. */\r\nexport const TERMINATOR: unique symbol = Symbol.for(\"S.I.A_TERMINATOR\"); // \"Obj Operation Terminator\" Marker\r\n/** Internal mutation version marker. */\r\nexport const VERSION: unique symbol = Symbol.for(\"S.I.A_VERSION\"); // \"Obj Mutation Count\" Marker\r\n/** Internal snapshot version marker used by smart cloning. */\r\nexport const SSVERSION: unique symbol = Symbol.for(\"S.I.A_SNAPSHOT_VERSION\"); // \"Obj Snapshot Version\" Marker\r\n/** Default batching scheduler used by the reactor runtime. */\r\nexport const RTR_BATCH = \"undefined\" !== typeof window ? (\"undefined\" !== typeof queueMicrotask ? queueMicrotask : setTimeout).bind(window) : \"undefined\" !== typeof process && process.nextTick ? process.nextTick : setTimeout;\r\n/** Default reactor logger prefix function. */\r\nexport const RTR_LOG = console.log.bind(console, \"[S.I.A Reactor]\");\r\n/** Canonical option keys parsed for listener and mediator registrations. */\r\nexport const EVT_OPTS = { LISTENER: [\"capture\", \"depth\", \"once\", \"signal\", \"init\"], MEDIATOR: [\"lazy\", \"signal\", \"init\"] } as const;\r\n/** Frozen empty object used as a zero-allocation default options value. */\r\nexport const NIL = Object.freeze({}) as any; // empty obj to escape any optional chain overhead\r\n/** Shared no-operation function. */\r\nexport const NOOP = () => {}; // no operation function to escape optional chain overhead\r\n\r\nlet isDevEnv = false;\r\ntry {\r\n isDevEnv = process.env.NODE_ENV !== \"production\";\r\n} catch (e) {}\r\nconst CTX_BUILD = {\r\n /** Flag indicating whether the application is running in development mode. */\r\n isDevEnv,\r\n /** Flag indicating whether an operation is bypassing checks so reactors can allow all writes. */\r\n usingForce: false,\r\n /** Active `Autotracker` instance, override for automatic dependency collection on `Reactor` traps. */\r\n autotracker: null as Autotracker<any> | null,\r\n /** Extensible meta context for payloads and cross-cutting concerns. */\r\n meta: null as ReactorMeta | null,\r\n /** Default configuration for new `Reactor` instances and also fallback for utils that need and are called without these options. */\r\n defaults: {\r\n crossRealms: false,\r\n smartCloning: false,\r\n eventBubbling: true,\r\n eventCapturing: \"auto\",\r\n lineageTracing: false,\r\n preserveContext: false,\r\n equalityFunction: Object.is,\r\n batchingFunction: RTR_BATCH,\r\n } as Partial<ReactorBuild<any>>,\r\n};\r\n\r\n/** Global context object for sharing state across the reactor runtime. */\r\nexport const CTX: typeof CTX_BUILD = ((globalThis as any)[Symbol.for(\"S.I.A_CTX\")] ??= CTX_BUILD);\r\n","import { CTX, NIL, INERTIA } from \"@core/consts\";\r\nimport { ReactorEvent } from \"@core/event\";\r\nimport type { Pure } from \"@core/mixins\";\r\nimport { Payload, Reactor, ReactorMeta } from \"@defs/reactor\";\r\nimport { getReactor } from \"@core/mixins\";\r\nimport type { DeepMerge, Unflatten, WildPaths, PathValue, PathBranchValue, ChildPaths, MaxDepth, Paths, DeepPartial } from \"@defs/obj\";\r\nimport { transaction, txId } from \"@modules/timeTravel/transaction\";\r\n\r\nexport let arrRegex = /^([^\\[\\]]+)\\[(\\d+)\\]$/;\r\n\r\n// Type Guards\r\n\r\n/** Checks if a value type is an object for common use cases. */\r\nexport function isObj<T extends object = object>(obj: any, arraycheck = true): obj is T {\r\n return \"object\" === typeof obj && obj !== null && (arraycheck ? !Array.isArray(obj) : true);\r\n} // okay for common use cases but loose\r\n/** Checks if a value is a \"Plain Old Javascript Object\". */\r\nexport function isPOJO<T extends object = object>(obj: any, config: { crossRealms?: boolean } = CTX.defaults, typecheck = true): obj is T {\r\n return (typecheck ? isObj(obj, false) : true) && (config.crossRealms ? Object.prototype.toString.call(obj) === \"[object Object]\" : obj.constructor === Object);\r\n} // for strict own POJOs, handles cross-realm objects too\r\n\r\n/** Returns whether a value can be proxied by the reactor runtime. */\r\nexport function canHandle(obj: any, config: { crossRealms?: boolean; preserveContext?: boolean } = CTX.defaults, typecheck = true): boolean {\r\n if ((typecheck && !isObj(obj, false)) || (obj as any)[INERTIA]) return false;\r\n if (Array.isArray(obj) || (!config.preserveContext && isPOJO(obj, config, false))) return true;\r\n if (config.preserveContext) return !(obj instanceof String) && !(obj instanceof Number) && !(obj instanceof Function) && !(obj instanceof Date) && !(obj instanceof Error) && !(obj instanceof RegExp) && !(obj instanceof Promise) && !(obj instanceof Map) && !(obj instanceof WeakMap) && !(obj instanceof Set) && !(obj instanceof WeakSet) && !(obj instanceof EventTarget); // matching types\r\n return false;\r\n} // universal proxy gate for all reactive logic\r\n\r\n// Deep Manipulation\r\n\r\n/**\r\n * Gets a value by path.\r\n * @example\r\n * const state = { user: { profile: { name: \"Kosi\" } } };\r\n * const name = getPath(state, \"user.profile.name\");\r\n */\r\nexport function getPath<T extends object, const S extends string = \".\", P extends WildPaths<T, S> = WildPaths<T, S>>(source: T, key: P, separator: S = \".\" as S, keyFn?: (p: string) => string): PathValue<T, P, S> {\r\n if (key === \"*\") return source as any;\r\n const keys = key.split(separator);\r\n let currObj: any = source;\r\n for (let i = 0, len = keys.length; i < len; i++) {\r\n const key = keyFn ? keyFn(keys[i]) : keys[i],\r\n match = key.includes(\"[\") && key.match(arrRegex);\r\n if (match) {\r\n const [, key, iStr] = match;\r\n if (!Array.isArray(currObj[key]) || !(key in currObj)) return currObj[key];\r\n currObj = currObj[key][Number(iStr)];\r\n } else {\r\n if (!isObj<Record<string, any>>(currObj) || !(key in currObj)) return currObj[key];\r\n currObj = currObj[key];\r\n }\r\n }\r\n return currObj;\r\n}\r\n\r\n/**\r\n * Sets a value by path.\r\n * @example\r\n * const state = { user: { profile: { name: \"Kosi\" } } };\r\n * setPath(state, \"user.profile.name\", \"Grace\");\r\n * @example\r\n * const state = { users: [] as Array<{ name?: string }> };\r\n * setPath(state, \"users.0.name\", \"Kosi\"); // use `[n]` for arrays if uncertain so the indexes are not treated as object keys, i.e. { \"0\": { name: \"Kosi\" } } instead of { users: [ { name: \"Kosi\" } ] }\r\n */\r\nexport function setPath<T extends object, const S extends string = \".\", P extends WildPaths<T, S> = WildPaths<T, S>>(target: T, key: P, value: PathValue<T, P, S>, separator: S = \".\" as S, keyFn?: (p: string) => string): void {\r\n if (key === \"*\") return Object.assign(target, value);\r\n const keys = key.split(separator);\r\n for (let currObj: any = target, i = 0, len = keys.length; i < len; i++) {\r\n const key = keyFn ? keyFn(keys[i]) : keys[i],\r\n match = key.includes(\"[\") && key.match(arrRegex);\r\n if (match) {\r\n const [, key, iStr] = match;\r\n if (!Array.isArray(currObj[key])) currObj[key] = [];\r\n if (i === len - 1) currObj[key][Number(iStr)] = value;\r\n else (currObj[key][Number(iStr)] ||= {}), (currObj = currObj[key][Number(iStr)]);\r\n } else {\r\n if (i === len - 1) currObj[key] = value;\r\n else (currObj[key] ||= {}), (currObj = currObj[key]);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Deletes a value by path.\r\n * @example\r\n * const state = { user: { profile: { name: \"Kosi\" } } };\r\n * deletePath(state, \"user.profile.name\");\r\n */\r\nexport function deletePath<T extends object, const S extends string = \".\", P extends WildPaths<T, S> = WildPaths<T, S>>(target: T, key: P, separator: S = \".\" as S, keyFn?: (p: string) => string): void {\r\n if (key === \"*\") {\r\n const keys = Object.keys(target);\r\n for (let i = 0, len = keys.length; i < len; i++) delete (target as any)[keys[i]];\r\n return;\r\n }\r\n const keys = key.split(separator);\r\n for (let currObj: any = target, i = 0, len = keys.length; i < len; i++) {\r\n const key = keyFn ? keyFn(keys[i]) : keys[i],\r\n match = key.includes(\"[\") && key.match(arrRegex);\r\n if (match) {\r\n const [, key, iStr] = match;\r\n if (!Array.isArray(currObj[key]) || !(key in currObj)) return;\r\n if (i === len - 1) delete currObj[key][Number(iStr)];\r\n else currObj = currObj[key][Number(iStr)];\r\n } else {\r\n if (!isObj<Record<string, any>>(currObj) || !(key in currObj)) return;\r\n if (i === len - 1) delete currObj[key];\r\n else currObj = currObj[key];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Checks whether a path exists.\r\n * @example\r\n * const state = { user: { profile: { name: \"Kosi\" } } };\r\n * const ok = hasPath(state, \"user.profile.name\"); // default loose typing due to it's usecase\r\n */\r\nexport function hasPath<T extends object, const S extends string = \".\", P extends string = string>(source: T, key: P, separator: S = \".\" as S, keyFn?: (p: string) => string): boolean {\r\n if (key === \"*\") return true;\r\n const keys = key.split(separator);\r\n for (let currObj: any = source, i = 0, len = keys.length; i < len; i++) {\r\n const key = keyFn ? keyFn(keys[i]) : keys[i],\r\n match = key.includes(\"[\") && key.match(arrRegex);\r\n if (match) {\r\n const [, key, iStr] = match;\r\n if (!Array.isArray(currObj[key]) || !(key in currObj)) return false;\r\n if (i === len - 1) return true;\r\n currObj = currObj[key][Number(iStr)];\r\n } else {\r\n if (!isObj<Record<string, any>>(currObj) || !(key in currObj)) return false;\r\n if (i === len - 1) return true;\r\n currObj = currObj[key];\r\n }\r\n }\r\n return true;\r\n}\r\n\r\n/**\r\n * Converts flattened keys into nested object structure.\r\n * @example\r\n * const flat = { \"user.name\": \"Kosi\", \"user.role\": \"admin\" };\r\n * const obj = parsePathObj(flat);\r\n */\r\nexport function parsePathObj<T extends Record<string, any>, const S extends string = \".\">(obj: T, separator: S = \".\" as S, keyFn = (p: string) => p, seen = new WeakSet()): Unflatten<T, S> {\r\n if (!isPOJO(obj) || seen.has(obj)) return obj as Unflatten<T, S>; // no circular references\r\n seen.add(obj);\r\n const result: any = {},\r\n keys = Object.keys(obj);\r\n for (let i = 0, len = keys.length; i < len; i++) {\r\n const key: any = keys[i],\r\n val: any = obj[key];\r\n key === \"*\" || key.includes(separator) ? setPath(result, key, parsePathObj(val, separator, keyFn, seen), separator, keyFn) : (result[key] = isPOJO(val) ? parsePathObj(val, separator, keyFn, seen) : val);\r\n }\r\n return result as Unflatten<T, S>;\r\n}\r\n\r\n/** Fast array scanner. Checks if a target path exactly matches or is a child of any path in the provided array. */\r\nexport function matchPaths(paths: Array<string | RegExp>, target: string): boolean {\r\n for (let i = 0, len = paths.length; i < len; i++) {\r\n const p = paths[i];\r\n if (typeof p !== \"string\" ? !!p?.test?.(target) : target === p || target.startsWith(p + \".\")) return true;\r\n }\r\n return false;\r\n}\r\n\r\n/** Counts the depth(number of dot(s)) in a path in the most optimized way possible. */\r\nexport function getDepth(path: string, depth = !path ? 0 : 1): number {\r\n for (let i = 0, len = path.length; i < len; i++) if (path.charCodeAt(i) === 46) depth++; // zero alloc; so when we say it's optmized, it's not cap :)\r\n return depth;\r\n}\r\n\r\n/** Normalizes boolean/object event options into a single options object. */\r\nexport function parseEvtOpts<T extends object, const K extends (keyof T)[] | readonly (keyof T)[], const O extends K[number] = K[0]>(options: T | boolean | undefined, opts: K, boolOpt: O = opts[0] as O, result = {} as T): T & { [P in O]-?: T[P] } {\r\n return Object.assign(result, \"boolean\" === typeof options ? { [boolOpt]: options } : options), result as T & { [P in O]-?: T[P] };\r\n}\r\n\r\n// Merging & Traversal\r\n\r\nexport interface FanoutOptionsTuple extends Partial<Record<(typeof fanoutOptsArr)[number], any>> {\r\n /** Whether to merge values before fanout, useful for patching usecases. @default `false`. */\r\n merge?: boolean;\r\n /** How many levels to fan out, set based on your listener paths max dots. `true` is `Infinity`. @default `1` for event cascading otherwise `Infinity`. */\r\n depth?: number | boolean;\r\n /** Whether to assign arrays as a whole and only touch `.length` for common cases. Only works with the `path` parameter overload or in nested levels.\r\n * Arrays can lead to unnecessary work as more often than not, you won't be watching index paths but waiting on the parent bubble instead.\r\n * If you happen to be watching, it might be more optimal to re-set it yourself if it's only a few indexes or just set this to `false`. @default `true` */\r\n atomic?: boolean;\r\n /** Whether to skip `undefined` values during fanout. @default `false`. */\r\n skipUndef?: boolean;\r\n /** Whether to clone before setting any final values, prevents unintended reference sharing across the state tree. @default `false`. */\r\n cloneSets?: boolean;\r\n /** A label for the transaction that will be started, useful for debugging and tracking. @default `Fanout -> \"${path}\"` : `Fanout`} (Tx ${CTX.txId})`. */\r\n txLabel?: string;\r\n}\r\n/**\r\n * Unified expansion utility.\r\n * Bridges Coarse (Immutable replacement) writes into Fine-grained (Reactive) writes by surgically\r\n * expanding a single object write into multiple granular child operations for deep optimal bubbling.\r\n * @example\r\n * // Event Mode (Cascading after-write)\r\n * rtr.on(\"user\", (e) => fanout(e, { depth: 1 })); // defaults to 1 level deep for events\r\n * @example\r\n * // Direct Mode (Patching before-write)\r\n * fanout(state.user, { session: { id: 1, name: \"Kosi\", role: \"admin\" } }, { depth: Infinity }); // default to `Infinity` here\r\n */\r\nexport function fanout<T extends object>(target: T, value?: Partial<T> | Partial<Pure<T>> | DeepPartial<T> | DeepPartial<Pure<T>>, options?: { crossRealms?: boolean } & FanoutOptionsTuple): void;\r\nexport function fanout<T extends object>(event: ReactorEvent<T> | Payload<T>, options?: { crossRealms?: boolean } & FanoutOptionsTuple): void;\r\nexport function fanout<T extends object, P extends WildPaths<T> = WildPaths<T>>(state: T, path: P, value: Partial<PathValue<T, P>> | DeepPartial<PathValue<T, P>>, options?: { crossRealms?: boolean } & FanoutOptionsTuple): void;\r\nexport function fanout(a: any, b?: any, c?: any, d?: any): void {\r\n const isEvPd = !!a?.target,\r\n isPath = !isEvPd && \"string\" === typeof b,\r\n [state, path, olds, news, opts, type] = isEvPd ? [a.root, a.currentTarget.path, a.currentTarget.oldValue, a.currentTarget.value, b || NIL, a.type] : isPath ? [a, b, getPath(a, b), c, d || NIL, undefined] : [undefined, undefined, a, b || a, c || NIL, undefined],\r\n target = isEvPd ? getPath(a.root, a.currentTarget.path) : isPath ? getPath(state, path) : olds; // to avoid stale refs during write-walk\r\n if ((isEvPd && type !== \"set\" && type !== \"delete\") || !target || !canHandle(news, opts)) return;\r\n const { merge = false, depth, atomic = true, skipUndef = false, cloneSets = false, txLabel } = opts;\r\n const func = () => {\r\n const walk = (target: any, obj: any, depth = isEvPd ? 1 : Infinity, keys = Object.keys(obj)) => {\r\n for (let i = 0, len = keys.length; i < len; i++) {\r\n const key = keys[i],\r\n val = obj[key];\r\n try {\r\n if (atomic && Array.isArray(val)) (target[key] = cloneSets ? deepClone(val) : val), (target[key].length = target[key].length); // ping commoners\r\n else depth > 1 && canHandle(val, opts) ? walk((target[key] ||= Array.isArray(val) ? [] : {}), val, depth - 1) : (!skipUndef || val !== undefined) && (target[key] = cloneSets ? deepClone(val) : val);\r\n } catch (e) {\r\n if (e instanceof RangeError) throw e; // internals can skip, not users\r\n } // call a spade a spade and just skip, no descriptor gymanstics\r\n }\r\n };\r\n if (atomic && Array.isArray(news) && isPath) setPath(state, path, cloneSets ? deepClone(news) : news), (getPath(state, path).length = news.length); // ping commoners\r\n else walk(target, merge ? mergeObjs(olds, news, opts) : news, depth === true ? Infinity : depth);\r\n };\r\n force(() => transaction(func, txLabel ?? `${path ? `Fanout -> '${path}'` : `Fanout`} (Tx ${txId + 1})`), CTX.usingForce || isEvPd); // if event or payload, already written values can bypass equality checks\r\n}\r\nexport const fanoutOptsArr = [\"merge\", \"depth\", \"atomic\", \"skipUndef\"] as const;\r\n\r\n/**\r\n * Executes a task while forcing all reactive writes to bypass equality checks.\r\n * @param task The mutation logic to execute.\r\n * @param bool Override for ease of use in dynamic usecases, defaults to `true`\r\n * @returns The result of the task.\r\n */\r\nexport function force<T>(task: () => T, bool = true): T {\r\n const prev = CTX.usingForce;\r\n CTX.usingForce = bool;\r\n try {\r\n return task();\r\n } finally {\r\n CTX.usingForce = prev;\r\n }\r\n}\r\n\r\n/**\r\n * Deep-merges object-like values, does necessary checks so use without doubts. Only `o2` keys are checked when `skipUndef` is true.\r\n * @example\r\n * const next = mergeObjs({ user: { name: \"Kosi\" } }, { user: { role: \"admin\" } }); // { ...o1, ...o2 } // o2 over o1 and deep!\r\n */\r\nexport function mergeObjs<T1 extends object, T2 extends object>(o1?: T1 | null, o2?: T2 | null, config?: { crossRealms?: boolean; skipUndef?: boolean }, pojocheck?: boolean): DeepMerge<T1, T2>;\r\nexport function mergeObjs(o1?: any, o2?: any, config = NIL, pojocheck = true): any {\r\n if (pojocheck && (!isPOJO(o1 || NIL, config) || !isPOJO(o2 || NIL, config))) return o2;\r\n (o1 ||= {}), (o2 ||= {});\r\n const merged = config.skipUndef ? { ...o1 } : { ...o1, ...o2 };\r\n if (config.skipUndef) {\r\n const keys = Object.keys(o1);\r\n for (let i = 0, len = keys.length; i < len; i++) {\r\n const key = keys[i],\r\n val = o2[key];\r\n if (val !== undefined) merged[key] = val;\r\n }\r\n }\r\n const keys = Object.keys(merged);\r\n for (let i = 0, len = keys.length; i < len; i++) {\r\n const key = keys[i],\r\n o1V = o1[key],\r\n o2V = o2[key];\r\n if (isPOJO(o1V, config) && isPOJO(o2V, config)) merged[key] = mergeObjs(o1V, o2V, config, false); // fewer writes is less costly here\r\n }\r\n return merged;\r\n}\r\n\r\n/** Returns [path, parent, value] records from root to the target path. */\r\nexport function getTrailRecords<T extends object>(obj: T, path: WildPaths<T>, reverse = false): [WildPaths<T>, PathBranchValue<T, WildPaths<T>>, PathValue<T, WildPaths<T>>][] {\r\n const parts = path.split(\".\"),\r\n chain: ReturnType<typeof getTrailRecords<T>> = [[\"*\", obj, obj]];\r\n for (let acc = \"\", currObj: any = obj, i = 0, len = parts.length; i < len; i++) {\r\n const part = parts[i];\r\n chain.push([(acc += (i ? \".\" : \"\") + part) as WildPaths<T>, currObj, (currObj = currObj?.[part])]); // one iteration per depth, one-time storage over rcurrent derivation\r\n }\r\n return reverse ? chain.reverse() : chain;\r\n}\r\n\r\n// Cloning\r\n\r\n/**\r\n * Deep-clones supported object structures.\r\n * @example\r\n * const cloned = deepClone({ user: { name: \"Kosi\" } });\r\n */\r\nexport function deepClone<T>(obj: T, config: { crossRealms?: boolean; preserveContext?: boolean } = CTX.defaults, seen = new WeakMap()): T {\r\n if (!obj || \"object\" !== typeof obj) return obj;\r\n const cloned = seen.get(obj);\r\n if (cloned) return cloned;\r\n if (!canHandle(obj, config, false)) return obj; // no circular references\r\n const clone: any = config.preserveContext ? Object.create(Object.getPrototypeOf(obj)) : Array.isArray(obj) ? [] : {};\r\n seen.set(obj, clone);\r\n const keys = config.preserveContext ? Reflect.ownKeys(obj) : Object.keys(obj);\r\n for (let i = 0, len = keys.length; i < len; i++) {\r\n const key = keys[i];\r\n try {\r\n clone[key] = deepClone((obj as any)[key], config, seen);\r\n } catch (e) {\r\n if (e instanceof RangeError) throw e; // internals can skip, not users\r\n } // call a spade a spade and just skip, no descriptor gymanstics\r\n }\r\n return clone;\r\n} // POJO|Arr|Dynamic Deep cloner\r\n\r\n// Destruction\r\n\r\n/** Nulls all non-function instance properties across the prototype chain. */\r\nexport function nuke(target: any): void {\r\n const keys = Object.keys(target);\r\n for (let i = 0, len = keys.length; i < len; i++) {\r\n const key = keys[i];\r\n if (\"function\" !== typeof target[key]) target[key] = null;\r\n }\r\n}\r\n\r\n// Metadata Operations\r\n\r\n/**\r\n * Allows extending the context payload of a `Reactor` operation with custom meta properties for the duration of a function execution.\r\n * Temporarily merges provided meta into `CTX.meta` for the duration of `fn`. Restores the previous meta object after `fn` completes (even on `throw`).\r\n * @param props Meta properties to merge into the current context.\r\n */\r\nexport function withMeta<T>(props: ReactorMeta, fn: () => T): T {\r\n CTX.meta ??= {};\r\n const cache: Record<string, any> = {};\r\n for (const key of Object.keys(props)) {\r\n cache[key] = (CTX.meta as any)[key];\r\n (CTX.meta as any)[key] = (props as any)[key];\r\n }\r\n try {\r\n return fn();\r\n } finally {\r\n for (const key of Object.keys(cache)) {\r\n if (cache[key] === undefined) resetMeta(key as any);\r\n else (CTX.meta as any)![key] = cache[key];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Resets a specific property in the global context meta and nullifies it if empty to stay on the fast path.\r\n * @param key The key of the meta property to be deleted before nullifying.\r\n */\r\nexport function resetMeta(key: keyof ReactorMeta) {\r\n if (!CTX.meta) return;\r\n delete CTX.meta[key];\r\n for (const _ in CTX.meta) return;\r\n CTX.meta = null;\r\n}\r\n\r\n/**\r\n * The Master Path Engine: Single-pass, zero-allocation DFS tree extraction. Perfectly mirrors the TS `Paths` and `ChildPaths` generics.\r\n * - Root paths: `getPaths(store)`\r\n * - Child paths: `getPaths(store, \"settings.audio\")`\r\n * - Next words (typeahead): `getPaths(store, \"settings\", { depth: 1 })`\r\n */\r\nexport function getPaths<T extends object, const S extends string = \".\", P extends WildPaths<T, S> = \"*\", D extends number = MaxDepth, L extends boolean = false>(obj: T, path: P = \"*\" as P, config: { depth?: D; separator?: S; leavesOnly?: L } & typeof CTX.defaults = CTX.defaults as any): (P extends \"*\" ? Paths<T, S, D, L> : ChildPaths<T, P, S, D, L>)[] {\r\n const target = path === \"*\" ? obj : getPath(obj, path as any, config.separator as S),\r\n result: string[] = [],\r\n seen = new Set<any>();\r\n if (!canHandle(target, config)) return result as any;\r\n const walk = (curr: any, currPath: string, depth: number) => {\r\n if (seen.has(curr) || depth >= (config.depth ?? 18)) return;\r\n seen.add(curr);\r\n const keys = config.preserveContext ? Reflect.ownKeys(curr) : Object.keys(curr);\r\n for (let i = 0, len = keys.length; i < len; i++) {\r\n const key = String(keys[i]),\r\n val = (curr as any)[key],\r\n newPath = currPath ? `${currPath}${config.separator || \".\"}${key}` : key,\r\n isNode = canHandle(val, config);\r\n if (!config.leavesOnly || !isNode) result.push(newPath);\r\n try {\r\n isNode && walk(val, newPath, depth + 1);\r\n } catch (e) {\r\n if (e instanceof RangeError) throw e;\r\n }\r\n }\r\n seen.delete(curr); // Backtrack: allow identical object refs across different branches\r\n }; // Inline closure maintains state; prepends the exact parent path during the first pass.\r\n return walk(target, path === \"*\" ? \"\" : path, 0), result as any; // If path is passed, it acts as the initial string prefix for the sub-tree walk.\r\n}\r\n\r\n/** Quick boolean check to see if a path resolves to a final/inert value (Command Execution Gate). */\r\nexport function isLeafPath<T extends object, const S extends string = \".\", P extends WildPaths<T, S> = WildPaths<T, S>>(obj: T, path: P, config: { separator?: S } & typeof CTX.defaults = CTX.defaults, value = getPath(obj, path, config.separator)): boolean {\r\n return path !== \"*\" && !canHandle(value, config);\r\n}\r\n\r\n/**\r\n * Creates a two-way, array-atomic, echo-proof sync bridge between two S.I.A Reactors. Uses a synchronous origin lock to prevent infinite echo loops.\r\n * On setup, `rA` hydrates `rB` at `prefixB` with a deep clone of its current state at `prefixA` (primary drives initial truth).\r\n * @param rA Primary reactor — source of truth. Its `prefixA` slice seeds `rB.prefixB` on setup.\r\n * @param rB Secondary reactor — the wider store (e.g. `ctlr.config`). Holds the primary at a named path.\r\n * @param prefixA Path prefix on `rA` to watch and translate. Use `\"\"` for root.\r\n * @param prefixB Path on `rB` that maps to `rA`. Defaults to `\"\"` (root).\r\n * @param signal Optional `AbortSignal` to tear down both watchers automatically.\r\n * @returns Cleanup function that removes both watchers.\r\n * @example\r\n * const unsync = createReactorSync(module.config, ctlr.config, \"\", \"settings.persist\", signal); // module.config root <-> ctlr.config.settings.persist\r\n * @example\r\n * const unsync = createReactorSync(timeline.config, ctlr.config, \"\", \"settings.controlPanel.timeline\"); // timeline.config root <-> ctlr.config.settings.controlPanel.timeline\r\n * unsync(); // or let signal do it\r\n */\r\nexport function createReactorSync(rA: Reactor<any> | object, rB: Reactor<any> | object, prefixA: string, prefixB = \"\", signal?: AbortSignal): () => void {\r\n const rtrA = getReactor(rA, true),\r\n rtrB = getReactor(rB, true);\r\n let origin: 0 | 1 | null = null; // 0 = A fired, 1 = B fired\r\n const sync = (src: 0 | 1, dest: any, srcP: string, destP: string) => (val: any, payload: Payload<any, \"*\">) => {\r\n if (origin === (src ^ 1)) return; // echo guard\r\n const { path, object: obj, key } = payload.target;\r\n if (srcP && path !== srcP && !path.startsWith(srcP + \".\")) return; // boundary check\r\n const isArr = Array.isArray(obj),\r\n origP = isArr ? path.slice(0, -((key as string).length + 1)) : path, // Array trap: forward the whole array instead of an index-keyed object\r\n syncP = origP === srcP ? \"\" : srcP ? origP.slice(srcP.length + 1) : origP;\r\n (origin = src), setPath(dest, (destP ? (syncP ? `${destP}.${syncP}` : destP) : syncP || \"*\") as any, isArr ? deepClone(obj) : val), (origin = null);\r\n };\r\n const initA = prefixA ? getPath(rtrA.core, prefixA as any) : rtrA.core; // primary hydrates secondary on setup\r\n if (initA !== undefined) fanout(rtrB.core, (prefixB || \"*\") as any, initA, { depth: 1, cloneSets: true, txLabel: `ReactorSync: ${prefixA}^ <-> ${prefixB}` });\r\n const clupA = rtrA.watch(\"*\", sync(0, rtrB.core, prefixA, prefixB), { signal }),\r\n clupB = rtrB.watch(\"*\", sync(1, rtrA.core, prefixB, prefixA), { signal });\r\n return () => (clupA(), clupB());\r\n}\r\n","import type { Payload } from \"@defs/reactor\";\r\nimport type { WildPaths } from \"@defs/obj\";\r\nimport { getTrailRecords } from \"@utils/obj\";\r\n\r\n// ===========================================================================\r\n// The S.I.A (State & Intent Architecture) `Event`\r\n// ===========================================================================\r\n\r\n/**\r\n * - Runtime event payload used by Reactor listener waves.\r\n * - Tracks phase and current path context during propagation, mimics native `Event` API.\r\n * Exposes intent controls (`resolve`/`reject`), propagation controls, and `composedPath()`.\r\n * @typeParam T Root state object type.\r\n * @typeParam P Target path type.\r\n */\r\nexport class ReactorEvent<T extends object, P extends WildPaths<T> = WildPaths<T>> {\r\n /** No active propagation phase. */\r\n public static readonly NONE = 0;\r\n /** Capture phase: root to target parent. */\r\n public static readonly CAPTURING_PHASE = 1;\r\n /** Target phase: target listeners run. */\r\n public static readonly AT_TARGET = 2;\r\n /** Bubble phase: target parent to root. */\r\n public static readonly BUBBLING_PHASE = 3;\r\n /** Current propagation phase for this event instance. */\r\n public eventPhase = ReactorEvent.NONE;\r\n /** Current event type for the active propagation path, use immediately if async */\r\n public type!: Payload<T, P>[\"type\"];\r\n\r\n public currentTarget!: Payload<T, P>[\"currentTarget\"]; /** Current target context for the active propagation path, use immediately if async. Also survives future shape changes from nesting for a path callback. */\r\n public readonly target!: Payload<T, P>[\"target\"]; /** Original event target context. */\r\n public readonly root!: Payload<T, P>[\"root\"]; /** Root reactive object for this event instance wave. */\r\n public readonly reactor!: Payload<T, P>[\"reactor\"]; /** The `Reactor` instance that dispatched this event instance. */\r\n /** Whether resolve/reject intent semantics are allowed for this event instance. */\r\n public readonly rejectable!: boolean;\r\n /** Original event type before propagation remapping. */\r\n public readonly staticType: Exclude<Payload<T, P>[\"type\"], \"update\">;\r\n public readonly path: Payload<T, P>[\"target\"][\"path\"]; /** Original target path for this event instance wave. */\r\n public readonly value: Payload<T, P>[\"target\"][\"value\"]; /** Current value at the event target path. */\r\n public readonly oldValue: Payload<T, P>[\"target\"][\"oldValue\"]; /** Previous value at the event target path. */\r\n /** Whether this event instance wave can bubble back up to ancestors or just capture down. */\r\n public readonly bubbles: boolean = false;\r\n /** Whether this event instance wave can capture down to descendants or just bubble up. */\r\n public readonly captures: boolean = false;\r\n /** `DOMHighResTimeStamp` for this event payload for native event parity, Enable `eventTimeStamps` config, then use this over custom timestamps for accuracy. */\r\n public readonly timestamp?: number;\r\n protected _resolved = \"\";\r\n protected _rejected = \"\";\r\n protected _propagationStopped = false;\r\n protected _immediatePropagationStopped = false;\r\n\r\n /**\r\n * @param payload Source payload for this event instance.\r\n * @param reactor The `Reactor` instance creating this event instance.\r\n */\r\n constructor(payload: Payload<T, P>) {\r\n Object.assign(this, payload);\r\n this.staticType = payload.type as ReactorEvent<T, P>[\"staticType\"];\r\n this.path = payload.target.path;\r\n this.value = payload.target.value;\r\n this.oldValue = payload.target.oldValue;\r\n if (this.reactor.config.eventBubbling) this.bubbles = true;\r\n if (this.reactor.config.eventCapturing === \"auto\" ? this.rejectable : this.reactor.config.eventCapturing) this.captures = true;\r\n if (this.reactor.config.eventTimeStamps) this.timestamp = performance.now();\r\n }\r\n\r\n /** Whether propagation has been stopped. */\r\n public get propagationStopped(): boolean {\r\n return this._propagationStopped;\r\n }\r\n /** Stops propagation to remaining listeners in later nodes/phases. */\r\n public stopPropagation(): void {\r\n this._propagationStopped = true;\r\n }\r\n /** Whether immediate propagation has been stopped. */\r\n public get immediatePropagationStopped(): boolean {\r\n return this._immediatePropagationStopped;\r\n }\r\n /** Stops propagation immediately, including remaining listeners on current path. */\r\n public stopImmediatePropagation(): void {\r\n this._propagationStopped = true;\r\n this._immediatePropagationStopped = true;\r\n }\r\n\r\n /** Resolution message for rejectable events. */\r\n public get resolved(): string {\r\n return this._resolved;\r\n }\r\n /**\r\n * Marks a rejectable event as resolved.\r\n * @param message Optional resolution message or identity.\r\n * @example e.resolve(\"html5Tech\"); // identity\r\n * @example e.resolve(\"API Load successful\"); // message\r\n */\r\n public resolve(message?: string): void {\r\n if (!this.rejectable) return this.reactor.log(`[ReactorEvent] Ignored \\`resolve()\\` call on a non-rejectable ${this.staticType} at \"${this.path}\"`);\r\n if (this.eventPhase !== ReactorEvent.CAPTURING_PHASE) this.reactor.log(`[ReactorEvent] Resolving an intent on ${this.staticType} at \"${this.path}\" outside of the capture phase is unadvised.`);\r\n if (this.rejectable) this.reactor.log(`[ReactorEvent] ${(this._resolved = message || `${this.staticType} intent resolved at \"${this.path}\"`)}`);\r\n }\r\n /** Rejection reason for rejectable events. */\r\n public get rejected(): string {\r\n return this._rejected;\r\n }\r\n /**\r\n * Marks a rejectable event as rejected.\r\n * @param reason Optional rejection reason or identity.\r\n * @example e.reject(\"html5Tech\"); // identity\r\n * @example e.reject(\"User is not logged in\"); // reason\r\n */\r\n public reject(reason?: string): void {\r\n if (!this.rejectable) return this.reactor.log(`[ReactorEvent] Ignored \\`reject()\\` call on a non-rejectable ${this.staticType} at \"${this.path}\"`);\r\n if (this.eventPhase !== ReactorEvent.CAPTURING_PHASE) this.reactor.log(`[ReactorEvent] Rejecting an intent on ${this.staticType} at \"${this.path}\" outside of the capture phase is unadvised.`);\r\n if (this.rejectable) this.reactor.log(`[ReactorEvent] ${(this._rejected = reason || `${this.staticType} intent rejected at \"${this.path}\"`)}`);\r\n }\r\n\r\n /** Returns event path values from target to root in bubbling order. */\r\n public composedPath() {\r\n return getTrailRecords<T>(this.root, this.path as WildPaths<T>, true).map((r) => r[2]); // values reversed to mimic bubbling\r\n }\r\n}\r\n","import { CTX, RAW, INERTIA, REJECTABLE, INDIFFABLE, TERMINATOR, VERSION, SSVERSION, NOOP, RTR_LOG, EVT_OPTS } from \"./consts\";\r\nimport { ReactorEvent } from \"./event\";\r\nimport type { REvent, Target, Payload, Getter, Setter, Deleter, Watcher, Listener, ListenerOptions, ListenerRecord, WatcherRecord, GetterRecord, SetterRecord, DeleterRecord, SyncOptions, ReactorBuild } from \"@defs/reactor\";\r\nimport type { PathBranchValue, Paths, PathKey, PathValue, WildPaths, MaxDepth } from \"@defs/obj\";\r\nimport { canHandle, getTrailRecords, parseEvtOpts, hasPath, getPath, setPath, deletePath, getDepth, force, nuke } from \"@utils/obj\";\r\nimport { BaseReactorModule as ReactorModule, ReactorModuleId } from \"@modules/base\";\r\n\r\n/*\r\n * ========= THE S.I.A (State & Intent Architecture) `Reactor` CODE PATTERN WATCHLIST =========\r\n * 1. non-stack loops & multiple optimizations, this is surgical work on the root of reactivity\r\n * 2. used cached loop lengths to optimize b4 JIT Compiler does for optimal speed throughput,\r\n * avoided myth of reverse while loops so new CPU's don't waste memory on a forward l1 Cache miss\r\n * 3. moved any logic involving `?.` or `??` outside repetitions to not accumulate the ~5x slowdown\r\n * 4. `?.` in cases where only other option was `&&` | `||` cuz `?.` benchmarks were a bit faster\r\n * 5. adopted nooping strategy since JIT compiler makes it up to 2x faster than other alternatives\r\n * 6. no unorthodox string deduplication or caching since string interning is now native to JS\r\n * 7. it's all progressive: light at creation then grows during the use of all desired features\r\n * 8. Reflect API was avoided, incurs an ~8x slowdown; mediation layer is even powerful enough\r\n * 9. Core's Class Syntax over global functional closures for instance's lighter memory footprint\r\n * 10. Avoided object pooling since V8 excels at generational GC for short-lived payloads so no\r\n * \"Stop the World\"s. Also no need for wasted recurrent logic, serialize or forget about payloads.\r\n * 11. Array slicing had to be used in listener loops since unsubscribing is also user-controlled.\r\n * * With all this, the right has now been earned to run on your hot path; sit back and relax :)\r\n */\r\n\r\n// ===========================================================================\r\n// The S.I.A (State & Intent Architecture) `Reactor`\r\n// ===========================================================================\r\n\r\n/**\r\n * - Core S.I.A runtime for path mediation, observation, and event propagation.\r\n * - Provides path-level mediators (`get|set|delete`), synchronous watchers (`watch`), and batched listeners (`on`).\r\n * Supports wildcard/path-based subscriptions, optional reference tracking, and module-based extensions.\r\n * @typeParam T Root state object type.\r\n */\r\nexport class Reactor<T extends object> {\r\n /** Logger function for this reactor instance, override if desired, `this.canLog = false` resets. */\r\n public log: (...args: any[]) => void = NOOP;\r\n /** The core state object for this reactor instance. */\r\n public core: T; // `?:`s | pay the ~800 byte price upfront for what u might never use\r\n /** The modules being used by this reactor. */\r\n public modules?: Set<ReactorModule<T>>;\r\n /** Configuration options for this reactor instance. */\r\n public config: Omit<ReactorBuild<T>, \"debug\">;\r\n /** Whether this reactor instance is currently batching updates, a window view into the engine timing */\r\n public isBatching = false; // Async Batching\r\n protected queue?: Set<() => void>; // Tasks to run after flush\r\n protected batch?: Map<Paths<T>, Payload<T>>; // Batched payloads to flush async\r\n protected lineage?: WeakMap<object, (object | string)[]>; // { parent, key }: uses maths to avoid extra allocations for pairs\r\n protected snapCache?: WeakMap<object, any>;\r\n protected proxyCache = new WeakMap<object, any>();\r\n protected getters?: Map<WildPaths<T>, Array<GetterRecord<T>>>;\r\n protected setters?: Map<WildPaths<T>, Array<SetterRecord<T>>>;\r\n protected deleters?: Map<WildPaths<T>, Array<DeleterRecord<T>>>;\r\n protected watchers?: Map<WildPaths<T>, Array<WatcherRecord<T>>>;\r\n protected listeners?: Map<WildPaths<T>, Array<ListenerRecord<T>>>;\r\n\r\n /**\r\n * Creates a new Reactor instance.\r\n * @param target Initial state target.\r\n * @param build Reactor bootstrap/build configuration.\r\n * @example\r\n * const rtr = new Reactor({ count: 0 });\r\n */\r\n constructor(target: T = {} as T, build?: ReactorBuild<T>) {\r\n (this as any)[INERTIA] = true;\r\n this.config = { ...CTX.defaults, ...build };\r\n this.core = this.proxied(target);\r\n if (build) this.canLog = !!build.debug;\r\n }\r\n\r\n public proxied<O extends object>(target: O, rejectable = false, indiffable = false, parent?: object, key?: string, path?: string): O {\r\n if (!target || \"object\" !== typeof target) return target;\r\n target = (target as any)[RAW] || target; // prevents nested proxies\r\n if (this.config.referenceTracking && parent && key && !this.link(target, parent, key, false)) return target; // already checked types above\r\n const cached = this.proxyCache.get(target);\r\n if (cached) return cached;\r\n if (!canHandle(target, this.config, false)) return target; // handles unless inert, // did light type check for `[Symbol]` so `false` to strictObj typecheck param\r\n rejectable ||= (target as any)[REJECTABLE];\r\n indiffable ||= (target as any)[INDIFFABLE];\r\n const proxy = new Proxy(target, {\r\n // Robust Proxy handler\r\n get: (object, key, receiver) => {\r\n if (key === RAW) return this.log(`👀 [\\`get\\` Trap] Peeked at ${object}`), object;\r\n let value = !this.config.preserveContext ? (object as any)[key] : Reflect.get(object, key, receiver);\r\n const keyStr = String(key),\r\n fullPath = (path ? path + \".\" + keyStr : keyStr) as Paths<T>,\r\n paths = this.config.lineageTracing ? this.trace(object, keyStr) : fullPath;\r\n this.log(`🔍 [\\`get\\` Trap] Initiated for \"${keyStr}\" on [${paths}]`), CTX.autotracker?.track(fullPath, this);\r\n if (this.config.get) value = this.config.get(object as PathBranchValue<T>, key as PathKey<T>, value, receiver, paths);\r\n if (this.getters) {\r\n const wildcords = this.getters.get(\"*\"); // wild cords\r\n for (let i = 0, len = this.config.lineageTracing ? paths.length : 1; i < len; i++) {\r\n const currPath = (this.config.lineageTracing ? paths[i] : fullPath) as Paths<T>,\r\n cords = this.getters.get(currPath);\r\n if (!cords && !wildcords) continue;\r\n const target: Target<T> = { path: currPath, value, key: keyStr as PathKey<T>, hadKey: true, object: receiver },\r\n payload = { type: \"get\", target, currentTarget: target, root: this.core, reactor: this, rejectable, ...CTX.meta } as Payload<T, Paths<T>>;\r\n if (cords) value = this.mediate(currPath, payload, \"get\", cords);\r\n if (!wildcords) continue;\r\n target.value = value;\r\n value = this.mediate(\"*\", payload, \"get\", wildcords);\r\n } // Mediators\r\n }\r\n return this.proxied(value, rejectable, indiffable, object, keyStr, fullPath);\r\n },\r\n set: (object, key, value, receiver) => {\r\n let unchanged,\r\n safeValue,\r\n safeOldValue,\r\n terminated = false;\r\n const keyStr = String(key),\r\n fullPath = (path ? path + \".\" + keyStr : keyStr) as Paths<T>,\r\n paths = this.config.lineageTracing ? this.trace(object, keyStr) : fullPath,\r\n loopLen = this.config.lineageTracing ? paths.length : 1,\r\n oldValue = !this.config.preserveContext ? (object as any)[key] : Reflect.get(object, key, receiver),\r\n hadKey = !this.config.preserveContext ? key in object : Reflect.has(object, key);\r\n this.log(`✏️ [\\`set\\` Trap] Initiated for \"${keyStr}\" on [${paths}]`), CTX.autotracker?.track(fullPath, this, true);\r\n if (this.config.referenceTracking || !indiffable) {\r\n safeOldValue = oldValue?.[RAW] || oldValue;\r\n safeValue = value?.[RAW] || value;\r\n unchanged = this.config.equalityFunction!(safeValue, safeOldValue);\r\n }\r\n if (!indiffable && unchanged && !CTX.usingForce && keyStr !== \"length\") return this.log(`🔄 [\\`set\\` Trap] Unchanged for \"${keyStr}\" on [${paths}]`), true; // Arrays silently update length before firing set trap, can't risk UI going blind\r\n if (this.config.set) terminated = (value = this.config.set(object as PathBranchValue<T>, key as PathKey<T>, value, oldValue, receiver, paths)) === TERMINATOR;\r\n if (this.setters) {\r\n const wildcords = this.setters.get(\"*\");\r\n for (let i = 0; i < loopLen; i++) {\r\n const currPath = (this.config.lineageTracing ? paths[i] : fullPath) as Paths<T>,\r\n cords = this.setters.get(currPath);\r\n if (!cords && !wildcords) continue;\r\n const target: Target<T> = { path: currPath, value, oldValue, key: keyStr as PathKey<T>, hadKey, object: receiver },\r\n payload = { type: \"set\", target, currentTarget: target, root: this.core, reactor: this, terminated, rejectable, ...CTX.meta } as Payload<T, Paths<T>>;\r\n if (cords) {\r\n const result = this.mediate(currPath, payload, \"set\", cords);\r\n if (!(terminated ||= payload.terminated!)) value = result;\r\n }\r\n if (!wildcords) continue;\r\n target.value = value;\r\n const result = this.mediate(\"*\", payload, \"set\", wildcords);\r\n if (!(terminated ||= payload.terminated!)) value = result;\r\n } // Mediators\r\n }\r\n if (terminated) return this.log(`🛡️ [\\`set\\` Trap] Terminated for \"${keyStr}\" on [${paths}]`), true; // soft rejection if terminated\r\n const success = !this.config.preserveContext ? (((object as any)[key] = value), true) : Reflect.set(object, key, value, receiver);\r\n if (!success) return this.log(`❌ [\\`set\\` Trap] Failed for \"${keyStr}\" on [${paths}]`), false; // hard rejection if failed\r\n if (this.config.referenceTracking && !unchanged) this.config.smartCloning && this.stamp(object), (this.unlink(safeOldValue, object, keyStr), this.link(safeValue, object, keyStr));\r\n if (this.watchers || this.listeners)\r\n for (let i = 0; i < loopLen; i++) {\r\n const currPath = (this.config.lineageTracing ? paths[i] : fullPath) as Paths<T>,\r\n target: Target<T> = { path: currPath, value, oldValue, key: keyStr as PathKey<T>, hadKey, object: receiver };\r\n this.notify(currPath, { type: \"set\", target, currentTarget: target, root: this.core, reactor: this, terminated, rejectable, ...CTX.meta } as Payload<T, Paths<T>>);\r\n } // Listeners\r\n return true;\r\n },\r\n deleteProperty: (object, key) => {\r\n let value: any,\r\n receiver = this.proxyCache.get(object),\r\n terminated = false;\r\n const keyStr = String(key),\r\n fullPath = (path ? path + \".\" + keyStr : keyStr) as Paths<T>,\r\n paths = this.config.lineageTracing ? this.trace(object, keyStr) : fullPath,\r\n loopLen = this.config.lineageTracing ? paths.length : 1,\r\n oldValue = !this.config.preserveContext ? (object as any)[key] : Reflect.get(object, key, receiver),\r\n hadKey = !this.config.preserveContext ? key in object : Reflect.has(object, key);\r\n this.log(`🗑️ [\\`deleteProperty\\` Trap] Initiated for \"${keyStr}\" on [${paths}]`), CTX.autotracker?.track(fullPath, this, true);\r\n if (this.config.deleteProperty) terminated = (value = this.config.deleteProperty(object as PathBranchValue<T>, key as PathKey<T>, oldValue, receiver, paths)) === TERMINATOR;\r\n if (this.deleters) {\r\n const wildcords = this.deleters.get(\"*\");\r\n for (let i = 0; i < loopLen; i++) {\r\n const currPath = (this.config.lineageTracing ? paths[i] : fullPath) as Paths<T>,\r\n cords = this.deleters.get(currPath);\r\n if (!cords && !wildcords) continue;\r\n const target: Target<T> = { path: currPath, value, oldValue, key: keyStr as PathKey<T>, hadKey, object: receiver },\r\n payload = { type: \"delete\", target, currentTarget: target, root: this.core, reactor: this, rejectable, ...CTX.meta } as Payload<T, Paths<T>>;\r\n if (cords) {\r\n const result = this.mediate(currPath, payload, \"delete\", cords);\r\n if (!(terminated ||= payload.terminated!)) value = result;\r\n }\r\n if (!wildcords) continue;\r\n const result = this.mediate(\"*\", payload, \"delete\", wildcords);\r\n if (!(terminated ||= payload.terminated!)) value = result;\r\n } // Mediators\r\n }\r\n if (terminated) return this.log(`🛡️ [\\`deleteProperty\\` Trap] Terminated for \"${keyStr}\" on [${paths}]`), true; // soft rejection if terminated\r\n const success = !this.config.preserveContext ? delete (object as any)[key] : Reflect.deleteProperty(object, key);\r\n if (!success) return this.log(`❌ [\\`deleteProperty\\` Trap] Failed for \"${keyStr}\" on [${paths}]`), false; // hard rejection if failed\r\n if (this.config.referenceTracking) this.config.smartCloning && this.stamp(object), this.unlink(oldValue?.[RAW] || oldValue, object, keyStr);\r\n if (this.watchers || this.listeners)\r\n for (let i = 0; i < loopLen; i++) {\r\n const currPath = (this.config.lineageTracing ? paths[i] : fullPath) as Paths<T>,\r\n target: Target<T> = { path: currPath, value, oldValue, key: keyStr as PathKey<T>, hadKey, object: receiver };\r\n this.notify(currPath, { type: \"delete\", target, currentTarget: target, root: this.core, reactor: this, rejectable, ...CTX.meta } as Payload<T, Paths<T>>);\r\n } // Listeners\r\n return true;\r\n },\r\n has: (object, key) => {\r\n let has = !this.config.preserveContext ? key in object : Reflect.has(object, key);\r\n const keyStr = String(key),\r\n fullPath = (path ? path + \".\" + keyStr : keyStr) as Paths<T>;\r\n this.log(`❓ [\\`has\\` Trap] Initiated for \"${keyStr}\" on '${fullPath}'`), CTX.autotracker?.track(fullPath, this);\r\n if (this.config.has) has = this.config.has(object as PathBranchValue<T>, key as PathKey<T>, has, this.proxyCache.get(object), fullPath);\r\n return has;\r\n },\r\n getOwnPropertyDescriptor: (object, key) => {\r\n let descriptor = !this.config.preserveContext ? Object.getOwnPropertyDescriptor(object, key) : Reflect.getOwnPropertyDescriptor(object, key);\r\n const keyStr = String(key),\r\n fullPath = (path ? path + \".\" + keyStr : keyStr) as Paths<T>;\r\n this.log(`📋 [\\`getOwnPropertyDescriptor\\` Trap] Initiated for \"${keyStr}\" on '${fullPath}'`), CTX.autotracker?.track(fullPath, this);\r\n if (this.config.getOwnPropertyDescriptor) descriptor = this.config.getOwnPropertyDescriptor(object as PathBranchValue<T>, key as PathKey<T>, descriptor, this.proxyCache.get(object), this.config.lineageTracing ? this.trace(object, keyStr) : fullPath);\r\n return descriptor;\r\n },\r\n ownKeys: (object) => {\r\n let ownKeys = Reflect.ownKeys(object); // no faster accurate way without Reflect API\r\n const safePath = (path || \"*\") as Paths<T>;\r\n this.log(`🔑 [\\`ownKeys\\` Trap] Initiated on \"${safePath}\"`), CTX.autotracker?.track(safePath, this);\r\n if (this.config.ownKeys) ownKeys = this.config.ownKeys(object as PathBranchValue<T>, ownKeys, this.proxyCache.get(object), safePath);\r\n return ownKeys;\r\n },\r\n });\r\n return this.proxyCache.set(target, proxy), proxy;\r\n }\r\n\r\n public trace(target: object, path: string, paths: string[] = [], seen = new WeakSet<object>()): Paths<T>[] {\r\n if (Object.is(target, (this.core as any)[RAW] || this.core)) return paths.push(path), paths as Paths<T>[];\r\n if (seen.has(target)) return paths as Paths<T>[]; // Stop infinite loops\r\n seen.add(target);\r\n const es = (this.lineage ??= new WeakMap()).get(target);\r\n if (!es) return paths as Paths<T>[];\r\n for (let i = 0, len = es.length; i < len; i += 2) {\r\n const prev = es[i + 1];\r\n this.trace(es[i] as object, prev ? prev + \".\" + path : path, paths, seen);\r\n }\r\n return paths as Paths<T>[];\r\n } // won't be called without `.config.referenceTracking` so internal guard avoided\r\n protected link(target: any, parent: object, key: string, typecheck = true, es?: (object | string)[]): boolean {\r\n if (!canHandle(target, this.config, typecheck)) return false;\r\n es = (this.lineage ??= new WeakMap()).get(target) ?? (this.lineage!.set(target, (es = [])), es);\r\n for (let i = 0, len = es.length; i < len; i += 2) if (Object.is(es[i], parent) && es[i + 1] === key) return true;\r\n return es.push(parent, key), true; // es used as a param: needed storage perk\r\n }\r\n protected unlink(target: any, parent: object, key: string): void {\r\n if (!canHandle(target, this.config)) return;\r\n const es = (this.lineage ??= new WeakMap()).get(target);\r\n if (es) for (let i = 0, len = es.length; i < len; i += 2) if (Object.is(es[i], parent) && es[i + 1] === key) return void es.splice(i, 2);\r\n }\r\n protected stamp(target: any, typecheck = true, seen = new WeakSet<object>()): void {\r\n if (typecheck && \"object\" !== typeof target) return;\r\n target = target[RAW] || target; // escape hatch from traps\r\n if (seen.has(target)) return; // Stop infinite loops\r\n seen.add(target);\r\n target[VERSION] = (target[VERSION] || 0) + 1;\r\n const es = (this.lineage ??= new WeakMap()).get(target);\r\n if (es) for (let i = 0, len = es.length; i < len; i += 2) this.stamp(es[i], false, seen); // walk up the tree; stamp parents\r\n }\r\n\r\n public mediate<P extends WildPaths<T>>(path: WildPaths<T>, payload: Payload<T, P>, type: \"get\", cords: GetterRecord<T>[]): PathValue<T, P>;\r\n public mediate<P extends WildPaths<T>>(path: WildPaths<T>, payload: Payload<T, P>, type: \"set\", cords: SetterRecord<T>[]): PathValue<T, P>;\r\n public mediate<P extends WildPaths<T>>(path: WildPaths<T>, payload: Payload<T, P>, type: \"delete\", cords: DeleterRecord<T>[]): PathValue<T, P>;\r\n public mediate<P extends WildPaths<T>>(path: WildPaths<T>, payload: Payload<T, P>, type: \"get\" | \"set\" | \"delete\", cords: Array<GetterRecord<T> | SetterRecord<T> | DeleterRecord<T>>) {\r\n let terminated = false,\r\n value = payload.target.value,\r\n killed = false; // mediator called when necessary & ready for the argument work, all facts (params) are brought to the table so no `?.`\r\n const isGet = type === \"get\",\r\n isSet = type === \"set\",\r\n mediators = isGet ? this.getters : isSet ? this.setters : this.deleters,\r\n scords = cords.slice();\r\n for (let slen = scords.length, i = !isGet ? 0 : slen - 1, len = !isGet ? slen : -1; i !== len; i += !isGet ? 1 : -1) {\r\n const cord = scords[i];\r\n if ((cord as any)._dead) continue;\r\n const response: any = isGet ? (cord as GetterRecord<T>).cb(value, payload as Payload<T>) : isSet ? (cord as SetterRecord<T>).cb(value, terminated, payload as Payload<T>) : (cord as DeleterRecord<T>).cb(terminated, payload as Payload<T>); // all will mediate\r\n if (isGet || !(terminated ||= payload.terminated = response === TERMINATOR)) value = response as PathValue<T, P>;\r\n if (cord.once) killed = (cord as any)._dead = true;\r\n }\r\n if (killed) for (let i = cords.length - 1; i >= 0; i--) if ((cords[i] as any)._dead) cords.splice(i, 1), !cords.length && mediators!.delete(path);\r\n return value; // set - FIFO, get - LIFO\r\n }\r\n\r\n public notify<P extends Paths<T>>(path: P, payload: Payload<T, P>): void {\r\n if (this.watchers) {\r\n const wildcords = this.watchers.get(\"*\") as Array<WatcherRecord<T, \"*\">> | undefined,\r\n wildscords = wildcords?.slice(),\r\n cords = this.watchers.get(path) as Array<WatcherRecord<T, P>> | undefined,\r\n scords = cords?.slice();\r\n if (cords) {\r\n let killed = false;\r\n for (let i = 0, len = scords!.length; i < len; i++) {\r\n const cord = scords![i];\r\n if ((cord as any)._dead) continue;\r\n cord.cb(payload.target.value as PathValue<T, P>, payload); // watchers do not terminate as they're after the OP\r\n if (cord.once) killed = (cord as any)._dead = true;\r\n }\r\n if (killed) for (let i = cords!.length - 1; i >= 0; i--) if ((cords![i] as any)._dead) cords!.splice(i, 1), !cords!.length && this.watchers!.delete(path);\r\n }\r\n if (wildcords) {\r\n let killed = false;\r\n for (let i = 0, len = wildscords!.length; i < len; i++) {\r\n const wildcord = wildscords![i];\r\n if ((wildcord as any)._dead) continue;\r\n wildcord.cb(payload.target.value, payload as Payload<T, \"*\">);\r\n if (wildcord.once) killed = (wildcord as any)._dead = true;\r\n }\r\n if (killed) for (let i = wildcords!.length - 1; i >= 0; i--) if ((wildcords![i] as any)._dead) wildcords!.splice(i, 1), !wildcords!.length && this.watchers!.delete(\"*\");\r\n }\r\n }\r\n this.listeners && this.schedule(path, payload); // batch is undefined till listeners are available\r\n }\r\n protected schedule<P extends Paths<T>>(path: P, payload: Payload<T, P>): void {\r\n this.batch ??= new Map();\r\n this.batch.set(path, payload as Payload<T>), !this.isBatching && this.initBatching();\r\n }\r\n protected initBatching(): void {\r\n (this.isBatching = true), this.config.batchingFunction!(() => this.flush()); // do the `!isBatching` check outisde so the func cost is only on first batch\r\n }\r\n protected flush(): void {\r\n (this.isBatching = false), this.batch && this.tick(this.batch.keys()); // not slowing dis down with a `?.size` since it's like always filled, rather pay the empty iterator cost once when empty\r\n if (this.queue?.size) for (const task of this.queue) task(), this.queue.delete(task); // you can still stall with an empty batch, slower `?.`, almost always empty; this or empty Iterator cost\r\n }\r\n\r\n public wave<P extends Paths<T>>(path: P, payload: Payload<T, P>): void {\r\n const e = new ReactorEvent<T>(payload as Payload<T>) as REvent<T>, // a wave is started forly when really necessary all things considered\r\n chain = getTrailRecords(this.core, path); // either build a large array of refs to climb back up or have to derive each step\r\n // 1: CAPTURE phase (core -> parent) - intent owners reject here, capture should preferably be used to reject\r\n if (e.captures) {\r\n e.eventPhase = ReactorEvent.CAPTURING_PHASE;\r\n for (let i = 0; i <= chain.length - 2; i++) {\r\n if (e.propagationStopped) break;\r\n this.fire(chain[i], e, true);\r\n }\r\n if (e.propagationStopped) return;\r\n }\r\n // 2: TARGET phase (leaf)\r\n e.eventPhase = ReactorEvent.AT_TARGET;\r\n this.fire(chain[chain.length - 1], e, true); // CAPTURE fires\r\n !e.immediatePropagationStopped && this.fire(chain[chain.length - 1], e, false); // BUBBLE fires\r\n // 3: BUBBLE phase (parent -> core) - listeners always see it, rejection is just a flag for smart optimists\r\n if (e.bubbles) {\r\n e.eventPhase = ReactorEvent.BUBBLING_PHASE;\r\n for (let i = chain.length - 2; i >= 0; i--) {\r\n if (e.propagationStopped) break;\r\n this.fire(chain[i], e, false);\r\n }\r\n // if (e.propagationStopped) return;\r\n }\r\n // if (e.rejected) return; // 4: DEFAULT phase if ever, whole architecture can be reimagined: `State vs Intent` is my view; reactor is still dumb\r\n }\r\n protected fire([path, object, value]: ReturnType<typeof getTrailRecords<T>>[number], e: REvent<T>, isCapture: boolean, cords = this.listeners!.get(path)): void {\r\n if (!cords) return; // not doing `.listeners?.` in param cuz this is called in a loop and internally, listeners are defined before this is touched\r\n e.type = path !== e.target.path ? \"update\" : e.staticType; // `update` for ancestors\r\n e.currentTarget = { path, value, oldValue: e.type !== \"update\" ? e.target.oldValue : undefined, key: (e.type !== \"update\" ? path : path.slice(path.lastIndexOf(\".\") + 1) || \"\") as PathKey<T>, hadKey: e.type !== \"update\" ? e.target.hadKey : true, object: object as PathBranchValue<T> };\r\n let killed = false;\r\n const scords = cords.slice();\r\n for (let i = 0, len = scords.length, tDepth; i < len; i++) {\r\n const cord = scords[i];\r\n if (e.immediatePropagationStopped) break;\r\n if (cord.capture !== isCapture || (cord as any)._dead) continue;\r\n if (cord.depth !== undefined) {\r\n tDepth ??= getDepth(e.target.path); // calc only if ever needed\r\n if (tDepth > cord.lDepth! + cord.depth!) continue;\r\n }\r\n cord.cb(e);\r\n if (cord.once) killed = (cord as any)._dead = true;\r\n }\r\n if (killed) for (let i = cords.length - 1; i >= 0; i--) if ((cords[i] as any)._dead) cords.splice(i, 1), !cords.length && this.listeners!.delete(path);\r\n }\r\n\r\n /**\r\n * Flushes queued listener payloads.\r\n * @param paths Optional path(s) to flush.\r\n * @example\r\n * rtr.tick(); // to flush all paths in batch or pass \"*\" wildcard\r\n * @example\r\n * rtr.tick(\"user.profile.name\");\r\n */\r\n public tick(paths?: WildPaths<T> | Iterable<Paths<T>>): void {\r\n if (!paths || paths === \"*\") return this.flush(); // we are sure listeners are defined before waving since batch depends on them\r\n if (\"string\" === typeof paths) {\r\n const payload = this.batch?.get(paths) as Payload<T, Paths<T>> | undefined;\r\n payload && (this.batch!.delete(paths), this.wave(paths, payload));\r\n } else\r\n for (const path of paths) {\r\n const payload = this.batch!.get(path) as Payload<T, Paths<T>> | undefined; // `!` cuz tick is only called inside the class with iterable paths when batch is defined\r\n payload && (this.batch!.delete(path), this.wave(path, payload));\r\n }\r\n }\r\n /**\r\n * Queues a task to run after the current flush cycle.\r\n * @param task Task callback.\r\n * @example\r\n * const task = () => console.log(\"after flush\");\r\n * rtr.stall(task);\r\n */\r\n public stall(task: () => any): void {\r\n (this.queue ??= new Set()).add(task), !this.isBatching && this.initBatching();\r\n }\r\n /**\r\n * Removes a queued post-flush task.\r\n * @param task Task callback.\r\n * @returns `undefined` when no queue, `false` when queue exist but callback is not found, `true` when removed.\r\n */\r\n public nostall(task: () => any): boolean | undefined {\r\n return this.queue?.delete(task);\r\n }\r\n\r\n public context<P extends WildPaths<T>>(path: P): Target<T, P> {\r\n const last = path.lastIndexOf(\".\"),\r\n key = (path.slice(last + 1) || \"\") as PathKey<T, P>,\r\n object = (last === -1 ? this.core : getPath(this.core, path.slice(0, last) as Paths<T>)) as PathBranchValue<T, P>;\r\n return { path, value: getPath(this.core, path), key, hadKey: !object || key in object, object };\r\n }\r\n protected binded<Cb>(cord: GetterRecord<T> | SetterRecord<T> | DeleterRecord<T> | WatcherRecord<T> | ListenerRecord<T>, sig?: AbortSignal): Cb {\r\n if (sig) sig.aborted ? cord.clup() : sig.addEventListener(\"abort\", cord.clup, { once: true }); // once incase spec changes, memory leaks too\r\n return (cord.sclup = !sig || sig.aborted ? NOOP : () => sig.removeEventListener(\"abort\", cord.clup)), cord.clup as Cb;\r\n }\r\n protected cloned<O>(target: O, raw: boolean, seen = new WeakMap()): O {\r\n if (!target || \"object\" !== typeof target) return target;\r\n const obj = (target as any)[RAW] || target, // escape hatch from traps\r\n cloned = seen.get(obj);\r\n if (cloned) return cloned;\r\n if (!canHandle(obj, this.config, false)) return obj; // no circular references\r\n const version = obj[VERSION] || 0,\r\n cached = !raw && this.config.smartCloning && (this.snapCache ??= new WeakMap()).get(obj);\r\n if (cached && obj[SSVERSION] === version) return cached;\r\n const clone = !raw ? (this.config.preserveContext ? Object.create(Object.getPrototypeOf(obj)) : Array.isArray(obj) ? [] : {}) : obj;\r\n seen.set(obj, clone);\r\n const keys = this.config.preserveContext ? Reflect.ownKeys(obj) : Object.keys(obj);\r\n for (let i = 0, len = keys.length; i < len; i++) {\r\n const key = keys[i];\r\n try {\r\n clone[key] = this.cloned(obj[key], raw, seen);\r\n } catch (e) {\r\n if (e instanceof RangeError) throw e; // internals can skip, not users\r\n } // call a spade a spade and just skip, no descriptor gymanstics\r\n }\r\n if (!raw && this.config.smartCloning) this.snapCache!.set(obj, clone), (obj[SSVERSION] = version);\r\n return clone;\r\n }\r\n\r\n protected onSync<P extends WildPaths<T>>(key: \"get\" | \"set\" | \"delete\" | \"watch\", path: P, cb: any, opts: SyncOptions | undefined, onInit: (type?: \"set\" | \"delete\") => void = NOOP): () => boolean | undefined {\r\n const { once = false, signal, lazy = false, init = false, initType } = parseEvtOpts(opts, EVT_OPTS.MEDIATOR),\r\n store = (this[`${key}${key.endsWith(\"t\") ? \"t\" : \"\"}ers` as \"getters\"] ??= new Map()) as Map<WildPaths<T>, Array<GetterRecord<T> | SetterRecord<T> | DeleterRecord<T> | WatcherRecord<T>>>;\r\n let cords = store.get(path),\r\n cord: GetterRecord<T> | SetterRecord<T> | DeleterRecord<T> | WatcherRecord<T> | undefined;\r\n if (cords)\r\n for (let i = 0, len = cords.length; i < len; i++) {\r\n const excord = cords[i];\r\n if (Object.is(excord.cb, cb)) {\r\n cord = excord;\r\n break;\r\n }\r\n }\r\n if (cord) return cord.clup;\r\n let task: () => void;\r\n cord = { cb, once, clup: () => (lazy && this.nostall(task), this[`no${key}` as \"noget\"](path, cb)) };\r\n task = () => (cords ?? (store.set(path, (cords = [])), cords)).push(cord);\r\n lazy ? this.stall(task) : task(), init && (init !== \"auto\" || hasPath(this.core, path)) && onInit(initType);\r\n return this.binded(cord!, signal);\r\n } // add synchronous\r\n protected offSync<P extends WildPaths<T>>(store: Map<WildPaths<T>, any[]> | undefined, path: P, cb: any): boolean | undefined {\r\n const cords = store?.get(path);\r\n if (!cords) return undefined;\r\n for (let i = 0, len = cords.length; i < len; i++) {\r\n const cord = cords[i];\r\n if (Object.is(cord.cb, cb)) return cord.sclup!(), cords.splice(i, 1), !cords.length && store!.delete(path), ((cord as any)._dead = true);\r\n }\r\n return false;\r\n } // remove synchronous\r\n\r\n /**\r\n * Registers a get mediator for a path.\r\n * @param path Path or wildcard path.\r\n * @param callback Mediator callback.\r\n * @param options Sync options.\r\n * @returns Cleanup function.\r\n * @example\r\n * const cleanup = rtr.get(\"user.name\", (value) => String(value).trim());\r\n */\r\n public get<P extends WildPaths<T>>(path: P, callback: Getter<T, P>, options?: SyncOptions): GetterRecord<T>[\"clup\"] {\r\n return this.onSync(\"get\", path, callback, options, () => getPath(this.core, path));\r\n }\r\n /** Registers a get mediator for a path that only triggers once. */\r\n public gonce<P extends WildPaths<T>>(path: P, callback: Getter<T, P>, options?: SyncOptions): GetterRecord<T>[\"clup\"] {\r\n return this.get<P>(path, callback, { ...parseEvtOpts(options, EVT_OPTS.MEDIATOR), once: true });\r\n }\r\n /**\r\n * Removes a get mediator for a path.\r\n * @param path Path or wildcard path.\r\n * @param callback Mediator callback to remove.\r\n * @returns `undefined` when the path has no records, `false` when records exist but callback is not found, `true` when removed.\r\n */\r\n public noget<P extends WildPaths<T>>(path: P, callback: Getter<T, P>): boolean | undefined {\r\n return this.offSync(this.getters, path, callback);\r\n }\r\n\r\n /**\r\n * Registers a set mediator for a path.\r\n * @param path Path or wildcard path.\r\n * @param callback Mediator callback.\r\n * @param options Sync options.\r\n * @returns Cleanup function.\r\n * @example\r\n * rtr.set(\"user.name\", (value) => String(value).trim());\r\n */\r\n public set<P extends WildPaths<T>>(path: P, callback: Setter<T, P>, options?: SyncOptions): SetterRecord<T>[\"clup\"] {\r\n return this.onSync(\"set\", path, callback, options, () => (force(() => setPath(this.core, path, getPath(this.core, path))), this.tick(path)));\r\n }\r\n /** Registers a set mediator for a path that only triggers once. */\r\n public sonce<P extends WildPaths<T>>(path: P, callback: Setter<T, P>, options?: SyncOptions): SetterRecord<T>[\"clup\"] {\r\n return this.set<P>(path, callback, Object.assign(parseEvtOpts(options, EVT_OPTS.MEDIATOR), { once: true }));\r\n }\r\n /**\r\n * Removes a set mediator for a path.\r\n * @param path Path or wildcard path.\r\n * @param callback Mediator callback to remove.\r\n * @returns `undefined` when the path has no records, `false` when records exist but callback is not found, `true` when removed.\r\n */\r\n public noset<P extends WildPaths<T>>(path: P, callback: Setter<T, P>): boolean | undefined {\r\n return this.offSync(this.setters, path, callback);\r\n }\r\n\r\n /**\r\n * Registers a delete mediator for a path.\r\n * @param path Path or wildcard path.\r\n * @param callback Mediator callback.\r\n * @param options Sync options.\r\n * @returns Cleanup function.\r\n * @example\r\n * rtr.delete(\"cache.temp\", () => TERMINATOR);\r\n */\r\n public delete<P extends WildPaths<T>>(path: P, callback: Deleter<T, P>, options?: SyncOptions): DeleterRecord<T>[\"clup\"] {\r\n return this.onSync(\"delete\", path, callback, options, () => deletePath(this.core, path));\r\n }\r\n /** Registers a delete mediator for a path that only triggers once. */\r\n public donce<P extends WildPaths<T>>(path: P, callback: Deleter<T, P>, options?: SyncOptions): DeleterRecord<T>[\"clup\"] {\r\n return this.delete<P>(path, callback, Object.assign(parseEvtOpts(options, EVT_OPTS.MEDIATOR), { once: true }));\r\n }\r\n /**\r\n * Removes a delete mediator for a path.\r\n * @param path Path or wildcard path.\r\n * @param callback Mediator callback to remove.\r\n * @returns `undefined` when the path has no records, `false` when records exist but callback is not found, `true` when removed.\r\n */\r\n public nodelete<P extends WildPaths<T>>(path: P, callback: Deleter<T, P>): boolean | undefined {\r\n return this.offSync(this.deleters, path, callback);\r\n }\r\n\r\n /**\r\n * Registers a watcher for a path.\r\n * Watch callbacks run synchronously with the operation, use leaf paths for reliability as it sees exact sets; no bubbling here.\r\n * @param path Path or wildcard path.\r\n * @param callback Watch callback.\r\n * @param options Sync options.\r\n * @returns Cleanup function.\r\n * @example\r\n * const cleanup = rtr.watch(\"user.name\", (value) => console.log(value));\r\n */\r\n public watch<P extends WildPaths<T>>(path: P, callback: Watcher<T, P>, options?: SyncOptions): WatcherRecord<T>[\"clup\"] {\r\n return this.onSync(\"watch\", path, callback, options, (type) => (!type ? ((target) => callback(target.value, { type: \"init\", target, currentTarget: target, root: this.core, rejectable: false } as Payload<T, P>))(this.context(path)) : (force(() => (type === \"set\" ? setPath(this.core, path, getPath(this.core, path)) : deletePath(this.core, path))), this.tick(path)))); // no tick since sync\r\n }\r\n /** Registers a watcher for a path that only triggers once. */\r\n public wonce<P extends WildPaths<T>>(path: P, callback: Watcher<T, P>, options?: SyncOptions): WatcherRecord<T>[\"clup\"] {\r\n return this.watch<P>(path, callback, Object.assign(parseEvtOpts(options, EVT_OPTS.MEDIATOR), { once: true }));\r\n }\r\n /**\r\n * Removes a watcher for a path.\r\n * @param path Path or wildcard path.\r\n * @param callback Watch callback to remove.\r\n * @returns `undefined` when the path has no records, `false` when records exist but callback is not found, `true` when removed.\r\n */\r\n public nowatch<P extends WildPaths<T>>(path: P, callback: Watcher<T, P>): boolean | undefined {\r\n return this.offSync(this.watchers, path, callback);\r\n }\r\n\r\n /**\r\n * Registers an event listener for a path.\r\n * `on` listeners are batched and notified asynchronously by default e.g. `queueMicrotask()`.\r\n * @param path Path or wildcard path.\r\n * @param callback Listener callback.\r\n * @param options Listener options.\r\n * @returns Cleanup function.\r\n * @example\r\n * const cleanup = rtr.on(\"user.name\", (e) => console.log(e.type, e.path));\r\n */\r\n public on<P extends WildPaths<T>, const D extends number = MaxDepth>(path: P, callback: Listener<T, P, D>, options?: ListenerOptions<D>): ListenerRecord<T, P, D>[\"clup\"] {\r\n this.listeners ??= new Map();\r\n const { capture = false, once = false, signal, init = false, initType: type, depth } = parseEvtOpts(options, EVT_OPTS.LISTENER);\r\n let cords = this.listeners.get(path),\r\n cord: ListenerRecord<T> | undefined;\r\n if (cords)\r\n for (let i = 0, len = cords.length; i < len; i++) {\r\n const excord = cords[i];\r\n if (Object.is(excord.cb, callback) && capture === excord.capture) {\r\n cord = excord;\r\n break;\r\n }\r\n }\r\n if (cord) return cord.clup;\r\n cord = { cb: callback as Listener<T>, capture, depth: depth as MaxDepth, once, clup: () => this.off<P, D>(path, callback, options), lDepth: depth !== undefined ? getDepth(path) : depth };\r\n (cords ?? (this.listeners.set(path, (cords = [])), cords)).push(cord!);\r\n init && (init !== \"auto\" || hasPath(this.core, path)) && (!type ? ((target) => callback(new ReactorEvent<T, P>({ type: \"init\", target, currentTarget: target, root: this.core, reactor: this, rejectable: false }) as REvent<T, P, D>))(this.context(path)) : (force(() => (type === \"set\" ? setPath(this.core, path, getPath(this.core, path)) : deletePath(this.core, path))), this.tick(path))); // tick since async\r\n return this.binded(cord!, signal);\r\n }\r\n /** Registers an event listener for a path that only triggers once. */\r\n public once<P extends WildPaths<T>, const D extends number = MaxDepth>(path: P, callback: Listener<T, P, D>, options?: ListenerOptions<D>): ListenerRecord<T, P, D>[\"clup\"] {\r\n return this.on<P, D>(path, callback, Object.assign(parseEvtOpts(options, EVT_OPTS.LISTENER), { once: true }));\r\n }\r\n /**\r\n * Removes an event listener for a path.\r\n * @param path Path or wildcard path.\r\n * @param callback Listener callback to remove.\r\n * @param options Listener options used during registration.\r\n * @returns `undefined` when the path has no records, `false` when records exist but callback is not found, `true` when removed.\r\n * @example\r\n * const cb = (e: REvent<T>) => console.log(e.path);\r\n * rtr.on(\"user.name\", cb);\r\n * rtr.off(\"user.name\", cb);\r\n */\r\n public off<P extends WildPaths<T>, const D extends number = MaxDepth>(path: P, callback: Listener<T, P, D>, options?: ListenerOptions<D>): boolean | undefined {\r\n const cords = this.listeners?.get(path);\r\n if (!cords) return undefined;\r\n const { capture = false } = parseEvtOpts(options, EVT_OPTS.LISTENER);\r\n for (let i = 0, len = cords.length; i < len; i++) {\r\n const cord = cords[i];\r\n if (Object.is(cord.cb, callback) && cord.capture === capture) return cord.sclup!(), cords.splice(i, 1), !cords.length && this.listeners!.delete(path), ((cord as any)._dead = true);\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Creates a snapshot; possibly clone of state (or a state branch).\r\n * You could alternatively use or serialize your proxied state \"as is\" except the environment demands no proxies or new references.\r\n * @param raw Use raw (deep unproxied & uncloned) version of branch, defaults to `true` if `config.smartCloning: false`.\r\n * @param branch Specific branch to clone.\r\n * @returns Snapshot deep or smart (structurally shared) clone.\r\n * @example\r\n * const snap = rtr.snapshot();\r\n * @example\r\n * const snap = rtr.snapshot(false, rtr.core.history.past);\r\n */\r\n public snapshot(raw?: boolean): T;\r\n public snapshot<B>(raw?: boolean, branch?: B): B;\r\n public snapshot(raw = !this.config.smartCloning, branch?: any) {\r\n return this.cloned(arguments.length < 2 ? this.core : branch, raw); // raw is true if not smart cloning(structural sharing) for better vanilla performace except explicitly changed\r\n }\r\n\r\n /**\r\n * Installs a module instance.\r\n * @param target Module instance.\r\n * @param id Optional identification tag for this instance in the module.\r\n * @returns Current `Reactor` instance for fluent chaining.\r\n */\r\n public use(target: ReactorModule<T>, id?: ReactorModuleId): this {\r\n return (this.modules ??= new Set()).add(target.setup(this, id)), this;\r\n }\r\n /** Resets this reactor instance to its initial state. */\r\n public reset(): void {\r\n this.getters?.clear(), this.setters?.clear(), this.deleters?.clear(), this.watchers?.clear(), this.listeners?.clear();\r\n this.batch?.clear(), this.queue?.clear(), (this.isBatching = false);\r\n }\r\n public destroy(): void {\r\n if (this.modules) for (const mdle of this.modules) mdle.destroy();\r\n this.reset(), nuke(this);\r\n }\r\n\r\n public get canLog(): boolean {\r\n return this.log !== NOOP;\r\n }\r\n public set canLog(value: boolean) {\r\n this.log = value ? RTR_LOG : NOOP;\r\n }\r\n public get canLineageTrace() {\r\n return this.config.lineageTracing && this.config.referenceTracking;\r\n }\r\n public get canSmartClone() {\r\n return this.config.smartCloning && this.config.referenceTracking;\r\n }\r\n}\r\n","import { RAW, INERTIA, REJECTABLE, INDIFFABLE, VERSION, SSVERSION, NIL } from \"./consts\";\r\nimport { Reactor } from \"./reactor\";\r\nimport type { ReactorBuild, Inert, Intent, Live, State, Volatile, Stable } from \"@defs/reactor\";\r\n\r\n/** `Reactor` method names exposed on objects returned by `reactive()`. */\r\nexport const methods = [\"tick\", \"stall\", \"nostall\", \"get\", \"gonce\", \"noget\", \"set\", \"sonce\", \"noset\", \"delete\", \"donce\", \"nodelete\", \"watch\", \"wonce\", \"nowatch\", \"on\", \"once\", \"off\", \"snapshot\", \"use\", \"reset\", \"destroy\"] as const;\r\n\r\ntype Method = (typeof methods)[number];\r\ntype Prefix<P extends ReactivePreferences | undefined> = P extends { prefix?: infer X extends string } ? X : \"\";\r\ntype Suffix<P extends ReactivePreferences | undefined> = P extends { suffix?: infer X extends string } ? X : \"\";\r\ntype Whitelist<P extends ReactivePreferences | undefined> = P extends { whitelist?: infer W extends readonly Method[] } ? W[number] : never;\r\ntype ReactiveMethodMap<T extends object, P extends ReactivePreferences | undefined> = {\r\n [K in Method as [Prefix<P>, Suffix<P>] extends [\"\", \"\"] ? (P extends { whitelist: readonly Method[] } ? (K extends Whitelist<P> ? never : K) : K) : P extends { whitelist: readonly Method[] } ? (K extends Whitelist<P> ? `${Prefix<P>}${K}${Suffix<P>}` : K) : `${Prefix<P>}${K}${Suffix<P>}`]: Pick<Reactor<T>, Method>[K];\r\n};\r\n\r\n/** Exposed `Reactor` methods and `__Reactor__` of a `reactive()` object. */\r\nexport type APIKey<T extends object = any, P extends ReactivePreferences | undefined = undefined> = keyof ReactiveMethodMap<T, P> | \"__Reactor__\";\r\n/** Type representing a `reactive()` object with mapped `Reactor` methods and `__Reactor__`. */\r\nexport type Reactive<T extends object, P extends ReactivePreferences | undefined = undefined> = T & ReactiveMethodMap<T, P> & { __Reactor__: Reactor<T> };\r\n/** Object type with only the non-reactor props of a `reactive()` object, representing the runtime enumerable shape. */\r\nexport type Pure<T extends object, P extends ReactivePreferences | undefined = undefined> = {\r\n [K in keyof T as K extends APIKey<T, P> ? never : K]: T[K];\r\n};\r\nexport interface ReactivePreferences {\r\n /** Prefix applied to exposed `Reactor` methods. */\r\n prefix?: string;\r\n /** Suffix applied to exposed `Reactor` methods. */\r\n suffix?: string;\r\n /** Reactor methods that may collide with keys already existing in your state object.\r\n * - If an affix (prefix/suffix) is provided, ONLY these methods will receive the affix (others keep original names).\r\n * - If no affix is provided, these methods will be completely skipped and not attached.\r\n */\r\n whitelist?: readonly Method[]; // keys you're already using\r\n}\r\n\r\n/**\r\n * Attaches `Reactor` APIs to a state object and returns its reactive proxy from the reactor's core.\r\n * If an existing `reactive()` object is passed, it is re-returned ignoring change in preferences.\r\n * @param target Source state object or an existing Reactor instance.\r\n * @param build Reactor initial configuration.\r\n * @param preferences Method naming preferences for exposed APIs.\r\n * @returns Reactive object with mapped Reactor methods and `__Reactor__`.\r\n * @example\r\n * const state = reactive({ user: { name: \"Kosi\" } });\r\n * state.set(\"user.name\", (v) => v);\r\n * @example\r\n * // State already has a 'tick' that's a number so prefix the reactor's method to avoid collision.\r\n * const state = reactive({ tick: 0 }, { debug: true }, { prefix: \"$\", whitelist: [\"tick\"] });\r\n * state.$tick(); // reactor's 'tick' method is prefixed\r\n * state.set(\"tick\", (v) => v + 1); // 'set' keeps its original name\r\n * // Instead, don't prefix and just skip the 'tick' method entirely.\r\n * const state = reactive({ tick: 0 }, { debug: false }, { whitelist: [\"tick\"] });\r\n * state.tick; // number, not the reactor's method\r\n * // You could also rename the property on your State object, e.g. to \"clock\".\r\n */\r\nexport function reactive<T extends object, const P extends ReactivePreferences | undefined = undefined>(target: T, build?: ReactorBuild<T>, preferences: P = NIL): T extends Reactive<infer _O, infer _P> ? T : Reactive<T, P> {\r\n if (\"__Reactor__\" in target) return target as any;\r\n const descriptors: PropertyDescriptorMap = {},\r\n rtr = getReactor(target, true, build),\r\n locks = { enumerable: false, configurable: true, writable: false },\r\n hasAffix = !!(preferences.prefix || preferences.suffix);\r\n for (let i = 0, len = methods.length; i < len; i++) {\r\n let key = methods[i];\r\n if (hasAffix) (preferences.whitelist?.includes(key) ?? true) && (key = `${preferences.prefix || \"\"}${key}${preferences.suffix || \"\"}` as Method);\r\n else if (preferences.whitelist?.includes(key)) continue;\r\n descriptors[key] = { value: rtr[methods[i]].bind(rtr), ...locks };\r\n }\r\n descriptors[\"__Reactor__\"] = { value: rtr, ...locks };\r\n return Object.defineProperties(rtr.core, descriptors), rtr.core as any;\r\n}\r\n\r\n/**\r\n * Marks an object as intent (rejectable).\r\n * @param target Object to mark.\r\n * @returns The same object with intent typing.\r\n */\r\nexport function intent<T extends object>(target: T): Intent<T> {\r\n return (getRaw(target as any)[REJECTABLE] = true), target as Intent<T>;\r\n}\r\n/**\r\n * Removes intent (rejectable) behavior from an object.\r\n * @param target Object to unmark.\r\n * @returns The same object with state typing.\r\n */\r\nexport function state<T extends object>(target: T): State<T> {\r\n return delete getRaw(target as any)[REJECTABLE], target as State<T>;\r\n}\r\n/**\r\n * Checks whether an object is marked as intent.\r\n * @param target Object to test.\r\n * @returns `true` when marked as intent.\r\n */\r\nexport function isIntent<T extends object>(target: T = NIL): target is Intent<T> {\r\n return !!getRaw(target as any)[REJECTABLE];\r\n}\r\n\r\n/**\r\n * Marks an object as inert so it is skipped by proxy mediation.\r\n * @param target Object to mark.\r\n * @returns The same object with inert typing.\r\n */\r\nexport function inert<T extends object>(target: T): Inert<T> {\r\n return (getRaw(target as any)[INERTIA] = true), target as Inert<T>;\r\n}\r\n/**\r\n * Removes the inert marker from an object.\r\n * @param target Object to unmark.\r\n * @returns The same object with live typing.\r\n */\r\nexport function live<T extends object>(target: T): Live<T> {\r\n return delete getRaw(target as any)[INERTIA], target as Live<T>;\r\n}\r\n/**\r\n * Checks whether an object is marked as inert.\r\n * @param target Object to test.\r\n * @returns `true` when inert.\r\n */\r\nexport function isInert<T extends object>(target: T = NIL): target is Inert<T> {\r\n return !!getRaw(target as any)[INERTIA];\r\n}\r\n\r\n/**\r\n * Marks an object as volatile (indiffable enabled).\r\n * @param target Object to mark.\r\n * @returns The same object with volatile typing.\r\n */\r\nexport function volatile<T extends object>(target: T): Volatile<T> {\r\n return (getRaw(target as any)[INDIFFABLE] = true), target as Volatile<T>;\r\n}\r\n/**\r\n * Removes volatile behavior from an object.\r\n * @param target Object to unmark.\r\n * @returns The same object with stable typing.\r\n */\r\nexport function stable<T extends object>(target: T): Stable<T> {\r\n return delete getRaw(target as any)[INDIFFABLE], target as Stable<T>;\r\n}\r\n/**\r\n * Checks whether an object is marked as volatile.\r\n * @param target Object to test.\r\n * @returns `true` when marked as volatile.\r\n */\r\nexport function isVolatile<T extends object>(target: T = NIL): target is Volatile<T> {\r\n return !!getRaw(target as any)[INDIFFABLE];\r\n}\r\n\r\n/**\r\n * Gets the underlying `Reactor` instance associated with a `reactive()` object,\r\n * returns the `Reactor` itself if given, or optionally creates one for plain objects.\r\n * @param target Object to retrieve `Reactor` from.\r\n * @param create When `true`, creates a new `Reactor` for plain objects when none exists.\r\n * @param build Optional `Reactor` build options used only when `create` initializes a new instance.\r\n * @returns `Reactor` instance or `undefined` if not reactive and `create` is false.\r\n */\r\nexport function getReactor<T extends object>(target: Reactor<T>, create?: boolean, build?: ReactorBuild<T>): Reactor<T>;\r\nexport function getReactor<T extends object>(target: Reactive<T>, create?: boolean, build?: ReactorBuild<T>): Reactor<T>;\r\nexport function getReactor<T extends object>(target: T, create: true, build?: ReactorBuild<T>): Reactor<T>;\r\nexport function getReactor<T extends object>(target: T, create?: false, build?: ReactorBuild<T>): Reactor<T> | undefined;\r\nexport function getReactor<T extends object>(target: T | Reactor<T> | Reactive<T>, create: true, build?: ReactorBuild<T>): Reactor<T>;\r\nexport function getReactor<T extends object>(target: T | Reactor<T> | Reactive<T>, create?: false, build?: ReactorBuild<T>): Reactor<T> | undefined;\r\nexport function getReactor<T extends object>(target: T | Reactor<T> | Reactive<T>, create = false, build?: ReactorBuild<T>): Reactor<T> | undefined {\r\n return (target instanceof Reactor ? target : (target as Reactive<T>).__Reactor__) || (create ? new Reactor(target as T, build) : undefined);\r\n}\r\n\r\n/**\r\n * Gets the raw (unproxied) version of an object if it's proxied, otherwise returns the original object.\r\n * @param target Object to unwrap.\r\n * @returns Raw object if proxied, else the original object. Use `Reactor.snapshot(true)` for deep unwrapping.\r\n */\r\nexport function getRaw<T extends object>(target: T = NIL): T {\r\n return (target as any)[RAW] || target;\r\n}\r\n\r\n/**\r\n * Gets the current structural version of an object.\r\n * @param target Object to inspect.\r\n * @returns Version number.\r\n */\r\nexport function getVersion<T extends object>(target: T = NIL): number {\r\n return getRaw(target as any)[VERSION] || 0;\r\n}\r\n/**\r\n * Gets the current snapshot-cache version of an object.\r\n * @param target Object to inspect.\r\n * @returns Snapshot version number.\r\n */\r\nexport function getSnapshotVersion<T extends object>(target: T = NIL): number {\r\n return getRaw(target as any)[SSVERSION] || 0;\r\n}\r\n","import { CTX, NIL, RAW } from \"@core/consts\";\r\nimport { Reactor } from \"@core/reactor\";\r\nimport type { EffectOptions } from \"@defs/reactor\";\r\nimport type { WildPaths, DeepReadonly } from \"@defs/obj\";\r\nimport { canHandle, nuke } from \"@utils/obj\";\r\n\r\nexport let activeTracker: Autotracker<any> | null = null;\r\n\r\n// ===========================================================================\r\n// The S.I.A (State & Intent Architecture) `AutoTracker`\r\n// ===========================================================================\r\n\r\n/**\r\n * - Auto-dependency tracker used to subscribe only to accessed paths.\r\n * - `tracked(...)` wraps a snapshot in a read-tracking proxy, and `callback(...)`\r\n * binds subscriptions for collected paths using `watch` (sync) or `on` (batched).\r\n * @typeParam T Root state object type.\r\n */\r\nexport class Autotracker<T extends object> {\r\n public proxy!: T;\r\n public deps = new Map<Reactor<any>, Set<string>>();\r\n public isTracking = true;\r\n protected rtr?: Reactor<T>;\r\n /** only allows one reactor to autotrack when available */\r\n protected autortr?: Reactor<T>;\r\n protected clups: Array<() => void> = [];\r\n protected lastPath?: WildPaths<T>;\r\n protected proxyCache = new WeakMap<object, any>();\r\n\r\n /** @param rtr Reactor instance used for path subscriptions. */\r\n constructor(rtr?: Reactor<T>) {\r\n this.autortr = this.rtr = rtr;\r\n }\r\n\r\n /**\r\n * Starts a new tracking pass and returns a readonly tracking proxy for `target` if `this` was instantiated with a `Reactor`.\r\n * @param target Snapshot (or state branch) to track reads from.\r\n * @returns Read-tracking readonly proxy.\r\n * @example\r\n * const atrkr = new Autotracker(rtr);\r\n * const state = atrkr.tracked(rtr.snapshot());\r\n * const name = state.user.profile.name;\r\n */\r\n public tracked(target: T): DeepReadonly<T> {\r\n return this.unblock(), (this.proxy = this.proxied(target, \"\")) as DeepReadonly<T>;\r\n }\r\n protected proxied<O extends object>(obj: O, path: string): O {\r\n if (!this.rtr || !obj || \"object\" !== typeof obj) return obj;\r\n const cached = this.proxyCache.get(obj);\r\n if (cached) return cached;\r\n if (!canHandle(obj, this.rtr!.config, false)) return obj;\r\n const proxy = new Proxy(obj, {\r\n // Minimal Proxy Handler\r\n get: (object, key, receiver) => {\r\n if (key === RAW) return this.rtr!.log(`👀 [AutoTracker \\`get\\` Trap] Peeked at ${object}`), object;\r\n const keyStr = String(key),\r\n fullPath = (path ? `${path}.${keyStr}` : keyStr) as WildPaths<T>;\r\n return this.rtr!.log(`🔍 [AutoTracker \\`get\\` Trap] Initiated for \"${keyStr}\" on '${path}'`), this.track(fullPath), this.proxied(!this.rtr!.config.preserveContext ? (object as any)[key] : Reflect.get(object, key, receiver), fullPath);\r\n },\r\n has: (object, key) => {\r\n const keyStr = String(key),\r\n fullPath = (path ? `${path}.${keyStr}` : keyStr) as WildPaths<T>;\r\n return this.rtr!.log(`❓ [AutoTracker \\`has\\` Trap] Initiated for \"${keyStr}\" on '${path}'`), this.track(fullPath), !this.rtr!.config.preserveContext ? key in object : Reflect.has(object, key);\r\n },\r\n getOwnPropertyDescriptor: (object, key) => {\r\n const keyStr = String(key),\r\n fullPath = (path ? `${path}.${keyStr}` : keyStr) as WildPaths<T>;\r\n return this.rtr!.log(`📋 [AutoTracker \\`getOwnPropertyDescriptor\\` Trap] Initiated for \"${keyStr}\" on '${path}'`), this.track(fullPath), !this.rtr!.config.preserveContext ? Object.getOwnPropertyDescriptor(object, key) : Reflect.getOwnPropertyDescriptor(object, key);\r\n },\r\n ownKeys: (object) => {\r\n const safePath = (path || \"*\") as WildPaths<T>;\r\n return this.rtr!.log(`🔑 [AutoTracker \\`ownKeys\\` Trap] Initiated on \"${safePath}\"`), this.track(safePath), Reflect.ownKeys(object); // no faster accurate way without Reflect API\r\n },\r\n set: (_, key) => {\r\n throw new Error(`🛡️ [AutoTracker \\`set\\` Trap] Blocked for \"${String(key)}\" on '${path}'`); // semantic unlike proxy default error\r\n },\r\n deleteProperty: (_, key) => {\r\n throw new Error(`🛡️ [AutoTracker \\`deleteProperty\\` Trap] Blocked for \"${String(key)}\" on '${path}'`); // semantic unlike proxy default error\r\n },\r\n defineProperty: (_, key) => {\r\n throw new Error(`🛡️ [AutoTracker \\`defineProperty\\` Trap] Blocked for \"${String(key)}\" on '${path}'`); // semantic unlike proxy default error\r\n },\r\n setPrototypeOf: (_, key) => {\r\n throw new Error(`🛡️ [AutoTracker \\`setPrototypeOf\\` Trap] Blocked for \"${String(key)}\" on '${path}'`); // semantic unlike proxy default error\r\n },\r\n });\r\n return this.proxyCache.set(obj, proxy), proxy;\r\n }\r\n\r\n /** Adds a path to the tracking set. */\r\n public track<const P extends WildPaths<T>>(path: P, rtr: Reactor<any> = this.rtr!, prune = false, strict = false): P {\r\n if (!this.isTracking || !path || (this.autortr && this.autortr !== rtr)) return path;\r\n let paths = this.deps.get(rtr);\r\n if (!prune && !paths) paths = (this.deps.set(rtr, (paths = new Set())), paths);\r\n if (path.startsWith(this.lastPath + \".\")) {\r\n const child = path.slice(this.lastPath!.length + 1);\r\n (strict || (!child.includes(\"Symbol(\") && child !== \"length\" && !/^\\d+$/.test(child))) && paths!.delete(this.lastPath!); // #SENSITIVE\r\n }\r\n return !prune && paths!.add((this.lastPath = path)), path;\r\n }\r\n /** Removes a path from the tracking set. */\r\n public untrack(path: WildPaths<T>, rtr: Reactor<any> = this.rtr!): void {\r\n this.deps.get(rtr)?.delete(path);\r\n }\r\n /** Enables path tracking. */\r\n public unblock(rtr: Reactor<any> = this.rtr!): void {\r\n this.deps.clear();\r\n this.autortr = rtr;\r\n this.isTracking = true;\r\n this.lastPath = undefined;\r\n }\r\n /** Temporarily disables path tracking. */\r\n public block(): void {\r\n this.autortr = undefined;\r\n this.isTracking = false;\r\n }\r\n\r\n /**\r\n * Subscribes an effect to tracked paths.\r\n * Uses `watch` when `options.sync === true` (synchronous updates), otherwise\r\n * uses `on` (batched/asynchronous listener wave).\r\n * @param cb Effect callback.\r\n * @param options Effect options.\r\n * @returns Cleanup function for active subscriptions.\r\n * @example\r\n * const atrkr = new Autotracker(rtr);\r\n * const view = atrkr.tracked(rtr.snapshot()); // tracked works if `rtr` was passed at instantiation\r\n * view.user.name;\r\n * const stop = atrkr.callback(() => console.log(\"changed\")); // re-run after when \".user.name\" changes\r\n * @example Packaged Customization\r\n * const atrkr = new Autotracker(); // no reactor passed\r\n * withTracker(atrkr, () => state.user.name); // import `withTracker` too\r\n * const stop = atrkr.callback(() => console.log(\"sync\"), { sync: true }); // re-run immediately when \".user.name\" changes, works on any path used from any reactor state\r\n * @example Extensive Customization\r\n * atrkr.unblock();\r\n * const prev = CTX.autotracker;\r\n * CTX.autotracker = atrkr; // import CTX first\r\n * state.user.name;\r\n * CTX.autotracker = prev;\r\n */\r\n public callback(cb: () => void, options: EffectOptions = NIL): () => void {\r\n this.cleanup();\r\n const method = options.sync ? \"watch\" : \"on\";\r\n for (const [rtr, paths] of this.deps) {\r\n if (!paths.size || paths.has(\"*\")) rtr && this.clups.push(rtr[method as \"on\"](\"*\", cb, options));\r\n else for (const path of paths) this.clups.push(rtr[method as \"on\"](path, cb, options));\r\n }\r\n return () => this.cleanup();\r\n }\r\n\r\n /** Clears active subscriptions and blocks tracking. */\r\n public cleanup(): void {\r\n this.block();\r\n for (let i = 0, len = this.clups.length; i < len; i++) this.clups[i]();\r\n this.clups.length = 0;\r\n }\r\n public destroy(): void {\r\n this.deps.clear(), this.cleanup(), nuke(this);\r\n }\r\n}\r\n\r\n/**\r\n * Utility function to run a callback with a specific tracker context, restoring the previous context afterward.\r\n * @param tracker The Autotracker instance to set as the active tracker during the callback execution.\r\n * @param callback The callback function to execute with the specified tracker context.\r\n * @param rtr Optional Reactor instance to associate with the tracker during execution.\r\n * @returns The result of the callback function.\r\n */\r\nexport function withTracker<T>(tracker: Autotracker<any>, callback: () => T, rtr?: Reactor<any>): T {\r\n const prev = CTX.autotracker; // to survive nested trackers\r\n CTX.autotracker = tracker;\r\n try {\r\n return tracker.unblock(rtr), callback();\r\n } finally {\r\n CTX.autotracker = prev;\r\n }\r\n}\r\n","import { useSyncExternalStore, useRef, useCallback } from \"react\";\r\nimport { useISOLayoutEffect } from \"../utils\";\r\nimport { NIL, NOOP } from \"@core/consts\";\r\nimport { Reactor } from \"@core/reactor\";\r\nimport { type Reactive, getReactor } from \"@core/mixins\";\r\nimport type { EffectOptions, ReactorBuild } from \"@defs/reactor\";\r\nimport type { DeepReadonly } from \"@defs/obj\";\r\nimport { Autotracker, withTracker } from \"../../autotracker\";\r\n\r\n/**\r\n * Subscribes to a derived slice of Reactor state.\r\n * The selector runs against the live state and uses the provided equality function\r\n * to suppress unchanged results.\r\n * @typeParam T Root state object type.\r\n * @typeParam R Selector return type.\r\n * @param target Reactive object, Reactor instance, or plain object.\r\n * @param sel Slice selector.\r\n * @param eq Equality function used to compare consecutive selector results.\r\n * @param options Watcher options if `options.sync: false` else Listener options.\r\n * @param build Optional Reactor build options used when creating a scoped Reactor for plain objects.\r\n * @returns The selected slice.\r\n * @example\r\n * const a = useSelector({ user: { name: \"Kosi\" } }, (s) => s.user.name); // per-component scoped\r\n * @example\r\n * const state = reactive({ user: { name: \"Kosi\" } });\r\n * const b = useSelector(state, (s) => s.user.name);\r\n * @example\r\n * const rtr = new Reactor({ user: { name: \"Kosi\" } });\r\n * const c = useSelector(rtr, (s) => s.user.name);\r\n */\r\nexport function useSelector<T extends object, R>(target: T | Reactor<T> | Reactive<T>, sel: (state: T) => R, eq: (prev: R | undefined, next: R) => boolean = Object.is, options: EffectOptions = NIL, build?: ReactorBuild<T>): R {\r\n const rtrRef = useRef<Reactor<T>>(),\r\n tgtRef = useRef<T | Reactor<T> | Reactive<T>>(), // HMR Survival\r\n rtr = tgtRef.current !== target || !rtrRef.current ? ((tgtRef.current = target), (rtrRef.current = getReactor(target, true, build))) : rtrRef.current,\r\n atrkrRef = useRef<Autotracker<T>>(),\r\n atrkr = (atrkrRef.current ||= new Autotracker()), // assigned after to avoid waste of new instances\r\n notifyRef = useRef<() => void>(NOOP),\r\n sliceRef = useRef<R>(),\r\n selRef = useRef(sel),\r\n eqRef = useRef(eq),\r\n optsRef = useRef(options);\r\n (selRef.current = sel), (eqRef.current = eq), (optsRef.current = options); // preventing staleness\r\n const subscribe = useCallback((notify: () => void) => atrkr.callback((notifyRef.current = notify), optsRef.current), [atrkr]);\r\n const getSnapshot = useCallback(() => {\r\n const next = withTracker(atrkr, () => selRef.current(rtr.core), rtr);\r\n return eqRef.current(sliceRef.current, next) ? sliceRef.current! : (sliceRef.current = next);\r\n }, [atrkr, rtr]);\r\n const slice = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\r\n return useISOLayoutEffect(() => atrkr.callback(notifyRef.current, optsRef.current), [atrkr, slice]), slice;\r\n}\r\n\r\n/**\r\n * Subscribes to a derived slice of any Reactor state.\r\n * The selector runs against the live state and uses the provided equality function\r\n * to suppress unchanged results.\r\n * @typeParam R Selector return type.\r\n * @param sel Slice selector.\r\n * @param eq Equality function used to compare consecutive selector results.\r\n * @param options Watcher options if `options.sync: false` else Listener options.\r\n * @returns The selected slice.\r\n * @example\r\n * useAnySelector(() => store.user.name + spouseStore.user.name);\r\n */\r\nexport function useAnySelector<R>(sel: () => R, eq = Object.is, options: EffectOptions = NIL): R {\r\n const atrkrRef = useRef<Autotracker<any>>(),\r\n atrkr = (atrkrRef.current ||= new Autotracker()),\r\n notifyRef = useRef<() => void>(NOOP),\r\n sliceRef = useRef<R>(),\r\n selRef = useRef(sel),\r\n eqRef = useRef(eq),\r\n optsRef = useRef(options);\r\n (selRef.current = sel), (eqRef.current = eq), (optsRef.current = options); // preventing staleness\r\n const subscribe = useCallback((notify: () => void) => atrkr.callback((notifyRef.current = notify), optsRef.current), [atrkr]);\r\n const getSnapshot = useCallback(() => {\r\n const next = withTracker(atrkr, () => selRef.current());\r\n return eqRef.current(sliceRef.current, next) ? sliceRef.current! : (sliceRef.current = next);\r\n }, [atrkr]);\r\n const slice = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\r\n return useISOLayoutEffect(() => atrkr.callback(notifyRef.current, optsRef.current), [atrkr, slice]), slice;\r\n}\r\n\r\n/**\r\n * Subscribes to a derived slice of Reactor state.\r\n * The selector runs against a readonly tracked snapshot and uses the provided equality function\r\n * to suppress unchanged results.\r\n * @typeParam T Root state object type.\r\n * @typeParam R Selector return type.\r\n * @param target Reactive object, Reactor instance, or plain object.\r\n * @param sel Slice selector.\r\n * @param eq Equality function used to compare consecutive selector results.\r\n * @param options Watcher options if `options.sync: false` else Listener options.\r\n * @param build Optional Reactor build options used when creating a scoped Reactor for plain objects.\r\n * @returns The selected slice.\r\n * @example\r\n * const a = useSelectorSnapshot({ user: { name: \"Kosi\" } }, (s) => s.user.name); // per-component scoped\r\n * @example\r\n * const state = reactive({ user: { name: \"Kosi\" } });\r\n * const b = useSelectorSnapshot(state, (s) => s.user.name);\r\n * @example\r\n * const rtr = new Reactor({ user: { name: \"Kosi\" } });\r\n * const c = useSelectorSnapshot(rtr, (s) => s.user.name);\r\n */\r\nexport function useSelectorSnapshot<T extends object, R>(target: T | Reactor<T> | Reactive<T>, sel: (state: DeepReadonly<T>) => R, eq = Object.is, options?: EffectOptions, build: ReactorBuild<T> = { referenceTracking: true, smartCloning: true }): R {\r\n const tgtRef = useRef<T | Reactor<T> | Reactive<T>>(),\r\n rtrRef = useRef<Reactor<T>>(),\r\n rtr = tgtRef.current !== target || !rtrRef.current ? ((tgtRef.current = target), (rtrRef.current = getReactor(target, true, build))) : rtrRef.current,\r\n atrkrRef = useRef<Autotracker<T>>(),\r\n atrkrRtrRef = useRef<Reactor<T>>(),\r\n atrkr = atrkrRtrRef.current !== rtr || !atrkrRef.current ? ((atrkrRtrRef.current = rtr), (atrkrRef.current = new Autotracker(rtr))) : atrkrRef.current,\r\n notifyRef = useRef<() => void>(NOOP),\r\n sliceRef = useRef<R>(),\r\n selRef = useRef(sel),\r\n eqRef = useRef(eq),\r\n optsRef = useRef(options);\r\n rtr.config.referenceTracking = rtr.config.smartCloning = true;\r\n (optsRef.current = options), (selRef.current = sel), (eqRef.current = eq); // preventing staleness\r\n const subscribe = useCallback((notify: () => void) => (atrkr.callback((notifyRef.current = notify), optsRef.current), () => atrkr.cleanup()), [atrkr]);\r\n const getSnapshot = useCallback(() => {\r\n const next = selRef.current(atrkr.tracked(rtr.snapshot()));\r\n return eqRef.current(sliceRef.current, next) ? sliceRef.current! : (sliceRef.current = next);\r\n }, [atrkr]);\r\n const slice = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\r\n return useISOLayoutEffect(() => atrkr.callback(notifyRef.current, optsRef.current), [atrkr, slice]), slice;\r\n} // Nothing much here, just rebuilding \"Zustand.js\" `useSelector`, Proof of Concept: Reactor is a core of cores\r\n","import { useRef, useSyncExternalStore, useCallback } from \"react\";\r\nimport { NIL } from \"@core/consts\";\r\nimport { Reactor } from \"@core/reactor\";\r\nimport { type Reactive, getReactor } from \"@core/mixins\";\r\nimport type { EffectOptions, ReactorBuild } from \"@defs/reactor\";\r\nimport type { WildPaths, PathValue } from \"@defs/obj\";\r\nimport { getPath } from \"@utils/obj\";\r\n\r\n/**\r\n * Subscribes to a single path in Reactor state.\r\n * Uses sync watcher mode when `options.sync` is enabled; otherwise uses event listeners.\r\n * @typeParam T Root state object type.\r\n * @typeParam P Path or wildcard path type.\r\n * @param target Reactive object, Reactor instance, or plain object.\r\n * @param path Path to observe. Supports dotted paths and wildcard `\"*\"`.\r\n * @param options Watcher options if `options.sync: false` else Listener options.\r\n * @param build Optional Reactor build options used when creating a scoped Reactor for plain objects.\r\n * @returns Current value at the requested path.\r\n * @example\r\n * const a = usePath({ user: { profile: { name: \"Kosi\" } } }, \"user.profile.name\");\r\n * @example\r\n * const state = reactive({ user: { profile: { name: \"Kosi\" } } });\r\n * const b = usePath(state, \"user.profile.name\");\r\n * @example\r\n * const rtr = new Reactor({ user: { profile: { name: \"Kosi\" } } });\r\n * const c = usePath(rtr, \"user.profile.name\");\r\n * @example\r\n * const wholeState = usePath(state, \"*\");\r\n */\r\nexport function usePath<T extends object, P extends WildPaths<T>>(target: T | Reactor<T> | Reactive<T>, path: P, options: EffectOptions = NIL, build?: ReactorBuild<T>): PathValue<T, P> {\r\n const versionRef = useRef(0),\r\n tgtRef = useRef<T | Reactor<T> | Reactive<T>>(), // HMR Survival\r\n rtrRef = useRef<Reactor<T>>(),\r\n rtr = tgtRef.current !== target || !rtrRef.current ? ((tgtRef.current = target), (rtrRef.current = getReactor(target, true, build))) : rtrRef.current,\r\n optsRef = useRef(options);\r\n optsRef.current = options; // preventing staleness\r\n const subscribe = useCallback((notify: () => void) => rtr[(optsRef.current.sync ? \"watch\" : \"on\") as \"on\"](path, () => (versionRef.current++, notify()), optsRef.current), [rtr, path]);\r\n const getSnapshot = useCallback(() => versionRef.current, []);\r\n useSyncExternalStore(subscribe, getSnapshot, getSnapshot); // Feed React a primitive number to track tearing, zero cloning.\r\n return getPath(rtr.core, path);\r\n}\r\n","import { useRef } from \"react\";\r\nimport { TimeTravelModule } from \"@modules/timeTravel\";\r\nimport { type TimeTravelConsoleConfig, TimeTravelConsole as VTimeTravelConsole } from \"../vanilla/TimeTravelConsole\";\r\nimport { useISOLayoutEffect } from \"./utils\";\r\n\r\n/** React props for controlling the vanilla TimeTravel overlay. */\r\nexport interface TimeTravelConsoleProps extends Partial<TimeTravelConsoleConfig> {\r\n /** Module instance controlled by this overlay bridge. */\r\n time: TimeTravelModule<any, any>;\r\n}\r\n\r\n/**\r\n - React bridge for mounting and controlling a vanilla TimeTravelConsole instance.\r\n - Instantiates a `TimeTravelConsole` for the provided module, tears it down on unmount, and syncs prop changes into reactive `config`.\r\n * Use this when your app is React but you want the overlay behavior with react-safe instance lifecycle management.\r\n * @param props Overlay bridge props.\r\n */\r\nexport function TimeTravelConsole(props: TimeTravelConsoleProps) {\r\n const vRef = useRef<VTimeTravelConsole | null>(null),\r\n { time, title, color, devOnly, startOpen, container } = props;\r\n\r\n useISOLayoutEffect(() => {\r\n vRef.current = new VTimeTravelConsole(time, props);\r\n return () => void (vRef.current?.destroy(), (vRef.current = null));\r\n }, [time]);\r\n useISOLayoutEffect(() => void (vRef.current && (title !== undefined && (vRef.current.config.title = title), (vRef.current.config.color = color!), (vRef.current.config.devOnly = devOnly!), (vRef.current.config.container = container!), (vRef.current.state.open = startOpen!))), [title, color, devOnly, container, startOpen]);\r\n\r\n return null;\r\n}\r\n","import type { Reactor } from \"@core/reactor\";\r\nimport { getReactor, type Reactive, reactive } from \"@core/mixins\";\r\nimport { isObj, matchPaths, getPath, setPath, nuke } from \"@utils/obj\";\r\nimport { guardMethod, guardAllMethods } from \"@utils/methd\";\r\nimport { ReactorModulePathConfig, ReactorModuleConstructor, ReactorModuleId, ModulePaths } from \"./types\";\r\n\r\n/**\r\n * Base class, extend to create custom reactor modules that can be used with a `Reactor` instance\r\n * Provides common functionalities like multi-reactor management, configuration handling, and error logging.\r\n * @typeParam T Root state object type of the reactors this module will manage.\r\n * @typeParam Config Configuration object type for the module.\r\n * @typeParam State Optional local state object type for the module.\r\n */\r\nexport abstract class BaseReactorModule<T extends object = any, Config extends Partial<ReactorModulePathConfig<T>> = any, State = any> {\r\n public static readonly moduleName: string;\r\n public get name() {\r\n return (this.constructor as ReactorModuleConstructor).moduleName;\r\n }\r\n protected readonly ac = new AbortController();\r\n protected readonly signal = this.ac.signal;\r\n public readonly deps = new Map<ReactorModuleId, Reactor<any>>();\r\n public readonly rids = new WeakMap<Reactor<any>, ReactorModuleId>(); // for quick 0(1) lookups over iteration\r\n public readonly evtOpts = { signal: this.signal };\r\n /** The reactive state object for the module, watch to see exposed lifecycle changes. */\r\n public readonly state!: State extends object ? Reactive<State> : State;\r\n /** The reactive configuration object for the module, manipulate to change behaviour. */\r\n public config!: Config extends object ? Reactive<Config> : Config;\r\n public wired = false;\r\n private readonly clups = new Map<ReactorModuleId, (() => void)[]>();\r\n\r\n constructor(config?: Config, rtr?: Reactor<T>, state?: State) {\r\n guardAllMethods(this, this.guard); // Modules can sacrifice memory footprint for error proofing and events devx\r\n this.config = (isObj(config) ? reactive(config) : config) as BaseReactorModule[\"config\"];\r\n this.state = (isObj(state) ? reactive(state) : state) as BaseReactorModule[\"state\"];\r\n rtr && this.attach(rtr); // User don't have to pass rtr at instantion except config options need type inference from `T`\r\n }\r\n\r\n /**\r\n * Connect to a `Reactor` instance, allows managing multiple reactors if needed.\r\n * @param target `Reactor` instance or `reactive()` object to connect to.\r\n * @param id Optional custom id for the reactor, prefer over default implicit index id when managing multiple reactors, supports paths to merge into a single tree.\r\n * @returns Current `ReactorModule` instance for fluent chaining.\r\n * @example\r\n * const mod = new MyModule().attach(state1).attach(state2); // implicit index-based ids by default, add a .setup() or `Reactor.use()` when ready for init.\r\n * @example\r\n * const persist = new PersistModule(config).attach(sessState, \"session\").attach(adminState, \"session.admin\"); // don't use \"*\", causes de-serialization issues.\r\n */\r\n public attach(target?: Reactor<any> | Reactive<any>, id: ReactorModuleId = this.deps.size) {\r\n const rtr = getReactor(target);\r\n if (!rtr || this.deps.has(id)) return this;\r\n return this.rids.set((this.deps.set(id, rtr), rtr), id), this.onAttach(rtr, id), this;\r\n }\r\n protected onAttach(_rtr: Reactor<any>, _rid?: ReactorModuleId): void {}\r\n protected attachPaths(rtr: Reactor<any>, rid: ReactorModuleId, paths = this.getPaths(rid)) {\r\n let clups = this.clups.get(rid);\r\n if (!clups) this.clups.set(rid, (clups = []));\r\n for (let i = 0, len = paths.length; i < len; i++) {\r\n const path = paths[i];\r\n !this.config.disabled ? clups.push(this.config.synchronous ? rtr.watch(path, this.handlePathSync, { signal: this.signal }) : rtr.on(path, this.handlePath, this.evtOpts)) : this.config.synchronous ? rtr.nowatch(path, this.handlePathSync) : rtr.off(path, this.handlePath, this.evtOpts);\r\n }\r\n }\r\n\r\n /**\r\n * Entry point called to initialize module wiring, calls `.attach(target, id)` first, `Reactor.use()` calls this internally.\r\n * Should run as last in `.attach()` chain or after all desired reactors if using multiple; so wiring is done safely after.\r\n * @param target `Reactor` instance or `reactive()` object to connect to.\r\n * @param id Optional id for the reactor, prefer over default implicit index id when managing multiple reactors.\r\n * @returns Current `ReactorModule` instance for fluent chaining.\r\n * @example\r\n * const mod = new MyModule().attach(state1).setup(state2); // if using multiple, this should run last; with same params as `.attach()` for a shorter chain\r\n */\r\n public setup(target?: Reactor<any> | Reactive<any>, id?: ReactorModuleId): this {\r\n return this.attach(target, id), !this.wired && (this.wire(), (this.wired = true)), this;\r\n }\r\n /** set up listeners/subscriptions and module runtime wiring. */\r\n public abstract wire(): void;\r\n\r\n public destroy(): void {\r\n if (this.ac) this.ac.abort(), this.onDestroy?.(), nuke(this); // only one rtr can kill; nuke is notorious\r\n }\r\n protected onDestroy?(): void;\r\n\r\n /**\r\n * Wraps a function with module-scoped error logging, every instance methods is already auto-wrapped with this.\r\n * Use this when creating functions dynamically (for example, before attaching an anonymous listener on the fly).\r\n * @example\r\n * window.addEventListener(\"resize\", this.guard(() => this.syncLayout(true)), { signal: this.signal });\r\n */\r\n protected guard = <Fn extends Function>(fn: Fn) => {\r\n return guardMethod(fn, (e) => this.deps.values().next().value?.log(`[Reactor \"${this.name}\" Module] Error: ${e}`)); // treated as seperate log identities\r\n }; // `()=>{}`: needs to be bounded even before initialization\r\n\r\n protected handleWhitelist({ currentTarget: { value: paths } }: any): void {\r\n for (const [rid, rtr] of this.deps) this.cleanup(rid), this.attachPaths(rtr, rid, this.getPaths(rid, paths));\r\n } // child wires when ready\r\n private handlePath(e: any, rid = this.rids.get(e.reactor)!): void {\r\n (!this.config.blacklist || !matchPaths(this.getPaths(rid, this.config.blacklist, true), e.path)) && this.onPath(e, rid);\r\n }\r\n private handlePathSync = (_: any, p: any) => this.handlePath(p);\r\n protected onPath(_e: any, _rid: ReactorModuleId): void {}\r\n\r\n protected handleSynchronous() {\r\n for (const [rid, rtr] of this.deps) this.cleanup(rid), this.attachPaths(rtr, rid);\r\n } // child wires when ready\r\n\r\n private cleanup(rid: ReactorModuleId): void {\r\n const clups = this.clups.get(rid);\r\n if (clups) for (let i = 0, len = clups.length; i < len; i++) clups[i]();\r\n clups && (clups.length = 0);\r\n }\r\n\r\n /**\r\n * Path resolution utility for modules, provides automatic reactor id resolution for multi-reactor setups.\r\n * @param target Reactor or reactor id to resolve paths for when using per-reactor path lists`.\r\n * @param paths Paths to filter by, supports same formats as `ModulePaths`, will be resolved with the module's reactor id if applicable.\r\n * @returns Resolved paths array, defaults to `[\"*\"]` if no paths are found using search criteria.\r\n */\r\n public getPaths<P extends string = string>(target?: Reactor<any> | ReactorModuleId, paths = this.config.whitelist as ModulePaths<P>, allowEmpty = paths !== this.config.whitelist): P[] {\r\n const rid = (target as any)?.core ? this.rids.get(target as Reactor<any>) : target;\r\n return ((paths && (Array.isArray(paths) ? paths : paths[String(rid)])) ?? (!allowEmpty ? wpArr : [])) as P[];\r\n }\r\n\r\n /**\r\n * Compute the serialized payload for all attached reactors.\r\n * If multiple reactors are attached, returns a merged object keyed by reactor id. Honors `whitelist`, `snapshot` and `mirrorWrites` configuration on each reactor.\r\n * @param target Optional target reactor or id to compute payload for, useful when using per-reactor path lists.\r\n * @returns The payload to persist (or `undefined` for empty single-reactor payload).\r\n */\r\n public getPayload(target?: Reactor<any> | ReactorModuleId, _rid?: ReactorModuleId, _nest = target ? false : this.deps.size > 1): any {\r\n const _rtr = (target as any)?.core ? (target as Reactor<any>) : this.deps.get(target as ReactorModuleId)!;\r\n let res: Record<string, any> | undefined = _nest ? {} : undefined;\r\n for (const [rid, rtr] of !target ? this.deps : [[_rid || target, _rtr] as const]) {\r\n const snap = this.config.snapshot ? (this.config.snapshot === true && (rtr.config.referenceTracking = rtr.config.smartCloning = true), rtr.snapshot()) : rtr.core,\r\n val: any = this.config.whitelist ? {} : snap;\r\n if (this.config.whitelist) {\r\n const paths = this.getPaths(rid);\r\n for (let i = 0, len = paths.length; i < len; i++) {\r\n const _path = paths[i],\r\n path = (!this.config.mirrorReads || !_path.includes(\"intent\") ? _path : _path.replace(\"intent\", \"state\")) as any;\r\n setPath(val, _path, getPath(snap, path));\r\n }\r\n }\r\n _nest ? setPath(res!, rid as any, val) : (res = val); // allows merging with path-like ids\r\n }\r\n return res;\r\n }\r\n}\r\n\r\nexport const wpArr = [\"*\"] as any;\r\nexport type * from \"./types\";\r\n","// Types\ntype Dataset = Record<string, string | number>;\ntype Style = Partial<CSSStyleDeclaration>;\n\n// Element Factory\n\n/**\n * Creates an HTML element with the specified tag and properties.\n * @param tag The tag name of the element to create.\n * @param props Optional properties to set on the element.\n * @param dataset Optional dataset attributes for the element.\n * @param styles Optional CSS styles for the element.\n * @returns The created HTML element.\n */\nexport function createEl<K extends keyof HTMLElementTagNameMap>(tag: K, props?: Partial<HTMLElementTagNameMap[K]>, dataset?: Dataset, styles?: Style): HTMLElementTagNameMap[K];\nexport function createEl(tag: string, props?: Partial<HTMLElement>, dataset?: Dataset, styles?: Style): HTMLElement | null;\nexport function createEl(tag: string, props?: Record<string, unknown>, dataset?: Dataset, styles?: Style, el = tag ? document?.createElement(tag) : null): HTMLElement | null {\n return assignEl(el, props, dataset, styles);\n}\n\n/**\n * Assigns properties, dataset attributes, and styles to an HTML element.\n * @param el The HTML element to assign properties to.\n * @param props Optional properties to set on the element.\n * @param dataset Optional dataset attributes for the element.\n * @param styles Optional CSS styles for the element.\n * @return The modified HTML element to allow signature swaps with `createEl()`.\n */\nexport function assignEl<El extends HTMLElement>(el?: El | null, props?: Partial<El>, dataset?: Dataset, styles?: Style, nodiff?: boolean): El | null;\nexport function assignEl<El extends HTMLElement>(el?: El | null, props?: Partial<El>, dataset?: Dataset, styles?: Style, nodiff?: boolean): El | null;\nexport function assignEl(el?: HTMLElement | null, props?: Record<string, unknown>, dataset?: Dataset, styles?: Style, nodiff = true): HTMLElement | null {\n if (!el) return null;\n if (props) for (const k of Object.keys(props)) if (props[k] !== undefined) if (nodiff || (el as any)[k] !== props[k]) (el as unknown as Record<string, unknown>)[k] = props[k];\n if (dataset) for (const k of Object.keys(dataset)) if (dataset[k] !== undefined) if (nodiff || (el.dataset as any)[k] !== dataset[k]) (el.dataset as DOMStringMap)[k] = String(dataset[k]);\n if (styles) for (const k of Object.keys(styles)) if (styles[k as keyof Style] !== undefined) if (nodiff || (el.style as any)[k] !== styles[k as any]) (el.style as unknown as Record<string, unknown>)[k] = styles[k as keyof Style];\n return el;\n}\n\n/** Get the currently active element, traversing into shadow roots if necessary.\n * @param root Root node to start searching from, defaults to the main document.\n * @param noBody If `true`, will return `null` if the active element is the body element.\n * @returns The active element or null if none found.\n */\nexport function getActiveEl(root?: Document | ShadowRoot | null, noBody = true): Element | null {\n const activeEl = (root ?? document).activeElement;\n return !activeEl || (noBody && activeEl === document.body) ? null : activeEl.shadowRoot ? getActiveEl(activeEl.shadowRoot) : activeEl;\n}\n","import { getActiveEl } from \"./dom\";\n\n/** Keyboard matching configuration used by utility helpers. */\nexport interface KeysSettings {\n /** Disables key handling when true. */\n disabled?: boolean;\n /** Combos that should call `preventDefault` when matched. */\n overrides?: string[];\n /** Action map from action id to combo or combo list. */\n shortcuts?: Record<string, string | string[]>;\n /** Combos that should be rejected immediately. */\n blocks?: string[];\n /** Enables exact combo matching instead of subset matching. */\n strictMatch?: boolean;\n /** Ranks shortcut matches by exactness before insertion order. Enabled by default. */\n rankedMatch?: boolean;\n /** Combos that are allowed as pass-through key actions. */\n whitelist?: string[];\n}\n\n/** Canonical key-combo structure used by parser and serializer helpers. */\nexport type KeyStruct = Record<\"ctrlKey\" | \"shiftKey\" | \"altKey\" | \"metaKey\", boolean> & { key: string };\n\n/**\n * Global registry of native browser hotkeys and shortcut combinations, pass as `.blocks` in `Settings` config for `keyEventAllowed()` for better UX.\n * Used by the system to prevent default browser behaviors (e.g., zooming, tab switching, refreshing, or opening dev tools) inside the listener context.\n */\n// prettier-ignore\nexport const KEYS_BLOCKS = [\"Ctrl+Tab\", \"Ctrl+Shift+Tab\", \"Ctrl+PageUp\", \"Ctrl+PageDown\", \"Cmd+Option+ArrowRight\", \"Cmd+Option+ArrowLeft\", \"Ctrl+1\", \"Ctrl+2\", \"Ctrl+3\", \"Ctrl+4\", \"Ctrl+5\", \"Ctrl+6\", \"Ctrl+7\", \"Ctrl+8\", \"Ctrl+9\", \"Cmd+1\", \"Cmd+2\", \"Cmd+3\", \"Cmd+4\", \"Cmd+5\", \"Cmd+6\", \"Cmd+7\", \"Cmd+8\", \"Cmd+9\", \"Alt+ArrowLeft\", \"Alt+ArrowRight\", \"Cmd+ArrowLeft\", \"Cmd+ArrowRight\", \"Ctrl+r\", \"Ctrl+Shift+r\", \"F5\", \"Shift+F5\", \"Cmd+r\", \"Cmd+Shift+r\", \"Ctrl+h\", \"Ctrl+j\", \"Ctrl+d\", \"Ctrl+f\", \"Cmd+y\", \"Cmd+Option+b\", \"Cmd+d\", \"Cmd+f\", \"Ctrl+Shift+i\", \"Ctrl+Shift+j\", \"Ctrl+Shift+c\", \"Ctrl+u\", \"F12\", \"Cmd+Option+i\", \"Cmd+Option+j\", \"Cmd+Option+c\", \"Cmd+Option+u\", \"Ctrl+=\", \"Ctrl+-\", \"Ctrl+0\", \"Cmd+=\", \"Cmd+-\", \"Cmd+0\", \"Ctrl+p\", \"Ctrl+s\", \"Ctrl+o\", \"Cmd+p\", \"Cmd+s\", \"Cmd+o\"], // JIT eats loops :)\n KEYS_MODS = [\"ctrl\", \"shift\", \"alt\", \"meta\"] as const,\n KEYS_CMODS = [\"ctrl\", \"alt\", \"meta\"] as const,\n KEYS_ALIAS: Record<string, string> = { cmd: \"meta\", space: \" \" };\n\n/**\n * Parses a combo string into modifier flags + terminal key.\n * @param combo Key combo string (for example: `\"ctrl+shift+z\"`).\n * @returns Parsed key structure with boolean modifier flags.\n * @example\n * parseKeyCombo(\"ctrl+shift+z\")\n * // => { ctrlKey: true, shiftKey: true, altKey: false, metaKey: false, key: \"z\" }\n */\nexport function parseKeyCombo(combo: string): KeyStruct {\n const parts = cleanKeyCombo(combo).toLowerCase().split(\"+\");\n return { ctrlKey: parts.includes(\"ctrl\"), shiftKey: parts.includes(\"shift\"), altKey: parts.includes(\"alt\"), metaKey: parts.includes(\"meta\") || parts.includes(\"cmd\"), key: parts.find((p) => !/^(ctrl|shift|alt|meta|cmd)$/.test(p)) || \"\" };\n}\n\n/**\n * Serializes a key structure or keyboard event into canonical combo form.\n * @param e KeyboardEvent-like object or parsed key structure.\n * @returns Canonical combo string (for example: `\"ctrl+shift+z\"`).\n */\nexport function stringifyKeyEvent(e: KeyStruct | KeyboardEvent): string {\n const parts: string[] = [];\n e.ctrlKey && parts.push(\"ctrl\"), e.altKey && parts.push(\"alt\"), e.shiftKey && parts.push(\"shift\"), e.metaKey && parts.push(\"meta\"), parts.push(e.key?.toLowerCase() ?? \"\");\n return parts.join(\"+\");\n}\n\n/**\n * Normalizes combo(s) by:\n * - lowercasing,\n * - aliasing `cmd -> meta`, `space -> \" \"`,\n * - preserving literal space/plus edge cases,\n * - sorting modifiers as `ctrl, alt, shift, meta`.\n * @param combo Raw combo or list of combos.\n * @param mods Optional list of modifier keys to sort and filter by (default: `[\"ctrl\", \"shift\", \"alt\", \"meta\"]`).\n * @returns Canonical combo string or list.\n * @example\n * cleanKeyCombo([\"Shift+Alt+Ctrl+Z\", \"cmd+y\"])\n * // => [\"ctrl+shift+alt+z\", \"meta+y\"]\n */\nexport function cleanKeyCombo(combo: string, mods?: string[]): string;\nexport function cleanKeyCombo(combo: string[], mods?: string[]): string[];\nexport function cleanKeyCombo(combo: string | string[], mods: string[] = KEYS_MODS as any): string | string[] {\n const clean = (combo: string): string => {\n if (combo === \" \" || combo === \"+\") return combo;\n combo = combo.replace(/\\+\\s*\\+$/, \"+plus\");\n const p = combo\n .toLowerCase()\n .split(\"+\")\n .filter((k) => k !== \"\")\n .map((k, _, __, tk = k.trim()) => KEYS_ALIAS[tk] || (tk === \"plus\" ? \"+\" : tk || \" \"));\n return [...p.filter((k) => mods.includes(k)).sort((a, b) => mods.indexOf(a) - mods.indexOf(b)), ...(p.filter((k) => !mods.includes(k)) || \"\")].join(\"+\");\n };\n return Array.isArray(combo) ? combo.map(clean) : clean(combo);\n}\n\n/**\n * Determines if actual combo satisfies required combo rule(s).\n * Non-strict mode performs subset matching (required keys must all be present).\n * Strict mode requires exact canonical equality.\n * @param required Required combo or combo list.\n * @param actual Actual combo string.\n * @param strict Whether to require exact match.\n * @param clean Whether to clean the actual combo.\n * @returns `true` when match succeeds.\n */\nexport function matchKeys(required: string | string[], actual: string, strict = false, clean = true): boolean {\n if (clean) actual = cleanKeyCombo(actual);\n const match = (req: string, actual: string): boolean => {\n req = cleanKeyCombo(req);\n if (strict) return req === actual;\n const reqs = req.split(\"+\"),\n reals = actual.split(\"+\");\n for (const mod of KEYS_CMODS) if (reals.includes(mod) && !reqs.includes(mod)) return false; // no unrequested heavy mods\n return reqs.every((k) => reals.includes(k));\n };\n return Array.isArray(required) ? required.some((req) => match(req, actual)) : match(required, actual);\n}\n\n/**\n * Resolves key-combo terms against settings:\n * - override, block, whitelist, and matched action id.\n * @param combo Canonical combo string.\n * @param settings Matching settings.\n * @returns Match resolution record.\n */\nexport function getTermsForKey(combo: string, settings: KeysSettings): { override: boolean; block: boolean; whitelisted: boolean; action: string | null } {\n const terms = { override: false, block: false, whitelisted: false, action: null as string | null },\n { overrides = [], shortcuts = {}, blocks = [], strictMatch: stm = false, rankedMatch: ram = true, whitelist = [] } = settings || {};\n combo = cleanKeyCombo(combo);\n if (matchKeys(overrides, combo, stm, false)) terms.override = true;\n if (matchKeys(blocks, combo, stm, false)) terms.block = true;\n if (matchKeys(whitelist, combo, false)) terms.whitelisted = true;\n if (!ram) return (terms.action = Object.keys(shortcuts).find((id) => shortcuts[id] && matchKeys(shortcuts[id], combo, stm, false)) || null), terms;\n // prettier-ignore\n let bestA: string | null = null, bestE = false, bestL = 0;\n for (const id of Object.keys(shortcuts))\n for (const c of Array.isArray(shortcuts[id]) ? shortcuts[id] : [shortcuts[id]]) {\n // prettier-ignore\n const req = c && cleanKeyCombo(c), isE = req === combo, len = req ? req.split(\"+\").length : 0;\n if (c && matchKeys(req, combo, stm, false) && (!bestA || (isE && !bestE) || (isE === bestE && len > bestL))) (bestA = id), (bestE = isE), (bestL = len);\n }\n return (terms.action = bestA), terms;\n}\n\n/**\n * Evaluates whether a keyboard event is allowed and maps it to an action id.\n * Behavior order:\n * 1. hard gate checks (`disabled`, focused editable, button-space/enter),\n * 2. blocked combos,\n * 3. override combos (`preventDefault`),\n * 4. shortcut action match,\n * 5. whitelist pass-through.\n * @param e Browser keyboard event.\n * @param settings Matching settings.\n * @returns Action id, pass-through key, or `false` when denied.\n */\nexport function keyEventAllowed<const S extends KeysSettings>(e: KeyboardEvent, settings: S): false | (S[\"shortcuts\"] extends object ? keyof S[\"shortcuts\"] : never) | (S[\"whitelist\"] extends readonly string[] ? (string[] extends S[\"whitelist\"] ? never : S[\"whitelist\"][number]) : never) {\n if (settings.disabled) return false;\n const activeEl = getActiveEl((e.target as Node)?.ownerDocument); // shadow DOM proof\n if ((e.key === \" \" || e.key === \"Enter\") && activeEl?.matches(\"button,input[type='button'],input[type='submit']\")) return false;\n if (e.currentTarget !== activeEl && activeEl?.matches(\"input,textarea,[contenteditable],[role]\") && !(e.key === \"Escape\" && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey)) return false;\n const combo = stringifyKeyEvent(e),\n { override, block, action, whitelisted } = getTermsForKey(combo, settings);\n if (block) return false;\n if (override) e.preventDefault();\n if (action) return action as any;\n if (whitelisted) return e.key.toLowerCase() as any;\n return false;\n}\n\n/**\n * Formats one or many combos for human-readable UI labels, prepends \" \" for fluid appending.\n * @param combo Combo or combo list.\n * @param keyFn Function to format each combo.\n * @returns Display label (for example: `\" (ctrl+z) or (meta+z)\"`).\n */\nexport const formatKeyTooltip = (combo: string | string[] = \"\", keyFn = (c = \"\") => cleanKeyCombo(c).replace(\" \", \"space\")): string => {\n const combined = combo?.length ? (Array.isArray(combo) ? combo.map(keyFn).join(\" or \") : keyFn(combo)) : \"\";\n return combined ? ` (${combined})` : \"\";\n};\n\n/**\n * Formats an action-shortcuts map for display labels.\n * @param keyShortcuts Action to combo(s) map.\n * @returns Action to display-label map.\n */\nexport function formatKeyShortcutsTooltip(keyShortcuts: Record<string, string | string[]> = {}, formatter = formatKeyTooltip): Record<string, string> {\n const shortcuts: Record<string, string> = {};\n for (const action of Object.keys(keyShortcuts)) shortcuts[action] = formatter(keyShortcuts[action]);\n return shortcuts;\n}\n\n/**\n * Converts combo text into WAI-ARIA `aria-keyshortcuts` format.\n * @param s Combo text or combo list.\n * @param format Whether to format to tooltip first.\n * @returns Normalized aria-keyshortcuts string.\n * @example\n * parseForARIAKS(\" (ctrl+z) or (meta+z)\")\n * // => \"Control+z Meta+z\"\n * @example\n * parseForARIAKS([\"ctrl+z\", \"meta+z\"], false)\n * // => \"Control+z Meta+z\"\n */\nexport function parseForARIAKS(s: string | string[] = \"\", format = true) {\n const m = { ctrl: \"Control\", cmd: \"Meta\", space: \"Space\", plus: \"+\" };\n return (!format && !Array.isArray(s) ? s : formatKeyTooltip(s))\n .toLowerCase()\n .replace(/[()]/g, \"\") // 1. Remove parens\n .replace(/\\bor\\b/g, \" \") // 2. Replace \"or\" with the REQUIRED space\n .replace(/\\w+/g, (k: any) => m[k as keyof typeof m] || k) // 3. Map keys (ctrl -> Control)\n .replace(/\\s+/g, \" \")\n .trim(); // 4. Cleanup extra spaces\n} // W3 ARIA Key Shortcut\n","import { NIL } from \"@core/consts\";\r\nimport type { EffectOptions } from \"@defs/reactor\";\r\nimport { Autotracker, withTracker } from \"../autotracker\";\r\n\r\n/**\r\n * Runs a reactive side effect in vanilla JavaScript.\r\n * The callback executes immediately, tracks accessed state, and re-runs when\r\n * tracked dependencies change.\r\n * @param callback Effect callback.\r\n * @param options Listener options if `sync: false` else Watcher Options.\r\n * @returns Cleanup function that stops tracking and releases resources.\r\n * @example\r\n * const stop = effect(() => console.log(state.count));\r\n */\r\nexport function effect(callback: () => void, options: EffectOptions = NIL): () => void {\r\n const atrkr = new Autotracker();\r\n let destroyed = false;\r\n const cleanup = () => ((destroyed = true), atrkr.destroy());\r\n (function execute() {\r\n if (destroyed) return;\r\n withTracker(atrkr, callback);\r\n options.once ? cleanup() : atrkr.callback(execute, options);\r\n })();\r\n return cleanup;\r\n}\r\n","import { Reactive, reactive } from \"@core/mixins\";\r\nimport { CTX } from \"@core/consts\";\r\nimport { wpArr } from \"@modules/base\";\r\nimport { TimeTravelModule } from \"@modules/timeTravel\";\r\nimport { createEl } from \"@utils/dom\";\r\nimport { nuke } from \"@utils/obj\";\r\nimport { formatKeyTooltip as formatKFD, keyEventAllowed, KEYS_BLOCKS, parseForARIAKS } from \"@utils/keys\";\r\nimport { effect } from \"./effect\";\r\n\r\nconst keys = {\r\n blocks: KEYS_BLOCKS,\r\n overrides: [\"Ctrl+z\", \"Cmd+z\", \"Ctrl+y\", \"Cmd+y\", \"Ctrl+Shift+z\", \"Cmd+Shift+z\", \"Home\", \"End\", \"ArrowLeft\", \"ArrowRight\", \"Space\", \"Alt+Space\", \"Escape\", \"Delete\"],\r\n shortcuts: { undo: [\"Ctrl+z\", \"Cmd+z\"], redo: [\"Ctrl+y\", \"Cmd+y\", \"Ctrl+Shift+z\", \"Cmd+Shift+z\"], genesis: \"Home\", trackUntrack: \"t\", ending: \"End\", prevFrame: \",\", nextFrame: \".\", playPause: \"Space\", rewind: \"Alt+Space\", closeOverlay: \"Escape\", clrHistory: \"Delete\", export: \"e\", import: \"i\", clear: \"c\" },\r\n};\r\n\r\n/** Reactive options for the TimeTravel overlay instance. */\r\nexport interface TimeTravelConsoleConfig {\r\n /** Header text shown at the top of the overlay panel. */\r\n title: string;\r\n /** Accent color used to derive panel theme variables. */\r\n color: string;\r\n /** Shows the overlay only in development when true. */\r\n devOnly: boolean;\r\n /** Initial open state applied when the overlay is created. */\r\n startOpen: boolean;\r\n /** Container element that owns the overlay layer and dock. */\r\n container?: HTMLElement;\r\n}\r\n\r\n/**\r\n * - Vanilla overlay controller for visual time-travel controls and timeline I/O.\r\n * - Mounts a docked HUD into the configured container, syncs its UI with module state, and forwards keyboard/button actions to the TimeTravelModule.\r\n * Supports reactive `config` updates (title/color/container/devOnly) and maintains local overlay UI state (`open` and `import` payload text).\r\n */\r\nexport class TimeTravelConsole {\r\n public static count = 0;\r\n public index = TimeTravelConsole.count;\r\n public config: Reactive<TimeTravelConsoleConfig>;\r\n public readonly state = reactive({ open: false, import: \"\", stride: 1 });\r\n public readonly time: TimeTravelModule;\r\n public readonly host: HTMLElement;\r\n private clups: Array<() => void> = [];\r\n private keydown: (e: KeyboardEvent) => void;\r\n private keyup: (e: KeyboardEvent) => void;\r\n\r\n /** Creates a docked TimeTravel overlay bound to a module instance.\r\n * @param time TimeTravel module instance that owns timeline operations.\r\n * @param build Optional initial overlay config overrides.\r\n */\r\n constructor(time: TimeTravelModule, build: Partial<TimeTravelConsoleConfig> = { devOnly: true }) {\r\n this.time = time;\r\n this.config = reactive({ title: `Time Travel Console ${(this.index = ++TimeTravelConsole.count)}`, ...build } as TimeTravelConsoleConfig);\r\n this.state.open = !!this.config.startOpen;\r\n let wlLive = false,\r\n blLive = false;\r\n const s = this.time.state,\r\n host = (this.host = createEl(\"div\", { className: \"sia-tt-console-host\" })),\r\n toggle = createEl(\"button\", { className: \"sia-tt-console-toggle\", type: \"button\", onclick: () => (this.state.open = !this.state.open) }),\r\n panel = createEl(\"aside\", { className: \"sia-tt-console\", ariaLabel: \"time travel overlay\" }),\r\n title = createEl(\"div\", { className: \"title\" }),\r\n frame = createEl(\"span\", { className: \"muted\" }),\r\n clrHistory = createEl(\"button\", { textContent: `Clear History${formatKFD(keys.shortcuts!.clrHistory)}`, ariaKeyShortcuts: parseForARIAKS(keys.shortcuts!.clrHistory), onclick: () => (this.time.clear(), (this.state.import = \"\")) }),\r\n undo = createEl(\"button\", { textContent: `Undo${formatKFD(keys.shortcuts!.undo[0])}`, ariaKeyShortcuts: parseForARIAKS(keys.shortcuts!.undo), onclick: () => this.time.undo(this.state.stride) }),\r\n redo = createEl(\"button\", { textContent: `Redo${formatKFD(keys.shortcuts!.redo[0])}`, ariaKeyShortcuts: parseForARIAKS(keys.shortcuts!.redo), onclick: () => this.time.redo(this.state.stride) }),\r\n genesis = createEl(\"button\", { textContent: `Genesis${formatKFD(keys.shortcuts!.genesis)}`, ariaKeyShortcuts: parseForARIAKS(keys.shortcuts!.genesis), onclick: () => this.time.jumpTo(0) }),\r\n playPause = createEl(\"button\", { onclick: () => this.time[s.paused ? \"play\" : \"pause\"](), ariaKeyShortcuts: parseForARIAKS(keys.shortcuts!.playPause) }),\r\n rewind = createEl(\"button\", { textContent: `Rewind${formatKFD(keys.shortcuts!.rewind)}`, ariaKeyShortcuts: parseForARIAKS(keys.shortcuts!.rewind), onclick: this.time.rewind }),\r\n trackUntrack = createEl(\"button\", { onclick: () => this.time[s.tracking ? \"untrack\" : \"track\"](), ariaKeyShortcuts: parseForARIAKS(keys.shortcuts!.trackUntrack) }),\r\n range = createEl(\"input\", { type: \"range\", min: \"0\", title: \"time travel frame\", ariaLabel: \"time travel frame\", oninput: () => this.time.jumpTo(Number(range.value)) }),\r\n exp = createEl(\"button\", { textContent: `Export${formatKFD(keys.shortcuts!.export)}`, ariaKeyShortcuts: parseForARIAKS(keys.shortcuts!.export), onclick: () => (this.state.import = this.time.export(null, 2)) }),\r\n imp = createEl(\"button\", { textContent: `Import${formatKFD(keys.shortcuts!.import)}`, ariaKeyShortcuts: parseForARIAKS(keys.shortcuts!.import), onclick: () => this.state.import.trim().length && this.time.import(this.state.import) }),\r\n clr = createEl(\"button\", { textContent: `Clear${formatKFD(keys.shortcuts!.clear)}`, ariaKeyShortcuts: parseForARIAKS(keys.shortcuts!.clear), onclick: () => (this.state.import = \"\") }),\r\n payload = createEl(\"textarea\", { className: \"sia-tt-io\", readOnly: true, placeholder: \"current payload json\", title: \"Current History Entry\" }),\r\n io = createEl(\"textarea\", { className: \"sia-tt-io\", placeholder: \"timeline payload json\", title: \"Time History\", oninput: () => (this.state.import = io.value) }),\r\n foot = createEl(\"p\", { className: \"sia-tt-footnote\", innerHTML: \"<span>Try this in your app? </span>\" }),\r\n link = createEl(\"a\", { target: \"_blank\", rel: \"noreferrer noopener\", textContent: \"sia-reactor\", href: \"https://www.npmjs.com/package/sia-reactor\" }),\r\n box = createEl(\"div\", { className: \"sia-tt-status-box\" }),\r\n status = createEl(\"div\", { className: \"sia-tt-status-row\" }),\r\n filters = createEl(\"div\", { className: \"sia-tt-status-row\" }),\r\n filterBox = createEl(\"div\", { className: \"sia-tt-status-box\" }),\r\n whitelistLabel = createEl(\"span\", { className: \"muted\", textContent: \"Whitelist:\" }),\r\n blacklistLabel = createEl(\"span\", { className: \"muted\", textContent: \"Blacklist:\" }),\r\n whitelist = createEl(\"input\", { className: \"sia-tt-filter-input sia-tt-io\", placeholder: 'a.b, c.d or {\"0\":[\"a.b\"]}', title: \"Whitelist paths\", onfocus: () => (wlLive = true), onblur: () => ((wlLive = false), (whitelist.value = formatPaths(this.time.config.whitelist, \"*\"))), oninput: (_, parsed: any = parsePaths(whitelist.value)) => parsed !== null && (this.time.config.whitelist = parsed) }),\r\n blacklist = createEl(\"input\", { className: \"sia-tt-filter-input sia-tt-io\", placeholder: 'a.b, c.d or {\"0\":[\"a.b\"]}', title: \"Blacklist paths\", onfocus: () => (blLive = true), onblur: () => ((blLive = false), (blacklist.value = formatPaths(this.time.config.blacklist, \"\"))), oninput: (_, parsed: any = parsePaths(blacklist.value, true)) => parsed !== null && (this.time.config.blacklist = parsed) }),\r\n speed = createEl(\"select\", { className: \"sia-tt-speed\", title: \"Playback Speed\", onchange: () => (this.time.config.playbackRate = Number(speed.value)) }),\r\n stride = createEl(\"input\", { className: \"sia-tt-stride sia-tt-button sia-tt-mini-input\", type: \"number\", min: \"1\", title: \"Skip Stride i.e. how many steps count as one unit\", oninput: () => (this.state.stride = Math.max(1, Number(stride.value) || 1)) }),\r\n stats = createEl(\"span\", { className: \"sia-tt-stats\" }),\r\n limit = createEl(\"input\", { className: \"sia-tt-limit sia-tt-mini-input sia-tt-button\", type: \"number\", min: \"1\", title: \"Maximum number of history entries kept in memory before older entries are discarded.\", oninput: () => (this.time.config.limit = Math.max(1, Number(limit.value) || 1)) }),\r\n delay = createEl(\"input\", { className: \"sia-tt-delay sia-tt-mini-input sia-tt-button\", type: \"number\", min: \"0\", step: \"50\", title: \"Maximum playback delay between timeline frames in milliseconds.\", oninput: () => (this.time.config.maxPlaybackDelay = Math.max(0, Number(delay.value) || 0)) }),\r\n read = createEl(\"label\", { className: \"sia-tt-check\", title: \"When recording intent mutations, read previous values from the matching state path instead of the intent path. Useful for accurate undo reconstruction of intent-driven flows.\" }),\r\n readBox = createEl(\"input\", { type: \"checkbox\", checked: !!this.time.config.mirrorReads, onchange: () => (this.time.config.mirrorReads = readBox.checked) }),\r\n write = createEl(\"label\", { className: \"sia-tt-check\", title: \"During playback and teleportation, mirror state writes into matching intent paths to re-enact the recorded history. Useful for accurate reconstruction of the whole session.\" }),\r\n writeBox = createEl(\"input\", { type: \"checkbox\", checked: !!this.time.config.mirrorWrites, onchange: () => (this.time.config.mirrorWrites = writeBox.checked) }),\r\n filterRow1 = createEl(\"div\", { className: \"sia-tt-filter-row\" }),\r\n filterRow2 = createEl(\"div\", { className: \"sia-tt-filter-row\" }),\r\n row1 = createEl(\"div\", { className: \"sia-tt-row\" }),\r\n row2 = createEl(\"div\", { className: \"sia-tt-row\" }),\r\n row3 = createEl(\"div\", { className: \"sia-tt-row\" }),\r\n row4 = createEl(\"div\", { className: \"sia-tt-row\" }),\r\n row5 = createEl(\"div\", { className: \"sia-tt-row sia-tt-config-row\" });\r\n speed.append(...[0.25, 0.5, 0.75, 1, 1.25, 1.5, 2, 4, 8, 16, 32].map((v) => createEl(\"option\", { value: String(v), textContent: `${v}x` })));\r\n status.append((box.append(frame), box), clrHistory);\r\n filters.append((filterBox.append((filterRow1.append(whitelistLabel, whitelist), filterRow1), (filterRow2.append(blacklistLabel, blacklist), filterRow2)), filterBox));\r\n panel.append(title, status, (row1.append(playPause, rewind, genesis), row1), (row2.append(undo, redo, trackUntrack, stride), row2), payload, (row3.append(speed, range), row3), filters, (row4.append(exp, imp, clr), row4), io, (row5.append(delay, limit, (read.append(readBox, \" Read Mirror\"), read), (write.append(writeBox, \" Write Mirror\"), write)), row5), (foot.prepend(stats), foot.append(link), foot));\r\n this.host.append(toggle, panel);\r\n this.keydown = (e, can = this.state.open && (this.config.devOnly ? CTX.isDevEnv : true), a = can && keyEventAllowed(e, keys)) => (a && e.stopImmediatePropagation(), a === \"undo\" ? this.time.undo(this.state.stride) : a === \"redo\" ? this.time.redo(this.state.stride) : a === \"genesis\" ? this.time.jumpTo(0) : a === \"trackUntrack\" ? this.time[s.tracking ? \"untrack\" : \"track\"]() : a === \"ending\" ? this.time.jumpTo(s.history.length) : a === \"prevFrame\" ? this.time.step(this.state.stride, false) : a === \"nextFrame\" ? this.time.step(this.state.stride, true) : a === \"rewind\" ? this.time.rewind() : a === \"playPause\" ? this.time[s.paused ? \"play\" : \"pause\"]() : a === \"clrHistory\" ? this.time.clear() : a === \"closeOverlay\" ? (this.state.open = false) : a === \"export\" ? (this.state.import = this.time.export()) : a === \"import\" ? this.state.import.trim().length && this.time.import(this.state.import) : a === \"clear\" && (this.state.import = \"\"));\r\n this.keyup = (e, can = this.state.open && (this.config.devOnly ? CTX.isDevEnv : true), a = can && keyEventAllowed(e, keys)) => a && e.stopImmediatePropagation();\r\n window.addEventListener(\"keydown\", this.keydown), window.addEventListener(\"keyup\", this.keyup);\r\n const sync = [\r\n effect(() => (this.config.color ? host.style.setProperty(\"--sia-tt-color\", this.config.color) : host.style.removeProperty(\"--sia-tt-color\"))),\r\n effect(() => {\r\n if (this.config.devOnly && !CTX.isDevEnv) return void host.remove();\r\n const dock = getDock(this.config.container);\r\n if (host.parentNode !== dock) dock.appendChild(host);\r\n }),\r\n effect(() => (toggle.textContent = `${(panel.hidden = !this.state.open) ? \"Show\" : \"Hide\"} ${(title.textContent = this.config.title ?? \"\")}`)),\r\n effect(() => (playPause.textContent = `${s.paused ? \"Play\" : \"Pause\"}${formatKFD(keys.shortcuts!.playPause)}`)),\r\n effect(() => (trackUntrack.textContent = `${s.tracking ? \"Untrack\" : \"Track\"}${formatKFD(keys.shortcuts!.trackUntrack)}`)),\r\n effect((sets = 0, txs = 0) => {\r\n range.max = String(s.history.length);\r\n range.disabled = clrHistory.disabled = !s.history.length;\r\n for (let i = 0, len = s.history.length; i < len; i++) {\r\n const frame = s.history[i];\r\n \"nodes\" in frame ? txs++ : frame.type === \"set\" && sets++;\r\n }\r\n stats.textContent = `Sets: ${sets} | Deletes: ${s.history.length - sets - txs} | Txs: ${txs}`;\r\n }),\r\n effect(() => {\r\n frame.textContent = `Frame: ${s.currentFrame} / ${s.history.length}`;\r\n genesis.disabled = undo.disabled = !this.time.canUndo;\r\n rewind.disabled = !s.paused || !s.currentFrame;\r\n playPause.disabled = redo.disabled = !this.time.canRedo;\r\n range.value = String(Math.min(s.currentFrame, s.history.length));\r\n payload.value = JSON.stringify(s.currentFrame ? s.history[s.currentFrame - 1] : { genesis: true, value: s.initialState }, null, 2);\r\n }),\r\n effect(() => {\r\n clr.disabled = imp.disabled = !this.state.import.trim().length;\r\n io.value !== this.state.import && (io.value = this.state.import);\r\n }),\r\n effect((v = String(this.time.config.playbackRate)) => v !== speed.value && (speed.value = v)),\r\n effect((v = String(this.state.stride)) => v !== stride.value && (stride.value = v)),\r\n effect((v = String(this.time.config.limit)) => v !== limit.value && (limit.value = v)),\r\n effect((v = String(this.time.config.maxPlaybackDelay)) => v !== delay.value && (delay.value = v)),\r\n effect((v = !!this.time.config.mirrorReads) => v !== readBox.checked && (readBox.checked = v)),\r\n effect((v = !!this.time.config.mirrorWrites) => v !== writeBox.checked && (writeBox.checked = v)),\r\n effect(() => (!wlLive && (whitelist.value = formatPaths(this.time.config.whitelist, \"*\")), !blLive && (blacklist.value = formatPaths(this.time.config.blacklist, \"\")))),\r\n ];\r\n this.clups.push(...sync);\r\n }\r\n\r\n destroy() {\r\n for (const clup of this.clups) clup();\r\n window.removeEventListener(\"keydown\", this.keydown), window.removeEventListener(\"keyup\", this.keyup);\r\n this.host.remove(), nuke(this), --TimeTravelConsole.count;\r\n }\r\n}\r\n\r\nfunction getDock(container?: HTMLElement) {\r\n const host = container && container !== document.documentElement ? container : document.body;\r\n if (host !== document.body && getComputedStyle(host).position === \"static\") host.style.position = \"relative\";\r\n const layer = host.querySelector(\":scope > .sia-tt-console-layer\") || createEl(\"div\", { className: \"sia-tt-console-layer\" }, undefined, { position: host === document.body ? \"fixed\" : \"absolute\" });\r\n if (layer.parentElement !== host) host.appendChild(layer);\r\n const dock = layer.querySelector(\":scope > .sia-tt-console-dock\") || createEl(\"div\", { className: \"sia-tt-console-dock\" });\r\n return dock.parentElement !== layer && layer.appendChild(dock), dock;\r\n}\r\nfunction formatPaths(paths: unknown, emptyText: string): string {\r\n return !paths ? emptyText : Array.isArray(paths) ? (paths.length ? paths.join(\", \") : emptyText) : \"object\" === typeof paths ? JSON.stringify(paths) : String(paths);\r\n}\r\nfunction parsePaths(raw: string, allowEmpty = false): unknown {\r\n const text = raw.trim();\r\n if (!text) return allowEmpty ? undefined : wpArr;\r\n if (text[0] === \"{\")\r\n try {\r\n const parsed = JSON.parse(text);\r\n if (parsed && \"object\" === typeof parsed) return parsed;\r\n } catch {\r\n return null; // invalid JSON resets to last valid\r\n }\r\n // prettier-ignore\r\n const list = text.split(\",\").map((p) => p.trim()).filter(Boolean);\r\n return list.length ? list : allowEmpty ? undefined : wpArr;\r\n}\r\n"],"mappings":"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","names":["TimeTravelConsole","import_react","keys","key","keys","key","target","result","keys","import_react","import_react","import_react","combo","actual","frame","TimeTravelConsole"]}
1
+ {"version":3,"sources":["../../src/ts/adapters/react.ts","../../src/ts/adapters/react/hooks/useReactor.ts","../../src/ts/adapters/react/utils.ts","../../src/ts/core/consts.ts","../../src/ts/utils/obj.ts","../../src/ts/core/event.ts","../../src/ts/core/reactor.ts","../../src/ts/core/mixins.ts","../../src/ts/adapters/autotracker.ts","../../src/ts/adapters/react/hooks/useSelector.ts","../../src/ts/adapters/react/hooks/usePath.ts","../../src/ts/adapters/react/TimeTravelConsole.tsx","../../src/ts/modules/base/index.ts","../../src/ts/utils/dom.ts","../../src/ts/utils/keys.ts","../../src/ts/adapters/vanilla/effect.ts","../../src/ts/adapters/vanilla/TimeTravelConsole.ts"],"sourcesContent":["export { useReactor, useAnyReactor, useReactorSnapshot } from \"./react/hooks/useReactor\";\r\n\r\nexport { useSelector, useAnySelector, useSelectorSnapshot } from \"./react/hooks/useSelector\";\r\n\r\nexport { usePath } from \"./react/hooks/usePath\";\r\n\r\nexport { useISOLayoutEffect } from \"./react/utils\";\r\n\r\nexport { type TimeTravelConsoleProps, TimeTravelConsole } from \"./react/TimeTravelConsole\";\r\n","import { useRef, useCallback, useSyncExternalStore, useMemo } from \"react\";\r\nimport { useISOLayoutEffect } from \"../utils\";\r\nimport { CTX, NIL, NOOP } from \"@core/consts\";\r\nimport { Reactor } from \"@core/reactor\";\r\nimport { type Reactive, getReactor } from \"@core/mixins\";\r\nimport type { EffectOptions, ReactorBuild } from \"@defs/reactor\";\r\nimport type { DeepReadonly } from \"@defs/obj\";\r\nimport { Autotracker } from \"../../autotracker\";\r\n\r\n/**\r\n * Subscribes a component to desired Reactor state and returns it.\r\n * The hook uses access tracking so re-renders occur only when accessed fields change.\r\n * @typeParam T Root state object type.\r\n * @param target Reactive object, Reactor instance, or plain object.\r\n * @param options Watcher options if `options.sync: false` else Listener options.\r\n * @param build Optional Reactor build options used when creating a scoped Reactor for plain objects.\r\n * @returns State for render usage if state is scoped locally or just desired.\r\n * @example\r\n * const a = useReactor({ user: { name: \"Kosi\" } }); // per-component scoped\r\n * @example\r\n * const state = reactive({ user: { name: \"Kosi\" } });\r\n * const b = useReactor(state);\r\n * @example\r\n * const rtr = new Reactor({ user: { name: \"Kosi\" } });\r\n * const c = useReactor(rtr);\r\n */\r\nexport function useReactor<T extends object>(target: T | Reactor<T> | Reactive<T>, options: EffectOptions = NIL, build?: ReactorBuild<T>): T {\r\n const versionRef = useRef(0),\r\n tgtRef = useRef<T | Reactor<T> | Reactive<T>>(), // HMR Survival\r\n rtrRef = useRef<Reactor<T>>(),\r\n rtr = tgtRef.current !== target || !rtrRef.current ? ((tgtRef.current = target), (rtrRef.current = getReactor(target, true, build))) : rtrRef.current,\r\n atrkrRef = useRef<Autotracker<T>>(),\r\n prevTrkr = CTX.autotracker,\r\n atrkr = (CTX.autotracker = atrkrRef.current ||= new Autotracker()),\r\n optsRef = useRef(options),\r\n notifyRef = useRef<() => void>(NOOP); // The uSES trigger bridge\r\n optsRef.current = options; // preventing staleness\r\n atrkr.unblock(rtr), queueMicrotask(() => CTX.autotracker === atrkr && (CTX.autotracker = prevTrkr)); // in case of abort\r\n const subscribe = useCallback((notify: () => void) => atrkr.callback((notifyRef.current = () => (versionRef.current++, notify()))), [atrkr]);\r\n const getSnapshot = useCallback(() => versionRef.current, []);\r\n useSyncExternalStore(subscribe, getSnapshot, getSnapshot); // Feed React a primitive number to track tearing, zero cloning.\r\n return useISOLayoutEffect(() => ((CTX.autotracker = prevTrkr), atrkr.callback(notifyRef.current, optsRef.current)), [atrkr]), rtr.core;\r\n}\r\n\r\n/**\r\n * Subscribes a component to any Reactor state.\r\n * The hook uses access tracking so re-renders occur only when accessed fields change.\r\n * @param options Watcher options if `options.sync: false` else Listener options.\r\n * @example\r\n * useAnyReactor();\r\n */\r\nexport function useAnyReactor(options: EffectOptions = NIL): void {\r\n const versionRef = useRef(0),\r\n atrkrRef = useRef<Autotracker<any>>(),\r\n prevTrkr = CTX.autotracker,\r\n atrkr = (CTX.autotracker = atrkrRef.current ||= new Autotracker()), // assigned after to avoid waste of new instances\r\n optsRef = useRef(options),\r\n notifyRef = useRef<() => void>(NOOP);\r\n optsRef.current = options; // preventing staleness\r\n atrkr.unblock(), queueMicrotask(() => CTX.autotracker === atrkr && (CTX.autotracker = prevTrkr)); // in case of abort\r\n const subscribe = useCallback((notify: () => void) => atrkr.callback((notifyRef.current = () => (versionRef.current++, notify()))), [atrkr]);\r\n const getSnapshot = useCallback(() => versionRef.current, []);\r\n useSyncExternalStore(subscribe, getSnapshot, getSnapshot); // Feed React a primitive number to track tearing, zero cloning.\r\n useISOLayoutEffect(() => ((CTX.autotracker = prevTrkr), atrkr.callback(notifyRef.current, optsRef.current)), [atrkr]);\r\n}\r\n\r\n/**\r\n * Subscribes a component to Reactor state and returns a readonly tracked snapshot.\r\n * Rule of thumb: read from snapshots, mutate the source.\r\n * The hook uses access tracking so re-renders occur only when accessed fields change.\r\n * @typeParam T Root state object type.\r\n * @param target Reactive object, Reactor instance, or plain object.\r\n * @param options Watcher options if `options.sync: false` else Listener options.\r\n * @param build Optional Reactor build options used when creating a scoped Reactor for plain objects.\r\n * @returns Tracked snapshot snap for render usage.\r\n * @example\r\n * const a = useReactorSnapshot({ user: { name: \"Kosi\" } }); // per-component scoped\r\n * @example\r\n * const state = reactive({ user: { name: \"Kosi\" } });\r\n * const b = useReactorSnapshot(state);\r\n * @example\r\n * const rtr = new Reactor({ user: { name: \"Kosi\" } });\r\n * const c = useReactorSnapshot(rtr);\r\n */\r\nexport function useReactorSnapshot<T extends object>(target: T | Reactor<T> | Reactive<T>, options?: EffectOptions, build: ReactorBuild<T> = { referenceTracking: true, smartCloning: true }): DeepReadonly<T> {\r\n const tgtRef = useRef<T | Reactor<T> | Reactive<T>>(),\r\n rtrRef = useRef<Reactor<T>>(),\r\n rtr = tgtRef.current !== target || !rtrRef.current ? ((tgtRef.current = target), (rtrRef.current = getReactor(target, true, build))) : rtrRef.current,\r\n atrkrRef = useRef<Autotracker<T>>(),\r\n atrkrRtrRef = useRef<Reactor<T>>(),\r\n atrkr = atrkrRtrRef.current !== rtr || !atrkrRef.current ? ((atrkrRtrRef.current = rtr), (atrkrRef.current = new Autotracker(rtr))) : atrkrRef.current,\r\n notifyRef = useRef<() => void>(NOOP),\r\n optsRef = useRef(options);\r\n rtr.config.referenceTracking = rtr.config.smartCloning = true;\r\n optsRef.current = options; // preventing staleness\r\n const subscribe = useCallback((notify: () => void) => (atrkr.callback((notifyRef.current = notify), optsRef.current), () => atrkr.cleanup()), [atrkr]);\r\n const getSnapshot = () => rtr.snapshot();\r\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\r\n const proxy = useMemo(() => atrkr.tracked(snapshot), [atrkr, snapshot]);\r\n return useISOLayoutEffect(() => atrkr.callback(notifyRef.current, optsRef.current), [atrkr, proxy]), proxy;\r\n} // Nothing much here, just rebuilding \"Valtio.js\" `useSnapshot`, Proof of Concept: Reactor is a core of cores\r\n","import { useLayoutEffect, useEffect } from \"react\";\r\n\r\n/** Isomorphic layout effect alias (`useLayoutEffect` in browser, `useEffect` otherwise). */\r\nexport const useISOLayoutEffect = \"undefined\" !== typeof window ? useLayoutEffect : useEffect;\r\n","import { ReactorBuild, ReactorMeta } from \"@defs/reactor\";\r\nimport { Autotracker } from \"@adapters/autotracker\";\r\n\r\n// ===========================================================================\r\n// The S.I.A (State & Intent Architecture) Constants\r\n// ===========================================================================\r\n\r\n/** Marker to access underlying raw object from a proxy. */\r\nexport const RAW: unique symbol = Symbol.for(\"S.I.A_RAW\"); // \"Get Original Obj\" Marker\r\n/** Marker to opt an object out of reactor proxy handling. */\r\nexport const INERTIA: unique symbol = Symbol.for(\"S.I.A_INERTIA\"); // \"No Proxy\" Marker\r\n/** Marker to mark a branch as intent (rejectable). */\r\nexport const REJECTABLE: unique symbol = Symbol.for(\"S.I.A_REJECTABLE\"); // \"State Vs. Intent\" Marker\r\n/** Marker to enable indifference/non-equality semantics for a branch. */\r\nexport const INDIFFABLE: unique symbol = Symbol.for(\"S.I.A_INDIFFABLE\"); // \"Equality Tracking\" Marker\r\n/** Sentinel return value that terminates a mediated operation. */\r\nexport const TERMINATOR: unique symbol = Symbol.for(\"S.I.A_TERMINATOR\"); // \"Obj Operation Terminator\" Marker\r\n/** Internal mutation version marker. */\r\nexport const VERSION: unique symbol = Symbol.for(\"S.I.A_VERSION\"); // \"Obj Mutation Count\" Marker\r\n/** Internal snapshot version marker used by smart cloning. */\r\nexport const SSVERSION: unique symbol = Symbol.for(\"S.I.A_SNAPSHOT_VERSION\"); // \"Obj Snapshot Version\" Marker\r\n/** Default batching scheduler used by the reactor runtime. */\r\nexport const RTR_BATCH = \"undefined\" !== typeof window ? (\"undefined\" !== typeof queueMicrotask ? queueMicrotask : setTimeout).bind(window) : \"undefined\" !== typeof process && process.nextTick ? process.nextTick : setTimeout;\r\n/** Default reactor logger prefix function. */\r\nexport const RTR_LOG = console.log.bind(console, \"[S.I.A Reactor]\");\r\n/** Canonical option keys parsed for listener and mediator registrations. */\r\nexport const EVT_OPTS = { LISTENER: [\"capture\", \"depth\", \"once\", \"signal\", \"init\"], MEDIATOR: [\"lazy\", \"signal\", \"init\"] } as const;\r\n/** Frozen empty object used as a zero-allocation default options value. */\r\nexport const NIL = Object.freeze({}) as any; // empty obj to escape any optional chain overhead\r\n/** Shared no-operation function. */\r\nexport const NOOP = () => {}; // no operation function to escape optional chain overhead\r\n\r\nlet isDevEnv = false;\r\ntry {\r\n isDevEnv = process.env.NODE_ENV !== \"production\";\r\n} catch (e) {}\r\nconst CTX_BUILD = {\r\n /** Flag indicating whether the application is running in development mode. */\r\n isDevEnv,\r\n /** Flag indicating whether an operation is bypassing checks so reactors can allow all writes. */\r\n usingForce: false,\r\n /** Active `Autotracker` instance, override for automatic dependency collection on `Reactor` traps. */\r\n autotracker: null as Autotracker<any> | null,\r\n /** Extensible meta context for payloads and cross-cutting concerns. */\r\n meta: null as ReactorMeta | null,\r\n /** Default configuration for new `Reactor` instances and also fallback for utils that need and are called without these options. */\r\n defaults: {\r\n crossRealms: false,\r\n smartCloning: false,\r\n eventBubbling: true,\r\n eventCapturing: \"auto\",\r\n lineageTracing: false,\r\n preserveContext: false,\r\n equalityFunction: Object.is,\r\n batchingFunction: RTR_BATCH,\r\n } as Partial<ReactorBuild<any>>,\r\n};\r\n\r\n/** Global context object for sharing state across the reactor runtime. */\r\nexport const CTX: typeof CTX_BUILD = ((globalThis as any)[Symbol.for(\"S.I.A_CTX\")] ??= CTX_BUILD);\r\n","import { CTX, NIL, INERTIA } from \"@core/consts\";\r\nimport { ReactorEvent } from \"@core/event\";\r\nimport type { Pure } from \"@core/mixins\";\r\nimport { Payload, Reactor, ReactorMeta } from \"@defs/reactor\";\r\nimport { getReactor } from \"@core/mixins\";\r\nimport type { DeepMerge, Unflatten, WildPaths, PathValue, PathBranchValue, ChildPaths, MaxDepth, Paths, DeepPartial } from \"@defs/obj\";\r\nimport { transaction, txId } from \"@modules/timeTravel/transaction\";\r\n\r\nexport let arrRegex = /^([^\\[\\]]+)\\[(\\d+)\\]$/;\r\n\r\n// Type Guards\r\n\r\n/** Checks if a value type is an object for common use cases. */\r\nexport function isObj<T extends object = object>(obj: any, arraycheck = true): obj is T {\r\n return \"object\" === typeof obj && obj !== null && (arraycheck ? !Array.isArray(obj) : true);\r\n} // okay for common use cases but loose\r\n/** Checks if a value is a \"Plain Old Javascript Object\". */\r\nexport function isPOJO<T extends object = object>(obj: any, config: { crossRealms?: boolean } = CTX.defaults, typecheck = true): obj is T {\r\n return (typecheck ? isObj(obj, false) : true) && (config.crossRealms ? Object.prototype.toString.call(obj) === \"[object Object]\" : obj.constructor === Object);\r\n} // for strict own POJOs, handles cross-realm objects too\r\n\r\n/** Returns whether a value can be proxied by the reactor runtime. */\r\nexport function canHandle(obj: any, config: { crossRealms?: boolean; preserveContext?: boolean } = CTX.defaults, typecheck = true): boolean {\r\n if ((typecheck && !isObj(obj, false)) || (obj as any)[INERTIA]) return false;\r\n if (Array.isArray(obj) || (!config.preserveContext && isPOJO(obj, config, false))) return true;\r\n if (config.preserveContext) return !(obj instanceof String) && !(obj instanceof Number) && !(obj instanceof Function) && !(obj instanceof Date) && !(obj instanceof Error) && !(obj instanceof RegExp) && !(obj instanceof Promise) && !(obj instanceof Map) && !(obj instanceof WeakMap) && !(obj instanceof Set) && !(obj instanceof WeakSet) && !(obj instanceof EventTarget); // matching types\r\n return false;\r\n} // universal proxy gate for all reactive logic\r\n\r\n// Deep Manipulation\r\n\r\n/**\r\n * Gets a value by path.\r\n * @example\r\n * const state = { user: { profile: { name: \"Kosi\" } } };\r\n * const name = getPath(state, \"user.profile.name\");\r\n */\r\nexport function getPath<T extends object, const S extends string = \".\", P extends WildPaths<T, S> = WildPaths<T, S>>(source: T, key: P, separator: S = \".\" as S, keyFn?: (p: string) => string): PathValue<T, P, S> {\r\n if (key === \"*\") return source as any;\r\n const keys = key.split(separator);\r\n let currObj: any = source;\r\n for (let i = 0, len = keys.length; i < len; i++) {\r\n const key = keyFn ? keyFn(keys[i]) : keys[i],\r\n match = key.includes(\"[\") && key.match(arrRegex);\r\n if (match) {\r\n const [, key, iStr] = match;\r\n if (!Array.isArray(currObj[key]) || !(key in currObj)) return currObj[key];\r\n currObj = currObj[key][Number(iStr)];\r\n } else {\r\n if (!isObj<Record<string, any>>(currObj) || !(key in currObj)) return currObj[key];\r\n currObj = currObj[key];\r\n }\r\n }\r\n return currObj;\r\n}\r\n\r\n/**\r\n * Sets a value by path.\r\n * @example\r\n * const state = { user: { profile: { name: \"Kosi\" } } };\r\n * setPath(state, \"user.profile.name\", \"Grace\");\r\n * @example\r\n * const state = { users: [] as Array<{ name?: string }> };\r\n * setPath(state, \"users.0.name\", \"Kosi\"); // use `[n]` for arrays if uncertain so the indexes are not treated as object keys, i.e. { \"0\": { name: \"Kosi\" } } instead of { users: [ { name: \"Kosi\" } ] }\r\n */\r\nexport function setPath<T extends object, const S extends string = \".\", P extends WildPaths<T, S> = WildPaths<T, S>>(target: T, key: P, value: PathValue<T, P, S>, separator: S = \".\" as S, keyFn?: (p: string) => string): void {\r\n if (key === \"*\") return Object.assign(target, value);\r\n const keys = key.split(separator);\r\n for (let currObj: any = target, i = 0, len = keys.length; i < len; i++) {\r\n const key = keyFn ? keyFn(keys[i]) : keys[i],\r\n match = key.includes(\"[\") && key.match(arrRegex);\r\n if (match) {\r\n const [, key, iStr] = match;\r\n if (!Array.isArray(currObj[key])) currObj[key] = [];\r\n if (i === len - 1) currObj[key][Number(iStr)] = value;\r\n else (currObj[key][Number(iStr)] ||= {}), (currObj = currObj[key][Number(iStr)]);\r\n } else {\r\n if (i === len - 1) currObj[key] = value;\r\n else (currObj[key] ||= {}), (currObj = currObj[key]);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Deletes a value by path.\r\n * @example\r\n * const state = { user: { profile: { name: \"Kosi\" } } };\r\n * deletePath(state, \"user.profile.name\");\r\n */\r\nexport function deletePath<T extends object, const S extends string = \".\", P extends WildPaths<T, S> = WildPaths<T, S>>(target: T, key: P, separator: S = \".\" as S, keyFn?: (p: string) => string): void {\r\n if (key === \"*\") {\r\n const keys = Object.keys(target);\r\n for (let i = 0, len = keys.length; i < len; i++) delete (target as any)[keys[i]];\r\n return;\r\n }\r\n const keys = key.split(separator);\r\n for (let currObj: any = target, i = 0, len = keys.length; i < len; i++) {\r\n const key = keyFn ? keyFn(keys[i]) : keys[i],\r\n match = key.includes(\"[\") && key.match(arrRegex);\r\n if (match) {\r\n const [, key, iStr] = match;\r\n if (!Array.isArray(currObj[key]) || !(key in currObj)) return;\r\n if (i === len - 1) delete currObj[key][Number(iStr)];\r\n else currObj = currObj[key][Number(iStr)];\r\n } else {\r\n if (!isObj<Record<string, any>>(currObj) || !(key in currObj)) return;\r\n if (i === len - 1) delete currObj[key];\r\n else currObj = currObj[key];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Checks whether a path exists.\r\n * @example\r\n * const state = { user: { profile: { name: \"Kosi\" } } };\r\n * const ok = hasPath(state, \"user.profile.name\"); // default loose typing due to it's usecase\r\n */\r\nexport function hasPath<T extends object, const S extends string = \".\", P extends string = string>(source: T, key: P, separator: S = \".\" as S, keyFn?: (p: string) => string): boolean {\r\n if (key === \"*\") return true;\r\n const keys = key.split(separator);\r\n for (let currObj: any = source, i = 0, len = keys.length; i < len; i++) {\r\n const key = keyFn ? keyFn(keys[i]) : keys[i],\r\n match = key.includes(\"[\") && key.match(arrRegex);\r\n if (match) {\r\n const [, key, iStr] = match;\r\n if (!Array.isArray(currObj[key]) || !(key in currObj)) return false;\r\n if (i === len - 1) return true;\r\n currObj = currObj[key][Number(iStr)];\r\n } else {\r\n if (!isObj<Record<string, any>>(currObj) || !(key in currObj)) return false;\r\n if (i === len - 1) return true;\r\n currObj = currObj[key];\r\n }\r\n }\r\n return true;\r\n}\r\n\r\n/**\r\n * Converts flattened keys into nested object structure.\r\n * @example\r\n * const flat = { \"user.name\": \"Kosi\", \"user.role\": \"admin\" };\r\n * const obj = parsePathObj(flat);\r\n */\r\nexport function parsePathObj<T extends Record<string, any>, const S extends string = \".\">(obj: T, separator: S = \".\" as S, keyFn = (p: string) => p, seen = new WeakSet()): Unflatten<T, S> {\r\n if (!isPOJO(obj) || seen.has(obj)) return obj as Unflatten<T, S>; // no circular references\r\n seen.add(obj);\r\n const result: any = {},\r\n keys = Object.keys(obj);\r\n for (let i = 0, len = keys.length; i < len; i++) {\r\n const key: any = keys[i],\r\n val: any = obj[key];\r\n key === \"*\" || key.includes(separator) ? setPath(result, key, parsePathObj(val, separator, keyFn, seen), separator, keyFn) : (result[key] = isPOJO(val) ? parsePathObj(val, separator, keyFn, seen) : val);\r\n }\r\n return result as Unflatten<T, S>;\r\n}\r\n\r\n/** Fast array scanner. Checks if a target path exactly matches or is a child of any path in the provided array. */\r\nexport function matchPaths(paths: Array<string | RegExp>, target: string): boolean {\r\n for (let i = 0, len = paths.length; i < len; i++) {\r\n const p = paths[i];\r\n if (typeof p !== \"string\" ? p.test(target) : target === p || target.startsWith(p + \".\")) return true;\r\n }\r\n return false;\r\n}\r\n\r\n/** Counts the depth(number of dot(s)) in a path in the most optimized way possible. */\r\nexport function getDepth(path: string, depth = !path ? 0 : 1): number {\r\n for (let i = 0, len = path.length; i < len; i++) if (path.charCodeAt(i) === 46) depth++; // zero alloc; so when we say it's optmized, it's not cap :)\r\n return depth;\r\n}\r\n\r\n/** Normalizes boolean/object event options into a single options object. */\r\nexport function parseEvtOpts<T extends object, const K extends (keyof T)[] | readonly (keyof T)[], const O extends K[number] = K[0]>(options: T | boolean | undefined, opts: K, boolOpt: O = opts[0] as O, result = {} as T): T & { [P in O]-?: T[P] } {\r\n return Object.assign(result, \"boolean\" === typeof options ? { [boolOpt]: options } : options), result as T & { [P in O]-?: T[P] };\r\n}\r\n\r\n// Merging & Traversal\r\n\r\nexport interface FanoutOptionsTuple extends Partial<Record<(typeof fanoutOptsArr)[number], any>> {\r\n /** Whether to merge values before fanout, useful for patching usecases. @default `false`. */\r\n merge?: boolean;\r\n /** How many levels to fan out, set based on your listener paths max dots. `true` is `Infinity`. @default `1` for event cascading otherwise `Infinity`. */\r\n depth?: number | boolean;\r\n /** Whether to assign arrays as a whole and only touch `.length` for common cases. Only works with the `path` parameter overload or in nested levels.\r\n * Arrays can lead to unnecessary work as more often than not, you won't be watching index paths but waiting on the parent bubble instead.\r\n * If you happen to be watching, it might be more optimal to re-set it yourself if it's only a few indexes or just set this to `false`. @default `true` */\r\n atomic?: boolean;\r\n /** Whether to skip `undefined` values during fanout. @default `false`. */\r\n skipUndef?: boolean;\r\n /** Whether to clone before setting any final values, prevents unintended reference sharing across the state tree. @default `false`. */\r\n cloneSets?: boolean;\r\n /** A label for the transaction that will be started, useful for debugging and tracking. @default `Fanout -> \"${path}\"` : `Fanout`} (Tx ${CTX.txId})`. */\r\n txLabel?: string;\r\n}\r\n/**\r\n * Unified expansion utility.\r\n * Bridges Coarse (Immutable replacement) writes into Fine-grained (Reactive) writes by surgically\r\n * expanding a single object write into multiple granular child operations for deep optimal bubbling.\r\n * @example\r\n * // Event Mode (Cascading after-write)\r\n * rtr.on(\"user\", (e) => fanout(e, { depth: 1 })); // defaults to 1 level deep for events\r\n * @example\r\n * // Direct Mode (Patching before-write)\r\n * fanout(state.user, { session: { id: 1, name: \"Kosi\", role: \"admin\" } }, { depth: Infinity }); // default to `Infinity` here\r\n */\r\nexport function fanout<T extends object>(target: T, value?: Partial<T> | Partial<Pure<T>> | DeepPartial<T> | DeepPartial<Pure<T>>, options?: { crossRealms?: boolean } & FanoutOptionsTuple): void;\r\nexport function fanout<T extends object>(event: ReactorEvent<T> | Payload<T>, options?: { crossRealms?: boolean } & FanoutOptionsTuple): void;\r\nexport function fanout<T extends object, P extends WildPaths<T> = WildPaths<T>>(state: T, path: P, value: Partial<PathValue<T, P>> | DeepPartial<PathValue<T, P>>, options?: { crossRealms?: boolean } & FanoutOptionsTuple): void;\r\nexport function fanout(a: any, b?: any, c?: any, d?: any): void {\r\n const isEvPd = !!a?.target,\r\n isPath = !isEvPd && \"string\" === typeof b,\r\n [state, path, olds, news, opts, type] = isEvPd ? [a.root, a.currentTarget.path, a.currentTarget.oldValue, a.currentTarget.value, b || NIL, a.type] : isPath ? [a, b, getPath(a, b), c, d || NIL, undefined] : [undefined, undefined, a, b || a, c || NIL, undefined],\r\n target = isEvPd ? getPath(a.root, a.currentTarget.path) : isPath ? getPath(state, path) : olds; // to avoid stale refs during write-walk\r\n if ((isEvPd && type !== \"set\" && type !== \"delete\") || !target || !canHandle(news, opts)) return;\r\n const { merge = false, depth, atomic = true, skipUndef = false, cloneSets = false, txLabel } = opts;\r\n const func = () => {\r\n const walk = (target: any, obj: any, depth = isEvPd ? 1 : Infinity, keys = Object.keys(obj)) => {\r\n for (let i = 0, len = keys.length; i < len; i++) {\r\n const key = keys[i],\r\n val = obj[key];\r\n try {\r\n if (atomic && Array.isArray(val)) (target[key] = cloneSets ? deepClone(val) : val), (target[key].length = target[key].length); // ping commoners\r\n else depth > 1 && canHandle(val, opts) ? walk((target[key] ||= Array.isArray(val) ? [] : {}), val, depth - 1) : (!skipUndef || val !== undefined) && (target[key] = cloneSets ? deepClone(val) : val);\r\n } catch (e) {\r\n if (e instanceof RangeError) throw e; // internals can skip, not users\r\n } // call a spade a spade and just skip, no descriptor gymanstics\r\n }\r\n };\r\n if (atomic && Array.isArray(news) && isPath) setPath(state, path, cloneSets ? deepClone(news) : news), (getPath(state, path).length = news.length); // ping commoners\r\n else walk(target, merge ? mergeObjs(olds, news, opts) : news, depth === true ? Infinity : depth);\r\n };\r\n force(() => transaction(func, txLabel ?? `${path ? `Fanout -> '${path}'` : `Fanout`} (Tx ${txId + 1})`), CTX.usingForce || isEvPd); // if event or payload, already written values can bypass equality checks\r\n}\r\nexport const fanoutOptsArr = [\"merge\", \"depth\", \"atomic\", \"skipUndef\"] as const;\r\n\r\n/**\r\n * Executes a task while forcing all reactive writes to bypass equality checks.\r\n * @param task The mutation logic to execute.\r\n * @param bool Override for ease of use in dynamic usecases, defaults to `true`\r\n * @returns The result of the task.\r\n */\r\nexport function force<T>(task: () => T, bool = true): T {\r\n const prev = CTX.usingForce;\r\n CTX.usingForce = bool;\r\n try {\r\n return task();\r\n } finally {\r\n CTX.usingForce = prev;\r\n }\r\n}\r\n\r\n/**\r\n * Deep-merges object-like values, does necessary checks so use without doubts. Only `o2` keys are checked when `skipUndef` is true.\r\n * @example\r\n * const next = mergeObjs({ user: { name: \"Kosi\" } }, { user: { role: \"admin\" } }); // { ...o1, ...o2 } // o2 over o1 and deep!\r\n */\r\nexport function mergeObjs<T1 extends object, T2 extends object>(o1?: T1 | null, o2?: T2 | null, config?: { crossRealms?: boolean; skipUndef?: boolean }, pojocheck?: boolean): DeepMerge<T1, T2>;\r\nexport function mergeObjs(o1?: any, o2?: any, config = NIL, pojocheck = true): any {\r\n if (pojocheck && (!isPOJO(o1 || NIL, config) || !isPOJO(o2 || NIL, config))) return o2;\r\n (o1 ||= {}), (o2 ||= {});\r\n const merged = config.skipUndef ? { ...o1 } : { ...o1, ...o2 };\r\n if (config.skipUndef) {\r\n const keys = Object.keys(o1);\r\n for (let i = 0, len = keys.length; i < len; i++) {\r\n const key = keys[i],\r\n val = o2[key];\r\n if (val !== undefined) merged[key] = val;\r\n }\r\n }\r\n const keys = Object.keys(merged);\r\n for (let i = 0, len = keys.length; i < len; i++) {\r\n const key = keys[i],\r\n o1V = o1[key],\r\n o2V = o2[key];\r\n if (isPOJO(o1V, config) && isPOJO(o2V, config)) merged[key] = mergeObjs(o1V, o2V, config, false); // fewer writes is less costly here\r\n }\r\n return merged;\r\n}\r\n\r\n/** Returns [path, parent, value] records from root to the target path. */\r\nexport function getTrailRecords<T extends object>(obj: T, path: WildPaths<T>, reverse = false): [WildPaths<T>, PathBranchValue<T, WildPaths<T>>, PathValue<T, WildPaths<T>>][] {\r\n const parts = path.split(\".\"),\r\n chain: ReturnType<typeof getTrailRecords<T>> = [[\"*\", obj, obj]];\r\n for (let acc = \"\", currObj: any = obj, i = 0, len = parts.length; i < len; i++) {\r\n const part = parts[i];\r\n chain.push([(acc += (i ? \".\" : \"\") + part) as WildPaths<T>, currObj, (currObj = currObj?.[part])]); // one iteration per depth, one-time storage over rcurrent derivation\r\n }\r\n return reverse ? chain.reverse() : chain;\r\n}\r\n\r\n// Cloning\r\n\r\n/**\r\n * Deep-clones supported object structures.\r\n * @example\r\n * const cloned = deepClone({ user: { name: \"Kosi\" } });\r\n */\r\nexport function deepClone<T>(obj: T, config: { crossRealms?: boolean; preserveContext?: boolean } = CTX.defaults, seen = new WeakMap()): T {\r\n if (!obj || \"object\" !== typeof obj) return obj;\r\n const cloned = seen.get(obj);\r\n if (cloned) return cloned;\r\n if (!canHandle(obj, config, false)) return obj; // no circular references\r\n const clone: any = config.preserveContext ? Object.create(Object.getPrototypeOf(obj)) : Array.isArray(obj) ? [] : {};\r\n seen.set(obj, clone);\r\n const keys = config.preserveContext ? Reflect.ownKeys(obj) : Object.keys(obj);\r\n for (let i = 0, len = keys.length; i < len; i++) {\r\n const key = keys[i];\r\n try {\r\n clone[key] = deepClone((obj as any)[key], config, seen);\r\n } catch (e) {\r\n if (e instanceof RangeError) throw e; // internals can skip, not users\r\n } // call a spade a spade and just skip, no descriptor gymanstics\r\n }\r\n return clone;\r\n} // POJO|Arr|Dynamic Deep cloner\r\n\r\n// Destruction\r\n\r\n/** Nulls all non-function instance properties across the prototype chain. */\r\nexport function nuke(target: any): void {\r\n const keys = Object.keys(target);\r\n for (let i = 0, len = keys.length; i < len; i++) {\r\n const key = keys[i];\r\n if (\"function\" !== typeof target[key]) target[key] = null;\r\n }\r\n}\r\n\r\n// Metadata Operations\r\n\r\n/**\r\n * Allows extending the context payload of a `Reactor` operation with custom meta properties for the duration of a function execution.\r\n * Temporarily merges provided meta into `CTX.meta` for the duration of `fn`. Restores the previous meta object after `fn` completes (even on `throw`).\r\n * @param props Meta properties to merge into the current context.\r\n */\r\nexport function withMeta<T>(props: ReactorMeta, fn: () => T): T {\r\n CTX.meta ??= {};\r\n const cache: Record<string, any> = {};\r\n for (const key of Object.keys(props)) {\r\n cache[key] = (CTX.meta as any)[key];\r\n (CTX.meta as any)[key] = (props as any)[key];\r\n }\r\n try {\r\n return fn();\r\n } finally {\r\n for (const key of Object.keys(cache)) {\r\n if (cache[key] === undefined) resetMeta(key as any);\r\n else (CTX.meta as any)![key] = cache[key];\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Resets a specific property in the global context meta and nullifies it if empty to stay on the fast path.\r\n * @param key The key of the meta property to be deleted before nullifying.\r\n */\r\nexport function resetMeta(key: keyof ReactorMeta) {\r\n if (!CTX.meta) return;\r\n delete CTX.meta[key];\r\n for (const _ in CTX.meta) return;\r\n CTX.meta = null;\r\n}\r\n\r\n/**\r\n * The Master Path Engine: Single-pass, zero-allocation DFS tree extraction. Perfectly mirrors the TS `Paths` and `ChildPaths` generics.\r\n * - Root paths: `getPaths(store)`\r\n * - Child paths: `getPaths(store, \"settings.audio\")`\r\n * - Next words (typeahead): `getPaths(store, \"settings\", { depth: 1 })`\r\n */\r\nexport function getPaths<T extends object, const S extends string = \".\", P extends WildPaths<T, S> = \"*\", D extends number = MaxDepth, L extends boolean = false>(obj: T, path: P = \"*\" as P, config: { depth?: D; separator?: S; leavesOnly?: L } & typeof CTX.defaults = CTX.defaults as any): (P extends \"*\" ? Paths<T, S, D, L> : ChildPaths<T, P, S, D, L>)[] {\r\n const target = path === \"*\" ? obj : getPath(obj, path as any, config.separator as S),\r\n result: string[] = [],\r\n seen = new Set<any>();\r\n if (!canHandle(target, config)) return result as any;\r\n const walk = (curr: any, currPath: string, depth: number) => {\r\n if (seen.has(curr) || depth >= (config.depth ?? 18)) return;\r\n seen.add(curr);\r\n const keys = config.preserveContext ? Reflect.ownKeys(curr) : Object.keys(curr);\r\n for (let i = 0, len = keys.length; i < len; i++) {\r\n const key = String(keys[i]),\r\n val = (curr as any)[key],\r\n newPath = currPath ? `${currPath}${config.separator || \".\"}${key}` : key,\r\n isNode = canHandle(val, config);\r\n if (!config.leavesOnly || !isNode) result.push(newPath);\r\n try {\r\n isNode && walk(val, newPath, depth + 1);\r\n } catch (e) {\r\n if (e instanceof RangeError) throw e;\r\n }\r\n }\r\n seen.delete(curr); // Backtrack: allow identical object refs across different branches\r\n }; // Inline closure maintains state; prepends the exact parent path during the first pass.\r\n return walk(target, path === \"*\" ? \"\" : path, 0), result as any; // If path is passed, it acts as the initial string prefix for the sub-tree walk.\r\n}\r\n\r\n/** Quick boolean check to see if a path resolves to a final/inert value (Command Execution Gate). */\r\nexport function isLeafPath<T extends object, const S extends string = \".\", P extends WildPaths<T, S> = WildPaths<T, S>>(obj: T, path: P, config: { separator?: S } & typeof CTX.defaults = CTX.defaults, value = getPath(obj, path, config.separator)): boolean {\r\n return path !== \"*\" && !canHandle(value, config);\r\n}\r\n\r\n/**\r\n * Creates a two-way, array-atomic, echo-proof sync bridge between two S.I.A Reactors. Uses a synchronous origin lock to prevent infinite echo loops.\r\n * On setup, `rA` hydrates `rB` at `prefixB` with a deep clone of its current state at `prefixA` (primary drives initial truth).\r\n * @param rA Primary reactor — source of truth. Its `prefixA` slice seeds `rB.prefixB` on setup.\r\n * @param rB Secondary reactor — the wider store (e.g. `ctlr.config`). Holds the primary at a named path.\r\n * @param prefixA Path prefix on `rA` to watch and translate. Use `\"\"` for root.\r\n * @param prefixB Path on `rB` that maps to `rA`. Defaults to `\"\"` (root).\r\n * @param signal Optional `AbortSignal` to tear down both watchers automatically.\r\n * @returns Cleanup function that removes both watchers.\r\n * @example\r\n * const unsync = createReactorSync(module.config, ctlr.config, \"\", \"settings.persist\", signal); // module.config root <-> ctlr.config.settings.persist\r\n * @example\r\n * const unsync = createReactorSync(timeline.config, ctlr.config, \"\", \"settings.controlPanel.timeline\"); // timeline.config root <-> ctlr.config.settings.controlPanel.timeline\r\n * unsync(); // or let signal do it\r\n */\r\nexport function createReactorSync(rA: Reactor<any> | object, rB: Reactor<any> | object, prefixA: string, prefixB = \"\", signal?: AbortSignal): () => void {\r\n const rtrA = getReactor(rA, true),\r\n rtrB = getReactor(rB, true);\r\n let origin: 0 | 1 | null = null; // 0 = A fired, 1 = B fired\r\n const sync = (src: 0 | 1, dest: any, srcP: string, destP: string) => (val: any, payload: Payload<any, \"*\">) => {\r\n if (origin === (src ^ 1)) return; // echo guard\r\n const { path, object: obj, key } = payload.target;\r\n if (srcP && path !== srcP && !path.startsWith(srcP + \".\")) return; // boundary check\r\n const isArr = Array.isArray(obj),\r\n origP = isArr ? path.slice(0, -((key as string).length + 1)) : path, // Array trap: forward the whole array instead of an index-keyed object\r\n syncP = origP === srcP ? \"\" : srcP ? origP.slice(srcP.length + 1) : origP;\r\n (origin = src), setPath(dest, (destP ? (syncP ? `${destP}.${syncP}` : destP) : syncP || \"*\") as any, isArr ? deepClone(obj) : val), (origin = null);\r\n };\r\n const initA = prefixA ? getPath(rtrA.core, prefixA as any) : rtrA.core; // primary hydrates secondary on setup\r\n if (initA !== undefined) fanout(rtrB.core, (prefixB || \"*\") as any, initA, { depth: 1, cloneSets: true, txLabel: `ReactorSync: ${prefixA}^ <-> ${prefixB}` });\r\n const clupA = rtrA.watch(\"*\", sync(0, rtrB.core, prefixA, prefixB), { signal }),\r\n clupB = rtrB.watch(\"*\", sync(1, rtrA.core, prefixB, prefixA), { signal });\r\n return () => (clupA(), clupB());\r\n}\r\n","import type { Payload } from \"@defs/reactor\";\r\nimport type { WildPaths } from \"@defs/obj\";\r\nimport { getTrailRecords } from \"@utils/obj\";\r\n\r\n// ===========================================================================\r\n// The S.I.A (State & Intent Architecture) `Event`\r\n// ===========================================================================\r\n\r\n/**\r\n * - Runtime event payload used by Reactor listener waves.\r\n * - Tracks phase and current path context during propagation, mimics native `Event` API.\r\n * Exposes intent controls (`resolve`/`reject`), propagation controls, and `composedPath()`.\r\n * @typeParam T Root state object type.\r\n * @typeParam P Target path type.\r\n */\r\nexport class ReactorEvent<T extends object, P extends WildPaths<T> = WildPaths<T>> {\r\n /** No active propagation phase. */\r\n public static readonly NONE = 0;\r\n /** Capture phase: root to target parent. */\r\n public static readonly CAPTURING_PHASE = 1;\r\n /** Target phase: target listeners run. */\r\n public static readonly AT_TARGET = 2;\r\n /** Bubble phase: target parent to root. */\r\n public static readonly BUBBLING_PHASE = 3;\r\n /** Current propagation phase for this event instance. */\r\n public eventPhase = ReactorEvent.NONE;\r\n /** Current event type for the active propagation path, use immediately if async */\r\n public type!: Payload<T, P>[\"type\"];\r\n\r\n public currentTarget!: Payload<T, P>[\"currentTarget\"]; /** Current target context for the active propagation path, use immediately if async. Also survives future shape changes from nesting for a path callback. */\r\n public readonly target!: Payload<T, P>[\"target\"]; /** Original event target context. */\r\n public readonly root!: Payload<T, P>[\"root\"]; /** Root reactive object for this event instance wave. */\r\n public readonly reactor!: Payload<T, P>[\"reactor\"]; /** The `Reactor` instance that dispatched this event instance. */\r\n /** Whether resolve/reject intent semantics are allowed for this event instance. */\r\n public readonly rejectable!: boolean;\r\n /** Original event type before propagation remapping. */\r\n public readonly staticType: Exclude<Payload<T, P>[\"type\"], \"update\">;\r\n public readonly path: Payload<T, P>[\"target\"][\"path\"]; /** Original target path for this event instance wave. */\r\n public readonly value: Payload<T, P>[\"target\"][\"value\"]; /** Current value at the event target path. */\r\n public readonly oldValue: Payload<T, P>[\"target\"][\"oldValue\"]; /** Previous value at the event target path. */\r\n /** Whether this event instance wave can bubble back up to ancestors or just capture down. */\r\n public readonly bubbles: boolean = false;\r\n /** Whether this event instance wave can capture down to descendants or just bubble up. */\r\n public readonly captures: boolean = false;\r\n /** `DOMHighResTimeStamp` for this event payload for native event parity, Enable `eventTimeStamps` config, then use this over custom timestamps for accuracy. */\r\n public readonly timestamp?: number;\r\n protected _resolved = \"\";\r\n protected _rejected = \"\";\r\n protected _propagationStopped = false;\r\n protected _immediatePropagationStopped = false;\r\n\r\n /**\r\n * @param payload Source payload for this event instance.\r\n * @param reactor The `Reactor` instance creating this event instance.\r\n */\r\n constructor(payload: Payload<T, P>) {\r\n Object.assign(this, payload);\r\n this.staticType = payload.type as ReactorEvent<T, P>[\"staticType\"];\r\n this.path = payload.target.path;\r\n this.value = payload.target.value;\r\n this.oldValue = payload.target.oldValue;\r\n if (this.reactor.config.eventBubbling) this.bubbles = true;\r\n if (this.reactor.config.eventCapturing === \"auto\" ? this.rejectable : this.reactor.config.eventCapturing) this.captures = true;\r\n if (this.reactor.config.eventTimeStamps) this.timestamp = performance.now();\r\n }\r\n\r\n /** Whether propagation has been stopped. */\r\n public get propagationStopped(): boolean {\r\n return this._propagationStopped;\r\n }\r\n /** Stops propagation to remaining listeners in later nodes/phases. */\r\n public stopPropagation(): void {\r\n this._propagationStopped = true;\r\n }\r\n /** Whether immediate propagation has been stopped. */\r\n public get immediatePropagationStopped(): boolean {\r\n return this._immediatePropagationStopped;\r\n }\r\n /** Stops propagation immediately, including remaining listeners on current path. */\r\n public stopImmediatePropagation(): void {\r\n this._propagationStopped = true;\r\n this._immediatePropagationStopped = true;\r\n }\r\n\r\n /** Resolution message for rejectable events. */\r\n public get resolved(): string {\r\n return this._resolved;\r\n }\r\n /**\r\n * Marks a rejectable event as resolved.\r\n * @param message Optional resolution message or identity.\r\n * @example e.resolve(\"html5Tech\"); // identity\r\n * @example e.resolve(\"API Load successful\"); // message\r\n */\r\n public resolve(message?: string): void {\r\n if (!this.rejectable) return this.reactor.log(`[ReactorEvent] Ignored \\`resolve()\\` call on a non-rejectable ${this.staticType} at \"${this.path}\"`);\r\n if (this.eventPhase !== ReactorEvent.CAPTURING_PHASE) this.reactor.log(`[ReactorEvent] Resolving an intent on ${this.staticType} at \"${this.path}\" outside of the capture phase is unadvised.`);\r\n if (this.rejectable) this.reactor.log(`[ReactorEvent] ${(this._resolved = message || `${this.staticType} intent resolved at \"${this.path}\"`)}`);\r\n }\r\n /** Rejection reason for rejectable events. */\r\n public get rejected(): string {\r\n return this._rejected;\r\n }\r\n /**\r\n * Marks a rejectable event as rejected.\r\n * @param reason Optional rejection reason or identity.\r\n * @example e.reject(\"html5Tech\"); // identity\r\n * @example e.reject(\"User is not logged in\"); // reason\r\n */\r\n public reject(reason?: string): void {\r\n if (!this.rejectable) return this.reactor.log(`[ReactorEvent] Ignored \\`reject()\\` call on a non-rejectable ${this.staticType} at \"${this.path}\"`);\r\n if (this.eventPhase !== ReactorEvent.CAPTURING_PHASE) this.reactor.log(`[ReactorEvent] Rejecting an intent on ${this.staticType} at \"${this.path}\" outside of the capture phase is unadvised.`);\r\n if (this.rejectable) this.reactor.log(`[ReactorEvent] ${(this._rejected = reason || `${this.staticType} intent rejected at \"${this.path}\"`)}`);\r\n }\r\n\r\n /** Returns event path values from target to root in bubbling order. */\r\n public composedPath() {\r\n return getTrailRecords<T>(this.root, this.path as WildPaths<T>, true).map((r) => r[2]); // values reversed to mimic bubbling\r\n }\r\n}\r\n","import { CTX, RAW, INERTIA, REJECTABLE, INDIFFABLE, TERMINATOR, VERSION, SSVERSION, NOOP, RTR_LOG, EVT_OPTS } from \"./consts\";\r\nimport { ReactorEvent } from \"./event\";\r\nimport type { REvent, Target, Payload, Getter, Setter, Deleter, Watcher, Listener, ListenerOptions, ListenerRecord, WatcherRecord, GetterRecord, SetterRecord, DeleterRecord, SyncOptions, ReactorBuild } from \"@defs/reactor\";\r\nimport type { PathBranchValue, Paths, PathKey, PathValue, WildPaths, MaxDepth } from \"@defs/obj\";\r\nimport { canHandle, getTrailRecords, parseEvtOpts, hasPath, getPath, setPath, deletePath, getDepth, force, nuke } from \"@utils/obj\";\r\nimport { BaseReactorModule as ReactorModule, ReactorModuleId } from \"@modules/base\";\r\n\r\n/*\r\n * ========= THE S.I.A (State & Intent Architecture) `Reactor` CODE PATTERN WATCHLIST =========\r\n * 1. non-stack loops & multiple optimizations, this is surgical work on the root of reactivity\r\n * 2. used cached loop lengths to optimize b4 JIT Compiler does for optimal speed throughput,\r\n * avoided myth of reverse while loops so new CPU's don't waste memory on a forward l1 Cache miss\r\n * 3. moved any logic involving `?.` or `??` outside repetitions to not accumulate the ~5x slowdown\r\n * 4. `?.` in cases where only other option was `&&` | `||` cuz `?.` benchmarks were a bit faster\r\n * 5. adopted nooping strategy since JIT compiler makes it up to 2x faster than other alternatives\r\n * 6. no unorthodox string deduplication or caching since string interning is now native to JS\r\n * 7. it's all progressive: light at creation then grows during the use of all desired features\r\n * 8. Reflect API was avoided, incurs an ~8x slowdown; mediation layer is even powerful enough\r\n * 9. Core's Class Syntax over global functional closures for instance's lighter memory footprint\r\n * 10. Avoided object pooling since V8 excels at generational GC for short-lived payloads so no\r\n * \"Stop the World\"s. Also no need for wasted recurrent logic, serialize or forget about payloads.\r\n * 11. Array slicing had to be used in listener loops since unsubscribing is also user-controlled.\r\n * * With all this, the right has now been earned to run on your hot path; sit back and relax :)\r\n */\r\n\r\n// ===========================================================================\r\n// The S.I.A (State & Intent Architecture) `Reactor`\r\n// ===========================================================================\r\n\r\n/**\r\n * - Core S.I.A runtime for path mediation, observation, and event propagation.\r\n * - Provides path-level mediators (`get|set|delete`), synchronous watchers (`watch`), and batched listeners (`on`).\r\n * Supports wildcard/path-based subscriptions, optional reference tracking, and module-based extensions.\r\n * @typeParam T Root state object type.\r\n */\r\nexport class Reactor<T extends object> {\r\n /** Logger function for this reactor instance, override if desired, `this.canLog = false` resets. */\r\n public log: (...args: any[]) => void = NOOP;\r\n /** The core state object for this reactor instance. */\r\n public core: T; // `?:`s | pay the ~800 byte price upfront for what u might never use\r\n /** The modules being used by this reactor. */\r\n public modules?: Set<ReactorModule<T>>;\r\n /** Configuration options for this reactor instance. */\r\n public config: Omit<ReactorBuild<T>, \"debug\">;\r\n /** Whether this reactor instance is currently batching updates, a window view into the engine timing */\r\n public isBatching = false; // Async Batching\r\n protected queue?: Set<() => void>; // Tasks to run after flush\r\n protected batch?: Map<Paths<T>, Payload<T>>; // Batched payloads to flush async\r\n protected lineage?: WeakMap<object, (object | string)[]>; // { parent, key }: uses maths to avoid extra allocations for pairs\r\n protected snapCache?: WeakMap<object, any>;\r\n protected proxyCache = new WeakMap<object, any>();\r\n protected getters?: Map<WildPaths<T>, Array<GetterRecord<T>>>;\r\n protected setters?: Map<WildPaths<T>, Array<SetterRecord<T>>>;\r\n protected deleters?: Map<WildPaths<T>, Array<DeleterRecord<T>>>;\r\n protected watchers?: Map<WildPaths<T>, Array<WatcherRecord<T>>>;\r\n protected listeners?: Map<WildPaths<T>, Array<ListenerRecord<T>>>;\r\n\r\n /**\r\n * Creates a new Reactor instance.\r\n * @param target Initial state target.\r\n * @param build Reactor bootstrap/build configuration.\r\n * @example\r\n * const rtr = new Reactor({ count: 0 });\r\n */\r\n constructor(target: T = {} as T, build?: ReactorBuild<T>) {\r\n (this as any)[INERTIA] = true;\r\n this.config = { ...CTX.defaults, ...build };\r\n this.core = this.proxied(target);\r\n if (build) this.canLog = !!build.debug;\r\n }\r\n\r\n public proxied<O extends object>(target: O, rejectable = false, indiffable = false, parent?: object, key?: string, path?: string): O {\r\n if (!target || \"object\" !== typeof target) return target;\r\n target = (target as any)[RAW] || target; // prevents nested proxies\r\n if (this.config.referenceTracking && parent && key && !this.link(target, parent, key, false)) return target; // already checked types above\r\n const cached = this.proxyCache.get(target);\r\n if (cached) return cached;\r\n if (!canHandle(target, this.config, false)) return target; // handles unless inert, // did light type check for `[Symbol]` so `false` to strictObj typecheck param\r\n rejectable ||= (target as any)[REJECTABLE];\r\n indiffable ||= (target as any)[INDIFFABLE];\r\n const proxy = new Proxy(target, {\r\n // Robust Proxy handler\r\n get: (object, key, receiver) => {\r\n if (key === RAW) return this.log(`👀 [\\`get\\` Trap] Peeked at ${object}`), object;\r\n let value = !this.config.preserveContext ? (object as any)[key] : Reflect.get(object, key, receiver);\r\n const keyStr = String(key),\r\n fullPath = (path ? path + \".\" + keyStr : keyStr) as Paths<T>,\r\n paths = this.config.lineageTracing ? this.trace(object, keyStr) : fullPath;\r\n this.log(`🔍 [\\`get\\` Trap] Initiated for \"${keyStr}\" on [${paths}]`), CTX.autotracker?.track(fullPath, this);\r\n if (this.config.get) value = this.config.get(object as PathBranchValue<T>, key as PathKey<T>, value, receiver, paths);\r\n if (this.getters) {\r\n const wildcords = this.getters.get(\"*\"); // wild cords\r\n for (let i = 0, len = this.config.lineageTracing ? paths.length : 1; i < len; i++) {\r\n const currPath = (this.config.lineageTracing ? paths[i] : fullPath) as Paths<T>,\r\n cords = this.getters.get(currPath);\r\n if (!cords && !wildcords) continue;\r\n const target: Target<T> = { path: currPath, value, key: keyStr as PathKey<T>, hadKey: true, object: receiver },\r\n payload = { type: \"get\", target, currentTarget: target, root: this.core, reactor: this, rejectable, ...CTX.meta } as Payload<T, Paths<T>>;\r\n if (cords) value = this.mediate(currPath, payload, \"get\", cords);\r\n if (!wildcords) continue;\r\n target.value = value;\r\n value = this.mediate(\"*\", payload, \"get\", wildcords);\r\n } // Mediators\r\n }\r\n return this.proxied(value, rejectable, indiffable, object, keyStr, fullPath);\r\n },\r\n set: (object, key, value, receiver) => {\r\n let unchanged,\r\n safeValue,\r\n safeOldValue,\r\n terminated = false;\r\n const keyStr = String(key),\r\n fullPath = (path ? path + \".\" + keyStr : keyStr) as Paths<T>,\r\n paths = this.config.lineageTracing ? this.trace(object, keyStr) : fullPath,\r\n loopLen = this.config.lineageTracing ? paths.length : 1,\r\n oldValue = !this.config.preserveContext ? (object as any)[key] : Reflect.get(object, key, receiver),\r\n hadKey = !this.config.preserveContext ? key in object : Reflect.has(object, key);\r\n this.log(`✏️ [\\`set\\` Trap] Initiated for \"${keyStr}\" on [${paths}]`), CTX.autotracker?.track(fullPath, this, true);\r\n if (this.config.referenceTracking || !indiffable) {\r\n safeOldValue = oldValue?.[RAW] || oldValue;\r\n safeValue = value?.[RAW] || value;\r\n unchanged = this.config.equalityFunction!(safeValue, safeOldValue);\r\n }\r\n if (!indiffable && unchanged && !CTX.usingForce && keyStr !== \"length\") return this.log(`🔄 [\\`set\\` Trap] Unchanged for \"${keyStr}\" on [${paths}]`), true; // Arrays silently update length before firing set trap, can't risk UI going blind\r\n if (this.config.set) terminated = (value = this.config.set(object as PathBranchValue<T>, key as PathKey<T>, value, oldValue, receiver, paths)) === TERMINATOR;\r\n if (this.setters) {\r\n const wildcords = this.setters.get(\"*\");\r\n for (let i = 0; i < loopLen; i++) {\r\n const currPath = (this.config.lineageTracing ? paths[i] : fullPath) as Paths<T>,\r\n cords = this.setters.get(currPath);\r\n if (!cords && !wildcords) continue;\r\n const target: Target<T> = { path: currPath, value, oldValue, key: keyStr as PathKey<T>, hadKey, object: receiver },\r\n payload = { type: \"set\", target, currentTarget: target, root: this.core, reactor: this, terminated, rejectable, ...CTX.meta } as Payload<T, Paths<T>>;\r\n if (cords) {\r\n const result = this.mediate(currPath, payload, \"set\", cords);\r\n if (!(terminated ||= payload.terminated!)) value = result;\r\n }\r\n if (!wildcords) continue;\r\n target.value = value;\r\n const result = this.mediate(\"*\", payload, \"set\", wildcords);\r\n if (!(terminated ||= payload.terminated!)) value = result;\r\n } // Mediators\r\n }\r\n if (terminated) return this.log(`🛡️ [\\`set\\` Trap] Terminated for \"${keyStr}\" on [${paths}]`), true; // soft rejection if terminated\r\n const success = !this.config.preserveContext ? (((object as any)[key] = value), true) : Reflect.set(object, key, value, receiver);\r\n if (!success) return this.log(`❌ [\\`set\\` Trap] Failed for \"${keyStr}\" on [${paths}]`), false; // hard rejection if failed\r\n if (this.config.referenceTracking && !unchanged) this.config.smartCloning && this.stamp(object), (this.unlink(safeOldValue, object, keyStr), this.link(safeValue, object, keyStr));\r\n if (this.watchers || this.listeners)\r\n for (let i = 0; i < loopLen; i++) {\r\n const currPath = (this.config.lineageTracing ? paths[i] : fullPath) as Paths<T>,\r\n target: Target<T> = { path: currPath, value, oldValue, key: keyStr as PathKey<T>, hadKey, object: receiver };\r\n this.notify(currPath, { type: \"set\", target, currentTarget: target, root: this.core, reactor: this, terminated, rejectable, ...CTX.meta } as Payload<T, Paths<T>>);\r\n } // Listeners\r\n return true;\r\n },\r\n deleteProperty: (object, key) => {\r\n let value: any,\r\n receiver = this.proxyCache.get(object),\r\n terminated = false;\r\n const keyStr = String(key),\r\n fullPath = (path ? path + \".\" + keyStr : keyStr) as Paths<T>,\r\n paths = this.config.lineageTracing ? this.trace(object, keyStr) : fullPath,\r\n loopLen = this.config.lineageTracing ? paths.length : 1,\r\n oldValue = !this.config.preserveContext ? (object as any)[key] : Reflect.get(object, key, receiver),\r\n hadKey = !this.config.preserveContext ? key in object : Reflect.has(object, key);\r\n this.log(`🗑️ [\\`deleteProperty\\` Trap] Initiated for \"${keyStr}\" on [${paths}]`), CTX.autotracker?.track(fullPath, this, true);\r\n if (this.config.deleteProperty) terminated = (value = this.config.deleteProperty(object as PathBranchValue<T>, key as PathKey<T>, oldValue, receiver, paths)) === TERMINATOR;\r\n if (this.deleters) {\r\n const wildcords = this.deleters.get(\"*\");\r\n for (let i = 0; i < loopLen; i++) {\r\n const currPath = (this.config.lineageTracing ? paths[i] : fullPath) as Paths<T>,\r\n cords = this.deleters.get(currPath);\r\n if (!cords && !wildcords) continue;\r\n const target: Target<T> = { path: currPath, value, oldValue, key: keyStr as PathKey<T>, hadKey, object: receiver },\r\n payload = { type: \"delete\", target, currentTarget: target, root: this.core, reactor: this, rejectable, ...CTX.meta } as Payload<T, Paths<T>>;\r\n if (cords) {\r\n const result = this.mediate(currPath, payload, \"delete\", cords);\r\n if (!(terminated ||= payload.terminated!)) value = result;\r\n }\r\n if (!wildcords) continue;\r\n const result = this.mediate(\"*\", payload, \"delete\", wildcords);\r\n if (!(terminated ||= payload.terminated!)) value = result;\r\n } // Mediators\r\n }\r\n if (terminated) return this.log(`🛡️ [\\`deleteProperty\\` Trap] Terminated for \"${keyStr}\" on [${paths}]`), true; // soft rejection if terminated\r\n const success = !this.config.preserveContext ? delete (object as any)[key] : Reflect.deleteProperty(object, key);\r\n if (!success) return this.log(`❌ [\\`deleteProperty\\` Trap] Failed for \"${keyStr}\" on [${paths}]`), false; // hard rejection if failed\r\n if (this.config.referenceTracking) this.config.smartCloning && this.stamp(object), this.unlink(oldValue?.[RAW] || oldValue, object, keyStr);\r\n if (this.watchers || this.listeners)\r\n for (let i = 0; i < loopLen; i++) {\r\n const currPath = (this.config.lineageTracing ? paths[i] : fullPath) as Paths<T>,\r\n target: Target<T> = { path: currPath, value, oldValue, key: keyStr as PathKey<T>, hadKey, object: receiver };\r\n this.notify(currPath, { type: \"delete\", target, currentTarget: target, root: this.core, reactor: this, rejectable, ...CTX.meta } as Payload<T, Paths<T>>);\r\n } // Listeners\r\n return true;\r\n },\r\n has: (object, key) => {\r\n let has = !this.config.preserveContext ? key in object : Reflect.has(object, key);\r\n const keyStr = String(key),\r\n fullPath = (path ? path + \".\" + keyStr : keyStr) as Paths<T>;\r\n this.log(`❓ [\\`has\\` Trap] Initiated for \"${keyStr}\" on '${fullPath}'`), CTX.autotracker?.track(fullPath, this);\r\n if (this.config.has) has = this.config.has(object as PathBranchValue<T>, key as PathKey<T>, has, this.proxyCache.get(object), fullPath);\r\n return has;\r\n },\r\n getOwnPropertyDescriptor: (object, key) => {\r\n let descriptor = !this.config.preserveContext ? Object.getOwnPropertyDescriptor(object, key) : Reflect.getOwnPropertyDescriptor(object, key);\r\n const keyStr = String(key),\r\n fullPath = (path ? path + \".\" + keyStr : keyStr) as Paths<T>;\r\n this.log(`📋 [\\`getOwnPropertyDescriptor\\` Trap] Initiated for \"${keyStr}\" on '${fullPath}'`), CTX.autotracker?.track(fullPath, this);\r\n if (this.config.getOwnPropertyDescriptor) descriptor = this.config.getOwnPropertyDescriptor(object as PathBranchValue<T>, key as PathKey<T>, descriptor, this.proxyCache.get(object), this.config.lineageTracing ? this.trace(object, keyStr) : fullPath);\r\n return descriptor;\r\n },\r\n ownKeys: (object) => {\r\n let ownKeys = Reflect.ownKeys(object); // no faster accurate way without Reflect API\r\n const safePath = (path || \"*\") as Paths<T>;\r\n this.log(`🔑 [\\`ownKeys\\` Trap] Initiated on \"${safePath}\"`), CTX.autotracker?.track(safePath, this);\r\n if (this.config.ownKeys) ownKeys = this.config.ownKeys(object as PathBranchValue<T>, ownKeys, this.proxyCache.get(object), safePath);\r\n return ownKeys;\r\n },\r\n });\r\n return this.proxyCache.set(target, proxy), proxy;\r\n }\r\n\r\n public trace(target: object, path: string, paths: string[] = [], seen = new WeakSet<object>()): Paths<T>[] {\r\n if (Object.is(target, (this.core as any)[RAW] || this.core)) return paths.push(path), paths as Paths<T>[];\r\n if (seen.has(target)) return paths as Paths<T>[]; // Stop infinite loops\r\n seen.add(target);\r\n const es = (this.lineage ??= new WeakMap()).get(target);\r\n if (!es) return paths as Paths<T>[];\r\n for (let i = 0, len = es.length; i < len; i += 2) {\r\n const prev = es[i + 1];\r\n this.trace(es[i] as object, prev ? prev + \".\" + path : path, paths, seen);\r\n }\r\n return paths as Paths<T>[];\r\n } // won't be called without `.config.referenceTracking` so internal guard avoided\r\n protected link(target: any, parent: object, key: string, typecheck = true, es?: (object | string)[]): boolean {\r\n if (!canHandle(target, this.config, typecheck)) return false;\r\n es = (this.lineage ??= new WeakMap()).get(target) ?? (this.lineage!.set(target, (es = [])), es);\r\n for (let i = 0, len = es.length; i < len; i += 2) if (Object.is(es[i], parent) && es[i + 1] === key) return true;\r\n return es.push(parent, key), true; // es used as a param: needed storage perk\r\n }\r\n protected unlink(target: any, parent: object, key: string): void {\r\n if (!canHandle(target, this.config)) return;\r\n const es = (this.lineage ??= new WeakMap()).get(target);\r\n if (es) for (let i = 0, len = es.length; i < len; i += 2) if (Object.is(es[i], parent) && es[i + 1] === key) return void es.splice(i, 2);\r\n }\r\n protected stamp(target: any, typecheck = true, seen = new WeakSet<object>()): void {\r\n if (typecheck && \"object\" !== typeof target) return;\r\n target = target[RAW] || target; // escape hatch from traps\r\n if (seen.has(target)) return; // Stop infinite loops\r\n seen.add(target);\r\n target[VERSION] = (target[VERSION] || 0) + 1;\r\n const es = (this.lineage ??= new WeakMap()).get(target);\r\n if (es) for (let i = 0, len = es.length; i < len; i += 2) this.stamp(es[i], false, seen); // walk up the tree; stamp parents\r\n }\r\n\r\n public mediate<P extends WildPaths<T>>(path: WildPaths<T>, payload: Payload<T, P>, type: \"get\", cords: GetterRecord<T>[]): PathValue<T, P>;\r\n public mediate<P extends WildPaths<T>>(path: WildPaths<T>, payload: Payload<T, P>, type: \"set\", cords: SetterRecord<T>[]): PathValue<T, P>;\r\n public mediate<P extends WildPaths<T>>(path: WildPaths<T>, payload: Payload<T, P>, type: \"delete\", cords: DeleterRecord<T>[]): PathValue<T, P>;\r\n public mediate<P extends WildPaths<T>>(path: WildPaths<T>, payload: Payload<T, P>, type: \"get\" | \"set\" | \"delete\", cords: Array<GetterRecord<T> | SetterRecord<T> | DeleterRecord<T>>) {\r\n let terminated = false,\r\n value = payload.target.value,\r\n killed = false; // mediator called when necessary & ready for the argument work, all facts (params) are brought to the table so no `?.`\r\n const isGet = type === \"get\",\r\n isSet = type === \"set\",\r\n mediators = isGet ? this.getters : isSet ? this.setters : this.deleters,\r\n scords = cords.slice();\r\n for (let slen = scords.length, i = !isGet ? 0 : slen - 1, len = !isGet ? slen : -1; i !== len; i += !isGet ? 1 : -1) {\r\n const cord = scords[i];\r\n if ((cord as any)._dead) continue;\r\n const response: any = isGet ? (cord as GetterRecord<T>).cb(value, payload as Payload<T>) : isSet ? (cord as SetterRecord<T>).cb(value, terminated, payload as Payload<T>) : (cord as DeleterRecord<T>).cb(terminated, payload as Payload<T>); // all will mediate\r\n if (isGet || !(terminated ||= payload.terminated = response === TERMINATOR)) value = response as PathValue<T, P>;\r\n if (cord.once) killed = (cord as any)._dead = true;\r\n }\r\n if (killed) for (let i = cords.length - 1; i >= 0; i--) if ((cords[i] as any)._dead) cords.splice(i, 1), !cords.length && mediators!.delete(path);\r\n return value; // set - FIFO, get - LIFO\r\n }\r\n\r\n public notify<P extends Paths<T>>(path: P, payload: Payload<T, P>): void {\r\n if (this.watchers) {\r\n const wildcords = this.watchers.get(\"*\") as Array<WatcherRecord<T, \"*\">> | undefined,\r\n wildscords = wildcords?.slice(),\r\n cords = this.watchers.get(path) as Array<WatcherRecord<T, P>> | undefined,\r\n scords = cords?.slice();\r\n if (cords) {\r\n let killed = false;\r\n for (let i = 0, len = scords!.length; i < len; i++) {\r\n const cord = scords![i];\r\n if ((cord as any)._dead) continue;\r\n cord.cb(payload.target.value as PathValue<T, P>, payload); // watchers do not terminate as they're after the OP\r\n if (cord.once) killed = (cord as any)._dead = true;\r\n }\r\n if (killed) for (let i = cords!.length - 1; i >= 0; i--) if ((cords![i] as any)._dead) cords!.splice(i, 1), !cords!.length && this.watchers!.delete(path);\r\n }\r\n if (wildcords) {\r\n let killed = false;\r\n for (let i = 0, len = wildscords!.length; i < len; i++) {\r\n const wildcord = wildscords![i];\r\n if ((wildcord as any)._dead) continue;\r\n wildcord.cb(payload.target.value, payload as Payload<T, \"*\">);\r\n if (wildcord.once) killed = (wildcord as any)._dead = true;\r\n }\r\n if (killed) for (let i = wildcords!.length - 1; i >= 0; i--) if ((wildcords![i] as any)._dead) wildcords!.splice(i, 1), !wildcords!.length && this.watchers!.delete(\"*\");\r\n }\r\n }\r\n this.listeners && this.schedule(path, payload); // batch is undefined till listeners are available\r\n }\r\n protected schedule<P extends Paths<T>>(path: P, payload: Payload<T, P>): void {\r\n this.batch ??= new Map();\r\n this.batch.set(path, payload as Payload<T>), !this.isBatching && this.initBatching();\r\n }\r\n protected initBatching(): void {\r\n (this.isBatching = true), this.config.batchingFunction!(() => this.flush()); // do the `!isBatching` check outisde so the func cost is only on first batch\r\n }\r\n protected flush(): void {\r\n (this.isBatching = false), this.batch && this.tick(this.batch.keys()); // not slowing dis down with a `?.size` since it's like always filled, rather pay the empty iterator cost once when empty\r\n if (this.queue?.size) for (const task of this.queue) task(), this.queue.delete(task); // you can still stall with an empty batch, slower `?.`, almost always empty; this or empty Iterator cost\r\n }\r\n\r\n public wave<P extends Paths<T>>(path: P, payload: Payload<T, P>): void {\r\n const e = new ReactorEvent<T>(payload as Payload<T>) as REvent<T>, // a wave is started forly when really necessary all things considered\r\n chain = getTrailRecords(this.core, path); // either build a large array of refs to climb back up or have to derive each step\r\n // 1: CAPTURE phase (core -> parent) - intent owners reject here, capture should preferably be used to reject\r\n if (e.captures) {\r\n e.eventPhase = ReactorEvent.CAPTURING_PHASE;\r\n for (let i = 0; i <= chain.length - 2; i++) {\r\n if (e.propagationStopped) break;\r\n this.fire(chain[i], e, true);\r\n }\r\n if (e.propagationStopped) return;\r\n }\r\n // 2: TARGET phase (leaf)\r\n e.eventPhase = ReactorEvent.AT_TARGET;\r\n this.fire(chain[chain.length - 1], e, true); // CAPTURE fires\r\n !e.immediatePropagationStopped && this.fire(chain[chain.length - 1], e, false); // BUBBLE fires\r\n // 3: BUBBLE phase (parent -> core) - listeners always see it, rejection is just a flag for smart optimists\r\n if (e.bubbles) {\r\n e.eventPhase = ReactorEvent.BUBBLING_PHASE;\r\n for (let i = chain.length - 2; i >= 0; i--) {\r\n if (e.propagationStopped) break;\r\n this.fire(chain[i], e, false);\r\n }\r\n // if (e.propagationStopped) return;\r\n }\r\n // if (e.rejected) return; // 4: DEFAULT phase if ever, whole architecture can be reimagined: `State vs Intent` is my view; reactor is still dumb\r\n }\r\n protected fire([path, object, value]: ReturnType<typeof getTrailRecords<T>>[number], e: REvent<T>, isCapture: boolean, cords = this.listeners!.get(path)): void {\r\n if (!cords) return; // not doing `.listeners?.` in param cuz this is called in a loop and internally, listeners are defined before this is touched\r\n e.type = path !== e.target.path ? \"update\" : e.staticType; // `update` for ancestors\r\n e.currentTarget = { path, value, oldValue: e.type !== \"update\" ? e.target.oldValue : undefined, key: (e.type !== \"update\" ? path : path.slice(path.lastIndexOf(\".\") + 1) || \"\") as PathKey<T>, hadKey: e.type !== \"update\" ? e.target.hadKey : true, object: object as PathBranchValue<T> };\r\n let killed = false;\r\n const scords = cords.slice();\r\n for (let i = 0, len = scords.length, tDepth; i < len; i++) {\r\n const cord = scords[i];\r\n if (e.immediatePropagationStopped) break;\r\n if (cord.capture !== isCapture || (cord as any)._dead) continue;\r\n if (cord.depth !== undefined) {\r\n tDepth ??= getDepth(e.target.path); // calc only if ever needed\r\n if (tDepth > cord.lDepth! + cord.depth!) continue;\r\n }\r\n cord.cb(e);\r\n if (cord.once) killed = (cord as any)._dead = true;\r\n }\r\n if (killed) for (let i = cords.length - 1; i >= 0; i--) if ((cords[i] as any)._dead) cords.splice(i, 1), !cords.length && this.listeners!.delete(path);\r\n }\r\n\r\n /**\r\n * Flushes queued listener payloads.\r\n * @param paths Optional path(s) to flush.\r\n * @example\r\n * rtr.tick(); // to flush all paths in batch or pass \"*\" wildcard\r\n * @example\r\n * rtr.tick(\"user.profile.name\");\r\n */\r\n public tick(paths?: WildPaths<T> | Iterable<Paths<T>>): void {\r\n if (!paths || paths === \"*\") return this.flush(); // we are sure listeners are defined before waving since batch depends on them\r\n if (\"string\" === typeof paths) {\r\n const payload = this.batch?.get(paths) as Payload<T, Paths<T>> | undefined;\r\n payload && (this.batch!.delete(paths), this.wave(paths, payload));\r\n } else\r\n for (const path of paths) {\r\n const payload = this.batch!.get(path) as Payload<T, Paths<T>> | undefined; // `!` cuz tick is only called inside the class with iterable paths when batch is defined\r\n payload && (this.batch!.delete(path), this.wave(path, payload));\r\n }\r\n }\r\n /**\r\n * Queues a task to run after the current flush cycle.\r\n * @param task Task callback.\r\n * @example\r\n * const task = () => console.log(\"after flush\");\r\n * rtr.stall(task);\r\n */\r\n public stall(task: () => any): void {\r\n (this.queue ??= new Set()).add(task), !this.isBatching && this.initBatching();\r\n }\r\n /**\r\n * Removes a queued post-flush task.\r\n * @param task Task callback.\r\n * @returns `undefined` when no queue, `false` when queue exist but callback is not found, `true` when removed.\r\n */\r\n public nostall(task: () => any): boolean | undefined {\r\n return this.queue?.delete(task);\r\n }\r\n\r\n public context<P extends WildPaths<T>>(path: P): Target<T, P> {\r\n const last = path.lastIndexOf(\".\"),\r\n key = (path.slice(last + 1) || \"\") as PathKey<T, P>,\r\n object = (last === -1 ? this.core : getPath(this.core, path.slice(0, last) as Paths<T>)) as PathBranchValue<T, P>;\r\n return { path, value: getPath(this.core, path), key, hadKey: !object || key in object, object };\r\n }\r\n protected binded<Cb>(cord: GetterRecord<T> | SetterRecord<T> | DeleterRecord<T> | WatcherRecord<T> | ListenerRecord<T>, sig?: AbortSignal): Cb {\r\n if (sig) sig.aborted ? cord.clup() : sig.addEventListener(\"abort\", cord.clup, { once: true }); // once incase spec changes, memory leaks too\r\n return (cord.sclup = !sig || sig.aborted ? NOOP : () => sig.removeEventListener(\"abort\", cord.clup)), cord.clup as Cb;\r\n }\r\n protected cloned<O>(target: O, raw: boolean, seen = new WeakMap()): O {\r\n if (!target || \"object\" !== typeof target) return target;\r\n const obj = (target as any)[RAW] || target, // escape hatch from traps\r\n cloned = seen.get(obj);\r\n if (cloned) return cloned;\r\n if (!canHandle(obj, this.config, false)) return obj; // no circular references\r\n const version = obj[VERSION] || 0,\r\n cached = !raw && this.config.smartCloning && (this.snapCache ??= new WeakMap()).get(obj);\r\n if (cached && obj[SSVERSION] === version) return cached;\r\n const clone = !raw ? (this.config.preserveContext ? Object.create(Object.getPrototypeOf(obj)) : Array.isArray(obj) ? [] : {}) : obj;\r\n seen.set(obj, clone);\r\n const keys = this.config.preserveContext ? Reflect.ownKeys(obj) : Object.keys(obj);\r\n for (let i = 0, len = keys.length; i < len; i++) {\r\n const key = keys[i];\r\n try {\r\n clone[key] = this.cloned(obj[key], raw, seen);\r\n } catch (e) {\r\n if (e instanceof RangeError) throw e; // internals can skip, not users\r\n } // call a spade a spade and just skip, no descriptor gymanstics\r\n }\r\n if (!raw && this.config.smartCloning) this.snapCache!.set(obj, clone), (obj[SSVERSION] = version);\r\n return clone;\r\n }\r\n\r\n protected onSync<P extends WildPaths<T>>(key: \"get\" | \"set\" | \"delete\" | \"watch\", path: P, cb: any, opts: SyncOptions | undefined, onInit: (type?: \"set\" | \"delete\") => void = NOOP): () => boolean | undefined {\r\n const { once = false, signal, lazy = false, init = false, initType } = parseEvtOpts(opts, EVT_OPTS.MEDIATOR),\r\n store = (this[`${key}${key.endsWith(\"t\") ? \"t\" : \"\"}ers` as \"getters\"] ??= new Map()) as Map<WildPaths<T>, Array<GetterRecord<T> | SetterRecord<T> | DeleterRecord<T> | WatcherRecord<T>>>;\r\n let cords = store.get(path),\r\n cord: GetterRecord<T> | SetterRecord<T> | DeleterRecord<T> | WatcherRecord<T> | undefined;\r\n if (cords)\r\n for (let i = 0, len = cords.length; i < len; i++) {\r\n const excord = cords[i];\r\n if (Object.is(excord.cb, cb)) {\r\n cord = excord;\r\n break;\r\n }\r\n }\r\n if (cord) return cord.clup;\r\n let task: () => void;\r\n cord = { cb, once, clup: () => (lazy && this.nostall(task), this[`no${key}` as \"noget\"](path, cb)) };\r\n task = () => (cords ?? (store.set(path, (cords = [])), cords)).push(cord);\r\n lazy ? this.stall(task) : task(), init && (init !== \"auto\" || hasPath(this.core, path)) && onInit(initType);\r\n return this.binded(cord!, signal);\r\n } // add synchronous\r\n protected offSync<P extends WildPaths<T>>(store: Map<WildPaths<T>, any[]> | undefined, path: P, cb: any): boolean | undefined {\r\n const cords = store?.get(path);\r\n if (!cords) return undefined;\r\n for (let i = 0, len = cords.length; i < len; i++) {\r\n const cord = cords[i];\r\n if (Object.is(cord.cb, cb)) return cord.sclup!(), cords.splice(i, 1), !cords.length && store!.delete(path), ((cord as any)._dead = true);\r\n }\r\n return false;\r\n } // remove synchronous\r\n\r\n /**\r\n * Registers a get mediator for a path.\r\n * @param path Path or wildcard path.\r\n * @param callback Mediator callback.\r\n * @param options Sync options.\r\n * @returns Cleanup function.\r\n * @example\r\n * const cleanup = rtr.get(\"user.name\", (value) => String(value).trim());\r\n */\r\n public get<P extends WildPaths<T>>(path: P, callback: Getter<T, P>, options?: SyncOptions): GetterRecord<T>[\"clup\"] {\r\n return this.onSync(\"get\", path, callback, options, () => getPath(this.core, path));\r\n }\r\n /** Registers a get mediator for a path that only triggers once. */\r\n public gonce<P extends WildPaths<T>>(path: P, callback: Getter<T, P>, options?: SyncOptions): GetterRecord<T>[\"clup\"] {\r\n return this.get<P>(path, callback, { ...parseEvtOpts(options, EVT_OPTS.MEDIATOR), once: true });\r\n }\r\n /**\r\n * Removes a get mediator for a path.\r\n * @param path Path or wildcard path.\r\n * @param callback Mediator callback to remove.\r\n * @returns `undefined` when the path has no records, `false` when records exist but callback is not found, `true` when removed.\r\n */\r\n public noget<P extends WildPaths<T>>(path: P, callback: Getter<T, P>): boolean | undefined {\r\n return this.offSync(this.getters, path, callback);\r\n }\r\n\r\n /**\r\n * Registers a set mediator for a path.\r\n * @param path Path or wildcard path.\r\n * @param callback Mediator callback.\r\n * @param options Sync options.\r\n * @returns Cleanup function.\r\n * @example\r\n * rtr.set(\"user.name\", (value) => String(value).trim());\r\n */\r\n public set<P extends WildPaths<T>>(path: P, callback: Setter<T, P>, options?: SyncOptions): SetterRecord<T>[\"clup\"] {\r\n return this.onSync(\"set\", path, callback, options, () => (force(() => setPath(this.core, path, getPath(this.core, path))), this.tick(path)));\r\n }\r\n /** Registers a set mediator for a path that only triggers once. */\r\n public sonce<P extends WildPaths<T>>(path: P, callback: Setter<T, P>, options?: SyncOptions): SetterRecord<T>[\"clup\"] {\r\n return this.set<P>(path, callback, Object.assign(parseEvtOpts(options, EVT_OPTS.MEDIATOR), { once: true }));\r\n }\r\n /**\r\n * Removes a set mediator for a path.\r\n * @param path Path or wildcard path.\r\n * @param callback Mediator callback to remove.\r\n * @returns `undefined` when the path has no records, `false` when records exist but callback is not found, `true` when removed.\r\n */\r\n public noset<P extends WildPaths<T>>(path: P, callback: Setter<T, P>): boolean | undefined {\r\n return this.offSync(this.setters, path, callback);\r\n }\r\n\r\n /**\r\n * Registers a delete mediator for a path.\r\n * @param path Path or wildcard path.\r\n * @param callback Mediator callback.\r\n * @param options Sync options.\r\n * @returns Cleanup function.\r\n * @example\r\n * rtr.delete(\"cache.temp\", () => TERMINATOR);\r\n */\r\n public delete<P extends WildPaths<T>>(path: P, callback: Deleter<T, P>, options?: SyncOptions): DeleterRecord<T>[\"clup\"] {\r\n return this.onSync(\"delete\", path, callback, options, () => deletePath(this.core, path));\r\n }\r\n /** Registers a delete mediator for a path that only triggers once. */\r\n public donce<P extends WildPaths<T>>(path: P, callback: Deleter<T, P>, options?: SyncOptions): DeleterRecord<T>[\"clup\"] {\r\n return this.delete<P>(path, callback, Object.assign(parseEvtOpts(options, EVT_OPTS.MEDIATOR), { once: true }));\r\n }\r\n /**\r\n * Removes a delete mediator for a path.\r\n * @param path Path or wildcard path.\r\n * @param callback Mediator callback to remove.\r\n * @returns `undefined` when the path has no records, `false` when records exist but callback is not found, `true` when removed.\r\n */\r\n public nodelete<P extends WildPaths<T>>(path: P, callback: Deleter<T, P>): boolean | undefined {\r\n return this.offSync(this.deleters, path, callback);\r\n }\r\n\r\n /**\r\n * Registers a watcher for a path.\r\n * Watch callbacks run synchronously with the operation, use leaf paths for reliability as it sees exact sets; no bubbling here.\r\n * @param path Path or wildcard path.\r\n * @param callback Watch callback.\r\n * @param options Sync options.\r\n * @returns Cleanup function.\r\n * @example\r\n * const cleanup = rtr.watch(\"user.name\", (value) => console.log(value));\r\n */\r\n public watch<P extends WildPaths<T>>(path: P, callback: Watcher<T, P>, options?: SyncOptions): WatcherRecord<T>[\"clup\"] {\r\n return this.onSync(\"watch\", path, callback, options, (type) => (!type ? ((target) => callback(target.value, { type: \"init\", target, currentTarget: target, root: this.core, rejectable: false } as Payload<T, P>))(this.context(path)) : (force(() => (type === \"set\" ? setPath(this.core, path, getPath(this.core, path)) : deletePath(this.core, path))), this.tick(path)))); // no tick since sync\r\n }\r\n /** Registers a watcher for a path that only triggers once. */\r\n public wonce<P extends WildPaths<T>>(path: P, callback: Watcher<T, P>, options?: SyncOptions): WatcherRecord<T>[\"clup\"] {\r\n return this.watch<P>(path, callback, Object.assign(parseEvtOpts(options, EVT_OPTS.MEDIATOR), { once: true }));\r\n }\r\n /**\r\n * Removes a watcher for a path.\r\n * @param path Path or wildcard path.\r\n * @param callback Watch callback to remove.\r\n * @returns `undefined` when the path has no records, `false` when records exist but callback is not found, `true` when removed.\r\n */\r\n public nowatch<P extends WildPaths<T>>(path: P, callback: Watcher<T, P>): boolean | undefined {\r\n return this.offSync(this.watchers, path, callback);\r\n }\r\n\r\n /**\r\n * Registers an event listener for a path.\r\n * `on` listeners are batched and notified asynchronously by default e.g. `queueMicrotask()`.\r\n * @param path Path or wildcard path.\r\n * @param callback Listener callback.\r\n * @param options Listener options.\r\n * @returns Cleanup function.\r\n * @example\r\n * const cleanup = rtr.on(\"user.name\", (e) => console.log(e.type, e.path));\r\n */\r\n public on<P extends WildPaths<T>, const D extends number = MaxDepth>(path: P, callback: Listener<T, P, D>, options?: ListenerOptions<D>): ListenerRecord<T, P, D>[\"clup\"] {\r\n this.listeners ??= new Map();\r\n const { capture = false, once = false, signal, init = false, initType: type, depth } = parseEvtOpts(options, EVT_OPTS.LISTENER);\r\n let cords = this.listeners.get(path),\r\n cord: ListenerRecord<T> | undefined;\r\n if (cords)\r\n for (let i = 0, len = cords.length; i < len; i++) {\r\n const excord = cords[i];\r\n if (Object.is(excord.cb, callback) && capture === excord.capture) {\r\n cord = excord;\r\n break;\r\n }\r\n }\r\n if (cord) return cord.clup;\r\n cord = { cb: callback as Listener<T>, capture, depth: depth as MaxDepth, once, clup: () => this.off<P, D>(path, callback, options), lDepth: depth !== undefined ? getDepth(path) : depth };\r\n (cords ?? (this.listeners.set(path, (cords = [])), cords)).push(cord!);\r\n init && (init !== \"auto\" || hasPath(this.core, path)) && (!type ? ((target) => callback(new ReactorEvent<T, P>({ type: \"init\", target, currentTarget: target, root: this.core, reactor: this, rejectable: false }) as REvent<T, P, D>))(this.context(path)) : (force(() => (type === \"set\" ? setPath(this.core, path, getPath(this.core, path)) : deletePath(this.core, path))), this.tick(path))); // tick since async\r\n return this.binded(cord!, signal);\r\n }\r\n /** Registers an event listener for a path that only triggers once. */\r\n public once<P extends WildPaths<T>, const D extends number = MaxDepth>(path: P, callback: Listener<T, P, D>, options?: ListenerOptions<D>): ListenerRecord<T, P, D>[\"clup\"] {\r\n return this.on<P, D>(path, callback, Object.assign(parseEvtOpts(options, EVT_OPTS.LISTENER), { once: true }));\r\n }\r\n /**\r\n * Removes an event listener for a path.\r\n * @param path Path or wildcard path.\r\n * @param callback Listener callback to remove.\r\n * @param options Listener options used during registration.\r\n * @returns `undefined` when the path has no records, `false` when records exist but callback is not found, `true` when removed.\r\n * @example\r\n * const cb = (e: REvent<T>) => console.log(e.path);\r\n * rtr.on(\"user.name\", cb);\r\n * rtr.off(\"user.name\", cb);\r\n */\r\n public off<P extends WildPaths<T>, const D extends number = MaxDepth>(path: P, callback: Listener<T, P, D>, options?: ListenerOptions<D>): boolean | undefined {\r\n const cords = this.listeners?.get(path);\r\n if (!cords) return undefined;\r\n const { capture = false } = parseEvtOpts(options, EVT_OPTS.LISTENER);\r\n for (let i = 0, len = cords.length; i < len; i++) {\r\n const cord = cords[i];\r\n if (Object.is(cord.cb, callback) && cord.capture === capture) return cord.sclup!(), cords.splice(i, 1), !cords.length && this.listeners!.delete(path), ((cord as any)._dead = true);\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Creates a snapshot; possibly clone of state (or a state branch).\r\n * You could alternatively use or serialize your proxied state \"as is\" except the environment demands no proxies or new references.\r\n * @param raw Use raw (deep unproxied & uncloned) version of branch, defaults to `true` if `config.smartCloning: false`.\r\n * @param branch Specific branch to clone.\r\n * @returns Snapshot deep or smart (structurally shared) clone.\r\n * @example\r\n * const snap = rtr.snapshot();\r\n * @example\r\n * const snap = rtr.snapshot(false, rtr.core.history.past);\r\n */\r\n public snapshot(raw?: boolean): T;\r\n public snapshot<B>(raw?: boolean, branch?: B): B;\r\n public snapshot(raw = !this.config.smartCloning, branch?: any) {\r\n return this.cloned(arguments.length < 2 ? this.core : branch, raw); // raw is true if not smart cloning(structural sharing) for better vanilla performace except explicitly changed\r\n }\r\n\r\n /**\r\n * Installs a module instance.\r\n * @param target Module instance.\r\n * @param id Optional identification tag for this instance in the module.\r\n * @returns Current `Reactor` instance for fluent chaining.\r\n */\r\n public use(target: ReactorModule<T>, id?: ReactorModuleId): this {\r\n return (this.modules ??= new Set()).add(target.setup(this, id)), this;\r\n }\r\n /** Resets this reactor instance to its initial state. */\r\n public reset(): void {\r\n this.getters?.clear(), this.setters?.clear(), this.deleters?.clear(), this.watchers?.clear(), this.listeners?.clear();\r\n this.batch?.clear(), this.queue?.clear(), (this.isBatching = false);\r\n }\r\n public destroy(): void {\r\n if (this.modules) for (const mdle of this.modules) mdle.destroy();\r\n this.reset(), nuke(this);\r\n }\r\n\r\n public get canLog(): boolean {\r\n return this.log !== NOOP;\r\n }\r\n public set canLog(value: boolean) {\r\n this.log = value ? RTR_LOG : NOOP;\r\n }\r\n public get canLineageTrace() {\r\n return this.config.lineageTracing && this.config.referenceTracking;\r\n }\r\n public get canSmartClone() {\r\n return this.config.smartCloning && this.config.referenceTracking;\r\n }\r\n}\r\n","import { RAW, INERTIA, REJECTABLE, INDIFFABLE, VERSION, SSVERSION, NIL } from \"./consts\";\r\nimport { Reactor } from \"./reactor\";\r\nimport type { ReactorBuild, Inert, Intent, Live, State, Volatile, Stable } from \"@defs/reactor\";\r\n\r\n/** `Reactor` method names exposed on objects returned by `reactive()`. */\r\nexport const methods = [\"tick\", \"stall\", \"nostall\", \"get\", \"gonce\", \"noget\", \"set\", \"sonce\", \"noset\", \"delete\", \"donce\", \"nodelete\", \"watch\", \"wonce\", \"nowatch\", \"on\", \"once\", \"off\", \"snapshot\", \"use\", \"reset\", \"destroy\"] as const;\r\n\r\ntype Method = (typeof methods)[number];\r\ntype Prefix<P extends ReactivePreferences | undefined> = P extends { prefix?: infer X extends string } ? X : \"\";\r\ntype Suffix<P extends ReactivePreferences | undefined> = P extends { suffix?: infer X extends string } ? X : \"\";\r\ntype Whitelist<P extends ReactivePreferences | undefined> = P extends { whitelist?: infer W extends readonly Method[] } ? W[number] : never;\r\ntype ReactiveMethodMap<T extends object, P extends ReactivePreferences | undefined> = {\r\n [K in Method as [Prefix<P>, Suffix<P>] extends [\"\", \"\"] ? (P extends { whitelist: readonly Method[] } ? (K extends Whitelist<P> ? never : K) : K) : P extends { whitelist: readonly Method[] } ? (K extends Whitelist<P> ? `${Prefix<P>}${K}${Suffix<P>}` : K) : `${Prefix<P>}${K}${Suffix<P>}`]: Pick<Reactor<T>, Method>[K];\r\n};\r\n\r\n/** Exposed `Reactor` methods and `__Reactor__` of a `reactive()` object. */\r\nexport type APIKey<T extends object = any, P extends ReactivePreferences | undefined = undefined> = keyof ReactiveMethodMap<T, P> | \"__Reactor__\";\r\n/** Type representing a `reactive()` object with mapped `Reactor` methods and `__Reactor__`. */\r\nexport type Reactive<T extends object, P extends ReactivePreferences | undefined = undefined> = T & ReactiveMethodMap<T, P> & { __Reactor__: Reactor<T> };\r\n/** Object type with only the non-reactor props of a `reactive()` object, representing the runtime enumerable shape. */\r\nexport type Pure<T extends object, P extends ReactivePreferences | undefined = undefined> = {\r\n [K in keyof T as K extends APIKey<T, P> ? never : K]: T[K];\r\n};\r\nexport interface ReactivePreferences {\r\n /** Prefix applied to exposed `Reactor` methods. */\r\n prefix?: string;\r\n /** Suffix applied to exposed `Reactor` methods. */\r\n suffix?: string;\r\n /** Reactor methods that may collide with keys already existing in your state object.\r\n * - If an affix (prefix/suffix) is provided, ONLY these methods will receive the affix (others keep original names).\r\n * - If no affix is provided, these methods will be completely skipped and not attached.\r\n */\r\n whitelist?: readonly Method[]; // keys you're already using\r\n}\r\n\r\n/**\r\n * Attaches `Reactor` APIs to a state object and returns its reactive proxy from the reactor's core.\r\n * If an existing `reactive()` object is passed, it is re-returned ignoring change in preferences.\r\n * @param target Source state object or an existing Reactor instance.\r\n * @param build Reactor initial configuration.\r\n * @param preferences Method naming preferences for exposed APIs.\r\n * @returns Reactive object with mapped Reactor methods and `__Reactor__`.\r\n * @example\r\n * const state = reactive({ user: { name: \"Kosi\" } });\r\n * state.set(\"user.name\", (v) => v);\r\n * @example\r\n * // State already has a 'tick' that's a number so prefix the reactor's method to avoid collision.\r\n * const state = reactive({ tick: 0 }, { debug: true }, { prefix: \"$\", whitelist: [\"tick\"] });\r\n * state.$tick(); // reactor's 'tick' method is prefixed\r\n * state.set(\"tick\", (v) => v + 1); // 'set' keeps its original name\r\n * // Instead, don't prefix and just skip the 'tick' method entirely.\r\n * const state = reactive({ tick: 0 }, { debug: false }, { whitelist: [\"tick\"] });\r\n * state.tick; // number, not the reactor's method\r\n * // You could also rename the property on your State object, e.g. to \"clock\".\r\n */\r\nexport function reactive<T extends object, const P extends ReactivePreferences | undefined = undefined>(target: T, build?: ReactorBuild<T>, preferences: P = NIL): T extends Reactive<infer _O, infer _P> ? T : Reactive<T, P> {\r\n if (\"__Reactor__\" in target) return target as any;\r\n const descriptors: PropertyDescriptorMap = {},\r\n rtr = getReactor(target, true, build),\r\n locks = { enumerable: false, configurable: true, writable: false },\r\n hasAffix = !!(preferences.prefix || preferences.suffix);\r\n for (let i = 0, len = methods.length; i < len; i++) {\r\n let key = methods[i];\r\n if (hasAffix) (preferences.whitelist?.includes(key) ?? true) && (key = `${preferences.prefix || \"\"}${key}${preferences.suffix || \"\"}` as Method);\r\n else if (preferences.whitelist?.includes(key)) continue;\r\n descriptors[key] = { value: rtr[methods[i]].bind(rtr), ...locks };\r\n }\r\n descriptors[\"__Reactor__\"] = { value: rtr, ...locks };\r\n return Object.defineProperties(rtr.core, descriptors), rtr.core as any;\r\n}\r\n\r\n/**\r\n * Marks an object as intent (rejectable).\r\n * @param target Object to mark.\r\n * @returns The same object with intent typing.\r\n */\r\nexport function intent<T extends object>(target: T): Intent<T> {\r\n return (getRaw(target as any)[REJECTABLE] = true), target as Intent<T>;\r\n}\r\n/**\r\n * Removes intent (rejectable) behavior from an object.\r\n * @param target Object to unmark.\r\n * @returns The same object with state typing.\r\n */\r\nexport function state<T extends object>(target: T): State<T> {\r\n return delete getRaw(target as any)[REJECTABLE], target as State<T>;\r\n}\r\n/**\r\n * Checks whether an object is marked as intent.\r\n * @param target Object to test.\r\n * @returns `true` when marked as intent.\r\n */\r\nexport function isIntent<T extends object>(target: T = NIL): target is Intent<T> {\r\n return !!getRaw(target as any)[REJECTABLE];\r\n}\r\n\r\n/**\r\n * Marks an object as inert so it is skipped by proxy mediation.\r\n * @param target Object to mark.\r\n * @returns The same object with inert typing.\r\n */\r\nexport function inert<T extends object>(target: T): Inert<T> {\r\n return (getRaw(target as any)[INERTIA] = true), target as Inert<T>;\r\n}\r\n/**\r\n * Removes the inert marker from an object.\r\n * @param target Object to unmark.\r\n * @returns The same object with live typing.\r\n */\r\nexport function live<T extends object>(target: T): Live<T> {\r\n return delete getRaw(target as any)[INERTIA], target as Live<T>;\r\n}\r\n/**\r\n * Checks whether an object is marked as inert.\r\n * @param target Object to test.\r\n * @returns `true` when inert.\r\n */\r\nexport function isInert<T extends object>(target: T = NIL): target is Inert<T> {\r\n return !!getRaw(target as any)[INERTIA];\r\n}\r\n\r\n/**\r\n * Marks an object as volatile (indiffable enabled).\r\n * @param target Object to mark.\r\n * @returns The same object with volatile typing.\r\n */\r\nexport function volatile<T extends object>(target: T): Volatile<T> {\r\n return (getRaw(target as any)[INDIFFABLE] = true), target as Volatile<T>;\r\n}\r\n/**\r\n * Removes volatile behavior from an object.\r\n * @param target Object to unmark.\r\n * @returns The same object with stable typing.\r\n */\r\nexport function stable<T extends object>(target: T): Stable<T> {\r\n return delete getRaw(target as any)[INDIFFABLE], target as Stable<T>;\r\n}\r\n/**\r\n * Checks whether an object is marked as volatile.\r\n * @param target Object to test.\r\n * @returns `true` when marked as volatile.\r\n */\r\nexport function isVolatile<T extends object>(target: T = NIL): target is Volatile<T> {\r\n return !!getRaw(target as any)[INDIFFABLE];\r\n}\r\n\r\n/**\r\n * Gets the underlying `Reactor` instance associated with a `reactive()` object,\r\n * returns the `Reactor` itself if given, or optionally creates one for plain objects.\r\n * @param target Object to retrieve `Reactor` from.\r\n * @param create When `true`, creates a new `Reactor` for plain objects when none exists.\r\n * @param build Optional `Reactor` build options used only when `create` initializes a new instance.\r\n * @returns `Reactor` instance or `undefined` if not reactive and `create` is false.\r\n */\r\nexport function getReactor<T extends object>(target: Reactor<T>, create?: boolean, build?: ReactorBuild<T>): Reactor<T>;\r\nexport function getReactor<T extends object>(target: Reactive<T>, create?: boolean, build?: ReactorBuild<T>): Reactor<T>;\r\nexport function getReactor<T extends object>(target: T, create: true, build?: ReactorBuild<T>): Reactor<T>;\r\nexport function getReactor<T extends object>(target: T, create?: false, build?: ReactorBuild<T>): Reactor<T> | undefined;\r\nexport function getReactor<T extends object>(target: T | Reactor<T> | Reactive<T>, create: true, build?: ReactorBuild<T>): Reactor<T>;\r\nexport function getReactor<T extends object>(target: T | Reactor<T> | Reactive<T>, create?: false, build?: ReactorBuild<T>): Reactor<T> | undefined;\r\nexport function getReactor<T extends object>(target: T | Reactor<T> | Reactive<T>, create = false, build?: ReactorBuild<T>): Reactor<T> | undefined {\r\n return (target instanceof Reactor ? target : (target as Reactive<T>).__Reactor__) || (create ? new Reactor(target as T, build) : undefined);\r\n}\r\n\r\n/**\r\n * Gets the raw (unproxied) version of an object if it's proxied, otherwise returns the original object.\r\n * @param target Object to unwrap.\r\n * @returns Raw object if proxied, else the original object. Use `Reactor.snapshot(true)` for deep unwrapping.\r\n */\r\nexport function getRaw<T extends object>(target: T = NIL): T {\r\n return (target as any)[RAW] || target;\r\n}\r\n\r\n/**\r\n * Gets the current structural version of an object.\r\n * @param target Object to inspect.\r\n * @returns Version number.\r\n */\r\nexport function getVersion<T extends object>(target: T = NIL): number {\r\n return getRaw(target as any)[VERSION] || 0;\r\n}\r\n/**\r\n * Gets the current snapshot-cache version of an object.\r\n * @param target Object to inspect.\r\n * @returns Snapshot version number.\r\n */\r\nexport function getSnapshotVersion<T extends object>(target: T = NIL): number {\r\n return getRaw(target as any)[SSVERSION] || 0;\r\n}\r\n","import { CTX, NIL, RAW } from \"@core/consts\";\r\nimport { Reactor } from \"@core/reactor\";\r\nimport type { EffectOptions } from \"@defs/reactor\";\r\nimport type { WildPaths, DeepReadonly } from \"@defs/obj\";\r\nimport { canHandle, nuke } from \"@utils/obj\";\r\n\r\nexport let activeTracker: Autotracker<any> | null = null;\r\n\r\n// ===========================================================================\r\n// The S.I.A (State & Intent Architecture) `AutoTracker`\r\n// ===========================================================================\r\n\r\n/**\r\n * - Auto-dependency tracker used to subscribe only to accessed paths.\r\n * - `tracked(...)` wraps a snapshot in a read-tracking proxy, and `callback(...)`\r\n * binds subscriptions for collected paths using `watch` (sync) or `on` (batched).\r\n * @typeParam T Root state object type.\r\n */\r\nexport class Autotracker<T extends object> {\r\n public proxy!: T;\r\n public deps = new Map<Reactor<any>, Set<string>>();\r\n public isTracking = true;\r\n protected rtr?: Reactor<T>;\r\n /** only allows one reactor to autotrack when available */\r\n protected autortr?: Reactor<T>;\r\n protected clups: Array<() => void> = [];\r\n protected lastPath?: WildPaths<T>;\r\n protected proxyCache = new WeakMap<object, any>();\r\n\r\n /** @param rtr Reactor instance used for path subscriptions. */\r\n constructor(rtr?: Reactor<T>) {\r\n this.autortr = this.rtr = rtr;\r\n }\r\n\r\n /**\r\n * Starts a new tracking pass and returns a readonly tracking proxy for `target` if `this` was instantiated with a `Reactor`.\r\n * @param target Snapshot (or state branch) to track reads from.\r\n * @returns Read-tracking readonly proxy.\r\n * @example\r\n * const atrkr = new Autotracker(rtr);\r\n * const state = atrkr.tracked(rtr.snapshot());\r\n * const name = state.user.profile.name;\r\n */\r\n public tracked(target: T): DeepReadonly<T> {\r\n return this.unblock(), (this.proxy = this.proxied(target, \"\")) as DeepReadonly<T>;\r\n }\r\n protected proxied<O extends object>(obj: O, path: string): O {\r\n if (!this.rtr || !obj || \"object\" !== typeof obj) return obj;\r\n const cached = this.proxyCache.get(obj);\r\n if (cached) return cached;\r\n if (!canHandle(obj, this.rtr!.config, false)) return obj;\r\n const proxy = new Proxy(obj, {\r\n // Minimal Proxy Handler\r\n get: (object, key, receiver) => {\r\n if (key === RAW) return this.rtr!.log(`👀 [AutoTracker \\`get\\` Trap] Peeked at ${object}`), object;\r\n const keyStr = String(key),\r\n fullPath = (path ? `${path}.${keyStr}` : keyStr) as WildPaths<T>;\r\n return this.rtr!.log(`🔍 [AutoTracker \\`get\\` Trap] Initiated for \"${keyStr}\" on '${path}'`), this.track(fullPath), this.proxied(!this.rtr!.config.preserveContext ? (object as any)[key] : Reflect.get(object, key, receiver), fullPath);\r\n },\r\n has: (object, key) => {\r\n const keyStr = String(key),\r\n fullPath = (path ? `${path}.${keyStr}` : keyStr) as WildPaths<T>;\r\n return this.rtr!.log(`❓ [AutoTracker \\`has\\` Trap] Initiated for \"${keyStr}\" on '${path}'`), this.track(fullPath), !this.rtr!.config.preserveContext ? key in object : Reflect.has(object, key);\r\n },\r\n getOwnPropertyDescriptor: (object, key) => {\r\n const keyStr = String(key),\r\n fullPath = (path ? `${path}.${keyStr}` : keyStr) as WildPaths<T>;\r\n return this.rtr!.log(`📋 [AutoTracker \\`getOwnPropertyDescriptor\\` Trap] Initiated for \"${keyStr}\" on '${path}'`), this.track(fullPath), !this.rtr!.config.preserveContext ? Object.getOwnPropertyDescriptor(object, key) : Reflect.getOwnPropertyDescriptor(object, key);\r\n },\r\n ownKeys: (object) => {\r\n const safePath = (path || \"*\") as WildPaths<T>;\r\n return this.rtr!.log(`🔑 [AutoTracker \\`ownKeys\\` Trap] Initiated on \"${safePath}\"`), this.track(safePath), Reflect.ownKeys(object); // no faster accurate way without Reflect API\r\n },\r\n set: (_, key) => {\r\n throw new Error(`🛡️ [AutoTracker \\`set\\` Trap] Blocked for \"${String(key)}\" on '${path}'`); // semantic unlike proxy default error\r\n },\r\n deleteProperty: (_, key) => {\r\n throw new Error(`🛡️ [AutoTracker \\`deleteProperty\\` Trap] Blocked for \"${String(key)}\" on '${path}'`); // semantic unlike proxy default error\r\n },\r\n defineProperty: (_, key) => {\r\n throw new Error(`🛡️ [AutoTracker \\`defineProperty\\` Trap] Blocked for \"${String(key)}\" on '${path}'`); // semantic unlike proxy default error\r\n },\r\n setPrototypeOf: (_, key) => {\r\n throw new Error(`🛡️ [AutoTracker \\`setPrototypeOf\\` Trap] Blocked for \"${String(key)}\" on '${path}'`); // semantic unlike proxy default error\r\n },\r\n });\r\n return this.proxyCache.set(obj, proxy), proxy;\r\n }\r\n\r\n /** Adds a path to the tracking set. */\r\n public track<const P extends WildPaths<T>>(path: P, rtr: Reactor<any> = this.rtr!, prune = false, strict = false): P {\r\n if (!this.isTracking || !path || (this.autortr && this.autortr !== rtr)) return path;\r\n let paths = this.deps.get(rtr);\r\n if (!prune && !paths) paths = (this.deps.set(rtr, (paths = new Set())), paths);\r\n if (path.startsWith(this.lastPath + \".\")) {\r\n const child = path.slice(this.lastPath!.length + 1);\r\n (strict || (!child.includes(\"Symbol(\") && child !== \"length\" && !/^\\d+$/.test(child))) && paths!.delete(this.lastPath!); // #SENSITIVE\r\n }\r\n return !prune && paths!.add((this.lastPath = path)), path;\r\n }\r\n /** Removes a path from the tracking set. */\r\n public untrack(path: WildPaths<T>, rtr: Reactor<any> = this.rtr!): void {\r\n this.deps.get(rtr)?.delete(path);\r\n }\r\n /** Enables path tracking. */\r\n public unblock(rtr: Reactor<any> = this.rtr!): void {\r\n this.deps.clear();\r\n this.autortr = rtr;\r\n this.isTracking = true;\r\n this.lastPath = undefined;\r\n }\r\n /** Temporarily disables path tracking. */\r\n public block(): void {\r\n this.autortr = undefined;\r\n this.isTracking = false;\r\n }\r\n\r\n /**\r\n * Subscribes an effect to tracked paths.\r\n * Uses `watch` when `options.sync === true` (synchronous updates), otherwise\r\n * uses `on` (batched/asynchronous listener wave).\r\n * @param cb Effect callback.\r\n * @param options Effect options.\r\n * @returns Cleanup function for active subscriptions.\r\n * @example\r\n * const atrkr = new Autotracker(rtr);\r\n * const view = atrkr.tracked(rtr.snapshot()); // tracked works if `rtr` was passed at instantiation\r\n * view.user.name;\r\n * const stop = atrkr.callback(() => console.log(\"changed\")); // re-run after when \".user.name\" changes\r\n * @example Packaged Customization\r\n * const atrkr = new Autotracker(); // no reactor passed\r\n * withTracker(atrkr, () => state.user.name); // import `withTracker` too\r\n * const stop = atrkr.callback(() => console.log(\"sync\"), { sync: true }); // re-run immediately when \".user.name\" changes, works on any path used from any reactor state\r\n * @example Extensive Customization\r\n * atrkr.unblock();\r\n * const prev = CTX.autotracker;\r\n * CTX.autotracker = atrkr; // import CTX first\r\n * state.user.name;\r\n * CTX.autotracker = prev;\r\n */\r\n public callback(cb: () => void, options: EffectOptions = NIL): () => void {\r\n this.cleanup();\r\n const method = options.sync ? \"watch\" : \"on\";\r\n for (const [rtr, paths] of this.deps) {\r\n if (!paths.size || paths.has(\"*\")) rtr && this.clups.push(rtr[method as \"on\"](\"*\", cb, options));\r\n else for (const path of paths) this.clups.push(rtr[method as \"on\"](path, cb, options));\r\n }\r\n return () => this.cleanup();\r\n }\r\n\r\n /** Clears active subscriptions and blocks tracking. */\r\n public cleanup(): void {\r\n this.block();\r\n for (let i = 0, len = this.clups.length; i < len; i++) this.clups[i]();\r\n this.clups.length = 0;\r\n }\r\n public destroy(): void {\r\n this.deps.clear(), this.cleanup(), nuke(this);\r\n }\r\n}\r\n\r\n/**\r\n * Utility function to run a callback with a specific tracker context, restoring the previous context afterward.\r\n * @param tracker The Autotracker instance to set as the active tracker during the callback execution.\r\n * @param callback The callback function to execute with the specified tracker context.\r\n * @param rtr Optional Reactor instance to associate with the tracker during execution.\r\n * @returns The result of the callback function.\r\n */\r\nexport function withTracker<T>(tracker: Autotracker<any>, callback: () => T, rtr?: Reactor<any>): T {\r\n const prev = CTX.autotracker; // to survive nested trackers\r\n CTX.autotracker = tracker;\r\n try {\r\n return tracker.unblock(rtr), callback();\r\n } finally {\r\n CTX.autotracker = prev;\r\n }\r\n}\r\n","import { useSyncExternalStore, useRef, useCallback } from \"react\";\r\nimport { useISOLayoutEffect } from \"../utils\";\r\nimport { NIL, NOOP } from \"@core/consts\";\r\nimport { Reactor } from \"@core/reactor\";\r\nimport { type Reactive, getReactor } from \"@core/mixins\";\r\nimport type { EffectOptions, ReactorBuild } from \"@defs/reactor\";\r\nimport type { DeepReadonly } from \"@defs/obj\";\r\nimport { Autotracker, withTracker } from \"../../autotracker\";\r\n\r\n/**\r\n * Subscribes to a derived slice of Reactor state.\r\n * The selector runs against the live state and uses the provided equality function\r\n * to suppress unchanged results.\r\n * @typeParam T Root state object type.\r\n * @typeParam R Selector return type.\r\n * @param target Reactive object, Reactor instance, or plain object.\r\n * @param sel Slice selector.\r\n * @param eq Equality function used to compare consecutive selector results.\r\n * @param options Watcher options if `options.sync: false` else Listener options.\r\n * @param build Optional Reactor build options used when creating a scoped Reactor for plain objects.\r\n * @returns The selected slice.\r\n * @example\r\n * const a = useSelector({ user: { name: \"Kosi\" } }, (s) => s.user.name); // per-component scoped\r\n * @example\r\n * const state = reactive({ user: { name: \"Kosi\" } });\r\n * const b = useSelector(state, (s) => s.user.name);\r\n * @example\r\n * const rtr = new Reactor({ user: { name: \"Kosi\" } });\r\n * const c = useSelector(rtr, (s) => s.user.name);\r\n */\r\nexport function useSelector<T extends object, R>(target: T | Reactor<T> | Reactive<T>, sel: (state: T) => R, eq: (prev: R | undefined, next: R) => boolean = Object.is, options: EffectOptions = NIL, build?: ReactorBuild<T>): R {\r\n const rtrRef = useRef<Reactor<T>>(),\r\n tgtRef = useRef<T | Reactor<T> | Reactive<T>>(), // HMR Survival\r\n rtr = tgtRef.current !== target || !rtrRef.current ? ((tgtRef.current = target), (rtrRef.current = getReactor(target, true, build))) : rtrRef.current,\r\n atrkrRef = useRef<Autotracker<T>>(),\r\n atrkr = (atrkrRef.current ||= new Autotracker()), // assigned after to avoid waste of new instances\r\n notifyRef = useRef<() => void>(NOOP),\r\n sliceRef = useRef<R>(),\r\n selRef = useRef(sel),\r\n eqRef = useRef(eq),\r\n optsRef = useRef(options);\r\n (selRef.current = sel), (eqRef.current = eq), (optsRef.current = options); // preventing staleness\r\n const subscribe = useCallback((notify: () => void) => atrkr.callback((notifyRef.current = notify), optsRef.current), [atrkr]);\r\n const getSnapshot = useCallback(() => {\r\n const next = withTracker(atrkr, () => selRef.current(rtr.core), rtr);\r\n return eqRef.current(sliceRef.current, next) ? sliceRef.current! : (sliceRef.current = next);\r\n }, [atrkr, rtr]);\r\n const slice = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\r\n return useISOLayoutEffect(() => atrkr.callback(notifyRef.current, optsRef.current), [atrkr, slice]), slice;\r\n}\r\n\r\n/**\r\n * Subscribes to a derived slice of any Reactor state.\r\n * The selector runs against the live state and uses the provided equality function\r\n * to suppress unchanged results.\r\n * @typeParam R Selector return type.\r\n * @param sel Slice selector.\r\n * @param eq Equality function used to compare consecutive selector results.\r\n * @param options Watcher options if `options.sync: false` else Listener options.\r\n * @returns The selected slice.\r\n * @example\r\n * useAnySelector(() => store.user.name + spouseStore.user.name);\r\n */\r\nexport function useAnySelector<R>(sel: () => R, eq = Object.is, options: EffectOptions = NIL): R {\r\n const atrkrRef = useRef<Autotracker<any>>(),\r\n atrkr = (atrkrRef.current ||= new Autotracker()),\r\n notifyRef = useRef<() => void>(NOOP),\r\n sliceRef = useRef<R>(),\r\n selRef = useRef(sel),\r\n eqRef = useRef(eq),\r\n optsRef = useRef(options);\r\n (selRef.current = sel), (eqRef.current = eq), (optsRef.current = options); // preventing staleness\r\n const subscribe = useCallback((notify: () => void) => atrkr.callback((notifyRef.current = notify), optsRef.current), [atrkr]);\r\n const getSnapshot = useCallback(() => {\r\n const next = withTracker(atrkr, () => selRef.current());\r\n return eqRef.current(sliceRef.current, next) ? sliceRef.current! : (sliceRef.current = next);\r\n }, [atrkr]);\r\n const slice = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\r\n return useISOLayoutEffect(() => atrkr.callback(notifyRef.current, optsRef.current), [atrkr, slice]), slice;\r\n}\r\n\r\n/**\r\n * Subscribes to a derived slice of Reactor state.\r\n * The selector runs against a readonly tracked snapshot and uses the provided equality function\r\n * to suppress unchanged results.\r\n * @typeParam T Root state object type.\r\n * @typeParam R Selector return type.\r\n * @param target Reactive object, Reactor instance, or plain object.\r\n * @param sel Slice selector.\r\n * @param eq Equality function used to compare consecutive selector results.\r\n * @param options Watcher options if `options.sync: false` else Listener options.\r\n * @param build Optional Reactor build options used when creating a scoped Reactor for plain objects.\r\n * @returns The selected slice.\r\n * @example\r\n * const a = useSelectorSnapshot({ user: { name: \"Kosi\" } }, (s) => s.user.name); // per-component scoped\r\n * @example\r\n * const state = reactive({ user: { name: \"Kosi\" } });\r\n * const b = useSelectorSnapshot(state, (s) => s.user.name);\r\n * @example\r\n * const rtr = new Reactor({ user: { name: \"Kosi\" } });\r\n * const c = useSelectorSnapshot(rtr, (s) => s.user.name);\r\n */\r\nexport function useSelectorSnapshot<T extends object, R>(target: T | Reactor<T> | Reactive<T>, sel: (state: DeepReadonly<T>) => R, eq = Object.is, options?: EffectOptions, build: ReactorBuild<T> = { referenceTracking: true, smartCloning: true }): R {\r\n const tgtRef = useRef<T | Reactor<T> | Reactive<T>>(),\r\n rtrRef = useRef<Reactor<T>>(),\r\n rtr = tgtRef.current !== target || !rtrRef.current ? ((tgtRef.current = target), (rtrRef.current = getReactor(target, true, build))) : rtrRef.current,\r\n atrkrRef = useRef<Autotracker<T>>(),\r\n atrkrRtrRef = useRef<Reactor<T>>(),\r\n atrkr = atrkrRtrRef.current !== rtr || !atrkrRef.current ? ((atrkrRtrRef.current = rtr), (atrkrRef.current = new Autotracker(rtr))) : atrkrRef.current,\r\n notifyRef = useRef<() => void>(NOOP),\r\n sliceRef = useRef<R>(),\r\n selRef = useRef(sel),\r\n eqRef = useRef(eq),\r\n optsRef = useRef(options);\r\n rtr.config.referenceTracking = rtr.config.smartCloning = true;\r\n (optsRef.current = options), (selRef.current = sel), (eqRef.current = eq); // preventing staleness\r\n const subscribe = useCallback((notify: () => void) => (atrkr.callback((notifyRef.current = notify), optsRef.current), () => atrkr.cleanup()), [atrkr]);\r\n const getSnapshot = useCallback(() => {\r\n const next = selRef.current(atrkr.tracked(rtr.snapshot()));\r\n return eqRef.current(sliceRef.current, next) ? sliceRef.current! : (sliceRef.current = next);\r\n }, [atrkr]);\r\n const slice = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\r\n return useISOLayoutEffect(() => atrkr.callback(notifyRef.current, optsRef.current), [atrkr, slice]), slice;\r\n} // Nothing much here, just rebuilding \"Zustand.js\" `useSelector`, Proof of Concept: Reactor is a core of cores\r\n","import { useRef, useSyncExternalStore, useCallback } from \"react\";\r\nimport { NIL } from \"@core/consts\";\r\nimport { Reactor } from \"@core/reactor\";\r\nimport { type Reactive, getReactor } from \"@core/mixins\";\r\nimport type { EffectOptions, ReactorBuild } from \"@defs/reactor\";\r\nimport type { WildPaths, PathValue } from \"@defs/obj\";\r\nimport { getPath } from \"@utils/obj\";\r\n\r\n/**\r\n * Subscribes to a single path in Reactor state.\r\n * Uses sync watcher mode when `options.sync` is enabled; otherwise uses event listeners.\r\n * @typeParam T Root state object type.\r\n * @typeParam P Path or wildcard path type.\r\n * @param target Reactive object, Reactor instance, or plain object.\r\n * @param path Path to observe. Supports dotted paths and wildcard `\"*\"`.\r\n * @param options Watcher options if `options.sync: false` else Listener options.\r\n * @param build Optional Reactor build options used when creating a scoped Reactor for plain objects.\r\n * @returns Current value at the requested path.\r\n * @example\r\n * const a = usePath({ user: { profile: { name: \"Kosi\" } } }, \"user.profile.name\");\r\n * @example\r\n * const state = reactive({ user: { profile: { name: \"Kosi\" } } });\r\n * const b = usePath(state, \"user.profile.name\");\r\n * @example\r\n * const rtr = new Reactor({ user: { profile: { name: \"Kosi\" } } });\r\n * const c = usePath(rtr, \"user.profile.name\");\r\n * @example\r\n * const wholeState = usePath(state, \"*\");\r\n */\r\nexport function usePath<T extends object, P extends WildPaths<T>>(target: T | Reactor<T> | Reactive<T>, path: P, options: EffectOptions = NIL, build?: ReactorBuild<T>): PathValue<T, P> {\r\n const versionRef = useRef(0),\r\n tgtRef = useRef<T | Reactor<T> | Reactive<T>>(), // HMR Survival\r\n rtrRef = useRef<Reactor<T>>(),\r\n rtr = tgtRef.current !== target || !rtrRef.current ? ((tgtRef.current = target), (rtrRef.current = getReactor(target, true, build))) : rtrRef.current,\r\n optsRef = useRef(options);\r\n optsRef.current = options; // preventing staleness\r\n const subscribe = useCallback((notify: () => void) => rtr[(optsRef.current.sync ? \"watch\" : \"on\") as \"on\"](path, () => (versionRef.current++, notify()), optsRef.current), [rtr, path]);\r\n const getSnapshot = useCallback(() => versionRef.current, []);\r\n useSyncExternalStore(subscribe, getSnapshot, getSnapshot); // Feed React a primitive number to track tearing, zero cloning.\r\n return getPath(rtr.core, path);\r\n}\r\n","import { useRef } from \"react\";\r\nimport { TimeTravelModule } from \"@modules/timeTravel\";\r\nimport { type TimeTravelConsoleConfig, TimeTravelConsole as VTimeTravelConsole } from \"../vanilla/TimeTravelConsole\";\r\nimport { useISOLayoutEffect } from \"./utils\";\r\n\r\n/** React props for controlling the vanilla TimeTravel overlay. */\r\nexport interface TimeTravelConsoleProps extends Partial<TimeTravelConsoleConfig> {\r\n /** Module instance controlled by this overlay bridge. */\r\n time: TimeTravelModule<any, any>;\r\n}\r\n\r\n/**\r\n - React bridge for mounting and controlling a vanilla TimeTravelConsole instance.\r\n - Instantiates a `TimeTravelConsole` for the provided module, tears it down on unmount, and syncs prop changes into reactive `config`.\r\n * Use this when your app is React but you want the overlay behavior with react-safe instance lifecycle management.\r\n * @param props Overlay bridge props.\r\n */\r\nexport function TimeTravelConsole(props: TimeTravelConsoleProps) {\r\n const vRef = useRef<VTimeTravelConsole | null>(null),\r\n { time, title, color, devOnly, startOpen, container } = props;\r\n\r\n useISOLayoutEffect(() => {\r\n vRef.current = new VTimeTravelConsole(time, props);\r\n return () => void (vRef.current?.destroy(), (vRef.current = null));\r\n }, [time]);\r\n useISOLayoutEffect(() => void (vRef.current && (title !== undefined && (vRef.current.config.title = title), (vRef.current.config.color = color!), (vRef.current.config.devOnly = devOnly!), (vRef.current.config.container = container!), (vRef.current.state.open = startOpen!))), [title, color, devOnly, container, startOpen]);\r\n\r\n return null;\r\n}\r\n","import type { Reactor } from \"@core/reactor\";\r\nimport { getReactor, type Reactive, reactive } from \"@core/mixins\";\r\nimport { isObj, matchPaths, getPath, setPath, nuke } from \"@utils/obj\";\r\nimport { guardMethod, guardAllMethods } from \"@utils/methd\";\r\nimport { ReactorModulePathConfig, ReactorModuleConstructor, ReactorModuleId, ModulePaths } from \"./types\";\r\n\r\n/**\r\n * Base class, extend to create custom reactor modules that can be used with a `Reactor` instance\r\n * Provides common functionalities like multi-reactor management, configuration handling, and error logging.\r\n * @typeParam T Root state object type of the reactors this module will manage.\r\n * @typeParam Config Configuration object type for the module.\r\n * @typeParam State Optional local state object type for the module.\r\n */\r\nexport abstract class BaseReactorModule<T extends object = any, Config extends Partial<ReactorModulePathConfig<T>> = any, State = any> {\r\n public static readonly moduleName: string;\r\n public get name() {\r\n return (this.constructor as ReactorModuleConstructor).moduleName;\r\n }\r\n protected readonly ac = new AbortController();\r\n protected readonly signal = this.ac.signal;\r\n public readonly deps = new Map<ReactorModuleId, Reactor<any>>();\r\n public readonly rids = new WeakMap<Reactor<any>, ReactorModuleId>(); // for quick 0(1) lookups over iteration\r\n public readonly evtOpts = { signal: this.signal };\r\n /** The reactive state object for the module, watch to see exposed lifecycle changes. */\r\n public readonly state!: State extends object ? Reactive<State> : State;\r\n /** The reactive configuration object for the module, manipulate to change behaviour. */\r\n public config!: Config extends object ? Reactive<Config> : Config;\r\n public wired = false;\r\n private readonly clups = new Map<ReactorModuleId, (() => void)[]>();\r\n\r\n constructor(config?: Config, rtr?: Reactor<T>, state?: State) {\r\n guardAllMethods(this, this.guard); // Modules can sacrifice memory footprint for error proofing and events devx\r\n this.config = (isObj(config) ? reactive(config) : config) as BaseReactorModule[\"config\"];\r\n this.state = (isObj(state) ? reactive(state) : state) as BaseReactorModule[\"state\"];\r\n rtr && this.attach(rtr); // User don't have to pass rtr at instantion except config options need type inference from `T`\r\n }\r\n\r\n /**\r\n * Connect to a `Reactor` instance, allows managing multiple reactors if needed.\r\n * @param target `Reactor` instance or `reactive()` object to connect to.\r\n * @param id Optional custom id for the reactor, prefer over default implicit index id when managing multiple reactors, supports paths to merge into a single tree.\r\n * @returns Current `ReactorModule` instance for fluent chaining.\r\n * @example\r\n * const mod = new MyModule().attach(state1).attach(state2); // implicit index-based ids by default, add a .setup() or `Reactor.use()` when ready for init.\r\n * @example\r\n * const persist = new PersistModule(config).attach(sessState, \"session\").attach(adminState, \"session.admin\"); // don't use \"*\", causes de-serialization issues.\r\n */\r\n public attach(target?: Reactor<any> | Reactive<any>, id: ReactorModuleId = this.deps.size) {\r\n const rtr = getReactor(target);\r\n if (!rtr || this.deps.has(id)) return this;\r\n return this.rids.set((this.deps.set(id, rtr), rtr), id), this.onAttach(rtr, id), this;\r\n }\r\n protected onAttach(_rtr: Reactor<any>, _rid?: ReactorModuleId): void {}\r\n protected attachPaths(rtr: Reactor<any>, rid: ReactorModuleId, paths = this.getPaths(rid)) {\r\n let clups = this.clups.get(rid);\r\n if (!clups) this.clups.set(rid, (clups = []));\r\n for (let i = 0, len = paths.length; i < len; i++) {\r\n const path = paths[i];\r\n !this.config.disabled ? clups.push(this.config.synchronous ? rtr.watch(path, this.handlePathSync, { signal: this.signal }) : rtr.on(path, this.handlePath, this.evtOpts)) : this.config.synchronous ? rtr.nowatch(path, this.handlePathSync) : rtr.off(path, this.handlePath, this.evtOpts);\r\n }\r\n }\r\n\r\n /**\r\n * Entry point called to initialize module wiring, calls `.attach(target, id)` first, `Reactor.use()` calls this internally.\r\n * Should run as last in `.attach()` chain or after all desired reactors if using multiple; so wiring is done safely after.\r\n * @param target `Reactor` instance or `reactive()` object to connect to.\r\n * @param id Optional id for the reactor, prefer over default implicit index id when managing multiple reactors.\r\n * @returns Current `ReactorModule` instance for fluent chaining.\r\n * @example\r\n * const mod = new MyModule().attach(state1).setup(state2); // if using multiple, this should run last; with same params as `.attach()` for a shorter chain\r\n */\r\n public setup(target?: Reactor<any> | Reactive<any>, id?: ReactorModuleId): this {\r\n return this.attach(target, id), !this.wired && (this.wire(), (this.wired = true)), this;\r\n }\r\n /** set up listeners/subscriptions and module runtime wiring. */\r\n public abstract wire(): void;\r\n\r\n public destroy(): void {\r\n if (this.ac) this.ac.abort(), this.onDestroy?.(), nuke(this); // only one rtr can kill; nuke is notorious\r\n }\r\n protected onDestroy?(): void;\r\n\r\n /**\r\n * Wraps a function with module-scoped error logging, every instance methods is already auto-wrapped with this.\r\n * Use this when creating functions dynamically (for example, before attaching an anonymous listener on the fly).\r\n * @example\r\n * window.addEventListener(\"resize\", this.guard(() => this.syncLayout(true)), { signal: this.signal });\r\n */\r\n protected guard = <Fn extends Function>(fn: Fn) => {\r\n return guardMethod(fn, (e) => this.deps.values().next().value?.log(`[Reactor \"${this.name}\" Module] Error: ${e}`)); // treated as seperate log identities\r\n }; // `()=>{}`: needs to be bounded even before initialization\r\n\r\n protected handleWhitelist({ currentTarget: { value: paths } }: any): void {\r\n for (const [rid, rtr] of this.deps) this.cleanup(rid), this.attachPaths(rtr, rid, this.getPaths(rid, paths));\r\n } // child wires when ready\r\n private handlePath(e: any, rid = this.rids.get(e.reactor)!): void {\r\n (!this.config.blacklist || !matchPaths(this.getPaths(rid, this.config.blacklist, true), e.path)) && this.onPath(e, rid);\r\n }\r\n private handlePathSync = (_: any, p: any) => this.handlePath(p);\r\n protected onPath(_e: any, _rid: ReactorModuleId): void {}\r\n\r\n protected handleSynchronous() {\r\n for (const [rid, rtr] of this.deps) this.cleanup(rid), this.attachPaths(rtr, rid);\r\n } // child wires when ready\r\n\r\n private cleanup(rid: ReactorModuleId): void {\r\n const clups = this.clups.get(rid);\r\n if (clups) for (let i = 0, len = clups.length; i < len; i++) clups[i]();\r\n clups && (clups.length = 0);\r\n }\r\n\r\n /**\r\n * Path resolution utility for modules, provides automatic reactor id resolution for multi-reactor setups.\r\n * @param target Reactor or reactor id to resolve paths for when using per-reactor path lists`.\r\n * @param paths Paths to filter by, supports same formats as `ModulePaths`, will be resolved with the module's reactor id if applicable.\r\n * @returns Resolved paths array, defaults to `[\"*\"]` if no paths are found using search criteria.\r\n */\r\n public getPaths<P extends string = string>(target?: Reactor<any> | ReactorModuleId, paths = this.config.whitelist as ModulePaths<P>, allowEmpty = paths !== this.config.whitelist): P[] {\r\n const rid = (target as any)?.core ? this.rids.get(target as Reactor<any>) : target;\r\n return ((paths && (Array.isArray(paths) ? paths : paths[String(rid)])) ?? (!allowEmpty ? wpArr : [])) as P[];\r\n }\r\n\r\n /**\r\n * Compute the serialized payload for all attached reactors.\r\n * If multiple reactors are attached, returns a merged object keyed by reactor id. Honors `whitelist`, `snapshot` and `mirrorWrites` configuration on each reactor.\r\n * @param target Optional target reactor or id to compute payload for, useful when using per-reactor path lists.\r\n * @returns The payload to persist (or `undefined` for empty single-reactor payload).\r\n */\r\n public getPayload(target?: Reactor<any> | ReactorModuleId, _rid?: ReactorModuleId, _nest = target ? false : this.deps.size > 1): any {\r\n const _rtr = (target as any)?.core ? (target as Reactor<any>) : this.deps.get(target as ReactorModuleId)!;\r\n let res: Record<string, any> | undefined = _nest ? {} : undefined;\r\n for (const [rid, rtr] of !target ? this.deps : [[_rid || target, _rtr] as const]) {\r\n const snap = this.config.snapshot ? (this.config.snapshot === true && (rtr.config.referenceTracking = rtr.config.smartCloning = true), rtr.snapshot()) : rtr.core,\r\n val: any = this.config.whitelist ? {} : snap;\r\n if (this.config.whitelist) {\r\n const paths = this.getPaths(rid);\r\n for (let i = 0, len = paths.length; i < len; i++) {\r\n const _path = paths[i],\r\n path = (!this.config.mirrorReads || !_path.includes(\"intent\") ? _path : _path.replace(\"intent\", \"state\")) as any;\r\n setPath(val, _path, getPath(snap, path));\r\n }\r\n }\r\n _nest ? setPath(res!, rid as any, val) : (res = val); // allows merging with path-like ids\r\n }\r\n return res;\r\n }\r\n}\r\n\r\nexport const wpArr = [\"*\"] as any;\r\nexport type * from \"./types\";\r\n","// Types\ntype Dataset = Record<string, string | number>;\ntype Style = Partial<CSSStyleDeclaration>;\n\n// Element Factory\n\n/**\n * Creates an HTML element with the specified tag and properties.\n * @param tag The tag name of the element to create.\n * @param props Optional properties to set on the element.\n * @param dataset Optional dataset attributes for the element.\n * @param styles Optional CSS styles for the element.\n * @returns The created HTML element.\n */\nexport function createEl<K extends keyof HTMLElementTagNameMap>(tag: K, props?: Partial<HTMLElementTagNameMap[K]>, dataset?: Dataset, styles?: Style): HTMLElementTagNameMap[K];\nexport function createEl(tag: string, props?: Partial<HTMLElement>, dataset?: Dataset, styles?: Style): HTMLElement | null;\nexport function createEl(tag: string, props?: Record<string, unknown>, dataset?: Dataset, styles?: Style, el = tag ? document?.createElement(tag) : null): HTMLElement | null {\n return assignEl(el, props, dataset, styles);\n}\n\n/**\n * Assigns properties, dataset attributes, and styles to an HTML element.\n * @param el The HTML element to assign properties to.\n * @param props Optional properties to set on the element.\n * @param dataset Optional dataset attributes for the element.\n * @param styles Optional CSS styles for the element.\n * @return The modified HTML element to allow signature swaps with `createEl()`.\n */\nexport function assignEl<El extends HTMLElement>(el?: El | null, props?: Partial<El>, dataset?: Dataset, styles?: Style, nodiff?: boolean): El | null;\nexport function assignEl<El extends HTMLElement>(el?: El | null, props?: Partial<El>, dataset?: Dataset, styles?: Style, nodiff?: boolean): El | null;\nexport function assignEl(el?: HTMLElement | null, props?: Record<string, unknown>, dataset?: Dataset, styles?: Style, nodiff = true): HTMLElement | null {\n if (!el) return null;\n if (props) for (const k of Object.keys(props)) if (props[k] !== undefined) if (nodiff || (el as any)[k] !== props[k]) (el as unknown as Record<string, unknown>)[k] = props[k];\n if (dataset) for (const k of Object.keys(dataset)) if (dataset[k] !== undefined) if (nodiff || (el.dataset as any)[k] !== dataset[k]) (el.dataset as DOMStringMap)[k] = String(dataset[k]);\n if (styles) for (const k of Object.keys(styles)) if (styles[k as keyof Style] !== undefined) if (nodiff || (el.style as any)[k] !== styles[k as any]) (el.style as unknown as Record<string, unknown>)[k] = styles[k as keyof Style];\n return el;\n}\n\n/** Get the currently active element, traversing into shadow roots if necessary.\n * @param root Root node to start searching from, defaults to the main document.\n * @param noBody If `true`, will return `null` if the active element is the body element.\n * @returns The active element or null if none found.\n */\nexport function getActiveEl(root?: Document | ShadowRoot | null, noBody = true): Element | null {\n const activeEl = (root ?? document).activeElement;\n return !activeEl || (noBody && activeEl === document.body) ? null : activeEl.shadowRoot ? getActiveEl(activeEl.shadowRoot) : activeEl;\n}\n","import { getActiveEl } from \"./dom\";\n\n/** Keyboard matching configuration used by utility helpers. */\nexport interface KeysSettings {\n /** Disables key handling when true. */\n disabled?: boolean;\n /** Combos that should call `preventDefault` when matched. */\n overrides?: string[];\n /** Action map from action id to combo or combo list. */\n shortcuts?: Record<string, string | string[]>;\n /** Combos that should be rejected immediately. */\n blocks?: string[];\n /** Enables exact combo matching instead of subset matching. */\n strictMatch?: boolean;\n /** Ranks shortcut matches by exactness before insertion order. Enabled by default. */\n rankedMatch?: boolean;\n /** Combos that are allowed as pass-through key actions. */\n whitelist?: string[];\n}\n\n/** Canonical key-combo structure used by parser and serializer helpers. */\nexport type KeyStruct = Record<\"ctrlKey\" | \"shiftKey\" | \"altKey\" | \"metaKey\", boolean> & { key: string };\n\n/**\n * Global registry of native browser hotkeys and shortcut combinations, pass as `.blocks` in `Settings` config for `keyEventAllowed()` for better UX.\n * Used by the system to prevent default browser behaviors (e.g., zooming, tab switching, refreshing, or opening dev tools) inside the listener context.\n */\n// prettier-ignore\nexport const KEYS_BLOCKS = [\"Ctrl+Tab\", \"Ctrl+Shift+Tab\", \"Ctrl+PageUp\", \"Ctrl+PageDown\", \"Cmd+Option+ArrowRight\", \"Cmd+Option+ArrowLeft\", \"Ctrl+1\", \"Ctrl+2\", \"Ctrl+3\", \"Ctrl+4\", \"Ctrl+5\", \"Ctrl+6\", \"Ctrl+7\", \"Ctrl+8\", \"Ctrl+9\", \"Cmd+1\", \"Cmd+2\", \"Cmd+3\", \"Cmd+4\", \"Cmd+5\", \"Cmd+6\", \"Cmd+7\", \"Cmd+8\", \"Cmd+9\", \"Alt+ArrowLeft\", \"Alt+ArrowRight\", \"Cmd+ArrowLeft\", \"Cmd+ArrowRight\", \"Ctrl+r\", \"Ctrl+Shift+r\", \"F5\", \"Shift+F5\", \"Cmd+r\", \"Cmd+Shift+r\", \"Ctrl+h\", \"Ctrl+j\", \"Ctrl+d\", \"Ctrl+f\", \"Cmd+y\", \"Cmd+Option+b\", \"Cmd+d\", \"Cmd+f\", \"Ctrl+Shift+i\", \"Ctrl+Shift+j\", \"Ctrl+Shift+c\", \"Ctrl+u\", \"F12\", \"Cmd+Option+i\", \"Cmd+Option+j\", \"Cmd+Option+c\", \"Cmd+Option+u\", \"Ctrl+=\", \"Ctrl+-\", \"Ctrl+0\", \"Cmd+=\", \"Cmd+-\", \"Cmd+0\", \"Ctrl+p\", \"Ctrl+s\", \"Ctrl+o\", \"Cmd+p\", \"Cmd+s\", \"Cmd+o\"], // JIT eats loops :)\n KEYS_MODS = [\"ctrl\", \"shift\", \"alt\", \"meta\"] as const,\n KEYS_CMODS = [\"ctrl\", \"alt\", \"meta\"] as const,\n KEYS_ALIAS: Record<string, string> = { cmd: \"meta\", space: \" \" };\n\n/**\n * Parses a combo string into modifier flags + terminal key.\n * @param combo Key combo string (for example: `\"ctrl+shift+z\"`).\n * @returns Parsed key structure with boolean modifier flags.\n * @example\n * parseKeyCombo(\"ctrl+shift+z\")\n * // => { ctrlKey: true, shiftKey: true, altKey: false, metaKey: false, key: \"z\" }\n */\nexport function parseKeyCombo(combo: string): KeyStruct {\n const parts = cleanKeyCombo(combo).toLowerCase().split(\"+\");\n return { ctrlKey: parts.includes(\"ctrl\"), shiftKey: parts.includes(\"shift\"), altKey: parts.includes(\"alt\"), metaKey: parts.includes(\"meta\") || parts.includes(\"cmd\"), key: parts.find((p) => !/^(ctrl|shift|alt|meta|cmd)$/.test(p)) || \"\" };\n}\n\n/**\n * Serializes a key structure or keyboard event into canonical combo form.\n * @param e KeyboardEvent-like object or parsed key structure.\n * @returns Canonical combo string (for example: `\"ctrl+shift+z\"`).\n */\nexport function stringifyKeyEvent(e: KeyStruct | KeyboardEvent): string {\n const parts: string[] = [];\n e.ctrlKey && parts.push(\"ctrl\"), e.altKey && parts.push(\"alt\"), e.shiftKey && parts.push(\"shift\"), e.metaKey && parts.push(\"meta\"), parts.push(e.key?.toLowerCase() ?? \"\");\n return parts.join(\"+\");\n}\n\n/**\n * Normalizes combo(s) by:\n * - lowercasing,\n * - aliasing `cmd -> meta`, `space -> \" \"`,\n * - preserving literal space/plus edge cases,\n * - sorting modifiers as `ctrl, alt, shift, meta`.\n * @param combo Raw combo or list of combos.\n * @param mods Optional list of modifier keys to sort and filter by (default: `[\"ctrl\", \"shift\", \"alt\", \"meta\"]`).\n * @returns Canonical combo string or list.\n * @example\n * cleanKeyCombo([\"Shift+Alt+Ctrl+Z\", \"cmd+y\"])\n * // => [\"ctrl+shift+alt+z\", \"meta+y\"]\n */\nexport function cleanKeyCombo(combo: string, mods?: string[]): string;\nexport function cleanKeyCombo(combo: string[], mods?: string[]): string[];\nexport function cleanKeyCombo(combo: string | string[], mods: string[] = KEYS_MODS as any): string | string[] {\n const clean = (combo: string): string => {\n if (combo === \" \" || combo === \"+\") return combo;\n combo = combo.replace(/\\+\\s*\\+$/, \"+plus\");\n const p = combo\n .toLowerCase()\n .split(\"+\")\n .filter((k) => k !== \"\")\n .map((k, _, __, tk = k.trim()) => KEYS_ALIAS[tk] || (tk === \"plus\" ? \"+\" : tk || \" \"));\n return [...p.filter((k) => mods.includes(k)).sort((a, b) => mods.indexOf(a) - mods.indexOf(b)), ...(p.filter((k) => !mods.includes(k)) || \"\")].join(\"+\");\n };\n return Array.isArray(combo) ? combo.map(clean) : clean(combo);\n}\n\n/**\n * Determines if actual combo satisfies required combo rule(s).\n * Non-strict mode performs subset matching (required keys must all be present).\n * Strict mode requires exact canonical equality.\n * @param required Required combo or combo list.\n * @param actual Actual combo string.\n * @param strict Whether to require exact match.\n * @param clean Whether to clean the actual combo.\n * @returns `true` when match succeeds.\n */\nexport function matchKeys(required: string | string[], actual: string, strict = false, clean = true): boolean {\n if (clean) actual = cleanKeyCombo(actual);\n const match = (req: string, actual: string): boolean => {\n req = cleanKeyCombo(req);\n if (strict) return req === actual;\n const reqs = req.split(\"+\"),\n reals = actual.split(\"+\");\n for (const mod of KEYS_CMODS) if (reals.includes(mod) && !reqs.includes(mod)) return false; // no unrequested heavy mods\n return reqs.every((k) => reals.includes(k));\n };\n return Array.isArray(required) ? required.some((req) => match(req, actual)) : match(required, actual);\n}\n\n/**\n * Resolves key-combo terms against settings:\n * - override, block, whitelist, and matched action id.\n * @param combo Canonical combo string.\n * @param settings Matching settings.\n * @returns Match resolution record.\n */\nexport function getTermsForKey(combo: string, settings: KeysSettings): { override: boolean; block: boolean; whitelisted: boolean; action: string | null } {\n const terms = { override: false, block: false, whitelisted: false, action: null as string | null },\n { overrides = [], shortcuts = {}, blocks = [], strictMatch: stm = false, rankedMatch: ram = true, whitelist = [] } = settings || {};\n combo = cleanKeyCombo(combo);\n if (matchKeys(overrides, combo, stm, false)) terms.override = true;\n if (matchKeys(blocks, combo, stm, false)) terms.block = true;\n if (matchKeys(whitelist, combo, false)) terms.whitelisted = true;\n if (!ram) return (terms.action = Object.keys(shortcuts).find((id) => shortcuts[id] && matchKeys(shortcuts[id], combo, stm, false)) || null), terms;\n // prettier-ignore\n let bestA: string | null = null, bestE = false, bestL = 0;\n for (const id of Object.keys(shortcuts))\n for (const c of Array.isArray(shortcuts[id]) ? shortcuts[id] : [shortcuts[id]]) {\n // prettier-ignore\n const req = c && cleanKeyCombo(c), isE = req === combo, len = req ? req.split(\"+\").length : 0;\n if (c && matchKeys(req, combo, stm, false) && (!bestA || (isE && !bestE) || (isE === bestE && len > bestL))) (bestA = id), (bestE = isE), (bestL = len);\n }\n return (terms.action = bestA), terms;\n}\n\n/**\n * Evaluates whether a keyboard event is allowed and maps it to an action id.\n * Behavior order:\n * 1. hard gate checks (`disabled`, focused editable, button-space/enter),\n * 2. blocked combos,\n * 3. override combos (`preventDefault`),\n * 4. shortcut action match,\n * 5. whitelist pass-through.\n * @param e Browser keyboard event.\n * @param settings Matching settings.\n * @returns Action id, pass-through key, or `false` when denied.\n */\nexport function keyEventAllowed<const S extends KeysSettings>(e: KeyboardEvent, settings: S): false | (S[\"shortcuts\"] extends object ? keyof S[\"shortcuts\"] : never) | (S[\"whitelist\"] extends readonly string[] ? (string[] extends S[\"whitelist\"] ? never : S[\"whitelist\"][number]) : never) {\n if (settings.disabled) return false;\n const activeEl = getActiveEl((e.target as Node)?.ownerDocument); // shadow DOM proof\n if ((e.key === \" \" || e.key === \"Enter\") && activeEl?.matches(\"button,input[type='button'],input[type='submit']\")) return false;\n if (e.currentTarget !== activeEl && activeEl?.matches(\"input,textarea,[contenteditable],[role]\") && !(e.key === \"Escape\" && !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey)) return false;\n const combo = stringifyKeyEvent(e),\n { override, block, action, whitelisted } = getTermsForKey(combo, settings);\n if (block) return false;\n if (override) e.preventDefault();\n if (action) return action as any;\n if (whitelisted) return e.key.toLowerCase() as any;\n return false;\n}\n\n/**\n * Formats one or many combos for human-readable UI labels, prepends \" \" for fluid appending.\n * @param combo Combo or combo list.\n * @param keyFn Function to format each combo.\n * @returns Display label (for example: `\" (ctrl+z) or (meta+z)\"`).\n */\nexport const formatKeyTooltip = (combo: string | string[] = \"\", keyFn = (c = \"\") => cleanKeyCombo(c).replace(\" \", \"space\")): string => {\n const combined = combo?.length ? (Array.isArray(combo) ? combo.map(keyFn).join(\" or \") : keyFn(combo)) : \"\";\n return combined ? ` (${combined})` : \"\";\n};\n\n/**\n * Formats an action-shortcuts map for display labels.\n * @param keyShortcuts Action to combo(s) map.\n * @returns Action to display-label map.\n */\nexport function formatKeyShortcutsTooltip(keyShortcuts: Record<string, string | string[]> = {}, formatter = formatKeyTooltip): Record<string, string> {\n const shortcuts: Record<string, string> = {};\n for (const action of Object.keys(keyShortcuts)) shortcuts[action] = formatter(keyShortcuts[action]);\n return shortcuts;\n}\n\n/**\n * Converts combo text into WAI-ARIA `aria-keyshortcuts` format.\n * @param s Combo text or combo list.\n * @param format Whether to format to tooltip first.\n * @returns Normalized aria-keyshortcuts string.\n * @example\n * parseForARIAKS(\" (ctrl+z) or (meta+z)\")\n * // => \"Control+z Meta+z\"\n * @example\n * parseForARIAKS([\"ctrl+z\", \"meta+z\"], false)\n * // => \"Control+z Meta+z\"\n */\nexport function parseForARIAKS(s: string | string[] = \"\", format = true) {\n const m = { ctrl: \"Control\", cmd: \"Meta\", space: \"Space\", plus: \"+\" };\n return (!format && !Array.isArray(s) ? s : formatKeyTooltip(s))\n .toLowerCase()\n .replace(/[()]/g, \"\") // 1. Remove parens\n .replace(/\\bor\\b/g, \" \") // 2. Replace \"or\" with the REQUIRED space\n .replace(/\\w+/g, (k: any) => m[k as keyof typeof m] || k) // 3. Map keys (ctrl -> Control)\n .replace(/\\s+/g, \" \")\n .trim(); // 4. Cleanup extra spaces\n} // W3 ARIA Key Shortcut\n","import { NIL } from \"@core/consts\";\r\nimport type { EffectOptions } from \"@defs/reactor\";\r\nimport { Autotracker, withTracker } from \"../autotracker\";\r\n\r\n/**\r\n * Runs a reactive side effect in vanilla JavaScript.\r\n * The callback executes immediately, tracks accessed state, and re-runs when\r\n * tracked dependencies change.\r\n * @param callback Effect callback.\r\n * @param options Listener options if `sync: false` else Watcher Options.\r\n * @returns Cleanup function that stops tracking and releases resources.\r\n * @example\r\n * const stop = effect(() => console.log(state.count));\r\n */\r\nexport function effect(callback: () => void, options: EffectOptions = NIL): () => void {\r\n const atrkr = new Autotracker();\r\n let destroyed = false;\r\n const cleanup = () => ((destroyed = true), atrkr.destroy());\r\n (function execute() {\r\n if (destroyed) return;\r\n withTracker(atrkr, callback);\r\n options.once ? cleanup() : atrkr.callback(execute, options);\r\n })();\r\n return cleanup;\r\n}\r\n","import { Reactive, reactive } from \"@core/mixins\";\r\nimport { CTX } from \"@core/consts\";\r\nimport { wpArr } from \"@modules/base\";\r\nimport { TimeTravelModule } from \"@modules/timeTravel\";\r\nimport { createEl } from \"@utils/dom\";\r\nimport { nuke } from \"@utils/obj\";\r\nimport { formatKeyTooltip as formatKFD, keyEventAllowed, KEYS_BLOCKS, parseForARIAKS } from \"@utils/keys\";\r\nimport { effect } from \"./effect\";\r\n\r\nconst keys = {\r\n blocks: KEYS_BLOCKS,\r\n overrides: [\"Ctrl+z\", \"Cmd+z\", \"Ctrl+y\", \"Cmd+y\", \"Ctrl+Shift+z\", \"Cmd+Shift+z\", \"Home\", \"End\", \"ArrowLeft\", \"ArrowRight\", \"Space\", \"Alt+Space\", \"Escape\", \"Delete\"],\r\n shortcuts: { undo: [\"Ctrl+z\", \"Cmd+z\"], redo: [\"Ctrl+y\", \"Cmd+y\", \"Ctrl+Shift+z\", \"Cmd+Shift+z\"], genesis: \"Home\", trackUntrack: \"t\", ending: \"End\", prevFrame: \",\", nextFrame: \".\", playPause: \"Space\", rewind: \"Alt+Space\", closeOverlay: \"Escape\", clrHistory: \"Delete\", export: \"e\", import: \"i\", clear: \"c\" },\r\n};\r\n\r\n/** Reactive options for the TimeTravel overlay instance. */\r\nexport interface TimeTravelConsoleConfig {\r\n /** Header text shown at the top of the overlay panel. */\r\n title: string;\r\n /** Accent color used to derive panel theme variables. */\r\n color: string;\r\n /** Shows the overlay only in development when true. */\r\n devOnly: boolean;\r\n /** Initial open state applied when the overlay is created. */\r\n startOpen: boolean;\r\n /** Container element that owns the overlay layer and dock. */\r\n container?: HTMLElement;\r\n}\r\n\r\n/**\r\n * - Vanilla overlay controller for visual time-travel controls and timeline I/O.\r\n * - Mounts a docked HUD into the configured container, syncs its UI with module state, and forwards keyboard/button actions to the TimeTravelModule.\r\n * Supports reactive `config` updates (title/color/container/devOnly) and maintains local overlay UI state (`open` and `import` payload text).\r\n */\r\nexport class TimeTravelConsole {\r\n public static count = 0;\r\n public index = TimeTravelConsole.count;\r\n public config: Reactive<TimeTravelConsoleConfig>;\r\n public readonly state = reactive({ open: false, import: \"\", stride: 1 });\r\n public readonly time: TimeTravelModule;\r\n public readonly host: HTMLElement;\r\n private clups: Array<() => void> = [];\r\n private keydown: (e: KeyboardEvent) => void;\r\n private keyup: (e: KeyboardEvent) => void;\r\n\r\n /** Creates a docked TimeTravel overlay bound to a module instance.\r\n * @param time TimeTravel module instance that owns timeline operations.\r\n * @param build Optional initial overlay config overrides.\r\n */\r\n constructor(time: TimeTravelModule, build: Partial<TimeTravelConsoleConfig> = { devOnly: true }) {\r\n this.time = time;\r\n this.config = reactive({ title: `Time Travel Console ${(this.index = ++TimeTravelConsole.count)}`, ...build } as TimeTravelConsoleConfig);\r\n this.state.open = !!this.config.startOpen;\r\n let wlLive = false,\r\n blLive = false;\r\n const s = this.time.state,\r\n host = (this.host = createEl(\"div\", { className: \"sia-tt-console-host\" })),\r\n toggle = createEl(\"button\", { className: \"sia-tt-console-toggle\", type: \"button\", onclick: () => (this.state.open = !this.state.open) }),\r\n panel = createEl(\"aside\", { className: \"sia-tt-console\", ariaLabel: \"time travel overlay\" }),\r\n title = createEl(\"div\", { className: \"title\" }),\r\n frame = createEl(\"span\", { className: \"muted\" }),\r\n clrHistory = createEl(\"button\", { textContent: `Clear History${formatKFD(keys.shortcuts!.clrHistory)}`, ariaKeyShortcuts: parseForARIAKS(keys.shortcuts!.clrHistory), onclick: () => (this.time.clear(), (this.state.import = \"\")) }),\r\n undo = createEl(\"button\", { textContent: `Undo${formatKFD(keys.shortcuts!.undo[0])}`, ariaKeyShortcuts: parseForARIAKS(keys.shortcuts!.undo), onclick: () => this.time.undo(this.state.stride) }),\r\n redo = createEl(\"button\", { textContent: `Redo${formatKFD(keys.shortcuts!.redo[0])}`, ariaKeyShortcuts: parseForARIAKS(keys.shortcuts!.redo), onclick: () => this.time.redo(this.state.stride) }),\r\n genesis = createEl(\"button\", { textContent: `Genesis${formatKFD(keys.shortcuts!.genesis)}`, ariaKeyShortcuts: parseForARIAKS(keys.shortcuts!.genesis), onclick: () => this.time.jumpTo(0) }),\r\n playPause = createEl(\"button\", { onclick: () => this.time[s.paused ? \"play\" : \"pause\"](), ariaKeyShortcuts: parseForARIAKS(keys.shortcuts!.playPause) }),\r\n rewind = createEl(\"button\", { textContent: `Rewind${formatKFD(keys.shortcuts!.rewind)}`, ariaKeyShortcuts: parseForARIAKS(keys.shortcuts!.rewind), onclick: this.time.rewind }),\r\n trackUntrack = createEl(\"button\", { onclick: () => this.time[s.tracking ? \"untrack\" : \"track\"](), ariaKeyShortcuts: parseForARIAKS(keys.shortcuts!.trackUntrack) }),\r\n range = createEl(\"input\", { type: \"range\", min: \"0\", title: \"time travel frame\", ariaLabel: \"time travel frame\", oninput: () => this.time.jumpTo(Number(range.value)) }),\r\n exp = createEl(\"button\", { textContent: `Export${formatKFD(keys.shortcuts!.export)}`, ariaKeyShortcuts: parseForARIAKS(keys.shortcuts!.export), onclick: () => (this.state.import = this.time.export(null, 2)) }),\r\n imp = createEl(\"button\", { textContent: `Import${formatKFD(keys.shortcuts!.import)}`, ariaKeyShortcuts: parseForARIAKS(keys.shortcuts!.import), onclick: () => this.state.import.trim().length && this.time.import(this.state.import) }),\r\n clr = createEl(\"button\", { textContent: `Clear${formatKFD(keys.shortcuts!.clear)}`, ariaKeyShortcuts: parseForARIAKS(keys.shortcuts!.clear), onclick: () => (this.state.import = \"\") }),\r\n payload = createEl(\"textarea\", { className: \"sia-tt-io\", readOnly: true, placeholder: \"current payload json\", title: \"Current History Entry\" }),\r\n io = createEl(\"textarea\", { className: \"sia-tt-io\", placeholder: \"timeline payload json\", title: \"Time History\", oninput: () => (this.state.import = io.value) }),\r\n foot = createEl(\"p\", { className: \"sia-tt-footnote\", innerHTML: \"<span>Try this in your app? </span>\" }),\r\n link = createEl(\"a\", { target: \"_blank\", rel: \"noreferrer noopener\", textContent: \"sia-reactor\", href: \"https://www.npmjs.com/package/sia-reactor\" }),\r\n box = createEl(\"div\", { className: \"sia-tt-status-box\" }),\r\n status = createEl(\"div\", { className: \"sia-tt-status-row\" }),\r\n filters = createEl(\"div\", { className: \"sia-tt-status-row\" }),\r\n filterBox = createEl(\"div\", { className: \"sia-tt-status-box\" }),\r\n whitelistLabel = createEl(\"span\", { className: \"muted\", textContent: \"Whitelist:\" }),\r\n blacklistLabel = createEl(\"span\", { className: \"muted\", textContent: \"Blacklist:\" }),\r\n whitelist = createEl(\"input\", { className: \"sia-tt-filter-input sia-tt-io\", placeholder: 'a.b, c.d or {\"0\":[\"a.b\"]}', title: \"Whitelist paths\", onfocus: () => (wlLive = true), onblur: () => ((wlLive = false), (whitelist.value = formatPaths(this.time.config.whitelist, \"*\"))), oninput: (_, parsed: any = parsePaths(whitelist.value)) => parsed !== null && (this.time.config.whitelist = parsed) }),\r\n blacklist = createEl(\"input\", { className: \"sia-tt-filter-input sia-tt-io\", placeholder: 'a.b, c.d or {\"0\":[\"a.b\"]}', title: \"Blacklist paths\", onfocus: () => (blLive = true), onblur: () => ((blLive = false), (blacklist.value = formatPaths(this.time.config.blacklist, \"\"))), oninput: (_, parsed: any = parsePaths(blacklist.value, true)) => parsed !== null && (this.time.config.blacklist = parsed) }),\r\n speed = createEl(\"select\", { className: \"sia-tt-speed\", title: \"Playback Speed\", onchange: () => (this.time.config.playbackRate = Number(speed.value)) }),\r\n stride = createEl(\"input\", { className: \"sia-tt-stride sia-tt-button sia-tt-mini-input\", type: \"number\", min: \"1\", title: \"Skip Stride i.e. how many steps count as one unit\", oninput: () => (this.state.stride = Math.max(1, Number(stride.value) || 1)) }),\r\n stats = createEl(\"span\", { className: \"sia-tt-stats\" }),\r\n limit = createEl(\"input\", { className: \"sia-tt-limit sia-tt-mini-input sia-tt-button\", type: \"number\", min: \"1\", title: \"Maximum number of history entries kept in memory before older entries are discarded.\", oninput: () => (this.time.config.limit = Math.max(1, Number(limit.value) || 1)) }),\r\n delay = createEl(\"input\", { className: \"sia-tt-delay sia-tt-mini-input sia-tt-button\", type: \"number\", min: \"0\", step: \"50\", title: \"Maximum playback delay between timeline frames in milliseconds.\", oninput: () => (this.time.config.maxPlaybackDelay = Math.max(0, Number(delay.value) || 0)) }),\r\n read = createEl(\"label\", { className: \"sia-tt-check\", title: \"When recording intent mutations, read previous values from the matching state path instead of the intent path. Useful for accurate undo reconstruction of intent-driven flows.\" }),\r\n readBox = createEl(\"input\", { type: \"checkbox\", checked: !!this.time.config.mirrorReads, onchange: () => (this.time.config.mirrorReads = readBox.checked) }),\r\n write = createEl(\"label\", { className: \"sia-tt-check\", title: \"During playback and teleportation, mirror state writes into matching intent paths to re-enact the recorded history. Useful for accurate reconstruction of the whole session.\" }),\r\n writeBox = createEl(\"input\", { type: \"checkbox\", checked: !!this.time.config.mirrorWrites, onchange: () => (this.time.config.mirrorWrites = writeBox.checked) }),\r\n filterRow1 = createEl(\"div\", { className: \"sia-tt-filter-row\" }),\r\n filterRow2 = createEl(\"div\", { className: \"sia-tt-filter-row\" }),\r\n row1 = createEl(\"div\", { className: \"sia-tt-row\" }),\r\n row2 = createEl(\"div\", { className: \"sia-tt-row\" }),\r\n row3 = createEl(\"div\", { className: \"sia-tt-row\" }),\r\n row4 = createEl(\"div\", { className: \"sia-tt-row\" }),\r\n row5 = createEl(\"div\", { className: \"sia-tt-row sia-tt-config-row\" });\r\n speed.append(...[0.25, 0.5, 0.75, 1, 1.25, 1.5, 2, 4, 8, 16, 32].map((v) => createEl(\"option\", { value: String(v), textContent: `${v}x` })));\r\n status.append((box.append(frame), box), clrHistory);\r\n filters.append((filterBox.append((filterRow1.append(whitelistLabel, whitelist), filterRow1), (filterRow2.append(blacklistLabel, blacklist), filterRow2)), filterBox));\r\n panel.append(title, status, (row1.append(playPause, rewind, genesis), row1), (row2.append(undo, redo, trackUntrack, stride), row2), payload, (row3.append(speed, range), row3), filters, (row4.append(exp, imp, clr), row4), io, (row5.append(delay, limit, (read.append(readBox, \" Read Mirror\"), read), (write.append(writeBox, \" Write Mirror\"), write)), row5), (foot.prepend(stats), foot.append(link), foot));\r\n this.host.append(toggle, panel);\r\n this.keydown = (e, can = this.state.open && (this.config.devOnly ? CTX.isDevEnv : true), a = can && keyEventAllowed(e, keys)) => (a && e.stopImmediatePropagation(), a === \"undo\" ? this.time.undo(this.state.stride) : a === \"redo\" ? this.time.redo(this.state.stride) : a === \"genesis\" ? this.time.jumpTo(0) : a === \"trackUntrack\" ? this.time[s.tracking ? \"untrack\" : \"track\"]() : a === \"ending\" ? this.time.jumpTo(s.history.length) : a === \"prevFrame\" ? this.time.step(this.state.stride, false) : a === \"nextFrame\" ? this.time.step(this.state.stride, true) : a === \"rewind\" ? this.time.rewind() : a === \"playPause\" ? this.time[s.paused ? \"play\" : \"pause\"]() : a === \"clrHistory\" ? this.time.clear() : a === \"closeOverlay\" ? (this.state.open = false) : a === \"export\" ? (this.state.import = this.time.export()) : a === \"import\" ? this.state.import.trim().length && this.time.import(this.state.import) : a === \"clear\" && (this.state.import = \"\"));\r\n this.keyup = (e, can = this.state.open && (this.config.devOnly ? CTX.isDevEnv : true), a = can && keyEventAllowed(e, keys)) => a && e.stopImmediatePropagation();\r\n window.addEventListener(\"keydown\", this.keydown), window.addEventListener(\"keyup\", this.keyup);\r\n const sync = [\r\n effect(() => (this.config.color ? host.style.setProperty(\"--sia-tt-color\", this.config.color) : host.style.removeProperty(\"--sia-tt-color\"))),\r\n effect(() => {\r\n if (this.config.devOnly && !CTX.isDevEnv) return void host.remove();\r\n const dock = getDock(this.config.container);\r\n if (host.parentNode !== dock) dock.appendChild(host);\r\n }),\r\n effect(() => (toggle.textContent = `${(panel.hidden = !this.state.open) ? \"Show\" : \"Hide\"} ${(title.textContent = this.config.title ?? \"\")}`)),\r\n effect(() => (playPause.textContent = `${s.paused ? \"Play\" : \"Pause\"}${formatKFD(keys.shortcuts!.playPause)}`)),\r\n effect(() => (trackUntrack.textContent = `${s.tracking ? \"Untrack\" : \"Track\"}${formatKFD(keys.shortcuts!.trackUntrack)}`)),\r\n effect((sets = 0, txs = 0) => {\r\n range.max = String(s.history.length);\r\n range.disabled = clrHistory.disabled = !s.history.length;\r\n for (let i = 0, len = s.history.length; i < len; i++) {\r\n const frame = s.history[i];\r\n \"nodes\" in frame ? txs++ : frame.type === \"set\" && sets++;\r\n }\r\n stats.textContent = `Sets: ${sets} | Deletes: ${s.history.length - sets - txs} | Txs: ${txs}`;\r\n }),\r\n effect(() => {\r\n frame.textContent = `Frame: ${s.currentFrame} / ${s.history.length}`;\r\n genesis.disabled = undo.disabled = !this.time.canUndo;\r\n rewind.disabled = !s.paused || !s.currentFrame;\r\n playPause.disabled = redo.disabled = !this.time.canRedo;\r\n range.value = String(Math.min(s.currentFrame, s.history.length));\r\n payload.value = JSON.stringify(s.currentFrame ? s.history[s.currentFrame - 1] : { genesis: true, value: s.initialState }, null, 2);\r\n }),\r\n effect(() => {\r\n clr.disabled = imp.disabled = !this.state.import.trim().length;\r\n io.value !== this.state.import && (io.value = this.state.import);\r\n }),\r\n effect((v = String(this.time.config.playbackRate)) => v !== speed.value && (speed.value = v)),\r\n effect((v = String(this.state.stride)) => v !== stride.value && (stride.value = v)),\r\n effect((v = String(this.time.config.limit)) => v !== limit.value && (limit.value = v)),\r\n effect((v = String(this.time.config.maxPlaybackDelay)) => v !== delay.value && (delay.value = v)),\r\n effect((v = !!this.time.config.mirrorReads) => v !== readBox.checked && (readBox.checked = v)),\r\n effect((v = !!this.time.config.mirrorWrites) => v !== writeBox.checked && (writeBox.checked = v)),\r\n effect(() => (!wlLive && (whitelist.value = formatPaths(this.time.config.whitelist, \"*\")), !blLive && (blacklist.value = formatPaths(this.time.config.blacklist, \"\")))),\r\n ];\r\n this.clups.push(...sync);\r\n }\r\n\r\n destroy() {\r\n for (const clup of this.clups) clup();\r\n window.removeEventListener(\"keydown\", this.keydown), window.removeEventListener(\"keyup\", this.keyup);\r\n this.host.remove(), nuke(this), --TimeTravelConsole.count;\r\n }\r\n}\r\n\r\nfunction getDock(container?: HTMLElement) {\r\n const host = container && container !== document.documentElement ? container : document.body;\r\n if (host !== document.body && getComputedStyle(host).position === \"static\") host.style.position = \"relative\";\r\n const layer = host.querySelector(\":scope > .sia-tt-console-layer\") || createEl(\"div\", { className: \"sia-tt-console-layer\" }, undefined, { position: host === document.body ? \"fixed\" : \"absolute\" });\r\n if (layer.parentElement !== host) host.appendChild(layer);\r\n const dock = layer.querySelector(\":scope > .sia-tt-console-dock\") || createEl(\"div\", { className: \"sia-tt-console-dock\" });\r\n return dock.parentElement !== layer && layer.appendChild(dock), dock;\r\n}\r\nfunction formatPaths(paths: unknown, emptyText: string): string {\r\n return !paths ? emptyText : Array.isArray(paths) ? (paths.length ? paths.join(\", \") : emptyText) : \"object\" === typeof paths ? JSON.stringify(paths) : String(paths);\r\n}\r\nfunction parsePaths(raw: string, allowEmpty = false): unknown {\r\n const text = raw.trim();\r\n if (!text) return allowEmpty ? undefined : wpArr;\r\n if (text[0] === \"{\")\r\n try {\r\n const parsed = JSON.parse(text);\r\n if (parsed && \"object\" === typeof parsed) return parsed;\r\n } catch {\r\n return null; // invalid JSON resets to last valid\r\n }\r\n // prettier-ignore\r\n const list = text.split(\",\").map((p) => p.trim()).filter(Boolean);\r\n return list.length ? list : allowEmpty ? undefined : wpArr;\r\n}\r\n"],"mappings":"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","names":["TimeTravelConsole","import_react","keys","key","keys","key","target","result","keys","import_react","import_react","import_react","combo","actual","frame","TimeTravelConsole"]}