@real-router/rx 0.1.27 → 0.1.29
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 +53 -102
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/metafile-cjs.json +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/metafile-esm.json +1 -1
- package/package.json +4 -2
- package/src/events$.ts +2 -1
- package/src/state$.ts +2 -1
package/README.md
CHANGED
|
@@ -1,104 +1,21 @@
|
|
|
1
1
|
# @real-router/rx
|
|
2
2
|
|
|
3
|
-
[](https://www.npmjs.com/package/@real-router/rx)
|
|
4
|
+
[](https://www.npmjs.com/package/@real-router/rx)
|
|
5
|
+
[](https://bundlejs.com/?q=@real-router/rx&treeshake=[*])
|
|
6
|
+
[](../../LICENSE)
|
|
5
7
|
|
|
6
|
-
Reactive Observable API for Real-Router. Zero-cost opt-in
|
|
8
|
+
> Reactive Observable API for [Real-Router](https://github.com/greydragon888/real-router). State streams, event streams, built-in operators, TC39 Observable and RxJS interop. Zero-cost opt-in — only bundled when imported.
|
|
7
9
|
|
|
8
10
|
## Installation
|
|
9
11
|
|
|
10
12
|
```bash
|
|
11
13
|
npm install @real-router/rx
|
|
12
|
-
# or
|
|
13
|
-
pnpm add @real-router/rx
|
|
14
|
-
# or
|
|
15
|
-
yarn add @real-router/rx
|
|
16
|
-
# or
|
|
17
|
-
bun add @real-router/rx
|
|
18
14
|
```
|
|
19
15
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
```typescript
|
|
23
|
-
import { createRouter } from "@real-router/core";
|
|
24
|
-
import { state$ } from "@real-router/rx";
|
|
25
|
-
|
|
26
|
-
const router = createRouter([
|
|
27
|
-
{ name: "home", path: "/" },
|
|
28
|
-
{ name: "users", path: "/users" },
|
|
29
|
-
{ name: "users.profile", path: "/:id" },
|
|
30
|
-
]);
|
|
31
|
-
|
|
32
|
-
router.start();
|
|
33
|
-
|
|
34
|
-
// Subscribe to state changes
|
|
35
|
-
state$(router).subscribe(({ route, previousRoute }) => {
|
|
36
|
-
console.log("Navigation:", previousRoute?.name, "→", route.name);
|
|
37
|
-
});
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
## API
|
|
43
|
-
|
|
44
|
-
### Streams
|
|
45
|
-
|
|
46
|
-
#### `state$(router, options?)`
|
|
47
|
-
|
|
48
|
-
Creates a reactive stream of router state changes.\
|
|
49
|
-
`router: Router` — router instance\
|
|
50
|
-
`options.signal?: AbortSignal` — for automatic unsubscription\
|
|
51
|
-
Returns: `RxObservable<{ route: State, previousRoute?: State }>`\
|
|
52
|
-
[Wiki](https://github.com/greydragon888/real-router/wiki/rx-package#state$router-options)
|
|
53
|
-
|
|
54
|
-
#### `events$(router)`
|
|
55
|
-
|
|
56
|
-
Creates a reactive stream of all router events.\
|
|
57
|
-
`router: Router` — router instance\
|
|
58
|
-
Returns: `RxObservable<RouterEvent>`\
|
|
59
|
-
[Wiki](https://github.com/greydragon888/real-router/wiki/rx-package#events$router)
|
|
60
|
-
|
|
61
|
-
#### `observable(router)`
|
|
62
|
-
|
|
63
|
-
Creates a TC39 Observable-compliant wrapper for RxJS interop.\
|
|
64
|
-
`router: Router` — router instance\
|
|
65
|
-
Returns: `RxObservable<SubscribeState>`\
|
|
66
|
-
[Wiki](https://github.com/greydragon888/real-router/wiki/rx-package#observablerouter)
|
|
67
|
-
|
|
68
|
-
---
|
|
69
|
-
|
|
70
|
-
### Operators
|
|
71
|
-
|
|
72
|
-
#### `map(project)`
|
|
73
|
-
|
|
74
|
-
Transforms emitted values.\
|
|
75
|
-
[Wiki](https://github.com/greydragon888/real-router/wiki/rx-package#mapt-rproject-value-t--r)
|
|
76
|
-
|
|
77
|
-
#### `filter(predicate)`
|
|
78
|
-
|
|
79
|
-
Filters values based on a predicate.\
|
|
80
|
-
[Wiki](https://github.com/greydragon888/real-router/wiki/rx-package#filtertpredicate-value-t--boolean)
|
|
81
|
-
|
|
82
|
-
#### `debounceTime(duration)`
|
|
16
|
+
**Peer dependency:** `@real-router/core`
|
|
83
17
|
|
|
84
|
-
|
|
85
|
-
[Wiki](https://github.com/greydragon888/real-router/wiki/rx-package#debouncetimetduration-number)
|
|
86
|
-
|
|
87
|
-
#### `distinctUntilChanged(comparator?)`
|
|
88
|
-
|
|
89
|
-
Filters consecutive duplicate values.\
|
|
90
|
-
[Wiki](https://github.com/greydragon888/real-router/wiki/rx-package#distinctuntilchangedtcomparator-prev-t-curr-t--boolean)
|
|
91
|
-
|
|
92
|
-
#### `takeUntil(notifier)`
|
|
93
|
-
|
|
94
|
-
Completes stream when notifier emits.\
|
|
95
|
-
[Wiki](https://github.com/greydragon888/real-router/wiki/rx-package#takeuntiltnotifier-rxobservableany)
|
|
96
|
-
|
|
97
|
-
---
|
|
98
|
-
|
|
99
|
-
## Usage Examples
|
|
100
|
-
|
|
101
|
-
### Operator Pipeline
|
|
18
|
+
## Quick Start
|
|
102
19
|
|
|
103
20
|
```typescript
|
|
104
21
|
import { state$, map, filter, distinctUntilChanged } from "@real-router/rx";
|
|
@@ -114,12 +31,42 @@ state$(router)
|
|
|
114
31
|
});
|
|
115
32
|
```
|
|
116
33
|
|
|
117
|
-
|
|
34
|
+
## Streams
|
|
35
|
+
|
|
36
|
+
| Factory | Returns | Description |
|
|
37
|
+
|---------|---------|-------------|
|
|
38
|
+
| `state$(router, options?)` | `RxObservable<{ route, previousRoute }>` | Router state changes |
|
|
39
|
+
| `events$(router)` | `RxObservable<RouterEvent>` | All router events (start, stop, transition, error, cancel) |
|
|
40
|
+
| `observable(router)` | `RxObservable<SubscribeState>` | TC39 Observable-compliant wrapper for RxJS interop |
|
|
41
|
+
|
|
42
|
+
`state$` accepts `{ signal: AbortSignal }` for automatic unsubscription.
|
|
43
|
+
|
|
44
|
+
## Operators
|
|
45
|
+
|
|
46
|
+
| Operator | Description |
|
|
47
|
+
|----------|-------------|
|
|
48
|
+
| `map(project)` | Transform emitted values |
|
|
49
|
+
| `filter(predicate)` | Filter values by predicate |
|
|
50
|
+
| `debounceTime(ms)` | Emit only the last value after a delay |
|
|
51
|
+
| `distinctUntilChanged(cmp?)` | Skip consecutive duplicates |
|
|
52
|
+
| `takeUntil(notifier)` | Complete when notifier emits |
|
|
53
|
+
|
|
54
|
+
All operators are composable via `.pipe()`:
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
state$(router).pipe(
|
|
58
|
+
filter(({ route }) => route.name.startsWith("admin")),
|
|
59
|
+
debounceTime(100),
|
|
60
|
+
).subscribe(({ route }) => {
|
|
61
|
+
analytics.trackPage(route.name);
|
|
62
|
+
});
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Event Filtering
|
|
118
66
|
|
|
119
67
|
```typescript
|
|
120
68
|
import { events$, filter } from "@real-router/rx";
|
|
121
69
|
|
|
122
|
-
// Track navigation errors
|
|
123
70
|
events$(router)
|
|
124
71
|
.pipe(filter((e) => e.type === "TRANSITION_ERROR"))
|
|
125
72
|
.subscribe(({ error }) => {
|
|
@@ -127,7 +74,9 @@ events$(router)
|
|
|
127
74
|
});
|
|
128
75
|
```
|
|
129
76
|
|
|
130
|
-
|
|
77
|
+
## RxJS Interop
|
|
78
|
+
|
|
79
|
+
`observable()` returns a TC39-compliant Observable — pass it to RxJS `from()`:
|
|
131
80
|
|
|
132
81
|
```typescript
|
|
133
82
|
import { from } from "rxjs";
|
|
@@ -141,25 +90,27 @@ from(observable(router))
|
|
|
141
90
|
});
|
|
142
91
|
```
|
|
143
92
|
|
|
144
|
-
---
|
|
145
|
-
|
|
146
93
|
## Documentation
|
|
147
94
|
|
|
148
|
-
Full documentation
|
|
95
|
+
Full documentation: [Wiki — rx](https://github.com/greydragon888/real-router/wiki/rx-package)
|
|
149
96
|
|
|
150
97
|
- [API Reference](https://github.com/greydragon888/real-router/wiki/rx-package#api-reference)
|
|
151
98
|
- [Operators](https://github.com/greydragon888/real-router/wiki/rx-package#operators)
|
|
152
99
|
- [Async Iteration](https://github.com/greydragon888/real-router/wiki/rx-package#async-iteration)
|
|
153
100
|
- [Migration Guide](https://github.com/greydragon888/real-router/wiki/rx-package#migration-guide)
|
|
154
101
|
|
|
155
|
-
---
|
|
156
|
-
|
|
157
102
|
## Related Packages
|
|
158
103
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
104
|
+
| Package | Description |
|
|
105
|
+
|---------|-------------|
|
|
106
|
+
| [@real-router/core](https://www.npmjs.com/package/@real-router/core) | Core router (required peer dependency) |
|
|
107
|
+
| [@real-router/sources](https://www.npmjs.com/package/@real-router/sources) | `useSyncExternalStore`-based alternative |
|
|
108
|
+
| [@real-router/react](https://www.npmjs.com/package/@real-router/react) | React integration |
|
|
109
|
+
|
|
110
|
+
## Contributing
|
|
111
|
+
|
|
112
|
+
See [contributing guidelines](../../CONTRIBUTING.md) for development setup and PR process.
|
|
162
113
|
|
|
163
114
|
## License
|
|
164
115
|
|
|
165
|
-
MIT © [Oleg Ivanov](https://github.com/greydragon888)
|
|
116
|
+
[MIT](../../LICENSE) © [Oleg Ivanov](https://github.com/greydragon888)
|
package/dist/cjs/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=require("@real-router/core"),t=class{#e;constructor(e){this.#e=e}subscribe(e,t){const r="function"==typeof e?{next:e}:e,{signal:n}=t??{};if(n?.aborted)return{unsubscribe:()=>{},closed:!0};let o,s=!1;const i=e=>{if(!s)try{r.next?.(e)}catch(e){u(e)}},u=e=>{if(!s)try{r.error?r.error(e):console.error("Unhandled error in RxObservable:",e)}catch{}},c=()=>{if(!s){s=!0;try{r.complete?.()}catch{}}},b={unsubscribe:()=>{if(!s&&(s=!0,a&&n?.removeEventListener("abort",a),o))try{o()}catch{}},get closed(){return s}};let a;n&&(a=()=>{b.unsubscribe()},n.addEventListener("abort",a));try{o=this.#e({next:i,error:u,complete:c})}catch(e){u(e)}return b}pipe(...e){if(0===e.length)return this;let t=this;for(const r of e)t=r(t);return t}[Symbol.observable](){return this}"@@observable"(){return this}async*[Symbol.asyncIterator](){let e,t=null,r=!1,n=!1,o=null;const s=this.subscribe({next:n=>{if(e=n,r=!0,t){const e=t;t=null,e()}},error:e=>{if(o=e,n=!0,t){const e=t;t=null,e()}},complete:()=>{if(n=!0,t){const e=t;t=null,e()}}});try{for(;!n;)if(r){const t=e;r=!1,yield t}else if(await new Promise(e=>{t=e}),null!==o)throw o}finally{s.unsubscribe()}}};function
|
|
1
|
+
var e=require("@real-router/core"),t=require("@real-router/core/api"),r=class{#e;constructor(e){this.#e=e}subscribe(e,t){const r="function"==typeof e?{next:e}:e,{signal:n}=t??{};if(n?.aborted)return{unsubscribe:()=>{},closed:!0};let o,s=!1;const i=e=>{if(!s)try{r.next?.(e)}catch(e){u(e)}},u=e=>{if(!s)try{r.error?r.error(e):console.error("Unhandled error in RxObservable:",e)}catch{}},c=()=>{if(!s){s=!0;try{r.complete?.()}catch{}}},b={unsubscribe:()=>{if(!s&&(s=!0,a&&n?.removeEventListener("abort",a),o))try{o()}catch{}},get closed(){return s}};let a;n&&(a=()=>{b.unsubscribe()},n.addEventListener("abort",a));try{o=this.#e({next:i,error:u,complete:c})}catch(e){u(e)}return b}pipe(...e){if(0===e.length)return this;let t=this;for(const r of e)t=r(t);return t}[Symbol.observable](){return this}"@@observable"(){return this}async*[Symbol.asyncIterator](){let e,t=null,r=!1,n=!1,o=null;const s=this.subscribe({next:n=>{if(e=n,r=!0,t){const e=t;t=null,e()}},error:e=>{if(o=e,n=!0,t){const e=t;t=null,e()}},complete:()=>{if(n=!0,t){const e=t;t=null,e()}}});try{for(;!n;)if(r){const t=e;r=!1,yield t}else if(await new Promise(e=>{t=e}),null!==o)throw o}finally{s.unsubscribe()}}};function n(e){return t=>new r(r=>{const n=t.subscribe({next:t=>{e(t,r)},error:e=>r.error?.(e),complete:()=>r.complete?.()});return()=>{n.unsubscribe()}})}function o(n,o){const{replay:s=!0}=o??{};return new r(r=>{const o=t.getPluginApi(n).addEventListener(e.events.TRANSITION_SUCCESS,(e,t)=>{r.next?.({route:e,previousRoute:t})});if(s){const e=n.getState();e&&queueMicrotask(()=>{r.next?.({route:e,previousRoute:void 0})})}return o})}exports.RxObservable=r,exports.debounceTime=function(e){if(!Number.isFinite(e)||e<0)throw new RangeError(`debounceTime: duration must be a non-negative finite number, got ${e}`);return t=>new r(r=>{let n,o,s=!1;const i=t.subscribe({next:t=>{o=t,s=!0,void 0!==n&&clearTimeout(n),n=setTimeout(()=>{s&&(r.next?.(o),s=!1),n=void 0},e)},error:e=>{void 0!==n&&(clearTimeout(n),n=void 0),r.error?.(e)},complete:()=>{void 0!==n&&(clearTimeout(n),n=void 0),s&&(r.next?.(o),s=!1),r.complete?.()}});return()=>{void 0!==n&&(clearTimeout(n),n=void 0),i.unsubscribe()}})},exports.distinctUntilChanged=function(e){return t=(t,r)=>{let n,o=!1;const s=e??((e,t)=>e===t),i=t.subscribe({next:e=>{if(!o)return o=!0,n=e,void r.next?.(e);try{s(n,e)||(n=e,r.next?.(e))}catch(e){r.error?.(e)}},error:e=>r.error?.(e),complete:()=>r.complete?.()});return()=>{i.unsubscribe()}},e=>new r(r=>t(e,r));var t},exports.events$=function(n){return new r(r=>{const o=t.getPluginApi(n),s=[];try{s.push(o.addEventListener(e.events.ROUTER_START,()=>{r.next?.({type:"ROUTER_START"})})),s.push(o.addEventListener(e.events.ROUTER_STOP,()=>{r.next?.({type:"ROUTER_STOP"})})),s.push(o.addEventListener(e.events.TRANSITION_START,(e,t)=>{r.next?.({type:"TRANSITION_START",toState:e,fromState:t})})),s.push(o.addEventListener(e.events.TRANSITION_SUCCESS,(e,t,n)=>{r.next?.({type:"TRANSITION_SUCCESS",toState:e,fromState:t,options:n})})),s.push(o.addEventListener(e.events.TRANSITION_ERROR,(e,t,n)=>{r.next?.({type:"TRANSITION_ERROR",toState:e,fromState:t,error:n})})),s.push(o.addEventListener(e.events.TRANSITION_CANCEL,(e,t)=>{r.next?.({type:"TRANSITION_CANCEL",toState:e,fromState:t})}))}catch(e){for(const e of s)e();throw e}return()=>{for(const e of s)e()}})},exports.filter=function(e){return n((t,r)=>{try{e(t)&&r.next?.(t)}catch(e){r.error?.(e)}})},exports.map=function(e){return n((t,r)=>{try{const n=e(t);r.next?.(n)}catch(e){r.error?.(e)}})},exports.observable=function(e){return o(e)},exports.state$=o,exports.takeUntil=function(e){return t=>new r(r=>{let n,o,s=!1;const i=()=>{s||(s=!0,n&&n.unsubscribe(),o&&o.unsubscribe(),r.complete?.())};if(o=e.subscribe({next:()=>{i()},error:e=>{s||(s=!0,n&&n.unsubscribe(),r.error?.(e))}}),!s)return n=t.subscribe({next:e=>{s||r.next?.(e)},error:e=>{s||(s=!0,o.unsubscribe(),r.error?.(e))},complete:()=>{i()}}),()=>{n.unsubscribe(),o.unsubscribe()}})};//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/RxObservable.ts","../../src/operators/createOperator.ts","../../src/operators/map.ts","../../src/operators/filter.ts","../../src/operators/debounceTime.ts","../../src/operators/distinctUntilChanged.ts","../../src/operators/takeUntil.ts","../../src/state$.ts","../../src/events$.ts","../../src/observable.ts"],"names":["getPluginApi","events"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n Observer,\n Subscription,\n ObservableOptions,\n SubscribeFn,\n Operator,\n} from \"./types\";\n\ndeclare global {\n interface SymbolConstructor {\n readonly observable: symbol;\n }\n}\n\nexport class RxObservable<T> {\n #subscribeFn: SubscribeFn<T>;\n\n constructor(subscribeFn: SubscribeFn<T>) {\n this.#subscribeFn = subscribeFn;\n }\n\n subscribe(\n observerOrNext: Observer<T> | ((value: T) => void),\n options?: ObservableOptions,\n ): Subscription {\n const observer: Observer<T> =\n typeof observerOrNext === \"function\"\n ? { next: observerOrNext }\n : observerOrNext;\n\n const { signal } = options ?? {};\n\n if (signal?.aborted) {\n return {\n unsubscribe: () => {},\n closed: true,\n };\n }\n\n let closed = false;\n // eslint-disable-next-line @typescript-eslint/no-invalid-void-type -- matches SubscribeFn return type\n let teardown: void | (() => void);\n\n const safeNext = (value: T) => {\n if (closed) {\n return;\n }\n\n try {\n observer.next?.(value);\n } catch (error) {\n safeError(error);\n }\n };\n\n const safeError = (err: unknown) => {\n if (closed) {\n return;\n }\n\n try {\n if (observer.error) {\n observer.error(err);\n } else {\n console.error(\"Unhandled error in RxObservable:\", err);\n }\n } catch {\n // Errors in error handler are caught silently\n }\n };\n\n const safeComplete = () => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n try {\n observer.complete?.();\n } catch {\n // Errors in complete handler are caught silently\n }\n };\n\n const subscription: Subscription = {\n unsubscribe: () => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n if (abortHandler) {\n signal?.removeEventListener(\"abort\", abortHandler);\n }\n\n if (teardown) {\n try {\n teardown();\n } catch {\n // Teardown errors are caught silently\n }\n }\n },\n get closed() {\n return closed;\n },\n };\n\n let abortHandler: (() => void) | undefined;\n\n if (signal) {\n abortHandler = () => {\n subscription.unsubscribe();\n };\n signal.addEventListener(\"abort\", abortHandler);\n }\n\n try {\n teardown = this.#subscribeFn({\n next: safeNext,\n error: safeError,\n complete: safeComplete,\n });\n } catch (error) {\n safeError(error);\n }\n\n return subscription;\n }\n\n pipe(): this;\n pipe<A>(op1: Operator<T, A>): RxObservable<A>;\n pipe<A, B>(op1: Operator<T, A>, op2: Operator<A, B>): RxObservable<B>;\n pipe<A, B, C>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n ): RxObservable<C>;\n pipe<A, B, C, D>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n ): RxObservable<D>;\n pipe<A, B, C, D, E>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n ): RxObservable<E>;\n pipe<A, B, C, D, E, F>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n ): RxObservable<F>;\n pipe<A, B, C, D, E, F, G>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n op7: Operator<F, G>,\n ): RxObservable<G>;\n pipe<A, B, C, D, E, F, G, H>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n op7: Operator<F, G>,\n op8: Operator<G, H>,\n ): RxObservable<H>;\n pipe<A, B, C, D, E, F, G, H, I>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n op7: Operator<F, G>,\n op8: Operator<G, H>,\n op9: Operator<H, I>,\n ): RxObservable<I>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pipe(...operators: Operator<any, any>[]): any {\n if (operators.length === 0) {\n return this;\n }\n\n // eslint-disable-next-line unicorn/no-this-assignment, @typescript-eslint/no-this-alias -- pipe pattern\n let result: RxObservable<unknown> = this;\n\n for (const operator of operators) {\n result = operator(result);\n }\n\n return result;\n }\n\n [Symbol.observable](): this {\n return this;\n }\n\n [\"@@observable\"](): this {\n return this;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n let resolve: (() => void) | null = null;\n let latestValue: T | undefined;\n let hasValue = false;\n let completed = false;\n let error: unknown = null;\n\n const subscription = this.subscribe({\n next: (value) => {\n latestValue = value;\n hasValue = true;\n if (resolve) {\n const r = resolve;\n\n resolve = null;\n r();\n }\n },\n /* v8 ignore start -- v8 coverage can't track branches inside suspended async generators */\n error: (err) => {\n error = err;\n completed = true;\n if (resolve) {\n const r = resolve;\n\n resolve = null;\n r();\n }\n },\n complete: () => {\n completed = true;\n if (resolve) {\n const r = resolve;\n\n resolve = null;\n r();\n }\n },\n /* v8 ignore stop */\n });\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- v8 ignore affects analysis\n while (!completed) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- v8 ignore affects analysis\n if (hasValue) {\n const value = latestValue as T;\n\n hasValue = false;\n yield value;\n } else {\n await new Promise<void>((_resolve) => {\n resolve = _resolve;\n });\n\n if (error !== null) {\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw error;\n }\n }\n }\n } finally {\n subscription.unsubscribe();\n }\n }\n}\n","import { RxObservable } from \"../RxObservable\";\n\nimport type { Observer } from \"../types\";\n\n/**\n * Creates a stateless operator. Wires error/complete/teardown automatically.\n * The `next` callback receives each value and the downstream observer.\n */\nexport function createOperator<T, R>(\n next: (value: T, observer: Observer<R>) => void,\n): (source: RxObservable<T>) => RxObservable<R> {\n return (source: RxObservable<T>) =>\n new RxObservable<R>((observer) => {\n const subscription = source.subscribe({\n next: (value) => {\n next(value, observer);\n },\n error: (error) => observer.error?.(error),\n complete: () => observer.complete?.(),\n });\n\n return () => {\n subscription.unsubscribe();\n };\n });\n}\n\n/**\n * Creates a stateful operator. The subscribeFn sets up its own subscriptions\n * and returns a teardown function.\n */\nexport function createStatefulOperator<T, R>(\n subscribeFn: (source: RxObservable<T>, observer: Observer<R>) => () => void,\n): (source: RxObservable<T>) => RxObservable<R> {\n return (source: RxObservable<T>) =>\n new RxObservable<R>((observer) => subscribeFn(source, observer));\n}\n","import { createOperator } from \"./createOperator\";\n\nimport type { Operator } from \"../types\";\n\nexport function map<T, R>(project: (value: T) => R): Operator<T, R> {\n return createOperator<T, R>((value, observer) => {\n try {\n const result = project(value);\n\n observer.next?.(result);\n } catch (error) {\n observer.error?.(error);\n }\n });\n}\n","import { createOperator } from \"./createOperator\";\n\nimport type { Operator } from \"../types\";\n\nexport function filter<T, S extends T>(\n predicate: (value: T) => value is S,\n): Operator<T, S>;\n\nexport function filter<T>(predicate: (value: T) => boolean): Operator<T, T>;\n\nexport function filter<T>(predicate: (value: T) => boolean): Operator<T, T> {\n return createOperator<T, T>((value, observer) => {\n try {\n if (predicate(value)) {\n observer.next?.(value);\n }\n } catch (error) {\n observer.error?.(error);\n }\n });\n}\n","import { RxObservable } from \"../RxObservable\";\n\nimport type { Operator } from \"../types\";\n\nexport function debounceTime<T>(duration: number): Operator<T, T> {\n if (!Number.isFinite(duration) || duration < 0) {\n throw new RangeError(\n `debounceTime: duration must be a non-negative finite number, got ${duration}`,\n );\n }\n\n return (source: RxObservable<T>) =>\n new RxObservable<T>((observer) => {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let latestValue: T;\n let hasValue = false;\n\n const subscription = source.subscribe({\n next: (value) => {\n latestValue = value;\n hasValue = true;\n\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n /* v8 ignore start -- defensive: timer fired after flush */\n if (hasValue) {\n observer.next?.(latestValue);\n hasValue = false;\n }\n /* v8 ignore stop */\n\n timeoutId = undefined;\n }, duration);\n },\n error: (error) => {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n observer.error?.(error);\n },\n complete: () => {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n if (hasValue) {\n observer.next?.(latestValue);\n hasValue = false;\n }\n\n observer.complete?.();\n },\n });\n\n return () => {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n subscription.unsubscribe();\n };\n });\n}\n","import { createStatefulOperator } from \"./createOperator\";\n\nimport type { Operator } from \"../types\";\n\nexport function distinctUntilChanged<T>(\n comparator?: (a: T, b: T) => boolean,\n): Operator<T, T> {\n return createStatefulOperator<T, T>((source, observer) => {\n let hasLast = false;\n let last: T;\n const compare = comparator ?? ((a: T, b: T) => a === b);\n\n const subscription = source.subscribe({\n next: (value) => {\n if (!hasLast) {\n hasLast = true;\n last = value;\n observer.next?.(value);\n\n return;\n }\n\n try {\n if (!compare(last, value)) {\n last = value;\n observer.next?.(value);\n }\n } catch (error) {\n observer.error?.(error);\n }\n },\n error: (error) => observer.error?.(error),\n complete: () => observer.complete?.(),\n });\n\n return () => {\n subscription.unsubscribe();\n };\n });\n}\n","import { RxObservable } from \"../RxObservable\";\n\nimport type { Operator } from \"../types\";\n\nexport function takeUntil<T>(notifier: RxObservable<unknown>): Operator<T, T> {\n return (source: RxObservable<T>) =>\n new RxObservable<T>((observer) => {\n // eslint-disable-next-line prefer-const -- assigned after usage in complete()\n let sourceSubscription: ReturnType<typeof source.subscribe> | undefined;\n // eslint-disable-next-line prefer-const -- assigned after usage in complete()\n let notifierSubscription:\n | ReturnType<typeof notifier.subscribe>\n | undefined;\n let completed = false;\n\n const complete = () => {\n /* v8 ignore start -- defensive: race condition guard */\n if (completed) {\n return;\n }\n /* v8 ignore stop */\n\n completed = true;\n\n // sourceSubscription may be undefined if notifier emits synchronously\n if (sourceSubscription) {\n sourceSubscription.unsubscribe();\n }\n // notifierSubscription may be undefined if we're inside notifier.subscribe() call\n if (notifierSubscription) {\n notifierSubscription.unsubscribe();\n }\n\n observer.complete?.();\n };\n\n notifierSubscription = notifier.subscribe({\n next: () => {\n complete();\n },\n error: (error) => {\n /* v8 ignore start -- defensive: notifier error after completion */\n if (completed) {\n return;\n }\n /* v8 ignore stop */\n\n completed = true;\n\n // sourceSubscription may be undefined if notifier errors synchronously\n if (sourceSubscription) {\n sourceSubscription.unsubscribe();\n }\n\n observer.error?.(error);\n },\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- defensive\n if (completed) {\n return;\n }\n\n sourceSubscription = source.subscribe({\n next: (value) => {\n /* v8 ignore start -- defensive: emission after completion */\n\n if (!completed) {\n observer.next?.(value);\n }\n /* v8 ignore stop */\n },\n error: (error) => {\n /* v8 ignore start -- defensive: race condition guard */\n if (completed) {\n return;\n }\n /* v8 ignore stop */\n\n completed = true;\n\n // notifierSubscription is always defined here (notifier subscribes before source)\n notifierSubscription.unsubscribe();\n\n observer.error?.(error);\n },\n complete: () => {\n complete();\n },\n });\n\n return () => {\n // Both guaranteed defined: notifier subscribes first (line 37),\n // early return on line 60 if sync complete/error, source subscribes after (line 64)\n sourceSubscription.unsubscribe();\n notifierSubscription.unsubscribe();\n };\n });\n}\n","import { events, getPluginApi } from \"@real-router/core\";\n\nimport { RxObservable } from \"./RxObservable\";\n\nimport type { Router, State, SubscribeState } from \"@real-router/core\";\n\nexport type { SubscribeState } from \"@real-router/core\";\n\nexport function state$(\n router: Router,\n options?: { replay?: boolean },\n): RxObservable<SubscribeState> {\n const { replay = true } = options ?? {};\n\n return new RxObservable<SubscribeState>((observer) => {\n const api = getPluginApi(router);\n const unsubscribe = api.addEventListener(\n events.TRANSITION_SUCCESS,\n (toState: State, fromState: State | undefined) => {\n observer.next?.({ route: toState, previousRoute: fromState });\n },\n );\n\n if (replay) {\n const currentState = router.getState();\n\n if (currentState) {\n queueMicrotask(() => {\n observer.next?.({ route: currentState, previousRoute: undefined });\n });\n }\n }\n\n return unsubscribe;\n });\n}\n","import { events, getPluginApi } from \"@real-router/core\";\n\nimport { RxObservable } from \"./RxObservable\";\n\nimport type {\n Router,\n State,\n NavigationOptions,\n RouterError,\n} from \"@real-router/core\";\n\nexport type RouterEvent =\n | { type: \"ROUTER_START\" }\n | { type: \"ROUTER_STOP\" }\n | { type: \"TRANSITION_START\"; toState: State; fromState: State | undefined }\n | {\n type: \"TRANSITION_SUCCESS\";\n toState: State;\n fromState: State | undefined;\n options: NavigationOptions;\n }\n | {\n type: \"TRANSITION_ERROR\";\n toState: State | undefined;\n fromState: State | undefined;\n error: RouterError;\n }\n | { type: \"TRANSITION_CANCEL\"; toState: State; fromState: State | undefined };\n\nexport function events$(router: Router): RxObservable<RouterEvent> {\n return new RxObservable<RouterEvent>((observer) => {\n const api = getPluginApi(router);\n const unsubscribes: (() => void)[] = [];\n\n /* eslint-disable unicorn/prefer-single-call -- individual pushes for partial registration safety */\n try {\n unsubscribes.push(\n api.addEventListener(events.ROUTER_START, () => {\n observer.next?.({ type: \"ROUTER_START\" });\n }),\n );\n unsubscribes.push(\n api.addEventListener(events.ROUTER_STOP, () => {\n observer.next?.({ type: \"ROUTER_STOP\" });\n }),\n );\n unsubscribes.push(\n api.addEventListener(\n events.TRANSITION_START,\n (toState: State, fromState: State | undefined) => {\n observer.next?.({ type: \"TRANSITION_START\", toState, fromState });\n },\n ),\n );\n unsubscribes.push(\n api.addEventListener(\n events.TRANSITION_SUCCESS,\n (\n toState: State,\n fromState: State | undefined,\n options: NavigationOptions,\n ) => {\n observer.next?.({\n type: \"TRANSITION_SUCCESS\",\n toState,\n fromState,\n options,\n });\n },\n ),\n );\n unsubscribes.push(\n api.addEventListener(\n events.TRANSITION_ERROR,\n (\n toState: State | undefined,\n fromState: State | undefined,\n error: RouterError,\n ) => {\n observer.next?.({\n type: \"TRANSITION_ERROR\",\n toState,\n fromState,\n error,\n });\n },\n ),\n );\n unsubscribes.push(\n api.addEventListener(\n events.TRANSITION_CANCEL,\n (toState: State, fromState: State | undefined) => {\n observer.next?.({ type: \"TRANSITION_CANCEL\", toState, fromState });\n },\n ),\n );\n /* eslint-enable unicorn/prefer-single-call */\n /* v8 ignore start -- defensive: partial listener registration failure */\n } catch (error) {\n // Clean up any listeners that were successfully registered\n for (const unsub of unsubscribes) {\n unsub();\n }\n\n throw error;\n }\n /* v8 ignore stop */\n\n return () => {\n for (const unsub of unsubscribes) {\n unsub();\n }\n };\n });\n}\n","import { state$, type SubscribeState } from \"./state$\";\n\nimport type { RxObservable } from \"./RxObservable\";\nimport type { Router } from \"@real-router/core\";\n\n/**\n * Creates a TC39-compliant Observable from a router instance.\n *\n * This is a semantic wrapper over `state$()` that provides TC39 Observable interop.\n * Use this when you need RxJS compatibility via `from(observable(router))`.\n *\n * @param router - Router instance to observe\n * @returns RxObservable that emits state changes\n *\n * @example\n * ```typescript\n * import { from } from 'rxjs';\n * import { observable } from '@real-router/rx';\n *\n * const router$ = from(observable(router));\n * router$.subscribe(({ route, previousRoute }) => {\n * console.log('Navigation:', previousRoute?.name, '→', route.name);\n * });\n * ```\n */\nexport function observable(router: Router): RxObservable<SubscribeState> {\n return state$(router);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/RxObservable.ts","../../src/operators/createOperator.ts","../../src/operators/map.ts","../../src/operators/filter.ts","../../src/operators/debounceTime.ts","../../src/operators/distinctUntilChanged.ts","../../src/operators/takeUntil.ts","../../src/state$.ts","../../src/events$.ts","../../src/observable.ts"],"names":["api","getPluginApi","events"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n Observer,\n Subscription,\n ObservableOptions,\n SubscribeFn,\n Operator,\n} from \"./types\";\n\ndeclare global {\n interface SymbolConstructor {\n readonly observable: symbol;\n }\n}\n\nexport class RxObservable<T> {\n #subscribeFn: SubscribeFn<T>;\n\n constructor(subscribeFn: SubscribeFn<T>) {\n this.#subscribeFn = subscribeFn;\n }\n\n subscribe(\n observerOrNext: Observer<T> | ((value: T) => void),\n options?: ObservableOptions,\n ): Subscription {\n const observer: Observer<T> =\n typeof observerOrNext === \"function\"\n ? { next: observerOrNext }\n : observerOrNext;\n\n const { signal } = options ?? {};\n\n if (signal?.aborted) {\n return {\n unsubscribe: () => {},\n closed: true,\n };\n }\n\n let closed = false;\n // eslint-disable-next-line @typescript-eslint/no-invalid-void-type -- matches SubscribeFn return type\n let teardown: void | (() => void);\n\n const safeNext = (value: T) => {\n if (closed) {\n return;\n }\n\n try {\n observer.next?.(value);\n } catch (error) {\n safeError(error);\n }\n };\n\n const safeError = (err: unknown) => {\n if (closed) {\n return;\n }\n\n try {\n if (observer.error) {\n observer.error(err);\n } else {\n console.error(\"Unhandled error in RxObservable:\", err);\n }\n } catch {\n // Errors in error handler are caught silently\n }\n };\n\n const safeComplete = () => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n try {\n observer.complete?.();\n } catch {\n // Errors in complete handler are caught silently\n }\n };\n\n const subscription: Subscription = {\n unsubscribe: () => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n if (abortHandler) {\n signal?.removeEventListener(\"abort\", abortHandler);\n }\n\n if (teardown) {\n try {\n teardown();\n } catch {\n // Teardown errors are caught silently\n }\n }\n },\n get closed() {\n return closed;\n },\n };\n\n let abortHandler: (() => void) | undefined;\n\n if (signal) {\n abortHandler = () => {\n subscription.unsubscribe();\n };\n signal.addEventListener(\"abort\", abortHandler);\n }\n\n try {\n teardown = this.#subscribeFn({\n next: safeNext,\n error: safeError,\n complete: safeComplete,\n });\n } catch (error) {\n safeError(error);\n }\n\n return subscription;\n }\n\n pipe(): this;\n pipe<A>(op1: Operator<T, A>): RxObservable<A>;\n pipe<A, B>(op1: Operator<T, A>, op2: Operator<A, B>): RxObservable<B>;\n pipe<A, B, C>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n ): RxObservable<C>;\n pipe<A, B, C, D>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n ): RxObservable<D>;\n pipe<A, B, C, D, E>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n ): RxObservable<E>;\n pipe<A, B, C, D, E, F>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n ): RxObservable<F>;\n pipe<A, B, C, D, E, F, G>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n op7: Operator<F, G>,\n ): RxObservable<G>;\n pipe<A, B, C, D, E, F, G, H>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n op7: Operator<F, G>,\n op8: Operator<G, H>,\n ): RxObservable<H>;\n pipe<A, B, C, D, E, F, G, H, I>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n op7: Operator<F, G>,\n op8: Operator<G, H>,\n op9: Operator<H, I>,\n ): RxObservable<I>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pipe(...operators: Operator<any, any>[]): any {\n if (operators.length === 0) {\n return this;\n }\n\n // eslint-disable-next-line unicorn/no-this-assignment, @typescript-eslint/no-this-alias -- pipe pattern\n let result: RxObservable<unknown> = this;\n\n for (const operator of operators) {\n result = operator(result);\n }\n\n return result;\n }\n\n [Symbol.observable](): this {\n return this;\n }\n\n [\"@@observable\"](): this {\n return this;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n let resolve: (() => void) | null = null;\n let latestValue: T | undefined;\n let hasValue = false;\n let completed = false;\n let error: unknown = null;\n\n const subscription = this.subscribe({\n next: (value) => {\n latestValue = value;\n hasValue = true;\n if (resolve) {\n const r = resolve;\n\n resolve = null;\n r();\n }\n },\n /* v8 ignore start -- v8 coverage can't track branches inside suspended async generators */\n error: (err) => {\n error = err;\n completed = true;\n if (resolve) {\n const r = resolve;\n\n resolve = null;\n r();\n }\n },\n complete: () => {\n completed = true;\n if (resolve) {\n const r = resolve;\n\n resolve = null;\n r();\n }\n },\n /* v8 ignore stop */\n });\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- v8 ignore affects analysis\n while (!completed) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- v8 ignore affects analysis\n if (hasValue) {\n const value = latestValue as T;\n\n hasValue = false;\n yield value;\n } else {\n await new Promise<void>((_resolve) => {\n resolve = _resolve;\n });\n\n if (error !== null) {\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw error;\n }\n }\n }\n } finally {\n subscription.unsubscribe();\n }\n }\n}\n","import { RxObservable } from \"../RxObservable\";\n\nimport type { Observer } from \"../types\";\n\n/**\n * Creates a stateless operator. Wires error/complete/teardown automatically.\n * The `next` callback receives each value and the downstream observer.\n */\nexport function createOperator<T, R>(\n next: (value: T, observer: Observer<R>) => void,\n): (source: RxObservable<T>) => RxObservable<R> {\n return (source: RxObservable<T>) =>\n new RxObservable<R>((observer) => {\n const subscription = source.subscribe({\n next: (value) => {\n next(value, observer);\n },\n error: (error) => observer.error?.(error),\n complete: () => observer.complete?.(),\n });\n\n return () => {\n subscription.unsubscribe();\n };\n });\n}\n\n/**\n * Creates a stateful operator. The subscribeFn sets up its own subscriptions\n * and returns a teardown function.\n */\nexport function createStatefulOperator<T, R>(\n subscribeFn: (source: RxObservable<T>, observer: Observer<R>) => () => void,\n): (source: RxObservable<T>) => RxObservable<R> {\n return (source: RxObservable<T>) =>\n new RxObservable<R>((observer) => subscribeFn(source, observer));\n}\n","import { createOperator } from \"./createOperator\";\n\nimport type { Operator } from \"../types\";\n\nexport function map<T, R>(project: (value: T) => R): Operator<T, R> {\n return createOperator<T, R>((value, observer) => {\n try {\n const result = project(value);\n\n observer.next?.(result);\n } catch (error) {\n observer.error?.(error);\n }\n });\n}\n","import { createOperator } from \"./createOperator\";\n\nimport type { Operator } from \"../types\";\n\nexport function filter<T, S extends T>(\n predicate: (value: T) => value is S,\n): Operator<T, S>;\n\nexport function filter<T>(predicate: (value: T) => boolean): Operator<T, T>;\n\nexport function filter<T>(predicate: (value: T) => boolean): Operator<T, T> {\n return createOperator<T, T>((value, observer) => {\n try {\n if (predicate(value)) {\n observer.next?.(value);\n }\n } catch (error) {\n observer.error?.(error);\n }\n });\n}\n","import { RxObservable } from \"../RxObservable\";\n\nimport type { Operator } from \"../types\";\n\nexport function debounceTime<T>(duration: number): Operator<T, T> {\n if (!Number.isFinite(duration) || duration < 0) {\n throw new RangeError(\n `debounceTime: duration must be a non-negative finite number, got ${duration}`,\n );\n }\n\n return (source: RxObservable<T>) =>\n new RxObservable<T>((observer) => {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let latestValue: T;\n let hasValue = false;\n\n const subscription = source.subscribe({\n next: (value) => {\n latestValue = value;\n hasValue = true;\n\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n /* v8 ignore start -- defensive: timer fired after flush */\n if (hasValue) {\n observer.next?.(latestValue);\n hasValue = false;\n }\n /* v8 ignore stop */\n\n timeoutId = undefined;\n }, duration);\n },\n error: (error) => {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n observer.error?.(error);\n },\n complete: () => {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n if (hasValue) {\n observer.next?.(latestValue);\n hasValue = false;\n }\n\n observer.complete?.();\n },\n });\n\n return () => {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n subscription.unsubscribe();\n };\n });\n}\n","import { createStatefulOperator } from \"./createOperator\";\n\nimport type { Operator } from \"../types\";\n\nexport function distinctUntilChanged<T>(\n comparator?: (a: T, b: T) => boolean,\n): Operator<T, T> {\n return createStatefulOperator<T, T>((source, observer) => {\n let hasLast = false;\n let last: T;\n const compare = comparator ?? ((a: T, b: T) => a === b);\n\n const subscription = source.subscribe({\n next: (value) => {\n if (!hasLast) {\n hasLast = true;\n last = value;\n observer.next?.(value);\n\n return;\n }\n\n try {\n if (!compare(last, value)) {\n last = value;\n observer.next?.(value);\n }\n } catch (error) {\n observer.error?.(error);\n }\n },\n error: (error) => observer.error?.(error),\n complete: () => observer.complete?.(),\n });\n\n return () => {\n subscription.unsubscribe();\n };\n });\n}\n","import { RxObservable } from \"../RxObservable\";\n\nimport type { Operator } from \"../types\";\n\nexport function takeUntil<T>(notifier: RxObservable<unknown>): Operator<T, T> {\n return (source: RxObservable<T>) =>\n new RxObservable<T>((observer) => {\n // eslint-disable-next-line prefer-const -- assigned after usage in complete()\n let sourceSubscription: ReturnType<typeof source.subscribe> | undefined;\n // eslint-disable-next-line prefer-const -- assigned after usage in complete()\n let notifierSubscription:\n | ReturnType<typeof notifier.subscribe>\n | undefined;\n let completed = false;\n\n const complete = () => {\n /* v8 ignore start -- defensive: race condition guard */\n if (completed) {\n return;\n }\n /* v8 ignore stop */\n\n completed = true;\n\n // sourceSubscription may be undefined if notifier emits synchronously\n if (sourceSubscription) {\n sourceSubscription.unsubscribe();\n }\n // notifierSubscription may be undefined if we're inside notifier.subscribe() call\n if (notifierSubscription) {\n notifierSubscription.unsubscribe();\n }\n\n observer.complete?.();\n };\n\n notifierSubscription = notifier.subscribe({\n next: () => {\n complete();\n },\n error: (error) => {\n /* v8 ignore start -- defensive: notifier error after completion */\n if (completed) {\n return;\n }\n /* v8 ignore stop */\n\n completed = true;\n\n // sourceSubscription may be undefined if notifier errors synchronously\n if (sourceSubscription) {\n sourceSubscription.unsubscribe();\n }\n\n observer.error?.(error);\n },\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- defensive\n if (completed) {\n return;\n }\n\n sourceSubscription = source.subscribe({\n next: (value) => {\n /* v8 ignore start -- defensive: emission after completion */\n\n if (!completed) {\n observer.next?.(value);\n }\n /* v8 ignore stop */\n },\n error: (error) => {\n /* v8 ignore start -- defensive: race condition guard */\n if (completed) {\n return;\n }\n /* v8 ignore stop */\n\n completed = true;\n\n // notifierSubscription is always defined here (notifier subscribes before source)\n notifierSubscription.unsubscribe();\n\n observer.error?.(error);\n },\n complete: () => {\n complete();\n },\n });\n\n return () => {\n // Both guaranteed defined: notifier subscribes first (line 37),\n // early return on line 60 if sync complete/error, source subscribes after (line 64)\n sourceSubscription.unsubscribe();\n notifierSubscription.unsubscribe();\n };\n });\n}\n","import { events } from \"@real-router/core\";\nimport { getPluginApi } from \"@real-router/core/api\";\n\nimport { RxObservable } from \"./RxObservable\";\n\nimport type { Router, State, SubscribeState } from \"@real-router/core\";\n\nexport type { SubscribeState } from \"@real-router/core\";\n\nexport function state$(\n router: Router,\n options?: { replay?: boolean },\n): RxObservable<SubscribeState> {\n const { replay = true } = options ?? {};\n\n return new RxObservable<SubscribeState>((observer) => {\n const api = getPluginApi(router);\n const unsubscribe = api.addEventListener(\n events.TRANSITION_SUCCESS,\n (toState: State, fromState: State | undefined) => {\n observer.next?.({ route: toState, previousRoute: fromState });\n },\n );\n\n if (replay) {\n const currentState = router.getState();\n\n if (currentState) {\n queueMicrotask(() => {\n observer.next?.({ route: currentState, previousRoute: undefined });\n });\n }\n }\n\n return unsubscribe;\n });\n}\n","import { events } from \"@real-router/core\";\nimport { getPluginApi } from \"@real-router/core/api\";\n\nimport { RxObservable } from \"./RxObservable\";\n\nimport type {\n Router,\n State,\n NavigationOptions,\n RouterError,\n} from \"@real-router/core\";\n\nexport type RouterEvent =\n | { type: \"ROUTER_START\" }\n | { type: \"ROUTER_STOP\" }\n | { type: \"TRANSITION_START\"; toState: State; fromState: State | undefined }\n | {\n type: \"TRANSITION_SUCCESS\";\n toState: State;\n fromState: State | undefined;\n options: NavigationOptions;\n }\n | {\n type: \"TRANSITION_ERROR\";\n toState: State | undefined;\n fromState: State | undefined;\n error: RouterError;\n }\n | { type: \"TRANSITION_CANCEL\"; toState: State; fromState: State | undefined };\n\nexport function events$(router: Router): RxObservable<RouterEvent> {\n return new RxObservable<RouterEvent>((observer) => {\n const api = getPluginApi(router);\n const unsubscribes: (() => void)[] = [];\n\n /* eslint-disable unicorn/prefer-single-call -- individual pushes for partial registration safety */\n try {\n unsubscribes.push(\n api.addEventListener(events.ROUTER_START, () => {\n observer.next?.({ type: \"ROUTER_START\" });\n }),\n );\n unsubscribes.push(\n api.addEventListener(events.ROUTER_STOP, () => {\n observer.next?.({ type: \"ROUTER_STOP\" });\n }),\n );\n unsubscribes.push(\n api.addEventListener(\n events.TRANSITION_START,\n (toState: State, fromState: State | undefined) => {\n observer.next?.({ type: \"TRANSITION_START\", toState, fromState });\n },\n ),\n );\n unsubscribes.push(\n api.addEventListener(\n events.TRANSITION_SUCCESS,\n (\n toState: State,\n fromState: State | undefined,\n options: NavigationOptions,\n ) => {\n observer.next?.({\n type: \"TRANSITION_SUCCESS\",\n toState,\n fromState,\n options,\n });\n },\n ),\n );\n unsubscribes.push(\n api.addEventListener(\n events.TRANSITION_ERROR,\n (\n toState: State | undefined,\n fromState: State | undefined,\n error: RouterError,\n ) => {\n observer.next?.({\n type: \"TRANSITION_ERROR\",\n toState,\n fromState,\n error,\n });\n },\n ),\n );\n unsubscribes.push(\n api.addEventListener(\n events.TRANSITION_CANCEL,\n (toState: State, fromState: State | undefined) => {\n observer.next?.({ type: \"TRANSITION_CANCEL\", toState, fromState });\n },\n ),\n );\n /* eslint-enable unicorn/prefer-single-call */\n /* v8 ignore start -- defensive: partial listener registration failure */\n } catch (error) {\n // Clean up any listeners that were successfully registered\n for (const unsub of unsubscribes) {\n unsub();\n }\n\n throw error;\n }\n /* v8 ignore stop */\n\n return () => {\n for (const unsub of unsubscribes) {\n unsub();\n }\n };\n });\n}\n","import { state$, type SubscribeState } from \"./state$\";\n\nimport type { RxObservable } from \"./RxObservable\";\nimport type { Router } from \"@real-router/core\";\n\n/**\n * Creates a TC39-compliant Observable from a router instance.\n *\n * This is a semantic wrapper over `state$()` that provides TC39 Observable interop.\n * Use this when you need RxJS compatibility via `from(observable(router))`.\n *\n * @param router - Router instance to observe\n * @returns RxObservable that emits state changes\n *\n * @example\n * ```typescript\n * import { from } from 'rxjs';\n * import { observable } from '@real-router/rx';\n *\n * const router$ = from(observable(router));\n * router$.subscribe(({ route, previousRoute }) => {\n * console.log('Navigation:', previousRoute?.name, '→', route.name);\n * });\n * ```\n */\nexport function observable(router: Router): RxObservable<SubscribeState> {\n return state$(router);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.
|
|
1
|
+
{"inputs":{"../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js":{"bytes":569,"imports":[],"format":"esm"},"src/RxObservable.ts":{"bytes":6310,"imports":[{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/operators/createOperator.ts":{"bytes":1177,"imports":[{"path":"src/RxObservable.ts","kind":"import-statement","original":"../RxObservable"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/operators/map.ts":{"bytes":364,"imports":[{"path":"src/operators/createOperator.ts","kind":"import-statement","original":"./createOperator"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/operators/filter.ts":{"bytes":550,"imports":[{"path":"src/operators/createOperator.ts","kind":"import-statement","original":"./createOperator"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/operators/debounceTime.ts":{"bytes":1803,"imports":[{"path":"src/RxObservable.ts","kind":"import-statement","original":"../RxObservable"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/operators/distinctUntilChanged.ts":{"bytes":955,"imports":[{"path":"src/operators/createOperator.ts","kind":"import-statement","original":"./createOperator"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/operators/takeUntil.ts":{"bytes":2959,"imports":[{"path":"src/RxObservable.ts","kind":"import-statement","original":"../RxObservable"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/operators/index.ts":{"bytes":219,"imports":[{"path":"src/operators/map.ts","kind":"import-statement","original":"./map"},{"path":"src/operators/filter.ts","kind":"import-statement","original":"./filter"},{"path":"src/operators/debounceTime.ts","kind":"import-statement","original":"./debounceTime"},{"path":"src/operators/distinctUntilChanged.ts","kind":"import-statement","original":"./distinctUntilChanged"},{"path":"src/operators/takeUntil.ts","kind":"import-statement","original":"./takeUntil"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/state$.ts":{"bytes":1012,"imports":[{"path":"@real-router/core","kind":"import-statement","external":true},{"path":"@real-router/core/api","kind":"import-statement","external":true},{"path":"src/RxObservable.ts","kind":"import-statement","original":"./RxObservable"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/events$.ts":{"bytes":3217,"imports":[{"path":"@real-router/core","kind":"import-statement","external":true},{"path":"@real-router/core/api","kind":"import-statement","external":true},{"path":"src/RxObservable.ts","kind":"import-statement","original":"./RxObservable"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/observable.ts":{"bytes":897,"imports":[{"path":"src/state$.ts","kind":"import-statement","original":"./state$"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":489,"imports":[{"path":"src/RxObservable.ts","kind":"import-statement","original":"./RxObservable"},{"path":"src/operators/index.ts","kind":"import-statement","original":"./operators"},{"path":"src/state$.ts","kind":"import-statement","original":"./state$"},{"path":"src/events$.ts","kind":"import-statement","original":"./events$"},{"path":"src/observable.ts","kind":"import-statement","original":"./observable"},{"path":"/home/runner/work/real-router/real-router/node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.8_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","kind":"import-statement","external":true}],"format":"esm"}},"outputs":{"dist/cjs/index.js.map":{"imports":[],"exports":[],"inputs":{},"bytes":27767},"dist/cjs/index.js":{"imports":[{"path":"@real-router/core","kind":"import-statement","external":true},{"path":"@real-router/core/api","kind":"import-statement","external":true},{"path":"@real-router/core","kind":"import-statement","external":true},{"path":"@real-router/core/api","kind":"import-statement","external":true}],"exports":["RxObservable","debounceTime","distinctUntilChanged","events$","filter","map","observable","state$","takeUntil"],"entryPoint":"src/index.ts","inputs":{"src/RxObservable.ts":{"bytesInOutput":3515},"src/index.ts":{"bytesInOutput":0},"src/operators/createOperator.ts":{"bytesInOutput":497},"src/operators/map.ts":{"bytesInOutput":216},"src/operators/index.ts":{"bytesInOutput":0},"src/operators/filter.ts":{"bytesInOutput":223},"src/operators/debounceTime.ts":{"bytesInOutput":1376},"src/operators/distinctUntilChanged.ts":{"bytesInOutput":775},"src/operators/takeUntil.ts":{"bytesInOutput":1369},"src/state$.ts":{"bytesInOutput":707},"src/events$.ts":{"bytesInOutput":1922},"src/observable.ts":{"bytesInOutput":57}},"bytes":11067}}}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{events as e}from"@real-router/core";import{getPluginApi as t}from"@real-router/core/api";var r=class{#e;constructor(e){this.#e=e}subscribe(e,t){const r="function"==typeof e?{next:e}:e,{signal:n}=t??{};if(n?.aborted)return{unsubscribe:()=>{},closed:!0};let o,s=!1;const u=e=>{if(!s)try{r.next?.(e)}catch(e){i(e)}},i=e=>{if(!s)try{r.error?r.error(e):console.error("Unhandled error in RxObservable:",e)}catch{}},c=()=>{if(!s){s=!0;try{r.complete?.()}catch{}}},b={unsubscribe:()=>{if(!s&&(s=!0,a&&n?.removeEventListener("abort",a),o))try{o()}catch{}},get closed(){return s}};let a;n&&(a=()=>{b.unsubscribe()},n.addEventListener("abort",a));try{o=this.#e({next:u,error:i,complete:c})}catch(e){i(e)}return b}pipe(...e){if(0===e.length)return this;let t=this;for(const r of e)t=r(t);return t}[Symbol.observable](){return this}"@@observable"(){return this}async*[Symbol.asyncIterator](){let e,t=null,r=!1,n=!1,o=null;const s=this.subscribe({next:n=>{if(e=n,r=!0,t){const e=t;t=null,e()}},error:e=>{if(o=e,n=!0,t){const e=t;t=null,e()}},complete:()=>{if(n=!0,t){const e=t;t=null,e()}}});try{for(;!n;)if(r){const t=e;r=!1,yield t}else if(await new Promise(e=>{t=e}),null!==o)throw o}finally{s.unsubscribe()}}};function n(e){return t=>new r(r=>{const n=t.subscribe({next:t=>{e(t,r)},error:e=>r.error?.(e),complete:()=>r.complete?.()});return()=>{n.unsubscribe()}})}function o(e){return n((t,r)=>{try{const n=e(t);r.next?.(n)}catch(e){r.error?.(e)}})}function s(e){return n((t,r)=>{try{e(t)&&r.next?.(t)}catch(e){r.error?.(e)}})}function u(e){if(!Number.isFinite(e)||e<0)throw new RangeError(`debounceTime: duration must be a non-negative finite number, got ${e}`);return t=>new r(r=>{let n,o,s=!1;const u=t.subscribe({next:t=>{o=t,s=!0,void 0!==n&&clearTimeout(n),n=setTimeout(()=>{s&&(r.next?.(o),s=!1),n=void 0},e)},error:e=>{void 0!==n&&(clearTimeout(n),n=void 0),r.error?.(e)},complete:()=>{void 0!==n&&(clearTimeout(n),n=void 0),s&&(r.next?.(o),s=!1),r.complete?.()}});return()=>{void 0!==n&&(clearTimeout(n),n=void 0),u.unsubscribe()}})}function i(e){return t=(t,r)=>{let n,o=!1;const s=e??((e,t)=>e===t),u=t.subscribe({next:e=>{if(!o)return o=!0,n=e,void r.next?.(e);try{s(n,e)||(n=e,r.next?.(e))}catch(e){r.error?.(e)}},error:e=>r.error?.(e),complete:()=>r.complete?.()});return()=>{u.unsubscribe()}},e=>new r(r=>t(e,r));var t}function c(e){return t=>new r(r=>{let n,o,s=!1;const u=()=>{s||(s=!0,n&&n.unsubscribe(),o&&o.unsubscribe(),r.complete?.())};if(o=e.subscribe({next:()=>{u()},error:e=>{s||(s=!0,n&&n.unsubscribe(),r.error?.(e))}}),!s)return n=t.subscribe({next:e=>{s||r.next?.(e)},error:e=>{s||(s=!0,o.unsubscribe(),r.error?.(e))},complete:()=>{u()}}),()=>{n.unsubscribe(),o.unsubscribe()}})}function b(n,o){const{replay:s=!0}=o??{};return new r(r=>{const o=t(n).addEventListener(e.TRANSITION_SUCCESS,(e,t)=>{r.next?.({route:e,previousRoute:t})});if(s){const e=n.getState();e&&queueMicrotask(()=>{r.next?.({route:e,previousRoute:void 0})})}return o})}function a(n){return new r(r=>{const o=t(n),s=[];try{s.push(o.addEventListener(e.ROUTER_START,()=>{r.next?.({type:"ROUTER_START"})})),s.push(o.addEventListener(e.ROUTER_STOP,()=>{r.next?.({type:"ROUTER_STOP"})})),s.push(o.addEventListener(e.TRANSITION_START,(e,t)=>{r.next?.({type:"TRANSITION_START",toState:e,fromState:t})})),s.push(o.addEventListener(e.TRANSITION_SUCCESS,(e,t,n)=>{r.next?.({type:"TRANSITION_SUCCESS",toState:e,fromState:t,options:n})})),s.push(o.addEventListener(e.TRANSITION_ERROR,(e,t,n)=>{r.next?.({type:"TRANSITION_ERROR",toState:e,fromState:t,error:n})})),s.push(o.addEventListener(e.TRANSITION_CANCEL,(e,t)=>{r.next?.({type:"TRANSITION_CANCEL",toState:e,fromState:t})}))}catch(e){for(const e of s)e();throw e}return()=>{for(const e of s)e()}})}function l(e){return b(e)}export{r as RxObservable,u as debounceTime,i as distinctUntilChanged,a as events$,s as filter,o as map,l as observable,b as state$,c as takeUntil};//# sourceMappingURL=index.mjs.map
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/RxObservable.ts","../../src/operators/createOperator.ts","../../src/operators/map.ts","../../src/operators/filter.ts","../../src/operators/debounceTime.ts","../../src/operators/distinctUntilChanged.ts","../../src/operators/takeUntil.ts","../../src/state$.ts","../../src/events$.ts","../../src/observable.ts"],"names":["getPluginApi","events"],"mappings":";AAcO,IAAM,eAAN,MAAsB;AAAA,EAC3B,YAAA;AAAA,EAEA,YAAY,WAAA,EAA6B;AACvC,IAAA,IAAA,CAAK,YAAA,GAAe,WAAA;AAAA,EACtB;AAAA,EAEA,SAAA,CACE,gBACA,OAAA,EACc;AACd,IAAA,MAAM,WACJ,OAAO,cAAA,KAAmB,aACtB,EAAE,IAAA,EAAM,gBAAe,GACvB,cAAA;AAEN,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,OAAA,IAAW,EAAC;AAE/B,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,OAAO;AAAA,QACL,aAAa,MAAM;AAAA,QAAC,CAAA;AAAA,QACpB,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,GAAS,KAAA;AAEb,IAAA,IAAI,QAAA;AAEJ,IAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAAa;AAC7B,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,MACvB,SAAS,KAAA,EAAO;AACd,QAAA,SAAA,CAAU,KAAK,CAAA;AAAA,MACjB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,CAAC,GAAA,KAAiB;AAClC,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,IAAI,SAAS,KAAA,EAAO;AAClB,UAAA,QAAA,CAAS,MAAM,GAAG,CAAA;AAAA,QACpB,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,GAAG,CAAA;AAAA,QACvD;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,GAAS,IAAA;AAET,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,QAAA,IAAW;AAAA,MACtB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,YAAA,GAA6B;AAAA,MACjC,aAAa,MAAM;AACjB,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA;AAAA,QACF;AAEA,QAAA,MAAA,GAAS,IAAA;AAET,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,MAAA,EAAQ,mBAAA,CAAoB,SAAS,YAAY,CAAA;AAAA,QACnD;AAEA,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,IAAI;AACF,YAAA,QAAA,EAAS;AAAA,UACX,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,IAAI,MAAA,GAAS;AACX,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,KACF;AAEA,IAAA,IAAI,YAAA;AAEJ,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,YAAA,GAAe,MAAM;AACnB,QAAA,YAAA,CAAa,WAAA,EAAY;AAAA,MAC3B,CAAA;AACA,MAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,YAAY,CAAA;AAAA,IAC/C;AAEA,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,KAAK,YAAA,CAAa;AAAA,QAC3B,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA;AAAA,EA8DA,QAAQ,SAAA,EAAsC;AAC5C,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAA,GAAgC,IAAA;AAEpC,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,MAAA,GAAS,SAAS,MAAM,CAAA;AAAA,IAC1B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,CAAC,MAAA,CAAO,UAAU,CAAA,GAAU;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,CAAC,cAAc,CAAA,GAAU;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAQ,MAAA,CAAO,aAAa,CAAA,GAA8B;AACxD,IAAA,IAAI,OAAA,GAA+B,IAAA;AACnC,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,IAAI,KAAA,GAAiB,IAAA;AAErB,IAAA,MAAM,YAAA,GAAe,KAAK,SAAA,CAAU;AAAA,MAClC,IAAA,EAAM,CAAC,KAAA,KAAU;AACf,QAAA,WAAA,GAAc,KAAA;AACd,QAAA,QAAA,GAAW,IAAA;AACX,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,CAAA,GAAI,OAAA;AAEV,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,CAAA,EAAE;AAAA,QACJ;AAAA,MACF,CAAA;AAAA;AAAA,MAEA,KAAA,EAAO,CAAC,GAAA,KAAQ;AACd,QAAA,KAAA,GAAQ,GAAA;AACR,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,CAAA,GAAI,OAAA;AAEV,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,CAAA,EAAE;AAAA,QACJ;AAAA,MACF,CAAA;AAAA,MACA,UAAU,MAAM;AACd,QAAA,SAAA,GAAY,IAAA;AACZ,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,CAAA,GAAI,OAAA;AAEV,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,CAAA,EAAE;AAAA,QACJ;AAAA,MACF;AAAA;AAAA,KAED,CAAA;AAED,IAAA,IAAI;AAEF,MAAA,OAAO,CAAC,SAAA,EAAW;AAEjB,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,KAAA,GAAQ,WAAA;AAEd,UAAA,QAAA,GAAW,KAAA;AACX,UAAA,MAAM,KAAA;AAAA,QACR,CAAA,MAAO;AACL,UAAA,MAAM,IAAI,OAAA,CAAc,CAAC,QAAA,KAAa;AACpC,YAAA,OAAA,GAAU,QAAA;AAAA,UACZ,CAAC,CAAA;AAED,UAAA,IAAI,UAAU,IAAA,EAAM;AAElB,YAAA,MAAM,KAAA;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,WAAA,EAAY;AAAA,IAC3B;AAAA,EACF;AACF;;;AChRO,SAAS,eACd,IAAA,EAC8C;AAC9C,EAAA,OAAO,CAAC,MAAA,KACN,IAAI,YAAA,CAAgB,CAAC,QAAA,KAAa;AAChC,IAAA,MAAM,YAAA,GAAe,OAAO,SAAA,CAAU;AAAA,MACpC,IAAA,EAAM,CAAC,KAAA,KAAU;AACf,QAAA,IAAA,CAAK,OAAO,QAAQ,CAAA;AAAA,MACtB,CAAA;AAAA,MACA,KAAA,EAAO,CAAC,KAAA,KAAU,QAAA,CAAS,QAAQ,KAAK,CAAA;AAAA,MACxC,QAAA,EAAU,MAAM,QAAA,CAAS,QAAA;AAAW,KACrC,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,WAAA,EAAY;AAAA,IAC3B,CAAA;AAAA,EACF,CAAC,CAAA;AACL;AAMO,SAAS,uBACd,WAAA,EAC8C;AAC9C,EAAA,OAAO,CAAC,WACN,IAAI,YAAA,CAAgB,CAAC,QAAA,KAAa,WAAA,CAAY,MAAA,EAAQ,QAAQ,CAAC,CAAA;AACnE;;;AChCO,SAAS,IAAU,OAAA,EAA0C;AAClE,EAAA,OAAO,cAAA,CAAqB,CAAC,KAAA,EAAO,QAAA,KAAa;AAC/C,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,QAAQ,KAAK,CAAA;AAE5B,MAAA,QAAA,CAAS,OAAO,MAAM,CAAA;AAAA,IACxB,SAAS,KAAA,EAAO;AACd,MAAA,QAAA,CAAS,QAAQ,KAAK,CAAA;AAAA,IACxB;AAAA,EACF,CAAC,CAAA;AACH;;;ACJO,SAAS,OAAU,SAAA,EAAkD;AAC1E,EAAA,OAAO,cAAA,CAAqB,CAAC,KAAA,EAAO,QAAA,KAAa;AAC/C,IAAA,IAAI;AACF,MAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG;AACpB,QAAA,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,MACvB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,QAAA,CAAS,QAAQ,KAAK,CAAA;AAAA,IACxB;AAAA,EACF,CAAC,CAAA;AACH;;;AChBO,SAAS,aAAgB,QAAA,EAAkC;AAChE,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,IAAK,WAAW,CAAA,EAAG;AAC9C,IAAA,MAAM,IAAI,UAAA;AAAA,MACR,oEAAoE,QAAQ,CAAA;AAAA,KAC9E;AAAA,EACF;AAEA,EAAA,OAAO,CAAC,MAAA,KACN,IAAI,YAAA,CAAgB,CAAC,QAAA,KAAa;AAChC,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,WAAA;AACJ,IAAA,IAAI,QAAA,GAAW,KAAA;AAEf,IAAA,MAAM,YAAA,GAAe,OAAO,SAAA,CAAU;AAAA,MACpC,IAAA,EAAM,CAAC,KAAA,KAAU;AACf,QAAA,WAAA,GAAc,KAAA;AACd,QAAA,QAAA,GAAW,IAAA;AAEX,QAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,UAAA,YAAA,CAAa,SAAS,CAAA;AAAA,QACxB;AAEA,QAAA,SAAA,GAAY,WAAW,MAAM;AAE3B,UAAA,IAAI,QAAA,EAAU;AACZ,YAAA,QAAA,CAAS,OAAO,WAAW,CAAA;AAC3B,YAAA,QAAA,GAAW,KAAA;AAAA,UACb;AAGA,UAAA,SAAA,GAAY,MAAA;AAAA,QACd,GAAG,QAAQ,CAAA;AAAA,MACb,CAAA;AAAA,MACA,KAAA,EAAO,CAAC,KAAA,KAAU;AAChB,QAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,UAAA,YAAA,CAAa,SAAS,CAAA;AACtB,UAAA,SAAA,GAAY,MAAA;AAAA,QACd;AAEA,QAAA,QAAA,CAAS,QAAQ,KAAK,CAAA;AAAA,MACxB,CAAA;AAAA,MACA,UAAU,MAAM;AACd,QAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,UAAA,YAAA,CAAa,SAAS,CAAA;AACtB,UAAA,SAAA,GAAY,MAAA;AAAA,QACd;AAEA,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,QAAA,CAAS,OAAO,WAAW,CAAA;AAC3B,UAAA,QAAA,GAAW,KAAA;AAAA,QACb;AAEA,QAAA,QAAA,CAAS,QAAA,IAAW;AAAA,MACtB;AAAA,KACD,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,QAAA,YAAA,CAAa,SAAS,CAAA;AACtB,QAAA,SAAA,GAAY,MAAA;AAAA,MACd;AAEA,MAAA,YAAA,CAAa,WAAA,EAAY;AAAA,IAC3B,CAAA;AAAA,EACF,CAAC,CAAA;AACL;;;ACjEO,SAAS,qBACd,UAAA,EACgB;AAChB,EAAA,OAAO,sBAAA,CAA6B,CAAC,MAAA,EAAQ,QAAA,KAAa;AACxD,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,IAAI,IAAA;AACJ,IAAA,MAAM,OAAA,GAAU,UAAA,KAAe,CAAC,CAAA,EAAM,MAAS,CAAA,KAAM,CAAA,CAAA;AAErD,IAAA,MAAM,YAAA,GAAe,OAAO,SAAA,CAAU;AAAA,MACpC,IAAA,EAAM,CAAC,KAAA,KAAU;AACf,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,OAAA,GAAU,IAAA;AACV,UAAA,IAAA,GAAO,KAAA;AACP,UAAA,QAAA,CAAS,OAAO,KAAK,CAAA;AAErB,UAAA;AAAA,QACF;AAEA,QAAA,IAAI;AACF,UAAA,IAAI,CAAC,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA,EAAG;AACzB,YAAA,IAAA,GAAO,KAAA;AACP,YAAA,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,UACvB;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,QAAA,CAAS,QAAQ,KAAK,CAAA;AAAA,QACxB;AAAA,MACF,CAAA;AAAA,MACA,KAAA,EAAO,CAAC,KAAA,KAAU,QAAA,CAAS,QAAQ,KAAK,CAAA;AAAA,MACxC,QAAA,EAAU,MAAM,QAAA,CAAS,QAAA;AAAW,KACrC,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,YAAA,CAAa,WAAA,EAAY;AAAA,IAC3B,CAAA;AAAA,EACF,CAAC,CAAA;AACH;;;ACnCO,SAAS,UAAa,QAAA,EAAiD;AAC5E,EAAA,OAAO,CAAC,MAAA,KACN,IAAI,YAAA,CAAgB,CAAC,QAAA,KAAa;AAEhC,IAAA,IAAI,kBAAA;AAEJ,IAAA,IAAI,oBAAA;AAGJ,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,MAAM,WAAW,MAAM;AAErB,MAAA,IAAI,SAAA,EAAW;AACb,QAAA;AAAA,MACF;AAGA,MAAA,SAAA,GAAY,IAAA;AAGZ,MAAA,IAAI,kBAAA,EAAoB;AACtB,QAAA,kBAAA,CAAmB,WAAA,EAAY;AAAA,MACjC;AAEA,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,oBAAA,CAAqB,WAAA,EAAY;AAAA,MACnC;AAEA,MAAA,QAAA,CAAS,QAAA,IAAW;AAAA,IACtB,CAAA;AAEA,IAAA,oBAAA,GAAuB,SAAS,SAAA,CAAU;AAAA,MACxC,MAAM,MAAM;AACV,QAAA,QAAA,EAAS;AAAA,MACX,CAAA;AAAA,MACA,KAAA,EAAO,CAAC,KAAA,KAAU;AAEhB,QAAA,IAAI,SAAA,EAAW;AACb,UAAA;AAAA,QACF;AAGA,QAAA,SAAA,GAAY,IAAA;AAGZ,QAAA,IAAI,kBAAA,EAAoB;AACtB,UAAA,kBAAA,CAAmB,WAAA,EAAY;AAAA,QACjC;AAEA,QAAA,QAAA,CAAS,QAAQ,KAAK,CAAA;AAAA,MACxB;AAAA,KACD,CAAA;AAGD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA;AAAA,IACF;AAEA,IAAA,kBAAA,GAAqB,OAAO,SAAA,CAAU;AAAA,MACpC,IAAA,EAAM,CAAC,KAAA,KAAU;AAGf,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,QACvB;AAAA,MAEF,CAAA;AAAA,MACA,KAAA,EAAO,CAAC,KAAA,KAAU;AAEhB,QAAA,IAAI,SAAA,EAAW;AACb,UAAA;AAAA,QACF;AAGA,QAAA,SAAA,GAAY,IAAA;AAGZ,QAAA,oBAAA,CAAqB,WAAA,EAAY;AAEjC,QAAA,QAAA,CAAS,QAAQ,KAAK,CAAA;AAAA,MACxB,CAAA;AAAA,MACA,UAAU,MAAM;AACd,QAAA,QAAA,EAAS;AAAA,MACX;AAAA,KACD,CAAA;AAED,IAAA,OAAO,MAAM;AAGX,MAAA,kBAAA,CAAmB,WAAA,EAAY;AAC/B,MAAA,oBAAA,CAAqB,WAAA,EAAY;AAAA,IACnC,CAAA;AAAA,EACF,CAAC,CAAA;AACL;AC1FO,SAAS,MAAA,CACd,QACA,OAAA,EAC8B;AAC9B,EAAA,MAAM,EAAE,MAAA,GAAS,IAAA,EAAK,GAAI,WAAW,EAAC;AAEtC,EAAA,OAAO,IAAI,YAAA,CAA6B,CAAC,QAAA,KAAa;AACpD,IAAA,MAAM,GAAA,GAAM,aAAa,MAAM,CAAA;AAC/B,IAAA,MAAM,cAAc,GAAA,CAAI,gBAAA;AAAA,MACtB,MAAA,CAAO,kBAAA;AAAA,MACP,CAAC,SAAgB,SAAA,KAAiC;AAChD,QAAA,QAAA,CAAS,OAAO,EAAE,KAAA,EAAO,OAAA,EAAS,aAAA,EAAe,WAAW,CAAA;AAAA,MAC9D;AAAA,KACF;AAEA,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,YAAA,GAAe,OAAO,QAAA,EAAS;AAErC,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,cAAA,CAAe,MAAM;AACnB,UAAA,QAAA,CAAS,OAAO,EAAE,KAAA,EAAO,YAAA,EAAc,aAAA,EAAe,QAAW,CAAA;AAAA,QACnE,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,WAAA;AAAA,EACT,CAAC,CAAA;AACH;ACNO,SAAS,QAAQ,MAAA,EAA2C;AACjE,EAAA,OAAO,IAAI,YAAA,CAA0B,CAAC,QAAA,KAAa;AACjD,IAAA,MAAM,GAAA,GAAMA,aAAa,MAAM,CAAA;AAC/B,IAAA,MAAM,eAA+B,EAAC;AAGtC,IAAA,IAAI;AACF,MAAA,YAAA,CAAa,IAAA;AAAA,QACX,GAAA,CAAI,gBAAA,CAAiBC,MAAAA,CAAO,YAAA,EAAc,MAAM;AAC9C,UAAA,QAAA,CAAS,IAAA,GAAO,EAAE,IAAA,EAAM,cAAA,EAAgB,CAAA;AAAA,QAC1C,CAAC;AAAA,OACH;AACA,MAAA,YAAA,CAAa,IAAA;AAAA,QACX,GAAA,CAAI,gBAAA,CAAiBA,MAAAA,CAAO,WAAA,EAAa,MAAM;AAC7C,UAAA,QAAA,CAAS,IAAA,GAAO,EAAE,IAAA,EAAM,aAAA,EAAe,CAAA;AAAA,QACzC,CAAC;AAAA,OACH;AACA,MAAA,YAAA,CAAa,IAAA;AAAA,QACX,GAAA,CAAI,gBAAA;AAAA,UACFA,MAAAA,CAAO,gBAAA;AAAA,UACP,CAAC,SAAgB,SAAA,KAAiC;AAChD,YAAA,QAAA,CAAS,OAAO,EAAE,IAAA,EAAM,kBAAA,EAAoB,OAAA,EAAS,WAAW,CAAA;AAAA,UAClE;AAAA;AACF,OACF;AACA,MAAA,YAAA,CAAa,IAAA;AAAA,QACX,GAAA,CAAI,gBAAA;AAAA,UACFA,MAAAA,CAAO,kBAAA;AAAA,UACP,CACE,OAAA,EACA,SAAA,EACA,OAAA,KACG;AACH,YAAA,QAAA,CAAS,IAAA,GAAO;AAAA,cACd,IAAA,EAAM,oBAAA;AAAA,cACN,OAAA;AAAA,cACA,SAAA;AAAA,cACA;AAAA,aACD,CAAA;AAAA,UACH;AAAA;AACF,OACF;AACA,MAAA,YAAA,CAAa,IAAA;AAAA,QACX,GAAA,CAAI,gBAAA;AAAA,UACFA,MAAAA,CAAO,gBAAA;AAAA,UACP,CACE,OAAA,EACA,SAAA,EACA,KAAA,KACG;AACH,YAAA,QAAA,CAAS,IAAA,GAAO;AAAA,cACd,IAAA,EAAM,kBAAA;AAAA,cACN,OAAA;AAAA,cACA,SAAA;AAAA,cACA;AAAA,aACD,CAAA;AAAA,UACH;AAAA;AACF,OACF;AACA,MAAA,YAAA,CAAa,IAAA;AAAA,QACX,GAAA,CAAI,gBAAA;AAAA,UACFA,MAAAA,CAAO,iBAAA;AAAA,UACP,CAAC,SAAgB,SAAA,KAAiC;AAChD,YAAA,QAAA,CAAS,OAAO,EAAE,IAAA,EAAM,mBAAA,EAAqB,OAAA,EAAS,WAAW,CAAA;AAAA,UACnE;AAAA;AACF,OACF;AAAA,IAGF,SAAS,KAAA,EAAO;AAEd,MAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,QAAA,KAAA,EAAM;AAAA,MACR;AAEA,MAAA,MAAM,KAAA;AAAA,IACR;AAGA,IAAA,OAAO,MAAM;AACX,MAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,QAAA,KAAA,EAAM;AAAA,MACR;AAAA,IACF,CAAA;AAAA,EACF,CAAC,CAAA;AACH;;;ACzFO,SAAS,WAAW,MAAA,EAA8C;AACvE,EAAA,OAAO,OAAO,MAAM,CAAA;AACtB","file":"index.mjs","sourcesContent":["import type {\n Observer,\n Subscription,\n ObservableOptions,\n SubscribeFn,\n Operator,\n} from \"./types\";\n\ndeclare global {\n interface SymbolConstructor {\n readonly observable: symbol;\n }\n}\n\nexport class RxObservable<T> {\n #subscribeFn: SubscribeFn<T>;\n\n constructor(subscribeFn: SubscribeFn<T>) {\n this.#subscribeFn = subscribeFn;\n }\n\n subscribe(\n observerOrNext: Observer<T> | ((value: T) => void),\n options?: ObservableOptions,\n ): Subscription {\n const observer: Observer<T> =\n typeof observerOrNext === \"function\"\n ? { next: observerOrNext }\n : observerOrNext;\n\n const { signal } = options ?? {};\n\n if (signal?.aborted) {\n return {\n unsubscribe: () => {},\n closed: true,\n };\n }\n\n let closed = false;\n // eslint-disable-next-line @typescript-eslint/no-invalid-void-type -- matches SubscribeFn return type\n let teardown: void | (() => void);\n\n const safeNext = (value: T) => {\n if (closed) {\n return;\n }\n\n try {\n observer.next?.(value);\n } catch (error) {\n safeError(error);\n }\n };\n\n const safeError = (err: unknown) => {\n if (closed) {\n return;\n }\n\n try {\n if (observer.error) {\n observer.error(err);\n } else {\n console.error(\"Unhandled error in RxObservable:\", err);\n }\n } catch {\n // Errors in error handler are caught silently\n }\n };\n\n const safeComplete = () => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n try {\n observer.complete?.();\n } catch {\n // Errors in complete handler are caught silently\n }\n };\n\n const subscription: Subscription = {\n unsubscribe: () => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n if (abortHandler) {\n signal?.removeEventListener(\"abort\", abortHandler);\n }\n\n if (teardown) {\n try {\n teardown();\n } catch {\n // Teardown errors are caught silently\n }\n }\n },\n get closed() {\n return closed;\n },\n };\n\n let abortHandler: (() => void) | undefined;\n\n if (signal) {\n abortHandler = () => {\n subscription.unsubscribe();\n };\n signal.addEventListener(\"abort\", abortHandler);\n }\n\n try {\n teardown = this.#subscribeFn({\n next: safeNext,\n error: safeError,\n complete: safeComplete,\n });\n } catch (error) {\n safeError(error);\n }\n\n return subscription;\n }\n\n pipe(): this;\n pipe<A>(op1: Operator<T, A>): RxObservable<A>;\n pipe<A, B>(op1: Operator<T, A>, op2: Operator<A, B>): RxObservable<B>;\n pipe<A, B, C>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n ): RxObservable<C>;\n pipe<A, B, C, D>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n ): RxObservable<D>;\n pipe<A, B, C, D, E>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n ): RxObservable<E>;\n pipe<A, B, C, D, E, F>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n ): RxObservable<F>;\n pipe<A, B, C, D, E, F, G>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n op7: Operator<F, G>,\n ): RxObservable<G>;\n pipe<A, B, C, D, E, F, G, H>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n op7: Operator<F, G>,\n op8: Operator<G, H>,\n ): RxObservable<H>;\n pipe<A, B, C, D, E, F, G, H, I>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n op7: Operator<F, G>,\n op8: Operator<G, H>,\n op9: Operator<H, I>,\n ): RxObservable<I>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pipe(...operators: Operator<any, any>[]): any {\n if (operators.length === 0) {\n return this;\n }\n\n // eslint-disable-next-line unicorn/no-this-assignment, @typescript-eslint/no-this-alias -- pipe pattern\n let result: RxObservable<unknown> = this;\n\n for (const operator of operators) {\n result = operator(result);\n }\n\n return result;\n }\n\n [Symbol.observable](): this {\n return this;\n }\n\n [\"@@observable\"](): this {\n return this;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n let resolve: (() => void) | null = null;\n let latestValue: T | undefined;\n let hasValue = false;\n let completed = false;\n let error: unknown = null;\n\n const subscription = this.subscribe({\n next: (value) => {\n latestValue = value;\n hasValue = true;\n if (resolve) {\n const r = resolve;\n\n resolve = null;\n r();\n }\n },\n /* v8 ignore start -- v8 coverage can't track branches inside suspended async generators */\n error: (err) => {\n error = err;\n completed = true;\n if (resolve) {\n const r = resolve;\n\n resolve = null;\n r();\n }\n },\n complete: () => {\n completed = true;\n if (resolve) {\n const r = resolve;\n\n resolve = null;\n r();\n }\n },\n /* v8 ignore stop */\n });\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- v8 ignore affects analysis\n while (!completed) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- v8 ignore affects analysis\n if (hasValue) {\n const value = latestValue as T;\n\n hasValue = false;\n yield value;\n } else {\n await new Promise<void>((_resolve) => {\n resolve = _resolve;\n });\n\n if (error !== null) {\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw error;\n }\n }\n }\n } finally {\n subscription.unsubscribe();\n }\n }\n}\n","import { RxObservable } from \"../RxObservable\";\n\nimport type { Observer } from \"../types\";\n\n/**\n * Creates a stateless operator. Wires error/complete/teardown automatically.\n * The `next` callback receives each value and the downstream observer.\n */\nexport function createOperator<T, R>(\n next: (value: T, observer: Observer<R>) => void,\n): (source: RxObservable<T>) => RxObservable<R> {\n return (source: RxObservable<T>) =>\n new RxObservable<R>((observer) => {\n const subscription = source.subscribe({\n next: (value) => {\n next(value, observer);\n },\n error: (error) => observer.error?.(error),\n complete: () => observer.complete?.(),\n });\n\n return () => {\n subscription.unsubscribe();\n };\n });\n}\n\n/**\n * Creates a stateful operator. The subscribeFn sets up its own subscriptions\n * and returns a teardown function.\n */\nexport function createStatefulOperator<T, R>(\n subscribeFn: (source: RxObservable<T>, observer: Observer<R>) => () => void,\n): (source: RxObservable<T>) => RxObservable<R> {\n return (source: RxObservable<T>) =>\n new RxObservable<R>((observer) => subscribeFn(source, observer));\n}\n","import { createOperator } from \"./createOperator\";\n\nimport type { Operator } from \"../types\";\n\nexport function map<T, R>(project: (value: T) => R): Operator<T, R> {\n return createOperator<T, R>((value, observer) => {\n try {\n const result = project(value);\n\n observer.next?.(result);\n } catch (error) {\n observer.error?.(error);\n }\n });\n}\n","import { createOperator } from \"./createOperator\";\n\nimport type { Operator } from \"../types\";\n\nexport function filter<T, S extends T>(\n predicate: (value: T) => value is S,\n): Operator<T, S>;\n\nexport function filter<T>(predicate: (value: T) => boolean): Operator<T, T>;\n\nexport function filter<T>(predicate: (value: T) => boolean): Operator<T, T> {\n return createOperator<T, T>((value, observer) => {\n try {\n if (predicate(value)) {\n observer.next?.(value);\n }\n } catch (error) {\n observer.error?.(error);\n }\n });\n}\n","import { RxObservable } from \"../RxObservable\";\n\nimport type { Operator } from \"../types\";\n\nexport function debounceTime<T>(duration: number): Operator<T, T> {\n if (!Number.isFinite(duration) || duration < 0) {\n throw new RangeError(\n `debounceTime: duration must be a non-negative finite number, got ${duration}`,\n );\n }\n\n return (source: RxObservable<T>) =>\n new RxObservable<T>((observer) => {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let latestValue: T;\n let hasValue = false;\n\n const subscription = source.subscribe({\n next: (value) => {\n latestValue = value;\n hasValue = true;\n\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n /* v8 ignore start -- defensive: timer fired after flush */\n if (hasValue) {\n observer.next?.(latestValue);\n hasValue = false;\n }\n /* v8 ignore stop */\n\n timeoutId = undefined;\n }, duration);\n },\n error: (error) => {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n observer.error?.(error);\n },\n complete: () => {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n if (hasValue) {\n observer.next?.(latestValue);\n hasValue = false;\n }\n\n observer.complete?.();\n },\n });\n\n return () => {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n subscription.unsubscribe();\n };\n });\n}\n","import { createStatefulOperator } from \"./createOperator\";\n\nimport type { Operator } from \"../types\";\n\nexport function distinctUntilChanged<T>(\n comparator?: (a: T, b: T) => boolean,\n): Operator<T, T> {\n return createStatefulOperator<T, T>((source, observer) => {\n let hasLast = false;\n let last: T;\n const compare = comparator ?? ((a: T, b: T) => a === b);\n\n const subscription = source.subscribe({\n next: (value) => {\n if (!hasLast) {\n hasLast = true;\n last = value;\n observer.next?.(value);\n\n return;\n }\n\n try {\n if (!compare(last, value)) {\n last = value;\n observer.next?.(value);\n }\n } catch (error) {\n observer.error?.(error);\n }\n },\n error: (error) => observer.error?.(error),\n complete: () => observer.complete?.(),\n });\n\n return () => {\n subscription.unsubscribe();\n };\n });\n}\n","import { RxObservable } from \"../RxObservable\";\n\nimport type { Operator } from \"../types\";\n\nexport function takeUntil<T>(notifier: RxObservable<unknown>): Operator<T, T> {\n return (source: RxObservable<T>) =>\n new RxObservable<T>((observer) => {\n // eslint-disable-next-line prefer-const -- assigned after usage in complete()\n let sourceSubscription: ReturnType<typeof source.subscribe> | undefined;\n // eslint-disable-next-line prefer-const -- assigned after usage in complete()\n let notifierSubscription:\n | ReturnType<typeof notifier.subscribe>\n | undefined;\n let completed = false;\n\n const complete = () => {\n /* v8 ignore start -- defensive: race condition guard */\n if (completed) {\n return;\n }\n /* v8 ignore stop */\n\n completed = true;\n\n // sourceSubscription may be undefined if notifier emits synchronously\n if (sourceSubscription) {\n sourceSubscription.unsubscribe();\n }\n // notifierSubscription may be undefined if we're inside notifier.subscribe() call\n if (notifierSubscription) {\n notifierSubscription.unsubscribe();\n }\n\n observer.complete?.();\n };\n\n notifierSubscription = notifier.subscribe({\n next: () => {\n complete();\n },\n error: (error) => {\n /* v8 ignore start -- defensive: notifier error after completion */\n if (completed) {\n return;\n }\n /* v8 ignore stop */\n\n completed = true;\n\n // sourceSubscription may be undefined if notifier errors synchronously\n if (sourceSubscription) {\n sourceSubscription.unsubscribe();\n }\n\n observer.error?.(error);\n },\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- defensive\n if (completed) {\n return;\n }\n\n sourceSubscription = source.subscribe({\n next: (value) => {\n /* v8 ignore start -- defensive: emission after completion */\n\n if (!completed) {\n observer.next?.(value);\n }\n /* v8 ignore stop */\n },\n error: (error) => {\n /* v8 ignore start -- defensive: race condition guard */\n if (completed) {\n return;\n }\n /* v8 ignore stop */\n\n completed = true;\n\n // notifierSubscription is always defined here (notifier subscribes before source)\n notifierSubscription.unsubscribe();\n\n observer.error?.(error);\n },\n complete: () => {\n complete();\n },\n });\n\n return () => {\n // Both guaranteed defined: notifier subscribes first (line 37),\n // early return on line 60 if sync complete/error, source subscribes after (line 64)\n sourceSubscription.unsubscribe();\n notifierSubscription.unsubscribe();\n };\n });\n}\n","import { events, getPluginApi } from \"@real-router/core\";\n\nimport { RxObservable } from \"./RxObservable\";\n\nimport type { Router, State, SubscribeState } from \"@real-router/core\";\n\nexport type { SubscribeState } from \"@real-router/core\";\n\nexport function state$(\n router: Router,\n options?: { replay?: boolean },\n): RxObservable<SubscribeState> {\n const { replay = true } = options ?? {};\n\n return new RxObservable<SubscribeState>((observer) => {\n const api = getPluginApi(router);\n const unsubscribe = api.addEventListener(\n events.TRANSITION_SUCCESS,\n (toState: State, fromState: State | undefined) => {\n observer.next?.({ route: toState, previousRoute: fromState });\n },\n );\n\n if (replay) {\n const currentState = router.getState();\n\n if (currentState) {\n queueMicrotask(() => {\n observer.next?.({ route: currentState, previousRoute: undefined });\n });\n }\n }\n\n return unsubscribe;\n });\n}\n","import { events, getPluginApi } from \"@real-router/core\";\n\nimport { RxObservable } from \"./RxObservable\";\n\nimport type {\n Router,\n State,\n NavigationOptions,\n RouterError,\n} from \"@real-router/core\";\n\nexport type RouterEvent =\n | { type: \"ROUTER_START\" }\n | { type: \"ROUTER_STOP\" }\n | { type: \"TRANSITION_START\"; toState: State; fromState: State | undefined }\n | {\n type: \"TRANSITION_SUCCESS\";\n toState: State;\n fromState: State | undefined;\n options: NavigationOptions;\n }\n | {\n type: \"TRANSITION_ERROR\";\n toState: State | undefined;\n fromState: State | undefined;\n error: RouterError;\n }\n | { type: \"TRANSITION_CANCEL\"; toState: State; fromState: State | undefined };\n\nexport function events$(router: Router): RxObservable<RouterEvent> {\n return new RxObservable<RouterEvent>((observer) => {\n const api = getPluginApi(router);\n const unsubscribes: (() => void)[] = [];\n\n /* eslint-disable unicorn/prefer-single-call -- individual pushes for partial registration safety */\n try {\n unsubscribes.push(\n api.addEventListener(events.ROUTER_START, () => {\n observer.next?.({ type: \"ROUTER_START\" });\n }),\n );\n unsubscribes.push(\n api.addEventListener(events.ROUTER_STOP, () => {\n observer.next?.({ type: \"ROUTER_STOP\" });\n }),\n );\n unsubscribes.push(\n api.addEventListener(\n events.TRANSITION_START,\n (toState: State, fromState: State | undefined) => {\n observer.next?.({ type: \"TRANSITION_START\", toState, fromState });\n },\n ),\n );\n unsubscribes.push(\n api.addEventListener(\n events.TRANSITION_SUCCESS,\n (\n toState: State,\n fromState: State | undefined,\n options: NavigationOptions,\n ) => {\n observer.next?.({\n type: \"TRANSITION_SUCCESS\",\n toState,\n fromState,\n options,\n });\n },\n ),\n );\n unsubscribes.push(\n api.addEventListener(\n events.TRANSITION_ERROR,\n (\n toState: State | undefined,\n fromState: State | undefined,\n error: RouterError,\n ) => {\n observer.next?.({\n type: \"TRANSITION_ERROR\",\n toState,\n fromState,\n error,\n });\n },\n ),\n );\n unsubscribes.push(\n api.addEventListener(\n events.TRANSITION_CANCEL,\n (toState: State, fromState: State | undefined) => {\n observer.next?.({ type: \"TRANSITION_CANCEL\", toState, fromState });\n },\n ),\n );\n /* eslint-enable unicorn/prefer-single-call */\n /* v8 ignore start -- defensive: partial listener registration failure */\n } catch (error) {\n // Clean up any listeners that were successfully registered\n for (const unsub of unsubscribes) {\n unsub();\n }\n\n throw error;\n }\n /* v8 ignore stop */\n\n return () => {\n for (const unsub of unsubscribes) {\n unsub();\n }\n };\n });\n}\n","import { state$, type SubscribeState } from \"./state$\";\n\nimport type { RxObservable } from \"./RxObservable\";\nimport type { Router } from \"@real-router/core\";\n\n/**\n * Creates a TC39-compliant Observable from a router instance.\n *\n * This is a semantic wrapper over `state$()` that provides TC39 Observable interop.\n * Use this when you need RxJS compatibility via `from(observable(router))`.\n *\n * @param router - Router instance to observe\n * @returns RxObservable that emits state changes\n *\n * @example\n * ```typescript\n * import { from } from 'rxjs';\n * import { observable } from '@real-router/rx';\n *\n * const router$ = from(observable(router));\n * router$.subscribe(({ route, previousRoute }) => {\n * console.log('Navigation:', previousRoute?.name, '→', route.name);\n * });\n * ```\n */\nexport function observable(router: Router): RxObservable<SubscribeState> {\n return state$(router);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/RxObservable.ts","../../src/operators/createOperator.ts","../../src/operators/map.ts","../../src/operators/filter.ts","../../src/operators/debounceTime.ts","../../src/operators/distinctUntilChanged.ts","../../src/operators/takeUntil.ts","../../src/state$.ts","../../src/events$.ts","../../src/observable.ts"],"names":["getPluginApi","events"],"mappings":"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","file":"index.mjs","sourcesContent":["import type {\n Observer,\n Subscription,\n ObservableOptions,\n SubscribeFn,\n Operator,\n} from \"./types\";\n\ndeclare global {\n interface SymbolConstructor {\n readonly observable: symbol;\n }\n}\n\nexport class RxObservable<T> {\n #subscribeFn: SubscribeFn<T>;\n\n constructor(subscribeFn: SubscribeFn<T>) {\n this.#subscribeFn = subscribeFn;\n }\n\n subscribe(\n observerOrNext: Observer<T> | ((value: T) => void),\n options?: ObservableOptions,\n ): Subscription {\n const observer: Observer<T> =\n typeof observerOrNext === \"function\"\n ? { next: observerOrNext }\n : observerOrNext;\n\n const { signal } = options ?? {};\n\n if (signal?.aborted) {\n return {\n unsubscribe: () => {},\n closed: true,\n };\n }\n\n let closed = false;\n // eslint-disable-next-line @typescript-eslint/no-invalid-void-type -- matches SubscribeFn return type\n let teardown: void | (() => void);\n\n const safeNext = (value: T) => {\n if (closed) {\n return;\n }\n\n try {\n observer.next?.(value);\n } catch (error) {\n safeError(error);\n }\n };\n\n const safeError = (err: unknown) => {\n if (closed) {\n return;\n }\n\n try {\n if (observer.error) {\n observer.error(err);\n } else {\n console.error(\"Unhandled error in RxObservable:\", err);\n }\n } catch {\n // Errors in error handler are caught silently\n }\n };\n\n const safeComplete = () => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n try {\n observer.complete?.();\n } catch {\n // Errors in complete handler are caught silently\n }\n };\n\n const subscription: Subscription = {\n unsubscribe: () => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n if (abortHandler) {\n signal?.removeEventListener(\"abort\", abortHandler);\n }\n\n if (teardown) {\n try {\n teardown();\n } catch {\n // Teardown errors are caught silently\n }\n }\n },\n get closed() {\n return closed;\n },\n };\n\n let abortHandler: (() => void) | undefined;\n\n if (signal) {\n abortHandler = () => {\n subscription.unsubscribe();\n };\n signal.addEventListener(\"abort\", abortHandler);\n }\n\n try {\n teardown = this.#subscribeFn({\n next: safeNext,\n error: safeError,\n complete: safeComplete,\n });\n } catch (error) {\n safeError(error);\n }\n\n return subscription;\n }\n\n pipe(): this;\n pipe<A>(op1: Operator<T, A>): RxObservable<A>;\n pipe<A, B>(op1: Operator<T, A>, op2: Operator<A, B>): RxObservable<B>;\n pipe<A, B, C>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n ): RxObservable<C>;\n pipe<A, B, C, D>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n ): RxObservable<D>;\n pipe<A, B, C, D, E>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n ): RxObservable<E>;\n pipe<A, B, C, D, E, F>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n ): RxObservable<F>;\n pipe<A, B, C, D, E, F, G>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n op7: Operator<F, G>,\n ): RxObservable<G>;\n pipe<A, B, C, D, E, F, G, H>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n op7: Operator<F, G>,\n op8: Operator<G, H>,\n ): RxObservable<H>;\n pipe<A, B, C, D, E, F, G, H, I>(\n op1: Operator<T, A>,\n op2: Operator<A, B>,\n op3: Operator<B, C>,\n op4: Operator<C, D>,\n op5: Operator<D, E>,\n op6: Operator<E, F>,\n op7: Operator<F, G>,\n op8: Operator<G, H>,\n op9: Operator<H, I>,\n ): RxObservable<I>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pipe(...operators: Operator<any, any>[]): any {\n if (operators.length === 0) {\n return this;\n }\n\n // eslint-disable-next-line unicorn/no-this-assignment, @typescript-eslint/no-this-alias -- pipe pattern\n let result: RxObservable<unknown> = this;\n\n for (const operator of operators) {\n result = operator(result);\n }\n\n return result;\n }\n\n [Symbol.observable](): this {\n return this;\n }\n\n [\"@@observable\"](): this {\n return this;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterableIterator<T> {\n let resolve: (() => void) | null = null;\n let latestValue: T | undefined;\n let hasValue = false;\n let completed = false;\n let error: unknown = null;\n\n const subscription = this.subscribe({\n next: (value) => {\n latestValue = value;\n hasValue = true;\n if (resolve) {\n const r = resolve;\n\n resolve = null;\n r();\n }\n },\n /* v8 ignore start -- v8 coverage can't track branches inside suspended async generators */\n error: (err) => {\n error = err;\n completed = true;\n if (resolve) {\n const r = resolve;\n\n resolve = null;\n r();\n }\n },\n complete: () => {\n completed = true;\n if (resolve) {\n const r = resolve;\n\n resolve = null;\n r();\n }\n },\n /* v8 ignore stop */\n });\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- v8 ignore affects analysis\n while (!completed) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- v8 ignore affects analysis\n if (hasValue) {\n const value = latestValue as T;\n\n hasValue = false;\n yield value;\n } else {\n await new Promise<void>((_resolve) => {\n resolve = _resolve;\n });\n\n if (error !== null) {\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw error;\n }\n }\n }\n } finally {\n subscription.unsubscribe();\n }\n }\n}\n","import { RxObservable } from \"../RxObservable\";\n\nimport type { Observer } from \"../types\";\n\n/**\n * Creates a stateless operator. Wires error/complete/teardown automatically.\n * The `next` callback receives each value and the downstream observer.\n */\nexport function createOperator<T, R>(\n next: (value: T, observer: Observer<R>) => void,\n): (source: RxObservable<T>) => RxObservable<R> {\n return (source: RxObservable<T>) =>\n new RxObservable<R>((observer) => {\n const subscription = source.subscribe({\n next: (value) => {\n next(value, observer);\n },\n error: (error) => observer.error?.(error),\n complete: () => observer.complete?.(),\n });\n\n return () => {\n subscription.unsubscribe();\n };\n });\n}\n\n/**\n * Creates a stateful operator. The subscribeFn sets up its own subscriptions\n * and returns a teardown function.\n */\nexport function createStatefulOperator<T, R>(\n subscribeFn: (source: RxObservable<T>, observer: Observer<R>) => () => void,\n): (source: RxObservable<T>) => RxObservable<R> {\n return (source: RxObservable<T>) =>\n new RxObservable<R>((observer) => subscribeFn(source, observer));\n}\n","import { createOperator } from \"./createOperator\";\n\nimport type { Operator } from \"../types\";\n\nexport function map<T, R>(project: (value: T) => R): Operator<T, R> {\n return createOperator<T, R>((value, observer) => {\n try {\n const result = project(value);\n\n observer.next?.(result);\n } catch (error) {\n observer.error?.(error);\n }\n });\n}\n","import { createOperator } from \"./createOperator\";\n\nimport type { Operator } from \"../types\";\n\nexport function filter<T, S extends T>(\n predicate: (value: T) => value is S,\n): Operator<T, S>;\n\nexport function filter<T>(predicate: (value: T) => boolean): Operator<T, T>;\n\nexport function filter<T>(predicate: (value: T) => boolean): Operator<T, T> {\n return createOperator<T, T>((value, observer) => {\n try {\n if (predicate(value)) {\n observer.next?.(value);\n }\n } catch (error) {\n observer.error?.(error);\n }\n });\n}\n","import { RxObservable } from \"../RxObservable\";\n\nimport type { Operator } from \"../types\";\n\nexport function debounceTime<T>(duration: number): Operator<T, T> {\n if (!Number.isFinite(duration) || duration < 0) {\n throw new RangeError(\n `debounceTime: duration must be a non-negative finite number, got ${duration}`,\n );\n }\n\n return (source: RxObservable<T>) =>\n new RxObservable<T>((observer) => {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let latestValue: T;\n let hasValue = false;\n\n const subscription = source.subscribe({\n next: (value) => {\n latestValue = value;\n hasValue = true;\n\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n /* v8 ignore start -- defensive: timer fired after flush */\n if (hasValue) {\n observer.next?.(latestValue);\n hasValue = false;\n }\n /* v8 ignore stop */\n\n timeoutId = undefined;\n }, duration);\n },\n error: (error) => {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n observer.error?.(error);\n },\n complete: () => {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n if (hasValue) {\n observer.next?.(latestValue);\n hasValue = false;\n }\n\n observer.complete?.();\n },\n });\n\n return () => {\n if (timeoutId !== undefined) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n subscription.unsubscribe();\n };\n });\n}\n","import { createStatefulOperator } from \"./createOperator\";\n\nimport type { Operator } from \"../types\";\n\nexport function distinctUntilChanged<T>(\n comparator?: (a: T, b: T) => boolean,\n): Operator<T, T> {\n return createStatefulOperator<T, T>((source, observer) => {\n let hasLast = false;\n let last: T;\n const compare = comparator ?? ((a: T, b: T) => a === b);\n\n const subscription = source.subscribe({\n next: (value) => {\n if (!hasLast) {\n hasLast = true;\n last = value;\n observer.next?.(value);\n\n return;\n }\n\n try {\n if (!compare(last, value)) {\n last = value;\n observer.next?.(value);\n }\n } catch (error) {\n observer.error?.(error);\n }\n },\n error: (error) => observer.error?.(error),\n complete: () => observer.complete?.(),\n });\n\n return () => {\n subscription.unsubscribe();\n };\n });\n}\n","import { RxObservable } from \"../RxObservable\";\n\nimport type { Operator } from \"../types\";\n\nexport function takeUntil<T>(notifier: RxObservable<unknown>): Operator<T, T> {\n return (source: RxObservable<T>) =>\n new RxObservable<T>((observer) => {\n // eslint-disable-next-line prefer-const -- assigned after usage in complete()\n let sourceSubscription: ReturnType<typeof source.subscribe> | undefined;\n // eslint-disable-next-line prefer-const -- assigned after usage in complete()\n let notifierSubscription:\n | ReturnType<typeof notifier.subscribe>\n | undefined;\n let completed = false;\n\n const complete = () => {\n /* v8 ignore start -- defensive: race condition guard */\n if (completed) {\n return;\n }\n /* v8 ignore stop */\n\n completed = true;\n\n // sourceSubscription may be undefined if notifier emits synchronously\n if (sourceSubscription) {\n sourceSubscription.unsubscribe();\n }\n // notifierSubscription may be undefined if we're inside notifier.subscribe() call\n if (notifierSubscription) {\n notifierSubscription.unsubscribe();\n }\n\n observer.complete?.();\n };\n\n notifierSubscription = notifier.subscribe({\n next: () => {\n complete();\n },\n error: (error) => {\n /* v8 ignore start -- defensive: notifier error after completion */\n if (completed) {\n return;\n }\n /* v8 ignore stop */\n\n completed = true;\n\n // sourceSubscription may be undefined if notifier errors synchronously\n if (sourceSubscription) {\n sourceSubscription.unsubscribe();\n }\n\n observer.error?.(error);\n },\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- defensive\n if (completed) {\n return;\n }\n\n sourceSubscription = source.subscribe({\n next: (value) => {\n /* v8 ignore start -- defensive: emission after completion */\n\n if (!completed) {\n observer.next?.(value);\n }\n /* v8 ignore stop */\n },\n error: (error) => {\n /* v8 ignore start -- defensive: race condition guard */\n if (completed) {\n return;\n }\n /* v8 ignore stop */\n\n completed = true;\n\n // notifierSubscription is always defined here (notifier subscribes before source)\n notifierSubscription.unsubscribe();\n\n observer.error?.(error);\n },\n complete: () => {\n complete();\n },\n });\n\n return () => {\n // Both guaranteed defined: notifier subscribes first (line 37),\n // early return on line 60 if sync complete/error, source subscribes after (line 64)\n sourceSubscription.unsubscribe();\n notifierSubscription.unsubscribe();\n };\n });\n}\n","import { events } from \"@real-router/core\";\nimport { getPluginApi } from \"@real-router/core/api\";\n\nimport { RxObservable } from \"./RxObservable\";\n\nimport type { Router, State, SubscribeState } from \"@real-router/core\";\n\nexport type { SubscribeState } from \"@real-router/core\";\n\nexport function state$(\n router: Router,\n options?: { replay?: boolean },\n): RxObservable<SubscribeState> {\n const { replay = true } = options ?? {};\n\n return new RxObservable<SubscribeState>((observer) => {\n const api = getPluginApi(router);\n const unsubscribe = api.addEventListener(\n events.TRANSITION_SUCCESS,\n (toState: State, fromState: State | undefined) => {\n observer.next?.({ route: toState, previousRoute: fromState });\n },\n );\n\n if (replay) {\n const currentState = router.getState();\n\n if (currentState) {\n queueMicrotask(() => {\n observer.next?.({ route: currentState, previousRoute: undefined });\n });\n }\n }\n\n return unsubscribe;\n });\n}\n","import { events } from \"@real-router/core\";\nimport { getPluginApi } from \"@real-router/core/api\";\n\nimport { RxObservable } from \"./RxObservable\";\n\nimport type {\n Router,\n State,\n NavigationOptions,\n RouterError,\n} from \"@real-router/core\";\n\nexport type RouterEvent =\n | { type: \"ROUTER_START\" }\n | { type: \"ROUTER_STOP\" }\n | { type: \"TRANSITION_START\"; toState: State; fromState: State | undefined }\n | {\n type: \"TRANSITION_SUCCESS\";\n toState: State;\n fromState: State | undefined;\n options: NavigationOptions;\n }\n | {\n type: \"TRANSITION_ERROR\";\n toState: State | undefined;\n fromState: State | undefined;\n error: RouterError;\n }\n | { type: \"TRANSITION_CANCEL\"; toState: State; fromState: State | undefined };\n\nexport function events$(router: Router): RxObservable<RouterEvent> {\n return new RxObservable<RouterEvent>((observer) => {\n const api = getPluginApi(router);\n const unsubscribes: (() => void)[] = [];\n\n /* eslint-disable unicorn/prefer-single-call -- individual pushes for partial registration safety */\n try {\n unsubscribes.push(\n api.addEventListener(events.ROUTER_START, () => {\n observer.next?.({ type: \"ROUTER_START\" });\n }),\n );\n unsubscribes.push(\n api.addEventListener(events.ROUTER_STOP, () => {\n observer.next?.({ type: \"ROUTER_STOP\" });\n }),\n );\n unsubscribes.push(\n api.addEventListener(\n events.TRANSITION_START,\n (toState: State, fromState: State | undefined) => {\n observer.next?.({ type: \"TRANSITION_START\", toState, fromState });\n },\n ),\n );\n unsubscribes.push(\n api.addEventListener(\n events.TRANSITION_SUCCESS,\n (\n toState: State,\n fromState: State | undefined,\n options: NavigationOptions,\n ) => {\n observer.next?.({\n type: \"TRANSITION_SUCCESS\",\n toState,\n fromState,\n options,\n });\n },\n ),\n );\n unsubscribes.push(\n api.addEventListener(\n events.TRANSITION_ERROR,\n (\n toState: State | undefined,\n fromState: State | undefined,\n error: RouterError,\n ) => {\n observer.next?.({\n type: \"TRANSITION_ERROR\",\n toState,\n fromState,\n error,\n });\n },\n ),\n );\n unsubscribes.push(\n api.addEventListener(\n events.TRANSITION_CANCEL,\n (toState: State, fromState: State | undefined) => {\n observer.next?.({ type: \"TRANSITION_CANCEL\", toState, fromState });\n },\n ),\n );\n /* eslint-enable unicorn/prefer-single-call */\n /* v8 ignore start -- defensive: partial listener registration failure */\n } catch (error) {\n // Clean up any listeners that were successfully registered\n for (const unsub of unsubscribes) {\n unsub();\n }\n\n throw error;\n }\n /* v8 ignore stop */\n\n return () => {\n for (const unsub of unsubscribes) {\n unsub();\n }\n };\n });\n}\n","import { state$, type SubscribeState } from \"./state$\";\n\nimport type { RxObservable } from \"./RxObservable\";\nimport type { Router } from \"@real-router/core\";\n\n/**\n * Creates a TC39-compliant Observable from a router instance.\n *\n * This is a semantic wrapper over `state$()` that provides TC39 Observable interop.\n * Use this when you need RxJS compatibility via `from(observable(router))`.\n *\n * @param router - Router instance to observe\n * @returns RxObservable that emits state changes\n *\n * @example\n * ```typescript\n * import { from } from 'rxjs';\n * import { observable } from '@real-router/rx';\n *\n * const router$ = from(observable(router));\n * router$.subscribe(({ route, previousRoute }) => {\n * console.log('Navigation:', previousRoute?.name, '→', route.name);\n * });\n * ```\n */\nexport function observable(router: Router): RxObservable<SubscribeState> {\n return state$(router);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"src/RxObservable.ts":{"bytes":6310,"imports":[],"format":"esm"},"src/operators/createOperator.ts":{"bytes":1177,"imports":[{"path":"src/RxObservable.ts","kind":"import-statement","original":"../RxObservable"}],"format":"esm"},"src/operators/map.ts":{"bytes":364,"imports":[{"path":"src/operators/createOperator.ts","kind":"import-statement","original":"./createOperator"}],"format":"esm"},"src/operators/filter.ts":{"bytes":550,"imports":[{"path":"src/operators/createOperator.ts","kind":"import-statement","original":"./createOperator"}],"format":"esm"},"src/operators/debounceTime.ts":{"bytes":1803,"imports":[{"path":"src/RxObservable.ts","kind":"import-statement","original":"../RxObservable"}],"format":"esm"},"src/operators/distinctUntilChanged.ts":{"bytes":955,"imports":[{"path":"src/operators/createOperator.ts","kind":"import-statement","original":"./createOperator"}],"format":"esm"},"src/operators/takeUntil.ts":{"bytes":2959,"imports":[{"path":"src/RxObservable.ts","kind":"import-statement","original":"../RxObservable"}],"format":"esm"},"src/operators/index.ts":{"bytes":219,"imports":[{"path":"src/operators/map.ts","kind":"import-statement","original":"./map"},{"path":"src/operators/filter.ts","kind":"import-statement","original":"./filter"},{"path":"src/operators/debounceTime.ts","kind":"import-statement","original":"./debounceTime"},{"path":"src/operators/distinctUntilChanged.ts","kind":"import-statement","original":"./distinctUntilChanged"},{"path":"src/operators/takeUntil.ts","kind":"import-statement","original":"./takeUntil"}],"format":"esm"},"src/state$.ts":{"bytes":
|
|
1
|
+
{"inputs":{"src/RxObservable.ts":{"bytes":6310,"imports":[],"format":"esm"},"src/operators/createOperator.ts":{"bytes":1177,"imports":[{"path":"src/RxObservable.ts","kind":"import-statement","original":"../RxObservable"}],"format":"esm"},"src/operators/map.ts":{"bytes":364,"imports":[{"path":"src/operators/createOperator.ts","kind":"import-statement","original":"./createOperator"}],"format":"esm"},"src/operators/filter.ts":{"bytes":550,"imports":[{"path":"src/operators/createOperator.ts","kind":"import-statement","original":"./createOperator"}],"format":"esm"},"src/operators/debounceTime.ts":{"bytes":1803,"imports":[{"path":"src/RxObservable.ts","kind":"import-statement","original":"../RxObservable"}],"format":"esm"},"src/operators/distinctUntilChanged.ts":{"bytes":955,"imports":[{"path":"src/operators/createOperator.ts","kind":"import-statement","original":"./createOperator"}],"format":"esm"},"src/operators/takeUntil.ts":{"bytes":2959,"imports":[{"path":"src/RxObservable.ts","kind":"import-statement","original":"../RxObservable"}],"format":"esm"},"src/operators/index.ts":{"bytes":219,"imports":[{"path":"src/operators/map.ts","kind":"import-statement","original":"./map"},{"path":"src/operators/filter.ts","kind":"import-statement","original":"./filter"},{"path":"src/operators/debounceTime.ts","kind":"import-statement","original":"./debounceTime"},{"path":"src/operators/distinctUntilChanged.ts","kind":"import-statement","original":"./distinctUntilChanged"},{"path":"src/operators/takeUntil.ts","kind":"import-statement","original":"./takeUntil"}],"format":"esm"},"src/state$.ts":{"bytes":1012,"imports":[{"path":"@real-router/core","kind":"import-statement","external":true},{"path":"@real-router/core/api","kind":"import-statement","external":true},{"path":"src/RxObservable.ts","kind":"import-statement","original":"./RxObservable"}],"format":"esm"},"src/events$.ts":{"bytes":3217,"imports":[{"path":"@real-router/core","kind":"import-statement","external":true},{"path":"@real-router/core/api","kind":"import-statement","external":true},{"path":"src/RxObservable.ts","kind":"import-statement","original":"./RxObservable"}],"format":"esm"},"src/observable.ts":{"bytes":897,"imports":[{"path":"src/state$.ts","kind":"import-statement","original":"./state$"}],"format":"esm"},"src/index.ts":{"bytes":489,"imports":[{"path":"src/RxObservable.ts","kind":"import-statement","original":"./RxObservable"},{"path":"src/operators/index.ts","kind":"import-statement","original":"./operators"},{"path":"src/state$.ts","kind":"import-statement","original":"./state$"},{"path":"src/events$.ts","kind":"import-statement","original":"./events$"},{"path":"src/observable.ts","kind":"import-statement","original":"./observable"}],"format":"esm"}},"outputs":{"dist/esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":27767},"dist/esm/index.mjs":{"imports":[{"path":"@real-router/core","kind":"import-statement","external":true},{"path":"@real-router/core/api","kind":"import-statement","external":true},{"path":"@real-router/core","kind":"import-statement","external":true},{"path":"@real-router/core/api","kind":"import-statement","external":true}],"exports":["RxObservable","debounceTime","distinctUntilChanged","events$","filter","map","observable","state$","takeUntil"],"entryPoint":"src/index.ts","inputs":{"src/RxObservable.ts":{"bytesInOutput":3515},"src/index.ts":{"bytesInOutput":0},"src/operators/createOperator.ts":{"bytesInOutput":497},"src/operators/map.ts":{"bytesInOutput":216},"src/operators/index.ts":{"bytesInOutput":0},"src/operators/filter.ts":{"bytesInOutput":223},"src/operators/debounceTime.ts":{"bytesInOutput":1376},"src/operators/distinctUntilChanged.ts":{"bytesInOutput":775},"src/operators/takeUntil.ts":{"bytesInOutput":1369},"src/state$.ts":{"bytesInOutput":707},"src/events$.ts":{"bytesInOutput":1922},"src/observable.ts":{"bytesInOutput":57}},"bytes":11067}}}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@real-router/rx",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.29",
|
|
4
4
|
"type": "commonjs",
|
|
5
5
|
"description": "Reactive Observable API for Real-Router — state$, events$, operators, and TC39 Observable support",
|
|
6
6
|
"main": "./dist/cjs/index.js",
|
|
@@ -44,10 +44,12 @@
|
|
|
44
44
|
"homepage": "https://github.com/greydragon888/real-router",
|
|
45
45
|
"sideEffects": false,
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@real-router/core": "^0.
|
|
47
|
+
"@real-router/core": "^0.37.0"
|
|
48
48
|
},
|
|
49
49
|
"scripts": {
|
|
50
50
|
"test": "vitest",
|
|
51
|
+
"test:stress": "vitest run --config vitest.config.stress.mts",
|
|
52
|
+
"test:properties": "vitest run --config vitest.config.properties.mts",
|
|
51
53
|
"build": "tsup",
|
|
52
54
|
"type-check": "tsc --noEmit",
|
|
53
55
|
"lint": "eslint --cache --ext .ts src/ tests/ --fix --max-warnings 0",
|
package/src/events$.ts
CHANGED
package/src/state$.ts
CHANGED