@mundoit-lib/plugin-vue-event 1.0.2 → 2.0.3

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.js CHANGED
@@ -1,83 +1,5 @@
1
- import mitt from 'mitt';
2
- import { isVue3, isVue2 } from 'vue-demi';
1
+ import { EVENTS_KEY, createEventBus, eventBus, useEventBus } from "./eventBus.js";
2
+ import eventsPlugin from "./plugin.js";
3
+ import { useEvents } from "./useEvents.js";
3
4
 
4
- // src/eventBus.ts
5
- var eventBus = mitt();
6
- var useEventBus = () => {
7
- return {
8
- emit(event, ...args) {
9
- eventBus.emit(event, args);
10
- },
11
- on(event, callback) {
12
- const listener = (args) => callback(...args);
13
- eventBus.on(event, listener);
14
- return listener;
15
- },
16
- fire(event, ...args) {
17
- eventBus.emit(event, args);
18
- },
19
- off(event, listener) {
20
- eventBus.off(event, listener);
21
- },
22
- once(event, callback) {
23
- const listener = (args) => callback(...args);
24
- const wrappedListener = (args) => {
25
- listener(args);
26
- eventBus.off(event, wrappedListener);
27
- };
28
- eventBus.on(event, wrappedListener);
29
- return wrappedListener;
30
- }
31
- };
32
- };
33
- function plugin(VueOrApp) {
34
- const bus = useEventBus();
35
- if (isVue3) {
36
- const app = VueOrApp;
37
- app.config.globalProperties.$events = bus;
38
- app.mixin({
39
- beforeCreate() {
40
- if (typeof this.$options.events !== "object") return;
41
- this._eventListeners = [];
42
- for (const [event, handler] of Object.entries(this.$options.events)) {
43
- const boundHandler = handler.bind(this);
44
- const listener = bus.on(event, boundHandler);
45
- this._eventListeners.push({ event, listener });
46
- }
47
- },
48
- beforeUnmount() {
49
- if (!this._eventListeners) return;
50
- for (const { event, listener } of this._eventListeners) {
51
- bus.off(event, listener);
52
- }
53
- }
54
- });
55
- } else if (isVue2) {
56
- const Vue = VueOrApp;
57
- Object.defineProperty(Vue.prototype, "$events", {
58
- get() {
59
- return bus;
60
- }
61
- });
62
- Vue.mixin({
63
- beforeCreate() {
64
- if (typeof this.$options.events !== "object") return;
65
- this._eventListeners = [];
66
- for (const [event, handler] of Object.entries(this.$options.events)) {
67
- const boundHandler = handler.bind(this);
68
- const listener = bus.on(event, boundHandler);
69
- this._eventListeners.push({ event, listener });
70
- }
71
- },
72
- beforeDestroy() {
73
- if (!this._eventListeners) return;
74
- for (const { event, listener } of this._eventListeners) {
75
- bus.off(event, listener);
76
- }
77
- }
78
- });
79
- }
80
- }
81
- var plugin_default = plugin;
82
-
83
- export { eventBus, plugin_default as eventsPlugin, useEventBus };
5
+ export { EVENTS_KEY, createEventBus, eventBus, eventsPlugin, useEventBus, useEvents };
package/dist/plugin.cjs CHANGED
@@ -1,91 +1,39 @@
1
- 'use strict';
1
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
2
+ const require_eventBus = require('./eventBus.cjs');
2
3
 
