tiny-essentials 1.27.1 → 1.28.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 (60) hide show
  1. package/README.md +1 -0
  2. package/changelog/1/28/0.md +16 -0
  3. package/dist/v1/TinyAdvancedRaffle.min.js +1 -1
  4. package/dist/v1/TinyBasicsEs.min.js +1 -2
  5. package/dist/v1/TinyEssentials.min.js +1 -2
  6. package/dist/v1/TinyIframeEvents.min.js +1 -1
  7. package/dist/v1/TinyLocalStorage.min.js +1 -1
  8. package/dist/v1/TinyMediaPlayer.min.js +1 -1
  9. package/dist/v1/TinyNewWinEvents.min.js +1 -1
  10. package/dist/v1/TinyRadioFm.min.js +1 -1
  11. package/dist/v1/TinySmartScroller.min.js +1 -1
  12. package/dist/v1/TinyUploadClicker.min.js +1 -2
  13. package/dist/v1/basics/extendObjType/Buffer.cjs +13 -0
  14. package/dist/v1/basics/extendObjType/Buffer.d.mts +4 -0
  15. package/dist/v1/basics/extendObjType/Buffer.mjs +8 -0
  16. package/dist/v1/basics/objFilter.cjs +0 -11
  17. package/dist/v1/basics/objFilter.mjs +0 -10
  18. package/dist/v1/index.cjs +0 -2
  19. package/dist/v1/index.d.mts +1 -2
  20. package/dist/v1/index.mjs +1 -2
  21. package/dist/v1/libs/TinyAdvancedRaffle.cjs +7 -205
  22. package/dist/v1/libs/TinyAdvancedRaffle.d.mts +2 -121
  23. package/dist/v1/libs/TinyAdvancedRaffle.mjs +7 -179
  24. package/dist/v1/libs/TinyIframeEvents.cjs +8 -195
  25. package/dist/v1/libs/TinyIframeEvents.d.mts +3 -122
  26. package/dist/v1/libs/TinyIframeEvents.mjs +8 -170
  27. package/dist/v1/libs/TinyLocalStorage.cjs +5 -205
  28. package/dist/v1/libs/TinyLocalStorage.d.mts +3 -130
  29. package/dist/v1/libs/TinyLocalStorage.mjs +5 -178
  30. package/dist/v1/libs/TinyMediaPlayer.cjs +2 -2
  31. package/dist/v1/libs/TinyMediaPlayer.d.mts +2 -2
  32. package/dist/v1/libs/TinyMediaPlayer.mjs +2 -2
  33. package/dist/v1/libs/TinyNewWinEvents.cjs +10 -197
  34. package/dist/v1/libs/TinyNewWinEvents.d.mts +3 -122
  35. package/dist/v1/libs/TinyNewWinEvents.mjs +10 -172
  36. package/dist/v1/libs/TinyRadioFm.cjs +2 -3
  37. package/dist/v1/libs/TinyRadioFm.d.mts +2 -3
  38. package/dist/v1/libs/TinyRadioFm.mjs +2 -3
  39. package/dist/v1/libs/TinySmartScroller.cjs +4 -202
  40. package/dist/v1/libs/TinySmartScroller.d.mts +8 -143
  41. package/dist/v1/libs/TinySmartScroller.mjs +4 -176
  42. package/dist/v1/libs/TinyUploadClicker.cjs +1 -0
  43. package/docs/v1/Exports.md +0 -1
  44. package/docs/v1/README.md +0 -1
  45. package/docs/v1/basics/objFilter.md +1 -1
  46. package/docs/v1/libs/TinyIframeEvents.md +8 -8
  47. package/docs/v1/libs/TinyLocalStorage.md +3 -3
  48. package/docs/v1/libs/TinyNewWinEvents.md +8 -9
  49. package/package.json +6 -5
  50. package/dist/v1/TinyBasicsEs.min.js.LICENSE.txt +0 -8
  51. package/dist/v1/TinyEssentials.min.js.LICENSE.txt +0 -8
  52. package/dist/v1/TinyEvents.min.js +0 -1
  53. package/dist/v1/TinyUploadClicker.min.js.LICENSE.txt +0 -8
  54. package/dist/v1/build/TinyEvents.cjs +0 -7
  55. package/dist/v1/build/TinyEvents.d.mts +0 -3
  56. package/dist/v1/build/TinyEvents.mjs +0 -2
  57. package/dist/v1/libs/TinyEvents.cjs +0 -395
  58. package/dist/v1/libs/TinyEvents.d.mts +0 -164
  59. package/dist/v1/libs/TinyEvents.mjs +0 -360
  60. package/docs/v1/libs/TinyEvents.md +0 -187
