@sladg/apex-state 3.0.1
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.d.ts +1527 -0
- package/dist/index.js +2990 -0
- package/dist/index.js.map +1 -0
- package/package.json +92 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../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.ts","../src/utils/is.ts","../src/utils/dot.ts","../src/utils/bool-logic.ts","../src/concerns/prebuilts/index.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.ts","../src/pipeline/apply-batch.ts","../src/pipeline/queue.ts","../src/pipeline/processors/aggregation-writes.ts","../src/core/path-groups.ts","../src/pipeline/normalize-changes.ts","../src/pipeline/processors/flip-paths.ts","../src/utils/path-utils.ts","../src/pipeline/processors/listeners.ts","../src/pipeline/processors/sync-paths.ts","../src/pipeline/process-changes.wasm-impl.ts","../src/sideEffects/prebuilts/aggregation.ts","../src/sideEffects/prebuilts/flip.ts","../src/sideEffects/prebuilts/listeners.ts","../src/sideEffects/prebuilts/sync.ts","../src/sideEffects/registration.ts","../src/sideEffects/registration.wasm-impl.ts","../src/utils/json.ts","../src/wasm/bridge.ts","../src/wasm/lifecycle.ts","../src/store/provider.tsx","../src/core/defaults.ts","../src/utils/deep-merge.ts","../src/utils/derive-values.ts","../src/utils/timing.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":["export function main() {\n wasm.main();\n}\n\n/**\n * Create a new isolated pipeline instance. Returns the pipeline ID.\n * @returns {number}\n */\nexport function pipeline_create() {\n const ret = wasm.pipeline_create();\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: state_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 `{ state_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 directly from a JS object (no JSON serialization).\n * @param {number} pipeline_id\n * @param {any} state\n */\nexport function shadow_init(pipeline_id, state) {\n const ret = wasm.shadow_init(pipeline_id, state);\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_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_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}\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_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_next_418f80d8f5303233, __wbg_next_3482f54c49e8af19, __wbg_get_b3ed3ad4be2bc8ac, __wbg_new_8a6f238a6ece86ea, __wbg_stack_0ed75d68575b0f3c, __wbg_error_7534b8e9a36f1ab4, __wbg___wbindgen_number_get_8ff4255516ccad3e, __wbg___wbindgen_in_47fa6863be6f2f25, __wbg___wbindgen_throw_be289d5034ed271b, __wbg___wbindgen_jsval_eq_11888390b0186270, __wbg_Error_8c4e43fe74559d73, __wbg___wbindgen_is_bigint_31b12575b56f32fc, __wbg___wbindgen_is_object_5ae8e5880f2c1fbd, __wbg___wbindgen_is_string_cd444516edc5b180, __wbg___wbindgen_string_get_72fb696202c56729, __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_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_next_418f80d8f5303233,\n__wbg_next_3482f54c49e8af19,\n__wbg_get_b3ed3ad4be2bc8ac,\n__wbg_new_8a6f238a6ece86ea,\n__wbg_stack_0ed75d68575b0f3c,\n__wbg_error_7534b8e9a36f1ab4,\n__wbg___wbindgen_number_get_8ff4255516ccad3e,\n__wbg___wbindgen_in_47fa6863be6f2f25,\n__wbg___wbindgen_throw_be289d5034ed271b,\n__wbg___wbindgen_jsval_eq_11888390b0186270,\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_string_get_72fb696202c56729,\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 // Special handling for file URLs outside the browser\n if (module.startsWith('file://')) {\n const fs = await import('fs')\n module = await fs.promises.readFile(new URL(module))\n } else {\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_destroy = instance.exports.pipeline_destroy;\nexport const pipeline_finalize = instance.exports.pipeline_finalize;\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 pipeline_create = instance.exports.pipeline_create;\nexport const pipeline_reset = instance.exports.pipeline_reset;\nexport const pipeline_reset_all = instance.exports.pipeline_reset_all;\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 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, useSnapshot } from 'valtio'\n\nimport type { ConcernType } from '../concerns'\nimport { defaultConcerns } from '../concerns'\nimport { registerConcernEffects as registerConcernEffectsLegacy } from '../concerns/registration'\nimport { registerConcernEffects as registerConcernEffectsWasm } from '../concerns/registration.wasm-impl'\nimport { useStoreContext } from '../core/context'\nimport type { StoreConfig } from '../core/types'\nimport { processChangesLegacy } from '../pipeline/process-changes'\nimport { processChangesWasm } from '../pipeline/process-changes.wasm-impl'\nimport { registerSideEffects as registerSideEffectsLegacy } from '../sideEffects/registration'\nimport { registerSideEffects as registerSideEffectsWasm } from '../sideEffects/registration.wasm-impl'\nimport type {\n ArrayOfChanges,\n ConcernRegistrationMap,\n DeepKey,\n DeepValue,\n EvaluatedConcerns,\n GenericMeta,\n} from '../types'\nimport type { SideEffects } from '../types/side-effects'\nimport { dot } from '../utils/dot'\nimport { loadWasm } from '../wasm/lifecycle'\nimport { createProvider } from './provider'\n\nexport const createGenericStore = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n CONCERNS extends readonly any[] = typeof defaultConcerns,\n>(\n config?: StoreConfig,\n) => {\n const Provider = createProvider<DATA, META>(config)\n\n // Kick off WASM loading early — by the time Provider mounts it may already be ready.\n // Fire-and-forget: Provider.useEffect handles the actual await.\n if (!config?.useLegacyImplementation) {\n void loadWasm()\n }\n\n // Internal helper hook for field state access\n const _useFieldValue = <P extends DeepKey<DATA>>(path: P) => {\n const store = useStoreContext<DATA, META>()\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 const processChanges = store._internal.config.useLegacyImplementation\n ? processChangesLegacy\n : processChangesWasm\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, META>()\n const proxyValue = useSnapshot(store.state) as DATA\n\n const setChanges = useCallback(\n (changes: ArrayOfChanges<DATA, META>) => {\n // WASM gateway: dispatch to WASM or legacy implementation\n const processChanges = store._internal.config.useLegacyImplementation\n ? processChangesLegacy\n : processChangesWasm\n\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, META>()\n useLayoutEffect(() => {\n // WASM gateway: dispatch to WASM or legacy implementation\n const registerSideEffects = store._internal.config.useLegacyImplementation\n ? registerSideEffectsLegacy\n : registerSideEffectsWasm\n\n return registerSideEffects(store, id, effects)\n }, [store, id, effects])\n }\n\n const useConcerns = (\n id: string,\n registration: ConcernRegistrationMap<DATA>,\n customConcerns?: readonly ConcernType<any, any>[],\n ): void => {\n const store = useStoreContext<DATA, META>()\n const concerns = (customConcerns ||\n defaultConcerns) as readonly ConcernType<any, any>[]\n\n useLayoutEffect(() => {\n // WASM gateway: dispatch to WASM or legacy implementation\n const registerConcernEffects = store._internal.config\n .useLegacyImplementation\n ? registerConcernEffectsLegacy\n : registerConcernEffectsWasm\n\n return registerConcernEffects(store, registration, concerns)\n }, [store, id, registration, customConcerns])\n }\n\n const withConcerns = <SELECTION extends Partial<Record<string, boolean>>>(\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 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] || {}\n\n const selectedConcerns = Object.keys(selection).reduce(\n (acc, key) => {\n if (\n selection[key] &&\n Object.prototype.hasOwnProperty.call(allConcerns, key)\n ) {\n acc[key] = allConcerns[key]\n }\n return acc\n },\n {} as Record<string, unknown>,\n ) as SelectedConcerns\n\n return { value, setValue, ...selectedConcerns }\n },\n }\n }\n\n return {\n Provider,\n useFieldStore,\n useStore,\n useJitStore,\n useSideEffects,\n useConcerns,\n withConcerns,\n }\n}\n","import { effect } from 'valtio-reactive'\n\nimport type { StoreInstance } from '../core/types'\nimport type { ConcernRegistrationMap, DeepKey, GenericMeta } from '../types'\nimport { evaluateBoolLogic } from '../utils/bool-logic'\nimport { dot } from '../utils/dot'\nimport { findConcern } from './registry'\nimport type { BaseConcernProps, ConcernType } from './types'\n\n/** Legacy JS implementation - uses effect() for all concerns */\nconst registerConcernEffectsImpl = <\n DATA extends object,\n META extends GenericMeta,\n>(\n store: StoreInstance<DATA, META>,\n registration: ConcernRegistrationMap<DATA>,\n concerns: readonly ConcernType[],\n): (() => void) => {\n const disposeCallbacks: (() => void)[] = []\n // Non-reactive cache for previous results (prevents tracked reads)\n const resultCache = new Map<string, unknown>()\n // Pre-allocate concern path objects and capture references\n const concernRefs = new Map<string, Record<string, unknown>>()\n\n // Pre-initialize all path objects BEFORE creating effects\n Object.keys(registration).forEach((path) => {\n if (!store._concerns[path]) {\n store._concerns[path] = {}\n }\n concernRefs.set(path, store._concerns[path])\n })\n\n // Iterate over each path in the registration\n Object.entries(registration).forEach(([path, concernConfigs]) => {\n if (!concernConfigs) return\n\n // Get pre-initialized concern object for this path\n const concernsAtPath = concernRefs.get(path)!\n\n // Iterate over each concern at this path\n Object.entries(concernConfigs).forEach(([concernName, config]) => {\n if (!config) return\n\n // Find the concern definition\n let concern = findConcern(concernName, concerns)\n if (!concern) {\n // Support custom/ad-hoc concerns that provide an inline evaluate function\n if ('evaluate' in config && typeof config.evaluate === 'function') {\n concern = {\n name: concernName,\n description: `Custom concern: ${concernName}`,\n evaluate: config.evaluate,\n }\n } else if ('boolLogic' in config && config.boolLogic) {\n // Support ad-hoc BoolLogic concerns with a boolLogic but no prebuilt match\n concern = {\n name: concernName,\n description: `Ad-hoc BoolLogic concern: ${concernName}`,\n evaluate: (props: any) =>\n evaluateBoolLogic(props.boolLogic, props.state),\n }\n } else {\n console.warn(`Concern \"${concernName}\" not found`)\n return\n }\n }\n\n // --- Pure JS/effect-based path for ALL concerns ---\n const cacheKey = `${path}.${concernName}`\n\n // Wrap evaluation in effect() for automatic dependency tracking\n // effect() will automatically track ONLY the properties accessed during evaluate()\n const dispose = 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 // If config provides custom evaluate(), use that instead of prebuilt's evaluate\n // Wrapped with timing measurement when debug.timing is enabled\n // @FIXME: this should be coming from cocnern 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 const result = store._internal.timing.run(\n 'concerns',\n () => evaluateFn(evalProps),\n { path, name: concernName },\n )\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 // Track dispose callback for cleanup\n disposeCallbacks.push(dispose)\n })\n })\n\n // Return cleanup function that disposes all effects on unmount\n return () => {\n // Stop all effects and unregister WASM BoolLogic\n disposeCallbacks.forEach((dispose) => dispose())\n\n // Clear caches\n resultCache.clear()\n concernRefs.clear()\n\n // Remove concern values from concernsProxy\n Object.keys(registration).forEach((path) => {\n const concernConfigs = registration[path as DeepKey<DATA>]\n if (!concernConfigs) return\n\n // Delete specific concerns for this path\n Object.keys(concernConfigs).forEach((concernName) => {\n if (store._concerns[path]) {\n // Use Reflect.deleteProperty to avoid dynamic delete lint error\n Reflect.deleteProperty(store._concerns[path], concernName)\n }\n })\n\n // Clean up empty path object\n if (\n store._concerns[path] &&\n Object.keys(store._concerns[path]).length === 0\n ) {\n // Use Reflect.deleteProperty to avoid dynamic delete lint error\n Reflect.deleteProperty(store._concerns, path)\n }\n })\n }\n}\n\n/** Legacy implementation - uses effect() for all concerns */\nexport const registerConcernEffects = <\n DATA extends object,\n META extends GenericMeta,\n>(\n store: StoreInstance<DATA, META>,\n registration: ConcernRegistrationMap<DATA>,\n concerns: readonly ConcernType[],\n): (() => void) =>\n store._internal.timing.run(\n 'registration',\n () => registerConcernEffectsImpl(store, registration, concerns),\n { path: Object.keys(registration).join(','), name: 'concerns' },\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 */\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 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 value is a primitive (string, number, boolean, symbol, bigint, null, undefined) */\nconst isPrimitive = (\n value: unknown,\n): value is string | number | boolean | symbol | bigint | null | undefined => {\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 = (value: unknown): boolean => !isObject(value)\n\n/** Check if value is not an array */\nconst isNotArray = (value: unknown): boolean => !Array.isArray(value)\n\n/** Check if value is not a string */\nconst isNotString = (value: unknown): boolean => typeof value !== 'string'\n\n/** Check if value is not a number */\nconst isNotNumber = (value: unknown): boolean => typeof value !== 'number'\n\n/** Check if value is not a boolean */\nconst isNotBoolean = (value: unknown): boolean => typeof value !== 'boolean'\n\n/** Check if value is not a function */\nconst isNotFunction = (value: unknown): boolean => typeof value !== 'function'\n\n/** Check if value is not a symbol */\nconst isNotSymbol = (value: unknown): boolean => typeof value !== 'symbol'\n\n/** Check if value is not a Date */\nconst isNotDate = (value: unknown): boolean => !(value instanceof Date)\n\n/** Check if value is not a RegExp */\nconst isNotRegExp = (value: unknown): boolean => !(value instanceof RegExp)\n\n/** Check if value is not a primitive */\nconst isNotPrimitive = (value: unknown): boolean => {\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 array: isArray,\n string: isString,\n number: isNumber,\n boolean: isBoolean,\n function: isFunction,\n symbol: isSymbol,\n date: isDate,\n regexp: isRegExp,\n primitive: isPrimitive,\n empty: isEmpty,\n equal: iEqual,\n not: {\n nil: isNotNil,\n undefined: isNotUndefined,\n null: isNotNull,\n object: isNotObject,\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 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.object(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.object(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.object(next)) {\n next = {}\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.object(next)) {\n next = {}\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.object(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, ComparableValue } 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 // Equality check\n if ('IS_EQUAL' in logic) {\n const [path, expected] = logic.IS_EQUAL\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\n return allowed.includes(dot.get__unsafe(state, path) as ComparableValue)\n }\n\n return false\n}\n","/**\n * Pre-built concerns provided by apex-state\n *\n * Validation & Schema:\n * - validationState: Complete validation with Zod (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 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 { evaluateBoolLogic } from '../../utils/bool-logic'\nimport type { BoolLogic, ConcernType } from '../types'\n\nexport const disabledWhen: ConcernType<{ boolLogic: BoolLogic<any> }, 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<{ template: string }, string> = {\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<{ template: string }, string> = {\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<{ template: string }, string> = {\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<{ boolLogic: BoolLogic<any> }, 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 { z } from 'zod'\n\nimport type { DeepKey, DeepValue } from '../../types'\nimport { dot } from '../../utils/dot'\nimport type { BaseConcernProps } from '../types'\n\nexport interface ValidationError {\n field?: string\n message: string\n}\n\nexport interface ValidationStateResult {\n isError: boolean\n errors: ValidationError[]\n}\n\ntype ValidationStateInput<SUB_STATE, PATH extends DeepKey<SUB_STATE>> =\n | {\n schema: z.ZodSchema<DeepValue<SUB_STATE, PATH>>\n }\n | {\n [SCOPE in DeepKey<SUB_STATE>]: {\n scope: SCOPE\n schema: z.ZodSchema<DeepValue<SUB_STATE, SCOPE>>\n }\n }[DeepKey<SUB_STATE>]\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: 'Zod 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 Zod 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 Zod errors to ValidationError format\n const errors: ValidationError[] = result.error.errors.map((zodError) => ({\n field: zodError.path.length > 0 ? zodError.path.join('.') : '.',\n message: zodError.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<{ boolLogic: BoolLogic<any> }, 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 * 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, GenericMeta } from '../types'\nimport { dot } from '../utils/dot'\nimport type { 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: { output_path: string; tree_json: string }[],\n validators: {\n validator_id: number\n output_path: string\n dependency_paths: string[]\n scope: string\n }[],\n valueLogics: { output_path: string; tree_json: string }[],\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 ...(boolLogics.length > 0 && { bool_logics: boolLogics }),\n ...(validators.length > 0 && { validators }),\n ...(valueLogics.length > 0 && { 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 zodResult = config.schema.safeParse(config.initialValue)\n const validationResult = {\n isError: !zodResult.success,\n errors: zodResult.success\n ? []\n : zodResult.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, META extends GenericMeta>(\n store: StoreInstance<DATA, META>,\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 // Wrapped with timing measurement when debug.timing is enabled\n const result = store._internal.timing.run(\n 'concerns',\n () => evaluateFn(evalProps),\n { path, name: concernName },\n )\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: { output_path: string; tree_json: string }[]\n validators: {\n validator_id: number\n output_path: string\n dependency_paths: string[]\n scope: string\n }[]\n valueLogics: { output_path: string; tree_json: string }[]\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, any>,\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 scope: '',\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, any>,\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, META extends GenericMeta>(\n store: StoreInstance<DATA, META>,\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, META extends GenericMeta>(\n store: StoreInstance<DATA, META>,\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\nconst registerConcernEffectsImpl = <\n DATA extends object,\n META extends GenericMeta,\n>(\n store: StoreInstance<DATA, META>,\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\nexport const registerConcernEffects: typeof import('./registration').registerConcernEffects =\n (store, registration, concerns) =>\n store._internal.timing.run(\n 'registration',\n () => registerConcernEffectsImpl(store, registration, concerns),\n { path: Object.keys(registration).join(','), name: 'concerns' },\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 { GenericMeta } from '../types'\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<\n any,\n GenericMeta\n> | 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 = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n>(): StoreInstance<DATA, META> => {\n const store = useContext(StoreContext) as StoreInstance<DATA, META> | 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 * Change Processing Pipeline\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 * Falls back to JS processors when WASM is not loaded.\n */\n\nimport { snapshot } from 'valtio'\n\nimport type { DebugTrackEntry, StoreInstance } from '../core/types'\nimport type { ArrayOfChanges, GenericMeta } from '../types'\nimport { dot } from '../utils/dot'\nimport { applyBatch } from './apply-batch'\nimport {\n processAggregationWrites,\n processFlipPaths,\n processListeners,\n processSyncPaths,\n} from './processors'\n\n// ---------------------------------------------------------------------------\n// JS fallback pipeline (used when WASM is not loaded)\n// ---------------------------------------------------------------------------\n\nconst processChangesJS = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n>(\n store: StoreInstance<DATA, META>,\n initialChanges: ArrayOfChanges<DATA, META>,\n): void => {\n const { processing } = store._internal\n\n // Early no-op filter: skip changes where value === current state\n // Reads from valtio proxy directly (cheaper than snapshot)\n const filtered: ArrayOfChanges<DATA, META> = []\n for (const change of initialChanges) {\n const current = dot.get__unsafe(store.state, change[0] as string)\n if (current !== change[1]) {\n filtered.push(change)\n }\n }\n if (filtered.length === 0) return\n\n // Use queue as the mutable batch - processors write to it directly\n processing.queue = [...filtered]\n\n // Get current state snapshot for processing\n const currentState = snapshot(store.state) as DATA\n\n // Single-pass sequential processing - order matters\n // 1. Aggregation writes: intercept writes to targets, distribute to sources\n processAggregationWrites(processing.queue, store)\n\n // 2. Sync: bidirectional path synchronization\n processSyncPaths(processing.queue, store)\n\n // 3. Flip: invert boolean values across paired paths\n processFlipPaths(processing.queue, store)\n\n // Post-expansion no-op filter: sync/flip can produce changes that match current state\n // Filter before listeners to avoid unnecessary listener dispatch and sorting\n const preListenerQueue: ArrayOfChanges<DATA, META> = []\n for (const change of processing.queue) {\n const current = dot.get__unsafe(store.state, change[0] as string)\n if (current !== change[1]) {\n preListenerQueue.push(change)\n }\n }\n if (preListenerQueue.length === 0) {\n processing.queue = []\n return\n }\n processing.queue = preListenerQueue\n\n // 4. Listeners: reactive side effects\n processListeners(processing.queue, store, currentState)\n\n // Record debug tracking before applying\n if (store._debug) {\n const trackEntry: DebugTrackEntry = {\n input: initialChanges.map(([p, v, m]) => [p as string, v, m]),\n applied: processing.queue.map(([path, value]) => ({\n path: path as string,\n value,\n })),\n appliedConcerns: [],\n timestamp: Date.now(),\n }\n store._debug.calls.push(trackEntry)\n }\n\n // Apply all accumulated changes to state once\n applyBatch(processing.queue, store.state)\n}\n\n// ---------------------------------------------------------------------------\n// Main entry point\n// ---------------------------------------------------------------------------\n\n// Export individual processors for explicit use\nexport const processChangesLegacy = processChangesJS\n\nexport const processChanges = processChangesLegacy\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 const pathStr = path as string\n\n // Check if value actually changed before setting\n // For primitives: catches true no-ops (same value)\n // For objects: catches same-reference updates, but allows new references\n // This is the right trade-off: deep equality is too expensive\n const current = dot.get__unsafe(state, pathStr)\n if (current !== value) {\n dot.set__unsafe(state, pathStr, value)\n }\n }\n}\n","/**\n * Change Queue Utilities\n *\n * Shared queue manipulation for the pipeline.\n */\n\nimport type { ArrayOfChanges, GenericMeta } from '../types'\n\ninterface QueueChangeArgs<DATA extends object, META extends GenericMeta> {\n queue: ArrayOfChanges<DATA, META>\n path: string\n value: unknown\n meta: GenericMeta\n}\n\n/** Centralize type assertion for pushing runtime paths into typed queue */\nexport const queueChange = <DATA extends object, META extends GenericMeta>(\n props: QueueChangeArgs<DATA, META>,\n): void => {\n // Cast is safe: paths in graphs were validated at registration\n props.queue.push([props.path, props.value, props.meta] as ArrayOfChanges<\n DATA,\n META\n >[number])\n}\n","/**\n * Aggregation Writes Processor\n *\n * Preprocessor that intercepts writes to aggregation target paths and\n * distributes them to all source paths. Runs BEFORE sync/flip/listeners.\n *\n * Example:\n * User writes: form.allChecked = true\n * Processor intercepts and replaces with:\n * item1.checked = true\n * item2.checked = true\n * item3.checked = true\n */\n\nimport type { Aggregation, StoreInstance } from '../../core/types'\nimport type { ArrayOfChanges, GenericMeta } from '../../types'\nimport { queueChange } from '../queue'\n\n/**\n * Distribute a change to all source paths in the aggregation\n */\nconst distributeToSources = <DATA extends object, META extends GenericMeta>(\n aggregation: Aggregation,\n targetPath: string,\n changePath: string,\n value: unknown,\n meta: GenericMeta,\n queue: ArrayOfChanges<DATA, META>,\n): void => {\n const isExactMatch = changePath === targetPath\n\n for (const sourcePath of aggregation.sourcePaths) {\n // Calculate final path (handle child paths)\n const finalPath = isExactMatch\n ? sourcePath\n : `${sourcePath}.${changePath.substring(targetPath.length + 1)}`\n\n queueChange({\n queue,\n path: finalPath,\n value,\n meta: { ...meta, isAggregationChange: true },\n })\n }\n}\n\nexport const processAggregationWrites = <\n DATA extends object,\n META extends GenericMeta,\n>(\n changes: ArrayOfChanges<DATA, META>,\n store: StoreInstance<DATA, META>,\n): void => {\n const { aggregations } = store._internal.registrations\n const { queue } = store._internal.processing\n\n // Process changes in reverse (so we can safely splice)\n for (let i = changes.length - 1; i >= 0; i--) {\n const [path, value, meta] = changes[i]!\n\n // Check if this path is an aggregation target (or child of one)\n for (const [targetPath, items] of aggregations) {\n // Check for exact match or child path\n const isExactMatch = path === targetPath\n const isChildPath = path.startsWith(targetPath + '.')\n\n if (isExactMatch || isChildPath) {\n // Distribute to all source paths in all aggregations for this target\n for (const aggregation of items) {\n distributeToSources(aggregation, targetPath, path, value, meta, queue)\n }\n\n // Remove original change from batch\n changes.splice(i, 1)\n break // Move to next change\n }\n }\n }\n}\n","/**\n * PathGroups Data Structure\n *\n * A custom data structure that provides O(1) connected component lookups\n * instead of O(V+E) recomputation on every change like graphology's connectedComponents.\n *\n * When wasmGraphType is set ('sync' | 'flip'), addEdge/removeEdge automatically\n * mirror registrations to WASM bridge for pipeline processing.\n *\n * Operations complexity:\n * - getAllGroups(): O(G) where G is number of groups (typically small)\n * - getGroupPaths(path): O(1) lookup\n * - addEdge(p1, p2): O(n) where n is smaller group size (merge)\n * - removeEdge(p1, p2): O(n) for affected component\n * - hasPath(path): O(1)\n * - hasEdge(p1, p2): O(1)\n */\n\n/** Graph type for WASM mirroring. When set, addEdge/removeEdge mirror to WASM. */\nexport type WasmGraphType = 'sync' | 'flip'\n\n/**\n * Creates a canonical edge key for consistent lookups.\n * Sorts paths alphabetically to ensure addEdge(a,b) and addEdge(b,a) produce same key.\n */\nconst makeEdgeKey = (path1: string, path2: string): string =>\n path1 < path2 ? `${path1}--${path2}` : `${path2}--${path1}`\n\n/**\n * PathGroups maintains connected components with O(1) lookups.\n *\n * Internal structure:\n * - pathToGroup: Maps each path to its group ID\n * - groupToPaths: Maps each group ID to the set of paths in that group\n * - edges: Set of edge keys for edge existence checks and proper removal\n * - adjacency: Maps each path to its direct neighbors (for split detection on removal)\n * - nextGroupId: Counter for generating unique group IDs\n */\nexport interface PathGroups {\n pathToGroup: Map<string, number>\n groupToPaths: Map<number, Set<string>>\n edges: Set<string>\n adjacency: Map<string, Set<string>>\n nextGroupId: number\n wasmGraphType?: WasmGraphType\n}\n\n/**\n * Creates a new empty PathGroups instance.\n */\nexport const createPathGroups = (wasmGraphType?: WasmGraphType): PathGroups => {\n const groups: PathGroups = {\n pathToGroup: new Map(),\n groupToPaths: new Map(),\n edges: new Set(),\n adjacency: new Map(),\n nextGroupId: 0,\n }\n if (wasmGraphType !== undefined) {\n groups.wasmGraphType = wasmGraphType\n }\n return groups\n}\n\n/**\n * BFS traversal from a starting path, collecting all reachable paths.\n */\nconst bfsCollect = (\n adjacency: Map<string, Set<string>>,\n startPath: string,\n): Set<string> => {\n const visited = new Set<string>([startPath])\n const queue = [startPath]\n\n while (queue.length > 0) {\n const current = queue.shift()!\n const neighbors = adjacency.get(current)\n if (!neighbors) continue\n\n for (const neighbor of neighbors) {\n if (!visited.has(neighbor)) {\n visited.add(neighbor)\n queue.push(neighbor)\n }\n }\n }\n\n return visited\n}\n\n/**\n * Removes an isolated path (one with no edges) from the data structure.\n */\nconst removeIsolatedPath = (groups: PathGroups, path: string): void => {\n const groupId = groups.pathToGroup.get(path)\n if (groupId !== undefined) {\n groups.groupToPaths.get(groupId)?.delete(path)\n if (groups.groupToPaths.get(groupId)?.size === 0) {\n groups.groupToPaths.delete(groupId)\n }\n }\n groups.pathToGroup.delete(path)\n groups.adjacency.delete(path)\n}\n\n/**\n * Handles component split after edge removal.\n * If path2 is no longer reachable from path1, creates a new group for path2's component.\n */\nconst handleComponentSplit = (\n groups: PathGroups,\n path1: string,\n path2: string,\n): void => {\n // BFS from path1 to see if we can reach path2\n const reachableFromPath1 = bfsCollect(groups.adjacency, path1)\n\n // If path2 is reachable, no split occurred\n if (reachableFromPath1.has(path2)) return\n\n // Component split: create new group for path2's component\n const newGroupId = groups.nextGroupId++\n const oldGroupId = groups.pathToGroup.get(path2)!\n const newComponent = bfsCollect(groups.adjacency, path2)\n\n // Move paths to new group\n for (const path of newComponent) {\n groups.pathToGroup.set(path, newGroupId)\n groups.groupToPaths.get(oldGroupId)?.delete(path)\n }\n groups.groupToPaths.set(newGroupId, newComponent)\n\n // Clean up empty old group\n if (groups.groupToPaths.get(oldGroupId)?.size === 0) {\n groups.groupToPaths.delete(oldGroupId)\n }\n}\n\n/**\n * Adds an edge between two paths.\n * If paths are in different groups, merges them (smaller into larger).\n * If either path is new, adds it to the appropriate group.\n */\nexport const addEdge = (\n groups: PathGroups,\n path1: string,\n path2: string,\n): void => {\n const edgeKey = makeEdgeKey(path1, path2)\n\n // Skip if edge already exists\n if (groups.edges.has(edgeKey)) return\n\n // Add edge\n groups.edges.add(edgeKey)\n\n // Update adjacency\n if (!groups.adjacency.has(path1)) groups.adjacency.set(path1, new Set())\n if (!groups.adjacency.has(path2)) groups.adjacency.set(path2, new Set())\n groups.adjacency.get(path1)!.add(path2)\n groups.adjacency.get(path2)!.add(path1)\n\n const g1 = groups.pathToGroup.get(path1)\n const g2 = groups.pathToGroup.get(path2)\n\n if (g1 === undefined && g2 === undefined) {\n // Both new - create new group\n const id = groups.nextGroupId++\n groups.pathToGroup.set(path1, id)\n groups.pathToGroup.set(path2, id)\n groups.groupToPaths.set(id, new Set([path1, path2]))\n } else if (g1 !== undefined && g2 === undefined) {\n // Add path2 to path1's group\n groups.pathToGroup.set(path2, g1)\n groups.groupToPaths.get(g1)!.add(path2)\n } else if (g1 === undefined && g2 !== undefined) {\n // Add path1 to path2's group\n groups.pathToGroup.set(path1, g2)\n groups.groupToPaths.get(g2)!.add(path1)\n } else if (g1 !== g2) {\n // Merge groups - move smaller into larger\n const set1 = groups.groupToPaths.get(g1!)!\n const set2 = groups.groupToPaths.get(g2!)!\n const [smallerId, smallerSet, largerId, largerSet] =\n set1.size < set2.size ? [g1!, set1, g2!, set2] : [g2!, set2, g1!, set1]\n\n for (const path of smallerSet) {\n groups.pathToGroup.set(path, largerId)\n largerSet.add(path)\n }\n groups.groupToPaths.delete(smallerId)\n } else {\n // g1 === g2 (both defined, same group) - paths already connected, no-op\n }\n}\n\n/**\n * Removes an edge between two paths.\n * If removal splits the component, creates new groups via BFS.\n * If a path becomes isolated (no edges), removes it entirely.\n */\nexport const removeEdge = (\n groups: PathGroups,\n path1: string,\n path2: string,\n): void => {\n const edgeKey = makeEdgeKey(path1, path2)\n\n // Skip if edge doesn't exist\n if (!groups.edges.has(edgeKey)) return\n\n // Remove edge\n groups.edges.delete(edgeKey)\n\n // Update adjacency\n groups.adjacency.get(path1)?.delete(path2)\n groups.adjacency.get(path2)?.delete(path1)\n\n // Check for isolated nodes\n const adj1 = groups.adjacency.get(path1)\n const adj2 = groups.adjacency.get(path2)\n const path1Isolated = !adj1 || adj1.size === 0\n const path2Isolated = !adj2 || adj2.size === 0\n\n if (path1Isolated) removeIsolatedPath(groups, path1)\n if (path2Isolated) removeIsolatedPath(groups, path2)\n\n // If both paths still have edges, check if component split\n if (!path1Isolated && !path2Isolated) {\n handleComponentSplit(groups, path1, path2)\n }\n}\n\n/**\n * Returns all connected components as arrays of paths.\n * O(G) where G is number of groups.\n */\nexport const getAllGroups = (groups: PathGroups): string[][] =>\n [...groups.groupToPaths.values()].map((set) => [...set])\n\n/**\n * Returns all paths in the same connected component as the given path.\n * O(1) lookup.\n */\nexport const getGroupPaths = (groups: PathGroups, path: string): string[] => {\n const groupId = groups.pathToGroup.get(path)\n if (groupId === undefined) return []\n return [...groups.groupToPaths.get(groupId)!]\n}\n\n/**\n * Checks if a path exists in the structure.\n * O(1) lookup.\n */\nexport const hasPath = (groups: PathGroups, path: string): boolean =>\n groups.pathToGroup.has(path)\n\n/**\n * Checks if an edge exists between two paths.\n * O(1) lookup.\n */\nexport const hasEdge = (\n groups: PathGroups,\n path1: string,\n path2: string,\n): boolean => groups.edges.has(makeEdgeKey(path1, path2))\n\n/**\n * Returns the degree (number of edges) for a path.\n * O(1) lookup.\n */\nexport const getPathDegree = (groups: PathGroups, path: string): number =>\n groups.adjacency.get(path)?.size ?? 0\n","/**\n * Change Normalization Helper\n *\n * Normalizes ArrayOfChanges for registered paths by handling:\n * - Exact match: change path equals registered path\n * - Parent change: change path is ancestor of registered path (extracts nested value)\n * - Child change: change path is descendant of registered path (preserves relative path)\n */\n\nimport { dot } from '../utils/dot'\nimport { is } from '../utils/is'\nimport type {\n NormalizeChangeArgs,\n NormalizeChangesGroupedArgs,\n NormalizedChange,\n NormalizedChangesGrouped,\n} from './normalize-changes.types'\n\nexport type { AnyChange } from './normalize-changes.types'\n\n// =============================================================================\n// Core normalization logic\n// =============================================================================\n\n/**\n * Normalize a single change for a single registered path\n * Returns null if the change is not relevant to the registered path\n */\nconst normalizeChange = (\n props: NormalizeChangeArgs,\n): NormalizedChange | null => {\n const { changePath, changeValue, changeMeta, registeredPath, matchMode } =\n props\n\n // Case 1: Exact match (skipped in 'children-only' mode)\n // e.g., changePath='a.b.c', registeredPath='a.b.c'\n if (matchMode === 'all' && changePath === registeredPath) {\n return { relativePath: null, value: changeValue, meta: changeMeta }\n }\n\n // Case 2: Parent change (skipped in 'children-only' mode)\n // e.g., changePath='a.b', registeredPath='a.b.c.d'\n // Extract nested value, relativePath is empty (applies to base neighbor path)\n if (matchMode === 'all' && registeredPath.startsWith(changePath + '.')) {\n if (is.not.object(changeValue)) {\n return null\n }\n\n // Extract nested value: 'a.b.c.d' - 'a.b.' = 'c.d'\n const nestedPath = registeredPath.slice(changePath.length + 1)\n const extractedValue = dot.get__unsafe(changeValue, nestedPath)\n\n if (extractedValue === undefined) {\n return null\n }\n\n return { relativePath: null, value: extractedValue, meta: changeMeta }\n }\n\n // Case 3: Child change (always matched in both modes)\n // e.g., changePath='a.b.c.d.e', registeredPath='a.b.c'\n // Preserve relative path to append to neighbor paths\n if (changePath.startsWith(registeredPath + '.')) {\n // Relative path: 'a.b.c.d.e' - 'a.b.c.' = 'd.e'\n const relativePath = changePath.slice(registeredPath.length + 1)\n return { relativePath, value: changeValue, meta: changeMeta }\n }\n\n // No match\n return null\n}\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Normalize changes for grouped/connected paths (e.g., sync path components)\n *\n * When a change matches ANY path in a group, it's recorded once for the whole group.\n * The relativePath can be used to apply the change to all neighbor paths.\n *\n * @example\n * // Sync paths: ['a.b.c', 'path.synced', 'wow.path'] are connected\n * // Exact match on one path\n * changes: [['a.b.c', 'newValue', {}]]\n * pathGroups: [['a.b.c', 'path.synced', 'wow.path']]\n * result: [{\n * matchedPath: 'a.b.c',\n * relativePath: null,\n * value: 'newValue',\n * meta: {},\n * connectedPaths: ['a.b.c', 'path.synced', 'wow.path']\n * }]\n * // Apply: 'path.synced' = 'newValue', 'wow.path' = 'newValue'\n *\n * @example\n * // Child change - relativePath is preserved\n * changes: [['a.b.c.deep.nested', 42, {}]]\n * pathGroups: [['a.b.c', 'path.synced', 'wow.path']]\n * result: [{\n * matchedPath: 'a.b.c',\n * relativePath: 'deep.nested',\n * value: 42,\n * meta: {},\n * connectedPaths: ['a.b.c', 'path.synced', 'wow.path']\n * }]\n * // Apply: 'path.synced.deep.nested' = 42, 'wow.path.deep.nested' = 42\n */\nexport const normalizeChangesForGroups = (\n props: NormalizeChangesGroupedArgs,\n): NormalizedChangesGrouped => {\n const result: NormalizedChangesGrouped = []\n const matchMode = props.matchMode ?? 'all'\n\n for (const change of props.changes) {\n const [changePath, changeValue, changeMeta] = change\n\n for (const group of props.pathGroups) {\n // Find first matching path in this group\n let match: { path: string; normalized: NormalizedChange } | null = null\n\n for (const registeredPath of group) {\n const normalized = normalizeChange({\n changePath,\n changeValue,\n changeMeta,\n registeredPath,\n matchMode,\n })\n\n if (normalized) {\n match = { path: registeredPath, normalized }\n break // Stop at first match in group\n }\n }\n\n // If any path in group matched, record it once for the whole group\n if (match) {\n result.push({\n matchedPath: match.path,\n relativePath: match.normalized.relativePath,\n value: match.normalized.value,\n meta: match.normalized.meta,\n connectedPaths: group,\n })\n }\n }\n }\n\n return result\n}\n","/**\n * Flip Path Processor\n *\n * Processes flip path side effects - inverts boolean values across paired paths.\n * Uses normalizeChangesForGroups to handle exact, parent, and child changes.\n */\n\nimport { getAllGroups } from '../../core/path-groups'\nimport type { StoreInstance } from '../../core/types'\nimport type { ArrayOfChanges, GenericMeta } from '../../types'\nimport { AnyChange, normalizeChangesForGroups } from '../normalize-changes'\nimport { queueChange } from '../queue'\n\nexport const processFlipPaths = <DATA extends object, META extends GenericMeta>(\n changes: ArrayOfChanges<DATA, META>,\n store: StoreInstance<DATA, META>,\n): void => {\n const { flip } = store._internal.graphs\n const { queue } = store._internal.processing\n\n // Get connected components (groups of flipped paths) - O(1) with PathGroups\n const pathGroups = getAllGroups(flip)\n if (pathGroups.length === 0) return\n\n // Normalize changes for grouped paths\n const normalizedChanges = normalizeChangesForGroups({\n changes: changes as AnyChange[],\n pathGroups,\n matchMode: 'all',\n })\n\n // Apply each normalized change to all neighbors (with flipped value)\n for (const match of normalizedChanges) {\n // Flip paths only work with boolean values\n if (typeof match.value !== 'boolean') continue\n\n const meta = { isFlipPathChange: true, ...match.meta }\n\n // Flip to all paths in the connected group except the matched one\n for (const neighborPath of match.connectedPaths) {\n if (neighborPath === match.matchedPath) continue\n\n // Build target path: neighbor + relativePath (if child change)\n const targetPath = match.relativePath\n ? `${neighborPath}.${match.relativePath}`\n : neighborPath\n\n queueChange({ queue, path: targetPath, value: !match.value, meta })\n }\n }\n}\n","/**\n * Path utility functions\n *\n * Common path manipulation utilities used across the codebase.\n * Centralized here to avoid duplication.\n */\n\n/**\n * Calculate the depth of a dot-notation path\n *\n * @example\n * getPathDepth('') // 0\n * getPathDepth('user') // 1\n * getPathDepth('user.profile.name') // 3\n */\nexport const getPathDepth = (path: string): number => {\n if (!path) return 0\n return path.split('.').length\n}\n","/**\n * Listener Processor\n *\n * Processes registered listeners with filtered/scoped changes.\n * Listeners only receive child changes (not exact path matches).\n */\n\nimport type { StoreInstance } from '../../core/types'\nimport type { ArrayOfChanges, GenericMeta } from '../../types'\nimport { dot } from '../../utils/dot'\nimport { getPathDepth } from '../../utils/path-utils'\nimport { AnyChange } from '../normalize-changes'\nimport { queueChange } from '../queue'\nimport type { ProcessListenerArgs } from './types'\n\n/**\n * Process a single listener with relevant changes\n * Handles path (what to watch) vs scope (how to present data) distinction\n */\nconst processListener = <DATA extends object, META extends GenericMeta>(\n props: ProcessListenerArgs<DATA, META>,\n): void => {\n if (props.relevantChanges.length === 0) return\n\n const scope = props.registration.scope ?? ''\n\n // Get scoped state for the listener\n const scopedState =\n scope === ''\n ? props.currentState\n : dot.get__unsafe(props.currentState, scope)\n\n // Call listener ONCE with changes and SCOPED state\n const result = props.registration.fn(props.relevantChanges, scopedState)\n if (!result || result.length === 0) return\n\n // Add listener metadata to returned changes\n for (const [path, value, changeMeta] of result) {\n const meta = { isListenerChange: true, ...changeMeta }\n queueChange({ queue: props.queue, path, value, meta })\n }\n}\n\n/**\n * Filter changes to only include children of the listener path\n * and convert to relative paths in a single pass\n */\nconst filterAndRelativize = (\n changes: AnyChange[],\n listenerPath: string,\n): AnyChange[] => {\n const result: AnyChange[] = []\n\n // Root listener: include top-level paths only (no dots in path)\n if (listenerPath === '') {\n for (const change of changes) {\n if (!change[0].includes('.')) {\n result.push(change)\n }\n }\n return result\n }\n\n // Non-root listener: include exact match and children, convert children to relative paths\n const prefix = listenerPath + '.'\n for (const change of changes) {\n if (change[0] === listenerPath) {\n // Exact path match: pass through with the full path\n result.push([change[0], change[1], change[2]])\n } else if (change[0].startsWith(prefix)) {\n result.push([change[0].slice(prefix.length), change[1], change[2]])\n } else {\n // Change doesn't match this listener's path — skip\n }\n }\n\n return result\n}\n\nexport const processListeners = <DATA extends object, META extends GenericMeta>(\n changes: ArrayOfChanges<DATA, META>,\n store: StoreInstance<DATA, META>,\n currentState: DATA,\n): void => {\n const { listeners, sortedListenerPaths } = store._internal.graphs\n const { queue } = store._internal.processing\n\n // Filter out no-op changes (value unchanged from current state)\n // This prevents listeners from firing when setValue is called with the same value\n const effectiveChanges: AnyChange[] = []\n for (const change of changes as AnyChange[]) {\n const current = dot.get__unsafe(currentState, change[0])\n if (current !== change[1]) {\n effectiveChanges.push(change)\n } else {\n // Do nothing. Changes are same.\n }\n }\n\n if (effectiveChanges.length === 0) return\n\n // Sort changes by path depth (deepest first)\n const sortedChanges = effectiveChanges.sort(\n (a, b) => getPathDepth(b[0]) - getPathDepth(a[0]),\n )\n\n // Process each listener path with filtered changes\n for (const listenerPath of sortedListenerPaths) {\n const pathListeners = listeners.get(listenerPath)!\n\n // Filter and relativize changes in single pass\n const relevantChanges = filterAndRelativize(sortedChanges, listenerPath)\n\n // Process each listener with the filtered changes\n for (const registration of pathListeners) {\n processListener({\n // Safe: ListenerRegistration and ListenerRegistrationInternal have same runtime shape\n // The function signature difference (ArrayOfChanges vs AnyChange[]) is a compile-time distinction only\n registration: registration as unknown as ProcessListenerArgs<\n DATA,\n META\n >['registration'],\n relevantChanges,\n currentState,\n queue,\n })\n }\n }\n}\n","/**\n * Sync Path Processor\n *\n * Processes sync path side effects - synchronizes values across paired paths.\n * Uses normalizeChangesForGroups to handle exact, parent, and child changes.\n */\n\nimport { getAllGroups } from '../../core/path-groups'\nimport type { StoreInstance } from '../../core/types'\nimport type { ArrayOfChanges, GenericMeta } from '../../types'\nimport { AnyChange, normalizeChangesForGroups } from '../normalize-changes'\nimport { queueChange } from '../queue'\n\nexport const processSyncPaths = <DATA extends object, META extends GenericMeta>(\n changes: ArrayOfChanges<DATA, META>,\n store: StoreInstance<DATA, META>,\n): void => {\n const { sync } = store._internal.graphs\n const { queue } = store._internal.processing\n\n // Get connected components (groups of synced paths) - O(1) with PathGroups\n const pathGroups = getAllGroups(sync)\n if (pathGroups.length === 0) return\n\n // Normalize changes for grouped paths\n const normalizedChanges = normalizeChangesForGroups({\n changes: changes as AnyChange[],\n pathGroups,\n matchMode: 'all',\n })\n\n // Apply each normalized change to all neighbors\n for (const match of normalizedChanges) {\n const meta = { isSyncPathChange: true, ...match.meta }\n\n // Sync to all paths in the connected group except the matched one\n for (const neighborPath of match.connectedPaths) {\n if (neighborPath === match.matchedPath) continue\n\n // Build target path: neighbor + relativePath (if child change)\n const targetPath = match.relativePath\n ? `${neighborPath}.${match.relativePath}`\n : neighborPath\n\n queueChange({ queue, path: targetPath, value: match.value, meta })\n }\n }\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\nimport { snapshot } from 'valtio'\n\nimport type {\n ConcernValues,\n DebugTrackEntry,\n StoreInstance,\n} from '../core/types'\nimport type { ArrayOfChanges, GenericMeta } from '../types'\nimport { dot } from '../utils/dot'\nimport type { Change, FullExecutionPlan, WasmPipeline } from '../wasm/bridge'\nimport { applyBatch } from './apply-batch'\n\n// ---------------------------------------------------------------------------\n// Conversion helpers: ArrayOfChanges <-> Change[]\n// ---------------------------------------------------------------------------\n\n/** Convert pipeline tuple format to bridge object format. */\nconst tuplesToBridgeChanges = <DATA extends object, META extends GenericMeta>(\n changes: ArrayOfChanges<DATA, META>,\n): Change[] =>\n changes.map(([path, value]) => ({\n path: path as string,\n value,\n }))\n\n/** Convert bridge object format to pipeline tuple format. */\nconst bridgeChangesToTuples = <DATA extends object, META extends GenericMeta>(\n changes: Change[],\n meta: GenericMeta = {},\n): ArrayOfChanges<DATA, META> =>\n changes.map(\n (c) => [c.path, c.value, meta] as ArrayOfChanges<DATA, META>[number],\n ) as unknown as ArrayOfChanges<DATA, META>\n\n/**\n * Execute a pre-computed execution plan with propagation map.\n * Trivial loop — no ancestor walking, no path remapping logic.\n * WASM pre-computes all routing; TS just iterates and calls handlers.\n */\n/**\n * Build the input array for a single listener dispatch.\n * Combines changes referenced by index with propagated extras from parent dispatches.\n */\nconst buildDispatchInput = (\n d: FullExecutionPlan['groups'][number]['dispatches'][number],\n stateChanges: Change[],\n extra: Map<number, Change[]>,\n): [string, unknown, GenericMeta][] => {\n // Single pass: filter + map combined\n const input: [string, unknown, GenericMeta][] = []\n for (const id of d.input_change_ids) {\n const change = stateChanges[id]\n if (change !== undefined) {\n input.push([change.path, change.value, {}])\n }\n }\n\n const extraChanges = extra.get(d.dispatch_id)\n if (extraChanges) {\n for (const c of extraChanges) {\n input.push([c.path, c.value, {}])\n }\n }\n\n return input\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 * Propagate produced changes to parent dispatches via pre-computed propagation map.\n */\nconst propagateChanges = (\n dispatchId: number,\n producedChanges: Change[],\n propagationMap: FullExecutionPlan['propagation_map'],\n extra: Map<number, Change[]>,\n): void => {\n const targets = propagationMap[dispatchId]\n if (!targets) return\n\n for (const t of targets) {\n let existing = extra.get(t.target_dispatch_id)\n if (!existing) {\n existing = []\n extra.set(t.target_dispatch_id, existing)\n }\n for (const c of producedChanges) {\n existing.push({\n path: remapPath(c.path, t.remap_prefix),\n value: c.value,\n })\n }\n }\n}\n\nconst executeFullExecutionPlan = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n>(\n plan: FullExecutionPlan | null,\n stateChanges: Change[],\n store: StoreInstance<DATA, META>,\n currentState: DATA,\n): Change[] => {\n if (!plan || plan.groups.length === 0) {\n return []\n }\n\n const { listenerHandlers } = store._internal.graphs\n const allProducedChanges: Change[] = []\n const extra = new Map<number, Change[]>()\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, stateChanges, extra)\n\n const result = registration.fn(input, scopedState)\n if (!result || !(result as unknown[]).length) continue\n\n const producedChanges = (result as [string, unknown][]).map(\n ([path, value]) => ({ path, value }),\n )\n allProducedChanges.push(...producedChanges)\n\n // Propagate to parent dispatches via pre-computed propagation map\n propagateChanges(\n d.dispatch_id,\n producedChanges,\n plan.propagation_map,\n extra,\n )\n }\n }\n\n return allProducedChanges\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\"\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 - Changes with paths in \"basePath.concernName\" format (no _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 Zod validators and return concern changes.\n * Takes validators_to_run from WASM, returns concern changes with _concerns. prefix.\n */\nconst runValidators = (\n validatorsToRun: {\n validator_id: number\n output_path: string\n dependency_values: Record<string, string>\n }[],\n pipeline: WasmPipeline,\n): Change[] => {\n const validationResults: 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 zodResult = schema.safeParse(primaryValue)\n\n // Return as Change with _concerns. prefix (WASM will strip it in finalize)\n validationResults.push({\n path: validator.output_path, // Already has _concerns. prefix\n value: {\n isError: !zodResult.success,\n errors: zodResult.success\n ? []\n : zodResult.error.errors.map((e) => ({\n field: e.path.length > 0 ? e.path.join('.') : '.',\n message: e.message,\n })),\n },\n })\n }\n\n return validationResults\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst CONCERNS_PREFIX = '_concerns.'\nconst CONCERNS_PREFIX_LEN = CONCERNS_PREFIX.length\n\n/** Partition changes into state vs concern changes, stripping _concerns. prefix. */\nconst partitionChanges = (\n changes: Change[],\n): { stateChanges: Change[]; concernChanges: Change[] } => {\n const stateChanges: Change[] = []\n const concernChanges: Change[] = []\n for (const change of changes) {\n if (change.path.startsWith(CONCERNS_PREFIX)) {\n concernChanges.push({\n path: change.path.slice(CONCERNS_PREFIX_LEN),\n value: change.value,\n })\n } else {\n stateChanges.push(change)\n }\n }\n return { stateChanges, concernChanges }\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: typeof import('./process-changes').processChanges =\n (store, initialChanges) => {\n const pipeline = store._internal.pipeline!\n\n // Convert to bridge format\n const bridgeChanges = tuplesToBridgeChanges(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 // 1. WASM Phase 1: aggregation → sync → flip → BoolLogic\n const { state_changes, execution_plan, validators_to_run, has_work } =\n pipeline.processChanges(bridgeChanges)\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 // 2. Apply state changes FIRST (so listeners see updated state)\n // Partition early: separate state changes from concern changes\n const early = partitionChanges(state_changes)\n\n // Apply state changes to valtio (so listeners see updated state)\n if (early.stateChanges.length > 0) {\n applyBatch(bridgeChangesToTuples(early.stateChanges), store.state)\n }\n\n // 3. Execute listeners (JS-only: user functions) - now with updated state\n const currentState = snapshot(store.state) as typeof store.state\n const produced = executeFullExecutionPlan(\n execution_plan,\n state_changes,\n store,\n currentState,\n )\n\n // Apply concern changes from phase 1 (BoolLogic results)\n if (early.concernChanges.length > 0) {\n applyConcernChanges(early.concernChanges, store._concerns)\n }\n\n // 4. Execute validators (JS-only: Zod schemas)\n const validationResults = runValidators(validators_to_run, pipeline)\n\n // 5. WASM Phase 2: merge, diff, update shadow\n // Single flat array: listener output + validator output (with _concerns. prefix)\n const jsChanges = produced.concat(validationResults)\n const final = pipeline.pipelineFinalize(jsChanges)\n\n // 6. Apply NEW changes from listeners/validators to valtio\n // Phase 1 changes were already applied above, so filter them out\n const late = partitionChanges(final.state_changes)\n\n // Apply only NEW changes (listener/validator output)\n if (late.stateChanges.length > 0) {\n applyBatch(bridgeChangesToTuples(late.stateChanges), store.state)\n }\n if (late.concernChanges.length > 0) {\n applyConcernChanges(late.concernChanges, store._concerns)\n }\n\n // Record applied changes for debug tracking\n if (trackEntry) {\n pushDebugChanges(trackEntry.applied, early.stateChanges)\n pushDebugChanges(trackEntry.applied, late.stateChanges)\n pushDebugChanges(trackEntry.appliedConcerns, early.concernChanges)\n pushDebugChanges(trackEntry.appliedConcerns, late.concernChanges)\n store._debug!.calls.push(trackEntry)\n }\n }\n","import { effect } from 'valtio-reactive'\n\nimport type { Aggregation, StoreInstance } from '../../core/types'\nimport type { AggregationPair, GenericMeta } from '../../types'\nimport { dot } from '../../utils/dot'\n\n/**\n * Legacy JS implementation - Register multiple aggregations together (follows concerns pattern)\n * Creates all effects in one pass, returns single cleanup function\n */\nexport const registerAggregations = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n>(\n store: StoreInstance<DATA, META>,\n id: string,\n aggregationPairs: AggregationPair<DATA>[],\n): (() => void) => {\n const { aggregations } = store._internal.registrations\n const disposeCallbacks: (() => void)[] = []\n\n // Collect all targets and sources for validation\n const targets = new Set<string>()\n const sources = new Set<string>()\n\n for (const [target, source] of aggregationPairs) {\n targets.add(target)\n sources.add(source)\n }\n\n // Validate no circular dependencies\n for (const target of targets) {\n if (sources.has(target)) {\n throw new Error(\n `[apex-state] Circular aggregation: \"${target}\" cannot be both target and source`,\n )\n }\n }\n\n // Group by target for multi-source aggregations\n const byTarget = new Map<string, string[]>()\n for (const [target, source] of aggregationPairs) {\n const existing = byTarget.get(target) ?? []\n existing.push(source)\n byTarget.set(target, existing)\n }\n\n // Track aggregations we create for cleanup\n const createdAggregations: Aggregation[] = []\n\n // Create all aggregation effects together\n for (const [targetPath, sourcePaths] of byTarget) {\n const aggregation: Aggregation = {\n targetPath,\n sourcePaths,\n id: `${id}:${targetPath}`, // Optional: for debugging\n }\n\n // Add to store's aggregations map (used by pipeline)\n const existing = aggregations.get(targetPath) ?? []\n existing.push(aggregation)\n aggregations.set(targetPath, existing)\n\n // Track for cleanup\n createdAggregations.push(aggregation)\n\n // Create reactive effect for this aggregation\n const dispose = effect(() => {\n // Early exit: stop as soon as we find a mismatch\n if (sourcePaths.length === 0) {\n dot.set__unsafe(store.state, targetPath, null)\n return\n }\n\n // Check if all source paths have equal values\n const allEqual = dot.same(store.state, ...sourcePaths)\n\n // Set target: value if all equal, null otherwise\n const result = allEqual\n ? dot.get__unsafe(store.state, sourcePaths[0]!)\n : null\n\n dot.set__unsafe(store.state, targetPath, result)\n })\n\n disposeCallbacks.push(dispose)\n }\n\n // Return cleanup function (concerns pattern)\n return () => {\n // Dispose all effects\n disposeCallbacks.forEach((dispose) => dispose())\n\n // Remove aggregations from map\n for (const aggregation of createdAggregations) {\n const items = aggregations.get(aggregation.targetPath) ?? []\n const filtered = items.filter((item) => item !== aggregation)\n\n if (filtered.length === 0) {\n aggregations.delete(aggregation.targetPath)\n } else {\n aggregations.set(aggregation.targetPath, filtered)\n }\n }\n }\n}\n","import {\n addEdge,\n getPathDegree,\n hasEdge,\n hasPath,\n removeEdge,\n} from '../../core/path-groups'\nimport type { StoreInstance } from '../../core/types'\nimport type { GenericMeta } from '../../types'\n\n/** Legacy JS implementation - uses JS graph structure */\nexport const registerFlipPair = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n>(\n store: StoreInstance<DATA, META>,\n path1: string & {},\n path2: string & {},\n): (() => void) => {\n const { flip } = store._internal.graphs\n\n // Add edge (implicitly adds nodes if they don't exist)\n addEdge(flip, path1, path2)\n\n return () => {\n // Remove edge\n if (hasEdge(flip, path1, path2)) {\n removeEdge(flip, path1, path2)\n }\n // Note: removeEdge handles isolated node cleanup automatically\n // But we check explicitly for paths that might have other connections\n if (hasPath(flip, path1) && getPathDegree(flip, path1) === 0) {\n removeEdge(flip, path1, path1) // This is a no-op but keeps the pattern\n }\n if (hasPath(flip, path2) && getPathDegree(flip, path2) === 0) {\n removeEdge(flip, path2, path2) // This is a no-op but keeps the pattern\n }\n }\n}\n","import type { ListenerRegistration, StoreInstance } from '../../core/types'\nimport type { GenericMeta } from '../../types'\nimport { getPathDepth } from '../../utils/path-utils'\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\nconst updateSortedListenerPaths = (graphs: {\n listeners: Map<string, unknown[]>\n sortedListenerPaths: string[]\n}): void => {\n graphs.sortedListenerPaths = Array.from(graphs.listeners.keys()).sort(\n (a, b) => getPathDepth(b) - getPathDepth(a),\n )\n}\n\n/**\n * Helper to validate that scope is a parent/ancestor of path\n */\nconst validateScopeAndPath = (\n path: string | null,\n scope: string | null,\n): void => {\n // If either is null, validation passes\n if (path === null || scope === null) return\n\n // If scope === path, that's valid\n if (path === scope) return\n\n // Scope must be a prefix of path (parent/ancestor)\n // e.g., path: 'a.b.c', scope: 'a.b' ✅\n // e.g., path: 'a.b.c', scope: '1.2.3' ❌\n if (!path.startsWith(scope + '.')) {\n throw new Error(\n `Invalid listener: scope '${scope}' must be a parent/ancestor of path '${path}', or one must be null`,\n )\n }\n}\n\n/** Legacy JS implementation - uses JS listener maps and sorted paths */\nexport const registerListenerLegacy = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n>(\n store: StoreInstance<DATA, META>,\n registration: ListenerRegistration<DATA, META>,\n): (() => void) => {\n const { graphs } = store._internal\n const { listeners, listenerHandlers } = graphs\n\n // Validate that scope is a parent/ancestor of path\n validateScopeAndPath(registration.path, registration.scope)\n\n // Assign a unique subscriber_id for O(1) handler lookup\n const subscriberId = nextSubscriberId++\n\n // Use path as the map key (empty string for null)\n const mapKey = registration.path ?? ''\n const existing = listeners.get(mapKey) ?? []\n\n // Wrap fn with timing measurement (no-op when timing is disabled)\n const originalFn = registration.fn\n registration.fn = (changes, state) =>\n store._internal.timing.run('listeners', () => originalFn(changes, state), {\n path: mapKey,\n name: 'listener',\n })\n\n listeners.set(mapKey, [...existing, registration])\n\n // Store in flat handler map for O(1) dispatch lookup\n listenerHandlers.set(subscriberId, {\n scope: registration.scope,\n fn: registration.fn as (...args: unknown[]) => unknown,\n })\n\n // Update sorted paths cache\n updateSortedListenerPaths(graphs)\n\n return () => {\n const list = listeners.get(mapKey)\n if (list) {\n const filtered = list.filter((l) => l !== registration)\n if (filtered.length > 0) {\n listeners.set(mapKey, filtered)\n } else {\n listeners.delete(mapKey)\n }\n // Update sorted paths cache after removal\n updateSortedListenerPaths(graphs)\n }\n // Remove from flat handler map\n listenerHandlers.delete(subscriberId)\n }\n}\n","import type { PathGroups } from '../../core/path-groups'\nimport {\n addEdge,\n getGroupPaths,\n getPathDegree,\n hasEdge,\n hasPath,\n removeEdge,\n} from '../../core/path-groups'\nimport type { StoreInstance } from '../../core/types'\nimport { processChanges } from '../../pipeline/process-changes'\nimport type { ArrayOfChanges, GenericMeta } from '../../types'\nimport { dot } from '../../utils/dot'\nimport { is } from '../../utils/is'\n\n/**\n * Collects sync changes needed to align a group of paths to the most common value.\n * Returns changes array (may be empty if no sync needed).\n */\nconst collectGroupSyncChanges = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n>(\n store: StoreInstance<DATA, META>,\n component: string[],\n): ArrayOfChanges<DATA, META> => {\n // Count value occurrences (excluding null/undefined)\n const valueCounts = new Map<unknown, number>()\n for (const path of component) {\n const value = dot.get__unsafe(store.state, path)\n if (is.not.nil(value)) {\n const count = valueCounts.get(value) ?? 0\n valueCounts.set(value, count + 1)\n }\n }\n\n // Find most common value\n let mostCommonValue: unknown = undefined\n let maxCount = 0\n for (const [value, count] of valueCounts) {\n if (count > maxCount) {\n maxCount = count\n mostCommonValue = value\n }\n }\n\n // Collect divergent changes\n const changes: ArrayOfChanges<DATA, META> = []\n if (is.not.undefined(mostCommonValue)) {\n for (const path of component) {\n const currentValue = dot.get__unsafe(store.state, path)\n if (currentValue !== mostCommonValue) {\n changes.push([\n path,\n mostCommonValue,\n { isSyncPathChange: true },\n ] as ArrayOfChanges<DATA, META>[number])\n }\n }\n }\n\n return changes\n}\n\n/**\n * Creates an edge cleanup function for a sync pair.\n */\nconst makeSyncEdgeCleanup =\n (sync: PathGroups, path1: string, path2: string): (() => void) =>\n () => {\n if (hasEdge(sync, path1, path2)) {\n removeEdge(sync, path1, path2)\n }\n if (hasPath(sync, path1) && getPathDegree(sync, path1) === 0) {\n removeEdge(sync, path1, path1)\n }\n if (hasPath(sync, path2) && getPathDegree(sync, path2) === 0) {\n removeEdge(sync, path2, path2)\n }\n }\n\n/**\n * Legacy batch version of registerSyncPair. Adds all edges first, then computes\n * initial sync changes across all final groups and calls processChanges once.\n * This avoids cascading effect re-evaluations when registering many pairs.\n */\nexport const registerSyncPairsBatch = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n>(\n store: StoreInstance<DATA, META>,\n pairs: [string & {}, string & {}][],\n): (() => void) => {\n const { sync } = store._internal.graphs\n const edgeCleanups: (() => void)[] = []\n\n // Phase 1: Add ALL edges without calling processChanges\n for (const [path1, path2] of pairs) {\n addEdge(sync, path1, path2)\n edgeCleanups.push(makeSyncEdgeCleanup(sync, path1, path2))\n }\n\n // Phase 2: Iterate final groups (deduplicate via pathToGroup)\n const processedGroups = new Set<number>()\n const allChanges: ArrayOfChanges<DATA, META> = []\n\n for (const [path1] of pairs) {\n const groupId = sync.pathToGroup.get(path1)\n if (groupId === undefined || processedGroups.has(groupId)) continue\n processedGroups.add(groupId)\n\n const component = getGroupPaths(sync, path1)\n const changes = collectGroupSyncChanges(store, component)\n allChanges.push(...changes)\n }\n\n // Phase 3: Single processChanges call with all accumulated changes\n if (allChanges.length > 0) {\n processChanges(store, allChanges)\n }\n\n return () => edgeCleanups.forEach((fn) => fn())\n}\n","import type { StoreInstance } from '../core/types'\nimport type { GenericMeta } from '../types'\nimport type { SideEffects } from '../types/side-effects'\nimport { registerAggregations } from './prebuilts/aggregation'\nimport { registerFlipPair } from './prebuilts/flip'\nimport { registerListenerLegacy } from './prebuilts/listeners'\nimport { registerSyncPairsBatch } from './prebuilts/sync'\n\nconst registerSideEffectsImpl = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n>(\n store: StoreInstance<DATA, META>,\n id: string,\n effects: SideEffects<DATA, META>,\n): (() => void) => {\n const cleanups: (() => void)[] = []\n\n // Register sync paths: [path1, path2]\n // PERF: Uses registerSyncPairsBatch (1 processChanges call) instead of per-pair loop.\n // Do NOT revert to a loop over registerSyncPair — causes N × M redundant effect evaluations.\n // See docs/SIDE_EFFECTS_GUIDE.md \"Batched Registration\" section.\n if (effects.syncPaths) {\n const cleanup = registerSyncPairsBatch(store, effects.syncPaths)\n cleanups.push(cleanup)\n }\n\n // Register flip paths: [path1, path2]\n if (effects.flipPaths) {\n for (const [path1, path2] of effects.flipPaths) {\n const cleanup = registerFlipPair(store, path1, path2)\n cleanups.push(cleanup)\n }\n }\n\n // Register aggregations: [target, source] - target always first\n if (effects.aggregations) {\n const cleanup = registerAggregations(store, id, effects.aggregations)\n cleanups.push(cleanup)\n }\n\n // Register clear paths: not supported in legacy mode (requires WASM)\n // clearPaths rules are silently ignored in legacy implementation\n\n // Register listeners: { path, scope, fn }\n if (effects.listeners) {\n for (const listener of effects.listeners) {\n const cleanup = registerListenerLegacy(store, listener)\n cleanups.push(cleanup)\n }\n }\n\n // Store cleanup reference\n const combinedCleanup = () => cleanups.forEach((fn) => fn())\n store._internal.registrations.sideEffectCleanups.set(id, combinedCleanup)\n\n return () => {\n combinedCleanup()\n store._internal.registrations.sideEffectCleanups.delete(id)\n }\n}\n\nexport const registerSideEffects = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n>(\n store: StoreInstance<DATA, META>,\n id: string,\n effects: SideEffects<DATA, META>,\n): (() => void) =>\n store._internal.timing.run(\n 'registration',\n () => registerSideEffectsImpl(store, id, effects),\n { path: id, name: 'sideEffects' },\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 type { StoreInstance } from '../core/types'\nimport { applyBatch } from '../pipeline/apply-batch'\nimport { processChanges } from '../pipeline/process-changes'\nimport type { GenericMeta } from '../types'\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, META>,\n id: string,\n effects: SideEffects<DATA, META>,\n): (() => void) => {\n // Build consolidated side effects registration\n const syncPairs: [string, string][] = effects.syncPaths ?? []\n const flipPairs: [string, string][] = effects.flipPaths ?? []\n const aggregationPairs: [string, string][] = effects.aggregations ?? []\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 as string[],\n targets: (opts?.expandMatch\n ? (targets as string[]).map((t) => t.replace(/\\[\\*\\]/g, '[**]'))\n : targets) as string[],\n }))\n\n // Build listeners array\n const listeners = effects.listeners?.map((listener) => {\n const { listenerHandlers } = store._internal.graphs\n\n // Assign unique subscriber_id for O(1) handler lookup\n const subscriberId = nextSubscriberId++\n\n // Wrap fn with timing measurement\n const originalFn = listener.fn\n const mapKey = listener.path ?? ''\n const wrappedFn = (changes: any, state: any) =>\n store._internal.timing.run(\n 'listeners',\n () => originalFn(changes, state),\n {\n path: mapKey,\n name: 'listener',\n },\n )\n\n // Store in handler map for execution\n listenerHandlers.set(subscriberId, {\n scope: listener.scope,\n fn: wrappedFn,\n })\n\n return {\n subscriber_id: subscriberId,\n topic_path: listener.path ?? '',\n scope_path: listener.scope ?? '',\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 result = pipeline.registerSideEffects({\n registration_id: registrationId,\n ...(syncPairs.length > 0 && { sync_pairs: syncPairs }),\n ...(flipPairs.length > 0 && { flip_pairs: flipPairs }),\n ...(aggregationPairs.length > 0 && { aggregation_pairs: aggregationPairs }),\n ...(clearPaths && clearPaths.length > 0 && { clear_paths: clearPaths }),\n ...(listeners && listeners.length > 0 && { listeners }),\n })\n\n // Apply sync changes to valtio\n if (result.sync_changes.length > 0) {\n const syncChanges = result.sync_changes.map((c) => [\n c.path,\n c.value,\n { isSyncPathChange: true },\n ]) as any\n processChanges(store, syncChanges)\n }\n\n // Apply aggregation changes directly to state\n if (result.aggregation_changes.length > 0) {\n applyBatch(\n result.aggregation_changes.map((c) => [c.path, c.value, {}]) as any,\n store.state,\n )\n }\n\n // Create cleanup function\n const cleanup = () => {\n pipeline.unregisterSideEffects(registrationId)\n\n // Clean up listener handlers\n effects.listeners?.forEach((_listener, index) => {\n if (listeners && listeners[index]) {\n store._internal.graphs.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 * 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 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)\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 return JSON.parse(json) as unknown\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 { z } from 'zod'\n\nimport { createFastJson } from '../utils/json'\nimport { getWasmInstance } from './lifecycle'\n\n// ---------------------------------------------------------------------------\n// Types — exported for downstream use\n// ---------------------------------------------------------------------------\n\n/** A single state change (input or output). */\nexport interface Change {\n path: string\n value: unknown\n}\n\n/** A single dispatch entry with sequential ID and input change references. */\nexport interface DispatchEntry {\n dispatch_id: number\n subscriber_id: number\n scope_path: string\n /** Indexes into ProcessResult.changes array. */\n input_change_ids: number[]\n}\n\n/** A group of dispatches to execute sequentially. */\nexport interface DispatchGroup {\n dispatches: DispatchEntry[]\n}\n\n/** A target for propagating produced changes from child to parent dispatch. */\nexport interface PropagationTarget {\n target_dispatch_id: number\n /** Prefix to prepend to child's relative paths for the target's scope. */\n remap_prefix: string\n}\n\n/** Pre-computed execution plan with propagation map. */\nexport interface FullExecutionPlan {\n groups: DispatchGroup[]\n /** propagation_map[dispatch_id] = targets to forward produced changes to. */\n propagation_map: PropagationTarget[][]\n}\n\n// ---------------------------------------------------------------------------\n// Registration types\n// ---------------------------------------------------------------------------\n\n/** An aggregation registration entry: target path + source paths. */\nexport interface AggregationEntry {\n target: string\n sources: string[]\n}\n\n/** A listener registration entry for topic-based dispatch. */\nexport interface ListenerEntry {\n subscriber_id: number\n topic_path: string\n scope_path: string\n}\n\n/** A validator registration entry for validation orchestration. */\nexport interface ValidatorEntry {\n validator_id: number\n output_path: string\n dependency_paths: string[]\n}\n\n/** A generic function registration entry (concerns, validators, listeners). */\nexport interface FunctionEntry {\n function_id: number\n dependency_paths: string[]\n scope: string\n output_path?: string\n}\n\n/** Validator dispatch info for JS-side execution. */\nexport interface ValidatorDispatch {\n validator_id: number\n output_path: string\n dependency_values: Record<string, string>\n}\n\n// ---------------------------------------------------------------------------\n// Consolidated registration types\n// ---------------------------------------------------------------------------\n\n/** Consolidated registration input for side effects (sync, flip, aggregation, clear, listeners). */\nexport interface SideEffectsRegistration {\n registration_id: string\n sync_pairs?: [string, string][]\n flip_pairs?: [string, string][]\n aggregation_pairs?: [string, string][]\n clear_paths?: { triggers: string[]; targets: string[] }[]\n listeners?: {\n subscriber_id: number\n topic_path: string\n scope_path: string\n }[]\n}\n\n/** Consolidated registration output from side effects registration. */\nexport interface SideEffectsResult {\n sync_changes: Change[]\n aggregation_changes: Change[]\n registered_listener_ids: number[]\n}\n\n/** Consolidated registration input for concerns (BoolLogic, validators, and ValueLogic). */\nexport interface ConcernsRegistration {\n registration_id: string\n bool_logics?: {\n output_path: string\n tree_json: string\n }[]\n validators?: {\n validator_id: number\n output_path: string\n dependency_paths: string[]\n scope: string\n }[]\n value_logics?: {\n output_path: string\n tree_json: string\n }[]\n}\n\n/** Consolidated registration output from concerns registration. */\nexport interface ConcernsResult {\n bool_logic_changes: Change[]\n registered_logic_ids: number[]\n registered_validator_ids: number[]\n value_logic_changes: Change[]\n registered_value_logic_ids: number[]\n}\n\n// ---------------------------------------------------------------------------\n// Internal WASM change format (path + value_json string)\n// ---------------------------------------------------------------------------\n\ninterface WasmChange {\n path: string\n value_json: string\n}\n\n// ---------------------------------------------------------------------------\n// Helpers — conversion between JS Change[] and WASM WasmChange[]\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's { path, value_json }[] for serde-wasm-bindgen. */\nconst changesToWasm = (changes: Change[]): WasmChange[] =>\n changes.map(({ path, value }) => ({ path, value_json: fastStringify(value) }))\n\n/** Convert WASM's { path, value_json }[] back to JS Change[]. */\nconst wasmChangesToJs = (wasmChanges: WasmChange[]): Change[] =>\n wasmChanges.map(({ path, value_json }) => ({\n path,\n value: fastParse(value_json),\n }))\n\n// ---------------------------------------------------------------------------\n// ProcessChanges result type\n// ---------------------------------------------------------------------------\n\n/** Result of processChanges (Phase 1). */\nexport interface ProcessChangesResult {\n state_changes: Change[]\n changes: Change[] // Backwards compat alias\n validators_to_run: ValidatorDispatch[]\n execution_plan: FullExecutionPlan | null\n has_work: boolean\n}\n\n// ---------------------------------------------------------------------------\n// WasmPipeline — per-store isolated pipeline instance\n// ---------------------------------------------------------------------------\n\n/**\n * An isolated WASM pipeline instance.\n * Each store gets its own pipeline so multiple Providers don't interfere.\n * All methods are pre-bound to the pipeline's ID — consumers never pass IDs.\n */\nexport interface WasmPipeline {\n readonly id: number\n shadowInit: (state: object) => void\n shadowDump: () => unknown\n processChanges: (changes: Change[]) => ProcessChangesResult\n pipelineFinalize: (jsChanges: Change[]) => { state_changes: Change[] }\n registerSideEffects: (reg: SideEffectsRegistration) => SideEffectsResult\n unregisterSideEffects: (registrationId: string) => void\n registerConcerns: (reg: ConcernsRegistration) => ConcernsResult\n unregisterConcerns: (registrationId: string) => void\n registerBoolLogic: (outputPath: string, tree: unknown) => number\n unregisterBoolLogic: (logicId: number) => void\n pipelineReset: () => void\n destroy: () => void\n /** Per-instance storage for Zod schemas (can't cross WASM boundary). */\n validatorSchemas: Map<number, z.ZodSchema>\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 = (): WasmPipeline => {\n const wasm = getWasmInstance()\n const id = wasm.pipeline_create()\n const schemas = new Map<number, z.ZodSchema>()\n\n return {\n id,\n\n shadowInit: (state) => {\n wasm.shadow_init(id, state)\n },\n\n shadowDump: () => JSON.parse(wasm.shadow_dump(id)) as unknown,\n\n processChanges: (changes) => {\n const result = wasm.process_changes(\n id,\n changesToWasm(changes) as never,\n ) as unknown as {\n state_changes: WasmChange[]\n validators_to_run?: ValidatorDispatch[]\n execution_plan?: FullExecutionPlan\n has_work?: boolean\n }\n\n const stateChanges = wasmChangesToJs(result.state_changes)\n return {\n state_changes: stateChanges,\n changes: stateChanges,\n validators_to_run: result.validators_to_run ?? [],\n execution_plan: result.execution_plan ?? null,\n has_work: result.has_work ?? false,\n }\n },\n\n pipelineFinalize: (jsChanges) => {\n const result = wasm.pipeline_finalize(\n id,\n changesToWasm(jsChanges) as never,\n ) as unknown as {\n state_changes: WasmChange[]\n }\n\n return {\n state_changes: wasmChangesToJs(result.state_changes),\n }\n },\n\n registerSideEffects: (reg) => {\n const resultJson = wasm.register_side_effects(\n id,\n JSON.stringify(reg),\n ) as unknown as {\n sync_changes: WasmChange[]\n aggregation_changes: WasmChange[]\n registered_listener_ids: number[]\n }\n return {\n sync_changes: wasmChangesToJs(resultJson.sync_changes),\n aggregation_changes: wasmChangesToJs(resultJson.aggregation_changes),\n registered_listener_ids: resultJson.registered_listener_ids,\n }\n },\n\n unregisterSideEffects: (registrationId) => {\n wasm.unregister_side_effects(id, registrationId)\n },\n\n registerConcerns: (reg) => {\n const resultJson = wasm.register_concerns(\n id,\n JSON.stringify(reg),\n ) as unknown as {\n bool_logic_changes: WasmChange[]\n registered_logic_ids: number[]\n registered_validator_ids: number[]\n value_logic_changes: WasmChange[]\n registered_value_logic_ids: number[]\n }\n return {\n bool_logic_changes: wasmChangesToJs(resultJson.bool_logic_changes),\n registered_logic_ids: resultJson.registered_logic_ids,\n registered_validator_ids: resultJson.registered_validator_ids,\n value_logic_changes: wasmChangesToJs(\n resultJson.value_logic_changes ?? [],\n ),\n registered_value_logic_ids: resultJson.registered_value_logic_ids ?? [],\n }\n },\n\n unregisterConcerns: (registrationId) => {\n wasm.unregister_concerns(id, registrationId)\n },\n\n registerBoolLogic: (outputPath, tree) =>\n wasm.register_boollogic(id, outputPath, JSON.stringify(tree)),\n\n unregisterBoolLogic: (logicId) => {\n wasm.unregister_boollogic(id, logicId)\n },\n\n pipelineReset: () => {\n wasm.pipeline_reset(id)\n },\n\n destroy: () => {\n wasm.pipeline_destroy(id)\n schemas.clear()\n },\n\n validatorSchemas: schemas,\n }\n}\n","/**\n * WASM Lifecycle — Loading, instance management, 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: `loadWasm()` called in `<Provider />` setup\n * - Tests: `loadWasm()` called in `beforeEach`\n *\n * @module wasm/lifecycle\n */\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 = (await import(\n /* @vite-ignore */\n '../../rust/pkg/apex_state_wasm.js'\n )) as unknown as typeof WasmExports & { default?: () => Promise<void> }\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<any, any>,\n initialState: object,\n): void => {\n const pipeline = createWasmPipeline()\n pipeline.shadowInit(initialState)\n internal.pipeline = pipeline\n}\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","import { useEffect, useMemo, useState } from 'react'\n\nimport { proxy, ref } from 'valtio'\n\nimport { StoreContext } from '../core/context'\nimport { DEFAULT_STORE_CONFIG } from '../core/defaults'\nimport { createPathGroups } from '../core/path-groups'\nimport type {\n DebugTrack,\n InternalState,\n ProviderProps,\n StoreConfig,\n StoreInstance,\n} from '../core/types'\nimport type { DeepRequired, GenericMeta } from '../types'\nimport { deepMerge } from '../utils/deep-merge'\nimport {\n attachComputedGetters,\n prepareInitialState,\n} from '../utils/derive-values'\nimport { createTiming } from '../utils/timing'\nimport { initPipeline, isWasmLoaded, loadWasm } from '../wasm/lifecycle'\n\nexport const createInternalState = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n>(\n config: DeepRequired<StoreConfig>,\n): InternalState<DATA, META> => ({\n graphs: {\n sync: createPathGroups('sync'),\n flip: createPathGroups('flip'),\n listeners: new Map(),\n sortedListenerPaths: [],\n listenerHandlers: new Map(),\n },\n registrations: {\n concerns: new Map(),\n effectCleanups: new Set(),\n sideEffectCleanups: new Map(),\n aggregations: new Map(),\n },\n processing: {\n queue: [],\n },\n timing: createTiming(config.debug),\n config,\n pipeline: null,\n})\n\nexport const createProvider = <\n DATA extends object,\n META extends GenericMeta = GenericMeta,\n>(\n storeConfig?: StoreConfig,\n) => {\n // Resolve config with defaults at factory time\n const resolvedConfig = deepMerge(DEFAULT_STORE_CONFIG, storeConfig)\n const isLegacy = resolvedConfig.useLegacyImplementation\n\n const Provider = ({\n initialState: rawInitialState,\n children,\n }: ProviderProps<DATA>) => {\n const [wasmReady, setWasmReady] = useState(isLegacy || isWasmLoaded())\n\n // Prepare getter-free initial state once (used by both useMemo and useEffect)\n const prepared = useMemo(\n () => prepareInitialState(rawInitialState),\n // Only initialize once - ignore changes to initialState after mount\n [],\n )\n\n const store = useMemo<StoreInstance<DATA, META>>(() => {\n const internal = createInternalState<DATA, META>(resolvedConfig)\n\n // CRITICAL: If WASM is already loaded, create pipeline and init shadow state\n // BEFORE proxy creation, so registration hooks can compute initial sync changes.\n // Each Provider gets its own isolated pipeline (no global reset needed).\n if (!isLegacy && isWasmLoaded()) {\n initPipeline(internal, prepared.initialState)\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 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: proxy({} as Record<string, Record<string, unknown>>),\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 // Load WASM asynchronously if not already loaded (production first-render path)\n useEffect(() => {\n if (isLegacy || isWasmLoaded()) return\n\n loadWasm()\n .then(() => {\n initPipeline(\n store._internal,\n prepared.initialState as Record<string, unknown>,\n )\n setWasmReady(true)\n })\n .catch((error) => {\n console.error('[apex-state] Failed to load WASM:', error)\n throw error\n })\n }, [])\n\n // Cleanup: destroy pipeline on unmount\n useEffect(() => {\n return () => {\n store._internal.pipeline?.destroy()\n store._internal.pipeline = null\n }\n }, [])\n\n // Block rendering until WASM is ready (if using WASM mode)\n if (!wasmReady) {\n return null\n }\n\n return (\n <StoreContext.Provider\n value={store as unknown as StoreInstance<any, GenericMeta>}\n >\n {children}\n </StoreContext.Provider>\n )\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 errorStorePath: '_errors',\n maxIterations: 100,\n debug: {\n timing: false,\n timingThreshold: 5,\n track: false,\n },\n useLegacyImplementation: false,\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 for (const key in source) {\n if (!Object.prototype.hasOwnProperty.call(source, key)) continue\n\n const sourceValue = source[key]\n const targetValue = target[key]\n\n if (is.undefined(sourceValue)) {\n continue\n }\n\n if (is.object(sourceValue) && is.object(targetValue)) {\n result[key] = deepMerge(\n targetValue,\n sourceValue as Partial<typeof targetValue>,\n ) as T[Extract<keyof T, string>]\n } else {\n result[key] = sourceValue as T[Extract<keyof T, string>]\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 const clonedBase = structuredClone(base) as T\n return { initialState: clonedBase, 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 * Debug Timing Utilities\n *\n * Provides timing measurement for concerns and listeners\n * to detect slow operations during development.\n */\n\ntype TimingType = 'concerns' | 'listeners' | 'registration'\n\ninterface TimingMeta {\n path: string\n name: string\n}\n\nexport interface TimingEvent extends TimingMeta {\n type: TimingType\n duration: number\n threshold: number\n}\n\nexport interface TimingSummary {\n type: TimingType\n totalDuration: number\n operationCount: number\n slowOperations: TimingEvent[]\n}\n\nexport type OnSlowOperation = (event: TimingEvent) => void\nexport type OnTimingSummary = (summary: TimingSummary) => void\n\nconst defaultOnSlowOperation: OnSlowOperation = (event) => {\n console.warn(\n `[apex-state] Slow ${event.type}: ${event.path}/${event.name} took ${event.duration.toFixed(2)}ms (threshold: ${event.threshold}ms)`,\n )\n}\n\nconst defaultOnTimingSummary: OnTimingSummary = (summary) => {\n if (summary.slowOperations.length > 0 || summary.totalDuration > 16) {\n console.warn(\n `[apex-state] ${summary.type}: ${summary.operationCount} ops in ${summary.totalDuration.toFixed(2)}ms (${summary.slowOperations.length} slow)`,\n )\n }\n}\n\nexport interface Timing {\n run: <T>(type: TimingType, fn: () => T, meta: TimingMeta) => T\n reportBatch: (type: TimingType) => void\n}\n\ninterface TimingConfig {\n timing: boolean\n timingThreshold: number\n onSlowOperation?: OnSlowOperation\n onSummary?: OnTimingSummary\n}\n\ninterface TypeState {\n totalDuration: number\n operationCount: number\n slowOperations: TimingEvent[]\n warnedOperations: Set<string>\n}\n\nconst createTypeState = (): TypeState => ({\n totalDuration: 0,\n operationCount: 0,\n slowOperations: [],\n warnedOperations: new Set(),\n})\n\n/**\n * Create a timing instance for the store.\n * If timing is disabled, all methods are no-ops.\n */\nexport const createTiming = (options: TimingConfig): Timing => {\n const {\n timing,\n timingThreshold,\n onSlowOperation = defaultOnSlowOperation,\n onSummary = defaultOnTimingSummary,\n } = options\n\n // Disabled: no-op implementation\n if (!timing) {\n return {\n run: (_type, fn) => fn(),\n reportBatch: () => {\n // Do nothing\n },\n }\n }\n\n const state: Record<TimingType, TypeState> = {\n concerns: createTypeState(),\n listeners: createTypeState(),\n registration: createTypeState(),\n }\n\n return {\n run: <T>(type: TimingType, fn: () => T, meta: TimingMeta): T => {\n const start = performance.now()\n const result = fn()\n const duration = performance.now() - start\n\n const typeState = state[type]\n typeState.totalDuration += duration\n typeState.operationCount++\n\n if (duration > timingThreshold) {\n const event: TimingEvent = {\n ...meta,\n type,\n duration,\n threshold: timingThreshold,\n }\n typeState.slowOperations.push(event)\n\n const key = `${type}:${meta.path}:${meta.name}`\n if (!typeState.warnedOperations.has(key)) {\n typeState.warnedOperations.add(key)\n onSlowOperation(event)\n }\n }\n\n return result\n },\n\n reportBatch: (type: TimingType) => {\n const typeState = state[type]\n onSummary({\n type,\n totalDuration: typeState.totalDuration,\n operationCount: typeState.operationCount,\n slowOperations: typeState.slowOperations,\n })\n\n // Reset batch counters but keep warned set to avoid spam\n typeState.totalDuration = 0\n typeState.operationCount = 0\n typeState.slowOperations = []\n },\n }\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 type { ArrayOfChanges } from '../types'\nimport { dot } from './dot'\n\n/**\n * Applies changes to an object, returning a new object with changes applied.\n * Does not mutate the original object.\n *\n * @param obj - Source object\n * @param changes - Array of [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 changes: ArrayOfChanges<typeof state> = [\n * ['user.name', 'Bob', {}],\n * ['user.age', 31, {}],\n * ]\n *\n * const newState = applyChangesToObject(state, changes)\n * // newState: { user: { name: 'Bob', age: 31 } }\n * // state is unchanged\n * ```\n */\nexport const applyChangesToObject = <T extends object>(\n obj: T,\n changes: ArrayOfChanges<T>,\n): T => {\n // Deep clone the object\n const result = structuredClone(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":["_","ptr","init_apex_state_wasm_bg","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","snapshot","effect","effect","registerConcernEffectsImpl","registerConcernEffects","set","snapshot","snapshot","effect","effect","nextSubscriberId","registerSideEffects","nextSubscriberId","wasm","loadWasm","computed","loadWasm","loadWasm","processChanges","snapshot","registerSideEffects","registerConcernEffects","useCallback","useState","useCallback","useCallback","useEffect","useRef","ref","useCallback","useMemo"]}
|