Skip to content

Commit a2531e5

Browse files
authored
Merge pull request #2343 from ybnd/more-eslint
Stricter ESLint configuration for code quality, consistency & cleaner merges
2 parents a9c58a1 + 33d5253 commit a2531e5

File tree

2,696 files changed

+51862
-35794
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

2,696 files changed

+51862
-35794
lines changed

.eslintrc.json

Lines changed: 55 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@
88
"eslint-plugin-deprecation",
99
"unused-imports",
1010
"eslint-plugin-lodash",
11-
"eslint-plugin-jsonc"
11+
"eslint-plugin-jsonc",
12+
"eslint-plugin-rxjs",
13+
"eslint-plugin-simple-import-sort",
14+
"eslint-plugin-import-newlines"
1215
],
1316
"overrides": [
1417
{
@@ -27,17 +30,29 @@
2730
"plugin:@typescript-eslint/recommended",
2831
"plugin:@typescript-eslint/recommended-requiring-type-checking",
2932
"plugin:@angular-eslint/recommended",
30-
"plugin:@angular-eslint/template/process-inline-templates"
33+
"plugin:@angular-eslint/template/process-inline-templates",
34+
"plugin:rxjs/recommended"
3135
],
3236
"rules": {
37+
"indent": [
38+
"error",
39+
2,
40+
{
41+
"SwitchCase": 1
42+
}
43+
],
3344
"max-classes-per-file": [
3445
"error",
3546
1
3647
],
3748
"comma-dangle": [
38-
"off",
49+
"error",
3950
"always-multiline"
4051
],
52+
"object-curly-spacing": [
53+
"error",
54+
"always"
55+
],
4156
"eol-last": [
4257
"error",
4358
"always"
@@ -104,15 +119,13 @@
104119
"allowTernary": true
105120
}
106121
],
107-
"prefer-const": "off", // todo: re-enable & fix errors (more strict than it used to be in TSLint)
122+
"prefer-const": "error",
123+
"no-case-declarations": "error",
124+
"no-extra-boolean-cast": "error",
108125
"prefer-spread": "off",
109126
"no-underscore-dangle": "off",
110-
111-
// todo: disabled rules from eslint:recommended, consider re-enabling & fixing
112127
"no-prototype-builtins": "off",
113128
"no-useless-escape": "off",
114-
"no-case-declarations": "off",
115-
"no-extra-boolean-cast": "off",
116129

117130
"@angular-eslint/directive-selector": [
118131
"error",
@@ -183,7 +196,7 @@
183196
],
184197
"@typescript-eslint/type-annotation-spacing": "error",
185198
"@typescript-eslint/unified-signatures": "error",
186-
"@typescript-eslint/ban-types": "warn", // todo: deal with {} type issues & re-enable
199+
"@typescript-eslint/ban-types": "error",
187200
"@typescript-eslint/no-floating-promises": "warn",
188201
"@typescript-eslint/no-misused-promises": "warn",
189202
"@typescript-eslint/restrict-plus-operands": "warn",
@@ -203,14 +216,45 @@
203216

204217
"deprecation/deprecation": "warn",
205218

219+
"simple-import-sort/imports": "error",
220+
"simple-import-sort/exports": "error",
206221
"import/order": "off",
222+
"import/first": "error",
223+
"import/newline-after-import": "error",
224+
"import/no-duplicates": "error",
207225
"import/no-deprecated": "warn",
208226
"import/no-namespace": "error",
227+
"import-newlines/enforce": [
228+
"error",
229+
{
230+
"items": 1,
231+
"semi": true,
232+
"forceSingleLine": true
233+
}
234+
],
235+
209236
"unused-imports/no-unused-imports": "error",
210237
"lodash/import-scope": [
211238
"error",
212239
"method"
213-
]
240+
],
241+
242+
"rxjs/no-nested-subscribe": "off" // todo: go over _all_ cases
243+
}
244+
},
245+
{
246+
"files": [
247+
"*.spec.ts"
248+
],
249+
"parserOptions": {
250+
"project": [
251+
"./tsconfig.json",
252+
"./cypress/tsconfig.json"
253+
],
254+
"createDefaultProgram": true
255+
},
256+
"rules": {
257+
"prefer-const": "off"
214258
}
215259
},
216260
{
@@ -219,12 +263,7 @@
219263
],
220264
"extends": [
221265
"plugin:@angular-eslint/template/recommended"
222-
],
223-
"rules": {
224-
// todo: re-enable & fix errors
225-
"@angular-eslint/template/no-negated-async": "off",
226-
"@angular-eslint/template/eqeqeq": "off"
227-
}
266+
]
228267
},
229268
{
230269
"files": [

cypress/support/e2e.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import './commands';
2121
import 'cypress-axe';
2222
import { DSPACE_XSRF_COOKIE } from 'src/app/core/xsrf/xsrf.constants';
2323

24-
2524
// Runs once before all tests
2625
before(() => {
2726
// Cypress doesn't have access to the running application in Node.js.

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,12 @@
170170
"eslint": "^8.39.0",
171171
"eslint-plugin-deprecation": "^1.4.1",
172172
"eslint-plugin-import": "^2.27.5",
173+
"eslint-plugin-import-newlines": "^1.3.1",
173174
"eslint-plugin-jsdoc": "^45.0.0",
174175
"eslint-plugin-jsonc": "^2.6.0",
175176
"eslint-plugin-lodash": "^7.4.0",
177+
"eslint-plugin-rxjs": "^5.0.3",
178+
"eslint-plugin-simple-import-sort": "^10.0.0",
176179
"eslint-plugin-unused-imports": "^2.0.0",
177180
"express-static-gzip": "^2.1.7",
178181
"jasmine-core": "^3.8.0",

src/app/access-control/access-control-routing-paths.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { URLCombiner } from '../core/url-combiner/url-combiner';
21
import { getAccessControlModuleRoute } from '../app-routing-paths';
2+
import { URLCombiner } from '../core/url-combiner/url-combiner';
33

44
export const EPERSON_PATH = 'epeople';
55

src/app/access-control/access-control-routing.module.ts

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
import { NgModule } from '@angular/core';
22
import { RouterModule } from '@angular/router';
3-
import { EPeopleRegistryComponent } from './epeople-registry/epeople-registry.component';
4-
import { GroupFormComponent } from './group-registry/group-form/group-form.component';
5-
import { GroupsRegistryComponent } from './group-registry/groups-registry.component';
6-
import { EPERSON_PATH, GROUP_PATH } from './access-control-routing-paths';
3+
74
import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver';
8-
import { GroupPageGuard } from './group-registry/group-page.guard';
5+
import { GroupAdministratorGuard } from '../core/data/feature-authorization/feature-authorization-guard/group-administrator.guard';
6+
import { SiteAdministratorGuard } from '../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard';
97
import {
10-
GroupAdministratorGuard
11-
} from '../core/data/feature-authorization/feature-authorization-guard/group-administrator.guard';
12-
import {
13-
SiteAdministratorGuard
14-
} from '../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard';
8+
EPERSON_PATH,
9+
GROUP_PATH,
10+
} from './access-control-routing-paths';
1511
import { BulkAccessComponent } from './bulk-access/bulk-access.component';
12+
import { EPeopleRegistryComponent } from './epeople-registry/epeople-registry.component';
1613
import { EPersonFormComponent } from './epeople-registry/eperson-form/eperson-form.component';
1714
import { EPersonResolver } from './epeople-registry/eperson-resolver.service';
15+
import { GroupFormComponent } from './group-registry/group-form/group-form.component';
16+
import { GroupPageGuard } from './group-registry/group-page.guard';
17+
import { GroupsRegistryComponent } from './group-registry/groups-registry.component';
1818

1919
@NgModule({
2020
imports: [
@@ -23,10 +23,10 @@ import { EPersonResolver } from './epeople-registry/eperson-resolver.service';
2323
path: EPERSON_PATH,
2424
component: EPeopleRegistryComponent,
2525
resolve: {
26-
breadcrumb: I18nBreadcrumbResolver
26+
breadcrumb: I18nBreadcrumbResolver,
2727
},
2828
data: { title: 'admin.access-control.epeople.title', breadcrumbKey: 'admin.access-control.epeople' },
29-
canActivate: [SiteAdministratorGuard]
29+
canActivate: [SiteAdministratorGuard],
3030
},
3131
{
3232
path: `${EPERSON_PATH}/create`,
@@ -51,40 +51,40 @@ import { EPersonResolver } from './epeople-registry/eperson-resolver.service';
5151
path: GROUP_PATH,
5252
component: GroupsRegistryComponent,
5353
resolve: {
54-
breadcrumb: I18nBreadcrumbResolver
54+
breadcrumb: I18nBreadcrumbResolver,
5555
},
5656
data: { title: 'admin.access-control.groups.title', breadcrumbKey: 'admin.access-control.groups' },
57-
canActivate: [GroupAdministratorGuard]
57+
canActivate: [GroupAdministratorGuard],
5858
},
5959
{
6060
path: `${GROUP_PATH}/create`,
6161
component: GroupFormComponent,
6262
resolve: {
63-
breadcrumb: I18nBreadcrumbResolver
63+
breadcrumb: I18nBreadcrumbResolver,
6464
},
6565
data: { title: 'admin.access-control.groups.title.addGroup', breadcrumbKey: 'admin.access-control.groups.addGroup' },
66-
canActivate: [GroupAdministratorGuard]
66+
canActivate: [GroupAdministratorGuard],
6767
},
6868
{
6969
path: `${GROUP_PATH}/:groupId/edit`,
7070
component: GroupFormComponent,
7171
resolve: {
72-
breadcrumb: I18nBreadcrumbResolver
72+
breadcrumb: I18nBreadcrumbResolver,
7373
},
7474
data: { title: 'admin.access-control.groups.title.singleGroup', breadcrumbKey: 'admin.access-control.groups.singleGroup' },
75-
canActivate: [GroupPageGuard]
75+
canActivate: [GroupPageGuard],
7676
},
7777
{
7878
path: 'bulk-access',
7979
component: BulkAccessComponent,
8080
resolve: {
81-
breadcrumb: I18nBreadcrumbResolver
81+
breadcrumb: I18nBreadcrumbResolver,
8282
},
8383
data: { title: 'admin.access-control.bulk-access.title', breadcrumbKey: 'admin.access-control.bulk-access' },
84-
canActivate: [SiteAdministratorGuard]
84+
canActivate: [SiteAdministratorGuard],
8585
},
86-
])
87-
]
86+
]),
87+
],
8888
})
8989
/**
9090
* Routing module for the AccessControl section of the admin sidebar

src/app/access-control/access-control.module.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,27 @@
11
import { CommonModule } from '@angular/common';
22
import { NgModule } from '@angular/core';
3+
import { AbstractControl } from '@angular/forms';
34
import { RouterModule } from '@angular/router';
5+
import { NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap';
6+
import {
7+
DYNAMIC_ERROR_MESSAGES_MATCHER,
8+
DynamicErrorMessagesMatcher,
9+
} from '@ng-dynamic-forms/core';
10+
11+
import { AccessControlFormModule } from '../shared/access-control-form-container/access-control-form.module';
12+
import { FormModule } from '../shared/form/form.module';
13+
import { SearchModule } from '../shared/search/search.module';
414
import { SharedModule } from '../shared/shared.module';
515
import { AccessControlRoutingModule } from './access-control-routing.module';
16+
import { BulkAccessBrowseComponent } from './bulk-access/browse/bulk-access-browse.component';
17+
import { BulkAccessComponent } from './bulk-access/bulk-access.component';
18+
import { BulkAccessSettingsComponent } from './bulk-access/settings/bulk-access-settings.component';
619
import { EPeopleRegistryComponent } from './epeople-registry/epeople-registry.component';
720
import { EPersonFormComponent } from './epeople-registry/eperson-form/eperson-form.component';
821
import { GroupFormComponent } from './group-registry/group-form/group-form.component';
922
import { MembersListComponent } from './group-registry/group-form/members-list/members-list.component';
1023
import { SubgroupsListComponent } from './group-registry/group-form/subgroup-list/subgroups-list.component';
1124
import { GroupsRegistryComponent } from './group-registry/groups-registry.component';
12-
import { FormModule } from '../shared/form/form.module';
13-
import { DYNAMIC_ERROR_MESSAGES_MATCHER, DynamicErrorMessagesMatcher } from '@ng-dynamic-forms/core';
14-
import { AbstractControl } from '@angular/forms';
15-
import { BulkAccessComponent } from './bulk-access/bulk-access.component';
16-
import { NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap';
17-
import { BulkAccessBrowseComponent } from './bulk-access/browse/bulk-access-browse.component';
18-
import { BulkAccessSettingsComponent } from './bulk-access/settings/bulk-access-settings.component';
19-
import { SearchModule } from '../shared/search/search.module';
20-
import { AccessControlFormModule } from '../shared/access-control-form-container/access-control-form.module';
2125

2226
/**
2327
* Condition for displaying error messages on email form field
@@ -55,9 +59,9 @@ export const ValidateEmailErrorStateMatcher: DynamicErrorMessagesMatcher =
5559
providers: [
5660
{
5761
provide: DYNAMIC_ERROR_MESSAGES_MATCHER,
58-
useValue: ValidateEmailErrorStateMatcher
62+
useValue: ValidateEmailErrorStateMatcher,
5963
},
60-
]
64+
],
6165
})
6266
/**
6367
* This module handles all components related to the access control pages

src/app/access-control/bulk-access/browse/bulk-access-browse.component.spec.ts

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
1-
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
21
import { NO_ERRORS_SCHEMA } from '@angular/core';
3-
4-
import { of } from 'rxjs';
5-
import { NgbAccordionModule, NgbNavModule } from '@ng-bootstrap/ng-bootstrap';
2+
import {
3+
ComponentFixture,
4+
TestBed,
5+
waitForAsync,
6+
} from '@angular/core/testing';
7+
import {
8+
NgbAccordionModule,
9+
NgbNavModule,
10+
} from '@ng-bootstrap/ng-bootstrap';
611
import { TranslateModule } from '@ngx-translate/core';
12+
import { of } from 'rxjs';
713

8-
import { BulkAccessBrowseComponent } from './bulk-access-browse.component';
14+
import { buildPaginatedList } from '../../../core/data/paginated-list.model';
15+
import { PageInfo } from '../../../core/shared/page-info.model';
916
import { SelectableListService } from '../../../shared/object-list/selectable-list/selectable-list.service';
1017
import { SelectableObject } from '../../../shared/object-list/selectable-list/selectable-list.service.spec';
11-
import { PageInfo } from '../../../core/shared/page-info.model';
12-
import { buildPaginatedList } from '../../../core/data/paginated-list.model';
1318
import { createSuccessfulRemoteDataObject } from '../../../shared/remote-data.utils';
19+
import { BulkAccessBrowseComponent } from './bulk-access-browse.component';
1420

1521
describe('BulkAccessBrowseComponent', () => {
1622
let component: BulkAccessBrowseComponent;
@@ -31,13 +37,13 @@ describe('BulkAccessBrowseComponent', () => {
3137
imports: [
3238
NgbAccordionModule,
3339
NgbNavModule,
34-
TranslateModule.forRoot()
40+
TranslateModule.forRoot(),
3541
],
3642
declarations: [BulkAccessBrowseComponent],
37-
providers: [ { provide: SelectableListService, useValue: selectableListService }, ],
43+
providers: [ { provide: SelectableListService, useValue: selectableListService } ],
3844
schemas: [
39-
NO_ERRORS_SCHEMA
40-
]
45+
NO_ERRORS_SCHEMA,
46+
],
4147
}).compileComponents();
4248
}));
4349

@@ -72,7 +78,7 @@ describe('BulkAccessBrowseComponent', () => {
7278
'elementsPerPage': 5,
7379
'totalElements': 2,
7480
'totalPages': 1,
75-
'currentPage': 1
81+
'currentPage': 1,
7682
}), [selected1, selected2]) ;
7783
const rd = createSuccessfulRemoteDataObject(list);
7884

0 commit comments

Comments
 (0)