Skip to content

Commit 7c75dcf

Browse files
fix(eslint-plugin): include signals to ESLint v8 rules (#4387)
Closes #4385
1 parent a19d579 commit 7c75dcf

File tree

20 files changed

+394
-107
lines changed

20 files changed

+394
-107
lines changed

.eslintrc.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,13 @@
2626
"files": ["*.ts", "*.tsx"],
2727
"extends": ["plugin:@nx/typescript"],
2828
"rules": {
29-
"@typescript-eslint/no-extra-semi": "error",
3029
"no-extra-semi": "off"
3130
}
3231
},
3332
{
3433
"files": ["*.js", "*.jsx"],
3534
"extends": ["plugin:@nx/javascript"],
3635
"rules": {
37-
"@typescript-eslint/no-extra-semi": "error",
3836
"no-extra-semi": "off"
3937
}
4038
},
@@ -54,6 +52,7 @@
5452
"@typescript-eslint/prefer-namespace-keyword": "error",
5553
"@typescript-eslint/ban-types": "warn",
5654
"@typescript-eslint/no-empty-function": "warn",
55+
"@typescript-eslint/no-empty-object-type": "warn",
5756
"eqeqeq": ["off", "smart"],
5857
"id-blacklist": [
5958
"error",

modules/data/src/utils/default-logger.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,31 @@ import { Logger } from './interfaces';
55
export class DefaultLogger implements Logger {
66
error(message?: any, extra?: any) {
77
if (message) {
8-
extra ? console.error(message, extra) : console.error(message);
8+
if (extra) {
9+
console.error(message, extra);
10+
} else {
11+
console.error(message);
12+
}
913
}
1014
}
1115

1216
log(message?: any, extra?: any) {
1317
if (message) {
14-
extra ? console.log(message, extra) : console.log(message);
18+
if (extra) {
19+
console.log(message, extra);
20+
} else {
21+
console.log(message);
22+
}
1523
}
1624
}
1725

1826
warn(message?: any, extra?: any) {
1927
if (message) {
20-
extra ? console.warn(message, extra) : console.warn(message);
28+
if (extra) {
29+
console.warn(message, extra);
30+
} else {
31+
console.warn(message);
32+
}
2133
}
2234
}
2335
}

modules/entity/spec/fixtures/book.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// eslint-disable-next-line @typescript-eslint/no-var-requires
1+
// eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-require-imports
22
const deepFreeze = require('deep-freeze');
33

44
export interface BookModel {

modules/eslint-plugin/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
},
4646
"peerDependencies": {
4747
"eslint": "^8.57.0 || ^9.0.0",
48+
"@typescript-eslint/utils": "^7.11.0 || ^8.0.0-alpha.20",
4849
"typescript": "*"
4950
}
5051
}

