New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@webqit/observer

Package Overview
Dependencies
Maintainers
1
Versions
90
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@webqit/observer - npm Package Compare versions

Comparing version 2.0.7 to 2.1.0

2

dist/main.js

@@ -1,2 +0,2 @@

(()=>{var we=Object.defineProperty;var de=(e,t)=>{for(var n in t)we(e,n,{get:t[n],enumerable:!0})};var pe={};de(pe,{apply:()=>ce,batch:()=>We,construct:()=>le,deep:()=>Me,defineProperties:()=>Ke,defineProperty:()=>se,deleteProperty:()=>ue,get:()=>N,getOwnPropertyDescriptor:()=>oe,getOwnPropertyDescriptors:()=>ke,getPrototypeOf:()=>ie,has:()=>H,intercept:()=>Ve,isExtensible:()=>fe,observe:()=>$e,ownKeys:()=>K,preventExtensions:()=>ae,set:()=>B,setPrototypeOf:()=>me});function y(e){return!Array.isArray(e)&&typeof e=="object"&&e}function D(e){return typeof e}function b(e){return Array.isArray(e)}function J(e,t,n=null){return b(t)?e.filter(r=>n?t.filter(o=>n(r,o)).length:t.indexOf(r)!==-1):[]}function V(e,...t){if(globalThis.webqit||(globalThis.webqit={}),globalThis.webqit.refs||Object.defineProperty(globalThis.webqit,"refs",{value:new L}),!arguments.length)return globalThis.webqit.refs;let n=globalThis.webqit.refs.get(e);n||(n=new L,globalThis.webqit.refs.set(e,n));let r,o;for(;r=t.shift();)(o=n)&&!(n=n.get(r))&&(n=new L,o.set(r,n));return n}var L=class extends Map{constructor(...t){super(...t),this.observers=new Set}set(t,n){let r=super.set(t,n);return this.fire("set",t,n,t),r}delete(t){let n=super.delete(t);return this.fire("delete",t),n}has(t){return this.fire("has",t),super.has(t)}get(t){return this.fire("get",t),super.get(t)}keyNames(){return Array.from(super.keys())}observe(t,n,r){let o={type:t,key:n,callback:r};return this.observers.add(o),()=>this.observers.delete(o)}unobserve(t,n,r){if(Array.isArray(t)||Array.isArray(n))throw new Error('The "type" and "key" arguments can only be strings.');for(let o of this.observers)$([t,"*"],o.type)&&$([n,"*"],o.key)&&o.callback===r&&this.observers.delete(o)}fire(t,n,...r){for(let o of this.observers)$([t,"*"],o.type)&&$([n,"*"],o.key)&&o.callback(...r)}},$=(e,t)=>Array.isArray(t)?J(e,t).length:e.includes(t);function C(e){return typeof e=="function"}function Q(e){return C(e)&&/^class\s?/.test(Function.prototype.toString.call(e))}function X(e){return e===null||e===""}function S(e){return arguments.length&&(e===void 0||typeof e>"u")}function v(e){return Array.isArray(e)||typeof e=="object"&&e||C(e)}function Y(e){return X(e)||S(e)||e===!1||e===0||v(e)&&!Object.keys(e).length}function w(e){return C(e)||e&&{}.toString.call(e)==="[object function]"}function k(e){return e instanceof String||typeof e=="string"&&e!==null}function Z(e){return!k(e)&&!S(e.length)}function I(e,t=!0){return b(e)?e:!t&&y(e)?[e]:e!==!1&&e!==0&&Y(e)?[]:Z(e)?Array.prototype.slice.call(e):y(e)?Object.values(e):[e]}var R=class{constructor(t,n){this.registry=t,Object.assign(this,{...n,target:t.target}),this.params.signal&&this.params.signal.addEventListener("abort",()=>this.remove())}remove(){return this.removed=!0,this.registry.removeRegistration(this)}};var U=class extends R{constructor(){super(...arguments),Object.defineProperty(this,"abortController",{value:new AbortController}),Object.defineProperty(this,"signal",{value:this.abortController.signal})}remove(){this.abortController.abort(),super.remove()}fire(t){let n=t,r=this.filter;if(r!==1/0&&(r=I(r))&&(n=t.filter(o=>r.includes(o.key))),this.params.diff&&(n=n.filter(o=>o.type!=="set"||o.value!==o.oldValue)),n.length)return this.filter===1/0||Array.isArray(this.filter)?this.handler(n,this):this.handler(n[0],this)}};var h=(...e)=>V("observer-api",...e);var F=class{constructor(t){this.target=t,this.entries=[]}addRegistration(t){return this.entries.push(t),t}removeRegistration(t){this.entries=this.entries.filter(n=>n!==t)}static _getInstance(t,n,r=!0,o=this.__namespace){if(!v(n))throw new Error(`Subject must be of type object; "${D(n)}" given!`);let f=this;return o&&h("namespaces").has(t+"-"+o)&&(f=h("namespaces").get(t+"-"+o),t+="-"+o),!h(n,"registry").has(t)&&r&&h(n,"registry").set(t,new f(n)),h(n,"registry").get(t)}static _namespace(t,n,r=null){if(t+="-"+n,arguments.length===2)return h("namespaces").get(t);if(!(r.prototype instanceof this))throw new Error(`The implementation of the namespace ${this.name}.${n} must be a subclass of ${this.name}.`);h("namespaces").set(t,r),r.__namespace=n}};var q=class extends F{static getInstance(t,n=!0,r=null){return super._getInstance("listeners",...arguments)}static namespace(t,n=null){return super._namespace("listeners",...arguments)}constructor(t){super(t),this.batches=[]}addRegistration(t,n,r){return super.addRegistration(new U(this,{filter:t,handler:n,params:r}))}emit(t){if(this.batches.length){this.batches[0].events.push(...t);return}this.entries.forEach(n=>n.fire(t))}batch(t){this.batches.unshift({entries:[...this.entries],events:[]});let n=t(),r=this.batches.shift();return r.events.length&&r.entries.forEach(o=>o.fire(r.events)),n}};var M=class extends R{exec(t,n,r){return this.running||!this.traps[t.type]?n(...Array.prototype.slice.call(arguments,2)):(this.running=!0,this.traps[t.type](t,r,(...o)=>(this.running=!1,n(...o))))}};var T=class extends F{static getInstance(t,n=!0,r=null){return super._getInstance("traps",...arguments)}static namespace(t,n=null){return super._namespace("traps",...arguments)}addRegistration(t){return super.addRegistration(new M(this,t))}emit(t,n=null){let r=this;return function o(f,...s){let l=r.entries[f];return l?l.exec(t,(...i)=>o(f+1,...i),...s):n?n(t,...s):s[0]}(0)}};var P=class{constructor(t,n){if(this.target=t,!n.type)throw new Error("Descriptor type must be given in definition!");Object.assign(this,n)}};var ne={};de(ne,{accessorize:()=>Be,proxy:()=>Ue,unaccessorize:()=>Le,unproxy:()=>W});function Be(e,t,n={}){e=re(e);let r=h(e,"accessorizedProps");function o(i){let u,c=e;for(;!u&&(c=Object.getPrototypeOf(c));)u=Object.getOwnPropertyDescriptor(c,i);return u?{proto:c,descriptor:u}:{descriptor:{value:void 0}}}function f(i){if(r.has(i))return!0;let u=o(i);u.getValue=function(){return"get"in this.descriptor?this.descriptor.get():this.descriptor.value},u.setValue=function(m){return"set"in this.descriptor?this.descriptor.set(m):this.descriptor.value=m},u.intact=function(){let m=Object.getOwnPropertyDescriptor(e,i);return m.get===d.get&&m.set===d.set&&r.get(i)===this},u.restore=function(){return this.intact()?(this.proto!==e?delete e[i]:Object.defineProperty(e,i,this.descriptor),r.delete(i),!0):!1},r.set(i,u);let{enumerable:c=!0,configurable:x=!0}=u.descriptor,d={enumerable:c,configurable:x};["value","set"].some(m=>m in u.descriptor)&&(d.set=function(m){return B(this,i,m,n)}),["value","get"].some(m=>m in u.descriptor)&&(d.get=function(){return N(this,i,n)});try{return Object.defineProperty(e,i,d),!0}catch{return r.delete(i),!1}}let l=(Array.isArray(t)?t:t===void 0?Object.keys(e):[t]).map(f);return t===void 0||Array.isArray(t)?l:l[0]}function Le(e,t,n={}){e=re(e);let r=h(e,"accessorizedProps");function o(l){return r.has(l)?r.get(l).restore():!0}let s=(Array.isArray(t)?t:t===void 0?Object.keys(e):[t]).map(o);return t===void 0||Array.isArray(t)?s:s[0]}function Ue(e,t={}){e=re(e);let n=new Proxy(e,{apply:(r,o,f)=>ce(r,o,f,t),construct:(r,o,f=null)=>le(r,o,f,t),defineProperty:(r,o,f)=>se(r,o,f,t),deleteProperty:(r,o)=>ue(r,o,t),get:(r,o,f=null)=>{let s=N(r,o,{...t,receiver:f});return t.proxyAutoBinding!==!1&&w(s)&&!Q(s)?s.bind(n):s},getOwnPropertyDescriptor:(r,o)=>oe(r,o,t),getPrototypeOf:r=>ie(r,t),has:(r,o)=>H(r,o,t),isExtensible:r=>fe(r,t),ownKeys:r=>K(r,t),preventExtensions:r=>ae(r,t),set:(r,o,f,s=null)=>B(r,o,f,{...t,receiver:s}),setPrototypeOf:(r,o)=>me(r,o,t)});return h(n).set(n,e),n}function W(e){return h(e).get(e)||e}function re(e){if(!e||!v(e))throw new Error("Target must be of type object!");return W(e)}function Me(e,t,n,r=f=>f,o={}){return function f(s,l,i){let u=l[i.level];return i.level<l.length-1?i={...i,preflight:!0}:i={...i,preflight:o.preflight},n(s,u,(c,...x)=>{let d=(a={})=>({...i,...a,level:i.level+1}),m=a=>{a instanceof P&&(a.path=[a.key],s instanceof P&&(a.path=s.path.concat(a.key),a.context=s))};if(G(u)&&Array.isArray(c))return c.forEach(m),i.level===l.length-1||!c.length&&i.midwayResults?r(c,...x):c.map(a=>f(a,l,d(...x)));m(c);let g=v(z(c,!1));return i.level===l.length-1||!g&&i.midwayResults?r(c,...x):g&&f(c,l,d(...x))},i)}(e,t.slice(0),{...o,level:0})}function $e(e,t,n,r={}){if(e=z(e),w(arguments[1])&&([,n,r={}]=arguments,t=1/0),!w(n))throw new Error(`Handler must be a function; "${D(n)}" given!`);let o=Oe(e,t,n,r);return r.preflight?(r={...r,descripted:!0},delete r.live,N(e,t,o,r)):o()}function Ve(e,t,n={}){return e=z(e),y(t)||([,,,n={}]=arguments,t={[arguments[1]]:arguments[2]}),T.getInstance(e,!0,n.namespace).addRegistration({traps:t,params:n})}function oe(e,t,n=o=>o,r={}){return A(e,"getOwnPropertyDescriptor",{key:t},n,r)}function ke(e,t,n=o=>o,r={}){return A(e,"getOwnPropertyDescriptors",{key:t},n,r)}function ie(e,t=r=>r,n={}){return A(e,"getPrototypeOf",{},t,n)}function fe(e,t=r=>r,n={}){return A(e,"isExtensible",{},t,n)}function K(e,t=r=>r,n={}){return A(e,"ownKeys",{},t,n)}function H(e,t,n=o=>o,r={}){return A(e,"has",{key:t},n,r)}function N(e,t,n=o=>o,r={}){let o;return e=z(e),y(n)?[r,n]=[n,f=>f]:r.live&&(o=!0),He(e,t,f=>{let s=[...f];return function l(i,u,c){if(!u.length)return c(i);let x=u.shift();function d(a,p=void 0){let _=j=>(a.value=j,l(i.concat(r.live||r.descripted?a:j),u,c));if(arguments.length>1)return _(p);let O=h(e,"accessorizedProps",!1),E=O&&O.get(a.key);return E&&E.intact()?_(E.getValue()):_(Reflect.get(e,a.key,...r.receiver?[r.receiver]:[]))}let m=new P(e,{type:"get",key:x,value:void 0,related:s}),g=T.getInstance(e,!1,r.namespace);return g?g.emit(m,d):d(m)}([],f.slice(0),l=>{let i=G(t)?l:l[0];return o?Oe(e,t,n,r)(i):n(i)})})}function We(e,t,n={}){return q.getInstance(e,!0,n.namespace).batch(t)}function B(e,t,n,r=s=>s,o={},f=!1){e=z(e);let s=[[t,n]];y(t)&&([,,r=i=>i,o={},f=!1]=arguments,s=Object.entries(t)),y(r)&&([f,o,r]=[typeof o=="boolean"?o:!1,r,i=>i]);let l=s.map(([i])=>i);return function i(u,c,x){if(!c.length)return x(u);let[d,m]=c.shift();function g(p,_=void 0){let O=ve=>(p.status=ve,i(u.concat(p),c,x));if(arguments.length>1)return O(p,_);let E=h(e,"accessorizedProps",!1),j=E&&E.get(p.key);return p.type==="defineProperty"?(j&&!j.restore()&&O(!1),Object.defineProperty(e,p.key,p.value),O(!0)):j&&j.intact()?O(j.setValue(p.value)):O(Reflect.set(e,p.key,p.value))}function a(p,_){if(o.diff&&m===_)return i(u,c,x);let O=new P(e,{type:f?"defineProperty":"set",key:d,value:m,isUpdate:p,oldValue:_,related:[...l],detail:o.detail}),E=T.getInstance(e,!1,o.namespace);return E?E.emit(O,g):g(O)}return H(e,d,p=>p?N(e,d,_=>a(p,_),o):a(p),o)}([],s.slice(0),i=>{let u=q.getInstance(e,!1,o.namespace);return u&&u.emit(i),r(G(t)?i.map(c=>c.status):i[0]?.status)})}function se(e,t,n,r=f=>f,o={}){return B(e,t,n,r,o,!0)}function Ke(e,t,n=o=>o,r={}){return B(e,t,n,r,!0)}function ue(e,t,n=o=>o,r={}){e=z(e),y(n)&&([r,n]=[n,s=>s]);let o=I(t),f=[...o];return function s(l,i,u){if(!i.length)return u(l);let c=i.shift();function x(m,g=void 0){let a=O=>(m.status=O,s(l.concat(m),i,u));if(arguments.length>1)return a(m,g);let p=h(e,"accessorizedProps",!1),_=p&&p.get(m.key);return _&&!_.restore()&&a(!1),a(Reflect.deleteProperty(e,m.key))}function d(m){let g=new P(e,{type:"deleteProperty",key:c,oldValue:m,related:[...f],detail:r.detail}),a=T.getInstance(e,!1,r.namespace);return a?a.emit(g,x):x(g)}return N(e,c,d,r)}([],o.slice(0),s=>{let l=q.getInstance(e,!1,r.namespace);return l&&l.emit(s),n(G(t)?s.map(i=>i.status):s[0].status)})}function le(e,t,n=null,r=f=>f,o={}){return A(e,"construct",arguments.length>2?{argumentsList:t,newTarget:n}:{argumentsList:t},r,o)}function ce(e,t,n,r=f=>f,o={}){return A(e,"apply",{thisArgument:t,argumentsList:n},r,o)}function me(e,t,n=o=>o,r={}){return A(e,"setPrototypeOf",{proto:t},n,r)}function ae(e,t=r=>r,n={}){return A(e,"preventExtensions",{},t,n)}function Oe(e,t,n,r={}){let o;r.signal||(o=new AbortController,r={...r,signal:o.signal});let f=q.getInstance(e,!0,r.namespace);return function s(l,i=null){i?.remove();let c={signal:f.addRegistration(t,s,r).signal};return arguments.length&&n(l,c),o}}function A(e,t,n={},r=f=>f,o={}){e=z(e),y(r)&&([o,r]=[r,i=>i]);function f(i,u){return arguments.length>1?r(u):r(Reflect[t](e,...Object.values(n)))}let s=new P(e,{type:t,...n}),l=T.getInstance(e,!1,o.namespace);return l?l.emit(s,f):f(s)}function G(e){return e===1/0||Array.isArray(e)}function z(e,t=!0){if((!e||!v(e))&&t)throw new Error(`Object must be of type object or array! "${D(e)}" given.`);return e instanceof P&&(e=e.value),e&&W(e)}function He(e,t,n){return t===1/0?K(e,n):n(I(t))}var Ge={...pe,...ne},be=Ge;self.webqit||(self.webqit={});self.webqit.Observer=be;})();
(()=>{var Ae=Object.defineProperty;var ye=(e,t)=>{for(var n in t)Ae(e,n,{get:t[n],enumerable:!0})};var he={};ye(he,{apply:()=>ae,batch:()=>ce,construct:()=>me,deep:()=>We,defineProperties:()=>Ge,defineProperty:()=>le,deleteProperties:()=>Je,deleteProperty:()=>Q,get:()=>C,getOwnPropertyDescriptor:()=>fe,getOwnPropertyDescriptors:()=>He,getPrototypeOf:()=>se,has:()=>J,intercept:()=>Ke,isExtensible:()=>ue,observe:()=>ke,ownKeys:()=>G,preventExtensions:()=>de,set:()=>B,setPrototypeOf:()=>pe});function _(e){return!Array.isArray(e)&&typeof e=="object"&&e}function D(e){return typeof e}function w(e){return Array.isArray(e)}function Y(e,t,n=null){return w(t)?e.filter(r=>n?t.filter(o=>n(r,o)).length:t.indexOf(r)!==-1):[]}function W(e,...t){if(globalThis.webqit||(globalThis.webqit={}),globalThis.webqit.refs||Object.defineProperty(globalThis.webqit,"refs",{value:new L}),!arguments.length)return globalThis.webqit.refs;let n=globalThis.webqit.refs.get(e);n||(n=new L,globalThis.webqit.refs.set(e,n));let r,o;for(;r=t.shift();)(o=n)&&!(n=n.get(r))&&(n=new L,o.set(r,n));return n}var L=class extends Map{constructor(...t){super(...t),this.observers=new Set}set(t,n){let r=super.set(t,n);return this.fire("set",t,n,t),r}delete(t){let n=super.delete(t);return this.fire("delete",t),n}has(t){return this.fire("has",t),super.has(t)}get(t){return this.fire("get",t),super.get(t)}keyNames(){return Array.from(super.keys())}observe(t,n,r){let o={type:t,key:n,callback:r};return this.observers.add(o),()=>this.observers.delete(o)}unobserve(t,n,r){if(Array.isArray(t)||Array.isArray(n))throw new Error('The "type" and "key" arguments can only be strings.');for(let o of this.observers)V([t,"*"],o.type)&&V([n,"*"],o.key)&&o.callback===r&&this.observers.delete(o)}fire(t,n,...r){for(let o of this.observers)V([t,"*"],o.type)&&V([n,"*"],o.key)&&o.callback(...r)}},V=(e,t)=>Array.isArray(t)?Y(e,t).length:e.includes(t);function F(e){return typeof e=="function"}function Z(e){return F(e)&&/^class\s?/.test(Function.prototype.toString.call(e))}function $(e){return e===null||e===""}function R(e){return arguments.length&&(e===void 0||typeof e>"u")}function b(e){return Array.isArray(e)||typeof e=="object"&&e||F(e)}function ee(e){return $(e)||R(e)||e===!1||e===0||b(e)&&!Object.keys(e).length}function P(e){return F(e)||e&&{}.toString.call(e)==="[object function]"}function k(e){return e instanceof String||typeof e=="string"&&e!==null}function te(e){return!k(e)&&!R(e.length)}function I(e,t=!0){return w(e)?e:!t&&_(e)?[e]:e!==!1&&e!==0&&ee(e)?[]:te(e)?Array.prototype.slice.call(e):_(e)?Object.values(e):[e]}var N=class{constructor(t,n){this.registry=t,Object.assign(this,{...n,target:t.target}),this.params.signal&&this.params.signal.addEventListener("abort",()=>this.remove())}remove(){return this.removed=!0,this.registry.removeRegistration(this)}};var U=class extends N{constructor(){super(...arguments),Object.defineProperty(this,"abortController",{value:new AbortController}),Object.defineProperty(this,"signal",{value:this.abortController.signal})}remove(){this.abortController.abort(),super.remove()}fire(t){if(this.handler.firing)return;let n=t,r=this.filter;if(r!==1/0&&(r=I(r))&&(n=t.filter(o=>r.includes(o.key))),this.params.diff&&(n=n.filter(o=>o.type!=="set"||o.value!==o.oldValue)),n.length){this.handler.firing=!0;let o=this.filter===1/0||Array.isArray(this.filter)?this.handler(n,this):this.handler(n[0],this);return this.handler.firing=!1,o}}};var y=(...e)=>W("observer-api",...e),K=(e,t)=>e instanceof Promise?e.then(t):t(e);var z=class{constructor(t){this.target=t,this.entries=[]}addRegistration(t){return this.entries.push(t),t}removeRegistration(t){this.entries=this.entries.filter(n=>n!==t)}static _getInstance(t,n,r=!0,o=this.__namespace){if(!b(n))throw new Error(`Subject must be of type object; "${D(n)}" given!`);let f=this;return o&&y("namespaces").has(t+"-"+o)&&(f=y("namespaces").get(t+"-"+o),t+="-"+o),!y(n,"registry").has(t)&&r&&y(n,"registry").set(t,new f(n)),y(n,"registry").get(t)}static _namespace(t,n,r=null){if(t+="-"+n,arguments.length===2)return y("namespaces").get(t);if(!(r.prototype instanceof this))throw new Error(`The implementation of the namespace ${this.name}.${n} must be a subclass of ${this.name}.`);y("namespaces").set(t,r),r.__namespace=n}};var q=class extends z{static getInstance(t,n=!0,r=null){return super._getInstance("listeners",...arguments)}static namespace(t,n=null){return super._namespace("listeners",...arguments)}constructor(t){super(t),this.batches=[]}addRegistration(t,n,r){return super.addRegistration(new U(this,{filter:t,handler:n,params:r}))}emit(t){if(this.batches.length){this.batches[0].events.push(...t);return}this.entries.forEach(n=>n.fire(t))}batch(t){this.batches.unshift({entries:[...this.entries],events:[]});let n=t();return K(n,r=>{let o=this.batches.shift();return o.events.length&&o.entries.forEach(f=>f.fire(o.events)),r})}};var M=class extends N{exec(t,n,r){return this.running||!this.traps[t.type]?n(...Array.prototype.slice.call(arguments,2)):(this.running=!0,this.traps[t.type](t,r,(...o)=>(this.running=!1,n(...o))))}};var T=class extends z{static getInstance(t,n=!0,r=null){return super._getInstance("traps",...arguments)}static namespace(t,n=null){return super._namespace("traps",...arguments)}addRegistration(t){return super.addRegistration(new M(this,t))}emit(t,n=null){let r=this;return function o(f,...s){let c=r.entries[f];return c?c.exec(t,(...i)=>o(f+1,...i),...s):n?n(t,...s):s[0]}(0)}};var v=class{constructor(t,n){if(this.target=t,!n.type)throw new Error("Descriptor type must be given in definition!");Object.assign(this,n)}};var ie={};ye(ie,{accessorize:()=>Ue,proxy:()=>Ve,unaccessorize:()=>Me,unproxy:()=>H});function Ue(e,t,n={}){e=oe(e);let r=y(e,"accessorizedProps");function o(i){let u,m=e;do u=Object.getOwnPropertyDescriptor(m,i);while(!u&&(m=Object.getPrototypeOf(m)));return u?{proto:m,descriptor:u}:{descriptor:{value:void 0,configurable:!0,enumerable:!0,writable:!0}}}function f(i){if(r.has(i+""))return!0;let u=o(i);u.getValue=function(){return this.descriptor.get?this.descriptor.get():this.descriptor.value},u.setValue=function(d){return this.dirty=!0,this.descriptor.set?this.descriptor.set(d)!==!1:(this.descriptor.value=d,!0)},u.intact=function(){let d=Object.getOwnPropertyDescriptor(e,i);return d?.get===p.get&&d?.set===p.set&&r.get(i+"")===this},u.restore=function(){return this.intact()?(this.proto&&this.proto!==e||!this.proto&&!this.dirty?delete e[i]:Object.defineProperty(e,i,this.descriptor),r.delete(i+""),!0):!1},r.set(i+"",u);let{enumerable:m=!0}=u.descriptor,p={enumerable:m,configurable:!0};("value"in u.descriptor||u.descriptor.set)&&(p.set=function(d){return B(this,i,d,n)}),("value"in u.descriptor||u.descriptor.get)&&(p.get=function(){return C(this,i,n)});try{return Object.defineProperty(e,i,p),!0}catch{return r.delete(i+""),!1}}let c=(Array.isArray(t)?t:t===void 0?Object.keys(e):[t]).map(f);return t===void 0||Array.isArray(t)?c:c[0]}function Me(e,t,n={}){e=oe(e);let r=y(e,"accessorizedProps");function o(c){return r.has(c+"")?r.get(c+"").restore():!0}let s=(Array.isArray(t)?t:t===void 0?Object.keys(e):[t]).map(o);return t===void 0||Array.isArray(t)?s:s[0]}function Ve(e,t={}){e=oe(e);let n=new Proxy(e,{apply:(r,o,f)=>ae(r,o,f,t),construct:(r,o,f=null)=>me(r,o,f,t),defineProperty:(r,o,f)=>le(r,o,f,t),deleteProperty:(r,o)=>Q(r,o,t),get:(r,o,f=null)=>{let s=C(r,o,{...t,receiver:f});return t.proxyAutoBinding!==!1&&P(s)&&!Z(s)?function(...c){let i=this||n;return ce(i,()=>s.call(i,...c))}:s},getOwnPropertyDescriptor:(r,o)=>fe(r,o,t),getPrototypeOf:r=>se(r,t),has:(r,o)=>J(r,o,t),isExtensible:r=>ue(r,t),ownKeys:r=>G(r,t),preventExtensions:r=>de(r,t),set:(r,o,f,s=null)=>B(r,o,f,{...t,receiver:s}),setPrototypeOf:(r,o)=>pe(r,o,t)});return y(n).set(n,e),n}function H(e){return y(e).get(e)||e}function oe(e){if(!e||!b(e))throw new Error("Target must be of type object!");return H(e)}function We(e,t,n,r=f=>f,o={}){return function f(s,c,i){let u=c[i.level],m=i.level===c.length-1;return s instanceof v&&s.type!=="get"?i={...i,probe:"always"}:i.probe!=="always"&&(i={...i,probe:!m}),n(s,u,(p,...d)=>{let h=l=>{l instanceof v&&(l.path=[l.key],s instanceof v&&(l.path=s.path.concat(l.key),Object.defineProperty(l,"context",{get:()=>s})))},O=l=>{let a=S(l,!1);return K(a,x=>{l instanceof v?l.value=x:l=x;let g=d[0]||{};return f(l,c,{...i,...g,level:i.level+1})})};return X(u)&&Array.isArray(p)?(p.forEach(h),m?r(p,...d):p.map(O)):(h(p),m?r(p,...d):O(p))},i)}(e,t.slice(0),{...o,level:0})}function ke(e,t,n,r={}){if(e=S(e,!r.level),P(arguments[1])&&([,n,r={}]=arguments,t=1/0),!P(n))throw new Error(`Handler must be a function; "${D(n)}" given!`);if(r={...r,descripted:!0},delete r.live,!b(e))return r.probe&&C(e,t,n,r);let o=ve(e,t,n,r);return r.probe?C(e,t,o,r):o()}function Ke(e,t,n={}){return e=S(e),_(t)||([,,,n={}]=arguments,t={[arguments[1]]:arguments[2]}),T.getInstance(e,!0,n.namespace).addRegistration({traps:t,params:n})}function fe(e,t,n=o=>o,r={}){return A(e,"getOwnPropertyDescriptor",{key:t},n,r)}function He(e,t,n=o=>o,r={}){return A(e,"getOwnPropertyDescriptors",{key:t},n,r)}function se(e,t=r=>r,n={}){return A(e,"getPrototypeOf",{},t,n)}function ue(e,t=r=>r,n={}){return A(e,"isExtensible",{},t,n)}function G(e,t=r=>r,n={}){return A(e,"ownKeys",{},t,n)}function J(e,t,n=o=>o,r={}){return A(e,"has",{key:t},n,r)}function C(e,t,n=o=>o,r={}){let o;return e=S(e,!r.level),_(n)?[r,n]=[n,f=>f]:r.live&&(o=!0),Qe(e,t,f=>{let s=[...f];return function c(i,u,m){if(!u.length)return m(i);let p=u.shift();function d(l,a=void 0){let x=j=>(l.value=j,c(i.concat(r.live||r.descripted?l:j),u,m));if(arguments.length>1)return x(a);let g=y(e,"accessorizedProps",!1),E=g&&g.get(l.key+"");return E&&E.intact()?x(E.getValue()):x(Reflect.get(e,l.key,...r.receiver?[r.receiver]:[]))}let h=new v(e,{type:"get",key:p,value:void 0,related:s});if(!b(e))return c(i.concat(r.live||r.descripted?h:void 0),u,m);let O=T.getInstance(e,!1,r.namespace);return O?O.emit(h,d):d(h)}([],f.slice(0),c=>{let i=X(t)?c:c[0];return o&&b(e)?ve(e,t,n,r)(i):n(i)})})}function ce(e,t,n={}){return e=S(e),q.getInstance(e,!0,n.namespace).batch(t)}function B(e,t,n,r=s=>s,o={},f=!1){e=S(e);let s=[[t,n]];_(t)&&([,,r=i=>i,o={},f=!1]=arguments,s=Object.entries(t)),_(r)&&([f,o,r]=[typeof o=="boolean"?o:!1,r,i=>i]);let c=s.map(([i])=>i);return function i(u,m,p){if(!m.length)return p(u);let[d,h]=m.shift();function O(a,x=void 0){let g=Pe=>(a.status=Pe,i(u.concat(a),m,p));if(arguments.length>1)return g(a,x);let E=y(e,"accessorizedProps",!1),j=E&&E.get(a.key+"");return a.type==="defineProperty"?(j&&!j.restore()&&g(!1),Object.defineProperty(e,a.key,a.value),g(!0)):j&&j.intact()?g(j.setValue(a.value)):g(Reflect.set(e,a.key,a.value))}function l(a,x){if(o.diff&&h===x)return i(u,m,p);let g=new v(e,{type:f?"defineProperty":"set",key:d,value:h,isUpdate:a,oldValue:x,related:[...c],detail:o.detail}),E=T.getInstance(e,!1,o.namespace);return E?E.emit(g,O):O(g)}return J(e,d,a=>a?C(e,d,x=>l(a,x),o):l(a),o)}([],s.slice(0),i=>{let u=q.getInstance(e,!1,o.namespace);return u&&u.emit(i),r(X(t)?i.map(m=>m.status):i[0]?.status)})}function le(e,t,n,r=f=>f,o={}){return B(e,t,n,r,o,!0)}function Ge(e,t,n=o=>o,r={}){return B(e,t,n,r,!0)}function Q(e,t,n=o=>o,r={}){e=S(e),_(n)&&([r,n]=[n,s=>s]);let o=I(t),f=[...o];return function s(c,i,u){if(!i.length)return u(c);let m=i.shift();function p(h,O=void 0){let l=g=>(h.status=g,s(c.concat(h),i,u));if(arguments.length>1)return l(h,O);let a=y(e,"accessorizedProps",!1),x=a&&a.get(h.key+"");return x&&!x.restore()&&l(!1),l(Reflect.deleteProperty(e,h.key))}function d(h){let O=new v(e,{type:"deleteProperty",key:m,oldValue:h,related:[...f],detail:r.detail}),l=T.getInstance(e,!1,r.namespace);return l?l.emit(O,p):p(O)}return C(e,m,d,r)}([],o.slice(0),s=>{let c=q.getInstance(e,!1,r.namespace);return c&&c.emit(s),n(X(t)?s.map(i=>i.status):s[0].status)})}function Je(e,t,n=o=>o,r={}){return Q(...arguments)}function me(e,t,n=null,r=f=>f,o={}){return A(e,"construct",arguments.length>2?{argumentsList:t,newTarget:n}:{argumentsList:t},r,o)}function ae(e,t,n,r=f=>f,o={}){return A(e,"apply",{thisArgument:t,argumentsList:n},r,o)}function pe(e,t,n=o=>o,r={}){return A(e,"setPrototypeOf",{proto:t},n,r)}function de(e,t=r=>r,n={}){return A(e,"preventExtensions",{},t,n)}function ve(e,t,n,r={}){let o;r.signal||(o=new AbortController,r={...r,signal:o.signal});let f=q.getInstance(e,!0,r.namespace);return function s(c,i=null){i?.remove();let m={signal:f.addRegistration(t,s,r).signal};return arguments.length&&n(c,m),o}}function A(e,t,n={},r=f=>f,o={}){e=S(e),_(r)&&([o,r]=[r,i=>i]);function f(i,u){return arguments.length>1?r(u):r(Reflect[t](e,...Object.values(n)))}let s=new v(e,{type:t,...n}),c=T.getInstance(e,!1,o.namespace);return c?c.emit(s,f):f(s)}function X(e){return e===1/0||Array.isArray(e)}function S(e,t=!0){if((!e||!b(e))&&t)throw new Error(`Object must be of type object or array! "${D(e)}" given.`);return e instanceof v&&(e=e.value),e&&H(e)}function Qe(e,t,n){return t===1/0?G(e,n):n(I(t))}var Xe={...he,...ie},we=Xe;self.webqit||(self.webqit={});self.webqit.Observer=we;})();
//# sourceMappingURL=main.js.map

