danholibraryjs 1.3.0 → 1.7.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.
Files changed (103) hide show
  1. package/.gitattributes +2 -2
  2. package/README.md +12 -304
  3. package/Time.xlsx +0 -0
  4. package/dist/Classes/{Event.d.ts → Events/Event.d.ts} +14 -11
  5. package/dist/Classes/{Event.js → Events/Event.js} +16 -6
  6. package/dist/Classes/{EventCollection.d.ts → Events/EventCollection.d.ts} +10 -9
  7. package/dist/Classes/{EventCollection.js → Events/EventCollection.js} +27 -28
  8. package/dist/Classes/{EventEmitter.d.ts → Events/EventEmitter.d.ts} +11 -8
  9. package/dist/Classes/{EventEmitter.js → Events/EventEmitter.js} +7 -1
  10. package/dist/Classes/Events/index.d.ts +3 -0
  11. package/dist/Classes/Events/index.js +19 -0
  12. package/dist/Classes/Time/Date.d.ts +147 -0
  13. package/dist/Classes/Time/Date.js +238 -0
  14. package/dist/Classes/Time/Time.d.ts +65 -0
  15. package/dist/Classes/Time/Time.js +117 -0
  16. package/dist/Classes/Time/TimeProperties.d.ts +3 -0
  17. package/dist/{Types/EventHandler.js → Classes/Time/TimeProperties.js} +0 -0
  18. package/dist/Classes/Time/TimeSpan.d.ts +123 -0
  19. package/dist/Classes/Time/TimeSpan.js +179 -0
  20. package/dist/Classes/Time/index.d.ts +4 -0
  21. package/dist/Classes/Time/index.js +20 -0
  22. package/dist/Classes/index.d.ts +2 -2
  23. package/dist/Classes/index.js +7 -3
  24. package/dist/Extensions/Array.d.ts +31 -0
  25. package/dist/Extensions/Array.js +26 -0
  26. package/dist/Extensions/Map.d.ts +38 -0
  27. package/dist/Extensions/Map.js +31 -0
  28. package/dist/Extensions/Object.d.ts +16 -0
  29. package/dist/Extensions/Object.js +8 -0
  30. package/dist/Extensions/String.d.ts +26 -0
  31. package/dist/Extensions/String.js +17 -0
  32. package/dist/Extensions/index.d.ts +29 -0
  33. package/dist/Extensions/index.js +71 -0
  34. package/dist/Functions/GetCSSProperty.d.ts +15 -0
  35. package/dist/Functions/GetCSSProperty.js +26 -0
  36. package/dist/Functions/HTMLEvent.d.ts +11 -0
  37. package/dist/Functions/HTMLEvent.js +14 -0
  38. package/dist/Functions/SetNavigationSelected.js +2 -0
  39. package/dist/Functions/index.d.ts +2 -0
  40. package/dist/Functions/index.js +7 -1
  41. package/dist/Interfaces/ElementOptions.d.ts +12 -18
  42. package/dist/Interfaces/IReplacement.d.ts +3 -2
  43. package/dist/Interfaces/index.js +5 -1
  44. package/dist/Types/BetterTypes.d.ts +9 -0
  45. package/dist/Types/{IElement.js → BetterTypes.js} +0 -0
  46. package/dist/Types/Date.d.ts +6 -0
  47. package/dist/Types/{StringRegex.js → Date.js} +0 -0
  48. package/dist/Types/Events.d.ts +10 -0
  49. package/dist/Types/Events.js +2 -0
  50. package/dist/Types/PropertiesWith.d.ts +13 -0
  51. package/dist/Types/PropertiesWith.js +2 -0
  52. package/dist/Types/TransformTypes.d.ts +13 -0
  53. package/dist/Types/TransformTypes.js +2 -0
  54. package/dist/Types/index.d.ts +31 -3
  55. package/dist/Types/index.js +10 -4
  56. package/dist/index.d.ts +5 -9
  57. package/dist/index.js +19 -8
  58. package/docs/Classes.md +455 -0
  59. package/docs/Extensions.md +146 -0
  60. package/docs/Functions.md +53 -0
  61. package/docs/Interfaces.md +34 -0
  62. package/docs/Types.md +129 -0
  63. package/docs/index.md +29 -0
  64. package/package.json +22 -21
  65. package/src/Classes/{Event.ts → Events/Event.ts} +31 -20
  66. package/src/Classes/Events/EventCollection.ts +109 -0
  67. package/src/Classes/{EventEmitter.ts → Events/EventEmitter.ts} +16 -13
  68. package/src/Classes/Events/index.ts +3 -0
  69. package/src/Classes/Time/Date.ts +264 -0
  70. package/src/Classes/Time/Time.ts +134 -0
  71. package/src/Classes/Time/TimeProperties.ts +3 -0
  72. package/src/Classes/Time/TimeSpan.ts +195 -0
  73. package/src/Classes/Time/index.ts +4 -0
  74. package/src/Classes/index.ts +2 -2
  75. package/src/Extensions/Array.ts +57 -0
  76. package/src/Extensions/Map.ts +73 -0
  77. package/src/Extensions/Object.ts +25 -0
  78. package/src/Extensions/String.ts +43 -0
  79. package/src/Extensions/index.ts +83 -0
  80. package/src/Functions/GetCSSProperty.ts +27 -0
  81. package/src/Functions/HTMLEvent.ts +13 -0
  82. package/src/Functions/SetNavigationSelected.ts +1 -0
  83. package/src/Functions/index.ts +3 -1
  84. package/src/Interfaces/ElementOptions.ts +18 -16
  85. package/src/Interfaces/IReplacement.ts +4 -3
  86. package/src/Types/BetterTypes.ts +10 -0
  87. package/src/Types/Date.ts +7 -0
  88. package/src/Types/Events.ts +15 -0
  89. package/src/Types/PropertiesWith.ts +14 -0
  90. package/src/Types/TransformTypes.ts +18 -0
  91. package/src/Types/index.ts +36 -3
  92. package/src/index.ts +5 -13
  93. package/tsconfig.json +99 -7
  94. package/dist/Extensions.d.ts +0 -81
  95. package/dist/Extensions.js +0 -80
  96. package/dist/Types/EventHandler.d.ts +0 -6
  97. package/dist/Types/IElement.d.ts +0 -9
  98. package/dist/Types/StringRegex.d.ts +0 -2
  99. package/src/Classes/EventCollection.ts +0 -115
  100. package/src/Extensions.ts +0 -179
  101. package/src/Types/EventHandler.ts +0 -6
  102. package/src/Types/IElement.ts +0 -9
  103. package/src/Types/StringRegex.ts +0 -2
