@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
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/utils.ts","../src/core/store/shared/bus.ts","../src/core/store/shared/config.ts","../src/core/store/managers/core/dependency-manager.ts","../src/core/store/managers/core/computed-manager.ts","../src/core/store/managers/core/dirty-manager.ts","../src/core/store/engines/subscription-engine.ts","../src/core/store/engines/state-update-engine.ts","../src/core/store/managers/features/devtools-plugin.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/managers/features/validation-manager.ts","../src/core/store/managers/features/lifecycle-manager.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/orchestration/capability-registry.ts","../src/core/store/orchestration/store-bootstrap.ts","../src/core/store/index.ts","../src/core/store/orchestration/create-store.ts"],"sourcesContent":["export function deepClone<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 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) => deepClone(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] = deepClone((obj as any)[key]);\n }\n }\n return clone as T;\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\nconst PATH_CACHE_MAX = 1000;\nconst pathCache = new Map<string, string[]>();\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 if (pathCache.size >= PATH_CACHE_MAX) {\n pathCache.clear();\n }\n pathCache.set(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 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 { 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","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 enableHistory: history?.enabled ?? false,\n historyLimit: history?.limit ?? 15,\n masks: config.masks,\n fields: config.fields,\n devTools: config.devTools,\n persist,\n idFactory: config.idFactory ?? defaultIdFactory,\n plugins: config.plugins ?? [],\n } as BitFrameworkConfig<T>;\n}\n","import { BitFieldDefinition } from \"../../contracts/types\";\nimport { getDeepValue } from \"../../../utils\";\n\nexport class BitDependencyManager<T extends object = any> {\n private readonly fieldConfigs: Map<string, BitFieldDefinition<T>> = new Map();\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 getFieldConfig(path: string): BitFieldDefinition<T> | undefined {\n return this.fieldConfigs.get(path);\n }\n\n forEachFieldConfig(\n callback: (config: BitFieldDefinition<T>, path: string) => void,\n ) {\n this.fieldConfigs.forEach((config, path) => callback(config, path));\n }\n\n hasFieldConfig(path: string): boolean {\n return this.fieldConfigs.has(path);\n }\n\n getHiddenFields(): ReadonlySet<string> {\n return this.hiddenFields;\n }\n\n register(path: string, config: BitFieldDefinition<T>, currentValues: T) {\n this.fieldConfigs.set(path, config);\n\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 const requiredDependsOn = config.conditional?.dependsOn;\n if (requiredDependsOn && config.conditional?.requiredIf) {\n this.requiredConditionalPaths.add(path);\n requiredDependsOn.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\n this.evaluateFieldCondition(path, currentValues);\n }\n\n isHidden(path: string): boolean {\n return this.hiddenFields.has(path);\n }\n\n isRequired(path: string, values: T): boolean {\n const config = this.fieldConfigs.get(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): Record<string, string> {\n const errors: Record<string, string> = {};\n\n this.requiredConditionalPaths.forEach((path) => {\n const config = this.fieldConfigs.get(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] =\n config.conditional?.requiredMessage ?? \"required field\";\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 unregister(path: string) {\n const config = this.fieldConfigs.get(path);\n\n this.fieldConfigs.delete(path);\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 unregisterPrefix(prefix: string) {\n const removedEntries: [string, BitFieldDefinition<T>][] = [];\n\n this.fieldConfigs.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 private evaluateFieldCondition(path: string, values: T) {\n const config = this.fieldConfigs.get(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 { 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\ntype BitComputedEntryInput<T extends object> =\n | BitComputedEntry<T>\n | [string, BitComputedFn<T>];\n\ninterface BitComputedResolution<T extends object> {\n entries: BitComputedEntry<T>[];\n shouldTrackDependencies: boolean;\n requiresStabilizationPasses: boolean;\n}\n\nexport class BitComputedManager<T extends object> {\n // Garantimos no mínimo alguns passes mesmo com poucos computeds para\n // estabilizar cadeias curtas de dependência (A->B->C) sem depender apenas\n // de computedEntries.length * 2.\n private static readonly MIN_PASSES = 4;\n private readonly computedDependencyCache = new Map<string, Set<string>>();\n\n constructor(private getComputedEntries: () => BitComputedEntryInput<T>[]) {}\n /**\n * Cache de dependências reversas (entry.path → Set<paths que dependem dela>).\n * Construído uma vez e reutilizado em todos os apply() subsequentes.\n * Invalidado via invalidateReverseDeps() quando os computed entries mudam\n * (registro/unregistro de campos).\n */\n private reverseDepsCache: Map<string, Set<string>> | null = null;\n\n /**\n * Índice de filhos: prefix → Set de chaves em reverseDepsCache que\n * _começam_ com `prefix + \".\"`. Construído junto com reverseDepsCache\n * para substituir a varredura linear `forEach(startsWith)` por O(1).\n */\n private childDepsIndex: Map<string, Set<string>> | null = null;\n\n /** Chamado por BitStore.invalidateFieldIndexes() ao registrar/desregistrar campos. */\n invalidateReverseDeps(): void {\n this.reverseDepsCache = null;\n this.childDepsIndex = null;\n }\n\n /** Constrói (ou retorna cacheado) o mapa de dependências reversas para as entries dadas. */\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 const dependencies = this.getDependenciesForEntry(entry);\n for (const dep of dependencies) {\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 // Constrói o índice de prefixos filho uma única vez junto com o mapa reverso.\n // Para cada chave `dep` (ex.: \"a.b.c\"), registra `dep` sob todos os seus\n // segmentos pai (\"a\", \"a.b\") para que getDependentsForPath possa responder\n // \"quem depende de coisas abaixo de X?\" em O(filhos) em vez de O(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 apply(values: T, changedPaths?: readonly string[]): T {\n const computedEntries = this.normalizeEntries(this.getComputedEntries());\n if (computedEntries.length === 0) return values;\n\n const resolution = this.resolveEntriesToRun(computedEntries, changedPaths);\n const entriesToRun = resolution.entries;\n\n if (entriesToRun.length === 0) {\n return values;\n }\n\n let nextValues = values;\n const maxPasses = resolution.requiresStabilizationPasses\n ? Math.max(BitComputedManager.MIN_PASSES, entriesToRun.length * 2)\n : 1;\n\n for (let i = 0; i < maxPasses; i++) {\n let hasUpdates = false;\n\n for (const entry of entriesToRun) {\n const { newValue, trackedDependencies } = this.computeWithTracking(\n entry,\n nextValues,\n resolution.shouldTrackDependencies,\n );\n const currentValue = getDeepValue(nextValues, entry.path);\n\n if (!deepEqual(currentValue, newValue)) {\n nextValues = setDeepValue(nextValues, entry.path, newValue);\n hasUpdates = true;\n }\n\n if (trackedDependencies) {\n const previousDeps = this.computedDependencyCache.get(entry.path);\n this.computedDependencyCache.set(entry.path, trackedDependencies);\n\n if (\n !previousDeps ||\n previousDeps.size !== trackedDependencies.size ||\n Array.from(previousDeps).some(\n (dep) => !trackedDependencies.has(dep),\n )\n ) {\n this.invalidateReverseDeps();\n }\n }\n }\n\n if (!hasUpdates) break;\n\n if (resolution.requiresStabilizationPasses && i === maxPasses - 1) {\n throw new Error(\n \"BitStore: computed fields did not stabilize. Check for cyclic computed definitions.\",\n );\n }\n }\n\n return nextValues;\n }\n\n private resolveEntriesToRun(\n entries: BitComputedEntry<T>[],\n changedPaths?: readonly string[],\n ): BitComputedResolution<T> {\n if (\n !changedPaths ||\n changedPaths.length === 0 ||\n changedPaths.includes(\"*\")\n ) {\n // If every entry already has known dependencies (either declared via\n // `computedDependsOn` or cached from a previous Proxy-tracked apply),\n // we can rely on the topological order produced by orderEntries() and\n // skip re-tracking + multi-pass stabilization — a single pass is enough.\n const allDepsKnown = entries.every(\n (e) =>\n e.dependsOn !== undefined || this.computedDependencyCache.has(e.path),\n );\n\n return {\n entries: this.orderEntries(entries),\n shouldTrackDependencies: !allDepsKnown,\n requiresStabilizationPasses: !allDepsKnown,\n };\n }\n\n const reverseDependencies = this.getReverseDependencies(entries);\n let shouldTrackDependencies = false;\n\n for (const entry of entries) {\n const dependencies = this.getDependenciesForEntry(entry);\n\n if (dependencies.length === 0) {\n shouldTrackDependencies = true;\n }\n }\n\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 entries: [],\n shouldTrackDependencies,\n requiresStabilizationPasses: false,\n };\n }\n\n const affectedEntries = entries.filter((entry) =>\n affectedPaths.has(entry.path),\n );\n\n return {\n entries: this.orderEntries(affectedEntries),\n shouldTrackDependencies,\n requiresStabilizationPasses: shouldTrackDependencies,\n };\n }\n\n private normalizeEntries(entries: BitComputedEntryInput<T>[]) {\n // Fast path: se o primeiro elemento já é um objeto normalizado (caso típico\n // quando getComputedEntries retorna BitComputedEntry[] do cache do BitStore),\n // evita o .map() e a alocação de array intermediário.\n if (entries.length === 0 || !Array.isArray(entries[0])) {\n return entries as BitComputedEntry<T>[];\n }\n return entries.map((entry) =>\n Array.isArray(entry)\n ? ({ path: entry[0], compute: entry[1] } satisfies BitComputedEntry<T>)\n : entry,\n );\n }\n\n private getDependenciesForEntry(entry: BitComputedEntry<T>) {\n return (\n entry.dependsOn ??\n Array.from(this.computedDependencyCache.get(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 const dependencies = this.getDependenciesForEntry(entry);\n\n dependencies.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 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 // Usa o índice de filhos (O(filhos)) em vez de varredura linear O(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 computeWithTracking(\n entry: BitComputedEntry<T>,\n values: T,\n shouldTrackDependencies: boolean,\n ) {\n const knownDependencies = this.getDependenciesForEntry(entry);\n\n if (!shouldTrackDependencies || knownDependencies.length > 0) {\n return {\n newValue: entry.compute(values),\n trackedDependencies: null as Set<string> | null,\n };\n }\n\n const trackedDependencies = new Set<string>();\n const trackedValues = this.createTrackedValues(values, trackedDependencies);\n\n const newValue = entry.compute(trackedValues);\n\n return {\n newValue,\n trackedDependencies,\n };\n }\n\n private createTrackedValues(values: T, trackedDependencies: Set<string>): T {\n const createProxy = (value: unknown, currentPath: string): unknown => {\n if (!value || typeof value !== \"object\") {\n return value;\n }\n\n return new Proxy(value as Record<string, unknown>, {\n get: (target, key) => {\n if (typeof key !== \"string\") {\n return Reflect.get(target, key);\n }\n\n const nextPath = currentPath ? `${currentPath}.${key}` : key;\n trackedDependencies.add(nextPath);\n\n const nextValue = Reflect.get(target, key);\n return createProxy(nextValue, nextPath);\n },\n });\n };\n\n return createProxy(values, \"\") as T;\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 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 selectorListeners: Set<SelectorListenerEntry<T>> = 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\n constructor(private readonly getState: () => Readonly<BitState<T>>) {}\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 autoTrackedPaths = options?.autoTrackPaths\n ? this.collectTrackedSelectorPaths(selector)\n : [];\n\n if (\n options?.autoTrackPaths &&\n typeof process !== \"undefined\" &&\n process.env?.[\"NODE_ENV\"] !== \"production\"\n ) {\n console.warn(\n \"[bit-form] subscribeSelector: autoTrackPaths creates Proxy wrappers \" +\n \"to detect accessed paths at subscription time. For high-frequency \" +\n \"or dynamically-rendered fields (e.g. field arrays), prefer \" +\n \"explicit `paths: [...]` to avoid mount-time overhead.\",\n );\n }\n\n const scopedPaths = this.normalizeSubscriptionPaths([\n ...(options?.paths ?? []),\n ...autoTrackedPaths,\n ]);\n\n if (scopedPaths.length > 0) {\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 } else {\n this.selectorListeners.add(subscription);\n }\n\n if (options?.emitImmediately) {\n listener(lastSlice);\n }\n\n return () => {\n this.selectorListeners.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(nextState: Readonly<BitState<T>>, changedPaths?: string[]): void {\n this.listeners.forEach((listener) => listener());\n\n this.selectorListeners.forEach((subscription) => {\n subscription.notify(nextState);\n });\n\n if (this.pathScopedSubscriptions.size === 0) {\n return;\n }\n\n if (\n !changedPaths ||\n changedPaths.length === 0 ||\n changedPaths.includes(\"*\")\n ) {\n this.pathScopedSubscriptions.forEach((_paths, subscription) => {\n subscription.notify(nextState);\n });\n return;\n }\n\n const scopedSubscribers =\n this.collectSubscribersForChangedPaths(changedPaths);\n\n scopedSubscribers.forEach((subscription) => {\n subscription.notify(nextState);\n });\n }\n\n destroy(): void {\n this.listeners.clear();\n this.selectorListeners.clear();\n this.pathScopedSubscriptions.clear();\n this.pathSelectorIndex.clear();\n this.expandedPathCache.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 collectTrackedSelectorPaths<TSlice>(\n selector: BitSelector<T, TSlice>,\n ): string[] {\n const trackedPaths = new Set<string>();\n\n const createTrackedProxy = (\n value: unknown,\n currentPath: string,\n ): unknown => {\n if (!value || typeof value !== \"object\") {\n return value;\n }\n\n return new Proxy(value as Record<string, unknown>, {\n get: (target, key) => {\n if (typeof key !== \"string\") {\n return Reflect.get(target, key);\n }\n\n const nextPath = currentPath ? `${currentPath}.${key}` : key;\n trackedPaths.add(nextPath);\n\n const nextValue = Reflect.get(target, key);\n return createTrackedProxy(nextValue, nextPath);\n },\n });\n };\n\n const trackedState = new Proxy(\n this.getState() as unknown as Record<string, unknown>,\n {\n get: (target, key) => {\n if (typeof key !== \"string\") {\n return Reflect.get(target, key);\n }\n\n const value = Reflect.get(target, key);\n\n if (key === \"values\") {\n return createTrackedProxy(value, \"\");\n }\n\n return value;\n },\n },\n ) as Readonly<BitState<T>>;\n\n try {\n selector(trackedState);\n return Array.from(trackedPaths);\n } catch {\n return [];\n }\n }\n\n private collectSubscribersForChangedPaths(\n changedPaths: string[],\n ): Set<SelectorListenerEntry<T>> {\n // Use a fresh Set per call to be safe against reentrant notify() calls\n // (e.g. a plugin that calls setField inside onFieldChange).\n const scopedSubscribers = new Set<SelectorListenerEntry<T>>();\n\n const addByPath = (path: string) => {\n const listeners = this.pathSelectorIndex.get(path);\n if (!listeners) return;\n listeners.forEach((subscription) => scopedSubscribers.add(subscription));\n };\n\n const normalizedChangedPaths =\n this.normalizeSubscriptionPaths(changedPaths);\n\n normalizedChangedPaths.forEach((changedPath) => {\n addByPath(changedPath);\n\n const parts = changedPath.split(\".\");\n while (parts.length > 1) {\n parts.pop();\n addByPath(parts.join(\".\"));\n }\n });\n\n return scopedSubscribers;\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.expandedPathCache.set(path, keys);\n return keys;\n }\n}\n","import type { BitErrors, BitState } from \"../contracts/types\";\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\nfunction hasErrors(errors: Record<string, unknown>) {\n for (const _path in errors) {\n return true;\n }\n\n return false;\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 = !hasErrors(nextState.errors as Record<string, unknown>);\n }\n\n const explicitChangedPaths =\n changedPaths && changedPaths.length > 0 ? changedPaths : undefined;\n const inferredChangedPaths = inferChangedPaths(\n partialState,\n !explicitChangedPaths,\n );\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 includeValuesWildcard: boolean,\n): string[] | undefined {\n if (includeValuesWildcard && partialState.values) {\n return [\"*\"];\n }\n\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 { BitPlugin, DevToolsOptions } from \"../../contracts/types\";\n\nfunction resolveDevToolsOptions(\n devTools: boolean | DevToolsOptions | undefined,\n): Required<Pick<DevToolsOptions, \"enabled\" | \"mode\">> &\n Pick<DevToolsOptions, \"url\"> {\n if (typeof devTools === \"boolean\") {\n return { enabled: devTools, mode: \"local\" };\n }\n\n return {\n enabled: !!devTools,\n mode: devTools?.mode ?? \"local\",\n url: devTools?.url,\n };\n}\n\nexport function createDevtoolsPlugin<T extends object = any>(\n devTools: boolean | DevToolsOptions | undefined,\n): BitPlugin<T> | null {\n const options = resolveDevToolsOptions(devTools);\n\n if (!options.enabled) {\n return null;\n }\n\n return {\n name: \"bit-devtools\",\n setup: () => {\n let cleanup: (() => void) | null = null;\n let destroyed = false;\n\n void (async () => {\n try {\n if (options.mode === \"remote\") {\n const { setupRemoteBridge } =\n await import(\"../../../../devtools/bridge\");\n cleanup = setupRemoteBridge(options.url || \"ws://localhost:3000\");\n } else {\n const { initDevTools } = await import(\"../../../../devtools\");\n const instance = initDevTools();\n cleanup =\n instance && typeof instance.destroy === \"function\"\n ? instance.destroy\n : null;\n }\n\n if (destroyed && cleanup) {\n cleanup();\n cleanup = null;\n }\n } catch {\n // fail-open: devtools não deve impactar runtime principal\n }\n })();\n\n return () => {\n destroyed = true;\n if (cleanup) {\n cleanup();\n cleanup = null;\n }\n };\n },\n };\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 this.plugins.forEach((plugin) => {\n if (!plugin.setup) return;\n\n try {\n const maybeTeardown = plugin.setup(this.contextFactory());\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 this.plugins.forEach((plugin) => {\n const hook = plugin.hooks?.onFieldChange;\n if (!hook) return;\n\n try {\n const result = hook(event, this.contextFactory());\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 { bitBus } from \"../shared/bus\";\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 persistManager: BitPersistManager<T>,\n private readonly pluginManager: BitPluginManager<T>,\n ) {}\n\n initialize(): void {\n this.pluginManager.setupAll();\n bitBus.stores[this.storeId] = this.storeInstance;\n }\n\n onStateUpdated(nextState: BitState<T>, valuesChanged: boolean): void {\n if (valuesChanged) {\n this.persistManager.queueSave();\n }\n\n bitBus.dispatch(this.storeId, nextState);\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 delete bitBus.stores[this.storeId];\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","import { BitErrors } from \"../../contracts/types\";\nimport {\n BitFrameworkConfig,\n BitValidationOptions,\n} from \"../../contracts/public-types\";\nimport { BitPipelineContext, BitPipelineRunner } from \"../../shared/pipeline\";\nimport type {\n BitAfterValidateEvent,\n BitBeforeValidateEvent,\n BitFieldDefinition,\n BitState,\n} from \"../../contracts/types\";\n\nexport interface BitValidationStorePort<T extends object> {\n getState: () => BitState<T>;\n internalUpdateState: (partial: Partial<BitState<T>>) => void;\n setError: (path: string, message: string | undefined) => void;\n validate: (opts: BitValidationOptions) => Promise<boolean>;\n getFieldConfig: (path: string) => BitFieldDefinition<T> | undefined;\n getScopeFields: (scopeName: string) => string[];\n config: BitFrameworkConfig<T>;\n getRequiredErrors: (values: T) => BitErrors<T>;\n getHiddenFields: () => ReadonlySet<string>;\n emitBeforeValidate: (event: BitBeforeValidateEvent<T>) => Promise<void>;\n emitAfterValidate: (event: BitAfterValidateEvent<T>) => Promise<void>;\n}\n\ninterface ValidationPipelineContext<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 isValid: boolean;\n result: boolean;\n aborted: boolean;\n}\n\nexport interface BitValidationTriggerOptions {\n forceDebounce?: boolean;\n}\n\nfunction hasErrors(errors: Record<string, unknown>) {\n for (const _path in errors) {\n return true;\n }\n\n return false;\n}\n\nexport class BitValidationManager<T extends object> {\n private validationTimeout?: ReturnType<typeof setTimeout>;\n private currentValidationId: number = 0;\n private asyncEpoch: number = 0;\n private validatingCount = 0;\n /** Paths acumulados durante o debounce — evita descartar paths de calls anteriores */\n private pendingScopeFields: Set<string> | null = null;\n private readonly asyncTimers = new Map<\n string,\n ReturnType<typeof setTimeout>\n >();\n private readonly asyncRequests = new Map<string, number>();\n private readonly asyncErrors = new Map<string, string>();\n private readonly validationPipeline: BitPipelineRunner<\n ValidationPipelineContext<T>\n >;\n\n constructor(private store: BitValidationStorePort<T>) {\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 { name: \"validate:resolver\", run: async (ctx) => this.runResolver(ctx) },\n {\n name: \"validate:required-and-hidden\",\n run: (ctx) => this.applyRequiredAndHiddenRules(ctx),\n },\n {\n name: \"validate:abort-check\",\n run: async (ctx) => this.abortIfOutdated(ctx),\n },\n {\n name: \"validate:commit-scoped\",\n run: async (ctx) => this.commitScopedValidation(ctx),\n },\n {\n name: \"validate:commit-global\",\n run: async (ctx) => this.commitGlobalValidation(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.internalUpdateState({\n isValidating: nextValidating,\n });\n }\n\n private cancelFieldAsync(path: string) {\n const activeTimer = this.asyncTimers.get(path);\n if (activeTimer) {\n clearTimeout(activeTimer);\n this.asyncTimers.delete(path);\n }\n\n this.asyncRequests.set(path, (this.asyncRequests.get(path) || 0) + 1);\n }\n\n cleanupField(path: string) {\n this.cancelFieldAsync(path);\n this.asyncTimers.delete(path);\n this.asyncRequests.delete(path);\n this.asyncErrors.delete(path);\n this.updateFieldValidating(path, false);\n }\n\n cleanupPrefix(prefix: string) {\n for (const path of this.asyncTimers.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.internalUpdateState({\n errors: newErrors,\n isValid: !hasErrors(newErrors),\n });\n }\n\n handleAsync(path: string, value: any) {\n const config = this.store.getFieldConfig(path);\n const asyncValidate = config?.validation?.asyncValidate;\n if (!asyncValidate) {\n this.updateFieldValidating(path, false);\n return;\n }\n\n const existingTimer = this.asyncTimers.get(path);\n if (existingTimer) clearTimeout(existingTimer);\n\n const delay = config.validation?.asyncValidateDelay ?? 500;\n\n this.updateFieldValidating(path, true);\n\n this.asyncTimers.set(\n path,\n setTimeout(async () => {\n this.asyncTimers.delete(path);\n const requestEpoch = this.asyncEpoch;\n\n const currentRequestId = (this.asyncRequests.get(path) || 0) + 1;\n this.asyncRequests.set(path, currentRequestId);\n\n try {\n const errorMessage = await asyncValidate(\n value,\n this.store.getState().values,\n );\n\n if (\n this.asyncRequests.get(path) !== currentRequestId ||\n requestEpoch !== this.asyncEpoch\n ) {\n return;\n }\n\n if (errorMessage) {\n this.asyncErrors.set(path, errorMessage);\n this.store.setError(path, errorMessage);\n } else {\n this.asyncErrors.delete(path);\n if (this.store.validate) {\n await this.store.validate({ scopeFields: [path] });\n } else {\n const newErrors = { ...this.store.getState().errors };\n delete newErrors[path as keyof BitErrors<T>];\n this.store.internalUpdateState({\n errors: newErrors,\n isValid: !hasErrors(newErrors),\n });\n }\n }\n } finally {\n if (\n this.asyncRequests.get(path) === currentRequestId &&\n requestEpoch === this.asyncEpoch\n ) {\n this.updateFieldValidating(path, false);\n }\n }\n }, delay),\n );\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 if (this.validationTimeout) clearTimeout(this.validationTimeout);\n\n const configuredDelay = this.store.config.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.validationTimeout = setTimeout(() => {\n this.pendingScopeFields = null;\n void this.validate({ scopeFields: resolvedScopeFields });\n }, delay);\n } else {\n this.pendingScopeFields = null;\n void this.validate({ scopeFields });\n }\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 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 const timer = this.asyncTimers.get(path);\n if (timer) clearTimeout(timer);\n this.asyncTimers.delete(path);\n this.updateFieldValidating(path, false);\n this.asyncErrors.delete(path);\n }\n\n cancelAll() {\n this.asyncEpoch += 1;\n this.validatingCount = 0;\n this.pendingScopeFields = null;\n\n if (this.validationTimeout) clearTimeout(this.validationTimeout);\n this.asyncTimers.forEach((timer) => clearTimeout(timer));\n this.asyncTimers.clear();\n this.asyncRequests.clear();\n this.asyncErrors.clear();\n this.store.internalUpdateState({ 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 runResolver(ctx: ValidationPipelineContext<T>) {\n ctx.allErrors = this.store.config.resolver\n ? await this.store.config.resolver(ctx.currentState.values, {\n scopeFields: ctx.targetFields,\n })\n : {};\n }\n\n private applyRequiredAndHiddenRules(ctx: ValidationPipelineContext<T>) {\n const dynamicRequiredErrors = this.store.getRequiredErrors(\n ctx.currentState.values,\n );\n ctx.allErrors = { ...ctx.allErrors, ...dynamicRequiredErrors };\n\n this.store.getHiddenFields().forEach((hiddenPath) => {\n delete ctx.allErrors[hiddenPath];\n this.asyncErrors.delete(hiddenPath);\n });\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 commitScopedValidation(ctx: ValidationPipelineContext<T>) {\n if (!ctx.targetFields) {\n return;\n }\n\n const newErrors = { ...ctx.currentState.errors };\n\n ctx.targetFields.forEach((field) => {\n if (ctx.allErrors[field]) {\n newErrors[field as keyof BitErrors<T>] = ctx.allErrors[field];\n } else if (this.asyncErrors.has(field)) {\n newErrors[field as keyof BitErrors<T>] = this.asyncErrors.get(field)!;\n } else {\n delete newErrors[field as keyof BitErrors<T>];\n }\n });\n\n ctx.isValid = !hasErrors(newErrors);\n ctx.result = ctx.targetFields.every(\n (field) => !ctx.allErrors[field] && !this.asyncErrors.has(field),\n );\n\n this.store.internalUpdateState({\n errors: newErrors,\n isValid: 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: newErrors,\n result: ctx.result,\n });\n\n ctx.halted = true;\n }\n\n private async commitGlobalValidation(ctx: ValidationPipelineContext<T>) {\n ctx.allErrors = {\n ...Object.fromEntries(this.asyncErrors.entries()),\n ...ctx.allErrors,\n };\n ctx.isValid = !hasErrors(ctx.allErrors);\n ctx.result = ctx.isValid;\n\n this.store.internalUpdateState({\n errors: ctx.allErrors as BitErrors<T>,\n isValid: 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.allErrors as BitErrors<T>,\n result: ctx.isValid,\n });\n }\n}\n","import {\n BitErrors,\n BitFieldChangeMeta,\n DeepPartial,\n} from \"../../contracts/types\";\nimport {\n deepClone,\n deepMerge,\n getDeepValue,\n setDeepValue,\n setDeepValues,\n} from \"../../../utils\";\nimport {\n BitPipelineContext,\n BitPipelineRunner,\n BitSyncPipelineRunner,\n} from \"../../shared/pipeline\";\nimport type {\n BitState,\n BitTransformFn,\n BitBeforeSubmitEvent,\n BitAfterSubmitEvent,\n BitFieldChangeEvent,\n} from \"../../contracts/types\";\nimport type {\n BitFrameworkConfig,\n BitValidationOptions,\n} from \"../../contracts/public-types\";\nimport type { BitValidationTriggerOptions } from \"./validation-manager\";\n\ninterface BitLifecycleStatePort<T extends object> {\n getState: () => BitState<T>;\n internalUpdateState: (\n partial: Partial<BitState<T>>,\n changedPaths?: string[],\n ) => void;\n internalSaveSnapshot: () => void;\n batchStateUpdates<TResult>(callback: () => TResult): TResult;\n config: BitFrameworkConfig<T>;\n}\n\ninterface BitLifecycleDependencyPort<T extends object> {\n getTransformEntries: () => [string, BitTransformFn<T>][];\n updateDependencies: (changedPath: string, newValues: T) => string[];\n isFieldHidden: (path: string) => boolean;\n evaluateAllDependencies: (values: T) => void;\n getHiddenFields: () => ReadonlySet<string>;\n}\n\ninterface BitLifecycleValidationPort<T extends object> {\n clearFieldValidation: (path: string) => void;\n triggerValidation: (\n scopeFields?: string[],\n options?: BitValidationTriggerOptions,\n ) => void;\n handleFieldAsyncValidation: (path: string, value: any) => void;\n cancelAllValidations: () => void;\n validateNow: (options?: BitValidationOptions) => Promise<boolean>;\n hasValidationsInProgress: (scopeFields?: string[]) => boolean;\n}\n\ninterface BitLifecycleDirtyPort<T extends object> {\n updateDirtyForPath: (\n path: string,\n nextValues: T,\n baselineValues: T,\n ) => boolean;\n rebuildDirtyState: (nextValues: T, baselineValues: T) => boolean;\n clearDirtyState: () => void;\n buildDirtyValues: (values: T) => Partial<T>;\n /** Returns the current baseline used for dirty comparisons. */\n getInitialValues: () => T;\n /** Updates the baseline (called by rebaseValues). */\n setInitialValues: (values: T) => void;\n\n resetHistory: (initialValues: T) => void;\n}\n\ninterface BitLifecycleEffectsPort<T extends object> {\n emitFieldChange: (event: BitFieldChangeEvent<T>) => void;\n emitBeforeSubmit: (event: BitBeforeSubmitEvent<T>) => Promise<void>;\n emitAfterSubmit: (event: BitAfterSubmitEvent<T>) => Promise<void>;\n emitOperationalError: (event: {\n source: \"submit\";\n error: unknown;\n payload?: unknown;\n }) => Promise<void>;\n}\n\nexport type BitLifecycleStorePort<T extends object> = BitLifecycleStatePort<T> &\n BitLifecycleDependencyPort<T> &\n BitLifecycleValidationPort<T> &\n BitLifecycleDirtyPort<T> &\n BitLifecycleEffectsPort<T>;\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\ninterface FieldUpdatePipelineContext<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 BitLifecycleManager<T extends object> {\n private readonly fieldUpdatePipeline: BitSyncPipelineRunner<\n FieldUpdatePipelineContext<T>\n >;\n private readonly submitPipeline: BitPipelineRunner<SubmitPipelineContext<T>>;\n\n constructor(private 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 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 updateField(\n path: string,\n value: any,\n meta: BitFieldChangeMeta = { origin: \"setField\" },\n ) {\n const state = this.store.getState();\n\n const context: FieldUpdatePipelineContext<T> = {\n path,\n value,\n meta,\n previousValue: getDeepValue(state.values, path),\n nextValues: setDeepValue(state.values, path, value),\n nextErrors: state.errors,\n hasMutatedErrors: false,\n toggledFields: [],\n isDirty: false,\n };\n\n this.fieldUpdatePipeline.run(context);\n }\n\n replaceValues(\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.internalUpdateState(\n {\n values: clonedValues,\n errors: {},\n isValidating: {},\n isValid: true,\n isDirty,\n isSubmitting: false,\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 hydrateValues(values: DeepPartial<T>) {\n const mergedValues = deepMerge(this.store.getState().values, values);\n this.replaceValues(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.internalUpdateState(\n {\n values: clonedValues,\n errors: {},\n touched: {},\n isValidating: {},\n isValid: true,\n isDirty: false,\n isSubmitting: false,\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 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.internalUpdateState({ isSubmitting: false });\n }\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.internalUpdateState(\n {\n values: initialCloned,\n errors: {},\n touched: {},\n isValidating: {},\n isValid: true,\n isDirty: false,\n isSubmitting: false,\n },\n [\"*\"],\n );\n\n this.store.resetHistory(initialCloned);\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 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.internalUpdateState(\n {\n values: ctx.nextValues,\n errors: ctx.nextErrors,\n isDirty: ctx.isDirty,\n },\n [ctx.path, ...ctx.toggledFields],\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 this.store.handleFieldAsyncValidation(ctx.path, ctx.value);\n }\n\n private async startSubmit(ctx: SubmitPipelineContext<T>) {\n this.store.internalUpdateState({ 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.internalUpdateState({ 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 { deepClone, deepEqual } from \"../../../utils\";\n\nexport class BitHistoryManager<T extends object = any> {\n private history: Array<T | undefined> = [];\n private historyIndex: number = -1;\n private historySize = 0;\n private historyHead = 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 const currentSnapshot = this.getSnapshotAt(this.historyIndex);\n\n if (currentSnapshot && deepEqual(currentSnapshot, values)) {\n return;\n }\n\n const snapshot = deepClone(values);\n const capacity = this.getCapacity();\n\n if (this.historyIndex < this.historySize - 1) {\n this.historySize = this.historyIndex + 1;\n }\n\n const nextIndex = this.historyIndex + 1;\n\n if (nextIndex < capacity) {\n this.history[this.toPhysicalIndex(nextIndex)] = snapshot;\n this.historySize = Math.max(this.historySize, nextIndex + 1);\n this.historyIndex = nextIndex;\n } else {\n this.historyHead = (this.historyHead + 1) % capacity;\n this.history[this.toPhysicalIndex(capacity - 1)] = snapshot;\n this.historySize = capacity;\n this.historyIndex = capacity - 1;\n }\n }\n\n get canUndo(): boolean {\n return this.enableHistory ? this.historyIndex > 0 : false;\n }\n\n /**\n * Usa historySize (lógico) e não history.length (físico).\n * Após undo + nova escrita, entries além de historySize ficam stale no array,\n * provocando canRedo=true incorreto e redo() devolvendo snapshot descartado.\n */\n get canRedo(): boolean {\n return this.enableHistory\n ? this.historyIndex < this.historySize - 1\n : false;\n }\n undo(): T | null {\n if (this.canUndo) {\n this.historyIndex--;\n return deepClone(this.getSnapshotAt(this.historyIndex)!);\n }\n return null;\n }\n\n redo(): T | null {\n if (this.canRedo) {\n this.historyIndex++;\n return deepClone(this.getSnapshotAt(this.historyIndex)!);\n }\n return null;\n }\n\n reset(initialValues: T) {\n this.history = [];\n this.historyIndex = -1;\n this.historySize = 0;\n this.historyHead = 0;\n this.saveSnapshot(initialValues);\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 getCapacity() {\n return Math.max(1, this.maxHistory);\n }\n\n private toPhysicalIndex(logicalIndex: number) {\n return (this.historyHead + logicalIndex) % this.getCapacity();\n }\n\n private getSnapshotAt(logicalIndex: number) {\n if (logicalIndex < 0 || logicalIndex >= this.historySize) {\n return undefined;\n }\n\n return this.history[this.toPhysicalIndex(logicalIndex)];\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\";\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 internalUpdateState: (\n partialState: Partial<BitState<T>>,\n changedPaths?: string[],\n ) => 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 const arr = getDeepValue(this.store.getState().values, path) || [];\n this.store.setFieldWithMeta(path, [...arr, value], {\n origin: \"array\",\n operation: \"push\",\n });\n this.store.internalSaveSnapshot();\n }\n\n prependItem(path: string, value: any) {\n const arr = getDeepValue(this.store.getState().values, path) || [];\n this.store.setFieldWithMeta(path, [value, ...arr], {\n origin: \"array\",\n operation: \"prepend\",\n });\n this.store.internalSaveSnapshot();\n }\n\n insertItem(path: string, index: number, value: any) {\n const arr = [...(getDeepValue(this.store.getState().values, path) || [])];\n arr.splice(index, 0, value);\n this.store.setFieldWithMeta(path, arr, {\n origin: \"array\",\n operation: \"insert\",\n index,\n });\n this.store.internalSaveSnapshot();\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 const newValues = setDeepValue(state.values, path, newArray);\n\n const isDirty = this.store.updateDirtyForPath(\n path,\n newValues,\n this.store.getConfig().initialValues,\n );\n\n const reindexedMeta = reindexFieldArrayMeta(state, path, (currentIdx) => {\n if (currentIdx === index) {\n return null;\n }\n\n return currentIdx > index ? currentIdx - 1 : currentIdx;\n });\n\n this.store.internalUpdateState({\n values: newValues,\n errors: reindexedMeta.errors,\n touched: reindexedMeta.touched,\n isValidating: reindexedMeta.isValidating,\n isDirty,\n });\n\n this.store.emitFieldChange({\n path,\n previousValue: previousArray,\n nextValue: newArray,\n values: this.store.getState().values,\n state: this.store.getState(),\n meta: { origin: \"array\", operation: \"remove\", index },\n });\n\n this.store.internalSaveSnapshot();\n this.revalidate(path);\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 const newValues = setDeepValue(state.values, path, arr);\n\n const isDirty = this.store.updateDirtyForPath(\n path,\n newValues,\n this.store.getConfig().initialValues,\n );\n\n const reindexedMeta = reindexFieldArrayMeta(state, 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 this.store.internalUpdateState({\n values: newValues,\n errors: reindexedMeta.errors,\n touched: reindexedMeta.touched,\n isValidating: reindexedMeta.isValidating,\n isDirty,\n });\n\n this.store.emitFieldChange({\n path,\n previousValue: previousArray,\n nextValue: arr,\n values: this.store.getState().values,\n state: this.store.getState(),\n meta: {\n origin: \"array\",\n operation: \"swap\",\n from: indexA,\n to: indexB,\n },\n });\n\n this.store.internalSaveSnapshot();\n this.revalidate(path);\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 const newValues = setDeepValue(state.values, path, arr);\n\n const isDirty = this.store.updateDirtyForPath(\n path,\n newValues,\n this.store.getConfig().initialValues,\n );\n\n const reindexedMeta = reindexFieldArrayMeta(state, 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 this.store.internalUpdateState({\n values: newValues,\n errors: reindexedMeta.errors,\n touched: reindexedMeta.touched,\n isValidating: reindexedMeta.isValidating,\n isDirty,\n });\n\n this.store.emitFieldChange({\n path,\n previousValue: previousArray,\n nextValue: arr,\n values: this.store.getState().values,\n state: this.store.getState(),\n meta: {\n origin: \"array\",\n operation: \"move\",\n from,\n to,\n },\n });\n\n this.store.internalSaveSnapshot();\n this.revalidate(path);\n }\n\n private revalidate(path: string) {\n this.store.triggerValidation([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 type { BitFrameworkConfig } from \"../../contracts/public-types\";\nimport { BitDependencyManager } from \"../core/dependency-manager\";\nimport { getDeepValue, valueEqual } from \"../../../utils\";\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 dependencyManager: BitDependencyManager<T>,\n private getState: () => BitState<T>,\n private getConfig: () => BitFrameworkConfig<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.dependencyManager.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.dependencyManager.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","import { BitErrors, BitState } from \"../../contracts/types\";\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 internalUpdateState: (partial: Partial<BitState<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.internalUpdateState({ errors: newErrors });\n }\n\n /**\n * Set multiple field errors at once (merge behavior).\n */\n setErrors(errors: BitErrors<T>): void {\n this.internalUpdateState({\n errors: { ...this.getState().errors, ...errors },\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","export class BitCapabilityRegistry<\n TCapabilities extends Record<string, unknown>,\n> {\n private readonly capabilities = new Map<\n keyof TCapabilities,\n TCapabilities[keyof TCapabilities]\n >();\n\n register<TKey extends keyof TCapabilities>(\n key: TKey,\n capability: TCapabilities[TKey],\n ): void {\n this.capabilities.set(key, capability);\n }\n\n get<TKey extends keyof TCapabilities>(key: TKey): TCapabilities[TKey] {\n const capability = this.capabilities.get(key);\n\n if (!capability) {\n throw new Error(`Capability \\\"${String(key)}\\\" is not registered`);\n }\n\n return capability as TCapabilities[TKey];\n }\n\n has<TKey extends keyof TCapabilities>(key: TKey): boolean {\n return this.capabilities.has(key);\n }\n\n clear(): void {\n this.capabilities.clear();\n }\n}\n","import { createDevtoolsPlugin } from \"../managers/features/devtools-plugin\";\nimport { 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 { BitComputedManager } from \"../managers/core/computed-manager\";\nimport { BitScopeManager } from \"../managers/features/scope-manager\";\nimport { BitFieldQueryManager } from \"../managers/features/field-query-manager\";\nimport { BitErrorManager } from \"../managers/features/error-manager\";\nimport { BitCapabilityRegistry } from \"./capability-registry\";\nimport { BitDependencyManager } from \"../managers/core/dependency-manager\";\nimport { BitDirtyManager } from \"../managers/core/dirty-manager\";\nimport { deepClone } from \"../../utils\";\nimport type { BitStoreCapabilities } from \"./capabilities\";\nimport type { BitFrameworkConfig } from \"../contracts/public-types\";\nimport type { BitLifecycleStorePort } from \"../managers/features/lifecycle-manager\";\nimport type { BitValidationStorePort } from \"../managers/features/validation-manager\";\nimport type { BitFieldDefinition, BitState } from \"../contracts/types\";\n\ntype BitStoreCapabilityPorts<T extends object> = BitValidationStorePort<T> &\n BitLifecycleStorePort<T> &\n BitArrayStorePort<T> & {\n getScopeFields(scopeName: string): string[];\n getState(): BitState<T>;\n internalUpdateState(partialState: Partial<BitState<T>>): void;\n };\n\nexport function createStoreCapabilities<T extends object>(args: {\n store: BitStoreCapabilityPorts<T>;\n dependencyManager: BitDependencyManager<T>;\n dirtyManager: BitDirtyManager<T>;\n}): BitCapabilityRegistry<BitStoreCapabilities<T>> {\n const { store, dependencyManager, dirtyManager } = args;\n\n const capabilities = new BitCapabilityRegistry<BitStoreCapabilities<T>>();\n\n const validationPort: BitValidationStorePort<T> = {\n getState: () => store.getState(),\n internalUpdateState: (partial) => store.internalUpdateState(partial),\n setError: (path, message) => store.setError(path, message),\n validate: (opts) => store.validate(opts),\n getFieldConfig: (path) => store.getFieldConfig(path),\n getScopeFields: (scopeName) => store.getScopeFields(scopeName),\n config: store.config,\n getRequiredErrors: (values) => store.getRequiredErrors(values),\n getHiddenFields: () => store.getHiddenFields(),\n emitBeforeValidate: (event) => store.emitBeforeValidate(event),\n emitAfterValidate: (event) => store.emitAfterValidate(event),\n };\n\n const lifecyclePort: BitLifecycleStorePort<T> = {\n getState: () => store.getState(),\n internalUpdateState: (partial, changedPaths) =>\n store.internalUpdateState(partial, changedPaths),\n internalSaveSnapshot: () => store.internalSaveSnapshot(),\n batchStateUpdates: (callback) => store.batchStateUpdates(callback),\n config: store.config,\n getTransformEntries: () => store.getTransformEntries(),\n updateDependencies: (changedPath, newValues) =>\n store.updateDependencies(changedPath, newValues),\n isFieldHidden: (path) => store.isFieldHidden(path),\n evaluateAllDependencies: (values) => store.evaluateAllDependencies(values),\n getHiddenFields: () => store.getHiddenFields(),\n clearFieldValidation: (path) => store.clearFieldValidation(path),\n triggerValidation: (scopeFields, options) =>\n store.triggerValidation(scopeFields, options),\n handleFieldAsyncValidation: (path, value) =>\n store.handleFieldAsyncValidation(path, value),\n cancelAllValidations: () => store.cancelAllValidations(),\n validateNow: (options) => store.validateNow(options),\n hasValidationsInProgress: (scopeFields) =>\n store.hasValidationsInProgress(scopeFields),\n updateDirtyForPath: (path, nextValues, baselineValues) =>\n store.updateDirtyForPath(path, nextValues, baselineValues),\n rebuildDirtyState: (nextValues, baselineValues) =>\n store.rebuildDirtyState(nextValues, baselineValues),\n clearDirtyState: () => store.clearDirtyState(),\n buildDirtyValues: (values) => store.buildDirtyValues(values),\n getInitialValues: () => store.getInitialValues(),\n setInitialValues: (values) => store.setInitialValues(values),\n resetHistory: (initialValues) => store.resetHistory(initialValues),\n emitFieldChange: (event) => store.emitFieldChange(event),\n emitBeforeSubmit: (event) => store.emitBeforeSubmit(event),\n emitAfterSubmit: (event) => store.emitAfterSubmit(event),\n emitOperationalError: (event) => store.emitOperationalError(event),\n };\n\n capabilities.register(\n \"validation\",\n new BitValidationManager<T>(validationPort),\n );\n capabilities.register(\"lifecycle\", new BitLifecycleManager<T>(lifecyclePort));\n capabilities.register(\n \"history\",\n new BitHistoryManager<T>(\n !!store.config.enableHistory,\n store.config.historyLimit ?? 15,\n ),\n );\n capabilities.register(\"arrays\", new BitArrayManager<T>(store));\n capabilities.register(\n \"scope\",\n new BitScopeManager<T>(\n () => store.getState(),\n () => store.getInitialValues(),\n (scopeName) => store.getScopeFields(scopeName),\n (path) => dirtyManager.isPathDirty(path),\n ),\n );\n capabilities.register(\n \"query\",\n new BitFieldQueryManager<T>(\n dependencyManager,\n () => store.getState(),\n () => store.config,\n (path) => dirtyManager.isPathDirty(path),\n ),\n );\n capabilities.register(\n \"error\",\n new BitErrorManager<T>(\n () => store.getState(),\n (partial) => store.internalUpdateState(partial),\n ),\n );\n\n return capabilities;\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 runtimePlugins = [...config.plugins];\n const devtoolsPlugin = createDevtoolsPlugin<T>(config.devTools);\n if (devtoolsPlugin) {\n runtimePlugins.push(devtoolsPlugin);\n }\n\n const pluginManager = new BitPluginManager<T>(runtimePlugins, () => ({\n storeId,\n getState: () => getState(),\n getConfig: () => getConfig(),\n }));\n\n const effects = new BitStoreEffectEngine<T>(\n storeId,\n storeInstance,\n persistManager,\n pluginManager,\n );\n effects.initialize();\n\n return effects;\n}\n\nexport function createInitialStoreState<T extends object>(args: {\n config: BitFrameworkConfig<T>;\n dependencyManager: BitDependencyManager<T>;\n computedManager: BitComputedManager<T>;\n}): BitState<T> {\n const { config, dependencyManager, computedManager } = args;\n\n const initialValues = deepClone(config.initialValues);\n\n if (config.fields) {\n Object.entries(config.fields).forEach(([path, fieldConfig]) => {\n dependencyManager.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 { BitMask, BitMaskName } from \"../mask/types\";\nimport {\n BitConfig,\n BitComputedFn,\n BitErrors,\n BitPersistMetadata,\n BitFieldState,\n BitTransformFn,\n BitState,\n BitFieldDefinition,\n BitPath,\n BitPathValue,\n BitArrayPath,\n BitArrayItem,\n DeepPartial,\n BitFieldChangeMeta,\n BitFieldChangeEvent,\n BitBeforeValidateEvent,\n BitAfterValidateEvent,\n BitBeforeSubmitEvent,\n BitAfterSubmitEvent,\n} from \"./contracts/types\";\nimport type {\n BitFrameworkConfig,\n BitHistoryMetadata,\n BitSelector,\n BitSelectorSubscriptionOptions,\n BitValidationOptions,\n} from \"./contracts/public-types\";\nimport { deepClone, deepEqual, getDeepValue, valueEqual } from \"../utils\";\nimport { normalizeConfig } from \"./shared/config\";\nimport { BitDependencyManager } from \"./managers/core/dependency-manager\";\nimport {\n BitComputedEntry,\n BitComputedManager,\n} from \"./managers/core/computed-manager\";\nimport { BitDirtyManager } from \"./managers/core/dirty-manager\";\nimport { BitSubscriptionEngine } from \"./engines/subscription-engine\";\nimport { applyStateUpdate } from \"./engines/state-update-engine\";\nimport { BitStoreEffectEngine } from \"./engines/effect-engine\";\nimport { BitCapabilityRegistry } from \"./orchestration/capability-registry\";\nimport type { BitStoreCapabilities } from \"./orchestration/capabilities\";\nimport type { BitValidationTriggerOptions } from \"./managers/features/validation-manager\";\nimport {\n createInitialStoreState,\n createStoreCapabilities,\n createStoreEffects,\n} from \"./orchestration/store-bootstrap\";\n/**\n * BitStore\n *\n * The core orchestrator of form state management.\n *\n * This store coordinates multiple managers to provide comprehensive form handling:\n * - Core managers handle essential state and validation\n * - Feature managers provide optional enhancements (history, arrays, scopes)\n * - Query/mutation managers organize domain-specific operations\n */\nexport class BitStore<T extends object = any> {\n // ============================================================================\n // PRIVATE PROPERTIES\n // ============================================================================\n\n private state: BitState<T>;\n private readonly subscriptions: BitSubscriptionEngine<T>;\n private readonly effects: BitStoreEffectEngine<T>;\n private readonly capabilities: BitCapabilityRegistry<BitStoreCapabilities<T>>;\n /** Baseline for dirty tracking. Decoupled from config so that rebaseValues\n * can update it without mutating the user-provided config object. */\n private _initialValues!: T;\n /** Incremented on every registerMask() call so React hooks can track mask\n * configuration changes via useSyncExternalStore without putting masks in\n * BitState and triggering a full re-render of all fields. */\n private _masksVersion = 0;\n\n // ============================================================================\n // PUBLIC PROPERTIES\n // ============================================================================\n\n public config: BitFrameworkConfig<T>;\n public readonly storeId: string;\n\n // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n // Core Managers\n // Managers for essential form state management\n // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n private readonly dependencyManager: BitDependencyManager<T>;\n private readonly computedManager: BitComputedManager<T>;\n private readonly dirtyManager: BitDirtyManager<T>;\n private scopeFieldsIndex: Map<string, string[]> | null = null;\n private computedEntriesCache: BitComputedEntry<T>[] | null = null;\n private transformEntriesCache: [string, BitTransformFn<T>][] | null = null;\n private batchDepth = 0;\n private batchedState: BitState<T> | null = null;\n private batchedChangedPaths: Set<string> | null = null;\n private batchedValuesChanged = false;\n\n private invalidateFieldIndexes() {\n this.scopeFieldsIndex = null;\n this.computedEntriesCache = null;\n this.transformEntriesCache = null;\n this.computedManager.invalidateReverseDeps();\n }\n\n private registerCachedFieldIndexes(\n path: string,\n config: BitFieldDefinition<T>,\n ) {\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 ?? config.conditional?.dependsOn,\n });\n }\n\n if (this.transformEntriesCache && config.transform) {\n this.transformEntriesCache.push([path, config.transform]);\n }\n }\n\n private unregisterCachedFieldIndexes(\n path: string,\n config?: BitFieldDefinition<T>,\n ) {\n if (!config) {\n this.invalidateFieldIndexes();\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 private getCapability<TKey extends keyof BitStoreCapabilities<T>>(key: TKey) {\n return this.capabilities.get(key);\n }\n\n // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n // Feature Managers\n // Managers for optional features like history, arrays, and scopes\n // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n private get validation() {\n return this.getCapability(\"validation\");\n }\n\n private get lifecycle() {\n return this.getCapability(\"lifecycle\");\n }\n\n private get history() {\n return this.getCapability(\"history\");\n }\n\n private get arrays() {\n return this.getCapability(\"arrays\");\n }\n\n private get scope() {\n return this.getCapability(\"scope\");\n }\n\n private get query() {\n return this.getCapability(\"query\");\n }\n\n private get error() {\n return this.getCapability(\"error\");\n }\n\n // ============================================================================\n // CONSTRUCTOR\n // ============================================================================\n\n constructor(config: BitConfig<T> = {}) {\n this.config = normalizeConfig(config);\n this._initialValues = this.config.initialValues;\n\n // Initialize core managers\n this.dependencyManager = new BitDependencyManager<T>();\n this.computedManager = new BitComputedManager<T>(() =>\n this.getComputedEntries(),\n );\n this.dirtyManager = new BitDirtyManager<T>();\n this.capabilities = createStoreCapabilities<T>({\n store: this,\n dependencyManager: this.dependencyManager,\n dirtyManager: this.dirtyManager,\n });\n this.state = createInitialStoreState<T>({\n config: this.config,\n dependencyManager: this.dependencyManager,\n computedManager: this.computedManager,\n });\n this.subscriptions = new BitSubscriptionEngine<T>(() => this.state);\n\n this.internalSaveSnapshot();\n\n this.storeId =\n config.storeId ||\n this.config.name ||\n this.config.idFactory({\n scope: \"store\",\n storeName: this.config.name,\n });\n\n this.effects = createStoreEffects<T>({\n storeId: this.storeId,\n storeInstance: this,\n config: this.config,\n getState: () => this.getState(),\n getConfig: () => this.getConfig(),\n getValues: () => this.state.values,\n getDirtyValues: () => this.getDirtyValues(),\n applyPersistedValues: (values) => this.applyPersistedValues(values),\n });\n }\n\n // ============================================================================\n // STATE ACCESS\n // ============================================================================\n\n getConfig() {\n return this.config;\n }\n\n getFieldConfig(path: string): BitFieldDefinition<T> | undefined {\n return (\n this.dependencyManager.getFieldConfig(path) ||\n this.config.fields?.[path as keyof typeof this.config.fields]\n );\n }\n\n getScopeFields(scopeName: string): string[] {\n if (!this.scopeFieldsIndex) {\n const index = new Map<string, string[]>();\n this.dependencyManager.forEachFieldConfig((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.dependencyManager.forEachFieldConfig((cfg, path) => {\n if (cfg.computed) {\n result.push({\n path,\n compute: cfg.computed,\n dependsOn: cfg.computedDependsOn ?? cfg.conditional?.dependsOn,\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.dependencyManager.forEachFieldConfig((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 resolveMask(path: string): BitMask | undefined {\n const maskOption = this.getFieldConfig(path)?.mask;\n if (!maskOption) return undefined;\n\n if (typeof maskOption === \"string\") {\n return this.config.masks?.[maskOption];\n }\n\n return maskOption;\n }\n\n getState(): BitState<T> {\n return this.batchedState ?? this.state;\n }\n\n getFieldState<P extends BitPath<T>>(\n path: P,\n ): BitFieldState<T, BitPathValue<T, P>> {\n const value = getDeepValue(\n this.state.values,\n path as string,\n ) as BitPathValue<T, P>;\n\n return {\n value,\n error: this.state.errors[path as keyof BitErrors<T>],\n touched: !!this.state.touched[path as keyof typeof this.state.touched],\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.state.isValid;\n }\n\n get isSubmitting(): boolean {\n return this.state.isSubmitting;\n }\n\n get isDirty(): boolean {\n return this.state.isDirty;\n }\n\n // ============================================================================\n // FIELD REGISTRATION & CLEANUP\n // ============================================================================\n\n registerField(path: string, config: BitFieldDefinition<T>) {\n this.dependencyManager.register(path, config, this.state.values);\n this.registerCachedFieldIndexes(path, config);\n if (this.dependencyManager.isHidden(path)) {\n // Notify only the registered path instead of a full wildcard broadcast,\n // avoiding O(all-subscribers) re-evaluation on every conditional field mount.\n this.subscriptions.notify(this.state, [path]);\n }\n }\n\n unregisterField(path: string) {\n // Fields from initial config are never unregistered\n if (this.config.fields?.[path as string]) {\n return;\n }\n const config = this.getFieldConfig(path);\n this.validation.cleanupField(path as string);\n this.dependencyManager.unregister(path);\n this.unregisterCachedFieldIndexes(path, config);\n\n const newErrors = { ...this.state.errors };\n const newTouched = { ...this.state.touched };\n let stateChanged = false;\n\n if (newErrors[path as keyof BitErrors<T>]) {\n delete newErrors[path as keyof BitErrors<T>];\n stateChanged = true;\n }\n\n if (newTouched[path as keyof typeof newTouched]) {\n delete newTouched[path as keyof typeof newTouched];\n stateChanged = true;\n }\n\n if (stateChanged) {\n this.internalUpdateState({\n errors: newErrors,\n touched: newTouched,\n });\n }\n }\n\n unregisterPrefix(prefix: string) {\n this.validation.cleanupPrefix(prefix);\n const removedEntries = this.dependencyManager.unregisterPrefix(prefix);\n\n removedEntries.forEach(([path, config]) => {\n this.unregisterCachedFieldIndexes(path, config);\n });\n }\n\n // ============================================================================\n // FIELD QUERIES (Delegated to query manager)\n // ============================================================================\n\n isHidden<P extends BitPath<T>>(path: P): boolean {\n return this.query.isHidden(path);\n }\n\n isRequired<P extends BitPath<T>>(path: P): boolean {\n return this.query.isRequired(path);\n }\n\n isFieldDirty(path: string): boolean {\n return this.query.isFieldDirty(path);\n }\n\n isFieldValidating(path: string): boolean {\n return this.query.isFieldValidating(path);\n }\n\n // ============================================================================\n // SUBSCRIPTIONS & WATCHERS\n // ============================================================================\n\n subscribe(listener: () => void): () => void {\n return this.subscriptions.subscribe(listener);\n }\n\n subscribeSelector<TSlice>(\n selector: BitSelector<T, TSlice>,\n listener: (slice: TSlice) => void,\n options?: BitSelectorSubscriptionOptions<TSlice>,\n ) {\n const equalityFn = options?.equalityFn ?? valueEqual;\n return this.subscriptions.subscribeSelector(\n selector,\n listener,\n options,\n equalityFn,\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 const mergedPaths = [...(options?.paths ?? []), path as string];\n\n return this.subscribeSelector(\n (state) =>\n getDeepValue(state.values, path as string) as BitPathValue<T, P>,\n listener,\n {\n ...options,\n paths: mergedPaths,\n },\n );\n }\n\n watch<P extends BitPath<T>>(\n path: P,\n callback: (value: BitPathValue<T, P>) => void,\n ) {\n return this.subscribePath(path, callback, {\n equalityFn: deepEqual,\n });\n }\n\n // ============================================================================\n // FIELD VALUE MUTATIONS\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 setFieldWithMeta(\n path: string,\n value: any,\n meta: BitFieldChangeMeta = { origin: \"setField\" },\n ) {\n this.lifecycle.updateField(path, value, meta);\n }\n\n blurField<P extends BitPath<T>>(path: P) {\n this.internalSaveSnapshot();\n\n if (!this.state.touched[path as keyof typeof this.state.touched]) {\n this.batchStateUpdates(() => {\n this.internalUpdateState({\n touched: { ...this.state.touched, [path]: true },\n });\n });\n }\n\n this.validation.trigger([path]);\n }\n\n markFieldsTouched(paths: string[]) {\n if (paths.length === 0) return;\n const newTouched = { ...this.state.touched };\n paths.forEach((path) => {\n newTouched[path as keyof typeof newTouched] = true;\n });\n this.internalUpdateState({ touched: newTouched });\n }\n\n replaceValues(newValues: T) {\n this.lifecycle.replaceValues(newValues);\n }\n\n hydrate(values: DeepPartial<T>) {\n this.lifecycle.hydrateValues(values);\n }\n\n rebase(newValues: T) {\n this.lifecycle.rebaseValues(newValues);\n }\n\n // ============================================================================\n // ERROR MANAGEMENT (Delegated to errorMg)\n // ============================================================================\n\n setError(path: string, message: string | undefined) {\n this.error.setError(path, message);\n }\n\n setErrors(errors: BitErrors<T>) {\n this.error.setErrors(errors);\n }\n\n setServerErrors(serverErrors: Record<string, string[] | string>) {\n this.error.setServerErrors(serverErrors);\n }\n\n // ============================================================================\n // FORM-LEVEL OPERATIONS\n // ============================================================================\n\n reset() {\n this.lifecycle.reset();\n }\n\n transaction<TResult>(callback: () => TResult): TResult {\n return this.batchStateUpdates(callback);\n }\n\n async submit(\n onSuccess: (values: T, dirtyValues?: Partial<T>) => void | Promise<void>,\n ) {\n return this.lifecycle.submit(onSuccess);\n }\n\n registerMask(name: BitMaskName, mask: BitMask) {\n this.config.masks = {\n ...(this.config.masks || {}),\n [name]: mask,\n };\n this._masksVersion += 1;\n // Fire global listeners so useSyncExternalStore subscribers tracking\n // getMasksVersion() can pick up the change without broadcasting to all\n // path-scoped field subscribers (the sentinel path matches no real field).\n this.subscriptions.notify(this.state, [\"__masks__\"]);\n }\n\n getDirtyValues(): Partial<T> {\n return this.dirtyManager.buildDirtyValues(this.state.values);\n }\n\n getPersistMetadata(): BitPersistMetadata {\n return this.state.persist;\n }\n\n async restorePersisted(): Promise<boolean> {\n this.internalUpdateState({\n persist: { ...this.state.persist, isRestoring: true, error: null },\n });\n\n try {\n return await this.effects.restorePersisted();\n } catch (error) {\n this.internalUpdateState({\n persist: {\n ...this.state.persist,\n isRestoring: false,\n error: error instanceof Error ? error : new Error(String(error)),\n },\n });\n return false;\n } finally {\n this.internalUpdateState({\n persist: { ...this.state.persist, isRestoring: false },\n });\n }\n }\n\n async forceSave(): Promise<void> {\n this.internalUpdateState({\n persist: { ...this.state.persist, isSaving: true, error: null },\n });\n\n try {\n await this.effects.savePersistedNow();\n } catch (error) {\n this.internalUpdateState({\n persist: {\n ...this.state.persist,\n isSaving: false,\n error: error instanceof Error ? error : new Error(String(error)),\n },\n });\n return;\n }\n\n this.internalUpdateState({\n persist: { ...this.state.persist, isSaving: false },\n });\n }\n\n async clearPersisted(): Promise<void> {\n this.internalUpdateState({\n persist: { ...this.state.persist, error: null },\n });\n\n try {\n await this.effects.clearPersisted();\n } catch (error) {\n this.internalUpdateState({\n persist: {\n ...this.state.persist,\n error: error instanceof Error ? error : new Error(String(error)),\n },\n });\n }\n }\n\n // ============================================================================\n // ARRAY OPERATIONS (Delegated to arraysMg)\n // ============================================================================\n\n pushItem<P extends BitArrayPath<T>>(\n path: P,\n value: BitArrayItem<BitPathValue<T, P>>,\n ) {\n this.arrays.pushItem(path, value);\n }\n\n prependItem<P extends BitArrayPath<T>>(\n path: P,\n value: BitArrayItem<BitPathValue<T, P>>,\n ) {\n this.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.arrays.insertItem(path, index, value);\n }\n\n removeItem<P extends BitArrayPath<T>>(path: P, index: number) {\n this.arrays.removeItem(path, index);\n }\n\n swapItems<P extends BitArrayPath<T>>(\n path: P,\n indexA: number,\n indexB: number,\n ) {\n this.arrays.swapItems(path, indexA, indexB);\n }\n\n moveItem<P extends BitArrayPath<T>>(path: P, from: number, to: number) {\n this.arrays.moveItem(path, from, to);\n }\n\n // ============================================================================\n // HISTORY & TIME-TRAVEL (Delegated to historyMg)\n // ============================================================================\n\n get canUndo(): boolean {\n return this.history.canUndo;\n }\n\n get canRedo(): boolean {\n return this.history.canRedo;\n }\n\n undo() {\n const prevState = this.history.undo();\n if (prevState) {\n const isDirty = this.dirtyManager.rebuild(prevState, this._initialValues);\n this.internalUpdateState({ values: prevState, isDirty });\n this.validation.trigger(undefined, { forceDebounce: true });\n }\n }\n\n redo() {\n const nextState = this.history.redo();\n if (nextState) {\n const isDirty = this.dirtyManager.rebuild(nextState, this._initialValues);\n this.internalUpdateState({ values: nextState, isDirty });\n this.validation.trigger(undefined, { forceDebounce: true });\n }\n }\n\n getHistoryMetadata(): BitHistoryMetadata {\n return this.history.getMetadata();\n }\n\n // ============================================================================\n // VALIDATION & SCOPES\n // ============================================================================\n\n validate(options?: BitValidationOptions): Promise<boolean> {\n return this.validation.validate(options);\n }\n\n emitBeforeValidate(event: BitBeforeValidateEvent<T>): Promise<void> {\n return this.effects.beforeValidate(event);\n }\n\n emitAfterValidate(event: BitAfterValidateEvent<T>): Promise<void> {\n return this.effects.afterValidate(event);\n }\n\n emitBeforeSubmit(event: BitBeforeSubmitEvent<T>): Promise<void> {\n return this.effects.beforeSubmit(event);\n }\n\n emitAfterSubmit(event: BitAfterSubmitEvent<T>): Promise<void> {\n return this.effects.afterSubmit(event);\n }\n\n emitFieldChange(event: BitFieldChangeEvent<T>) {\n this.effects.onFieldChange(event);\n }\n\n emitOperationalError(event: {\n source: \"submit\";\n error: unknown;\n payload?: unknown;\n }) {\n return this.effects.reportOperationalError(event);\n }\n\n hasValidationsInProgress(scopeFields?: string[]): boolean {\n return this.validation.hasValidationsInProgress(scopeFields);\n }\n\n triggerValidation(\n scopeFields?: string[],\n options?: BitValidationTriggerOptions,\n ) {\n this.validation.trigger(scopeFields, options);\n }\n\n getStepStatus(scopeName: string) {\n return this.scope.getStepStatus(scopeName);\n }\n\n getStepErrors(scopeName: string): Record<string, string> {\n return this.scope.getStepErrors(scopeName);\n }\n\n updateDependencies(changedPath: string, newValues: T): string[] {\n return this.dependencyManager.updateDependencies(changedPath, newValues);\n }\n\n isFieldHidden(path: string): boolean {\n return this.dependencyManager.isHidden(path);\n }\n\n evaluateAllDependencies(values: T): void {\n this.dependencyManager.evaluateAll(values);\n }\n\n getHiddenFields(): ReadonlySet<string> {\n return this.dependencyManager.getHiddenFields();\n }\n\n getRequiredErrors(values: T): BitErrors<T> {\n return this.dependencyManager.getRequiredErrors(values);\n }\n\n clearFieldValidation(path: string): void {\n this.validation.clear(path);\n }\n\n handleFieldAsyncValidation(path: string, value: any): void {\n this.validation.handleAsync(path, value);\n }\n\n cancelAllValidations(): void {\n this.validation.cancelAll();\n }\n\n validateNow(options?: BitValidationOptions): Promise<boolean> {\n return this.validation.validate(options);\n }\n\n updateDirtyForPath(path: string, nextValues: T, baselineValues: T): boolean {\n return this.dirtyManager.updateForPath(path, nextValues, baselineValues);\n }\n\n rebuildDirtyState(nextValues: T, baselineValues: T): boolean {\n return this.dirtyManager.rebuild(nextValues, baselineValues);\n }\n\n clearDirtyState(): void {\n this.dirtyManager.clear();\n }\n\n buildDirtyValues(values: T): Partial<T> {\n return this.dirtyManager.buildDirtyValues(values);\n }\n\n batchStateUpdates<TResult>(callback: () => TResult): TResult {\n this.batchDepth += 1;\n\n try {\n return callback();\n } finally {\n this.batchDepth -= 1;\n\n if (this.batchDepth === 0) {\n this.flushBatchedStateUpdates();\n }\n }\n }\n\n resetHistory(initialValues: T): void {\n this.history.reset(initialValues);\n }\n\n /** Current baseline used for dirty-state comparisons. */\n get initialValues(): T {\n return this._initialValues;\n }\n\n /** Returns the current baseline (usable as a port method). */\n getInitialValues(): T {\n return this._initialValues;\n }\n\n /**\n * Updates the baseline used for dirty comparisons.\n * Called by rebaseValues so that config is never mutated directly by managers.\n * Also syncs config.initialValues so getConfig() reflects the new baseline.\n */\n setInitialValues(values: T): void {\n this._initialValues = values;\n // Keep the public config reference consistent so that getConfig().initialValues\n // continues to return the current baseline after a rebase.\n this.config.initialValues = values;\n }\n\n /** Returns a monotonically increasing counter that increments every time a\n * mask is registered via registerMask(). Used by React components to track\n * mask configuration changes reactively without storing masks in BitState. */\n getMasksVersion(): number {\n return this._masksVersion;\n }\n\n // ============================================================================\n // INTERNAL OPERATIONS\n // ============================================================================\n\n internalUpdateState(\n partialState: Partial<BitState<T>>,\n changedPaths?: string[],\n ) {\n if (this.batchDepth > 0) {\n const updateResult = applyStateUpdate({\n currentState: this.batchedState ?? this.state,\n partialState,\n changedPaths,\n applyComputedValues: (values) => values,\n });\n\n this.batchedState = updateResult.nextState;\n this.batchedValuesChanged ||= updateResult.valuesChanged;\n\n if (updateResult.changedPaths && updateResult.changedPaths.length > 0) {\n const pathSet = this.batchedChangedPaths ?? new Set<string>();\n updateResult.changedPaths.forEach((path) => pathSet.add(path));\n this.batchedChangedPaths = pathSet;\n }\n\n return;\n }\n\n const updateResult = applyStateUpdate({\n currentState: this.state,\n partialState,\n changedPaths,\n applyComputedValues: (values) =>\n this.computedManager.apply(values, changedPaths),\n });\n\n this.state = updateResult.nextState;\n\n this.subscriptions.notify(this.state, updateResult.changedPaths);\n this.effects.onStateUpdated(this.state, updateResult.valuesChanged);\n }\n\n internalSaveSnapshot() {\n this.history.saveSnapshot(this.state.values);\n }\n\n private applyPersistedValues(values: Partial<T>) {\n const nextValues = deepClone({\n ...this._initialValues,\n ...values,\n } as T);\n\n this.validation.cancelAll();\n this.dependencyManager.evaluateAll(nextValues);\n\n const isDirty = this.dirtyManager.rebuild(nextValues, this._initialValues);\n\n this.internalUpdateState({\n values: nextValues,\n errors: {},\n touched: {},\n isValidating: {},\n persist: { ...this.state.persist, error: null },\n isValid: true,\n isDirty,\n isSubmitting: false,\n });\n\n this.internalSaveSnapshot();\n this.validation.validate();\n }\n\n cleanup() {\n this.subscriptions.destroy();\n this.validation.cancelAll();\n this.capabilities.clear();\n this.effects.destroy();\n }\n\n private flushBatchedStateUpdates() {\n if (!this.batchedState) {\n return;\n }\n\n let nextState = this.batchedState;\n const changedPaths = this.batchedChangedPaths\n ? Array.from(this.batchedChangedPaths)\n : undefined;\n const valuesChanged = this.batchedValuesChanged;\n\n if (valuesChanged) {\n nextState = {\n ...nextState,\n values: this.computedManager.apply(nextState.values, changedPaths),\n };\n }\n\n this.batchedState = null;\n this.batchedChangedPaths = null;\n this.batchedValuesChanged = false;\n\n this.state = nextState;\n this.subscriptions.notify(this.state, changedPaths);\n this.effects.onStateUpdated(this.state, valuesChanged);\n }\n}\n","import { BitStore } from \"../index\";\nimport { BitConfig } from \"../contracts/types\";\nimport { BitStoreApi, BitStoreHooksApi } from \"../contracts/public-types\";\n\n/**\n * Conjunto estático de chaves públicas de BitStoreApi.\n * Usado pelo Proxy da façade para impedir acesso a métodos internos em runtime,\n * complementando a restrição de tipo em tempo de compilação.\n */\nconst PUBLIC_API_KEYS = new Set<string>([\n // BitStoreApi\n \"config\",\n \"getConfig\",\n \"getState\",\n \"subscribe\",\n \"setField\",\n \"blurField\",\n \"replaceValues\",\n \"hydrate\",\n \"rebase\",\n \"setError\",\n \"setErrors\",\n \"setServerErrors\",\n \"validate\",\n \"reset\",\n \"transaction\",\n \"submit\",\n \"registerMask\",\n \"getMasksVersion\",\n \"getDirtyValues\",\n \"getPersistMetadata\",\n \"restorePersisted\",\n \"forceSave\",\n \"clearPersisted\",\n \"cleanup\",\n \"registerField\",\n \"unregisterField\",\n \"isHidden\",\n \"isRequired\",\n \"isFieldDirty\",\n \"isFieldValidating\",\n \"watch\",\n \"pushItem\",\n \"prependItem\",\n \"insertItem\",\n \"removeItem\",\n \"moveItem\",\n \"swapItems\",\n \"getHistoryMetadata\",\n \"undo\",\n \"redo\",\n \"getStepStatus\",\n \"getStepErrors\",\n]);\n\nconst facadeToInternalStore = new WeakMap<object, BitStore<any>>();\n\nfunction createPublicFacade<T extends object>(\n store: BitStore<T>,\n): BitStoreApi<T> {\n const facade = new Proxy(store, {\n get(target, prop) {\n if (typeof prop === \"string\" && !PUBLIC_API_KEYS.has(prop)) {\n return undefined;\n }\n const value = Reflect.get(target, prop, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n has(_target, prop) {\n return typeof prop === \"string\" && PUBLIC_API_KEYS.has(prop);\n },\n set() {\n return false;\n },\n }) as unknown as BitStoreApi<T>;\n\n facadeToInternalStore.set(facade as object, store);\n return facade;\n}\n\nfunction isHookCompatibleStore<T extends object>(\n store: BitStoreApi<T> | BitStore<T>,\n): store is BitStoreHooksApi<T> {\n return (\n typeof (store as Partial<BitStoreHooksApi<T>>).getFieldState ===\n \"function\" &&\n typeof (store as Partial<BitStoreHooksApi<T>>).subscribePath ===\n \"function\" &&\n typeof (store as Partial<BitStoreHooksApi<T>>).subscribeSelector ===\n \"function\" &&\n typeof (store as Partial<BitStoreHooksApi<T>>).markFieldsTouched ===\n \"function\" &&\n typeof (store as Partial<BitStoreHooksApi<T>>).hasValidationsInProgress ===\n \"function\" &&\n typeof (store as Partial<BitStoreHooksApi<T>>).resolveMask === \"function\" &&\n typeof (store as Partial<BitStoreHooksApi<T>>).getScopeFields === \"function\"\n );\n}\n\nexport function resolveBitStoreForHooks<T extends object>(\n store: BitStoreApi<T> | BitStore<T>,\n): BitStoreHooksApi<T> {\n const internalStore = facadeToInternalStore.get(store as object);\n if (internalStore) {\n return internalStore as BitStoreHooksApi<T>;\n }\n\n if (store instanceof BitStore) {\n return store;\n }\n\n if (isHookCompatibleStore(store)) {\n return store;\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): BitStoreApi<T> {\n return createPublicFacade(new BitStore<T>(config));\n}\n"],"mappings":"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","names":["deepClone","obj","item","clone","key","deepMerge","target","source","base","sourceValue","baseValue","valueEqual","a","b","deepEqual","keysA","keysB","collectDirtyPaths","initial","prefix","result","allKeys","k","p","PATH_CACHE_MAX","pathCache","getPathKeys","path","cached","keys","getDeepValue","current","setDeepValue","value","i","nextKey","nextAsNumber","isNextNumeric","currentValue","setDeepValues","updates","root","clonedNodes","cleanPrefixedKeys","newObj","prefixWithDot","reindexFieldArrayMeta","state","path","remapIndex","nextErrors","nextTouched","nextIsValidating","prefix","key","nextKey","remapIndexedPath","parts","currentIdx","nextIdx","rest","isValidationErrorShape","x","obj","v","extractServerErrors","rootGlobal","id","state","fn","bitBus","defaultIdFactory","normalizeConfig","config","rawInitial","validation","history","defaultPersistKey","persist","raw","deepClone","BitDependencyManager","path","callback","config","currentValues","dependsOn","dep","requiredDependsOn","values","cache","result","errors","val","getDeepValue","changedPath","newValues","toggledFields","queue","visited","currentPath","dependents","depPath","wasHidden","isHiddenNow","requiredPaths","dependentsSet","prefix","removedEntries","showIf","value","BitComputedManager","_BitComputedManager","getComputedEntries","entries","map","entry","dependencies","dep","dependents","childIdx","segments","len","prefix","children","values","changedPaths","computedEntries","resolution","entriesToRun","nextValues","maxPasses","i","hasUpdates","newValue","trackedDependencies","currentValue","getDeepValue","deepEqual","setDeepValue","previousDeps","allDepsKnown","e","reverseDependencies","shouldTrackDependencies","affectedPaths","queue","currentPath","dependentPath","affectedEntries","entryByPath","inDegree","dependencyPath","nextDependents","orderedPaths","nextDegree","path","changedPath","collect","listeners","parentSegments","childKeys","childDep","knownDependencies","trackedValues","createProxy","value","target","key","nextPath","nextValue","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","BitSubscriptionEngine","getState","listener","selector","options","equalityFn","lastSlice","subscription","nextState","nextSlice","autoTrackedPaths","scopedPaths","pathKey","indexPath","listeners","paths","changedPaths","_paths","seen","normalized","path","trimmed","trackedPaths","createTrackedProxy","value","currentPath","target","key","nextPath","nextValue","trackedState","scopedSubscribers","addByPath","changedPath","parts","cached","segments","keys","i","normalizeErrors","errors","hasUndefined","message","normalized","path","hasErrors","_path","applyStateUpdate","args","currentState","partialState","changedPaths","applyComputedValues","nextState","valuesChanged","explicitChangedPaths","inferredChangedPaths","inferChangedPaths","effectiveChangedPaths","mergeChangedPaths","includeValuesWildcard","pathMaps","map","merged","resolveDevToolsOptions","devTools","createDevtoolsPlugin","options","cleanup","destroyed","setupRemoteBridge","initDevTools","instance","getDefaultStorage","storageLike","key","value","BitPersistManager","config","getValues","getDirtyValues","applyRestoredValues","error","storage","payload","serialized","raw","parsed","BitPluginManager","plugins","contextFactory","plugin","maybeTeardown","error","event","hook","result","source","pluginName","context","payload","onError","index","teardown","hookName","BitStoreEffectEngine","storeId","storeInstance","persistManager","pluginManager","bitBus","nextState","valuesChanged","event","BitPipelineRunner","steps","context","step","BitSyncPipelineRunner","hasErrors","errors","_path","BitValidationManager","store","BitPipelineRunner","ctx","path","isValidating","currentState","nextValidating","activeTimer","prefix","message","newErrors","value","config","asyncValidate","existingTimer","delay","requestEpoch","currentRequestId","errorMessage","scopeFields","state","field","options","configuredDelay","f","resolvedScopeFields","context","timer","dynamicRequiredErrors","hiddenPath","BitLifecycleManager","store","BitSyncPipelineRunner","ctx","BitPipelineRunner","path","value","meta","state","context","getDeepValue","setDeepValue","newValues","origin","previousValues","clonedValues","deepClone","isDirty","values","mergedValues","deepMerge","onSuccess","error","initialCloned","hasCurrentError","depPath","hasDependencyError","currentErrors","newTouched","updates","hiddenPath","transformer","currentVal","setDeepValues","BitHistoryManager","enableHistory","maxHistory","values","currentSnapshot","deepEqual","snapshot","deepClone","capacity","nextIndex","initialValues","logicalIndex","BitArrayManager","store","path","value","arr","getDeepValue","index","state","previousArray","newArray","_","i","newValues","setDeepValue","isDirty","reindexedMeta","reindexFieldArrayMeta","currentIdx","indexA","indexB","from","to","item","BitScopeManager","getState","getInitialValues","getScopeFields","isPathDirty","scopeName","fields","state","hasErrors","f","isDirty","errors","result","field","error","BitFieldQueryManager","dependencyManager","getState","getConfig","isPathDirty","path","values","BitErrorManager","getState","internalUpdateState","path","message","newErrors","errors","serverErrors","formattedErrors","key","value","BitCapabilityRegistry","key","capability","createStoreCapabilities","args","store","dependencyManager","dirtyManager","capabilities","BitCapabilityRegistry","validationPort","partial","path","message","opts","scopeName","values","event","lifecyclePort","changedPaths","callback","changedPath","newValues","scopeFields","options","value","nextValues","baselineValues","initialValues","BitValidationManager","BitLifecycleManager","BitHistoryManager","BitArrayManager","BitScopeManager","BitFieldQueryManager","BitErrorManager","createStoreEffects","storeId","storeInstance","config","getState","getConfig","getValues","getDirtyValues","applyPersistedValues","persistManager","BitPersistManager","runtimePlugins","devtoolsPlugin","createDevtoolsPlugin","pluginManager","BitPluginManager","effects","BitStoreEffectEngine","createInitialStoreState","computedManager","deepClone","fieldConfig","BitStore","path","config","scopedPaths","nextPaths","fieldPath","entry","entryPath","key","normalizeConfig","BitDependencyManager","BitComputedManager","BitDirtyManager","createStoreCapabilities","createInitialStoreState","BitSubscriptionEngine","createStoreEffects","values","scopeName","index","cfg","list","result","maskOption","getDeepValue","newErrors","newTouched","stateChanged","prefix","listener","selector","options","equalityFn","valueEqual","mergedPaths","state","callback","deepEqual","value","meta","paths","newValues","message","errors","serverErrors","onSuccess","name","mask","error","indexA","indexB","from","to","prevState","isDirty","nextState","event","scopeFields","changedPath","nextValues","baselineValues","initialValues","partialState","changedPaths","updateResult","applyStateUpdate","pathSet","deepClone","valuesChanged","PUBLIC_API_KEYS","facadeToInternalStore","createPublicFacade","store","facade","target","prop","value","_target","isHookCompatibleStore","resolveBitStoreForHooks","internalStore","BitStore","createBitStore","config"]}
@@ -1,2 +0,0 @@
1
- function d(r,t){return r.canUndo===t.canUndo&&r.canRedo===t.canRedo&&r.historyIndex===t.historyIndex&&r.historySize===t.historySize}function a(r,t,e){return async n=>{if(n){e.setLoading(!0),e.setError(r,void 0);try{let o=await t(n);e.setValue(o.url),e.setUploadKey(o.key),e.setError(r,void 0)}catch(o){let i=o instanceof Error?o.message:"Upload failed";e.setError(r,i)}finally{e.setLoading(!1)}}}}function s(r,t,e){return async()=>{let n=e.getUploadKey();if(n&&t)try{await t(n)}catch(o){let i=o instanceof Error?o.message:"Delete failed";e.setError(r,i);return}e.setValue(null),e.setUploadKey(null),e.setError(r,void 0)}}export{d as a,a as b,s as c};
2
- //# sourceMappingURL=chunk-QWH2NBVB.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/history-status.ts","../src/core/adapters/upload-kernel.ts"],"sourcesContent":["import type { BitHistoryMetadata } from \"./store/contracts/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","/**\n * Framework-agnostic upload kernel.\n *\n * Encapsulates the side-effect logic for uploading/removing files so that\n * React, Vue, and Angular adapters share a single implementation and only\n * differ in how they wire reactive state.\n */\n\nimport type { BitUploadFn, BitDeleteUploadFn } from \"../types/upload\";\n\nexport interface UploadKernelCallbacks {\n /** Called with `true` when upload starts and `false` when it finishes. */\n setLoading: (loading: boolean) => void;\n /** Set or clear a field-level error message. */\n setError: (path: string, message: string | undefined) => void;\n /** Set the stored file URL after a successful upload (or `null` on remove). */\n setValue: (value: string | null) => void;\n /** Return the key of the last uploaded file (used when deleting). */\n getUploadKey: () => string | null;\n /** Persist the upload key returned by the upload function. */\n setUploadKey: (key: string | null) => void;\n}\n\n/**\n * Creates a type-safe `upload` handler for a field.\n *\n * @example\n * ```ts\n * const upload = createUploadHandler(\"avatar\", myUploadFn, {\n * setLoading: (v) => (isUploading.value = v),\n * setError: (p, m) => store.setError(p, m),\n * setValue: (v) => field.setValue(v),\n * getUploadKey: () => uploadKey,\n * setUploadKey: (k) => (uploadKey = k),\n * });\n * ```\n */\nexport function createUploadHandler(\n fieldPath: string,\n uploadFn: BitUploadFn,\n callbacks: UploadKernelCallbacks,\n): (file: File | null | undefined) => Promise<void> {\n return async (file) => {\n if (!file) return;\n\n callbacks.setLoading(true);\n callbacks.setError(fieldPath, undefined);\n\n try {\n const result = await uploadFn(file);\n\n callbacks.setValue(result.url);\n callbacks.setUploadKey(result.key);\n callbacks.setError(fieldPath, undefined);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Upload failed\";\n callbacks.setError(fieldPath, message);\n } finally {\n callbacks.setLoading(false);\n }\n };\n}\n\n/**\n * Creates a type-safe `remove` handler for a field.\n */\nexport function createRemoveHandler(\n fieldPath: string,\n deleteFile: BitDeleteUploadFn | undefined,\n callbacks: UploadKernelCallbacks,\n): () => Promise<void> {\n return async () => {\n const uploadKey = callbacks.getUploadKey();\n\n if (uploadKey && deleteFile) {\n try {\n await deleteFile(uploadKey);\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Delete failed\";\n callbacks.setError(fieldPath, message);\n return;\n }\n }\n\n callbacks.setValue(null);\n callbacks.setUploadKey(null);\n callbacks.setError(fieldPath, undefined);\n };\n}\n"],"mappings":"AAgBO,SAASA,EAAmBC,EAAgBC,EAAyB,CAC1E,OACED,EAAE,UAAYC,EAAE,SAChBD,EAAE,UAAYC,EAAE,SAChBD,EAAE,eAAiBC,EAAE,cACrBD,EAAE,cAAgBC,EAAE,WAExB,CCcO,SAASC,EACdC,EACAC,EACAC,EACkD,CAClD,MAAO,OAAOC,GAAS,CACrB,GAAKA,EAEL,CAAAD,EAAU,WAAW,EAAI,EACzBA,EAAU,SAASF,EAAW,MAAS,EAEvC,GAAI,CACF,IAAMI,EAAS,MAAMH,EAASE,CAAI,EAElCD,EAAU,SAASE,EAAO,GAAG,EAC7BF,EAAU,aAAaE,EAAO,GAAG,EACjCF,EAAU,SAASF,EAAW,MAAS,CACzC,OAASK,EAAO,CACd,IAAMC,EAAUD,aAAiB,MAAQA,EAAM,QAAU,gBACzDH,EAAU,SAASF,EAAWM,CAAO,CACvC,QAAE,CACAJ,EAAU,WAAW,EAAK,CAC5B,EACF,CACF,CAKO,SAASK,EACdP,EACAQ,EACAN,EACqB,CACrB,MAAO,UAAY,CACjB,IAAMO,EAAYP,EAAU,aAAa,EAEzC,GAAIO,GAAaD,EACf,GAAI,CACF,MAAMA,EAAWC,CAAS,CAC5B,OAASJ,EAAO,CACd,IAAMC,EACJD,aAAiB,MAAQA,EAAM,QAAU,gBAC3CH,EAAU,SAASF,EAAWM,CAAO,EACrC,MACF,CAGFJ,EAAU,SAAS,IAAI,EACvBA,EAAU,aAAa,IAAI,EAC3BA,EAAU,SAASF,EAAW,MAAS,CACzC,CACF","names":["isHistoryMetaEqual","a","b","createUploadHandler","fieldPath","uploadFn","callbacks","file","result","error","message","createRemoveHandler","deleteFile","uploadKey"]}
@@ -1,2 +0,0 @@
1
- import{a as A,b as C,c as H,e as v,f as T}from"./chunk-2CVKNPWX.js";import{c as w,e as V,k as M}from"./chunk-PX6WKENM.js";import{createContext as L,useContext as W}from"react";import{jsx as O}from"react/jsx-runtime";var q=L(null),lt=({store:t,children:e})=>O(q.Provider,{value:M(t),children:e}),S=()=>{let t=W(q);if(!t)throw new Error("BitForm hooks devem ser usados dentro de um BitFormProvider");return t};import{useCallback as b,useSyncExternalStore as $,useMemo as D,useRef as z,useState as j}from"react";var G=t=>({isValid:t.isValid,isDirty:t.isDirty,isSubmitting:t.isSubmitting});function bt(){let t=S(),[e,o]=j(null),[s,n]=j(null),c=z(null),l=b(()=>{let p=t.getState(),P={isValid:p.isValid,isDirty:p.isDirty,isSubmitting:p.isSubmitting};return c.current&&c.current.isValid===P.isValid&&c.current.isDirty===P.isDirty&&c.current.isSubmitting===P.isSubmitting?c.current:(c.current=P,P)},[t]),d=b(p=>t.subscribeSelector(G,()=>p(),{paths:["isValid","isDirty","isSubmitting"]}),[t]),i=$(d,l,l),r=D(()=>C(t,{clearSubmissionState:()=>{o(null),n(null)},setSubmissionResult:p=>{n(p)},setSubmissionError:p=>{o(p)}}),[t]),u=D(()=>A(t),[t]),a=b(r.submit,[r]),y=b(r.onSubmit,[r]),h=b(r.reset,[r]),B=b(r.getValues,[r]),E=b(r.getErrors,[r]),m=b(r.getTouched,[r]),g=b(r.getDirtyValues,[r]);return{meta:D(()=>({...i,submitError:e,lastResponse:s}),[i,e,s]),getValues:B,getErrors:E,getTouched:m,getDirtyValues:g,submit:a,onSubmit:y,reset:h,...u}}import{useCallback as I,useSyncExternalStore as J,useRef as K,useMemo as U}from"react";function Tt(t){let e=S(),o=I(r=>e.config.idFactory({scope:"array",path:t,index:r}),[e,t]),s=K([]),n=I(()=>{let r=e.getState(),u=V(r.values,t),a=Array.isArray(u)?u:[];if(a.length!==s.current.length)if(a.length>s.current.length){let y=a.length-s.current.length;s.current=[...s.current,...Array(y).fill(null).map((h,B)=>o(s.current.length+B))]}else s.current=s.current.slice(0,a.length);return a},[e,t,o]),c=I(r=>e.subscribePath(t,()=>r()),[e,t]),l=J(c,n,n),d=U(()=>({append:r=>{s.current=[...s.current,o(s.current.length)],e.pushItem(t,r)},prepend:r=>{s.current=[o(0),...s.current],e.prependItem(t,r)},insert:(r,u)=>{let a=[...s.current];a.splice(r,0,o(r)),s.current=a,e.insertItem(t,r,u)},remove:r=>{s.current=s.current.filter((u,a)=>a!==r),e.removeItem(t,r)},move:(r,u)=>{let a=[...s.current],[y]=a.splice(r,1);a.splice(u,0,y),s.current=a,e.moveItem(t,r,u)},swap:(r,u)=>{let a=[...s.current];[a[r],a[u]]=[a[u],a[r]],s.current=a,e.swapItems(t,r,u)},replace:r=>{s.current=r.map((u,a)=>o(a)),e.setField(t,r)},clear:()=>{s.current=[],e.setField(t,[])}}),[e,t,o]);return{fields:U(()=>l.map((r,u)=>({key:s.current[u]||`temp-${u}`,value:r,index:u})),[l]),length:l.length,...d}}import{useCallback as R,useSyncExternalStore as Q,useRef as X}from"react";function It(t){let e=S(),o=e.getScopeFields(t),s=X(null),n=R(()=>{let r=e.getStepStatus(t);return s.current&&v(s.current,r)?s.current:(s.current=r,r)},[e,t]),c=R(r=>e.subscribeSelector(u=>({errors:u.errors,isDirty:u.isDirty}),()=>r(),{paths:T(o)}),[e,o]),l=Q(c,n,n),d=R(async()=>{let r=await e.validate({scope:t}),u=e.getStepErrors(t);return{valid:r,errors:u}},[e,t]),i=R(()=>e.getStepErrors(t),[e,t]);return{scopeName:t,status:l,errors:l.errors,validate:d,getErrors:i,isValid:!l.hasErrors,isDirty:l.isDirty}}import{useCallback as f,useSyncExternalStore as Y,useRef as Z,useState as N}from"react";function Ct(t){let e=S(),[o,s]=N(0),n=t[o]??"",c=e.getScopeFields(n),l=Z(null),d=f(()=>{let m=e.getStepStatus(n);return l.current&&v(l.current,m)?l.current:(l.current=m,m)},[e,n]),i=Y(f(m=>e.subscribeSelector(g=>({errors:g.errors,isDirty:g.isDirty}),()=>m(),{paths:T(c)}),[e,c]),d,d),r=f(async()=>{let m=await e.validate({scope:n}),g=e.getStepErrors(n);return{valid:m,errors:g}},[e,n]),u=f(()=>e.getStepErrors(n),[e,n]),a=f(async()=>{let m=e.getScopeFields(n);if(e.hasValidationsInProgress(m))return!1;let g=await e.validate({scope:n});if(g)s(F=>Math.min(F+1,t.length-1));else{let F=e.getStepErrors(n),p=Object.keys(F);p.length>0&&e.markFieldsTouched(p)}return g},[e,n,t.length]),y=f(()=>{s(m=>Math.max(m-1,0))},[]),h=f(m=>{s(Math.max(0,Math.min(m-1,t.length-1)))},[t.length]),B=o===0,E=o>=t.length-1;return{step:o+1,stepIndex:o,scope:n,next:a,prev:y,goTo:h,isFirst:B,isLast:E,status:i,errors:i.errors,isValid:!i.hasErrors,isDirty:i.isDirty,validate:r,getErrors:u}}import{useCallback as _,useSyncExternalStore as tt,useRef as et}from"react";function Wt(t){let e=S(),o=et(null),s=_(()=>{let c=V(e.getState().values,t);return o.current!==null&&w(o.current,c)?o.current:(o.current=c,c)},[e,t]),n=_(c=>e.subscribePath(t,()=>c()),[e,t]);return tt(n,s,s)}import{useCallback as k,useMemo as rt,useSyncExternalStore as st}from"react";function Gt(){let t=S(),e=st(l=>t.subscribeSelector(d=>d.persist,()=>l(),{paths:["persist"]}),()=>t.getPersistMetadata(),()=>t.getPersistMetadata()),o=k(async()=>t.restorePersisted(),[t]),s=k(async()=>{await t.forceSave()},[t]),n=k(async()=>{await t.clearPersisted()},[t]),c=rt(()=>({isSaving:e.isSaving,isRestoring:e.isRestoring,error:e.error}),[e]);return{restore:o,save:s,clear:n,meta:c}}import{useCallback as x,useSyncExternalStore as ot,useRef as it,useEffect as nt}from"react";function Yt(t){let e=S(),o=it(null);nt(()=>()=>{e.unregisterField&&e.unregisterField(t)},[e,t]);let s=x(()=>{let i=e.getFieldState(t);if(o.current&&o.current.value===i.value&&o.current.error===i.error&&o.current.touched===i.touched&&o.current.isHidden===i.isHidden&&o.current.isRequired===i.isRequired&&o.current.isDirty===i.isDirty&&o.current.isValidating===i.isValidating)return o.current;let r={value:i.value,error:i.error,touched:i.touched,isHidden:i.isHidden,isRequired:i.isRequired,isDirty:i.isDirty,isValidating:i.isValidating};return o.current=r,r},[e,t]),n=x(i=>H(e,t,()=>i()),[e,t]),c=ot(n,s,s),l=x(i=>e.setField(t,i),[e,t]),d=x(()=>e.blurField(t),[e,t]);return{fieldState:c,setValue:l,setBlur:d,store:e}}export{lt as a,S as b,bt as c,Yt as d,Tt as e,It as f,Ct as g,Wt as h,Gt as i};
2
- //# sourceMappingURL=chunk-T3FR7D5V.js.map