@mundoit-lib/plugin-vue-event 1.0.1 → 2.0.2
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/README.md +121 -0
- package/dist/eventBus.cjs +114 -36
- package/dist/eventBus.d.cts +53 -14
- package/dist/eventBus.d.ts +53 -14
- package/dist/eventBus.js +84 -31
- package/dist/index.cjs +11 -91
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +4 -82
- package/dist/plugin.cjs +36 -88
- package/dist/plugin.d.cts +24 -9
- package/dist/plugin.d.ts +24 -9
- package/dist/plugin.js +34 -82
- package/dist/useEvents.cjs +51 -0
- package/dist/useEvents.d.cts +11 -0
- package/dist/useEvents.d.ts +11 -0
- package/dist/useEvents.js +50 -0
- package/package.json +79 -59
- package/src/eventBus.ts +0 -72
- package/src/index.ts +0 -3
- package/src/plugin.ts +0 -91
package/README.md
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# @mundoit-lib/plugin-vue-event
|
|
2
|
+
|
|
3
|
+
Bus de eventos global para Vue 3, sobre [mitt](https://github.com/developit/mitt). Expone `$events`, la opción de componente `events:` y el composable `useEvents()`, que desregistra solo al desmontar. Los eventos se pueden tipar por module augmentation.
|
|
4
|
+
|
|
5
|
+
## Instalación
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @mundoit-lib/plugin-vue-event
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
import { createApp } from 'vue';
|
|
13
|
+
import { eventsPlugin } from '@mundoit-lib/plugin-vue-event';
|
|
14
|
+
|
|
15
|
+
createApp(App).use(eventsPlugin).mount('#app');
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
`install` hace tres cosas:
|
|
19
|
+
|
|
20
|
+
- `app.config.globalProperties.$events = bus`;
|
|
21
|
+
- `app.provide('mundoitEvents', bus)` (la clave está exportada como `EVENTS_KEY`);
|
|
22
|
+
- un mixin global que registra la opción `events:` de cada componente.
|
|
23
|
+
|
|
24
|
+
Por defecto usa `eventBus`, el bus compartido del paquete. Para usar uno propio:
|
|
25
|
+
|
|
26
|
+
```ts
|
|
27
|
+
import { createEventBus, eventsPlugin } from '@mundoit-lib/plugin-vue-event';
|
|
28
|
+
|
|
29
|
+
const bus = createEventBus();
|
|
30
|
+
app.use(eventsPlugin, { bus });
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## API del bus
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
bus.emit('saved', id, data); // los listeners reciben (id, data)
|
|
37
|
+
const fn = bus.on('saved', (id, data) => {});
|
|
38
|
+
bus.once('saved', (id) => {});
|
|
39
|
+
bus.off('saved', fn); // saca ese listener
|
|
40
|
+
bus.off('saved'); // saca todos los de 'saved'
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
- `on` y `once` devuelven el mismo listener que reciben, así que `off` funciona con el handle o con la función original.
|
|
44
|
+
- `createEventBus()` crea buses independientes; `eventBus` es el que se comparte por defecto.
|
|
45
|
+
- `bus.rawBus` es el emitter de mitt. Ojo: cada evento viaja con **un solo payload, el array de argumentos** (`rawBus.on('saved', ([id, data]) => {})`). Usarlo sólo si hace falta algo de mitt que el bus no expone (por ejemplo `rawBus.all`).
|
|
46
|
+
|
|
47
|
+
## Opción `events:` (Options API)
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
export default {
|
|
51
|
+
events: {
|
|
52
|
+
'loaded-user'(user) {
|
|
53
|
+
this.user = user; // `this` es el componente
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
methods: {
|
|
57
|
+
save() {
|
|
58
|
+
this.$events.emit('saved', this.id);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Los listeners se registran en `beforeCreate` y se desregistran en `beforeUnmount`.
|
|
65
|
+
|
|
66
|
+
## `useEvents()` (Composition API)
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
import { useEvents } from '@mundoit-lib/plugin-vue-event';
|
|
70
|
+
|
|
71
|
+
const events = useEvents();
|
|
72
|
+
events.on('loaded-user', (user) => { /* … */ }); // se desregistra solo al desmontar
|
|
73
|
+
events.once('ready', () => { /* … */ });
|
|
74
|
+
events.emit('saved', id);
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
- Dentro de un `setup` usa el bus de la app (el que se pasó a `install`); también se le puede pasar uno: `useEvents(bus)`.
|
|
78
|
+
- Lo que se registra con `on`/`once` se desregistra en `onBeforeUnmount`. `off` lo saca antes.
|
|
79
|
+
- Fuera de un componente se comporta como el bus y no desregistra nada solo.
|
|
80
|
+
|
|
81
|
+
`useEventBus()` devuelve el bus de la app (o `eventBus` fuera de un componente) sin auto-desregistro, como en 1.x.
|
|
82
|
+
|
|
83
|
+
## Tipado
|
|
84
|
+
|
|
85
|
+
Por defecto cualquier nombre de evento acepta cualquier argumento. Para tipar los de la app, declarar `MundoitEvents` (en un `.d.ts` o en cualquier archivo incluido en el `tsconfig`):
|
|
86
|
+
|
|
87
|
+
```ts
|
|
88
|
+
import type { User } from '@/types';
|
|
89
|
+
|
|
90
|
+
declare module '@mundoit-lib/plugin-vue-event' {
|
|
91
|
+
interface MundoitEvents {
|
|
92
|
+
'loaded-user': [user: User];
|
|
93
|
+
saved: [id: number, data?: unknown];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Con eso `emit`, `on`, `once`, `off` y `$events` controlan los argumentos de esos eventos y los autocompletan. Los eventos no declarados siguen siendo `any`.
|
|
99
|
+
|
|
100
|
+
## Deprecado (se elimina en 3.0)
|
|
101
|
+
|
|
102
|
+
Siguen andando en 2.x por compatibilidad con 1.x y se sacan en la 3.0.
|
|
103
|
+
|
|
104
|
+
| Qué | Reemplazo |
|
|
105
|
+
|---|---|
|
|
106
|
+
| `fire()` (`$events.fire`, `eventBus.fire`) | `emit()` |
|
|
107
|
+
| Tipos `EventBusInstance`, `EventBusEvents` | `EventBus`, `MundoitEvents` |
|
|
108
|
+
|
|
109
|
+
## Migración 1.x → 2.0
|
|
110
|
+
|
|
111
|
+
| 1.x | 2.0 |
|
|
112
|
+
|---|---|
|
|
113
|
+
| Vue 2 y Vue 3 | **Sólo Vue 3** (`vue ^3.3`). En Vue 2 quedarse en 1.x. |
|
|
114
|
+
| `$events.fire(...)` | Sigue andando, pero está deprecado (se elimina en 3.0): usar `$events.emit(...)`. En desarrollo avisa una vez por consola. |
|
|
115
|
+
| `useEventBus()` | Sigue igual. Para componentes, mejor `useEvents()`, que desregistra solo. |
|
|
116
|
+
| `off(evento, handle)` con el valor que devolvía `on` | Igual, y además acepta la función original o sólo el evento. |
|
|
117
|
+
| `EventBusInstance`, `EventBusEvents` | Deprecados (se eliminan en 3.0): usar `EventBus` y `MundoitEvents`. |
|
|
118
|
+
| `eventBus` era el emitter de mitt | `eventBus` es el bus (`emit`/`on`/…); el emitter de mitt está en `eventBus.rawBus`. |
|
|
119
|
+
| Dependencias de compatibilidad con Vue 2 | Ya no hacen falta: se pueden sacar de la app si nadie más los usa. |
|
|
120
|
+
|
|
121
|
+
Para una app en Vue 3 que usa `events:` y `$events`, actualizar es sólo subir la versión.
|
package/dist/eventBus.cjs
CHANGED
|
@@ -1,40 +1,118 @@
|
|
|
1
|
-
'
|
|
2
|
-
|
|
3
|
-
var
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
//#region \0rolldown/runtime.js
|
|
3
|
+
var __create = Object.create;
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
12
|
+
key = keys[i];
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except) {
|
|
14
|
+
__defProp(to, key, {
|
|
15
|
+
get: ((k) => from[k]).bind(null, key),
|
|
16
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return to;
|
|
22
|
+
};
|
|
23
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule || !__hasOwnProp.call(mod, "default") ? __defProp(target, "default", {
|
|
24
|
+
value: mod,
|
|
25
|
+
enumerable: true
|
|
26
|
+
}) : target, mod));
|
|
6
27
|
|
|
7
|
-
|
|
28
|
+
//#endregion
|
|
29
|
+
let mitt = require("mitt");
|
|
30
|
+
mitt = __toESM(mitt, 1);
|
|
31
|
+
let vue = require("vue");
|
|
8
32
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
//#region src/eventBus.ts
|
|
34
|
+
let fireWarned = false;
|
|
35
|
+
function isDev() {
|
|
36
|
+
try {
|
|
37
|
+
return process.env.NODE_ENV !== "production";
|
|
38
|
+
} catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** Crea un bus de eventos independiente. */
|
|
43
|
+
function createEventBus() {
|
|
44
|
+
const rawBus = (0, mitt.default)();
|
|
45
|
+
const registry = /* @__PURE__ */ new Map();
|
|
46
|
+
function register(event, listener, handler) {
|
|
47
|
+
let byListener = registry.get(event);
|
|
48
|
+
if (!byListener) {
|
|
49
|
+
byListener = /* @__PURE__ */ new Map();
|
|
50
|
+
registry.set(event, byListener);
|
|
51
|
+
}
|
|
52
|
+
const handlers = byListener.get(listener);
|
|
53
|
+
if (handlers) handlers.push(handler);
|
|
54
|
+
else byListener.set(listener, [handler]);
|
|
55
|
+
rawBus.on(event, handler);
|
|
56
|
+
}
|
|
57
|
+
function unregister(event, listener, handler) {
|
|
58
|
+
const byListener = registry.get(event);
|
|
59
|
+
const handlers = byListener?.get(listener);
|
|
60
|
+
if (!byListener || !handlers) return;
|
|
61
|
+
const toRemove = handler ? handlers.filter((h) => h === handler) : handlers;
|
|
62
|
+
for (const h of toRemove) rawBus.off(event, h);
|
|
63
|
+
const rest = handler ? handlers.filter((h) => h !== handler) : [];
|
|
64
|
+
if (rest.length) byListener.set(listener, rest);
|
|
65
|
+
else byListener.delete(listener);
|
|
66
|
+
if (!byListener.size) registry.delete(event);
|
|
67
|
+
}
|
|
68
|
+
const bus = {
|
|
69
|
+
rawBus,
|
|
70
|
+
emit(event, ...args) {
|
|
71
|
+
rawBus.emit(event, args);
|
|
72
|
+
},
|
|
73
|
+
on(event, listener) {
|
|
74
|
+
register(event, listener, (args) => listener(...args ?? []));
|
|
75
|
+
return listener;
|
|
76
|
+
},
|
|
77
|
+
once(event, listener) {
|
|
78
|
+
const handler = (args) => {
|
|
79
|
+
unregister(event, listener, handler);
|
|
80
|
+
listener(...args ?? []);
|
|
81
|
+
};
|
|
82
|
+
register(event, listener, handler);
|
|
83
|
+
return listener;
|
|
84
|
+
},
|
|
85
|
+
off(event, listener) {
|
|
86
|
+
if (listener) unregister(event, listener);
|
|
87
|
+
else {
|
|
88
|
+
rawBus.off(event);
|
|
89
|
+
registry.delete(event);
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
fire(event, ...args) {
|
|
93
|
+
if (!fireWarned && isDev()) {
|
|
94
|
+
fireWarned = true;
|
|
95
|
+
console.warn("[@mundoit-lib/plugin-vue-event] `fire` está deprecado y se elimina en 3.0, usar `emit`.");
|
|
96
|
+
}
|
|
97
|
+
bus.emit(event, ...args);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
return bus;
|
|
101
|
+
}
|
|
102
|
+
/** Bus por defecto: el que usa el plugin si no se le pasa otro. */
|
|
103
|
+
const eventBus = createEventBus();
|
|
104
|
+
/** Clave con la que el plugin hace `app.provide` del bus. */
|
|
105
|
+
const EVENTS_KEY = "mundoitEvents";
|
|
106
|
+
/**
|
|
107
|
+
* Devuelve el bus de la app (el que se pasó a `install`) si se llama dentro de un `setup`,
|
|
108
|
+
* o el bus por defecto si no. No desregistra nada solo: para eso está `useEvents`.
|
|
109
|
+
*/
|
|
110
|
+
function useEventBus() {
|
|
111
|
+
return (0, vue.getCurrentInstance)() ? (0, vue.inject)(EVENTS_KEY, eventBus) : eventBus;
|
|
112
|
+
}
|
|
38
113
|
|
|
114
|
+
//#endregion
|
|
115
|
+
exports.EVENTS_KEY = EVENTS_KEY;
|
|
116
|
+
exports.createEventBus = createEventBus;
|
|
39
117
|
exports.eventBus = eventBus;
|
|
40
|
-
exports.useEventBus = useEventBus;
|
|
118
|
+
exports.useEventBus = useEventBus;
|
package/dist/eventBus.d.cts
CHANGED
|
@@ -1,15 +1,54 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import { Emitter, EventType } from "mitt";
|
|
2
|
+
//#region src/eventBus.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Mapa de eventos de la app: nombre → tupla de argumentos.
|
|
5
|
+
* Se extiende por module augmentation:
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* declare module '@mundoit-lib/plugin-vue-event' {
|
|
9
|
+
* interface MundoitEvents {
|
|
10
|
+
* 'loaded-user': [user: User];
|
|
11
|
+
* }
|
|
12
|
+
* }
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* Los eventos que no están declarados siguen aceptando cualquier argumento.
|
|
16
|
+
*/
|
|
17
|
+
export interface MundoitEvents {}
|
|
18
|
+
/** Nombre de evento: los declarados en `MundoitEvents` (con autocompletado) o cualquier string. */
|
|
19
|
+
export type EventName = keyof MundoitEvents | (string & Record<never, never>);
|
|
20
|
+
/** Argumentos de un evento: la tupla declarada en `MundoitEvents`, o `any[]` si no está declarado. */
|
|
21
|
+
export type EventArgs<K extends EventName> = K extends keyof MundoitEvents ? MundoitEvents[K] extends unknown[] ? MundoitEvents[K] : [MundoitEvents[K]] : any[];
|
|
22
|
+
export type EventListener<K extends EventName = EventName> = (...args: EventArgs<K>) => void;
|
|
23
|
+
/** Emitter crudo de mitt: cada evento viaja con un único payload, el array de argumentos. */
|
|
24
|
+
export type RawEventBus = Emitter<Record<EventType, unknown[]>>;
|
|
25
|
+
export interface EventBus {
|
|
26
|
+
/** Emite `event` con los argumentos dados; cada listener los recibe tal cual (`on('x', (a, b) => …)`). */
|
|
27
|
+
emit<K extends EventName>(event: K, ...args: EventArgs<K>): void;
|
|
28
|
+
/** Registra `listener` y lo devuelve, para pasarlo después a `off`. */
|
|
29
|
+
on<K extends EventName>(event: K, listener: EventListener<K>): EventListener<K>;
|
|
30
|
+
/** Como `on`, pero se desregistra solo después de la primera vez. */
|
|
31
|
+
once<K extends EventName>(event: K, listener: EventListener<K>): EventListener<K>;
|
|
32
|
+
/** Desregistra `listener` de `event`; sin `listener`, desregistra todos los de `event`. */
|
|
33
|
+
off<K extends EventName>(event: K, listener?: EventListener<K>): void;
|
|
34
|
+
/** @deprecated Se elimina en 3.0. Usar `emit`. */
|
|
35
|
+
fire<K extends EventName>(event: K, ...args: EventArgs<K>): void;
|
|
36
|
+
/** El emitter de mitt por debajo. Ojo: el payload de cada evento es el array de argumentos. */
|
|
37
|
+
readonly rawBus: RawEventBus;
|
|
12
38
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
39
|
+
/** @deprecated Se elimina en 3.0. Nombre de 1.x, usar `EventBus`. */
|
|
40
|
+
export type EventBusInstance = EventBus;
|
|
41
|
+
/** @deprecated Se elimina en 3.0. Tipo de 1.x, usar `MundoitEvents`. */
|
|
42
|
+
export type EventBusEvents = Record<EventType, any>;
|
|
43
|
+
/** Crea un bus de eventos independiente. */
|
|
44
|
+
export declare function createEventBus(): EventBus;
|
|
45
|
+
/** Bus por defecto: el que usa el plugin si no se le pasa otro. */
|
|
46
|
+
export declare const eventBus: EventBus;
|
|
47
|
+
/** Clave con la que el plugin hace `app.provide` del bus. */
|
|
48
|
+
export declare const EVENTS_KEY = "mundoitEvents";
|
|
49
|
+
/**
|
|
50
|
+
* Devuelve el bus de la app (el que se pasó a `install`) si se llama dentro de un `setup`,
|
|
51
|
+
* o el bus por defecto si no. No desregistra nada solo: para eso está `useEvents`.
|
|
52
|
+
*/
|
|
53
|
+
export declare function useEventBus(): EventBus;
|
|
54
|
+
//#endregion
|
package/dist/eventBus.d.ts
CHANGED
|
@@ -1,15 +1,54 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import { Emitter, EventType } from "mitt";
|
|
2
|
+
//#region src/eventBus.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Mapa de eventos de la app: nombre → tupla de argumentos.
|
|
5
|
+
* Se extiende por module augmentation:
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* declare module '@mundoit-lib/plugin-vue-event' {
|
|
9
|
+
* interface MundoitEvents {
|
|
10
|
+
* 'loaded-user': [user: User];
|
|
11
|
+
* }
|
|
12
|
+
* }
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* Los eventos que no están declarados siguen aceptando cualquier argumento.
|
|
16
|
+
*/
|
|
17
|
+
export interface MundoitEvents {}
|
|
18
|
+
/** Nombre de evento: los declarados en `MundoitEvents` (con autocompletado) o cualquier string. */
|
|
19
|
+
export type EventName = keyof MundoitEvents | (string & Record<never, never>);
|
|
20
|
+
/** Argumentos de un evento: la tupla declarada en `MundoitEvents`, o `any[]` si no está declarado. */
|
|
21
|
+
export type EventArgs<K extends EventName> = K extends keyof MundoitEvents ? MundoitEvents[K] extends unknown[] ? MundoitEvents[K] : [MundoitEvents[K]] : any[];
|
|
22
|
+
export type EventListener<K extends EventName = EventName> = (...args: EventArgs<K>) => void;
|
|
23
|
+
/** Emitter crudo de mitt: cada evento viaja con un único payload, el array de argumentos. */
|
|
24
|
+
export type RawEventBus = Emitter<Record<EventType, unknown[]>>;
|
|
25
|
+
export interface EventBus {
|
|
26
|
+
/** Emite `event` con los argumentos dados; cada listener los recibe tal cual (`on('x', (a, b) => …)`). */
|
|
27
|
+
emit<K extends EventName>(event: K, ...args: EventArgs<K>): void;
|
|
28
|
+
/** Registra `listener` y lo devuelve, para pasarlo después a `off`. */
|
|
29
|
+
on<K extends EventName>(event: K, listener: EventListener<K>): EventListener<K>;
|
|
30
|
+
/** Como `on`, pero se desregistra solo después de la primera vez. */
|
|
31
|
+
once<K extends EventName>(event: K, listener: EventListener<K>): EventListener<K>;
|
|
32
|
+
/** Desregistra `listener` de `event`; sin `listener`, desregistra todos los de `event`. */
|
|
33
|
+
off<K extends EventName>(event: K, listener?: EventListener<K>): void;
|
|
34
|
+
/** @deprecated Se elimina en 3.0. Usar `emit`. */
|
|
35
|
+
fire<K extends EventName>(event: K, ...args: EventArgs<K>): void;
|
|
36
|
+
/** El emitter de mitt por debajo. Ojo: el payload de cada evento es el array de argumentos. */
|
|
37
|
+
readonly rawBus: RawEventBus;
|
|
12
38
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
39
|
+
/** @deprecated Se elimina en 3.0. Nombre de 1.x, usar `EventBus`. */
|
|
40
|
+
export type EventBusInstance = EventBus;
|
|
41
|
+
/** @deprecated Se elimina en 3.0. Tipo de 1.x, usar `MundoitEvents`. */
|
|
42
|
+
export type EventBusEvents = Record<EventType, any>;
|
|
43
|
+
/** Crea un bus de eventos independiente. */
|
|
44
|
+
export declare function createEventBus(): EventBus;
|
|
45
|
+
/** Bus por defecto: el que usa el plugin si no se le pasa otro. */
|
|
46
|
+
export declare const eventBus: EventBus;
|
|
47
|
+
/** Clave con la que el plugin hace `app.provide` del bus. */
|
|
48
|
+
export declare const EVENTS_KEY = "mundoitEvents";
|
|
49
|
+
/**
|
|
50
|
+
* Devuelve el bus de la app (el que se pasó a `install`) si se llama dentro de un `setup`,
|
|
51
|
+
* o el bus por defecto si no. No desregistra nada solo: para eso está `useEvents`.
|
|
52
|
+
*/
|
|
53
|
+
export declare function useEventBus(): EventBus;
|
|
54
|
+
//#endregion
|
package/dist/eventBus.js
CHANGED
|
@@ -1,33 +1,86 @@
|
|
|
1
|
-
import mitt from
|
|
1
|
+
import mitt from "mitt";
|
|
2
|
+
import { getCurrentInstance, inject } from "vue";
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
4
|
+
//#region src/eventBus.ts
|
|
5
|
+
let fireWarned = false;
|
|
6
|
+
function isDev() {
|
|
7
|
+
try {
|
|
8
|
+
return process.env.NODE_ENV !== "production";
|
|
9
|
+
} catch {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/** Crea un bus de eventos independiente. */
|
|
14
|
+
function createEventBus() {
|
|
15
|
+
const rawBus = mitt();
|
|
16
|
+
const registry = /* @__PURE__ */ new Map();
|
|
17
|
+
function register(event, listener, handler) {
|
|
18
|
+
let byListener = registry.get(event);
|
|
19
|
+
if (!byListener) {
|
|
20
|
+
byListener = /* @__PURE__ */ new Map();
|
|
21
|
+
registry.set(event, byListener);
|
|
22
|
+
}
|
|
23
|
+
const handlers = byListener.get(listener);
|
|
24
|
+
if (handlers) handlers.push(handler);
|
|
25
|
+
else byListener.set(listener, [handler]);
|
|
26
|
+
rawBus.on(event, handler);
|
|
27
|
+
}
|
|
28
|
+
function unregister(event, listener, handler) {
|
|
29
|
+
const byListener = registry.get(event);
|
|
30
|
+
const handlers = byListener?.get(listener);
|
|
31
|
+
if (!byListener || !handlers) return;
|
|
32
|
+
const toRemove = handler ? handlers.filter((h) => h === handler) : handlers;
|
|
33
|
+
for (const h of toRemove) rawBus.off(event, h);
|
|
34
|
+
const rest = handler ? handlers.filter((h) => h !== handler) : [];
|
|
35
|
+
if (rest.length) byListener.set(listener, rest);
|
|
36
|
+
else byListener.delete(listener);
|
|
37
|
+
if (!byListener.size) registry.delete(event);
|
|
38
|
+
}
|
|
39
|
+
const bus = {
|
|
40
|
+
rawBus,
|
|
41
|
+
emit(event, ...args) {
|
|
42
|
+
rawBus.emit(event, args);
|
|
43
|
+
},
|
|
44
|
+
on(event, listener) {
|
|
45
|
+
register(event, listener, (args) => listener(...args ?? []));
|
|
46
|
+
return listener;
|
|
47
|
+
},
|
|
48
|
+
once(event, listener) {
|
|
49
|
+
const handler = (args) => {
|
|
50
|
+
unregister(event, listener, handler);
|
|
51
|
+
listener(...args ?? []);
|
|
52
|
+
};
|
|
53
|
+
register(event, listener, handler);
|
|
54
|
+
return listener;
|
|
55
|
+
},
|
|
56
|
+
off(event, listener) {
|
|
57
|
+
if (listener) unregister(event, listener);
|
|
58
|
+
else {
|
|
59
|
+
rawBus.off(event);
|
|
60
|
+
registry.delete(event);
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
fire(event, ...args) {
|
|
64
|
+
if (!fireWarned && isDev()) {
|
|
65
|
+
fireWarned = true;
|
|
66
|
+
console.warn("[@mundoit-lib/plugin-vue-event] `fire` está deprecado y se elimina en 3.0, usar `emit`.");
|
|
67
|
+
}
|
|
68
|
+
bus.emit(event, ...args);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
return bus;
|
|
72
|
+
}
|
|
73
|
+
/** Bus por defecto: el que usa el plugin si no se le pasa otro. */
|
|
74
|
+
const eventBus = createEventBus();
|
|
75
|
+
/** Clave con la que el plugin hace `app.provide` del bus. */
|
|
76
|
+
const EVENTS_KEY = "mundoitEvents";
|
|
77
|
+
/**
|
|
78
|
+
* Devuelve el bus de la app (el que se pasó a `install`) si se llama dentro de un `setup`,
|
|
79
|
+
* o el bus por defecto si no. No desregistra nada solo: para eso está `useEvents`.
|
|
80
|
+
*/
|
|
81
|
+
function useEventBus() {
|
|
82
|
+
return getCurrentInstance() ? inject(EVENTS_KEY, eventBus) : eventBus;
|
|
83
|
+
}
|
|
32
84
|
|
|
33
|
-
|
|
85
|
+
//#endregion
|
|
86
|
+
export { EVENTS_KEY, createEventBus, eventBus, useEventBus };
|
package/dist/index.cjs
CHANGED
|
@@ -1,91 +1,11 @@
|
|
|
1
|
-
'
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
var useEventBus = () => {
|
|
13
|
-
return {
|
|
14
|
-
emit(event, ...args) {
|
|
15
|
-
eventBus.emit(event, args);
|
|
16
|
-
},
|
|
17
|
-
on(event, callback) {
|
|
18
|
-
const listener = (args) => callback(...args);
|
|
19
|
-
eventBus.on(event, listener);
|
|
20
|
-
return listener;
|
|
21
|
-
},
|
|
22
|
-
fire(event, ...args) {
|
|
23
|
-
eventBus.emit(event, args);
|
|
24
|
-
},
|
|
25
|
-
off(event, listener) {
|
|
26
|
-
eventBus.off(event, listener);
|
|
27
|
-
},
|
|
28
|
-
once(event, callback) {
|
|
29
|
-
const listener = (args) => callback(...args);
|
|
30
|
-
const wrappedListener = (args) => {
|
|
31
|
-
listener(args);
|
|
32
|
-
eventBus.off(event, wrappedListener);
|
|
33
|
-
};
|
|
34
|
-
eventBus.on(event, wrappedListener);
|
|
35
|
-
return wrappedListener;
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
};
|
|
39
|
-
function plugin(VueOrApp) {
|
|
40
|
-
const bus = useEventBus();
|
|
41
|
-
if (vueDemi.isVue3) {
|
|
42
|
-
const app = VueOrApp;
|
|
43
|
-
app.config.globalProperties.$events = bus;
|
|
44
|
-
app.mixin({
|
|
45
|
-
beforeCreate() {
|
|
46
|
-
if (typeof this.$options.events !== "object") return;
|
|
47
|
-
this._eventListeners = [];
|
|
48
|
-
for (const [event, handler] of Object.entries(this.$options.events)) {
|
|
49
|
-
const boundHandler = handler.bind(this);
|
|
50
|
-
const listener = bus.on(event, boundHandler);
|
|
51
|
-
this._eventListeners.push({ event, listener });
|
|
52
|
-
}
|
|
53
|
-
},
|
|
54
|
-
beforeUnmount() {
|
|
55
|
-
if (!this._eventListeners) return;
|
|
56
|
-
for (const { event, listener } of this._eventListeners) {
|
|
57
|
-
bus.off(event, listener);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
} else if (vueDemi.isVue2) {
|
|
62
|
-
const Vue = VueOrApp;
|
|
63
|
-
Object.defineProperty(Vue.prototype, "$events", {
|
|
64
|
-
get() {
|
|
65
|
-
return bus;
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
Vue.mixin({
|
|
69
|
-
beforeCreate() {
|
|
70
|
-
if (typeof this.$options.events !== "object") return;
|
|
71
|
-
this._eventListeners = [];
|
|
72
|
-
for (const [event, handler] of Object.entries(this.$options.events)) {
|
|
73
|
-
const boundHandler = handler.bind(this);
|
|
74
|
-
const listener = bus.on(event, boundHandler);
|
|
75
|
-
this._eventListeners.push({ event, listener });
|
|
76
|
-
}
|
|
77
|
-
},
|
|
78
|
-
beforeDestroy() {
|
|
79
|
-
if (!this._eventListeners) return;
|
|
80
|
-
for (const { event, listener } of this._eventListeners) {
|
|
81
|
-
bus.off(event, listener);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
var plugin_default = plugin;
|
|
88
|
-
|
|
89
|
-
exports.eventBus = eventBus;
|
|
90
|
-
exports.eventsPlugin = plugin_default;
|
|
91
|
-
exports.useEventBus = useEventBus;
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
const require_eventBus = require('./eventBus.cjs');
|
|
3
|
+
const require_plugin = require('./plugin.cjs');
|
|
4
|
+
const require_useEvents = require('./useEvents.cjs');
|
|
5
|
+
|
|
6
|
+
exports.EVENTS_KEY = require_eventBus.EVENTS_KEY;
|
|
7
|
+
exports.createEventBus = require_eventBus.createEventBus;
|
|
8
|
+
exports.eventBus = require_eventBus.eventBus;
|
|
9
|
+
exports.eventsPlugin = require_plugin.default;
|
|
10
|
+
exports.useEventBus = require_eventBus.useEventBus;
|
|
11
|
+
exports.useEvents = require_useEvents.useEvents;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import
|
|
4
|
-
|
|
1
|
+
import { EVENTS_KEY, EventArgs, EventBus, EventBusEvents, EventBusInstance, EventListener, EventName, MundoitEvents, RawEventBus, createEventBus, eventBus, useEventBus } from "./eventBus.cjs";
|
|
2
|
+
import eventsPlugin, { EventsPluginOptions } from "./plugin.cjs";
|
|
3
|
+
import { UseEventsReturn, useEvents } from "./useEvents.cjs";
|
|
4
|
+
export { EVENTS_KEY, type EventArgs, type EventBus, type EventBusEvents, type EventBusInstance, type EventListener, type EventName, type EventsPluginOptions, type MundoitEvents, type RawEventBus, type UseEventsReturn, createEventBus, eventBus, eventsPlugin, useEventBus, useEvents };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import
|
|
4
|
-
|
|
1
|
+
import { EVENTS_KEY, EventArgs, EventBus, EventBusEvents, EventBusInstance, EventListener, EventName, MundoitEvents, RawEventBus, createEventBus, eventBus, useEventBus } from "./eventBus.js";
|
|
2
|
+
import eventsPlugin, { EventsPluginOptions } from "./plugin.js";
|
|
3
|
+
import { UseEventsReturn, useEvents } from "./useEvents.js";
|
|
4
|
+
export { EVENTS_KEY, type EventArgs, type EventBus, type EventBusEvents, type EventBusInstance, type EventListener, type EventName, type EventsPluginOptions, type MundoitEvents, type RawEventBus, type UseEventsReturn, createEventBus, eventBus, eventsPlugin, useEventBus, useEvents };
|