balises 0.2.1 → 0.4.0
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.
- package/README.md +257 -46
- package/dist/balises.esm.js +143 -111
- package/dist/balises.esm.js.map +1 -1
- package/dist/balises.iife.js +143 -114
- package/dist/balises.iife.js.map +1 -1
- package/dist/balises.iife.min.js +1 -2
- package/dist/balises.iife.min.js.map +1 -1
- package/dist/esm/index.d.ts +3 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/parser.d.ts +2 -3
- package/dist/esm/parser.d.ts.map +1 -1
- package/dist/esm/parser.js +17 -18
- package/dist/esm/parser.js.map +1 -1
- package/dist/esm/signals/computed.d.ts.map +1 -1
- package/dist/esm/signals/computed.js +12 -22
- package/dist/esm/signals/computed.js.map +1 -1
- package/dist/esm/signals/context.d.ts +24 -1
- package/dist/esm/signals/context.d.ts.map +1 -1
- package/dist/esm/signals/context.js +52 -2
- package/dist/esm/signals/context.js.map +1 -1
- package/dist/esm/signals/effect.d.ts.map +1 -1
- package/dist/esm/signals/effect.js +1 -0
- package/dist/esm/signals/effect.js.map +1 -1
- package/dist/esm/signals/index.d.ts +2 -2
- package/dist/esm/signals/index.d.ts.map +1 -1
- package/dist/esm/signals/index.js +2 -2
- package/dist/esm/signals/index.js.map +1 -1
- package/dist/esm/signals/store.d.ts.map +1 -1
- package/dist/esm/signals/store.js +3 -4
- package/dist/esm/signals/store.js.map +1 -1
- package/dist/esm/template.d.ts.map +1 -1
- package/dist/esm/template.js +116 -107
- package/dist/esm/template.js.map +1 -1
- package/package.json +17 -6
package/dist/balises.iife.min.js
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
var Balises=(function(e){let t=null;function n(e){t=e}let r=0,i=null;function a(e){r++,r===1&&(i=new Set);try{return e()}finally{if(--r===0){let e=i;i=null;for(let t of e)t()}}}function o(){return r>0}function s(e){i.add(e)}function c(e){for(let t=0;t<e.length;t++)i.add(e[t])}function l(e,t){let n=e.indexOf(t);n>=0&&(e[n]=e[e.length-1],e.pop())}var
|
|
2
|
-
`||e===`\r`}};function b(e,t){return v(e)?(t(e.value),e.subscribe(()=>t(e.value))):(t(e),null)}var x=class{constructor(e,t){this.strings=e,this.values=t}render(){let e=document.createDocumentFragment(),t=[],n=[e],r=new y,i=this.values;return r.parseTemplate(this.strings,{onText:e=>{n.at(-1).appendChild(document.createTextNode(e))},onElement:(e,t)=>{n.at(-1).appendChild(e),t||n.push(e)},onClose:()=>{n.length>1&&n.pop()},onAttribute:(e,n,r)=>{let a=n[0];if(a===`@`){let a=n.slice(1),o=r[0];if(o&&typeof o!=`string`){let n=i[o.index];e.addEventListener(a,n),t.push(()=>e.removeEventListener(a,n))}return}if(a===`.`){let a=n.slice(1),o=r[0];if(o&&typeof o!=`string`){let n=b(i[o.index],t=>{e[a]=t});n&&t.push(n)}return}if(r.every(e=>typeof e==`string`)){let t=r.join(``);(t||r.length===0)&&e.setAttribute(n,t);return}let o=r.filter(e=>typeof e!=`string`),s=o.map(e=>i[e.index]).filter(v),c=r.length===1&&typeof r[0]!=`string`,l=()=>{if(c){let t=i[o[0].index],r=v(t)?t.value:t;r==null||r===!1?e.removeAttribute(n):e.setAttribute(n,r===!0?``:String(r))}else{let t=r.map(e=>{if(typeof e==`string`)return e;let t=i[e.index],n=v(t)?t.value:t;return n==null?``:String(n)}).join(``);e.setAttribute(n,t)}};l(),s.forEach(e=>t.push(e.subscribe(l)))},onSlot:e=>{let r=document.createComment(``);n.at(-1).appendChild(r),t.push(S(r,i[e]))}}),{fragment:e,dispose:()=>t.forEach(e=>e())}}};function S(e,t){let n=[],r=[],i=()=>{r.forEach(e=>e()),r=[],n.forEach(e=>e.parentNode?.removeChild(e)),n=[]};if(T(t)){let r=new Map,{list:i,keyFn:a,renderFn:o}=t,s=!1,c=()=>{let t=e.parentNode,c=i.value,l=new Set,u=[];for(let e=0;e<c.length;e++){let t=c[e],n=a(t,e);if(l.has(n)){s||(s=!0,console.warn(`[balises] Duplicate key in each(): ${String(n)}. Each item should have a unique key. Consider providing a keyFn.`));continue}l.add(n);let i=r.get(n);if(!i||i.item!==t){i&&(i.nodes.forEach(e=>e.parentNode?.removeChild(e)),i.dispose());let{fragment:e,dispose:a}=o(t).render();i={item:t,nodes:[...e.childNodes],dispose:a},r.set(n,i)}u.push(...i.nodes)}for(let[e,t]of r)l.has(e)||(t.nodes.forEach(e=>e.parentNode?.removeChild(e)),t.dispose(),r.delete(e));let d=e;for(let e=u.length-1;e>=0;e--){let n=u[e];n.nextSibling!==d&&t.insertBefore(n,d),d=n}n=u};c();let l=i.subscribe(c);return()=>{l();for(let e of r.values())e.dispose();r.clear(),n.forEach(e=>e.parentNode?.removeChild(e))}}let a=b(t,t=>{i();let a=e.parentNode;for(let i of Array.isArray(t)?t:[t])if(i instanceof x){let{fragment:t,dispose:o}=i.render();r.push(o),n.push(...t.childNodes),a.insertBefore(t,e)}else if(i!=null&&typeof i!=`boolean`){let t=document.createTextNode(String(i));n.push(t),a.insertBefore(t,e)}});return()=>{a?.(),i()}}let C=(e,...t)=>new x(e,t),w=Symbol(),T=e=>typeof e==`object`&&!!e&&w in e;function E(e){return Array.isArray(e)?d(e):typeof e==`function`?p(e):e}function D(e,t,n){let r=E(e);return n===void 0?{[w]:!0,list:r,keyFn:(e,t)=>e!==null&&(typeof e==`object`||typeof e==`function`)?e:t,renderFn:t}:{[w]:!0,list:r,keyFn:t,renderFn:n}}return e.Computed=f,e.Signal=u,e.Template=x,e.batch=a,e.computed=p,e.each=D,e.effect=m,e.html=C,e.isSignal=v,e.signal=d,e.store=_,e})({});
|
|
1
|
+
var Balises=(function(e){let t=null;function n(e){t=e}let r=0,i=null;function a(e){r++,r===1&&(i=new Set);try{return e()}finally{if(--r===0){let e=i;i=null;for(let t of e)t()}}}function o(){return r>0}function s(e){i.add(e)}function c(e){for(let t=0;t<e.length;t++)i.add(e[t])}let l=null;function u(e){let t=[];l||=[],l.push(t);try{return[e(),()=>{for(let e=t.length-1;e>=0;e--)t[e]();t.length=0}]}finally{l.pop(),l.length===0&&(l=null)}}function d(e){l?.at(-1)?.push(e)}function f(e,t){let n=e.indexOf(t);n>=0&&(e[n]=e[e.length-1],e.pop())}var p=class{#e;#t=[];#n=[];constructor(e){this.#e=e}get value(){return t&&t.trackSource(this),this.#e}set value(e){if(Object.is(this.#e,e))return;this.#e=e;let t=this.#n;for(let e=0;e<t.length;e++)t[e].markDirty();if(this.#t.length)if(o())c(this.#t);else for(let e=0;e<this.#t.length;e++)this.#t[e]()}subscribe(e){return this.#t.push(e),()=>f(this.#t,e)}update(e){this.value=e(this.#e)}get targets(){return this.#n}deleteTarget(e){f(this.#n,e)}};let m=e=>new p(e);var h=class{#e;#t;#n=!0;#r=!1;#i=[];#a=[];#o=[];#s=0;constructor(e){this.#e=e,this.#c(),d(()=>this.dispose())}get value(){return this.#n&&this.#c(),t&&t!==this&&t.trackSource(this),this.#t}subscribe(e){return this.#i.push(e),()=>f(this.#i,e)}dispose(){this.#e=void 0;let e=this.#o;for(let t=0;t<e.length;t++){let n=e[t];n&&n.deleteTarget(this)}this.#o=[],this.#i.length=0}trackSource(e){let t=this.#o,n=this.#s++;if(n<t.length){if(t[n]===e)return;for(let e=n;e<t.length;e++){let n=t[e];n&&n.deleteTarget(this)}t.length=n}t.push(e),e.targets.push(this)}markDirty(){if(this.#n)return;let e=[this];for(let t=0;t<e.length;t++){let n=e[t];if(n.#n)continue;n.#n=!0;let r=n.#a;if(n.#i.length>0&&r.length>0&&n.#e&&!o()){let t=n.#t;if(n.#c(),!Object.is(n.#t,t)){for(let t=0;t<r.length;t++){let n=r[t];n.#n||e.push(n)}for(let e=0;e<n.#i.length;e++)n.#i[e]()}}else{for(let t=0;t<r.length;t++){let n=r[t];n.#n||e.push(n)}if(n.#i.length){let e=n.#t,t=()=>{if(n.#e&&(n.#c(),!Object.is(n.#t,e)))for(let e=0;e<n.#i.length;e++)n.#i[e]()};o()?s(t):t()}}}}get targets(){return this.#a}deleteTarget(e){f(this.#a,e)}#c(){if(this.#r||!this.#e)return;this.#r=!0,this.#s=0;let e=this.#o.length,r=t;n(this);try{this.#t=this.#e()}finally{n(r);let t=this.#s;if(t<e){let n=this.#o;for(let r=t;r<e;r++){let e=n[r];e&&e.deleteTarget(this)}n.length=t}this.#n=!1,this.#r=!1}}};let g=e=>new h(e);function _(e){let t=g(()=>{e()}),n=t.subscribe(()=>{});return()=>{n(),t.dispose()}}let v=Symbol();function y(e){let t=new Map,n=e=>typeof e==`object`&&e&&v in e?e:typeof e==`object`&&e&&Object.getPrototypeOf(e)===Object.prototype?y(e):Array.isArray(e)?e.map(n):e,r=(e,r)=>{let i=t.get(e);return i||(i=new p(n(r)),t.set(e,i)),i};return new Proxy(e,{get(e,t){return typeof t==`symbol`?e[t]:r(t,e[t]).value},set(e,t,i){if(typeof t==`symbol`)return e[t]=i,!0;let a=n(i);return r(t,e[t]).value=a,e[t]=a,!0},has(e,t){return t===v||t in e}})}let b=e=>e instanceof p||e instanceof h;var x=class{s=0;tag=``;attr=``;parts=[];attrs=[];text=``;q=``;parseTemplate(e,t){for(let n=0;n<e.length;n++)this.parse(e[n],t),n<e.length-1&&this.slot(n,t);this.text&&=(t.onText(this.text),``)}parse(e,t){for(let n=0;n<e.length;n++){let r=e[n],i=e[n+1],a=e[n+2];if(this.s===0)r===`<`?(this.text&&=(t.onText(this.text),``),this.s=1):this.text+=r;else if(this.s===1)if(r===`/`)this.s=7;else if(r===`!`&&i===`-`&&a===`-`)n+=2,this.s=8;else if(r===`!`||r===`?`){for(;n<e.length&&e[n]!==`>`;)n++;this.s=0}else this.isA(r)?(this.tag=r,this.s=2):(this.text+=`<`+r,this.s=0);else if(this.s===2)this.isT(r)?this.tag+=r:this.isW(r)?this.s=3:r===`>`?this.emit(t,!1):r===`/`&&i===`>`&&(n++,this.emit(t,!0));else if(this.s===3){if(this.isW(r))continue;r===`>`?this.emit(t,!1):r===`/`&&i===`>`?(n++,this.emit(t,!0)):(this.attr=r,this.parts=[],this.s=4)}else if(this.s===4)this.isT(r)||r===`_`?this.attr+=r:r===`=`?this.s=5:this.isW(r)?(this.emitAttr(),this.s=3):r===`>`?(this.emitAttr(),this.emit(t,!1)):r===`/`&&i===`>`&&(this.emitAttr(),n++,this.emit(t,!0));else if(this.s===5)r===`"`||r===`'`?(this.q=r,this.s=6):this.isW(r)||(this.q=``,this.parts.push(r),this.s=6);else if(this.s===6)if(this.q?r===this.q:this.isW(r)||r===`>`||r===`/`)this.emitAttr(),this.q=``,this.s=3,r===`>`?this.emit(t,!1):r===`/`&&i===`>`&&(n++,this.emit(t,!0));else{let e=this.parts[this.parts.length-1];typeof e==`string`?this.parts[this.parts.length-1]=e+r:this.parts.push(r)}else this.s===7?r===`>`&&(t.onClose(),this.s=0):this.s===8&&r===`-`&&i===`-`&&a===`>`&&(n+=2,this.s=0)}}slot(e,t){this.s===5||this.s===6?(this.parts.push({index:e}),this.s===5&&(this.s=6)):(this.text&&=(t.onText(this.text),``),t.onSlot(e))}emit(e,t){e.onOpenTag(this.tag,this.attrs,t),this.tag=``,this.attrs=[],this.s=0}emitAttr(){this.attr&&this.attrs.push([this.attr,this.parts]),this.attr=``,this.parts=[]}isA(e){return e>=`a`&&e<=`z`||e>=`A`&&e<=`Z`}isT(e){return e>=`a`&&e<=`z`||e>=`A`&&e<=`Z`||e>=`0`&&e<=`9`||e===`-`||e===`:`}isW(e){return e<=` `&&e!==``}};let S=`http://www.w3.org/2000/svg`;function C(e,t){if(typeof e==`function`){let n=g(e);t(n.value);let r=n.subscribe(()=>t(n.value));return()=>{r(),n.dispose()}}if(b(e))return t(e.value),e.subscribe(()=>t(e.value));t(e)}var w=class{constructor(e,t){this.strings=e,this.values=t}render(){let e=document.createDocumentFragment(),t=[],n=[e],r=new x,i=this.values,a=(e,n,r)=>{let a=r[0];if(n[0]===`@`){if(a&&typeof a!=`string`){let r=i[a.index];e.addEventListener(n.slice(1),r),t.push(()=>e.removeEventListener(n.slice(1),r))}return}if(n[0]===`.`){if(a&&typeof a!=`string`){let r=C(i[a.index],t=>{e[n.slice(1)]=t});r&&t.push(r)}return}let o=[];for(let e of r)typeof e!=`string`&&o.push(e);if(!o.length){let t=r.join(``);(t||!r.length)&&e.setAttribute(n,t);return}let s=[];for(let e of o){let n=i[e.index];if(typeof n==`function`){let r=g(n);i[e.index]=r,s.push(r),t.push(()=>r.dispose())}else b(n)&&s.push(n)}let c=e=>{let t=i[e];return b(t)?t.value:t},l=()=>{if(r.length===1){let t=c(o[0].index);t==null||t===!1?e.removeAttribute(n):e.setAttribute(n,t===!0?``:String(t))}else e.setAttribute(n,r.map(e=>{if(typeof e==`string`)return e;let t=c(e.index);return t==null?``:String(t)}).join(``))};l();for(let e of s)t.push(e.subscribe(l))};return r.parseTemplate(this.strings,{onText:e=>{n.at(-1).append(e)},onOpenTag:(e,t,r)=>{let i=n.at(-1),o=e===`svg`||e===`SVG`||i instanceof Element&&i.namespaceURI===S?document.createElementNS(S,e):document.createElement(e);for(let[e,n]of t)a(o,e,n);i.appendChild(o),r||n.push(o)},onClose:()=>{n.length>1&&n.pop()},onSlot:e=>{let r=document.createComment(``);n.at(-1).appendChild(r),t.push(T(r,i[e]))}}),{fragment:e,dispose:()=>t.forEach(e=>e())}}};function T(e,t){let n=[],r=[],i=()=>{r.forEach(e=>e()),r=[],n.forEach(e=>e.parentNode?.removeChild(e)),n=[]};if(typeof t==`object`&&t&&D in t){let r=new Map,{list:i,keyFn:a,renderFn:o}=t,s=0,c=()=>{let t=e.parentNode,c=i.value,l=new Set,u=[];for(let e=0;e<c.length;e++){let t=c[e],n=a(t,e);if(l.has(n)){s++||console.warn(`Duplicate key:`,n);continue}l.add(n);let i=r.get(n);if(!i||i.item!==t){i&&(i.nodes.forEach(e=>e.parentNode?.removeChild(e)),i.dispose());let{fragment:e,dispose:a}=o(t).render();i={item:t,nodes:[...e.childNodes],dispose:a},r.set(n,i)}u.push(...i.nodes)}for(let[e,t]of r)l.has(e)||(t.nodes.forEach(e=>e.parentNode?.removeChild(e)),t.dispose(),r.delete(e));let d=e;for(let e=u.length-1;e>=0;e--){let n=u[e];n.nextSibling!==d&&t.insertBefore(n,d),d=n}n=u};c();let l=i.subscribe(c);return()=>{l();for(let e of r.values())e.dispose();r.clear(),n.forEach(e=>e.parentNode?.removeChild(e))}}let a=C(t,t=>{i();let a=e.parentNode;for(let i of Array.isArray(t)?t:[t])if(i instanceof w){let{fragment:t,dispose:o}=i.render();r.push(o),n.push(...t.childNodes),a.insertBefore(t,e)}else if(i!=null&&typeof i!=`boolean`){let t=document.createTextNode(String(i));n.push(t),a.insertBefore(t,e)}});return()=>{a?.(),i()}}let E=(e,...t)=>new w(e,t),D=Symbol();function O(e,t,n){let r=n?t:(e,t)=>e!==null&&(typeof e==`object`||typeof e==`function`)?e:t;return{[D]:!0,list:Array.isArray(e)?m(e):typeof e==`function`?g(e):e,keyFn:r,renderFn:n??t}}return e.batch=a,e.computed=g,e.each=O,e.effect=_,e.html=E,e.scope=u,e.signal=m,e.store=y,e})({});
|
|
3
2
|
//# sourceMappingURL=balises.iife.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"balises.iife.min.js","names":["context: Computed<unknown> | null","batchQueue: Set<Subscriber> | null","#value","#targets","#subs","#fn","#recompute","#dirty","#value","#subs","#sources","#sourceIndex","source","queue: Computed<unknown>[]","#targets","#computing","strings: TemplateStringsArray","values: unknown[]","disposers: (() => void)[]","stack: (Element | DocumentFragment)[]","nodes: Node[]","childDisposers: (() => void)[]","newNodes: Node[]","prevNode: Node","unsub"],"sources":["../src/signals/context.ts","../src/signals/signal.ts","../src/signals/computed.ts","../src/signals/effect.ts","../src/signals/store.ts","../src/signals/index.ts","../src/parser.ts","../src/template.ts"],"sourcesContent":["/**\n * Global state and batching for the reactive system.\n */\n\nimport type { Computed } from \"./computed.js\";\n\n/** Callback function for subscribers */\nexport type Subscriber = () => void;\n\n/** The currently executing computed (for dependency tracking) */\nexport let context: Computed<unknown> | null = null;\n\n/** Set the current execution context */\nexport function setContext(c: Computed<unknown> | null): void {\n context = c;\n}\n\n/** Batching: defer subscriber notifications until batch completes */\nlet batchDepth = 0;\nlet batchQueue: Set<Subscriber> | null = null;\n\n/**\n * Batch multiple signal updates into a single notification pass.\n * Subscribers are only notified after the batch function completes.\n */\nexport function batch<T>(fn: () => T): T {\n batchDepth++;\n if (batchDepth === 1) batchQueue = new Set();\n try {\n return fn();\n } finally {\n if (--batchDepth === 0) {\n const q = batchQueue!;\n batchQueue = null;\n for (const sub of q) sub();\n }\n }\n}\n\n/** Check if currently batching */\nexport function isBatching(): boolean {\n return batchDepth > 0;\n}\n\n/** Add a subscriber to the batch queue */\nexport function enqueueBatch(sub: Subscriber): void {\n batchQueue!.add(sub);\n}\n\n/** Add multiple subscribers to the batch queue */\nexport function enqueueBatchAll(subs: Subscriber[]): void {\n for (let i = 0; i < subs.length; i++) {\n batchQueue!.add(subs[i]!);\n }\n}\n","/**\n * Signal - A reactive value container.\n */\n\nimport type { Computed } from \"./computed.js\";\nimport {\n context,\n isBatching,\n enqueueBatchAll,\n type Subscriber,\n} from \"./context.js\";\n\n/**\n * Remove an item from an array using swap-and-pop (O(1) removal).\n */\nexport function removeFromArray<T>(array: T[], item: T): void {\n const i = array.indexOf(item);\n if (i >= 0) {\n array[i] = array[array.length - 1]!;\n array.pop();\n }\n}\n\n/**\n * A reactive value container. When the value changes, all dependent\n * computeds are marked dirty and subscribers are notified.\n *\n * Uses Object.is() for equality checks to correctly handle NaN values.\n */\nexport class Signal<T> {\n #value: T;\n #subs: Subscriber[] = [];\n #targets: Computed<unknown>[] = [];\n\n constructor(value: T) {\n this.#value = value;\n }\n\n get value(): T {\n if (context) context.trackSource(this);\n return this.#value;\n }\n\n set value(v: T) {\n if (Object.is(this.#value, v)) return;\n this.#value = v;\n\n // Mark all dependent computeds as dirty\n const targets = this.#targets;\n for (let i = 0; i < targets.length; i++) {\n targets[i]!.markDirty();\n }\n\n // Notify subscribers\n if (this.#subs.length) {\n if (isBatching()) {\n enqueueBatchAll(this.#subs);\n } else {\n for (let i = 0; i < this.#subs.length; i++) this.#subs[i]!();\n }\n }\n }\n\n subscribe(fn: Subscriber): () => void {\n this.#subs.push(fn);\n return () => removeFromArray(this.#subs, fn);\n }\n\n /**\n * Update the signal value using an updater function.\n *\n * @param fn - Function that receives current value and returns new value\n *\n * @example\n * const count = signal(0);\n * count.update(n => n + 1); // increment\n */\n update(fn: (current: T) => T): void {\n this.value = fn(this.#value);\n }\n\n /** @internal */\n get targets(): Computed<unknown>[] {\n return this.#targets;\n }\n\n /** @internal */\n deleteTarget(target: Computed<unknown>): void {\n removeFromArray(this.#targets, target);\n }\n}\n\n/** Create a new signal with the given initial value. */\nexport const signal = <T>(value: T) => new Signal(value);\n","/**\n * Computed - A derived reactive value.\n */\n\nimport { Signal, removeFromArray } from \"./signal.js\";\nimport {\n context,\n setContext,\n isBatching,\n enqueueBatch,\n type Subscriber,\n} from \"./context.js\";\n\n/**\n * A derived reactive value. Automatically tracks dependencies and\n * recomputes when any dependency changes.\n *\n * Uses Object.is() for equality checks to correctly handle NaN values.\n */\nexport class Computed<T> {\n #fn: (() => T) | undefined;\n #value: T | undefined;\n #dirty = true;\n #computing = false;\n #subs: Subscriber[] = [];\n #targets: Computed<unknown>[] = [];\n #sources: (Signal<unknown> | Computed<unknown>)[] = [];\n #sourceIndex = 0;\n\n constructor(fn: () => T) {\n this.#fn = fn;\n this.#recompute();\n }\n\n get value(): T {\n if (this.#dirty) this.#recompute();\n if (context && context !== this) context.trackSource(this);\n return this.#value as T;\n }\n\n subscribe(fn: Subscriber): () => void {\n this.#subs.push(fn);\n return () => removeFromArray(this.#subs, fn);\n }\n\n dispose(): void {\n this.#fn = undefined;\n const sources = this.#sources;\n for (let i = 0; i < sources.length; i++) {\n const source = sources[i];\n if (source) source.deleteTarget(this);\n }\n this.#sources = [];\n this.#subs.length = 0;\n }\n\n /**\n * Called by sources when accessed during recompute.\n * @internal\n */\n trackSource(source: Signal<unknown> | Computed<unknown>): void {\n const sources = this.#sources;\n const idx = this.#sourceIndex++;\n\n if (idx < sources.length) {\n if (sources[idx] === source) {\n // Same source at same position - nothing to do\n return;\n }\n // Different source - unlink old ones from this position\n for (let i = idx; i < sources.length; i++) {\n const source = sources[i];\n if (source) source.deleteTarget(this);\n }\n sources.length = idx;\n }\n // Add new source\n sources.push(source);\n source.targets.push(this);\n }\n\n /**\n * Mark this computed and all its dependents as dirty.\n * @internal\n */\n markDirty(): void {\n if (this.#dirty) return;\n\n const queue: Computed<unknown>[] = [this];\n for (let i = 0; i < queue.length; i++) {\n const c = queue[i]!;\n if (c.#dirty) continue;\n c.#dirty = true;\n\n const targets = c.#targets;\n\n // Short-circuit optimization: if this computed has both subscribers AND downstream dependents,\n // eagerly recompute to check if the value actually changed before propagating.\n // Only do this outside of batching to avoid intermediate/inconsistent state.\n if (c.#subs.length > 0 && targets.length > 0 && c.#fn && !isBatching()) {\n const old = c.#value;\n c.#recompute();\n const valueChanged = !Object.is(c.#value, old);\n\n // Only propagate dirty flag to targets if value actually changed\n if (valueChanged) {\n for (let j = 0; j < targets.length; j++) {\n const target = targets[j]!;\n if (!target.#dirty) queue.push(target);\n }\n\n // Notify subscribers since value changed (we're not batching here)\n for (let j = 0; j < c.#subs.length; j++) c.#subs[j]!();\n }\n // If value didn't change, don't propagate or notify\n } else {\n // No short-circuiting needed - use original behavior\n for (let j = 0; j < targets.length; j++) {\n const target = targets[j]!;\n if (!target.#dirty) queue.push(target);\n }\n\n if (c.#subs.length) {\n const old = c.#value;\n const notify = () => {\n if (c.#fn) {\n c.#recompute();\n if (!Object.is(c.#value, old)) {\n for (let j = 0; j < c.#subs.length; j++) c.#subs[j]!();\n }\n }\n };\n if (isBatching()) {\n enqueueBatch(notify);\n } else {\n notify();\n }\n }\n }\n }\n }\n\n /** @internal */\n get targets(): Computed<unknown>[] {\n return this.#targets;\n }\n\n /** @internal */\n deleteTarget(target: Computed<unknown>): void {\n removeFromArray(this.#targets, target);\n }\n\n #recompute(): void {\n if (this.#computing || !this.#fn) return;\n this.#computing = true;\n\n this.#sourceIndex = 0;\n const prevLen = this.#sources.length;\n\n const prev = context;\n setContext(this);\n try {\n this.#value = this.#fn();\n } finally {\n setContext(prev);\n\n // Unlink removed sources\n const newLen = this.#sourceIndex;\n if (newLen < prevLen) {\n const sources = this.#sources;\n for (let i = newLen; i < prevLen; i++) {\n const source = sources[i];\n if (source) source.deleteTarget(this);\n }\n sources.length = newLen;\n }\n\n this.#dirty = false;\n this.#computing = false;\n }\n }\n}\n\n/** Create a new computed from the given function. */\nexport const computed = <T>(fn: () => T) => new Computed(fn);\n","/**\n * Effect - Run side effects reactively.\n */\n\nimport { computed } from \"./computed.js\";\n\n/**\n * Create a reactive effect that automatically tracks dependencies\n * and re-runs when they change.\n *\n * @param fn - The effect function to run\n * @returns A dispose function to stop the effect\n *\n * @example\n * const count = signal(0);\n * const dispose = effect(() => {\n * console.log(\"Count is:\", count.value);\n * });\n *\n * count.value = 1; // logs: \"Count is: 1\"\n * dispose(); // stop the effect\n */\nexport function effect(fn: () => void): () => void {\n const c = computed(() => {\n fn();\n return undefined;\n });\n\n // Subscribe to make it reactive (rerun on dependency changes)\n const unsub = c.subscribe(() => {});\n\n return () => {\n unsub();\n c.dispose();\n };\n}\n","/**\n * Store - Reactive wrapper for plain objects.\n */\n\nimport { Signal } from \"./signal.js\";\n\nconst STORE = Symbol();\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n value !== null &&\n typeof value === \"object\" &&\n Object.getPrototypeOf(value) === Object.prototype;\n\n/**\n * Create a reactive store from a plain object.\n * Each property becomes a signal, and nested objects are recursively wrapped.\n */\nexport function store<T extends object>(obj: T): T {\n const signals = new Map<string | symbol, Signal<unknown>>();\n\n /** Recursively wrap nested objects and arrays */\n const wrap = (value: unknown): unknown => {\n if (value !== null && typeof value === \"object\" && STORE in value) {\n return value; // Already a store\n }\n if (isPlainObject(value)) {\n return store(value);\n }\n if (Array.isArray(value)) {\n return value.map(wrap);\n }\n return value;\n };\n\n /** Get or create a signal for a property */\n const getSignal = (key: string | symbol, initialValue: unknown) => {\n let sig = signals.get(key);\n if (!sig) {\n sig = new Signal(wrap(initialValue));\n signals.set(key, sig);\n }\n return sig;\n };\n\n return new Proxy(obj, {\n get(target, key) {\n // Allow symbol access (for STORE check and other internal symbols)\n if (typeof key === \"symbol\") {\n return target[key as keyof T];\n }\n return getSignal(key, target[key as keyof T]).value;\n },\n\n set(target, key, value) {\n if (typeof key === \"symbol\") {\n target[key as keyof T] = value;\n return true;\n }\n const wrapped = wrap(value);\n getSignal(key, target[key as keyof T]).value = wrapped;\n target[key as keyof T] = wrapped as T[keyof T];\n return true;\n },\n\n has(target, key) {\n return key === STORE || key in target;\n },\n });\n}\n","/**\n * Reactive signals with automatic dependency tracking.\n *\n * Uses index-based tracking: computed functions are assumed to access\n * their dependencies in the same order on each run. This enables O(1)\n * dependency checks without complex linked-list structures.\n */\n\nexport { Signal, signal } from \"./signal.js\";\nexport { Computed, computed } from \"./computed.js\";\nexport { effect } from \"./effect.js\";\nexport { store } from \"./store.js\";\nexport { batch, type Subscriber } from \"./context.js\";\n\nimport { Signal } from \"./signal.js\";\nimport { Computed } from \"./computed.js\";\n\n/** Common interface for reactive values (Signal or Computed). */\nexport interface Reactive<T> {\n readonly value: T;\n subscribe(fn: () => void): () => void;\n}\n\n/** Check if a value is a reactive signal or computed. */\nexport const isSignal = (value: unknown): value is Reactive<unknown> =>\n value instanceof Signal || value instanceof Computed;\n","/**\n * Streaming HTML parser for template literals.\n * State machine: Text=0, TagOpen=1, TagName=2, InTag=3, AttrName=4, AttrEq=5, AttrVal=6, CloseTag=7, Comment=8\n */\n\nexport type AttrPart = string | { index: number };\n\nexport interface ParseCallbacks {\n onText: (text: string) => void;\n onElement: (el: Element, selfClosing: boolean) => void;\n onClose: () => void;\n onAttribute: (el: Element, name: string, parts: AttrPart[]) => void;\n onSlot: (index: number) => void;\n}\n\nexport class HTMLParser {\n private s = 0; // state\n private el: Element | null = null;\n private tag = \"\";\n private attr = \"\";\n private parts: AttrPart[] = [];\n private text = \"\";\n private q = \"\";\n\n parseTemplate(strings: TemplateStringsArray, cb: ParseCallbacks) {\n for (let i = 0; i < strings.length; i++) {\n this.parse(strings[i]!, cb);\n if (i < strings.length - 1) this.slot(i, cb);\n }\n if (this.text) {\n cb.onText(this.text);\n this.text = \"\";\n }\n }\n\n private parse(str: string, cb: ParseCallbacks) {\n for (let i = 0; i < str.length; i++) {\n const ch = str[i]!,\n nx = str[i + 1],\n n2 = str[i + 2];\n\n if (this.s === 0) {\n // Text\n if (ch === \"<\") {\n if (this.text) {\n cb.onText(this.text);\n this.text = \"\";\n }\n this.s = 1;\n } else this.text += ch;\n } else if (this.s === 1) {\n // TagOpen\n if (ch === \"/\") this.s = 7;\n else if (ch === \"!\" && nx === \"-\" && n2 === \"-\") {\n i += 2;\n this.s = 8;\n } else if (ch === \"!\" || ch === \"?\") {\n while (i < str.length && str[i] !== \">\") i++;\n this.s = 0;\n } else if (this.isA(ch)) {\n this.tag = ch;\n this.s = 2;\n } else {\n this.text += \"<\" + ch;\n this.s = 0;\n }\n } else if (this.s === 2) {\n // TagName\n if (this.isT(ch)) this.tag += ch;\n else if (this.isW(ch)) {\n this.el = document.createElement(this.tag);\n this.tag = \"\";\n this.s = 3;\n } else if (ch === \">\") {\n this.el = document.createElement(this.tag);\n this.tag = \"\";\n this.emit(cb, false);\n } else if (ch === \"/\" && nx === \">\") {\n this.el = document.createElement(this.tag);\n this.tag = \"\";\n i++;\n this.emit(cb, true);\n }\n } else if (this.s === 3) {\n // InTag\n if (this.isW(ch)) continue;\n if (ch === \">\") this.emit(cb, false);\n else if (ch === \"/\" && nx === \">\") {\n i++;\n this.emit(cb, true);\n } else {\n this.attr = ch;\n this.parts = [];\n this.s = 4;\n }\n } else if (this.s === 4) {\n // AttrName\n if (this.isT(ch) || ch === \"_\") this.attr += ch;\n else if (ch === \"=\") this.s = 5;\n else if (this.isW(ch)) {\n this.emitAttr(cb);\n this.s = 3;\n } else if (ch === \">\") {\n this.emitAttr(cb);\n this.emit(cb, false);\n } else if (ch === \"/\" && nx === \">\") {\n this.emitAttr(cb);\n i++;\n this.emit(cb, true);\n }\n } else if (this.s === 5) {\n // AttrEq\n if (ch === '\"' || ch === \"'\") {\n this.q = ch;\n this.s = 6;\n } else if (!this.isW(ch)) {\n this.q = \"\";\n this.parts.push(ch);\n this.s = 6;\n }\n } else if (this.s === 6) {\n // AttrVal\n const end = this.q\n ? ch === this.q\n : this.isW(ch) || ch === \">\" || ch === \"/\";\n if (end) {\n this.emitAttr(cb);\n this.q = \"\";\n this.s = 3;\n if (ch === \">\") this.emit(cb, false);\n else if (ch === \"/\" && nx === \">\") {\n i++;\n this.emit(cb, true);\n }\n } else {\n const last = this.parts[this.parts.length - 1];\n if (typeof last === \"string\")\n this.parts[this.parts.length - 1] = last + ch;\n else this.parts.push(ch);\n }\n } else if (this.s === 7) {\n // CloseTag\n if (ch === \">\") {\n cb.onClose();\n this.s = 0;\n }\n } else if (this.s === 8) {\n // Comment\n if (ch === \"-\" && nx === \"-\" && n2 === \">\") {\n i += 2;\n this.s = 0;\n }\n }\n }\n }\n\n private slot(index: number, cb: ParseCallbacks) {\n if (this.s === 5 || this.s === 6) {\n this.parts.push({ index });\n if (this.s === 5) this.s = 6;\n } else {\n if (this.text) {\n cb.onText(this.text);\n this.text = \"\";\n }\n cb.onSlot(index);\n }\n }\n\n private emit(cb: ParseCallbacks, self: boolean) {\n cb.onElement(this.el!, self);\n this.el = null;\n this.s = 0;\n }\n\n private emitAttr(cb: ParseCallbacks) {\n if (this.el && this.attr) cb.onAttribute(this.el, this.attr, this.parts);\n this.attr = \"\";\n this.parts = [];\n }\n\n private isA(c: string) {\n return (c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\");\n }\n private isT(c: string) {\n return this.isA(c) || (c >= \"0\" && c <= \"9\") || c === \"-\" || c === \":\";\n }\n private isW(c: string) {\n return c === \" \" || c === \"\\t\" || c === \"\\n\" || c === \"\\r\";\n }\n}\n","/**\n * HTML template rendering with reactive bindings.\n *\n * Uses tagged template literals to create reactive DOM:\n * - Text interpolation: ${value} or ${signal}\n * - Attribute binding: class=\"${signal}\" (reactive)\n * - Event binding: @click=${handler}\n * - Property binding: .value=${signal} (sets DOM property, not attribute)\n * - Nested templates: ${html`<span>...</span>`}\n * - Arrays: ${items.map(i => html`<li>${i}</li>`)}\n */\n\nimport { computed, isSignal, signal, type Reactive } from \"./signals/index.js\";\nimport { HTMLParser } from \"./parser.js\";\n\n/**\n * Bind a value to an update function.\n * If reactive, subscribes and returns unsubscribe. Otherwise returns null.\n */\nfunction bind(\n value: unknown,\n update: (v: unknown) => void,\n): (() => void) | null {\n if (isSignal(value)) {\n update(value.value);\n return value.subscribe(() => update((value as Reactive<unknown>).value));\n }\n update(value);\n return null;\n}\n\n/** A parsed HTML template. Call render() to create live DOM. */\nexport class Template {\n constructor(\n private strings: TemplateStringsArray,\n private values: unknown[],\n ) {}\n\n /**\n * Parse template and create live DOM.\n * Returns the fragment and a dispose function to clean up subscriptions.\n */\n render(): { fragment: DocumentFragment; dispose: () => void } {\n const fragment = document.createDocumentFragment();\n const disposers: (() => void)[] = [];\n const stack: (Element | DocumentFragment)[] = [fragment];\n const parser = new HTMLParser();\n const values = this.values;\n\n parser.parseTemplate(this.strings, {\n onText: (text) => {\n stack.at(-1)!.appendChild(document.createTextNode(text));\n },\n\n onElement: (el, selfClosing) => {\n stack.at(-1)!.appendChild(el);\n if (!selfClosing) stack.push(el);\n },\n\n onClose: () => {\n if (stack.length > 1) stack.pop();\n },\n\n onAttribute: (el, name, parts) => {\n const prefix = name[0];\n\n // Event binding: @click=${handler}\n if (prefix === \"@\") {\n const event = name.slice(1);\n const part = parts[0];\n if (part && typeof part !== \"string\") {\n const handler = values[part.index] as EventListener;\n el.addEventListener(event, handler);\n disposers.push(() => el.removeEventListener(event, handler));\n }\n return;\n }\n\n // Property binding: .value=${data} - sets DOM property directly\n if (prefix === \".\") {\n const prop = name.slice(1);\n const part = parts[0];\n if (part && typeof part !== \"string\") {\n const unsub = bind(values[part.index], (v) => {\n (el as unknown as Record<string, unknown>)[prop] = v;\n });\n if (unsub) disposers.push(unsub);\n }\n return;\n }\n\n // Static attribute (all parts are strings)\n if (parts.every((p) => typeof p === \"string\")) {\n const value = parts.join(\"\");\n if (value || parts.length === 0) {\n el.setAttribute(name, value);\n }\n return;\n }\n\n // Dynamic attribute - has at least one interpolated value\n const dynamicParts = parts.filter(\n (p): p is { index: number } => typeof p !== \"string\",\n );\n const signals = dynamicParts\n .map((p) => values[p.index])\n .filter(isSignal) as Reactive<unknown>[];\n\n // Single dynamic with no static parts: handle null/false as removal\n const isSingleDynamic =\n parts.length === 1 && typeof parts[0] !== \"string\";\n\n const update = () => {\n if (isSingleDynamic) {\n // Boolean/null handling: false/null removes, true sets empty string\n const v = values[dynamicParts[0]!.index];\n const val = isSignal(v) ? (v as Reactive<unknown>).value : v;\n if (val == null || val === false) el.removeAttribute(name);\n else el.setAttribute(name, val === true ? \"\" : String(val));\n } else {\n // Multi-part: concatenate all parts\n const resolved = parts\n .map((p) => {\n if (typeof p === \"string\") return p;\n const v = values[p.index];\n const val = isSignal(v) ? (v as Reactive<unknown>).value : v;\n return val == null ? \"\" : String(val);\n })\n .join(\"\");\n el.setAttribute(name, resolved);\n }\n };\n\n update();\n signals.forEach((s) => disposers.push(s.subscribe(update)));\n },\n\n onSlot: (index) => {\n // Marker comment anchors dynamic content\n const marker = document.createComment(\"\");\n stack.at(-1)!.appendChild(marker);\n disposers.push(bindContent(marker, values[index]));\n },\n });\n\n return { fragment, dispose: () => disposers.forEach((d) => d()) };\n }\n}\n\n/** Cached entry for a keyed list item */\ninterface EachEntry {\n item: unknown;\n nodes: Node[];\n dispose: () => void;\n}\n\n/**\n * Bind dynamic content at a marker position.\n * Handles primitives (as text), Templates (rendered), Each (keyed lists), and arrays.\n * null/undefined/boolean render nothing (enables conditional: ${cond && html`...`})\n */\nfunction bindContent(marker: Comment, value: unknown): () => void {\n let nodes: Node[] = [];\n let childDisposers: (() => void)[] = [];\n\n const clear = () => {\n childDisposers.forEach((d) => d());\n childDisposers = [];\n nodes.forEach((n) => n.parentNode?.removeChild(n));\n nodes = [];\n };\n\n // Handle each() - keyed list for efficient list rendering\n if (isEach(value)) {\n const cache = new Map<unknown, EachEntry>();\n const { list, keyFn, renderFn } = value;\n let warnedDuplicate = false;\n\n const updateList = () => {\n const parent = marker.parentNode!;\n const items = list.value;\n const newKeys = new Set<unknown>();\n const newNodes: Node[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i]!;\n const key = keyFn(item, i);\n\n if (newKeys.has(key)) {\n if (!warnedDuplicate) {\n warnedDuplicate = true;\n console.warn(\n `[balises] Duplicate key in each(): ${String(key)}. ` +\n `Each item should have a unique key. Consider providing a keyFn.`,\n );\n }\n continue; // Skip duplicate\n }\n newKeys.add(key);\n\n let entry = cache.get(key);\n if (!entry || entry.item !== item) {\n // First time seeing this key, or item at this key changed → render template\n if (entry) {\n // Dispose old entry for this key\n entry.nodes.forEach((n) => n.parentNode?.removeChild(n));\n entry.dispose();\n }\n const { fragment, dispose } = renderFn(item).render();\n entry = { item, nodes: [...fragment.childNodes], dispose };\n cache.set(key, entry);\n }\n newNodes.push(...entry.nodes);\n }\n\n // Remove nodes for deleted keys\n for (const [key, entry] of cache) {\n if (!newKeys.has(key)) {\n entry.nodes.forEach((n) => n.parentNode?.removeChild(n));\n entry.dispose();\n cache.delete(key);\n }\n }\n\n // Reorder/insert nodes in correct order\n let prevNode: Node = marker;\n for (let i = newNodes.length - 1; i >= 0; i--) {\n const node = newNodes[i]!;\n if (node.nextSibling !== prevNode) {\n parent.insertBefore(node, prevNode);\n }\n prevNode = node;\n }\n\n nodes = newNodes;\n };\n\n updateList();\n const unsub = list.subscribe(updateList);\n\n return () => {\n unsub();\n for (const entry of cache.values()) {\n entry.dispose();\n }\n cache.clear();\n nodes.forEach((n) => n.parentNode?.removeChild(n));\n };\n }\n\n const update = (v: unknown) => {\n clear();\n const parent = marker.parentNode!;\n\n for (const item of Array.isArray(v) ? v : [v]) {\n if (item instanceof Template) {\n const { fragment, dispose } = item.render();\n childDisposers.push(dispose);\n nodes.push(...fragment.childNodes);\n parent.insertBefore(fragment, marker);\n } else if (item != null && typeof item !== \"boolean\") {\n const node = document.createTextNode(String(item));\n nodes.push(node);\n parent.insertBefore(node, marker);\n }\n }\n };\n\n const unsub = bind(value, update);\n return () => {\n unsub?.();\n clear();\n };\n}\n\n/** Tagged template literal for creating reactive HTML templates */\nexport const html = (strings: TemplateStringsArray, ...values: unknown[]) =>\n new Template(strings, values);\n\n/** Marker symbol for keyed list objects */\nconst EACH = Symbol();\n\n/** Keyed list descriptor */\ninterface EachDescriptor<T> {\n [EACH]: true;\n list: Reactive<T[]>;\n keyFn: (item: T, index: number) => unknown;\n renderFn: (item: T) => Template;\n}\n\n/** Type guard for Each descriptor */\nconst isEach = (v: unknown): v is EachDescriptor<unknown> =>\n v != null && typeof v === \"object\" && EACH in v;\n\n/** List input type - accepts arrays, reactive arrays, or getter functions */\ntype ListInput<T> = T[] | Reactive<T[]> | (() => T[]);\n\n/** Normalize list input to a reactive signal */\nfunction toReactiveList<T>(list: ListInput<T>): Reactive<T[]> {\n if (Array.isArray(list)) return signal(list);\n if (typeof list === \"function\") return computed(list);\n return list;\n}\n\n/**\n * Efficient keyed list rendering.\n *\n * Caches templates by key, only re-rendering when items are added/removed.\n * For content updates within items, use nested signals:\n *\n * ```ts\n * const items = signal([\n * { id: 1, name: signal(\"Alice\") },\n * { id: 2, name: signal(\"Bob\") },\n * ]);\n *\n * // With explicit key (recommended when items may have same reference after re-fetch)\n * html`<ul>${each(items, i => i.id, i => html`<li>${i.name}</li>`)}</ul>`\n *\n * // Without key (uses object reference for objects, index for primitives)\n * html`<ul>${each(items, i => html`<li>${i.name}</li>`)}</ul>`\n *\n * // With getter function (useful with stores)\n * html`<ul>${each(() => state.items, i => html`<li>${i.name}</li>`)}</ul>`\n *\n * // With plain array (static, won't react to changes)\n * html`<ul>${each([\"a\", \"b\", \"c\"], i => html`<li>${i}</li>`)}</ul>`\n * ```\n */\nexport function each<T>(\n list: ListInput<T>,\n renderFn: (item: T) => Template,\n): EachDescriptor<T>;\nexport function each<T>(\n list: ListInput<T>,\n keyFn: (item: T, index: number) => unknown,\n renderFn: (item: T) => Template,\n): EachDescriptor<T>;\nexport function each<T>(\n list: ListInput<T>,\n keyFnOrRenderFn:\n | ((item: T, index: number) => unknown)\n | ((item: T) => Template),\n renderFn?: (item: T) => Template,\n): EachDescriptor<T> {\n const reactiveList = toReactiveList(list);\n\n if (renderFn === undefined) {\n // Two-arg form: each(list, renderFn)\n // Use object reference for objects, index for primitives\n return {\n [EACH]: true,\n list: reactiveList,\n keyFn: (item, index) =>\n item !== null &&\n (typeof item === \"object\" || typeof item === \"function\")\n ? item\n : index,\n renderFn: keyFnOrRenderFn as (item: T) => Template,\n };\n }\n // Three-arg form: each(list, keyFn, renderFn)\n return {\n [EACH]: true,\n list: reactiveList,\n keyFn: keyFnOrRenderFn as (item: T, index: number) => unknown,\n renderFn,\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"balises.iife.min.js","names":["context: Computed<unknown> | null","batchQueue: Set<Subscriber> | null","disposalStack: Array<Array<() => void>> | null","disposers: Array<() => void>","#value","#targets","#subs","#fn","#recompute","#dirty","#value","#subs","#sources","#sourceIndex","source","queue: Computed<unknown>[]","#targets","#computing","strings: TemplateStringsArray","values: unknown[]","disposers: (() => void)[]","stack: (Element | DocumentFragment)[]","dynParts: { index: number }[]","reactives: Reactive<unknown>[]","nodes: Node[]","childDisposers: (() => void)[]","newNodes: Node[]","prevNode: Node","unsub"],"sources":["../src/signals/context.ts","../src/signals/signal.ts","../src/signals/computed.ts","../src/signals/effect.ts","../src/signals/store.ts","../src/signals/index.ts","../src/parser.ts","../src/template.ts"],"sourcesContent":["/**\n * Global state and batching for the reactive system.\n */\n\nimport type { Computed } from \"./computed.js\";\n\n/** Callback function for subscribers */\nexport type Subscriber = () => void;\n\n/** The currently executing computed (for dependency tracking) */\nexport let context: Computed<unknown> | null = null;\n\n/** Set the current execution context */\nexport function setContext(c: Computed<unknown> | null): void {\n context = c;\n}\n\n/** Batching: defer subscriber notifications until batch completes */\nlet batchDepth = 0;\nlet batchQueue: Set<Subscriber> | null = null;\n\n/**\n * Batch multiple signal updates into a single notification pass.\n * Subscribers are only notified after the batch function completes.\n */\nexport function batch<T>(fn: () => T): T {\n batchDepth++;\n if (batchDepth === 1) batchQueue = new Set();\n try {\n return fn();\n } finally {\n if (--batchDepth === 0) {\n const q = batchQueue!;\n batchQueue = null;\n for (const sub of q) sub();\n }\n }\n}\n\n/** Check if currently batching */\nexport function isBatching(): boolean {\n return batchDepth > 0;\n}\n\n/** Add a subscriber to the batch queue */\nexport function enqueueBatchOne(sub: Subscriber): void {\n batchQueue!.add(sub);\n}\n\n/** Add multiple subscribers to the batch queue */\nexport function enqueueBatchAll(subs: Subscriber[]): void {\n for (let i = 0; i < subs.length; i++) batchQueue!.add(subs[i]!);\n}\n\n/** Scope disposal: collect all disposers in a scope */\nlet disposalStack: Array<Array<() => void>> | null = null;\n\n/**\n * Create a disposal scope that collects all subscriptions and computeds created within.\n * Returns the result of the function and a dispose function that cleans up all resources.\n *\n * @example\n * ```ts\n * const [result, dispose] = scope(() => {\n * const count = signal(0);\n * const doubled = computed(() => count.value * 2);\n * effect(() => console.log(doubled.value));\n * return { count, doubled };\n * });\n *\n * // Later: clean up all subscriptions and computeds\n * dispose();\n * ```\n */\nexport function scope<T>(fn: () => T): [result: T, dispose: () => void] {\n const disposers: Array<() => void> = [];\n\n // Push new disposal context\n if (!disposalStack) disposalStack = [];\n disposalStack.push(disposers);\n\n try {\n const result = fn();\n return [\n result,\n () => {\n for (let i = disposers.length - 1; i >= 0; i--) {\n disposers[i]!();\n }\n disposers.length = 0;\n },\n ];\n } finally {\n // Pop disposal context\n disposalStack.pop();\n if (disposalStack.length === 0) disposalStack = null;\n }\n}\n\n/**\n * Register a disposer in the current scope (if any).\n * This is called internally by computed/effect when they create cleanup functions.\n */\nexport function registerDisposer(dispose: () => void): void {\n disposalStack?.at(-1)?.push(dispose);\n}\n","/**\n * Signal - A reactive value container.\n */\n\nimport type { Computed } from \"./computed.js\";\nimport {\n context,\n isBatching,\n enqueueBatchAll,\n type Subscriber,\n} from \"./context.js\";\n\n/**\n * Remove an item from an array using swap-and-pop (O(1) removal).\n */\nexport function removeFromArray<T>(array: T[], item: T): void {\n const i = array.indexOf(item);\n if (i >= 0) {\n array[i] = array[array.length - 1]!;\n array.pop();\n }\n}\n\n/**\n * A reactive value container. When the value changes, all dependent\n * computeds are marked dirty and subscribers are notified.\n *\n * Uses Object.is() for equality checks to correctly handle NaN values.\n */\nexport class Signal<T> {\n #value: T;\n #subs: Subscriber[] = [];\n #targets: Computed<unknown>[] = [];\n\n constructor(value: T) {\n this.#value = value;\n }\n\n get value(): T {\n if (context) context.trackSource(this);\n return this.#value;\n }\n\n set value(v: T) {\n if (Object.is(this.#value, v)) return;\n this.#value = v;\n\n // Mark all dependent computeds as dirty\n const targets = this.#targets;\n for (let i = 0; i < targets.length; i++) {\n targets[i]!.markDirty();\n }\n\n // Notify subscribers\n if (this.#subs.length) {\n if (isBatching()) {\n enqueueBatchAll(this.#subs);\n } else {\n for (let i = 0; i < this.#subs.length; i++) this.#subs[i]!();\n }\n }\n }\n\n subscribe(fn: Subscriber): () => void {\n this.#subs.push(fn);\n return () => removeFromArray(this.#subs, fn);\n }\n\n /**\n * Update the signal value using an updater function.\n *\n * @param fn - Function that receives current value and returns new value\n *\n * @example\n * const count = signal(0);\n * count.update(n => n + 1); // increment\n */\n update(fn: (current: T) => T): void {\n this.value = fn(this.#value);\n }\n\n /** @internal */\n get targets(): Computed<unknown>[] {\n return this.#targets;\n }\n\n /** @internal */\n deleteTarget(target: Computed<unknown>): void {\n removeFromArray(this.#targets, target);\n }\n}\n\n/** Create a new signal with the given initial value. */\nexport const signal = <T>(value: T) => new Signal(value);\n","/**\n * Computed - A derived reactive value.\n */\n\nimport { Signal, removeFromArray } from \"./signal.js\";\nimport {\n context,\n setContext,\n isBatching,\n enqueueBatchOne,\n registerDisposer,\n type Subscriber,\n} from \"./context.js\";\n\n/**\n * A derived reactive value. Automatically tracks dependencies and\n * recomputes when any dependency changes.\n *\n * Uses Object.is() for equality checks to correctly handle NaN values.\n */\nexport class Computed<T> {\n #fn: (() => T) | undefined;\n #value: T | undefined;\n #dirty = true;\n #computing = false;\n #subs: Subscriber[] = [];\n #targets: Computed<unknown>[] = [];\n #sources: (Signal<unknown> | Computed<unknown>)[] = [];\n #sourceIndex = 0;\n\n constructor(fn: () => T) {\n this.#fn = fn;\n this.#recompute();\n\n // Auto-register disposal in current root scope\n registerDisposer(() => this.dispose());\n }\n\n get value(): T {\n if (this.#dirty) this.#recompute();\n if (context && context !== this) context.trackSource(this);\n return this.#value as T;\n }\n\n subscribe(fn: Subscriber): () => void {\n this.#subs.push(fn);\n return () => removeFromArray(this.#subs, fn);\n }\n\n dispose(): void {\n this.#fn = undefined;\n const sources = this.#sources;\n for (let i = 0; i < sources.length; i++) {\n const source = sources[i];\n if (source) source.deleteTarget(this);\n }\n this.#sources = [];\n this.#subs.length = 0;\n }\n\n /**\n * Called by sources when accessed during recompute.\n * @internal\n */\n trackSource(source: Signal<unknown> | Computed<unknown>): void {\n const sources = this.#sources;\n const idx = this.#sourceIndex++;\n\n if (idx < sources.length) {\n if (sources[idx] === source) {\n // Same source at same position - nothing to do\n return;\n }\n // Different source - unlink old ones from this position\n for (let i = idx; i < sources.length; i++) {\n const source = sources[i];\n if (source) source.deleteTarget(this);\n }\n sources.length = idx;\n }\n // Add new source\n sources.push(source);\n source.targets.push(this);\n }\n\n /**\n * Mark this computed and all its dependents as dirty.\n * @internal\n */\n markDirty(): void {\n if (this.#dirty) return;\n\n const queue: Computed<unknown>[] = [this];\n for (let i = 0; i < queue.length; i++) {\n const c = queue[i]!;\n if (c.#dirty) continue;\n c.#dirty = true;\n\n const targets = c.#targets;\n\n // Short-circuit: if subs + targets + not batching, eagerly check if value changed\n if (c.#subs.length > 0 && targets.length > 0 && c.#fn && !isBatching()) {\n const old = c.#value;\n c.#recompute();\n if (!Object.is(c.#value, old)) {\n for (let j = 0; j < targets.length; j++) {\n const t = targets[j]!;\n if (!t.#dirty) queue.push(t);\n }\n for (let j = 0; j < c.#subs.length; j++) c.#subs[j]!();\n }\n } else {\n for (let j = 0; j < targets.length; j++) {\n const t = targets[j]!;\n if (!t.#dirty) queue.push(t);\n }\n if (c.#subs.length) {\n const old = c.#value;\n const notify = () => {\n if (c.#fn) {\n c.#recompute();\n if (!Object.is(c.#value, old)) {\n for (let j = 0; j < c.#subs.length; j++) c.#subs[j]!();\n }\n }\n };\n void (isBatching() ? enqueueBatchOne(notify) : notify());\n }\n }\n }\n }\n\n /** @internal */\n get targets(): Computed<unknown>[] {\n return this.#targets;\n }\n\n /** @internal */\n deleteTarget(target: Computed<unknown>): void {\n removeFromArray(this.#targets, target);\n }\n\n #recompute(): void {\n if (this.#computing || !this.#fn) return;\n this.#computing = true;\n\n this.#sourceIndex = 0;\n const prevLen = this.#sources.length;\n\n const prev = context;\n setContext(this);\n try {\n this.#value = this.#fn();\n } finally {\n setContext(prev);\n\n // Unlink removed sources\n const newLen = this.#sourceIndex;\n if (newLen < prevLen) {\n const sources = this.#sources;\n for (let i = newLen; i < prevLen; i++) {\n const source = sources[i];\n if (source) source.deleteTarget(this);\n }\n sources.length = newLen;\n }\n\n this.#dirty = false;\n this.#computing = false;\n }\n }\n}\n\n/** Create a new computed from the given function. */\nexport const computed = <T>(fn: () => T) => new Computed(fn);\n","/**\n * Effect - Run side effects reactively.\n */\n\nimport { computed } from \"./computed.js\";\n\n/**\n * Create a reactive effect that automatically tracks dependencies\n * and re-runs when they change.\n *\n * @param fn - The effect function to run\n * @returns A dispose function to stop the effect\n *\n * @example\n * const count = signal(0);\n * const dispose = effect(() => {\n * console.log(\"Count is:\", count.value);\n * });\n *\n * count.value = 1; // logs: \"Count is: 1\"\n * dispose(); // stop the effect\n */\nexport function effect(fn: () => void): () => void {\n const c = computed(() => {\n fn();\n return undefined;\n });\n // Subscribe to make it reactive (rerun on dependency changes)\n const unsub = c.subscribe(() => {});\n // Disposal already registered by computed constructor\n return () => {\n unsub();\n c.dispose();\n };\n}\n","/**\n * Store - Reactive wrapper for plain objects.\n */\n\nimport { Signal } from \"./signal.js\";\n\nconst STORE = Symbol();\n\n/**\n * Create a reactive store from a plain object.\n * Each property becomes a signal, and nested objects are recursively wrapped.\n */\nexport function store<T extends object>(obj: T): T {\n const signals = new Map<string | symbol, Signal<unknown>>();\n\n /** Recursively wrap nested objects and arrays */\n const wrap = (value: unknown): unknown => {\n if (value !== null && typeof value === \"object\" && STORE in value) {\n return value; // Already a store\n }\n if (\n value !== null &&\n typeof value === \"object\" &&\n Object.getPrototypeOf(value) === Object.prototype\n ) {\n return store(value as Record<string, unknown>);\n }\n if (Array.isArray(value)) {\n return value.map(wrap);\n }\n return value;\n };\n\n /** Get or create a signal for a property */\n const getSignal = (key: string | symbol, initialValue: unknown) => {\n let sig = signals.get(key);\n if (!sig) {\n sig = new Signal(wrap(initialValue));\n signals.set(key, sig);\n }\n return sig;\n };\n\n return new Proxy(obj, {\n get(target, key) {\n // Allow symbol access (for STORE check and other internal symbols)\n if (typeof key === \"symbol\") {\n return target[key as keyof T];\n }\n return getSignal(key, target[key as keyof T]).value;\n },\n\n set(target, key, value) {\n if (typeof key === \"symbol\") {\n target[key as keyof T] = value;\n return true;\n }\n const wrapped = wrap(value);\n getSignal(key, target[key as keyof T]).value = wrapped;\n target[key as keyof T] = wrapped as T[keyof T];\n return true;\n },\n\n has(target, key) {\n return key === STORE || key in target;\n },\n });\n}\n","/**\n * Reactive signals with automatic dependency tracking.\n *\n * Uses index-based tracking: computed functions are assumed to access\n * their dependencies in the same order on each run. This enables O(1)\n * dependency checks without complex linked-list structures.\n */\n\nexport { Signal, signal } from \"./signal.js\";\nexport { Computed, computed } from \"./computed.js\";\nexport { effect } from \"./effect.js\";\nexport { store } from \"./store.js\";\nexport { batch, scope, type Subscriber } from \"./context.js\";\n\nimport { Signal } from \"./signal.js\";\nimport { Computed } from \"./computed.js\";\n\n/** Common interface for reactive values (Signal or Computed). */\nexport interface Reactive<T> {\n readonly value: T;\n subscribe(fn: () => void): () => void;\n}\n\n/** Check if a value is a reactive signal or computed. @internal */\nexport const isSignal = (value: unknown): value is Reactive<unknown> =>\n value instanceof Signal || value instanceof Computed;\n","/**\n * Streaming HTML parser for template literals.\n * State machine: Text=0, TagOpen=1, TagName=2, InTag=3, AttrName=4, AttrEq=5, AttrVal=6, CloseTag=7, Comment=8\n */\n\nexport type AttrPart = string | { index: number };\n\nexport interface ParseCallbacks {\n onText: (text: string) => void;\n onOpenTag: (\n tag: string,\n attrs: [string, AttrPart[]][],\n selfClosing: boolean,\n ) => void;\n onClose: () => void;\n onSlot: (index: number) => void;\n}\n\nexport class HTMLParser {\n private s = 0; // state\n private tag = \"\";\n private attr = \"\";\n private parts: AttrPart[] = [];\n private attrs: [string, AttrPart[]][] = [];\n private text = \"\";\n private q = \"\";\n\n parseTemplate(strings: TemplateStringsArray, cb: ParseCallbacks) {\n for (let i = 0; i < strings.length; i++) {\n this.parse(strings[i]!, cb);\n if (i < strings.length - 1) this.slot(i, cb);\n }\n if (this.text) {\n cb.onText(this.text);\n this.text = \"\";\n }\n }\n\n private parse(str: string, cb: ParseCallbacks) {\n for (let i = 0; i < str.length; i++) {\n const ch = str[i]!,\n nx = str[i + 1],\n n2 = str[i + 2];\n\n if (this.s === 0) {\n // Text\n if (ch === \"<\") {\n if (this.text) {\n cb.onText(this.text);\n this.text = \"\";\n }\n this.s = 1;\n } else this.text += ch;\n } else if (this.s === 1) {\n // TagOpen\n if (ch === \"/\") this.s = 7;\n else if (ch === \"!\" && nx === \"-\" && n2 === \"-\") {\n i += 2;\n this.s = 8;\n } else if (ch === \"!\" || ch === \"?\") {\n while (i < str.length && str[i] !== \">\") i++;\n this.s = 0;\n } else if (this.isA(ch)) {\n this.tag = ch;\n this.s = 2;\n } else {\n this.text += \"<\" + ch;\n this.s = 0;\n }\n } else if (this.s === 2) {\n // TagName\n if (this.isT(ch)) this.tag += ch;\n else if (this.isW(ch)) {\n this.s = 3;\n } else if (ch === \">\") {\n this.emit(cb, false);\n } else if (ch === \"/\" && nx === \">\") {\n i++;\n this.emit(cb, true);\n }\n } else if (this.s === 3) {\n // InTag\n if (this.isW(ch)) continue;\n if (ch === \">\") this.emit(cb, false);\n else if (ch === \"/\" && nx === \">\") {\n i++;\n this.emit(cb, true);\n } else {\n this.attr = ch;\n this.parts = [];\n this.s = 4;\n }\n } else if (this.s === 4) {\n // AttrName\n if (this.isT(ch) || ch === \"_\") this.attr += ch;\n else if (ch === \"=\") this.s = 5;\n else if (this.isW(ch)) {\n this.emitAttr();\n this.s = 3;\n } else if (ch === \">\") {\n this.emitAttr();\n this.emit(cb, false);\n } else if (ch === \"/\" && nx === \">\") {\n this.emitAttr();\n i++;\n this.emit(cb, true);\n }\n } else if (this.s === 5) {\n // AttrEq\n if (ch === '\"' || ch === \"'\") {\n this.q = ch;\n this.s = 6;\n } else if (!this.isW(ch)) {\n this.q = \"\";\n this.parts.push(ch);\n this.s = 6;\n }\n } else if (this.s === 6) {\n // AttrVal\n const end = this.q\n ? ch === this.q\n : this.isW(ch) || ch === \">\" || ch === \"/\";\n if (end) {\n this.emitAttr();\n this.q = \"\";\n this.s = 3;\n if (ch === \">\") this.emit(cb, false);\n else if (ch === \"/\" && nx === \">\") {\n i++;\n this.emit(cb, true);\n }\n } else {\n const last = this.parts[this.parts.length - 1];\n if (typeof last === \"string\")\n this.parts[this.parts.length - 1] = last + ch;\n else this.parts.push(ch);\n }\n } else if (this.s === 7) {\n // CloseTag\n if (ch === \">\") {\n cb.onClose();\n this.s = 0;\n }\n } else if (this.s === 8) {\n // Comment\n if (ch === \"-\" && nx === \"-\" && n2 === \">\") {\n i += 2;\n this.s = 0;\n }\n }\n }\n }\n\n private slot(index: number, cb: ParseCallbacks) {\n if (this.s === 5 || this.s === 6) {\n this.parts.push({ index });\n if (this.s === 5) this.s = 6;\n } else {\n if (this.text) {\n cb.onText(this.text);\n this.text = \"\";\n }\n cb.onSlot(index);\n }\n }\n\n private emit(cb: ParseCallbacks, self: boolean) {\n cb.onOpenTag(this.tag, this.attrs, self);\n this.tag = \"\";\n this.attrs = [];\n this.s = 0;\n }\n\n private emitAttr() {\n if (this.attr) this.attrs.push([this.attr, this.parts]);\n this.attr = \"\";\n this.parts = [];\n }\n\n private isA(c: string) {\n return (c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\");\n }\n private isT(c: string) {\n return (\n (c >= \"a\" && c <= \"z\") ||\n (c >= \"A\" && c <= \"Z\") ||\n (c >= \"0\" && c <= \"9\") ||\n c === \"-\" ||\n c === \":\"\n );\n }\n private isW(c: string) {\n return c <= \" \" && c !== \"\";\n }\n}\n","/**\n * HTML template rendering with reactive bindings.\n *\n * Uses tagged template literals to create reactive DOM:\n * - Text interpolation: ${value} or ${signal}\n * - Attribute binding: class=\"${signal}\" (reactive)\n * - Event binding: @click=${handler}\n * - Property binding: .value=${signal} (sets DOM property, not attribute)\n * - Nested templates: ${html`<span>...</span>`}\n * - Arrays: ${items.map(i => html`<li>${i}</li>`)}\n */\n\nimport { computed, isSignal, signal, type Reactive } from \"./signals/index.js\";\nimport { HTMLParser } from \"./parser.js\";\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\ntype AttrPart = string | { index: number };\n\n/**\n * Bind a value to an update function.\n * If reactive, subscribes and returns unsubscribe. Otherwise returns null.\n * Functions are wrapped in computed() for automatic reactivity.\n */\nfunction bind(\n value: unknown,\n update: (v: unknown) => void,\n): (() => void) | null | undefined {\n if (typeof value === \"function\") {\n const c = computed(value as () => unknown);\n update(c.value);\n const unsub = c.subscribe(() => update(c.value));\n return () => {\n unsub();\n c.dispose();\n };\n }\n if (isSignal(value)) {\n update(value.value);\n return value.subscribe(() => update((value as Reactive<unknown>).value));\n }\n update(value);\n}\n\n/** A parsed HTML template. Call render() to create live DOM. */\nexport class Template {\n constructor(\n private strings: TemplateStringsArray,\n private values: unknown[],\n ) {}\n\n /**\n * Parse template and create live DOM.\n * Returns the fragment and a dispose function to clean up subscriptions.\n */\n render(): { fragment: DocumentFragment; dispose: () => void } {\n const fragment = document.createDocumentFragment();\n const disposers: (() => void)[] = [];\n const stack: (Element | DocumentFragment)[] = [fragment];\n const parser = new HTMLParser();\n const values = this.values;\n\n const handleAttribute = (el: Element, name: string, parts: AttrPart[]) => {\n const part0 = parts[0];\n\n // Event binding: @click=${handler}\n if (name[0] === \"@\") {\n if (part0 && typeof part0 !== \"string\") {\n const handler = values[part0.index] as EventListener;\n el.addEventListener(name.slice(1), handler);\n disposers.push(() => el.removeEventListener(name.slice(1), handler));\n }\n return;\n }\n\n // Property binding: .value=${data} - sets DOM property directly\n if (name[0] === \".\") {\n if (part0 && typeof part0 !== \"string\") {\n const unsub = bind(values[part0.index], (v) => {\n (el as unknown as Record<string, unknown>)[name.slice(1)] = v;\n });\n if (unsub) disposers.push(unsub);\n }\n return;\n }\n\n // Dynamic attribute - collect dynamic parts\n const dynParts: { index: number }[] = [];\n for (const p of parts) {\n if (typeof p !== \"string\") dynParts.push(p);\n }\n\n // Static attribute (all parts are strings)\n if (!dynParts.length) {\n const value = (parts as string[]).join(\"\");\n if (value || !parts.length) el.setAttribute(name, value);\n return;\n }\n\n // Wrap functions in computed, collect all reactive sources\n const reactives: Reactive<unknown>[] = [];\n for (const p of dynParts) {\n const v = values[p.index];\n if (typeof v === \"function\") {\n const c = computed(v as () => unknown);\n values[p.index] = c;\n reactives.push(c);\n disposers.push(() => c.dispose());\n } else if (isSignal(v)) {\n reactives.push(v);\n }\n }\n const getValue = (idx: number) => {\n const v = values[idx];\n return isSignal(v) ? (v as Reactive<unknown>).value : v;\n };\n\n const update = () => {\n if (parts.length === 1) {\n const val = getValue(dynParts[0]!.index);\n if (val == null || val === false) el.removeAttribute(name);\n else el.setAttribute(name, val === true ? \"\" : String(val));\n } else {\n el.setAttribute(\n name,\n parts\n .map((p) => {\n if (typeof p === \"string\") return p;\n const val = getValue(p.index);\n return val == null ? \"\" : String(val);\n })\n .join(\"\"),\n );\n }\n };\n\n update();\n for (const s of reactives) disposers.push(s.subscribe(update));\n };\n\n parser.parseTemplate(this.strings, {\n onText: (text) => {\n stack.at(-1)!.append(text);\n },\n\n onOpenTag: (tag, attrs, selfClosing) => {\n const parent = stack.at(-1)!;\n const el =\n tag === \"svg\" ||\n tag === \"SVG\" ||\n (parent instanceof Element && parent.namespaceURI === SVG_NS)\n ? document.createElementNS(SVG_NS, tag)\n : document.createElement(tag);\n for (const [name, parts] of attrs) {\n handleAttribute(el, name, parts);\n }\n parent.appendChild(el);\n if (!selfClosing) stack.push(el);\n },\n\n onClose: () => {\n if (stack.length > 1) stack.pop();\n },\n\n onSlot: (index) => {\n // Marker comment anchors dynamic content\n const marker = document.createComment(\"\");\n stack.at(-1)!.appendChild(marker);\n disposers.push(bindContent(marker, values[index]));\n },\n });\n\n return { fragment, dispose: () => disposers.forEach((d) => d()) };\n }\n}\n\n/** Cached entry for a keyed list item */\ninterface EachEntry {\n item: unknown;\n nodes: Node[];\n dispose: () => void;\n}\n\n/**\n * Bind dynamic content at a marker position.\n * Handles primitives (as text), Templates (rendered), Each (keyed lists), and arrays.\n * null/undefined/boolean render nothing (enables conditional: ${cond && html`...`})\n */\nfunction bindContent(marker: Comment, value: unknown): () => void {\n let nodes: Node[] = [];\n let childDisposers: (() => void)[] = [];\n\n const clear = () => {\n childDisposers.forEach((d) => d());\n childDisposers = [];\n nodes.forEach((n) => n.parentNode?.removeChild(n));\n nodes = [];\n };\n\n // Handle each() - keyed list for efficient list rendering\n if (value != null && typeof value === \"object\" && EACH in value) {\n const cache = new Map<unknown, EachEntry>();\n const { list, keyFn, renderFn } = value as EachDescriptor<unknown>;\n let warned = 0;\n\n const updateList = () => {\n const parent = marker.parentNode!;\n const items = list.value;\n const newKeys = new Set<unknown>();\n const newNodes: Node[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i]!;\n const key = keyFn(item, i);\n\n if (newKeys.has(key)) {\n void (warned++ || console.warn(\"Duplicate key:\", key));\n continue; // Skip duplicate\n }\n newKeys.add(key);\n\n let entry = cache.get(key);\n if (!entry || entry.item !== item) {\n // First time seeing this key, or item at this key changed → render template\n if (entry) {\n // Dispose old entry for this key\n entry.nodes.forEach((n) => n.parentNode?.removeChild(n));\n entry.dispose();\n }\n const { fragment, dispose } = renderFn(item).render();\n entry = { item, nodes: [...fragment.childNodes], dispose };\n cache.set(key, entry);\n }\n newNodes.push(...entry.nodes);\n }\n\n // Remove nodes for deleted keys\n for (const [key, entry] of cache) {\n if (!newKeys.has(key)) {\n entry.nodes.forEach((n) => n.parentNode?.removeChild(n));\n entry.dispose();\n cache.delete(key);\n }\n }\n\n // Reorder/insert nodes in correct order\n let prevNode: Node = marker;\n for (let i = newNodes.length - 1; i >= 0; i--) {\n const node = newNodes[i]!;\n if (node.nextSibling !== prevNode) {\n parent.insertBefore(node, prevNode);\n }\n prevNode = node;\n }\n\n nodes = newNodes;\n };\n\n updateList();\n const unsub = list.subscribe(updateList);\n\n return () => {\n unsub();\n for (const entry of cache.values()) {\n entry.dispose();\n }\n cache.clear();\n nodes.forEach((n) => n.parentNode?.removeChild(n));\n };\n }\n\n const update = (v: unknown) => {\n clear();\n const parent = marker.parentNode!;\n\n for (const item of Array.isArray(v) ? v : [v]) {\n if (item instanceof Template) {\n const { fragment, dispose } = item.render();\n childDisposers.push(dispose);\n nodes.push(...fragment.childNodes);\n parent.insertBefore(fragment, marker);\n } else if (item != null && typeof item !== \"boolean\") {\n const node = document.createTextNode(String(item));\n nodes.push(node);\n parent.insertBefore(node, marker);\n }\n }\n };\n\n const unsub = bind(value, update);\n return () => {\n unsub?.();\n clear();\n };\n}\n\n/** Tagged template literal for creating reactive HTML templates */\nexport const html = (strings: TemplateStringsArray, ...values: unknown[]) =>\n new Template(strings, values);\n\n/** Marker symbol for keyed list objects */\nconst EACH = Symbol();\n\n/** Keyed list descriptor */\ninterface EachDescriptor<T> {\n [EACH]: true;\n list: Reactive<T[]>;\n keyFn: (item: T, index: number) => unknown;\n renderFn: (item: T) => Template;\n}\n\n/** List input type - accepts arrays, reactive arrays, or getter functions */\ntype ListInput<T> = T[] | Reactive<T[]> | (() => T[]);\n\n/**\n * Efficient keyed list rendering.\n *\n * Caches templates by key, only re-rendering when items are added/removed.\n * For content updates within items, use nested signals:\n *\n * ```ts\n * const items = signal([\n * { id: 1, name: signal(\"Alice\") },\n * { id: 2, name: signal(\"Bob\") },\n * ]);\n *\n * // With explicit key (recommended when items may have same reference after re-fetch)\n * html`<ul>${each(items, i => i.id, i => html`<li>${i.name}</li>`)}</ul>`\n *\n * // Without key (uses object reference for objects, index for primitives)\n * html`<ul>${each(items, i => html`<li>${i.name}</li>`)}</ul>`\n *\n * // With getter function (useful with stores)\n * html`<ul>${each(() => state.items, i => html`<li>${i.name}</li>`)}</ul>`\n *\n * // With plain array (static, won't react to changes)\n * html`<ul>${each([\"a\", \"b\", \"c\"], i => html`<li>${i}</li>`)}</ul>`\n * ```\n */\nexport function each<T>(\n list: ListInput<T>,\n renderFn: (item: T) => Template,\n): EachDescriptor<T>;\nexport function each<T>(\n list: ListInput<T>,\n keyFn: (item: T, index: number) => unknown,\n renderFn: (item: T) => Template,\n): EachDescriptor<T>;\nexport function each<T>(\n list: ListInput<T>,\n keyFnOrRenderFn:\n | ((item: T, index: number) => unknown)\n | ((item: T) => Template),\n renderFn?: (item: T) => Template,\n): EachDescriptor<T> {\n // Two-arg form: each(list, renderFn) - use object ref for objects, index for primitives\n const keyFn = renderFn\n ? (keyFnOrRenderFn as (item: T, index: number) => unknown)\n : (item: T, index: number) =>\n item !== null &&\n (typeof item === \"object\" || typeof item === \"function\")\n ? item\n : index;\n return {\n [EACH]: true,\n list: Array.isArray(list)\n ? signal(list)\n : typeof list === \"function\"\n ? computed(list)\n : list,\n keyFn,\n renderFn: renderFn ?? (keyFnOrRenderFn as (item: T) => Template),\n };\n}\n"],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export { html,
|
|
2
|
-
export
|
|
1
|
+
export { html, each, type Template } from "./template.js";
|
|
2
|
+
export { signal, computed, effect, store, batch, scope, } from "./signals/index.js";
|
|
3
|
+
export type { Signal, Computed, Reactive, Subscriber, } from "./signals/index.js";
|
|
3
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EACL,MAAM,EACN,QAAQ,EACR,MAAM,EACN,KAAK,EACL,KAAK,EACL,KAAK,GACN,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,UAAU,GACX,MAAM,oBAAoB,CAAC"}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { html,
|
|
2
|
-
export
|
|
1
|
+
export { html, each } from "./template.js";
|
|
2
|
+
export { signal, computed, effect, store, batch, scope, } from "./signals/index.js";
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAiB,MAAM,eAAe,CAAC;AAC1D,OAAO,EACL,MAAM,EACN,QAAQ,EACR,MAAM,EACN,KAAK,EACL,KAAK,EACL,KAAK,GACN,MAAM,oBAAoB,CAAC"}
|
package/dist/esm/parser.d.ts
CHANGED
|
@@ -7,17 +7,16 @@ export type AttrPart = string | {
|
|
|
7
7
|
};
|
|
8
8
|
export interface ParseCallbacks {
|
|
9
9
|
onText: (text: string) => void;
|
|
10
|
-
|
|
10
|
+
onOpenTag: (tag: string, attrs: [string, AttrPart[]][], selfClosing: boolean) => void;
|
|
11
11
|
onClose: () => void;
|
|
12
|
-
onAttribute: (el: Element, name: string, parts: AttrPart[]) => void;
|
|
13
12
|
onSlot: (index: number) => void;
|
|
14
13
|
}
|
|
15
14
|
export declare class HTMLParser {
|
|
16
15
|
private s;
|
|
17
|
-
private el;
|
|
18
16
|
private tag;
|
|
19
17
|
private attr;
|
|
20
18
|
private parts;
|
|
19
|
+
private attrs;
|
|
21
20
|
private text;
|
|
22
21
|
private q;
|
|
23
22
|
parseTemplate(strings: TemplateStringsArray, cb: ParseCallbacks): void;
|
package/dist/esm/parser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,SAAS,EAAE,CACT,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,EAC7B,WAAW,EAAE,OAAO,KACjB,IAAI,CAAC;IACV,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,CAAC,CAAK;IACd,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,IAAI,CAAM;IAClB,OAAO,CAAC,CAAC,CAAM;IAEf,aAAa,CAAC,OAAO,EAAE,oBAAoB,EAAE,EAAE,EAAE,cAAc;IAW/D,OAAO,CAAC,KAAK;IAmHb,OAAO,CAAC,IAAI;IAaZ,OAAO,CAAC,IAAI;IAOZ,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,GAAG;IAGX,OAAO,CAAC,GAAG;IASX,OAAO,CAAC,GAAG;CAGZ"}
|
package/dist/esm/parser.js
CHANGED
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export class HTMLParser {
|
|
6
6
|
s = 0; // state
|
|
7
|
-
el = null;
|
|
8
7
|
tag = "";
|
|
9
8
|
attr = "";
|
|
10
9
|
parts = [];
|
|
10
|
+
attrs = [];
|
|
11
11
|
text = "";
|
|
12
12
|
q = "";
|
|
13
13
|
parseTemplate(strings, cb) {
|
|
@@ -63,18 +63,12 @@ export class HTMLParser {
|
|
|
63
63
|
if (this.isT(ch))
|
|
64
64
|
this.tag += ch;
|
|
65
65
|
else if (this.isW(ch)) {
|
|
66
|
-
this.el = document.createElement(this.tag);
|
|
67
|
-
this.tag = "";
|
|
68
66
|
this.s = 3;
|
|
69
67
|
}
|
|
70
68
|
else if (ch === ">") {
|
|
71
|
-
this.el = document.createElement(this.tag);
|
|
72
|
-
this.tag = "";
|
|
73
69
|
this.emit(cb, false);
|
|
74
70
|
}
|
|
75
71
|
else if (ch === "/" && nx === ">") {
|
|
76
|
-
this.el = document.createElement(this.tag);
|
|
77
|
-
this.tag = "";
|
|
78
72
|
i++;
|
|
79
73
|
this.emit(cb, true);
|
|
80
74
|
}
|
|
@@ -102,15 +96,15 @@ export class HTMLParser {
|
|
|
102
96
|
else if (ch === "=")
|
|
103
97
|
this.s = 5;
|
|
104
98
|
else if (this.isW(ch)) {
|
|
105
|
-
this.emitAttr(
|
|
99
|
+
this.emitAttr();
|
|
106
100
|
this.s = 3;
|
|
107
101
|
}
|
|
108
102
|
else if (ch === ">") {
|
|
109
|
-
this.emitAttr(
|
|
103
|
+
this.emitAttr();
|
|
110
104
|
this.emit(cb, false);
|
|
111
105
|
}
|
|
112
106
|
else if (ch === "/" && nx === ">") {
|
|
113
|
-
this.emitAttr(
|
|
107
|
+
this.emitAttr();
|
|
114
108
|
i++;
|
|
115
109
|
this.emit(cb, true);
|
|
116
110
|
}
|
|
@@ -133,7 +127,7 @@ export class HTMLParser {
|
|
|
133
127
|
? ch === this.q
|
|
134
128
|
: this.isW(ch) || ch === ">" || ch === "/";
|
|
135
129
|
if (end) {
|
|
136
|
-
this.emitAttr(
|
|
130
|
+
this.emitAttr();
|
|
137
131
|
this.q = "";
|
|
138
132
|
this.s = 3;
|
|
139
133
|
if (ch === ">")
|
|
@@ -182,13 +176,14 @@ export class HTMLParser {
|
|
|
182
176
|
}
|
|
183
177
|
}
|
|
184
178
|
emit(cb, self) {
|
|
185
|
-
cb.
|
|
186
|
-
this.
|
|
179
|
+
cb.onOpenTag(this.tag, this.attrs, self);
|
|
180
|
+
this.tag = "";
|
|
181
|
+
this.attrs = [];
|
|
187
182
|
this.s = 0;
|
|
188
183
|
}
|
|
189
|
-
emitAttr(
|
|
190
|
-
if (this.
|
|
191
|
-
|
|
184
|
+
emitAttr() {
|
|
185
|
+
if (this.attr)
|
|
186
|
+
this.attrs.push([this.attr, this.parts]);
|
|
192
187
|
this.attr = "";
|
|
193
188
|
this.parts = [];
|
|
194
189
|
}
|
|
@@ -196,10 +191,14 @@ export class HTMLParser {
|
|
|
196
191
|
return (c >= "a" && c <= "z") || (c >= "A" && c <= "Z");
|
|
197
192
|
}
|
|
198
193
|
isT(c) {
|
|
199
|
-
return
|
|
194
|
+
return ((c >= "a" && c <= "z") ||
|
|
195
|
+
(c >= "A" && c <= "Z") ||
|
|
196
|
+
(c >= "0" && c <= "9") ||
|
|
197
|
+
c === "-" ||
|
|
198
|
+
c === ":");
|
|
200
199
|
}
|
|
201
200
|
isW(c) {
|
|
202
|
-
return c
|
|
201
|
+
return c <= " " && c !== "";
|
|
203
202
|
}
|
|
204
203
|
}
|
|
205
204
|
//# sourceMappingURL=parser.js.map
|
package/dist/esm/parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../../../src/signals/computed.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAmB,MAAM,aAAa,CAAC;AACtD,OAAO,
|
|
1
|
+
{"version":3,"file":"computed.d.ts","sourceRoot":"","sources":["../../../src/signals/computed.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAmB,MAAM,aAAa,CAAC;AACtD,OAAO,EAML,KAAK,UAAU,EAChB,MAAM,cAAc,CAAC;AAEtB;;;;;GAKG;AACH,qBAAa,QAAQ,CAAC,CAAC;;gBAUT,EAAE,EAAE,MAAM,CAAC;IAQvB,IAAI,KAAK,IAAI,CAAC,CAIb;IAED,SAAS,CAAC,EAAE,EAAE,UAAU,GAAG,MAAM,IAAI;IAKrC,OAAO,IAAI,IAAI;IAWf;;;OAGG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI;IAqB9D;;;OAGG;IACH,SAAS,IAAI,IAAI;IA2CjB,gBAAgB;IAChB,IAAI,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE,CAEjC;IAED,gBAAgB;IAChB,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI;CAiC9C;AAED,qDAAqD;AACrD,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,IAAI,MAAM,CAAC,gBAAqB,CAAC"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Computed - A derived reactive value.
|
|
3
3
|
*/
|
|
4
4
|
import { Signal, removeFromArray } from "./signal.js";
|
|
5
|
-
import { context, setContext, isBatching,
|
|
5
|
+
import { context, setContext, isBatching, enqueueBatchOne, registerDisposer, } from "./context.js";
|
|
6
6
|
/**
|
|
7
7
|
* A derived reactive value. Automatically tracks dependencies and
|
|
8
8
|
* recomputes when any dependency changes.
|
|
@@ -21,6 +21,8 @@ export class Computed {
|
|
|
21
21
|
constructor(fn) {
|
|
22
22
|
this.#fn = fn;
|
|
23
23
|
this.#recompute();
|
|
24
|
+
// Auto-register disposal in current root scope
|
|
25
|
+
registerDisposer(() => this.dispose());
|
|
24
26
|
}
|
|
25
27
|
get value() {
|
|
26
28
|
if (this.#dirty)
|
|
@@ -82,32 +84,25 @@ export class Computed {
|
|
|
82
84
|
continue;
|
|
83
85
|
c.#dirty = true;
|
|
84
86
|
const targets = c.#targets;
|
|
85
|
-
// Short-circuit
|
|
86
|
-
// eagerly recompute to check if the value actually changed before propagating.
|
|
87
|
-
// Only do this outside of batching to avoid intermediate/inconsistent state.
|
|
87
|
+
// Short-circuit: if subs + targets + not batching, eagerly check if value changed
|
|
88
88
|
if (c.#subs.length > 0 && targets.length > 0 && c.#fn && !isBatching()) {
|
|
89
89
|
const old = c.#value;
|
|
90
90
|
c.#recompute();
|
|
91
|
-
|
|
92
|
-
// Only propagate dirty flag to targets if value actually changed
|
|
93
|
-
if (valueChanged) {
|
|
91
|
+
if (!Object.is(c.#value, old)) {
|
|
94
92
|
for (let j = 0; j < targets.length; j++) {
|
|
95
|
-
const
|
|
96
|
-
if (!
|
|
97
|
-
queue.push(
|
|
93
|
+
const t = targets[j];
|
|
94
|
+
if (!t.#dirty)
|
|
95
|
+
queue.push(t);
|
|
98
96
|
}
|
|
99
|
-
// Notify subscribers since value changed (we're not batching here)
|
|
100
97
|
for (let j = 0; j < c.#subs.length; j++)
|
|
101
98
|
c.#subs[j]();
|
|
102
99
|
}
|
|
103
|
-
// If value didn't change, don't propagate or notify
|
|
104
100
|
}
|
|
105
101
|
else {
|
|
106
|
-
// No short-circuiting needed - use original behavior
|
|
107
102
|
for (let j = 0; j < targets.length; j++) {
|
|
108
|
-
const
|
|
109
|
-
if (!
|
|
110
|
-
queue.push(
|
|
103
|
+
const t = targets[j];
|
|
104
|
+
if (!t.#dirty)
|
|
105
|
+
queue.push(t);
|
|
111
106
|
}
|
|
112
107
|
if (c.#subs.length) {
|
|
113
108
|
const old = c.#value;
|
|
@@ -120,12 +115,7 @@ export class Computed {
|
|
|
120
115
|
}
|
|
121
116
|
}
|
|
122
117
|
};
|
|
123
|
-
|
|
124
|
-
enqueueBatch(notify);
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
notify();
|
|
128
|
-
}
|
|
118
|
+
void (isBatching() ? enqueueBatchOne(notify) : notify());
|
|
129
119
|
}
|
|
130
120
|
}
|
|
131
121
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computed.js","sourceRoot":"","sources":["../../../src/signals/computed.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACL,OAAO,EACP,UAAU,EACV,UAAU,EACV,
|
|
1
|
+
{"version":3,"file":"computed.js","sourceRoot":"","sources":["../../../src/signals/computed.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,30 @@ export declare function batch<T>(fn: () => T): T;
|
|
|
16
16
|
/** Check if currently batching */
|
|
17
17
|
export declare function isBatching(): boolean;
|
|
18
18
|
/** Add a subscriber to the batch queue */
|
|
19
|
-
export declare function
|
|
19
|
+
export declare function enqueueBatchOne(sub: Subscriber): void;
|
|
20
20
|
/** Add multiple subscribers to the batch queue */
|
|
21
21
|
export declare function enqueueBatchAll(subs: Subscriber[]): void;
|
|
22
|
+
/**
|
|
23
|
+
* Create a disposal scope that collects all subscriptions and computeds created within.
|
|
24
|
+
* Returns the result of the function and a dispose function that cleans up all resources.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* const [result, dispose] = scope(() => {
|
|
29
|
+
* const count = signal(0);
|
|
30
|
+
* const doubled = computed(() => count.value * 2);
|
|
31
|
+
* effect(() => console.log(doubled.value));
|
|
32
|
+
* return { count, doubled };
|
|
33
|
+
* });
|
|
34
|
+
*
|
|
35
|
+
* // Later: clean up all subscriptions and computeds
|
|
36
|
+
* dispose();
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare function scope<T>(fn: () => T): [result: T, dispose: () => void];
|
|
40
|
+
/**
|
|
41
|
+
* Register a disposer in the current scope (if any).
|
|
42
|
+
* This is called internally by computed/effect when they create cleanup functions.
|
|
43
|
+
*/
|
|
44
|
+
export declare function registerDisposer(dispose: () => void): void;
|
|
22
45
|
//# sourceMappingURL=context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/signals/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,wCAAwC;AACxC,MAAM,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC;AAEpC,iEAAiE;AACjE,eAAO,IAAI,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAW,CAAC;AAEpD,wCAAwC;AACxC,wBAAgB,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,IAAI,CAE5D;AAMD;;;GAGG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAYvC;AAED,kCAAkC;AAClC,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED,0CAA0C;AAC1C,wBAAgB,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/signals/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,wCAAwC;AACxC,MAAM,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC;AAEpC,iEAAiE;AACjE,eAAO,IAAI,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAW,CAAC;AAEpD,wCAAwC;AACxC,wBAAgB,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,IAAI,CAE5D;AAMD;;;GAGG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAYvC;AAED,kCAAkC;AAClC,wBAAgB,UAAU,IAAI,OAAO,CAEpC;AAED,0CAA0C;AAC1C,wBAAgB,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CAErD;AAED,kDAAkD;AAClD,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,IAAI,CAExD;AAKD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,CAuBtE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAE1D"}
|