@virid/vue 0.2.5 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,14 +1,12 @@
1
1
  /**
2
- * @virid/vue v0.2.5
2
+ * @virid/vue v0.3.1
3
3
  * Vue adapter for virid, projecting logic sovereignty to reactive UI
4
4
  */
5
- var y=Object.defineProperty;var W=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var K=Object.prototype.hasOwnProperty;var J=(t,e,r)=>e in t?y(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var s=(t,e)=>y(t,"name",{value:e,configurable:!0});var z=(t,e)=>{for(var r in e)y(t,r,{get:e[r],enumerable:!0})},B=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of F(e))!K.call(t,i)&&i!==r&&y(t,i,{get:()=>e[i],enumerable:!(o=W(e,i))||o.enumerable});return t};var Y=t=>B(y({},"__esModule",{value:!0}),t);var M=(t,e,r)=>J(t,typeof e!="symbol"?e+"":e,r);var se={};z(se,{Env:()=>oe,Inherit:()=>re,Listener:()=>ne,OnHook:()=>ee,Project:()=>Z,Responsive:()=>G,Use:()=>te,VuePlugin:()=>ie,Watch:()=>X,useController:()=>H});module.exports=Y(se);var T=require("@virid/core"),l={...T.VIRID_METADATA,RESPONSIVE:"virid:vue:responsive",LIFE_CIRCLE:"virid:vue:life-circle",HOOK:"virid:vue:hook",LISTENER:"virid:vue:listener",INHERIT:"virid:vue:inherit",ATTR:"virid:vue:attr",PROJECT:"virid:vue:project",WATCH:"virid:vue:watch"};var u=require("vue"),h=require("@virid/core");var w=null;function P(t){let e=s(r=>(r&&O(r),r),"bindResponsiveHook");t.addActivationHook(e),w=t}s(P,"activateApp");var g=new Proxy({},{get(t,e){return(...r)=>{if(!w)return console.warn(`[Virid Vue] App method "${String(e)}" called before initialization.`),e==="register"?()=>{console.warn("[Virid Vue] Cleanup ignored: source listener was never registered.")}:void 0;let o=w[e];if(typeof o=="function")return Reflect.apply(o,w,r)}}});var v=require("@virid/core");var S=new WeakMap;function I(t,e,r=""){if(t===null||typeof t!="object"&&typeof t!="function")return t;if(S.has(t))return S.get(t);let o=new Proxy(t,{get(i,n,c){let a=Reflect.get(i,n,c),d=r?`${r}.${String(n)}`:String(n);return typeof a=="function"?(...p)=>{if(!q(i,n)){let b=["[Virid Shield] Rejected",`Method: ${e}....${d}()`,"Reason: Unauthorized access to unsafe method."].join(`
6
- `);return v.MessageWriter.error(new Error(b)),null}let m=a.apply(i,p);return I(m,e,`${d}()`)}:I(a,e,d)},set(i,n){let c=r?`${r}.${String(n)}`:String(n),a=["[Virid Borrow Checker]","------------------------------------------------",`Component: ${e}`,`Code: ${e}....${c}`,"Result: Rejected","Reason: This object is write protected and cannot be modified.",`Stack: ${new Error().stack}`,"------------------------------------------------"].join(`
7
- `);return v.MessageWriter.error(new Error(a)),!1},deleteProperty(i,n){return v.MessageWriter.error(new Error(`[Virid Shield] Physical Protection:
8
- Prohibit Deletion of Component Attributes ${String(n)}`)),!1},defineProperty(){return v.MessageWriter.error(new Error(`[Virid Shield] Physical Protection:
9
- Prohibit redefining component attribute structure`)),!1}});return S.set(t,o),o}s(I,"createBorrowChecker");function q(t,e){if(new Set([Symbol.iterator,Symbol.asyncIterator,Symbol.toStringTag,"toString","valueOf","toJSON","constructor"]).has(e))return!0;let o=t.constructor?.name;if({Map:new Set(["get","has","keys","values","entries","forEach","size"]),Set:new Set(["has","keys","values","entries","forEach","size"]),Array:new Set(["length","map","filter","reduce","slice","find","includes","findIndex","every","some","at","join","concat","flat","flatMap","indexOf","lastIndexOf"]),String:new Set(["length","slice","substring","substr","split","includes","startsWith","endsWith","indexOf","replace","replaceAll","trim","toLowerCase","toUpperCase"])}[o]?.has(e))return!0;let n=Reflect.getMetadata(l.SAFE,t);return!!(n instanceof Set&&n.has(e))}s(q,"isShieldException");var _=class _{static set(e,r){return this.globalRegistry.has(e)?(h.MessageWriter.error(new Error(`[Virid UseController] Duplicate ID: Controller ${e} already exists`)),()=>!1):(this.globalRegistry.set(e,r),()=>(this.globalRegistry.delete(e),!0))}static get(e){return this.globalRegistry.has(e)?this.globalRegistry.get(e):(h.MessageWriter.error(new Error(`[Virid UseController] ID Not Found: No Controller found with ID: ${e}`)),null)}};s(_,"GlobalRegistry"),M(_,"globalRegistry",(0,u.shallowReactive)(new Map));var C=_;function V(t,e){Reflect.getMetadata(l.PROJECT,t)?.forEach(o=>{let{key:i,isAccessor:n,type:c,componentClass:a,source:d}=o,p,m=s(f=>{h.MessageWriter.error(new Error(`[Virid Project] Read-only: Property "${i}" in "${e.constructor.name}" is a protected projection.
10
- `))},"readOnlySetter");if(n){if(c==="component"){h.MessageWriter.error(new Error(`[Virid Project] Architecture Violation: Manual get/set is forbidden on ${a} projection "${i}". Please use functional source.`));return}let f=Object.getOwnPropertyDescriptor(t,i);p=(0,u.computed)({get:s(()=>f?.get?.call(e),"get"),set:s(E=>{f?.set?f.set.call(e,E):m(E)},"set")})}else p=(0,u.computed)({get:s(()=>{let f=c==="component",E=f?g.get(a):e,R=d(E);return f?I(R,a.name,i):R},"get"),set:m});let b=Object.getOwnPropertyDescriptor(e,i);b&&b.configurable===!1||Object.defineProperty(e,i,{get:s(()=>p.value,"get"),set:s(f=>p.value=f,"set"),enumerable:!0,configurable:!0})})}s(V,"bindProject");function j(t,e){let r=Reflect.getMetadata(l.WATCH,t)||[],o=[];return r.forEach(i=>{let{type:n,source:c,methodName:a,options:d,componentClass:p}=i,m=n==="component"?g.get(p):e;m&&!m.__ccs_processed__&&O(m);let b=s(()=>{try{return c(m)}catch(R){h.MessageWriter.error(R,`[Virid Watch] Getter error in ${a}`);return}},"getter"),f=e[a].bind(e),E=(0,u.watch)(b,(R,U)=>{f(R,U)},{...d});o.push(E)}),o}s(j,"bindWatch");function O(t){return!t||typeof t!="object"||t.__virid_responsive_processed__||(Object.defineProperty(t,"__virid_responsive_processed__",{value:!0,enumerable:!1}),(Reflect.getMetadata(l.RESPONSIVE,t)||[]).forEach(r=>{let o=r.key,i=Object.getOwnPropertyDescriptor(t,o),n=i?.get?.__virid_box__;if(n){let c=n.value,a=r.shallow?(0,u.shallowRef)(c):(0,u.ref)(c);Object.defineProperty(n,"value",{get:s(()=>a.value,"get"),set:s(d=>{a.value=d},"set"),enumerable:!0,configurable:!0})}else{if(i&&i.get)return;let c=t[o],a=r.shallow?(0,u.shallowRef)(c):(0,u.ref)(c);Object.defineProperty(t,o,{get:s(()=>a.value,"get"),set:s(d=>{a.value=d},"set"),enumerable:!0,configurable:!0})}}),Reflect.ownKeys(t).forEach(r=>{if(r==="__virid_responsive_processed__")return;let o=t[r];o&&typeof o=="object"&&O(o)})),t}s(O,"bindResponsive");function L(t,e){Reflect.getMetadata(l.LIFE_CIRCLE,t)?.forEach(o=>{let{hookName:i,methodName:n}=o,c=e[n].bind(e);switch(i){case"onMounted":(0,u.onMounted)(c);break;case"onUnmounted":(0,u.onUnmounted)(c);break;case"onUpdated":(0,u.onUpdated)(c);break;case"onActivated":(0,u.onActivated)(c);break;case"onDeactivated":(0,u.onDeactivated)(c);break;case"onSetup":c();break}})}s(L,"bindHooks");function k(t,e){Reflect.getMetadata(l.HOOK,t)?.forEach(o=>{let i=o.hookFactory();e[o.key]=i})}s(k,"bindUseHooks");function $(t,e){let r=Reflect.getMetadata(l.LISTENER,t)||[],o=[];return r.forEach(({key:i,messageClass:n,priority:c,single:a})=>{let d=e[i],p=s(function(f){let E=Array.isArray(f)?f[0]:f,R;if(!(E instanceof n))return h.MessageWriter.error(new Error(`[Virid Listener] Type Mismatch: Expected ${n.name}, but received ${E?.constructor.name}`)),null;if(E instanceof h.SingleMessage)a?R=Array.isArray(f)?[f[f.length-1]]:f:R=Array.isArray(f)?f:[f];else if(E instanceof h.EventMessage)R=[f];else throw new Error(`[Virid System] unknown Message Types: Message ${n.name} is not a subclass of SingleMessage or EventMessage!`);d.apply(e,R)},"wrappedHandler"),m={params:[n],targetClass:e.constructor,methodName:i,originalMethod:d};p.systemContext=m;let b=g.register(n,p,c);o.push(b)}),o}s($,"bindListener");function D(t,e){let r=Reflect.getMetadata(l.INHERIT,t);r&&r.forEach(({key:o,id:i,selector:n})=>{let c=(0,u.computed)(()=>{let a=C.get(i);return a?n?n(a):a:(h.MessageWriter.warn(`[Virid Inherit] Warning:
11
- Inherit target not found: ${i}`),null)});Object.defineProperty(e,o,{get:s(()=>{let a=c.value;return a?I(a,o,""):null},"get"),set:s(()=>{h.MessageWriter.error(new Error(`[Virid Inherit] No Modification:
12
- Attempted to set read-only Inherit property: ${o}`))},"set"),enumerable:!0,configurable:!0})})}s(D,"bindInherit");var A=require("vue");var x=require("@virid/core");function H(t,e){let r=g.get(t),o=e?.context||(0,A.useAttrs)();if(o&&Q(o,r),!Reflect.hasMetadata(l.CONTROLLER,t))return x.MessageWriter.error(new Error(`[Virid Controller] ${t.name} is not a Controller.Use @Controller to inject it.`)),null;let n=Object.getPrototypeOf(r);k(n,r),D(n,r),V(n,r);let c=$(n,r);L(n,r);let a=j(n,r),d=s(()=>!0,"unbindRegister");return e?.id&&(d=C.set(e.id,r)),(0,A.onUnmounted)(()=>{a.forEach(p=>p()),c.forEach(p=>p()),d()}),r}s(H,"useController");function Q(t,e){t&&typeof t=="object"&&Object.keys(t).forEach(r=>{Object.defineProperty(e,r,{get:s(()=>t[r],"get"),set:s(o=>{if(t[r]!==o)try{t[r]=o}catch(i){x.MessageWriter.error(i,`[Virid Context] Set Failed:
13
- "${r}" is only readable.`)}},"set"),enumerable:!0,configurable:!0})})}s(Q,"injectContext");var N=require("@virid/core");function X(t,e,r){return(o,i)=>{let n=Reflect.getMetadata(l.WATCH,o)||[];typeof e=="function"?n.push({type:"component",componentClass:t,source:e,options:r,methodName:i}):n.push({type:"local",componentClass:null,source:t,options:e,methodName:i}),Reflect.defineMetadata(l.WATCH,n,o)}}s(X,"Watch");function Z(t,e){return(r,o,i)=>{let n=Reflect.getMetadata(l.PROJECT,r)||[],c=!!(i?.get||i?.set);if(!t&&!e&&!c){N.MessageWriter.error(new Error("[Virid Project] Invalid Usage: @Project() can only be used on getter or setter."));return}let a={key:o,isAccessor:c,type:typeof e=="function"?"component":"local",componentClass:typeof e=="function"?t:null,source:typeof e=="function"?e:c?null:t};n.push(a),Reflect.defineMetadata(l.PROJECT,n,r)}}s(Z,"Project");function G(t=!1){return(e,r)=>{let o=Reflect.getMetadata(l.RESPONSIVE,e)||[];o.push({key:r,shallow:t}),Reflect.defineMetadata(l.RESPONSIVE,o,e)}}s(G,"Responsive");function ee(t){return(e,r)=>{let o=Reflect.getMetadata(l.LIFE_CIRCLE,e)||[];o.push({hookName:t,methodName:r}),Reflect.defineMetadata(l.LIFE_CIRCLE,o,e)}}s(ee,"OnHook");function te(t){return(e,r)=>{let o=Reflect.getMetadata(l.HOOK,e)||[];o.push({key:r,hookFactory:t}),Reflect.defineMetadata(l.HOOK,o,e)}}s(te,"Use");function re(t,e,r){return(o,i)=>{let n=Reflect.getMetadata(l.INHERIT,o)||[];n.push({key:i,token:t,id:e,selector:r}),Reflect.defineMetadata(l.INHERIT,n,o)}}s(re,"Inherit");function oe(){return(t,e)=>{}}s(oe,"Env");function ne({messageClass:t,priority:e=0,single:r=!0}){return(o,i)=>{let n=Reflect.getMetadata(l.LISTENER,o)||[];n.push({key:i,messageClass:t,priority:e,single:r}),Reflect.defineMetadata(l.LISTENER,n,o)}}s(ne,"Listener");var ie={name:"@virid/vue",install(t,e){P(t)}};0&&(module.exports={Env,Inherit,Listener,OnHook,Project,Responsive,Use,VuePlugin,Watch,useController});
5
+ var v=Object.defineProperty;var z=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var q=Object.prototype.hasOwnProperty;var Q=(t,e,r)=>e in t?v(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var i=(t,e)=>v(t,"name",{value:e,configurable:!0});var X=(t,e)=>{for(var r in e)v(t,r,{get:e[r],enumerable:!0})},Z=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Y(e))!q.call(t,o)&&o!==r&&v(t,o,{get:()=>e[o],enumerable:!(n=z(e,o))||n.enumerable});return t};var G=t=>Z(v({},"__esModule",{value:!0}),t);var I=(t,e,r)=>Q(t,typeof e!="symbol"?e+"":e,r);var le={};X(le,{Env:()=>ae,Inherit:()=>ie,Listener:()=>ce,OnHook:()=>ne,Project:()=>re,Responsive:()=>oe,Use:()=>se,VuePlugin:()=>T,Watch:()=>te,useController:()=>J});module.exports=G(le);var P=require("@virid/core"),l={...P.VIRID_METADATA,RESPONSIVE:"virid:vue:responsive",LIFE_CIRCLE:"virid:vue:life-circle",HOOK:"virid:vue:hook",LISTENER:"virid:vue:listener",INHERIT:"virid:vue:inherit",ATTR:"virid:vue:attr",PROJECT:"virid:vue:project",WATCH:"virid:vue:watch",ENV:"virid:vue:env"};var d=require("vue"),m=require("@virid/core");var x=null;function L(t){let e=i(r=>(r&&O(r),r),"bindResponsiveHook");t.onActivate(e),x=t}i(L,"activateApp");var C=new Proxy({},{get(t,e){return(...r)=>{if(!x)return console.warn(`[Virid Vue] App method "${String(e)}" called before initialization.`),e==="register"?()=>{console.warn("[Virid Vue] Cleanup ignored: source listener was never registered.")}:void 0;let n=x[e];if(typeof n=="function")return Reflect.apply(n,x,r)}}});var w=require("@virid/core");var $=!0;function j(){$=!1}i(j,"disableBorrowChecker");var S=new WeakMap;function M(t,e,r=""){if(!$||t===null||typeof t!="object"&&typeof t!="function")return t;if(S.has(t))return S.get(t);let n=new Proxy(t,{get(o,s,a){let c=Reflect.get(o,s,a),f=r?`${r}.${String(s)}`:String(s);return typeof c=="function"?(...u)=>{if(!ee(o,s)){let E=["[Virid Shield] Rejected",`Method: ${e}....${f}()`,"Reason: Unauthorized access to unsafe method."].join(`
6
+ `);return w.MessageWriter.error(new Error(E)),null}let p=c.apply(o,u);return M(p,e,`${f}()`)}:M(c,e,f)},set(o,s){let a=r?`${r}.${String(s)}`:String(s),c=["[Virid Borrow Checker]","------------------------------------------------",`Component: ${e}`,`Code: ${e}....${a}`,"Result: Rejected","Reason: This object is write protected and cannot be modified.",`Stack: ${new Error().stack}`,"------------------------------------------------"].join(`
7
+ `);return w.MessageWriter.error(new Error(c)),!1},deleteProperty(o,s){return w.MessageWriter.error(new Error(`[Virid Shield] Physical Protection:
8
+ Prohibit Deletion of Component Attributes ${String(s)}`)),!1},defineProperty(){return w.MessageWriter.error(new Error(`[Virid Shield] Physical Protection:
9
+ Prohibit redefining component attribute structure`)),!1}});return S.set(t,n),n}i(M,"createBorrowChecker");function ee(t,e){if(new Set([Symbol.iterator,Symbol.asyncIterator,Symbol.toStringTag,"toString","valueOf","toJSON","constructor"]).has(e))return!0;let n=t.constructor?.name;if({Map:new Set(["get","has","keys","values","entries","forEach","size"]),Set:new Set(["has","keys","values","entries","forEach","size"]),Array:new Set(["length","map","filter","reduce","slice","find","includes","findIndex","every","some","at","join","concat","flat","flatMap","indexOf","lastIndexOf"]),String:new Set(["length","slice","substring","substr","split","includes","startsWith","endsWith","indexOf","replace","replaceAll","trim","toLowerCase","toUpperCase"])}[n]?.has(e))return!0;let s=Reflect.getMetadata(l.SAFE,t);return!!(s instanceof Set&&s.has(e))}i(ee,"isShieldException");var A=class A{static set(e,r){return this.globalRegistry.has(e)?(m.MessageWriter.error(new Error(`[Virid UseController] Duplicate ID: Controller ${e} already exists`)),()=>!1):(this.globalRegistry.set(e,r),()=>(this.globalRegistry.delete(e),!0))}static get(e){return this.globalRegistry.has(e)?this.globalRegistry.get(e):(m.MessageWriter.error(new Error(`[Virid UseController] ID Not Found: No Controller found with ID: ${e}`)),null)}};i(A,"GlobalRegistry"),I(A,"globalRegistry",(0,d.shallowReactive)(new Map));var y=A;function N(t,e){Reflect.getMetadata(l.PROJECT,t)?.forEach(n=>{let{key:o,isAccessor:s,type:a,componentClass:c,source:f}=n,u,p=i(h=>{m.MessageWriter.error(new Error(`[Virid Project] Read-only: Property "${o}" in "${e.constructor.name}" is a protected projection.
10
+ `))},"readOnlySetter");if(s){if(a==="component"){m.MessageWriter.error(new Error(`[Virid Project] Architecture Violation: Manual get/set is forbidden on ${c} projection "${o}". Please use functional source.`));return}let h=Object.getOwnPropertyDescriptor(t,o);u=(0,d.computed)({get:i(()=>h?.get?.call(e),"get"),set:i(b=>{h?.set?h.set.call(e,b):p(b)},"set")})}else u=(0,d.computed)({get:i(()=>{let h=a==="component",b=h?C.get(c):e,R=f(b);return h?M(R,c.name,o):R},"get"),set:p});let E=Object.getOwnPropertyDescriptor(e,o);E&&E.configurable===!1||Object.defineProperty(e,o,{get:i(()=>u.value,"get"),set:i(h=>u.value=h,"set"),enumerable:!0,configurable:!0})})}i(N,"bindProject");function D(t,e){let r=Reflect.getMetadata(l.WATCH,t)||[],n=[];return r.forEach(o=>{let{type:s,source:a,methodName:c,options:f,componentClass:u}=o,p=s==="component"?C.get(u):e;p&&!p.__ccs_processed__&&O(p);let E=i(()=>{try{return a(p)}catch(R){m.MessageWriter.error(R,`[Virid Watch] Getter error in ${c}`);return}},"getter"),h=e[c].bind(e),b=(0,d.watch)(E,(R,K)=>{h(R,K)},{...f});n.push(b)}),n}i(D,"bindWatch");function O(t){return!t||typeof t!="object"||t.__virid_responsive_processed__||(Object.defineProperty(t,"__virid_responsive_processed__",{value:!0,enumerable:!1}),(Reflect.getMetadata(l.RESPONSIVE,t)||[]).forEach(r=>{let n=r.key,o=Object.getOwnPropertyDescriptor(t,n),s=o?.get?.__virid_box__;if(s){let a=s.value,c=r.shallow?(0,d.shallowRef)(a):(0,d.ref)(a);Object.defineProperty(s,"value",{get:i(()=>c.value,"get"),set:i(f=>{c.value=f},"set"),enumerable:!0,configurable:!0})}else{if(o&&o.get)return;let a=t[n],c=r.shallow?(0,d.shallowRef)(a):(0,d.ref)(a);Object.defineProperty(t,n,{get:i(()=>c.value,"get"),set:i(f=>{c.value=f},"set"),enumerable:!0,configurable:!0})}}),Reflect.ownKeys(t).forEach(r=>{if(r==="__virid_responsive_processed__")return;let n=t[r];n&&typeof n=="object"&&O(n)})),t}i(O,"bindResponsive");function H(t,e){Reflect.getMetadata(l.LIFE_CIRCLE,t)?.forEach(n=>{let{hookName:o,methodName:s}=n,a=e[s].bind(e);switch(o){case"onMounted":(0,d.onMounted)(a);break;case"onUnmounted":(0,d.onUnmounted)(a);break;case"onUpdated":(0,d.onUpdated)(a);break;case"onActivated":(0,d.onActivated)(a);break;case"onDeactivated":(0,d.onDeactivated)(a);break;case"onSetup":a();break}})}i(H,"bindHooks");function U(t,e){Reflect.getMetadata(l.HOOK,t)?.forEach(n=>{let o=n.hookFactory();e[n.key]=o})}i(U,"bindUseHooks");function W(t,e){let r=Reflect.getMetadata(l.LISTENER,t)||[],n=[];return r.forEach(({key:o,messageClass:s,priority:a,batchMode:c})=>{let f=e[o],u={params:[s],targetClass:e.constructor,methodName:o,originalMethod:f},p={messageClass:s,messageIdx:0,batchMode:c,priority:a};e[o].systemContext=u,e[o].systemContext=p;let E=C.register(e[o]);n.push(E)}),n}i(W,"bindListener");function k(t,e){let r=Reflect.getMetadata(l.INHERIT,t);r&&r.forEach(({key:n,id:o,selector:s})=>{let a=(0,d.computed)(()=>{let c=y.get(o);return c?s?s(c):c:(m.MessageWriter.warn(`[Virid Inherit] Warning: Inherit target not found: ${o}`),null)});Object.defineProperty(e,n,{get:i(()=>{let c=a.value;return c?M(c,n,""):null},"get"),set:i(()=>{m.MessageWriter.error(new Error(`[Virid Inherit] No Modification: Attempted to set read-only Inherit property: ${n}`))},"set"),enumerable:!0,configurable:!0})})}i(k,"bindInherit");function B(t,e,r){Reflect.getMetadata(l.ENV,t).forEach(({key:o})=>{if(!r[o]){m.MessageWriter.warn(`[Virid Context] Env Not Found: The "${o}" is not defined in the context.`);return}Object.defineProperty(e,o,{get:i(()=>r[o],"get"),set:i(s=>{if(r[o]!==s)try{r[o]=s}catch(a){m.MessageWriter.error(a,`[Virid Context] Set Failed:
11
+ "${o}" is only readable.`)}},"set"),enumerable:!0,configurable:!0})})}i(B,"bindEnv");var V=require("vue");var F=require("@virid/core");function J(t,e){let r=C.get(t);if(!Reflect.hasMetadata(l.CONTROLLER,t))return F.MessageWriter.error(new Error(`[Virid Controller] ${t.name} is not a Controller.Use @Controller to inject it.`)),null;let o=Object.getPrototypeOf(r),s=e?.context||(0,V.useAttrs)();s&&B(o,r,s),U(o,r),k(o,r),N(o,r);let a=W(o,r);H(o,r);let c=D(o,r),f=i(()=>!0,"unbindRegister");return e?.id&&(f=y.set(e.id,r)),(0,V.onUnmounted)(()=>{c.forEach(u=>u()),a.forEach(u=>u()),f()}),r}i(J,"useController");var g=require("@virid/core");function te(t,e,r){return(n,o)=>{let s=Reflect.getMetadata(l.WATCH,n)||[];typeof e=="function"?s.push({type:"component",componentClass:t,source:e,options:r,methodName:o}):s.push({type:"local",componentClass:null,source:t,options:e,methodName:o}),Reflect.defineMetadata(l.WATCH,s,n)}}i(te,"Watch");function re(t,e){return(r,n,o)=>{let s=Reflect.getMetadata(l.PROJECT,r)||[],a=!!(o?.get||o?.set);if(!t&&!e&&!a){g.MessageWriter.error(new Error("[Virid Project] Invalid Usage: @Project() can only be used on getter or setter."));return}let c={key:n,isAccessor:a,type:typeof e=="function"?"component":"local",componentClass:typeof e=="function"?t:null,source:typeof e=="function"?e:a?null:t};s.push(c),Reflect.defineMetadata(l.PROJECT,s,r)}}i(re,"Project");function oe(t=!1){return(e,r)=>{let n=Reflect.getMetadata(l.RESPONSIVE,e)||[];n.push({key:r,shallow:t}),Reflect.defineMetadata(l.RESPONSIVE,n,e)}}i(oe,"Responsive");function ne(t){return(e,r)=>{let n=Reflect.getMetadata(l.LIFE_CIRCLE,e)||[];n.push({hookName:t,methodName:r}),Reflect.defineMetadata(l.LIFE_CIRCLE,n,e)}}i(ne,"OnHook");function se(t){return(e,r)=>{let n=Reflect.getMetadata(l.HOOK,e)||[];n.push({key:r,hookFactory:t}),Reflect.defineMetadata(l.HOOK,n,e)}}i(se,"Use");function ie(t,e,r){return(n,o)=>{let s=Reflect.getMetadata(l.INHERIT,n)||[];s.push({key:o,token:t,id:e,selector:r}),Reflect.defineMetadata(l.INHERIT,s,n)}}i(ie,"Inherit");function ae(){return(t,e)=>{let r=Reflect.getMetadata(l.ENV,t)||[];r.push({key:e}),Reflect.defineMetadata(l.ENV,r,t)}}i(ae,"Env");function ce(t={messageClass:null,priority:0,batchMode:!1}){return(e,r,n)=>{if(typeof e=="function")throw new Error(`[Virid Listener] Method Type Error: The Method "${r}" is a static method. @Listener can only be used on instance member methods.`);let o=Reflect.getMetadata("design:paramtypes",e,r)||[],s=o.map((u,p)=>u===void 0?p:-1).filter(u=>u!==-1);if(s.length>0)throw new Error(`[Virid Listener] Parameter Metadata Loss in "${r}": One or more parameters have 'undefined' types. Check indices: [${s.join(", ")}]`);if(o.length>1)throw new Error(`[Virid Listener] Multiple Parameters Not Allowed: Listener method "${r}" can have at most ONE parameter (BaseMessage subclass or Array).`);let a=t.messageClass,c=t.batchMode??!1;if(o.length===0){if(!t.messageClass)throw new Error(`[Virid Listener] Rule Violation in "${r}": When the method has no parameters, you MUST specify "messageClass" in the decorator options.`)}else{let u=o[0];if(u===Array){if(!t.messageClass)throw new Error(`[Virid Listener] Rule Violation in "${r}": When using batch processing mode with Array, the "messageClass" parameter must be specified in decorator options.`);if(!(t.messageClass.prototype instanceof g.SingleMessage))throw new Error(`[Virid Listener] Type Mismatch in "${r}": Batch processing mode (Array) is only supported for subclasses of SingleMessage.`);c=!0}else if(u===g.BaseMessage||u&&u.prototype instanceof g.BaseMessage){if(t.messageClass)throw new Error(`[Virid Listener] Rule Violation in "${r}": Cannot specify "messageClass" in decorator options when it is already declared as a method parameter.`);a=u,c=t.batchMode??!1}else throw new Error(`[Virid Listener] Invalid Parameter in "${r}": The single parameter must be either a subclass of BaseMessage or an Array.`)}let f=Reflect.getMetadata(l.LISTENER,e)||[];f.push({key:r,messageClass:a,priority:t.priority||0,batchMode:c}),Reflect.defineMetadata(l.LISTENER,f,e)}}i(ce,"Listener");var _=class _{constructor(){I(this,"name","@virid/vue")}install(e,r){r.disableBorrowChecker&&j(),L(e)}};i(_,"VuePlugin");var T=_;0&&(module.exports={Env,Inherit,Listener,OnHook,Project,Responsive,Use,VuePlugin,Watch,useController});
14
12
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/decorators/constant.ts","../src/adapters/bind.ts","../src/app.ts","../src/adapters/borrow-checker.ts","../src/adapters/hook.ts","../src/decorators/vue.ts"],"sourcesContent":["/*\n * Copyright (c) 2026-present Ailrid\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Description: Vue adapter for virid, projecting logic sovereignty to reactive UI.\n */\nimport { ViridPlugin, type ViridApp } from \"@virid/core\";\nexport * from \"./adapters\";\nexport * from \"./decorators\";\nexport * from \"./interfaces\";\nimport { activateApp } from \"./app\";\nexport const VuePlugin: ViridPlugin = {\n name: \"@virid/vue\",\n install(app: ViridApp, _options) {\n activateApp(app);\n },\n};\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport { VIRID_METADATA } from \"@virid/core\";\nexport const VIRID_VUE_METADATA = {\n ...VIRID_METADATA,\n RESPONSIVE: \"virid:vue:responsive\",\n LIFE_CIRCLE: \"virid:vue:life-circle\",\n HOOK: \"virid:vue:hook\",\n LISTENER: \"virid:vue:listener\",\n INHERIT: \"virid:vue:inherit\",\n ATTR: \"virid:vue:attr\",\n PROJECT: \"virid:vue:project\",\n WATCH: \"virid:vue:watch\",\n} as const;\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport { VIRID_VUE_METADATA } from \"../decorators/constant\";\nimport {\n watch,\n computed,\n type WatchStopHandle,\n ref,\n shallowReactive,\n onMounted,\n onUnmounted,\n onUpdated,\n onActivated,\n onDeactivated,\n shallowRef,\n type WritableComputedRef,\n} from \"vue\";\nimport {\n MessageWriter,\n type SystemContext,\n EventMessage,\n SingleMessage,\n} from \"@virid/core\";\nimport { viridApp } from \"../app\";\nimport { createBorrowChecker } from \"./borrow-checker\";\nimport {\n type WatchMetadata,\n type ProjectMetadata,\n type InheritMetadata,\n type UseMetadata,\n type ResponsiveMetadata,\n type OnHookMetadata,\n type ListenerMetadata,\n} from \"../interfaces\";\n\n// controller注册表\n\nexport class GlobalRegistry {\n private static globalRegistry = shallowReactive(new Map<string, any>());\n static set(id: string, instance: any): () => boolean {\n if (!this.globalRegistry.has(id)) {\n this.globalRegistry.set(id, instance);\n //返回卸载函数\n return () => {\n this.globalRegistry.delete(id);\n return true;\n };\n } else {\n MessageWriter.error(\n new Error(\n `[Virid UseController] Duplicate ID: Controller ${id} already exists`,\n ),\n );\n return () => false;\n }\n }\n static get(id: string): any {\n //如果找不见,直接报错\n if (!this.globalRegistry.has(id)) {\n MessageWriter.error(\n new Error(\n `[Virid UseController] ID Not Found: No Controller found with ID: ${id}`,\n ),\n );\n return null;\n }\n return this.globalRegistry.get(id);\n }\n}\n/**\n * @Project 连接component,只读一个component的值\n */\nexport function bindProject(proto: any, instance: any) {\n const projects: ProjectMetadata = Reflect.getMetadata(\n VIRID_VUE_METADATA.PROJECT,\n proto,\n );\n\n projects?.forEach((config) => {\n const { key, isAccessor, type, componentClass, source } = config;\n let project: WritableComputedRef<any, any>;\n\n // 统一报错 Setter\n const readOnlySetter = (_val: any) => {\n MessageWriter.error(\n new Error(\n `[Virid Project] Read-only: Property \"${key}\" in \"${instance.constructor.name}\" is a protected projection.\\n`,\n ),\n );\n };\n\n // 手写 Accessor\n if (isAccessor) {\n if (type === \"component\") {\n MessageWriter.error(\n new Error(\n `[Virid Project] Architecture Violation: Manual get/set is forbidden on ${componentClass} projection \"${key}\". Please use functional source.`,\n ),\n );\n return;\n }\n\n // 只有非 component 类型才走到这里,支持读写\n const rawDescriptor = Object.getOwnPropertyDescriptor(proto, key);\n project = computed({\n get: () => rawDescriptor?.get?.call(instance),\n set: (val) => {\n if (rawDescriptor?.set) {\n rawDescriptor.set.call(instance, val);\n } else {\n readOnlySetter(val);\n }\n },\n });\n }\n //函数式投影\n else {\n project = computed({\n get: () => {\n const isFromComponent = type === \"component\";\n const target = isFromComponent\n ? viridApp.get(componentClass)\n : instance;\n const val = source(target);\n\n // 来自 component 的数据套盾\n if (isFromComponent) {\n return createBorrowChecker(val, componentClass!.name, key);\n }\n\n // 来自自己的投影,直接返回\n return val;\n },\n set: readOnlySetter,\n });\n }\n\n const currentDescriptor = Object.getOwnPropertyDescriptor(instance, key);\n if (currentDescriptor && currentDescriptor.configurable === false) return;\n\n Object.defineProperty(instance, key, {\n get: () => project.value,\n set: (val) => (project.value = val),\n enumerable: true,\n configurable: true,\n });\n });\n}\n/**\n * @Watch 自动把函数变成watch\n */\n\nexport function bindWatch(proto: any, instance: any) {\n const watches: WatchMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.WATCH, proto) || [];\n const stops: WatchStopHandle[] = [];\n\n watches.forEach((config) => {\n const { type, source, methodName, options, componentClass } = config;\n\n // 获取目标实例\n const target =\n type === \"component\" ? viridApp.get(componentClass) : instance;\n // 确保目标实例已经过响应式处理\n if (target && !target.__ccs_processed__) {\n bindResponsive(target);\n }\n // 封装 getter\n const getter = () => {\n try {\n return source(target);\n } catch (e) {\n MessageWriter.error(\n e as Error,\n `[Virid Watch] Getter error in ${methodName}`,\n );\n return undefined;\n }\n };\n // 使用 bind 确保回调函数内部的 this 指向当前的 Controller/Instance\n const callback = (instance[methodName] as any).bind(instance);\n // 执行监听\n const stop = watch(\n getter,\n (newVal, oldVal) => {\n callback(newVal, oldVal);\n },\n {\n ...options,\n },\n );\n stops.push(stop);\n });\n\n return stops;\n}\n\n/**\n * @Responsive 递归处理,支持在 Observer 基础上套娃\n */\nexport function bindResponsive(instance: any) {\n if (!instance || typeof instance !== \"object\") return instance;\n if (instance.__virid_responsive_processed__) return instance;\n\n Object.defineProperty(instance, \"__virid_responsive_processed__\", {\n value: true,\n enumerable: false,\n });\n\n const props: ResponsiveMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.RESPONSIVE, instance) || [];\n\n props.forEach((config) => {\n const key = config.key;\n const descriptor = Object.getOwnPropertyDescriptor(instance, key);\n\n // 【关键逻辑】检查是否已经被 bindObservers 劫持过\n const existingBox = (descriptor?.get as any)?.__virid_box__;\n\n // 在 bindResponsive 内部\n if (existingBox) {\n const rawValue = existingBox.value;\n const vRef = config.shallow ? shallowRef(rawValue) : ref(rawValue);\n\n Object.defineProperty(existingBox, \"value\", {\n get: () => vRef.value,\n set: (val) => {\n vRef.value = val;\n },\n enumerable: true,\n configurable: true,\n });\n } else {\n // 普通属性,按照原逻辑处理\n if (descriptor && descriptor.get) return;\n\n const rawValue = instance[key];\n const internalState = config.shallow\n ? shallowRef(rawValue)\n : ref(rawValue);\n\n Object.defineProperty(instance, key, {\n get: () => internalState.value,\n set: (val) => {\n internalState.value = val;\n },\n enumerable: true,\n configurable: true,\n });\n }\n });\n\n // 递归处理子对象\n Reflect.ownKeys(instance).forEach((key) => {\n if (key === \"__virid_responsive_processed__\") return;\n const val = instance[key];\n if (val && typeof val === \"object\") {\n bindResponsive(val);\n }\n });\n return instance;\n}\n\n/**\n * 解析 @OnHook 并将其绑定到 Vue 生命周期\n */\nexport function bindHooks(proto: any, instance: any) {\n const hooks: OnHookMetadata = Reflect.getMetadata(\n VIRID_VUE_METADATA.LIFE_CIRCLE,\n proto,\n );\n\n hooks?.forEach((config) => {\n const { hookName, methodName } = config;\n const fn = instance[methodName].bind(instance);\n\n switch (hookName) {\n case \"onMounted\":\n onMounted(fn);\n break;\n case \"onUnmounted\":\n onUnmounted(fn);\n break;\n case \"onUpdated\":\n onUpdated(fn);\n break;\n case \"onActivated\":\n onActivated(fn);\n break;\n case \"onDeactivated\":\n onDeactivated(fn);\n break;\n case \"onSetup\":\n fn();\n break;\n // 可以根据需要扩展更多的钩子\n }\n });\n}\n\n/**\n * 执行并绑定万能 Hooks\n */\nexport function bindUseHooks(proto: any, instance: any) {\n const hooks: UseMetadata = Reflect.getMetadata(\n VIRID_VUE_METADATA.HOOK,\n proto,\n );\n\n hooks?.forEach((config) => {\n // 在 useController 运行期间执行 hookFactory()\n const hookResult = config.hookFactory();\n // 直接赋值给实例\n instance[config.key] = hookResult;\n });\n}\n\n/**\n * @description: 启动@Listener 为 Controller 实例绑定监听器并返回销毁函数列表\n **/\nexport function bindListener(proto: any, instance: any): (() => void)[] {\n const listenerConfigs: ListenerMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.LISTENER, proto) || [];\n const unbindFunctions: (() => void)[] = [];\n\n listenerConfigs.forEach(({ key, messageClass, priority, single }) => {\n const originalMethod = instance[key];\n\n // 强制只能接受一个参数且是 SingleMessage\n const wrappedHandler = function (\n currentMessage: SingleMessage[] | EventMessage,\n ) {\n const sample = Array.isArray(currentMessage)\n ? currentMessage[0]\n : currentMessage;\n let params;\n if (!(sample instanceof messageClass)) {\n // 如果类型不匹配,说明 Dispatcher 路由逻辑或元数据配置有问题\n MessageWriter.error(\n new Error(\n `[Virid Listener] Type Mismatch: Expected ${messageClass.name}, but received ${sample?.constructor.name}`,\n ),\n );\n return null;\n }\n // 处理 SingleMessage (合并且批处理类型)\n if (sample instanceof SingleMessage) {\n // 如果用户标记了 single: true,则只取最后一条(最新的一条)\n if (single) {\n params = Array.isArray(currentMessage)\n ? [currentMessage[currentMessage.length - 1]]\n : currentMessage;\n } else {\n // 否则默认返回整个数组(批处理模式)\n params = Array.isArray(currentMessage)\n ? currentMessage\n : [currentMessage];\n }\n }\n // 处理 EventMessage (顺序单发类型)\n else if (sample instanceof EventMessage) {\n params = [currentMessage];\n } else {\n throw new Error(\n `[Virid System] unknown Message Types: Message ${messageClass.name} is not a subclass of SingleMessage or EventMessage!`,\n );\n }\n originalMethod.apply(instance, params);\n };\n\n // 给包装后的函数挂载上下文信息(供 Dispatcher 读取)\n const taskContext: SystemContext = {\n params: [messageClass],\n targetClass: instance.constructor,\n methodName: key,\n originalMethod: originalMethod,\n };\n (wrappedHandler as any).systemContext = taskContext;\n\n const unregister = viridApp.register(\n messageClass,\n wrappedHandler,\n priority,\n );\n unbindFunctions.push(unregister);\n });\n\n return unbindFunctions;\n}\n\n/**\n * @description: 启动@Inherit 使能够只读其他的controller\n **/\nexport function bindInherit(proto: any, instance: any) {\n const inherits: InheritMetadata = Reflect.getMetadata(\n VIRID_VUE_METADATA.INHERIT,\n proto,\n );\n if (!inherits) return;\n\n inherits.forEach(({ key, id, selector }) => {\n // 为每个继承属性创建一个私有的 computed 引用\n // 这个 computed 就像一个隧道,一头连着 Registry,一头连着子组件\n const tunnel = computed(() => {\n const target = GlobalRegistry.get(id); // 自动依赖 Registry 的增删\n if (!target) {\n MessageWriter.warn(\n `[Virid Inherit] Warning:\\n Inherit target not found: ${id}`,\n );\n return null;\n }\n // 这里的 selector(target) 也会触发依赖收集\n // 如果 target.state.count 变了,这个 computed 也会感知到\n return selector ? selector(target) : target;\n });\n\n Object.defineProperty(instance, key, {\n get: () => {\n const val = tunnel.value; // 访问 computed.value\n // 返回时依然套上护盾,确保“弱引用”也是“只读引用”\n return val ? createBorrowChecker(val, key, \"\") : null;\n },\n set: () => {\n MessageWriter.error(\n new Error(\n `[Virid Inherit] No Modification:\\nAttempted to set read-only Inherit property: ${key}`,\n ),\n );\n },\n enumerable: true,\n configurable: true,\n });\n });\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport { type ViridApp, Newable } from \"@virid/core\";\nimport { bindResponsive } from \"./adapters/bind\";\nexport interface IViridApp {\n register(\n messageClass: any,\n systemFn: (...args: any[]) => any,\n priority: number,\n ): () => void;\n get(identifier: any): any;\n bindComponent<T>(identifier: Newable<T>): void;\n}\n\nlet activeApp: IViridApp | null = null;\n\n/**\n * 激活真正的 App 实例\n */\nexport function activateApp(app: ViridApp) {\n const bindResponsiveHook = (instance: any) => {\n if (instance) {\n bindResponsive(instance);\n }\n return instance;\n };\n app.addActivationHook(bindResponsiveHook);\n activeApp = app;\n}\n\n/**\n * viridApp 代理\n */\nexport const viridApp: IViridApp = new Proxy({} as IViridApp, {\n get(_, prop: keyof IViridApp) {\n return (...args: any[]) => {\n // 检查实例是否存在\n if (!activeApp) {\n console.warn(\n `[Virid Vue] App method \"${String(prop)}\" called before initialization.`,\n );\n\n // 针对 register 这种有返回值的函数做特殊处理\n if (prop === \"register\") {\n return () => {\n console.warn(\n \"[Virid Vue] Cleanup ignored: source listener was never registered.\",\n );\n };\n }\n return undefined;\n }\n\n // 正常转发调用\n // 使用 Reflect 确保 this 指向正确,或者直接从 activeApp 调用\n const targetMethod = activeApp[prop];\n if (typeof targetMethod === \"function\") {\n return Reflect.apply(targetMethod, activeApp, args);\n }\n };\n },\n});\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport { MessageWriter } from \"@virid/core\";\nimport { VIRID_VUE_METADATA } from \"../decorators/constant\";\n\n// 在文件顶部定义缓存池\nconst borrowCache = new WeakMap<any, any>();\n/**\n * 递归借用检查代理:将对象及其所有后代变为硬只读\n */\nexport function createBorrowChecker(\n target: any,\n rootName: string,\n path: string = \"\",\n): any {\n // 基本类型处理\n if (\n target === null ||\n (typeof target !== \"object\" && typeof target !== \"function\")\n ) {\n return target;\n }\n if (borrowCache.has(target)) {\n return borrowCache.get(target);\n }\n\n const proxy = new Proxy(target, {\n get(obj, prop, receiver) {\n const value = Reflect.get(obj, prop, receiver);\n const currentPath = path ? `${path}.${String(prop)}` : String(prop);\n // 函数拦截\n if (typeof value === \"function\") {\n return (...args: any[]) => {\n if (!isShieldException(obj, prop)) {\n const errorMsg = [\n `[Virid Shield] Rejected`,\n `Method: ${rootName}....${currentPath}()`,\n `Reason: Unauthorized access to unsafe method.`,\n ].join(\"\\n\");\n MessageWriter.error(new Error(errorMsg));\n return null;\n }\n\n // 安全执行:如果是 Safe 的,执行它\n const result = value.apply(obj, args);\n // 对返回值递归借用检查\n return createBorrowChecker(result, rootName, `${currentPath}()`);\n };\n }\n // 自动给子对象也加上借用检查\n return createBorrowChecker(value, rootName, currentPath);\n },\n\n set(_obj, prop) {\n const currentPath = path ? `${path}.${String(prop)}` : String(prop);\n\n // 优雅地失败,并给出修复建议\n const errorMsg = [\n `[Virid Borrow Checker]`,\n `------------------------------------------------`,\n `Component: ${rootName}`,\n `Code: ${rootName}....${currentPath}`,\n `Result: Rejected`,\n `Reason: This object is write protected and cannot be modified.`,\n `Stack: ${new Error().stack}`,\n `------------------------------------------------`,\n ].join(\"\\n\");\n MessageWriter.error(new Error(errorMsg));\n return false;\n },\n deleteProperty(_obj, prop) {\n MessageWriter.error(\n new Error(\n `[Virid Shield] Physical Protection:\\nProhibit Deletion of Component Attributes ${String(prop)}`,\n ),\n );\n return false;\n },\n defineProperty() {\n MessageWriter.error(\n new Error(\n `[Virid Shield] Physical Protection:\\nProhibit redefining component attribute structure`,\n ),\n );\n return false;\n },\n });\n borrowCache.set(target, proxy);\n return proxy;\n}\n/**\n * 判断一个方法是否应该跳过护盾拦截\n */\nfunction isShieldException(obj: any, prop: string | symbol): boolean {\n // 1. 内置协议 (Symbol 和基础 Object 方法)\n const PROTOCOL_WHITELIST = new Set<string | symbol>([\n Symbol.iterator,\n Symbol.asyncIterator,\n Symbol.toStringTag,\n \"toString\",\n \"valueOf\",\n \"toJSON\",\n \"constructor\",\n ]);\n if (PROTOCOL_WHITELIST.has(prop)) return true;\n\n // 2. 集合类(Map/Set/Array) 的只读方法白名单\n const constructorName = obj.constructor?.name;\n\n // 核心修复:补充 Array 的只读操作方法\n const READONLY_COLLECTIONS: Record<string, Set<string | symbol>> = {\n Map: new Set([\n \"get\",\n \"has\",\n \"keys\",\n \"values\",\n \"entries\",\n \"forEach\",\n \"size\",\n ]),\n Set: new Set([\"has\", \"keys\", \"values\", \"entries\", \"forEach\", \"size\"]),\n Array: new Set([\n \"length\",\n \"map\",\n \"filter\",\n \"reduce\",\n \"slice\",\n \"find\",\n \"includes\",\n \"findIndex\",\n \"every\",\n \"some\",\n \"at\",\n \"join\",\n \"concat\",\n \"flat\",\n \"flatMap\",\n \"indexOf\",\n \"lastIndexOf\",\n ]),\n String: new Set([\n \"length\",\n \"slice\",\n \"substring\",\n \"substr\",\n \"split\",\n \"includes\",\n \"startsWith\",\n \"endsWith\",\n \"indexOf\",\n \"replace\",\n \"replaceAll\",\n \"trim\",\n \"toLowerCase\",\n \"toUpperCase\",\n ]),\n };\n\n if (READONLY_COLLECTIONS[constructorName]?.has(prop)) return true;\n\n // 3. 手动标记的 @Safe 装饰器方法\n const safeMethods = Reflect.getMetadata(VIRID_VUE_METADATA.SAFE, obj);\n if (safeMethods instanceof Set && safeMethods.has(prop)) return true;\n\n return false;\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport {\n bindProject,\n bindWatch,\n bindHooks,\n bindUseHooks,\n bindListener,\n GlobalRegistry,\n bindInherit,\n} from \"./bind\";\nimport { onUnmounted, useAttrs } from \"vue\";\nimport { VIRID_VUE_METADATA } from \"../decorators/constant\";\nimport { MessageWriter, Newable } from \"@virid/core\";\nimport { viridApp } from \"../app\";\n/**\n * @description: vue的hooks适配器,注入IOC容器中的Controller实例,并挂在vue的各种方法\n * @param token\n * @return {*}\n */\nexport function useController<T>(\n token: Newable<T>,\n options?: { id?: string; context?: any },\n): T {\n const instance = viridApp.get(token) as any;\n\n //注入vue的乱七八糟的context\n const reactiveContext = options?.context || useAttrs();\n if (reactiveContext) {\n injectContext(reactiveContext, instance);\n }\n\n // 检查身份 Controller\n const isController = Reflect.hasMetadata(\n VIRID_VUE_METADATA.CONTROLLER,\n token,\n );\n if (!isController) {\n // 确保非 Controller 的实例不能被其他 Controller 访问\n MessageWriter.error(\n new Error(\n `[Virid Controller] ${token.name} is not a Controller.Use @Controller to inject it.`,\n ),\n );\n return null as T;\n }\n\n //绑定各种魔法装饰器\n const proto = Object.getPrototypeOf(instance);\n // @Use装饰器\n bindUseHooks(proto, instance);\n // @Inherit装饰器\n bindInherit(proto, instance);\n // @Project装饰器\n bindProject(proto, instance);\n // @Listener装饰器\n // 运行时动态挂载监听器\n const unbindList = bindListener(proto, instance);\n // 生命周期钩子\n bindHooks(proto, instance);\n //绑定全局注册表\n // @Watch装饰器\n const stops = bindWatch(proto, instance);\n //如果有id,就去注册\n let unbindRegister = () => true;\n if (options?.id) {\n unbindRegister = GlobalRegistry.set(options.id, instance);\n }\n onUnmounted(() => {\n stops.forEach((stop) => stop());\n unbindList.forEach((stop) => stop());\n unbindRegister();\n // 自动卸载信号处理器,防止 Controller 销毁后残留\n });\n\n return instance;\n}\n\n/**\nu* @description: 把槽或者其他乱七八糟的东西传递过来的上下文注入到controller里\n * @param {*} context 上下文对象\n * @param {*} instance controller实例\n */\nfunction injectContext(context: any, instance: any) {\n if (context && typeof context === \"object\") {\n Object.keys(context).forEach((key) => {\n Object.defineProperty(instance, key, {\n // Getter 确保了 @Watch 的依赖收集能一路穿透到 Vue 源头\n get: () => context[key],\n // 处理写入逻辑\n set: (val) => {\n if (context[key] === val) return;\n try {\n context[key] = val;\n } catch (e) {\n MessageWriter.error(\n e as Error,\n `[Virid Context] Set Failed:\\n \"${key}\" is only readable.`,\n );\n }\n },\n enumerable: true,\n configurable: true,\n });\n });\n }\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport { VIRID_VUE_METADATA } from \"./constant\";\nimport type { WatchOptions } from \"vue\";\nimport { MessageWriter, type Newable, BaseMessage } from \"@virid/core\";\nimport {\n type WatchMetadata,\n type ProjectMetadata,\n type InheritMetadata,\n type UseMetadata,\n type ResponsiveMetadata,\n type OnHookMetadata,\n type ListenerMetadata,\n type ListenerConfig,\n} from \"../interfaces\";\n/**\n * @description:实现Watch\n */\n\n// 重载 1: 监听 Controller 自身变量\nexport function Watch<T>(\n source: (instance: T) => any | Promise<any>,\n options?: WatchOptions,\n): any;\n\n// 重载 2: 监听全局 Component 变量\nexport function Watch<C>(\n component: Newable<C>,\n source: (comp: C) => any | Promise<any>,\n options?: WatchOptions,\n): any;\n\n// 实现逻辑\nexport function Watch(arg1: any, arg2?: any, arg3?: any) {\n return (target: any, methodName: string) => {\n const existing: WatchMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.WATCH, target) || [];\n\n if (typeof arg2 === \"function\") {\n // 重载 2: Watch(Component, (c) => c.prop, options)\n existing.push({\n type: \"component\",\n componentClass: arg1,\n source: arg2,\n options: arg3,\n methodName,\n });\n } else {\n // 重载 1: Watch((i) => i.prop, options)\n existing.push({\n type: \"local\",\n componentClass: null,\n source: arg1,\n options: arg2,\n methodName,\n });\n }\n\n Reflect.defineMetadata(VIRID_VUE_METADATA.WATCH, existing, target);\n };\n}\n/**\n * @description: 实现数据投影\n * 用法:@Project() 或 @Project('a.b.c')\n */\n// 重载 1: 内部投影 @Project(i => i.someService.data)\nexport function Project<T>(source: (instance: T) => any): any;\n\n// 重载 2: 跨组件投影 @Project(UserComponent, c => c.name)\nexport function Project<C>(\n component: new (...args: any[]) => C,\n source: (comp: C) => any,\n): any;\n// 重载 3: 内部get set 投影 @Project() public get name() {}\nexport function Project<T>(): any;\n// 实现逻辑\nexport function Project(arg1?: any, arg2?: any) {\n return (target: any, key: string, descriptor?: PropertyDescriptor) => {\n const existing: ProjectMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.PROJECT, target) || [];\n const isAccessor = !!(descriptor?.get || descriptor?.set);\n if (!arg1 && !arg2 && !isAccessor) {\n MessageWriter.error(\n new Error(\n `[Virid Project] Invalid Usage: @Project() can only be used on getter or setter.`,\n ),\n );\n return;\n }\n const metadata = {\n key,\n isAccessor: isAccessor,\n // 这里的逻辑和 Watch 保持高度一致\n type: typeof arg2 === \"function\" ? \"component\" : \"local\",\n componentClass: typeof arg2 === \"function\" ? arg1 : null,\n source: typeof arg2 === \"function\" ? arg2 : isAccessor ? null : arg1,\n } as const;\n\n existing.push(metadata);\n Reflect.defineMetadata(VIRID_VUE_METADATA.PROJECT, existing, target);\n };\n}\n/**\n * @description: 给数据增加响应式\n * 用法:@Responsive()\n */\nexport function Responsive(shallow = false) {\n return (target: any, key: string) => {\n // 记录哪些属性需要变成响应式\n const props: ResponsiveMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.RESPONSIVE, target) || [];\n props.push({ key, shallow });\n Reflect.defineMetadata(VIRID_VUE_METADATA.RESPONSIVE, props, target);\n };\n}\n\n/**\n * @description: 声明式生命周期钩子\n * 用法:@OnHook(\"onMounted\")\n */\nexport function OnHook(\n hookName:\n | \"onMounted\"\n | \"onUnmounted\"\n | \"onUpdated\"\n | \"onActivated\"\n | \"onDeactivated\"\n | \"onSetup\",\n) {\n return (target: any, methodName: string) => {\n const existing: OnHookMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.LIFE_CIRCLE, target) || [];\n existing.push({ hookName, methodName });\n Reflect.defineMetadata(VIRID_VUE_METADATA.LIFE_CIRCLE, existing, target);\n };\n}\n/**\n * @description: 万能 Hook 注入装饰器\n * 用法:@Use(() => useRoute()) public route!: RouteLocationNormalized\n */\nexport function Use(hookFactory: () => any) {\n return (target: any, key: string) => {\n const existing: UseMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.HOOK, target) || [];\n existing.push({ key, hookFactory });\n Reflect.defineMetadata(VIRID_VUE_METADATA.HOOK, existing, target);\n };\n}\n/**\n * @description: Inherit注入装饰器\n * 用法:@Inherit(Controller,(instance) => instance.xxxx) public data!: SomeType\n */\nexport function Inherit<T>(\n token: Newable<T>,\n id: string,\n selector: (instance: T) => any,\n) {\n return (target: any, key: string) => {\n const metadata: InheritMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.INHERIT, target) || [];\n metadata.push({ key, token, id, selector });\n Reflect.defineMetadata(VIRID_VUE_METADATA.INHERIT, metadata, target);\n };\n}\n\n/**\n * @description: 标记一个属性是从外部环境(context)注入的\n * 纯元数据标记,什么也不干,方便后期做自动化文档或 TS 类型提示\n */\nexport function Env() {\n return (_target: any, _propertyKey: string) => {\n // 即使现在不存元数据,有了这个装饰器,Controller 看起来也会更清晰\n };\n}\n\n/**\n * @description: Listener 装饰器 - 标记 Controller 的成员方法为消息监听器\n */\nexport function Listener<T extends BaseMessage>({\n messageClass,\n priority = 0,\n single = true,\n}: ListenerConfig<T>) {\n return (target: any, key: string) => {\n // 获取该 Controller 原型上已有的监听器元数据\n const listeners: ListenerMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.LISTENER, target) || [];\n\n // 存入当前方法的配置:哪个方法(key) 听 哪个消息(messageClass)\n listeners.push({\n key,\n messageClass,\n priority,\n single,\n });\n\n // 将元数据重新定义回类原型,供 useController 在实例化时扫描\n Reflect.defineMetadata(VIRID_VUE_METADATA.LISTENER, listeners, target);\n };\n}\n"],"mappings":"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","names":["index_exports","__export","Env","Inherit","Listener","OnHook","Project","Responsive","Use","VuePlugin","Watch","useController","__toCommonJS","import_core","VIRID_VUE_METADATA","VIRID_METADATA","RESPONSIVE","LIFE_CIRCLE","HOOK","LISTENER","INHERIT","ATTR","PROJECT","WATCH","import_vue","import_core","activeApp","activateApp","app","bindResponsiveHook","__name","instance","bindResponsive","addActivationHook","viridApp","Proxy","get","_","prop","args","console","warn","String","targetMethod","Reflect","apply","import_core","borrowCache","WeakMap","createBorrowChecker","target","rootName","path","has","get","proxy","Proxy","obj","prop","receiver","value","Reflect","currentPath","String","args","isShieldException","errorMsg","join","MessageWriter","error","Error","result","apply","set","_obj","stack","deleteProperty","defineProperty","Set","Symbol","iterator","asyncIterator","toStringTag","constructorName","name","Map","Array","safeMethods","getMetadata","VIRID_VUE_METADATA","SAFE","GlobalRegistry","set","id","instance","globalRegistry","has","MessageWriter","error","Error","delete","get","__publicField","shallowReactive","Map","_GlobalRegistry","bindProject","proto","Reflect","getMetadata","VIRID_VUE_METADATA","PROJECT","forEach","config","key","isAccessor","type","componentClass","source","project","readOnlySetter","__name","_val","name","rawDescriptor","Object","getOwnPropertyDescriptor","computed","call","val","isFromComponent","target","viridApp","createBorrowChecker","currentDescriptor","configurable","defineProperty","value","enumerable","bindWatch","watches","WATCH","stops","methodName","options","__ccs_processed__","bindResponsive","getter","e","callback","bind","stop","watch","newVal","oldVal","push","__virid_responsive_processed__","RESPONSIVE","descriptor","existingBox","__virid_box__","rawValue","vRef","shallow","shallowRef","ref","internalState","ownKeys","bindHooks","LIFE_CIRCLE","hookName","fn","onMounted","onUnmounted","onUpdated","onActivated","onDeactivated","bindUseHooks","HOOK","hookResult","hookFactory","bindListener","listenerConfigs","LISTENER","unbindFunctions","messageClass","priority","single","originalMethod","wrappedHandler","currentMessage","sample","Array","isArray","params","SingleMessage","length","EventMessage","apply","taskContext","targetClass","systemContext","unregister","register","bindInherit","inherits","INHERIT","selector","tunnel","warn","import_vue","import_core","useController","token","options","instance","viridApp","get","reactiveContext","context","useAttrs","injectContext","Reflect","hasMetadata","VIRID_VUE_METADATA","CONTROLLER","MessageWriter","error","Error","name","proto","Object","getPrototypeOf","bindUseHooks","bindInherit","bindProject","unbindList","bindListener","bindHooks","stops","bindWatch","unbindRegister","__name","id","GlobalRegistry","set","onUnmounted","forEach","stop","keys","key","defineProperty","val","e","enumerable","configurable","import_core","Watch","arg1","arg2","arg3","target","methodName","existing","Reflect","getMetadata","VIRID_VUE_METADATA","WATCH","push","type","componentClass","source","options","defineMetadata","Project","key","descriptor","PROJECT","isAccessor","get","set","MessageWriter","error","Error","metadata","Responsive","shallow","props","RESPONSIVE","OnHook","hookName","LIFE_CIRCLE","Use","hookFactory","HOOK","Inherit","token","id","selector","INHERIT","Env","_target","_propertyKey","Listener","messageClass","priority","single","listeners","LISTENER","VuePlugin","name","install","app","_options","activateApp"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/decorators/constant.ts","../src/adapters/bind.ts","../src/app.ts","../src/adapters/borrow_checker.ts","../src/adapters/hook.ts","../src/decorators/vue.ts"],"sourcesContent":["/*\n * Copyright (c) 2026-present Ailrid\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Description: Vue adapter for virid, projecting logic sovereignty to reactive UI.\n */\nimport { ViridPlugin, type ViridApp } from \"@virid/core\";\nimport { type PluginOption } from \"./interfaces\";\nexport * from \"./adapters\";\nexport * from \"./decorators\";\nexport * from \"./interfaces\";\nimport { activateApp } from \"./app\";\nimport { disableBorrowChecker } from \"./adapters/borrow_checker\";\n\nexport class VuePlugin implements ViridPlugin<PluginOption> {\n name = \"@virid/vue\";\n install(app: ViridApp, options: PluginOption) {\n if (options.disableBorrowChecker) disableBorrowChecker();\n activateApp(app);\n }\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport { VIRID_METADATA } from \"@virid/core\";\nexport const VIRID_VUE_METADATA = {\n ...VIRID_METADATA,\n RESPONSIVE: \"virid:vue:responsive\",\n LIFE_CIRCLE: \"virid:vue:life-circle\",\n HOOK: \"virid:vue:hook\",\n LISTENER: \"virid:vue:listener\",\n INHERIT: \"virid:vue:inherit\",\n ATTR: \"virid:vue:attr\",\n PROJECT: \"virid:vue:project\",\n WATCH: \"virid:vue:watch\",\n ENV: \"virid:vue:env\",\n} as const;\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport { VIRID_VUE_METADATA } from \"../decorators/constant\";\nimport {\n watch,\n computed,\n type WatchStopHandle,\n ref,\n shallowReactive,\n onMounted,\n onUnmounted,\n onUpdated,\n onActivated,\n onDeactivated,\n shallowRef,\n type WritableComputedRef,\n} from \"vue\";\nimport { MessageWriter, type SystemContext, SystemConfig } from \"@virid/core\";\nimport { viridApp } from \"../app\";\nimport { createBorrowChecker } from \"./borrow_checker\";\nimport {\n type WatchMetadata,\n type ProjectMetadata,\n type InheritMetadata,\n type UseMetadata,\n type ResponsiveMetadata,\n type OnHookMetadata,\n type ListenerMetadata,\n EnvMetadata,\n} from \"../interfaces\";\n\n// controller注册表\n\nexport class GlobalRegistry {\n private static globalRegistry = shallowReactive(new Map<string, any>());\n static set(id: string, instance: any): () => boolean {\n if (!this.globalRegistry.has(id)) {\n this.globalRegistry.set(id, instance);\n //返回卸载函数\n return () => {\n this.globalRegistry.delete(id);\n return true;\n };\n } else {\n MessageWriter.error(\n new Error(\n `[Virid UseController] Duplicate ID: Controller ${id} already exists`,\n ),\n );\n return () => false;\n }\n }\n static get(id: string): any {\n //如果找不见,直接报错\n if (!this.globalRegistry.has(id)) {\n MessageWriter.error(\n new Error(\n `[Virid UseController] ID Not Found: No Controller found with ID: ${id}`,\n ),\n );\n return null;\n }\n return this.globalRegistry.get(id);\n }\n}\n/**\n * @Project 连接component,只读一个component的值\n */\nexport function bindProject(proto: any, instance: any) {\n const projects: ProjectMetadata = Reflect.getMetadata(\n VIRID_VUE_METADATA.PROJECT,\n proto,\n );\n\n projects?.forEach((config) => {\n const { key, isAccessor, type, componentClass, source } = config;\n let project: WritableComputedRef<any, any>;\n\n // 统一报错 Setter\n const readOnlySetter = (_val: any) => {\n MessageWriter.error(\n new Error(\n `[Virid Project] Read-only: Property \"${key}\" in \"${instance.constructor.name}\" is a protected projection.\\n`,\n ),\n );\n };\n\n // 手写 Accessor\n if (isAccessor) {\n if (type === \"component\") {\n MessageWriter.error(\n new Error(\n `[Virid Project] Architecture Violation: Manual get/set is forbidden on ${componentClass} projection \"${key}\". Please use functional source.`,\n ),\n );\n return;\n }\n\n // 只有非 component 类型才走到这里,支持读写\n const rawDescriptor = Object.getOwnPropertyDescriptor(proto, key);\n project = computed({\n get: () => rawDescriptor?.get?.call(instance),\n set: (val) => {\n if (rawDescriptor?.set) {\n rawDescriptor.set.call(instance, val);\n } else {\n readOnlySetter(val);\n }\n },\n });\n }\n //函数式投影\n else {\n project = computed({\n get: () => {\n const isFromComponent = type === \"component\";\n const target = isFromComponent\n ? viridApp.get(componentClass)\n : instance;\n const val = source(target);\n\n // 来自 component 的数据套盾\n if (isFromComponent) {\n return createBorrowChecker(val, componentClass!.name, key);\n }\n\n // 来自自己的投影,直接返回\n return val;\n },\n set: readOnlySetter,\n });\n }\n\n const currentDescriptor = Object.getOwnPropertyDescriptor(instance, key);\n if (currentDescriptor && currentDescriptor.configurable === false) return;\n\n Object.defineProperty(instance, key, {\n get: () => project.value,\n set: (val) => (project.value = val),\n enumerable: true,\n configurable: true,\n });\n });\n}\n/**\n * @Watch 自动把函数变成watch\n */\n\nexport function bindWatch(proto: any, instance: any) {\n const watches: WatchMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.WATCH, proto) || [];\n const stops: WatchStopHandle[] = [];\n\n watches.forEach((config) => {\n const { type, source, methodName, options, componentClass } = config;\n\n // 获取目标实例\n const target =\n type === \"component\" ? viridApp.get(componentClass) : instance;\n // 确保目标实例已经过响应式处理\n if (target && !target.__ccs_processed__) {\n bindResponsive(target);\n }\n // 封装 getter\n const getter = () => {\n try {\n return source(target);\n } catch (e) {\n MessageWriter.error(\n e as Error,\n `[Virid Watch] Getter error in ${methodName}`,\n );\n return undefined;\n }\n };\n // 使用 bind 确保回调函数内部的 this 指向当前的 Controller/Instance\n const callback = (instance[methodName] as any).bind(instance);\n // 执行监听\n const stop = watch(\n getter,\n (newVal, oldVal) => {\n callback(newVal, oldVal);\n },\n {\n ...options,\n },\n );\n stops.push(stop);\n });\n\n return stops;\n}\n\n/**\n * @Responsive 递归处理,支持在 Observer 基础上套娃\n */\nexport function bindResponsive(instance: any) {\n if (!instance || typeof instance !== \"object\") return instance;\n if (instance.__virid_responsive_processed__) return instance;\n\n Object.defineProperty(instance, \"__virid_responsive_processed__\", {\n value: true,\n enumerable: false,\n });\n\n const props: ResponsiveMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.RESPONSIVE, instance) || [];\n\n props.forEach((config) => {\n const key = config.key;\n const descriptor = Object.getOwnPropertyDescriptor(instance, key);\n\n // 【关键逻辑】检查是否已经被 bindObservers 劫持过\n const existingBox = (descriptor?.get as any)?.__virid_box__;\n\n // 在 bindResponsive 内部\n if (existingBox) {\n const rawValue = existingBox.value;\n const vRef = config.shallow ? shallowRef(rawValue) : ref(rawValue);\n\n Object.defineProperty(existingBox, \"value\", {\n get: () => vRef.value,\n set: (val) => {\n vRef.value = val;\n },\n enumerable: true,\n configurable: true,\n });\n } else {\n // 普通属性,按照原逻辑处理\n if (descriptor && descriptor.get) return;\n\n const rawValue = instance[key];\n const internalState = config.shallow\n ? shallowRef(rawValue)\n : ref(rawValue);\n\n Object.defineProperty(instance, key, {\n get: () => internalState.value,\n set: (val) => {\n internalState.value = val;\n },\n enumerable: true,\n configurable: true,\n });\n }\n });\n\n // 递归处理子对象\n Reflect.ownKeys(instance).forEach((key) => {\n if (key === \"__virid_responsive_processed__\") return;\n const val = instance[key];\n if (val && typeof val === \"object\") {\n bindResponsive(val);\n }\n });\n return instance;\n}\n\n/**\n * 解析 @OnHook 并将其绑定到 Vue 生命周期\n */\nexport function bindHooks(proto: any, instance: any) {\n const hooks: OnHookMetadata = Reflect.getMetadata(\n VIRID_VUE_METADATA.LIFE_CIRCLE,\n proto,\n );\n\n hooks?.forEach((config) => {\n const { hookName, methodName } = config;\n const fn = instance[methodName].bind(instance);\n\n switch (hookName) {\n case \"onMounted\":\n onMounted(fn);\n break;\n case \"onUnmounted\":\n onUnmounted(fn);\n break;\n case \"onUpdated\":\n onUpdated(fn);\n break;\n case \"onActivated\":\n onActivated(fn);\n break;\n case \"onDeactivated\":\n onDeactivated(fn);\n break;\n case \"onSetup\":\n fn();\n break;\n // 可以根据需要扩展更多的钩子\n }\n });\n}\n\n/**\n * 执行并绑定万能 Hooks\n */\nexport function bindUseHooks(proto: any, instance: any) {\n const hooks: UseMetadata = Reflect.getMetadata(\n VIRID_VUE_METADATA.HOOK,\n proto,\n );\n\n hooks?.forEach((config) => {\n // 在 useController 运行期间执行 hookFactory()\n const hookResult = config.hookFactory();\n // 直接赋值给实例\n instance[config.key] = hookResult;\n });\n}\n\n/**\n * @description: 启动@Listener 为 Controller 实例绑定监听器并返回销毁函数列表\n **/\nexport function bindListener(proto: any, instance: any): (() => void)[] {\n const listenerConfigs: ListenerMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.LISTENER, proto) || [];\n const unbindFunctions: (() => void)[] = [];\n\n listenerConfigs.forEach(({ key, messageClass, priority, batchMode }) => {\n const originalMethod = instance[key];\n\n // 给包装后的函数挂载上下文信息\n const listenerContext: SystemContext = {\n params: [messageClass],\n targetClass: instance.constructor,\n methodName: key,\n originalMethod: originalMethod,\n };\n\n const listenerConfig: SystemConfig = {\n messageClass: messageClass,\n messageIdx: 0,\n batchMode: batchMode,\n priority: priority,\n };\n (instance[key] as any).systemContext = listenerContext;\n (instance[key] as any).systemContext = listenerConfig;\n\n const unregister = viridApp.register(instance[key]);\n unbindFunctions.push(unregister);\n });\n\n return unbindFunctions;\n}\n\n/**\n * @description: 启动@Inherit 使能够只读其他的controller\n **/\nexport function bindInherit(proto: any, instance: any) {\n const inherits: InheritMetadata = Reflect.getMetadata(\n VIRID_VUE_METADATA.INHERIT,\n proto,\n );\n if (!inherits) return;\n\n inherits.forEach(({ key, id, selector }) => {\n // 为每个继承属性创建一个私有的 computed 引用\n // 这个 computed 就像一个隧道,一头连着 Registry,一头连着子组件\n const tunnel = computed(() => {\n const target = GlobalRegistry.get(id); // 自动依赖 Registry 的增删\n if (!target) {\n MessageWriter.warn(\n `[Virid Inherit] Warning: Inherit target not found: ${id}`,\n );\n return null;\n }\n // 这里的 selector(target) 也会触发依赖收集\n // 如果 target.state.count 变了,这个 computed 也会感知到\n return selector ? selector(target) : target;\n });\n\n Object.defineProperty(instance, key, {\n get: () => {\n const val = tunnel.value; // 访问 computed.value\n // 返回时依然套上护盾,确保“弱引用”也是“只读引用”\n return val ? createBorrowChecker(val, key, \"\") : null;\n },\n set: () => {\n MessageWriter.error(\n new Error(\n `[Virid Inherit] No Modification: Attempted to set read-only Inherit property: ${key}`,\n ),\n );\n },\n enumerable: true,\n configurable: true,\n });\n });\n}\n\n/**\nu* @description: 把槽或者其他乱七八糟的东西传递过来的上下文注入到controller里\n * @param {*} context 上下文对象\n * @param {*} instance controller实例\n */\nexport function bindEnv(proto: any, instance: any, context: any) {\n const envs: EnvMetadata = Reflect.getMetadata(VIRID_VUE_METADATA.ENV, proto);\n\n envs.forEach(({ key }) => {\n if (!context[key]) {\n MessageWriter.warn(\n `[Virid Context] Env Not Found: The \"${key}\" is not defined in the context.`,\n );\n return;\n }\n Object.defineProperty(instance, key, {\n get: () => context[key],\n set: (val) => {\n if (context[key] === val) return;\n try {\n context[key] = val;\n } catch (e) {\n MessageWriter.error(\n e as Error,\n `[Virid Context] Set Failed:\\n \"${key}\" is only readable.`,\n );\n }\n },\n enumerable: true,\n configurable: true,\n });\n });\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport { type ViridApp, Newable } from \"@virid/core\";\nimport { bindResponsive } from \"./adapters/bind\";\nexport interface IViridApp {\n register(systemFn: (...args: any[]) => any): () => void;\n get(identifier: any): any;\n bind<T>(identifier: Newable<T>): void;\n}\n\nlet activeApp: IViridApp | null = null;\n\nexport function activateApp(app: ViridApp) {\n const bindResponsiveHook = (instance: any) => {\n if (instance) {\n bindResponsive(instance);\n }\n return instance;\n };\n app.onActivate(bindResponsiveHook);\n activeApp = app;\n}\n\nexport const viridApp: IViridApp = new Proxy({} as IViridApp, {\n get(_, prop: keyof IViridApp) {\n return (...args: any[]) => {\n if (!activeApp) {\n console.warn(\n `[Virid Vue] App method \"${String(prop)}\" called before initialization.`,\n );\n\n if (prop === \"register\") {\n return () => {\n console.warn(\n \"[Virid Vue] Cleanup ignored: source listener was never registered.\",\n );\n };\n }\n return undefined;\n }\n const targetMethod = activeApp[prop];\n if (typeof targetMethod === \"function\") {\n return Reflect.apply(targetMethod, activeApp, args);\n }\n };\n },\n});\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport { MessageWriter } from \"@virid/core\";\nimport { VIRID_VUE_METADATA } from \"../decorators/constant\";\n\nlet isBorrowCheckerEnabled = true;\nexport function disableBorrowChecker() {\n isBorrowCheckerEnabled = false;\n}\n\nconst borrowCache = new WeakMap<any, any>();\n\n/**\n * Recursive borrowing check proxy: Make the object and all its descendants hard read-only\n */\nexport function createBorrowChecker(\n target: any,\n rootName: string,\n path: string = \"\",\n): any {\n if (\n !isBorrowCheckerEnabled ||\n target === null ||\n (typeof target !== \"object\" && typeof target !== \"function\")\n ) {\n return target;\n }\n if (borrowCache.has(target)) {\n return borrowCache.get(target);\n }\n\n const proxy = new Proxy(target, {\n get(obj, prop, receiver) {\n const value = Reflect.get(obj, prop, receiver);\n const currentPath = path ? `${path}.${String(prop)}` : String(prop);\n if (typeof value === \"function\") {\n return (...args: any[]) => {\n if (!isShieldException(obj, prop)) {\n const errorMsg = [\n `[Virid Shield] Rejected`,\n `Method: ${rootName}....${currentPath}()`,\n `Reason: Unauthorized access to unsafe method.`,\n ].join(\"\\n\");\n MessageWriter.error(new Error(errorMsg));\n return null;\n }\n\n const result = value.apply(obj, args);\n return createBorrowChecker(result, rootName, `${currentPath}()`);\n };\n }\n return createBorrowChecker(value, rootName, currentPath);\n },\n\n set(_obj, prop) {\n const currentPath = path ? `${path}.${String(prop)}` : String(prop);\n\n // Elegantly fail and provide repair suggestions\n const errorMsg = [\n `[Virid Borrow Checker]`,\n `------------------------------------------------`,\n `Component: ${rootName}`,\n `Code: ${rootName}....${currentPath}`,\n `Result: Rejected`,\n `Reason: This object is write protected and cannot be modified.`,\n `Stack: ${new Error().stack}`,\n `------------------------------------------------`,\n ].join(\"\\n\");\n MessageWriter.error(new Error(errorMsg));\n return false;\n },\n deleteProperty(_obj, prop) {\n MessageWriter.error(\n new Error(\n `[Virid Shield] Physical Protection:\\nProhibit Deletion of Component Attributes ${String(prop)}`,\n ),\n );\n return false;\n },\n defineProperty() {\n MessageWriter.error(\n new Error(\n `[Virid Shield] Physical Protection:\\nProhibit redefining component attribute structure`,\n ),\n );\n return false;\n },\n });\n borrowCache.set(target, proxy);\n return proxy;\n}\n/**\n * Determine whether a method should skip shield interception\n */\nfunction isShieldException(obj: any, prop: string | symbol): boolean {\n const PROTOCOL_WHITELIST = new Set<string | symbol>([\n Symbol.iterator,\n Symbol.asyncIterator,\n Symbol.toStringTag,\n \"toString\",\n \"valueOf\",\n \"toJSON\",\n \"constructor\",\n ]);\n if (PROTOCOL_WHITELIST.has(prop)) return true;\n\n const constructorName = obj.constructor?.name;\n\n const READONLY_COLLECTIONS: Record<string, Set<string | symbol>> = {\n Map: new Set([\n \"get\",\n \"has\",\n \"keys\",\n \"values\",\n \"entries\",\n \"forEach\",\n \"size\",\n ]),\n Set: new Set([\"has\", \"keys\", \"values\", \"entries\", \"forEach\", \"size\"]),\n Array: new Set([\n \"length\",\n \"map\",\n \"filter\",\n \"reduce\",\n \"slice\",\n \"find\",\n \"includes\",\n \"findIndex\",\n \"every\",\n \"some\",\n \"at\",\n \"join\",\n \"concat\",\n \"flat\",\n \"flatMap\",\n \"indexOf\",\n \"lastIndexOf\",\n ]),\n String: new Set([\n \"length\",\n \"slice\",\n \"substring\",\n \"substr\",\n \"split\",\n \"includes\",\n \"startsWith\",\n \"endsWith\",\n \"indexOf\",\n \"replace\",\n \"replaceAll\",\n \"trim\",\n \"toLowerCase\",\n \"toUpperCase\",\n ]),\n };\n\n if (READONLY_COLLECTIONS[constructorName]?.has(prop)) return true;\n\n const safeMethods = Reflect.getMetadata(VIRID_VUE_METADATA.SAFE, obj);\n if (safeMethods instanceof Set && safeMethods.has(prop)) return true;\n\n return false;\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport {\n bindProject,\n bindWatch,\n bindHooks,\n bindUseHooks,\n bindListener,\n GlobalRegistry,\n bindInherit,\n bindEnv,\n} from \"./bind\";\nimport { onUnmounted, useAttrs } from \"vue\";\nimport { VIRID_VUE_METADATA } from \"../decorators/constant\";\nimport { MessageWriter, Newable } from \"@virid/core\";\nimport { viridApp } from \"../app\";\n/**\n * @description: vue的hooks适配器,注入IOC容器中的Controller实例,并挂在vue的各种方法\n * @param token\n */\nexport function useController<T>(\n token: Newable<T>,\n options?: { id?: string; context?: object },\n): T {\n const instance = viridApp.get(token) as any;\n\n // 检查身份 Controller\n const isController = Reflect.hasMetadata(\n VIRID_VUE_METADATA.CONTROLLER,\n token,\n );\n if (!isController) {\n // 确保非 Controller 的实例不能被其他 Controller 访问\n MessageWriter.error(\n new Error(\n `[Virid Controller] ${token.name} is not a Controller.Use @Controller to inject it.`,\n ),\n );\n return null as T;\n }\n\n //绑定各种魔法装饰器\n const proto = Object.getPrototypeOf(instance);\n //注入vue的乱七八糟的context\n const reactiveContext = options?.context || useAttrs();\n if (reactiveContext) {\n bindEnv(proto, instance, reactiveContext);\n }\n // @Use装饰器\n bindUseHooks(proto, instance);\n // @Inherit装饰器\n bindInherit(proto, instance);\n // @Project装饰器\n bindProject(proto, instance);\n // @Listener装饰器\n // 运行时动态挂载监听器\n const unbindList = bindListener(proto, instance);\n // 生命周期钩子\n bindHooks(proto, instance);\n //绑定全局注册表\n // @Watch装饰器\n const stops = bindWatch(proto, instance);\n //如果有id,就去注册\n let unbindRegister = () => true;\n if (options?.id) {\n unbindRegister = GlobalRegistry.set(options.id, instance);\n }\n onUnmounted(() => {\n stops.forEach((stop) => stop());\n unbindList.forEach((stop) => stop());\n unbindRegister();\n // 自动卸载信号处理器,防止 Controller 销毁后残留\n });\n\n return instance;\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport { VIRID_VUE_METADATA } from \"./constant\";\nimport type { WatchOptions } from \"vue\";\nimport {\n MessageWriter,\n type Newable,\n BaseMessage,\n SingleMessage,\n} from \"@virid/core\";\nimport {\n type WatchMetadata,\n type ProjectMetadata,\n type InheritMetadata,\n type UseMetadata,\n type ResponsiveMetadata,\n type OnHookMetadata,\n type ListenerMetadata,\n type ListenerConfig,\n EnvMetadata,\n} from \"../interfaces\";\n\n/**\n * Overload 1: Monitor Controller's own variables\n * @param source Watching closure functions\n * @param options Watch options\n */\nexport function Watch<T>(\n source: (instance: T) => any | Promise<any>,\n options?: WatchOptions,\n): any;\n\n/**\n * Overload 2: Monitor Component's variables\n * @param componentClass Component class\n * @param source Watching closure functions\n * @param options Watch options\n */\n\nexport function Watch<C>(\n component: Newable<C>,\n source: (comp: C) => any | Promise<any>,\n options?: WatchOptions,\n): any;\n\nexport function Watch(arg1: any, arg2?: any, arg3?: any) {\n return (target: any, methodName: string) => {\n const existing: WatchMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.WATCH, target) || [];\n\n if (typeof arg2 === \"function\") {\n // Watch(Component, (c) => c.prop, options)\n existing.push({\n type: \"component\",\n componentClass: arg1,\n source: arg2,\n options: arg3,\n methodName,\n });\n } else {\n // Watch((i) => i.prop, options)\n existing.push({\n type: \"local\",\n componentClass: null,\n source: arg1,\n options: arg2,\n methodName,\n });\n }\n\n Reflect.defineMetadata(VIRID_VUE_METADATA.WATCH, existing, target);\n };\n}\n\n/**\n * Overload 1: Internal Projection\n * @param source Projection closure functions\n */\n\nexport function Project<T>(source: (instance: T) => any): any;\n\n/**\n * Overload 1: Component Projection\n * @param source Projection closure functions\n */\nexport function Project<C>(\n component: new (...args: any[]) => C,\n source: (comp: C) => any,\n): any;\n// Overload 3: Internal get set projection @Project() Public get name() {}\nexport function Project<T>(): any;\n\nexport function Project(arg1?: any, arg2?: any) {\n return (target: any, key: string, descriptor?: PropertyDescriptor) => {\n const existing: ProjectMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.PROJECT, target) || [];\n const isAccessor = !!(descriptor?.get || descriptor?.set);\n if (!arg1 && !arg2 && !isAccessor) {\n MessageWriter.error(\n new Error(\n `[Virid Project] Invalid Usage: @Project() can only be used on getter or setter.`,\n ),\n );\n return;\n }\n const metadata = {\n key,\n isAccessor: isAccessor,\n // 这里的逻辑和 Watch 保持高度一致\n type: typeof arg2 === \"function\" ? \"component\" : \"local\",\n componentClass: typeof arg2 === \"function\" ? arg1 : null,\n source: typeof arg2 === \"function\" ? arg2 : isAccessor ? null : arg1,\n } as const;\n\n existing.push(metadata);\n Reflect.defineMetadata(VIRID_VUE_METADATA.PROJECT, existing, target);\n };\n}\n/**\n * Add responsiveness to data\n */\nexport function Responsive(shallow = false) {\n return (target: any, key: string) => {\n // 记录哪些属性需要变成响应式\n const props: ResponsiveMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.RESPONSIVE, target) || [];\n props.push({ key, shallow });\n Reflect.defineMetadata(VIRID_VUE_METADATA.RESPONSIVE, props, target);\n };\n}\n\n/**\n * Declarative lifecycle hook @OnHook(\"onMounted\")\n */\nexport function OnHook(\n hookName:\n | \"onMounted\"\n | \"onUnmounted\"\n | \"onUpdated\"\n | \"onActivated\"\n | \"onDeactivated\"\n | \"onSetup\",\n) {\n return (target: any, methodName: string) => {\n const existing: OnHookMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.LIFE_CIRCLE, target) || [];\n existing.push({ hookName, methodName });\n Reflect.defineMetadata(VIRID_VUE_METADATA.LIFE_CIRCLE, existing, target);\n };\n}\n/**\n * Universal Hook Injection Decorator\n * Usage: @ Use()=>useRoute() Public route! : RouteLocationNormalized\n */\nexport function Use(hookFactory: () => any) {\n return (target: any, key: string) => {\n const existing: UseMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.HOOK, target) || [];\n existing.push({ key, hookFactory });\n Reflect.defineMetadata(VIRID_VUE_METADATA.HOOK, existing, target);\n };\n}\n/**\n * Inherit injection decorator\n * Usage: @Inherit(Controller, (instance)=>instance. xxxx) public data! : SomeType\n */\nexport function Inherit<T>(\n token: Newable<T>,\n id: string,\n selector: (instance: T) => any,\n) {\n return (target: any, key: string) => {\n const metadata: InheritMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.INHERIT, target) || [];\n metadata.push({ key, token, id, selector });\n Reflect.defineMetadata(VIRID_VUE_METADATA.INHERIT, metadata, target);\n };\n}\n\n/**\n * Marking an attribute as injected from the external environment (context)\n */\nexport function Env() {\n return (target: any, key: string) => {\n const metadata: EnvMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.ENV, target) || [];\n metadata.push({ key });\n Reflect.defineMetadata(VIRID_VUE_METADATA.ENV, metadata, target);\n };\n}\n\n/**\n * Listener Decorator - Tag Controller's member methods as message listeners\n */\nexport function Listener(\n config: ListenerConfig = {\n messageClass: null,\n priority: 0,\n batchMode: false,\n },\n) {\n return (target: any, key: string, descriptor?: PropertyDescriptor) => {\n if (typeof target === \"function\") {\n throw new Error(\n `[Virid Listener] Method Type Error: The Method \"${key}\" is a static method. @Listener can only be used on instance member methods.`,\n );\n }\n\n // Get parameter type metadata\n const types: Array<any> =\n Reflect.getMetadata(\"design:paramtypes\", target, key) || [];\n\n // Verify if there are undefined parameters (to prevent circular references or incomplete imports)\n const undefinedIndices = types\n .map((t, i) => (t === undefined ? i : -1))\n .filter((i) => i !== -1);\n if (undefinedIndices.length > 0) {\n throw new Error(\n `[Virid Listener] Parameter Metadata Loss in \"${key}\": One or more parameters have 'undefined' types. Check indices: [${undefinedIndices.join(\", \")}]`,\n );\n }\n\n // The parameter must have only one\n if (types.length > 1) {\n throw new Error(\n `[Virid Listener] Multiple Parameters Not Allowed: Listener method \"${key}\" can have at most ONE parameter (BaseMessage subclass or Array).`,\n );\n }\n\n // Prepare variables for final storage in metadata\n let finalMessageClass = config.messageClass;\n let finalBatchMode = config.batchMode ?? false;\n\n // Split processing: 0 parameters vs 1 parameter\n if (types.length === 0) {\n // No parameters are allowed, but it must be written in messageClass\n if (!config.messageClass) {\n throw new Error(\n `[Virid Listener] Rule Violation in \"${key}\": When the method has no parameters, you MUST specify \"messageClass\" in the decorator options.`,\n );\n }\n } else {\n // There is only one parameter available\n const paramType = types[0];\n\n if (paramType === Array) {\n // If it is a list (Array), messageClass must be written\n if (!config.messageClass) {\n throw new Error(\n `[Virid Listener] Rule Violation in \"${key}\": When using batch processing mode with Array, the \"messageClass\" parameter must be specified in decorator options.`,\n );\n }\n // Batch, verify if it inherits from SingleMessage\n if (!(config.messageClass.prototype instanceof SingleMessage)) {\n throw new Error(\n `[Virid Listener] Type Mismatch in \"${key}\": Batch processing mode (Array) is only supported for subclasses of SingleMessage.`,\n );\n }\n finalBatchMode = true;\n } else if (\n paramType === BaseMessage ||\n (paramType && paramType.prototype instanceof BaseMessage)\n ) {\n // If it is a single BaseMessage, messageClass cannot be written\n if (config.messageClass) {\n throw new Error(\n `[Virid Listener] Rule Violation in \"${key}\": Cannot specify \"messageClass\" in decorator options when it is already declared as a method parameter.`,\n );\n }\n finalMessageClass = paramType;\n // If batchMode is not explicitly specified, batch mode will not be enabled by default for single messages\n finalBatchMode = config.batchMode ?? false;\n } else {\n // I have written parameters, but they are neither BaseMessage nor Array\n throw new Error(\n `[Virid Listener] Invalid Parameter in \"${key}\": The single parameter must be either a subclass of BaseMessage or an Array.`,\n );\n }\n }\n\n const listeners: ListenerMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.LISTENER, target) || [];\n\n listeners.push({\n key,\n messageClass: finalMessageClass as any,\n priority: config.priority || 0,\n batchMode: finalBatchMode,\n });\n\n Reflect.defineMetadata(VIRID_VUE_METADATA.LISTENER, listeners, target);\n };\n}\n"],"mappings":"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","names":["index_exports","__export","Env","Inherit","Listener","OnHook","Project","Responsive","Use","VuePlugin","Watch","useController","__toCommonJS","import_core","VIRID_VUE_METADATA","VIRID_METADATA","RESPONSIVE","LIFE_CIRCLE","HOOK","LISTENER","INHERIT","ATTR","PROJECT","WATCH","ENV","import_vue","import_core","activeApp","activateApp","app","bindResponsiveHook","__name","instance","bindResponsive","onActivate","viridApp","Proxy","get","_","prop","args","console","warn","String","targetMethod","Reflect","apply","import_core","isBorrowCheckerEnabled","disableBorrowChecker","borrowCache","WeakMap","createBorrowChecker","target","rootName","path","has","get","proxy","Proxy","obj","prop","receiver","value","Reflect","currentPath","String","args","isShieldException","errorMsg","join","MessageWriter","error","Error","result","apply","set","_obj","stack","deleteProperty","defineProperty","Set","Symbol","iterator","asyncIterator","toStringTag","constructorName","name","Map","Array","safeMethods","getMetadata","VIRID_VUE_METADATA","SAFE","GlobalRegistry","set","id","instance","globalRegistry","has","MessageWriter","error","Error","delete","get","__publicField","shallowReactive","Map","_GlobalRegistry","bindProject","proto","Reflect","getMetadata","VIRID_VUE_METADATA","PROJECT","forEach","config","key","isAccessor","type","componentClass","source","project","readOnlySetter","__name","_val","name","rawDescriptor","Object","getOwnPropertyDescriptor","computed","call","val","isFromComponent","target","viridApp","createBorrowChecker","currentDescriptor","configurable","defineProperty","value","enumerable","bindWatch","watches","WATCH","stops","methodName","options","__ccs_processed__","bindResponsive","getter","e","callback","bind","stop","watch","newVal","oldVal","push","__virid_responsive_processed__","RESPONSIVE","descriptor","existingBox","__virid_box__","rawValue","vRef","shallow","shallowRef","ref","internalState","ownKeys","bindHooks","LIFE_CIRCLE","hookName","fn","onMounted","onUnmounted","onUpdated","onActivated","onDeactivated","bindUseHooks","HOOK","hookResult","hookFactory","bindListener","listenerConfigs","LISTENER","unbindFunctions","messageClass","priority","batchMode","originalMethod","listenerContext","params","targetClass","listenerConfig","messageIdx","systemContext","unregister","register","bindInherit","inherits","INHERIT","selector","tunnel","warn","bindEnv","context","ENV","import_vue","import_core","useController","token","options","instance","viridApp","get","Reflect","hasMetadata","VIRID_VUE_METADATA","CONTROLLER","MessageWriter","error","Error","name","proto","Object","getPrototypeOf","reactiveContext","context","useAttrs","bindEnv","bindUseHooks","bindInherit","bindProject","unbindList","bindListener","bindHooks","stops","bindWatch","unbindRegister","__name","id","GlobalRegistry","set","onUnmounted","forEach","stop","import_core","Watch","arg1","arg2","arg3","target","methodName","existing","Reflect","getMetadata","VIRID_VUE_METADATA","WATCH","push","type","componentClass","source","options","defineMetadata","Project","key","descriptor","PROJECT","isAccessor","get","set","MessageWriter","error","Error","metadata","Responsive","shallow","props","RESPONSIVE","OnHook","hookName","LIFE_CIRCLE","Use","hookFactory","HOOK","Inherit","token","id","selector","INHERIT","Env","ENV","Listener","config","messageClass","priority","batchMode","types","undefinedIndices","map","t","i","undefined","filter","length","join","finalMessageClass","finalBatchMode","paramType","Array","prototype","SingleMessage","BaseMessage","listeners","LISTENER","VuePlugin","name","install","app","options","disableBorrowChecker","activateApp","_VuePlugin"]}
package/dist/index.d.cts CHANGED
@@ -1,16 +1,6 @@
1
- import { Newable, BaseMessage, ViridPlugin } from '@virid/core';
1
+ import { Newable, BaseMessage, ViridPlugin, ViridApp } from '@virid/core';
2
2
  import { WatchOptions } from 'vue';
