@lehnihon/bit-form 2.2.5 → 2.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/README.md +80 -24
  2. package/dist/angular/index.cjs +1 -1
  3. package/dist/angular/index.cjs.map +1 -1
  4. package/dist/angular/index.d.cts +18 -20
  5. package/dist/angular/index.d.ts +18 -20
  6. package/dist/angular/index.js +1 -1
  7. package/dist/angular/index.js.map +1 -1
  8. package/dist/array-controller-C1A5VKYd.d.cts +23 -0
  9. package/dist/array-controller-DtkmcnUr.d.ts +23 -0
  10. package/dist/{bus-B4zZmB9C.d.ts → bus-DgilLszS.d.ts} +83 -15
  11. package/dist/{bus-BeAeZwWu.d.cts → bus-rcUiufS7.d.cts} +83 -15
  12. package/dist/chunk-DIEE6LUO.js +2 -0
  13. package/dist/chunk-DIEE6LUO.js.map +1 -0
  14. package/dist/chunk-FUUQB4DV.cjs +2 -0
  15. package/dist/chunk-FUUQB4DV.cjs.map +1 -0
  16. package/dist/chunk-IV32WXCF.cjs +2 -0
  17. package/dist/chunk-IV32WXCF.cjs.map +1 -0
  18. package/dist/chunk-K5X37E3U.js +2 -0
  19. package/dist/chunk-K5X37E3U.js.map +1 -0
  20. package/dist/chunk-KWLLYQOL.cjs +2 -0
  21. package/dist/chunk-KWLLYQOL.cjs.map +1 -0
  22. package/dist/chunk-LIYZPSWM.js +2 -0
  23. package/dist/chunk-LIYZPSWM.js.map +1 -0
  24. package/dist/chunk-O5UPA33R.js +2 -0
  25. package/dist/chunk-O5UPA33R.js.map +1 -0
  26. package/dist/chunk-QAL6J5GQ.cjs +2 -0
  27. package/dist/chunk-QAL6J5GQ.cjs.map +1 -0
  28. package/dist/chunk-QKGTVKBU.cjs +2 -0
  29. package/dist/chunk-QKGTVKBU.cjs.map +1 -0
  30. package/dist/chunk-SA47B5OP.js +2 -0
  31. package/dist/chunk-SA47B5OP.js.map +1 -0
  32. package/dist/cli/index.cjs +22 -22
  33. package/dist/core.cjs +2 -0
  34. package/dist/core.cjs.map +1 -0
  35. package/dist/core.d.cts +122 -0
  36. package/dist/core.d.ts +122 -0
  37. package/dist/core.js +2 -0
  38. package/dist/core.js.map +1 -0
  39. package/dist/devtools/bridge.cjs +1 -1
  40. package/dist/devtools/bridge.cjs.map +1 -1
  41. package/dist/devtools/bridge.d.cts +4 -1
  42. package/dist/devtools/bridge.d.ts +4 -1
  43. package/dist/devtools/bridge.js +1 -1
  44. package/dist/devtools/bridge.js.map +1 -1
  45. package/dist/devtools/index.cjs +18 -18
  46. package/dist/devtools/index.cjs.map +1 -1
  47. package/dist/devtools/index.d.cts +26 -2
  48. package/dist/devtools/index.d.ts +26 -2
  49. package/dist/devtools/index.js +18 -18
  50. package/dist/devtools/index.js.map +1 -1
  51. package/dist/devtools/protocol.cjs +2 -0
  52. package/dist/devtools/protocol.cjs.map +1 -0
  53. package/dist/devtools/protocol.d.cts +54 -0
  54. package/dist/devtools/protocol.d.ts +54 -0
  55. package/dist/devtools/protocol.js +2 -0
  56. package/dist/devtools/protocol.js.map +1 -0
  57. package/dist/field-binding-Bi1g-D8X.d.ts +25 -0
  58. package/dist/field-binding-X5TkvfUt.d.cts +25 -0
  59. package/dist/index.cjs +1 -1
  60. package/dist/index.cjs.map +1 -1
  61. package/dist/index.d.cts +64 -150
  62. package/dist/index.d.ts +64 -150
  63. package/dist/index.js +1 -1
  64. package/dist/mask.d.cts +2 -2
  65. package/dist/mask.d.ts +2 -2
  66. package/dist/react/index.cjs +1 -1
  67. package/dist/react/index.cjs.map +1 -1
  68. package/dist/react/index.d.cts +8 -7
  69. package/dist/react/index.d.ts +8 -7
  70. package/dist/react/index.js +1 -1
  71. package/dist/react/index.js.map +1 -1
  72. package/dist/react-native/index.cjs +1 -1
  73. package/dist/react-native/index.cjs.map +1 -1
  74. package/dist/react-native/index.d.cts +7 -6
  75. package/dist/react-native/index.d.ts +7 -6
  76. package/dist/react-native/index.js +1 -1
  77. package/dist/react-native/index.js.map +1 -1
  78. package/dist/resolvers/index.cjs +1 -1
  79. package/dist/resolvers/index.cjs.map +1 -1
  80. package/dist/resolvers/index.d.cts +2 -2
  81. package/dist/resolvers/index.d.ts +2 -2
  82. package/dist/resolvers/index.js +1 -1
  83. package/dist/resolvers/joi.d.cts +2 -2
  84. package/dist/resolvers/joi.d.ts +2 -2
  85. package/dist/resolvers/yup.d.cts +2 -2
  86. package/dist/resolvers/yup.d.ts +2 -2
  87. package/dist/resolvers/zod.d.cts +2 -2
  88. package/dist/resolvers/zod.d.ts +2 -2
  89. package/dist/store-api-types-9ipdute1.d.ts +187 -0
  90. package/dist/store-api-types-B6_bPoVI.d.cts +187 -0
  91. package/dist/{types-D8DgIUhJ.d.cts → types-CUXh7PqD.d.cts} +1 -1
  92. package/dist/{types-D8DgIUhJ.d.ts → types-CUXh7PqD.d.ts} +1 -1
  93. package/dist/{use-bit-persist-iPWLbD8l.d.ts → use-bit-persist-Bc06fmqZ.d.ts} +12 -14
  94. package/dist/{use-bit-persist-CIVN-oIi.d.cts → use-bit-persist-CIKFwtdM.d.cts} +12 -14
  95. package/dist/vue/index.cjs +1 -1
  96. package/dist/vue/index.cjs.map +1 -1
  97. package/dist/vue/index.d.cts +15 -18
  98. package/dist/vue/index.d.ts +15 -18
  99. package/dist/vue/index.js +1 -1
  100. package/dist/vue/index.js.map +1 -1
  101. package/package.json +20 -11
  102. package/dist/chunk-2FDEJYA5.js +0 -2
  103. package/dist/chunk-2FDEJYA5.js.map +0 -1
  104. package/dist/chunk-3CARTBEN.cjs +0 -2
  105. package/dist/chunk-3CARTBEN.cjs.map +0 -1
  106. package/dist/chunk-64KSP4TP.js +0 -2
  107. package/dist/chunk-64KSP4TP.js.map +0 -1
  108. package/dist/chunk-JIWR4KSZ.cjs +0 -2
  109. package/dist/chunk-JIWR4KSZ.cjs.map +0 -1
  110. package/dist/chunk-OZKLQRO6.cjs +0 -2
  111. package/dist/chunk-OZKLQRO6.cjs.map +0 -1
  112. package/dist/chunk-QWH2NBVB.js +0 -2
  113. package/dist/chunk-QWH2NBVB.js.map +0 -1
  114. package/dist/chunk-UMKOKAPD.js +0 -2
  115. package/dist/chunk-UMKOKAPD.js.map +0 -1
  116. package/dist/chunk-VQ7MK5VB.cjs +0 -2
  117. package/dist/chunk-VQ7MK5VB.cjs.map +0 -1
  118. package/dist/field-binding-BXw0Ku2c.d.cts +0 -12
  119. package/dist/field-binding-BXw0Ku2c.d.ts +0 -12
  120. package/dist/public-types-BQXaxmAE.d.cts +0 -94
  121. package/dist/public-types-CVgFf_qY.d.ts +0 -94
