From 71a5973da42b786e1cedfe36b6688226d28eed08 Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 17 Mar 2021 14:53:17 -0400 Subject: [PATCH] chore(v2): Fix more linter warnings --- .eslintrc.js | 2 +- __tests__/validate-package-json.test.ts | 1 + packages/docusaurus-mdx-loader/package.json | 1 + packages/docusaurus-mdx-loader/src/index.d.ts | 19 +++++++++++++++ .../src/remark/toc/search.js | 2 ++ packages/docusaurus-migrate/src/index.ts | 19 +++++++-------- packages/docusaurus-migrate/src/types.ts | 12 ++++++++-- .../src/__tests__/index.test.ts | 2 ++ .../src/types.ts | 13 ++--------- .../src/__tests__/index.test.ts | 8 ++++--- .../docusaurus-plugin-content-docs/src/cli.ts | 3 ++- .../src/client/docsClientUtils.ts | 4 ++-- .../src/sidebars.ts | 6 ++--- .../src/types.ts | 14 +++-------- .../src/types.ts | 14 +++-------- .../docusaurus-theme-classic/src/index.ts | 23 +++++++++---------- .../src/theme/CodeBlock/index.tsx | 2 +- .../src/theme/SkipToContent/index.tsx | 4 ++-- .../src/theme/hooks/useTOCHighlight.ts | 6 ++--- .../update-code-translations.js | 1 + packages/docusaurus-types/src/index.d.ts | 7 +++--- .../validationSchemas.test.ts.snap | 8 +++---- .../src/validationSchemas.ts | 2 +- packages/docusaurus-utils/src/index.ts | 6 ++++- .../docusaurus/src/server/duplicateRoutes.ts | 2 +- packages/docusaurus/src/server/utils.ts | 2 +- packages/docusaurus/src/webpack/utils.ts | 18 ++++++++++++++- 27 files changed, 116 insertions(+), 85 deletions(-) create mode 100644 packages/docusaurus-mdx-loader/src/index.d.ts diff --git a/.eslintrc.js b/.eslintrc.js index 993d1d1e19be..ecd3e08099af 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -65,6 +65,7 @@ module.exports = { 'jsx-a11y/no-noninteractive-element-interactions': WARNING, 'no-console': OFF, 'no-else-return': OFF, + 'no-param-reassign': [WARNING, {props: false}], 'no-underscore-dangle': OFF, curly: [WARNING, 'all'], 'react/jsx-closing-bracket-location': OFF, // Conflicts with Prettier. @@ -103,7 +104,6 @@ module.exports = { 'import/no-extraneous-dependencies': ERROR, 'no-useless-escape': WARNING, 'prefer-template': WARNING, - 'no-param-reassign': WARNING, 'no-template-curly-in-string': WARNING, 'array-callback-return': WARNING, camelcase: WARNING, diff --git a/__tests__/validate-package-json.test.ts b/__tests__/validate-package-json.test.ts index 954a7daa3b9d..f6a1de64e6cd 100644 --- a/__tests__/validate-package-json.test.ts +++ b/__tests__/validate-package-json.test.ts @@ -14,6 +14,7 @@ const readFile = util.promisify(fsCb.readFile); type PackageJsonFile = { file: string; + // eslint-disable-next-line @typescript-eslint/no-explicit-any content: any; }; diff --git a/packages/docusaurus-mdx-loader/package.json b/packages/docusaurus-mdx-loader/package.json index a47bfec783fe..72eed7888be4 100644 --- a/packages/docusaurus-mdx-loader/package.json +++ b/packages/docusaurus-mdx-loader/package.json @@ -3,6 +3,7 @@ "version": "2.0.0-alpha.72", "description": "Docusaurus Loader for MDX", "main": "src/index.js", + "types": "src/index.d.ts", "publishConfig": { "access": "public" }, diff --git a/packages/docusaurus-mdx-loader/src/index.d.ts b/packages/docusaurus-mdx-loader/src/index.d.ts new file mode 100644 index 000000000000..0d13b2f37c79 --- /dev/null +++ b/packages/docusaurus-mdx-loader/src/index.d.ts @@ -0,0 +1,19 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +type RemarkOrRehypePlugin = + // eslint-disable-next-line @typescript-eslint/ban-types + [Function, Record] | Function; + +declare function docusaurusMdxLoader(fileString: string): string; + +export interface RemarkAndRehypePluginOptions { + remarkPlugins: RemarkOrRehypePlugin[]; + rehypePlugins: string[]; + beforeDefaultRemarkPlugins: RemarkOrRehypePlugin[]; + beforeDefaultRehypePlugins: RemarkOrRehypePlugin[]; +} diff --git a/packages/docusaurus-mdx-loader/src/remark/toc/search.js b/packages/docusaurus-mdx-loader/src/remark/toc/search.js index 54d8eb2eec79..3d8b869d390a 100644 --- a/packages/docusaurus-mdx-loader/src/remark/toc/search.js +++ b/packages/docusaurus-mdx-loader/src/remark/toc/search.js @@ -9,6 +9,8 @@ const toString = require('mdast-util-to-string'); const visit = require('unist-util-visit'); +// Destructuring require tslib +// eslint-disable-next-line prefer-destructuring const toValue = require('../utils').toValue; /** @typedef {import('@docusaurus/types').TOCItem} TOC */ diff --git a/packages/docusaurus-migrate/src/index.ts b/packages/docusaurus-migrate/src/index.ts index d41387d7655c..4f2a5ceb7eaf 100644 --- a/packages/docusaurus-migrate/src/index.ts +++ b/packages/docusaurus-migrate/src/index.ts @@ -13,6 +13,7 @@ import Color from 'color'; import { ClassicPresetEntries, + SidebarEntry, SidebarEntries, VersionOneConfig, VersionTwoConfig, @@ -584,9 +585,8 @@ function migrateVersionedSidebar( return; } const newSidebar = Object.entries(sidebarEntries).reduce( - (topLevel: {[key: string]: any}, value) => { + (topLevel: SidebarEntries, value) => { const key = value[0].replace(versionRegex, ''); - // eslint-disable-next-line no-param-reassign topLevel[key] = Object.entries(value[1]).reduce( ( acc: {[key: string]: Array | string>}, @@ -594,16 +594,14 @@ function migrateVersionedSidebar( ) => { acc[ val[0].replace(versionRegex, '') - ] = (val[1] as Array).map((item) => { + ] = (val[1] as Array).map((item) => { if (typeof item === 'string') { return item.replace(versionRegex, ''); } return { type: 'category', label: item.label, - ids: item.ids.map((id: string) => - id.replace(versionRegex, ''), - ), + ids: item.ids.map((id) => id.replace(versionRegex, '')), }; }); return acc; @@ -618,14 +616,14 @@ function migrateVersionedSidebar( }); sidebars.forEach((sidebar) => { const newSidebar = Object.entries(sidebar.entries).reduce( - (acc: {[key: string]: any}, val) => { + (acc: SidebarEntries, val) => { const key = `version-${sidebar.version}/${val[0]}`; // eslint-disable-next-line prefer-destructuring acc[key] = Object.entries(val[1]).map((value) => { return { type: 'category', label: value[0], - items: (value[1] as Array).map((sidebarItem) => { + items: (value[1] as Array).map((sidebarItem) => { if (typeof sidebarItem === 'string') { return { type: 'doc', @@ -756,7 +754,10 @@ function migratePackageFile( newDir: string, ): void { const packageFile = importFresh(`${siteDir}/package.json`) as { - [key: string]: any; + scripts?: Record; + dependencies?: Record; + devDependencies?: Record; + [otherKey: string]: unknown; }; packageFile.scripts = { ...packageFile.scripts, diff --git a/packages/docusaurus-migrate/src/types.ts b/packages/docusaurus-migrate/src/types.ts index 2aee8990ec39..a70fe63d3942 100644 --- a/packages/docusaurus-migrate/src/types.ts +++ b/packages/docusaurus-migrate/src/types.ts @@ -21,6 +21,14 @@ export type ClassicPresetEntries = { theme: {[key: string]: unknown}; }; +export type SidebarEntry = + | string + | { + type: string; + label: string; + ids: string[]; + }; + export type SidebarEntries = { [key: string]: | Record @@ -97,10 +105,10 @@ export type VersionOneConfig = { organizationName?: string; projectName?: string; noIndex?: boolean; - headerLinks?: Array; + headerLinks?: Array<{doc: string; href: string; label: string; page: string}>; headerIcon?: string; favicon?: string; - colors?: any; + colors?: {primaryColor: string}; copyright?: string; editUrl?: string; customDocsPath?: string; diff --git a/packages/docusaurus-plugin-content-blog/src/__tests__/index.test.ts b/packages/docusaurus-plugin-content-blog/src/__tests__/index.test.ts index 7d797832d622..e9fefc931712 100644 --- a/packages/docusaurus-plugin-content-blog/src/__tests__/index.test.ts +++ b/packages/docusaurus-plugin-content-blog/src/__tests__/index.test.ts @@ -5,6 +5,8 @@ * LICENSE file in the root directory of this source tree. */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ + import fs from 'fs-extra'; import path from 'path'; import pluginContentBlog from '../index'; diff --git a/packages/docusaurus-plugin-content-blog/src/types.ts b/packages/docusaurus-plugin-content-blog/src/types.ts index 2692118f7671..a8709b8c313b 100644 --- a/packages/docusaurus-plugin-content-blog/src/types.ts +++ b/packages/docusaurus-plugin-content-blog/src/types.ts @@ -5,6 +5,7 @@ * LICENSE file in the root directory of this source tree. */ +import type {RemarkAndRehypePluginOptions} from '@docusaurus/mdx-loader'; import { BrokenMarkdownLink, ContentPaths, @@ -33,7 +34,7 @@ export type EditUrlFunction = (editUrlParams: { locale: string; }) => string | undefined; -export interface PluginOptions { +export interface PluginOptions extends RemarkAndRehypePluginOptions { id?: string; path: string; routeBasePath: string; @@ -47,16 +48,6 @@ export interface PluginOptions { blogDescription: string; blogSidebarCount: number | 'ALL'; blogSidebarTitle: string; - remarkPlugins: ([Function, Record] | Function)[]; - beforeDefaultRehypePlugins: ( - | [Function, Record] - | Function - )[]; - beforeDefaultRemarkPlugins: ( - | [Function, Record] - | Function - )[]; - rehypePlugins: string[]; truncateMarker: RegExp; showReadingTime: boolean; feedOptions: { diff --git a/packages/docusaurus-plugin-content-docs/src/__tests__/index.test.ts b/packages/docusaurus-plugin-content-docs/src/__tests__/index.test.ts index 03ad2772c2b6..59d9c22b25a0 100644 --- a/packages/docusaurus-plugin-content-docs/src/__tests__/index.test.ts +++ b/packages/docusaurus-plugin-content-docs/src/__tests__/index.test.ts @@ -5,6 +5,8 @@ * LICENSE file in the root directory of this source tree. */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ + import path from 'path'; import {isMatch} from 'picomatch'; import commander from 'commander'; @@ -42,8 +44,8 @@ const defaultDocMetadata: Partial = { const createFakeActions = (contentDir: string) => { const routeConfigs: RouteConfig[] = []; - const dataContainer: any = {}; - const globalDataContainer: any = {}; + const dataContainer: Record = {}; + const globalDataContainer: {pluginName?: {pluginId: unknown}} = {}; const actions = { addRoute: (config: RouteConfig) => { @@ -53,7 +55,7 @@ const createFakeActions = (contentDir: string) => { dataContainer[name] = content; return path.join(contentDir, name); }, - setGlobalData: (data: any) => { + setGlobalData: (data: unknown) => { globalDataContainer.pluginName = {pluginId: data}; }, }; diff --git a/packages/docusaurus-plugin-content-docs/src/cli.ts b/packages/docusaurus-plugin-content-docs/src/cli.ts index 75b734c04b0d..8e17e6d8ad5d 100644 --- a/packages/docusaurus-plugin-content-docs/src/cli.ts +++ b/packages/docusaurus-plugin-content-docs/src/cli.ts @@ -49,7 +49,8 @@ export function cliDocsVersionCommand( // Since we are going to create `version-${version}` folder, we need to make // sure it's a valid pathname. - if (/[<>:"\/\\|?*\x00-\x1F]/g.test(version)) { + // eslint-disable-next-line no-control-regex + if (/[<>:"|?*\x00-\x1F]/g.test(version)) { throw new Error( `${pluginIdLogPrefix}Invalid version tag specified! Please ensure its a valid pathname too. Try something like: 1.0.0`, ); diff --git a/packages/docusaurus-plugin-content-docs/src/client/docsClientUtils.ts b/packages/docusaurus-plugin-content-docs/src/client/docsClientUtils.ts index 7d2f9adff395..bb7fadff2e41 100644 --- a/packages/docusaurus-plugin-content-docs/src/client/docsClientUtils.ts +++ b/packages/docusaurus-plugin-content-docs/src/client/docsClientUtils.ts @@ -121,7 +121,7 @@ export const getActiveDocContext = ( data.versions.forEach((version) => { version.docs.forEach((doc) => { if (doc.id === docId) { - result[version.name!] = doc; + result[version.name] = doc; } }); }); @@ -157,7 +157,7 @@ export const getDocVersionSuggestions = ( const isNotOnLatestVersion = activeDocContext.activeVersion !== latestVersion; const latestDocSuggestion: GlobalDoc | undefined = isNotOnLatestVersion - ? activeDocContext?.alternateDocVersions[latestVersion.name!] + ? activeDocContext?.alternateDocVersions[latestVersion.name] : undefined; const latestVersionSuggestion = isNotOnLatestVersion diff --git a/packages/docusaurus-plugin-content-docs/src/sidebars.ts b/packages/docusaurus-plugin-content-docs/src/sidebars.ts index 058791d58b73..1d98ddc92fd9 100644 --- a/packages/docusaurus-plugin-content-docs/src/sidebars.ts +++ b/packages/docusaurus-plugin-content-docs/src/sidebars.ts @@ -78,7 +78,7 @@ function normalizeCategoryShorthand( function assertItem( item: Record, keys: K[], -): asserts item is Record { +): asserts item is Record { const unknownKeys = Object.keys(item).filter( // @ts-expect-error: key is always string (key) => !keys.includes(key as string) && key !== 'type', @@ -272,9 +272,7 @@ export function collectSidebarsDocIds( }); } -export function createSidebarsUtils( - sidebars: Sidebars, -): Record { +export function createSidebarsUtils(sidebars: Sidebars) { const sidebarNameToDocIds = collectSidebarsDocIds(sidebars); function getFirstDocIdOfFirstSidebar(): string | undefined { diff --git a/packages/docusaurus-plugin-content-docs/src/types.ts b/packages/docusaurus-plugin-content-docs/src/types.ts index 730f7da88318..7fb0f50c224f 100644 --- a/packages/docusaurus-plugin-content-docs/src/types.ts +++ b/packages/docusaurus-plugin-content-docs/src/types.ts @@ -8,6 +8,7 @@ // eslint-disable-next-line spaced-comment /// +import type {RemarkAndRehypePluginOptions} from '@docusaurus/mdx-loader'; import { BrokenMarkdownLink as IBrokenMarkdownLink, ContentPaths, @@ -72,21 +73,12 @@ export type VersionsOptions = { export type PluginOptions = MetadataOptions & PathOptions & - VersionsOptions & { + VersionsOptions & + RemarkAndRehypePluginOptions & { id: string; include: string[]; docLayoutComponent: string; docItemComponent: string; - remarkPlugins: ([Function, Record] | Function)[]; - rehypePlugins: string[]; - beforeDefaultRemarkPlugins: ( - | [Function, Record] - | Function - )[]; - beforeDefaultRehypePlugins: ( - | [Function, Record] - | Function - )[]; admonitions: Record; disableVersioning: boolean; excludeNextVersionDocs?: boolean; diff --git a/packages/docusaurus-plugin-content-pages/src/types.ts b/packages/docusaurus-plugin-content-pages/src/types.ts index b1b6cab22780..b7107c91b862 100644 --- a/packages/docusaurus-plugin-content-pages/src/types.ts +++ b/packages/docusaurus-plugin-content-pages/src/types.ts @@ -5,23 +5,15 @@ * LICENSE file in the root directory of this source tree. */ -export interface PluginOptions { +import type {RemarkAndRehypePluginOptions} from '@docusaurus/mdx-loader'; + +export interface PluginOptions extends RemarkAndRehypePluginOptions { id?: string; path: string; routeBasePath: string; include: string[]; exclude: string[]; mdxPageComponent: string; - remarkPlugins: ([Function, Record] | Function)[]; - rehypePlugins: string[]; - beforeDefaultRemarkPlugins: ( - | [Function, Record] - | Function - )[]; - beforeDefaultRehypePlugins: ( - | [Function, Record] - | Function - )[]; admonitions: Record; } diff --git a/packages/docusaurus-theme-classic/src/index.ts b/packages/docusaurus-theme-classic/src/index.ts index 123c0bb5d96d..c719e3d19414 100644 --- a/packages/docusaurus-theme-classic/src/index.ts +++ b/packages/docusaurus-theme-classic/src/index.ts @@ -5,11 +5,12 @@ * LICENSE file in the root directory of this source tree. */ -import {Plugin} from '@docusaurus/types'; +import {DocusaurusContext, Plugin} from '@docusaurus/types'; +import {ThemeConfig} from '@docusaurus/theme-common'; import {getTranslationFiles, translateThemeConfig} from './translations'; import path from 'path'; import Module from 'module'; -import postcss from 'postcss'; +import postcss, {Root as PostCssRoot} from 'postcss'; import rtlcss from 'rtlcss'; import {readDefaultCodeTranslationMessages} from '@docusaurus/utils'; @@ -73,14 +74,15 @@ type PluginOptions = { }; export default function docusaurusThemeClassic( - context: any, // TODO: LoadContext is missing some of properties + context: DocusaurusContext, // TODO: LoadContext is missing some of properties options: PluginOptions, ): Plugin { const { - siteConfig: {themeConfig}, + siteConfig: {themeConfig: roughlyTypedThemeConfig}, i18n: {currentLocale, localeConfigs}, } = context; - const {colorMode, prism: {additionalLanguages = []} = {}} = themeConfig || {}; + const themeConfig = (roughlyTypedThemeConfig || {}) as ThemeConfig; + const {colorMode, prism: {additionalLanguages = []} = {}} = themeConfig; const {customCss} = options || {}; const {direction} = localeConfigs[currentLocale]; @@ -143,10 +145,7 @@ export default function docusaurusThemeClassic( return { stats: { - warningsFilter: [ - // The TS def does not allow function for array item :( - useDocsWarningFilter as any, - ], + warningsFilter: useDocsWarningFilter, }, plugins: [ new ContextReplacementPlugin( @@ -164,12 +163,12 @@ export default function docusaurusThemeClassic( const resolvedInfimaFile = require.resolve( getInfimaCSSFile(direction), ); - function isInfimaCSSFile(file) { + function isInfimaCSSFile(file?: string) { return file === resolvedInfimaFile; } - return function (root: any) { - const file = root?.source.input.file; + return function (root: PostCssRoot) { + const file = root?.source?.input.file; // Skip Infima as we are using the its RTL version. if (isInfimaCSSFile(file)) { diff --git a/packages/docusaurus-theme-classic/src/theme/CodeBlock/index.tsx b/packages/docusaurus-theme-classic/src/theme/CodeBlock/index.tsx index 49d14a4cc4c3..60859031c26e 100644 --- a/packages/docusaurus-theme-classic/src/theme/CodeBlock/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/CodeBlock/index.tsx @@ -125,7 +125,7 @@ export default function CodeBlock({ if (metastring && codeBlockTitleRegex.test(metastring)) { // Tested above - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion, prefer-destructuring codeBlockTitle = metastring.match(codeBlockTitleRegex)![1]; } diff --git a/packages/docusaurus-theme-classic/src/theme/SkipToContent/index.tsx b/packages/docusaurus-theme-classic/src/theme/SkipToContent/index.tsx index e98db76d2695..ae0b4833b551 100644 --- a/packages/docusaurus-theme-classic/src/theme/SkipToContent/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/SkipToContent/index.tsx @@ -33,8 +33,8 @@ function SkipToContent(): JSX.Element { }; useEffect(() => { - if (!location.hash) { - programmaticFocus(containerRef.current!); + if (!location.hash && containerRef.current) { + programmaticFocus(containerRef.current); } }, [location.pathname]); diff --git a/packages/docusaurus-theme-classic/src/theme/hooks/useTOCHighlight.ts b/packages/docusaurus-theme-classic/src/theme/hooks/useTOCHighlight.ts index 45f1400794fd..4eafd5622e17 100644 --- a/packages/docusaurus-theme-classic/src/theme/hooks/useTOCHighlight.ts +++ b/packages/docusaurus-theme-classic/src/theme/hooks/useTOCHighlight.ts @@ -12,9 +12,9 @@ function useTOCHighlight( linkActiveClassName: string, topOffset: number, ): void { - const [lastActiveLink, setLastActiveLink] = useState( - undefined!, - ); + const [lastActiveLink, setLastActiveLink] = useState< + HTMLAnchorElement | undefined + >(undefined); useEffect(() => { function setActiveLink() { diff --git a/packages/docusaurus-theme-classic/update-code-translations.js b/packages/docusaurus-theme-classic/update-code-translations.js index 44d2f7cf853e..7c6dedb98a9d 100644 --- a/packages/docusaurus-theme-classic/update-code-translations.js +++ b/packages/docusaurus-theme-classic/update-code-translations.js @@ -197,6 +197,7 @@ async function updateCodeTranslations() { const {baseFile, localesFiles} = await getCodeTranslationFiles(); const baseFileMessages = await updateBaseFile(baseFile); + // eslint-disable-next-line no-restricted-syntax for (const localeFile of localesFiles) { logSection(`Will update ${path.basename(localeFile)}`); // eslint-disable-next-line no-await-in-loop diff --git a/packages/docusaurus-types/src/index.d.ts b/packages/docusaurus-types/src/index.d.ts index cec7c1ee4b90..ec91913ecb7e 100644 --- a/packages/docusaurus-types/src/index.d.ts +++ b/packages/docusaurus-types/src/index.d.ts @@ -111,7 +111,7 @@ export type I18n = I18nConfig & { export interface DocusaurusContext { siteConfig: DocusaurusConfig; siteMetadata: DocusaurusSiteMetadata; - globalData: Record; + globalData: Record; i18n: I18n; codeTranslations: Record; isClient: boolean; @@ -184,7 +184,7 @@ export type HtmlTags = string | HtmlTagObject | (string | HtmlTagObject)[]; export interface Props extends LoadContext, InjectedHtmlTags { routes: RouteConfig[]; routesPaths: string[]; - plugins: Plugin[]; + plugins: Plugin[]; } /** @@ -196,6 +196,7 @@ export interface PropsPostBuild extends Props { export interface PluginContentLoadedActions { addRoute(config: RouteConfig): void; + // eslint-disable-next-line @typescript-eslint/no-explicit-any createData(name: string, data: any): Promise; setGlobalData(data: T): void; } @@ -209,7 +210,7 @@ export type AllContent = Record< >; // TODO improve type (not exposed by postcss-loader) -export type PostCssOptions = Record & {plugins: any[]}; +export type PostCssOptions = Record & {plugins: unknown[]}; export interface Plugin { name: string; diff --git a/packages/docusaurus-utils-validation/src/__tests__/__snapshots__/validationSchemas.test.ts.snap b/packages/docusaurus-utils-validation/src/__tests__/__snapshots__/validationSchemas.test.ts.snap index da99964c246a..4d9ff283cd7d 100644 --- a/packages/docusaurus-utils-validation/src/__tests__/__snapshots__/validationSchemas.test.ts.snap +++ b/packages/docusaurus-utils-validation/src/__tests__/__snapshots__/validationSchemas.test.ts.snap @@ -8,13 +8,13 @@ exports[`validation schemas AdmonitionsSchema: for value=null 1`] = `"\\"value\\ exports[`validation schemas AdmonitionsSchema: for value=true 1`] = `"\\"value\\" must be of type object"`; -exports[`validation schemas PluginIdSchema: for value="/docs" 1`] = `"\\"value\\" with value \\"/docs\\" fails to match the required pattern: /^[a-zA-Z_\\\\-]+$/"`; +exports[`validation schemas PluginIdSchema: for value="/docs" 1`] = `"\\"value\\" with value \\"/docs\\" fails to match the required pattern: /^[a-zA-Z_-]+$/"`; -exports[`validation schemas PluginIdSchema: for value="do cs" 1`] = `"\\"value\\" with value \\"do cs\\" fails to match the required pattern: /^[a-zA-Z_\\\\-]+$/"`; +exports[`validation schemas PluginIdSchema: for value="do cs" 1`] = `"\\"value\\" with value \\"do cs\\" fails to match the required pattern: /^[a-zA-Z_-]+$/"`; -exports[`validation schemas PluginIdSchema: for value="do/cs" 1`] = `"\\"value\\" with value \\"do/cs\\" fails to match the required pattern: /^[a-zA-Z_\\\\-]+$/"`; +exports[`validation schemas PluginIdSchema: for value="do/cs" 1`] = `"\\"value\\" with value \\"do/cs\\" fails to match the required pattern: /^[a-zA-Z_-]+$/"`; -exports[`validation schemas PluginIdSchema: for value="docs/" 1`] = `"\\"value\\" with value \\"docs/\\" fails to match the required pattern: /^[a-zA-Z_\\\\-]+$/"`; +exports[`validation schemas PluginIdSchema: for value="docs/" 1`] = `"\\"value\\" with value \\"docs/\\" fails to match the required pattern: /^[a-zA-Z_-]+$/"`; exports[`validation schemas PluginIdSchema: for value=[] 1`] = `"\\"value\\" must be a string"`; diff --git a/packages/docusaurus-utils-validation/src/validationSchemas.ts b/packages/docusaurus-utils-validation/src/validationSchemas.ts index 8aa0abba3511..d94c4851988f 100644 --- a/packages/docusaurus-utils-validation/src/validationSchemas.ts +++ b/packages/docusaurus-utils-validation/src/validationSchemas.ts @@ -8,7 +8,7 @@ import * as Joi from 'joi'; import {isValidPathname} from '@docusaurus/utils'; export const PluginIdSchema = Joi.string() - .regex(/^[a-zA-Z_\-]+$/) + .regex(/^[a-zA-Z_-]+$/) // duplicate core constant, otherwise cyclic dependency is created :( .default('default'); diff --git a/packages/docusaurus-utils/src/index.ts b/packages/docusaurus-utils/src/index.ts index 1f6093687709..64cec779126a 100644 --- a/packages/docusaurus-utils/src/index.ts +++ b/packages/docusaurus-utils/src/index.ts @@ -147,7 +147,7 @@ export function posixPath(str: string): string { // This way, Jest tests can run more reliably on any computer/CI // on both Unix/Windows // For Windows users this is not perfect (as they see / instead of \) but it's probably good enough -export function toMessageRelativeFilePath(filePath: string) { +export function toMessageRelativeFilePath(filePath: string): string { return posixPath(path.relative(process.cwd(), filePath)); } @@ -208,6 +208,7 @@ export function createExcerpt(fileString: string): string | undefined { const fileLines = fileString.trimLeft().split('\n'); /* eslint-disable no-continue */ + // eslint-disable-next-line no-restricted-syntax for (const fileLine of fileLines) { // Skip empty line. if (!fileLine.trim()) { @@ -491,6 +492,7 @@ export async function mapAsyncSequencial( action: (t: T) => Promise, ): Promise { const results: R[] = []; + // eslint-disable-next-line no-restricted-syntax for (const t of array) { // eslint-disable-next-line no-await-in-loop const result = await action(t); @@ -503,6 +505,7 @@ export async function findAsyncSequential( array: T[], predicate: (t: T) => Promise, ): Promise { + // eslint-disable-next-line no-restricted-syntax for (const t of array) { // eslint-disable-next-line no-await-in-loop if (await predicate(t)) { @@ -621,6 +624,7 @@ export async function readDefaultCodeTranslationMessages({ // Return the content of the first file that match // fr_FR.json => fr.json => nothing + // eslint-disable-next-line no-restricted-syntax for (const fileName of fileNamesToTry) { const filePath = path.resolve(dirPath, `${fileName}.json`); diff --git a/packages/docusaurus/src/server/duplicateRoutes.ts b/packages/docusaurus/src/server/duplicateRoutes.ts index 147cca896e75..46e10be74571 100644 --- a/packages/docusaurus/src/server/duplicateRoutes.ts +++ b/packages/docusaurus/src/server/duplicateRoutes.ts @@ -14,7 +14,7 @@ export function getAllDuplicateRoutes( const allRoutes: string[] = getAllFinalRoutes(pluginsRouteConfigs).map( (routeConfig) => routeConfig.path, ); - const seenRoutes: Record = {}; + const seenRoutes: Record = {}; return allRoutes.filter((route) => { if (Object.prototype.hasOwnProperty.call(seenRoutes, route)) { return true; diff --git a/packages/docusaurus/src/server/utils.ts b/packages/docusaurus/src/server/utils.ts index 7439fc7555a0..3991ba99bb84 100644 --- a/packages/docusaurus/src/server/utils.ts +++ b/packages/docusaurus/src/server/utils.ts @@ -23,7 +23,7 @@ export function getAllFinalRoutes(routeConfig: RouteConfig[]): RouteConfig[] { export async function safeGlobby( patterns: string[], options?: globby.GlobbyOptions, -) { +): Promise { // Required for Windows support, as paths using \ should not be used by globby // (also using the windows hard drive prefix like c: is not a good idea) const globPaths = patterns.map((dirPath) => diff --git a/packages/docusaurus/src/webpack/utils.ts b/packages/docusaurus/src/webpack/utils.ts index 7a959f0c8a2c..2aae9eee1a83 100644 --- a/packages/docusaurus/src/webpack/utils.ts +++ b/packages/docusaurus/src/webpack/utils.ts @@ -273,8 +273,24 @@ export function compile(config: Configuration[]): Promise { type AssetFolder = 'images' | 'files' | 'fonts' | 'medias'; +type FileLoaderUtils = { + loaders: { + file: (options: {folder: AssetFolder}) => Loader; + url: (options: {folder: AssetFolder}) => Loader; + inlineMarkdownImageFileLoader: string; + inlineMarkdownLinkFileLoader: string; + }; + rules: { + images: () => RuleSetRule; + fonts: () => RuleSetRule; + media: () => RuleSetRule; + svg: () => RuleSetRule; + otherAssets: () => RuleSetRule; + }; +}; + // Inspired by https://github.com/gatsbyjs/gatsby/blob/8e6e021014da310b9cc7d02e58c9b3efe938c665/packages/gatsby/src/utils/webpack-utils.ts#L447 -export function getFileLoaderUtils(): Record { +export function getFileLoaderUtils(): FileLoaderUtils { // files/images < 10kb will be inlined as base64 strings directly in the html const urlLoaderLimit = 10000;