tracked-instance 1.0.5 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.js +48 -3
- package/package.json +5 -6
- package/dist/collection.js +0 -57
- package/dist/collection.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/tracked-instance.js +0 -266
- package/dist/tracked-instance.js.map +0 -1
- package/src/collection.ts +0 -82
- package/src/index.ts +0 -5
- package/src/tracked-instance.ts +0 -335
- /package/dist/{collection.d.ts → types/collection.d.ts} +0 -0
- /package/dist/{index.d.ts → types/index.d.ts} +0 -0
- /package/dist/{tracked-instance.d.ts → types/tracked-instance.d.ts} +0 -0
package/README.md
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,3 +1,48 @@
|
|
|
1
|
-
export { useTrackedInstance } from './tracked-instance';
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";(()=>{var Ir=typeof global=="object"&&global&&global.Object===Object&&global,nt=Ir;var kr=typeof self=="object"&&self&&self.Object===Object&&self,$r=nt||kr||Function("return this")(),L=$r;var Mr=L.Symbol,y=Mr;var ot=Object.prototype,Fr=ot.hasOwnProperty,Lr=ot.toString,ee=y?y.toStringTag:void 0;function Hr(e){var t=Fr.call(e,ee),r=e[ee];try{e[ee]=void 0;var n=!0}catch{}var o=Lr.call(e);return n&&(t?e[ee]=r:delete e[ee]),o}var st=Hr;var Ur=Object.prototype,jr=Ur.toString;function Br(e){return jr.call(e)}var it=Br;var Kr="[object Null]",Wr="[object Undefined]",at=y?y.toStringTag:void 0;function zr(e){return e==null?e===void 0?Wr:Kr:at&&at in Object(e)?st(e):it(e)}var H=zr;function Gr(e){return e!=null&&typeof e=="object"}var U=Gr;var Yr="[object Symbol]";function qr(e){return typeof e=="symbol"||U(e)&&H(e)==Yr}var j=qr;function Jr(e,t){for(var r=-1,n=e==null?0:e.length,o=Array(n);++r<n;)o[r]=t(e[r],r,e);return o}var lt=Jr;var Xr=Array.isArray,O=Xr;var Zr=1/0,ct=y?y.prototype:void 0,ft=ct?ct.toString:void 0;function ut(e){if(typeof e=="string")return e;if(O(e))return lt(e,ut)+"";if(j(e))return ft?ft.call(e):"";var t=e+"";return t=="0"&&1/e==-Zr?"-0":t}var pt=ut;function Qr(e){var t=typeof e;return e!=null&&(t=="object"||t=="function")}var S=Qr;var en="[object AsyncFunction]",tn="[object Function]",rn="[object GeneratorFunction]",nn="[object Proxy]";function on(e){if(!S(e))return!1;var t=H(e);return t==tn||t==rn||t==en||t==nn}var dt=on;var sn=L["__core-js_shared__"],ae=sn;var ht=function(){var e=/[^.]+$/.exec(ae&&ae.keys&&ae.keys.IE_PROTO||"");return e?"Symbol(src)_1."+e:""}();function an(e){return!!ht&&ht in e}var mt=an;var ln=Function.prototype,cn=ln.toString;function fn(e){if(e!=null){try{return cn.call(e)}catch{}try{return e+""}catch{}}return""}var gt=fn;var un=/[\\^$.*+?()[\]{}|]/g,pn=/^\[object .+?Constructor\]$/,dn=Function.prototype,hn=Object.prototype,mn=dn.toString,gn=hn.hasOwnProperty,_n=RegExp("^"+mn.call(gn).replace(un,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function yn(e){if(!S(e)||mt(e))return!1;var t=dt(e)?_n:pn;return t.test(gt(e))}var _t=yn;function En(e,t){return e?.[t]}var yt=En;function xn(e,t){var r=yt(e,t);return _t(r)?r:void 0}var B=xn;var vn=function(){try{var e=B(Object,"defineProperty");return e({},"",{}),e}catch{}}(),Re=vn;var Nn=9007199254740991,On=/^(?:0|[1-9]\d*)$/;function bn(e,t){var r=typeof e;return t=t??Nn,!!t&&(r=="number"||r!="symbol"&&On.test(e))&&e>-1&&e%1==0&&e<t}var le=bn;function wn(e,t,r){t=="__proto__"&&Re?Re(e,t,{configurable:!0,enumerable:!0,value:r,writable:!0}):e[t]=r}var Et=wn;function Dn(e,t){return e===t||e!==e&&t!==t}var ce=Dn;var Tn=Object.prototype,Vn=Tn.hasOwnProperty;function Cn(e,t,r){var n=e[t];(!(Vn.call(e,t)&&ce(n,r))||r===void 0&&!(t in e))&&Et(e,t,r)}var xt=Cn;var An=9007199254740991;function Sn(e){return typeof e=="number"&&e>-1&&e%1==0&&e<=An}var vt=Sn;var Rn="[object Arguments]";function Pn(e){return U(e)&&H(e)==Rn}var Pe=Pn;var Nt=Object.prototype,In=Nt.hasOwnProperty,kn=Nt.propertyIsEnumerable,$n=Pe(function(){return arguments}())?Pe:function(e){return U(e)&&In.call(e,"callee")&&!kn.call(e,"callee")},Ot=$n;var Mn=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Fn=/^\w*$/;function Ln(e,t){if(O(e))return!1;var r=typeof e;return r=="number"||r=="symbol"||r=="boolean"||e==null||j(e)?!0:Fn.test(e)||!Mn.test(e)||t!=null&&e in Object(t)}var bt=Ln;var Hn=B(Object,"create"),E=Hn;function Un(){this.__data__=E?E(null):{},this.size=0}var wt=Un;function jn(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}var Dt=jn;var Bn="__lodash_hash_undefined__",Kn=Object.prototype,Wn=Kn.hasOwnProperty;function zn(e){var t=this.__data__;if(E){var r=t[e];return r===Bn?void 0:r}return Wn.call(t,e)?t[e]:void 0}var Tt=zn;var Gn=Object.prototype,Yn=Gn.hasOwnProperty;function qn(e){var t=this.__data__;return E?t[e]!==void 0:Yn.call(t,e)}var Vt=qn;var Jn="__lodash_hash_undefined__";function Xn(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=E&&t===void 0?Jn:t,this}var Ct=Xn;function K(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}K.prototype.clear=wt;K.prototype.delete=Dt;K.prototype.get=Tt;K.prototype.has=Vt;K.prototype.set=Ct;var Ie=K;function Zn(){this.__data__=[],this.size=0}var At=Zn;function Qn(e,t){for(var r=e.length;r--;)if(ce(e[r][0],t))return r;return-1}var b=Qn;var eo=Array.prototype,to=eo.splice;function ro(e){var t=this.__data__,r=b(t,e);if(r<0)return!1;var n=t.length-1;return r==n?t.pop():to.call(t,r,1),--this.size,!0}var St=ro;function no(e){var t=this.__data__,r=b(t,e);return r<0?void 0:t[r][1]}var Rt=no;function oo(e){return b(this.__data__,e)>-1}var Pt=oo;function so(e,t){var r=this.__data__,n=b(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this}var It=so;function W(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}W.prototype.clear=At;W.prototype.delete=St;W.prototype.get=Rt;W.prototype.has=Pt;W.prototype.set=It;var kt=W;var io=B(L,"Map"),$t=io;function ao(){this.size=0,this.__data__={hash:new Ie,map:new($t||kt),string:new Ie}}var Mt=ao;function lo(e){var t=typeof e;return t=="string"||t=="number"||t=="symbol"||t=="boolean"?e!=="__proto__":e===null}var Ft=lo;function co(e,t){var r=e.__data__;return Ft(t)?r[typeof t=="string"?"string":"hash"]:r.map}var w=co;function fo(e){var t=w(this,e).delete(e);return this.size-=t?1:0,t}var Lt=fo;function uo(e){return w(this,e).get(e)}var Ht=uo;function po(e){return w(this,e).has(e)}var Ut=po;function ho(e,t){var r=w(this,e),n=r.size;return r.set(e,t),this.size+=r.size==n?0:1,this}var jt=ho;function z(e){var t=-1,r=e==null?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}z.prototype.clear=Mt;z.prototype.delete=Lt;z.prototype.get=Ht;z.prototype.has=Ut;z.prototype.set=jt;var ke=z;var mo="Expected a function";function $e(e,t){if(typeof e!="function"||t!=null&&typeof t!="function")throw new TypeError(mo);var r=function(){var n=arguments,o=t?t.apply(this,n):n[0],s=r.cache;if(s.has(o))return s.get(o);var a=e.apply(this,n);return r.cache=s.set(o,a)||s,a};return r.cache=new($e.Cache||ke),r}$e.Cache=ke;var Bt=$e;var go=500;function _o(e){var t=Bt(e,function(n){return r.size===go&&r.clear(),n}),r=t.cache;return t}var Kt=_o;var yo=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Eo=/\\(\\)?/g,xo=Kt(function(e){var t=[];return e.charCodeAt(0)===46&&t.push(""),e.replace(yo,function(r,n,o,s){t.push(o?s.replace(Eo,"$1"):n||r)}),t}),Wt=xo;function vo(e){return e==null?"":pt(e)}var zt=vo;function No(e,t){return O(e)?e:bt(e,t)?[e]:Wt(zt(e))}var D=No;var Oo=1/0;function bo(e){if(typeof e=="string"||j(e))return e;var t=e+"";return t=="0"&&1/e==-Oo?"-0":t}var T=bo;function wo(e,t){t=D(t,e);for(var r=0,n=t.length;e!=null&&r<n;)e=e[T(t[r++])];return r&&r==n?e:void 0}var fe=wo;function Do(e,t,r){var n=e==null?void 0:fe(e,t);return n===void 0?r:n}var G=Do;function To(e,t,r){var n=-1,o=e.length;t<0&&(t=-t>o?0:o+t),r=r>o?o:r,r<0&&(r+=o),o=t>r?0:r-t>>>0,t>>>=0;for(var s=Array(o);++n<o;)s[n]=e[n+t];return s}var Gt=To;function Vo(e,t,r){t=D(t,e);for(var n=-1,o=t.length,s=!1;++n<o;){var a=T(t[n]);if(!(s=e!=null&&r(e,a)))break;e=e[a]}return s||++n!=o?s:(o=e==null?0:e.length,!!o&&vt(o)&&le(a,o)&&(O(e)||Ot(e)))}var Yt=Vo;function Co(e){var t=e==null?0:e.length;return t?e[t-1]:void 0}var qt=Co;var Ao=Object.prototype,So=Ao.hasOwnProperty;function Ro(e,t){return e!=null&&So.call(e,t)}var Jt=Ro;function Po(e,t){return e!=null&&Yt(e,t,Jt)}var Me=Po;function Io(e,t){return t.length<2?e:fe(e,Gt(t,0,-1))}var Xt=Io;function ko(e,t){return t=D(t,e),e=Xt(e,t),e==null||delete e[T(qt(t))]}var Zt=ko;function $o(e,t,r,n){if(!S(e))return e;t=D(t,e);for(var o=-1,s=t.length,a=s-1,i=e;i!=null&&++o<s;){var c=T(t[o]),l=r;if(c==="__proto__"||c==="constructor"||c==="prototype")return e;if(o!=a){var f=i[c];l=n?n(f,c,i):void 0,l===void 0&&(l=S(f)?f:le(t[o+1])?[]:{})}xt(i,c,l),i=i[c]}return e}var Qt=$o;function Mo(e,t,r){return e==null?e:Qt(e,t,r)}var te=Mo;function Fo(e,t){return e==null?!0:Zt(e,t)}var ue=Fo;function pe(e,t){let r=new Set(e.split(","));return t?n=>r.has(n.toLowerCase()):n=>r.has(n)}var Fe=()=>{},tr=()=>!1;var Lo=Object.prototype.hasOwnProperty,Y=(e,t)=>Lo.call(e,t),x=Array.isArray,q=e=>or(e)==="[object Map]";var R=e=>typeof e=="function",rr=e=>typeof e=="string",re=e=>typeof e=="symbol",P=e=>e!==null&&typeof e=="object",nr=e=>(P(e)||R(e))&&R(e.then)&&R(e.catch),Ho=Object.prototype.toString,or=e=>Ho.call(e),Le=e=>or(e).slice(8,-1);var de=e=>rr(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e;var he=e=>{let t=Object.create(null);return r=>t[r]||(t[r]=e(r))},Uo=/-(\w)/g,jo=he(e=>e.replace(Uo,(t,r)=>r?r.toUpperCase():"")),Bo=/\B([A-Z])/g,Ko=he(e=>e.replace(Bo,"-$1").toLowerCase()),sr=he(e=>e.charAt(0).toUpperCase()+e.slice(1)),Wo=he(e=>e?`on${sr(e)}`:""),V=(e,t)=>!Object.is(e,t);var er,ir=()=>er||(er=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});var zo="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly";var Go=pe(zo+",async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected");var Jo;function Xo(e,t=Jo){t&&t.active&&t.effects.push(e)}var I,ne=class{constructor(t,r,n,o){this.fn=t,this.trigger=r,this.scheduler=n,this.active=!0,this.deps=[],this._dirtyLevel=4,this._trackId=0,this._runnings=0,this._shouldSchedule=!1,this._depsLength=0,Xo(this,o)}get dirty(){if(this._dirtyLevel===2||this._dirtyLevel===3){this._dirtyLevel=1,Ne();for(let t=0;t<this._depsLength;t++){let r=this.deps[t];if(r.computed&&(Zo(r.computed),this._dirtyLevel>=4))break}this._dirtyLevel===1&&(this._dirtyLevel=0),Oe()}return this._dirtyLevel>=4}set dirty(t){this._dirtyLevel=t?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=A,r=I;try{return A=!0,I=this,this._runnings++,ar(this),this.fn()}finally{lr(this),this._runnings--,I=r,A=t}}stop(){var t;this.active&&(ar(this),lr(this),(t=this.onStop)==null||t.call(this),this.active=!1)}};function Zo(e){return e.value}function ar(e){e._trackId++,e._depsLength=0}function lr(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t<e.deps.length;t++)hr(e.deps[t],e);e.deps.length=e._depsLength}}function hr(e,t){let r=e.get(t);r!==void 0&&t._trackId!==r&&(e.delete(t),e.size===0&&e.cleanup())}var A=!0,He=0,mr=[];function Ne(){mr.push(A),A=!1}function Oe(){let e=mr.pop();A=e===void 0?!0:e}function Ye(){He++}function qe(){for(He--;!He&&Ue.length;)Ue.shift()()}function gr(e,t,r){var n;if(t.get(e)!==e._trackId){t.set(e,e._trackId);let o=e.deps[e._depsLength];o!==t?(o&&hr(o,e),e.deps[e._depsLength++]=t):e._depsLength++}}var Ue=[];function _r(e,t,r){var n;Ye();for(let o of e.keys()){let s;o._dirtyLevel<t&&(s??(s=e.get(o)===o._trackId))&&(o._shouldSchedule||(o._shouldSchedule=o._dirtyLevel===0),o._dirtyLevel=t),o._shouldSchedule&&(s??(s=e.get(o)===o._trackId))&&(o.trigger(),(!o._runnings||o.allowRecurse)&&o._dirtyLevel!==2&&(o._shouldSchedule=!1,o.scheduler&&Ue.push(o.scheduler)))}qe()}var yr=(e,t)=>{let r=new Map;return r.cleanup=e,r.computed=t,r},je=new WeakMap,k=Symbol(""),Be=Symbol("");function h(e,t,r){if(A&&I){let n=je.get(e);n||je.set(e,n=new Map);let o=n.get(r);o||n.set(r,o=yr(()=>n.delete(r))),gr(I,o,void 0)}}function v(e,t,r,n,o,s){let a=je.get(e);if(!a)return;let i=[];if(t==="clear")i=[...a.values()];else if(r==="length"&&x(e)){let c=Number(n);a.forEach((l,f)=>{(f==="length"||!re(f)&&f>=c)&&i.push(l)})}else switch(r!==void 0&&i.push(a.get(r)),t){case"add":x(e)?de(r)&&i.push(a.get("length")):(i.push(a.get(k)),q(e)&&i.push(a.get(Be)));break;case"delete":x(e)||(i.push(a.get(k)),q(e)&&i.push(a.get(Be)));break;case"set":q(e)&&i.push(a.get(k));break}Ye();for(let c of i)c&&_r(c,4,void 0);qe()}var Qo=pe("__proto__,__v_isRef,__isVue"),Er=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(re)),cr=es();function es(){let e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...r){let n=d(this);for(let s=0,a=this.length;s<a;s++)h(n,"get",s+"");let o=n[t](...r);return o===-1||o===!1?n[t](...r.map(d)):o}}),["push","pop","shift","unshift","splice"].forEach(t=>{e[t]=function(...r){Ne(),Ye();let n=d(this)[t].apply(this,r);return qe(),Oe(),n}}),e}function ts(e){let t=d(this);return h(t,"has",e),t.hasOwnProperty(e)}var xe=class{constructor(t=!1,r=!1){this._isReadonly=t,this._shallow=r}get(t,r,n){let o=this._isReadonly,s=this._shallow;if(r==="__v_isReactive")return!o;if(r==="__v_isReadonly")return o;if(r==="__v_isShallow")return s;if(r==="__v_raw")return n===(o?s?ps:Nr:s?us:vr).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(n)?t:void 0;let a=x(t);if(!o){if(a&&Y(cr,r))return Reflect.get(cr,r,n);if(r==="hasOwnProperty")return ts}let i=Reflect.get(t,r,n);return(re(r)?Er.has(r):Qo(r))||(o||h(t,"get",r),s)?i:Z(i)?a&&de(r)?i:i.value:P(i)?o?Xe(i):we(i):i}},Ke=class extends xe{constructor(t=!1){super(!1,t)}set(t,r,n,o){let s=t[r];if(!this._shallow){let c=X(s);if(!De(n)&&!X(n)&&(s=d(s),n=d(n)),!x(t)&&Z(s)&&!Z(n))return c?!1:(s.value=n,!0)}let a=x(t)&&de(r)?Number(r)<t.length:Y(t,r),i=Reflect.set(t,r,n,o);return t===d(o)&&(a?V(n,s)&&v(t,"set",r,n,s):v(t,"add",r,n)),i}deleteProperty(t,r){let n=Y(t,r),o=t[r],s=Reflect.deleteProperty(t,r);return s&&n&&v(t,"delete",r,void 0,o),s}has(t,r){let n=Reflect.has(t,r);return(!re(r)||!Er.has(r))&&h(t,"has",r),n}ownKeys(t){return h(t,"iterate",x(t)?"length":k),Reflect.ownKeys(t)}},We=class extends xe{constructor(t=!1){super(!0,t)}set(t,r){return!0}deleteProperty(t,r){return!0}},rs=new Ke,ns=new We;var Je=e=>e,be=e=>Reflect.getPrototypeOf(e);function me(e,t,r=!1,n=!1){e=e.__v_raw;let o=d(e),s=d(t);r||(V(t,s)&&h(o,"get",t),h(o,"get",s));let{has:a}=be(o),i=n?Je:r?Ze:oe;if(a.call(o,t))return i(e.get(t));if(a.call(o,s))return i(e.get(s));e!==o&&e.get(t)}function ge(e,t=!1){let r=this.__v_raw,n=d(r),o=d(e);return t||(V(e,o)&&h(n,"has",e),h(n,"has",o)),e===o?r.has(e):r.has(e)||r.has(o)}function _e(e,t=!1){return e=e.__v_raw,!t&&h(d(e),"iterate",k),Reflect.get(e,"size",e)}function fr(e){e=d(e);let t=d(this);return be(t).has.call(t,e)||(t.add(e),v(t,"add",e,e)),this}function ur(e,t){t=d(t);let r=d(this),{has:n,get:o}=be(r),s=n.call(r,e);s||(e=d(e),s=n.call(r,e));let a=o.call(r,e);return r.set(e,t),s?V(t,a)&&v(r,"set",e,t,a):v(r,"add",e,t),this}function pr(e){let t=d(this),{has:r,get:n}=be(t),o=r.call(t,e);o||(e=d(e),o=r.call(t,e));let s=n?n.call(t,e):void 0,a=t.delete(e);return o&&v(t,"delete",e,void 0,s),a}function dr(){let e=d(this),t=e.size!==0,r=void 0,n=e.clear();return t&&v(e,"clear",void 0,void 0,r),n}function ye(e,t){return function(n,o){let s=this,a=s.__v_raw,i=d(a),c=t?Je:e?Ze:oe;return!e&&h(i,"iterate",k),a.forEach((l,f)=>n.call(o,c(l),c(f),s))}}function Ee(e,t,r){return function(...n){let o=this.__v_raw,s=d(o),a=q(s),i=e==="entries"||e===Symbol.iterator&&a,c=e==="keys"&&a,l=o[e](...n),f=r?Je:t?Ze:oe;return!t&&h(s,"iterate",c?Be:k),{next(){let{value:u,done:p}=l.next();return p?{value:u,done:p}:{value:i?[f(u[0]),f(u[1])]:f(u),done:p}},[Symbol.iterator](){return this}}}}function C(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function os(){let e={get(s){return me(this,s)},get size(){return _e(this)},has:ge,add:fr,set:ur,delete:pr,clear:dr,forEach:ye(!1,!1)},t={get(s){return me(this,s,!1,!0)},get size(){return _e(this)},has:ge,add:fr,set:ur,delete:pr,clear:dr,forEach:ye(!1,!0)},r={get(s){return me(this,s,!0)},get size(){return _e(this,!0)},has(s){return ge.call(this,s,!0)},add:C("add"),set:C("set"),delete:C("delete"),clear:C("clear"),forEach:ye(!0,!1)},n={get(s){return me(this,s,!0,!0)},get size(){return _e(this,!0)},has(s){return ge.call(this,s,!0)},add:C("add"),set:C("set"),delete:C("delete"),clear:C("clear"),forEach:ye(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(s=>{e[s]=Ee(s,!1,!1),r[s]=Ee(s,!0,!1),t[s]=Ee(s,!1,!0),n[s]=Ee(s,!0,!0)}),[e,r,t,n]}var[ss,is,as,ls]=os();function xr(e,t){let r=t?e?ls:as:e?is:ss;return(n,o,s)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?n:Reflect.get(Y(r,o)&&o in n?r:n,o,s)}var cs={get:xr(!1,!1)};var fs={get:xr(!0,!1)};var vr=new WeakMap,us=new WeakMap,Nr=new WeakMap,ps=new WeakMap;function ds(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function hs(e){return e.__v_skip||!Object.isExtensible(e)?0:ds(Le(e))}function we(e){return X(e)?e:Or(e,!1,rs,cs,vr)}function Xe(e){return Or(e,!0,ns,fs,Nr)}function Or(e,t,r,n,o){if(!P(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;let s=o.get(e);if(s)return s;let a=hs(e);if(a===0)return e;let i=new Proxy(e,a===2?n:r);return o.set(e,i),i}function X(e){return!!(e&&e.__v_isReadonly)}function De(e){return!!(e&&e.__v_isShallow)}function d(e){let t=e&&e.__v_raw;return t?d(t):e}var oe=e=>P(e)?we(e):e,Ze=e=>P(e)?Xe(e):e;var ve=class{constructor(t,r,n,o){this._setter=r,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new ne(()=>t(this._value),()=>J(this,this.effect._dirtyLevel===2?2:3)),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=n}get value(){let t=d(this);return(!t._cacheable||t.effect.dirty)&&V(t._value,t._value=t.effect.run())&&J(t,4),Qe(t),t.effect._dirtyLevel>=2&&J(t,2),t._value}set value(t){this._setter(t)}get _dirty(){return this.effect.dirty}set _dirty(t){this.effect.dirty=t}};function br(e,t,r=!1){let n,o,s=R(e);return s?(n=e,o=Fe):(n=e.get,o=e.set),new ve(n,o,s||!o,r)}function Qe(e){var t;A&&I&&(e=d(e),gr(I,(t=e.dep)!=null?t:e.dep=yr(()=>e.dep=void 0,e instanceof ve?e:void 0),void 0))}function J(e,t=4,r){e=d(e);let n=e.dep;n&&_r(n,t,void 0)}function Z(e){return!!(e&&e.__v_isRef===!0)}function $(e){return wr(e,!1)}function et(e){return wr(e,!0)}function wr(e,t){return Z(e)?e:new ze(e,t)}var ze=class{constructor(t,r){this.__v_isShallow=r,this.dep=void 0,this.__v_isRef=!0,this._rawValue=r?t:d(t),this._value=r?t:oe(t)}get value(){return Qe(this),this._value}set value(t){let r=this.__v_isShallow||De(t)||X(t);t=r?t:d(t),V(t,this._rawValue)&&(this._rawValue=t,this._value=r?t:oe(t),J(this,4,t))}};function Q(e){J(e,4,void 0)}var Ge=class{constructor(t){this.dep=void 0,this.__v_isRef=!0;let{get:r,set:n}=t(()=>Qe(this),()=>J(this));this._get=r,this._set=n}get value(){return this._get()}set value(t){this._set(t)}};function Te(e){return new Ge(e)}function Dr(e,t,r,n){try{return n?e(...n):e()}catch(o){Vr(o,t,r)}}function Tr(e,t,r,n){if(R(e)){let s=Dr(e,t,r,n);return s&&nr(s)&&s.catch(a=>{Vr(a,t,r)}),s}let o=[];for(let s=0;s<e.length;s++)o.push(Tr(e[s],t,r,n));return o}function Vr(e,t,r,n=!0){let o=t?t.vnode:null;if(t){let s=t.parent,a=t.proxy,i=`https://vuejs.org/error-reference/#runtime-${r}`;for(;s;){let l=s.ec;if(l){for(let f=0;f<l.length;f++)if(l[f](e,a,i)===!1)return}s=s.parent}let c=t.appContext.config.errorHandler;if(c){Dr(c,null,10,[e,a,i]);return}}Ns(e,r,o,n)}function Ns(e,t,r,n=!0){console.error(e)}var Dc=Symbol.for("v-ndc");var Tc=Symbol.for("v-scx");var Vc=Symbol("_leaveCb"),Cc=Symbol("_enterCb");function Os(e,t,r=Ve,n=!1){if(r){let o=r[e]||(r[e]=[]),s=t.__weh||(t.__weh=(...a)=>{if(r.isUnmounted)return;Ne();let i=Ds(r),c=Tr(t,r,e,a);return i(),Oe(),c});return n?o.unshift(s):o.push(s),s}}var N=e=>(t,r=Ve)=>(!rt||e==="sp")&&Os(e,(...n)=>t(...n),r),Ac=N("bm"),Sc=N("m"),Rc=N("bu"),Pc=N("u"),Ic=N("bum"),kc=N("um"),$c=N("sp"),Mc=N("rtg"),Fc=N("rtc");function bs(){return{app:null,config:{isNativeTag:tr,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}var Lc=Symbol.for("v-fgt"),Hc=Symbol.for("v-txt"),Uc=Symbol.for("v-cmt"),jc=Symbol.for("v-stc");var Bc=bs();var Ve=null;var tt,ws;{let e=ir(),t=(r,n)=>{let o;return(o=e[r])||(o=e[r]=[]),o.push(n),s=>{o.length>1?o.forEach(a=>a(s)):o[0](s)}};tt=t("__VUE_INSTANCE_SETTERS__",r=>Ve=r),ws=t("__VUE_SSR_SETTERS__",r=>rt=r)}var Ds=e=>{let t=Ve;return tt(e),e.scope.on(),()=>{e.scope.off(),tt(t)}};var rt=!1;var M=(e,t)=>br(e,t,rt);var g=e=>typeof e=="object"&&e!==null&&!Array.isArray(e)&&!(e instanceof Date)&&!(e instanceof File)&&!(e instanceof Map)&&!(e instanceof Set),Ts=e=>Object.keys(e).length===0,Cr=function*(e,t={}){let{goDeepCondition:r=(s,a)=>g(a),includeParent:n=!1}=t,o=function*(s,a){for(let[i,c]of Object.entries(a)){let l=s.concat(i);r(l,c)?(n&&(yield[l,c]),yield*o(l,c)):yield[l,c]}};yield*o([],e)},Ar=(e,t)=>Te((r,n)=>{let o=(a,i=[])=>{let c=t(i);return new Proxy(a,{...c,get(l,f,u){r();let p=c.get?c.get(l,f,u):Reflect.get(l,f,u);return g(p)||Array.isArray(p)?o(p,i.concat({target:l,property:f,receiver:u})):p},set(l,f,u,p){let m=c.set?c.set(l,f,u,p):Reflect.set(l,f,u,p);return n(),m},deleteProperty(l,f){let u=c.deleteProperty?c.deleteProperty(l,f):Reflect.deleteProperty(l,f);return n(),u}})},s=o(e);return{get(){return r(),s},set(a){s=o(a),n()}}}),F=class{length;constructor(t){this.length=t,Object.defineProperty(this,"length",{enumerable:!1,value:t})}},Sr=(e,t)=>{let r=e;for(let{target:o,property:s}of t.slice(0,-1))if(s in r)if(g(r[s])||r[s]instanceof F)r=r[s];else return;else Array.isArray(o[s])?r=r[s]=new F(o[s].length):g(o[s])&&(r=r[s]={});let n=t.at(-1);r[n.property]=n.target[n.property]},Ce=(e,t,r)=>{let n=t.map(c=>c.property),o=G(e,n),s=(c,l)=>{let f=new Set;if(c)for(let p of Object.keys(c))f.add(p);if(l)for(let p of Object.keys(l))f.add(p);let u=Array.from(f).filter(p=>!Object.keys(r).includes(p));for(let p of u)Ce(e,t.concat({target:l||r,property:p}),void 0)},a=t.at(-1),i=a.target[a.property];if(g(r)&&(g(o)||g(i))){s(o,i);for(let c of Object.keys(r))Ce(e,t.concat({target:i||r,property:c}),r[c])}else if(Array.isArray(r)&&(o instanceof F||Array.isArray(i))){s(o,i);for(let c of r.keys())Ce(e,t.concat({target:i||r,property:c.toString()}),r[c])}else Me(e,n)?o===r&&ue(e,n):i!==r&&Sr(e,t)},Ae=e=>{let t=Ar({},l=>({deleteProperty(f,u){let p=Reflect.deleteProperty(f,u);if(l.length){let m=l.at(-1);Ts(f)&&delete m.receiver[m.property]}return p}})),r=Ar({root:e},l=>({set(f,u,p,m){let se=l.concat({target:f,property:u,receiver:m}),Se=f[u],Rr=()=>{let Pr=G(t.value,se.map(_=>_.property)),{length:ie}=Pr||Se;if(p<ie)for(let _=p;_<ie;_++)delete m[_];else if(ie<p)for(let _=ie;_<p;_++)m[_]=void 0};return Array.isArray(f)&&u==="length"?p!==Se&&Rr():Ce(t.value,se,p),Reflect.set(f,u,p,m)},deleteProperty(f,u){return Sr(t.value,l.concat({target:f,property:u})),Reflect.deleteProperty(f,u)}})),n=M({get:()=>r.value.root,set:l=>r.value.root=l}),o=M(()=>Object.keys(t.value).length>0),s=M(()=>{let l={},f=Cr(t.value,{goDeepCondition:(u,p)=>{let m=G(r.value,u),se=p instanceof F&&Array.isArray(m);return g(p)&&g(m)||se}});for(let[u]of f){let p=G(r.value,u);te(l,u,p)}return l}),a=M(()=>s.value.root);return{data:n,changedData:a,isDirty:o,loadData:l=>{r.value={root:l},t.value={}},reset:()=>{let l=JSON.parse(JSON.stringify(r.value));for(let[f,u]of Cr(t.value,{includeParent:!0}))u instanceof F?te(l,f.concat("length"),u.length):g(u)||(u===void 0?ue(l,f):te(l,f,u));r.value=l,t.value={}}}};var Vs=(e=()=>({}))=>{let t=et([]),r=M(()=>t.value.some(({instance:i,isRemoved:c,isNew:l})=>i.isDirty.value||l.value||c.value));return{items:t,isDirty:r,add:(i,c=t.value.length)=>{let l=Ae(i),f={isRemoved:$(!1),isNew:$(!0),instance:l,meta:e(l)};return t.value.splice(c,0,f),Q(t),f},remove:(i,c=!1)=>{t.value[i].isNew.value||c?(t.value.splice(i,1),Q(t)):t.value[i].isRemoved.value=!0},loadData:i=>{t.value=i.map(c=>{let l=Ae(c);return{isNew:$(!1),isRemoved:$(!1),instance:l,meta:e(l)}}),Q(t)},reset:()=>{t.value=t.value.filter(({isNew:i})=>!i.value);for(let i of t.value)i.isRemoved.value=!1,i.instance.reset();Q(t)}}};})();
|
|
2
|
+
/*! Bundled license information:
|
|
3
|
+
|
|
4
|
+
lodash-es/lodash.js:
|
|
5
|
+
(**
|
|
6
|
+
* @license
|
|
7
|
+
* Lodash (Custom Build) <https://lodash.com/>
|
|
8
|
+
* Build: `lodash modularize exports="es" -o ./`
|
|
9
|
+
* Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
|
|
10
|
+
* Released under MIT license <https://lodash.com/license>
|
|
11
|
+
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
|
|
12
|
+
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|
13
|
+
*)
|
|
14
|
+
|
|
15
|
+
@vue/shared/dist/shared.esm-bundler.js:
|
|
16
|
+
(**
|
|
17
|
+
* @vue/shared v3.4.19
|
|
18
|
+
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
|
19
|
+
* @license MIT
|
|
20
|
+
**)
|
|
21
|
+
|
|
22
|
+
@vue/reactivity/dist/reactivity.esm-bundler.js:
|
|
23
|
+
(**
|
|
24
|
+
* @vue/reactivity v3.4.19
|
|
25
|
+
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
|
26
|
+
* @license MIT
|
|
27
|
+
**)
|
|
28
|
+
|
|
29
|
+
@vue/runtime-core/dist/runtime-core.esm-bundler.js:
|
|
30
|
+
(**
|
|
31
|
+
* @vue/runtime-core v3.4.19
|
|
32
|
+
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
|
33
|
+
* @license MIT
|
|
34
|
+
**)
|
|
35
|
+
|
|
36
|
+
@vue/runtime-core/dist/runtime-core.esm-bundler.js:
|
|
37
|
+
(*! #__NO_SIDE_EFFECTS__ *)
|
|
38
|
+
|
|
39
|
+
@vue/runtime-core/dist/runtime-core.esm-bundler.js:
|
|
40
|
+
(*! #__NO_SIDE_EFFECTS__ *)
|
|
41
|
+
|
|
42
|
+
vue/dist/vue.runtime.esm-bundler.js:
|
|
43
|
+
(**
|
|
44
|
+
* vue v3.4.19
|
|
45
|
+
* (c) 2018-present Yuxi (Evan) You and Vue contributors
|
|
46
|
+
* @license MIT
|
|
47
|
+
**)
|
|
48
|
+
*/
|
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tracked-instance",
|
|
3
|
+
"version": "1.0.8",
|
|
3
4
|
"description": "Build large forms and track all changes",
|
|
4
5
|
"type": "module",
|
|
5
6
|
"scripts": {
|
|
6
|
-
"build": "tsc",
|
|
7
|
+
"build": "tsc && esbuild ./dist/build/index.js --bundle --minify --outfile=./dist/index.js && rm -rf ./dist/build",
|
|
7
8
|
"test": "vitest run"
|
|
8
9
|
},
|
|
9
10
|
"main": "./dist/index.js",
|
|
10
|
-
"types": "./dist/index.d.ts",
|
|
11
|
+
"types": "./dist/types/index.d.ts",
|
|
11
12
|
"files": [
|
|
12
|
-
"dist"
|
|
13
|
-
"src"
|
|
13
|
+
"dist"
|
|
14
14
|
],
|
|
15
15
|
"devDependencies": {
|
|
16
16
|
"@types/lodash-es": "^4.17.12",
|
|
@@ -40,6 +40,5 @@
|
|
|
40
40
|
"collection",
|
|
41
41
|
"useTrackedInstance",
|
|
42
42
|
"useCollection"
|
|
43
|
-
]
|
|
44
|
-
"version": "1.0.5"
|
|
43
|
+
]
|
|
45
44
|
}
|
package/dist/collection.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { computed, shallowRef, triggerRef, ref } from 'vue';
|
|
2
|
-
import { useTrackedInstance } from './tracked-instance';
|
|
3
|
-
export const useCollection = (createItemMeta = () => ({})) => {
|
|
4
|
-
const items = shallowRef([]);
|
|
5
|
-
const isDirty = computed(() => items.value.some(({ instance, isRemoved, isNew }) => instance.isDirty.value || isNew.value || isRemoved.value));
|
|
6
|
-
const add = (item, index = items.value.length) => {
|
|
7
|
-
const instance = useTrackedInstance(item);
|
|
8
|
-
const newItem = {
|
|
9
|
-
isRemoved: ref(false),
|
|
10
|
-
isNew: ref(true),
|
|
11
|
-
instance,
|
|
12
|
-
meta: createItemMeta(instance)
|
|
13
|
-
};
|
|
14
|
-
items.value.splice(index, 0, newItem);
|
|
15
|
-
triggerRef(items);
|
|
16
|
-
return newItem;
|
|
17
|
-
};
|
|
18
|
-
const remove = (index, isHardRemove = false) => {
|
|
19
|
-
const item = items.value[index];
|
|
20
|
-
if (item.isNew.value || isHardRemove) {
|
|
21
|
-
items.value.splice(index, 1);
|
|
22
|
-
triggerRef(items);
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
items.value[index].isRemoved.value = true;
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
const loadData = (loadedItems) => {
|
|
29
|
-
items.value = loadedItems.map((item) => {
|
|
30
|
-
const instance = useTrackedInstance(item);
|
|
31
|
-
return {
|
|
32
|
-
isNew: ref(false),
|
|
33
|
-
isRemoved: ref(false),
|
|
34
|
-
instance,
|
|
35
|
-
meta: createItemMeta(instance)
|
|
36
|
-
};
|
|
37
|
-
});
|
|
38
|
-
triggerRef(items);
|
|
39
|
-
};
|
|
40
|
-
const reset = () => {
|
|
41
|
-
items.value = items.value.filter(({ isNew }) => !isNew.value);
|
|
42
|
-
for (const item of items.value) {
|
|
43
|
-
item.isRemoved.value = false;
|
|
44
|
-
item.instance.reset();
|
|
45
|
-
}
|
|
46
|
-
triggerRef(items);
|
|
47
|
-
};
|
|
48
|
-
return {
|
|
49
|
-
items,
|
|
50
|
-
isDirty,
|
|
51
|
-
add,
|
|
52
|
-
remove,
|
|
53
|
-
loadData,
|
|
54
|
-
reset
|
|
55
|
-
};
|
|
56
|
-
};
|
|
57
|
-
//# sourceMappingURL=collection.js.map
|
package/dist/collection.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"collection.js","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAC,kBAAkB,EAAC,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAC,aAAa,EAAC,MAAM,cAAc,CAAA"}
|
package/dist/tracked-instance.js
DELETED
|
@@ -1,266 +0,0 @@
|
|
|
1
|
-
import { get, has, set, unset } from 'lodash-es';
|
|
2
|
-
import { computed, customRef } from 'vue';
|
|
3
|
-
const isObject = (value) => typeof value === 'object' &&
|
|
4
|
-
value !== null &&
|
|
5
|
-
!Array.isArray(value) &&
|
|
6
|
-
!(value instanceof Date) &&
|
|
7
|
-
!(value instanceof File) &&
|
|
8
|
-
!(value instanceof Map) &&
|
|
9
|
-
!(value instanceof Set);
|
|
10
|
-
const isEmpty = (value) => Object.keys(value).length === 0;
|
|
11
|
-
const iterateObject = function* (source, params = {}) {
|
|
12
|
-
const { goDeepCondition = (_, value) => isObject(value), includeParent = false } = params;
|
|
13
|
-
const iterateObjectDeep = function* (path, obj) {
|
|
14
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
15
|
-
const currentPath = path.concat(key);
|
|
16
|
-
if (goDeepCondition(currentPath, value)) {
|
|
17
|
-
if (includeParent) {
|
|
18
|
-
yield [currentPath, value];
|
|
19
|
-
}
|
|
20
|
-
yield* iterateObjectDeep(currentPath, value);
|
|
21
|
-
}
|
|
22
|
-
else {
|
|
23
|
-
yield [currentPath, value];
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
yield* iterateObjectDeep([], source);
|
|
28
|
-
};
|
|
29
|
-
const createNestedRef = (source, handler) => customRef((track, trigger) => {
|
|
30
|
-
// make nested objects and arrays is reactive
|
|
31
|
-
const createProxy = (source, path = []) => {
|
|
32
|
-
const currentProxyHandler = handler(path);
|
|
33
|
-
return new Proxy(source, {
|
|
34
|
-
...currentProxyHandler,
|
|
35
|
-
get(target, property, receiver) {
|
|
36
|
-
track();
|
|
37
|
-
const result = currentProxyHandler.get
|
|
38
|
-
? currentProxyHandler.get(target, property, receiver)
|
|
39
|
-
: Reflect.get(target, property, receiver);
|
|
40
|
-
if (isObject(result) || Array.isArray(result)) {
|
|
41
|
-
return createProxy(result, path.concat({ target, property, receiver }));
|
|
42
|
-
}
|
|
43
|
-
return result;
|
|
44
|
-
},
|
|
45
|
-
set(target, property, value, receiver) {
|
|
46
|
-
const result = currentProxyHandler.set
|
|
47
|
-
? currentProxyHandler.set(target, property, value, receiver)
|
|
48
|
-
: Reflect.set(target, property, value, receiver);
|
|
49
|
-
trigger();
|
|
50
|
-
return result;
|
|
51
|
-
},
|
|
52
|
-
deleteProperty(target, property) {
|
|
53
|
-
const result = currentProxyHandler.deleteProperty
|
|
54
|
-
? currentProxyHandler.deleteProperty(target, property)
|
|
55
|
-
: Reflect.deleteProperty(target, property);
|
|
56
|
-
trigger();
|
|
57
|
-
return result;
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
};
|
|
61
|
-
let value = createProxy(source);
|
|
62
|
-
return {
|
|
63
|
-
get() {
|
|
64
|
-
track();
|
|
65
|
-
return value;
|
|
66
|
-
},
|
|
67
|
-
set(newValue) {
|
|
68
|
-
value = createProxy(newValue);
|
|
69
|
-
trigger();
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
|
-
});
|
|
73
|
-
// array values in originalData should store in default object to avoid removing items on change length
|
|
74
|
-
class ArrayInOriginalData {
|
|
75
|
-
length;
|
|
76
|
-
constructor(length) {
|
|
77
|
-
this.length = length;
|
|
78
|
-
// length should not include in iterations
|
|
79
|
-
Object.defineProperty(this, 'length', {
|
|
80
|
-
enumerable: false,
|
|
81
|
-
value: length
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
const setOriginalDataValue = (originalData, path) => {
|
|
86
|
-
let originalDataTarget = originalData;
|
|
87
|
-
for (const { target: oldValueParent, property } of path.slice(0, -1)) {
|
|
88
|
-
if (property in originalDataTarget) {
|
|
89
|
-
if (isObject(originalDataTarget[property]) || originalDataTarget[property] instanceof ArrayInOriginalData) {
|
|
90
|
-
originalDataTarget = originalDataTarget[property];
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
// cancel set originalData value because in this case we try to replace primitive value by object or array value
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
if (Array.isArray(oldValueParent[property])) {
|
|
99
|
-
originalDataTarget = originalDataTarget[property] = new ArrayInOriginalData(oldValueParent[property].length);
|
|
100
|
-
}
|
|
101
|
-
else if (isObject(oldValueParent[property])) {
|
|
102
|
-
originalDataTarget = originalDataTarget[property] = {};
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
const lastItem = path.at(-1);
|
|
107
|
-
originalDataTarget[lastItem.property] = lastItem.target[lastItem.property];
|
|
108
|
-
};
|
|
109
|
-
const snapshotValueToOriginalData = (originalData, path, value) => {
|
|
110
|
-
const pathAsString = path.map((i) => i.property);
|
|
111
|
-
const valueInOriginalData = get(originalData, pathAsString);
|
|
112
|
-
const markRemovedFieldsAsUndefined = (valueInOriginalData, oldValue) => {
|
|
113
|
-
const keysSet = new Set();
|
|
114
|
-
if (valueInOriginalData) {
|
|
115
|
-
for (const key of Object.keys(valueInOriginalData)) {
|
|
116
|
-
keysSet.add(key);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
if (oldValue) {
|
|
120
|
-
for (const key of Object.keys(oldValue)) {
|
|
121
|
-
keysSet.add(key);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
const keys = Array.from(keysSet).filter((key) => !Object.keys(value).includes(key));
|
|
125
|
-
for (const key of keys) {
|
|
126
|
-
snapshotValueToOriginalData(originalData, path.concat({ target: oldValue || value, property: key }), undefined);
|
|
127
|
-
}
|
|
128
|
-
};
|
|
129
|
-
const lastPathItem = path.at(-1);
|
|
130
|
-
const oldValue = lastPathItem.target[lastPathItem.property];
|
|
131
|
-
if (isObject(value) && (isObject(valueInOriginalData) || isObject(oldValue))) {
|
|
132
|
-
// if value includes in oldValue or originalData need mark removed fields as undefined and recursively run nested objects
|
|
133
|
-
markRemovedFieldsAsUndefined(valueInOriginalData, oldValue);
|
|
134
|
-
for (const key of Object.keys(value)) {
|
|
135
|
-
snapshotValueToOriginalData(originalData, path.concat({ target: oldValue || value, property: key }), value[key]);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
else if (Array.isArray(value) && (valueInOriginalData instanceof ArrayInOriginalData || Array.isArray(oldValue))) {
|
|
139
|
-
// do same for arrays
|
|
140
|
-
markRemovedFieldsAsUndefined(valueInOriginalData, oldValue);
|
|
141
|
-
for (const key of value.keys()) {
|
|
142
|
-
snapshotValueToOriginalData(originalData, path.concat({ target: oldValue || value, property: key.toString() }), value[key]);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
// in case value is plain then store it into originalData
|
|
147
|
-
if (!has(originalData, pathAsString)) {
|
|
148
|
-
if (oldValue !== value) {
|
|
149
|
-
setOriginalDataValue(originalData, path);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
else if (valueInOriginalData === value) {
|
|
153
|
-
unset(originalData, pathAsString);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
};
|
|
157
|
-
export const useTrackedInstance = (initialData) => {
|
|
158
|
-
const _originalData = createNestedRef({}, (path) => ({
|
|
159
|
-
deleteProperty(target, property) {
|
|
160
|
-
const result = Reflect.deleteProperty(target, property);
|
|
161
|
-
if (path.length) {
|
|
162
|
-
const parent = path.at(-1);
|
|
163
|
-
if (isEmpty(target)) {
|
|
164
|
-
delete parent.receiver[parent.property];
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
return result;
|
|
168
|
-
}
|
|
169
|
-
}));
|
|
170
|
-
const _data = createNestedRef({ root: initialData }, (parentThree) => ({
|
|
171
|
-
set(target, property, value, receiver) {
|
|
172
|
-
const path = parentThree.concat({ target, property, receiver });
|
|
173
|
-
const oldValue = target[property];
|
|
174
|
-
const triggerChangingArrayItems = () => {
|
|
175
|
-
// in case length in array has changed then emit changing of value by index
|
|
176
|
-
const originalDataValue = get(_originalData.value, path.map((i) => i.property));
|
|
177
|
-
const { length: originalDataLength } = originalDataValue || oldValue;
|
|
178
|
-
if (value < originalDataLength) {
|
|
179
|
-
// when removed new value
|
|
180
|
-
for (let i = value; i < originalDataLength; i++) {
|
|
181
|
-
delete receiver[i];
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
else if (originalDataLength < value) {
|
|
185
|
-
// store all removed values as "undefined" when this array values was in data before do some change
|
|
186
|
-
for (let i = originalDataLength; i < value; i++) {
|
|
187
|
-
receiver[i] = undefined;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
};
|
|
191
|
-
if (Array.isArray(target) && property === 'length') {
|
|
192
|
-
if (value !== oldValue) {
|
|
193
|
-
triggerChangingArrayItems();
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
else {
|
|
197
|
-
snapshotValueToOriginalData(_originalData.value, path, value);
|
|
198
|
-
}
|
|
199
|
-
return Reflect.set(target, property, value, receiver);
|
|
200
|
-
},
|
|
201
|
-
deleteProperty(target, property) {
|
|
202
|
-
setOriginalDataValue(_originalData.value, parentThree.concat({ target, property }));
|
|
203
|
-
return Reflect.deleteProperty(target, property);
|
|
204
|
-
}
|
|
205
|
-
}));
|
|
206
|
-
const data = computed({
|
|
207
|
-
get: () => _data.value.root,
|
|
208
|
-
set: (value) => (_data.value.root = value)
|
|
209
|
-
});
|
|
210
|
-
const isDirty = computed(() => Object.keys(_originalData.value).length > 0);
|
|
211
|
-
const _changedData = computed(() => {
|
|
212
|
-
const changedData = {};
|
|
213
|
-
const originalDataIterator = iterateObject(_originalData.value, {
|
|
214
|
-
goDeepCondition: (path, value) => {
|
|
215
|
-
/*
|
|
216
|
-
* iterate over originalData
|
|
217
|
-
* but avoid going deep in case
|
|
218
|
-
* when value in data have different data type
|
|
219
|
-
* of same value in originalData
|
|
220
|
-
*/
|
|
221
|
-
const valueInData = get(_data.value, path);
|
|
222
|
-
const isBothValuesAsArray = value instanceof ArrayInOriginalData && Array.isArray(valueInData);
|
|
223
|
-
const isBothValuesAsObject = isObject(value) && isObject(valueInData);
|
|
224
|
-
return isBothValuesAsObject || isBothValuesAsArray;
|
|
225
|
-
}
|
|
226
|
-
});
|
|
227
|
-
for (const [path] of originalDataIterator) {
|
|
228
|
-
const valueInData = get(_data.value, path);
|
|
229
|
-
set(changedData, path, valueInData);
|
|
230
|
-
}
|
|
231
|
-
return changedData;
|
|
232
|
-
});
|
|
233
|
-
const changedData = computed(() => _changedData.value.root);
|
|
234
|
-
const loadData = (newData) => {
|
|
235
|
-
_data.value = { root: newData };
|
|
236
|
-
_originalData.value = {};
|
|
237
|
-
};
|
|
238
|
-
const reset = () => {
|
|
239
|
-
const updatedData = JSON.parse(JSON.stringify(_data.value));
|
|
240
|
-
// iterate over originalData including objects to check array values
|
|
241
|
-
for (const [path, value] of iterateObject(_originalData.value, { includeParent: true })) {
|
|
242
|
-
if (value instanceof ArrayInOriginalData) {
|
|
243
|
-
// reset array length in data to remove new items
|
|
244
|
-
set(updatedData, path.concat('length'), value.length);
|
|
245
|
-
}
|
|
246
|
-
else if (!isObject(value)) {
|
|
247
|
-
if (value === undefined) {
|
|
248
|
-
unset(updatedData, path);
|
|
249
|
-
}
|
|
250
|
-
else {
|
|
251
|
-
set(updatedData, path, value);
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
_data.value = updatedData;
|
|
256
|
-
_originalData.value = {};
|
|
257
|
-
};
|
|
258
|
-
return {
|
|
259
|
-
data,
|
|
260
|
-
changedData,
|
|
261
|
-
isDirty,
|
|
262
|
-
loadData,
|
|
263
|
-
reset
|
|
264
|
-
};
|
|
265
|
-
};
|
|
266
|
-
//# sourceMappingURL=tracked-instance.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tracked-instance.js","sourceRoot":"","sources":["../src/tracked-instance.ts"],"names":[],"mappings":"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"}
|
package/src/collection.ts
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import {computed, shallowRef, triggerRef, ShallowRef, ComputedRef, ref, Ref} from 'vue'
|
|
2
|
-
import {TrackedInstance, useTrackedInstance} from './tracked-instance'
|
|
3
|
-
|
|
4
|
-
export interface CollectionItem<Item extends Record<string, any>, Meta = Record<string, any>> {
|
|
5
|
-
instance: TrackedInstance<Item>
|
|
6
|
-
meta: Meta
|
|
7
|
-
isRemoved: Ref<boolean>
|
|
8
|
-
isNew: Ref<boolean>
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export interface Collection<Item extends Record<string, any>, Meta = Record<string, any>> {
|
|
12
|
-
items: ShallowRef<CollectionItem<Item, Meta>[]>
|
|
13
|
-
isDirty: ComputedRef<boolean>
|
|
14
|
-
add: (item: Partial<Item>, afterIndex?: number) => CollectionItem<Item, Meta>
|
|
15
|
-
remove: (index: number, isHardRemove?: boolean) => void
|
|
16
|
-
loadData: (items: Item[]) => void
|
|
17
|
-
reset: () => void
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export const useCollection = <Item extends Record<string, any>, Meta = Record<string, any>>(
|
|
21
|
-
createItemMeta: (instance: TrackedInstance<Item>) => Meta = () => ({}) as Meta
|
|
22
|
-
): Collection<Item, Meta> => {
|
|
23
|
-
const items = shallowRef<CollectionItem<Item, Meta>[]>([])
|
|
24
|
-
|
|
25
|
-
const isDirty = computed(() =>
|
|
26
|
-
items.value.some(({instance, isRemoved, isNew}) => instance.isDirty.value || isNew.value || isRemoved.value)
|
|
27
|
-
)
|
|
28
|
-
|
|
29
|
-
const add = (item: Partial<Item>, index: number = items.value.length) => {
|
|
30
|
-
const instance = useTrackedInstance<Item>(item)
|
|
31
|
-
const newItem = {
|
|
32
|
-
isRemoved: ref(false),
|
|
33
|
-
isNew: ref(true),
|
|
34
|
-
instance,
|
|
35
|
-
meta: createItemMeta(instance)
|
|
36
|
-
} as CollectionItem<Item, Meta>
|
|
37
|
-
items.value.splice(index, 0, newItem)
|
|
38
|
-
triggerRef(items)
|
|
39
|
-
return newItem
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const remove = (index: number, isHardRemove = false) => {
|
|
43
|
-
const item = items.value[index]
|
|
44
|
-
if (item.isNew.value || isHardRemove) {
|
|
45
|
-
items.value.splice(index, 1)
|
|
46
|
-
triggerRef(items)
|
|
47
|
-
} else {
|
|
48
|
-
items.value[index].isRemoved.value = true
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const loadData = (loadedItems: Item[]) => {
|
|
53
|
-
items.value = loadedItems.map((item) => {
|
|
54
|
-
const instance = useTrackedInstance<Item>(item)
|
|
55
|
-
return {
|
|
56
|
-
isNew: ref(false),
|
|
57
|
-
isRemoved: ref(false),
|
|
58
|
-
instance,
|
|
59
|
-
meta: createItemMeta(instance)
|
|
60
|
-
} as CollectionItem<Item, Meta>
|
|
61
|
-
})
|
|
62
|
-
triggerRef(items)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const reset = () => {
|
|
66
|
-
items.value = items.value.filter(({isNew}) => !isNew.value)
|
|
67
|
-
for (const item of items.value) {
|
|
68
|
-
item.isRemoved.value = false
|
|
69
|
-
item.instance.reset()
|
|
70
|
-
}
|
|
71
|
-
triggerRef(items)
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
return {
|
|
75
|
-
items,
|
|
76
|
-
isDirty,
|
|
77
|
-
add,
|
|
78
|
-
remove,
|
|
79
|
-
loadData,
|
|
80
|
-
reset
|
|
81
|
-
}
|
|
82
|
-
}
|
package/src/index.ts
DELETED
package/src/tracked-instance.ts
DELETED
|
@@ -1,335 +0,0 @@
|
|
|
1
|
-
import {get, has, set, unset} from 'lodash-es'
|
|
2
|
-
import {computed, customRef, Ref} from 'vue'
|
|
3
|
-
|
|
4
|
-
type DeepPartial<T> = T extends object ? { [P in keyof T]?: DeepPartial<T[P]> } : T
|
|
5
|
-
|
|
6
|
-
export interface TrackedInstance<Data extends Record<string, any>> {
|
|
7
|
-
data: Ref<Data>
|
|
8
|
-
isDirty: Ref<boolean>
|
|
9
|
-
changedData: Ref<DeepPartial<Data>>
|
|
10
|
-
loadData: (newData: DeepPartial<Data>) => void
|
|
11
|
-
reset: () => void
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
interface NestedProxyPathItem {
|
|
15
|
-
target: Record<string, any>
|
|
16
|
-
property: string
|
|
17
|
-
receiver?: Record<string, any>
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const isObject = (value: unknown) =>
|
|
21
|
-
typeof value === 'object' &&
|
|
22
|
-
value !== null &&
|
|
23
|
-
!Array.isArray(value) &&
|
|
24
|
-
!(value instanceof Date) &&
|
|
25
|
-
!(value instanceof File) &&
|
|
26
|
-
!(value instanceof Map) &&
|
|
27
|
-
!(value instanceof Set)
|
|
28
|
-
|
|
29
|
-
const isEmpty = (value: object) => Object.keys(value).length === 0
|
|
30
|
-
|
|
31
|
-
const iterateObject = function* (
|
|
32
|
-
source: Record<string, any>,
|
|
33
|
-
params: {
|
|
34
|
-
// define condition when need to go deep
|
|
35
|
-
goDeepCondition?: (path: string[], value: any) => boolean
|
|
36
|
-
// include parent into separate step when we go deep
|
|
37
|
-
includeParent?: boolean
|
|
38
|
-
} = {}
|
|
39
|
-
) {
|
|
40
|
-
const {goDeepCondition = (_, value) => isObject(value), includeParent = false} = params
|
|
41
|
-
const iterateObjectDeep = function* (path: string[], obj: Record<string, any>): Generator<[string[], any]> {
|
|
42
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
43
|
-
const currentPath = path.concat(key)
|
|
44
|
-
if (goDeepCondition(currentPath, value)) {
|
|
45
|
-
if (includeParent) {
|
|
46
|
-
yield [currentPath, value]
|
|
47
|
-
}
|
|
48
|
-
yield* iterateObjectDeep(currentPath, value)
|
|
49
|
-
} else {
|
|
50
|
-
yield [currentPath, value]
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
yield* iterateObjectDeep([], source)
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const createNestedRef = <Source extends Record<string, any>>(
|
|
59
|
-
source: Source,
|
|
60
|
-
handler: (path: NestedProxyPathItem[]) => ProxyHandler<Source>
|
|
61
|
-
) =>
|
|
62
|
-
customRef<Source>((track, trigger) => {
|
|
63
|
-
// make nested objects and arrays is reactive
|
|
64
|
-
const createProxy = <InnerSource extends Record<string, any>>(
|
|
65
|
-
source: InnerSource,
|
|
66
|
-
path: NestedProxyPathItem[] = []
|
|
67
|
-
): InnerSource => {
|
|
68
|
-
const currentProxyHandler = handler(path) as unknown as ProxyHandler<InnerSource>
|
|
69
|
-
return new Proxy(source, {
|
|
70
|
-
...currentProxyHandler,
|
|
71
|
-
get(target, property: string, receiver) {
|
|
72
|
-
track()
|
|
73
|
-
const result = currentProxyHandler.get
|
|
74
|
-
? currentProxyHandler.get(target, property, receiver)
|
|
75
|
-
: Reflect.get(target, property, receiver)
|
|
76
|
-
|
|
77
|
-
if (isObject(result) || Array.isArray(result)) {
|
|
78
|
-
return createProxy(result, path.concat({target, property, receiver}))
|
|
79
|
-
}
|
|
80
|
-
return result
|
|
81
|
-
},
|
|
82
|
-
set(target, property, value, receiver) {
|
|
83
|
-
const result = currentProxyHandler.set
|
|
84
|
-
? currentProxyHandler.set(target, property, value, receiver)
|
|
85
|
-
: Reflect.set(target, property, value, receiver)
|
|
86
|
-
trigger()
|
|
87
|
-
return result
|
|
88
|
-
},
|
|
89
|
-
deleteProperty(target, property) {
|
|
90
|
-
const result = currentProxyHandler.deleteProperty
|
|
91
|
-
? currentProxyHandler.deleteProperty(target, property)
|
|
92
|
-
: Reflect.deleteProperty(target, property)
|
|
93
|
-
trigger()
|
|
94
|
-
return result
|
|
95
|
-
}
|
|
96
|
-
} as ProxyHandler<InnerSource>)
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
let value = createProxy(source)
|
|
100
|
-
|
|
101
|
-
return {
|
|
102
|
-
get() {
|
|
103
|
-
track()
|
|
104
|
-
return value
|
|
105
|
-
},
|
|
106
|
-
set(newValue: Source) {
|
|
107
|
-
value = createProxy(newValue)
|
|
108
|
-
trigger()
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
// array values in originalData should store in default object to avoid removing items on change length
|
|
114
|
-
class ArrayInOriginalData {
|
|
115
|
-
length: number
|
|
116
|
-
|
|
117
|
-
constructor(length: number) {
|
|
118
|
-
this.length = length
|
|
119
|
-
// length should not include in iterations
|
|
120
|
-
Object.defineProperty(this, 'length', {
|
|
121
|
-
enumerable: false,
|
|
122
|
-
value: length
|
|
123
|
-
})
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
const setOriginalDataValue = (originalData: Record<string, any>, path: Omit<NestedProxyPathItem, 'receiver'>[]) => {
|
|
128
|
-
let originalDataTarget = originalData
|
|
129
|
-
for (const {target: oldValueParent, property} of path.slice(0, -1)) {
|
|
130
|
-
if (property in originalDataTarget) {
|
|
131
|
-
if (isObject(originalDataTarget[property]) || originalDataTarget[property] instanceof ArrayInOriginalData) {
|
|
132
|
-
originalDataTarget = originalDataTarget[property]
|
|
133
|
-
} else {
|
|
134
|
-
// cancel set originalData value because in this case we try to replace primitive value by object or array value
|
|
135
|
-
return
|
|
136
|
-
}
|
|
137
|
-
} else {
|
|
138
|
-
if (Array.isArray(oldValueParent[property])) {
|
|
139
|
-
originalDataTarget = originalDataTarget[property] = new ArrayInOriginalData(oldValueParent[property].length)
|
|
140
|
-
} else if (isObject(oldValueParent[property])) {
|
|
141
|
-
originalDataTarget = originalDataTarget[property] = {}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
const lastItem = path.at(-1)!
|
|
147
|
-
originalDataTarget[lastItem.property] = lastItem.target[lastItem.property]
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
const snapshotValueToOriginalData = (
|
|
151
|
-
originalData: Record<string, any>,
|
|
152
|
-
path: Omit<NestedProxyPathItem, 'receiver'>[],
|
|
153
|
-
value: any
|
|
154
|
-
) => {
|
|
155
|
-
const pathAsString = path.map((i) => i.property)
|
|
156
|
-
const valueInOriginalData = get(originalData, pathAsString)
|
|
157
|
-
|
|
158
|
-
const markRemovedFieldsAsUndefined = (valueInOriginalData?: Record<string, any>, oldValue?: Record<string, any>) => {
|
|
159
|
-
const keysSet = new Set<string>()
|
|
160
|
-
if (valueInOriginalData) {
|
|
161
|
-
for (const key of Object.keys(valueInOriginalData)) {
|
|
162
|
-
keysSet.add(key)
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
if (oldValue) {
|
|
166
|
-
for (const key of Object.keys(oldValue)) {
|
|
167
|
-
keysSet.add(key)
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
const keys = Array.from(keysSet).filter((key) => !Object.keys(value).includes(key))
|
|
171
|
-
for (const key of keys) {
|
|
172
|
-
snapshotValueToOriginalData(
|
|
173
|
-
originalData,
|
|
174
|
-
path.concat({target: oldValue || value, property: key} as Omit<NestedProxyPathItem, 'receiver'>),
|
|
175
|
-
undefined
|
|
176
|
-
)
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
const lastPathItem = path.at(-1)!
|
|
181
|
-
const oldValue = lastPathItem.target[lastPathItem.property]
|
|
182
|
-
if (isObject(value) && (isObject(valueInOriginalData) || isObject(oldValue))) {
|
|
183
|
-
// if value includes in oldValue or originalData need mark removed fields as undefined and recursively run nested objects
|
|
184
|
-
markRemovedFieldsAsUndefined(valueInOriginalData, oldValue)
|
|
185
|
-
for (const key of Object.keys(value)) {
|
|
186
|
-
snapshotValueToOriginalData(originalData, path.concat({target: oldValue || value, property: key}), value[key])
|
|
187
|
-
}
|
|
188
|
-
} else if (Array.isArray(value) && (valueInOriginalData instanceof ArrayInOriginalData || Array.isArray(oldValue))) {
|
|
189
|
-
// do same for arrays
|
|
190
|
-
markRemovedFieldsAsUndefined(valueInOriginalData, oldValue)
|
|
191
|
-
for (const key of value.keys()) {
|
|
192
|
-
snapshotValueToOriginalData(
|
|
193
|
-
originalData,
|
|
194
|
-
path.concat({target: oldValue || value, property: key.toString()}),
|
|
195
|
-
value[key]
|
|
196
|
-
)
|
|
197
|
-
}
|
|
198
|
-
} else {
|
|
199
|
-
// in case value is plain then store it into originalData
|
|
200
|
-
if (!has(originalData, pathAsString)) {
|
|
201
|
-
if (oldValue !== value) {
|
|
202
|
-
setOriginalDataValue(originalData, path)
|
|
203
|
-
}
|
|
204
|
-
} else if (valueInOriginalData === value) {
|
|
205
|
-
unset(originalData, pathAsString)
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
export const useTrackedInstance = <Data extends Record<string, any>>(
|
|
211
|
-
initialData: Partial<Data>
|
|
212
|
-
): TrackedInstance<Data> => {
|
|
213
|
-
type InternalData = { root: Data }
|
|
214
|
-
const _originalData = createNestedRef<DeepPartial<InternalData>>({}, (path) => ({
|
|
215
|
-
deleteProperty(target, property) {
|
|
216
|
-
const result = Reflect.deleteProperty(target, property)
|
|
217
|
-
if (path.length) {
|
|
218
|
-
const parent = path.at(-1)!
|
|
219
|
-
if (isEmpty(target)) {
|
|
220
|
-
delete parent.receiver![parent.property]
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
return result
|
|
224
|
-
}
|
|
225
|
-
}))
|
|
226
|
-
|
|
227
|
-
const _data = createNestedRef<InternalData>({root: initialData} as InternalData, (parentThree) => ({
|
|
228
|
-
set(target, property: string, value, receiver) {
|
|
229
|
-
const path = parentThree.concat({target, property, receiver})
|
|
230
|
-
const oldValue = target[property as keyof typeof target]
|
|
231
|
-
|
|
232
|
-
const triggerChangingArrayItems = () => {
|
|
233
|
-
// in case length in array has changed then emit changing of value by index
|
|
234
|
-
const originalDataValue = get(
|
|
235
|
-
_originalData.value,
|
|
236
|
-
path.map((i) => i.property)
|
|
237
|
-
) as ArrayInOriginalData | undefined
|
|
238
|
-
|
|
239
|
-
const {length: originalDataLength} = originalDataValue || oldValue
|
|
240
|
-
|
|
241
|
-
if (value < originalDataLength) {
|
|
242
|
-
// when removed new value
|
|
243
|
-
for (let i = value; i < originalDataLength; i++) {
|
|
244
|
-
delete receiver[i]
|
|
245
|
-
}
|
|
246
|
-
} else if (originalDataLength < value) {
|
|
247
|
-
// store all removed values as "undefined" when this array values was in data before do some change
|
|
248
|
-
for (let i = originalDataLength; i < value; i++) {
|
|
249
|
-
receiver[i] = undefined
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
if (Array.isArray(target) && property === 'length') {
|
|
255
|
-
if (value !== oldValue) {
|
|
256
|
-
triggerChangingArrayItems()
|
|
257
|
-
}
|
|
258
|
-
} else {
|
|
259
|
-
snapshotValueToOriginalData(_originalData.value, path, value)
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
return Reflect.set(target, property, value, receiver)
|
|
263
|
-
},
|
|
264
|
-
deleteProperty(target, property: keyof typeof target) {
|
|
265
|
-
setOriginalDataValue(_originalData.value, parentThree.concat({target, property} as NestedProxyPathItem))
|
|
266
|
-
return Reflect.deleteProperty(target, property)
|
|
267
|
-
}
|
|
268
|
-
}))
|
|
269
|
-
|
|
270
|
-
const data = computed<Data>({
|
|
271
|
-
get: () => _data.value.root,
|
|
272
|
-
set: (value) => (_data.value.root = value)
|
|
273
|
-
})
|
|
274
|
-
|
|
275
|
-
const isDirty = computed<boolean>(() => Object.keys(_originalData.value).length > 0)
|
|
276
|
-
|
|
277
|
-
const _changedData = computed<DeepPartial<InternalData>>(() => {
|
|
278
|
-
const changedData = {} as DeepPartial<InternalData>
|
|
279
|
-
const originalDataIterator = iterateObject(_originalData.value, {
|
|
280
|
-
goDeepCondition: (path, value) => {
|
|
281
|
-
/*
|
|
282
|
-
* iterate over originalData
|
|
283
|
-
* but avoid going deep in case
|
|
284
|
-
* when value in data have different data type
|
|
285
|
-
* of same value in originalData
|
|
286
|
-
*/
|
|
287
|
-
const valueInData = get(_data.value, path)
|
|
288
|
-
const isBothValuesAsArray = value instanceof ArrayInOriginalData && Array.isArray(valueInData)
|
|
289
|
-
const isBothValuesAsObject = isObject(value) && isObject(valueInData)
|
|
290
|
-
return isBothValuesAsObject || isBothValuesAsArray
|
|
291
|
-
}
|
|
292
|
-
})
|
|
293
|
-
for (const [path] of originalDataIterator) {
|
|
294
|
-
const valueInData = get(_data.value, path)
|
|
295
|
-
set(changedData, path, valueInData)
|
|
296
|
-
}
|
|
297
|
-
return changedData
|
|
298
|
-
})
|
|
299
|
-
|
|
300
|
-
const changedData = computed(() => _changedData.value.root as DeepPartial<Data>)
|
|
301
|
-
|
|
302
|
-
const loadData = (newData: DeepPartial<Data>) => {
|
|
303
|
-
_data.value = {root: newData} as InternalData
|
|
304
|
-
_originalData.value = {}
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
const reset = () => {
|
|
308
|
-
const updatedData = JSON.parse(JSON.stringify(_data.value))
|
|
309
|
-
|
|
310
|
-
// iterate over originalData including objects to check array values
|
|
311
|
-
for (const [path, value] of iterateObject(_originalData.value, {includeParent: true})) {
|
|
312
|
-
if (value instanceof ArrayInOriginalData) {
|
|
313
|
-
// reset array length in data to remove new items
|
|
314
|
-
set(updatedData, path.concat('length'), value.length)
|
|
315
|
-
} else if (!isObject(value)) {
|
|
316
|
-
if (value === undefined) {
|
|
317
|
-
unset(updatedData, path)
|
|
318
|
-
} else {
|
|
319
|
-
set(updatedData, path, value)
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
_data.value = updatedData
|
|
325
|
-
_originalData.value = {}
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
return {
|
|
329
|
-
data,
|
|
330
|
-
changedData,
|
|
331
|
-
isDirty,
|
|
332
|
-
loadData,
|
|
333
|
-
reset
|
|
334
|
-
}
|
|
335
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|