@@ -1,4 +1,4 @@
1
- import{j as d}from"../chunk-64KSP4TP.js";function b(){return`
1
+ import{a as c,b as g,c as v}from"../chunk-DIEE6LUO.js";import{a as p,d as u}from"../chunk-K5X37E3U.js";import{j as f}from"../chunk-SA47B5OP.js";import"../chunk-3NUJVIAM.js";function x(){return`
2
2
  .bit-devtools-container {
3
3
  position: fixed;
4
4
  bottom: 20px;
@@ -86,48 +86,48 @@ import{j as d}from"../chunk-64KSP4TP.js";function b(){return`
86
86
 
87
87
  pre.bit-pre { background: #020617; padding: 10px; border-radius: 4px; font-size: 11px; overflow-x: auto; border: 1px solid #1e293b; margin: 0; color: #e2e8f0; }
88
88
  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; }
89
- `}var c=class{container;actions;rootElement;currentStoresState={};isOpen=!1;constructor(i,r){if(this.container=i,this.actions=r,!document.getElementById("bit-devtools-styles")){let e=document.createElement("style");e.id="bit-devtools-styles",e.textContent=b(),document.head.appendChild(e)}this.rootElement=document.createElement("div"),this.rootElement.className="bit-devtools-container",this.container.appendChild(this.rootElement),this.rootElement.addEventListener("click",e=>{let s=e.target;if(s.closest(".bit-devtools-trigger")){this.isOpen=!this.isOpen,this.render();return}let t=s.closest(".bit-action-btn");if(t&&!t.hasAttribute("disabled")){let o=t.getAttribute("data-action"),n=t.getAttribute("data-store");o&&n&&(o==="undo"&&this.actions.onUndo(n),o==="redo"&&this.actions.onRedo(n),o==="reset"&&this.actions.onReset(n))}})}updateState(i){this.currentStoresState=i,this.render()}render(){let i=Object.entries(this.currentStoresState);if(i.length===0){this.rootElement.innerHTML="";return}let r="";if(this.isOpen){r=`
89
+ `}var d=class{container;actions;rootElement;currentStoresState={};isOpen=!1;constructor(r,i){if(this.container=r,this.actions=i,!document.getElementById("bit-devtools-styles")){let t=document.createElement("style");t.id="bit-devtools-styles",t.textContent=x(),document.head.appendChild(t)}this.rootElement=document.createElement("div"),this.rootElement.className="bit-devtools-container",this.container.appendChild(this.rootElement),this.rootElement.addEventListener("click",t=>{let e=t.target;if(e.closest(".bit-devtools-trigger")){this.isOpen=!this.isOpen,this.render();return}let o=e.closest(".bit-action-btn");if(o&&!o.hasAttribute("disabled")){let a=o.getAttribute("data-action"),s=o.getAttribute("data-store");a&&s&&(a==="undo"&&this.actions.onUndo(s),a==="redo"&&this.actions.onRedo(s),a==="reset"&&this.actions.onReset(s))}})}updateState(r){this.currentStoresState=r,this.render()}render(){let r=Object.entries(this.currentStoresState);if(r.length===0){this.rootElement.innerHTML="";return}let i="";if(this.isOpen){i=`
90
90
  <div class="bit-devtools-panel">
91
91
  <div class="bit-devtools-header">
92
92
  <h2><span style="font-size: 20px;">\u{1F6E0}</span> Bit-Form DevTools</h2>
93
93
  <span style="font-size: 11px; color: #64748b;">v1.0.0</span>
94
94
  </div>
95
- `;for(let[s,t]of i){let o=Object.keys(t.errors||{}).length>0,n=t._meta||{totalSteps:0,currentIndex:-1,canUndo:!1,canRedo:!1},p=n.currentIndex+1,l=n.totalSteps;r+=`
95
+ `;for(let[e,o]of r){let a=Object.keys(o.errors||{}).length>0,s=o._meta||{totalSteps:0,currentIndex:-1,canUndo:!1,canRedo:!1},l=s.currentIndex+1,m=s.totalSteps;i+=`
96
96
  <div class="bit-store-block">
97
97
  <div class="bit-store-header">
98
- <h3 class="bit-store-title">${s}</h3>
98
+ <h3 class="bit-store-title">${e}</h3>
99
99
  <div class="bit-badge-group">
100
- <span class="bit-badge ${t.isValid?"badge-success":"badge-error"}">
101
- ${t.isValid?"\u2713 Valid":"\u2715 Invalid"}
100
+ <span class="bit-badge ${o.isValid?"badge-success":"badge-error"}">
101
+ ${o.isValid?"\u2713 Valid":"\u2715 Invalid"}
102
102
  </span>
103
- ${t.isDirty?'<span class="bit-badge badge-warn">Dirty</span>':""}
104
- ${t.isSubmitting?'<span class="bit-badge badge-info">\u23F3 Submitting</span>':""}
103
+ ${o.isDirty?'<span class="bit-badge badge-warn">Dirty</span>':""}
104
+ ${o.isSubmitting?'<span class="bit-badge badge-info">\u23F3 Submitting</span>':""}
105
105
  </div>
106
106
  </div>
107
107
 
108
- <span class="bit-section-title">Time Travel (${p}/${l})</span>
108
+ <span class="bit-section-title">Time Travel (${l}/${m})</span>
109
109
 
110
110
  <div class="bit-controls">
111
- <button class="bit-action-btn" data-action="undo" data-store="${s}" ${n.canUndo?"":"disabled"}>
111
+ <button class="bit-action-btn" data-action="undo" data-store="${e}" ${s.canUndo?"":"disabled"}>
112
112
  <span>\u21BA</span> Undo
113
113
  </button>
114
- <button class="bit-action-btn" data-action="redo" data-store="${s}" ${n.canRedo?"":"disabled"}>
114
+ <button class="bit-action-btn" data-action="redo" data-store="${e}" ${s.canRedo?"":"disabled"}>
115
115
  <span>\u21BB</span> Redo
116
116
  </button>
117
- <button class="bit-action-btn bit-btn-reset" data-action="reset" data-store="${s}">
117
+ <button class="bit-action-btn bit-btn-reset" data-action="reset" data-store="${e}">
118
118
  <span>\u{1F5D1}</span> Reset
119
119
  </button>
120
120
  </div>
121
- `,o&&(r+=`
121
+ `,a&&(i+=`
122
122
  <span class="bit-section-title" style="color: #f87171;">\u26A0\uFE0F Validations Failing</span>
123
- <pre class="bit-error-box">${JSON.stringify(t.errors,null,2)}</pre>
124
- `),r+=`
123
+ <pre class="bit-error-box">${JSON.stringify(o.errors,null,2)}</pre>
124
+ `),i+=`
125
125
  <span class="bit-section-title">Values</span>
126
- <pre class="bit-pre">${JSON.stringify(t.values,null,2)}</pre>
126
+ <pre class="bit-pre">${JSON.stringify(o.values,null,2)}</pre>
127
127
  </div>
128
- `}r+="</div>"}let e=`
128
+ `}i+="</div>"}let t=`
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}};function g(a){let i=new c(a,{onUndo:s=>d.stores[s]?.undo(),onRedo:s=>d.stores[s]?.redo(),onReset:s=>d.stores[s]?.reset()}),r=()=>{let s={};for(let[t,o]of Object.entries(d.stores)){let n=o,p=n.getState(),l=n?.getHistoryMetadata?.()||{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=d.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=""}}}export{m as initDevTools};
132
+ `;this.rootElement.innerHTML=i+t}};function y(n,r=f){let i=new d(n,{onUndo:o=>c(r.stores,o)?.undo(),onRedo:o=>c(r.stores,o)?.redo(),onReset:o=>c(r.stores,o)?.reset()}),t=()=>g(r.stores);i.updateState(t());let e=r.subscribe(()=>{i.updateState(t())});return{ui:i,destroy:()=>{e(),n.innerHTML=""}}}function T(n,r="ws://localhost:3000",i){let t=new WebSocket(r),e=s=>{t.readyState===WebSocket.OPEN?t.send(JSON.stringify(s)):console.warn("[bit-form] Tentativa de envio falhou. WebSocket n\xE3o est\xE1 aberto.")},o=(s,l)=>{e({type:"ACTION",protocolVersion:1,payload:{storeId:s,action:l}})},a=new d(n,{onUndo:s=>o(s,"undo"),onRedo:s=>o(s,"redo"),onReset:s=>o(s,"reset")});return t.addEventListener("open",()=>{e({type:"HELLO",protocolVersion:1,payload:{role:"client",protocolVersion:1}}),console.log(`[bit-form] Conectado ao DevTools remoto em ${r}`)}),t.addEventListener("message",s=>{try{let l=JSON.parse(s.data);u(l)&&a.updateState(l.payload)}catch(l){console.error("[bit-form] Erro ao processar mensagem do WebSocket:",l)}}),t.addEventListener("error",s=>{console.error("[bit-form] Erro na conex\xE3o do DevTools remoto:",s)}),{ui:a,destroy:()=>{(t.readyState===WebSocket.OPEN||t.readyState===WebSocket.CONNECTING)&&t.close(),n.innerHTML=""}}}function b(n={}){let{mode:r="local",url:i,bus:t}=n,e,o=!1;if(typeof n.container=="string"){let s=document.querySelector(n.container);if(!s)throw new Error(`[bit-form] Container '${n.container}' n\xE3o encontrado na p\xE1gina.`);e=s}else n.container instanceof HTMLElement?e=n.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),o=!0);let a;if(r==="local")console.log("[bit-form] DevTools iniciado em modo Local."),a=y(e,t);else if(r==="remote")console.log("[bit-form] DevTools iniciado em modo Remote."),a=T(e,i,t);else throw new Error(`[bit-form] Modo DevTools inv\xE1lido: ${r}`);return{...a,destroy:()=>{a&&typeof a.destroy=="function"&&a.destroy(),o&&e.parentNode?e.parentNode.removeChild(e):e.innerHTML=""}}}function h(n){return typeof n=="boolean"?{enabled:n,mode:"local"}:{enabled:!!n,mode:n?.mode??"local",url:n?.url}}function D(n){return{name:"bit-devtools",setup:r=>{let i=h(n??r.getConfig().devTools);if(!i.enabled)return;let t=null,e=r.getConfig().bus;try{if(i.mode==="remote")t=v(i.url||"ws://localhost:3000",e);else{let o=b({bus:e});t=o&&typeof o.destroy=="function"?o.destroy:null}}catch{}return()=>{t&&(t(),t=null)}}}}export{p as DEVTOOLS_PROTOCOL_VERSION,D as createDevToolsPlugin,b as initDevTools};
133
133
  //# sourceMappingURL=index.js.map
@@ -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","../../src/devtools/create-plugin.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\";\nimport type { DevToolsStoreSnapshots } from \"../protocol\";\n\nexport type { DevToolsActions };\n\nexport class BitFormDevToolsUI {\n private container: HTMLElement;\n private actions: DevToolsActions;\n private rootElement: HTMLDivElement;\n private currentStoresState: DevToolsStoreSnapshots = {};\n private isOpen = 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: DevToolsStoreSnapshots) {\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 { BitBus } from \"../../core\";\nimport { BitFormDevToolsUI } from \"../ui\";\nimport { createDevToolsSnapshotMap } from \"../store-snapshot\";\nimport { getDevToolsActionableStore } from \"../store-port\";\n\nexport function setupLocalDevTools(\n container: HTMLElement,\n bus: BitBus = bitBus,\n) {\n const ui = new BitFormDevToolsUI(container, {\n onUndo: (id) => getDevToolsActionableStore(bus.stores, id)?.undo(),\n onRedo: (id) => getDevToolsActionableStore(bus.stores, id)?.redo(),\n onReset: (id) => getDevToolsActionableStore(bus.stores, id)?.reset(),\n });\n\n const getFullSnapshot = () => createDevToolsSnapshotMap(bus.stores);\n\n ui.updateState(getFullSnapshot());\n\n const unsubscribe = bus.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 { BitBus } from \"../../core\";\nimport type {\n DevToolsHelloMessage,\n DevToolsActionMessage,\n DevToolsActionName,\n DevToolsRemoteMessage,\n} from \"../types\";\nimport {\n DEVTOOLS_PROTOCOL_VERSION,\n isDevToolsStateUpdateMessage,\n} from \"../protocol\";\n\nexport function setupRemoteDevTools(\n container: HTMLElement,\n url: string = \"ws://localhost:3000\",\n _bus?: BitBus,\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 protocolVersion: DEVTOOLS_PROTOCOL_VERSION,\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 const helloMessage: DevToolsHelloMessage = {\n type: \"HELLO\",\n protocolVersion: DEVTOOLS_PROTOCOL_VERSION,\n payload: { role: \"client\", protocolVersion: DEVTOOLS_PROTOCOL_VERSION },\n };\n\n sendMessage(helloMessage);\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 (isDevToolsStateUpdateMessage(data)) {\n ui.updateState(data.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\";\nimport type { BitDevToolsAdapter } from \"./adapters/types\";\n\nexport type { BitDevToolsOptions };\n\nexport function initDevTools(options: BitDevToolsOptions = {}) {\n const { mode = \"local\", url, bus } = 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: BitDevToolsAdapter;\n\n if (mode === \"local\") {\n console.log(\"[bit-form] DevTools iniciado em modo Local.\");\n adapterInstance = setupLocalDevTools(containerEl, bus);\n } else if (mode === \"remote\") {\n console.log(\"[bit-form] DevTools iniciado em modo Remote.\");\n adapterInstance = setupRemoteDevTools(containerEl, url, bus);\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","import type { BitPlugin, DevToolsOptions } from \"../core\";\nimport { setupRemoteBridge } from \"./bridge\";\nimport { initDevTools } from \"./init-dev-tools\";\n\nfunction resolveDevToolsOptions(\n devTools: boolean | DevToolsOptions | undefined,\n): Required<Pick<DevToolsOptions, \"enabled\" | \"mode\">> &\n Pick<DevToolsOptions, \"url\"> {\n if (typeof devTools === \"boolean\") {\n return { enabled: devTools, mode: \"local\" };\n }\n\n return {\n enabled: !!devTools,\n mode: devTools?.mode ?? \"local\",\n url: devTools?.url,\n };\n}\n\nexport function createDevToolsPlugin<T extends object = any>(\n override?: boolean | DevToolsOptions,\n): BitPlugin<T> {\n return {\n name: \"bit-devtools\",\n setup: (context) => {\n const options = resolveDevToolsOptions(\n override ?? context.getConfig().devTools,\n );\n\n if (!options.enabled) {\n return;\n }\n\n let cleanup: (() => void) | null = null;\n const bus = context.getConfig().bus;\n\n try {\n if (options.mode === \"remote\") {\n cleanup = setupRemoteBridge(\n options.url || \"ws://localhost:3000\",\n bus,\n );\n } else {\n const instance = initDevTools({ bus });\n cleanup =\n instance && typeof instance.destroy === \"function\"\n ? instance.destroy\n : null;\n }\n } catch {\n // fail-open: devtools não deve impactar runtime principal\n }\n\n return () => {\n if (cleanup) {\n cleanup();\n cleanup = null;\n }\n };\n },\n };\n}\n"],"mappings":"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","names":["getDevToolsCSS","BitFormDevToolsUI","container","actions","style","getDevToolsCSS","e","target","btn","action","storeId","storesState","storeEntries","panelHtml","id","state","hasErrors","meta","currentStep","totalSteps","triggerHtml","setupLocalDevTools","container","bus","bitBus","ui","BitFormDevToolsUI","id","getDevToolsActionableStore","getFullSnapshot","createDevToolsSnapshotMap","unsubscribe","setupRemoteDevTools","container","url","_bus","socket","sendMessage","message","sendAction","storeId","action","ui","BitFormDevToolsUI","id","msg","data","isDevToolsStateUpdateMessage","e","err","initDevTools","options","mode","url","bus","containerEl","isAutoCreated","el","adapterInstance","setupLocalDevTools","setupRemoteDevTools","resolveDevToolsOptions","devTools","createDevToolsPlugin","override","context","options","cleanup","bus","setupRemoteBridge","instance","initDevTools"]}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkQKGTVKBUcjs = require('../chunk-QKGTVKBU.cjs');exports.DEVTOOLS_PROTOCOL_VERSION = _chunkQKGTVKBUcjs.a; exports.isDevToolsActionMessage = _chunkQKGTVKBUcjs.c; exports.isDevToolsActionPayload = _chunkQKGTVKBUcjs.b; exports.isDevToolsHelloMessage = _chunkQKGTVKBUcjs.f; exports.isDevToolsPingMessage = _chunkQKGTVKBUcjs.e; exports.isDevToolsStateUpdateMessage = _chunkQKGTVKBUcjs.d;
2
+ //# sourceMappingURL=protocol.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/bit-form/bit-form/dist/devtools/protocol.cjs"],"names":[],"mappings":"AAAA,kIAA8C,6UAA0L","file":"/home/runner/work/bit-form/bit-form/dist/devtools/protocol.cjs"}
@@ -0,0 +1,54 @@
1
+ type DevToolsActionName = "undo" | "redo" | "reset";
2
+ declare const DEVTOOLS_PROTOCOL_VERSION = 1;
3
+ interface DevToolsProtocolMessageBase {
4
+ protocolVersion: number;
5
+ }
6
+ interface DevToolsHistoryMeta {
7
+ canUndo: boolean;
8
+ canRedo: boolean;
9
+ totalSteps: number;
10
+ currentIndex: number;
11
+ }
12
+ interface DevToolsStoreSnapshot {
13
+ values: unknown;
14
+ errors: Record<string, unknown>;
15
+ touched: Record<string, unknown>;
16
+ isValid: boolean;
17
+ isDirty: boolean;
18
+ isSubmitting: boolean;
19
+ isValidating?: Record<string, unknown>;
20
+ persist?: unknown;
21
+ _meta: DevToolsHistoryMeta;
22
+ }
23
+ type DevToolsStoreSnapshots = Record<string, DevToolsStoreSnapshot>;
24
+ interface DevToolsActionPayload {
25
+ storeId: string;
26
+ action: DevToolsActionName;
27
+ }
28
+ interface DevToolsStateUpdateMessage extends DevToolsProtocolMessageBase {
29
+ type: "STATE_UPDATE";
30
+ payload: DevToolsStoreSnapshots;
31
+ }
32
+ interface DevToolsPingMessage extends DevToolsProtocolMessageBase {
33
+ type: "PING";
34
+ }
35
+ interface DevToolsActionMessage extends DevToolsProtocolMessageBase {
36
+ type: "ACTION";
37
+ payload: DevToolsActionPayload;
38
+ }
39
+ interface DevToolsHelloPayload {
40
+ role: "client" | "server";
41
+ protocolVersion: number;
42
+ }
43
+ interface DevToolsHelloMessage extends DevToolsProtocolMessageBase {
44
+ type: "HELLO";
45
+ payload: DevToolsHelloPayload;
46
+ }
47
+ type DevToolsRemoteMessage = DevToolsStateUpdateMessage | DevToolsPingMessage | DevToolsActionMessage | DevToolsHelloMessage;
48
+ declare function isDevToolsActionPayload(payload: unknown): payload is DevToolsActionPayload;
49
+ declare function isDevToolsActionMessage(message: unknown): message is DevToolsActionMessage;
50
+ declare function isDevToolsStateUpdateMessage(message: unknown): message is DevToolsStateUpdateMessage;
51
+ declare function isDevToolsPingMessage(message: unknown): message is DevToolsPingMessage;
52
+ declare function isDevToolsHelloMessage(message: unknown): message is DevToolsHelloMessage;
53
+
54
+ export { DEVTOOLS_PROTOCOL_VERSION, type DevToolsActionMessage, type DevToolsActionName, type DevToolsActionPayload, type DevToolsHelloMessage, type DevToolsHelloPayload, type DevToolsHistoryMeta, type DevToolsPingMessage, type DevToolsProtocolMessageBase, type DevToolsRemoteMessage, type DevToolsStateUpdateMessage, type DevToolsStoreSnapshot, type DevToolsStoreSnapshots, isDevToolsActionMessage, isDevToolsActionPayload, isDevToolsHelloMessage, isDevToolsPingMessage, isDevToolsStateUpdateMessage };
@@ -0,0 +1,54 @@
1
+ type DevToolsActionName = "undo" | "redo" | "reset";
2
+ declare const DEVTOOLS_PROTOCOL_VERSION = 1;
3
+ interface DevToolsProtocolMessageBase {
4
+ protocolVersion: number;
5
+ }
6
+ interface DevToolsHistoryMeta {
7
+ canUndo: boolean;
8
+ canRedo: boolean;
9
+ totalSteps: number;
10
+ currentIndex: number;
11
+ }
12
+ interface DevToolsStoreSnapshot {
13
+ values: unknown;
14
+ errors: Record<string, unknown>;
15
+ touched: Record<string, unknown>;
16
+ isValid: boolean;
17
+ isDirty: boolean;
18
+ isSubmitting: boolean;
19
+ isValidating?: Record<string, unknown>;
20
+ persist?: unknown;
21
+ _meta: DevToolsHistoryMeta;
22
+ }
23
+ type DevToolsStoreSnapshots = Record<string, DevToolsStoreSnapshot>;
24
+ interface DevToolsActionPayload {
25
+ storeId: string;
26
+ action: DevToolsActionName;
27
+ }
28
+ interface DevToolsStateUpdateMessage extends DevToolsProtocolMessageBase {
29
+ type: "STATE_UPDATE";
30
+ payload: DevToolsStoreSnapshots;
31
+ }
32
+ interface DevToolsPingMessage extends DevToolsProtocolMessageBase {
33
+ type: "PING";
34
+ }
35
+ interface DevToolsActionMessage extends DevToolsProtocolMessageBase {
36
+ type: "ACTION";
37
+ payload: DevToolsActionPayload;
38
+ }
39
+ interface DevToolsHelloPayload {
40
+ role: "client" | "server";
41
+ protocolVersion: number;
42
+ }
43
+ interface DevToolsHelloMessage extends DevToolsProtocolMessageBase {
44
+ type: "HELLO";
45
+ payload: DevToolsHelloPayload;
46
+ }
47
+ type DevToolsRemoteMessage = DevToolsStateUpdateMessage | DevToolsPingMessage | DevToolsActionMessage | DevToolsHelloMessage;
48
+ declare function isDevToolsActionPayload(payload: unknown): payload is DevToolsActionPayload;
49
+ declare function isDevToolsActionMessage(message: unknown): message is DevToolsActionMessage;
50
+ declare function isDevToolsStateUpdateMessage(message: unknown): message is DevToolsStateUpdateMessage;
51
+ declare function isDevToolsPingMessage(message: unknown): message is DevToolsPingMessage;
52
+ declare function isDevToolsHelloMessage(message: unknown): message is DevToolsHelloMessage;
53
+
54
+ export { DEVTOOLS_PROTOCOL_VERSION, type DevToolsActionMessage, type DevToolsActionName, type DevToolsActionPayload, type DevToolsHelloMessage, type DevToolsHelloPayload, type DevToolsHistoryMeta, type DevToolsPingMessage, type DevToolsProtocolMessageBase, type DevToolsRemoteMessage, type DevToolsStateUpdateMessage, type DevToolsStoreSnapshot, type DevToolsStoreSnapshots, isDevToolsActionMessage, isDevToolsActionPayload, isDevToolsHelloMessage, isDevToolsPingMessage, isDevToolsStateUpdateMessage };
@@ -0,0 +1,2 @@
1
+ import{a,b,c,d,e,f}from"../chunk-K5X37E3U.js";export{a as DEVTOOLS_PROTOCOL_VERSION,c as isDevToolsActionMessage,b as isDevToolsActionPayload,f as isDevToolsHelloMessage,e as isDevToolsPingMessage,d as isDevToolsStateUpdateMessage};
2
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,25 @@
1
+ import { B as BitMask } from './types-CUXh7PqD.js';
2
+
3
+ /**
4
+ * Tipo de entrada aceito pelos handlers de campo.
5
+ * Cobre eventos nativos (`e.target.value`), eventos sintéticos e valores diretos.
6
+ * Definido aqui para ser compartilhado entre todos os frameworks.
7
+ */
8
+ type BitFieldInputEvent = {
9
+ target?: {
10
+ value?: string | number | null;
11
+ };
12
+ } | string | number | null | undefined;
13
+ /**
14
+ * Type guard: verifica se o valor de entrada é um objeto de evento
15
+ * (com propriedade `target`), diferenciando-o de um valor direto.
16
+ */
17
+ declare function isBitFieldInputEventObject(value: BitFieldInputEvent): value is Extract<BitFieldInputEvent, {
18
+ target?: {
19
+ value?: string | number | null;
20
+ };
21
+ }>;
22
+ declare const formatMaskedValue: (value: unknown, mask?: BitMask) => string;
23
+ declare const parseMaskedInput: (value: unknown, mask?: BitMask) => unknown;
24
+
25
+ export { type BitFieldInputEvent as B, formatMaskedValue as f, isBitFieldInputEventObject as i, parseMaskedInput as p };
@@ -0,0 +1,25 @@
1
+ import { B as BitMask } from './types-CUXh7PqD.cjs';
2
+
3
+ /**
4
+ * Tipo de entrada aceito pelos handlers de campo.
5
+ * Cobre eventos nativos (`e.target.value`), eventos sintéticos e valores diretos.
6
+ * Definido aqui para ser compartilhado entre todos os frameworks.
7
+ */
8
+ type BitFieldInputEvent = {
9
+ target?: {
10
+ value?: string | number | null;
11
+ };
12
+ } | string | number | null | undefined;
13
+ /**
14
+ * Type guard: verifica se o valor de entrada é um objeto de evento
15
+ * (com propriedade `target`), diferenciando-o de um valor direto.
16
+ */
17
+ declare function isBitFieldInputEventObject(value: BitFieldInputEvent): value is Extract<BitFieldInputEvent, {
18
+ target?: {
19
+ value?: string | number | null;
20
+ };
21
+ }>;
22
+ declare const formatMaskedValue: (value: unknown, mask?: BitMask) => string;
23
+ declare const parseMaskedInput: (value: unknown, mask?: BitMask) => unknown;
24
+
25
+ export { type BitFieldInputEvent as B, formatMaskedValue as f, isBitFieldInputEventObject as i, parseMaskedInput as p };
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
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;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkFUUQB4DVcjs = require('./chunk-FUUQB4DV.cjs');require('./chunk-PFPGASVZ.cjs');exports.areFieldSnapshotsEqual = _chunkFUUQB4DVcjs.v; exports.bitBus = _chunkFUUQB4DVcjs.j; exports.cleanPrefixedKeys = _chunkFUUQB4DVcjs.g; exports.createBitBus = _chunkFUUQB4DVcjs.k; exports.createBitStore = _chunkFUUQB4DVcjs.t; exports.createFieldStateSnapshot = _chunkFUUQB4DVcjs.u; exports.deepClone = _chunkFUUQB4DVcjs.a; exports.deepEqual = _chunkFUUQB4DVcjs.d; exports.deepMerge = _chunkFUUQB4DVcjs.b; exports.extractServerErrors = _chunkFUUQB4DVcjs.i; exports.getDeepValue = _chunkFUUQB4DVcjs.e; exports.isValidationErrorShape = _chunkFUUQB4DVcjs.h; exports.resolveBitStoreForHooks = _chunkFUUQB4DVcjs.s; exports.setDeepValue = _chunkFUUQB4DVcjs.f; exports.valueEqual = _chunkFUUQB4DVcjs.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,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,iIAA0I,gCAA6B,2rBAA8T","file":"/home/runner/work/bit-form/bit-form/dist/index.cjs"}
package/dist/index.d.cts CHANGED
@@ -1,154 +1,12 @@
1
- import { B as BitMask, a as BitMaskName } from './types-D8DgIUhJ.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';
1
+ import { j as BitConfig } from './bus-rcUiufS7.cjs';
2
+ export { s as BitAfterSubmitEvent, t as BitAfterValidateEvent, a as BitArrayItem, B as BitArrayPath, u as BitBeforeSubmitEvent, v as BitBeforeValidateEvent, d as BitBus, w as BitBusListener, x as BitComputedFn, c as BitErrors, y as BitFieldChangeEvent, z as BitFieldChangeMeta, A as BitFieldConditional, h as BitFieldDefinition, g as BitFieldState, C as BitFieldValidation, q as BitFormGlobal, E as BitHistoryConfig, e as BitPath, b as BitPathValue, F as BitPersistConfig, i as BitPersistMetadata, G as BitPersistMode, H as BitPersistStorageAdapter, o as BitPlugin, I as BitPluginContext, J as BitPluginErrorEvent, K as BitPluginHooks, p as BitScheduler, f as BitState, r as BitTouched, L as BitTransformFn, M as BitValidationConfig, D as DeepPartial, l as DevToolsOptions, S as ScopeStatus, V as ValidateScopeResult, k as ValidatorFn, N as bitBus, O as createBitBus } from './bus-rcUiufS7.cjs';
3
+ import { a as BitStoreHooksApi } from './store-api-types-B6_bPoVI.cjs';
4
+ export { B as BitArrayBindingApi, h as BitEqualityFn, g as BitFieldBindingApi, b as BitFormBindingApi, f as BitFormMeta, e as BitFormMetaBindingApi, i as BitFrameworkConfig, c as BitHistoryMetadata, j as BitSelector, k as BitSelectorSubscriptionOptions, l as BitStoreApi, m as BitStoreArrayFeatureApi, n as BitStoreFeatureApi, o as BitStoreHistoryFeatureApi, p as BitStoreObserveApi, q as BitStorePersistFeatureApi, r as BitStoreQueryApi, s as BitStoreRegistrationFeatureApi, t as BitStoreWriteApi, d as BitValidationOptions } from './store-api-types-B6_bPoVI.cjs';
6
5
  export { a as BitDeleteUploadFn, B as BitUploadFn, b as BitUploadResult } from './upload-EXnJLq8k.cjs';
