@vielzeug/herald 26.11.4 → 26.11.6

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/_dev.js CHANGED
@@ -1,6 +1,5 @@
1
- //#region src/_dev.ts
1
+ // src/_dev.ts
2
2
  function warn(e) {}
3
- //#endregion
4
3
  export { warn };
5
4
 
6
5
  //# sourceMappingURL=_dev.js.map
package/dist/bus.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import "./_dev.js";
2
2
  import { BusDisposedError as e } from "./errors.js";
3
- //#region src/bus.ts
3
+ // src/bus.ts
4
4
  var noop = () => {};
5
5
  function createBus(t) {
6
6
  let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Set(), i = /* @__PURE__ */ new Set(), a = new AbortController(), o = t?.name, s = t?.maxListeners, c = o ? ` (${o})` : "";
@@ -182,7 +182,6 @@ function createBus(t) {
182
182
  wildcardCount
183
183
  };
184
184
  }
185
- //#endregion
186
185
  export { createBus, noop };
187
186
 
188
187
  //# sourceMappingURL=bus.js.map
package/dist/errors.js CHANGED
@@ -1,4 +1,4 @@
1
- //#region src/errors.ts
1
+ // src/errors.ts
2
2
  var HeraldError = class extends Error {
3
3
  constructor(e, t) {
4
4
  super(e, t), this.name = new.target.name, Object.setPrototypeOf(this, new.target.prototype);
@@ -8,7 +8,6 @@ var HeraldError = class extends Error {
8
8
  super(e ? `Bus "${e}" is disposed` : "Bus is disposed");
9
9
  }
10
10
  };
11
- //#endregion
12
11
  export { BusDisposedError, HeraldError };
13
12
 
14
13
  //# sourceMappingURL=errors.js.map
package/dist/herald.js CHANGED
@@ -1,5 +1,4 @@
1
- //#endregion
2
- //#region src/errors.ts
1
+ // src/errors.ts
3
2
  var HeraldError = class extends Error {
4
3
  constructor(e, t) {
5
4
  super(e, t), this.name = new.target.name, Object.setPrototypeOf(this, new.target.prototype);
@@ -189,7 +188,6 @@ function createBus(e) {
189
188
  wildcardCount
190
189
  };
191
190
  }
192
- //#endregion
193
191
  export { BusDisposedError, HeraldError, createBus };
194
192
 
195
193
  //# sourceMappingURL=herald.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"herald.js","names":["message","opts","busName","listeners","wildcards","tappers","disposeController","options","maxListeners","busTag","tapper","event","signal","called","container","entry","onRemove","wildcard","makeEntry","onLog","set","capturedSet","listener","ref","payload","resolve","count","firstError","err","args","total","handler","activeSignal","raceController","raceSignal","unsubs","settled","unsub","reject","eventList"],"sources":["../src/_dev.ts","../src/errors.ts","../src/bus.ts"],"sourcesContent":["const isDev = !(globalThis as { __HERALD_PROD__?: boolean }).__HERALD_PROD__;\n\n/** @internal @security Messages may include user-supplied data. */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/herald] ${msg}`);\n}\n","/** Base class for all herald errors. Use `instanceof HeraldError` to catch any herald-originated error. */\nexport class HeraldError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when an operation is attempted on a disposed event bus. */\nexport class BusDisposedError extends HeraldError {\n constructor(busName?: string) {\n super(busName ? `Bus \"${busName}\" is disposed` : 'Bus is disposed');\n }\n}\n","import { warn as _internalWarn } from './_dev';\nimport { BusDisposedError } from './errors';\nimport type {\n Bus,\n BusOptions,\n EventKey,\n EventMap,\n HeraldEvent,\n Listener,\n SubscribeOptions,\n Unsubscribe,\n WaitAnyResult,\n} from './types';\n\n// Module-scoped noop: shared across all bus instances to avoid per-bus allocation.\n/** @internal */\nexport const noop = () => {};\n\ntype Entry = { fn: Listener<unknown>; unsub: () => void };\ntype WildcardEntry = { fn: (event: string, payload: unknown) => void; unsub: () => void };\n\ntype RegisterEntryOpts<T extends EventMap> = {\n event?: EventKey<T>;\n onLog: string;\n onRemove?: () => void;\n wildcard?: boolean;\n};\n\nexport function createBus<T extends EventMap = Record<string, unknown>>(options?: BusOptions): Bus<T> {\n const listeners = new Map<string, Set<Entry>>();\n const wildcards = new Set<WildcardEntry>();\n const tappers = new Set<(event: HeraldEvent<T>) => void>();\n const disposeController = new AbortController();\n const busName = options?.name;\n const maxListeners = options?.maxListeners;\n const busTag = busName ? ` (${busName})` : '';\n\n function emitTap(event: HeraldEvent<T>): void {\n if (tappers.size === 0) return;\n for (const tapper of tappers) {\n try {\n tapper(event);\n } catch {\n // Observability must not affect bus behavior.\n }\n }\n }\n\n function doWarn(msg: string): void {\n _internalWarn(msg);\n }\n\n function createSubscriptionScope(signal?: AbortSignal): AbortSignal {\n return signal ? AbortSignal.any([disposeController.signal, signal]) : disposeController.signal;\n }\n\n function registerEntry<E extends { unsub: () => void }>(\n container: Set<E>,\n makeEntry: (unsub: () => void) => E,\n signal: AbortSignal,\n { event, onLog, onRemove, wildcard }: RegisterEntryOpts<T>,\n ): () => void {\n if (signal.aborted) return noop;\n\n let called = false;\n\n function unsub() {\n if (called) return;\n\n called = true;\n container.delete(entry);\n onRemove?.();\n signal.removeEventListener('abort', unsub);\n\n if (event !== undefined) emitTap({ event, type: 'unsubscribe' });\n else if (wildcard) emitTap({ type: 'unsubscribe-any' });\n }\n\n const entry = makeEntry(unsub);\n\n container.add(entry);\n signal.addEventListener('abort', unsub, { once: true });\n\n if (event !== undefined) emitTap({ event, type: 'subscribe' });\n else if (wildcard) emitTap({ type: 'subscribe-any' });\n\n if (maxListeners !== undefined && container.size > maxListeners) {\n doWarn(\n `${onLog} has ${container.size} listeners, exceeding maxListeners (${maxListeners}). Possible memory leak.${busTag}`,\n );\n }\n\n return unsub;\n }\n\n function onWithSignal<K extends EventKey<T>>(\n event: K,\n listener: Listener<T[K]>,\n signal: AbortSignal,\n onRemove?: () => void,\n ): () => void {\n let set = listeners.get(event);\n\n if (!set) {\n set = new Set();\n listeners.set(event, set);\n }\n\n const capturedSet = set;\n\n return registerEntry(capturedSet, (unsub) => ({ fn: listener as Listener<unknown>, unsub }), signal, {\n event,\n onLog: `on(\"${event}\")`,\n onRemove: () => {\n if (capturedSet.size === 0) listeners.delete(event);\n\n onRemove?.();\n },\n });\n }\n\n function onAnyWithSignal(\n listener: (event: EventKey<T>, payload: unknown) => void,\n signal: AbortSignal,\n onRemove?: () => void,\n ): () => void {\n return registerEntry(\n wildcards,\n (unsub) => ({ fn: listener as (event: string, payload: unknown) => void, unsub }),\n signal,\n { onLog: 'onAny', onRemove, wildcard: true },\n );\n }\n\n function onceWithSignal<K extends EventKey<T>>(\n event: K,\n listener: Listener<T[K]>,\n signal: AbortSignal,\n onRemove?: () => void,\n ): () => void {\n const ref = { unsub: noop as Unsubscribe };\n\n ref.unsub = onWithSignal(\n event,\n (payload) => {\n ref.unsub();\n listener(payload);\n },\n signal,\n onRemove,\n );\n\n return ref.unsub;\n }\n\n function on<K extends EventKey<T>>(event: K, listener: Listener<T[K]>, opts?: SubscribeOptions): () => void {\n return onWithSignal(event, listener, createSubscriptionScope(opts?.signal));\n }\n\n function once<K extends EventKey<T>>(\n event: K,\n listener: Listener<T[K]>,\n opts?: { signal?: AbortSignal },\n ): () => void {\n const signal = createSubscriptionScope(opts?.signal);\n\n return onceWithSignal(event, listener, signal);\n }\n\n function onAny(listener: (event: EventKey<T>, payload: unknown) => void, opts?: SubscribeOptions): () => void {\n return onAnyWithSignal(listener, createSubscriptionScope(opts?.signal));\n }\n\n function wait<K extends EventKey<T>>(event: K, opts?: { signal?: AbortSignal }): Promise<T[K]> {\n const signal = createSubscriptionScope(opts?.signal);\n\n if (signal.aborted) return Promise.reject(signal.reason);\n\n return new Promise<T[K]>((resolve, reject) => {\n const onAbort = () => {\n reject(signal.reason);\n };\n\n onceWithSignal(\n event,\n (payload) => {\n signal.removeEventListener('abort', onAbort);\n resolve(payload);\n },\n signal,\n );\n\n signal.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n function dispatch(event: EventKey<T>, payload: unknown): void {\n let count = 0;\n let firstError: { value: unknown } | undefined;\n const set = listeners.get(event);\n\n if (set?.size) {\n for (const entry of [...set]) {\n try {\n entry.fn(payload);\n } catch (err) {\n firstError ??= { value: err };\n emitTap({ error: err, event, type: 'error' });\n }\n\n count++;\n }\n }\n\n if (wildcards.size) {\n for (const entry of [...wildcards]) {\n try {\n entry.fn(event, payload);\n } catch (err) {\n firstError ??= { value: err };\n emitTap({ error: err, event, type: 'error' });\n }\n\n count++;\n }\n }\n\n emitTap({ event, listeners: count, payload, type: 'emit' });\n\n if (firstError) throw firstError.value;\n }\n\n function emit<K extends EventKey<T>>(event: K, ...args: T[K] extends void ? [] : [payload: T[K]]): void {\n if (disposeController.signal.aborted) return;\n\n const payload = (args as unknown[])[0];\n\n dispatch(event, payload);\n }\n\n function listenerCount(event?: EventKey<T>): number {\n if (event !== undefined) return listeners.get(event)?.size ?? 0;\n\n let total = 0;\n\n for (const set of listeners.values()) total += set.size;\n\n return total;\n }\n\n function wildcardCount(): number {\n return wildcards.size;\n }\n\n function eventNames(): EventKey<T>[] {\n return [...listeners.keys()] as EventKey<T>[];\n }\n\n function tap(handler: (event: HeraldEvent<T>) => void, opts?: { signal?: AbortSignal }): () => void {\n if (disposeController.signal.aborted) return noop;\n\n const signal = createSubscriptionScope(opts?.signal);\n\n if (signal.aborted) return noop;\n\n tappers.add(handler);\n\n const onAbort = () => tappers.delete(handler);\n\n signal.addEventListener('abort', onAbort, { once: true });\n\n return () => {\n tappers.delete(handler);\n signal.removeEventListener('abort', onAbort);\n };\n }\n\n function waitAny<K extends readonly EventKey<T>[]>(\n eventList: K,\n opts?: { signal?: AbortSignal },\n ): Promise<WaitAnyResult<T, K>> {\n const activeSignal = createSubscriptionScope(opts?.signal);\n\n if (activeSignal.aborted) return Promise.reject(activeSignal.reason);\n\n return new Promise<WaitAnyResult<T, K>>((resolve, reject) => {\n const raceController = new AbortController();\n const raceSignal = AbortSignal.any([activeSignal, raceController.signal]);\n const unsubs: Unsubscribe[] = [];\n let settled = false;\n\n function cleanup(): void {\n activeSignal.removeEventListener('abort', onAbort);\n raceController.abort();\n for (const unsub of unsubs) unsub();\n }\n\n function onAbort(): void {\n if (settled) return;\n\n settled = true;\n cleanup();\n reject(activeSignal.reason);\n }\n\n activeSignal.addEventListener('abort', onAbort, { once: true });\n\n for (const event of eventList) {\n unsubs.push(\n onceWithSignal(\n event as EventKey<T>,\n (payload) => {\n if (settled) return;\n\n settled = true;\n cleanup();\n resolve({ event, payload } as WaitAnyResult<T, K>);\n },\n raceSignal,\n ),\n );\n }\n });\n }\n\n function dispose(): void {\n if (disposeController.signal.aborted) return;\n\n emitTap({ type: 'dispose' });\n disposeController.abort(new BusDisposedError(busName));\n listeners.clear();\n wildcards.clear();\n tappers.clear();\n }\n\n return {\n get disposalSignal() {\n return disposeController.signal;\n },\n dispose,\n get disposed() {\n return disposeController.signal.aborted;\n },\n emit,\n eventNames,\n listenerCount,\n on,\n onAny,\n once,\n [Symbol.dispose]: dispose,\n tap,\n wait,\n waitAny,\n wildcardCount,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"herald.js","names":["message","opts","busName","listeners","wildcards","tappers","disposeController","options","maxListeners","busTag","tapper","event","signal","called","container","entry","onRemove","wildcard","makeEntry","onLog","set","capturedSet","listener","ref","payload","resolve","count","firstError","err","args","total","handler","activeSignal","raceController","raceSignal","unsubs","settled","unsub","reject","eventList"],"sources":["../src/_dev.ts","../src/errors.ts","../src/bus.ts"],"sourcesContent":["const isDev = !(globalThis as { __HERALD_PROD__?: boolean }).__HERALD_PROD__;\n\n/** @internal @security Messages may include user-supplied data. */\nexport function warn(msg: string): void {\n if (isDev) console.warn(`[@vielzeug/herald] ${msg}`);\n}\n","/** Base class for all herald errors. Use `instanceof HeraldError` to catch any herald-originated error. */\nexport class HeraldError extends Error {\n constructor(message: string, opts?: ErrorOptions) {\n super(message, opts);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Thrown when an operation is attempted on a disposed event bus. */\nexport class BusDisposedError extends HeraldError {\n constructor(busName?: string) {\n super(busName ? `Bus \"${busName}\" is disposed` : 'Bus is disposed');\n }\n}\n","import { warn as _internalWarn } from './_dev';\nimport { BusDisposedError } from './errors';\nimport type {\n Bus,\n BusOptions,\n EventKey,\n EventMap,\n HeraldEvent,\n Listener,\n SubscribeOptions,\n Unsubscribe,\n WaitAnyResult,\n} from './types';\n\n// Module-scoped noop: shared across all bus instances to avoid per-bus allocation.\n/** @internal */\nexport const noop = () => {};\n\ntype Entry = { fn: Listener<unknown>; unsub: () => void };\ntype WildcardEntry = { fn: (event: string, payload: unknown) => void; unsub: () => void };\n\ntype RegisterEntryOpts<T extends EventMap> = {\n event?: EventKey<T>;\n onLog: string;\n onRemove?: () => void;\n wildcard?: boolean;\n};\n\nexport function createBus<T extends EventMap = Record<string, unknown>>(options?: BusOptions): Bus<T> {\n const listeners = new Map<string, Set<Entry>>();\n const wildcards = new Set<WildcardEntry>();\n const tappers = new Set<(event: HeraldEvent<T>) => void>();\n const disposeController = new AbortController();\n const busName = options?.name;\n const maxListeners = options?.maxListeners;\n const busTag = busName ? ` (${busName})` : '';\n\n function emitTap(event: HeraldEvent<T>): void {\n if (tappers.size === 0) return;\n for (const tapper of tappers) {\n try {\n tapper(event);\n } catch {\n // Observability must not affect bus behavior.\n }\n }\n }\n\n function doWarn(msg: string): void {\n _internalWarn(msg);\n }\n\n function createSubscriptionScope(signal?: AbortSignal): AbortSignal {\n return signal ? AbortSignal.any([disposeController.signal, signal]) : disposeController.signal;\n }\n\n function registerEntry<E extends { unsub: () => void }>(\n container: Set<E>,\n makeEntry: (unsub: () => void) => E,\n signal: AbortSignal,\n { event, onLog, onRemove, wildcard }: RegisterEntryOpts<T>,\n ): () => void {\n if (signal.aborted) return noop;\n\n let called = false;\n\n function unsub() {\n if (called) return;\n\n called = true;\n container.delete(entry);\n onRemove?.();\n signal.removeEventListener('abort', unsub);\n\n if (event !== undefined) emitTap({ event, type: 'unsubscribe' });\n else if (wildcard) emitTap({ type: 'unsubscribe-any' });\n }\n\n const entry = makeEntry(unsub);\n\n container.add(entry);\n signal.addEventListener('abort', unsub, { once: true });\n\n if (event !== undefined) emitTap({ event, type: 'subscribe' });\n else if (wildcard) emitTap({ type: 'subscribe-any' });\n\n if (maxListeners !== undefined && container.size > maxListeners) {\n doWarn(\n `${onLog} has ${container.size} listeners, exceeding maxListeners (${maxListeners}). Possible memory leak.${busTag}`,\n );\n }\n\n return unsub;\n }\n\n function onWithSignal<K extends EventKey<T>>(\n event: K,\n listener: Listener<T[K]>,\n signal: AbortSignal,\n onRemove?: () => void,\n ): () => void {\n let set = listeners.get(event);\n\n if (!set) {\n set = new Set();\n listeners.set(event, set);\n }\n\n const capturedSet = set;\n\n return registerEntry(capturedSet, (unsub) => ({ fn: listener as Listener<unknown>, unsub }), signal, {\n event,\n onLog: `on(\"${event}\")`,\n onRemove: () => {\n if (capturedSet.size === 0) listeners.delete(event);\n\n onRemove?.();\n },\n });\n }\n\n function onAnyWithSignal(\n listener: (event: EventKey<T>, payload: unknown) => void,\n signal: AbortSignal,\n onRemove?: () => void,\n ): () => void {\n return registerEntry(\n wildcards,\n (unsub) => ({ fn: listener as (event: string, payload: unknown) => void, unsub }),\n signal,\n { onLog: 'onAny', onRemove, wildcard: true },\n );\n }\n\n function onceWithSignal<K extends EventKey<T>>(\n event: K,\n listener: Listener<T[K]>,\n signal: AbortSignal,\n onRemove?: () => void,\n ): () => void {\n const ref = { unsub: noop as Unsubscribe };\n\n ref.unsub = onWithSignal(\n event,\n (payload) => {\n ref.unsub();\n listener(payload);\n },\n signal,\n onRemove,\n );\n\n return ref.unsub;\n }\n\n function on<K extends EventKey<T>>(event: K, listener: Listener<T[K]>, opts?: SubscribeOptions): () => void {\n return onWithSignal(event, listener, createSubscriptionScope(opts?.signal));\n }\n\n function once<K extends EventKey<T>>(\n event: K,\n listener: Listener<T[K]>,\n opts?: { signal?: AbortSignal },\n ): () => void {\n const signal = createSubscriptionScope(opts?.signal);\n\n return onceWithSignal(event, listener, signal);\n }\n\n function onAny(listener: (event: EventKey<T>, payload: unknown) => void, opts?: SubscribeOptions): () => void {\n return onAnyWithSignal(listener, createSubscriptionScope(opts?.signal));\n }\n\n function wait<K extends EventKey<T>>(event: K, opts?: { signal?: AbortSignal }): Promise<T[K]> {\n const signal = createSubscriptionScope(opts?.signal);\n\n if (signal.aborted) return Promise.reject(signal.reason);\n\n return new Promise<T[K]>((resolve, reject) => {\n const onAbort = () => {\n reject(signal.reason);\n };\n\n onceWithSignal(\n event,\n (payload) => {\n signal.removeEventListener('abort', onAbort);\n resolve(payload);\n },\n signal,\n );\n\n signal.addEventListener('abort', onAbort, { once: true });\n });\n }\n\n function dispatch(event: EventKey<T>, payload: unknown): void {\n let count = 0;\n let firstError: { value: unknown } | undefined;\n const set = listeners.get(event);\n\n if (set?.size) {\n for (const entry of [...set]) {\n try {\n entry.fn(payload);\n } catch (err) {\n firstError ??= { value: err };\n emitTap({ error: err, event, type: 'error' });\n }\n\n count++;\n }\n }\n\n if (wildcards.size) {\n for (const entry of [...wildcards]) {\n try {\n entry.fn(event, payload);\n } catch (err) {\n firstError ??= { value: err };\n emitTap({ error: err, event, type: 'error' });\n }\n\n count++;\n }\n }\n\n emitTap({ event, listeners: count, payload, type: 'emit' });\n\n if (firstError) throw firstError.value;\n }\n\n function emit<K extends EventKey<T>>(event: K, ...args: T[K] extends void ? [] : [payload: T[K]]): void {\n if (disposeController.signal.aborted) return;\n\n const payload = (args as unknown[])[0];\n\n dispatch(event, payload);\n }\n\n function listenerCount(event?: EventKey<T>): number {\n if (event !== undefined) return listeners.get(event)?.size ?? 0;\n\n let total = 0;\n\n for (const set of listeners.values()) total += set.size;\n\n return total;\n }\n\n function wildcardCount(): number {\n return wildcards.size;\n }\n\n function eventNames(): EventKey<T>[] {\n return [...listeners.keys()] as EventKey<T>[];\n }\n\n function tap(handler: (event: HeraldEvent<T>) => void, opts?: { signal?: AbortSignal }): () => void {\n if (disposeController.signal.aborted) return noop;\n\n const signal = createSubscriptionScope(opts?.signal);\n\n if (signal.aborted) return noop;\n\n tappers.add(handler);\n\n const onAbort = () => tappers.delete(handler);\n\n signal.addEventListener('abort', onAbort, { once: true });\n\n return () => {\n tappers.delete(handler);\n signal.removeEventListener('abort', onAbort);\n };\n }\n\n function waitAny<K extends readonly EventKey<T>[]>(\n eventList: K,\n opts?: { signal?: AbortSignal },\n ): Promise<WaitAnyResult<T, K>> {\n const activeSignal = createSubscriptionScope(opts?.signal);\n\n if (activeSignal.aborted) return Promise.reject(activeSignal.reason);\n\n return new Promise<WaitAnyResult<T, K>>((resolve, reject) => {\n const raceController = new AbortController();\n const raceSignal = AbortSignal.any([activeSignal, raceController.signal]);\n const unsubs: Unsubscribe[] = [];\n let settled = false;\n\n function cleanup(): void {\n activeSignal.removeEventListener('abort', onAbort);\n raceController.abort();\n for (const unsub of unsubs) unsub();\n }\n\n function onAbort(): void {\n if (settled) return;\n\n settled = true;\n cleanup();\n reject(activeSignal.reason);\n }\n\n activeSignal.addEventListener('abort', onAbort, { once: true });\n\n for (const event of eventList) {\n unsubs.push(\n onceWithSignal(\n event as EventKey<T>,\n (payload) => {\n if (settled) return;\n\n settled = true;\n cleanup();\n resolve({ event, payload } as WaitAnyResult<T, K>);\n },\n raceSignal,\n ),\n );\n }\n });\n }\n\n function dispose(): void {\n if (disposeController.signal.aborted) return;\n\n emitTap({ type: 'dispose' });\n disposeController.abort(new BusDisposedError(busName));\n listeners.clear();\n wildcards.clear();\n tappers.clear();\n }\n\n return {\n get disposalSignal() {\n return disposeController.signal;\n },\n dispose,\n get disposed() {\n return disposeController.signal.aborted;\n },\n emit,\n eventNames,\n listenerCount,\n on,\n onAny,\n once,\n [Symbol.dispose]: dispose,\n tap,\n wait,\n waitAny,\n wildcardCount,\n };\n}\n"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./errors.cjs"),t=require("./bus.cjs");exports.BusDisposedError=e.BusDisposedError,exports.HeraldError=e.HeraldError,exports.createBus=t.createBus;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./bus.cjs"),t=require("./errors.cjs");exports.BusDisposedError=t.BusDisposedError,exports.HeraldError=t.HeraldError,exports.createBus=e.createBus;
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import { BusDisposedError as e, HeraldError as t } from "./errors.js";
2
- import { createBus as n } from "./bus.js";
3
- export { e as BusDisposedError, t as HeraldError, n as createBus };
1
+ import { createBus as e } from "./bus.js";
2
+ import { BusDisposedError as t, HeraldError as n } from "./errors.js";
3
+ export { t as BusDisposedError, n as HeraldError, e as createBus };
@@ -1,5 +1,5 @@
1
1
  import { createBus as e } from "../bus.js";
2
- //#region src/testing/testing.ts
2
+ // src/testing/testing.ts
3
3
  var t = /* @__PURE__ */ new Set([
4
4
  "__proto__",
5
5
  "constructor",
@@ -35,7 +35,6 @@ function createTestBus(n) {
35
35
  [Symbol.dispose]: dispose
36
36
  });
37
37
  }
38
- //#endregion
39
38
  export { createTestBus };
40
39
 
41
40
  //# sourceMappingURL=testing.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vielzeug/herald",
3
- "version": "26.11.4",
3
+ "version": "26.11.6",
4
4
  "description": "Typed synchronous event bus with wildcard subscriptions, one-shot waits, and lifecycle tracing",
5
5
  "repository": {
6
6
  "type": "git",
@@ -44,19 +44,19 @@
44
44
  },
45
45
  "scripts": {
46
46
  "bench": "vitest bench",
47
- "build": "vite build && pnpm --silent run build:bundle && pnpm --silent run build:types",
47
+ "build": "vite build && bun run --silent build:bundle && bun run --silent build:types",
48
48
  "build:bundle": "vite build --config vite.bundle.config.ts",
49
49
  "build:types": "tsc -p tsconfig.declarations.json",
50
50
  "fix": "biome check --write src",
51
51
  "lint": "biome ci src",
52
- "prepublishOnly": "pnpm --silent run build",
52
+ "prepublishOnly": "bun run --silent build",
53
53
  "preview": "vite preview",
54
54
  "test": "vitest"
55
55
  },
56
56
  "devDependencies": {
57
- "@types/node": "^26.6.5",
57
+ "@types/node": "^26.6.6",
58
58
  "typescript": "^6.0.3",
59
- "vite": "^8.3.4",
60
- "vitest": "^5.0.5"
59
+ "vite": "^8.3.6",
60
+ "vitest": "^5.1.0"
61
61
  }
62
62
  }