@webqit/observer
Version:
A simple set of functions for intercepting and observing JavaScript objects and arrays.
3 lines (2 loc) • 17.6 kB
JavaScript
(()=>{var Ie=Object.defineProperty;var be=(t,e)=>{for(var r in e)Ie(t,r,{get:e[r],enumerable:!0})};var xe={};be(xe,{any:()=>Qe,apply:()=>pe,batch:()=>_e,construct:()=>me,defineProperties:()=>et,defineProperty:()=>W,deleteProperties:()=>tt,deleteProperty:()=>K,get:()=>q,getOwnPropertyDescriptor:()=>Z,getOwnPropertyDescriptors:()=>Ye,getPrototypeOf:()=>le,has:()=>ee,intercept:()=>Xe,isExtensible:()=>ce,map:()=>Ze,observe:()=>ge,ownKeys:()=>ae,path:()=>He,preventExtensions:()=>de,reduce:()=>ye,set:()=>F,setPrototypeOf:()=>he,subtree:()=>Je});function O(t){return!Array.isArray(t)&&typeof t=="object"&&t}function L(t){return typeof t}function T(t){return Array.isArray(t)}function k(t){return typeof t=="function"}function te(t){return t===null||t===""}function N(t){return arguments.length&&(t===void 0||typeof t>"u")}function v(t){return Array.isArray(t)||typeof t=="object"&&t||k(t)}function re(t){return te(t)||N(t)||t===!1||t===0||v(t)&&!Object.keys(t).length}function D(t){return k(t)||t&&{}.toString.call(t)==="[object function]"}function J(t){return t instanceof String||typeof t=="string"&&t!==null}function ne(t){return!J(t)&&!N(t.length)}function X(t,...e){if(!t||!["object","function"].includes(typeof t))throw new Error("Argument #1 must be of type object");let r=t[Symbol.for("wq")];if(r||(r=new Q,Object.defineProperty(t,Symbol.for("wq"),{value:r,enumerable:!1,configurable:!1,writable:!1})),!e.length)return r;let n,o;for(;n=e.shift();)(o=r)&&!(r=r.get(n))&&(r=new Q,o.set(n,r));return r}var Q=class extends Map{};function R(t,e=!0){return T(t)?t:!e&&O(t)?[t]:t!==!1&&t!==0&&re(t)?[]:ne(t)?Array.prototype.slice.call(t):O(t)?Object.values(t):[t]}var _=(t,...e)=>X(t,"observerAPI",...e),V=(t,e)=>t instanceof Promise?t.then(e):e(t),Y={};var M=class{constructor(e,r){this.registry=e,Object.assign(this,{...r,target:e.target}),this.params.signal&&this.params.signal.addEventListener("abort",()=>this.remove())}remove(){return this.removed=!0,this.registry.removeRegistration(this)}};var $=class extends M{constructor(){super(...arguments),this.emit.currentRegistration=this,Object.defineProperty(this,"abortController",{value:new AbortController}),Object.defineProperty(this,"signal",{value:this.abortController.signal}),Y.setMaxListeners?.(0,this.signal)}remove(){this.abortController.abort(),super.remove()}fire(e){if(this.emit.recursionTarget&&!["inject","force-async","force-sync"].includes(this.params.recursions))return;let r=e,n=this.filter;if(n!==1/0&&(n=R(n,!1))&&(r=e.filter(s=>n.includes(s.key))),this.params.diff&&(r=r.filter(s=>s.type!=="set"||s.value!==s.oldValue)),!r.length)return;if(["inject","defer"].includes(this.params.recursions)){if(this.emit.recursionTarget){this.emit.recursionTarget.push(...r);return}this.emit.recursionTarget=this.params.recursions==="inject"?r:[]}let o=this.filter===1/0||Array.isArray(this.filter)?this.emit(r,this):this.emit(r[0],this);return V(o,s=>{let c=this.emit.recursionTarget;return delete this.emit.recursionTarget,this.params.recursions==="defer"&&c?.length?this.emit.currentRegistration.fire(c):s})}};var C=class{constructor(e){this.target=e,this.entries=[]}addRegistration(e){return this.entries.push(e),e}removeRegistration(e){this.entries=this.entries.filter(r=>r!==e)}static _getInstance(e,r,n=!0,o=this.__namespace){if(!v(r))throw new Error(`Subject must be of type object; "${L(r)}" given!`);let s=this;return o&&_(globalThis,"observerAPI","namespaces").has(e+"-"+o)&&(s=_(globalThis,"observerAPI","namespaces").get(e+"-"+o),e+="-"+o),!_(r,"registry").has(e)&&n&&_(r,"registry").set(e,new s(r)),_(r,"registry").get(e)}static _namespace(e,r,n=null){if(e+="-"+r,arguments.length===2)return _(globalThis,"observerAPI","namespaces").get(e);if(!(n.prototype instanceof this))throw new Error(`The implementation of the namespace ${this.name}.${r} must be a subclass of ${this.name}.`);_(globalThis,"observerAPI","namespaces").set(e,n),n.__namespace=r}};var w=class{constructor(e,r){if(this.target=e,!r.operation)throw new Error("Descriptor operation must be given in definition!");Object.assign(this,r)}get[Symbol.toStringTag](){return"Descriptor"}static[Symbol.hasInstance](e){return e?.[Symbol.toStringTag]==="Descriptor"&&e.operation}};var I=class extends C{static getInstance(e,r=!0,n=null){return super._getInstance("listeners",...arguments)}static namespace(e,r=null){return super._namespace("listeners",...arguments)}constructor(e){super(e),this.batches=[]}addRegistration(e,r,n){return super.addRegistration(new $(this,{filter:e,emit:r,params:n}))}emit(e,{eventsArePropertyDescriptors:r=!1,eventIsArrayMethodDescriptor:n=!1}={}){if(this.batches.length){let o=this.batches[0].params.arrayMethodName;this.batches[0].snapshots.push({events:[...e],arrayMethodName:o,eventsArePropertyDescriptors:r,eventIsArrayMethodDescriptor:n});return}this.$emit(this.entries,[{events:e,eventsArePropertyDescriptors:r,eventIsArrayMethodDescriptor:n}])}$emit(e,r){let n=0,o=0,s=0;for(let l of e)n+=1,l.params.withPropertyDescriptors&&(o+=1),l.params.withArrayMethodDescriptors&&(s+=1);let c=[],f=[],u=[],i=[];for(let l of r){let a=l.arrayMethodName,h=l.eventsArePropertyDescriptors,x=l.eventIsArrayMethodDescriptor;for(let m of l.events)if(a&&(m.operation=a),o&&(s&&c.push(m),x||s!==n&&f.push(m)),o!==n){let b=m;if(h){let{target:g,type:y,...d}=m;b=new w(g,{type:"set",...d}),Object.defineProperty(b,"value","get"in d.value?{get:()=>d.value.get()}:{value:d.value.value}),d.oldValue&&Object.defineProperty(b,"oldValue","get"in d.oldValue?{get:()=>d.oldValue.get()}:{value:d.oldValue.value})}s&&u.push(b),x||s!==n&&i.push(b)}}for(let l of e)l.params.withPropertyDescriptors?l.params.withArrayMethodDescriptors?c.length&&l.fire(c):f.length&&l.fire(f):l.params.withArrayMethodDescriptors?u.length&&l.fire(u):i.length&&l.fire(i)}batch(e,r={}){this.batches.unshift({entries:[...this.entries],snapshots:[],params:r});let n=e();return V(n,o=>{let s=this.batches.shift();return s.snapshots.length&&this.$emit(s.entries,s.snapshots),o})}};var B=class extends M{exec(e,r,n){return this.running||!this.traps[e.operation]?r(...Array.prototype.slice.call(arguments,2)):(this.running=!0,this.traps[e.operation](e,n,(...o)=>(this.running=!1,r(...o))))}};var j=class extends C{static getInstance(e,r=!0,n=null){return super._getInstance("traps",...arguments)}static namespace(e,r=null){return super._namespace("traps",...arguments)}addRegistration(e){return super.addRegistration(new B(this,e))}emit(e,r=null){let n=this;return function o(s,...c){let f=n.entries[s];return f?f.exec(e,(...u)=>o(s+1,...u),...c):r?r(e,...c):c[0]}(0)}};var ue={};be(ue,{accessorize:()=>Ke,proxy:()=>se,unaccessorize:()=>Ge,unproxy:()=>U});var Te=Symbol("wqOriginal");function Ke(t,e,r={}){t=fe(t);let n=_(t,"accessorizedProps");function o(u){let i,l=t;do i=Object.getOwnPropertyDescriptor(l,u);while(!i&&(l=Object.getPrototypeOf(l)));return i?{proto:l,descriptor:i}:{descriptor:{value:void 0,configurable:!0,enumerable:!0,writable:!0}}}function s(u){if(n.has(u+""))return!0;let i=o(u);i.getValue=function(h=!1){return h?this.descriptor:this.descriptor.get?this.descriptor.get():this.descriptor.value},i.setValue=function(h,x=!1){if(this.dirty=!0,x){this.descriptor=h;return}return this.descriptor.set?this.descriptor.set(h)!==!1:(this.descriptor.value=h,!0)},i.intact=function(){let h=Object.getOwnPropertyDescriptor(t,u);return h?.get===a.get&&h?.set===a.set&&n.get(u+"")===this},i.restore=function(){return this.intact()?(this.proto&&this.proto!==t||!this.proto&&!this.dirty?delete t[u]:Object.defineProperty(t,u,this.descriptor),n.delete(u+""),!0):!1},n.set(isNaN(u)?u:parseInt(u),i);let{enumerable:l=!0}=i.descriptor,a={enumerable:l,configurable:!0};("value"in i.descriptor||i.descriptor.set)&&(a.set=function(h){return F(this,u,h,r)}),("value"in i.descriptor||i.descriptor.get)&&(a.get=function(){return q(this,u,r)});try{return Object.defineProperty(t,u,a),!0}catch{return n.delete(u+""),!1}}let f=(Array.isArray(e)?e:e===void 0?Object.keys(t):[e]).map(s);return e===void 0||Array.isArray(e)?f:f[0]}function Ge(t,e,r={}){t=fe(t);let n=_(t,"accessorizedProps");function o(f){return n.has(f+"")?n.get(f+"").restore():!0}let c=(Array.isArray(e)?e:e===void 0?Object.keys(t):[e]).map(o);return e===void 0||Array.isArray(e)?c:c[0]}function se(t,e={},r=void 0){let n=fe(t);if(typeof e.membrane=="boolean")throw new Error("The params.membrane parameter cannot be of type boolean.");if(e.membrane&&_(n,"membraneRef").has(e.membrane))return _(n,"membraneRef").get(e.membrane);let o={apply:(f,u,i)=>pe(f,u,i,void 0,e),construct:(f,u,i=null)=>me(f,u,i,e),defineProperty:(f,u,i)=>W(f,u,i,e),deleteProperty:(f,u)=>K(f,u,e),get:(f,u,i=null)=>{if(u===Te)return n;let l={...e,receiver:i},a=q(f,u,l);return Array.isArray(f)&&typeof a=="function"&&!/^class\s?/.test(Function.prototype.toString.call(a))?se(a,{...e,arrayMethodName:u,membrane:i},r):e.chainable&&v(a)&&u!=="prototype"&&!(typeof a=="function"&&/^class\s?|\{\s\[native\scode\]\s\}$/.test(Function.prototype.toString.call(a)))?se(a,e,r):a},getOwnPropertyDescriptor:(f,u)=>Z(f,u,e),getPrototypeOf:f=>le(f,e),has:(f,u)=>ee(f,u,e),isExtensible:f=>ce(f,e),ownKeys:f=>ae(f,e),preventExtensions:f=>de(f,e),set:(f,u,i,l=null)=>F(f,u,i,{...e,receiver:l}),setPrototypeOf:(f,u)=>he(f,u,e)},s=r?.(o)||o,c=new Proxy(n,s);return e.membrane&&_(n,"membraneRef").set(e.membrane,c),c}function U(t){return t&&t[Te]||t}function fe(t){if(!t||!v(t))throw new Error("Target must be of type object!");return U(t)}var G=class extends Array{get[Symbol.toStringTag](){return"Path"}static[Symbol.hasInstance](e){return Array.isArray(e)&&e[Symbol.toStringTag]==="Path"}};function He(...t){return new G(...t)}var z=class extends Array{get[Symbol.toStringTag](){return"Subtree"}static[Symbol.hasInstance](e){return Array.isArray(e)&&e[Symbol.toStringTag]==="Subtree"}};function Je(){return new z}function Qe(){return 1/0}function ye(t,e,r,n=s=>s,o={}){let s=e instanceof z;if(!(!s&&!e?.length))return function c(f,u,i,l){let a=l||u[i.level]instanceof z,h=a?1/0:u[i.level],x=a?!1:i.level===u.length-1;return f instanceof w&&f.operation!=="get"?i={...i,probe:"always"}:i.probe!=="always"&&(i={...i,probe:!x}),r(f,h,(m,...b)=>{let g=p=>{p instanceof w&&(p.path="key"in p?[p.key]:[],f instanceof w&&(p.path="key"in p?f.path.concat(p.key):f.path.slice(0),Object.defineProperty(p,"context",{get:()=>f,configurable:!0})))},y=b[0]||{},d=p=>{if(p instanceof w&&"argumentsList"in p)return;let A=S(p,!1);return V(A,P=>(p instanceof w?p.value=P:p=P,c(p,u,{...i,...y,keyInParent:p.key,level:i.level+1},a)))};if(H(h)&&Array.isArray(m)){if(m.forEach(g),x)return n(m,...b);a&&m[0]instanceof w&&(m[0].operation!=="get"||o.asGet)&&n(m,...b);for(let p of m)d(p);return}return g(m),x?n(m,...b):d(m)},i)}(t,e.slice(0),{...o,level:0},s)}function ge(t,e,r,n={}){let o=S(t,!n.level);if(D(arguments[1])&&([,r,n={}]=arguments,e=1/0),!D(r))throw new Error(`Handler must be a function; "${L(r)}" given!`);if(e instanceof G||e instanceof z)return ye(o,e,ge,r,n);if(n={...n,descripted:!0},delete n.live,!v(o))return n.probe&&q(o,e,r,n)||void 0;let s=Ee(o,e,r,n);return n.probe?q(o,e,s,n):s()}function Xe(t,e,r={}){let n=S(t);return O(e)||([,,,r={}]=arguments,e={[arguments[1]]:arguments[2]}),j.getInstance(n,!0,r.namespace).addRegistration({traps:e,params:r})}function Z(t,e,r=o=>o,n={}){return E(t,"getOwnPropertyDescriptor",{key:e},r,n)}function Ye(t,e,r=o=>o,n={}){return E(t,"getOwnPropertyDescriptors",{key:e},r,n)}function le(t,e=n=>n,r={}){return E(t,"getPrototypeOf",{},e,r)}function ce(t,e=n=>n,r={}){return E(t,"isExtensible",{},e,r)}function ae(t,e=n=>n,r={}){return E(t,"ownKeys",{},e,r)}function ee(t,e,r=o=>o,n={}){return E(t,"has",{key:e},r,n)}function q(t,e,r=o=>o,n={}){let o,s=S(t,!n.level);return O(r)?[n,r]=[r,c=>c]:n.live&&(o=!0),e instanceof G||e instanceof z?ye(s,e,q,r,{...n,asGet:!0}):rt(s,e,c=>{let f=[...c];return function u(i,l,a){if(!l.length)return a(i);let h=l.shift();if(!["string","number","symbol"].includes(typeof h))throw new Error(`Property name/key ${h} invalid.`);function x(g,y=void 0){let d=P=>(g.value=P,u([...i,n.live||n.descripted?g:P],l,a));if(arguments.length>1)return d(y);if(!v(s))return d(s?.[g.key]);let p=_(s,"accessorizedProps",!1),A=p&&p.get(g.key);if(A&&A.intact())return d(A.getValue(n.withPropertyDescriptors));if(n.withPropertyDescriptors){let P=Object.getOwnPropertyDescriptor(s,g.key);return d(P)}return d(Reflect.get(s,g.key))}let m=new w(s,{type:"get",key:h,value:void 0,operation:"get",related:f});if(!v(s))return x(m);let b=j.getInstance(s,!1,n.namespace);return b?b.emit(m,x):x(m)}([],c.slice(0),u=>{let i=H(e)?u:u[0];return o&&v(s)?Ee(s,e,r,n,t.key)(i):r(i)})},n)}function _e(t,e,r={}){let n=S(t);return I.getInstance(n,!0,r.namespace).batch(e,r)}function Ze(t,e,r={}){e=S(e),t=S(t);let n=(r.only||[]).slice(0),o=(r.except||[]).slice(0),s=Object.keys(r.spread?[...t]:t).map(i=>isNaN(i)?i:parseInt(i)),c=n.length?n.filter(i=>s.includes(i)):s.filter(i=>!o.includes(i)),f=i=>!Array.isArray(e)||isNaN(i)?i:i-o.filter(l=>l<i).length,u=i=>{let l=Z(t,i,r);"value"in l&&l.writable&&l.enumerable&&l.configurable?F(e,f(i),l.value,r):(l.enumerable||r.onlyEnumerable===!1)&&W(e,i,{...l,configurable:!0},r)};return _e(e,()=>{c.forEach(u)}),ge(t,i=>{i.filter(l=>n.length?n.includes(l.key):!o.includes(l.key)).forEach(l=>{if(l.type==="delete")return K(e,f(l.key),r);if(l.type==="def"){(l.value.enumerable||r.onlyEnumerable===!1)&&W(e,f(l.key),{...l.value,configurable:!0},r);return}u(l.key)})},{...r,withPropertyDescriptors:!0})}function F(t,e,r,n=c=>c,o={},s=!1){let c=S(t),f=[[e,r]];O(e)&&([,,n=i=>i,o={},s=!1]=arguments,f=Object.entries(e)),O(n)&&([s,o,n]=[typeof o=="boolean"?o:s,n,i=>i]);let u=f.map(([i])=>i);return function i(l,a,h){if(!a.length)return h(l);let[x,m]=a.shift();function b(y,d=void 0){let p=De=>(y.status=De,i(l.concat(y),a,h));if(arguments.length>1)return p(y,d);let A=_(c,"accessorizedProps",!1),P=A&&A.get(y.key);return y.type==="def"?(P&&!P.restore()&&p(!1),Object.defineProperty(c,y.key,y.value),p(!0)):P&&P.intact()?p(P.setValue(y.value)):p(Reflect.set(c,y.key,y.value))}function g(y,d){if(o.diff&&m===d)return i(l,a,h);let p=new w(c,{type:s?"def":"set",key:x,value:m,isUpdate:y,oldValue:d,related:[...u],operation:s?"defineProperty":"set",detail:o.detail}),A=j.getInstance(c,!1,o.namespace);return A?A.emit(p,b):b(p)}return ee(c,x,y=>{if(!y)return g(y);if(x==="length"&&Array.isArray(c)&&_(c).has("$length"))return g(!0,_(c).get("$length"));let d={...o,withPropertyDescriptors:s};return q(c,x,p=>g(y,p),d)},o)}([],f.slice(0),i=>{let l=I.getInstance(c,!1,o.namespace);return l&&l.emit(i,{eventsArePropertyDescriptors:!!s}),n(H(e)?i.map(a=>a.status):i[0]?.status)})}function W(t,e,r,n=s=>s,o={}){return F(t,e,r,n,o,!0)}function et(t,e,r=o=>o,n={}){return F(t,e,r,n,!0)}function K(t,e,r=o=>o,n={}){let o=S(t);O(r)&&([n,r]=[r,f=>f]);let s=R(e,!1),c=[...s];return function f(u,i,l){if(!i.length)return l(u);let a=i.shift();function h(m,b=void 0){let g=p=>(m.status=p,f(u.concat(m),i,l));if(arguments.length>1)return g(m,b);let y=_(o,"accessorizedProps",!1),d=y&&y.get(m.key);return d&&!d.restore()&&g(!1),g(Reflect.deleteProperty(o,m.key))}function x(m){let b=new w(o,{type:"delete",key:a,oldValue:m,related:[...c],operation:"deleteProperty",detail:n.detail}),g=j.getInstance(o,!1,n.namespace);return g?g.emit(b,h):h(b)}return q(o,a,x,n)}([],s.slice(0),f=>{let u=I.getInstance(o,!1,n.namespace);return u&&u.emit(f),r(H(e)?f.map(i=>i.status):f[0].status)})}function tt(t,e,r=o=>o,n={}){return K(...arguments)}function me(t,e,r=null,n=s=>s,o={}){return E(t,"construct",arguments.length>2?{argumentsList:e,newTarget:r}:{argumentsList:e},n,o)}function pe(t,e,r,n=s=>s,o={}){let s=U(e),c;if(Array.isArray(e)){if(o.arrayMethodName){let f=new w(s,{operation:o.arrayMethodName,argumentsList:r});I.getInstance(s,!1,o.namespace)?.emit([f],{eventIsArrayMethodDescriptor:!0})}_(s).set("$length",s.length),c=_e(s,()=>E(t,"apply",{thisArgument:e,argumentsList:r},n,o),o),_(s).delete("$length")}else c=E(t,"apply",{thisArgument:s,argumentsList:r},n,o);return c}function he(t,e,r=o=>o,n={}){return E(t,"setPrototypeOf",{proto:e},r,n)}function de(t,e=n=>n,r={}){return E(t,"preventExtensions",{},e,r)}function Ee(t,e,r,n={}){let o=new AbortController;Y.setMaxListeners?.(0,o.signal),n.signal&&n.signal.addEventListener("abort",()=>o.abort());let s={...n,signal:o.signal},c=I.getInstance(t,!0,s.namespace),f=new Map;return function u(i=[],l=null){let a,h,x;if(H(e)){if(l){x=!0,h=l;for(let m of i)f.get(m.key)?.remove(),f.delete(m.key)}else h=c.addRegistration(e,u,s);a={signal:h.signal,childRegistrations:f}}else l?.remove(),h=c.addRegistration(e,u,s),a={signal:h.signal};if(s.childRegistrations&&s.keyInParent&&s.childRegistrations.set(s.keyInParent,h),arguments.length){let m=r(i,a);if(arguments.length>1)return m}return o}}function E(t,e,r={},n=s=>s,o={}){t=S(t),O(n)&&([o,n]=[n,u=>u]);function s(u,i){return arguments.length>1?n(i):n((Reflect[e]||Object[e])(t,...Object.values(r)))}let c=new w(t,{operation:e,...r}),f=j.getInstance(t,!1,o.namespace);return f?f.emit(c,s):s(c)}function H(t){return t===1/0||Array.isArray(t)}function S(t,e=!0,r=!0){if((!t||!v(t))&&e)throw new Error(`Object must be of type object or array! "${L(t)}" given.`);return t instanceof w&&(t.type==="def"&&r?t=typeof t.value.get=="function"?t.value.get():t.value.value:t=t.value),t&&U(t)}function rt(t,e,r,n={}){return e===1/0?n.level&&!v(t)?r([]):r(Object.entries(Object.getOwnPropertyDescriptors(t)).filter(([,o])=>o.writable!==!1&&!o.get&&!o.set).map(([o])=>o)):r(R(e,!1))}var Se={...xe,...ue};window.webqit||(window.webqit={});window.webqit.Observer=Se;})();
//# sourceMappingURL=main.js.map