@xbg.solutions/utils-events 1.0.0

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.
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Internal Event Bus
3
+ *
4
+ * Decouples components via publish/subscribe pattern.
5
+ * Uses Node.js EventEmitter for reliability.
6
+ */
7
+ import { EventEmitter } from 'events';
8
+ import { EventType, BaseEventPayload } from './event-types';
9
+ declare class EventBus extends EventEmitter {
10
+ constructor();
11
+ /**
12
+ * Emit an event with type-safe payload
13
+ */
14
+ publish<T extends BaseEventPayload>(eventType: EventType, payload: T): boolean;
15
+ /**
16
+ * Subscribe to an event
17
+ */
18
+ subscribe<T extends BaseEventPayload>(eventType: EventType, handler: (payload: T) => void | Promise<void>): void;
19
+ /**
20
+ * Subscribe to an event (one-time only)
21
+ */
22
+ subscribeOnce<T extends BaseEventPayload>(eventType: EventType, handler: (payload: T) => void | Promise<void>): void;
23
+ /**
24
+ * Unsubscribe from an event
25
+ */
26
+ unsubscribe<T extends BaseEventPayload>(eventType: EventType, handler: (payload: T) => void | Promise<void>): void;
27
+ /**
28
+ * Unsubscribe all handlers for an event type
29
+ */
30
+ unsubscribeAll(eventType: EventType): void;
31
+ /**
32
+ * Get count of listeners for an event type
33
+ */
34
+ listenerCount(eventType: EventType): number;
35
+ /**
36
+ * Clear all event listeners (useful for testing)
37
+ */
38
+ clear(): void;
39
+ }
40
+ export declare const eventBus: EventBus;
41
+ export {};
42
+ //# sourceMappingURL=event-bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../src/event-bus.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAE5D,cAAM,QAAS,SAAQ,YAAY;;IAQjC;;OAEG;IACH,OAAO,CAAC,CAAC,SAAS,gBAAgB,EAChC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,CAAC,GACT,OAAO;IAqCV;;OAEG;IACH,SAAS,CAAC,CAAC,SAAS,gBAAgB,EAClC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC5C,IAAI;IAIP;;OAEG;IACH,aAAa,CAAC,CAAC,SAAS,gBAAgB,EACtC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC5C,IAAI;IAIP;;OAEG;IACH,WAAW,CAAC,CAAC,SAAS,gBAAgB,EACpC,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC5C,IAAI;IAIP;;OAEG;IACH,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAI1C;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM;IAI3C;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAGD,eAAO,MAAM,QAAQ,UAAiB,CAAC"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ /**
3
+ * Internal Event Bus
4
+ *
5
+ * Decouples components via publish/subscribe pattern.
6
+ * Uses Node.js EventEmitter for reliability.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.eventBus = void 0;
10
+ const events_1 = require("events");
11
+ class EventBus extends events_1.EventEmitter {
12
+ constructor() {
13
+ super();
14
+ // Increase max listeners to avoid warnings in complex workflows
15
+ this.setMaxListeners(100);
16
+ }
17
+ /**
18
+ * Emit an event with type-safe payload
19
+ */
20
+ publish(eventType, payload) {
21
+ // Add timestamp if not provided
22
+ if (!payload.timestamp) {
23
+ payload.timestamp = new Date();
24
+ }
25
+ // Check if there are any listeners
26
+ const listenerCount = this.listenerCount(eventType);
27
+ if (listenerCount === 0) {
28
+ return false;
29
+ }
30
+ // Call each listener and catch any errors to prevent one failing listener
31
+ // from stopping others from being called
32
+ const rawListeners = this.rawListeners(eventType);
33
+ for (const rawListener of rawListeners) {
34
+ try {
35
+ // Check if this is a once listener (has a 'listener' property)
36
+ if (typeof rawListener === 'function' && rawListener.listener) {
37
+ // For once listeners, remove them first, then call
38
+ this.off(eventType, rawListener);
39
+ rawListener.listener(payload);
40
+ }
41
+ else {
42
+ // Regular listener
43
+ rawListener(payload);
44
+ }
45
+ }
46
+ catch (error) {
47
+ // Silently catch errors from listeners
48
+ // This matches the behavior expected by the tests
49
+ // where one failing listener doesn't stop others
50
+ }
51
+ }
52
+ return true;
53
+ }
54
+ /**
55
+ * Subscribe to an event
56
+ */
57
+ subscribe(eventType, handler) {
58
+ this.on(eventType, handler);
59
+ }
60
+ /**
61
+ * Subscribe to an event (one-time only)
62
+ */
63
+ subscribeOnce(eventType, handler) {
64
+ this.once(eventType, handler);
65
+ }
66
+ /**
67
+ * Unsubscribe from an event
68
+ */
69
+ unsubscribe(eventType, handler) {
70
+ this.off(eventType, handler);
71
+ }
72
+ /**
73
+ * Unsubscribe all handlers for an event type
74
+ */
75
+ unsubscribeAll(eventType) {
76
+ this.removeAllListeners(eventType);
77
+ }
78
+ /**
79
+ * Get count of listeners for an event type
80
+ */
81
+ listenerCount(eventType) {
82
+ return super.listenerCount(eventType);
83
+ }
84
+ /**
85
+ * Clear all event listeners (useful for testing)
86
+ */
87
+ clear() {
88
+ this.removeAllListeners();
89
+ }
90
+ }
91
+ // Singleton instance
92
+ exports.eventBus = new EventBus();
93
+ //# sourceMappingURL=event-bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../src/event-bus.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,mCAAsC;AAGtC,MAAM,QAAS,SAAQ,qBAAY;IACjC;QACE,KAAK,EAAE,CAAC;QAER,gEAAgE;QAChE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,OAAO,CACL,SAAoB,EACpB,OAAU;QAEV,gCAAgC;QAChC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;QACjC,CAAC;QAED,mCAAmC;QACnC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAEpD,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,0EAA0E;QAC1E,yCAAyC;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QAClD,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,+DAA+D;gBAC/D,IAAI,OAAO,WAAW,KAAK,UAAU,IAAK,WAAmB,CAAC,QAAQ,EAAE,CAAC;oBACvE,mDAAmD;oBACnD,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,WAAuC,CAAC,CAAC;oBAC5D,WAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACN,mBAAmB;oBAClB,WAAwC,CAAC,OAAO,CAAC,CAAC;gBACrD,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,uCAAuC;gBACvC,kDAAkD;gBAClD,iDAAiD;YACnD,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,SAAS,CACP,SAAoB,EACpB,OAA6C;QAE7C,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,aAAa,CACX,SAAoB,EACpB,OAA6C;QAE7C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,WAAW,CACT,SAAoB,EACpB,OAA6C;QAE7C,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,SAAoB;QACjC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,SAAoB;QAChC,OAAO,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;CACF;AAED,qBAAqB;AACR,QAAA,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Event Type Definitions
3
+ *
4
+ * Base event types for the internal event bus. These cover the standard
5
+ * lifecycle events that most applications need out of the box.
6
+ *
7
+ * ─── Extending with project-specific events ───────────────────────────
8
+ *
9
+ * The code generator adds entity-specific CRUD events automatically
10
+ * (e.g. ORDER_CREATED, PRODUCT_UPDATED) via BaseService.publishEvent().
11
+ * Those events are cast to EventType at runtime, so they work with the
12
+ * event bus without being listed here.
13
+ *
14
+ * To add custom domain events (e.g. ORDER_SHIPPED, PAYMENT_FAILED):
15
+ *
16
+ * 1. Add the new member to this enum.
17
+ * 2. Optionally define a typed payload interface below.
18
+ * 3. Add the mapping to EventPayloadMap for full type safety.
19
+ * 4. Subscribe in your service or in subscribers/.
20
+ *
21
+ * The enum is deliberately kept small so that new projects start clean
22
+ * and only grow the event catalogue as needed.
23
+ */
24
+ export declare enum EventType {
25
+ USER_CREATED = "user.created",
26
+ USER_UPDATED = "user.updated",
27
+ USER_DELETED = "user.deleted",
28
+ AUTH_LOGIN = "auth.login",
29
+ AUTH_LOGOUT = "auth.logout",
30
+ AUTH_TOKEN_REFRESHED = "auth.token_refreshed",
31
+ AUTH_TOKEN_BLACKLISTED = "auth.token_blacklisted",
32
+ AUTH_PASSWORD_CHANGED = "auth.password_changed",
33
+ FILE_UPLOADED = "file.uploaded",
34
+ FILE_DELETED = "file.deleted",
35
+ NOTIFICATION_SENT = "notification.sent",
36
+ NOTIFICATION_FAILED = "notification.failed",
37
+ /** Catch-all for external data changes (Firebase triggers, webhooks, etc.) */
38
+ EXTERNAL_DATA_CHANGE = "external.data.change"
39
+ }
40
+ /**
41
+ * Every event payload extends this interface.
42
+ * The event bus adds a `timestamp` automatically if one is not provided.
43
+ */
44
+ export interface BaseEventPayload {
45
+ timestamp?: Date;
46
+ [key: string]: unknown;
47
+ }
48
+ /** Payload published by BaseService on entity creation */
49
+ export interface EntityCreatedPayload extends BaseEventPayload {
50
+ entityId: string;
51
+ entityType: string;
52
+ action: 'CREATED';
53
+ userId?: string;
54
+ requestId?: string;
55
+ data?: Record<string, unknown>;
56
+ }
57
+ /** Payload published by BaseService on entity update */
58
+ export interface EntityUpdatedPayload extends BaseEventPayload {
59
+ entityId: string;
60
+ entityType: string;
61
+ action: 'UPDATED';
62
+ userId?: string;
63
+ requestId?: string;
64
+ data?: Record<string, unknown>;
65
+ }
66
+ /** Payload published by BaseService on entity deletion */
67
+ export interface EntityDeletedPayload extends BaseEventPayload {
68
+ entityId: string;
69
+ entityType: string;
70
+ action: 'DELETED';
71
+ userId?: string;
72
+ requestId?: string;
73
+ data?: Record<string, unknown>;
74
+ }
75
+ /** User lifecycle events */
76
+ export interface UserCreatedPayload extends BaseEventPayload {
77
+ userUID: string;
78
+ email?: string;
79
+ }
80
+ export interface UserUpdatedPayload extends BaseEventPayload {
81
+ userUID: string;
82
+ }
83
+ export interface UserDeletedPayload extends BaseEventPayload {
84
+ userUID: string;
85
+ }
86
+ /** Authentication events */
87
+ export interface AuthLoginPayload extends BaseEventPayload {
88
+ userUID: string;
89
+ method?: string;
90
+ }
91
+ export interface AuthLogoutPayload extends BaseEventPayload {
92
+ userUID: string;
93
+ }
94
+ export interface AuthTokenBlacklistedPayload extends BaseEventPayload {
95
+ userUID: string;
96
+ reason?: string;
97
+ }
98
+ /** File events */
99
+ export interface FileUploadedPayload extends BaseEventPayload {
100
+ filePath: string;
101
+ contentType?: string;
102
+ size?: number;
103
+ bucket?: string;
104
+ }
105
+ export interface FileDeletedPayload extends BaseEventPayload {
106
+ filePath: string;
107
+ }
108
+ /** Notification events */
109
+ export interface NotificationSentPayload extends BaseEventPayload {
110
+ channel: 'email' | 'sms' | 'push' | string;
111
+ recipientId?: string;
112
+ }
113
+ export interface NotificationFailedPayload extends BaseEventPayload {
114
+ channel: 'email' | 'sms' | 'push' | string;
115
+ recipientId?: string;
116
+ error?: string;
117
+ }
118
+ /** External data change (Firebase triggers, webhooks, etc.) */
119
+ export interface ExternalDataChangePayload extends BaseEventPayload {
120
+ source: 'firestore' | 'auth' | 'storage' | string;
121
+ collection?: string;
122
+ documentId?: string;
123
+ operation?: string;
124
+ userId?: string;
125
+ filePath?: string;
126
+ }
127
+ /**
128
+ * Maps each EventType to its strongly-typed payload.
129
+ * Extend this map when adding new event types.
130
+ */
131
+ export interface EventPayloadMap {
132
+ [EventType.USER_CREATED]: UserCreatedPayload;
133
+ [EventType.USER_UPDATED]: UserUpdatedPayload;
134
+ [EventType.USER_DELETED]: UserDeletedPayload;
135
+ [EventType.AUTH_LOGIN]: AuthLoginPayload;
136
+ [EventType.AUTH_LOGOUT]: AuthLogoutPayload;
137
+ [EventType.AUTH_TOKEN_REFRESHED]: BaseEventPayload;
138
+ [EventType.AUTH_TOKEN_BLACKLISTED]: AuthTokenBlacklistedPayload;
139
+ [EventType.AUTH_PASSWORD_CHANGED]: BaseEventPayload;
140
+ [EventType.FILE_UPLOADED]: FileUploadedPayload;
141
+ [EventType.FILE_DELETED]: FileDeletedPayload;
142
+ [EventType.NOTIFICATION_SENT]: NotificationSentPayload;
143
+ [EventType.NOTIFICATION_FAILED]: NotificationFailedPayload;
144
+ [EventType.EXTERNAL_DATA_CHANGE]: ExternalDataChangePayload;
145
+ }
146
+ //# sourceMappingURL=event-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-types.d.ts","sourceRoot":"","sources":["../src/event-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ /**
3
+ * Event Type Definitions
4
+ *
5
+ * Base event types for the internal event bus. These cover the standard
6
+ * lifecycle events that most applications need out of the box.
7
+ *
8
+ * ─── Extending with project-specific events ───────────────────────────
9
+ *
10
+ * The code generator adds entity-specific CRUD events automatically
11
+ * (e.g. ORDER_CREATED, PRODUCT_UPDATED) via BaseService.publishEvent().
12
+ * Those events are cast to EventType at runtime, so they work with the
13
+ * event bus without being listed here.
14
+ *
15
+ * To add custom domain events (e.g. ORDER_SHIPPED, PAYMENT_FAILED):
16
+ *
17
+ * 1. Add the new member to this enum.
18
+ * 2. Optionally define a typed payload interface below.
19
+ * 3. Add the mapping to EventPayloadMap for full type safety.
20
+ * 4. Subscribe in your service or in subscribers/.
21
+ *
22
+ * The enum is deliberately kept small so that new projects start clean
23
+ * and only grow the event catalogue as needed.
24
+ */
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.EventType = void 0;
27
+ var EventType;
28
+ (function (EventType) {
29
+ // ── User lifecycle ────────────────────────────────────────
30
+ EventType["USER_CREATED"] = "user.created";
31
+ EventType["USER_UPDATED"] = "user.updated";
32
+ EventType["USER_DELETED"] = "user.deleted";
33
+ // ── Authentication ────────────────────────────────────────
34
+ EventType["AUTH_LOGIN"] = "auth.login";
35
+ EventType["AUTH_LOGOUT"] = "auth.logout";
36
+ EventType["AUTH_TOKEN_REFRESHED"] = "auth.token_refreshed";
37
+ EventType["AUTH_TOKEN_BLACKLISTED"] = "auth.token_blacklisted";
38
+ EventType["AUTH_PASSWORD_CHANGED"] = "auth.password_changed";
39
+ // ── File / Storage ────────────────────────────────────────
40
+ EventType["FILE_UPLOADED"] = "file.uploaded";
41
+ EventType["FILE_DELETED"] = "file.deleted";
42
+ // ── Notifications ─────────────────────────────────────────
43
+ EventType["NOTIFICATION_SENT"] = "notification.sent";
44
+ EventType["NOTIFICATION_FAILED"] = "notification.failed";
45
+ // ── System ────────────────────────────────────────────────
46
+ /** Catch-all for external data changes (Firebase triggers, webhooks, etc.) */
47
+ EventType["EXTERNAL_DATA_CHANGE"] = "external.data.change";
48
+ })(EventType || (exports.EventType = EventType = {}));
49
+ //# sourceMappingURL=event-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-types.js","sourceRoot":"","sources":["../src/event-types.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;AAEH,IAAY,SAwBX;AAxBD,WAAY,SAAS;IACnB,6DAA6D;IAC7D,0CAA6B,CAAA;IAC7B,0CAA6B,CAAA;IAC7B,0CAA6B,CAAA;IAE7B,6DAA6D;IAC7D,sCAAyB,CAAA;IACzB,wCAA2B,CAAA;IAC3B,0DAA6C,CAAA;IAC7C,8DAAiD,CAAA;IACjD,4DAA+C,CAAA;IAE/C,6DAA6D;IAC7D,4CAA+B,CAAA;IAC/B,0CAA6B,CAAA;IAE7B,6DAA6D;IAC7D,oDAAuC,CAAA;IACvC,wDAA2C,CAAA;IAE3C,6DAA6D;IAC7D,8EAA8E;IAC9E,0DAA6C,CAAA;AAC/C,CAAC,EAxBW,SAAS,yBAAT,SAAS,QAwBpB"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Event utilities barrel export
3
+ */
4
+ export { eventBus } from './event-bus';
5
+ export { EventType } from './event-types';
6
+ export type { BaseEventPayload, EntityCreatedPayload, EntityUpdatedPayload, EntityDeletedPayload, UserCreatedPayload, UserUpdatedPayload, UserDeletedPayload, AuthLoginPayload, AuthLogoutPayload, AuthTokenBlacklistedPayload, FileUploadedPayload, FileDeletedPayload, NotificationSentPayload, NotificationFailedPayload, ExternalDataChangePayload, EventPayloadMap, } from './event-types';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,YAAY,EACV,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,2BAA2B,EAC3B,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,eAAe,GAChB,MAAM,eAAe,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ /**
3
+ * Event utilities barrel export
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.EventType = exports.eventBus = void 0;
7
+ var event_bus_1 = require("./event-bus");
8
+ Object.defineProperty(exports, "eventBus", { enumerable: true, get: function () { return event_bus_1.eventBus; } });
9
+ var event_types_1 = require("./event-types");
10
+ Object.defineProperty(exports, "EventType", { enumerable: true, get: function () { return event_types_1.EventType; } });
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,yCAAuC;AAA9B,qGAAA,QAAQ,OAAA;AACjB,6CAA0C;AAAjC,wGAAA,SAAS,OAAA"}
package/package.json ADDED
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@xbg.solutions/utils-events",
3
+ "version": "1.0.0",
4
+ "description": "Event bus for domain events",
5
+ "main": "lib/index.js",
6
+ "types": "lib/index.d.ts",
7
+ "files": ["lib"],
8
+ "scripts": {
9
+ "build": "tsc",
10
+ "build:watch": "tsc --watch",
11
+ "clean": "rm -rf lib",
12
+ "prepublishOnly": "npm run build"
13
+ },
14
+ "dependencies": {},
15
+ "devDependencies": {"@types/node": "^20.11.0", "typescript": "^5.3.3"},
16
+ "engines": {
17
+ "node": "22"
18
+ },
19
+ "publishConfig": {
20
+ "access": "public"
21
+ }
22
+ }