@stacksjs/events 0.75.423 → 0.75.431
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.
- package/dist/index.d.ts +9 -0
- package/dist/index.js +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -249,6 +249,15 @@ export type EventHandlerMap<Events extends EventMap> = Map<
|
|
|
249
249
|
keyof Events | '*',
|
|
250
250
|
EventHandlerList<Events[keyof Events]> | WildCardEventHandlerList<Events>
|
|
251
251
|
>;
|
|
252
|
+
/**
|
|
253
|
+
* Explicit priorities (stacksjs/stacks#1878 E-2), per event bucket and then
|
|
254
|
+
* per handler. They used to be written onto the handler function, so one
|
|
255
|
+
* handler registered for two events had one priority for both: the last
|
|
256
|
+
* `on()` set it everywhere, including on a registration that passed none.
|
|
257
|
+
* Keyed on the bucket array, so the handler lists keep holding the
|
|
258
|
+
* handlers themselves and `off()` keeps comparing identities.
|
|
259
|
+
*/
|
|
260
|
+
declare type Priorities = WeakMap<object, Map<unknown, number>>;
|
|
252
261
|
/**
|
|
253
262
|
* Application-wide event types, in precedence order.
|
|
254
263
|
*
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{existsSync as _,readdirSync as ie,statSync as ae}from"fs";import{extname as ce,join as
|
|
2
|
+
import{existsSync as _,readdirSync as ie,statSync as ae}from"fs";import{extname as ce,join as h}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??h(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=J(n,t);if(s.length===0)return 0;let o=0;for(let i of s)try{let l=await import(i),p=l?.default??l;if(typeof p==="function")continue;if(!le(p)){r.warn(`[events/discover] ${i}: default export doesn't match ListenerModule shape ({ listensTo, handle }), skipping`);continue}for(let E of ue(p.listensTo)){if(!Y(E,i))continue;j(E,(b)=>p.handle(b,E)),o++}}catch(l){r.error(`[events/discover] failed to import ${i}: ${l instanceof Error?l.message:String(l)}`)}if(o>0)r.info(`[events/discover] registered ${o} listener${o===1?"":"s"} from ${n}`);return o}function J(e,n){let t=[],r=ie(e);for(let s of r){let o=h(e,s),i=ae(o);if(i.isDirectory())t.push(...J(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"),W=globalThis[F]??(globalThis[F]=new Set);function Y(e,n){let t=`${e}\x00${n}`;if(W.has(t))return!1;return W.add(t),!0}function fe(){W.clear(),delete x()[R],x()[K]=z}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 ve(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 q(s);if(i>0)(e.log?.warn??((p)=>console.warn(p)))(`[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)=>h(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=x();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(!x()[K]&&!O())x()[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 ye(n,t),r+=await G({...e,dir:e.dir??h(n,"app","Listeners"),log:{...t,info:()=>{}}}),r>0)t.info(`[events] registered ${r} listener${r===1?"":"s"}`);return r}async function ye(e,n){let t=["ts","js"].map((o)=>h(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 l of Array.isArray(i)?i:[i]){if(typeof l!=="string"||!l.trim())continue;let p=await ke(e,l.trim());if(!p){n.warn(`[events] ${o}: no listener or action called ${l}`);continue}if(!Y(o,p.id))continue;let{handle:E,validations:b}=p;j(o,(A)=>(pe(o,l,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[l,p]of Object.entries(r)){let E=p?.rule?.validate;if(typeof E!=="function")continue;try{if(!E(o[l]).valid)i.push(l)}catch{i.push(l)}}if(i.length)s.warn(`[events] ${e}: payload does not match what ${n} declares (${i.join(", ")})`)}var C=new Map;async function V(e,n,t){let r=`${e}:${n}`,s=C.get(r);if(s)return s;let o=(async()=>{let i=h(e,"storage","framework","auto-imports"),l=h(i,`${n}.ts`);if(!_(l))return null;let E=(await import(l))[t];if(!E)throw Error(`Invalid ${t} registry: ${l}`);return Object.fromEntries(Object.entries(E).map(([b,A])=>[b,U(A,i)]))})();return C.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(){C.clear()}function Ee(e){let n=[h(e,"app"),h(e,"storage","framework","defaults","app")];try{let t=Bun.resolveSync("@stacksjs/defaults/package.json",e);n.push(h(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(h(s,o,`${n}.${i}`));for(let s of t){if(!_(s))continue;try{let o=await import(s),i=o?.default??o,l=i?.handle;if(typeof l!=="function")continue;return{id:s,handle:l.bind(i),validations:i?.validations}}catch{continue}}return null}var X=Symbol.for("stacks.events.handler.error");function L(e,n){let t=n.slice(),r=e.get(n);if(t.length<2||!r)return t;return t.map((s,o)=>({h:s,i:o,p:r.get(s)??0})).sort((s,o)=>o.p-s.p||s.i-o.i).map((s)=>s.h)}function he(e){return new RegExp(`^${e.replace(/[\\^$+?()[\]{}|]/g,"\\$&").replace(/\*/g,".*")}$`)}function S(e,n,t){console.error(`[Events] ${e} for '${String(n)}':`,t)}function T(e){return!!e&&typeof e.catch==="function"}function B(e){let n=e??new Map,t=new WeakMap,r=new WeakMap,s=(a,v,d)=>{let f=r.get(d),y=f?.key===a?f.re:void 0;if(!y)y=he(a),r.set(d,{key:a,re:y});return y.test(v)};function o(a,v,d){let f=n.get(a);if(f)f.push(v);else n.set(a,f=[v]);if(d?.priority!==void 0&&Number.isFinite(d.priority)){let y=t.get(f);if(!y)t.set(f,y=new Map);y.set(v,d.priority)}}function i(a,v){let d=(...f)=>(l(a,d),v(...f));d[X]=v,o(a,d)}function l(a,v){let d=n.get(a);if(!d)return;if(!v){n.set(a,[]);return}let f=t.get(d);for(let y=d.length-1;y>=0;y--){let k=d[y];if(k===v||k?.[X]===v){if(d.splice(y,1),!d.includes(k))f?.delete(k)}}}function p(a){if(a===void 0)n.clear();else n.delete(a)}function E(a){return n.get(a)?.length??0}function b(a,v){let d=n.get(a),f=n.get("*"),y=d?L(t,d):void 0,k=f?L(t,f):void 0;if(y)for(let m of y)try{let c=m(v);if(T(c))c.catch((u)=>S("Async handler error",a,u))}catch(c){S("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(s(u,g,m))for(let H of L(t,m))try{let P=H(a,v);if(T(P))P.catch((te)=>S(`Async pattern handler '${u}' error`,a,te))}catch(P){S(`Pattern handler '${u}' error`,a,P)}}),k)for(let m of k)try{let c=m(a,v);if(T(c))c.catch((u)=>S("Async wildcard handler error",a,u))}catch(c){S("Wildcard handler error",a,c)}}async function A(a,v){let d=[],f=async(g,m)=>{if(!g)return;for(let c of L(t,g))try{let u=m?c(a,v):c(v);d.push(T(u)?await u:u)}catch(u){S("Awaited handler error",a,u),d.push(void 0)}};await f(n.get(a),!1);let y=String(a),k=[];n.forEach((g,m)=>{let c=String(m);if(c===y||c==="*"||!c.includes("*"))return;if(s(c,y,g))k.push(c)});for(let g of k)await f(n.get(g),!0);return await f(n.get("*"),!0),d}async function ne(a,v){let d=[],f=async(g,m)=>{if(!g)return;for(let c of L(t,g))try{let u=m?c(a,v):c(v),H=T(u)?await u:u;d.push({ok:!0,value:H})}catch(u){let H=u instanceof Error?u:Error(String(u));d.push({ok:!1,error:H})}};await f(n.get(a),!1);let y=String(a),k=[];n.forEach((g,m)=>{let c=String(m);if(c===y||c==="*"||!c.includes("*"))return;if(s(c,y,g))k.push(c)});for(let g of k)await f(n.get(g),!0);return await f(n.get("*"),!0),d}return{all:n,on:o,once:i,off:l,emit:b,emitAsync:A,emitAndCollect:ne,removeAllListeners:p,listenerCount:E}}var Oe=B,Ge=B;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,N=ee[Z]??(ee[Z]=B()),w=N,We=N,be=Symbol.for("stacks.events.dispatchObserver");function D(e){let n=globalThis[be];if(n)n(String(e))}var xe=(e,n)=>(D(e),w.emit(e,n)),Ce=(e,n)=>(D(e),w.emitAsync(e,n)),je=(e,n)=>(D(e),w.emitAndCollect(e,n)),Be=xe,{all:Ne,on:j,on:De,once:Ie,off:Ue}=w;function Fe(e){return we(N,e)}export{Ne as all,O as appListenersBooted,ve as bootAppListeners,B as createEmitter,Ge as default,Me as defineEvents,de as defineListener,G as discoverListeners,xe as dispatch,je as dispatchAndCollect,Ce as dispatchAsync,w as emitter,N as events,j 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,Be as useEvent,We 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.
|
|
5
|
+
"version": "0.75.431",
|
|
6
6
|
"description": "Functional event emitting.",
|
|
7
7
|
"author": "Chris Breuer",
|
|
8
8
|
"contributors": [
|
|
@@ -63,6 +63,6 @@
|
|
|
63
63
|
"better-dx": "^0.2.24"
|
|
64
64
|
},
|
|
65
65
|
"dependencies": {
|
|
66
|
-
"@stacksjs/path": "0.75.
|
|
66
|
+
"@stacksjs/path": "0.75.431"
|
|
67
67
|
}
|
|
68
68
|
}
|