From 3fd0d80a95861791303c76ff530dc2f961ea4703 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Wed, 25 Oct 2023 11:14:49 +0300 Subject: [PATCH 1/2] chore(website): fixed no-unnecessary-condition complaints --- .../website/plugins/generated-rule-docs.ts | 29 ++++--- .../website/src/components/ErrorsViewer.tsx | 2 +- .../src/components/OptionsSelector.tsx | 2 +- .../website/src/components/Playground.tsx | 75 +++++++++---------- .../website/src/components/ast/ASTViewer.tsx | 1 + .../src/components/ast/DataRenderer.tsx | 2 +- .../src/components/ast/selectedRange.ts | 1 + .../website/src/components/ast/tsUtils.ts | 14 ++-- .../src/components/config/ConfigEditor.tsx | 9 ++- .../components/config/ConfigTypeScript.tsx | 1 + .../src/components/editor/LoadedEditor.tsx | 2 +- .../website/src/components/lib/jsonSchema.ts | 2 +- .../website/src/components/lib/markdown.ts | 4 +- .../src/components/linter/createLinter.ts | 42 +++++------ .../website/src/components/linter/utils.ts | 1 + .../src/components/typeDetails/TypeInfo.tsx | 2 +- .../components/typeDetails/TypesDetails.tsx | 18 ++--- .../src/theme/CodeBlock/Content/String.tsx | 7 +- 18 files changed, 107 insertions(+), 107 deletions(-) diff --git a/packages/website/plugins/generated-rule-docs.ts b/packages/website/plugins/generated-rule-docs.ts index 7823f2d84486..816df1635a4f 100644 --- a/packages/website/plugins/generated-rule-docs.ts +++ b/packages/website/plugins/generated-rule-docs.ts @@ -52,9 +52,8 @@ export const generatedRuleDocs: Plugin = () => { return; } - const rule = pluginRules[file.stem]; - const meta = rule?.meta; - if (!meta?.docs) { + const rule = file.stem in pluginRules ? pluginRules[file.stem] : undefined; + if (!rule?.meta.docs) { return; } @@ -72,7 +71,7 @@ export const generatedRuleDocs: Plugin = () => { { children: [ { - children: meta.docs.description + children: rule.meta.docs.description .split(/`(.+?)`/) .map((value, index, array) => ({ type: index % 2 === 0 ? 'text' : 'inlineCode', @@ -90,7 +89,7 @@ export const generatedRuleDocs: Plugin = () => { ); // 3. Add a notice about formatting rules being 🤢 - if (meta.type === 'layout') { + if (rule.meta.type === 'layout') { const warningNode = { value: ` @@ -150,7 +149,7 @@ export const generatedRuleDocs: Plugin = () => { } insertIfMissing('Options'); - if (meta.docs.extendsBaseRule) { + if (rule.meta.docs.extendsBaseRule) { insertIfMissing('How to Use'); } return [headingIndices[0], headingIndices[1]]; @@ -158,10 +157,10 @@ export const generatedRuleDocs: Plugin = () => { let eslintrc: string; - if (meta.docs.extendsBaseRule) { + if (rule.meta.docs.extendsBaseRule) { const extendsBaseRuleName = - typeof meta.docs.extendsBaseRule === 'string' - ? meta.docs.extendsBaseRule + typeof rule.meta.docs.extendsBaseRule === 'string' + ? rule.meta.docs.extendsBaseRule : file.stem; children.splice(optionsH2Index + 1, 0, { @@ -257,9 +256,9 @@ export const generatedRuleDocs: Plugin = () => { optionsH2Index += 2; - const hasNoConfig = Array.isArray(meta.schema) - ? meta.schema.length === 0 - : Object.keys(meta.schema).length === 0; + const hasNoConfig = Array.isArray(rule.meta.schema) + ? rule.meta.schema.length === 0 + : Object.keys(rule.meta.schema).length === 0; if (hasNoConfig) { children.splice(optionsH2Index + 1, 0, { children: [ @@ -390,7 +389,7 @@ export const generatedRuleDocs: Plugin = () => { ); // 6. Also add a notice about coming from ESLint core for extension rules - if (meta.docs.extendsBaseRule) { + if (rule.meta.docs.extendsBaseRule) { children.push({ children: [ { @@ -405,9 +404,9 @@ export const generatedRuleDocs: Plugin = () => { type: 'link', title: null, url: `https://github.com/eslint/eslint/blob/main/docs/src/rules/${ - meta.docs.extendsBaseRule === true + rule.meta.docs.extendsBaseRule === true ? file.stem - : meta.docs.extendsBaseRule + : rule.meta.docs.extendsBaseRule }.md`, children: [ { diff --git a/packages/website/src/components/ErrorsViewer.tsx b/packages/website/src/components/ErrorsViewer.tsx index 17481e30f942..53bc3d481b1f 100644 --- a/packages/website/src/components/ErrorsViewer.tsx +++ b/packages/website/src/components/ErrorsViewer.tsx @@ -113,7 +113,7 @@ export function ErrorViewer({

{title}

-            {type === 'danger' ? value?.stack : value.message}
+            {type === 'danger' ? value.stack : value.message}
           
diff --git a/packages/website/src/components/OptionsSelector.tsx b/packages/website/src/components/OptionsSelector.tsx index 00870a850c35..b881319e58ab 100644 --- a/packages/website/src/components/OptionsSelector.tsx +++ b/packages/website/src/components/OptionsSelector.tsx @@ -57,7 +57,7 @@ function OptionsSelectorContent({ value={state.ts} disabled={!tsVersions.length} onChange={(ts): void => setState({ ts })} - options={(tsVersions.length && tsVersions) || [state.ts]} + options={tsVersions.length ? tsVersions : [state.ts]} /> {process.env.ESLINT_VERSION} diff --git a/packages/website/src/components/Playground.tsx b/packages/website/src/components/Playground.tsx index ef45fecab317..62b8e5e33033 100644 --- a/packages/website/src/components/Playground.tsx +++ b/packages/website/src/components/Playground.tsx @@ -93,21 +93,20 @@ function Playground(): React.JSX.Element { showVisualEditor={activeTab !== 'code'} showModal={onVisualEditor} /> - {(activeVisualEditor === 'eslintrc' && ( + {activeVisualEditor === 'eslintrc' ? ( - )) || - (activeVisualEditor === 'tsconfig' && ( - - ))} + ) : activeVisualEditor === 'tsconfig' ? ( + + ) : null}
- {(state.showAST === 'es' && esQueryError && ( + {state.showAST === 'es' && esQueryError ? ( - )) || - (state.showAST === 'types' && astModel?.storedTsAST && ( - - )) || - (state.showAST && astModel && ( - - )) || } + ) : state.showAST === 'types' && astModel?.storedTsAST ? ( + + ) : state.showAST && astModel ? ( + + ) : ( + + )}
diff --git a/packages/website/src/components/ast/ASTViewer.tsx b/packages/website/src/components/ast/ASTViewer.tsx index 087464a56f1f..f8e87937bc0d 100644 --- a/packages/website/src/components/ast/ASTViewer.tsx +++ b/packages/website/src/components/ast/ASTViewer.tsx @@ -21,6 +21,7 @@ export interface ASTViewerProps { function tryToApplyFilter(value: T, filter?: ESQuery.Selector): T | T[] { try { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (window.esquery && filter) { // @ts-expect-error - esquery requires js ast types return window.esquery.match(value, filter); diff --git a/packages/website/src/components/ast/DataRenderer.tsx b/packages/website/src/components/ast/DataRenderer.tsx index 8562b1f4ae38..75a8e010dcc0 100644 --- a/packages/website/src/components/ast/DataRenderer.tsx +++ b/packages/website/src/components/ast/DataRenderer.tsx @@ -115,7 +115,7 @@ function RenderExpandableObject({
{data.map((dataElement, index) => ( (); let currentNode: object | null = node; + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition while (currentNode) { // infinite loop guard if (visited.has(currentNode)) { diff --git a/packages/website/src/components/ast/tsUtils.ts b/packages/website/src/components/ast/tsUtils.ts index 6d4232a58c78..233a606ed3ca 100644 --- a/packages/website/src/components/ast/tsUtils.ts +++ b/packages/website/src/components/ast/tsUtils.ts @@ -65,7 +65,7 @@ export function tsEnumToString( type: keyof TsParsedEnums, value: number, ): string | undefined { - return getTsEnum(type)?.[value]; + return getTsEnum(type)[value]; } /** @@ -75,12 +75,8 @@ export function tsEnumFlagToString( type: keyof TsParsedEnums, value: number, ): string | undefined { - const allFlags = getTsEnum(type); - if (allFlags) { - return Object.entries(allFlags) - .filter(([f]) => (Number(f) & value) !== 0) - .map(([, name]) => `${type}.${name}`) - .join('\n'); - } - return ''; + return Object.entries(getTsEnum(type)) + .filter(([f]) => (Number(f) & value) !== 0) + .map(([, name]) => `${type}.${name}`) + .join('\n'); } diff --git a/packages/website/src/components/config/ConfigEditor.tsx b/packages/website/src/components/config/ConfigEditor.tsx index f34b7662413e..a326a5be2077 100644 --- a/packages/website/src/components/config/ConfigEditor.tsx +++ b/packages/website/src/components/config/ConfigEditor.tsx @@ -62,7 +62,7 @@ function ConfigEditorField({ {item.label &&
} {item.label && {item.label}} - {(item.type === 'boolean' && ( + {item.type === 'boolean' ? ( - )) || - (item.type === 'string' && item.enum && ( + ) : ( + item.enum && ( onChange(item.key, value)} /> - ))} + ) + )} ); } diff --git a/packages/website/src/components/config/ConfigTypeScript.tsx b/packages/website/src/components/config/ConfigTypeScript.tsx index b367af6fafb7..fb41fafc1976 100644 --- a/packages/website/src/components/config/ConfigTypeScript.tsx +++ b/packages/website/src/components/config/ConfigTypeScript.tsx @@ -35,6 +35,7 @@ function ConfigTypeScript(props: ConfigTypeScriptProps): React.JSX.Element { getTypescriptOptions().reduce>( (group, item) => { const category = item.category!.message; + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition group[category] ??= { heading: category, fields: [], diff --git a/packages/website/src/components/editor/LoadedEditor.tsx b/packages/website/src/components/editor/LoadedEditor.tsx index 58ff7d3cd305..f5bc9d244bf1 100644 --- a/packages/website/src/components/editor/LoadedEditor.tsx +++ b/packages/website/src/components/editor/LoadedEditor.tsx @@ -267,7 +267,7 @@ export const LoadedEditor: React.FC = ({ return debounce(() => editor.layout(), 1); }, [editor]); - const container = editor.getContainerDomNode?.() ?? editor.getDomNode(); + const container = editor.getContainerDomNode(); useResizeObserver(container, () => { resize(); diff --git a/packages/website/src/components/lib/jsonSchema.ts b/packages/website/src/components/lib/jsonSchema.ts index 6ea3d4bbc2a5..e5c5801583dd 100644 --- a/packages/website/src/components/lib/jsonSchema.ts +++ b/packages/website/src/components/lib/jsonSchema.ts @@ -50,7 +50,7 @@ export function getRuleJsonSchemaWithErrorLevel( }; } // example: naming-convention rule - if (typeof ruleSchema.items === 'object' && ruleSchema.items) { + if (typeof ruleSchema.items === 'object') { return { ...ruleSchema, type: 'array', diff --git a/packages/website/src/components/lib/markdown.ts b/packages/website/src/components/lib/markdown.ts index 682378c5a5a6..7e9faaccc02b 100644 --- a/packages/website/src/components/lib/markdown.ts +++ b/packages/website/src/components/lib/markdown.ts @@ -66,8 +66,8 @@ export function createMarkdownParams(state: ConfigModel): string { title: `Bug: [${onlyRuleName}] `, 'playground-link': document.location.toString(), 'repro-code': state.code, - 'eslint-config': `module.exports = ${state.eslintrc ?? '{}'}`, - 'typescript-config': state.tsconfig ?? '{}', + 'eslint-config': `module.exports = ${state.eslintrc}`, + 'typescript-config': state.tsconfig, versions: generateVersionsTable(state.ts), }; diff --git a/packages/website/src/components/linter/createLinter.ts b/packages/website/src/components/linter/createLinter.ts index 2f0c17253297..da51aef0cb0f 100644 --- a/packages/website/src/components/linter/createLinter.ts +++ b/packages/website/src/components/linter/createLinter.ts @@ -71,29 +71,27 @@ export function createLinter( const triggerLint = (filename: string): void => { console.info('[Editor] linting triggered for file', filename); const code = system.readFile(filename) ?? '\n'; - if (code != null) { - try { - const messages = linter.verify(code, eslintConfig, filename); - onLint.trigger(filename, messages); - } catch (e) { - const lintMessage: TSESLint.Linter.LintMessage = { - source: 'eslint', - ruleId: '', - severity: 2, - nodeType: '', - column: 1, - line: 1, - message: String(e instanceof Error ? e.stack : e), - }; - if (typeof e === 'object' && e && 'currentNode' in e) { - const node = e.currentNode as TSESTree.Node; - lintMessage.column = node.loc.start.column + 1; - lintMessage.line = node.loc.start.line; - lintMessage.endColumn = node.loc.end.column + 1; - lintMessage.endLine = node.loc.end.line; - } - onLint.trigger(filename, [lintMessage]); + try { + const messages = linter.verify(code, eslintConfig, filename); + onLint.trigger(filename, messages); + } catch (e) { + const lintMessage: TSESLint.Linter.LintMessage = { + source: 'eslint', + ruleId: '', + severity: 2, + nodeType: '', + column: 1, + line: 1, + message: String(e instanceof Error ? e.stack : e), + }; + if (typeof e === 'object' && e && 'currentNode' in e) { + const node = e.currentNode as TSESTree.Node; + lintMessage.column = node.loc.start.column + 1; + lintMessage.line = node.loc.start.line; + lintMessage.endColumn = node.loc.end.column + 1; + lintMessage.endLine = node.loc.end.line; } + onLint.trigger(filename, [lintMessage]); } }; diff --git a/packages/website/src/components/linter/utils.ts b/packages/website/src/components/linter/utils.ts index 2f6f59f9c147..f9a41a3abdda 100644 --- a/packages/website/src/components/linter/utils.ts +++ b/packages/website/src/components/linter/utils.ts @@ -92,6 +92,7 @@ export function parseMarkers( ? 'TypeScript' : marker.owner; + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (!result[group]) { result[group] = { group: group, diff --git a/packages/website/src/components/typeDetails/TypeInfo.tsx b/packages/website/src/components/typeDetails/TypeInfo.tsx index 87084650d124..aabac949da07 100644 --- a/packages/website/src/components/typeDetails/TypeInfo.tsx +++ b/packages/website/src/components/typeDetails/TypeInfo.tsx @@ -67,7 +67,7 @@ export function TypeInfo({ onHoverNode, }: TypeInfoProps): React.JSX.Element { const computed = useMemo(() => { - if (!typeChecker || !value) { + if (!typeChecker) { return undefined; } const info: InfoModel = {}; diff --git a/packages/website/src/components/typeDetails/TypesDetails.tsx b/packages/website/src/components/typeDetails/TypesDetails.tsx index 28dd2f824deb..fe784caaf83c 100644 --- a/packages/website/src/components/typeDetails/TypesDetails.tsx +++ b/packages/website/src/components/typeDetails/TypesDetails.tsx @@ -22,7 +22,7 @@ export function TypesDetails({ typeChecker, onHoverNode, }: TypesDetailsProps): React.JSX.Element { - const [selectedNode, setSelectedNode] = useState(value); + const [selectedNode, setSelectedNode] = useState(value); useEffect(() => { if (cursorPosition) { @@ -48,15 +48,13 @@ export function TypesDetails({ value={value} />
- {selectedNode && ( -
- -
- )} +
+ +
); } diff --git a/packages/website/src/theme/CodeBlock/Content/String.tsx b/packages/website/src/theme/CodeBlock/Content/String.tsx index e6db6b72a311..6895cab853e2 100644 --- a/packages/website/src/theme/CodeBlock/Content/String.tsx +++ b/packages/website/src/theme/CodeBlock/Content/String.tsx @@ -52,7 +52,12 @@ export default function CodeBlockString({ const copiedCode = code .split('\n') - .filter((c, i) => !lineClassNames[i]?.includes('code-block-removed-line')) + .filter( + (c, i) => + !(lineClassNames[i] as string[] | undefined)?.includes( + 'code-block-removed-line', + ), + ) .join('\n'); const eslintrcHash = parseEslintrc(metastring); From 0a7de2dc08bb0eaf8f635c1bf90450c3037572b9 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Wed, 25 Oct 2023 14:59:39 +0300 Subject: [PATCH 2/2] Removed now-unnecessary disables --- packages/website/src/components/ast/ASTViewer.tsx | 1 - packages/website/src/components/ast/selectedRange.ts | 1 - packages/website/src/components/config/ConfigTypeScript.tsx | 1 - packages/website/src/components/linter/utils.ts | 1 - 4 files changed, 4 deletions(-) diff --git a/packages/website/src/components/ast/ASTViewer.tsx b/packages/website/src/components/ast/ASTViewer.tsx index f8e87937bc0d..087464a56f1f 100644 --- a/packages/website/src/components/ast/ASTViewer.tsx +++ b/packages/website/src/components/ast/ASTViewer.tsx @@ -21,7 +21,6 @@ export interface ASTViewerProps { function tryToApplyFilter(value: T, filter?: ESQuery.Selector): T | T[] { try { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (window.esquery && filter) { // @ts-expect-error - esquery requires js ast types return window.esquery.match(value, filter); diff --git a/packages/website/src/components/ast/selectedRange.ts b/packages/website/src/components/ast/selectedRange.ts index 636c5505e9a8..4fa89b843a52 100644 --- a/packages/website/src/components/ast/selectedRange.ts +++ b/packages/website/src/components/ast/selectedRange.ts @@ -74,7 +74,6 @@ export function findSelectionPath( const nodePath = ['ast']; const visited = new Set(); let currentNode: object | null = node; - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition while (currentNode) { // infinite loop guard if (visited.has(currentNode)) { diff --git a/packages/website/src/components/config/ConfigTypeScript.tsx b/packages/website/src/components/config/ConfigTypeScript.tsx index fb41fafc1976..b367af6fafb7 100644 --- a/packages/website/src/components/config/ConfigTypeScript.tsx +++ b/packages/website/src/components/config/ConfigTypeScript.tsx @@ -35,7 +35,6 @@ function ConfigTypeScript(props: ConfigTypeScriptProps): React.JSX.Element { getTypescriptOptions().reduce>( (group, item) => { const category = item.category!.message; - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition group[category] ??= { heading: category, fields: [], diff --git a/packages/website/src/components/linter/utils.ts b/packages/website/src/components/linter/utils.ts index f9a41a3abdda..2f6f59f9c147 100644 --- a/packages/website/src/components/linter/utils.ts +++ b/packages/website/src/components/linter/utils.ts @@ -92,7 +92,6 @@ export function parseMarkers( ? 'TypeScript' : marker.owner; - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition if (!result[group]) { result[group] = { group: group,