@akashjs/runtime 0.1.17 → 0.1.19

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 (53) hide show
  1. package/dist/{chunk-7AOFVBXQ.js → chunk-2XEP24ZJ.js} +3 -3
  2. package/dist/{chunk-7AOFVBXQ.js.map → chunk-2XEP24ZJ.js.map} +1 -1
  3. package/dist/{chunk-LWYN5NBM.cjs → chunk-33X7HOXL.cjs} +2 -2
  4. package/dist/{chunk-LWYN5NBM.cjs.map → chunk-33X7HOXL.cjs.map} +1 -1
  5. package/dist/{chunk-HHQWJGM7.cjs → chunk-43WUBCV3.cjs} +3 -3
  6. package/dist/{chunk-HHQWJGM7.cjs.map → chunk-43WUBCV3.cjs.map} +1 -1
  7. package/dist/{chunk-DXY3PRM5.js → chunk-5RRJ4FHJ.js} +2 -2
  8. package/dist/{chunk-DXY3PRM5.js.map → chunk-5RRJ4FHJ.js.map} +1 -1
  9. package/dist/{chunk-37JKW5ZD.cjs → chunk-7FO6RXTP.cjs} +2 -2
  10. package/dist/{chunk-37JKW5ZD.cjs.map → chunk-7FO6RXTP.cjs.map} +1 -1
  11. package/dist/{chunk-BRFTYCA7.cjs → chunk-HOQT2KZX.cjs} +3 -3
  12. package/dist/{chunk-BRFTYCA7.cjs.map → chunk-HOQT2KZX.cjs.map} +1 -1
  13. package/dist/chunk-JT3BWNP3.cjs +2 -0
  14. package/dist/chunk-JT3BWNP3.cjs.map +1 -0
  15. package/dist/{chunk-3BD6O5DL.cjs → chunk-KMBNRXVP.cjs} +2 -2
  16. package/dist/{chunk-3BD6O5DL.cjs.map → chunk-KMBNRXVP.cjs.map} +1 -1
  17. package/dist/{chunk-GNH24HO7.js → chunk-LPO2RGBW.js} +2 -2
  18. package/dist/{chunk-GNH24HO7.js.map → chunk-LPO2RGBW.js.map} +1 -1
  19. package/dist/{chunk-KMSJMX3Z.cjs → chunk-N6EZQIHQ.cjs} +2 -2
  20. package/dist/{chunk-KMSJMX3Z.cjs.map → chunk-N6EZQIHQ.cjs.map} +1 -1
  21. package/dist/{chunk-LYKTDMGS.js → chunk-PAFOAMR7.js} +3 -3
  22. package/dist/{chunk-LYKTDMGS.js.map → chunk-PAFOAMR7.js.map} +1 -1
  23. package/dist/chunk-PSRHGU7L.js +2 -0
  24. package/dist/chunk-PSRHGU7L.js.map +1 -0
  25. package/dist/{chunk-MJP3WT7O.js → chunk-QZWPCZCC.js} +2 -2
  26. package/dist/{chunk-MJP3WT7O.js.map → chunk-QZWPCZCC.js.map} +1 -1
  27. package/dist/{chunk-UCPFG5LP.js → chunk-ZWA3PQUB.js} +2 -2
  28. package/dist/{chunk-UCPFG5LP.js.map → chunk-ZWA3PQUB.js.map} +1 -1
  29. package/dist/core.cjs +1 -1
  30. package/dist/core.js +1 -1
  31. package/dist/index.cjs +6 -6
  32. package/dist/index.cjs.map +1 -1
  33. package/dist/index.js +2 -2
  34. package/dist/index.js.map +1 -1
  35. package/dist/machine.cjs +1 -1
  36. package/dist/machine.js +1 -1
  37. package/dist/offline.cjs +1 -1
  38. package/dist/offline.js +1 -1
  39. package/dist/pwa.cjs +1 -1
  40. package/dist/pwa.js +1 -1
  41. package/dist/ssr.cjs +1 -1
  42. package/dist/ssr.js +1 -1
  43. package/dist/store.cjs +1 -1
  44. package/dist/store.js +1 -1
  45. package/dist/sync.cjs +1 -1
  46. package/dist/sync.js +1 -1
  47. package/dist/test.cjs +1 -1
  48. package/dist/test.js +1 -1
  49. package/package.json +1 -1
  50. package/dist/chunk-GCFDHASX.cjs +0 -2
  51. package/dist/chunk-GCFDHASX.cjs.map +0 -1
  52. package/dist/chunk-JZWZVCDH.js +0 -2
  53. package/dist/chunk-JZWZVCDH.js.map +0 -1
package/dist/machine.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var chunkLWYN5NBM_cjs=require('./chunk-LWYN5NBM.cjs');require('./chunk-GCFDHASX.cjs');Object.defineProperty(exports,"createMachine",{enumerable:true,get:function(){return chunkLWYN5NBM_cjs.a}});//# sourceMappingURL=machine.cjs.map
1
+ 'use strict';var chunk33X7HOXL_cjs=require('./chunk-33X7HOXL.cjs');require('./chunk-JT3BWNP3.cjs');Object.defineProperty(exports,"createMachine",{enumerable:true,get:function(){return chunk33X7HOXL_cjs.a}});//# sourceMappingURL=machine.cjs.map
2
2
  //# sourceMappingURL=machine.cjs.map
package/dist/machine.js CHANGED
@@ -1,2 +1,2 @@
1
- export{a as createMachine}from'./chunk-UCPFG5LP.js';import'./chunk-JZWZVCDH.js';//# sourceMappingURL=machine.js.map
1
+ export{a as createMachine}from'./chunk-ZWA3PQUB.js';import'./chunk-PSRHGU7L.js';//# sourceMappingURL=machine.js.map
2
2
  //# sourceMappingURL=machine.js.map
package/dist/offline.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var chunk3BD6O5DL_cjs=require('./chunk-3BD6O5DL.cjs');require('./chunk-GCFDHASX.cjs');Object.defineProperty(exports,"createOfflineStore",{enumerable:true,get:function(){return chunk3BD6O5DL_cjs.a}});//# sourceMappingURL=offline.cjs.map
1
+ 'use strict';var chunkKMBNRXVP_cjs=require('./chunk-KMBNRXVP.cjs');require('./chunk-JT3BWNP3.cjs');Object.defineProperty(exports,"createOfflineStore",{enumerable:true,get:function(){return chunkKMBNRXVP_cjs.a}});//# sourceMappingURL=offline.cjs.map
2
2
  //# sourceMappingURL=offline.cjs.map
package/dist/offline.js CHANGED
@@ -1,2 +1,2 @@
1
- export{a as createOfflineStore}from'./chunk-DXY3PRM5.js';import'./chunk-JZWZVCDH.js';//# sourceMappingURL=offline.js.map
1
+ export{a as createOfflineStore}from'./chunk-5RRJ4FHJ.js';import'./chunk-PSRHGU7L.js';//# sourceMappingURL=offline.js.map
2
2
  //# sourceMappingURL=offline.js.map
package/dist/pwa.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var chunkBRFTYCA7_cjs=require('./chunk-BRFTYCA7.cjs');require('./chunk-GCFDHASX.cjs');Object.defineProperty(exports,"generateSWScript",{enumerable:true,get:function(){return chunkBRFTYCA7_cjs.b}});Object.defineProperty(exports,"registerServiceWorker",{enumerable:true,get:function(){return chunkBRFTYCA7_cjs.a}});Object.defineProperty(exports,"subscribePush",{enumerable:true,get:function(){return chunkBRFTYCA7_cjs.c}});//# sourceMappingURL=pwa.cjs.map
1
+ 'use strict';var chunkHOQT2KZX_cjs=require('./chunk-HOQT2KZX.cjs');require('./chunk-JT3BWNP3.cjs');Object.defineProperty(exports,"generateSWScript",{enumerable:true,get:function(){return chunkHOQT2KZX_cjs.b}});Object.defineProperty(exports,"registerServiceWorker",{enumerable:true,get:function(){return chunkHOQT2KZX_cjs.a}});Object.defineProperty(exports,"subscribePush",{enumerable:true,get:function(){return chunkHOQT2KZX_cjs.c}});//# sourceMappingURL=pwa.cjs.map
2
2
  //# sourceMappingURL=pwa.cjs.map