modules/eslint-plugin/scripts/generate-config.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ function writeConfig(
3939
},
4040
{}
4141
);
42-
const parserOptions: null | Record<string, string | number> =
42+
const requireParserOptions: null | Record<string, string | number> =
4343
rulesForConfig.some(([_, rule]) => rule.meta.docs?.requiresTypeChecking)
4444
? {
4545
ecmaVersion: 2020,
@@ -75,8 +75,12 @@ function writeConfig(
7575
languageOptions: {
7676
parser,
7777
${
78-
parserOptions
79-
? `parserOptions: ${JSON.stringify(parserOptions, null, 2)},`
78+
requireParserOptions
79+
? `parserOptions: ${JSON.stringify(
80+
requireParserOptions,
81+
null,
82+
2
83+
)},`
8084
: ''
8185
}
8286
},
@@ -94,7 +98,7 @@ function writeConfig(
9498
plugins: ['@ngrx'],
9599
rules: configRules,
96100
};
97-
if (configName.includes('all')) {
101+
if (requireParserOptions) {
98102
jsonConfig.parserOptions = {
99103
ecmaVersion: 2020,
100104
sourceType: 'module',
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import * as path from 'path';
2+
import * as lib from '../src/rules';
3+
import { traverseFolder } from '../src/utils';
4+
import { configs } from '../v9';
5+
6+
const rulesDirectory = path.join(__dirname, '../src/rules');
7+
const configsDirectory = path.join(__dirname, '../src/configs');
8+
9+
function getAllRules() {
10+
return [...traverseFolder(rulesDirectory, ['.ts'])]
11+
.map((rule) => rule.file)
12+
.filter((rule) => rule !== 'index');
13+
}
14+
function getAllConfigs() {
15+
return [...traverseFolder(configsDirectory, ['.ts'])];
16+
}
17+
18+
describe('ESLint V8', () => {
19+
test('exports all rules', () => {
20+
const rules = getAllRules();
21+
expect(Object.keys(lib.rules).length).toBe(rules.length);
22+
});
23+
test('exports all configurations', () => {
24+
const configs = getAllConfigs();
25+
expect(configs.length).toBe(6);
26+
});
27+
});
28+
29+
describe('ESLint V9', () => {
30+
test('exports all rules ', () => {
31+
const rules = getAllRules();
32+
expect(Object.keys((configs.all[1] as any).rules).length).toBe(
33+
rules.length
34+
);
35+
});
36+
test('exports all configurations', () => {
37+
expect(Object.keys(configs).length).toBe(6);
38+
});
39+
});

modules/eslint-plugin/src/configs/effects.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,10 @@
99
"@ngrx/prefer-action-creator-in-of-type": "error",
1010
"@ngrx/prefer-effect-callback-in-block-statement": "error",
1111
"@ngrx/use-effects-lifecycle-interface": "error"
12+
},
13+
"parserOptions": {
14+
"ecmaVersion": 2020,
15+
"sourceType": "module",
16+
"project": "./tsconfig.json"
1217
}
1318
}

modules/eslint-plugin/src/configs/signals.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,10 @@
44
"rules": {
55
"@ngrx/signal-state-no-arrays-at-root-level": "error",
66
"@ngrx/with-state-no-arrays-at-root-level": "error"
7+
},
8+
"parserOptions": {
9+
"ecmaVersion": 2020,
10+
"sourceType": "module",
11+
"project": "./tsconfig.json"
712
}
813
}

modules/eslint-plugin/src/rule-creator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ type CreateRuleMeta<
1414
TMessageIds extends string,
1515
TOptions extends readonly unknown[]
1616
> = {
17-
docs: Omit<TSESLint.RuleMetaDataDocs<TOptions>, 'url'> & {
17+
docs: Omit<TSESLint.RuleMetaDataDocs, 'url'> & {
1818
requiresTypeChecking?: boolean;
1919
};
2020
} & Omit<Meta<TMessageIds, TOptions>, 'docs'>;

modules/eslint-plugin/src/rules/index.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ import selectStyle from './store/select-style';
3131
import useConsistentGlobalStoreName from './store/use-consistent-global-store-name';
3232
// operators
3333
import preferConcatLatestFrom from './operators/prefer-concat-latest-from';
34+
import signalStateNoArraysAtRootLevel from './signals/signal-state-no-arrays-at-root-level';
35+
import withStateNoArraysAtRootLevel from './signals/with-state-no-arrays-at-root-level';
3436

3537
export const rules = {
3638
// component-store
@@ -71,4 +73,7 @@ export const rules = {
7173
'use-consistent-global-store-name': useConsistentGlobalStoreName,
7274
// operators
7375
'prefer-concat-latest-from': preferConcatLatestFrom,
76+
// signals
77+
'signal-state-no-arrays-at-root-level': signalStateNoArraysAtRootLevel,
78+
'with-state-no-arrays-at-root-level': withStateNoArraysAtRootLevel,
7479
};

0 commit comments

Comments
 (0)