diff --git a/.eslintrc.js b/.eslintrc.js index 7452532984..67999a3a2c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -49,14 +49,7 @@ module.exports = { 'import/no-unresolved': [ ERROR, { - ignore: [ - '^@theme', - '^@docusaurus', - '^@generated', - '^@site', - 'unist', - 'mdast', - ], + ignore: ['^@theme', '^@docusaurus', '^@generated', '^@site'], }, ], 'import/extensions': OFF, @@ -149,6 +142,7 @@ module.exports = { allowSingleExtends: true, }, ], + '@typescript-eslint/method-signature-style': ERROR, 'no-restricted-imports': [ ERROR, { diff --git a/packages/docusaurus-theme-classic/src/index.ts b/packages/docusaurus-theme-classic/src/index.ts index f54af080ba..2b90541672 100644 --- a/packages/docusaurus-theme-classic/src/index.ts +++ b/packages/docusaurus-theme-classic/src/index.ts @@ -5,12 +5,12 @@ * LICENSE file in the root directory of this source tree. */ -import {DocusaurusContext, Plugin} from '@docusaurus/types'; +import {DocusaurusContext, Plugin, PostCssOptions} from '@docusaurus/types'; import type {ThemeConfig} from '@docusaurus/theme-common'; import {getTranslationFiles, translateThemeConfig} from './translations'; import path from 'path'; import {createRequire} from 'module'; -import type {AcceptedPlugin, Plugin as PostCssPlugin} from 'postcss'; +import type {Plugin as PostCssPlugin} from 'postcss'; import rtlcss from 'rtlcss'; import {readDefaultCodeTranslationMessages} from '@docusaurus/theme-translations'; @@ -132,7 +132,12 @@ export default function docusaurusThemeClassic( }, getTranslationFiles: async () => getTranslationFiles({themeConfig}), - translateThemeConfig, + + translateThemeConfig: (params) => + translateThemeConfig({ + themeConfig: params.themeConfig as ThemeConfig, + translationFiles: params.translationFiles, + }), getDefaultCodeTranslationMessages() { return readDefaultCodeTranslationMessages({ @@ -178,7 +183,7 @@ export default function docusaurusThemeClassic( }; }, - configurePostCss(postCssOptions: {plugins: AcceptedPlugin[]}) { + configurePostCss(postCssOptions: PostCssOptions) { if (direction === 'rtl') { const resolvedInfimaFile = require.resolve(getInfimaCSSFile(direction)); const plugin: PostCssPlugin = { diff --git a/packages/docusaurus-theme-classic/src/translations.ts b/packages/docusaurus-theme-classic/src/translations.ts index 2b7a3ab6ab..be96e3b6c1 100644 --- a/packages/docusaurus-theme-classic/src/translations.ts +++ b/packages/docusaurus-theme-classic/src/translations.ts @@ -151,6 +151,8 @@ export function translateThemeConfig({ themeConfig, translationFiles, }: { + // Why partial? To make TS correctly figure out the contravariance in parameter. + // In practice it's always normalized themeConfig: ThemeConfig; translationFiles: TranslationFile[]; }): ThemeConfig { diff --git a/packages/docusaurus-theme-search-algolia/src/theme-search-algolia.d.ts b/packages/docusaurus-theme-search-algolia/src/theme-search-algolia.d.ts index e93073b41f..005a694670 100644 --- a/packages/docusaurus-theme-search-algolia/src/theme-search-algolia.d.ts +++ b/packages/docusaurus-theme-search-algolia/src/theme-search-algolia.d.ts @@ -12,10 +12,8 @@ declare module '@docusaurus/theme-search-algolia' { declare module '@theme/hooks/useSearchQuery' { export interface SearchQuery { searchQuery: string; - - setSearchQuery(newSearchQuery: string): void; - - generateSearchPageLink(targetSearchQuery: string): string; + setSearchQuery: (newSearchQuery: string) => void; + generateSearchPageLink: (targetSearchQuery: string) => string; } export default function useSearchQuery(): SearchQuery; diff --git a/packages/docusaurus-theme-translations/update.js b/packages/docusaurus-theme-translations/update.js index 74b5b20866..3422918f56 100644 --- a/packages/docusaurus-theme-translations/update.js +++ b/packages/docusaurus-theme-translations/update.js @@ -235,6 +235,8 @@ ${logKeys(untranslatedKeys)}`), } async function updateCodeTranslations() { + // Order is important. The log messages must be in the same order as execution + // eslint-disable-next-line no-restricted-syntax for (const theme of Themes) { const {baseFile, localesFiles} = await getCodeTranslationFiles(theme.name); logSection(`Will update base file for ${theme.name}`); @@ -259,6 +261,7 @@ async function updateCodeTranslations() { ); } } else { + // eslint-disable-next-line no-restricted-syntax for (const localeFile of localesFiles) { logSection( `Will update ${path.basename( diff --git a/packages/docusaurus-theme-translations/update.test.js b/packages/docusaurus-theme-translations/update.test.js index 5f786dca76..f8c8626aae 100644 --- a/packages/docusaurus-theme-translations/update.test.js +++ b/packages/docusaurus-theme-translations/update.test.js @@ -21,7 +21,7 @@ describe('theme-translations package', () => { await fs .readdirSync(baseMessagesDirPath) .reduce(async (messages, baseMessagesFile) => { - messages = { + const newMessages = { ...(await messages), ...JSON.parse( await fs.readFile( @@ -29,7 +29,7 @@ describe('theme-translations package', () => { ), ), }; - return messages; + return newMessages; }, {}), (_, key) => !key.endsWith('___DESCRIPTION'), ); diff --git a/packages/docusaurus-types/src/index.d.ts b/packages/docusaurus-types/src/index.d.ts index 36101f75b2..a9be044725 100644 --- a/packages/docusaurus-types/src/index.d.ts +++ b/packages/docusaurus-types/src/index.d.ts @@ -220,10 +220,10 @@ export interface Props extends LoadContext, InjectedHtmlTags { } export interface PluginContentLoadedActions { - addRoute(config: RouteConfig): void; + addRoute: (config: RouteConfig) => void; // eslint-disable-next-line @typescript-eslint/no-explicit-any - createData(name: string, data: any): Promise; - setGlobalData(data: T): void; + createData: (name: string, data: any) => Promise; + setGlobalData: (data: T) => void; } export type AllContent = Record< @@ -239,32 +239,32 @@ export type PostCssOptions = Record & {plugins: unknown[]}; export interface Plugin { name: string; - loadContent?(): Promise; - contentLoaded?({ + loadContent?: () => Promise; + contentLoaded?: ({ content, actions, }: { content: Content; // the content loaded by this plugin instance allContent: AllContent; // content loaded by ALL the plugins actions: PluginContentLoadedActions; - }): Promise; - routesLoaded?(routes: RouteConfig[]): void; // TODO remove soon, deprecated (alpha-60) - postBuild?(props: Props): void; - postStart?(props: Props): void; + }) => Promise; + routesLoaded?: (routes: RouteConfig[]) => void; // TODO remove soon, deprecated (alpha-60) + postBuild?: (props: Props) => void; + postStart?: (props: Props) => void; // TODO refactor the configureWebpack API surface: use an object instead of multiple params (requires breaking change) - configureWebpack?( + configureWebpack?: ( config: Configuration, isServer: boolean, utils: ConfigureWebpackUtils, content: Content, - ): Configuration & {mergeStrategy?: ConfigureWebpackFnMergeStrategy}; - configurePostCss?(options: PostCssOptions): PostCssOptions; - getThemePath?(): string; - getTypeScriptThemePath?(): string; - getPathsToWatch?(): string[]; - getClientModules?(): string[]; - extendCli?(cli: Command): void; - injectHtmlTags?({content}: {content: Content}): { + ) => Configuration & {mergeStrategy?: ConfigureWebpackFnMergeStrategy}; + configurePostCss?: (options: PostCssOptions) => PostCssOptions; + getThemePath?: () => string; + getTypeScriptThemePath?: () => string; + getPathsToWatch?: () => string[]; + getClientModules?: () => string[]; + extendCli?: (cli: Command) => void; + injectHtmlTags?: ({content}: {content: Content}) => { headTags?: HtmlTags; preBodyTags?: HtmlTags; postBodyTags?: HtmlTags; @@ -272,31 +272,31 @@ export interface Plugin { // TODO before/afterDevServer implementation // translations - getTranslationFiles?({ + getTranslationFiles?: ({ content, }: { content: Content; - }): Promise; - getDefaultCodeTranslationMessages?(): Promise< + }) => Promise; + getDefaultCodeTranslationMessages?: () => Promise< Record< string, // id string // message > >; - translateContent?({ + translateContent?: ({ content, translationFiles, }: { content: Content; // the content loaded by this plugin instance translationFiles: TranslationFiles; - }): Content; - translateThemeConfig?({ + }) => Content; + translateThemeConfig?: ({ themeConfig, translationFiles, }: { themeConfig: ThemeConfig; translationFiles: TranslationFiles; - }): ThemeConfig; + }) => ThemeConfig; } export type InitializedPlugin = Plugin & { @@ -310,9 +310,9 @@ export type LoadedPlugin = InitializedPlugin & { export type PluginModule = { (context: LoadContext, options: T): Plugin; - validateOptions?(data: OptionValidationContext): T; - validateThemeConfig?(data: ThemeConfigValidationContext): T; - getSwizzleComponentList?(): string[]; + validateOptions?: (data: OptionValidationContext) => T; + validateThemeConfig?: (data: ThemeConfigValidationContext) => T; + getSwizzleComponentList?: () => string[]; }; export type ImportedPluginModule = PluginModule & {