package/dist/pwa.js CHANGED
@@ -1,2 +1,2 @@
1
- export{b as generateSWScript,a as registerServiceWorker,c as subscribePush}from'./chunk-LYKTDMGS.js';import'./chunk-JZWZVCDH.js';//# sourceMappingURL=pwa.js.map
1
+ export{b as generateSWScript,a as registerServiceWorker,c as subscribePush}from'./chunk-PAFOAMR7.js';import'./chunk-PSRHGU7L.js';//# sourceMappingURL=pwa.js.map
2
2
  //# sourceMappingURL=pwa.js.map
package/dist/ssr.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var chunk2X7GUBTG_cjs=require('./chunk-2X7GUBTG.cjs');require('./chunk-GCFDHASX.cjs');Object.defineProperty(exports,"escapeHtml",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.a}});Object.defineProperty(exports,"isServerRendering",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.b}});Object.defineProperty(exports,"nodeToHtml",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.i}});Object.defineProperty(exports,"renderNodes",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.j}});Object.defineProperty(exports,"renderToStream",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.e}});Object.defineProperty(exports,"renderToString",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.c}});Object.defineProperty(exports,"renderToStringSync",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.d}});Object.defineProperty(exports,"ssrElement",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.f}});Object.defineProperty(exports,"ssrRaw",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.h}});Object.defineProperty(exports,"ssrText",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.g}});//# sourceMappingURL=ssr.cjs.map
1
+ 'use strict';var chunk2X7GUBTG_cjs=require('./chunk-2X7GUBTG.cjs');require('./chunk-JT3BWNP3.cjs');Object.defineProperty(exports,"escapeHtml",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.a}});Object.defineProperty(exports,"isServerRendering",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.b}});Object.defineProperty(exports,"nodeToHtml",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.i}});Object.defineProperty(exports,"renderNodes",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.j}});Object.defineProperty(exports,"renderToStream",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.e}});Object.defineProperty(exports,"renderToString",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.c}});Object.defineProperty(exports,"renderToStringSync",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.d}});Object.defineProperty(exports,"ssrElement",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.f}});Object.defineProperty(exports,"ssrRaw",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.h}});Object.defineProperty(exports,"ssrText",{enumerable:true,get:function(){return chunk2X7GUBTG_cjs.g}});//# sourceMappingURL=ssr.cjs.map
2
2
  //# sourceMappingURL=ssr.cjs.map
package/dist/ssr.js CHANGED
@@ -1,2 +1,2 @@
1
- export{a as escapeHtml,b as isServerRendering,i as nodeToHtml,j as renderNodes,e as renderToStream,c as renderToString,d as renderToStringSync,f as ssrElement,h as ssrRaw,g as ssrText}from'./chunk-3HWR5MIF.js';import'./chunk-JZWZVCDH.js';//# sourceMappingURL=ssr.js.map
1
+ export{a as escapeHtml,b as isServerRendering,i as nodeToHtml,j as renderNodes,e as renderToStream,c as renderToString,d as renderToStringSync,f as ssrElement,h as ssrRaw,g as ssrText}from'./chunk-3HWR5MIF.js';import'./chunk-PSRHGU7L.js';//# sourceMappingURL=ssr.js.map
2
2
  //# sourceMappingURL=ssr.js.map
package/dist/store.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var chunk37JKW5ZD_cjs=require('./chunk-37JKW5ZD.cjs');require('./chunk-GCFDHASX.cjs');Object.defineProperty(exports,"clearStores",{enumerable:true,get:function(){return chunk37JKW5ZD_cjs.b}});Object.defineProperty(exports,"defineStore",{enumerable:true,get:function(){return chunk37JKW5ZD_cjs.a}});//# sourceMappingURL=store.cjs.map
1
+ 'use strict';var chunk7FO6RXTP_cjs=require('./chunk-7FO6RXTP.cjs');require('./chunk-JT3BWNP3.cjs');Object.defineProperty(exports,"clearStores",{enumerable:true,get:function(){return chunk7FO6RXTP_cjs.b}});Object.defineProperty(exports,"defineStore",{enumerable:true,get:function(){return chunk7FO6RXTP_cjs.a}});//# sourceMappingURL=store.cjs.map
2
2
  //# sourceMappingURL=store.cjs.map
package/dist/store.js CHANGED
@@ -1,2 +1,2 @@
1
- export{b as clearStores,a as defineStore}from'./chunk-GNH24HO7.js';import'./chunk-JZWZVCDH.js';//# sourceMappingURL=store.js.map
1
+ export{b as clearStores,a as defineStore}from'./chunk-LPO2RGBW.js';import'./chunk-PSRHGU7L.js';//# sourceMappingURL=store.js.map
2
2
  //# sourceMappingURL=store.js.map
package/dist/sync.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var chunkKMSJMX3Z_cjs=require('./chunk-KMSJMX3Z.cjs');require('./chunk-GCFDHASX.cjs');Object.defineProperty(exports,"LWWRegister",{enumerable:true,get:function(){return chunkKMSJMX3Z_cjs.a}});Object.defineProperty(exports,"createLocalTransport",{enumerable:true,get:function(){return chunkKMSJMX3Z_cjs.c}});Object.defineProperty(exports,"createSync",{enumerable:true,get:function(){return chunkKMSJMX3Z_cjs.d}});Object.defineProperty(exports,"createWebSocketTransport",{enumerable:true,get:function(){return chunkKMSJMX3Z_cjs.b}});//# sourceMappingURL=sync.cjs.map
1
+ 'use strict';var chunkN6EZQIHQ_cjs=require('./chunk-N6EZQIHQ.cjs');require('./chunk-JT3BWNP3.cjs');Object.defineProperty(exports,"LWWRegister",{enumerable:true,get:function(){return chunkN6EZQIHQ_cjs.a}});Object.defineProperty(exports,"createLocalTransport",{enumerable:true,get:function(){return chunkN6EZQIHQ_cjs.c}});Object.defineProperty(exports,"createSync",{enumerable:true,get:function(){return chunkN6EZQIHQ_cjs.d}});Object.defineProperty(exports,"createWebSocketTransport",{enumerable:true,get:function(){return chunkN6EZQIHQ_cjs.b}});//# sourceMappingURL=sync.cjs.map
2
2
  //# sourceMappingURL=sync.cjs.map
package/dist/sync.js CHANGED
@@ -1,2 +1,2 @@
1
- export{a as LWWRegister,c as createLocalTransport,d as createSync,b as createWebSocketTransport}from'./chunk-MJP3WT7O.js';import'./chunk-JZWZVCDH.js';//# sourceMappingURL=sync.js.map
1
+ export{a as LWWRegister,c as createLocalTransport,d as createSync,b as createWebSocketTransport}from'./chunk-QZWPCZCC.js';import'./chunk-PSRHGU7L.js';//# sourceMappingURL=sync.js.map
2
2
  //# sourceMappingURL=sync.js.map
