@lehnihon/bit-form 2.2.6 → 2.2.8

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 (177) 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 +20 -20
  5. package/dist/angular/index.d.ts +20 -20
  6. package/dist/angular/index.js +1 -1
  7. package/dist/angular/index.js.map +1 -1
  8. package/dist/array-controller-B5bfXV1W.d.cts +23 -0
  9. package/dist/array-controller-Cx-DMH7Y.d.ts +23 -0
  10. package/dist/bus-B2VEKrPI.d.ts +19 -0
  11. package/dist/bus-ZLQeq4Vr.d.cts +19 -0
  12. package/dist/chunk-5NA2TFPG.js +1 -0
  13. package/dist/chunk-5NA2TFPG.js.map +1 -0
  14. package/dist/chunk-63OJBMKK.js +2 -0
  15. package/dist/chunk-63OJBMKK.js.map +1 -0
  16. package/dist/chunk-BSGJ3T5S.cjs +2 -0
  17. package/dist/chunk-BSGJ3T5S.cjs.map +1 -0
  18. package/dist/chunk-CPP7ELA5.js +2 -0
  19. package/dist/chunk-CPP7ELA5.js.map +1 -0
  20. package/dist/chunk-D7JQWF6V.cjs +2 -0
  21. package/dist/chunk-D7JQWF6V.cjs.map +1 -0
  22. package/dist/chunk-E2NZR44P.js +2 -0
  23. package/dist/chunk-E2NZR44P.js.map +1 -0
  24. package/dist/chunk-EQ55DKX2.js +2 -0
  25. package/dist/chunk-EQ55DKX2.js.map +1 -0
  26. package/dist/chunk-IV32WXCF.cjs +2 -0
  27. package/dist/chunk-IV32WXCF.cjs.map +1 -0
  28. package/dist/chunk-JC4R5WCC.js +2 -0
  29. package/dist/chunk-JC4R5WCC.js.map +1 -0
  30. package/dist/chunk-K5X37E3U.js +2 -0
  31. package/dist/chunk-K5X37E3U.js.map +1 -0
  32. package/dist/chunk-M6WBNHIT.cjs +2 -0
  33. package/dist/chunk-M6WBNHIT.cjs.map +1 -0
  34. package/dist/chunk-MFSQATNZ.cjs +2 -0
  35. package/dist/chunk-MFSQATNZ.cjs.map +1 -0
  36. package/dist/chunk-MFTWAFMG.cjs +2 -0
  37. package/dist/chunk-MFTWAFMG.cjs.map +1 -0
  38. package/dist/chunk-O5UPA33R.js +2 -0
  39. package/dist/chunk-O5UPA33R.js.map +1 -0
  40. package/dist/chunk-P2YWYBWG.cjs +2 -0
  41. package/dist/chunk-P2YWYBWG.cjs.map +1 -0
  42. package/dist/chunk-QKGTVKBU.cjs +2 -0
  43. package/dist/chunk-QKGTVKBU.cjs.map +1 -0
  44. package/dist/chunk-RD73EBSN.js +2 -0
  45. package/dist/chunk-RD73EBSN.js.map +1 -0
  46. package/dist/chunk-T2JRSWQU.cjs +2 -0
  47. package/dist/chunk-T2JRSWQU.cjs.map +1 -0
  48. package/dist/chunk-UQ3DSUWC.js +2 -0
  49. package/dist/chunk-UQ3DSUWC.js.map +1 -0
  50. package/dist/chunk-VZHG372Q.cjs +2 -0
  51. package/dist/chunk-VZHG372Q.cjs.map +1 -0
  52. package/dist/chunk-W2E5UIXT.js +2 -0
  53. package/dist/chunk-W2E5UIXT.js.map +1 -0
  54. package/dist/chunk-W5CLDRRE.cjs +1 -0
  55. package/dist/chunk-W5CLDRRE.cjs.map +1 -0
  56. package/dist/cli/index.cjs +22 -22
  57. package/dist/core/bindings.cjs +2 -0
  58. package/dist/core/bindings.cjs.map +1 -0
  59. package/dist/core/bindings.d.cts +81 -0
  60. package/dist/core/bindings.d.ts +81 -0
  61. package/dist/core/bindings.js +2 -0
  62. package/dist/core/bindings.js.map +1 -0
  63. package/dist/core/status.cjs +2 -0
  64. package/dist/core/status.cjs.map +1 -0
  65. package/dist/core/status.d.cts +44 -0
  66. package/dist/core/status.d.ts +44 -0
  67. package/dist/core/status.js +2 -0
  68. package/dist/core/status.js.map +1 -0
  69. package/dist/core/store.cjs +2 -0
  70. package/dist/core/store.cjs.map +1 -0
  71. package/dist/core/store.d.cts +84 -0
  72. package/dist/core/store.d.ts +84 -0
  73. package/dist/core/store.js +2 -0
  74. package/dist/core/store.js.map +1 -0
  75. package/dist/core/utils.cjs +2 -0
  76. package/dist/core/utils.cjs.map +1 -0
  77. package/dist/core/utils.d.cts +81 -0
  78. package/dist/core/utils.d.ts +81 -0
  79. package/dist/core/utils.js +2 -0
  80. package/dist/core/utils.js.map +1 -0
  81. package/dist/core.cjs +2 -0
  82. package/dist/core.cjs.map +1 -0
  83. package/dist/core.d.cts +14 -0
  84. package/dist/core.d.ts +14 -0
  85. package/dist/core.js +2 -0
  86. package/dist/core.js.map +1 -0
  87. package/dist/devtools/bridge.cjs +1 -1
  88. package/dist/devtools/bridge.cjs.map +1 -1
  89. package/dist/devtools/bridge.d.cts +5 -1
  90. package/dist/devtools/bridge.d.ts +5 -1
  91. package/dist/devtools/bridge.js +1 -1
  92. package/dist/devtools/bridge.js.map +1 -1
  93. package/dist/devtools/index.cjs +18 -18
  94. package/dist/devtools/index.cjs.map +1 -1
  95. package/dist/devtools/index.d.cts +27 -2
  96. package/dist/devtools/index.d.ts +27 -2
  97. package/dist/devtools/index.js +18 -18
  98. package/dist/devtools/index.js.map +1 -1
  99. package/dist/devtools/protocol.cjs +2 -0
  100. package/dist/devtools/protocol.cjs.map +1 -0
  101. package/dist/devtools/protocol.d.cts +54 -0
  102. package/dist/devtools/protocol.d.ts +54 -0
  103. package/dist/devtools/protocol.js +2 -0
  104. package/dist/devtools/protocol.js.map +1 -0
  105. package/dist/field-binding-B_OX3bjp.d.cts +25 -0
  106. package/dist/field-binding-MX6jVQbT.d.ts +25 -0
  107. package/dist/index.cjs +1 -1
  108. package/dist/index.cjs.map +1 -1
  109. package/dist/index.d.cts +9 -193
  110. package/dist/index.d.ts +9 -193
  111. package/dist/index.js +1 -1
  112. package/dist/meta-types-Bzmm21TP.d.cts +18 -0
  113. package/dist/meta-types-Bzmm21TP.d.ts +18 -0
  114. package/dist/react/index.cjs +1 -1
  115. package/dist/react/index.cjs.map +1 -1
  116. package/dist/react/index.d.cts +10 -7
  117. package/dist/react/index.d.ts +10 -7
  118. package/dist/react/index.js +1 -1
  119. package/dist/react/index.js.map +1 -1
  120. package/dist/react-native/index.cjs +1 -1
  121. package/dist/react-native/index.cjs.map +1 -1
  122. package/dist/react-native/index.d.cts +8 -5
  123. package/dist/react-native/index.d.ts +8 -5
  124. package/dist/react-native/index.js +1 -1
  125. package/dist/react-native/index.js.map +1 -1
  126. package/dist/resolvers/index.cjs +1 -1
  127. package/dist/resolvers/index.cjs.map +1 -1
  128. package/dist/resolvers/index.d.cts +2 -1
  129. package/dist/resolvers/index.d.ts +2 -1
  130. package/dist/resolvers/index.js +1 -1
  131. package/dist/resolvers/joi.d.cts +2 -1
  132. package/dist/resolvers/joi.d.ts +2 -1
  133. package/dist/resolvers/yup.d.cts +2 -1
  134. package/dist/resolvers/yup.d.ts +2 -1
  135. package/dist/resolvers/zod.d.cts +2 -1
  136. package/dist/resolvers/zod.d.ts +2 -1
  137. package/dist/store-api-types-D-ZHxzRy.d.cts +161 -0
  138. package/dist/store-api-types-DPi30jQF.d.ts +161 -0
  139. package/dist/{bus-B4zZmB9C.d.ts → types-CG5nYeRk.d.ts} +140 -41
  140. package/dist/{bus-BeAeZwWu.d.cts → types-D6LhF5GC.d.cts} +140 -41
  141. package/dist/{upload-EXnJLq8k.d.cts → upload-C2mpfhp1.d.cts} +1 -1
  142. package/dist/{upload-EXnJLq8k.d.ts → upload-C2mpfhp1.d.ts} +1 -1
  143. package/dist/{use-bit-persist-Dk3fUrds.d.ts → use-bit-persist-BTwy8kvA.d.ts} +14 -14
  144. package/dist/{use-bit-persist-D_gimC9A.d.cts → use-bit-persist-C2LHNTVv.d.cts} +14 -14
  145. package/dist/utils.cjs +2 -0
  146. package/dist/utils.cjs.map +1 -0
  147. package/dist/utils.d.cts +6 -0
  148. package/dist/utils.d.ts +6 -0
  149. package/dist/utils.js +2 -0
  150. package/dist/utils.js.map +1 -0
  151. package/dist/vue/index.cjs +1 -1
  152. package/dist/vue/index.cjs.map +1 -1
  153. package/dist/vue/index.d.cts +17 -18
  154. package/dist/vue/index.d.ts +17 -18
  155. package/dist/vue/index.js +1 -1
  156. package/dist/vue/index.js.map +1 -1
  157. package/package.json +48 -17
  158. package/dist/chunk-2CVKNPWX.js +0 -2
  159. package/dist/chunk-2CVKNPWX.js.map +0 -1
  160. package/dist/chunk-3EDD3V43.cjs +0 -2
  161. package/dist/chunk-3EDD3V43.cjs.map +0 -1
  162. package/dist/chunk-PX6WKENM.js +0 -2
  163. package/dist/chunk-PX6WKENM.js.map +0 -1
  164. package/dist/chunk-QWH2NBVB.js +0 -2
  165. package/dist/chunk-QWH2NBVB.js.map +0 -1
  166. package/dist/chunk-T3FR7D5V.js +0 -2
  167. package/dist/chunk-T3FR7D5V.js.map +0 -1
  168. package/dist/chunk-VQ7MK5VB.cjs +0 -2
  169. package/dist/chunk-VQ7MK5VB.cjs.map +0 -1
  170. package/dist/chunk-Y2ONHDRE.cjs +0 -2
  171. package/dist/chunk-Y2ONHDRE.cjs.map +0 -1
  172. package/dist/chunk-YCSWULEN.cjs +0 -2
  173. package/dist/chunk-YCSWULEN.cjs.map +0 -1
  174. package/dist/field-binding-BXw0Ku2c.d.cts +0 -12
  175. package/dist/field-binding-BXw0Ku2c.d.ts +0 -12
  176. package/dist/public-types-Cd9ai20P.d.cts +0 -97
  177. package/dist/public-types-DdZxD6Op.d.ts +0 -97
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/angular/provider.ts","../../src/angular/inject-bit-form.ts","../../src/angular/inject-bit-field.ts","../../src/angular/inject-bit-array.ts","../../src/angular/inject-bit-history.ts","../../src/angular/inject-bit-scope.ts","../../src/angular/inject-bit-steps.ts","../../src/angular/inject-bit-watch.ts","../../src/angular/inject-bit-upload.ts","../../src/angular/inject-bit-persist.ts"],"sourcesContent":["import { inject, InjectionToken, Provider } from \"@angular/core\";\nimport type { BitStoreApi, BitStoreHooksApi } from \"../core\";\nimport { resolveBitStoreForHooks } from \"../core\";\n\nexport const BIT_STORE_TOKEN = new InjectionToken<BitStoreHooksApi<any>>(\n \"BIT_STORE\",\n);\n\nexport function provideBitStore<T extends object>(\n store: BitStoreApi<T>,\n): Provider {\n return { provide: BIT_STORE_TOKEN, useValue: resolveBitStoreForHooks(store) };\n}\n\nexport function useBitStore<T extends object>() {\n const store = inject(BIT_STORE_TOKEN, { optional: true });\n\n if (!store) {\n throw new Error(\n \"BitForm: Não foi possível encontrar a BitStore. \" +\n 'Certifique-se de que você adicionou \"provideBitStore(store)\" nos providers do seu componente.',\n );\n }\n\n return store as BitStoreHooksApi<T>;\n}\n","import { signal, computed, inject, DestroyRef } from \"@angular/core\";\nimport { useBitStore } from \"./provider\";\nimport {\n createFormController,\n createStoreFormActions,\n} from \"../core/form-controller\";\nimport type { InjectBitFormResult } from \"./types\";\n\nexport function injectBitForm<T extends object>(): InjectBitFormResult<T> {\n const store = useBitStore<T>();\n const destroyRef = inject(DestroyRef);\n const stateSignal = signal({\n isValid: store.getState().isValid,\n isSubmitting: store.getState().isSubmitting,\n isDirty: store.getState().isDirty,\n });\n const submitError = signal<Error | null>(null);\n const lastResponse = signal<unknown>(null);\n\n const sub = store.subscribeSelector(\n (state) => ({\n isValid: state.isValid,\n isSubmitting: state.isSubmitting,\n isDirty: state.isDirty,\n }),\n (nextState) => {\n stateSignal.set(nextState);\n },\n { paths: [\"isValid\", \"isSubmitting\", \"isDirty\"] },\n );\n\n destroyRef.onDestroy(() => sub());\n\n const isValid = computed(() => stateSignal().isValid);\n const isSubmitting = computed(() => stateSignal().isSubmitting);\n const isDirty = computed(() => stateSignal().isDirty);\n\n const controller = createFormController(\n store,\n {\n clearSubmissionState: () => {\n submitError.set(null);\n lastResponse.set(null);\n },\n setSubmissionResult: (result) => {\n lastResponse.set(result);\n },\n setSubmissionError: (error) => {\n submitError.set(error);\n },\n },\n { stopPropagation: true },\n );\n const actions = createStoreFormActions(store);\n\n const meta = {\n isValid,\n isDirty,\n isSubmitting,\n submitError: submitError.asReadonly(),\n lastResponse: lastResponse.asReadonly(),\n };\n\n return {\n // Metadata (grouped)\n meta,\n // Getters\n getValues: controller.getValues,\n getErrors: controller.getErrors,\n getTouched: controller.getTouched,\n getDirtyValues: controller.getDirtyValues,\n // Main actions (frequent use - flat)\n submit: controller.submit,\n onSubmit: controller.onSubmit,\n reset: controller.reset,\n ...actions,\n };\n}\n","import { inject, DestroyRef, computed, signal } from \"@angular/core\";\nimport { BIT_STORE_TOKEN } from \"./provider\";\nimport { BitPath, BitPathValue } from \"../core\";\nimport {\n createMaskedFieldController,\n subscribeFieldState,\n} from \"../core/field-controller\";\nimport { isBitFieldInputEventObject } from \"../core/mask/field-binding\";\nimport type {\n BitFieldInputEvent,\n InjectBitFieldMeta,\n InjectBitFieldResult,\n} from \"./types\";\n\nexport function injectBitField<\n TValue = any,\n TForm extends object = any,\n P extends BitPath<TForm> = BitPath<TForm>,\n>(path: P): InjectBitFieldResult<TForm, P> {\n const store = inject(BIT_STORE_TOKEN);\n\n const stateSignal = signal(store.getFieldState(path));\n\n const unsubscribe = subscribeFieldState(store, path, (nextState) => {\n stateSignal.set(nextState);\n });\n\n inject(DestroyRef).onDestroy(() => {\n unsubscribe();\n if (store.unregisterField) {\n store.unregisterField(path as string);\n }\n });\n\n const value = computed(() => stateSignal().value as BitPathValue<TForm, P>);\n const rawError = computed(() => stateSignal().error);\n const touched = computed(() => stateSignal().touched);\n const error = computed(() => (touched() ? rawError() : undefined));\n\n const isDirty = computed(() => stateSignal().isDirty);\n\n const isValidating = computed(() => stateSignal().isValidating);\n\n const isHidden = computed(() => stateSignal().isHidden);\n\n const isRequired = computed(() => stateSignal().isRequired);\n\n const invalid = computed(() => touched() && !!rawError());\n\n const resolvedMask = store.resolveMask(path as string);\n const fieldController = createMaskedFieldController(\n store,\n path,\n resolvedMask,\n );\n\n const displayValue = computed(() => fieldController.displayValue(value()));\n\n const setValue = (\n val: BitPathValue<TForm, P> | string | number | null | undefined,\n ) => {\n fieldController.setValue(val);\n };\n\n const setBlur = () => fieldController.setBlur();\n\n const hasError = computed(() => !!rawError());\n\n const update = (e: BitFieldInputEvent) =>\n setValue(isBitFieldInputEventObject(e) ? (e.target?.value ?? null) : e);\n\n return {\n // Main handlers and values (flat)\n value,\n displayValue,\n setValue,\n setBlur,\n update,\n // Metadata (grouped)\n meta: {\n error,\n touched,\n invalid,\n isDirty,\n isValidating,\n isHidden,\n isRequired,\n hasError,\n },\n };\n}\n","import { DestroyRef, signal, computed, inject, untracked } from \"@angular/core\";\nimport { BIT_STORE_TOKEN } from \"./provider\";\nimport {\n getDeepValue,\n BitArrayPath,\n BitPathValue,\n BitArrayItem,\n BitPath,\n} from \"../core\";\n\nexport function injectBitArray<\n TForm extends object = any,\n P extends BitArrayPath<TForm> = BitArrayPath<TForm>,\n>(path: P) {\n const store = inject(BIT_STORE_TOKEN);\n const destroyRef = inject(DestroyRef);\n\n const createId = (index?: number) =>\n store.config.idFactory({\n scope: \"array\",\n path: path as string,\n index,\n });\n\n const getRaw = () => {\n const val = getDeepValue(\n store.getState().values,\n path as string,\n ) as BitPathValue<TForm, P>;\n return Array.isArray(val)\n ? (val as BitArrayItem<BitPathValue<TForm, P>>[])\n : [];\n };\n\n const valuesSig = signal<BitArrayItem<BitPathValue<TForm, P>>[]>(getRaw());\n const idsSig = signal<string[]>(\n valuesSig().map((_, index) => createId(index)),\n );\n\n const unsub = store.subscribePath(path, (value) => {\n const next = Array.isArray(value)\n ? (value as BitArrayItem<BitPathValue<TForm, P>>[])\n : [];\n const ids = untracked(idsSig);\n valuesSig.set(next);\n\n if (next.length !== ids.length) {\n if (next.length > ids.length) {\n idsSig.set([\n ...ids,\n ...Array.from({ length: next.length - ids.length }, (_, i) =>\n createId(ids.length + i),\n ),\n ]);\n } else {\n idsSig.set(ids.slice(0, next.length));\n }\n }\n });\n\n destroyRef.onDestroy(() => {\n unsub();\n if (store.unregisterPrefix) store.unregisterPrefix(`${path as string}.`);\n });\n\n return {\n fields: computed(() =>\n valuesSig().map((v, i) => ({\n key: idsSig()[i] || `temp-${i}`,\n value: v,\n index: i,\n })),\n ),\n length: computed(() => valuesSig().length),\n append: (v: BitArrayItem<BitPathValue<TForm, P>>) => {\n idsSig.update((ids) => [...ids, createId(ids.length)]);\n store.pushItem(path, v);\n },\n prepend: (v: BitArrayItem<BitPathValue<TForm, P>>) => {\n idsSig.update((ids) => [createId(0), ...ids]);\n store.prependItem(path, v);\n },\n remove: (i: number) => {\n idsSig.update((ids) => ids.filter((_, idx) => idx !== i));\n store.removeItem(path, i);\n },\n insert: (index: number, v: BitArrayItem<BitPathValue<TForm, P>>) => {\n idsSig.update((ids) => {\n const c = [...ids];\n c.splice(index, 0, createId(index));\n return c;\n });\n store.insertItem(path, index, v);\n },\n swap: (a: number, b: number) => {\n idsSig.update((ids) => {\n const c = [...ids];\n [c[a], c[b]] = [c[b], c[a]];\n return c;\n });\n store.swapItems(path, a, b);\n },\n move: (f: number, t: number) => {\n idsSig.update((ids) => {\n const c = [...ids];\n const [it] = c.splice(f, 1);\n c.splice(t, 0, it);\n return c;\n });\n store.moveItem(path, f, t);\n },\n replace: (items: BitArrayItem<BitPathValue<TForm, P>>[]) => {\n idsSig.set(items.map((_, index) => createId(index)));\n store.setField(\n path as unknown as BitPath<TForm>,\n items as unknown as BitPathValue<TForm, BitPath<TForm>>,\n );\n },\n clear: () => {\n idsSig.set([]);\n store.setField(\n path as unknown as BitPath<TForm>,\n [] as unknown as BitPathValue<TForm, BitPath<TForm>>,\n );\n },\n };\n}\n","import { computed, DestroyRef, inject, signal } from \"@angular/core\";\nimport { isHistoryMetaEqual } from \"../core/history-status\";\nimport { useBitStore } from \"./provider\";\nimport type { InjectBitHistoryResult } from \"./types\";\n\nexport function injectBitHistory<\n T extends object = any,\n>(): InjectBitHistoryResult {\n const store = useBitStore<T>();\n const destroyRef = inject(DestroyRef);\n\n const meta = signal(store.getHistoryMetadata());\n\n const sub = store.subscribe(() => {\n const nextMeta = store.getHistoryMetadata();\n if (!isHistoryMetaEqual(meta(), nextMeta)) {\n meta.set(nextMeta);\n }\n });\n\n destroyRef.onDestroy(() => sub());\n\n return {\n canUndo: computed(() => meta().canUndo),\n canRedo: computed(() => meta().canRedo),\n historyIndex: computed(() => meta().historyIndex),\n historySize: computed(() => meta().historySize),\n undo: () => store.undo(),\n redo: () => store.redo(),\n };\n}\n","import { signal, computed, DestroyRef, inject } from \"@angular/core\";\nimport type { ScopeStatus, ValidateScopeResult } from \"../core\";\nimport {\n getScopeSubscriptionPaths,\n isScopeStatusEqual,\n} from \"../core/scope-status\";\nimport { useBitStore } from \"./provider\";\n\nexport type { ScopeStatus, ValidateScopeResult };\n\nexport function injectBitScope(scopeName: string) {\n const store = useBitStore();\n const scopeFields = store.getScopeFields(scopeName);\n const initialStatus = store.getStepStatus(scopeName);\n\n const status = signal<ScopeStatus>(initialStatus);\n\n const unsubscribe = store.subscribeSelector(\n (state) => ({ errors: state.errors, isDirty: state.isDirty }),\n () => {\n const newStatus = store.getStepStatus(scopeName);\n const current = status();\n if (!isScopeStatusEqual(current, newStatus)) {\n status.set(newStatus);\n }\n },\n { paths: getScopeSubscriptionPaths(scopeFields) },\n );\n\n try {\n const destroyRef = inject(DestroyRef);\n destroyRef.onDestroy(() => unsubscribe());\n } catch {}\n\n const validate = async (): Promise<ValidateScopeResult> => {\n const valid = await store.validate({ scope: scopeName });\n const errors = store.getStepErrors(scopeName);\n return { valid, errors };\n };\n\n const getErrors = () => store.getStepErrors(scopeName);\n\n const isValid = computed(() => !status().hasErrors);\n const isDirty = computed(() => status().isDirty);\n const errors = computed(() => status().errors);\n\n return {\n scopeName,\n status,\n errors,\n validate,\n getErrors,\n isValid,\n isDirty,\n unsubscribe,\n };\n}\n","import { signal, computed, DestroyRef, inject } from \"@angular/core\";\nimport type { ScopeStatus, ValidateScopeResult } from \"../core\";\nimport {\n getScopeSubscriptionPaths,\n isScopeStatusEqual,\n} from \"../core/scope-status\";\nimport { useBitStore } from \"./provider\";\nimport type { InjectBitStepsResult } from \"./types\";\n\nexport function injectBitSteps(scopeNames: string[]): InjectBitStepsResult {\n const store = useBitStore();\n const stepIndex = signal(0);\n\n const scope = computed(() => scopeNames[stepIndex()] ?? \"\");\n\n const getCurrentScope = () => scopeNames[stepIndex()] ?? \"\";\n const status = signal<ScopeStatus>(store.getStepStatus(getCurrentScope()));\n\n const updateStatus = () => {\n const scopeName = getCurrentScope();\n const newStatus = store.getStepStatus(scopeName);\n const current = status();\n if (!isScopeStatusEqual(current, newStatus)) {\n status.set(newStatus);\n }\n };\n\n const unsubscribe = store.subscribeSelector(\n (state) => ({ errors: state.errors, isDirty: state.isDirty }),\n updateStatus,\n {\n paths: getScopeSubscriptionPaths(store.getScopeFields(getCurrentScope())),\n },\n );\n\n try {\n const destroyRef = inject(DestroyRef);\n destroyRef.onDestroy(() => unsubscribe());\n } catch {}\n\n const validate = async (): Promise<ValidateScopeResult> => {\n const scopeName = getCurrentScope();\n const valid = await store.validate({ scope: scopeName });\n const errors = store.getStepErrors(scopeName);\n return { valid, errors };\n };\n\n const getErrors = () => store.getStepErrors(getCurrentScope());\n\n const next = async (): Promise<boolean> => {\n const scopeName = getCurrentScope();\n\n const scopeFields = store.getScopeFields(scopeName);\n if (store.hasValidationsInProgress(scopeFields)) {\n return false;\n }\n\n const valid = await store.validate({ scope: scopeName });\n if (valid) {\n const newIndex = Math.min(stepIndex() + 1, scopeNames.length - 1);\n stepIndex.set(newIndex);\n status.set(store.getStepStatus(scopeNames[newIndex] ?? \"\"));\n } else {\n const errors = store.getStepErrors(scopeName);\n const pathsWithErrors = Object.keys(errors);\n if (pathsWithErrors.length > 0) {\n store.markFieldsTouched(pathsWithErrors);\n }\n }\n return valid;\n };\n\n const prev = () => {\n const newIndex = Math.max(stepIndex() - 1, 0);\n stepIndex.set(newIndex);\n status.set(store.getStepStatus(scopeNames[newIndex] ?? \"\"));\n };\n\n const goTo = (targetStep: number) => {\n const newIndex = Math.max(\n 0,\n Math.min(targetStep - 1, scopeNames.length - 1),\n );\n stepIndex.set(newIndex);\n status.set(store.getStepStatus(scopeNames[newIndex] ?? \"\"));\n };\n\n const step = computed(() => stepIndex() + 1);\n const isFirst = computed(() => stepIndex() === 0);\n const isLast = computed(() => stepIndex() >= scopeNames.length - 1);\n const isValid = computed(() => !status().hasErrors);\n const isDirty = computed(() => status().isDirty);\n const errors = computed(() => status().errors);\n\n return {\n step,\n stepIndex,\n scope,\n next,\n prev,\n goTo,\n isFirst,\n isLast,\n status,\n errors,\n isValid,\n isDirty,\n validate,\n getErrors,\n };\n}\n","import { DestroyRef, signal, Signal, inject } from \"@angular/core\";\nimport { useBitStore } from \"./provider\";\nimport {\n getDeepValue,\n deepEqual,\n BitPath,\n BitPathValue,\n} from \"../core\";\n\nexport function injectBitWatch<\n TForm extends object = any,\n P extends BitPath<TForm> = BitPath<TForm>,\n>(path: P): Signal<BitPathValue<TForm, P>> {\n const store = useBitStore<TForm>();\n const destroyRef = inject(DestroyRef);\n const valueSig = signal<BitPathValue<TForm, P>>(\n getDeepValue(store.getState().values, path as string) as BitPathValue<\n TForm,\n P\n >,\n { equal: deepEqual },\n );\n\n const unsub = store.watch(path, (v) => {\n valueSig.set(v as BitPathValue<TForm, P>);\n });\n\n destroyRef.onDestroy(unsub);\n\n return valueSig.asReadonly();\n}\n","/**\n * Angular Dependency Injection for File Upload\n *\n * Minimal upload API integrated with global field validation lifecycle.\n */\n\nimport { computed, inject, signal } from \"@angular/core\";\nimport { BIT_STORE_TOKEN } from \"./provider\";\nimport { injectBitField } from \"./inject-bit-field\";\nimport { BitUploadFn, BitDeleteUploadFn } from \"../core\";\nimport { createUploadHandler, createRemoveHandler } from \"../core/adapters\";\nimport type { InjectBitUploadResult } from \"./types\";\n\nexport function injectBitUpload(\n fieldPath: string,\n uploadFn: BitUploadFn,\n deleteFile?: BitDeleteUploadFn,\n): InjectBitUploadResult {\n const store = inject(BIT_STORE_TOKEN);\n const field = injectBitField(fieldPath);\n let uploadKey: string | null = null;\n const isUploading = signal(false);\n\n const kernelCallbacks = {\n setLoading: (val: boolean) => isUploading.set(val),\n setError: (path: string, msg: string | undefined) =>\n store.setError(path, msg),\n setValue: (val: string | null) => field.setValue(val),\n getUploadKey: () => uploadKey,\n setUploadKey: (key: string | null) => {\n uploadKey = key;\n },\n };\n\n const upload = createUploadHandler(fieldPath, uploadFn, kernelCallbacks);\n const remove = createRemoveHandler(fieldPath, deleteFile, kernelCallbacks);\n\n return {\n value: computed(() => field.value()),\n setValue: field.setValue,\n error: computed(() => field.meta.error()),\n isValidating: computed(() => !!field.meta.isValidating() || isUploading()),\n upload,\n remove,\n };\n}\n","import { computed, inject, signal, DestroyRef } from \"@angular/core\";\nimport { useBitStore } from \"./provider\";\nimport type { InjectBitPersistResult } from \"./types\";\n\nexport function injectBitPersist<\n T extends object = any,\n>(): InjectBitPersistResult {\n const store = useBitStore<T>();\n const persist = signal(store.getPersistMetadata());\n\n const unsubscribe = store.subscribeSelector(\n (state) => state.persist,\n (nextPersist) => {\n persist.set(nextPersist);\n },\n { paths: [\"persist\"] },\n );\n\n try {\n inject(DestroyRef).onDestroy(() => unsubscribe());\n } catch {}\n\n const restore = async (): Promise<boolean> => {\n return store.restorePersisted();\n };\n\n const save = async (): Promise<void> => {\n await store.forceSave();\n };\n\n const clear = async (): Promise<void> => {\n await store.clearPersisted();\n };\n\n return {\n restore,\n save,\n clear,\n meta: {\n isSaving: computed(() => persist().isSaving),\n isRestoring: computed(() => persist().isRestoring),\n error: computed(() => persist().error),\n },\n };\n}\n"],"mappings":"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","names":["inject","InjectionToken","BIT_STORE_TOKEN","InjectionToken","provideBitStore","store","resolveBitStoreForHooks","useBitStore","inject","signal","computed","inject","DestroyRef","injectBitForm","store","useBitStore","destroyRef","inject","DestroyRef","stateSignal","signal","submitError","lastResponse","sub","state","nextState","isValid","computed","isSubmitting","isDirty","controller","createFormController","result","error","actions","createStoreFormActions","inject","DestroyRef","computed","signal","injectBitField","path","store","inject","BIT_STORE_TOKEN","stateSignal","signal","unsubscribe","subscribeFieldState","nextState","DestroyRef","value","computed","rawError","touched","error","isDirty","isValidating","isHidden","isRequired","invalid","resolvedMask","fieldController","createMaskedFieldController","displayValue","setValue","val","setBlur","hasError","e","isBitFieldInputEventObject","DestroyRef","signal","computed","inject","untracked","injectBitArray","path","store","inject","BIT_STORE_TOKEN","destroyRef","DestroyRef","createId","index","valuesSig","signal","val","getDeepValue","idsSig","_","unsub","value","next","ids","untracked","i","computed","v","idx","c","a","b","f","t","it","items","computed","DestroyRef","inject","signal","injectBitHistory","store","useBitStore","destroyRef","inject","DestroyRef","meta","signal","sub","nextMeta","isHistoryMetaEqual","computed","signal","computed","DestroyRef","inject","injectBitScope","scopeName","store","useBitStore","scopeFields","initialStatus","status","signal","unsubscribe","state","newStatus","current","isScopeStatusEqual","getScopeSubscriptionPaths","inject","DestroyRef","validate","valid","errors","getErrors","isValid","computed","isDirty","signal","computed","DestroyRef","inject","injectBitSteps","scopeNames","store","useBitStore","stepIndex","signal","scope","computed","getCurrentScope","status","updateStatus","scopeName","newStatus","current","isScopeStatusEqual","unsubscribe","state","getScopeSubscriptionPaths","inject","DestroyRef","validate","valid","errors","getErrors","next","scopeFields","newIndex","pathsWithErrors","prev","goTo","targetStep","step","isFirst","isLast","isValid","isDirty","DestroyRef","signal","inject","injectBitWatch","path","store","useBitStore","destroyRef","inject","DestroyRef","valueSig","signal","getDeepValue","deepEqual","unsub","v","computed","inject","signal","injectBitUpload","fieldPath","uploadFn","deleteFile","store","inject","BIT_STORE_TOKEN","field","injectBitField","uploadKey","isUploading","signal","kernelCallbacks","val","path","msg","key","upload","createUploadHandler","remove","createRemoveHandler","computed","computed","inject","signal","DestroyRef","injectBitPersist","store","useBitStore","persist","signal","unsubscribe","state","nextPersist","inject","DestroyRef","computed"]}
1
+ {"version":3,"sources":["../../src/angular/provider.ts","../../src/angular/inject-bit-form.ts","../../src/angular/inject-bit-field.ts","../../src/angular/inject-bit-array.ts","../../src/angular/inject-bit-history.ts","../../src/angular/inject-bit-scope.ts","../../src/angular/inject-bit-steps.ts","../../src/angular/inject-bit-watch.ts","../../src/angular/inject-bit-upload.ts","../../src/angular/inject-bit-persist.ts"],"sourcesContent":["import { inject, InjectionToken, Provider } from \"@angular/core\";\nimport type { BitFrameworkStoreApi, BitStoreApi } from \"../core\";\nimport { createFrameworkStoreAdapter } from \"../core\";\n\nexport const BIT_STORE_TOKEN = new InjectionToken<BitFrameworkStoreApi<any>>(\n \"BIT_STORE\",\n);\n\nexport function provideBitStore<T extends object>(\n store: BitFrameworkStoreApi<T> | BitStoreApi<T>,\n): Provider {\n return {\n provide: BIT_STORE_TOKEN,\n useValue: createFrameworkStoreAdapter<T>(store),\n };\n}\n\nexport function useBitStore<T extends object>() {\n const store = inject(BIT_STORE_TOKEN, { optional: true });\n\n if (!store) {\n throw new Error(\n \"BitForm: Não foi possível encontrar a BitStore. \" +\n 'Certifique-se de que você adicionou \"provideBitStore(store)\" nos providers do seu componente.',\n );\n }\n\n return store as BitFrameworkStoreApi<T>;\n}\n","import { signal, computed, inject, DestroyRef } from \"@angular/core\";\nimport { useBitStore } from \"./provider\";\nimport { createFrameworkFormBinding, observeFormMetaSnapshot } from \"../core\";\nimport type { InjectBitFormResult } from \"./types\";\n\nexport function injectBitForm<T extends object>(): InjectBitFormResult<T> {\n const store = useBitStore<T>();\n const destroyRef = inject(DestroyRef);\n const stateSignal = signal({\n isValid: true,\n isDirty: false,\n isSubmitting: false,\n });\n const submitError = signal<Error | null>(null);\n const lastResponse = signal<unknown>(null);\n\n const sub = observeFormMetaSnapshot(store, (nextMeta) => {\n stateSignal.set(nextMeta);\n });\n\n destroyRef.onDestroy(() => sub());\n\n const isValid = computed(() => stateSignal().isValid);\n const isSubmitting = computed(() => stateSignal().isSubmitting);\n const isDirty = computed(() => stateSignal().isDirty);\n\n const { controller, actions } = createFrameworkFormBinding(\n store,\n {\n clearSubmissionState: () => {\n submitError.set(null);\n lastResponse.set(null);\n },\n setSubmissionResult: (result) => {\n lastResponse.set(result);\n },\n setSubmissionError: (error) => {\n submitError.set(error);\n },\n },\n { stopPropagation: true },\n );\n\n const meta = {\n isValid,\n isDirty,\n isSubmitting,\n submitError: submitError.asReadonly(),\n lastResponse: lastResponse.asReadonly(),\n };\n\n return {\n // Metadata (grouped)\n meta,\n // Getters\n getValues: controller.getValues,\n getErrors: controller.getErrors,\n getTouched: controller.getTouched,\n getDirtyValues: controller.getDirtyValues,\n // Main actions (frequent use - flat)\n submit: controller.submit,\n onSubmit: controller.onSubmit,\n reset: controller.reset,\n ...actions,\n };\n}\n","import { inject, DestroyRef, computed, signal } from \"@angular/core\";\nimport { BIT_STORE_TOKEN } from \"./provider\";\nimport {\n BitPath,\n BitPathValue,\n cleanupRegisteredField,\n createFrameworkMaskedFieldBinding,\n deriveFieldMeta,\n isBitFieldInputEventObject,\n} from \"../core\";\nimport type {\n BitFieldInputEvent,\n InjectBitFieldResult,\n} from \"./types\";\n\nexport function injectBitField<\n TValue = any,\n TForm extends object = any,\n P extends BitPath<TForm> = BitPath<TForm>,\n>(path: P): InjectBitFieldResult<TForm, P> {\n const store = inject(BIT_STORE_TOKEN);\n\n const stateSignal = signal(store.read.getFieldState(path));\n\n const unsubscribe = store.observe.subscribeFieldState(path, (nextState) => {\n stateSignal.set(nextState);\n });\n\n inject(DestroyRef).onDestroy(() => {\n unsubscribe();\n cleanupRegisteredField(store, path as string);\n });\n\n const value = computed(() => stateSignal().value as BitPathValue<TForm, P>);\n const metaState = computed(() => deriveFieldMeta(stateSignal()));\n const error = computed(() => metaState().error);\n const touched = computed(() => metaState().touched);\n const invalid = computed(() => metaState().invalid);\n const isDirty = computed(() => metaState().isDirty);\n const isValidating = computed(() => metaState().isValidating);\n const isHidden = computed(() => metaState().isHidden);\n const isRequired = computed(() => metaState().isRequired);\n\n const { fieldController } = createFrameworkMaskedFieldBinding(store, path);\n\n const displayValue = computed(() => fieldController.displayValue(value()));\n\n const setValue = (\n val: BitPathValue<TForm, P> | string | number | null | undefined,\n ) => {\n fieldController.setValue(val);\n };\n\n const setBlur = () => fieldController.setBlur();\n\n const hasError = computed(() => metaState().hasError);\n\n const update = (e: BitFieldInputEvent) =>\n setValue(isBitFieldInputEventObject(e) ? (e.target?.value ?? null) : e);\n\n return {\n // Main handlers and values (flat)\n value,\n displayValue,\n setValue,\n setBlur,\n update,\n // Metadata (grouped)\n meta: {\n error,\n touched,\n invalid,\n isDirty,\n isValidating,\n isHidden,\n isRequired,\n hasError,\n },\n };\n}\n","import { DestroyRef, signal, computed, inject } from \"@angular/core\";\nimport { BIT_STORE_TOKEN } from \"./provider\";\nimport {\n createArrayBindingController,\n BitArrayPath,\n BitPathValue,\n BitArrayItem,\n cleanupRegisteredPrefix,\n} from \"../core\";\n\nexport function injectBitArray<\n TForm extends object = any,\n P extends BitArrayPath<TForm> = BitArrayPath<TForm>,\n>(path: P) {\n const store = inject(BIT_STORE_TOKEN);\n const destroyRef = inject(DestroyRef);\n const controller = createArrayBindingController<TForm, P>(store, path);\n\n const valuesSig = signal<BitArrayItem<BitPathValue<TForm, P>>[]>(\n controller.readItems(),\n );\n\n const unsub = store.observe.subscribePath(path, () => {\n valuesSig.set(controller.readItems());\n });\n\n destroyRef.onDestroy(() => {\n unsub();\n cleanupRegisteredPrefix(store, `${path as string}.`);\n });\n\n return {\n fields: computed(() => controller.getFields(valuesSig())),\n length: computed(() => valuesSig().length),\n append: controller.append,\n prepend: controller.prepend,\n remove: controller.remove,\n insert: controller.insert,\n swap: controller.swap,\n move: controller.move,\n replace: controller.replace,\n clear: controller.clear,\n };\n}\n","import { computed, DestroyRef, inject, signal } from \"@angular/core\";\nimport { observeHistoryMetaSnapshot, readHistoryMetaSnapshot } from \"../core\";\nimport { useBitStore } from \"./provider\";\nimport type { InjectBitHistoryResult } from \"./types\";\n\nexport function injectBitHistory<\n T extends object = any,\n>(): InjectBitHistoryResult {\n const store = useBitStore<T>();\n const destroyRef = inject(DestroyRef);\n\n const meta = signal(readHistoryMetaSnapshot(store));\n\n const sub = observeHistoryMetaSnapshot(store, (nextMeta) => {\n meta.set(nextMeta);\n });\n\n destroyRef.onDestroy(() => sub());\n\n return {\n canUndo: computed(() => meta().canUndo),\n canRedo: computed(() => meta().canRedo),\n historyIndex: computed(() => meta().historyIndex),\n historySize: computed(() => meta().historySize),\n undo: () => store.feature.undo(),\n redo: () => store.feature.redo(),\n };\n}\n","import { signal, computed, DestroyRef, inject } from \"@angular/core\";\nimport type { ScopeStatus, ValidateScopeResult } from \"../core\";\nimport { observeScopeStatusSnapshot } from \"../core\";\nimport { useBitStore } from \"./provider\";\n\nexport type { ScopeStatus, ValidateScopeResult };\n\nexport function injectBitScope(scopeName: string) {\n const store = useBitStore();\n const initialStatus = store.read.getScopeStatus(scopeName);\n\n const status = signal<ScopeStatus>(initialStatus);\n\n const unsubscribe = observeScopeStatusSnapshot(\n store,\n scopeName,\n (nextStatus) => {\n status.set(nextStatus);\n },\n );\n\n try {\n const destroyRef = inject(DestroyRef);\n destroyRef.onDestroy(() => unsubscribe());\n } catch {}\n\n const validate = async (): Promise<ValidateScopeResult> => {\n const valid = await store.write.validate({ scope: scopeName });\n const errors = store.read.getScopeErrors(scopeName);\n return { valid, errors };\n };\n\n const getErrors = () => store.read.getScopeErrors(scopeName);\n\n const isValid = computed(() => !status().hasErrors);\n const isDirty = computed(() => status().isDirty);\n const errors = computed(() => status().errors);\n\n return {\n scopeName,\n status,\n errors,\n validate,\n getErrors,\n isValid,\n isDirty,\n unsubscribe,\n };\n}\n","import { signal, computed, DestroyRef, inject } from \"@angular/core\";\nimport type { ScopeStatus, ValidateScopeResult } from \"../core\";\nimport { isScopeStatusEqual } from \"../core\";\nimport { useBitStore } from \"./provider\";\nimport type { InjectBitStepsResult } from \"./types\";\n\nexport function injectBitSteps(scopeNames: string[]): InjectBitStepsResult {\n const store = useBitStore();\n const stepIndex = signal(0);\n\n const scope = computed(() => scopeNames[stepIndex()] ?? \"\");\n\n const getCurrentScope = () => scopeNames[stepIndex()] ?? \"\";\n const status = signal<ScopeStatus>(\n store.read.getScopeStatus(getCurrentScope()),\n );\n\n const updateStatus = () => {\n const scopeName = getCurrentScope();\n const newStatus = store.read.getScopeStatus(scopeName);\n const current = status();\n if (!isScopeStatusEqual(current, newStatus)) {\n status.set(newStatus);\n }\n };\n\n let unsubscribe = store.observe.subscribeScopeStatus(\n getCurrentScope(),\n updateStatus,\n );\n\n const rebindScopeSubscription = () => {\n unsubscribe();\n unsubscribe = store.observe.subscribeScopeStatus(\n getCurrentScope(),\n updateStatus,\n );\n };\n\n try {\n const destroyRef = inject(DestroyRef);\n destroyRef.onDestroy(() => unsubscribe());\n } catch {}\n\n const validate = async (): Promise<ValidateScopeResult> => {\n const scopeName = getCurrentScope();\n const valid = await store.write.validate({ scope: scopeName });\n const errors = store.read.getScopeErrors(scopeName);\n return { valid, errors };\n };\n\n const getErrors = () => store.read.getScopeErrors(getCurrentScope());\n\n const next = async (): Promise<boolean> => {\n const scopeName = getCurrentScope();\n\n const scopeFields = store.read.getScopeFields(scopeName);\n if (store.feature.hasValidationsInProgress(scopeFields)) {\n return false;\n }\n\n const valid = await store.write.validate({ scope: scopeName });\n if (valid) {\n const newIndex = Math.min(stepIndex() + 1, scopeNames.length - 1);\n stepIndex.set(newIndex);\n status.set(store.read.getScopeStatus(scopeNames[newIndex] ?? \"\"));\n rebindScopeSubscription();\n } else {\n const errors = store.read.getScopeErrors(scopeName);\n const pathsWithErrors = Object.keys(errors);\n if (pathsWithErrors.length > 0) {\n store.write.markFieldsTouched(pathsWithErrors);\n }\n }\n return valid;\n };\n\n const prev = () => {\n const newIndex = Math.max(stepIndex() - 1, 0);\n stepIndex.set(newIndex);\n status.set(store.read.getScopeStatus(scopeNames[newIndex] ?? \"\"));\n rebindScopeSubscription();\n };\n\n const goTo = (targetStep: number) => {\n const newIndex = Math.max(\n 0,\n Math.min(targetStep - 1, scopeNames.length - 1),\n );\n stepIndex.set(newIndex);\n status.set(store.read.getScopeStatus(scopeNames[newIndex] ?? \"\"));\n rebindScopeSubscription();\n };\n\n const step = computed(() => stepIndex() + 1);\n const isFirst = computed(() => stepIndex() === 0);\n const isLast = computed(() => stepIndex() >= scopeNames.length - 1);\n const isValid = computed(() => !status().hasErrors);\n const isDirty = computed(() => status().isDirty);\n const errors = computed(() => status().errors);\n\n return {\n step,\n stepIndex,\n scope,\n next,\n prev,\n goTo,\n isFirst,\n isLast,\n status,\n errors,\n isValid,\n isDirty,\n validate,\n getErrors,\n };\n}\n","import { DestroyRef, signal, Signal, inject } from \"@angular/core\";\nimport { useBitStore } from \"./provider\";\nimport { getDeepValue, valueEqual, BitPath, BitPathValue } from \"../core\";\n\nexport function injectBitWatch<\n TForm extends object = any,\n P extends BitPath<TForm> = BitPath<TForm>,\n>(path: P): Signal<BitPathValue<TForm, P>> {\n const store = useBitStore<TForm>();\n const destroyRef = inject(DestroyRef);\n const valueSig = signal<BitPathValue<TForm, P>>(\n getDeepValue(store.read.getState().values, path as string) as BitPathValue<\n TForm,\n P\n >,\n { equal: valueEqual },\n );\n\n const unsub = store.observe.subscribePath(path, (v) => {\n valueSig.set(v as BitPathValue<TForm, P>);\n });\n\n destroyRef.onDestroy(unsub);\n\n return valueSig.asReadonly();\n}\n","/**\n * Angular Dependency Injection for File Upload\n *\n * Minimal upload API integrated with global field validation lifecycle.\n */\n\nimport { computed, inject, signal } from \"@angular/core\";\nimport { BIT_STORE_TOKEN } from \"./provider\";\nimport { injectBitField } from \"./inject-bit-field\";\nimport { BitUploadFn, BitDeleteUploadFn } from \"../core\";\nimport { createUploadHandler, createRemoveHandler } from \"../core/adapters\";\nimport type { InjectBitUploadResult } from \"./types\";\n\nexport function injectBitUpload(\n fieldPath: string,\n uploadFn: BitUploadFn,\n deleteFile?: BitDeleteUploadFn,\n): InjectBitUploadResult {\n const store = inject(BIT_STORE_TOKEN);\n const field = injectBitField(fieldPath);\n let uploadKey: string | null = null;\n const isUploading = signal(false);\n\n const kernelCallbacks = {\n setLoading: (val: boolean) => isUploading.set(val),\n setError: (path: string, msg: string | undefined) =>\n store.write.setError(path, msg),\n setValue: (val: string | null) => field.setValue(val),\n getUploadKey: () => uploadKey,\n setUploadKey: (key: string | null) => {\n uploadKey = key;\n },\n };\n\n const upload = createUploadHandler(fieldPath, uploadFn, kernelCallbacks);\n const remove = createRemoveHandler(fieldPath, deleteFile, kernelCallbacks);\n\n return {\n value: computed(() => field.value()),\n setValue: field.setValue,\n error: computed(() => field.meta.error()),\n isValidating: computed(() => !!field.meta.isValidating() || isUploading()),\n upload,\n remove,\n };\n}\n","import { computed, inject, signal, DestroyRef } from \"@angular/core\";\nimport { useBitStore } from \"./provider\";\nimport { observePersistMetaSnapshot } from \"../core\";\nimport type { InjectBitPersistResult } from \"./types\";\n\nexport function injectBitPersist<\n T extends object = any,\n>(): InjectBitPersistResult {\n const store = useBitStore<T>();\n const persist = signal(store.read.getPersistMetadata());\n\n const unsubscribe = observePersistMetaSnapshot(store, (nextPersist) => {\n persist.set(nextPersist);\n });\n\n try {\n inject(DestroyRef).onDestroy(() => unsubscribe());\n } catch {}\n\n const restore = async (): Promise<boolean> => {\n return store.feature.restorePersisted();\n };\n\n const save = async (): Promise<void> => {\n await store.feature.forceSave();\n };\n\n const clear = async (): Promise<void> => {\n await store.feature.clearPersisted();\n };\n\n return {\n restore,\n save,\n clear,\n meta: {\n isSaving: computed(() => persist().isSaving),\n isRestoring: computed(() => persist().isRestoring),\n error: computed(() => persist().error),\n },\n };\n}\n"],"mappings":"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","names":["inject","InjectionToken","BIT_STORE_TOKEN","InjectionToken","provideBitStore","store","createFrameworkStoreAdapter","useBitStore","inject","signal","computed","inject","DestroyRef","injectBitForm","store","useBitStore","destroyRef","inject","DestroyRef","stateSignal","signal","submitError","lastResponse","sub","observeFormMetaSnapshot","nextMeta","isValid","computed","isSubmitting","isDirty","controller","actions","createFrameworkFormBinding","result","error","inject","DestroyRef","computed","signal","injectBitField","path","store","inject","BIT_STORE_TOKEN","stateSignal","signal","unsubscribe","nextState","DestroyRef","cleanupRegisteredField","value","computed","metaState","deriveFieldMeta","error","touched","invalid","isDirty","isValidating","isHidden","isRequired","fieldController","createFrameworkMaskedFieldBinding","displayValue","setValue","val","setBlur","hasError","e","isBitFieldInputEventObject","DestroyRef","signal","computed","inject","injectBitArray","path","store","inject","BIT_STORE_TOKEN","destroyRef","DestroyRef","controller","createArrayBindingController","valuesSig","signal","unsub","cleanupRegisteredPrefix","computed","computed","DestroyRef","inject","signal","injectBitHistory","store","useBitStore","destroyRef","inject","DestroyRef","meta","signal","readHistoryMetaSnapshot","sub","observeHistoryMetaSnapshot","nextMeta","computed","signal","computed","DestroyRef","inject","injectBitScope","scopeName","store","useBitStore","initialStatus","status","signal","unsubscribe","observeScopeStatusSnapshot","nextStatus","inject","DestroyRef","validate","valid","errors","getErrors","isValid","computed","isDirty","signal","computed","DestroyRef","inject","injectBitSteps","scopeNames","store","useBitStore","stepIndex","signal","scope","computed","getCurrentScope","status","updateStatus","scopeName","newStatus","current","isScopeStatusEqual","unsubscribe","rebindScopeSubscription","inject","DestroyRef","validate","valid","errors","getErrors","next","scopeFields","newIndex","pathsWithErrors","prev","goTo","targetStep","step","isFirst","isLast","isValid","isDirty","DestroyRef","signal","inject","injectBitWatch","path","store","useBitStore","destroyRef","inject","DestroyRef","valueSig","signal","getDeepValue","valueEqual","unsub","v","computed","inject","signal","injectBitUpload","fieldPath","uploadFn","deleteFile","store","inject","BIT_STORE_TOKEN","field","injectBitField","uploadKey","isUploading","signal","kernelCallbacks","val","path","msg","key","upload","createUploadHandler","remove","createRemoveHandler","computed","computed","inject","signal","DestroyRef","injectBitPersist","store","useBitStore","persist","signal","unsubscribe","observePersistMetaSnapshot","nextPersist","inject","DestroyRef","computed"]}
@@ -0,0 +1,23 @@
1
+ import { e as BitStoreApi } from './store-api-types-D-ZHxzRy.cjs';
2
+ import { c as BitArrayPath, b as BitArrayItem, v as BitPathValue } from './types-D6LhF5GC.cjs';
3
+
4
+ interface BitArrayBindingField<TItem> {
5
+ key: string;
6
+ value: TItem;
7
+ index: number;
8
+ }
9
+ interface BitArrayBindingController<TForm extends object, P extends BitArrayPath<TForm>> {
10
+ readItems(): BitArrayItem<BitPathValue<TForm, P>>[];
11
+ getFields(items: BitArrayItem<BitPathValue<TForm, P>>[]): BitArrayBindingField<BitArrayItem<BitPathValue<TForm, P>>>[];
12
+ append(value: BitArrayItem<BitPathValue<TForm, P>>): void;
13
+ prepend(value: BitArrayItem<BitPathValue<TForm, P>>): void;
14
+ insert(index: number, value: BitArrayItem<BitPathValue<TForm, P>>): void;
15
+ remove(index: number): void;
16
+ move(from: number, to: number): void;
17
+ swap(indexA: number, indexB: number): void;
18
+ replace(items: BitArrayItem<BitPathValue<TForm, P>>[]): void;
19
+ clear(): void;
20
+ }
21
+ declare function createArrayBindingController<TForm extends object, P extends BitArrayPath<TForm>>(store: BitStoreApi<TForm>, path: P): BitArrayBindingController<TForm, P>;
22
+
23
+ export { type BitArrayBindingController as B, type BitArrayBindingField as a, createArrayBindingController as c };
@@ -0,0 +1,23 @@
1
+ import { e as BitStoreApi } from './store-api-types-DPi30jQF.js';
2
+ import { c as BitArrayPath, b as BitArrayItem, v as BitPathValue } from './types-CG5nYeRk.js';
3
+
4
+ interface BitArrayBindingField<TItem> {
5
+ key: string;
6
+ value: TItem;
7
+ index: number;
8
+ }
9
+ interface BitArrayBindingController<TForm extends object, P extends BitArrayPath<TForm>> {
10
+ readItems(): BitArrayItem<BitPathValue<TForm, P>>[];
11
+ getFields(items: BitArrayItem<BitPathValue<TForm, P>>[]): BitArrayBindingField<BitArrayItem<BitPathValue<TForm, P>>>[];
12
+ append(value: BitArrayItem<BitPathValue<TForm, P>>): void;
13
+ prepend(value: BitArrayItem<BitPathValue<TForm, P>>): void;
14
+ insert(index: number, value: BitArrayItem<BitPathValue<TForm, P>>): void;
15
+ remove(index: number): void;
16
+ move(from: number, to: number): void;
17
+ swap(indexA: number, indexB: number): void;
18
+ replace(items: BitArrayItem<BitPathValue<TForm, P>>[]): void;
19
+ clear(): void;
20
+ }
21
+ declare function createArrayBindingController<TForm extends object, P extends BitArrayPath<TForm>>(store: BitStoreApi<TForm>, path: P): BitArrayBindingController<TForm, P>;
22
+
23
+ export { type BitArrayBindingController as B, type BitArrayBindingField as a, createArrayBindingController as c };
@@ -0,0 +1,19 @@
1
+ import { r as BitFormGlobal } from './types-CG5nYeRk.js';
2
+
3
+ declare global {
4
+ var __BIT_FORM__: BitFormGlobal | undefined;
5
+ }
6
+ declare const bitBus: BitFormGlobal;
7
+ /**
8
+ * Creates an isolated bus instance — not connected to the browser global.
9
+ * Use this in SSR / Edge Runtime environments (e.g. Next.js Edge) where a
10
+ * shared `globalThis` singleton is unsafe across request contexts.
11
+ *
12
+ * @example
13
+ * // _app.tsx (SSR-safe)
14
+ * const bus = createBitBus();
15
+ * const store = createBitStore({ bus, initialValues: { ... } });
16
+ */
17
+ declare function createBitBus(): BitFormGlobal;
18
+
19
+ export { bitBus as b, createBitBus as c };
@@ -0,0 +1,19 @@
1
+ import { r as BitFormGlobal } from './types-D6LhF5GC.cjs';
2
+
3
+ declare global {
4
+ var __BIT_FORM__: BitFormGlobal | undefined;
5
+ }
6
+ declare const bitBus: BitFormGlobal;
7
+ /**
8
+ * Creates an isolated bus instance — not connected to the browser global.
9
+ * Use this in SSR / Edge Runtime environments (e.g. Next.js Edge) where a
10
+ * shared `globalThis` singleton is unsafe across request contexts.
11
+ *
12
+ * @example
13
+ * // _app.tsx (SSR-safe)
14
+ * const bus = createBitBus();
15
+ * const store = createBitStore({ bus, initialValues: { ... } });
16
+ */
17
+ declare function createBitBus(): BitFormGlobal;
18
+
19
+ export { bitBus as b, createBitBus as c };
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-5NA2TFPG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,2 @@
1
+ import{d as r}from"./chunk-RD73EBSN.js";function o(e,i){return i&&i.value===e.value&&i.error===e.error&&i.touched===e.touched&&i.isHidden===e.isHidden&&i.isRequired===e.isRequired&&i.isDirty===e.isDirty&&i.isValidating===e.isValidating?i:{value:e.value,error:e.error,touched:e.touched,isHidden:e.isHidden,isRequired:e.isRequired,isDirty:e.isDirty,isValidating:e.isValidating}}function l(e,i){return e===i?!0:!e||!i?!1:r(e.value,i.value)&&e.error===i.error&&e.touched===i.touched&&e.isHidden===i.isHidden&&e.isRequired===i.isRequired&&e.isDirty===i.isDirty&&e.isValidating===i.isValidating}function u(e){let i=e.touched?e.error:void 0,d=!!e.error;return{error:i,touched:e.touched,invalid:!!(e.touched&&e.error),isValidating:e.isValidating,isDirty:e.isDirty,isHidden:e.isHidden,isRequired:e.isRequired,hasError:d}}export{o as a,l as b,u as c};
2
+ //# sourceMappingURL=chunk-63OJBMKK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/utils/field-state-snapshot.ts","../src/core/utils/field-meta.ts"],"sourcesContent":["/**\n * Field State Snapshot Utilities\n *\n * Shared utilities for creating and managing field state snapshots across frameworks\n * (React, Vue, Angular). Reduces code duplication while maintaining type safety.\n */\n\nimport { deepEqual } from \"../utils\";\n\n/**\n * Represents a stable snapshot of field state that can be compared for equality.\n */\nexport interface BitFieldSnapshot<TValue = any> {\n value: TValue;\n error: string | undefined;\n touched: boolean;\n isHidden: boolean;\n isRequired: boolean;\n isDirty: boolean;\n isValidating: boolean;\n}\n\n/**\n * Creates or reuses a field state snapshot with shallow equality checking.\n *\n * This function prevents unnecessary re-renders in frameworks like React by\n * returning the same object reference when field state hasn't changed.\n *\n * @param nextState - The new field state from the store\n * @param lastSnapshot - The previous snapshot (can be null on first call)\n * @returns A stable snapshot object that can be used for equality comparison\n *\n * @example\n * ```typescript\n * const snapshot = createFieldStateSnapshot(store.getFieldState(\"email\"), lastSnapshot);\n * if (snapshot !== lastSnapshot) {\n * // Field state changed, update component\n * render(snapshot);\n * }\n * ```\n */\nexport function createFieldStateSnapshot<TValue = any>(\n nextState: {\n value: TValue;\n error: string | undefined;\n touched: boolean;\n isHidden: boolean;\n isRequired: boolean;\n isDirty: boolean;\n isValidating: boolean;\n },\n lastSnapshot: BitFieldSnapshot<TValue> | null,\n): BitFieldSnapshot<TValue> {\n // Use shallow equality: return cached if all fields are equal by reference\n if (lastSnapshot) {\n const shallowEqual =\n lastSnapshot.value === nextState.value &&\n lastSnapshot.error === nextState.error &&\n lastSnapshot.touched === nextState.touched &&\n lastSnapshot.isHidden === nextState.isHidden &&\n lastSnapshot.isRequired === nextState.isRequired &&\n lastSnapshot.isDirty === nextState.isDirty &&\n lastSnapshot.isValidating === nextState.isValidating;\n\n if (shallowEqual) {\n return lastSnapshot;\n }\n }\n\n return {\n value: nextState.value,\n error: nextState.error,\n touched: nextState.touched,\n isHidden: nextState.isHidden,\n isRequired: nextState.isRequired,\n isDirty: nextState.isDirty,\n isValidating: nextState.isValidating,\n };\n}\n\n/**\n * Deep comparison utility for field state snapshots.\n * Useful for scenarios where shallow comparison isn't sufficient (e.g., object/array values).\n *\n * @param snapshotA - First snapshot\n * @param snapshotB - Second snapshot\n * @returns true if snapshots are deeply equal\n */\nexport function areFieldSnapshotsEqual(\n snapshotA: BitFieldSnapshot | null | undefined,\n snapshotB: BitFieldSnapshot | null | undefined,\n): boolean {\n if (snapshotA === snapshotB) return true;\n if (!snapshotA || !snapshotB) return false;\n\n return (\n deepEqual(snapshotA.value, snapshotB.value) &&\n snapshotA.error === snapshotB.error &&\n snapshotA.touched === snapshotB.touched &&\n snapshotA.isHidden === snapshotB.isHidden &&\n snapshotA.isRequired === snapshotB.isRequired &&\n snapshotA.isDirty === snapshotB.isDirty &&\n snapshotA.isValidating === snapshotB.isValidating\n );\n}\n","import type { BitFieldState } from \"../store/contracts/types\";\n\nexport interface BitDerivedFieldMeta {\n error: string | undefined;\n touched: boolean;\n invalid: boolean;\n isValidating: boolean;\n isDirty: boolean;\n isHidden: boolean;\n isRequired: boolean;\n hasError: boolean;\n}\n\nexport function deriveFieldMeta<T extends object, TValue>(\n state: Readonly<BitFieldState<T, TValue>>,\n): BitDerivedFieldMeta {\n const error = state.touched ? state.error : undefined;\n const hasError = !!state.error;\n\n return {\n error,\n touched: state.touched,\n invalid: !!(state.touched && state.error),\n isValidating: state.isValidating,\n isDirty: state.isDirty,\n isHidden: state.isHidden,\n isRequired: state.isRequired,\n hasError,\n };\n}\n"],"mappings":"wCAyCO,SAASA,EACdC,EASAC,EAC0B,CAE1B,OAAIA,GAEAA,EAAa,QAAUD,EAAU,OACjCC,EAAa,QAAUD,EAAU,OACjCC,EAAa,UAAYD,EAAU,SACnCC,EAAa,WAAaD,EAAU,UACpCC,EAAa,aAAeD,EAAU,YACtCC,EAAa,UAAYD,EAAU,SACnCC,EAAa,eAAiBD,EAAU,aAGjCC,EAIJ,CACL,MAAOD,EAAU,MACjB,MAAOA,EAAU,MACjB,QAASA,EAAU,QACnB,SAAUA,EAAU,SACpB,WAAYA,EAAU,WACtB,QAASA,EAAU,QACnB,aAAcA,EAAU,YAC1B,CACF,CAUO,SAASE,EACdC,EACAC,EACS,CACT,OAAID,IAAcC,EAAkB,GAChC,CAACD,GAAa,CAACC,EAAkB,GAGnCC,EAAUF,EAAU,MAAOC,EAAU,KAAK,GAC1CD,EAAU,QAAUC,EAAU,OAC9BD,EAAU,UAAYC,EAAU,SAChCD,EAAU,WAAaC,EAAU,UACjCD,EAAU,aAAeC,EAAU,YACnCD,EAAU,UAAYC,EAAU,SAChCD,EAAU,eAAiBC,EAAU,YAEzC,CC3FO,SAASE,EACdC,EACqB,CACrB,IAAMC,EAAQD,EAAM,QAAUA,EAAM,MAAQ,OACtCE,EAAW,CAAC,CAACF,EAAM,MAEzB,MAAO,CACL,MAAAC,EACA,QAASD,EAAM,QACf,QAAS,CAAC,EAAEA,EAAM,SAAWA,EAAM,OACnC,aAAcA,EAAM,aACpB,QAASA,EAAM,QACf,SAAUA,EAAM,SAChB,WAAYA,EAAM,WAClB,SAAAE,CACF,CACF","names":["createFieldStateSnapshot","nextState","lastSnapshot","areFieldSnapshotsEqual","snapshotA","snapshotB","deepEqual","deriveFieldMeta","state","error","hasError"]}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});function p(t,e,o){return o(t.read.getScopeStatus(e)),t.observe.subscribeScopeStatus(e,o)}exports.a = p;
2
+ //# sourceMappingURL=chunk-BSGJ3T5S.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/scope-status.ts"],"names":["observeScopeStatusSnapshot","store","scopeName","listener"],"mappings":"AAOO,kFAASA,CAAAA,CACdC,CAAAA,CAWAC,CAAAA,CACAC,CAAAA,CACY,CACZ,OAAAA,CAAAA,CAASF,CAAAA,CAAM,IAAA,CAAK,cAAA,CAAeC,CAAS,CAAC,CAAA,CAEtCD,CAAAA,CAAM,OAAA,CAAQ,oBAAA,CAAqBC,CAAAA,CAAWC,CAAQ,CAC/D,CAAA,cAAA","file":"/home/runner/work/bit-form/bit-form/dist/chunk-BSGJ3T5S.cjs","sourcesContent":["import type { ScopeStatus } from \"./store/contracts/types\";\nexport {\n areScopeErrorsEqual,\n isScopeStatusEqual,\n getScopeSubscriptionPaths,\n} from \"./store/shared/scope-status\";\n\nexport function observeScopeStatusSnapshot(\n store: {\n read: {\n getScopeStatus(scopeName: string): ScopeStatus;\n };\n observe: {\n subscribeScopeStatus(\n scopeName: string,\n listener: (status: ScopeStatus) => void,\n ): () => void;\n };\n },\n scopeName: string,\n listener: (status: ScopeStatus) => void,\n): () => void {\n listener(store.read.getScopeStatus(scopeName));\n\n return store.observe.subscribeScopeStatus(scopeName, listener);\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import{d as k}from"./chunk-UQ3DSUWC.js";import{a as M,b as A,d as E,e as C,g as D,i as U,j,k as I}from"./chunk-E2NZR44P.js";import{b as F}from"./chunk-EQ55DKX2.js";import{a as q}from"./chunk-63OJBMKK.js";import{c as V,f as w}from"./chunk-RD73EBSN.js";import{createContext as H,useContext as J}from"react";import{jsx as K}from"react/jsx-runtime";var L=H(null),dt=({store:t,children:e})=>K(L.Provider,{value:k(t),children:e}),c=()=>{let t=J(L);if(!t)throw new Error("BitForm hooks devem ser usados dentro de um BitFormProvider");return t};import{useCallback as p,useSyncExternalStore as Q,useMemo as W,useRef as X,useState as O}from"react";function yt(){let t=c(),[e,r]=O(null),[n,o]=O(null),s=X(null),m=p(S=>A(t,S),[t]),l=p(()=>{let S=M(t);return s.current&&s.current.isValid===S.isValid&&s.current.isDirty===S.isDirty&&s.current.isSubmitting===S.isSubmitting?s.current:(s.current=S,S)},[t]),i=Q(m,l,l),d=W(()=>D(t,{clearSubmissionState:()=>{r(null),o(null)},setSubmissionResult:S=>{o(S)},setSubmissionError:S=>{r(S)}}),[t]),{controller:a,actions:h}=d,x=p(a.submit,[a]),v=p(a.onSubmit,[a]),T=p(a.reset,[a]),u=p(a.getValues,[a]),b=p(a.getErrors,[a]),B=p(a.getTouched,[a]),g=p(a.getDirtyValues,[a]);return{meta:W(()=>({...i,submitError:e,lastResponse:n}),[i,e,n]),getValues:u,getErrors:b,getTouched:B,getDirtyValues:g,submit:x,onSubmit:v,reset:T,...h}}import{useCallback as $,useEffect as Y,useSyncExternalStore as Z,useMemo as z}from"react";function Et(t){let e=c(),r=z(()=>U(e,t),[e,t]),n=$(()=>r.readItems(),[r]),o=$(l=>e.observe.subscribePath(t,()=>l()),[e,t]),s=Z(o,n,n),m=z(()=>r.getFields(s),[r,s]);return Y(()=>()=>{I(e,`${t}.`)},[e,t]),{fields:m,length:s.length,append:r.append,prepend:r.prepend,insert:r.insert,remove:r.remove,move:r.move,swap:r.swap,replace:r.replace,clear:r.clear}}import{useCallback as y,useSyncExternalStore as _,useRef as N}from"react";function Mt(t){let e=c(),r=N(null),n=y(()=>{let i=e.read.getScopeStatus(t);return r.current&&F(r.current,i)?r.current:(r.current=i,i)},[e,t]),o=y(i=>e.observe.subscribeScopeStatus(t,()=>i()),[e,t]),s=_(o,n,n),m=y(async()=>{let i=await e.write.validate({scope:t}),d=e.read.getScopeErrors(t);return{valid:i,errors:d}},[e,t]),l=y(()=>e.read.getScopeErrors(t),[e,t]);return{scopeName:t,status:s,errors:s.errors,validate:m,getErrors:l,isValid:!s.hasErrors,isDirty:s.isDirty}}import{useCallback as f,useSyncExternalStore as tt,useRef as et,useState as rt}from"react";function jt(t){let e=c(),[r,n]=rt(0),o=t[r]??"",s=et(null),m=f(()=>{let u=e.read.getScopeStatus(o);return s.current&&F(s.current,u)?s.current:(s.current=u,u)},[e,o]),l=tt(f(u=>e.observe.subscribeScopeStatus(o,()=>u()),[e,o]),m,m),i=f(async()=>{let u=await e.write.validate({scope:o}),b=e.read.getScopeErrors(o);return{valid:u,errors:b}},[e,o]),d=f(()=>e.read.getScopeErrors(o),[e,o]),a=f(async()=>{let u=e.read.getScopeFields(o);if(e.feature.hasValidationsInProgress(u))return!1;let b=await e.write.validate({scope:o});if(b)n(B=>Math.min(B+1,t.length-1));else{let B=e.read.getScopeErrors(o),g=Object.keys(B);g.length>0&&e.write.markFieldsTouched(g)}return b},[e,o,t.length]),h=f(()=>{n(u=>Math.max(u-1,0))},[]),x=f(u=>{n(Math.max(0,Math.min(u-1,t.length-1)))},[t.length]),v=r===0,T=r>=t.length-1;return{step:r+1,stepIndex:r,scope:o,next:a,prev:h,goTo:x,isFirst:v,isLast:T,status:l,errors:l.errors,isValid:!l.hasErrors,isDirty:l.isDirty,validate:i,getErrors:d}}import{useCallback as G,useSyncExternalStore as st,useRef as ot}from"react";function zt(t){let e=c(),r=ot(null),n=G(()=>{let s=w(e.read.getState().values,t);return r.current!==null&&V(r.current,s)?r.current:(r.current=s,s)},[e,t]),o=G(s=>e.observe.subscribePath(t,()=>s()),[e,t]);return st(o,n,n)}import{useCallback as R,useMemo as nt,useSyncExternalStore as it}from"react";function Qt(){let t=c(),e=it(m=>C(t,m),()=>E(t),()=>E(t)),r=R(async()=>t.feature.restorePersisted(),[t]),n=R(async()=>{await t.feature.forceSave()},[t]),o=R(async()=>{await t.feature.clearPersisted()},[t]),s=nt(()=>({isSaving:e.isSaving,isRestoring:e.isRestoring,error:e.error}),[e]);return{restore:r,save:n,clear:o,meta:s}}import{useCallback as P,useSyncExternalStore as at,useRef as ut,useEffect as ct}from"react";function re(t){let e=c(),r=ut(null);ct(()=>()=>j(e,t),[e,t]);let n=P(()=>{let i=e.read.getFieldState(t),d=q(i,r.current);return r.current=d,d},[e,t]),o=P(i=>e.observe.subscribeFieldState(t,()=>i()),[e,t]),s=at(o,n,n),m=P(i=>e.write.setField(t,i),[e,t]),l=P(()=>e.write.blurField(t),[e,t]);return{fieldState:s,setValue:m,setBlur:l,store:e}}export{dt as a,c as b,yt as c,re as d,Et as e,Mt as f,jt as g,zt as h,Qt as i};
2
+ //# sourceMappingURL=chunk-CPP7ELA5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react/context.tsx","../src/react/use-bit-form.ts","../src/react/use-bit-array.ts","../src/react/use-bit-scope.ts","../src/react/use-bit-steps.ts","../src/react/use-bit-watch.ts","../src/react/use-bit-persist.ts","../src/react/use-bit-field-base.ts"],"sourcesContent":["import React, { createContext, useContext } from \"react\";\nimport type { BitFrameworkStoreApi, BitStoreApi } from \"../core\";\nimport { createFrameworkStoreAdapter } from \"../core\";\n\nconst BitContext = createContext<BitFrameworkStoreApi<any> | null>(null);\n\nexport const BitFormProvider = ({\n store,\n children,\n}: {\n store: BitFrameworkStoreApi<any> | BitStoreApi<any>;\n children: React.ReactNode;\n}) => (\n <BitContext.Provider value={createFrameworkStoreAdapter(store)}>\n {children}\n </BitContext.Provider>\n);\n\nexport const useBitStore = <T extends object>() => {\n const store = useContext(BitContext);\n if (!store)\n throw new Error(\n \"BitForm hooks devem ser usados dentro de um BitFormProvider\",\n );\n return store as BitFrameworkStoreApi<T>;\n};\n","import {\n useCallback,\n useSyncExternalStore,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useBitStore } from \"./context\";\nimport {\n createFrameworkFormBinding,\n readFormMetaSnapshot,\n subscribeFormMetaSnapshot,\n} from \"../core\";\nimport type { UseBitFormResult } from \"./types\";\n\nexport function useBitForm<T extends object>(): UseBitFormResult<T> {\n const store = useBitStore<T>();\n\n const [submitError, setSubmitError] = useState<Error | null>(null);\n const [lastResponse, setLastResponse] = useState<unknown>(null);\n const lastMeta = useRef<ReturnType<typeof readFormMetaSnapshot<T>> | null>(\n null,\n );\n\n const subscribeMeta = useCallback(\n (cb: () => void) => subscribeFormMetaSnapshot(store, cb),\n [store],\n );\n const getMetaSnapshot = useCallback(() => {\n const nextMeta = readFormMetaSnapshot(store);\n\n if (\n lastMeta.current &&\n lastMeta.current.isValid === nextMeta.isValid &&\n lastMeta.current.isDirty === nextMeta.isDirty &&\n lastMeta.current.isSubmitting === nextMeta.isSubmitting\n ) {\n return lastMeta.current;\n }\n\n lastMeta.current = nextMeta;\n return nextMeta;\n }, [store]);\n\n const metaState = useSyncExternalStore(\n subscribeMeta,\n getMetaSnapshot,\n getMetaSnapshot,\n );\n\n const binding = useMemo(\n () =>\n createFrameworkFormBinding(store, {\n clearSubmissionState: () => {\n setSubmitError(null);\n setLastResponse(null);\n },\n setSubmissionResult: (result) => {\n setLastResponse(result);\n },\n setSubmissionError: (error) => {\n setSubmitError(error);\n },\n }),\n [store],\n );\n\n const { controller, actions } = binding;\n\n const submit = useCallback(controller.submit, [controller]);\n const onSubmit = useCallback(controller.onSubmit, [controller]);\n const reset = useCallback(controller.reset, [controller]);\n\n const getValues = useCallback(controller.getValues, [controller]);\n const getErrors = useCallback(controller.getErrors, [controller]);\n const getTouched = useCallback(controller.getTouched, [controller]);\n const getDirtyValues = useCallback(controller.getDirtyValues, [controller]);\n\n const meta = useMemo(\n () => ({\n ...metaState,\n submitError,\n lastResponse,\n }),\n [metaState, submitError, lastResponse],\n );\n\n return {\n // Metadata (grouped)\n meta,\n // Getters\n getValues,\n getErrors,\n getTouched,\n getDirtyValues,\n // Main actions (frequent use - flat)\n submit,\n onSubmit,\n reset,\n ...actions,\n };\n}\n","import { useCallback, useEffect, useSyncExternalStore, useMemo } from \"react\";\nimport { useBitStore } from \"./context\";\nimport {\n createArrayBindingController,\n BitArrayPath,\n cleanupRegisteredPrefix,\n} from \"../core\";\n\nexport function useBitArray<\n TForm extends object = any,\n P extends BitArrayPath<TForm> = BitArrayPath<TForm>,\n>(path: P) {\n const store = useBitStore<TForm>();\n const controller = useMemo(\n () => createArrayBindingController<TForm, P>(store, path),\n [store, path],\n );\n\n const getSnapshot = useCallback(() => {\n return controller.readItems();\n }, [controller]);\n\n const subscribeArray = useCallback(\n (cb: () => void) => store.observe.subscribePath(path, () => cb()),\n [store, path],\n );\n\n const data = useSyncExternalStore(subscribeArray, getSnapshot, getSnapshot);\n\n const fields = useMemo(() => controller.getFields(data), [controller, data]);\n\n useEffect(() => {\n return () => {\n cleanupRegisteredPrefix(store, `${path as string}.`);\n };\n }, [store, path]);\n\n return {\n fields,\n length: data.length,\n append: controller.append,\n prepend: controller.prepend,\n insert: controller.insert,\n remove: controller.remove,\n move: controller.move,\n swap: controller.swap,\n replace: controller.replace,\n clear: controller.clear,\n };\n}\n","import { useCallback, useSyncExternalStore, useRef } from \"react\";\nimport type { ScopeStatus, ValidateScopeResult } from \"../core\";\nimport { isScopeStatusEqual } from \"../core\";\nimport { useBitStore } from \"./context\";\n\nexport type { ScopeStatus, ValidateScopeResult };\n\nexport function useBitScope(scopeName: string) {\n const store = useBitStore();\n\n const lastStatus = useRef<ScopeStatus | null>(null);\n\n const getStatusSnapshot = useCallback(() => {\n const nextStatus = store.read.getScopeStatus(scopeName);\n\n if (\n lastStatus.current &&\n isScopeStatusEqual(lastStatus.current, nextStatus)\n ) {\n return lastStatus.current;\n }\n\n lastStatus.current = nextStatus;\n return nextStatus;\n }, [store, scopeName]);\n\n // Assina apenas os slices de estado relevantes para o escopo (errors e\n // isDirty), evitando execuções desnecessárias do getStatusSnapshot em\n // mudanças não relacionadas (isSubmitting, isValidating de outros campos…)\n const subscribe = useCallback(\n (cb: () => void) =>\n store.observe.subscribeScopeStatus(scopeName, () => cb()),\n [store, scopeName],\n );\n\n const status = useSyncExternalStore(\n subscribe,\n getStatusSnapshot,\n getStatusSnapshot,\n );\n\n const validate = useCallback(async (): Promise<ValidateScopeResult> => {\n const valid = await store.write.validate({ scope: scopeName });\n const errors = store.read.getScopeErrors(scopeName);\n return { valid, errors };\n }, [store, scopeName]);\n\n const getErrors = useCallback(() => {\n return store.read.getScopeErrors(scopeName);\n }, [store, scopeName]);\n\n return {\n scopeName,\n status,\n errors: status.errors,\n validate,\n getErrors,\n isValid: !status.hasErrors,\n isDirty: status.isDirty,\n };\n}\n","import { useCallback, useSyncExternalStore, useRef, useState } from \"react\";\nimport type { ScopeStatus, ValidateScopeResult } from \"../core\";\nimport { isScopeStatusEqual } from \"../core\";\nimport { useBitStore } from \"./context\";\nimport type { UseBitStepsResult } from \"./types\";\n\nexport function useBitSteps(scopeNames: string[]): UseBitStepsResult {\n const store = useBitStore();\n const [stepIndex, setStepIndex] = useState(0);\n\n const scope = scopeNames[stepIndex] ?? \"\";\n const lastStatus = useRef<ScopeStatus | null>(null);\n\n const getStatusSnapshot = useCallback(() => {\n const nextStatus = store.read.getScopeStatus(scope);\n\n if (\n lastStatus.current &&\n isScopeStatusEqual(lastStatus.current, nextStatus)\n ) {\n return lastStatus.current;\n }\n\n lastStatus.current = nextStatus;\n return nextStatus;\n }, [store, scope]);\n\n const status = useSyncExternalStore(\n useCallback(\n (cb: () => void) => store.observe.subscribeScopeStatus(scope, () => cb()),\n [store, scope],\n ),\n getStatusSnapshot,\n getStatusSnapshot,\n );\n\n const validate = useCallback(async (): Promise<ValidateScopeResult> => {\n const valid = await store.write.validate({ scope });\n const errors = store.read.getScopeErrors(scope);\n return { valid, errors };\n }, [store, scope]);\n\n const getErrors = useCallback(() => {\n return store.read.getScopeErrors(scope);\n }, [store, scope]);\n\n const next = useCallback(async (): Promise<boolean> => {\n const scopeFields = store.read.getScopeFields(scope);\n\n if (store.feature.hasValidationsInProgress(scopeFields)) {\n return false;\n }\n\n const valid = await store.write.validate({ scope });\n if (valid) {\n setStepIndex((s) => Math.min(s + 1, scopeNames.length - 1));\n } else {\n const errors = store.read.getScopeErrors(scope);\n const pathsWithErrors = Object.keys(errors);\n if (pathsWithErrors.length > 0) {\n store.write.markFieldsTouched(pathsWithErrors);\n }\n }\n return valid;\n }, [store, scope, scopeNames.length]);\n\n const prev = useCallback(() => {\n setStepIndex((s) => Math.max(s - 1, 0));\n }, []);\n\n const goTo = useCallback(\n (targetStep: number) => {\n setStepIndex(\n Math.max(0, Math.min(targetStep - 1, scopeNames.length - 1)),\n );\n },\n [scopeNames.length],\n );\n\n const isFirst = stepIndex === 0;\n const isLast = stepIndex >= scopeNames.length - 1;\n\n return {\n step: stepIndex + 1,\n stepIndex,\n scope,\n next,\n prev,\n goTo,\n isFirst,\n isLast,\n status,\n errors: status.errors,\n isValid: !status.hasErrors,\n isDirty: status.isDirty,\n validate,\n getErrors,\n };\n}\n","import { useCallback, useSyncExternalStore, useRef } from \"react\";\nimport { useBitStore } from \"./context\";\nimport { getDeepValue, valueEqual, BitPath, BitPathValue } from \"../core\";\n\nexport function useBitWatch<\n TForm extends object = any,\n P extends BitPath<TForm> = BitPath<TForm>,\n>(path: P): BitPathValue<TForm, P> {\n const store = useBitStore<TForm>();\n const lastValue = useRef<BitPathValue<TForm, P> | null>(null);\n\n const getSnapshot = useCallback(() => {\n const value = getDeepValue(\n store.read.getState().values,\n path as string,\n ) as BitPathValue<TForm, P>;\n\n if (lastValue.current !== null && valueEqual(lastValue.current, value)) {\n return lastValue.current;\n }\n\n lastValue.current = value;\n return value;\n }, [store, path]);\n\n // Assina apenas o path monitorado → evita executar getSnapshot em toda\n // mudança de estado do store (blur, validation, outros campos, etc.)\n const subscribe = useCallback(\n (cb: () => void) => store.observe.subscribePath(path, () => cb()),\n [store, path],\n );\n\n return useSyncExternalStore(\n subscribe,\n getSnapshot,\n getSnapshot,\n ) as BitPathValue<TForm, P>;\n}\n","import { useCallback, useMemo, useSyncExternalStore } from \"react\";\nimport { useBitStore } from \"./context\";\nimport { readPersistMetaSnapshot, subscribePersistMetaSnapshot } from \"../core\";\nimport type { UseBitPersistResult } from \"./types\";\n\nexport function useBitPersist(): UseBitPersistResult {\n const store = useBitStore<any>();\n\n const persistMeta = useSyncExternalStore(\n (cb) => subscribePersistMetaSnapshot(store, cb),\n () => readPersistMetaSnapshot(store),\n () => readPersistMetaSnapshot(store),\n );\n\n const restore = useCallback(async () => {\n return store.feature.restorePersisted();\n }, [store]);\n\n const save = useCallback(async () => {\n await store.feature.forceSave();\n }, [store]);\n\n const clear = useCallback(async () => {\n await store.feature.clearPersisted();\n }, [store]);\n\n const meta = useMemo(\n () => ({\n isSaving: persistMeta.isSaving,\n isRestoring: persistMeta.isRestoring,\n error: persistMeta.error,\n }),\n [persistMeta],\n );\n\n return {\n restore,\n save,\n clear,\n meta,\n };\n}\n","import { useCallback, useSyncExternalStore, useRef, useEffect } from \"react\";\nimport { useBitStore } from \"./context\";\nimport {\n BitFieldSnapshot,\n BitPath,\n BitPathValue,\n cleanupRegisteredField,\n createFieldStateSnapshot,\n} from \"../core\";\n\nexport function useBitFieldBase<\n TValue = any,\n TForm extends object = any,\n P extends BitPath<TForm> = BitPath<TForm>,\n>(path: P) {\n const store = useBitStore<TForm>();\n const lastSnapshot = useRef<BitFieldSnapshot<BitPathValue<TForm, P>> | null>(\n null,\n );\n\n useEffect(() => {\n return () => cleanupRegisteredField(store, path as string);\n }, [store, path]);\n\n const getSnapshot = useCallback(() => {\n const nextState = store.read.getFieldState(path);\n const snapshot = createFieldStateSnapshot(nextState, lastSnapshot.current);\n lastSnapshot.current = snapshot;\n return snapshot;\n }, [store, path]);\n\n const subscribe = useCallback(\n (cb: () => void) => store.observe.subscribeFieldState(path, () => cb()),\n [store, path],\n );\n\n const fieldState = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n\n const setValue = useCallback(\n (val: BitPathValue<TForm, P>) => store.write.setField(path, val),\n [store, path],\n );\n\n const setBlur = useCallback(() => store.write.blurField(path), [store, path]);\n\n return { fieldState, setValue, setBlur, store };\n}\n"],"mappings":"2PAAA,OAAgB,iBAAAA,EAAe,cAAAC,MAAkB,QAa/C,cAAAC,MAAA,oBATF,IAAMC,EAAaC,EAAgD,IAAI,EAE1DC,GAAkB,CAAC,CAC9B,MAAAC,EACA,SAAAC,CACF,IAIEL,EAACC,EAAW,SAAX,CAAoB,MAAOK,EAA4BF,CAAK,EAC1D,SAAAC,EACH,EAGWE,EAAc,IAAwB,CACjD,IAAMH,EAAQI,EAAWP,CAAU,EACnC,GAAI,CAACG,EACH,MAAM,IAAI,MACR,6DACF,EACF,OAAOA,CACT,ECzBA,OACE,eAAAK,EACA,wBAAAC,EACA,WAAAC,EACA,UAAAC,EACA,YAAAC,MACK,QASA,SAASC,IAAoD,CAClE,IAAMC,EAAQC,EAAe,EAEvB,CAACC,EAAaC,CAAc,EAAIC,EAAuB,IAAI,EAC3D,CAACC,EAAcC,CAAe,EAAIF,EAAkB,IAAI,EACxDG,EAAWC,EACf,IACF,EAEMC,EAAgBC,EACnBC,GAAmBC,EAA0BZ,EAAOW,CAAE,EACvD,CAACX,CAAK,CACR,EACMa,EAAkBH,EAAY,IAAM,CACxC,IAAMI,EAAWC,EAAqBf,CAAK,EAE3C,OACEO,EAAS,SACTA,EAAS,QAAQ,UAAYO,EAAS,SACtCP,EAAS,QAAQ,UAAYO,EAAS,SACtCP,EAAS,QAAQ,eAAiBO,EAAS,aAEpCP,EAAS,SAGlBA,EAAS,QAAUO,EACZA,EACT,EAAG,CAACd,CAAK,CAAC,EAEJgB,EAAYC,EAChBR,EACAI,EACAA,CACF,EAEMK,EAAUC,EACd,IACEC,EAA2BpB,EAAO,CAChC,qBAAsB,IAAM,CAC1BG,EAAe,IAAI,EACnBG,EAAgB,IAAI,CACtB,EACA,oBAAsBe,GAAW,CAC/Bf,EAAgBe,CAAM,CACxB,EACA,mBAAqBC,GAAU,CAC7BnB,EAAemB,CAAK,CACtB,CACF,CAAC,EACH,CAACtB,CAAK,CACR,EAEM,CAAE,WAAAuB,EAAY,QAAAC,CAAQ,EAAIN,EAE1BO,EAASf,EAAYa,EAAW,OAAQ,CAACA,CAAU,CAAC,EACpDG,EAAWhB,EAAYa,EAAW,SAAU,CAACA,CAAU,CAAC,EACxDI,EAAQjB,EAAYa,EAAW,MAAO,CAACA,CAAU,CAAC,EAElDK,EAAYlB,EAAYa,EAAW,UAAW,CAACA,CAAU,CAAC,EAC1DM,EAAYnB,EAAYa,EAAW,UAAW,CAACA,CAAU,CAAC,EAC1DO,EAAapB,EAAYa,EAAW,WAAY,CAACA,CAAU,CAAC,EAC5DQ,EAAiBrB,EAAYa,EAAW,eAAgB,CAACA,CAAU,CAAC,EAW1E,MAAO,CAEL,KAXWJ,EACX,KAAO,CACL,GAAGH,EACH,YAAAd,EACA,aAAAG,CACF,GACA,CAACW,EAAWd,EAAaG,CAAY,CACvC,EAME,UAAAuB,EACA,UAAAC,EACA,WAAAC,EACA,eAAAC,EAEA,OAAAN,EACA,SAAAC,EACA,MAAAC,EACA,GAAGH,CACL,CACF,CCrGA,OAAS,eAAAQ,EAAa,aAAAC,EAAW,wBAAAC,EAAsB,WAAAC,MAAe,QAQ/D,SAASC,GAGdC,EAAS,CACT,IAAMC,EAAQC,EAAmB,EAC3BC,EAAaC,EACjB,IAAMC,EAAuCJ,EAAOD,CAAI,EACxD,CAACC,EAAOD,CAAI,CACd,EAEMM,EAAcC,EAAY,IACvBJ,EAAW,UAAU,EAC3B,CAACA,CAAU,CAAC,EAETK,EAAiBD,EACpBE,GAAmBR,EAAM,QAAQ,cAAcD,EAAM,IAAMS,EAAG,CAAC,EAChE,CAACR,EAAOD,CAAI,CACd,EAEMU,EAAOC,EAAqBH,EAAgBF,EAAaA,CAAW,EAEpEM,EAASR,EAAQ,IAAMD,EAAW,UAAUO,CAAI,EAAG,CAACP,EAAYO,CAAI,CAAC,EAE3E,OAAAG,EAAU,IACD,IAAM,CACXC,EAAwBb,EAAO,GAAGD,CAAc,GAAG,CACrD,EACC,CAACC,EAAOD,CAAI,CAAC,EAET,CACL,OAAAY,EACA,OAAQF,EAAK,OACb,OAAQP,EAAW,OACnB,QAASA,EAAW,QACpB,OAAQA,EAAW,OACnB,OAAQA,EAAW,OACnB,KAAMA,EAAW,KACjB,KAAMA,EAAW,KACjB,QAASA,EAAW,QACpB,MAAOA,EAAW,KACpB,CACF,CCjDA,OAAS,eAAAY,EAAa,wBAAAC,EAAsB,UAAAC,MAAc,QAOnD,SAASC,GAAYC,EAAmB,CAC7C,IAAMC,EAAQC,EAAY,EAEpBC,EAAaC,EAA2B,IAAI,EAE5CC,EAAoBC,EAAY,IAAM,CAC1C,IAAMC,EAAaN,EAAM,KAAK,eAAeD,CAAS,EAEtD,OACEG,EAAW,SACXK,EAAmBL,EAAW,QAASI,CAAU,EAE1CJ,EAAW,SAGpBA,EAAW,QAAUI,EACdA,EACT,EAAG,CAACN,EAAOD,CAAS,CAAC,EAKfS,EAAYH,EACfI,GACCT,EAAM,QAAQ,qBAAqBD,EAAW,IAAMU,EAAG,CAAC,EAC1D,CAACT,EAAOD,CAAS,CACnB,EAEMW,EAASC,EACbH,EACAJ,EACAA,CACF,EAEMQ,EAAWP,EAAY,SAA0C,CACrE,IAAMQ,EAAQ,MAAMb,EAAM,MAAM,SAAS,CAAE,MAAOD,CAAU,CAAC,EACvDe,EAASd,EAAM,KAAK,eAAeD,CAAS,EAClD,MAAO,CAAE,MAAAc,EAAO,OAAAC,CAAO,CACzB,EAAG,CAACd,EAAOD,CAAS,CAAC,EAEfgB,EAAYV,EAAY,IACrBL,EAAM,KAAK,eAAeD,CAAS,EACzC,CAACC,EAAOD,CAAS,CAAC,EAErB,MAAO,CACL,UAAAA,EACA,OAAAW,EACA,OAAQA,EAAO,OACf,SAAAE,EACA,UAAAG,EACA,QAAS,CAACL,EAAO,UACjB,QAASA,EAAO,OAClB,CACF,CC5DA,OAAS,eAAAM,EAAa,wBAAAC,GAAsB,UAAAC,GAAQ,YAAAC,OAAgB,QAM7D,SAASC,GAAYC,EAAyC,CACnE,IAAMC,EAAQC,EAAY,EACpB,CAACC,EAAWC,CAAY,EAAIC,GAAS,CAAC,EAEtCC,EAAQN,EAAWG,CAAS,GAAK,GACjCI,EAAaC,GAA2B,IAAI,EAE5CC,EAAoBC,EAAY,IAAM,CAC1C,IAAMC,EAAaV,EAAM,KAAK,eAAeK,CAAK,EAElD,OACEC,EAAW,SACXK,EAAmBL,EAAW,QAASI,CAAU,EAE1CJ,EAAW,SAGpBA,EAAW,QAAUI,EACdA,EACT,EAAG,CAACV,EAAOK,CAAK,CAAC,EAEXO,EAASC,GACbJ,EACGK,GAAmBd,EAAM,QAAQ,qBAAqBK,EAAO,IAAMS,EAAG,CAAC,EACxE,CAACd,EAAOK,CAAK,CACf,EACAG,EACAA,CACF,EAEMO,EAAWN,EAAY,SAA0C,CACrE,IAAMO,EAAQ,MAAMhB,EAAM,MAAM,SAAS,CAAE,MAAAK,CAAM,CAAC,EAC5CY,EAASjB,EAAM,KAAK,eAAeK,CAAK,EAC9C,MAAO,CAAE,MAAAW,EAAO,OAAAC,CAAO,CACzB,EAAG,CAACjB,EAAOK,CAAK,CAAC,EAEXa,EAAYT,EAAY,IACrBT,EAAM,KAAK,eAAeK,CAAK,EACrC,CAACL,EAAOK,CAAK,CAAC,EAEXc,EAAOV,EAAY,SAA8B,CACrD,IAAMW,EAAcpB,EAAM,KAAK,eAAeK,CAAK,EAEnD,GAAIL,EAAM,QAAQ,yBAAyBoB,CAAW,EACpD,MAAO,GAGT,IAAMJ,EAAQ,MAAMhB,EAAM,MAAM,SAAS,CAAE,MAAAK,CAAM,CAAC,EAClD,GAAIW,EACFb,EAAckB,GAAM,KAAK,IAAIA,EAAI,EAAGtB,EAAW,OAAS,CAAC,CAAC,MACrD,CACL,IAAMkB,EAASjB,EAAM,KAAK,eAAeK,CAAK,EACxCiB,EAAkB,OAAO,KAAKL,CAAM,EACtCK,EAAgB,OAAS,GAC3BtB,EAAM,MAAM,kBAAkBsB,CAAe,CAEjD,CACA,OAAON,CACT,EAAG,CAAChB,EAAOK,EAAON,EAAW,MAAM,CAAC,EAE9BwB,EAAOd,EAAY,IAAM,CAC7BN,EAAckB,GAAM,KAAK,IAAIA,EAAI,EAAG,CAAC,CAAC,CACxC,EAAG,CAAC,CAAC,EAECG,EAAOf,EACVgB,GAAuB,CACtBtB,EACE,KAAK,IAAI,EAAG,KAAK,IAAIsB,EAAa,EAAG1B,EAAW,OAAS,CAAC,CAAC,CAC7D,CACF,EACA,CAACA,EAAW,MAAM,CACpB,EAEM2B,EAAUxB,IAAc,EACxByB,EAASzB,GAAaH,EAAW,OAAS,EAEhD,MAAO,CACL,KAAMG,EAAY,EAClB,UAAAA,EACA,MAAAG,EACA,KAAAc,EACA,KAAAI,EACA,KAAAC,EACA,QAAAE,EACA,OAAAC,EACA,OAAAf,EACA,OAAQA,EAAO,OACf,QAAS,CAACA,EAAO,UACjB,QAASA,EAAO,QAChB,SAAAG,EACA,UAAAG,CACF,CACF,CClGA,OAAS,eAAAU,EAAa,wBAAAC,GAAsB,UAAAC,OAAc,QAInD,SAASC,GAGdC,EAAiC,CACjC,IAAMC,EAAQC,EAAmB,EAC3BC,EAAYC,GAAsC,IAAI,EAEtDC,EAAcC,EAAY,IAAM,CACpC,IAAMC,EAAQC,EACZP,EAAM,KAAK,SAAS,EAAE,OACtBD,CACF,EAEA,OAAIG,EAAU,UAAY,MAAQM,EAAWN,EAAU,QAASI,CAAK,EAC5DJ,EAAU,SAGnBA,EAAU,QAAUI,EACbA,EACT,EAAG,CAACN,EAAOD,CAAI,CAAC,EAIVU,EAAYJ,EACfK,GAAmBV,EAAM,QAAQ,cAAcD,EAAM,IAAMW,EAAG,CAAC,EAChE,CAACV,EAAOD,CAAI,CACd,EAEA,OAAOY,GACLF,EACAL,EACAA,CACF,CACF,CCrCA,OAAS,eAAAQ,EAAa,WAAAC,GAAS,wBAAAC,OAA4B,QAKpD,SAASC,IAAqC,CACnD,IAAMC,EAAQC,EAAiB,EAEzBC,EAAcC,GACjBC,GAAOC,EAA6BL,EAAOI,CAAE,EAC9C,IAAME,EAAwBN,CAAK,EACnC,IAAMM,EAAwBN,CAAK,CACrC,EAEMO,EAAUC,EAAY,SACnBR,EAAM,QAAQ,iBAAiB,EACrC,CAACA,CAAK,CAAC,EAEJS,EAAOD,EAAY,SAAY,CACnC,MAAMR,EAAM,QAAQ,UAAU,CAChC,EAAG,CAACA,CAAK,CAAC,EAEJU,EAAQF,EAAY,SAAY,CACpC,MAAMR,EAAM,QAAQ,eAAe,CACrC,EAAG,CAACA,CAAK,CAAC,EAEJW,EAAOC,GACX,KAAO,CACL,SAAUV,EAAY,SACtB,YAAaA,EAAY,YACzB,MAAOA,EAAY,KACrB,GACA,CAACA,CAAW,CACd,EAEA,MAAO,CACL,QAAAK,EACA,KAAAE,EACA,MAAAC,EACA,KAAAC,CACF,CACF,CCzCA,OAAS,eAAAE,EAAa,wBAAAC,GAAsB,UAAAC,GAAQ,aAAAC,OAAiB,QAU9D,SAASC,GAIdC,EAAS,CACT,IAAMC,EAAQC,EAAmB,EAC3BC,EAAeC,GACnB,IACF,EAEAC,GAAU,IACD,IAAMC,EAAuBL,EAAOD,CAAc,EACxD,CAACC,EAAOD,CAAI,CAAC,EAEhB,IAAMO,EAAcC,EAAY,IAAM,CACpC,IAAMC,EAAYR,EAAM,KAAK,cAAcD,CAAI,EACzCU,EAAWC,EAAyBF,EAAWN,EAAa,OAAO,EACzE,OAAAA,EAAa,QAAUO,EAChBA,CACT,EAAG,CAACT,EAAOD,CAAI,CAAC,EAEVY,EAAYJ,EACfK,GAAmBZ,EAAM,QAAQ,oBAAoBD,EAAM,IAAMa,EAAG,CAAC,EACtE,CAACZ,EAAOD,CAAI,CACd,EAEMc,EAAaC,GAAqBH,EAAWL,EAAaA,CAAW,EAErES,EAAWR,EACdS,GAAgChB,EAAM,MAAM,SAASD,EAAMiB,CAAG,EAC/D,CAAChB,EAAOD,CAAI,CACd,EAEMkB,EAAUV,EAAY,IAAMP,EAAM,MAAM,UAAUD,CAAI,EAAG,CAACC,EAAOD,CAAI,CAAC,EAE5E,MAAO,CAAE,WAAAc,EAAY,SAAAE,EAAU,QAAAE,EAAS,MAAAjB,CAAM,CAChD","names":["createContext","useContext","jsx","BitContext","createContext","BitFormProvider","store","children","createFrameworkStoreAdapter","useBitStore","useContext","useCallback","useSyncExternalStore","useMemo","useRef","useState","useBitForm","store","useBitStore","submitError","setSubmitError","useState","lastResponse","setLastResponse","lastMeta","useRef","subscribeMeta","useCallback","cb","subscribeFormMetaSnapshot","getMetaSnapshot","nextMeta","readFormMetaSnapshot","metaState","useSyncExternalStore","binding","useMemo","createFrameworkFormBinding","result","error","controller","actions","submit","onSubmit","reset","getValues","getErrors","getTouched","getDirtyValues","useCallback","useEffect","useSyncExternalStore","useMemo","useBitArray","path","store","useBitStore","controller","useMemo","createArrayBindingController","getSnapshot","useCallback","subscribeArray","cb","data","useSyncExternalStore","fields","useEffect","cleanupRegisteredPrefix","useCallback","useSyncExternalStore","useRef","useBitScope","scopeName","store","useBitStore","lastStatus","useRef","getStatusSnapshot","useCallback","nextStatus","isScopeStatusEqual","subscribe","cb","status","useSyncExternalStore","validate","valid","errors","getErrors","useCallback","useSyncExternalStore","useRef","useState","useBitSteps","scopeNames","store","useBitStore","stepIndex","setStepIndex","useState","scope","lastStatus","useRef","getStatusSnapshot","useCallback","nextStatus","isScopeStatusEqual","status","useSyncExternalStore","cb","validate","valid","errors","getErrors","next","scopeFields","s","pathsWithErrors","prev","goTo","targetStep","isFirst","isLast","useCallback","useSyncExternalStore","useRef","useBitWatch","path","store","useBitStore","lastValue","useRef","getSnapshot","useCallback","value","getDeepValue","valueEqual","subscribe","cb","useSyncExternalStore","useCallback","useMemo","useSyncExternalStore","useBitPersist","store","useBitStore","persistMeta","useSyncExternalStore","cb","subscribePersistMetaSnapshot","readPersistMetaSnapshot","restore","useCallback","save","clear","meta","useMemo","useCallback","useSyncExternalStore","useRef","useEffect","useBitFieldBase","path","store","useBitStore","lastSnapshot","useRef","useEffect","cleanupRegisteredField","getSnapshot","useCallback","nextState","snapshot","createFieldStateSnapshot","subscribe","cb","fieldState","useSyncExternalStore","setValue","val","setBlur"]}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});function a(t,e){let o=Object.keys(t),s=Object.keys(e);return o.length!==s.length?!1:o.every(r=>t[r]===e[r])}function n(t,e){return t.hasErrors===e.hasErrors&&t.isDirty===e.isDirty&&a(t.errors,e.errors)}function c(t){return[...t,"isDirty"]}function y(t){return`__scope__.${t}`}function p(t,e){return t.canUndo===e.canUndo&&t.canRedo===e.canRedo&&t.historyIndex===e.historyIndex&&t.historySize===e.historySize}function i(t){let e=t.read.getHistoryMetadata();return{canUndo:e.canUndo,canRedo:e.canRedo,historyIndex:e.historyIndex,historySize:e.historySize}}function u(t,e){return e(i(t)),t.observe.subscribeHistoryMeta(()=>{e(i(t))})}function h(){return"__history__"}exports.a = a; exports.b = n; exports.c = c; exports.d = y; exports.e = p; exports.f = i; exports.g = u; exports.h = h;
2
+ //# sourceMappingURL=chunk-D7JQWF6V.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/store/shared/scope-status.ts"],"names":["areScopeErrorsEqual","currentErrors","nextErrors","currentKeys","nextKeys","key","isScopeStatusEqual","currentStatus","nextStatus","getScopeSubscriptionPaths","scopeFields","getScopeRegistrySubscriptionPath","scopeName"],"mappings":"AAEO,kFAASA,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CACS,CACT,IAAMC,CAAAA,CAAc,MAAA,CAAO,IAAA,CAAKF,CAAa,CAAA,CACvCG,CAAAA,CAAW,MAAA,CAAO,IAAA,CAAKF,CAAU,CAAA,CAEvC,OAAIC,CAAAA,CAAY,MAAA,GAAWC,CAAAA,CAAS,MAAA,CAC3B,CAAA,CAAA,CAGFD,CAAAA,CAAY,KAAA,CAAOE,CAAAA,EAAQJ,CAAAA,CAAcI,CAAG,CAAA,GAAMH,CAAAA,CAAWG,CAAG,CAAC,CAC1E,CAEO,SAASC,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CACS,CACT,OACED,CAAAA,CAAc,SAAA,GAAcC,CAAAA,CAAW,SAAA,EACvCD,CAAAA,CAAc,OAAA,GAAYC,CAAAA,CAAW,OAAA,EACrCR,CAAAA,CAAoBO,CAAAA,CAAc,MAAA,CAAQC,CAAAA,CAAW,MAAM,CAE/D,CAEO,SAASC,CAAAA,CAA0BC,CAAAA,CAAgC,CACxE,MAAO,CAAC,GAAGA,CAAAA,CAAa,SAAS,CACnC,CAEO,SAASC,CAAAA,CAAiCC,CAAAA,CAAmB,CAClE,MAAO,CAAA,UAAA,EAAaA,CAAS,CAAA,CAAA","file":"/home/runner/work/bit-form/bit-form/dist/chunk-D7JQWF6V.cjs","sourcesContent":["import type { ScopeStatus } from \"../contracts/types\";\n\nexport function areScopeErrorsEqual(\n currentErrors: Record<string, string>,\n nextErrors: Record<string, string>,\n): boolean {\n const currentKeys = Object.keys(currentErrors);\n const nextKeys = Object.keys(nextErrors);\n\n if (currentKeys.length !== nextKeys.length) {\n return false;\n }\n\n return currentKeys.every((key) => currentErrors[key] === nextErrors[key]);\n}\n\nexport function isScopeStatusEqual(\n currentStatus: ScopeStatus,\n nextStatus: ScopeStatus,\n): boolean {\n return (\n currentStatus.hasErrors === nextStatus.hasErrors &&\n currentStatus.isDirty === nextStatus.isDirty &&\n areScopeErrorsEqual(currentStatus.errors, nextStatus.errors)\n );\n}\n\nexport function getScopeSubscriptionPaths(scopeFields: readonly string[]) {\n return [...scopeFields, \"isDirty\"];\n}\n\nexport function getScopeRegistrySubscriptionPath(scopeName: string) {\n return `__scope__.${scopeName}`;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import{f as B,l as F,m as f}from"./chunk-RD73EBSN.js";import{b as d,c as p}from"./chunk-3NUJVIAM.js";function c(e){let t=e.read.getState();return{isValid:t.isValid,isDirty:t.isDirty,isSubmitting:t.isSubmitting}}function b(e,t){return e.observe.subscribeFormMeta(()=>t())}function x(e,t){return t(c(e)),b(e,()=>{t(c(e))})}function P(e){return e.read.getPersistMetadata()}function T(e,t){return e.observe.subscribePersistMeta(()=>t())}function h(e,t){return t(P(e)),e.observe.subscribePersistMeta(i=>{t(i)})}async function y(e,t,i,a){try{let s=await e(t,i);a.onSuccess(s)}catch(s){if(F(s)){a.onServerErrors(f(s));return}a.onUnhandledError(s instanceof Error?s:new Error(String(s)))}}function v(e,t){e?.preventDefault?.(),t?.stopPropagation&&e?.stopPropagation?.()}function S(e,t,i){return{submit:r=>async n=>{v(n,i),await e.submit(r)},onSubmit:r=>async n=>{v(n,i),t.setSubmissionError(null),await e.submit(async(o,l)=>{await y(r,o,l,{onSuccess:m=>{t.setSubmissionResult(m),t.setSubmissionError(null)},onServerErrors:m=>{e.setServerErrors(m)},onUnhandledError:m=>{t.setSubmissionError(m)}})})},reset:()=>{e.reset(),t.clearSubmissionState()},getValues:()=>e.getState().values,getErrors:()=>e.getState().errors,getTouched:()=>e.getState().touched,getDirtyValues:()=>e.getDirtyValues()}}function w(e,t,i){let a={getState:e.read.getState,getDirtyValues:e.read.getDirtyValues,submit:e.write.submit,reset:e.write.reset,setServerErrors:e.write.setServerErrors};return{controller:S(a,t,i),actions:{setField:e.write.setField.bind(e.write),blurField:e.write.blurField.bind(e.write),setValues:e.write.setValues.bind(e.write),setError:e.write.setError.bind(e.write),setErrors:e.write.setErrors.bind(e.write),setServerErrors:e.write.setServerErrors.bind(e.write),validate:e.write.validate.bind(e.write),transaction:e.write.transaction.bind(e.write)}}}function g(e,t,i){return{setValue:r=>{let n=i();e.setField(t,p(r,n))},setBlur:()=>e.blurField(t),displayValue:r=>d(r,i())}}function A(e,t){return{fieldController:g({setField(a,s){e.write.setField(a,s)},blurField(a){e.write.blurField(a)}},t,()=>e.feature.resolveMask(t))}}function I(e,t){let i=[],a=r=>e.feature.createArrayItemId(t,r),s=r=>Array.isArray(r)?r:[],u=r=>{if(r.length!==i.length)if(r.length>i.length){let n=r.length-i.length;i=[...i,...Array.from({length:n},(o,l)=>a(i.length+l))]}else i=i.slice(0,r.length);return r};return{readItems(){let r=B(e.read.getState().values,t);return u(s(r))},getFields(r){return r.map((n,o)=>({key:i[o]||`temp-${o}`,value:n,index:o}))},append(r){i=[...i,a(i.length)],e.feature.pushItem(t,r)},prepend(r){i=[a(0),...i],e.feature.prependItem(t,r)},insert(r,n){let o=[...i];o.splice(r,0,a(r)),i=o,e.feature.insertItem(t,r,n)},remove(r){i=i.filter((n,o)=>o!==r),e.feature.removeItem(t,r)},move(r,n){let o=[...i],[l]=o.splice(r,1);o.splice(n,0,l),i=o,e.feature.moveItem(t,r,n)},swap(r,n){let o=[...i];[o[r],o[n]]=[o[n],o[r]],i=o,e.feature.swapItems(t,r,n)},replace(r){i=r.map((n,o)=>a(o)),e.feature.replaceItems(t,r)},clear(){i=[],e.feature.clearItems(t)}}}function M(e,t){e.feature?.unregisterField?.(t)}function E(e,t){e.feature?.unregisterPrefix?.(t)}export{c as a,b,x as c,P as d,T as e,h as f,w as g,A as h,I as i,M as j,E as k};
2
+ //# sourceMappingURL=chunk-E2NZR44P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/bindings/form-meta.ts","../src/core/bindings/persist-meta.ts","../src/core/submit-handler.ts","../src/core/form-controller.ts","../src/core/bindings/form-binding.ts","../src/core/field-controller.ts","../src/core/bindings/field-binding.ts","../src/core/bindings/array-controller.ts","../src/core/bindings/framework-cleanup.ts"],"sourcesContent":["import type { BitFormMeta } from \"../store/contracts/public/meta-types\";\nimport type { BitStoreApi } from \"../store/contracts/public/store-api-types\";\n\nexport function readFormMetaSnapshot<T extends object>(\n store: BitStoreApi<T>,\n): BitFormMeta {\n const state = store.read.getState();\n return {\n isValid: state.isValid,\n isDirty: state.isDirty,\n isSubmitting: state.isSubmitting,\n };\n}\n\nexport function subscribeFormMetaSnapshot<T extends object>(\n store: BitStoreApi<T>,\n listener: () => void,\n): () => void {\n return store.observe.subscribeFormMeta(() => listener());\n}\n\nexport function observeFormMetaSnapshot<T extends object>(\n store: BitStoreApi<T>,\n listener: (meta: BitFormMeta) => void,\n): () => void {\n listener(readFormMetaSnapshot(store));\n\n return subscribeFormMetaSnapshot(store, () => {\n listener(readFormMetaSnapshot(store));\n });\n}\n","import type { BitPersistMetadata } from \"../store/contracts/types\";\nimport type { BitStoreApi } from \"../store/contracts/public/store-api-types\";\n\nexport function readPersistMetaSnapshot(store: {\n read: {\n getPersistMetadata(): BitPersistMetadata;\n };\n}): BitPersistMetadata {\n return store.read.getPersistMetadata();\n}\n\nexport function subscribePersistMetaSnapshot(\n store: BitStoreApi<any>,\n listener: () => void,\n): () => void {\n return store.observe.subscribePersistMeta(() => listener());\n}\n\nexport function observePersistMetaSnapshot(\n store: BitStoreApi<any>,\n listener: (meta: BitPersistMetadata) => void,\n): () => void {\n listener(readPersistMetaSnapshot(store));\n\n return store.observe.subscribePersistMeta((meta) => {\n listener(meta);\n });\n}\n","import { extractServerErrors, isValidationErrorShape } from \"./utils\";\n\nexport interface BitSubmitExecutionHandlers {\n onServerErrors: (errors: Record<string, string[] | string>) => void;\n onUnhandledError: (error: Error) => void;\n onSuccess: (result: unknown) => void;\n}\n\nexport async function executeSubmitHandler<T extends object>(\n handler: (values: T, dirtyValues?: Partial<T>) => Promise<unknown>,\n values: T,\n dirtyValues: Partial<T> | undefined,\n handlers: BitSubmitExecutionHandlers,\n): Promise<void> {\n try {\n const result = await handler(values, dirtyValues);\n handlers.onSuccess(result);\n } catch (error) {\n if (isValidationErrorShape(error)) {\n handlers.onServerErrors(extractServerErrors(error));\n return;\n }\n\n handlers.onUnhandledError(\n error instanceof Error ? error : new Error(String(error)),\n );\n }\n}\n","import { executeSubmitHandler } from \"./submit-handler\";\nimport type { BitFormControllerStoreApi } from \"./store/contracts/public/store-api-types\";\n\nexport type BitFormDomEvent = {\n preventDefault?: () => void;\n stopPropagation?: () => void;\n};\n\nexport interface BitFormControllerRuntime {\n clearSubmissionState: () => void;\n setSubmissionResult: (result: unknown) => void;\n setSubmissionError: (error: Error | null) => void;\n}\n\nexport interface BitFormControllerOptions {\n stopPropagation?: boolean;\n}\n\nexport function preventFormEvent(\n event?: BitFormDomEvent,\n options?: BitFormControllerOptions,\n) {\n event?.preventDefault?.();\n if (options?.stopPropagation) {\n event?.stopPropagation?.();\n }\n}\n\nexport function createFormController<T extends object>(\n store: BitFormControllerStoreApi<T>,\n runtime: BitFormControllerRuntime,\n options?: BitFormControllerOptions,\n) {\n const submit = (\n onSuccess: (values: T, dirtyValues?: Partial<T>) => void | Promise<void>,\n ) => {\n return async (event?: BitFormDomEvent): Promise<void> => {\n preventFormEvent(event, options);\n await store.submit(onSuccess);\n };\n };\n\n const onSubmit = (\n handler: (values: T, dirtyValues?: Partial<T>) => Promise<unknown>,\n ) => {\n return async (event?: BitFormDomEvent): Promise<void> => {\n preventFormEvent(event, options);\n runtime.setSubmissionError(null);\n\n await store.submit(async (values, dirtyValues) => {\n await executeSubmitHandler(handler, values, dirtyValues, {\n onSuccess: (result) => {\n runtime.setSubmissionResult(result);\n runtime.setSubmissionError(null);\n },\n onServerErrors: (serverErrors) => {\n store.setServerErrors(serverErrors);\n },\n onUnhandledError: (error) => {\n runtime.setSubmissionError(error);\n },\n });\n });\n };\n };\n\n const reset = () => {\n store.reset();\n runtime.clearSubmissionState();\n };\n\n return {\n submit,\n onSubmit,\n reset,\n getValues: () => store.getState().values,\n getErrors: () => store.getState().errors,\n getTouched: () => store.getState().touched,\n getDirtyValues: () => store.getDirtyValues(),\n };\n}\n","import { createFormController } from \"../form-controller\";\nimport type { BitStoreApi } from \"../store/contracts/public/store-api-types\";\nimport type {\n BitFormControllerOptions,\n BitFormControllerRuntime,\n} from \"../form-controller\";\n\nexport function createFrameworkFormBinding<T extends object>(\n store: BitStoreApi<T>,\n runtime: BitFormControllerRuntime,\n options?: BitFormControllerOptions,\n) {\n const controllerStore = {\n getState: store.read.getState,\n getDirtyValues: store.read.getDirtyValues,\n submit: store.write.submit,\n reset: store.write.reset,\n setServerErrors: store.write.setServerErrors,\n };\n\n return {\n controller: createFormController(controllerStore, runtime, options),\n actions: {\n setField: store.write.setField.bind(store.write),\n blurField: store.write.blurField.bind(store.write),\n setValues: store.write.setValues.bind(store.write),\n setError: store.write.setError.bind(store.write),\n setErrors: store.write.setErrors.bind(store.write),\n setServerErrors: store.write.setServerErrors.bind(store.write),\n validate: store.write.validate.bind(store.write),\n transaction: store.write.transaction.bind(store.write),\n },\n };\n}\n","import { formatMaskedValue, parseMaskedInput } from \"./mask/field-binding\";\nimport type { BitMask } from \"./mask/types\";\nimport type { BitPath } from \"./store/contracts/types\";\n\ntype BitMaskedFieldControllerStore<TForm extends object> = {\n setField(path: BitPath<TForm>, value: unknown): void;\n blurField(path: BitPath<TForm>): void;\n};\n\nexport function createMaskedFieldController<\n TForm extends object,\n P extends BitPath<TForm>,\n>(\n store: BitMaskedFieldControllerStore<TForm>,\n path: P,\n resolveMask: () => BitMask | undefined,\n) {\n const setValue = (value: unknown) => {\n const mask = resolveMask();\n store.setField(path, parseMaskedInput(value, mask));\n };\n\n const setBlur = () => store.blurField(path);\n\n const displayValue = (value: unknown) =>\n formatMaskedValue(value, resolveMask());\n\n return {\n setValue,\n setBlur,\n displayValue,\n };\n}\n","import { createMaskedFieldController } from \"../field-controller\";\nimport type { BitStoreApi } from \"../store/contracts/public/store-api-types\";\nimport type { BitPath, BitPathValue } from \"../store/contracts/types\";\n\nexport function createFrameworkMaskedFieldBinding<\n TForm extends object,\n P extends BitPath<TForm>,\n>(store: BitStoreApi<TForm>, path: P) {\n const fieldStore = {\n setField<PPath extends BitPath<TForm>>(\n targetPath: PPath,\n value: BitPathValue<TForm, PPath>,\n ) {\n store.write.setField(targetPath, value);\n },\n blurField<PPath extends BitPath<TForm>>(targetPath: PPath) {\n store.write.blurField(targetPath);\n },\n };\n\n return {\n fieldController: createMaskedFieldController(fieldStore, path, () =>\n store.feature.resolveMask(path as string),\n ),\n };\n}\n","import { getDeepValue } from \"../utils\";\nimport type { BitStoreApi } from \"../store/contracts/public/store-api-types\";\nimport type {\n BitArrayItem,\n BitArrayPath,\n BitPathValue,\n} from \"../store/contracts/types\";\n\nexport interface BitArrayBindingField<TItem> {\n key: string;\n value: TItem;\n index: number;\n}\n\nexport interface BitArrayBindingController<\n TForm extends object,\n P extends BitArrayPath<TForm>,\n> {\n readItems(): BitArrayItem<BitPathValue<TForm, P>>[];\n getFields(\n items: BitArrayItem<BitPathValue<TForm, P>>[],\n ): BitArrayBindingField<BitArrayItem<BitPathValue<TForm, P>>>[];\n append(value: BitArrayItem<BitPathValue<TForm, P>>): void;\n prepend(value: BitArrayItem<BitPathValue<TForm, P>>): void;\n insert(index: number, value: BitArrayItem<BitPathValue<TForm, P>>): void;\n remove(index: number): void;\n move(from: number, to: number): void;\n swap(indexA: number, indexB: number): void;\n replace(items: BitArrayItem<BitPathValue<TForm, P>>[]): void;\n clear(): void;\n}\n\nexport function createArrayBindingController<\n TForm extends object,\n P extends BitArrayPath<TForm>,\n>(store: BitStoreApi<TForm>, path: P): BitArrayBindingController<TForm, P> {\n type Item = BitArrayItem<BitPathValue<TForm, P>>;\n\n let ids: string[] = [];\n\n const createId = (index?: number) =>\n store.feature.createArrayItemId(path as string, index);\n\n const normalizeItems = (value: unknown): Item[] =>\n Array.isArray(value) ? (value as Item[]) : [];\n\n const syncIds = (items: Item[]): Item[] => {\n if (items.length !== ids.length) {\n if (items.length > ids.length) {\n const diff = items.length - ids.length;\n ids = [\n ...ids,\n ...Array.from({ length: diff }, (_, offset) =>\n createId(ids.length + offset),\n ),\n ];\n } else {\n ids = ids.slice(0, items.length);\n }\n }\n\n return items;\n };\n\n return {\n readItems() {\n const value = getDeepValue(\n store.read.getState().values,\n path as string,\n ) as BitPathValue<TForm, P> | undefined;\n return syncIds(normalizeItems(value));\n },\n\n getFields(items) {\n return items.map((item, index) => ({\n key: ids[index] || `temp-${index}`,\n value: item,\n index,\n }));\n },\n\n append(value) {\n ids = [...ids, createId(ids.length)];\n store.feature.pushItem(path, value);\n },\n\n prepend(value) {\n ids = [createId(0), ...ids];\n store.feature.prependItem(path, value);\n },\n\n insert(index, value) {\n const nextIds = [...ids];\n nextIds.splice(index, 0, createId(index));\n ids = nextIds;\n store.feature.insertItem(path, index, value);\n },\n\n remove(index) {\n ids = ids.filter((_, currentIndex) => currentIndex !== index);\n store.feature.removeItem(path, index);\n },\n\n move(from, to) {\n const nextIds = [...ids];\n const [item] = nextIds.splice(from, 1);\n nextIds.splice(to, 0, item);\n ids = nextIds;\n store.feature.moveItem(path, from, to);\n },\n\n swap(indexA, indexB) {\n const nextIds = [...ids];\n [nextIds[indexA], nextIds[indexB]] = [nextIds[indexB], nextIds[indexA]];\n ids = nextIds;\n store.feature.swapItems(path, indexA, indexB);\n },\n\n replace(items) {\n ids = items.map((_, index) => createId(index));\n store.feature.replaceItems(path, items);\n },\n\n clear() {\n ids = [];\n store.feature.clearItems(path);\n },\n };\n}\n","type FieldCleanupStore = {\n feature?: {\n unregisterField?: (path: string) => void;\n };\n};\n\ntype PrefixCleanupStore = {\n feature?: {\n unregisterPrefix?: (prefix: string) => void;\n };\n};\n\nexport function cleanupRegisteredField(\n store: FieldCleanupStore,\n path: string,\n): void {\n store.feature?.unregisterField?.(path);\n}\n\nexport function cleanupRegisteredPrefix(\n store: PrefixCleanupStore,\n prefix: string,\n): void {\n store.feature?.unregisterPrefix?.(prefix);\n}\n"],"mappings":"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","names":["readFormMetaSnapshot","store","state","subscribeFormMetaSnapshot","listener","observeFormMetaSnapshot","readPersistMetaSnapshot","store","subscribePersistMetaSnapshot","listener","observePersistMetaSnapshot","meta","executeSubmitHandler","handler","values","dirtyValues","handlers","result","error","isValidationErrorShape","extractServerErrors","preventFormEvent","event","options","createFormController","store","runtime","onSuccess","handler","values","dirtyValues","executeSubmitHandler","result","serverErrors","error","createFrameworkFormBinding","store","runtime","options","controllerStore","createFormController","createMaskedFieldController","store","path","resolveMask","value","mask","parseMaskedInput","formatMaskedValue","createFrameworkMaskedFieldBinding","store","path","createMaskedFieldController","targetPath","value","createArrayBindingController","store","path","ids","createId","index","normalizeItems","value","syncIds","items","diff","_","offset","getDeepValue","item","nextIds","currentIndex","from","to","indexA","indexB","cleanupRegisteredField","store","path","cleanupRegisteredPrefix","prefix"]}
@@ -0,0 +1,2 @@
1
+ function a(t,e){let o=Object.keys(t),s=Object.keys(e);return o.length!==s.length?!1:o.every(r=>t[r]===e[r])}function n(t,e){return t.hasErrors===e.hasErrors&&t.isDirty===e.isDirty&&a(t.errors,e.errors)}function c(t){return[...t,"isDirty"]}function y(t){return`__scope__.${t}`}function p(t,e){return t.canUndo===e.canUndo&&t.canRedo===e.canRedo&&t.historyIndex===e.historyIndex&&t.historySize===e.historySize}function i(t){let e=t.read.getHistoryMetadata();return{canUndo:e.canUndo,canRedo:e.canRedo,historyIndex:e.historyIndex,historySize:e.historySize}}function u(t,e){return e(i(t)),t.observe.subscribeHistoryMeta(()=>{e(i(t))})}function h(){return"__history__"}export{a,n as b,c,y as d,p as e,i as f,u as g,h};
2
+ //# sourceMappingURL=chunk-EQ55DKX2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/store/shared/scope-status.ts","../src/core/history-status.ts"],"sourcesContent":["import type { ScopeStatus } from \"../contracts/types\";\n\nexport function areScopeErrorsEqual(\n currentErrors: Record<string, string>,\n nextErrors: Record<string, string>,\n): boolean {\n const currentKeys = Object.keys(currentErrors);\n const nextKeys = Object.keys(nextErrors);\n\n if (currentKeys.length !== nextKeys.length) {\n return false;\n }\n\n return currentKeys.every((key) => currentErrors[key] === nextErrors[key]);\n}\n\nexport function isScopeStatusEqual(\n currentStatus: ScopeStatus,\n nextStatus: ScopeStatus,\n): boolean {\n return (\n currentStatus.hasErrors === nextStatus.hasErrors &&\n currentStatus.isDirty === nextStatus.isDirty &&\n areScopeErrorsEqual(currentStatus.errors, nextStatus.errors)\n );\n}\n\nexport function getScopeSubscriptionPaths(scopeFields: readonly string[]) {\n return [...scopeFields, \"isDirty\"];\n}\n\nexport function getScopeRegistrySubscriptionPath(scopeName: string) {\n return `__scope__.${scopeName}`;\n}\n","import type { BitHistoryMetadata } from \"./store/contracts/public/meta-types\";\n\n/**\n * Subconjunto relevante de BitHistoryMetadata para comparação de igualdade.\n * Evita re-renders/updates desnecessários quando o estado de histórico não muda.\n */\nexport type HistoryMeta = Pick<\n BitHistoryMetadata,\n \"canUndo\" | \"canRedo\" | \"historyIndex\" | \"historySize\"\n>;\n\n/**\n * Compara dois snapshots de metadata de histórico por valor.\n * Retorna `true` quando todos os campos relevantes são idênticos,\n * permitindo que os bindings de framework ignorem atualizações não relacionadas.\n */\nexport function isHistoryMetaEqual(a: HistoryMeta, b: HistoryMeta): boolean {\n return (\n a.canUndo === b.canUndo &&\n a.canRedo === b.canRedo &&\n a.historyIndex === b.historyIndex &&\n a.historySize === b.historySize\n );\n}\n\nexport function readHistoryMetaSnapshot<T extends object>(store: {\n read: {\n getHistoryMetadata(): BitHistoryMetadata;\n };\n}): HistoryMeta {\n const nextMeta = store.read.getHistoryMetadata();\n\n return {\n canUndo: nextMeta.canUndo,\n canRedo: nextMeta.canRedo,\n historyIndex: nextMeta.historyIndex,\n historySize: nextMeta.historySize,\n };\n}\n\nexport function observeHistoryMetaSnapshot<T extends object>(\n store: {\n read: {\n getHistoryMetadata(): BitHistoryMetadata;\n };\n observe: {\n subscribeHistoryMeta(\n listener: (meta: BitHistoryMetadata) => void,\n ): () => void;\n };\n },\n listener: (meta: HistoryMeta) => void,\n): () => void {\n listener(readHistoryMetaSnapshot(store));\n\n return store.observe.subscribeHistoryMeta(() => {\n listener(readHistoryMetaSnapshot(store));\n });\n}\n\nexport function getHistorySubscriptionPath() {\n return \"__history__\";\n}\n"],"mappings":"AAEO,SAASA,EACdC,EACAC,EACS,CACT,IAAMC,EAAc,OAAO,KAAKF,CAAa,EACvCG,EAAW,OAAO,KAAKF,CAAU,EAEvC,OAAIC,EAAY,SAAWC,EAAS,OAC3B,GAGFD,EAAY,MAAOE,GAAQJ,EAAcI,CAAG,IAAMH,EAAWG,CAAG,CAAC,CAC1E,CAEO,SAASC,EACdC,EACAC,EACS,CACT,OACED,EAAc,YAAcC,EAAW,WACvCD,EAAc,UAAYC,EAAW,SACrCR,EAAoBO,EAAc,OAAQC,EAAW,MAAM,CAE/D,CAEO,SAASC,EAA0BC,EAAgC,CACxE,MAAO,CAAC,GAAGA,EAAa,SAAS,CACnC,CAEO,SAASC,EAAiCC,EAAmB,CAClE,MAAO,aAAaA,CAAS,EAC/B,CCjBO,SAASC,EAAmBC,EAAgBC,EAAyB,CAC1E,OACED,EAAE,UAAYC,EAAE,SAChBD,EAAE,UAAYC,EAAE,SAChBD,EAAE,eAAiBC,EAAE,cACrBD,EAAE,cAAgBC,EAAE,WAExB,CAEO,SAASC,EAA0CC,EAI1C,CACd,IAAMC,EAAWD,EAAM,KAAK,mBAAmB,EAE/C,MAAO,CACL,QAASC,EAAS,QAClB,QAASA,EAAS,QAClB,aAAcA,EAAS,aACvB,YAAaA,EAAS,WACxB,CACF,CAEO,SAASC,EACdF,EAUAG,EACY,CACZ,OAAAA,EAASJ,EAAwBC,CAAK,CAAC,EAEhCA,EAAM,QAAQ,qBAAqB,IAAM,CAC9CG,EAASJ,EAAwBC,CAAK,CAAC,CACzC,CAAC,CACH,CAEO,SAASI,GAA6B,CAC3C,MAAO,aACT","names":["areScopeErrorsEqual","currentErrors","nextErrors","currentKeys","nextKeys","key","isScopeStatusEqual","currentStatus","nextStatus","getScopeSubscriptionPaths","scopeFields","getScopeRegistrySubscriptionPath","scopeName","isHistoryMetaEqual","a","b","readHistoryMetaSnapshot","store","nextMeta","observeHistoryMetaSnapshot","listener","getHistorySubscriptionPath"]}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});function a(n,t,e){return async o=>{if(o){e.setLoading(!0),e.setError(n,void 0);try{let r=await t(o);e.setValue(r.url),e.setUploadKey(r.key),e.setError(n,void 0)}catch(r){let d=r instanceof Error?r.message:"Upload failed";e.setError(n,d)}finally{e.setLoading(!1)}}}}function l(n,t,e){return async()=>{let o=e.getUploadKey();if(o&&t)try{await t(o)}catch(r){let d=r instanceof Error?r.message:"Delete failed";e.setError(n,d);return}e.setValue(null),e.setUploadKey(null),e.setError(n,void 0)}}exports.a = a; exports.b = l;
2
+ //# sourceMappingURL=chunk-IV32WXCF.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/adapters/upload-kernel.ts"],"names":["createUploadHandler","fieldPath","uploadFn","callbacks","file","result","error","message","createRemoveHandler","deleteFile","uploadKey"],"mappings":"AAqCO,kFAASA,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACkD,CAClD,OAAO,MAAOC,CAAAA,EAAS,CACrB,EAAA,CAAKA,CAAAA,CAEL,CAAAD,CAAAA,CAAU,UAAA,CAAW,CAAA,CAAI,CAAA,CACzBA,CAAAA,CAAU,QAAA,CAASF,CAAAA,CAAW,KAAA,CAAS,CAAA,CAEvC,GAAI,CACF,IAAMI,CAAAA,CAAS,MAAMH,CAAAA,CAASE,CAAI,CAAA,CAElCD,CAAAA,CAAU,QAAA,CAASE,CAAAA,CAAO,GAAG,CAAA,CAC7BF,CAAAA,CAAU,YAAA,CAAaE,CAAAA,CAAO,GAAG,CAAA,CACjCF,CAAAA,CAAU,QAAA,CAASF,CAAAA,CAAW,KAAA,CAAS,CACzC,CAAA,KAAA,CAASK,CAAAA,CAAO,CACd,IAAMC,CAAAA,CAAUD,EAAAA,WAAiB,KAAA,CAAQA,CAAAA,CAAM,OAAA,CAAU,eAAA,CACzDH,CAAAA,CAAU,QAAA,CAASF,CAAAA,CAAWM,CAAO,CACvC,CAAA,OAAE,CACAJ,CAAAA,CAAU,UAAA,CAAW,CAAA,CAAK,CAC5B,CAAA,CACF,CACF,CAKO,SAASK,CAAAA,CACdP,CAAAA,CACAQ,CAAAA,CACAN,CAAAA,CACqB,CACrB,OAAO,KAAA,CAAA,CAAA,EAAY,CACjB,IAAMO,CAAAA,CAAYP,CAAAA,CAAU,YAAA,CAAa,CAAA,CAEzC,EAAA,CAAIO,CAAAA,EAAaD,CAAAA,CACf,GAAI,CACF,MAAMA,CAAAA,CAAWC,CAAS,CAC5B,CAAA,KAAA,CAASJ,CAAAA,CAAO,CACd,IAAMC,CAAAA,CACJD,EAAAA,WAAiB,KAAA,CAAQA,CAAAA,CAAM,OAAA,CAAU,eAAA,CAC3CH,CAAAA,CAAU,QAAA,CAASF,CAAAA,CAAWM,CAAO,CAAA,CACrC,MACF,CAGFJ,CAAAA,CAAU,QAAA,CAAS,IAAI,CAAA,CACvBA,CAAAA,CAAU,YAAA,CAAa,IAAI,CAAA,CAC3BA,CAAAA,CAAU,QAAA,CAASF,CAAAA,CAAW,KAAA,CAAS,CACzC,CACF,CAAA,6BAAA","file":"/home/runner/work/bit-form/bit-form/dist/chunk-IV32WXCF.cjs","sourcesContent":["/**\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"]}
@@ -0,0 +1,2 @@
1
+ import{a as c,c as v}from"./chunk-K5X37E3U.js";import{a as g}from"./chunk-UQ3DSUWC.js";function R(e){return{values:e.values,errors:e.errors,touched:e.touched,isValid:e.isValid,isDirty:e.isDirty,isSubmitting:e.isSubmitting,isValidating:e.isValidating,persist:e.persist}}function k(e){let o=e.getHistoryMetadata();return{...R(e.getState()),_meta:{canUndo:o.canUndo,canRedo:o.canRedo,totalSteps:o.historySize,currentIndex:o.historyIndex}}}function b(e){let o={};for(let[t,i]of Object.entries(e))o[t]=k(i);return o}function w(e){if(!e||typeof e!="object")return!1;let o=e;return typeof o.getState=="function"&&typeof o.getHistoryMetadata=="function"}function I(e){if(!w(e))return!1;let o=e;return typeof o.undo=="function"&&typeof o.redo=="function"&&typeof o.reset=="function"}function B(e,o){let t=e[o];return I(t)?t:null}var S=null,O=50;function N(e,o=g){S&&(console.warn("[bit-form] Reiniciando ponte do DevTools (Fast Refresh detectado)."),S());let t=null,i=null,f,n=null,a=new Set,T=!1,u=r=>{t?.readyState===WebSocket.OPEN&&t.send(JSON.stringify(r))},h=()=>{if(a.size===0)return;let r=b(Array.from(a).reduce((s,l)=>{let d=o.stores[l];return d&&(s[l]=d),s},{}));a.clear(),n=null,Object.keys(r).length>0&&u({type:"STATE_UPDATE",protocolVersion:1,payload:r})},D=()=>{n||(n=setTimeout(()=>{h()},O))},y=()=>{T=!1,t=new WebSocket(e),t.onopen=()=>{console.log("[bit-form] \u{1F50C} Conectado ao CLI DevTools via WebSocket."),u({type:"HELLO",protocolVersion:1,payload:{role:"server",protocolVersion:1}});let r=b(o.stores);Object.keys(r).length>0&&u({type:"STATE_UPDATE",protocolVersion:1,payload:r}),i=o.subscribe((s,l)=>{a.add(s),D()}),f=setInterval(()=>{u({type:"PING",protocolVersion:1})},3e4)},t.onmessage=r=>{try{let s=JSON.parse(r.data);if(v(s)){let{storeId:l,action:d}=s.payload,p=B(o.stores,l);if(!p)return;switch(d){case"undo":p.undo();break;case"redo":p.redo();break;case"reset":p.reset();break}}}catch(s){console.warn("[bit-form] Erro ao processar comando do CLI:",s)}},t.onclose=()=>{i&&i(),clearInterval(f),n&&(clearTimeout(n),n=null),a.clear(),T?console.log("[bit-form] Ponte antiga encerrada com sucesso."):(console.log("[bit-form] Conex\xE3o perdida. Reconectando em 3s..."),setTimeout(y,3e3))}};y();let m=()=>{T=!0,i&&i(),clearInterval(f),n&&(clearTimeout(n),n=null),a.clear(),t&&(t.readyState===WebSocket.OPEN||t.readyState===WebSocket.CONNECTING)&&t.close(),S=null};return S=m,m}export{b as a,B as b,N as c};
2
+ //# sourceMappingURL=chunk-JC4R5WCC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/devtools/store-snapshot.ts","../src/devtools/store-port.ts","../src/devtools/bridge.ts"],"sourcesContent":["import type { BitBusStorePort, BitState } from \"../core\";\nimport type { DevToolsStoreSnapshot, DevToolsStoreSnapshots } from \"./protocol\";\n\nfunction normalizeStoreState<T extends object>(\n state: Readonly<BitState<T>>,\n): Omit<DevToolsStoreSnapshot, \"_meta\"> {\n return {\n values: state.values,\n errors: state.errors as Record<string, unknown>,\n touched: state.touched as Record<string, unknown>,\n isValid: state.isValid,\n isDirty: state.isDirty,\n isSubmitting: state.isSubmitting,\n isValidating: state.isValidating as Record<string, unknown>,\n persist: state.persist,\n };\n}\n\nexport function createDevToolsStoreSnapshot<T extends object>(store: {\n getState: () => Readonly<BitState<T>>;\n getHistoryMetadata: () => {\n canUndo: boolean;\n canRedo: boolean;\n historySize: number;\n historyIndex: number;\n };\n}): DevToolsStoreSnapshot {\n const historyMeta = store.getHistoryMetadata();\n\n return {\n ...normalizeStoreState(store.getState()),\n _meta: {\n canUndo: historyMeta.canUndo,\n canRedo: historyMeta.canRedo,\n totalSteps: historyMeta.historySize,\n currentIndex: historyMeta.historyIndex,\n },\n };\n}\n\nexport function createDevToolsSnapshotMap(\n stores: Record<string, BitBusStorePort<object>>,\n): DevToolsStoreSnapshots {\n const snapshots: DevToolsStoreSnapshots = {};\n\n for (const [storeId, instance] of Object.entries(stores)) {\n snapshots[storeId] = createDevToolsStoreSnapshot(instance);\n }\n\n return snapshots;\n}\n","import type { BitBusStorePort } from \"../core\";\n\nexport type BitDevToolsReadableStore<T extends object = object> =\n BitBusStorePort<T>;\n\nexport type BitDevToolsActionableStore<T extends object = object> =\n BitBusStorePort<T>;\n\nexport function isDevToolsReadableStore(\n value: unknown,\n): value is BitDevToolsReadableStore<object> {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const candidate = value as unknown as Record<string, unknown>;\n\n return (\n typeof candidate.getState === \"function\" &&\n typeof candidate.getHistoryMetadata === \"function\"\n );\n}\n\nexport function isDevToolsActionableStore(\n value: unknown,\n): value is BitDevToolsActionableStore<object> {\n if (!isDevToolsReadableStore(value)) {\n return false;\n }\n\n const candidate = value as unknown as Record<string, unknown>;\n\n return (\n typeof candidate.undo === \"function\" &&\n typeof candidate.redo === \"function\" &&\n typeof candidate.reset === \"function\"\n );\n}\n\nexport function getDevToolsActionableStore(\n stores: Record<string, unknown>,\n storeId: string,\n): BitDevToolsActionableStore<object> | null {\n const candidate = stores[storeId];\n return isDevToolsActionableStore(candidate) ? candidate : null;\n}\n","import { bitBus } from \"../core\";\nimport type { BitBus } from \"../core\";\nimport type { BitBusStorePort } from \"../core\";\nimport { DEVTOOLS_PROTOCOL_VERSION, isDevToolsActionMessage } from \"./protocol\";\nimport { createDevToolsSnapshotMap } from \"./store-snapshot\";\nimport { getDevToolsActionableStore } from \"./store-port\";\n\nlet activeBridgeCleanup: (() => void) | null = null;\nconst STATE_BATCH_INTERVAL_MS = 50;\n\nexport function setupRemoteBridge(url: string, bus: BitBus = bitBus) {\n if (activeBridgeCleanup) {\n console.warn(\n \"[bit-form] Reiniciando ponte do DevTools (Fast Refresh detectado).\",\n );\n activeBridgeCleanup();\n }\n\n let socket: WebSocket | null = null;\n let unsubscribeBus: (() => void) | null = null;\n let heartbeatInterval: ReturnType<typeof setInterval>;\n let batchFlushTimeout: ReturnType<typeof setTimeout> | null = null;\n const pendingStoreIds = new Set<string>();\n let isIntentionalDisconnect = false;\n\n const sendWhenOpen = (message: Record<string, unknown>) => {\n if (socket?.readyState !== WebSocket.OPEN) {\n return;\n }\n\n socket.send(JSON.stringify(message));\n };\n\n const flushPendingStoreUpdates = () => {\n if (pendingStoreIds.size === 0) {\n return;\n }\n\n const payload = createDevToolsSnapshotMap(\n Array.from(pendingStoreIds).reduce<\n Record<string, BitBusStorePort<object>>\n >((acc, storeId) => {\n const storeInstance = bus.stores[storeId];\n if (storeInstance) {\n acc[storeId] = storeInstance;\n }\n return acc;\n }, {}),\n );\n\n pendingStoreIds.clear();\n batchFlushTimeout = null;\n\n if (Object.keys(payload).length > 0) {\n sendWhenOpen({\n type: \"STATE_UPDATE\",\n protocolVersion: DEVTOOLS_PROTOCOL_VERSION,\n payload,\n });\n }\n };\n\n const scheduleStoreFlush = () => {\n if (batchFlushTimeout) {\n return;\n }\n\n batchFlushTimeout = setTimeout(() => {\n flushPendingStoreUpdates();\n }, STATE_BATCH_INTERVAL_MS);\n };\n\n const connect = () => {\n isIntentionalDisconnect = false;\n socket = new WebSocket(url);\n\n socket.onopen = () => {\n console.log(\"[bit-form] 🔌 Conectado ao CLI DevTools via WebSocket.\");\n\n sendWhenOpen({\n type: \"HELLO\",\n protocolVersion: DEVTOOLS_PROTOCOL_VERSION,\n payload: { role: \"server\", protocolVersion: DEVTOOLS_PROTOCOL_VERSION },\n });\n\n const initialState = createDevToolsSnapshotMap(bus.stores);\n if (Object.keys(initialState).length > 0) {\n sendWhenOpen({\n type: \"STATE_UPDATE\",\n protocolVersion: DEVTOOLS_PROTOCOL_VERSION,\n payload: initialState,\n });\n }\n\n unsubscribeBus = bus.subscribe((storeId, _newState) => {\n pendingStoreIds.add(storeId);\n scheduleStoreFlush();\n });\n\n heartbeatInterval = setInterval(() => {\n sendWhenOpen({\n type: \"PING\",\n protocolVersion: DEVTOOLS_PROTOCOL_VERSION,\n });\n }, 30000);\n };\n\n socket.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data) as unknown;\n\n if (isDevToolsActionMessage(message)) {\n const { storeId, action } = message.payload;\n const store = getDevToolsActionableStore(bus.stores, storeId);\n\n if (!store) {\n return;\n }\n\n switch (action) {\n case \"undo\":\n store.undo();\n break;\n case \"redo\":\n store.redo();\n break;\n case \"reset\":\n store.reset();\n break;\n }\n }\n } catch (e) {\n console.warn(\"[bit-form] Erro ao processar comando do CLI:\", e);\n }\n };\n\n socket.onclose = () => {\n if (unsubscribeBus) unsubscribeBus();\n clearInterval(heartbeatInterval);\n if (batchFlushTimeout) {\n clearTimeout(batchFlushTimeout);\n batchFlushTimeout = null;\n }\n pendingStoreIds.clear();\n\n if (!isIntentionalDisconnect) {\n console.log(\"[bit-form] Conexão perdida. Reconectando em 3s...\");\n setTimeout(connect, 3000);\n } else {\n console.log(\"[bit-form] Ponte antiga encerrada com sucesso.\");\n }\n };\n };\n\n connect();\n\n const cleanup = () => {\n isIntentionalDisconnect = true;\n\n if (unsubscribeBus) unsubscribeBus();\n clearInterval(heartbeatInterval);\n if (batchFlushTimeout) {\n clearTimeout(batchFlushTimeout);\n batchFlushTimeout = null;\n }\n pendingStoreIds.clear();\n if (\n socket &&\n (socket.readyState === WebSocket.OPEN ||\n socket.readyState === WebSocket.CONNECTING)\n ) {\n socket.close();\n }\n activeBridgeCleanup = null;\n };\n\n activeBridgeCleanup = cleanup;\n\n return cleanup;\n}\n"],"mappings":"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","names":["normalizeStoreState","state","createDevToolsStoreSnapshot","store","historyMeta","createDevToolsSnapshotMap","stores","snapshots","storeId","instance","isDevToolsReadableStore","value","candidate","isDevToolsActionableStore","getDevToolsActionableStore","stores","storeId","activeBridgeCleanup","STATE_BATCH_INTERVAL_MS","setupRemoteBridge","url","bus","bitBus","socket","unsubscribeBus","heartbeatInterval","batchFlushTimeout","pendingStoreIds","isIntentionalDisconnect","sendWhenOpen","message","flushPendingStoreUpdates","payload","createDevToolsSnapshotMap","acc","storeId","storeInstance","scheduleStoreFlush","connect","initialState","_newState","event","isDevToolsActionMessage","action","store","getDevToolsActionableStore","e","cleanup"]}
@@ -0,0 +1,2 @@
1
+ var r=1;function n(o){return o.protocolVersion===1}function s(o){if(!o||typeof o!="object")return!1;let e=o;return typeof e.storeId=="string"&&(e.action==="undo"||e.action==="redo"||e.action==="reset")}function a(o){if(!o||typeof o!="object")return!1;let e=o;return e.type==="ACTION"&&n(e)&&s(e.payload)}function l(o){if(!o||typeof o!="object")return!1;let e=o;return e.type==="STATE_UPDATE"&&n(e)}function i(o){if(!o||typeof o!="object")return!1;let e=o;return e.type==="PING"&&n(e)}function c(o){if(!o||typeof o!="object")return!1;let e=o;if(e.type!=="HELLO"||!e.payload||!n(e))return!1;let t=e.payload;return(t.role==="client"||t.role==="server")&&t.protocolVersion===1}export{r as a,s as b,a as c,l as d,i as e,c as f};
2
+ //# sourceMappingURL=chunk-K5X37E3U.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/devtools/protocol.ts"],"sourcesContent":["export type DevToolsActionName = \"undo\" | \"redo\" | \"reset\";\n\nexport const DEVTOOLS_PROTOCOL_VERSION = 1;\n\nexport interface DevToolsProtocolMessageBase {\n protocolVersion: number;\n}\n\nexport interface DevToolsHistoryMeta {\n canUndo: boolean;\n canRedo: boolean;\n totalSteps: number;\n currentIndex: number;\n}\n\nexport interface DevToolsStoreSnapshot {\n values: unknown;\n errors: Record<string, unknown>;\n touched: Record<string, unknown>;\n isValid: boolean;\n isDirty: boolean;\n isSubmitting: boolean;\n isValidating?: Record<string, unknown>;\n persist?: unknown;\n _meta: DevToolsHistoryMeta;\n}\n\nexport type DevToolsStoreSnapshots = Record<string, DevToolsStoreSnapshot>;\n\nexport interface DevToolsActionPayload {\n storeId: string;\n action: DevToolsActionName;\n}\n\nexport interface DevToolsStateUpdateMessage extends DevToolsProtocolMessageBase {\n type: \"STATE_UPDATE\";\n payload: DevToolsStoreSnapshots;\n}\n\nexport interface DevToolsPingMessage extends DevToolsProtocolMessageBase {\n type: \"PING\";\n}\n\nexport interface DevToolsActionMessage extends DevToolsProtocolMessageBase {\n type: \"ACTION\";\n payload: DevToolsActionPayload;\n}\n\nexport interface DevToolsHelloPayload {\n role: \"client\" | \"server\";\n protocolVersion: number;\n}\n\nexport interface DevToolsHelloMessage extends DevToolsProtocolMessageBase {\n type: \"HELLO\";\n payload: DevToolsHelloPayload;\n}\n\nexport type DevToolsRemoteMessage =\n | DevToolsStateUpdateMessage\n | DevToolsPingMessage\n | DevToolsActionMessage\n | DevToolsHelloMessage;\n\nfunction hasSupportedProtocolVersion(candidate: { protocolVersion?: unknown }) {\n return candidate.protocolVersion === DEVTOOLS_PROTOCOL_VERSION;\n}\n\nexport function isDevToolsActionPayload(\n payload: unknown,\n): payload is DevToolsActionPayload {\n if (!payload || typeof payload !== \"object\") {\n return false;\n }\n\n const candidate = payload as {\n storeId?: unknown;\n action?: unknown;\n };\n\n return (\n typeof candidate.storeId === \"string\" &&\n (candidate.action === \"undo\" ||\n candidate.action === \"redo\" ||\n candidate.action === \"reset\")\n );\n}\n\nexport function isDevToolsActionMessage(\n message: unknown,\n): message is DevToolsActionMessage {\n if (!message || typeof message !== \"object\") {\n return false;\n }\n\n const candidate = message as {\n type?: unknown;\n payload?: unknown;\n protocolVersion?: unknown;\n };\n\n return (\n candidate.type === \"ACTION\" &&\n hasSupportedProtocolVersion(candidate) &&\n isDevToolsActionPayload(candidate.payload)\n );\n}\n\nexport function isDevToolsStateUpdateMessage(\n message: unknown,\n): message is DevToolsStateUpdateMessage {\n if (!message || typeof message !== \"object\") {\n return false;\n }\n\n const candidate = message as {\n type?: unknown;\n protocolVersion?: unknown;\n };\n\n return (\n candidate.type === \"STATE_UPDATE\" && hasSupportedProtocolVersion(candidate)\n );\n}\n\nexport function isDevToolsPingMessage(\n message: unknown,\n): message is DevToolsPingMessage {\n if (!message || typeof message !== \"object\") {\n return false;\n }\n\n const candidate = message as {\n type?: unknown;\n protocolVersion?: unknown;\n };\n\n return candidate.type === \"PING\" && hasSupportedProtocolVersion(candidate);\n}\n\nexport function isDevToolsHelloMessage(\n message: unknown,\n): message is DevToolsHelloMessage {\n if (!message || typeof message !== \"object\") {\n return false;\n }\n\n const candidate = message as {\n type?: unknown;\n payload?: unknown;\n protocolVersion?: unknown;\n };\n\n if (\n candidate.type !== \"HELLO\" ||\n !candidate.payload ||\n !hasSupportedProtocolVersion(candidate)\n ) {\n return false;\n }\n\n const payload = candidate.payload as {\n role?: unknown;\n protocolVersion?: unknown;\n };\n\n return (\n (payload.role === \"client\" || payload.role === \"server\") &&\n payload.protocolVersion === DEVTOOLS_PROTOCOL_VERSION\n );\n}\n"],"mappings":"AAEO,IAAMA,EAA4B,EA8DzC,SAASC,EAA4BC,EAA0C,CAC7E,OAAOA,EAAU,kBAAoB,CACvC,CAEO,SAASC,EACdC,EACkC,CAClC,GAAI,CAACA,GAAW,OAAOA,GAAY,SACjC,MAAO,GAGT,IAAMF,EAAYE,EAKlB,OACE,OAAOF,EAAU,SAAY,WAC5BA,EAAU,SAAW,QACpBA,EAAU,SAAW,QACrBA,EAAU,SAAW,QAE3B,CAEO,SAASG,EACdC,EACkC,CAClC,GAAI,CAACA,GAAW,OAAOA,GAAY,SACjC,MAAO,GAGT,IAAMJ,EAAYI,EAMlB,OACEJ,EAAU,OAAS,UACnBD,EAA4BC,CAAS,GACrCC,EAAwBD,EAAU,OAAO,CAE7C,CAEO,SAASK,EACdD,EACuC,CACvC,GAAI,CAACA,GAAW,OAAOA,GAAY,SACjC,MAAO,GAGT,IAAMJ,EAAYI,EAKlB,OACEJ,EAAU,OAAS,gBAAkBD,EAA4BC,CAAS,CAE9E,CAEO,SAASM,EACdF,EACgC,CAChC,GAAI,CAACA,GAAW,OAAOA,GAAY,SACjC,MAAO,GAGT,IAAMJ,EAAYI,EAKlB,OAAOJ,EAAU,OAAS,QAAUD,EAA4BC,CAAS,CAC3E,CAEO,SAASO,EACdH,EACiC,CACjC,GAAI,CAACA,GAAW,OAAOA,GAAY,SACjC,MAAO,GAGT,IAAMJ,EAAYI,EAMlB,GACEJ,EAAU,OAAS,SACnB,CAACA,EAAU,SACX,CAACD,EAA4BC,CAAS,EAEtC,MAAO,GAGT,IAAME,EAAUF,EAAU,QAK1B,OACGE,EAAQ,OAAS,UAAYA,EAAQ,OAAS,WAC/CA,EAAQ,kBAAoB,CAEhC","names":["DEVTOOLS_PROTOCOL_VERSION","hasSupportedProtocolVersion","candidate","isDevToolsActionPayload","payload","isDevToolsActionMessage","message","isDevToolsStateUpdateMessage","isDevToolsPingMessage","isDevToolsHelloMessage"]}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkT2JRSWQUcjs = require('./chunk-T2JRSWQU.cjs');function o(e,i){return i&&i.value===e.value&&i.error===e.error&&i.touched===e.touched&&i.isHidden===e.isHidden&&i.isRequired===e.isRequired&&i.isDirty===e.isDirty&&i.isValidating===e.isValidating?i:{value:e.value,error:e.error,touched:e.touched,isHidden:e.isHidden,isRequired:e.isRequired,isDirty:e.isDirty,isValidating:e.isValidating}}function l(e,i){return e===i?!0:!e||!i?!1:_chunkT2JRSWQUcjs.d.call(void 0, e.value,i.value)&&e.error===i.error&&e.touched===i.touched&&e.isHidden===i.isHidden&&e.isRequired===i.isRequired&&e.isDirty===i.isDirty&&e.isValidating===i.isValidating}function u(e){let i=e.touched?e.error:void 0,d=!!e.error;return{error:i,touched:e.touched,invalid:!!(e.touched&&e.error),isValidating:e.isValidating,isDirty:e.isDirty,isHidden:e.isHidden,isRequired:e.isRequired,hasError:d}}exports.a = o; exports.b = l; exports.c = u;
2
+ //# sourceMappingURL=chunk-M6WBNHIT.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/bit-form/bit-form/dist/chunk-M6WBNHIT.cjs","../src/core/utils/field-state-snapshot.ts","../src/core/utils/field-meta.ts"],"names":["createFieldStateSnapshot","nextState","lastSnapshot","areFieldSnapshotsEqual","snapshotA","snapshotB","deepEqual","deriveFieldMeta","state","error","hasError"],"mappings":"AAAA,iIAAwC,SCyCxBA,CAAAA,CACdC,CAAAA,CASAC,CAAAA,CAC0B,CAE1B,OAAIA,CAAAA,EAEAA,CAAAA,CAAa,KAAA,GAAUD,CAAAA,CAAU,KAAA,EACjCC,CAAAA,CAAa,KAAA,GAAUD,CAAAA,CAAU,KAAA,EACjCC,CAAAA,CAAa,OAAA,GAAYD,CAAAA,CAAU,OAAA,EACnCC,CAAAA,CAAa,QAAA,GAAaD,CAAAA,CAAU,QAAA,EACpCC,CAAAA,CAAa,UAAA,GAAeD,CAAAA,CAAU,UAAA,EACtCC,CAAAA,CAAa,OAAA,GAAYD,CAAAA,CAAU,OAAA,EACnCC,CAAAA,CAAa,YAAA,GAAiBD,CAAAA,CAAU,YAAA,CAGjCC,CAAAA,CAIJ,CACL,KAAA,CAAOD,CAAAA,CAAU,KAAA,CACjB,KAAA,CAAOA,CAAAA,CAAU,KAAA,CACjB,OAAA,CAASA,CAAAA,CAAU,OAAA,CACnB,QAAA,CAAUA,CAAAA,CAAU,QAAA,CACpB,UAAA,CAAYA,CAAAA,CAAU,UAAA,CACtB,OAAA,CAASA,CAAAA,CAAU,OAAA,CACnB,YAAA,CAAcA,CAAAA,CAAU,YAC1B,CACF,CAUO,SAASE,CAAAA,CACdC,CAAAA,CACAC,CAAAA,CACS,CACT,OAAID,CAAAA,GAAcC,CAAAA,CAAkB,CAAA,CAAA,CAChC,CAACD,CAAAA,EAAa,CAACC,CAAAA,CAAkB,CAAA,CAAA,CAGnCC,iCAAAA,CAAUF,CAAU,KAAA,CAAOC,CAAAA,CAAU,KAAK,CAAA,EAC1CD,CAAAA,CAAU,KAAA,GAAUC,CAAAA,CAAU,KAAA,EAC9BD,CAAAA,CAAU,OAAA,GAAYC,CAAAA,CAAU,OAAA,EAChCD,CAAAA,CAAU,QAAA,GAAaC,CAAAA,CAAU,QAAA,EACjCD,CAAAA,CAAU,UAAA,GAAeC,CAAAA,CAAU,UAAA,EACnCD,CAAAA,CAAU,OAAA,GAAYC,CAAAA,CAAU,OAAA,EAChCD,CAAAA,CAAU,YAAA,GAAiBC,CAAAA,CAAU,YAEzC,CC3FO,SAASE,CAAAA,CACdC,CAAAA,CACqB,CACrB,IAAMC,CAAAA,CAAQD,CAAAA,CAAM,OAAA,CAAUA,CAAAA,CAAM,KAAA,CAAQ,KAAA,CAAA,CACtCE,CAAAA,CAAW,CAAC,CAACF,CAAAA,CAAM,KAAA,CAEzB,MAAO,CACL,KAAA,CAAAC,CAAAA,CACA,OAAA,CAASD,CAAAA,CAAM,OAAA,CACf,OAAA,CAAS,CAAC,CAAA,CAAEA,CAAAA,CAAM,OAAA,EAAWA,CAAAA,CAAM,KAAA,CAAA,CACnC,YAAA,CAAcA,CAAAA,CAAM,YAAA,CACpB,OAAA,CAASA,CAAAA,CAAM,OAAA,CACf,QAAA,CAAUA,CAAAA,CAAM,QAAA,CAChB,UAAA,CAAYA,CAAAA,CAAM,UAAA,CAClB,QAAA,CAAAE,CACF,CACF,CAAA,4CAAA","file":"/home/runner/work/bit-form/bit-form/dist/chunk-M6WBNHIT.cjs","sourcesContent":[null,"/**\n * Field State Snapshot Utilities\n *\n * Shared utilities for creating and managing field state snapshots across frameworks\n * (React, Vue, Angular). Reduces code duplication while maintaining type safety.\n */\n\nimport { deepEqual } from \"../utils\";\n\n/**\n * Represents a stable snapshot of field state that can be compared for equality.\n */\nexport interface BitFieldSnapshot<TValue = any> {\n value: TValue;\n error: string | undefined;\n touched: boolean;\n isHidden: boolean;\n isRequired: boolean;\n isDirty: boolean;\n isValidating: boolean;\n}\n\n/**\n * Creates or reuses a field state snapshot with shallow equality checking.\n *\n * This function prevents unnecessary re-renders in frameworks like React by\n * returning the same object reference when field state hasn't changed.\n *\n * @param nextState - The new field state from the store\n * @param lastSnapshot - The previous snapshot (can be null on first call)\n * @returns A stable snapshot object that can be used for equality comparison\n *\n * @example\n * ```typescript\n * const snapshot = createFieldStateSnapshot(store.getFieldState(\"email\"), lastSnapshot);\n * if (snapshot !== lastSnapshot) {\n * // Field state changed, update component\n * render(snapshot);\n * }\n * ```\n */\nexport function createFieldStateSnapshot<TValue = any>(\n nextState: {\n value: TValue;\n error: string | undefined;\n touched: boolean;\n isHidden: boolean;\n isRequired: boolean;\n isDirty: boolean;\n isValidating: boolean;\n },\n lastSnapshot: BitFieldSnapshot<TValue> | null,\n): BitFieldSnapshot<TValue> {\n // Use shallow equality: return cached if all fields are equal by reference\n if (lastSnapshot) {\n const shallowEqual =\n lastSnapshot.value === nextState.value &&\n lastSnapshot.error === nextState.error &&\n lastSnapshot.touched === nextState.touched &&\n lastSnapshot.isHidden === nextState.isHidden &&\n lastSnapshot.isRequired === nextState.isRequired &&\n lastSnapshot.isDirty === nextState.isDirty &&\n lastSnapshot.isValidating === nextState.isValidating;\n\n if (shallowEqual) {\n return lastSnapshot;\n }\n }\n\n return {\n value: nextState.value,\n error: nextState.error,\n touched: nextState.touched,\n isHidden: nextState.isHidden,\n isRequired: nextState.isRequired,\n isDirty: nextState.isDirty,\n isValidating: nextState.isValidating,\n };\n}\n\n/**\n * Deep comparison utility for field state snapshots.\n * Useful for scenarios where shallow comparison isn't sufficient (e.g., object/array values).\n *\n * @param snapshotA - First snapshot\n * @param snapshotB - Second snapshot\n * @returns true if snapshots are deeply equal\n */\nexport function areFieldSnapshotsEqual(\n snapshotA: BitFieldSnapshot | null | undefined,\n snapshotB: BitFieldSnapshot | null | undefined,\n): boolean {\n if (snapshotA === snapshotB) return true;\n if (!snapshotA || !snapshotB) return false;\n\n return (\n deepEqual(snapshotA.value, snapshotB.value) &&\n snapshotA.error === snapshotB.error &&\n snapshotA.touched === snapshotB.touched &&\n snapshotA.isHidden === snapshotB.isHidden &&\n snapshotA.isRequired === snapshotB.isRequired &&\n snapshotA.isDirty === snapshotB.isDirty &&\n snapshotA.isValidating === snapshotB.isValidating\n );\n}\n","import type { BitFieldState } from \"../store/contracts/types\";\n\nexport interface BitDerivedFieldMeta {\n error: string | undefined;\n touched: boolean;\n invalid: boolean;\n isValidating: boolean;\n isDirty: boolean;\n isHidden: boolean;\n isRequired: boolean;\n hasError: boolean;\n}\n\nexport function deriveFieldMeta<T extends object, TValue>(\n state: Readonly<BitFieldState<T, TValue>>,\n): BitDerivedFieldMeta {\n const error = state.touched ? state.error : undefined;\n const hasError = !!state.error;\n\n return {\n error,\n touched: state.touched,\n invalid: !!(state.touched && state.error),\n isValidating: state.isValidating,\n isDirty: state.isDirty,\n isHidden: state.isHidden,\n isRequired: state.isRequired,\n hasError,\n };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }var _chunkVZHG372Qcjs = require('./chunk-VZHG372Q.cjs');var _chunkMFTWAFMGcjs = require('./chunk-MFTWAFMG.cjs');var _chunkD7JQWF6Vcjs = require('./chunk-D7JQWF6V.cjs');var _chunkM6WBNHITcjs = require('./chunk-M6WBNHIT.cjs');var _chunkT2JRSWQUcjs = require('./chunk-T2JRSWQU.cjs');var _react = require('react');var _jsxruntime = require('react/jsx-runtime');var L=_react.createContext.call(void 0, null),dt= exports.a =({store:t,children:e})=>_jsxruntime.jsx.call(void 0, L.Provider,{value:_chunkVZHG372Qcjs.d.call(void 0, t),children:e}),c= exports.b =()=>{let t=_react.useContext.call(void 0, L);if(!t)throw new Error("BitForm hooks devem ser usados dentro de um BitFormProvider");return t};function yt(){let t=c(),[e,r]=_react.useState.call(void 0, null),[n,o]=_react.useState.call(void 0, null),s=_react.useRef.call(void 0, null),m=_react.useCallback.call(void 0, S=>_chunkMFTWAFMGcjs.b.call(void 0, t,S),[t]),l=_react.useCallback.call(void 0, ()=>{let S=_chunkMFTWAFMGcjs.a.call(void 0, t);return s.current&&s.current.isValid===S.isValid&&s.current.isDirty===S.isDirty&&s.current.isSubmitting===S.isSubmitting?s.current:(s.current=S,S)},[t]),i=_react.useSyncExternalStore.call(void 0, m,l,l),d=_react.useMemo.call(void 0, ()=>_chunkMFTWAFMGcjs.g.call(void 0, t,{clearSubmissionState:()=>{r(null),o(null)},setSubmissionResult:S=>{o(S)},setSubmissionError:S=>{r(S)}}),[t]),{controller:a,actions:h}=d,x=_react.useCallback.call(void 0, a.submit,[a]),v=_react.useCallback.call(void 0, a.onSubmit,[a]),T=_react.useCallback.call(void 0, a.reset,[a]),u=_react.useCallback.call(void 0, a.getValues,[a]),b=_react.useCallback.call(void 0, a.getErrors,[a]),B=_react.useCallback.call(void 0, a.getTouched,[a]),g=_react.useCallback.call(void 0, a.getDirtyValues,[a]);return{meta:_react.useMemo.call(void 0, ()=>({...i,submitError:e,lastResponse:n}),[i,e,n]),getValues:u,getErrors:b,getTouched:B,getDirtyValues:g,submit:x,onSubmit:v,reset:T,...h}}function Et(t){let e=c(),r=_react.useMemo.call(void 0, ()=>_chunkMFTWAFMGcjs.i.call(void 0, e,t),[e,t]),n=_react.useCallback.call(void 0, ()=>r.readItems(),[r]),o=_react.useCallback.call(void 0, l=>e.observe.subscribePath(t,()=>l()),[e,t]),s=_react.useSyncExternalStore.call(void 0, o,n,n),m=_react.useMemo.call(void 0, ()=>r.getFields(s),[r,s]);return _react.useEffect.call(void 0, ()=>()=>{_chunkMFTWAFMGcjs.k.call(void 0, e,`${t}.`)},[e,t]),{fields:m,length:s.length,append:r.append,prepend:r.prepend,insert:r.insert,remove:r.remove,move:r.move,swap:r.swap,replace:r.replace,clear:r.clear}}function Mt(t){let e=c(),r=_react.useRef.call(void 0, null),n=_react.useCallback.call(void 0, ()=>{let i=e.read.getScopeStatus(t);return r.current&&_chunkD7JQWF6Vcjs.b.call(void 0, r.current,i)?r.current:(r.current=i,i)},[e,t]),o=_react.useCallback.call(void 0, i=>e.observe.subscribeScopeStatus(t,()=>i()),[e,t]),s=_react.useSyncExternalStore.call(void 0, o,n,n),m=_react.useCallback.call(void 0, async()=>{let i=await e.write.validate({scope:t}),d=e.read.getScopeErrors(t);return{valid:i,errors:d}},[e,t]),l=_react.useCallback.call(void 0, ()=>e.read.getScopeErrors(t),[e,t]);return{scopeName:t,status:s,errors:s.errors,validate:m,getErrors:l,isValid:!s.hasErrors,isDirty:s.isDirty}}function jt(t){let e=c(),[r,n]=_react.useState.call(void 0, 0),o=_nullishCoalesce(t[r], () => ("")),s=_react.useRef.call(void 0, null),m=_react.useCallback.call(void 0, ()=>{let u=e.read.getScopeStatus(o);return s.current&&_chunkD7JQWF6Vcjs.b.call(void 0, s.current,u)?s.current:(s.current=u,u)},[e,o]),l=_react.useSyncExternalStore.call(void 0, _react.useCallback.call(void 0, u=>e.observe.subscribeScopeStatus(o,()=>u()),[e,o]),m,m),i=_react.useCallback.call(void 0, async()=>{let u=await e.write.validate({scope:o}),b=e.read.getScopeErrors(o);return{valid:u,errors:b}},[e,o]),d=_react.useCallback.call(void 0, ()=>e.read.getScopeErrors(o),[e,o]),a=_react.useCallback.call(void 0, async()=>{let u=e.read.getScopeFields(o);if(e.feature.hasValidationsInProgress(u))return!1;let b=await e.write.validate({scope:o});if(b)n(B=>Math.min(B+1,t.length-1));else{let B=e.read.getScopeErrors(o),g=Object.keys(B);g.length>0&&e.write.markFieldsTouched(g)}return b},[e,o,t.length]),h=_react.useCallback.call(void 0, ()=>{n(u=>Math.max(u-1,0))},[]),x=_react.useCallback.call(void 0, u=>{n(Math.max(0,Math.min(u-1,t.length-1)))},[t.length]),v=r===0,T=r>=t.length-1;return{step:r+1,stepIndex:r,scope:o,next:a,prev:h,goTo:x,isFirst:v,isLast:T,status:l,errors:l.errors,isValid:!l.hasErrors,isDirty:l.isDirty,validate:i,getErrors:d}}function zt(t){let e=c(),r=_react.useRef.call(void 0, null),n=_react.useCallback.call(void 0, ()=>{let s=_chunkT2JRSWQUcjs.f.call(void 0, e.read.getState().values,t);return r.current!==null&&_chunkT2JRSWQUcjs.c.call(void 0, r.current,s)?r.current:(r.current=s,s)},[e,t]),o=_react.useCallback.call(void 0, s=>e.observe.subscribePath(t,()=>s()),[e,t]);return _react.useSyncExternalStore.call(void 0, o,n,n)}function Qt(){let t=c(),e=_react.useSyncExternalStore.call(void 0, m=>_chunkMFTWAFMGcjs.e.call(void 0, t,m),()=>_chunkMFTWAFMGcjs.d.call(void 0, t),()=>_chunkMFTWAFMGcjs.d.call(void 0, t)),r=_react.useCallback.call(void 0, async()=>t.feature.restorePersisted(),[t]),n=_react.useCallback.call(void 0, async()=>{await t.feature.forceSave()},[t]),o=_react.useCallback.call(void 0, async()=>{await t.feature.clearPersisted()},[t]),s=_react.useMemo.call(void 0, ()=>({isSaving:e.isSaving,isRestoring:e.isRestoring,error:e.error}),[e]);return{restore:r,save:n,clear:o,meta:s}}function re(t){let e=c(),r=_react.useRef.call(void 0, null);_react.useEffect.call(void 0, ()=>()=>_chunkMFTWAFMGcjs.j.call(void 0, e,t),[e,t]);let n=_react.useCallback.call(void 0, ()=>{let i=e.read.getFieldState(t),d=_chunkM6WBNHITcjs.a.call(void 0, i,r.current);return r.current=d,d},[e,t]),o=_react.useCallback.call(void 0, i=>e.observe.subscribeFieldState(t,()=>i()),[e,t]),s=_react.useSyncExternalStore.call(void 0, o,n,n),m=_react.useCallback.call(void 0, i=>e.write.setField(t,i),[e,t]),l=_react.useCallback.call(void 0, ()=>e.write.blurField(t),[e,t]);return{fieldState:s,setValue:m,setBlur:l,store:e}}exports.a = dt; exports.b = c; exports.c = yt; exports.d = re; exports.e = Et; exports.f = Mt; exports.g = jt; exports.h = zt; exports.i = Qt;
2
+ //# sourceMappingURL=chunk-MFSQATNZ.cjs.map