jrx 0.1.0 → 0.2.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.
- package/README.md +25 -2
- package/addEvtListener.d.ts +15 -0
- package/addEvtListener.js +6 -0
- package/index.d.ts +4 -0
- package/index.js +4 -0
- package/package.json +5 -11
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@ A lightweight TypeScript library for managing side effects, subscriptions, and a
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
7
7
|
```bash
|
|
8
|
-
npm
|
|
8
|
+
npm i jrx
|
|
9
9
|
```
|
|
10
10
|
|
|
11
11
|
## Features
|
|
@@ -20,6 +20,7 @@ npm install jrx
|
|
|
20
20
|
## API Overview
|
|
21
21
|
|
|
22
22
|
- [`makeRenderLoop()`](#makerenderloop) - Render loops with automatic cleanup
|
|
23
|
+
- [`addEvtListener(target, event, handler, option?)`](#addevtlistenertarget-event-handler-option) - Event listeners with cleanup
|
|
23
24
|
- [`addInterval(cb, ms)`](#addintervalcb-ms) - Repeating intervals with cleanup
|
|
24
25
|
- [`addIntervalAsync(cb, ms)`](#addintervalasynccb-ms) - Async intervals with cancellation
|
|
25
26
|
- [`addRequestAnimationFrame(cb)`](#addrequestanimationframecb) - Single animation frame with cleanup
|
|
@@ -58,6 +59,28 @@ requestAnimationFrame(loop)
|
|
|
58
59
|
dispose()
|
|
59
60
|
```
|
|
60
61
|
|
|
62
|
+
### `addEvtListener(target, event, handler, option?)`
|
|
63
|
+
|
|
64
|
+
Adds an event listener to a target and returns a disposer that removes it. Works with any object that implements `addEventListener`/`removeEventListener` (DOM elements, `window`, `document`, etc.).
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
import { addEvtListener } from 'jrx'
|
|
68
|
+
|
|
69
|
+
// Basic usage
|
|
70
|
+
const dispose = addEvtListener(window, 'resize', (e) => {
|
|
71
|
+
console.log('Window resized', e)
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
// With options
|
|
75
|
+
const dispose2 = addEvtListener(element, 'click', (e) => {
|
|
76
|
+
console.log('Clicked', e)
|
|
77
|
+
}, { capture: true })
|
|
78
|
+
|
|
79
|
+
// Cleanup
|
|
80
|
+
dispose()
|
|
81
|
+
dispose2()
|
|
82
|
+
```
|
|
83
|
+
|
|
61
84
|
### `addInterval(cb, ms)`
|
|
62
85
|
|
|
63
86
|
Creates a repeating interval with cleanup. The callback can optionally return a cleanup function that runs before the next invocation.
|
|
@@ -238,7 +261,7 @@ Retries an async operation with exponential backoff on failure.
|
|
|
238
261
|
**Default backoff:** `[5, 5, 10, 10, 20, 20, 40, 40, 60, -1]` seconds (where `-1` means retry forever with 60s delay)
|
|
239
262
|
|
|
240
263
|
```typescript
|
|
241
|
-
import retry from 'jrx
|
|
264
|
+
import {retry} from 'jrx'
|
|
242
265
|
|
|
243
266
|
// Basic usage - retries with default backoff
|
|
244
267
|
const result = await retry(async (disposer, { resetBackoff }) => {
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
type IEventHandler<Target extends {
|
|
2
|
+
addEventListener(event: string, handler: any, option?: any): any;
|
|
3
|
+
}, EventName> = Target['addEventListener'] extends (event: EventName, handler: infer Handler, ...args: any[]) => any ? Handler extends (...params: any[]) => any ? Handler : never : never;
|
|
4
|
+
type IEventOption<Target extends {
|
|
5
|
+
addEventListener(event: string, handler: any, option?: any): any;
|
|
6
|
+
}, EventName, Handler> = Target['addEventListener'] extends (event: EventName, handler: Handler, option: infer Option) => any ? Option : never;
|
|
7
|
+
export default function addEvtListener<Target extends {
|
|
8
|
+
addEventListener(event: string, handler: any, option?: any): any;
|
|
9
|
+
removeEventListener(event: string, handler: any, option?: any): any;
|
|
10
|
+
}, EventName extends Parameters<Target['addEventListener']>[0], Handler extends IEventHandler<Target, EventName>>(target: Target, event: EventName, handler: Handler, option?: IEventOption<Target, EventName, Handler>): () => void;
|
|
11
|
+
export default function addEvtListener<Target extends {
|
|
12
|
+
addEventListener(event: string, handler: any, option?: any): any;
|
|
13
|
+
removeEventListener(event: string, handler: any, option?: any): any;
|
|
14
|
+
}, EventName extends Parameters<Target['addEventListener']>[0]>(target: Target, event: EventName, handler: (...args: any[]) => any, option?: IEventOption<Target, EventName, IEventHandler<Target, EventName>>): () => void;
|
|
15
|
+
export {};
|
package/index.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { type Disposer } from 'jdisposer';
|
|
2
|
+
import retry from './retry.js';
|
|
3
|
+
import computed from './computed.js';
|
|
4
|
+
import addEvtListener from './addEvtListener.js';
|
|
5
|
+
export { retry, computed, addEvtListener };
|
|
2
6
|
export declare function makeRenderLoop(): {
|
|
3
7
|
loop(this: void, time: DOMHighResTimeStamp): void;
|
|
4
8
|
setLoop(this: void, loop: (time: DOMHighResTimeStamp) => void | (() => void)): () => void;
|
package/index.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { makeDisposer, makeReset } from 'jdisposer';
|
|
2
|
+
import retry from './retry.js';
|
|
3
|
+
import computed from './computed.js';
|
|
4
|
+
import addEvtListener from './addEvtListener.js';
|
|
5
|
+
export { retry, computed, addEvtListener };
|
|
2
6
|
export function makeRenderLoop() {
|
|
3
7
|
let loop_;
|
|
4
8
|
const reset = makeReset();
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jrx",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"scripts": {
|
|
6
|
-
"prepublishOnly": "npx tsc
|
|
6
|
+
"prepublishOnly": "npx tsc",
|
|
7
7
|
"test": "node --test tests/*.test.ts",
|
|
8
8
|
"test:coverage": "node --test --experimental-test-coverage tests/*.test.ts"
|
|
9
9
|
},
|
|
@@ -11,14 +11,6 @@
|
|
|
11
11
|
".": {
|
|
12
12
|
"types": "./index.d.ts",
|
|
13
13
|
"import": "./index.js"
|
|
14
|
-
},
|
|
15
|
-
"./retry": {
|
|
16
|
-
"types": "./retry.d.ts",
|
|
17
|
-
"import": "./retry.js"
|
|
18
|
-
},
|
|
19
|
-
"./computed": {
|
|
20
|
-
"types": "./computed.d.ts",
|
|
21
|
-
"import": "./computed.js"
|
|
22
14
|
}
|
|
23
15
|
},
|
|
24
16
|
"repository": {
|
|
@@ -31,7 +23,9 @@
|
|
|
31
23
|
"retry.js",
|
|
32
24
|
"retry.d.ts",
|
|
33
25
|
"computed.js",
|
|
34
|
-
"computed.d.ts"
|
|
26
|
+
"computed.d.ts",
|
|
27
|
+
"addEvtListener.js",
|
|
28
|
+
"addEvtListener.d.ts"
|
|
35
29
|
],
|
|
36
30
|
"devDependencies": {
|
|
37
31
|
"@types/node": "^25.2.1",
|