3
- var vueDemi = require('vue-demi');
4
- var mitt = require('mitt');
5
-
6
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
-
8
- var mitt__default = /*#__PURE__*/_interopDefault(mitt);
9
-
10
- // src/plugin.ts
11
- var eventBus = mitt__default.default();
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
-
40
- // src/plugin.ts
41
- function plugin(VueOrApp) {
42
- const bus = useEventBus();
43
- if (vueDemi.isVue3) {
44
- const app = VueOrApp;
45
- app.config.globalProperties.$events = bus;
46
- app.mixin({
47
- beforeCreate() {
48
- if (typeof this.$options.events !== "object") return;
49
- this._eventListeners = [];
50
- for (const [event, handler] of Object.entries(this.$options.events)) {
51
- const boundHandler = handler.bind(this);
52
- const listener = bus.on(event, boundHandler);
53
- this._eventListeners.push({ event, listener });
54
- }
55
- },
56
- beforeUnmount() {
57
- if (!this._eventListeners) return;
58
- for (const { event, listener } of this._eventListeners) {
59
- bus.off(event, listener);
60
- }
61
- }
62
- });
63
- } else if (vueDemi.isVue2) {
64
- const Vue = VueOrApp;
65
- Object.defineProperty(Vue.prototype, "$events", {
66
- get() {
67
- return bus;
68
- }
69
- });
70
- Vue.mixin({
71
- beforeCreate() {
72
- if (typeof this.$options.events !== "object") return;
73
- this._eventListeners = [];
74
- for (const [event, handler] of Object.entries(this.$options.events)) {
75
- const boundHandler = handler.bind(this);
76
- const listener = bus.on(event, boundHandler);
77
- this._eventListeners.push({ event, listener });
78
- }
79
- },
80
- beforeDestroy() {
81
- if (!this._eventListeners) return;
82
- for (const { event, listener } of this._eventListeners) {
83
- bus.off(event, listener);
84
- }
85
- }
86
- });
87
- }
4
+ //#region src/plugin.ts
5
+ /**
6
+ * Plugin de Vue 3: expone `$events`, hace `app.provide('mundoitEvents', bus)` y registra
7
+ * la opción de componente `events: { 'nombre'() {} }`.
8
+ */
9
+ function eventsPlugin(app, options = {}) {
10
+ const bus = options.bus ?? require_eventBus.eventBus;
11
+ const listeners = /* @__PURE__ */ new WeakMap();
12
+ app.config.globalProperties.$events = bus;
13
+ app.provide(require_eventBus.EVENTS_KEY, bus);
14
+ app.mixin({
15
+ beforeCreate() {
16
+ const events = this.$options.events;
17
+ if (!events || typeof events !== "object") return;
18
+ const stored = [];
19
+ for (const [event, handler] of Object.entries(events)) {
20
+ if (typeof handler !== "function") continue;
21
+ stored.push({
22
+ event,
23
+ listener: bus.on(event, handler.bind(this))
24
+ });
25
+ }
26
+ listeners.set(this, stored);
27
+ },
28
+ beforeUnmount() {
29
+ const stored = listeners.get(this);
30
+ if (!stored) return;
31
+ for (const { event, listener } of stored) bus.off(event, listener);
32
+ listeners.delete(this);
33
+ }
34
+ });
88
35
  }
89
- var plugin_default = plugin;
90
36
 
91
- module.exports = plugin_default;
37
+ //#endregion
38
+ exports.default = eventsPlugin;
39
+ exports.eventsPlugin = eventsPlugin;
package/dist/plugin.d.cts CHANGED
@@ -1,10 +1,25 @@
1
- import { App } from 'vue-demi';
2
-
3
- interface Vue2Constructor {
4
- prototype: any;
5
- mixin: (options: any) => void;
1
+ import { EventBus } from "./eventBus.cjs";
2
+ import { App } from "vue";
3
+ //#region src/plugin.d.ts
4
+ export interface EventsPluginOptions {
5
+ /** Bus a usar en la app. Por defecto, el bus compartido `eventBus`. */
6
+ bus?: EventBus;
6
7
  }
7
- declare function plugin(app: App): void;
8
- declare function plugin(Vue: Vue2Constructor): void;
9
-
10
- export { plugin as default };
8
+ type EventsOption = Record<string, (...args: any[]) => void>;
9
+ declare module 'vue' {
10
+ interface ComponentCustomProperties {
11
+ /** Bus de eventos de la app (`@mundoit-lib/plugin-vue-event`). */
12
+ $events: EventBus;
13
+ }
14
+ interface ComponentCustomOptions {
15
+ /** Listeners del bus: se registran en `beforeCreate` y se desregistran en `beforeUnmount`. */
16
+ events?: EventsOption;
17
+ }
18
+ }
19
+ /**
20
+ * Plugin de Vue 3: expone `$events`, hace `app.provide('mundoitEvents', bus)` y registra
21
+ * la opción de componente `events: { 'nombre'() {} }`.
22
+ */
23
+ declare function eventsPlugin(app: App, options?: EventsPluginOptions): void;
24
+ //#endregion
25
+ export { eventsPlugin as default, eventsPlugin };
package/dist/plugin.d.ts CHANGED
@@ -1,10 +1,25 @@
1
- import { App } from 'vue-demi';
2
-
3
- interface Vue2Constructor {
4
- prototype: any;
5
- mixin: (options: any) => void;
1
+ import { EventBus } from "./eventBus.js";
2
+ import { App } from "vue";
3
+ //#region src/plugin.d.ts
4
+ export interface EventsPluginOptions {
5
+ /** Bus a usar en la app. Por defecto, el bus compartido `eventBus`. */
6
+ bus?: EventBus;
6
7
  }
7
- declare function plugin(app: App): void;
8
- declare function plugin(Vue: Vue2Constructor): void;
9
-
10
- export { plugin as default };
8
+ type EventsOption = Record<string, (...args: any[]) => void>;
9
+ declare module 'vue' {
10
+ interface ComponentCustomProperties {
11
+ /** Bus de eventos de la app (`@mundoit-lib/plugin-vue-event`). */
12
+ $events: EventBus;
13
+ }
14
+ interface ComponentCustomOptions {
15
+ /** Listeners del bus: se registran en `beforeCreate` y se desregistran en `beforeUnmount`. */
16
+ events?: EventsOption;
17
+ }
18
+ }
19
+ /**
20
+ * Plugin de Vue 3: expone `$events`, hace `app.provide('mundoitEvents', bus)` y registra
21
+ * la opción de componente `events: { 'nombre'() {} }`.
22
+ */
23
+ declare function eventsPlugin(app: App, options?: EventsPluginOptions): void;
24
+ //#endregion
25
+ export { eventsPlugin as default, eventsPlugin };
package/dist/plugin.js CHANGED
@@ -1,85 +1,37 @@
1
- import { isVue3, isVue2 } from 'vue-demi';
2
- import mitt from 'mitt';
1
+ import { EVENTS_KEY, eventBus } from "./eventBus.js";
3
2
 
4
- // src/plugin.ts
5
- var eventBus = mitt();
6
- var useEventBus = () => {
7
- return {
8
- emit(event, ...args) {
9
- eventBus.emit(event, args);
10
- },
11
- on(event, callback) {
12
- const listener = (args) => callback(...args);
13
- eventBus.on(event, listener);
14
- return listener;
15
- },
16
- fire(event, ...args) {
17
- eventBus.emit(event, args);
18
- },
19
- off(event, listener) {
20
- eventBus.off(event, listener);
21
- },
22
- once(event, callback) {
23
- const listener = (args) => callback(...args);
24
- const wrappedListener = (args) => {
25
- listener(args);
26
- eventBus.off(event, wrappedListener);
27
- };
28
- eventBus.on(event, wrappedListener);
29
- return wrappedListener;
30
- }
31
- };
32
- };
33
-
34
- // src/plugin.ts
35
- function plugin(VueOrApp) {
36
- const bus = useEventBus();
37
- if (isVue3) {
38
- const app = VueOrApp;
39
- app.config.globalProperties.$events = bus;
40
- app.mixin({
41
- beforeCreate() {
42
- if (typeof this.$options.events !== "object") return;
43
- this._eventListeners = [];
44
- for (const [event, handler] of Object.entries(this.$options.events)) {
45
- const boundHandler = handler.bind(this);
46
- const listener = bus.on(event, boundHandler);
47
- this._eventListeners.push({ event, listener });
48
- }
49
- },
50
- beforeUnmount() {
51
- if (!this._eventListeners) return;
52
- for (const { event, listener } of this._eventListeners) {
53
- bus.off(event, listener);
54
- }
55
- }
56
- });
57
- } else if (isVue2) {
58
- const Vue = VueOrApp;
59
- Object.defineProperty(Vue.prototype, "$events", {
60
- get() {
61
- return bus;
62
- }
63
- });
64
- Vue.mixin({
65
- beforeCreate() {
66
- if (typeof this.$options.events !== "object") return;
67
- this._eventListeners = [];
68
- for (const [event, handler] of Object.entries(this.$options.events)) {
69
- const boundHandler = handler.bind(this);
70
- const listener = bus.on(event, boundHandler);
71
- this._eventListeners.push({ event, listener });
72
- }
73
- },
74
- beforeDestroy() {
75
- if (!this._eventListeners) return;
76
- for (const { event, listener } of this._eventListeners) {
77
- bus.off(event, listener);
78
- }
79
- }
80
- });
81
- }
3
+ //#region src/plugin.ts
4
+ /**
5
+ * Plugin de Vue 3: expone `$events`, hace `app.provide('mundoitEvents', bus)` y registra
6
+ * la opción de componente `events: { 'nombre'() {} }`.
7
+ */
8
+ function eventsPlugin(app, options = {}) {
9
+ const bus = options.bus ?? eventBus;
10
+ const listeners = /* @__PURE__ */ new WeakMap();
11
+ app.config.globalProperties.$events = bus;
12
+ app.provide(EVENTS_KEY, bus);
13
+ app.mixin({
14
+ beforeCreate() {
15
+ const events = this.$options.events;
16
+ if (!events || typeof events !== "object") return;
17
+ const stored = [];
18
+ for (const [event, handler] of Object.entries(events)) {
19
+ if (typeof handler !== "function") continue;
20
+ stored.push({
21
+ event,
22
+ listener: bus.on(event, handler.bind(this))
23
+ });
24
+ }
25
+ listeners.set(this, stored);
26
+ },
27
+ beforeUnmount() {
28
+ const stored = listeners.get(this);
29
+ if (!stored) return;
30
+ for (const { event, listener } of stored) bus.off(event, listener);
31
+ listeners.delete(this);
32
+ }
33
+ });
82
34
  }
83
- var plugin_default = plugin;
84
35
 
85
- export { plugin_default as default };
36
+ //#endregion
37
+ export { eventsPlugin as default, eventsPlugin };
@@ -0,0 +1,51 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_eventBus = require('./eventBus.cjs');
3
+ let vue = require("vue");
4
+
5
+ //#region src/useEvents.ts
6
+ /**
7
+ * Bus de eventos para Composition API. Lo que se registre con `on`/`once` desde un `setup`
8
+ * se desregistra solo en `onBeforeUnmount`. Fuera de un componente se comporta como el bus.
9
+ *
10
+ * @param bus bus a usar; por defecto, el de la app (`install(app, { bus })`) o el bus por defecto.
11
+ */
12
+ function useEvents(bus = require_eventBus.useEventBus()) {
13
+ const registrations = [];
14
+ function add(event, listener, once) {
15
+ const fn = listener;
16
+ const registration = {
17
+ event,
18
+ listener: fn,
19
+ handler: fn
20
+ };
21
+ registration.handler = once ? (...args) => {
22
+ remove(registration);
23
+ fn(...args);
24
+ } : (...args) => fn(...args);
25
+ registrations.push(registration);
26
+ bus.on(event, registration.handler);
27
+ return listener;
28
+ }
29
+ function remove(registration) {
30
+ const index = registrations.indexOf(registration);
31
+ if (index !== -1) registrations.splice(index, 1);
32
+ bus.off(registration.event, registration.handler);
33
+ }
34
+ if ((0, vue.getCurrentInstance)()) (0, vue.onBeforeUnmount)(() => {
35
+ for (const registration of [...registrations]) remove(registration);
36
+ });
37
+ return {
38
+ emit: (event, ...args) => bus.emit(event, ...args),
39
+ on: (event, listener) => add(event, listener, false),
40
+ once: (event, listener) => add(event, listener, true),
41
+ off(event, listener) {
42
+ const own = registrations.filter((r) => r.event === event && (!listener || r.listener === listener));
43
+ for (const registration of own) remove(registration);
44
+ if (!listener) bus.off(event);
45
+ else if (!own.length) bus.off(event, listener);
46
+ }
47
+ };
48
+ }
49
+
50
+ //#endregion
51
+ exports.useEvents = useEvents;
@@ -0,0 +1,11 @@
1
+ import { EventBus } from "./eventBus.cjs";
2
+ //#region src/useEvents.d.ts
3
+ export type UseEventsReturn = Pick<EventBus, 'emit' | 'on' | 'once' | 'off'>;
4
+ /**
5
+ * Bus de eventos para Composition API. Lo que se registre con `on`/`once` desde un `setup`
6
+ * se desregistra solo en `onBeforeUnmount`. Fuera de un componente se comporta como el bus.
7
+ *
8
+ * @param bus bus a usar; por defecto, el de la app (`install(app, { bus })`) o el bus por defecto.
9
+ */
10
+ export declare function useEvents(bus?: EventBus): UseEventsReturn;
11
+ //#endregion
@@ -0,0 +1,11 @@
1
+ import { EventBus } from "./eventBus.js";
2
+ //#region src/useEvents.d.ts
3
+ export type UseEventsReturn = Pick<EventBus, 'emit' | 'on' | 'once' | 'off'>;
4
+ /**
5
+ * Bus de eventos para Composition API. Lo que se registre con `on`/`once` desde un `setup`
6
+ * se desregistra solo en `onBeforeUnmount`. Fuera de un componente se comporta como el bus.
7
+ *
8
+ * @param bus bus a usar; por defecto, el de la app (`install(app, { bus })`) o el bus por defecto.
9
+ */
10
+ export declare function useEvents(bus?: EventBus): UseEventsReturn;
11
+ //#endregion
@@ -0,0 +1,50 @@
1
+ import { useEventBus } from "./eventBus.js";
2
+ import { getCurrentInstance, onBeforeUnmount } from "vue";
3
+
4
+ //#region src/useEvents.ts
5
+ /**
6
+ * Bus de eventos para Composition API. Lo que se registre con `on`/`once` desde un `setup`
7
+ * se desregistra solo en `onBeforeUnmount`. Fuera de un componente se comporta como el bus.
8
+ *
9
+ * @param bus bus a usar; por defecto, el de la app (`install(app, { bus })`) o el bus por defecto.
10
+ */
11
+ function useEvents(bus = useEventBus()) {
12
+ const registrations = [];
13
+ function add(event, listener, once) {
14
+ const fn = listener;
15
+ const registration = {
16
+ event,
17
+ listener: fn,
18
+ handler: fn
19
+ };
20
+ registration.handler = once ? (...args) => {
21
+ remove(registration);
22
+ fn(...args);
23
+ } : (...args) => fn(...args);
24
+ registrations.push(registration);
25
+ bus.on(event, registration.handler);
26
+ return listener;
27
+ }
28
+ function remove(registration) {
29
+ const index = registrations.indexOf(registration);
30
+ if (index !== -1) registrations.splice(index, 1);
31
+ bus.off(registration.event, registration.handler);
32
+ }
33
+ if (getCurrentInstance()) onBeforeUnmount(() => {
34
+ for (const registration of [...registrations]) remove(registration);
35
+ });
36
+ return {
37
+ emit: (event, ...args) => bus.emit(event, ...args),
38
+ on: (event, listener) => add(event, listener, false),
39
+ once: (event, listener) => add(event, listener, true),
40
+ off(event, listener) {
41
+ const own = registrations.filter((r) => r.event === event && (!listener || r.listener === listener));
42
+ for (const registration of own) remove(registration);
43
+ if (!listener) bus.off(event);
44
+ else if (!own.length) bus.off(event, listener);
45
+ }
46
+ };
47
+ }
48
+
49
+ //#endregion
50
+ export { useEvents };