@lehnihon/bit-form 2.2.6 → 2.2.7

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.
Files changed (121) hide show
  1. package/README.md +80 -24
  2. package/dist/angular/index.cjs +1 -1
  3. package/dist/angular/index.cjs.map +1 -1
  4. package/dist/angular/index.d.cts +18 -20
  5. package/dist/angular/index.d.ts +18 -20
  6. package/dist/angular/index.js +1 -1
  7. package/dist/angular/index.js.map +1 -1
  8. package/dist/array-controller-C1A5VKYd.d.cts +23 -0
  9. package/dist/array-controller-DtkmcnUr.d.ts +23 -0
  10. package/dist/{bus-B4zZmB9C.d.ts → bus-DgilLszS.d.ts} +83 -15
  11. package/dist/{bus-BeAeZwWu.d.cts → bus-rcUiufS7.d.cts} +83 -15
  12. package/dist/chunk-DIEE6LUO.js +2 -0
  13. package/dist/chunk-DIEE6LUO.js.map +1 -0
  14. package/dist/chunk-FUUQB4DV.cjs +2 -0
  15. package/dist/chunk-FUUQB4DV.cjs.map +1 -0
  16. package/dist/chunk-IV32WXCF.cjs +2 -0
  17. package/dist/chunk-IV32WXCF.cjs.map +1 -0
  18. package/dist/chunk-K5X37E3U.js +2 -0
  19. package/dist/chunk-K5X37E3U.js.map +1 -0
  20. package/dist/chunk-KWLLYQOL.cjs +2 -0
  21. package/dist/chunk-KWLLYQOL.cjs.map +1 -0
  22. package/dist/chunk-LIYZPSWM.js +2 -0
  23. package/dist/chunk-LIYZPSWM.js.map +1 -0
  24. package/dist/chunk-O5UPA33R.js +2 -0
  25. package/dist/chunk-O5UPA33R.js.map +1 -0
  26. package/dist/chunk-QAL6J5GQ.cjs +2 -0
  27. package/dist/chunk-QAL6J5GQ.cjs.map +1 -0
  28. package/dist/chunk-QKGTVKBU.cjs +2 -0
  29. package/dist/chunk-QKGTVKBU.cjs.map +1 -0
  30. package/dist/chunk-SA47B5OP.js +2 -0
  31. package/dist/chunk-SA47B5OP.js.map +1 -0
  32. package/dist/cli/index.cjs +22 -22
  33. package/dist/core.cjs +2 -0
  34. package/dist/core.cjs.map +1 -0
  35. package/dist/core.d.cts +122 -0
  36. package/dist/core.d.ts +122 -0
  37. package/dist/core.js +2 -0
  38. package/dist/core.js.map +1 -0
  39. package/dist/devtools/bridge.cjs +1 -1
  40. package/dist/devtools/bridge.cjs.map +1 -1
  41. package/dist/devtools/bridge.d.cts +4 -1
  42. package/dist/devtools/bridge.d.ts +4 -1
  43. package/dist/devtools/bridge.js +1 -1
  44. package/dist/devtools/bridge.js.map +1 -1
  45. package/dist/devtools/index.cjs +18 -18
  46. package/dist/devtools/index.cjs.map +1 -1
  47. package/dist/devtools/index.d.cts +26 -2
  48. package/dist/devtools/index.d.ts +26 -2
  49. package/dist/devtools/index.js +18 -18
  50. package/dist/devtools/index.js.map +1 -1
  51. package/dist/devtools/protocol.cjs +2 -0
  52. package/dist/devtools/protocol.cjs.map +1 -0
  53. package/dist/devtools/protocol.d.cts +54 -0
  54. package/dist/devtools/protocol.d.ts +54 -0
  55. package/dist/devtools/protocol.js +2 -0
  56. package/dist/devtools/protocol.js.map +1 -0
  57. package/dist/field-binding-Bi1g-D8X.d.ts +25 -0
  58. package/dist/field-binding-X5TkvfUt.d.cts +25 -0
  59. package/dist/index.cjs +1 -1
  60. package/dist/index.cjs.map +1 -1
  61. package/dist/index.d.cts +64 -171
  62. package/dist/index.d.ts +64 -171
  63. package/dist/index.js +1 -1
  64. package/dist/mask.d.cts +2 -2
  65. package/dist/mask.d.ts +2 -2
  66. package/dist/react/index.cjs +1 -1
  67. package/dist/react/index.cjs.map +1 -1
  68. package/dist/react/index.d.cts +8 -7
  69. package/dist/react/index.d.ts +8 -7
  70. package/dist/react/index.js +1 -1
  71. package/dist/react/index.js.map +1 -1
  72. package/dist/react-native/index.cjs +1 -1
  73. package/dist/react-native/index.cjs.map +1 -1
  74. package/dist/react-native/index.d.cts +7 -6
  75. package/dist/react-native/index.d.ts +7 -6
  76. package/dist/react-native/index.js +1 -1
  77. package/dist/react-native/index.js.map +1 -1
  78. package/dist/resolvers/index.cjs +1 -1
  79. package/dist/resolvers/index.cjs.map +1 -1
  80. package/dist/resolvers/index.d.cts +2 -2
  81. package/dist/resolvers/index.d.ts +2 -2
  82. package/dist/resolvers/index.js +1 -1
  83. package/dist/resolvers/joi.d.cts +2 -2
  84. package/dist/resolvers/joi.d.ts +2 -2
  85. package/dist/resolvers/yup.d.cts +2 -2
  86. package/dist/resolvers/yup.d.ts +2 -2
  87. package/dist/resolvers/zod.d.cts +2 -2
  88. package/dist/resolvers/zod.d.ts +2 -2
  89. package/dist/store-api-types-9ipdute1.d.ts +187 -0
  90. package/dist/store-api-types-B6_bPoVI.d.cts +187 -0
  91. package/dist/{types-D8DgIUhJ.d.cts → types-CUXh7PqD.d.cts} +1 -1
  92. package/dist/{types-D8DgIUhJ.d.ts → types-CUXh7PqD.d.ts} +1 -1
  93. package/dist/{use-bit-persist-Dk3fUrds.d.ts → use-bit-persist-Bc06fmqZ.d.ts} +12 -14
  94. package/dist/{use-bit-persist-D_gimC9A.d.cts → use-bit-persist-CIKFwtdM.d.cts} +12 -14
  95. package/dist/vue/index.cjs +1 -1
  96. package/dist/vue/index.cjs.map +1 -1
  97. package/dist/vue/index.d.cts +15 -18
  98. package/dist/vue/index.d.ts +15 -18
  99. package/dist/vue/index.js +1 -1
  100. package/dist/vue/index.js.map +1 -1
  101. package/package.json +20 -11
  102. package/dist/chunk-2CVKNPWX.js +0 -2
  103. package/dist/chunk-2CVKNPWX.js.map +0 -1
  104. package/dist/chunk-3EDD3V43.cjs +0 -2
  105. package/dist/chunk-3EDD3V43.cjs.map +0 -1
  106. package/dist/chunk-PX6WKENM.js +0 -2
  107. package/dist/chunk-PX6WKENM.js.map +0 -1
  108. package/dist/chunk-QWH2NBVB.js +0 -2
  109. package/dist/chunk-QWH2NBVB.js.map +0 -1
  110. package/dist/chunk-T3FR7D5V.js +0 -2
  111. package/dist/chunk-T3FR7D5V.js.map +0 -1
  112. package/dist/chunk-VQ7MK5VB.cjs +0 -2
  113. package/dist/chunk-VQ7MK5VB.cjs.map +0 -1
  114. package/dist/chunk-Y2ONHDRE.cjs +0 -2
  115. package/dist/chunk-Y2ONHDRE.cjs.map +0 -1
  116. package/dist/chunk-YCSWULEN.cjs +0 -2
  117. package/dist/chunk-YCSWULEN.cjs.map +0 -1
  118. package/dist/field-binding-BXw0Ku2c.d.cts +0 -12
  119. package/dist/field-binding-BXw0Ku2c.d.ts +0 -12
  120. package/dist/public-types-Cd9ai20P.d.cts +0 -97
  121. package/dist/public-types-DdZxD6Op.d.ts +0 -97
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/utils/clone.ts","../src/core/utils.ts","../src/core/store/engines/store-field-query-engine.ts","../src/core/store/engines/operation-engine.ts","../src/core/store/managers/core/computed-manager.ts","../src/core/store/managers/core/dirty-manager.ts","../src/core/store/managers/features/mask-manager.ts","../src/core/store/registry/field-catalog.ts","../src/core/store/registry/field-conditions.ts","../src/core/store/registry/field-registry.ts","../src/core/store/shared/config.ts","../src/core/store/managers/features/persist-manager.ts","../src/core/store/managers/features/plugin-manager.ts","../src/core/store/engines/effect-engine.ts","../src/core/store/shared/pipeline.ts","../src/core/store/shared/error-map.ts","../src/core/store/managers/features/validation/validation-stages.ts","../src/core/store/managers/features/validation/async-validation-scheduler.ts","../src/core/store/managers/features/validation/validation-debouncer.ts","../src/core/store/managers/features/validation-manager.ts","../src/core/store/managers/features/lifecycle/field-update-manager.ts","../src/core/store/managers/features/lifecycle/values-lifecycle-manager.ts","../src/core/store/managers/features/lifecycle/submit-lifecycle-manager.ts","../src/core/store/managers/features/lifecycle-manager.ts","../src/core/store/engines/snapshot-diff-engine.ts","../src/core/store/managers/features/history-manager.ts","../src/core/store/managers/features/array-manager.ts","../src/core/store/managers/features/scope-manager.ts","../src/core/store/managers/features/field-query-manager.ts","../src/core/store/managers/features/error-manager.ts","../src/core/store/shared/bus.ts","../src/core/store/orchestration/store-bootstrap.ts","../src/core/store/orchestration/store-persist-ops.ts","../src/core/store/orchestration/store-feature-ops.ts","../src/core/store/orchestration/hook-brand.ts","../src/core/store/engines/store-field-cleanup-engine.ts","../src/core/store/orchestration/store-registration-ops.ts","../src/core/store/orchestration/tracked-selector.ts","../src/core/history-status.ts","../src/core/scope-status.ts","../src/core/store/orchestration/store-observe-ops.ts","../src/core/store/engines/subscription-engine.ts","../src/core/store/orchestration/capability-ports.ts","../src/core/store/orchestration/store-runtime.ts","../src/core/store/engines/store-batch-engine.ts","../src/core/store/engines/state-update-engine.ts","../src/core/store/engines/store-commit-engine.ts","../src/core/store/orchestration/store-state-ops.ts","../src/core/store/orchestration/store-runtime-kernel.ts","../src/core/store/index.ts","../src/core/store/orchestration/create-store.ts","../src/core/utils/field-state-snapshot.ts","../src/core/bindings/form-meta.ts","../src/core/bindings/persist-meta.ts","../src/core/submit-handler.ts","../src/core/form-controller.ts","../src/core/bindings/form-binding.ts","../src/core/field-controller.ts","../src/core/bindings/field-binding.ts","../src/core/bindings/array-controller.ts","../src/core/bindings/framework-cleanup.ts","../src/core/utils/field-meta.ts"],"sourcesContent":["export function cloneValue<T>(obj: T): T {\n if (obj === null || typeof obj !== \"object\") {\n return obj;\n }\n\n if (typeof structuredClone === \"function\") {\n return structuredClone(obj);\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as any as T;\n }\n\n if (obj instanceof RegExp) {\n return new RegExp(obj.source, obj.flags) as any as T;\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => cloneValue(item)) as any as T;\n }\n\n const clone: any = {};\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n clone[key] = cloneValue((obj as any)[key]);\n }\n }\n\n return clone as T;\n}\n","import { cloneValue } from \"./utils/clone\";\n\nexport function deepClone<T>(obj: T): T {\n return cloneValue(obj);\n}\n\nexport function deepMerge<T>(target: T, source: any): T {\n if (source === undefined) {\n return deepClone(target);\n }\n\n if (\n source === null ||\n typeof source !== \"object\" ||\n source instanceof Date ||\n source instanceof RegExp ||\n Array.isArray(source)\n ) {\n return deepClone(source as T);\n }\n\n const base =\n target && typeof target === \"object\" && !Array.isArray(target)\n ? deepClone(target as any)\n : ({} as Record<string, unknown>);\n\n for (const key of Object.keys(source)) {\n const sourceValue = source[key];\n const baseValue = (base as Record<string, unknown>)[key];\n\n if (\n sourceValue !== null &&\n typeof sourceValue === \"object\" &&\n !Array.isArray(sourceValue) &&\n !(sourceValue instanceof Date) &&\n !(sourceValue instanceof RegExp)\n ) {\n (base as Record<string, unknown>)[key] = deepMerge(\n baseValue,\n sourceValue,\n );\n continue;\n }\n\n (base as Record<string, unknown>)[key] = deepClone(sourceValue);\n }\n\n return base as T;\n}\n\n/**\n * Fast equality for single values. Uses === for primitives, deepEqual for objects/arrays.\n * Prefer over deepEqual when comparing a single field value (e.g. isFieldDirty, getStepStatus).\n */\nexport function valueEqual(a: any, b: any): boolean {\n if (a === b) return true;\n if (\n a === null ||\n typeof a !== \"object\" ||\n b === null ||\n typeof b !== \"object\"\n ) {\n return false;\n }\n return deepEqual(a, b);\n}\n\nexport function deepEqual(a: any, b: any): boolean {\n if (a === b) return true;\n if (\n a === null ||\n typeof a !== \"object\" ||\n b === null ||\n typeof b !== \"object\"\n ) {\n return false;\n }\n\n if (a instanceof Date && b instanceof Date)\n return a.getTime() === b.getTime();\n if (a instanceof RegExp && b instanceof RegExp)\n return a.toString() === b.toString();\n\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 (\n !Object.prototype.hasOwnProperty.call(b, key) ||\n !deepEqual(a[key], b[key])\n ) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Collects all paths where obj differs from initial. Used to rebuild dirtyPaths after full state replacement.\n */\nexport function collectDirtyPaths(\n obj: any,\n initial: any,\n prefix = \"\",\n result: Set<string> = new Set(),\n): Set<string> {\n if (valueEqual(obj, initial)) return result;\n if (\n obj === null ||\n typeof obj !== \"object\" ||\n initial === null ||\n typeof initial !== \"object\"\n ) {\n if (prefix) result.add(prefix);\n return result;\n }\n if (Array.isArray(obj) || Array.isArray(initial)) {\n if (!valueEqual(obj, initial) && prefix) result.add(prefix);\n return result;\n }\n const allKeys = new Set<string>();\n for (const key of Object.keys(obj || {})) {\n allKeys.add(key);\n }\n for (const key of Object.keys(initial || {})) {\n allKeys.add(key);\n }\n for (const k of allKeys) {\n const p = prefix ? `${prefix}.${k}` : k;\n collectDirtyPaths((obj as any)?.[k], (initial as any)?.[k], p, result);\n }\n return result;\n}\n\n/**\n * Path keys cache configuration\n *\n * Caching the split path strings prevents repeated string splitting operations.\n * This is especially important in hotspots like setField(), getDeepValue(), and\n * field change detection where the same paths are accessed repeatedly.\n *\n * Cache size: 5000 entries\n * When cache reaches capacity, it's cleared (rotational eviction strategy)\n * Typical hit rate: >80% in most forms with 100-1000 fields\n */\nconst PATH_CACHE_MAX = 5000;\nconst pathCache = new Map<string, string[]>();\n\nfunction setPathCacheEntry(path: string, keys: string[]) {\n if (pathCache.has(path)) {\n pathCache.delete(path);\n } else if (pathCache.size >= PATH_CACHE_MAX) {\n const oldestKey = pathCache.keys().next().value;\n if (oldestKey !== undefined) {\n pathCache.delete(oldestKey);\n }\n }\n\n pathCache.set(path, keys);\n}\n\nfunction getPathKeys(path: string): string[] {\n const cached = pathCache.get(path);\n if (cached) {\n return cached;\n }\n\n const keys = path.split(\".\");\n setPathCacheEntry(path, keys);\n return keys;\n}\n\nexport function getDeepValue(obj: any, path: string): any {\n if (!path) return obj;\n\n const keys = getPathKeys(path);\n\n let current = obj;\n for (const key of keys) {\n if (current === null || current === undefined) return undefined;\n current = current[key];\n }\n return current;\n}\n\nexport function setDeepValue(obj: any, path: string, value: any): any {\n if (!path) return value;\n\n const keys = getPathKeys(path);\n\n const result = Array.isArray(obj) ? [...obj] : { ...obj };\n let current = result;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n const nextKey = keys[i + 1];\n\n const nextAsNumber = Number(nextKey);\n const isNextNumeric =\n Number.isInteger(nextAsNumber) && String(nextAsNumber) === nextKey;\n const currentValue = current[key];\n\n if (currentValue === null || currentValue === undefined) {\n current[key] = isNextNumeric ? [] : {};\n } else {\n current[key] = Array.isArray(currentValue)\n ? [...currentValue]\n : { ...currentValue };\n }\n\n current = current[key];\n }\n\n current[keys[keys.length - 1]] = value;\n\n return result;\n}\n\nexport function setDeepValues(\n obj: any,\n updates: ReadonlyArray<readonly [path: string, value: any]>,\n): any {\n if (updates.length === 0) {\n return obj;\n }\n\n const root = Array.isArray(obj) ? [...obj] : { ...obj };\n const clonedNodes = new WeakSet<object>();\n if (root && typeof root === \"object\") {\n clonedNodes.add(root);\n }\n\n for (const [path, value] of updates) {\n const keys = getPathKeys(path);\n let current: any = root;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n const nextKey = keys[i + 1];\n\n const nextAsNumber = Number(nextKey);\n const isNextNumeric =\n Number.isInteger(nextAsNumber) && String(nextAsNumber) === nextKey;\n\n const currentValue = current[key];\n\n if (currentValue === null || currentValue === undefined) {\n current[key] = isNextNumeric ? [] : {};\n clonedNodes.add(current[key]);\n } else if (typeof currentValue === \"object\") {\n if (!clonedNodes.has(currentValue)) {\n current[key] = Array.isArray(currentValue)\n ? [...currentValue]\n : { ...currentValue };\n clonedNodes.add(current[key]);\n }\n } else {\n current[key] = isNextNumeric ? [] : {};\n clonedNodes.add(current[key]);\n }\n\n current = current[key];\n }\n\n current[keys[keys.length - 1]] = value;\n }\n\n return root;\n}\n\nexport function unsetDeepValue(obj: any, path: string): any {\n if (!path) {\n return Array.isArray(obj) ? [] : {};\n }\n\n const keys = getPathKeys(path);\n const root = Array.isArray(obj) ? [...obj] : { ...obj };\n let current: any = root;\n\n for (let i = 0; i < keys.length - 1; i++) {\n const key = keys[i];\n const currentValue = current?.[key];\n\n if (currentValue === null || currentValue === undefined) {\n return root;\n }\n\n current[key] = Array.isArray(currentValue)\n ? [...currentValue]\n : { ...currentValue };\n\n current = current[key];\n }\n\n const leafKey = keys[keys.length - 1];\n\n if (Array.isArray(current)) {\n current.splice(Number(leafKey), 1);\n } else if (current && typeof current === \"object\") {\n delete current[leafKey];\n }\n\n return root;\n}\n\nexport function cleanPrefixedKeys(\n obj: Record<string, any>,\n prefix: string,\n): Record<string, any> {\n const newObj: Record<string, any> = {};\n const prefixWithDot = `${prefix}.`;\n\n for (const key in obj) {\n if (key !== prefix && !key.startsWith(prefixWithDot)) {\n newObj[key] = obj[key];\n }\n }\n return newObj;\n}\n\nexport const shiftKeys = (\n obj: Record<string, any>,\n path: string,\n removedIndex: number,\n) => {\n return reindexObjectKeys(obj, path, (currentIdx) => {\n if (currentIdx === removedIndex) {\n return null;\n }\n\n return currentIdx > removedIndex ? currentIdx - 1 : currentIdx;\n });\n};\n\nexport const swapKeys = (\n obj: Record<string, any>,\n path: string,\n indexA: number,\n indexB: number,\n) => {\n return reindexObjectKeys(obj, path, (currentIdx) => {\n if (currentIdx === indexA) {\n return indexB;\n }\n\n if (currentIdx === indexB) {\n return indexA;\n }\n\n return currentIdx;\n });\n};\n\nexport const moveKeys = (\n obj: Record<string, any>,\n path: string,\n from: number,\n to: number,\n) => {\n return reindexObjectKeys(obj, path, (currentIdx) => {\n if (currentIdx === from) {\n return to;\n }\n\n if (from < to && currentIdx > from && currentIdx <= to) {\n return currentIdx - 1;\n }\n\n if (from > to && currentIdx >= to && currentIdx < from) {\n return currentIdx + 1;\n }\n\n return currentIdx;\n });\n};\n\nexport function reindexFieldArrayMeta(\n state: {\n errors: Record<string, any>;\n touched: Record<string, any>;\n isValidating: Record<string, any>;\n },\n path: string,\n remapIndex: (index: number) => number | null,\n) {\n const nextErrors: Record<string, any> = {};\n const nextTouched: Record<string, any> = {};\n const nextIsValidating: Record<string, any> = {};\n\n const prefix = `${path}.`;\n\n // Iterate each dictionary directly to avoid building a union Set of all keys.\n for (const key of Object.keys(state.errors)) {\n const nextKey = remapIndexedPath(key, prefix, remapIndex);\n if (nextKey) nextErrors[nextKey] = state.errors[key];\n }\n\n for (const key of Object.keys(state.touched)) {\n const nextKey = remapIndexedPath(key, prefix, remapIndex);\n if (nextKey) nextTouched[nextKey] = state.touched[key];\n }\n\n for (const key of Object.keys(state.isValidating)) {\n const nextKey = remapIndexedPath(key, prefix, remapIndex);\n if (nextKey) nextIsValidating[nextKey] = state.isValidating[key];\n }\n\n return {\n errors: nextErrors,\n touched: nextTouched,\n isValidating: nextIsValidating,\n };\n}\n\nfunction remapIndexedPath(\n key: string,\n prefix: string,\n remapIndex: (index: number) => number | null,\n) {\n if (!key.startsWith(prefix)) {\n return key;\n }\n\n const remaining = key.substring(prefix.length);\n const parts = remaining.split(\".\");\n const currentIdx = parseInt(parts[0], 10);\n const nextIdx = remapIndex(currentIdx);\n\n if (nextIdx === null) {\n return null;\n }\n\n const rest = parts.slice(1).join(\".\");\n return rest ? `${prefix}${nextIdx}.${rest}` : `${prefix}${nextIdx}`;\n}\n\nfunction reindexObjectKeys(\n obj: Record<string, any>,\n path: string,\n remapIndex: (index: number) => number | null,\n) {\n const nextObject: Record<string, any> = {};\n const prefix = `${path}.`;\n\n for (const key of Object.keys(obj)) {\n if (!key.startsWith(prefix)) {\n nextObject[key] = obj[key];\n continue;\n }\n\n const remaining = key.substring(prefix.length);\n const parts = remaining.split(\".\");\n const currentIdx = parseInt(parts[0], 10);\n const nextIdx = remapIndex(currentIdx);\n\n if (nextIdx === null) {\n continue;\n }\n\n const rest = parts.slice(1).join(\".\");\n const nextKey = rest\n ? `${prefix}${nextIdx}.${rest}`\n : `${prefix}${nextIdx}`;\n nextObject[nextKey] = obj[key];\n }\n\n return nextObject;\n}\n\n/**\n * Checks if a value looks like a server validation error response.\n * Handles shapes like { email: \"Taken\" }, { errors: { email: [\"Taken\"] } }, etc.\n */\nexport function isValidationErrorShape(\n x: unknown,\n): x is Record<string, string | string[]> {\n if (typeof x !== \"object\" || x === null || Array.isArray(x)) return false;\n\n const obj = (x as Record<string, unknown>).errors ?? x;\n if (typeof obj !== \"object\" || obj === null || Array.isArray(obj))\n return false;\n\n return Object.values(obj as Record<string, unknown>).every(\n (v) =>\n typeof v === \"string\" ||\n (Array.isArray(v) && v.every((i) => typeof i === \"string\")),\n );\n}\n\n/**\n * Extracts server errors in the format expected by setServerErrors.\n */\nexport function extractServerErrors(\n x: unknown,\n): Record<string, string | string[]> {\n if (!isValidationErrorShape(x)) return {};\n\n const obj = (x as Record<string, unknown>).errors ?? x;\n return obj as Record<string, string | string[]>;\n}\n","import type { BitMask, BitMaskName } from \"../../mask/types\";\nimport type {\n BitErrors,\n BitFieldDefinition,\n BitFieldState,\n BitPath,\n BitPathValue,\n BitState,\n} from \"../contracts/types\";\n\nexport function resolveFieldMask<T extends object>(args: {\n path: string;\n getFieldConfig: (path: string) => BitFieldDefinition<T> | undefined;\n masks: Record<BitMaskName, BitMask> | undefined;\n}): BitMask | undefined {\n const { path, getFieldConfig, masks } = args;\n const maskOption = getFieldConfig(path)?.mask;\n\n if (!maskOption) {\n return undefined;\n }\n\n if (typeof maskOption === \"string\") {\n return masks?.[maskOption as keyof typeof masks];\n }\n\n return maskOption;\n}\n\nexport function createFieldStateSnapshot<\n TForm extends object,\n P extends BitPath<TForm>,\n>(args: {\n state: Readonly<BitState<TForm>>;\n path: P;\n value: BitPathValue<TForm, P>;\n isHidden: boolean;\n isRequired: boolean;\n isDirty: boolean;\n isValidating: boolean;\n}): BitFieldState<TForm, BitPathValue<TForm, P>> {\n const { state, path, value, isHidden, isRequired, isDirty, isValidating } =\n args;\n const pathKey = path as string;\n\n return {\n value,\n error: state.errors[pathKey as keyof BitErrors<TForm>],\n touched: !!state.touched[pathKey as keyof typeof state.touched],\n isHidden,\n isRequired,\n isDirty,\n isValidating,\n };\n}\n","import type { BitErrors, BitState } from \"../contracts/types\";\n\nexport interface BitStatePatchOperation<T extends object> {\n kind: \"state.patch\";\n partialState: Partial<BitState<T>>;\n changedPaths?: string[];\n skipComputed?: boolean;\n}\n\nexport interface BitTouchFieldsOperation<T extends object> {\n kind: \"field.touchMany\";\n paths: string[];\n}\n\nexport interface BitPersistMetaOperation<T extends object> {\n kind: \"form.persistMeta\";\n patch: Partial<BitState<T>[\"persist\"]>;\n}\n\nexport interface BitHistoryApplyOperation<T extends object> {\n kind: \"history.apply\";\n values: T;\n isDirty: boolean;\n}\n\nexport interface BitValidationCommitOperation<T extends object> {\n kind: \"validation.commit\";\n errors: BitErrors<T>;\n isValid: boolean;\n}\n\nexport type BitStoreOperation<T extends object> =\n | BitStatePatchOperation<T>\n | BitTouchFieldsOperation<T>\n | BitPersistMetaOperation<T>\n | BitHistoryApplyOperation<T>\n | BitValidationCommitOperation<T>;\n\nexport function patchStateOperation<T extends object>(\n partialState: Partial<BitState<T>>,\n changedPaths?: string[],\n options?: { skipComputed?: boolean },\n): BitStatePatchOperation<T> {\n return {\n kind: \"state.patch\",\n partialState,\n changedPaths,\n skipComputed: options?.skipComputed,\n };\n}\n\nexport function touchFieldsOperation<T extends object>(\n paths: string[],\n): BitTouchFieldsOperation<T> {\n return {\n kind: \"field.touchMany\",\n paths,\n };\n}\n\nexport function persistMetaOperation<T extends object>(\n patch: Partial<BitState<T>[\"persist\"]>,\n): BitPersistMetaOperation<T> {\n return {\n kind: \"form.persistMeta\",\n patch,\n };\n}\n\nexport function historyApplyOperation<T extends object>(\n values: T,\n isDirty: boolean,\n): BitHistoryApplyOperation<T> {\n return {\n kind: \"history.apply\",\n values,\n isDirty,\n };\n}\n\nexport function validationCommitOperation<T extends object>(\n errors: BitErrors<T>,\n isValid: boolean,\n): BitValidationCommitOperation<T> {\n return {\n kind: \"validation.commit\",\n errors,\n isValid,\n };\n}\n","import { getDeepValue, setDeepValue, deepEqual } from \"../../../utils\";\nimport type { BitComputedFn } from \"../../contracts/types\";\n\nexport interface BitComputedEntry<T extends object> {\n path: string;\n compute: BitComputedFn<T>;\n dependsOn: readonly string[];\n}\n\nexport class BitComputedManager<T extends object> {\n private equalityCache = new Map<\n string,\n { current: unknown; next: unknown; equal: boolean }\n >();\n private reverseDepsCache: Map<string, Set<string>> | null = null;\n private childDepsIndex: Map<string, Set<string>> | null = null;\n private validatedEntriesSignature: string | null = null;\n private orderedAllEntriesCache: {\n signature: string;\n ordered: BitComputedEntry<T>[];\n } | null = null;\n\n constructor(private getComputedEntries: () => BitComputedEntry<T>[]) {}\n\n invalidateReverseDeps(): void {\n this.reverseDepsCache = null;\n this.childDepsIndex = null;\n this.orderedAllEntriesCache = null;\n this.equalityCache.clear();\n }\n\n apply(values: T, changedPaths?: readonly string[]): T {\n const computedEntries = this.getComputedEntries();\n if (computedEntries.length === 0) return values;\n\n this.ensureEntriesAreValid(computedEntries);\n\n const entriesToRun = this.resolveEntriesToRun(\n computedEntries,\n changedPaths,\n );\n\n if (entriesToRun.length === 0) {\n return values;\n }\n\n let nextValues = values;\n\n for (const entry of entriesToRun) {\n const newValue = entry.compute(nextValues);\n const currentValue = getDeepValue(nextValues, entry.path);\n\n const cached = this.equalityCache.get(entry.path);\n let valuesEqual: boolean;\n\n if (\n cached &&\n cached.current === currentValue &&\n cached.next === newValue\n ) {\n valuesEqual = cached.equal;\n } else {\n valuesEqual = deepEqual(currentValue, newValue);\n this.equalityCache.set(entry.path, {\n current: currentValue,\n next: newValue,\n equal: valuesEqual,\n });\n }\n\n if (!valuesEqual) {\n nextValues = setDeepValue(nextValues, entry.path, newValue);\n }\n }\n return nextValues;\n }\n\n private getReverseDependencies(\n entries: BitComputedEntry<T>[],\n ): Map<string, Set<string>> {\n if (this.reverseDepsCache) return this.reverseDepsCache;\n\n const map = new Map<string, Set<string>>();\n\n for (const entry of entries) {\n for (const dep of entry.dependsOn) {\n let dependents = map.get(dep);\n if (!dependents) {\n dependents = new Set();\n map.set(dep, dependents);\n }\n dependents.add(entry.path);\n }\n }\n\n const childIdx = new Map<string, Set<string>>();\n\n for (const dep of map.keys()) {\n const segments = dep.split(\".\");\n for (let len = 1; len < segments.length; len++) {\n const prefix = segments.slice(0, len).join(\".\");\n let children = childIdx.get(prefix);\n if (!children) {\n children = new Set();\n childIdx.set(prefix, children);\n }\n children.add(dep);\n }\n }\n\n this.reverseDepsCache = map;\n this.childDepsIndex = childIdx;\n return map;\n }\n\n private resolveEntriesToRun(\n entries: BitComputedEntry<T>[],\n changedPaths?: readonly string[],\n ): BitComputedEntry<T>[] {\n if (\n !changedPaths ||\n changedPaths.length === 0 ||\n changedPaths.includes(\"*\")\n ) {\n return this.getOrderedAllEntries(entries);\n }\n\n const reverseDependencies = this.getReverseDependencies(entries);\n const affectedPaths = new Set<string>();\n const queue = [...changedPaths];\n\n while (queue.length > 0) {\n const currentPath = queue.shift()!;\n const dependents = this.getDependentsForPath(\n reverseDependencies,\n currentPath,\n );\n\n if (!dependents) {\n continue;\n }\n\n for (const dependentPath of dependents) {\n if (affectedPaths.has(dependentPath)) {\n continue;\n }\n\n affectedPaths.add(dependentPath);\n queue.push(dependentPath);\n }\n }\n\n if (affectedPaths.size === 0) {\n return [];\n }\n\n return this.orderEntries(\n entries.filter((entry) => affectedPaths.has(entry.path)),\n );\n }\n\n private orderEntries(entries: BitComputedEntry<T>[]) {\n if (entries.length <= 1) {\n return entries;\n }\n\n const entryByPath = new Map(entries.map((entry) => [entry.path, entry]));\n const inDegree = new Map<string, number>();\n const dependents = new Map<string, Set<string>>();\n\n entries.forEach((entry) => inDegree.set(entry.path, 0));\n\n entries.forEach((entry) => {\n entry.dependsOn.forEach((dependencyPath) => {\n if (!entryByPath.has(dependencyPath)) {\n return;\n }\n\n const nextDependents = dependents.get(dependencyPath) ?? new Set();\n if (!nextDependents.has(entry.path)) {\n nextDependents.add(entry.path);\n dependents.set(dependencyPath, nextDependents);\n inDegree.set(entry.path, (inDegree.get(entry.path) ?? 0) + 1);\n }\n });\n });\n\n const queue = entries\n .filter((entry) => (inDegree.get(entry.path) ?? 0) === 0)\n .map((entry) => entry.path);\n const orderedPaths: string[] = [];\n\n while (queue.length > 0) {\n const currentPath = queue.shift()!;\n orderedPaths.push(currentPath);\n\n const nextDependents = dependents.get(currentPath);\n if (!nextDependents) {\n continue;\n }\n\n nextDependents.forEach((dependentPath) => {\n const nextDegree = (inDegree.get(dependentPath) ?? 0) - 1;\n inDegree.set(dependentPath, nextDegree);\n\n if (nextDegree === 0) {\n queue.push(dependentPath);\n }\n });\n }\n\n if (orderedPaths.length !== entries.length) {\n throw new Error(\n \"BitStore: cyclic computed dependencies detected. Check computedDependsOn definitions.\",\n );\n }\n\n return orderedPaths.map((path) => entryByPath.get(path)!);\n }\n\n private getOrderedAllEntries(entries: BitComputedEntry<T>[]) {\n const signature = this.createEntriesSignature(entries);\n if (\n this.orderedAllEntriesCache &&\n this.orderedAllEntriesCache.signature === signature\n ) {\n return this.orderedAllEntriesCache.ordered;\n }\n\n const ordered = this.orderEntries(entries);\n this.orderedAllEntriesCache = { signature, ordered };\n return ordered;\n }\n\n private ensureEntriesAreValid(entries: BitComputedEntry<T>[]) {\n const signature = this.createEntriesSignature(entries);\n if (this.validatedEntriesSignature === signature) {\n return;\n }\n\n entries.forEach((entry) => this.assertDependencies(entry));\n this.validatedEntriesSignature = signature;\n this.invalidateReverseDeps();\n }\n\n private createEntriesSignature(entries: BitComputedEntry<T>[]): string {\n return entries\n .map((entry) => `${entry.path}:${entry.dependsOn.join(\",\")}`)\n .join(\"|\");\n }\n\n private getDependentsForPath(\n reverseDependencies: Map<string, Set<string>>,\n changedPath: string,\n ) {\n const dependents = new Set<string>();\n\n const collect = (dependencyPath: string) => {\n const listeners = reverseDependencies.get(dependencyPath);\n if (!listeners) {\n return;\n }\n\n listeners.forEach((path) => dependents.add(path));\n };\n\n collect(changedPath);\n\n const parentSegments = changedPath.split(\".\");\n while (parentSegments.length > 1) {\n parentSegments.pop();\n collect(parentSegments.join(\".\"));\n }\n\n const childKeys = this.childDepsIndex?.get(changedPath);\n if (childKeys) {\n for (const childDep of childKeys) {\n collect(childDep);\n }\n }\n\n return dependents;\n }\n\n private assertDependencies(entry: BitComputedEntry<T>) {\n if (entry.dependsOn.length === 0) {\n throw new Error(\n `BitStore: computed field \\`${entry.path}\\` requires explicit computedDependsOn in v4.`,\n );\n }\n\n if (entry.dependsOn.includes(entry.path)) {\n throw new Error(\n `BitStore: computed field \\`${entry.path}\\` cannot depend on itself.`,\n );\n }\n }\n}\n","import {\n collectDirtyPaths,\n getDeepValue,\n setDeepValue,\n valueEqual,\n} from \"../../../utils\";\n\n/**\n * BitDirtyManager\n *\n * Manages dirty state tracking for form fields.\n * Tracks which fields have been modified from their initial values.\n */\nexport class BitDirtyManager<T extends object = any> {\n private dirtyPaths: Set<string> = new Set();\n private dirtyPathIndex: Set<string> = new Set();\n private dirtyPrefixRefCount: Map<string, number> = new Map();\n /** Maps each strict ancestor prefix → set of dirty paths that are its descendants. */\n private childrenByPrefix: Map<string, Set<string>> = new Map();\n\n /**\n * Updates dirty state for a single path change.\n * Automatically removes child paths when parent changes.\n * @returns true if any fields are dirty\n */\n updateForPath(path: string, values: T, initialValues: T): boolean {\n this.removeDirtyChildren(path);\n\n const current = getDeepValue(values, path);\n const initial = getDeepValue(initialValues, path);\n\n if (valueEqual(current, initial)) {\n this.removeDirtyPath(path);\n } else {\n this.addDirtyPath(path);\n }\n\n return this.dirtyPaths.size > 0;\n }\n\n /**\n * Rebuilds dirty paths from full state comparison.\n * Used for undo/redo and bulk updates.\n * @returns true if any fields are dirty\n */\n rebuild(values: T, initialValues: T): boolean {\n this.dirtyPaths = collectDirtyPaths(values, initialValues);\n this.dirtyPrefixRefCount.clear();\n this.rebuildIndex();\n return this.dirtyPaths.size > 0;\n }\n\n /**\n * Clears all dirty tracking.\n * Used when resetting form or updating initial values.\n */\n clear(): void {\n this.dirtyPaths.clear();\n this.dirtyPathIndex.clear();\n this.dirtyPrefixRefCount.clear();\n this.childrenByPrefix.clear();\n }\n\n /**\n * Returns current dirty state.\n */\n get isDirty(): boolean {\n return this.dirtyPaths.size > 0;\n }\n\n /**\n * Returns readonly set of dirty paths (for debugging/devtools).\n */\n getDirtyPaths(): ReadonlySet<string> {\n return this.dirtyPaths;\n }\n\n isPathDirty(path: string): boolean {\n if (this.dirtyPathIndex.has(path)) {\n return true;\n }\n\n const segments = path.split(\".\");\n while (segments.length > 1) {\n segments.pop();\n if (this.dirtyPaths.has(segments.join(\".\"))) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Builds a partial object containing only dirty values.\n * For arrays, returns the entire array if any index changed.\n * @param values - current form values (already cleaned/transformed)\n */\n buildDirtyValues<T extends object>(values: T): Partial<T> {\n if (this.dirtyPaths.size === 0) return {};\n\n let result: any = {};\n const processedArrays = new Set<string>();\n\n for (const path of this.dirtyPaths) {\n const arrayMatch = path.match(/^(.+)\\.\\d+/);\n\n if (arrayMatch) {\n const arrayPath = arrayMatch[1];\n if (processedArrays.has(arrayPath)) continue;\n processedArrays.add(arrayPath);\n const arrayVal = getDeepValue(values, arrayPath);\n result = setDeepValue(result, arrayPath, arrayVal);\n } else {\n const fieldVal = getDeepValue(values, path);\n result = setDeepValue(result, path, fieldVal);\n }\n }\n\n return result;\n }\n\n private rebuildIndex() {\n const nextIndex = new Set<string>();\n const nextRefCount = new Map<string, number>();\n const nextChildrenByPrefix = new Map<string, Set<string>>();\n\n for (const dirtyPath of this.dirtyPaths) {\n this.forEachPathPrefix(dirtyPath, (prefix) => {\n nextIndex.add(prefix);\n nextRefCount.set(prefix, (nextRefCount.get(prefix) ?? 0) + 1);\n });\n\n this.forEachAncestorPrefix(dirtyPath, (ancestor) => {\n const set = nextChildrenByPrefix.get(ancestor);\n if (set) {\n set.add(dirtyPath);\n } else {\n nextChildrenByPrefix.set(ancestor, new Set([dirtyPath]));\n }\n });\n }\n\n this.dirtyPathIndex = nextIndex;\n this.dirtyPrefixRefCount = nextRefCount;\n this.childrenByPrefix = nextChildrenByPrefix;\n }\n\n private removeDirtyChildren(parentPath: string) {\n const children = this.childrenByPrefix.get(parentPath);\n if (!children || children.size === 0) return;\n\n // Snapshot to avoid mutating the set while iterating\n for (const path of [...children]) {\n this.removeDirtyPath(path);\n }\n }\n\n private addDirtyPath(path: string) {\n if (this.dirtyPaths.has(path)) {\n return;\n }\n\n this.dirtyPaths.add(path);\n this.forEachPathPrefix(path, (prefix) => {\n this.dirtyPathIndex.add(prefix);\n this.dirtyPrefixRefCount.set(\n prefix,\n (this.dirtyPrefixRefCount.get(prefix) ?? 0) + 1,\n );\n });\n\n // Keep childrenByPrefix up to date for O(1) removeDirtyChildren\n this.forEachAncestorPrefix(path, (ancestor) => {\n const set = this.childrenByPrefix.get(ancestor);\n if (set) {\n set.add(path);\n } else {\n this.childrenByPrefix.set(ancestor, new Set([path]));\n }\n });\n }\n\n private removeDirtyPath(path: string) {\n if (!this.dirtyPaths.has(path)) {\n return;\n }\n\n this.dirtyPaths.delete(path);\n\n this.forEachPathPrefix(path, (prefix) => {\n const nextCount = (this.dirtyPrefixRefCount.get(prefix) ?? 0) - 1;\n\n if (nextCount <= 0) {\n this.dirtyPrefixRefCount.delete(prefix);\n this.dirtyPathIndex.delete(prefix);\n return;\n }\n\n this.dirtyPrefixRefCount.set(prefix, nextCount);\n });\n\n // Remove from childrenByPrefix\n this.forEachAncestorPrefix(path, (ancestor) => {\n this.childrenByPrefix.get(ancestor)?.delete(path);\n });\n }\n\n private forEachPathPrefix(path: string, callback: (prefix: string) => void) {\n const segments = path.split(\".\");\n let current = \"\";\n\n for (const segment of segments) {\n current = current ? `${current}.${segment}` : segment;\n callback(current);\n }\n }\n\n /**\n * Iterates over all strict ancestor prefixes of `path` (i.e., excludes the path itself).\n * Used to maintain childrenByPrefix.\n */\n private forEachAncestorPrefix(\n path: string,\n callback: (prefix: string) => void,\n ) {\n const segments = path.split(\".\");\n let current = \"\";\n\n for (let i = 0; i < segments.length - 1; i++) {\n current = current ? `${current}.${segments[i]}` : segments[i];\n callback(current);\n }\n }\n}\n","import { BitMask, BitMaskName } from \"../../../mask/types\";\n\n/**\n * BitMaskManager\n *\n * Manages input mask registration and resolution.\n * Decoupled from BitStore to reduce main class complexity.\n *\n * Responsibilities:\n * - Register/unregister masks\n * - Resolve masks by name\n */\nexport class BitMaskManager {\n private masks: Record<string, BitMask> = {};\n\n /**\n * Register a new input mask\n *\n * @param name - Unique mask identifier\n * @param mask - Mask configuration/pattern\n */\n registerMask(name: BitMaskName, mask: BitMask): void {\n this.masks = {\n ...this.masks,\n [name]: mask,\n };\n }\n\n /**\n * Unregister an existing mask\n *\n * @param name - Mask identifier to remove\n */\n unregisterMask(name: BitMaskName): void {\n if (!(name in this.masks)) {\n return; // Silently ignore non-existent masks\n }\n\n const { [name]: _, ...remaining } = this.masks;\n this.masks = remaining;\n }\n\n /**\n * Get mask configuration by name\n *\n * @param name - Mask identifier\n * @returns Mask configuration or undefined if not found\n */\n resolveMask(name: BitMaskName): BitMask | undefined {\n return this.masks[name];\n }\n\n /**\n * Get all registered masks\n *\n * @returns Object map of all registered masks\n */\n getAllMasks(): Record<string, BitMask> {\n return this.masks;\n }\n\n /**\n * Clear all registered masks\n */\n clear(): void {\n this.masks = {};\n }\n}\n","import type { BitFieldDefinition, BitTransformFn } from \"../contracts/types\";\nimport type { BitComputedEntry } from \"../managers/core/computed-manager\";\n\nexport class BitFieldCatalog<T extends object = any> {\n private readonly fieldConfigs: Map<string, BitFieldDefinition<T>> = new Map();\n\n private scopeFieldsIndex: Map<string, string[]> | null = null;\n private computedEntriesCache: BitComputedEntry<T>[] | null = null;\n private transformEntriesCache: [string, BitTransformFn<T>][] | null = null;\n\n get(path: string): BitFieldDefinition<T> | undefined {\n return this.fieldConfigs.get(path);\n }\n\n set(path: string, config: BitFieldDefinition<T>) {\n this.fieldConfigs.set(path, config);\n this.registerCachedIndexes(path, config);\n }\n\n delete(path: string): BitFieldDefinition<T> | undefined {\n const config = this.fieldConfigs.get(path);\n this.fieldConfigs.delete(path);\n this.unregisterCachedIndexes(path, config);\n return config;\n }\n\n has(path: string): boolean {\n return this.fieldConfigs.has(path);\n }\n\n forEach(callback: (config: BitFieldDefinition<T>, path: string) => void) {\n this.fieldConfigs.forEach((config, path) => callback(config, path));\n }\n\n entries(): [string, BitFieldDefinition<T>][] {\n return Array.from(this.fieldConfigs.entries());\n }\n\n getScopeFields(scopeName: string): string[] {\n if (!this.scopeFieldsIndex) {\n const index = new Map<string, string[]>();\n this.forEach((cfg, path) => {\n if (!cfg.scope) {\n return;\n }\n const list = index.get(cfg.scope) ?? [];\n list.push(path);\n index.set(cfg.scope, list);\n });\n this.scopeFieldsIndex = index;\n }\n\n return this.scopeFieldsIndex.get(scopeName) ?? [];\n }\n\n getComputedEntries(): BitComputedEntry<T>[] {\n if (!this.computedEntriesCache) {\n const result: BitComputedEntry<T>[] = [];\n this.forEach((cfg, path) => {\n if (cfg.computed) {\n result.push({\n path,\n compute: cfg.computed,\n dependsOn: cfg.computedDependsOn,\n });\n }\n });\n this.computedEntriesCache = result;\n }\n\n return this.computedEntriesCache;\n }\n\n getTransformEntries(): [string, BitTransformFn<T>][] {\n if (!this.transformEntriesCache) {\n const result: [string, BitTransformFn<T>][] = [];\n this.forEach((cfg, path) => {\n if (cfg.transform) {\n result.push([path, cfg.transform]);\n }\n });\n this.transformEntriesCache = result;\n }\n\n return this.transformEntriesCache;\n }\n\n invalidateIndexes() {\n this.scopeFieldsIndex = null;\n this.computedEntriesCache = null;\n this.transformEntriesCache = null;\n }\n\n private registerCachedIndexes(path: string, config: BitFieldDefinition<T>) {\n if (this.scopeFieldsIndex && config.scope) {\n const scopedPaths = this.scopeFieldsIndex.get(config.scope) ?? [];\n if (!scopedPaths.includes(path)) {\n scopedPaths.push(path);\n this.scopeFieldsIndex.set(config.scope, scopedPaths);\n }\n }\n\n if (this.computedEntriesCache && config.computed) {\n this.computedEntriesCache.push({\n path,\n compute: config.computed,\n dependsOn: config.computedDependsOn,\n });\n }\n\n if (this.transformEntriesCache && config.transform) {\n this.transformEntriesCache.push([path, config.transform]);\n }\n }\n\n private unregisterCachedIndexes(\n path: string,\n config?: BitFieldDefinition<T>,\n ) {\n if (!config) {\n this.invalidateIndexes();\n return;\n }\n\n if (this.scopeFieldsIndex && config.scope) {\n const scopedPaths = this.scopeFieldsIndex.get(config.scope);\n if (scopedPaths) {\n const nextPaths = scopedPaths.filter((fieldPath) => fieldPath !== path);\n if (nextPaths.length > 0) {\n this.scopeFieldsIndex.set(config.scope, nextPaths);\n } else {\n this.scopeFieldsIndex.delete(config.scope);\n }\n }\n }\n\n if (this.computedEntriesCache && config.computed) {\n this.computedEntriesCache = this.computedEntriesCache.filter(\n (entry) => entry.path !== path,\n );\n }\n\n if (this.transformEntriesCache && config.transform) {\n this.transformEntriesCache = this.transformEntriesCache.filter(\n ([entryPath]) => entryPath !== path,\n );\n }\n }\n}\n","import { getDeepValue } from \"../../utils\";\nimport type { BitErrors, BitFieldDefinition } from \"../contracts/types\";\n\nexport class BitFieldConditions<T extends object = any> {\n private readonly dependencies: Map<string, Set<string>> = new Map();\n private readonly hiddenFields: Set<string> = new Set();\n private readonly conditionalVisibilityPaths: Set<string> = new Set();\n private readonly requiredPathsByDependency: Map<string, Set<string>> =\n new Map();\n private readonly requiredConditionalPaths: Set<string> = new Set();\n private requiredEvaluationCache = new WeakMap<T, Map<string, boolean>>();\n private requiredEvaluationCacheDirty = false;\n\n constructor(\n private readonly getFieldConfig: (\n path: string,\n ) => BitFieldDefinition<T> | undefined,\n ) {}\n\n getHiddenFields(): ReadonlySet<string> {\n return this.hiddenFields;\n }\n\n onRegister(path: string, config: BitFieldDefinition<T>, currentValues: T) {\n if (config.conditional?.showIf) {\n this.conditionalVisibilityPaths.add(path);\n }\n\n const dependsOn = config.conditional?.dependsOn;\n if (dependsOn) {\n dependsOn.forEach((dep) => {\n if (!this.dependencies.has(dep)) {\n this.dependencies.set(dep, new Set());\n }\n this.dependencies.get(dep)!.add(path);\n });\n }\n\n if (dependsOn && config.conditional?.requiredIf) {\n this.requiredConditionalPaths.add(path);\n dependsOn.forEach((dep) => {\n if (!this.requiredPathsByDependency.has(dep)) {\n this.requiredPathsByDependency.set(dep, new Set());\n }\n this.requiredPathsByDependency.get(dep)!.add(path);\n });\n }\n\n this.requiredEvaluationCacheDirty = true;\n this.evaluateFieldCondition(path, currentValues);\n }\n\n onUnregister(path: string, config?: BitFieldDefinition<T>) {\n this.hiddenFields.delete(path);\n this.conditionalVisibilityPaths.delete(path);\n this.dependencies.delete(path);\n this.requiredEvaluationCacheDirty = true;\n this.requiredConditionalPaths.delete(path);\n\n config?.conditional?.dependsOn?.forEach((dep) => {\n const requiredPaths = this.requiredPathsByDependency.get(dep);\n if (!requiredPaths) {\n return;\n }\n\n requiredPaths.delete(path);\n if (requiredPaths.size === 0) {\n this.requiredPathsByDependency.delete(dep);\n }\n });\n\n this.dependencies.forEach((dependentsSet) => {\n dependentsSet.delete(path);\n });\n }\n\n isHidden(path: string): boolean {\n return this.hiddenFields.has(path);\n }\n\n hasDependents(path: string): boolean {\n return (this.dependencies.get(path)?.size ?? 0) > 0;\n }\n\n isRequired(path: string, values: T): boolean {\n const config = this.getFieldConfig(path);\n if (!config || this.isHidden(path)) return false;\n\n if (!config.conditional?.requiredIf) {\n return false;\n }\n\n if (this.requiredEvaluationCacheDirty) {\n this.requiredEvaluationCache = new WeakMap();\n this.requiredEvaluationCacheDirty = false;\n }\n\n let cache = this.requiredEvaluationCache.get(values);\n if (!cache) {\n cache = new Map<string, boolean>();\n this.requiredEvaluationCache.set(values, cache);\n }\n\n if (cache.has(path)) {\n return cache.get(path)!;\n }\n\n const result = !!config.conditional.requiredIf(values);\n cache.set(path, result);\n return result;\n }\n\n getRequiredErrors(values: T): BitErrors<T> {\n const errors: BitErrors<T> = {};\n\n this.requiredConditionalPaths.forEach((path) => {\n const config = this.getFieldConfig(path);\n if (!config) {\n return;\n }\n\n if (this.isRequired(path, values)) {\n const val = getDeepValue(values, path);\n if (this.isEmpty(val)) {\n errors[path as keyof BitErrors<T>] = (config.conditional\n ?.requiredMessage ?? \"required field\") as any;\n }\n }\n });\n\n return errors;\n }\n\n evaluateAll(values: T) {\n this.conditionalVisibilityPaths.forEach((path) => {\n this.evaluateFieldCondition(path, values);\n });\n }\n\n updateDependencies(changedPath: string, newValues: T): string[] {\n const toggledFields: string[] = [];\n\n const queue = [changedPath];\n const visited = new Set<string>();\n\n while (queue.length > 0) {\n const currentPath = queue.shift()!;\n\n if (visited.has(currentPath)) {\n continue;\n }\n\n visited.add(currentPath);\n\n const dependents = this.dependencies.get(currentPath);\n if (!dependents) {\n continue;\n }\n\n dependents.forEach((depPath) => {\n const wasHidden = this.isHidden(depPath);\n this.evaluateFieldCondition(depPath, newValues);\n const isHiddenNow = this.isHidden(depPath);\n\n if (wasHidden !== isHiddenNow) {\n toggledFields.push(depPath);\n }\n\n queue.push(depPath);\n });\n }\n\n return toggledFields;\n }\n\n private evaluateFieldCondition(path: string, values: T) {\n const config = this.getFieldConfig(path);\n const showIf = config?.conditional?.showIf;\n if (!showIf) return;\n\n if (showIf(values)) {\n this.hiddenFields.delete(path);\n } else {\n this.hiddenFields.add(path);\n }\n }\n\n private isEmpty(value: any): boolean {\n return (\n value === undefined ||\n value === null ||\n (typeof value === \"string\" && value.trim() === \"\") ||\n (Array.isArray(value) && value.length === 0)\n );\n }\n}\n","import type { BitFieldDefinition, BitTransformFn } from \"../contracts/types\";\nimport type { BitComputedEntry } from \"../managers/core/computed-manager\";\nimport { BitFieldCatalog } from \"./field-catalog\";\nimport { BitFieldConditions } from \"./field-conditions\";\n\nexport class BitFieldRegistry<T extends object = any> {\n private readonly catalog = new BitFieldCatalog<T>();\n private readonly conditions = new BitFieldConditions<T>((path) =>\n this.catalog.get(path),\n );\n\n getFieldConfig(path: string): BitFieldDefinition<T> | undefined {\n return this.catalog.get(path);\n }\n\n forEachFieldConfig(\n callback: (config: BitFieldDefinition<T>, path: string) => void,\n ) {\n this.catalog.forEach((config, path) => callback(config, path));\n }\n\n hasFieldConfig(path: string): boolean {\n return this.catalog.has(path);\n }\n\n getHiddenFields(): ReadonlySet<string> {\n return this.conditions.getHiddenFields();\n }\n\n register(path: string, config: BitFieldDefinition<T>, currentValues: T) {\n this.catalog.set(path, config);\n this.conditions.onRegister(path, config, currentValues);\n }\n\n unregister(path: string) {\n const config = this.catalog.delete(path);\n this.conditions.onUnregister(path, config);\n }\n\n unregisterPrefix(prefix: string) {\n const removedEntries: [string, BitFieldDefinition<T>][] = [];\n\n this.catalog.forEach((config, path) => {\n if (path.startsWith(prefix)) {\n removedEntries.push([path, config]);\n }\n });\n\n removedEntries.forEach(([path]) => this.unregister(path));\n\n return removedEntries;\n }\n\n isHidden(path: string): boolean {\n return this.conditions.isHidden(path);\n }\n\n hasDependents(path: string): boolean {\n return this.conditions.hasDependents(path);\n }\n\n isRequired(path: string, values: T): boolean {\n return this.conditions.isRequired(path, values);\n }\n\n getRequiredErrors(values: T): Record<string, string> {\n return this.conditions.getRequiredErrors(values) as Record<string, string>;\n }\n\n evaluateAll(values: T) {\n this.conditions.evaluateAll(values);\n }\n\n updateDependencies(changedPath: string, newValues: T): string[] {\n return this.conditions.updateDependencies(changedPath, newValues);\n }\n\n getScopeFields(scopeName: string): string[] {\n return this.catalog.getScopeFields(scopeName);\n }\n\n getComputedEntries(): BitComputedEntry<T>[] {\n return this.catalog.getComputedEntries();\n }\n\n getTransformEntries(): [string, BitTransformFn<T>][] {\n return this.catalog.getTransformEntries();\n }\n\n invalidateIndexes() {\n this.catalog.invalidateIndexes();\n }\n}\n","import type { BitConfig, BitPersistResolvedConfig } from \"../contracts/types\";\nimport type { BitFrameworkConfig } from \"../contracts/public-types\";\nimport { deepClone } from \"../../utils\";\n\nfunction defaultIdFactory() {\n return `bit-form-${Math.random().toString(36).slice(2, 9)}`;\n}\n\nexport function normalizeConfig<T extends object>(\n config: BitConfig<T> = {},\n): BitFrameworkConfig<T> {\n const rawInitial = (config.initialValues ?? {}) as T;\n const validation = config.validation;\n const history = config.history;\n\n const defaultPersistKey = config.name\n ? `bit-form:${config.name}:draft`\n : \"bit-form:draft\";\n\n const persist: BitPersistResolvedConfig<T> = {\n enabled: config.persist?.enabled ?? false,\n key: config.persist?.key ?? defaultPersistKey,\n storage: config.persist?.storage,\n autoSave: config.persist?.autoSave ?? true,\n debounceMs: config.persist?.debounceMs ?? 300,\n mode: config.persist?.mode ?? \"values\",\n serialize: config.persist?.serialize ?? JSON.stringify,\n deserialize:\n config.persist?.deserialize ??\n ((raw: string) => JSON.parse(raw) as Partial<T>),\n onError: config.persist?.onError,\n };\n\n return {\n name: config.name,\n initialValues: deepClone(rawInitial),\n resolver: validation?.resolver,\n validationDelay: validation?.delay ?? 300,\n history: {\n enabled: history?.enabled ?? false,\n limit: history?.limit ?? 50,\n },\n masks: config.masks,\n fields: config.fields,\n devTools: config.devTools,\n persist,\n idFactory: config.idFactory ?? defaultIdFactory,\n plugins: config.plugins ?? [],\n scheduler: config.scheduler,\n subscriptionCacheSize: config.subscriptionCacheSize,\n bus: config.bus,\n } as BitFrameworkConfig<T>;\n}\n","import type {\n BitPersistResolvedConfig,\n BitPersistStorageAdapter,\n} from \"../../contracts/types\";\n\nfunction getDefaultStorage(): BitPersistStorageAdapter | undefined {\n if (typeof globalThis === \"undefined\") return undefined;\n\n const storageLike = (globalThis as { localStorage?: Storage }).localStorage;\n if (!storageLike) return undefined;\n\n return {\n getItem: (key: string) => storageLike.getItem(key),\n setItem: (key: string, value: string) => storageLike.setItem(key, value),\n removeItem: (key: string) => storageLike.removeItem(key),\n };\n}\n\nexport class BitPersistManager<T extends object = any> {\n private timer: ReturnType<typeof setTimeout> | undefined;\n\n constructor(\n private config: BitPersistResolvedConfig<T>,\n private getValues: () => T,\n private getDirtyValues: () => Partial<T>,\n private applyRestoredValues: (values: Partial<T>) => void,\n ) {}\n\n private getStorage(): BitPersistStorageAdapter | undefined {\n return this.config.storage || getDefaultStorage();\n }\n\n private canPersist() {\n return !!(this.config.enabled && this.config.key && this.getStorage());\n }\n\n private handleError(error: unknown) {\n this.config.onError?.(error);\n }\n\n async saveNow() {\n if (!this.canPersist()) return;\n\n const storage = this.getStorage();\n if (!storage) return;\n\n try {\n const payload =\n this.config.mode === \"dirtyValues\"\n ? this.getDirtyValues()\n : this.getValues();\n const serialized = this.config.serialize(payload);\n await storage.setItem(this.config.key, serialized);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n queueSave() {\n if (!this.canPersist() || !this.config.autoSave) return;\n\n if (this.timer) {\n clearTimeout(this.timer);\n }\n\n this.timer = setTimeout(() => {\n void this.saveNow();\n }, this.config.debounceMs);\n }\n\n async restore() {\n if (!this.canPersist()) return false;\n\n const storage = this.getStorage();\n if (!storage) return false;\n\n try {\n const raw = await storage.getItem(this.config.key);\n if (!raw) return false;\n\n const parsed = this.config.deserialize(raw);\n if (!parsed || typeof parsed !== \"object\") {\n return false;\n }\n\n this.applyRestoredValues(parsed);\n return true;\n } catch (error) {\n this.handleError(error);\n return false;\n }\n }\n\n async clear() {\n if (!this.canPersist()) return;\n\n const storage = this.getStorage();\n if (!storage) return;\n\n try {\n await storage.removeItem(this.config.key);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n destroy() {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = undefined;\n }\n }\n}\n","import type {\n BitAfterSubmitEvent,\n BitAfterValidateEvent,\n BitBeforeSubmitEvent,\n BitBeforeValidateEvent,\n BitFieldChangeEvent,\n BitPlugin,\n BitPluginContext,\n BitPluginErrorEvent,\n} from \"../../contracts/types\";\n\nexport class BitPluginManager<T extends object = any> {\n private teardownFns: Array<() => void> = [];\n private notifyingError = false;\n\n constructor(\n private plugins: BitPlugin<T>[],\n private contextFactory: () => BitPluginContext<T>,\n ) {}\n\n setupAll() {\n const context = this.contextFactory();\n this.plugins.forEach((plugin) => {\n if (!plugin.setup) return;\n\n try {\n const maybeTeardown = plugin.setup(context);\n if (typeof maybeTeardown === \"function\") {\n this.teardownFns.push(maybeTeardown);\n }\n } catch (error) {\n void this.reportError(\"setup\", error, undefined, plugin.name);\n }\n });\n }\n\n async beforeValidate(event: BitBeforeValidateEvent<T>) {\n await this.emitHook(\"beforeValidate\", event);\n }\n\n async afterValidate(event: BitAfterValidateEvent<T>) {\n await this.emitHook(\"afterValidate\", event);\n }\n\n async beforeSubmit(event: BitBeforeSubmitEvent<T>) {\n await this.emitHook(\"beforeSubmit\", event);\n }\n\n async afterSubmit(event: BitAfterSubmitEvent<T>) {\n await this.emitHook(\"afterSubmit\", event);\n }\n\n onFieldChange(event: BitFieldChangeEvent<T>) {\n const context = this.contextFactory();\n this.plugins.forEach((plugin) => {\n const hook = plugin.hooks?.onFieldChange;\n if (!hook) return;\n\n try {\n const result = hook(event, context);\n void Promise.resolve(result).catch((error) => {\n void this.reportError(\"onFieldChange\", error, event, plugin.name);\n });\n } catch (error) {\n void this.reportError(\"onFieldChange\", error, event, plugin.name);\n }\n });\n }\n\n async reportError(\n source: BitPluginErrorEvent<T>[\"source\"],\n error: unknown,\n event?: unknown,\n pluginName?: string,\n ) {\n if (this.notifyingError) {\n return;\n }\n\n this.notifyingError = true;\n\n const context = this.contextFactory();\n const payload: BitPluginErrorEvent<T> = {\n source,\n pluginName,\n error,\n event,\n values: context.getState().values,\n state: context.getState(),\n };\n\n for (const plugin of this.plugins) {\n const onError = plugin.hooks?.onError;\n if (!onError) continue;\n\n try {\n await onError(payload, context);\n } catch {\n // fail-open: ignore secondary errors from onError handlers\n }\n }\n\n this.notifyingError = false;\n }\n\n destroy() {\n for (let index = this.teardownFns.length - 1; index >= 0; index -= 1) {\n const teardown = this.teardownFns[index];\n try {\n teardown();\n } catch (error) {\n void this.reportError(\"teardown\", error);\n }\n }\n\n this.teardownFns = [];\n }\n\n private async emitHook(\n hookName:\n | \"beforeValidate\"\n | \"afterValidate\"\n | \"beforeSubmit\"\n | \"afterSubmit\",\n event:\n | BitBeforeValidateEvent<T>\n | BitAfterValidateEvent<T>\n | BitBeforeSubmitEvent<T>\n | BitAfterSubmitEvent<T>,\n ) {\n const context = this.contextFactory();\n\n for (const plugin of this.plugins) {\n const hook = plugin.hooks?.[hookName];\n if (!hook) continue;\n\n try {\n await hook(event as never, context);\n } catch (error) {\n await this.reportError(hookName, error, event, plugin.name);\n }\n }\n }\n}\n","import type {\n BitAfterSubmitEvent,\n BitAfterValidateEvent,\n BitBeforeSubmitEvent,\n BitBeforeValidateEvent,\n BitFieldChangeEvent,\n BitState,\n} from \"../contracts/types\";\nimport type { BitFormGlobal } from \"../contracts/bus-types\";\nimport { BitPersistManager } from \"../managers/features/persist-manager\";\nimport { BitPluginManager } from \"../managers/features/plugin-manager\";\n\nexport class BitStoreEffectEngine<T extends object> {\n constructor(\n private readonly storeId: string,\n private readonly storeInstance: unknown,\n private readonly bus: BitFormGlobal,\n private readonly persistManager: BitPersistManager<T>,\n private readonly pluginManager: BitPluginManager<T>,\n private readonly enableBusDispatch = true,\n ) {}\n\n initialize(): void {\n this.pluginManager.setupAll();\n if (this.enableBusDispatch) {\n this.bus.stores[this.storeId] = this.storeInstance;\n }\n }\n\n onStateUpdated(nextState: BitState<T>, valuesChanged: boolean): void {\n if (valuesChanged) {\n this.persistManager.queueSave();\n }\n\n if (this.enableBusDispatch) {\n this.bus.dispatch(this.storeId, nextState);\n }\n }\n\n restorePersisted(): Promise<boolean> {\n return this.persistManager.restore();\n }\n\n savePersistedNow(): Promise<void> {\n return this.persistManager.saveNow();\n }\n\n clearPersisted(): Promise<void> {\n return this.persistManager.clear();\n }\n\n beforeValidate(event: BitBeforeValidateEvent<T>): Promise<void> {\n return this.pluginManager.beforeValidate(event);\n }\n\n afterValidate(event: BitAfterValidateEvent<T>): Promise<void> {\n return this.pluginManager.afterValidate(event);\n }\n\n beforeSubmit(event: BitBeforeSubmitEvent<T>): Promise<void> {\n return this.pluginManager.beforeSubmit(event);\n }\n\n afterSubmit(event: BitAfterSubmitEvent<T>): Promise<void> {\n return this.pluginManager.afterSubmit(event);\n }\n\n onFieldChange(event: BitFieldChangeEvent<T>): void {\n this.pluginManager.onFieldChange(event);\n }\n\n reportOperationalError(event: {\n source: \"submit\";\n error: unknown;\n payload?: unknown;\n }): Promise<void> {\n return this.pluginManager.reportError(\n event.source,\n event.error,\n event.payload,\n );\n }\n\n destroy(): void {\n this.persistManager.destroy();\n this.pluginManager.destroy();\n if (this.enableBusDispatch) {\n delete this.bus.stores[this.storeId];\n }\n }\n}\n","export interface BitPipelineContext {\n halted?: boolean;\n}\n\nexport interface BitPipelineStep<TContext extends BitPipelineContext> {\n name: string;\n run: (context: TContext) => void | Promise<void>;\n}\n\nexport interface BitSyncPipelineStep<TContext extends BitPipelineContext> {\n name: string;\n run: (context: TContext) => void;\n}\n\nexport class BitPipelineRunner<TContext extends BitPipelineContext> {\n constructor(private readonly steps: BitPipelineStep<TContext>[]) {}\n\n async run(context: TContext): Promise<void> {\n for (const step of this.steps) {\n if (context.halted) {\n break;\n }\n\n await step.run(context);\n }\n }\n}\n\nexport class BitSyncPipelineRunner<TContext extends BitPipelineContext> {\n constructor(private readonly steps: BitSyncPipelineStep<TContext>[]) {}\n\n run(context: TContext): void {\n for (const step of this.steps) {\n if (context.halted) {\n break;\n }\n\n step.run(context);\n }\n }\n}\n","export function hasAnyError(errors: Record<string, unknown>): boolean {\n for (const _path in errors) {\n return true;\n }\n\n return false;\n}\n","import type { BitErrors, BitFieldDefinition } from \"../../../contracts/types\";\nimport { getDeepValue } from \"../../../../utils\";\n\ntype BitAsyncValidateFn<T extends object> = NonNullable<\n NonNullable<BitFieldDefinition<T>[\"validation\"]>[\"asyncValidate\"]\n>;\n\nexport function mergeValidationErrors<T extends object>(args: {\n targetFields?: string[];\n currentErrors: BitErrors<T>;\n allErrors: Record<string, any>;\n asyncErrors: ReadonlyMap<string, string>;\n}) {\n const { targetFields, currentErrors, allErrors, asyncErrors } = args;\n\n if (targetFields && targetFields.length > 0) {\n const scopedErrors = { ...currentErrors } as BitErrors<T>;\n\n targetFields.forEach((field) => {\n if (allErrors[field]) {\n scopedErrors[field as keyof BitErrors<T>] = allErrors[field];\n } else if (asyncErrors.has(field)) {\n scopedErrors[field as keyof BitErrors<T>] = asyncErrors.get(field)!;\n } else {\n delete scopedErrors[field as keyof BitErrors<T>];\n }\n });\n\n const scopedResult = targetFields.every(\n (field) => !allErrors[field] && !asyncErrors.has(field),\n );\n\n return {\n committedErrors: scopedErrors,\n result: scopedResult,\n mode: \"scoped\" as const,\n };\n }\n\n const globalErrors = {\n ...Object.fromEntries(asyncErrors.entries()),\n ...allErrors,\n } as BitErrors<T>;\n\n return {\n committedErrors: globalErrors,\n result: undefined,\n mode: \"global\" as const,\n };\n}\n\nexport function resolveAsyncValidationPaths<T extends object>(args: {\n targetFields?: string[];\n hiddenFields: ReadonlySet<string>;\n getFieldConfig: (path: string) => BitFieldDefinition<T> | undefined;\n forEachFieldConfig?: (\n callback: (config: BitFieldDefinition<T>, path: string) => void,\n ) => void;\n}): string[] {\n const { targetFields, hiddenFields, getFieldConfig, forEachFieldConfig } =\n args;\n const paths: string[] = [];\n\n if (targetFields && targetFields.length > 0) {\n for (const path of targetFields) {\n if (hiddenFields.has(path)) {\n continue;\n }\n\n const asyncValidate = getFieldConfig(path)?.validation?.asyncValidate;\n if (asyncValidate) {\n paths.push(path);\n }\n }\n\n return paths;\n }\n\n if (!forEachFieldConfig) {\n return paths;\n }\n\n forEachFieldConfig((config, path) => {\n if (!config.validation?.asyncValidate || hiddenFields.has(path)) {\n return;\n }\n\n paths.push(path);\n });\n\n return paths;\n}\n\nexport async function runImmediateAsyncValidationStage<T extends object>(args: {\n path: string;\n values: T;\n validationId: number;\n currentValidationId: number;\n getFieldConfig: (path: string) => BitFieldDefinition<T> | undefined;\n cancelFieldAsync: (path: string) => void;\n createAbortController: () => AbortController;\n setAbortController: (path: string, controller: AbortController) => void;\n clearAbortController: (path: string) => void;\n setFieldValidating: (path: string, isValidating: boolean) => void;\n setAsyncError: (path: string, message: string) => void;\n clearAsyncError: (path: string) => void;\n}) {\n const {\n path,\n values,\n validationId,\n currentValidationId,\n getFieldConfig,\n cancelFieldAsync,\n createAbortController,\n setAbortController,\n clearAbortController,\n setFieldValidating,\n setAsyncError,\n clearAsyncError,\n } = args;\n\n const asyncValidate = getFieldConfig(path)?.validation?.asyncValidate;\n\n if (!asyncValidate) {\n clearAsyncError(path);\n return;\n }\n\n cancelFieldAsync(path);\n\n const controller = createAbortController();\n setAbortController(path, controller);\n setFieldValidating(path, true);\n\n try {\n const errorMessage = await (asyncValidate as BitAsyncValidateFn<T>)(\n getDeepValue(values, path),\n values,\n );\n\n if (controller.signal.aborted || validationId !== currentValidationId) {\n return;\n }\n\n if (errorMessage) {\n setAsyncError(path, errorMessage);\n } else {\n clearAsyncError(path);\n }\n } finally {\n if (!controller.signal.aborted && validationId === currentValidationId) {\n setFieldValidating(path, false);\n }\n clearAbortController(path);\n }\n}\n","import type { BitFieldDefinition } from \"../../../contracts/types\";\n\nexport type BitAsyncValidateFn<T extends object> = NonNullable<\n NonNullable<BitFieldDefinition<T>[\"validation\"]>[\"asyncValidate\"]\n>;\n\ninterface PendingAsyncValidationJob<T extends object> {\n value: unknown;\n dueAt: number;\n validate: BitAsyncValidateFn<T>;\n controller: AbortController;\n}\n\nexport interface BitAsyncValidationSchedulerPort<T extends object> {\n schedule(fn: () => void, delayMs: number): () => void;\n getValues(): T;\n setFieldValidating(path: string, isValidating: boolean): void;\n setAsyncError(path: string, message: string): void;\n clearAsyncError(path: string): void;\n onValidationPassed(path: string): Promise<void>;\n}\n\nexport class BitAsyncValidationScheduler<T extends object> {\n private cancelSchedulerTimeout?: () => void;\n private readonly abortControllers = new Map<string, AbortController>();\n private readonly pendingJobs = new Map<\n string,\n PendingAsyncValidationJob<T>\n >();\n\n constructor(private readonly port: BitAsyncValidationSchedulerPort<T>) {}\n\n handle(\n path: string,\n value: unknown,\n validate: BitAsyncValidateFn<T> | undefined,\n delay: number,\n ): void {\n if (!validate) {\n this.cancel(path);\n this.port.setFieldValidating(path, false);\n return;\n }\n\n this.cancel(path);\n this.port.setFieldValidating(path, true);\n\n const controller = new AbortController();\n this.abortControllers.set(path, controller);\n this.pendingJobs.set(path, {\n value,\n dueAt: Date.now() + delay,\n validate,\n controller,\n });\n this.schedulePendingJobs();\n }\n\n cancel(path: string): void {\n if (this.pendingJobs.has(path)) {\n this.pendingJobs.delete(path);\n this.schedulePendingJobs();\n }\n\n const controller = this.abortControllers.get(path);\n if (controller) {\n controller.abort();\n this.abortControllers.delete(path);\n }\n }\n\n cleanupPrefix(prefix: string): void {\n for (const path of this.pendingJobs.keys()) {\n if (path === prefix || path.startsWith(`${prefix}.`)) {\n this.cancel(path);\n this.port.clearAsyncError(path);\n this.port.setFieldValidating(path, false);\n }\n }\n }\n\n cancelAll(): void {\n if (this.cancelSchedulerTimeout) {\n this.cancelSchedulerTimeout();\n this.cancelSchedulerTimeout = undefined;\n }\n\n this.pendingJobs.clear();\n this.abortControllers.forEach((controller) => controller.abort());\n this.abortControllers.clear();\n }\n\n private schedulePendingJobs(): void {\n if (this.cancelSchedulerTimeout) {\n this.cancelSchedulerTimeout();\n this.cancelSchedulerTimeout = undefined;\n }\n\n let nextDueAt = Number.POSITIVE_INFINITY;\n\n for (const job of this.pendingJobs.values()) {\n if (job.dueAt < nextDueAt) {\n nextDueAt = job.dueAt;\n }\n }\n\n if (!Number.isFinite(nextDueAt)) {\n return;\n }\n\n this.cancelSchedulerTimeout = this.port.schedule(\n () => {\n this.cancelSchedulerTimeout = undefined;\n void this.flushPendingJobs();\n },\n Math.max(0, nextDueAt - Date.now()),\n );\n }\n\n private async flushPendingJobs(): Promise<void> {\n this.cancelSchedulerTimeout = undefined;\n\n const now = Date.now();\n const dueJobs = Array.from(this.pendingJobs.entries()).filter(\n ([, job]) => job.dueAt <= now,\n );\n\n if (dueJobs.length === 0) {\n this.schedulePendingJobs();\n return;\n }\n\n dueJobs.forEach(([path]) => {\n this.pendingJobs.delete(path);\n });\n\n await Promise.all(dueJobs.map(([path, job]) => this.runJob(path, job)));\n\n this.schedulePendingJobs();\n }\n\n private async runJob(\n path: string,\n job: PendingAsyncValidationJob<T>,\n ): Promise<void> {\n if (job.controller.signal.aborted) {\n return;\n }\n\n try {\n const errorMessage = await job.validate(job.value, this.port.getValues());\n\n if (job.controller.signal.aborted) {\n return;\n }\n\n if (errorMessage) {\n this.port.setAsyncError(path, errorMessage);\n } else {\n this.port.clearAsyncError(path);\n await this.port.onValidationPassed(path);\n }\n } finally {\n if (!job.controller.signal.aborted) {\n this.port.setFieldValidating(path, false);\n }\n this.abortControllers.delete(path);\n }\n }\n}\n","import type { BitValidationOptions } from \"../../../contracts/public-types\";\nimport type { BitValidationTriggerOptions } from \"../../../contracts/port-types\";\n\nexport interface BitValidationDebouncerPort {\n schedule(fn: () => void, delayMs: number): () => void;\n validate(options?: BitValidationOptions): Promise<boolean>;\n readonly validationDelay: number;\n}\n\n/**\n * Responsável exclusivamente pelo debounce do trigger de validação.\n * Acumula campos pendentes dentro da janela de debounce, evitando\n * descartar paths de chamadas anteriores dentro do mesmo intervalo.\n */\nexport class BitValidationDebouncer {\n private cancelTimeout?: () => void;\n private pendingScopeFields: Set<string> | null = null;\n\n constructor(private readonly port: BitValidationDebouncerPort) {}\n\n trigger(scopeFields?: string[], options?: BitValidationTriggerOptions): void {\n if (this.cancelTimeout) {\n this.cancelTimeout();\n this.cancelTimeout = undefined;\n }\n\n const configuredDelay = this.port.validationDelay ?? 300;\n const delay = options?.forceDebounce\n ? Math.max(1, configuredDelay)\n : configuredDelay;\n\n if (delay > 0) {\n // Acumula paths em vez de substituir — garante que paths de calls\n // anteriores dentro do mesmo debounce não sejam descartados.\n if (scopeFields && scopeFields.length > 0) {\n if (!this.pendingScopeFields) {\n this.pendingScopeFields = new Set(scopeFields);\n } else {\n for (const f of scopeFields) this.pendingScopeFields.add(f);\n }\n } else {\n // Sem scope = validação global, descarta paths acumulados\n this.pendingScopeFields = null;\n }\n\n const resolvedScopeFields = this.pendingScopeFields\n ? Array.from(this.pendingScopeFields)\n : undefined;\n\n this.cancelTimeout = this.port.schedule(() => {\n this.pendingScopeFields = null;\n this.cancelTimeout = undefined;\n void this.port.validate({ scopeFields: resolvedScopeFields });\n }, delay);\n } else {\n this.pendingScopeFields = null;\n void this.port.validate({ scopeFields });\n }\n }\n\n cancelPending(): void {\n if (this.cancelTimeout) {\n this.cancelTimeout();\n this.cancelTimeout = undefined;\n }\n this.pendingScopeFields = null;\n }\n}\n","import { BitErrors } from \"../../contracts/types\";\nimport {\n BitFrameworkConfig,\n BitValidationOptions,\n} from \"../../contracts/public-types\";\nimport { BitPipelineContext, BitPipelineRunner } from \"../../shared/pipeline\";\nimport {\n BitStoreOperation,\n patchStateOperation,\n validationCommitOperation,\n} from \"../../engines/operation-engine\";\nimport { hasAnyError } from \"../../shared/error-map\";\nimport {\n mergeValidationErrors,\n resolveAsyncValidationPaths,\n runImmediateAsyncValidationStage,\n} from \"./validation/validation-stages\";\nimport {\n BitAsyncValidationScheduler,\n type BitAsyncValidateFn,\n} from \"./validation/async-validation-scheduler\";\nimport { BitValidationDebouncer } from \"./validation/validation-debouncer\";\nimport type {\n BitAfterValidateEvent,\n BitBeforeValidateEvent,\n BitFieldDefinition,\n} from \"../../contracts/types\";\nimport type {\n BitValidationStorePort,\n BitValidationTriggerOptions,\n} from \"../../contracts/port-types\";\n\ninterface ValidationPipelineContext<\n T extends object,\n> extends BitPipelineContext {\n options?: BitValidationOptions;\n validationId: number;\n currentState: ReturnType<BitValidationStorePort<T>[\"getState\"]>;\n targetFields?: string[];\n allErrors: Record<string, any>;\n committedErrors: BitErrors<T>;\n isValid: boolean;\n result: boolean;\n aborted: boolean;\n}\n\nexport class BitValidationManager<T extends object> {\n private currentValidationId: number = 0;\n private validatingCount = 0;\n private readonly asyncErrors = new Map<string, string>();\n private readonly immediateAbortControllers = new Map<\n string,\n AbortController\n >();\n private readonly validationPipeline: BitPipelineRunner<\n ValidationPipelineContext<T>\n >;\n private readonly schedule: (fn: () => void, delayMs: number) => () => void;\n private readonly asyncScheduler: BitAsyncValidationScheduler<T>;\n private readonly debouncer: BitValidationDebouncer;\n\n constructor(private store: BitValidationStorePort<T>) {\n this.schedule =\n store.config.scheduler?.schedule ??\n ((fn, delayMs) => {\n const timeoutId = setTimeout(fn, delayMs);\n return () => clearTimeout(timeoutId);\n });\n\n this.debouncer = new BitValidationDebouncer({\n schedule: (fn, delayMs) => this.schedule(fn, delayMs),\n validate: (options) => this.validate(options),\n validationDelay: store.config.validationDelay ?? 300,\n });\n\n this.asyncScheduler = new BitAsyncValidationScheduler<T>({\n schedule: (fn, delayMs) => this.schedule(fn, delayMs),\n getValues: () => this.store.getState().values,\n setFieldValidating: (path, isValidating) =>\n this.updateFieldValidating(path, isValidating),\n setAsyncError: (path, message) => {\n this.asyncErrors.set(path, message);\n this.store.setError(path, message);\n },\n clearAsyncError: (path) => {\n this.asyncErrors.delete(path);\n },\n onValidationPassed: async (path) => {\n await this.commitSynchronousScopeValidation([path]);\n },\n });\n\n this.validationPipeline = new BitPipelineRunner<\n ValidationPipelineContext<T>\n >([\n {\n name: \"validate:resolve-target-fields\",\n run: (ctx) => this.resolveTargetFields(ctx),\n },\n {\n name: \"validate:before-hooks\",\n run: async (ctx) => this.runBeforeValidateHooks(ctx),\n },\n {\n name: \"validate:sync-track\",\n run: async (ctx) => this.runSynchronousTrack(ctx),\n },\n {\n name: \"validate:async-track\",\n run: async (ctx) => this.runAsyncTrack(ctx),\n },\n {\n name: \"validate:abort-check\",\n run: async (ctx) => this.abortIfOutdated(ctx),\n },\n {\n name: \"validate:async-track-merge\",\n run: (ctx) => this.mergeAsyncTrack(ctx),\n },\n {\n name: \"validate:commit\",\n run: async (ctx) => this.commitValidation(ctx),\n },\n ]);\n }\n\n private updateFieldValidating(path: string, isValidating: boolean) {\n const currentState = this.store.getState();\n const currentValue = !!currentState.isValidating[path];\n\n if (currentValue === isValidating) {\n return;\n }\n\n const nextValidating = { ...currentState.isValidating };\n\n if (isValidating) {\n nextValidating[path] = true;\n this.validatingCount += 1;\n } else {\n delete nextValidating[path];\n this.validatingCount = Math.max(0, this.validatingCount - 1);\n }\n\n this.store.dispatch(\n patchStateOperation({\n isValidating: nextValidating,\n }),\n );\n }\n\n private cancelFieldAsync(path: string) {\n this.asyncScheduler.cancel(path);\n\n const abortController = this.immediateAbortControllers.get(path);\n if (abortController) {\n abortController.abort();\n this.immediateAbortControllers.delete(path);\n }\n }\n\n cleanupField(path: string) {\n this.cancelFieldAsync(path);\n this.asyncErrors.delete(path);\n this.updateFieldValidating(path, false);\n }\n\n cleanupPrefix(prefix: string) {\n this.asyncScheduler.cleanupPrefix(prefix);\n\n for (const path of this.immediateAbortControllers.keys()) {\n if (path === prefix || path.startsWith(`${prefix}.`)) {\n this.cleanupField(path);\n }\n }\n }\n\n beginExternalValidation(path: string) {\n this.cancelFieldAsync(path);\n this.updateFieldValidating(path, true);\n }\n\n endExternalValidation(path: string) {\n this.updateFieldValidating(path, false);\n }\n\n async setExternalError(path: string, message: string | undefined) {\n if (message) {\n this.asyncErrors.set(path, message);\n this.store.setError(path, message);\n return;\n }\n\n this.asyncErrors.delete(path);\n\n if (this.store.validate) {\n await this.store.validate({ scopeFields: [path] });\n return;\n }\n\n const newErrors = { ...this.store.getState().errors };\n delete newErrors[path as keyof BitErrors<T>];\n this.store.dispatch(\n validationCommitOperation(newErrors, !hasAnyError(newErrors)),\n );\n }\n\n handleAsync(path: string, value: any) {\n const config = this.store.getFieldConfig(path);\n const asyncValidate = config?.validation?.asyncValidate;\n const asyncValidateOn = config?.validation?.asyncValidateOn ?? \"blur\";\n\n if (!asyncValidate || asyncValidateOn !== \"change\") {\n this.cancelFieldAsync(path);\n this.updateFieldValidating(path, false);\n return;\n }\n\n const delay = config.validation?.asyncValidateDelay ?? 500;\n this.asyncScheduler.handle(path, value, asyncValidate, delay);\n }\n\n hasValidationsInProgress(scopeFields?: string[]) {\n const state = this.store.getState();\n\n if (scopeFields && scopeFields.length > 0) {\n return scopeFields.some((field) => !!state.isValidating[field]);\n }\n\n return this.validatingCount > 0;\n }\n\n trigger(scopeFields?: string[], options?: BitValidationTriggerOptions) {\n this.debouncer.trigger(scopeFields, options);\n }\n\n async validate(options?: BitValidationOptions): Promise<boolean> {\n const context: ValidationPipelineContext<T> = {\n options,\n validationId: ++this.currentValidationId,\n currentState: this.store.getState(),\n targetFields: options?.scopeFields,\n allErrors: {},\n committedErrors: {},\n isValid: true,\n result: true,\n aborted: false,\n };\n\n await this.validationPipeline.run(context);\n\n return context.result;\n }\n\n clear(path: string) {\n this.cancelFieldAsync(path);\n this.updateFieldValidating(path, false);\n this.asyncErrors.delete(path);\n }\n\n cancelAll() {\n this.validatingCount = 0;\n this.debouncer.cancelPending();\n this.asyncScheduler.cancelAll();\n this.asyncErrors.clear();\n\n this.immediateAbortControllers.forEach((controller) => {\n controller.abort();\n });\n this.immediateAbortControllers.clear();\n\n this.store.dispatch(patchStateOperation({ isValidating: {} }));\n }\n\n private resolveTargetFields(ctx: ValidationPipelineContext<T>) {\n if (ctx.options?.scope) {\n const scopeFields = this.store.getScopeFields(ctx.options.scope);\n if (scopeFields.length > 0) {\n ctx.targetFields = scopeFields;\n }\n }\n }\n\n private async runBeforeValidateHooks(ctx: ValidationPipelineContext<T>) {\n await this.store.emitBeforeValidate({\n values: ctx.currentState.values,\n state: ctx.currentState,\n scope: ctx.options?.scope,\n scopeFields: ctx.targetFields,\n });\n }\n\n private async runSynchronousTrack(ctx: ValidationPipelineContext<T>) {\n const resolverErrors = this.store.config.resolver\n ? await this.store.config.resolver(ctx.currentState.values, {\n scopeFields: ctx.targetFields,\n })\n : {};\n\n const dynamicRequiredErrors = this.store.getRequiredErrors(\n ctx.currentState.values,\n );\n\n ctx.allErrors = { ...resolverErrors, ...dynamicRequiredErrors };\n\n this.store.getHiddenFields().forEach((hiddenPath) => {\n delete ctx.allErrors[hiddenPath];\n this.asyncErrors.delete(hiddenPath);\n });\n }\n\n private async runAsyncTrack(ctx: ValidationPipelineContext<T>) {\n const targetPaths = resolveAsyncValidationPaths<T>({\n targetFields: ctx.targetFields,\n hiddenFields: this.store.getHiddenFields(),\n getFieldConfig: (path) => this.store.getFieldConfig(path),\n forEachFieldConfig: this.store.forEachFieldConfig,\n });\n\n if (targetPaths.length === 0) {\n return;\n }\n\n await Promise.all(\n targetPaths.map((path) =>\n this.runImmediateAsyncValidation(\n path,\n ctx.currentState.values,\n ctx.validationId,\n ),\n ),\n );\n }\n\n private mergeAsyncTrack(ctx: ValidationPipelineContext<T>) {\n const merged = mergeValidationErrors<T>({\n targetFields: ctx.targetFields,\n currentErrors: ctx.currentState.errors,\n allErrors: ctx.allErrors,\n asyncErrors: this.asyncErrors,\n });\n\n ctx.committedErrors = merged.committedErrors;\n ctx.isValid = !hasAnyError(merged.committedErrors);\n ctx.result = merged.mode === \"scoped\" ? merged.result : ctx.isValid;\n }\n\n private async abortIfOutdated(ctx: ValidationPipelineContext<T>) {\n if (ctx.validationId === this.currentValidationId) {\n return;\n }\n\n ctx.aborted = true;\n ctx.result = ctx.currentState.isValid;\n\n await this.store.emitAfterValidate({\n values: this.store.getState().values,\n state: this.store.getState(),\n scope: ctx.options?.scope,\n scopeFields: ctx.targetFields,\n errors: this.store.getState().errors,\n result: ctx.currentState.isValid,\n aborted: true,\n });\n\n ctx.halted = true;\n }\n\n private async commitValidation(ctx: ValidationPipelineContext<T>) {\n this.store.dispatch(\n validationCommitOperation(ctx.committedErrors, ctx.isValid),\n );\n\n await this.store.emitAfterValidate({\n values: this.store.getState().values,\n state: this.store.getState(),\n scope: ctx.options?.scope,\n scopeFields: ctx.targetFields,\n errors: ctx.committedErrors,\n result: ctx.result,\n });\n\n ctx.halted = true;\n }\n\n private async runImmediateAsyncValidation(\n path: string,\n values: T,\n validationId: number,\n ) {\n await runImmediateAsyncValidationStage<T>({\n path,\n values,\n validationId,\n currentValidationId: this.currentValidationId,\n getFieldConfig: (fieldPath) => this.store.getFieldConfig(fieldPath),\n cancelFieldAsync: (fieldPath) => this.cancelFieldAsync(fieldPath),\n createAbortController: () => new AbortController(),\n setAbortController: (fieldPath, controller) => {\n this.immediateAbortControllers.set(fieldPath, controller);\n },\n clearAbortController: (fieldPath) => {\n this.immediateAbortControllers.delete(fieldPath);\n },\n setFieldValidating: (fieldPath, isValidating) =>\n this.updateFieldValidating(fieldPath, isValidating),\n setAsyncError: (fieldPath, message) => {\n this.asyncErrors.set(fieldPath, message);\n },\n clearAsyncError: (fieldPath) => {\n this.asyncErrors.delete(fieldPath);\n },\n });\n }\n\n private async commitSynchronousScopeValidation(scopeFields: string[]) {\n const currentState = this.store.getState();\n const resolverErrors = this.store.config.resolver\n ? await this.store.config.resolver(currentState.values, {\n scopeFields,\n })\n : {};\n\n const dynamicRequiredErrors = this.store.getRequiredErrors(\n currentState.values,\n );\n const allErrors = { ...resolverErrors, ...dynamicRequiredErrors };\n\n this.store.getHiddenFields().forEach((hiddenPath) => {\n delete allErrors[hiddenPath];\n this.asyncErrors.delete(hiddenPath);\n });\n\n const scopedErrors = { ...currentState.errors } as BitErrors<T>;\n\n scopeFields.forEach((field) => {\n if (allErrors[field]) {\n scopedErrors[field as keyof BitErrors<T>] = allErrors[field];\n } else if (this.asyncErrors.has(field)) {\n scopedErrors[field as keyof BitErrors<T>] =\n this.asyncErrors.get(field)!;\n } else {\n delete scopedErrors[field as keyof BitErrors<T>];\n }\n });\n\n this.store.dispatch(\n validationCommitOperation(scopedErrors, !hasAnyError(scopedErrors)),\n );\n }\n}\n","import type { BitErrors, BitFieldChangeMeta } from \"../../../contracts/types\";\nimport { getDeepValue, setDeepValue } from \"../../../../utils\";\nimport {\n BitPipelineContext,\n BitSyncPipelineRunner,\n} from \"../../../shared/pipeline\";\nimport { patchStateOperation } from \"../../../engines/operation-engine\";\nimport type { BitLifecycleStorePort } from \"../../../contracts/port-types\";\n\ninterface FieldUpdatePipelineContext<\n T extends object,\n> extends BitPipelineContext {\n path: string;\n value: any;\n meta: BitFieldChangeMeta;\n previousValue: unknown;\n nextValues: T;\n nextErrors: BitErrors<T>;\n hasMutatedErrors: boolean;\n toggledFields: string[];\n isDirty: boolean;\n}\n\nexport class BitFieldUpdateManager<T extends object> {\n private readonly fieldUpdatePipeline: BitSyncPipelineRunner<\n FieldUpdatePipelineContext<T>\n >;\n private readonly reusableContext: FieldUpdatePipelineContext<T> = {\n path: \"\",\n value: undefined,\n meta: { origin: \"setField\" },\n previousValue: undefined,\n nextValues: {} as T,\n nextErrors: {} as BitErrors<T>,\n hasMutatedErrors: false,\n toggledFields: [],\n isDirty: false,\n };\n private isReusableContextBusy = false;\n\n constructor(private readonly store: BitLifecycleStorePort<T>) {\n this.fieldUpdatePipeline = new BitSyncPipelineRunner<\n FieldUpdatePipelineContext<T>\n >([\n {\n name: \"field:clear-current-error\",\n run: (ctx) => this.clearCurrentError(ctx),\n },\n {\n name: \"field:update-dependencies\",\n run: (ctx) => this.updateDependencies(ctx),\n },\n { name: \"field:update-dirty\", run: (ctx) => this.updateDirtyState(ctx) },\n { name: \"field:commit-state\", run: (ctx) => this.commitFieldState(ctx) },\n { name: \"field:emit-change\", run: (ctx) => this.emitFieldChange(ctx) },\n {\n name: \"field:trigger-validate\",\n run: (ctx) => this.triggerResolverValidation(ctx),\n },\n {\n name: \"field:trigger-async-validate\",\n run: (ctx) => this.triggerAsyncValidation(ctx),\n },\n ]);\n }\n\n updateField(\n path: string,\n value: any,\n meta: BitFieldChangeMeta = { origin: \"setField\" },\n ) {\n const state = this.store.getState();\n const context = this.acquireContext();\n\n context.path = path;\n context.value = value;\n context.meta = meta;\n context.previousValue = getDeepValue(state.values, path);\n context.nextValues = setDeepValue(state.values, path, value);\n context.nextErrors = state.errors;\n context.hasMutatedErrors = false;\n context.toggledFields.length = 0;\n context.isDirty = false;\n\n const isReusableContext = context === this.reusableContext;\n if (isReusableContext) {\n this.isReusableContextBusy = true;\n }\n\n try {\n this.fieldUpdatePipeline.run(context);\n } finally {\n if (isReusableContext) {\n this.isReusableContextBusy = false;\n }\n }\n }\n\n private acquireContext(): FieldUpdatePipelineContext<T> {\n if (!this.isReusableContextBusy) {\n return this.reusableContext;\n }\n\n return {\n path: \"\",\n value: undefined,\n meta: { origin: \"setField\" },\n previousValue: undefined,\n nextValues: {} as T,\n nextErrors: {} as BitErrors<T>,\n hasMutatedErrors: false,\n toggledFields: [],\n isDirty: false,\n };\n }\n\n private clearCurrentError(ctx: FieldUpdatePipelineContext<T>) {\n const hasCurrentError = Object.prototype.hasOwnProperty.call(\n ctx.nextErrors,\n ctx.path,\n );\n\n if (hasCurrentError && !ctx.hasMutatedErrors) {\n ctx.nextErrors = { ...ctx.nextErrors };\n ctx.hasMutatedErrors = true;\n }\n\n if (hasCurrentError) {\n delete ctx.nextErrors[ctx.path as keyof BitErrors<T>];\n }\n\n this.store.clearFieldValidation(ctx.path);\n }\n\n private updateDependencies(ctx: FieldUpdatePipelineContext<T>) {\n if (\n typeof this.store.hasDependentFields === \"function\" &&\n !this.store.hasDependentFields(ctx.path)\n ) {\n ctx.toggledFields.length = 0;\n return;\n }\n\n ctx.toggledFields = this.store.updateDependencies(ctx.path, ctx.nextValues);\n\n ctx.toggledFields.forEach((depPath) => {\n if (this.store.isFieldHidden(depPath)) {\n const hasDependencyError = Object.prototype.hasOwnProperty.call(\n ctx.nextErrors,\n depPath,\n );\n\n if (hasDependencyError && !ctx.hasMutatedErrors) {\n ctx.nextErrors = { ...ctx.nextErrors };\n ctx.hasMutatedErrors = true;\n }\n\n if (hasDependencyError) {\n delete ctx.nextErrors[depPath as keyof BitErrors<T>];\n }\n\n this.store.clearFieldValidation(depPath);\n }\n });\n }\n\n private updateDirtyState(ctx: FieldUpdatePipelineContext<T>) {\n ctx.isDirty = this.store.updateDirtyForPath(\n ctx.path,\n ctx.nextValues,\n this.store.getInitialValues(),\n );\n }\n\n private commitFieldState(ctx: FieldUpdatePipelineContext<T>) {\n this.store.dispatch(\n patchStateOperation(\n {\n values: ctx.nextValues,\n errors: ctx.nextErrors,\n isDirty: ctx.isDirty,\n },\n [ctx.path, ...ctx.toggledFields],\n ),\n );\n }\n\n private emitFieldChange(ctx: FieldUpdatePipelineContext<T>) {\n this.store.emitFieldChange({\n path: ctx.path,\n previousValue: ctx.previousValue,\n nextValue: ctx.value,\n values: this.store.getState().values,\n state: this.store.getState(),\n meta: ctx.meta,\n });\n }\n\n private triggerResolverValidation(ctx: FieldUpdatePipelineContext<T>) {\n if (this.store.config.resolver) {\n this.store.triggerValidation([ctx.path]);\n }\n }\n\n private triggerAsyncValidation(ctx: FieldUpdatePipelineContext<T>) {\n const asyncValidateOn =\n typeof this.store.getFieldConfig === \"function\"\n ? this.store.getFieldConfig(ctx.path)?.validation?.asyncValidateOn\n : undefined;\n\n if (asyncValidateOn !== \"change\") {\n return;\n }\n\n this.store.handleFieldAsyncValidation(ctx.path, ctx.value);\n }\n}\n","import type { DeepPartial } from \"../../../contracts/types\";\nimport { deepClone, deepMerge } from \"../../../../utils\";\nimport { patchStateOperation } from \"../../../engines/operation-engine\";\nimport type { BitLifecycleStorePort } from \"../../../contracts/port-types\";\n\nexport class BitValuesLifecycleManager<T extends object> {\n constructor(private readonly store: BitLifecycleStorePort<T>) {}\n\n setValues(\n newValues: T | DeepPartial<T>,\n options?: { partial?: boolean; rebase?: boolean },\n ) {\n if (options?.rebase) {\n this.rebaseValues(newValues as T);\n return;\n }\n\n if (options?.partial) {\n this.hydrateValues(newValues as DeepPartial<T>);\n return;\n }\n\n this.replaceValuesInternal(newValues as T, \"replaceValues\");\n }\n\n hydrateValues(values: DeepPartial<T>) {\n const mergedValues = deepMerge(this.store.getState().values, values);\n this.replaceValuesInternal(mergedValues, \"hydrate\");\n }\n\n rebaseValues(newValues: T) {\n const previousValues = this.store.getState().values;\n const clonedValues = deepClone(newValues);\n\n this.store.setInitialValues(deepClone(clonedValues));\n\n this.store.cancelAllValidations();\n this.store.evaluateAllDependencies(clonedValues);\n\n this.store.clearDirtyState();\n\n this.store.dispatch(\n patchStateOperation(\n {\n values: clonedValues,\n errors: {},\n touched: {},\n isValidating: {},\n isValid: true,\n isDirty: false,\n isSubmitting: false,\n },\n [\"*\"],\n ),\n );\n\n this.store.internalSaveSnapshot();\n this.store.validateNow();\n\n this.store.emitFieldChange({\n path: \"*\",\n previousValue: previousValues,\n nextValue: clonedValues,\n values: this.store.getState().values,\n state: this.store.getState(),\n meta: { origin: \"rebase\" },\n });\n }\n\n applyHistoryState(snapshot: T) {\n const isDirty = this.store.rebuildDirtyState(\n snapshot,\n this.store.getInitialValues(),\n );\n\n this.store.dispatch(\n patchStateOperation(\n {\n values: snapshot,\n isDirty,\n },\n [\"*\"],\n ),\n );\n\n this.store.triggerValidation(undefined, { forceDebounce: true });\n }\n\n reset() {\n this.store.cancelAllValidations();\n\n const initialCloned = deepClone(this.store.getInitialValues());\n\n this.store.evaluateAllDependencies(initialCloned);\n\n this.store.clearDirtyState();\n\n this.store.dispatch(\n patchStateOperation(\n {\n values: initialCloned,\n errors: {},\n touched: {},\n isValidating: {},\n isValid: true,\n isDirty: false,\n isSubmitting: false,\n },\n [\"*\"],\n ),\n );\n\n this.store.resetHistory(initialCloned);\n }\n\n private replaceValuesInternal(\n newValues: T,\n origin: \"replaceValues\" | \"hydrate\" = \"replaceValues\",\n ) {\n const previousValues = this.store.getState().values;\n const clonedValues = deepClone(newValues);\n\n this.store.cancelAllValidations();\n this.store.evaluateAllDependencies(clonedValues);\n\n const isDirty = this.store.rebuildDirtyState(\n clonedValues,\n this.store.getInitialValues(),\n );\n\n this.store.dispatch(\n patchStateOperation(\n {\n values: clonedValues,\n errors: {},\n isValidating: {},\n isValid: true,\n isDirty,\n isSubmitting: false,\n },\n [\"*\"],\n ),\n );\n\n this.store.internalSaveSnapshot();\n this.store.validateNow();\n\n this.store.emitFieldChange({\n path: \"*\",\n previousValue: previousValues,\n nextValue: clonedValues,\n values: this.store.getState().values,\n state: this.store.getState(),\n meta: { origin },\n });\n }\n}\n","import { deepClone, getDeepValue, setDeepValues } from \"../../../../utils\";\nimport {\n BitPipelineContext,\n BitPipelineRunner,\n} from \"../../../shared/pipeline\";\nimport { patchStateOperation } from \"../../../engines/operation-engine\";\nimport type { BitLifecycleStorePort } from \"../../../contracts/port-types\";\n\ninterface SubmitPipelineContext<T extends object> extends BitPipelineContext {\n onSuccess: (values: T, dirtyValues?: Partial<T>) => void | Promise<void>;\n isValid: boolean;\n valuesToSubmit: T;\n dirtyValues: Partial<T>;\n error?: unknown;\n invalid?: boolean;\n}\n\nexport class BitSubmitLifecycleManager<T extends object> {\n private readonly submitPipeline: BitPipelineRunner<SubmitPipelineContext<T>>;\n\n constructor(private readonly store: BitLifecycleStorePort<T>) {\n this.submitPipeline = new BitPipelineRunner<SubmitPipelineContext<T>>([\n { name: \"submit:start\", run: async (ctx) => this.startSubmit(ctx) },\n {\n name: \"submit:invalid\",\n run: async (ctx) => this.handleInvalidSubmit(ctx),\n },\n { name: \"submit:prepare\", run: (ctx) => this.prepareSubmitValues(ctx) },\n {\n name: \"submit:before-hooks\",\n run: async (ctx) => this.runBeforeSubmitHooks(ctx),\n },\n {\n name: \"submit:user-handler\",\n run: async (ctx) => this.runSubmitHandler(ctx),\n },\n {\n name: \"submit:after-hooks\",\n run: async (ctx) => this.runAfterSubmitHooks(ctx),\n },\n ]);\n }\n\n async submit(\n onSuccess: (values: T, dirtyValues?: Partial<T>) => void | Promise<void>,\n ) {\n const currentState = this.store.getState();\n\n if (currentState.isSubmitting) return;\n\n if (this.store.hasValidationsInProgress()) return;\n\n this.store.cancelAllValidations();\n\n const context: SubmitPipelineContext<T> = {\n onSuccess,\n isValid: false,\n valuesToSubmit: deepClone(this.store.getState().values),\n dirtyValues: {},\n };\n\n try {\n await this.submitPipeline.run(context);\n } catch (error) {\n context.error = error;\n\n await this.store.emitOperationalError({\n source: \"submit\",\n error,\n });\n\n await this.store.emitAfterSubmit({\n values: this.store.getState().values,\n dirtyValues: this.store.buildDirtyValues(this.store.getState().values),\n state: this.store.getState(),\n success: false,\n error,\n });\n\n console.error(error);\n } finally {\n this.store.dispatch(patchStateOperation({ isSubmitting: false }));\n }\n }\n\n private async startSubmit(ctx: SubmitPipelineContext<T>) {\n this.store.dispatch(patchStateOperation({ isSubmitting: true }));\n ctx.isValid = await this.store.validateNow();\n }\n\n private async handleInvalidSubmit(ctx: SubmitPipelineContext<T>) {\n if (ctx.isValid) return;\n\n const currentErrors = this.store.getState().errors;\n const newTouched = { ...this.store.getState().touched };\n\n Object.keys(currentErrors).forEach((path) => {\n newTouched[path as keyof typeof newTouched] = true;\n });\n\n this.store.batchStateUpdates(() => {\n this.store.dispatch(patchStateOperation({ touched: newTouched }));\n });\n\n ctx.dirtyValues = this.store.buildDirtyValues(this.store.getState().values);\n ctx.invalid = true;\n\n await this.store.emitAfterSubmit({\n values: this.store.getState().values,\n dirtyValues: ctx.dirtyValues,\n state: this.store.getState(),\n success: false,\n invalid: true,\n });\n\n ctx.halted = true;\n }\n\n private prepareSubmitValues(ctx: SubmitPipelineContext<T>) {\n const updates: Array<[string, unknown]> = [];\n\n this.store.getHiddenFields().forEach((hiddenPath) => {\n updates.push([hiddenPath, undefined]);\n });\n\n for (const [path, transformer] of this.store.getTransformEntries()) {\n const currentVal = getDeepValue(ctx.valuesToSubmit, path);\n updates.push([\n path,\n transformer(currentVal, this.store.getState().values),\n ]);\n }\n\n if (updates.length > 0) {\n ctx.valuesToSubmit = setDeepValues(ctx.valuesToSubmit, updates);\n }\n\n ctx.dirtyValues = this.store.buildDirtyValues(ctx.valuesToSubmit);\n }\n\n private async runBeforeSubmitHooks(ctx: SubmitPipelineContext<T>) {\n await this.store.emitBeforeSubmit({\n values: ctx.valuesToSubmit,\n dirtyValues: ctx.dirtyValues,\n state: this.store.getState(),\n });\n }\n\n private async runSubmitHandler(ctx: SubmitPipelineContext<T>) {\n await ctx.onSuccess(ctx.valuesToSubmit, ctx.dirtyValues);\n }\n\n private async runAfterSubmitHooks(ctx: SubmitPipelineContext<T>) {\n await this.store.emitAfterSubmit({\n values: ctx.valuesToSubmit,\n dirtyValues: ctx.dirtyValues,\n state: this.store.getState(),\n success: true,\n });\n }\n}\n","import { BitFieldChangeMeta, DeepPartial } from \"../../contracts/types\";\nimport type { BitLifecycleStorePort } from \"../../contracts/port-types\";\nimport { BitFieldUpdateManager } from \"./lifecycle/field-update-manager\";\nimport { BitValuesLifecycleManager } from \"./lifecycle/values-lifecycle-manager\";\nimport { BitSubmitLifecycleManager } from \"./lifecycle/submit-lifecycle-manager\";\n\nexport class BitLifecycleManager<T extends object> {\n private readonly fieldUpdate: BitFieldUpdateManager<T>;\n private readonly values: BitValuesLifecycleManager<T>;\n private readonly submitFlow: BitSubmitLifecycleManager<T>;\n\n constructor(private readonly store: BitLifecycleStorePort<T>) {\n this.fieldUpdate = new BitFieldUpdateManager<T>(store);\n this.values = new BitValuesLifecycleManager<T>(store);\n this.submitFlow = new BitSubmitLifecycleManager<T>(store);\n }\n\n updateField(\n path: string,\n value: any,\n meta: BitFieldChangeMeta = { origin: \"setField\" },\n ) {\n this.fieldUpdate.updateField(path, value, meta);\n }\n\n setValues(\n newValues: T | DeepPartial<T>,\n options?: { partial?: boolean; rebase?: boolean },\n ) {\n this.values.setValues(newValues, options);\n }\n\n hydrateValues(values: DeepPartial<T>) {\n this.values.hydrateValues(values);\n }\n\n rebaseValues(newValues: T) {\n this.values.rebaseValues(newValues);\n }\n\n applyHistoryState(snapshot: T) {\n this.values.applyHistoryState(snapshot);\n }\n\n async submit(\n onSuccess: (values: T, dirtyValues?: Partial<T>) => void | Promise<void>,\n ) {\n return this.submitFlow.submit(onSuccess);\n }\n\n reset() {\n this.values.reset();\n }\n}\n","import {\n deepClone,\n deepEqual,\n setDeepValue,\n unsetDeepValue,\n} from \"../../utils\";\n\ntype HistoryDirection = \"undo\" | \"redo\";\n\nexport interface BitHistoryPatchOperation {\n path: string;\n previousValue: unknown;\n nextValue: unknown;\n hadPreviousValue: boolean;\n hasNextValue: boolean;\n}\n\nexport interface BitHistoryPatch<T extends object> {\n operations: BitHistoryPatchOperation[];\n _type?: T;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n !(value instanceof Date) &&\n !(value instanceof RegExp)\n );\n}\n\nexport function createHistoryPatch<T extends object>(\n previousValue: T,\n nextValue: T,\n): BitHistoryPatch<T> {\n const operations: BitHistoryPatchOperation[] = [];\n\n const visit = (\n previousNode: unknown,\n nextNode: unknown,\n path: string,\n hadPreviousValue: boolean,\n hasNextValue: boolean,\n ) => {\n if (hadPreviousValue && hasNextValue && deepEqual(previousNode, nextNode)) {\n return;\n }\n\n if (\n isPlainObject(previousNode) &&\n isPlainObject(nextNode) &&\n hadPreviousValue &&\n hasNextValue\n ) {\n const keys = new Set<string>([\n ...Object.keys(previousNode),\n ...Object.keys(nextNode),\n ]);\n\n for (const key of keys) {\n const childPath = path ? `${path}.${key}` : key;\n const childHasPrevious = Object.prototype.hasOwnProperty.call(\n previousNode,\n key,\n );\n const childHasNext = Object.prototype.hasOwnProperty.call(\n nextNode,\n key,\n );\n\n visit(\n previousNode[key],\n nextNode[key],\n childPath,\n childHasPrevious,\n childHasNext,\n );\n }\n return;\n }\n\n operations.push({\n path,\n previousValue: deepClone(previousNode),\n nextValue: deepClone(nextNode),\n hadPreviousValue,\n hasNextValue,\n });\n };\n\n visit(previousValue, nextValue, \"\", true, true);\n\n return {\n operations,\n };\n}\n\nexport function applyHistoryPatch<T extends object>(\n currentValue: T,\n patch: BitHistoryPatch<T>,\n direction: HistoryDirection,\n): T {\n let nextValue: unknown = currentValue;\n\n for (const operation of patch.operations) {\n const shouldSet =\n direction === \"undo\"\n ? operation.hadPreviousValue\n : operation.hasNextValue;\n const value =\n direction === \"undo\" ? operation.previousValue : operation.nextValue;\n\n if (!operation.path) {\n nextValue = shouldSet ? deepClone(value) : {};\n continue;\n }\n\n nextValue = shouldSet\n ? setDeepValue(nextValue, operation.path, deepClone(value))\n : unsetDeepValue(nextValue, operation.path);\n }\n\n return nextValue as T;\n}\n","import { deepClone, deepEqual } from \"../../../utils\";\nimport {\n applyHistoryPatch,\n createHistoryPatch,\n type BitHistoryPatch,\n} from \"../../engines/snapshot-diff-engine\";\n\nexport class BitHistoryManager<T extends object = any> {\n private baseSnapshot: T | null = null;\n private currentSnapshot: T | null = null;\n private patches: BitHistoryPatch<T>[] = [];\n private historyIndex = -1;\n private historySize = 0;\n\n constructor(\n private enableHistory: boolean,\n private maxHistory: number = 15,\n ) {}\n\n saveSnapshot(values: T) {\n if (!this.enableHistory) return;\n\n if (!this.currentSnapshot || this.baseSnapshot === null) {\n this.reset(values);\n return;\n }\n\n if (deepEqual(this.currentSnapshot, values)) {\n return;\n }\n\n if (this.historyIndex < this.historySize - 1) {\n this.patches.splice(this.historyIndex);\n this.historySize = this.historyIndex + 1;\n }\n\n const patch = createHistoryPatch(this.currentSnapshot, values);\n if (patch.operations.length === 0) {\n return;\n }\n\n this.patches.push(patch);\n this.currentSnapshot = deepClone(values);\n this.historyIndex += 1;\n this.historySize = this.historyIndex + 1;\n\n while (this.historySize > this.getCapacity()) {\n this.compactOldestSnapshot();\n }\n }\n\n get canUndo(): boolean {\n return this.enableHistory ? this.historyIndex > 0 : false;\n }\n\n get canRedo(): boolean {\n return this.enableHistory\n ? this.historyIndex < this.historySize - 1\n : false;\n }\n\n undo(): T | null {\n if (!this.canUndo || !this.currentSnapshot) {\n return null;\n }\n\n const patch = this.patches[this.historyIndex - 1];\n const previousSnapshot = applyHistoryPatch(\n this.currentSnapshot,\n patch,\n \"undo\",\n );\n\n this.currentSnapshot = deepClone(previousSnapshot);\n this.historyIndex -= 1;\n return previousSnapshot;\n }\n\n redo(): T | null {\n if (!this.canRedo || !this.currentSnapshot) {\n return null;\n }\n\n const patch = this.patches[this.historyIndex];\n const nextSnapshot = applyHistoryPatch(this.currentSnapshot, patch, \"redo\");\n\n this.currentSnapshot = deepClone(nextSnapshot);\n this.historyIndex += 1;\n return nextSnapshot;\n }\n\n reset(initialValues: T) {\n if (!this.enableHistory) {\n this.baseSnapshot = null;\n this.currentSnapshot = null;\n this.patches = [];\n this.historyIndex = -1;\n this.historySize = 0;\n return;\n }\n\n this.baseSnapshot = deepClone(initialValues);\n this.currentSnapshot = deepClone(initialValues);\n this.patches = [];\n this.historyIndex = 0;\n this.historySize = 1;\n }\n\n getMetadata(): {\n enabled: boolean;\n canUndo: boolean;\n canRedo: boolean;\n historyIndex: number;\n historySize: number;\n } {\n return {\n enabled: this.enableHistory,\n canUndo: this.canUndo,\n canRedo: this.canRedo,\n historyIndex: this.historyIndex,\n historySize: this.historySize,\n };\n }\n\n private compactOldestSnapshot() {\n const oldestPatch = this.patches.shift();\n if (!oldestPatch || this.baseSnapshot === null) {\n return;\n }\n\n this.baseSnapshot = applyHistoryPatch(\n this.baseSnapshot,\n oldestPatch,\n \"redo\",\n );\n this.historySize = Math.max(1, this.historySize - 1);\n this.historyIndex = Math.max(0, this.historyIndex - 1);\n }\n\n private getCapacity() {\n return Math.max(1, this.maxHistory);\n }\n}\n","import type {\n BitFieldChangeEvent,\n BitFieldChangeMeta,\n BitState,\n} from \"../../contracts/types\";\nimport {\n getDeepValue,\n setDeepValue,\n reindexFieldArrayMeta,\n} from \"../../../utils\";\nimport {\n BitStoreOperation,\n patchStateOperation,\n} from \"../../engines/operation-engine\";\n\nexport interface BitArrayStorePort<T extends object> {\n getState: () => BitState<T>;\n setFieldWithMeta: (\n path: string,\n value: any,\n meta: BitFieldChangeMeta,\n ) => void;\n emitFieldChange: (event: BitFieldChangeEvent<T>) => void;\n dispatch: (operation: BitStoreOperation<T>) => void;\n internalSaveSnapshot: () => void;\n unregisterPrefix?: (prefix: string) => void;\n triggerValidation: (scopeFields?: string[]) => void;\n updateDirtyForPath: (\n path: string,\n nextValues: T,\n baselineValues: T,\n ) => boolean;\n getConfig: () => Readonly<{ initialValues: T }>;\n}\n\nexport class BitArrayManager<T extends object = any> {\n constructor(private store: BitArrayStorePort<T>) {}\n\n pushItem(path: string, value: any) {\n this.mutateArrayWithSetField(path, (arr) => [...arr, value], {\n origin: \"array\",\n operation: \"push\",\n });\n }\n\n prependItem(path: string, value: any) {\n this.mutateArrayWithSetField(path, (arr) => [value, ...arr], {\n origin: \"array\",\n operation: \"prepend\",\n });\n }\n\n insertItem(path: string, index: number, value: any) {\n this.mutateArrayWithSetField(\n path,\n (arr) => {\n const next = [...arr];\n next.splice(index, 0, value);\n return next;\n },\n {\n origin: \"array\",\n operation: \"insert\",\n index,\n },\n );\n }\n\n removeItem(path: string, index: number) {\n const state = this.store.getState();\n const arr = getDeepValue(state.values, path);\n if (!Array.isArray(arr)) return;\n\n const previousArray = [...arr];\n\n if (this.store.unregisterPrefix) {\n this.store.unregisterPrefix(`${path}.${index}.`);\n }\n\n const newArray = arr.filter((_, i) => i !== index);\n\n this.commitReindexedArrayMutation({\n path,\n previousArray,\n nextArray: newArray,\n meta: { origin: \"array\", operation: \"remove\", index },\n reindex: (currentIdx) => {\n if (currentIdx === index) {\n return null;\n }\n\n return currentIdx > index ? currentIdx - 1 : currentIdx;\n },\n });\n }\n\n swapItems(path: string, indexA: number, indexB: number) {\n const state = this.store.getState();\n const arr = [...(getDeepValue(state.values, path) || [])];\n const previousArray = [...arr];\n [arr[indexA], arr[indexB]] = [arr[indexB], arr[indexA]];\n\n this.commitReindexedArrayMutation({\n path,\n previousArray,\n nextArray: arr,\n meta: {\n origin: \"array\",\n operation: \"swap\",\n from: indexA,\n to: indexB,\n },\n reindex: (currentIdx) => {\n if (currentIdx === indexA) {\n return indexB;\n }\n\n if (currentIdx === indexB) {\n return indexA;\n }\n\n return currentIdx;\n },\n });\n }\n\n moveItem(path: string, from: number, to: number) {\n const state = this.store.getState();\n const arr = [...(getDeepValue(state.values, path) || [])];\n const previousArray = [...arr];\n const [item] = arr.splice(from, 1);\n arr.splice(to, 0, item);\n\n this.commitReindexedArrayMutation({\n path,\n previousArray,\n nextArray: arr,\n meta: {\n origin: \"array\",\n operation: \"move\",\n from,\n to,\n },\n reindex: (currentIdx) => {\n if (currentIdx === from) {\n return to;\n }\n\n if (from < to && currentIdx > from && currentIdx <= to) {\n return currentIdx - 1;\n }\n\n if (from > to && currentIdx >= to && currentIdx < from) {\n return currentIdx + 1;\n }\n\n return currentIdx;\n },\n });\n }\n\n private revalidate(path: string) {\n this.store.triggerValidation([path]);\n }\n\n private mutateArrayWithSetField(\n path: string,\n mutate: (current: any[]) => any[],\n meta: BitFieldChangeMeta,\n ) {\n const current = getDeepValue(this.store.getState().values, path) || [];\n this.store.setFieldWithMeta(path, mutate(current), meta);\n this.store.internalSaveSnapshot();\n }\n\n private commitReindexedArrayMutation(args: {\n path: string;\n previousArray: unknown[];\n nextArray: unknown[];\n meta: BitFieldChangeMeta;\n reindex: (currentIdx: number) => number | null;\n }) {\n const { path, previousArray, nextArray, meta, reindex } = args;\n const state = this.store.getState();\n const newValues = setDeepValue(state.values, path, nextArray);\n\n const isDirty = this.store.updateDirtyForPath(\n path,\n newValues,\n this.store.getConfig().initialValues,\n );\n\n const reindexedMeta = reindexFieldArrayMeta(state, path, reindex);\n\n this.store.dispatch(\n patchStateOperation(\n {\n values: newValues,\n errors: reindexedMeta.errors,\n touched: reindexedMeta.touched,\n isValidating: reindexedMeta.isValidating,\n isDirty,\n },\n [path],\n ),\n );\n\n this.store.emitFieldChange({\n path,\n previousValue: previousArray,\n nextValue: nextArray,\n values: this.store.getState().values,\n state: this.store.getState(),\n meta,\n });\n\n this.store.internalSaveSnapshot();\n this.revalidate(path);\n }\n}\n","import { BitErrors, BitState } from \"../../contracts/types\";\nimport { getDeepValue, valueEqual } from \"../../../utils\";\n\n/**\n * BitScopeManager\n *\n * Manages multi-step forms and scope-based validation.\n * Scopes are groups of fields that can be validated and tracked independently,\n * useful for wizard-style forms or multi-section forms.\n */\nexport class BitScopeManager<T extends object = any> {\n constructor(\n private getState: () => BitState<T>,\n private getInitialValues: () => T,\n private getScopeFields: (scopeName: string) => string[],\n private isPathDirty: (path: string) => boolean,\n ) {}\n\n /**\n * Get validation status of a scope (step).\n * Returns whether the scope has errors, is dirty, and the error details.\n */\n getStepStatus(scopeName: string) {\n const fields = this.getScopeFields(scopeName);\n const state = this.getState();\n\n const hasErrors = fields.some(\n (f) => !!state.errors[f as keyof BitErrors<T>],\n );\n\n const isDirty = fields.some((f) => this.isPathDirty(f));\n\n const errors = this.getStepErrors(scopeName);\n\n return { hasErrors, isDirty, errors };\n }\n\n /**\n * Get all errors for fields in a specific scope.\n */\n getStepErrors(scopeName: string): Record<string, string> {\n const fields = this.getScopeFields(scopeName);\n const state = this.getState();\n const result: Record<string, string> = {};\n\n for (const field of fields) {\n const error = state.errors[field as keyof BitErrors<T>];\n if (error) {\n result[field] = error;\n }\n }\n\n return result;\n }\n}\n","import { BitState } from \"../../contracts/types\";\nimport { BitFieldRegistry } from \"../../registry/field-registry\";\n\n/**\n * BitFieldQueryManager\n *\n * Provides query methods for field state without mutating.\n * All methods are read-only and delegate to appropriate managers.\n */\nexport class BitFieldQueryManager<T extends object = any> {\n private requiredValuesRef: T | null = null;\n\n constructor(\n private fieldRegistry: BitFieldRegistry<T>,\n private getState: () => BitState<T>,\n private isPathDirty: (path: string) => boolean,\n ) {}\n\n /**\n * Check if a field is hidden based on conditional logic.\n */\n isHidden<P extends string>(path: P): boolean {\n return this.fieldRegistry.isHidden(path);\n }\n\n /**\n * Check if a field is required based on conditional logic.\n */\n isRequired<P extends string>(path: P): boolean {\n const values = this.getState().values;\n\n if (this.requiredValuesRef !== values) {\n this.requiredValuesRef = values;\n }\n\n return this.fieldRegistry.isRequired(path, values);\n }\n\n /**\n * Check if a field has been modified from its initial value.\n */\n isFieldDirty(path: string): boolean {\n return this.isPathDirty(path);\n }\n\n /**\n * Check if a field is currently validating (async validation in progress).\n */\n isFieldValidating(path: string): boolean {\n return !!this.getState().isValidating[path];\n }\n\n isTouched(path: string): boolean {\n return !!this.getState().touched[path];\n }\n}\n","import { BitErrors, BitState } from \"../../contracts/types\";\nimport {\n BitStoreOperation,\n patchStateOperation,\n} from \"../../engines/operation-engine\";\n\n/**\n * BitErrorManager\n *\n * Manages error state for fields.\n * Handles setting individual errors, batch errors, and server errors.\n */\nexport class BitErrorManager<T extends object = any> {\n constructor(\n private getState: () => BitState<T>,\n private dispatch: (operation: BitStoreOperation<T>) => void,\n ) {}\n\n /**\n * Set or clear error for a single field.\n * Pass undefined to clear the error.\n */\n setError(path: string, message: string | undefined): void {\n const newErrors = {\n ...this.getState().errors,\n [path]: message,\n } as BitErrors<T>;\n\n if (!message) {\n delete newErrors[path as keyof BitErrors<T>];\n }\n\n this.dispatch(patchStateOperation({ errors: newErrors }));\n }\n\n /**\n * Set multiple field errors at once (merge behavior).\n */\n setErrors(errors: BitErrors<T>): void {\n this.dispatch(\n patchStateOperation({\n errors: { ...this.getState().errors, ...errors },\n }),\n );\n }\n\n /**\n * Set errors from server response (converts arrays to first element).\n * Useful for handling 422 validation error responses.\n */\n setServerErrors(serverErrors: Record<string, string[] | string>): void {\n const formattedErrors: BitErrors<T> = {};\n\n for (const [key, value] of Object.entries(serverErrors)) {\n formattedErrors[key as keyof BitErrors<T>] = Array.isArray(value)\n ? value[0]\n : value;\n }\n\n this.setErrors(formattedErrors);\n }\n}\n","import { BitBusListener, BitFormGlobal } from \"../contracts/bus-types\";\n\ndeclare global {\n var __BIT_FORM__: BitFormGlobal | undefined;\n}\n\nconst rootGlobal =\n typeof globalThis !== \"undefined\"\n ? globalThis\n : typeof global !== \"undefined\"\n ? global\n : window;\n\nif (!rootGlobal.__BIT_FORM__) {\n rootGlobal.__BIT_FORM__ = {\n stores: {},\n listeners: new Set<BitBusListener>(),\n\n dispatch(id: string, state: any) {\n this.listeners.forEach((fn: BitBusListener) => fn(id, state));\n },\n\n subscribe(fn: BitBusListener) {\n this.listeners.add(fn);\n return () => {\n this.listeners.delete(fn);\n };\n },\n };\n}\n\nexport const bitBus = rootGlobal.__BIT_FORM__ as BitFormGlobal;\n\nconst noopBus: BitFormGlobal = {\n stores: {},\n listeners: new Set<BitBusListener>(),\n dispatch: () => {},\n subscribe: () => () => {},\n};\n\nexport function getNoopBitBus(): BitFormGlobal {\n return noopBus;\n}\n\n/**\n * Creates an isolated bus instance — not connected to the browser global.\n * Use this in SSR / Edge Runtime environments (e.g. Next.js Edge) where a\n * shared `globalThis` singleton is unsafe across request contexts.\n *\n * @example\n * // _app.tsx (SSR-safe)\n * const bus = createBitBus();\n * const store = createBitStore({ bus, initialValues: { ... } });\n */\nexport function createBitBus(): BitFormGlobal {\n const listeners = new Set<BitBusListener>();\n return {\n stores: {},\n listeners,\n dispatch(id, state) {\n listeners.forEach((fn) => fn(id, state));\n },\n subscribe(fn) {\n listeners.add(fn);\n return () => listeners.delete(fn);\n },\n };\n}\n","import { BitPersistManager } from \"../managers/features/persist-manager\";\nimport { BitPluginManager } from \"../managers/features/plugin-manager\";\nimport { BitStoreEffectEngine } from \"../engines/effect-engine\";\nimport { BitValidationManager } from \"../managers/features/validation-manager\";\nimport { BitLifecycleManager } from \"../managers/features/lifecycle-manager\";\nimport { BitHistoryManager } from \"../managers/features/history-manager\";\nimport {\n BitArrayManager,\n type BitArrayStorePort,\n} from \"../managers/features/array-manager\";\nimport { BitScopeManager } from \"../managers/features/scope-manager\";\nimport { BitFieldQueryManager } from \"../managers/features/field-query-manager\";\nimport { BitErrorManager } from \"../managers/features/error-manager\";\nimport { BitFieldRegistry } from \"../registry/field-registry\";\nimport { BitComputedManager } from \"../managers/core/computed-manager\";\nimport type { BitStoreOperation } from \"../engines/operation-engine\";\nimport { deepClone } from \"../../utils\";\nimport type { BitStoreCapabilities } from \"./capabilities\";\nimport type { BitFrameworkConfig } from \"../contracts/public-types\";\nimport { bitBus, getNoopBitBus } from \"../shared/bus\";\nimport type {\n BitLifecycleStorePort,\n BitValidationStorePort,\n} from \"../contracts/port-types\";\nimport type { BitFieldDefinition, BitState } from \"../contracts/types\";\n\nfunction shouldEnableStoreBus<T extends object>(config: BitFrameworkConfig<T>) {\n if (config.bus) {\n return true;\n }\n\n if (typeof config.devTools === \"boolean\") {\n return config.devTools;\n }\n\n if (config.devTools && typeof config.devTools === \"object\") {\n return config.devTools.enabled !== false;\n }\n\n return false;\n}\n\nexport type BitStoreCapabilityPorts<T extends object> = {\n config: BitFrameworkConfig<T>;\n validationPort: BitValidationStorePort<T>;\n lifecyclePort: BitLifecycleStorePort<T>;\n arrayPort: BitArrayStorePort<T>;\n getScopeFields(scopeName: string): string[];\n getState(): BitState<T>;\n dispatch(operation: BitStoreOperation<T>): void;\n getInitialValues(): T;\n isPathDirty(path: string): boolean;\n};\n\nexport function createStoreCapabilities<T extends object>(args: {\n ports: BitStoreCapabilityPorts<T>;\n fieldRegistry: BitFieldRegistry<T>;\n}): BitStoreCapabilities<T> {\n const { ports, fieldRegistry } = args;\n\n return {\n validation: new BitValidationManager<T>(ports.validationPort),\n lifecycle: new BitLifecycleManager<T>(ports.lifecyclePort),\n history: new BitHistoryManager<T>(\n !!ports.config.history.enabled,\n ports.config.history.limit ?? 50,\n ),\n arrays: new BitArrayManager<T>(ports.arrayPort),\n scope: new BitScopeManager<T>(\n () => ports.getState(),\n () => ports.getInitialValues(),\n (scopeName) => ports.getScopeFields(scopeName),\n (path) => ports.isPathDirty(path),\n ),\n query: new BitFieldQueryManager<T>(\n fieldRegistry,\n () => ports.getState(),\n (path) => ports.isPathDirty(path),\n ),\n error: new BitErrorManager<T>(\n () => ports.getState(),\n (operation) => ports.dispatch(operation),\n ),\n };\n}\n\nexport function createStoreEffects<T extends object>(args: {\n storeId: string;\n storeInstance: unknown;\n config: BitFrameworkConfig<T>;\n getState: () => BitState<T>;\n getConfig: () => BitFrameworkConfig<T>;\n getValues: () => T;\n getDirtyValues: () => Partial<T>;\n applyPersistedValues: (values: Partial<T>) => void;\n}): BitStoreEffectEngine<T> {\n const {\n storeId,\n storeInstance,\n config,\n getState,\n getConfig,\n getValues,\n getDirtyValues,\n applyPersistedValues,\n } = args;\n\n const persistManager = new BitPersistManager<T>(\n config.persist,\n getValues,\n getDirtyValues,\n applyPersistedValues,\n );\n\n const pluginManager = new BitPluginManager<T>([...config.plugins], () => ({\n storeId,\n getState: () => getState(),\n getConfig: () => getConfig(),\n }));\n\n const enableBusDispatch = shouldEnableStoreBus(config);\n const resolvedBus = enableBusDispatch\n ? (config.bus ?? bitBus)\n : getNoopBitBus();\n\n const effects = new BitStoreEffectEngine<T>(\n storeId,\n storeInstance,\n resolvedBus,\n persistManager,\n pluginManager,\n enableBusDispatch,\n );\n effects.initialize();\n\n return effects;\n}\n\nexport function createInitialStoreState<T extends object>(args: {\n config: BitFrameworkConfig<T>;\n fieldRegistry: BitFieldRegistry<T>;\n computedManager: BitComputedManager<T>;\n}): BitState<T> {\n const { config, fieldRegistry, computedManager } = args;\n\n const initialValues = deepClone(config.initialValues);\n\n if (config.fields) {\n Object.entries(config.fields).forEach(([path, fieldConfig]) => {\n fieldRegistry.register(\n path,\n fieldConfig as BitFieldDefinition<T>,\n initialValues,\n );\n });\n }\n\n const valuesWithComputeds = computedManager.apply(initialValues);\n\n return {\n values: valuesWithComputeds,\n errors: {},\n touched: {},\n isValidating: {},\n persist: {\n isSaving: false,\n isRestoring: false,\n error: null,\n },\n isValid: true,\n isSubmitting: false,\n isDirty: false,\n };\n}\n","import { deepClone } from \"../../utils\";\nimport type { BitState } from \"../contracts/types\";\nimport {\n patchStateOperation,\n persistMetaOperation,\n type BitStoreOperation,\n} from \"../engines/operation-engine\";\nimport type { BitStoreEffectEngine } from \"../engines/effect-engine\";\nimport type { BitDirtyManager } from \"../managers/core/dirty-manager\";\nimport type { BitFieldRegistry } from \"../registry/field-registry\";\n\ninterface ValidationAccess {\n cancelAll(): void;\n validate(): Promise<boolean>;\n}\n\nexport async function restoreStorePersisted<T extends object>(args: {\n dispatch: (operation: BitStoreOperation<T>) => void;\n effects: BitStoreEffectEngine<T>;\n}): Promise<boolean> {\n const { dispatch, effects } = args;\n\n dispatch(persistMetaOperation({ isRestoring: true, error: null }));\n\n try {\n return await effects.restorePersisted();\n } catch (error) {\n dispatch(\n persistMetaOperation({\n isRestoring: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }),\n );\n return false;\n } finally {\n dispatch(persistMetaOperation({ isRestoring: false }));\n }\n}\n\nexport async function forceStorePersistedSave<T extends object>(args: {\n dispatch: (operation: BitStoreOperation<T>) => void;\n effects: BitStoreEffectEngine<T>;\n}): Promise<void> {\n const { dispatch, effects } = args;\n\n dispatch(persistMetaOperation({ isSaving: true, error: null }));\n\n try {\n await effects.savePersistedNow();\n } catch (error) {\n dispatch(\n persistMetaOperation({\n isSaving: false,\n error: error instanceof Error ? error : new Error(String(error)),\n }),\n );\n return;\n }\n\n dispatch(persistMetaOperation({ isSaving: false }));\n}\n\nexport async function clearStorePersisted<T extends object>(args: {\n dispatch: (operation: BitStoreOperation<T>) => void;\n effects: BitStoreEffectEngine<T>;\n}): Promise<void> {\n const { dispatch, effects } = args;\n\n dispatch(persistMetaOperation({ error: null }));\n\n try {\n await effects.clearPersisted();\n } catch (error) {\n dispatch(\n persistMetaOperation({\n error: error instanceof Error ? error : new Error(String(error)),\n }),\n );\n }\n}\n\nexport function applyStorePersistedValues<T extends object>(args: {\n values: Partial<T>;\n state: BitState<T>;\n initialValues: T;\n validation: ValidationAccess;\n fieldRegistry: BitFieldRegistry<T>;\n dirtyManager: BitDirtyManager<T>;\n dispatch: (operation: BitStoreOperation<T>) => void;\n saveHistorySnapshot: () => void;\n}): void {\n const {\n values,\n state,\n initialValues,\n validation,\n fieldRegistry,\n dirtyManager,\n dispatch,\n saveHistorySnapshot,\n } = args;\n\n const nextValues = deepClone({\n ...initialValues,\n ...values,\n } as T);\n\n validation.cancelAll();\n fieldRegistry.evaluateAll(nextValues);\n\n const isDirty = dirtyManager.rebuild(nextValues, initialValues);\n\n dispatch(\n patchStateOperation({\n values: nextValues,\n errors: {},\n touched: {},\n isValidating: {},\n persist: { ...state.persist, error: null },\n isValid: true,\n isDirty,\n isSubmitting: false,\n }),\n );\n\n saveHistorySnapshot();\n void validation.validate();\n}\n","import type { BitHistoryMetadata } from \"../contracts/public-types\";\nimport type { BitStoreOperation } from \"../engines/operation-engine\";\nimport type { BitStoreEffectEngine } from \"../engines/effect-engine\";\nimport {\n clearStorePersisted,\n forceStorePersistedSave,\n restoreStorePersisted,\n} from \"./store-persist-ops\";\n\nexport function restorePersistedFeature<T extends object>(args: {\n dispatch: (operation: BitStoreOperation<T>) => void;\n effects: BitStoreEffectEngine<T>;\n}): Promise<boolean> {\n const { dispatch, effects } = args;\n return restoreStorePersisted({ dispatch, effects });\n}\n\nexport function forceSavePersistedFeature<T extends object>(args: {\n dispatch: (operation: BitStoreOperation<T>) => void;\n effects: BitStoreEffectEngine<T>;\n}): Promise<void> {\n const { dispatch, effects } = args;\n return forceStorePersistedSave({ dispatch, effects });\n}\n\nexport function clearPersistedFeature<T extends object>(args: {\n dispatch: (operation: BitStoreOperation<T>) => void;\n effects: BitStoreEffectEngine<T>;\n}): Promise<void> {\n const { dispatch, effects } = args;\n return clearStorePersisted({ dispatch, effects });\n}\n\ntype HistoryFeaturePort<T extends object> = {\n undo: () => T | null;\n redo: () => T | null;\n getMetadata: () => BitHistoryMetadata;\n};\n\nexport function runUndoFeature<T extends object>(args: {\n history: HistoryFeaturePort<T>;\n applyHistoryState: (values: T) => void;\n}): void {\n const { history, applyHistoryState } = args;\n const prevState = history.undo();\n if (prevState) {\n applyHistoryState(prevState);\n }\n}\n\nexport function runRedoFeature<T extends object>(args: {\n history: HistoryFeaturePort<T>;\n applyHistoryState: (values: T) => void;\n}): void {\n const { history, applyHistoryState } = args;\n const nextState = history.redo();\n if (nextState) {\n applyHistoryState(nextState);\n }\n}\n\nexport function readHistoryFeatureMetadata<T extends object>(args: {\n history: HistoryFeaturePort<T>;\n}): BitHistoryMetadata {\n return args.history.getMetadata();\n}\n","export const BIT_HOOKS_API_SYMBOL = Symbol.for(\"bit-form.hooks-api\");\n","import type { BitErrors, BitState } from \"../contracts/types\";\n\nexport function buildFieldUnregisterPatch<T extends object>(args: {\n state: Readonly<BitState<T>>;\n path: string;\n}): Pick<BitState<T>, \"errors\" | \"touched\"> | null {\n const { state, path } = args;\n\n const nextErrors = { ...state.errors };\n const nextTouched = { ...state.touched };\n let changed = false;\n\n if (nextErrors[path as keyof BitErrors<T>]) {\n delete nextErrors[path as keyof BitErrors<T>];\n changed = true;\n }\n\n if (nextTouched[path as keyof typeof nextTouched]) {\n delete nextTouched[path as keyof typeof nextTouched];\n changed = true;\n }\n\n if (!changed) {\n return null;\n }\n\n return {\n errors: nextErrors,\n touched: nextTouched,\n };\n}\n","import type { BitFieldDefinition, BitState } from \"../contracts/types\";\nimport { BitFieldRegistry } from \"../registry/field-registry\";\nimport { BitSubscriptionEngine } from \"../engines/subscription-engine\";\nimport { buildFieldUnregisterPatch } from \"../engines/store-field-cleanup-engine\";\nimport {\n patchStateOperation,\n type BitStoreOperation,\n} from \"../engines/operation-engine\";\n\nexport function registerStoreField<T extends object>(args: {\n path: string;\n config: BitFieldDefinition<T>;\n state: BitState<T>;\n fieldRegistry: BitFieldRegistry<T>;\n subscriptions: BitSubscriptionEngine<T>;\n invalidateFieldIndexes: () => void;\n}): void {\n const {\n path,\n config,\n state,\n fieldRegistry,\n subscriptions,\n invalidateFieldIndexes,\n } = args;\n\n fieldRegistry.register(path, config, state.values);\n invalidateFieldIndexes();\n\n if (fieldRegistry.isHidden(path)) {\n subscriptions.notify(state, [path]);\n }\n}\n\nexport function unregisterStoreField<T extends object>(args: {\n path: string;\n state: BitState<T>;\n hasStaticConfig: boolean;\n fieldRegistry: BitFieldRegistry<T>;\n validationCleanupField: (path: string) => void;\n invalidateFieldIndexes: () => void;\n dispatch: (operation: BitStoreOperation<T>) => void;\n}): void {\n const {\n path,\n state,\n hasStaticConfig,\n fieldRegistry,\n validationCleanupField,\n invalidateFieldIndexes,\n dispatch,\n } = args;\n\n if (hasStaticConfig) {\n return;\n }\n\n validationCleanupField(path);\n fieldRegistry.unregister(path);\n invalidateFieldIndexes();\n\n const cleanupPatch = buildFieldUnregisterPatch({ state, path });\n\n if (!cleanupPatch) {\n return;\n }\n\n dispatch(\n patchStateOperation({\n errors: cleanupPatch.errors,\n touched: cleanupPatch.touched,\n }),\n );\n}\n\nexport function unregisterStorePrefix<T extends object>(args: {\n prefix: string;\n fieldRegistry: BitFieldRegistry<T>;\n validationCleanupPrefix: (prefix: string) => void;\n invalidateFieldIndexes: () => void;\n}): void {\n const {\n prefix,\n fieldRegistry,\n validationCleanupPrefix,\n invalidateFieldIndexes,\n } = args;\n\n validationCleanupPrefix(prefix);\n fieldRegistry.unregisterPrefix(prefix);\n invalidateFieldIndexes();\n}\n","import type {\n BitSelector,\n BitSelectorSubscriptionOptions,\n} from \"../contracts/public-types\";\nimport type { BitState } from \"../contracts/types\";\n\nexport function collectTrackedSelectorPaths<T extends object, TSlice>(\n state: Readonly<BitState<T>>,\n selector: BitSelector<T, TSlice>,\n): string[] {\n const trackedPaths = new Set<string>();\n\n const createTrackingProxy = <TValue>(\n value: TValue,\n basePath: string,\n ): TValue => {\n if (value === null || typeof value !== \"object\") {\n return value;\n }\n\n return new Proxy(value as object, {\n get: (target, key, receiver) => {\n if (typeof key === \"symbol\") {\n return Reflect.get(target, key, receiver);\n }\n\n const keyAsString = String(key);\n const childPath = basePath ? `${basePath}.${keyAsString}` : keyAsString;\n trackedPaths.add(childPath);\n\n const child = Reflect.get(target, key, receiver);\n return createTrackingProxy(child, childPath);\n },\n }) as TValue;\n };\n\n const proxyState = createTrackingProxy(state, \"\");\n selector(proxyState as Readonly<BitState<T>>);\n\n const normalizedPaths = new Set<string>();\n\n trackedPaths.forEach((path) => {\n const normalizedPath = normalizeTrackedPath(path);\n if (normalizedPath) {\n normalizedPaths.add(normalizedPath);\n }\n });\n\n return Array.from(normalizedPaths);\n}\n\nfunction normalizeTrackedPath(path: string): string | undefined {\n if (!path) {\n return undefined;\n }\n\n if (path === \"values\") {\n return \"*\";\n }\n\n if (path.startsWith(\"values.\")) {\n return path.slice(\"values.\".length);\n }\n\n if (path === \"errors\" || path === \"touched\" || path === \"isValidating\") {\n return \"*\";\n }\n\n if (path.startsWith(\"errors.\")) {\n return path.slice(\"errors.\".length);\n }\n\n if (path.startsWith(\"touched.\")) {\n return path.slice(\"touched.\".length);\n }\n\n if (path.startsWith(\"isValidating.\")) {\n return path.slice(\"isValidating.\".length);\n }\n\n if (path === \"persist\" || path.startsWith(\"persist.\")) {\n return \"persist\";\n }\n\n return path;\n}\n\nexport function areTrackedPathSetsEqual(\n previousPaths: readonly string[],\n nextPaths: readonly string[],\n): boolean {\n if (previousPaths.length !== nextPaths.length) {\n return false;\n }\n\n const next = new Set(nextPaths);\n for (const path of previousPaths) {\n if (!next.has(path)) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function withTrackedSelectorPaths<TValue>(\n paths: string[],\n options?: Omit<BitSelectorSubscriptionOptions<TValue>, \"paths\">,\n): BitSelectorSubscriptionOptions<TValue> {\n if (paths.length === 0) {\n return {\n ...options,\n paths: [\"*\"],\n };\n }\n\n return {\n ...options,\n paths,\n };\n}\n\nexport function createTrackedSubscription<T extends object, TSlice>(args: {\n getState: () => Readonly<BitState<T>>;\n subscribeSelector: (\n selector: BitSelector<T, TSlice>,\n listener: (slice: TSlice) => void,\n options?: BitSelectorSubscriptionOptions<TSlice>,\n ) => () => void;\n selector: BitSelector<T, TSlice>;\n listener: (slice: TSlice) => void;\n options?: Omit<BitSelectorSubscriptionOptions<TSlice>, \"paths\">;\n}): () => void {\n const { getState, subscribeSelector, selector, listener, options } = args;\n\n let activeUnsubscribe: (() => void) | null = null;\n let activePaths = collectTrackedSelectorPaths(getState(), selector);\n let isDisposed = false;\n let isResubscribeQueued = false;\n\n const subscribeWithPaths = (paths: string[]) => {\n activeUnsubscribe = subscribeSelector(\n selector,\n (slice) => {\n listener(slice);\n\n const nextPaths = collectTrackedSelectorPaths(getState(), selector);\n if (areTrackedPathSetsEqual(activePaths, nextPaths)) {\n return;\n }\n\n activePaths = nextPaths;\n\n if (isResubscribeQueued || isDisposed) {\n return;\n }\n\n isResubscribeQueued = true;\n queueMicrotask(() => {\n isResubscribeQueued = false;\n if (isDisposed) {\n return;\n }\n\n activeUnsubscribe?.();\n subscribeWithPaths(activePaths);\n });\n },\n withTrackedSelectorPaths(paths, options),\n );\n };\n\n subscribeWithPaths(activePaths);\n\n return () => {\n isDisposed = true;\n activeUnsubscribe?.();\n activeUnsubscribe = null;\n };\n}\n","import type { BitHistoryMetadata } from \"./public-types\";\n\n/**\n * Subconjunto relevante de BitHistoryMetadata para comparação de igualdade.\n * Evita re-renders/updates desnecessários quando o estado de histórico não muda.\n */\nexport type HistoryMeta = Pick<\n BitHistoryMetadata,\n \"canUndo\" | \"canRedo\" | \"historyIndex\" | \"historySize\"\n>;\n\n/**\n * Compara dois snapshots de metadata de histórico por valor.\n * Retorna `true` quando todos os campos relevantes são idênticos,\n * permitindo que os bindings de framework ignorem atualizações não relacionadas.\n */\nexport function isHistoryMetaEqual(a: HistoryMeta, b: HistoryMeta): boolean {\n return (\n a.canUndo === b.canUndo &&\n a.canRedo === b.canRedo &&\n a.historyIndex === b.historyIndex &&\n a.historySize === b.historySize\n );\n}\n\nexport function readHistoryMetaSnapshot<T extends object>(store: {\n getHistoryMetadata(): BitHistoryMetadata;\n}): HistoryMeta {\n const nextMeta = store.getHistoryMetadata();\n\n return {\n canUndo: nextMeta.canUndo,\n canRedo: nextMeta.canRedo,\n historyIndex: nextMeta.historyIndex,\n historySize: nextMeta.historySize,\n };\n}\n\nexport function observeHistoryMetaSnapshot<T extends object>(\n store: {\n getHistoryMetadata(): BitHistoryMetadata;\n subscribeHistoryMeta(\n listener: (meta: BitHistoryMetadata) => void,\n ): () => void;\n },\n listener: (meta: HistoryMeta) => void,\n): () => void {\n listener(readHistoryMetaSnapshot(store));\n\n return store.subscribeHistoryMeta(() => {\n listener(readHistoryMetaSnapshot(store));\n });\n}\n","import type { ScopeStatus } from \"./public-types\";\n\nexport function areScopeErrorsEqual(\n currentErrors: Record<string, string>,\n nextErrors: Record<string, string>,\n): boolean {\n const currentKeys = Object.keys(currentErrors);\n const nextKeys = Object.keys(nextErrors);\n\n if (currentKeys.length !== nextKeys.length) {\n return false;\n }\n\n return currentKeys.every((key) => currentErrors[key] === nextErrors[key]);\n}\n\nexport function isScopeStatusEqual(\n currentStatus: ScopeStatus,\n nextStatus: ScopeStatus,\n): boolean {\n return (\n currentStatus.hasErrors === nextStatus.hasErrors &&\n currentStatus.isDirty === nextStatus.isDirty &&\n areScopeErrorsEqual(currentStatus.errors, nextStatus.errors)\n );\n}\n\nexport function getScopeSubscriptionPaths(scopeFields: readonly string[]) {\n return [...scopeFields, \"isDirty\"];\n}\n\nexport function observeScopeStatusSnapshot(\n store: {\n getStepStatus(scopeName: string): ScopeStatus;\n subscribeScopeStatus(\n scopeName: string,\n listener: (status: ScopeStatus) => void,\n ): () => void;\n },\n scopeName: string,\n listener: (status: ScopeStatus) => void,\n): () => void {\n listener(store.getStepStatus(scopeName));\n\n return store.subscribeScopeStatus(scopeName, listener);\n}\n","import { getDeepValue, valueEqual } from \"../../utils\";\nimport { createTrackedSubscription } from \"./tracked-selector\";\nimport type {\n BitFormMeta,\n BitHistoryMetadata,\n BitSelector,\n BitSelectorSubscriptionOptions,\n} from \"../contracts/public-types\";\nimport type { BitFieldState, BitPath, BitPathValue } from \"../contracts/types\";\nimport type { BitState } from \"../contracts/types\";\nimport type { BitSubscriptionEngine } from \"../engines/subscription-engine\";\nimport type { BitPersistMetadata, ScopeStatus } from \"../contracts/types\";\nimport { isHistoryMetaEqual } from \"../../history-status\";\nimport {\n getScopeSubscriptionPaths,\n isScopeStatusEqual,\n} from \"../../scope-status\";\n\nexport function subscribeStoreSelector<T extends object, TSlice>(args: {\n subscriptions: Pick<BitSubscriptionEngine<T>, \"subscribeSelector\">;\n selector: BitSelector<T, TSlice>;\n listener: (slice: TSlice) => void;\n options?: BitSelectorSubscriptionOptions<TSlice>;\n}): () => void {\n const { subscriptions, selector, listener, options } = args;\n const equalityFn = options?.equalityFn ?? valueEqual;\n\n return subscriptions.subscribeSelector(\n selector,\n listener,\n options,\n equalityFn,\n );\n}\n\nexport function subscribeStoreTracked<T extends object, TSlice>(args: {\n getState: () => Readonly<BitState<T>>;\n subscribeSelector: (\n selector: BitSelector<T, TSlice>,\n listener: (slice: TSlice) => void,\n options?: BitSelectorSubscriptionOptions<TSlice>,\n ) => () => void;\n selector: BitSelector<T, TSlice>;\n listener: (slice: TSlice) => void;\n options?: Omit<BitSelectorSubscriptionOptions<TSlice>, \"paths\">;\n}): () => void {\n const { getState, subscribeSelector, selector, listener, options } = args;\n\n return createTrackedSubscription({\n getState,\n subscribeSelector: (trackedSelector, trackedListener, trackedOptions) =>\n subscribeSelector(trackedSelector, trackedListener, trackedOptions),\n selector,\n listener,\n options,\n });\n}\n\nexport function subscribeStorePath<\n T extends object,\n P extends BitPath<T>,\n>(args: {\n path: P;\n listener: (value: BitPathValue<T, P>) => void;\n options?: BitSelectorSubscriptionOptions<BitPathValue<T, P>>;\n subscribeSelector: (\n selector: BitSelector<T, BitPathValue<T, P>>,\n listener: (slice: BitPathValue<T, P>) => void,\n options?: BitSelectorSubscriptionOptions<BitPathValue<T, P>>,\n ) => () => void;\n}): () => void {\n const { path, listener, options, subscribeSelector } = args;\n const mergedPaths = [...(options?.paths ?? []), path as string];\n\n return subscribeSelector(\n (state) => getDeepValue(state.values, path as string) as BitPathValue<T, P>,\n listener,\n {\n ...options,\n paths: mergedPaths,\n },\n );\n}\n\nexport function subscribeStoreFieldState<\n T extends object,\n P extends BitPath<T>,\n>(args: {\n path: P;\n listener: (state: Readonly<BitFieldState<T, BitPathValue<T, P>>>) => void;\n getFieldState: (path: P) => Readonly<BitFieldState<T, BitPathValue<T, P>>>;\n subscribeSelector: (\n selector: BitSelector<T, Readonly<BitFieldState<T, BitPathValue<T, P>>>>,\n listener: (state: Readonly<BitFieldState<T, BitPathValue<T, P>>>) => void,\n options?: BitSelectorSubscriptionOptions<\n Readonly<BitFieldState<T, BitPathValue<T, P>>>\n >,\n ) => () => void;\n}): () => void {\n const { path, listener, getFieldState, subscribeSelector } = args;\n\n return subscribeSelector(() => getFieldState(path), listener, {\n paths: [path as string],\n equalityFn: (prev, next) =>\n prev.value === next.value &&\n prev.error === next.error &&\n prev.touched === next.touched &&\n prev.isHidden === next.isHidden &&\n prev.isRequired === next.isRequired &&\n prev.isDirty === next.isDirty &&\n prev.isValidating === next.isValidating,\n });\n}\n\nexport function subscribeStoreFormMeta<T extends object>(args: {\n listener: (meta: BitFormMeta) => void;\n subscribeSelector: (\n selector: BitSelector<T, BitFormMeta>,\n listener: (meta: BitFormMeta) => void,\n options?: BitSelectorSubscriptionOptions<BitFormMeta>,\n ) => () => void;\n}): () => void {\n const { listener, subscribeSelector } = args;\n\n return subscribeSelector(\n (state) => ({\n isValid: state.isValid,\n isDirty: state.isDirty,\n isSubmitting: state.isSubmitting,\n }),\n listener,\n {\n paths: [\"isValid\", \"isDirty\", \"isSubmitting\"],\n equalityFn: (prev, next) =>\n prev.isValid === next.isValid &&\n prev.isDirty === next.isDirty &&\n prev.isSubmitting === next.isSubmitting,\n },\n );\n}\n\nexport function subscribeStorePersistMeta<T extends object>(args: {\n listener: (meta: BitPersistMetadata) => void;\n subscribeSelector: (\n selector: BitSelector<T, BitPersistMetadata>,\n listener: (meta: BitPersistMetadata) => void,\n options?: BitSelectorSubscriptionOptions<BitPersistMetadata>,\n ) => () => void;\n}): () => void {\n const { listener, subscribeSelector } = args;\n\n return subscribeSelector((state) => state.persist, listener, {\n paths: [\"persist\"],\n equalityFn: (prev, next) =>\n prev.isSaving === next.isSaving &&\n prev.isRestoring === next.isRestoring &&\n prev.error === next.error,\n });\n}\n\nexport function subscribeStoreHistoryMeta<T extends object>(args: {\n readHistoryMeta: () => BitHistoryMetadata;\n subscribe: (listener: () => void) => () => void;\n listener: (meta: BitHistoryMetadata) => void;\n}): () => void {\n const { readHistoryMeta, subscribe, listener } = args;\n let lastMeta = readHistoryMeta();\n\n return subscribe(() => {\n const nextMeta = readHistoryMeta();\n\n if (isHistoryMetaEqual(lastMeta, nextMeta)) {\n return;\n }\n\n lastMeta = nextMeta;\n listener(nextMeta);\n });\n}\n\nexport function subscribeStoreScopeStatus<T extends object>(args: {\n scopeName: string;\n readScopeStatus: (scopeName: string) => ScopeStatus;\n getScopeFields: (scopeName: string) => string[];\n subscribeSelector: (\n selector: BitSelector<\n T,\n { errors: BitState<T>[\"errors\"]; isDirty: boolean }\n >,\n listener: (slice: {\n errors: BitState<T>[\"errors\"];\n isDirty: boolean;\n }) => void,\n options?: BitSelectorSubscriptionOptions<{\n errors: BitState<T>[\"errors\"];\n isDirty: boolean;\n }>,\n ) => () => void;\n listener: (status: ScopeStatus) => void;\n}): () => void {\n const {\n scopeName,\n readScopeStatus,\n getScopeFields,\n subscribeSelector,\n listener,\n } = args;\n\n let lastStatus = readScopeStatus(scopeName);\n\n return subscribeSelector(\n (state) => ({ errors: state.errors, isDirty: state.isDirty }),\n () => {\n const nextStatus = readScopeStatus(scopeName);\n if (isScopeStatusEqual(lastStatus, nextStatus)) {\n return;\n }\n\n lastStatus = nextStatus;\n listener(nextStatus);\n },\n {\n paths: getScopeSubscriptionPaths(getScopeFields(scopeName)),\n },\n );\n}\n","import type {\n BitSelector,\n BitSelectorSubscriptionOptions,\n} from \"../contracts/public-types\";\nimport type { BitState } from \"../contracts/types\";\n\ninterface SelectorListenerEntry<T extends object> {\n notify(nextState: Readonly<BitState<T>>): void;\n}\n\nexport class BitSubscriptionEngine<T extends object> {\n private listeners: Set<() => void> = new Set();\n private pathScopedSubscriptions: Map<SelectorListenerEntry<T>, string[]> =\n new Map();\n private pathSelectorIndex: Map<string, Set<SelectorListenerEntry<T>>> =\n new Map();\n private readonly expandedPathCache = new Map<string, string[]>();\n private readonly changedPathLookupCache = new Map<string, string[]>();\n private readonly subscriptionSeenVersion = new Map<\n SelectorListenerEntry<T>,\n number\n >();\n private notifyVersion = 0;\n private readonly MAX_EXPANDED_CACHE_SIZE: number;\n private readonly MAX_CHANGED_LOOKUP_CACHE_SIZE: number;\n\n constructor(\n private readonly getState: () => Readonly<BitState<T>>,\n /**\n * Maximum number of entries for each internal LRU path cache.\n * Lower = less memory; higher = fewer cache evictions in large dynamic forms.\n * @default 500\n */\n maxCacheSize = 500,\n ) {\n this.MAX_EXPANDED_CACHE_SIZE = maxCacheSize;\n this.MAX_CHANGED_LOOKUP_CACHE_SIZE = maxCacheSize;\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n subscribeSelector<TSlice>(\n selector: BitSelector<T, TSlice>,\n listener: (slice: TSlice) => void,\n options: BitSelectorSubscriptionOptions<TSlice> | undefined,\n equalityFn: (previous: TSlice, next: TSlice) => boolean,\n ): () => void {\n let lastSlice = selector(this.getState());\n\n const subscription: SelectorListenerEntry<T> = {\n notify: (nextState) => {\n const nextSlice = selector(nextState);\n\n if (equalityFn(lastSlice, nextSlice)) {\n return;\n }\n\n lastSlice = nextSlice;\n listener(nextSlice);\n },\n };\n\n const scopedPaths = this.normalizeSubscriptionPaths(options?.paths);\n\n if (scopedPaths.length === 0) {\n throw new Error(\"BitStore: subscribeSelector requires explicit `paths`.\");\n }\n\n this.pathScopedSubscriptions.set(subscription, scopedPaths);\n scopedPaths.forEach((pathKey) => {\n this.expandPathForIndexing(pathKey).forEach((indexPath) => {\n const listeners = this.pathSelectorIndex.get(indexPath) ?? new Set();\n listeners.add(subscription);\n this.pathSelectorIndex.set(indexPath, listeners);\n });\n });\n\n if (options?.emitImmediately) {\n listener(lastSlice);\n }\n\n return () => {\n this.subscriptionSeenVersion.delete(subscription);\n\n const paths = this.pathScopedSubscriptions.get(subscription);\n if (!paths) return;\n\n paths.forEach((pathKey) => {\n this.expandPathForIndexing(pathKey).forEach((indexPath) => {\n const listeners = this.pathSelectorIndex.get(indexPath);\n if (!listeners) return;\n\n listeners.delete(subscription);\n if (listeners.size === 0) {\n this.pathSelectorIndex.delete(indexPath);\n }\n });\n });\n\n this.pathScopedSubscriptions.delete(subscription);\n };\n }\n\n notify(\n nextState: Readonly<BitState<T>>,\n changedPaths?: Iterable<string>,\n ): void {\n this.listeners.forEach((listener) => listener());\n\n if (this.pathScopedSubscriptions.size === 0) {\n return;\n }\n\n const normalizedChangedPaths = changedPaths\n ? this.normalizeSubscriptionPaths(Array.from(changedPaths))\n : [];\n\n if (\n normalizedChangedPaths.length === 0 ||\n normalizedChangedPaths.includes(\"*\")\n ) {\n this.pathScopedSubscriptions.forEach((_paths, subscription) => {\n subscription.notify(nextState);\n });\n return;\n }\n\n const scopedSubscribers = this.collectSubscribersForChangedPaths(\n normalizedChangedPaths,\n );\n\n scopedSubscribers.forEach((subscription) => {\n subscription.notify(nextState);\n });\n }\n\n destroy(): void {\n this.listeners.clear();\n this.pathScopedSubscriptions.clear();\n this.pathSelectorIndex.clear();\n this.expandedPathCache.clear();\n this.changedPathLookupCache.clear();\n this.subscriptionSeenVersion.clear();\n }\n\n private normalizeSubscriptionPaths(paths?: string[]): string[] {\n if (!paths || paths.length === 0) return [];\n\n const seen = new Set<string>();\n const normalized: string[] = [];\n\n for (const path of paths) {\n const trimmed = path.trim();\n if (trimmed.length === 0 || seen.has(trimmed)) {\n continue;\n }\n\n seen.add(trimmed);\n normalized.push(trimmed);\n }\n\n return normalized;\n }\n\n private collectSubscribersForChangedPaths(\n changedPaths: string[],\n ): SelectorListenerEntry<T>[] {\n const scopedSubscribers: SelectorListenerEntry<T>[] = [];\n const currentVersion = ++this.notifyVersion;\n\n const addByPath = (path: string) => {\n const listeners = this.pathSelectorIndex.get(path);\n if (!listeners) return;\n\n listeners.forEach((subscription) => {\n const seenVersion = this.subscriptionSeenVersion.get(subscription) ?? 0;\n if (seenVersion >= currentVersion) {\n return;\n }\n\n this.subscriptionSeenVersion.set(subscription, currentVersion);\n scopedSubscribers.push(subscription);\n });\n };\n\n changedPaths.forEach((changedPath) => {\n this.expandChangedPathForLookup(changedPath).forEach(addByPath);\n });\n\n return scopedSubscribers;\n }\n\n private expandChangedPathForLookup(path: string): string[] {\n const cached = this.changedPathLookupCache.get(path);\n if (cached) {\n return cached;\n }\n\n const parts = path.split(\".\");\n const lookupPaths: string[] = [path];\n\n while (parts.length > 1) {\n parts.pop();\n lookupPaths.push(parts.join(\".\"));\n }\n\n this.setBoundedCacheEntry(\n this.changedPathLookupCache,\n path,\n lookupPaths,\n this.MAX_CHANGED_LOOKUP_CACHE_SIZE,\n );\n return lookupPaths;\n }\n\n private expandPathForIndexing(path: string): string[] {\n const cached = this.expandedPathCache.get(path);\n if (cached) {\n return cached;\n }\n\n const segments = path.split(\".\");\n const keys: string[] = [];\n for (let i = 1; i <= segments.length; i++) {\n keys.push(segments.slice(0, i).join(\".\"));\n }\n this.setBoundedCacheEntry(\n this.expandedPathCache,\n path,\n keys,\n this.MAX_EXPANDED_CACHE_SIZE,\n );\n return keys;\n }\n\n private setBoundedCacheEntry<K, V>(\n cache: Map<K, V>,\n key: K,\n value: V,\n maxSize: number,\n ) {\n if (cache.size >= maxSize) {\n const oldestKey = cache.keys().next().value;\n if (oldestKey !== undefined) {\n cache.delete(oldestKey);\n }\n }\n\n cache.set(key, value);\n }\n}\n","import type {\n BitFieldChangeMeta,\n BitFieldDefinition,\n BitState,\n BitTransformFn,\n} from \"../contracts/types\";\nimport type {\n BitFrameworkConfig,\n BitValidationOptions,\n} from \"../contracts/public-types\";\nimport type {\n BitValidationStorePort,\n BitValidationTriggerOptions,\n BitLifecycleStorePort,\n} from \"../contracts/port-types\";\nimport type { BitArrayStorePort } from \"../managers/features/array-manager\";\nimport type { BitStoreOperation } from \"../engines/operation-engine\";\nimport { BitFieldRegistry } from \"../registry/field-registry\";\nimport { BitDirtyManager } from \"../managers/core/dirty-manager\";\nimport type { BitStoreEffectEngine } from \"../engines/effect-engine\";\n\n// Interfaces locais usadas pelas deps do lifecycle port\ninterface BitValidationAccess<T extends object> {\n clear(path: string): void;\n trigger(scopeFields?: string[], options?: BitValidationTriggerOptions): void;\n handleAsync(path: string, value: any): void;\n cancelAll(): void;\n validate(options?: BitValidationOptions): Promise<boolean>;\n hasValidationsInProgress(scopeFields?: string[]): boolean;\n}\n\ninterface BitHistoryAccess<T extends object> {\n reset(initialValues: T): void;\n}\n\n// ---------------------------------------------------------------------------\n// Validation port\n// ---------------------------------------------------------------------------\n\nexport interface BitValidationPortDeps<T extends object> {\n config: BitFrameworkConfig<T>;\n fieldRegistry: BitFieldRegistry<T>;\n getState(): BitState<T>;\n dispatch(operation: BitStoreOperation<T>): void;\n setError(path: string, message: string | undefined): void;\n validate(options?: BitValidationOptions): Promise<boolean>;\n getFieldConfig(path: string): BitFieldDefinition<T> | undefined;\n getScopeFields(scopeName: string): string[];\n getEffects(): BitStoreEffectEngine<T>;\n}\n\nexport function createValidationPort<T extends object>(\n deps: BitValidationPortDeps<T>,\n): BitValidationStorePort<T> {\n return {\n getState: () => deps.getState(),\n dispatch: (operation) => deps.dispatch(operation),\n setError: (path, message) => deps.setError(path, message),\n validate: (options) => deps.validate(options),\n getFieldConfig: (path) => deps.getFieldConfig(path),\n forEachFieldConfig: (callback) =>\n deps.fieldRegistry.forEachFieldConfig((config, path) =>\n callback(config, path),\n ),\n getScopeFields: (scopeName) => deps.getScopeFields(scopeName),\n config: deps.config,\n getRequiredErrors: (values) => deps.fieldRegistry.getRequiredErrors(values),\n getHiddenFields: () => deps.fieldRegistry.getHiddenFields(),\n emitBeforeValidate: (event) => deps.getEffects().beforeValidate(event),\n emitAfterValidate: (event) => deps.getEffects().afterValidate(event),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Lifecycle port\n// ---------------------------------------------------------------------------\n\nexport interface BitLifecyclePortDeps<T extends object> {\n config: BitFrameworkConfig<T>;\n fieldRegistry: BitFieldRegistry<T>;\n dirtyManager: BitDirtyManager<T>;\n getState(): BitState<T>;\n dispatch(operation: BitStoreOperation<T>): void;\n saveHistorySnapshot(): void;\n runStateBatch<TResult>(callback: () => TResult): TResult;\n getTransformEntries(): [string, BitTransformFn<T>][];\n getInitialValues(): T;\n setInitialValues(values: T): void;\n getValidation(): BitValidationAccess<T>;\n getHistory(): BitHistoryAccess<T>;\n getEffects(): BitStoreEffectEngine<T>;\n}\n\nexport function createLifecyclePort<T extends object>(\n deps: BitLifecyclePortDeps<T>,\n): BitLifecycleStorePort<T> {\n return {\n getState: () => deps.getState(),\n dispatch: (operation) => deps.dispatch(operation),\n internalSaveSnapshot: () => deps.saveHistorySnapshot(),\n batchStateUpdates: (callback) => deps.runStateBatch(callback),\n config: deps.config,\n getFieldConfig: (path) => deps.fieldRegistry.getFieldConfig(path),\n getTransformEntries: () => deps.getTransformEntries(),\n updateDependencies: (changedPath, newValues) =>\n deps.fieldRegistry.updateDependencies(changedPath, newValues),\n hasDependentFields: (path) => deps.fieldRegistry.hasDependents(path),\n isFieldHidden: (path) => deps.fieldRegistry.isHidden(path),\n evaluateAllDependencies: (values) => deps.fieldRegistry.evaluateAll(values),\n getHiddenFields: () => deps.fieldRegistry.getHiddenFields(),\n clearFieldValidation: (path) => deps.getValidation().clear(path),\n triggerValidation: (scopeFields, options) =>\n deps.getValidation().trigger(scopeFields, options),\n handleFieldAsyncValidation: (path, value) =>\n deps.getValidation().handleAsync(path, value),\n cancelAllValidations: () => deps.getValidation().cancelAll(),\n validateNow: (options) => deps.getValidation().validate(options),\n hasValidationsInProgress: (scopeFields) =>\n deps.getValidation().hasValidationsInProgress(scopeFields),\n updateDirtyForPath: (path, nextValues, baselineValues) =>\n deps.dirtyManager.updateForPath(path, nextValues, baselineValues),\n rebuildDirtyState: (nextValues, baselineValues) =>\n deps.dirtyManager.rebuild(nextValues, baselineValues),\n clearDirtyState: () => deps.dirtyManager.clear(),\n buildDirtyValues: (values) => deps.dirtyManager.buildDirtyValues(values),\n getInitialValues: () => deps.getInitialValues(),\n setInitialValues: (values) => deps.setInitialValues(values),\n resetHistory: (initialValues) => deps.getHistory().reset(initialValues),\n emitFieldChange: (event) => deps.getEffects().onFieldChange(event),\n emitBeforeSubmit: (event) => deps.getEffects().beforeSubmit(event),\n emitAfterSubmit: (event) => deps.getEffects().afterSubmit(event),\n emitOperationalError: (event) =>\n deps.getEffects().reportOperationalError(event),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Array port\n// ---------------------------------------------------------------------------\n\nexport interface BitArrayPortDeps<T extends object> {\n getState(): BitState<T>;\n dispatch(operation: BitStoreOperation<T>): void;\n setFieldWithMeta(path: string, value: any, meta: BitFieldChangeMeta): void;\n unregisterPrefix(prefix: string): void;\n triggerValidation(\n scopeFields?: string[],\n options?: BitValidationTriggerOptions,\n ): void;\n dirtyManager: BitDirtyManager<T>;\n getConfig(): Readonly<BitFrameworkConfig<T>>;\n getEffects(): BitStoreEffectEngine<T>;\n saveHistorySnapshot(): void;\n}\n\nexport function createArrayPort<T extends object>(\n deps: BitArrayPortDeps<T>,\n): BitArrayStorePort<T> {\n return {\n getState: () => deps.getState(),\n setFieldWithMeta: (path, value, meta) =>\n deps.setFieldWithMeta(path, value, meta),\n emitFieldChange: (event) => deps.getEffects().onFieldChange(event),\n dispatch: (operation) => deps.dispatch(operation),\n internalSaveSnapshot: () => deps.saveHistorySnapshot(),\n unregisterPrefix: (prefix) => deps.unregisterPrefix(prefix),\n triggerValidation: (scopeFields) => deps.triggerValidation(scopeFields),\n updateDirtyForPath: (path, nextValues, baselineValues) =>\n deps.dirtyManager.updateForPath(path, nextValues, baselineValues),\n getConfig: () => deps.getConfig(),\n };\n}\n","import { BitSubscriptionEngine } from \"../engines/subscription-engine\";\nimport type { BitStoreEffectEngine } from \"../engines/effect-engine\";\nimport {\n createArrayPort,\n createLifecyclePort,\n createValidationPort,\n} from \"./capability-ports\";\nimport {\n createInitialStoreState,\n createStoreCapabilities,\n} from \"./store-bootstrap\";\nimport type { BitStoreCapabilities } from \"./capabilities\";\nimport type { BitStoreOperation } from \"../engines/operation-engine\";\nimport type { BitValidationTriggerOptions } from \"../contracts/port-types\";\nimport type { BitFrameworkConfig } from \"../contracts/public-types\";\nimport type {\n BitConfig,\n BitFieldChangeMeta,\n BitFieldDefinition,\n BitPath,\n BitPathValue,\n BitState,\n DeepPartial,\n BitTransformFn,\n} from \"../contracts/types\";\nimport type { BitFieldRegistry } from \"../registry/field-registry\";\nimport type { BitComputedManager } from \"../managers/core/computed-manager\";\nimport type { BitDirtyManager } from \"../managers/core/dirty-manager\";\n\nexport interface BitStoreRuntimeMembers<T extends object> {\n state: BitState<T>;\n subscriptions: BitSubscriptionEngine<T>;\n capabilities: BitStoreCapabilities<T>;\n storeId: string;\n}\n\nexport interface CreateStoreRuntimeArgs<T extends object> {\n rawConfig: BitConfig<T>;\n config: BitFrameworkConfig<T>;\n fieldRegistry: BitFieldRegistry<T>;\n computedManager: BitComputedManager<T>;\n dirtyManager: BitDirtyManager<T>;\n initialValuesRef: {\n get(): T;\n set(values: T): void;\n };\n getState(): BitState<T>;\n dispatch(operation: BitStoreOperation<T>): void;\n setError(path: string, message: string | undefined): void;\n validate(options?: {\n scope?: string;\n scopeFields?: string[];\n }): Promise<boolean>;\n getFieldConfig(path: string): BitFieldDefinition<T> | undefined;\n getScopeFields(scopeName: string): string[];\n getEffects(): BitStoreEffectEngine<T>;\n saveHistorySnapshot(): void;\n runStateBatch<TResult>(callback: () => TResult): TResult;\n getTransformEntries(): [string, BitTransformFn<T>][];\n getHistory(): BitStoreCapabilities<T>[\"history\"];\n getValidation(): BitStoreCapabilities<T>[\"validation\"];\n setFieldWithMeta(path: string, value: any, meta?: BitFieldChangeMeta): void;\n unregisterPrefix(prefix: string): void;\n triggerValidation(\n scopeFields?: string[],\n options?: BitValidationTriggerOptions,\n ): void;\n getConfig(): Readonly<BitFrameworkConfig<T>>;\n}\n\nexport function createStoreRuntime<T extends object>(\n args: CreateStoreRuntimeArgs<T>,\n): BitStoreRuntimeMembers<T> {\n const validationPort = createValidationPort<T>({\n config: args.config,\n fieldRegistry: args.fieldRegistry,\n getState: () => args.getState(),\n dispatch: (operation) => args.dispatch(operation),\n setError: (path, message) => args.setError(path, message),\n validate: (options) => args.validate(options),\n getFieldConfig: (path) => args.getFieldConfig(path),\n getScopeFields: (scopeName) => args.getScopeFields(scopeName),\n getEffects: () => args.getEffects(),\n });\n\n const lifecyclePort = createLifecyclePort<T>({\n config: args.config,\n fieldRegistry: args.fieldRegistry,\n dirtyManager: args.dirtyManager,\n getState: () => args.getState(),\n dispatch: (operation) => args.dispatch(operation),\n saveHistorySnapshot: () => args.saveHistorySnapshot(),\n runStateBatch: (callback) => args.runStateBatch(callback),\n getTransformEntries: () => args.getTransformEntries(),\n getInitialValues: () => args.initialValuesRef.get(),\n setInitialValues: (values) => args.initialValuesRef.set(values),\n getValidation: () => args.getValidation(),\n getHistory: () => args.getHistory(),\n getEffects: () => args.getEffects(),\n });\n\n const arrayPort = createArrayPort<T>({\n getState: () => args.getState(),\n dispatch: (operation) => args.dispatch(operation),\n setFieldWithMeta: (path, value, meta) =>\n args.setFieldWithMeta(path, value, meta),\n unregisterPrefix: (prefix) => args.unregisterPrefix(prefix),\n triggerValidation: (scopeFields, options) =>\n args.triggerValidation(scopeFields, options),\n dirtyManager: args.dirtyManager,\n getConfig: () => args.getConfig(),\n getEffects: () => args.getEffects(),\n saveHistorySnapshot: () => args.saveHistorySnapshot(),\n });\n\n const capabilities = createStoreCapabilities<T>({\n ports: {\n config: args.config,\n validationPort,\n lifecyclePort,\n arrayPort,\n getScopeFields: (scopeName) => args.getScopeFields(scopeName),\n getState: () => args.getState(),\n dispatch: (operation) => args.dispatch(operation),\n getInitialValues: () => args.initialValuesRef.get(),\n isPathDirty: (path) => args.dirtyManager.isPathDirty(path),\n },\n fieldRegistry: args.fieldRegistry,\n });\n\n const state = createInitialStoreState<T>({\n config: args.config,\n fieldRegistry: args.fieldRegistry,\n computedManager: args.computedManager,\n });\n\n const subscriptions = new BitSubscriptionEngine<T>(\n () => args.getState(),\n args.config.subscriptionCacheSize,\n );\n\n const storeId =\n args.rawConfig.storeId ||\n args.config.name ||\n args.config.idFactory({\n scope: \"store\",\n storeName: args.config.name,\n });\n\n return {\n state,\n subscriptions,\n capabilities,\n storeId,\n };\n}\n","import type { BitState } from \"../contracts/types\";\nimport type { BitStateUpdateResult } from \"./state-update-engine\";\n\nexport interface BitStoreBatchState<T extends object> {\n depth: number;\n pendingState: BitState<T> | null;\n changedPathSet: Set<string> | null;\n valuesChanged: boolean;\n /** When true, a history snapshot should be recorded the moment the top-level\n * batch flushes. This allows multiple mutations inside a `transaction()` –\n * including individual array operations – to produce a single history entry\n * instead of one per mutation. */\n pendingHistorySnapshot: boolean;\n}\n\nexport interface BitStoreBatchFlushResult<T extends object> {\n nextState: BitState<T>;\n changedPaths?: Set<string>;\n valuesChanged: boolean;\n}\n\nexport function createStoreBatchState<\n T extends object,\n>(): BitStoreBatchState<T> {\n return {\n depth: 0,\n pendingState: null,\n changedPathSet: null,\n valuesChanged: false,\n pendingHistorySnapshot: false,\n };\n}\n\nexport function beginStoreBatch<T extends object>(\n batchState: BitStoreBatchState<T>,\n): void {\n batchState.depth += 1;\n}\n\nexport function endStoreBatch<T extends object>(\n batchState: BitStoreBatchState<T>,\n): boolean {\n batchState.depth -= 1;\n return batchState.depth === 0;\n}\n\nexport function getEffectiveStoreState<T extends object>(\n currentState: BitState<T>,\n batchState: BitStoreBatchState<T>,\n): BitState<T> {\n return batchState.pendingState ?? currentState;\n}\n\nexport function trackBatchedStoreUpdate<T extends object>(\n batchState: BitStoreBatchState<T>,\n updateResult: BitStateUpdateResult<T>,\n): void {\n batchState.pendingState = updateResult.nextState;\n batchState.valuesChanged ||= updateResult.valuesChanged;\n\n if (updateResult.changedPaths && updateResult.changedPaths.length > 0) {\n const pathSet = batchState.changedPathSet ?? new Set<string>();\n updateResult.changedPaths.forEach((path) => pathSet.add(path));\n batchState.changedPathSet = pathSet;\n }\n}\n\nexport function flushStoreBatchState<T extends object>(args: {\n currentState: BitState<T>;\n batchState: BitStoreBatchState<T>;\n applyComputedValues: (values: T, changedPaths?: readonly string[]) => T;\n}): BitStoreBatchFlushResult<T> | null {\n const { currentState, batchState, applyComputedValues } = args;\n\n if (!batchState.pendingState) {\n batchState.pendingHistorySnapshot = false;\n return null;\n }\n\n let nextState = batchState.pendingState;\n const changedPaths = batchState.changedPathSet ?? undefined;\n const valuesChanged = batchState.valuesChanged;\n\n if (valuesChanged) {\n const computedChangedPaths = changedPaths ? [...changedPaths] : undefined;\n nextState = {\n ...nextState,\n values: applyComputedValues(nextState.values, computedChangedPaths),\n };\n }\n\n batchState.pendingState = null;\n batchState.changedPathSet = null;\n batchState.valuesChanged = false;\n // Note: pendingHistorySnapshot is reset by the caller after it records the snapshot.\n\n return {\n nextState: nextState ?? currentState,\n changedPaths,\n valuesChanged,\n };\n}\n","import type { BitErrors, BitState } from \"../contracts/types\";\nimport { hasAnyError } from \"../shared/error-map\";\n\nfunction normalizeErrors<T extends object>(errors: BitErrors<T>): BitErrors<T> {\n let hasUndefined = false;\n\n for (const message of Object.values(errors)) {\n if (message === undefined) {\n hasUndefined = true;\n break;\n }\n }\n\n if (!hasUndefined) {\n return errors;\n }\n\n const normalized: BitErrors<T> = {};\n\n Object.entries(errors).forEach(([path, message]) => {\n if (message === undefined) {\n return;\n }\n\n normalized[path as keyof BitErrors<T>] = message as any;\n });\n\n return normalized;\n}\n\nexport interface BitStateUpdateResult<T extends object> {\n nextState: BitState<T>;\n changedPaths?: string[];\n valuesChanged: boolean;\n}\n\nexport function applyStateUpdate<T extends object>(args: {\n currentState: BitState<T>;\n partialState: Partial<BitState<T>>;\n changedPaths?: string[];\n applyComputedValues: (values: T) => T;\n}): BitStateUpdateResult<T> {\n const { currentState, partialState, changedPaths, applyComputedValues } =\n args;\n\n const nextState: BitState<T> = { ...currentState, ...partialState };\n const valuesChanged = !!partialState.values;\n\n if (partialState.values) {\n nextState.values = applyComputedValues(partialState.values);\n }\n\n if (partialState.errors) {\n nextState.errors = normalizeErrors(partialState.errors as BitErrors<T>);\n nextState.isValid = !hasAnyError(\n nextState.errors as Record<string, unknown>,\n );\n }\n\n const explicitChangedPaths =\n changedPaths && changedPaths.length > 0 ? changedPaths : undefined;\n const inferredChangedPaths = inferChangedPaths(partialState);\n const effectiveChangedPaths = mergeChangedPaths(\n explicitChangedPaths,\n inferredChangedPaths,\n );\n\n return {\n nextState,\n changedPaths: effectiveChangedPaths,\n valuesChanged,\n };\n}\n\nfunction inferChangedPaths<T extends object>(\n partialState: Partial<BitState<T>>,\n): string[] | undefined {\n const changedPaths = new Set<string>();\n\n // Itera os três dicionários de path em único passo para evitar\n // três Object.keys() + três forEach() separados.\n const pathMaps = [\n partialState.errors,\n partialState.touched,\n partialState.isValidating,\n ] as const;\n for (const map of pathMaps) {\n if (map) {\n for (const path in map) {\n changedPaths.add(path);\n }\n }\n }\n\n if (partialState.persist) {\n changedPaths.add(\"persist\");\n }\n\n if (\"isValid\" in partialState) {\n changedPaths.add(\"isValid\");\n }\n\n if (\"isDirty\" in partialState) {\n changedPaths.add(\"isDirty\");\n }\n\n if (\"isSubmitting\" in partialState) {\n changedPaths.add(\"isSubmitting\");\n }\n\n return changedPaths.size > 0 ? Array.from(changedPaths) : undefined;\n}\n\nfunction mergeChangedPaths(\n explicitChangedPaths?: string[],\n inferredChangedPaths?: string[],\n): string[] | undefined {\n if (!explicitChangedPaths?.length) {\n return inferredChangedPaths;\n }\n\n if (!inferredChangedPaths?.length) {\n return explicitChangedPaths;\n }\n\n const merged = new Set<string>();\n\n for (const path of explicitChangedPaths) {\n merged.add(path);\n }\n\n for (const path of inferredChangedPaths) {\n merged.add(path);\n }\n\n return Array.from(merged);\n}\n","import type { BitState } from \"../contracts/types\";\nimport {\n BitStatePatchOperation,\n BitStoreOperation,\n patchStateOperation,\n} from \"./operation-engine\";\nimport { applyStateUpdate } from \"./state-update-engine\";\nimport {\n flushStoreBatchState,\n getEffectiveStoreState,\n trackBatchedStoreUpdate,\n type BitStoreBatchState,\n} from \"./store-batch-engine\";\n\nfunction routeStoreOperation<T extends object>(\n currentState: Readonly<BitState<T>>,\n operation: BitStoreOperation<T>,\n): BitStatePatchOperation<T> | null {\n if (operation.kind === \"state.patch\") {\n return operation;\n }\n\n if (operation.kind === \"field.touchMany\") {\n if (operation.paths.length === 0) {\n return null;\n }\n\n const touched = { ...currentState.touched };\n for (const path of operation.paths) {\n touched[path as keyof typeof touched] = true;\n }\n\n return patchStateOperation({ touched }, operation.paths);\n }\n\n if (operation.kind === \"form.persistMeta\") {\n return patchStateOperation({\n persist: {\n ...currentState.persist,\n ...operation.patch,\n },\n });\n }\n\n if (operation.kind === \"history.apply\") {\n return patchStateOperation(\n {\n values: operation.values,\n isDirty: operation.isDirty,\n },\n [\"*\"],\n );\n }\n\n return patchStateOperation({\n errors: operation.errors,\n isValid: operation.isValid,\n });\n}\n\nfunction executeStatePatchOperation<T extends object>(args: {\n currentState: BitState<T>;\n operation: BitStatePatchOperation<T>;\n applyComputedValues: (values: T, changedPaths?: string[]) => T;\n}) {\n const { currentState, operation, applyComputedValues } = args;\n\n const hasValuesPatch = Object.prototype.hasOwnProperty.call(\n operation.partialState,\n \"values\",\n );\n const effectiveChangedPaths =\n operation.changedPaths ?? (hasValuesPatch ? [\"*\"] : undefined);\n\n return applyStateUpdate({\n currentState,\n partialState: operation.partialState,\n changedPaths: effectiveChangedPaths,\n applyComputedValues: (values) =>\n applyComputedValues(values, effectiveChangedPaths),\n });\n}\n\nfunction executeStoreOperation<T extends object>(args: {\n currentState: BitState<T>;\n operation: BitStoreOperation<T>;\n applyComputedValues: (values: T, changedPaths?: string[]) => T;\n}) {\n const { currentState, operation, applyComputedValues } = args;\n const patchOperation = routeStoreOperation(currentState, operation);\n\n if (!patchOperation) {\n return null;\n }\n\n return executeStatePatchOperation({\n currentState,\n operation: patchOperation,\n applyComputedValues: (values, changedPaths) =>\n patchOperation.skipComputed\n ? values\n : applyComputedValues(values, changedPaths),\n });\n}\n\nexport function dispatchStoreKernelOperation<T extends object>(args: {\n state: BitState<T>;\n batchState: BitStoreBatchState<T>;\n operation: BitStoreOperation<T>;\n applyComputedValues: (values: T, changedPaths?: readonly string[]) => T;\n onStateCommitted: (payload: {\n nextState: BitState<T>;\n changedPaths?: Iterable<string>;\n valuesChanged: boolean;\n }) => void;\n}): BitState<T> {\n const {\n state,\n batchState,\n operation,\n applyComputedValues,\n onStateCommitted,\n } = args;\n\n const currentState = getEffectiveStoreState(state, batchState);\n\n if (batchState.depth > 0) {\n const updateResult = executeStoreOperation({\n currentState,\n operation,\n applyComputedValues: (values) => values,\n });\n\n if (!updateResult) {\n return state;\n }\n\n trackBatchedStoreUpdate(batchState, updateResult);\n return state;\n }\n\n const updateResult = executeStoreOperation({\n currentState: state,\n operation,\n applyComputedValues,\n });\n\n if (!updateResult) {\n return state;\n }\n\n onStateCommitted({\n nextState: updateResult.nextState,\n changedPaths: updateResult.changedPaths,\n valuesChanged: updateResult.valuesChanged,\n });\n\n return updateResult.nextState;\n}\n\nexport function flushStoreKernelBatch<T extends object>(args: {\n state: BitState<T>;\n batchState: BitStoreBatchState<T>;\n applyComputedValues: (values: T, changedPaths?: readonly string[]) => T;\n onStateCommitted: (payload: {\n nextState: BitState<T>;\n changedPaths?: Iterable<string>;\n valuesChanged: boolean;\n }) => void;\n}): BitState<T> {\n const { state, batchState, applyComputedValues, onStateCommitted } = args;\n\n const flushResult = flushStoreBatchState({\n currentState: state,\n batchState,\n applyComputedValues,\n });\n\n if (!flushResult) {\n return state;\n }\n\n onStateCommitted({\n nextState: flushResult.nextState,\n changedPaths: flushResult.changedPaths,\n valuesChanged: flushResult.valuesChanged,\n });\n\n return flushResult.nextState;\n}\n","import {\n beginStoreBatch,\n endStoreBatch,\n type BitStoreBatchState,\n} from \"../engines/store-batch-engine\";\nimport {\n dispatchStoreKernelOperation,\n flushStoreKernelBatch,\n} from \"../engines/store-commit-engine\";\nimport type { BitStoreOperation } from \"../engines/operation-engine\";\nimport type { BitState } from \"../contracts/types\";\n\nexport function runStoreStateBatch<T extends object, TResult>(args: {\n batchState: BitStoreBatchState<T>;\n callback: () => TResult;\n flushBatchedStateUpdates: () => void;\n}): TResult {\n const { batchState, callback, flushBatchedStateUpdates } = args;\n beginStoreBatch(batchState);\n\n try {\n return callback();\n } finally {\n if (endStoreBatch(batchState)) {\n flushBatchedStateUpdates();\n }\n }\n}\n\nexport function commitStoreStateUpdate<T extends object>(args: {\n payload: {\n nextState: BitState<T>;\n changedPaths?: Iterable<string>;\n valuesChanged: boolean;\n };\n setState: (state: BitState<T>) => void;\n notifySubscriptions: (\n state: BitState<T>,\n changedPaths?: Iterable<string>,\n ) => void;\n notifyEffects: (state: BitState<T>, valuesChanged: boolean) => void;\n}): void {\n const { payload, setState, notifySubscriptions, notifyEffects } = args;\n setState(payload.nextState);\n notifySubscriptions(payload.nextState, payload.changedPaths);\n notifyEffects(payload.nextState, payload.valuesChanged);\n}\n\nexport function dispatchStoreStateOperation<T extends object>(args: {\n state: BitState<T>;\n batchState: BitStoreBatchState<T>;\n operation: BitStoreOperation<T>;\n applyComputedValues: (values: T, changedPaths?: readonly string[]) => T;\n onStateCommitted: (payload: {\n nextState: BitState<T>;\n changedPaths?: Iterable<string>;\n valuesChanged: boolean;\n }) => void;\n}): BitState<T> {\n const {\n state,\n batchState,\n operation,\n applyComputedValues,\n onStateCommitted,\n } = args;\n\n return dispatchStoreKernelOperation({\n state,\n batchState,\n operation,\n applyComputedValues,\n onStateCommitted,\n });\n}\n\nexport function saveStoreHistorySnapshot<T extends object>(args: {\n batchState: BitStoreBatchState<T>;\n values: T;\n saveHistory: (values: T) => void;\n}): void {\n const { batchState, values, saveHistory } = args;\n\n if (batchState.depth > 0) {\n batchState.pendingHistorySnapshot = true;\n return;\n }\n\n saveHistory(values);\n}\n\nexport function flushStoreBatchedStateUpdates<T extends object>(args: {\n state: BitState<T>;\n batchState: BitStoreBatchState<T>;\n applyComputedValues: (values: T, changedPaths?: readonly string[]) => T;\n onStateCommitted: (payload: {\n nextState: BitState<T>;\n changedPaths?: Iterable<string>;\n valuesChanged: boolean;\n }) => void;\n saveHistory: (values: T) => void;\n}): BitState<T> {\n const {\n state,\n batchState,\n applyComputedValues,\n onStateCommitted,\n saveHistory,\n } = args;\n\n const nextState = flushStoreKernelBatch({\n state,\n batchState,\n applyComputedValues,\n onStateCommitted,\n });\n\n if (batchState.pendingHistorySnapshot) {\n batchState.pendingHistorySnapshot = false;\n saveHistory(nextState.values);\n }\n\n return nextState;\n}\n","import {\n createStoreBatchState,\n getEffectiveStoreState,\n type BitStoreBatchState,\n} from \"../engines/store-batch-engine\";\nimport type { BitStoreEffectEngine } from \"../engines/effect-engine\";\nimport type { BitStoreOperation } from \"../engines/operation-engine\";\nimport type { BitSubscriptionEngine } from \"../engines/subscription-engine\";\nimport type { BitState } from \"../contracts/types\";\nimport type { BitComputedManager } from \"../managers/core/computed-manager\";\nimport type { BitStoreCapabilities } from \"./capabilities\";\nimport {\n commitStoreStateUpdate,\n dispatchStoreStateOperation,\n flushStoreBatchedStateUpdates,\n runStoreStateBatch,\n saveStoreHistorySnapshot,\n} from \"./store-state-ops\";\n\nexport interface BitStoreRuntimeKernelArgs<T extends object> {\n state: BitState<T>;\n subscriptions: BitSubscriptionEngine<T>;\n effects: BitStoreEffectEngine<T>;\n capabilities: BitStoreCapabilities<T>;\n computedManager: BitComputedManager<T>;\n}\n\nexport class BitStoreRuntimeKernel<T extends object> {\n private state: BitState<T>;\n private readonly batchState: BitStoreBatchState<T> =\n createStoreBatchState<T>();\n\n readonly subscriptions: BitSubscriptionEngine<T>;\n readonly effects: BitStoreEffectEngine<T>;\n readonly capabilities: BitStoreCapabilities<T>;\n\n constructor(private readonly args: BitStoreRuntimeKernelArgs<T>) {\n this.state = args.state;\n this.subscriptions = args.subscriptions;\n this.effects = args.effects;\n this.capabilities = args.capabilities;\n }\n\n getState(): BitState<T> {\n return getEffectiveStoreState(this.state, this.batchState);\n }\n\n runBatch<TResult>(callback: () => TResult): TResult {\n return runStoreStateBatch({\n batchState: this.batchState,\n callback,\n flushBatchedStateUpdates: () => this.flushBatchedStateUpdates(),\n });\n }\n\n dispatch(operation: BitStoreOperation<T>): void {\n this.state = dispatchStoreStateOperation({\n state: this.state,\n batchState: this.batchState,\n operation,\n applyComputedValues: (values, changedPaths) => {\n const normalizedPaths = changedPaths\n ? Array.from(changedPaths)\n : undefined;\n return this.args.computedManager.apply(values, normalizedPaths);\n },\n onStateCommitted: (payload) => this.onStateCommitted(payload),\n });\n }\n\n saveHistorySnapshot(): void {\n saveStoreHistorySnapshot({\n batchState: this.batchState,\n values: this.state.values,\n saveHistory: (values) => this.capabilities.history.saveSnapshot(values),\n });\n }\n\n cleanup(): void {\n this.subscriptions.destroy();\n this.capabilities.validation.cancelAll();\n this.effects.destroy();\n }\n\n private onStateCommitted(payload: {\n nextState: BitState<T>;\n changedPaths?: Iterable<string>;\n valuesChanged: boolean;\n }): void {\n commitStoreStateUpdate({\n payload,\n setState: (state) => {\n this.state = state;\n },\n notifySubscriptions: (state, changedPaths) =>\n this.subscriptions.notify(state, changedPaths),\n notifyEffects: (state, valuesChanged) =>\n this.effects.onStateUpdated(state, valuesChanged),\n });\n }\n\n private flushBatchedStateUpdates(): void {\n this.state = flushStoreBatchedStateUpdates({\n state: this.state,\n batchState: this.batchState,\n applyComputedValues: (values, changedPaths) => {\n const normalizedPaths = changedPaths\n ? Array.from(changedPaths)\n : undefined;\n return this.args.computedManager.apply(values, normalizedPaths);\n },\n onStateCommitted: (payload) => this.onStateCommitted(payload),\n saveHistory: (values) => this.capabilities.history.saveSnapshot(values),\n });\n }\n}\n","import { BitMask } from \"../mask/types\";\nimport { getDeepValue } from \"../utils\";\nimport {\n BitArrayItem,\n BitArrayPath,\n BitConfig,\n BitErrors,\n BitFieldChangeMeta,\n BitFieldDefinition,\n BitFieldState,\n BitPath,\n BitPathValue,\n BitPersistMetadata,\n BitState,\n BitTransformFn,\n DeepPartial,\n ScopeStatus,\n} from \"./contracts/types\";\nimport type {\n BitFormMeta,\n BitFrameworkConfig,\n BitHistoryMetadata,\n BitSelector,\n BitSelectorSubscriptionOptions,\n BitValidationOptions,\n} from \"./contracts/public-types\";\nimport type { BitValidationTriggerOptions } from \"./contracts/port-types\";\nimport {\n createFieldStateSnapshot,\n resolveFieldMask,\n} from \"./engines/store-field-query-engine\";\nimport { touchFieldsOperation } from \"./engines/operation-engine\";\nimport {\n BitComputedEntry,\n BitComputedManager,\n} from \"./managers/core/computed-manager\";\nimport { BitDirtyManager } from \"./managers/core/dirty-manager\";\nimport { BitMaskManager } from \"./managers/features/mask-manager\";\nimport { BitFieldRegistry } from \"./registry/field-registry\";\nimport { normalizeConfig } from \"./shared/config\";\nimport { createStoreEffects } from \"./orchestration/store-bootstrap\";\nimport {\n clearPersistedFeature,\n forceSavePersistedFeature,\n readHistoryFeatureMetadata,\n restorePersistedFeature,\n runRedoFeature,\n runUndoFeature,\n} from \"./orchestration/store-feature-ops\";\nimport { BIT_HOOKS_API_SYMBOL } from \"./orchestration/hook-brand\";\nimport {\n registerStoreField,\n unregisterStoreField,\n unregisterStorePrefix,\n} from \"./orchestration/store-registration-ops\";\nimport {\n subscribeStoreFieldState,\n subscribeStoreFormMeta,\n subscribeStoreHistoryMeta,\n subscribeStorePath,\n subscribeStorePersistMeta,\n subscribeStoreScopeStatus,\n subscribeStoreSelector,\n subscribeStoreTracked,\n} from \"./orchestration/store-observe-ops\";\nimport { applyStorePersistedValues } from \"./orchestration/store-persist-ops\";\nimport { createStoreRuntime } from \"./orchestration/store-runtime\";\nimport { BitStoreRuntimeKernel } from \"./orchestration/store-runtime-kernel\";\n\nexport class BitStore<T extends object = any> {\n public readonly [BIT_HOOKS_API_SYMBOL] = true;\n\n private readonly runtime: BitStoreRuntimeKernel<T>;\n private readonly maskManager: BitMaskManager;\n private readonly _config: BitFrameworkConfig<T>;\n private _cachedConfig: BitFrameworkConfig<T>;\n private _initialValues!: T;\n\n public readonly storeId: string;\n get config(): Readonly<BitFrameworkConfig<T>> {\n return this._cachedConfig ?? this._config;\n }\n\n private readonly fieldRegistry: BitFieldRegistry<T>;\n private readonly computedManager: BitComputedManager<T>;\n private readonly dirtyManager: BitDirtyManager<T>;\n\n private invalidateFieldIndexes() {\n this.fieldRegistry.invalidateIndexes();\n this.computedManager.invalidateReverseDeps();\n }\n\n constructor(config: BitConfig<T> = {}) {\n this._config = normalizeConfig(config);\n this._initialValues = this._config.initialValues;\n this.fieldRegistry = new BitFieldRegistry<T>();\n this.computedManager = new BitComputedManager<T>(() =>\n this.getComputedEntries(),\n );\n this.dirtyManager = new BitDirtyManager<T>();\n this.maskManager = new BitMaskManager();\n\n if (this._config.masks) {\n Object.entries(this._config.masks).forEach(([name, mask]) => {\n this.maskManager.registerMask(name, mask);\n });\n }\n\n let runtimeKernel: BitStoreRuntimeKernel<T> | null = null;\n\n const runtime = createStoreRuntime<T>({\n rawConfig: config,\n config: this._config,\n fieldRegistry: this.fieldRegistry,\n computedManager: this.computedManager,\n dirtyManager: this.dirtyManager,\n initialValuesRef: {\n get: () => this._initialValues,\n set: (values) => {\n this._initialValues = values;\n },\n },\n getState: () => runtimeKernel?.getState() ?? runtime.state,\n dispatch: (operation) => runtimeKernel?.dispatch(operation),\n setError: (path, message) => this.setError(path, message),\n validate: (options) => this.validate(options),\n getFieldConfig: (path) => this.getFieldConfig(path),\n getScopeFields: (scopeName) => this.getScopeFields(scopeName),\n getEffects: () => runtimeKernel!.effects,\n saveHistorySnapshot: () => runtimeKernel?.saveHistorySnapshot(),\n runStateBatch: (callback) => runtimeKernel!.runBatch(callback),\n getTransformEntries: () => this.getTransformEntries(),\n getHistory: () => runtimeKernel!.capabilities.history,\n getValidation: () => runtimeKernel!.capabilities.validation,\n setFieldWithMeta: (path, value, meta) =>\n this.setFieldWithMeta(path, value, meta),\n unregisterPrefix: (prefix) => this.unregisterPrefix(prefix),\n triggerValidation: (scopeFields, options) =>\n this.triggerValidation(scopeFields, options),\n getConfig: () => this.getConfig(),\n });\n\n this.storeId = runtime.storeId;\n\n const effects = createStoreEffects<T>({\n storeId: this.storeId,\n storeInstance: this,\n config: this._config,\n getState: () => runtimeKernel?.getState() ?? runtime.state,\n getConfig: () => this.getConfig(),\n getValues: () => (runtimeKernel?.getState() ?? runtime.state).values,\n getDirtyValues: () => this.getDirtyValues(),\n applyPersistedValues: (values) => this.applyPersistedValues(values),\n });\n\n runtimeKernel = new BitStoreRuntimeKernel<T>({\n state: runtime.state,\n subscriptions: runtime.subscriptions,\n effects,\n capabilities: runtime.capabilities,\n computedManager: this.computedManager,\n });\n\n this.runtime = runtimeKernel;\n this.runtime.saveHistorySnapshot();\n this._cachedConfig = this._config;\n }\n\n getConfig() {\n return this._cachedConfig ?? this._config;\n }\n\n getFieldConfig(path: string): BitFieldDefinition<T> | undefined {\n return this.fieldRegistry.getFieldConfig(path);\n }\n\n getScopeFields(scopeName: string): string[] {\n return this.fieldRegistry.getScopeFields(scopeName);\n }\n\n private getComputedEntries(): BitComputedEntry<T>[] {\n return this.fieldRegistry.getComputedEntries();\n }\n\n private getTransformEntries(): [string, BitTransformFn<T>][] {\n return this.fieldRegistry.getTransformEntries();\n }\n\n resolveMask(path: string): BitMask | undefined {\n return resolveFieldMask({\n path,\n getFieldConfig: (fieldPath) => this.getFieldConfig(fieldPath),\n masks: this.maskManager.getAllMasks(),\n });\n }\n\n createArrayItemId(path: string, index?: number): string {\n return this._config.idFactory({\n scope: \"array\",\n path,\n index,\n });\n }\n\n getState(): BitState<T> {\n return this.runtime.getState();\n }\n\n getFieldState<P extends BitPath<T>>(\n path: P,\n ): BitFieldState<T, BitPathValue<T, P>> {\n const effectiveState = this.getState();\n const value = getDeepValue(\n effectiveState.values,\n path as string,\n ) as BitPathValue<T, P>;\n\n return createFieldStateSnapshot({\n state: effectiveState,\n path,\n value,\n isHidden: this.isHidden(path),\n isRequired: this.isRequired(path),\n isDirty: this.isFieldDirty(path as string),\n isValidating: this.isFieldValidating(path as string),\n });\n }\n\n get isValid(): boolean {\n return this.getState().isValid;\n }\n\n get isSubmitting(): boolean {\n return this.getState().isSubmitting;\n }\n\n get isDirty(): boolean {\n return this.getState().isDirty;\n }\n\n registerField(path: string, config: BitFieldDefinition<T>) {\n registerStoreField({\n path,\n config,\n state: this.getState(),\n fieldRegistry: this.fieldRegistry,\n subscriptions: this.runtime.subscriptions,\n invalidateFieldIndexes: () => this.invalidateFieldIndexes(),\n });\n }\n\n unregisterField(path: string) {\n unregisterStoreField({\n path,\n state: this.getState(),\n hasStaticConfig: !!this._config.fields?.[path as string],\n fieldRegistry: this.fieldRegistry,\n validationCleanupField: (fieldPath) =>\n this.runtime.capabilities.validation.cleanupField(fieldPath),\n invalidateFieldIndexes: () => this.invalidateFieldIndexes(),\n dispatch: (operation) => this.runtime.dispatch(operation),\n });\n }\n\n unregisterPrefix(prefix: string) {\n unregisterStorePrefix({\n prefix,\n fieldRegistry: this.fieldRegistry,\n validationCleanupPrefix: (fieldPrefix) =>\n this.runtime.capabilities.validation.cleanupPrefix(fieldPrefix),\n invalidateFieldIndexes: () => this.invalidateFieldIndexes(),\n });\n }\n\n isHidden<P extends BitPath<T>>(path: P): boolean {\n return this.runtime.capabilities.query.isHidden(path);\n }\n\n isRequired<P extends BitPath<T>>(path: P): boolean {\n return this.runtime.capabilities.query.isRequired(path);\n }\n\n isFieldDirty(path: string): boolean {\n return this.runtime.capabilities.query.isFieldDirty(path);\n }\n\n isFieldValidating(path: string): boolean {\n return this.runtime.capabilities.query.isFieldValidating(path);\n }\n\n subscribe(listener: () => void): () => void {\n return this.runtime.subscriptions.subscribe(listener);\n }\n\n subscribePersistMeta(\n listener: (meta: BitPersistMetadata) => void,\n ): () => void {\n return subscribeStorePersistMeta({\n listener,\n subscribeSelector: (selector, persistListener, options) =>\n this.subscribeSelector(selector, persistListener, options),\n });\n }\n\n subscribeHistoryMeta(\n listener: (meta: BitHistoryMetadata) => void,\n ): () => void {\n return subscribeStoreHistoryMeta({\n readHistoryMeta: () => this.getHistoryMetadata(),\n subscribe: (metaListener) => this.subscribe(metaListener),\n listener,\n });\n }\n\n subscribeScopeStatus(\n scopeName: string,\n listener: (status: ScopeStatus) => void,\n ): () => void {\n return subscribeStoreScopeStatus({\n scopeName,\n readScopeStatus: (targetScopeName) => this.getStepStatus(targetScopeName),\n getScopeFields: (targetScopeName) => this.getScopeFields(targetScopeName),\n subscribeSelector: (selector, statusListener, options) =>\n this.subscribeSelector(selector, statusListener, options),\n listener,\n });\n }\n\n subscribeSelector<TSlice>(\n selector: BitSelector<T, TSlice>,\n listener: (slice: TSlice) => void,\n options?: BitSelectorSubscriptionOptions<TSlice>,\n ) {\n return subscribeStoreSelector({\n subscriptions: this.runtime.subscriptions,\n selector,\n listener,\n options,\n });\n }\n\n subscribeTracked<TSlice>(\n selector: BitSelector<T, TSlice>,\n listener: (slice: TSlice) => void,\n options?: Omit<BitSelectorSubscriptionOptions<TSlice>, \"paths\">,\n ) {\n return subscribeStoreTracked({\n getState: () => this.getState(),\n subscribeSelector: (trackedSelector, trackedListener, trackedOptions) =>\n this.subscribeSelector(\n trackedSelector,\n trackedListener,\n trackedOptions,\n ),\n selector,\n listener,\n options,\n });\n }\n\n subscribePath<P extends BitPath<T>>(\n path: P,\n listener: (value: BitPathValue<T, P>) => void,\n options?: BitSelectorSubscriptionOptions<BitPathValue<T, P>>,\n ) {\n return subscribeStorePath({\n path,\n listener,\n options,\n subscribeSelector: (selector, pathListener, pathOptions) =>\n this.subscribeSelector(selector, pathListener, pathOptions),\n });\n }\n\n subscribeFieldState<P extends BitPath<T>>(\n path: P,\n listener: (state: Readonly<BitFieldState<T, BitPathValue<T, P>>>) => void,\n ): () => void {\n return subscribeStoreFieldState({\n path,\n listener,\n getFieldState: (fieldPath) => this.getFieldState(fieldPath),\n subscribeSelector: (selector, fieldStateListener, fieldStateOptions) =>\n this.subscribeSelector(selector, fieldStateListener, fieldStateOptions),\n });\n }\n\n subscribeFormMeta(listener: (meta: BitFormMeta) => void): () => void {\n return subscribeStoreFormMeta({\n listener,\n subscribeSelector: (selector, metaListener, metaOptions) =>\n this.subscribeSelector(selector, metaListener, metaOptions),\n });\n }\n\n setField<P extends BitPath<T>>(path: P, value: BitPathValue<T, P>) {\n this.setFieldWithMeta(path as string, value, { origin: \"setField\" });\n }\n\n private setFieldWithMeta(\n path: string,\n value: any,\n meta: BitFieldChangeMeta = { origin: \"setField\" },\n ) {\n this.runtime.capabilities.lifecycle.updateField(path, value, meta);\n }\n\n blurField<P extends BitPath<T>>(path: P) {\n this.runtime.saveHistorySnapshot();\n\n if (!this.runtime.capabilities.query.isTouched(path as string)) {\n this.runtime.runBatch(() => {\n this.runtime.dispatch(touchFieldsOperation([path as string]));\n });\n }\n\n this.runtime.capabilities.validation.trigger([path]);\n }\n\n markFieldsTouched(paths: string[]) {\n if (paths.length === 0) return;\n this.runtime.dispatch(touchFieldsOperation(paths));\n }\n\n setValues(\n values: T | DeepPartial<T>,\n options?: { partial?: boolean; rebase?: boolean },\n ) {\n this.runtime.capabilities.lifecycle.setValues(values, options);\n }\n\n setError(path: string, message: string | undefined) {\n this.runtime.capabilities.error.setError(path, message);\n }\n\n setErrors(errors: BitErrors<T>) {\n this.runtime.capabilities.error.setErrors(errors);\n }\n\n setServerErrors(serverErrors: Record<string, string[] | string>) {\n this.runtime.capabilities.error.setServerErrors(serverErrors);\n }\n\n reset() {\n this.runtime.capabilities.lifecycle.reset();\n }\n\n transaction<TResult>(callback: () => TResult): TResult {\n return this.runtime.runBatch(callback);\n }\n\n async submit(\n onSuccess: (values: T, dirtyValues?: Partial<T>) => void | Promise<void>,\n ) {\n return this.runtime.capabilities.lifecycle.submit(onSuccess);\n }\n\n getDirtyValues(): Partial<T> {\n return this.dirtyManager.buildDirtyValues(this.getState().values);\n }\n\n getPersistMetadata(): BitPersistMetadata {\n return this.getState().persist;\n }\n\n async restorePersisted(): Promise<boolean> {\n return restorePersistedFeature({\n dispatch: (operation) => this.runtime.dispatch(operation),\n effects: this.runtime.effects,\n });\n }\n\n async forceSave(): Promise<void> {\n return forceSavePersistedFeature({\n dispatch: (operation) => this.runtime.dispatch(operation),\n effects: this.runtime.effects,\n });\n }\n\n async clearPersisted(): Promise<void> {\n return clearPersistedFeature({\n dispatch: (operation) => this.runtime.dispatch(operation),\n effects: this.runtime.effects,\n });\n }\n\n pushItem<P extends BitArrayPath<T>>(\n path: P,\n value: BitArrayItem<BitPathValue<T, P>>,\n ) {\n this.runtime.capabilities.arrays.pushItem(path, value);\n }\n\n prependItem<P extends BitArrayPath<T>>(\n path: P,\n value: BitArrayItem<BitPathValue<T, P>>,\n ) {\n this.runtime.capabilities.arrays.prependItem(path, value);\n }\n\n insertItem<P extends BitArrayPath<T>>(\n path: P,\n index: number,\n value: BitArrayItem<BitPathValue<T, P>>,\n ) {\n this.runtime.capabilities.arrays.insertItem(path, index, value);\n }\n\n removeItem<P extends BitArrayPath<T>>(path: P, index: number) {\n this.runtime.capabilities.arrays.removeItem(path, index);\n }\n\n swapItems<P extends BitArrayPath<T>>(\n path: P,\n indexA: number,\n indexB: number,\n ) {\n this.runtime.capabilities.arrays.swapItems(path, indexA, indexB);\n }\n\n moveItem<P extends BitArrayPath<T>>(path: P, from: number, to: number) {\n this.runtime.capabilities.arrays.moveItem(path, from, to);\n }\n\n get canUndo(): boolean {\n return this.runtime.capabilities.history.canUndo;\n }\n\n get canRedo(): boolean {\n return this.runtime.capabilities.history.canRedo;\n }\n\n undo() {\n runUndoFeature({\n history: this.runtime.capabilities.history,\n applyHistoryState: (values) =>\n this.runtime.capabilities.lifecycle.applyHistoryState(values),\n });\n }\n\n redo() {\n runRedoFeature({\n history: this.runtime.capabilities.history,\n applyHistoryState: (values) =>\n this.runtime.capabilities.lifecycle.applyHistoryState(values),\n });\n }\n\n getHistoryMetadata(): BitHistoryMetadata {\n return readHistoryFeatureMetadata({\n history: this.runtime.capabilities.history,\n });\n }\n\n validate(options?: BitValidationOptions): Promise<boolean> {\n return this.runtime.capabilities.validation.validate(options);\n }\n\n hasValidationsInProgress(scopeFields?: string[]): boolean {\n return this.runtime.capabilities.validation.hasValidationsInProgress(\n scopeFields,\n );\n }\n\n triggerValidation(\n scopeFields?: string[],\n options?: BitValidationTriggerOptions,\n ) {\n this.runtime.capabilities.validation.trigger(scopeFields, options);\n }\n\n getStepStatus(scopeName: string) {\n return this.runtime.capabilities.scope.getStepStatus(scopeName);\n }\n\n getStepErrors(scopeName: string): Record<string, string> {\n return this.runtime.capabilities.scope.getStepErrors(scopeName);\n }\n\n private applyPersistedValues(values: Partial<T>) {\n applyStorePersistedValues({\n values,\n state: this.getState(),\n initialValues: this._initialValues,\n validation: this.runtime.capabilities.validation,\n fieldRegistry: this.fieldRegistry,\n dirtyManager: this.dirtyManager,\n dispatch: (operation) => this.runtime.dispatch(operation),\n saveHistorySnapshot: () => this.runtime.saveHistorySnapshot(),\n });\n }\n\n cleanup() {\n this.runtime.cleanup();\n }\n}\n","import { BitStore } from \"../index\";\nimport { BitConfig } from \"../contracts/types\";\nimport { BitStoreApi, BitStoreHooksApi } from \"../contracts/public-types\";\nimport { BIT_HOOKS_API_SYMBOL } from \"./hook-brand\";\n\nfunction isHookCompatibleStore<T extends object>(\n store: unknown,\n): store is BitStoreHooksApi<T> {\n if (!store || typeof store !== \"object\") {\n return false;\n }\n\n const candidate = store as Record<PropertyKey, unknown>;\n return candidate[BIT_HOOKS_API_SYMBOL] === true;\n}\n\nexport function resolveBitStoreForHooks<T extends object>(\n store: unknown,\n): BitStoreHooksApi<T> {\n if (isHookCompatibleStore(store)) {\n return store as unknown as BitStoreHooksApi<T>;\n }\n\n throw new Error(\n \"BitForm: o store informado não expõe a API necessária para hooks/framework bindings.\",\n );\n}\n\nexport function createBitStore<T extends object = any>(\n config: BitConfig<T> = {},\n): BitStoreHooksApi<T> {\n return new BitStore<T>(config) as unknown as BitStoreHooksApi<T>;\n}\n","/**\n * Field State Snapshot Utilities\n *\n * Shared utilities for creating and managing field state snapshots across frameworks\n * (React, Vue, Angular). Reduces code duplication while maintaining type safety.\n */\n\nimport { deepEqual } from \"../utils\";\n\n/**\n * Represents a stable snapshot of field state that can be compared for equality.\n */\nexport interface BitFieldSnapshot<TValue = any> {\n value: TValue;\n error: string | undefined;\n touched: boolean;\n isHidden: boolean;\n isRequired: boolean;\n isDirty: boolean;\n isValidating: boolean;\n}\n\n/**\n * Creates or reuses a field state snapshot with shallow equality checking.\n *\n * This function prevents unnecessary re-renders in frameworks like React by\n * returning the same object reference when field state hasn't changed.\n *\n * @param nextState - The new field state from the store\n * @param lastSnapshot - The previous snapshot (can be null on first call)\n * @returns A stable snapshot object that can be used for equality comparison\n *\n * @example\n * ```typescript\n * const snapshot = createFieldStateSnapshot(store.getFieldState(\"email\"), lastSnapshot);\n * if (snapshot !== lastSnapshot) {\n * // Field state changed, update component\n * render(snapshot);\n * }\n * ```\n */\nexport function createFieldStateSnapshot<TValue = any>(\n nextState: {\n value: TValue;\n error: string | undefined;\n touched: boolean;\n isHidden: boolean;\n isRequired: boolean;\n isDirty: boolean;\n isValidating: boolean;\n },\n lastSnapshot: BitFieldSnapshot<TValue> | null,\n): BitFieldSnapshot<TValue> {\n // Check if any field changed\n if (\n lastSnapshot &&\n lastSnapshot.value === nextState.value &&\n lastSnapshot.error === nextState.error &&\n lastSnapshot.touched === nextState.touched &&\n lastSnapshot.isHidden === nextState.isHidden &&\n lastSnapshot.isRequired === nextState.isRequired &&\n lastSnapshot.isDirty === nextState.isDirty &&\n lastSnapshot.isValidating === nextState.isValidating\n ) {\n // All fields equal, return cached snapshot\n return lastSnapshot;\n }\n\n // Create new snapshot object\n const newSnapshot: BitFieldSnapshot<TValue> = {\n value: nextState.value,\n error: nextState.error,\n touched: nextState.touched,\n isHidden: nextState.isHidden,\n isRequired: nextState.isRequired,\n isDirty: nextState.isDirty,\n isValidating: nextState.isValidating,\n };\n\n return newSnapshot;\n}\n\n/**\n * Deep comparison utility for field state snapshots.\n * Useful for scenarios where shallow comparison isn't sufficient (e.g., object/array values).\n *\n * @param snapshotA - First snapshot\n * @param snapshotB - Second snapshot\n * @returns true if snapshots are deeply equal\n */\nexport function areFieldSnapshotsEqual(\n snapshotA: BitFieldSnapshot | null | undefined,\n snapshotB: BitFieldSnapshot | null | undefined,\n): boolean {\n if (snapshotA === snapshotB) return true;\n if (!snapshotA || !snapshotB) return false;\n\n return (\n deepEqual(snapshotA.value, snapshotB.value) &&\n snapshotA.error === snapshotB.error &&\n snapshotA.touched === snapshotB.touched &&\n snapshotA.isHidden === snapshotB.isHidden &&\n snapshotA.isRequired === snapshotB.isRequired &&\n snapshotA.isDirty === snapshotB.isDirty &&\n snapshotA.isValidating === snapshotB.isValidating\n );\n}\n","import type { BitFormMeta, BitFormMetaBindingApi } from \"../public-types\";\n\nexport function readFormMetaSnapshot<T extends object>(\n store: BitFormMetaBindingApi<T>,\n): BitFormMeta {\n const state = store.getState();\n return {\n isValid: state.isValid,\n isDirty: state.isDirty,\n isSubmitting: state.isSubmitting,\n };\n}\n\nexport function subscribeFormMetaSnapshot<T extends object>(\n store: BitFormMetaBindingApi<T>,\n listener: () => void,\n): () => void {\n return store.subscribeFormMeta(() => listener());\n}\n\nexport function observeFormMetaSnapshot<T extends object>(\n store: BitFormMetaBindingApi<T>,\n listener: (meta: BitFormMeta) => void,\n): () => void {\n listener(readFormMetaSnapshot(store));\n\n return subscribeFormMetaSnapshot(store, () => {\n listener(readFormMetaSnapshot(store));\n });\n}\n","import type { BitPersistMetadata } from \"../public-types\";\n\nexport function readPersistMetaSnapshot(store: {\n getPersistMetadata(): BitPersistMetadata;\n}): BitPersistMetadata {\n return store.getPersistMetadata();\n}\n\nexport function subscribePersistMetaSnapshot(\n store: {\n subscribePersistMeta(\n listener: (meta: BitPersistMetadata) => void,\n ): () => void;\n },\n listener: () => void,\n): () => void {\n return store.subscribePersistMeta(() => listener());\n}\n\nexport function observePersistMetaSnapshot(\n store: {\n getPersistMetadata(): BitPersistMetadata;\n subscribePersistMeta(\n listener: (meta: BitPersistMetadata) => void,\n ): () => void;\n },\n listener: (meta: BitPersistMetadata) => void,\n): () => void {\n listener(readPersistMetaSnapshot(store));\n\n return store.subscribePersistMeta((meta) => {\n listener(meta);\n });\n}\n","import { extractServerErrors, isValidationErrorShape } from \"./utils\";\n\nexport interface BitSubmitExecutionHandlers {\n onServerErrors: (errors: Record<string, string[] | string>) => void;\n onUnhandledError: (error: Error) => void;\n onSuccess: (result: unknown) => void;\n}\n\nexport async function executeSubmitHandler<T extends object>(\n handler: (values: T, dirtyValues?: Partial<T>) => Promise<unknown>,\n values: T,\n dirtyValues: Partial<T> | undefined,\n handlers: BitSubmitExecutionHandlers,\n): Promise<void> {\n try {\n const result = await handler(values, dirtyValues);\n handlers.onSuccess(result);\n } catch (error) {\n if (isValidationErrorShape(error)) {\n handlers.onServerErrors(extractServerErrors(error));\n return;\n }\n\n handlers.onUnhandledError(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n}\n","import { executeSubmitHandler } from \"./submit-handler\";\nimport type { BitFormBindingApi } from \"./public-types\";\n\nexport type BitFormDomEvent = {\n preventDefault?: () => void;\n stopPropagation?: () => void;\n};\n\nexport interface BitFormControllerRuntime {\n clearSubmissionState: () => void;\n setSubmissionResult: (result: unknown) => void;\n setSubmissionError: (error: Error | null) => void;\n}\n\nexport interface BitFormControllerOptions {\n stopPropagation?: boolean;\n}\n\nexport function createStoreFormActions<T extends object>(\n store: BitFormBindingApi<T>,\n) {\n return {\n setField: <P extends Parameters<BitFormBindingApi<T>[\"setField\"]>[0]>(\n path: P,\n value: Parameters<BitFormBindingApi<T>[\"setField\"]>[1],\n ) => store.setField(path, value),\n blurField: <P extends Parameters<BitFormBindingApi<T>[\"blurField\"]>[0]>(\n path: P,\n ) => store.blurField(path),\n setValues: (\n values: Parameters<BitFormBindingApi<T>[\"setValues\"]>[0],\n options?: Parameters<BitFormBindingApi<T>[\"setValues\"]>[1],\n ) => store.setValues(values, options),\n setError: (path: string, message: string | undefined) =>\n store.setError(path, message),\n setErrors: (errors: Parameters<BitFormBindingApi<T>[\"setErrors\"]>[0]) =>\n store.setErrors(errors),\n setServerErrors: (\n serverErrors: Parameters<BitFormBindingApi<T>[\"setServerErrors\"]>[0],\n ) => store.setServerErrors(serverErrors),\n validate: (options?: Parameters<BitFormBindingApi<T>[\"validate\"]>[0]) =>\n store.validate(options),\n transaction: <TResult>(callback: () => TResult) =>\n store.transaction(callback),\n };\n}\n\nexport function preventFormEvent(\n event?: BitFormDomEvent,\n options?: BitFormControllerOptions,\n) {\n event?.preventDefault?.();\n if (options?.stopPropagation) {\n event?.stopPropagation?.();\n }\n}\n\nexport function createFormController<T extends object>(\n store: BitFormBindingApi<T>,\n runtime: BitFormControllerRuntime,\n options?: BitFormControllerOptions,\n) {\n const submit = (\n onSuccess: (values: T, dirtyValues?: Partial<T>) => void | Promise<void>,\n ) => {\n return (event?: BitFormDomEvent) => {\n preventFormEvent(event, options);\n return store.submit(onSuccess);\n };\n };\n\n const onSubmit = (\n handler: (values: T, dirtyValues?: Partial<T>) => Promise<unknown>,\n ) => {\n return (event?: BitFormDomEvent) => {\n preventFormEvent(event, options);\n runtime.setSubmissionError(null);\n\n return store.submit(async (values, dirtyValues) => {\n await executeSubmitHandler(handler, values, dirtyValues, {\n onSuccess: (result) => {\n runtime.setSubmissionResult(result);\n runtime.setSubmissionError(null);\n },\n onServerErrors: (serverErrors) => {\n store.setServerErrors(serverErrors);\n },\n onUnhandledError: (error) => {\n runtime.setSubmissionError(error);\n },\n });\n });\n };\n };\n\n const reset = () => {\n store.reset();\n runtime.clearSubmissionState();\n };\n\n return {\n submit,\n onSubmit,\n reset,\n getValues: () => store.getState().values,\n getErrors: () => store.getState().errors,\n getTouched: () => store.getState().touched,\n getDirtyValues: () => store.getDirtyValues(),\n };\n}\n","import {\n createFormController,\n createStoreFormActions,\n} from \"../form-controller\";\nimport type { BitFormBindingApi } from \"../public-types\";\nimport type {\n BitFormControllerOptions,\n BitFormControllerRuntime,\n} from \"../form-controller\";\n\nexport function createFrameworkFormBinding<T extends object>(\n store: BitFormBindingApi<T>,\n runtime: BitFormControllerRuntime,\n options?: BitFormControllerOptions,\n) {\n return {\n controller: createFormController(store, runtime, options),\n actions: createStoreFormActions(store),\n };\n}\n","import { formatMaskedValue, parseMaskedInput } from \"./mask/field-binding\";\nimport type { BitMask } from \"./mask/types\";\nimport type { BitFieldBindingApi, BitFormBindingApi } from \"./public-types\";\nimport type { BitFieldState, BitPath, BitPathValue } from \"./public-types\";\n\nexport function subscribeFieldState<\n TForm extends object,\n P extends BitPath<TForm>,\n>(\n store: BitFormBindingApi<TForm>,\n path: P,\n listener: (\n value: Readonly<BitFieldState<TForm, BitPathValue<TForm, P>>>,\n ) => void,\n) {\n // Delegates to the native store method, which encapsulates the\n // path-scoping and structural equality check for single-field subscriptions.\n return store.subscribeFieldState(path, listener);\n}\n\nexport function createMaskedFieldController<\n TForm extends object,\n P extends BitPath<TForm>,\n>(\n store: BitFieldBindingApi<TForm>,\n path: P,\n resolveMask: () => BitMask | undefined,\n) {\n const setValue = (value: unknown) => {\n const mask = resolveMask();\n store.setField(\n path,\n parseMaskedInput(value, mask) as BitPathValue<TForm, P>,\n );\n };\n\n const setBlur = () => store.blurField(path);\n\n const displayValue = (value: unknown) =>\n formatMaskedValue(value, resolveMask());\n\n return {\n setValue,\n setBlur,\n displayValue,\n };\n}\n","import { createMaskedFieldController } from \"../field-controller\";\nimport type { BitFieldBindingApi, BitPath } from \"../public-types\";\n\nexport function createFrameworkMaskedFieldBinding<\n TForm extends object,\n P extends BitPath<TForm>,\n>(store: BitFieldBindingApi<TForm>, path: P) {\n return {\n fieldController: createMaskedFieldController(store, path, () =>\n store.resolveMask(path as string),\n ),\n };\n}\n","import { getDeepValue } from \"../utils\";\nimport type {\n BitArrayItem,\n BitArrayBindingApi,\n BitArrayPath,\n BitPath,\n BitPathValue,\n} from \"../public-types\";\n\nexport interface BitArrayBindingField<TItem> {\n key: string;\n value: TItem;\n index: number;\n}\n\nexport interface BitArrayBindingController<\n TForm extends object,\n P extends BitArrayPath<TForm>,\n> {\n readItems(): BitArrayItem<BitPathValue<TForm, P>>[];\n getFields(\n items: BitArrayItem<BitPathValue<TForm, P>>[],\n ): BitArrayBindingField<BitArrayItem<BitPathValue<TForm, P>>>[];\n append(value: BitArrayItem<BitPathValue<TForm, P>>): void;\n prepend(value: BitArrayItem<BitPathValue<TForm, P>>): void;\n insert(index: number, value: BitArrayItem<BitPathValue<TForm, P>>): void;\n remove(index: number): void;\n move(from: number, to: number): void;\n swap(indexA: number, indexB: number): void;\n replace(items: BitArrayItem<BitPathValue<TForm, P>>[]): void;\n clear(): void;\n}\n\nexport function createArrayBindingController<\n TForm extends object,\n P extends BitArrayPath<TForm>,\n>(\n store: BitArrayBindingApi<TForm>,\n path: P,\n): BitArrayBindingController<TForm, P> {\n type Item = BitArrayItem<BitPathValue<TForm, P>>;\n\n let ids: string[] = [];\n\n const createId = (index?: number) =>\n store.createArrayItemId(path as string, index);\n\n const normalizeItems = (value: unknown): Item[] =>\n Array.isArray(value) ? (value as Item[]) : [];\n\n const syncIds = (items: Item[]): Item[] => {\n if (items.length !== ids.length) {\n if (items.length > ids.length) {\n const diff = items.length - ids.length;\n ids = [\n ...ids,\n ...Array.from({ length: diff }, (_, offset) =>\n createId(ids.length + offset),\n ),\n ];\n } else {\n ids = ids.slice(0, items.length);\n }\n }\n\n return items;\n };\n\n return {\n readItems() {\n const value = getDeepValue(store.getState().values, path as string) as\n | BitPathValue<TForm, P>\n | undefined;\n return syncIds(normalizeItems(value));\n },\n\n getFields(items) {\n return items.map((item, index) => ({\n key: ids[index] || `temp-${index}`,\n value: item,\n index,\n }));\n },\n\n append(value) {\n ids = [...ids, createId(ids.length)];\n store.pushItem(path, value);\n },\n\n prepend(value) {\n ids = [createId(0), ...ids];\n store.prependItem(path, value);\n },\n\n insert(index, value) {\n const nextIds = [...ids];\n nextIds.splice(index, 0, createId(index));\n ids = nextIds;\n store.insertItem(path, index, value);\n },\n\n remove(index) {\n ids = ids.filter((_, currentIndex) => currentIndex !== index);\n store.removeItem(path, index);\n },\n\n move(from, to) {\n const nextIds = [...ids];\n const [item] = nextIds.splice(from, 1);\n nextIds.splice(to, 0, item);\n ids = nextIds;\n store.moveItem(path, from, to);\n },\n\n swap(indexA, indexB) {\n const nextIds = [...ids];\n [nextIds[indexA], nextIds[indexB]] = [nextIds[indexB], nextIds[indexA]];\n ids = nextIds;\n store.swapItems(path, indexA, indexB);\n },\n\n replace(items) {\n ids = items.map((_, index) => createId(index));\n store.setField(\n path as P & BitPath<TForm>,\n items as BitPathValue<TForm, P & BitPath<TForm>>,\n );\n },\n\n clear() {\n ids = [];\n store.setField(\n path as P & BitPath<TForm>,\n [] as BitPathValue<TForm, P & BitPath<TForm>>,\n );\n },\n };\n}\n","type FieldCleanupStore = {\n unregisterField?: (path: string) => void;\n};\n\ntype PrefixCleanupStore = {\n unregisterPrefix?: (prefix: string) => void;\n};\n\nexport function cleanupRegisteredField(\n store: FieldCleanupStore,\n path: string,\n): void {\n store.unregisterField?.(path);\n}\n\nexport function cleanupRegisteredPrefix(\n store: PrefixCleanupStore,\n prefix: string,\n): void {\n store.unregisterPrefix?.(prefix);\n}\n","import type { BitFieldState } from \"../public-types\";\n\nexport interface BitDerivedFieldMeta {\n error: string | undefined;\n touched: boolean;\n invalid: boolean;\n isValidating: boolean;\n isDirty: boolean;\n isHidden: boolean;\n isRequired: boolean;\n hasError: boolean;\n}\n\nexport function deriveFieldMeta<T extends object, TValue>(\n state: Readonly<BitFieldState<T, TValue>>,\n): BitDerivedFieldMeta {\n const error = state.touched ? state.error : undefined;\n const hasError = !!state.error;\n\n return {\n error,\n touched: state.touched,\n invalid: !!(state.touched && state.error),\n isValidating: state.isValidating,\n isDirty: state.isDirty,\n isHidden: state.isHidden,\n isRequired: state.isRequired,\n hasError,\n };\n}\n"],"mappings":"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","names":["cloneValue","obj","item","clone","key","deepClone","obj","cloneValue","deepMerge","target","source","base","key","sourceValue","baseValue","valueEqual","a","b","deepEqual","keysA","keysB","collectDirtyPaths","initial","prefix","result","allKeys","k","p","PATH_CACHE_MAX","pathCache","setPathCacheEntry","path","keys","oldestKey","getPathKeys","cached","getDeepValue","current","setDeepValue","value","i","nextKey","nextAsNumber","isNextNumeric","currentValue","setDeepValues","updates","root","clonedNodes","unsetDeepValue","leafKey","cleanPrefixedKeys","newObj","prefixWithDot","reindexFieldArrayMeta","state","path","remapIndex","nextErrors","nextTouched","nextIsValidating","prefix","key","nextKey","remapIndexedPath","parts","currentIdx","nextIdx","rest","isValidationErrorShape","x","obj","v","i","extractServerErrors","resolveFieldMask","args","path","getFieldConfig","masks","maskOption","createFieldStateSnapshot","state","value","isHidden","isRequired","isDirty","isValidating","pathKey","patchStateOperation","partialState","changedPaths","options","touchFieldsOperation","paths","persistMetaOperation","patch","validationCommitOperation","errors","isValid","BitComputedManager","getComputedEntries","values","changedPaths","computedEntries","entriesToRun","nextValues","entry","newValue","currentValue","getDeepValue","cached","valuesEqual","deepEqual","setDeepValue","entries","map","dep","dependents","childIdx","segments","len","prefix","children","reverseDependencies","affectedPaths","queue","currentPath","dependentPath","entryByPath","inDegree","dependencyPath","nextDependents","orderedPaths","nextDegree","path","signature","ordered","changedPath","collect","listeners","parentSegments","childKeys","childDep","BitDirtyManager","path","values","initialValues","current","getDeepValue","initial","valueEqual","collectDirtyPaths","segments","result","processedArrays","arrayMatch","arrayPath","arrayVal","setDeepValue","fieldVal","nextIndex","nextRefCount","nextChildrenByPrefix","dirtyPath","prefix","ancestor","set","parentPath","children","nextCount","callback","segment","i","BitMaskManager","name","mask","_","remaining","BitFieldCatalog","path","config","callback","scopeName","index","cfg","list","result","scopedPaths","nextPaths","fieldPath","entry","entryPath","BitFieldConditions","getFieldConfig","path","config","currentValues","dependsOn","dep","requiredPaths","dependentsSet","values","cache","result","errors","val","getDeepValue","changedPath","newValues","toggledFields","queue","visited","currentPath","dependents","depPath","wasHidden","isHiddenNow","showIf","value","BitFieldRegistry","BitFieldCatalog","BitFieldConditions","path","callback","config","currentValues","prefix","removedEntries","values","changedPath","newValues","scopeName","defaultIdFactory","normalizeConfig","config","rawInitial","validation","history","defaultPersistKey","persist","raw","deepClone","getDefaultStorage","storageLike","key","value","BitPersistManager","config","getValues","getDirtyValues","applyRestoredValues","error","storage","payload","serialized","raw","parsed","BitPluginManager","plugins","contextFactory","context","plugin","maybeTeardown","error","event","hook","result","source","pluginName","payload","onError","index","teardown","hookName","BitStoreEffectEngine","storeId","storeInstance","bus","persistManager","pluginManager","enableBusDispatch","nextState","valuesChanged","event","BitPipelineRunner","steps","context","step","BitSyncPipelineRunner","hasAnyError","errors","_path","mergeValidationErrors","args","targetFields","currentErrors","allErrors","asyncErrors","scopedErrors","field","scopedResult","resolveAsyncValidationPaths","hiddenFields","getFieldConfig","forEachFieldConfig","paths","path","config","runImmediateAsyncValidationStage","values","validationId","currentValidationId","cancelFieldAsync","createAbortController","setAbortController","clearAbortController","setFieldValidating","setAsyncError","clearAsyncError","asyncValidate","controller","errorMessage","getDeepValue","BitAsyncValidationScheduler","port","path","value","validate","delay","controller","prefix","nextDueAt","job","now","dueJobs","errorMessage","BitValidationDebouncer","port","scopeFields","options","configuredDelay","delay","f","resolvedScopeFields","BitValidationManager","store","fn","delayMs","timeoutId","BitValidationDebouncer","options","BitAsyncValidationScheduler","path","isValidating","message","BitPipelineRunner","ctx","currentState","nextValidating","patchStateOperation","abortController","prefix","newErrors","validationCommitOperation","hasAnyError","value","config","asyncValidate","asyncValidateOn","delay","scopeFields","state","field","context","controller","resolverErrors","dynamicRequiredErrors","hiddenPath","targetPaths","resolveAsyncValidationPaths","merged","mergeValidationErrors","values","validationId","runImmediateAsyncValidationStage","fieldPath","allErrors","scopedErrors","BitFieldUpdateManager","store","BitSyncPipelineRunner","ctx","path","value","meta","state","context","getDeepValue","setDeepValue","isReusableContext","hasCurrentError","depPath","hasDependencyError","patchStateOperation","BitValuesLifecycleManager","store","newValues","options","values","mergedValues","deepMerge","previousValues","clonedValues","deepClone","patchStateOperation","snapshot","isDirty","initialCloned","origin","BitSubmitLifecycleManager","store","BitPipelineRunner","ctx","onSuccess","context","deepClone","error","patchStateOperation","currentErrors","newTouched","path","updates","hiddenPath","transformer","currentVal","getDeepValue","setDeepValues","BitLifecycleManager","store","BitFieldUpdateManager","BitValuesLifecycleManager","BitSubmitLifecycleManager","path","value","meta","newValues","options","values","snapshot","onSuccess","isPlainObject","value","createHistoryPatch","previousValue","nextValue","operations","visit","previousNode","nextNode","path","hadPreviousValue","hasNextValue","deepEqual","keys","key","childPath","childHasPrevious","childHasNext","deepClone","applyHistoryPatch","currentValue","patch","direction","operation","shouldSet","setDeepValue","unsetDeepValue","BitHistoryManager","enableHistory","maxHistory","values","deepEqual","patch","createHistoryPatch","deepClone","previousSnapshot","applyHistoryPatch","nextSnapshot","initialValues","oldestPatch","BitArrayManager","store","path","value","arr","index","next","state","getDeepValue","previousArray","newArray","_","i","currentIdx","indexA","indexB","from","to","item","mutate","meta","current","args","nextArray","reindex","newValues","setDeepValue","isDirty","reindexedMeta","reindexFieldArrayMeta","patchStateOperation","BitScopeManager","getState","getInitialValues","getScopeFields","isPathDirty","scopeName","fields","state","hasErrors","f","isDirty","errors","result","field","error","BitFieldQueryManager","fieldRegistry","getState","isPathDirty","path","values","BitErrorManager","getState","dispatch","path","message","newErrors","patchStateOperation","errors","serverErrors","formattedErrors","key","value","rootGlobal","id","state","fn","bitBus","noopBus","getNoopBitBus","createBitBus","listeners","shouldEnableStoreBus","config","createStoreCapabilities","args","ports","fieldRegistry","BitValidationManager","BitLifecycleManager","BitHistoryManager","BitArrayManager","BitScopeManager","scopeName","path","BitFieldQueryManager","BitErrorManager","operation","createStoreEffects","storeId","storeInstance","getState","getConfig","getValues","getDirtyValues","applyPersistedValues","persistManager","BitPersistManager","pluginManager","BitPluginManager","enableBusDispatch","resolvedBus","bitBus","getNoopBitBus","effects","BitStoreEffectEngine","createInitialStoreState","computedManager","initialValues","deepClone","fieldConfig","restoreStorePersisted","args","dispatch","effects","persistMetaOperation","error","forceStorePersistedSave","clearStorePersisted","applyStorePersistedValues","values","state","initialValues","validation","fieldRegistry","dirtyManager","saveHistorySnapshot","nextValues","deepClone","isDirty","patchStateOperation","restorePersistedFeature","args","dispatch","effects","restoreStorePersisted","forceSavePersistedFeature","forceStorePersistedSave","clearPersistedFeature","clearStorePersisted","runUndoFeature","history","applyHistoryState","prevState","runRedoFeature","nextState","readHistoryFeatureMetadata","BIT_HOOKS_API_SYMBOL","buildFieldUnregisterPatch","args","state","path","nextErrors","nextTouched","changed","registerStoreField","args","path","config","state","fieldRegistry","subscriptions","invalidateFieldIndexes","unregisterStoreField","hasStaticConfig","validationCleanupField","dispatch","cleanupPatch","buildFieldUnregisterPatch","patchStateOperation","unregisterStorePrefix","prefix","validationCleanupPrefix","collectTrackedSelectorPaths","state","selector","trackedPaths","createTrackingProxy","value","basePath","target","key","receiver","keyAsString","childPath","child","proxyState","normalizedPaths","path","normalizedPath","normalizeTrackedPath","areTrackedPathSetsEqual","previousPaths","nextPaths","next","withTrackedSelectorPaths","paths","options","createTrackedSubscription","args","getState","subscribeSelector","listener","activeUnsubscribe","activePaths","isDisposed","isResubscribeQueued","subscribeWithPaths","slice","isHistoryMetaEqual","a","b","readHistoryMetaSnapshot","store","nextMeta","observeHistoryMetaSnapshot","listener","areScopeErrorsEqual","currentErrors","nextErrors","currentKeys","nextKeys","key","isScopeStatusEqual","currentStatus","nextStatus","getScopeSubscriptionPaths","scopeFields","observeScopeStatusSnapshot","store","scopeName","listener","subscribeStoreSelector","args","subscriptions","selector","listener","options","equalityFn","valueEqual","subscribeStoreTracked","getState","subscribeSelector","createTrackedSubscription","trackedSelector","trackedListener","trackedOptions","subscribeStorePath","path","mergedPaths","state","getDeepValue","subscribeStoreFieldState","getFieldState","prev","next","subscribeStoreFormMeta","subscribeStorePersistMeta","subscribeStoreHistoryMeta","readHistoryMeta","subscribe","lastMeta","nextMeta","isHistoryMetaEqual","subscribeStoreScopeStatus","scopeName","readScopeStatus","getScopeFields","lastStatus","nextStatus","isScopeStatusEqual","getScopeSubscriptionPaths","BitSubscriptionEngine","getState","maxCacheSize","listener","selector","options","equalityFn","lastSlice","subscription","nextState","nextSlice","scopedPaths","pathKey","indexPath","listeners","paths","changedPaths","normalizedChangedPaths","_paths","seen","normalized","path","trimmed","scopedSubscribers","currentVersion","addByPath","changedPath","cached","parts","lookupPaths","segments","keys","i","cache","key","value","maxSize","oldestKey","createValidationPort","deps","operation","path","message","options","callback","config","scopeName","values","event","createLifecyclePort","changedPath","newValues","scopeFields","value","nextValues","baselineValues","initialValues","createArrayPort","meta","prefix","createStoreRuntime","args","validationPort","createValidationPort","operation","path","message","options","scopeName","lifecyclePort","createLifecyclePort","callback","values","arrayPort","createArrayPort","value","meta","prefix","scopeFields","capabilities","createStoreCapabilities","state","createInitialStoreState","subscriptions","BitSubscriptionEngine","storeId","createStoreBatchState","beginStoreBatch","batchState","endStoreBatch","getEffectiveStoreState","currentState","trackBatchedStoreUpdate","updateResult","pathSet","path","flushStoreBatchState","args","applyComputedValues","nextState","changedPaths","valuesChanged","computedChangedPaths","normalizeErrors","errors","hasUndefined","message","normalized","path","applyStateUpdate","args","currentState","partialState","changedPaths","applyComputedValues","nextState","valuesChanged","hasAnyError","explicitChangedPaths","inferredChangedPaths","inferChangedPaths","effectiveChangedPaths","mergeChangedPaths","pathMaps","map","merged","routeStoreOperation","currentState","operation","touched","path","patchStateOperation","executeStatePatchOperation","args","applyComputedValues","hasValuesPatch","effectiveChangedPaths","applyStateUpdate","values","executeStoreOperation","patchOperation","changedPaths","dispatchStoreKernelOperation","state","batchState","onStateCommitted","getEffectiveStoreState","updateResult","trackBatchedStoreUpdate","flushStoreKernelBatch","flushResult","flushStoreBatchState","runStoreStateBatch","args","batchState","callback","flushBatchedStateUpdates","beginStoreBatch","endStoreBatch","commitStoreStateUpdate","payload","setState","notifySubscriptions","notifyEffects","dispatchStoreStateOperation","state","operation","applyComputedValues","onStateCommitted","dispatchStoreKernelOperation","saveStoreHistorySnapshot","values","saveHistory","flushStoreBatchedStateUpdates","nextState","flushStoreKernelBatch","BitStoreRuntimeKernel","args","createStoreBatchState","getEffectiveStoreState","callback","runStoreStateBatch","operation","dispatchStoreStateOperation","values","changedPaths","normalizedPaths","payload","saveStoreHistorySnapshot","commitStoreStateUpdate","state","valuesChanged","flushStoreBatchedStateUpdates","BitStore","BIT_HOOKS_API_SYMBOL","config","normalizeConfig","BitFieldRegistry","BitComputedManager","BitDirtyManager","BitMaskManager","name","mask","runtimeKernel","runtime","createStoreRuntime","values","operation","path","message","options","scopeName","callback","value","meta","prefix","scopeFields","effects","createStoreEffects","BitStoreRuntimeKernel","resolveFieldMask","fieldPath","index","effectiveState","getDeepValue","createFieldStateSnapshot","registerStoreField","unregisterStoreField","unregisterStorePrefix","fieldPrefix","listener","subscribeStorePersistMeta","selector","persistListener","subscribeStoreHistoryMeta","metaListener","subscribeStoreScopeStatus","targetScopeName","statusListener","subscribeStoreSelector","subscribeStoreTracked","trackedSelector","trackedListener","trackedOptions","subscribeStorePath","pathListener","pathOptions","subscribeStoreFieldState","fieldStateListener","fieldStateOptions","subscribeStoreFormMeta","metaOptions","touchFieldsOperation","paths","errors","serverErrors","onSuccess","restorePersistedFeature","forceSavePersistedFeature","clearPersistedFeature","indexA","indexB","from","to","runUndoFeature","runRedoFeature","readHistoryFeatureMetadata","applyStorePersistedValues","isHookCompatibleStore","store","BIT_HOOKS_API_SYMBOL","resolveBitStoreForHooks","createBitStore","config","BitStore","createFieldStateSnapshot","nextState","lastSnapshot","areFieldSnapshotsEqual","snapshotA","snapshotB","deepEqual","readFormMetaSnapshot","store","state","subscribeFormMetaSnapshot","listener","observeFormMetaSnapshot","readPersistMetaSnapshot","store","subscribePersistMetaSnapshot","listener","observePersistMetaSnapshot","meta","executeSubmitHandler","handler","values","dirtyValues","handlers","result","error","isValidationErrorShape","extractServerErrors","createStoreFormActions","store","path","value","values","options","message","errors","serverErrors","callback","preventFormEvent","event","createFormController","runtime","onSuccess","handler","dirtyValues","executeSubmitHandler","result","error","createFrameworkFormBinding","store","runtime","options","createFormController","createStoreFormActions","subscribeFieldState","store","path","listener","createMaskedFieldController","resolveMask","value","mask","parseMaskedInput","formatMaskedValue","createFrameworkMaskedFieldBinding","store","path","createMaskedFieldController","createArrayBindingController","store","path","ids","createId","index","normalizeItems","value","syncIds","items","diff","_","offset","getDeepValue","item","nextIds","currentIndex","from","to","indexA","indexB","cleanupRegisteredField","store","path","cleanupRegisteredPrefix","prefix","deriveFieldMeta","state","error","hasError"]}