@@ -15,3 +15,3 @@ {

"homepage": "https://webqit.io/tooling/observer",
"version": "2.0.7",
"version": "2.1.0",
"license": "MIT",

@@ -18,0 +18,0 @@ "repository": {

@@ -12,64 +12,189 @@ # The Observer API

> **Note**
> <br>Major updates coming in this branch!
> <br>This is documentation for `Observer@2.x`. (Looking for [`Observer@1.x`](https://github.com/webqit/observer/tree/v1.7.6)?)
Take a one-minute rundown of the Observer API.
## Table of Contents
## Observe
+ [Download Options](#download-options)
+ [Overview](#overview)
+ [Method: `Observer.observe()`](#method-observerobserve)
+ [Concept: *Observers*](#concept-observers)
+ [Concept: *Mutations*](#concept-mutations)
+ [Concept: *Batch Mutations*](#concept-batch-mutations)
+ [Concept: *Custom Details*](#concept-custom-details)
+ [Concept: *Diffing*](#concept-diffing)
+ [Method: `Observer.intercept()`](#method-observerintercept)
+ [Concept: *Traps*](#concept-traps)
+ [Issues](#issues)
+ [License](#license)
Observe operations on any object or array...
## Download Options
**_Use as an npm package:_**
```bash
npm i @webqit/observer
```
```js
let obj = {};
// Import
import Observer from '@webqit/observer';;
```
...using the [`Observer.observe()`](https://webqit.io/tooling/observer/docs/api/reactions/observe) method.
**_Use as a script:_**
```html
<script src="https://unpkg.com/@webqit/observer/dist/main.js"></script>
```
```js
Observer.observe(obj, mutations => {
mutations.forEach(mutation => {
console.log(mutation.type, mutation.name, mutation.path, mutation.value, mutation.oldValue);
});
});
// Obtain the APIs
const Observer = window.webqit.Observer;
```
Now changes will be delivered *synchronously* - as they happen.
## Method: `Observer.observe()`
## Mutate
Observe mutations on any object or array!
Programmatically make *reactive* changes using the *Reflect-like* [set of operators](https://webqit.io/tooling/observer/docs/api/actions)...
```js
// Signature 1
Observer.observe( obj, callback[, options = {} ]);
```
```js
// A single set operation
Observer.set(obj, 'prop1', 'value1');
// Signature 2
Observer.observe( obj, props, callback[, options = {} ]);
```
### Concept: *Observers*
Observe arbitrary objects and arrays:
```js
// A batch set operation
Observer.set(obj, {
prop2: 'value2',
prop3: 'value3',
});
// An object
const obj = {};
// Mtation observer on an object
const abortController = Observer.observe( obj, handleChanges );
```
...or switch to using *object accessors* - using the [`Observer.accessorize()`](https://webqit.io/tooling/observer/docs/api/actors/accessorize) method...
```js
// An array
const arr = [];
// Mtation observer on an array
const abortController = Observer.observe( arr, handleChanges );
```
*Now changes will be delivered **synchronously** - as they happen. (The *sync* design is discussed shortly.)*
```js
// The change handler
function handleChanges( mutations ) {
mutations.forEach( mutation => {
console.log( mutation.type, mutation.key, mutation.value, mutation.oldValue );
} );
}
```
**-->** Stop observing at any time by calling `abort()` on the returned *abortController*...
```js
// Remove listener
abortController.abort();
```
...or by using an [Abort Signal](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal) instance:
```js
// Providing an AbortSignal
const abortController = new AbortController;
Observer.observe( obj, mutations => {
// Handle...
}, { signal: abortController.signal } );
```
```js
// Abort at any time
abortController.abort();
```
### Concept: *Mutations*
Programmatically mutate properties of an object using the *[Reflect](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect#static_methods)-like* set of operators; each operation will be reported by observers:
```js
// A single "set" operation on an object
Observer.set( obj, 'prop0', 'value0' );
Observer.defineProperty( obj, 'prop1', { get: () => 'value1' } );
Observer.deleteProperty( obj, 'prop2' );
```
```js
// A single "set" operation on an array
Observer.set( arr, 0, 'item0' ); // Array [ 'item0' ]
Observer.deleteProperty( arr, 0 ); // Array [ <1 empty slot> ]
```
*Beware non-reactive operations*:
```js
// Literal object accessors
delete obj.prop0;
obj.prop3 = 'value3';
```
```js
// Array methods
arr.push( 'item3' );
arr.pop();
```
**-->** Enable reactivity on *specific* properties with literal *object accessors* - using the `Observer.accessorize()` method:
```js
// Accessorize all (existing) properties
Observer.accessorize(obj);
Observer.accessorize( obj );
// Accessorize specific properties (existing or new)
Observer.accessorize(obj, ['prop1', 'prop5', 'prop9']);
Observer.accessorize( obj, [ 'prop0', 'prop1', 'prop2' ] );
// Make reactive UPDATES
obj.prop0 = 'value0';
obj.prop1 = 'value1';
obj.prop2 = 'value2';
```
```js
// Make reactive operations
obj.prop1 = 'value1';
obj.prop5 = 'value5';
obj.prop9 = 'value9';
// Accessorize all (existing) indexes
Observer.accessorize( arr );
// Accessorize specific indexes (existing or new)
Observer.accessorize( arr, [ 0, 1, 2 ] );
// Make reactive UPDATES
arr[ 0 ] = 'item0';
arr[ 1 ] = 'item1';
arr[ 2 ] = 'item2';
// Bonus reactivity: array methods that re-index existing items
arr.unshift( 'new-item0' );
arr.shift();
```
...or even go with a *reactive Proxy* of your object, and imply properties on the fly.
*Beware non-reactive operations*:
```js
// Obtain a reactive Proxy
let _obj = Observer.proxy(obj);
// The delete operator and object properties that haven't been accessorized
delete obj.prop0;
obj.prop3 = 'value3';
```
```js
// Array methods that do not re-index existing items
arr.push( 'item0' );
arr.pop();
```
**-->** Enable reactivity on *arbitray* properties with *Proxies* - using the `Observer.proxy()` method:
```js
// Obtain a reactive Proxy for an object
const _obj = Observer.proxy( obj );
// Make reactive operations

@@ -79,113 +204,202 @@ _obj.prop1 = 'value1';

_obj.prop8 = 'value8';
// With the delete operator
delete _obj.prop0;
```
And no problem if you inadvertently cascade the approaches. No bizzare behaviours.
```js
// Obtain a reactive Proxy for an array
const _arr = Observer.proxy( arr );
// Make reactive operations
_arr[ 0 ] = 'item0';
_arr[ 1 ] = 'item1';
_arr[ 2 ] = 'item2';
// With an instance method
_arr.push( 'item3' );
```
*And no problem if you end up nesting the approaches.*
```js
// Accessorized properties are already reactive
Observer.accessorize(obj, ['prop1', 'prop6', 'prop10']);
// 'value1'-->obj
Observer.accessorize( obj, [ 'prop0', 'prop1', 'prop2', ] );
obj.prop1 = 'value1';
// But no problem if you inadvertently proxy an accessorized object
let _obj = Observer.proxy(obj);
// 'value1'-->_obj-->obj
let _obj = Observer.proxy( obj );
_obj.prop1 = 'value1';
// And yet no problem if you inadvertently made a programmatic call over an already reactive Proxy
Observer.set(_obj, 'prop1', 'value1');
// 'value1'-->set()-->_obj-->obj
Observer.set( _obj, 'prop1', 'value1' );
```
## Intercept
**-->** "Restore" accessorized properties to normal by calling `unaccessorize()`:
How about some level of indirection - the ability to hook into operators like `Observer.set()` and `Observer.deleteProperty()` to repurpose their operation? That's all possible using the [`Observer.intercept()`](https://webqit.io/tooling/observer/docs/api/reactions/intercept) method!
```js
Observer.unaccessorize( obj, [ 'prop1', 'prop6', 'prop10' ] );
```
Below, we catch any attempt to set an HTTP URL and force it to an HTTPS URL.
**-->** "Reproduce" original objects from Proxies obtained via `Observer.proxy()` by using the `unproxy()` method:
```js
Observer.intercept(obj, 'set', (action, previous, next) => {
if (action.name === 'url' && action.value.startsWith('http:')) {
return next(action.value.replace('http:', 'https:'));
}
return next();
});
obj = Observer.unproxy( _obj );
```
Now, only the first of the following will fly as-is.
### Concept: *Batch Mutations*
Make multiple mutations at a go, and they'll be correctly delivered in batch to observers!
```js
Observer.set(obj, 'url', 'https://webqit.io');
// Batch operations on an object
Observer.set( obj, {
prop0: 'value0',
prop1: 'value1',
prop2: 'value2',
} );
Observer.defineProperties( obj, {
prop0: { value: 'value0' },
prop1: { value: 'value1' },
prop2: { get: () => 'value2' },
} );
Observer.deleteProperties( obj, [ 'prop0', 'prop1', 'prop2' ] );
```
```js
Observer.set(obj, 'url', 'http://webqit.io');
// Batch operations on an array
Observer.set( arr, {
'0': 'item0',
'1': 'item1',
'2': 'item2',
} );
Object.proxy( arr ).push( 'item3', 'item4', 'item5', );
Object.proxy( arr ).unshift( 'new-item0' );
Object.proxy( arr ).splice( 0 );
```
## Pass Some Detail to Observers
**-->** Use the `Observer.batch()` to batch multiple arbitrary mutations - whether related or not:
Operators, like `Observer.set()`, can pass arbitrary value to observers via a `params.detail` property.
```js
Observer.batch( arr, async () => {
Observer.set( arr, 0, 'item0' ); // Array [ 'item0' ]
await somePromise();
Observer.set( arr, 2, 'item2' ); // Array [ 'item0', <1 empty slot>, 'item2' ]
} );
```
> Method calls on a proxied instance - e.g. `Object.proxy( arr ).splice( 0 )` - also follow this strategy.
### Concept: *Custom Details*
Pass some custom detail - an arbitrary value - to observers via a `params.detail` property.
```js
// A set operation with detail
Observer.set(obj, {
Observer.set( obj, {
prop2: 'value2',
prop3: 'value3',
}, { detail: 'Certain detail' });
}, { detail: 'Certain detail' } );
```
Observers will recieve this value in a `mutation.detail` property.
*Observers recieve this value on their `mutation.detail` property.*
```js
// An observer with detail
Observer.observe(obj, 'prop1', mutation => {
console.log('An operation has been made with detail:' + mutation.detail);
});
Observer.observe( obj, 'prop1', mutation => {
console.log( 'A mutation has been made with detail:' + mutation.detail );
} );
```
## Negotiate with Observers
### Concept: *Diffing*
Observers can access and *act* on a special object called the *Response Object*.
Receive notifications only for mutations that actually change property state, and ignore those that don't.
```js
// An observer and the response object
Observer.observe(obj, 'prop1', (mutation, event) => {
if (1) {
event.preventDefault(); // Or return false
} else if (2) {
event.stopPropagation(); // Or return false
} else if (3) {
event.waitUntil(new Promise); // Or return new Promise
}
});
// Responding to state changes only
Observer.observe( obj, handleChanges, { diff: true } );
```
Operators can access and honour the event's state.
```js
// Recieved
Observer.set( obj, 'prop0', 'value' );
```
```js
// A set operation that returns the eventTypeReturn
let event = Observer.set(obj, {
prop2: 'value2',
prop3: 'value3',
}, { eventTypeReturn: true });
// Ignored
Observer.set( obj, 'prop0', 'value' );
```
<!--
### Concept: *Live*
descripted
namespace
-->
## Method: `Observer.intercept()`
Intercept operations on any object or array before they happen!
```js
if (event.defaultPrevented) {
// event.preventDefault() was called
} else if (event.propagationStopped) {
// event.stopPropagation() was called
} else if (event.promises) {
// event.waitUntil() was called
event.promises.then(() => {
// Signature 1
Observer.intercept( obj, prop, handler[, options = {} ]);
```
});
}
```js
// Signature 2
Observer.intercept( obj, traps[, options = {} ]);
```
*Learn more about negotiation [here](https://webqit.io/tooling/observer/docs/api/core/Event#negotiating-with-operators)*
### Concept: *Traps*
## Clean Up Anytime
Extend standard operations on an object - `Observer.set()`, `Observer.deleteProperty()`, etc - with custom traps using the [`Observer.intercept()`](https://webqit.io/tooling/observer/docs/api/reactions/intercept) method!
Need to undo certain bindings? There are the methods for that!
*Below, we intercept all "set" operations for an HTTP URL then transform it to an HTTPS URL.*
+ [`Observer.unobserve()`](https://webqit.io/tooling/observer/docs/api/reactions/unobserve)
+ [`Observer.unintercept()`](https://webqit.io/tooling/observer/docs/api/reactions/unintercept)
+ [`Observer.unproxy()`](https://webqit.io/tooling/observer/docs/api/actors/unproxy)
+ [`Observer.unaccessorize()`](https://webqit.io/tooling/observer/docs/api/actors/unaccessorize)
```js
const setTrap = ( operation, previous, next ) => {
if ( operation.key === 'url' && operation.value.startsWith( 'http:' ) ) {
operation.value = operation.value.replace( 'http:', 'https:' );
}
return next();
};
Observer.intercept( obj, 'set', setTrap );
```
*Now, only the first of the following will fly as-is.*
```js
// Not transformed
Observer.set( obj, 'url', 'https://webqit.io' );
// Transformed
Observer.set( obj, 'url', 'http://webqit.io' );
```
*And below, we intercept all "get" operations for a certain value to trigger a network fetch behind the scenes.*
```js
const getTrap = ( operation, previous, next ) => {
if ( operation.key === 'token' ) {
return next( fetch( tokenUrl ) );
}
return next();
};
Observer.intercept( obj, 'get', getTrap );
```
*And all of that can go into one "traps" object:*
```js
Observer.intercept( obj, {
get: getTrap,
set: setTrap,
deleteProperty: deletePropertyTrap,
defineProperty: definePropertyTrap,
ownKeys: ownKeysTrap,
has: hasTrap,
// etc
} );
```
## The End?

@@ -192,0 +406,0 @@

@@ -8,3 +8,3 @@

import { set, deleteProperty, has, get, ownKeys, defineProperty, getOwnPropertyDescriptor } from "./main.js";
import { apply, construct, getPrototypeOf, setPrototypeOf, isExtensible, preventExtensions } from "./main.js";
import { batch, apply, construct, getPrototypeOf, setPrototypeOf, isExtensible, preventExtensions } from "./main.js";
import { _ } from './util.js';

@@ -29,12 +29,12 @@

let descriptor, proto = target;
while ( !descriptor && ( proto = Object.getPrototypeOf( proto ) ) ) {
do {
descriptor = Object.getOwnPropertyDescriptor( proto, prop );
}
} while ( !descriptor && ( proto = Object.getPrototypeOf( proto ) ) );
return descriptor
? { proto, descriptor }
: { descriptor: { value: undefined } };
: { descriptor: { value: undefined, configurable: true, enumerable: true, writable: true } };
}
// ---------
function accessorizeProp( prop ) {
if ( accessorizedProps.has( prop ) ) return true;
if ( accessorizedProps.has( prop + '' ) ) return true;
// ------------------

@@ -44,30 +44,31 @@ // Current Descriptor Record

currentDescriptorRecord.getValue = function() {
return 'get' in this.descriptor ? this.descriptor.get() : this.descriptor.value;
return this.descriptor.get ? this.descriptor.get() : this.descriptor.value;
};
currentDescriptorRecord.setValue = function( value ) {
return 'set' in this.descriptor ? this.descriptor.set( value ) : ( this.descriptor.value = value )
this.dirty = true;
return this.descriptor.set ? this.descriptor.set( value ) !== false : ( this.descriptor.value = value, true );
};
currentDescriptorRecord.intact = function() {
const currentDescriptor = Object.getOwnPropertyDescriptor( target, prop );
return currentDescriptor.get === accessorization.get
&& currentDescriptor.set === accessorization.set
&& accessorizedProps.get( prop ) === this;
return currentDescriptor?.get === accessorization.get
&& currentDescriptor?.set === accessorization.set
&& accessorizedProps.get( prop + '' ) === this;
};
currentDescriptorRecord.restore = function() {
if ( !this.intact() ) return false;
if ( this.proto !== target ) { delete target[ prop ]; }
if ( ( this.proto && this.proto !== target ) || ( !this.proto && !this.dirty ) ) { delete target[ prop ]; }
else { Object.defineProperty( target, prop, this.descriptor ); }
accessorizedProps.delete( prop );
accessorizedProps.delete( prop + '' );
return true;
};
accessorizedProps.set( prop, currentDescriptorRecord );
accessorizedProps.set( prop + '', currentDescriptorRecord );
// ------------------
// enumerable, configurable
const { enumerable = true, configurable = true } = currentDescriptorRecord.descriptor;
const accessorization = { enumerable, configurable };
const { enumerable = true } = currentDescriptorRecord.descriptor;
const accessorization = { enumerable, configurable: true };
// set, get
if ( [ 'value', 'set' ].some( x => x in currentDescriptorRecord.descriptor ) ) {
if ( ( 'value' in currentDescriptorRecord.descriptor ) || currentDescriptorRecord.descriptor.set ) {
accessorization.set = function ( value ) { return set( this, prop, value, params ); };
}
if ( [ 'value', 'get' ].some( x => x in currentDescriptorRecord.descriptor ) ) {
if ( ( 'value' in currentDescriptorRecord.descriptor ) || currentDescriptorRecord.descriptor.get ) {
accessorization.get = function () { return get( this, prop, params ); };

@@ -79,3 +80,3 @@ }

} catch( e ) {
accessorizedProps.delete( prop );
accessorizedProps.delete( prop + '' );
return false;

@@ -106,4 +107,4 @@ }

function unaccessorizeProp( prop ) {
if ( !accessorizedProps.has( prop ) ) return true;
return accessorizedProps.get( prop ).restore();
if ( !accessorizedProps.has( prop + '' ) ) return true;
return accessorizedProps.get( prop + '' ).restore();
}

@@ -140,3 +141,6 @@ const _props = Array.isArray( props ) ? props : (

if ( params.proxyAutoBinding !== false && _isFunction( val ) && !_isClass( val )) {
return val.bind( proxy );
return function( ...args ) {
const _this = this || proxy;
return batch( _this, () => val.call( _this, ...args ) );
}
}

@@ -143,0 +147,0 @@ return val;

@@ -0,0 +0,0 @@

@@ -44,2 +44,3 @@

fire( events ) {
if ( this.handler.firing ) return;
let matches = events, filter = this.filter;

@@ -53,7 +54,10 @@ if ( filter !== Infinity && ( filter = _arrFrom( filter ) ) ) {

if ( matches.length ) {
return this.filter === Infinity || Array.isArray( this.filter )
this.handler.firing = true;
const ret = this.filter === Infinity || Array.isArray( this.filter )
? this.handler( matches, this )
: this.handler( matches[ 0 ], this );
this.handler.firing = false;
return ret;
}
}
}

@@ -7,2 +7,3 @@

import Registry from './Registry.js';
import { _await } from '../util.js';

@@ -65,9 +66,11 @@ /**

const returnValue = callback();
const batch = this.batches.shift();
if ( batch.events.length ) {
batch.entries.forEach( listener => listener.fire( batch.events ) );
}
return returnValue;
return _await( returnValue, returnValue => {
const batch = this.batches.shift();
if ( batch.events.length ) {
batch.entries.forEach( listener => listener.fire( batch.events ) );
}
return returnValue;
} )
}
}

@@ -0,0 +0,0 @@

@@ -0,0 +0,0 @@

@@ -0,0 +0,0 @@

@@ -0,0 +0,0 @@

@@ -11,3 +11,3 @@

import { unproxy } from './actors.js';
import { _ } from './util.js';
import { _, _await } from './util.js';

@@ -30,11 +30,15 @@ /* ---------------SPECIAL APIs--------------- */

export function deep( target, path, receiver, final = x => x, params = {} ) {
return ( function eat( target, path, _params ) {
const segment = path[ _params.level ];
return ( function eat( target, path, $params ) {
const segment = path[ $params.level ];
const isLastSegment = $params.level === path.length - 1;
if ( target instanceof Descriptor && target.type !== 'get' ) {
// Always probe event-generated trees
$params = { ...$params, probe: 'always' };
} else if ( $params.probe !== 'always' ) {
// Probe until (before) last segment
$params = { ...$params, probe: !isLastSegment };
}
// ---------------
if ( _params.level < path.length - 1 ) { _params = { ..._params, preflight: true }; }
else { _params = { ..._params, preflight: /*reset*/params.preflight }; }
// ---------------
return receiver( target, segment, ( result, ...args ) => {
// -----------
const paramsNext = ( flags = {} ) => ( { ..._params, ...flags, level: _params.level + 1, } );
const addTrail = desc => {

@@ -45,20 +49,29 @@ if ( !( desc instanceof Descriptor ) ) return;

desc.path = target.path.concat( desc.key );
desc.context = target;
Object.defineProperty( desc, 'context', { get: () => target } );
}
};
const advance = result => {
const $value = resolveObj( result/* a Descriptor who's value could be proxied */, false );
return _await( $value/* could be a promise */, $value => {
if ( result instanceof Descriptor ) {
result.value = $value; // Update to (fulfilled), unproxied, value
} else {
result = $value;
}
const flags = args[ 0 ] || {};
return eat( result, path, { ...$params, ...flags, level: $params.level + 1, } );
} );
};
// -----------
if ( isPropsList( segment ) && Array.isArray( result ) ) {
// -----------
result.forEach( addTrail );
if ( _params.level === path.length - 1 || ( !result.length && _params.midwayResults ) ) return final( result, ...args );
return result.map( entry => eat( entry, path, paramsNext( ...args ) ) )
// -----------
if ( isLastSegment ) return final( result, ...args );
return result.map( advance );
}
// -----------
addTrail( result );
const $isTypeObject = _isTypeObject( resolveObj( result, false ) );
if ( _params.level === path.length - 1 || ( !$isTypeObject && _params.midwayResults ) ) return final( result, ...args );
return $isTypeObject && eat( result, path, paramsNext( ...args ) );
if ( isLastSegment ) return final( result, ...args );
return advance( result );
// -----------
}, _params );
}, $params );
} )( target, path.slice( 0 ), { ...params, level: 0 } );

@@ -79,3 +92,3 @@ }

// ---------------
target = resolveObj( target );
target = resolveObj( target, !params.level );
if ( _isFunction( arguments[ 1 ] ) ) {

@@ -87,6 +100,8 @@ [ , receiver, params = {} ] = arguments;

// ---------------
params = { ...params, descripted: true };
delete params.live;
if ( !_isTypeObject( target ) ) return params.probe && get( target, prop, receiver, params );
// ---------------
const emit = bind( target, prop, receiver, params );
if ( params.preflight ) {
params = { ...params, descripted: true };
delete params.live;
if ( params.probe ) {
return get( target, prop, emit, params );

@@ -214,3 +229,3 @@ }

let isLive;
target = resolveObj( target );
target = resolveObj( target, !params.level );
if ( _isObject( receiver ) ) { [ params, receiver ] = [ receiver, x => x ]; }

@@ -229,3 +244,3 @@ else if ( params.live ) { isLive = true; }

const accessorizedProps = _( target, 'accessorizedProps', false );
const accessorization = accessorizedProps && accessorizedProps.get( descriptor.key );
const accessorization = accessorizedProps && accessorizedProps.get( descriptor.key + '' );
if ( accessorization && accessorization.intact() ) {

@@ -243,2 +258,3 @@ return _next( accessorization.getValue() );

} );
if ( !_isTypeObject( target ) ) return next( results.concat( params.live || params.descripted ? descriptor : undefined ), _props, _done );
const listenerRegistry = TrapsRegistry.getInstance( target, false, params.namespace );

@@ -251,3 +267,3 @@ if ( listenerRegistry ) {

const result_s = isPropsList( prop/*original*/ ) ? results : results[ 0 ];
if ( isLive ) {
if ( isLive && _isTypeObject( target ) ) {
const emit = bind( target, prop, receiver, params );

@@ -273,2 +289,3 @@ return emit( result_s );

export function batch( target, callback, params = {} ) {
target = resolveObj( target );
return ListenerRegistry.getInstance( target, true, params.namespace ).batch( callback );

@@ -308,3 +325,3 @@ }

const accessorizedProps = _( target, 'accessorizedProps', false );
const accessorization = accessorizedProps && accessorizedProps.get( descriptor.key );
const accessorization = accessorizedProps && accessorizedProps.get( descriptor.key + '' );
if ( descriptor.type === 'defineProperty' ) {

@@ -406,3 +423,3 @@ if ( accessorization && !accessorization.restore() ) _next( false );

const accessorizedProps = _( target, 'accessorizedProps', false );
const accessorization = accessorizedProps && accessorizedProps.get( descriptor.key );
const accessorization = accessorizedProps && accessorizedProps.get( descriptor.key + '' );
if ( accessorization && !accessorization.restore() ) _next( false );

@@ -437,2 +454,9 @@ return _next( Reflect.deleteProperty( target, descriptor.key ) );

/**
* @alias deleteProperty()
*/
export function deleteProperties( target, props, receiver = x => x, params = {} ) {
return deleteProperty( ...arguments );
}
/* ---------------EFFECT APIs--------------- */

@@ -439,0 +463,0 @@

@@ -0,0 +0,0 @@

@@ -7,2 +7,4 @@

export const _ = ( ...args ) => _internals( 'observer-api', ...args );
export const _ = ( ...args ) => _internals( 'observer-api', ...args );
export const _await = ( value, callback ) => value instanceof Promise ? value.then( callback ) : callback( value );

@@ -218,5 +218,5 @@

// -----
expect( _changes ).to.have.lengthOf( 2 );
expect( _changes[ 0 ] ).to.be.an( 'object' ).that.deep.includes( { key: 'sub.key1', path: [ 'key1', 'sub.key1' ], type: 'get', value: undefined, } );
expect( _changes[ 1 ] ).to.be.an( 'object' ).that.deep.includes( { key: 'sub.key1', path: [ 'key1', 'sub.key1' ], type: 'set', value: {}, } );
expect( _changes ).to.have.lengthOf( 3 );
expect( _changes[ 1 ] ).to.be.an( 'object' ).that.deep.includes( { key: 'sub.key1', path: [ 'key1', 'sub.key1' ], type: 'get', value: undefined, } );
expect( _changes[ 2 ] ).to.be.an( 'object' ).that.deep.includes( { key: 'sub.key1', path: [ 'key1', 'sub.key1' ], type: 'set', value: {}, } );
} );

@@ -229,9 +229,8 @@

_changes.push( change );
}, { preflight: true } );
} );
// -----
Observer.set( arr, 0, {} );
// -----
expect( _changes ).to.have.lengthOf( 2 );
expect( _changes[ 0 ] ).to.be.an( 'object' ).that.deep.includes( { key: 0, type: 'get', } );
expect( _changes[ 1 ] ).to.be.an( 'object' ).that.deep.includes( { key: 0, type: 'set', } );
expect( _changes ).to.have.lengthOf( 1 );
expect( _changes[ 0 ] ).to.be.an( 'object' ).that.deep.includes( { key: 0, type: 'set', } );
} );

@@ -238,0 +237,0 @@

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc