UNPKG

@mobx-sentinel/core

Version:

MobX library for non-intrusive class-based model enhancement. Acting as a sentinel, it provides change detection, reactive validation, and form integration capabilities without contamination.

2 lines 14.4 kB
"use strict";var k=Object.defineProperty;var z=Object.getOwnPropertyDescriptor;var re=Object.getOwnPropertyNames;var oe=Object.prototype.hasOwnProperty;var ne=(n,e)=>{for(var t in e)k(n,t,{get:e[t],enumerable:!0})},se=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of re(e))!oe.call(n,o)&&o!==t&&k(n,o,{get:()=>e[o],enumerable:!(r=z(e,o))||r.enumerable});return n};var ae=n=>se(k({},"__esModule",{value:!0}),n),y=(n,e,t,r)=>{for(var o=r>1?void 0:r?z(e,t):e,s=n.length-1,a;s>=0;s--)(a=n[s])&&(o=(r?a(e,t,o):a(o))||o);return r&&o&&k(e,t,o),o};var fe={};ne(fe,{KeyPath:()=>l,StandardNestedFetcher:()=>g,ValidationError:()=>w,Validator:()=>T,Watcher:()=>V,makeValidatable:()=>te,nested:()=>B,unwatch:()=>Y,watch:()=>X});module.exports=ae(fe);var S=require("mobx");function G(n){return typeof n=="object"&&typeof n.kind=="string"}function L(n){return typeof n=="string"||typeof n=="symbol"}var C=class n{#e=new Map;registerPropertyLike(e,t){let r=this.#e.get(e);r||(r=new Map,this.#e.set(e,r));let o=r.get(t.propertyKey);o||(o={data:[],get:t.get},r.set(t.propertyKey,o)),o.data.push(t.data)}getPropertyLike(e){return this.#e.get(e)}clone(){let e=new n;for(let[t,r]of this.#e)for(let[o,s]of r)for(let a of s.data)e.registerPropertyLike(t,{propertyKey:o,data:a,get:s.get});return e}},A=new WeakMap;function q(n){let e=!0;for(;n&&typeof n=="object";){let t=A.get(n);if(t)return{processor:t,isOwn:e};e=!1,n=Object.getPrototypeOf(n)}return{processor:null,isOwn:e}}function W(n,e){let t=q(n);return t.processor?e&&!t.isOwn&&(t.processor=t.processor.clone(),A.set(n,t.processor)):(t.processor=new C,A.set(n,t.processor)),t.processor}function K(n){return q(n).processor}function x(n,e){return(t,r)=>{G(r)?r.addInitializer(function(){W(this,!1).registerPropertyLike(n,{propertyKey:r.name,data:e(r.name),get:()=>r.access.get(this)})}):t&&L(r)&&W(t,!0).registerPropertyLike(n,{propertyKey:r,data:e(r)})}}var l;(a=>{a.Self=Symbol("self");function e(i){return i===a.Self||i===""}a.isSelf=e;function t(...i){let h=i.flatMap(p=>{switch(typeof p){case"string":return p===""?[]:[p];case"number":return[String(p)];case"symbol":return[];default:return[]}}).join(".");return h===""?a.Self:h}a.build=t;function r(i,h){return e(i)?a.Self:e(h)?i:`${i}.`.startsWith(`${h}.`)?t(i.slice(h.length+1)):null}a.getRelative=r;function o(i){if(e(i))return a.Self;let[h]=i.split(".",1);return h||a.Self}a.getParentKey=o;function*s(i,h=!0){if(h&&(yield i||a.Self),e(i))return;let p=i.split(".");for(;p.length>1;)p.pop(),yield t(...p)}a.getAncestors=s})(l||={});var E=class{#e=new Map;#t=new Map;get size(){return this.#e.size}has(e,t=!1){return this.#e.has(e)?!0:t?this.#t.has(e):!1}*findExact(e){let t=this.#e.get(e);t&&(yield*t)}*findPrefix(e){if(l.isSelf(e)){for(let o of this.#e.values())yield*o;return}let t=this.#e.get(e);t&&(yield*t);let r=this.#t.get(e);if(r)for(let o of r)yield*this.findExact(o)}get(e,t=!1){return t?new Set(this.findPrefix(e)):new Set(this.findExact(e))}set(e,t){if(Object.isFrozen(this))throw new Error("Cannot modify frozen KeyPathMultiMap");let r=this.#e.get(e);r||(r=new Set,this.#e.set(e,r)),r.add(t);for(let o of l.getAncestors(e,!1)){let s=this.#t.get(o);s||(s=new Set,this.#t.set(o,s)),s.add(e)}}delete(e){if(Object.isFrozen(this))throw new Error("Cannot modify frozen KeyPathMultiMap");this.#e.delete(e);for(let t of l.getAncestors(e,!1)){let r=this.#t.get(t);r&&(r.delete(e),r.size===0&&this.#t.delete(t))}}*[Symbol.iterator](){for(let[e,t]of this.#e.entries())for(let r of t)yield[e,r]}toImmutable(){return Object.freeze(this),this}};var u=require("mobx");function M(n){return(0,u.isBoxedObservable)(n)&&(n=n.get()),(0,u.isObservableArray)(n)?n.slice():(0,u.isObservableSet)(n)?new Set(n):(0,u.isObservableMap)(n)?new Map(n):n}function*j(n){if((0,u.isBoxedObservable)(n)&&(n=n.get()),Array.isArray(n)||(0,u.isObservableArray)(n)){let e=0;for(let t of n)yield[e++,t];return}if(n instanceof Set||(0,u.isObservableSet)(n)){let e=0;for(let t of n)yield[e++,t];return}if(n instanceof Map||(0,u.isObservableMap)(n)){for(let[e,t]of n)yield[e,t];return}yield[null,n]}function*J(n){if(!(0,u.isObservableObject)(n))return;let e=n[u.$mobx];if(typeof e!="object"||!e||!("values_"in e))return;let t=e.values_;if(t instanceof Map)for(let[r,o]of t){if(typeof r!="string"&&typeof r!="symbol"&&typeof r!="number"||typeof o!="object"||!o||!("get"in o&&typeof o.get=="function"))continue;yield[r,()=>r in n?n[r]:o.get()]}}var O=Symbol("nested"),ie=x(O,()=>"@nested"),le=x(O,()=>"@nested.hoist"),B=Object.assign(ie,{hoist:le});function*R(n){let e=K(n);if(!e)return;let t=e.getPropertyLike(O);if(!t)return;let r=null;for(let[o,s]of t){let a=new Set(s.data);if(a.size>1)throw new Error(`Mixed @nested annotations are not allowed for the same key: ${String(o)}`);let i=a.has("@nested.hoist");if(i){if(r)throw new Error(`Multiple @nested.hoist annotations are not allowed in the same class: ${String(r)} and ${String(o)}`);r=o}yield{key:o,getValue:()=>o in n?n[o]:s.get?.(),hoist:i}}}var g=class{#e;#t=new Map;constructor(e,t){(0,S.makeObservable)(this),this.#e=t;for(let{key:r,getValue:o,hoist:s}of R(e)){if(typeof r!="string")continue;let a=s?l.Self:l.build(r),i=this.#r(a,o);this.#t.set(a,i)}}#r(e,t){let r=this;return function*(){for(let[o,s]of j(t())){if(typeof o=="symbol")continue;let a=l.build(e,o),i=r.#e({key:e,keyPath:a,data:s})??null;i!==null&&(yield{key:e,keyPath:a,data:i})}}}*[Symbol.iterator](){for(let e of this.#t.values())for(let t of e())yield t}*getForKey(e){let t=this.#t.get(e);if(t)for(let r of t())yield r}get dataMap(){let e=new Map;for(let t of this)e.set(t.keyPath,t.data);return e}};y([(0,S.computed)({equals:S.comparer.shallow})],g.prototype,"dataMap",1);var d=require("mobx"),$=require("uuid");var F=Symbol("watch"),ce=x(F,()=>"@watch"),de=x(F,()=>"@watch.ref"),Q=Symbol("unwatch"),ye=x(Q,()=>!0),H=0;function he(n){(0,d.transaction)(()=>{++H;try{n()}finally{(0,d.autorun)(()=>--H)}})}var X=Object.freeze(Object.assign(ce,{ref:de})),Y=(...n)=>n.length===1&&typeof n[0]=="function"?he(n[0]):ye(...n),U=Symbol("watcher"),I=Symbol("watcher.internal"),b=class b{id=(0,$.v4)();#e=d.observable.box(!1);#t=d.observable.box(0n);#r=d.observable.set();#o=new Set;#n;static get(e){let t=this.getSafe(e);if(!t)throw new TypeError("target: Expected an object");return t}static getSafe(e){if(!e||typeof e!="object")return null;let t=e[U]??null;return t||(t=new this(I,e),Object.defineProperty(e,U,{value:t})),t}static get isWatching(){return H===0}constructor(e,t){if(e!==I)throw new Error("private constructor");this.#n=new g(t,r=>b.getSafe(r.data)),this.#d(t),this.#i(t),this.#c(t),this.#l(t),(0,d.makeObservable)(this)}get changedTick(){return this.#t.get()}get changed(){return this.changedTick>0n||this.#e.get()}get changedKeys(){return new Set(this.#r)}get changedKeyPaths(){let e=new Set(this.#r);for(let t of this.#n)for(let r of t.data.changedKeyPaths)e.add(l.build(t.keyPath,r));return e}get nested(){return this.#n.dataMap}reset(){this.#r.clear(),this.#t.set(0n),this.#e.set(!1);for(let e of this.#n)e.data.reset()}assumeChanged(){b.isWatching&&this.#e.set(!0)}#s(e){b.isWatching&&(0,d.runInAction)(()=>{this.#r.add(e),this.#a()})}#a(){b.isWatching&&(0,d.runInAction)(()=>{this.#t.set(this.#t.get()+1n)})}#l(e){for(let[t,r]of J(e))typeof t=="string"&&(this.#o.has(t)||(this.#o.add(t),(0,d.reaction)(()=>M(r()),()=>this.#s(l.build(t)))))}#i(e){for(let{key:t,getValue:r,hoist:o}of R(e))typeof t=="string"&&(this.#o.has(t)||(this.#o.add(t),(0,d.reaction)(()=>M(r()),()=>o?this.#a():this.#s(l.build(t))),(0,d.reaction)(()=>{let s=!1;for(let[,a]of j(r()))b.getSafe(a)?.changed&&(s=!0);return s},s=>s&&this.#a())))}#c(e){let t=K(e);if(!t)return;let r=t.getPropertyLike(F);if(r)for(let[o,s]of r){if(typeof o!="string"||this.#o.has(o))continue;this.#o.add(o);let a=s.data.at(-1)==="@watch",i=()=>o in e?e[o]:s.get?.();(0,d.reaction)(()=>a?M(i()):i(),()=>this.#s(l.build(o)))}}#d(e){let t=K(e);if(!t)return;let r=t.getPropertyLike(Q);if(r)for(let[o]of r)typeof o=="string"&&this.#o.add(o)}[I](){return{didChange:this.#s.bind(this)}}};y([d.computed],b.prototype,"changed",1),y([d.computed.struct],b.prototype,"changedKeys",1),y([d.computed.struct],b.prototype,"changedKeyPaths",1),y([d.action],b.prototype,"reset",1),y([d.action],b.prototype,"assumeChanged",1);var V=b;var c=require("mobx"),ee=require("uuid");var w=class extends Error{key;keyPath;message;cause;constructor(e){super(),this.key=l.getParentKey(e.keyPath),this.keyPath=e.keyPath,this.message=e.reason instanceof Error?e.reason.message:e.reason,this.cause=e.reason instanceof Error?e.reason:void 0}},P=class{#e=new E;invalidate(e,t){let r=l.build(e),o=new w({keyPath:r,reason:t});this.#e.set(r,o)}invalidateSelf(e){let t=l.Self,r=new w({keyPath:t,reason:e});this.#e.set(t,r)}get hasError(){return this.#e.size>0}static build(e){return e.#t()}#t(){return this.#e.toImmutable()}};var m=require("mobx");var D=Symbol(),v=class{scheduledRunDelayMs;#e;#t=m.observable.box("idle");#r=!1;#o=null;#n=null;#s=D;constructor(e){this.#e=e.handler,this.scheduledRunDelayMs=e.scheduledRunDelayMs,(0,m.makeObservable)(this)}get state(){return this.#t.get()}request(e,t){if(this.#s=e,t?.force){this.#i();return}switch(this.state){case"idle":{this.#i();break}case"running":{this.#r=!0;break}case"scheduled":{this.#a();break}}}reset(){this.#l(),this.#n?.abort(),this.#t.set("idle"),this.#s=D}#a(){(0,m.runInAction)(()=>{this.#t.set("scheduled")}),this.#o=+setTimeout(()=>{this.#i()},this.scheduledRunDelayMs)}#l(){this.#o&&(clearTimeout(this.#o),this.#o=null)}async#i(){this.#l(),this.#n?.abort();let e=new AbortController;this.#n=e;let t=this.#s;if(this.#s=D,t!==D){(0,m.runInAction)(()=>{this.#t.set("running")});try{await this.#e(t,e.signal)}catch(r){console.error(r)}}this.#n=null,(0,m.runInAction)(()=>{this.#r?(this.#r=!1,this.#a()):this.#t.set("idle")})}};y([m.action],v.prototype,"reset",1);var Z=Symbol("validator"),_=Symbol("validator.internal");function te(n,...e){if(typeof e[0]=="function"&&typeof e[1]=="function"){let[o,s,a]=e;return T.get(n).addAsyncHandler(o,s,a)}let[t,r]=e;return T.get(n).addSyncHandler(t,r)}var f=class f{static defaultDelayMs=100;id=(0,ee.v4)();#e=c.observable.map([],{equals:c.comparer.structural});#t;#r=c.observable.map();#o=new Map;#n=c.observable.set();static get(e){let t=this.getSafe(e);if(!t)throw new TypeError("target: Expected an object");return t}static getSafe(e){if(!e||typeof e!="object")return null;let t=e[Z]??null;return t||(t=new this(_,e),Object.defineProperty(e,Z,{value:t})),t}constructor(e,t){if(e!==_)throw new Error("private constructor");this.#t=new g(t,r=>f.getSafe(r.data)),(0,c.makeObservable)(this)}get isValid(){return this.invalidKeyPathCount===0}get invalidKeyCount(){return this.invalidKeys.size}get invalidKeys(){let e=new Set;for(let t of this.#e.values())for(let[,r]of t)e.add(l.build(r.key));return Object.freeze(e)}get invalidKeyPathCount(){return this.invalidKeyPaths.size}get invalidKeyPaths(){let e=new Set;for(let t of this.#e.values())for(let[r]of t)e.add(r);for(let[t,r]of this.nested)for(let o of r.invalidKeyPaths)e.add(l.build(t,o));return Object.freeze(e)}get firstErrorMessage(){for(let[,e]of this.findErrors(l.Self,!0))return e.message;return null}getErrorMessages(e,t=!1){let r=new Set;for(let[,o]of this.findErrors(e,t))r.add(o.message);return r}hasErrors(e,t=!1){for(let r of this.findErrors(e,t))return!0;return!1}*findErrors(e,t=!1){yield*this.#s(e,t,!1)}*#s(e,t,r){if(l.isSelf(e)){if(r)for(let o of this.#e.values())for(let s of o.findExact(l.Self))yield[l.Self,s];else for(let o of this.#e.values())for(let[s,a]of o)yield[s,a];if(t)for(let[o,s]of this.nested)for(let[a,i]of s.#s(l.Self,!0,r))yield[l.build(o,a),i];else if(!r)for(let o of this.#t){let s=o.key===l.Self,a=o.keyPath===o.key;if(s||a)for(let[i,h]of o.data.#s(l.Self,!1,!s||!a))yield[l.build(o.keyPath,i),h]}}else{for(let o of this.#e.values()){let s=t?o.findPrefix(e):o.findExact(e);for(let a of s)yield[a.keyPath,a]}e:for(let o of l.getAncestors(e,!0))for(let s of this.#t.getForKey(o)){let a=t&&s.key!==s.keyPath&&l.getRelative(s.keyPath,s.key)?l.Self:l.getRelative(e,s.keyPath);if(a){for(let[i,h]of s.data.#s(a,t,r))yield[l.build(s.keyPath,i),h];break e}}}}get reactionState(){return this.#r.size}get asyncState(){let e=0;for(let t of this.#n)t.state!=="idle"&&e++;return e}get isValidating(){return this.reactionState>0||this.asyncState>0}get nested(){return this.#t.dataMap}reset(){this.#r.clear();for(let e of this.#o.values())e();for(let e of this.#n)e.reset();this.#e.clear()}updateErrors(e,t){let r=new P;t(r);let o=P.build(r);return o.size>0?this.#e.set(e,o):this.#e.delete(e),()=>{this.#e.delete(e)}}addSyncHandler(e,t){let r=Symbol();return this.#a({key:r,opt:t,expr:()=>{let o=new P;return e(o),P.build(o)},effect:o=>{o.size>0?this.#e.set(r,o):this.#e.delete(r)}})}addAsyncHandler(e,t,r){let o=r?.delayMs??f.defaultDelayMs,s=Symbol(),a=new v({handler:async(i,h)=>{let p=new P;try{await t(i,p,h)}finally{(0,c.runInAction)(()=>{let N=P.build(p);N.size>0?this.#e.set(s,N):this.#e.delete(s)})}},scheduledRunDelayMs:o});return this.#n.add(a),this.#a({key:s,opt:r,expr:e,effect:i=>{a.request(i)},dispose:()=>{a.reset(),this.#n.delete(a)}})}#a(e){let t=e.opt?.delayMs??f.defaultDelayMs,r=e.opt?.initialRun??!0,o=(0,c.reaction)(e.expr,s=>{!r&&!this.#r.has(e.key)||(r=!1,this.#r.delete(e.key),e.effect(s))},{fireImmediately:e.opt?.initialRun??!0,scheduler:s=>{let a=+setTimeout(s,t);(0,c.runInAction)(()=>{this.#r.set(e.key,a)}),this.#o.set(e.key,()=>{clearTimeout(a),this.#o.delete(e.key),s()})}});return()=>{o();let s=this.#r.get(e.key);s&&clearTimeout(s),(0,c.runInAction)(()=>{this.#r.delete(e.key),this.#o.delete(e.key);try{e.dispose?.()}finally{this.#e.delete(e.key)}})}}};y([c.computed],f.prototype,"isValid",1),y([c.computed],f.prototype,"invalidKeyCount",1),y([c.computed.struct],f.prototype,"invalidKeys",1),y([c.computed],f.prototype,"invalidKeyPathCount",1),y([c.computed.struct],f.prototype,"invalidKeyPaths",1),y([c.computed],f.prototype,"firstErrorMessage",1),y([c.computed],f.prototype,"reactionState",1),y([c.computed],f.prototype,"asyncState",1),y([c.computed],f.prototype,"isValidating",1),y([c.action],f.prototype,"reset",1),y([c.action],f.prototype,"updateErrors",1),y([c.action],f.prototype,"addAsyncHandler",1);var T=f;0&&(module.exports={KeyPath,StandardNestedFetcher,ValidationError,Validator,Watcher,makeValidatable,nested,unwatch,watch}); //# sourceMappingURL=index.js.map