6
+ import './types-CUXh7PqD.cjs';
7
7
 
8
- interface BitComputedEntry<T extends object> {
9
- path: string;
10
- compute: BitComputedFn<T>;
11
- dependsOn?: readonly string[];
12
- }
13
-
14
- interface BitValidationTriggerOptions {
15
- forceDebounce?: boolean;
16
- }
17
-
18
- /**
19
- * BitStore
20
- *
21
- * The core orchestrator of form state management.
22
- *
23
- * This store coordinates multiple managers to provide comprehensive form handling:
24
- * - Core managers handle essential state and validation
25
- * - Feature managers provide optional enhancements (history, arrays, scopes)
26
- * - Query/mutation managers organize domain-specific operations
27
- */
28
- declare class BitStore<T extends object = any> {
29
- private state;
30
- private readonly subscriptions;
31
- private readonly effects;
32
- private readonly capabilities;
33
- config: BitFrameworkConfig<T>;
34
- readonly storeId: string;
35
- private readonly dependencyManager;
36
- private readonly computedManager;
37
- private readonly dirtyManager;
38
- private scopeFieldsIndex;
39
- private computedEntriesCache;
40
- private transformEntriesCache;
41
- private batchDepth;
42
- private batchedState;
43
- private batchedChangedPaths;
44
- private batchedValuesChanged;
45
- private invalidateFieldIndexes;
46
- private registerCachedFieldIndexes;
47
- private unregisterCachedFieldIndexes;
48
- private getCapability;
49
- private get validation();
50
- private get lifecycle();
51
- private get history();
52
- private get arrays();
53
- private get scope();
54
- private get query();
55
- private get error();
56
- constructor(config?: BitConfig<T>);
57
- getConfig(): BitFrameworkConfig<T>;
58
- getFieldConfig(path: string): BitFieldDefinition<T> | undefined;
59
- getScopeFields(scopeName: string): string[];
60
- getComputedEntries(): BitComputedEntry<T>[];
61
- getTransformEntries(): [string, BitTransformFn<T>][];
62
- resolveMask(path: string): BitMask | undefined;
63
- getState(): BitState<T>;
64
- getFieldState<P extends BitPath<T>>(path: P): BitFieldState<T, BitPathValue<T, P>>;
65
- get isValid(): boolean;
66
- get isSubmitting(): boolean;
67
- get isDirty(): boolean;
68
- registerField(path: string, config: BitFieldDefinition<T>): void;
69
- unregisterField(path: string): void;
70
- unregisterPrefix(prefix: string): void;
71
- isHidden<P extends BitPath<T>>(path: P): boolean;
72
- isRequired<P extends BitPath<T>>(path: P): boolean;
73
- isFieldDirty(path: string): boolean;
74
- isFieldValidating(path: string): boolean;
75
- subscribe(listener: () => void): () => void;
76
- subscribeSelector<TSlice>(selector: BitSelector<T, TSlice>, listener: (slice: TSlice) => void, options?: BitSelectorSubscriptionOptions<TSlice>): () => void;
77
- subscribePath<P extends BitPath<T>>(path: P, listener: (value: BitPathValue<T, P>) => void, options?: BitSelectorSubscriptionOptions<BitPathValue<T, P>>): () => void;
78
- watch<P extends BitPath<T>>(path: P, callback: (value: BitPathValue<T, P>) => void): () => void;
79
- setField<P extends BitPath<T>>(path: P, value: BitPathValue<T, P>): void;
80
- setFieldWithMeta(path: string, value: any, meta?: BitFieldChangeMeta): void;
81
- blurField<P extends BitPath<T>>(path: P): void;
82
- markFieldsTouched(paths: string[]): void;
83
- replaceValues(newValues: T): void;
84
- hydrate(values: DeepPartial<T>): void;
85
- rebase(newValues: T): void;
86
- setError(path: string, message: string | undefined): void;
87
- setErrors(errors: BitErrors<T>): void;
88
- setServerErrors(serverErrors: Record<string, string[] | string>): void;
89
- reset(): void;
90
- transaction<TResult>(callback: () => TResult): TResult;
91
- submit(onSuccess: (values: T, dirtyValues?: Partial<T>) => void | Promise<void>): Promise<void>;
92
- registerMask(name: BitMaskName, mask: BitMask): void;
93
- getDirtyValues(): Partial<T>;
94
- getPersistMetadata(): BitPersistMetadata;
95
- restorePersisted(): Promise<boolean>;
96
- forceSave(): Promise<void>;
97
- clearPersisted(): Promise<void>;
98
- pushItem<P extends BitArrayPath<T>>(path: P, value: BitArrayItem<BitPathValue<T, P>>): void;
99
- prependItem<P extends BitArrayPath<T>>(path: P, value: BitArrayItem<BitPathValue<T, P>>): void;
100
- insertItem<P extends BitArrayPath<T>>(path: P, index: number, value: BitArrayItem<BitPathValue<T, P>>): void;
101
- removeItem<P extends BitArrayPath<T>>(path: P, index: number): void;
102
- swapItems<P extends BitArrayPath<T>>(path: P, indexA: number, indexB: number): void;
103
- moveItem<P extends BitArrayPath<T>>(path: P, from: number, to: number): void;
104
- get canUndo(): boolean;
105
- get canRedo(): boolean;
106
- undo(): void;
107
- redo(): void;
108
- getHistoryMetadata(): BitHistoryMetadata;
109
- validate(options?: BitValidationOptions): Promise<boolean>;
110
- emitBeforeValidate(event: BitBeforeValidateEvent<T>): Promise<void>;
111
- emitAfterValidate(event: BitAfterValidateEvent<T>): Promise<void>;
112
- emitBeforeSubmit(event: BitBeforeSubmitEvent<T>): Promise<void>;
113
- emitAfterSubmit(event: BitAfterSubmitEvent<T>): Promise<void>;
114
- emitFieldChange(event: BitFieldChangeEvent<T>): void;
115
- emitOperationalError(event: {
116
- source: "submit";
117
- error: unknown;
118
- payload?: unknown;
119
- }): Promise<void>;
120
- hasValidationsInProgress(scopeFields?: string[]): boolean;
121
- triggerValidation(scopeFields?: string[], options?: BitValidationTriggerOptions): void;
122
- getStepStatus(scopeName: string): {
123
- hasErrors: boolean;
124
- isDirty: boolean;
125
- errors: Record<string, string>;
126
- };
127
- getStepErrors(scopeName: string): Record<string, string>;
128
- updateDependencies(changedPath: string, newValues: T): string[];
129
- isFieldHidden(path: string): boolean;
130
- evaluateAllDependencies(values: T): void;
131
- getHiddenFields(): ReadonlySet<string>;
132
- getRequiredErrors(values: T): BitErrors<T>;
133
- clearFieldValidation(path: string): void;
134
- handleFieldAsyncValidation(path: string, value: any): void;
135
- cancelAllValidations(): void;
136
- validateNow(options?: BitValidationOptions): Promise<boolean>;
137
- updateDirtyForPath(path: string, nextValues: T, baselineValues: T): boolean;
138
- rebuildDirtyState(nextValues: T, baselineValues: T): boolean;
139
- clearDirtyState(): void;
140
- buildDirtyValues(values: T): Partial<T>;
141
- batchStateUpdates<TResult>(callback: () => TResult): TResult;
142
- resetHistory(initialValues: T): void;
143
- internalUpdateState(partialState: Partial<BitState<T>>, changedPaths?: string[]): void;
144
- internalSaveSnapshot(): void;
145
- private applyPersistedValues;
146
- cleanup(): void;
147
- private flushBatchedStateUpdates;
148
- }
149
-
150
- declare function resolveBitStoreForHooks<T extends object>(store: BitStoreApi<T> | BitStore<T>): BitStoreHooksApi<T>;
151
- declare function createBitStore<T extends object = any>(config?: BitConfig<T>): BitStoreApi<T>;
8
+ declare function resolveBitStoreForHooks<T extends object>(store: unknown): BitStoreHooksApi<T>;
9
+ declare function createBitStore<T extends object = any>(config?: BitConfig<T>): BitStoreHooksApi<T>;
152
10
 