@@ -1,360 +0,0 @@
1
- /**
2
- * A generic event listener callback function.
3
- *
4
- * @callback handler
5
- * @param {...any} payload - The data payload passed when the event is triggered.
6
- * @returns {void}
7
- */
8
- /**
9
- * TinyEvents provides a minimalistic event emitter system similar to Node.js's EventEmitter,
10
- * enabling components to subscribe to, emit, and manage events and their listeners.
11
- *
12
- * Features include:
13
- * - Adding/removing event listeners (`on`, `off`, `offAll`, `offAllTypes`)
14
- * - One-time listeners (`once`)
15
- * - Emitting events (`emit`)
16
- * - Listener inspection and limits (`listenerCount`, `listeners`, `eventNames`)
17
- * - Maximum listener control (`setMaxListeners`, `getMaxListeners`)
18
- *
19
- * This class is useful for lightweight, dependency-free publish/subscribe event handling
20
- * within modular JavaScript applications.
21
- *
22
- * @class
23
- */
24
- class TinyEvents {
25
- /** @type {Map<string, { handler: handler; config: { once: boolean } }[]>} */
26
- #listeners = new Map();
27
- /** @type {number} */
28
- #maxListeners = 10;
29
- /** @type {boolean} */
30
- #throwMaxListeners = false;
31
- /**
32
- * Normalizes the event parameter into an array of strings.
33
- *
34
- * @param {string|string[]} event
35
- * @param {string} method
36
- * @returns {string[]}
37
- */
38
- #normalizeEvents(event, method) {
39
- if (typeof event === 'string')
40
- return [event];
41
- if (Array.isArray(event) && event.every((e) => typeof e === 'string'))
42
- return event;
43
- throw new TypeError(`${method}(event): event must be a string or string[]`);
44
- }
45
- /**
46
- * Enables or disables throwing an error when the maximum number of listeners is exceeded.
47
- *
48
- * @param {boolean} shouldThrow - If true, an error will be thrown when the max is exceeded.
49
- */
50
- setThrowOnMaxListeners(shouldThrow) {
51
- if (typeof shouldThrow !== 'boolean')
52
- throw new TypeError('setThrowOnMaxListeners(value): value must be a boolean');
53
- this.#throwMaxListeners = shouldThrow;
54
- }
55
- /**
56
- * Checks whether an error will be thrown when the max listener limit is exceeded.
57
- *
58
- * @returns {boolean} True if an error will be thrown, false if only a warning is shown.
59
- */
60
- getThrowOnMaxListeners() {
61
- return this.#throwMaxListeners;
62
- }
63
- ///////////////////////////////////////////////////
64
- /**
65
- * Internal method to prepend a listener with options.
66
- *
67
- * @param {string} event - Event name.
68
- * @param {handler} handler - The callback function.
69
- * @param {Object} [settings={}] - Optional settings.
70
- * @param {boolean} [settings.once=false] - If the listener should be executed once.
71
- */
72
- #prepend(event, handler, { once = false } = {}) {
73
- let eventData = this.#listeners.get(event);
74
- if (!Array.isArray(eventData)) {
75
- eventData = [];
76
- this.#listeners.set(event, eventData);
77
- }
78
- eventData.unshift({ handler, config: { once } });
79
- const max = this.#maxListeners;
80
- if (max > 0 && eventData.length > max) {
81
- const warnMessage = `Possible memory leak detected. ${eventData.length} "${event}" listeners added. ` +
82
- `Use setMaxListeners() to increase limit.`;
83
- if (!this.#throwMaxListeners)
84
- console.warn(warnMessage);
85
- else
86
- throw new Error(warnMessage);
87
- }
88
- }
89
- /**
90
- * Adds a listener to the beginning of the listeners array for the specified event.
91
- *
92
- * @param {string|string[]} event - Event name.
93
- * @param {handler} handler - The callback function.
94
- */
95
- prependListener(event, handler) {
96
- const events = this.#normalizeEvents(event, 'prependListener');
97
- if (typeof handler !== 'function')
98
- throw new TypeError('prependListener(event, handler): handler must be a function');
99
- for (const ev of events)
100
- this.#prepend(ev, handler);
101
- }
102
- /**
103
- * Adds a one-time listener to the beginning of the listeners array for the specified event.
104
- *
105
- * @param {string|string[]} event - Event name.
106
- * @param {handler} handler - The callback function.
107
- * @returns {handler[]} - The wrapped handler used internally.
108
- */
109
- prependListenerOnce(event, handler) {
110
- const events = this.#normalizeEvents(event, 'prependListenerOnce');
111
- if (typeof handler !== 'function')
112
- throw new TypeError('prependListenerOnce(event, handler): handler must be a function');
113
- const wrappedHandlers = [];
114
- for (const ev of events) {
115
- /** @type {handler} */
116
- const wrapped = (...args) => {
117
- this.off(ev, wrapped);
118
- handler(...args);
119
- };
120
- this.#prepend(ev, wrapped, { once: true });
121
- wrappedHandlers.push(wrapped);
122
- }
123
- return wrappedHandlers;
124
- }
125
- ////////////////////////////////////////////////////////////
126
- /**
127
- * Adds a event listener.
128
- *
129
- * @param {string|string[]} event - Event name, such as 'onScrollBoundary' or 'onAutoScroll'.
130
- * @param {handler} handler - Callback function to be called when event fires.
131
- * @param {Object} [settings={}] - Optional settings.
132
- * @param {boolean} [settings.once=false] - This is a once event.
133
- */
134
- #on(event, handler, { once = false } = {}) {
135
- const events = this.#normalizeEvents(event, 'on');
136
- for (const ev of events) {
137
- let eventData = this.#listeners.get(ev);
138
- if (!Array.isArray(eventData)) {
139
- eventData = [];
140
- this.#listeners.set(ev, eventData);
141
- }
142
- eventData.push({ handler, config: { once } });
143
- // Warn if listener count exceeds the max allowed
144
- const max = this.#maxListeners;
145
- if (max > 0 && eventData.length > max) {
146
- const warnMessage = `Possible memory leak detected. ${eventData.length} "${ev}" listeners added. ` +
147
- `Use setMaxListeners() to increase limit.`;
148
- if (!this.#throwMaxListeners)
149
- console.warn(warnMessage);
150
- else
151
- throw new Error(warnMessage);
152
- }
153
- }
154
- }
155
- /**
156
- * Adds a event listener.
157
- *
158
- * @param {string|string[]} event - Event name, such as 'onScrollBoundary' or 'onAutoScroll'.
159
- * @param {handler} handler - Callback function to be called when event fires.
160
- */
161
- on(event, handler) {
162
- if (typeof handler !== 'function')
163
- throw new TypeError('on(event, handler): handler must be a function');
164
- return this.#on(event, handler);
165
- }
166
- /**
167
- * Registers an event listener that runs only once, then is removed.
168
- *
169
- * @param {string|string[]} event - Event name, such as 'onScrollBoundary' or 'onAutoScroll'.
170
- * @param {handler} handler - The callback function to run on event.
171
- * @returns {handler[]} - The wrapped version of the handler.
172
- */
173
- once(event, handler) {
174
- const events = this.#normalizeEvents(event, 'once');
175
- if (typeof handler !== 'function')
176
- throw new TypeError('once(event, handler): handler must be a function');
177
- const wrappedHandlers = [];
178
- for (const ev of events) {
179
- /** @type {handler} */
180
- const wrapped = (...args) => {
181
- this.off(ev, wrapped);
182
- handler(...args);
183
- };
184
- this.#on(ev, wrapped, { once: true });
185
- wrappedHandlers.push(wrapped);
186
- }
187
- return wrappedHandlers;
188
- }
189
- /**
190
- * Adds a event listener.
191
- *
192
- * @param {string|string[]} event - Event name, such as 'onScrollBoundary' or 'onAutoScroll'.
193
- * @param {handler} handler - Callback function to be called when event fires.
194
- */
195
- appendListener(event, handler) {
196
- return this.on(event, handler);
197
- }
198
- /**
199
- * Registers an event listener that runs only once, then is removed.
200
- *
201
- * @param {string|string[]} event - Event name, such as 'onScrollBoundary' or 'onAutoScroll'.
202
- * @param {handler} handler - The callback function to run on event.
203
- * @returns {handler[]} - The wrapped version of the handler.
204
- */
205
- appendListenerOnce(event, handler) {
206
- return this.once(event, handler);
207
- }
208
- ///////////////////////////////////////////////
209
- /**
210
- * Removes a previously registered event listener.
211
- *
212
- * @param {string|string[]} event - The name of the event to remove the handler from.
213
- * @param {handler} handler - The specific callback function to remove.
214
- */
215
- off(event, handler) {
216
- const events = this.#normalizeEvents(event, 'off');
217
- if (typeof handler !== 'function')
218
- throw new TypeError('off(event, handler): handler must be a function');
219
- for (const ev of events) {
220
- const listeners = this.#listeners.get(ev);
221
- if (!Array.isArray(listeners))
222
- continue;
223
- const index = listeners.findIndex((listener) => listener.handler === handler);
224
- if (index !== -1)
225
- listeners.splice(index, 1);
226
- // Optionally clean up empty arrays (optional)
227
- if (listeners.length === 0)
228
- this.#listeners.delete(ev);
229
- }
230
- }
231
- /**
232
- * Removes all event listeners of a specific type from the element.
233
- *
234
- * @param {string|string[]} event - The event type to remove (e.g. 'onScrollBoundary').
235
- */
236
- offAll(event) {
237
- const events = this.#normalizeEvents(event, 'offAll');
238
- for (const ev of events)
239
- this.#listeners.delete(ev);
240
- }
241
- /**
242
- * Removes all event listeners of all types from the element.
243
- */
244
- offAllTypes() {
245
- this.#listeners.clear();
246
- }
247
- /**
248
- * Removes all event listeners of all types from the element.
249
- */
250
- removeAllListeners() {
251
- return this.offAllTypes();
252
- }
253
- /////////////////////////////////////////////
254
- /**
255
- * Returns the number of listeners for a given event.
256
- *
257
- * @param {string} event - The name of the event.
258
- * @returns {number} Number of listeners for the event.
259
- */
260
- listenerCount(event) {
261
- if (typeof event !== 'string')
262
- throw new TypeError('listenerCount(event): event name must be a string');
263
- const listeners = this.#listeners.get(event);
264
- return Array.isArray(listeners) ? listeners.length : 0;
265
- }
266
- /**
267
- * Returns a copy of the array of listeners for the specified event.
268
- *
269
- * @param {string} event - The name of the event.
270
- * @returns {handler[]} Array of listener functions.
271
- */
272
- listeners(event) {
273
- if (typeof event !== 'string')
274
- throw new TypeError('listeners(event): event name must be a string');
275
- const listeners = this.#listeners.get(event);
276
- return Array.isArray(listeners)
277
- ? [...listeners]
278
- .filter((listener) => !listener.config.once)
279
- .map((listener) => listener.handler)
280
- : [];
281
- }
282
- /**
283
- * Returns a copy of the array of listeners for the specified event.
284
- *
285
- * @param {string} event - The name of the event.
286
- * @returns {handler[]} Array of listener functions.
287
- */
288
- onceListeners(event) {
289
- if (typeof event !== 'string')
290
- throw new TypeError('onceListeners(event): event name must be a string');
291
- const listeners = this.#listeners.get(event);
292
- return Array.isArray(listeners)
293
- ? [...listeners]
294
- .filter((listener) => listener.config.once)
295
- .map((listener) => listener.handler)
296
- : [];
297
- }
298
- /**
299
- * Returns a copy of the internal listeners array for the specified event,
300
- * including wrapper functions like those used by `.once()`.
301
- * @param {string | symbol} event - The event name.
302
- * @returns {handler[]} An array of raw listener functions.
303
- */
304
- allListeners(event) {
305
- if (typeof event !== 'string')
306
- throw new TypeError('allListeners(event): event name must be a string');
307
- const listeners = this.#listeners.get(event);
308
- return Array.isArray(listeners) ? [...listeners].map((listener) => listener.handler) : [];
309
- }
310
- /**
311
- * Returns an array of event names for which there are registered listeners.
312
- *
313
- * @returns {string[]} Array of registered event names.
314
- */
315
- eventNames() {
316
- return [...this.#listeners.keys()];
317
- }
318
- /**
319
- * Emits an event, triggering all registered handlers for that event.
320
- *
321
- * @param {string|string[]} event - The event name to emit.
322
- * @param {...any} payload - Optional data to pass to each handler.
323
- * @returns {boolean[]} True if any listeners were called, false otherwise.
324
- */
325
- emit(event, ...payload) {
326
- const events = this.#normalizeEvents(event, 'emit');
327
- const called = [];
328
- for (const ev of events) {
329
- const listeners = this.#listeners.get(ev);
330
- if (!Array.isArray(listeners) || listeners.length === 0) {
331
- called.push(false);
332
- continue;
333
- }
334
- // Call all listeners with the provided data
335
- listeners.forEach((listener) => listener.handler(...payload));
336
- called.push(true);
337
- }
338
- return called;
339
- }
340
- ///////////////////////////////////
341
- /**
342
- * Sets the maximum number of listeners per event before a warning is shown.
343
- *
344
- * @param {number} n - The maximum number of listeners.
345
- */
346
- setMaxListeners(n) {
347
- if (!Number.isInteger(n) || n < 0)
348
- throw new TypeError('setMaxListeners(n): n must be a non-negative integer');
349
- this.#maxListeners = n;
350
- }
351
- /**
352
- * Gets the maximum number of listeners allowed per event.
353
- *
354
- * @returns {number} The maximum number of listeners.
355
- */
356
- getMaxListeners() {
357
- return this.#maxListeners;
358
- }
359
- }
360
- export default TinyEvents;
@@ -1,187 +0,0 @@
1
- # 📢 TinyEvents Documentation
2
-
3
- TinyEvents is a lightweight, dependency-free **event emitter system**, inspired by Node.js’s `EventEmitter`.
4
- It allows components to **subscribe**, **emit**, and **manage** events and their listeners in a clean and modular way.
5
-
6
- ---
7
-
8
- ## ✨ Features
9
-
10
- * ➕ Add/remove event listeners (`on`, `off`, `offAll`, `offAllTypes`)
11
- * 🔂 One-time listeners (`once`, `prependListenerOnce`)
12
- * 📢 Emit events (`emit`)
13
- * 🔍 Inspect listeners (`listenerCount`, `listeners`, `onceListeners`, `allListeners`, `eventNames`)
14
- * ⚖️ Control maximum listeners (`setMaxListeners`, `getMaxListeners`)
15
- * 🚨 Configurable error/warning when max listeners exceeded (`setThrowOnMaxListeners`)
16
-
17
- ---
18
-
19
- ## 📚 API Reference
20
-
21
- ### 🔹 Event Handler Callback
22
-
23
- ```ts
24
- /**
25
- * A generic event listener callback function.
26
- *
27
- * @callback handler
28
- * @param {...any} payload - The data payload passed when the event is triggered.
29
- * @returns {void}
30
- */
31
- ```
32
-
33
- ---
34
-
35
- ### 🏗️ Class: `TinyEvents`
36
-
37
- #### 🔒 Private Properties
38
-
39
- * `#listeners: Map<string, { handler: handler, config: { once: boolean } }[]>` – Stores registered listeners
40
- * `#maxListeners: number` – Maximum allowed listeners per event (default: `10`)
41
- * `#throwMaxListeners: boolean` – Whether to throw error or only warn when max is exceeded
42
-
43
- ---
44
-
45
- ### ⚙️ Configuration
46
-
47
- #### `setThrowOnMaxListeners(shouldThrow: boolean): void`
48
-
49
- Enable/disable throwing an error when max listeners is exceeded.
50
-
51
- * ✅ `true`: throws error
52
- * ⚠️ `false`: logs warning
53
-
54
- ---
55
-
56
- #### `getThrowOnMaxListeners(): boolean`
57
-
58
- Check if exceeding the listener limit will throw an error or just warn.
59
-
60
- ---
61
-
62
- #### `setMaxListeners(n: number): void`
63
-
64
- Set the maximum number of listeners per event.
65
-
66
- * Must be a non-negative integer.
67
-
68
- ---
69
-
70
- #### `getMaxListeners(): number`
71
-
72
- Get the maximum number of listeners allowed per event.
73
-
74
- ---
75
-
76
- ### ➕ Adding Listeners
77
-
78
- #### `on(event: string|string[], handler: handler): void`
79
-
80
- Registers an event listener.
81
-
82
- #### `once(event: string|string[], handler: handler): handler[]`
83
-
84
- Registers a one-time event listener that is removed after being triggered once.
85
-
86
- #### `appendListener(event: string|string[], handler: handler): void`
87
-
88
- Alias for `.on()`.
89
-
90
- #### `appendListenerOnce(event: string|string[], handler: handler): handler[]`
91
-
92
- Alias for `.once()`.
93
-
94
- #### `prependListener(event: string|string[], handler: handler): void`
95
-
96
- Registers a listener at the **beginning** of the listeners array.
97
-
98
- #### `prependListenerOnce(event: string|string[], handler: handler): handler[]`
99
-
100
- Registers a one-time listener at the **beginning** of the listeners array.
101
-
102
- ---
103
-
104
- ### ❌ Removing Listeners
105
-
106
- #### `off(event: string|string[], handler: handler): void`
107
-
108
- Removes a specific listener from an event.
109
-
110
- #### `offAll(event: string|string[]): void`
111
-
112
- Removes all listeners for one or more events.
113
-
114
- #### `offAllTypes(): void` and `removeAllListeners(): void`
115
-
116
- Removes **all listeners** for **all events**.
117
-
118
- ---
119
-
120
- ### 📢 Emitting Events
121
-
122
- #### `emit(event: string|string[], ...payload: any[]): boolean[]`
123
-
124
- Emits one or more events with optional payload.
125
-
126
- * Returns an array of booleans:
127
-
128
- * `true` if listeners were called
129
- * `false` if no listeners were registered
130
-
131
- ---
132
-
133
- ### 🔍 Inspecting Listeners
134
-
135
- #### `listenerCount(event: string): number`
136
-
137
- Get the number of listeners for a given event.
138
-
139
- #### `listeners(event: string): handler[]`
140
-
141
- Get all listeners registered for an event (excluding `once`).
142
-
143
- #### `onceListeners(event: string): handler[]`
144
-
145
- Get only listeners registered with `.once()`.
146
-
147
- #### `allListeners(event: string): handler[]`
148
-
149
- Get all listeners, including internal wrappers (e.g. from `.once()`).
150
-
151
- #### `eventNames(): string[]`
152
-
153
- Get a list of all registered event names.
154
-
155
- ---
156
-
157
- ## 📝 Example Usage
158
-
159
- ```js
160
- import TinyEvents from './TinyEvents.js';
161
-
162
- const events = new TinyEvents();
163
-
164
- // Add listener
165
- events.on('data', (msg) => console.log('Received:', msg));
166
-
167
- // Add once listener
168
- events.once(['ready', 'init'], () => console.log('Initialized!'));
169
-
170
- // Emit events
171
- events.emit('data', 'Hello World');
172
- events.emit(['ready', 'init']);
173
-
174
- // Check listeners
175
- console.log(events.listenerCount('data')); // 1
176
-
177
- // Remove all listeners
178
- events.offAll('data');
179
- ```
180
-
181
- ---
182
-
183
- ## ⚡ Notes
184
-
185
- * Supports both **single string events** (`"data"`) and **arrays of events** (`["ready", "init"]`) 🚀
186
- * Helps prevent memory leaks with `setMaxListeners` and warning/error system 🛑
187
- * Perfect for **frontend components**, **Node.js scripts**, and **custom event-driven modules** 🧩