ESLint: fix RxJs rule violations (pt. 1)

This commit is contained in:
Yury Bondarenko
2023-05-20 01:33:39 +02:00
parent 218ce832a9
commit 1b717e1a5c
22 changed files with 38 additions and 49 deletions

View File

@@ -1,4 +1,4 @@
import { combineLatest as observableCombineLatest, Observable, interval } from 'rxjs'; import { combineLatest as observableCombineLatest, Observable, interval, SchedulerLike, MonoTypeOperatorFunction } from 'rxjs';
import { filter, find, map, switchMap, take, takeWhile, debounce, debounceTime } from 'rxjs/operators'; import { filter, find, map, switchMap, take, takeWhile, debounce, debounceTime } from 'rxjs/operators';
import { hasNoValue, hasValue, hasValueOperator, isNotEmpty } from '../../shared/empty.util'; import { hasNoValue, hasValue, hasValueOperator, isNotEmpty } from '../../shared/empty.util';
import { SearchResult } from '../../shared/search/models/search-result.model'; import { SearchResult } from '../../shared/search/models/search-result.model';
@@ -9,7 +9,6 @@ import { MetadataSchema } from '../metadata/metadata-schema.model';
import { BrowseDefinition } from './browse-definition.model'; import { BrowseDefinition } from './browse-definition.model';
import { DSpaceObject } from './dspace-object.model'; import { DSpaceObject } from './dspace-object.model';
import { InjectionToken } from '@angular/core'; import { InjectionToken } from '@angular/core';
import { MonoTypeOperatorFunction, SchedulerLike } from 'rxjs/internal/types';
/** /**
* Use this method instead of the RxJs debounceTime if you're waiting for debouncing in tests; * Use this method instead of the RxJs debounceTime if you're waiting for debouncing in tests;

View File

@@ -4,7 +4,7 @@ import { getMockRequestService } from '../../shared/mocks/request.service.mock';
import { HALEndpointServiceStub } from '../../shared/testing/hal-endpoint-service.stub'; import { HALEndpointServiceStub } from '../../shared/testing/hal-endpoint-service.stub';
import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service'; import { RemoteDataBuildService } from '../cache/builders/remote-data-build.service';
import { ClaimedTaskDataService } from './claimed-task-data.service'; import { ClaimedTaskDataService } from './claimed-task-data.service';
import { of as observableOf } from 'rxjs/internal/observable/of'; import { of as observableOf } from 'rxjs';
import { RequestParam } from '../cache/models/request-param.model'; import { RequestParam } from '../cache/models/request-param.model';
import { getTestScheduler } from 'jasmine-marbles'; import { getTestScheduler } from 'jasmine-marbles';
import { TestScheduler } from 'rxjs/testing'; import { TestScheduler } from 'rxjs/testing';

View File

@@ -7,8 +7,7 @@ import { DsoEditMetadataFieldValuesComponent } from './dso-edit-metadata-field-v
import { DsoEditMetadataForm } from '../dso-edit-metadata-form'; import { DsoEditMetadataForm } from '../dso-edit-metadata-form';
import { DSpaceObject } from '../../../core/shared/dspace-object.model'; import { DSpaceObject } from '../../../core/shared/dspace-object.model';
import { MetadataValue } from '../../../core/shared/metadata.models'; import { MetadataValue } from '../../../core/shared/metadata.models';
import { of } from 'rxjs/internal/observable/of'; import { of, BehaviorSubject } from 'rxjs';
import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject';
import { By } from '@angular/platform-browser'; import { By } from '@angular/platform-browser';
describe('DsoEditMetadataFieldValuesComponent', () => { describe('DsoEditMetadataFieldValuesComponent', () => {

View File

@@ -1,9 +1,8 @@
import { Component, EventEmitter, Input, Output } from '@angular/core'; import { Component, EventEmitter, Input, Output } from '@angular/core';
import { DsoEditMetadataChangeType, DsoEditMetadataForm, DsoEditMetadataValue } from '../dso-edit-metadata-form'; import { DsoEditMetadataChangeType, DsoEditMetadataForm, DsoEditMetadataValue } from '../dso-edit-metadata-form';
import { Observable } from 'rxjs/internal/Observable';
import { DSpaceObject } from '../../../core/shared/dspace-object.model'; import { DSpaceObject } from '../../../core/shared/dspace-object.model';
import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject';
import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';
import { BehaviorSubject, Observable } from 'rxjs';
@Component({ @Component({
selector: 'ds-dso-edit-metadata-field-values', selector: 'ds-dso-edit-metadata-field-values',

View File

@@ -6,7 +6,7 @@ import { RouterTestingModule } from '@angular/router/testing';
import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core';
import { RelationshipDataService } from '../../../core/data/relationship-data.service'; import { RelationshipDataService } from '../../../core/data/relationship-data.service';
import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; import { DSONameService } from '../../../core/breadcrumbs/dso-name.service';
import { of } from 'rxjs/internal/observable/of'; import { of } from 'rxjs';
import { ItemMetadataRepresentation } from '../../../core/shared/metadata-representation/item/item-metadata-representation.model'; import { ItemMetadataRepresentation } from '../../../core/shared/metadata-representation/item/item-metadata-representation.model';
import { MetadataValue, VIRTUAL_METADATA_PREFIX } from '../../../core/shared/metadata.models'; import { MetadataValue, VIRTUAL_METADATA_PREFIX } from '../../../core/shared/metadata.models';
import { DsoEditMetadataChangeType, DsoEditMetadataValue } from '../dso-edit-metadata-form'; import { DsoEditMetadataChangeType, DsoEditMetadataValue } from '../dso-edit-metadata-form';

View File

@@ -1,6 +1,5 @@
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
import { DsoEditMetadataChangeType, DsoEditMetadataValue } from '../dso-edit-metadata-form'; import { DsoEditMetadataChangeType, DsoEditMetadataValue } from '../dso-edit-metadata-form';
import { Observable } from 'rxjs/internal/Observable';
import { import {
MetadataRepresentation, MetadataRepresentation,
MetadataRepresentationType MetadataRepresentationType
@@ -11,7 +10,7 @@ import { ItemMetadataRepresentation } from '../../../core/shared/metadata-repres
import { map } from 'rxjs/operators'; import { map } from 'rxjs/operators';
import { getItemPageRoute } from '../../../item-page/item-page-routing-paths'; import { getItemPageRoute } from '../../../item-page/item-page-routing-paths';
import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; import { DSONameService } from '../../../core/breadcrumbs/dso-name.service';
import { EMPTY } from 'rxjs/internal/observable/empty'; import { EMPTY, Observable } from 'rxjs';
@Component({ @Component({
selector: 'ds-dso-edit-metadata-value', selector: 'ds-dso-edit-metadata-value',

View File

@@ -15,7 +15,7 @@ import { ITEM } from '../../core/shared/item.resource-type';
import { DATA_SERVICE_FACTORY } from '../../core/data/base/data-service.decorator'; import { DATA_SERVICE_FACTORY } from '../../core/data/base/data-service.decorator';
import { Operation } from 'fast-json-patch'; import { Operation } from 'fast-json-patch';
import { RemoteData } from '../../core/data/remote-data'; import { RemoteData } from '../../core/data/remote-data';
import { Observable } from 'rxjs/internal/Observable'; import { Observable } from 'rxjs';
const ADD_BTN = 'add'; const ADD_BTN = 'add';
const REINSTATE_BTN = 'reinstate'; const REINSTATE_BTN = 'reinstate';

View File

@@ -4,11 +4,9 @@ import { DSpaceObject } from '../../core/shared/dspace-object.model';
import { DsoEditMetadataForm } from './dso-edit-metadata-form'; import { DsoEditMetadataForm } from './dso-edit-metadata-form';
import { map } from 'rxjs/operators'; import { map } from 'rxjs/operators';
import { ActivatedRoute, Data } from '@angular/router'; import { ActivatedRoute, Data } from '@angular/router';
import { combineLatest as observableCombineLatest } from 'rxjs/internal/observable/combineLatest'; import { combineLatest as observableCombineLatest, Subscription, BehaviorSubject, Observable } from 'rxjs';
import { Subscription } from 'rxjs/internal/Subscription';
import { RemoteData } from '../../core/data/remote-data'; import { RemoteData } from '../../core/data/remote-data';
import { hasNoValue, hasValue } from '../../shared/empty.util'; import { hasNoValue, hasValue } from '../../shared/empty.util';
import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject';
import { import {
getFirstCompletedRemoteData, getFirstCompletedRemoteData,
} from '../../core/shared/operators'; } from '../../core/shared/operators';
@@ -17,7 +15,6 @@ import { ResourceType } from '../../core/shared/resource-type';
import { NotificationsService } from '../../shared/notifications/notifications.service'; import { NotificationsService } from '../../shared/notifications/notifications.service';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { MetadataFieldSelectorComponent } from './metadata-field-selector/metadata-field-selector.component'; import { MetadataFieldSelectorComponent } from './metadata-field-selector/metadata-field-selector.component';
import { Observable } from 'rxjs/internal/Observable';
import { ArrayMoveChangeAnalyzer } from '../../core/data/array-move-change-analyzer.service'; import { ArrayMoveChangeAnalyzer } from '../../core/data/array-move-change-analyzer.service';
import { DATA_SERVICE_FACTORY } from '../../core/data/base/data-service.decorator'; import { DATA_SERVICE_FACTORY } from '../../core/data/base/data-service.decorator';
import { GenericConstructor } from '../../core/shared/generic-constructor'; import { GenericConstructor } from '../../core/shared/generic-constructor';

View File

@@ -16,13 +16,10 @@ import {
getFirstCompletedRemoteData, getFirstCompletedRemoteData,
metadataFieldsToString metadataFieldsToString
} from '../../../core/shared/operators'; } from '../../../core/shared/operators';
import { Observable } from 'rxjs/internal/Observable';
import { RegistryService } from '../../../core/registry/registry.service'; import { RegistryService } from '../../../core/registry/registry.service';
import { UntypedFormControl } from '@angular/forms'; import { UntypedFormControl } from '@angular/forms';
import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject';
import { hasValue } from '../../../shared/empty.util'; import { hasValue } from '../../../shared/empty.util';
import { Subscription } from 'rxjs/internal/Subscription'; import { of, Subscription, Observable, BehaviorSubject } from 'rxjs';
import { of } from 'rxjs/internal/observable/of';
import { NotificationsService } from '../../../shared/notifications/notifications.service'; import { NotificationsService } from '../../../shared/notifications/notifications.service';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model'; import { SortDirection, SortOptions } from '../../../core/cache/models/sort-options.model';

View File

@@ -75,7 +75,8 @@ export class AbstractSimpleItemActionComponent implements OnInit {
processRestResponse(response: RemoteData<any>) { processRestResponse(response: RemoteData<any>) {
if (response.hasSucceeded) { if (response.hasSucceeded) {
this.itemDataService.findById(this.item.id).pipe( this.itemDataService.findById(this.item.id).pipe(
findSuccessfulAccordingTo(this.predicate)).subscribe(() => { findSuccessfulAccordingTo((itemRd: RemoteData<Item>) => this.predicate(itemRd))
).subscribe(() => {
this.notificationsService.success(this.translateService.get('item.edit.' + this.messageKey + '.success')); this.notificationsService.success(this.translateService.get('item.edit.' + this.messageKey + '.success'));
this.router.navigate([getItemEditRoute(this.item)]); this.router.navigate([getItemEditRoute(this.item)]);
}); });

View File

@@ -1,5 +1,5 @@
import { Component, Input, OnDestroy, OnInit } from '@angular/core'; import { Component, Input, OnDestroy, OnInit } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs'; import { BehaviorSubject, Observable, Subscription } from 'rxjs';
import { filter, take } from 'rxjs/operators'; import { filter, take } from 'rxjs/operators';
import { BitstreamDataService } from '../../core/data/bitstream-data.service'; import { BitstreamDataService } from '../../core/data/bitstream-data.service';
import { PaginatedList } from '../../core/data/paginated-list.model'; import { PaginatedList } from '../../core/data/paginated-list.model';
@@ -13,7 +13,6 @@ import { hasValue } from '../../shared/empty.util';
import { followLink } from '../../shared/utils/follow-link-config.model'; import { followLink } from '../../shared/utils/follow-link-config.model';
import { MediaViewerConfig } from '../../../config/media-viewer-config.interface'; import { MediaViewerConfig } from '../../../config/media-viewer-config.interface';
import { environment } from '../../../environments/environment'; import { environment } from '../../../environments/environment';
import { Subscription } from 'rxjs/internal/Subscription';
/** /**
* This component renders the media viewers * This component renders the media viewers

View File

@@ -118,7 +118,7 @@ export class ProcessDetailComponent implements OnInit, OnDestroy {
return data.process as RemoteData<Process>; return data.process as RemoteData<Process>;
}), }),
redirectOn4xx(this.router, this.authService), redirectOn4xx(this.router, this.authService),
shareReplay(1) shareReplay({ refCount: false, bufferSize: 1 }),
); );
this.filesRD$ = this.processRD$.pipe( this.filesRD$ = this.processRD$.pipe(
@@ -141,7 +141,7 @@ export class ProcessDetailComponent implements OnInit, OnDestroy {
this.startRefreshTimer(); this.startRefreshTimer();
} }
}), }),
shareReplay(1) shareReplay({ refCount: false, bufferSize: 1 }),
); );
this.filesRD$ = this.processRD$.pipe( this.filesRD$ = this.processRD$.pipe(

View File

@@ -7,7 +7,7 @@ import {
createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject,
} from '../shared/remote-data.utils'; } from '../shared/remote-data.utils';
import { Registration } from '../core/shared/registration.model'; import { Registration } from '../core/shared/registration.model';
import { of as observableOf } from 'rxjs/internal/observable/of'; import { of as observableOf } from 'rxjs';
import { RemoteData } from '../core/data/remote-data'; import { RemoteData } from '../core/data/remote-data';
describe('RegistrationGuard', () => { describe('RegistrationGuard', () => {

View File

@@ -1,11 +1,11 @@
import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router';
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/internal/Observable';
import { EpersonRegistrationService } from '../core/data/eperson-registration.service'; import { EpersonRegistrationService } from '../core/data/eperson-registration.service';
import { AuthService } from '../core/auth/auth.service'; import { AuthService } from '../core/auth/auth.service';
import { map } from 'rxjs/operators'; import { map } from 'rxjs/operators';
import { getFirstCompletedRemoteData } from '../core/shared/operators'; import { getFirstCompletedRemoteData } from '../core/shared/operators';
import { redirectOn4xx } from '../core/shared/authorized.operators'; import { redirectOn4xx } from '../core/shared/authorized.operators';
import { Observable } from 'rxjs';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'

View File

@@ -68,7 +68,7 @@ export class AccessControlFormContainerComponent<T extends DSpaceObject> impleme
dropdownData$: Observable<BulkAccessConditionOptions> = this.bulkAccessConfigService.findByName('default').pipe( dropdownData$: Observable<BulkAccessConditionOptions> = this.bulkAccessConfigService.findByName('default').pipe(
getFirstCompletedRemoteData(), getFirstCompletedRemoteData(),
map((configRD: RemoteData<BulkAccessConditionOptions>) => configRD.hasSucceeded ? configRD.payload : null), map((configRD: RemoteData<BulkAccessConditionOptions>) => configRD.hasSucceeded ? configRD.payload : null),
shareReplay(1) shareReplay({ refCount: false, bufferSize: 1 }),
); );
/** /**

View File

@@ -63,12 +63,11 @@ export class ComcolMetadataComponent<TDomain extends Community | Collection> imp
} }
if (!isEmpty(event.operations)) { if (!isEmpty(event.operations)) {
this.dsoDataService.patch(event.dso, event.operations).pipe(getFirstCompletedRemoteData()) this.dsoDataService.patch(event.dso, event.operations).pipe(
.subscribe(async (response: RemoteData<DSpaceObject>) => { getFirstCompletedRemoteData(),
).subscribe((response: RemoteData<DSpaceObject>) => {
if (response.hasSucceeded) { if (response.hasSucceeded) {
if (!newLogo && !deleteLogo) { this.router.navigate([this.frontendURL + event.dso.uuid]); // todo: ok not to await this?
await this.router.navigate([this.frontendURL + event.dso.uuid]);
}
this.notificationsService.success(null, this.translate.get(`${this.type.value}.edit.notifications.success`)); this.notificationsService.success(null, this.translate.get(`${this.type.value}.edit.notifications.success`));
} else if (response.statusCode === 403) { } else if (response.statusCode === 403) {
this.notificationsService.error(null, this.translate.get(`${this.type.value}.edit.notifications.unauthorized`)); this.notificationsService.error(null, this.translate.get(`${this.type.value}.edit.notifications.unauthorized`));

View File

@@ -1,9 +1,9 @@
import { Component, Input } from '@angular/core'; import { Component, Input } from '@angular/core';
import { ThemedComponent } from '../../theme-support/themed.component'; import { ThemedComponent } from '../../theme-support/themed.component';
import { SearchFiltersComponent } from './search-filters.component'; import { SearchFiltersComponent } from './search-filters.component';
import { Observable } from 'rxjs/internal/Observable';
import { RemoteData } from '../../../core/data/remote-data'; import { RemoteData } from '../../../core/data/remote-data';
import { SearchFilterConfig } from '../models/search-filter-config.model'; import { SearchFilterConfig } from '../models/search-filter-config.model';
import { Observable } from 'rxjs';
/** /**
* Themed wrapper for SearchFiltersComponent * Themed wrapper for SearchFiltersComponent

View File

@@ -103,7 +103,7 @@ export class SubscriptionModalComponent implements OnInit {
this.authService.getAuthenticatedUserFromStore().pipe( this.authService.getAuthenticatedUserFromStore().pipe(
take(1), take(1),
map((ePerson) => ePerson.uuid), map((ePerson) => ePerson.uuid),
shareReplay(), shareReplay({ refCount: false }), // todo: check if this is ok
).subscribe((ePersonId: string) => { ).subscribe((ePersonId: string) => {
this.ePersonId = ePersonId; this.ePersonId = ePersonId;
if (isNotEmpty(this.subscription)) { if (isNotEmpty(this.subscription)) {

View File

@@ -1,8 +1,7 @@
import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing';
import { buildPaginatedList, PaginatedList } from '../../core/data/paginated-list.model'; import { buildPaginatedList, PaginatedList } from '../../core/data/paginated-list.model';
import { PageInfo } from '../../core/shared/page-info.model'; import { PageInfo } from '../../core/shared/page-info.model';
import { Observable } from 'rxjs/internal/Observable'; import { of as observableOf, Observable } from 'rxjs';
import { of as observableOf } from 'rxjs/internal/observable/of';
import { UnCacheableObject } from '../../core/shared/uncacheable-object.model'; import { UnCacheableObject } from '../../core/shared/uncacheable-object.model';
import { RequestEntryState } from '../../core/data/request-entry-state.model'; import { RequestEntryState } from '../../core/data/request-entry-state.model';
import { RequestEntry } from '../../core/data/request-entry.model'; import { RequestEntry } from '../../core/data/request-entry.model';

View File

@@ -11,6 +11,7 @@ import { Subject } from 'rxjs';
* Directive for setting a debounce time on an input field * Directive for setting a debounce time on an input field
* It will emit the input field's value when no changes were made to this value in a given debounce time * It will emit the input field's value when no changes were made to this value in a given debounce time
*/ */
// todo: this class is unused, consider removing it instead of fixing lint
export class DebounceDirective implements OnInit, OnDestroy { export class DebounceDirective implements OnInit, OnDestroy {
/** /**
@@ -39,10 +40,10 @@ export class DebounceDirective implements OnInit, OnDestroy {
*/ */
ngOnInit() { ngOnInit() {
this.model.valueChanges.pipe( this.model.valueChanges.pipe(
takeUntil(this.subject),
debounceTime(this.dsDebounce), debounceTime(this.dsDebounce),
distinctUntilChanged()) distinctUntilChanged(),
.subscribe((modelValue) => { takeUntil(this.subject), // todo: check if this is ok
).subscribe((modelValue) => {
if (this.model.dirty) { if (this.model.dirty) {
this.onDebounce.emit(modelValue); this.onDebounce.emit(modelValue);
} }

View File

@@ -1,7 +1,7 @@
import { Component, Input, OnInit, OnDestroy } from '@angular/core'; import { Component, Input, OnInit, OnDestroy } from '@angular/core';
import { Angulartics2 } from 'angulartics2'; import { Angulartics2 } from 'angulartics2';
import { DSpaceObject } from '../../../core/shared/dspace-object.model'; import { DSpaceObject } from '../../../core/shared/dspace-object.model';
import { Subscription } from 'rxjs/internal/Subscription'; import { Subscription } from 'rxjs';
import { take } from 'rxjs/operators'; import { take } from 'rxjs/operators';
import { hasValue } from '../../../shared/empty.util'; import { hasValue } from '../../../shared/empty.util';
import { ReferrerService } from '../../../core/services/referrer.service'; import { ReferrerService } from '../../../core/services/referrer.service';

View File

@@ -69,7 +69,7 @@ export class SubscriptionsPageComponent implements OnInit, OnDestroy {
this.ePersonId$ = this.authService.getAuthenticatedUserFromStore().pipe( this.ePersonId$ = this.authService.getAuthenticatedUserFromStore().pipe(
take(1), take(1),
map((ePerson: EPerson) => ePerson.id), map((ePerson: EPerson) => ePerson.id),
shareReplay() shareReplay({ refCount: false }),
); );
this.retrieveSubscriptions(); this.retrieveSubscriptions();
} }