UNPKG

tracked-instance

Version:
2 lines (1 loc) 6.53 kB
import{computed as N}from"vue";import{computed as C,customRef as M,shallowRef as V,triggerRef as q}from"vue";var k=a=>typeof a=="object"&&a!==null&&!Array.isArray(a)&&!(a instanceof Date)&&!(typeof File<"u"&&a instanceof File)&&!(a instanceof Map)&&!(a instanceof Set),h=a=>{if(a===null||typeof a!="object")return a;if(a instanceof Date)return new Date(a.getTime());if(Array.isArray(a))return a.map(h);let t=Object.getPrototypeOf(a);if(t!==Object.prototype&&t!==null)return a;let e={};for(let n of Object.keys(a))e[n]=h(a[n]);return e};var S=(a,t)=>Object.prototype.hasOwnProperty.call(a,t),E=a=>/^(?:0|[1-9]\d*)$/.test(a);function L(a,t){let e=a;for(let n of t){if(e==null)return;e=e[n]}return e}function w(a,t,e,n){if(t.length===0)return;let r=a;for(let o=0;o<t.length-1;o++){let s=t[o],i=r[s];(i==null||typeof i!="object")&&(r[s]=n?n(t.slice(0,o+1)):E(t[o+1])?[]:{}),r=r[s]}r[t[t.length-1]]=e}function F(a,t){if(t.length===0)return!1;let e=a;for(let n=0;n<t.length-1;n++){if(e==null||typeof e!="object")return!0;e=e[t[n]]}return e==null||typeof e!="object"?!0:delete e[t[t.length-1]]}var m=class{constructor(t,e=0){this.kind=t;this.length=e}kind;length;_entries={};has(t){return S(this._entries,t)}get(t){return this._entries[t]}set(t,e){this._entries[t]=e}delete(t){delete this._entries[t]}entries(){return Object.entries(this._entries)}isEmpty(){return Object.keys(this._entries).length===0}},b=a=>a instanceof m;function P(a){if(Array.isArray(a)){let t=new m("array",a.length);for(let e=0;e<a.length;e++)t.set(String(e),P(a[e]));return t}if(k(a)){let t=new m("object");for(let[e,n]of Object.entries(a))t.set(e,P(n));return t}return a}function x(a,t){if(t.length===0)return{found:!0,value:a};let e=a;for(let r=0;r<t.length-1;r++){let o=e.get(t[r]);if(!b(o))return{found:!1,value:void 0};e=o}let n=t[t.length-1];return e.has(n)?{found:!0,value:e.get(n)}:{found:!1,value:void 0}}function K(a,t){if(t.length===0)return;let e=[a],n=a;for(let r=0;r<t.length-1;r++){let o=n.get(t[r]);if(!b(o))return;e.push(o),n=o}n.delete(t[t.length-1]);for(let r=e.length-1;r>=1&&e[r].isEmpty();r--)e[r-1].delete(t[r-1])}function j(a,t){let e=(n,r)=>{for(let[o,s]of r.entries()){let i=n.concat(o);b(s)?t.visitContainer(i,s)&&e(i,s):t.visitLeaf(i,s)}};e([],a)}var _=class{_store=new m("object");_equals;constructor(t={}){this._equals=t.equals}_setStoreValue(t){let e=this._store;for(let{target:r,property:o}of t.slice(0,-1))if(e.has(o)){let s=e.get(o);if(b(s))e=s;else return}else if(Array.isArray(r[o])){let s=new m("array",r[o].length);e.set(o,s),e=s}else if(k(r[o])){let s=new m("object");e.set(o,s),e=s}let n=t.at(-1);e.set(n.property,P(n.target[n.property]))}_markMissingKeysAsRemoved(t,e,n,r){let o=new Set(Object.keys(e)),s=new Set;if(n)for(let[i]of n.entries())s.add(i);if(r)for(let i of Object.keys(r))s.add(i);for(let i of s)o.has(i)||this._recordLeaf(t.concat({target:r||e,property:i}),void 0)}_recordContainerMutation(t,e,n,r){this._markMissingKeysAsRemoved(t,e,r,n);let o=Array.isArray(e)?e.map((s,i)=>String(i)):Object.keys(e);for(let s of o)this.record(t.concat({target:n||e,property:s}),e[s])}_recordLeaf(t,e){let n=t.map(y=>y.property),{found:r,value:o}=x(this._store,n),s=t.at(-1),i=s.target[s.property];r?(this._equals?this._equals(o,e):o===e)&&K(this._store,n):(this._equals?this._equals(i,e):i===e)||this._setStoreValue(t)}record(t,e){let n=t.map(y=>y.property),{value:r}=x(this._store,n),o=t.at(-1),s=o.target[o.property],i=b(r)?r:void 0;k(e)&&(i?.kind==="object"||k(s))?this._recordContainerMutation(t,e,s,i):Array.isArray(e)&&(i?.kind==="array"||Array.isArray(s))?this._recordContainerMutation(t,e,s,i):this._recordLeaf(t,e)}isEmpty(){return this._store.isEmpty()}_containerForPrefix=t=>{let{value:e}=x(this._store,t);return b(e)&&e.kind==="array"?[]:{}};projectDiff(t){let e={},n=this._containerForPrefix;return j(this._store,{visitContainer(r,o){let s=L(t,r),i=o.kind==="object"&&k(s),y=o.kind==="array"&&Array.isArray(s);return i||y?!0:(w(e,r,s,n),!1)},visitLeaf(r,o){w(e,r,L(t,r),n)}}),e}applyReverse(t){let e=h(t),n=this._containerForPrefix;return j(this._store,{visitContainer(r,o){let s=L(e,r);if(o.kind==="array")if(Array.isArray(s))s.length=o.length;else{let i=[];i.length=o.length,w(e,r,i,n)}else k(s)||w(e,r,{},n);return!0},visitLeaf(r,o){o===void 0?F(e,r):w(e,r,o,n)}}),e}clear(){this._store=new m("object")}},B=(a,t)=>{let e=a;return{dataRef:M((r,o)=>{let s=new WeakMap,i=(I,d=[],f="")=>new Proxy(I,{get(c,l,g){r();let u=Reflect.get(c,l,g);if(typeof l=="symbol")return u;if(k(u)||Array.isArray(u)){let R=f+"\0"+l,D=s.get(u);if(D&&D.pathKey===R)return D.proxy;let v=i(u,d.concat({target:c,property:l}),R);return s.set(u,{proxy:v,pathKey:R}),v}return u},set(c,l,g,u){if(typeof l=="symbol"){let p=Reflect.set(c,l,g,u);return o(),p}let R=d.concat({target:c,property:l}),D=c[l];if(Array.isArray(c)&&l==="length"){if(g!==D)if(g<D)for(let p=g;p<D;p++)delete u[p];else for(let p=D;p<g;p++)u[p]=void 0}else t(R,g);let v=Reflect.set(c,l,h(g),u);return o(),v},deleteProperty(c,l){if(typeof l=="symbol"){let R=Reflect.deleteProperty(c,l);return o(),R}let g=d.concat({target:c,property:l});t(g,void 0);let u=Reflect.deleteProperty(c,l);return o(),u}}),y=i(a);return{get(){return r(),y},set(I){e=I,y=i(I),o()}}}),getRaw:()=>e}},T=(a,t={})=>{let e=new _(t),n=V(e),r=()=>q(n),{dataRef:o,getRaw:s}=B(h(a),(f,c)=>{e.record(f,c),r()}),i=C(()=>!n.value.isEmpty()),y=C(()=>n.value.projectDiff(s()));return{dataRef:o,isDirty:i,changedData:y,loadData:f=>{o.value=h(f),e.clear(),r()},reset:()=>{o.value=e.applyReverse(s()),e.clear(),r()}}};function A(a,t){let e=T({root:a},t),n=N({get:()=>e.dataRef.value.root,set:s=>e.dataRef.value.root=s}),r=N(()=>e.changedData.value.root),o=s=>{e.loadData({root:s})};return{data:n,isDirty:e.isDirty,changedData:r,loadData:o,reset:e.reset}}import{computed as H,markRaw as W,ref as O}from"vue";var $=a=>{let{createItemMeta:t=()=>{},...e}=a??{},n=O([]),r=H(()=>n.value.some(({instance:d,isRemoved:f,isNew:c})=>d.isDirty.value||c.value||f.value)),o=(d,f)=>{let c=A(d,e),l=W({isRemoved:O(!1),isNew:O(f),instance:c,meta:t(c),remove:(g=!1)=>{let u=n.value.indexOf(l);i(u,g)}});return l},s=(d,f=n.value.length)=>{let c=o(d,!0);return n.value.splice(f,0,c),c},i=(d,f=!1)=>{let c=n.value[d];c&&(c.isNew.value||f?n.value.splice(d,1):c.isRemoved.value=!0)};return{items:n,isDirty:r,add:s,remove:i,loadData:d=>{n.value=d.map(f=>o(f,!1))},reset:()=>{n.value=n.value.filter(({isNew:d})=>!d.value);for(let d of n.value)d.isRemoved.value=!1,d.instance.reset()}}};export{$ as useCollection,A as useTrackedInstance};