Skip to content

Commit 4172abd

Browse files
authored
add eslint (#3421)
* add eslint * cleanup build.ts
1 parent 596e208 commit 4172abd

File tree

140 files changed

+1802
-1133
lines changed

Some content is hidden

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

140 files changed

+1802
-1133
lines changed

Diff for: angular.json

+7-13
Original file line numberDiff line numberDiff line change
@@ -27,23 +27,17 @@
2727
"karmaConfig": "karma.conf.js"
2828
}
2929
},
30-
"lint": {
31-
"builder": "@angular-devkit/build-angular:tslint",
32-
"options": {
33-
"tsConfig": [
34-
"tsconfig.json",
35-
"tsconfig.spec.json"
36-
],
37-
"exclude": [
38-
"**/node_modules/**"
39-
]
40-
}
41-
}
30+
"lint": {
31+
"builder": "@angular-eslint/builder:lint",
32+
"options": {
33+
"lintFilePatterns": ["src/**/*.ts", "src/**/*.html"]
34+
}
35+
}
4236
}
4337
}
4438
},
4539
"cli": {
4640
"packageManager": "yarn",
4741
"analytics": "86795b8f-9036-4a53-929c-a7303453d677"
4842
}
49-
}
43+
}

Diff for: eslint.config.js

+109
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
const tsParser = require('@typescript-eslint/parser');
2+
const js = require('@eslint/js');
3+
const globals = require('globals');
4+
const ts = require('@typescript-eslint/eslint-plugin');
5+
const ng = require('@angular-eslint/eslint-plugin');
6+
const esImport = require('eslint-plugin-import');
7+
8+
module.exports = [
9+
{
10+
files: ['**/*.ts'],
11+
plugins: {
12+
'@typescript-eslint': ts,
13+
'@angular-eslint': ng,
14+
import: esImport,
15+
},
16+
languageOptions: {
17+
parser: tsParser,
18+
globals: {
19+
...globals.browser,
20+
},
21+
parserOptions: {
22+
project: ['tsconfig.build.json', 'tsconfig.json', 'tsconfig.spec.json'],
23+
},
24+
},
25+
rules: {
26+
...js.configs.recommended.rules,
27+
...ts.configs['recommended-requiring-type-checking'].rules,
28+
...ts.configs['stylistic-type-checked'].rules,
29+
...ng.configs.recommended.rules,
30+
...esImport.configs.errors.rules,
31+
// eslint/js rules
32+
'no-undef': 'off',
33+
'no-redeclare': 'off',
34+
'prefer-arrow-callback': 'error',
35+
'curly': 'error',
36+
'no-dupe-class-members': 'off',
37+
"no-restricted-imports": ["error", "rxjs/Rx"],
38+
"no-console": ["error", {allow: ['log', 'error', 'warn']}],
39+
'sort-imports': [
40+
'error',
41+
{
42+
ignoreDeclarationSort: true,
43+
},
44+
],
45+
// @typescript-eslint rules
46+
'@typescript-eslint/prefer-nullish-coalescing': 'off', // require `strictNullChecks`
47+
'@typescript-eslint/no-explicit-any': 'off',
48+
'@typescript-eslint/no-unsafe-assignment': 'off',
49+
'@typescript-eslint/no-unsafe-member-access': 'off',
50+
'@typescript-eslint/no-unsafe-call': 'off',
51+
'@typescript-eslint/no-unsafe-return': 'off',
52+
'@typescript-eslint/no-unsafe-declaration-merging': 'off',
53+
'@typescript-eslint/no-unsafe-argument': 'off',
54+
'@typescript-eslint/no-floating-promises': 'off',
55+
'@typescript-eslint/no-unnecessary-type-assertion': 'off',
56+
'@typescript-eslint/no-redundant-type-constituents': 'off', // causing pipeline error in src/compat/firestore/utils.spec.ts
57+
'@typescript-eslint/no-non-null-assertion': 'error',
58+
"@typescript-eslint/member-ordering": ["error", {
59+
"default": [
60+
"static-field",
61+
"instance-field",
62+
"static-method",
63+
"instance-method"
64+
]
65+
}],
66+
'@typescript-eslint/no-unused-vars': [
67+
'error', {args: "after-used", "argsIgnorePattern": "^_"}
68+
],
69+
// @angular-eslint rules
70+
'@angular-eslint/directive-selector': [
71+
'error',
72+
{
73+
type: 'attribute',
74+
prefix: 'app',
75+
style: 'camelCase',
76+
},
77+
],
78+
'@angular-eslint/component-selector': [
79+
'error',
80+
{
81+
type: 'element',
82+
prefix: 'app',
83+
style: 'kebab-case',
84+
},
85+
],
86+
// import rules
87+
'import/no-unresolved': 'off',
88+
'import/namespace': 'off',
89+
'import/default': 'off',
90+
'import/export': 'off',
91+
'import/newline-after-import': 'error',
92+
'import/order': [
93+
'error',
94+
{
95+
alphabetize: {order: 'asc'},
96+
"newlines-between": "never"
97+
},
98+
],
99+
},
100+
},
101+
{
102+
files: ['**/*.spec.ts'],
103+
languageOptions: {
104+
globals: {
105+
...globals.jasmine,
106+
},
107+
},
108+
},
109+
];

