diff --git a/eslint.config.ts b/eslint.config.ts index 3668a5fde6..323197067e 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -25,6 +25,16 @@ export default [ ...globals.node, ...globals.commonjs, ...globals.es2020, + // Fetch API types for TypeScript + RequestInit: 'readonly', + RequestInfo: 'readonly', + HeadersInit: 'readonly', + JSX: 'readonly', + // Node.js types for TypeScript + BufferEncoding: 'readonly', + NodeJS: 'readonly', + // cheerio namespace for TypeScript + cheerio: 'readonly', }, parserOptions: { requireConfigFile: false, @@ -87,7 +97,6 @@ export default [ // Disabled rules to review 'github/no-then': 'off', // 30+ '@typescript-eslint/ban-ts-comment': 'off', // 50+ - 'no-undef': 'off', // 50+ 'no-shadow': 'off', // 150+ 'prefer-template': 'off', // 150+ 'github/array-foreach': 'off', // 250+ diff --git a/src/app/client-layout.tsx b/src/app/client-layout.tsx index 4cb24a6646..aa657c4b62 100644 --- a/src/app/client-layout.tsx +++ b/src/app/client-layout.tsx @@ -1,7 +1,8 @@ 'use client' +import React, { useEffect, useMemo, useState } from 'react' +import type { JSX } from 'react' import { ThemeProvider } from '@primer/react' -import { useEffect, useMemo, useState } from 'react' import { LocaleProvider } from '@/app/lib/locale-context' import { useDetectLocale } from '@/app/lib/use-detect-locale' diff --git a/src/app/components/AppRouterLanguagesContext.tsx b/src/app/components/AppRouterLanguagesContext.tsx index 96aa54097d..e78a3e6c1e 100644 --- a/src/app/components/AppRouterLanguagesContext.tsx +++ b/src/app/components/AppRouterLanguagesContext.tsx @@ -1,6 +1,6 @@ 'use client' -import { createContext, useContext } from 'react' +import React, { createContext, useContext } from 'react' import { languages, type LanguageCode } from '@/languages/lib/languages' export type AppRouterLanguageItem = { diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 29fe4be379..a14c6bd1aa 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,6 +1,7 @@ import '@/frame/stylesheets/index.scss' import type { Metadata, Viewport } from 'next' import { ReactNode } from 'react' +import type { JSX } from 'react' export const metadata: Metadata = { title: { diff --git a/src/app/lib/locale-context.tsx b/src/app/lib/locale-context.tsx index bad82ed432..e06327f3c6 100644 --- a/src/app/lib/locale-context.tsx +++ b/src/app/lib/locale-context.tsx @@ -1,6 +1,7 @@ 'use client' import { createContext, useContext, ReactNode, useMemo } from 'react' +import type { JSX } from 'react' import { languages, languageKeys, type LanguageCode } from '@/languages/lib/languages' interface LocaleContextType { diff --git a/src/app/types.ts b/src/app/types.ts index bfa7ce13fe..8b7be385f0 100644 --- a/src/app/types.ts +++ b/src/app/types.ts @@ -2,6 +2,7 @@ * Enhanced type definitions for the app router with strict validation */ +import React from 'react' import type { LanguageCode } from '@/languages/lib/languages' // Core theme types with strict validation diff --git a/src/automated-pipelines/components/AutomatedPage.tsx b/src/automated-pipelines/components/AutomatedPage.tsx index b5635a6bc3..be7bcab209 100644 --- a/src/automated-pipelines/components/AutomatedPage.tsx +++ b/src/automated-pipelines/components/AutomatedPage.tsx @@ -1,3 +1,4 @@ +import React from 'react' import { DefaultLayout } from '@/frame/components/DefaultLayout' import { ArticleTitle } from '@/frame/components/article/ArticleTitle' import { MarkdownContent } from '@/frame/components/ui/MarkdownContent' diff --git a/src/automated-pipelines/components/AutomatedPageContext.tsx b/src/automated-pipelines/components/AutomatedPageContext.tsx index 39decb8346..50efe899b9 100644 --- a/src/automated-pipelines/components/AutomatedPageContext.tsx +++ b/src/automated-pipelines/components/AutomatedPageContext.tsx @@ -1,4 +1,5 @@ import { createContext, useContext } from 'react' +import type { JSX } from 'react' import type { MiniTocItem } from '@/frame/components/context/ArticleContext' export type AutomatedPageContextT = { diff --git a/src/events/components/Survey.tsx b/src/events/components/Survey.tsx index 9e5154ebe3..9beac8fe77 100644 --- a/src/events/components/Survey.tsx +++ b/src/events/components/Survey.tsx @@ -1,4 +1,4 @@ -import { useState, useRef, useEffect } from 'react' +import React, { useState, useRef, useEffect } from 'react' import cx from 'classnames' import { useRouter } from 'next/router' import { ThumbsdownIcon, ThumbsupIcon } from '@primer/octicons-react' diff --git a/src/frame/components/DefaultLayout.tsx b/src/frame/components/DefaultLayout.tsx index cf96acfe64..411ba1a7c4 100644 --- a/src/frame/components/DefaultLayout.tsx +++ b/src/frame/components/DefaultLayout.tsx @@ -1,3 +1,4 @@ +import React from 'react' import Head from 'next/head' import { useRouter } from 'next/router' diff --git a/src/frame/components/article/ArticleTitle.tsx b/src/frame/components/article/ArticleTitle.tsx index a8c3a0185c..e9ebc3ef68 100644 --- a/src/frame/components/article/ArticleTitle.tsx +++ b/src/frame/components/article/ArticleTitle.tsx @@ -1,3 +1,5 @@ +import React from 'react' + type Props = { children: React.ReactNode } diff --git a/src/frame/components/article/HeadingLink.tsx b/src/frame/components/article/HeadingLink.tsx index 7e4c4e56e0..1b7280159e 100644 --- a/src/frame/components/article/HeadingLink.tsx +++ b/src/frame/components/article/HeadingLink.tsx @@ -1,4 +1,5 @@ import GithubSlugger from 'github-slugger' +import type { JSX } from 'react' const slugger = new GithubSlugger() diff --git a/src/frame/components/context/ArticleContext.tsx b/src/frame/components/context/ArticleContext.tsx index 3f35eebd54..222fcebd0b 100644 --- a/src/frame/components/context/ArticleContext.tsx +++ b/src/frame/components/context/ArticleContext.tsx @@ -1,5 +1,6 @@ import { SupportPortalVaIframeProps } from '@/frame/components/article/SupportPortalVaIframe' import { createContext, useContext } from 'react' +import type { JSX } from 'react' import type { JourneyContext } from '@/journeys/lib/journey-path-resolver' export type LearningTrack = { diff --git a/src/frame/components/page-header/Header.tsx b/src/frame/components/page-header/Header.tsx index 07e8409fcb..49508d32b8 100644 --- a/src/frame/components/page-header/Header.tsx +++ b/src/frame/components/page-header/Header.tsx @@ -1,4 +1,5 @@ import { useCallback, useEffect, useRef, useState } from 'react' +import type { JSX } from 'react' import cx from 'classnames' import { useRouter } from 'next/router' import { Dialog, IconButton } from '@primer/react' diff --git a/src/frame/components/page-header/HeaderSearchAndWidgets.tsx b/src/frame/components/page-header/HeaderSearchAndWidgets.tsx index c400fc6a3e..1826e92f2e 100644 --- a/src/frame/components/page-header/HeaderSearchAndWidgets.tsx +++ b/src/frame/components/page-header/HeaderSearchAndWidgets.tsx @@ -1,4 +1,5 @@ import cx from 'classnames' +import type { JSX } from 'react' import { KebabHorizontalIcon, LinkExternalIcon } from '@primer/octicons-react' import { IconButton, ActionMenu, ActionList } from '@primer/react' diff --git a/src/frame/components/ui/Lead/Lead.tsx b/src/frame/components/ui/Lead/Lead.tsx index 443e1866da..96b735db3d 100644 --- a/src/frame/components/ui/Lead/Lead.tsx +++ b/src/frame/components/ui/Lead/Lead.tsx @@ -1,4 +1,5 @@ import { ReactNode } from 'react' +import type { JSX } from 'react' import cx from 'classnames' import styles from './Lead.module.scss' diff --git a/src/frame/components/ui/MarkdownContent/MarkdownContent.tsx b/src/frame/components/ui/MarkdownContent/MarkdownContent.tsx index 93b67dda73..3f37902872 100644 --- a/src/frame/components/ui/MarkdownContent/MarkdownContent.tsx +++ b/src/frame/components/ui/MarkdownContent/MarkdownContent.tsx @@ -1,4 +1,5 @@ import { ReactNode } from 'react' +import type { JSX } from 'react' import cx from 'classnames' import styles from './MarkdownContent.module.scss' diff --git a/src/frame/components/ui/MarkdownContent/UnrenderedMarkdownContent.tsx b/src/frame/components/ui/MarkdownContent/UnrenderedMarkdownContent.tsx index 98f02c43c7..c22dcfdabc 100644 --- a/src/frame/components/ui/MarkdownContent/UnrenderedMarkdownContent.tsx +++ b/src/frame/components/ui/MarkdownContent/UnrenderedMarkdownContent.tsx @@ -1,6 +1,7 @@ import React from 'react' import ReactMarkdown from 'react-markdown' import type { Components } from 'react-markdown' +import type { JSX } from 'react' import remarkGfm from 'remark-gfm' import cx from 'classnames' import { IconButton } from '@primer/react' diff --git a/src/frame/lib/fetch-utils.ts b/src/frame/lib/fetch-utils.ts index 5b3c57fd9a..12dc272382 100644 --- a/src/frame/lib/fetch-utils.ts +++ b/src/frame/lib/fetch-utils.ts @@ -2,6 +2,7 @@ * Utility functions for fetch with retry and timeout functionality * to replace got library functionality */ + export interface FetchWithRetryOptions { retries?: number retryDelay?: number diff --git a/src/graphql/components/GraphqlItem.tsx b/src/graphql/components/GraphqlItem.tsx index a37841bbba..4a8916111d 100644 --- a/src/graphql/components/GraphqlItem.tsx +++ b/src/graphql/components/GraphqlItem.tsx @@ -1,3 +1,4 @@ +import React from 'react' import { HeadingLink } from '@/frame/components/article/HeadingLink' import type { GraphqlT } from './types' import { Notice } from './Notice' diff --git a/src/graphql/components/GraphqlPage.tsx b/src/graphql/components/GraphqlPage.tsx index 0557f1f574..c22f772630 100644 --- a/src/graphql/components/GraphqlPage.tsx +++ b/src/graphql/components/GraphqlPage.tsx @@ -1,4 +1,5 @@ import React from 'react' +import type { JSX } from 'react' import cx from 'classnames' import { Enum } from './Enum' diff --git a/src/landings/components/LandingHero.tsx b/src/landings/components/LandingHero.tsx index abee301523..658899337f 100644 --- a/src/landings/components/LandingHero.tsx +++ b/src/landings/components/LandingHero.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react' +import React, { useEffect, useState } from 'react' import cx from 'classnames' import { useRouter } from 'next/router' import { LinkExternalIcon, NoteIcon } from '@primer/octicons-react' diff --git a/src/landings/components/LandingSection.tsx b/src/landings/components/LandingSection.tsx index d318ce9a40..35902d4bda 100644 --- a/src/landings/components/LandingSection.tsx +++ b/src/landings/components/LandingSection.tsx @@ -1,3 +1,4 @@ +import React from 'react' import cx from 'classnames' import { HeadingLink } from '@/frame/components/article/HeadingLink' diff --git a/src/landings/components/shared/LandingArticleGridWithFilter.tsx b/src/landings/components/shared/LandingArticleGridWithFilter.tsx index 90ab78167f..f719b4cf42 100644 --- a/src/landings/components/shared/LandingArticleGridWithFilter.tsx +++ b/src/landings/components/shared/LandingArticleGridWithFilter.tsx @@ -1,4 +1,4 @@ -import { useState, useRef, useEffect, useMemo } from 'react' +import React, { useState, useRef, useEffect, useMemo } from 'react' import { TextInput, ActionMenu, ActionList, Token, Pagination } from '@primer/react' import { SearchIcon } from '@primer/octicons-react' import cx from 'classnames' diff --git a/src/rest/components/RestCodeSamples.tsx b/src/rest/components/RestCodeSamples.tsx index b03338fbbd..f3568e6f10 100644 --- a/src/rest/components/RestCodeSamples.tsx +++ b/src/rest/components/RestCodeSamples.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect, useRef, FormEvent } from 'react' +import React, { useState, useEffect, useRef, FormEvent } from 'react' import { FormControl, IconButton, Select, SegmentedControl } from '@primer/react' import { CheckIcon, CopyIcon, InfoIcon } from '@primer/octicons-react' import { announce } from '@primer/live-region-element' diff --git a/src/search/components/input/AskAIResults.tsx b/src/search/components/input/AskAIResults.tsx index 5fce5019c0..dbaffc6355 100644 --- a/src/search/components/input/AskAIResults.tsx +++ b/src/search/components/input/AskAIResults.tsx @@ -1,4 +1,4 @@ -import { useEffect, useRef, useState } from 'react' +import React, { useEffect, useRef, useState } from 'react' import { uniqBy } from 'lodash-es' import { executeAISearch } from '../helpers/execute-search-actions' import { useRouter } from 'next/router' diff --git a/src/search/components/input/SearchBarButton.tsx b/src/search/components/input/SearchBarButton.tsx index 039b4851a1..0560fbfb8c 100644 --- a/src/search/components/input/SearchBarButton.tsx +++ b/src/search/components/input/SearchBarButton.tsx @@ -1,3 +1,4 @@ +import React from 'react' import cx from 'classnames' import { IconButton } from '@primer/react' import { CopilotIcon, SearchIcon } from '@primer/octicons-react' diff --git a/src/search/components/input/SearchOverlayContainer.tsx b/src/search/components/input/SearchOverlayContainer.tsx index 103ee815d8..cd504ca62b 100644 --- a/src/search/components/input/SearchOverlayContainer.tsx +++ b/src/search/components/input/SearchOverlayContainer.tsx @@ -1,3 +1,4 @@ +import React from 'react' import { SearchOverlay } from './SearchOverlay' import { QueryParams } from '../hooks/useMultiQueryParams' diff --git a/src/search/components/results/SearchResults.tsx b/src/search/components/results/SearchResults.tsx index 9cac096f17..27c3a0d5b2 100644 --- a/src/search/components/results/SearchResults.tsx +++ b/src/search/components/results/SearchResults.tsx @@ -1,7 +1,7 @@ import { Box, Pagination, Text } from '@primer/react' import { SearchIcon } from '@primer/octicons-react' import { useRouter } from 'next/router' -import { useEffect, useRef, useState } from 'react' +import React, { useEffect, useRef, useState } from 'react' import cx from 'classnames' import { useTranslation } from '@/languages/components/useTranslation' diff --git a/src/tools/components/Fields.tsx b/src/tools/components/Fields.tsx index e6ae59f4e5..73c3dae6c5 100644 --- a/src/tools/components/Fields.tsx +++ b/src/tools/components/Fields.tsx @@ -1,5 +1,5 @@ import { ActionList } from '@primer/react' -import { ReactNode } from 'react' +import React, { ReactNode } from 'react' import cx from 'classnames' import { PickerItem } from './Picker'