UNPKG

@harlem/core

Version:

Powerfully simple global state management for Vue 3

2 lines (1 loc) 5.85 kB
function W(){let o=new Map;function m(c,u){let l=o.get(c)||new Set;return l.add(u),o.set(c,l),{dispose:()=>p(c,u)}}function p(c,u){let l=o.get(c);l&&(l.delete(u),l.size||o.delete(c))}function P(c,u){let l=E=>{u(E),p(c,l)};return m(c,l)}function x(c,u){let l=o.get(c);l&&l.forEach(E=>E(u))}return{on:m,off:p,once:P,emit:x}}import{objectClone as _}from"@harlem/utilities";var g="core",e={core:{installed:"core:installed"},store:{created:"store:created",ready:"store:ready",destroyed:"store:destroyed"},mutation:{before:"mutation:before",after:"mutation:after",success:"mutation:success",error:"mutation:error"},action:{before:"action:before",after:"action:after",success:"action:success",error:"action:error"},ssr:{initServer:"ssr:init:server",initClient:"ssr:init:client"},devtools:{update:"devtools:update",reset:"devtools:reset"}},z={snapshot:"core:snapshot",reset:"core:reset"},q={read:o=>o,write:o=>o,payload:o=>_(o)},tt={prefix:"$harlem:",pattern:/^\$harlem:/};import{computed as et,effectScope as rt,reactive as nt,readonly as ot}from"vue";import{functionIdentity as X,objectClone as J,objectFromPath as st,objectSet as at,objectTrace as it}from"@harlem/utilities";function Y(o,m){return p=>{p&&p.store===o&&m(p)}}function K(o,m,p,P){var Q;let{allowsOverwrite:x,producers:c}={allowsOverwrite:!0,...P,producers:{...q,...P==null?void 0:P.producers}},u={},l=new Map,E=rt(),a=new Set,i=!1,f=nt(m),v=ot(f),R;function A(t,r,s){if(!E.active||i)return;let d={data:s,sender:r,store:o};p.emit(t,d)}function n(t,r){return p.on(t,Y(o,r))}function O(t,r){return p.once(t,Y(o,r))}function y(t){return E.run(t)}function N(t,r){var s;return!!((s=u[t])!=null&&s.has(r))}function V(t,r){var s;return(s=u[t])==null?void 0:s.get(r)}function B(t,r,s,d="other"){if(!r)throw new Error("Registration name cannot be empty");if(t in u||(u[t]=new Map),!x&&N(t,r))throw new Error(`A ${t} named ${r} has already been registered on this store`);u[t].set(r,{type:d,producer:s})}function j(t,r){var s;(s=u[t])==null||s.delete(r)}function D(t){i=!0;try{return t()}finally{i=!1}}function $(t,r){let s=y(()=>et(()=>r(v)));return B("getters",t,()=>s.value,"computed"),s}function C(t,r,s,d){var w,b;if(!E.active)throw new Error("The current store has been destroyed. Mutations can no longer take place.");if(a.has(t))throw new Error("Circular mutation reference detected. Avoid calling mutations inside other mutations to prevent circular references.");a.add(t);let S,h=T=>A(T,r,{name:t,payload:d,result:S});h(e.mutation.before);try{let T=(w=c.write(f))!=null?w:f,L=(b=c.payload(d))!=null?b:d;S=s(T,L),h(e.mutation.success)}catch(T){throw h(e.mutation.error),T}finally{a.delete(t),h(e.mutation.after)}return S}function U(t,r){let s=d=>C(t,g,r,d);return B("mutations",t,()=>s),s}function F(t,r){let s=S=>M(t,g,S),d=async S=>{var b;let h,w=T=>A(T,g,{name:t,payload:S,result:h});w(e.action.before);try{let T=(b=c.payload(S))!=null?b:S;h=await r(T,s),w(e.action.success)}catch(T){throw w(e.action.error),T}finally{w(e.action.after)}return h};return B("actions",t,()=>d),d}function k(){let t=J(m),{value:r,getNodes:s,resetNodes:d}=it();return{apply:(h=X,w=z.snapshot)=>{M(w,g,b=>{if(!t)return console.warn("Couldn't find snapshot for this operation!");d(),h(r);let T=s(),L=st(t,T);at(b,T,J(L))})},get state(){return J(t)}}}function I(t=X){R==null||R.apply(t,z.reset)}function M(t,r,s,d){let S=()=>C(t,r,s,void 0);return d?D(S):S()}function G(){E.stop()}O(e.store.ready,()=>R=k()),n(e.devtools.reset,()=>I());let H=(Q=c.read(v))!=null?Q:v;return{name:o,allowsOverwrite:x,flags:l,producers:c,registrations:u,on:n,once:O,emit:A,state:H,getter:$,mutation:U,action:F,write:M,snapshot:k,reset:I,register:B,unregister:j,hasRegistration:N,getRegistration:V,track:y,suppress:D,destroy:G}}import{matchGetFilter as ct,objectLock as ut,typeIsFunction as lt,typeIsMatchable as dt}from"@harlem/utilities";function Z(){let o=W(),m=new Map,p=!1;function P(a){let i=m.get(a);if(i&&!i.allowsOverwrite)throw new Error(`A store named ${a} has already been registered.`)}function x(a,i){let f=()=>{a.emit(e.ssr.initClient,g,i),a.emit(e.store.created,g,i),a.emit(e.ssr.initServer,g,i),a.emit(e.store.ready,g,i),a.emit(e.devtools.update,g,i)};if(p)return f();o.once(e.core.installed,f)}function c(a,i){return i.reduce((f,v)=>{let R={};try{R=v(a)||{}}catch(A){R={}}return{...f,...R}},{})}function u(a,i){if(!lt(a))return;let f=ut(m,["set","delete","clear"]);try{a(i,o,f)}catch(v){console.warn("Failed to install Harlem plugin. Skipping.")}}function l(a,i,f){let{allowsOverwrite:v,producers:R,extensions:A}={allowsOverwrite:!0,extensions:[],...f};P(a);let n=K(a,i,o,{allowsOverwrite:v,producers:R}),O=()=>{m.delete(a),n.destroy(),n.emit(e.store.destroyed,g,i),n.emit(e.devtools.update,g,i)},y=k=>(I,M)=>{let G=ct(dt(I)?I:{include:I});return n.on(k,H=>{H&&G(H.data.name)&&M(H.data)})},N=y(e.mutation.before),V=y(e.mutation.after),B=y(e.mutation.success),j=y(e.mutation.error),D=y(e.action.before),$=y(e.action.after),C=y(e.action.success),U=y(e.action.error),F=c(n,A);return m.set(a,n),x(n,i),{destroy:O,onBeforeMutation:N,onAfterMutation:V,onMutationSuccess:B,onMutationError:j,onBeforeAction:D,onAfterAction:$,onActionSuccess:C,onActionError:U,state:n.state,getter:n.getter.bind(n),mutation:n.mutation.bind(n),action:n.action.bind(n),snapshot:n.snapshot.bind(n),reset:n.reset.bind(n),suppress:n.suppress.bind(n),on:n.on.bind(n),once:n.once.bind(n),...F}}function E(a){return{install(i){let{plugins:f}={plugins:[],...a};f&&f.forEach(v=>u(v,i)),p=!0,o.emit(e.core.installed)}}}return{createVuePlugin:E,createStore:l,on:o.on,once:o.once,off:o.off}}var{on:Pt,off:bt,once:xt,createVuePlugin:At,createStore:Bt}=Z();typeof window!="undefined"&&(window.$harlem={createInstance:Z});export{e as EVENTS,tt as INTERNAL,q as PRODUCERS,Z as createInstance,Bt as createStore,At as createVuePlugin,bt as off,Pt as on,xt as once};