package/docs/Types.md ADDED
@@ -0,0 +1,129 @@
1
+ # [DanhoLibraryJS](../README.md)
2
+
3
+ ## Types
4
+
5
+ ### General
6
+
7
+ ``` ts
8
+ /**
9
+ * Type's properties are ReturnType
10
+ */
11
+ export type AllPropsAre<ReturnType> = {
12
+ [key: string]: ReturnType
13
+ }
14
+
15
+ /**
16
+ * Item is single or multiple
17
+ */
18
+ export type Arrayable<T> = T | Array<T>;
19
+
20
+ /**
21
+ * Used for HTMLElement.append in ElementOptions, Document.createProperElement.
22
+ * IElement accepts HTML Elements or HTMl-like strings.
23
+ *
24
+ * @see HTMLElement.append
25
+ * @see Document.createProperElement
26
+ */
27
+ export type IElement = HTMLElement | string;
28
+
29
+ /**
30
+ * string or RegExp.. pretty self-explanatory
31
+ */
32
+ export type StringRegex = string | RegExp;
33
+
34
+ /**
35
+ * Return types of T
36
+ */
37
+ export type ValueOf<T> = T[keyof T];
38
+ ```
39
+
40
+ ### BetterTypes
41
+
42
+ ```ts
43
+ /**
44
+ * Construct a type with the properties of Type except for those in type Properties.
45
+ */
46
+ export type BetterOmit<Type, Properties extends keyof Type> = Omit<Type, Properties>;
47
+ /**
48
+ * Extract from From those types that are assignable to Properties
49
+ */
50
+ export type BetterExtract<From, Properties extends From> = Extract<From, Properties>;
51
+ ```
52
+
53
+ ### Events
54
+
55
+ ```ts
56
+ /**
57
+ * Default eventhandler mapper. Object with properties that are arrays
58
+ */
59
+ export type BaseEvent<Keys extends string, Types extends Array<any>> = Record<Keys, Types>;
60
+
61
+ /**
62
+ * Eventhandler type for:
63
+ * @see EventCollection
64
+ * @borrows BaseEvent
65
+ */
66
+ export type EventHandler<
67
+ Events extends BaseEvent<string, Array<any>> = BaseEvent<string, Array<any>>,
68
+ Event extends keyof Events = keyof Events,
69
+ ReturnType = any
70
+ > = (...args: Events[Event]) => ReturnType;
71
+ ```
72
+
73
+ ### PropertiesWith
74
+
75
+ ```ts
76
+ /**
77
+ * Filters all properties from From that has the return type of Type
78
+ */
79
+ export type PropertiesWith<Type, From> = {
80
+ [Key in keyof From as From[Key] extends Type ? Key : never]: From[Key]
81
+ }
82
+ export default PropertiesWith;
83
+
84
+ /**
85
+ * Fitlers all properties from From that don't have the return type of Type
86
+ */
87
+ export type PropertiesWithout<Type, From> = {
88
+ [Key in keyof From as From[Key] extends Type ? never : Key]: From[Key]
89
+ }
90
+ ```
91
+
92
+ ### Time
93
+
94
+ ```ts
95
+ /**
96
+ * Type used to construct DanhoDate.
97
+ * @Data Partial TimeProperties except years & months
98
+ * @DateFormat string as dd/MM/yyyy
99
+ */
100
+ export type DanhoDateConstructor = Data | DateFormat | number | Date;
101
+
102
+ /**
103
+ * Object interface with keys above to number values. If Plural is true, all properties ends with 's'
104
+ */
105
+ export type TimeProperties<Plural extends boolean = false> = Record<Plural extends true ? `${TimeKeys}s` : TimeKeys, number>
106
+
107
+ /**
108
+ * What properties to include when using TimeSpan.toString(format: TimeSpanFormat): string
109
+ */
110
+ export type TimeSpanFormat = Partial<TransformType<TimeProperties<true>, number, boolean>>
111
+ ```
112
+
113
+ ### TransformTypes
114
+
115
+ ```ts
116
+ /**
117
+ * Converts Start types to Switch types in From type
118
+ */
119
+ export type TransformType<From, Start, Switch> = {
120
+ [Key in keyof From]: From[Key] extends Start ? Switch : From[Key]
121
+ }
122
+
123
+ /**
124
+ * Returns object with properties matching BaseType with types of NewType
125
+ */
126
+ export type TransformTypes<From, BaseType, NewType> = Record<keyof {
127
+ [Key in keyof From as From[Key] extends BaseType ? Key : never]: Key
128
+ }, NewType>
129
+ ```
package/docs/index.md ADDED
@@ -0,0 +1,29 @@
1
+ # [DanhoLibraryJS](../README.md)
2
+
3
+ [By DanielSimonsen90 // Danhosaur](https://github.com/DanielSimonsen90)
4
+
5
+ ## Installation
6
+
7
+ ### Vanilla
8
+
9
+ ```html
10
+ <script src="https://cdn.jsdelivr.net/gh/DanielSimonsen90/DanhoLibraryJS@latest/dist/index.js"></script>
11
+ ```
12
+
13
+ ### Node
14
+
15
+ ```cmd
16
+ npm install danholibraryjs
17
+ ```
18
+
19
+ ```js
20
+ import { ... } from 'DanhoLibraryJS';
21
+ ```
22
+
23
+ ## Documentation
24
+
25
+ * [Classes](./Classes.md)
26
+ * [Extensions](./Extensions.md)
27
+ * [Functions](./Functions.md)
28
+ * [Interfaces](./Interfaces.md)
29
+ * [Types](./Types.md)
package/package.json CHANGED
@@ -1,21 +1,22 @@
1
- {
2
- "name": "danholibraryjs",
3
- "version": "1.3.0",
4
- "description": "Library for Javascript.",
5
- "main": "dist/index.js",
6
- "types": "dist/index.d.ts",
7
- "scripts": {
8
- "test": "echo \"Error: no test specified\" && exit 1"
9
- },
10
- "repository": {
11
- "type": "git",
12
- "url": "git+https://github.com/DanielSimonsen90/DanhoLibraryJS.git"
13
- },
14
- "keywords": ["library", "javascript"],
15
- "author": "DanielSimonsen90 | Danhosaur | Daniel Simonsen",
16
- "license": "ISC",
17
- "bugs": {
18
- "url": "https://github.com/DanielSimonsen90/DanhoLibraryJS/issues"
19
- },
20
- "homepage": "https://github.com/DanielSimonsen90/DanhoLibraryJS#readme"
21
- }
1
+ {
2
+ "name": "danholibraryjs",
3
+ "version": "1.7.0",
4
+ "description": "Library for Javascript.",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "npx tsc --project tsconfig.json",
9
+ "build-watch": "npx tsc --project tsconfig.json --watch true"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/DanielSimonsen90/DanhoLibraryJS.git"
14
+ },
15
+ "keywords": ["library", "javascript"],
16
+ "author": "DanielSimonsen90 | Danhosaur | Daniel Simonsen",
17
+ "license": "ISC",
18
+ "bugs": {
19
+ "url": "https://github.com/DanielSimonsen90/DanhoLibraryJS/issues"
20
+ },
21
+ "homepage": "https://github.com/DanielSimonsen90/DanhoLibraryJS#readme"
22
+ }
@@ -1,19 +1,25 @@
1
- import EventHandler from "../Types/EventHandler";
1
+ import { BaseEvent, EventHandler } from "../../Types/Events";
2
2
 