153
11
  declare function deepClone<T>(obj: T): T;
154
12
  declare function deepMerge<T>(target: T, source: any): T;
@@ -171,4 +29,60 @@ declare function isValidationErrorShape(x: unknown): x is Record<string, string
171
29
  */
172
30
  declare function extractServerErrors(x: unknown): Record<string, string | string[]>;
173
31
 
174
- export { BitAfterSubmitEvent, BitAfterValidateEvent, BitArrayItem, BitArrayPath, BitBeforeSubmitEvent, BitBeforeValidateEvent, BitComputedFn, BitConfig, BitErrors, BitFieldChangeEvent, BitFieldChangeMeta, BitFieldDefinition, BitFieldState, BitFrameworkConfig, BitHistoryMetadata, BitPath, BitPathValue, BitPersistMetadata, BitSelector, BitSelectorSubscriptionOptions, BitState, BitStoreApi, BitStoreHooksApi, BitTransformFn, BitValidationOptions, DeepPartial, cleanPrefixedKeys, createBitStore, deepClone, deepEqual, deepMerge, extractServerErrors, getDeepValue, isValidationErrorShape, resolveBitStoreForHooks, setDeepValue, valueEqual };
32
+ /**
33
+ * Field State Snapshot Utilities
34
+ *
35
+ * Shared utilities for creating and managing field state snapshots across frameworks
36
+ * (React, Vue, Angular). Reduces code duplication while maintaining type safety.
37
+ */
38
+ /**
39
+ * Represents a stable snapshot of field state that can be compared for equality.
40
+ */
41
+ interface BitFieldSnapshot<TValue = any> {
42
+ value: TValue;
43
+ error: string | undefined;
44
+ touched: boolean;
45
+ isHidden: boolean;
46
+ isRequired: boolean;
47
+ isDirty: boolean;
48
+ isValidating: boolean;
49
+ }
50
+ /**
51
+ * Creates or reuses a field state snapshot with shallow equality checking.
52
+ *
53
+ * This function prevents unnecessary re-renders in frameworks like React by
54
+ * returning the same object reference when field state hasn't changed.
55
+ *
56
+ * @param nextState - The new field state from the store
57
+ * @param lastSnapshot - The previous snapshot (can be null on first call)
58
+ * @returns A stable snapshot object that can be used for equality comparison
59
+ *
60
+ * @example
61
+ * ```typescript
62
+ * const snapshot = createFieldStateSnapshot(store.getFieldState("email"), lastSnapshot);
63
+ * if (snapshot !== lastSnapshot) {
64
+ * // Field state changed, update component
65
+ * render(snapshot);
66
+ * }
67
+ * ```
68
+ */
69
+ declare function createFieldStateSnapshot<TValue = any>(nextState: {
70
+ value: TValue;
71
+ error: string | undefined;
72
+ touched: boolean;
73
+ isHidden: boolean;
74
+ isRequired: boolean;
75
+ isDirty: boolean;
76
+ isValidating: boolean;
77
+ }, lastSnapshot: BitFieldSnapshot<TValue> | null): BitFieldSnapshot<TValue>;
78
+ /**
79
+ * Deep comparison utility for field state snapshots.
80
+ * Useful for scenarios where shallow comparison isn't sufficient (e.g., object/array values).
81
+ *
82
+ * @param snapshotA - First snapshot
83
+ * @param snapshotB - Second snapshot
84
+ * @returns true if snapshots are deeply equal
85
+ */
86
+ declare function areFieldSnapshotsEqual(snapshotA: BitFieldSnapshot | null | undefined, snapshotB: BitFieldSnapshot | null | undefined): boolean;
87
+
88
+ export { BitConfig, type BitFieldSnapshot, BitStoreHooksApi, areFieldSnapshotsEqual, cleanPrefixedKeys, createBitStore, createFieldStateSnapshot, deepClone, deepEqual, deepMerge, extractServerErrors, getDeepValue, isValidationErrorShape, resolveBitStoreForHooks, setDeepValue, valueEqual };