@sladg/apex-state 4.0.0 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/@jsbits/deep-clone/umd/index.js","../rust/pkg/apex_state_wasm_bg.js","wasm-module:/home/runner/work/apex-state/apex-state/rust/pkg/apex_state_wasm_bg.wasm","../rust/pkg/apex_state_wasm.js","../src/store/create-store.ts","../src/concerns/registration.wasm-impl.ts","../src/utils/is.ts","../src/utils/dot.ts","../src/concerns/prebuilts/index.ts","../src/utils/bool-logic.ts","../src/concerns/prebuilts/disabled-when.ts","../src/utils/interpolation.ts","../src/concerns/prebuilts/dynamic-label.ts","../src/concerns/prebuilts/dynamic-placeholder.ts","../src/concerns/prebuilts/dynamic-tooltip.ts","../src/concerns/prebuilts/readonly-when.ts","../src/concerns/prebuilts/validation-state.ts","../src/concerns/prebuilts/visible-when.ts","../src/concerns/registry.ts","../src/core/context.ts","../src/pipeline/process-changes.wasm-impl.ts","../src/pipeline/apply-batch.ts","../src/sideEffects/registration.wasm-impl.ts","../src/types/changes.ts","../src/types/pairs.ts","../src/utils/filter-concerns.ts","../src/store/provider.tsx","../src/core/defaults.ts","../src/utils/deep-clone.ts","../src/utils/deep-merge.ts","../src/utils/derive-values.ts","../src/utils/log.ts","../src/wasm/lifecycle.tsx","../src/utils/json.ts","../src/wasm/bridge.ts","../src/store/devtools.ts","../package.json","../src/testing/index.ts","../src/utils/pair-helpers.ts","../src/store/warm-pair-helpers.ts","../src/hooks/use-buffered-field.ts","../src/hooks/use-keyboard-select.ts","../src/hooks/use-throttled-field.ts","../src/hooks/use-transformed-field.ts","../src/utils/hash-key.ts","../src/utils/apply-changes.ts"],"sourcesContent":["/*\n @jsbits/deep-clone\n @author aMarCruz\n @version 1.1.1 UMD+ES5\n @license MIT\n*/\n/* eslint-disable */\n;(function(root, factory) {\n if (typeof define == 'function' && define.amd) {\n define([], factory)\n } else if (typeof module == 'object' && module.exports) {\n module.exports = factory()\n } else {\n ((root.$ || root.jQuery || {}).jsbits || root.jsbits || (root.jsbits={})).deepClone = factory()\n }\n})(typeof self !== 'undefined' ? self : this, function () {\n \"use strict\";\n var _a;\n var _nodejs = (function () {\n var g = typeof global === 'object' && global;\n var m = g && g.process &&\n typeof g.Buffer === 'function' && /^v?(\\d+)/.exec(g.process.version);\n return (m && m[1]) | 0;\n })();\n var _OP = Object.prototype;\n var _toString = _OP.toString;\n var _ownKeys = typeof Reflect === 'object' &&\n typeof Reflect.ownKeys === 'function' && Reflect.ownKeys;\n var clonable = {\n Date: 1 ,\n RegExp: 1 ,\n String: 1 ,\n Number: 1 ,\n Boolean: 1 ,\n Float32Array: 1 ,\n Float64Array: 1 ,\n Int8Array: 1 ,\n Int16Array: 1 ,\n Int32Array: 1 ,\n Uint8Array: 1 ,\n Uint8ClampedArray: 1 ,\n Uint16Array: 1 ,\n Uint32Array: 1 ,\n Array: 2 ,\n ArrayBuffer: 3 ,\n SharedArrayBuffer: 3 ,\n DataView: 4 ,\n Error: 6 ,\n Map: 5 ,\n Set: 5 ,\n Arguments: 7 ,\n Atomics: 8 ,\n JSON: 8 ,\n Math: 8 ,\n Promise: 8 ,\n WeakMap: 8 ,\n WeakSet: 8 ,\n XMLHttpRequest: 8 ,\n };\n var arrayLike = [\n 'Array',\n 'String',\n 'Float32Array',\n 'Float64Array',\n 'Int8Array',\n 'Int16Array',\n 'Int32Array',\n 'Uint8Array',\n 'Uint8ClampedArray',\n 'Uint16Array',\n 'Uint32Array',\n ];\n var getKeyGetter = function (exact) {\n // istanbul ignore next\n var _keys = exact ? Object.getOwnPropertyNames : Object.keys;\n var _getSymbols = Object.getOwnPropertySymbols;\n // istanbul ignore next: until we can test IE11\n if (!_getSymbols) {\n return _keys;\n }\n // istanbul ignore if: until we can test IE11\n if (exact) {\n return function (obj) { return _keys(obj).concat(_getSymbols(obj)); };\n }\n var _isEnum = _OP.propertyIsEnumerable;\n return function (obj) {\n var objkeys = _keys(obj);\n var symbols = _getSymbols(obj);\n for (var i = 0; i < symbols.length; i++) {\n if (_isEnum.call(obj, symbols[i])) {\n objkeys.push(symbols[i]);\n }\n }\n return objkeys;\n };\n };\n var getKeysFac = function (exact) {\n var _filtIdx = function (prop) { return prop !== '0' && (prop | 0) <= 0 && prop !== 'length'; };\n var _getKeys = exact && _ownKeys || getKeyGetter(exact);\n return function (obj, type) {\n var objkeys = _getKeys(obj);\n return ~arrayLike.indexOf(type) ? objkeys.filter(_filtIdx) : objkeys;\n };\n };\n var cloneMapOrSet = function (src, fn, type) {\n var dest = new src.constructor();\n var cb = type === 'Set'\n ? function (v) { this.add(fn(v)); }\n : function (v, k) { this.set(fn(k), fn(v)); };\n src.forEach(cb, dest);\n return dest;\n };\n var cloneDataView = function (src) {\n var buffer = src.buffer.slice(0);\n return new src.constructor(buffer, src.byteOffset, src.byteLength);\n };\n var cloneError = function (src) {\n var err = new src.constructor(src.message);\n return Object.defineProperty(err, 'stack', {\n value: src.stack, configurable: true, writable: true,\n });\n };\n var cloneArguments = function (src) {\n var args = Object.create(null);\n return Object.defineProperty(args, 'length', {\n value: src.length, configurable: true, writable: true,\n });\n };\n var cloneArray = function (src, fn) { return src.map(fn); };\n var cloneFn = (_a = {},\n _a[8 ] = function (obj) { return obj; },\n _a[7 ] = cloneArguments,\n _a[2 ] = cloneArray,\n _a[3 ] = function (obj) { return obj.slice(0); },\n _a[4 ] = cloneDataView,\n _a[6 ] = cloneError,\n _a[5 ] = cloneMapOrSet,\n _a);\n var createObject = function (obj, type, fn) {\n var cloneType = clonable[type];\n if (cloneType === 1 ) {\n return obj.slice && _nodejs && Buffer.isBuffer(obj)\n ? obj.slice(0)\n : new obj.constructor(obj.valueOf());\n }\n if (cloneFn[cloneType]) {\n return cloneFn[cloneType](obj, fn, type);\n }\n return type.lastIndexOf(' Iterator', type.length - 9) > -1\n ? obj : Object.create(Object.getPrototypeOf(obj));\n };\n var getObjectType = (function () {\n var _getTag = function (obj) { return _toString.call(obj).slice(8, -1); };\n // istanbul ignore else\n if (!_nodejs || _nodejs >= 5) {\n return _getTag;\n }\n // istanbul ignore next\n return function (obj) {\n var tag = _getTag(obj);\n return tag === 'Object' && obj.constructor && obj.constructor.name === 'Promise'\n ? 'Promise' : tag;\n };\n })();\n var cloneFac = function (getKeys) {\n var _clone = function _clone(obj) {\n if (!obj || typeof obj !== 'object') {\n return obj;\n }\n var type = getObjectType(obj);\n var clone = createObject(obj, type, _clone);\n var props = getKeys(obj, type);\n for (var i = 0; i < props.length; i++) {\n var prop = props[i];\n var desc = Object.getOwnPropertyDescriptor(obj, prop);\n if (desc.value !== undefined) {\n desc.value = _clone(obj[prop]);\n }\n Object.defineProperty(clone, prop, desc);\n }\n return clone;\n };\n return _clone;\n };\n var looseClone = cloneFac(getKeysFac(false));\n var exactClone = cloneFac(getKeysFac(true));\n var deepClone = function _deepClone(value, exact) {\n return exact ? exactClone(value) : looseClone(value);\n };\n return deepClone;\n});\n","/**\n * Return a snapshot of all registered graphs and registries for a pipeline.\n *\n * Returns a JS object with sync_pairs, directed_sync_pairs, flip_pairs, listeners,\n * bool_logics, value_logics, aggregations, and computations fields.\n * @param {number} pipeline_id\n * @returns {any}\n */\nexport function get_graph_snapshot(pipeline_id) {\n const ret = wasm.get_graph_snapshot(pipeline_id);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n}\n\nexport function main() {\n wasm.main();\n}\n\n/**\n * Create a new isolated pipeline instance. Returns the pipeline ID.\n *\n * Accepts an optional options object with:\n * - `debug` (bool): Enable WASM-side trace collection from creation.\n * @param {any | null} [options]\n * @returns {number}\n */\nexport function pipeline_create(options) {\n const ret = wasm.pipeline_create(isLikeNone(options) ? 0 : addToExternrefTable0(options));\n return ret >>> 0;\n}\n\n/**\n * Destroy a pipeline instance, freeing all its state.\n * @param {number} pipeline_id\n */\nexport function pipeline_destroy(pipeline_id) {\n wasm.pipeline_destroy(pipeline_id);\n}\n\n/**\n * Finalize pipeline by merging JS-produced changes with buffered BoolLogic results.\n *\n * Partitions js_changes by _concerns. prefix, merges with buffered concern changes,\n * diffs all changes against shadow state (filters no-ops), updates shadow for both\n * state and concern paths, returns final changes ready for valtio application.\n *\n * Input: Single JS array of `{ path: \"...\", value_json: \"...\" }`\n * - Mix of listener-produced state changes + validator concern results (with _concerns. prefix)\n * Output: JS object `{ state_changes: [...], concern_changes: [...] }`\n * - concern_changes have _concerns. prefix stripped (paths relative to _concerns root)\n * - Both state_changes and concern_changes are diffed (no-ops filtered out)\n * @param {number} pipeline_id\n * @param {any} js_changes\n * @returns {any}\n */\nexport function pipeline_finalize(pipeline_id, js_changes) {\n const ret = wasm.pipeline_finalize(pipeline_id, js_changes);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n}\n\n/**\n * Reset the entire pipeline to a fresh state (testing only).\n *\n * Clears all internal state: shadow, registrations, graphs, router, BoolLogic registry.\n * Call this between tests to ensure isolation.\n * @param {number} pipeline_id\n */\nexport function pipeline_reset(pipeline_id) {\n wasm.pipeline_reset(pipeline_id);\n}\n\n/**\n * Reset ALL pipelines and the ID counter (testing only).\n */\nexport function pipeline_reset_all() {\n wasm.pipeline_reset_all();\n}\n\n/**\n * Process a batch of state changes through the pipeline.\n *\n * Diffs incoming changes against shadow state to filter no-ops before processing.\n * Runs: aggregation → sync → flip → BoolLogic → validator routing → listener routing.\n * Updates shadow state during processing (needed for BoolLogic evaluation).\n * Buffers BoolLogic concern results for later finalization.\n *\n * Returns execution context for JS: listener_changes, validators_to_run, execution_plan.\n * After JS executes listeners/validators, call pipeline_finalize() with their results.\n *\n * Input: JS array of `{ path: \"...\", value_json: \"...\" }`\n * Output: JS object `{ listener_changes: [...], validators_to_run: [...], execution_plan: {...}, has_work: bool }`\n * @param {number} pipeline_id\n * @param {any} changes\n * @returns {any}\n */\nexport function process_changes(pipeline_id, changes) {\n const ret = wasm.process_changes(pipeline_id, changes);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n}\n\n/**\n * Register a BoolLogic expression. Returns logic_id for cleanup.\n *\n * - `output_path`: full concern path, e.g. `_concerns.user.email.disabledWhen`\n * - `tree_json`: JSON string of the BoolLogic tree, e.g. `{\"IS_EQUAL\": [\"user.role\", \"admin\"]}`\n * @param {number} pipeline_id\n * @param {string} output_path\n * @param {string} tree_json\n * @returns {number}\n */\nexport function register_boollogic(pipeline_id, output_path, tree_json) {\n const ptr0 = passStringToWasm0(output_path, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(tree_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.register_boollogic(pipeline_id, ptr0, len0, ptr1, len1);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] >>> 0;\n}\n\n/**\n * Register all concerns at once (BoolLogic and validators).\n *\n * Consolidates BoolLogic and validator registration into a single boundary crossing.\n * Returns registered logic IDs and validator IDs for cleanup.\n *\n * Input: JSON string of `{ \"registration_id\": \"...\", \"bool_logics\": [...], \"validators\": [...] }`\n * Output: JS object `{ bool_logic_changes: [...], registered_logic_ids: [...], registered_validator_ids: [...] }`\n * @param {number} pipeline_id\n * @param {string} registration_json\n * @returns {any}\n */\nexport function register_concerns(pipeline_id, registration_json) {\n const ptr0 = passStringToWasm0(registration_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.register_concerns(pipeline_id, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n}\n\n/**\n * Register all side effects at once (sync, flip, aggregation, listeners).\n *\n * Consolidates sync pairs, flip pairs, aggregations, and listeners into a single WASM call.\n * Computes initial changes from shadow state and returns listener IDs for cleanup tracking.\n *\n * **Input JSON Format:**\n * ```json\n * {\n * \"registration_id\": \"my-effects\",\n * \"sync_pairs\": [[\"user.email\", \"profile.email\"], [\"user.name\", \"profile.name\"]],\n * \"flip_pairs\": [[\"settings.darkMode\", \"settings.lightMode\"]],\n * \"aggregation_pairs\": [[\"totals.sum\", \"items.0.price\"], [\"totals.sum\", \"items.1.price\"]],\n * \"listeners\": [\n * {\"subscriber_id\": 100, \"topic_path\": \"user\", \"scope_path\": \"user\"},\n * {\"subscriber_id\": 101, \"topic_path\": \"settings.darkMode\", \"scope_path\": \"settings\"}\n * ]\n * }\n * ```\n *\n * **Output JSON Format:**\n * ```json\n * {\n * \"sync_changes\": [\n * {\"path\": \"profile.email\", \"value_json\": \"\\\"alice@example.com\\\"\"},\n * {\"path\": \"profile.name\", \"value_json\": \"\\\"Alice\\\"\"}\n * ],\n * \"aggregation_changes\": [\n * {\"path\": \"totals.sum\", \"value_json\": \"100\"}\n * ],\n * \"registered_listener_ids\": [100, 101]\n * }\n * ```\n *\n * **Example Behavior:**\n * - **sync_changes**: Computed from shadow state. If user.email=\"alice@test.com\" and\n * profile.email is empty, returns change to set profile.email to match.\n * - **aggregation_changes**: Reads source paths from shadow state and computes initial\n * target value. If items exist, aggregates their values (e.g., sums prices).\n * - **registered_listener_ids**: Echo of the input subscriber_ids for cleanup tracking.\n * - **flip_pairs**: Registered silently, no changes returned (used for bidirectional toggling).\n *\n * All registrations happen atomically in a single WASM call, reducing JS↔WASM boundary crossings.\n * @param {number} pipeline_id\n * @param {string} registration_json\n * @returns {any}\n */\nexport function register_side_effects(pipeline_id, registration_json) {\n const ptr0 = passStringToWasm0(registration_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.register_side_effects(pipeline_id, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n}\n\n/**\n * Dump shadow state as JSON (debug/testing).\n * @param {number} pipeline_id\n * @returns {string}\n */\nexport function shadow_dump(pipeline_id) {\n let deferred2_0;\n let deferred2_1;\n try {\n const ret = wasm.shadow_dump(pipeline_id);\n var ptr1 = ret[0];\n var len1 = ret[1];\n if (ret[3]) {\n ptr1 = 0; len1 = 0;\n throw takeFromExternrefTable0(ret[2]);\n }\n deferred2_0 = ptr1;\n deferred2_1 = len1;\n return getStringFromWasm0(ptr1, len1);\n } finally {\n wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);\n }\n}\n\n/**\n * Initialize shadow state from a JSON string (produced by fastStringify on the JS side).\n *\n * Uses the JSON string path so that `undefined` values encoded as the\n * `__APEX_UNDEFINED__` sentinel survive the boundary crossing consistently\n * (serde-wasm-bindgen would convert JS `undefined` to `null` instead).\n * @param {number} pipeline_id\n * @param {string} state_json\n */\nexport function shadow_init(pipeline_id, state_json) {\n const ptr0 = passStringToWasm0(state_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.shadow_init(pipeline_id, ptr0, len0);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n}\n\n/**\n * Unregister a BoolLogic expression by its logic_id.\n * @param {number} pipeline_id\n * @param {number} logic_id\n */\nexport function unregister_boollogic(pipeline_id, logic_id) {\n const ret = wasm.unregister_boollogic(pipeline_id, logic_id);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n}\n\n/**\n * Unregister concerns by registration ID (placeholder).\n *\n * Currently a no-op. In future, could track registrations for bulk cleanup.\n * @param {number} pipeline_id\n * @param {string} registration_id\n */\nexport function unregister_concerns(pipeline_id, registration_id) {\n const ptr0 = passStringToWasm0(registration_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.unregister_concerns(pipeline_id, ptr0, len0);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n}\n\n/**\n * Unregister side effects by registration ID (placeholder).\n *\n * Currently a no-op. In future, could track registrations for bulk cleanup.\n * @param {number} pipeline_id\n * @param {string} registration_id\n */\nexport function unregister_side_effects(pipeline_id, registration_id) {\n const ptr0 = passStringToWasm0(registration_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.unregister_side_effects(pipeline_id, ptr0, len0);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n}\nexport function __wbg_Error_8c4e43fe74559d73(arg0, arg1) {\n const ret = Error(getStringFromWasm0(arg0, arg1));\n return ret;\n}\nexport function __wbg_Number_04624de7d0e8332d(arg0) {\n const ret = Number(arg0);\n return ret;\n}\nexport function __wbg_String_8f0eb39a4a4c2f66(arg0, arg1) {\n const ret = String(arg1);\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n}\nexport function __wbg___wbindgen_bigint_get_as_i64_8fcf4ce7f1ca72a2(arg0, arg1) {\n const v = arg1;\n const ret = typeof(v) === 'bigint' ? v : undefined;\n getDataViewMemory0().setBigInt64(arg0 + 8 * 1, isLikeNone(ret) ? BigInt(0) : ret, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true);\n}\nexport function __wbg___wbindgen_boolean_get_bbbb1c18aa2f5e25(arg0) {\n const v = arg0;\n const ret = typeof(v) === 'boolean' ? v : undefined;\n return isLikeNone(ret) ? 0xFFFFFF : ret ? 1 : 0;\n}\nexport function __wbg___wbindgen_debug_string_0bc8482c6e3508ae(arg0, arg1) {\n const ret = debugString(arg1);\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n}\nexport function __wbg___wbindgen_in_47fa6863be6f2f25(arg0, arg1) {\n const ret = arg0 in arg1;\n return ret;\n}\nexport function __wbg___wbindgen_is_bigint_31b12575b56f32fc(arg0) {\n const ret = typeof(arg0) === 'bigint';\n return ret;\n}\nexport function __wbg___wbindgen_is_function_0095a73b8b156f76(arg0) {\n const ret = typeof(arg0) === 'function';\n return ret;\n}\nexport function __wbg___wbindgen_is_object_5ae8e5880f2c1fbd(arg0) {\n const val = arg0;\n const ret = typeof(val) === 'object' && val !== null;\n return ret;\n}\nexport function __wbg___wbindgen_is_string_cd444516edc5b180(arg0) {\n const ret = typeof(arg0) === 'string';\n return ret;\n}\nexport function __wbg___wbindgen_is_undefined_9e4d92534c42d778(arg0) {\n const ret = arg0 === undefined;\n return ret;\n}\nexport function __wbg___wbindgen_jsval_eq_11888390b0186270(arg0, arg1) {\n const ret = arg0 === arg1;\n return ret;\n}\nexport function __wbg___wbindgen_jsval_loose_eq_9dd77d8cd6671811(arg0, arg1) {\n const ret = arg0 == arg1;\n return ret;\n}\nexport function __wbg___wbindgen_number_get_8ff4255516ccad3e(arg0, arg1) {\n const obj = arg1;\n const ret = typeof(obj) === 'number' ? obj : undefined;\n getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true);\n}\nexport function __wbg___wbindgen_string_get_72fb696202c56729(arg0, arg1) {\n const obj = arg1;\n const ret = typeof(obj) === 'string' ? obj : undefined;\n var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n}\nexport function __wbg___wbindgen_throw_be289d5034ed271b(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n}\nexport function __wbg_call_389efe28435a9388() { return handleError(function (arg0, arg1) {\n const ret = arg0.call(arg1);\n return ret;\n}, arguments); }\nexport function __wbg_done_57b39ecd9addfe81(arg0) {\n const ret = arg0.done;\n return ret;\n}\nexport function __wbg_entries_58c7934c745daac7(arg0) {\n const ret = Object.entries(arg0);\n return ret;\n}\nexport function __wbg_error_7534b8e9a36f1ab4(arg0, arg1) {\n let deferred0_0;\n let deferred0_1;\n try {\n deferred0_0 = arg0;\n deferred0_1 = arg1;\n console.error(getStringFromWasm0(arg0, arg1));\n } finally {\n wasm.__wbindgen_free(deferred0_0, deferred0_1, 1);\n }\n}\nexport function __wbg_get_9b94d73e6221f75c(arg0, arg1) {\n const ret = arg0[arg1 >>> 0];\n return ret;\n}\nexport function __wbg_get_b3ed3ad4be2bc8ac() { return handleError(function (arg0, arg1) {\n const ret = Reflect.get(arg0, arg1);\n return ret;\n}, arguments); }\nexport function __wbg_get_with_ref_key_1dc361bd10053bfe(arg0, arg1) {\n const ret = arg0[arg1];\n return ret;\n}\nexport function __wbg_instanceof_ArrayBuffer_c367199e2fa2aa04(arg0) {\n let result;\n try {\n result = arg0 instanceof ArrayBuffer;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n}\nexport function __wbg_instanceof_Map_53af74335dec57f4(arg0) {\n let result;\n try {\n result = arg0 instanceof Map;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n}\nexport function __wbg_instanceof_Uint8Array_9b9075935c74707c(arg0) {\n let result;\n try {\n result = arg0 instanceof Uint8Array;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n}\nexport function __wbg_isArray_d314bb98fcf08331(arg0) {\n const ret = Array.isArray(arg0);\n return ret;\n}\nexport function __wbg_isSafeInteger_bfbc7332a9768d2a(arg0) {\n const ret = Number.isSafeInteger(arg0);\n return ret;\n}\nexport function __wbg_iterator_6ff6560ca1568e55() {\n const ret = Symbol.iterator;\n return ret;\n}\nexport function __wbg_length_32ed9a279acd054c(arg0) {\n const ret = arg0.length;\n return ret;\n}\nexport function __wbg_length_35a7bace40f36eac(arg0) {\n const ret = arg0.length;\n return ret;\n}\nexport function __wbg_new_361308b2356cecd0() {\n const ret = new Object();\n return ret;\n}\nexport function __wbg_new_3eb36ae241fe6f44() {\n const ret = new Array();\n return ret;\n}\nexport function __wbg_new_8a6f238a6ece86ea() {\n const ret = new Error();\n return ret;\n}\nexport function __wbg_new_dca287b076112a51() {\n const ret = new Map();\n return ret;\n}\nexport function __wbg_new_dd2b680c8bf6ae29(arg0) {\n const ret = new Uint8Array(arg0);\n return ret;\n}\nexport function __wbg_next_3482f54c49e8af19() { return handleError(function (arg0) {\n const ret = arg0.next();\n return ret;\n}, arguments); }\nexport function __wbg_next_418f80d8f5303233(arg0) {\n const ret = arg0.next;\n return ret;\n}\nexport function __wbg_now_30ddf41d4ebf52fb() {\n const ret = performance.now();\n return ret;\n}\nexport function __wbg_prototypesetcall_bdcdcc5842e4d77d(arg0, arg1, arg2) {\n Uint8Array.prototype.set.call(getArrayU8FromWasm0(arg0, arg1), arg2);\n}\nexport function __wbg_set_1eb0999cf5d27fc8(arg0, arg1, arg2) {\n const ret = arg0.set(arg1, arg2);\n return ret;\n}\nexport function __wbg_set_3f1d0b984ed272ed(arg0, arg1, arg2) {\n arg0[arg1] = arg2;\n}\nexport function __wbg_set_f43e577aea94465b(arg0, arg1, arg2) {\n arg0[arg1 >>> 0] = arg2;\n}\nexport function __wbg_stack_0ed75d68575b0f3c(arg0, arg1) {\n const ret = arg1.stack;\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n}\nexport function __wbg_value_0546255b415e96c1(arg0) {\n const ret = arg0.value;\n return ret;\n}\nexport function __wbindgen_cast_0000000000000001(arg0) {\n // Cast intrinsic for `F64 -> Externref`.\n const ret = arg0;\n return ret;\n}\nexport function __wbindgen_cast_0000000000000002(arg0) {\n // Cast intrinsic for `I64 -> Externref`.\n const ret = arg0;\n return ret;\n}\nexport function __wbindgen_cast_0000000000000003(arg0, arg1) {\n // Cast intrinsic for `Ref(String) -> Externref`.\n const ret = getStringFromWasm0(arg0, arg1);\n return ret;\n}\nexport function __wbindgen_cast_0000000000000004(arg0) {\n // Cast intrinsic for `U64 -> Externref`.\n const ret = BigInt.asUintN(64, arg0);\n return ret;\n}\nexport function __wbindgen_init_externref_table() {\n const table = wasm.__wbindgen_externrefs;\n const offset = table.grow(4);\n table.set(0, undefined);\n table.set(offset + 0, undefined);\n table.set(offset + 1, null);\n table.set(offset + 2, true);\n table.set(offset + 3, false);\n}\nexport function __wbindgen_object_is_undefined(arg0) {\n const ret = arg0 === undefined;\n return ret;\n}\nfunction addToExternrefTable0(obj) {\n const idx = wasm.__externref_table_alloc();\n wasm.__wbindgen_externrefs.set(idx, obj);\n return idx;\n}\n\nfunction debugString(val) {\n // primitive types\n const type = typeof val;\n if (type == 'number' || type == 'boolean' || val == null) {\n return `${val}`;\n }\n if (type == 'string') {\n return `\"${val}\"`;\n }\n if (type == 'symbol') {\n const description = val.description;\n if (description == null) {\n return 'Symbol';\n } else {\n return `Symbol(${description})`;\n }\n }\n if (type == 'function') {\n const name = val.name;\n if (typeof name == 'string' && name.length > 0) {\n return `Function(${name})`;\n } else {\n return 'Function';\n }\n }\n // objects\n if (Array.isArray(val)) {\n const length = val.length;\n let debug = '[';\n if (length > 0) {\n debug += debugString(val[0]);\n }\n for(let i = 1; i < length; i++) {\n debug += ', ' + debugString(val[i]);\n }\n debug += ']';\n return debug;\n }\n // Test for built-in\n const builtInMatches = /\\[object ([^\\]]+)\\]/.exec(toString.call(val));\n let className;\n if (builtInMatches && builtInMatches.length > 1) {\n className = builtInMatches[1];\n } else {\n // Failed to match the standard '[object ClassName]'\n return toString.call(val);\n }\n if (className == 'Object') {\n // we're a user defined class or Object\n // JSON.stringify avoids problems with cycles, and is generally much\n // easier than looping through ownProperties of `val`.\n try {\n return 'Object(' + JSON.stringify(val) + ')';\n } catch (_) {\n return 'Object';\n }\n }\n // errors\n if (val instanceof Error) {\n return `${val.name}: ${val.message}\\n${val.stack}`;\n }\n // TODO we could test for more things here, like `Set`s and `Map`s.\n return className;\n}\n\nfunction getArrayU8FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len);\n}\n\nlet cachedDataViewMemory0 = null;\nfunction getDataViewMemory0() {\n if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {\n cachedDataViewMemory0 = new DataView(wasm.memory.buffer);\n }\n return cachedDataViewMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return decodeText(ptr, len);\n}\n\nlet cachedUint8ArrayMemory0 = null;\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction handleError(f, args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n const idx = addToExternrefTable0(e);\n wasm.__wbindgen_exn_store(idx);\n }\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length, 1) >>> 0;\n getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len, 1) >>> 0;\n\n const mem = getUint8ArrayMemory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;\n const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);\n const ret = cachedTextEncoder.encodeInto(arg, view);\n\n offset += ret.written;\n ptr = realloc(ptr, len, offset, 1) >>> 0;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nfunction takeFromExternrefTable0(idx) {\n const value = wasm.__wbindgen_externrefs.get(idx);\n wasm.__externref_table_dealloc(idx);\n return value;\n}\n\nlet cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\ncachedTextDecoder.decode();\nconst MAX_SAFARI_DECODE_BYTES = 2146435072;\nlet numBytesDecoded = 0;\nfunction decodeText(ptr, len) {\n numBytesDecoded += len;\n if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {\n cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n cachedTextDecoder.decode();\n numBytesDecoded = len;\n }\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nconst cachedTextEncoder = new TextEncoder();\n\nif (!('encodeInto' in cachedTextEncoder)) {\n cachedTextEncoder.encodeInto = function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n };\n}\n\nlet WASM_VECTOR_LEN = 0;\n\n\nlet wasm;\nexport function __wbg_set_wasm(val) {\n wasm = val;\n}\n","\n import wasmModule from \"/home/runner/work/apex-state/apex-state/rust/pkg/apex_state_wasm_bg.wasm\";\n\n \n // Import from JS modules\n import { __wbg_now_30ddf41d4ebf52fb, __wbindgen_object_is_undefined, __wbg_get_with_ref_key_1dc361bd10053bfe, __wbg_set_3f1d0b984ed272ed, __wbg_String_8f0eb39a4a4c2f66, __wbg_new_dca287b076112a51, __wbg_new_3eb36ae241fe6f44, __wbg_new_361308b2356cecd0, __wbg_new_dd2b680c8bf6ae29, __wbg_length_32ed9a279acd054c, __wbg_prototypesetcall_bdcdcc5842e4d77d, __wbg_done_57b39ecd9addfe81, __wbg_value_0546255b415e96c1, __wbg_instanceof_Map_53af74335dec57f4, __wbg_instanceof_Uint8Array_9b9075935c74707c, __wbg_instanceof_ArrayBuffer_c367199e2fa2aa04, __wbg_set_1eb0999cf5d27fc8, __wbg_get_9b94d73e6221f75c, __wbg_set_f43e577aea94465b, __wbg_length_35a7bace40f36eac, __wbg_isArray_d314bb98fcf08331, __wbg_isSafeInteger_bfbc7332a9768d2a, __wbg_entries_58c7934c745daac7, __wbg_iterator_6ff6560ca1568e55, __wbg_call_389efe28435a9388, __wbg_get_b3ed3ad4be2bc8ac, __wbg_next_418f80d8f5303233, __wbg_next_3482f54c49e8af19, __wbg_new_8a6f238a6ece86ea, __wbg_stack_0ed75d68575b0f3c, __wbg_error_7534b8e9a36f1ab4, __wbg___wbindgen_string_get_72fb696202c56729, __wbg___wbindgen_number_get_8ff4255516ccad3e, __wbg___wbindgen_in_47fa6863be6f2f25, __wbg___wbindgen_throw_be289d5034ed271b, __wbg___wbindgen_jsval_eq_11888390b0186270, __wbg_Number_04624de7d0e8332d, __wbg_Error_8c4e43fe74559d73, __wbg___wbindgen_is_bigint_31b12575b56f32fc, __wbg___wbindgen_is_object_5ae8e5880f2c1fbd, __wbg___wbindgen_is_string_cd444516edc5b180, __wbg___wbindgen_boolean_get_bbbb1c18aa2f5e25, __wbg___wbindgen_is_function_0095a73b8b156f76, __wbg___wbindgen_is_undefined_9e4d92534c42d778, __wbg___wbindgen_jsval_loose_eq_9dd77d8cd6671811, __wbg___wbindgen_bigint_get_as_i64_8fcf4ce7f1ca72a2, __wbg___wbindgen_debug_string_0bc8482c6e3508ae, __wbindgen_init_externref_table, __wbindgen_cast_0000000000000001, __wbindgen_cast_0000000000000002, __wbindgen_cast_0000000000000003, __wbindgen_cast_0000000000000004 } from \"./apex_state_wasm_bg.js\";\n\n // Build the WASM import object\n const imports = {\n [\"./apex_state_wasm_bg.js\"]: {\n __wbg_now_30ddf41d4ebf52fb,\n__wbindgen_object_is_undefined,\n__wbg_get_with_ref_key_1dc361bd10053bfe,\n__wbg_set_3f1d0b984ed272ed,\n__wbg_String_8f0eb39a4a4c2f66,\n__wbg_new_dca287b076112a51,\n__wbg_new_3eb36ae241fe6f44,\n__wbg_new_361308b2356cecd0,\n__wbg_new_dd2b680c8bf6ae29,\n__wbg_length_32ed9a279acd054c,\n__wbg_prototypesetcall_bdcdcc5842e4d77d,\n__wbg_done_57b39ecd9addfe81,\n__wbg_value_0546255b415e96c1,\n__wbg_instanceof_Map_53af74335dec57f4,\n__wbg_instanceof_Uint8Array_9b9075935c74707c,\n__wbg_instanceof_ArrayBuffer_c367199e2fa2aa04,\n__wbg_set_1eb0999cf5d27fc8,\n__wbg_get_9b94d73e6221f75c,\n__wbg_set_f43e577aea94465b,\n__wbg_length_35a7bace40f36eac,\n__wbg_isArray_d314bb98fcf08331,\n__wbg_isSafeInteger_bfbc7332a9768d2a,\n__wbg_entries_58c7934c745daac7,\n__wbg_iterator_6ff6560ca1568e55,\n__wbg_call_389efe28435a9388,\n__wbg_get_b3ed3ad4be2bc8ac,\n__wbg_next_418f80d8f5303233,\n__wbg_next_3482f54c49e8af19,\n__wbg_new_8a6f238a6ece86ea,\n__wbg_stack_0ed75d68575b0f3c,\n__wbg_error_7534b8e9a36f1ab4,\n__wbg___wbindgen_string_get_72fb696202c56729,\n__wbg___wbindgen_number_get_8ff4255516ccad3e,\n__wbg___wbindgen_in_47fa6863be6f2f25,\n__wbg___wbindgen_throw_be289d5034ed271b,\n__wbg___wbindgen_jsval_eq_11888390b0186270,\n__wbg_Number_04624de7d0e8332d,\n__wbg_Error_8c4e43fe74559d73,\n__wbg___wbindgen_is_bigint_31b12575b56f32fc,\n__wbg___wbindgen_is_object_5ae8e5880f2c1fbd,\n__wbg___wbindgen_is_string_cd444516edc5b180,\n__wbg___wbindgen_boolean_get_bbbb1c18aa2f5e25,\n__wbg___wbindgen_is_function_0095a73b8b156f76,\n__wbg___wbindgen_is_undefined_9e4d92534c42d778,\n__wbg___wbindgen_jsval_loose_eq_9dd77d8cd6671811,\n__wbg___wbindgen_bigint_get_as_i64_8fcf4ce7f1ca72a2,\n__wbg___wbindgen_debug_string_0bc8482c6e3508ae,\n__wbindgen_init_externref_table,\n__wbindgen_cast_0000000000000001,\n__wbindgen_cast_0000000000000002,\n__wbindgen_cast_0000000000000003,\n__wbindgen_cast_0000000000000004\n }\n };\n\n async function loadWasm(module, imports) {\n if (typeof module === 'string') {\n\n // Resolve relative urls from the runtime script path\n if (module.startsWith('./')) {\n module = new URL(module, import.meta.url).href\n }\n\n \n\n const moduleRequest = await fetch(module);\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n return await WebAssembly.instantiateStreaming(moduleRequest, imports);\n } catch (e) {\n if (moduleRequest.headers.get('Content-Type') != 'application/wasm') {\n console.warn(e);\n } else {\n throw e;\n }\n }\n }\n module = await moduleRequest.arrayBuffer();\n\n \n }\n return await WebAssembly.instantiate(module, imports);\n }\n\n export const { instance, module } = await loadWasm(wasmModule, imports);\n\n export const memory = instance.exports.memory;\nexport const get_graph_snapshot = instance.exports.get_graph_snapshot;\nexport const pipeline_create = instance.exports.pipeline_create;\nexport const pipeline_destroy = instance.exports.pipeline_destroy;\nexport const pipeline_finalize = instance.exports.pipeline_finalize;\nexport const pipeline_reset = instance.exports.pipeline_reset;\nexport const pipeline_reset_all = instance.exports.pipeline_reset_all;\nexport const process_changes = instance.exports.process_changes;\nexport const register_boollogic = instance.exports.register_boollogic;\nexport const register_concerns = instance.exports.register_concerns;\nexport const register_side_effects = instance.exports.register_side_effects;\nexport const shadow_dump = instance.exports.shadow_dump;\nexport const shadow_init = instance.exports.shadow_init;\nexport const unregister_boollogic = instance.exports.unregister_boollogic;\nexport const unregister_concerns = instance.exports.unregister_concerns;\nexport const unregister_side_effects = instance.exports.unregister_side_effects;\nexport const main = instance.exports.main;\nexport const __wbindgen_malloc = instance.exports.__wbindgen_malloc;\nexport const __wbindgen_realloc = instance.exports.__wbindgen_realloc;\nexport const __wbindgen_exn_store = instance.exports.__wbindgen_exn_store;\nexport const __externref_table_alloc = instance.exports.__externref_table_alloc;\nexport const __wbindgen_externrefs = instance.exports.__wbindgen_externrefs;\nexport const __wbindgen_free = instance.exports.__wbindgen_free;\nexport const __externref_table_dealloc = instance.exports.__externref_table_dealloc;\nexport const __wbindgen_start = instance.exports.__wbindgen_start;\n ","/* @ts-self-types=\"./apex_state_wasm.d.ts\" */\n\nimport * as wasm from \"./apex_state_wasm_bg.wasm\";\nimport { __wbg_set_wasm } from \"./apex_state_wasm_bg.js\";\n__wbg_set_wasm(wasm);\nwasm.__wbindgen_start();\nexport {\n get_graph_snapshot, main, pipeline_create, pipeline_destroy, pipeline_finalize, pipeline_reset, pipeline_reset_all, process_changes, register_boollogic, register_concerns, register_side_effects, shadow_dump, shadow_init, unregister_boollogic, unregister_concerns, unregister_side_effects\n} from \"./apex_state_wasm_bg.js\";\n","import { useCallback, useLayoutEffect } from 'react'\n\nimport { snapshot, subscribe, useSnapshot } from 'valtio'\n\nimport type { ConcernType } from '../concerns'\nimport { defaultConcerns } from '../concerns'\nimport { registerConcernEffects } from '../concerns/registration.wasm-impl'\nimport { useStoreContext } from '../core/context'\nimport type { ProviderProps, StoreConfig } from '../core/types'\nimport { processChangesWasm as processChanges } from '../pipeline/process-changes.wasm-impl'\nimport { registerSideEffects } from '../sideEffects/registration.wasm-impl'\nimport type {\n ArrayOfChanges,\n BoolLogic,\n CheckAggregationPairs,\n CheckComputationPairs,\n CheckListeners,\n CheckSyncPairs,\n ComputationOp,\n ConcernRegistrationMap,\n DeepKey,\n DeepValue,\n EvaluatedConcerns,\n GenericMeta,\n ResolvableDeepKey,\n ValidatedAggregationPairs,\n ValidatedComputationPairs,\n ValidatedFlipPairs,\n ValidatedListeners,\n ValidatedSyncPairs,\n} from '../types'\nimport type { DeepKeyFiltered } from '../types/deep-key-filtered'\nimport type { SideEffects } from '../types/side-effects'\nimport { dot } from '../utils/dot'\nimport { filterConcernsByKeys } from '../utils/filter-concerns'\nimport { createProvider } from './provider'\nimport { createWarmPairHelpers } from './warm-pair-helpers'\n\n/**\n * Explicit return type of createGenericStore.\n *\n * Defined as an interface so TypeScript references type aliases by name\n * (e.g. `SideEffects<DATA, META>`) instead of expanding them inline.\n * Without this, large DATA types (2800+ DeepKey paths) cause\n * \"inferred type exceeds the maximum length\" (TS error) because the\n * compiler tries to inline-expand every O(N²) pair type.\n */\nexport interface GenericStoreApi<\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n CONCERNS extends readonly ConcernType<string, any, any>[] =\n typeof defaultConcerns,\n> {\n Provider: (props: ProviderProps<DATA>) => React.JSX.Element\n\n useFieldStore: <P extends DeepKey<DATA>>(\n path: P,\n ) => {\n value: DeepValue<DATA, P>\n setValue: (newValue: DeepValue<DATA, P>, meta?: META) => void\n } & Record<string, unknown>\n\n useStore: <P extends DeepKey<DATA>>(\n path: P,\n ) => [DeepValue<DATA, P>, (value: DeepValue<DATA, P>, meta?: META) => void]\n\n useJitStore: () => {\n proxyValue: DATA\n setChanges: (changes: ArrayOfChanges<DATA, META>) => void\n getState: () => DATA\n }\n\n useSideEffects: (id: string, effects: SideEffects<DATA, META>) => void\n\n useConcerns: <\n CUSTOM extends readonly ConcernType<string, any, any>[] = readonly [],\n >(\n id: string,\n registration: ConcernRegistrationMap<\n DATA,\n readonly [...CONCERNS, ...CUSTOM]\n >,\n customConcerns?: CUSTOM,\n ) => void\n\n withConcerns: <\n SELECTION extends Partial<\n Record<Extract<CONCERNS[number], { name: string }>['name'], boolean>\n >,\n >(\n selection: SELECTION,\n ) => {\n useFieldStore: <P extends DeepKey<DATA>>(\n path: P,\n ) => {\n value: DeepValue<DATA, P>\n setValue: (newValue: DeepValue<DATA, P>, meta?: META) => void\n } & {\n [K in keyof SELECTION as SELECTION[K] extends true\n ? K\n : never]?: K extends keyof EvaluatedConcerns<CONCERNS>\n ? EvaluatedConcerns<CONCERNS>[K]\n : never\n }\n /** Reactive snapshot of all concerns matching this selection, keyed by path. Re-renders when any concern changes. */\n useConcernsSnapshot: () => Record<\n string,\n {\n [K in keyof SELECTION as SELECTION[K] extends true\n ? K\n : never]?: K extends keyof EvaluatedConcerns<CONCERNS>\n ? EvaluatedConcerns<CONCERNS>[K]\n : never\n }\n >\n }\n\n /**\n * React hook. Fires callback whenever concerns matching the selection change.\n * Does NOT trigger re-renders — use useConcernsSnapshot() for reactive UI instead.\n * Callback is stable across renders (no need to memoize).\n */\n useWatchConcerns: <\n SELECTION extends Partial<\n Record<Extract<CONCERNS[number], { name: string }>['name'], boolean>\n >,\n >(\n selection: SELECTION,\n callback: (\n concerns: Record<\n string,\n {\n [K in keyof SELECTION as SELECTION[K] extends true\n ? K\n : never]?: K extends keyof EvaluatedConcerns<CONCERNS>\n ? EvaluatedConcerns<CONCERNS>[K]\n : never\n }\n >,\n ) => void,\n ) => void\n\n withMeta: (presetMeta: Partial<META>) => {\n useFieldStore: <P extends DeepKey<DATA>>(\n path: P,\n ) => {\n value: DeepValue<DATA, P>\n setValue: (newValue: DeepValue<DATA, P>, meta?: META) => void\n }\n }\n\n // Pre-warmed pair helpers from createWarmPairHelpers\n syncPairs: <\n T extends (\n | [ResolvableDeepKey<DATA>, ResolvableDeepKey<DATA>]\n | [\n ResolvableDeepKey<DATA>,\n ResolvableDeepKey<DATA>,\n { oneWay: '[0]->[1]' | '[1]->[0]' },\n ]\n )[],\n >(\n pairs: CheckSyncPairs<DATA, T>,\n ) => ValidatedSyncPairs<DATA>\n\n flipPairs: <T extends [ResolvableDeepKey<DATA>, ResolvableDeepKey<DATA>][]>(\n pairs: CheckSyncPairs<DATA, T>,\n ) => ValidatedFlipPairs<DATA>\n\n aggregationPairs: <\n T extends (\n | [ResolvableDeepKey<DATA>, ResolvableDeepKey<DATA>]\n | [ResolvableDeepKey<DATA>, ResolvableDeepKey<DATA>, BoolLogic<DATA>]\n )[],\n >(\n pairs: CheckAggregationPairs<DATA, T>,\n ) => ValidatedAggregationPairs<DATA>\n\n computationPairs: <\n T extends (\n | [\n ComputationOp,\n DeepKeyFiltered<DATA, number>,\n DeepKeyFiltered<DATA, number>,\n ]\n | [\n ComputationOp,\n DeepKeyFiltered<DATA, number>,\n DeepKeyFiltered<DATA, number>,\n BoolLogic<DATA>,\n ]\n )[],\n >(\n pairs: CheckComputationPairs<DATA, T>,\n ) => ValidatedComputationPairs<DATA>\n\n listeners: <\n T extends readonly {\n path: ResolvableDeepKey<DATA> | null\n scope?: ResolvableDeepKey<DATA> | null | undefined\n fn: (...args: any[]) => any\n }[],\n >(\n items: CheckListeners<DATA, META, T>,\n ) => ValidatedListeners<DATA, META>\n}\n\nexport const createGenericStore = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n CONCERNS extends readonly ConcernType<string, any, any>[] =\n typeof defaultConcerns,\n>(\n config?: StoreConfig,\n): GenericStoreApi<DATA, META, CONCERNS> => {\n const Provider = createProvider<DATA>(config)\n\n // Internal helper hook for field state access\n const _useFieldValue = <P extends DeepKey<DATA>>(path: P) => {\n const store = useStoreContext<DATA>()\n const snap = useSnapshot(store.state) as DATA\n const value = dot.get(snap, path)\n\n const setValue = useCallback(\n (newValue: DeepValue<DATA, P>, meta?: META) => {\n const changes: ArrayOfChanges<DATA, META> = [\n [path, newValue, (meta || {}) as META],\n ]\n\n processChanges(store, changes)\n },\n [store, path],\n )\n\n return { store, value, setValue }\n }\n\n const useFieldStore = <P extends DeepKey<DATA>>(\n path: P,\n ): {\n value: DeepValue<DATA, P>\n setValue: (newValue: DeepValue<DATA, P>, meta?: META) => void\n } & Record<string, unknown> => {\n const { store, value, setValue } = _useFieldValue(path)\n const concernsSnap = useSnapshot(store._concerns)\n const allConcerns = (concernsSnap[path] || {}) as Record<string, unknown>\n\n return { value, setValue, ...allConcerns }\n }\n\n const useStore = <P extends DeepKey<DATA>>(\n path: P,\n ): [DeepValue<DATA, P>, (value: DeepValue<DATA, P>, meta?: META) => void] => {\n const { value, setValue } = _useFieldValue(path)\n return [value, setValue]\n }\n\n const useJitStore = (): {\n proxyValue: DATA\n setChanges: (changes: ArrayOfChanges<DATA, META>) => void\n getState: () => DATA\n } => {\n const store = useStoreContext<DATA>()\n const proxyValue = useSnapshot(store.state) as DATA\n\n const setChanges = useCallback(\n (changes: ArrayOfChanges<DATA, META>) => {\n processChanges(store, changes)\n },\n [store],\n )\n\n const getState = useCallback(() => {\n return snapshot(store.state) as DATA\n }, [store])\n\n return { proxyValue, setChanges, getState }\n }\n\n const useSideEffects = (\n id: string,\n effects: SideEffects<DATA, META>,\n ): void => {\n const store = useStoreContext<DATA>()\n useLayoutEffect(() => {\n return registerSideEffects(store, id, effects)\n }, [store, id, effects])\n }\n\n // Explicit type annotation from GenericStoreApi — TS can't structurally verify\n // generic function assignability for this method (contravariant generic params).\n // Typing the variable directly ensures the return type annotation works without `as`.\n const useConcerns: GenericStoreApi<DATA, META, CONCERNS>['useConcerns'] = ((\n id: string,\n registration: ConcernRegistrationMap<\n DATA,\n readonly [...CONCERNS, ...any[]]\n >,\n customConcerns?: readonly ConcernType<string, any, any>[],\n ): void => {\n const store = useStoreContext<DATA>()\n const concerns = (customConcerns ||\n defaultConcerns) as readonly ConcernType<any, any, any>[]\n\n useLayoutEffect(() => {\n return registerConcernEffects(store, registration, concerns)\n }, [store, id, registration, customConcerns])\n }) as GenericStoreApi<DATA, META, CONCERNS>['useConcerns']\n\n // Explicit type annotation from GenericStoreApi — same reason as useConcerns.\n const withConcerns: GenericStoreApi<DATA, META, CONCERNS>['withConcerns'] = (<\n SELECTION extends Partial<\n Record<Extract<CONCERNS[number], { name: string }>['name'], boolean>\n >,\n >(\n selection: SELECTION,\n ) => {\n type SelectedConcerns = {\n [K in keyof SELECTION as SELECTION[K] extends true\n ? K\n : never]?: K extends keyof EvaluatedConcerns<CONCERNS>\n ? EvaluatedConcerns<CONCERNS>[K]\n : never\n }\n\n type WithConcernsFieldStore<P extends DeepKey<DATA>> = {\n value: DeepValue<DATA, P>\n setValue: (newValue: DeepValue<DATA, P>, meta?: META) => void\n } & SelectedConcerns\n\n const selectionKeys = Object.keys(selection ?? {}).filter(\n (k) => (selection as Record<string, boolean | undefined>)[k],\n )\n\n return {\n useFieldStore: <P extends DeepKey<DATA>>(\n path: P,\n ): WithConcernsFieldStore<P> => {\n const { store, value, setValue } = _useFieldValue(path)\n const concernsSnap = useSnapshot(store._concerns)\n const allConcerns = (concernsSnap[path] || {}) as Record<\n string,\n unknown\n >\n const selectedConcerns = filterConcernsByKeys(\n { [path]: allConcerns },\n selectionKeys,\n )[path] as SelectedConcerns | undefined\n\n return {\n value,\n setValue,\n ...(selectedConcerns ?? {}),\n } as WithConcernsFieldStore<P>\n },\n\n useConcernsSnapshot: () => {\n const store = useStoreContext<DATA>()\n const concernsSnap = useSnapshot(store._concerns)\n return filterConcernsByKeys(\n concernsSnap as Record<string, Record<string, unknown>>,\n selectionKeys,\n ) as Record<string, SelectedConcerns>\n },\n }\n }) as GenericStoreApi<DATA, META, CONCERNS>['withConcerns']\n\n const withMeta = (presetMeta: Partial<META>) => ({\n useFieldStore: <P extends DeepKey<DATA>>(\n path: P,\n ): {\n value: DeepValue<DATA, P>\n setValue: (newValue: DeepValue<DATA, P>, meta?: META) => void\n } => {\n const { store, value, setValue: originalSetValue } = _useFieldValue(path)\n const concernsSnap = useSnapshot(store._concerns)\n const allConcerns = (concernsSnap[path] || {}) as Record<string, unknown>\n\n const setValue = useCallback(\n (newValue: DeepValue<DATA, P>, meta?: META) => {\n originalSetValue(newValue, { ...presetMeta, ...meta } as META)\n },\n [originalSetValue],\n )\n\n return { value, setValue, ...allConcerns }\n },\n })\n\n const useWatchConcerns: GenericStoreApi<\n DATA,\n META,\n CONCERNS\n >['useWatchConcerns'] = (<\n SELECTION extends Partial<\n Record<Extract<CONCERNS[number], { name: string }>['name'], boolean>\n >,\n >(\n selection: SELECTION,\n callback: (concerns: Record<string, Record<string, unknown>>) => void,\n ): void => {\n const store = useStoreContext<DATA>()\n const selectionKeys = Object.keys(selection).filter(\n (k) => (selection as Record<string, boolean | undefined>)[k],\n )\n\n useLayoutEffect(() => {\n return subscribe(store._concerns, () => {\n callback(\n filterConcernsByKeys(\n snapshot(store._concerns) as Record<\n string,\n Record<string, unknown>\n >,\n selectionKeys,\n ),\n )\n })\n }, [store])\n }) as GenericStoreApi<DATA, META, CONCERNS>['useWatchConcerns']\n\n return {\n Provider,\n useFieldStore,\n useStore,\n useJitStore,\n useSideEffects,\n useConcerns,\n withConcerns,\n withMeta,\n useWatchConcerns,\n ...createWarmPairHelpers<DATA, META>(),\n }\n}\n","/**\n * WASM Implementation - Concern Registration\n *\n * BoolLogic and validators use WASM registration.\n * Custom concerns still use effect() (can't be moved to WASM).\n */\n\nimport { effect } from 'valtio-reactive'\n\nimport type { StoreInstance } from '../core/types'\nimport type { ConcernRegistrationMap } from '../types'\nimport { dot } from '../utils/dot'\nimport type { Wasm, WasmPipeline } from '../wasm/bridge'\nimport type { BaseConcernProps, ConcernType } from './types'\n\n/** Check if a concern config has a `boolLogic` field (BoolLogic concern). */\nconst isBoolLogicConfig = (\n config: Record<string, unknown>,\n): config is { boolLogic: unknown } =>\n 'boolLogic' in config && config['boolLogic'] != null\n\n/** Check if a concern config has a `value_logic` field (ValueLogic concern). */\nconst isValueLogicConfig = (\n config: Record<string, unknown>,\n): config is { valueLogic: unknown } =>\n 'valueLogic' in config && config['valueLogic'] != null\n\n/** Check if a concern config is schema-based validation. */\nconst isSchemaValidation = (\n concernName: string,\n config: Record<string, unknown>,\n): boolean =>\n concernName === 'validationState' &&\n 'schema' in config &&\n !('evaluate' in config)\n\n/** Sequential validator ID counter. */\nlet nextValidatorId = 0\n\n/** Sequential registration ID counter. */\nlet nextRegistrationId = 0\n\n/** Batch-register BoolLogics, validators, and ValueLogics with WASM, apply initial results. */\nconst registerWasmBatch = (\n pipeline: WasmPipeline,\n boolLogics: Wasm.BoolLogicRegistration[],\n validators: Wasm.ValidatorRegistration[],\n valueLogics: Wasm.ValueLogicRegistration[],\n validatorConfigs: Map<\n number,\n {\n schema: any\n initialValue: unknown\n concernName: string\n concernsAtPath: Record<string, unknown>\n }\n >,\n concernRefs: Map<string, Record<string, unknown>>,\n disposeCallbacks: (() => void)[],\n) => {\n const registrationId = `concerns-${nextRegistrationId++}`\n const result = pipeline.registerConcerns({\n registration_id: registrationId,\n bool_logics: boolLogics,\n validators,\n value_logics: valueLogics,\n })\n\n // Apply initial BoolLogic evaluations to _concerns\n for (const change of result.bool_logic_changes) {\n // BoolLogic output paths are like \"email.disabledWhen\" (no _concerns prefix)\n const lastDot = change.path.lastIndexOf('.')\n const basePath = change.path.slice(0, lastDot)\n const concernName = change.path.slice(lastDot + 1)\n const concernsAtPath = concernRefs.get(basePath)\n if (concernsAtPath && concernName) {\n concernsAtPath[concernName] = change.value\n }\n }\n\n // Apply initial ValueLogic evaluations to _concerns (same path pattern)\n for (const change of result.value_logic_changes) {\n const lastDot = change.path.lastIndexOf('.')\n const basePath = change.path.slice(0, lastDot)\n const concernName = change.path.slice(lastDot + 1)\n const concernsAtPath = concernRefs.get(basePath)\n if (concernsAtPath && concernName) {\n concernsAtPath[concernName] = change.value\n }\n }\n\n disposeCallbacks.push(() => {\n pipeline.unregisterConcerns(registrationId)\n })\n\n // Post-registration: run initial validation for each validator\n validatorConfigs.forEach((config, validatorId) => {\n const parseResult = config.schema.safeParse(config.initialValue)\n const validationResult = {\n isError: !parseResult.success,\n errors: parseResult.success\n ? []\n : parseResult.error.errors.map((e: any) => ({\n field: e.path.length > 0 ? e.path.join('.') : '.',\n message: e.message,\n })),\n }\n\n config.concernsAtPath[config.concernName] = validationResult\n\n // Store schema in per-pipeline storage for JS-side validator execution\n pipeline.validatorSchemas.set(validatorId, config.schema)\n })\n}\n\n/** Create a single concern effect with cached evaluate function. */\nconst createConcernEffect = <DATA extends object>(\n store: StoreInstance<DATA>,\n item: {\n path: string\n concernName: string\n config: Record<string, any>\n concern: ConcernType\n concernsAtPath: Record<string, unknown>\n },\n resultCache: Map<string, unknown>,\n): (() => void) => {\n const { path, concernName, config, concern, concernsAtPath } = item\n const cacheKey = `${path}.${concernName}`\n\n // Resolve evaluate function once (not per effect trigger)\n // @FIXME: this should be coming from concern registration. we should have evaluate function for validation there, not here.\n const evaluateFn =\n 'evaluate' in config && typeof config['evaluate'] === 'function'\n ? config['evaluate']\n : concern.evaluate\n\n // Wrap evaluation in effect() for automatic dependency tracking\n // effect() will automatically track ONLY the properties accessed during evaluate()\n return effect(() => {\n // READ from dataProxy (automatic tracking!)\n // Any property accessed here will trigger re-evaluation when changed\n const value = dot.get__unsafe(store.state, path)\n\n // OPTIMIZATION: Avoid object spread overhead (creates new object every evaluation)\n // Use Object.assign instead for single-pass property addition (40% faster)\n const evalProps: BaseConcernProps<any, string> & Record<string, any> =\n Object.assign({ state: store.state, path, value }, config)\n\n // EVALUATE concern (all state accesses inside are tracked!)\n const result = evaluateFn(evalProps)\n\n // Check cache (non-reactive!) to see if value changed\n const prev = resultCache.get(cacheKey)\n if (prev !== result) {\n // Update cache\n resultCache.set(cacheKey, result)\n\n // WRITE to pre-captured reference (NO tracked reads!)\n concernsAtPath[concernName] = result\n }\n })\n}\n\n/** Check if a concern config has an inline evaluate function (custom/ad-hoc concern). */\nconst isAdHocConcern = (\n config: Record<string, unknown>,\n): config is { evaluate: (...args: any[]) => unknown } =>\n 'evaluate' in config && typeof config['evaluate'] === 'function'\n\n/** Collected registration data from single-pass classification. */\ninterface CollectedRegistrations {\n boolLogics: Wasm.BoolLogicRegistration[]\n validators: Wasm.ValidatorRegistration[]\n valueLogics: Wasm.ValueLogicRegistration[]\n validatorConfigs: Map<\n number,\n {\n schema: any\n initialValue: unknown\n concernName: string\n concernsAtPath: Record<string, unknown>\n }\n >\n jsEffects: {\n path: string\n concernName: string\n config: Record<string, any>\n concern: ConcernType\n concernsAtPath: Record<string, unknown>\n }[]\n}\n\n/** Single-pass: classify each concern config as BoolLogic, validator, or JS effect. */\n/** Collect a schema validator registration. */\nconst collectValidator = <DATA extends object>(\n store: StoreInstance<DATA>,\n path: string,\n concernName: string,\n config: Record<string, any>,\n concernsAtPath: Record<string, unknown>,\n validators: CollectedRegistrations['validators'],\n validatorConfigs: CollectedRegistrations['validatorConfigs'],\n) => {\n const validatorId = nextValidatorId++\n // IMPORTANT: Include _concerns. prefix for WASM shadow state traversal\n const depPaths =\n 'scope' in config && config['scope'] ? [config['scope'] as string] : [path]\n\n validators.push({\n validator_id: validatorId,\n output_path: `_concerns.${path}.${concernName}`,\n dependency_paths: depPaths,\n })\n\n // Store schema and initial value info for post-registration processing\n const primaryValue = dot.get__unsafe(store.state, depPaths[0]!)\n validatorConfigs.set(validatorId, {\n schema: config['schema'],\n initialValue: primaryValue,\n concernName,\n concernsAtPath,\n })\n}\n\n/** Classify a single concern config and push to the appropriate bucket. */\nconst classifyConcern = <DATA extends object>(\n store: StoreInstance<DATA>,\n path: string,\n concernName: string,\n config: Record<string, any>,\n concernsAtPath: Record<string, unknown>,\n concernMap: Map<string, ConcernType>,\n result: CollectedRegistrations,\n) => {\n // BoolLogic registration (WASM)\n if (isBoolLogicConfig(config)) {\n result.boolLogics.push({\n output_path: `${path}.${concernName}`,\n tree_json: JSON.stringify(config.boolLogic),\n })\n return\n }\n\n // ValueLogic registration (WASM)\n if (isValueLogicConfig(config)) {\n result.valueLogics.push({\n output_path: `${path}.${concernName}`,\n tree_json: JSON.stringify(config.valueLogic),\n })\n return\n }\n\n // Schema validator registration (WASM)\n if (isSchemaValidation(concernName, config)) {\n collectValidator(\n store,\n path,\n concernName,\n config,\n concernsAtPath,\n result.validators,\n result.validatorConfigs,\n )\n return\n }\n\n // JS-based concern — queue for effect creation after WASM batch\n // Resolve concern from registry, or create ad-hoc for inline evaluate functions\n const concern =\n concernMap.get(concernName) ??\n (isAdHocConcern(config)\n ? {\n name: concernName,\n description: `Custom concern: ${concernName}`,\n evaluate: config.evaluate,\n }\n : undefined)\n\n if (!concern) {\n console.warn(`Concern \"${concernName}\" not found`)\n return\n }\n\n result.jsEffects.push({ path, concernName, config, concern, concernsAtPath })\n}\n\n/** Single-pass: classify each concern config as BoolLogic, ValueLogic, validator, or JS effect. */\nconst collectRegistrations = <DATA extends object>(\n store: StoreInstance<DATA>,\n registrationEntries: [string, Record<string, any> | undefined][],\n concernRefs: Map<string, Record<string, unknown>>,\n concernMap: Map<string, ConcernType>,\n): CollectedRegistrations => {\n const result: CollectedRegistrations = {\n boolLogics: [],\n validators: [],\n valueLogics: [],\n validatorConfigs: new Map(),\n jsEffects: [],\n }\n\n for (const [path, concernConfigs] of registrationEntries) {\n if (!concernConfigs) continue\n const concernsAtPath = concernRefs.get(path)!\n\n for (const [concernName, config] of Object.entries(concernConfigs)) {\n if (!config) continue\n classifyConcern(\n store,\n path,\n concernName,\n config,\n concernsAtPath,\n concernMap,\n result,\n )\n }\n }\n\n return result\n}\n\n/** Clean up concern values from the concerns proxy on unmount. */\nconst cleanupConcerns = <DATA extends object>(\n store: StoreInstance<DATA>,\n registrationEntries: [string, Record<string, any> | undefined][],\n) => {\n for (const [path, concernConfigs] of registrationEntries) {\n if (!concernConfigs) continue\n const concernsObj = store._concerns[path]\n if (!concernsObj) continue\n\n // Delete specific concerns for this path\n for (const concernName of Object.keys(concernConfigs)) {\n // Use Reflect.deleteProperty to avoid dynamic delete lint error\n Reflect.deleteProperty(concernsObj, concernName)\n }\n\n // Clean up empty path object\n if (Object.keys(concernsObj).length === 0) {\n Reflect.deleteProperty(store._concerns, path)\n }\n }\n}\n\nexport const registerConcernEffects = <DATA extends object>(\n store: StoreInstance<DATA>,\n registration: ConcernRegistrationMap<DATA>,\n concerns: readonly ConcernType[],\n): (() => void) => {\n const disposeCallbacks: (() => void)[] = []\n const resultCache = new Map<string, unknown>()\n const concernRefs = new Map<string, Record<string, unknown>>()\n\n // Build O(1) concern lookup map (avoids linear .find() per inner iteration)\n const concernMap = new Map<string, ConcernType>()\n for (const c of concerns) {\n concernMap.set(c.name, c)\n }\n\n // Pre-initialize all path objects BEFORE creating effects\n const registrationEntries = Object.entries(registration) as [\n string,\n Record<string, any> | undefined,\n ][]\n for (const [path] of registrationEntries) {\n if (!store._concerns[path]) {\n store._concerns[path] = {}\n }\n concernRefs.set(path, store._concerns[path])\n }\n\n // Single pass: classify all concern configs\n const { boolLogics, validators, valueLogics, validatorConfigs, jsEffects } =\n collectRegistrations(store, registrationEntries, concernRefs, concernMap)\n\n // Register all BoolLogics, validators, and ValueLogics in one WASM call\n if (\n boolLogics.length > 0 ||\n validators.length > 0 ||\n valueLogics.length > 0\n ) {\n registerWasmBatch(\n store._internal.pipeline!,\n boolLogics,\n validators,\n valueLogics,\n validatorConfigs,\n concernRefs,\n disposeCallbacks,\n )\n }\n\n // Create effects for queued JS-based concerns\n for (const item of jsEffects) {\n disposeCallbacks.push(createConcernEffect(store, item, resultCache))\n }\n\n // Return cleanup function that disposes all effects on unmount\n return () => {\n for (const dispose of disposeCallbacks) dispose()\n resultCache.clear()\n concernRefs.clear()\n cleanupConcerns(store, registrationEntries)\n }\n}\n","/**\n * Type checking utilities — similar to lodash type guards\n *\n * Provides type-safe predicates for common type checks with TypeScript support\n */\nimport type { Primitive } from '../types/deep-key'\n\n/** Check if value is null or undefined */\nconst isNil = (value: unknown): value is null | undefined => value == null\n\n/** Check if value is undefined */\nconst isUndefined = (value: unknown): value is undefined => value === undefined\n\n/** Check if value is null */\nconst isNull = (value: unknown): value is null => value === null\n\n/** Check if value is a plain object (not null, array, Date, RegExp, class instances, etc.) */\nconst isObject = (value: unknown): value is Record<string, unknown> => {\n if (value == null || typeof value !== 'object' || Array.isArray(value))\n return false\n const proto = Object.getPrototypeOf(value)\n return proto === Object.prototype || proto === null\n}\n\n/** Check if value is an array */\nconst isArray = (value: unknown): value is unknown[] => Array.isArray(value)\n\n/** Check if value is a plain object or an array */\nconst isObjectOrArray = (\n value: unknown,\n): value is Record<string, unknown> | unknown[] =>\n isObject(value) || isArray(value)\n\n/** Check if value is a string */\nconst isString = (value: unknown): value is string => typeof value === 'string'\n\n/** Check if value is a number */\nconst isNumber = (value: unknown): value is number => typeof value === 'number'\n\n/** Check if value is a boolean */\nconst isBoolean = (value: unknown): value is boolean =>\n typeof value === 'boolean'\n\n/** Check if value is a function */\nconst isFunction = (value: unknown): value is (...args: unknown[]) => unknown =>\n typeof value === 'function'\n\n/** Check if value is a symbol */\nconst isSymbol = (value: unknown): value is symbol => typeof value === 'symbol'\n\n/** Check if value is a Date */\nconst isDate = (value: unknown): value is Date => value instanceof Date\n\n/** Check if value is a RegExp */\nconst isRegExp = (value: unknown): value is RegExp => value instanceof RegExp\n\n/** Check if a string key is a non-negative integer index (e.g. \"0\", \"1\", \"42\") */\nconst isNumericKey = (value: string): boolean => /^\\d+$/.test(value)\n\n/** Check if value is a primitive (string, number, boolean, symbol, bigint, null, undefined) */\nconst isPrimitive = (value: unknown): value is Primitive => {\n const type = typeof value\n return (\n type === 'string' ||\n type === 'number' ||\n type === 'boolean' ||\n type === 'symbol' ||\n type === 'bigint' ||\n value == null\n )\n}\n\n/** Check if object is empty (has no own properties) */\nconst isEmptyObject = (value: object): boolean => {\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n return false\n }\n }\n return true\n}\n\n/** Check if value is empty (null, undefined, empty string, empty array, empty object) */\nconst isEmpty = (value: unknown): boolean => {\n if (isNil(value)) return true\n if (isNumber(value) || isBoolean(value)) return false\n if (isString(value)) return value.length === 0\n if (isArray(value)) return value.length === 0\n if (isObject(value)) return isEmptyObject(value as object)\n // Date, RegExp, Map, Set, class instances, functions, symbols — not empty\n return false\n}\n\nconst isEqualArray = (a: any[], b: any[]): boolean => {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (!iEqual(a[i], b[i])) return false\n }\n return true\n}\n\nconst isEqualObject = (a: any, b: any): boolean => {\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n\n if (keysA.length !== keysB.length) return false\n\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false\n if (!iEqual(a[key], b[key])) return false\n }\n\n return true\n}\n\n/** Check for deep equality between two values */\nconst iEqual = (a: unknown, b: unknown): boolean => {\n if (a === b) return true\n\n if (isArray(a) && isArray(b)) {\n return isEqualArray(a, b)\n }\n\n if (isDate(a) && isDate(b)) {\n return a.getTime() === b.getTime()\n }\n\n if (isRegExp(a) && isRegExp(b)) {\n return a.toString() === b.toString()\n }\n\n if (isObject(a) && isObject(b)) {\n return isEqualObject(a, b)\n }\n\n return false\n}\n\n// Negated type guards (with proper type narrowing)\n/** Check if value is not null or undefined */\nconst isNotNil = <T>(value: T | null | undefined): value is T => value != null\n\n/** Check if value is not undefined */\nconst isNotUndefined = <T>(value: T | undefined): value is T =>\n value !== undefined\n\n/** Check if value is not null */\nconst isNotNull = <T>(value: T | null): value is T => value !== null\n\n/** Check if value is not a plain object */\nconst isNotObject = <T>(\n value: T,\n): value is Exclude<T, Record<string, unknown>> => !isObject(value)\n\n/** Check if value is not a plain object and not an array */\nconst isNotObjectOrArray = <T>(\n value: T,\n): value is Exclude<T, Record<string, unknown> | unknown[]> =>\n !isObject(value) && !isArray(value)\n\n/** Check if value is not an array */\nconst isNotArray = <T>(value: T): value is Exclude<T, unknown[]> =>\n !isArray(value)\n\n/** Check if value is not a string */\nconst isNotString = <T>(value: T): value is Exclude<T, string> =>\n typeof value !== 'string'\n\n/** Check if value is not a number */\nconst isNotNumber = <T>(value: T): value is Exclude<T, number> =>\n typeof value !== 'number'\n\n/** Check if value is not a boolean */\nconst isNotBoolean = <T>(value: T): value is Exclude<T, boolean> =>\n typeof value !== 'boolean'\n\n/** Check if value is not a function */\nconst isNotFunction = <T>(\n value: T,\n): value is Exclude<T, (...args: unknown[]) => unknown> =>\n typeof value !== 'function'\n\n/** Check if value is not a symbol */\nconst isNotSymbol = <T>(value: T): value is Exclude<T, symbol> =>\n typeof value !== 'symbol'\n\n/** Check if value is not a Date */\nconst isNotDate = <T>(value: T): value is Exclude<T, Date> =>\n !(value instanceof Date)\n\n/** Check if value is not a RegExp */\nconst isNotRegExp = <T>(value: T): value is Exclude<T, RegExp> =>\n !(value instanceof RegExp)\n\n/** Check if value is not a primitive */\nconst isNotPrimitive = <T>(value: T): value is Exclude<T, Primitive> => {\n const type = typeof value\n return !(\n type === 'string' ||\n type === 'number' ||\n type === 'boolean' ||\n type === 'symbol' ||\n type === 'bigint' ||\n value == null\n )\n}\n\n/** Check if value is not empty */\nconst isNotEmpty = (value: unknown): boolean => !isEmpty(value)\n\n/** Check for deep inequality between two values */\nconst isNotEqual = (a: unknown, b: unknown): boolean => !iEqual(a, b)\n\n/**\n * Unified namespace for type checking\n *\n * @example\n * ```typescript\n * import { is } from './utils/is'\n *\n * if (is.object(value)) { ... }\n * if (is.array(value)) { ... }\n * if (is.nil(value)) { ... }\n *\n * // Negated versions\n * if (is.not.object(value)) { ... }\n * if (is.not.array(value)) { ... }\n * ```\n */\nexport const is = {\n nil: isNil,\n undefined: isUndefined,\n null: isNull,\n object: isObject,\n objectOrArray: isObjectOrArray,\n array: isArray,\n string: isString,\n number: isNumber,\n boolean: isBoolean,\n function: isFunction,\n symbol: isSymbol,\n date: isDate,\n regexp: isRegExp,\n numericKey: isNumericKey,\n primitive: isPrimitive,\n empty: isEmpty,\n equal: iEqual,\n not: {\n nil: isNotNil,\n undefined: isNotUndefined,\n null: isNotNull,\n object: isNotObject,\n objectOrArray: isNotObjectOrArray,\n array: isNotArray,\n string: isNotString,\n number: isNotNumber,\n boolean: isNotBoolean,\n function: isNotFunction,\n symbol: isNotSymbol,\n date: isNotDate,\n regexp: isNotRegExp,\n primitive: isNotPrimitive,\n empty: isNotEmpty,\n equal: isNotEqual,\n },\n}\n","/**\n * Deep access utilities for safe nested object access\n *\n * Uses native Reflect for reads (~2x faster) and writes (~3x faster) vs lodash.\n * Maintains valtio reactivity when setting values.\n */\n\nimport type { DeepKey, DeepValue } from '../types'\nimport { is } from './is'\n\n// Cache split paths to avoid repeated string splitting overhead\nconst pathCache = new Map<string, string[]>()\nconst MAX_CACHE_SIZE = 1000\n\nconst getPathParts = (path: string): string[] => {\n if (typeof path !== 'string') {\n throw new TypeError(\n `[apex-state] Path must be a string, received ${typeof path}: ${JSON.stringify(path)}. ` +\n `Paths must be dot-notation strings like \"user.email\" or \"items.0.name\".`,\n )\n }\n\n let parts = pathCache.get(path)\n if (!parts) {\n parts = path.split('.')\n if (pathCache.size >= MAX_CACHE_SIZE) {\n pathCache.clear()\n }\n pathCache.set(path, parts)\n }\n return parts\n}\n\n/**\n * Safely gets a value from a nested object using dot notation (type-safe)\n *\n * Use this when the path is known at compile time for full type safety.\n * For runtime/dynamic paths, use `dot.get__unsafe` instead.\n *\n * @example\n * ```typescript\n * const user = { address: { city: 'NYC' } }\n * const city = dot.get(user, 'address.city') // string | undefined\n * ```\n */\nconst get = <T extends object, P extends DeepKey<T>>(\n obj: T,\n path: P,\n): DeepValue<T, P> => {\n const parts = getPathParts(path)\n let current: any = obj\n for (const part of parts) {\n if (is.not.objectOrArray(current)) {\n return undefined as DeepValue<T, P>\n }\n current = Reflect.get(current, part)\n }\n return current as DeepValue<T, P>\n}\n\n/**\n * Gets a value from a nested object using a runtime string path (unsafe)\n *\n * Use this when the path is determined at runtime and cannot be validated\n * at compile time. Returns `unknown` since the type cannot be inferred.\n *\n * @example\n * ```typescript\n * const user = { address: { city: 'NYC' } }\n * const dynamicPath = 'address.city'\n * const value = dot.get__unsafe(user, dynamicPath) // unknown\n * ```\n */\nconst get__unsafe = <P extends string>(obj: unknown, path: P): unknown => {\n const parts = getPathParts(path)\n let current: any = obj\n for (const part of parts) {\n if (is.not.objectOrArray(current)) {\n return undefined\n }\n current = Reflect.get(current, part)\n }\n return current\n}\n\n/**\n * Safely sets a value in a nested object using dot notation\n * Maintains valtio proxy reactivity by mutating the original object\n *\n * @example\n * ```typescript\n * const user = { address: { city: 'NYC' } }\n * dot.set(user, 'address.city', 'LA')\n * // user.address.city is now 'LA'\n * ```\n */\nconst set = <T extends object, P extends DeepKey<T>>(\n obj: T,\n path: P,\n value: DeepValue<T, P>,\n): void => {\n const keys = getPathParts(path)\n const last = keys.length - 1\n let current: object = obj\n for (let i = 0; i < last; i++) {\n let next = Reflect.get(current, keys[i]!)\n if (is.not.objectOrArray(next)) {\n next = is.numericKey(keys[i + 1]!) ? [] : {}\n Reflect.set(current, keys[i]!, next)\n }\n current = next as object\n }\n Reflect.set(current, keys[last]!, value)\n}\n\n/**\n * Unsafely sets a value in a nested object using a runtime path string\n * Use when paths are determined at runtime and cannot be statically typed\n *\n * @example\n * ```typescript\n * const user = { address: { city: 'NYC' } }\n * const dynamicPath = 'address.city'\n * dot.set__unsafe(user, dynamicPath, 'LA')\n * ```\n */\nconst set__unsafe = <T extends object, P extends string>(\n obj: T,\n path: P,\n value: unknown,\n): void => {\n const keys = getPathParts(path)\n const last = keys.length - 1\n let current: object = obj\n for (let i = 0; i < last; i++) {\n let next = Reflect.get(current, keys[i]!)\n if (is.not.objectOrArray(next)) {\n next = is.numericKey(keys[i + 1]!) ? [] : {}\n Reflect.set(current, keys[i]!, next)\n }\n current = next as object\n }\n Reflect.set(current, keys[last]!, value)\n}\n\n/**\n * Checks if a value exists at a nested path using dot notation (type-safe)\n *\n * Returns true if the path exists and is not undefined.\n * Note: null and other falsy values (except undefined) return true.\n *\n * @example\n * ```typescript\n * const user = { address: { city: 'NYC' } }\n * dot.has(user, 'address.city') // true\n * dot.has(user, 'address.zip') // false\n * ```\n */\nconst has = <T extends object, P extends DeepKey<T>>(\n obj: T,\n path: P,\n): boolean => {\n const parts = getPathParts(path)\n let current: any = obj\n for (const part of parts) {\n if (is.not.objectOrArray(current)) {\n return false\n }\n current = Reflect.get(current, part)\n }\n return is.not.undefined(current)\n}\n\n/**\n * Deep equality check for values at multiple paths\n *\n * Compares values at multiple runtime paths for deep equality.\n * Returns true if all values are deeply equal to each other.\n * Useful for aggregations and change detection.\n *\n * @example\n * ```typescript\n * const obj = { a: { b: 1 }, c: { b: 1 }, d: { b: 1 } }\n * dot.same(obj, 'a.b', 'c.b', 'd.b') // true\n * dot.same(obj, 'a.b', 'c.b') // true\n * ```\n */\nconst same = <T extends object, P extends string>(\n obj: T,\n ...paths: P[]\n): boolean => {\n if (paths.length === 0) return true\n if (paths.length === 1) return true\n\n const firstValue = get__unsafe(obj, paths[0]!)\n for (let i = 1; i < paths.length; i++) {\n if (!is.equal(get__unsafe(obj, paths[i]!), firstValue)) {\n return false\n }\n }\n return true\n}\n\n/**\n * Unified namespace for dot notation path operations\n *\n * Provides type-safe and unsafe variants for working with nested objects\n * using dot notation paths (e.g., 'user.address.city')\n */\nexport const dot = {\n get,\n get__unsafe,\n set,\n set__unsafe,\n has,\n same,\n}\n","/**\n * Pre-built concerns provided by apex-state\n *\n * Validation & Schema:\n * - validationState: Schema validation (isError, errors, message, timestamp)\n *\n * Conditional UI State (uses BoolLogic):\n * - disabledWhen: Disable field when condition is true\n * - readonlyWhen: Make field read-only when condition is true\n * - visibleWhen: Show field when condition is true\n *\n * Dynamic Text (uses template interpolation):\n * - dynamicTooltip: Template-based tooltip text\n * - dynamicLabel: Template-based label text\n * - dynamicPlaceholder: Template-based placeholder text\n */\n\n// Validation\nimport { disabledWhen } from './disabled-when'\nimport { dynamicLabel } from './dynamic-label'\nimport { dynamicPlaceholder } from './dynamic-placeholder'\nimport { dynamicTooltip } from './dynamic-tooltip'\nimport { readonlyWhen } from './readonly-when'\nimport { validationState } from './validation-state'\nimport { visibleWhen } from './visible-when'\n\nexport {\n type ValidationError,\n validationState,\n type ValidationStateConcern,\n type ValidationStateInput,\n type ValidationStateResult,\n} from './validation-state'\n\n// Conditional state\nexport { disabledWhen } from './disabled-when'\nexport { readonlyWhen } from './readonly-when'\nexport { visibleWhen } from './visible-when'\n\n// Dynamic text\nexport { dynamicLabel } from './dynamic-label'\nexport { dynamicPlaceholder } from './dynamic-placeholder'\nexport { dynamicTooltip } from './dynamic-tooltip'\n\n/**\n * All pre-built concerns as a tuple (for use with findConcern)\n */\nexport const prebuilts = [\n validationState,\n disabledWhen,\n readonlyWhen,\n visibleWhen,\n dynamicTooltip,\n dynamicLabel,\n dynamicPlaceholder,\n] as const\n\n/**\n * Namespace style access for pre-builts\n */\nexport const prebuiltsNamespace = {\n validationState,\n disabledWhen,\n readonlyWhen,\n visibleWhen,\n dynamicTooltip,\n dynamicLabel,\n dynamicPlaceholder,\n}\n","import type { BoolLogic } from '../types'\nimport { dot } from './dot'\nimport { is } from './is'\n\nconst evaluateNumericComparison = <STATE extends object>(\n logic: BoolLogic<STATE>,\n state: STATE,\n): boolean | undefined => {\n if ('GT' in logic) {\n const [path, threshold] = logic.GT\n const value = dot.get__unsafe(state, path)\n return is.number(value) && value > threshold\n }\n if ('LT' in logic) {\n const [path, threshold] = logic.LT\n const value = dot.get__unsafe(state, path)\n return is.number(value) && value < threshold\n }\n if ('GTE' in logic) {\n const [path, threshold] = logic.GTE\n const value = dot.get__unsafe(state, path)\n return is.number(value) && value >= threshold\n }\n if ('LTE' in logic) {\n const [path, threshold] = logic.LTE\n const value = dot.get__unsafe(state, path)\n return is.number(value) && value <= threshold\n }\n return undefined\n}\n\nexport const evaluateBoolLogic = <STATE extends object>(\n logic: BoolLogic<STATE>,\n state: STATE,\n): boolean => {\n // Shorthand tuple: [path, value]\n if (is.array(logic)) {\n const [path, expected] = logic as [string, unknown]\n return dot.get__unsafe(state, path) === expected\n }\n\n // Equality check\n if ('IS_EQUAL' in logic) {\n const [path, expected] = logic.IS_EQUAL as [string, unknown]\n return dot.get__unsafe(state, path) === expected\n }\n\n // Existence check (not null/undefined)\n if ('EXISTS' in logic) {\n return is.not.nil(dot.get__unsafe(state, logic.EXISTS))\n }\n\n // Emptiness check\n if ('IS_EMPTY' in logic) {\n return is.empty(dot.get__unsafe(state, logic.IS_EMPTY))\n }\n\n // Boolean combinators\n if ('AND' in logic) {\n return logic.AND.every((subLogic) => evaluateBoolLogic(subLogic, state))\n }\n if ('OR' in logic) {\n return logic.OR.some((subLogic) => evaluateBoolLogic(subLogic, state))\n }\n if ('NOT' in logic) {\n return !evaluateBoolLogic(logic.NOT, state)\n }\n\n // Numeric comparisons\n const numericResult = evaluateNumericComparison(logic, state)\n if (is.not.undefined(numericResult)) {\n return numericResult\n }\n\n // Inclusion check\n if ('IN' in logic) {\n const [path, allowed] = logic.IN as [string, unknown[]]\n return allowed.includes(dot.get__unsafe(state, path))\n }\n\n // Array contains at least one of the given elements\n if ('CONTAINS_ANY' in logic) {\n const [path, elements] = logic.CONTAINS_ANY as [string, unknown[]]\n const arr = dot.get__unsafe(state, path)\n return (\n is.array(arr) &&\n (elements as unknown[]).some((el) =>\n arr.some((item) => is.equal(item, el)),\n )\n )\n }\n\n // Array contains every one of the given elements\n if ('CONTAINS_ALL' in logic) {\n const [path, elements] = logic.CONTAINS_ALL as [string, unknown[]]\n const arr = dot.get__unsafe(state, path)\n return (\n is.array(arr) &&\n (elements as unknown[]).every((el) =>\n arr.some((item) => is.equal(item, el)),\n )\n )\n }\n\n return false\n}\n","import { evaluateBoolLogic } from '../../utils/bool-logic'\nimport type { BoolLogic, ConcernType } from '../types'\n\nexport const disabledWhen: ConcernType<\n 'disabledWhen',\n { boolLogic: BoolLogic<any> },\n boolean\n> = {\n name: 'disabledWhen',\n description: 'Boolean logic for disabled state',\n evaluate: (props) => {\n return evaluateBoolLogic(props.boolLogic, props.state)\n },\n}\n","/**\n * Template string interpolation utilities\n *\n * Core utility for interpolating state values into template strings.\n * Used by concerns and side effects for dynamic text generation.\n */\n\nimport { dot } from './dot'\nimport { is } from './is'\n\n/**\n * Extract all {{path}} placeholders from a template string\n *\n * @param template The template string with {{path}} placeholders\n * @returns Array of path strings found in the template\n *\n * @example\n * extractPlaceholders(\"Hello {{user.name}}, you have {{count}} messages\")\n * // [\"user.name\", \"count\"]\n */\nexport const extractPlaceholders = (template: string): string[] => {\n const regex = /\\{\\{([^}]+)\\}\\}/g\n const matches: string[] = []\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(template)) !== null) {\n if (match[1]) {\n matches.push(match[1])\n }\n }\n\n return matches\n}\n\n/**\n * Interpolate {{path}} placeholders with values from state\n *\n * Replaces {{path.to.value}} with actual values from state.\n * Only replaces if value is a string, number, or boolean.\n * Missing/null/undefined/object values leave the original {{path}} for debugging.\n *\n * @param template The template string with {{path}} placeholders\n * @param state The state object to read values from\n * @returns The interpolated string\n *\n * @example\n * interpolateTemplate(\"Value is {{market.spot}}\", state)\n * // \"Value is 105\"\n *\n * @example\n * interpolateTemplate(\"Hello {{user.name}}, missing: {{invalid.path}}\", state)\n * // \"Hello Alice, missing: {{invalid.path}}\"\n */\nexport const interpolateTemplate = <STATE extends object>(\n template: string,\n state: STATE,\n): string => {\n return template.replace(/\\{\\{([^}]+)\\}\\}/g, (match, path) => {\n const value = dot.get__unsafe(state, path)\n\n // Only interpolate serializable primitives\n if (is.string(value)) return value\n if (is.number(value)) return String(value)\n if (is.boolean(value)) return String(value)\n\n // Leave original {{path}} for debugging (null, undefined, objects, arrays)\n return match\n })\n}\n","/**\n * Dynamic label template concern\n *\n * Interpolates a template string with values from state.\n * Automatically tracks all state paths referenced in the template.\n *\n * Returns the interpolated string.\n *\n * @example\n * ```typescript\n * store.useConcerns('my-concerns', {\n * 'priceField': {\n * dynamicLabel: { template: \"Price: ${{product.price}}\" }\n * }\n * })\n * // Result: \"Price: $99.99\"\n * ```\n */\n\nimport { interpolateTemplate } from '../../utils/interpolation'\nimport type { ConcernType } from '../types'\n\nexport const dynamicLabel: ConcernType<\n 'dynamicLabel',\n { template: string },\n string\n> = {\n name: 'dynamicLabel',\n description: 'Template string interpolation for labels',\n evaluate: (props) => {\n return interpolateTemplate(props.template, props.state)\n },\n}\n","/**\n * Dynamic placeholder template concern\n *\n * Interpolates a template string with values from state.\n * Automatically tracks all state paths referenced in the template.\n *\n * Returns the interpolated string.\n *\n * @example\n * ```typescript\n * store.useConcerns('my-concerns', {\n * 'inputField': {\n * dynamicPlaceholder: { template: \"Enter {{field.name}}\" }\n * }\n * })\n * // Result: \"Enter email address\"\n * ```\n */\n\nimport { interpolateTemplate } from '../../utils/interpolation'\nimport type { ConcernType } from '../types'\n\nexport const dynamicPlaceholder: ConcernType<\n 'dynamicPlaceholder',\n { template: string },\n string\n> = {\n name: 'dynamicPlaceholder',\n description: 'Template string interpolation for placeholders',\n evaluate: (props) => {\n return interpolateTemplate(props.template, props.state)\n },\n}\n","/**\n * Dynamic tooltip template concern\n *\n * Interpolates a template string with values from state.\n * Automatically tracks all state paths referenced in the template.\n *\n * Returns the interpolated string.\n *\n * @example\n * ```typescript\n * store.useConcerns('my-concerns', {\n * 'strikePrice': {\n * dynamicTooltip: { template: \"Strike at {{market.spot}}\" }\n * }\n * })\n * // Result: \"Strike at 105\"\n * ```\n */\n\nimport { interpolateTemplate } from '../../utils/interpolation'\nimport type { ConcernType } from '../types'\n\nexport const dynamicTooltip: ConcernType<\n 'dynamicTooltip',\n { template: string },\n string\n> = {\n name: 'dynamicTooltip',\n description: 'Template string interpolation for tooltips',\n evaluate: (props) => {\n return interpolateTemplate(props.template, props.state)\n },\n}\n","/**\n * Read-only condition concern\n *\n * Evaluates a boolean logic expression to determine if a field should be read-only.\n * Automatically tracks all state paths accessed in the condition.\n *\n * Returns true if read-only, false if editable.\n *\n * @example\n * ```typescript\n * store.useConcerns('my-concerns', {\n * 'productId': {\n * readonlyWhen: { boolLogic: { IS_EQUAL: ['order.status', 'completed'] } }\n * }\n * })\n * // Returns: true if order status is 'completed', false otherwise\n * ```\n */\n\nimport { evaluateBoolLogic } from '../../utils/bool-logic'\nimport type { BoolLogic, ConcernType } from '../types'\n\nexport const readonlyWhen: ConcernType<\n 'readonlyWhen',\n { boolLogic: BoolLogic<any> },\n boolean\n> = {\n name: 'readonlyWhen',\n description: 'Boolean logic for readonly state',\n evaluate: (props) => {\n return evaluateBoolLogic(props.boolLogic, props.state)\n },\n}\n","import type { DeepKey } from '../../types'\nimport type { ValidationStateInput } from '../../types/concerns'\nimport { dot } from '../../utils/dot'\nimport type { BaseConcernProps } from '../types'\n\nexport type { ValidationStateInput }\n\nexport interface ValidationError {\n field?: string\n message: string\n}\n\nexport interface ValidationStateResult {\n isError: boolean\n errors: ValidationError[]\n}\n\nexport interface ValidationStateConcern {\n name: 'validationState'\n description: string\n evaluate: <SUB_STATE, PATH extends DeepKey<SUB_STATE>>(\n props: BaseConcernProps<SUB_STATE, PATH> &\n ValidationStateInput<SUB_STATE, PATH>,\n ) => ValidationStateResult\n}\n\nexport const validationState: ValidationStateConcern = {\n name: 'validationState',\n description: 'Schema validation with isError flag and detailed errors',\n evaluate: <SUB_STATE, PATH extends DeepKey<SUB_STATE>>(\n props: BaseConcernProps<SUB_STATE, PATH> &\n ValidationStateInput<SUB_STATE, PATH>,\n ): ValidationStateResult => {\n // If scope is provided, validate at scope path; otherwise validate at registration path\n // Note: props.scope is a runtime string path, use dot.get__unsafe for dynamic access\n const valueToValidate =\n 'scope' in props && props.scope\n ? dot.get__unsafe(props.state, props.scope)\n : props.value\n\n // Run schema validation\n const result = props.schema.safeParse(valueToValidate)\n\n // Success: return valid state\n if (result.success) {\n return {\n isError: false,\n errors: [],\n }\n }\n\n // Failure: transform schema errors to ValidationError format\n const errors: ValidationError[] = result.error.errors.map((err) => ({\n field: err.path.length > 0 ? err.path.join('.') : '.',\n message: err.message,\n }))\n\n return {\n isError: true,\n errors,\n }\n },\n}\n","/**\n * Visibility condition concern\n *\n * Evaluates a boolean logic expression to determine if a field should be visible.\n * Automatically tracks all state paths accessed in the condition.\n *\n * Returns true if visible, false if hidden.\n *\n * @example\n * ```typescript\n * store.useConcerns('my-concerns', {\n * 'advancedOptions': {\n * visibleWhen: { boolLogic: { IS_EQUAL: ['settings.mode', 'advanced'] } }\n * }\n * })\n * // Returns: true if settings.mode is 'advanced', false otherwise\n * ```\n */\n\nimport { evaluateBoolLogic } from '../../utils/bool-logic'\nimport type { BoolLogic, ConcernType } from '../types'\n\nexport const visibleWhen: ConcernType<\n 'visibleWhen',\n { boolLogic: BoolLogic<any> },\n boolean\n> = {\n name: 'visibleWhen',\n description: 'Boolean logic for visibility',\n evaluate: (props) => {\n return evaluateBoolLogic(props.boolLogic, props.state)\n },\n}\n","/**\n * Concern registry utilities\n *\n * Utilities for looking up and managing concerns.\n */\n\nimport { prebuilts } from './prebuilts'\nimport type { ConcernType } from './types'\n\n/**\n * Concern lookup by name\n *\n * @param name The concern name to look up\n * @param concerns Optional array of concerns to search (defaults to prebuilts)\n * @returns The concern definition, or undefined if not found\n */\nexport const findConcern = (\n name: string,\n concerns: readonly any[] = prebuilts,\n): ConcernType | undefined => {\n return concerns.find((c) => c.name === name) as ConcernType | undefined\n}\n\n/**\n * Default concerns provided by apex-state\n */\nexport const defaultConcerns = prebuilts\n","/**\n * Store React Context and Hook\n *\n * Core primitives for providing and accessing the store instance.\n * This module has minimal dependencies to avoid circular imports.\n */\n\nimport { createContext, useContext } from 'react'\n\nimport type { StoreInstance } from './types'\n\n/**\n * React Context for the store instance\n * Null by default - will be populated by Provider\n */\nexport const StoreContext = createContext<StoreInstance<any> | null>(null)\n\nStoreContext.displayName = 'StoreContext'\n\n/**\n * Access the store instance from context.\n *\n * @internal Package-internal. Do not use directly.\n * @throws Error if used outside Provider\n */\nexport const useStoreContext = <DATA extends object>(): StoreInstance<DATA> => {\n const store = useContext(StoreContext) as StoreInstance<DATA> | null\n\n if (!store) {\n throw new Error(\n 'useStoreContext must be used within a Store Provider. ' +\n 'Make sure your component is wrapped in <store.Provider>.',\n )\n }\n\n return store\n}\n","/**\n * WASM Pipeline - processChanges implementation\n *\n * Routes changes through WASM for aggregation, sync, flip, and BoolLogic.\n * Listener dispatch uses WASM-created dispatch plans with JS handler execution.\n *\n * Data model: `Change` is normalized once at entry and carried through every stage.\n * Meta stays attached to each record. State vs concern partitioning uses the\n * `_concerns.` path prefix directly at apply time.\n */\n\nimport { snapshot } from 'valtio'\n\nimport type {\n ConcernValues,\n DebugTrackEntry,\n ListenerHandlerRef,\n StoreInstance,\n} from '../core/types'\nimport { type ArrayOfChanges, type GenericMeta } from '../types'\nimport { dot } from '../utils/dot'\nimport type { ListenerDispatchTrace, UnifiedPipelineTrace } from '../utils/log'\nimport type { Change, Wasm, WasmPipeline } from '../wasm/bridge'\nimport { applyBatch } from './apply-batch'\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst CONCERNS_PREFIX = '_concerns.'\nconst CONCERNS_PREFIX_LEN = CONCERNS_PREFIX.length\n\n// ---------------------------------------------------------------------------\n// Normalization — single entry point, one shape for the entire pipeline\n// ---------------------------------------------------------------------------\n\n/** Normalize input tuples into Change[] once at entry. */\nconst normalizeInputChanges = <DATA extends object, META extends GenericMeta>(\n input: ArrayOfChanges<DATA, META>,\n): Change[] =>\n input.map(([path, value, meta]) => ({\n path: path as string,\n value,\n meta: meta ?? {},\n }))\n\n/** Normalize a WASM Change[] back to Change[], resolving meta. */\nconst normalizeWasmChanges = (wasmChanges: Change[]): Change[] =>\n wasmChanges.map(({ path, value, meta }) => ({ path, value, meta }))\n\n/** Normalize raw listener output tuples `[path, value, meta?][]` to Change[]. */\nconst normalizeListenerOutput = (\n raw: [string, unknown, GenericMeta?][],\n): Change[] =>\n raw.map(([path, value, meta]) => ({ path, value, meta: meta ?? {} }))\n\n// ---------------------------------------------------------------------------\n// Path helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Relativize a change path against a topic path, matching legacy filterAndRelativize:\n * - Root topic (empty): path passes through as-is\n * - Exact match: keep full path (legacy line 68-70)\n * - Child match: strip topic prefix (legacy line 71-72)\n */\nconst relativizePath = (changePath: string, topicPath: string): string => {\n if (topicPath === '') return changePath\n if (changePath === topicPath) return changePath\n const prefix = topicPath + '.'\n if (changePath.startsWith(prefix)) return changePath.slice(prefix.length)\n return changePath\n}\n\n/**\n * Remap a path with prefix for propagation to parent dispatches.\n */\nconst remapPath = (path: string, remapPrefix: string | null): string => {\n if (!remapPrefix) return path\n return path === '' ? remapPrefix : `${remapPrefix}.${path}`\n}\n\n/**\n * Check if a change path matches a dispatch's topic path.\n * Mirrors the WASM matching logic in router.rs `create_full_execution_plan`:\n * - Root topic (empty): matches everything\n * - Exact match: change.path === topicPath\n * - Child: change.path starts with topicPath + \".\"\n * - Parent: topicPath starts with change.path + \".\"\n */\nconst changeMatchesTopic = (changePath: string, topicPath: string): boolean => {\n if (topicPath === '') return true\n if (changePath === topicPath) return true\n if (changePath.startsWith(topicPath) && changePath[topicPath.length] === '.')\n return true\n if (topicPath.startsWith(changePath) && topicPath[changePath.length] === '.')\n return true\n return false\n}\n\n// ---------------------------------------------------------------------------\n// Dispatch helpers\n// ---------------------------------------------------------------------------\n\n/** Append changes to the extra map for a given dispatch ID (get-or-create). */\nconst appendExtra = (\n extra: Map<number, Change[]>,\n targetId: number,\n changes: Change[],\n): void => {\n const existing = extra.get(targetId) ?? []\n extra.set(targetId, existing)\n existing.push(...changes)\n}\n\n/** Build the input tuple array for a single listener invocation. */\nconst buildDispatchInput = (\n d: Wasm.FullExecutionPlan['groups'][number]['dispatches'][number],\n listenerChanges: Change[],\n extra: Map<number, Change[]>,\n): [string, unknown, GenericMeta][] => {\n const topicPath = d.topic_path\n const input: [string, unknown, GenericMeta][] = []\n\n for (const id of d.input_change_ids) {\n const change = listenerChanges[id]\n if (change !== undefined) {\n input.push([\n relativizePath(change.path, topicPath),\n structuredClone(change.value),\n change.meta,\n ])\n }\n }\n\n const extraChanges = extra.get(d.dispatch_id)\n if (extraChanges) {\n for (const c of extraChanges) {\n // Filter cascaded changes by topic match — only include changes relevant to this dispatch\n if (!changeMatchesTopic(c.path, topicPath)) continue\n input.push([\n relativizePath(c.path, topicPath),\n structuredClone(c.value),\n c.meta,\n ])\n }\n }\n\n return input\n}\n\n/**\n * Route produced changes via WASM-precomputed maps.\n * Cross-depth: propagation_map remaps paths to parent scope.\n * Same-depth: cascade_map forwards changes to subsequent siblings.\n */\nconst routeProducedChanges = (\n dispatchId: number,\n producedChanges: Change[],\n plan: Wasm.FullExecutionPlan,\n extra: Map<number, Change[]>,\n): void => {\n // Cross-depth: propagate to parent dispatches via pre-computed propagation map\n const targets = plan.propagation_map[dispatchId]\n if (targets) {\n for (const t of targets) {\n const remapped = producedChanges.map((c) => ({\n ...c,\n path: remapPath(c.path, t.remap_prefix),\n }))\n appendExtra(extra, t.target_dispatch_id, remapped)\n }\n }\n\n // Same-depth: cascade to subsequent dispatches via pre-computed cascade map\n const cascadeTargets = plan.cascade_map[dispatchId]\n if (cascadeTargets) {\n for (const targetId of cascadeTargets) {\n appendExtra(extra, targetId, producedChanges)\n }\n }\n}\n\n/** Invoke a single listener handler and record the trace entry. */\nconst invokeHandler = (\n d: Wasm.FullExecutionPlan['groups'][number]['dispatches'][number],\n registration: ListenerHandlerRef,\n input: [string, unknown, GenericMeta][],\n scopedState: unknown,\n timingEnabled: boolean,\n timingThreshold: number,\n listenerLog: ListenerDispatchTrace[],\n): Change[] => {\n const t0 = timingEnabled ? performance.now() : 0\n const result = registration.fn(input, scopedState)\n const durationMs = timingEnabled ? performance.now() - t0 : 0\n const slow = timingEnabled && durationMs > timingThreshold\n\n if (slow) {\n console.warn(\n `[apex-state] Slow listener: ${registration.name || '(anonymous)'} took ${durationMs.toFixed(2)}ms (threshold: ${timingThreshold}ms)`,\n )\n }\n\n const producedChanges =\n result && (result as unknown[]).length > 0\n ? normalizeListenerOutput(\n result as [string, unknown, GenericMeta?][],\n ).map((c) => ({\n ...c,\n meta: {\n ...c.meta,\n // Only set sender if not already defined by listener\n ...(c.meta?.sender ? {} : { sender: registration.name }),\n },\n }))\n : []\n\n listenerLog.push({\n dispatchId: d.dispatch_id,\n subscriberId: d.subscriber_id,\n fnName: registration.name,\n scope: (registration.scope ?? '') || '(root)',\n topic: d.topic_path,\n registrationId: registration.registrationId,\n input: input as [string, unknown, unknown][],\n output: producedChanges,\n currentState: scopedState,\n durationMs,\n slow,\n })\n\n return producedChanges\n}\n\n/**\n * Execute a pre-computed execution plan.\n * Both routing paths (cross-depth propagation + same-depth cascading) are\n * symmetric WASM-precomputed map lookups — TS just iterates and calls handlers.\n */\nconst executeFullExecutionPlan = <DATA extends object>(\n plan: Wasm.FullExecutionPlan | null,\n listenerChanges: Change[],\n store: StoreInstance<DATA>,\n): { produced: Change[]; listenerLog: ListenerDispatchTrace[] } => {\n if (!plan || plan.groups.length === 0) {\n return { produced: [], listenerLog: [] }\n }\n\n const allProducedChanges: Change[] = []\n const listenerLog: ListenerDispatchTrace[] = []\n const extra = new Map<number, Change[]>()\n\n const { listenerHandlers } = store._internal.registrations\n // Single snapshot of the full state — then slice scoped subtrees from it.\n // snapshot() returns a plain frozen object, so dot.get__unsafe is just\n // regular property access with zero proxy overhead.\n const currentState = snapshot(store.state) as DATA\n const timingEnabled = store._internal.config.debug.timing ?? false\n const timingThreshold = store._internal.config.debug.timingThreshold ?? 5\n\n for (const group of plan.groups) {\n for (const d of group.dispatches) {\n const registration = listenerHandlers.get(d.subscriber_id)\n if (!registration) continue\n\n const scope = registration.scope ?? ''\n const scopedState =\n scope === '' ? currentState : dot.get__unsafe(currentState, scope)\n\n const input = buildDispatchInput(d, listenerChanges, extra)\n const producedChanges = invokeHandler(\n d,\n registration,\n input,\n scopedState,\n timingEnabled,\n timingThreshold,\n listenerLog,\n )\n\n if (producedChanges.length === 0) continue\n\n allProducedChanges.push(...producedChanges)\n routeProducedChanges(d.dispatch_id, producedChanges, plan, extra)\n }\n }\n\n return { produced: allProducedChanges, listenerLog }\n}\n\n/**\n * Apply concern changes to store._concerns.\n *\n * STRUCTURE: _concerns uses a two-level map for efficient lookups:\n * ```typescript\n * _concerns[\"user.email\"][\"validationState\"] = { isError: false, ... }\n * _concerns[\"user.email\"][\"disabledWhen\"] = true\n * ```\n *\n * WHY TWO LEVELS:\n * - First level: full path to the field (e.g., \"user.email\")\n * - Second level: concern name (e.g., \"validationState\", \"disabledWhen\")\n * - This allows getting all concerns for a path: `_concerns[\"user.email\"]`\n * - React hooks can efficiently subscribe to specific path+concern combinations\n *\n * INPUT FORMAT: Paths come from WASM as \"basePath.concernName\" (no _concerns. prefix after partition)\n * - Example: \"user.email.validationState\" → _concerns[\"user.email\"][\"validationState\"]\n * - We split on the LAST dot to separate basePath from concernName\n *\n * @param changes - Change[] with paths stripped of _concerns. prefix\n * @param concerns - The store._concerns proxy to apply changes to\n */\nconst applyConcernChanges = (\n changes: Change[],\n concerns: ConcernValues,\n): void => {\n for (const c of changes) {\n const lastDot = c.path.lastIndexOf('.')\n const basePath = c.path.slice(0, lastDot)\n const concernName = c.path.slice(lastDot + 1)\n\n if (!concerns[basePath]) {\n concerns[basePath] = {}\n }\n concerns[basePath]![concernName] = c.value\n }\n}\n\n/**\n * Execute schema validators and return Change[].\n * Takes validators_to_run from WASM, returns concern changes with _concerns. prefix.\n */\nconst runValidators = (\n validatorsToRun: Wasm.ValidatorDispatch[],\n pipeline: WasmPipeline,\n): Change[] => {\n const results: Change[] = []\n\n for (const validator of validatorsToRun) {\n const schema = pipeline.validatorSchemas.get(validator.validator_id)\n if (!schema) continue\n\n // Parse dependency values from JSON strings\n // dependency_values can be either a Map or a plain object from WASM\n // @FIXME: This should not be neccessary\n const entries =\n validator.dependency_values instanceof Map\n ? Array.from(validator.dependency_values.entries())\n : Object.entries(validator.dependency_values)\n\n const values = Object.fromEntries(\n entries.map(([k, v]) => [k, JSON.parse(v as string) as unknown]),\n )\n\n // For single-field validators, validate the primary value\n const primaryValue = Object.values(values)[0]\n const parseResult = schema.safeParse(primaryValue)\n\n const validationValue = {\n isError: !parseResult.success,\n errors: parseResult.success\n ? []\n : parseResult.error.errors.map((e) => ({\n field: e.path.length > 0 ? e.path.join('.') : '.',\n message: e.message,\n })),\n }\n\n results.push({\n path: validator.output_path, // Already has _concerns. prefix\n value: validationValue,\n meta: {},\n })\n }\n\n return results\n}\n\n// ---------------------------------------------------------------------------\n// Apply helpers\n// ---------------------------------------------------------------------------\n\n/** Strip _concerns. prefix from a concern path for applyConcernChanges. */\nconst stripConcernPrefix = (c: Change): Change => ({\n ...c,\n path: c.path.slice(CONCERNS_PREFIX_LEN),\n})\n\n// ---------------------------------------------------------------------------\n// Record applied changes for debug tracking\n// ---------------------------------------------------------------------------\n\nconst pushDebugChanges = (\n target: { path: string; value: unknown }[],\n changes: Change[],\n): void => {\n for (const c of changes) {\n target.push({ path: c.path, value: c.value })\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main WASM pipeline implementation\n// ---------------------------------------------------------------------------\n\nexport const processChangesWasm = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n>(\n store: StoreInstance<DATA>,\n initialChanges: ArrayOfChanges<DATA, META>,\n): void => {\n const pipeline = store._internal.pipeline\n const { logger } = store._internal\n const timingEnabled = store._internal.config.debug.timing ?? false\n\n // Guard: pipeline is null during React StrictMode's simulated unmount/remount gap\n // (dev-only). The first mount executed correctly; the second invocation is idempotent\n // by design, so dropping writes here is correct. Also handles stale post-unmount calls.\n //\n // In production this path is unreachable — Guards 1 & 2 in provider.tsx ensure the\n // pipeline is always initialized before any setValue can fire. The dev warning below\n // catches regressions where pipeline is null for reasons other than StrictMode.\n if (!pipeline) {\n console.warn(\n '[apex-state] processChanges called with no active pipeline. ' +\n 'Expected during React StrictMode effect re-mount — ' +\n 'if you see this outside StrictMode, it indicates a bug.',\n )\n return\n }\n\n // Normalize once at entry — Change[] is the single shape for the entire pipeline\n const pipelineChanges = normalizeInputChanges(initialChanges)\n\n // Initialize debug entry if tracking is enabled\n const trackEntry: DebugTrackEntry | null = store._debug\n ? {\n input: initialChanges.map(([p, v, m]) => [p as string, v, m]),\n applied: [],\n appliedConcerns: [],\n timestamp: Date.now(),\n }\n : null\n\n const t0 = performance.now()\n\n const { listener_changes, execution_plan, validators_to_run, has_work } =\n pipeline.processChanges(pipelineChanges)\n\n // Early exit if WASM signals no work to do\n if (!has_work) {\n if (trackEntry) store._debug!.calls.push(trackEntry)\n return\n }\n\n // meta_json was serialized onto each change before crossing the WASM boundary —\n // normalizeWasmChanges parses it back so meta flows through unchanged.\n const listenerChanges = normalizeWasmChanges(listener_changes)\n\n const { produced, listenerLog } = executeFullExecutionPlan(\n execution_plan,\n listenerChanges,\n store,\n )\n\n // Execute validators (JS-only: schema validation)\n // @FIXME: These should run on-top of listener's provided changes. they need fresh state for validating.\n const validationResults = runValidators(validators_to_run, pipeline)\n\n // Single flat array: listener output + validator output\n const jsChanges = produced.concat(validationResults)\n const { state_changes: stateChangesFinal, trace: wasmTrace } =\n pipeline.pipelineFinalize(jsChanges)\n\n // Re-normalize finalized changes back to Change[] (WASM may have merged/reordered)\n const finalChanges = normalizeWasmChanges(stateChangesFinal)\n\n // Partition by path prefix and apply\n const stateChanges = finalChanges.filter(\n (c) => !c.path.startsWith(CONCERNS_PREFIX),\n )\n const concernChanges = finalChanges\n .filter((c) => c.path.startsWith(CONCERNS_PREFIX))\n .map(stripConcernPrefix)\n\n if (stateChanges.length > 0) {\n applyBatch(\n stateChanges.map(({ path, value, meta }) => [\n path,\n value,\n meta,\n ]) as ArrayOfChanges<DATA, META>,\n store.state,\n )\n }\n if (concernChanges.length > 0) {\n applyConcernChanges(concernChanges, store._concerns)\n }\n\n const durationMs = performance.now() - t0\n\n // Build unified trace (composes WASM trace + JS listener dispatches + wall-clock timing)\n const allDispatches =\n execution_plan?.groups.flatMap((g) => g.dispatches) ?? []\n const unifiedTrace: UnifiedPipelineTrace | null = wasmTrace\n ? {\n wasm: wasmTrace,\n listeners: listenerLog.map((entry, i) => ({\n dispatchId: allDispatches[i]?.dispatch_id ?? i,\n subscriberId: entry.subscriberId,\n fnName: entry.fnName,\n scope: entry.scope,\n topic: allDispatches[i]?.topic_path ?? '',\n registrationId:\n store._internal.registrations.listenerHandlers.get(\n entry.subscriberId,\n )?.registrationId ?? '',\n input: entry.input,\n output: entry.output,\n currentState: entry.currentState,\n durationMs: entry.durationMs,\n slow: entry.slow,\n })),\n totalDurationMs: durationMs,\n wasmDurationMs: wasmTrace.total_duration_us / 1000,\n listenerDurationMs: listenerLog.reduce(\n (sum, e) => sum + e.durationMs,\n 0,\n ),\n listenerTimingEnabled: timingEnabled,\n }\n : null\n\n // Single log call with all pipeline data (no-op when log/devtools is disabled)\n const allApplied = [...stateChanges, ...concernChanges]\n const logData = {\n initialChanges: pipelineChanges,\n trace: unifiedTrace,\n appliedChanges: allApplied,\n /** Pre-finalize changes (listener + validator output before WASM merge/dedup). */\n preFinalizableChanges: jsChanges,\n stateSnapshot: snapshot(store.state),\n }\n logger.logPipeline(logData)\n store._internal.devtools?.notifyPipeline(logData)\n\n // Record applied changes for debug tracking\n if (trackEntry) {\n pushDebugChanges(trackEntry.applied, stateChanges)\n pushDebugChanges(trackEntry.appliedConcerns, concernChanges)\n store._debug!.calls.push(trackEntry)\n }\n}\n","/**\n * Batch Application\n *\n * Applies a batch of changes to state, checking for actual value differences.\n */\n\nimport type { ArrayOfChanges, GenericMeta } from '../types'\nimport { dot } from '../utils/dot'\n\nexport const applyBatch = <DATA extends object, META extends GenericMeta>(\n changes: ArrayOfChanges<DATA, META>,\n state: DATA,\n): void => {\n for (const [path, value] of changes) {\n dot.set__unsafe(state, path, value)\n }\n}\n","/**\n * WASM Implementation - Side Effects Registration\n *\n * Consolidates all side effects (sync, flip, aggregation, listeners) into a single\n * WASM call for efficiency. No legacy fallback logic - assumes WASM is loaded.\n */\n\nimport { snapshot } from 'valtio'\n\nimport type { MultiPathListener, StoreInstance } from '../core/types'\nimport { applyBatch } from '../pipeline/apply-batch'\nimport type { GenericMeta } from '../types'\nimport { changes } from '../types/changes'\nimport { pairs } from '../types/pairs'\nimport type { SideEffects } from '../types/side-effects'\n\n/** Auto-incrementing subscriber ID counter for O(1) handler lookup. */\nlet nextSubscriberId = 0\n\n/** Reset the subscriber ID counter (testing only). */\nexport const resetSubscriberIdCounter = (): void => {\n nextSubscriberId = 0\n}\n\nexport const registerSideEffects = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n>(\n store: StoreInstance<DATA>,\n id: string,\n effects: SideEffects<DATA, META>,\n): (() => void) => {\n const t0 = performance.now()\n\n // Build consolidated side effects registration\n const { bidirectional: syncPairs, directed: directedSyncPairs } =\n pairs.syncToWasm(effects.syncPaths ?? [])\n\n const flipPairs = effects.flipPaths ?? []\n const aggregationPairs = pairs.aggregationToWasm(effects.aggregations ?? [])\n\n // Serialize computations: [op, target, source, condition?] → WASM format\n const computationPairs = pairs.computationToWasm(effects.computations ?? [])\n\n // Transform clearPaths: public API format → WASM format\n // When expandMatch: true, rewrite [*] → [**] in target paths\n const clearPaths = effects.clearPaths?.map(([triggers, targets, opts]) => ({\n triggers: triggers,\n targets: opts?.expandMatch\n ? targets.map((t) => t.replace(/\\[\\*\\]/g, '[**]'))\n : targets,\n }))\n\n // Type guard to distinguish MultiPathListener from SinglePathListener\n const isMultiPath = (\n listener: unknown,\n ): listener is MultiPathListener<DATA, META> =>\n Array.isArray((listener as { path: unknown }).path)\n\n // Build listeners array\n const listeners = effects.listeners?.map((listener) => {\n const { listenerHandlers } = store._internal.registrations\n\n // Assign unique subscriber_id for O(1) handler lookup\n const subscriberId = nextSubscriberId++\n\n const originalFn = listener.fn\n\n // Discriminated union: TypeScript narrows the type based on path structure.\n // Cast: DeepKey values are always strings at runtime. TypeScript can't simplify\n // DeepKey<DATA,20> | DeepKey<DATA,20>[] to string[] without the cast.\n const topicPaths = (\n isMultiPath(listener) ? listener.path : [listener.path ?? '']\n ) as string[]\n\n // For single-path: scope defaults to path when NOT explicitly set (undefined).\n // null is an explicit \"no scope\" value → full state is passed to the handler.\n // For multi-path: scope must be explicitly set (required in type).\n // Cast: isMultiPath is false in the else branch, so path is never an array at runtime.\n // TypeScript can't narrow SinglePathListener.path to exclude DeepKey[] here.\n const effectiveScope = (\n isMultiPath(listener)\n ? listener.scope\n : listener.scope === undefined\n ? listener.path\n : listener.scope\n ) as string | null\n\n // Store in handler map for execution\n listenerHandlers.set(subscriberId, {\n scope: effectiveScope,\n fn: originalFn,\n name: originalFn.name || '(anonymous)',\n registrationId: `sideEffects-${id}`,\n })\n\n return {\n subscriber_id: subscriberId,\n topic_paths: topicPaths,\n scope_path: effectiveScope ?? '',\n }\n })\n\n // Single consolidated WASM call with all side effects\n const pipeline = store._internal.pipeline!\n const registrationId = `sideEffects-${id}`\n const registration = {\n registration_id: registrationId,\n sync_pairs: syncPairs,\n directed_sync_pairs: directedSyncPairs,\n flip_pairs: flipPairs,\n aggregation_pairs: aggregationPairs,\n computation_pairs: computationPairs,\n clear_paths: clearPaths ?? [],\n listeners: listeners ?? [],\n anchor_path: effects.anchorPath as string,\n }\n\n const result = pipeline.registerSideEffects(registration)\n\n // Apply sync changes directly to valtio state.\n // IMPORTANT: Do NOT route through processChanges() here — it would diff against shadow,\n // see \"no change\" (shadow was already updated by register_sync_batch), return\n // has_work=false, and skip writing to valtio.\n //\n // Instead: register_sync_batch returns ALL initial sync changes (not just the\n // shadow-diffed subset), and applyBatch's own `current !== value` guard handles\n // valtio-level idempotency. This covers two divergence scenarios:\n // - Direct proxy mutations (bypassing processChanges) leave shadow ahead of valtio\n // - Navigation remount with preserved pipeline reuses stale shadow\n // In both cases, applyBatch correctly writes the synced value to valtio even\n // when shadow already has it.\n const appliedChanges = [\n ...result.sync_changes,\n ...result.aggregation_changes,\n ...result.computation_changes,\n ]\n\n // Apply changes to state\n if (appliedChanges.length > 0) {\n applyBatch(changes.fromWasm<DATA>(appliedChanges), store.state)\n }\n\n const durationMs = performance.now() - t0\n\n // Log registration with graph snapshot (no-op when log is disabled)\n const graphSnapshot = pipeline.getGraphSnapshot()\n const listenerNames = new Map<number, string>()\n for (const [subId, ref] of store._internal.registrations.listenerHandlers) {\n listenerNames.set(subId, ref.name)\n }\n store._internal.logger.logRegistration('register', id, graphSnapshot, {\n result,\n appliedChanges,\n stateSnapshot: snapshot(store.state),\n durationMs,\n listenerNames,\n })\n store._internal.devtools?.notifyRegistration('register', id, graphSnapshot)\n\n // Create cleanup function\n const cleanup = () => {\n const ut0 = performance.now()\n pipeline.unregisterSideEffects(registrationId)\n const unregDurationMs = performance.now() - ut0\n const unregSnapshot = pipeline.getGraphSnapshot()\n const unregListenerNames = new Map<number, string>()\n for (const [subId, ref] of store._internal.registrations.listenerHandlers) {\n unregListenerNames.set(subId, ref.name)\n }\n store._internal.logger.logRegistration('unregister', id, unregSnapshot, {\n stateSnapshot: snapshot(store.state),\n durationMs: unregDurationMs,\n listenerNames: unregListenerNames,\n })\n store._internal.devtools?.notifyRegistration(\n 'unregister',\n id,\n unregSnapshot,\n )\n\n // Clean up listener handlers\n effects.listeners?.forEach((_listener, index) => {\n if (listeners && listeners[index]) {\n store._internal.registrations.listenerHandlers.delete(\n listeners[index].subscriber_id,\n )\n }\n })\n\n store._internal.registrations.sideEffectCleanups.delete(id)\n }\n\n // Store cleanup reference\n store._internal.registrations.sideEffectCleanups.set(id, cleanup)\n\n return cleanup\n}\n","/**\n * ArrayOfChanges type\n *\n * Represents an array of changes with paths, values, and metadata.\n * Each change is a tuple of [path, value, metadata].\n *\n * @example\n * ```typescript\n * type User = {\n * name: string\n * age: number\n * }\n *\n * const changes: ArrayOfChanges<User, GenericMeta> = [\n * [\"name\", \"John\", { sender: \"user-123\" }],\n * [\"age\", 30, { isProgramaticChange: true }]\n * ]\n * ```\n */\n\nimport type { Stage } from '../wasm/generated/types'\nimport type { DeepKey } from './deep-key'\nimport type { DeepValue } from './deep-value'\nimport type { GenericMeta } from './meta'\n\nexport type { Stage }\n\n/**\n * Represents an array of change tuples.\n * Each tuple contains:\n * - path: A valid deep key path for the data structure\n * - value: The value at that path (properly typed based on the path)\n * - meta: Metadata about the change\n */\nexport type ArrayOfChanges<DATA, META extends GenericMeta = GenericMeta> = {\n [K in DeepKey<DATA>]: [K, DeepValue<DATA, K>, META] | [K, DeepValue<DATA, K>]\n}[DeepKey<DATA>][]\n\n/** A single state change in internal pipeline form. */\nexport interface Change {\n path: string\n value: unknown\n /** Meta object threaded through the pipeline. Lineage is merged in by the bridge on WASM→JS conversion. */\n meta: GenericMeta\n}\n\n// ---------------------------------------------------------------------------\n// WASM boundary conversion helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a WASM Change array to pipeline change tuples, merging optional meta.\n * Paths from WASM are erased to `string` — the cast is required at the WASM boundary.\n */\nconst fromWasm = <DATA extends object, META extends GenericMeta = GenericMeta>(\n wasmChanges: Change[],\n meta?: META,\n): ArrayOfChanges<DATA, META> =>\n wasmChanges.map((c) => [\n c.path,\n c.value,\n meta ?? ({} as META),\n ]) as unknown as ArrayOfChanges<DATA, META>\n\n/**\n * Convert pipeline change tuples to WASM Change format.\n * Strips meta and casts paths to string — meta is JS-only and never crosses the WASM boundary.\n */\nconst toWasm = <DATA extends object, META extends GenericMeta>(\n tuples: ArrayOfChanges<DATA, META>,\n): Change[] =>\n tuples.map(([path, value]) => ({\n path: path as string,\n value: value as unknown,\n meta: {},\n }))\n\n/** WASM boundary conversion utilities. */\nexport const changes = { fromWasm, toWasm }\n","/**\n * Pair WASM boundary conversion helpers\n *\n * Mirrors the pattern of `changes.ts` — converts typed pair arrays\n * to the flat string-tuple format expected by WASM registration calls.\n *\n * The optional BoolLogic condition (always the last element) is JSON-serialized\n * since WASM receives it as a string for serde deserialization.\n */\n\nimport type {\n AggregationPair,\n ComputationPair,\n SyncPair,\n} from './paths-of-same-value'\nimport type {\n ValidatedAggregationPairs,\n ValidatedComputationPairs,\n ValidatedSyncPairs,\n} from './validated-pairs'\n\n/**\n * Convert aggregation pairs to WASM format.\n * Serializes the optional BoolLogic condition to a JSON string.\n */\nconst aggregationToWasm = <DATA extends object>(\n input: AggregationPair<DATA>[] | ValidatedAggregationPairs<DATA>,\n): ([string, string] | [string, string, string])[] =>\n (input as ([string, string] | [string, string, unknown])[]).map(\n ([target, source, condition]) =>\n condition !== undefined\n ? [target, source, JSON.stringify(condition)]\n : [target, source],\n ) as ([string, string] | [string, string, string])[]\n\n/**\n * Convert computation pairs to WASM format.\n * Serializes the optional BoolLogic condition to a JSON string.\n */\nconst computationToWasm = <DATA extends object>(\n input: ComputationPair<DATA>[] | ValidatedComputationPairs<DATA>,\n): ([string, string, string] | [string, string, string, string])[] =>\n (\n input as ([string, string, string] | [string, string, string, unknown])[]\n ).map(([op, target, source, condition]) =>\n condition !== undefined\n ? [op, target, source, JSON.stringify(condition)]\n : [op, target, source],\n ) as ([string, string, string] | [string, string, string, string])[]\n\n/**\n * Split sync pairs into bidirectional and directed (oneWay) groups for WASM registration.\n * Pairs without `oneWay` go into bidirectional (existing sync graph).\n * Pairs with `oneWay: '[0]->[1]'` → [pair[0], pair[1]] directed edge.\n * Pairs with `oneWay: '[1]->[0]'` → [pair[1], pair[0]] directed edge (reversed).\n */\nconst syncToWasm = <DATA extends object>(\n input: SyncPair<DATA>[] | ValidatedSyncPairs<DATA>,\n): { bidirectional: [string, string][]; directed: [string, string][] } => {\n const bidirectional: [string, string][] = []\n const directed: [string, string][] = []\n for (const pair of input as (\n | [string, string]\n | [string, string, { oneWay: '[0]->[1]' | '[1]->[0]' }]\n )[]) {\n if (pair.length === 3) {\n const dir = pair[2].oneWay\n directed.push(\n dir === '[0]->[1]' ? [pair[0], pair[1]] : [pair[1], pair[0]],\n )\n } else {\n bidirectional.push([pair[0], pair[1]])\n }\n }\n return { bidirectional, directed }\n}\n\n/** WASM boundary conversion utilities for pair arrays. */\nexport const pairs = { aggregationToWasm, computationToWasm, syncToWasm }\n","/**\n * Filters a concerns map to only include entries for the given keys.\n * Paths with no matching keys are omitted entirely.\n */\nexport const filterConcernsByKeys = (\n raw: Record<string, Record<string, unknown>>,\n keys: string[],\n): Record<string, Record<string, unknown>> => {\n const result: Record<string, Record<string, unknown>> = {}\n for (const [path, pathConcerns] of Object.entries(raw)) {\n const filtered: Record<string, unknown> = {}\n for (const key of keys) {\n if (Object.prototype.hasOwnProperty.call(pathConcerns, key)) {\n filtered[key] = pathConcerns[key]\n }\n }\n if (Object.keys(filtered).length > 0) result[path] = filtered\n }\n return result\n}\n","import { useLayoutEffect, useRef } from 'react'\n\nimport { proxy, ref } from 'valtio'\n\nimport { StoreContext } from '../core/context'\nimport { DEFAULT_STORE_CONFIG } from '../core/defaults'\nimport type {\n DebugTrack,\n InternalState,\n ProviderProps,\n StoreConfig,\n StoreInstance,\n} from '../core/types'\nimport type { DeepRequired } from '../types'\nimport { deepClone } from '../utils/deep-clone'\nimport { deepMerge } from '../utils/deep-merge'\nimport {\n attachComputedGetters,\n prepareInitialState,\n} from '../utils/derive-values'\nimport { createLogger } from '../utils/log'\nimport { initPipeline, WasmGate } from '../wasm/lifecycle'\nimport { attachDevtools } from './devtools'\n\nexport const createInternalState = (\n config: DeepRequired<StoreConfig>,\n): InternalState => ({\n registrations: {\n concerns: new Map(),\n effectCleanups: new Set(),\n sideEffectCleanups: new Map(),\n listenerHandlers: new Map(),\n },\n logger: createLogger(config.debug),\n config,\n devtools: null,\n pipeline: null,\n})\n\nexport const createProvider = <DATA extends object>(\n storeConfig?: StoreConfig,\n) => {\n // Resolve config with defaults at factory time\n const resolvedConfig = deepMerge(DEFAULT_STORE_CONFIG, storeConfig)\n\n // Build store instance from raw initialState + resolved config.\n // Pure function — no hooks, no side effects, safe to call during render.\n const buildStore = (rawInitialState: DATA): StoreInstance<DATA> => {\n const prepared = prepareInitialState(deepClone(rawInitialState))\n const internal = createInternalState(resolvedConfig)\n\n // Always create pipeline — WasmGate guarantees WASM is loaded.\n initPipeline(internal, prepared.initialState, {\n debug: resolvedConfig.debug.log ?? false,\n })\n\n const debugTrack: DebugTrack | null = resolvedConfig.debug.track\n ? {\n calls: [],\n clear: () => {\n debugTrack!.calls.length = 0\n },\n }\n : null\n\n const stateProxy = proxy(prepared.initialState)\n attachComputedGetters(stateProxy, prepared.getterMap)\n\n const concernsProxy = proxy({} as Record<string, Record<string, unknown>>)\n\n internal.devtools = attachDevtools(\n resolvedConfig,\n stateProxy,\n concernsProxy,\n )\n\n return {\n // state: Application data (tracked by valtio)\n // User actions WRITE to this, effects READ from this\n state: stateProxy,\n\n // _concerns: Computed concern values (tracked by valtio)\n // Effects WRITE to this, UI components READ from this\n _concerns: concernsProxy,\n\n // _internal: Graphs, registrations, processing (NOT tracked)\n // Wrapped in ref() to prevent tracking even if store is later wrapped in a proxy\n _internal: ref(internal),\n\n // _debug: Tracking data for testing/debugging (only when debug.track enabled)\n _debug: debugTrack ? ref(debugTrack) : null,\n }\n }\n\n // Inner provider: WASM is guaranteed loaded when this renders (WasmGate blocks).\n // useRef runs exactly once — NOT double-invoked by StrictMode, no effects, no cleanup.\n //\n // Pipeline lifecycle: No deferred destroy timer. Benchmarking showed the StrictMode\n // register → unregister → register cycle takes ~1.5ms vs ~2.5ms with full rebuild —\n // negligible difference that doesn't justify the timer complexity. Instead, the pipeline\n // is destroyed immediately on unmount and rebuilt during render if needed.\n const StoreProvider = ({ initialState, children }: ProviderProps<DATA>) => {\n const storeRef = useRef(buildStore(initialState))\n const internal = storeRef.current._internal\n\n // Guard 1 — render phase (actual remount after timer fired).\n // Handles: Provider truly unmounts and remounts (e.g. conditional rendering) after the\n // deferred destroy timer fires and sets pipeline = null.\n // Why here: render is parent-first and runs BEFORE any effects. Children's\n // useLayoutEffects (useSideEffects, useConcerns registration) fire bottom-up AFTER\n // the render phase, so placing init here guarantees the pipeline exists before any\n // child effect runs. Moving this into useLayoutEffect would be too late.\n if (!internal.pipeline) {\n const { initialState: cleanState } = prepareInitialState(\n deepClone(initialState),\n )\n initPipeline(internal, cleanState, {\n debug: resolvedConfig.debug.log ?? false,\n })\n }\n\n // Guard 2 — deferred destroy (React StrictMode).\n // Handles: StrictMode's double-effect cycle (cleanup → re-run) without destroying\n // the pipeline during the gap.\n //\n // Problem: effects fire bottom-up (children before parent). If we destroy in cleanup,\n // children's useSideEffects/useConcerns re-register with null pipeline before the\n // parent's useLayoutEffect body can rebuild it. useInsertionEffect doesn't reliably\n // fire during StrictMode re-run in JSDOM (empirically confirmed).\n //\n // Solution: defer destruction with setTimeout(0). StrictMode re-mounts synchronously\n // cancel the timer before it fires, so the pipeline survives the cycle intact.\n // Actual unmounts let the timer fire and destroy.\n const destroyTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useLayoutEffect(() => {\n // Cancel deferred destruction — we're re-mounting (StrictMode or conditional render)\n if (destroyTimerRef.current !== null) {\n clearTimeout(destroyTimerRef.current)\n destroyTimerRef.current = null\n }\n\n return () => {\n const pipelineToDestroy = internal.pipeline\n const devtoolsToDestroy = internal.devtools\n\n destroyTimerRef.current = setTimeout(() => {\n pipelineToDestroy?.destroy()\n devtoolsToDestroy?.destroy()\n // Only null out if not rebuilt by a remount (Guard 1 creates a new instance)\n if (internal.pipeline === pipelineToDestroy) internal.pipeline = null\n if (internal.devtools === devtoolsToDestroy) internal.devtools = null\n destroyTimerRef.current = null\n }, 0)\n }\n }, [internal])\n\n return (\n <StoreContext.Provider\n value={storeRef.current as unknown as StoreInstance<any>}\n >\n {children}\n </StoreContext.Provider>\n )\n }\n\n StoreProvider.displayName = 'StoreProvider'\n\n // Always wrap with WasmGate — WASM is loaded regardless of mode.\n const Provider = (props: ProviderProps<DATA>) => (\n <WasmGate>\n <StoreProvider {...props} />\n </WasmGate>\n )\n\n Provider.displayName = 'StoreProvider'\n\n return Provider\n}\n","import type { DeepRequired } from '../types'\nimport type { StoreConfig } from './types'\n\nexport const DEFAULT_STORE_CONFIG: DeepRequired<StoreConfig> = {\n name: 'store',\n errorStorePath: '_errors',\n maxIterations: 100,\n debug: {\n log: false,\n timing: false,\n timingThreshold: 5,\n track: false,\n devtools: false,\n },\n}\n","/**\n * Deep clone utility — single swap point for the cloning implementation.\n *\n * Uses @jsbits/deep-clone in \"exact\" mode which preserves:\n * - Getter/setter property descriptors\n * - Property attributes (enumerable, configurable, writable)\n * - Prototypes\n *\n * Swap the implementation here to change cloning behavior everywhere.\n */\n\nimport _deepClone from '@jsbits/deep-clone'\n\n/**\n * Detect circular references in an object graph.\n * Throws a descriptive error if a cycle is found.\n */\nconst assertNoCycles = (value: unknown): void => {\n if (value === null || typeof value !== 'object') return\n\n // Track current ancestor chain only — shared references (diamonds) are fine\n const ancestors = new WeakSet<object>()\n\n const walk = (obj: object, path: string): void => {\n if (ancestors.has(obj)) {\n throw new Error(\n `[deepClone] Circular reference detected at \"${path}\". ` +\n 'State objects must not contain self-references.',\n )\n }\n ancestors.add(obj)\n\n const descriptors = Object.getOwnPropertyDescriptors(obj)\n for (const [key, desc] of Object.entries(descriptors)) {\n // Skip getters — they may have side effects or depend on runtime context\n if (desc.get) continue\n if (desc.value !== null && typeof desc.value === 'object') {\n walk(desc.value as object, path ? `${path}.${key}` : key)\n }\n }\n\n ancestors.delete(obj)\n }\n\n walk(value as object, '')\n}\n\n/**\n * Deep clone an object, preserving getters, setters, and property descriptors.\n * Returns a fully independent copy — mutations to the clone never affect the original.\n *\n * Throws if the input contains circular references.\n */\nexport const deepClone = <T>(value: T): T => {\n assertNoCycles(value)\n return _deepClone(value, true) as T\n}\n","import type { DeepPartial } from '../types'\nimport { is } from './is'\n\n/**\n * Deep merge two objects, with source values overriding target values.\n * Only handles plain objects (not arrays, dates, etc.) - suitable for config merging.\n */\nexport const deepMerge = <T extends object>(\n target: T,\n source?: DeepPartial<T>,\n): T => {\n if (!source) return target\n\n const result = { ...target }\n\n // DeepPartial<T> has the same keys as T when T extends object.\n // Cast to a known-keyed type so TypeScript allows indexing both objects.\n const src = source as { [K in keyof T]?: unknown }\n\n for (const key in src) {\n if (!Object.prototype.hasOwnProperty.call(src, key)) continue\n\n const k = key as Extract<keyof T, string>\n const sourceValue = src[k]\n const targetValue = target[k]\n\n if (is.undefined(sourceValue)) {\n continue\n }\n\n if (is.object(sourceValue) && is.object(targetValue)) {\n result[k] = deepMerge(\n targetValue,\n sourceValue as DeepPartial<typeof targetValue>,\n ) as T[typeof k]\n } else {\n result[k] = sourceValue as T[typeof k]\n }\n }\n\n return result\n}\n","/**\n * Derived value auto-detection\n *\n * Scans an object for getter properties and extracts them for use with\n * valtio's computed() pattern. Provides utilities to extract getters from\n * initial state and re-attach them as selectively-tracked computed proxies.\n */\n\nimport { computed } from 'valtio-reactive'\n\nimport { dot } from './dot'\nimport { is } from './is'\n\nexport type GetterMap = Record<\n string,\n { get: () => unknown; parentPath: string }\n>\n\n/**\n * Detects getter properties in an object (including nested objects)\n * Returns an object mapping property paths to their getter functions\n *\n * @example\n * ```typescript\n * const obj = {\n * firstName: 'John',\n * lastName: 'Doe',\n * get fullName() { return `${this.firstName} ${this.lastName}` }\n * }\n *\n * const getters = detectGetters(obj)\n * // { fullName: (snap) => snap.firstName + ' ' + snap.lastName }\n * ```\n */\nexport const detectGetters = <T extends object>(\n obj: T,\n prefix = '',\n): Record<string, (snap: any) => any> => {\n const getters: Record<string, (snap: any) => any> = {}\n\n // Get own property descriptors to detect getters\n const descriptors = Object.getOwnPropertyDescriptors(obj)\n\n for (const [key, descriptor] of Object.entries(descriptors)) {\n // Skip non-enumerable properties and symbols\n if (!descriptor.enumerable || is.symbol(key)) {\n continue\n }\n\n const fullPath = prefix ? `${prefix}.${key}` : key\n\n // Check if it's a getter\n if (descriptor.get) {\n // Convert getter to a function that works with valtio snapshots\n getters[fullPath] = (snap: any) => {\n // Get the nested object if there's a prefix\n const target = prefix\n ? prefix.split('.').reduce((obj, k) => obj?.[k], snap)\n : snap\n\n // Call the original getter with the appropriate context\n return descriptor.get!.call(target)\n }\n }\n // Recursively check nested objects (but not functions, arrays, or primitives)\n else if (is.object(descriptor.value)) {\n const nestedGetters = detectGetters(descriptor.value, fullPath)\n Object.assign(getters, nestedGetters)\n } else {\n // Primitive values or arrays - no action needed\n }\n }\n\n return getters\n}\n\n/**\n * Extracts getters from an object (including nested) and returns a getter-free base\n * plus a map of dot-path keyed getter definitions for use with computed().\n *\n * @example\n * ```typescript\n * const obj = {\n * a: 1,\n * b: 2,\n * get sum() { return this.a + this.b },\n * nested: {\n * x: 10,\n * get double() { return this.x * 2 }\n * }\n * }\n *\n * const { base, computed } = extractGetters(obj)\n * // base = { a: 1, b: 2, nested: { x: 10 } }\n * // computed = {\n * // sum: { get: [getter fn], parentPath: '' },\n * // 'nested.double': { get: [getter fn], parentPath: 'nested' }\n * // }\n * ```\n */\nexport const extractGetters = <T extends object>(\n obj: T,\n prefix = '',\n): {\n base: Partial<T>\n computed: GetterMap\n} => {\n const base: any = {}\n const computed: GetterMap = {}\n\n const descriptors = Object.getOwnPropertyDescriptors(obj)\n\n for (const [key, descriptor] of Object.entries(descriptors)) {\n if (!descriptor.enumerable || is.symbol(key)) continue\n const fullPath = prefix ? `${prefix}.${key}` : key\n\n if (descriptor.get) {\n // Getter → store original getter fn + the parent path for context binding\n computed[fullPath] = { get: descriptor.get, parentPath: prefix }\n } else if (is.object(descriptor.value)) {\n // Recurse into nested objects\n const nested = extractGetters(descriptor.value, fullPath)\n base[key] = nested.base\n Object.assign(computed, nested.computed)\n } else {\n base[key] = descriptor.value\n }\n }\n\n return { base, computed }\n}\n\n/**\n * Splits raw initial state into a getter-free base (safe for JSON clone) and a getter map.\n * Used by Provider to prepare state before proxy creation.\n */\nexport const prepareInitialState = <T extends object>(\n rawState: T,\n): { initialState: T; getterMap: GetterMap } => {\n const { base, computed: getterMap } = extractGetters(rawState)\n return { initialState: base as T, getterMap }\n}\n\n/**\n * Re-attaches extracted getters onto a valtio proxy as computed() proxies\n * for selective dependency tracking.\n *\n * Three-phase approach:\n * 1. Attach raw getters on stateProxy so inter-getter references (e.g., totalWithTax\n * accessing this.total) work during computed()'s eager evaluation.\n * 2. Create computed() — watch() runs eagerly, reads through the raw getters for tracking.\n * 3. Replace raw getters with computed-backed getters for selective re-evaluation.\n *\n * Cleanup: computed() internally creates watch() subscriptions that have no explicit\n * dispose API. These are cleaned up by GC once the referenced stateProxy is unreachable\n * (e.g., after Provider unmount when nothing holds a reference to the proxy).\n */\nexport const attachComputedGetters = <T extends object>(\n stateProxy: T,\n getterMap: GetterMap,\n): void => {\n if (Object.keys(getterMap).length === 0) return\n\n // Phase 1: Attach raw getters on stateProxy so inter-getter references work\n for (const [dotPath, { get: getterFn, parentPath }] of Object.entries(\n getterMap,\n )) {\n const parts = dotPath.split('.')\n const propName = parts.pop()!\n const parentObj =\n parts.length > 0\n ? (dot.get__unsafe(stateProxy, parts.join('.')) as object)\n : stateProxy\n\n Object.defineProperty(parentObj, propName, {\n get() {\n const ctx = parentPath\n ? dot.get__unsafe(stateProxy, parentPath)\n : stateProxy\n return getterFn.call(ctx)\n },\n enumerable: true,\n configurable: true,\n })\n }\n\n // Phase 2: Create computed() — reads through the raw getters above for tracking\n const computedDefs: Record<string, () => unknown> = {}\n for (const [dotPath, { get: getterFn, parentPath }] of Object.entries(\n getterMap,\n )) {\n computedDefs[dotPath] = () => {\n const parent = parentPath\n ? dot.get__unsafe(stateProxy, parentPath)\n : stateProxy\n return getterFn.call(parent)\n }\n }\n\n const computedProxy = computed(computedDefs)\n\n // Phase 3: Replace raw getters with computed-backed getters for selective re-eval\n for (const dotPath of Object.keys(getterMap)) {\n const parts = dotPath.split('.')\n const propName = parts.pop()!\n const parentObj =\n parts.length > 0\n ? (dot.get__unsafe(stateProxy, parts.join('.')) as object)\n : stateProxy\n\n Object.defineProperty(parentObj, propName, {\n get: () => computedProxy[dotPath as keyof typeof computedProxy],\n enumerable: true,\n configurable: true,\n })\n }\n}\n","/**\n * Apex State Logger — Simplified debug logging with colored console output.\n *\n * Two log functions:\n * 1. logPipeline — called once per processChanges with unified trace\n * 2. logRegistration — called once per register/unregister with graph snapshot\n *\n * Zero runtime cost when log flag is false (returns no-op logger).\n */\n\nimport type { DebugConfig } from '../core/types'\nimport type { Change, SideEffectsResult, Wasm } from '../wasm/bridge'\n\n// ---------------------------------------------------------------------------\n// Unified trace types\n// ---------------------------------------------------------------------------\n\n/** Per-listener dispatch trace (JS-measured). */\nexport interface ListenerDispatchTrace {\n dispatchId: number\n subscriberId: number\n fnName: string\n scope: string\n topic: string\n registrationId: string\n input: [string, unknown, unknown][]\n output: Change[]\n currentState: unknown\n durationMs: number\n slow: boolean\n}\n\n/** Universal trace — single object for console, devtools, any observability tool. */\nexport interface UnifiedPipelineTrace {\n wasm: Wasm.PipelineTrace\n listeners: ListenerDispatchTrace[]\n totalDurationMs: number\n wasmDurationMs: number\n listenerDurationMs: number\n /** True when listener timing was actually measured (debug.timing: true). False → show N/A. */\n listenerTimingEnabled: boolean\n}\n\n// ---------------------------------------------------------------------------\n// Logger types\n// ---------------------------------------------------------------------------\n\nexport interface PipelineLogData {\n initialChanges: Change[]\n trace: UnifiedPipelineTrace | null\n /** Pre-finalize changes: listener output + validator output before WASM merge/dedup. */\n preFinalizableChanges?: Change[]\n /** Final applied changes: after WASM finalization, partitioned to state + concerns. */\n appliedChanges?: Change[]\n /** Frozen valtio snapshot of state after all changes applied. */\n stateSnapshot?: unknown\n}\n\nexport interface RegistrationLogData {\n result?: SideEffectsResult\n appliedChanges?: Change[]\n stateSnapshot?: unknown\n durationMs?: number\n /** subscriber_id → function name, for enriching listener entries in the log. */\n listenerNames?: Map<number, string>\n}\n\nexport interface ApexLogger {\n logPipeline: (data: PipelineLogData) => void\n logRegistration: (\n type: 'register' | 'unregister',\n id: string,\n snapshot: Wasm.GraphSnapshot,\n data?: RegistrationLogData,\n ) => void\n destroy: () => void\n}\n\n// ---------------------------------------------------------------------------\n// No-op singleton (zero overhead when log is false)\n// ---------------------------------------------------------------------------\n\nconst noop = () => {\n // no-op\n}\n\nconst NOOP_LOGGER: ApexLogger = {\n logPipeline: noop,\n logRegistration: noop,\n destroy: noop,\n}\n\n// ---------------------------------------------------------------------------\n// Color scheme\n// ---------------------------------------------------------------------------\n\nconst COLORS = {\n input: '#4A90D9',\n transform: '#7B68EE',\n diff: '#5B9BD5',\n graph: '#50C878',\n logic: '#9370DB',\n listener: '#E67E22',\n slow: '#E74C3C',\n skipped: '#999',\n produced: '#2C3E50',\n timing: '#666',\n label: '#888',\n} as const\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst PREFIX = 'apex-state'\n\n/** Strip valtio Proxy wrappers from a value for safe logging. */\nconst unwrap = (value: unknown): unknown => {\n try {\n return JSON.parse(JSON.stringify(value))\n } catch {\n return value\n }\n}\n\n/** Build a short label from input change paths. */\nconst buildPathLabel = (paths: string[]): string => {\n if (paths.length === 0) return '(empty)'\n if (paths.length <= 3) return paths.join(', ')\n return `${paths[0]} +${String(paths.length - 1)} more`\n}\n\n/** Format ms value with 2 decimals. */\nconst fmtMs = (ms: number): string => `${ms.toFixed(2)}ms`\n\n/** Format listener timing: \"N/A\" when not measured, actual ms otherwise. */\nconst fmtListenerMs = (ms: number, enabled: boolean): string =>\n enabled ? fmtMs(ms) : 'N/A'\n\n// ---------------------------------------------------------------------------\n// Console rendering — single log line per pipeline run\n// ---------------------------------------------------------------------------\n\n/** Build a detail object for expanding inside a single console.log. */\nconst buildDetail = (data: PipelineLogData): Record<string, unknown> => {\n const { trace } = data\n if (!trace) return { inputChanges: data.initialChanges }\n\n const displayStages = trace.wasm.stages.filter((s) => s.stage !== 'input')\n const stages = Object.fromEntries(\n displayStages.map((s, i) => {\n // Filter matched to only show paths that produced downstream changes\n const producedSourcePaths = new Set(\n s.produced\n .map((p) => p.source_path)\n .filter((sp): sp is string => sp != null),\n )\n const usefulMatched = s.matched.filter((m) =>\n producedSourcePaths.has(m[0]),\n )\n\n return [\n `[${String(i).padStart(2, '0')}] ${s.stage}`,\n {\n ms: fmtMs(s.duration_us / 1000),\n // Only show matched if they contributed to produced changes\n ...(usefulMatched.length > 0 ? { matched: usefulMatched } : {}),\n ...(s.produced.length > 0 ? { produced: s.produced } : {}),\n ...(s.skipped.length > 0 ? { skipped: s.skipped } : {}),\n },\n ]\n }),\n )\n\n const listeners =\n trace.listeners.length > 0\n ? Object.fromEntries(\n trace.listeners.map((e, i) => [\n `[${String(i + 1).padStart(2, '0')}] ${e.fnName || '(anonymous)'} scope:${e.scope}${e.registrationId ? ' [reg: ' + e.registrationId + ']' : ''}`,\n {\n ms: fmtListenerMs(e.durationMs, trace.listenerTimingEnabled),\n input: [e.input, unwrap(e.currentState)],\n ...(e.output.length > 0\n ? {\n output: e.output.map((c) => [\n c.path,\n unwrap(c.value),\n ...(c.meta ? [unwrap(c.meta)] : []),\n ]),\n }\n : {}),\n ...(e.slow ? { slow: true } : {}),\n },\n ]),\n )\n : undefined\n\n const anchors =\n trace.wasm.anchor_states && Object.keys(trace.wasm.anchor_states).length > 0\n ? trace.wasm.anchor_states\n : undefined\n\n const preFinalizableChanges = data.preFinalizableChanges ?? []\n const appliedChanges = data.appliedChanges ?? []\n\n // Show pre-finalize if different from post-finalize (indicates merging/dedup)\n const showPreFinalize =\n preFinalizableChanges.length > 0 &&\n preFinalizableChanges.length !== appliedChanges.length\n\n return {\n inputChanges: unwrap(data.initialChanges),\n stages,\n ...(listeners ? { listeners } : {}),\n ...(showPreFinalize\n ? {\n preFinalizableChanges: preFinalizableChanges.map((c) => [\n c.path,\n unwrap(c.value),\n ...(c.meta ? [unwrap(c.meta)] : []),\n ]),\n }\n : {}),\n ...(appliedChanges.length > 0\n ? {\n finalChanges: appliedChanges.map((c) => [\n c.path,\n unwrap(c.value),\n ...(c.meta ? [unwrap(c.meta)] : []),\n ]),\n }\n : {}),\n ...(data.stateSnapshot !== undefined\n ? { finalState: unwrap(data.stateSnapshot) }\n : {}),\n ...(anchors ? { anchors } : {}),\n timing: `wasm: ${fmtMs(trace.wasmDurationMs)} | listeners: ${fmtListenerMs(trace.listenerDurationMs, trace.listenerTimingEnabled)} | total: ${fmtMs(trace.totalDurationMs)}`,\n }\n}\n\n/** Render a unified pipeline trace as a single groupCollapsed with flat console.log lines inside. */\nconst renderTrace = (data: PipelineLogData): void => {\n const pathLabel = buildPathLabel(data.initialChanges.map((c) => c.path))\n const totalMs = data.trace ? fmtMs(data.trace.totalDurationMs) : '0.00ms'\n\n console.groupCollapsed(\n `%c${PREFIX}:pipeline%c | %c${pathLabel}%c ${totalMs}`,\n `color:${COLORS.label};font-weight:bold`,\n 'color:inherit',\n 'color:inherit;font-weight:bold',\n `color:${COLORS.timing}`,\n )\n\n const detail = buildDetail(data)\n const keyColor: Record<string, string> = {\n inputChanges: COLORS.input,\n stages: COLORS.label,\n listeners: COLORS.listener,\n preFinalizableChanges: COLORS.transform,\n finalChanges: COLORS.produced,\n finalState: COLORS.graph,\n anchors: COLORS.logic,\n timing: COLORS.timing,\n }\n for (const [key, value] of Object.entries(detail)) {\n const color = keyColor[key] ?? COLORS.label\n console.log(`%c${key}`, `color:${color};font-weight:bold`, value)\n }\n\n console.groupEnd()\n}\n\n// ---------------------------------------------------------------------------\n// Legacy helpers (kept as @internal exports for backward compatibility in tests)\n// ---------------------------------------------------------------------------\n\n/** Format a change list as { path: value } for compact display. @internal */\nconst formatChanges = (changes: Change[]): Record<string, unknown> | string =>\n changes.length === 0\n ? '(none)'\n : Object.fromEntries(changes.map((c) => [c.path, c.value]))\n\n/** Format initial changes as [path, value] tuples. @internal */\nconst formatInput = (changes: Change[]): [string, unknown][] | string =>\n changes.length === 0 ? '(none)' : changes.map((c) => [c.path, c.value])\n\n/** Build trace summary entries from a pipeline trace, with listeners nested. @internal */\nexport const buildTraceSummary = (\n trace: Wasm.PipelineTrace,\n listeners: ListenerDispatchTrace[] = [],\n): Record<string, unknown> => {\n // Skip 'input' stage — redundant with top-level input field\n const displayStages = trace.stages.filter((s) => s.stage !== 'input')\n if (displayStages.length === 0) return {}\n\n const stages = Object.fromEntries(\n displayStages.map((s, i) => {\n const prefix = `[${String(i).padStart(2, '0')}]`\n const detail: Record<string, unknown> = {\n ...s,\n duration_ms: `${(s.duration_us / 1000).toFixed(2)}ms`,\n }\n // Nest listener runs inside the listeners stage\n if (s.stage === 'listeners' && listeners.length > 0) {\n detail['runs'] = Object.fromEntries(\n listeners.map((entry, li) => {\n const name = entry.fnName || '(anonymous)'\n const dur =\n entry.durationMs > 0 ? ` ${entry.durationMs.toFixed(2)}ms` : ''\n const slow = entry.slow ? ' [SLOW]' : ''\n const key = `[${String(li + 1).padStart(2, '0')}] listener:${String(entry.subscriberId)} ${name}${dur}${slow}`\n return [\n key,\n {\n scope: entry.scope || '(root)',\n input: entry.input,\n output: formatChanges(entry.output),\n },\n ]\n }),\n )\n }\n return [`${prefix} ${s.stage}`, detail]\n }),\n )\n\n return {\n ...(displayStages.length > 0 ? { stages } : {}),\n ...(trace.total_duration_us > 0\n ? { wasmDuration: `${(trace.total_duration_us / 1000).toFixed(2)}ms` }\n : {}),\n }\n}\n\n/** Build console summary object for a pipeline run. @internal */\nexport const buildConsoleSummary = (\n data: PipelineLogData,\n): Record<string, unknown> => ({\n input: formatInput(data.initialChanges ?? []),\n duration: data.trace\n ? `${data.trace.totalDurationMs.toFixed(2)}ms`\n : '0.00ms',\n ...(data.trace?.wasm\n ? buildTraceSummary(data.trace.wasm, data.trace.listeners)\n : {}),\n applied: formatChanges(data.appliedChanges ?? []),\n stateAfterChanges: data.stateSnapshot,\n})\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a logger for the store.\n * Returns no-op when log flag is disabled (zero overhead).\n * Pure console logging only — DevTools is handled separately.\n */\nexport const createLogger = (config: DebugConfig): ApexLogger => {\n const { log = false } = config\n\n if (!log) return NOOP_LOGGER\n\n return {\n logPipeline: (data) => {\n renderTrace(data)\n },\n\n logRegistration: (type, id, graphSnapshot, data) => {\n const action = type === 'register' ? 'add' : 'remove'\n const actionColor = type === 'register' ? COLORS.graph : COLORS.slow\n const timingLabel =\n data?.durationMs != null ? ` ${fmtMs(data.durationMs)}` : ''\n\n console.groupCollapsed(\n `%c${PREFIX}:registration%c | %c${action}%c ${id}%c${timingLabel}`,\n `color:${COLORS.label};font-weight:bold`,\n 'color:inherit',\n `color:${actionColor};font-weight:bold`,\n 'color:inherit;font-weight:bold',\n `color:${COLORS.timing}`,\n )\n\n // Graph snapshot — split into labeled sections\n const gs = graphSnapshot\n // Pairs are shown in internal storage order (not user-input order):\n // bidirectional: canonical ID order (smaller intern ID first)\n // directed: always [source, '→', target] — syncToWasm normalizes to src-first\n const allSyncPairs = [\n ...gs.sync_pairs.map(([a, b]) => [a, '↔', b]),\n ...gs.directed_sync_pairs.map(([src, tgt]) => [src, '→', tgt]),\n ]\n const graphEntries: [string, string, unknown][] = [\n ['syncPairs', COLORS.graph, allSyncPairs],\n ['flipPairs', COLORS.graph, gs.flip_pairs],\n [\n 'listeners',\n COLORS.listener,\n gs.listeners.map((l) => {\n const name = data?.listenerNames?.get(l.id)\n return name ? { ...l, name } : l\n }),\n ],\n ['boolLogics', COLORS.logic, gs.bool_logics],\n ['valueLogics', COLORS.logic, gs.value_logics],\n ['aggregations', COLORS.transform, gs.aggregations],\n ['computations', COLORS.transform, gs.computations],\n ]\n for (const [label, color, value] of graphEntries) {\n const arr = value as unknown[]\n if (arr.length > 0) {\n console.log(`%c${label}`, `color:${color};font-weight:bold`, arr)\n }\n }\n\n // Side-effect changes from registration\n const result = data?.result\n if (result) {\n if (result.sync_changes.length > 0)\n console.log(\n '%csyncChanges',\n `color:${COLORS.graph};font-weight:bold`,\n result.sync_changes,\n )\n if (result.aggregation_changes.length > 0)\n console.log(\n '%caggregationChanges',\n `color:${COLORS.transform};font-weight:bold`,\n result.aggregation_changes,\n )\n if (result.computation_changes.length > 0)\n console.log(\n '%ccomputationChanges',\n `color:${COLORS.transform};font-weight:bold`,\n result.computation_changes,\n )\n }\n\n // Final changes + state\n if (data?.appliedChanges && data.appliedChanges.length > 0) {\n console.log(\n '%cfinalChanges',\n `color:${COLORS.produced};font-weight:bold`,\n data.appliedChanges.map((c) => [\n c.path,\n unwrap(c.value),\n ...(c.meta ? [unwrap(c.meta)] : []),\n ]),\n )\n }\n if (data?.stateSnapshot !== undefined) {\n console.log(\n '%cfinalState',\n `color:${COLORS.graph};font-weight:bold`,\n unwrap(data.stateSnapshot),\n )\n }\n\n // Timing\n if (data?.durationMs != null) {\n console.log(\n `%ctiming: ${fmtMs(data.durationMs)}`,\n `color:${COLORS.timing}`,\n )\n }\n\n console.groupEnd()\n },\n\n destroy: noop,\n }\n}\n","/**\n * WASM Lifecycle — Loading, instance management, gating, and teardown.\n *\n * Owns the singleton WASM instance. All loading and reset logic lives here.\n * bridge.ts imports `getWasmInstance()` to power the `wasm` namespace.\n *\n * - Production: `WasmGate` component loads WASM before rendering children\n * - Tests: `loadWasm()` called in `beforeEach`\n *\n * @module wasm/lifecycle\n */\n\nimport { useEffect, useState } from 'react'\n\nimport type * as WasmExports from '../../rust/pkg/apex_state_wasm'\nimport type { InternalState } from '../core/types'\nimport { createWasmPipeline } from './bridge'\n\n// ---------------------------------------------------------------------------\n// State\n// ---------------------------------------------------------------------------\n\nlet wasmInstance: typeof WasmExports | null = null\nlet loadingPromise: Promise<void> | null = null\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Load the WASM module (async, call once at startup).\n * Deduplicates concurrent calls — safe to call from multiple components.\n */\nexport const loadWasm = async (): Promise<typeof WasmExports> => {\n if (wasmInstance) return wasmInstance\n if (loadingPromise) {\n await loadingPromise\n return wasmInstance!\n }\n\n loadingPromise = (async () => {\n const wasmModule =\n (await import('../../rust/pkg/apex_state_wasm.js')) as unknown as typeof WasmExports & {\n default?: () => Promise<void>\n }\n\n if (typeof wasmModule.default === 'function') {\n await wasmModule.default()\n }\n wasmInstance = wasmModule\n })()\n\n await loadingPromise\n return wasmInstance!\n}\n\n/** Check if WASM module is loaded and ready for sync calls. */\nexport const isWasmLoaded = (): boolean => wasmInstance !== null\n\n/** Create a per-store WASM pipeline and initialize its shadow state. */\nexport const initPipeline = (\n internal: InternalState,\n initialState: object,\n options?: { debug?: boolean },\n): void => {\n const pipeline = createWasmPipeline(options)\n pipeline.shadowInit(initialState)\n internal.pipeline = pipeline\n}\n\n// ---------------------------------------------------------------------------\n// WasmGate — React component that blocks children until WASM is loaded.\n//\n// Separates async WASM loading from Provider's synchronous store setup.\n// Provider can assume WASM is always available — no async logic needed.\n// ---------------------------------------------------------------------------\n\n/**\n * Blocks rendering of children until the WASM module is loaded.\n * Renders `null` while loading, then renders children once ready.\n */\nexport const WasmGate = ({ children }: { children: React.ReactNode }) => {\n const [loaded, setLoaded] = useState(isWasmLoaded)\n\n useEffect(() => {\n if (loaded) return\n\n let cancelled = false\n loadWasm()\n .then(() => {\n if (!cancelled) setLoaded(true)\n })\n .catch((error) => {\n console.error('[apex-state] Failed to load WASM:', error)\n })\n\n return () => {\n cancelled = true\n }\n }, [loaded])\n\n if (!loaded) return null\n\n return <>{children}</>\n}\n\nWasmGate.displayName = 'WasmGate'\n\n// ---------------------------------------------------------------------------\n// Internal — used by bridge.ts\n// ---------------------------------------------------------------------------\n\n/** Get the loaded WASM instance or throw. */\nexport const getWasmInstance = (): typeof WasmExports => {\n if (!wasmInstance) {\n throw new Error('WASM not loaded. Call loadWasm() first.')\n }\n return wasmInstance\n}\n","/**\n * A placeholder maps a JS value (e.g. `undefined`) to a JSON-encoded string\n * sentinel (e.g. `'\"__APEX_UNDEFINED__\"'`) so values that cannot be represented\n * in JSON survive a round-trip through stringify → parse.\n */\nexport interface Placeholder {\n value: unknown\n /** The exact JSON-encoded string to use (include surrounding quotes for string sentinels). */\n encoded: string\n}\n\n/**\n * Create a symmetric fast stringify/parse pair with optional placeholder substitutions.\n *\n * Bypasses JSON.stringify / JSON.parse for primitives (number, boolean, null) — ~4.7x faster.\n * Placeholders are checked first via O(1) Map lookup before the fast-path logic.\n * See docs/BENCHMARK_JSON_SERIALIZATION.md for performance data.\n *\n * @example\n * const { stringify, parse } = createFastJson([\n * { value: undefined, encoded: '\"__UNDEFINED__\"' },\n * ])\n */\nexport const createFastJson = (placeholders: Placeholder[] = []) => {\n const encodeMap = new Map<unknown, string>()\n const decodeMap = new Map<string, unknown>()\n\n for (const p of placeholders) {\n encodeMap.set(p.value, p.encoded)\n decodeMap.set(p.encoded, p.value)\n }\n\n // Build a replacer for JSON.stringify that substitutes placeholder values\n // inside nested objects/arrays (e.g. undefined → \"__APEX_UNDEFINED__\").\n // Pre-decode the sentinel strings so the replacer avoids JSON.parse per call.\n // Only created if placeholders exist.\n const replacerMap = new Map<unknown, unknown>()\n for (const p of placeholders) {\n replacerMap.set(p.value, JSON.parse(p.encoded))\n }\n const replacer =\n replacerMap.size > 0\n ? (_key: string, val: unknown) =>\n replacerMap.has(val) ? replacerMap.get(val) : val\n : undefined\n\n // Build a post-parse walker that converts sentinel strings back to their\n // original JS values (e.g. \"__APEX_UNDEFINED__\" → undefined).\n // We can't use JSON.parse's reviver because returning undefined from a\n // reviver DELETES the key (per spec). A post-parse walk preserves keys.\n const decodeSentinelMap = new Map<unknown, unknown>()\n for (const p of placeholders) {\n decodeSentinelMap.set(JSON.parse(p.encoded), p.value)\n }\n\n const walkRestore = (val: unknown): unknown => {\n if (decodeSentinelMap.has(val)) return decodeSentinelMap.get(val)\n if (Array.isArray(val)) {\n for (let i = 0; i < val.length; i++) {\n val[i] = walkRestore(val[i])\n }\n return val\n }\n if (val !== null && typeof val === 'object') {\n const obj = val as Record<string, unknown>\n for (const key of Object.keys(obj)) {\n obj[key] = walkRestore(obj[key])\n }\n return obj\n }\n return val\n }\n\n const stringify = (value: unknown): string => {\n if (encodeMap.has(value)) return encodeMap.get(value)!\n if (typeof value === 'number' || typeof value === 'boolean')\n return String(value)\n if (value === null) return 'null'\n return JSON.stringify(value, replacer)\n }\n\n const parse = (json: string): unknown => {\n if (decodeMap.has(json)) return decodeMap.get(json)\n const c = json.charCodeAt(0)\n // Numbers: starts with 0-9 or minus sign\n if ((c >= 48 && c <= 57) || c === 45) return Number(json)\n if (json === 'true') return true\n if (json === 'false') return false\n if (json === 'null') return null\n const parsed = JSON.parse(json) as unknown\n return decodeSentinelMap.size > 0 ? walkRestore(parsed) : parsed\n }\n\n return { stringify, parse }\n}\n","/**\n * WASM Bridge — Thin namespace over Rust/WASM exports.\n *\n * Uses serde-wasm-bindgen for hot-path functions (processChanges,\n * shadowInit) — JS objects cross the boundary directly without JSON\n * string intermediary. Registration functions still use JSON strings\n * (cold path, simpler).\n *\n * Loading is handled by `wasm/lifecycle.ts`. After loading, all bridge\n * functions are synchronous.\n *\n * @module wasm/bridge\n */\n\nimport type { Change } from '../types/changes'\nimport type { ValidationSchema } from '../types/concerns'\nimport type { GenericMeta } from '../types/meta'\nimport { createFastJson } from '../utils/json'\nimport type * as Wasm from './generated/types'\nimport { getWasmInstance } from './lifecycle'\n\nexport type { Change }\n\n/** Map a Wasm wire result type to JS-facing type: Wasm.Change[] → Change[], rest untouched. */\ntype WireToJs<T> = {\n [K in keyof T]: T[K] extends Wasm.Change[] ? Change[] : T[K]\n}\n\n// ---------------------------------------------------------------------------\n// Result types — Wasm wire types with parsed Change values\n// ---------------------------------------------------------------------------\n\n/** JS-facing side effects result — same shape as Wasm wire type but with parsed Change values. */\nexport type SideEffectsResult = WireToJs<Wasm.SideEffectsResult>\n\n/** JS-facing concerns result — same shape as Wasm wire type but with parsed Change values. */\nexport type ConcernsResult = WireToJs<Wasm.ConcernsResult>\n\n// ---------------------------------------------------------------------------\n// Helpers — conversion between JS Change[] and WASM WasmChangeWire[]\n// ---------------------------------------------------------------------------\n\n/**\n * Sentinel for JS `undefined` crossing the WASM boundary.\n * JSON has no `undefined` concept, so we encode it as a JSON string sentinel.\n * Never collides with user data — no sane user value matches this marker.\n */\nconst UNDEFINED_SENTINEL_JSON = '\"__APEX_UNDEFINED__\"'\n\nconst { stringify: fastStringify, parse: fastParse } = createFastJson([\n { value: undefined, encoded: UNDEFINED_SENTINEL_JSON },\n])\n\n/** Convert JS Change[] to WASM wire format for serde-wasm-bindgen. */\nconst changesToWasm = (changes: Change[]) =>\n changes.map(({ path, value, meta }) => ({\n path,\n value_json: fastStringify(value),\n meta,\n }))\n\n/** Map a WASM lineage stage to the appropriate GenericMeta boolean flag + stage name. */\nconst lineageToMeta = (lineage: Wasm.Lineage): Partial<GenericMeta> => {\n if (lineage === 'Input') return {}\n const via = lineage.Derived.via\n const stageName = via.replace(/_/g, '_')\n switch (via) {\n case 'sync':\n return { isSyncPathChange: true, stage: 'sync' }\n case 'flip':\n return { isFlipPathChange: true, stage: 'flip' }\n case 'aggregation_write':\n return { isAggregationChange: true, stage: 'aggregation_write' }\n case 'aggregation_read':\n return { isAggregationChange: true, stage: 'aggregation_read' }\n case 'listeners':\n return { isListenerChange: true, stage: 'listeners' }\n case 'clear_path':\n return { isClearPathChange: true, stage: 'clear_path' }\n case 'computation':\n return { isComputationChange: true, stage: 'computation' }\n default:\n return { isProgramaticChange: true, stage: stageName }\n }\n}\n\n/** Convert WASM wire format back to JS Change[], transforming lineage into GenericMeta flags. */\nconst wasmChangesToJs = (wasmChanges: Wasm.Change[]): Change[] =>\n wasmChanges.map(({ path, value_json, meta, lineage }) => ({\n path,\n value: fastParse(value_json),\n meta: { ...(meta as GenericMeta), ...lineageToMeta(lineage) },\n }))\n\n/**\n * Create a new isolated WASM pipeline instance.\n * Each store should call this once and store the result.\n * Call pipeline.destroy() on cleanup.\n */\nexport const createWasmPipeline = (options?: { debug?: boolean }) => {\n const wasm = getWasmInstance()\n const id = wasm.pipeline_create(options)\n const schemas = new Map<number, ValidationSchema>()\n let destroyed = false\n\n return {\n id,\n get destroyed() {\n return destroyed\n },\n\n shadowInit: (state: object) => {\n wasm.shadow_init(id, fastStringify(state))\n },\n shadowDump: () => fastParse(wasm.shadow_dump(id)),\n processChanges: (changes: Change[]) => {\n const result = wasm.process_changes(\n id,\n changesToWasm(changes),\n ) as unknown as Wasm.PrepareResult\n\n const listenerChanges = wasmChangesToJs(result.listener_changes)\n return {\n listener_changes: listenerChanges,\n validators_to_run: result.validators_to_run,\n execution_plan: result.execution_plan,\n has_work: result.has_work,\n }\n },\n\n pipelineFinalize: (changes: Change[]) => {\n const result = wasm.pipeline_finalize(\n id,\n changesToWasm(changes),\n ) as unknown as Wasm.FinalizeResult\n\n return {\n state_changes: wasmChangesToJs(result.state_changes),\n trace: result.trace ?? null,\n }\n },\n\n registerSideEffects: (reg: Partial<Wasm.SideEffectsRegistration>) => {\n const result = wasm.register_side_effects(\n id,\n JSON.stringify(reg),\n ) as unknown as Wasm.SideEffectsResult\n\n return {\n sync_changes: wasmChangesToJs(result.sync_changes),\n aggregation_changes: wasmChangesToJs(result.aggregation_changes),\n computation_changes: wasmChangesToJs(result.computation_changes),\n registered_listener_ids: result.registered_listener_ids,\n }\n },\n\n unregisterSideEffects: (registrationId: string) => {\n if (destroyed) return\n wasm.unregister_side_effects(id, registrationId)\n },\n\n registerConcerns: (reg: Partial<Wasm.ConcernsRegistration>) => {\n const result = wasm.register_concerns(\n id,\n JSON.stringify(reg),\n ) as unknown as Wasm.ConcernsResult\n\n return {\n bool_logic_changes: wasmChangesToJs(result.bool_logic_changes),\n registered_logic_ids: result.registered_logic_ids,\n registered_validator_ids: result.registered_validator_ids,\n value_logic_changes: wasmChangesToJs(result.value_logic_changes),\n registered_value_logic_ids: result.registered_value_logic_ids,\n }\n },\n\n unregisterConcerns: (registrationId: string) => {\n if (destroyed) return\n wasm.unregister_concerns(id, registrationId)\n },\n\n registerBoolLogic: (outputPath: string, tree: unknown) =>\n wasm.register_boollogic(id, outputPath, JSON.stringify(tree)),\n\n unregisterBoolLogic: (logicId: number) => {\n if (destroyed) return\n wasm.unregister_boollogic(id, logicId)\n },\n\n pipelineReset: () => {\n wasm.pipeline_reset(id)\n },\n\n destroy: () => {\n if (destroyed) return\n destroyed = true\n wasm.pipeline_destroy(id)\n schemas.clear()\n },\n\n getGraphSnapshot: () => {\n if (destroyed) return { pipelines: {} } as unknown as Wasm.GraphSnapshot\n return wasm.get_graph_snapshot(id) as unknown as Wasm.GraphSnapshot\n },\n\n validatorSchemas: schemas,\n }\n}\n\nexport type WasmPipeline = ReturnType<typeof createWasmPipeline>\nexport type { Wasm }\n","/**\n * Valtio DevTools — Connects state and concerns proxies to Redux DevTools,\n * and provides a pipeline notifier for sending pipeline/registration events.\n *\n * Uses valtio/utils devtools() to expose both proxies as separate DevTools instances:\n * - '{prefix}:state' — application state proxy\n * - '{prefix}:concerns' — computed concern values proxy\n *\n * Singleton connections per proxy — survives StrictMode remounts and HMR reloads.\n */\n\nimport { devtools } from 'valtio/utils'\n\nimport pkg from '../../package.json'\nimport type { StoreConfig } from '../core/types'\nimport { is } from '../testing'\nimport type { DeepRequired } from '../types'\nimport type { PipelineLogData } from '../utils/log'\nimport type { Wasm } from '../wasm/bridge'\n\n// ---------------------------------------------------------------------------\n// DevTools types\n// ---------------------------------------------------------------------------\n\ninterface DevToolsInstance {\n init: (state: unknown) => void\n send: (action: { type: string }, state: unknown) => void\n unsubscribe: () => void\n}\n\ninterface DevToolsExtension {\n connect: (options: { name: string; features?: object }) => DevToolsInstance\n}\n\nconst nextDevtoolsId = (() => {\n let id = 0\n return () => ++id\n})()\n\nconst getDevToolsExtension = (): DevToolsExtension | undefined =>\n typeof window !== 'undefined'\n ? ((window as unknown as Record<string, unknown>)[\n '__REDUX_DEVTOOLS_EXTENSION__'\n ] as DevToolsExtension | undefined)\n : undefined\n\n/** Connect to Redux DevTools, returning a new instance. */\nconst connectPipelineDevTools = (prefix: string): DevToolsInstance | null => {\n const ext = getDevToolsExtension()\n if (!ext) return null\n\n const instance = ext.connect({\n name: `${prefix}:pipeline`,\n features: { jump: false, skip: false, dispatch: false },\n })\n instance.init({})\n return instance\n}\n\n// ---------------------------------------------------------------------------\n// Pipeline notifier — sends pipeline/registration events to DevTools\n// ---------------------------------------------------------------------------\n\nexport interface DevToolsNotifier {\n notifyPipeline: (data: PipelineLogData) => void\n notifyRegistration: (\n type: 'register' | 'unregister',\n id: string,\n snapshot: Wasm.GraphSnapshot,\n ) => void\n destroy: () => void\n}\n\n/** Build a short label from input change paths. */\nconst buildPathLabel = (paths: string[]): string => {\n if (paths.length === 0) return '(empty)'\n if (paths.length <= 3) return paths.join(', ')\n return `${paths[0]} +${String(paths.length - 1)} more`\n}\n\n/** Build DevTools tree object for a pipeline run. */\nconst buildDevToolsTree = (data: PipelineLogData): Record<string, unknown> => ({\n input: data.initialChanges,\n ...(data.trace\n ? {\n duration: `${data.trace.totalDurationMs.toFixed(2)}ms`,\n trace: data.trace.wasm,\n ...Object.fromEntries(\n data.trace.listeners.map((entry, i) => {\n const n = entry.fnName || '(anonymous)'\n const key = `[${String(i).padStart(2, '0')}] listener:${String(entry.subscriberId)} ${n}`\n return [\n key,\n {\n fn: n,\n scope: entry.scope,\n topic: entry.topic,\n registrationId: entry.registrationId,\n input: entry.input,\n output: entry.output,\n ...(entry.durationMs > 0\n ? { duration: entry.durationMs.toFixed(2) + 'ms' }\n : {}),\n },\n ]\n }),\n ),\n }\n : {}),\n})\n\n// ---------------------------------------------------------------------------\n// Proxy DevTools — eager connection (no hooks needed)\n// ---------------------------------------------------------------------------\n\n// Track active devtools subscriptions per proxy identity.\n// valtio's devtools() calls ext.connect() internally — calling it again for the\n// same proxy creates a duplicate DevTools entry. We guard against that by\n// tracking which proxies already have an active connection.\nconst connectedProxies = new WeakSet<object>()\n\nconst connectProxy = (\n proxyObj: object,\n name: string,\n): (() => void) | undefined => {\n if (connectedProxies.has(proxyObj)) return undefined\n\n connectedProxies.add(proxyObj)\n const unsub = devtools(proxyObj, { name, enabled: true })\n\n if (typeof unsub === 'function') {\n return () => {\n unsub()\n connectedProxies.delete(proxyObj)\n }\n }\n\n return () => {\n connectedProxies.delete(proxyObj)\n }\n}\n\n/**\n * Initialize all DevTools connections: pipeline notifier + proxy inspection.\n * Returns a DevToolsNotifier, or null if devtools is disabled or unavailable.\n * destroy() tears down everything (pipeline + proxy connections).\n */\nexport const attachDevtools = (\n config: DeepRequired<StoreConfig>,\n stateProxy: object,\n concernsProxy: object,\n): DevToolsNotifier | null => {\n if (!config.debug.devtools) return null\n\n const prefix = `apex-state@${pkg.version}:${config.name}-${String(nextDevtoolsId())}`\n\n // Pipeline DevTools connection\n const pipelineInstance = connectPipelineDevTools(prefix)\n if (!pipelineInstance) return null\n\n // Proxy DevTools connections (state + concerns inspection)\n const proxyUnsubs = [\n connectProxy(stateProxy, `${prefix}:state`),\n connectProxy(concernsProxy, `${prefix}:concerns`),\n ].filter(is.not.undefined)\n\n return {\n notifyPipeline: (data) => {\n const paths = data.initialChanges.map((c) => c.path)\n const suffix = paths.length === 0 ? '' : ` ${buildPathLabel(paths)}`\n pipelineInstance.send(\n { type: `PIPELINE_RUN${suffix}` },\n buildDevToolsTree(data),\n )\n },\n\n notifyRegistration: (type, id, snapshot) => {\n const actionType =\n type === 'register'\n ? `REGISTER_SIDE_EFFECTS ${id}`\n : `UNREGISTER_SIDE_EFFECTS ${id}`\n\n pipelineInstance.send({ type: actionType }, { id, snapshot })\n },\n\n destroy: () => {\n proxyUnsubs.forEach((unsub) => unsub())\n pipelineInstance.unsubscribe()\n },\n }\n}\n","{\n \"name\": \"@sladg/apex-state\",\n \"version\": \"3.11.4\",\n \"description\": \"Advanced state management wrapper around Valtio with sync paths, aggregations, and side effects\",\n \"keywords\": [\n \"state-management\",\n \"valtio\",\n \"react\",\n \"sync-paths\",\n \"aggregation\",\n \"side-effects\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sladg/apex-state\"\n },\n \"license\": \"MIT\",\n \"author\": \"Jan Soukup <jan@ssoukup.com>\",\n \"contributors\": [\n \"Claude\"\n ],\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\"\n },\n \"./testing\": {\n \"import\": \"./dist/testing/index.js\",\n \"types\": \"./dist/testing/index.d.ts\"\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"main\": \"./dist/index.js\",\n \"type\": \"module\",\n \"types\": \"./dist/index.d.ts\",\n \"module\": \"./dist/index.js\",\n \"scripts\": {\n \"bench\": \"vitest bench --run\",\n \"bench:watch\": \"vitest bench\",\n \"build\": \"tsup\",\n \"code:check\": \"eslint . && npm run type-check\",\n \"code:fix\": \"eslint . --fix\",\n \"code:unused\": \"knip\",\n \"commit\": \"npx --package @sladg/release-utils utils commit\",\n \"docs:llms\": \"npx tsx scripts/generate-llms-txt.ts --outdir ./demo/dist\",\n \"release\": \"npx --package @sladg/release-utils utils shipit --gitUser @sladg --gitEmail jan@ssoukup.com --changelog\",\n \"test\": \"npm run test:smoke && npm run test:all && npm run bench\",\n \"test:all\": \"vitest run && npm run wasm:test\",\n \"test:bench\": \"npm run test:parity && npm run bench\",\n \"test:coverage\": \"vitest run --coverage\",\n \"test:parity\": \"vitest run tests/integration/wasm-vs-legacy-parity.test.ts\",\n \"test:perf\": \"VITEST_PERF=true vitest run\",\n \"test:smoke\": \"vitest run tests/smoke-dual-mode.test.tsx\",\n \"test:watch\": \"vitest\",\n \"type-check\": \"tsc --noEmit\",\n \"wasm:build\": \"wasm-pack build --target bundler rust && npm run wasm:generate-types\",\n \"wasm:check\": \"cargo check --manifest-path rust/Cargo.toml\",\n \"wasm:fmt\": \"cargo fmt --manifest-path rust/Cargo.toml\",\n \"wasm:fmt:check\": \"cargo fmt --manifest-path rust/Cargo.toml -- --check\",\n \"wasm:generate-types\": \"cargo run --manifest-path rust/Cargo.toml --bin ts-export\",\n \"wasm:lint\": \"cargo clippy --manifest-path rust/Cargo.toml -- -D warnings\",\n \"wasm:test\": \"cargo test --manifest-path rust/Cargo.toml --lib\"\n },\n \"dependencies\": {\n \"valtio\": \"^2.3.0\",\n \"valtio-reactive\": \"^0.2.0\"\n },\n \"devDependencies\": {\n \"@jsbits/deep-clone\": \"^1.1.1\",\n \"@sladg/eslint-config-base\": \"^2.4.2\",\n \"@testing-library/jest-dom\": \"^6.9.1\",\n \"@testing-library/react\": \"^14.3.1\",\n \"@tsconfig/strictest\": \"^2.0.8\",\n \"@types/react\": \"^18.3.12\",\n \"@vitejs/plugin-react\": \"^5.1.1\",\n \"@vitest/coverage-v8\": \"^4.0.18\",\n \"esbuild-plugin-wasm\": \"^1.1.0\",\n \"eslint\": \"^9.0.0\",\n \"eslint-plugin-check-file\": \"^3.3.1\",\n \"happy-dom\": \"^20.7.0\",\n \"jsdom\": \"^27.4.0\",\n \"knip\": \"^5.82.1\",\n \"react\": \"^18.3.1\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.9.3\",\n \"vite\": \"^7.3.1\",\n \"vite-plugin-wasm\": \"^3.5.0\",\n \"vitest\": \"^4.0.18\",\n \"zod\": \"^3.24.1\"\n },\n \"peerDependencies\": {\n \"@testing-library/react\": \"^14.0.0 || ^15.0.0 || ^16.0.0\",\n \"@types/react\": \"^18.0.0 || ^19.0.0\",\n \"react\": \"^18.0.0 || ^19.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@testing-library/react\": {\n \"optional\": true\n },\n \"@types/react\": {\n \"optional\": true\n }\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","/**\n * @sladg/apex-state/testing\n *\n * Lightweight mock of the main module for consumer tests.\n * No real pipeline, no WASM, no concerns — just bare-bones\n * reactive state with call tracking.\n *\n * Consumer setup:\n * __mocks__/@sladg/apex-state.ts:\n * export * from '@sladg/apex-state/testing'\n *\n * Then in tests:\n * vi.mock('@sladg/apex-state')\n * import { __mocked } from '@sladg/apex-state/testing'\n *\n * // Inspect state, calls, effects\n * expect(__mocked.state.calls).toHaveLength(1)\n * // Programmatically set values\n * __mocked.set('user.email', 'hello@example.com')\n * // Reset between tests\n * __mocked.reset()\n */\n\nimport React from 'react'\n\nimport { act } from '@testing-library/react'\nimport { proxy, snapshot, useSnapshot } from 'valtio'\n\nimport type { ConcernType } from '../concerns'\nimport { defaultConcerns } from '../concerns/registry'\nimport type { StoreConfig } from '../core/types'\nimport type { GenericStoreApi } from '../store/create-store'\nimport type { DeepKey, DeepValue, GenericMeta } from '../types'\nimport { deepClone } from '../utils/deep-clone'\nimport { dot } from '../utils/dot'\n\n// ---------------------------------------------------------------------------\n// Re-export all values except createGenericStore\n// Keep in sync with src/index.ts exports\n// Types are NOT re-exported — TypeScript resolves them from the real module's\n// .d.ts even when vi.mock replaces the runtime module.\n// ---------------------------------------------------------------------------\nexport {\n _,\n aggregationPairs,\n applyChangesToObject,\n computationPairs,\n deepClone,\n defaultConcerns,\n dot,\n evaluateBoolLogic,\n extractPlaceholders,\n findConcern,\n flipPairs,\n hashKey,\n interpolateTemplate,\n is,\n listeners,\n prebuilts,\n registerSideEffects,\n syncPairs,\n useBufferedField,\n useKeyboardSelect,\n useThrottledField,\n useTransformedField,\n} from '../index'\n\n// ---------------------------------------------------------------------------\n// Mock internal state\n// ---------------------------------------------------------------------------\n\ninterface MockCall {\n path: string\n value: unknown\n meta?: unknown\n}\n\ninterface MockEffect {\n id: string\n type: 'concerns' | 'sideEffects'\n registration: unknown\n}\n\nconst __state = proxy({\n /** Current store state (reactive valtio proxy) */\n value: {} as Record<string, unknown>,\n /** Log of all setValue / setChanges calls */\n calls: [] as MockCall[],\n /** Log of all useConcerns / useSideEffects registrations */\n effects: [] as MockEffect[],\n})\n\n// ---------------------------------------------------------------------------\n// Mock control API — import from '@sladg/apex-state/testing'\n// ---------------------------------------------------------------------------\n\n/** Typed chainable returned by `__mocked.set<T>()` — path+value pairs are type-checked */\ninterface TypedMock<T extends object> {\n set: <P extends DeepKey<T>>(path: P, value: DeepValue<T, P>) => TypedMock<T>\n state: typeof __state\n getState: () => T\n flush: () => Promise<void>\n reset: () => void\n}\n\nconst __flush = async () => {\n await act(async () => {\n // valtio propagates proxy notifications via microtasks\n })\n}\n\nconst __reset = () => {\n const keys = Object.keys(__state.value)\n keys.forEach((key) => {\n Reflect.deleteProperty(__state.value, key)\n })\n __state.calls.length = 0\n __state.effects.length = 0\n}\n\nconst __typedMock = <T extends object>(): TypedMock<T> => {\n const api: TypedMock<T> = {\n set: (path, value) => {\n dot.set__unsafe(__state.value, path as string, deepClone(value))\n return api\n },\n state: __state,\n getState: () => snapshot(__state.value) as T,\n flush: __flush,\n reset: __reset,\n }\n return api\n}\n\n/**\n * Mock control object for test assertions and state manipulation.\n *\n * @example\n * ```ts\n * import { __mocked } from '@sladg/apex-state/testing'\n *\n * beforeEach(() => __mocked.reset())\n *\n * // First .set<T>() seeds data and returns typed chainable\n * __mocked.set<MyState>({ email: '' })\n * .set('email', 'a@b.com') // DeepKey<MyState> — autocomplete + type-checked\n * .set('name', 'Alice')\n *\n * // Or just establish the type without seeding\n * __mocked.set<MyState>()\n * .set('email', 'a@b.com')\n *\n * // Assertions\n * expect(__mocked.state.calls).toHaveLength(1)\n * expect(__mocked.getState()).toEqual({ ... })\n * ```\n */\nexport const __mocked = {\n /** Reactive proxy — access .value, .calls, .effects for assertions */\n state: __state,\n\n /**\n * Seed mock state and return typed chainable.\n * - `set<T>()` — establish type, no seeding\n * - `set<T>(data)` — merge data into state, establish type\n * Subsequent `.set(path, value)` calls are type-safe against T.\n */\n set: <T extends object>(data?: Partial<T>): TypedMock<T> => {\n if (data) {\n __state.value = deepClone(data)\n }\n return __typedMock<T>()\n },\n\n /** Get an immutable snapshot of the current state */\n getState: () => snapshot(__state.value),\n\n /** Flush pending valtio-triggered React renders */\n flush: __flush,\n\n /** Reset all mock state between tests */\n reset: __reset,\n}\n\n// ---------------------------------------------------------------------------\n// Mock createGenericStore\n// ---------------------------------------------------------------------------\n\n/**\n * Mock version of createGenericStore.\n *\n * Returns the same API shape as the real module but backed by a shared\n * module-level valtio proxy (__mocked.state). No pipeline, no WASM,\n * no concerns evaluation — just reactive state with call tracking.\n */\nexport const createGenericStore = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n CONCERNS extends readonly ConcernType<string, any, any>[] =\n typeof defaultConcerns,\n>(\n _config?: StoreConfig,\n): GenericStoreApi<DATA, META, CONCERNS> => {\n // Provider: seeds mock state from initialState\n const Provider = ({\n initialState,\n children,\n }: {\n initialState: Record<string, unknown>\n children?: React.ReactNode\n }) => {\n __state.value = deepClone(initialState)\n return React.createElement(React.Fragment, null, children)\n }\n Provider.displayName = 'MockStoreProvider'\n\n // Hooks use useSnapshot for automatic React re-rendering via valtio\n const useStore = (path: string) => {\n const snap = useSnapshot(__state)\n const value = dot.get__unsafe(snap.value as Record<string, unknown>, path)\n const setValue = (newValue: unknown, meta?: unknown) => {\n __state.calls.push({ path, value: newValue, meta })\n dot.set__unsafe(__state.value, path, deepClone(newValue))\n }\n return [value, setValue] as const\n }\n\n const useFieldStore = (path: string) => {\n const [value, setValue] = useStore(path)\n return { value, setValue }\n }\n\n const useJitStore = () => {\n const snap = useSnapshot(__state)\n return {\n proxyValue: snap.value as Record<string, unknown>,\n setChanges: (changes: [string, unknown, unknown?][]) => {\n for (const [path, value, meta] of changes) {\n __state.calls.push({ path, value, meta })\n dot.set__unsafe(__state.value, path, deepClone(value))\n }\n },\n getState: () => snapshot(__state.value) as Record<string, unknown>,\n }\n }\n\n const useSideEffects = (id: string, effects: unknown) => {\n __state.effects.push({ id, type: 'sideEffects', registration: effects })\n }\n\n const useConcerns = (id: string, registration: unknown) => {\n __state.effects.push({ id, type: 'concerns', registration })\n }\n\n const withConcerns = () => ({\n useFieldStore,\n })\n\n const api = {\n Provider,\n useStore,\n useFieldStore,\n useJitStore,\n useSideEffects,\n useConcerns,\n withConcerns,\n }\n\n // Compile-time drift guard: if the real API adds or removes a method,\n // one of these two lines will fail with a type error.\n type _Real = keyof GenericStoreApi<DATA, META, CONCERNS>\n type _Mock = keyof typeof api\n type _NoMissing = _Real extends _Mock ? true : never\n type _NoExtra = _Mock extends _Real ? true : never\n void (0 as unknown as _NoMissing & _NoExtra)\n\n return api as unknown as GenericStoreApi<DATA, META, CONCERNS>\n}\n","/**\n * Lazy-validated pair helper functions\n *\n * These curried helpers provide O(N) base type + O(K) per-pair validation,\n * avoiding the O(N²) explosion of SyncPair/FlipPair/AggregationPair/ComputationPair\n * on large state types (1500+ paths).\n *\n * Runtime behavior: identity function (returns input as-is).\n * Type behavior: validates each pair via CheckSyncPairs / CheckAggregationPairs / CheckComputationPairs.\n *\n * **Why these exist**: The direct pair types (`SyncPair<T>`, `FlipPair<T>`, etc.) distribute\n * over all N paths to build an O(N²) union of valid pairs. This hits TS2589 at ~1,500 paths.\n * These helpers defer validation: the function constraint uses `ResolvableDeepKey<T>` (O(N))\n * for autocomplete, then `CheckPairValueMatch` validates only the K pairs you actually write\n * via `DeepValue` comparison (O(1) per pair).\n *\n * **Inference safety**: Parameter types use mapped types only (`{ [I in keyof T]: Check<T[I]> }`)\n * — never `[...T] & MappedType<T>`. This avoids the TS inference competition where `[...T]`\n * and a mapped type both try to infer T, causing tuple widening on small state types.\n *\n * **Branded returns**: Each helper returns a `Validated*` branded type so that\n * `useSideEffects({ syncPaths: result })` skips the O(N²) re-validation.\n *\n * **Scaling limits** (measured on Apple M4 Pro):\n * - ~82,500 paths (500 flat sectors, depth 4): PASS in 7.1s / 617 MB\n * - ~52,800 paths (binary 6 levels, depth 9): PASS in 4.7s / 574 MB\n * - ~105,600 paths (binary 7 levels, depth 10): TS2589\n * - Practical limit: ~50K–80K paths, bounded by `ResolvableDeepKey` union resolution\n * at the function constraint, not by the validation logic.\n * - Old `SyncPair<T>` hit TS2589 at ~1,500 paths — a ~30–50x improvement.\n *\n * @example\n * ```typescript\n * const syncs = syncPairs<State>()([\n * ['user.email', 'profile.email'], // ✓ both string\n * ['user.age', 'profile.name'], // ✗ number vs string → type error\n * ])\n * ```\n */\n\nimport type {\n BoolLogic,\n CheckAggregationPairs,\n CheckComputationPairs,\n CheckListeners,\n CheckSyncPairs,\n ComputationOp,\n ValidatedAggregationPairs,\n ValidatedComputationPairs,\n ValidatedFlipPairs,\n ValidatedListeners,\n ValidatedSyncPairs,\n} from '../types'\nimport type { DefaultDepth, ResolvableDeepKey } from '../types/deep-key'\nimport type { DeepKeyFiltered } from '../types/deep-key-filtered'\nimport type { GenericMeta } from '../types/meta'\n\n/**\n * Lazy-validated sync pairs. Curried: `syncPairs<State>()(pairs)`.\n *\n * Provides autocomplete for valid paths (O(N)) and validates that both paths\n * in each pair resolve to the same value type (O(K) per pair).\n * Returns branded `ValidatedSyncPairs` — accepted by `useSideEffects` without re-validation.\n *\n * @example\n * ```typescript\n * const syncs = syncPairs<MyState>()([\n * ['user.email', 'profile.email'],\n * ['user.name', 'profile.name'],\n * ])\n * useSideEffects('my-syncs', { syncPaths: syncs }) // no O(N²) re-check\n * ```\n */\nexport const syncPairs =\n <DATA extends object, Depth extends number = DefaultDepth>() =>\n <\n T extends (\n | [ResolvableDeepKey<DATA, Depth>, ResolvableDeepKey<DATA, Depth>]\n | [\n ResolvableDeepKey<DATA, Depth>,\n ResolvableDeepKey<DATA, Depth>,\n { oneWay: '[0]->[1]' | '[1]->[0]' },\n ]\n )[],\n >(\n pairs: CheckSyncPairs<DATA, T, Depth>,\n ): ValidatedSyncPairs<DATA> =>\n pairs as ValidatedSyncPairs<DATA>\n\n/**\n * Lazy-validated flip pairs. Curried: `flipPairs<State>()(pairs)`.\n *\n * Identical to syncPairs — validates both paths resolve to the same value type.\n * Returns branded `ValidatedFlipPairs` — accepted by `useSideEffects` without re-validation.\n *\n * @example\n * ```typescript\n * const flips = flipPairs<MyState>()([\n * ['isActive', 'isInactive'],\n * ])\n * useSideEffects('my-flips', { flipPaths: flips }) // no O(N²) re-check\n * ```\n */\nexport const flipPairs =\n <DATA extends object, Depth extends number = DefaultDepth>() =>\n <\n T extends [\n ResolvableDeepKey<DATA, Depth>,\n ResolvableDeepKey<DATA, Depth>,\n ][],\n >(\n pairs: CheckSyncPairs<DATA, T, Depth>,\n ): ValidatedFlipPairs<DATA> =>\n pairs as ValidatedFlipPairs<DATA>\n\n/**\n * Lazy-validated aggregation pairs. Curried: `aggregationPairs<State>()(pairs)`.\n *\n * Each pair is [target, source] or [target, source, BoolLogic].\n * Validates that target and source resolve to the same value type.\n * Returns branded `ValidatedAggregationPairs` — accepted by `useSideEffects` without re-validation.\n *\n * @example\n * ```typescript\n * const aggs = aggregationPairs<MyState>()([\n * ['total', 'price1'],\n * ['total', 'price2', { IS_EQUAL: ['price2.disabled', true] }],\n * ])\n * useSideEffects('my-aggs', { aggregations: aggs }) // no O(N²) re-check\n * ```\n */\nexport const aggregationPairs =\n <DATA extends object, Depth extends number = DefaultDepth>() =>\n <\n T extends (\n | [ResolvableDeepKey<DATA, Depth>, ResolvableDeepKey<DATA, Depth>]\n | [\n ResolvableDeepKey<DATA, Depth>,\n ResolvableDeepKey<DATA, Depth>,\n BoolLogic<DATA, Depth>,\n ]\n )[],\n >(\n pairs: CheckAggregationPairs<DATA, T, Depth>,\n ): ValidatedAggregationPairs<DATA> =>\n pairs as ValidatedAggregationPairs<DATA>\n\n/**\n * Lazy-validated computation pairs. Curried: `computationPairs<State>()(pairs)`.\n *\n * Each pair is [op, target, source] or [op, target, source, BoolLogic].\n * Validates that both target and source are number paths.\n * Returns branded `ValidatedComputationPairs` — accepted by `useSideEffects` without re-validation.\n *\n * @example\n * ```typescript\n * const comps = computationPairs<MyState>()([\n * ['SUM', 'total', 'price1'],\n * ['AVG', 'average', 'score1'],\n * ])\n * useSideEffects('my-comps', { computations: comps }) // no O(N²) re-check\n * ```\n */\nexport const computationPairs =\n <DATA extends object, Depth extends number = DefaultDepth>() =>\n <\n T extends (\n | [\n ComputationOp,\n DeepKeyFiltered<DATA, number, Depth>,\n DeepKeyFiltered<DATA, number, Depth>,\n ]\n | [\n ComputationOp,\n DeepKeyFiltered<DATA, number, Depth>,\n DeepKeyFiltered<DATA, number, Depth>,\n BoolLogic<DATA, Depth>,\n ]\n )[],\n >(\n pairs: CheckComputationPairs<DATA, T, Depth>,\n ): ValidatedComputationPairs<DATA> =>\n pairs as ValidatedComputationPairs<DATA>\n\n/**\n * Lazy-validated listeners. Curried: `listeners<State>()(items)`.\n *\n * Provides autocomplete for valid paths (O(N)) and validates each listener:\n * - path and scope are valid `ResolvableDeepKey<DATA>` or null\n * - When both non-null: scope must be a dot-separated prefix of path\n * - fn receives correctly-typed scoped state based on scope\n *\n * Returns branded `ValidatedListeners` — accepted by `useSideEffects` without re-validation.\n *\n * @example\n * ```typescript\n * const myListeners = listeners<MyState>()([\n * {\n * path: 'user.profile.name',\n * scope: 'user.profile',\n * fn: (changes, state) => {\n * // changes: ArrayOfChanges relative to user.profile scope\n * // state: typed as MyState['user']['profile']\n * // return: ArrayOfChanges relative to scope, or undefined\n * return [['name', `updated-${state.name}`, {}]]\n * }\n * },\n * ])\n * useSideEffects('my-listeners', { listeners: myListeners })\n * ```\n */\nexport const listeners =\n <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n Depth extends number = DefaultDepth,\n >() =>\n <\n T extends readonly {\n path: ResolvableDeepKey<DATA, Depth> | null\n scope?: ResolvableDeepKey<DATA, Depth> | null | undefined\n fn: (...args: any[]) => any\n }[],\n >(\n items: CheckListeners<DATA, META, T, Depth>,\n ): ValidatedListeners<DATA, META> =>\n items as ValidatedListeners<DATA, META>\n","/**\n * Pre-warmed pair helpers — DATA type already bound\n *\n * Returned by `createGenericStore()` so users don't need to repeat `<MyState>`\n * at every call site. Each helper is the second (inner) function of the curried\n * pair validator, with DATA already applied.\n *\n * @example Basic usage\n * ```typescript\n * const { syncPairs, flipPairs, useSideEffects } = createGenericStore<MyState>()\n *\n * // No <MyState> needed — already bound\n * const syncs = syncPairs([['user.email', 'profile.email']])\n * useSideEffects('my-syncs', { syncPaths: syncs })\n * ```\n *\n * @example All pairs in one call (preferred)\n * ```typescript\n * const { syncPairs, useSideEffects } = createGenericStore<MyState>()\n *\n * // Put all pairs in a single call — validation is O(K) per pair\n * const syncs = syncPairs([\n * ['user.email', 'profile.email'],\n * ['user.name', 'profile.name'],\n * ])\n *\n * useSideEffects('syncs', { syncPaths: syncs })\n * ```\n */\n\nimport type { GenericMeta } from '../types'\nimport {\n aggregationPairs,\n computationPairs,\n flipPairs,\n listeners,\n syncPairs,\n} from '../utils/pair-helpers'\n\n/**\n * Creates pre-warmed pair helpers with DATA type already bound.\n * Called once by createGenericStore, returned as part of the store API.\n */\nexport const createWarmPairHelpers = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n>() => ({\n /**\n * Pre-warmed sync pair validator — DATA type is already bound.\n * Validates that both paths in each pair resolve to the same value type.\n * Pass the result to `useSideEffects` as `syncPaths`.\n *\n * @example\n * ```typescript\n * const { useSideEffects, syncPairs } = createGenericStore<MyState>()\n *\n * // Type-safe — no need to repeat <MyState>\n * const syncs = syncPairs([\n * ['user.email', 'profile.email'], // ✓ both string\n * ['user.age', 'profile.age'], // ✓ both number\n * ])\n *\n * // Inside a component:\n * useSideEffects('my-syncs', { syncPaths: syncs })\n * ```\n */\n syncPairs: syncPairs<DATA>(),\n\n /**\n * Pre-warmed flip pair validator — DATA type is already bound.\n * Validates that both paths in each pair resolve to the same value type.\n * Used for inverted boolean synchronization. Pass the result to `useSideEffects` as `flipPaths`.\n *\n * @example\n * ```typescript\n * const { useSideEffects, flipPairs } = createGenericStore<MyState>()\n *\n * const flips = flipPairs([\n * ['isExpanded', 'isCollapsed'], // ✓ both boolean\n * ])\n *\n * // Inside a component:\n * useSideEffects('my-flips', { flipPaths: flips })\n * ```\n */\n flipPairs: flipPairs<DATA>(),\n\n /**\n * Pre-warmed aggregation pair validator — DATA type is already bound.\n * Each pair is `[target, source]` or `[target, source, BoolLogic]`.\n * Validates that target and source resolve to the same value type.\n * Pass the result to `useSideEffects` as `aggregations`.\n *\n * @example\n * ```typescript\n * const { useSideEffects, aggregationPairs } = createGenericStore<MyState>()\n *\n * const aggs = aggregationPairs([\n * ['total', 'price1'],\n * ['total', 'price2', { IS_EQUAL: ['price2.disabled', true] }],\n * ])\n *\n * // Inside a component:\n * useSideEffects('my-aggs', { aggregations: aggs })\n * ```\n */\n aggregationPairs: aggregationPairs<DATA>(),\n\n /**\n * Pre-warmed computation pair validator — DATA type is already bound.\n * Each pair is `[op, target, source]` or `[op, target, source, BoolLogic]`.\n * Both target and source must be number paths.\n * Pass the result to `useSideEffects` as `computations`.\n *\n * @example\n * ```typescript\n * const { useSideEffects, computationPairs } = createGenericStore<MyState>()\n *\n * const comps = computationPairs([\n * ['SUM', 'total', 'price1'],\n * ['AVG', 'average', 'score1'],\n * ])\n *\n * // Inside a component:\n * useSideEffects('my-comps', { computations: comps })\n * ```\n */\n computationPairs: computationPairs<DATA>(),\n\n /**\n * Pre-warmed listener validator — DATA type is already bound.\n * Validates path/scope relationships and derives fn types from scope.\n * Pass the result to `useSideEffects` as `listeners`.\n *\n * @example\n * ```typescript\n * const { useSideEffects, listeners } = createGenericStore<MyState>()\n *\n * const myListeners = listeners([\n * {\n * path: 'user.profile.name',\n * scope: 'user.profile',\n * fn: (changes, state) => {\n * // state is typed as MyState['user']['profile']\n * return undefined\n * }\n * },\n * ])\n *\n * useSideEffects('my-listeners', { listeners: myListeners })\n * ```\n */\n listeners: listeners<DATA, META>(),\n})\n","import { useCallback, useState } from 'react'\n\n/**\n * Minimal field interface that useBufferedField accepts\n */\nexport interface FieldInput<T> {\n value: T\n setValue: (v: T) => void\n}\n\n/**\n * Extended interface with buffering capabilities\n */\nexport interface BufferedField<T> extends FieldInput<T> {\n commit: () => void\n cancel: () => void\n isDirty: boolean\n}\n\n/**\n * Adds buffered editing to any field hook.\n * Local changes are held until explicitly committed or cancelled.\n *\n * @param field - Field hook with { value, setValue }\n * @returns Buffered field with commit/cancel/isDirty\n *\n * @example\n * ```typescript\n * const field = useFieldStore('user.name')\n * const buffered = useBufferedField(field)\n *\n * // User types - updates local only\n * buffered.setValue('new value')\n *\n * // Enter/Tab - commit to store\n * buffered.commit()\n *\n * // Esc - revert to stored value\n * buffered.cancel()\n *\n * // Check if user has unsaved changes\n * if (buffered.isDirty) { ... }\n * ```\n */\nexport const useBufferedField = <T>(field: FieldInput<T>): BufferedField<T> => {\n const { value: storedValue, setValue: setStoredValue } = field\n\n // null = not editing, T = editing with this local value\n const [localValue, setLocalValue] = useState<T | null>(null)\n\n // Derive editing state from localValue\n const isEditing = localValue !== null\n const isDirty = isEditing && localValue !== storedValue\n\n // Update local value only (no store write)\n const setValue = useCallback((newValue: T) => {\n setLocalValue(newValue)\n }, [])\n\n // Commit local value to store\n const commit = useCallback(() => {\n if (localValue !== null) {\n setStoredValue(localValue)\n }\n setLocalValue(null)\n }, [localValue, setStoredValue])\n\n // Cancel and revert to stored value\n const cancel = useCallback(() => {\n setLocalValue(null)\n }, [])\n\n // Return current value: local if editing, otherwise stored\n const value = isEditing ? localValue : storedValue\n\n return { value, setValue, commit, cancel, isDirty }\n}\n","import { useCallback, useRef } from 'react'\n\n/**\n * Option for keyboard selection\n */\nexport interface SelectOption<T> {\n value: T\n label: string\n}\n\n/**\n * Configuration for keyboard select behavior\n */\nexport interface KeyboardSelectConfig<T> {\n /** Available options to select from */\n options: SelectOption<T>[]\n /** Time window to accumulate keystrokes (ms). Default: 500 */\n debounceMs?: number\n /** Match from start of label only. Default: true */\n matchFromStart?: boolean\n}\n\n/**\n * Minimal field interface that useKeyboardSelect accepts\n */\nexport interface FieldInput<T> {\n value: T\n setValue: (v: T) => void\n}\n\n/**\n * Adds keyboard-driven selection to any field hook.\n * Typing letters auto-selects matching options.\n *\n * @param field - Field hook with { value, setValue, ...rest }\n * @param config - Options and behavior configuration\n * @returns Field with onKeyDown handler added\n *\n * @example\n * ```typescript\n * const field = useFieldStore('user.country')\n * const { onKeyDown, ...rest } = useKeyboardSelect(field, {\n * options: [\n * { value: 'us', label: 'United States' },\n * { value: 'uk', label: 'United Kingdom' },\n * { value: 'ca', label: 'Canada' },\n * ]\n * })\n *\n * // User types \"u\" -> selects \"United States\"\n * // User types \"un\" quickly -> still \"United States\"\n * // User types \"c\" -> selects \"Canada\"\n *\n * <input onKeyDown={onKeyDown} {...rest} />\n * ```\n */\nexport const useKeyboardSelect = <T, TField extends FieldInput<T>>(\n field: TField,\n config: KeyboardSelectConfig<T>,\n): TField & { onKeyDown: (e: React.KeyboardEvent) => void } => {\n const { setValue } = field\n const { options, debounceMs = 500, matchFromStart = true } = config\n\n // Accumulated search string\n const searchRef = useRef('')\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n // Only handle printable characters\n if (e.key.length !== 1) return\n\n // Don't interfere with modifier keys\n if (e.ctrlKey || e.metaKey || e.altKey) return\n\n const char = e.key.toLowerCase()\n\n // Clear previous timeout\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n\n // Accumulate search string\n searchRef.current += char\n\n // Find matching option\n const search = searchRef.current\n const match = options.find((opt) => {\n const label = opt.label.toLowerCase()\n return matchFromStart\n ? label.startsWith(search)\n : label.includes(search)\n })\n\n if (match) {\n setValue(match.value)\n }\n\n // Reset search after debounce\n timeoutRef.current = setTimeout(() => {\n searchRef.current = ''\n }, debounceMs)\n },\n [options, setValue, debounceMs, matchFromStart],\n )\n\n return { ...field, onKeyDown }\n}\n","import { useCallback, useEffect, useRef } from 'react'\n\n/**\n * Minimal field interface for throttling\n * Supports setValue with optional additional arguments (e.g., meta)\n */\nexport interface ThrottleFieldInput<T, Args extends unknown[] = unknown[]> {\n value: T\n setValue: (v: T, ...args: Args) => void\n}\n\n/**\n * Throttle configuration\n */\nexport interface ThrottleConfig {\n /** Minimum milliseconds between setValue calls to the underlying field */\n ms: number\n}\n\n/**\n * Internal state for throttle tracking\n */\ninterface ThrottleState<T, Args extends unknown[]> {\n timeoutId: ReturnType<typeof setTimeout> | null\n lastFlushTime: number\n pendingValue: T | undefined\n pendingArgs: Args | undefined\n hasPending: boolean\n}\n\n/**\n * Adds throttling to any field hook.\n * First setValue executes immediately, subsequent calls are rate-limited.\n * Last value wins when multiple calls occur within the throttle window.\n * Preserves the full setValue signature including additional arguments like meta.\n *\n * @param field - Field hook with { value, setValue, ...rest }\n * @param config - Throttle configuration { ms }\n * @returns Field with throttled setValue, plus any passthrough props\n *\n * @example\n * ```typescript\n * const field = useFieldStore('spotPrice')\n * const throttled = useThrottledField(field, { ms: 100 })\n *\n * // Rapid updates from WebSocket\n * throttled.setValue(1.234) // Immediate\n * throttled.setValue(1.235) // Buffered\n * throttled.setValue(1.236) // Buffered (replaces 1.235)\n * // After 100ms: 1.236 is applied\n * ```\n *\n * @example\n * ```typescript\n * // With meta argument\n * const field = useFieldStore('price')\n * const throttled = useThrottledField(field, { ms: 100 })\n * throttled.setValue(42, { source: 'websocket' })\n * ```\n *\n * @example\n * ```typescript\n * // Composable with other wrappers\n * const field = useFieldStore('price')\n * const transformed = useTransformedField(field, {\n * to: (cents) => cents / 100,\n * from: (dollars) => Math.round(dollars * 100)\n * })\n * const throttled = useThrottledField(transformed, { ms: 50 })\n * ```\n */\nexport const useThrottledField = <\n T,\n Args extends unknown[] = unknown[],\n TField extends ThrottleFieldInput<T, Args> = ThrottleFieldInput<T, Args>,\n>(\n field: TField,\n config: ThrottleConfig,\n): TField => {\n const { setValue: originalSetValue, ...rest } = field\n const { ms } = config\n\n const throttleRef = useRef<ThrottleState<T, Args>>({\n timeoutId: null,\n lastFlushTime: 0,\n pendingValue: undefined,\n pendingArgs: undefined,\n hasPending: false,\n })\n\n const setValue = useCallback(\n (newValue: T, ...args: Args) => {\n const now = Date.now()\n const ref = throttleRef.current\n const timeSinceLastFlush = now - ref.lastFlushTime\n\n // If enough time has passed, flush immediately\n if (timeSinceLastFlush >= ms) {\n ref.lastFlushTime = now\n originalSetValue(newValue, ...args)\n return\n }\n\n // Buffer the value and args (last value wins)\n ref.pendingValue = newValue\n ref.pendingArgs = args\n ref.hasPending = true\n\n // Schedule flush if not already scheduled\n if (!ref.timeoutId) {\n const remainingTime = ms - timeSinceLastFlush\n ref.timeoutId = setTimeout(() => {\n ref.timeoutId = null\n ref.lastFlushTime = Date.now()\n if (ref.hasPending) {\n originalSetValue(\n ref.pendingValue as T,\n ...(ref.pendingArgs as Args),\n )\n ref.hasPending = false\n ref.pendingValue = undefined\n ref.pendingArgs = undefined\n }\n }, remainingTime)\n }\n },\n [originalSetValue, ms],\n )\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (throttleRef.current.timeoutId) {\n clearTimeout(throttleRef.current.timeoutId)\n }\n }\n }, [])\n\n return { ...rest, setValue } as TField\n}\n","import { useCallback, useMemo } from 'react'\n\n/**\n * Transform configuration for field values\n */\nexport interface TransformConfig<TStored, TDisplay> {\n /** Transform from stored value to display value */\n to: (stored: TStored) => TDisplay\n /** Transform from display value to stored value */\n from: (display: TDisplay) => TStored\n}\n\n/**\n * Minimal field interface that useTransformedField accepts\n */\nexport interface FieldInput<T> {\n value: T\n setValue: (v: T) => void\n}\n\n/**\n * Adds value transformation to any field hook.\n * Converts between storage format and display format.\n * Passes through any additional properties from the input field.\n *\n * @param field - Field hook with { value, setValue, ...rest }\n * @param config - Transform functions { to, from }\n * @returns Field with transformed types, plus any passthrough props\n *\n * @example\n * ```typescript\n * const field = useFieldStore('user.birthdate')\n * const formatted = useTransformedField(field, {\n * to: (iso) => format(new Date(iso), 'MM/dd/yyyy'),\n * from: (display) => parse(display, 'MM/dd/yyyy').toISOString()\n * })\n *\n * // formatted.value is \"01/15/2024\"\n * // formatted.setValue(\"01/20/2024\") stores ISO string\n * ```\n *\n * @example\n * ```typescript\n * // Works with buffered fields - passes through commit/cancel/isDirty\n * const field = useFieldStore('price')\n * const buffered = useBufferedField(field)\n * const formatted = useTransformedField(buffered, {\n * to: (cents) => (cents / 100).toFixed(2),\n * from: (dollars) => Math.round(parseFloat(dollars) * 100)\n * })\n *\n * formatted.setValue(\"15.99\") // local only\n * formatted.commit() // stores 1599\n * ```\n */\nexport const useTransformedField = <\n TStored,\n TDisplay,\n TField extends FieldInput<TStored>,\n>(\n field: TField,\n config: TransformConfig<TStored, TDisplay>,\n): Omit<TField, 'value' | 'setValue'> & FieldInput<TDisplay> => {\n const { value: storedValue, setValue: setStoredValue, ...rest } = field\n const { to, from } = config\n\n // Transform stored to display\n const value = useMemo(() => to(storedValue), [storedValue, to])\n\n // Transform display to stored on set\n const setValue = useCallback(\n (displayValue: TDisplay) => {\n const storedVal = from(displayValue)\n setStoredValue(storedVal)\n },\n [from, setStoredValue],\n )\n\n return { ...rest, value, setValue } as Omit<TField, 'value' | 'setValue'> &\n FieldInput<TDisplay>\n}\n","/**\n * Hash key utilities\n *\n * Utilities for working with hash key notation in Record-based paths.\n * Hash keys ([*]) are type-level markers for indexing into Records/HashMaps.\n *\n * @example\n * ```typescript\n * import { _, hashKey } from '@sladg/apex-state'\n *\n * // Use _ in template strings\n * const path = `users.${_('u1')}.posts.${_('p1')}.name`\n *\n * // Use hashKey namespace for validation\n * hashKey.rejectDynamic(path)\n * ```\n */\n\nimport type { HASH_KEY } from '../types'\n\n/**\n * Converts a concrete ID to hash key notation for inline template string usage\n * Returns the concrete ID typed as HASH_KEY for Record/HashMap indexing\n *\n * @param id - The concrete ID (e.g., \"u1\", \"p1\", \"c1\")\n * @returns The concrete ID typed as HASH_KEY\n *\n * @example\n * ```typescript\n * const path = `users.${_('u1')}.posts.${_('p1')}.name`\n * // → \"users.u1.posts.p1.name\" (typed as containing HASH_KEY)\n * ```\n */\nexport const _ = (id: string): HASH_KEY => id as HASH_KEY\n\n/**\n * Rejects paths with dynamic hash key notation [*]\n * Hash keys are for type-level path matching only, not runtime access\n *\n * @throws Error if path contains [*]\n *\n * @example\n * ```typescript\n * rejectDynamic('users.u1.posts.p1') // OK\n * rejectDynamic('users.[*].posts') // throws Error\n * ```\n */\nconst rejectDynamic = <P extends string>(path: P): void => {\n // Fast validation: check each part directly instead of scanning entire string\n const parts = path.split('.')\n for (const part of parts) {\n if (part === '[*]') {\n throw new Error(\n `Path contains [*] hash key which is not allowed in store operations. Use concrete paths only.`,\n )\n }\n }\n}\n\n/**\n * Hash key utilities namespace\n *\n * Provides utilities for working with hash keys in Record-based paths\n */\nexport const hashKey = {\n /** Reject paths with dynamic hash keys */\n rejectDynamic,\n /** Alias for _ function */\n _,\n} as const\n","/**\n * Apply Changes Utility\n *\n * Applies an array of changes to an object, returning a new object.\n */\n\nimport { deepClone } from 'valtio/utils'\n\nimport type { DeepKey, DeepValue } from '../types'\nimport { dot } from './dot'\n\n/** A change tuple: [path, value] or [path, value, anyMeta]. Meta is ignored. */\ntype AnyChange<DATA> = {\n [K in DeepKey<DATA>]:\n | [K, DeepValue<DATA, K>]\n | [K, DeepValue<DATA, K>, ...unknown[]]\n}[DeepKey<DATA>]\n\n/**\n * Applies changes to an object, returning a new object with changes applied.\n * Does not mutate the original object. Meta fields on change tuples are ignored.\n *\n * @param obj - Source object\n * @param changes - Array of [path, value] or [path, value, meta] tuples\n * @returns New object with changes applied\n *\n * @example\n * ```typescript\n * const state = { user: { name: 'Alice', age: 30 } }\n * const newState = applyChangesToObject(state, [\n * ['user.name', 'Bob'],\n * ['user.age', 31],\n * ])\n * // newState: { user: { name: 'Bob', age: 31 } }\n * // state is unchanged\n * ```\n */\nexport const applyChangesToObject = <T extends object>(\n obj: T,\n changes: AnyChange<T>[],\n): T => {\n // Deep clone the object — deepClone handles Proxy objects (structuredClone does not)\n const result = deepClone(obj)\n\n // Apply each change\n for (const [path, value] of changes) {\n dot.set__unsafe(result, path as string, value)\n }\n\n return result\n}\n"],"mappings":"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","names":["module","_clone","deepClone","_deepClone","changes","_","ptr","init_apex_state_wasm_bg","get_graph_snapshot","main","pipeline_create","pipeline_destroy","pipeline_finalize","pipeline_reset","pipeline_reset_all","process_changes","register_boollogic","register_concerns","register_side_effects","shadow_dump","shadow_init","unregister_boollogic","unregister_concerns","unregister_side_effects","module","imports","init_apex_state_wasm_bg","init_apex_state_wasm_bg","useLayoutEffect","snapshot","useSnapshot","changes","changes","snapshot","syncPairs","flipPairs","aggregationPairs","computationPairs","listeners","ref","snapshot","proxy","_deepClone","computed","listeners","changes","wasm","loadWasm","snapshot","instance","buildPathLabel","snapshot","jsx","proxy","pairs","useSnapshot","changes","snapshot","useLayoutEffect","useCallback","useState","useCallback","useRef","useCallback","useEffect","useRef","ref","useCallback","deepClone","changes","deepClone"]}
1
+ {"version":3,"sources":["../node_modules/@jsbits/deep-clone/umd/index.js","../rust/pkg/apex_state_wasm_bg.js","wasm-module:/home/runner/work/apex-state/apex-state/rust/pkg/apex_state_wasm_bg.wasm","../rust/pkg/apex_state_wasm.js","../src/store/create-store.ts","../src/concerns/prebuilts/index.ts","../src/utils/is.ts","../src/utils/dot.ts","../src/utils/bool-logic.ts","../src/concerns/prebuilts/disabled-when.ts","../src/utils/interpolation.ts","../src/concerns/prebuilts/dynamic-label.ts","../src/concerns/prebuilts/dynamic-placeholder.ts","../src/concerns/prebuilts/dynamic-tooltip.ts","../src/concerns/prebuilts/readonly-when.ts","../src/concerns/prebuilts/validation-state.ts","../src/concerns/prebuilts/visible-when.ts","../src/concerns/registry.ts","../src/concerns/registration.wasm-impl.ts","../src/core/context.ts","../src/pipeline/process-changes.wasm-impl.ts","../src/pipeline/apply-batch.ts","../src/sideEffects/registration.wasm-impl.ts","../src/types/pairs.ts","../src/utils/filter-concerns.ts","../src/store/provider.tsx","../src/core/defaults.ts","../src/utils/deep-clone.ts","../src/utils/deep-merge.ts","../src/utils/derive-values.ts","../src/utils/log.ts","../src/wasm/lifecycle.tsx","../src/utils/json.ts","../src/wasm/bridge.ts","../src/store/devtools.ts","../package.json","../src/utils/pair-helpers.ts","../src/store/warm-pair-helpers.ts","../src/hooks/use-buffered-field.ts","../src/hooks/use-keyboard-select.ts","../src/hooks/use-throttled-field.ts","../src/hooks/use-transformed-field.ts","../src/utils/hash-key.ts","../src/utils/apply-changes.ts"],"sourcesContent":["/*\n @jsbits/deep-clone\n @author aMarCruz\n @version 1.1.1 UMD+ES5\n @license MIT\n*/\n/* eslint-disable */\n;(function(root, factory) {\n if (typeof define == 'function' && define.amd) {\n define([], factory)\n } else if (typeof module == 'object' && module.exports) {\n module.exports = factory()\n } else {\n ((root.$ || root.jQuery || {}).jsbits || root.jsbits || (root.jsbits={})).deepClone = factory()\n }\n})(typeof self !== 'undefined' ? self : this, function () {\n \"use strict\";\n var _a;\n var _nodejs = (function () {\n var g = typeof global === 'object' && global;\n var m = g && g.process &&\n typeof g.Buffer === 'function' && /^v?(\\d+)/.exec(g.process.version);\n return (m && m[1]) | 0;\n })();\n var _OP = Object.prototype;\n var _toString = _OP.toString;\n var _ownKeys = typeof Reflect === 'object' &&\n typeof Reflect.ownKeys === 'function' && Reflect.ownKeys;\n var clonable = {\n Date: 1 ,\n RegExp: 1 ,\n String: 1 ,\n Number: 1 ,\n Boolean: 1 ,\n Float32Array: 1 ,\n Float64Array: 1 ,\n Int8Array: 1 ,\n Int16Array: 1 ,\n Int32Array: 1 ,\n Uint8Array: 1 ,\n Uint8ClampedArray: 1 ,\n Uint16Array: 1 ,\n Uint32Array: 1 ,\n Array: 2 ,\n ArrayBuffer: 3 ,\n SharedArrayBuffer: 3 ,\n DataView: 4 ,\n Error: 6 ,\n Map: 5 ,\n Set: 5 ,\n Arguments: 7 ,\n Atomics: 8 ,\n JSON: 8 ,\n Math: 8 ,\n Promise: 8 ,\n WeakMap: 8 ,\n WeakSet: 8 ,\n XMLHttpRequest: 8 ,\n };\n var arrayLike = [\n 'Array',\n 'String',\n 'Float32Array',\n 'Float64Array',\n 'Int8Array',\n 'Int16Array',\n 'Int32Array',\n 'Uint8Array',\n 'Uint8ClampedArray',\n 'Uint16Array',\n 'Uint32Array',\n ];\n var getKeyGetter = function (exact) {\n // istanbul ignore next\n var _keys = exact ? Object.getOwnPropertyNames : Object.keys;\n var _getSymbols = Object.getOwnPropertySymbols;\n // istanbul ignore next: until we can test IE11\n if (!_getSymbols) {\n return _keys;\n }\n // istanbul ignore if: until we can test IE11\n if (exact) {\n return function (obj) { return _keys(obj).concat(_getSymbols(obj)); };\n }\n var _isEnum = _OP.propertyIsEnumerable;\n return function (obj) {\n var objkeys = _keys(obj);\n var symbols = _getSymbols(obj);\n for (var i = 0; i < symbols.length; i++) {\n if (_isEnum.call(obj, symbols[i])) {\n objkeys.push(symbols[i]);\n }\n }\n return objkeys;\n };\n };\n var getKeysFac = function (exact) {\n var _filtIdx = function (prop) { return prop !== '0' && (prop | 0) <= 0 && prop !== 'length'; };\n var _getKeys = exact && _ownKeys || getKeyGetter(exact);\n return function (obj, type) {\n var objkeys = _getKeys(obj);\n return ~arrayLike.indexOf(type) ? objkeys.filter(_filtIdx) : objkeys;\n };\n };\n var cloneMapOrSet = function (src, fn, type) {\n var dest = new src.constructor();\n var cb = type === 'Set'\n ? function (v) { this.add(fn(v)); }\n : function (v, k) { this.set(fn(k), fn(v)); };\n src.forEach(cb, dest);\n return dest;\n };\n var cloneDataView = function (src) {\n var buffer = src.buffer.slice(0);\n return new src.constructor(buffer, src.byteOffset, src.byteLength);\n };\n var cloneError = function (src) {\n var err = new src.constructor(src.message);\n return Object.defineProperty(err, 'stack', {\n value: src.stack, configurable: true, writable: true,\n });\n };\n var cloneArguments = function (src) {\n var args = Object.create(null);\n return Object.defineProperty(args, 'length', {\n value: src.length, configurable: true, writable: true,\n });\n };\n var cloneArray = function (src, fn) { return src.map(fn); };\n var cloneFn = (_a = {},\n _a[8 ] = function (obj) { return obj; },\n _a[7 ] = cloneArguments,\n _a[2 ] = cloneArray,\n _a[3 ] = function (obj) { return obj.slice(0); },\n _a[4 ] = cloneDataView,\n _a[6 ] = cloneError,\n _a[5 ] = cloneMapOrSet,\n _a);\n var createObject = function (obj, type, fn) {\n var cloneType = clonable[type];\n if (cloneType === 1 ) {\n return obj.slice && _nodejs && Buffer.isBuffer(obj)\n ? obj.slice(0)\n : new obj.constructor(obj.valueOf());\n }\n if (cloneFn[cloneType]) {\n return cloneFn[cloneType](obj, fn, type);\n }\n return type.lastIndexOf(' Iterator', type.length - 9) > -1\n ? obj : Object.create(Object.getPrototypeOf(obj));\n };\n var getObjectType = (function () {\n var _getTag = function (obj) { return _toString.call(obj).slice(8, -1); };\n // istanbul ignore else\n if (!_nodejs || _nodejs >= 5) {\n return _getTag;\n }\n // istanbul ignore next\n return function (obj) {\n var tag = _getTag(obj);\n return tag === 'Object' && obj.constructor && obj.constructor.name === 'Promise'\n ? 'Promise' : tag;\n };\n })();\n var cloneFac = function (getKeys) {\n var _clone = function _clone(obj) {\n if (!obj || typeof obj !== 'object') {\n return obj;\n }\n var type = getObjectType(obj);\n var clone = createObject(obj, type, _clone);\n var props = getKeys(obj, type);\n for (var i = 0; i < props.length; i++) {\n var prop = props[i];\n var desc = Object.getOwnPropertyDescriptor(obj, prop);\n if (desc.value !== undefined) {\n desc.value = _clone(obj[prop]);\n }\n Object.defineProperty(clone, prop, desc);\n }\n return clone;\n };\n return _clone;\n };\n var looseClone = cloneFac(getKeysFac(false));\n var exactClone = cloneFac(getKeysFac(true));\n var deepClone = function _deepClone(value, exact) {\n return exact ? exactClone(value) : looseClone(value);\n };\n return deepClone;\n});\n","export function init() {\n wasm.init();\n}\n\n/**\n * Create a new isolated pipeline instance. Returns the pipeline ID.\n *\n * Accepts an optional options object with:\n * - `debug` (bool): Enable WASM-side trace collection from creation.\n * @param {any | null} [options]\n * @returns {number}\n */\nexport function pipeline_create(options) {\n const ret = wasm.pipeline_create(isLikeNone(options) ? 0 : addToExternrefTable0(options));\n return ret >>> 0;\n}\n\n/**\n * Destroy a pipeline instance, freeing all its state.\n * @param {number} pipeline_id\n */\nexport function pipeline_destroy(pipeline_id) {\n wasm.pipeline_destroy(pipeline_id);\n}\n\n/**\n * Reset the entire pipeline to a fresh state (testing only).\n *\n * Clears all internal state: shadow, registrations, graphs, router, BoolLogic registry.\n * Call this between tests to ensure isolation.\n * @param {number} pipeline_id\n */\nexport function pipeline_reset(pipeline_id) {\n wasm.pipeline_reset(pipeline_id);\n}\n\n/**\n * Reset ALL pipelines and the ID counter (testing only).\n */\nexport function pipeline_reset_all() {\n wasm.pipeline_reset_all();\n}\n\n/**\n * Process a batch of state changes through the full pipeline (EP17).\n *\n * ```text\n * input changes\n * │\n * ▼\n * ┌──────────────────┐\n * │ diff pre-pass │ ← filter no-ops against shadow\n * └────────┬─────────┘\n * ▼\n * ┌──────────────────┐\n * │ propagation │ ← aggregation → sync → flip → clear → derived\n * └────────┬─────────┘\n * ▼\n * ┌──────────────────┐\n * │ BoolLogic eval │ ← reverse index → re-evaluate affected expressions\n * └────────┬─────────┘\n * ▼\n * ┌──────────────────┐\n * │ listener waves │ ← externref dispatch via JsFn::call2, wave-by-wave\n * └────────┬─────────┘\n * ▼\n * ProcessResult { changes, listener_errors }\n * ```\n *\n * Input: JS array of `{ path: \"...\", value_json: \"...\" }`\n * Output: JS object `{ changes: [...], listener_errors: [...] }`\n * @param {number} pipeline_id\n * @param {any} changes\n * @returns {any}\n */\nexport function process_changes(pipeline_id, changes) {\n const ret = wasm.process_changes(pipeline_id, changes);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n}\n\n/**\n * Register a BoolLogic expression. Returns logic_id for cleanup.\n *\n * - `output_path`: full concern path, e.g. `_concerns.user.email.disabledWhen`\n * - `tree_json`: JSON string of the BoolLogic tree, e.g. `{\"IS_EQUAL\": [\"user.role\", \"admin\"]}`\n * @param {number} pipeline_id\n * @param {string} output_path\n * @param {string} tree_json\n * @returns {number}\n */\nexport function register_boollogic(pipeline_id, output_path, tree_json) {\n const ptr0 = passStringToWasm0(output_path, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passStringToWasm0(tree_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.register_boollogic(pipeline_id, ptr0, len0, ptr1, len1);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return ret[0] >>> 0;\n}\n\n/**\n * Register expressions and listener-wrapped subscribers.\n *\n * Expressions (logic, value) produce changes via evaluation.\n * Subscribers registered here with function refs are dispatched as listeners\n * (wave 200 by default) via externref — WASM treats them identically to listeners.\n *\n * `subscriber_fns`: `{ [subscriber_id: string]: [name: string, Function] }` — same format as listener_fns\n * @param {number} pipeline_id\n * @param {any} registration\n * @param {Map<any, any>} subscriber_fns\n * @returns {any}\n */\nexport function register_concerns(pipeline_id, registration, subscriber_fns) {\n const ret = wasm.register_concerns(pipeline_id, registration, subscriber_fns);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n}\n\n/**\n * Register all side effects at once (sync, flip, aggregation, listeners).\n *\n * Consolidates sync pairs, flip pairs, aggregations, and listeners into a single WASM call.\n * Computes initial changes from shadow state and returns listener IDs for cleanup tracking.\n *\n * **Input JSON Format:**\n * ```json\n * {\n * \"registration_id\": \"my-effects\",\n * \"sync_pairs\": [[\"user.email\", \"profile.email\"], [\"user.name\", \"profile.name\"]],\n * \"flip_pairs\": [[\"settings.darkMode\", \"settings.lightMode\"]],\n * \"aggregation_pairs\": [[\"totals.sum\", \"items.0.price\"], [\"totals.sum\", \"items.1.price\"]],\n * \"listeners\": [\n * {\"subscriber_id\": 100, \"topic_path\": \"user\", \"scope_path\": \"user\"},\n * {\"subscriber_id\": 101, \"topic_path\": \"settings.darkMode\", \"scope_path\": \"settings\"}\n * ]\n * }\n * ```\n *\n * **Output JSON Format:**\n * ```json\n * {\n * \"sync_changes\": [\n * {\"path\": \"profile.email\", \"value_json\": \"\\\"alice@example.com\\\"\"},\n * {\"path\": \"profile.name\", \"value_json\": \"\\\"Alice\\\"\"}\n * ],\n * \"aggregation_changes\": [\n * {\"path\": \"totals.sum\", \"value_json\": \"100\"}\n * ],\n * \"registered_listener_ids\": [100, 101]\n * }\n * ```\n *\n * **Example Behavior:**\n * - **sync_changes**: Computed from shadow state. If user.email=\"alice@test.com\" and\n * profile.email is empty, returns change to set profile.email to match.\n * - **aggregation_changes**: Reads source paths from shadow state and computes initial\n * target value. If items exist, aggregates their values (e.g., sums prices).\n * - **registered_listener_ids**: Echo of the input subscriber_ids for cleanup tracking.\n * - **flip_pairs**: Registered silently, no changes returned (used for bidirectional toggling).\n *\n * All registrations happen atomically in a single WASM call, reducing JS↔WASM boundary crossings.\n * @param {number} pipeline_id\n * @param {any} registration\n * @param {Map<any, any>} subscriber_fns\n * @returns {any}\n */\nexport function register_side_effects(pipeline_id, registration, subscriber_fns) {\n const ret = wasm.register_side_effects(pipeline_id, registration, subscriber_fns);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n}\n\n/**\n * Dump shadow state as JSON (debug/testing).\n * @param {number} pipeline_id\n * @returns {string}\n */\nexport function shadow_dump(pipeline_id) {\n let deferred2_0;\n let deferred2_1;\n try {\n const ret = wasm.shadow_dump(pipeline_id);\n var ptr1 = ret[0];\n var len1 = ret[1];\n if (ret[3]) {\n ptr1 = 0; len1 = 0;\n throw takeFromExternrefTable0(ret[2]);\n }\n deferred2_0 = ptr1;\n deferred2_1 = len1;\n return getStringFromWasm0(ptr1, len1);\n } finally {\n wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);\n }\n}\n\n/**\n * Initialize shadow state from a JSON string (produced by fastStringify on the JS side).\n *\n * Uses the JSON string path so that `undefined` values encoded as the\n * `__APEX_UNDEFINED__` sentinel survive the boundary crossing consistently\n * (serde-wasm-bindgen would convert JS `undefined` to `null` instead).\n * @param {number} pipeline_id\n * @param {string} state_json\n */\nexport function shadow_init(pipeline_id, state_json) {\n const ptr0 = passStringToWasm0(state_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.shadow_init(pipeline_id, ptr0, len0);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n}\n\n/**\n * Unregister a BoolLogic expression by its logic_id.\n * @param {number} pipeline_id\n * @param {number} logic_id\n */\nexport function unregister_boollogic(pipeline_id, logic_id) {\n const ret = wasm.unregister_boollogic(pipeline_id, logic_id);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n}\n\n/**\n * Unregister concerns by registration ID (placeholder).\n *\n * Currently a no-op. In future, could track registrations for bulk cleanup.\n * @param {number} pipeline_id\n * @param {string} registration_id\n */\nexport function unregister_concerns(pipeline_id, registration_id) {\n const ptr0 = passStringToWasm0(registration_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.unregister_concerns(pipeline_id, ptr0, len0);\n if (ret[1]) {\n throw takeFromExternrefTable0(ret[0]);\n }\n}\n\n/**\n * Unregister side effects by registration ID.\n *\n * Returns the same `SideEffectsResult` shape as register (with empty change arrays).\n * `listener_names` reflects all remaining listeners after removal.\n * @param {number} pipeline_id\n * @param {string} registration_id\n * @returns {any}\n */\nexport function unregister_side_effects(pipeline_id, registration_id) {\n const ptr0 = passStringToWasm0(registration_id, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.unregister_side_effects(pipeline_id, ptr0, len0);\n if (ret[2]) {\n throw takeFromExternrefTable0(ret[1]);\n }\n return takeFromExternrefTable0(ret[0]);\n}\nexport function __wbg_Error_8c4e43fe74559d73(arg0, arg1) {\n const ret = Error(getStringFromWasm0(arg0, arg1));\n return ret;\n}\nexport function __wbg_Number_04624de7d0e8332d(arg0) {\n const ret = Number(arg0);\n return ret;\n}\nexport function __wbg_String_8f0eb39a4a4c2f66(arg0, arg1) {\n const ret = String(arg1);\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n}\nexport function __wbg___wbindgen_bigint_get_as_i64_8fcf4ce7f1ca72a2(arg0, arg1) {\n const v = arg1;\n const ret = typeof(v) === 'bigint' ? v : undefined;\n getDataViewMemory0().setBigInt64(arg0 + 8 * 1, isLikeNone(ret) ? BigInt(0) : ret, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true);\n}\nexport function __wbg___wbindgen_boolean_get_bbbb1c18aa2f5e25(arg0) {\n const v = arg0;\n const ret = typeof(v) === 'boolean' ? v : undefined;\n return isLikeNone(ret) ? 0xFFFFFF : ret ? 1 : 0;\n}\nexport function __wbg___wbindgen_debug_string_0bc8482c6e3508ae(arg0, arg1) {\n const ret = debugString(arg1);\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n}\nexport function __wbg___wbindgen_in_47fa6863be6f2f25(arg0, arg1) {\n const ret = arg0 in arg1;\n return ret;\n}\nexport function __wbg___wbindgen_is_bigint_31b12575b56f32fc(arg0) {\n const ret = typeof(arg0) === 'bigint';\n return ret;\n}\nexport function __wbg___wbindgen_is_function_0095a73b8b156f76(arg0) {\n const ret = typeof(arg0) === 'function';\n return ret;\n}\nexport function __wbg___wbindgen_is_null_ac34f5003991759a(arg0) {\n const ret = arg0 === null;\n return ret;\n}\nexport function __wbg___wbindgen_is_object_5ae8e5880f2c1fbd(arg0) {\n const val = arg0;\n const ret = typeof(val) === 'object' && val !== null;\n return ret;\n}\nexport function __wbg___wbindgen_is_string_cd444516edc5b180(arg0) {\n const ret = typeof(arg0) === 'string';\n return ret;\n}\nexport function __wbg___wbindgen_is_undefined_9e4d92534c42d778(arg0) {\n const ret = arg0 === undefined;\n return ret;\n}\nexport function __wbg___wbindgen_jsval_eq_11888390b0186270(arg0, arg1) {\n const ret = arg0 === arg1;\n return ret;\n}\nexport function __wbg___wbindgen_jsval_loose_eq_9dd77d8cd6671811(arg0, arg1) {\n const ret = arg0 == arg1;\n return ret;\n}\nexport function __wbg___wbindgen_number_get_8ff4255516ccad3e(arg0, arg1) {\n const obj = arg1;\n const ret = typeof(obj) === 'number' ? obj : undefined;\n getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true);\n}\nexport function __wbg___wbindgen_string_get_72fb696202c56729(arg0, arg1) {\n const obj = arg1;\n const ret = typeof(obj) === 'string' ? obj : undefined;\n var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n var len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n}\nexport function __wbg___wbindgen_throw_be289d5034ed271b(arg0, arg1) {\n throw new Error(getStringFromWasm0(arg0, arg1));\n}\nexport function __wbg_call_389efe28435a9388() { return handleError(function (arg0, arg1) {\n const ret = arg0.call(arg1);\n return ret;\n}, arguments); }\nexport function __wbg_call_812d25f1510c13c8() { return handleError(function (arg0, arg1, arg2, arg3) {\n const ret = arg0.call(arg1, arg2, arg3);\n return ret;\n}, arguments); }\nexport function __wbg_done_57b39ecd9addfe81(arg0) {\n const ret = arg0.done;\n return ret;\n}\nexport function __wbg_entries_58c7934c745daac7(arg0) {\n const ret = Object.entries(arg0);\n return ret;\n}\nexport function __wbg_error_7534b8e9a36f1ab4(arg0, arg1) {\n let deferred0_0;\n let deferred0_1;\n try {\n deferred0_0 = arg0;\n deferred0_1 = arg1;\n console.error(getStringFromWasm0(arg0, arg1));\n } finally {\n wasm.__wbindgen_free(deferred0_0, deferred0_1, 1);\n }\n}\nexport function __wbg_from_bddd64e7d5ff6941(arg0) {\n const ret = Array.from(arg0);\n return ret;\n}\nexport function __wbg_get_9b94d73e6221f75c(arg0, arg1) {\n const ret = arg0[arg1 >>> 0];\n return ret;\n}\nexport function __wbg_get_b3ed3ad4be2bc8ac() { return handleError(function (arg0, arg1) {\n const ret = Reflect.get(arg0, arg1);\n return ret;\n}, arguments); }\nexport function __wbg_get_c60162cf03da5a6e(arg0, arg1) {\n const ret = arg0.get(arg1);\n return ret;\n}\nexport function __wbg_get_with_ref_key_1dc361bd10053bfe(arg0, arg1) {\n const ret = arg0[arg1];\n return ret;\n}\nexport function __wbg_instanceof_ArrayBuffer_c367199e2fa2aa04(arg0) {\n let result;\n try {\n result = arg0 instanceof ArrayBuffer;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n}\nexport function __wbg_instanceof_Map_53af74335dec57f4(arg0) {\n let result;\n try {\n result = arg0 instanceof Map;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n}\nexport function __wbg_instanceof_Uint8Array_9b9075935c74707c(arg0) {\n let result;\n try {\n result = arg0 instanceof Uint8Array;\n } catch (_) {\n result = false;\n }\n const ret = result;\n return ret;\n}\nexport function __wbg_isArray_d314bb98fcf08331(arg0) {\n const ret = Array.isArray(arg0);\n return ret;\n}\nexport function __wbg_isSafeInteger_bfbc7332a9768d2a(arg0) {\n const ret = Number.isSafeInteger(arg0);\n return ret;\n}\nexport function __wbg_iterator_6ff6560ca1568e55() {\n const ret = Symbol.iterator;\n return ret;\n}\nexport function __wbg_keys_0eee252dfbfa253e(arg0) {\n const ret = arg0.keys();\n return ret;\n}\nexport function __wbg_length_32ed9a279acd054c(arg0) {\n const ret = arg0.length;\n return ret;\n}\nexport function __wbg_length_35a7bace40f36eac(arg0) {\n const ret = arg0.length;\n return ret;\n}\nexport function __wbg_name_07a54d72942d5492(arg0) {\n const ret = arg0.name;\n return ret;\n}\nexport function __wbg_new_361308b2356cecd0() {\n const ret = new Object();\n return ret;\n}\nexport function __wbg_new_3eb36ae241fe6f44() {\n const ret = new Array();\n return ret;\n}\nexport function __wbg_new_8a6f238a6ece86ea() {\n const ret = new Error();\n return ret;\n}\nexport function __wbg_new_dca287b076112a51() {\n const ret = new Map();\n return ret;\n}\nexport function __wbg_new_dd2b680c8bf6ae29(arg0) {\n const ret = new Uint8Array(arg0);\n return ret;\n}\nexport function __wbg_new_no_args_1c7c842f08d00ebb(arg0, arg1) {\n const ret = new Function(getStringFromWasm0(arg0, arg1));\n return ret;\n}\nexport function __wbg_new_with_length_1763c527b2923202(arg0) {\n const ret = new Array(arg0 >>> 0);\n return ret;\n}\nexport function __wbg_next_3482f54c49e8af19() { return handleError(function (arg0) {\n const ret = arg0.next();\n return ret;\n}, arguments); }\nexport function __wbg_next_418f80d8f5303233(arg0) {\n const ret = arg0.next;\n return ret;\n}\nexport function __wbg_now_2c95c9de01293173(arg0) {\n const ret = arg0.now();\n return ret;\n}\nexport function __wbg_parse_708461a1feddfb38() { return handleError(function (arg0, arg1) {\n const ret = JSON.parse(getStringFromWasm0(arg0, arg1));\n return ret;\n}, arguments); }\nexport function __wbg_performance_7a3ffd0b17f663ad(arg0) {\n const ret = arg0.performance;\n return ret;\n}\nexport function __wbg_prototypesetcall_bdcdcc5842e4d77d(arg0, arg1, arg2) {\n Uint8Array.prototype.set.call(getArrayU8FromWasm0(arg0, arg1), arg2);\n}\nexport function __wbg_push_8ffdcb2063340ba5(arg0, arg1) {\n const ret = arg0.push(arg1);\n return ret;\n}\nexport function __wbg_set_1eb0999cf5d27fc8(arg0, arg1, arg2) {\n const ret = arg0.set(arg1, arg2);\n return ret;\n}\nexport function __wbg_set_3f1d0b984ed272ed(arg0, arg1, arg2) {\n arg0[arg1] = arg2;\n}\nexport function __wbg_set_6cb8631f80447a67() { return handleError(function (arg0, arg1, arg2) {\n const ret = Reflect.set(arg0, arg1, arg2);\n return ret;\n}, arguments); }\nexport function __wbg_set_f43e577aea94465b(arg0, arg1, arg2) {\n arg0[arg1 >>> 0] = arg2;\n}\nexport function __wbg_stack_0ed75d68575b0f3c(arg0, arg1) {\n const ret = arg1.stack;\n const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);\n const len1 = WASM_VECTOR_LEN;\n getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true);\n getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true);\n}\nexport function __wbg_static_accessor_GLOBAL_12837167ad935116() {\n const ret = typeof global === 'undefined' ? null : global;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n}\nexport function __wbg_static_accessor_GLOBAL_THIS_e628e89ab3b1c95f() {\n const ret = typeof globalThis === 'undefined' ? null : globalThis;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n}\nexport function __wbg_static_accessor_SELF_a621d3dfbb60d0ce() {\n const ret = typeof self === 'undefined' ? null : self;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n}\nexport function __wbg_static_accessor_WINDOW_f8727f0cf888e0bd() {\n const ret = typeof window === 'undefined' ? null : window;\n return isLikeNone(ret) ? 0 : addToExternrefTable0(ret);\n}\nexport function __wbg_stringify_8d1cc6ff383e8bae() { return handleError(function (arg0) {\n const ret = JSON.stringify(arg0);\n return ret;\n}, arguments); }\nexport function __wbg_value_0546255b415e96c1(arg0) {\n const ret = arg0.value;\n return ret;\n}\nexport function __wbindgen_cast_0000000000000001(arg0) {\n // Cast intrinsic for `F64 -> Externref`.\n const ret = arg0;\n return ret;\n}\nexport function __wbindgen_cast_0000000000000002(arg0) {\n // Cast intrinsic for `I64 -> Externref`.\n const ret = arg0;\n return ret;\n}\nexport function __wbindgen_cast_0000000000000003(arg0, arg1) {\n // Cast intrinsic for `Ref(String) -> Externref`.\n const ret = getStringFromWasm0(arg0, arg1);\n return ret;\n}\nexport function __wbindgen_cast_0000000000000004(arg0) {\n // Cast intrinsic for `U64 -> Externref`.\n const ret = BigInt.asUintN(64, arg0);\n return ret;\n}\nexport function __wbindgen_init_externref_table() {\n const table = wasm.__wbindgen_externrefs;\n const offset = table.grow(4);\n table.set(0, undefined);\n table.set(offset + 0, undefined);\n table.set(offset + 1, null);\n table.set(offset + 2, true);\n table.set(offset + 3, false);\n}\nexport function __wbindgen_object_is_undefined(arg0) {\n const ret = arg0 === undefined;\n return ret;\n}\nfunction addToExternrefTable0(obj) {\n const idx = wasm.__externref_table_alloc();\n wasm.__wbindgen_externrefs.set(idx, obj);\n return idx;\n}\n\nfunction debugString(val) {\n // primitive types\n const type = typeof val;\n if (type == 'number' || type == 'boolean' || val == null) {\n return `${val}`;\n }\n if (type == 'string') {\n return `\"${val}\"`;\n }\n if (type == 'symbol') {\n const description = val.description;\n if (description == null) {\n return 'Symbol';\n } else {\n return `Symbol(${description})`;\n }\n }\n if (type == 'function') {\n const name = val.name;\n if (typeof name == 'string' && name.length > 0) {\n return `Function(${name})`;\n } else {\n return 'Function';\n }\n }\n // objects\n if (Array.isArray(val)) {\n const length = val.length;\n let debug = '[';\n if (length > 0) {\n debug += debugString(val[0]);\n }\n for(let i = 1; i < length; i++) {\n debug += ', ' + debugString(val[i]);\n }\n debug += ']';\n return debug;\n }\n // Test for built-in\n const builtInMatches = /\\[object ([^\\]]+)\\]/.exec(toString.call(val));\n let className;\n if (builtInMatches && builtInMatches.length > 1) {\n className = builtInMatches[1];\n } else {\n // Failed to match the standard '[object ClassName]'\n return toString.call(val);\n }\n if (className == 'Object') {\n // we're a user defined class or Object\n // JSON.stringify avoids problems with cycles, and is generally much\n // easier than looping through ownProperties of `val`.\n try {\n return 'Object(' + JSON.stringify(val) + ')';\n } catch (_) {\n return 'Object';\n }\n }\n // errors\n if (val instanceof Error) {\n return `${val.name}: ${val.message}\\n${val.stack}`;\n }\n // TODO we could test for more things here, like `Set`s and `Map`s.\n return className;\n}\n\nfunction getArrayU8FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len);\n}\n\nlet cachedDataViewMemory0 = null;\nfunction getDataViewMemory0() {\n if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) {\n cachedDataViewMemory0 = new DataView(wasm.memory.buffer);\n }\n return cachedDataViewMemory0;\n}\n\nfunction getStringFromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return decodeText(ptr, len);\n}\n\nlet cachedUint8ArrayMemory0 = null;\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction handleError(f, args) {\n try {\n return f.apply(this, args);\n } catch (e) {\n const idx = addToExternrefTable0(e);\n wasm.__wbindgen_exn_store(idx);\n }\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n\nfunction passStringToWasm0(arg, malloc, realloc) {\n if (realloc === undefined) {\n const buf = cachedTextEncoder.encode(arg);\n const ptr = malloc(buf.length, 1) >>> 0;\n getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);\n WASM_VECTOR_LEN = buf.length;\n return ptr;\n }\n\n let len = arg.length;\n let ptr = malloc(len, 1) >>> 0;\n\n const mem = getUint8ArrayMemory0();\n\n let offset = 0;\n\n for (; offset < len; offset++) {\n const code = arg.charCodeAt(offset);\n if (code > 0x7F) break;\n mem[ptr + offset] = code;\n }\n if (offset !== len) {\n if (offset !== 0) {\n arg = arg.slice(offset);\n }\n ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;\n const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);\n const ret = cachedTextEncoder.encodeInto(arg, view);\n\n offset += ret.written;\n ptr = realloc(ptr, len, offset, 1) >>> 0;\n }\n\n WASM_VECTOR_LEN = offset;\n return ptr;\n}\n\nfunction takeFromExternrefTable0(idx) {\n const value = wasm.__wbindgen_externrefs.get(idx);\n wasm.__externref_table_dealloc(idx);\n return value;\n}\n\nlet cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\ncachedTextDecoder.decode();\nconst MAX_SAFARI_DECODE_BYTES = 2146435072;\nlet numBytesDecoded = 0;\nfunction decodeText(ptr, len) {\n numBytesDecoded += len;\n if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {\n cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n cachedTextDecoder.decode();\n numBytesDecoded = len;\n }\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nconst cachedTextEncoder = new TextEncoder();\n\nif (!('encodeInto' in cachedTextEncoder)) {\n cachedTextEncoder.encodeInto = function (arg, view) {\n const buf = cachedTextEncoder.encode(arg);\n view.set(buf);\n return {\n read: arg.length,\n written: buf.length\n };\n };\n}\n\nlet WASM_VECTOR_LEN = 0;\n\n\nlet wasm;\nexport function __wbg_set_wasm(val) {\n wasm = val;\n}\n","\n import wasmModule from \"/home/runner/work/apex-state/apex-state/rust/pkg/apex_state_wasm_bg.wasm\";\n\n \n // Import from JS modules\n import { __wbindgen_object_is_undefined, __wbg_new_8a6f238a6ece86ea, __wbg_stack_0ed75d68575b0f3c, __wbg_error_7534b8e9a36f1ab4, __wbg_performance_7a3ffd0b17f663ad, __wbg_now_2c95c9de01293173, __wbg_get_with_ref_key_1dc361bd10053bfe, __wbg_set_3f1d0b984ed272ed, __wbg_String_8f0eb39a4a4c2f66, __wbg_new_dca287b076112a51, __wbg_new_3eb36ae241fe6f44, __wbg_new_361308b2356cecd0, __wbg_new_no_args_1c7c842f08d00ebb, __wbg_new_dd2b680c8bf6ae29, __wbg_length_32ed9a279acd054c, __wbg_prototypesetcall_bdcdcc5842e4d77d, __wbg_done_57b39ecd9addfe81, __wbg_value_0546255b415e96c1, __wbg_instanceof_Map_53af74335dec57f4, __wbg_instanceof_Uint8Array_9b9075935c74707c, __wbg_instanceof_ArrayBuffer_c367199e2fa2aa04, __wbg_get_c60162cf03da5a6e, __wbg_set_1eb0999cf5d27fc8, __wbg_keys_0eee252dfbfa253e, __wbg_parse_708461a1feddfb38, __wbg_stringify_8d1cc6ff383e8bae, __wbg_new_with_length_1763c527b2923202, __wbg_get_9b94d73e6221f75c, __wbg_set_f43e577aea94465b, __wbg_from_bddd64e7d5ff6941, __wbg_length_35a7bace40f36eac, __wbg_push_8ffdcb2063340ba5, __wbg_isArray_d314bb98fcf08331, __wbg_isSafeInteger_bfbc7332a9768d2a, __wbg_entries_58c7934c745daac7, __wbg_iterator_6ff6560ca1568e55, __wbg_static_accessor_GLOBAL_THIS_e628e89ab3b1c95f, __wbg_call_389efe28435a9388, __wbg_static_accessor_SELF_a621d3dfbb60d0ce, __wbg_static_accessor_GLOBAL_12837167ad935116, __wbg_static_accessor_WINDOW_f8727f0cf888e0bd, __wbg_get_b3ed3ad4be2bc8ac, __wbg_set_6cb8631f80447a67, __wbg_name_07a54d72942d5492, __wbg_call_812d25f1510c13c8, __wbg_next_418f80d8f5303233, __wbg_next_3482f54c49e8af19, __wbg___wbindgen_string_get_72fb696202c56729, __wbg___wbindgen_number_get_8ff4255516ccad3e, __wbg___wbindgen_in_47fa6863be6f2f25, __wbg___wbindgen_throw_be289d5034ed271b, __wbg___wbindgen_is_null_ac34f5003991759a, __wbg___wbindgen_jsval_eq_11888390b0186270, __wbg_Number_04624de7d0e8332d, __wbg_Error_8c4e43fe74559d73, __wbg___wbindgen_is_bigint_31b12575b56f32fc, __wbg___wbindgen_is_object_5ae8e5880f2c1fbd, __wbg___wbindgen_is_string_cd444516edc5b180, __wbg___wbindgen_boolean_get_bbbb1c18aa2f5e25, __wbg___wbindgen_is_function_0095a73b8b156f76, __wbg___wbindgen_is_undefined_9e4d92534c42d778, __wbg___wbindgen_jsval_loose_eq_9dd77d8cd6671811, __wbg___wbindgen_bigint_get_as_i64_8fcf4ce7f1ca72a2, __wbg___wbindgen_debug_string_0bc8482c6e3508ae, __wbindgen_init_externref_table, __wbindgen_cast_0000000000000001, __wbindgen_cast_0000000000000002, __wbindgen_cast_0000000000000003, __wbindgen_cast_0000000000000004 } from \"./apex_state_wasm_bg.js\";\n\n // Build the WASM import object\n const imports = {\n [\"./apex_state_wasm_bg.js\"]: {\n __wbindgen_object_is_undefined,\n__wbg_new_8a6f238a6ece86ea,\n__wbg_stack_0ed75d68575b0f3c,\n__wbg_error_7534b8e9a36f1ab4,\n__wbg_performance_7a3ffd0b17f663ad,\n__wbg_now_2c95c9de01293173,\n__wbg_get_with_ref_key_1dc361bd10053bfe,\n__wbg_set_3f1d0b984ed272ed,\n__wbg_String_8f0eb39a4a4c2f66,\n__wbg_new_dca287b076112a51,\n__wbg_new_3eb36ae241fe6f44,\n__wbg_new_361308b2356cecd0,\n__wbg_new_no_args_1c7c842f08d00ebb,\n__wbg_new_dd2b680c8bf6ae29,\n__wbg_length_32ed9a279acd054c,\n__wbg_prototypesetcall_bdcdcc5842e4d77d,\n__wbg_done_57b39ecd9addfe81,\n__wbg_value_0546255b415e96c1,\n__wbg_instanceof_Map_53af74335dec57f4,\n__wbg_instanceof_Uint8Array_9b9075935c74707c,\n__wbg_instanceof_ArrayBuffer_c367199e2fa2aa04,\n__wbg_get_c60162cf03da5a6e,\n__wbg_set_1eb0999cf5d27fc8,\n__wbg_keys_0eee252dfbfa253e,\n__wbg_parse_708461a1feddfb38,\n__wbg_stringify_8d1cc6ff383e8bae,\n__wbg_new_with_length_1763c527b2923202,\n__wbg_get_9b94d73e6221f75c,\n__wbg_set_f43e577aea94465b,\n__wbg_from_bddd64e7d5ff6941,\n__wbg_length_35a7bace40f36eac,\n__wbg_push_8ffdcb2063340ba5,\n__wbg_isArray_d314bb98fcf08331,\n__wbg_isSafeInteger_bfbc7332a9768d2a,\n__wbg_entries_58c7934c745daac7,\n__wbg_iterator_6ff6560ca1568e55,\n__wbg_static_accessor_GLOBAL_THIS_e628e89ab3b1c95f,\n__wbg_call_389efe28435a9388,\n__wbg_static_accessor_SELF_a621d3dfbb60d0ce,\n__wbg_static_accessor_GLOBAL_12837167ad935116,\n__wbg_static_accessor_WINDOW_f8727f0cf888e0bd,\n__wbg_get_b3ed3ad4be2bc8ac,\n__wbg_set_6cb8631f80447a67,\n__wbg_name_07a54d72942d5492,\n__wbg_call_812d25f1510c13c8,\n__wbg_next_418f80d8f5303233,\n__wbg_next_3482f54c49e8af19,\n__wbg___wbindgen_string_get_72fb696202c56729,\n__wbg___wbindgen_number_get_8ff4255516ccad3e,\n__wbg___wbindgen_in_47fa6863be6f2f25,\n__wbg___wbindgen_throw_be289d5034ed271b,\n__wbg___wbindgen_is_null_ac34f5003991759a,\n__wbg___wbindgen_jsval_eq_11888390b0186270,\n__wbg_Number_04624de7d0e8332d,\n__wbg_Error_8c4e43fe74559d73,\n__wbg___wbindgen_is_bigint_31b12575b56f32fc,\n__wbg___wbindgen_is_object_5ae8e5880f2c1fbd,\n__wbg___wbindgen_is_string_cd444516edc5b180,\n__wbg___wbindgen_boolean_get_bbbb1c18aa2f5e25,\n__wbg___wbindgen_is_function_0095a73b8b156f76,\n__wbg___wbindgen_is_undefined_9e4d92534c42d778,\n__wbg___wbindgen_jsval_loose_eq_9dd77d8cd6671811,\n__wbg___wbindgen_bigint_get_as_i64_8fcf4ce7f1ca72a2,\n__wbg___wbindgen_debug_string_0bc8482c6e3508ae,\n__wbindgen_init_externref_table,\n__wbindgen_cast_0000000000000001,\n__wbindgen_cast_0000000000000002,\n__wbindgen_cast_0000000000000003,\n__wbindgen_cast_0000000000000004\n }\n };\n\n async function loadWasm(module, imports) {\n if (typeof module === 'string') {\n\n // Resolve relative urls from the runtime script path\n if (module.startsWith('./')) {\n module = new URL(module, import.meta.url).href\n }\n\n \n\n const moduleRequest = await fetch(module);\n if (typeof WebAssembly.instantiateStreaming === 'function') {\n try {\n return await WebAssembly.instantiateStreaming(moduleRequest, imports);\n } catch (e) {\n if (moduleRequest.headers.get('Content-Type') != 'application/wasm') {\n console.warn(e);\n } else {\n throw e;\n }\n }\n }\n module = await moduleRequest.arrayBuffer();\n\n \n }\n return await WebAssembly.instantiate(module, imports);\n }\n\n export const { instance, module } = await loadWasm(wasmModule, imports);\n\n export const memory = instance.exports.memory;\nexport const pipeline_create = instance.exports.pipeline_create;\nexport const pipeline_destroy = instance.exports.pipeline_destroy;\nexport const pipeline_reset = instance.exports.pipeline_reset;\nexport const pipeline_reset_all = instance.exports.pipeline_reset_all;\nexport const process_changes = instance.exports.process_changes;\nexport const register_boollogic = instance.exports.register_boollogic;\nexport const register_concerns = instance.exports.register_concerns;\nexport const register_side_effects = instance.exports.register_side_effects;\nexport const shadow_dump = instance.exports.shadow_dump;\nexport const shadow_init = instance.exports.shadow_init;\nexport const unregister_boollogic = instance.exports.unregister_boollogic;\nexport const unregister_concerns = instance.exports.unregister_concerns;\nexport const unregister_side_effects = instance.exports.unregister_side_effects;\nexport const init = instance.exports.init;\nexport const __wbindgen_malloc = instance.exports.__wbindgen_malloc;\nexport const __wbindgen_realloc = instance.exports.__wbindgen_realloc;\nexport const __wbindgen_exn_store = instance.exports.__wbindgen_exn_store;\nexport const __externref_table_alloc = instance.exports.__externref_table_alloc;\nexport const __wbindgen_externrefs = instance.exports.__wbindgen_externrefs;\nexport const __wbindgen_free = instance.exports.__wbindgen_free;\nexport const __externref_table_dealloc = instance.exports.__externref_table_dealloc;\nexport const __wbindgen_start = instance.exports.__wbindgen_start;\n ","/* @ts-self-types=\"./apex_state_wasm.d.ts\" */\n\nimport * as wasm from \"./apex_state_wasm_bg.wasm\";\nimport { __wbg_set_wasm } from \"./apex_state_wasm_bg.js\";\n__wbg_set_wasm(wasm);\nwasm.__wbindgen_start();\nexport {\n init, pipeline_create, pipeline_destroy, pipeline_reset, pipeline_reset_all, process_changes, register_boollogic, register_concerns, register_side_effects, shadow_dump, shadow_init, unregister_boollogic, unregister_concerns, unregister_side_effects\n} from \"./apex_state_wasm_bg.js\";\n","import { useCallback, useLayoutEffect } from 'react'\n\nimport { snapshot, subscribe, useSnapshot } from 'valtio'\n\nimport type { ConcernType } from '../concerns'\nimport { defaultConcerns } from '../concerns'\nimport { registerConcernEffects } from '../concerns/registration.wasm-impl'\nimport { useStoreContext } from '../core/context'\nimport type { ProviderProps, StoreConfig } from '../core/types'\nimport { processChangesWasm as processChanges } from '../pipeline/process-changes.wasm-impl'\nimport { registerSideEffects } from '../sideEffects/registration.wasm-impl'\nimport type {\n ArrayOfChanges,\n BoolLogic,\n CheckAggregationPairs,\n CheckComputationPairs,\n CheckListeners,\n CheckSyncPairs,\n ComputationOp,\n ConcernRegistrationMap,\n DeepKey,\n DeepValue,\n EvaluatedConcerns,\n GenericMeta,\n ResolvableDeepKey,\n ValidatedAggregationPairs,\n ValidatedComputationPairs,\n ValidatedFlipPairs,\n ValidatedListeners,\n ValidatedSyncPairs,\n} from '../types'\nimport type { DeepKeyFiltered } from '../types/deep-key-filtered'\nimport type { SideEffects } from '../types/side-effects'\nimport { dot } from '../utils/dot'\nimport { filterConcernsByKeys } from '../utils/filter-concerns'\nimport { createProvider } from './provider'\nimport { createWarmPairHelpers } from './warm-pair-helpers'\n\n/**\n * Explicit return type of createGenericStore.\n *\n * Defined as an interface so TypeScript references type aliases by name\n * (e.g. `SideEffects<DATA, META>`) instead of expanding them inline.\n * Without this, large DATA types (2800+ DeepKey paths) cause\n * \"inferred type exceeds the maximum length\" (TS error) because the\n * compiler tries to inline-expand every O(N²) pair type.\n */\nexport interface GenericStoreApi<\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n CONCERNS extends readonly ConcernType<string, any, any>[] =\n typeof defaultConcerns,\n> {\n Provider: (props: ProviderProps<DATA>) => React.JSX.Element\n\n useFieldStore: <P extends DeepKey<DATA>>(\n path: P,\n ) => {\n value: DeepValue<DATA, P>\n setValue: (newValue: DeepValue<DATA, P>, meta?: META) => void\n } & Record<string, unknown>\n\n useStore: <P extends DeepKey<DATA>>(\n path: P,\n ) => [DeepValue<DATA, P>, (value: DeepValue<DATA, P>, meta?: META) => void]\n\n useJitStore: () => {\n proxyValue: DATA\n setChanges: (changes: ArrayOfChanges<DATA, META>) => void\n getState: () => DATA\n }\n\n useSideEffects: (id: string, effects: SideEffects<DATA, META>) => void\n\n useConcerns: <\n CUSTOM extends readonly ConcernType<string, any, any>[] = readonly [],\n >(\n id: string,\n registration: ConcernRegistrationMap<\n DATA,\n readonly [...CONCERNS, ...CUSTOM]\n >,\n customConcerns?: CUSTOM,\n ) => void\n\n withConcerns: <\n SELECTION extends Partial<\n Record<Extract<CONCERNS[number], { name: string }>['name'], boolean>\n >,\n >(\n selection: SELECTION,\n ) => {\n useFieldStore: <P extends DeepKey<DATA>>(\n path: P,\n ) => {\n value: DeepValue<DATA, P>\n setValue: (newValue: DeepValue<DATA, P>, meta?: META) => void\n } & {\n [K in keyof SELECTION as SELECTION[K] extends true\n ? K\n : never]?: K extends keyof EvaluatedConcerns<CONCERNS>\n ? EvaluatedConcerns<CONCERNS>[K]\n : never\n }\n /** Reactive snapshot of all concerns matching this selection, keyed by path. Re-renders when any concern changes. */\n useConcernsSnapshot: () => Record<\n string,\n {\n [K in keyof SELECTION as SELECTION[K] extends true\n ? K\n : never]?: K extends keyof EvaluatedConcerns<CONCERNS>\n ? EvaluatedConcerns<CONCERNS>[K]\n : never\n }\n >\n }\n\n /**\n * React hook. Fires callback whenever concerns matching the selection change.\n * Does NOT trigger re-renders — use useConcernsSnapshot() for reactive UI instead.\n * Callback is stable across renders (no need to memoize).\n */\n useWatchConcerns: <\n SELECTION extends Partial<\n Record<Extract<CONCERNS[number], { name: string }>['name'], boolean>\n >,\n >(\n selection: SELECTION,\n callback: (\n concerns: Record<\n string,\n {\n [K in keyof SELECTION as SELECTION[K] extends true\n ? K\n : never]?: K extends keyof EvaluatedConcerns<CONCERNS>\n ? EvaluatedConcerns<CONCERNS>[K]\n : never\n }\n >,\n ) => void,\n ) => void\n\n withMeta: (presetMeta: Partial<META>) => {\n useFieldStore: <P extends DeepKey<DATA>>(\n path: P,\n ) => {\n value: DeepValue<DATA, P>\n setValue: (newValue: DeepValue<DATA, P>, meta?: META) => void\n }\n }\n\n // Pre-warmed pair helpers from createWarmPairHelpers\n syncPairs: <\n T extends (\n | [ResolvableDeepKey<DATA>, ResolvableDeepKey<DATA>]\n | [\n ResolvableDeepKey<DATA>,\n ResolvableDeepKey<DATA>,\n { oneWay: '[0]->[1]' | '[1]->[0]' },\n ]\n )[],\n >(\n pairs: CheckSyncPairs<DATA, T>,\n ) => ValidatedSyncPairs<DATA>\n\n flipPairs: <T extends [ResolvableDeepKey<DATA>, ResolvableDeepKey<DATA>][]>(\n pairs: CheckSyncPairs<DATA, T>,\n ) => ValidatedFlipPairs<DATA>\n\n aggregationPairs: <\n T extends (\n | [ResolvableDeepKey<DATA>, ResolvableDeepKey<DATA>]\n | [ResolvableDeepKey<DATA>, ResolvableDeepKey<DATA>, BoolLogic<DATA>]\n )[],\n >(\n pairs: CheckAggregationPairs<DATA, T>,\n ) => ValidatedAggregationPairs<DATA>\n\n computationPairs: <\n T extends (\n | [\n ComputationOp,\n DeepKeyFiltered<DATA, number>,\n DeepKeyFiltered<DATA, number>,\n ]\n | [\n ComputationOp,\n DeepKeyFiltered<DATA, number>,\n DeepKeyFiltered<DATA, number>,\n BoolLogic<DATA>,\n ]\n )[],\n >(\n pairs: CheckComputationPairs<DATA, T>,\n ) => ValidatedComputationPairs<DATA>\n\n listeners: <\n T extends readonly {\n path: ResolvableDeepKey<DATA> | null\n scope?: ResolvableDeepKey<DATA> | null | undefined\n fn: (...args: any[]) => any\n }[],\n >(\n items: CheckListeners<DATA, META, T>,\n ) => ValidatedListeners<DATA, META>\n}\n\nexport const createGenericStore = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n CONCERNS extends readonly ConcernType<string, any, any>[] =\n typeof defaultConcerns,\n>(\n config?: StoreConfig,\n): GenericStoreApi<DATA, META, CONCERNS> => {\n const Provider = createProvider<DATA>(config)\n\n // Internal helper hook for field state access\n const _useFieldValue = <P extends DeepKey<DATA>>(path: P) => {\n const store = useStoreContext<DATA>()\n const snap = useSnapshot(store.state) as DATA\n const value = dot.get(snap, path)\n\n const setValue = useCallback(\n (newValue: DeepValue<DATA, P>, meta?: META) => {\n const changes: ArrayOfChanges<DATA, META> = [\n [path, newValue, (meta || {}) as META],\n ]\n\n processChanges(store, changes)\n },\n [store, path],\n )\n\n return { store, value, setValue }\n }\n\n const useFieldStore = <P extends DeepKey<DATA>>(\n path: P,\n ): {\n value: DeepValue<DATA, P>\n setValue: (newValue: DeepValue<DATA, P>, meta?: META) => void\n } & Record<string, unknown> => {\n const { store, value, setValue } = _useFieldValue(path)\n const concernsSnap = useSnapshot(store._concerns)\n const allConcerns = (concernsSnap[path] || {}) as Record<string, unknown>\n\n return { value, setValue, ...allConcerns }\n }\n\n const useStore = <P extends DeepKey<DATA>>(\n path: P,\n ): [DeepValue<DATA, P>, (value: DeepValue<DATA, P>, meta?: META) => void] => {\n const { value, setValue } = _useFieldValue(path)\n return [value, setValue]\n }\n\n const useJitStore = (): {\n proxyValue: DATA\n setChanges: (changes: ArrayOfChanges<DATA, META>) => void\n getState: () => DATA\n } => {\n const store = useStoreContext<DATA>()\n const proxyValue = useSnapshot(store.state) as DATA\n\n const setChanges = useCallback(\n (changes: ArrayOfChanges<DATA, META>) => {\n processChanges(store, changes)\n },\n [store],\n )\n\n const getState = useCallback(() => {\n return snapshot(store.state) as DATA\n }, [store])\n\n return { proxyValue, setChanges, getState }\n }\n\n const useSideEffects = (\n id: string,\n effects: SideEffects<DATA, META>,\n ): void => {\n const store = useStoreContext<DATA>()\n useLayoutEffect(() => {\n return registerSideEffects(store, id, effects)\n }, [store, id, effects])\n }\n\n // Explicit type annotation from GenericStoreApi — TS can't structurally verify\n // generic function assignability for this method (contravariant generic params).\n // Typing the variable directly ensures the return type annotation works without `as`.\n const useConcerns: GenericStoreApi<DATA, META, CONCERNS>['useConcerns'] = ((\n id: string,\n registration: ConcernRegistrationMap<\n DATA,\n readonly [...CONCERNS, ...any[]]\n >,\n customConcerns?: readonly ConcernType<string, any, any>[],\n ): void => {\n const store = useStoreContext<DATA>()\n const concerns = (customConcerns ||\n defaultConcerns) as readonly ConcernType<any, any, any>[]\n\n useLayoutEffect(() => {\n return registerConcernEffects(store, registration, concerns)\n }, [store, id, registration, customConcerns])\n }) as GenericStoreApi<DATA, META, CONCERNS>['useConcerns']\n\n // Explicit type annotation from GenericStoreApi — same reason as useConcerns.\n const withConcerns: GenericStoreApi<DATA, META, CONCERNS>['withConcerns'] = (<\n SELECTION extends Partial<\n Record<Extract<CONCERNS[number], { name: string }>['name'], boolean>\n >,\n >(\n selection: SELECTION,\n ) => {\n type SelectedConcerns = {\n [K in keyof SELECTION as SELECTION[K] extends true\n ? K\n : never]?: K extends keyof EvaluatedConcerns<CONCERNS>\n ? EvaluatedConcerns<CONCERNS>[K]\n : never\n }\n\n type WithConcernsFieldStore<P extends DeepKey<DATA>> = {\n value: DeepValue<DATA, P>\n setValue: (newValue: DeepValue<DATA, P>, meta?: META) => void\n } & SelectedConcerns\n\n const selectionKeys = Object.keys(selection ?? {}).filter(\n (k) => (selection as Record<string, boolean | undefined>)[k],\n )\n\n return {\n useFieldStore: <P extends DeepKey<DATA>>(\n path: P,\n ): WithConcernsFieldStore<P> => {\n const { store, value, setValue } = _useFieldValue(path)\n const concernsSnap = useSnapshot(store._concerns)\n const allConcerns = (concernsSnap[path] || {}) as Record<\n string,\n unknown\n >\n const selectedConcerns = filterConcernsByKeys(\n { [path]: allConcerns },\n selectionKeys,\n )[path] as SelectedConcerns | undefined\n\n return {\n value,\n setValue,\n ...(selectedConcerns ?? {}),\n } as WithConcernsFieldStore<P>\n },\n\n useConcernsSnapshot: () => {\n const store = useStoreContext<DATA>()\n const concernsSnap = useSnapshot(store._concerns)\n return filterConcernsByKeys(\n concernsSnap as Record<string, Record<string, unknown>>,\n selectionKeys,\n ) as Record<string, SelectedConcerns>\n },\n }\n }) as GenericStoreApi<DATA, META, CONCERNS>['withConcerns']\n\n const withMeta = (presetMeta: Partial<META>) => ({\n useFieldStore: <P extends DeepKey<DATA>>(\n path: P,\n ): {\n value: DeepValue<DATA, P>\n setValue: (newValue: DeepValue<DATA, P>, meta?: META) => void\n } => {\n const { store, value, setValue: originalSetValue } = _useFieldValue(path)\n const concernsSnap = useSnapshot(store._concerns)\n const allConcerns = (concernsSnap[path] || {}) as Record<string, unknown>\n\n const setValue = useCallback(\n (newValue: DeepValue<DATA, P>, meta?: META) => {\n originalSetValue(newValue, { ...presetMeta, ...meta } as META)\n },\n [originalSetValue],\n )\n\n return { value, setValue, ...allConcerns }\n },\n })\n\n const useWatchConcerns: GenericStoreApi<\n DATA,\n META,\n CONCERNS\n >['useWatchConcerns'] = (<\n SELECTION extends Partial<\n Record<Extract<CONCERNS[number], { name: string }>['name'], boolean>\n >,\n >(\n selection: SELECTION,\n callback: (concerns: Record<string, Record<string, unknown>>) => void,\n ): void => {\n const store = useStoreContext<DATA>()\n const selectionKeys = Object.keys(selection).filter(\n (k) => (selection as Record<string, boolean | undefined>)[k],\n )\n\n useLayoutEffect(() => {\n return subscribe(store._concerns, () => {\n callback(\n filterConcernsByKeys(\n snapshot(store._concerns) as Record<\n string,\n Record<string, unknown>\n >,\n selectionKeys,\n ),\n )\n })\n }, [store])\n }) as GenericStoreApi<DATA, META, CONCERNS>['useWatchConcerns']\n\n return {\n Provider,\n useFieldStore,\n useStore,\n useJitStore,\n useSideEffects,\n useConcerns,\n withConcerns,\n withMeta,\n useWatchConcerns,\n ...createWarmPairHelpers<DATA, META>(),\n }\n}\n","/**\n * Pre-built concerns provided by apex-state\n *\n * Validation & Schema:\n * - validationState: Schema validation (isError, errors, message, timestamp)\n *\n * Conditional UI State (uses BoolLogic):\n * - disabledWhen: Disable field when condition is true\n * - readonlyWhen: Make field read-only when condition is true\n * - visibleWhen: Show field when condition is true\n *\n * Dynamic Text (uses template interpolation):\n * - dynamicTooltip: Template-based tooltip text\n * - dynamicLabel: Template-based label text\n * - dynamicPlaceholder: Template-based placeholder text\n */\n\n// Validation\nimport { disabledWhen } from './disabled-when'\nimport { dynamicLabel } from './dynamic-label'\nimport { dynamicPlaceholder } from './dynamic-placeholder'\nimport { dynamicTooltip } from './dynamic-tooltip'\nimport { readonlyWhen } from './readonly-when'\nimport { validationState } from './validation-state'\nimport { visibleWhen } from './visible-when'\n\nexport {\n type ValidationError,\n validationState,\n type ValidationStateConcern,\n type ValidationStateInput,\n type ValidationStateResult,\n} from './validation-state'\n\n// Conditional state\nexport { disabledWhen } from './disabled-when'\nexport { readonlyWhen } from './readonly-when'\nexport { visibleWhen } from './visible-when'\n\n// Dynamic text\nexport { dynamicLabel } from './dynamic-label'\nexport { dynamicPlaceholder } from './dynamic-placeholder'\nexport { dynamicTooltip } from './dynamic-tooltip'\n\n/**\n * All pre-built concerns as a tuple (for use with findConcern)\n */\nexport const prebuilts = [\n validationState,\n disabledWhen,\n readonlyWhen,\n visibleWhen,\n dynamicTooltip,\n dynamicLabel,\n dynamicPlaceholder,\n] as const\n\n/**\n * Namespace style access for pre-builts\n */\nexport const prebuiltsNamespace = {\n validationState,\n disabledWhen,\n readonlyWhen,\n visibleWhen,\n dynamicTooltip,\n dynamicLabel,\n dynamicPlaceholder,\n}\n","/**\n * Type checking utilities — similar to lodash type guards\n *\n * Provides type-safe predicates for common type checks with TypeScript support\n */\nimport type { Primitive } from '../types/deep-key'\n\n/** Check if value is null or undefined */\nconst isNil = (value: unknown): value is null | undefined => value == null\n\n/** Check if value is undefined */\nconst isUndefined = (value: unknown): value is undefined => value === undefined\n\n/** Check if value is null */\nconst isNull = (value: unknown): value is null => value === null\n\n/** Check if value is a plain object (not null, array, Date, RegExp, class instances, etc.) */\nconst isObject = (value: unknown): value is Record<string, unknown> => {\n if (value == null || typeof value !== 'object' || Array.isArray(value))\n return false\n const proto = Object.getPrototypeOf(value)\n return proto === Object.prototype || proto === null\n}\n\n/** Check if value is an array */\nconst isArray = (value: unknown): value is unknown[] => Array.isArray(value)\n\n/** Check if value is a plain object or an array */\nconst isObjectOrArray = (\n value: unknown,\n): value is Record<string, unknown> | unknown[] =>\n isObject(value) || isArray(value)\n\n/** Check if value is a string */\nconst isString = (value: unknown): value is string => typeof value === 'string'\n\n/** Check if value is a number */\nconst isNumber = (value: unknown): value is number => typeof value === 'number'\n\n/** Check if value is a boolean */\nconst isBoolean = (value: unknown): value is boolean =>\n typeof value === 'boolean'\n\n/** Check if value is a function */\nconst isFunction = (value: unknown): value is (...args: unknown[]) => unknown =>\n typeof value === 'function'\n\n/** Check if value is a symbol */\nconst isSymbol = (value: unknown): value is symbol => typeof value === 'symbol'\n\n/** Check if value is a Date */\nconst isDate = (value: unknown): value is Date => value instanceof Date\n\n/** Check if value is a RegExp */\nconst isRegExp = (value: unknown): value is RegExp => value instanceof RegExp\n\n/** Check if a string key is a non-negative integer index (e.g. \"0\", \"1\", \"42\") */\nconst isNumericKey = (value: string): boolean => /^\\d+$/.test(value)\n\n/** Check if value is a primitive (string, number, boolean, symbol, bigint, null, undefined) */\nconst isPrimitive = (value: unknown): value is Primitive => {\n const type = typeof value\n return (\n type === 'string' ||\n type === 'number' ||\n type === 'boolean' ||\n type === 'symbol' ||\n type === 'bigint' ||\n value == null\n )\n}\n\n/** Check if object is empty (has no own properties) */\nconst isEmptyObject = (value: object): boolean => {\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n return false\n }\n }\n return true\n}\n\n/** Check if value is empty (null, undefined, empty string, empty array, empty object) */\nconst isEmpty = (value: unknown): boolean => {\n if (isNil(value)) return true\n if (isNumber(value) || isBoolean(value)) return false\n if (isString(value)) return value.length === 0\n if (isArray(value)) return value.length === 0\n if (isObject(value)) return isEmptyObject(value as object)\n // Date, RegExp, Map, Set, class instances, functions, symbols — not empty\n return false\n}\n\nconst isEqualArray = (a: any[], b: any[]): boolean => {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (!iEqual(a[i], b[i])) return false\n }\n return true\n}\n\nconst isEqualObject = (a: any, b: any): boolean => {\n const keysA = Object.keys(a)\n const keysB = Object.keys(b)\n\n if (keysA.length !== keysB.length) return false\n\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false\n if (!iEqual(a[key], b[key])) return false\n }\n\n return true\n}\n\n/** Check for deep equality between two values */\nconst iEqual = (a: unknown, b: unknown): boolean => {\n if (a === b) return true\n\n if (isArray(a) && isArray(b)) {\n return isEqualArray(a, b)\n }\n\n if (isDate(a) && isDate(b)) {\n return a.getTime() === b.getTime()\n }\n\n if (isRegExp(a) && isRegExp(b)) {\n return a.toString() === b.toString()\n }\n\n if (isObject(a) && isObject(b)) {\n return isEqualObject(a, b)\n }\n\n return false\n}\n\n// Negated type guards (with proper type narrowing)\n/** Check if value is not null or undefined */\nconst isNotNil = <T>(value: T | null | undefined): value is T => value != null\n\n/** Check if value is not undefined */\nconst isNotUndefined = <T>(value: T | undefined): value is T =>\n value !== undefined\n\n/** Check if value is not null */\nconst isNotNull = <T>(value: T | null): value is T => value !== null\n\n/** Check if value is not a plain object */\nconst isNotObject = <T>(\n value: T,\n): value is Exclude<T, Record<string, unknown>> => !isObject(value)\n\n/** Check if value is not a plain object and not an array */\nconst isNotObjectOrArray = <T>(\n value: T,\n): value is Exclude<T, Record<string, unknown> | unknown[]> =>\n !isObject(value) && !isArray(value)\n\n/** Check if value is not an array */\nconst isNotArray = <T>(value: T): value is Exclude<T, unknown[]> =>\n !isArray(value)\n\n/** Check if value is not a string */\nconst isNotString = <T>(value: T): value is Exclude<T, string> =>\n typeof value !== 'string'\n\n/** Check if value is not a number */\nconst isNotNumber = <T>(value: T): value is Exclude<T, number> =>\n typeof value !== 'number'\n\n/** Check if value is not a boolean */\nconst isNotBoolean = <T>(value: T): value is Exclude<T, boolean> =>\n typeof value !== 'boolean'\n\n/** Check if value is not a function */\nconst isNotFunction = <T>(\n value: T,\n): value is Exclude<T, (...args: unknown[]) => unknown> =>\n typeof value !== 'function'\n\n/** Check if value is not a symbol */\nconst isNotSymbol = <T>(value: T): value is Exclude<T, symbol> =>\n typeof value !== 'symbol'\n\n/** Check if value is not a Date */\nconst isNotDate = <T>(value: T): value is Exclude<T, Date> =>\n !(value instanceof Date)\n\n/** Check if value is not a RegExp */\nconst isNotRegExp = <T>(value: T): value is Exclude<T, RegExp> =>\n !(value instanceof RegExp)\n\n/** Check if value is not a primitive */\nconst isNotPrimitive = <T>(value: T): value is Exclude<T, Primitive> => {\n const type = typeof value\n return !(\n type === 'string' ||\n type === 'number' ||\n type === 'boolean' ||\n type === 'symbol' ||\n type === 'bigint' ||\n value == null\n )\n}\n\n/** Check if value is not empty */\nconst isNotEmpty = (value: unknown): boolean => !isEmpty(value)\n\n/** Check for deep inequality between two values */\nconst isNotEqual = (a: unknown, b: unknown): boolean => !iEqual(a, b)\n\n/**\n * Unified namespace for type checking\n *\n * @example\n * ```typescript\n * import { is } from './utils/is'\n *\n * if (is.object(value)) { ... }\n * if (is.array(value)) { ... }\n * if (is.nil(value)) { ... }\n *\n * // Negated versions\n * if (is.not.object(value)) { ... }\n * if (is.not.array(value)) { ... }\n * ```\n */\nexport const is = {\n nil: isNil,\n undefined: isUndefined,\n null: isNull,\n object: isObject,\n objectOrArray: isObjectOrArray,\n array: isArray,\n string: isString,\n number: isNumber,\n boolean: isBoolean,\n function: isFunction,\n symbol: isSymbol,\n date: isDate,\n regexp: isRegExp,\n numericKey: isNumericKey,\n primitive: isPrimitive,\n empty: isEmpty,\n equal: iEqual,\n not: {\n nil: isNotNil,\n undefined: isNotUndefined,\n null: isNotNull,\n object: isNotObject,\n objectOrArray: isNotObjectOrArray,\n array: isNotArray,\n string: isNotString,\n number: isNotNumber,\n boolean: isNotBoolean,\n function: isNotFunction,\n symbol: isNotSymbol,\n date: isNotDate,\n regexp: isNotRegExp,\n primitive: isNotPrimitive,\n empty: isNotEmpty,\n equal: isNotEqual,\n },\n}\n","/**\n * Deep access utilities for safe nested object access\n *\n * Uses native Reflect for reads (~2x faster) and writes (~3x faster) vs lodash.\n * Maintains valtio reactivity when setting values.\n */\n\nimport type { DeepKey, DeepValue } from '../types'\nimport { is } from './is'\n\n// Cache split paths to avoid repeated string splitting overhead\nconst pathCache = new Map<string, string[]>()\nconst MAX_CACHE_SIZE = 1000\n\nconst getPathParts = (path: string): string[] => {\n if (typeof path !== 'string') {\n throw new TypeError(\n `[apex-state] Path must be a string, received ${typeof path}: ${JSON.stringify(path)}. ` +\n `Paths must be dot-notation strings like \"user.email\" or \"items.0.name\".`,\n )\n }\n\n let parts = pathCache.get(path)\n if (!parts) {\n parts = path.split('.')\n if (pathCache.size >= MAX_CACHE_SIZE) {\n pathCache.clear()\n }\n pathCache.set(path, parts)\n }\n return parts\n}\n\n/**\n * Safely gets a value from a nested object using dot notation (type-safe)\n *\n * Use this when the path is known at compile time for full type safety.\n * For runtime/dynamic paths, use `dot.get__unsafe` instead.\n *\n * @example\n * ```typescript\n * const user = { address: { city: 'NYC' } }\n * const city = dot.get(user, 'address.city') // string | undefined\n * ```\n */\nconst get = <T extends object, P extends DeepKey<T>>(\n obj: T,\n path: P,\n): DeepValue<T, P> => {\n const parts = getPathParts(path)\n let current: any = obj\n for (const part of parts) {\n if (is.not.objectOrArray(current)) {\n return undefined as DeepValue<T, P>\n }\n current = Reflect.get(current, part)\n }\n return current as DeepValue<T, P>\n}\n\n/**\n * Gets a value from a nested object using a runtime string path (unsafe)\n *\n * Use this when the path is determined at runtime and cannot be validated\n * at compile time. Returns `unknown` since the type cannot be inferred.\n *\n * @example\n * ```typescript\n * const user = { address: { city: 'NYC' } }\n * const dynamicPath = 'address.city'\n * const value = dot.get__unsafe(user, dynamicPath) // unknown\n * ```\n */\nconst get__unsafe = <P extends string>(obj: unknown, path: P): unknown => {\n const parts = getPathParts(path)\n let current: any = obj\n for (const part of parts) {\n if (is.not.objectOrArray(current)) {\n return undefined\n }\n current = Reflect.get(current, part)\n }\n return current\n}\n\n/**\n * Safely sets a value in a nested object using dot notation\n * Maintains valtio proxy reactivity by mutating the original object\n *\n * @example\n * ```typescript\n * const user = { address: { city: 'NYC' } }\n * dot.set(user, 'address.city', 'LA')\n * // user.address.city is now 'LA'\n * ```\n */\nconst set = <T extends object, P extends DeepKey<T>>(\n obj: T,\n path: P,\n value: DeepValue<T, P>,\n): void => {\n const keys = getPathParts(path)\n const last = keys.length - 1\n let current: object = obj\n for (let i = 0; i < last; i++) {\n let next = Reflect.get(current, keys[i]!)\n if (is.not.objectOrArray(next)) {\n next = is.numericKey(keys[i + 1]!) ? [] : {}\n Reflect.set(current, keys[i]!, next)\n }\n current = next as object\n }\n Reflect.set(current, keys[last]!, value)\n}\n\n/**\n * Unsafely sets a value in a nested object using a runtime path string\n * Use when paths are determined at runtime and cannot be statically typed\n *\n * @example\n * ```typescript\n * const user = { address: { city: 'NYC' } }\n * const dynamicPath = 'address.city'\n * dot.set__unsafe(user, dynamicPath, 'LA')\n * ```\n */\nconst set__unsafe = <T extends object, P extends string>(\n obj: T,\n path: P,\n value: unknown,\n): void => {\n const keys = getPathParts(path)\n const last = keys.length - 1\n let current: object = obj\n for (let i = 0; i < last; i++) {\n let next = Reflect.get(current, keys[i]!)\n if (is.not.objectOrArray(next)) {\n next = is.numericKey(keys[i + 1]!) ? [] : {}\n Reflect.set(current, keys[i]!, next)\n }\n current = next as object\n }\n Reflect.set(current, keys[last]!, value)\n}\n\n/**\n * Checks if a value exists at a nested path using dot notation (type-safe)\n *\n * Returns true if the path exists and is not undefined.\n * Note: null and other falsy values (except undefined) return true.\n *\n * @example\n * ```typescript\n * const user = { address: { city: 'NYC' } }\n * dot.has(user, 'address.city') // true\n * dot.has(user, 'address.zip') // false\n * ```\n */\nconst has = <T extends object, P extends DeepKey<T>>(\n obj: T,\n path: P,\n): boolean => {\n const parts = getPathParts(path)\n let current: any = obj\n for (const part of parts) {\n if (is.not.objectOrArray(current)) {\n return false\n }\n current = Reflect.get(current, part)\n }\n return is.not.undefined(current)\n}\n\n/**\n * Deep equality check for values at multiple paths\n *\n * Compares values at multiple runtime paths for deep equality.\n * Returns true if all values are deeply equal to each other.\n * Useful for aggregations and change detection.\n *\n * @example\n * ```typescript\n * const obj = { a: { b: 1 }, c: { b: 1 }, d: { b: 1 } }\n * dot.same(obj, 'a.b', 'c.b', 'd.b') // true\n * dot.same(obj, 'a.b', 'c.b') // true\n * ```\n */\nconst same = <T extends object, P extends string>(\n obj: T,\n ...paths: P[]\n): boolean => {\n if (paths.length === 0) return true\n if (paths.length === 1) return true\n\n const firstValue = get__unsafe(obj, paths[0]!)\n for (let i = 1; i < paths.length; i++) {\n if (!is.equal(get__unsafe(obj, paths[i]!), firstValue)) {\n return false\n }\n }\n return true\n}\n\n/**\n * Unified namespace for dot notation path operations\n *\n * Provides type-safe and unsafe variants for working with nested objects\n * using dot notation paths (e.g., 'user.address.city')\n */\nexport const dot = {\n get,\n get__unsafe,\n set,\n set__unsafe,\n has,\n same,\n}\n","import type { BoolLogic } from '../types'\nimport { dot } from './dot'\nimport { is } from './is'\n\nconst evaluateNumericComparison = <STATE extends object>(\n logic: BoolLogic<STATE>,\n state: STATE,\n): boolean | undefined => {\n if ('GT' in logic) {\n const [path, threshold] = logic.GT\n const value = dot.get__unsafe(state, path)\n return is.number(value) && value > threshold\n }\n if ('LT' in logic) {\n const [path, threshold] = logic.LT\n const value = dot.get__unsafe(state, path)\n return is.number(value) && value < threshold\n }\n if ('GTE' in logic) {\n const [path, threshold] = logic.GTE\n const value = dot.get__unsafe(state, path)\n return is.number(value) && value >= threshold\n }\n if ('LTE' in logic) {\n const [path, threshold] = logic.LTE\n const value = dot.get__unsafe(state, path)\n return is.number(value) && value <= threshold\n }\n return undefined\n}\n\nexport const evaluateBoolLogic = <STATE extends object>(\n logic: BoolLogic<STATE>,\n state: STATE,\n): boolean => {\n // Shorthand tuple: [path, value]\n if (is.array(logic)) {\n const [path, expected] = logic as [string, unknown]\n return dot.get__unsafe(state, path) === expected\n }\n\n // Equality check\n if ('IS_EQUAL' in logic) {\n const [path, expected] = logic.IS_EQUAL as [string, unknown]\n return dot.get__unsafe(state, path) === expected\n }\n\n // Existence check (not null/undefined)\n if ('EXISTS' in logic) {\n return is.not.nil(dot.get__unsafe(state, logic.EXISTS))\n }\n\n // Emptiness check\n if ('IS_EMPTY' in logic) {\n return is.empty(dot.get__unsafe(state, logic.IS_EMPTY))\n }\n\n // Boolean combinators\n if ('AND' in logic) {\n return logic.AND.every((subLogic) => evaluateBoolLogic(subLogic, state))\n }\n if ('OR' in logic) {\n return logic.OR.some((subLogic) => evaluateBoolLogic(subLogic, state))\n }\n if ('NOT' in logic) {\n return !evaluateBoolLogic(logic.NOT, state)\n }\n\n // Numeric comparisons\n const numericResult = evaluateNumericComparison(logic, state)\n if (is.not.undefined(numericResult)) {\n return numericResult\n }\n\n // Inclusion check\n if ('IN' in logic) {\n const [path, allowed] = logic.IN as [string, unknown[]]\n return allowed.includes(dot.get__unsafe(state, path))\n }\n\n // Array contains at least one of the given elements\n if ('CONTAINS_ANY' in logic) {\n const [path, elements] = logic.CONTAINS_ANY as [string, unknown[]]\n const arr = dot.get__unsafe(state, path)\n return (\n is.array(arr) &&\n (elements as unknown[]).some((el) =>\n arr.some((item) => is.equal(item, el)),\n )\n )\n }\n\n // Array contains every one of the given elements\n if ('CONTAINS_ALL' in logic) {\n const [path, elements] = logic.CONTAINS_ALL as [string, unknown[]]\n const arr = dot.get__unsafe(state, path)\n return (\n is.array(arr) &&\n (elements as unknown[]).every((el) =>\n arr.some((item) => is.equal(item, el)),\n )\n )\n }\n\n return false\n}\n","import { evaluateBoolLogic } from '../../utils/bool-logic'\nimport type { BoolLogic, ConcernType } from '../types'\n\nexport const disabledWhen: ConcernType<\n 'disabledWhen',\n { boolLogic: BoolLogic<any> },\n boolean\n> = {\n name: 'disabledWhen',\n description: 'Boolean logic for disabled state',\n evaluate: (props) => {\n return evaluateBoolLogic(props.boolLogic, props.state)\n },\n}\n","/**\n * Template string interpolation utilities\n *\n * Core utility for interpolating state values into template strings.\n * Used by concerns and side effects for dynamic text generation.\n */\n\nimport { dot } from './dot'\nimport { is } from './is'\n\n/**\n * Extract all {{path}} placeholders from a template string\n *\n * @param template The template string with {{path}} placeholders\n * @returns Array of path strings found in the template\n *\n * @example\n * extractPlaceholders(\"Hello {{user.name}}, you have {{count}} messages\")\n * // [\"user.name\", \"count\"]\n */\nexport const extractPlaceholders = (template: string): string[] => {\n const regex = /\\{\\{([^}]+)\\}\\}/g\n const matches: string[] = []\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(template)) !== null) {\n if (match[1]) {\n matches.push(match[1])\n }\n }\n\n return matches\n}\n\n/**\n * Interpolate {{path}} placeholders with values from state\n *\n * Replaces {{path.to.value}} with actual values from state.\n * Only replaces if value is a string, number, or boolean.\n * Missing/null/undefined/object values leave the original {{path}} for debugging.\n *\n * @param template The template string with {{path}} placeholders\n * @param state The state object to read values from\n * @returns The interpolated string\n *\n * @example\n * interpolateTemplate(\"Value is {{market.spot}}\", state)\n * // \"Value is 105\"\n *\n * @example\n * interpolateTemplate(\"Hello {{user.name}}, missing: {{invalid.path}}\", state)\n * // \"Hello Alice, missing: {{invalid.path}}\"\n */\nexport const interpolateTemplate = <STATE extends object>(\n template: string,\n state: STATE,\n): string => {\n return template.replace(/\\{\\{([^}]+)\\}\\}/g, (match, path) => {\n const value = dot.get__unsafe(state, path)\n\n // Only interpolate serializable primitives\n if (is.string(value)) return value\n if (is.number(value)) return String(value)\n if (is.boolean(value)) return String(value)\n\n // Leave original {{path}} for debugging (null, undefined, objects, arrays)\n return match\n })\n}\n","/**\n * Dynamic label template concern\n *\n * Interpolates a template string with values from state.\n * Automatically tracks all state paths referenced in the template.\n *\n * Returns the interpolated string.\n *\n * @example\n * ```typescript\n * store.useConcerns('my-concerns', {\n * 'priceField': {\n * dynamicLabel: { template: \"Price: ${{product.price}}\" }\n * }\n * })\n * // Result: \"Price: $99.99\"\n * ```\n */\n\nimport { interpolateTemplate } from '../../utils/interpolation'\nimport type { ConcernType } from '../types'\n\nexport const dynamicLabel: ConcernType<\n 'dynamicLabel',\n { template: string },\n string\n> = {\n name: 'dynamicLabel',\n description: 'Template string interpolation for labels',\n evaluate: (props) => {\n return interpolateTemplate(props.template, props.state)\n },\n}\n","/**\n * Dynamic placeholder template concern\n *\n * Interpolates a template string with values from state.\n * Automatically tracks all state paths referenced in the template.\n *\n * Returns the interpolated string.\n *\n * @example\n * ```typescript\n * store.useConcerns('my-concerns', {\n * 'inputField': {\n * dynamicPlaceholder: { template: \"Enter {{field.name}}\" }\n * }\n * })\n * // Result: \"Enter email address\"\n * ```\n */\n\nimport { interpolateTemplate } from '../../utils/interpolation'\nimport type { ConcernType } from '../types'\n\nexport const dynamicPlaceholder: ConcernType<\n 'dynamicPlaceholder',\n { template: string },\n string\n> = {\n name: 'dynamicPlaceholder',\n description: 'Template string interpolation for placeholders',\n evaluate: (props) => {\n return interpolateTemplate(props.template, props.state)\n },\n}\n","/**\n * Dynamic tooltip template concern\n *\n * Interpolates a template string with values from state.\n * Automatically tracks all state paths referenced in the template.\n *\n * Returns the interpolated string.\n *\n * @example\n * ```typescript\n * store.useConcerns('my-concerns', {\n * 'strikePrice': {\n * dynamicTooltip: { template: \"Strike at {{market.spot}}\" }\n * }\n * })\n * // Result: \"Strike at 105\"\n * ```\n */\n\nimport { interpolateTemplate } from '../../utils/interpolation'\nimport type { ConcernType } from '../types'\n\nexport const dynamicTooltip: ConcernType<\n 'dynamicTooltip',\n { template: string },\n string\n> = {\n name: 'dynamicTooltip',\n description: 'Template string interpolation for tooltips',\n evaluate: (props) => {\n return interpolateTemplate(props.template, props.state)\n },\n}\n","/**\n * Read-only condition concern\n *\n * Evaluates a boolean logic expression to determine if a field should be read-only.\n * Automatically tracks all state paths accessed in the condition.\n *\n * Returns true if read-only, false if editable.\n *\n * @example\n * ```typescript\n * store.useConcerns('my-concerns', {\n * 'productId': {\n * readonlyWhen: { boolLogic: { IS_EQUAL: ['order.status', 'completed'] } }\n * }\n * })\n * // Returns: true if order status is 'completed', false otherwise\n * ```\n */\n\nimport { evaluateBoolLogic } from '../../utils/bool-logic'\nimport type { BoolLogic, ConcernType } from '../types'\n\nexport const readonlyWhen: ConcernType<\n 'readonlyWhen',\n { boolLogic: BoolLogic<any> },\n boolean\n> = {\n name: 'readonlyWhen',\n description: 'Boolean logic for readonly state',\n evaluate: (props) => {\n return evaluateBoolLogic(props.boolLogic, props.state)\n },\n}\n","import type { DeepKey } from '../../types'\nimport type { ValidationStateInput } from '../../types/concerns'\nimport { dot } from '../../utils/dot'\nimport { is } from '../../utils/is'\nimport type { BaseConcernProps } from '../types'\n\nexport type { ValidationStateInput }\n\nexport interface ValidationError {\n field?: string\n message: string\n}\n\nexport interface ValidationStateResult {\n isError: boolean\n errors: ValidationError[]\n}\n\nexport interface ValidationStateConcern {\n name: 'validationState'\n description: string\n evaluate: <SUB_STATE, PATH extends DeepKey<SUB_STATE>>(\n props: BaseConcernProps<SUB_STATE, PATH> &\n ValidationStateInput<SUB_STATE, PATH>,\n ) => ValidationStateResult\n}\n\nexport const validationState: ValidationStateConcern = {\n name: 'validationState',\n description: 'Schema validation with isError flag and detailed errors',\n evaluate: <SUB_STATE, PATH extends DeepKey<SUB_STATE>>(\n props: BaseConcernProps<SUB_STATE, PATH> &\n ValidationStateInput<SUB_STATE, PATH>,\n ): ValidationStateResult => {\n // If scope is provided, validate at scope path; otherwise validate at registration path\n // Note: props.scope is a runtime string path, use dot.get__unsafe for dynamic access\n const valueToValidate =\n 'scope' in props && props.scope\n ? dot.get__unsafe(props.state, props.scope)\n : props.value\n\n // Run schema validation\n const result = props.schema.safeParse(valueToValidate)\n\n // Success: return valid state\n if (result.success) {\n return {\n isError: false,\n errors: [],\n }\n }\n\n // Failure: transform schema errors to ValidationError format\n const errors: ValidationError[] = result.error.errors.map((err) => ({\n field: is.not.empty(err.path) ? err.path.join('.') : '.',\n message: err.message,\n }))\n\n return {\n isError: true,\n errors,\n }\n },\n}\n","/**\n * Visibility condition concern\n *\n * Evaluates a boolean logic expression to determine if a field should be visible.\n * Automatically tracks all state paths accessed in the condition.\n *\n * Returns true if visible, false if hidden.\n *\n * @example\n * ```typescript\n * store.useConcerns('my-concerns', {\n * 'advancedOptions': {\n * visibleWhen: { boolLogic: { IS_EQUAL: ['settings.mode', 'advanced'] } }\n * }\n * })\n * // Returns: true if settings.mode is 'advanced', false otherwise\n * ```\n */\n\nimport { evaluateBoolLogic } from '../../utils/bool-logic'\nimport type { BoolLogic, ConcernType } from '../types'\n\nexport const visibleWhen: ConcernType<\n 'visibleWhen',\n { boolLogic: BoolLogic<any> },\n boolean\n> = {\n name: 'visibleWhen',\n description: 'Boolean logic for visibility',\n evaluate: (props) => {\n return evaluateBoolLogic(props.boolLogic, props.state)\n },\n}\n","/**\n * Concern registry utilities\n *\n * Utilities for looking up and managing concerns.\n */\n\nimport { prebuilts } from './prebuilts'\nimport type { ConcernType } from './types'\n\n/**\n * Concern lookup by name\n *\n * @param name The concern name to look up\n * @param concerns Optional array of concerns to search (defaults to prebuilts)\n * @returns The concern definition, or undefined if not found\n */\nexport const findConcern = (\n name: string,\n concerns: readonly any[] = prebuilts,\n): ConcernType | undefined => {\n return concerns.find((c) => c.name === name) as ConcernType | undefined\n}\n\n/**\n * Default concerns provided by apex-state\n */\nexport const defaultConcerns = prebuilts\n","/**\n * WASM Implementation - Concern Registration\n *\n * Expressions (boolLogic, valueLogic) and validators use WASM registration.\n * The user-facing config keeps ergonomic shorthand (`boolLogic`, `valueLogic`);\n * internally all expression types converge to `ExpressionRegistration[]` before\n * crossing the WASM boundary.\n *\n * Custom concerns still use effect() (can't be moved to WASM).\n */\n\nimport { effect } from 'valtio-reactive'\n\nimport type { StoreInstance } from '../core/types'\nimport type { ConcernRegistrationMap } from '../types'\nimport { dot } from '../utils/dot'\nimport { is } from '../utils/is'\nimport type { WasmPipeline } from '../wasm/bridge'\nimport type {\n ExpressionRegistration,\n ListenerRegistration,\n} from '../wasm/generated/types'\nimport type { BaseConcernProps, ConcernType } from './types'\n\n/**\n * Classify a concern config as an expression and return the ExpressionRegistration,\n * or null if the config is not expression-based.\n *\n * Ergonomic shorthands → unified WASM ExpressionRegistration:\n * { boolLogic: ... } → tree_json of a LogicExpr\n * { valueLogic: ... } → tree_json of a ValueExpr\n */\nconst toExpressionRegistration = (\n outputPath: string,\n config: Record<string, unknown>,\n): ExpressionRegistration | null => {\n if ('boolLogic' in config && config['boolLogic'] != null) {\n return {\n output_path: outputPath,\n tree_json: JSON.stringify(config['boolLogic']),\n meta: { isConcern: true },\n }\n }\n if ('valueLogic' in config && config['valueLogic'] != null) {\n return {\n output_path: outputPath,\n tree_json: JSON.stringify(config['valueLogic']),\n meta: { isConcern: true },\n }\n }\n return null\n}\n\n/** Check if a concern config is schema-based validation. */\nconst isSchemaValidation = (\n concernName: string,\n config: Record<string, unknown>,\n): boolean =>\n concernName === 'validationState' &&\n 'schema' in config &&\n !('evaluate' in config)\n\n/** Resolve the field value for validation from changes and scoped state.\n *\n * Scalar: pick the new value from changes, fall back to scopedState for initial dispatch.\n * Object: apply relativized changes in-place (throwaway WASM snapshot), then extract. */\nconst resolveFieldValue = (\n changes: [string, unknown, unknown][],\n scopedState: unknown,\n listenPath: string,\n path: string,\n): unknown => {\n if (listenPath === path && is.primitive(scopedState)) {\n return changes[0]?.[1] ?? scopedState\n }\n for (const [changePath, value] of changes) {\n dot.set__unsafe(scopedState as object, changePath, value)\n }\n return listenPath === path\n ? scopedState\n : dot.get__unsafe(scopedState as object, path)\n}\n\n/** Sequential validator ID counter. */\nlet nextValidatorId = 0\n\n/** Sequential registration ID counter. */\nlet nextRegistrationId = 0\n\n/** Batch-register expressions and validators with WASM, apply initial results. */\nconst registerWasmBatch = (\n pipeline: WasmPipeline,\n expressions: ExpressionRegistration[],\n validatorListeners: ListenerRegistration[],\n subscriberFns: Map<number, (...args: unknown[]) => unknown>,\n concernRefs: Map<string, Record<string, unknown>>,\n disposeCallbacks: (() => void)[],\n) => {\n const registrationId = `concerns-${nextRegistrationId++}`\n\n const result = pipeline.registerConcerns(\n { expressions, listeners: validatorListeners },\n subscriberFns,\n )\n\n // Apply initial expression evaluations to _concerns\n for (const change of result.expression_changes) {\n const lastDot = change.path.lastIndexOf('.')\n const basePath = change.path.slice(0, lastDot)\n const concernName = change.path.slice(lastDot + 1)\n const concernsAtPath = concernRefs.get(basePath)\n if (concernsAtPath && concernName) {\n concernsAtPath[concernName] = change.value\n }\n }\n\n // Apply initial validator results (from run_on_registration dispatch)\n for (const change of result.initial_listener_changes) {\n const lastDot = change.path.lastIndexOf('.')\n const basePath = change.path.slice(0, lastDot)\n const concernName = change.path.slice(lastDot + 1)\n const concernsAtPath = concernRefs.get(basePath)\n if (concernsAtPath && concernName) {\n concernsAtPath[concernName] = change.value\n }\n }\n\n disposeCallbacks.push(() => {\n pipeline.unregisterConcerns(registrationId)\n })\n}\n\n/** Create a single concern effect with cached evaluate function. */\nconst createConcernEffect = <DATA extends object>(\n store: StoreInstance<DATA>,\n item: {\n path: string\n concernName: string\n config: Record<string, any>\n concern: ConcernType\n concernsAtPath: Record<string, unknown>\n },\n resultCache: Map<string, unknown>,\n): (() => void) => {\n const { path, concernName, config, concern, concernsAtPath } = item\n const cacheKey = `${path}.${concernName}`\n\n // Resolve evaluate function once (not per effect trigger)\n // @FIXME: this should be coming from concern registration. we should have evaluate function for validation there, not here.\n const evaluateFn =\n 'evaluate' in config && typeof config['evaluate'] === 'function'\n ? config['evaluate']\n : concern.evaluate\n\n // Wrap evaluation in effect() for automatic dependency tracking\n // effect() will automatically track ONLY the properties accessed during evaluate()\n return effect(() => {\n // READ from dataProxy (automatic tracking!)\n // Any property accessed here will trigger re-evaluation when changed\n const value = dot.get__unsafe(store.state, path)\n\n // OPTIMIZATION: Avoid object spread overhead (creates new object every evaluation)\n // Use Object.assign instead for single-pass property addition (40% faster)\n const evalProps: BaseConcernProps<any, string> & Record<string, any> =\n Object.assign({ state: store.state, path, value }, config)\n\n // EVALUATE concern (all state accesses inside are tracked!)\n const result = evaluateFn(evalProps)\n\n // Check cache (non-reactive!) to see if value changed\n const prev = resultCache.get(cacheKey)\n if (prev !== result) {\n // Update cache\n resultCache.set(cacheKey, result)\n\n // WRITE to pre-captured reference (NO tracked reads!)\n concernsAtPath[concernName] = result\n }\n })\n}\n\n/** Check if a concern config has an inline evaluate function (custom/ad-hoc concern). */\nconst isAdHocConcern = (\n config: Record<string, unknown>,\n): config is { evaluate: (...args: any[]) => unknown } =>\n 'evaluate' in config && typeof config['evaluate'] === 'function'\n\n/** Collected registration data from single-pass classification. */\ninterface CollectedRegistrations {\n expressions: ExpressionRegistration[]\n validatorListeners: ListenerRegistration[]\n subscriberFns: Map<number, (...args: unknown[]) => unknown>\n jsEffects: {\n path: string\n concernName: string\n config: Record<string, any>\n concern: ConcernType\n concernsAtPath: Record<string, unknown>\n }[]\n}\n\n/** Single-pass: classify each concern config as BoolLogic, validator, or JS effect. */\n/** Collect a schema validator registration. */\nconst collectValidator = (\n path: string,\n concernName: string,\n config: Record<string, any>,\n validatorListeners: CollectedRegistrations['validatorListeners'],\n subscriberFns: CollectedRegistrations['subscriberFns'],\n) => {\n const validatorId = nextValidatorId++\n const outputPath = `${path}.${concernName}`\n\n // Concerns are registered at a specific path. By default they listen on and\n // receive the value at that path (scope_path = path). When the user provides\n // a `scope` override, we use it for both topic_paths and scope_path so the\n // validator receives the broader context it needs.\n //\n // Example: validating 'user.email' with scope 'user'\n // topic_paths: ['user'] ← listen for changes under 'user'\n // scope_path: 'user' ← receive the 'user' object as scopedState\n //\n // IMPORTANT: The router relativizes change paths against the topic prefix.\n // A change to 'email' under topic 'email' arrives as 'email' (exact match →\n // kept as-is). But 'email.validationState' arrives as 'validationState'\n // (child → stripped prefix). The wrapper must ignore these concern-result\n // changes to avoid infinite re-triggering.\n const listenPath =\n 'scope' in config && config['scope'] ? (config['scope'] as string) : path\n\n validatorListeners.push({\n subscriber_id: validatorId,\n topic_paths: [listenPath],\n scope_path: listenPath,\n name: `validator:${outputPath}`,\n run_on_registration: true,\n })\n\n // Build Zod wrapper closure — schema lives inside, WASM calls it via externref.\n // Listener-compatible: (changes, scopedState) → [[path, value, meta]]\n //\n // scopedState = old_shadow value at scope_path (before current wave changes).\n // changes = relativized changes matching the topic.\n //\n // When scope_path = path (default, e.g. 'email'):\n // scopedState is the scalar field value, changes arrive as [['email', newVal]].\n // We pick the new value from changes; fall back to scopedState for initial dispatch.\n //\n // When scope_path = custom scope (e.g. 'user'):\n // scopedState is the parent object, changes arrive relative to 'user'.\n // We apply changes to scopedState, then extract the field via dot.get.\n const schema = config['schema']\n const wrapper = (\n changes: [string, unknown, unknown][],\n scopedState: unknown,\n ): [string, unknown, Record<string, unknown>][] | null => {\n const fieldValue = resolveFieldValue(changes, scopedState, listenPath, path)\n const parseResult = schema.safeParse(fieldValue)\n return [\n [\n outputPath,\n {\n isError: !parseResult.success,\n errors: parseResult.success\n ? []\n : parseResult.error.errors.map(\n (e: { path: (string | number)[]; message: string }) => ({\n field: is.not.empty(e.path) ? e.path.join('.') : '.',\n message: e.message,\n }),\n ),\n },\n { isConcern: true },\n ],\n ]\n }\n\n subscriberFns.set(validatorId, wrapper as (...args: unknown[]) => unknown)\n}\n\n/** Classify a single concern config and push to the appropriate bucket. */\nconst classifyConcern = (\n path: string,\n concernName: string,\n config: Record<string, any>,\n concernsAtPath: Record<string, unknown>,\n concernMap: Map<string, ConcernType>,\n result: CollectedRegistrations,\n) => {\n // Expression registration (boolLogic / valueLogic → unified WASM ExpressionRegistration)\n const expr = toExpressionRegistration(`${path}.${concernName}`, config)\n if (expr) {\n result.expressions.push(expr)\n return\n }\n\n // Schema validator registration (WASM)\n if (isSchemaValidation(concernName, config)) {\n collectValidator(\n path,\n concernName,\n config,\n result.validatorListeners,\n result.subscriberFns,\n )\n return\n }\n\n // JS-based concern — queue for effect creation after WASM batch\n // Resolve concern from registry, or create ad-hoc for inline evaluate functions\n const concern =\n concernMap.get(concernName) ??\n (isAdHocConcern(config)\n ? {\n name: concernName,\n description: `Custom concern: ${concernName}`,\n evaluate: config.evaluate,\n }\n : undefined)\n\n if (!concern) {\n console.warn(`Concern \"${concernName}\" not found`)\n return\n }\n\n result.jsEffects.push({ path, concernName, config, concern, concernsAtPath })\n}\n\n/** Single-pass: classify each concern config as BoolLogic, ValueLogic, validator, or JS effect. */\nconst collectRegistrations = (\n registrationEntries: [string, Record<string, any> | undefined][],\n concernRefs: Map<string, Record<string, unknown>>,\n concernMap: Map<string, ConcernType>,\n): CollectedRegistrations => {\n const result: CollectedRegistrations = {\n expressions: [],\n validatorListeners: [],\n subscriberFns: new Map(),\n jsEffects: [],\n }\n\n for (const [path, concernConfigs] of registrationEntries) {\n if (!concernConfigs) continue\n const concernsAtPath = concernRefs.get(path)!\n\n for (const [concernName, config] of Object.entries(concernConfigs)) {\n if (!config) continue\n classifyConcern(\n path,\n concernName,\n config,\n concernsAtPath,\n concernMap,\n result,\n )\n }\n }\n\n return result\n}\n\n/** Clean up concern values from the concerns proxy on unmount. */\nconst cleanupConcerns = <DATA extends object>(\n store: StoreInstance<DATA>,\n registrationEntries: [string, Record<string, any> | undefined][],\n) => {\n for (const [path, concernConfigs] of registrationEntries) {\n if (!concernConfigs) continue\n const concernsObj = store._concerns[path]\n if (!concernsObj) continue\n\n // Delete specific concerns for this path\n for (const concernName of Object.keys(concernConfigs)) {\n // Use Reflect.deleteProperty to avoid dynamic delete lint error\n Reflect.deleteProperty(concernsObj, concernName)\n }\n\n // Clean up empty path object\n if (is.empty(concernsObj)) {\n Reflect.deleteProperty(store._concerns, path)\n }\n }\n}\n\nexport const registerConcernEffects = <DATA extends object>(\n store: StoreInstance<DATA>,\n registration: ConcernRegistrationMap<DATA>,\n concerns: readonly ConcernType[],\n): (() => void) => {\n const disposeCallbacks: (() => void)[] = []\n const resultCache = new Map<string, unknown>()\n const concernRefs = new Map<string, Record<string, unknown>>()\n\n // Build O(1) concern lookup map (avoids linear .find() per inner iteration)\n const concernMap = new Map<string, ConcernType>()\n for (const c of concerns) {\n concernMap.set(c.name, c)\n }\n\n // Pre-initialize all path objects BEFORE creating effects\n const registrationEntries = Object.entries(registration) as [\n string,\n Record<string, any> | undefined,\n ][]\n for (const [path] of registrationEntries) {\n if (!store._concerns[path]) {\n store._concerns[path] = {}\n }\n concernRefs.set(path, store._concerns[path])\n }\n\n // Single pass: classify all concern configs\n const { expressions, validatorListeners, subscriberFns, jsEffects } =\n collectRegistrations(registrationEntries, concernRefs, concernMap)\n\n // Register all expressions and validators in one WASM call\n if (is.not.empty(expressions) || is.not.empty(validatorListeners)) {\n registerWasmBatch(\n store._internal.pipeline!,\n expressions,\n validatorListeners,\n subscriberFns,\n concernRefs,\n disposeCallbacks,\n )\n }\n\n // Create effects for queued JS-based concerns\n for (const item of jsEffects) {\n disposeCallbacks.push(createConcernEffect(store, item, resultCache))\n }\n\n // Return cleanup function that disposes all effects on unmount\n return () => {\n for (const dispose of disposeCallbacks) dispose()\n resultCache.clear()\n concernRefs.clear()\n cleanupConcerns(store, registrationEntries)\n }\n}\n","/**\n * Store React Context and Hook\n *\n * Core primitives for providing and accessing the store instance.\n * This module has minimal dependencies to avoid circular imports.\n */\n\nimport { createContext, useContext } from 'react'\n\nimport type { StoreInstance } from './types'\n\n/**\n * React Context for the store instance\n * Null by default - will be populated by Provider\n */\nexport const StoreContext = createContext<StoreInstance<any> | null>(null)\n\nStoreContext.displayName = 'StoreContext'\n\n/**\n * Access the store instance from context.\n *\n * @internal Package-internal. Do not use directly.\n * @throws Error if used outside Provider\n */\nexport const useStoreContext = <DATA extends object>(): StoreInstance<DATA> => {\n const store = useContext(StoreContext) as StoreInstance<DATA> | null\n\n if (!store) {\n throw new Error(\n 'useStoreContext must be used within a Store Provider. ' +\n 'Make sure your component is wrapped in <store.Provider>.',\n )\n }\n\n return store\n}\n","/**\n * WASM Pipeline - processChanges implementation (EP17: externref dispatch)\n *\n * WASM owns the full pipeline: aggregation → sync → flip → BoolLogic → listener waves.\n * Listener dispatch happens inside WASM via externref (JsFn::call2).\n * JS receives final changes + listener errors — no execution plan, no round-trips.\n *\n * Data model: `Change` is normalized once at entry and carried through every stage.\n * Meta stays attached to each record. State vs concern partitioning uses the\n * `_concerns.` path prefix directly at apply time.\n */\n\nimport { snapshot } from 'valtio'\n\nimport type {\n ConcernValues,\n DebugTrackEntry,\n StoreInstance,\n} from '../core/types'\nimport type { ArrayOfChanges, GenericMeta } from '../types'\nimport { is } from '../utils/is'\nimport type { Change } from '../wasm/bridge'\nimport { applyBatch } from './apply-batch'\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n// No _concerns. prefix convention — concern changes are identified by\n// registration_meta.isConcern (stamped by WASM from TS-provided meta).\n\n// ---------------------------------------------------------------------------\n// Normalization — single entry point, one shape for the entire pipeline\n// ---------------------------------------------------------------------------\n\n/** Normalize input tuples into Change[] once at entry. */\nconst normalizeInputChanges = <DATA extends object, META extends GenericMeta>(\n input: ArrayOfChanges<DATA, META>,\n): Change[] =>\n input.map(([path, value, meta]) => ({\n path: path as string,\n value,\n meta: (meta ?? {}) as GenericMeta,\n }))\n\n// ---------------------------------------------------------------------------\n// Apply helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Apply concern changes to store._concerns.\n *\n * STRUCTURE: _concerns uses a two-level map for efficient lookups:\n * ```typescript\n * _concerns[\"user.email\"][\"validationState\"] = { isError: false, ... }\n * _concerns[\"user.email\"][\"disabledWhen\"] = true\n * ```\n *\n * WHY TWO LEVELS:\n * - First level: full path to the field (e.g., \"user.email\")\n * - Second level: concern name (e.g., \"validationState\", \"disabledWhen\")\n * - This allows getting all concerns for a path: `_concerns[\"user.email\"]`\n * - React hooks can efficiently subscribe to specific path+concern combinations\n *\n * INPUT FORMAT: Paths come from WASM as \"basePath.concernName\" (no _concerns. prefix after partition)\n * - Example: \"user.email.validationState\" → _concerns[\"user.email\"][\"validationState\"]\n * - We split on the LAST dot to separate basePath from concernName\n *\n * @param changes - Change[] with paths stripped of _concerns. prefix\n * @param concerns - The store._concerns proxy to apply changes to\n */\nconst applyConcernChanges = (\n changes: Change[],\n concerns: ConcernValues,\n): void => {\n for (const c of changes) {\n const lastDot = c.path.lastIndexOf('.')\n const basePath = c.path.slice(0, lastDot)\n const concernName = c.path.slice(lastDot + 1)\n\n if (!concerns[basePath]) {\n concerns[basePath] = {}\n }\n concerns[basePath]![concernName] = c.value\n }\n}\n\n// No stripConcernPrefix needed — concern paths arrive without _concerns. prefix.\n// The output_path is the registration path directly (e.g. \"user.email.disabledWhen\").\n\n// ---------------------------------------------------------------------------\n// Record applied changes for debug tracking\n// ---------------------------------------------------------------------------\n\nconst pushDebugChanges = (\n target: { path: string; value: unknown }[],\n changes: Change[],\n): void => {\n for (const c of changes) {\n target.push({ path: c.path, value: c.value })\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main WASM pipeline implementation (EP17: externref dispatch)\n// ---------------------------------------------------------------------------\n\nexport const processChangesWasm = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n>(\n store: StoreInstance<DATA>,\n initialChanges: ArrayOfChanges<DATA, META>,\n): void => {\n const pipeline = store._internal.pipeline\n const { logger } = store._internal\n\n // Guard: pipeline is null during React StrictMode's simulated unmount/remount gap\n // (dev-only). The first mount executed correctly; the second invocation is idempotent\n // by design, so dropping writes here is correct. Also handles stale post-unmount calls.\n //\n // In production this path is unreachable — Guards 1 & 2 in provider.tsx ensure the\n // pipeline is always initialized before any setValue can fire. The dev warning below\n // catches regressions where pipeline is null for reasons other than StrictMode.\n if (!pipeline) {\n console.warn(\n '[apex-state] processChanges called with no active pipeline. ' +\n 'Expected during React StrictMode effect re-mount — ' +\n 'if you see this outside StrictMode, it indicates a bug.',\n )\n return\n }\n\n // Normalize once at entry — Change[] is the single shape for the entire pipeline\n const pipelineChanges = normalizeInputChanges(initialChanges)\n\n // Initialize debug entry if tracking is enabled\n const trackEntry: DebugTrackEntry | null = store._debug\n ? {\n input: initialChanges.map(([p, v, m]) => [p as string, v, m]),\n applied: [],\n appliedConcerns: [],\n timestamp: Date.now(),\n }\n : null\n\n const t0 = performance.now()\n\n // EP17: Single WASM call handles the entire pipeline including listener dispatch.\n // No execution plan, no round-trips — WASM calls listener functions via externref.\n const {\n changes: resultChanges,\n listener_errors,\n trace,\n } = pipeline.processChanges(pipelineChanges)\n\n // Early exit if no changes produced\n if (is.empty(resultChanges) && is.empty(listener_errors)) {\n if (trackEntry) store._debug!.calls.push(trackEntry)\n return\n }\n\n const finalChanges = resultChanges\n\n // Partition by registration meta: changes with isConcern go to _concerns proxy,\n // everything else goes to state. The isConcern flag is stamped by WASM from\n // the registration_meta provided at expression registration time.\n const isConcernChange = (c: Change): boolean => !!c.meta.isConcern\n\n const stateChanges = finalChanges.filter((c) => !isConcernChange(c))\n const concernChanges = finalChanges.filter(isConcernChange)\n\n if (is.not.empty(stateChanges)) {\n applyBatch(stateChanges, store.state)\n }\n if (is.not.empty(concernChanges)) {\n applyConcernChanges(concernChanges, store._concerns)\n }\n\n // Surface listener errors — visible and loud, never silent\n if (is.not.empty(listener_errors)) {\n console.error('[apex-state] Listener errors:', listener_errors)\n }\n\n // @TODO (T8): include wall-clock duration in trace (add apply stage with performance.now() - t0)\n void (performance.now() - t0)\n\n // Single log call with all pipeline data (no-op when log/devtools is disabled)\n const allApplied = [...stateChanges, ...concernChanges]\n\n const logData = {\n initialChanges: pipelineChanges,\n trace,\n appliedChanges: allApplied,\n stateSnapshot: snapshot(store.state),\n }\n logger.logPipeline(logData)\n store._internal.devtools?.notifyPipeline(logData)\n\n // Record applied changes for debug tracking\n if (trackEntry) {\n pushDebugChanges(trackEntry.applied, stateChanges)\n pushDebugChanges(trackEntry.appliedConcerns, concernChanges)\n store._debug!.calls.push(trackEntry)\n }\n}\n","/**\n * Batch Application\n *\n * Applies a batch of changes to state, checking for actual value differences.\n */\n\nimport { dot } from '../utils/dot'\nimport type { Change } from '../wasm/bridge'\n\nexport const applyBatch = (changes: Change[], state: object): void => {\n for (const { path, value } of changes) {\n dot.set__unsafe(state, path, value)\n }\n}\n","/**\n * WASM Implementation - Side Effects Registration\n *\n * Consolidates all side effects (sync, flip, aggregation, listeners) into a single\n * WASM call for efficiency. No legacy fallback logic - assumes WASM is loaded.\n */\n\nimport { snapshot } from 'valtio'\n\nimport type { MultiPathListener, StoreInstance } from '../core/types'\nimport { applyBatch } from '../pipeline/apply-batch'\nimport type { GenericMeta } from '../types'\nimport { pairs } from '../types/pairs'\nimport type { SideEffects } from '../types/side-effects'\nimport { is } from '../utils/is'\n\n/** Auto-incrementing subscriber ID counter for O(1) handler lookup. */\nlet nextSubscriberId = 0\n\nexport const registerSideEffects = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n>(\n store: StoreInstance<DATA>,\n id: string,\n effects: SideEffects<DATA, META>,\n): (() => void) => {\n const t0 = performance.now()\n\n // Build consolidated side effects registration\n const { bidirectional: syncPairs, directed: directedSyncPairs } =\n pairs.syncToWasm(effects.syncPaths ?? [])\n\n const flipPairs = effects.flipPaths ?? []\n const aggregationPairs = pairs.aggregationToWasm(effects.aggregations ?? [])\n\n // Serialize computations: [op, target, source, condition?] → WASM format\n const computationPairs = pairs.computationToWasm(effects.computations ?? [])\n\n // Transform clearPaths: public API format → WASM format\n // When expandMatch: true, rewrite [*] → [**] in target paths\n const clearPaths = effects.clearPaths?.map(([triggers, targets, opts]) => ({\n triggers: triggers,\n targets: opts?.expandMatch\n ? targets.map((t) => t.replace(/\\[\\*\\]/g, '[**]'))\n : targets,\n }))\n\n // Type guard to distinguish MultiPathListener from SinglePathListener\n const isMultiPath = (\n listener: unknown,\n ): listener is MultiPathListener<DATA, META> =>\n Array.isArray((listener as { path: unknown }).path)\n\n // EP17: Map<subscriber_id, Function> for externref dispatch in WASM\n const subscriberFns = new Map<number, (...args: unknown[]) => unknown>()\n\n const listeners = effects.listeners?.map((listener) => {\n // Assign unique subscriber_id for O(1) handler lookup\n const subscriberId = nextSubscriberId++\n\n const originalFn = listener.fn\n\n // Discriminated union: TypeScript narrows the type based on path structure.\n // Cast: DeepKey values are always strings at runtime. TypeScript can't simplify\n // DeepKey<DATA,20> | DeepKey<DATA,20>[] to string[] without the cast.\n const topicPaths = (\n isMultiPath(listener) ? listener.path : [listener.path ?? '']\n ) as string[]\n\n // For single-path: scope defaults to path when NOT explicitly set (undefined).\n // null is an explicit \"no scope\" value → full state is passed to the handler.\n // For multi-path: scope must be explicitly set (required in type).\n // Cast: isMultiPath is false in the else branch, so path is never an array at runtime.\n // TypeScript can't narrow SinglePathListener.path to exclude DeepKey[] here.\n const effectiveScope = (\n isMultiPath(listener)\n ? listener.scope\n : listener.scope === undefined\n ? listener.path\n : listener.scope\n ) as string | null\n\n // EP17: Pass function ref to WASM as externref — WASM calls it directly\n // via JsFn::call2 during dispatch_listener_waves. Name is read from\n // Function.name in Rust and cached in ListenerEntry for log enrichment.\n subscriberFns.set(\n subscriberId,\n originalFn as (...args: unknown[]) => unknown,\n )\n\n return {\n subscriber_id: subscriberId,\n topic_paths: topicPaths,\n scope_path: effectiveScope ?? '',\n name: originalFn.name || '(anonymous)',\n run_on_registration: null,\n }\n })\n\n // Single consolidated WASM call with all side effects\n const pipeline = store._internal.pipeline!\n const registrationId = `sideEffects-${id}`\n const registration = {\n registration_id: registrationId,\n sync_pairs: syncPairs,\n directed_sync_pairs: directedSyncPairs,\n flip_pairs: flipPairs as [string, string][],\n aggregation_pairs: aggregationPairs,\n computation_pairs: computationPairs,\n clear_paths: clearPaths ?? [],\n listeners: listeners ?? [],\n anchor_path: (effects.anchorPath ?? null) as string | null,\n }\n\n const result = pipeline.registerSideEffects(registration, subscriberFns)\n\n // Apply sync changes directly to valtio state.\n // IMPORTANT: Do NOT route through processChanges() here — it would diff against shadow,\n // see \"no change\" (shadow was already updated by register_sync_batch), return\n // has_work=false, and skip writing to valtio.\n //\n // Instead: register_sync_batch returns ALL initial sync changes (not just the\n // shadow-diffed subset), and applyBatch's own `current !== value` guard handles\n // valtio-level idempotency. This covers two divergence scenarios:\n // - Direct proxy mutations (bypassing processChanges) leave shadow ahead of valtio\n // - Navigation remount with preserved pipeline reuses stale shadow\n // In both cases, applyBatch correctly writes the synced value to valtio even\n // when shadow already has it.\n const appliedChanges = [\n ...result.sync_changes,\n ...result.aggregation_changes,\n ...result.computation_changes,\n ]\n\n // Apply changes to state\n if (is.not.empty(appliedChanges)) {\n applyBatch(appliedChanges, store.state)\n }\n\n const durationMs = performance.now() - t0\n\n // Log registration (no-op when log is disabled)\n store._internal.logger.logRegistration({\n type: 'register',\n id,\n snapshot: {},\n data: {\n result,\n appliedChanges,\n stateSnapshot: snapshot(store.state),\n durationMs,\n },\n })\n store._internal.devtools?.notifyRegistration('register', id, result)\n\n // Create cleanup function\n const cleanup = () => {\n const ut0 = performance.now()\n const unregResult = pipeline.unregisterSideEffects(registrationId)\n const unregDurationMs = performance.now() - ut0\n store._internal.logger.logRegistration({\n type: 'unregister',\n id,\n snapshot: {},\n data: {\n result: unregResult,\n appliedChanges,\n stateSnapshot: snapshot(store.state),\n durationMs: unregDurationMs,\n },\n })\n store._internal.devtools?.notifyRegistration('unregister', id, unregResult)\n\n Reflect.deleteProperty(store._internal.registrations.cleanups, id)\n }\n\n // Store cleanup reference\n if (!store._internal.registrations.cleanups[id]) {\n store._internal.registrations.cleanups[id] = []\n }\n store._internal.registrations.cleanups[id].push(cleanup)\n\n return cleanup\n}\n","/**\n * Pair WASM boundary conversion helpers\n *\n * Mirrors the pattern of `changes.ts` — converts typed pair arrays\n * to the flat string-tuple format expected by WASM registration calls.\n *\n * The optional BoolLogic condition (always the last element) is JSON-serialized\n * since WASM receives it as a string for serde deserialization.\n */\n\nimport type {\n AggregationPair,\n ComputationPair,\n SyncPair,\n} from './paths-of-same-value'\nimport type {\n ValidatedAggregationPairs,\n ValidatedComputationPairs,\n ValidatedSyncPairs,\n} from './validated-pairs'\n\n/**\n * Convert aggregation pairs to WASM format.\n * Serializes the optional BoolLogic condition to a JSON string.\n */\nconst aggregationToWasm = <DATA extends object>(\n input: AggregationPair<DATA>[] | ValidatedAggregationPairs<DATA>,\n): ([string, string] | [string, string, string])[] =>\n (input as ([string, string] | [string, string, unknown])[]).map(\n ([target, source, condition]) =>\n condition !== undefined\n ? [target, source, JSON.stringify(condition)]\n : [target, source],\n ) as ([string, string] | [string, string, string])[]\n\n/**\n * Convert computation pairs to WASM format.\n * Serializes the optional BoolLogic condition to a JSON string.\n */\nconst computationToWasm = <DATA extends object>(\n input: ComputationPair<DATA>[] | ValidatedComputationPairs<DATA>,\n): ([string, string, string] | [string, string, string, string])[] =>\n (\n input as ([string, string, string] | [string, string, string, unknown])[]\n ).map(([op, target, source, condition]) =>\n condition !== undefined\n ? [op, target, source, JSON.stringify(condition)]\n : [op, target, source],\n ) as ([string, string, string] | [string, string, string, string])[]\n\n/**\n * Split sync pairs into bidirectional and directed (oneWay) groups for WASM registration.\n * Pairs without `oneWay` go into bidirectional (existing sync graph).\n * Pairs with `oneWay: '[0]->[1]'` → [pair[0], pair[1]] directed edge.\n * Pairs with `oneWay: '[1]->[0]'` → [pair[1], pair[0]] directed edge (reversed).\n */\nconst syncToWasm = <DATA extends object>(\n input: SyncPair<DATA>[] | ValidatedSyncPairs<DATA>,\n): { bidirectional: [string, string][]; directed: [string, string][] } => {\n const bidirectional: [string, string][] = []\n const directed: [string, string][] = []\n for (const pair of input as (\n | [string, string]\n | [string, string, { oneWay: '[0]->[1]' | '[1]->[0]' }]\n )[]) {\n if (pair.length === 3) {\n const dir = pair[2].oneWay\n directed.push(\n dir === '[0]->[1]' ? [pair[0], pair[1]] : [pair[1], pair[0]],\n )\n } else {\n bidirectional.push([pair[0], pair[1]])\n }\n }\n return { bidirectional, directed }\n}\n\n/** WASM boundary conversion utilities for pair arrays. */\nexport const pairs = { aggregationToWasm, computationToWasm, syncToWasm }\n","import { is } from './is'\n\n/**\n * Filters a concerns map to only include entries for the given keys.\n * Paths with no matching keys are omitted entirely.\n */\nexport const filterConcernsByKeys = (\n raw: Record<string, Record<string, unknown>>,\n keys: string[],\n): Record<string, Record<string, unknown>> => {\n const result: Record<string, Record<string, unknown>> = {}\n for (const [path, pathConcerns] of Object.entries(raw)) {\n const filtered: Record<string, unknown> = {}\n for (const key of keys) {\n if (Object.prototype.hasOwnProperty.call(pathConcerns, key)) {\n filtered[key] = pathConcerns[key]\n }\n }\n if (is.not.empty(Object.keys(filtered))) result[path] = filtered\n }\n return result\n}\n","import { useLayoutEffect, useRef } from 'react'\n\nimport { proxy, ref } from 'valtio'\n\nimport { StoreContext } from '../core/context'\nimport { DEFAULT_STORE_CONFIG } from '../core/defaults'\nimport type {\n DebugTrack,\n InternalState,\n ProviderProps,\n StoreConfig,\n StoreInstance,\n} from '../core/types'\nimport type { DeepRequired } from '../types'\nimport { deepClone } from '../utils/deep-clone'\nimport { deepMerge } from '../utils/deep-merge'\nimport {\n attachComputedGetters,\n prepareInitialState,\n} from '../utils/derive-values'\nimport { createLogger } from '../utils/log'\nimport { initPipeline, WasmGate } from '../wasm/lifecycle'\nimport { attachDevtools } from './devtools'\n\nexport const createInternalState = (\n config: DeepRequired<StoreConfig>,\n): InternalState => ({\n registrations: {\n cleanups: {},\n },\n logger: createLogger(config.debug),\n config,\n devtools: null,\n pipeline: null,\n})\n\nexport const createProvider = <DATA extends object>(\n storeConfig?: StoreConfig,\n) => {\n // Resolve config with defaults at factory time\n const resolvedConfig = deepMerge(DEFAULT_STORE_CONFIG, storeConfig)\n\n // Build store instance from raw initialState + resolved config.\n // Pure function — no hooks, no side effects, safe to call during render.\n const buildStore = (rawInitialState: DATA): StoreInstance<DATA> => {\n const prepared = prepareInitialState(deepClone(rawInitialState))\n const internal = createInternalState(resolvedConfig)\n\n // Always create pipeline — WasmGate guarantees WASM is loaded.\n initPipeline(internal, prepared.initialState, {\n debug: resolvedConfig.debug.log ?? false,\n })\n\n const debugTrack: DebugTrack | null = resolvedConfig.debug.track\n ? {\n calls: [],\n clear: () => {\n debugTrack!.calls.length = 0\n },\n }\n : null\n\n const stateProxy = proxy(prepared.initialState)\n attachComputedGetters(stateProxy, prepared.getterMap)\n\n const concernsProxy = proxy({} as Record<string, Record<string, unknown>>)\n\n internal.devtools = attachDevtools(\n resolvedConfig,\n stateProxy,\n concernsProxy,\n )\n\n return {\n // state: Application data (tracked by valtio)\n // User actions WRITE to this, effects READ from this\n state: stateProxy,\n\n // _concerns: Computed concern values (tracked by valtio)\n // Effects WRITE to this, UI components READ from this\n _concerns: concernsProxy,\n\n // _internal: Graphs, registrations, processing (NOT tracked)\n // Wrapped in ref() to prevent tracking even if store is later wrapped in a proxy\n _internal: ref(internal),\n\n // _debug: Tracking data for testing/debugging (only when debug.track enabled)\n _debug: debugTrack ? ref(debugTrack) : null,\n }\n }\n\n // Inner provider: WASM is guaranteed loaded when this renders (WasmGate blocks).\n // useRef runs exactly once — NOT double-invoked by StrictMode, no effects, no cleanup.\n //\n // Pipeline lifecycle: No deferred destroy timer. Benchmarking showed the StrictMode\n // register → unregister → register cycle takes ~1.5ms vs ~2.5ms with full rebuild —\n // negligible difference that doesn't justify the timer complexity. Instead, the pipeline\n // is destroyed immediately on unmount and rebuilt during render if needed.\n const StoreProvider = ({ initialState, children }: ProviderProps<DATA>) => {\n const storeRef = useRef(buildStore(initialState))\n const internal = storeRef.current._internal\n\n // Guard 1 — render phase (actual remount after timer fired).\n // Handles: Provider truly unmounts and remounts (e.g. conditional rendering) after the\n // deferred destroy timer fires and sets pipeline = null.\n // Why here: render is parent-first and runs BEFORE any effects. Children's\n // useLayoutEffects (useSideEffects, useConcerns registration) fire bottom-up AFTER\n // the render phase, so placing init here guarantees the pipeline exists before any\n // child effect runs. Moving this into useLayoutEffect would be too late.\n if (!internal.pipeline) {\n const { initialState: cleanState } = prepareInitialState(\n deepClone(initialState),\n )\n initPipeline(internal, cleanState, {\n debug: resolvedConfig.debug.log ?? false,\n })\n }\n\n // Guard 2 — deferred destroy (React StrictMode).\n // Handles: StrictMode's double-effect cycle (cleanup → re-run) without destroying\n // the pipeline during the gap.\n //\n // Problem: effects fire bottom-up (children before parent). If we destroy in cleanup,\n // children's useSideEffects/useConcerns re-register with null pipeline before the\n // parent's useLayoutEffect body can rebuild it. useInsertionEffect doesn't reliably\n // fire during StrictMode re-run in JSDOM (empirically confirmed).\n //\n // Solution: defer destruction with setTimeout(0). StrictMode re-mounts synchronously\n // cancel the timer before it fires, so the pipeline survives the cycle intact.\n // Actual unmounts let the timer fire and destroy.\n const destroyTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n useLayoutEffect(() => {\n // Cancel deferred destruction — we're re-mounting (StrictMode or conditional render)\n if (destroyTimerRef.current !== null) {\n clearTimeout(destroyTimerRef.current)\n destroyTimerRef.current = null\n }\n\n return () => {\n const pipelineToDestroy = internal.pipeline\n const devtoolsToDestroy = internal.devtools\n\n destroyTimerRef.current = setTimeout(() => {\n // Call all remaining cleanup functions (in case components didn't unmount cleanly)\n for (const cleanupList of Object.values(\n internal.registrations.cleanups,\n )) {\n for (const cleanup of cleanupList) {\n cleanup()\n }\n }\n internal.registrations.cleanups = {}\n\n pipelineToDestroy?.destroy()\n devtoolsToDestroy?.destroy()\n // Only null out if not rebuilt by a remount (Guard 1 creates a new instance)\n if (internal.pipeline === pipelineToDestroy) internal.pipeline = null\n if (internal.devtools === devtoolsToDestroy) internal.devtools = null\n destroyTimerRef.current = null\n }, 0)\n }\n }, [internal])\n\n return (\n <StoreContext.Provider\n value={storeRef.current as unknown as StoreInstance<any>}\n >\n {children}\n </StoreContext.Provider>\n )\n }\n\n StoreProvider.displayName = 'StoreProvider'\n\n // Always wrap with WasmGate — WASM is loaded regardless of mode.\n const Provider = (props: ProviderProps<DATA>) => (\n <WasmGate>\n <StoreProvider {...props} />\n </WasmGate>\n )\n\n Provider.displayName = 'StoreProvider'\n\n return Provider\n}\n","import type { DeepRequired } from '../types'\nimport type { StoreConfig } from './types'\n\nexport const DEFAULT_STORE_CONFIG: DeepRequired<StoreConfig> = {\n name: 'store',\n errorStorePath: '_errors',\n maxIterations: 100,\n debug: {\n log: false,\n timing: false,\n timingThreshold: 5,\n track: false,\n devtools: false,\n },\n}\n","/**\n * Deep clone utility — single swap point for the cloning implementation.\n *\n * Uses @jsbits/deep-clone in \"exact\" mode which preserves:\n * - Getter/setter property descriptors\n * - Property attributes (enumerable, configurable, writable)\n * - Prototypes\n *\n * Swap the implementation here to change cloning behavior everywhere.\n */\n\nimport _deepClone from '@jsbits/deep-clone'\n\n/**\n * Detect circular references in an object graph.\n * Throws a descriptive error if a cycle is found.\n */\nconst assertNoCycles = (value: unknown): void => {\n if (value === null || typeof value !== 'object') return\n\n // Track current ancestor chain only — shared references (diamonds) are fine\n const ancestors = new WeakSet<object>()\n\n const walk = (obj: object, path: string): void => {\n if (ancestors.has(obj)) {\n throw new Error(\n `[deepClone] Circular reference detected at \"${path}\". ` +\n 'State objects must not contain self-references.',\n )\n }\n ancestors.add(obj)\n\n const descriptors = Object.getOwnPropertyDescriptors(obj)\n for (const [key, desc] of Object.entries(descriptors)) {\n // Skip getters — they may have side effects or depend on runtime context\n if (desc.get) continue\n if (desc.value !== null && typeof desc.value === 'object') {\n walk(desc.value as object, path ? `${path}.${key}` : key)\n }\n }\n\n ancestors.delete(obj)\n }\n\n walk(value as object, '')\n}\n\n/**\n * Deep clone an object, preserving getters, setters, and property descriptors.\n * Returns a fully independent copy — mutations to the clone never affect the original.\n *\n * Throws if the input contains circular references.\n */\nexport const deepClone = <T>(value: T): T => {\n assertNoCycles(value)\n return _deepClone(value, true) as T\n}\n","import type { DeepPartial } from '../types'\nimport { is } from './is'\n\n/**\n * Deep merge two objects, with source values overriding target values.\n * Only handles plain objects (not arrays, dates, etc.) - suitable for config merging.\n */\nexport const deepMerge = <T extends object>(\n target: T,\n source?: DeepPartial<T>,\n): T => {\n if (!source) return target\n\n const result = { ...target }\n\n // DeepPartial<T> has the same keys as T when T extends object.\n // Cast to a known-keyed type so TypeScript allows indexing both objects.\n const src = source as { [K in keyof T]?: unknown }\n\n for (const key in src) {\n if (!Object.prototype.hasOwnProperty.call(src, key)) continue\n\n const k = key as Extract<keyof T, string>\n const sourceValue = src[k]\n const targetValue = target[k]\n\n if (is.undefined(sourceValue)) {\n continue\n }\n\n if (is.object(sourceValue) && is.object(targetValue)) {\n result[k] = deepMerge(\n targetValue,\n sourceValue as DeepPartial<typeof targetValue>,\n ) as T[typeof k]\n } else {\n result[k] = sourceValue as T[typeof k]\n }\n }\n\n return result\n}\n","/**\n * Derived value auto-detection\n *\n * Scans an object for getter properties and extracts them for use with\n * valtio's computed() pattern. Provides utilities to extract getters from\n * initial state and re-attach them as selectively-tracked computed proxies.\n */\n\nimport { computed } from 'valtio-reactive'\n\nimport { dot } from './dot'\nimport { is } from './is'\n\nexport type GetterMap = Record<\n string,\n { get: () => unknown; parentPath: string }\n>\n\n/**\n * Detects getter properties in an object (including nested objects)\n * Returns an object mapping property paths to their getter functions\n *\n * @example\n * ```typescript\n * const obj = {\n * firstName: 'John',\n * lastName: 'Doe',\n * get fullName() { return `${this.firstName} ${this.lastName}` }\n * }\n *\n * const getters = detectGetters(obj)\n * // { fullName: (snap) => snap.firstName + ' ' + snap.lastName }\n * ```\n */\nexport const detectGetters = <T extends object>(\n obj: T,\n prefix = '',\n): Record<string, (snap: any) => any> => {\n const getters: Record<string, (snap: any) => any> = {}\n\n // Get own property descriptors to detect getters\n const descriptors = Object.getOwnPropertyDescriptors(obj)\n\n for (const [key, descriptor] of Object.entries(descriptors)) {\n // Skip non-enumerable properties and symbols\n if (!descriptor.enumerable || is.symbol(key)) {\n continue\n }\n\n const fullPath = prefix ? `${prefix}.${key}` : key\n\n // Check if it's a getter\n if (descriptor.get) {\n // Convert getter to a function that works with valtio snapshots\n getters[fullPath] = (snap: any) => {\n // Get the nested object if there's a prefix\n const target = prefix\n ? prefix.split('.').reduce((obj, k) => obj?.[k], snap)\n : snap\n\n // Call the original getter with the appropriate context\n return descriptor.get!.call(target)\n }\n }\n // Recursively check nested objects (but not functions, arrays, or primitives)\n else if (is.object(descriptor.value)) {\n const nestedGetters = detectGetters(descriptor.value, fullPath)\n Object.assign(getters, nestedGetters)\n } else {\n // Primitive values or arrays - no action needed\n }\n }\n\n return getters\n}\n\n/**\n * Extracts getters from an object (including nested) and returns a getter-free base\n * plus a map of dot-path keyed getter definitions for use with computed().\n *\n * @example\n * ```typescript\n * const obj = {\n * a: 1,\n * b: 2,\n * get sum() { return this.a + this.b },\n * nested: {\n * x: 10,\n * get double() { return this.x * 2 }\n * }\n * }\n *\n * const { base, computed } = extractGetters(obj)\n * // base = { a: 1, b: 2, nested: { x: 10 } }\n * // computed = {\n * // sum: { get: [getter fn], parentPath: '' },\n * // 'nested.double': { get: [getter fn], parentPath: 'nested' }\n * // }\n * ```\n */\nexport const extractGetters = <T extends object>(\n obj: T,\n prefix = '',\n): {\n base: Partial<T>\n computed: GetterMap\n} => {\n const base: any = {}\n const computed: GetterMap = {}\n\n const descriptors = Object.getOwnPropertyDescriptors(obj)\n\n for (const [key, descriptor] of Object.entries(descriptors)) {\n if (!descriptor.enumerable || is.symbol(key)) continue\n const fullPath = prefix ? `${prefix}.${key}` : key\n\n if (descriptor.get) {\n // Getter → store original getter fn + the parent path for context binding\n computed[fullPath] = { get: descriptor.get, parentPath: prefix }\n } else if (is.object(descriptor.value)) {\n // Recurse into nested objects\n const nested = extractGetters(descriptor.value, fullPath)\n base[key] = nested.base\n Object.assign(computed, nested.computed)\n } else {\n base[key] = descriptor.value\n }\n }\n\n return { base, computed }\n}\n\n/**\n * Splits raw initial state into a getter-free base (safe for JSON clone) and a getter map.\n * Used by Provider to prepare state before proxy creation.\n */\nexport const prepareInitialState = <T extends object>(\n rawState: T,\n): { initialState: T; getterMap: GetterMap } => {\n const { base, computed: getterMap } = extractGetters(rawState)\n return { initialState: base as T, getterMap }\n}\n\n/**\n * Re-attaches extracted getters onto a valtio proxy as computed() proxies\n * for selective dependency tracking.\n *\n * Three-phase approach:\n * 1. Attach raw getters on stateProxy so inter-getter references (e.g., totalWithTax\n * accessing this.total) work during computed()'s eager evaluation.\n * 2. Create computed() — watch() runs eagerly, reads through the raw getters for tracking.\n * 3. Replace raw getters with computed-backed getters for selective re-evaluation.\n *\n * Cleanup: computed() internally creates watch() subscriptions that have no explicit\n * dispose API. These are cleaned up by GC once the referenced stateProxy is unreachable\n * (e.g., after Provider unmount when nothing holds a reference to the proxy).\n */\nexport const attachComputedGetters = <T extends object>(\n stateProxy: T,\n getterMap: GetterMap,\n): void => {\n if (is.empty(getterMap)) return\n\n // Phase 1: Attach raw getters on stateProxy so inter-getter references work\n for (const [dotPath, { get: getterFn, parentPath }] of Object.entries(\n getterMap,\n )) {\n const parts = dotPath.split('.')\n const propName = parts.pop()!\n const parentObj =\n parts.length > 0\n ? (dot.get__unsafe(stateProxy, parts.join('.')) as object)\n : stateProxy\n\n Object.defineProperty(parentObj, propName, {\n get() {\n const ctx = parentPath\n ? dot.get__unsafe(stateProxy, parentPath)\n : stateProxy\n return getterFn.call(ctx)\n },\n enumerable: true,\n configurable: true,\n })\n }\n\n // Phase 2: Create computed() — reads through the raw getters above for tracking\n const computedDefs: Record<string, () => unknown> = {}\n for (const [dotPath, { get: getterFn, parentPath }] of Object.entries(\n getterMap,\n )) {\n computedDefs[dotPath] = () => {\n const parent = parentPath\n ? dot.get__unsafe(stateProxy, parentPath)\n : stateProxy\n return getterFn.call(parent)\n }\n }\n\n const computedProxy = computed(computedDefs)\n\n // Phase 3: Replace raw getters with computed-backed getters for selective re-eval\n for (const dotPath of Object.keys(getterMap)) {\n const parts = dotPath.split('.')\n const propName = parts.pop()!\n const parentObj =\n parts.length > 0\n ? (dot.get__unsafe(stateProxy, parts.join('.')) as object)\n : stateProxy\n\n Object.defineProperty(parentObj, propName, {\n get: () => computedProxy[dotPath as keyof typeof computedProxy],\n enumerable: true,\n configurable: true,\n })\n }\n}\n","/**\n * Apex State Logger — Simplified debug logging with colored console output.\n *\n * Two log functions:\n * 1. logPipeline — called once per processChanges with WASM pipeline trace\n * 2. logRegistration — called once per register/unregister with graph snapshot\n *\n * Zero runtime cost when log flag is false (returns no-op logger).\n *\n * Responsible for:\n * - Rendering PipelineTrace entries recursively with [NN]/[NN.MM] numbering\n * - Color-coding entries by registration_id (deterministic palette) or stage\n * - Formatting timing as ms from duration_us\n *\n * Out of scope:\n * - Trace collection (handled by Rust pipeline_trace.rs)\n * - DevTools integration (handled by store/devtools.ts)\n */\n\nimport type { DebugConfig } from '../core/types'\nimport type { Change, WasmPipeline } from '../wasm/bridge'\nimport type { PipelineTrace, TraceEntry } from '../wasm/generated/types'\nimport { is } from './is'\n\ntype GraphSnapshot = Record<string, unknown>\n\ntype SideEffectsResult = ReturnType<WasmPipeline['registerSideEffects']>\n\n// ---------------------------------------------------------------------------\n// Logger types\n// ---------------------------------------------------------------------------\n\nexport interface PipelineLogData {\n initialChanges: Change[]\n /** WASM pipeline trace (undefined if not traced). */\n trace: PipelineTrace | undefined\n /** Final applied changes: always present (can be empty). */\n appliedChanges: Change[]\n /** State snapshot after changes (undefined if not captured). */\n stateSnapshot: unknown | undefined\n}\n\nexport interface RegistrationLogData {\n result: SideEffectsResult | undefined\n appliedChanges: Change[]\n stateSnapshot: unknown | undefined\n durationMs: number\n}\n\nexport interface RegistrationLogParams {\n type: 'register' | 'unregister'\n id: string\n snapshot: GraphSnapshot\n data?: RegistrationLogData\n}\n\nexport interface ApexLogger {\n logPipeline: (data: PipelineLogData) => void\n logRegistration: (params: RegistrationLogParams) => void\n destroy: () => void\n}\n\n// ---------------------------------------------------------------------------\n// No-op singleton (zero overhead when log is false)\n// ---------------------------------------------------------------------------\n\nconst noop = () => {\n // no-op\n}\n\nconst NOOP_LOGGER: ApexLogger = {\n logPipeline: noop,\n logRegistration: noop,\n destroy: noop,\n}\n\n// ---------------------------------------------------------------------------\n// Color scheme\n// ---------------------------------------------------------------------------\n\nconst COLORS = {\n input: '#4A90D9',\n transform: '#7B68EE',\n diff: '#5B9BD5',\n graph: '#50C878',\n logic: '#9370DB',\n listener: '#E67E22',\n slow: '#E74C3C',\n skipped: '#999',\n produced: '#2C3E50',\n timing: '#666',\n label: '#888',\n} as const\n\n/** 12-color palette for registration_id-based grouping. */\nconst REG_PALETTE = [\n '#E6194B',\n '#3CB44B',\n '#4363D8',\n '#F58231',\n '#911EB4',\n '#42D4F4',\n '#F032E6',\n '#BFEF45',\n '#FABED4',\n '#469990',\n '#DCBEFF',\n '#9A6324',\n] as const\n\n/** Fixed stage colors for entries without registration_id. */\nconst STAGE_COLORS: Record<string, string> = {\n input: COLORS.input,\n diff: COLORS.diff,\n sync: COLORS.graph,\n flip: '#4A90D9',\n expression: COLORS.logic,\n computation: COLORS.transform,\n aggregation_write: COLORS.transform,\n aggregation_read: COLORS.transform,\n listeners: COLORS.listener,\n listener: COLORS.listener,\n clear_path: COLORS.skipped,\n apply: COLORS.label,\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst PREFIX = 'apex-state'\n\n/** Strip valtio Proxy wrappers from a value for safe logging. */\nconst unwrap = (value: unknown): unknown => {\n try {\n return JSON.parse(JSON.stringify(value))\n } catch {\n return value\n }\n}\n\n/** Build a short label from input change paths. */\nexport const buildPathLabel = (paths: string[]): string => {\n if (paths.length === 0) return '(empty)'\n if (paths.length <= 3) return paths.join(', ')\n return `${paths[0]} +${String(paths.length - 1)} more`\n}\n\n/** Format ms value with 2 decimals. */\nconst fmtMs = (ms: number): string => `${ms.toFixed(2)}ms`\n\n/** Hash a string to a palette index for deterministic color assignment. */\nconst hashToColor = (str: string): string => {\n let hash = 0\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0\n }\n return REG_PALETTE[Math.abs(hash) % REG_PALETTE.length]!\n}\n\n/** Pick color for an entry: registration_id → palette, else fixed stage color. */\nconst entryColor = (entry: TraceEntry): string => {\n const regId = entry.meta['registration_id']\n if (is.string(regId)) return hashToColor(regId)\n return STAGE_COLORS[entry.stage] ?? COLORS.label\n}\n\n/** Format [NN] with zero-padded seq. */\nconst fmtSeq = (seq: number): string => `[${String(seq).padStart(2, '0')}]`\n\n/** Format [NN.MM] for child entries. */\nconst fmtChildSeq = (parentSeq: number, childSeq: number): string =>\n `[${String(parentSeq).padStart(2, '0')}.${String(childSeq).padStart(2, '0')}]`\n\n// ---------------------------------------------------------------------------\n// Console rendering — format a change array as [path, value, ...meta] tuples\n// ---------------------------------------------------------------------------\n\nconst formatChangesTuples = (changes: Change[]): unknown[][] =>\n changes.map((c) => [\n c.path,\n unwrap(c.value),\n ...(c.meta ? [unwrap(c.meta)] : []),\n ])\n\n// ---------------------------------------------------------------------------\n// buildDetail — generic recursive renderer for PipelineTrace\n// ---------------------------------------------------------------------------\n\n/** Build detail record for a single trace entry (inputs, outputs, meta). */\nconst entryToDetail = (entry: TraceEntry): Record<string, unknown> => {\n const d: Record<string, unknown> = { ms: fmtMs(entry.duration_us / 1000) }\n if (is.not.empty(entry.inputs)) d['inputs'] = entry.inputs\n if (is.not.empty(entry.outputs)) d['outputs'] = entry.outputs\n for (const [k, v] of Object.entries(entry.meta)) d[k] = v\n return d\n}\n\n/** Build children record for a parent entry. */\nconst childrenToDetail = (\n parentSeq: number,\n children: TraceEntry[],\n): Record<string, unknown> => {\n const result: Record<string, unknown> = {}\n for (const child of children) {\n result[`${fmtChildSeq(parentSeq, child.seq)} ${child.stage}`] =\n entryToDetail(child)\n }\n return result\n}\n\n/** Sum duration_us across entries. */\nconst sumDurationUs = (entries: TraceEntry[]): number =>\n entries.reduce((sum, e) => sum + e.duration_us, 0)\n\n/**\n * Build a detail object from PipelineTrace for console rendering.\n *\n * ```text\n * trace.entries\n * │\n * ▼\n * ┌──────────────────────────┐\n * │ iterate entries │ ← each entry → [NN] stage line\n * │ recurse into children │ ← each child → [NN.MM] line\n * └──────────┬───────────────┘\n * │\n * ▼\n * Record<string, unknown> ← flat detail object for console.log\n * ```\n */\nexport const buildDetail = (data: PipelineLogData): Record<string, unknown> => {\n const detail: Record<string, unknown> = {\n inputChanges: unwrap(data.initialChanges),\n }\n\n if (data.trace && is.not.empty(data.trace.entries)) {\n const entries: Record<string, unknown> = {}\n\n for (const entry of data.trace.entries) {\n const entryDetail = entryToDetail(entry)\n if (is.not.empty(entry.children)) {\n entryDetail['children'] = childrenToDetail(entry.seq, entry.children)\n }\n entries[`${fmtSeq(entry.seq)} ${entry.stage}`] = entryDetail\n }\n\n detail['entries'] = entries\n detail['timing'] =\n `total: ${fmtMs(sumDurationUs(data.trace.entries) / 1000)}`\n }\n\n if (is.not.empty(data.appliedChanges)) {\n detail['finalChanges'] = formatChangesTuples(data.appliedChanges)\n }\n if (data.stateSnapshot !== undefined) {\n detail['finalState'] = unwrap(data.stateSnapshot)\n }\n\n return detail\n}\n\n// ---------------------------------------------------------------------------\n// renderTrace — console output with colored labels and [NN.MM] numbering\n// ---------------------------------------------------------------------------\n\n/**\n * Render a pipeline trace as a single groupCollapsed with flat console.log lines inside.\n *\n * ```text\n * ▼ apex-state:pipeline | user.name 1.26ms\n * [01] input ... 0.00ms\n * [02] sync ... 0.01ms\n * [02.01] sync_pair ... [form-sync] 0.01ms\n * [03] listeners ... 1.23ms\n * [03.01] listener onNameChange scope:user [form-sync] 0.80ms\n * timing: 1.26ms total\n * ```\n */\n/** Build child label suffix from meta fields. */\nconst childSuffix = (child: TraceEntry): string => {\n const name = is.string(child.meta['name']) ? ` ${child.meta['name']}` : ''\n const scope = is.string(child.meta['scope'])\n ? ` scope:${child.meta['scope'] || '(root)'}`\n : ''\n const regId = is.string(child.meta['registration_id'])\n ? ` [${child.meta['registration_id']}]`\n : ''\n return `${name}${scope}${regId}`\n}\n\n/** Render one child entry as a console.log line + optional I/O detail. */\nconst renderChild = (parentSeq: number, child: TraceEntry): void => {\n const color = entryColor(child)\n const label = fmtChildSeq(parentSeq, child.seq)\n const ms = fmtMs(child.duration_us / 1000)\n\n console.log(\n `%c ${label} ${child.stage}${childSuffix(child)}%c %c${ms}`,\n `color:${color};font-weight:bold`,\n 'color:inherit',\n `color:${COLORS.timing}`,\n )\n\n // Show inputs/outputs for listener children with I/O\n if (child.stage === 'listener') {\n if (is.not.empty(child.inputs)) console.log(` inputs:`, child.inputs)\n if (is.not.empty(child.outputs)) console.log(` outputs:`, child.outputs)\n }\n}\n\n/** Render trace entries as flat console.log lines. */\nconst renderEntries = (entries: TraceEntry[]): void => {\n for (const entry of entries) {\n const color = entryColor(entry)\n const ms = fmtMs(entry.duration_us / 1000)\n const summary = is.not.empty(entry.outputs)\n ? `${String(entry.outputs.length)} output(s)`\n : ''\n\n console.log(\n `%c${fmtSeq(entry.seq)} ${entry.stage}%c ${summary} %c${ms}`,\n `color:${color};font-weight:bold`,\n 'color:inherit',\n `color:${COLORS.timing}`,\n )\n\n for (const child of entry.children) renderChild(entry.seq, child)\n }\n\n console.log(\n `%ctiming: ${fmtMs(sumDurationUs(entries) / 1000)} total`,\n `color:${COLORS.timing}`,\n )\n}\n\n/** Log finalChanges and finalState if present. */\nconst renderSuffix = (data: PipelineLogData): void => {\n if (is.not.empty(data.appliedChanges)) {\n console.log(\n `%cfinalChanges`,\n `color:${COLORS.produced};font-weight:bold`,\n formatChangesTuples(data.appliedChanges),\n )\n }\n if (data.stateSnapshot !== undefined) {\n console.log(\n `%cfinalState`,\n `color:${COLORS.graph};font-weight:bold`,\n unwrap(data.stateSnapshot),\n )\n }\n}\n\n/** Log side-effect result changes (sync, aggregation, computation). */\nconst logResultChanges = (result: SideEffectsResult): void => {\n const entries: [string, string, unknown[]][] = [\n ['syncChanges', COLORS.graph, result.sync_changes ?? []],\n ['aggregationChanges', COLORS.transform, result.aggregation_changes ?? []],\n ['computationChanges', COLORS.transform, result.computation_changes ?? []],\n ]\n for (const [label, color, arr] of entries) {\n if (is.not.empty(arr))\n console.log(`%c${label}`, `color:${color};font-weight:bold`, arr)\n }\n}\n\n/** Render a registration event as a groupCollapsed with graph snapshot sections. */\nconst renderRegistration = ({\n type,\n id,\n snapshot: graphSnapshot,\n data,\n}: RegistrationLogParams): void => {\n const action = type === 'register' ? 'add' : 'remove'\n const actionColor = type === 'register' ? COLORS.graph : COLORS.slow\n const timingLabel = data ? ` ${fmtMs(data.durationMs)}` : ''\n\n console.groupCollapsed(\n `%c${PREFIX}:registration%c | %c${action}%c ${id}%c${timingLabel}`,\n `color:${COLORS.label};font-weight:bold`,\n 'color:inherit',\n `color:${actionColor};font-weight:bold`,\n 'color:inherit;font-weight:bold',\n `color:${COLORS.timing}`,\n )\n\n // Graph snapshot — cast from `unknown` to the concrete shape Rust emits\n const gs = graphSnapshot as Partial<{\n sync_pairs: [string, string][]\n directed_sync_pairs: [string, string][]\n flip_pairs: [string, string][]\n listeners: { id: number; name: string; scope: string; topics: string[] }[]\n bool_logics: unknown[]\n value_logics: unknown[]\n aggregations: unknown[]\n computations: unknown[]\n }>\n\n const allSyncPairs = [\n ...(gs.sync_pairs ?? []).map(([a, b]) => [a, '↔', b]),\n ...(gs.directed_sync_pairs ?? []).map(([src, tgt]) => [src, '→', tgt]),\n ]\n\n const graphEntries: [string, string, unknown[]][] = [\n ['syncPairs', COLORS.graph, allSyncPairs],\n ['flipPairs', COLORS.graph, gs.flip_pairs ?? []],\n ['listeners', COLORS.listener, gs.listeners ?? []],\n ['boolLogics', COLORS.logic, gs.bool_logics ?? []],\n ['valueLogics', COLORS.logic, gs.value_logics ?? []],\n ['aggregations', COLORS.transform, gs.aggregations ?? []],\n ['computations', COLORS.transform, gs.computations ?? []],\n ]\n for (const [label, color, arr] of graphEntries) {\n if (is.not.empty(arr))\n console.log(`%c${label}`, `color:${color};font-weight:bold`, arr)\n }\n\n if (data?.result) logResultChanges(data.result)\n\n if (data && is.not.empty(data.appliedChanges)) {\n console.log(\n '%cfinalChanges',\n `color:${COLORS.produced};font-weight:bold`,\n formatChangesTuples(data.appliedChanges),\n )\n }\n\n if (data && data.stateSnapshot !== undefined) {\n console.log(\n '%cfinalState',\n `color:${COLORS.graph};font-weight:bold`,\n unwrap(data.stateSnapshot),\n )\n }\n\n console.groupEnd()\n}\n\nconst renderTrace = (data: PipelineLogData): void => {\n const pathLabel = buildPathLabel(data.initialChanges.map((c) => c.path))\n const totalUs = data.trace ? sumDurationUs(data.trace.entries) : 0\n\n console.groupCollapsed(\n `%c${PREFIX}:pipeline%c | %c${pathLabel}%c ${fmtMs(totalUs / 1000)}`,\n `color:${COLORS.label};font-weight:bold`,\n 'color:inherit',\n 'color:inherit;font-weight:bold',\n `color:${COLORS.timing}`,\n )\n\n if (data.trace && is.not.empty(data.trace.entries)) {\n renderEntries(data.trace.entries)\n } else {\n console.log(\n `%cinputChanges`,\n `color:${COLORS.input};font-weight:bold`,\n unwrap(data.initialChanges),\n )\n }\n\n renderSuffix(data)\n console.groupEnd()\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create a logger for the store.\n * Returns no-op when log flag is disabled (zero overhead).\n * Pure console logging only — DevTools is handled separately.\n */\nexport const createLogger = (config: DebugConfig): ApexLogger => {\n const { log = false } = config\n\n if (!log) return NOOP_LOGGER\n\n return {\n logPipeline: (data) => {\n renderTrace(data)\n },\n\n logRegistration: (params) => {\n renderRegistration(params)\n },\n\n destroy: noop,\n }\n}\n","/**\n * WASM Lifecycle — Loading, instance management, gating, and teardown.\n *\n * Owns the singleton WASM instance. All loading and reset logic lives here.\n * bridge.ts imports `getWasmInstance()` to power the `wasm` namespace.\n *\n * - Production: `WasmGate` component loads WASM before rendering children\n * - Tests: `loadWasm()` called in `beforeEach`\n *\n * @module wasm/lifecycle\n */\n\nimport { useEffect, useState } from 'react'\n\nimport type * as WasmExports from '../../rust/pkg/apex_state_wasm'\nimport type { InternalState } from '../core/types'\nimport { createWasmPipeline } from './bridge'\n\n// ---------------------------------------------------------------------------\n// State\n// ---------------------------------------------------------------------------\n\nlet wasmInstance: typeof WasmExports | null = null\nlet loadingPromise: Promise<void> | null = null\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Load the WASM module (async, call once at startup).\n * Deduplicates concurrent calls — safe to call from multiple components.\n */\nexport const loadWasm = async (): Promise<typeof WasmExports> => {\n if (wasmInstance) return wasmInstance\n if (!loadingPromise) {\n loadingPromise = import('../../rust/pkg/apex_state_wasm.js').then((m) => {\n wasmInstance = m as typeof WasmExports\n })\n }\n await loadingPromise\n return wasmInstance!\n}\n\n/** Check if WASM module is loaded and ready for sync calls. */\nexport const isWasmLoaded = (): boolean => wasmInstance !== null\n\n/** Create a per-store WASM pipeline and initialize its shadow state. */\nexport const initPipeline = (\n internal: InternalState,\n initialState: object,\n options?: { debug?: boolean },\n): void => {\n const pipeline = createWasmPipeline(options)\n pipeline.shadowInit(initialState)\n internal.pipeline = pipeline\n}\n\n// ---------------------------------------------------------------------------\n// WasmGate — React component that blocks children until WASM is loaded.\n//\n// Separates async WASM loading from Provider's synchronous store setup.\n// Provider can assume WASM is always available — no async logic needed.\n// ---------------------------------------------------------------------------\n\n/**\n * Blocks rendering of children until the WASM module is loaded.\n * Renders `null` while loading, then renders children once ready.\n */\nexport const WasmGate = ({ children }: { children: React.ReactNode }) => {\n const [loaded, setLoaded] = useState(isWasmLoaded)\n\n useEffect(() => {\n if (loaded) return\n\n let cancelled = false\n loadWasm()\n .then(() => {\n if (!cancelled) setLoaded(true)\n })\n .catch((error) => {\n console.error('[apex-state] Failed to load WASM:', error)\n })\n\n return () => {\n cancelled = true\n }\n }, [loaded])\n\n if (!loaded) return null\n\n return <>{children}</>\n}\n\nWasmGate.displayName = 'WasmGate'\n\n// ---------------------------------------------------------------------------\n// Internal — used by bridge.ts\n// ---------------------------------------------------------------------------\n\n/** Get the loaded WASM instance or throw. */\nexport const getWasmInstance = (): typeof WasmExports => {\n if (!wasmInstance) {\n throw new Error('WASM not loaded. Call loadWasm() first.')\n }\n return wasmInstance\n}\n","/**\n * A placeholder maps a JS value (e.g. `undefined`) to a JSON-encoded string\n * sentinel (e.g. `'\"__APEX_UNDEFINED__\"'`) so values that cannot be represented\n * in JSON survive a round-trip through stringify → parse.\n */\nexport interface Placeholder {\n value: unknown\n /** The exact JSON-encoded string to use (include surrounding quotes for string sentinels). */\n encoded: string\n}\n\n/**\n * Create a symmetric fast stringify/parse pair with optional placeholder substitutions.\n *\n * Bypasses JSON.stringify / JSON.parse for primitives (number, boolean, null) — ~4.7x faster.\n * Placeholders are checked first via O(1) Map lookup before the fast-path logic.\n * See docs/BENCHMARK_JSON_SERIALIZATION.md for performance data.\n *\n * @example\n * const { stringify, parse } = createFastJson([\n * { value: undefined, encoded: '\"__UNDEFINED__\"' },\n * ])\n */\nexport const createFastJson = (placeholders: Placeholder[] = []) => {\n const encodeMap = new Map<unknown, string>()\n const decodeMap = new Map<string, unknown>()\n\n for (const p of placeholders) {\n encodeMap.set(p.value, p.encoded)\n decodeMap.set(p.encoded, p.value)\n }\n\n // Build a replacer for JSON.stringify that substitutes placeholder values\n // inside nested objects/arrays (e.g. undefined → \"__APEX_UNDEFINED__\").\n // Pre-decode the sentinel strings so the replacer avoids JSON.parse per call.\n // Only created if placeholders exist.\n const replacerMap = new Map<unknown, unknown>()\n for (const p of placeholders) {\n replacerMap.set(p.value, JSON.parse(p.encoded))\n }\n const replacer =\n replacerMap.size > 0\n ? (_key: string, val: unknown) =>\n replacerMap.has(val) ? replacerMap.get(val) : val\n : undefined\n\n // Build a post-parse walker that converts sentinel strings back to their\n // original JS values (e.g. \"__APEX_UNDEFINED__\" → undefined).\n // We can't use JSON.parse's reviver because returning undefined from a\n // reviver DELETES the key (per spec). A post-parse walk preserves keys.\n const decodeSentinelMap = new Map<unknown, unknown>()\n for (const p of placeholders) {\n decodeSentinelMap.set(JSON.parse(p.encoded), p.value)\n }\n\n const walkRestore = (val: unknown): unknown => {\n if (decodeSentinelMap.has(val)) return decodeSentinelMap.get(val)\n if (Array.isArray(val)) {\n for (let i = 0; i < val.length; i++) {\n val[i] = walkRestore(val[i])\n }\n return val\n }\n if (val !== null && typeof val === 'object') {\n const obj = val as Record<string, unknown>\n for (const key of Object.keys(obj)) {\n obj[key] = walkRestore(obj[key])\n }\n return obj\n }\n return val\n }\n\n const stringify = (value: unknown): string => {\n if (encodeMap.has(value)) return encodeMap.get(value)!\n if (typeof value === 'number' || typeof value === 'boolean')\n return String(value)\n if (value === null) return 'null'\n return JSON.stringify(value, replacer)\n }\n\n const parse = (json: string): unknown => {\n if (decodeMap.has(json)) return decodeMap.get(json)\n const c = json.charCodeAt(0)\n // Numbers: starts with 0-9 or minus sign\n if ((c >= 48 && c <= 57) || c === 45) return Number(json)\n if (json === 'true') return true\n if (json === 'false') return false\n if (json === 'null') return null\n const parsed = JSON.parse(json) as unknown\n return decodeSentinelMap.size > 0 ? walkRestore(parsed) : parsed\n }\n\n return { stringify, parse }\n}\n\n/**\n * Create a new object with undefined values removed (keeps null).\n * Cleaner alternative to conditional spread operators.\n */\nexport const stripNil = <T extends Record<string, unknown>>(\n obj: T,\n): { [K in keyof T as T[K] extends undefined ? never : K]: T[K] } => {\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined) {\n result[key] = value\n }\n }\n return result as any\n}\n","/**\n * WASM Bridge — Thin namespace over Rust/WASM exports.\n *\n * Uses serde-wasm-bindgen for hot-path functions (processChanges,\n * shadowInit) — JS objects cross the boundary directly without JSON\n * string intermediary. Registration functions still use JSON strings\n * (cold path, simpler).\n *\n * Loading is handled by `wasm/lifecycle.ts`. After loading, all bridge\n * functions are synchronous.\n *\n * @module wasm/bridge\n */\n\nimport type { GenericMeta } from '../types/meta'\nimport { createFastJson, stripNil } from '../utils/json'\nimport type * as Wasm from './generated/types'\nimport { getWasmInstance } from './lifecycle'\n\n/**\n * JS-facing change — derived from Wasm.Change with `value_json` replaced by\n * parsed `value: unknown` and `meta` typed as GenericMeta.\n *\n * `kind`, `lineage`, and `audit` are optional: they are populated on changes\n * returned from WASM (output) but absent on changes constructed in JS (input).\n */\nexport interface Change {\n path: string\n value: unknown\n meta: GenericMeta\n kind?: Wasm.ChangeKind\n lineage?: Wasm.Lineage\n audit?: Wasm.ChangeAudit\n}\n\n// ---------------------------------------------------------------------------\n// Bool-logic shorthand transformation\n// ---------------------------------------------------------------------------\n\n/** Check if a value is a shorthand [path, value] tuple: 2-element array, string first, primitive second. */\nconst isShorthand = (v: unknown): v is [string, unknown] =>\n Array.isArray(v) &&\n v.length === 2 &&\n typeof v[0] === 'string' &&\n (typeof v[1] === 'string' ||\n typeof v[1] === 'number' ||\n typeof v[1] === 'boolean' ||\n v[1] === null)\n\n/** Recursively expand shorthand [path, value] → { IS_EQUAL: [path, value] } in a bool-logic tree. */\nconst expandBoolLogicShorthand = (node: unknown): unknown => {\n if (isShorthand(node)) return { IS_EQUAL: node }\n if (typeof node !== 'object' || node === null || Array.isArray(node))\n return node\n\n const obj = node as Record<string, unknown>\n const result: Record<string, unknown> = {}\n for (const key of Object.keys(obj)) {\n const val = obj[key]\n if ((key === 'AND' || key === 'OR') && Array.isArray(val)) {\n result[key] = val.map(expandBoolLogicShorthand)\n } else if (key === 'NOT') {\n result[key] = expandBoolLogicShorthand(val)\n } else {\n result[key] = val\n }\n }\n return result\n}\n\n// ---------------------------------------------------------------------------\n// Helpers — conversion between JS Change[] and WASM WasmChangeWire[]\n// ---------------------------------------------------------------------------\n\n/**\n * Sentinel for JS `undefined` crossing the WASM boundary.\n * JSON has no `undefined` concept, so we encode it as a JSON string sentinel.\n * Never collides with user data — no sane user value matches this marker.\n */\nconst UNDEFINED_SENTINEL_JSON = '\"__APEX_UNDEFINED__\"'\n\nconst { stringify: fastStringify, parse: fastParse } = createFastJson([\n { value: undefined, encoded: UNDEFINED_SENTINEL_JSON },\n])\n\n/** Convert JS Change[] to WASM wire format for serde-wasm-bindgen. */\nconst changesToWasm = (changes: Change[]) =>\n changes.map(({ path, value, meta }) => ({\n path,\n value_json: fastStringify(value),\n meta,\n }))\n\n/** Map a WASM lineage stage to the appropriate GenericMeta boolean flag + stage name. */\nconst lineageToMeta = (lineage: Wasm.Lineage): Partial<GenericMeta> => {\n if (lineage === 'Input') return {}\n const via = lineage.Derived.via\n switch (via) {\n case 'sync':\n return { isSyncPathChange: true, stage: 'sync' }\n case 'flip':\n return { isFlipPathChange: true, stage: 'flip' }\n case 'aggregation_write':\n return { isAggregationChange: true, stage: 'aggregation_write' }\n case 'aggregation_read':\n return { isAggregationChange: true, stage: 'aggregation_read' }\n case 'listeners':\n return { isListenerChange: true, stage: 'listeners' }\n case 'clear_path':\n return { isClearPathChange: true, stage: 'clear_path' }\n case 'computation':\n return { isComputationChange: true, stage: 'computation' }\n case 'expression':\n return { isExpressionChange: true, stage: 'expression' }\n default:\n return { isProgramaticChange: true, stage: via }\n }\n}\n\n/** Convert WASM wire format back to JS Change[], preserving kind/lineage/audit. */\nconst wasmChangesToJs = (wasmChanges: Wasm.Change[]): Change[] =>\n wasmChanges.map(\n ({ path, value_json, meta, lineage, kind, audit }) =>\n stripNil({\n path,\n value: fastParse(value_json),\n meta: { ...(meta as GenericMeta), ...lineageToMeta(lineage) },\n kind,\n lineage,\n audit,\n }) as Change,\n )\n\n/**\n * Create a new isolated WASM pipeline instance.\n * Each store should call this once and store the result.\n * Call pipeline.destroy() on cleanup.\n */\nexport const createWasmPipeline = (options?: { debug?: boolean }) => {\n const wasm = getWasmInstance()\n const id = wasm.pipeline_create(options)\n let destroyed = false\n\n return {\n id,\n get destroyed() {\n return destroyed\n },\n\n shadowInit: (state: object) => {\n wasm.shadow_init(id, fastStringify(state))\n },\n shadowDump: () => fastParse(wasm.shadow_dump(id)),\n processChanges: (changes: Change[]) => {\n const result = wasm.process_changes(\n id,\n changesToWasm(changes),\n ) as unknown as Wasm.ProcessResult\n\n return {\n changes: wasmChangesToJs(result.changes),\n listener_errors: result.listener_errors ?? [],\n trace: result.trace,\n }\n },\n\n registerSideEffects: (\n reg: Partial<Wasm.SideEffectsRegistration>,\n subscriberFns?: Map<number, (...args: unknown[]) => unknown>,\n ) => {\n // EP17: 3rd arg is Map<subscriber_id, Function> for externref dispatch.\n const result = (wasm.register_side_effects as CallableFunction)(\n id,\n reg,\n subscriberFns ?? new Map(),\n ) as Wasm.SideEffectsResult\n\n return {\n sync_changes: wasmChangesToJs(result.sync_changes),\n aggregation_changes: wasmChangesToJs(result.aggregation_changes),\n computation_changes: wasmChangesToJs(result.computation_changes),\n registered_side_effects: result.registered_side_effects,\n }\n },\n\n unregisterSideEffects: (registrationId: string) => {\n if (destroyed)\n return {\n sync_changes: [],\n aggregation_changes: [],\n computation_changes: [],\n registered_side_effects: {},\n }\n const result = (wasm.unregister_side_effects as CallableFunction)(\n id,\n registrationId,\n ) as Wasm.SideEffectsResult\n return {\n sync_changes: wasmChangesToJs(result.sync_changes),\n aggregation_changes: wasmChangesToJs(result.aggregation_changes),\n computation_changes: wasmChangesToJs(result.computation_changes),\n registered_side_effects: result.registered_side_effects,\n }\n },\n\n registerConcerns: (\n reg: Partial<Wasm.ConcernsRegistration>,\n subscriberFns?: Map<number, (...args: unknown[]) => unknown>,\n ) => {\n // Expand shorthand [path, value] → { IS_EQUAL: [path, value] } in expressions\n if (reg.expressions) {\n for (const entry of reg.expressions) {\n const parsed = JSON.parse(entry.tree_json)\n entry.tree_json = JSON.stringify(expandBoolLogicShorthand(parsed))\n }\n }\n // EP17: 3rd arg is Map<subscriber_id, Function> for externref dispatch.\n const result = (wasm.register_concerns as CallableFunction)(\n id,\n reg,\n subscriberFns ?? new Map(),\n ) as Wasm.ConcernsResult\n\n return {\n expression_changes: wasmChangesToJs(result.expression_changes),\n registered_expression_ids: result.registered_expression_ids,\n registered_subscriber_ids: result.registered_subscriber_ids,\n initial_listener_changes: wasmChangesToJs(\n result.initial_listener_changes ?? [],\n ),\n }\n },\n\n unregisterConcerns: (registrationId: string) => {\n if (destroyed) return\n wasm.unregister_concerns(id, registrationId)\n },\n\n registerBoolLogic: (outputPath: string, tree: unknown) =>\n wasm.register_boollogic(\n id,\n outputPath,\n JSON.stringify(expandBoolLogicShorthand(tree)),\n ),\n\n unregisterBoolLogic: (logicId: number) => {\n if (destroyed) return\n wasm.unregister_boollogic(id, logicId)\n },\n\n pipelineReset: () => {\n wasm.pipeline_reset(id)\n },\n\n destroy: () => {\n if (destroyed) return\n destroyed = true\n wasm.pipeline_destroy(id)\n },\n }\n}\n\nexport type WasmPipeline = ReturnType<typeof createWasmPipeline>\nexport type { Wasm }\n","/**\n * Valtio DevTools — Connects state and concerns proxies to Redux DevTools,\n * and provides a pipeline notifier for sending pipeline/registration events.\n *\n * Uses valtio/utils devtools() to expose both proxies as separate DevTools instances:\n * - '{prefix}:state' — application state proxy\n * - '{prefix}:concerns' — computed concern values proxy\n *\n * Singleton connections per proxy — survives StrictMode remounts and HMR reloads.\n */\n\nimport { devtools } from 'valtio/utils'\n\nimport pkg from '../../package.json'\nimport type { StoreConfig } from '../core/types'\nimport type { DeepRequired } from '../types'\nimport { is } from '../utils/is'\nimport { buildPathLabel, type PipelineLogData } from '../utils/log'\n\ntype GraphSnapshot = Record<string, unknown>\n\n// ---------------------------------------------------------------------------\n// DevTools types\n// ---------------------------------------------------------------------------\n\ninterface DevToolsInstance {\n init: (state: unknown) => void\n send: (action: { type: string }, state: unknown) => void\n unsubscribe: () => void\n}\n\ninterface DevToolsExtension {\n connect: (options: { name: string; features?: object }) => DevToolsInstance\n}\n\nconst nextDevtoolsId = (() => {\n let id = 0\n return () => ++id\n})()\n\nconst getDevToolsExtension = (): DevToolsExtension | undefined =>\n typeof window !== 'undefined'\n ? ((window as unknown as Record<string, unknown>)[\n '__REDUX_DEVTOOLS_EXTENSION__'\n ] as DevToolsExtension | undefined)\n : undefined\n\n/** Connect to Redux DevTools, returning a new instance. */\nconst connectPipelineDevTools = (prefix: string): DevToolsInstance | null => {\n const ext = getDevToolsExtension()\n if (!ext) return null\n\n const instance = ext.connect({\n name: `${prefix}:pipeline`,\n features: { jump: false, skip: false, dispatch: false },\n })\n instance.init({})\n return instance\n}\n\n// ---------------------------------------------------------------------------\n// Pipeline notifier — sends pipeline/registration events to DevTools\n// ---------------------------------------------------------------------------\n\nexport interface DevToolsNotifier {\n notifyPipeline: (data: PipelineLogData) => void\n notifyRegistration: (\n type: 'register' | 'unregister',\n id: string,\n snapshot: GraphSnapshot,\n ) => void\n destroy: () => void\n}\n\n/** Sum duration_us across trace entries. */\nconst sumDurationUs = (entries: { duration_us: number }[]): number =>\n entries.reduce((sum, e) => sum + e.duration_us, 0)\n\n/** Build DevTools tree object for a pipeline run. */\nconst buildDevToolsTree = (data: PipelineLogData): Record<string, unknown> => ({\n input: data.initialChanges,\n ...(data.trace\n ? {\n duration: `${(sumDurationUs(data.trace.entries) / 1000).toFixed(2)}ms`,\n trace: data.trace,\n }\n : {}),\n})\n\n// ---------------------------------------------------------------------------\n// Proxy DevTools — eager connection (no hooks needed)\n// ---------------------------------------------------------------------------\n\n// Track active devtools subscriptions per proxy identity.\n// valtio's devtools() calls ext.connect() internally — calling it again for the\n// same proxy creates a duplicate DevTools entry. We guard against that by\n// tracking which proxies already have an active connection.\nconst connectedProxies = new WeakSet<object>()\n\nconst connectProxy = (\n proxyObj: object,\n name: string,\n): (() => void) | undefined => {\n if (connectedProxies.has(proxyObj)) return undefined\n\n connectedProxies.add(proxyObj)\n const unsub = devtools(proxyObj, { name, enabled: true })\n\n if (typeof unsub === 'function') {\n return () => {\n unsub()\n connectedProxies.delete(proxyObj)\n }\n }\n\n return () => {\n connectedProxies.delete(proxyObj)\n }\n}\n\n/**\n * Initialize all DevTools connections: pipeline notifier + proxy inspection.\n * Returns a DevToolsNotifier, or null if devtools is disabled or unavailable.\n * destroy() tears down everything (pipeline + proxy connections).\n */\nexport const attachDevtools = (\n config: DeepRequired<StoreConfig>,\n stateProxy: object,\n concernsProxy: object,\n): DevToolsNotifier | null => {\n if (!config.debug.devtools) return null\n\n const prefix = `apex-state@${pkg.version}:${config.name}-${String(nextDevtoolsId())}`\n\n // Pipeline DevTools connection\n const pipelineInstance = connectPipelineDevTools(prefix)\n if (!pipelineInstance) return null\n\n // Proxy DevTools connections (state + concerns inspection)\n const proxyUnsubs = [\n connectProxy(stateProxy, `${prefix}:state`),\n connectProxy(concernsProxy, `${prefix}:concerns`),\n ].filter(is.not.undefined)\n\n return {\n notifyPipeline: (data) => {\n const paths = data.initialChanges.map((c) => c.path)\n const suffix = is.empty(paths) ? '' : ` ${buildPathLabel(paths)}`\n pipelineInstance.send(\n { type: `PIPELINE_RUN${suffix}` },\n buildDevToolsTree(data),\n )\n },\n\n notifyRegistration: (type, id, snapshot) => {\n const actionType =\n type === 'register'\n ? `REGISTER_SIDE_EFFECTS ${id}`\n : `UNREGISTER_SIDE_EFFECTS ${id}`\n\n pipelineInstance.send({ type: actionType }, { id, snapshot })\n },\n\n destroy: () => {\n proxyUnsubs.forEach((unsub) => unsub())\n pipelineInstance.unsubscribe()\n },\n }\n}\n","{\n \"name\": \"@sladg/apex-state\",\n \"version\": \"4.0.0\",\n \"description\": \"Advanced state management wrapper around Valtio with sync paths, aggregations, and side effects\",\n \"keywords\": [\n \"state-management\",\n \"valtio\",\n \"react\",\n \"sync-paths\",\n \"aggregation\",\n \"side-effects\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/sladg/apex-state\"\n },\n \"license\": \"MIT\",\n \"author\": \"Jan Soukup <jan@ssoukup.com>\",\n \"contributors\": [\n \"Claude\"\n ],\n \"exports\": {\n \".\": {\n \"import\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\"\n },\n \"./preload\": {\n \"import\": \"./dist/preload.js\",\n \"types\": \"./dist/preload.d.ts\"\n },\n \"./testing\": {\n \"import\": \"./dist/testing/index.js\",\n \"types\": \"./dist/testing/index.d.ts\"\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"main\": \"./dist/index.js\",\n \"type\": \"module\",\n \"types\": \"./dist/index.d.ts\",\n \"module\": \"./dist/index.js\",\n \"scripts\": {\n \"bench\": \"vitest bench --run\",\n \"bench:compare\": \"vitest bench --run --compare=tests/benchmarks_v2/.bench-baseline.json\",\n \"bench:save\": \"vitest bench --run --outputJson=tests/benchmarks_v2/.bench-baseline.json\",\n \"bench:watch\": \"vitest bench\",\n \"build\": \"tsup\",\n \"code:check\": \"eslint . && npm run type-check\",\n \"code:fix\": \"eslint . --fix\",\n \"code:unused\": \"knip\",\n \"commit\": \"npx --package @sladg/release-utils utils commit\",\n \"docs:llms\": \"npx tsx scripts/generate-llms-txt.ts --outdir ./demo/dist\",\n \"release\": \"npx --package @sladg/release-utils utils shipit --gitUser @sladg --gitEmail jan@ssoukup.com --changelog\",\n \"test\": \"npm run test:smoke && npm run test:all && npm run bench\",\n \"test:all\": \"vitest run && npm run wasm:test\",\n \"test:bench\": \"npm run test:parity && npm run bench\",\n \"test:coverage\": \"vitest run --coverage\",\n \"test:parity\": \"vitest run tests/integration/wasm-vs-legacy-parity.test.ts\",\n \"test:perf\": \"VITEST_PERF=true vitest run\",\n \"test:smoke\": \"vitest run tests/smoke-dual-mode.test.tsx\",\n \"test:watch\": \"vitest\",\n \"type-check\": \"tsc --noEmit\",\n \"wasm:bench:all\": \"cargo test --manifest-path rust/Cargo.toml --test '*'\",\n \"wasm:bench:complex\": \"cargo test --manifest-path rust/Cargo.toml --test complex_state_benchmark -- --nocapture\",\n \"wasm:bench:listeners\": \"cargo test --manifest-path rust/Cargo.toml --test listeners_validators_benchmark -- --nocapture\",\n \"wasm:build\": \"wasm-pack build --target bundler rust && npm run wasm:generate-types\",\n \"wasm:check\": \"cargo check --manifest-path rust/Cargo.toml\",\n \"wasm:fmt\": \"cargo fmt --manifest-path rust/Cargo.toml\",\n \"wasm:fmt:check\": \"cargo fmt --manifest-path rust/Cargo.toml -- --check\",\n \"wasm:generate-types\": \"cargo run --manifest-path rust/Cargo.toml --bin ts-export\",\n \"wasm:lint\": \"cargo clippy --manifest-path rust/Cargo.toml -- -D warnings\",\n \"wasm:test\": \"cargo test --manifest-path rust/Cargo.toml --lib\"\n },\n \"dependencies\": {\n \"valtio\": \"^2.3.0\",\n \"valtio-reactive\": \"^0.2.0\"\n },\n \"devDependencies\": {\n \"@jsbits/deep-clone\": \"^1.1.1\",\n \"@sladg/eslint-config-base\": \"^2.4.2\",\n \"@testing-library/jest-dom\": \"^6.9.1\",\n \"@testing-library/react\": \"^14.3.1\",\n \"@tsconfig/strictest\": \"^2.0.8\",\n \"@types/react\": \"^18.3.12\",\n \"@vitejs/plugin-react\": \"^5.1.1\",\n \"@vitest/coverage-v8\": \"^4.0.18\",\n \"esbuild-plugin-wasm\": \"^1.1.0\",\n \"eslint\": \"^9.0.0\",\n \"eslint-plugin-check-file\": \"^3.3.1\",\n \"happy-dom\": \"^20.7.0\",\n \"jsdom\": \"^27.4.0\",\n \"knip\": \"^5.82.1\",\n \"react\": \"^18.3.1\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.9.3\",\n \"vite\": \"^7.3.1\",\n \"vite-plugin-wasm\": \"^3.5.0\",\n \"vitest\": \"^4.0.18\",\n \"vitest-llm-reporter\": \"^1.2.2\",\n \"zod\": \">=3.0.0 <5.0.0\"\n },\n \"peerDependencies\": {\n \"@testing-library/react\": \"^14.0.0 || ^15.0.0 || ^16.0.0\",\n \"@types/react\": \"^18.0.0 || ^19.0.0\",\n \"react\": \"^18.0.0 || ^19.0.0\"\n },\n \"peerDependenciesMeta\": {\n \"@testing-library/react\": {\n \"optional\": true\n },\n \"@types/react\": {\n \"optional\": true\n }\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","/**\n * Lazy-validated pair helper functions\n *\n * These curried helpers provide O(N) base type + O(K) per-pair validation,\n * avoiding the O(N²) explosion of SyncPair/FlipPair/AggregationPair/ComputationPair\n * on large state types (1500+ paths).\n *\n * Runtime behavior: identity function (returns input as-is).\n * Type behavior: validates each pair via CheckSyncPairs / CheckAggregationPairs / CheckComputationPairs.\n *\n * **Why these exist**: The direct pair types (`SyncPair<T>`, `FlipPair<T>`, etc.) distribute\n * over all N paths to build an O(N²) union of valid pairs. This hits TS2589 at ~1,500 paths.\n * These helpers defer validation: the function constraint uses `ResolvableDeepKey<T>` (O(N))\n * for autocomplete, then `CheckPairValueMatch` validates only the K pairs you actually write\n * via `DeepValue` comparison (O(1) per pair).\n *\n * **Inference safety**: Parameter types use mapped types only (`{ [I in keyof T]: Check<T[I]> }`)\n * — never `[...T] & MappedType<T>`. This avoids the TS inference competition where `[...T]`\n * and a mapped type both try to infer T, causing tuple widening on small state types.\n *\n * **Branded returns**: Each helper returns a `Validated*` branded type so that\n * `useSideEffects({ syncPaths: result })` skips the O(N²) re-validation.\n *\n * **Scaling limits** (measured on Apple M4 Pro):\n * - ~82,500 paths (500 flat sectors, depth 4): PASS in 7.1s / 617 MB\n * - ~52,800 paths (binary 6 levels, depth 9): PASS in 4.7s / 574 MB\n * - ~105,600 paths (binary 7 levels, depth 10): TS2589\n * - Practical limit: ~50K–80K paths, bounded by `ResolvableDeepKey` union resolution\n * at the function constraint, not by the validation logic.\n * - Old `SyncPair<T>` hit TS2589 at ~1,500 paths — a ~30–50x improvement.\n *\n * @example\n * ```typescript\n * const syncs = syncPairs<State>()([\n * ['user.email', 'profile.email'], // ✓ both string\n * ['user.age', 'profile.name'], // ✗ number vs string → type error\n * ])\n * ```\n */\n\nimport type {\n BoolLogic,\n CheckAggregationPairs,\n CheckComputationPairs,\n CheckListeners,\n CheckSyncPairs,\n ComputationOp,\n ValidatedAggregationPairs,\n ValidatedComputationPairs,\n ValidatedFlipPairs,\n ValidatedListeners,\n ValidatedSyncPairs,\n} from '../types'\nimport type { DefaultDepth, ResolvableDeepKey } from '../types/deep-key'\nimport type { DeepKeyFiltered } from '../types/deep-key-filtered'\nimport type { GenericMeta } from '../types/meta'\n\n/**\n * Lazy-validated sync pairs. Curried: `syncPairs<State>()(pairs)`.\n *\n * Provides autocomplete for valid paths (O(N)) and validates that both paths\n * in each pair resolve to the same value type (O(K) per pair).\n * Returns branded `ValidatedSyncPairs` — accepted by `useSideEffects` without re-validation.\n *\n * @example\n * ```typescript\n * const syncs = syncPairs<MyState>()([\n * ['user.email', 'profile.email'],\n * ['user.name', 'profile.name'],\n * ])\n * useSideEffects('my-syncs', { syncPaths: syncs }) // no O(N²) re-check\n * ```\n */\nexport const syncPairs =\n <DATA extends object, Depth extends number = DefaultDepth>() =>\n <\n T extends (\n | [ResolvableDeepKey<DATA, Depth>, ResolvableDeepKey<DATA, Depth>]\n | [\n ResolvableDeepKey<DATA, Depth>,\n ResolvableDeepKey<DATA, Depth>,\n { oneWay: '[0]->[1]' | '[1]->[0]' },\n ]\n )[],\n >(\n pairs: CheckSyncPairs<DATA, T, Depth>,\n ): ValidatedSyncPairs<DATA> =>\n pairs as ValidatedSyncPairs<DATA>\n\n/**\n * Lazy-validated flip pairs. Curried: `flipPairs<State>()(pairs)`.\n *\n * Identical to syncPairs — validates both paths resolve to the same value type.\n * Returns branded `ValidatedFlipPairs` — accepted by `useSideEffects` without re-validation.\n *\n * @example\n * ```typescript\n * const flips = flipPairs<MyState>()([\n * ['isActive', 'isInactive'],\n * ])\n * useSideEffects('my-flips', { flipPaths: flips }) // no O(N²) re-check\n * ```\n */\nexport const flipPairs =\n <DATA extends object, Depth extends number = DefaultDepth>() =>\n <\n T extends [\n ResolvableDeepKey<DATA, Depth>,\n ResolvableDeepKey<DATA, Depth>,\n ][],\n >(\n pairs: CheckSyncPairs<DATA, T, Depth>,\n ): ValidatedFlipPairs<DATA> =>\n pairs as ValidatedFlipPairs<DATA>\n\n/**\n * Lazy-validated aggregation pairs. Curried: `aggregationPairs<State>()(pairs)`.\n *\n * Each pair is [target, source] or [target, source, BoolLogic].\n * Validates that target and source resolve to the same value type.\n * Returns branded `ValidatedAggregationPairs` — accepted by `useSideEffects` without re-validation.\n *\n * @example\n * ```typescript\n * const aggs = aggregationPairs<MyState>()([\n * ['total', 'price1'],\n * ['total', 'price2', { IS_EQUAL: ['price2.disabled', true] }],\n * ])\n * useSideEffects('my-aggs', { aggregations: aggs }) // no O(N²) re-check\n * ```\n */\nexport const aggregationPairs =\n <DATA extends object, Depth extends number = DefaultDepth>() =>\n <\n T extends (\n | [ResolvableDeepKey<DATA, Depth>, ResolvableDeepKey<DATA, Depth>]\n | [\n ResolvableDeepKey<DATA, Depth>,\n ResolvableDeepKey<DATA, Depth>,\n BoolLogic<DATA, Depth>,\n ]\n )[],\n >(\n pairs: CheckAggregationPairs<DATA, T, Depth>,\n ): ValidatedAggregationPairs<DATA> =>\n pairs as ValidatedAggregationPairs<DATA>\n\n/**\n * Lazy-validated computation pairs. Curried: `computationPairs<State>()(pairs)`.\n *\n * Each pair is [op, target, source] or [op, target, source, BoolLogic].\n * Validates that both target and source are number paths.\n * Returns branded `ValidatedComputationPairs` — accepted by `useSideEffects` without re-validation.\n *\n * @example\n * ```typescript\n * const comps = computationPairs<MyState>()([\n * ['SUM', 'total', 'price1'],\n * ['AVG', 'average', 'score1'],\n * ])\n * useSideEffects('my-comps', { computations: comps }) // no O(N²) re-check\n * ```\n */\nexport const computationPairs =\n <DATA extends object, Depth extends number = DefaultDepth>() =>\n <\n T extends (\n | [\n ComputationOp,\n DeepKeyFiltered<DATA, number, Depth>,\n DeepKeyFiltered<DATA, number, Depth>,\n ]\n | [\n ComputationOp,\n DeepKeyFiltered<DATA, number, Depth>,\n DeepKeyFiltered<DATA, number, Depth>,\n BoolLogic<DATA, Depth>,\n ]\n )[],\n >(\n pairs: CheckComputationPairs<DATA, T, Depth>,\n ): ValidatedComputationPairs<DATA> =>\n pairs as ValidatedComputationPairs<DATA>\n\n/**\n * Lazy-validated listeners. Curried: `listeners<State>()(items)`.\n *\n * Provides autocomplete for valid paths (O(N)) and validates each listener:\n * - path and scope are valid `ResolvableDeepKey<DATA>` or null\n * - When both non-null: scope must be a dot-separated prefix of path\n * - fn receives correctly-typed scoped state based on scope\n *\n * Returns branded `ValidatedListeners` — accepted by `useSideEffects` without re-validation.\n *\n * @example\n * ```typescript\n * const myListeners = listeners<MyState>()([\n * {\n * path: 'user.profile.name',\n * scope: 'user.profile',\n * fn: (changes, state) => {\n * // changes: ArrayOfChanges relative to user.profile scope\n * // state: typed as MyState['user']['profile']\n * // return: ArrayOfChanges relative to scope, or undefined\n * return [['name', `updated-${state.name}`, {}]]\n * }\n * },\n * ])\n * useSideEffects('my-listeners', { listeners: myListeners })\n * ```\n */\nexport const listeners =\n <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n Depth extends number = DefaultDepth,\n >() =>\n <\n T extends readonly {\n path: ResolvableDeepKey<DATA, Depth> | null\n scope?: ResolvableDeepKey<DATA, Depth> | null | undefined\n fn: (...args: any[]) => any\n }[],\n >(\n items: CheckListeners<DATA, META, T, Depth>,\n ): ValidatedListeners<DATA, META> =>\n items as ValidatedListeners<DATA, META>\n","/**\n * Pre-warmed pair helpers — DATA type already bound\n *\n * Returned by `createGenericStore()` so users don't need to repeat `<MyState>`\n * at every call site. Each helper is the second (inner) function of the curried\n * pair validator, with DATA already applied.\n *\n * @example Basic usage\n * ```typescript\n * const { syncPairs, flipPairs, useSideEffects } = createGenericStore<MyState>()\n *\n * // No <MyState> needed — already bound\n * const syncs = syncPairs([['user.email', 'profile.email']])\n * useSideEffects('my-syncs', { syncPaths: syncs })\n * ```\n *\n * @example All pairs in one call (preferred)\n * ```typescript\n * const { syncPairs, useSideEffects } = createGenericStore<MyState>()\n *\n * // Put all pairs in a single call — validation is O(K) per pair\n * const syncs = syncPairs([\n * ['user.email', 'profile.email'],\n * ['user.name', 'profile.name'],\n * ])\n *\n * useSideEffects('syncs', { syncPaths: syncs })\n * ```\n */\n\nimport type { GenericMeta } from '../types'\nimport {\n aggregationPairs,\n computationPairs,\n flipPairs,\n listeners,\n syncPairs,\n} from '../utils/pair-helpers'\n\n/**\n * Creates pre-warmed pair helpers with DATA type already bound.\n * Called once by createGenericStore, returned as part of the store API.\n */\nexport const createWarmPairHelpers = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n>() => ({\n /**\n * Pre-warmed sync pair validator — DATA type is already bound.\n * Validates that both paths in each pair resolve to the same value type.\n * Pass the result to `useSideEffects` as `syncPaths`.\n *\n * @example\n * ```typescript\n * const { useSideEffects, syncPairs } = createGenericStore<MyState>()\n *\n * // Type-safe — no need to repeat <MyState>\n * const syncs = syncPairs([\n * ['user.email', 'profile.email'], // ✓ both string\n * ['user.age', 'profile.age'], // ✓ both number\n * ])\n *\n * // Inside a component:\n * useSideEffects('my-syncs', { syncPaths: syncs })\n * ```\n */\n syncPairs: syncPairs<DATA>(),\n\n /**\n * Pre-warmed flip pair validator — DATA type is already bound.\n * Validates that both paths in each pair resolve to the same value type.\n * Used for inverted boolean synchronization. Pass the result to `useSideEffects` as `flipPaths`.\n *\n * @example\n * ```typescript\n * const { useSideEffects, flipPairs } = createGenericStore<MyState>()\n *\n * const flips = flipPairs([\n * ['isExpanded', 'isCollapsed'], // ✓ both boolean\n * ])\n *\n * // Inside a component:\n * useSideEffects('my-flips', { flipPaths: flips })\n * ```\n */\n flipPairs: flipPairs<DATA>(),\n\n /**\n * Pre-warmed aggregation pair validator — DATA type is already bound.\n * Each pair is `[target, source]` or `[target, source, BoolLogic]`.\n * Validates that target and source resolve to the same value type.\n * Pass the result to `useSideEffects` as `aggregations`.\n *\n * @example\n * ```typescript\n * const { useSideEffects, aggregationPairs } = createGenericStore<MyState>()\n *\n * const aggs = aggregationPairs([\n * ['total', 'price1'],\n * ['total', 'price2', { IS_EQUAL: ['price2.disabled', true] }],\n * ])\n *\n * // Inside a component:\n * useSideEffects('my-aggs', { aggregations: aggs })\n * ```\n */\n aggregationPairs: aggregationPairs<DATA>(),\n\n /**\n * Pre-warmed computation pair validator — DATA type is already bound.\n * Each pair is `[op, target, source]` or `[op, target, source, BoolLogic]`.\n * Both target and source must be number paths.\n * Pass the result to `useSideEffects` as `computations`.\n *\n * @example\n * ```typescript\n * const { useSideEffects, computationPairs } = createGenericStore<MyState>()\n *\n * const comps = computationPairs([\n * ['SUM', 'total', 'price1'],\n * ['AVG', 'average', 'score1'],\n * ])\n *\n * // Inside a component:\n * useSideEffects('my-comps', { computations: comps })\n * ```\n */\n computationPairs: computationPairs<DATA>(),\n\n /**\n * Pre-warmed listener validator — DATA type is already bound.\n * Validates path/scope relationships and derives fn types from scope.\n * Pass the result to `useSideEffects` as `listeners`.\n *\n * @example\n * ```typescript\n * const { useSideEffects, listeners } = createGenericStore<MyState>()\n *\n * const myListeners = listeners([\n * {\n * path: 'user.profile.name',\n * scope: 'user.profile',\n * fn: (changes, state) => {\n * // state is typed as MyState['user']['profile']\n * return undefined\n * }\n * },\n * ])\n *\n * useSideEffects('my-listeners', { listeners: myListeners })\n * ```\n */\n listeners: listeners<DATA, META>(),\n})\n","import { useCallback, useState } from 'react'\n\n/**\n * Minimal field interface that useBufferedField accepts\n */\nexport interface FieldInput<T> {\n value: T\n setValue: (v: T) => void\n}\n\n/**\n * Extended interface with buffering capabilities\n */\nexport interface BufferedField<T> extends FieldInput<T> {\n commit: () => void\n cancel: () => void\n isDirty: boolean\n}\n\n/**\n * Adds buffered editing to any field hook.\n * Local changes are held until explicitly committed or cancelled.\n *\n * @param field - Field hook with { value, setValue }\n * @returns Buffered field with commit/cancel/isDirty\n *\n * @example\n * ```typescript\n * const field = useFieldStore('user.name')\n * const buffered = useBufferedField(field)\n *\n * // User types - updates local only\n * buffered.setValue('new value')\n *\n * // Enter/Tab - commit to store\n * buffered.commit()\n *\n * // Esc - revert to stored value\n * buffered.cancel()\n *\n * // Check if user has unsaved changes\n * if (buffered.isDirty) { ... }\n * ```\n */\nexport const useBufferedField = <T>(field: FieldInput<T>): BufferedField<T> => {\n const { value: storedValue, setValue: setStoredValue } = field\n\n // null = not editing, T = editing with this local value\n const [localValue, setLocalValue] = useState<T | null>(null)\n\n // Derive editing state from localValue\n const isEditing = localValue !== null\n const isDirty = isEditing && localValue !== storedValue\n\n // Update local value only (no store write)\n const setValue = useCallback((newValue: T) => {\n setLocalValue(newValue)\n }, [])\n\n // Commit local value to store\n const commit = useCallback(() => {\n if (localValue !== null) {\n setStoredValue(localValue)\n }\n setLocalValue(null)\n }, [localValue, setStoredValue])\n\n // Cancel and revert to stored value\n const cancel = useCallback(() => {\n setLocalValue(null)\n }, [])\n\n // Return current value: local if editing, otherwise stored\n const value = isEditing ? localValue : storedValue\n\n return { value, setValue, commit, cancel, isDirty }\n}\n","import { useCallback, useRef } from 'react'\n\n/**\n * Option for keyboard selection\n */\nexport interface SelectOption<T> {\n value: T\n label: string\n}\n\n/**\n * Configuration for keyboard select behavior\n */\nexport interface KeyboardSelectConfig<T> {\n /** Available options to select from */\n options: SelectOption<T>[]\n /** Time window to accumulate keystrokes (ms). Default: 500 */\n debounceMs?: number\n /** Match from start of label only. Default: true */\n matchFromStart?: boolean\n}\n\n/**\n * Minimal field interface that useKeyboardSelect accepts\n */\nexport interface FieldInput<T> {\n value: T\n setValue: (v: T) => void\n}\n\n/**\n * Adds keyboard-driven selection to any field hook.\n * Typing letters auto-selects matching options.\n *\n * @param field - Field hook with { value, setValue, ...rest }\n * @param config - Options and behavior configuration\n * @returns Field with onKeyDown handler added\n *\n * @example\n * ```typescript\n * const field = useFieldStore('user.country')\n * const { onKeyDown, ...rest } = useKeyboardSelect(field, {\n * options: [\n * { value: 'us', label: 'United States' },\n * { value: 'uk', label: 'United Kingdom' },\n * { value: 'ca', label: 'Canada' },\n * ]\n * })\n *\n * // User types \"u\" -> selects \"United States\"\n * // User types \"un\" quickly -> still \"United States\"\n * // User types \"c\" -> selects \"Canada\"\n *\n * <input onKeyDown={onKeyDown} {...rest} />\n * ```\n */\nexport const useKeyboardSelect = <T, TField extends FieldInput<T>>(\n field: TField,\n config: KeyboardSelectConfig<T>,\n): TField & { onKeyDown: (e: React.KeyboardEvent) => void } => {\n const { setValue } = field\n const { options, debounceMs = 500, matchFromStart = true } = config\n\n // Accumulated search string\n const searchRef = useRef('')\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const onKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n // Only handle printable characters\n if (e.key.length !== 1) return\n\n // Don't interfere with modifier keys\n if (e.ctrlKey || e.metaKey || e.altKey) return\n\n const char = e.key.toLowerCase()\n\n // Clear previous timeout\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n\n // Accumulate search string\n searchRef.current += char\n\n // Find matching option\n const search = searchRef.current\n const match = options.find((opt) => {\n const label = opt.label.toLowerCase()\n return matchFromStart\n ? label.startsWith(search)\n : label.includes(search)\n })\n\n if (match) {\n setValue(match.value)\n }\n\n // Reset search after debounce\n timeoutRef.current = setTimeout(() => {\n searchRef.current = ''\n }, debounceMs)\n },\n [options, setValue, debounceMs, matchFromStart],\n )\n\n return { ...field, onKeyDown }\n}\n","import { useCallback, useEffect, useRef } from 'react'\n\n/**\n * Minimal field interface for throttling\n * Supports setValue with optional additional arguments (e.g., meta)\n */\nexport interface ThrottleFieldInput<T, Args extends unknown[] = unknown[]> {\n value: T\n setValue: (v: T, ...args: Args) => void\n}\n\n/**\n * Throttle configuration\n */\nexport interface ThrottleConfig {\n /** Minimum milliseconds between setValue calls to the underlying field */\n ms: number\n}\n\n/**\n * Internal state for throttle tracking\n */\ninterface ThrottleState<T, Args extends unknown[]> {\n timeoutId: ReturnType<typeof setTimeout> | null\n lastFlushTime: number\n pendingValue: T | undefined\n pendingArgs: Args | undefined\n hasPending: boolean\n}\n\n/**\n * Adds throttling to any field hook.\n * First setValue executes immediately, subsequent calls are rate-limited.\n * Last value wins when multiple calls occur within the throttle window.\n * Preserves the full setValue signature including additional arguments like meta.\n *\n * @param field - Field hook with { value, setValue, ...rest }\n * @param config - Throttle configuration { ms }\n * @returns Field with throttled setValue, plus any passthrough props\n *\n * @example\n * ```typescript\n * const field = useFieldStore('spotPrice')\n * const throttled = useThrottledField(field, { ms: 100 })\n *\n * // Rapid updates from WebSocket\n * throttled.setValue(1.234) // Immediate\n * throttled.setValue(1.235) // Buffered\n * throttled.setValue(1.236) // Buffered (replaces 1.235)\n * // After 100ms: 1.236 is applied\n * ```\n *\n * @example\n * ```typescript\n * // With meta argument\n * const field = useFieldStore('price')\n * const throttled = useThrottledField(field, { ms: 100 })\n * throttled.setValue(42, { source: 'websocket' })\n * ```\n *\n * @example\n * ```typescript\n * // Composable with other wrappers\n * const field = useFieldStore('price')\n * const transformed = useTransformedField(field, {\n * to: (cents) => cents / 100,\n * from: (dollars) => Math.round(dollars * 100)\n * })\n * const throttled = useThrottledField(transformed, { ms: 50 })\n * ```\n */\nexport const useThrottledField = <\n T,\n Args extends unknown[] = unknown[],\n TField extends ThrottleFieldInput<T, Args> = ThrottleFieldInput<T, Args>,\n>(\n field: TField,\n config: ThrottleConfig,\n): TField => {\n const { setValue: originalSetValue, ...rest } = field\n const { ms } = config\n\n const throttleRef = useRef<ThrottleState<T, Args>>({\n timeoutId: null,\n lastFlushTime: 0,\n pendingValue: undefined,\n pendingArgs: undefined,\n hasPending: false,\n })\n\n const setValue = useCallback(\n (newValue: T, ...args: Args) => {\n const now = Date.now()\n const ref = throttleRef.current\n const timeSinceLastFlush = now - ref.lastFlushTime\n\n // If enough time has passed, flush immediately\n if (timeSinceLastFlush >= ms) {\n ref.lastFlushTime = now\n originalSetValue(newValue, ...args)\n return\n }\n\n // Buffer the value and args (last value wins)\n ref.pendingValue = newValue\n ref.pendingArgs = args\n ref.hasPending = true\n\n // Schedule flush if not already scheduled\n if (!ref.timeoutId) {\n const remainingTime = ms - timeSinceLastFlush\n ref.timeoutId = setTimeout(() => {\n ref.timeoutId = null\n ref.lastFlushTime = Date.now()\n if (ref.hasPending) {\n originalSetValue(\n ref.pendingValue as T,\n ...(ref.pendingArgs as Args),\n )\n ref.hasPending = false\n ref.pendingValue = undefined\n ref.pendingArgs = undefined\n }\n }, remainingTime)\n }\n },\n [originalSetValue, ms],\n )\n\n // Cleanup timeout on unmount\n useEffect(() => {\n return () => {\n if (throttleRef.current.timeoutId) {\n clearTimeout(throttleRef.current.timeoutId)\n }\n }\n }, [])\n\n return { ...rest, setValue } as TField\n}\n","import { useCallback, useMemo } from 'react'\n\n/**\n * Transform configuration for field values\n */\nexport interface TransformConfig<TStored, TDisplay> {\n /** Transform from stored value to display value */\n to: (stored: TStored) => TDisplay\n /** Transform from display value to stored value */\n from: (display: TDisplay) => TStored\n}\n\n/**\n * Minimal field interface that useTransformedField accepts\n */\nexport interface FieldInput<T> {\n value: T\n setValue: (v: T) => void\n}\n\n/**\n * Adds value transformation to any field hook.\n * Converts between storage format and display format.\n * Passes through any additional properties from the input field.\n *\n * @param field - Field hook with { value, setValue, ...rest }\n * @param config - Transform functions { to, from }\n * @returns Field with transformed types, plus any passthrough props\n *\n * @example\n * ```typescript\n * const field = useFieldStore('user.birthdate')\n * const formatted = useTransformedField(field, {\n * to: (iso) => format(new Date(iso), 'MM/dd/yyyy'),\n * from: (display) => parse(display, 'MM/dd/yyyy').toISOString()\n * })\n *\n * // formatted.value is \"01/15/2024\"\n * // formatted.setValue(\"01/20/2024\") stores ISO string\n * ```\n *\n * @example\n * ```typescript\n * // Works with buffered fields - passes through commit/cancel/isDirty\n * const field = useFieldStore('price')\n * const buffered = useBufferedField(field)\n * const formatted = useTransformedField(buffered, {\n * to: (cents) => (cents / 100).toFixed(2),\n * from: (dollars) => Math.round(parseFloat(dollars) * 100)\n * })\n *\n * formatted.setValue(\"15.99\") // local only\n * formatted.commit() // stores 1599\n * ```\n */\nexport const useTransformedField = <\n TStored,\n TDisplay,\n TField extends FieldInput<TStored>,\n>(\n field: TField,\n config: TransformConfig<TStored, TDisplay>,\n): Omit<TField, 'value' | 'setValue'> & FieldInput<TDisplay> => {\n const { value: storedValue, setValue: setStoredValue, ...rest } = field\n const { to, from } = config\n\n // Transform stored to display\n const value = useMemo(() => to(storedValue), [storedValue, to])\n\n // Transform display to stored on set\n const setValue = useCallback(\n (displayValue: TDisplay) => {\n const storedVal = from(displayValue)\n setStoredValue(storedVal)\n },\n [from, setStoredValue],\n )\n\n return { ...rest, value, setValue } as Omit<TField, 'value' | 'setValue'> &\n FieldInput<TDisplay>\n}\n","/**\n * Hash key utilities\n *\n * Utilities for working with hash key notation in Record-based paths.\n * Hash keys ([*]) are type-level markers for indexing into Records/HashMaps.\n *\n * @example\n * ```typescript\n * import { _, hashKey } from '@sladg/apex-state'\n *\n * // Use _ in template strings\n * const path = `users.${_('u1')}.posts.${_('p1')}.name`\n *\n * // Use hashKey namespace for validation\n * hashKey.rejectDynamic(path)\n * ```\n */\n\nimport type { HASH_KEY } from '../types'\n\n/**\n * Converts a concrete ID to hash key notation for inline template string usage\n * Returns the concrete ID typed as HASH_KEY for Record/HashMap indexing\n *\n * @param id - The concrete ID (e.g., \"u1\", \"p1\", \"c1\")\n * @returns The concrete ID typed as HASH_KEY\n *\n * @example\n * ```typescript\n * const path = `users.${_('u1')}.posts.${_('p1')}.name`\n * // → \"users.u1.posts.p1.name\" (typed as containing HASH_KEY)\n * ```\n */\nexport const _ = (id: string): HASH_KEY => id as HASH_KEY\n\n/**\n * Rejects paths with dynamic hash key notation [*]\n * Hash keys are for type-level path matching only, not runtime access\n *\n * @throws Error if path contains [*]\n *\n * @example\n * ```typescript\n * rejectDynamic('users.u1.posts.p1') // OK\n * rejectDynamic('users.[*].posts') // throws Error\n * ```\n */\nconst rejectDynamic = <P extends string>(path: P): void => {\n // Fast validation: check each part directly instead of scanning entire string\n const parts = path.split('.')\n for (const part of parts) {\n if (part === '[*]') {\n throw new Error(\n `Path contains [*] hash key which is not allowed in store operations. Use concrete paths only.`,\n )\n }\n }\n}\n\n/**\n * Hash key utilities namespace\n *\n * Provides utilities for working with hash keys in Record-based paths\n */\nexport const hashKey = {\n /** Reject paths with dynamic hash keys */\n rejectDynamic,\n /** Alias for _ function */\n _,\n} as const\n","/**\n * Apply Changes Utility\n *\n * Applies an array of changes to an object, returning a new object.\n */\n\nimport { deepClone } from 'valtio/utils'\n\nimport type { DeepKey, DeepValue } from '../types'\nimport { dot } from './dot'\n\n/** A change tuple: [path, value] or [path, value, anyMeta]. Meta is ignored. */\ntype AnyChange<DATA> = {\n [K in DeepKey<DATA>]:\n | [K, DeepValue<DATA, K>]\n | [K, DeepValue<DATA, K>, ...unknown[]]\n}[DeepKey<DATA>]\n\n/**\n * Applies changes to an object, returning a new object with changes applied.\n * Does not mutate the original object. Meta fields on change tuples are ignored.\n *\n * @param obj - Source object\n * @param changes - Array of [path, value] or [path, value, meta] tuples\n * @returns New object with changes applied\n *\n * @example\n * ```typescript\n * const state = { user: { name: 'Alice', age: 30 } }\n * const newState = applyChangesToObject(state, [\n * ['user.name', 'Bob'],\n * ['user.age', 31],\n * ])\n * // newState: { user: { name: 'Bob', age: 31 } }\n * // state is unchanged\n * ```\n */\nexport const applyChangesToObject = <T extends object>(\n obj: T,\n changes: AnyChange<T>[],\n): T => {\n // Deep clone the object — deepClone handles Proxy objects (structuredClone does not)\n const result = deepClone(obj)\n\n // Apply each change\n for (const [path, value] of changes) {\n dot.set__unsafe(result, path as string, value)\n }\n\n return result\n}\n"],"mappings":"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","names":["require_umd","__commonJSMin","exports","module","root","factory","_a","_nodejs","g","m","_OP","_toString","_ownKeys","clonable","arrayLike","getKeyGetter","exact","_keys","_getSymbols","obj","_isEnum","objkeys","symbols","i","getKeysFac","_filtIdx","prop","_getKeys","type","cloneMapOrSet","src","fn","dest","cb","v","k","cloneDataView","buffer","cloneError","err","cloneArguments","args","cloneArray","cloneFn","createObject","cloneType","getObjectType","_getTag","tag","cloneFac","getKeys","_clone","clone","props","desc","looseClone","exactClone","deepClone","value","init","wasm","pipeline_create","options","isLikeNone","addToExternrefTable0","pipeline_destroy","pipeline_id","pipeline_reset","pipeline_reset_all","process_changes","changes","ret","takeFromExternrefTable0","register_boollogic","output_path","tree_json","ptr0","passStringToWasm0","len0","WASM_VECTOR_LEN","ptr1","len1","register_concerns","registration","subscriber_fns","register_side_effects","shadow_dump","deferred2_0","deferred2_1","getStringFromWasm0","shadow_init","state_json","unregister_boollogic","logic_id","unregister_concerns","registration_id","unregister_side_effects","__wbg_Error_8c4e43fe74559d73","arg0","arg1","__wbg_Number_04624de7d0e8332d","__wbg_String_8f0eb39a4a4c2f66","getDataViewMemory0","__wbg___wbindgen_bigint_get_as_i64_8fcf4ce7f1ca72a2","v","__wbg___wbindgen_boolean_get_bbbb1c18aa2f5e25","__wbg___wbindgen_debug_string_0bc8482c6e3508ae","debugString","__wbg___wbindgen_in_47fa6863be6f2f25","__wbg___wbindgen_is_bigint_31b12575b56f32fc","__wbg___wbindgen_is_function_0095a73b8b156f76","__wbg___wbindgen_is_null_ac34f5003991759a","__wbg___wbindgen_is_object_5ae8e5880f2c1fbd","val","__wbg___wbindgen_is_string_cd444516edc5b180","__wbg___wbindgen_is_undefined_9e4d92534c42d778","__wbg___wbindgen_jsval_eq_11888390b0186270","__wbg___wbindgen_jsval_loose_eq_9dd77d8cd6671811","__wbg___wbindgen_number_get_8ff4255516ccad3e","obj","__wbg___wbindgen_string_get_72fb696202c56729","__wbg___wbindgen_throw_be289d5034ed271b","__wbg_call_389efe28435a9388","handleError","__wbg_call_812d25f1510c13c8","arg2","arg3","__wbg_done_57b39ecd9addfe81","__wbg_entries_58c7934c745daac7","__wbg_error_7534b8e9a36f1ab4","deferred0_0","deferred0_1","__wbg_from_bddd64e7d5ff6941","__wbg_get_9b94d73e6221f75c","__wbg_get_b3ed3ad4be2bc8ac","__wbg_get_c60162cf03da5a6e","__wbg_get_with_ref_key_1dc361bd10053bfe","__wbg_instanceof_ArrayBuffer_c367199e2fa2aa04","result","__wbg_instanceof_Map_53af74335dec57f4","__wbg_instanceof_Uint8Array_9b9075935c74707c","__wbg_isArray_d314bb98fcf08331","__wbg_isSafeInteger_bfbc7332a9768d2a","__wbg_iterator_6ff6560ca1568e55","__wbg_keys_0eee252dfbfa253e","__wbg_length_32ed9a279acd054c","__wbg_length_35a7bace40f36eac","__wbg_name_07a54d72942d5492","__wbg_new_361308b2356cecd0","__wbg_new_3eb36ae241fe6f44","__wbg_new_8a6f238a6ece86ea","__wbg_new_dca287b076112a51","__wbg_new_dd2b680c8bf6ae29","__wbg_new_no_args_1c7c842f08d00ebb","__wbg_new_with_length_1763c527b2923202","__wbg_next_3482f54c49e8af19","__wbg_next_418f80d8f5303233","__wbg_now_2c95c9de01293173","__wbg_parse_708461a1feddfb38","__wbg_performance_7a3ffd0b17f663ad","__wbg_prototypesetcall_bdcdcc5842e4d77d","getArrayU8FromWasm0","__wbg_push_8ffdcb2063340ba5","__wbg_set_1eb0999cf5d27fc8","__wbg_set_3f1d0b984ed272ed","__wbg_set_6cb8631f80447a67","__wbg_set_f43e577aea94465b","__wbg_stack_0ed75d68575b0f3c","__wbg_static_accessor_GLOBAL_12837167ad935116","__wbg_static_accessor_GLOBAL_THIS_e628e89ab3b1c95f","__wbg_static_accessor_SELF_a621d3dfbb60d0ce","__wbg_static_accessor_WINDOW_f8727f0cf888e0bd","__wbg_stringify_8d1cc6ff383e8bae","__wbg_value_0546255b415e96c1","__wbindgen_cast_0000000000000001","__wbindgen_cast_0000000000000002","__wbindgen_cast_0000000000000003","__wbindgen_cast_0000000000000004","__wbindgen_init_externref_table","table","offset","__wbindgen_object_is_undefined","idx","type","description","name","length","debug","i","builtInMatches","className","ptr","len","getUint8ArrayMemory0","cachedDataViewMemory0","decodeText","cachedUint8ArrayMemory0","f","args","e","x","arg","malloc","realloc","buf","cachedTextEncoder","mem","code","view","value","numBytesDecoded","MAX_SAFARI_DECODE_BYTES","cachedTextDecoder","__wbg_set_wasm","init_apex_state_wasm_bg","__esmMin","apex_state_wasm_bg_exports","__export","__externref_table_alloc","__externref_table_dealloc","__wbindgen_exn_store","__wbindgen_externrefs","__wbindgen_free","__wbindgen_malloc","__wbindgen_realloc","__wbindgen_start","init","instance","memory","module","pipeline_create","pipeline_destroy","pipeline_reset","pipeline_reset_all","process_changes","register_boollogic","register_concerns","register_side_effects","shadow_dump","shadow_init","unregister_boollogic","unregister_concerns","unregister_side_effects","loadWasm","imports","moduleRequest","init_apex_state_wasm_bg","__esmMin","__wbindgen_object_is_undefined","__wbg_new_8a6f238a6ece86ea","__wbg_stack_0ed75d68575b0f3c","__wbg_error_7534b8e9a36f1ab4","__wbg_performance_7a3ffd0b17f663ad","__wbg_now_2c95c9de01293173","__wbg_get_with_ref_key_1dc361bd10053bfe","__wbg_set_3f1d0b984ed272ed","__wbg_String_8f0eb39a4a4c2f66","__wbg_new_dca287b076112a51","__wbg_new_3eb36ae241fe6f44","__wbg_new_361308b2356cecd0","__wbg_new_no_args_1c7c842f08d00ebb","__wbg_new_dd2b680c8bf6ae29","__wbg_length_32ed9a279acd054c","__wbg_prototypesetcall_bdcdcc5842e4d77d","__wbg_done_57b39ecd9addfe81","__wbg_value_0546255b415e96c1","__wbg_instanceof_Map_53af74335dec57f4","__wbg_instanceof_Uint8Array_9b9075935c74707c","__wbg_instanceof_ArrayBuffer_c367199e2fa2aa04","__wbg_get_c60162cf03da5a6e","__wbg_set_1eb0999cf5d27fc8","__wbg_keys_0eee252dfbfa253e","__wbg_parse_708461a1feddfb38","__wbg_stringify_8d1cc6ff383e8bae","__wbg_new_with_length_1763c527b2923202","__wbg_get_9b94d73e6221f75c","__wbg_set_f43e577aea94465b","__wbg_from_bddd64e7d5ff6941","__wbg_length_35a7bace40f36eac","__wbg_push_8ffdcb2063340ba5","__wbg_isArray_d314bb98fcf08331","__wbg_isSafeInteger_bfbc7332a9768d2a","__wbg_entries_58c7934c745daac7","__wbg_iterator_6ff6560ca1568e55","__wbg_static_accessor_GLOBAL_THIS_e628e89ab3b1c95f","__wbg_call_389efe28435a9388","__wbg_static_accessor_SELF_a621d3dfbb60d0ce","__wbg_static_accessor_GLOBAL_12837167ad935116","__wbg_static_accessor_WINDOW_f8727f0cf888e0bd","__wbg_get_b3ed3ad4be2bc8ac","__wbg_set_6cb8631f80447a67","__wbg_name_07a54d72942d5492","__wbg_call_812d25f1510c13c8","__wbg_next_418f80d8f5303233","__wbg_next_3482f54c49e8af19","__wbg___wbindgen_string_get_72fb696202c56729","__wbg___wbindgen_number_get_8ff4255516ccad3e","__wbg___wbindgen_in_47fa6863be6f2f25","__wbg___wbindgen_throw_be289d5034ed271b","__wbg___wbindgen_is_null_ac34f5003991759a","__wbg___wbindgen_jsval_eq_11888390b0186270","__wbg_Number_04624de7d0e8332d","__wbg_Error_8c4e43fe74559d73","__wbg___wbindgen_is_bigint_31b12575b56f32fc","__wbg___wbindgen_is_object_5ae8e5880f2c1fbd","__wbg___wbindgen_is_string_cd444516edc5b180","__wbg___wbindgen_boolean_get_bbbb1c18aa2f5e25","__wbg___wbindgen_is_function_0095a73b8b156f76","__wbg___wbindgen_is_undefined_9e4d92534c42d778","__wbg___wbindgen_jsval_loose_eq_9dd77d8cd6671811","__wbg___wbindgen_bigint_get_as_i64_8fcf4ce7f1ca72a2","__wbg___wbindgen_debug_string_0bc8482c6e3508ae","__wbindgen_init_externref_table","__wbindgen_cast_0000000000000001","__wbindgen_cast_0000000000000002","__wbindgen_cast_0000000000000003","__wbindgen_cast_0000000000000004","apex_state_wasm_bg_default","apex_state_wasm_exports","__export","init","pipeline_create","pipeline_destroy","pipeline_reset","pipeline_reset_all","process_changes","register_boollogic","register_concerns","register_side_effects","shadow_dump","shadow_init","unregister_boollogic","unregister_concerns","unregister_side_effects","init_apex_state_wasm","__esmMin","init_apex_state_wasm_bg","__wbg_set_wasm","apex_state_wasm_bg_exports","__wbindgen_start","useCallback","useLayoutEffect","snapshot","subscribe","useSnapshot","prebuilts_exports","__export","disabledWhen","dynamicLabel","dynamicPlaceholder","dynamicTooltip","prebuilts","prebuiltsNamespace","readonlyWhen","validationState","visibleWhen","isNil","value","isUndefined","isNull","isObject","proto","isArray","isObjectOrArray","isString","isNumber","isBoolean","isFunction","isSymbol","isDate","isRegExp","isNumericKey","isPrimitive","type","isEmptyObject","key","isEmpty","isEqualArray","a","b","i","iEqual","isEqualObject","keysA","keysB","isNotNil","isNotUndefined","isNotNull","isNotObject","isNotObjectOrArray","isNotArray","isNotString","isNotNumber","isNotBoolean","isNotFunction","isNotSymbol","isNotDate","isNotRegExp","isNotPrimitive","isNotEmpty","isNotEqual","is","pathCache","MAX_CACHE_SIZE","getPathParts","path","parts","get","obj","current","part","is","get__unsafe","set","value","keys","last","i","next","set__unsafe","has","same","paths","firstValue","dot","evaluateNumericComparison","logic","state","path","threshold","value","dot","is","evaluateBoolLogic","expected","subLogic","numericResult","allowed","elements","arr","el","item","disabledWhen","props","evaluateBoolLogic","extractPlaceholders","template","regex","matches","match","interpolateTemplate","state","path","value","dot","is","dynamicLabel","props","interpolateTemplate","dynamicPlaceholder","props","interpolateTemplate","dynamicTooltip","props","interpolateTemplate","readonlyWhen","props","evaluateBoolLogic","validationState","props","valueToValidate","dot","result","err","is","visibleWhen","props","evaluateBoolLogic","prebuilts","validationState","disabledWhen","readonlyWhen","visibleWhen","dynamicTooltip","dynamicLabel","dynamicPlaceholder","prebuiltsNamespace","findConcern","name","concerns","prebuilts","c","defaultConcerns","effect","toExpressionRegistration","outputPath","config","isSchemaValidation","concernName","resolveFieldValue","changes","scopedState","listenPath","path","is","changePath","value","dot","nextValidatorId","nextRegistrationId","registerWasmBatch","pipeline","expressions","validatorListeners","subscriberFns","concernRefs","disposeCallbacks","registrationId","result","change","lastDot","basePath","concernsAtPath","createConcernEffect","store","item","resultCache","concern","cacheKey","evaluateFn","effect","evalProps","isAdHocConcern","collectValidator","validatorId","schema","wrapper","fieldValue","parseResult","e","classifyConcern","concernMap","expr","collectRegistrations","registrationEntries","concernConfigs","cleanupConcerns","concernsObj","registerConcernEffects","registration","concerns","c","jsEffects","dispose","createContext","useContext","StoreContext","useStoreContext","store","snapshot","applyBatch","changes","state","path","value","dot","normalizeInputChanges","input","path","value","meta","applyConcernChanges","changes","concerns","c","lastDot","basePath","concernName","pushDebugChanges","target","processChangesWasm","store","initialChanges","pipeline","logger","pipelineChanges","trackEntry","p","v","m","t0","resultChanges","listener_errors","trace","is","finalChanges","isConcernChange","stateChanges","concernChanges","applyBatch","allApplied","logData","snapshot","snapshot","aggregationToWasm","input","target","source","condition","computationToWasm","op","syncToWasm","bidirectional","directed","pair","dir","pairs","nextSubscriberId","registerSideEffects","store","id","effects","t0","syncPairs","directedSyncPairs","pairs","flipPairs","aggregationPairs","computationPairs","clearPaths","triggers","targets","opts","t","isMultiPath","listener","subscriberFns","listeners","subscriberId","originalFn","topicPaths","effectiveScope","pipeline","registrationId","registration","result","appliedChanges","is","applyBatch","durationMs","snapshot","cleanup","ut0","unregResult","unregDurationMs","filterConcernsByKeys","raw","keys","result","path","pathConcerns","filtered","key","is","useLayoutEffect","useRef","proxy","ref","DEFAULT_STORE_CONFIG","import_deep_clone","assertNoCycles","value","ancestors","walk","obj","path","descriptors","key","desc","deepClone","_deepClone","deepMerge","target","source","result","src","key","k","sourceValue","targetValue","is","computed","extractGetters","obj","prefix","base","computed","descriptors","key","descriptor","is","fullPath","nested","prepareInitialState","rawState","getterMap","attachComputedGetters","stateProxy","dotPath","getterFn","parentPath","parts","propName","parentObj","dot","ctx","computedDefs","parent","computedProxy","noop","NOOP_LOGGER","COLORS","REG_PALETTE","STAGE_COLORS","PREFIX","unwrap","value","buildPathLabel","paths","fmtMs","ms","hashToColor","str","hash","i","entryColor","entry","regId","is","fmtSeq","seq","fmtChildSeq","parentSeq","childSeq","formatChangesTuples","changes","c","sumDurationUs","entries","sum","e","childSuffix","child","name","is","scope","regId","renderChild","parentSeq","color","entryColor","label","fmtChildSeq","ms","fmtMs","COLORS","renderEntries","entries","entry","summary","fmtSeq","sumDurationUs","renderSuffix","data","formatChangesTuples","unwrap","logResultChanges","result","arr","renderRegistration","type","id","graphSnapshot","action","actionColor","timingLabel","PREFIX","gs","allSyncPairs","b","src","tgt","graphEntries","renderTrace","pathLabel","buildPathLabel","c","totalUs","createLogger","config","log","params","noop","NOOP_LOGGER","useEffect","useState","createFastJson","placeholders","encodeMap","decodeMap","p","replacerMap","replacer","_key","val","decodeSentinelMap","walkRestore","i","obj","key","value","json","c","parsed","stripNil","result","isShorthand","v","expandBoolLogicShorthand","node","obj","result","key","val","UNDEFINED_SENTINEL_JSON","fastStringify","fastParse","createFastJson","changesToWasm","changes","path","value","meta","lineageToMeta","lineage","via","wasmChangesToJs","wasmChanges","value_json","kind","audit","stripNil","createWasmPipeline","options","wasm","getWasmInstance","id","destroyed","state","reg","subscriberFns","registrationId","entry","parsed","outputPath","tree","logicId","Fragment","jsx","wasmInstance","loadingPromise","loadWasm","m","isWasmLoaded","initPipeline","internal","initialState","options","pipeline","createWasmPipeline","WasmGate","children","loaded","setLoaded","useState","useEffect","cancelled","error","getWasmInstance","devtools","package_default","nextDevtoolsId","id","getDevToolsExtension","connectPipelineDevTools","prefix","ext","instance","sumDurationUs","entries","sum","e","buildDevToolsTree","data","connectedProxies","connectProxy","proxyObj","name","unsub","devtools","attachDevtools","config","stateProxy","concernsProxy","package_default","pipelineInstance","proxyUnsubs","is","paths","c","suffix","buildPathLabel","type","snapshot","actionType","jsx","createInternalState","config","createLogger","createProvider","storeConfig","resolvedConfig","deepMerge","DEFAULT_STORE_CONFIG","buildStore","rawInitialState","prepared","prepareInitialState","deepClone","internal","initPipeline","debugTrack","stateProxy","proxy","attachComputedGetters","concernsProxy","attachDevtools","ref","StoreProvider","initialState","children","storeRef","useRef","cleanState","destroyTimerRef","useLayoutEffect","pipelineToDestroy","devtoolsToDestroy","cleanupList","cleanup","StoreContext","Provider","props","WasmGate","syncPairs","pairs","flipPairs","aggregationPairs","computationPairs","listeners","items","createWarmPairHelpers","syncPairs","flipPairs","aggregationPairs","computationPairs","listeners","createGenericStore","config","Provider","createProvider","_useFieldValue","path","store","useStoreContext","snap","useSnapshot","value","dot","setValue","useCallback","newValue","meta","processChangesWasm","allConcerns","proxyValue","setChanges","changes","getState","snapshot","id","effects","useLayoutEffect","registerSideEffects","registration","customConcerns","concerns","defaultConcerns","registerConcernEffects","selection","selectionKeys","k","selectedConcerns","filterConcernsByKeys","concernsSnap","presetMeta","originalSetValue","callback","subscribe","createWarmPairHelpers","useCallback","useState","useBufferedField","field","storedValue","setStoredValue","localValue","setLocalValue","isEditing","isDirty","setValue","newValue","commit","cancel","useCallback","useRef","useKeyboardSelect","field","config","setValue","options","debounceMs","matchFromStart","searchRef","timeoutRef","onKeyDown","e","char","search","match","opt","label","useCallback","useEffect","useRef","useThrottledField","field","config","originalSetValue","rest","ms","throttleRef","setValue","newValue","args","now","ref","timeSinceLastFlush","remainingTime","useCallback","useMemo","useTransformedField","field","config","storedValue","setStoredValue","rest","to","from","value","setValue","displayValue","storedVal","_","id","rejectDynamic","path","parts","part","hashKey","deepClone","applyChangesToObject","obj","changes","result","deepClone","path","value","dot"]}