3
- /**Base event for @see EventEmitter, @borrows EventHandler*/
4
- export default class Event<ReturnType = any> {
3
+ /**
4
+ * Base event for @see EventEmitter, @borrows EventHandler @borrows BaseEvent
5
+ */
6
+ export class Event<
7
+ Events extends BaseEvent<string, Array<any>>,
8
+ Name extends keyof Events = keyof Events,
9
+ > {
5
10
  /**
6
11
  * Base event for @see EventEmitter, @borrows EventHandler
7
12
  * @param name Name of event
8
13
  * @param listeners Listeners/Handlers to execute when emitted
9
14
  */
10
- constructor(name: string, ...listeners: Array<EventHandler<ReturnType>>) {
15
+ constructor(name: Name, ...listeners: Array<EventHandler<Events, Name>>) {
11
16
  this.name = name;
12
17
  this._listeners = listeners;
18
+ this._lastEmitted = new Date();
13
19
  }
14
20
 
15
21
  /**Name of event*/
16
- public name: string;
22
+ public name: Name;
17
23
  /**Listener limit - default: 0 */
18
24
  public limit = 0;
19
25
  /**Number of times event was emitted - default: 0*/
@@ -26,21 +32,21 @@ export default class Event<ReturnType = any> {
26
32
  }
27
33
 
28
34
  /**@private Internal listeners array*/
29
- private _listeners: Array<EventHandler<ReturnType>>;
35
+ private _listeners: Array<EventHandler<Events, Name>>;
30
36
  /**@private Internal runs*/
31
37
  private _runs = 0;
32
38
  /**@private Internal lastEmitted*/
33
- private _lastEmitted: Date = null;
39
+ private _lastEmitted: Date;
34
40
 
35
41
  /**
36
42
  * Emits event and returns array of responses
37
43
  * @param args Arguments required for event listeners
38
44
  * @returns Return values of listeners' returns
39
45
  */
40
- public emit(...args: any[]) {
46
+ public emit(...args: Events[Name]) {
41
47
  this._runs++;
42
48
  this._lastEmitted = new Date();
43
- return this._listeners.map(listener => listener(...args))
49
+ return this._listeners.map(listener => (listener as any)(...args))
44
50
  }
45
51
  /**
46
52
  * Adds listener to listeners array and returns self with new listener added
@@ -50,7 +56,7 @@ export default class Event<ReturnType = any> {
50
56
  *
51
57
  * @throws Limit error, if limit was reached
52
58
  */
53
- public on(listener: EventHandler<ReturnType>, prepend = false) {
59
+ public on(listener: EventHandler<Events, Name>, prepend = false) {
54
60
  if (this.limit > 0 && this._listeners.length + 1 > this.limit) {
55
61
  throw new Error(`Event limit, ${this.limit}, reached for event ${this.name}!`);
56
62
  }
@@ -68,13 +74,13 @@ export default class Event<ReturnType = any> {
68
74
  *
69
75
  * @throws Limit error, if limit was reached
70
76
  */
71
- public once(listener: EventHandler<ReturnType>, prepend = false) {
72
- const handler = (...args: any[]) => {
73
- const result = listener(...args);
74
- this.off(handler);
77
+ public once(listener: EventHandler<Events, Name>, prepend = false) {
78
+ const handler = (...params: Events[Name]) => {
79
+ const result = (listener as any)(...params);
80
+ this.off(handler as any);
75
81
  return result;
76
82
  }
77
- this.on(handler, prepend);
83
+ this.on(handler as any, prepend);
78
84
  return this;
79
85
  }
80
86
 
@@ -83,21 +89,26 @@ export default class Event<ReturnType = any> {
83
89
  * @param listener Listener to test
84
90
  * @returns True of false, depending if event includes listener
85
91
  */
86
- public includes(listener: EventHandler<ReturnType>) {
92
+ public includes(listener: EventHandler<Events, Name>) {
87
93
  return this._listeners.includes(listener);
88
94
  }
89
95
 
90
96
  /**
91
97
  * Removes listener from internal listeners array
92
- * @param listener Listener to remove
98
+ * @param listener Listener to remove. If none specified, all will be removed
93
99
  * @param throwNotFoundError Throw error if listener isn't in listeners array - default: false
94
100
  * @returns this, without listener
95
101
  *
96
102
  * @throws NotFound, if throwNotFoundError is true, and internal listeners array doesn't include listener provided
97
103
  */
98
- public off(listener: EventHandler<ReturnType>, throwNotFoundError = false) {
99
- try { this._listeners.remove(listener); }
104
+ public off(listener?: EventHandler<Events, Name>, throwNotFoundError = false) {
105
+ try {
106
+ if (!listener) this._listeners = new Array<EventHandler<Events, Name>>()
107
+ else if (!this._listeners.includes(listener)) return this;
108
+ else this._listeners.remove(listener);
109
+ }
100
110
  catch (err) { if (throwNotFoundError) throw err; }
101
111
  return this;
102
112
  }
103
- }
113
+ }
114
+ export default Event;
@@ -0,0 +1,109 @@
1
+ import { BaseEvent, EventHandler } from "../../Types/Events";
2
+ import Event from './Event';
3
+
4
+ /**
5
+ * Collection of Events from @see EventEmitter
6
+ * @borrows EventHandler
7
+ * @borrows Event
8
+ * @borrows BaseEvent
9
+ */
10
+ export class EventCollection<Events extends BaseEvent<string, Array<any>>> {
11
+ constructor(events?: Map<keyof Events, EventHandler<Events>>) {
12
+ this._events = !events ?
13
+ new Map<keyof Events, Event<Events>>() :
14
+ events.array().reduce((result, [event, handlers]) =>
15
+ result.set(event, new Event<Events>(event, handlers)),
16
+ new Map<keyof Events, Event<Events>>());
17
+ }
18
+
19
+ /**Amount of events stored*/
20
+ public get size() {
21
+ return this._events.size;
22
+ }
23
+ /**@private Internal event collection*/
24
+ private _events = new Map<keyof Events, Event<Events>>();
25
+ /**@private limit of events*/
26
+ private _limit = 0;
27
+
28
+ /**
29
+ * Returns true if event is in collection
30
+ * @param event Event name
31
+ * @returns true if event is in collection
32
+ */
33
+ public has<EventName extends keyof Events>(event: EventName): boolean {
34
+ return this._events.has(event);
35
+ }
36
+ /**
37
+ * Returns event matching event parameter
38
+ * @param event Event name
39
+ * @returns Event
40
+ */
41
+ public get<EventName extends keyof Events>(event: EventName): Event<Events, EventName> {
42
+ return this._events.get(event) as any;
43
+ }
44
+ /**
45
+ * Adds handler to event collection with name as key
46
+ * @param name Event name
47
+ * @param handler Handler for event
48
+ * @returns this
49
+ */
50
+ public add<EventName extends keyof Events>(name: EventName, handler: EventHandler<Events, keyof Events>, once = false): this {
51
+ if (this._limit > 0 && this._limit + 1 > this._events.size) {
52
+ throw new Error(`Listener limit, ${this._limit}, reached!`);
53
+ }
54
+
55
+ const event = (this.has(name) && this.get(name)) || new Event(name);
56
+ this._events.set(name, event.on(handler, once) as any);
57
+ return this;
58
+ }
59
+ /**
60
+ * @summary clear(): Clears all events
61
+ * @summary clear("all", myEventHandler): Removes myEventHandler from all events that have it
62
+ * @summary clear("myEvent"): Clears all handlers tied to "myEvent"
63
+ * @summary clear("myEvent", myEventHandler): Removes myEventHandler from "myEvent"
64
+ *
65
+ * @param name Event name | "all"
66
+ * @param handler Specific handler to remove. If left blank, all handlers in name will be removed
67
+ * @returns this
68
+ */
69
+ public clear<EventName extends keyof Events>(name: EventName | 'all' = 'all', handler?: EventHandler): this {
70
+ const _name = name as string;
71
+
72
+ if (_name.toLowerCase() == 'all' && handler == null) this._events.clear(); //clear(): Clears all events
73
+ else if (_name.toLowerCase() == 'all' && handler) this._events = (() => { //clear("all", myEventHandler): Removes the "myEventHandler" handler from all events
74
+ this._events.forEach(e => e.off(handler))
75
+ return this._events;
76
+ })();
77
+ else if (_name.toLowerCase() != "all" && handler == null) this._events.delete(name); //clear("myEvent"): Clears All handlers tied to "myEvent"
78
+ else if (_name.toLowerCase() != 'all' && handler) this._events.set(name, this._events.get(name)!.off(handler)); //clear("myEvent", myEventHandler): Removes the "myEventsHandler" handler from "myEvent"
79
+ return this;
80
+ }
81
+
82
+ public emit<Event extends keyof Events>(name: Event, ...args: Events[Event]) {
83
+ return this.get(name)?.emit(...args);
84
+ }
85
+
86
+ /**
87
+ * Limits how many events to accept using EventEmitter#on or EventEmitter#once
88
+ * @param limit Limit of events to keep
89
+ * @returns this with the new limit
90
+ *
91
+ * @throws Unknown event, if event name isn't recognized
92
+ */
93
+ public limit<Event extends keyof Events>(eventName: 'all' | Event, limit: number) {
94
+ if (limit <= 0) return;
95
+
96
+ if (eventName == 'all') {
97
+ this._limit = limit;
98
+ return this;
99
+ }
100
+
101
+ const event = this.get(eventName);
102
+ if (!event) throw new Error(`Unknown event, ${eventName}!`);
103
+
104
+ event.limit = limit;
105
+ this._events.set(eventName, event as any);
106
+ return this;
107
+ }
108
+ }
109
+ export default EventCollection;
@@ -1,17 +1,20 @@
1
1
  import EventCollection from "./EventCollection";
2
- import EventHandler from "../Types/EventHandler";
2
+ import { BaseEvent, EventHandler } from '../../Types';
3
3
 
4
4
  /**
5
5
  * Traditional Node.js EventEmitter for vanilla JavaScript
6
+ * @borrows EventCollection
7
+ * @borrows BaseEvent
8
+ * @borrows EventHandler
6
9
  */
7
- export class EventEmitter {
10
+ export class EventEmitter<Events extends BaseEvent<string, Array<any>>> {
8
11
  /**@param events Map<name: string, handlers: EventHandler[]>*/
9
- constructor(events?: Map<string, EventHandler[]>) {
12
+ constructor(events?: Map<keyof Events, EventHandler<Events>>) {
10
13
  this._events = new EventCollection(events);
11
14
  }
12
15
 
13
16
  /**@private Internal event collection*/
14
- private _events = new EventCollection();
17
+ private _events = new EventCollection<Events>();
15
18
 
16
19
  /**
17
20
  * Adds listener to event collection, and runs listener when event is emitted
@@ -19,8 +22,8 @@ export class EventEmitter {
19
22
  * @param listener Callback function to run, when event occurs
20
23
  * @returns this
21
24
  */
22
- public on<ReturnType = any>(event: string, listener: EventHandler<ReturnType>): this {
23
- this._events.add(event, listener);
25
+ public on<Return extends any, Event extends keyof Events>(event: Event, listener: EventHandler<Events, Event, Return>): this {
26
+ this._events.add(event, listener as any);
24
27
  return this;
25
28
  }
26
29
  /**
@@ -29,8 +32,8 @@ export class EventEmitter {
29
32
  * @param listener Callback function to run, when event occurs
30
33
  * @returns this
31
34
  */
32
- public once<ReturnType = any>(event: string, listener: EventHandler<ReturnType>): this {
33
- this._events.add(event, listener, true);
35
+ public once<Return extends any, Event extends keyof Events>(event: Event, listener: EventHandler<Events, Event, Return>): this {
36
+ this._events.add(event, listener as any, true);
34
37
  return this;
35
38
  }
36
39
 
@@ -40,7 +43,7 @@ export class EventEmitter {
40
43
  * @param listener If left null, removes all listeners tied to event, else only removes listener from event
41
44
  * @returns this
42
45
  */
43
- public off<ReturnType = any>(event: string = "all", listener?: EventHandler<ReturnType>): this {
46
+ public off<Return extends any, Event extends keyof Events>(event: Event | 'all' = "all", listener?: EventHandler<Events, Event, Return>): this {
44
47
  this._events.clear(event, listener);
45
48
  return this;
46
49
  }
@@ -52,8 +55,8 @@ export class EventEmitter {
52
55
  * @fires event
53
56
  * @returns Array of listeners' reponses
54
57
  */
55
- public emit<ReturnType = any>(event: string, ...args: any[]): ReturnType[] {
56
- return this._events.emit(event, ...args);
58
+ public emit<Return extends any, Event extends keyof Events>(event: Event, ...args: Events[Event]): Array<Return> {
59
+ return this._events.emit(event, ...args) as Array<Return>;
57
60
  }
58
61
 
59
62
  /**
@@ -62,8 +65,8 @@ export class EventEmitter {
62
65
  * @param limit Limit of events to keep. If you want to limit amount of events saved, use 'all'.
63
66
  * @returns this with the new limit
64
67
  */
65
- public limit(event: 'all' | string, limit: number) {
66
- this._events.limit(event, limit);
68
+ public limit<Event extends keyof Events>(event: 'all' | Event, limit: number) {
69
+ this._events.limit<Event>(event, limit);
67
70
  return this;
68
71
  }
69
72
  }
@@ -0,0 +1,3 @@
1
+ export * from './Event';
2
+ export * from './EventCollection';
3
+ export * from './EventEmitter';