package/dist/test.cjs CHANGED
@@ -1,4 +1,4 @@
1
- 'use strict';var chunkHHQWJGM7_cjs=require('./chunk-HHQWJGM7.cjs');require('./chunk-GCFDHASX.cjs');function M(e,n){let t=document.createElement("div");t.setAttribute("data-akash-test-root","");let l=n?.props??{},o=n?.provide,a;return o&&o.size>0?a=chunkHHQWJGM7_cjs.B(()=>{for(let[i,d]of o)chunkHHQWJGM7_cjs.h(i,d);return ()=>e(l)})({}):a=e(l),t.appendChild(a),document.body.appendChild(t),{container:t,unmount(){t.remove();},getByText(r){let i=m(t,r);if(!i)throw new Error(`[AkashJS Test] Could not find element with text: "${r}"
1
+ 'use strict';var chunk43WUBCV3_cjs=require('./chunk-43WUBCV3.cjs');require('./chunk-JT3BWNP3.cjs');function M(e,n){let t=document.createElement("div");t.setAttribute("data-akash-test-root","");let l=n?.props??{},o=n?.provide,a;return o&&o.size>0?a=chunk43WUBCV3_cjs.B(()=>{for(let[i,d]of o)chunk43WUBCV3_cjs.h(i,d);return ()=>e(l)})({}):a=e(l),t.appendChild(a),document.body.appendChild(t),{container:t,unmount(){t.remove();},getByText(r){let i=m(t,r);if(!i)throw new Error(`[AkashJS Test] Could not find element with text: "${r}"
2
2
  Container HTML: ${t.innerHTML.slice(0,200)}`);return i},getByRole(r){let i=t.querySelector(`[role="${r}"]`)??p(t,r);if(!i)throw new Error(`[AkashJS Test] Could not find element with role: "${r}"
3
3
  Container HTML: ${t.innerHTML.slice(0,200)}`);return i},getByTestId(r){let i=t.querySelector(`[data-testid="${r}"]`);if(!i)throw new Error(`[AkashJS Test] Could not find element with data-testid: "${r}"
4
4
  Container HTML: ${t.innerHTML.slice(0,200)}`);return i},queryAll(r){return Array.from(t.querySelectorAll(r))},query(r){return t.querySelector(r)}}}var y={async click(e){e.dispatchEvent(new MouseEvent("click",{bubbles:true,cancelable:true})),await s();},async input(e,n){let t=Object.getOwnPropertyDescriptor(e instanceof HTMLTextAreaElement?HTMLTextAreaElement.prototype:HTMLInputElement.prototype,"value")?.set;t?t.call(e,n):e.value=n,e.dispatchEvent(new Event("input",{bubbles:true})),e.dispatchEvent(new Event("change",{bubbles:true})),await s();},async submit(e){e.dispatchEvent(new Event("submit",{bubbles:true,cancelable:true})),await s();},async focus(e){e.focus(),e.dispatchEvent(new FocusEvent("focus",{bubbles:true})),await s();},async blur(e){e.blur(),e.dispatchEvent(new FocusEvent("blur",{bubbles:true})),await s();},async keyDown(e,n,t){e.dispatchEvent(new KeyboardEvent("keydown",{key:n,bubbles:true,...t})),await s();},async keyUp(e,n,t){e.dispatchEvent(new KeyboardEvent("keyup",{key:n,bubbles:true,...t})),await s();}};function s(){return new Promise(e=>queueMicrotask(e))}function m(e,n){let t=null,l=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),o=l.nextNode();for(;o;)o instanceof HTMLElement&&o.textContent?.includes(n)&&(t=o),o=l.nextNode();return !t&&e.textContent?.includes(n)&&(t=e),t}var E={button:["button"],a:["link"],input:["textbox","checkbox","radio","spinbutton","slider"],select:["combobox","listbox"],textarea:["textbox"],img:["img"],form:["form"],nav:["navigation"],main:["main"],header:["banner"],footer:["contentinfo"],aside:["complementary"],section:["region"],article:["article"],ul:["list"],ol:["list"],li:["listitem"],table:["table"],th:["columnheader"],td:["cell"],h1:["heading"],h2:["heading"],h3:["heading"],h4:["heading"],h5:["heading"],h6:["heading"]};function p(e,n){let t=[];for(let[o,a]of Object.entries(E))a.includes(n)&&t.push(o);if(t.length===0)return null;let l=t.join(", ");return e.querySelector(l)}exports.fireEvent=y;exports.mount=M;//# sourceMappingURL=test.cjs.map
package/dist/test.js CHANGED
@@ -1,4 +1,4 @@
1
- import {B,h}from'./chunk-7AOFVBXQ.js';import'./chunk-JZWZVCDH.js';function M(e,n){let t=document.createElement("div");t.setAttribute("data-akash-test-root","");let l=n?.props??{},o=n?.provide,a;return o&&o.size>0?a=B(()=>{for(let[i,d]of o)h(i,d);return ()=>e(l)})({}):a=e(l),t.appendChild(a),document.body.appendChild(t),{container:t,unmount(){t.remove();},getByText(r){let i=m(t,r);if(!i)throw new Error(`[AkashJS Test] Could not find element with text: "${r}"
1
+ import {B,h}from'./chunk-2XEP24ZJ.js';import'./chunk-PSRHGU7L.js';function M(e,n){let t=document.createElement("div");t.setAttribute("data-akash-test-root","");let l=n?.props??{},o=n?.provide,a;return o&&o.size>0?a=B(()=>{for(let[i,d]of o)h(i,d);return ()=>e(l)})({}):a=e(l),t.appendChild(a),document.body.appendChild(t),{container:t,unmount(){t.remove();},getByText(r){let i=m(t,r);if(!i)throw new Error(`[AkashJS Test] Could not find element with text: "${r}"
2
2
  Container HTML: ${t.innerHTML.slice(0,200)}`);return i},getByRole(r){let i=t.querySelector(`[role="${r}"]`)??p(t,r);if(!i)throw new Error(`[AkashJS Test] Could not find element with role: "${r}"
3
3
  Container HTML: ${t.innerHTML.slice(0,200)}`);return i},getByTestId(r){let i=t.querySelector(`[data-testid="${r}"]`);if(!i)throw new Error(`[AkashJS Test] Could not find element with data-testid: "${r}"
4
4
  Container HTML: ${t.innerHTML.slice(0,200)}`);return i},queryAll(r){return Array.from(t.querySelectorAll(r))},query(r){return t.querySelector(r)}}}var y={async click(e){e.dispatchEvent(new MouseEvent("click",{bubbles:true,cancelable:true})),await s();},async input(e,n){let t=Object.getOwnPropertyDescriptor(e instanceof HTMLTextAreaElement?HTMLTextAreaElement.prototype:HTMLInputElement.prototype,"value")?.set;t?t.call(e,n):e.value=n,e.dispatchEvent(new Event("input",{bubbles:true})),e.dispatchEvent(new Event("change",{bubbles:true})),await s();},async submit(e){e.dispatchEvent(new Event("submit",{bubbles:true,cancelable:true})),await s();},async focus(e){e.focus(),e.dispatchEvent(new FocusEvent("focus",{bubbles:true})),await s();},async blur(e){e.blur(),e.dispatchEvent(new FocusEvent("blur",{bubbles:true})),await s();},async keyDown(e,n,t){e.dispatchEvent(new KeyboardEvent("keydown",{key:n,bubbles:true,...t})),await s();},async keyUp(e,n,t){e.dispatchEvent(new KeyboardEvent("keyup",{key:n,bubbles:true,...t})),await s();}};function s(){return new Promise(e=>queueMicrotask(e))}function m(e,n){let t=null,l=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),o=l.nextNode();for(;o;)o instanceof HTMLElement&&o.textContent?.includes(n)&&(t=o),o=l.nextNode();return !t&&e.textContent?.includes(n)&&(t=e),t}var E={button:["button"],a:["link"],input:["textbox","checkbox","radio","spinbutton","slider"],select:["combobox","listbox"],textarea:["textbox"],img:["img"],form:["form"],nav:["navigation"],main:["main"],header:["banner"],footer:["contentinfo"],aside:["complementary"],section:["region"],article:["article"],ul:["list"],ol:["list"],li:["listitem"],table:["table"],th:["columnheader"],td:["cell"],h1:["heading"],h2:["heading"],h3:["heading"],h4:["heading"],h5:["heading"],h6:["heading"]};function p(e,n){let t=[];for(let[o,a]of Object.entries(E))a.includes(n)&&t.push(o);if(t.length===0)return null;let l=t.join(", ");return e.querySelector(l)}export{y as fireEvent,M as mount};//# sourceMappingURL=test.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akashjs/runtime",
3
- "version": "0.1.17",
3
+ "version": "0.1.19",
4
4
  "description": "AkashJS core runtime — signals, components, DOM rendering",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -1,2 +0,0 @@
1
- 'use strict';var r=new Set,c=new Set,a=false,f=0,p=3,b=100;function l(){if(a)return;a=true;let e=new Map,s=false,t=0;for(;(r.size>0||c.size>0)&&t<b;){if(t++,r.size>0){let n=[...r].sort(S);r.clear();for(let u of n){let i=(e.get(u)??0)+1;if(e.set(u,i),i>p){s=true;continue}u.run();}}if(c.size>0){let n=[...c].sort(S);c.clear();for(let u of n){let i=(e.get(u)??0)+1;if(e.set(u,i),i>p){s=true;continue}u.run();}}if(s&&r.size===0&&c.size===0)break}(s||t>=b)&&(r.clear(),c.clear(),console.error("[AkashJS] Circular dependency detected between effects. Two or more effects are writing to each other's dependencies. The cycle has been broken after "+t+" iterations.")),a=false;}function T(e){e.isRender?r.add(e):c.add(e),f===0&&!a&&l();}function E(e){f++;try{e();}finally{f--,f===0&&l();}}function S(e,s){return (e.depth??0)-(s.depth??0)}function N(){l();}var w=typeof process>"u"||process.env?.NODE_ENV!=="production",o=null;function C(e,s){let t={value:e,subscribers:new Set,equals:s?.equals??Object.is},n=()=>(y(t),t.value);return n.set=u=>{w&&o&&o._tag==="computed"&&console.warn("[AkashJS] Writing to a signal inside computed() is not allowed. The write will be lost on the next evaluation."),!t.equals(t.value,u)&&(t.value=u,d(t));},n.update=u=>{n.set(u(t.value));},n.peek=()=>t.value,n}function q(e,s){let t={_tag:"computed",fn:e,value:void 0,state:1,subscribers:new Set,sources:new Set,equals:s?.equals??Object.is};return ()=>(o&&(t.subscribers.add(o),"sources"in o&&o.sources.add(t)),t.state!==0&&h(t),t.value)}function h(e){for(let t of e.sources)t.subscribers.delete(e);e.sources.clear();let s=o;o=e;try{let t=e.fn(),n=e.value===void 0||!e.equals(e.value,t);e.value=t,e.state=0,n&&d(e);}finally{o=s;}}function x(e,s){let t={_tag:"effect",fn:e,cleanup:null,sources:new Set,disposed:false,isRender:s?.render??false,run(){v(t);}};return v(t),()=>{t.disposed=true,g(t);for(let n of t.sources)n.subscribers.delete(t);t.sources.clear();}}function v(e){if(e.disposed)return;if(e.sources.size>0){let t=false;for(let n of e.sources)if("_tag"in n&&n._tag==="computed"){if(n.state===1){let u=n.value;h(n),n.equals(u,n.value)||(t=true);}}else t=true;if(!t)return}g(e);for(let t of e.sources)t.subscribers.delete(e);e.sources.clear();let s=o;o=e;try{let t=e.fn();typeof t=="function"&&(e.cleanup=t);}finally{o=s;}}function g(e){e.cleanup&&(e.cleanup(),e.cleanup=null);}function D(e){let s=o;o=null;try{return e()}finally{o=s;}}function y(e){o&&(e.subscribers.add(o),"sources"in o&&o.sources.add(e));}function d(e){let s=[...e.subscribers];for(let t of s)t._tag==="computed"?(t.state=1,d(t)):t._tag==="effect"&&T(t);}exports.a=E;exports.b=N;exports.c=C;exports.d=q;exports.e=x;exports.f=D;//# sourceMappingURL=chunk-GCFDHASX.cjs.map
2
- //# sourceMappingURL=chunk-GCFDHASX.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/scheduler.ts","../src/signals.ts"],"names":["pendingRender","pendingUser","flushing","batchDepth","MAX_EFFECT_RUNS","MAX_FLUSH_ITERATIONS","flush","runCounts","circularDetected","iterations","queue","byDepth","fx","count","scheduleEffect","batch","fn","a","b","flushSync","__DEV__","currentSubscriber","signal","initialValue","options","node","read","trackSubscriber","value","notifySubscribers","computed","recompute","source","prevSubscriber","newValue","changed","effect","runEffect","cleanupEffect","anyChanged","oldValue","result","untrack","prev","subs","sub"],"mappings":"aAcA,IAAMA,EAAgB,IAAI,GAAA,CACpBC,CAAAA,CAAc,IAAI,IACpBC,CAAAA,CAAW,KAAA,CACXC,CAAAA,CAAa,CAAA,CAGXC,CAAAA,CAAkB,CAAA,CAClBC,CAAAA,CAAuB,IAE7B,SAASC,CAAAA,EAAc,CACrB,GAAIJ,EAAU,OACdA,CAAAA,CAAW,KAIX,IAAMK,CAAAA,CAAY,IAAI,GAAA,CAClBC,EAAmB,KAAA,CAInBC,CAAAA,CAAa,CAAA,CACjB,KAAA,CAAQT,EAAc,IAAA,CAAO,CAAA,EAAKC,CAAAA,CAAY,IAAA,CAAO,IAAMQ,CAAAA,CAAaJ,CAAAA,EAAsB,CAI5F,GAHAI,IAGIT,CAAAA,CAAc,IAAA,CAAO,CAAA,CAAG,CAC1B,IAAMU,CAAAA,CAAQ,CAAC,GAAGV,CAAa,EAAE,IAAA,CAAKW,CAAO,CAAA,CAC7CX,CAAAA,CAAc,OAAM,CACpB,IAAA,IAAWY,CAAAA,IAAMF,CAAAA,CAAO,CACtB,IAAMG,CAAAA,CAAAA,CAASN,CAAAA,CAAU,GAAA,CAAIK,CAAE,CAAA,EAAK,CAAA,EAAK,EAEzC,GADAL,CAAAA,CAAU,IAAIK,CAAAA,CAAIC,CAAK,CAAA,CACnBA,CAAAA,CAAQT,EAAiB,CAC3BI,CAAAA,CAAmB,IAAA,CACnB,QACF,CACAI,CAAAA,CAAG,GAAA,GACL,CACF,CAGA,GAAIX,CAAAA,CAAY,IAAA,CAAO,CAAA,CAAG,CACxB,IAAMS,CAAAA,CAAQ,CAAC,GAAGT,CAAW,CAAA,CAAE,IAAA,CAAKU,CAAO,CAAA,CAC3CV,EAAY,KAAA,EAAM,CAClB,IAAA,IAAWW,CAAAA,IAAMF,EAAO,CACtB,IAAMG,GAASN,CAAAA,CAAU,GAAA,CAAIK,CAAE,CAAA,EAAK,CAAA,EAAK,CAAA,CAEzC,GADAL,EAAU,GAAA,CAAIK,CAAAA,CAAIC,CAAK,CAAA,CACnBA,EAAQT,CAAAA,CAAiB,CAC3BI,CAAAA,CAAmB,IAAA,CACnB,QACF,CACAI,CAAAA,CAAG,GAAA,GACL,CACF,CAGA,GAAIJ,CAAAA,EAAoBR,CAAAA,CAAc,OAAS,CAAA,EAAKC,CAAAA,CAAY,IAAA,GAAS,CAAA,CACvE,KAEJ,CAAA,CAEIO,CAAAA,EAAoBC,CAAAA,EAAcJ,CAAAA,IACpCL,EAAc,KAAA,EAAM,CACpBC,EAAY,KAAA,EAAM,CAClB,QAAQ,KAAA,CACN,wJAAA,CAEqCQ,CAAAA,CAAa,cACpD,GAGFP,CAAAA,CAAW,MACb,CAEO,SAASY,EAAeF,CAAAA,CAA2B,CACpDA,CAAAA,CAAG,QAAA,CACLZ,EAAc,GAAA,CAAIY,CAAE,CAAA,CAEpBX,CAAAA,CAAY,IAAIW,CAAE,CAAA,CAGhBT,CAAAA,GAAe,CAAA,EAAK,CAACD,CAAAA,EACvBI,CAAAA,GAEJ,CAMO,SAASS,CAAAA,CAAMC,CAAAA,CAAsB,CAC1Cb,CAAAA,EAAAA,CACA,GAAI,CACFa,CAAAA,GACF,CAAA,OAAE,CACAb,CAAAA,EAAAA,CACIA,CAAAA,GAAe,CAAA,EACjBG,CAAAA,GAEJ,CACF,CAGA,SAASK,CAAAA,CAAQM,EAAoBC,CAAAA,CAA4B,CAC/D,OAAA,CAAQD,CAAAA,CAAE,OAAS,CAAA,GAAMC,CAAAA,CAAE,KAAA,EAAS,CAAA,CACtC,CAGO,SAASC,CAAAA,EAAkB,CAChCb,CAAAA,GACF,CCjHA,IAAMc,CAAAA,CAAU,OAAO,QAAY,GAAA,EAAe,OAAA,CAAQ,GAAA,EAAK,QAAA,GAAa,aAMxEC,CAAAA,CAAuC,IAAA,CAuBpC,SAASC,CAAAA,CACdC,CAAAA,CACAC,EACW,CACX,IAAMC,CAAAA,CAAsB,CAC1B,MAAOF,CAAAA,CACP,WAAA,CAAa,IAAI,GAAA,CACjB,OAAQC,CAAAA,EAAS,MAAA,EAAU,MAAA,CAAO,EACpC,EAEME,CAAAA,CAAO,KACXC,CAAAA,CAAgBF,CAAI,EACbA,CAAAA,CAAK,KAAA,CAAA,CAGd,OAAAC,CAAAA,CAAK,IAAOE,CAAAA,EAAmB,CACzBR,CAAAA,EAAWC,CAAAA,EAAqBA,EAAkB,IAAA,GAAS,UAAA,EAC7D,OAAA,CAAQ,IAAA,CAAK,gHAAgH,CAAA,CAE3H,CAAAI,EAAK,MAAA,CAAOA,CAAAA,CAAK,MAAOG,CAAK,CAAA,GACjCH,CAAAA,CAAK,KAAA,CAAQG,EACbC,CAAAA,CAAkBJ,CAAI,CAAA,EACxB,CAAA,CAEAC,EAAK,MAAA,CAAUV,CAAAA,EAA6B,CAC1CU,CAAAA,CAAK,IAAIV,CAAAA,CAAGS,CAAAA,CAAK,KAAK,CAAC,EACzB,CAAA,CAEAC,CAAAA,CAAK,IAAA,CAAO,IAASD,EAAK,KAAA,CAEnBC,CACT,CAmBO,SAASI,EACdd,CAAAA,CACAQ,CAAAA,CACmB,CACnB,IAAMC,EAAwB,CAC5B,IAAA,CAAM,WACN,EAAA,CAAAT,CAAAA,CACA,MAAO,MAAA,CACP,KAAA,CAAO,CAAA,CACP,WAAA,CAAa,IAAI,GAAA,CACjB,OAAA,CAAS,IAAI,GAAA,CACb,OAAQQ,CAAAA,EAAS,MAAA,EAAU,MAAA,CAAO,EACpC,EAkBA,OAhBa,KAEPH,CAAAA,GACFI,CAAAA,CAAK,YAAY,GAAA,CAAIJ,CAAiB,CAAA,CAClC,SAAA,GAAaA,GACfA,CAAAA,CAAkB,OAAA,CAAQ,GAAA,CAAII,CAAI,GAIlCA,CAAAA,CAAK,KAAA,GAAU,CAAA,EACjBM,CAAAA,CAAUN,CAAI,CAAA,CAGTA,CAAAA,CAAK,KAAA,CAIhB,CAEA,SAASM,CAAAA,CAAaN,CAAAA,CAA6B,CAEjD,IAAA,IAAWO,KAAUP,CAAAA,CAAK,OAAA,CACxBO,CAAAA,CAAO,WAAA,CAAY,OAAOP,CAAI,CAAA,CAEhCA,CAAAA,CAAK,OAAA,CAAQ,OAAM,CAEnB,IAAMQ,CAAAA,CAAiBZ,CAAAA,CACvBA,EAAoBI,CAAAA,CAEpB,GAAI,CACF,IAAMS,EAAWT,CAAAA,CAAK,EAAA,EAAG,CACnBU,CAAAA,CACJV,EAAK,KAAA,GAAU,KAAA,CAAA,EAAa,CAACA,CAAAA,CAAK,OAAOA,CAAAA,CAAK,KAAA,CAAOS,CAAQ,CAAA,CAC/DT,CAAAA,CAAK,MAAQS,CAAAA,CACbT,CAAAA,CAAK,KAAA,CAAQ,CAAA,CAGTU,GACFN,CAAAA,CAAkBJ,CAAI,EAE1B,CAAA,OAAE,CACAJ,CAAAA,CAAoBY,EACtB,CACF,CAaO,SAASG,CAAAA,CACdpB,CAAAA,CACAQ,CAAAA,CACY,CACZ,IAAMC,CAAAA,CAAmB,CACvB,IAAA,CAAM,QAAA,CACN,GAAAT,CAAAA,CACA,OAAA,CAAS,IAAA,CACT,OAAA,CAAS,IAAI,GAAA,CACb,QAAA,CAAU,KAAA,CACV,QAAA,CAAUQ,GAAS,MAAA,EAAU,KAAA,CAC7B,KAAM,CACJa,CAAAA,CAAUZ,CAAI,EAChB,CACF,CAAA,CAGA,OAAAY,EAAUZ,CAAI,CAAA,CAGP,IAAM,CACXA,EAAK,QAAA,CAAW,IAAA,CAChBa,CAAAA,CAAcb,CAAI,EAClB,IAAA,IAAWO,CAAAA,IAAUP,CAAAA,CAAK,OAAA,CACxBO,EAAO,WAAA,CAAY,MAAA,CAAOP,CAAI,CAAA,CAEhCA,EAAK,OAAA,CAAQ,KAAA,GACf,CACF,CAEA,SAASY,CAAAA,CAAUZ,CAAAA,CAAwB,CACzC,GAAIA,CAAAA,CAAK,QAAA,CAAU,OAInB,GAAIA,CAAAA,CAAK,QAAQ,IAAA,CAAO,CAAA,CAAG,CACzB,IAAIc,EAAa,KAAA,CACjB,IAAA,IAAWP,CAAAA,IAAUP,CAAAA,CAAK,QACxB,GAAI,MAAA,GAAUO,CAAAA,EAAUA,CAAAA,CAAO,OAAS,UAAA,CAAA,CACtC,GAAIA,CAAAA,CAAO,KAAA,GAAU,EAAqB,CACxC,IAAMQ,CAAAA,CAAWR,CAAAA,CAAO,MACxBD,CAAAA,CAAUC,CAAM,CAAA,CACXA,CAAAA,CAAO,OAAOQ,CAAAA,CAAmBR,CAAAA,CAAO,KAAc,CAAA,GACzDO,EAAa,IAAA,EAEjB,CAAA,CAAA,KAGAA,CAAAA,CAAa,IAAA,CAGjB,GAAI,CAACA,CAAAA,CAAY,MACnB,CAGAD,EAAcb,CAAI,CAAA,CAGlB,IAAA,IAAWO,CAAAA,IAAUP,EAAK,OAAA,CACxBO,CAAAA,CAAO,WAAA,CAAY,MAAA,CAAOP,CAAI,CAAA,CAEhCA,CAAAA,CAAK,OAAA,CAAQ,KAAA,GAEb,IAAMQ,CAAAA,CAAiBZ,CAAAA,CACvBA,CAAAA,CAAoBI,EAEpB,GAAI,CACF,IAAMgB,CAAAA,CAAShB,EAAK,EAAA,EAAG,CACnB,OAAOgB,CAAAA,EAAW,aACpBhB,CAAAA,CAAK,OAAA,CAAUgB,GAEnB,CAAA,OAAE,CACApB,EAAoBY,EACtB,CACF,CAEA,SAASK,EAAcb,CAAAA,CAAwB,CACzCA,CAAAA,CAAK,OAAA,GACPA,EAAK,OAAA,EAAQ,CACbA,CAAAA,CAAK,OAAA,CAAU,MAEnB,CAKO,SAASiB,CAAAA,CAAW1B,CAAAA,CAAgB,CACzC,IAAM2B,CAAAA,CAAOtB,CAAAA,CACbA,CAAAA,CAAoB,KACpB,GAAI,CACF,OAAOL,CAAAA,EACT,CAAA,OAAE,CACAK,CAAAA,CAAoBsB,EACtB,CACF,CAIA,SAAShB,EACPF,CAAAA,CACM,CACFJ,IACFI,CAAAA,CAAK,WAAA,CAAY,GAAA,CAAIJ,CAAiB,EAElC,SAAA,GAAaA,CAAAA,EACfA,CAAAA,CAAkB,OAAA,CAAQ,IAAII,CAAI,CAAA,EAGxC,CAEA,SAASI,EACPJ,CAAAA,CACM,CAKN,IAAMmB,CAAAA,CAAO,CAAC,GAAGnB,CAAAA,CAAK,WAAW,CAAA,CACjC,QAAWoB,CAAAA,IAAOD,CAAAA,CACZC,CAAAA,CAAI,IAAA,GAAS,YAEfA,CAAAA,CAAI,KAAA,CAAQ,CAAA,CAIZhB,CAAAA,CAAkBgB,CAAG,CAAA,EACZA,CAAAA,CAAI,OAAS,QAAA,EACtB/B,CAAAA,CAAe+B,CAAG,EAGxB","file":"chunk-GCFDHASX.cjs","sourcesContent":["/**\n * Microtask-based effect scheduler with priority levels and deduplication.\n *\n * Render effects (DOM bindings) run before user effects to ensure\n * DOM is consistent before user-side effects execute.\n */\n\nexport interface ScheduledEffect {\n run(): void;\n isRender: boolean;\n /** Depth in the dependency graph (0 = root). Lower depth runs first. */\n depth?: number;\n}\n\nconst pendingRender = new Set<ScheduledEffect>();\nconst pendingUser = new Set<ScheduledEffect>();\nlet flushing = false;\nlet batchDepth = 0;\nlet flushScheduled = false;\n\nconst MAX_EFFECT_RUNS = 3;\nconst MAX_FLUSH_ITERATIONS = 100;\n\nfunction flush(): void {\n if (flushing) return;\n flushing = true;\n flushScheduled = false;\n\n // Fresh per-effect run counter for THIS flush — reset every time\n const runCounts = new Map<ScheduledEffect, number>();\n let circularDetected = false;\n\n // Process render effects first, then user effects.\n // Effects may enqueue more effects during flush, so loop until empty.\n let iterations = 0;\n while ((pendingRender.size > 0 || pendingUser.size > 0) && iterations < MAX_FLUSH_ITERATIONS) {\n iterations++;\n\n // Drain render effects (sorted by depth — parents before children)\n if (pendingRender.size > 0) {\n const queue = [...pendingRender].sort(byDepth);\n pendingRender.clear();\n for (const fx of queue) {\n const count = (runCounts.get(fx) ?? 0) + 1;\n runCounts.set(fx, count);\n if (count > MAX_EFFECT_RUNS) {\n circularDetected = true;\n continue; // skip this effect — it's in a cycle\n }\n fx.run();\n }\n }\n\n // Drain user effects (sorted by depth)\n if (pendingUser.size > 0) {\n const queue = [...pendingUser].sort(byDepth);\n pendingUser.clear();\n for (const fx of queue) {\n const count = (runCounts.get(fx) ?? 0) + 1;\n runCounts.set(fx, count);\n if (count > MAX_EFFECT_RUNS) {\n circularDetected = true;\n continue; // skip this effect — it's in a cycle\n }\n fx.run();\n }\n }\n\n // If all remaining effects were skipped due to cycle detection, break\n if (circularDetected && pendingRender.size === 0 && pendingUser.size === 0) {\n break;\n }\n }\n\n if (circularDetected || iterations >= MAX_FLUSH_ITERATIONS) {\n pendingRender.clear();\n pendingUser.clear();\n console.error(\n '[AkashJS] Circular dependency detected between effects. ' +\n 'Two or more effects are writing to each other\\'s dependencies. ' +\n 'The cycle has been broken after ' + iterations + ' iterations.'\n );\n }\n\n flushing = false;\n}\n\nexport function scheduleEffect(fx: ScheduledEffect): void {\n if (fx.isRender) {\n pendingRender.add(fx);\n } else {\n pendingUser.add(fx);\n }\n\n if (batchDepth === 0 && !flushing) {\n flush();\n }\n}\n\n/**\n * Batch multiple signal writes — subscribers are notified only once\n * at the end of the batch.\n */\nexport function batch(fn: () => void): void {\n batchDepth++;\n try {\n fn();\n } finally {\n batchDepth--;\n if (batchDepth === 0) {\n flush();\n }\n }\n}\n\n/** Sort effects by depth (lower depth first = parents before children) */\nfunction byDepth(a: ScheduledEffect, b: ScheduledEffect): number {\n return (a.depth ?? 0) - (b.depth ?? 0);\n}\n\n/** Synchronously flush all pending effects. Useful for testing. */\nexport function flushSync(): void {\n flush();\n}\n","/**\n * Fine-grained reactivity system.\n *\n * Inspired by SolidJS/Preact Signals. Provides signal(), computed(),\n * effect(), and untrack() primitives with automatic dependency tracking\n * and glitch-free diamond dependency resolution.\n */\n\nimport { scheduleEffect, type ScheduledEffect } from './scheduler.js';\n\nconst __DEV__ = typeof process === 'undefined' || process.env?.NODE_ENV !== 'production';\n\n// --- Tracking scope ---\n\ntype Subscriber = EffectNode | ComputedNode<unknown>;\n\nlet currentSubscriber: Subscriber | null = null;\n\n// --- Signal ---\n\nexport interface Signal<T> {\n /** Read the current value (tracks dependency if inside a reactive scope) */\n (): T;\n /** Set a new value */\n set(value: T): void;\n /** Update the value using the previous value */\n update(fn: (prev: T) => T): void;\n /** Read without tracking (no dependency registered) */\n peek(): T;\n}\n\nexport type ReadonlySignal<T> = () => T;\n\ninterface SignalNode<T> {\n value: T;\n subscribers: Set<Subscriber>;\n equals: (a: T, b: T) => boolean;\n}\n\nexport function signal<T>(\n initialValue: T,\n options?: { equals?: (a: T, b: T) => boolean },\n): Signal<T> {\n const node: SignalNode<T> = {\n value: initialValue,\n subscribers: new Set(),\n equals: options?.equals ?? Object.is,\n };\n\n const read = (): T => {\n trackSubscriber(node);\n return node.value;\n };\n\n read.set = (value: T): void => {\n if (__DEV__ && currentSubscriber && currentSubscriber._tag === 'computed') {\n console.warn('[AkashJS] Writing to a signal inside computed() is not allowed. The write will be lost on the next evaluation.');\n }\n if (node.equals(node.value, value)) return;\n node.value = value;\n notifySubscribers(node);\n };\n\n read.update = (fn: (prev: T) => T): void => {\n read.set(fn(node.value));\n };\n\n read.peek = (): T => node.value;\n\n return read;\n}\n\n// --- Computed ---\n\nconst enum ComputedState {\n Clean = 0,\n Dirty = 1,\n}\n\ninterface ComputedNode<T> {\n _tag: 'computed';\n fn: () => T;\n value: T | undefined;\n state: ComputedState;\n subscribers: Set<Subscriber>;\n sources: Set<SignalNode<unknown> | ComputedNode<unknown>>;\n equals: (a: T, b: T) => boolean;\n}\n\nexport function computed<T>(\n fn: () => T,\n options?: { equals?: (a: T, b: T) => boolean },\n): ReadonlySignal<T> {\n const node: ComputedNode<T> = {\n _tag: 'computed',\n fn,\n value: undefined,\n state: ComputedState.Dirty,\n subscribers: new Set(),\n sources: new Set(),\n equals: options?.equals ?? Object.is,\n };\n\n const read = (): T => {\n // Track this computed as a dependency of the current subscriber\n if (currentSubscriber) {\n node.subscribers.add(currentSubscriber);\n if ('sources' in currentSubscriber) {\n currentSubscriber.sources.add(node);\n }\n }\n\n if (node.state !== ComputedState.Clean) {\n recompute(node);\n }\n\n return node.value as T;\n };\n\n return read;\n}\n\nfunction recompute<T>(node: ComputedNode<T>): void {\n // Clean up old source subscriptions\n for (const source of node.sources) {\n source.subscribers.delete(node);\n }\n node.sources.clear();\n\n const prevSubscriber = currentSubscriber;\n currentSubscriber = node;\n\n try {\n const newValue = node.fn();\n const changed =\n node.value === undefined || !node.equals(node.value, newValue);\n node.value = newValue;\n node.state = ComputedState.Clean;\n\n // Only propagate if value actually changed\n if (changed) {\n notifySubscribers(node);\n }\n } finally {\n currentSubscriber = prevSubscriber;\n }\n}\n\n// --- Effect ---\n\ninterface EffectNode extends ScheduledEffect {\n _tag: 'effect';\n fn: () => void | (() => void);\n cleanup: (() => void) | null;\n sources: Set<SignalNode<unknown> | ComputedNode<unknown>>;\n disposed: boolean;\n isRender: boolean;\n}\n\nexport function effect(\n fn: () => void | (() => void),\n options?: { render?: boolean },\n): () => void {\n const node: EffectNode = {\n _tag: 'effect',\n fn,\n cleanup: null,\n sources: new Set(),\n disposed: false,\n isRender: options?.render ?? false,\n run() {\n runEffect(node);\n },\n };\n\n // Run immediately to establish dependencies\n runEffect(node);\n\n // Return dispose function\n return () => {\n node.disposed = true;\n cleanupEffect(node);\n for (const source of node.sources) {\n source.subscribers.delete(node);\n }\n node.sources.clear();\n };\n}\n\nfunction runEffect(node: EffectNode): void {\n if (node.disposed) return;\n\n // Before re-running, check if any dirty computed source actually changed.\n // If all computed sources resolved to the same value, skip the re-run.\n if (node.sources.size > 0) {\n let anyChanged = false;\n for (const source of node.sources) {\n if ('_tag' in source && source._tag === 'computed') {\n if (source.state === ComputedState.Dirty) {\n const oldValue = source.value;\n recompute(source);\n if (!source.equals(oldValue as never, source.value as never)) {\n anyChanged = true;\n }\n }\n } else {\n // Plain signal source — if we got scheduled, something changed\n anyChanged = true;\n }\n }\n if (!anyChanged) return;\n }\n\n // Clean up previous run\n cleanupEffect(node);\n\n // Clean up old source subscriptions\n for (const source of node.sources) {\n source.subscribers.delete(node);\n }\n node.sources.clear();\n\n const prevSubscriber = currentSubscriber;\n currentSubscriber = node;\n\n try {\n const result = node.fn();\n if (typeof result === 'function') {\n node.cleanup = result;\n }\n } finally {\n currentSubscriber = prevSubscriber;\n }\n}\n\nfunction cleanupEffect(node: EffectNode): void {\n if (node.cleanup) {\n node.cleanup();\n node.cleanup = null;\n }\n}\n\n// --- Untrack ---\n\n/** Execute a function without tracking any signal reads */\nexport function untrack<T>(fn: () => T): T {\n const prev = currentSubscriber;\n currentSubscriber = null;\n try {\n return fn();\n } finally {\n currentSubscriber = prev;\n }\n}\n\n// --- Internal helpers ---\n\nfunction trackSubscriber(\n node: SignalNode<unknown> | ComputedNode<unknown>,\n): void {\n if (currentSubscriber) {\n node.subscribers.add(currentSubscriber);\n\n if ('sources' in currentSubscriber) {\n currentSubscriber.sources.add(node);\n }\n }\n}\n\nfunction notifySubscribers(\n node: SignalNode<unknown> | ComputedNode<unknown>,\n): void {\n // Snapshot subscribers before iterating. Effects that run synchronously\n // during flush() will delete and re-add themselves to the Set, and JS\n // Set iterators visit newly added entries — causing an infinite loop\n // without the snapshot.\n const subs = [...node.subscribers];\n for (const sub of subs) {\n if (sub._tag === 'computed') {\n // Mark dirty. The computed will re-evaluate lazily when read.\n sub.state = ComputedState.Dirty;\n // Propagate through the computed chain to reach effects.\n // The effects will re-read the computed, triggering recompute,\n // and only update DOM if the value actually changed.\n notifySubscribers(sub);\n } else if (sub._tag === 'effect') {\n scheduleEffect(sub);\n }\n }\n}\n"]}
@@ -1,2 +0,0 @@
1
- var r=new Set,c=new Set,a=false,f=0,p=3,b=100;function l(){if(a)return;a=true;let e=new Map,s=false,t=0;for(;(r.size>0||c.size>0)&&t<b;){if(t++,r.size>0){let n=[...r].sort(S);r.clear();for(let u of n){let i=(e.get(u)??0)+1;if(e.set(u,i),i>p){s=true;continue}u.run();}}if(c.size>0){let n=[...c].sort(S);c.clear();for(let u of n){let i=(e.get(u)??0)+1;if(e.set(u,i),i>p){s=true;continue}u.run();}}if(s&&r.size===0&&c.size===0)break}(s||t>=b)&&(r.clear(),c.clear(),console.error("[AkashJS] Circular dependency detected between effects. Two or more effects are writing to each other's dependencies. The cycle has been broken after "+t+" iterations.")),a=false;}function T(e){e.isRender?r.add(e):c.add(e),f===0&&!a&&l();}function E(e){f++;try{e();}finally{f--,f===0&&l();}}function S(e,s){return (e.depth??0)-(s.depth??0)}function N(){l();}var w=typeof process>"u"||process.env?.NODE_ENV!=="production",o=null;function C(e,s){let t={value:e,subscribers:new Set,equals:s?.equals??Object.is},n=()=>(y(t),t.value);return n.set=u=>{w&&o&&o._tag==="computed"&&console.warn("[AkashJS] Writing to a signal inside computed() is not allowed. The write will be lost on the next evaluation."),!t.equals(t.value,u)&&(t.value=u,d(t));},n.update=u=>{n.set(u(t.value));},n.peek=()=>t.value,n}function q(e,s){let t={_tag:"computed",fn:e,value:void 0,state:1,subscribers:new Set,sources:new Set,equals:s?.equals??Object.is};return ()=>(o&&(t.subscribers.add(o),"sources"in o&&o.sources.add(t)),t.state!==0&&h(t),t.value)}function h(e){for(let t of e.sources)t.subscribers.delete(e);e.sources.clear();let s=o;o=e;try{let t=e.fn(),n=e.value===void 0||!e.equals(e.value,t);e.value=t,e.state=0,n&&d(e);}finally{o=s;}}function x(e,s){let t={_tag:"effect",fn:e,cleanup:null,sources:new Set,disposed:false,isRender:s?.render??false,run(){v(t);}};return v(t),()=>{t.disposed=true,g(t);for(let n of t.sources)n.subscribers.delete(t);t.sources.clear();}}function v(e){if(e.disposed)return;if(e.sources.size>0){let t=false;for(let n of e.sources)if("_tag"in n&&n._tag==="computed"){if(n.state===1){let u=n.value;h(n),n.equals(u,n.value)||(t=true);}}else t=true;if(!t)return}g(e);for(let t of e.sources)t.subscribers.delete(e);e.sources.clear();let s=o;o=e;try{let t=e.fn();typeof t=="function"&&(e.cleanup=t);}finally{o=s;}}function g(e){e.cleanup&&(e.cleanup(),e.cleanup=null);}function D(e){let s=o;o=null;try{return e()}finally{o=s;}}function y(e){o&&(e.subscribers.add(o),"sources"in o&&o.sources.add(e));}function d(e){let s=[...e.subscribers];for(let t of s)t._tag==="computed"?(t.state=1,d(t)):t._tag==="effect"&&T(t);}export{E as a,N as b,C as c,q as d,x as e,D as f};//# sourceMappingURL=chunk-JZWZVCDH.js.map
2
- //# sourceMappingURL=chunk-JZWZVCDH.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/scheduler.ts","../src/signals.ts"],"names":["pendingRender","pendingUser","flushing","batchDepth","MAX_EFFECT_RUNS","MAX_FLUSH_ITERATIONS","flush","runCounts","circularDetected","iterations","queue","byDepth","fx","count","scheduleEffect","batch","fn","a","b","flushSync","__DEV__","currentSubscriber","signal","initialValue","options","node","read","trackSubscriber","value","notifySubscribers","computed","recompute","source","prevSubscriber","newValue","changed","effect","runEffect","cleanupEffect","anyChanged","oldValue","result","untrack","prev","subs","sub"],"mappings":"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","file":"chunk-JZWZVCDH.js","sourcesContent":["/**\n * Microtask-based effect scheduler with priority levels and deduplication.\n *\n * Render effects (DOM bindings) run before user effects to ensure\n * DOM is consistent before user-side effects execute.\n */\n\nexport interface ScheduledEffect {\n run(): void;\n isRender: boolean;\n /** Depth in the dependency graph (0 = root). Lower depth runs first. */\n depth?: number;\n}\n\nconst pendingRender = new Set<ScheduledEffect>();\nconst pendingUser = new Set<ScheduledEffect>();\nlet flushing = false;\nlet batchDepth = 0;\nlet flushScheduled = false;\n\nconst MAX_EFFECT_RUNS = 3;\nconst MAX_FLUSH_ITERATIONS = 100;\n\nfunction flush(): void {\n if (flushing) return;\n flushing = true;\n flushScheduled = false;\n\n // Fresh per-effect run counter for THIS flush — reset every time\n const runCounts = new Map<ScheduledEffect, number>();\n let circularDetected = false;\n\n // Process render effects first, then user effects.\n // Effects may enqueue more effects during flush, so loop until empty.\n let iterations = 0;\n while ((pendingRender.size > 0 || pendingUser.size > 0) && iterations < MAX_FLUSH_ITERATIONS) {\n iterations++;\n\n // Drain render effects (sorted by depth — parents before children)\n if (pendingRender.size > 0) {\n const queue = [...pendingRender].sort(byDepth);\n pendingRender.clear();\n for (const fx of queue) {\n const count = (runCounts.get(fx) ?? 0) + 1;\n runCounts.set(fx, count);\n if (count > MAX_EFFECT_RUNS) {\n circularDetected = true;\n continue; // skip this effect — it's in a cycle\n }\n fx.run();\n }\n }\n\n // Drain user effects (sorted by depth)\n if (pendingUser.size > 0) {\n const queue = [...pendingUser].sort(byDepth);\n pendingUser.clear();\n for (const fx of queue) {\n const count = (runCounts.get(fx) ?? 0) + 1;\n runCounts.set(fx, count);\n if (count > MAX_EFFECT_RUNS) {\n circularDetected = true;\n continue; // skip this effect — it's in a cycle\n }\n fx.run();\n }\n }\n\n // If all remaining effects were skipped due to cycle detection, break\n if (circularDetected && pendingRender.size === 0 && pendingUser.size === 0) {\n break;\n }\n }\n\n if (circularDetected || iterations >= MAX_FLUSH_ITERATIONS) {\n pendingRender.clear();\n pendingUser.clear();\n console.error(\n '[AkashJS] Circular dependency detected between effects. ' +\n 'Two or more effects are writing to each other\\'s dependencies. ' +\n 'The cycle has been broken after ' + iterations + ' iterations.'\n );\n }\n\n flushing = false;\n}\n\nexport function scheduleEffect(fx: ScheduledEffect): void {\n if (fx.isRender) {\n pendingRender.add(fx);\n } else {\n pendingUser.add(fx);\n }\n\n if (batchDepth === 0 && !flushing) {\n flush();\n }\n}\n\n/**\n * Batch multiple signal writes — subscribers are notified only once\n * at the end of the batch.\n */\nexport function batch(fn: () => void): void {\n batchDepth++;\n try {\n fn();\n } finally {\n batchDepth--;\n if (batchDepth === 0) {\n flush();\n }\n }\n}\n\n/** Sort effects by depth (lower depth first = parents before children) */\nfunction byDepth(a: ScheduledEffect, b: ScheduledEffect): number {\n return (a.depth ?? 0) - (b.depth ?? 0);\n}\n\n/** Synchronously flush all pending effects. Useful for testing. */\nexport function flushSync(): void {\n flush();\n}\n","/**\n * Fine-grained reactivity system.\n *\n * Inspired by SolidJS/Preact Signals. Provides signal(), computed(),\n * effect(), and untrack() primitives with automatic dependency tracking\n * and glitch-free diamond dependency resolution.\n */\n\nimport { scheduleEffect, type ScheduledEffect } from './scheduler.js';\n\nconst __DEV__ = typeof process === 'undefined' || process.env?.NODE_ENV !== 'production';\n\n// --- Tracking scope ---\n\ntype Subscriber = EffectNode | ComputedNode<unknown>;\n\nlet currentSubscriber: Subscriber | null = null;\n\n// --- Signal ---\n\nexport interface Signal<T> {\n /** Read the current value (tracks dependency if inside a reactive scope) */\n (): T;\n /** Set a new value */\n set(value: T): void;\n /** Update the value using the previous value */\n update(fn: (prev: T) => T): void;\n /** Read without tracking (no dependency registered) */\n peek(): T;\n}\n\nexport type ReadonlySignal<T> = () => T;\n\ninterface SignalNode<T> {\n value: T;\n subscribers: Set<Subscriber>;\n equals: (a: T, b: T) => boolean;\n}\n\nexport function signal<T>(\n initialValue: T,\n options?: { equals?: (a: T, b: T) => boolean },\n): Signal<T> {\n const node: SignalNode<T> = {\n value: initialValue,\n subscribers: new Set(),\n equals: options?.equals ?? Object.is,\n };\n\n const read = (): T => {\n trackSubscriber(node);\n return node.value;\n };\n\n read.set = (value: T): void => {\n if (__DEV__ && currentSubscriber && currentSubscriber._tag === 'computed') {\n console.warn('[AkashJS] Writing to a signal inside computed() is not allowed. The write will be lost on the next evaluation.');\n }\n if (node.equals(node.value, value)) return;\n node.value = value;\n notifySubscribers(node);\n };\n\n read.update = (fn: (prev: T) => T): void => {\n read.set(fn(node.value));\n };\n\n read.peek = (): T => node.value;\n\n return read;\n}\n\n// --- Computed ---\n\nconst enum ComputedState {\n Clean = 0,\n Dirty = 1,\n}\n\ninterface ComputedNode<T> {\n _tag: 'computed';\n fn: () => T;\n value: T | undefined;\n state: ComputedState;\n subscribers: Set<Subscriber>;\n sources: Set<SignalNode<unknown> | ComputedNode<unknown>>;\n equals: (a: T, b: T) => boolean;\n}\n\nexport function computed<T>(\n fn: () => T,\n options?: { equals?: (a: T, b: T) => boolean },\n): ReadonlySignal<T> {\n const node: ComputedNode<T> = {\n _tag: 'computed',\n fn,\n value: undefined,\n state: ComputedState.Dirty,\n subscribers: new Set(),\n sources: new Set(),\n equals: options?.equals ?? Object.is,\n };\n\n const read = (): T => {\n // Track this computed as a dependency of the current subscriber\n if (currentSubscriber) {\n node.subscribers.add(currentSubscriber);\n if ('sources' in currentSubscriber) {\n currentSubscriber.sources.add(node);\n }\n }\n\n if (node.state !== ComputedState.Clean) {\n recompute(node);\n }\n\n return node.value as T;\n };\n\n return read;\n}\n\nfunction recompute<T>(node: ComputedNode<T>): void {\n // Clean up old source subscriptions\n for (const source of node.sources) {\n source.subscribers.delete(node);\n }\n node.sources.clear();\n\n const prevSubscriber = currentSubscriber;\n currentSubscriber = node;\n\n try {\n const newValue = node.fn();\n const changed =\n node.value === undefined || !node.equals(node.value, newValue);\n node.value = newValue;\n node.state = ComputedState.Clean;\n\n // Only propagate if value actually changed\n if (changed) {\n notifySubscribers(node);\n }\n } finally {\n currentSubscriber = prevSubscriber;\n }\n}\n\n// --- Effect ---\n\ninterface EffectNode extends ScheduledEffect {\n _tag: 'effect';\n fn: () => void | (() => void);\n cleanup: (() => void) | null;\n sources: Set<SignalNode<unknown> | ComputedNode<unknown>>;\n disposed: boolean;\n isRender: boolean;\n}\n\nexport function effect(\n fn: () => void | (() => void),\n options?: { render?: boolean },\n): () => void {\n const node: EffectNode = {\n _tag: 'effect',\n fn,\n cleanup: null,\n sources: new Set(),\n disposed: false,\n isRender: options?.render ?? false,\n run() {\n runEffect(node);\n },\n };\n\n // Run immediately to establish dependencies\n runEffect(node);\n\n // Return dispose function\n return () => {\n node.disposed = true;\n cleanupEffect(node);\n for (const source of node.sources) {\n source.subscribers.delete(node);\n }\n node.sources.clear();\n };\n}\n\nfunction runEffect(node: EffectNode): void {\n if (node.disposed) return;\n\n // Before re-running, check if any dirty computed source actually changed.\n // If all computed sources resolved to the same value, skip the re-run.\n if (node.sources.size > 0) {\n let anyChanged = false;\n for (const source of node.sources) {\n if ('_tag' in source && source._tag === 'computed') {\n if (source.state === ComputedState.Dirty) {\n const oldValue = source.value;\n recompute(source);\n if (!source.equals(oldValue as never, source.value as never)) {\n anyChanged = true;\n }\n }\n } else {\n // Plain signal source — if we got scheduled, something changed\n anyChanged = true;\n }\n }\n if (!anyChanged) return;\n }\n\n // Clean up previous run\n cleanupEffect(node);\n\n // Clean up old source subscriptions\n for (const source of node.sources) {\n source.subscribers.delete(node);\n }\n node.sources.clear();\n\n const prevSubscriber = currentSubscriber;\n currentSubscriber = node;\n\n try {\n const result = node.fn();\n if (typeof result === 'function') {\n node.cleanup = result;\n }\n } finally {\n currentSubscriber = prevSubscriber;\n }\n}\n\nfunction cleanupEffect(node: EffectNode): void {\n if (node.cleanup) {\n node.cleanup();\n node.cleanup = null;\n }\n}\n\n// --- Untrack ---\n\n/** Execute a function without tracking any signal reads */\nexport function untrack<T>(fn: () => T): T {\n const prev = currentSubscriber;\n currentSubscriber = null;\n try {\n return fn();\n } finally {\n currentSubscriber = prev;\n }\n}\n\n// --- Internal helpers ---\n\nfunction trackSubscriber(\n node: SignalNode<unknown> | ComputedNode<unknown>,\n): void {\n if (currentSubscriber) {\n node.subscribers.add(currentSubscriber);\n\n if ('sources' in currentSubscriber) {\n currentSubscriber.sources.add(node);\n }\n }\n}\n\nfunction notifySubscribers(\n node: SignalNode<unknown> | ComputedNode<unknown>,\n): void {\n // Snapshot subscribers before iterating. Effects that run synchronously\n // during flush() will delete and re-add themselves to the Set, and JS\n // Set iterators visit newly added entries — causing an infinite loop\n // without the snapshot.\n const subs = [...node.subscribers];\n for (const sub of subs) {\n if (sub._tag === 'computed') {\n // Mark dirty. The computed will re-evaluate lazily when read.\n sub.state = ComputedState.Dirty;\n // Propagate through the computed chain to reach effects.\n // The effects will re-read the computed, triggering recompute,\n // and only update DOM if the value actually changed.\n notifySubscribers(sub);\n } else if (sub._tag === 'effect') {\n scheduleEffect(sub);\n }\n }\n}\n"]}