@plohoj/html-editor 0.0.6 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/index.ts CHANGED
@@ -1,19 +1,25 @@
1
- // Observable
2
- export { awaitElement, IAwaitElementOptions } from "./observable/await-element";
3
- export { awaitRandomElement } from './observable/await-random-element';
4
- export { observeElementMutation } from "./observable/observe-mutation";
5
- export { IObservePressedKeyboardButtonsOptions, observePressedKeyboardButtons } from './observable/observe-pressed-keyboard-buttons';
6
- export { IObserveElementChange, IObserveQuerySelectorBaseOptions, IObserveQuerySelectorOptions, observeQuerySelector } from "./observable/observe-query-selector";
7
- export { IObservedElementsChanges, observeQuerySelectorAll } from "./observable/observe-query-selector-all";
8
- export { urlChange$ } from "./observable/url-change";
9
- // Operators
10
- export { clickElement } from "./operators/click-element";
11
- export { mergeMapAddedElements } from "./operators/merge-map-added-elements";
12
- export { mergeMapStringToggle } from "./operators/merge-map-string-toggle";
13
- export { removeElement } from "./operators/remove-element";
14
- export { IRestoredHistoryOption, restoreHistory } from './operators/restore-history';
15
- export { setInputValue } from "./operators/set-input-value";
16
- // Utils
17
- export { ComposedRestoredHistoryOperatorsArray, ComposedRestoredHistoryOperatorsList, ComposedRestoredHistoryOperatorsRecord, ComposedRestoredHistoryOptionList, composeRestoreHistory, IComposedRestoredHistory } from './utils/compose-restore-history';
18
- export { findRecursively, FindRecursivelyContinue, FindRecursivelyMatcher, FindRecursivelyResult, IFindRecursivelyMatherOptions, IFindRecursivelyOptions } from "./utils/find-recursively";
19
- export { randomFromArray } from "./utils/random-from-array";
1
+ // Observable
2
+ export { awaitElement, IAwaitElementOptions } from "./observable/await-element";
3
+ export { awaitElements } from './observable/await-elements';
4
+ export { awaitRandomElement } from './observable/await-random-element';
5
+ export { observeElementMutation } from "./observable/observe-mutation";
6
+ export { IObservePressedKeyboardButtonsOptions, observePressedKeyboardButtons } from './observable/observe-pressed-keyboard-buttons';
7
+ export { IObservedElementChange, IObserveQuerySelectorBaseOptions, IObserveQuerySelectorOptions, observeQuerySelector } from "./observable/observe-query-selector";
8
+ export { IObservedElementsChanges, observeQuerySelectorAll } from "./observable/observe-query-selector-all";
9
+ export { urlChange$ } from "./observable/url-change";
10
+
11
+ // Operators
12
+ export { observeUrlChanges } from './observable/observe-url-changes';
13
+ export { clickElement } from "./operators/click-element";
14
+ export { focusElement } from './operators/focus-element';
15
+ export { mergeMapAddedElements } from "./operators/merge-map-added-elements";
16
+ export { mergeMapByCondition } from './operators/merge-map-by-condition';
17
+ export { mergeMapStringCondition } from "./operators/merge-map-by-string-condition";
18
+ export { removeElement } from "./operators/remove-element";
19
+ export { IRestoredHistoryOption, restoreHistory } from './operators/restore-history';
20
+ export { setInputValue } from "./operators/set-input-value";
21
+
22
+ // Utils
23
+ export { ComposedRestoredHistoryOperatorsArray, ComposedRestoredHistoryOperatorsList, ComposedRestoredHistoryOperatorsRecord, ComposedRestoredHistoryOptionList, composeRestoreHistory, IComposedRestoredHistory } from './utils/compose-restore-history';
24
+ export { findRecursively, FindRecursivelyContinue, FindRecursivelyMatcher, FindRecursivelyResult, IFindRecursivelyMatherOptions, IFindRecursivelyOptions } from "./utils/find-recursively";
25
+ export { randomFromArray } from "./utils/random-from-array";
@@ -1,30 +1,47 @@
1
- import { Observable, SchedulerLike } from "rxjs";
2
- import { debounceTime, filter, map, take } from "rxjs/operators";
3
- import { IObserveQuerySelectorBaseOptions, observeQuerySelector } from "./observe-query-selector";
4
-
5
- export interface IAwaitElementOptions<T extends Element = Element> extends IObserveQuerySelectorBaseOptions<T> {
6
- /**
7
- * The time to wait for elements changes.
8
- * If during the waiting time the elements have changed the timer will be reset.
9
- * @default 0
10
- */
11
- debounceTime?: number;
12
- debounceScheduler?: SchedulerLike;
13
- }
14
-
15
- /**
16
- * Awaiting only one element to match the selector and returns it as an Rx stream.
17
- * The stream ends after one element is found / added.
18
- */
19
- export function awaitElement<T extends Element = Element>(
20
- query: string,
21
- options: IAwaitElementOptions<T> = {},
22
- ): Observable<T> {
23
- return observeQuerySelector<T>(query, options)
24
- .pipe(
25
- debounceTime(options.debounceTime || 0, options.debounceScheduler),
26
- filter(changes => !!changes.target),
27
- map(changes => changes.target!),
28
- take(1),
29
- );
30
- }
1
+ import { Observable, SchedulerLike, debounceTime, filter, map, take } from "rxjs";
2
+ import { IObserveQuerySelectorBaseOptions, observeQuerySelector } from "./observe-query-selector";
3
+
4
+ export interface IAwaitElementOptions<T extends Element = Element> extends IObserveQuerySelectorBaseOptions<T> {
5
+ /**
6
+ * The time to wait for elements changes.
7
+ * If during the waiting time the elements have changed the timer will be reset.
8
+ * @default 0
9
+ */
10
+ debounceTime?: number;
11
+ debounceScheduler?: SchedulerLike;
12
+ }
13
+
14
+ /**
15
+ * Awaiting only one element to match the selector and returns it as an Rx stream.
16
+ * The stream ends after one element is found / added.
17
+ */
18
+ export function awaitElement<T extends Element = Element>(
19
+ options: IAwaitElementOptions<T>,
20
+ ): Observable<T>;
21
+ export function awaitElement<T extends Element = Element>(
22
+ query: string,
23
+ options?: Omit<IAwaitElementOptions<T>, 'query'>,
24
+ ): Observable<T>;
25
+ export function awaitElement<T extends Element = Element>(
26
+ queryOrOptions: string | IAwaitElementOptions<T>,
27
+ options?: Omit<IAwaitElementOptions<T>, 'query'>,
28
+ ): Observable<T> {
29
+ // #region Options parsing
30
+ let query: string;
31
+ let stableOptions: Omit<IAwaitElementOptions<T>, 'query'>;
32
+ if (typeof queryOrOptions === 'string') {
33
+ query = queryOrOptions;
34
+ stableOptions = options || {};
35
+ } else {
36
+ stableOptions = queryOrOptions;
37
+ query = queryOrOptions.query;
38
+ }
39
+ // #endregion
40
+
41
+ return observeQuerySelector<T>(query, stableOptions).pipe(
42
+ debounceTime(stableOptions.debounceTime || 0, stableOptions.debounceScheduler),
43
+ filter(changes => !!changes.target),
44
+ map(changes => changes.target!),
45
+ take(1),
46
+ );
47
+ }
@@ -0,0 +1,38 @@
1
+ import { Observable, debounceTime, filter, map, take } from "rxjs";
2
+ import { IAwaitElementOptions } from './await-element';
3
+ import { observeQuerySelectorAll } from './observe-query-selector-all';
4
+
5
+ /**
6
+ * Awaiting only first elements changes to match the selector and returns it as an Rx stream.
7
+ * The stream ends after any element is found / added.
8
+ */
9
+ export function awaitElements<T extends Element = Element>(
10
+ options: IAwaitElementOptions<T>,
11
+ ): Observable<T[]>;
12
+ export function awaitElements<T extends Element = Element>(
13
+ query: string,
14
+ options?: Omit<IAwaitElementOptions<T>, 'query'>,
15
+ ): Observable<T[]>;
16
+ export function awaitElements<T extends Element = Element>(
17
+ queryOrOptions: string | IAwaitElementOptions<T>,
18
+ options?: Omit<IAwaitElementOptions<T>, 'query'>,
19
+ ): Observable<T[]> {
20
+ // #region Options parsing
21
+ let query: string;
22
+ let stableOptions: Omit<IAwaitElementOptions<T>, 'query'>;
23
+ if (typeof queryOrOptions === 'string') {
24
+ query = queryOrOptions;
25
+ stableOptions = options || {};
26
+ } else {
27
+ stableOptions = queryOrOptions;
28
+ query = queryOrOptions.query;
29
+ }
30
+ // #endregion
31
+
32
+ return observeQuerySelectorAll<T>(query, stableOptions).pipe(
33
+ debounceTime(stableOptions.debounceTime || 0, stableOptions.debounceScheduler),
34
+ filter(changes => !!changes.target),
35
+ map(changes => changes.target),
36
+ take(1),
37
+ );
38
+ }
@@ -1,23 +1,40 @@
1
- import { Observable } from "rxjs";
2
- import { debounceTime, filter, map, take } from "rxjs/operators";
3
- import { randomFromArray } from "../utils/random-from-array";
4
- import { IAwaitElementOptions } from './await-element';
5
- import { observeQuerySelectorAll } from "./observe-query-selector-all";
6
-
7
- /**
8
- * Awaiting Expects at least one element to match the selector and returns it as an Rx stream.
9
- * If there are more than 1 elements, it will return a random one.
10
- * The stream ends after the elements are found / added.
11
- */
12
- export function awaitRandomElement<T extends Element = Element>(
13
- query: string,
14
- options: IAwaitElementOptions<T> = {},
15
- ): Observable<T> {
16
- return observeQuerySelectorAll<T>(query, options)
17
- .pipe(
18
- debounceTime(options.debounceTime || 0, options.debounceScheduler),
19
- filter(changes => changes.target.length > 0),
20
- map(changes => randomFromArray(changes.target)),
21
- take(1)
22
- );
23
- }
1
+ import { Observable, debounceTime, filter, map, take } from "rxjs";
2
+ import { randomFromArray } from "../utils/random-from-array";
3
+ import { IAwaitElementOptions } from './await-element';
4
+ import { observeQuerySelectorAll } from "./observe-query-selector-all";
5
+
6
+ /**
7
+ * Awaiting Expects at least one element to match the selector and returns it as an Rx stream.
8
+ * If there are more than 1 elements, it will return a random one.
9
+ * The stream ends after the elements are found / added.
10
+ */
11
+ export function awaitRandomElement<T extends Element = Element>(
12
+ options: IAwaitElementOptions<T>,
13
+ ): Observable<T>;
14
+ export function awaitRandomElement<T extends Element = Element>(
15
+ query: string,
16
+ options?: Omit<IAwaitElementOptions<T>, 'query'>,
17
+ ): Observable<T>;
18
+ export function awaitRandomElement<T extends Element = Element>(
19
+ queryOrOptions: string | IAwaitElementOptions<T>,
20
+ options?: Omit<IAwaitElementOptions<T>, 'query'>,
21
+ ): Observable<T> {
22
+ // #region Options parsing
23
+ let query: string;
24
+ let stableOptions: Omit<IAwaitElementOptions<T>, 'query'>;
25
+ if (typeof queryOrOptions === 'string') {
26
+ query = queryOrOptions;
27
+ stableOptions = options || {};
28
+ } else {
29
+ stableOptions = queryOrOptions;
30
+ query = queryOrOptions.query;
31
+ }
32
+ // #endregion
33
+
34
+ return observeQuerySelectorAll<T>(query, stableOptions).pipe(
35
+ debounceTime(stableOptions.debounceTime || 0, stableOptions.debounceScheduler),
36
+ filter(changes => changes.target.length > 0),
37
+ map(changes => randomFromArray(changes.target)),
38
+ take(1)
39
+ );
40
+ }
@@ -1,12 +1,10 @@
1
- import { Observable } from "rxjs";
2
-
3
- /**
4
- * Converts the callback of the MutationObserver class to an Rx event stream
5
- */
6
- export function observeElementMutation<T extends Node>(node: T, options?: MutationObserverInit): Observable<MutationRecord[]> {
7
- return new Observable<MutationRecord[]>(subscriber => {
8
- const mutationObserver = new MutationObserver(mutation => subscriber.next(mutation));
9
- mutationObserver.observe(node, options);
10
- return () => mutationObserver.disconnect();
11
- });
12
- }
1
+ import { Observable } from "rxjs";
2
+
3
+ /** Converts the callback of the {@link MutationObserver} class to an Rx event stream */
4
+ export function observeElementMutation<T extends Node>(node: T, options?: MutationObserverInit): Observable<MutationRecord[]> {
5
+ return new Observable<MutationRecord[]>(subscriber => {
6
+ const mutationObserver = new MutationObserver(mutation => subscriber.next(mutation));
7
+ mutationObserver.observe(node, options);
8
+ return () => mutationObserver.disconnect();
9
+ });
10
+ }
@@ -1,31 +1,29 @@
1
- import { fromEvent, merge, Observable } from 'rxjs';
2
- import { filter, map, tap } from 'rxjs/operators';
3
- import { HasEventTargetAddRemove } from 'rxjs/internal/observable/fromEvent';
4
-
5
- export interface IObservePressedKeyboardButtonsOptions {
6
- /** @default window */
7
- target?: HasEventTargetAddRemove<KeyboardEvent>
8
- }
9
-
10
- export function observePressedKeyboardButtons(
11
- options: IObservePressedKeyboardButtonsOptions = {}
12
- ): Observable<Set<string>> {
13
- const target = options.target || window;
14
- const set = new Set<string>();
15
- const addKey$ = merge(
16
- fromEvent(target, 'keydown'),
17
- fromEvent(target, 'keypress'),
18
- ).pipe(
19
- filter((event: KeyboardEvent) => !set.has(event.key)),
20
- tap((event: KeyboardEvent) => set.add(event.key)),
21
- )
22
- const keyRemove$ = fromEvent(target, 'keyup')
23
- .pipe(
24
- filter((event: KeyboardEvent) => set.has(event.key)),
25
- tap((event: KeyboardEvent) => set.delete(event.key)),
26
- );
27
- return merge(
28
- addKey$,
29
- keyRemove$,
30
- ).pipe(map(() => set));
31
- }
1
+ import { filter, fromEvent, map, merge, Observable, tap } from 'rxjs';
2
+ import { HasEventTargetAddRemove } from 'rxjs/internal/observable/fromEvent';
3
+
4
+ export interface IObservePressedKeyboardButtonsOptions {
5
+ /** @default window */
6
+ target?: HasEventTargetAddRemove<KeyboardEvent>
7
+ }
8
+
9
+ export function observePressedKeyboardButtons(
10
+ options: IObservePressedKeyboardButtonsOptions = {}
11
+ ): Observable<Set<string>> {
12
+ const target = options.target || window;
13
+ const set = new Set<string>();
14
+ const addKey$ = merge(
15
+ fromEvent(target, 'keydown'),
16
+ fromEvent(target, 'keypress'),
17
+ ).pipe(
18
+ filter((event: KeyboardEvent) => !set.has(event.key)),
19
+ tap((event: KeyboardEvent) => set.add(event.key)),
20
+ )
21
+ const keyRemove$ = fromEvent(target, 'keyup').pipe(
22
+ filter((event: KeyboardEvent) => set.has(event.key)),
23
+ tap((event: KeyboardEvent) => set.delete(event.key)),
24
+ );
25
+ return merge(
26
+ addKey$,
27
+ keyRemove$,
28
+ ).pipe(map(() => set));
29
+ }
@@ -1,101 +1,154 @@
1
-
2
- import { concat, defer, EMPTY, Observable, of } from "rxjs";
3
- import { distinctUntilChanged, mergeMap, switchMap, throttleTime } from "rxjs/operators";
4
- import { trueStub } from '../utils/stubs';
5
- import { observeElementMutation } from "./observe-mutation";
6
- import { IObserveQuerySelectorOptions } from "./observe-query-selector";
7
-
8
- export interface IObservedElementsChanges<T extends Element = Element> {
9
- /** All elements that satisfy the filtering condition. */
10
- target: T[];
11
- /** New elements that have been added since the last emit. */
12
- added: T[];
13
- /** Elements that have been removed since the last emit. */
14
- removed: T[];
15
- }
16
-
17
- /** Returns changes (additions and deletions) of elements that match selectors, like an Rx stream. */
18
- export function observeQuerySelectorAll<T extends Element = Element>(
19
- query: string,
20
- options: IObserveQuerySelectorOptions<T> = {},
21
- ): Observable<IObservedElementsChanges<T>> {
22
- const {
23
- parent = document.documentElement,
24
- asRemovedWhen,
25
- filter = trueStub,
26
- } = options;
27
- const targetElements = new Set<T>();
28
-
29
- function checkChanges(): Observable<IObservedElementsChanges<T>> {
30
- const addedElements = new Set<T>();
31
- const targetElementsDiff = new Set(targetElements);
32
- const querySelectedElements = new Set(parent.querySelectorAll<T>(query));
33
-
34
- for (const querySelectedElement of querySelectedElements) {
35
- if (options.has && !querySelectedElement.querySelector(options.has)) {
36
- continue;
37
- }
38
- if (!filter(querySelectedElement)) {
39
- continue;
40
- }
41
-
42
- if (targetElementsDiff.has(querySelectedElement)) {
43
- targetElementsDiff.delete(querySelectedElement);
44
- } else {
45
- addedElements.add(querySelectedElement);
46
- }
47
- }
48
-
49
- // No changes
50
- if (addedElements.size === 0 && targetElementsDiff.size === 0) {
51
- return EMPTY;
52
- }
53
-
54
- for (const removedElement of targetElementsDiff) {
55
- targetElements.delete(removedElement);
56
- }
57
- for (const addedElement of addedElements) {
58
- targetElements.add(addedElement);
59
- }
60
-
61
- const changes: IObservedElementsChanges<T> = {
62
- target: [...targetElements.values()],
63
- added: [...addedElements.values()],
64
- removed: [...targetElementsDiff.values()],
65
- }
66
-
67
- return of(changes);
68
- }
69
-
70
- let observeQuerySelectorAll$ = concat(
71
- defer(() => checkChanges()),
72
- observeElementMutation(parent, {subtree: true, childList: true}).pipe(
73
- throttleTime(0, undefined, {leading: true, trailing: true}),
74
- mergeMap(checkChanges)
75
- ),
76
- )
77
-
78
- if (asRemovedWhen) {
79
- const removedObserver$ = defer(() => {
80
- if (targetElements.size === 0) {
81
- return EMPTY;
82
- }
83
- const changes: IObservedElementsChanges<T> = {
84
- target: [],
85
- added: [],
86
- removed: [...targetElements.values()],
87
- };
88
- targetElements.clear();
89
- return of(changes);
90
- });
91
-
92
- const observeQuerySelectorAllWithRemovedWhen$ = asRemovedWhen.pipe(
93
- distinctUntilChanged(),
94
- switchMap(asRemoved => asRemoved ? removedObserver$ : observeQuerySelectorAll$),
95
- );
96
-
97
- return observeQuerySelectorAllWithRemovedWhen$;
98
- }
99
-
100
- return observeQuerySelectorAll$;
101
- }
1
+
2
+ import { concat, defer, distinctUntilChanged, EMPTY, mergeMap, Observable, of, switchMap, throttleTime } from "rxjs";
3
+ import { mergeMapAddedElements } from '../operators/merge-map-added-elements';
4
+ import { trueStub } from '../utils/stubs';
5
+ import { observeElementMutation } from "./observe-mutation";
6
+ import { IObserveQuerySelectorOptions } from "./observe-query-selector";
7
+
8
+ export interface IObservedElementsChanges<T extends Element = Element> {
9
+ /** All elements that satisfy the filtering condition. */
10
+ target: T[];
11
+ /** New elements that have been added since the last emit. */
12
+ added: T[];
13
+ /** Elements that have been removed since the last emit. */
14
+ removed: T[];
15
+ }
16
+
17
+ /** Observation changes (additions and deletions) of elements that match to query selectors as an Rx stream. */
18
+ export function observeQuerySelectorAll<E extends Element = Element>(
19
+ options: IObserveQuerySelectorOptions<E, unknown> & { project?: undefined },
20
+ ): Observable<IObservedElementsChanges<E>>;
21
+ export function observeQuerySelectorAll<E extends Element = Element, O = unknown>(
22
+ options: IObserveQuerySelectorOptions<E, O>,
23
+ ): Observable<O>;
24
+ export function observeQuerySelectorAll<E extends Element = Element>(
25
+ query: string,
26
+ options?: Omit<IObserveQuerySelectorOptions<E, unknown>, 'query'> & { project?: undefined },
27
+ ): Observable<IObservedElementsChanges<E>>;
28
+ export function observeQuerySelectorAll<E extends Element = Element, O = unknown>(
29
+ query: string,
30
+ options: Omit<IObserveQuerySelectorOptions<E, O>, 'query'>,
31
+ ): Observable<O>;
32
+ export function observeQuerySelectorAll<E extends Element = Element, O = unknown>(
33
+ query: string,
34
+ project: ((element: E) => Observable<O>),
35
+ options: Omit<IObserveQuerySelectorOptions<E>, 'query' | 'project'>,
36
+ ): Observable<O>;
37
+ export function observeQuerySelectorAll<E extends Element = Element, O = unknown>(
38
+ queryOrOptions: string | IObserveQuerySelectorOptions<E, O>,
39
+ projectOrOptions?: ((element: E) => Observable<O>) | Omit<IObserveQuerySelectorOptions<E, O>, 'query'>,
40
+ options?: Omit<IObserveQuerySelectorOptions<E>, 'query' | 'project'>
41
+ ): Observable<IObservedElementsChanges<E> | O> {
42
+ // #region Options parsing
43
+ let query: string;
44
+ let project: ((element: E) => Observable<O>) | undefined;
45
+ let stableOptions: Omit<IObserveQuerySelectorOptions<E>, 'query' | 'project'>;
46
+ if (typeof queryOrOptions === 'string') {
47
+ query = queryOrOptions;
48
+ if (typeof projectOrOptions === 'function') {
49
+ project = projectOrOptions;
50
+ stableOptions = options || {};
51
+ } else {
52
+ stableOptions = projectOrOptions || {};
53
+ project = projectOrOptions?.project;
54
+ }
55
+ } else {
56
+ stableOptions = queryOrOptions;
57
+ query = queryOrOptions.query;
58
+ project = queryOrOptions?.project;
59
+ }
60
+ const {
61
+ parent = document.documentElement,
62
+ asRemovedWhen,
63
+ filter = trueStub,
64
+ has,
65
+ tap,
66
+ ...restOfStableOptions
67
+ } = stableOptions;
68
+ // #endregion
69
+
70
+ const targetElements = new Set<E>();
71
+
72
+ function checkChanges(): Observable<IObservedElementsChanges<E>> {
73
+ const addedElements = new Set<E>();
74
+ const targetElementsDiff = new Set(targetElements);
75
+ const querySelectedElements = new Set(parent.querySelectorAll<E>(query));
76
+
77
+ for (const querySelectedElement of querySelectedElements) {
78
+ if (has && !querySelectedElement.querySelector(has)) {
79
+ continue;
80
+ }
81
+ if (!filter(querySelectedElement)) {
82
+ continue;
83
+ }
84
+
85
+ if (targetElementsDiff.has(querySelectedElement)) {
86
+ targetElementsDiff.delete(querySelectedElement);
87
+ } else {
88
+ addedElements.add(querySelectedElement);
89
+ }
90
+ }
91
+
92
+ // No changes
93
+ if (addedElements.size === 0 && targetElementsDiff.size === 0) {
94
+ return EMPTY;
95
+ }
96
+
97
+ for (const removedElement of targetElementsDiff) {
98
+ targetElements.delete(removedElement);
99
+ }
100
+ for (const addedElement of addedElements) {
101
+ targetElements.add(addedElement);
102
+ tap?.(addedElement);
103
+ }
104
+
105
+ const changes: IObservedElementsChanges<E> = {
106
+ target: [...targetElements.values()],
107
+ added: [...addedElements.values()],
108
+ removed: [...targetElementsDiff.values()],
109
+ }
110
+
111
+ return of(changes);
112
+ }
113
+
114
+ const observeQuerySelectorAll$ = concat(
115
+ defer(() => checkChanges()),
116
+ observeElementMutation(parent, { subtree: true, childList: true }).pipe(
117
+ throttleTime(0, undefined, { leading: true, trailing: true }),
118
+ mergeMap(checkChanges)
119
+ ),
120
+ )
121
+
122
+ let observeQuerySelectorAllWithRemovedWhen$ = observeQuerySelectorAll$;
123
+
124
+ if (asRemovedWhen) {
125
+ const removedObserver$ = defer(() => {
126
+ if (targetElements.size === 0) {
127
+ return EMPTY;
128
+ }
129
+ const changes: IObservedElementsChanges<E> = {
130
+ target: [],
131
+ added: [],
132
+ removed: [...targetElements.values()],
133
+ };
134
+ targetElements.clear();
135
+ return of(changes);
136
+ });
137
+
138
+ observeQuerySelectorAllWithRemovedWhen$ = asRemovedWhen.pipe(
139
+ distinctUntilChanged(),
140
+ switchMap(asRemoved => asRemoved ? removedObserver$ : observeQuerySelectorAll$),
141
+ );
142
+ }
143
+
144
+ if (project) {
145
+ return observeQuerySelectorAllWithRemovedWhen$.pipe(
146
+ mergeMapAddedElements({
147
+ project,
148
+ ...restOfStableOptions,
149
+ }),
150
+ );
151
+ }
152
+
153
+ return observeQuerySelectorAllWithRemovedWhen$;
154
+ }