@lehnihon/bit-form 2.2.4 → 2.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/dist/angular/index.cjs +1 -1
  2. package/dist/angular/index.cjs.map +1 -1
  3. package/dist/angular/index.d.cts +3 -2
  4. package/dist/angular/index.d.ts +3 -2
  5. package/dist/angular/index.js +1 -1
  6. package/dist/angular/index.js.map +1 -1
  7. package/dist/{bus-BQI1FIOs.d.ts → bus-B4zZmB9C.d.ts} +4 -1
  8. package/dist/{bus-a_GA51Qw.d.cts → bus-BeAeZwWu.d.cts} +4 -1
  9. package/dist/chunk-2FDEJYA5.js +2 -0
  10. package/dist/chunk-2FDEJYA5.js.map +1 -0
  11. package/dist/chunk-3CARTBEN.cjs +2 -0
  12. package/dist/chunk-3CARTBEN.cjs.map +1 -0
  13. package/dist/chunk-3NUJVIAM.js +2 -0
  14. package/dist/chunk-3NUJVIAM.js.map +1 -0
  15. package/dist/chunk-64KSP4TP.js +2 -0
  16. package/dist/chunk-64KSP4TP.js.map +1 -0
  17. package/dist/{chunk-YEXRRTI3.cjs → chunk-77PK7U73.cjs} +2 -2
  18. package/dist/{chunk-YEXRRTI3.cjs.map → chunk-77PK7U73.cjs.map} +1 -1
  19. package/dist/chunk-CTURHI75.cjs +2 -0
  20. package/dist/{chunk-CFFLDMLG.cjs.map → chunk-CTURHI75.cjs.map} +1 -1
  21. package/dist/{chunk-MQX4YS6D.cjs → chunk-DD6XWUMR.cjs} +2 -2
  22. package/dist/{chunk-MQX4YS6D.cjs.map → chunk-DD6XWUMR.cjs.map} +1 -1
  23. package/dist/{chunk-BMHK77NL.js → chunk-FGJB4DHQ.js} +2 -2
  24. package/dist/{chunk-4XLU5ZCX.js → chunk-GDRNKTHO.js} +2 -2
  25. package/dist/chunk-GUU6EXFN.js +2 -0
  26. package/dist/chunk-GUU6EXFN.js.map +1 -0
  27. package/dist/chunk-JIWR4KSZ.cjs +2 -0
  28. package/dist/chunk-JIWR4KSZ.cjs.map +1 -0
  29. package/dist/{chunk-MBTLLIBM.js → chunk-M2XR4C7T.js} +2 -2
  30. package/dist/chunk-OZKLQRO6.cjs +2 -0
  31. package/dist/chunk-OZKLQRO6.cjs.map +1 -0
  32. package/dist/chunk-PFPGASVZ.cjs +2 -0
  33. package/dist/chunk-PFPGASVZ.cjs.map +1 -0
  34. package/dist/chunk-QWH2NBVB.js +2 -0
  35. package/dist/chunk-QWH2NBVB.js.map +1 -0
  36. package/dist/chunk-UMKOKAPD.js +2 -0
  37. package/dist/chunk-UMKOKAPD.js.map +1 -0
  38. package/dist/{chunk-KYM7JG2G.cjs → chunk-UT63HKR6.cjs} +2 -2
  39. package/dist/{chunk-KYM7JG2G.cjs.map → chunk-UT63HKR6.cjs.map} +1 -1
  40. package/dist/chunk-VQ7MK5VB.cjs +2 -0
  41. package/dist/chunk-VQ7MK5VB.cjs.map +1 -0
  42. package/dist/devtools/bridge.cjs +1 -1
  43. package/dist/devtools/bridge.cjs.map +1 -1
  44. package/dist/devtools/bridge.js +1 -1
  45. package/dist/devtools/bridge.js.map +1 -1
  46. package/dist/devtools/index.cjs +2 -2
  47. package/dist/devtools/index.cjs.map +1 -1
  48. package/dist/devtools/index.js +1 -1
  49. package/dist/devtools/index.js.map +1 -1
  50. package/dist/index.cjs +1 -1
  51. package/dist/index.cjs.map +1 -1
  52. package/dist/index.d.cts +23 -49
  53. package/dist/index.d.ts +23 -49
  54. package/dist/index.js +1 -1
  55. package/dist/mask.cjs +1 -1
  56. package/dist/mask.cjs.map +1 -1
  57. package/dist/mask.js +1 -1
  58. package/dist/mask.js.map +1 -1
  59. package/dist/{public-types-D14VY_4o.d.cts → public-types-BQXaxmAE.d.cts} +7 -2
  60. package/dist/{public-types-D3WIiMGu.d.ts → public-types-CVgFf_qY.d.ts} +7 -2
  61. package/dist/react/index.cjs +1 -1
  62. package/dist/react/index.cjs.map +1 -1
  63. package/dist/react/index.d.cts +5 -5
  64. package/dist/react/index.d.ts +5 -5
  65. package/dist/react/index.js +1 -1
  66. package/dist/react/index.js.map +1 -1
  67. package/dist/react-native/index.cjs +1 -1
  68. package/dist/react-native/index.d.cts +4 -4
  69. package/dist/react-native/index.d.ts +4 -4
  70. package/dist/react-native/index.js +1 -1
  71. package/dist/resolvers/index.cjs +1 -1
  72. package/dist/resolvers/index.d.cts +1 -1
  73. package/dist/resolvers/index.d.ts +1 -1
  74. package/dist/resolvers/index.js +1 -1
  75. package/dist/resolvers/joi.cjs +1 -1
  76. package/dist/resolvers/joi.d.cts +1 -1
  77. package/dist/resolvers/joi.d.ts +1 -1
  78. package/dist/resolvers/joi.js +1 -1
  79. package/dist/resolvers/yup.cjs +1 -1
  80. package/dist/resolvers/yup.d.cts +1 -1
  81. package/dist/resolvers/yup.d.ts +1 -1
  82. package/dist/resolvers/yup.js +1 -1
  83. package/dist/resolvers/zod.cjs +1 -1
  84. package/dist/resolvers/zod.d.cts +1 -1
  85. package/dist/resolvers/zod.d.ts +1 -1
  86. package/dist/resolvers/zod.js +1 -1
  87. package/dist/{use-bit-persist-Dt4zIl2u.d.cts → use-bit-persist-CIVN-oIi.d.cts} +3 -2
  88. package/dist/{use-bit-persist-CNtQ3Gaq.d.ts → use-bit-persist-iPWLbD8l.d.ts} +3 -2
  89. package/dist/vue/index.cjs +1 -1
  90. package/dist/vue/index.cjs.map +1 -1
  91. package/dist/vue/index.d.cts +3 -2
  92. package/dist/vue/index.d.ts +3 -2
  93. package/dist/vue/index.js +1 -1
  94. package/dist/vue/index.js.map +1 -1
  95. package/package.json +20 -1
  96. package/dist/chunk-66DIO2SH.js +0 -2
  97. package/dist/chunk-66DIO2SH.js.map +0 -1
  98. package/dist/chunk-7LMNIQTT.js +0 -2
  99. package/dist/chunk-7LMNIQTT.js.map +0 -1
  100. package/dist/chunk-AE4G32HS.js +0 -2
  101. package/dist/chunk-AE4G32HS.js.map +0 -1
  102. package/dist/chunk-CFFLDMLG.cjs +0 -2
  103. package/dist/chunk-EI5L5L3R.cjs +0 -2
  104. package/dist/chunk-EI5L5L3R.cjs.map +0 -1
  105. package/dist/chunk-IV32WXCF.cjs +0 -2
  106. package/dist/chunk-IV32WXCF.cjs.map +0 -1
  107. package/dist/chunk-K5NZDYAT.js +0 -2
  108. package/dist/chunk-K5NZDYAT.js.map +0 -1
  109. package/dist/chunk-LOYB7TTM.cjs +0 -2
  110. package/dist/chunk-LOYB7TTM.cjs.map +0 -1
  111. package/dist/chunk-O5UPA33R.js +0 -2
  112. package/dist/chunk-O5UPA33R.js.map +0 -1
  113. package/dist/chunk-RFFMBY7M.cjs +0 -2
  114. package/dist/chunk-RFFMBY7M.cjs.map +0 -1
  115. package/dist/chunk-YGAD4ZZW.js +0 -2
  116. package/dist/chunk-YGAD4ZZW.js.map +0 -1
  117. package/dist/chunk-ZO3GXKF3.cjs +0 -2
  118. package/dist/chunk-ZO3GXKF3.cjs.map +0 -1
  119. /package/dist/{chunk-BMHK77NL.js.map → chunk-FGJB4DHQ.js.map} +0 -0
  120. /package/dist/{chunk-4XLU5ZCX.js.map → chunk-GDRNKTHO.js.map} +0 -0
  121. /package/dist/{chunk-MBTLLIBM.js.map → chunk-M2XR4C7T.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/devtools/bridge.ts"],"sourcesContent":["import { bitBus } from \"bit-form/core\";\nimport type { DevToolsActionName, DevToolsActionPayload } from \"./types\";\n\nconst formatStoreState = (instance: any) => {\n const cleanState =\n typeof instance.getState === \"function\" ? instance.getState() : instance;\n\n const historyMeta = instance?.getHistoryMetadata?.() || {\n canUndo: false,\n canRedo: false,\n historyIndex: -1,\n historySize: 0,\n };\n\n return {\n ...cleanState,\n _meta: {\n canUndo: historyMeta.canUndo,\n canRedo: historyMeta.canRedo,\n totalSteps: historyMeta.historySize,\n currentIndex: historyMeta.historyIndex,\n },\n };\n};\n\nlet activeBridgeCleanup: (() => void) | null = null;\n\nconst isDevToolsActionPayload = (\n payload: unknown,\n): payload is DevToolsActionPayload => {\n if (!payload || typeof payload !== \"object\") return false;\n\n const { storeId, action } = payload as {\n storeId?: unknown;\n action?: unknown;\n };\n\n return (\n typeof storeId === \"string\" &&\n (action === \"undo\" || action === \"redo\" || action === \"reset\")\n );\n};\n\nexport function setupRemoteBridge(url: string) {\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 isIntentionalDisconnect = false;\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 const storesEntries = Object.entries(bitBus.stores);\n if (storesEntries.length > 0) {\n const initialState = storesEntries.reduce(\n (acc, [id, store]) => {\n acc[id] = formatStoreState(store);\n return acc;\n },\n {} as Record<string, any>,\n );\n\n socket?.send(\n JSON.stringify({ type: \"STATE_UPDATE\", payload: initialState }),\n );\n }\n\n unsubscribeBus = bitBus.subscribe((storeId, _newState) => {\n if (socket?.readyState === WebSocket.OPEN) {\n const storeInstance = bitBus.stores[storeId];\n if (storeInstance) {\n socket.send(\n JSON.stringify({\n type: \"STATE_UPDATE\",\n payload: { [storeId]: formatStoreState(storeInstance) },\n }),\n );\n }\n }\n });\n\n heartbeatInterval = setInterval(() => {\n if (socket?.readyState === WebSocket.OPEN) {\n socket.send(JSON.stringify({ type: \"PING\" }));\n }\n }, 30000);\n };\n\n socket.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data) as {\n type?: unknown;\n payload?: unknown;\n };\n\n if (message.type === \"ACTION\") {\n if (!isDevToolsActionPayload(message.payload)) {\n return;\n }\n\n const { storeId, action } = message.payload;\n\n const store = bitBus.stores[storeId];\n\n if (!store || typeof store !== \"object\") {\n return;\n }\n\n const methodByAction: Record<DevToolsActionName, string> = {\n undo: \"undo\",\n redo: \"redo\",\n reset: \"reset\",\n };\n\n const method = (store as Record<string, unknown>)[\n methodByAction[action]\n ];\n if (typeof method === \"function\") {\n (method as () => void).call(store);\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\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 (\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":["formatStoreState","instance","cleanState","historyMeta","activeBridgeCleanup","isDevToolsActionPayload","payload","storeId","action","setupRemoteBridge","url","socket","unsubscribeBus","heartbeatInterval","isIntentionalDisconnect","connect","storesEntries","bitBus","initialState","acc","id","store","_newState","storeInstance","event","message","method","e","cleanup"]}
