diff --git a/.eslintrc.js b/.eslintrc.js index 81f745d38247..33b40dc72626 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -106,6 +106,13 @@ module.exports = { // curly: ['error', 'all'], + eqeqeq: [ + 'error', + 'always', + { + null: 'never', + }, + ], 'no-mixed-operators': 'error', 'no-console': 'error', 'no-process-exit': 'error', diff --git a/packages/eslint-plugin/src/rules/adjacent-overload-signatures.ts b/packages/eslint-plugin/src/rules/adjacent-overload-signatures.ts index 5f5ddfc0aad6..498a9bf5ae1b 100644 --- a/packages/eslint-plugin/src/rules/adjacent-overload-signatures.ts +++ b/packages/eslint-plugin/src/rules/adjacent-overload-signatures.ts @@ -65,7 +65,7 @@ export default util.createRule({ case AST_NODE_TYPES.TSDeclareFunction: case AST_NODE_TYPES.FunctionDeclaration: { const name = member.id?.name ?? null; - if (name === null) { + if (name == null) { return null; } return { @@ -143,7 +143,7 @@ export default util.createRule({ members.forEach(member => { const method = getMemberMethod(member); - if (method === null) { + if (method == null) { lastMethod = null; return; } diff --git a/packages/eslint-plugin/src/rules/ban-types.ts b/packages/eslint-plugin/src/rules/ban-types.ts index dce411405155..f21dda8a249a 100644 --- a/packages/eslint-plugin/src/rules/ban-types.ts +++ b/packages/eslint-plugin/src/rules/ban-types.ts @@ -36,7 +36,7 @@ function stringifyNode( function getCustomMessage( bannedType: null | string | { message?: string; fixWith?: string }, ): string { - if (bannedType === null) { + if (bannedType == null) { return ''; } diff --git a/packages/eslint-plugin/src/rules/comma-spacing.ts b/packages/eslint-plugin/src/rules/comma-spacing.ts index fda50d1b2e4a..a1ebcc181f28 100644 --- a/packages/eslint-plugin/src/rules/comma-spacing.ts +++ b/packages/eslint-plugin/src/rules/comma-spacing.ts @@ -68,7 +68,7 @@ export default createRule({ let previousToken = sourceCode.getFirstToken(node); for (const element of node.elements) { let token: TSESTree.Token | null; - if (element === null) { + if (element == null) { token = sourceCode.getTokenAfter(previousToken!); if (token && isCommaToken(token)) { ignoredTokens.add(token); diff --git a/packages/eslint-plugin/src/rules/member-ordering.ts b/packages/eslint-plugin/src/rules/member-ordering.ts index 87022f16f4fd..8a419e69eefa 100644 --- a/packages/eslint-plugin/src/rules/member-ordering.ts +++ b/packages/eslint-plugin/src/rules/member-ordering.ts @@ -489,7 +489,7 @@ function getRank( ): number { const type = getNodeType(node); - if (type === null) { + if (type == null) { // shouldn't happen but just in case, put it on the end return orderConfig.length - 1; } @@ -842,7 +842,7 @@ export default util.createRule({ supportsModifiers, ); - if (grouped === null) { + if (grouped == null) { return false; } diff --git a/packages/eslint-plugin/src/rules/naming-convention-utils/validator.ts b/packages/eslint-plugin/src/rules/naming-convention-utils/validator.ts index e96ff19e3748..c2b87ccc33b1 100644 --- a/packages/eslint-plugin/src/rules/naming-convention-utils/validator.ts +++ b/packages/eslint-plugin/src/rules/naming-convention-utils/validator.ts @@ -101,25 +101,25 @@ function createValidator( let name: string | null = originalName; name = validateUnderscore('leading', config, name, node, originalName); - if (name === null) { + if (name == null) { // fail return; } name = validateUnderscore('trailing', config, name, node, originalName); - if (name === null) { + if (name == null) { // fail return; } name = validateAffix('prefix', config, name, node, originalName); - if (name === null) { + if (name == null) { // fail return; } name = validateAffix('suffix', config, name, node, originalName); - if (name === null) { + if (name == null) { // fail return; } @@ -383,7 +383,7 @@ function createValidator( modifiers: Set, ): boolean { const formats = config.format; - if (formats === null || formats.length === 0) { + if (!formats?.length) { return true; } @@ -427,7 +427,7 @@ function isCorrectType( context: Context, selector: Selectors, ): boolean { - if (config.types === null) { + if (config.types == null) { return true; } diff --git a/packages/eslint-plugin/src/rules/naming-convention.ts b/packages/eslint-plugin/src/rules/naming-convention.ts index 05f3dd0f2a6b..a9d9b4cb327a 100644 --- a/packages/eslint-plugin/src/rules/naming-convention.ts +++ b/packages/eslint-plugin/src/rules/naming-convention.ts @@ -269,7 +269,7 @@ export default util.createRule({ | TSESTree.FunctionExpression, ): void { const validator = validators.function; - if (!validator || node.id === null) { + if (!validator || node.id == null) { return; } @@ -489,7 +489,7 @@ export default util.createRule({ } const id = node.id; - if (id === null) { + if (id == null) { return; } diff --git a/packages/eslint-plugin/src/rules/no-implied-eval.ts b/packages/eslint-plugin/src/rules/no-implied-eval.ts index 0ae6698c533c..d88cd05ff6f4 100644 --- a/packages/eslint-plugin/src/rules/no-implied-eval.ts +++ b/packages/eslint-plugin/src/rules/no-implied-eval.ts @@ -135,7 +135,7 @@ export default util.createRule({ node: TSESTree.NewExpression | TSESTree.CallExpression, ): void { const calleeName = getCalleeName(node.callee); - if (calleeName === null) { + if (calleeName == null) { return; } diff --git a/packages/eslint-plugin/src/rules/no-inferrable-types.ts b/packages/eslint-plugin/src/rules/no-inferrable-types.ts index effbed48eaaf..1bc83c07c701 100644 --- a/packages/eslint-plugin/src/rules/no-inferrable-types.ts +++ b/packages/eslint-plugin/src/rules/no-inferrable-types.ts @@ -147,7 +147,7 @@ export default util.createRule({ } case AST_NODE_TYPES.TSNullKeyword: - return init.type === AST_NODE_TYPES.Literal && init.value === null; + return init.type === AST_NODE_TYPES.Literal && init.value == null; case AST_NODE_TYPES.TSStringKeyword: return ( diff --git a/packages/eslint-plugin/src/rules/no-loss-of-precision.ts b/packages/eslint-plugin/src/rules/no-loss-of-precision.ts index 7b9492972e8e..2c0d84364e4b 100644 --- a/packages/eslint-plugin/src/rules/no-loss-of-precision.ts +++ b/packages/eslint-plugin/src/rules/no-loss-of-precision.ts @@ -25,7 +25,7 @@ export default util.createRule({ }, defaultOptions: [], create(context) { - /* istanbul ignore if */ if (baseRule === null) { + /* istanbul ignore if */ if (baseRule == null) { throw new Error( '@typescript-eslint/no-loss-of-precision requires at least ESLint v7.1.0', ); diff --git a/packages/eslint-plugin/src/rules/no-misused-promises.ts b/packages/eslint-plugin/src/rules/no-misused-promises.ts index b6914ae2c392..15bf0c501d15 100644 --- a/packages/eslint-plugin/src/rules/no-misused-promises.ts +++ b/packages/eslint-plugin/src/rules/no-misused-promises.ts @@ -250,7 +250,7 @@ export default util.createRule({ function checkVariableDeclaration(node: TSESTree.VariableDeclarator): void { const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node); - if (tsNode.initializer === undefined || node.init === null) { + if (tsNode.initializer === undefined || node.init == null) { return; } const varType = checker.getTypeAtLocation(tsNode.name); @@ -344,7 +344,7 @@ export default util.createRule({ function checkReturnStatement(node: TSESTree.ReturnStatement): void { const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node); - if (tsNode.expression === undefined || node.argument === null) { + if (tsNode.expression === undefined || node.argument == null) { return; } const contextualType = checker.getContextualType(tsNode.expression); @@ -368,7 +368,7 @@ export default util.createRule({ const tsNode = parserServices.esTreeNodeToTSNodeMap.get(node); const value = tsNode.initializer; if ( - node.value === null || + node.value == null || value === undefined || !ts.isJsxExpression(value) || value.expression === undefined diff --git a/packages/eslint-plugin/src/rules/no-non-null-asserted-nullish-coalescing.ts b/packages/eslint-plugin/src/rules/no-non-null-asserted-nullish-coalescing.ts index 8706703c9bab..a79fa4062b1f 100644 --- a/packages/eslint-plugin/src/rules/no-non-null-asserted-nullish-coalescing.ts +++ b/packages/eslint-plugin/src/rules/no-non-null-asserted-nullish-coalescing.ts @@ -27,7 +27,7 @@ function isDefinitionWithAssignment(definition: Definition): boolean { const variableDeclarator = definition.node; return ( - variableDeclarator.definite === true || variableDeclarator.init !== null + variableDeclarator.definite === true || variableDeclarator.init != null ); } diff --git a/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts b/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts index 030ed4fe1886..3dd87c2fee17 100644 --- a/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts +++ b/packages/eslint-plugin/src/rules/no-unnecessary-condition.ts @@ -384,7 +384,7 @@ export default createRule({ | TSESTree.ForStatement | TSESTree.WhileStatement, ): void { - if (node.test === null) { + if (node.test == null) { // e.g. `for(;;)` return; } diff --git a/packages/eslint-plugin/src/rules/no-unnecessary-qualifier.ts b/packages/eslint-plugin/src/rules/no-unnecessary-qualifier.ts index fbf3b41e9668..632ad6c5ba0f 100644 --- a/packages/eslint-plugin/src/rules/no-unnecessary-qualifier.ts +++ b/packages/eslint-plugin/src/rules/no-unnecessary-qualifier.ts @@ -53,7 +53,7 @@ export default util.createRule({ const alias = tryGetAliasedSymbol(symbol, checker); - return alias !== null && symbolIsNamespaceInScope(alias); + return alias != null && symbolIsNamespaceInScope(alias); } function getSymbolInScope( diff --git a/packages/eslint-plugin/src/rules/no-use-before-define.ts b/packages/eslint-plugin/src/rules/no-use-before-define.ts index 5153ed47fcd8..b88cd82d39d7 100644 --- a/packages/eslint-plugin/src/rules/no-use-before-define.ts +++ b/packages/eslint-plugin/src/rules/no-use-before-define.ts @@ -21,7 +21,7 @@ function parseOptions(options: string | Config | null): Required { if (typeof options === 'string') { functions = options !== 'nofunc'; - } else if (typeof options === 'object' && options !== null) { + } else if (typeof options === 'object' && options != null) { functions = options.functions !== false; classes = options.classes !== false; enums = options.enums !== false; @@ -64,7 +64,7 @@ function isOuterEnum( reference: TSESLint.Scope.Reference, ): boolean { return ( - variable.defs[0].type == DefinitionType.TSEnumName && + variable.defs[0].type === DefinitionType.TSEnumName && variable.scope.variableScope !== reference.from.variableScope ); } diff --git a/packages/eslint-plugin/src/rules/prefer-for-of.ts b/packages/eslint-plugin/src/rules/prefer-for-of.ts index 9bb8802a7da7..ddde074a234d 100644 --- a/packages/eslint-plugin/src/rules/prefer-for-of.ts +++ b/packages/eslint-plugin/src/rules/prefer-for-of.ts @@ -24,8 +24,7 @@ export default util.createRule({ node: TSESTree.Node | null, ): node is TSESTree.VariableDeclaration { return ( - node !== null && - node.type === AST_NODE_TYPES.VariableDeclaration && + node?.type === AST_NODE_TYPES.VariableDeclaration && node.kind !== 'const' && node.declarations.length === 1 ); @@ -39,7 +38,7 @@ export default util.createRule({ } function isZeroInitialized(node: TSESTree.VariableDeclarator): boolean { - return node.init !== null && isLiteral(node.init, 0); + return node.init != null && isLiteral(node.init, 0); } function isMatchingIdentifier( @@ -54,8 +53,7 @@ export default util.createRule({ name: string, ): TSESTree.Expression | null { if ( - node !== null && - node.type === AST_NODE_TYPES.BinaryExpression && + node?.type === AST_NODE_TYPES.BinaryExpression && node.operator === '<' && isMatchingIdentifier(node.left, name) && node.right.type === AST_NODE_TYPES.MemberExpression && diff --git a/packages/eslint-plugin/src/rules/prefer-function-type.ts b/packages/eslint-plugin/src/rules/prefer-function-type.ts index 95b3ee5d33b7..db5dde69d001 100644 --- a/packages/eslint-plugin/src/rules/prefer-function-type.ts +++ b/packages/eslint-plugin/src/rules/prefer-function-type.ts @@ -82,8 +82,7 @@ export default util.createRule({ typeof member.returnType !== 'undefined' ) { if ( - tsThisTypes !== null && - tsThisTypes.length > 0 && + tsThisTypes?.length && node.type === AST_NODE_TYPES.TSInterfaceDeclaration ) { // the message can be confusing if we don't point directly to the `this` node instead of the whole member @@ -205,7 +204,7 @@ export default util.createRule({ // inside an interface keep track of all ThisType references. // unless it's inside a nested type literal in which case it's invalid code anyway // we don't want to incorrectly say "it refers to name" while typescript says it's completely invalid. - if (literalNesting === 0 && tsThisTypes !== null) { + if (literalNesting === 0 && tsThisTypes != null) { tsThisTypes.push(node); } }, diff --git a/packages/eslint-plugin/src/rules/prefer-includes.ts b/packages/eslint-plugin/src/rules/prefer-includes.ts index 9c50ce118f80..720d5fbe8092 100644 --- a/packages/eslint-plugin/src/rules/prefer-includes.ts +++ b/packages/eslint-plugin/src/rules/prefer-includes.ts @@ -38,7 +38,7 @@ export default createRule({ function isNumber(node: TSESTree.Node, value: number): boolean { const evaluated = getStaticValue(node, globalScope); - return evaluated !== null && evaluated.value === value; + return evaluated != null && evaluated.value === value; } function isPositiveCheck(node: TSESTree.BinaryExpression): boolean { diff --git a/packages/eslint-plugin/src/rules/prefer-regexp-exec.ts b/packages/eslint-plugin/src/rules/prefer-regexp-exec.ts index 13452d48f86f..60bf310947fa 100644 --- a/packages/eslint-plugin/src/rules/prefer-regexp-exec.ts +++ b/packages/eslint-plugin/src/rules/prefer-regexp-exec.ts @@ -123,7 +123,7 @@ export default createRule({ if ( argumentNode.type === AST_NODE_TYPES.Literal && - typeof argumentNode.value == 'string' + typeof argumentNode.value === 'string' ) { const regExp = RegExp(argumentNode.value); return context.report({ diff --git a/packages/eslint-plugin/src/rules/prefer-string-starts-ends-with.ts b/packages/eslint-plugin/src/rules/prefer-string-starts-ends-with.ts index f0949acd16cd..bee6c620fd1f 100644 --- a/packages/eslint-plugin/src/rules/prefer-string-starts-ends-with.ts +++ b/packages/eslint-plugin/src/rules/prefer-string-starts-ends-with.ts @@ -60,7 +60,7 @@ export default createRule({ */ function isNull(node: TSESTree.Node): node is TSESTree.Literal { const evaluated = getStaticValue(node, globalScope); - return evaluated != null && evaluated.value === null; + return evaluated != null && evaluated.value == null; } /** diff --git a/packages/eslint-plugin/src/rules/switch-exhaustiveness-check.ts b/packages/eslint-plugin/src/rules/switch-exhaustiveness-check.ts index cff8960dac84..43d4913b4ca3 100644 --- a/packages/eslint-plugin/src/rules/switch-exhaustiveness-check.ts +++ b/packages/eslint-plugin/src/rules/switch-exhaustiveness-check.ts @@ -121,7 +121,7 @@ export default createRule({ const unionTypes = unionTypeParts(discriminantType); const caseTypes: Set = new Set(); for (const switchCase of node.cases) { - if (switchCase.test === null) { + if (switchCase.test == null) { // Switch has 'default' branch - do nothing. return; } diff --git a/packages/eslint-plugin/src/rules/triple-slash-reference.ts b/packages/eslint-plugin/src/rules/triple-slash-reference.ts index 5780d55cb5c2..4425e666338d 100644 --- a/packages/eslint-plugin/src/rules/triple-slash-reference.ts +++ b/packages/eslint-plugin/src/rules/triple-slash-reference.ts @@ -87,7 +87,7 @@ export default util.createRule({ } }, Program(node): void { - if (lib === 'always' && path === 'always' && types == 'always') { + if (lib === 'always' && path === 'always' && types === 'always') { return; } programNode = node; diff --git a/packages/eslint-plugin/src/util/isNullLiteral.ts b/packages/eslint-plugin/src/util/isNullLiteral.ts index f8695f260924..85bf45882123 100644 --- a/packages/eslint-plugin/src/util/isNullLiteral.ts +++ b/packages/eslint-plugin/src/util/isNullLiteral.ts @@ -2,5 +2,5 @@ import type { TSESTree } from '@typescript-eslint/utils'; import { AST_NODE_TYPES } from '@typescript-eslint/utils'; export function isNullLiteral(i: TSESTree.Node): boolean { - return i.type === AST_NODE_TYPES.Literal && i.value === null; + return i.type === AST_NODE_TYPES.Literal && i.value == null; } diff --git a/packages/eslint-plugin/tests/rules/indent/indent.test.ts b/packages/eslint-plugin/tests/rules/indent/indent.test.ts index 65fe9240377b..f9191d3ef105 100644 --- a/packages/eslint-plugin/tests/rules/indent/indent.test.ts +++ b/packages/eslint-plugin/tests/rules/indent/indent.test.ts @@ -638,7 +638,7 @@ type Foo = string | { }) .filter( (error): error is TSESLint.TestCaseError => - error !== null, + error != null, ), }; if (invalid.errors.length > 0) { diff --git a/packages/eslint-plugin/tests/rules/prefer-string-starts-ends-with.test.ts b/packages/eslint-plugin/tests/rules/prefer-string-starts-ends-with.test.ts index 82a25e2f472e..c9fe331c99d7 100644 --- a/packages/eslint-plugin/tests/rules/prefer-string-starts-ends-with.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-string-starts-ends-with.test.ts @@ -1083,7 +1083,7 @@ function addOptional< function makeOptional(code: string): string; function makeOptional(code: string | null | undefined): string | null; function makeOptional(code: string | null | undefined): string | null { - if (code === null || code === undefined) { + if (code == null) { return null; } return ( diff --git a/packages/scope-manager/src/ScopeManager.ts b/packages/scope-manager/src/ScopeManager.ts index 5368cca1dc3b..7f4b2a5f7052 100644 --- a/packages/scope-manager/src/ScopeManager.ts +++ b/packages/scope-manager/src/ScopeManager.ts @@ -140,7 +140,7 @@ class ScopeManager { protected nestScope(scope: T): T; protected nestScope(scope: Scope): Scope { if (scope instanceof GlobalScope) { - assert(this.currentScope === null); + assert(this.currentScope == null); this.globalScope = scope; } this.currentScope = scope; diff --git a/packages/scope-manager/src/referencer/ClassVisitor.ts b/packages/scope-manager/src/referencer/ClassVisitor.ts index 5f84e37404f3..662b70813c83 100644 --- a/packages/scope-manager/src/referencer/ClassVisitor.ts +++ b/packages/scope-manager/src/referencer/ClassVisitor.ts @@ -163,7 +163,7 @@ class ClassVisitor extends Visitor { * } */ if ( - keyName !== null && + keyName != null && this.#classNode.body.body.find( (node): node is TSESTree.MethodDefinition => node !== methodNode && diff --git a/packages/scope-manager/src/referencer/PatternVisitor.ts b/packages/scope-manager/src/referencer/PatternVisitor.ts index 308c4c29208a..53de28469e85 100644 --- a/packages/scope-manager/src/referencer/PatternVisitor.ts +++ b/packages/scope-manager/src/referencer/PatternVisitor.ts @@ -97,10 +97,7 @@ class PatternVisitor extends VisitorBase { this.#callback(pattern, { topLevel: pattern === this.#rootPattern, - rest: - lastRestElement !== null && - lastRestElement !== undefined && - lastRestElement.argument === pattern, + rest: lastRestElement != null && lastRestElement.argument === pattern, assignments: this.#assignments, }); } diff --git a/packages/scope-manager/src/referencer/Referencer.ts b/packages/scope-manager/src/referencer/Referencer.ts index e7b41127ba46..7a14de51df15 100644 --- a/packages/scope-manager/src/referencer/Referencer.ts +++ b/packages/scope-manager/src/referencer/Referencer.ts @@ -124,7 +124,7 @@ class Referencer extends Visitor { } private referenceJsxPragma(): void { - if (this.#jsxPragma === null || this.#hasReferencedJsxFactory) { + if (this.#jsxPragma == null || this.#hasReferencedJsxFactory) { return; } this.#hasReferencedJsxFactory = this.referenceInSomeUpperScope( @@ -134,7 +134,7 @@ class Referencer extends Visitor { private referenceJsxFragment(): void { if ( - this.#jsxFragmentName === null || + this.#jsxFragmentName == null || this.#hasReferencedJsxFragmentFactory ) { return; diff --git a/packages/typescript-estree/src/convert-comments.ts b/packages/typescript-estree/src/convert-comments.ts index ea02be412768..d4dd9f124a79 100644 --- a/packages/typescript-estree/src/convert-comments.ts +++ b/packages/typescript-estree/src/convert-comments.ts @@ -22,7 +22,7 @@ export function convertComments( ast, (_, comment) => { const type = - comment.kind == ts.SyntaxKind.SingleLineCommentTrivia + comment.kind === ts.SyntaxKind.SingleLineCommentTrivia ? AST_TOKEN_TYPES.Line : AST_TOKEN_TYPES.Block; const range: TSESTree.Range = [comment.pos, comment.end]; diff --git a/packages/typescript-estree/src/convert.ts b/packages/typescript-estree/src/convert.ts index b21a42614dae..70ee9da4e0ce 100644 --- a/packages/typescript-estree/src/convert.ts +++ b/packages/typescript-estree/src/convert.ts @@ -2183,7 +2183,7 @@ export class Converter { type: AST_NODE_TYPES.Literal, raw: rawValue, value: value, - bigint: value === null ? bigint : String(value), + bigint: value == null ? bigint : String(value), range, }); } diff --git a/packages/typescript-estree/src/getModifiers.ts b/packages/typescript-estree/src/getModifiers.ts index d8f8e716f9e2..a584a7659a77 100644 --- a/packages/typescript-estree/src/getModifiers.ts +++ b/packages/typescript-estree/src/getModifiers.ts @@ -31,7 +31,7 @@ export function getModifiers( export function getDecorators( node: ts.Node | null | undefined, ): undefined | ts.Decorator[] { - if (node == undefined) { + if (node == null) { return undefined; } diff --git a/packages/typescript-estree/src/simple-traverse.ts b/packages/typescript-estree/src/simple-traverse.ts index 13c763ec228e..2d51cdbe4fa1 100644 --- a/packages/typescript-estree/src/simple-traverse.ts +++ b/packages/typescript-estree/src/simple-traverse.ts @@ -5,7 +5,7 @@ import type { TSESTree } from './ts-estree'; // eslint-disable-next-line @typescript-eslint/no-explicit-any function isValidNode(x: any): x is TSESTree.Node { // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - return x !== null && typeof x === 'object' && typeof x.type === 'string'; + return x != null && typeof x === 'object' && typeof x.type === 'string'; } function getVisitorKeysForNode( diff --git a/packages/typescript-estree/tools/test-utils.ts b/packages/typescript-estree/tools/test-utils.ts index b3b873acc6a4..281e396eff41 100644 --- a/packages/typescript-estree/tools/test-utils.ts +++ b/packages/typescript-estree/tools/test-utils.ts @@ -86,7 +86,7 @@ type UnknownObject = Record; function isObjectLike(value: unknown | null): value is UnknownObject { return ( - typeof value === 'object' && !(value instanceof RegExp) && value !== null + typeof value === 'object' && !(value instanceof RegExp) && value != null ); } diff --git a/packages/utils/src/eslint-utils/applyDefault.ts b/packages/utils/src/eslint-utils/applyDefault.ts index 85cd3b3653be..f16ae798715f 100644 --- a/packages/utils/src/eslint-utils/applyDefault.ts +++ b/packages/utils/src/eslint-utils/applyDefault.ts @@ -16,7 +16,7 @@ function applyDefault( JSON.stringify(defaultOptions), ) as AsMutable; - if (userOptions === null || userOptions === undefined) { + if (userOptions == null) { return options; } diff --git a/packages/utils/src/eslint-utils/nullThrows.ts b/packages/utils/src/eslint-utils/nullThrows.ts index df644c2befb0..1a79b2e09d43 100644 --- a/packages/utils/src/eslint-utils/nullThrows.ts +++ b/packages/utils/src/eslint-utils/nullThrows.ts @@ -18,7 +18,7 @@ function nullThrows(value: T | null | undefined, message: string): T { // so ignore it in coverage metrics. /* istanbul ignore if */ - if (value === null || value === undefined) { + if (value == null) { throw new Error(`Non-null Assertion Failed: ${message}`); } diff --git a/packages/utils/tests/eslint-utils/nullThrows.test.ts b/packages/utils/tests/eslint-utils/nullThrows.test.ts new file mode 100644 index 000000000000..7997fecaa6df --- /dev/null +++ b/packages/utils/tests/eslint-utils/nullThrows.test.ts @@ -0,0 +1,31 @@ +import { nullThrows, NullThrowsReasons } from '../../src/eslint-utils'; + +describe('nullThrows', () => { + it('returns a falsy value when it exists', () => { + const value = 0; + + const actual = nullThrows(value, NullThrowsReasons.MissingParent); + + expect(actual).toBe(value); + }); + + it('returns a truthy value when it exists', () => { + const value = { abc: 'def' }; + + const actual = nullThrows(value, NullThrowsReasons.MissingParent); + + expect(actual).toBe(value); + }); + + it('throws an error when the value is null', () => { + expect(() => nullThrows(null, NullThrowsReasons.MissingParent)).toThrow( + NullThrowsReasons.MissingParent, + ); + }); + + it('throws an error when the value is undefined', () => { + expect(() => + nullThrows(undefined, NullThrowsReasons.MissingParent), + ).toThrow(NullThrowsReasons.MissingParent); + }); +}); diff --git a/packages/website/src/components/ast/serializer/serializer.ts b/packages/website/src/components/ast/serializer/serializer.ts index 74a94de9a479..f6c75be3302b 100644 --- a/packages/website/src/components/ast/serializer/serializer.ts +++ b/packages/website/src/components/ast/serializer/serializer.ts @@ -26,7 +26,7 @@ function getSimpleModel(data: unknown): ASTViewerModelSimple { value: String(data), type: 'regexp', }; - } else if (typeof data === 'undefined' || data === null) { + } else if (data == null) { return { value: String(data), type: 'undefined',