Diff for: package.json

+8-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"test:safari": "npx --yes firebase-tools emulators:exec --project=demo123 \"ng test --watch=false --browsers=SafariNative\"",
1212
"test:chrome-headless": "npx --yes firebase-tools emulators:exec --project=demo123 \"ng test --watch=false --browsers=ChromeHeadless\"",
1313
"test:firefox-headless": "npx --yes firebase-tools emulators:exec --project=demo123 \"ng test --watch=false --browsers=FirefoxHeadless\"",
14-
"lint": "echo 'todo: fix tslint -> eslint'",
14+
"lint": "ng lint",
1515
"test:node": "node -r tsconfig-paths/register ./dist/out-tsc/jasmine/tools/jasmine.mjs --input-type=commonjs",
1616
"test:node-esm": "node -r tsconfig-paths/register ./dist/out-tsc/jasmine/tools/jasmine.mjs",
1717
"test:typings": "node ./tools/run-typings-test.js",
@@ -77,6 +77,8 @@
7777
},
7878
"devDependencies": {
7979
"@angular-devkit/build-angular": "^16.0.0",
80+
"@angular-eslint/builder": "^16.1.1",
81+
"@angular-eslint/eslint-plugin": "^16.1.1",
8082
"@angular-eslint/schematics": "16.0.3",
8183
"@angular/animations": "~16.0.0",
8284
"@angular/cli": "^16.0.0",
@@ -92,12 +94,17 @@
9294
"@types/semver": "^7.1.0",
9395
"@types/triple-beam": "^1.3.0",
9496
"@types/winston": "^2.4.4",
97+
"@typescript-eslint/eslint-plugin": "^6.5.0",
98+
"@typescript-eslint/parser": "^6.5.0",
9599
"codelyzer": "^6.0.0",
96100
"concurrently": "^2.2.0",
97101
"conventional-changelog-cli": "^1.2.0",
98102
"cross-spawn": "^7.0.3",
103+
"eslint": "^8.48.0",
104+
"eslint-plugin-import": "^2.28.1",
99105
"file-loader": "^6.2.0",
100106
"firebase-functions-test": "^0.2.2",
107+
"globals": "^13.21.0",
101108
"globalthis": "^1.0.1",
102109
"gzip-size": "^5.1.1",
103110
"jasmine": "^5.0.0",

Diff for: src/analytics/analytics.module.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import { NgModule, Optional, NgZone, InjectionToken, ModuleWithProviders, APP_INITIALIZER, Injector } from '@angular/core';
1+
import { APP_INITIALIZER, InjectionToken, Injector, ModuleWithProviders, NgModule, NgZone, Optional } from '@angular/core';
2+
import { VERSION, ɵAngularFireSchedulers, ɵgetDefaultInstanceOf } from '@angular/fire';
3+
import { FirebaseApp, FirebaseApps } from '@angular/fire/app';
24
import { Analytics as FirebaseAnalytics } from 'firebase/analytics';
3-
import { ɵgetDefaultInstanceOf, ɵAngularFireSchedulers, VERSION } from '@angular/fire';
4-
import { Analytics, ANALYTICS_PROVIDER_NAME, AnalyticsInstances } from './analytics';
5-
import { FirebaseApps, FirebaseApp } from '@angular/fire/app';
65
import { registerVersion } from 'firebase/app';
6+
import { ANALYTICS_PROVIDER_NAME, Analytics, AnalyticsInstances } from './analytics';
7+
import { isAnalyticsSupportedFactory } from './is-analytics-supported-factory';
78
import { ScreenTrackingService } from './screen-tracking.service';
89
import { UserTrackingService } from './user-tracking.service';
9-
import { isAnalyticsSupportedFactory } from './is-analytics-supported-factory';
1010

1111
export const PROVIDED_ANALYTICS_INSTANCES = new InjectionToken<Analytics[]>('angularfire2.analytics-instances');
1212

Diff for: src/analytics/analytics.spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { TestBed } from '@angular/core/testing';
2-
import { FirebaseApp, provideFirebaseApp, getApp, initializeApp, deleteApp } from '@angular/fire/app';
3-
import { Analytics, provideAnalytics, getAnalytics, isSupported } from '@angular/fire/analytics';
2+
import { Analytics, getAnalytics, isSupported, provideAnalytics } from '@angular/fire/analytics';
3+
import { FirebaseApp, getApp, initializeApp, provideFirebaseApp } from '@angular/fire/app';
44
import { COMMON_CONFIG_TOO } from '../test-config';
55
import { rando } from '../utils';
66

Diff for: src/analytics/analytics.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { Analytics as FirebaseAnalytics } from 'firebase/analytics';
21
import { ɵgetAllInstancesOf } from '@angular/fire';
2+
import { Analytics as FirebaseAnalytics } from 'firebase/analytics';
33
import { from, timer } from 'rxjs';
44
import { concatMap, distinct } from 'rxjs/operators';
55

66
// see notes in core/firebase.app.module.ts for why we're building the class like this
7-
// tslint:disable-next-line:no-empty-interface
7+
// eslint-disable-next-line @typescript-eslint/no-empty-interface
88
export interface Analytics extends FirebaseAnalytics {}
99

1010
export class Analytics {
@@ -15,7 +15,7 @@ export class Analytics {
1515

1616
export const ANALYTICS_PROVIDER_NAME = 'analytics';
1717

18-
// tslint:disable-next-line:no-empty-interface
18+
// eslint-disable-next-line @typescript-eslint/no-empty-interface
1919
export interface AnalyticsInstances extends Array<FirebaseAnalytics> {}
2020

2121
export class AnalyticsInstances {

Diff for: src/analytics/firebase.ts

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: src/analytics/screen-tracking.service.ts

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
import { ComponentFactoryResolver, Injectable, NgZone, OnDestroy, Optional, Injector } from '@angular/core';
2-
import { of, Subscription, Observable } from 'rxjs';
3-
import { distinctUntilChanged, filter, groupBy, map, mergeMap, pairwise, startWith, switchMap } from 'rxjs/operators';
4-
import { ActivationEnd, Router, ɵEmptyOutletComponent } from '@angular/router';
5-
import { Title } from '@angular/platform-browser';
1+
import { ComponentFactoryResolver, Injectable, Injector, NgZone, OnDestroy, Optional } from '@angular/core';
62
import { VERSION } from '@angular/fire';
3+
import { Title } from '@angular/platform-browser';
4+
import { ActivationEnd, Router, ɵEmptyOutletComponent } from '@angular/router';
75
import { registerVersion } from 'firebase/app';
8-
6+
import { Observable, Subscription, of } from 'rxjs';
7+
import { distinctUntilChanged, filter, groupBy, map, mergeMap, pairwise, startWith, switchMap } from 'rxjs/operators';
98
import { Analytics } from './analytics';
10-
import { logEvent, isSupported } from './firebase';
9+
import { isSupported, logEvent } from './firebase';
1110
import { UserTrackingService } from './user-tracking.service';
1211

1312
const FIREBASE_EVENT_ORIGIN_KEY = 'firebase_event_origin';
@@ -29,14 +28,15 @@ const SCREEN_INSTANCE_DELIMITER = '#';
2928
// this is an INT64 in iOS/Android but use INT32 cause javascript
3029
let nextScreenInstanceID = Math.floor(Math.random() * (2 ** 32 - 1)) - 2 ** 31;
3130

32-
const knownScreenInstanceIDs: { [key: string]: number } = {};
31+
const knownScreenInstanceIDs: Record<string, number> = {};
3332

34-
const getScreenInstanceID = (params: { [key: string]: any }) => {
33+
const getScreenInstanceID = (params: Record<string, any>) => {
3534
// unique the screen class against the outlet name
3635
const screenInstanceKey = [
3736
params[SCREEN_CLASS_KEY],
3837
params[OUTLET_KEY]
3938
].join(SCREEN_INSTANCE_DELIMITER);
39+
// eslint-disable-next-line no-prototype-builtins
4040
if (knownScreenInstanceIDs.hasOwnProperty(screenInstanceKey)) {
4141
return knownScreenInstanceIDs[screenInstanceKey];
4242
} else {

Diff for: src/analytics/user-tracking.service.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
import { Injectable, Injector, NgZone, OnDestroy } from '@angular/core';
2-
import { Subscription } from 'rxjs';
32
import { VERSION } from '@angular/fire';
43
import { Auth, authState } from '@angular/fire/auth';
54
import { registerVersion } from 'firebase/app';
6-
5+
import { Subscription } from 'rxjs';
76
import { Analytics } from './analytics';
8-
import { setUserId, isSupported } from './firebase';
7+
import { isSupported, setUserId } from './firebase';
98

109
@Injectable()
1110
export class UserTrackingService implements OnDestroy {
1211

1312
public readonly initialized: Promise<void>;
14-
private disposables: Array<Subscription> = [];
13+
private disposables: Subscription[] = [];
1514

1615
constructor(
1716
auth: Auth,

Diff for: src/app-check/app-check.module.ts

+6-7
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { NgModule, Optional, NgZone, InjectionToken, ModuleWithProviders, PLATFORM_ID, isDevMode, Injector } from '@angular/core';
1+
import { isPlatformServer } from '@angular/common';
2+
import { InjectionToken, Injector, ModuleWithProviders, NgModule, NgZone, Optional, PLATFORM_ID, isDevMode } from '@angular/core';
3+
import { VERSION, ɵAPP_CHECK_PROVIDER_NAME, ɵAngularFireSchedulers, ɵAppCheckInstances, ɵgetDefaultInstanceOf } from '@angular/fire';
4+
import { FirebaseApp, FirebaseApps } from '@angular/fire/app';
5+
import { registerVersion } from 'firebase/app';
26
import { AppCheck as FirebaseAppCheck } from 'firebase/app-check';
3-
import { ɵgetDefaultInstanceOf, ɵAngularFireSchedulers, ɵAppCheckInstances, ɵAPP_CHECK_PROVIDER_NAME, VERSION } from '@angular/fire';
47
import { AppCheck } from './app-check';
5-
import { FirebaseApps, FirebaseApp } from '@angular/fire/app';
6-
import { registerVersion } from 'firebase/app';
7-
import { isPlatformServer } from '@angular/common';
88

99
export const PROVIDED_APP_CHECK_INSTANCES = new InjectionToken<AppCheck[]>('angularfire2.app-check-instances');
1010

@@ -17,8 +17,7 @@ const LOCALHOSTS = ['localhost', '0.0.0.0', '127.0.0.1'];
1717
const isLocalhost = typeof window !== 'undefined' && LOCALHOSTS.includes(window.location.hostname);
1818

1919
export function appCheckInstanceFactory(fn: (injector: Injector) => FirebaseAppCheck) {
20-
// tslint:disable-next-line:ban-types
21-
return (zone: NgZone, injector: Injector, platformId: Object) => {
20+
return (zone: NgZone, injector: Injector, platformId: unknown) => {
2221
// Node should use admin token provider, browser devmode and localhost should use debug token
2322
if (!isPlatformServer(platformId) && (isDevMode() || isLocalhost)) {
2423
globalThis.FIREBASE_APPCHECK_DEBUG_TOKEN ??= true;

Diff for: src/app-check/app-check.spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { TestBed } from '@angular/core/testing';
2-
import { FirebaseApp, provideFirebaseApp, getApp, initializeApp, deleteApp } from '@angular/fire/app';
3-
import { Auth, provideAuth, getAuth, connectAuthEmulator } from '@angular/fire/auth';
2+
import { FirebaseApp, getApp, initializeApp, provideFirebaseApp } from '@angular/fire/app';
3+
import { Auth, connectAuthEmulator, getAuth, provideAuth } from '@angular/fire/auth';
44
import { COMMON_CONFIG } from '../test-config';
55
import { rando } from '../utils';
66

Diff for: src/app-check/app-check.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1+
import { ɵAPP_CHECK_PROVIDER_NAME, ɵgetAllInstancesOf } from '@angular/fire';
12
import { AppCheck as FirebaseAppCheck } from 'firebase/app-check';
2-
import { ɵgetAllInstancesOf, ɵAPP_CHECK_PROVIDER_NAME } from '@angular/fire';
33
import { from, timer } from 'rxjs';
44
import { concatMap, distinct } from 'rxjs/operators';
55

66
// see notes in core/firebase.app.module.ts for why we're building the class like this
7-
// tslint:disable-next-line:no-empty-interface
7+
// eslint-disable-next-line @typescript-eslint/no-empty-interface
88
export interface AppCheck extends FirebaseAppCheck {}
99

1010
export class AppCheck {

Diff for: src/app/app.module.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,15 @@ import {
33
InjectionToken,
44
Injector,
55
ModuleWithProviders,
6+
VERSION as NG_VERSION,
67
NgModule,
78
NgZone,
89
Optional,
910
PLATFORM_ID,
10-
VERSION as NG_VERSION,
1111
} from '@angular/core';
12+
import { VERSION, ɵAngularFireSchedulers } from '@angular/fire';
1213
import { FirebaseApp as IFirebaseApp, getApp, registerVersion } from 'firebase/app';
13-
1414
import { FirebaseApp, FirebaseApps } from './app';
15-
import { VERSION, ɵAngularFireSchedulers } from '@angular/fire';
1615

1716
export function defaultFirebaseAppFactory(provided: FirebaseApp[]|undefined) {
1817
// Use the provided app, if there is only one, otherwise fetch the default app
@@ -23,7 +22,7 @@ export function defaultFirebaseAppFactory(provided: FirebaseApp[]|undefined) {
2322
// With FIREBASE_APPS I wanted to capture the default app instance, if it is initialized by
2423
// the reserved URL; ɵPROVIDED_FIREBASE_APPS is not for public consumption and serves to ensure that all
2524
// provideFirebaseApp(...) calls are satisfied before FirebaseApp$ or FirebaseApp is resolved
26-
export const PROVIDED_FIREBASE_APPS = new InjectionToken<Array<FirebaseApp>>('angularfire2._apps');
25+
export const PROVIDED_FIREBASE_APPS = new InjectionToken<FirebaseApp[]>('angularfire2._apps');
2726

2827
// Injecting FirebaseApp will now only inject the default Firebase App
2928
// this allows allows beginners to import /__/firebase/init.js to auto initialize Firebase App
@@ -57,10 +56,11 @@ export function firebaseAppFactory(fn: (injector: Injector) => IFirebaseApp) {
5756
]
5857
})
5958
export class FirebaseAppModule {
60-
// tslint:disable-next-line:ban-types
59+
// eslint-disable-next-line @typescript-eslint/ban-types
6160
constructor(@Inject(PLATFORM_ID) platformId: Object) {
6261
registerVersion('angularfire', VERSION.full, 'core');
6362
registerVersion('angularfire', VERSION.full, 'app');
63+
// eslint-disable-next-line @typescript-eslint/no-base-to-string
6464
registerVersion('angular', NG_VERSION.full, platformId.toString());
6565
}
6666
}

Diff for: src/app/app.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { TestBed } from '@angular/core/testing';
2-
import { FirebaseApp, provideFirebaseApp, initializeApp, deleteApp } from '@angular/fire/app';
2+
import { FirebaseApp, initializeApp, provideFirebaseApp } from '@angular/fire/app';
33
import { COMMON_CONFIG } from '../test-config';
44
import { rando } from '../utils';
55

0 commit comments

Comments
 (0)