1
+ {"version":3,"sources":["../../src/devtools/bridge.ts"],"sourcesContent":["import { bitBus } from \"bit-form/core\";\nimport type { DevToolsActionName, DevToolsActionPayload } from \"./types\";\n\nconst formatStoreState = (instance: any) => {\n const cleanState =\n typeof instance.getState === \"function\" ? instance.getState() : instance;\n\n const historyMeta = instance?.getHistoryMetadata?.() || {\n canUndo: false,\n canRedo: false,\n historyIndex: -1,\n historySize: 0,\n };\n\n return {\n ...cleanState,\n _meta: {\n canUndo: historyMeta.canUndo,\n canRedo: historyMeta.canRedo,\n totalSteps: historyMeta.historySize,\n currentIndex: historyMeta.historyIndex,\n },\n };\n};\n\nlet activeBridgeCleanup: (() => void) | null = null;\n\nconst isDevToolsActionPayload = (\n payload: unknown,\n): payload is DevToolsActionPayload => {\n if (!payload || typeof payload !== \"object\") return false;\n\n const { storeId, action } = payload as {\n storeId?: unknown;\n action?: unknown;\n };\n\n return (\n typeof storeId === \"string\" &&\n (action === \"undo\" || action === \"redo\" || action === \"reset\")\n );\n};\n\nexport function setupRemoteBridge(url: string) {\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 isIntentionalDisconnect = false;\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 const storesEntries = Object.entries(bitBus.stores);\n if (storesEntries.length > 0) {\n const initialState = storesEntries.reduce(\n (acc, [id, store]) => {\n acc[id] = formatStoreState(store);\n return acc;\n },\n {} as Record<string, any>,\n );\n\n socket?.send(\n JSON.stringify({ type: \"STATE_UPDATE\", payload: initialState }),\n );\n }\n\n unsubscribeBus = bitBus.subscribe((storeId, _newState) => {\n if (socket?.readyState === WebSocket.OPEN) {\n const storeInstance = bitBus.stores[storeId];\n if (storeInstance) {\n socket.send(\n JSON.stringify({\n type: \"STATE_UPDATE\",\n payload: { [storeId]: formatStoreState(storeInstance) },\n }),\n );\n }\n }\n });\n\n heartbeatInterval = setInterval(() => {\n if (socket?.readyState === WebSocket.OPEN) {\n socket.send(JSON.stringify({ type: \"PING\" }));\n }\n }, 30000);\n };\n\n socket.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data) as {\n type?: unknown;\n payload?: unknown;\n };\n\n if (message.type === \"ACTION\") {\n if (!isDevToolsActionPayload(message.payload)) {\n return;\n }\n\n const { storeId, action } = message.payload;\n\n const store = bitBus.stores[storeId];\n\n if (!store || typeof store !== \"object\") {\n return;\n }\n\n const methodByAction: Record<DevToolsActionName, string> = {\n undo: \"undo\",\n redo: \"redo\",\n reset: \"reset\",\n };\n\n const method = (store as Record<string, unknown>)[\n methodByAction[action]\n ];\n if (typeof method === \"function\") {\n (method as () => void).call(store);\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\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 (\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":["formatStoreState","instance","cleanState","historyMeta","activeBridgeCleanup","isDevToolsActionPayload","payload","storeId","action","setupRemoteBridge","url","socket","unsubscribeBus","heartbeatInterval","isIntentionalDisconnect","connect","storesEntries","bitBus","initialState","acc","id","store","_newState","storeInstance","event","message","method","e","cleanup"]}
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class;var _chunkLOYB7TTMcjs = require('../chunk-LOYB7TTM.cjs');require('../chunk-EI5L5L3R.cjs');function b(){return`
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class;var _chunkOZKLQRO6cjs = require('../chunk-OZKLQRO6.cjs');function b(){return`
2
2
  .bit-devtools-container {
3
3
  position: fixed;
4
4
  bottom: 20px;
@@ -129,5 +129,5 @@
129
129
  <button class="bit-devtools-trigger" style="transform: ${this.isOpen?"scale(0.9)":"scale(1)"};" title="Abrir DevTools">
130
130
  ${this.isOpen?"\u2716":"Bit"}
131
131
  </button>
132
- `;this.rootElement.innerHTML=r+e}}, _class);function g(a){let i=new c(a,{onUndo:s=>_optionalChain([_chunkLOYB7TTMcjs.j, 'access', _ => _.stores, 'access', _2 => _2[s], 'optionalAccess', _3 => _3.undo, 'call', _4 => _4()]),onRedo:s=>_optionalChain([_chunkLOYB7TTMcjs.j, 'access', _5 => _5.stores, 'access', _6 => _6[s], 'optionalAccess', _7 => _7.redo, 'call', _8 => _8()]),onReset:s=>_optionalChain([_chunkLOYB7TTMcjs.j, 'access', _9 => _9.stores, 'access', _10 => _10[s], 'optionalAccess', _11 => _11.reset, 'call', _12 => _12()])}),r=()=>{let s={};for(let[t,o]of Object.entries(_chunkLOYB7TTMcjs.j.stores)){let n=o,p=n.getState(),l=_optionalChain([n, 'optionalAccess', _13 => _13.getHistoryMetadata, 'optionalCall', _14 => _14()])||{enabled:!1,canUndo:!1,canRedo:!1,historyIndex:-1,historySize:0};s[t]={...p,_meta:{canUndo:l.canUndo,canRedo:l.canRedo,totalSteps:l.historySize,currentIndex:l.historyIndex}}}return s};i.updateState(r());let e=_chunkLOYB7TTMcjs.j.subscribe(()=>{i.updateState(r())});return{ui:i,destroy:()=>{e(),a.innerHTML=""}}}function f(a,i="ws://localhost:3000"){let r=new WebSocket(i),e=o=>{r.readyState===WebSocket.OPEN?r.send(JSON.stringify(o)):console.warn("[bit-form] Tentativa de envio falhou. WebSocket n\xE3o est\xE1 aberto.")},s=(o,n)=>{e({type:"ACTION",payload:{storeId:o,action:n}})},t=new c(a,{onUndo:o=>s(o,"undo"),onRedo:o=>s(o,"redo"),onReset:o=>s(o,"reset")});return r.addEventListener("open",()=>{console.log(`[bit-form] Conectado ao DevTools remoto em ${i}`)}),r.addEventListener("message",o=>{try{let n=JSON.parse(o.data);n.type==="STATE_UPDATE"&&t.updateState(n.payload)}catch(n){console.error("[bit-form] Erro ao processar mensagem do WebSocket:",n)}}),r.addEventListener("error",o=>{console.error("[bit-form] Erro na conex\xE3o do DevTools remoto:",o)}),{ui:t,destroy:()=>{(r.readyState===WebSocket.OPEN||r.readyState===WebSocket.CONNECTING)&&r.close(),a.innerHTML=""}}}function m(a={}){let{mode:i="local",url:r}=a,e,s=!1;if(typeof a.container=="string"){let o=document.querySelector(a.container);if(!o)throw new Error(`[bit-form] Container '${a.container}' n\xE3o encontrado na p\xE1gina.`);e=o}else a.container instanceof HTMLElement?e=a.container:(e=document.createElement("div"),e.id="bit-form-devtools-root",e.style.position="fixed",e.style.bottom="20px",e.style.right="20px",e.style.zIndex="9999",e.style.maxHeight="80vh",e.style.overflowY="auto",e.style.boxShadow="0 10px 25px rgba(0,0,0,0.1)",document.body.appendChild(e),s=!0);let t;if(i==="local")console.log("[bit-form] DevTools iniciado em modo Local."),t=g(e);else if(i==="remote")console.log("[bit-form] DevTools iniciado em modo Remote."),t=f(e,r);else throw new Error(`[bit-form] Modo DevTools inv\xE1lido: ${i}`);return{...t,destroy:()=>{t&&typeof t.destroy=="function"&&t.destroy(),s&&e.parentNode?e.parentNode.removeChild(e):e.innerHTML=""}}}exports.initDevTools = m;
132
+ `;this.rootElement.innerHTML=r+e}}, _class);function g(a){let i=new c(a,{onUndo:s=>_optionalChain([_chunkOZKLQRO6cjs.j, 'access', _ => _.stores, 'access', _2 => _2[s], 'optionalAccess', _3 => _3.undo, 'call', _4 => _4()]),onRedo:s=>_optionalChain([_chunkOZKLQRO6cjs.j, 'access', _5 => _5.stores, 'access', _6 => _6[s], 'optionalAccess', _7 => _7.redo, 'call', _8 => _8()]),onReset:s=>_optionalChain([_chunkOZKLQRO6cjs.j, 'access', _9 => _9.stores, 'access', _10 => _10[s], 'optionalAccess', _11 => _11.reset, 'call', _12 => _12()])}),r=()=>{let s={};for(let[t,o]of Object.entries(_chunkOZKLQRO6cjs.j.stores)){let n=o,p=n.getState(),l=_optionalChain([n, 'optionalAccess', _13 => _13.getHistoryMetadata, 'optionalCall', _14 => _14()])||{enabled:!1,canUndo:!1,canRedo:!1,historyIndex:-1,historySize:0};s[t]={...p,_meta:{canUndo:l.canUndo,canRedo:l.canRedo,totalSteps:l.historySize,currentIndex:l.historyIndex}}}return s};i.updateState(r());let e=_chunkOZKLQRO6cjs.j.subscribe(()=>{i.updateState(r())});return{ui:i,destroy:()=>{e(),a.innerHTML=""}}}function f(a,i="ws://localhost:3000"){let r=new WebSocket(i),e=o=>{r.readyState===WebSocket.OPEN?r.send(JSON.stringify(o)):console.warn("[bit-form] Tentativa de envio falhou. WebSocket n\xE3o est\xE1 aberto.")},s=(o,n)=>{e({type:"ACTION",payload:{storeId:o,action:n}})},t=new c(a,{onUndo:o=>s(o,"undo"),onRedo:o=>s(o,"redo"),onReset:o=>s(o,"reset")});return r.addEventListener("open",()=>{console.log(`[bit-form] Conectado ao DevTools remoto em ${i}`)}),r.addEventListener("message",o=>{try{let n=JSON.parse(o.data);n.type==="STATE_UPDATE"&&t.updateState(n.payload)}catch(n){console.error("[bit-form] Erro ao processar mensagem do WebSocket:",n)}}),r.addEventListener("error",o=>{console.error("[bit-form] Erro na conex\xE3o do DevTools remoto:",o)}),{ui:t,destroy:()=>{(r.readyState===WebSocket.OPEN||r.readyState===WebSocket.CONNECTING)&&r.close(),a.innerHTML=""}}}function m(a={}){let{mode:i="local",url:r}=a,e,s=!1;if(typeof a.container=="string"){let o=document.querySelector(a.container);if(!o)throw new Error(`[bit-form] Container '${a.container}' n\xE3o encontrado na p\xE1gina.`);e=o}else a.container instanceof HTMLElement?e=a.container:(e=document.createElement("div"),e.id="bit-form-devtools-root",e.style.position="fixed",e.style.bottom="20px",e.style.right="20px",e.style.zIndex="9999",e.style.maxHeight="80vh",e.style.overflowY="auto",e.style.boxShadow="0 10px 25px rgba(0,0,0,0.1)",document.body.appendChild(e),s=!0);let t;if(i==="local")console.log("[bit-form] DevTools iniciado em modo Local."),t=g(e);else if(i==="remote")console.log("[bit-form] DevTools iniciado em modo Remote."),t=f(e,r);else throw new Error(`[bit-form] Modo DevTools inv\xE1lido: ${i}`);return{...t,destroy:()=>{t&&typeof t.destroy=="function"&&t.destroy(),s&&e.parentNode?e.parentNode.removeChild(e):e.innerHTML=""}}}exports.initDevTools = m;
133
133
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/bit-form/bit-form/dist/devtools/index.cjs","../../src/devtools/ui/styles.ts","../../src/devtools/ui/index.ts","../../src/devtools/adapters/local.ts","../../src/devtools/adapters/remote.ts"],"names":["getDevToolsCSS","BitFormDevToolsUI","container","actions","style","target","btn","action","storeId","storesState","storeEntries","panelHtml","id","state","hasErrors","meta","currentStep","totalSteps","triggerHtml","setupLocalDevTools","ui","bitBus","getFullSnapshot","states","instance","storeInstance","historyMeta","unsubscribe","setupRemoteDevTools","url","socket","sendMessage","message","sendAction"],"mappings":"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","file":"/home/runner/work/bit-form/bit-form/dist/devtools/index.cjs","sourcesContent":[null,"export function getDevToolsCSS(): string {\n return `\n .bit-devtools-container {\n position: fixed;\n bottom: 20px;\n right: 20px;\n z-index: 9999;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n }\n\n .bit-devtools-trigger {\n background: #10b981;\n color: #fff;\n border: none;\n border-radius: 50%;\n width: 48px;\n height: 48px;\n cursor: pointer;\n box-shadow: 0 4px 12px rgba(16, 185, 129, 0.4);\n font-weight: bold;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: transform 0.2s;\n font-size: 16px;\n margin-top: 16px;\n }\n .bit-devtools-trigger:hover { transform: scale(1.05); }\n\n .bit-devtools-panel {\n width: 450px;\n max-height: 80vh;\n background: #0f172a;\n color: #f8fafc;\n border-radius: 8px;\n padding: 16px;\n overflow-y: auto;\n box-shadow: 0 20px 25px -5px rgba(0,0,0,0.5), 0 8px 10px -6px rgba(0,0,0,0.5);\n border: 1px solid #334155;\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .bit-devtools-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: 12px;\n border-bottom: 1px solid #1e293b;\n }\n .bit-devtools-header h2 { margin: 0; font-size: 16px; display: flex; align-items: center; gap: 8px; }\n\n .bit-store-block {\n background: #1e293b;\n border-radius: 6px;\n padding: 12px;\n border: 1px solid #334155;\n }\n\n .bit-store-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n }\n .bit-store-title { margin: 0; color: #38bdf8; font-size: 14px; font-weight: bold; }\n\n .bit-badge-group { display: flex; gap: 6px; flex-wrap: wrap; }\n .bit-badge { font-size: 10px; padding: 2px 6px; border-radius: 4px; text-transform: uppercase; font-weight: bold; }\n .badge-success { background: rgba(16, 185, 129, 0.2); color: #34d399; border: 1px solid rgba(16, 185, 129, 0.2); }\n .badge-error { background: rgba(239, 68, 68, 0.2); color: #f87171; border: 1px solid rgba(239, 68, 68, 0.2); }\n .badge-warn { background: rgba(245, 158, 11, 0.2); color: #fbbf24; border: 1px solid rgba(245, 158, 11, 0.2); }\n .badge-info { background: rgba(56, 189, 248, 0.2); color: #7dd3fc; border: 1px solid rgba(56, 189, 248, 0.2); }\n\n .bit-section-title { font-size: 11px; color: #94a3b8; text-transform: uppercase; letter-spacing: 1px; margin: 12px 0 4px 0; display: block; }\n\n .bit-controls { display: flex; gap: 6px; margin-bottom: 12px; background: #0f172a; padding: 8px; border-radius: 6px; }\n .bit-action-btn { flex: 1; background: #334155; color: #e2e8f0; border: 1px solid #475569; padding: 6px 0; border-radius: 4px; cursor: pointer; font-size: 11px; display: flex; align-items: center; justify-content: center; gap: 4px; transition: all 0.2s; }\n .bit-action-btn:hover:not(:disabled) { background: #475569; }\n .bit-action-btn:disabled { opacity: 0.5; cursor: not-allowed; }\n .bit-btn-reset { color: #fca5a5; border-color: rgba(239,68,68,0.3); }\n .bit-btn-reset:hover { background: rgba(239,68,68,0.1) !important; }\n\n pre.bit-pre { background: #020617; padding: 10px; border-radius: 4px; font-size: 11px; overflow-x: auto; border: 1px solid #1e293b; margin: 0; color: #e2e8f0; }\n pre.bit-error-box { background: rgba(239, 68, 68, 0.05); padding: 10px; border-radius: 4px; font-size: 11px; border: 1px dashed #ef4444; color: #fca5a5; margin: 0; overflow-x: auto; }\n `;\n}\n","import { getDevToolsCSS } from \"./styles\";\nimport type { DevToolsActions } from \"../types\";\n\nexport type { DevToolsActions };\n\nexport class BitFormDevToolsUI {\n private container: HTMLElement;\n private actions: DevToolsActions;\n private rootElement: HTMLDivElement;\n private currentStoresState: Record<string, any> = {};\n private isOpen: boolean = false;\n\n constructor(container: HTMLElement, actions: DevToolsActions) {\n this.container = container;\n this.actions = actions;\n\n if (!document.getElementById(\"bit-devtools-styles\")) {\n const style = document.createElement(\"style\");\n style.id = \"bit-devtools-styles\";\n style.textContent = getDevToolsCSS();\n document.head.appendChild(style);\n }\n\n this.rootElement = document.createElement(\"div\");\n this.rootElement.className = \"bit-devtools-container\";\n this.container.appendChild(this.rootElement);\n\n this.rootElement.addEventListener(\"click\", (e) => {\n const target = e.target as HTMLElement;\n\n // Evento do botão flutuante\n if (target.closest(\".bit-devtools-trigger\")) {\n this.isOpen = !this.isOpen;\n this.render();\n return;\n }\n\n // Eventos dos botões de ação\n const btn = target.closest(\".bit-action-btn\");\n if (btn && !btn.hasAttribute(\"disabled\")) {\n const action = btn.getAttribute(\"data-action\");\n const storeId = btn.getAttribute(\"data-store\");\n\n if (action && storeId) {\n if (action === \"undo\") this.actions.onUndo(storeId);\n if (action === \"redo\") this.actions.onRedo(storeId);\n if (action === \"reset\") this.actions.onReset(storeId);\n }\n }\n });\n }\n\n public updateState(storesState: Record<string, any>) {\n this.currentStoresState = storesState;\n this.render();\n }\n\n private render() {\n const storeEntries = Object.entries(this.currentStoresState);\n if (storeEntries.length === 0) {\n this.rootElement.innerHTML = \"\";\n return;\n }\n\n let panelHtml = \"\";\n\n if (this.isOpen) {\n panelHtml = `\n <div class=\"bit-devtools-panel\">\n <div class=\"bit-devtools-header\">\n <h2><span style=\"font-size: 20px;\">🛠</span> Bit-Form DevTools</h2>\n <span style=\"font-size: 11px; color: #64748b;\">v1.0.0</span>\n </div>\n `;\n\n for (const [id, state] of storeEntries) {\n const hasErrors = Object.keys(state.errors || {}).length > 0;\n\n // Lemos os metadados do histórico que o adaptador injetou\n const meta = state._meta || {\n totalSteps: 0,\n currentIndex: -1,\n canUndo: false,\n canRedo: false,\n };\n const currentStep = meta.currentIndex + 1;\n const totalSteps = meta.totalSteps;\n\n panelHtml += `\n <div class=\"bit-store-block\">\n <div class=\"bit-store-header\">\n <h3 class=\"bit-store-title\">${id}</h3>\n <div class=\"bit-badge-group\">\n <span class=\"bit-badge ${state.isValid ? \"badge-success\" : \"badge-error\"}\">\n ${state.isValid ? \"✓ Valid\" : \"✕ Invalid\"}\n </span>\n ${state.isDirty ? `<span class=\"bit-badge badge-warn\">Dirty</span>` : \"\"}\n ${state.isSubmitting ? `<span class=\"bit-badge badge-info\">⏳ Submitting</span>` : \"\"}\n </div>\n </div>\n\n <span class=\"bit-section-title\">Time Travel (${currentStep}/${totalSteps})</span>\n \n <div class=\"bit-controls\">\n <button class=\"bit-action-btn\" data-action=\"undo\" data-store=\"${id}\" ${meta.canUndo ? \"\" : \"disabled\"}>\n <span>↺</span> Undo\n </button>\n <button class=\"bit-action-btn\" data-action=\"redo\" data-store=\"${id}\" ${meta.canRedo ? \"\" : \"disabled\"}>\n <span>↻</span> Redo\n </button>\n <button class=\"bit-action-btn bit-btn-reset\" data-action=\"reset\" data-store=\"${id}\">\n <span>🗑</span> Reset\n </button>\n </div>\n `;\n\n if (hasErrors) {\n panelHtml += `\n <span class=\"bit-section-title\" style=\"color: #f87171;\">⚠️ Validations Failing</span>\n <pre class=\"bit-error-box\">${JSON.stringify(state.errors, null, 2)}</pre>\n `;\n }\n\n panelHtml += `\n <span class=\"bit-section-title\">Values</span>\n <pre class=\"bit-pre\">${JSON.stringify(state.values, null, 2)}</pre>\n </div>\n `;\n }\n\n panelHtml += `</div>`;\n }\n\n // Botão Flutuante (sempre renderizado)\n const triggerHtml = `\n <button class=\"bit-devtools-trigger\" style=\"transform: ${this.isOpen ? \"scale(0.9)\" : \"scale(1)\"};\" title=\"Abrir DevTools\">\n ${this.isOpen ? \"✖\" : \"Bit\"}\n </button>\n `;\n\n this.rootElement.innerHTML = panelHtml + triggerHtml;\n }\n}\n","import { bitBus } from \"../../core\";\nimport type { BitStoreHooksApi } from \"../../core\";\nimport { BitFormDevToolsUI } from \"../ui\";\n\nexport function setupLocalDevTools(container: HTMLElement) {\n const ui = new BitFormDevToolsUI(container, {\n onUndo: (id) => (bitBus.stores[id] as BitStoreHooksApi<any>)?.undo(),\n onRedo: (id) => (bitBus.stores[id] as BitStoreHooksApi<any>)?.redo(),\n onReset: (id) => (bitBus.stores[id] as BitStoreHooksApi<any>)?.reset(),\n });\n\n const getFullSnapshot = () => {\n const states: Record<string, unknown> = {};\n\n for (const [id, instance] of Object.entries(bitBus.stores)) {\n const storeInstance = instance as BitStoreHooksApi<any>;\n const state = storeInstance.getState();\n\n const historyMeta = storeInstance?.getHistoryMetadata?.() || {\n enabled: false,\n canUndo: false,\n canRedo: false,\n historyIndex: -1,\n historySize: 0,\n };\n\n states[id] = {\n ...state,\n _meta: {\n canUndo: historyMeta.canUndo,\n canRedo: historyMeta.canRedo,\n totalSteps: historyMeta.historySize,\n currentIndex: historyMeta.historyIndex,\n },\n };\n }\n return states;\n };\n\n ui.updateState(getFullSnapshot());\n\n const unsubscribe = bitBus.subscribe(() => {\n ui.updateState(getFullSnapshot());\n });\n\n return {\n ui,\n destroy: () => {\n unsubscribe();\n container.innerHTML = \"\";\n },\n };\n}\n","import { BitFormDevToolsUI } from \"../ui\";\nimport type {\n DevToolsActionMessage,\n DevToolsActionName,\n DevToolsRemoteMessage,\n DevToolsStateUpdateMessage,\n} from \"../types\";\n\nexport function setupRemoteDevTools(\n container: HTMLElement,\n url: string = \"ws://localhost:3000\",\n) {\n const socket = new WebSocket(url);\n\n const sendMessage = (message: DevToolsRemoteMessage) => {\n if (socket.readyState === WebSocket.OPEN) {\n socket.send(JSON.stringify(message));\n } else {\n console.warn(\n \"[bit-form] Tentativa de envio falhou. WebSocket não está aberto.\",\n );\n }\n };\n\n const sendAction = (storeId: string, action: DevToolsActionName) => {\n const message: DevToolsActionMessage = {\n type: \"ACTION\",\n payload: { storeId, action },\n };\n sendMessage(message);\n };\n\n const ui = new BitFormDevToolsUI(container, {\n onUndo: (id) => sendAction(id, \"undo\"),\n onRedo: (id) => sendAction(id, \"redo\"),\n onReset: (id) => sendAction(id, \"reset\"),\n });\n\n socket.addEventListener(\"open\", () => {\n console.log(`[bit-form] Conectado ao DevTools remoto em ${url}`);\n });\n\n socket.addEventListener(\"message\", (msg: MessageEvent) => {\n try {\n const data = JSON.parse(msg.data) as DevToolsRemoteMessage;\n if (data.type === \"STATE_UPDATE\") {\n ui.updateState((data as DevToolsStateUpdateMessage).payload);\n }\n } catch (e) {\n console.error(\"[bit-form] Erro ao processar mensagem do WebSocket:\", e);\n }\n });\n\n socket.addEventListener(\"error\", (err) => {\n console.error(\"[bit-form] Erro na conexão do DevTools remoto:\", err);\n });\n\n return {\n ui,\n destroy: () => {\n if (\n socket.readyState === WebSocket.OPEN ||\n socket.readyState === WebSocket.CONNECTING\n ) {\n socket.close();\n }\n container.innerHTML = \"\";\n },\n };\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/bit-form/bit-form/dist/devtools/index.cjs","../../src/devtools/ui/styles.ts","../../src/devtools/ui/index.ts","../../src/devtools/adapters/local.ts","../../src/devtools/adapters/remote.ts"],"names":["getDevToolsCSS","BitFormDevToolsUI","container","actions","style","target","btn","action","storeId","storesState","storeEntries","panelHtml","id","state","hasErrors","meta","currentStep","totalSteps","triggerHtml","setupLocalDevTools","ui","bitBus","getFullSnapshot","states","instance","storeInstance","historyMeta","unsubscribe","setupRemoteDevTools","url","socket","sendMessage","message","sendAction"],"mappings":"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","file":"/home/runner/work/bit-form/bit-form/dist/devtools/index.cjs","sourcesContent":[null,"export function getDevToolsCSS(): string {\n return `\n .bit-devtools-container {\n position: fixed;\n bottom: 20px;\n right: 20px;\n z-index: 9999;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n }\n\n .bit-devtools-trigger {\n background: #10b981;\n color: #fff;\n border: none;\n border-radius: 50%;\n width: 48px;\n height: 48px;\n cursor: pointer;\n box-shadow: 0 4px 12px rgba(16, 185, 129, 0.4);\n font-weight: bold;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: transform 0.2s;\n font-size: 16px;\n margin-top: 16px;\n }\n .bit-devtools-trigger:hover { transform: scale(1.05); }\n\n .bit-devtools-panel {\n width: 450px;\n max-height: 80vh;\n background: #0f172a;\n color: #f8fafc;\n border-radius: 8px;\n padding: 16px;\n overflow-y: auto;\n box-shadow: 0 20px 25px -5px rgba(0,0,0,0.5), 0 8px 10px -6px rgba(0,0,0,0.5);\n border: 1px solid #334155;\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .bit-devtools-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: 12px;\n border-bottom: 1px solid #1e293b;\n }\n .bit-devtools-header h2 { margin: 0; font-size: 16px; display: flex; align-items: center; gap: 8px; }\n\n .bit-store-block {\n background: #1e293b;\n border-radius: 6px;\n padding: 12px;\n border: 1px solid #334155;\n }\n\n .bit-store-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n }\n .bit-store-title { margin: 0; color: #38bdf8; font-size: 14px; font-weight: bold; }\n\n .bit-badge-group { display: flex; gap: 6px; flex-wrap: wrap; }\n .bit-badge { font-size: 10px; padding: 2px 6px; border-radius: 4px; text-transform: uppercase; font-weight: bold; }\n .badge-success { background: rgba(16, 185, 129, 0.2); color: #34d399; border: 1px solid rgba(16, 185, 129, 0.2); }\n .badge-error { background: rgba(239, 68, 68, 0.2); color: #f87171; border: 1px solid rgba(239, 68, 68, 0.2); }\n .badge-warn { background: rgba(245, 158, 11, 0.2); color: #fbbf24; border: 1px solid rgba(245, 158, 11, 0.2); }\n .badge-info { background: rgba(56, 189, 248, 0.2); color: #7dd3fc; border: 1px solid rgba(56, 189, 248, 0.2); }\n\n .bit-section-title { font-size: 11px; color: #94a3b8; text-transform: uppercase; letter-spacing: 1px; margin: 12px 0 4px 0; display: block; }\n\n .bit-controls { display: flex; gap: 6px; margin-bottom: 12px; background: #0f172a; padding: 8px; border-radius: 6px; }\n .bit-action-btn { flex: 1; background: #334155; color: #e2e8f0; border: 1px solid #475569; padding: 6px 0; border-radius: 4px; cursor: pointer; font-size: 11px; display: flex; align-items: center; justify-content: center; gap: 4px; transition: all 0.2s; }\n .bit-action-btn:hover:not(:disabled) { background: #475569; }\n .bit-action-btn:disabled { opacity: 0.5; cursor: not-allowed; }\n .bit-btn-reset { color: #fca5a5; border-color: rgba(239,68,68,0.3); }\n .bit-btn-reset:hover { background: rgba(239,68,68,0.1) !important; }\n\n pre.bit-pre { background: #020617; padding: 10px; border-radius: 4px; font-size: 11px; overflow-x: auto; border: 1px solid #1e293b; margin: 0; color: #e2e8f0; }\n pre.bit-error-box { background: rgba(239, 68, 68, 0.05); padding: 10px; border-radius: 4px; font-size: 11px; border: 1px dashed #ef4444; color: #fca5a5; margin: 0; overflow-x: auto; }\n `;\n}\n","import { getDevToolsCSS } from \"./styles\";\nimport type { DevToolsActions } from \"../types\";\n\nexport type { DevToolsActions };\n\nexport class BitFormDevToolsUI {\n private container: HTMLElement;\n private actions: DevToolsActions;\n private rootElement: HTMLDivElement;\n private currentStoresState: Record<string, any> = {};\n private isOpen: boolean = false;\n\n constructor(container: HTMLElement, actions: DevToolsActions) {\n this.container = container;\n this.actions = actions;\n\n if (!document.getElementById(\"bit-devtools-styles\")) {\n const style = document.createElement(\"style\");\n style.id = \"bit-devtools-styles\";\n style.textContent = getDevToolsCSS();\n document.head.appendChild(style);\n }\n\n this.rootElement = document.createElement(\"div\");\n this.rootElement.className = \"bit-devtools-container\";\n this.container.appendChild(this.rootElement);\n\n this.rootElement.addEventListener(\"click\", (e) => {\n const target = e.target as HTMLElement;\n\n // Evento do botão flutuante\n if (target.closest(\".bit-devtools-trigger\")) {\n this.isOpen = !this.isOpen;\n this.render();\n return;\n }\n\n // Eventos dos botões de ação\n const btn = target.closest(\".bit-action-btn\");\n if (btn && !btn.hasAttribute(\"disabled\")) {\n const action = btn.getAttribute(\"data-action\");\n const storeId = btn.getAttribute(\"data-store\");\n\n if (action && storeId) {\n if (action === \"undo\") this.actions.onUndo(storeId);\n if (action === \"redo\") this.actions.onRedo(storeId);\n if (action === \"reset\") this.actions.onReset(storeId);\n }\n }\n });\n }\n\n public updateState(storesState: Record<string, any>) {\n this.currentStoresState = storesState;\n this.render();\n }\n\n private render() {\n const storeEntries = Object.entries(this.currentStoresState);\n if (storeEntries.length === 0) {\n this.rootElement.innerHTML = \"\";\n return;\n }\n\n let panelHtml = \"\";\n\n if (this.isOpen) {\n panelHtml = `\n <div class=\"bit-devtools-panel\">\n <div class=\"bit-devtools-header\">\n <h2><span style=\"font-size: 20px;\">🛠</span> Bit-Form DevTools</h2>\n <span style=\"font-size: 11px; color: #64748b;\">v1.0.0</span>\n </div>\n `;\n\n for (const [id, state] of storeEntries) {\n const hasErrors = Object.keys(state.errors || {}).length > 0;\n\n // Lemos os metadados do histórico que o adaptador injetou\n const meta = state._meta || {\n totalSteps: 0,\n currentIndex: -1,\n canUndo: false,\n canRedo: false,\n };\n const currentStep = meta.currentIndex + 1;\n const totalSteps = meta.totalSteps;\n\n panelHtml += `\n <div class=\"bit-store-block\">\n <div class=\"bit-store-header\">\n <h3 class=\"bit-store-title\">${id}</h3>\n <div class=\"bit-badge-group\">\n <span class=\"bit-badge ${state.isValid ? \"badge-success\" : \"badge-error\"}\">\n ${state.isValid ? \"✓ Valid\" : \"✕ Invalid\"}\n </span>\n ${state.isDirty ? `<span class=\"bit-badge badge-warn\">Dirty</span>` : \"\"}\n ${state.isSubmitting ? `<span class=\"bit-badge badge-info\">⏳ Submitting</span>` : \"\"}\n </div>\n </div>\n\n <span class=\"bit-section-title\">Time Travel (${currentStep}/${totalSteps})</span>\n \n <div class=\"bit-controls\">\n <button class=\"bit-action-btn\" data-action=\"undo\" data-store=\"${id}\" ${meta.canUndo ? \"\" : \"disabled\"}>\n <span>↺</span> Undo\n </button>\n <button class=\"bit-action-btn\" data-action=\"redo\" data-store=\"${id}\" ${meta.canRedo ? \"\" : \"disabled\"}>\n <span>↻</span> Redo\n </button>\n <button class=\"bit-action-btn bit-btn-reset\" data-action=\"reset\" data-store=\"${id}\">\n <span>🗑</span> Reset\n </button>\n </div>\n `;\n\n if (hasErrors) {\n panelHtml += `\n <span class=\"bit-section-title\" style=\"color: #f87171;\">⚠️ Validations Failing</span>\n <pre class=\"bit-error-box\">${JSON.stringify(state.errors, null, 2)}</pre>\n `;\n }\n\n panelHtml += `\n <span class=\"bit-section-title\">Values</span>\n <pre class=\"bit-pre\">${JSON.stringify(state.values, null, 2)}</pre>\n </div>\n `;\n }\n\n panelHtml += `</div>`;\n }\n\n // Botão Flutuante (sempre renderizado)\n const triggerHtml = `\n <button class=\"bit-devtools-trigger\" style=\"transform: ${this.isOpen ? \"scale(0.9)\" : \"scale(1)\"};\" title=\"Abrir DevTools\">\n ${this.isOpen ? \"✖\" : \"Bit\"}\n </button>\n `;\n\n this.rootElement.innerHTML = panelHtml + triggerHtml;\n }\n}\n","import { bitBus } from \"../../core\";\nimport type { BitStoreHooksApi } from \"../../core\";\nimport { BitFormDevToolsUI } from \"../ui\";\n\nexport function setupLocalDevTools(container: HTMLElement) {\n const ui = new BitFormDevToolsUI(container, {\n onUndo: (id) => (bitBus.stores[id] as BitStoreHooksApi<any>)?.undo(),\n onRedo: (id) => (bitBus.stores[id] as BitStoreHooksApi<any>)?.redo(),\n onReset: (id) => (bitBus.stores[id] as BitStoreHooksApi<any>)?.reset(),\n });\n\n const getFullSnapshot = () => {\n const states: Record<string, unknown> = {};\n\n for (const [id, instance] of Object.entries(bitBus.stores)) {\n const storeInstance = instance as BitStoreHooksApi<any>;\n const state = storeInstance.getState();\n\n const historyMeta = storeInstance?.getHistoryMetadata?.() || {\n enabled: false,\n canUndo: false,\n canRedo: false,\n historyIndex: -1,\n historySize: 0,\n };\n\n states[id] = {\n ...state,\n _meta: {\n canUndo: historyMeta.canUndo,\n canRedo: historyMeta.canRedo,\n totalSteps: historyMeta.historySize,\n currentIndex: historyMeta.historyIndex,\n },\n };\n }\n return states;\n };\n\n ui.updateState(getFullSnapshot());\n\n const unsubscribe = bitBus.subscribe(() => {\n ui.updateState(getFullSnapshot());\n });\n\n return {\n ui,\n destroy: () => {\n unsubscribe();\n container.innerHTML = \"\";\n },\n };\n}\n","import { BitFormDevToolsUI } from \"../ui\";\nimport type {\n DevToolsActionMessage,\n DevToolsActionName,\n DevToolsRemoteMessage,\n DevToolsStateUpdateMessage,\n} from \"../types\";\n\nexport function setupRemoteDevTools(\n container: HTMLElement,\n url: string = \"ws://localhost:3000\",\n) {\n const socket = new WebSocket(url);\n\n const sendMessage = (message: DevToolsRemoteMessage) => {\n if (socket.readyState === WebSocket.OPEN) {\n socket.send(JSON.stringify(message));\n } else {\n console.warn(\n \"[bit-form] Tentativa de envio falhou. WebSocket não está aberto.\",\n );\n }\n };\n\n const sendAction = (storeId: string, action: DevToolsActionName) => {\n const message: DevToolsActionMessage = {\n type: \"ACTION\",\n payload: { storeId, action },\n };\n sendMessage(message);\n };\n\n const ui = new BitFormDevToolsUI(container, {\n onUndo: (id) => sendAction(id, \"undo\"),\n onRedo: (id) => sendAction(id, \"redo\"),\n onReset: (id) => sendAction(id, \"reset\"),\n });\n\n socket.addEventListener(\"open\", () => {\n console.log(`[bit-form] Conectado ao DevTools remoto em ${url}`);\n });\n\n socket.addEventListener(\"message\", (msg: MessageEvent) => {\n try {\n const data = JSON.parse(msg.data) as DevToolsRemoteMessage;\n if (data.type === \"STATE_UPDATE\") {\n ui.updateState((data as DevToolsStateUpdateMessage).payload);\n }\n } catch (e) {\n console.error(\"[bit-form] Erro ao processar mensagem do WebSocket:\", e);\n }\n });\n\n socket.addEventListener(\"error\", (err) => {\n console.error(\"[bit-form] Erro na conexão do DevTools remoto:\", err);\n });\n\n return {\n ui,\n destroy: () => {\n if (\n socket.readyState === WebSocket.OPEN ||\n socket.readyState === WebSocket.CONNECTING\n ) {\n socket.close();\n }\n container.innerHTML = \"\";\n },\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import{j as d}from"../chunk-AE4G32HS.js";import"../chunk-7LMNIQTT.js";function b(){return`
1
+ import{j as d}from"../chunk-64KSP4TP.js";function b(){return`
2
2
  .bit-devtools-container {
3
3
  position: fixed;
4
4
  bottom: 20px;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/devtools/ui/styles.ts","../../src/devtools/ui/index.ts","../../src/devtools/adapters/local.ts","../../src/devtools/adapters/remote.ts","../../src/devtools/init-dev-tools.ts"],"sourcesContent":["export function getDevToolsCSS(): string {\n return `\n .bit-devtools-container {\n position: fixed;\n bottom: 20px;\n right: 20px;\n z-index: 9999;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n }\n\n .bit-devtools-trigger {\n background: #10b981;\n color: #fff;\n border: none;\n border-radius: 50%;\n width: 48px;\n height: 48px;\n cursor: pointer;\n box-shadow: 0 4px 12px rgba(16, 185, 129, 0.4);\n font-weight: bold;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: transform 0.2s;\n font-size: 16px;\n margin-top: 16px;\n }\n .bit-devtools-trigger:hover { transform: scale(1.05); }\n\n .bit-devtools-panel {\n width: 450px;\n max-height: 80vh;\n background: #0f172a;\n color: #f8fafc;\n border-radius: 8px;\n padding: 16px;\n overflow-y: auto;\n box-shadow: 0 20px 25px -5px rgba(0,0,0,0.5), 0 8px 10px -6px rgba(0,0,0,0.5);\n border: 1px solid #334155;\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .bit-devtools-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: 12px;\n border-bottom: 1px solid #1e293b;\n }\n .bit-devtools-header h2 { margin: 0; font-size: 16px; display: flex; align-items: center; gap: 8px; }\n\n .bit-store-block {\n background: #1e293b;\n border-radius: 6px;\n padding: 12px;\n border: 1px solid #334155;\n }\n\n .bit-store-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n }\n .bit-store-title { margin: 0; color: #38bdf8; font-size: 14px; font-weight: bold; }\n\n .bit-badge-group { display: flex; gap: 6px; flex-wrap: wrap; }\n .bit-badge { font-size: 10px; padding: 2px 6px; border-radius: 4px; text-transform: uppercase; font-weight: bold; }\n .badge-success { background: rgba(16, 185, 129, 0.2); color: #34d399; border: 1px solid rgba(16, 185, 129, 0.2); }\n .badge-error { background: rgba(239, 68, 68, 0.2); color: #f87171; border: 1px solid rgba(239, 68, 68, 0.2); }\n .badge-warn { background: rgba(245, 158, 11, 0.2); color: #fbbf24; border: 1px solid rgba(245, 158, 11, 0.2); }\n .badge-info { background: rgba(56, 189, 248, 0.2); color: #7dd3fc; border: 1px solid rgba(56, 189, 248, 0.2); }\n\n .bit-section-title { font-size: 11px; color: #94a3b8; text-transform: uppercase; letter-spacing: 1px; margin: 12px 0 4px 0; display: block; }\n\n .bit-controls { display: flex; gap: 6px; margin-bottom: 12px; background: #0f172a; padding: 8px; border-radius: 6px; }\n .bit-action-btn { flex: 1; background: #334155; color: #e2e8f0; border: 1px solid #475569; padding: 6px 0; border-radius: 4px; cursor: pointer; font-size: 11px; display: flex; align-items: center; justify-content: center; gap: 4px; transition: all 0.2s; }\n .bit-action-btn:hover:not(:disabled) { background: #475569; }\n .bit-action-btn:disabled { opacity: 0.5; cursor: not-allowed; }\n .bit-btn-reset { color: #fca5a5; border-color: rgba(239,68,68,0.3); }\n .bit-btn-reset:hover { background: rgba(239,68,68,0.1) !important; }\n\n pre.bit-pre { background: #020617; padding: 10px; border-radius: 4px; font-size: 11px; overflow-x: auto; border: 1px solid #1e293b; margin: 0; color: #e2e8f0; }\n pre.bit-error-box { background: rgba(239, 68, 68, 0.05); padding: 10px; border-radius: 4px; font-size: 11px; border: 1px dashed #ef4444; color: #fca5a5; margin: 0; overflow-x: auto; }\n `;\n}\n","import { getDevToolsCSS } from \"./styles\";\nimport type { DevToolsActions } from \"../types\";\n\nexport type { DevToolsActions };\n\nexport class BitFormDevToolsUI {\n private container: HTMLElement;\n private actions: DevToolsActions;\n private rootElement: HTMLDivElement;\n private currentStoresState: Record<string, any> = {};\n private isOpen: boolean = false;\n\n constructor(container: HTMLElement, actions: DevToolsActions) {\n this.container = container;\n this.actions = actions;\n\n if (!document.getElementById(\"bit-devtools-styles\")) {\n const style = document.createElement(\"style\");\n style.id = \"bit-devtools-styles\";\n style.textContent = getDevToolsCSS();\n document.head.appendChild(style);\n }\n\n this.rootElement = document.createElement(\"div\");\n this.rootElement.className = \"bit-devtools-container\";\n this.container.appendChild(this.rootElement);\n\n this.rootElement.addEventListener(\"click\", (e) => {\n const target = e.target as HTMLElement;\n\n // Evento do botão flutuante\n if (target.closest(\".bit-devtools-trigger\")) {\n this.isOpen = !this.isOpen;\n this.render();\n return;\n }\n\n // Eventos dos botões de ação\n const btn = target.closest(\".bit-action-btn\");\n if (btn && !btn.hasAttribute(\"disabled\")) {\n const action = btn.getAttribute(\"data-action\");\n const storeId = btn.getAttribute(\"data-store\");\n\n if (action && storeId) {\n if (action === \"undo\") this.actions.onUndo(storeId);\n if (action === \"redo\") this.actions.onRedo(storeId);\n if (action === \"reset\") this.actions.onReset(storeId);\n }\n }\n });\n }\n\n public updateState(storesState: Record<string, any>) {\n this.currentStoresState = storesState;\n this.render();\n }\n\n private render() {\n const storeEntries = Object.entries(this.currentStoresState);\n if (storeEntries.length === 0) {\n this.rootElement.innerHTML = \"\";\n return;\n }\n\n let panelHtml = \"\";\n\n if (this.isOpen) {\n panelHtml = `\n <div class=\"bit-devtools-panel\">\n <div class=\"bit-devtools-header\">\n <h2><span style=\"font-size: 20px;\">🛠</span> Bit-Form DevTools</h2>\n <span style=\"font-size: 11px; color: #64748b;\">v1.0.0</span>\n </div>\n `;\n\n for (const [id, state] of storeEntries) {\n const hasErrors = Object.keys(state.errors || {}).length > 0;\n\n // Lemos os metadados do histórico que o adaptador injetou\n const meta = state._meta || {\n totalSteps: 0,\n currentIndex: -1,\n canUndo: false,\n canRedo: false,\n };\n const currentStep = meta.currentIndex + 1;\n const totalSteps = meta.totalSteps;\n\n panelHtml += `\n <div class=\"bit-store-block\">\n <div class=\"bit-store-header\">\n <h3 class=\"bit-store-title\">${id}</h3>\n <div class=\"bit-badge-group\">\n <span class=\"bit-badge ${state.isValid ? \"badge-success\" : \"badge-error\"}\">\n ${state.isValid ? \"✓ Valid\" : \"✕ Invalid\"}\n </span>\n ${state.isDirty ? `<span class=\"bit-badge badge-warn\">Dirty</span>` : \"\"}\n ${state.isSubmitting ? `<span class=\"bit-badge badge-info\">⏳ Submitting</span>` : \"\"}\n </div>\n </div>\n\n <span class=\"bit-section-title\">Time Travel (${currentStep}/${totalSteps})</span>\n \n <div class=\"bit-controls\">\n <button class=\"bit-action-btn\" data-action=\"undo\" data-store=\"${id}\" ${meta.canUndo ? \"\" : \"disabled\"}>\n <span>↺</span> Undo\n </button>\n <button class=\"bit-action-btn\" data-action=\"redo\" data-store=\"${id}\" ${meta.canRedo ? \"\" : \"disabled\"}>\n <span>↻</span> Redo\n </button>\n <button class=\"bit-action-btn bit-btn-reset\" data-action=\"reset\" data-store=\"${id}\">\n <span>🗑</span> Reset\n </button>\n </div>\n `;\n\n if (hasErrors) {\n panelHtml += `\n <span class=\"bit-section-title\" style=\"color: #f87171;\">⚠️ Validations Failing</span>\n <pre class=\"bit-error-box\">${JSON.stringify(state.errors, null, 2)}</pre>\n `;\n }\n\n panelHtml += `\n <span class=\"bit-section-title\">Values</span>\n <pre class=\"bit-pre\">${JSON.stringify(state.values, null, 2)}</pre>\n </div>\n `;\n }\n\n panelHtml += `</div>`;\n }\n\n // Botão Flutuante (sempre renderizado)\n const triggerHtml = `\n <button class=\"bit-devtools-trigger\" style=\"transform: ${this.isOpen ? \"scale(0.9)\" : \"scale(1)\"};\" title=\"Abrir DevTools\">\n ${this.isOpen ? \"✖\" : \"Bit\"}\n </button>\n `;\n\n this.rootElement.innerHTML = panelHtml + triggerHtml;\n }\n}\n","import { bitBus } from \"../../core\";\nimport type { BitStoreHooksApi } from \"../../core\";\nimport { BitFormDevToolsUI } from \"../ui\";\n\nexport function setupLocalDevTools(container: HTMLElement) {\n const ui = new BitFormDevToolsUI(container, {\n onUndo: (id) => (bitBus.stores[id] as BitStoreHooksApi<any>)?.undo(),\n onRedo: (id) => (bitBus.stores[id] as BitStoreHooksApi<any>)?.redo(),\n onReset: (id) => (bitBus.stores[id] as BitStoreHooksApi<any>)?.reset(),\n });\n\n const getFullSnapshot = () => {\n const states: Record<string, unknown> = {};\n\n for (const [id, instance] of Object.entries(bitBus.stores)) {\n const storeInstance = instance as BitStoreHooksApi<any>;\n const state = storeInstance.getState();\n\n const historyMeta = storeInstance?.getHistoryMetadata?.() || {\n enabled: false,\n canUndo: false,\n canRedo: false,\n historyIndex: -1,\n historySize: 0,\n };\n\n states[id] = {\n ...state,\n _meta: {\n canUndo: historyMeta.canUndo,\n canRedo: historyMeta.canRedo,\n totalSteps: historyMeta.historySize,\n currentIndex: historyMeta.historyIndex,\n },\n };\n }\n return states;\n };\n\n ui.updateState(getFullSnapshot());\n\n const unsubscribe = bitBus.subscribe(() => {\n ui.updateState(getFullSnapshot());\n });\n\n return {\n ui,\n destroy: () => {\n unsubscribe();\n container.innerHTML = \"\";\n },\n };\n}\n","import { BitFormDevToolsUI } from \"../ui\";\nimport type {\n DevToolsActionMessage,\n DevToolsActionName,\n DevToolsRemoteMessage,\n DevToolsStateUpdateMessage,\n} from \"../types\";\n\nexport function setupRemoteDevTools(\n container: HTMLElement,\n url: string = \"ws://localhost:3000\",\n) {\n const socket = new WebSocket(url);\n\n const sendMessage = (message: DevToolsRemoteMessage) => {\n if (socket.readyState === WebSocket.OPEN) {\n socket.send(JSON.stringify(message));\n } else {\n console.warn(\n \"[bit-form] Tentativa de envio falhou. WebSocket não está aberto.\",\n );\n }\n };\n\n const sendAction = (storeId: string, action: DevToolsActionName) => {\n const message: DevToolsActionMessage = {\n type: \"ACTION\",\n payload: { storeId, action },\n };\n sendMessage(message);\n };\n\n const ui = new BitFormDevToolsUI(container, {\n onUndo: (id) => sendAction(id, \"undo\"),\n onRedo: (id) => sendAction(id, \"redo\"),\n onReset: (id) => sendAction(id, \"reset\"),\n });\n\n socket.addEventListener(\"open\", () => {\n console.log(`[bit-form] Conectado ao DevTools remoto em ${url}`);\n });\n\n socket.addEventListener(\"message\", (msg: MessageEvent) => {\n try {\n const data = JSON.parse(msg.data) as DevToolsRemoteMessage;\n if (data.type === \"STATE_UPDATE\") {\n ui.updateState((data as DevToolsStateUpdateMessage).payload);\n }\n } catch (e) {\n console.error(\"[bit-form] Erro ao processar mensagem do WebSocket:\", e);\n }\n });\n\n socket.addEventListener(\"error\", (err) => {\n console.error(\"[bit-form] Erro na conexão do DevTools remoto:\", err);\n });\n\n return {\n ui,\n destroy: () => {\n if (\n socket.readyState === WebSocket.OPEN ||\n socket.readyState === WebSocket.CONNECTING\n ) {\n socket.close();\n }\n container.innerHTML = \"\";\n },\n };\n}\n","import { setupLocalDevTools } from \"./adapters/local\";\nimport { setupRemoteDevTools } from \"./adapters/remote\";\nimport type { BitDevToolsOptions } from \"./types\";\n\nexport type { BitDevToolsOptions };\n\nexport function initDevTools(options: BitDevToolsOptions = {}) {\n const { mode = \"local\", url } = options;\n let containerEl: HTMLElement;\n\n let isAutoCreated = false;\n\n if (typeof options.container === \"string\") {\n const el = document.querySelector<HTMLElement>(options.container);\n if (!el)\n throw new Error(\n `[bit-form] Container '${options.container}' não encontrado na página.`,\n );\n containerEl = el;\n } else if (options.container instanceof HTMLElement) {\n containerEl = options.container;\n } else {\n containerEl = document.createElement(\"div\");\n containerEl.id = \"bit-form-devtools-root\";\n containerEl.style.position = \"fixed\";\n containerEl.style.bottom = \"20px\";\n containerEl.style.right = \"20px\";\n containerEl.style.zIndex = \"9999\";\n containerEl.style.maxHeight = \"80vh\";\n containerEl.style.overflowY = \"auto\";\n containerEl.style.boxShadow = \"0 10px 25px rgba(0,0,0,0.1)\";\n document.body.appendChild(containerEl);\n isAutoCreated = true;\n }\n\n let adapterInstance: any;\n\n if (mode === \"local\") {\n console.log(\"[bit-form] DevTools iniciado em modo Local.\");\n adapterInstance = setupLocalDevTools(containerEl);\n } else if (mode === \"remote\") {\n console.log(\"[bit-form] DevTools iniciado em modo Remote.\");\n adapterInstance = setupRemoteDevTools(containerEl, url);\n } else {\n throw new Error(`[bit-form] Modo DevTools inválido: ${mode}`);\n }\n\n return {\n ...adapterInstance,\n destroy: () => {\n if (adapterInstance && typeof adapterInstance.destroy === \"function\") {\n adapterInstance.destroy();\n }\n\n if (isAutoCreated && containerEl.parentNode) {\n containerEl.parentNode.removeChild(containerEl);\n } else {\n containerEl.innerHTML = \"\";\n }\n },\n };\n}\n"],"mappings":"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","names":["getDevToolsCSS","BitFormDevToolsUI","container","actions","style","getDevToolsCSS","target","btn","action","storeId","storesState","storeEntries","panelHtml","id","state","hasErrors","meta","currentStep","totalSteps","triggerHtml","setupLocalDevTools","container","ui","BitFormDevToolsUI","id","bitBus","getFullSnapshot","states","instance","storeInstance","state","historyMeta","unsubscribe","setupRemoteDevTools","container","url","socket","sendMessage","message","sendAction","storeId","action","ui","BitFormDevToolsUI","id","msg","data","e","err","initDevTools","options","mode","url","containerEl","isAutoCreated","el","adapterInstance","setupLocalDevTools","setupRemoteDevTools"]}
1
+ {"version":3,"sources":["../../src/devtools/ui/styles.ts","../../src/devtools/ui/index.ts","../../src/devtools/adapters/local.ts","../../src/devtools/adapters/remote.ts","../../src/devtools/init-dev-tools.ts"],"sourcesContent":["export function getDevToolsCSS(): string {\n return `\n .bit-devtools-container {\n position: fixed;\n bottom: 20px;\n right: 20px;\n z-index: 9999;\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n }\n\n .bit-devtools-trigger {\n background: #10b981;\n color: #fff;\n border: none;\n border-radius: 50%;\n width: 48px;\n height: 48px;\n cursor: pointer;\n box-shadow: 0 4px 12px rgba(16, 185, 129, 0.4);\n font-weight: bold;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: transform 0.2s;\n font-size: 16px;\n margin-top: 16px;\n }\n .bit-devtools-trigger:hover { transform: scale(1.05); }\n\n .bit-devtools-panel {\n width: 450px;\n max-height: 80vh;\n background: #0f172a;\n color: #f8fafc;\n border-radius: 8px;\n padding: 16px;\n overflow-y: auto;\n box-shadow: 0 20px 25px -5px rgba(0,0,0,0.5), 0 8px 10px -6px rgba(0,0,0,0.5);\n border: 1px solid #334155;\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .bit-devtools-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-bottom: 12px;\n border-bottom: 1px solid #1e293b;\n }\n .bit-devtools-header h2 { margin: 0; font-size: 16px; display: flex; align-items: center; gap: 8px; }\n\n .bit-store-block {\n background: #1e293b;\n border-radius: 6px;\n padding: 12px;\n border: 1px solid #334155;\n }\n\n .bit-store-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n }\n .bit-store-title { margin: 0; color: #38bdf8; font-size: 14px; font-weight: bold; }\n\n .bit-badge-group { display: flex; gap: 6px; flex-wrap: wrap; }\n .bit-badge { font-size: 10px; padding: 2px 6px; border-radius: 4px; text-transform: uppercase; font-weight: bold; }\n .badge-success { background: rgba(16, 185, 129, 0.2); color: #34d399; border: 1px solid rgba(16, 185, 129, 0.2); }\n .badge-error { background: rgba(239, 68, 68, 0.2); color: #f87171; border: 1px solid rgba(239, 68, 68, 0.2); }\n .badge-warn { background: rgba(245, 158, 11, 0.2); color: #fbbf24; border: 1px solid rgba(245, 158, 11, 0.2); }\n .badge-info { background: rgba(56, 189, 248, 0.2); color: #7dd3fc; border: 1px solid rgba(56, 189, 248, 0.2); }\n\n .bit-section-title { font-size: 11px; color: #94a3b8; text-transform: uppercase; letter-spacing: 1px; margin: 12px 0 4px 0; display: block; }\n\n .bit-controls { display: flex; gap: 6px; margin-bottom: 12px; background: #0f172a; padding: 8px; border-radius: 6px; }\n .bit-action-btn { flex: 1; background: #334155; color: #e2e8f0; border: 1px solid #475569; padding: 6px 0; border-radius: 4px; cursor: pointer; font-size: 11px; display: flex; align-items: center; justify-content: center; gap: 4px; transition: all 0.2s; }\n .bit-action-btn:hover:not(:disabled) { background: #475569; }\n .bit-action-btn:disabled { opacity: 0.5; cursor: not-allowed; }\n .bit-btn-reset { color: #fca5a5; border-color: rgba(239,68,68,0.3); }\n .bit-btn-reset:hover { background: rgba(239,68,68,0.1) !important; }\n\n pre.bit-pre { background: #020617; padding: 10px; border-radius: 4px; font-size: 11px; overflow-x: auto; border: 1px solid #1e293b; margin: 0; color: #e2e8f0; }\n pre.bit-error-box { background: rgba(239, 68, 68, 0.05); padding: 10px; border-radius: 4px; font-size: 11px; border: 1px dashed #ef4444; color: #fca5a5; margin: 0; overflow-x: auto; }\n `;\n}\n","import { getDevToolsCSS } from \"./styles\";\nimport type { DevToolsActions } from \"../types\";\n\nexport type { DevToolsActions };\n\nexport class BitFormDevToolsUI {\n private container: HTMLElement;\n private actions: DevToolsActions;\n private rootElement: HTMLDivElement;\n private currentStoresState: Record<string, any> = {};\n private isOpen: boolean = false;\n\n constructor(container: HTMLElement, actions: DevToolsActions) {\n this.container = container;\n this.actions = actions;\n\n if (!document.getElementById(\"bit-devtools-styles\")) {\n const style = document.createElement(\"style\");\n style.id = \"bit-devtools-styles\";\n style.textContent = getDevToolsCSS();\n document.head.appendChild(style);\n }\n\n this.rootElement = document.createElement(\"div\");\n this.rootElement.className = \"bit-devtools-container\";\n this.container.appendChild(this.rootElement);\n\n this.rootElement.addEventListener(\"click\", (e) => {\n const target = e.target as HTMLElement;\n\n // Evento do botão flutuante\n if (target.closest(\".bit-devtools-trigger\")) {\n this.isOpen = !this.isOpen;\n this.render();\n return;\n }\n\n // Eventos dos botões de ação\n const btn = target.closest(\".bit-action-btn\");\n if (btn && !btn.hasAttribute(\"disabled\")) {\n const action = btn.getAttribute(\"data-action\");\n const storeId = btn.getAttribute(\"data-store\");\n\n if (action && storeId) {\n if (action === \"undo\") this.actions.onUndo(storeId);\n if (action === \"redo\") this.actions.onRedo(storeId);\n if (action === \"reset\") this.actions.onReset(storeId);\n }\n }\n });\n }\n\n public updateState(storesState: Record<string, any>) {\n this.currentStoresState = storesState;\n this.render();\n }\n\n private render() {\n const storeEntries = Object.entries(this.currentStoresState);\n if (storeEntries.length === 0) {\n this.rootElement.innerHTML = \"\";\n return;\n }\n\n let panelHtml = \"\";\n\n if (this.isOpen) {\n panelHtml = `\n <div class=\"bit-devtools-panel\">\n <div class=\"bit-devtools-header\">\n <h2><span style=\"font-size: 20px;\">🛠</span> Bit-Form DevTools</h2>\n <span style=\"font-size: 11px; color: #64748b;\">v1.0.0</span>\n </div>\n `;\n\n for (const [id, state] of storeEntries) {\n const hasErrors = Object.keys(state.errors || {}).length > 0;\n\n // Lemos os metadados do histórico que o adaptador injetou\n const meta = state._meta || {\n totalSteps: 0,\n currentIndex: -1,\n canUndo: false,\n canRedo: false,\n };\n const currentStep = meta.currentIndex + 1;\n const totalSteps = meta.totalSteps;\n\n panelHtml += `\n <div class=\"bit-store-block\">\n <div class=\"bit-store-header\">\n <h3 class=\"bit-store-title\">${id}</h3>\n <div class=\"bit-badge-group\">\n <span class=\"bit-badge ${state.isValid ? \"badge-success\" : \"badge-error\"}\">\n ${state.isValid ? \"✓ Valid\" : \"✕ Invalid\"}\n </span>\n ${state.isDirty ? `<span class=\"bit-badge badge-warn\">Dirty</span>` : \"\"}\n ${state.isSubmitting ? `<span class=\"bit-badge badge-info\">⏳ Submitting</span>` : \"\"}\n </div>\n </div>\n\n <span class=\"bit-section-title\">Time Travel (${currentStep}/${totalSteps})</span>\n \n <div class=\"bit-controls\">\n <button class=\"bit-action-btn\" data-action=\"undo\" data-store=\"${id}\" ${meta.canUndo ? \"\" : \"disabled\"}>\n <span>↺</span> Undo\n </button>\n <button class=\"bit-action-btn\" data-action=\"redo\" data-store=\"${id}\" ${meta.canRedo ? \"\" : \"disabled\"}>\n <span>↻</span> Redo\n </button>\n <button class=\"bit-action-btn bit-btn-reset\" data-action=\"reset\" data-store=\"${id}\">\n <span>🗑</span> Reset\n </button>\n </div>\n `;\n\n if (hasErrors) {\n panelHtml += `\n <span class=\"bit-section-title\" style=\"color: #f87171;\">⚠️ Validations Failing</span>\n <pre class=\"bit-error-box\">${JSON.stringify(state.errors, null, 2)}</pre>\n `;\n }\n\n panelHtml += `\n <span class=\"bit-section-title\">Values</span>\n <pre class=\"bit-pre\">${JSON.stringify(state.values, null, 2)}</pre>\n </div>\n `;\n }\n\n panelHtml += `</div>`;\n }\n\n // Botão Flutuante (sempre renderizado)\n const triggerHtml = `\n <button class=\"bit-devtools-trigger\" style=\"transform: ${this.isOpen ? \"scale(0.9)\" : \"scale(1)\"};\" title=\"Abrir DevTools\">\n ${this.isOpen ? \"✖\" : \"Bit\"}\n </button>\n `;\n\n this.rootElement.innerHTML = panelHtml + triggerHtml;\n }\n}\n","import { bitBus } from \"../../core\";\nimport type { BitStoreHooksApi } from \"../../core\";\nimport { BitFormDevToolsUI } from \"../ui\";\n\nexport function setupLocalDevTools(container: HTMLElement) {\n const ui = new BitFormDevToolsUI(container, {\n onUndo: (id) => (bitBus.stores[id] as BitStoreHooksApi<any>)?.undo(),\n onRedo: (id) => (bitBus.stores[id] as BitStoreHooksApi<any>)?.redo(),\n onReset: (id) => (bitBus.stores[id] as BitStoreHooksApi<any>)?.reset(),\n });\n\n const getFullSnapshot = () => {\n const states: Record<string, unknown> = {};\n\n for (const [id, instance] of Object.entries(bitBus.stores)) {\n const storeInstance = instance as BitStoreHooksApi<any>;\n const state = storeInstance.getState();\n\n const historyMeta = storeInstance?.getHistoryMetadata?.() || {\n enabled: false,\n canUndo: false,\n canRedo: false,\n historyIndex: -1,\n historySize: 0,\n };\n\n states[id] = {\n ...state,\n _meta: {\n canUndo: historyMeta.canUndo,\n canRedo: historyMeta.canRedo,\n totalSteps: historyMeta.historySize,\n currentIndex: historyMeta.historyIndex,\n },\n };\n }\n return states;\n };\n\n ui.updateState(getFullSnapshot());\n\n const unsubscribe = bitBus.subscribe(() => {\n ui.updateState(getFullSnapshot());\n });\n\n return {\n ui,\n destroy: () => {\n unsubscribe();\n container.innerHTML = \"\";\n },\n };\n}\n","import { BitFormDevToolsUI } from \"../ui\";\nimport type {\n DevToolsActionMessage,\n DevToolsActionName,\n DevToolsRemoteMessage,\n DevToolsStateUpdateMessage,\n} from \"../types\";\n\nexport function setupRemoteDevTools(\n container: HTMLElement,\n url: string = \"ws://localhost:3000\",\n) {\n const socket = new WebSocket(url);\n\n const sendMessage = (message: DevToolsRemoteMessage) => {\n if (socket.readyState === WebSocket.OPEN) {\n socket.send(JSON.stringify(message));\n } else {\n console.warn(\n \"[bit-form] Tentativa de envio falhou. WebSocket não está aberto.\",\n );\n }\n };\n\n const sendAction = (storeId: string, action: DevToolsActionName) => {\n const message: DevToolsActionMessage = {\n type: \"ACTION\",\n payload: { storeId, action },\n };\n sendMessage(message);\n };\n\n const ui = new BitFormDevToolsUI(container, {\n onUndo: (id) => sendAction(id, \"undo\"),\n onRedo: (id) => sendAction(id, \"redo\"),\n onReset: (id) => sendAction(id, \"reset\"),\n });\n\n socket.addEventListener(\"open\", () => {\n console.log(`[bit-form] Conectado ao DevTools remoto em ${url}`);\n });\n\n socket.addEventListener(\"message\", (msg: MessageEvent) => {\n try {\n const data = JSON.parse(msg.data) as DevToolsRemoteMessage;\n if (data.type === \"STATE_UPDATE\") {\n ui.updateState((data as DevToolsStateUpdateMessage).payload);\n }\n } catch (e) {\n console.error(\"[bit-form] Erro ao processar mensagem do WebSocket:\", e);\n }\n });\n\n socket.addEventListener(\"error\", (err) => {\n console.error(\"[bit-form] Erro na conexão do DevTools remoto:\", err);\n });\n\n return {\n ui,\n destroy: () => {\n if (\n socket.readyState === WebSocket.OPEN ||\n socket.readyState === WebSocket.CONNECTING\n ) {\n socket.close();\n }\n container.innerHTML = \"\";\n },\n };\n}\n","import { setupLocalDevTools } from \"./adapters/local\";\nimport { setupRemoteDevTools } from \"./adapters/remote\";\nimport type { BitDevToolsOptions } from \"./types\";\n\nexport type { BitDevToolsOptions };\n\nexport function initDevTools(options: BitDevToolsOptions = {}) {\n const { mode = \"local\", url } = options;\n let containerEl: HTMLElement;\n\n let isAutoCreated = false;\n\n if (typeof options.container === \"string\") {\n const el = document.querySelector<HTMLElement>(options.container);\n if (!el)\n throw new Error(\n `[bit-form] Container '${options.container}' não encontrado na página.`,\n );\n containerEl = el;\n } else if (options.container instanceof HTMLElement) {\n containerEl = options.container;\n } else {\n containerEl = document.createElement(\"div\");\n containerEl.id = \"bit-form-devtools-root\";\n containerEl.style.position = \"fixed\";\n containerEl.style.bottom = \"20px\";\n containerEl.style.right = \"20px\";\n containerEl.style.zIndex = \"9999\";\n containerEl.style.maxHeight = \"80vh\";\n containerEl.style.overflowY = \"auto\";\n containerEl.style.boxShadow = \"0 10px 25px rgba(0,0,0,0.1)\";\n document.body.appendChild(containerEl);\n isAutoCreated = true;\n }\n\n let adapterInstance: any;\n\n if (mode === \"local\") {\n console.log(\"[bit-form] DevTools iniciado em modo Local.\");\n adapterInstance = setupLocalDevTools(containerEl);\n } else if (mode === \"remote\") {\n console.log(\"[bit-form] DevTools iniciado em modo Remote.\");\n adapterInstance = setupRemoteDevTools(containerEl, url);\n } else {\n throw new Error(`[bit-form] Modo DevTools inválido: ${mode}`);\n }\n\n return {\n ...adapterInstance,\n destroy: () => {\n if (adapterInstance && typeof adapterInstance.destroy === \"function\") {\n adapterInstance.destroy();\n }\n\n if (isAutoCreated && containerEl.parentNode) {\n containerEl.parentNode.removeChild(containerEl);\n } else {\n containerEl.innerHTML = \"\";\n }\n },\n };\n}\n"],"mappings":"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","names":["getDevToolsCSS","BitFormDevToolsUI","container","actions","style","getDevToolsCSS","target","btn","action","storeId","storesState","storeEntries","panelHtml","id","state","hasErrors","meta","currentStep","totalSteps","triggerHtml","setupLocalDevTools","container","ui","BitFormDevToolsUI","id","bitBus","getFullSnapshot","states","instance","storeInstance","state","historyMeta","unsubscribe","setupRemoteDevTools","container","url","socket","sendMessage","message","sendAction","storeId","action","ui","BitFormDevToolsUI","id","msg","data","e","err","initDevTools","options","mode","url","containerEl","isAutoCreated","el","adapterInstance","setupLocalDevTools","setupRemoteDevTools"]}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkLOYB7TTMcjs = require('./chunk-LOYB7TTM.cjs');require('./chunk-EI5L5L3R.cjs');exports.bitBus = _chunkLOYB7TTMcjs.j; exports.cleanPrefixedKeys = _chunkLOYB7TTMcjs.g; exports.createBitStore = _chunkLOYB7TTMcjs.l; exports.deepClone = _chunkLOYB7TTMcjs.a; exports.deepEqual = _chunkLOYB7TTMcjs.d; exports.deepMerge = _chunkLOYB7TTMcjs.b; exports.extractServerErrors = _chunkLOYB7TTMcjs.i; exports.getDeepValue = _chunkLOYB7TTMcjs.e; exports.isValidationErrorShape = _chunkLOYB7TTMcjs.h; exports.resolveBitStoreForHooks = _chunkLOYB7TTMcjs.k; exports.setDeepValue = _chunkLOYB7TTMcjs.f; exports.valueEqual = _chunkLOYB7TTMcjs.c;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkOZKLQRO6cjs = require('./chunk-OZKLQRO6.cjs');exports.bitBus = _chunkOZKLQRO6cjs.j; exports.cleanPrefixedKeys = _chunkOZKLQRO6cjs.g; exports.createBitStore = _chunkOZKLQRO6cjs.l; exports.deepClone = _chunkOZKLQRO6cjs.a; exports.deepEqual = _chunkOZKLQRO6cjs.d; exports.deepMerge = _chunkOZKLQRO6cjs.b; exports.extractServerErrors = _chunkOZKLQRO6cjs.i; exports.getDeepValue = _chunkOZKLQRO6cjs.e; exports.isValidationErrorShape = _chunkOZKLQRO6cjs.h; exports.resolveBitStoreForHooks = _chunkOZKLQRO6cjs.k; exports.setDeepValue = _chunkOZKLQRO6cjs.f; exports.valueEqual = _chunkOZKLQRO6cjs.c;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/bit-form/bit-form/dist/index.cjs"],"names":[],"mappings":"AAAA,iIAAqH,gCAA6B,iiBAAkP","file":"/home/runner/work/bit-form/bit-form/dist/index.cjs"}
1
+ {"version":3,"sources":["/home/runner/work/bit-form/bit-form/dist/index.cjs"],"names":[],"mappings":"AAAA,iIAAqH,iiBAAkP","file":"/home/runner/work/bit-form/bit-form/dist/index.cjs"}
package/dist/index.d.cts CHANGED
@@ -1,53 +1,18 @@
1
1
  import { B as BitMask, a as BitMaskName } from './types-D8DgIUhJ.cjs';
2
- import { e as BitState, o as BitTransformFn, p as BitFieldChangeEvent, q as BitBeforeSubmitEvent, r as BitAfterSubmitEvent, a as BitFieldDefinition, i as BitErrors, s as BitBeforeValidateEvent, t as BitAfterValidateEvent, B as BitConfig, u as BitComputedFn, f as BitPath, m as BitFieldState, g as BitPathValue, v as BitFieldChangeMeta, h as DeepPartial, j as BitPersistMetadata, k as BitArrayPath, l as BitArrayItem } from './bus-a_GA51Qw.cjs';
3
- export { w as BitFieldConditional, x as BitFieldValidation, y as BitHistoryConfig, z as BitPersistConfig, A as BitPersistMode, C as BitPersistStorageAdapter, d as BitPlugin, E as BitPluginContext, F as BitPluginErrorEvent, G as BitPluginHooks, H as BitTouched, I as BitValidationConfig, S as ScopeStatus, n as ValidateScopeResult, V as ValidatorFn, J as bitBus } from './bus-a_GA51Qw.cjs';
4
- import { B as BitFrameworkConfig, a as BitValidationOptions, b as BitSelector, c as BitSelectorSubscriptionOptions, d as BitHistoryMetadata, e as BitStoreApi, f as BitStoreHooksApi } from './public-types-D14VY_4o.cjs';
5
- export { g as BitEqualityFn } from './public-types-D14VY_4o.cjs';
2
+ import { o as BitComputedFn, B as BitConfig, a as BitFieldDefinition, p as BitTransformFn, e as BitState, f as BitPath, m as BitFieldState, g as BitPathValue, q as BitFieldChangeMeta, h as DeepPartial, i as BitErrors, j as BitPersistMetadata, k as BitArrayPath, l as BitArrayItem, r as BitBeforeValidateEvent, s as BitAfterValidateEvent, t as BitBeforeSubmitEvent, u as BitAfterSubmitEvent, v as BitFieldChangeEvent } from './bus-BeAeZwWu.cjs';
3
+ export { w as BitFieldConditional, x as BitFieldValidation, y as BitHistoryConfig, z as BitPersistConfig, A as BitPersistMode, C as BitPersistStorageAdapter, d as BitPlugin, E as BitPluginContext, F as BitPluginErrorEvent, G as BitPluginHooks, H as BitTouched, I as BitValidationConfig, S as ScopeStatus, n as ValidateScopeResult, V as ValidatorFn, J as bitBus } from './bus-BeAeZwWu.cjs';
4
+ import { B as BitFrameworkConfig, a as BitSelector, b as BitSelectorSubscriptionOptions, c as BitHistoryMetadata, d as BitValidationOptions, e as BitStoreApi, f as BitStoreHooksApi } from './public-types-BQXaxmAE.cjs';
5
+ export { g as BitEqualityFn } from './public-types-BQXaxmAE.cjs';
6
6
  export { a as BitDeleteUploadFn, B as BitUploadFn, b as BitUploadResult } from './upload-EXnJLq8k.cjs';
7
7
 
8
- interface BitLifecycleStorePort<T extends object> {
9
- getState: () => BitState<T>;
10
- internalUpdateState: (partial: Partial<BitState<T>>, changedPaths?: string[]) => void;
11
- internalSaveSnapshot: () => void;
12
- getTransformEntries: () => [string, BitTransformFn<T>][];
13
- config: BitFrameworkConfig<T>;
14
- updateDependencies: (changedPath: string, newValues: T) => string[];
15
- isFieldHidden: (path: string) => boolean;
16
- evaluateAllDependencies: (values: T) => void;
17
- getHiddenFields: () => string[];
18
- clearFieldValidation: (path: string) => void;
19
- triggerValidation: (scopeFields?: string[]) => void;
20
- handleFieldAsyncValidation: (path: string, value: any) => void;
21
- cancelAllValidations: () => void;
22
- validateNow: (options?: BitValidationOptions) => Promise<boolean>;
23
- hasValidationsInProgress: (scopeFields?: string[]) => boolean;
24
- updateDirtyForPath: (path: string, nextValues: T, baselineValues: T) => boolean;
25
- rebuildDirtyState: (nextValues: T, baselineValues: T) => boolean;
26
- clearDirtyState: () => void;
27
- buildDirtyValues: (values: T) => Partial<T>;
28
- resetHistory: (initialValues: T) => void;
29
- emitFieldChange: (event: BitFieldChangeEvent<T>) => void;
30
- emitBeforeSubmit: (event: BitBeforeSubmitEvent<T>) => Promise<void>;
31
- emitAfterSubmit: (event: BitAfterSubmitEvent<T>) => Promise<void>;
32
- emitOperationalError: (event: {
33
- source: "submit";
34
- error: unknown;
35
- payload?: unknown;
36
- }) => Promise<void>;
8
+ interface BitComputedEntry<T extends object> {
9
+ path: string;
10
+ compute: BitComputedFn<T>;
11
+ dependsOn?: readonly string[];
37
12
  }
38
13
 
39
- interface BitValidationStorePort<T extends object> {
40
- getState: () => BitState<T>;
41
- internalUpdateState: (partial: Partial<BitState<T>>) => void;
42
- setError: (path: string, message: string | undefined) => void;
43
- validate: (opts: BitValidationOptions) => Promise<boolean>;
44
- getFieldConfig: (path: string) => BitFieldDefinition<T> | undefined;
45
- getScopeFields: (scopeName: string) => string[];
46
- config: BitFrameworkConfig<T>;
47
- getRequiredErrors: (values: T) => BitErrors<T>;
48
- getHiddenFields: () => string[];
49
- emitBeforeValidate: (event: BitBeforeValidateEvent<T>) => Promise<void>;
50
- emitAfterValidate: (event: BitAfterValidateEvent<T>) => Promise<void>;
14
+ interface BitValidationTriggerOptions {
15
+ forceDebounce?: boolean;
51
16
  }
52
17
 
53
18
  /**
@@ -60,7 +25,7 @@ interface BitValidationStorePort<T extends object> {
60
25
  * - Feature managers provide optional enhancements (history, arrays, scopes)
61
26
  * - Query/mutation managers organize domain-specific operations
62
27
  */
63
- declare class BitStore<T extends object = any> implements BitValidationStorePort<T>, BitLifecycleStorePort<T> {
28
+ declare class BitStore<T extends object = any> {
64
29
  private state;
65
30
  private readonly subscriptions;
66
31
  private readonly effects;
@@ -73,7 +38,13 @@ declare class BitStore<T extends object = any> implements BitValidationStorePort
73
38
  private scopeFieldsIndex;
74
39
  private computedEntriesCache;
75
40
  private transformEntriesCache;
41
+ private batchDepth;
42
+ private batchedState;
43
+ private batchedChangedPaths;
44
+ private batchedValuesChanged;
76
45
  private invalidateFieldIndexes;
46
+ private registerCachedFieldIndexes;
47
+ private unregisterCachedFieldIndexes;
77
48
  private getCapability;
78
49
  private get validation();
79
50
  private get lifecycle();
@@ -86,7 +57,7 @@ declare class BitStore<T extends object = any> implements BitValidationStorePort
86
57
  getConfig(): BitFrameworkConfig<T>;
87
58
  getFieldConfig(path: string): BitFieldDefinition<T> | undefined;
88
59
  getScopeFields(scopeName: string): string[];
89
- getComputedEntries(): [string, BitComputedFn<T>][];
60
+ getComputedEntries(): BitComputedEntry<T>[];
90
61
  getTransformEntries(): [string, BitTransformFn<T>][];
91
62
  resolveMask(path: string): BitMask | undefined;
92
63
  getState(): BitState<T>;
@@ -116,6 +87,7 @@ declare class BitStore<T extends object = any> implements BitValidationStorePort
116
87
  setErrors(errors: BitErrors<T>): void;
117
88
  setServerErrors(serverErrors: Record<string, string[] | string>): void;
118
89
  reset(): void;
90
+ transaction<TResult>(callback: () => TResult): TResult;
119
91
  submit(onSuccess: (values: T, dirtyValues?: Partial<T>) => void | Promise<void>): Promise<void>;
120
92
  registerMask(name: BitMaskName, mask: BitMask): void;
121
93
  getDirtyValues(): Partial<T>;
@@ -146,7 +118,7 @@ declare class BitStore<T extends object = any> implements BitValidationStorePort
146
118
  payload?: unknown;
147
119
  }): Promise<void>;
148
120
  hasValidationsInProgress(scopeFields?: string[]): boolean;
149
- triggerValidation(scopeFields?: string[]): void;
121
+ triggerValidation(scopeFields?: string[], options?: BitValidationTriggerOptions): void;
150
122
  getStepStatus(scopeName: string): {
151
123
  hasErrors: boolean;
152
124
  isDirty: boolean;
@@ -156,7 +128,7 @@ declare class BitStore<T extends object = any> implements BitValidationStorePort
156
128
  updateDependencies(changedPath: string, newValues: T): string[];
157
129
  isFieldHidden(path: string): boolean;
158
130
  evaluateAllDependencies(values: T): void;
159
- getHiddenFields(): string[];
131
+ getHiddenFields(): ReadonlySet<string>;
160
132
  getRequiredErrors(values: T): BitErrors<T>;
161
133
  clearFieldValidation(path: string): void;
162
134
  handleFieldAsyncValidation(path: string, value: any): void;
@@ -166,11 +138,13 @@ declare class BitStore<T extends object = any> implements BitValidationStorePort
166
138
  rebuildDirtyState(nextValues: T, baselineValues: T): boolean;
167
139
  clearDirtyState(): void;
168
140
  buildDirtyValues(values: T): Partial<T>;
141
+ batchStateUpdates<TResult>(callback: () => TResult): TResult;
169
142
  resetHistory(initialValues: T): void;
170
143
  internalUpdateState(partialState: Partial<BitState<T>>, changedPaths?: string[]): void;
171
144
  internalSaveSnapshot(): void;
172
145
  private applyPersistedValues;
173
146
  cleanup(): void;
147
+ private flushBatchedStateUpdates;
174
148
  }
175
149
 
176
150
  declare function resolveBitStoreForHooks<T extends object>(store: BitStoreApi<T> | BitStore<T>): BitStoreHooksApi<T>;
package/dist/index.d.ts CHANGED
@@ -1,53 +1,18 @@
1
1
  import { B as BitMask, a as BitMaskName } from './types-D8DgIUhJ.js';
2
- import { e as BitState, o as BitTransformFn, p as BitFieldChangeEvent, q as BitBeforeSubmitEvent, r as BitAfterSubmitEvent, a as BitFieldDefinition, i as BitErrors, s as BitBeforeValidateEvent, t as BitAfterValidateEvent, B as BitConfig, u as BitComputedFn, f as BitPath, m as BitFieldState, g as BitPathValue, v as BitFieldChangeMeta, h as DeepPartial, j as BitPersistMetadata, k as BitArrayPath, l as BitArrayItem } from './bus-BQI1FIOs.js';
3
- export { w as BitFieldConditional, x as BitFieldValidation, y as BitHistoryConfig, z as BitPersistConfig, A as BitPersistMode, C as BitPersistStorageAdapter, d as BitPlugin, E as BitPluginContext, F as BitPluginErrorEvent, G as BitPluginHooks, H as BitTouched, I as BitValidationConfig, S as ScopeStatus, n as ValidateScopeResult, V as ValidatorFn, J as bitBus } from './bus-BQI1FIOs.js';
4
- import { B as BitFrameworkConfig, a as BitValidationOptions, b as BitSelector, c as BitSelectorSubscriptionOptions, d as BitHistoryMetadata, e as BitStoreApi, f as BitStoreHooksApi } from './public-types-D3WIiMGu.js';
5
- export { g as BitEqualityFn } from './public-types-D3WIiMGu.js';
2
+ import { o as BitComputedFn, B as BitConfig, a as BitFieldDefinition, p as BitTransformFn, e as BitState, f as BitPath, m as BitFieldState, g as BitPathValue, q as BitFieldChangeMeta, h as DeepPartial, i as BitErrors, j as BitPersistMetadata, k as BitArrayPath, l as BitArrayItem, r as BitBeforeValidateEvent, s as BitAfterValidateEvent, t as BitBeforeSubmitEvent, u as BitAfterSubmitEvent, v as BitFieldChangeEvent } from './bus-B4zZmB9C.js';
3
+ export { w as BitFieldConditional, x as BitFieldValidation, y as BitHistoryConfig, z as BitPersistConfig, A as BitPersistMode, C as BitPersistStorageAdapter, d as BitPlugin, E as BitPluginContext, F as BitPluginErrorEvent, G as BitPluginHooks, H as BitTouched, I as BitValidationConfig, S as ScopeStatus, n as ValidateScopeResult, V as ValidatorFn, J as bitBus } from './bus-B4zZmB9C.js';
4
+ import { B as BitFrameworkConfig, a as BitSelector, b as BitSelectorSubscriptionOptions, c as BitHistoryMetadata, d as BitValidationOptions, e as BitStoreApi, f as BitStoreHooksApi } from './public-types-CVgFf_qY.js';
5
+ export { g as BitEqualityFn } from './public-types-CVgFf_qY.js';
6
6
  export { a as BitDeleteUploadFn, B as BitUploadFn, b as BitUploadResult } from './upload-EXnJLq8k.js';
7
7
 
8
- interface BitLifecycleStorePort<T extends object> {
9
- getState: () => BitState<T>;
10
- internalUpdateState: (partial: Partial<BitState<T>>, changedPaths?: string[]) => void;
11
- internalSaveSnapshot: () => void;
12
- getTransformEntries: () => [string, BitTransformFn<T>][];
13
- config: BitFrameworkConfig<T>;
14
- updateDependencies: (changedPath: string, newValues: T) => string[];
15
- isFieldHidden: (path: string) => boolean;
16
- evaluateAllDependencies: (values: T) => void;
17
- getHiddenFields: () => string[];
18
- clearFieldValidation: (path: string) => void;
19
- triggerValidation: (scopeFields?: string[]) => void;
20
- handleFieldAsyncValidation: (path: string, value: any) => void;
21
- cancelAllValidations: () => void;
22
- validateNow: (options?: BitValidationOptions) => Promise<boolean>;
23
- hasValidationsInProgress: (scopeFields?: string[]) => boolean;
24
- updateDirtyForPath: (path: string, nextValues: T, baselineValues: T) => boolean;
25
- rebuildDirtyState: (nextValues: T, baselineValues: T) => boolean;
26
- clearDirtyState: () => void;
27
- buildDirtyValues: (values: T) => Partial<T>;
28
- resetHistory: (initialValues: T) => void;
29
- emitFieldChange: (event: BitFieldChangeEvent<T>) => void;
30
- emitBeforeSubmit: (event: BitBeforeSubmitEvent<T>) => Promise<void>;
31
- emitAfterSubmit: (event: BitAfterSubmitEvent<T>) => Promise<void>;
32
- emitOperationalError: (event: {
33
- source: "submit";
34
- error: unknown;
35
- payload?: unknown;
36
- }) => Promise<void>;
8
+ interface BitComputedEntry<T extends object> {
9
+ path: string;
10
+ compute: BitComputedFn<T>;
11
+ dependsOn?: readonly string[];
37
12
  }
38
13
 
39
- interface BitValidationStorePort<T extends object> {
40
- getState: () => BitState<T>;
41
- internalUpdateState: (partial: Partial<BitState<T>>) => void;
42
- setError: (path: string, message: string | undefined) => void;
43
- validate: (opts: BitValidationOptions) => Promise<boolean>;
44
- getFieldConfig: (path: string) => BitFieldDefinition<T> | undefined;
45
- getScopeFields: (scopeName: string) => string[];
46
- config: BitFrameworkConfig<T>;
47
- getRequiredErrors: (values: T) => BitErrors<T>;
48
- getHiddenFields: () => string[];
49
- emitBeforeValidate: (event: BitBeforeValidateEvent<T>) => Promise<void>;
50
- emitAfterValidate: (event: BitAfterValidateEvent<T>) => Promise<void>;
14
+ interface BitValidationTriggerOptions {
15
+ forceDebounce?: boolean;
51
16
  }
52
17
 
53
18
  /**
@@ -60,7 +25,7 @@ interface BitValidationStorePort<T extends object> {
60
25
  * - Feature managers provide optional enhancements (history, arrays, scopes)
61
26
  * - Query/mutation managers organize domain-specific operations
62
27
  */
63
- declare class BitStore<T extends object = any> implements BitValidationStorePort<T>, BitLifecycleStorePort<T> {
28
+ declare class BitStore<T extends object = any> {
64
29
  private state;
65
30
  private readonly subscriptions;
66
31
  private readonly effects;
@@ -73,7 +38,13 @@ declare class BitStore<T extends object = any> implements BitValidationStorePort
73
38
  private scopeFieldsIndex;
74
39
  private computedEntriesCache;
75
40
  private transformEntriesCache;
41
+ private batchDepth;
42
+ private batchedState;
43
+ private batchedChangedPaths;
44
+ private batchedValuesChanged;
76
45
  private invalidateFieldIndexes;
46
+ private registerCachedFieldIndexes;
47
+ private unregisterCachedFieldIndexes;
77
48
  private getCapability;
78
49
  private get validation();
79
50
  private get lifecycle();
@@ -86,7 +57,7 @@ declare class BitStore<T extends object = any> implements BitValidationStorePort
86
57
  getConfig(): BitFrameworkConfig<T>;
87
58
  getFieldConfig(path: string): BitFieldDefinition<T> | undefined;
88
59
  getScopeFields(scopeName: string): string[];
89
- getComputedEntries(): [string, BitComputedFn<T>][];
60
+ getComputedEntries(): BitComputedEntry<T>[];
90
61
  getTransformEntries(): [string, BitTransformFn<T>][];
91
62
  resolveMask(path: string): BitMask | undefined;
92
63
  getState(): BitState<T>;
@@ -116,6 +87,7 @@ declare class BitStore<T extends object = any> implements BitValidationStorePort
116
87
  setErrors(errors: BitErrors<T>): void;
117
88
  setServerErrors(serverErrors: Record<string, string[] | string>): void;
118
89
  reset(): void;
90
+ transaction<TResult>(callback: () => TResult): TResult;
119
91
  submit(onSuccess: (values: T, dirtyValues?: Partial<T>) => void | Promise<void>): Promise<void>;
120
92
  registerMask(name: BitMaskName, mask: BitMask): void;
121
93
  getDirtyValues(): Partial<T>;
@@ -146,7 +118,7 @@ declare class BitStore<T extends object = any> implements BitValidationStorePort
146
118
  payload?: unknown;
147
119
  }): Promise<void>;
148
120
  hasValidationsInProgress(scopeFields?: string[]): boolean;
149
- triggerValidation(scopeFields?: string[]): void;
121
+ triggerValidation(scopeFields?: string[], options?: BitValidationTriggerOptions): void;
150
122
  getStepStatus(scopeName: string): {
151
123
  hasErrors: boolean;
152
124
  isDirty: boolean;
@@ -156,7 +128,7 @@ declare class BitStore<T extends object = any> implements BitValidationStorePort
156
128
  updateDependencies(changedPath: string, newValues: T): string[];
157
129
  isFieldHidden(path: string): boolean;
158
130
  evaluateAllDependencies(values: T): void;
159
- getHiddenFields(): string[];
131
+ getHiddenFields(): ReadonlySet<string>;
160
132
  getRequiredErrors(values: T): BitErrors<T>;
161
133
  clearFieldValidation(path: string): void;
162
134
  handleFieldAsyncValidation(path: string, value: any): void;
@@ -166,11 +138,13 @@ declare class BitStore<T extends object = any> implements BitValidationStorePort
166
138
  rebuildDirtyState(nextValues: T, baselineValues: T): boolean;
167
139
  clearDirtyState(): void;
168
140
  buildDirtyValues(values: T): Partial<T>;
141
+ batchStateUpdates<TResult>(callback: () => TResult): TResult;
169
142
  resetHistory(initialValues: T): void;
170
143
  internalUpdateState(partialState: Partial<BitState<T>>, changedPaths?: string[]): void;
171
144
  internalSaveSnapshot(): void;
172
145
  private applyPersistedValues;
173
146
  cleanup(): void;
147
+ private flushBatchedStateUpdates;
174
148
  }
175
149
 
176
150
  declare function resolveBitStoreForHooks<T extends object>(store: BitStoreApi<T> | BitStore<T>): BitStoreHooksApi<T>;
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{a as o,b as r,c as e,d as f,e as m,f as p,g as t,h as x,i as a,j as b,k as c,l as d}from"./chunk-AE4G32HS.js";import"./chunk-7LMNIQTT.js";export{b as bitBus,t as cleanPrefixedKeys,d as createBitStore,o as deepClone,f as deepEqual,r as deepMerge,a as extractServerErrors,m as getDeepValue,x as isValidationErrorShape,c as resolveBitStoreForHooks,p as setDeepValue,e as valueEqual};
1
+ import{a as o,b as r,c as e,d as f,e as m,f as p,g as t,h as x,i as a,j as b,k as c,l as d}from"./chunk-64KSP4TP.js";export{b as bitBus,t as cleanPrefixedKeys,d as createBitStore,o as deepClone,f as deepEqual,r as deepMerge,a as extractServerErrors,m as getDeepValue,x as isValidationErrorShape,c as resolveBitStoreForHooks,p as setDeepValue,e as valueEqual};
2
2
  //# sourceMappingURL=index.js.map