diff --git a/docs/troubleshooting/typed-linting/Performance.mdx b/docs/troubleshooting/typed-linting/Performance.mdx index f81eaaca22a5..29775150a6d6 100644 --- a/docs/troubleshooting/typed-linting/Performance.mdx +++ b/docs/troubleshooting/typed-linting/Performance.mdx @@ -38,6 +38,14 @@ In particular for typed linting: - [Performance Tracing](https://github.com/microsoft/TypeScript/wiki/Performance#performance-tracing) can spotlight specific slow types within your project. - [Using Project References](https://github.com/microsoft/TypeScript/wiki/Performance#using-project-references) -which requires enabling the [new "project service" (`parserOptions.projectService`) in v8](/blog/announcing-typescript-eslint-v8-beta#project-service)- can be helpful to speed up type checking on larger projects. +If none of the above work, you can try adjusting the `--max-semi-space-size` of Node. Increasing the max size of a semi-space can improve performance at the cost of more memory consumption. You can [read more about setting space size in Node.js here](https://nodejs.org/api/cli.html#--max-semi-space-sizesize-in-mib). + +You can enable the setting by prepending your ESLint command like: + +```bash +NODE_OPTIONS=--max-semi-space-size=256 eslint +``` + ## Wide includes in your `tsconfig` When using type-aware linting, you provide us with one or more tsconfigs. diff --git a/packages/website/plugins/generated-rule-docs/insertions/insertNewRuleReferences.ts b/packages/website/plugins/generated-rule-docs/insertions/insertNewRuleReferences.ts index 5c934e2f025e..89230d62a2fb 100644 --- a/packages/website/plugins/generated-rule-docs/insertions/insertNewRuleReferences.ts +++ b/packages/website/plugins/generated-rule-docs/insertions/insertNewRuleReferences.ts @@ -190,9 +190,13 @@ function getRuleDefaultOptions(page: RuleDocsPage): string { return typeof recommended === 'object' ? [ - `const defaultOptionsRecommended: Options = ${defaults};`, - '', - '// These options are merged on top of the recommended defaults', + ...(recommended.recommended + ? [ + `const defaultOptionsRecommended: Options = ${defaults};`, + '', + '// These options are merged on top of the recommended defaults', + ] + : []), `const defaultOptionsStrict: Options = ${JSON.stringify(recommended.strict)};`, ].join('\n') : `const defaultOptions: Options = ${defaults};`; diff --git a/packages/website/src/components/RulesTable/index.tsx b/packages/website/src/components/RulesTable/index.tsx index 1825fefcb02d..6f25e27e951d 100644 --- a/packages/website/src/components/RulesTable/index.tsx +++ b/packages/website/src/components/RulesTable/index.tsx @@ -10,6 +10,7 @@ import React, { useMemo } from 'react'; import type { HistorySelector } from '../../hooks/useHistorySelector'; import { useHistorySelector } from '../../hooks/useHistorySelector'; +import { getRecommendationWithEmoji } from '../../theme/MDXComponents/RuleAttributes'; import { CONFIG_EMOJI, DEPRECATED_RULE_EMOJI, @@ -35,9 +36,9 @@ function interpolateCode( function getActualRecommended({ docs, -}: RulesMeta[number]): RuleRecommendation | undefined { +}: RulesMeta[number]): ['', ''] | [string, RuleRecommendation] { const recommended = docs.recommended; - return typeof recommended === 'object' ? 'recommended' : recommended; + return recommended ? getRecommendationWithEmoji(recommended) : ['', '']; } function RuleRow({ @@ -50,7 +51,7 @@ function RuleRow({ } const { deprecated, fixable, hasSuggestions } = rule; const { extendsBaseRule, requiresTypeChecking } = rule.docs; - const actualRecommended = getActualRecommended(rule); + const [emoji, actualRecommended] = getActualRecommended(rule); return ( @@ -61,20 +62,7 @@ function RuleRow({ {interpolateCode(rule.docs.description)} - {(() => { - switch (actualRecommended) { - case 'recommended': - return RECOMMENDED_CONFIG_EMOJI; - case 'strict': - return STRICT_CONFIG_EMOJI; - case 'stylistic': - return STYLISTIC_CONFIG_EMOJI; - default: - // for some reason the current version of babel loader won't elide - // this correctly recommended satisfies undefined; - return ''; - } - })()} + {emoji} rules.filter(r => { - const actualRecommended = getActualRecommended(r); + const actualRecommended = getActualRecommended(r)[1]; const opinions = [ match(filters.recommended, actualRecommended === 'recommended'), match( diff --git a/packages/website/src/theme/MDXComponents/RuleAttributes.tsx b/packages/website/src/theme/MDXComponents/RuleAttributes.tsx index 32e1f91af462..0465e126aaad 100644 --- a/packages/website/src/theme/MDXComponents/RuleAttributes.tsx +++ b/packages/website/src/theme/MDXComponents/RuleAttributes.tsx @@ -20,7 +20,10 @@ import { import { Feature } from './Feature'; import styles from './RuleAttributes.module.css'; -const recommendations = { +const recommendations: Record< + RuleRecommendation, + [string, RuleRecommendation] +> = { recommended: [RECOMMENDED_CONFIG_EMOJI, 'recommended'], strict: [STRICT_CONFIG_EMOJI, 'strict'], stylistic: [STYLISTIC_CONFIG_EMOJI, 'stylistic'], @@ -45,19 +48,23 @@ const resolveRecommendation = ( }; const getRecommendation = (docs: RecommendedRuleMetaDataDocs): string[] => { - const recommended = docs.recommended; - const recommendation = - recommendations[ - typeof recommended === 'object' - ? resolveRecommendation(recommended) - : recommended - ]; + const recommendation = getRecommendationWithEmoji(docs.recommended); return docs.requiresTypeChecking ? [recommendation[0], `${recommendation[1]}-type-checked`] : recommendation; }; +export function getRecommendationWithEmoji( + recommended: RecommendedRuleMetaDataDocs['recommended'], +): [string, RuleRecommendation] { + const recommendationKey = + typeof recommended === 'object' + ? resolveRecommendation(recommended) + : recommended; + return recommendations[recommendationKey]; +} + export function RuleAttributes({ name }: { name: string }): React.ReactNode { const rules = useRulesMeta(); const rule = rules.find(rule => rule.name === name);