3
3
 
4
- /**
5
- * @description: vue的hooks适配器,注入IOC容器中的Controller实例,并挂在vue的各种方法
6
- * @param token
7
- * @return {*}
8
- */
9
- declare function useController<T>(token: Newable<T>, options?: {
10
- id?: string;
11
- context?: any;
12
- }): T;
13
-
14
4
  interface WatchItem {
15
5
  type: "component" | "local";
16
6
  componentClass: Newable<any> | null;
@@ -53,57 +43,86 @@ interface ListenerItem {
53
43
  key: string;
54
44
  messageClass: Newable<any>;
55
45
  priority: number;
56
- single: boolean;
46
+ batchMode: boolean;
57
47
  }
58
48
  type ListenerMetadata = ListenerItem[];
59
- interface ListenerConfig<T> {
60
- messageClass: Newable<T>;
49
+ interface EnvItem {
50
+ key: string;
51
+ }
52
+ type EnvMetadata = EnvItem[];
53
+ interface ListenerConfig {
54
+ messageClass?: Newable<BaseMessage> | null;
61
55
  priority?: number;
62
- single?: boolean;
56
+ batchMode?: boolean;
57
+ }
58
+
59
+ interface PluginOption {
60
+ disableBorrowChecker?: boolean;
63
61
  }
64
62
 
65
63
  /**
66
- * @description:实现Watch
64
+ * @description: vue的hooks适配器,注入IOC容器中的Controller实例,并挂在vue的各种方法
65
+ * @param token
66
+ */
67
+ declare function useController<T>(token: Newable<T>, options?: {
68
+ id?: string;
69
+ context?: object;
70
+ }): T;
71
+
72
+ /**
73
+ * Overload 1: Monitor Controller's own variables
74
+ * @param source Watching closure functions
75
+ * @param options Watch options
67
76
  */
68
77
  declare function Watch<T>(source: (instance: T) => any | Promise<any>, options?: WatchOptions): any;
78
+ /**
79
+ * Overload 2: Monitor Component's variables
80
+ * @param componentClass Component class
81
+ * @param source Watching closure functions
82
+ * @param options Watch options
83
+ */
69
84
  declare function Watch<C>(component: Newable<C>, source: (comp: C) => any | Promise<any>, options?: WatchOptions): any;
70
85
  /**
71
- * @description: 实现数据投影
72
- * 用法:@Project() @Project('a.b.c')
86
+ * Overload 1: Internal Projection
87
+ * @param source Projection closure functions
73
88
  */
74
89
  declare function Project<T>(source: (instance: T) => any): any;
90
+ /**
91
+ * Overload 1: Component Projection
92
+ * @param source Projection closure functions
93
+ */
75
94
  declare function Project<C>(component: new (...args: any[]) => C, source: (comp: C) => any): any;
76
95
  declare function Project<T>(): any;
77
96
  /**
78
- * @description: 给数据增加响应式
79
- * 用法:@Responsive()
97
+ * Add responsiveness to data
80
98
  */
81
99
  declare function Responsive(shallow?: boolean): (target: any, key: string) => void;
82
100
  /**
83
- * @description: 声明式生命周期钩子
84
- * 用法:@OnHook("onMounted")
101
+ * Declarative lifecycle hook @OnHook("onMounted")
85
102
  */
86
103
  declare function OnHook(hookName: "onMounted" | "onUnmounted" | "onUpdated" | "onActivated" | "onDeactivated" | "onSetup"): (target: any, methodName: string) => void;
87
104
  /**
88
- * @description: 万能 Hook 注入装饰器
89
- * 用法:@Use(() => useRoute()) public route!: RouteLocationNormalized
105
+ * Universal Hook Injection Decorator
106
+ * Usage: @ Use()=>useRoute() Public route! : RouteLocationNormalized
90
107
  */
91
108
  declare function Use(hookFactory: () => any): (target: any, key: string) => void;
92
109
  /**
93
- * @description: Inherit注入装饰器
94
- * 用法:@Inherit(Controller,(instance) => instance.xxxx) public data!: SomeType
110
+ * Inherit injection decorator
111
+ * Usage: @Inherit(Controller, (instance)=>instance. xxxx) public data! : SomeType
95
112
  */
96
113
  declare function Inherit<T>(token: Newable<T>, id: string, selector: (instance: T) => any): (target: any, key: string) => void;
97
114
  /**
98
- * @description: 标记一个属性是从外部环境(context)注入的
99
- * 纯元数据标记,什么也不干,方便后期做自动化文档或 TS 类型提示
115
+ * Marking an attribute as injected from the external environment (context)
100
116
  */
101
- declare function Env(): (_target: any, _propertyKey: string) => void;
117
+ declare function Env(): (target: any, key: string) => void;
102
118
  /**
103
- * @description: Listener 装饰器 - 标记 Controller 的成员方法为消息监听器
119
+ * Listener Decorator - Tag Controller's member methods as message listeners
104
120
  */
105
- declare function Listener<T extends BaseMessage>({ messageClass, priority, single, }: ListenerConfig<T>): (target: any, key: string) => void;
121
+ declare function Listener(config?: ListenerConfig): (target: any, key: string, descriptor?: PropertyDescriptor) => void;
106
122
 
107
- declare const VuePlugin: ViridPlugin;
123
+ declare class VuePlugin implements ViridPlugin<PluginOption> {
124
+ name: string;
125
+ install(app: ViridApp, options: PluginOption): void;
126
+ }
108
127
 
109
- export { Env, Inherit, type InheritItem, type InheritMetadata, Listener, type ListenerConfig, type ListenerItem, type ListenerMetadata, OnHook, type OnHookItem, type OnHookMetadata, Project, type ProjectItem, type ProjectMetadata, Responsive, type ResponsiveItem, type ResponsiveMetadata, Use, type UseItem, type UseMetadata, VuePlugin, Watch, type WatchItem, type WatchMetadata, useController };
128
+ export { Env, type EnvItem, type EnvMetadata, Inherit, type InheritItem, type InheritMetadata, Listener, type ListenerConfig, type ListenerItem, type ListenerMetadata, OnHook, type OnHookItem, type OnHookMetadata, type PluginOption, Project, type ProjectItem, type ProjectMetadata, Responsive, type ResponsiveItem, type ResponsiveMetadata, Use, type UseItem, type UseMetadata, VuePlugin, Watch, type WatchItem, type WatchMetadata, useController };
package/dist/index.d.ts CHANGED
@@ -1,16 +1,6 @@
1
- import { Newable, BaseMessage, ViridPlugin } from '@virid/core';
1
+ import { Newable, BaseMessage, ViridPlugin, ViridApp } from '@virid/core';
2
2
  import { WatchOptions } from 'vue';
3
3
 
4
- /**
5
- * @description: vue的hooks适配器,注入IOC容器中的Controller实例,并挂在vue的各种方法
6
- * @param token
7
- * @return {*}
8
- */
9
- declare function useController<T>(token: Newable<T>, options?: {
10
- id?: string;
11
- context?: any;
12
- }): T;
13
-
14
4
  interface WatchItem {
15
5
  type: "component" | "local";
16
6
  componentClass: Newable<any> | null;
@@ -53,57 +43,86 @@ interface ListenerItem {
53
43
  key: string;
54
44
  messageClass: Newable<any>;
55
45
  priority: number;
56
- single: boolean;
46
+ batchMode: boolean;
57
47
  }
58
48
  type ListenerMetadata = ListenerItem[];
59
- interface ListenerConfig<T> {
60
- messageClass: Newable<T>;
49
+ interface EnvItem {
50
+ key: string;
51
+ }
52
+ type EnvMetadata = EnvItem[];
53
+ interface ListenerConfig {
54
+ messageClass?: Newable<BaseMessage> | null;
61
55
  priority?: number;
62
- single?: boolean;
56
+ batchMode?: boolean;
57
+ }
58
+
59
+ interface PluginOption {
60
+ disableBorrowChecker?: boolean;
63
61
  }
64
62
 
65
63
  /**
66
- * @description:实现Watch
64
+ * @description: vue的hooks适配器,注入IOC容器中的Controller实例,并挂在vue的各种方法
65
+ * @param token
66
+ */
67
+ declare function useController<T>(token: Newable<T>, options?: {
68
+ id?: string;
69
+ context?: object;
70
+ }): T;
71
+
72
+ /**
73
+ * Overload 1: Monitor Controller's own variables
74
+ * @param source Watching closure functions
75
+ * @param options Watch options
67
76
  */
68
77
  declare function Watch<T>(source: (instance: T) => any | Promise<any>, options?: WatchOptions): any;
78
+ /**
79
+ * Overload 2: Monitor Component's variables
80
+ * @param componentClass Component class
81
+ * @param source Watching closure functions
82
+ * @param options Watch options
83
+ */
69
84
  declare function Watch<C>(component: Newable<C>, source: (comp: C) => any | Promise<any>, options?: WatchOptions): any;
70
85
  /**
71
- * @description: 实现数据投影
72
- * 用法:@Project() @Project('a.b.c')
86
+ * Overload 1: Internal Projection
87
+ * @param source Projection closure functions
73
88
  */
74
89
  declare function Project<T>(source: (instance: T) => any): any;
90
+ /**
91
+ * Overload 1: Component Projection
92
+ * @param source Projection closure functions
93
+ */
75
94
  declare function Project<C>(component: new (...args: any[]) => C, source: (comp: C) => any): any;
76
95
  declare function Project<T>(): any;
77
96
  /**
78
- * @description: 给数据增加响应式
79
- * 用法:@Responsive()
97
+ * Add responsiveness to data
80
98
  */
81
99
  declare function Responsive(shallow?: boolean): (target: any, key: string) => void;
82
100
  /**
83
- * @description: 声明式生命周期钩子
84
- * 用法:@OnHook("onMounted")
101
+ * Declarative lifecycle hook @OnHook("onMounted")
85
102
  */
86
103
  declare function OnHook(hookName: "onMounted" | "onUnmounted" | "onUpdated" | "onActivated" | "onDeactivated" | "onSetup"): (target: any, methodName: string) => void;
87
104
  /**
88
- * @description: 万能 Hook 注入装饰器
89
- * 用法:@Use(() => useRoute()) public route!: RouteLocationNormalized
105
+ * Universal Hook Injection Decorator
106
+ * Usage: @ Use()=>useRoute() Public route! : RouteLocationNormalized
90
107
  */
91
108
  declare function Use(hookFactory: () => any): (target: any, key: string) => void;
92
109
  /**
93
- * @description: Inherit注入装饰器
94
- * 用法:@Inherit(Controller,(instance) => instance.xxxx) public data!: SomeType
110
+ * Inherit injection decorator
111
+ * Usage: @Inherit(Controller, (instance)=>instance. xxxx) public data! : SomeType
95
112
  */
96
113
  declare function Inherit<T>(token: Newable<T>, id: string, selector: (instance: T) => any): (target: any, key: string) => void;
97
114
  /**
98
- * @description: 标记一个属性是从外部环境(context)注入的
99
- * 纯元数据标记,什么也不干,方便后期做自动化文档或 TS 类型提示
115
+ * Marking an attribute as injected from the external environment (context)
100
116
  */
101
- declare function Env(): (_target: any, _propertyKey: string) => void;
117
+ declare function Env(): (target: any, key: string) => void;
102
118
  /**
103
- * @description: Listener 装饰器 - 标记 Controller 的成员方法为消息监听器
119
+ * Listener Decorator - Tag Controller's member methods as message listeners
104
120
  */
105
- declare function Listener<T extends BaseMessage>({ messageClass, priority, single, }: ListenerConfig<T>): (target: any, key: string) => void;
121
+ declare function Listener(config?: ListenerConfig): (target: any, key: string, descriptor?: PropertyDescriptor) => void;
106
122
 
107
- declare const VuePlugin: ViridPlugin;
123
+ declare class VuePlugin implements ViridPlugin<PluginOption> {
124
+ name: string;
125
+ install(app: ViridApp, options: PluginOption): void;
126
+ }
108
127
 
109
- export { Env, Inherit, type InheritItem, type InheritMetadata, Listener, type ListenerConfig, type ListenerItem, type ListenerMetadata, OnHook, type OnHookItem, type OnHookMetadata, Project, type ProjectItem, type ProjectMetadata, Responsive, type ResponsiveItem, type ResponsiveMetadata, Use, type UseItem, type UseMetadata, VuePlugin, Watch, type WatchItem, type WatchMetadata, useController };
128
+ export { Env, type EnvItem, type EnvMetadata, Inherit, type InheritItem, type InheritMetadata, Listener, type ListenerConfig, type ListenerItem, type ListenerMetadata, OnHook, type OnHookItem, type OnHookMetadata, type PluginOption, Project, type ProjectItem, type ProjectMetadata, Responsive, type ResponsiveItem, type ResponsiveMetadata, Use, type UseItem, type UseMetadata, VuePlugin, Watch, type WatchItem, type WatchMetadata, useController };
package/dist/index.js CHANGED
@@ -1,14 +1,12 @@
1
1
  /**
2
- * @virid/vue v0.2.5
2
+ * @virid/vue v0.3.1
3
3
  * Vue adapter for virid, projecting logic sovereignty to reactive UI
4
4
  */
5
- var A=Object.defineProperty;var N=(t,e,r)=>e in t?A(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var i=(t,e)=>A(t,"name",{value:e,configurable:!0});var S=(t,e,r)=>N(t,typeof e!="symbol"?e+"":e,r);import{VIRID_METADATA as U}from"@virid/core";var l={...U,RESPONSIVE:"virid:vue:responsive",LIFE_CIRCLE:"virid:vue:life-circle",HOOK:"virid:vue:hook",LISTENER:"virid:vue:listener",INHERIT:"virid:vue:inherit",ATTR:"virid:vue:attr",PROJECT:"virid:vue:project",WATCH:"virid:vue:watch"};import{watch as F,computed as _,ref as M,shallowReactive as K,onMounted as J,onUnmounted as z,onUpdated as B,onActivated as Y,onDeactivated as q,shallowRef as T}from"vue";import{MessageWriter as R,EventMessage as Q,SingleMessage as X}from"@virid/core";var v=null;function x(t){let e=i(r=>(r&&I(r),r),"bindResponsiveHook");t.addActivationHook(e),v=t}i(x,"activateApp");var b=new Proxy({},{get(t,e){return(...r)=>{if(!v)return console.warn(`[Virid Vue] App method "${String(e)}" called before initialization.`),e==="register"?()=>{console.warn("[Virid Vue] Cleanup ignored: source listener was never registered.")}:void 0;let o=v[e];if(typeof o=="function")return Reflect.apply(o,v,r)}}});import{MessageWriter as C}from"@virid/core";var O=new WeakMap;function g(t,e,r=""){if(t===null||typeof t!="object"&&typeof t!="function")return t;if(O.has(t))return O.get(t);let o=new Proxy(t,{get(s,n,c){let a=Reflect.get(s,n,c),f=r?`${r}.${String(n)}`:String(n);return typeof a=="function"?(...d)=>{if(!W(s,n)){let E=["[Virid Shield] Rejected",`Method: ${e}....${f}()`,"Reason: Unauthorized access to unsafe method."].join(`
6
- `);return C.error(new Error(E)),null}let p=a.apply(s,d);return g(p,e,`${f}()`)}:g(a,e,f)},set(s,n){let c=r?`${r}.${String(n)}`:String(n),a=["[Virid Borrow Checker]","------------------------------------------------",`Component: ${e}`,`Code: ${e}....${c}`,"Result: Rejected","Reason: This object is write protected and cannot be modified.",`Stack: ${new Error().stack}`,"------------------------------------------------"].join(`
7
- `);return C.error(new Error(a)),!1},deleteProperty(s,n){return C.error(new Error(`[Virid Shield] Physical Protection:
8
- Prohibit Deletion of Component Attributes ${String(n)}`)),!1},defineProperty(){return C.error(new Error(`[Virid Shield] Physical Protection:
9
- Prohibit redefining component attribute structure`)),!1}});return O.set(t,o),o}i(g,"createBorrowChecker");function W(t,e){if(new Set([Symbol.iterator,Symbol.asyncIterator,Symbol.toStringTag,"toString","valueOf","toJSON","constructor"]).has(e))return!0;let o=t.constructor?.name;if({Map:new Set(["get","has","keys","values","entries","forEach","size"]),Set:new Set(["has","keys","values","entries","forEach","size"]),Array:new Set(["length","map","filter","reduce","slice","find","includes","findIndex","every","some","at","join","concat","flat","flatMap","indexOf","lastIndexOf"]),String:new Set(["length","slice","substring","substr","split","includes","startsWith","endsWith","indexOf","replace","replaceAll","trim","toLowerCase","toUpperCase"])}[o]?.has(e))return!0;let n=Reflect.getMetadata(l.SAFE,t);return!!(n instanceof Set&&n.has(e))}i(W,"isShieldException");var w=class w{static set(e,r){return this.globalRegistry.has(e)?(R.error(new Error(`[Virid UseController] Duplicate ID: Controller ${e} already exists`)),()=>!1):(this.globalRegistry.set(e,r),()=>(this.globalRegistry.delete(e),!0))}static get(e){return this.globalRegistry.has(e)?this.globalRegistry.get(e):(R.error(new Error(`[Virid UseController] ID Not Found: No Controller found with ID: ${e}`)),null)}};i(w,"GlobalRegistry"),S(w,"globalRegistry",K(new Map));var y=w;function P(t,e){Reflect.getMetadata(l.PROJECT,t)?.forEach(o=>{let{key:s,isAccessor:n,type:c,componentClass:a,source:f}=o,d,p=i(u=>{R.error(new Error(`[Virid Project] Read-only: Property "${s}" in "${e.constructor.name}" is a protected projection.
10
- `))},"readOnlySetter");if(n){if(c==="component"){R.error(new Error(`[Virid Project] Architecture Violation: Manual get/set is forbidden on ${a} projection "${s}". Please use functional source.`));return}let u=Object.getOwnPropertyDescriptor(t,s);d=_({get:i(()=>u?.get?.call(e),"get"),set:i(h=>{u?.set?u.set.call(e,h):p(h)},"set")})}else d=_({get:i(()=>{let u=c==="component",h=u?b.get(a):e,m=f(h);return u?g(m,a.name,s):m},"get"),set:p});let E=Object.getOwnPropertyDescriptor(e,s);E&&E.configurable===!1||Object.defineProperty(e,s,{get:i(()=>d.value,"get"),set:i(u=>d.value=u,"set"),enumerable:!0,configurable:!0})})}i(P,"bindProject");function V(t,e){let r=Reflect.getMetadata(l.WATCH,t)||[],o=[];return r.forEach(s=>{let{type:n,source:c,methodName:a,options:f,componentClass:d}=s,p=n==="component"?b.get(d):e;p&&!p.__ccs_processed__&&I(p);let E=i(()=>{try{return c(p)}catch(m){R.error(m,`[Virid Watch] Getter error in ${a}`);return}},"getter"),u=e[a].bind(e),h=F(E,(m,H)=>{u(m,H)},{...f});o.push(h)}),o}i(V,"bindWatch");function I(t){return!t||typeof t!="object"||t.__virid_responsive_processed__||(Object.defineProperty(t,"__virid_responsive_processed__",{value:!0,enumerable:!1}),(Reflect.getMetadata(l.RESPONSIVE,t)||[]).forEach(r=>{let o=r.key,s=Object.getOwnPropertyDescriptor(t,o),n=s?.get?.__virid_box__;if(n){let c=n.value,a=r.shallow?T(c):M(c);Object.defineProperty(n,"value",{get:i(()=>a.value,"get"),set:i(f=>{a.value=f},"set"),enumerable:!0,configurable:!0})}else{if(s&&s.get)return;let c=t[o],a=r.shallow?T(c):M(c);Object.defineProperty(t,o,{get:i(()=>a.value,"get"),set:i(f=>{a.value=f},"set"),enumerable:!0,configurable:!0})}}),Reflect.ownKeys(t).forEach(r=>{if(r==="__virid_responsive_processed__")return;let o=t[r];o&&typeof o=="object"&&I(o)})),t}i(I,"bindResponsive");function j(t,e){Reflect.getMetadata(l.LIFE_CIRCLE,t)?.forEach(o=>{let{hookName:s,methodName:n}=o,c=e[n].bind(e);switch(s){case"onMounted":J(c);break;case"onUnmounted":z(c);break;case"onUpdated":B(c);break;case"onActivated":Y(c);break;case"onDeactivated":q(c);break;case"onSetup":c();break}})}i(j,"bindHooks");function L(t,e){Reflect.getMetadata(l.HOOK,t)?.forEach(o=>{let s=o.hookFactory();e[o.key]=s})}i(L,"bindUseHooks");function k(t,e){let r=Reflect.getMetadata(l.LISTENER,t)||[],o=[];return r.forEach(({key:s,messageClass:n,priority:c,single:a})=>{let f=e[s],d=i(function(u){let h=Array.isArray(u)?u[0]:u,m;if(!(h instanceof n))return R.error(new Error(`[Virid Listener] Type Mismatch: Expected ${n.name}, but received ${h?.constructor.name}`)),null;if(h instanceof X)a?m=Array.isArray(u)?[u[u.length-1]]:u:m=Array.isArray(u)?u:[u];else if(h instanceof Q)m=[u];else throw new Error(`[Virid System] unknown Message Types: Message ${n.name} is not a subclass of SingleMessage or EventMessage!`);f.apply(e,m)},"wrappedHandler"),p={params:[n],targetClass:e.constructor,methodName:s,originalMethod:f};d.systemContext=p;let E=b.register(n,d,c);o.push(E)}),o}i(k,"bindListener");function $(t,e){let r=Reflect.getMetadata(l.INHERIT,t);r&&r.forEach(({key:o,id:s,selector:n})=>{let c=_(()=>{let a=y.get(s);return a?n?n(a):a:(R.warn(`[Virid Inherit] Warning:
11
- Inherit target not found: ${s}`),null)});Object.defineProperty(e,o,{get:i(()=>{let a=c.value;return a?g(a,o,""):null},"get"),set:i(()=>{R.error(new Error(`[Virid Inherit] No Modification:
12
- Attempted to set read-only Inherit property: ${o}`))},"set"),enumerable:!0,configurable:!0})})}i($,"bindInherit");import{onUnmounted as Z,useAttrs as G}from"vue";import{MessageWriter as D}from"@virid/core";function ee(t,e){let r=b.get(t),o=e?.context||G();if(o&&te(o,r),!Reflect.hasMetadata(l.CONTROLLER,t))return D.error(new Error(`[Virid Controller] ${t.name} is not a Controller.Use @Controller to inject it.`)),null;let n=Object.getPrototypeOf(r);L(n,r),$(n,r),P(n,r);let c=k(n,r);j(n,r);let a=V(n,r),f=i(()=>!0,"unbindRegister");return e?.id&&(f=y.set(e.id,r)),Z(()=>{a.forEach(d=>d()),c.forEach(d=>d()),f()}),r}i(ee,"useController");function te(t,e){t&&typeof t=="object"&&Object.keys(t).forEach(r=>{Object.defineProperty(e,r,{get:i(()=>t[r],"get"),set:i(o=>{if(t[r]!==o)try{t[r]=o}catch(s){D.error(s,`[Virid Context] Set Failed:
13
- "${r}" is only readable.`)}},"set"),enumerable:!0,configurable:!0})})}i(te,"injectContext");import{MessageWriter as re}from"@virid/core";function Te(t,e,r){return(o,s)=>{let n=Reflect.getMetadata(l.WATCH,o)||[];typeof e=="function"?n.push({type:"component",componentClass:t,source:e,options:r,methodName:s}):n.push({type:"local",componentClass:null,source:t,options:e,methodName:s}),Reflect.defineMetadata(l.WATCH,n,o)}}i(Te,"Watch");function Pe(t,e){return(r,o,s)=>{let n=Reflect.getMetadata(l.PROJECT,r)||[],c=!!(s?.get||s?.set);if(!t&&!e&&!c){re.error(new Error("[Virid Project] Invalid Usage: @Project() can only be used on getter or setter."));return}let a={key:o,isAccessor:c,type:typeof e=="function"?"component":"local",componentClass:typeof e=="function"?t:null,source:typeof e=="function"?e:c?null:t};n.push(a),Reflect.defineMetadata(l.PROJECT,n,r)}}i(Pe,"Project");function Ve(t=!1){return(e,r)=>{let o=Reflect.getMetadata(l.RESPONSIVE,e)||[];o.push({key:r,shallow:t}),Reflect.defineMetadata(l.RESPONSIVE,o,e)}}i(Ve,"Responsive");function je(t){return(e,r)=>{let o=Reflect.getMetadata(l.LIFE_CIRCLE,e)||[];o.push({hookName:t,methodName:r}),Reflect.defineMetadata(l.LIFE_CIRCLE,o,e)}}i(je,"OnHook");function Le(t){return(e,r)=>{let o=Reflect.getMetadata(l.HOOK,e)||[];o.push({key:r,hookFactory:t}),Reflect.defineMetadata(l.HOOK,o,e)}}i(Le,"Use");function ke(t,e,r){return(o,s)=>{let n=Reflect.getMetadata(l.INHERIT,o)||[];n.push({key:s,token:t,id:e,selector:r}),Reflect.defineMetadata(l.INHERIT,n,o)}}i(ke,"Inherit");function $e(){return(t,e)=>{}}i($e,"Env");function De({messageClass:t,priority:e=0,single:r=!0}){return(o,s)=>{let n=Reflect.getMetadata(l.LISTENER,o)||[];n.push({key:s,messageClass:t,priority:e,single:r}),Reflect.defineMetadata(l.LISTENER,n,o)}}i(De,"Listener");var Je={name:"@virid/vue",install(t,e){x(t)}};export{$e as Env,ke as Inherit,De as Listener,je as OnHook,Pe as Project,Ve as Responsive,Le as Use,Je as VuePlugin,Te as Watch,ee as useController};
5
+ var V=Object.defineProperty;var J=(t,e,r)=>e in t?V(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var i=(t,e)=>V(t,"name",{value:e,configurable:!0});var v=(t,e,r)=>J(t,typeof e!="symbol"?e+"":e,r);import{VIRID_METADATA as K}from"@virid/core";var l={...K,RESPONSIVE:"virid:vue:responsive",LIFE_CIRCLE:"virid:vue:life-circle",HOOK:"virid:vue:hook",LISTENER:"virid:vue:listener",INHERIT:"virid:vue:inherit",ATTR:"virid:vue:attr",PROJECT:"virid:vue:project",WATCH:"virid:vue:watch",ENV:"virid:vue:env"};import{watch as Y,computed as O,ref as P,shallowReactive as q,onMounted as Q,onUnmounted as X,onUpdated as Z,onActivated as G,onDeactivated as ee,shallowRef as L}from"vue";import{MessageWriter as h}from"@virid/core";var w=null;function S(t){let e=i(r=>(r&&M(r),r),"bindResponsiveHook");t.onActivate(e),w=t}i(S,"activateApp");var b=new Proxy({},{get(t,e){return(...r)=>{if(!w)return console.warn(`[Virid Vue] App method "${String(e)}" called before initialization.`),e==="register"?()=>{console.warn("[Virid Vue] Cleanup ignored: source listener was never registered.")}:void 0;let n=w[e];if(typeof n=="function")return Reflect.apply(n,w,r)}}});import{MessageWriter as y}from"@virid/core";var T=!0;function _(){T=!1}i(_,"disableBorrowChecker");var x=new WeakMap;function R(t,e,r=""){if(!T||t===null||typeof t!="object"&&typeof t!="function")return t;if(x.has(t))return x.get(t);let n=new Proxy(t,{get(o,s,a){let c=Reflect.get(o,s,a),d=r?`${r}.${String(s)}`:String(s);return typeof c=="function"?(...u)=>{if(!z(o,s)){let m=["[Virid Shield] Rejected",`Method: ${e}....${d}()`,"Reason: Unauthorized access to unsafe method."].join(`
6
+ `);return y.error(new Error(m)),null}let f=c.apply(o,u);return R(f,e,`${d}()`)}:R(c,e,d)},set(o,s){let a=r?`${r}.${String(s)}`:String(s),c=["[Virid Borrow Checker]","------------------------------------------------",`Component: ${e}`,`Code: ${e}....${a}`,"Result: Rejected","Reason: This object is write protected and cannot be modified.",`Stack: ${new Error().stack}`,"------------------------------------------------"].join(`
7
+ `);return y.error(new Error(c)),!1},deleteProperty(o,s){return y.error(new Error(`[Virid Shield] Physical Protection:
8
+ Prohibit Deletion of Component Attributes ${String(s)}`)),!1},defineProperty(){return y.error(new Error(`[Virid Shield] Physical Protection:
9
+ Prohibit redefining component attribute structure`)),!1}});return x.set(t,n),n}i(R,"createBorrowChecker");function z(t,e){if(new Set([Symbol.iterator,Symbol.asyncIterator,Symbol.toStringTag,"toString","valueOf","toJSON","constructor"]).has(e))return!0;let n=t.constructor?.name;if({Map:new Set(["get","has","keys","values","entries","forEach","size"]),Set:new Set(["has","keys","values","entries","forEach","size"]),Array:new Set(["length","map","filter","reduce","slice","find","includes","findIndex","every","some","at","join","concat","flat","flatMap","indexOf","lastIndexOf"]),String:new Set(["length","slice","substring","substr","split","includes","startsWith","endsWith","indexOf","replace","replaceAll","trim","toLowerCase","toUpperCase"])}[n]?.has(e))return!0;let s=Reflect.getMetadata(l.SAFE,t);return!!(s instanceof Set&&s.has(e))}i(z,"isShieldException");var I=class I{static set(e,r){return this.globalRegistry.has(e)?(h.error(new Error(`[Virid UseController] Duplicate ID: Controller ${e} already exists`)),()=>!1):(this.globalRegistry.set(e,r),()=>(this.globalRegistry.delete(e),!0))}static get(e){return this.globalRegistry.has(e)?this.globalRegistry.get(e):(h.error(new Error(`[Virid UseController] ID Not Found: No Controller found with ID: ${e}`)),null)}};i(I,"GlobalRegistry"),v(I,"globalRegistry",q(new Map));var C=I;function $(t,e){Reflect.getMetadata(l.PROJECT,t)?.forEach(n=>{let{key:o,isAccessor:s,type:a,componentClass:c,source:d}=n,u,f=i(p=>{h.error(new Error(`[Virid Project] Read-only: Property "${o}" in "${e.constructor.name}" is a protected projection.
10
+ `))},"readOnlySetter");if(s){if(a==="component"){h.error(new Error(`[Virid Project] Architecture Violation: Manual get/set is forbidden on ${c} projection "${o}". Please use functional source.`));return}let p=Object.getOwnPropertyDescriptor(t,o);u=O({get:i(()=>p?.get?.call(e),"get"),set:i(E=>{p?.set?p.set.call(e,E):f(E)},"set")})}else u=O({get:i(()=>{let p=a==="component",E=p?b.get(c):e,g=d(E);return p?R(g,c.name,o):g},"get"),set:f});let m=Object.getOwnPropertyDescriptor(e,o);m&&m.configurable===!1||Object.defineProperty(e,o,{get:i(()=>u.value,"get"),set:i(p=>u.value=p,"set"),enumerable:!0,configurable:!0})})}i($,"bindProject");function j(t,e){let r=Reflect.getMetadata(l.WATCH,t)||[],n=[];return r.forEach(o=>{let{type:s,source:a,methodName:c,options:d,componentClass:u}=o,f=s==="component"?b.get(u):e;f&&!f.__ccs_processed__&&M(f);let m=i(()=>{try{return a(f)}catch(g){h.error(g,`[Virid Watch] Getter error in ${c}`);return}},"getter"),p=e[c].bind(e),E=Y(m,(g,F)=>{p(g,F)},{...d});n.push(E)}),n}i(j,"bindWatch");function M(t){return!t||typeof t!="object"||t.__virid_responsive_processed__||(Object.defineProperty(t,"__virid_responsive_processed__",{value:!0,enumerable:!1}),(Reflect.getMetadata(l.RESPONSIVE,t)||[]).forEach(r=>{let n=r.key,o=Object.getOwnPropertyDescriptor(t,n),s=o?.get?.__virid_box__;if(s){let a=s.value,c=r.shallow?L(a):P(a);Object.defineProperty(s,"value",{get:i(()=>c.value,"get"),set:i(d=>{c.value=d},"set"),enumerable:!0,configurable:!0})}else{if(o&&o.get)return;let a=t[n],c=r.shallow?L(a):P(a);Object.defineProperty(t,n,{get:i(()=>c.value,"get"),set:i(d=>{c.value=d},"set"),enumerable:!0,configurable:!0})}}),Reflect.ownKeys(t).forEach(r=>{if(r==="__virid_responsive_processed__")return;let n=t[r];n&&typeof n=="object"&&M(n)})),t}i(M,"bindResponsive");function N(t,e){Reflect.getMetadata(l.LIFE_CIRCLE,t)?.forEach(n=>{let{hookName:o,methodName:s}=n,a=e[s].bind(e);switch(o){case"onMounted":Q(a);break;case"onUnmounted":X(a);break;case"onUpdated":Z(a);break;case"onActivated":G(a);break;case"onDeactivated":ee(a);break;case"onSetup":a();break}})}i(N,"bindHooks");function D(t,e){Reflect.getMetadata(l.HOOK,t)?.forEach(n=>{let o=n.hookFactory();e[n.key]=o})}i(D,"bindUseHooks");function H(t,e){let r=Reflect.getMetadata(l.LISTENER,t)||[],n=[];return r.forEach(({key:o,messageClass:s,priority:a,batchMode:c})=>{let d=e[o],u={params:[s],targetClass:e.constructor,methodName:o,originalMethod:d},f={messageClass:s,messageIdx:0,batchMode:c,priority:a};e[o].systemContext=u,e[o].systemContext=f;let m=b.register(e[o]);n.push(m)}),n}i(H,"bindListener");function U(t,e){let r=Reflect.getMetadata(l.INHERIT,t);r&&r.forEach(({key:n,id:o,selector:s})=>{let a=O(()=>{let c=C.get(o);return c?s?s(c):c:(h.warn(`[Virid Inherit] Warning: Inherit target not found: ${o}`),null)});Object.defineProperty(e,n,{get:i(()=>{let c=a.value;return c?R(c,n,""):null},"get"),set:i(()=>{h.error(new Error(`[Virid Inherit] No Modification: Attempted to set read-only Inherit property: ${n}`))},"set"),enumerable:!0,configurable:!0})})}i(U,"bindInherit");function W(t,e,r){Reflect.getMetadata(l.ENV,t).forEach(({key:o})=>{if(!r[o]){h.warn(`[Virid Context] Env Not Found: The "${o}" is not defined in the context.`);return}Object.defineProperty(e,o,{get:i(()=>r[o],"get"),set:i(s=>{if(r[o]!==s)try{r[o]=s}catch(a){h.error(a,`[Virid Context] Set Failed:
11
+ "${o}" is only readable.`)}},"set"),enumerable:!0,configurable:!0})})}i(W,"bindEnv");import{onUnmounted as te,useAttrs as re}from"vue";import{MessageWriter as oe}from"@virid/core";function ne(t,e){let r=b.get(t);if(!Reflect.hasMetadata(l.CONTROLLER,t))return oe.error(new Error(`[Virid Controller] ${t.name} is not a Controller.Use @Controller to inject it.`)),null;let o=Object.getPrototypeOf(r),s=e?.context||re();s&&W(o,r,s),D(o,r),U(o,r),$(o,r);let a=H(o,r);N(o,r);let c=j(o,r),d=i(()=>!0,"unbindRegister");return e?.id&&(d=C.set(e.id,r)),te(()=>{c.forEach(u=>u()),a.forEach(u=>u()),d()}),r}i(ne,"useController");import{MessageWriter as se,BaseMessage as k,SingleMessage as ie}from"@virid/core";function $e(t,e,r){return(n,o)=>{let s=Reflect.getMetadata(l.WATCH,n)||[];typeof e=="function"?s.push({type:"component",componentClass:t,source:e,options:r,methodName:o}):s.push({type:"local",componentClass:null,source:t,options:e,methodName:o}),Reflect.defineMetadata(l.WATCH,s,n)}}i($e,"Watch");function je(t,e){return(r,n,o)=>{let s=Reflect.getMetadata(l.PROJECT,r)||[],a=!!(o?.get||o?.set);if(!t&&!e&&!a){se.error(new Error("[Virid Project] Invalid Usage: @Project() can only be used on getter or setter."));return}let c={key:n,isAccessor:a,type:typeof e=="function"?"component":"local",componentClass:typeof e=="function"?t:null,source:typeof e=="function"?e:a?null:t};s.push(c),Reflect.defineMetadata(l.PROJECT,s,r)}}i(je,"Project");function Ne(t=!1){return(e,r)=>{let n=Reflect.getMetadata(l.RESPONSIVE,e)||[];n.push({key:r,shallow:t}),Reflect.defineMetadata(l.RESPONSIVE,n,e)}}i(Ne,"Responsive");function De(t){return(e,r)=>{let n=Reflect.getMetadata(l.LIFE_CIRCLE,e)||[];n.push({hookName:t,methodName:r}),Reflect.defineMetadata(l.LIFE_CIRCLE,n,e)}}i(De,"OnHook");function He(t){return(e,r)=>{let n=Reflect.getMetadata(l.HOOK,e)||[];n.push({key:r,hookFactory:t}),Reflect.defineMetadata(l.HOOK,n,e)}}i(He,"Use");function Ue(t,e,r){return(n,o)=>{let s=Reflect.getMetadata(l.INHERIT,n)||[];s.push({key:o,token:t,id:e,selector:r}),Reflect.defineMetadata(l.INHERIT,s,n)}}i(Ue,"Inherit");function We(){return(t,e)=>{let r=Reflect.getMetadata(l.ENV,t)||[];r.push({key:e}),Reflect.defineMetadata(l.ENV,r,t)}}i(We,"Env");function ke(t={messageClass:null,priority:0,batchMode:!1}){return(e,r,n)=>{if(typeof e=="function")throw new Error(`[Virid Listener] Method Type Error: The Method "${r}" is a static method. @Listener can only be used on instance member methods.`);let o=Reflect.getMetadata("design:paramtypes",e,r)||[],s=o.map((u,f)=>u===void 0?f:-1).filter(u=>u!==-1);if(s.length>0)throw new Error(`[Virid Listener] Parameter Metadata Loss in "${r}": One or more parameters have 'undefined' types. Check indices: [${s.join(", ")}]`);if(o.length>1)throw new Error(`[Virid Listener] Multiple Parameters Not Allowed: Listener method "${r}" can have at most ONE parameter (BaseMessage subclass or Array).`);let a=t.messageClass,c=t.batchMode??!1;if(o.length===0){if(!t.messageClass)throw new Error(`[Virid Listener] Rule Violation in "${r}": When the method has no parameters, you MUST specify "messageClass" in the decorator options.`)}else{let u=o[0];if(u===Array){if(!t.messageClass)throw new Error(`[Virid Listener] Rule Violation in "${r}": When using batch processing mode with Array, the "messageClass" parameter must be specified in decorator options.`);if(!(t.messageClass.prototype instanceof ie))throw new Error(`[Virid Listener] Type Mismatch in "${r}": Batch processing mode (Array) is only supported for subclasses of SingleMessage.`);c=!0}else if(u===k||u&&u.prototype instanceof k){if(t.messageClass)throw new Error(`[Virid Listener] Rule Violation in "${r}": Cannot specify "messageClass" in decorator options when it is already declared as a method parameter.`);a=u,c=t.batchMode??!1}else throw new Error(`[Virid Listener] Invalid Parameter in "${r}": The single parameter must be either a subclass of BaseMessage or an Array.`)}let d=Reflect.getMetadata(l.LISTENER,e)||[];d.push({key:r,messageClass:a,priority:t.priority||0,batchMode:c}),Reflect.defineMetadata(l.LISTENER,d,e)}}i(ke,"Listener");var A=class A{constructor(){v(this,"name","@virid/vue")}install(e,r){r.disableBorrowChecker&&_(),S(e)}};i(A,"VuePlugin");var B=A;export{We as Env,Ue as Inherit,ke as Listener,De as OnHook,je as Project,Ne as Responsive,He as Use,B as VuePlugin,$e as Watch,ne as useController};
14
12
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/decorators/constant.ts","../src/adapters/bind.ts","../src/app.ts","../src/adapters/borrow-checker.ts","../src/adapters/hook.ts","../src/decorators/vue.ts","../src/index.ts"],"sourcesContent":["/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport { VIRID_METADATA } from \"@virid/core\";\nexport const VIRID_VUE_METADATA = {\n ...VIRID_METADATA,\n RESPONSIVE: \"virid:vue:responsive\",\n LIFE_CIRCLE: \"virid:vue:life-circle\",\n HOOK: \"virid:vue:hook\",\n LISTENER: \"virid:vue:listener\",\n INHERIT: \"virid:vue:inherit\",\n ATTR: \"virid:vue:attr\",\n PROJECT: \"virid:vue:project\",\n WATCH: \"virid:vue:watch\",\n} as const;\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport { VIRID_VUE_METADATA } from \"../decorators/constant\";\nimport {\n watch,\n computed,\n type WatchStopHandle,\n ref,\n shallowReactive,\n onMounted,\n onUnmounted,\n onUpdated,\n onActivated,\n onDeactivated,\n shallowRef,\n type WritableComputedRef,\n} from \"vue\";\nimport {\n MessageWriter,\n type SystemContext,\n EventMessage,\n SingleMessage,\n} from \"@virid/core\";\nimport { viridApp } from \"../app\";\nimport { createBorrowChecker } from \"./borrow-checker\";\nimport {\n type WatchMetadata,\n type ProjectMetadata,\n type InheritMetadata,\n type UseMetadata,\n type ResponsiveMetadata,\n type OnHookMetadata,\n type ListenerMetadata,\n} from \"../interfaces\";\n\n// controller注册表\n\nexport class GlobalRegistry {\n private static globalRegistry = shallowReactive(new Map<string, any>());\n static set(id: string, instance: any): () => boolean {\n if (!this.globalRegistry.has(id)) {\n this.globalRegistry.set(id, instance);\n //返回卸载函数\n return () => {\n this.globalRegistry.delete(id);\n return true;\n };\n } else {\n MessageWriter.error(\n new Error(\n `[Virid UseController] Duplicate ID: Controller ${id} already exists`,\n ),\n );\n return () => false;\n }\n }\n static get(id: string): any {\n //如果找不见,直接报错\n if (!this.globalRegistry.has(id)) {\n MessageWriter.error(\n new Error(\n `[Virid UseController] ID Not Found: No Controller found with ID: ${id}`,\n ),\n );\n return null;\n }\n return this.globalRegistry.get(id);\n }\n}\n/**\n * @Project 连接component,只读一个component的值\n */\nexport function bindProject(proto: any, instance: any) {\n const projects: ProjectMetadata = Reflect.getMetadata(\n VIRID_VUE_METADATA.PROJECT,\n proto,\n );\n\n projects?.forEach((config) => {\n const { key, isAccessor, type, componentClass, source } = config;\n let project: WritableComputedRef<any, any>;\n\n // 统一报错 Setter\n const readOnlySetter = (_val: any) => {\n MessageWriter.error(\n new Error(\n `[Virid Project] Read-only: Property \"${key}\" in \"${instance.constructor.name}\" is a protected projection.\\n`,\n ),\n );\n };\n\n // 手写 Accessor\n if (isAccessor) {\n if (type === \"component\") {\n MessageWriter.error(\n new Error(\n `[Virid Project] Architecture Violation: Manual get/set is forbidden on ${componentClass} projection \"${key}\". Please use functional source.`,\n ),\n );\n return;\n }\n\n // 只有非 component 类型才走到这里,支持读写\n const rawDescriptor = Object.getOwnPropertyDescriptor(proto, key);\n project = computed({\n get: () => rawDescriptor?.get?.call(instance),\n set: (val) => {\n if (rawDescriptor?.set) {\n rawDescriptor.set.call(instance, val);\n } else {\n readOnlySetter(val);\n }\n },\n });\n }\n //函数式投影\n else {\n project = computed({\n get: () => {\n const isFromComponent = type === \"component\";\n const target = isFromComponent\n ? viridApp.get(componentClass)\n : instance;\n const val = source(target);\n\n // 来自 component 的数据套盾\n if (isFromComponent) {\n return createBorrowChecker(val, componentClass!.name, key);\n }\n\n // 来自自己的投影,直接返回\n return val;\n },\n set: readOnlySetter,\n });\n }\n\n const currentDescriptor = Object.getOwnPropertyDescriptor(instance, key);\n if (currentDescriptor && currentDescriptor.configurable === false) return;\n\n Object.defineProperty(instance, key, {\n get: () => project.value,\n set: (val) => (project.value = val),\n enumerable: true,\n configurable: true,\n });\n });\n}\n/**\n * @Watch 自动把函数变成watch\n */\n\nexport function bindWatch(proto: any, instance: any) {\n const watches: WatchMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.WATCH, proto) || [];\n const stops: WatchStopHandle[] = [];\n\n watches.forEach((config) => {\n const { type, source, methodName, options, componentClass } = config;\n\n // 获取目标实例\n const target =\n type === \"component\" ? viridApp.get(componentClass) : instance;\n // 确保目标实例已经过响应式处理\n if (target && !target.__ccs_processed__) {\n bindResponsive(target);\n }\n // 封装 getter\n const getter = () => {\n try {\n return source(target);\n } catch (e) {\n MessageWriter.error(\n e as Error,\n `[Virid Watch] Getter error in ${methodName}`,\n );\n return undefined;\n }\n };\n // 使用 bind 确保回调函数内部的 this 指向当前的 Controller/Instance\n const callback = (instance[methodName] as any).bind(instance);\n // 执行监听\n const stop = watch(\n getter,\n (newVal, oldVal) => {\n callback(newVal, oldVal);\n },\n {\n ...options,\n },\n );\n stops.push(stop);\n });\n\n return stops;\n}\n\n/**\n * @Responsive 递归处理,支持在 Observer 基础上套娃\n */\nexport function bindResponsive(instance: any) {\n if (!instance || typeof instance !== \"object\") return instance;\n if (instance.__virid_responsive_processed__) return instance;\n\n Object.defineProperty(instance, \"__virid_responsive_processed__\", {\n value: true,\n enumerable: false,\n });\n\n const props: ResponsiveMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.RESPONSIVE, instance) || [];\n\n props.forEach((config) => {\n const key = config.key;\n const descriptor = Object.getOwnPropertyDescriptor(instance, key);\n\n // 【关键逻辑】检查是否已经被 bindObservers 劫持过\n const existingBox = (descriptor?.get as any)?.__virid_box__;\n\n // 在 bindResponsive 内部\n if (existingBox) {\n const rawValue = existingBox.value;\n const vRef = config.shallow ? shallowRef(rawValue) : ref(rawValue);\n\n Object.defineProperty(existingBox, \"value\", {\n get: () => vRef.value,\n set: (val) => {\n vRef.value = val;\n },\n enumerable: true,\n configurable: true,\n });\n } else {\n // 普通属性,按照原逻辑处理\n if (descriptor && descriptor.get) return;\n\n const rawValue = instance[key];\n const internalState = config.shallow\n ? shallowRef(rawValue)\n : ref(rawValue);\n\n Object.defineProperty(instance, key, {\n get: () => internalState.value,\n set: (val) => {\n internalState.value = val;\n },\n enumerable: true,\n configurable: true,\n });\n }\n });\n\n // 递归处理子对象\n Reflect.ownKeys(instance).forEach((key) => {\n if (key === \"__virid_responsive_processed__\") return;\n const val = instance[key];\n if (val && typeof val === \"object\") {\n bindResponsive(val);\n }\n });\n return instance;\n}\n\n/**\n * 解析 @OnHook 并将其绑定到 Vue 生命周期\n */\nexport function bindHooks(proto: any, instance: any) {\n const hooks: OnHookMetadata = Reflect.getMetadata(\n VIRID_VUE_METADATA.LIFE_CIRCLE,\n proto,\n );\n\n hooks?.forEach((config) => {\n const { hookName, methodName } = config;\n const fn = instance[methodName].bind(instance);\n\n switch (hookName) {\n case \"onMounted\":\n onMounted(fn);\n break;\n case \"onUnmounted\":\n onUnmounted(fn);\n break;\n case \"onUpdated\":\n onUpdated(fn);\n break;\n case \"onActivated\":\n onActivated(fn);\n break;\n case \"onDeactivated\":\n onDeactivated(fn);\n break;\n case \"onSetup\":\n fn();\n break;\n // 可以根据需要扩展更多的钩子\n }\n });\n}\n\n/**\n * 执行并绑定万能 Hooks\n */\nexport function bindUseHooks(proto: any, instance: any) {\n const hooks: UseMetadata = Reflect.getMetadata(\n VIRID_VUE_METADATA.HOOK,\n proto,\n );\n\n hooks?.forEach((config) => {\n // 在 useController 运行期间执行 hookFactory()\n const hookResult = config.hookFactory();\n // 直接赋值给实例\n instance[config.key] = hookResult;\n });\n}\n\n/**\n * @description: 启动@Listener 为 Controller 实例绑定监听器并返回销毁函数列表\n **/\nexport function bindListener(proto: any, instance: any): (() => void)[] {\n const listenerConfigs: ListenerMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.LISTENER, proto) || [];\n const unbindFunctions: (() => void)[] = [];\n\n listenerConfigs.forEach(({ key, messageClass, priority, single }) => {\n const originalMethod = instance[key];\n\n // 强制只能接受一个参数且是 SingleMessage\n const wrappedHandler = function (\n currentMessage: SingleMessage[] | EventMessage,\n ) {\n const sample = Array.isArray(currentMessage)\n ? currentMessage[0]\n : currentMessage;\n let params;\n if (!(sample instanceof messageClass)) {\n // 如果类型不匹配,说明 Dispatcher 路由逻辑或元数据配置有问题\n MessageWriter.error(\n new Error(\n `[Virid Listener] Type Mismatch: Expected ${messageClass.name}, but received ${sample?.constructor.name}`,\n ),\n );\n return null;\n }\n // 处理 SingleMessage (合并且批处理类型)\n if (sample instanceof SingleMessage) {\n // 如果用户标记了 single: true,则只取最后一条(最新的一条)\n if (single) {\n params = Array.isArray(currentMessage)\n ? [currentMessage[currentMessage.length - 1]]\n : currentMessage;\n } else {\n // 否则默认返回整个数组(批处理模式)\n params = Array.isArray(currentMessage)\n ? currentMessage\n : [currentMessage];\n }\n }\n // 处理 EventMessage (顺序单发类型)\n else if (sample instanceof EventMessage) {\n params = [currentMessage];\n } else {\n throw new Error(\n `[Virid System] unknown Message Types: Message ${messageClass.name} is not a subclass of SingleMessage or EventMessage!`,\n );\n }\n originalMethod.apply(instance, params);\n };\n\n // 给包装后的函数挂载上下文信息(供 Dispatcher 读取)\n const taskContext: SystemContext = {\n params: [messageClass],\n targetClass: instance.constructor,\n methodName: key,\n originalMethod: originalMethod,\n };\n (wrappedHandler as any).systemContext = taskContext;\n\n const unregister = viridApp.register(\n messageClass,\n wrappedHandler,\n priority,\n );\n unbindFunctions.push(unregister);\n });\n\n return unbindFunctions;\n}\n\n/**\n * @description: 启动@Inherit 使能够只读其他的controller\n **/\nexport function bindInherit(proto: any, instance: any) {\n const inherits: InheritMetadata = Reflect.getMetadata(\n VIRID_VUE_METADATA.INHERIT,\n proto,\n );\n if (!inherits) return;\n\n inherits.forEach(({ key, id, selector }) => {\n // 为每个继承属性创建一个私有的 computed 引用\n // 这个 computed 就像一个隧道,一头连着 Registry,一头连着子组件\n const tunnel = computed(() => {\n const target = GlobalRegistry.get(id); // 自动依赖 Registry 的增删\n if (!target) {\n MessageWriter.warn(\n `[Virid Inherit] Warning:\\n Inherit target not found: ${id}`,\n );\n return null;\n }\n // 这里的 selector(target) 也会触发依赖收集\n // 如果 target.state.count 变了,这个 computed 也会感知到\n return selector ? selector(target) : target;\n });\n\n Object.defineProperty(instance, key, {\n get: () => {\n const val = tunnel.value; // 访问 computed.value\n // 返回时依然套上护盾,确保“弱引用”也是“只读引用”\n return val ? createBorrowChecker(val, key, \"\") : null;\n },\n set: () => {\n MessageWriter.error(\n new Error(\n `[Virid Inherit] No Modification:\\nAttempted to set read-only Inherit property: ${key}`,\n ),\n );\n },\n enumerable: true,\n configurable: true,\n });\n });\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport { type ViridApp, Newable } from \"@virid/core\";\nimport { bindResponsive } from \"./adapters/bind\";\nexport interface IViridApp {\n register(\n messageClass: any,\n systemFn: (...args: any[]) => any,\n priority: number,\n ): () => void;\n get(identifier: any): any;\n bindComponent<T>(identifier: Newable<T>): void;\n}\n\nlet activeApp: IViridApp | null = null;\n\n/**\n * 激活真正的 App 实例\n */\nexport function activateApp(app: ViridApp) {\n const bindResponsiveHook = (instance: any) => {\n if (instance) {\n bindResponsive(instance);\n }\n return instance;\n };\n app.addActivationHook(bindResponsiveHook);\n activeApp = app;\n}\n\n/**\n * viridApp 代理\n */\nexport const viridApp: IViridApp = new Proxy({} as IViridApp, {\n get(_, prop: keyof IViridApp) {\n return (...args: any[]) => {\n // 检查实例是否存在\n if (!activeApp) {\n console.warn(\n `[Virid Vue] App method \"${String(prop)}\" called before initialization.`,\n );\n\n // 针对 register 这种有返回值的函数做特殊处理\n if (prop === \"register\") {\n return () => {\n console.warn(\n \"[Virid Vue] Cleanup ignored: source listener was never registered.\",\n );\n };\n }\n return undefined;\n }\n\n // 正常转发调用\n // 使用 Reflect 确保 this 指向正确,或者直接从 activeApp 调用\n const targetMethod = activeApp[prop];\n if (typeof targetMethod === \"function\") {\n return Reflect.apply(targetMethod, activeApp, args);\n }\n };\n },\n});\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport { MessageWriter } from \"@virid/core\";\nimport { VIRID_VUE_METADATA } from \"../decorators/constant\";\n\n// 在文件顶部定义缓存池\nconst borrowCache = new WeakMap<any, any>();\n/**\n * 递归借用检查代理:将对象及其所有后代变为硬只读\n */\nexport function createBorrowChecker(\n target: any,\n rootName: string,\n path: string = \"\",\n): any {\n // 基本类型处理\n if (\n target === null ||\n (typeof target !== \"object\" && typeof target !== \"function\")\n ) {\n return target;\n }\n if (borrowCache.has(target)) {\n return borrowCache.get(target);\n }\n\n const proxy = new Proxy(target, {\n get(obj, prop, receiver) {\n const value = Reflect.get(obj, prop, receiver);\n const currentPath = path ? `${path}.${String(prop)}` : String(prop);\n // 函数拦截\n if (typeof value === \"function\") {\n return (...args: any[]) => {\n if (!isShieldException(obj, prop)) {\n const errorMsg = [\n `[Virid Shield] Rejected`,\n `Method: ${rootName}....${currentPath}()`,\n `Reason: Unauthorized access to unsafe method.`,\n ].join(\"\\n\");\n MessageWriter.error(new Error(errorMsg));\n return null;\n }\n\n // 安全执行:如果是 Safe 的,执行它\n const result = value.apply(obj, args);\n // 对返回值递归借用检查\n return createBorrowChecker(result, rootName, `${currentPath}()`);\n };\n }\n // 自动给子对象也加上借用检查\n return createBorrowChecker(value, rootName, currentPath);\n },\n\n set(_obj, prop) {\n const currentPath = path ? `${path}.${String(prop)}` : String(prop);\n\n // 优雅地失败,并给出修复建议\n const errorMsg = [\n `[Virid Borrow Checker]`,\n `------------------------------------------------`,\n `Component: ${rootName}`,\n `Code: ${rootName}....${currentPath}`,\n `Result: Rejected`,\n `Reason: This object is write protected and cannot be modified.`,\n `Stack: ${new Error().stack}`,\n `------------------------------------------------`,\n ].join(\"\\n\");\n MessageWriter.error(new Error(errorMsg));\n return false;\n },\n deleteProperty(_obj, prop) {\n MessageWriter.error(\n new Error(\n `[Virid Shield] Physical Protection:\\nProhibit Deletion of Component Attributes ${String(prop)}`,\n ),\n );\n return false;\n },\n defineProperty() {\n MessageWriter.error(\n new Error(\n `[Virid Shield] Physical Protection:\\nProhibit redefining component attribute structure`,\n ),\n );\n return false;\n },\n });\n borrowCache.set(target, proxy);\n return proxy;\n}\n/**\n * 判断一个方法是否应该跳过护盾拦截\n */\nfunction isShieldException(obj: any, prop: string | symbol): boolean {\n // 1. 内置协议 (Symbol 和基础 Object 方法)\n const PROTOCOL_WHITELIST = new Set<string | symbol>([\n Symbol.iterator,\n Symbol.asyncIterator,\n Symbol.toStringTag,\n \"toString\",\n \"valueOf\",\n \"toJSON\",\n \"constructor\",\n ]);\n if (PROTOCOL_WHITELIST.has(prop)) return true;\n\n // 2. 集合类(Map/Set/Array) 的只读方法白名单\n const constructorName = obj.constructor?.name;\n\n // 核心修复:补充 Array 的只读操作方法\n const READONLY_COLLECTIONS: Record<string, Set<string | symbol>> = {\n Map: new Set([\n \"get\",\n \"has\",\n \"keys\",\n \"values\",\n \"entries\",\n \"forEach\",\n \"size\",\n ]),\n Set: new Set([\"has\", \"keys\", \"values\", \"entries\", \"forEach\", \"size\"]),\n Array: new Set([\n \"length\",\n \"map\",\n \"filter\",\n \"reduce\",\n \"slice\",\n \"find\",\n \"includes\",\n \"findIndex\",\n \"every\",\n \"some\",\n \"at\",\n \"join\",\n \"concat\",\n \"flat\",\n \"flatMap\",\n \"indexOf\",\n \"lastIndexOf\",\n ]),\n String: new Set([\n \"length\",\n \"slice\",\n \"substring\",\n \"substr\",\n \"split\",\n \"includes\",\n \"startsWith\",\n \"endsWith\",\n \"indexOf\",\n \"replace\",\n \"replaceAll\",\n \"trim\",\n \"toLowerCase\",\n \"toUpperCase\",\n ]),\n };\n\n if (READONLY_COLLECTIONS[constructorName]?.has(prop)) return true;\n\n // 3. 手动标记的 @Safe 装饰器方法\n const safeMethods = Reflect.getMetadata(VIRID_VUE_METADATA.SAFE, obj);\n if (safeMethods instanceof Set && safeMethods.has(prop)) return true;\n\n return false;\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport {\n bindProject,\n bindWatch,\n bindHooks,\n bindUseHooks,\n bindListener,\n GlobalRegistry,\n bindInherit,\n} from \"./bind\";\nimport { onUnmounted, useAttrs } from \"vue\";\nimport { VIRID_VUE_METADATA } from \"../decorators/constant\";\nimport { MessageWriter, Newable } from \"@virid/core\";\nimport { viridApp } from \"../app\";\n/**\n * @description: vue的hooks适配器,注入IOC容器中的Controller实例,并挂在vue的各种方法\n * @param token\n * @return {*}\n */\nexport function useController<T>(\n token: Newable<T>,\n options?: { id?: string; context?: any },\n): T {\n const instance = viridApp.get(token) as any;\n\n //注入vue的乱七八糟的context\n const reactiveContext = options?.context || useAttrs();\n if (reactiveContext) {\n injectContext(reactiveContext, instance);\n }\n\n // 检查身份 Controller\n const isController = Reflect.hasMetadata(\n VIRID_VUE_METADATA.CONTROLLER,\n token,\n );\n if (!isController) {\n // 确保非 Controller 的实例不能被其他 Controller 访问\n MessageWriter.error(\n new Error(\n `[Virid Controller] ${token.name} is not a Controller.Use @Controller to inject it.`,\n ),\n );\n return null as T;\n }\n\n //绑定各种魔法装饰器\n const proto = Object.getPrototypeOf(instance);\n // @Use装饰器\n bindUseHooks(proto, instance);\n // @Inherit装饰器\n bindInherit(proto, instance);\n // @Project装饰器\n bindProject(proto, instance);\n // @Listener装饰器\n // 运行时动态挂载监听器\n const unbindList = bindListener(proto, instance);\n // 生命周期钩子\n bindHooks(proto, instance);\n //绑定全局注册表\n // @Watch装饰器\n const stops = bindWatch(proto, instance);\n //如果有id,就去注册\n let unbindRegister = () => true;\n if (options?.id) {\n unbindRegister = GlobalRegistry.set(options.id, instance);\n }\n onUnmounted(() => {\n stops.forEach((stop) => stop());\n unbindList.forEach((stop) => stop());\n unbindRegister();\n // 自动卸载信号处理器,防止 Controller 销毁后残留\n });\n\n return instance;\n}\n\n/**\nu* @description: 把槽或者其他乱七八糟的东西传递过来的上下文注入到controller里\n * @param {*} context 上下文对象\n * @param {*} instance controller实例\n */\nfunction injectContext(context: any, instance: any) {\n if (context && typeof context === \"object\") {\n Object.keys(context).forEach((key) => {\n Object.defineProperty(instance, key, {\n // Getter 确保了 @Watch 的依赖收集能一路穿透到 Vue 源头\n get: () => context[key],\n // 处理写入逻辑\n set: (val) => {\n if (context[key] === val) return;\n try {\n context[key] = val;\n } catch (e) {\n MessageWriter.error(\n e as Error,\n `[Virid Context] Set Failed:\\n \"${key}\" is only readable.`,\n );\n }\n },\n enumerable: true,\n configurable: true,\n });\n });\n }\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport { VIRID_VUE_METADATA } from \"./constant\";\nimport type { WatchOptions } from \"vue\";\nimport { MessageWriter, type Newable, BaseMessage } from \"@virid/core\";\nimport {\n type WatchMetadata,\n type ProjectMetadata,\n type InheritMetadata,\n type UseMetadata,\n type ResponsiveMetadata,\n type OnHookMetadata,\n type ListenerMetadata,\n type ListenerConfig,\n} from \"../interfaces\";\n/**\n * @description:实现Watch\n */\n\n// 重载 1: 监听 Controller 自身变量\nexport function Watch<T>(\n source: (instance: T) => any | Promise<any>,\n options?: WatchOptions,\n): any;\n\n// 重载 2: 监听全局 Component 变量\nexport function Watch<C>(\n component: Newable<C>,\n source: (comp: C) => any | Promise<any>,\n options?: WatchOptions,\n): any;\n\n// 实现逻辑\nexport function Watch(arg1: any, arg2?: any, arg3?: any) {\n return (target: any, methodName: string) => {\n const existing: WatchMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.WATCH, target) || [];\n\n if (typeof arg2 === \"function\") {\n // 重载 2: Watch(Component, (c) => c.prop, options)\n existing.push({\n type: \"component\",\n componentClass: arg1,\n source: arg2,\n options: arg3,\n methodName,\n });\n } else {\n // 重载 1: Watch((i) => i.prop, options)\n existing.push({\n type: \"local\",\n componentClass: null,\n source: arg1,\n options: arg2,\n methodName,\n });\n }\n\n Reflect.defineMetadata(VIRID_VUE_METADATA.WATCH, existing, target);\n };\n}\n/**\n * @description: 实现数据投影\n * 用法:@Project() 或 @Project('a.b.c')\n */\n// 重载 1: 内部投影 @Project(i => i.someService.data)\nexport function Project<T>(source: (instance: T) => any): any;\n\n// 重载 2: 跨组件投影 @Project(UserComponent, c => c.name)\nexport function Project<C>(\n component: new (...args: any[]) => C,\n source: (comp: C) => any,\n): any;\n// 重载 3: 内部get set 投影 @Project() public get name() {}\nexport function Project<T>(): any;\n// 实现逻辑\nexport function Project(arg1?: any, arg2?: any) {\n return (target: any, key: string, descriptor?: PropertyDescriptor) => {\n const existing: ProjectMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.PROJECT, target) || [];\n const isAccessor = !!(descriptor?.get || descriptor?.set);\n if (!arg1 && !arg2 && !isAccessor) {\n MessageWriter.error(\n new Error(\n `[Virid Project] Invalid Usage: @Project() can only be used on getter or setter.`,\n ),\n );\n return;\n }\n const metadata = {\n key,\n isAccessor: isAccessor,\n // 这里的逻辑和 Watch 保持高度一致\n type: typeof arg2 === \"function\" ? \"component\" : \"local\",\n componentClass: typeof arg2 === \"function\" ? arg1 : null,\n source: typeof arg2 === \"function\" ? arg2 : isAccessor ? null : arg1,\n } as const;\n\n existing.push(metadata);\n Reflect.defineMetadata(VIRID_VUE_METADATA.PROJECT, existing, target);\n };\n}\n/**\n * @description: 给数据增加响应式\n * 用法:@Responsive()\n */\nexport function Responsive(shallow = false) {\n return (target: any, key: string) => {\n // 记录哪些属性需要变成响应式\n const props: ResponsiveMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.RESPONSIVE, target) || [];\n props.push({ key, shallow });\n Reflect.defineMetadata(VIRID_VUE_METADATA.RESPONSIVE, props, target);\n };\n}\n\n/**\n * @description: 声明式生命周期钩子\n * 用法:@OnHook(\"onMounted\")\n */\nexport function OnHook(\n hookName:\n | \"onMounted\"\n | \"onUnmounted\"\n | \"onUpdated\"\n | \"onActivated\"\n | \"onDeactivated\"\n | \"onSetup\",\n) {\n return (target: any, methodName: string) => {\n const existing: OnHookMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.LIFE_CIRCLE, target) || [];\n existing.push({ hookName, methodName });\n Reflect.defineMetadata(VIRID_VUE_METADATA.LIFE_CIRCLE, existing, target);\n };\n}\n/**\n * @description: 万能 Hook 注入装饰器\n * 用法:@Use(() => useRoute()) public route!: RouteLocationNormalized\n */\nexport function Use(hookFactory: () => any) {\n return (target: any, key: string) => {\n const existing: UseMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.HOOK, target) || [];\n existing.push({ key, hookFactory });\n Reflect.defineMetadata(VIRID_VUE_METADATA.HOOK, existing, target);\n };\n}\n/**\n * @description: Inherit注入装饰器\n * 用法:@Inherit(Controller,(instance) => instance.xxxx) public data!: SomeType\n */\nexport function Inherit<T>(\n token: Newable<T>,\n id: string,\n selector: (instance: T) => any,\n) {\n return (target: any, key: string) => {\n const metadata: InheritMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.INHERIT, target) || [];\n metadata.push({ key, token, id, selector });\n Reflect.defineMetadata(VIRID_VUE_METADATA.INHERIT, metadata, target);\n };\n}\n\n/**\n * @description: 标记一个属性是从外部环境(context)注入的\n * 纯元数据标记,什么也不干,方便后期做自动化文档或 TS 类型提示\n */\nexport function Env() {\n return (_target: any, _propertyKey: string) => {\n // 即使现在不存元数据,有了这个装饰器,Controller 看起来也会更清晰\n };\n}\n\n/**\n * @description: Listener 装饰器 - 标记 Controller 的成员方法为消息监听器\n */\nexport function Listener<T extends BaseMessage>({\n messageClass,\n priority = 0,\n single = true,\n}: ListenerConfig<T>) {\n return (target: any, key: string) => {\n // 获取该 Controller 原型上已有的监听器元数据\n const listeners: ListenerMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.LISTENER, target) || [];\n\n // 存入当前方法的配置:哪个方法(key) 听 哪个消息(messageClass)\n listeners.push({\n key,\n messageClass,\n priority,\n single,\n });\n\n // 将元数据重新定义回类原型,供 useController 在实例化时扫描\n Reflect.defineMetadata(VIRID_VUE_METADATA.LISTENER, listeners, target);\n };\n}\n","/*\n * Copyright (c) 2026-present Ailrid\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Description: Vue adapter for virid, projecting logic sovereignty to reactive UI.\n */\nimport { ViridPlugin, type ViridApp } from \"@virid/core\";\nexport * from \"./adapters\";\nexport * from \"./decorators\";\nexport * from \"./interfaces\";\nimport { activateApp } from \"./app\";\nexport const VuePlugin: ViridPlugin = {\n name: \"@virid/vue\",\n install(app: ViridApp, _options) {\n activateApp(app);\n },\n};\n"],"mappings":"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","names":["VIRID_METADATA","VIRID_VUE_METADATA","RESPONSIVE","LIFE_CIRCLE","HOOK","LISTENER","INHERIT","ATTR","PROJECT","WATCH","watch","computed","ref","shallowReactive","onMounted","onUnmounted","onUpdated","onActivated","onDeactivated","shallowRef","MessageWriter","EventMessage","SingleMessage","activeApp","activateApp","app","bindResponsiveHook","__name","instance","bindResponsive","addActivationHook","viridApp","Proxy","get","_","prop","args","console","warn","String","targetMethod","Reflect","apply","MessageWriter","borrowCache","WeakMap","createBorrowChecker","target","rootName","path","has","get","proxy","Proxy","obj","prop","receiver","value","Reflect","currentPath","String","args","isShieldException","errorMsg","join","MessageWriter","error","Error","result","apply","set","_obj","stack","deleteProperty","defineProperty","Set","Symbol","iterator","asyncIterator","toStringTag","constructorName","name","Map","Array","safeMethods","getMetadata","VIRID_VUE_METADATA","SAFE","GlobalRegistry","set","id","instance","globalRegistry","has","MessageWriter","error","Error","delete","get","__publicField","shallowReactive","Map","_GlobalRegistry","bindProject","proto","Reflect","getMetadata","VIRID_VUE_METADATA","PROJECT","forEach","config","key","isAccessor","type","componentClass","source","project","readOnlySetter","__name","_val","name","rawDescriptor","Object","getOwnPropertyDescriptor","computed","call","val","isFromComponent","target","viridApp","createBorrowChecker","currentDescriptor","configurable","defineProperty","value","enumerable","bindWatch","watches","WATCH","stops","methodName","options","__ccs_processed__","bindResponsive","getter","e","callback","bind","stop","watch","newVal","oldVal","push","__virid_responsive_processed__","RESPONSIVE","descriptor","existingBox","__virid_box__","rawValue","vRef","shallow","shallowRef","ref","internalState","ownKeys","bindHooks","LIFE_CIRCLE","hookName","fn","onMounted","onUnmounted","onUpdated","onActivated","onDeactivated","bindUseHooks","HOOK","hookResult","hookFactory","bindListener","listenerConfigs","LISTENER","unbindFunctions","messageClass","priority","single","originalMethod","wrappedHandler","currentMessage","sample","Array","isArray","params","SingleMessage","length","EventMessage","apply","taskContext","targetClass","systemContext","unregister","register","bindInherit","inherits","INHERIT","selector","tunnel","warn","onUnmounted","useAttrs","MessageWriter","useController","token","options","instance","viridApp","get","reactiveContext","context","useAttrs","injectContext","Reflect","hasMetadata","VIRID_VUE_METADATA","CONTROLLER","MessageWriter","error","Error","name","proto","Object","getPrototypeOf","bindUseHooks","bindInherit","bindProject","unbindList","bindListener","bindHooks","stops","bindWatch","unbindRegister","__name","id","GlobalRegistry","set","onUnmounted","forEach","stop","keys","key","defineProperty","val","e","enumerable","configurable","MessageWriter","Watch","arg1","arg2","arg3","target","methodName","existing","Reflect","getMetadata","VIRID_VUE_METADATA","WATCH","push","type","componentClass","source","options","defineMetadata","Project","key","descriptor","PROJECT","isAccessor","get","set","MessageWriter","error","Error","metadata","Responsive","shallow","props","RESPONSIVE","OnHook","hookName","LIFE_CIRCLE","Use","hookFactory","HOOK","Inherit","token","id","selector","INHERIT","Env","_target","_propertyKey","Listener","messageClass","priority","single","listeners","LISTENER","VuePlugin","name","install","app","_options","activateApp"]}
1
+ {"version":3,"sources":["../src/decorators/constant.ts","../src/adapters/bind.ts","../src/app.ts","../src/adapters/borrow_checker.ts","../src/adapters/hook.ts","../src/decorators/vue.ts","../src/index.ts"],"sourcesContent":["/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport { VIRID_METADATA } from \"@virid/core\";\nexport const VIRID_VUE_METADATA = {\n ...VIRID_METADATA,\n RESPONSIVE: \"virid:vue:responsive\",\n LIFE_CIRCLE: \"virid:vue:life-circle\",\n HOOK: \"virid:vue:hook\",\n LISTENER: \"virid:vue:listener\",\n INHERIT: \"virid:vue:inherit\",\n ATTR: \"virid:vue:attr\",\n PROJECT: \"virid:vue:project\",\n WATCH: \"virid:vue:watch\",\n ENV: \"virid:vue:env\",\n} as const;\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport { VIRID_VUE_METADATA } from \"../decorators/constant\";\nimport {\n watch,\n computed,\n type WatchStopHandle,\n ref,\n shallowReactive,\n onMounted,\n onUnmounted,\n onUpdated,\n onActivated,\n onDeactivated,\n shallowRef,\n type WritableComputedRef,\n} from \"vue\";\nimport { MessageWriter, type SystemContext, SystemConfig } from \"@virid/core\";\nimport { viridApp } from \"../app\";\nimport { createBorrowChecker } from \"./borrow_checker\";\nimport {\n type WatchMetadata,\n type ProjectMetadata,\n type InheritMetadata,\n type UseMetadata,\n type ResponsiveMetadata,\n type OnHookMetadata,\n type ListenerMetadata,\n EnvMetadata,\n} from \"../interfaces\";\n\n// controller注册表\n\nexport class GlobalRegistry {\n private static globalRegistry = shallowReactive(new Map<string, any>());\n static set(id: string, instance: any): () => boolean {\n if (!this.globalRegistry.has(id)) {\n this.globalRegistry.set(id, instance);\n //返回卸载函数\n return () => {\n this.globalRegistry.delete(id);\n return true;\n };\n } else {\n MessageWriter.error(\n new Error(\n `[Virid UseController] Duplicate ID: Controller ${id} already exists`,\n ),\n );\n return () => false;\n }\n }\n static get(id: string): any {\n //如果找不见,直接报错\n if (!this.globalRegistry.has(id)) {\n MessageWriter.error(\n new Error(\n `[Virid UseController] ID Not Found: No Controller found with ID: ${id}`,\n ),\n );\n return null;\n }\n return this.globalRegistry.get(id);\n }\n}\n/**\n * @Project 连接component,只读一个component的值\n */\nexport function bindProject(proto: any, instance: any) {\n const projects: ProjectMetadata = Reflect.getMetadata(\n VIRID_VUE_METADATA.PROJECT,\n proto,\n );\n\n projects?.forEach((config) => {\n const { key, isAccessor, type, componentClass, source } = config;\n let project: WritableComputedRef<any, any>;\n\n // 统一报错 Setter\n const readOnlySetter = (_val: any) => {\n MessageWriter.error(\n new Error(\n `[Virid Project] Read-only: Property \"${key}\" in \"${instance.constructor.name}\" is a protected projection.\\n`,\n ),\n );\n };\n\n // 手写 Accessor\n if (isAccessor) {\n if (type === \"component\") {\n MessageWriter.error(\n new Error(\n `[Virid Project] Architecture Violation: Manual get/set is forbidden on ${componentClass} projection \"${key}\". Please use functional source.`,\n ),\n );\n return;\n }\n\n // 只有非 component 类型才走到这里,支持读写\n const rawDescriptor = Object.getOwnPropertyDescriptor(proto, key);\n project = computed({\n get: () => rawDescriptor?.get?.call(instance),\n set: (val) => {\n if (rawDescriptor?.set) {\n rawDescriptor.set.call(instance, val);\n } else {\n readOnlySetter(val);\n }\n },\n });\n }\n //函数式投影\n else {\n project = computed({\n get: () => {\n const isFromComponent = type === \"component\";\n const target = isFromComponent\n ? viridApp.get(componentClass)\n : instance;\n const val = source(target);\n\n // 来自 component 的数据套盾\n if (isFromComponent) {\n return createBorrowChecker(val, componentClass!.name, key);\n }\n\n // 来自自己的投影,直接返回\n return val;\n },\n set: readOnlySetter,\n });\n }\n\n const currentDescriptor = Object.getOwnPropertyDescriptor(instance, key);\n if (currentDescriptor && currentDescriptor.configurable === false) return;\n\n Object.defineProperty(instance, key, {\n get: () => project.value,\n set: (val) => (project.value = val),\n enumerable: true,\n configurable: true,\n });\n });\n}\n/**\n * @Watch 自动把函数变成watch\n */\n\nexport function bindWatch(proto: any, instance: any) {\n const watches: WatchMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.WATCH, proto) || [];\n const stops: WatchStopHandle[] = [];\n\n watches.forEach((config) => {\n const { type, source, methodName, options, componentClass } = config;\n\n // 获取目标实例\n const target =\n type === \"component\" ? viridApp.get(componentClass) : instance;\n // 确保目标实例已经过响应式处理\n if (target && !target.__ccs_processed__) {\n bindResponsive(target);\n }\n // 封装 getter\n const getter = () => {\n try {\n return source(target);\n } catch (e) {\n MessageWriter.error(\n e as Error,\n `[Virid Watch] Getter error in ${methodName}`,\n );\n return undefined;\n }\n };\n // 使用 bind 确保回调函数内部的 this 指向当前的 Controller/Instance\n const callback = (instance[methodName] as any).bind(instance);\n // 执行监听\n const stop = watch(\n getter,\n (newVal, oldVal) => {\n callback(newVal, oldVal);\n },\n {\n ...options,\n },\n );\n stops.push(stop);\n });\n\n return stops;\n}\n\n/**\n * @Responsive 递归处理,支持在 Observer 基础上套娃\n */\nexport function bindResponsive(instance: any) {\n if (!instance || typeof instance !== \"object\") return instance;\n if (instance.__virid_responsive_processed__) return instance;\n\n Object.defineProperty(instance, \"__virid_responsive_processed__\", {\n value: true,\n enumerable: false,\n });\n\n const props: ResponsiveMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.RESPONSIVE, instance) || [];\n\n props.forEach((config) => {\n const key = config.key;\n const descriptor = Object.getOwnPropertyDescriptor(instance, key);\n\n // 【关键逻辑】检查是否已经被 bindObservers 劫持过\n const existingBox = (descriptor?.get as any)?.__virid_box__;\n\n // 在 bindResponsive 内部\n if (existingBox) {\n const rawValue = existingBox.value;\n const vRef = config.shallow ? shallowRef(rawValue) : ref(rawValue);\n\n Object.defineProperty(existingBox, \"value\", {\n get: () => vRef.value,\n set: (val) => {\n vRef.value = val;\n },\n enumerable: true,\n configurable: true,\n });\n } else {\n // 普通属性,按照原逻辑处理\n if (descriptor && descriptor.get) return;\n\n const rawValue = instance[key];\n const internalState = config.shallow\n ? shallowRef(rawValue)\n : ref(rawValue);\n\n Object.defineProperty(instance, key, {\n get: () => internalState.value,\n set: (val) => {\n internalState.value = val;\n },\n enumerable: true,\n configurable: true,\n });\n }\n });\n\n // 递归处理子对象\n Reflect.ownKeys(instance).forEach((key) => {\n if (key === \"__virid_responsive_processed__\") return;\n const val = instance[key];\n if (val && typeof val === \"object\") {\n bindResponsive(val);\n }\n });\n return instance;\n}\n\n/**\n * 解析 @OnHook 并将其绑定到 Vue 生命周期\n */\nexport function bindHooks(proto: any, instance: any) {\n const hooks: OnHookMetadata = Reflect.getMetadata(\n VIRID_VUE_METADATA.LIFE_CIRCLE,\n proto,\n );\n\n hooks?.forEach((config) => {\n const { hookName, methodName } = config;\n const fn = instance[methodName].bind(instance);\n\n switch (hookName) {\n case \"onMounted\":\n onMounted(fn);\n break;\n case \"onUnmounted\":\n onUnmounted(fn);\n break;\n case \"onUpdated\":\n onUpdated(fn);\n break;\n case \"onActivated\":\n onActivated(fn);\n break;\n case \"onDeactivated\":\n onDeactivated(fn);\n break;\n case \"onSetup\":\n fn();\n break;\n // 可以根据需要扩展更多的钩子\n }\n });\n}\n\n/**\n * 执行并绑定万能 Hooks\n */\nexport function bindUseHooks(proto: any, instance: any) {\n const hooks: UseMetadata = Reflect.getMetadata(\n VIRID_VUE_METADATA.HOOK,\n proto,\n );\n\n hooks?.forEach((config) => {\n // 在 useController 运行期间执行 hookFactory()\n const hookResult = config.hookFactory();\n // 直接赋值给实例\n instance[config.key] = hookResult;\n });\n}\n\n/**\n * @description: 启动@Listener 为 Controller 实例绑定监听器并返回销毁函数列表\n **/\nexport function bindListener(proto: any, instance: any): (() => void)[] {\n const listenerConfigs: ListenerMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.LISTENER, proto) || [];\n const unbindFunctions: (() => void)[] = [];\n\n listenerConfigs.forEach(({ key, messageClass, priority, batchMode }) => {\n const originalMethod = instance[key];\n\n // 给包装后的函数挂载上下文信息\n const listenerContext: SystemContext = {\n params: [messageClass],\n targetClass: instance.constructor,\n methodName: key,\n originalMethod: originalMethod,\n };\n\n const listenerConfig: SystemConfig = {\n messageClass: messageClass,\n messageIdx: 0,\n batchMode: batchMode,\n priority: priority,\n };\n (instance[key] as any).systemContext = listenerContext;\n (instance[key] as any).systemContext = listenerConfig;\n\n const unregister = viridApp.register(instance[key]);\n unbindFunctions.push(unregister);\n });\n\n return unbindFunctions;\n}\n\n/**\n * @description: 启动@Inherit 使能够只读其他的controller\n **/\nexport function bindInherit(proto: any, instance: any) {\n const inherits: InheritMetadata = Reflect.getMetadata(\n VIRID_VUE_METADATA.INHERIT,\n proto,\n );\n if (!inherits) return;\n\n inherits.forEach(({ key, id, selector }) => {\n // 为每个继承属性创建一个私有的 computed 引用\n // 这个 computed 就像一个隧道,一头连着 Registry,一头连着子组件\n const tunnel = computed(() => {\n const target = GlobalRegistry.get(id); // 自动依赖 Registry 的增删\n if (!target) {\n MessageWriter.warn(\n `[Virid Inherit] Warning: Inherit target not found: ${id}`,\n );\n return null;\n }\n // 这里的 selector(target) 也会触发依赖收集\n // 如果 target.state.count 变了,这个 computed 也会感知到\n return selector ? selector(target) : target;\n });\n\n Object.defineProperty(instance, key, {\n get: () => {\n const val = tunnel.value; // 访问 computed.value\n // 返回时依然套上护盾,确保“弱引用”也是“只读引用”\n return val ? createBorrowChecker(val, key, \"\") : null;\n },\n set: () => {\n MessageWriter.error(\n new Error(\n `[Virid Inherit] No Modification: Attempted to set read-only Inherit property: ${key}`,\n ),\n );\n },\n enumerable: true,\n configurable: true,\n });\n });\n}\n\n/**\nu* @description: 把槽或者其他乱七八糟的东西传递过来的上下文注入到controller里\n * @param {*} context 上下文对象\n * @param {*} instance controller实例\n */\nexport function bindEnv(proto: any, instance: any, context: any) {\n const envs: EnvMetadata = Reflect.getMetadata(VIRID_VUE_METADATA.ENV, proto);\n\n envs.forEach(({ key }) => {\n if (!context[key]) {\n MessageWriter.warn(\n `[Virid Context] Env Not Found: The \"${key}\" is not defined in the context.`,\n );\n return;\n }\n Object.defineProperty(instance, key, {\n get: () => context[key],\n set: (val) => {\n if (context[key] === val) return;\n try {\n context[key] = val;\n } catch (e) {\n MessageWriter.error(\n e as Error,\n `[Virid Context] Set Failed:\\n \"${key}\" is only readable.`,\n );\n }\n },\n enumerable: true,\n configurable: true,\n });\n });\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport { type ViridApp, Newable } from \"@virid/core\";\nimport { bindResponsive } from \"./adapters/bind\";\nexport interface IViridApp {\n register(systemFn: (...args: any[]) => any): () => void;\n get(identifier: any): any;\n bind<T>(identifier: Newable<T>): void;\n}\n\nlet activeApp: IViridApp | null = null;\n\nexport function activateApp(app: ViridApp) {\n const bindResponsiveHook = (instance: any) => {\n if (instance) {\n bindResponsive(instance);\n }\n return instance;\n };\n app.onActivate(bindResponsiveHook);\n activeApp = app;\n}\n\nexport const viridApp: IViridApp = new Proxy({} as IViridApp, {\n get(_, prop: keyof IViridApp) {\n return (...args: any[]) => {\n if (!activeApp) {\n console.warn(\n `[Virid Vue] App method \"${String(prop)}\" called before initialization.`,\n );\n\n if (prop === \"register\") {\n return () => {\n console.warn(\n \"[Virid Vue] Cleanup ignored: source listener was never registered.\",\n );\n };\n }\n return undefined;\n }\n const targetMethod = activeApp[prop];\n if (typeof targetMethod === \"function\") {\n return Reflect.apply(targetMethod, activeApp, args);\n }\n };\n },\n});\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport { MessageWriter } from \"@virid/core\";\nimport { VIRID_VUE_METADATA } from \"../decorators/constant\";\n\nlet isBorrowCheckerEnabled = true;\nexport function disableBorrowChecker() {\n isBorrowCheckerEnabled = false;\n}\n\nconst borrowCache = new WeakMap<any, any>();\n\n/**\n * Recursive borrowing check proxy: Make the object and all its descendants hard read-only\n */\nexport function createBorrowChecker(\n target: any,\n rootName: string,\n path: string = \"\",\n): any {\n if (\n !isBorrowCheckerEnabled ||\n target === null ||\n (typeof target !== \"object\" && typeof target !== \"function\")\n ) {\n return target;\n }\n if (borrowCache.has(target)) {\n return borrowCache.get(target);\n }\n\n const proxy = new Proxy(target, {\n get(obj, prop, receiver) {\n const value = Reflect.get(obj, prop, receiver);\n const currentPath = path ? `${path}.${String(prop)}` : String(prop);\n if (typeof value === \"function\") {\n return (...args: any[]) => {\n if (!isShieldException(obj, prop)) {\n const errorMsg = [\n `[Virid Shield] Rejected`,\n `Method: ${rootName}....${currentPath}()`,\n `Reason: Unauthorized access to unsafe method.`,\n ].join(\"\\n\");\n MessageWriter.error(new Error(errorMsg));\n return null;\n }\n\n const result = value.apply(obj, args);\n return createBorrowChecker(result, rootName, `${currentPath}()`);\n };\n }\n return createBorrowChecker(value, rootName, currentPath);\n },\n\n set(_obj, prop) {\n const currentPath = path ? `${path}.${String(prop)}` : String(prop);\n\n // Elegantly fail and provide repair suggestions\n const errorMsg = [\n `[Virid Borrow Checker]`,\n `------------------------------------------------`,\n `Component: ${rootName}`,\n `Code: ${rootName}....${currentPath}`,\n `Result: Rejected`,\n `Reason: This object is write protected and cannot be modified.`,\n `Stack: ${new Error().stack}`,\n `------------------------------------------------`,\n ].join(\"\\n\");\n MessageWriter.error(new Error(errorMsg));\n return false;\n },\n deleteProperty(_obj, prop) {\n MessageWriter.error(\n new Error(\n `[Virid Shield] Physical Protection:\\nProhibit Deletion of Component Attributes ${String(prop)}`,\n ),\n );\n return false;\n },\n defineProperty() {\n MessageWriter.error(\n new Error(\n `[Virid Shield] Physical Protection:\\nProhibit redefining component attribute structure`,\n ),\n );\n return false;\n },\n });\n borrowCache.set(target, proxy);\n return proxy;\n}\n/**\n * Determine whether a method should skip shield interception\n */\nfunction isShieldException(obj: any, prop: string | symbol): boolean {\n const PROTOCOL_WHITELIST = new Set<string | symbol>([\n Symbol.iterator,\n Symbol.asyncIterator,\n Symbol.toStringTag,\n \"toString\",\n \"valueOf\",\n \"toJSON\",\n \"constructor\",\n ]);\n if (PROTOCOL_WHITELIST.has(prop)) return true;\n\n const constructorName = obj.constructor?.name;\n\n const READONLY_COLLECTIONS: Record<string, Set<string | symbol>> = {\n Map: new Set([\n \"get\",\n \"has\",\n \"keys\",\n \"values\",\n \"entries\",\n \"forEach\",\n \"size\",\n ]),\n Set: new Set([\"has\", \"keys\", \"values\", \"entries\", \"forEach\", \"size\"]),\n Array: new Set([\n \"length\",\n \"map\",\n \"filter\",\n \"reduce\",\n \"slice\",\n \"find\",\n \"includes\",\n \"findIndex\",\n \"every\",\n \"some\",\n \"at\",\n \"join\",\n \"concat\",\n \"flat\",\n \"flatMap\",\n \"indexOf\",\n \"lastIndexOf\",\n ]),\n String: new Set([\n \"length\",\n \"slice\",\n \"substring\",\n \"substr\",\n \"split\",\n \"includes\",\n \"startsWith\",\n \"endsWith\",\n \"indexOf\",\n \"replace\",\n \"replaceAll\",\n \"trim\",\n \"toLowerCase\",\n \"toUpperCase\",\n ]),\n };\n\n if (READONLY_COLLECTIONS[constructorName]?.has(prop)) return true;\n\n const safeMethods = Reflect.getMetadata(VIRID_VUE_METADATA.SAFE, obj);\n if (safeMethods instanceof Set && safeMethods.has(prop)) return true;\n\n return false;\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport {\n bindProject,\n bindWatch,\n bindHooks,\n bindUseHooks,\n bindListener,\n GlobalRegistry,\n bindInherit,\n bindEnv,\n} from \"./bind\";\nimport { onUnmounted, useAttrs } from \"vue\";\nimport { VIRID_VUE_METADATA } from \"../decorators/constant\";\nimport { MessageWriter, Newable } from \"@virid/core\";\nimport { viridApp } from \"../app\";\n/**\n * @description: vue的hooks适配器,注入IOC容器中的Controller实例,并挂在vue的各种方法\n * @param token\n */\nexport function useController<T>(\n token: Newable<T>,\n options?: { id?: string; context?: object },\n): T {\n const instance = viridApp.get(token) as any;\n\n // 检查身份 Controller\n const isController = Reflect.hasMetadata(\n VIRID_VUE_METADATA.CONTROLLER,\n token,\n );\n if (!isController) {\n // 确保非 Controller 的实例不能被其他 Controller 访问\n MessageWriter.error(\n new Error(\n `[Virid Controller] ${token.name} is not a Controller.Use @Controller to inject it.`,\n ),\n );\n return null as T;\n }\n\n //绑定各种魔法装饰器\n const proto = Object.getPrototypeOf(instance);\n //注入vue的乱七八糟的context\n const reactiveContext = options?.context || useAttrs();\n if (reactiveContext) {\n bindEnv(proto, instance, reactiveContext);\n }\n // @Use装饰器\n bindUseHooks(proto, instance);\n // @Inherit装饰器\n bindInherit(proto, instance);\n // @Project装饰器\n bindProject(proto, instance);\n // @Listener装饰器\n // 运行时动态挂载监听器\n const unbindList = bindListener(proto, instance);\n // 生命周期钩子\n bindHooks(proto, instance);\n //绑定全局注册表\n // @Watch装饰器\n const stops = bindWatch(proto, instance);\n //如果有id,就去注册\n let unbindRegister = () => true;\n if (options?.id) {\n unbindRegister = GlobalRegistry.set(options.id, instance);\n }\n onUnmounted(() => {\n stops.forEach((stop) => stop());\n unbindList.forEach((stop) => stop());\n unbindRegister();\n // 自动卸载信号处理器,防止 Controller 销毁后残留\n });\n\n return instance;\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Vue\n */\nimport { VIRID_VUE_METADATA } from \"./constant\";\nimport type { WatchOptions } from \"vue\";\nimport {\n MessageWriter,\n type Newable,\n BaseMessage,\n SingleMessage,\n} from \"@virid/core\";\nimport {\n type WatchMetadata,\n type ProjectMetadata,\n type InheritMetadata,\n type UseMetadata,\n type ResponsiveMetadata,\n type OnHookMetadata,\n type ListenerMetadata,\n type ListenerConfig,\n EnvMetadata,\n} from \"../interfaces\";\n\n/**\n * Overload 1: Monitor Controller's own variables\n * @param source Watching closure functions\n * @param options Watch options\n */\nexport function Watch<T>(\n source: (instance: T) => any | Promise<any>,\n options?: WatchOptions,\n): any;\n\n/**\n * Overload 2: Monitor Component's variables\n * @param componentClass Component class\n * @param source Watching closure functions\n * @param options Watch options\n */\n\nexport function Watch<C>(\n component: Newable<C>,\n source: (comp: C) => any | Promise<any>,\n options?: WatchOptions,\n): any;\n\nexport function Watch(arg1: any, arg2?: any, arg3?: any) {\n return (target: any, methodName: string) => {\n const existing: WatchMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.WATCH, target) || [];\n\n if (typeof arg2 === \"function\") {\n // Watch(Component, (c) => c.prop, options)\n existing.push({\n type: \"component\",\n componentClass: arg1,\n source: arg2,\n options: arg3,\n methodName,\n });\n } else {\n // Watch((i) => i.prop, options)\n existing.push({\n type: \"local\",\n componentClass: null,\n source: arg1,\n options: arg2,\n methodName,\n });\n }\n\n Reflect.defineMetadata(VIRID_VUE_METADATA.WATCH, existing, target);\n };\n}\n\n/**\n * Overload 1: Internal Projection\n * @param source Projection closure functions\n */\n\nexport function Project<T>(source: (instance: T) => any): any;\n\n/**\n * Overload 1: Component Projection\n * @param source Projection closure functions\n */\nexport function Project<C>(\n component: new (...args: any[]) => C,\n source: (comp: C) => any,\n): any;\n// Overload 3: Internal get set projection @Project() Public get name() {}\nexport function Project<T>(): any;\n\nexport function Project(arg1?: any, arg2?: any) {\n return (target: any, key: string, descriptor?: PropertyDescriptor) => {\n const existing: ProjectMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.PROJECT, target) || [];\n const isAccessor = !!(descriptor?.get || descriptor?.set);\n if (!arg1 && !arg2 && !isAccessor) {\n MessageWriter.error(\n new Error(\n `[Virid Project] Invalid Usage: @Project() can only be used on getter or setter.`,\n ),\n );\n return;\n }\n const metadata = {\n key,\n isAccessor: isAccessor,\n // 这里的逻辑和 Watch 保持高度一致\n type: typeof arg2 === \"function\" ? \"component\" : \"local\",\n componentClass: typeof arg2 === \"function\" ? arg1 : null,\n source: typeof arg2 === \"function\" ? arg2 : isAccessor ? null : arg1,\n } as const;\n\n existing.push(metadata);\n Reflect.defineMetadata(VIRID_VUE_METADATA.PROJECT, existing, target);\n };\n}\n/**\n * Add responsiveness to data\n */\nexport function Responsive(shallow = false) {\n return (target: any, key: string) => {\n // 记录哪些属性需要变成响应式\n const props: ResponsiveMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.RESPONSIVE, target) || [];\n props.push({ key, shallow });\n Reflect.defineMetadata(VIRID_VUE_METADATA.RESPONSIVE, props, target);\n };\n}\n\n/**\n * Declarative lifecycle hook @OnHook(\"onMounted\")\n */\nexport function OnHook(\n hookName:\n | \"onMounted\"\n | \"onUnmounted\"\n | \"onUpdated\"\n | \"onActivated\"\n | \"onDeactivated\"\n | \"onSetup\",\n) {\n return (target: any, methodName: string) => {\n const existing: OnHookMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.LIFE_CIRCLE, target) || [];\n existing.push({ hookName, methodName });\n Reflect.defineMetadata(VIRID_VUE_METADATA.LIFE_CIRCLE, existing, target);\n };\n}\n/**\n * Universal Hook Injection Decorator\n * Usage: @ Use()=>useRoute() Public route! : RouteLocationNormalized\n */\nexport function Use(hookFactory: () => any) {\n return (target: any, key: string) => {\n const existing: UseMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.HOOK, target) || [];\n existing.push({ key, hookFactory });\n Reflect.defineMetadata(VIRID_VUE_METADATA.HOOK, existing, target);\n };\n}\n/**\n * Inherit injection decorator\n * Usage: @Inherit(Controller, (instance)=>instance. xxxx) public data! : SomeType\n */\nexport function Inherit<T>(\n token: Newable<T>,\n id: string,\n selector: (instance: T) => any,\n) {\n return (target: any, key: string) => {\n const metadata: InheritMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.INHERIT, target) || [];\n metadata.push({ key, token, id, selector });\n Reflect.defineMetadata(VIRID_VUE_METADATA.INHERIT, metadata, target);\n };\n}\n\n/**\n * Marking an attribute as injected from the external environment (context)\n */\nexport function Env() {\n return (target: any, key: string) => {\n const metadata: EnvMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.ENV, target) || [];\n metadata.push({ key });\n Reflect.defineMetadata(VIRID_VUE_METADATA.ENV, metadata, target);\n };\n}\n\n/**\n * Listener Decorator - Tag Controller's member methods as message listeners\n */\nexport function Listener(\n config: ListenerConfig = {\n messageClass: null,\n priority: 0,\n batchMode: false,\n },\n) {\n return (target: any, key: string, descriptor?: PropertyDescriptor) => {\n if (typeof target === \"function\") {\n throw new Error(\n `[Virid Listener] Method Type Error: The Method \"${key}\" is a static method. @Listener can only be used on instance member methods.`,\n );\n }\n\n // Get parameter type metadata\n const types: Array<any> =\n Reflect.getMetadata(\"design:paramtypes\", target, key) || [];\n\n // Verify if there are undefined parameters (to prevent circular references or incomplete imports)\n const undefinedIndices = types\n .map((t, i) => (t === undefined ? i : -1))\n .filter((i) => i !== -1);\n if (undefinedIndices.length > 0) {\n throw new Error(\n `[Virid Listener] Parameter Metadata Loss in \"${key}\": One or more parameters have 'undefined' types. Check indices: [${undefinedIndices.join(\", \")}]`,\n );\n }\n\n // The parameter must have only one\n if (types.length > 1) {\n throw new Error(\n `[Virid Listener] Multiple Parameters Not Allowed: Listener method \"${key}\" can have at most ONE parameter (BaseMessage subclass or Array).`,\n );\n }\n\n // Prepare variables for final storage in metadata\n let finalMessageClass = config.messageClass;\n let finalBatchMode = config.batchMode ?? false;\n\n // Split processing: 0 parameters vs 1 parameter\n if (types.length === 0) {\n // No parameters are allowed, but it must be written in messageClass\n if (!config.messageClass) {\n throw new Error(\n `[Virid Listener] Rule Violation in \"${key}\": When the method has no parameters, you MUST specify \"messageClass\" in the decorator options.`,\n );\n }\n } else {\n // There is only one parameter available\n const paramType = types[0];\n\n if (paramType === Array) {\n // If it is a list (Array), messageClass must be written\n if (!config.messageClass) {\n throw new Error(\n `[Virid Listener] Rule Violation in \"${key}\": When using batch processing mode with Array, the \"messageClass\" parameter must be specified in decorator options.`,\n );\n }\n // Batch, verify if it inherits from SingleMessage\n if (!(config.messageClass.prototype instanceof SingleMessage)) {\n throw new Error(\n `[Virid Listener] Type Mismatch in \"${key}\": Batch processing mode (Array) is only supported for subclasses of SingleMessage.`,\n );\n }\n finalBatchMode = true;\n } else if (\n paramType === BaseMessage ||\n (paramType && paramType.prototype instanceof BaseMessage)\n ) {\n // If it is a single BaseMessage, messageClass cannot be written\n if (config.messageClass) {\n throw new Error(\n `[Virid Listener] Rule Violation in \"${key}\": Cannot specify \"messageClass\" in decorator options when it is already declared as a method parameter.`,\n );\n }\n finalMessageClass = paramType;\n // If batchMode is not explicitly specified, batch mode will not be enabled by default for single messages\n finalBatchMode = config.batchMode ?? false;\n } else {\n // I have written parameters, but they are neither BaseMessage nor Array\n throw new Error(\n `[Virid Listener] Invalid Parameter in \"${key}\": The single parameter must be either a subclass of BaseMessage or an Array.`,\n );\n }\n }\n\n const listeners: ListenerMetadata =\n Reflect.getMetadata(VIRID_VUE_METADATA.LISTENER, target) || [];\n\n listeners.push({\n key,\n messageClass: finalMessageClass as any,\n priority: config.priority || 0,\n batchMode: finalBatchMode,\n });\n\n Reflect.defineMetadata(VIRID_VUE_METADATA.LISTENER, listeners, target);\n };\n}\n","/*\n * Copyright (c) 2026-present Ailrid\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Description: Vue adapter for virid, projecting logic sovereignty to reactive UI.\n */\nimport { ViridPlugin, type ViridApp } from \"@virid/core\";\nimport { type PluginOption } from \"./interfaces\";\nexport * from \"./adapters\";\nexport * from \"./decorators\";\nexport * from \"./interfaces\";\nimport { activateApp } from \"./app\";\nimport { disableBorrowChecker } from \"./adapters/borrow_checker\";\n\nexport class VuePlugin implements ViridPlugin<PluginOption> {\n name = \"@virid/vue\";\n install(app: ViridApp, options: PluginOption) {\n if (options.disableBorrowChecker) disableBorrowChecker();\n activateApp(app);\n }\n}\n"],"mappings":";;;;uNAKA,OAASA,kBAAAA,MAAsB,cACxB,IAAMC,EAAqB,CAChC,GAAGD,EACHE,WAAY,uBACZC,YAAa,wBACbC,KAAM,iBACNC,SAAU,qBACVC,QAAS,oBACTC,KAAM,iBACNC,QAAS,oBACTC,MAAO,kBACPC,IAAK,eACP,ECXA,OACEC,SAAAA,EACAC,YAAAA,EAEAC,OAAAA,EACAC,mBAAAA,EACAC,aAAAA,EACAC,eAAAA,EACAC,aAAAA,EACAC,eAAAA,EACAC,iBAAAA,GACAC,cAAAA,MAEK,MACP,OAASC,iBAAAA,MAAuD,cCPhE,IAAIC,EAA8B,KAE3B,SAASC,EAAYC,EAAa,CACvC,IAAMC,EAAqBC,EAACC,IACtBA,GACFC,EAAeD,CAAAA,EAEVA,GAJkB,sBAM3BH,EAAIK,WAAWJ,CAAAA,EACfH,EAAYE,CACd,CATgBD,EAAAA,EAAAA,eAWT,IAAMO,EAAsB,IAAIC,MAAM,CAAC,EAAgB,CAC5DC,IAAIC,EAAGC,EAAqB,CAC1B,MAAO,IAAIC,IAAAA,CACT,GAAI,CAACb,EAKH,OAJAc,QAAQC,KACN,2BAA2BC,OAAOJ,CAAAA,CAAAA,iCAAsC,EAGtEA,IAAS,WACJ,IAAA,CACLE,QAAQC,KACN,oEAAA,CAEJ,EAEF,OAEF,IAAME,EAAejB,EAAUY,CAAAA,EAC/B,GAAI,OAAOK,GAAiB,WAC1B,OAAOC,QAAQC,MAAMF,EAAcjB,EAAWa,CAAAA,CAElD,CACF,CACF,CAAA,EC5CA,OAASO,iBAAAA,MAAqB,cAG9B,IAAIC,EAAyB,GACtB,SAASC,GAAAA,CACdD,EAAyB,EAC3B,CAFgBC,EAAAA,EAAAA,wBAIhB,IAAMC,EAAc,IAAIC,QAKjB,SAASC,EACdC,EACAC,EACAC,EAAe,GAAE,CAEjB,GACE,CAACP,GACDK,IAAW,MACV,OAAOA,GAAW,UAAY,OAAOA,GAAW,WAEjD,OAAOA,EAET,GAAIH,EAAYM,IAAIH,CAAAA,EAClB,OAAOH,EAAYO,IAAIJ,CAAAA,EAGzB,IAAMK,EAAQ,IAAIC,MAAMN,EAAQ,CAC9BI,IAAIG,EAAKC,EAAMC,EAAQ,CACrB,IAAMC,EAAQC,QAAQP,IAAIG,EAAKC,EAAMC,CAAAA,EAC/BG,EAAcV,EAAO,GAAGA,CAAAA,IAAQW,OAAOL,CAAAA,CAAAA,GAAUK,OAAOL,CAAAA,EAC9D,OAAI,OAAOE,GAAU,WACZ,IAAII,IAAAA,CACT,GAAI,CAACC,EAAkBR,EAAKC,CAAAA,EAAO,CACjC,IAAMQ,EAAW,CACf,0BACA,WAAWf,CAAAA,OAAeW,CAAAA,KAC1B,iDACAK,KAAK;CAAA,EACPC,OAAAA,EAAcC,MAAM,IAAIC,MAAMJ,CAAAA,CAAAA,EACvB,IACT,CAEA,IAAMK,EAASX,EAAMY,MAAMf,EAAKO,CAAAA,EAChC,OAAOf,EAAoBsB,EAAQpB,EAAU,GAAGW,CAAAA,IAAe,CACjE,EAEKb,EAAoBW,EAAOT,EAAUW,CAAAA,CAC9C,EAEAW,IAAIC,EAAMhB,EAAI,CACZ,IAAMI,EAAcV,EAAO,GAAGA,CAAAA,IAAQW,OAAOL,CAAAA,CAAAA,GAAUK,OAAOL,CAAAA,EAGxDQ,EAAW,CACf,yBACA,mDACA,cAAcf,CAAAA,GACd,SAASA,CAAAA,OAAeW,CAAAA,GACxB,mBACA,iEACA,UAAU,IAAIQ,MAAAA,EAAQK,KAAK,GAC3B,oDACAR,KAAK;CAAA,EACPC,OAAAA,EAAcC,MAAM,IAAIC,MAAMJ,CAAAA,CAAAA,EACvB,EACT,EACAU,eAAeF,EAAMhB,EAAI,CACvBU,OAAAA,EAAcC,MACZ,IAAIC,MACF;4CAAkFP,OAAOL,CAAAA,CAAAA,EAAO,CAAA,EAG7F,EACT,EACAmB,gBAAAA,CACET,OAAAA,EAAcC,MACZ,IAAIC,MACF;kDAAwF,CAAA,EAGrF,EACT,CACF,CAAA,EACAvB,OAAAA,EAAY0B,IAAIvB,EAAQK,CAAAA,EACjBA,CACT,CA3EgBN,EAAAA,EAAAA,uBA+EhB,SAASgB,EAAkBR,EAAUC,EAAqB,CAUxD,GAT2B,IAAIoB,IAAqB,CAClDC,OAAOC,SACPD,OAAOE,cACPF,OAAOG,YACP,WACA,UACA,SACA,cACD,EACsB7B,IAAIK,CAAAA,EAAO,MAAO,GAEzC,IAAMyB,EAAkB1B,EAAI,aAAa2B,KAkDzC,GAhDmE,CACjEC,IAAK,IAAIP,IAAI,CACX,MACA,MACA,OACA,SACA,UACA,UACA,OACD,EACDA,IAAK,IAAIA,IAAI,CAAC,MAAO,OAAQ,SAAU,UAAW,UAAW,OAAO,EACpEQ,MAAO,IAAIR,IAAI,CACb,SACA,MACA,SACA,SACA,QACA,OACA,WACA,YACA,QACA,OACA,KACA,OACA,SACA,OACA,UACA,UACA,cACD,EACDf,OAAQ,IAAIe,IAAI,CACd,SACA,QACA,YACA,SACA,QACA,WACA,aACA,WACA,UACA,UACA,aACA,OACA,cACA,cACD,CACH,EAEyBK,CAAAA,GAAkB9B,IAAIK,CAAAA,EAAO,MAAO,GAE7D,IAAM6B,EAAc1B,QAAQ2B,YAAYC,EAAmBC,KAAMjC,CAAAA,EACjE,MAAI8B,GAAAA,aAAuBT,KAAOS,EAAYlC,IAAIK,CAAAA,EAGpD,CApESO,EAAAA,EAAAA,qBF7DF,IAAM0B,EAAN,MAAMA,CAAAA,CAEX,OAAOC,IAAIC,EAAYC,EAA8B,CACnD,OAAK,KAAKC,eAAeC,IAAIH,CAAAA,GAQ3BI,EAAcC,MACZ,IAAIC,MACF,kDAAkDN,CAAAA,iBAAmB,CAAA,EAGlE,IAAM,KAZb,KAAKE,eAAeH,IAAIC,EAAIC,CAAAA,EAErB,KACL,KAAKC,eAAeK,OAAOP,CAAAA,EACpB,IAUb,CACA,OAAOQ,IAAIR,EAAiB,CAE1B,OAAK,KAAKE,eAAeC,IAAIH,CAAAA,EAQtB,KAAKE,eAAeM,IAAIR,CAAAA,GAP7BI,EAAcC,MACZ,IAAIC,MACF,oEAAoEN,CAAAA,EAAI,CAAA,EAGrE,KAGX,CACF,EA/BaF,EAAAA,EAAAA,kBACXW,EADWX,EACII,iBAAiBQ,EAAgB,IAAIC,GAAAA,GAD/C,IAAMb,EAANc,EAmCA,SAASC,EAAYC,EAAYb,EAAa,CACjBc,QAAQC,YACxCC,EAAmBC,QACnBJ,CAAAA,GAGQK,QAASC,GAAAA,CACjB,GAAM,CAAEC,IAAAA,EAAKC,WAAAA,EAAYC,KAAAA,EAAMC,eAAAA,EAAgBC,OAAAA,CAAM,EAAKL,EACtDM,EAGEC,EAAiBC,EAACC,GAAAA,CACtBzB,EAAcC,MACZ,IAAIC,MACF,wCAAwCe,CAAAA,SAAYpB,EAAS,YAAY6B,IAAI;CAAgC,CAAA,CAGnH,EANuB,kBASvB,GAAIR,EAAY,CACd,GAAIC,IAAS,YAAa,CACxBnB,EAAcC,MACZ,IAAIC,MACF,0EAA0EkB,CAAAA,gBAA8BH,CAAAA,kCAAqC,CAAA,EAGjJ,MACF,CAGA,IAAMU,EAAgBC,OAAOC,yBAAyBnB,EAAOO,CAAAA,EAC7DK,EAAUQ,EAAS,CACjB1B,IAAKoB,EAAA,IAAMG,GAAevB,KAAK2B,KAAKlC,CAAAA,EAA/B,OACLF,IAAK6B,EAACQ,GAAAA,CACAL,GAAehC,IACjBgC,EAAchC,IAAIoC,KAAKlC,EAAUmC,CAAAA,EAEjCT,EAAeS,CAAAA,CAEnB,EANK,MAOP,CAAA,CACF,MAGEV,EAAUQ,EAAS,CACjB1B,IAAKoB,EAAA,IAAA,CACH,IAAMS,EAAkBd,IAAS,YAC3Be,EAASD,EACXE,EAAS/B,IAAIgB,CAAAA,EACbvB,EACEmC,EAAMX,EAAOa,CAAAA,EAGnB,OAAID,EACKG,EAAoBJ,EAAKZ,EAAgBM,KAAMT,CAAAA,EAIjDe,CACT,EAdK,OAeLrC,IAAK4B,CACP,CAAA,EAGF,IAAMc,EAAoBT,OAAOC,yBAAyBhC,EAAUoB,CAAAA,EAChEoB,GAAqBA,EAAkBC,eAAiB,IAE5DV,OAAOW,eAAe1C,EAAUoB,EAAK,CACnCb,IAAKoB,EAAA,IAAMF,EAAQkB,MAAd,OACL7C,IAAK6B,EAACQ,GAASV,EAAQkB,MAAQR,EAA1B,OACLS,WAAY,GACZH,aAAc,EAChB,CAAA,CACF,CAAA,CACF,CA3EgB7B,EAAAA,EAAAA,eAgFT,SAASiC,EAAUhC,EAAYb,EAAa,CACjD,IAAM8C,EACJhC,QAAQC,YAAYC,EAAmB+B,MAAOlC,CAAAA,GAAU,CAAA,EACpDmC,EAA2B,CAAA,EAEjCF,OAAAA,EAAQ5B,QAASC,GAAAA,CACf,GAAM,CAAEG,KAAAA,EAAME,OAAAA,EAAQyB,WAAAA,EAAYC,QAAAA,EAAS3B,eAAAA,CAAc,EAAKJ,EAGxDkB,EACJf,IAAS,YAAcgB,EAAS/B,IAAIgB,CAAAA,EAAkBvB,EAEpDqC,GAAU,CAACA,EAAOc,mBACpBC,EAAef,CAAAA,EAGjB,IAAMgB,EAAS1B,EAAA,IAAA,CACb,GAAI,CACF,OAAOH,EAAOa,CAAAA,CAChB,OAASiB,EAAG,CACVnD,EAAcC,MACZkD,EACA,iCAAiCL,CAAAA,EAAY,EAE/C,MACF,CACF,EAVe,UAYTM,EAAYvD,EAASiD,CAAAA,EAAoBO,KAAKxD,CAAAA,EAE9CyD,EAAOC,EACXL,EACA,CAACM,EAAQC,IAAAA,CACPL,EAASI,EAAQC,CAAAA,CACnB,EACA,CACE,GAAGV,CACL,CAAA,EAEFF,EAAMa,KAAKJ,CAAAA,CACb,CAAA,EAEOT,CACT,CA3CgBH,EAAAA,EAAAA,aAgDT,SAASO,EAAepD,EAAa,CAE1C,MADI,CAACA,GAAY,OAAOA,GAAa,UACjCA,EAAS8D,iCAEb/B,OAAOW,eAAe1C,EAAU,iCAAkC,CAChE2C,MAAO,GACPC,WAAY,EACd,CAAA,GAGE9B,QAAQC,YAAYC,EAAmB+C,WAAY/D,CAAAA,GAAa,CAAA,GAE5DkB,QAASC,GAAAA,CACb,IAAMC,EAAMD,EAAOC,IACb4C,EAAajC,OAAOC,yBAAyBhC,EAAUoB,CAAAA,EAGvD6C,EAAeD,GAAYzD,KAAa2D,cAG9C,GAAID,EAAa,CACf,IAAME,EAAWF,EAAYtB,MACvByB,EAAOjD,EAAOkD,QAAUC,EAAWH,CAAAA,EAAYI,EAAIJ,CAAAA,EAEzDpC,OAAOW,eAAeuB,EAAa,QAAS,CAC1C1D,IAAKoB,EAAA,IAAMyC,EAAKzB,MAAX,OACL7C,IAAK6B,EAACQ,GAAAA,CACJiC,EAAKzB,MAAQR,CACf,EAFK,OAGLS,WAAY,GACZH,aAAc,EAChB,CAAA,CACF,KAAO,CAEL,GAAIuB,GAAcA,EAAWzD,IAAK,OAElC,IAAM4D,EAAWnE,EAASoB,CAAAA,EACpBoD,EAAgBrD,EAAOkD,QACzBC,EAAWH,CAAAA,EACXI,EAAIJ,CAAAA,EAERpC,OAAOW,eAAe1C,EAAUoB,EAAK,CACnCb,IAAKoB,EAAA,IAAM6C,EAAc7B,MAApB,OACL7C,IAAK6B,EAACQ,GAAAA,CACJqC,EAAc7B,MAAQR,CACxB,EAFK,OAGLS,WAAY,GACZH,aAAc,EAChB,CAAA,CACF,CACF,CAAA,EAGA3B,QAAQ2D,QAAQzE,CAAAA,EAAUkB,QAASE,GAAAA,CACjC,GAAIA,IAAQ,iCAAkC,OAC9C,IAAMe,EAAMnC,EAASoB,CAAAA,EACjBe,GAAO,OAAOA,GAAQ,UACxBiB,EAAejB,CAAAA,CAEnB,CAAA,GACOnC,CACT,CA7DgBoD,EAAAA,EAAAA,kBAkET,SAASsB,EAAU7D,EAAYb,EAAa,CACnBc,QAAQC,YACpCC,EAAmB2D,YACnB9D,CAAAA,GAGKK,QAASC,GAAAA,CACd,GAAM,CAAEyD,SAAAA,EAAU3B,WAAAA,CAAU,EAAK9B,EAC3B0D,EAAK7E,EAASiD,CAAAA,EAAYO,KAAKxD,CAAAA,EAErC,OAAQ4E,EAAAA,CACN,IAAK,YACHE,EAAUD,CAAAA,EACV,MACF,IAAK,cACHE,EAAYF,CAAAA,EACZ,MACF,IAAK,YACHG,EAAUH,CAAAA,EACV,MACF,IAAK,cACHI,EAAYJ,CAAAA,EACZ,MACF,IAAK,gBACHK,GAAcL,CAAAA,EACd,MACF,IAAK,UACHA,EAAAA,EACA,KAEJ,CACF,CAAA,CACF,CAhCgBH,EAAAA,EAAAA,aAqCT,SAASS,EAAatE,EAAYb,EAAa,CACzBc,QAAQC,YACjCC,EAAmBoE,KACnBvE,CAAAA,GAGKK,QAASC,GAAAA,CAEd,IAAMkE,EAAalE,EAAOmE,YAAW,EAErCtF,EAASmB,EAAOC,GAAG,EAAIiE,CACzB,CAAA,CACF,CAZgBF,EAAAA,EAAAA,gBAiBT,SAASI,EAAa1E,EAAYb,EAAa,CACpD,IAAMwF,EACJ1E,QAAQC,YAAYC,EAAmByE,SAAU5E,CAAAA,GAAU,CAAA,EACvD6E,EAAkC,CAAA,EAExCF,OAAAA,EAAgBtE,QAAQ,CAAC,CAAEE,IAAAA,EAAKuE,aAAAA,EAAcC,SAAAA,EAAUC,UAAAA,CAAS,IAAE,CACjE,IAAMC,EAAiB9F,EAASoB,CAAAA,EAG1B2E,EAAiC,CACrCC,OAAQ,CAACL,GACTM,YAAajG,EAAS,YACtBiD,WAAY7B,EACZ0E,eAAgBA,CAClB,EAEMI,EAA+B,CACnCP,aAAcA,EACdQ,WAAY,EACZN,UAAWA,EACXD,SAAUA,CACZ,EACC5F,EAASoB,CAAAA,EAAagF,cAAgBL,EACtC/F,EAASoB,CAAAA,EAAagF,cAAgBF,EAEvC,IAAMG,EAAa/D,EAASgE,SAAStG,EAASoB,CAAAA,CAAI,EAClDsE,EAAgB7B,KAAKwC,CAAAA,CACvB,CAAA,EAEOX,CACT,CA9BgBH,EAAAA,EAAAA,gBAmCT,SAASgB,EAAY1F,EAAYb,EAAa,CACnD,IAAMwG,EAA4B1F,QAAQC,YACxCC,EAAmByF,QACnB5F,CAAAA,EAEG2F,GAELA,EAAStF,QAAQ,CAAC,CAAEE,IAAAA,EAAKrB,GAAAA,EAAI2G,SAAAA,CAAQ,IAAE,CAGrC,IAAMC,EAAS1E,EAAS,IAAA,CACtB,IAAMI,EAASxC,EAAeU,IAAIR,CAAAA,EAClC,OAAKsC,EAQEqE,EAAWA,EAASrE,CAAAA,EAAUA,GAPnClC,EAAcyG,KACZ,sDAAsD7G,CAAAA,EAAI,EAErD,KAKX,CAAA,EAEAgC,OAAOW,eAAe1C,EAAUoB,EAAK,CACnCb,IAAKoB,EAAA,IAAA,CACH,IAAMQ,EAAMwE,EAAOhE,MAEnB,OAAOR,EAAMI,EAAoBJ,EAAKf,EAAK,EAAA,EAAM,IACnD,EAJK,OAKLtB,IAAK6B,EAAA,IAAA,CACHxB,EAAcC,MACZ,IAAIC,MACF,iFAAiFe,CAAAA,EAAK,CAAA,CAG5F,EANK,OAOLwB,WAAY,GACZH,aAAc,EAChB,CAAA,CACF,CAAA,CACF,CAxCgB8D,EAAAA,EAAAA,eA+CT,SAASM,EAAQhG,EAAYb,EAAe8G,EAAY,CACnChG,QAAQC,YAAYC,EAAmB+F,IAAKlG,CAAAA,EAEjEK,QAAQ,CAAC,CAAEE,IAAAA,CAAG,IAAE,CACnB,GAAI,CAAC0F,EAAQ1F,CAAAA,EAAM,CACjBjB,EAAcyG,KACZ,uCAAuCxF,CAAAA,kCAAqC,EAE9E,MACF,CACAW,OAAOW,eAAe1C,EAAUoB,EAAK,CACnCb,IAAKoB,EAAA,IAAMmF,EAAQ1F,CAAAA,EAAd,OACLtB,IAAK6B,EAACQ,GAAAA,CACJ,GAAI2E,EAAQ1F,CAAAA,IAASe,EACrB,GAAI,CACF2E,EAAQ1F,CAAAA,EAAOe,CACjB,OAASmB,EAAG,CACVnD,EAAcC,MACZkD,EACA;IAAkClC,CAAAA,qBAAwB,CAE9D,CACF,EAVK,OAWLwB,WAAY,GACZH,aAAc,EAChB,CAAA,CACF,CAAA,CACF,CA3BgBoE,EAAAA,EAAAA,WGlYhB,OAASG,eAAAA,GAAaC,YAAAA,OAAgB,MAEtC,OAASC,iBAAAA,OAA8B,cAMhC,SAASC,GACdC,EACAC,EAA2C,CAE3C,IAAMC,EAAWC,EAASC,IAAIJ,CAAAA,EAO9B,GAAI,CAJiBK,QAAQC,YAC3BC,EAAmBC,WACnBR,CAAAA,EAIAS,OAAAA,GAAcC,MACZ,IAAIC,MACF,sBAAsBX,EAAMY,IAAI,oDAAoD,CAAA,EAGjF,KAIT,IAAMC,EAAQC,OAAOC,eAAeb,CAAAA,EAE9Bc,EAAkBf,GAASgB,SAAWC,GAAAA,EACxCF,GACFG,EAAQN,EAAOX,EAAUc,CAAAA,EAG3BI,EAAaP,EAAOX,CAAAA,EAEpBmB,EAAYR,EAAOX,CAAAA,EAEnBoB,EAAYT,EAAOX,CAAAA,EAGnB,IAAMqB,EAAaC,EAAaX,EAAOX,CAAAA,EAEvCuB,EAAUZ,EAAOX,CAAAA,EAGjB,IAAMwB,EAAQC,EAAUd,EAAOX,CAAAA,EAE3B0B,EAAiBC,EAAA,IAAM,GAAN,kBACrB,OAAI5B,GAAS6B,KACXF,EAAiBG,EAAeC,IAAI/B,EAAQ6B,GAAI5B,CAAAA,GAElD+B,GAAY,IAAA,CACVP,EAAMQ,QAASC,GAASA,EAAAA,CAAAA,EACxBZ,EAAWW,QAASC,GAASA,EAAAA,CAAAA,EAC7BP,EAAAA,CAEF,CAAA,EAEO1B,CACT,CAvDgBH,EAAAA,GAAAA,iBChBhB,OACEqC,iBAAAA,GAEAC,eAAAA,EACAC,iBAAAA,OACK,cAoCA,SAASC,GAAMC,EAAWC,EAAYC,EAAU,CACrD,MAAO,CAACC,EAAaC,IAAAA,CACnB,IAAMC,EACJC,QAAQC,YAAYC,EAAmBC,MAAON,CAAAA,GAAW,CAAA,EAEvD,OAAOF,GAAS,WAElBI,EAASK,KAAK,CACZC,KAAM,YACNC,eAAgBZ,EAChBa,OAAQZ,EACRa,QAASZ,EACTE,WAAAA,CACF,CAAA,EAGAC,EAASK,KAAK,CACZC,KAAM,QACNC,eAAgB,KAChBC,OAAQb,EACRc,QAASb,EACTG,WAAAA,CACF,CAAA,EAGFE,QAAQS,eAAeP,EAAmBC,MAAOJ,EAAUF,CAAAA,CAC7D,CACF,CA3BgBJ,EAAAA,GAAAA,SA+CT,SAASiB,GAAQhB,EAAYC,EAAU,CAC5C,MAAO,CAACE,EAAac,EAAaC,IAAAA,CAChC,IAAMb,EACJC,QAAQC,YAAYC,EAAmBW,QAAShB,CAAAA,GAAW,CAAA,EACvDiB,EAAa,CAAC,EAAEF,GAAYG,KAAOH,GAAYI,KACrD,GAAI,CAACtB,GAAQ,CAACC,GAAQ,CAACmB,EAAY,CACjCG,GAAcC,MACZ,IAAIC,MACF,iFAAiF,CAAA,EAGrF,MACF,CACA,IAAMC,EAAW,CACfT,IAAAA,EACAG,WAAYA,EAEZT,KAAM,OAAOV,GAAS,WAAa,YAAc,QACjDW,eAAgB,OAAOX,GAAS,WAAaD,EAAO,KACpDa,OAAQ,OAAOZ,GAAS,WAAaA,EAAOmB,EAAa,KAAOpB,CAClE,EAEAK,EAASK,KAAKgB,CAAAA,EACdpB,QAAQS,eAAeP,EAAmBW,QAASd,EAAUF,CAAAA,CAC/D,CACF,CAzBgBa,EAAAA,GAAAA,WA6BT,SAASW,GAAWC,EAAU,GAAK,CACxC,MAAO,CAACzB,EAAac,IAAAA,CAEnB,IAAMY,EACJvB,QAAQC,YAAYC,EAAmBsB,WAAY3B,CAAAA,GAAW,CAAA,EAChE0B,EAAMnB,KAAK,CAAEO,IAAAA,EAAKW,QAAAA,CAAQ,CAAA,EAC1BtB,QAAQS,eAAeP,EAAmBsB,WAAYD,EAAO1B,CAAAA,CAC/D,CACF,CARgBwB,EAAAA,GAAAA,cAaT,SAASI,GACdC,EAMa,CAEb,MAAO,CAAC7B,EAAaC,IAAAA,CACnB,IAAMC,EACJC,QAAQC,YAAYC,EAAmByB,YAAa9B,CAAAA,GAAW,CAAA,EACjEE,EAASK,KAAK,CAAEsB,SAAAA,EAAU5B,WAAAA,CAAW,CAAA,EACrCE,QAAQS,eAAeP,EAAmByB,YAAa5B,EAAUF,CAAAA,CACnE,CACF,CAfgB4B,EAAAA,GAAAA,UAoBT,SAASG,GAAIC,EAAsB,CACxC,MAAO,CAAChC,EAAac,IAAAA,CACnB,IAAMZ,EACJC,QAAQC,YAAYC,EAAmB4B,KAAMjC,CAAAA,GAAW,CAAA,EAC1DE,EAASK,KAAK,CAAEO,IAAAA,EAAKkB,YAAAA,CAAY,CAAA,EACjC7B,QAAQS,eAAeP,EAAmB4B,KAAM/B,EAAUF,CAAAA,CAC5D,CACF,CAPgB+B,EAAAA,GAAAA,OAYT,SAASG,GACdC,EACAC,EACAC,EAA8B,CAE9B,MAAO,CAACrC,EAAac,IAAAA,CACnB,IAAMS,EACJpB,QAAQC,YAAYC,EAAmBiC,QAAStC,CAAAA,GAAW,CAAA,EAC7DuB,EAAShB,KAAK,CAAEO,IAAAA,EAAKqB,MAAAA,EAAOC,GAAAA,EAAIC,SAAAA,CAAS,CAAA,EACzClC,QAAQS,eAAeP,EAAmBiC,QAASf,EAAUvB,CAAAA,CAC/D,CACF,CAXgBkC,EAAAA,GAAAA,WAgBT,SAASK,IAAAA,CACd,MAAO,CAACvC,EAAac,IAAAA,CACnB,IAAMS,EACJpB,QAAQC,YAAYC,EAAmBmC,IAAKxC,CAAAA,GAAW,CAAA,EACzDuB,EAAShB,KAAK,CAAEO,IAAAA,CAAI,CAAA,EACpBX,QAAQS,eAAeP,EAAmBmC,IAAKjB,EAAUvB,CAAAA,CAC3D,CACF,CAPgBuC,EAAAA,GAAAA,OAYT,SAASE,GACdC,EAAyB,CACvBC,aAAc,KACdC,SAAU,EACVC,UAAW,EACb,EAAC,CAED,MAAO,CAAC7C,EAAac,EAAaC,IAAAA,CAChC,GAAI,OAAOf,GAAW,WACpB,MAAM,IAAIsB,MACR,mDAAmDR,CAAAA,8EAAiF,EAKxI,IAAMgC,EACJ3C,QAAQC,YAAY,oBAAqBJ,EAAQc,CAAAA,GAAQ,CAAA,EAGrDiC,EAAmBD,EACtBE,IAAI,CAACC,EAAGC,IAAOD,IAAME,OAAYD,EAAI,EAAC,EACtCE,OAAQF,GAAMA,IAAM,EAAC,EACxB,GAAIH,EAAiBM,OAAS,EAC5B,MAAM,IAAI/B,MACR,gDAAgDR,CAAAA,qEAAwEiC,EAAiBO,KAAK,IAAA,CAAA,GAAQ,EAK1J,GAAIR,EAAMO,OAAS,EACjB,MAAM,IAAI/B,MACR,sEAAsER,CAAAA,mEAAsE,EAKhJ,IAAIyC,EAAoBb,EAAOC,aAC3Ba,EAAiBd,EAAOG,WAAa,GAGzC,GAAIC,EAAMO,SAAW,GAEnB,GAAI,CAACX,EAAOC,aACV,MAAM,IAAIrB,MACR,uCAAuCR,CAAAA,iGAAoG,MAG1I,CAEL,IAAM2C,EAAYX,EAAM,CAAA,EAExB,GAAIW,IAAcC,MAAO,CAEvB,GAAI,CAAChB,EAAOC,aACV,MAAM,IAAIrB,MACR,uCAAuCR,CAAAA,sHAAyH,EAIpK,GAAI,EAAE4B,EAAOC,aAAagB,qBAAqBC,IAC7C,MAAM,IAAItC,MACR,sCAAsCR,CAAAA,qFAAwF,EAGlI0C,EAAiB,EACnB,SACEC,IAAcI,GACbJ,GAAaA,EAAUE,qBAAqBE,EAC7C,CAEA,GAAInB,EAAOC,aACT,MAAM,IAAIrB,MACR,uCAAuCR,CAAAA,0GAA6G,EAGxJyC,EAAoBE,EAEpBD,EAAiBd,EAAOG,WAAa,EACvC,KAEE,OAAM,IAAIvB,MACR,0CAA0CR,CAAAA,+EAAkF,CAGlI,CAEA,IAAMgD,EACJ3D,QAAQC,YAAYC,EAAmB0D,SAAU/D,CAAAA,GAAW,CAAA,EAE9D8D,EAAUvD,KAAK,CACbO,IAAAA,EACA6B,aAAcY,EACdX,SAAUF,EAAOE,UAAY,EAC7BC,UAAWW,CACb,CAAA,EAEArD,QAAQS,eAAeP,EAAmB0D,SAAUD,EAAW9D,CAAAA,CACjE,CACF,CAlGgByC,EAAAA,GAAAA,YC5KT,IAAMuB,EAAN,MAAMA,CAAAA,CAAN,cACLC,EAAAA,YAAO,cACPC,QAAQC,EAAeC,EAAuB,CACxCA,EAAQC,sBAAsBA,EAAAA,EAClCC,EAAYH,CAAAA,CACd,CACF,EANaH,EAAAA,EAAAA,aAAN,IAAMA,EAANO","names":["VIRID_METADATA","VIRID_VUE_METADATA","RESPONSIVE","LIFE_CIRCLE","HOOK","LISTENER","INHERIT","ATTR","PROJECT","WATCH","ENV","watch","computed","ref","shallowReactive","onMounted","onUnmounted","onUpdated","onActivated","onDeactivated","shallowRef","MessageWriter","activeApp","activateApp","app","bindResponsiveHook","__name","instance","bindResponsive","onActivate","viridApp","Proxy","get","_","prop","args","console","warn","String","targetMethod","Reflect","apply","MessageWriter","isBorrowCheckerEnabled","disableBorrowChecker","borrowCache","WeakMap","createBorrowChecker","target","rootName","path","has","get","proxy","Proxy","obj","prop","receiver","value","Reflect","currentPath","String","args","isShieldException","errorMsg","join","MessageWriter","error","Error","result","apply","set","_obj","stack","deleteProperty","defineProperty","Set","Symbol","iterator","asyncIterator","toStringTag","constructorName","name","Map","Array","safeMethods","getMetadata","VIRID_VUE_METADATA","SAFE","GlobalRegistry","set","id","instance","globalRegistry","has","MessageWriter","error","Error","delete","get","__publicField","shallowReactive","Map","_GlobalRegistry","bindProject","proto","Reflect","getMetadata","VIRID_VUE_METADATA","PROJECT","forEach","config","key","isAccessor","type","componentClass","source","project","readOnlySetter","__name","_val","name","rawDescriptor","Object","getOwnPropertyDescriptor","computed","call","val","isFromComponent","target","viridApp","createBorrowChecker","currentDescriptor","configurable","defineProperty","value","enumerable","bindWatch","watches","WATCH","stops","methodName","options","__ccs_processed__","bindResponsive","getter","e","callback","bind","stop","watch","newVal","oldVal","push","__virid_responsive_processed__","RESPONSIVE","descriptor","existingBox","__virid_box__","rawValue","vRef","shallow","shallowRef","ref","internalState","ownKeys","bindHooks","LIFE_CIRCLE","hookName","fn","onMounted","onUnmounted","onUpdated","onActivated","onDeactivated","bindUseHooks","HOOK","hookResult","hookFactory","bindListener","listenerConfigs","LISTENER","unbindFunctions","messageClass","priority","batchMode","originalMethod","listenerContext","params","targetClass","listenerConfig","messageIdx","systemContext","unregister","register","bindInherit","inherits","INHERIT","selector","tunnel","warn","bindEnv","context","ENV","onUnmounted","useAttrs","MessageWriter","useController","token","options","instance","viridApp","get","Reflect","hasMetadata","VIRID_VUE_METADATA","CONTROLLER","MessageWriter","error","Error","name","proto","Object","getPrototypeOf","reactiveContext","context","useAttrs","bindEnv","bindUseHooks","bindInherit","bindProject","unbindList","bindListener","bindHooks","stops","bindWatch","unbindRegister","__name","id","GlobalRegistry","set","onUnmounted","forEach","stop","MessageWriter","BaseMessage","SingleMessage","Watch","arg1","arg2","arg3","target","methodName","existing","Reflect","getMetadata","VIRID_VUE_METADATA","WATCH","push","type","componentClass","source","options","defineMetadata","Project","key","descriptor","PROJECT","isAccessor","get","set","MessageWriter","error","Error","metadata","Responsive","shallow","props","RESPONSIVE","OnHook","hookName","LIFE_CIRCLE","Use","hookFactory","HOOK","Inherit","token","id","selector","INHERIT","Env","ENV","Listener","config","messageClass","priority","batchMode","types","undefinedIndices","map","t","i","undefined","filter","length","join","finalMessageClass","finalBatchMode","paramType","Array","prototype","SingleMessage","BaseMessage","listeners","LISTENER","VuePlugin","name","install","app","options","disableBorrowChecker","activateApp","_VuePlugin"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@virid/vue",
3
3
  "type": "module",
4
- "version": "0.2.5",
4
+ "version": "0.3.1",
5
5
  "description": "Vue adapter for virid, projecting logic sovereignty to reactive UI",
6
6
  "author": "Ailrid",
7
7
  "license": "Apache 2.0",
@@ -35,8 +35,8 @@
35
35
  },
36
36
  "dependencies": {},
37
37
  "peerDependencies": {
38
- "vue": "^3.4.0",
39
- "@virid/core": "0.2.5"
38
+ "vue": ">=3.4.0",
39
+ "@virid/core": "0.3.1"
40
40
  },
41
41
  "scripts": {
42
42
  "build": "tsup --config tsup.config.ts",