@wcstack/state 3.5.0 → 3.5.2

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.
@@ -1,2 +1,2 @@
1
- import{r as t,l as e,a as n,C as o}from"../chunks/lifecycleHooks.js";import{k as r,l as s,a,m as i,D as c,V as l,n as u,W as d,g as f,o as h,R as p,p as m,i as g,q as y,r as w}from"../chunks/pathDiagnostics.js";import{r as $,d as b}from"../chunks/errorGuidance.js";import{r as v,g as k,N as P}from"../chunks/getAllPropertyDescriptors.js";import{c as S}from"../chunks/filterRegistry.js";import{n as x}from"../chunks/declarationAliases.js";import{q as I,u as j,t as C,v as N,w as M,j as A,i as O,x as R,y as E,z as W,A as K,B as L,C as D,D as B,E as z,o as T,F,G as V,H as q,I as _,J as G,K as H,L as U}from"../chunks/binder.js";import{a as X,r as J}from"../chunks/featureBridge.js";import{p as Q}from"../chunks/diagnosticsHooks.js";import{g as Y,a as Z,c as tt}from"../chunks/checkDependency.js";const et={written:function(t,e,n){const o=t.bindableEventMap,r=o[e.path],s="string"==typeof r,a=s?r:e.segments.length>1&&-1===e.path.indexOf("#")?o[e.segments[0]]:void 0;if("string"!=typeof a)return;const i=t.rootNode;i instanceof ShadowRoot&&i.host.dispatchEvent(new CustomEvent(a,{detail:s&&void 0!==n?n.value:void 0,bubbles:!0}))}};let nt=!1;function ot(t){return function(){const e=this.stateElement;if(!e)return;if(!0!==e.initialized)return;let n;try{e.createState("readonly",e=>{n=e[t]})}catch(e){return void console.warn(`[@wcstack/state] DCC getter "${t}" failed:`,e)}return n}}function rt(t){return function(e){const n=this.stateElement;n&&(!0!==n.initialized?n.initializePromise.then(()=>{n.createState("writable",n=>{n[t]=e})}):n.createState("writable",n=>{n[t]=e}))}}function st(t,e){return e?function(...e){const n=this.stateElement;if(n)return n.initializePromise.then(()=>{let o;return n.createStateAsync("writable",async n=>{o=await n[t](...e)}).then(()=>o)})}:function(...e){const n=this.stateElement;if(n)return n.initializePromise.then(()=>{let o;return n.createState("writable",n=>{o=n[t](...e)}),o})}}function at(t){return t.startsWith("$")}function it(t,e){return Object.keys(t).filter(n=>{if(n.startsWith("$")||"constructor"===n)return!1;const o="function"==typeof t[n].value;return"method"===e?o:!o})}function ct(t,e){const n=t[e];if(void 0===n)return null;Array.isArray(n)||$(`${e} must be an array of strings.`);const o=[],r=new Set;for(const t of n)"string"==typeof t&&0!==t.length||$(`${e} entries must be non-empty strings.`),t.startsWith("$")&&$(`${e} entry "${t}" must not start with "$" (internal properties are not exposed on the component).`),r.has(t)&&$(`${e} entry "${t}" is duplicated.`),r.add(t),o.push(t);return o}function lt(t){x(t);const e=ct(t,r)??[],n=ct(t,s)??[],o=k(t),i=function(t){const e=t[a];return"object"!=typeof e||null===e?new Set:new Set(Object.keys(e))}(t),c=[];for(const t of e){const e=o[t];if(void 0===e){if(i.has(t)){c.push(t);continue}$(`${r} entry "${t}" is not declared on the state.${b(t,it(o,"value"))}`)}"function"==typeof e.value&&$(`${r} entry "${t}" is a method. Declare it in ${s} instead.`)}for(const t of n){const e=o[t];void 0===e&&$(`${s} entry "${t}" is not declared on the state.${b(t,it(o,"method"))}`),"function"!=typeof e.value&&$(`${s} entry "${t}" is not a method. Declare it in ${r} instead.`)}return{bindables:e,commands:n,streamBackedBindables:c}}function ut(t,e,n){const o=t.tagName.toLowerCase();o.includes("-")||$(`DCC: "${o}" is not a valid custom element name (must contain a hyphen).`);const s=I(t);null!==s&&"function"==typeof s.define||$(`DCC: CustomElementRegistry is unavailable for "${o}".`),s.get(o)&&$(`DCC: "${o}" is already registered. A custom element name can only be defined once.`);const a=document.createElement("template"),c=a.content.ownerDocument;for(const t of Array.from(e.childNodes))a.content.appendChild(c.importNode(t,!0));const l=e.mode,{bindables:u,commands:d,streamBackedBindables:f}=lt(n),h=u.length>0||d.length>0?function(t,e,n=[]){const o={protocol:"wc-bindable",version:1,properties:e.map(e=>({name:e,event:`${t}:${e}-changed`,getter:t=>t.target[e]})),inputs:e.map(t=>({name:t}))};if(0===n.length)return o;const r=n.map(t=>({name:t,async:!0}));return{...o,commands:r}}(o,u,d):null,p=u.length>0?function(t,e){const n={};for(const o of e)n[o]=`${t}:${o}-changed`;return n}(o,u):{},m=S.tagNames.state,g=class extends HTMLElement{static template=a;static shadowRootMode=l;static wcBindable=h;static bindableEventMap=p;_shadow=null;_ensureShadow(){if(null!==this._shadow)return this._shadow;if(this.hasAttribute(i))return null;this._shadow=this.attachShadow({mode:g.shadowRootMode}),this._shadow.appendChild(g.template.content.cloneNode(!0));const t=I(this._shadow);return null!==t&&j(t,this._shadow),this._shadow}connectedCallback(){const t=this._ensureShadow();if(null!==t&&Object.keys(g.bindableEventMap).length>0){const e=t.querySelector(m);e?(nt||(nt=!0,v("dcc",et)),e.setBindableEventMap(g.bindableEventMap)):console.warn(`[@wcstack/state] DCC: "${o}" declares ${r} but its template has no <${S.tagNames.state}>. Change events will not be dispatched.`)}}get stateElement(){return this._ensureShadow()?.querySelector(m)??null}},y=k(n);for(const[t,e]of Object.entries(y)){if(at(t))continue;const n={configurable:!0,enumerable:!0};if("function"==typeof e.value){const o="AsyncFunction"===e.value.constructor?.name;n.value=st(t,o)}else n.get=ot(t),n.set=rt(t);Object.defineProperty(g.prototype,t,n)}for(const t of f)Object.defineProperty(g.prototype,t,{configurable:!0,enumerable:!0,get:ot(t),set:rt(t)});s.define(o,g)}async function dt(t,o,r){const s=t;try{s.hasAttribute("bind-component")&&$(`"bind-component" cannot be used inside a [${i}] host. DCC state comes from the template, not from a component property.`);const a=await async function(t,o){if(t.hasAttribute("src")){const n=t.getAttribute("src");if(n.endsWith(".js"))return await e(n);$(`DCC: Unsupported src type: ${n}`)}const r=t.querySelector('script[type="module"]');if(r)return await n(r,o.tagName.toLowerCase());$(`DCC: No state source found for "${o.tagName.toLowerCase()}".`)}(s,o);ut(o,r,a),t.markTreeless(),t.markInitialized(),t.clearConnectedRootNode(),t.settleInitialization()}catch(e){t.failInitializeLoudly(e)}}const ft={order:10,connecting(t){const e=t.parentNode;return e instanceof ShadowRoot&&e.host.hasAttribute(i)?dt(t,e.host,e):null}};let ht=!1;function pt(t,e){if(e.length>t.length)return!1;for(let n=0;n<e.length;n++)if(t[n]!==e[n])return!1;return!0}function mt(t,e){for(const n of t)if(pt(e,n.innerSegments))return n;return null}function gt(t,e){const n=e.slice(t.innerSegments.length);return 0===n.length?t.outerPathInfo.path:t.outerPathInfo.path+c+n.join(c)}const yt=new Map([["$eq",[0]],["$eqPath",[0,1]],["$eqIndex",[0]],["$dependOn",[0]],["$trackDependency",[0]]]);function wt(t,e,n){const o=yt.get(t);return void 0===o?null:(...t)=>{const r=t.slice();for(let t=0;t<o.length;t++){const n=o[t];"string"==typeof r[n]&&(r[n]=e(r[n]))}return n(r)}}const $t=new WeakMap;function bt(t,e,n){let o=$t.get(t);void 0===o&&(o=new Map,$t.set(t,o));const r=o.get(e);null!=r&&$(`Volume slot "${e}" is already mounted on this tree.`),o.set(e,n)}function vt(t,e){if(null===t)return!1;const n=$t.get(t);if(void 0===n||0===n.size)return!1;for(const t of n.keys())if(e===t||e.startsWith(t+c)||t.startsWith(e+c))return!0;return!1}const kt=new WeakMap;const Pt=[];function St(t,e,n,o){if(e.length>0){const r=n.split(c),s=mt(e,r);if(null!==s)return o&&s.readonly&&$(`[wcs/mount-readonly] volume "${t}" cannot write "${n}": it is injected read-only ("${l}.${s.innerSegments.join(c)}#${u}: ${s.outerPathInfo.path}"). Write "${s.outerPathInfo.path}" on the root, or drop #${u} from the injection.`),gt(s,r)}return t+c+n}function xt(t,e,n){let o=-1,r=null;for(const t of e){const e=t.outerPathInfo.path;e.length<=o||(n===e?(o=e.length,r=t.innerSegments.join(c)):n.startsWith(e+c)&&(o=e.length,r=t.innerSegments.join(c)+n.slice(e.length)))}if(t.length>o){if(n===t)return"";if(n.startsWith(t+c))return n.slice(t.length+1)}return r}function It(t,e,n=Pt){return new Proxy({},{get(o,r){if("string"==typeof r&&"then"!==r){if("$"===r[0]){if("$postUpdate"===r||"$getAll"===r){const o=r;return(r,...s)=>e[o](St(t,n,r,!1),...s)}if("$setAll"===r)return(o,...r)=>e.$setAll(St(t,n,o,!0),...r);if("$resolve"===r)return(o,...r)=>e.$resolve(St(t,n,o,r.length>1),...r);const o=wt(r,e=>St(t,n,e,!1),t=>e[r](...t));return null!==o?o:e[r]}return e[St(t,n,r,!1)]}},set:(o,r,s)=>"string"!=typeof r||("$"===r[0]?(e[r]=s,!0):(e[St(t,n,r,!0)]=s,!0)),has:(t,e)=>"string"==typeof e&&"$"!==e[0]&&"#"!==e[0]})}const jt=new WeakMap,Ct=[];const Nt=new WeakMap,Mt=new WeakSet;function At(t){console.error(`[@wcstack/state] volume "${t.mountPath}" was not grafted — the root state element on this root node failed to initialize (its own diagnostic is reported separately). The volume is not at fault: fix the root <wcs-state>.`),t.onGrafted(null)}let Ot=null;let Rt=0;const Et=["$watch",a,"$scan","$listKeys",h,"$commandTokens","$eventTokens","$on","$recursion","$errorCallback"],Wt=new Set;function Kt(t,e,n){const o=t.stateObject[e];if("function"==typeof o)try{const r=o.call(n());r instanceof Promise&&r.catch(n=>{console.error(`[@wcstack/state] mounted <${t.component.tagName.toLowerCase()}> ${e} failed.`,n)})}catch(n){console.error(`[@wcstack/state] mounted <${t.component.tagName.toLowerCase()}> ${e} failed.`,n)}}function Lt(t,e,n,o,r,s=new Set){0===n.length&&$(`Cannot build a mount record without host bindings for "${e}".`),x(r);const a=[],i=new Set;let l=null;for(const t of n){const e=t.propSegments.slice(1),n=e.join(c);i.has(n)&&$("Duplicate mapping rule for web component."),i.add(n);const o={innerSegments:e,outerPathInfo:t.statePathInfo,readonly:!0===t.propModifiers?.includes(u)};a.push(o),0===e.length&&(l=o)}a.sort((t,e)=>e.innerSegments.length-t.innerSegments.length);const d=++Rt,f=`#m${d}`,{getterKeys:h,setterKeys:p}=function(t){const e=new Set,n=new Set,o=k(t);for(const[t,r]of Object.entries(o))"function"==typeof r.get&&e.add(t),"function"==typeof r.set&&n.add(t);return{getterKeys:e,setterKeys:n}}(r),m=new Set;for(const t of a)1===t.innerSegments.length&&m.add(t.innerSegments[0]);const g={};for(const t of Object.keys(r))t.startsWith("$")||h.has(t)||p.has(t)||"function"!=typeof r[t]&&(s.has(t)||m.has(t)||(g[t]=r[t]));return{id:d,marker:f,component:t,stateProp:e,parentStateElement:o,entries:a,rootEntry:l,delta:null===l?0:l.outerPathInfo.wildcardCount,markerBasePath:null===l?f:l.outerPathInfo.path+c+f,stateObject:r,getterKeys:h,setterKeys:p,injectedKeys:s,mappedKeys:m,hasReadonlyEntries:a.some(t=>t.readonly),privateSnapshot:g,accessorBySuffixByMarkerParent:new Map,indexShiftByLoopElementPath:new Map,addedGetterPaths:new Set,exports:new Map}}function Dt(t){const e=t.indexOf(c);return-1===e?t:t.slice(0,e)}function Bt(t,e){const n=mt(t.entries,e);return null===n?null:gt(n,e)}function zt(t,e){return t.markerBasePath+c+e}function Tt(t,e,n,o){let r=t.accessorBySuffixByMarkerParent.get(e);void 0===r&&(r=new Map,t.accessorBySuffixByMarkerParent.set(e,r));const s=e+c+n;r.set(n,{accessorName:o,indexShift:f(s).wildcardCount-f(o).wildcardCount}),t.getterKeys.has(o)&&(t.parentStateElement.getterPaths?.add(s),t.addedGetterPaths.add(s))}function Ft(t,e){return!t.injectedKeys.has(e)&&(!t.getterKeys.has(e)&&"function"==typeof t.stateObject[e]||!t.mappedKeys.has(e)&&(Object.prototype.hasOwnProperty.call(t.stateObject,e)&&!t.getterKeys.has(e)&&!t.setterKeys.has(e)))}function Vt(t,e){return`Path "${e}" in <${t.component.tagName.toLowerCase()}> does not resolve: it is not an own key of the component state and no mount entry covers it (mounted prefixes: ${t.entries.filter(t=>t.innerSegments.length>0).map(t=>t.innerSegments.join(c)).join(", ")}). Mount it from the host ("${t.stateProp}: path" / "${t.stateProp}.${Dt(e)}: path") or declare the key on the component state.`}const qt=/^\$(\d+)$/;function _t(t,e){if(!t.hasReadonlyEntries)return null;const n=e[0];if("$"===n||"#"===n)return null;if(t.getterKeys.has(e)||t.setterKeys.has(e))return null;const o=Dt(e);if(t.getterKeys.has(o)||t.setterKeys.has(o)||Ft(t,o))return null;const r=function(t,e){return mt(t.entries,e)}(t,e.split(c));return null!==r&&r.readonly?r:null}function Gt(t,e){const n=_t(t,e);if(null!==n){const o=0===n.innerSegments.length?"":c+n.innerSegments.join(c);$(`[wcs/mount-readonly] <${t.component.tagName.toLowerCase()}> cannot write "${e}": it is mounted read-only ("${t.stateProp}${o}#${u}: ${n.outerPathInfo.path}"). Write it on the host, or drop #${u} from the mount.`)}return Ht(t,e)}function Ht(t,e){const n=e[0];if("$"===n||"#"===n)return e;if(t.getterKeys.has(e)||t.setterKeys.has(e))return function(t,e){const n=e.split(c);let o=-1;for(let t=n.length-1;t>=0;t--)if(n[t]===d){o=t;break}if(-1===o)return Tt(t,t.markerBasePath,e,e),zt(t,e);if(Ft(t,n[0]))return Tt(t,t.markerBasePath,e,e),zt(t,e);const r=n.slice(0,o+1),s=n.slice(o+1),a=Bt(t,r);null===a&&$(Vt(t,e)),0===s.length&&$(`Wildcard-terminal accessor "${e}" on mounted <${t.component.tagName.toLowerCase()}> is not supported: it translates to a marker-terminal path where the mount overlay would shadow the accessor. Declare the row value as a getter on the host tree, or back it with a component-own array (a private key makes the whole path private).`);const i=a+c+t.marker;return Tt(t,i,s.join(c),e),i+c+s.join(c)}(t,e);const o=Dt(e);if(t.getterKeys.has(o)||t.setterKeys.has(o))return zt(t,e);if(Ft(t,o))return zt(t,e);const r=Bt(t,e.split(c));if(null!==r)return r;$(Vt(t,e))}const Ut=new Set(["prop","radio","checkbox"]);function Xt(t,e,n){let o;const r=qt.exec(e.statePathName);if(null!==r){const s=function(t,e){if(void 0===e)return t.delta;const n=Ht(t,e);return f(n).wildcardCount-f(e).wildcardCount}(t,n);o=0===s?e.statePathName:`$${Number(r[1])+s}`}else if(o=Ht(t,e.statePathName),"for"===e.bindingType){const n=f(o).wildcardCount-e.statePathInfo.wildcardCount;t.indexShiftByLoopElementPath.set(o+c+d,n)}const s=e.propModifiers,a=null===r&&Array.isArray(s)&&Ut.has(e.bindingType??"")&&!s.includes(u)&&null!==_t(t,e.statePathName);return o!==e.statePathName||a?{...e,statePathName:o,statePathInfo:f(o),...a?{propModifiers:[...s,u]}:{}}:e}function Jt(t,e,n,o,r){if(void 0===o)return;const s=f(n).wildcardCount-f(e).wildcardCount;return 0===s?o:(r.length<s&&$(`Cannot resolve "${e}" from this mount: the mounted prefix has ${s} wildcard(s) but the host context provides only ${r.length} index(es).`),[...r.slice(0,s),...o])}function Qt(t,e,n){if(-1!==t.indexOf(d))return e;const o=e.split(c);let r=0;for(let t=0;t<o.length&&r<n.length;t++)o[t]===d&&(o[t]=String(n[r++]));return o.join(c)}const Yt=new WeakMap,Zt=new WeakMap;const te=new WeakMap;const ee=new FinalizationRegistry(function(t){const e=t.byMarker.get(t.marker);if(void 0!==e&&void 0===e.deref()&&t.byMarker.delete(t.marker),void 0!==t.getterPaths)for(const e of t.addedGetterPaths)t.getterPaths.delete(e)}),ne=new WeakMap;function oe(t){return ne.get(t)??null}let re=!1;function se(t,e){re||(re=!0,C(t=>Yt.has(t)?t.host:null)),Yt.set(t,e),ne.set(e,t);let n=te.get(e.parentStateElement);void 0===n&&(n=new Map,te.set(e.parentStateElement,n)),n.set(e.marker,new WeakRef(e));let o=Zt.get(e.component);void 0===o&&(o=new Map,Zt.set(e.component,o));const r=o.get(e.stateProp)!==e;o.set(e.stateProp,e),r&&ee.register(e,{byMarker:n,marker:e.marker,getterPaths:e.parentStateElement.getterPaths,addedGetterPaths:e.addedGetterPaths}),e.parentStateElement.markHasMounts?.()}function ae(t){return Yt.get(t)??null}function ie(t){return ce(t).map(t=>({marker:t.marker,componentTag:t.component.tagName.toLowerCase(),stateProp:t.stateProp,mountTable:t.entries.map(t=>({inner:t.innerSegments.join(c),outer:t.outerPathInfo.path})),delta:t.delta,privateKeys:Object.keys(t.privateSnapshot),getterKeys:[...t.getterKeys],exports:[...t.exports.keys()]}))}function ce(t){const e=te.get(t);if(void 0===e)return[];const n=[];for(const t of e.values()){const e=t.deref();void 0!==e&&n.push(e)}return n}function le(t,e){const n=e.lastIndexOf("#");if(-1===n)return null;const o=te.get(t);if(void 0===o)return null;const r=e.indexOf(c,n),s=-1===r?e.slice(n):e.slice(n,r),a=o.get(s);if(void 0===a)return null;const i=a.deref();return void 0===i?(o.delete(s),null):i}const ue=new WeakMap,de=new Set;function fe(t,e,n,o){let r=ue.get(t);if(void 0===r){if(!o)return null;r=new Map,ue.set(t,r)}let s=r.get(e);if(void 0===s){if(!o)return null;s=new Map,r.set(e,s)}let a=s.get(n);if(void 0===a){if(!o)return null;a={holders:new Set,byListIndex:new WeakMap,noIndex:null},s.set(n,a)}return a}function he(t,e){if(!t.component.isConnected)return!1;const n=N(t.component)?.listIndex??null;if(null===e)return null===n;let o=n;for(;null!==o;){if(o===e)return!0;o=o.parentListIndex}return!1}function pe(t,e,n,o){const r=fe(t,e,n,!1);if(null===r)return null;const s=null===o?r.noIndex:r.byListIndex.get(o)??null;if(null!==s){const t=function(t,e){const n=t.ref.deref();return void 0!==n&&he(n,e)?n:null}(s,o);if(null!==t)return{record:t,entry:s.entry}}let a=null,i=null;for(const t of r.holders){const s=t.ref.deref();void 0!==s?he(s,o)&&(null!==i&&$(`[wcs/mount-export-ambiguous] "${e}${c}${n}" is exported by two mounted components on the same instance: <${i.component.tagName.toLowerCase()}> and <${s.component.tagName.toLowerCase()}>. Mount only one of them there, or rename one accessor. See docs/state-overlay-export-design.md X4.`),a=t,i=s):r.holders.delete(t)}return null===a||null===i?null:(null===o?r.noIndex=a:r.byListIndex.set(o,a),{record:i,entry:a.entry})}function me(t){const e=t.parentStateElement,n=N(t.component);if(!(!1===e.isConnected||t.delta>0&&null===n))for(const o of t.exports.values())e.createState("readonly",t=>{t[M](n,()=>{t.$postUpdate(o.exportedPath)})})}const ge=new WeakMap,ye=new WeakMap,we=new WeakMap,$e=new WeakMap;function be(t,e){ye.set(t,e);const n=[];for(let t=e?.listIndex.parentListIndex??null;null!==t;t=t.parentListIndex)n.push(t);$e.set(t,n)}function ve(t){return N(t.component)??ye.get(t)??null}function ke(t){return ve(t)?.listIndex??null}function Pe(t){$(`The host row of <${t.component.tagName.toLowerCase()}> was removed.`)}function Se(t){for(;null!==t;t=t.parentListIndex)if(O(t))return!0;return!1}function xe(t,e){return!t.component.isConnected&&(Se(e)||!0===$e.get(t)?.some(t=>O(t)))}class Ie{record;markerParentPath;listIndex;hostRow;isBase;receiver;handler;authorFacing;constructor(t,e,n,o,r,s,a,i=!1){this.record=t,this.markerParentPath=e,this.listIndex=n,this.hostRow=o,this.isBase=r,this.receiver=s,this.handler=a,this.authorFacing=i}authorThis(t,e){return this.authorFacing?e:new Proxy(t,new Ie(this.record,this.markerParentPath,this.listIndex,this.hostRow,this.isBase,this.receiver,this.handler,!0))}accessorNameFor(t){return this.record.accessorBySuffixByMarkerParent.get(this.markerParentPath)?.get(t)?.accessorName}accessorAddress(t){return A(f(this.markerParentPath+c+t),this.listIndex)}hostIndexes(){const t=this.listIndex??ke(this.record),e=this.hostRow??t;return(null===this.listIndex?e!==t||xe(this.record,e):Se(e))&&Pe(this.record),e?.indexes??[]}resolveTreePath(t,e){return-1===e.indexOf(d)||null!==this.listIndex&&0!==this.handler.addressStackLength&&"partial"!==Y(e).wildcardType&&!xe(this.record,this.listIndex)?e:Qt(t,e,this.hostIndexes())}get(t,e,n){if("string"!=typeof e)return Reflect.get(t,e);if("then"===e)return;if("$"===e[0]){if("$postUpdate"===e)return t=>{this.receiver.$postUpdate(this.resolveTreePath(t,Ht(this.record,t)))};if("$getAll"===e||"$setAll"===e||"$resolve"===e){const t=this.record,n=this.hostIndexes(),o=this.receiver,r=this.handler,s=this.listIndex;if("$resolve"===e)return(e,r,...s)=>{const a=s.length>0?Gt(t,e):Ht(t,e),i=Jt(0,e,a,r??[],n);return o.$resolve(a,i,...s)};const a=e;return(e,i,...c)=>{const l="$setAll"===a?Gt(t,e):Ht(t,e),u=Jt(0,e,l,void 0===i&&"$getAll"===a&&null===s&&null===Z(r,f(l).wildcardPaths[0])?[]:i,n);return o[a](l,u,...c)}}const t=this.record,n=this.receiver,o=wt(e,e=>this.resolveTreePath(e,Ht(t,e)),t=>n[e](...t));return null!==o?o:this.receiver[e]}const o=this.accessorNameFor(e);if(void 0!==o){this.handler.pushAddress(this.accessorAddress(e));try{return Reflect.get(this.record.stateObject,o,n)}finally{this.handler.popAddress()}}if(this.isBase){if(Object.prototype.hasOwnProperty.call(t,e))return tt(this.handler,this.accessorAddress(e)),t[e];const o=this.record.stateObject[e];if("function"==typeof o)return o.bind(this.authorThis(t,n))}return this.receiver[this.resolveTreePath(e,Ht(this.record,e))]}set(t,e,n,o){if("string"!=typeof e)return Reflect.set(t,e,n);const r=this.accessorNameFor(e);if(void 0!==r){this.record.setterKeys.has(r)||$(`Cannot write to "${r}" on mounted <${this.record.component.tagName.toLowerCase()}>: the accessor has no setter. Add a setter or write to the underlying state paths instead.`),this.handler.pushAddress(this.accessorAddress(e)),this.handler.beginUntrack();try{return Reflect.set(this.record.stateObject,r,n,this.authorThis(t,o))}finally{this.handler.endUntrack(),this.handler.popAddress()}}if(this.isBase&&Object.prototype.hasOwnProperty.call(t,e)){if(this.authorFacing&&"readonly"!==this.handler.mutability){null===this.listIndex&&this.hostIndexes(),this.handler.pushAddress(A(f(this.markerParentPath),this.listIndex));try{this.receiver[this.markerParentPath+c+e]=n}finally{this.handler.popAddress()}return!0}return t[e]=n,!0}return this.receiver[this.resolveTreePath(e,Gt(this.record,e))]=n,!0}has(t,e){if("string"!=typeof e)return Reflect.has(t,e);if("$"===e[0]||"#"===e[0])return!1;if(void 0!==this.accessorNameFor(e))return!0;if(this.isBase){if(Object.prototype.hasOwnProperty.call(t,e))return!0;if("function"==typeof this.record.stateObject[e])return!0}try{return Ht(this.record,e),!0}catch{return!1}}}function je(t,e,n,o){const r=e.pathInfo.path,s=r===t.markerBasePath,a=s?function(t,e){let n=ge.get(t);if(void 0===n&&(n={byListIndex:new WeakMap,noIndex:null},ge.set(t,n)),null===e)return n.noIndex??={...t.privateSnapshot};let o=n.byListIndex.get(e);return void 0===o&&(o={...t.privateSnapshot},n.byListIndex.set(e,o)),o}(t,e.listIndex):{};return new Proxy(a,new Ie(t,r,e.listIndex,e.listIndex??ke(t),s,n,o))}function Ce(t){if(null===ke(t))return t.component[t.stateProp];let e=we.get(t);if(void 0===e){const n={row:null};we.set(t,e=[Ne(t,n),n])}return e[0]}function Ne(t,e){const n=()=>{const n=ve(t);return void 0!==e&&we.get(t)?.[0]!==a&&n.listIndex!==e.row&&Pe(t),n},o=()=>{const e=n();return xe(t,e?.listIndex??null)&&Pe(t),e?.listIndex.indexes??[]},r=(e,n)=>-1===n.indexOf(d)?n:"partial"===Y(n).wildcardType?Qt(e,n,o()):-1===n.indexOf("#")&&xe(t,ke(t))?Pe(t):n,s=(e,o)=>{let r;const s=n();return t.parentStateElement.createState(e,t=>{r=t[M](s,()=>o(t))}),r},a=new Proxy({},{get(e,n){if("string"!=typeof n||"then"===n)return;if("$getAll"===n||"$setAll"===n||"$resolve"===n||"$postUpdate"===n)return function(t,e,n,o,r){return"$postUpdate"===e?e=>n("readonly",n=>n.$postUpdate(r(e,Ht(t,e)))):(r,s,...a)=>{const i="$setAll"===e||"$resolve"===e&&a.length>0,c=i?Gt(t,r):Ht(t,r),l=Jt(0,r,c,"$resolve"===e?s??[]:s,o());return n(i?"writable":"readonly",t=>t[e](c,l,...a))}}(t,n,s,o,r);const a=wt(n,e=>r(e,Ht(t,e)),t=>s("readonly",e=>e[n](...t)));if(null!==a)return a;const i=e=>e["$"===n[0]?n:r(n,Ht(t,n))],c=s("readonly",i);return"$"===n[0]||t.getterKeys.has(n)||"function"!=typeof t.stateObject[n]?c:function(...t){return s("writable",e=>i(e).apply(this,t))}},set:(e,n,o)=>("string"==typeof n&&s("writable",e=>{e["$"===n[0]?n:r(n,Gt(t,n))]=o}),!0),has(e,n){if("string"!=typeof n||"$"===n[0]||"#"===n[0])return!1;if(Object.prototype.hasOwnProperty.call(t.stateObject,n))return!0;try{return Ht(t,n),!0}catch{return!1}}});return a}function Me(t,e){const n=ae(e);null!==n&&n.stateProp!==t.stateProp&&$(`A mount scope is already initialized on this component for "${n.stateProp}" — one <wcs-state bind-component> per component (v2). Merge the "${t.stateProp}" wiring into "${n.stateProp}" or split the component.`),null!==n&&E(e).dispose(),se(e,t),e instanceof ShadowRoot&&K(e,t.parentStateElement),function(t,e){const n=(e,n)=>Xt(t,e,n);D(e);const o=N(t.component);be(t,o);const r=e instanceof ShadowRoot?e:e.getRootNode();B(r,e,void 0,n),z(e,o,n)}(t,e),function(t){if(t.exports.size>0||null===t.rootEntry)return;const e=new Set([...t.getterKeys,...t.setterKeys]);for(const n of e){let e;try{e=Ht(t,n)}catch{continue}const o=e.indexOf(c+t.marker);if(-1===o)continue;const r=e.slice(0,o+1+t.marker.length),s=e.slice(r.length+1),a=e.slice(0,o)+c+s,i=f(a);if(i.wildcardCount!==t.delta)continue;const l={markerTerminalPath:r,suffix:s,markerPath:e,exportedPath:a};t.exports.set(a,l),fe(t.parentStateElement,i.parentPath,i.lastSegment,!0).holders.add({ref:new WeakRef(t),entry:l}),t.parentStateElement.addDynamicDependency(e,a),Q?.markExported(t.parentStateElement,a)}t.parentStateElement.markHasMounts?.()}(t),function(t){const e=N(t.component);if(t.delta>0&&null===e)return;const n=t.component.tagName.toLowerCase();for(const o of t.exports.values()){const r=`${n}|${o.exportedPath}`;if(de.has(r))continue;const s=f(o.exportedPath);let a;t.parentStateElement.createState("readonly",t=>{t[M](e,()=>{a=t[s.parentPath]})}),null!=a&&s.lastSegment in Object(a)&&(de.add(r),console.warn(`[@wcstack/state] [wcs/mount-export-shadowed] <${n}>.${t.stateProp}.${o.suffix} is exported at "${o.exportedPath}" but the tree already has that key, so readers outside the component get the tree value. Remove the tree key or rename the accessor. See docs/state-overlay-export-design.md X1.`))}}(t),me(t),L(e,Promise.resolve())}function Ae(t,e){const n=Oe(t,e).rebindAddresses();R(n),me(t)}function Oe(t,e){const n=E(e),o=N(t.component);return be(t,o),n.forEachActiveBindingNode(t=>W(t,o)),n}function Re(t){for(let e=t.parentNode;null!==e;e=e.parentNode){const t=ae(e);if(null!==t)return Re(t.component),void Oe(t,e)}}function Ee(t,e){if(function(t){const e=te.get(t);return void 0!==e&&e.size>0}(e))for(const n of ce(e)){if(!We(n.component,t))continue;const e=oe(n);null!==e&&Ae(n,e)}}function We(t,e){for(let n=e.firstNode;null!==n;n=n.nextSibling){if(n===t||n.contains(t))return!0;if(n===e.lastNode)break}return!1}const Ke={read(t,e,n,o){if(!0===t.hasMounts&&35===e.pathInfo.lastSegment.charCodeAt(0)){const r=le(t,e.pathInfo.path);if(null!==r)return je(r,e,n,o)}return P},readMissing(t,e,n,o,r){if(null===n){if(vt(t.rootNode??null,e.pathInfo.path))return;return P}if(!0===t.hasMounts){const n=pe(t,e.parentAddress.pathInfo.path,e.pathInfo.lastSegment,e.listIndex);if(null!==n)return function(t,e,n,o,r){const s=je(t,A(f(e.markerTerminalPath),n),o,r);return Reflect.get(s,e.suffix)}(n.record,n.entry,e.listIndex,o,r)}return P},write(t,e){if(!0===t.hasGraftedVolumes){const n=e.pathInfo.path,o=function(t,e){const n=kt.get(t);if(void 0===n||0===n.size)return null;const o=e+c;for(const t of n)if(t.startsWith(o))return t;return null}(t,n);null!==o&&$(`Cannot replace "${n}" wholesale: a volume is mounted at "${o}" under it (D22). Replacing an ancestor of a mount point silently discards the grafted data while its accessors remain. Write "${o}" itself, or individual fields inside "${n}", instead.`)}return P},writeMissing(t,e,n,o,r,s,a){if(!0===t.hasMounts){const n=pe(t,e.parentAddress.pathInfo.path,e.pathInfo.lastSegment,e.listIndex);if(null!==n)return function(t,e,n,o,r,s){const a=je(t,A(f(e.markerTerminalPath),n),r,s);return Reflect.set(a,e.suffix,o)}(n.record,n.entry,e.listIndex,r,s,a)}return P},indexShift(t,e){const n=t.stateElement,o=e.pathInfo.path;if(!0===n.hasMounts&&-1!==o.indexOf("#")){const t=le(n,o);if(null!==t)return function(t,e){const n=e.lastIndexOf("#");if(-1===n)return t.delta;const o=e.indexOf(c,n);if((-1===o?e.slice(n):e.slice(n,o))!==t.marker)return t.delta;const r=-1===o?e:e.slice(0,o),s=-1===o?"":e.slice(o+1),a=t.accessorBySuffixByMarkerParent.get(r)?.get(s);return void 0!==a?a.indexShift:t.delta}(t,o)}return 0},handlerScope(t,e,n,o,r){if(!0!==t.hasMounts)return r;const s=function(t,e){let n=t;for(;null!==n&&n!==e;){const t=Yt.get(n);if(void 0!==t)return t;n=n.parentNode}return Yt.get(e)??null}(e,n);if(null===s)return r;const a=s.indexShiftByLoopElementPath.get(o.pathInfo.path);return void 0!==a?r-a:0},updated(t,e,n){const o=function(t){return jt.get(t)??Ct}(t);for(const r of o){const o=new Set,s={};for(const n of e){if(n.absolutePathInfo.stateElement!==t)continue;const e=n.absolutePathInfo.pathInfo.path;if(-1!==e.indexOf("#"))continue;const a=xt(r.mountPath,r.injections,e);if(null===a||""===a)continue;o.add(a);const i=n.absolutePathInfo.pathInfo.wildcardCount;if(i>0&&null!==n.listIndex){const t=T(n.listIndex,i);(s[a]??=[]).push(t)}}if(o.size>0)try{r.callback.call(It(r.mountPath,n,r.injections),Array.from(o),s)}catch(t){console.error(`[@wcstack/state] volume "${r.mountPath}" $updatedCallback threw.`,t)}}},suppressPathDiagnostic:(t,e)=>vt(!1===t.isConnected?null:t.rootNode??null,e),rowReused(t,e){Ee(e,t)}};let Le=!1;const De=new WeakMap;function Be(t){let e=De.get(t);return void 0===e&&(e={graftInfo:null,initializing:!1,mountPath:null,slotRootNode:null,detachedFrom:null},De.set(t,e)),e}function ze(t,e){null!==e.slotRootNode&&(!function(t,e,n){const o=$t.get(t);o?.get(e)===n&&o.set(e,null)}(e.slotRootNode,e.mountPath,t),e.slotRootNode=null)}function Te(t,e,n){if(e.slotRootNode===n)return!0;const o=e.mountPath;try{bt(n,o,t)}catch{return console.error(`[@wcstack/state] <${S.tagNames.state} mount="${o}"> will not graft: another volume already holds the "${o}" slot on this root. Keep one volume per mount path.`),!1}return F(n)?.markHasVolume?.(),e.slotRootNode=n,!0}async function Fe(t,e){const n=t,o=t.connectedRootNode,r=n.getAttribute("mount");let s;try{!function(t){0===t.length&&$('"mount" requires a non-empty tree path.');const e=f(t);for(const n of e.segments)0===n.length&&$(`"mount" path "${t}" has an empty segment.`),n===d&&$(`"mount" path "${t}" must be static (wildcards are not allowed).`),(n.includes("$")||n.includes("#")||n.includes("@"))&&$(`"mount" path "${t}" must not use reserved characters ($, #, @).`)}(r),s=function(t,e){const n=[],o=new Set;let r;try{r=H(t)}catch(t){$(`[wcs/mount-path-invalid] <${S.tagNames.state} mount="${e}"> has an invalid ${S.bindAttributeName}: ${t instanceof Error?t.message:String(t)}`)}for(const t of r){if(t.propSegments[0]!==l)continue;const r=t.propSegments.slice(1),s=t.statePathInfo,a=n=>$(`[wcs/mount-path-invalid] <${S.tagNames.state} mount="${e}"> "${t.propName}: ${t.statePathName}": ${n}`);1===r.length&&r[0]&&r[0]!==d&&"$"!==r[0][0]&&"#"!==r[0][0]||a(`inject one key at a time ("${l}.<key>: path"); change "mount" to move the whole volume.`),(s.wildcardCount>0||"$"===s.path[0]||"#"===s.path[0])&&a("the injected path must be a static path on the root tree (a volume has no loop context)."),(t.inFilters.length>0||t.outFilters.length>0)&&a("an injection takes no filters."),t.propModifiers.some(t=>t!==u)&&a(`an injection accepts only #${u}.`),o.has(r[0])&&a(`"${r[0]}" is injected twice.`),o.add(r[0]),n.push({innerSegments:r,outerPathInfo:s,readonly:t.propModifiers.includes(u)})}return n.sort((t,e)=>e.innerSegments.length-t.innerSegments.length),n}(n.getAttribute(S.bindAttributeName)??"",r),n.hasAttribute("bind-component")&&$('"mount" cannot be combined with "bind-component".'),n.hasAttribute("enable-ssr")&&console.warn(`[@wcstack/state] <${S.tagNames.state} mount="${r}"> ignores "enable-ssr" — snapshots are per root tree (the root state element aggregates volume data).`),bt(o,r,t),F(o)?.markHasVolume?.(),e.mountPath=r,e.slotRootNode=o}catch(e){throw t.settleInitialization(),e}e.initializing=!0,null===F(o)&&function(t,e){const n=()=>{if(null!==F(t))return;const n=t.querySelectorAll(S.tagNames.state);for(const t of n)if(!t.hasAttribute("mount")&&!t.hasAttribute("bind-component"))return;console.error(`[@wcstack/state] <${S.tagNames.state} mount="${e}"> has no root state tree to graft onto (D11). A volume mounts onto the root tree — add a root <${S.tagNames.state}> to this root node (an empty <${S.tagNames.state}></${S.tagNames.state}> is enough). If the root is added dynamically later, the graft will still complete and this report can be ignored.`)},o=t.ownerDocument??t;"loading"===o.readyState?o.addEventListener("DOMContentLoaded",()=>queueMicrotask(n),{once:!0}):setTimeout(n,0)}(o,r);const a=n=>{e.graftInfo=n,t.markInitialized(),null===n&&ze(t,e),t.settleInitialization()};let i;try{await Promise.resolve(),i=await t.loadStateFromSource()}catch(t){return console.error(`[@wcstack/state] volume "${r}" failed to load.`,t),void a(null)}const c=t.connectedRootNode??null;null!==c&&Te(t,e,c)?function(t,e,n,o,r,s,a=[]){const i={mountPath:n,volumeState:o,injections:a,onGrafted:r,acquireSlot:s};if(null!==e)return void yn(e,i);$n(),function(t,e){if(Mt.has(t))return void At(e);let n=Nt.get(t);void 0===n&&(n=[],Nt.set(t,n)),n.push(e)}(t,i)}(c,F(c),r,i,a,()=>Te(t,e,c),s):a(null)}const Ve={order:20,connecting(t){if(!t.hasAttribute("mount"))return null;const e=Be(t);if(e.initializing){const n=t.connectedRootNode;if(null!=n&&e.detachedFrom===n)try{bt(n,e.mountPath,t),F(n)?.markHasVolume?.(),e.slotRootNode=n}catch{}return e.detachedFrom=null,o}return Fe(t,e)},reconnecting(t){if(!t.hasAttribute("mount"))return!1;const e=Be(t),n=t.connectedRootNode??null;return null!==e.graftInfo&&null!==n&&F(n)===e.graftInfo.rootStateElement&&pn(e.graftInfo,"$connectedCallback"),!0},replacingState(t){if(!0!==De.get(t)?.initializing)return;const e=t.getAttribute("mount");$(`Cannot replace the state of <${S.tagNames.state} mount="${e}"> after it has loaded: a volume's data is copied into the root tree when it grafts, so a new state would never reach the page. Write the paths under "${e}" on the root state instead.`)},initializeFailed(t,e){!function(t){Mt.add(t);const e=Nt.get(t);if(void 0!==e){Nt.delete(t);for(const t of e)At(t)}}(e)},initializeFailureCleared(t,e){!function(t){Mt.delete(t)}(e)},disconnecting(t){if(!t.hasAttribute("mount"))return!1;const e=Be(t);return null!==e.graftInfo&&pn(e.graftInfo,"$disconnectedCallback"),!0!==t.initialized&&(e.detachedFrom=e.slotRootNode,ze(t,e)),t.clearConnectedRootNode(),!0}};let qe=!1;const _e=new WeakMap;function Ge(t,e){let n=_e.get(t);n||(n=new Set,_e.set(t,n)),n.add(e)}const He=new WeakMap;const Ue=new WeakMap,Xe=new WeakMap;const Je=new WeakMap;const Qe={isComplete:function(t,e){return!0===_e.get(t)?.has(e)},isDeclared:function(t,e){return!0===He.get(t)?.has(e)},rememberOverwrittenObject:function(t,e,n){let o=Ue.get(t);o||(o=new Map,Ue.set(t,o)),o.has(e)||o.set(e,n)},recordInjectedKey:function(t,e,n){let o=Xe.get(t);o||(o=new Map,Xe.set(t,o));let r=o.get(e);r||(r=new Set,o.set(e,r)),r.add(n)},rememberOverwrittenValue:function(t,e,n,o){let r=Je.get(t);r||(r=new Map,Je.set(t,r));let s=r.get(e);s||(s=new Map,r.set(e,s)),s.has(n)||s.set(n,o)}};function Ye(t){return function(t){const e=Object.getPrototypeOf(t),n=Object.create(e),o=Object.getOwnPropertyDescriptors(t);for(const t in o){const e=o[t];!1===e.writable&&(e.writable=!0)}return Object.defineProperties(n,o),n}(t)}const Ze=new WeakMap;class tn{_innerStateElement;constructor(t,e){this._innerStateElement=function(t,e){const n=Ze.get(t);return n?n.get(e)??null:null}(t,e)??$("State element not found for web component.")}get(t,e,n){if("string"==typeof e){let t;return this._innerStateElement.createState("readonly",n=>{t=n[e]}),t}return Reflect.get(t,e,n)}set(t,e,n,o){return"string"==typeof e?(this._innerStateElement.createState("writable",t=>{t[e]=n}),!0):Reflect.set(t,e,n,o)}}const en=t=>()=>t;function nn(t,e,n,o){!function(t,e,n){let o=Ze.get(t);o||(o=new Map,Ze.set(t,o)),o.set(e,n)}(e,n,t),t.setInitialState(Ye(o));const r=function(t,e){const n=new tn(t,e);return new Proxy({},n)}(e,n);Object.defineProperty(e,n,{get:en(r),enumerable:!0,configurable:!0}),Ge(e,n),on(e,n)}function on(t,e){if(m in t){const n=t[m];"function"==typeof n?n.call(t,e).catch(t=>{$(`Error in ${m}: ${t instanceof Error?t.message:String(t)}`)}):$(`${m} is not a function.`)}}const rn=new Set;function sn(t,e){rn.has(t)||(rn.add(t),console.warn(`[@wcstack/state] [wcs/mount-own-key-shadow] ${e} See docs/state-mount-design.md §4-3.`))}function an(t){!function(t){const e=t.component.tagName.toLowerCase(),n=t.stateProp;let o=null;for(const r of t.entries){if(0===r.innerSegments.length)continue;const s=r.innerSegments[0];o??=k(t.stateObject);const a=o[s];let i;if(t.getterKeys.has(s)||t.setterKeys.has(s)||"function"==typeof a?.get||"function"==typeof a?.set)i="an accessor";else if("function"==typeof a?.value)i="a method";else{if(t.mappedKeys.has(s)||t.injectedKeys.has(s)||!Object.prototype.hasOwnProperty.call(t.stateObject,s))continue;i="an own data key"}const l=r.innerSegments.join(c);sn(`${e}|${n}|${l}|entry`,`<${e}>.${n} declares "${s}" as ${i}, which hides the mounted entry "${n}.${l}: ${r.outerPathInfo.path}" (the host value never reaches it). Rename one of them.`)}}(t);const e=Object.keys(t.privateSnapshot);if(0===e.length)return;const n=t.component.tagName.toLowerCase(),o=t.stateProp;let r,s=!1;for(const a of e){if(null===t.rootEntry)continue;if(s||(r=cn(t),s=!0),"object"!=typeof r||null===r||!(a in r))continue;const e=t.rootEntry.outerPathInfo.path;sn(`${n}|${o}|${a}|root`,`<${n}>.${o}.${a} is private and hides the mounted tree key "${e}.${a}" (${o}: ${e}). Remove the default to read the tree, or rename it to keep it private.`)}}function cn(t){const e=t.rootEntry,n=N(t.component);if(e.outerPathInfo.wildcardCount>0&&null===n)return;let o;return t.parentStateElement.createState("readonly",t=>{t[M](n,()=>{o=t[e.outerPathInfo.path]})}),o}const ln=new WeakMap;function un(t,e){t.landInitialization(),$(e)}async function dn(t,e){const n=t;if(n.hasAttribute("bind-component")){const s=n.parentNode,a=s instanceof ShadowRoot?s.host:s instanceof Element?s:null,i=a?_(a):null;null!==a&&null!==i||$(`"bind-component" requires <${S.tagNames.state}> to be a direct child of a custom element.`),s instanceof ShadowRoot||a.hasAttribute(S.bindAttributeName)||un(t,`A plain (unwired) Light DOM "bind-component" is not supported. Attach a shadow root to <${i}>, or mount it from the host (data-wcs="${n.getAttribute("bind-component")}: path").`);const c=["state","src","json"].filter(t=>n.hasAttribute(t));null!==n.querySelector('script[type="module"]')&&c.push('<script type="module">'),c.length>0&&$(`"bind-component" cannot be combined with ${c.join(", ")}. The component's "${n.getAttribute("bind-component")}" property is the only state source.`);const l=n.getAttribute("bind-component");!function(t,e){let n=He.get(t);n||(n=new Set,He.set(t,n)),n.add(e)}(a,l);const u=I(a);null===u&&$(`CustomElementRegistry is unavailable for <${i}>.`),await u.whenDefined(i.toLowerCase()),a.hasAttribute(S.bindAttributeName)&&await G(a),l in a||$(`Component does not have property "${l}" for state binding.`);let d=a[l];"object"==typeof d&&null!==d||$(`Component property "${l}" is not an object for state binding.`);const f=function(t,e){const n=Ue.get(t);if(!n)return;const o=n.get(e);return n.delete(e),o}(a,l);if(void 0!==f&&function(t,e){if(!t.hasAttribute(S.bindAttributeName))return!1;const n=V(t);if(null===n)return!1;for(const t of n)if(1===t.propSegments.length&&t.propSegments[0]===e)return!0;return!1}(a,l)&&(a[l]=f,d=f),e.boundComponent=a,e.boundComponentStateProp=l,t.setBoundComponent(a,l),s instanceof ShadowRoot||(V(a)??[]).some(t=>t.propSegments[0]===l)||un(t,`A plain (unwired) Light DOM "bind-component" is not supported. Attach a shadow root to <${i}>, or mount it from the host (data-wcs="${l}: path").`),a.hasAttribute(S.bindAttributeName)){const c=(V(a)??[]).filter(t=>t.propSegments[0]===l);if(c.length>0){const u=F(a.getRootNode())??un(t,`No state tree found on this root for mount host <${i}>.`);let f=(o=a,r=l,Zt.get(o)?.get(r)??null);const h=null!==f;if(null===f&&(!function(t,e,n){const o=Je.get(t)?.get(e);if(void 0!==o){for(const[t,e]of o)n[t]=e;Je.get(t).delete(e)}}(a,l,d),f=Lt(a,l,c,u,d,function(t,e){return Xe.get(t)?.get(e)}(a,l)),an(f)),e.mountRecord=f,n.parentNode!==s)return;try{Me(f,s instanceof ShadowRoot?s:a)}catch(e){throw t.landInitialization(),e}if(!h){const t=Ne(f);Object.defineProperty(a,l,{get:()=>t,enumerable:!0,configurable:!0}),Ge(a,l)}return on(a,l),function(t){const e=Et.filter(e=>void 0!==t.stateObject[e]);for(const n of t.getterKeys)-1!==n.indexOf(p)&&e.push(`"${n}"`);if(0===e.length)return;const n=`${t.component.tagName.toLowerCase()}|${t.stateProp}`;Wt.has(n)||(Wt.add(n),console.warn(`[@wcstack/state] [wcs/mount-dollar-declaration] <${n.split("|")[0]}>.${t.stateProp} declares ${e.join(", ")}, which mounted components do not run. Declare them on the root state instead (a volume <wcs-state mount="..."> can host $watch / $listKeys / $updatedCallback; $recursion and "**" getters expand against the root tree). See docs/state-mount-design.md §4-6.`))}(f),void Kt(f,"$connectedCallback",()=>Ce(f))}}nn(t,e.boundComponent,e.boundComponentStateProp,d)}var o,r}const fn={order:30,preparing(t){if(!t.hasAttribute("bind-component"))return null;const e=function(t){let e=ln.get(t);return void 0===e&&(e={boundComponent:null,boundComponentStateProp:null,mountRecord:null},ln.set(t,e)),e}(t);return dn(t,e).then(()=>null!==e.mountRecord&&(t.markInitialized(),t.settleInitialization(),!0))},reconnecting(t){const e=ln.get(t);if(void 0===e||null===e.mountRecord)return!1;const n=e.mountRecord,o=t.parentNode;return queueMicrotask(()=>{null!=t.connectedRootNode&&Ae(n,o)}),t.isConnected&&(Re(n.component),Oe(n,o)),Kt(n,"$connectedCallback",()=>Ce(n)),!0},disconnecting(t){const e=ln.get(t);if(void 0===e||null===e.mountRecord)return!1;const n=e.mountRecord;return Kt(n,"$disconnectedCallback",()=>Ce(n)),function(t){const e=we.get(t);void 0!==e&&(e[1].row=ke(t),we.delete(t))}(n),me(e.mountRecord),t.clearConnectedRootNode(),!0}};let hn=!1;function pn(t,e){const n=t.volumeState[e];"function"==typeof n&&t.rootStateElement.createState("writable",o=>{const r=n.call(It(t.mountPath,o,t.injections));r instanceof Promise&&r.catch(n=>{console.error(`[@wcstack/state] volume "${t.mountPath}" ${e} failed.`,n)})})}function mn(t,e,n,o){const r=n[g];if(void 0!==r){const n=J(e),s=[],a=new Set;let i=0;for(const[n,c]of Object.entries(r)){const r=St(e,o,n,!1),l=function(t,n,...r){c.call(It(e,this,o),t,n,...r)};s.push({path:r,pathInfo:f(r),handler:l,order:1e6+i++}),a.add(r),t.setPathInfo(r,"prop","watch")}s.length>0&&(n.addEntries(t,s),t.addVolumeWatchPaths?.(a),n.start(t))}const s=n[y];if(void 0!==s){const n=new Map;for(const[t,r]of Object.entries(s))n.set(St(e,o,t,!1),r);t.mergeVolumeListKeys?.(n)}const a=n[h];"function"==typeof a&&(!function(t,e){let n=jt.get(t);void 0===n&&(n=[],jt.set(t,n)),n.push(e),t.markHasVolume?.()}(t,{mountPath:e,injections:o,callback:a}),t.enableUpdatedCallback?.());for(const t of["$commandTokens","$eventTokens","$on","$errorCallback"])void 0!==n[t]&&console.warn(`[@wcstack/state] volume "${e}" declares ${t}, which volumes do not support. Declare it on the root state instead.`)}function gn(t,e,n,o=[]){x(n),function(t,e,n,o){const r=0===o.length?null:k(n);for(const t of o){const n=t.innerSegments[0],o=r[n];void 0===o||"function"!=typeof o.get&&"function"!=typeof o.set&&"function"!=typeof o.value||$(`[wcs/mount-path-invalid] Volume "${e}" declares "${n}" as an accessor or a method and also injects it ("${l}.${n}: ${t.outerPathInfo.path}"). Rename one of them.`)}const s=n[g];if(void 0!==s){"object"==typeof s&&null!==s||$(`${g} must be an object mapping state paths to handler functions.`);const t=J(e);for(const[e,n]of Object.entries(s))"function"!=typeof n&&$(`${g} entry "${e}" must be a function.`),t.assertValidPath(e)}const i=n[y];if(void 0!==i){"object"==typeof i&&null!==i||$(`${y} must be an object mapping list paths to key specs.`);for(const[n,r]of Object.entries(i)){(0===n.length||"string"!=typeof r&&"function"!=typeof r)&&$(`${y} entry "${n}" must map a list path to a field name or a key function.`);const s=St(e,o,n,!1);t.listKeys?.has(s)&&$(`${y} entry "${s}" is declared by both the root and a volume (or two volumes). Keep exactly one.`)}}void 0!==n[a]&&$(`Volume "${e}" declares ${a}, which volumes do not support yet. Declare the stream on the root state.`),void 0!==n.$scan&&$(`Volume "${e}" declares $scan, which volumes do not support yet. Declare the scan on the root state.`),void 0!==n[w]&&$(`Volume "${e}" declares ${w}, which volumes do not support yet. Declare the recursion anchor on the root state — the anchor path is resolved against the root tree.`);for(const t of Object.keys(k(n)))-1!==t.indexOf(p)&&$(`Volume "${e}" declares "${t}", which uses "${p}". Volumes do not support recursive getters yet — declare them on the root state.`)}(t,e,n,o);const{data:r,accessors:s}=function(t,e){const n={},o=new Map;for(const[r,s]of Object.entries(k(t)))r.startsWith("$")||e.has(r)||("function"!=typeof s.get&&"function"!=typeof s.set?"function"!=typeof s.value&&(n[r]=s.value):o.set(r,s));return{data:n,accessors:o}}(n,new Set(o.map(t=>t.innerSegments[0]))),i=f(e),u=!0===t.hydratedFromSsr;t.createState("writable",t=>{if(1===i.segments.length&&e in t){if(u)return;$(`Volume mount "${e}" collides with an existing key on the root tree. Remove the root key or mount the volume elsewhere.`)}let n="";for(let e=0;e<i.segments.length-1;e++){const o=i.segments[e],r=""===n?o in t:void 0!==t[n+c+o];n=""===n?o:n+c+o,r||(t[n]={})}if(i.segments.length>1&&void 0!==t[e]){if(u)return;$(`Volume mount "${e}" collides with an existing key on the root tree. Remove the root key or mount the volume elsewhere.`)}t[e]=r}),function(t,e){let n=kt.get(t);void 0===n&&(n=new Set,kt.set(t,n)),n.add(e)}(t,e),t.markHasGraftedVolumes?.();for(const[n,r]of s){const s=e+c+n,a=r.get,i=r.set,l={enumerable:!1,configurable:!0};"function"==typeof a&&(l.get=function(){return a.call(It(e,this,o))}),"function"==typeof i&&(l.set=function(t){i.call(It(e,this,o),t)}),t.defineTreeAccessor(s,l)}mn(t,e,n,o);const d=n.$connectedCallback;return"function"==typeof d&&t.createState("writable",t=>{let n;try{n=d.call(It(e,t,o))}catch(t){return void console.error(`[@wcstack/state] volume "${e}" $connectedCallback failed.`,t)}n instanceof Promise&&n.catch(t=>{console.error(`[@wcstack/state] volume "${e}" $connectedCallback failed.`,t)})}),{rootStateElement:t,mountPath:e,volumeState:n,injections:o}}function yn(t,e){if(!e.acquireSlot())return void e.onGrafted(null);let n=null;try{n=gn(t,e.mountPath,e.volumeState,e.injections)}catch(t){console.error(`[@wcstack/state] volume "${e.mountPath}" failed to graft.`,t)}finally{e.onGrafted(n)}}let wn=!1;function $n(){wn||(wn=!0,Le||(Le=!0,v("scopes",Ke),X(ie)),qe||(qe=!0,t("scopes",Ve)),hn||(hn=!0,t("bindComponent",fn),q(Qe)),Ot=yn,U(bn))}function bn(t,e){(function(t){const e=$t.get(t);return void 0!==e&&e.size>0})(t)&&e.markHasVolume?.(),function(t,e){Mt.delete(t);const n=Nt.get(t);if(void 0===n||0===n.length||null===Ot)return;Nt.delete(t);const o=Ot;queueMicrotask(()=>{for(const t of n)o(e,t)})}(t,e)}const vn={name:"scopes",install(){$n(),ht||(ht=!0,t("dcc",ft))}};export{vn as default,vn as scopes};
1
+ import{r as t,l as e,a as n,C as o}from"../chunks/lifecycleHooks.js";import{k as r,l as s,a,m as i,D as c,V as l,n as u,W as d,g as f,o as h,R as p,p as m,i as g,q as y,r as w}from"../chunks/pathDiagnostics.js";import{r as $,d as b}from"../chunks/errorGuidance.js";import{r as v,g as k,N as P}from"../chunks/getAllPropertyDescriptors.js";import{c as S}from"../chunks/filterRegistry.js";import{n as x}from"../chunks/declarationAliases.js";import{q as I,u as j,t as C,v as N,w as M,j as A,i as O,x as R,y as E,z as W,A as K,B as L,C as D,D as B,E as z,F as T,o as F,G as V,H as q,I as G,J as _,K as H,L as U,M as X}from"../chunks/binder.js";import{a as J,r as Q}from"../chunks/featureBridge.js";import{p as Y}from"../chunks/diagnosticsHooks.js";import{g as Z,a as tt,c as et}from"../chunks/checkDependency.js";const nt={written:function(t,e,n){const o=t.bindableEventMap,r=o[e.path],s="string"==typeof r,a=s?r:e.segments.length>1&&-1===e.path.indexOf("#")?o[e.segments[0]]:void 0;if("string"!=typeof a)return;const i=t.rootNode;i instanceof ShadowRoot&&i.host.dispatchEvent(new CustomEvent(a,{detail:s&&void 0!==n?n.value:void 0,bubbles:!0}))}};let ot=!1;function rt(t){return function(){const e=this.stateElement;if(!e)return;if(!0!==e.initialized)return;let n;try{e.createState("readonly",e=>{n=e[t]})}catch(e){return void console.warn(`[@wcstack/state] DCC getter "${t}" failed:`,e)}return n}}function st(t){return function(e){const n=this.stateElement;n&&(!0!==n.initialized?n.initializePromise.then(()=>{n.createState("writable",n=>{n[t]=e})}):n.createState("writable",n=>{n[t]=e}))}}function at(t,e){return e?function(...e){const n=this.stateElement;if(n)return n.initializePromise.then(()=>{let o;return n.createStateAsync("writable",async n=>{o=await n[t](...e)}).then(()=>o)})}:function(...e){const n=this.stateElement;if(n)return n.initializePromise.then(()=>{let o;return n.createState("writable",n=>{o=n[t](...e)}),o})}}function it(t){return t.startsWith("$")}function ct(t,e){return Object.keys(t).filter(n=>{if(n.startsWith("$")||"constructor"===n)return!1;const o="function"==typeof t[n].value;return"method"===e?o:!o})}function lt(t,e){const n=t[e];if(void 0===n)return null;Array.isArray(n)||$(`${e} must be an array of strings.`);const o=[],r=new Set;for(const t of n)"string"==typeof t&&0!==t.length||$(`${e} entries must be non-empty strings.`),t.startsWith("$")&&$(`${e} entry "${t}" must not start with "$" (internal properties are not exposed on the component).`),r.has(t)&&$(`${e} entry "${t}" is duplicated.`),r.add(t),o.push(t);return o}function ut(t){x(t);const e=lt(t,r)??[],n=lt(t,s)??[],o=k(t),i=function(t){const e=t[a];return"object"!=typeof e||null===e?new Set:new Set(Object.keys(e))}(t),c=[];for(const t of e){const e=o[t];if(void 0===e){if(i.has(t)){c.push(t);continue}$(`${r} entry "${t}" is not declared on the state.${b(t,ct(o,"value"))}`)}"function"==typeof e.value&&$(`${r} entry "${t}" is a method. Declare it in ${s} instead.`)}for(const t of n){const e=o[t];void 0===e&&$(`${s} entry "${t}" is not declared on the state.${b(t,ct(o,"method"))}`),"function"!=typeof e.value&&$(`${s} entry "${t}" is not a method. Declare it in ${r} instead.`)}return{bindables:e,commands:n,streamBackedBindables:c}}function dt(t,e,n){const o=t.tagName.toLowerCase();o.includes("-")||$(`DCC: "${o}" is not a valid custom element name (must contain a hyphen).`);const s=I(t);null!==s&&"function"==typeof s.define||$(`DCC: CustomElementRegistry is unavailable for "${o}".`),s.get(o)&&$(`DCC: "${o}" is already registered. A custom element name can only be defined once.`);const a=document.createElement("template"),c=a.content.ownerDocument;for(const t of Array.from(e.childNodes))a.content.appendChild(c.importNode(t,!0));const l=e.mode,{bindables:u,commands:d,streamBackedBindables:f}=ut(n),h=u.length>0||d.length>0?function(t,e,n=[]){const o={protocol:"wc-bindable",version:1,properties:e.map(e=>({name:e,event:`${t}:${e}-changed`,getter:t=>t.target[e]})),inputs:e.map(t=>({name:t}))};if(0===n.length)return o;const r=n.map(t=>({name:t,async:!0}));return{...o,commands:r}}(o,u,d):null,p=u.length>0?function(t,e){const n={};for(const o of e)n[o]=`${t}:${o}-changed`;return n}(o,u):{},m=S.tagNames.state,g=class extends HTMLElement{static template=a;static shadowRootMode=l;static wcBindable=h;static bindableEventMap=p;_shadow=null;_ensureShadow(){if(null!==this._shadow)return this._shadow;if(this.hasAttribute(i))return null;this._shadow=this.attachShadow({mode:g.shadowRootMode}),this._shadow.appendChild(g.template.content.cloneNode(!0));const t=I(this._shadow);return null!==t&&j(t,this._shadow),this._shadow}connectedCallback(){const t=this._ensureShadow();if(null!==t&&Object.keys(g.bindableEventMap).length>0){const e=t.querySelector(m);e?(ot||(ot=!0,v("dcc",nt)),e.setBindableEventMap(g.bindableEventMap)):console.warn(`[@wcstack/state] DCC: "${o}" declares ${r} but its template has no <${S.tagNames.state}>. Change events will not be dispatched.`)}}get stateElement(){return this._ensureShadow()?.querySelector(m)??null}},y=k(n);for(const[t,e]of Object.entries(y)){if(it(t))continue;const n={configurable:!0,enumerable:!0};if("function"==typeof e.value){const o="AsyncFunction"===e.value.constructor?.name;n.value=at(t,o)}else n.get=rt(t),n.set=st(t);Object.defineProperty(g.prototype,t,n)}for(const t of f)Object.defineProperty(g.prototype,t,{configurable:!0,enumerable:!0,get:rt(t),set:st(t)});s.define(o,g)}async function ft(t,o,r){const s=t;try{s.hasAttribute("bind-component")&&$(`"bind-component" cannot be used inside a [${i}] host. DCC state comes from the template, not from a component property.`);const a=await async function(t,o){if(t.hasAttribute("src")){const n=t.getAttribute("src");if(n.endsWith(".js"))return await e(n);$(`DCC: Unsupported src type: ${n}`)}const r=t.querySelector('script[type="module"]');if(r)return await n(r,o.tagName.toLowerCase());$(`DCC: No state source found for "${o.tagName.toLowerCase()}".`)}(s,o);dt(o,r,a),t.markTreeless(),t.markInitialized(),t.clearConnectedRootNode(),t.settleInitialization()}catch(e){t.failInitializeLoudly(e)}}const ht={order:10,connecting(t){const e=t.parentNode;return e instanceof ShadowRoot&&e.host.hasAttribute(i)?ft(t,e.host,e):null}};let pt=!1;function mt(t,e){if(e.length>t.length)return!1;for(let n=0;n<e.length;n++)if(t[n]!==e[n])return!1;return!0}function gt(t,e){for(const n of t)if(mt(e,n.innerSegments))return n;return null}function yt(t,e){const n=e.slice(t.innerSegments.length);return 0===n.length?t.outerPathInfo.path:t.outerPathInfo.path+c+n.join(c)}const wt=new Map([["$eq",[0]],["$eqPath",[0,1]],["$eqIndex",[0]],["$dependOn",[0]],["$trackDependency",[0]]]);function $t(t,e,n){const o=wt.get(t);return void 0===o?null:(...t)=>{const r=t.slice();for(let t=0;t<o.length;t++){const n=o[t];"string"==typeof r[n]&&(r[n]=e(r[n]))}return n(r)}}const bt=new WeakMap;function vt(t,e,n){let o=bt.get(t);void 0===o&&(o=new Map,bt.set(t,o));const r=o.get(e);null!=r&&$(`Volume slot "${e}" is already mounted on this tree.`),o.set(e,n)}function kt(t,e){if(null===t)return!1;const n=bt.get(t);if(void 0===n||0===n.size)return!1;for(const t of n.keys())if(e===t||e.startsWith(t+c)||t.startsWith(e+c))return!0;return!1}const Pt=new WeakMap;const St=[];function xt(t,e,n,o){if(e.length>0){const r=n.split(c),s=gt(e,r);if(null!==s)return o&&s.readonly&&$(`[wcs/mount-readonly] volume "${t}" cannot write "${n}": it is injected read-only ("${l}.${s.innerSegments.join(c)}#${u}: ${s.outerPathInfo.path}"). Write "${s.outerPathInfo.path}" on the root, or drop #${u} from the injection.`),yt(s,r)}return t+c+n}function It(t,e,n){let o=-1,r=null;for(const t of e){const e=t.outerPathInfo.path;e.length<=o||(n===e?(o=e.length,r=t.innerSegments.join(c)):n.startsWith(e+c)&&(o=e.length,r=t.innerSegments.join(c)+n.slice(e.length)))}if(t.length>o){if(n===t)return"";if(n.startsWith(t+c))return n.slice(t.length+1)}return r}function jt(t,e,n=St){return new Proxy({},{get(o,r){if("string"==typeof r&&"then"!==r){if("$"===r[0]){if("$postUpdate"===r||"$getAll"===r){const o=r;return(r,...s)=>e[o](xt(t,n,r,!1),...s)}if("$setAll"===r)return(o,...r)=>e.$setAll(xt(t,n,o,!0),...r);if("$resolve"===r)return(o,...r)=>e.$resolve(xt(t,n,o,r.length>1),...r);const o=$t(r,e=>xt(t,n,e,!1),t=>e[r](...t));return null!==o?o:e[r]}return e[xt(t,n,r,!1)]}},set:(o,r,s)=>"string"!=typeof r||("$"===r[0]?(e[r]=s,!0):(e[xt(t,n,r,!0)]=s,!0)),has:(t,e)=>"string"==typeof e&&"$"!==e[0]&&"#"!==e[0]})}const Ct=new WeakMap,Nt=[];const Mt=new WeakMap,At=new WeakSet;function Ot(t){console.error(`[@wcstack/state] volume "${t.mountPath}" was not grafted — the root state element on this root node failed to initialize (its own diagnostic is reported separately). The volume is not at fault: fix the root <wcs-state>.`),t.onGrafted(null)}let Rt=null;let Et=0;const Wt=["$watch",a,"$scan","$listKeys",h,"$commandTokens","$eventTokens","$on","$recursion","$errorCallback"],Kt=new Set;function Lt(t,e,n){const o=t.stateObject[e];if("function"==typeof o)try{const r=o.call(n());r instanceof Promise&&r.catch(n=>{console.error(`[@wcstack/state] mounted <${t.component.tagName.toLowerCase()}> ${e} failed.`,n)})}catch(n){console.error(`[@wcstack/state] mounted <${t.component.tagName.toLowerCase()}> ${e} failed.`,n)}}function Dt(t,e,n,o,r,s=new Set){0===n.length&&$(`Cannot build a mount record without host bindings for "${e}".`),x(r);const a=[],i=new Set;let l=null;for(const t of n){const e=t.propSegments.slice(1),n=e.join(c);i.has(n)&&$("Duplicate mapping rule for web component."),i.add(n);const o={innerSegments:e,outerPathInfo:t.statePathInfo,readonly:!0===t.propModifiers?.includes(u)};a.push(o),0===e.length&&(l=o)}a.sort((t,e)=>e.innerSegments.length-t.innerSegments.length);const d=++Et,f=`#m${d}`,{getterKeys:h,setterKeys:p}=function(t){const e=new Set,n=new Set,o=k(t);for(const[t,r]of Object.entries(o))"function"==typeof r.get&&e.add(t),"function"==typeof r.set&&n.add(t);return{getterKeys:e,setterKeys:n}}(r),m=new Set;for(const t of a)1===t.innerSegments.length&&m.add(t.innerSegments[0]);const g={};for(const t of Object.keys(r))t.startsWith("$")||h.has(t)||p.has(t)||"function"!=typeof r[t]&&(s.has(t)||m.has(t)||(g[t]=r[t]));return{id:d,marker:f,component:t,stateProp:e,parentStateElement:o,entries:a,rootEntry:l,delta:null===l?0:l.outerPathInfo.wildcardCount,markerBasePath:null===l?f:l.outerPathInfo.path+c+f,stateObject:r,getterKeys:h,setterKeys:p,injectedKeys:s,mappedKeys:m,hasReadonlyEntries:a.some(t=>t.readonly),privateSnapshot:g,accessorBySuffixByMarkerParent:new Map,indexShiftByLoopElementPath:new Map,addedGetterPaths:new Set,exports:new Map}}function Bt(t){const e=t.indexOf(c);return-1===e?t:t.slice(0,e)}function zt(t,e){const n=gt(t.entries,e);return null===n?null:yt(n,e)}function Tt(t,e){return t.markerBasePath+c+e}function Ft(t,e,n,o){let r=t.accessorBySuffixByMarkerParent.get(e);void 0===r&&(r=new Map,t.accessorBySuffixByMarkerParent.set(e,r));const s=e+c+n;r.set(n,{accessorName:o,indexShift:f(s).wildcardCount-f(o).wildcardCount}),t.getterKeys.has(o)&&(t.parentStateElement.getterPaths?.add(s),t.addedGetterPaths.add(s))}function Vt(t,e){return!t.injectedKeys.has(e)&&(!t.getterKeys.has(e)&&"function"==typeof t.stateObject[e]||!t.mappedKeys.has(e)&&(Object.prototype.hasOwnProperty.call(t.stateObject,e)&&!t.getterKeys.has(e)&&!t.setterKeys.has(e)))}function qt(t,e){return`Path "${e}" in <${t.component.tagName.toLowerCase()}> does not resolve: it is not an own key of the component state and no mount entry covers it (mounted prefixes: ${t.entries.filter(t=>t.innerSegments.length>0).map(t=>t.innerSegments.join(c)).join(", ")}). Mount it from the host ("${t.stateProp}: path" / "${t.stateProp}.${Bt(e)}: path") or declare the key on the component state.`}const Gt=/^\$(\d+)$/;function _t(t,e){if(!t.hasReadonlyEntries)return null;const n=e[0];if("$"===n||"#"===n)return null;if(t.getterKeys.has(e)||t.setterKeys.has(e))return null;const o=Bt(e);if(t.getterKeys.has(o)||t.setterKeys.has(o)||Vt(t,o))return null;const r=function(t,e){return gt(t.entries,e)}(t,e.split(c));return null!==r&&r.readonly?r:null}function Ht(t,e){const n=_t(t,e);if(null!==n){const o=0===n.innerSegments.length?"":c+n.innerSegments.join(c);$(`[wcs/mount-readonly] <${t.component.tagName.toLowerCase()}> cannot write "${e}": it is mounted read-only ("${t.stateProp}${o}#${u}: ${n.outerPathInfo.path}"). Write it on the host, or drop #${u} from the mount.`)}return Ut(t,e)}function Ut(t,e){const n=e[0];if("$"===n||"#"===n)return e;if(t.getterKeys.has(e)||t.setterKeys.has(e))return function(t,e){const n=e.split(c);let o=-1;for(let t=n.length-1;t>=0;t--)if(n[t]===d){o=t;break}if(-1===o)return Ft(t,t.markerBasePath,e,e),Tt(t,e);if(Vt(t,n[0]))return Ft(t,t.markerBasePath,e,e),Tt(t,e);const r=n.slice(0,o+1),s=n.slice(o+1),a=zt(t,r);null===a&&$(qt(t,e)),0===s.length&&$(`Wildcard-terminal accessor "${e}" on mounted <${t.component.tagName.toLowerCase()}> is not supported: it translates to a marker-terminal path where the mount overlay would shadow the accessor. Declare the row value as a getter on the host tree, or back it with a component-own array (a private key makes the whole path private).`);const i=a+c+t.marker;return Ft(t,i,s.join(c),e),i+c+s.join(c)}(t,e);const o=Bt(e);if(t.getterKeys.has(o)||t.setterKeys.has(o))return Tt(t,e);if(Vt(t,o))return Tt(t,e);const r=zt(t,e.split(c));if(null!==r)return r;$(qt(t,e))}const Xt=new Set(["prop","radio","checkbox"]);function Jt(t,e,n){let o;const r=Gt.exec(e.statePathName);if(null!==r){const s=function(t,e){if(void 0===e)return t.delta;const n=Ut(t,e);return f(n).wildcardCount-f(e).wildcardCount}(t,n);o=0===s?e.statePathName:`$${Number(r[1])+s}`}else if(o=Ut(t,e.statePathName),"for"===e.bindingType){const n=f(o).wildcardCount-e.statePathInfo.wildcardCount;t.indexShiftByLoopElementPath.set(o+c+d,n)}const s=e.propModifiers,a=null===r&&Array.isArray(s)&&Xt.has(e.bindingType??"")&&!s.includes(u)&&null!==_t(t,e.statePathName);return o!==e.statePathName||a?{...e,statePathName:o,statePathInfo:f(o),...a?{propModifiers:[...s,u]}:{}}:e}function Qt(t,e,n,o,r){if(void 0===o)return;const s=f(n).wildcardCount-f(e).wildcardCount;return 0===s?o:(r.length<s&&$(`Cannot resolve "${e}" from this mount: the mounted prefix has ${s} wildcard(s) but the host context provides only ${r.length} index(es).`),[...r.slice(0,s),...o])}function Yt(t,e,n){if(-1!==t.indexOf(d))return e;const o=e.split(c);let r=0;for(let t=0;t<o.length&&r<n.length;t++)o[t]===d&&(o[t]=String(n[r++]));return o.join(c)}const Zt=new WeakMap,te=new WeakMap;const ee=new WeakMap;const ne=new FinalizationRegistry(function(t){const e=t.byMarker.get(t.marker);if(void 0!==e&&void 0===e.deref()&&t.byMarker.delete(t.marker),void 0!==t.getterPaths)for(const e of t.addedGetterPaths)t.getterPaths.delete(e)}),oe=new WeakMap;function re(t){return oe.get(t)??null}let se=!1;function ae(t,e){se||(se=!0,C(t=>Zt.has(t)?t.host:null)),Zt.set(t,e),oe.set(e,t);let n=ee.get(e.parentStateElement);void 0===n&&(n=new Map,ee.set(e.parentStateElement,n)),n.set(e.marker,new WeakRef(e));let o=te.get(e.component);void 0===o&&(o=new Map,te.set(e.component,o));const r=o.get(e.stateProp)!==e;o.set(e.stateProp,e),r&&ne.register(e,{byMarker:n,marker:e.marker,getterPaths:e.parentStateElement.getterPaths,addedGetterPaths:e.addedGetterPaths}),e.parentStateElement.markHasMounts?.()}function ie(t){return Zt.get(t)??null}function ce(t){return le(t).map(t=>({marker:t.marker,componentTag:t.component.tagName.toLowerCase(),stateProp:t.stateProp,mountTable:t.entries.map(t=>({inner:t.innerSegments.join(c),outer:t.outerPathInfo.path})),delta:t.delta,privateKeys:Object.keys(t.privateSnapshot),getterKeys:[...t.getterKeys],exports:[...t.exports.keys()]}))}function le(t){const e=ee.get(t);if(void 0===e)return[];const n=[];for(const t of e.values()){const e=t.deref();void 0!==e&&n.push(e)}return n}function ue(t,e){const n=e.lastIndexOf("#");if(-1===n)return null;const o=ee.get(t);if(void 0===o)return null;const r=e.indexOf(c,n),s=-1===r?e.slice(n):e.slice(n,r),a=o.get(s);if(void 0===a)return null;const i=a.deref();return void 0===i?(o.delete(s),null):i}const de=new WeakMap,fe=new Set;function he(t,e,n,o){let r=de.get(t);if(void 0===r){if(!o)return null;r=new Map,de.set(t,r)}let s=r.get(e);if(void 0===s){if(!o)return null;s=new Map,r.set(e,s)}let a=s.get(n);if(void 0===a){if(!o)return null;a={holders:new Set,byListIndex:new WeakMap,noIndex:null},s.set(n,a)}return a}function pe(t,e){if(!t.component.isConnected)return!1;const n=N(t.component)?.listIndex??null;if(null===e)return null===n;let o=n;for(;null!==o;){if(o===e)return!0;o=o.parentListIndex}return!1}function me(t,e,n,o){const r=he(t,e,n,!1);if(null===r)return null;const s=null===o?r.noIndex:r.byListIndex.get(o)??null;if(null!==s){const t=function(t,e){const n=t.ref.deref();return void 0!==n&&pe(n,e)?n:null}(s,o);if(null!==t)return{record:t,entry:s.entry}}let a=null,i=null;for(const t of r.holders){const s=t.ref.deref();void 0!==s?pe(s,o)&&(null!==i&&$(`[wcs/mount-export-ambiguous] "${e}${c}${n}" is exported by two mounted components on the same instance: <${i.component.tagName.toLowerCase()}> and <${s.component.tagName.toLowerCase()}>. Mount only one of them there, or rename one accessor. See docs/state-overlay-export-design.md X4.`),a=t,i=s):r.holders.delete(t)}return null===a||null===i?null:(null===o?r.noIndex=a:r.byListIndex.set(o,a),{record:i,entry:a.entry})}function ge(t){const e=t.parentStateElement,n=N(t.component);if(!(!1===e.isConnected||t.delta>0&&null===n))for(const o of t.exports.values())e.createState("readonly",t=>{t[M](n,()=>{t.$postUpdate(o.exportedPath)})})}const ye=new WeakMap,we=new WeakMap,$e=new WeakMap,be=new WeakMap;function ve(t,e){we.set(t,e);const n=[];for(let t=e?.listIndex.parentListIndex??null;null!==t;t=t.parentListIndex)n.push(t);be.set(t,n)}function ke(t){return N(t.component)??we.get(t)??null}function Pe(t){return ke(t)?.listIndex??null}function Se(t){$(`The host row of <${t.component.tagName.toLowerCase()}> was removed.`)}function xe(t){for(;null!==t;t=t.parentListIndex)if(O(t))return!0;return!1}function Ie(t,e){return!t.component.isConnected&&(xe(e)||!0===be.get(t)?.some(t=>O(t)))}class je{record;markerParentPath;listIndex;hostRow;isBase;receiver;handler;authorFacing;constructor(t,e,n,o,r,s,a,i=!1){this.record=t,this.markerParentPath=e,this.listIndex=n,this.hostRow=o,this.isBase=r,this.receiver=s,this.handler=a,this.authorFacing=i}authorThis(t,e){return this.authorFacing?e:new Proxy(t,new je(this.record,this.markerParentPath,this.listIndex,this.hostRow,this.isBase,this.receiver,this.handler,!0))}accessorNameFor(t){return this.record.accessorBySuffixByMarkerParent.get(this.markerParentPath)?.get(t)?.accessorName}accessorAddress(t){return A(f(this.markerParentPath+c+t),this.listIndex)}hostIndexes(){const t=this.listIndex??Pe(this.record),e=this.hostRow??t;return(null===this.listIndex?e!==t||Ie(this.record,e):xe(e))&&Se(this.record),e?.indexes??[]}resolveTreePath(t,e){return-1===e.indexOf(d)||null!==this.listIndex&&0!==this.handler.addressStackLength&&"partial"!==Z(e).wildcardType&&!Ie(this.record,this.listIndex)?e:Yt(t,e,this.hostIndexes())}get(t,e,n){if("string"!=typeof e)return Reflect.get(t,e);if("then"===e)return;if("$"===e[0]){if("$postUpdate"===e)return t=>{this.receiver.$postUpdate(this.resolveTreePath(t,Ut(this.record,t)))};if("$getAll"===e||"$setAll"===e||"$resolve"===e){const t=this.record,n=this.hostIndexes(),o=this.receiver,r=this.handler,s=this.listIndex;if("$resolve"===e)return(e,r,...s)=>{const a=s.length>0?Ht(t,e):Ut(t,e),i=Qt(0,e,a,r??[],n);return o.$resolve(a,i,...s)};const a=e;return(e,i,...c)=>{const l="$setAll"===a?Ht(t,e):Ut(t,e),u=Qt(0,e,l,void 0===i&&"$getAll"===a&&null===s&&null===tt(r,f(l).wildcardPaths[0])?[]:i,n);return o[a](l,u,...c)}}const t=this.record,n=this.receiver,o=$t(e,e=>this.resolveTreePath(e,Ut(t,e)),t=>n[e](...t));return null!==o?o:this.receiver[e]}const o=this.accessorNameFor(e);if(void 0!==o){this.handler.pushAddress(this.accessorAddress(e));try{return Reflect.get(this.record.stateObject,o,n)}finally{this.handler.popAddress()}}if(this.isBase){if(Object.prototype.hasOwnProperty.call(t,e))return et(this.handler,this.accessorAddress(e)),t[e];const o=this.record.stateObject[e];if("function"==typeof o)return o.bind(this.authorThis(t,n))}return this.receiver[this.resolveTreePath(e,Ut(this.record,e))]}set(t,e,n,o){if("string"!=typeof e)return Reflect.set(t,e,n);const r=this.accessorNameFor(e);if(void 0!==r){this.record.setterKeys.has(r)||$(`Cannot write to "${r}" on mounted <${this.record.component.tagName.toLowerCase()}>: the accessor has no setter. Add a setter or write to the underlying state paths instead.`),this.handler.pushAddress(this.accessorAddress(e)),this.handler.beginUntrack();try{return Reflect.set(this.record.stateObject,r,n,this.authorThis(t,o))}finally{this.handler.endUntrack(),this.handler.popAddress()}}if(this.isBase&&Object.prototype.hasOwnProperty.call(t,e)){if(this.authorFacing&&"readonly"!==this.handler.mutability){null===this.listIndex&&this.hostIndexes(),this.handler.pushAddress(A(f(this.markerParentPath),this.listIndex));try{this.receiver[this.markerParentPath+c+e]=n}finally{this.handler.popAddress()}return!0}return t[e]=n,!0}return this.receiver[this.resolveTreePath(e,Ht(this.record,e))]=n,!0}has(t,e){if("string"!=typeof e)return Reflect.has(t,e);if("$"===e[0]||"#"===e[0])return!1;if(void 0!==this.accessorNameFor(e))return!0;if(this.isBase){if(Object.prototype.hasOwnProperty.call(t,e))return!0;if("function"==typeof this.record.stateObject[e])return!0}try{return Ut(this.record,e),!0}catch{return!1}}}function Ce(t,e,n,o){const r=e.pathInfo.path,s=r===t.markerBasePath,a=s?function(t,e){let n=ye.get(t);if(void 0===n&&(n={byListIndex:new WeakMap,noIndex:null},ye.set(t,n)),null===e)return n.noIndex??={...t.privateSnapshot};let o=n.byListIndex.get(e);return void 0===o&&(o={...t.privateSnapshot},n.byListIndex.set(e,o)),o}(t,e.listIndex):{};return new Proxy(a,new je(t,r,e.listIndex,e.listIndex??Pe(t),s,n,o))}function Ne(t){if(null===Pe(t))return t.component[t.stateProp];let e=$e.get(t);if(void 0===e){const n={row:null};$e.set(t,e=[Me(t,n),n])}return e[0]}function Me(t,e){const n=()=>{const n=ke(t);return void 0!==e&&$e.get(t)?.[0]!==a&&n.listIndex!==e.row&&Se(t),n},o=()=>{const e=n();return Ie(t,e?.listIndex??null)&&Se(t),e?.listIndex.indexes??[]},r=(e,n)=>-1===n.indexOf(d)?n:"partial"===Z(n).wildcardType?Yt(e,n,o()):-1===n.indexOf("#")&&Ie(t,Pe(t))?Se(t):n,s=(e,o)=>{let r;const s=n();return t.parentStateElement.createState(e,t=>{r=t[M](s,()=>o(t))}),r},a=new Proxy({},{get(e,n){if("string"!=typeof n||"then"===n)return;if("$getAll"===n||"$setAll"===n||"$resolve"===n||"$postUpdate"===n)return function(t,e,n,o,r){return"$postUpdate"===e?e=>n("readonly",n=>n.$postUpdate(r(e,Ut(t,e)))):(r,s,...a)=>{const i="$setAll"===e||"$resolve"===e&&a.length>0,c=i?Ht(t,r):Ut(t,r),l=Qt(0,r,c,"$resolve"===e?s??[]:s,o());return n(i?"writable":"readonly",t=>t[e](c,l,...a))}}(t,n,s,o,r);const a=$t(n,e=>r(e,Ut(t,e)),t=>s("readonly",e=>e[n](...t)));if(null!==a)return a;const i=e=>e["$"===n[0]?n:r(n,Ut(t,n))],c=s("readonly",i);return"$"===n[0]||t.getterKeys.has(n)||"function"!=typeof t.stateObject[n]?c:function(...t){return s("writable",e=>i(e).apply(this,t))}},set:(e,n,o)=>("string"==typeof n&&s("writable",e=>{e["$"===n[0]?n:r(n,Ht(t,n))]=o}),!0),has(e,n){if("string"!=typeof n||"$"===n[0]||"#"===n[0])return!1;if(Object.prototype.hasOwnProperty.call(t.stateObject,n))return!0;try{return Ut(t,n),!0}catch{return!1}}});return a}function Ae(t,e){const n=ie(e);null!==n&&n.stateProp!==t.stateProp&&$(`A mount scope is already initialized on this component for "${n.stateProp}" — one <wcs-state bind-component> per component (v2). Merge the "${t.stateProp}" wiring into "${n.stateProp}" or split the component.`),null!==n&&function(t){const e=E(t);e.dispose();const n=[],o=document.createTreeWalker(t);for(;o.nextNode();)e.handleAddedNode(o.currentNode,n,t=>{console.error("[@wcstack/state] a binding failed to start again on the mount scope's re-initialization.",t)});R(n)}(e),ae(e,t),e instanceof ShadowRoot&&K(e,t.parentStateElement),function(t,e,n){const o=(e,n)=>Jt(t,e,n);D(e,n?t=>function(t,e){for(let n=t;n!==e;n=n.parentNode)if(T(n))return!0;return!1}(t,e):void 0);const r=N(t.component);ve(t,r);const s=e instanceof ShadowRoot?e:e.getRootNode();B(s,e,void 0,o),z(e,r,o)}(t,e,null!==n),function(t){if(t.exports.size>0||null===t.rootEntry)return;const e=new Set([...t.getterKeys,...t.setterKeys]);for(const n of e){let e;try{e=Ut(t,n)}catch{continue}const o=e.indexOf(c+t.marker);if(-1===o)continue;const r=e.slice(0,o+1+t.marker.length),s=e.slice(r.length+1),a=e.slice(0,o)+c+s,i=f(a);if(i.wildcardCount!==t.delta)continue;const l={markerTerminalPath:r,suffix:s,markerPath:e,exportedPath:a};t.exports.set(a,l),he(t.parentStateElement,i.parentPath,i.lastSegment,!0).holders.add({ref:new WeakRef(t),entry:l}),t.parentStateElement.addDynamicDependency(e,a),Y?.markExported(t.parentStateElement,a)}t.parentStateElement.markHasMounts?.()}(t),function(t){const e=N(t.component);if(t.delta>0&&null===e)return;const n=t.component.tagName.toLowerCase();for(const o of t.exports.values()){const r=`${n}|${o.exportedPath}`;if(fe.has(r))continue;const s=f(o.exportedPath);let a;t.parentStateElement.createState("readonly",t=>{t[M](e,()=>{a=t[s.parentPath]})}),null!=a&&s.lastSegment in Object(a)&&(fe.add(r),console.warn(`[@wcstack/state] [wcs/mount-export-shadowed] <${n}>.${t.stateProp}.${o.suffix} is exported at "${o.exportedPath}" but the tree already has that key, so readers outside the component get the tree value. Remove the tree key or rename the accessor. See docs/state-overlay-export-design.md X1.`))}}(t),ge(t),L(e,Promise.resolve())}function Oe(t,e){const n=Re(t,e).rebindAddresses();R(n),ge(t)}function Re(t,e){const n=E(e),o=N(t.component);return ve(t,o),n.forEachActiveBindingNode(t=>W(t,o)),n}function Ee(t){for(let e=t.parentNode;null!==e;e=e.parentNode){const t=ie(e);if(null!==t)return Ee(t.component),void Re(t,e)}}function We(t,e){if(function(t){const e=ee.get(t);return void 0!==e&&e.size>0}(e))for(const n of le(e)){if(!Ke(n.component,t))continue;const e=re(n);null!==e&&Oe(n,e)}}function Ke(t,e){for(let n=e.firstNode;null!==n;n=n.nextSibling){if(n===t||n.contains(t))return!0;if(n===e.lastNode)break}return!1}const Le={read(t,e,n,o){if(!0===t.hasMounts&&35===e.pathInfo.lastSegment.charCodeAt(0)){const r=ue(t,e.pathInfo.path);if(null!==r)return Ce(r,e,n,o)}return P},readMissing(t,e,n,o,r){if(null===n){if(kt(t.rootNode??null,e.pathInfo.path))return;return P}if(!0===t.hasMounts){const n=me(t,e.parentAddress.pathInfo.path,e.pathInfo.lastSegment,e.listIndex);if(null!==n)return function(t,e,n,o,r){const s=Ce(t,A(f(e.markerTerminalPath),n),o,r);return Reflect.get(s,e.suffix)}(n.record,n.entry,e.listIndex,o,r)}return P},write(t,e){if(!0===t.hasGraftedVolumes){const n=e.pathInfo.path,o=function(t,e){const n=Pt.get(t);if(void 0===n||0===n.size)return null;const o=e+c;for(const t of n)if(t.startsWith(o))return t;return null}(t,n);null!==o&&$(`Cannot replace "${n}" wholesale: a volume is mounted at "${o}" under it (D22). Replacing an ancestor of a mount point silently discards the grafted data while its accessors remain. Write "${o}" itself, or individual fields inside "${n}", instead.`)}return P},writeMissing(t,e,n,o,r,s,a){if(!0===t.hasMounts){const n=me(t,e.parentAddress.pathInfo.path,e.pathInfo.lastSegment,e.listIndex);if(null!==n)return function(t,e,n,o,r,s){const a=Ce(t,A(f(e.markerTerminalPath),n),r,s);return Reflect.set(a,e.suffix,o)}(n.record,n.entry,e.listIndex,r,s,a)}return P},indexShift(t,e){const n=t.stateElement,o=e.pathInfo.path;if(!0===n.hasMounts&&-1!==o.indexOf("#")){const t=ue(n,o);if(null!==t)return function(t,e){const n=e.lastIndexOf("#");if(-1===n)return t.delta;const o=e.indexOf(c,n);if((-1===o?e.slice(n):e.slice(n,o))!==t.marker)return t.delta;const r=-1===o?e:e.slice(0,o),s=-1===o?"":e.slice(o+1),a=t.accessorBySuffixByMarkerParent.get(r)?.get(s);return void 0!==a?a.indexShift:t.delta}(t,o)}return 0},handlerScope(t,e,n,o,r){if(!0!==t.hasMounts)return r;const s=function(t,e){let n=t;for(;null!==n&&n!==e;){const t=Zt.get(n);if(void 0!==t)return t;n=n.parentNode}return Zt.get(e)??null}(e,n);if(null===s)return r;const a=s.indexShiftByLoopElementPath.get(o.pathInfo.path);return void 0!==a?r-a:0},updated(t,e,n){const o=function(t){return Ct.get(t)??Nt}(t);for(const r of o){const o=new Set,s={};for(const n of e){if(n.absolutePathInfo.stateElement!==t)continue;const e=n.absolutePathInfo.pathInfo.path;if(-1!==e.indexOf("#"))continue;const a=It(r.mountPath,r.injections,e);if(null===a||""===a)continue;o.add(a);const i=n.absolutePathInfo.pathInfo.wildcardCount;if(i>0&&null!==n.listIndex){const t=F(n.listIndex,i);(s[a]??=[]).push(t)}}if(o.size>0)try{r.callback.call(jt(r.mountPath,n,r.injections),Array.from(o),s)}catch(t){console.error(`[@wcstack/state] volume "${r.mountPath}" $updatedCallback threw.`,t)}}},suppressPathDiagnostic:(t,e)=>kt(!1===t.isConnected?null:t.rootNode??null,e),rowReused(t,e){We(e,t)}};let De=!1;const Be=new WeakMap;function ze(t){let e=Be.get(t);return void 0===e&&(e={graftInfo:null,initializing:!1,mountPath:null,slotRootNode:null,detachedFrom:null},Be.set(t,e)),e}function Te(t,e){null!==e.slotRootNode&&(!function(t,e,n){const o=bt.get(t);o?.get(e)===n&&o.set(e,null)}(e.slotRootNode,e.mountPath,t),e.slotRootNode=null)}function Fe(t,e,n){if(e.slotRootNode===n)return!0;const o=e.mountPath;try{vt(n,o,t)}catch{return console.error(`[@wcstack/state] <${S.tagNames.state} mount="${o}"> will not graft: another volume already holds the "${o}" slot on this root. Keep one volume per mount path.`),!1}return V(n)?.markHasVolume?.(),e.slotRootNode=n,!0}async function Ve(t,e){const n=t,o=t.connectedRootNode,r=n.getAttribute("mount");let s;try{!function(t){0===t.length&&$('"mount" requires a non-empty tree path.');const e=f(t);for(const n of e.segments)0===n.length&&$(`"mount" path "${t}" has an empty segment.`),n===d&&$(`"mount" path "${t}" must be static (wildcards are not allowed).`),(n.includes("$")||n.includes("#")||n.includes("@"))&&$(`"mount" path "${t}" must not use reserved characters ($, #, @).`)}(r),s=function(t,e){const n=[],o=new Set;let r;try{r=U(t)}catch(t){$(`[wcs/mount-path-invalid] <${S.tagNames.state} mount="${e}"> has an invalid ${S.bindAttributeName}: ${t instanceof Error?t.message:String(t)}`)}for(const t of r){if(t.propSegments[0]!==l)continue;const r=t.propSegments.slice(1),s=t.statePathInfo,a=n=>$(`[wcs/mount-path-invalid] <${S.tagNames.state} mount="${e}"> "${t.propName}: ${t.statePathName}": ${n}`);1===r.length&&r[0]&&r[0]!==d&&"$"!==r[0][0]&&"#"!==r[0][0]||a(`inject one key at a time ("${l}.<key>: path"); change "mount" to move the whole volume.`),(s.wildcardCount>0||"$"===s.path[0]||"#"===s.path[0])&&a("the injected path must be a static path on the root tree (a volume has no loop context)."),(t.inFilters.length>0||t.outFilters.length>0)&&a("an injection takes no filters."),t.propModifiers.some(t=>t!==u)&&a(`an injection accepts only #${u}.`),o.has(r[0])&&a(`"${r[0]}" is injected twice.`),o.add(r[0]),n.push({innerSegments:r,outerPathInfo:s,readonly:t.propModifiers.includes(u)})}return n.sort((t,e)=>e.innerSegments.length-t.innerSegments.length),n}(n.getAttribute(S.bindAttributeName)??"",r),n.hasAttribute("bind-component")&&$('"mount" cannot be combined with "bind-component".'),n.hasAttribute("enable-ssr")&&console.warn(`[@wcstack/state] <${S.tagNames.state} mount="${r}"> ignores "enable-ssr" — snapshots are per root tree (the root state element aggregates volume data).`),vt(o,r,t),V(o)?.markHasVolume?.(),e.mountPath=r,e.slotRootNode=o}catch(e){throw t.settleInitialization(),e}e.initializing=!0,null===V(o)&&function(t,e){const n=()=>{if(null!==V(t))return;const n=t.querySelectorAll(S.tagNames.state);for(const t of n)if(!t.hasAttribute("mount")&&!t.hasAttribute("bind-component"))return;console.error(`[@wcstack/state] <${S.tagNames.state} mount="${e}"> has no root state tree to graft onto (D11). A volume mounts onto the root tree — add a root <${S.tagNames.state}> to this root node (an empty <${S.tagNames.state}></${S.tagNames.state}> is enough). If the root is added dynamically later, the graft will still complete and this report can be ignored.`)},o=t.ownerDocument??t;"loading"===o.readyState?o.addEventListener("DOMContentLoaded",()=>queueMicrotask(n),{once:!0}):setTimeout(n,0)}(o,r);const a=n=>{e.graftInfo=n,t.markInitialized(),null===n&&Te(t,e),t.settleInitialization()};let i;try{await Promise.resolve(),i=await t.loadStateFromSource()}catch(t){return console.error(`[@wcstack/state] volume "${r}" failed to load.`,t),void a(null)}const c=t.connectedRootNode??null;null!==c&&Fe(t,e,c)?function(t,e,n,o,r,s,a=[]){const i={mountPath:n,volumeState:o,injections:a,onGrafted:r,acquireSlot:s};if(null!==e)return void wn(e,i);bn(),function(t,e){if(At.has(t))return void Ot(e);let n=Mt.get(t);void 0===n&&(n=[],Mt.set(t,n)),n.push(e)}(t,i)}(c,V(c),r,i,a,()=>Fe(t,e,c),s):a(null)}const qe={order:20,connecting(t){if(!t.hasAttribute("mount"))return null;const e=ze(t);if(e.initializing){const n=t.connectedRootNode;if(null!=n&&e.detachedFrom===n)try{vt(n,e.mountPath,t),V(n)?.markHasVolume?.(),e.slotRootNode=n}catch{}return e.detachedFrom=null,o}return Ve(t,e)},reconnecting(t){if(!t.hasAttribute("mount"))return!1;const e=ze(t),n=t.connectedRootNode??null;return null!==e.graftInfo&&null!==n&&V(n)===e.graftInfo.rootStateElement&&mn(e.graftInfo,"$connectedCallback"),!0},replacingState(t){if(!0!==Be.get(t)?.initializing)return;const e=t.getAttribute("mount");$(`Cannot replace the state of <${S.tagNames.state} mount="${e}"> after it has loaded: a volume's data is copied into the root tree when it grafts, so a new state would never reach the page. Write the paths under "${e}" on the root state instead.`)},initializeFailed(t,e){!function(t){At.add(t);const e=Mt.get(t);if(void 0!==e){Mt.delete(t);for(const t of e)Ot(t)}}(e)},initializeFailureCleared(t,e){!function(t){At.delete(t)}(e)},disconnecting(t){if(!t.hasAttribute("mount"))return!1;const e=ze(t);return null!==e.graftInfo&&mn(e.graftInfo,"$disconnectedCallback"),!0!==t.initialized&&(e.detachedFrom=e.slotRootNode,Te(t,e)),t.clearConnectedRootNode(),!0}};let Ge=!1;const _e=new WeakMap;function He(t,e){let n=_e.get(t);n||(n=new Set,_e.set(t,n)),n.add(e)}const Ue=new WeakMap;const Xe=new WeakMap,Je=new WeakMap;const Qe=new WeakMap;const Ye={isComplete:function(t,e){return!0===_e.get(t)?.has(e)},isDeclared:function(t,e){return!0===Ue.get(t)?.has(e)},rememberOverwrittenObject:function(t,e,n){let o=Xe.get(t);o||(o=new Map,Xe.set(t,o)),o.has(e)||o.set(e,n)},recordInjectedKey:function(t,e,n){let o=Je.get(t);o||(o=new Map,Je.set(t,o));let r=o.get(e);r||(r=new Set,o.set(e,r)),r.add(n)},rememberOverwrittenValue:function(t,e,n,o){let r=Qe.get(t);r||(r=new Map,Qe.set(t,r));let s=r.get(e);s||(s=new Map,r.set(e,s)),s.has(n)||s.set(n,o)}};function Ze(t){return function(t){const e=Object.getPrototypeOf(t),n=Object.create(e),o=Object.getOwnPropertyDescriptors(t);for(const t in o){const e=o[t];!1===e.writable&&(e.writable=!0)}return Object.defineProperties(n,o),n}(t)}const tn=new WeakMap;class en{_innerStateElement;constructor(t,e){this._innerStateElement=function(t,e){const n=tn.get(t);return n?n.get(e)??null:null}(t,e)??$("State element not found for web component.")}get(t,e,n){if("string"==typeof e){let t;return this._innerStateElement.createState("readonly",n=>{t=n[e]}),t}return Reflect.get(t,e,n)}set(t,e,n,o){return"string"==typeof e?(this._innerStateElement.createState("writable",t=>{t[e]=n}),!0):Reflect.set(t,e,n,o)}}const nn=t=>()=>t;function on(t,e,n,o){!function(t,e,n){let o=tn.get(t);o||(o=new Map,tn.set(t,o)),o.set(e,n)}(e,n,t),t.setInitialState(Ze(o));const r=function(t,e){const n=new en(t,e);return new Proxy({},n)}(e,n);Object.defineProperty(e,n,{get:nn(r),enumerable:!0,configurable:!0}),He(e,n),rn(e,n)}function rn(t,e){if(m in t){const n=t[m];"function"==typeof n?n.call(t,e).catch(t=>{$(`Error in ${m}: ${t instanceof Error?t.message:String(t)}`)}):$(`${m} is not a function.`)}}const sn=new Set;function an(t,e){sn.has(t)||(sn.add(t),console.warn(`[@wcstack/state] [wcs/mount-own-key-shadow] ${e} See docs/state-mount-design.md §4-3.`))}function cn(t){!function(t){const e=t.component.tagName.toLowerCase(),n=t.stateProp;let o=null;for(const r of t.entries){if(0===r.innerSegments.length)continue;const s=r.innerSegments[0];o??=k(t.stateObject);const a=o[s];let i;if(t.getterKeys.has(s)||t.setterKeys.has(s)||"function"==typeof a?.get||"function"==typeof a?.set)i="an accessor";else if("function"==typeof a?.value)i="a method";else{if(t.mappedKeys.has(s)||t.injectedKeys.has(s)||!Object.prototype.hasOwnProperty.call(t.stateObject,s))continue;i="an own data key"}const l=r.innerSegments.join(c);an(`${e}|${n}|${l}|entry`,`<${e}>.${n} declares "${s}" as ${i}, which hides the mounted entry "${n}.${l}: ${r.outerPathInfo.path}" (the host value never reaches it). Rename one of them.`)}}(t);const e=Object.keys(t.privateSnapshot);if(0===e.length)return;const n=t.component.tagName.toLowerCase(),o=t.stateProp;let r,s=!1;for(const a of e){if(null===t.rootEntry)continue;if(s||(r=ln(t),s=!0),"object"!=typeof r||null===r||!(a in r))continue;const e=t.rootEntry.outerPathInfo.path;an(`${n}|${o}|${a}|root`,`<${n}>.${o}.${a} is private and hides the mounted tree key "${e}.${a}" (${o}: ${e}). Remove the default to read the tree, or rename it to keep it private.`)}}function ln(t){const e=t.rootEntry,n=N(t.component);if(e.outerPathInfo.wildcardCount>0&&null===n)return;let o;return t.parentStateElement.createState("readonly",t=>{t[M](n,()=>{o=t[e.outerPathInfo.path]})}),o}const un=new WeakMap;function dn(t,e){t.landInitialization(),$(e)}async function fn(t,e){const n=t;if(n.hasAttribute("bind-component")){const s=n.parentNode,a=s instanceof ShadowRoot?s.host:s instanceof Element?s:null,i=a?_(a):null;null!==a&&null!==i||$(`"bind-component" requires <${S.tagNames.state}> to be a direct child of a custom element.`),s instanceof ShadowRoot||a.hasAttribute(S.bindAttributeName)||dn(t,`A plain (unwired) Light DOM "bind-component" is not supported. Attach a shadow root to <${i}>, or mount it from the host (data-wcs="${n.getAttribute("bind-component")}: path").`);const c=["state","src","json"].filter(t=>n.hasAttribute(t));null!==n.querySelector('script[type="module"]')&&c.push('<script type="module">'),c.length>0&&$(`"bind-component" cannot be combined with ${c.join(", ")}. The component's "${n.getAttribute("bind-component")}" property is the only state source.`);const l=n.getAttribute("bind-component");!function(t,e){let n=Ue.get(t);n||(n=new Set,Ue.set(t,n)),n.add(e)}(a,l);const u=I(a);null===u&&$(`CustomElementRegistry is unavailable for <${i}>.`);const d=t.connectGeneration;if(await u.whenDefined(i.toLowerCase()),a.hasAttribute(S.bindAttributeName)&&await H(a),t.connectGeneration!==d)return!0;l in a||$(`Component does not have property "${l}" for state binding.`);let f=a[l];"object"==typeof f&&null!==f||$(`Component property "${l}" is not an object for state binding.`);const h=function(t,e){const n=Xe.get(t);if(!n)return;const o=n.get(e);return n.delete(e),o}(a,l);if(void 0!==h&&function(t,e){if(!t.hasAttribute(S.bindAttributeName))return!1;const n=q(t);if(null===n)return!1;for(const t of n)if(1===t.propSegments.length&&t.propSegments[0]===e)return!0;return!1}(a,l)&&(a[l]=h,f=h),e.boundComponent=a,e.boundComponentStateProp=l,t.setBoundComponent(a,l),s instanceof ShadowRoot||(q(a)??[]).some(t=>t.propSegments[0]===l)||dn(t,`A plain (unwired) Light DOM "bind-component" is not supported. Attach a shadow root to <${i}>, or mount it from the host (data-wcs="${l}: path").`),a.hasAttribute(S.bindAttributeName)){const c=(q(a)??[]).filter(t=>t.propSegments[0]===l);if(c.length>0){const u=V(a.getRootNode())??dn(t,`No state tree found on this root for mount host <${i}>.`);let d=(o=a,r=l,te.get(o)?.get(r)??null);const h=null!==d;if(null===d&&(!function(t,e,n){const o=Qe.get(t)?.get(e);if(void 0!==o){for(const[t,e]of o)n[t]=e;Qe.get(t).delete(e)}}(a,l,f),d=Dt(a,l,c,u,f,function(t,e){return Je.get(t)?.get(e)}(a,l)),cn(d)),e.mountRecord=d,n.parentNode!==s)return!1;try{Ae(d,s instanceof ShadowRoot?s:a)}catch(e){throw t.landInitialization(),e}if(!h){const t=Me(d);Object.defineProperty(a,l,{get:()=>t,enumerable:!0,configurable:!0}),He(a,l)}return rn(a,l),function(t){const e=Wt.filter(e=>void 0!==t.stateObject[e]);for(const n of t.getterKeys)-1!==n.indexOf(p)&&e.push(`"${n}"`);if(0===e.length)return;const n=`${t.component.tagName.toLowerCase()}|${t.stateProp}`;Kt.has(n)||(Kt.add(n),console.warn(`[@wcstack/state] [wcs/mount-dollar-declaration] <${n.split("|")[0]}>.${t.stateProp} declares ${e.join(", ")}, which mounted components do not run. Declare them on the root state instead (a volume <wcs-state mount="..."> can host $watch / $listKeys / $updatedCallback; $recursion and "**" getters expand against the root tree). See docs/state-mount-design.md §4-6.`))}(d),Lt(d,"$connectedCallback",()=>Ne(d)),!1}}on(t,e.boundComponent,e.boundComponentStateProp,f)}var o,r;return!1}const hn={order:30,preparing(t){if(!t.hasAttribute("bind-component"))return null;const e=function(t){let e=un.get(t);return void 0===e&&(e={boundComponent:null,boundComponentStateProp:null,mountRecord:null},un.set(t,e)),e}(t);return fn(t,e).then(n=>!!n||null!==e.mountRecord&&(t.markInitialized(),t.settleInitialization(),!0))},reconnecting(t){const e=un.get(t);if(void 0===e||null===e.mountRecord)return!1;const n=e.mountRecord,o=t.parentNode;return queueMicrotask(()=>{null!=t.connectedRootNode&&Oe(n,o)}),t.isConnected&&(Ee(n.component),Re(n,o)),Lt(n,"$connectedCallback",()=>Ne(n)),!0},disconnecting(t){const e=un.get(t);if(void 0===e||null===e.mountRecord)return!1;const n=e.mountRecord;return Lt(n,"$disconnectedCallback",()=>Ne(n)),function(t){const e=$e.get(t);void 0!==e&&(e[1].row=Pe(t),$e.delete(t))}(n),ge(e.mountRecord),t.clearConnectedRootNode(),!0}};let pn=!1;function mn(t,e){const n=t.volumeState[e];"function"==typeof n&&t.rootStateElement.createState("writable",o=>{const r=n.call(jt(t.mountPath,o,t.injections));r instanceof Promise&&r.catch(n=>{console.error(`[@wcstack/state] volume "${t.mountPath}" ${e} failed.`,n)})})}function gn(t,e,n,o){const r=n[g];if(void 0!==r){const n=Q(e),s=[],a=new Set;let i=0;for(const[n,c]of Object.entries(r)){const r=xt(e,o,n,!1),l=function(t,n,...r){c.call(jt(e,this,o),t,n,...r)};s.push({path:r,pathInfo:f(r),handler:l,order:1e6+i++}),a.add(r),t.setPathInfo(r,"prop","watch")}s.length>0&&(n.addEntries(t,s),t.addVolumeWatchPaths?.(a),n.start(t))}const s=n[y];if(void 0!==s){const n=new Map;for(const[t,r]of Object.entries(s))n.set(xt(e,o,t,!1),r);t.mergeVolumeListKeys?.(n)}const a=n[h];"function"==typeof a&&(!function(t,e){let n=Ct.get(t);void 0===n&&(n=[],Ct.set(t,n)),n.push(e),t.markHasVolume?.()}(t,{mountPath:e,injections:o,callback:a}),t.enableUpdatedCallback?.());for(const t of["$commandTokens","$eventTokens","$on","$errorCallback"])void 0!==n[t]&&console.warn(`[@wcstack/state] volume "${e}" declares ${t}, which volumes do not support. Declare it on the root state instead.`)}function yn(t,e,n,o=[]){x(n),function(t,e,n,o){const r=0===o.length?null:k(n);for(const t of o){const n=t.innerSegments[0],o=r[n];void 0===o||"function"!=typeof o.get&&"function"!=typeof o.set&&"function"!=typeof o.value||$(`[wcs/mount-path-invalid] Volume "${e}" declares "${n}" as an accessor or a method and also injects it ("${l}.${n}: ${t.outerPathInfo.path}"). Rename one of them.`)}const s=n[g];if(void 0!==s){"object"==typeof s&&null!==s||$(`${g} must be an object mapping state paths to handler functions.`);const t=Q(e);for(const[e,n]of Object.entries(s))"function"!=typeof n&&$(`${g} entry "${e}" must be a function.`),t.assertValidPath(e)}const i=n[y];if(void 0!==i){"object"==typeof i&&null!==i||$(`${y} must be an object mapping list paths to key specs.`);for(const[n,r]of Object.entries(i)){(0===n.length||"string"!=typeof r&&"function"!=typeof r)&&$(`${y} entry "${n}" must map a list path to a field name or a key function.`);const s=xt(e,o,n,!1);t.listKeys?.has(s)&&$(`${y} entry "${s}" is declared by both the root and a volume (or two volumes). Keep exactly one.`)}}void 0!==n[a]&&$(`Volume "${e}" declares ${a}, which volumes do not support yet. Declare the stream on the root state.`),void 0!==n.$scan&&$(`Volume "${e}" declares $scan, which volumes do not support yet. Declare the scan on the root state.`),void 0!==n[w]&&$(`Volume "${e}" declares ${w}, which volumes do not support yet. Declare the recursion anchor on the root state — the anchor path is resolved against the root tree.`);for(const t of Object.keys(k(n)))-1!==t.indexOf(p)&&$(`Volume "${e}" declares "${t}", which uses "${p}". Volumes do not support recursive getters yet — declare them on the root state.`)}(t,e,n,o);const{data:r,accessors:s}=function(t,e){const n={},o=new Map;for(const[r,s]of Object.entries(k(t)))r.startsWith("$")||e.has(r)||("function"!=typeof s.get&&"function"!=typeof s.set?"function"!=typeof s.value&&(n[r]=s.value):o.set(r,s));return{data:n,accessors:o}}(n,new Set(o.map(t=>t.innerSegments[0]))),i=f(e),u=!0===t.hydratedFromSsr;t.createState("writable",t=>{if(1===i.segments.length&&e in t){if(u)return;$(`Volume mount "${e}" collides with an existing key on the root tree. Remove the root key or mount the volume elsewhere.`)}let n="";for(let e=0;e<i.segments.length-1;e++){const o=i.segments[e],r=""===n?o in t:void 0!==t[n+c+o];n=""===n?o:n+c+o,r||(t[n]={})}if(i.segments.length>1&&void 0!==t[e]){if(u)return;$(`Volume mount "${e}" collides with an existing key on the root tree. Remove the root key or mount the volume elsewhere.`)}t[e]=r}),function(t,e){let n=Pt.get(t);void 0===n&&(n=new Set,Pt.set(t,n)),n.add(e)}(t,e),t.markHasGraftedVolumes?.();for(const[n,r]of s){const s=e+c+n,a=r.get,i=r.set,l={enumerable:!1,configurable:!0};"function"==typeof a&&(l.get=function(){return a.call(jt(e,this,o))}),"function"==typeof i&&(l.set=function(t){i.call(jt(e,this,o),t)}),t.defineTreeAccessor(s,l)}gn(t,e,n,o);const d=n.$connectedCallback;return"function"==typeof d&&t.createState("writable",t=>{let n;try{n=d.call(jt(e,t,o))}catch(t){return void console.error(`[@wcstack/state] volume "${e}" $connectedCallback failed.`,t)}n instanceof Promise&&n.catch(t=>{console.error(`[@wcstack/state] volume "${e}" $connectedCallback failed.`,t)})}),{rootStateElement:t,mountPath:e,volumeState:n,injections:o}}function wn(t,e){if(!e.acquireSlot())return void e.onGrafted(null);let n=null;try{n=yn(t,e.mountPath,e.volumeState,e.injections)}catch(t){console.error(`[@wcstack/state] volume "${e.mountPath}" failed to graft.`,t)}finally{e.onGrafted(n)}}let $n=!1;function bn(){$n||($n=!0,De||(De=!0,v("scopes",Le),J(ce)),Ge||(Ge=!0,t("scopes",qe)),pn||(pn=!0,t("bindComponent",hn),G(Ye)),Rt=wn,X(vn))}function vn(t,e){(function(t){const e=bt.get(t);return void 0!==e&&e.size>0})(t)&&e.markHasVolume?.(),function(t,e){At.delete(t);const n=Mt.get(t);if(void 0===n||0===n.length||null===Rt)return;Mt.delete(t);const o=Rt;queueMicrotask(()=>{for(const t of n)o(e,t)})}(t,e)}const kn={name:"scopes",install(){bn(),pt||(pt=!0,t("dcc",ht))}};export{kn as default,kn as scopes};
2
2
  //# sourceMappingURL=scopes.js.map