@stacksjs/events 0.75.207 → 0.75.210

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +4 -1
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{existsSync as _,readdirSync as ne,statSync as te}from"fs";import{extname as re,join as k,resolve as se}from"path";import M from"process";function oe(e){return e}async function U(e={}){let n=e.dir??k(M.cwd(),"app","Listeners"),t=e.extensions??[".ts",".js"],r={warn:e.log?.warn??((i)=>console.warn(i)),error:e.log?.error??((i)=>console.error(i)),info:e.log?.info??((i)=>console.info(i))};if(!_(n))return 0;let s=V(n,t);if(s.length===0)return 0;let o=0;for(let i of s)try{let u=await import(i),v=u?.default??u;if(typeof v==="function")continue;if(!ie(v)){r.warn(`[events/discover] ${i}: default export doesn't match ListenerModule shape ({ listensTo, handle }), skipping`);continue}for(let E of ae(v.listensTo)){if(!G(E,i))continue;W(E,(b)=>v.handle(b,E)),o++}}catch(u){r.error(`[events/discover] failed to import ${i}: ${u instanceof Error?u.message:String(u)}`)}if(o>0)r.info(`[events/discover] registered ${o} listener${o===1?"":"s"} from ${n}`);return o}function V(e,n){let t=[],r=ne(e);for(let s of r){let o=k(e,s),i=te(o);if(i.isDirectory())t.push(...V(o,n));else if(i.isFile()&&n.includes(re(s)))t.push(o)}return t}function ie(e){let n=e?.listensTo;return!!e&&typeof e==="object"&&(typeof n==="string"||Array.isArray(n))&&typeof e.handle==="function"}function ae(e){return(Array.isArray(e)?e:[e]).map((t)=>String(t).trim()).filter(Boolean)}var I=Symbol.for("stacks.events.claimedListeners"),C=globalThis[I]??(globalThis[I]=new Set);function G(e,n){let t=`${e}\x00${n}`;if(C.has(t))return!1;return C.add(t),!0}function ce(){C.clear(),delete x()[R],x()[K]=J}var R=Symbol.for("stacks.events.appListenersBoot"),K=Symbol.for("stacks.events.dispatchObserver");function x(){return globalThis}function O(){return x()[R]!==void 0}function de(e={}){let n=x(),t=n[R];if(t)return t;let r=(async()=>{let s=e.base??M.cwd(),o=await q(e);if(o===0){let i=await Y(s);if(i>0)(e.log?.warn??((v)=>console.warn(v)))(`[events] app/Events.ts declares ${i} listener${i===1?"":"s"}, but none could be registered in this process, so the events they handle will reach nobody. See the errors above.`)}return o})();return n[R]=r,r}async function Y(e){let n=["ts","js"].map((t)=>k(e,"app",`Events.${t}`)).find((t)=>_(t));if(!n)return 0;try{let t=await import(n),r=t?.default??t;if(!r||typeof r!=="object")return 0;return Object.values(r).flatMap((s)=>Array.isArray(s)?s:[s]).filter((s)=>typeof s==="string"&&s.trim()!=="").length}catch{return 0}}function J(e){let n=x();if(delete n[K],O())return;let t=M.cwd();Y(t).then((r)=>{if(r===0||O())return;console.warn(`[events] "${e}" was dispatched, but this process never registered the application's listeners, so nothing handles it or any later event (app/Events.ts declares ${r}). An entry point that runs application code must call injectGlobalAutoImports() from @stacksjs/server, or bootAppListeners() from @stacksjs/events, before its first dispatch.`)})}if(!x()[K]&&!O())x()[K]=J;async function q(e={}){let n=e.base??M.cwd(),t={warn:e.log?.warn??((s)=>console.warn(s)),error:e.log?.error??((s)=>console.error(s)),info:e.log?.info??((s)=>console.info(s))},r=0;if(r+=await le(n,t),r+=await U({...e,dir:e.dir??k(n,"app","Listeners"),log:{...t,info:()=>{}}}),r>0)t.info(`[events] registered ${r} listener${r===1?"":"s"}`);return r}async function le(e,n){let t=["ts","js"].map((o)=>k(e,"app",`Events.${o}`)).find((o)=>_(o));if(!t)return 0;let r;try{let o=await import(t);r=o?.default??o}catch(o){return n.error(`[events] failed to read ${t}: ${o instanceof Error?o.message:String(o)}`),0}if(!r||typeof r!=="object")return 0;let s=0;for(let[o,i]of Object.entries(r))for(let u of Array.isArray(i)?i:[i]){if(typeof u!=="string"||!u.trim())continue;let v=await pe(e,u.trim());if(!v){n.warn(`[events] ${o}: no listener or action called ${u}`);continue}if(!G(o,v.id))continue;let{handle:E,validations:b}=v;W(o,(T)=>(ue(o,u,T,b,n),E(T,o))),s++}return s}function ue(e,n,t,r,s){if(!r||typeof t!=="object"||t===null)return;let o=t,i=[];for(let[u,v]of Object.entries(r)){let E=v?.rule?.validate;if(typeof E!=="function")continue;try{if(!E(o[u]).valid)i.push(u)}catch{i.push(u)}}if(i.length)s.warn(`[events] ${e}: payload does not match what ${n} declares (${i.join(", ")})`)}var j=new Map;async function F(e,n,t){let r=`${e}:${n}`,s=j.get(r);if(s)return s;let o=(async()=>{try{let i=k(e,"storage","framework","auto-imports"),v=(await import(k(i,`${n}.ts`)))[t];if(!v)return null;return Object.fromEntries(Object.entries(v).map(([E,b])=>[E,se(i,b)]))}catch{return null}})();return j.set(r,o),o}async function fe(e,n){let t=await F(e,"listeners","listeners"),r=await F(e,"actions","actions");if(!t&&!r)return null;return t?.[n]??r?.[`Actions/${n}`]??null}function ye(){j.clear()}function ve(e){let n=[k(e,"app"),k(e,"storage","framework","defaults","app")];try{let t=Bun.resolveSync("@stacksjs/defaults/package.json",e);n.push(k(t.slice(0,t.lastIndexOf("/")),"app"))}catch{}return n.filter((t)=>_(t))}async function pe(e,n){let t=[],r=await fe(e,n);if(r)t.push(r);for(let s of ve(e))for(let o of["Listeners","Actions"])for(let i of["ts","js"])t.push(k(s,o,`${n}.${i}`));for(let s of t){if(!_(s))continue;try{let o=await import(s),i=o?.default??o,u=i?.handle;if(typeof u!=="function")continue;return{id:s,handle:u.bind(i),validations:i?.validations}}catch{continue}}return null}var z=Symbol.for("stacks.events.handler.error"),Z=Symbol.for("stacks.events.handler.priority");function ge(e){if(e&&typeof e==="object"||typeof e==="function"){let n=e[Z];return typeof n==="number"&&Number.isFinite(n)?n:0}return 0}function H(e){if(e.length<2)return e;return e.map((n,t)=>({h:n,i:t,p:ge(n)})).sort((n,t)=>t.p-n.p||n.i-t.i).map((n)=>n.h)}function S(e,n,t){console.error(`[Events] ${e} for '${String(n)}':`,t)}function L(e){return!!e&&typeof e.catch==="function"}function N(e){let n=e??new Map,t=new WeakMap,r=(a,y,d)=>{let f=t.get(d),p=f?.key===a?f.re:void 0;if(!p)p=new RegExp(`^${a.replace(/\*/g,".*")}$`),t.set(d,{key:a,re:p});return p.test(y)};function s(a,y,d){if(d?.priority!==void 0&&Number.isFinite(d.priority))y[Z]=d.priority;let f=n.get(a);if(f)f.push(y);else n.set(a,[y])}function o(a,y){let d=(...f)=>(i(a,d),y(...f));d[z]=y,s(a,d)}function i(a,y){let d=n.get(a);if(!d)return;if(!y){n.set(a,[]);return}for(let f=d.length-1;f>=0;f--){let p=d[f];if(p===y||p?.[z]===y)d.splice(f,1)}}function u(a){if(a===void 0)n.clear();else n.delete(a)}function v(a){return n.get(a)?.length??0}function E(a,y){let d=n.get(a)?.slice(),f=n.get("*")?.slice(),p=d?H(d):void 0,h=f?H(f):void 0;if(p)for(let m of p)try{let c=m(y);if(L(c))c.catch((l)=>S("Async handler error",a,l))}catch(c){S("Handler error",a,c)}let g=String(a);if(n.forEach((m,c)=>{let l=String(c);if(l===g||l==="*"||!l.includes("*"))return;if(r(l,g,m))for(let A of H(m.slice()))try{let P=A(a,y);if(L(P))P.catch((ee)=>S(`Async pattern handler '${l}' error`,a,ee))}catch(P){S(`Pattern handler '${l}' error`,a,P)}}),h)for(let m of h)try{let c=m(a,y);if(L(c))c.catch((l)=>S("Async wildcard handler error",a,l))}catch(c){S("Wildcard handler error",a,c)}}async function b(a,y){let d=[],f=async(g,m)=>{if(!g)return;for(let c of H(g.slice()))try{let l=m?c(a,y):c(y);d.push(L(l)?await l:l)}catch(l){S("Awaited handler error",a,l),d.push(void 0)}};await f(n.get(a),!1);let p=String(a),h=[];n.forEach((g,m)=>{let c=String(m);if(c===p||c==="*"||!c.includes("*"))return;if(r(c,p,g))h.push(c)});for(let g of h)await f(n.get(g),!0);return await f(n.get("*"),!0),d}async function T(a,y){let d=[],f=async(g,m)=>{if(!g)return;for(let c of H(g.slice()))try{let l=m?c(a,y):c(y),A=L(l)?await l:l;d.push({ok:!0,value:A})}catch(l){let A=l instanceof Error?l:Error(String(l));d.push({ok:!1,error:A})}};await f(n.get(a),!1);let p=String(a),h=[];n.forEach((g,m)=>{let c=String(m);if(c===p||c==="*"||!c.includes("*"))return;if(r(c,p,g))h.push(c)});for(let g of h)await f(n.get(g),!0);return await f(n.get("*"),!0),d}return{all:n,on:s,once:o,off:i,emit:E,emitAsync:b,emitAndCollect:T,removeAllListeners:u,listenerCount:v}}var Ae=N,je=N;function me(e,n){let t=(r)=>`${n}:${r}`;return{on(r,s,o){e.on(t(r),s,o)},once(r,s){e.once(t(r),s)},off(r,s){e.off(t(r),s)},emit(r,s){e.emit(t(r),s)},emitAsync(r,s){return e.emitAsync(t(r),s)},emitAndCollect(r,s){return e.emitAndCollect(t(r),s)},listenerCount(r){return e.listenerCount(t(r))}}}function _e(e){return e}var Q=Symbol.for("stacks.events.emitter"),X=globalThis,D=X[Q]??(X[Q]=N()),w=D,He=D,Ee=Symbol.for("stacks.events.dispatchObserver");function B(e){let n=globalThis[Ee];if(n)n(String(e))}var ke=(e,n)=>(B(e),w.emit(e,n)),Le=(e,n)=>(B(e),w.emitAsync(e,n)),Te=(e,n)=>(B(e),w.emitAndCollect(e,n)),Pe=ke,{all:Re,on:W,on:Ke,once:$e,off:Oe}=w;function Me(e){return me(D,e)}export{Re as all,O as appListenersBooted,de as bootAppListeners,N as createEmitter,je as default,_e as defineEvents,oe as defineListener,U as discoverListeners,ke as dispatch,Te as dispatchAndCollect,Le as dispatchAsync,w as emitter,D as events,W as listen,Ae as mitt,Oe as off,$e as once,q as registerAppListeners,ce as resetListenerRegistry,ye as resetNameRegistries,me as scope,Me as scopedEvents,Pe as useEvent,He as useEvents,Ke as useListen};
2
+ import{existsSync as _,readdirSync as ie,statSync as ae}from"fs";import{extname as ce,join as k}from"path";import M from"process";import{existsSync as re}from"fs";import{isAbsolute as se,resolve as I}from"path";import{fileURLToPath as oe}from"url";function U(e,n){if(e.startsWith("file:"))return oe(e);if(e.startsWith(".")||se(e))return I(n,e);if(e.startsWith("@"))return Bun.resolveSync(e,n);let t=I(n,e);if(re(t))return t;return Bun.resolveSync(e,n)}function de(e){return e}async function G(e={}){let n=e.dir??k(M.cwd(),"app","Listeners"),t=e.extensions??[".ts",".js"],r={warn:e.log?.warn??((i)=>console.warn(i)),error:e.log?.error??((i)=>console.error(i)),info:e.log?.info??((i)=>console.info(i))};if(!_(n))return 0;let s=Y(n,t);if(s.length===0)return 0;let o=0;for(let i of s)try{let d=await import(i),v=d?.default??d;if(typeof v==="function")continue;if(!le(v)){r.warn(`[events/discover] ${i}: default export doesn't match ListenerModule shape ({ listensTo, handle }), skipping`);continue}for(let E of ue(v.listensTo)){if(!J(E,i))continue;W(E,(b)=>v.handle(b,E)),o++}}catch(d){r.error(`[events/discover] failed to import ${i}: ${d instanceof Error?d.message:String(d)}`)}if(o>0)r.info(`[events/discover] registered ${o} listener${o===1?"":"s"} from ${n}`);return o}function Y(e,n){let t=[],r=ie(e);for(let s of r){let o=k(e,s),i=ae(o);if(i.isDirectory())t.push(...Y(o,n));else if(i.isFile()&&n.includes(ce(s)))t.push(o)}return t}function le(e){let n=e?.listensTo;return!!e&&typeof e==="object"&&(typeof n==="string"||Array.isArray(n))&&typeof e.handle==="function"}function ue(e){return(Array.isArray(e)?e:[e]).map((t)=>String(t).trim()).filter(Boolean)}var F=Symbol.for("stacks.events.claimedListeners"),C=globalThis[F]??(globalThis[F]=new Set);function J(e,n){let t=`${e}\x00${n}`;if(C.has(t))return!1;return C.add(t),!0}function fe(){C.clear(),delete S()[R],S()[K]=z}var R=Symbol.for("stacks.events.appListenersBoot"),K=Symbol.for("stacks.events.dispatchObserver");function S(){return globalThis}function O(){return S()[R]!==void 0}function ye(e={}){let n=S(),t=n[R];if(t)return t;let r=(async()=>{let s=e.base??M.cwd(),o=await Q(e);if(o===0){let i=await q(s);if(i>0)(e.log?.warn??((v)=>console.warn(v)))(`[events] app/Events.ts declares ${i} listener${i===1?"":"s"}, but none could be registered in this process, so the events they handle will reach nobody. See the errors above.`)}return o})();return n[R]=r,r}async function q(e){let n=["ts","js"].map((t)=>k(e,"app",`Events.${t}`)).find((t)=>_(t));if(!n)return 0;try{let t=await import(n),r=t?.default??t;if(!r||typeof r!=="object")return 0;return Object.values(r).flatMap((s)=>Array.isArray(s)?s:[s]).filter((s)=>typeof s==="string"&&s.trim()!=="").length}catch{return 0}}function z(e){let n=S();if(delete n[K],O())return;let t=M.cwd();q(t).then((r)=>{if(r===0||O())return;console.warn(`[events] "${e}" was dispatched, but this process never registered the application's listeners, so nothing handles it or any later event (app/Events.ts declares ${r}). An entry point that runs application code must call injectGlobalAutoImports() from @stacksjs/server, or bootAppListeners() from @stacksjs/events, before its first dispatch.`)})}if(!S()[K]&&!O())S()[K]=z;async function Q(e={}){let n=e.base??M.cwd(),t={warn:e.log?.warn??((s)=>console.warn(s)),error:e.log?.error??((s)=>console.error(s)),info:e.log?.info??((s)=>console.info(s))},r=0;if(r+=await ve(n,t),r+=await G({...e,dir:e.dir??k(n,"app","Listeners"),log:{...t,info:()=>{}}}),r>0)t.info(`[events] registered ${r} listener${r===1?"":"s"}`);return r}async function ve(e,n){let t=["ts","js"].map((o)=>k(e,"app",`Events.${o}`)).find((o)=>_(o));if(!t)return 0;let r;try{let o=await import(t);r=o?.default??o}catch(o){return n.error(`[events] failed to read ${t}: ${o instanceof Error?o.message:String(o)}`),0}if(!r||typeof r!=="object")return 0;let s=0;for(let[o,i]of Object.entries(r))for(let d of Array.isArray(i)?i:[i]){if(typeof d!=="string"||!d.trim())continue;let v=await ke(e,d.trim());if(!v){n.warn(`[events] ${o}: no listener or action called ${d}`);continue}if(!J(o,v.id))continue;let{handle:E,validations:b}=v;W(o,(A)=>(pe(o,d,A,b,n),E(A,o))),s++}return s}function pe(e,n,t,r,s){if(!r||typeof t!=="object"||t===null)return;let o=t,i=[];for(let[d,v]of Object.entries(r)){let E=v?.rule?.validate;if(typeof E!=="function")continue;try{if(!E(o[d]).valid)i.push(d)}catch{i.push(d)}}if(i.length)s.warn(`[events] ${e}: payload does not match what ${n} declares (${i.join(", ")})`)}var j=new Map;async function V(e,n,t){let r=`${e}:${n}`,s=j.get(r);if(s)return s;let o=(async()=>{let i=k(e,"storage","framework","auto-imports"),d=k(i,`${n}.ts`);if(!_(d))return null;let E=(await import(d))[t];if(!E)throw Error(`Invalid ${t} registry: ${d}`);return Object.fromEntries(Object.entries(E).map(([b,A])=>[b,U(A,i)]))})();return j.set(r,o),o}async function ge(e,n){let t=await V(e,"listeners","listeners"),r=await V(e,"actions","actions");if(!t&&!r)return null;return t?.[n]??r?.[`Actions/${n}`]??null}function me(){j.clear()}function Ee(e){let n=[k(e,"app"),k(e,"storage","framework","defaults","app")];try{let t=Bun.resolveSync("@stacksjs/defaults/package.json",e);n.push(k(t.slice(0,t.lastIndexOf("/")),"app"))}catch{}return n.filter((t)=>_(t))}async function ke(e,n){let t=[],r=await ge(e,n);if(r)t.push(r);for(let s of Ee(e))for(let o of["Listeners","Actions"])for(let i of["ts","js"])t.push(k(s,o,`${n}.${i}`));for(let s of t){if(!_(s))continue;try{let o=await import(s),i=o?.default??o,d=i?.handle;if(typeof d!=="function")continue;return{id:s,handle:d.bind(i),validations:i?.validations}}catch{continue}}return null}var X=Symbol.for("stacks.events.handler.error"),ne=Symbol.for("stacks.events.handler.priority");function he(e){if(e&&typeof e==="object"||typeof e==="function"){let n=e[ne];return typeof n==="number"&&Number.isFinite(n)?n:0}return 0}function L(e){if(e.length<2)return e;return e.map((n,t)=>({h:n,i:t,p:he(n)})).sort((n,t)=>t.p-n.p||n.i-t.i).map((n)=>n.h)}function x(e,n,t){console.error(`[Events] ${e} for '${String(n)}':`,t)}function T(e){return!!e&&typeof e.catch==="function"}function N(e){let n=e??new Map,t=new WeakMap,r=(a,y,l)=>{let f=t.get(l),p=f?.key===a?f.re:void 0;if(!p)p=new RegExp(`^${a.replace(/\*/g,".*")}$`),t.set(l,{key:a,re:p});return p.test(y)};function s(a,y,l){if(l?.priority!==void 0&&Number.isFinite(l.priority))y[ne]=l.priority;let f=n.get(a);if(f)f.push(y);else n.set(a,[y])}function o(a,y){let l=(...f)=>(i(a,l),y(...f));l[X]=y,s(a,l)}function i(a,y){let l=n.get(a);if(!l)return;if(!y){n.set(a,[]);return}for(let f=l.length-1;f>=0;f--){let p=l[f];if(p===y||p?.[X]===y)l.splice(f,1)}}function d(a){if(a===void 0)n.clear();else n.delete(a)}function v(a){return n.get(a)?.length??0}function E(a,y){let l=n.get(a)?.slice(),f=n.get("*")?.slice(),p=l?L(l):void 0,h=f?L(f):void 0;if(p)for(let m of p)try{let c=m(y);if(T(c))c.catch((u)=>x("Async handler error",a,u))}catch(c){x("Handler error",a,c)}let g=String(a);if(n.forEach((m,c)=>{let u=String(c);if(u===g||u==="*"||!u.includes("*"))return;if(r(u,g,m))for(let H of L(m.slice()))try{let P=H(a,y);if(T(P))P.catch((te)=>x(`Async pattern handler '${u}' error`,a,te))}catch(P){x(`Pattern handler '${u}' error`,a,P)}}),h)for(let m of h)try{let c=m(a,y);if(T(c))c.catch((u)=>x("Async wildcard handler error",a,u))}catch(c){x("Wildcard handler error",a,c)}}async function b(a,y){let l=[],f=async(g,m)=>{if(!g)return;for(let c of L(g.slice()))try{let u=m?c(a,y):c(y);l.push(T(u)?await u:u)}catch(u){x("Awaited handler error",a,u),l.push(void 0)}};await f(n.get(a),!1);let p=String(a),h=[];n.forEach((g,m)=>{let c=String(m);if(c===p||c==="*"||!c.includes("*"))return;if(r(c,p,g))h.push(c)});for(let g of h)await f(n.get(g),!0);return await f(n.get("*"),!0),l}async function A(a,y){let l=[],f=async(g,m)=>{if(!g)return;for(let c of L(g.slice()))try{let u=m?c(a,y):c(y),H=T(u)?await u:u;l.push({ok:!0,value:H})}catch(u){let H=u instanceof Error?u:Error(String(u));l.push({ok:!1,error:H})}};await f(n.get(a),!1);let p=String(a),h=[];n.forEach((g,m)=>{let c=String(m);if(c===p||c==="*"||!c.includes("*"))return;if(r(c,p,g))h.push(c)});for(let g of h)await f(n.get(g),!0);return await f(n.get("*"),!0),l}return{all:n,on:s,once:o,off:i,emit:E,emitAsync:b,emitAndCollect:A,removeAllListeners:d,listenerCount:v}}var Oe=N,Ge=N;function we(e,n){let t=(r)=>`${n}:${r}`;return{on(r,s,o){e.on(t(r),s,o)},once(r,s){e.once(t(r),s)},off(r,s){e.off(t(r),s)},emit(r,s){e.emit(t(r),s)},emitAsync(r,s){return e.emitAsync(t(r),s)},emitAndCollect(r,s){return e.emitAndCollect(t(r),s)},listenerCount(r){return e.listenerCount(t(r))}}}function Me(e){return e}var Z=Symbol.for("stacks.events.emitter"),ee=globalThis,B=ee[Z]??(ee[Z]=N()),w=B,Ce=B,be=Symbol.for("stacks.events.dispatchObserver");function D(e){let n=globalThis[be];if(n)n(String(e))}var Se=(e,n)=>(D(e),w.emit(e,n)),je=(e,n)=>(D(e),w.emitAsync(e,n)),We=(e,n)=>(D(e),w.emitAndCollect(e,n)),Ne=Se,{all:Be,on:W,on:De,once:Ie,off:Ue}=w;function Fe(e){return we(B,e)}export{Be as all,O as appListenersBooted,ye as bootAppListeners,N as createEmitter,Ge as default,Me as defineEvents,de as defineListener,G as discoverListeners,Se as dispatch,We as dispatchAndCollect,je as dispatchAsync,w as emitter,B as events,W as listen,Oe as mitt,Ue as off,Ie as once,Q as registerAppListeners,fe as resetListenerRegistry,me as resetNameRegistries,we as scope,Fe as scopedEvents,Ne as useEvent,Ce as useEvents,De as useListen};
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@stacksjs/events",
3
3
  "type": "module",
4
4
  "sideEffects": false,
5
- "version": "0.75.207",
5
+ "version": "0.75.210",
6
6
  "description": "Functional event emitting.",
7
7
  "author": "Chris Breuer",
8
8
  "contributors": [
@@ -61,5 +61,8 @@
61
61
  },
62
62
  "devDependencies": {
63
63
  "better-dx": "^0.2.24"
64
+ },
65
+ "dependencies": {
66
+ "@stacksjs/path": "0.75.210"
64
67
  }
65
68
  }