@real-router/rx 0.3.11 → 0.3.13
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 +4 -2
- package/dist/cjs/index.d.ts +13 -5
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.d.mts +13 -5
- package/dist/esm/index.d.mts.map +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/index.mjs.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -37,7 +37,7 @@ state$(router)
|
|
|
37
37
|
|---------|---------|-------------|
|
|
38
38
|
| `state$(router, options?)` | `RxObservable<{ route, previousRoute }>` | Router state changes |
|
|
39
39
|
| `events$(router)` | `RxObservable<RouterEvent>` | All router events (start, stop, transition, error, cancel) |
|
|
40
|
-
| `observable(router)` | `RxObservable<SubscribeState>` | TC39 Observable
|
|
40
|
+
| `observable(router)` | `RxObservable<SubscribeState>` | TC39-style Observable wrapper for RxJS interop |
|
|
41
41
|
|
|
42
42
|
`state$` accepts `{ signal: AbortSignal }` for automatic unsubscription.
|
|
43
43
|
|
|
@@ -76,7 +76,7 @@ events$(router)
|
|
|
76
76
|
|
|
77
77
|
## RxJS Interop
|
|
78
78
|
|
|
79
|
-
`observable()` returns a TC39-
|
|
79
|
+
`observable()` returns a **TC39-style** Observable (implements `Symbol.observable`) — pass it to RxJS `from()`:
|
|
80
80
|
|
|
81
81
|
```typescript
|
|
82
82
|
import { from } from "rxjs";
|
|
@@ -90,6 +90,8 @@ from(observable(router))
|
|
|
90
90
|
});
|
|
91
91
|
```
|
|
92
92
|
|
|
93
|
+
> **Divergence from TC39 / RxJS — `error` is non-terminal.** Unlike the TC39 proposal and RxJS (where `error` is a terminal event that triggers cleanup), this library keeps the subscription open after `error()`: values keep flowing, multiple errors are each forwarded, and `closed` stays `false`. Only `complete()` and `unsubscribe()` are terminal. This is intentional — `state$`/`events$` are infinite router streams, so a single throwing subscriber must not permanently kill the stream. Don't rely on `error` completing the RxJS chain.
|
|
94
|
+
|
|
93
95
|
## Documentation
|
|
94
96
|
|
|
95
97
|
Full documentation: [Wiki — rx](https://github.com/greydragon888/real-router/wiki/rx-package)
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -36,8 +36,10 @@ declare class RxObservable<T> {
|
|
|
36
36
|
pipe<A, B, C, D, E>(op1: Operator<T, A>, op2: Operator<A, B>, op3: Operator<B, C>, op4: Operator<C, D>, op5: Operator<D, E>): RxObservable<E>;
|
|
37
37
|
pipe<A, B, C, D, E, F>(op1: Operator<T, A>, op2: Operator<A, B>, op3: Operator<B, C>, op4: Operator<C, D>, op5: Operator<D, E>, op6: Operator<E, F>): RxObservable<F>;
|
|
38
38
|
pipe<A, B, C, D, E, F, G>(op1: Operator<T, A>, op2: Operator<A, B>, op3: Operator<B, C>, op4: Operator<C, D>, op5: Operator<D, E>, op6: Operator<E, F>, op7: Operator<F, G>): RxObservable<G>;
|
|
39
|
-
pipe<A, B, C, D, E, F, G, H>(
|
|
40
|
-
|
|
39
|
+
pipe<A, B, C, D, E, F, G, H>(// NOSONAR -- typed pipe overload (RxJS shape, 1-9 operators); param count is the public API, not refactorable
|
|
40
|
+
op1: Operator<T, A>, op2: Operator<A, B>, op3: Operator<B, C>, op4: Operator<C, D>, op5: Operator<D, E>, op6: Operator<E, F>, op7: Operator<F, G>, op8: Operator<G, H>): RxObservable<H>;
|
|
41
|
+
pipe<A, B, C, D, E, F, G, H, I>(// NOSONAR -- typed pipe overload (RxJS shape, 1-9 operators); param count is the public API, not refactorable
|
|
42
|
+
op1: Operator<T, A>, op2: Operator<A, B>, op3: Operator<B, C>, op4: Operator<C, D>, op5: Operator<D, E>, op6: Operator<E, F>, op7: Operator<F, G>, op8: Operator<G, H>, op9: Operator<H, I>): RxObservable<I>;
|
|
41
43
|
[Symbol.observable](): this;
|
|
42
44
|
["@@observable"](): this;
|
|
43
45
|
[Symbol.asyncIterator](): AsyncIterableIterator<T>;
|
|
@@ -96,10 +98,16 @@ declare function events$(router: Router): RxObservable<RouterEvent>;
|
|
|
96
98
|
//#endregion
|
|
97
99
|
//#region src/observable.d.ts
|
|
98
100
|
/**
|
|
99
|
-
* Creates a TC39-
|
|
101
|
+
* Creates a TC39-style Observable from a router instance.
|
|
100
102
|
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
+
* Semantic wrapper over `state$()` that exposes `Symbol.observable` for RxJS
|
|
104
|
+
* interop via `from(observable(router))`.
|
|
105
|
+
*
|
|
106
|
+
* @remarks
|
|
107
|
+
* "TC39-style", not strictly compliant: `error` is **non-terminal** — the
|
|
108
|
+
* subscription stays open after `error()`, and only `complete()` /
|
|
109
|
+
* `unsubscribe()` are terminal, so an infinite router stream survives a
|
|
110
|
+
* throwing subscriber. Do not rely on `error` completing the RxJS chain (#775).
|
|
103
111
|
*
|
|
104
112
|
* @param router - Router instance to observe
|
|
105
113
|
* @returns RxObservable that emits state changes
|
package/dist/cjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/types.ts","../../src/RxObservable.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"],"mappings":";;;UAKiB,QAAA;EACf,IAAA,IAAQ,KAAA,EAAO,CAAC;EAChB,KAAA,IAAS,GAAA;EACT,QAAA;AAAA;AAAA,UAGe,YAAA;EACf,WAAA;EAAA,SACS,MAAM;AAAA;AAAA,UAGA,iBAAA;EACf,MAAA,GAAS,WAAW;EACpB,MAAA;AAAA;AAAA,KAIU,WAAA,OAAkB,QAAA,EAAU,QAAQ,CAAC,CAAA;AAAA,KAErC,QAAA,UAAkB,MAAA,EAAQ,YAAA,CAAa,CAAA,MAAO,YAAA,CAAa,CAAA;AAAA,KAE3D,aAAA,UAAuB,MAAA,EAAQ,CAAA,KAAM,CAAC;;;QClB1C,MAAA;EAAA,UACI,iBAAA;IAAA,SACC,UAAA;EAAA;AAAA;AAAA,cAIA,YAAA;EAAA;cAGC,WAAA,EAAa,WAAA,CAAY,CAAA;EAIrC,SAAA,CACE,cAAA,EAAgB,QAAA,CAAS,CAAA,MAAO,KAAA,EAAO,CAAA,YACvC,OAAA,GAAU,iBAAA,GACT,YAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../../src/types.ts","../../src/RxObservable.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"],"mappings":"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"}
|
package/dist/cjs/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@real-router/core"),t=require("@real-router/core/api");var n=class{#e;constructor(e){this.#e=e}subscribe(e,t){let n=typeof e==`function`?{next:e}:e,{signal:r}=t??{};if(r?.aborted)return{unsubscribe:()=>{},closed:!0};let i=!1,a,o=e=>{if(!i)try{n.next?.(e)}catch(e){
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@real-router/core"),t=require("@real-router/core/api");var n=class{#e;constructor(e){this.#e=e}subscribe(e,t){let n=typeof e==`function`?{next:e}:e,{signal:r}=t??{};if(r?.aborted)return{unsubscribe:()=>{},closed:!0};let i=!1,a,o=()=>{if(d&&r?.removeEventListener(`abort`,d),a)try{a()}catch{}},s=e=>{if(!i)try{n.next?.(e)}catch(e){c(e)}},c=e=>{if(!i)try{n.error?n.error(e):console.error(`Unhandled error in RxObservable:`,e)}catch{}},l=()=>{if(!i){i=!0;try{n.complete?.()}catch{}o()}},u={unsubscribe:()=>{i||(i=!0,o())},get closed(){return i}},d;r&&(d=()=>{u.unsubscribe()},r.addEventListener(`abort`,d));try{a=this.#e({next:s,error:c,complete:l})}catch(e){c(e)}return u.closed&&o(),u}pipe(...e){if(e.length===0)return this;let t=this;for(let n of e)t=n(t);return t}[Symbol.observable](){return this}"@@observable"(){return this}async*[Symbol.asyncIterator](){let e=null,t,n=!1,r=!1,i=null,a=this.subscribe({next:r=>{if(t=r,n=!0,e){let t=e;e=null,t()}},error:t=>{if(i=t,r=!0,e){let t=e;e=null,t()}},complete:()=>{if(r=!0,e){let t=e;e=null,t()}}});try{for(;;){if(n){let e=t;n=!1,yield e;continue}if(r){if(i!==null)throw i;break}await new Promise(t=>{e=t})}}finally{a.unsubscribe()}}};function r(e){return t=>new n(n=>{let r=t.subscribe({next:t=>{e(t,n)},error:e=>n.error?.(e),complete:()=>n.complete?.()});return()=>{r.unsubscribe()}})}function i(e){return t=>new n(n=>e(t,n))}function a(e){return r((t,n)=>{try{let r=e(t);n.next?.(r)}catch(e){n.error?.(e)}})}function o(e){return r((t,n)=>{try{e(t)&&n.next?.(t)}catch(e){n.error?.(e)}})}function s(e){if(!Number.isFinite(e)||e<0)throw RangeError(`debounceTime: duration must be a non-negative finite number, got ${e}`);return t=>new n(n=>{let r,i,a=!1,o=t.subscribe({next:t=>{i=t,a=!0,r!==void 0&&clearTimeout(r),r=setTimeout(()=>{a&&=(n.next?.(i),!1),r=void 0},e)},error:e=>{r!==void 0&&(clearTimeout(r),r=void 0),n.error?.(e)},complete:()=>{r!==void 0&&(clearTimeout(r),r=void 0),a&&=(n.next?.(i),!1),n.complete?.()}});return()=>{r!==void 0&&(clearTimeout(r),r=void 0),o.unsubscribe()}})}function c(e){return i((t,n)=>{let r=!1,i,a=e??((e,t)=>e===t),o=t.subscribe({next:e=>{if(!r){r=!0,i=e,n.next?.(e);return}try{a(i,e)||(i=e,n.next?.(e))}catch(e){n.error?.(e)}},error:e=>n.error?.(e),complete:()=>n.complete?.()});return()=>{o.unsubscribe()}})}function l(e){return t=>new n(n=>{let r,i,a=!1,o=()=>{a||(a=!0,r&&r.unsubscribe(),i&&i.unsubscribe(),n.complete?.())};if(i=e.subscribe({next:()=>{o()},error:e=>{a||(a=!0,r&&r.unsubscribe(),i&&i.unsubscribe(),n.error?.(e))}}),a){i.unsubscribe();return}return r=t.subscribe({next:e=>{a||n.next?.(e)},error:e=>{a||(a=!0,i.unsubscribe(),n.error?.(e))},complete:()=>{o()}}),()=>{r.unsubscribe(),i.unsubscribe()}})}function u(r,i){let{replay:a=!0}=i??{};return new n(n=>{let i=(0,t.getPluginApi)(r),o=!1,s=i.addEventListener(e.events.TRANSITION_SUCCESS,(e,t)=>{o=!0,n.next?.({route:e,previousRoute:t})});if(a){let e=r.getState();e&&queueMicrotask(()=>{o||n.next?.({route:e,previousRoute:void 0})})}return s})}function d(r){return new n(n=>{let i=(0,t.getPluginApi)(r),a=[];try{a.push(i.addEventListener(e.events.ROUTER_START,()=>{n.next?.({type:`ROUTER_START`})})),a.push(i.addEventListener(e.events.ROUTER_STOP,()=>{n.next?.({type:`ROUTER_STOP`})})),a.push(i.addEventListener(e.events.TRANSITION_START,(e,t)=>{n.next?.({type:`TRANSITION_START`,toState:e,fromState:t})})),a.push(i.addEventListener(e.events.TRANSITION_LEAVE_APPROVE,(e,t)=>{n.next?.({type:`TRANSITION_LEAVE_APPROVE`,toState:e,fromState:t})})),a.push(i.addEventListener(e.events.TRANSITION_SUCCESS,(e,t,r)=>{n.next?.({type:`TRANSITION_SUCCESS`,toState:e,fromState:t,options:r})})),a.push(i.addEventListener(e.events.TRANSITION_ERROR,(e,t,r)=>{n.next?.({type:`TRANSITION_ERROR`,toState:e,fromState:t,error:r})})),a.push(i.addEventListener(e.events.TRANSITION_CANCEL,(e,t)=>{n.next?.({type:`TRANSITION_CANCEL`,toState:e,fromState:t})}))}catch(e){for(let e of a)e();throw e}return()=>{for(let e of a)e()}})}function f(e){return u(e)}exports.RxObservable=n,exports.debounceTime=s,exports.distinctUntilChanged=c,exports.events$=d,exports.filter=o,exports.map=a,exports.observable=f,exports.state$=u,exports.takeUntil=l;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["#subscribeFn","events","events"],"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"],"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 resolveCallback = resolve;\n\n resolve = null;\n resolveCallback();\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 resolveCallback = resolve;\n\n resolve = null;\n resolveCallback();\n }\n },\n complete: () => {\n completed = true;\n if (resolve) {\n const resolveCallback = resolve;\n\n resolve = null;\n resolveCallback();\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 ?? ((prev: T, curr: T) => prev === curr);\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_LEAVE_APPROVE\";\n toState: State;\n fromState: State | undefined;\n }\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_LEAVE_APPROVE,\n (toState: State, fromState: State | undefined) => {\n observer.next?.({\n type: \"TRANSITION_LEAVE_APPROVE\",\n toState,\n fromState,\n });\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["#subscribeFn","events","events"],"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"],"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 readonly #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 // Release the subscription's resources (abort listener + teardown). Runs on\n // every terminal path — unsubscribe AND complete — so a self-completing\n // source still releases its resource. `teardown` is undefined until\n // subscribeFn returns, so a synchronous complete() fires finalize() before\n // teardown exists; the post-subscribe `if (closed) finalize()` re-runs it\n // once teardown is assigned. teardown therefore executes at most once, and\n // removeEventListener is idempotent, so the double call is harmless.\n const finalize = () => {\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\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 finalize();\n };\n\n const subscription: Subscription = {\n unsubscribe: () => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n finalize();\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 // A synchronous complete() inside subscribeFn ran finalize() before\n // `teardown` was assigned above — run it now that the teardown exists. Read\n // via the getter: TS control-flow analysis can't see the closure mutation of\n // `closed`, so a bare `if (closed)` is flagged as always-false.\n if (subscription.closed) {\n finalize();\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>( // NOSONAR -- typed pipe overload (RxJS shape, 1-9 operators); param count is the public API, not refactorable\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>( // NOSONAR -- typed pipe overload (RxJS shape, 1-9 operators); param count is the public API, not refactorable\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 resolveCallback = resolve;\n\n resolve = null;\n resolveCallback();\n }\n },\n error: (err) => {\n error = err;\n completed = true;\n if (resolve) {\n const resolveCallback = resolve;\n\n resolve = null;\n resolveCallback();\n }\n },\n complete: () => {\n completed = true;\n if (resolve) {\n const resolveCallback = resolve;\n\n resolve = null;\n resolveCallback();\n }\n },\n });\n\n try {\n for (;;) {\n // Drain a buffered value before honoring a terminal: a value emitted\n // immediately before a synchronous complete()/error() must still be\n // yielded (the terminal batch), and a fresh value can arrive while the\n // generator is suspended at the await below.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- flags are mutated by subscription closures, invisible to CFA\n if (hasValue) {\n const value = latestValue as T;\n\n hasValue = false;\n yield value;\n\n continue;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- flags are mutated by subscription closures, invisible to CFA\n if (completed) {\n if (error !== null) {\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw error;\n }\n\n break;\n }\n\n await new Promise<void>((_resolve) => {\n resolve = _resolve;\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 ?? ((prev: T, curr: T) => prev === curr);\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 // notifierSubscription may be undefined when erroring synchronously —\n // released by the post-subscribe `if (completed)` block below (#773)\n if (notifierSubscription) {\n notifierSubscription.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 // The notifier emitted/errored synchronously inside its own subscribe,\n // so complete()/error ran before `notifierSubscription` was assigned and\n // the wrapper exposes no teardown (early return). Release the now-assigned\n // notifier subscription here so it does not dangle forever (#773).\n notifierSubscription.unsubscribe();\n\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 // A synchronous navigation can fire TRANSITION_SUCCESS in the window between\n // subscribe and the deferred replay microtask (core's optimistic-sync path\n // commits without awaiting). When it does, the live event already delivered\n // a fresher snapshot — the replay must yield to it, or the subscriber would\n // receive the stale current state AFTER the new one (out-of-order rollback).\n let sawEvent = false;\n const unsubscribe = api.addEventListener(\n events.TRANSITION_SUCCESS,\n (toState: State, fromState: State | undefined) => {\n sawEvent = true;\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 if (sawEvent) {\n return;\n }\n\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_LEAVE_APPROVE\";\n toState: State;\n fromState: State | undefined;\n }\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_LEAVE_APPROVE,\n (toState: State, fromState: State | undefined) => {\n observer.next?.({\n type: \"TRANSITION_LEAVE_APPROVE\",\n toState,\n fromState,\n });\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-style Observable from a router instance.\n *\n * Semantic wrapper over `state$()` that exposes `Symbol.observable` for RxJS\n * interop via `from(observable(router))`.\n *\n * @remarks\n * \"TC39-style\", not strictly compliant: `error` is **non-terminal** — the\n * subscription stays open after `error()`, and only `complete()` /\n * `unsubscribe()` are terminal, so an infinite router stream survives a\n * throwing subscriber. Do not rely on `error` completing the RxJS chain (#775).\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"],"mappings":"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"}
|
package/dist/esm/index.d.mts
CHANGED
|
@@ -36,8 +36,10 @@ declare class RxObservable<T> {
|
|
|
36
36
|
pipe<A, B, C, D, E>(op1: Operator<T, A>, op2: Operator<A, B>, op3: Operator<B, C>, op4: Operator<C, D>, op5: Operator<D, E>): RxObservable<E>;
|
|
37
37
|
pipe<A, B, C, D, E, F>(op1: Operator<T, A>, op2: Operator<A, B>, op3: Operator<B, C>, op4: Operator<C, D>, op5: Operator<D, E>, op6: Operator<E, F>): RxObservable<F>;
|
|
38
38
|
pipe<A, B, C, D, E, F, G>(op1: Operator<T, A>, op2: Operator<A, B>, op3: Operator<B, C>, op4: Operator<C, D>, op5: Operator<D, E>, op6: Operator<E, F>, op7: Operator<F, G>): RxObservable<G>;
|
|
39
|
-
pipe<A, B, C, D, E, F, G, H>(
|
|
40
|
-
|
|
39
|
+
pipe<A, B, C, D, E, F, G, H>(// NOSONAR -- typed pipe overload (RxJS shape, 1-9 operators); param count is the public API, not refactorable
|
|
40
|
+
op1: Operator<T, A>, op2: Operator<A, B>, op3: Operator<B, C>, op4: Operator<C, D>, op5: Operator<D, E>, op6: Operator<E, F>, op7: Operator<F, G>, op8: Operator<G, H>): RxObservable<H>;
|
|
41
|
+
pipe<A, B, C, D, E, F, G, H, I>(// NOSONAR -- typed pipe overload (RxJS shape, 1-9 operators); param count is the public API, not refactorable
|
|
42
|
+
op1: Operator<T, A>, op2: Operator<A, B>, op3: Operator<B, C>, op4: Operator<C, D>, op5: Operator<D, E>, op6: Operator<E, F>, op7: Operator<F, G>, op8: Operator<G, H>, op9: Operator<H, I>): RxObservable<I>;
|
|
41
43
|
[Symbol.observable](): this;
|
|
42
44
|
["@@observable"](): this;
|
|
43
45
|
[Symbol.asyncIterator](): AsyncIterableIterator<T>;
|
|
@@ -96,10 +98,16 @@ declare function events$(router: Router): RxObservable<RouterEvent>;
|
|
|
96
98
|
//#endregion
|
|
97
99
|
//#region src/observable.d.ts
|
|
98
100
|
/**
|
|
99
|
-
* Creates a TC39-
|
|
101
|
+
* Creates a TC39-style Observable from a router instance.
|
|
100
102
|
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
+
* Semantic wrapper over `state$()` that exposes `Symbol.observable` for RxJS
|
|
104
|
+
* interop via `from(observable(router))`.
|
|
105
|
+
*
|
|
106
|
+
* @remarks
|
|
107
|
+
* "TC39-style", not strictly compliant: `error` is **non-terminal** — the
|
|
108
|
+
* subscription stays open after `error()`, and only `complete()` /
|
|
109
|
+
* `unsubscribe()` are terminal, so an infinite router stream survives a
|
|
110
|
+
* throwing subscriber. Do not rely on `error` completing the RxJS chain (#775).
|
|
103
111
|
*
|
|
104
112
|
* @param router - Router instance to observe
|
|
105
113
|
* @returns RxObservable that emits state changes
|
package/dist/esm/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/types.ts","../../src/RxObservable.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"],"mappings":";;;UAKiB,QAAA;EACf,IAAA,IAAQ,KAAA,EAAO,CAAC;EAChB,KAAA,IAAS,GAAA;EACT,QAAA;AAAA;AAAA,UAGe,YAAA;EACf,WAAA;EAAA,SACS,MAAM;AAAA;AAAA,UAGA,iBAAA;EACf,MAAA,GAAS,WAAW;EACpB,MAAA;AAAA;AAAA,KAIU,WAAA,OAAkB,QAAA,EAAU,QAAQ,CAAC,CAAA;AAAA,KAErC,QAAA,UAAkB,MAAA,EAAQ,YAAA,CAAa,CAAA,MAAO,YAAA,CAAa,CAAA;AAAA,KAE3D,aAAA,UAAuB,MAAA,EAAQ,CAAA,KAAM,CAAC;;;QClB1C,MAAA;EAAA,UACI,iBAAA;IAAA,SACC,UAAA;EAAA;AAAA;AAAA,cAIA,YAAA;EAAA;cAGC,WAAA,EAAa,WAAA,CAAY,CAAA;EAIrC,SAAA,CACE,cAAA,EAAgB,QAAA,CAAS,CAAA,MAAO,KAAA,EAAO,CAAA,YACvC,OAAA,GAAU,iBAAA,GACT,YAAA;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/types.ts","../../src/RxObservable.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"],"mappings":"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"}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{events as e}from"@real-router/core";import{getPluginApi as t}from"@real-router/core/api";var n=class{#e;constructor(e){this.#e=e}subscribe(e,t){let n=typeof e==`function`?{next:e}:e,{signal:r}=t??{};if(r?.aborted)return{unsubscribe:()=>{},closed:!0};let i=!1,a,o=e=>{if(!i)try{n.next?.(e)}catch(e){
|
|
1
|
+
import{events as e}from"@real-router/core";import{getPluginApi as t}from"@real-router/core/api";var n=class{#e;constructor(e){this.#e=e}subscribe(e,t){let n=typeof e==`function`?{next:e}:e,{signal:r}=t??{};if(r?.aborted)return{unsubscribe:()=>{},closed:!0};let i=!1,a,o=()=>{if(d&&r?.removeEventListener(`abort`,d),a)try{a()}catch{}},s=e=>{if(!i)try{n.next?.(e)}catch(e){c(e)}},c=e=>{if(!i)try{n.error?n.error(e):console.error(`Unhandled error in RxObservable:`,e)}catch{}},l=()=>{if(!i){i=!0;try{n.complete?.()}catch{}o()}},u={unsubscribe:()=>{i||(i=!0,o())},get closed(){return i}},d;r&&(d=()=>{u.unsubscribe()},r.addEventListener(`abort`,d));try{a=this.#e({next:s,error:c,complete:l})}catch(e){c(e)}return u.closed&&o(),u}pipe(...e){if(e.length===0)return this;let t=this;for(let n of e)t=n(t);return t}[Symbol.observable](){return this}"@@observable"(){return this}async*[Symbol.asyncIterator](){let e=null,t,n=!1,r=!1,i=null,a=this.subscribe({next:r=>{if(t=r,n=!0,e){let t=e;e=null,t()}},error:t=>{if(i=t,r=!0,e){let t=e;e=null,t()}},complete:()=>{if(r=!0,e){let t=e;e=null,t()}}});try{for(;;){if(n){let e=t;n=!1,yield e;continue}if(r){if(i!==null)throw i;break}await new Promise(t=>{e=t})}}finally{a.unsubscribe()}}};function r(e){return t=>new n(n=>{let r=t.subscribe({next:t=>{e(t,n)},error:e=>n.error?.(e),complete:()=>n.complete?.()});return()=>{r.unsubscribe()}})}function i(e){return t=>new n(n=>e(t,n))}function a(e){return r((t,n)=>{try{let r=e(t);n.next?.(r)}catch(e){n.error?.(e)}})}function o(e){return r((t,n)=>{try{e(t)&&n.next?.(t)}catch(e){n.error?.(e)}})}function s(e){if(!Number.isFinite(e)||e<0)throw RangeError(`debounceTime: duration must be a non-negative finite number, got ${e}`);return t=>new n(n=>{let r,i,a=!1,o=t.subscribe({next:t=>{i=t,a=!0,r!==void 0&&clearTimeout(r),r=setTimeout(()=>{a&&=(n.next?.(i),!1),r=void 0},e)},error:e=>{r!==void 0&&(clearTimeout(r),r=void 0),n.error?.(e)},complete:()=>{r!==void 0&&(clearTimeout(r),r=void 0),a&&=(n.next?.(i),!1),n.complete?.()}});return()=>{r!==void 0&&(clearTimeout(r),r=void 0),o.unsubscribe()}})}function c(e){return i((t,n)=>{let r=!1,i,a=e??((e,t)=>e===t),o=t.subscribe({next:e=>{if(!r){r=!0,i=e,n.next?.(e);return}try{a(i,e)||(i=e,n.next?.(e))}catch(e){n.error?.(e)}},error:e=>n.error?.(e),complete:()=>n.complete?.()});return()=>{o.unsubscribe()}})}function l(e){return t=>new n(n=>{let r,i,a=!1,o=()=>{a||(a=!0,r&&r.unsubscribe(),i&&i.unsubscribe(),n.complete?.())};if(i=e.subscribe({next:()=>{o()},error:e=>{a||(a=!0,r&&r.unsubscribe(),i&&i.unsubscribe(),n.error?.(e))}}),a){i.unsubscribe();return}return r=t.subscribe({next:e=>{a||n.next?.(e)},error:e=>{a||(a=!0,i.unsubscribe(),n.error?.(e))},complete:()=>{o()}}),()=>{r.unsubscribe(),i.unsubscribe()}})}function u(r,i){let{replay:a=!0}=i??{};return new n(n=>{let i=t(r),o=!1,s=i.addEventListener(e.TRANSITION_SUCCESS,(e,t)=>{o=!0,n.next?.({route:e,previousRoute:t})});if(a){let e=r.getState();e&&queueMicrotask(()=>{o||n.next?.({route:e,previousRoute:void 0})})}return s})}function d(r){return new n(n=>{let i=t(r),a=[];try{a.push(i.addEventListener(e.ROUTER_START,()=>{n.next?.({type:`ROUTER_START`})})),a.push(i.addEventListener(e.ROUTER_STOP,()=>{n.next?.({type:`ROUTER_STOP`})})),a.push(i.addEventListener(e.TRANSITION_START,(e,t)=>{n.next?.({type:`TRANSITION_START`,toState:e,fromState:t})})),a.push(i.addEventListener(e.TRANSITION_LEAVE_APPROVE,(e,t)=>{n.next?.({type:`TRANSITION_LEAVE_APPROVE`,toState:e,fromState:t})})),a.push(i.addEventListener(e.TRANSITION_SUCCESS,(e,t,r)=>{n.next?.({type:`TRANSITION_SUCCESS`,toState:e,fromState:t,options:r})})),a.push(i.addEventListener(e.TRANSITION_ERROR,(e,t,r)=>{n.next?.({type:`TRANSITION_ERROR`,toState:e,fromState:t,error:r})})),a.push(i.addEventListener(e.TRANSITION_CANCEL,(e,t)=>{n.next?.({type:`TRANSITION_CANCEL`,toState:e,fromState:t})}))}catch(e){for(let e of a)e();throw e}return()=>{for(let e of a)e()}})}function f(e){return u(e)}export{n as RxObservable,s as debounceTime,c as distinctUntilChanged,d as events$,o as filter,a as map,f as observable,u as state$,l as takeUntil};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["#subscribeFn"],"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"],"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 resolveCallback = resolve;\n\n resolve = null;\n resolveCallback();\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 resolveCallback = resolve;\n\n resolve = null;\n resolveCallback();\n }\n },\n complete: () => {\n completed = true;\n if (resolve) {\n const resolveCallback = resolve;\n\n resolve = null;\n resolveCallback();\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 ?? ((prev: T, curr: T) => prev === curr);\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_LEAVE_APPROVE\";\n toState: State;\n fromState: State | undefined;\n }\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_LEAVE_APPROVE,\n (toState: State, fromState: State | undefined) => {\n observer.next?.({\n type: \"TRANSITION_LEAVE_APPROVE\",\n toState,\n fromState,\n });\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"],"mappings":"gGAcA,IAAa,EAAb,KAA6B,CAC3B,GAEA,YAAY,EAA6B,CACvC,KAAKA,GAAe,CACtB,CAEA,UACE,EACA,EACc,CACd,IAAM,EACJ,OAAO,GAAmB,WACtB,CAAE,KAAM,CAAe,EACvB,EAEA,CAAE,UAAW,GAAW,CAAC,EAE/B,GAAI,GAAQ,QACV,MAAO,CACL,gBAAmB,CAAC,EACpB,OAAQ,EACV,EAGF,IAAI,EAAS,GAET,EAEE,EAAY,GAAa,CACzB,MAIJ,GAAI,CACF,EAAS,OAAO,CAAK,CACvB,OAAS,EAAO,CACd,EAAU,CAAK,CACjB,CACF,EAEM,EAAa,GAAiB,CAC9B,MAIJ,GAAI,CACE,EAAS,MACX,EAAS,MAAM,CAAG,EAElB,QAAQ,MAAM,mCAAoC,CAAG,CAEzD,MAAQ,CAER,CACF,EAEM,MAAqB,CACrB,MAIJ,GAAS,GAET,GAAI,CACF,EAAS,WAAW,CACtB,MAAQ,CAER,CANS,CAOX,EAEM,EAA6B,CACjC,gBAAmB,CACb,QAIJ,EAAS,GAEL,GACF,GAAQ,oBAAoB,QAAS,CAAY,EAG/C,GACF,GAAI,CACF,EAAS,CACX,MAAQ,CAER,CAEJ,EACA,IAAI,QAAS,CACX,OAAO,CACT,CACF,EAEI,EAEA,IACF,MAAqB,CACnB,EAAa,YAAY,CAC3B,EACA,EAAO,iBAAiB,QAAS,CAAY,GAG/C,GAAI,CACF,EAAW,KAAKA,GAAa,CAC3B,KAAM,EACN,MAAO,EACP,SAAU,CACZ,CAAC,CACH,OAAS,EAAO,CACd,EAAU,CAAK,CACjB,CAEA,OAAO,CACT,CA8DA,KAAK,GAAG,EAAsC,CAC5C,GAAI,EAAU,SAAW,EACvB,OAAO,KAIT,IAAI,EAAgC,KAEpC,IAAK,IAAM,KAAY,EACrB,EAAS,EAAS,CAAM,EAG1B,OAAO,CACT,CAEA,CAAC,OAAO,aAAoB,CAC1B,OAAO,IACT,CAEA,AAAC,gBAAwB,CACvB,OAAO,IACT,CAEA,OAAQ,OAAO,gBAA2C,CACxD,IAAI,EAA+B,KAC/B,EACA,EAAW,GACX,EAAY,GACZ,EAAiB,KAEf,EAAe,KAAK,UAAU,CAClC,KAAO,GAAU,CAGf,GAFA,EAAc,EACd,EAAW,GACP,EAAS,CACX,IAAM,EAAkB,EAExB,EAAU,KACV,EAAgB,CAClB,CACF,EAEA,MAAQ,GAAQ,CAGd,GAFA,EAAQ,EACR,EAAY,GACR,EAAS,CACX,IAAM,EAAkB,EAExB,EAAU,KACV,EAAgB,CAClB,CACF,EACA,aAAgB,CAEd,GADA,EAAY,GACR,EAAS,CACX,IAAM,EAAkB,EAExB,EAAU,KACV,EAAgB,CAClB,CACF,CAEF,CAAC,EAED,GAAI,CAEF,KAAO,CAAC,GAEN,GAAI,EAAU,CACZ,IAAM,EAAQ,EAEd,EAAW,GACX,MAAM,CACR,MAKE,GAJA,MAAM,IAAI,QAAe,GAAa,CACpC,EAAU,CACZ,CAAC,EAEG,IAAU,KAEZ,MAAM,CAId,QAAU,CACR,EAAa,YAAY,CAC3B,CACF,CACF,EChRA,SAAgB,EACd,EAC8C,CAC9C,MAAQ,IACN,IAAI,EAAiB,GAAa,CAChC,IAAM,EAAe,EAAO,UAAU,CACpC,KAAO,GAAU,CACf,EAAK,EAAO,CAAQ,CACtB,EACA,MAAQ,GAAU,EAAS,QAAQ,CAAK,EACxC,aAAgB,EAAS,WAAW,CACtC,CAAC,EAED,UAAa,CACX,EAAa,YAAY,CAC3B,CACF,CAAC,CACL,CAMA,SAAgB,EACd,EAC8C,CAC9C,MAAQ,IACN,IAAI,EAAiB,GAAa,EAAY,EAAQ,CAAQ,CAAC,CACnE,CChCA,SAAgB,EAAU,EAA0C,CAClE,OAAO,GAAsB,EAAO,IAAa,CAC/C,GAAI,CACF,IAAM,EAAS,EAAQ,CAAK,EAE5B,EAAS,OAAO,CAAM,CACxB,OAAS,EAAO,CACd,EAAS,QAAQ,CAAK,CACxB,CACF,CAAC,CACH,CCJA,SAAgB,EAAU,EAAkD,CAC1E,OAAO,GAAsB,EAAO,IAAa,CAC/C,GAAI,CACE,EAAU,CAAK,GACjB,EAAS,OAAO,CAAK,CAEzB,OAAS,EAAO,CACd,EAAS,QAAQ,CAAK,CACxB,CACF,CAAC,CACH,CChBA,SAAgB,EAAgB,EAAkC,CAChE,GAAI,CAAC,OAAO,SAAS,CAAQ,GAAK,EAAW,EAC3C,MAAU,WACR,oEAAoE,GACtE,EAGF,MAAQ,IACN,IAAI,EAAiB,GAAa,CAChC,IAAI,EACA,EACA,EAAW,GAET,EAAe,EAAO,UAAU,CACpC,KAAO,GAAU,CACf,EAAc,EACd,EAAW,GAEP,IAAc,IAAA,IAChB,aAAa,CAAS,EAGxB,EAAY,eAAiB,CAE3B,AAEE,KADA,EAAS,OAAO,CAAW,EAChB,IAIb,EAAY,IAAA,EACd,EAAG,CAAQ,CACb,EACA,MAAQ,GAAU,CACZ,IAAc,IAAA,KAChB,aAAa,CAAS,EACtB,EAAY,IAAA,IAGd,EAAS,QAAQ,CAAK,CACxB,EACA,aAAgB,CACV,IAAc,IAAA,KAChB,aAAa,CAAS,EACtB,EAAY,IAAA,IAGd,AAEE,KADA,EAAS,OAAO,CAAW,EAChB,IAGb,EAAS,WAAW,CACtB,CACF,CAAC,EAED,UAAa,CACP,IAAc,IAAA,KAChB,aAAa,CAAS,EACtB,EAAY,IAAA,IAGd,EAAa,YAAY,CAC3B,CACF,CAAC,CACL,CCjEA,SAAgB,EACd,EACgB,CAChB,OAAO,GAA8B,EAAQ,IAAa,CACxD,IAAI,EAAU,GACV,EACE,EAAU,KAAgB,EAAS,IAAY,IAAS,GAExD,EAAe,EAAO,UAAU,CACpC,KAAO,GAAU,CACf,GAAI,CAAC,EAAS,CACZ,EAAU,GACV,EAAO,EACP,EAAS,OAAO,CAAK,EAErB,MACF,CAEA,GAAI,CACG,EAAQ,EAAM,CAAK,IACtB,EAAO,EACP,EAAS,OAAO,CAAK,EAEzB,OAAS,EAAO,CACd,EAAS,QAAQ,CAAK,CACxB,CACF,EACA,MAAQ,GAAU,EAAS,QAAQ,CAAK,EACxC,aAAgB,EAAS,WAAW,CACtC,CAAC,EAED,UAAa,CACX,EAAa,YAAY,CAC3B,CACF,CAAC,CACH,CCnCA,SAAgB,EAAa,EAAiD,CAC5E,MAAQ,IACN,IAAI,EAAiB,GAAa,CAEhC,IAAI,EAEA,EAGA,EAAY,GAEV,MAAiB,CAEjB,IAKJ,EAAY,GAGR,GACF,EAAmB,YAAY,EAG7B,GACF,EAAqB,YAAY,EAGnC,EAAS,WAAW,EACtB,EAEA,KAAuB,EAAS,UAAU,CACxC,SAAY,CACV,EAAS,CACX,EACA,MAAQ,GAAU,CAEZ,IAKJ,EAAY,GAGR,GACF,EAAmB,YAAY,EAGjC,EAAS,QAAQ,CAAK,EACxB,CACF,CAAC,EAGG,GAgCJ,MA5BA,GAAqB,EAAO,UAAU,CACpC,KAAO,GAAU,CAGV,GACH,EAAS,OAAO,CAAK,CAGzB,EACA,MAAQ,GAAU,CAEZ,IAKJ,EAAY,GAGZ,EAAqB,YAAY,EAEjC,EAAS,QAAQ,CAAK,EACxB,EACA,aAAgB,CACd,EAAS,CACX,CACF,CAAC,MAEY,CAGX,EAAmB,YAAY,EAC/B,EAAqB,YAAY,CACnC,CACF,CAAC,CACL,CCzFA,SAAgB,EACd,EACA,EAC8B,CAC9B,GAAM,CAAE,SAAS,IAAS,GAAW,CAAC,EAEtC,OAAO,IAAI,EAA8B,GAAa,CAEpD,IAAM,EADM,EAAa,CACH,CAAC,CAAC,iBACtB,EAAO,oBACN,EAAgB,IAAiC,CAChD,EAAS,OAAO,CAAE,MAAO,EAAS,cAAe,CAAU,CAAC,CAC9D,CACF,EAEA,GAAI,EAAQ,CACV,IAAM,EAAe,EAAO,SAAS,EAEjC,GACF,mBAAqB,CACnB,EAAS,OAAO,CAAE,MAAO,EAAc,cAAe,IAAA,EAAU,CAAC,CACnE,CAAC,CAEL,CAEA,OAAO,CACT,CAAC,CACH,CCDA,SAAgB,EAAQ,EAA2C,CACjE,OAAO,IAAI,EAA2B,GAAa,CACjD,IAAM,EAAM,EAAa,CAAM,EACzB,EAA+B,CAAC,EAGtC,GAAI,CACF,EAAa,KACX,EAAI,iBAAiB,EAAO,iBAAoB,CAC9C,EAAS,OAAO,CAAE,KAAM,cAAe,CAAC,CAC1C,CAAC,CACH,EACA,EAAa,KACX,EAAI,iBAAiB,EAAO,gBAAmB,CAC7C,EAAS,OAAO,CAAE,KAAM,aAAc,CAAC,CACzC,CAAC,CACH,EACA,EAAa,KACX,EAAI,iBACF,EAAO,kBACN,EAAgB,IAAiC,CAChD,EAAS,OAAO,CAAE,KAAM,mBAAoB,UAAS,WAAU,CAAC,CAClE,CACF,CACF,EACA,EAAa,KACX,EAAI,iBACF,EAAO,0BACN,EAAgB,IAAiC,CAChD,EAAS,OAAO,CACd,KAAM,2BACN,UACA,WACF,CAAC,CACH,CACF,CACF,EACA,EAAa,KACX,EAAI,iBACF,EAAO,oBAEL,EACA,EACA,IACG,CACH,EAAS,OAAO,CACd,KAAM,qBACN,UACA,YACA,SACF,CAAC,CACH,CACF,CACF,EACA,EAAa,KACX,EAAI,iBACF,EAAO,kBAEL,EACA,EACA,IACG,CACH,EAAS,OAAO,CACd,KAAM,mBACN,UACA,YACA,OACF,CAAC,CACH,CACF,CACF,EACA,EAAa,KACX,EAAI,iBACF,EAAO,mBACN,EAAgB,IAAiC,CAChD,EAAS,OAAO,CAAE,KAAM,oBAAqB,UAAS,WAAU,CAAC,CACnE,CACF,CACF,CAGF,OAAS,EAAO,CAEd,IAAK,IAAM,KAAS,EAClB,EAAM,EAGR,MAAM,CACR,CAGA,UAAa,CACX,IAAK,IAAM,KAAS,EAClB,EAAM,CAEV,CACF,CAAC,CACH,CC3GA,SAAgB,EAAW,EAA8C,CACvE,OAAO,EAAO,CAAM,CACtB"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["#subscribeFn"],"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"],"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 readonly #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 // Release the subscription's resources (abort listener + teardown). Runs on\n // every terminal path — unsubscribe AND complete — so a self-completing\n // source still releases its resource. `teardown` is undefined until\n // subscribeFn returns, so a synchronous complete() fires finalize() before\n // teardown exists; the post-subscribe `if (closed) finalize()` re-runs it\n // once teardown is assigned. teardown therefore executes at most once, and\n // removeEventListener is idempotent, so the double call is harmless.\n const finalize = () => {\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\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 finalize();\n };\n\n const subscription: Subscription = {\n unsubscribe: () => {\n if (closed) {\n return;\n }\n\n closed = true;\n\n finalize();\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 // A synchronous complete() inside subscribeFn ran finalize() before\n // `teardown` was assigned above — run it now that the teardown exists. Read\n // via the getter: TS control-flow analysis can't see the closure mutation of\n // `closed`, so a bare `if (closed)` is flagged as always-false.\n if (subscription.closed) {\n finalize();\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>( // NOSONAR -- typed pipe overload (RxJS shape, 1-9 operators); param count is the public API, not refactorable\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>( // NOSONAR -- typed pipe overload (RxJS shape, 1-9 operators); param count is the public API, not refactorable\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 resolveCallback = resolve;\n\n resolve = null;\n resolveCallback();\n }\n },\n error: (err) => {\n error = err;\n completed = true;\n if (resolve) {\n const resolveCallback = resolve;\n\n resolve = null;\n resolveCallback();\n }\n },\n complete: () => {\n completed = true;\n if (resolve) {\n const resolveCallback = resolve;\n\n resolve = null;\n resolveCallback();\n }\n },\n });\n\n try {\n for (;;) {\n // Drain a buffered value before honoring a terminal: a value emitted\n // immediately before a synchronous complete()/error() must still be\n // yielded (the terminal batch), and a fresh value can arrive while the\n // generator is suspended at the await below.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- flags are mutated by subscription closures, invisible to CFA\n if (hasValue) {\n const value = latestValue as T;\n\n hasValue = false;\n yield value;\n\n continue;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- flags are mutated by subscription closures, invisible to CFA\n if (completed) {\n if (error !== null) {\n // eslint-disable-next-line @typescript-eslint/only-throw-error\n throw error;\n }\n\n break;\n }\n\n await new Promise<void>((_resolve) => {\n resolve = _resolve;\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 ?? ((prev: T, curr: T) => prev === curr);\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 // notifierSubscription may be undefined when erroring synchronously —\n // released by the post-subscribe `if (completed)` block below (#773)\n if (notifierSubscription) {\n notifierSubscription.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 // The notifier emitted/errored synchronously inside its own subscribe,\n // so complete()/error ran before `notifierSubscription` was assigned and\n // the wrapper exposes no teardown (early return). Release the now-assigned\n // notifier subscription here so it does not dangle forever (#773).\n notifierSubscription.unsubscribe();\n\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 // A synchronous navigation can fire TRANSITION_SUCCESS in the window between\n // subscribe and the deferred replay microtask (core's optimistic-sync path\n // commits without awaiting). When it does, the live event already delivered\n // a fresher snapshot — the replay must yield to it, or the subscriber would\n // receive the stale current state AFTER the new one (out-of-order rollback).\n let sawEvent = false;\n const unsubscribe = api.addEventListener(\n events.TRANSITION_SUCCESS,\n (toState: State, fromState: State | undefined) => {\n sawEvent = true;\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 if (sawEvent) {\n return;\n }\n\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_LEAVE_APPROVE\";\n toState: State;\n fromState: State | undefined;\n }\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_LEAVE_APPROVE,\n (toState: State, fromState: State | undefined) => {\n observer.next?.({\n type: \"TRANSITION_LEAVE_APPROVE\",\n toState,\n fromState,\n });\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-style Observable from a router instance.\n *\n * Semantic wrapper over `state$()` that exposes `Symbol.observable` for RxJS\n * interop via `from(observable(router))`.\n *\n * @remarks\n * \"TC39-style\", not strictly compliant: `error` is **non-terminal** — the\n * subscription stays open after `error()`, and only `complete()` /\n * `unsubscribe()` are terminal, so an infinite router stream survives a\n * throwing subscriber. Do not rely on `error` completing the RxJS chain (#775).\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"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@real-router/rx",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.13",
|
|
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",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"homepage": "https://github.com/greydragon888/real-router",
|
|
44
44
|
"sideEffects": false,
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@real-router/core": "^0.
|
|
46
|
+
"@real-router/core": "^0.59.0"
|
|
47
47
|
},
|
|
48
48
|
"scripts": {
|
|
49
49
|
"test": "vitest",
|