From cfdd1f7e6dc3f41bea154d9ef84ad959872e9752 Mon Sep 17 00:00:00 2001 From: Designatory <89268060+Designatory@users.noreply.github.com> Date: Sun, 8 May 2022 13:39:03 +0530 Subject: [PATCH 01/18] docs: update GeekyWeb's showcase description (#7372) * Docs: Description Edited * minor edit Co-authored-by: Joshua Chen --- website/src/data/users.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/website/src/data/users.tsx b/website/src/data/users.tsx index 754660f479..4dc300d974 100644 --- a/website/src/data/users.tsx +++ b/website/src/data/users.tsx @@ -748,7 +748,8 @@ const Users: User[] = [ }, { title: 'GeekyWeb', - description: 'Global State and Logic Framework for reactive Applications', + description: + 'Learn to code yourself by exploring documentations, try GeekyWeb once', preview: require('./showcase/geekyweb.png'), website: 'https://geekyweb.eu.org/', source: 'https://github.com/Designatory/GeekyWeb', From c3880cc3425c836889f5e39af64fa7fb29c5e5b0 Mon Sep 17 00:00:00 2001 From: Joshua Chen Date: Sun, 8 May 2022 22:00:28 +0800 Subject: [PATCH 02/18] refactor(create): clean up logic when prompting for unspecified arguments (#7374) --- packages/create-docusaurus/src/index.ts | 616 ++++++++++++++---------- 1 file changed, 370 insertions(+), 246 deletions(-) diff --git a/packages/create-docusaurus/src/index.ts b/packages/create-docusaurus/src/index.ts index e913de7ef3..b35e653b0a 100755 --- a/packages/create-docusaurus/src/index.ts +++ b/packages/create-docusaurus/src/index.ts @@ -7,37 +7,39 @@ import logger from '@docusaurus/logger'; import fs from 'fs-extra'; +import {fileURLToPath} from 'url'; import prompts, {type Choice} from 'prompts'; import path from 'path'; import shell from 'shelljs'; import _ from 'lodash'; import supportsColor from 'supports-color'; -import {fileURLToPath} from 'url'; -const RecommendedTemplate = 'classic'; -const TypeScriptTemplateSuffix = '-typescript'; +type CLIOptions = { + packageManager?: PackageManager; + skipInstall?: boolean; + typescript?: boolean; + gitStrategy?: GitStrategy; +}; // Only used in the rare, rare case of running globally installed create + // using --skip-install. We need a default name to show the tip text -const DefaultPackageManager = 'npm'; +const defaultPackageManager = 'npm'; -const SupportedPackageManagers = { +const lockfileNames = { npm: 'package-lock.json', yarn: 'yarn.lock', pnpm: 'pnpm-lock.yaml', }; -type SupportedPackageManager = keyof typeof SupportedPackageManagers; +type PackageManager = keyof typeof lockfileNames; -const PackageManagersList = Object.keys( - SupportedPackageManagers, -) as SupportedPackageManager[]; +const packageManagers = Object.keys(lockfileNames) as PackageManager[]; -async function findPackageManagerFromLockFile(): Promise< - SupportedPackageManager | undefined -> { - for (const packageManager of PackageManagersList) { - const lockFilePath = path.resolve(SupportedPackageManagers[packageManager]); +async function findPackageManagerFromLockFile( + rootDir: string, +): Promise { + for (const packageManager of packageManagers) { + const lockFilePath = path.join(rootDir, lockfileNames[packageManager]); if (await fs.pathExists(lockFilePath)) { return packageManager; } @@ -45,15 +47,13 @@ async function findPackageManagerFromLockFile(): Promise< return undefined; } -function findPackageManagerFromUserAgent(): - | SupportedPackageManager - | undefined { - return PackageManagersList.find((packageManager) => +function findPackageManagerFromUserAgent(): PackageManager | undefined { + return packageManagers.find((packageManager) => process.env.npm_config_user_agent?.startsWith(packageManager), ); } -async function askForPackageManagerChoice(): Promise { +async function askForPackageManagerChoice(): Promise { const hasYarn = shell.exec('yarn --version', {silent: true}).code === 0; const hasPnpm = shell.exec('pnpm --version', {silent: true}).code === 0; @@ -65,67 +65,121 @@ async function askForPackageManagerChoice(): Promise { .map((p) => ({title: p, value: p})); return ( - await prompts({ - type: 'select', - name: 'packageManager', - message: 'Select a package manager...', - choices, - }) + await prompts( + { + type: 'select', + name: 'packageManager', + message: 'Select a package manager...', + choices, + }, + { + onCancel() { + logger.info`Falling back to name=${defaultPackageManager}`; + }, + }, + ) ).packageManager; } async function getPackageManager( - packageManagerChoice: SupportedPackageManager | undefined, - skipInstall: boolean = false, -): Promise { - if ( - packageManagerChoice && - !PackageManagersList.includes(packageManagerChoice) - ) { + dest: string, + {packageManager, skipInstall}: CLIOptions, +): Promise { + if (packageManager && !packageManagers.includes(packageManager)) { throw new Error( - `Invalid package manager choice ${packageManagerChoice}. Must be one of ${PackageManagersList.join( + `Invalid package manager choice ${packageManager}. Must be one of ${packageManagers.join( ', ', )}`, ); } return ( - packageManagerChoice ?? - (await findPackageManagerFromLockFile()) ?? + // If dest already contains a lockfile (e.g. if using a local template), we + // always use that instead + (await findPackageManagerFromLockFile(dest)) ?? + packageManager ?? + (await findPackageManagerFromLockFile('.')) ?? findPackageManagerFromUserAgent() ?? // This only happens if the user has a global installation in PATH - (skipInstall ? DefaultPackageManager : askForPackageManagerChoice()) + (skipInstall ? defaultPackageManager : askForPackageManagerChoice()) ?? + defaultPackageManager ); } -function isValidGitRepoUrl(gitRepoUrl: string) { - return ['https://', 'git@'].some((item) => gitRepoUrl.startsWith(item)); -} +const recommendedTemplate = 'classic'; +const typeScriptTemplateSuffix = '-typescript'; +const templatesDir = fileURLToPath(new URL('../templates', import.meta.url)); -async function updatePkg(pkgPath: string, obj: {[key: string]: unknown}) { - const pkg = await fs.readJSON(pkgPath); - const newPkg = Object.assign(pkg, obj); +type Template = { + name: string; + path: string; + tsVariantPath: string | undefined; +}; - await fs.outputFile(pkgPath, `${JSON.stringify(newPkg, null, 2)}\n`); -} - -async function readTemplates(templatesDir: string) { - const templates = (await fs.readdir(templatesDir)).filter( - (d) => - !d.startsWith('.') && - !d.startsWith('README') && - !d.endsWith(TypeScriptTemplateSuffix) && - d !== 'shared', +async function readTemplates(): Promise { + const dirContents = await fs.readdir(templatesDir); + const templates = await Promise.all( + dirContents + .filter( + (d) => + !d.startsWith('.') && + !d.startsWith('README') && + !d.endsWith(typeScriptTemplateSuffix) && + d !== 'shared', + ) + .map(async (name) => { + const tsVariantPath = path.join( + templatesDir, + `${name}${typeScriptTemplateSuffix}`, + ); + return { + name, + path: path.join(templatesDir, name), + tsVariantPath: (await fs.pathExists(tsVariantPath)) + ? tsVariantPath + : undefined, + }; + }), ); // Classic should be first in list! - return _.sortBy(templates, (t) => t !== RecommendedTemplate); + return _.sortBy(templates, (t) => t.name !== recommendedTemplate); } -function createTemplateChoices(templates: string[]) { - function makeNameAndValueChoice(value: string): Choice { +async function copyTemplate( + template: Template, + dest: string, + typescript: boolean, +): Promise { + await fs.copy(path.join(templatesDir, 'shared'), dest); + + // TypeScript variants will copy duplicate resources like CSS & config from + // base template + if (typescript) { + await fs.copy(template.path, dest, { + filter: async (filePath) => + (await fs.stat(filePath)).isDirectory() || + path.extname(filePath) === '.css' || + path.basename(filePath) === 'docusaurus.config.js', + }); + } + + await fs.copy(typescript ? template.tsVariantPath! : template.path, dest, { + // Symlinks don't exist in published npm packages anymore, so this is only + // to prevent errors during local testing + filter: async (filePath) => !(await fs.lstat(filePath)).isSymbolicLink(), + }); +} + +function createTemplateChoices(templates: Template[]): Choice[] { + function makeNameAndValueChoice(value: string | Template): Choice { + if (typeof value === 'string') { + return {title: value, value}; + } const title = - value === RecommendedTemplate ? `${value} (recommended)` : value; + value.name === recommendedTemplate + ? `${value.name} (recommended)` + : value.name; return {title, value}; } @@ -136,55 +190,33 @@ function createTemplateChoices(templates: string[]) { ]; } -function getTypeScriptBaseTemplate(template: string): string | undefined { - if (template.endsWith(TypeScriptTemplateSuffix)) { - return template.replace(TypeScriptTemplateSuffix, ''); - } - return undefined; -} - -async function copyTemplate( - templatesDir: string, - template: string, - dest: string, -) { - await fs.copy(path.join(templatesDir, 'shared'), dest); - - // TypeScript variants will copy duplicate resources like CSS & config from - // base template - const tsBaseTemplate = getTypeScriptBaseTemplate(template); - if (tsBaseTemplate) { - const tsBaseTemplatePath = path.resolve(templatesDir, tsBaseTemplate); - await fs.copy(tsBaseTemplatePath, dest, { - filter: async (filePath) => - (await fs.stat(filePath)).isDirectory() || - path.extname(filePath) === '.css' || - path.basename(filePath) === 'docusaurus.config.js', - }); - } - - await fs.copy(path.resolve(templatesDir, template), dest, { - // Symlinks don't exist in published npm packages anymore, so this is only - // to prevent errors during local testing - filter: async (filePath) => !(await fs.lstat(filePath)).isSymbolicLink(), - }); +function isValidGitRepoUrl(gitRepoUrl: string): boolean { + return ['https://', 'git@'].some((item) => gitRepoUrl.startsWith(item)); } const gitStrategies = ['deep', 'shallow', 'copy', 'custom'] as const; +type GitStrategy = typeof gitStrategies[number]; -async function getGitCommand(gitStrategy: typeof gitStrategies[number]) { +async function getGitCommand(gitStrategy: GitStrategy): Promise { switch (gitStrategy) { case 'shallow': case 'copy': return 'git clone --recursive --depth 1'; case 'custom': { - const {command} = await prompts({ - type: 'text', - name: 'command', - message: - 'Write your own git clone command. The repository URL and destination directory will be supplied. E.g. "git clone --depth 10"', - }); - return command; + const {command} = await prompts( + { + type: 'text', + name: 'command', + message: + 'Write your own git clone command. The repository URL and destination directory will be supplied. E.g. "git clone --depth 10"', + }, + { + onCancel() { + logger.info`Falling back to code=${'git clone'}`; + }, + }, + ); + return command ?? 'git clone'; } case 'deep': default: @@ -192,178 +224,273 @@ async function getGitCommand(gitStrategy: typeof gitStrategies[number]) { } } -export default async function init( +async function getSiteName( + reqName: string | undefined, rootDir: string, - siteName?: string, - reqTemplate?: string, - cliOptions: Partial<{ - packageManager: SupportedPackageManager; - skipInstall: boolean; - typescript: boolean; - gitStrategy: typeof gitStrategies[number]; - }> = {}, -): Promise { - const templatesDir = fileURLToPath(new URL('../templates', import.meta.url)); - const templates = await readTemplates(templatesDir); - const hasTS = (templateName: string) => - fs.pathExists( - path.join(templatesDir, `${templateName}${TypeScriptTemplateSuffix}`), - ); - let name = siteName; - - // Prompt if siteName is not passed from CLI. - if (!name) { - const prompt = await prompts({ +): Promise { + async function validateSiteName(siteName: string) { + if (!siteName) { + return 'A website name is required.'; + } + const dest = path.resolve(rootDir, siteName); + if (await fs.pathExists(dest)) { + return logger.interpolate`Directory already exists at path=${dest}!`; + } + return true; + } + if (reqName) { + const res = validateSiteName(reqName); + if (typeof res === 'string') { + throw new Error(res); + } + return reqName; + } + const {siteName} = await prompts( + { type: 'text', - name: 'name', + name: 'siteName', message: 'What should we name this site?', initial: 'website', - }); - name = prompt.name; - } - - if (!name) { - logger.error('A website name is required.'); - process.exit(1); - } - - const dest = path.resolve(rootDir, name); - if (await fs.pathExists(dest)) { - logger.error`Directory already exists at path=${dest}!`; - process.exit(1); - } - - let template = reqTemplate; - let useTS = cliOptions.typescript; - // Prompt if template is not provided from CLI. - if (!template) { - const templatePrompt = await prompts({ - type: 'select', - name: 'template', - message: 'Select a template below...', - choices: createTemplateChoices(templates), - }); - template = templatePrompt.template; - if (template && !useTS && (await hasTS(template))) { - const tsPrompt = await prompts({ - type: 'confirm', - name: 'useTS', - message: - 'This template is available in TypeScript. Do you want to use the TS variant?', - initial: false, - }); - useTS = tsPrompt.useTS; - } - } - - let gitStrategy = cliOptions.gitStrategy ?? 'deep'; - - // If user choose Git repository, we'll prompt for the url. - if (template === 'Git repository') { - const repoPrompt = await prompts({ - type: 'text', - name: 'gitRepoUrl', - validate: (url?: string) => { - if (url && isValidGitRepoUrl(url)) { - return true; - } - return logger.red('Invalid repository URL'); + validate: validateSiteName, + }, + { + onCancel() { + logger.error('A website name is required.'); + process.exit(1); }, - message: logger.interpolate`Enter a repository URL from GitHub, Bitbucket, GitLab, or any other public repo. -(e.g: url=${'https://github.com/ownerName/repoName.git'})`, - }); - ({gitStrategy} = await prompts({ - type: 'select', - name: 'gitStrategy', - message: 'How should we clone this repo?', - choices: [ - {title: 'Deep clone: preserve full history', value: 'deep'}, - {title: 'Shallow clone: clone with --depth=1', value: 'shallow'}, - { - title: 'Copy: do a shallow clone, but do not create a git repo', - value: 'copy', - }, - {title: 'Custom: enter your custom git clone command', value: 'custom'}, - ], - })); - template = repoPrompt.gitRepoUrl; - } else if (template === 'Local template') { - const dirPrompt = await prompts({ - type: 'text', - name: 'templateDir', - validate: async (dir?: string) => { - if (dir) { - const fullDir = path.resolve(dir); - if (await fs.pathExists(fullDir)) { + }, + ); + return siteName; +} + +type Source = + | { + type: 'template'; + template: Template; + typescript: boolean; + } + | { + type: 'git'; + url: string; + strategy: GitStrategy; + } + | { + type: 'local'; + path: string; + }; + +async function getSource( + reqTemplate: string | undefined, + templates: Template[], + cliOptions: CLIOptions, +): Promise { + if (reqTemplate) { + if (isValidGitRepoUrl(reqTemplate)) { + if ( + cliOptions.gitStrategy && + !gitStrategies.includes(cliOptions.gitStrategy) + ) { + logger.error`Invalid git strategy: name=${ + cliOptions.gitStrategy + }. Value must be one of ${gitStrategies.join(', ')}.`; + process.exit(1); + } + return { + type: 'git', + url: reqTemplate, + strategy: cliOptions.gitStrategy ?? 'deep', + }; + } else if (await fs.pathExists(path.resolve(reqTemplate))) { + return { + type: 'local', + path: path.resolve(reqTemplate), + }; + } + const template = templates.find((t) => t.name === reqTemplate); + if (!template) { + logger.error('Invalid template.'); + process.exit(1); + } + if (cliOptions.typescript && !template.tsVariantPath) { + logger.error`Template name=${reqTemplate} doesn't provide the TypeScript variant.`; + process.exit(1); + } + return { + type: 'template', + template, + typescript: cliOptions.typescript ?? false, + }; + } + const template = cliOptions.gitStrategy + ? 'Git repository' + : ( + await prompts( + { + type: 'select', + name: 'template', + message: 'Select a template below...', + choices: createTemplateChoices(templates), + }, + { + onCancel() { + logger.error('A choice is required.'); + process.exit(1); + }, + }, + ) + ).template; + if (template === 'Git repository') { + const {gitRepoUrl} = await prompts( + { + type: 'text', + name: 'gitRepoUrl', + validate: (url?: string) => { + if (url && isValidGitRepoUrl(url)) { return true; } - return logger.red( - logger.interpolate`path=${fullDir} does not exist.`, - ); - } - return logger.red('Please enter a valid path.'); + return logger.red('Invalid repository URL'); + }, + message: logger.interpolate`Enter a repository URL from GitHub, Bitbucket, GitLab, or any other public repo. +(e.g: url=${'https://github.com/ownerName/repoName.git'})`, }, + { + onCancel() { + logger.error('A git repo URL is required.'); + process.exit(1); + }, + }, + ); + let strategy = cliOptions.gitStrategy; + if (!strategy) { + ({strategy} = await prompts( + { + type: 'select', + name: 'strategy', + message: 'How should we clone this repo?', + choices: [ + {title: 'Deep clone: preserve full history', value: 'deep'}, + {title: 'Shallow clone: clone with --depth=1', value: 'shallow'}, + { + title: 'Copy: do a shallow clone, but do not create a git repo', + value: 'copy', + }, + { + title: 'Custom: enter your custom git clone command', + value: 'custom', + }, + ], + }, + { + onCancel() { + logger.info`Falling back to name=${'deep'}`; + }, + }, + )); + } + return { + type: 'git', + url: gitRepoUrl, + strategy: strategy ?? 'deep', + }; + } else if (template === 'Local template') { + const {templateDir} = await prompts( + { + type: 'text', + name: 'templateDir', + validate: async (dir?: string) => { + if (dir) { + const fullDir = path.resolve(dir); + if (await fs.pathExists(fullDir)) { + return true; + } + return logger.red( + logger.interpolate`path=${fullDir} does not exist.`, + ); + } + return logger.red('Please enter a valid path.'); + }, + message: + 'Enter a local folder path, relative to the current working directory.', + }, + { + onCancel() { + logger.error('A file path is required.'); + process.exit(1); + }, + }, + ); + return { + type: 'local', + path: templateDir, + }; + } + let useTS = cliOptions.typescript; + if (!useTS && template.tsVariantPath) { + ({useTS} = await prompts({ + type: 'confirm', + name: 'useTS', message: - 'Enter a local folder path, relative to the current working directory.', - }); - template = dirPrompt.templateDir; + 'This template is available in TypeScript. Do you want to use the TS variant?', + initial: false, + })); } + return { + type: 'template', + template, + typescript: useTS ?? false, + }; +} - if (!template) { - logger.error('Template should not be empty'); - process.exit(1); - } +async function updatePkg(pkgPath: string, obj: {[key: string]: unknown}) { + const pkg = await fs.readJSON(pkgPath); + const newPkg = Object.assign(pkg, obj); + + await fs.outputFile(pkgPath, `${JSON.stringify(newPkg, null, 2)}\n`); +} + +export default async function init( + rootDir: string, + reqName?: string, + reqTemplate?: string, + cliOptions: CLIOptions = {}, +): Promise { + const templates = await readTemplates(); + const siteName = await getSiteName(reqName, rootDir); + const dest = path.resolve(rootDir, siteName); + const source = await getSource(reqTemplate, templates, cliOptions); logger.info('Creating new Docusaurus project...'); - if (isValidGitRepoUrl(template)) { - logger.info`Cloning Git template url=${template}...`; - if (!gitStrategies.includes(gitStrategy)) { - logger.error`Invalid git strategy: name=${gitStrategy}. Value must be one of ${gitStrategies.join( - ', ', - )}.`; + if (source.type === 'git') { + logger.info`Cloning Git template url=${source.url}...`; + const command = await getGitCommand(source.strategy); + if (shell.exec(`${command} ${source.url} ${dest}`).code !== 0) { + logger.error`Cloning Git template failed!`; process.exit(1); } - const command = await getGitCommand(gitStrategy); - if (shell.exec(`${command} ${template} ${dest}`).code !== 0) { - logger.error`Cloning Git template name=${template} failed!`; - process.exit(1); - } - if (gitStrategy === 'copy') { + if (source.strategy === 'copy') { await fs.remove(path.join(dest, '.git')); } - } else if (templates.includes(template)) { - // Docusaurus templates. - if (useTS) { - if (!(await hasTS(template))) { - logger.error`Template name=${template} doesn't provide the TypeScript variant.`; - process.exit(1); - } - template = `${template}${TypeScriptTemplateSuffix}`; - } + } else if (source.type === 'template') { try { - await copyTemplate(templatesDir, template, dest); + await copyTemplate(source.template, dest, source.typescript); } catch (err) { - logger.error`Copying Docusaurus template name=${template} failed!`; - throw err; - } - } else if (await fs.pathExists(path.resolve(template))) { - const templateDir = path.resolve(template); - try { - await fs.copy(templateDir, dest); - } catch (err) { - logger.error`Copying local template path=${templateDir} failed!`; + logger.error`Copying Docusaurus template name=${source.template.name} failed!`; throw err; } } else { - logger.error('Invalid template.'); - process.exit(1); + try { + await fs.copy(source.path, dest); + } catch (err) { + logger.error`Copying local template path=${source.path} failed!`; + throw err; + } } // Update package.json info. try { await updatePkg(path.join(dest, 'package.json'), { - name: _.kebabCase(name), + name: _.kebabCase(siteName), version: '0.0.0', private: true, }); @@ -385,10 +512,7 @@ export default async function init( // Display the most elegant way to cd. const cdpath = path.relative('.', dest); - const pkgManager = await getPackageManager( - cliOptions.packageManager, - cliOptions.skipInstall, - ); + const pkgManager = await getPackageManager(dest, cliOptions); if (!cliOptions.skipInstall) { shell.cd(dest); logger.info`Installing dependencies with name=${pkgManager}...`; @@ -398,8 +522,8 @@ export default async function init( { env: { ...process.env, - // Force coloring the output, since the command is invoked, - // by shelljs which is not the interactive shell + // Force coloring the output, since the command is invoked by + // shelljs, which is not an interactive shell ...(supportsColor.stdout ? {FORCE_COLOR: '1'} : {}), }, }, From 6e10a48059cb71fc112af32cb955043fd1b1dacd Mon Sep 17 00:00:00 2001 From: Joshua Chen Date: Tue, 10 May 2022 14:50:43 +0800 Subject: [PATCH 03/18] fix(content-docs): restore functionality when a category only has index page (#7385) * fix(content-docs): restore functionality when a category only has index page * use this internally --- .../src/sidebars/README.md | 1 + .../sidebars/sidebars-category-index.json | 23 ++++++ .../sidebars/sidebars-drafts.json | 60 ++++++++++++++++ .../__snapshots__/index.test.ts.snap | 51 +++++++++++++ .../__snapshots__/postProcessor.test.ts.snap | 13 +++- .../src/sidebars/__tests__/index.test.ts | 28 ++++++++ .../sidebars/__tests__/postProcessor.test.ts | 35 +++++++++ .../src/sidebars/postProcessor.ts | 67 ++++++++++++------ .../src/sidebars/processor.ts | 24 ++----- website/community/{ => 4-canary}/Versions.tsx | 0 .../{4-canary.md => 4-canary/index.md} | 0 .../{img/logger-demo.png => logger/demo.png} | Bin website/docs/api/misc/{ => logger}/logger.md | 2 +- 13 files changed, 258 insertions(+), 46 deletions(-) create mode 100644 packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/__fixtures__/sidebars/sidebars-category-index.json create mode 100644 packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/__fixtures__/sidebars/sidebars-drafts.json rename website/community/{ => 4-canary}/Versions.tsx (100%) rename website/community/{4-canary.md => 4-canary/index.md} (100%) rename website/docs/api/misc/{img/logger-demo.png => logger/demo.png} (100%) rename website/docs/api/misc/{ => logger}/logger.md (99%) diff --git a/packages/docusaurus-plugin-content-docs/src/sidebars/README.md b/packages/docusaurus-plugin-content-docs/src/sidebars/README.md index 6b10e0602b..0f1f26e55e 100644 --- a/packages/docusaurus-plugin-content-docs/src/sidebars/README.md +++ b/packages/docusaurus-plugin-content-docs/src/sidebars/README.md @@ -6,4 +6,5 @@ This part is very complicated and hard to navigate. Sidebars are loaded through 2. **Normalization**. The shorthands are expanded. This step is very lenient about the sidebars' shapes. Returns `NormalizedSidebars`. 3. **Validation**. The normalized sidebars are validated. This step happens after normalization, because the normalized sidebars are easier to validate, and allows us to repeatedly validate & generate in the future. 4. **Generation**. This step is done through the "processor" (naming is hard). The `autogenerated` items are unwrapped. In the future, steps 3 and 4 may be repeatedly done until all autogenerated items are unwrapped. Returns `ProcessedSidebars`. + - **Important**: this step should only care about unwrapping autogenerated items, not filtering them, writing additional metadata, applying defaults, etc.—everything will be handled in the post-processor. Important because the generator is exposed to the end-user and we want it to be easy to be reasoned about. 5. **Post-processing**. Defaults are applied (collapsed states), category links are resolved, empty categories are flattened. Returns `Sidebars`. diff --git a/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/__fixtures__/sidebars/sidebars-category-index.json b/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/__fixtures__/sidebars/sidebars-category-index.json new file mode 100644 index 0000000000..9e54b3d19e --- /dev/null +++ b/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/__fixtures__/sidebars/sidebars-category-index.json @@ -0,0 +1,23 @@ +{ + "docs": [ + { + "label": "Tutorials", + "type": "category", + "items": [ + { + "type": "autogenerated", + "dirName": "tutorials" + } + ] + }, + { + "label": "index-only", + "type": "category", + "link": { + "type": "doc", + "id": "tutorials/tutorial-basics" + }, + "items": [] + } + ] +} diff --git a/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/__fixtures__/sidebars/sidebars-drafts.json b/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/__fixtures__/sidebars/sidebars-drafts.json new file mode 100644 index 0000000000..52aedd8fd6 --- /dev/null +++ b/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/__fixtures__/sidebars/sidebars-drafts.json @@ -0,0 +1,60 @@ +{ + "sidebar": [ + "draft1", + { + "type": "category", + "label": "all drafts", + "items": [ + "draft2", + "draft3" + ] + }, + { + "type": "category", + "label": "all drafts", + "link": { + "type": "generated-index" + }, + "items": [ + "draft2", + "draft3" + ] + }, + { + "type": "category", + "label": "all drafts", + "link": { + "type": "doc", + "id": "draft1" + }, + "items": [ + "draft2", + "draft3" + ] + }, + { + "type": "category", + "label": "index not draft", + "link": { + "type": "doc", + "id": "not-draft" + }, + "items": [ + "draft2", + "draft3" + ] + }, + { + "type": "category", + "label": "subitem not draft", + "link": { + "type": "doc", + "id": "draft1" + }, + "items": [ + "not-draft", + "draft3" + ] + } + ] +} diff --git a/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/__snapshots__/index.test.ts.snap b/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/__snapshots__/index.test.ts.snap index f5b2acdd51..608ffc7538 100644 --- a/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/__snapshots__/index.test.ts.snap +++ b/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/__snapshots__/index.test.ts.snap @@ -1,5 +1,56 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`loadSidebars loads sidebars with index-only categories 1`] = ` +{ + "docs": [ + { + "collapsed": true, + "collapsible": true, + "items": [ + { + "id": "tutorials/tutorial-basics", + "label": "tutorial-basics", + "type": "doc", + }, + ], + "label": "Tutorials", + "link": undefined, + "type": "category", + }, + { + "id": "tutorials/tutorial-basics", + "label": "index-only", + "type": "doc", + }, + ], +} +`; + +exports[`loadSidebars loads sidebars with interspersed draft items 1`] = ` +{ + "sidebar": [ + { + "id": "not-draft", + "label": "index not draft", + "type": "doc", + }, + { + "collapsed": true, + "collapsible": true, + "items": [ + { + "id": "not-draft", + "type": "doc", + }, + ], + "label": "subitem not draft", + "link": undefined, + "type": "category", + }, + ], +} +`; + exports[`loadSidebars sidebars link 1`] = ` { "docs": [ diff --git a/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/__snapshots__/postProcessor.test.ts.snap b/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/__snapshots__/postProcessor.test.ts.snap index cb42628261..3284571628 100644 --- a/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/__snapshots__/postProcessor.test.ts.snap +++ b/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/__snapshots__/postProcessor.test.ts.snap @@ -60,14 +60,21 @@ exports[`postProcess corrects collapsed state inconsistencies 3`] = ` } `; -exports[`postProcess transforms category without subitems 1`] = ` +exports[`postProcess filters draft items 1`] = ` { "sidebar": [ { - "href": "version/generated/permalink", + "id": "another", "label": "Category", - "type": "link", + "type": "doc", }, + ], +} +`; + +exports[`postProcess transforms category without subitems 1`] = ` +{ + "sidebar": [ { "id": "doc ID", "label": "Category 2", diff --git a/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/index.test.ts b/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/index.test.ts index 3a92144ffd..aedcfe0db3 100644 --- a/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/index.test.ts +++ b/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/index.test.ts @@ -7,6 +7,7 @@ import {jest} from '@jest/globals'; import path from 'path'; +import {createSlugger} from '@docusaurus/utils'; import {loadSidebars, DisabledSidebars} from '../index'; import type {SidebarProcessorParams} from '../types'; import {DefaultSidebarItemsGenerator} from '../generator'; @@ -27,6 +28,7 @@ describe('loadSidebars', () => { ], drafts: [], version: { + path: 'version', contentPath: path.join(fixtureDir, 'docs'), contentPathLocalized: path.join(fixtureDir, 'docs'), }, @@ -124,6 +126,32 @@ describe('loadSidebars', () => { expect(result).toMatchSnapshot(); }); + it('loads sidebars with index-only categories', async () => { + const sidebarPath = path.join(fixtureDir, 'sidebars-category-index.json'); + const result = await loadSidebars(sidebarPath, { + ...params, + docs: [ + { + id: 'tutorials/tutorial-basics', + source: '@site/docs/tutorials/tutorial-basics/index.md', + sourceDirName: 'tutorials/tutorial-basics', + frontMatter: {}, + }, + ], + }); + expect(result).toMatchSnapshot(); + }); + + it('loads sidebars with interspersed draft items', async () => { + const sidebarPath = path.join(fixtureDir, 'sidebars-drafts.json'); + const result = await loadSidebars(sidebarPath, { + ...params, + drafts: [{id: 'draft1'}, {id: 'draft2'}, {id: 'draft3'}], + categoryLabelSlugger: createSlugger(), + }); + expect(result).toMatchSnapshot(); + }); + it('duplicate category metadata files', async () => { const sidebarPath = path.join( fixtureDir, diff --git a/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/postProcessor.test.ts b/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/postProcessor.test.ts index a1a8e56d8f..16196c7c3d 100644 --- a/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/postProcessor.test.ts +++ b/packages/docusaurus-plugin-content-docs/src/sidebars/__tests__/postProcessor.test.ts @@ -35,6 +35,7 @@ describe('postProcess', () => { { sidebarOptions: {sidebarCollapsed: true, sidebarCollapsible: true}, version: {path: 'version'}, + drafts: [], }, ); @@ -54,6 +55,7 @@ describe('postProcess', () => { { sidebarOptions: {sidebarCollapsed: true, sidebarCollapsible: true}, version: {path: 'version'}, + drafts: [], }, ); }).toThrowErrorMatchingInlineSnapshot( @@ -79,6 +81,7 @@ describe('postProcess', () => { { sidebarOptions: {sidebarCollapsed: true, sidebarCollapsible: true}, version: {path: 'version'}, + drafts: [], }, ), ).toMatchSnapshot(); @@ -99,6 +102,7 @@ describe('postProcess', () => { { sidebarOptions: {sidebarCollapsed: false, sidebarCollapsible: false}, version: {path: 'version'}, + drafts: [], }, ), ).toMatchSnapshot(); @@ -118,6 +122,37 @@ describe('postProcess', () => { { sidebarOptions: {sidebarCollapsed: true, sidebarCollapsible: false}, version: {path: 'version'}, + drafts: [], + }, + ), + ).toMatchSnapshot(); + }); + + it('filters draft items', () => { + expect( + postProcessSidebars( + { + sidebar: [ + { + type: 'category', + label: 'Category', + items: [{type: 'doc', id: 'foo'}], + }, + { + type: 'category', + label: 'Category', + link: { + type: 'doc', + id: 'another', + }, + items: [{type: 'doc', id: 'foo'}], + }, + ], + }, + { + sidebarOptions: {sidebarCollapsed: true, sidebarCollapsible: true}, + version: {path: 'version'}, + drafts: [{id: 'foo', unversionedId: 'foo'}], }, ), ).toMatchSnapshot(); diff --git a/packages/docusaurus-plugin-content-docs/src/sidebars/postProcessor.ts b/packages/docusaurus-plugin-content-docs/src/sidebars/postProcessor.ts index ac662291d3..717db08605 100644 --- a/packages/docusaurus-plugin-content-docs/src/sidebars/postProcessor.ts +++ b/packages/docusaurus-plugin-content-docs/src/sidebars/postProcessor.ts @@ -15,12 +15,20 @@ import type { ProcessedSidebars, SidebarItemCategoryLink, } from './types'; +import {getDocIds} from '../docs'; import _ from 'lodash'; +type SidebarPostProcessorParams = SidebarProcessorParams & { + draftIds: Set; +}; + function normalizeCategoryLink( category: ProcessedSidebarItemCategory, - params: SidebarProcessorParams, + params: SidebarPostProcessorParams, ): SidebarItemCategoryLink | undefined { + if (category.link?.type === 'doc' && params.draftIds.has(category.link.id)) { + return undefined; + } if (category.link?.type === 'generated-index') { // Default slug logic can be improved const getDefaultSlug = () => @@ -38,37 +46,42 @@ function normalizeCategoryLink( function postProcessSidebarItem( item: ProcessedSidebarItem, - params: SidebarProcessorParams, -): SidebarItem { + params: SidebarPostProcessorParams, +): SidebarItem | null { if (item.type === 'category') { + // Fail-fast if there's actually no subitems, no because all subitems are + // drafts. This is likely a configuration mistake. + if (item.items.length === 0 && !item.link) { + throw new Error( + `Sidebar category ${item.label} has neither any subitem nor a link. This makes this item not able to link to anything.`, + ); + } const category = { ...item, collapsed: item.collapsed ?? params.sidebarOptions.sidebarCollapsed, collapsible: item.collapsible ?? params.sidebarOptions.sidebarCollapsible, link: normalizeCategoryLink(item, params), - items: item.items.map((subItem) => - postProcessSidebarItem(subItem, params), - ), + items: item.items + .map((subItem) => postProcessSidebarItem(subItem, params)) + .filter((v): v is SidebarItem => Boolean(v)), }; // If the current category doesn't have subitems, we render a normal link // instead. if (category.items.length === 0) { - if (!category.link) { - throw new Error( - `Sidebar category ${item.label} has neither any subitem nor a link. This makes this item not able to link to anything.`, - ); + // Doesn't make sense to render an empty generated index page, so we + // filter the entire category out as well. + if ( + !category.link || + category.link.type === 'generated-index' || + params.draftIds.has(category.link.id) + ) { + return null; } - return category.link.type === 'doc' - ? { - type: 'doc', - label: category.label, - id: category.link.id, - } - : { - type: 'link', - label: category.label, - href: category.link.permalink, - }; + return { + type: 'doc', + label: category.label, + id: category.link.id, + }; } // A non-collapsible category can't be collapsed! if (category.collapsible === false) { @@ -76,6 +89,12 @@ function postProcessSidebarItem( } return category; } + if ( + (item.type === 'doc' || item.type === 'ref') && + params.draftIds.has(item.id) + ) { + return null; + } return item; } @@ -83,7 +102,11 @@ export function postProcessSidebars( sidebars: ProcessedSidebars, params: SidebarProcessorParams, ): Sidebars { + const draftIds = new Set(params.drafts.flatMap(getDocIds)); + return _.mapValues(sidebars, (sidebar) => - sidebar.map((item) => postProcessSidebarItem(item, params)), + sidebar + .map((item) => postProcessSidebarItem(item, {...params, draftIds})) + .filter((v): v is SidebarItem => Boolean(v)), ); } diff --git a/packages/docusaurus-plugin-content-docs/src/sidebars/processor.ts b/packages/docusaurus-plugin-content-docs/src/sidebars/processor.ts index b0153e9dcb..7e83dd08a9 100644 --- a/packages/docusaurus-plugin-content-docs/src/sidebars/processor.ts +++ b/packages/docusaurus-plugin-content-docs/src/sidebars/processor.ts @@ -26,7 +26,7 @@ import {DefaultSidebarItemsGenerator} from './generator'; import {validateSidebars} from './validation'; import _ from 'lodash'; import combinePromises from 'combine-promises'; -import {getDocIds, isCategoryIndex} from '../docs'; +import {isCategoryIndex} from '../docs'; function toSidebarItemsGeneratorDoc( doc: DocMetadataBase, @@ -55,8 +55,7 @@ async function processSidebar( categoriesMetadata: {[filePath: string]: CategoryMetadataFile}, params: SidebarProcessorParams, ): Promise { - const {sidebarItemsGenerator, numberPrefixParser, docs, drafts, version} = - params; + const {sidebarItemsGenerator, numberPrefixParser, docs, version} = params; // Just a minor lazy transformation optimization const getSidebarItemsGeneratorDocsAndVersion = _.memoize(() => ({ @@ -82,19 +81,6 @@ async function processSidebar( return processItems(generatedItems); } - const draftIds = new Set(drafts.flatMap(getDocIds)); - - const isDraftItem = (item: NormalizedSidebarItem): boolean => { - if (item.type === 'doc' || item.type === 'ref') { - return draftIds.has(item.id); - } - // If a category only contains draft items, it should be filtered entirely. - if (item.type === 'category') { - return item.items.every(isDraftItem); - } - return false; - }; - async function processItem( item: NormalizedSidebarItem, ): Promise { @@ -102,7 +88,7 @@ async function processSidebar( return [ { ...item, - items: await processItems(item.items), + items: (await Promise.all(item.items.map(processItem))).flat(), }, ]; } @@ -115,9 +101,7 @@ async function processSidebar( async function processItems( items: NormalizedSidebarItem[], ): Promise { - return ( - await Promise.all(items.filter((i) => !isDraftItem(i)).map(processItem)) - ).flat(); + return (await Promise.all(items.map(processItem))).flat(); } const processedSidebar = await processItems(unprocessedSidebar); diff --git a/website/community/Versions.tsx b/website/community/4-canary/Versions.tsx similarity index 100% rename from website/community/Versions.tsx rename to website/community/4-canary/Versions.tsx diff --git a/website/community/4-canary.md b/website/community/4-canary/index.md similarity index 100% rename from website/community/4-canary.md rename to website/community/4-canary/index.md diff --git a/website/docs/api/misc/img/logger-demo.png b/website/docs/api/misc/logger/demo.png similarity index 100% rename from website/docs/api/misc/img/logger-demo.png rename to website/docs/api/misc/logger/demo.png diff --git a/website/docs/api/misc/logger.md b/website/docs/api/misc/logger/logger.md similarity index 99% rename from website/docs/api/misc/logger.md rename to website/docs/api/misc/logger/logger.md index 986c4d2880..fb291473dd 100644 --- a/website/docs/api/misc/logger.md +++ b/website/docs/api/misc/logger/logger.md @@ -64,4 +64,4 @@ An embedded expression is optionally preceded by a flag in the form `[a-z]+=` (a If the expression is an array, it's formatted by `` `\n- ${array.join('\n- ')}\n` `` (note it automatically gets a leading line end). Each member is formatted by itself and the bullet is not formatted. So you would see the above message printed as: -![demo](./img/logger-demo.png) +![demo](./demo.png) From 60960b471d3001346ed3f3e4a44c8c0cfbb23d90 Mon Sep 17 00:00:00 2001 From: Joshua Chen Date: Tue, 10 May 2022 22:42:45 +0800 Subject: [PATCH 04/18] chore: upgrade dependencies, fix lint-staged not outputting formatted log (#7388) * chore: upgrade dependencies, fix lint-staged not outputting formatted log * fix * fix lock... --- .husky/pre-commit | 5 +- package.json | 10 +- packages/docusaurus-mdx-loader/package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- packages/docusaurus-plugin-pwa/package.json | 4 +- packages/docusaurus-types/package.json | 2 +- packages/docusaurus-utils/package.json | 2 +- packages/docusaurus/package.json | 4 +- packages/eslint-plugin/package.json | 2 +- website/package.json | 2 +- yarn.lock | 316 +++++++++--------- 14 files changed, 180 insertions(+), 177 deletions(-) diff --git a/.husky/pre-commit b/.husky/pre-commit index 12ac3025e4..ff675761f2 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,7 @@ #!/bin/sh . "$(dirname "$0")/_/husky.sh" -yarn lint-staged --allow-empty +# Workaround of a mysterious bug in either lint-staged or husky. +# https://github.com/typicode/husky/issues/1134 +# https://github.com/okonet/lint-staged/issues/693#issuecomment-1079759224 +FORCE_COLOR=1 yarn lint-staged --allow-empty diff --git a/package.json b/package.json index cce61752d7..16f2f3be15 100644 --- a/package.json +++ b/package.json @@ -63,8 +63,8 @@ }, "devDependencies": { "@crowdin/cli": "^3.7.8", - "@swc/core": "^1.2.178", - "@swc/jest": "^0.2.20", + "@swc/core": "^1.2.181", + "@swc/jest": "^0.2.21", "@testing-library/react-hooks": "^8.0.0", "@types/fs-extra": "^9.0.13", "@types/jest": "^27.5.0", @@ -76,8 +76,8 @@ "@types/react-test-renderer": "^18.0.0", "@types/semver": "^7.3.9", "@types/shelljs": "^0.8.11", - "@typescript-eslint/eslint-plugin": "^5.22.0", - "@typescript-eslint/parser": "^5.22.0", + "@typescript-eslint/eslint-plugin": "^5.23.0", + "@typescript-eslint/parser": "^5.23.0", "concurrently": "^7.1.0", "cross-env": "^7.0.3", "cspell": "^5.20.0", @@ -91,7 +91,7 @@ "eslint-plugin-react": "^7.29.4", "eslint-plugin-react-hooks": "^4.5.0", "eslint-plugin-regexp": "^1.7.0", - "husky": "^7.0.4", + "husky": "^8.0.1", "image-size": "^1.0.1", "jest": "^28.1.0", "jest-environment-jsdom": "^28.1.0", diff --git a/packages/docusaurus-mdx-loader/package.json b/packages/docusaurus-mdx-loader/package.json index 6be990a287..c05708cd9f 100644 --- a/packages/docusaurus-mdx-loader/package.json +++ b/packages/docusaurus-mdx-loader/package.json @@ -33,7 +33,7 @@ "tslib": "^2.4.0", "unist-util-visit": "^2.0.3", "url-loader": "^4.1.1", - "webpack": "^5.72.0" + "webpack": "^5.72.1" }, "devDependencies": { "@docusaurus/types": "2.0.0-beta.20", diff --git a/packages/docusaurus-plugin-content-blog/package.json b/packages/docusaurus-plugin-content-blog/package.json index 629dccc13c..aaf8a68635 100644 --- a/packages/docusaurus-plugin-content-blog/package.json +++ b/packages/docusaurus-plugin-content-blog/package.json @@ -33,7 +33,7 @@ "tslib": "^2.4.0", "unist-util-visit": "^2.0.3", "utility-types": "^3.10.0", - "webpack": "^5.72.0" + "webpack": "^5.72.1" }, "devDependencies": { "@docusaurus/types": "2.0.0-beta.20", diff --git a/packages/docusaurus-plugin-content-docs/package.json b/packages/docusaurus-plugin-content-docs/package.json index b6dbb6a34d..697fcf7224 100644 --- a/packages/docusaurus-plugin-content-docs/package.json +++ b/packages/docusaurus-plugin-content-docs/package.json @@ -38,7 +38,7 @@ "remark-admonitions": "^1.2.1", "tslib": "^2.4.0", "utility-types": "^3.10.0", - "webpack": "^5.72.0" + "webpack": "^5.72.1" }, "devDependencies": { "@docusaurus/module-type-aliases": "2.0.0-beta.20", diff --git a/packages/docusaurus-plugin-content-pages/package.json b/packages/docusaurus-plugin-content-pages/package.json index f5882af81a..4e8e2eb7ed 100644 --- a/packages/docusaurus-plugin-content-pages/package.json +++ b/packages/docusaurus-plugin-content-pages/package.json @@ -25,7 +25,7 @@ "fs-extra": "^10.1.0", "remark-admonitions": "^1.2.1", "tslib": "^2.4.0", - "webpack": "^5.72.0" + "webpack": "^5.72.1" }, "devDependencies": { "@docusaurus/types": "2.0.0-beta.20" diff --git a/packages/docusaurus-plugin-ideal-image/package.json b/packages/docusaurus-plugin-ideal-image/package.json index 7c35c575b0..6f6c73d117 100644 --- a/packages/docusaurus-plugin-ideal-image/package.json +++ b/packages/docusaurus-plugin-ideal-image/package.json @@ -30,7 +30,7 @@ "react-waypoint": "^10.1.0", "sharp": "^0.30.4", "tslib": "^2.4.0", - "webpack": "^5.72.0" + "webpack": "^5.72.1" }, "devDependencies": { "@docusaurus/module-type-aliases": "2.0.0-beta.20", diff --git a/packages/docusaurus-plugin-pwa/package.json b/packages/docusaurus-plugin-pwa/package.json index 6d5271bbc2..3f0a4f8201 100644 --- a/packages/docusaurus-plugin-pwa/package.json +++ b/packages/docusaurus-plugin-pwa/package.json @@ -29,10 +29,10 @@ "@docusaurus/utils-validation": "2.0.0-beta.20", "babel-loader": "^8.2.5", "clsx": "^1.1.1", - "core-js": "^3.22.4", + "core-js": "^3.22.5", "terser-webpack-plugin": "^5.3.1", "tslib": "^2.4.0", - "webpack": "^5.72.0", + "webpack": "^5.72.1", "webpack-merge": "^5.8.0", "workbox-build": "^6.5.3", "workbox-precaching": "^6.5.3", diff --git a/packages/docusaurus-types/package.json b/packages/docusaurus-types/package.json index 9d1849ff36..b50c2100a5 100644 --- a/packages/docusaurus-types/package.json +++ b/packages/docusaurus-types/package.json @@ -21,7 +21,7 @@ "joi": "^17.6.0", "react-helmet-async": "^1.3.0", "utility-types": "^3.10.0", - "webpack": "^5.72.0", + "webpack": "^5.72.1", "webpack-merge": "^5.8.0" }, "peerDependencies": { diff --git a/packages/docusaurus-utils/package.json b/packages/docusaurus-utils/package.json index bac83d169f..cdddacda8d 100644 --- a/packages/docusaurus-utils/package.json +++ b/packages/docusaurus-utils/package.json @@ -32,7 +32,7 @@ "shelljs": "^0.8.5", "tslib": "^2.4.0", "url-loader": "^4.1.1", - "webpack": "^5.72.0" + "webpack": "^5.72.1" }, "engines": { "node": ">=14" diff --git a/packages/docusaurus/package.json b/packages/docusaurus/package.json index 8902b3e71b..4019070675 100644 --- a/packages/docusaurus/package.json +++ b/packages/docusaurus/package.json @@ -60,7 +60,7 @@ "combine-promises": "^1.1.0", "commander": "^5.1.0", "copy-webpack-plugin": "^10.2.4", - "core-js": "^3.22.4", + "core-js": "^3.22.5", "css-loader": "^6.7.1", "css-minimizer-webpack-plugin": "^3.4.1", "cssnano": "^5.1.7", @@ -97,7 +97,7 @@ "update-notifier": "^5.1.0", "url-loader": "^4.1.1", "wait-on": "^6.0.1", - "webpack": "^5.72.0", + "webpack": "^5.72.1", "webpack-bundle-analyzer": "^4.5.0", "webpack-dev-server": "^4.9.0", "webpack-merge": "^5.8.0", diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 11cd28a07f..e7b1e4b58c 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -21,7 +21,7 @@ "build": "tsc" }, "dependencies": { - "@typescript-eslint/utils": "^5.22.0", + "@typescript-eslint/utils": "^5.23.0", "tslib": "^2.4.0" }, "devDependencies": { diff --git a/website/package.json b/website/package.json index fdd3b393cb..1cd5d07857 100644 --- a/website/package.json +++ b/website/package.json @@ -49,7 +49,7 @@ "@docusaurus/utils": "2.0.0-beta.20", "@docusaurus/utils-common": "2.0.0-beta.20", "@popperjs/core": "^2.11.5", - "@swc/core": "^1.2.178", + "@swc/core": "^1.2.181", "clsx": "^1.1.1", "color": "^4.2.3", "fs-extra": "^10.1.0", diff --git a/yarn.lock b/yarn.lock index b7f0f09e30..fd39a55799 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1871,9 +1871,9 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@leichtgewicht/ip-codec@^2.0.1": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.3.tgz#0300943770e04231041a51bd39f0439b5c7ab4f0" - integrity sha512-nkalE/f1RvRGChwBnEIoBfSEYOXnCRdleKuv6+lePbMDrMZXeDQnqak5XDOeBgrPPyPfAdcCu/B5z+v3VhplGg== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== "@lerna/add@4.0.0": version "4.0.0" @@ -3025,94 +3025,94 @@ "@svgr/plugin-jsx" "^6.2.1" "@svgr/plugin-svgo" "^6.2.0" -"@swc/core-android-arm-eabi@1.2.178": - version "1.2.178" - resolved "https://registry.yarnpkg.com/@swc/core-android-arm-eabi/-/core-android-arm-eabi-1.2.178.tgz#8a2e1c6a81236e437981f1b2a0f7f74fddc9d24f" - integrity sha512-eWW8aSNe/X9xinM5Nb07mLjIGLXWFfUr7InxNrxHggRZLb1aUm29fUlYWPt+TWsj23uj8qJCmzryjFLUy+gDxA== +"@swc/core-android-arm-eabi@1.2.181": + version "1.2.181" + resolved "https://registry.yarnpkg.com/@swc/core-android-arm-eabi/-/core-android-arm-eabi-1.2.181.tgz#8317b96dbcf43f30bc0a9c139f7dbe2ffea4ce2f" + integrity sha512-H3HNf8j6M13uIbSruef8iMsCElJJDZOhp5qxwm/+P1jAG4eQ4vPfajIlTVdFJes8Adrbr4WQaVvl+m4BQw51JQ== -"@swc/core-android-arm64@1.2.178": - version "1.2.178" - resolved "https://registry.yarnpkg.com/@swc/core-android-arm64/-/core-android-arm64-1.2.178.tgz#c967e507c942c42f23f735d95bb47291eb029cad" - integrity sha512-en/WKIbwmu8Q6LFoaiCPqS9Lqnc5Or2oWQpWG3awN7rbn2OqwYgki76fnqgI4dkxURztqDPZ5Fxh8oGkrmYxWg== +"@swc/core-android-arm64@1.2.181": + version "1.2.181" + resolved "https://registry.yarnpkg.com/@swc/core-android-arm64/-/core-android-arm64-1.2.181.tgz#23ee887e08993d26a2b31a5dce5232a5cf4e17b1" + integrity sha512-b1apYKeosBaXl28xE/By4QVHYrXaR2+nOdcP6rsDXg6nyLBArtoiS5YUFikFN/VQbSAQqNeJQ+rovT5zITrgSQ== -"@swc/core-darwin-arm64@1.2.178": - version "1.2.178" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.2.178.tgz#44a59af2338043a8218047a63915955744074138" - integrity sha512-P0jaGwMVVnTRaeo+6NXTnsqIFelYl+ZeZ1W0BSD+ymOcFlUhjpw1ADux1XiXTbGgloN4uzCmPxphrJO0b7rsag== +"@swc/core-darwin-arm64@1.2.181": + version "1.2.181" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.2.181.tgz#33d44c0aed28baebc797892d2243a845f5b49905" + integrity sha512-M3/PPeO6NTN7GYa1mOWPNMaAPxEQH8xd+X6FHMa7OBCi+Qxkarafu4DZRfzR88TcS3XikqFLgmmzSP7Z/tye2w== -"@swc/core-darwin-x64@1.2.178": - version "1.2.178" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.2.178.tgz#a94dc71a6f91c679dcc9908b2e8a27156cfe258c" - integrity sha512-ZSWe4Wcnwkrf0Eh/EeBsGRM38OCT6wl8ynWRXO6j5fb+S5cQx6KPpa6TrlQ+43jduzv44IizjnVanHXDB7eqww== +"@swc/core-darwin-x64@1.2.181": + version "1.2.181" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.2.181.tgz#6da604c4c4e85c1baad9c355f25a4e0cceff52cb" + integrity sha512-8Uc6gx7YN5+eSnk3h7aHqp1f3RFoBJPDPeH9cURm4mfE4BTgkVgkctUm0IE5sS5AotazVbrOwhEFrl7TONSfPA== -"@swc/core-freebsd-x64@1.2.178": - version "1.2.178" - resolved "https://registry.yarnpkg.com/@swc/core-freebsd-x64/-/core-freebsd-x64-1.2.178.tgz#97559d237aba5da3cb8d951e09872d397ae3a36a" - integrity sha512-pZCHOvSGJ0JecepsXN7sAesamsbmmkXQ2XHlOuPFRqyrmE7mrZ6NwgUKfXvGZ9kuE1xwqBLFPwco9IM/cNSl6g== +"@swc/core-freebsd-x64@1.2.181": + version "1.2.181" + resolved "https://registry.yarnpkg.com/@swc/core-freebsd-x64/-/core-freebsd-x64-1.2.181.tgz#41b26a7fd1214c9947e8a433231bcb3166916a33" + integrity sha512-SbnsbJHGFNY7VSTA5OhBh2PmLgQumIGerAxTCTYO1IgtbADCTL+gCjU0TK0viG/zpH4jnjaL965BI4JTo/bpRg== -"@swc/core-linux-arm-gnueabihf@1.2.178": - version "1.2.178" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.2.178.tgz#a56cf9bfc5d15b1171d9161aca345e3abc3d1a11" - integrity sha512-5IqU+ILaMRW/u+Ww8ZFP18i0/TFFZbQ/3VS2rlRloXDKAQhYc9ZAwi4/jLccX+zcB7l5JzFuf+skqjsf+n8eFQ== +"@swc/core-linux-arm-gnueabihf@1.2.181": + version "1.2.181" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.2.181.tgz#780f37f6b611ccd5c04d484b7b33e436e2ea8568" + integrity sha512-aWO6Lr9wea96Z7AEagzf4reKgDb3UWXZnClwJK7baScwF8KV+Mh99vVgkSe1nj2gKOZ31pBLp62RDJkc3gdlnA== -"@swc/core-linux-arm64-gnu@1.2.178": - version "1.2.178" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.2.178.tgz#e9b8ba073d5f59c97645d27c877b43400110cf86" - integrity sha512-1n3v6JzN7P/wNCewbKmxPNp06XYxUlXVpZKRgKM3JCq9jX1IzKcaK+5u0l0fk94PTTsiPCuPFi7RzLfMc/gtDA== +"@swc/core-linux-arm64-gnu@1.2.181": + version "1.2.181" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.2.181.tgz#34a4639fdcf3cf6c30087f719200c2fb1eac8792" + integrity sha512-+7fzDwsvcbhPafKdminMQrU3Ej1NHltXy7k+zgjj8BDPZbfi8hRzQcONeBV7sfl4xvw3d3roNHu2UMmKzLNs0w== -"@swc/core-linux-arm64-musl@1.2.178": - version "1.2.178" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.2.178.tgz#b1f8f16880e018df28d68f88b5b0e9086906413f" - integrity sha512-U6FHVkrp8AwkBNzvNG6vwYpPZBVz1L6leMb56S59eI3wib3Trz2pTlZnsGLPIFyjTqLOowhhFJ+TrpX65NiAaw== +"@swc/core-linux-arm64-musl@1.2.181": + version "1.2.181" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.2.181.tgz#c1388644df35ad30b71c0d09fd9a96d31405299f" + integrity sha512-U9k8pv2oCxYYfu9DdOO1ZZgqbmF97NgJzSaIu3PsTedF4RcGIiPcuGOFqrUECsGUW2i6uKejE8onbXPj9UmaZQ== -"@swc/core-linux-x64-gnu@1.2.178": - version "1.2.178" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.2.178.tgz#9a70d87e919b4d2c9a57d400ba28663f05814a3b" - integrity sha512-+0Lsrr7sO7CybsqQZ2o/CI9r2TGCGQ7cgemE1y6FULkY3lf2keCsch535Vbq3/emDD9ujoHiph87sIOIBHjEIw== +"@swc/core-linux-x64-gnu@1.2.181": + version "1.2.181" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.2.181.tgz#2384b58d35bb2e31521005869acbc6ea2e0700b4" + integrity sha512-9AQXrvZ9BFQJeqYMpKQZRf9h/DEwhfHIR39krehO+g594i+mkkp+UNTToez6Ifn+NBYl58xyEcQGwsYIqtdYVw== -"@swc/core-linux-x64-musl@1.2.178": - version "1.2.178" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.2.178.tgz#fbb195c9d3e980bc90555d716cc9c46cae08a761" - integrity sha512-tVYcPA+vSaeGCUOfIO27viYaHZhtW1MvD1gBqpD1AUrV9ufyCklihH5BlxOTuGww464lGCybKu2VbsoHBz2qIw== +"@swc/core-linux-x64-musl@1.2.181": + version "1.2.181" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.2.181.tgz#4938a87eae011daaf9f360a1452ece8a2e9c5816" + integrity sha512-Pq/aBMj3F4CR4tXq85t7IW3piu76a677nIoo6QtBkAjrQ5QuJqpaez/5aewipG+kIXpiu/DNFIN+cISa1QeC8A== -"@swc/core-win32-arm64-msvc@1.2.178": - version "1.2.178" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.2.178.tgz#ac88b1b0e543398aa549007e5ce32ab344e2fb60" - integrity sha512-KgpApFeWUSBpUELz6PT4AaML4lW3ziz2kVlrZlLrUk5XRJv/J+KKHJ+iYQUnYCTOOeGI9vSVmzjfdEvYyIhB/Q== +"@swc/core-win32-arm64-msvc@1.2.181": + version "1.2.181" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.2.181.tgz#553b16cfb5aa918f191227abe929619263142ea5" + integrity sha512-m24036tVFDE8ZJ3fBVBfsHw4tHd0BG6g3TvT2MLAiW2MezYeTdrGpmvPBz4Woz686I/06cWeSg7cZF1/ZcZMMA== -"@swc/core-win32-ia32-msvc@1.2.178": - version "1.2.178" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.2.178.tgz#4c73d32641b892623736ce614b62da8de03f23fc" - integrity sha512-j3E0VxfewsEZYw2tSh4C4TlIehfvYKibcpnSsZTIjXMW3a3SSSvYtEus63TjbEj2IjtAXrZnyNPeuej9ioY8Gg== +"@swc/core-win32-ia32-msvc@1.2.181": + version "1.2.181" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.2.181.tgz#e520b9caa136c283fa789805bfe46966faec6d81" + integrity sha512-OPROzGapmr29qqwvB/aP9SA80r2eIukj+q7gghdQVptJrQU4GrTyzW1TpnGtpzj8rLZz4hEG6KtyPUh54bJZ/g== -"@swc/core-win32-x64-msvc@1.2.178": - version "1.2.178" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.2.178.tgz#639a3138ed4a964fa1e4145c35c15a2c54dc1458" - integrity sha512-ocsdX9q2iFMJHj2wdhdNLwh26Ap0crMGbI6LVNYfngDFON7ywS5qOvjufHSgtIxARMVusUDjmehqRCmzd3Yr6w== +"@swc/core-win32-x64-msvc@1.2.181": + version "1.2.181" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.2.181.tgz#5cc5843e2aad673abb76231971faca140c711709" + integrity sha512-YrIaS63XsGiQ9AgxUVZ7Irt4pwQc3c2TPN7PyQP7ok9zBZxY5pBTwRTdLctlF4LNsSavlHE5+rvdPzcYAG0ekQ== -"@swc/core@^1.2.178": - version "1.2.178" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.2.178.tgz#7f6fac9763699a1e8c3b97af8a3c4d07122be741" - integrity sha512-c+Wu65ROsMiZdkL/VOpHIeiJv1w3jPnfZez41cD95yuXk+oiWDNvtWUqbU4l1x38eYKi9YlY6wPYpLBJdHA22w== +"@swc/core@^1.2.181": + version "1.2.181" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.2.181.tgz#87a856be4581be4da5515287a2120544f9d733ba" + integrity sha512-evQX+Br/gC+FYLbUIF1dOQa7hUzBpowrcbgPkIRCEvi4HrCn7pGBZ2ZHBXmwEtBdLfOlyQvN/8USClApQKK4Rw== optionalDependencies: - "@swc/core-android-arm-eabi" "1.2.178" - "@swc/core-android-arm64" "1.2.178" - "@swc/core-darwin-arm64" "1.2.178" - "@swc/core-darwin-x64" "1.2.178" - "@swc/core-freebsd-x64" "1.2.178" - "@swc/core-linux-arm-gnueabihf" "1.2.178" - "@swc/core-linux-arm64-gnu" "1.2.178" - "@swc/core-linux-arm64-musl" "1.2.178" - "@swc/core-linux-x64-gnu" "1.2.178" - "@swc/core-linux-x64-musl" "1.2.178" - "@swc/core-win32-arm64-msvc" "1.2.178" - "@swc/core-win32-ia32-msvc" "1.2.178" - "@swc/core-win32-x64-msvc" "1.2.178" + "@swc/core-android-arm-eabi" "1.2.181" + "@swc/core-android-arm64" "1.2.181" + "@swc/core-darwin-arm64" "1.2.181" + "@swc/core-darwin-x64" "1.2.181" + "@swc/core-freebsd-x64" "1.2.181" + "@swc/core-linux-arm-gnueabihf" "1.2.181" + "@swc/core-linux-arm64-gnu" "1.2.181" + "@swc/core-linux-arm64-musl" "1.2.181" + "@swc/core-linux-x64-gnu" "1.2.181" + "@swc/core-linux-x64-musl" "1.2.181" + "@swc/core-win32-arm64-msvc" "1.2.181" + "@swc/core-win32-ia32-msvc" "1.2.181" + "@swc/core-win32-x64-msvc" "1.2.181" -"@swc/jest@^0.2.20": - version "0.2.20" - resolved "https://registry.yarnpkg.com/@swc/jest/-/jest-0.2.20.tgz#2bddb4348fb730296b86cdcd96748be131b11395" - integrity sha512-5qSUBYY1wyIMn7p0Vl9qqV4hMI69oJwZCIPUpBsTFWN2wlwn6RDugzdgCn+bLXVYh+Cxi8bJcZ1uumDgsoL+FA== +"@swc/jest@^0.2.21": + version "0.2.21" + resolved "https://registry.yarnpkg.com/@swc/jest/-/jest-0.2.21.tgz#e8c4e234016a914f4cfbb7d75844860a250c1d1c" + integrity sha512-/+NcExiZbxXANNhNPnIdFuGq62CeumulLS1bngwqIXd8H7d96LFUfrYzdt8tlTwLMel8tFtQ5aRjzVkyOTyPDw== dependencies: "@jest/create-cache-key-function" "^27.4.2" @@ -3843,14 +3843,14 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.22.0": - version "5.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.22.0.tgz#7b52a0de2e664044f28b36419210aea4ab619e2a" - integrity sha512-YCiy5PUzpAeOPGQ7VSGDEY2NeYUV1B0swde2e0HzokRsHBYjSdF6DZ51OuRZxVPHx0032lXGLvOMls91D8FXlg== +"@typescript-eslint/eslint-plugin@^5.23.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.23.0.tgz#bc4cbcf91fbbcc2e47e534774781b82ae25cc3d8" + integrity sha512-hEcSmG4XodSLiAp1uxv/OQSGsDY6QN3TcRU32gANp+19wGE1QQZLRS8/GV58VRUoXhnkuJ3ZxNQ3T6Z6zM59DA== dependencies: - "@typescript-eslint/scope-manager" "5.22.0" - "@typescript-eslint/type-utils" "5.22.0" - "@typescript-eslint/utils" "5.22.0" + "@typescript-eslint/scope-manager" "5.23.0" + "@typescript-eslint/type-utils" "5.23.0" + "@typescript-eslint/utils" "5.23.0" debug "^4.3.2" functional-red-black-tree "^1.0.1" ignore "^5.1.8" @@ -3858,69 +3858,69 @@ semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.22.0": - version "5.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.22.0.tgz#7bedf8784ef0d5d60567c5ba4ce162460e70c178" - integrity sha512-piwC4krUpRDqPaPbFaycN70KCP87+PC5WZmrWs+DlVOxxmF+zI6b6hETv7Quy4s9wbkV16ikMeZgXsvzwI3icQ== +"@typescript-eslint/parser@^5.23.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.23.0.tgz#443778e1afc9a8ff180f91b5e260ac3bec5e2de1" + integrity sha512-V06cYUkqcGqpFjb8ttVgzNF53tgbB/KoQT/iB++DOIExKmzI9vBJKjZKt/6FuV9c+zrDsvJKbJ2DOCYwX91cbw== dependencies: - "@typescript-eslint/scope-manager" "5.22.0" - "@typescript-eslint/types" "5.22.0" - "@typescript-eslint/typescript-estree" "5.22.0" + "@typescript-eslint/scope-manager" "5.23.0" + "@typescript-eslint/types" "5.23.0" + "@typescript-eslint/typescript-estree" "5.23.0" debug "^4.3.2" -"@typescript-eslint/scope-manager@5.22.0": - version "5.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.22.0.tgz#590865f244ebe6e46dc3e9cab7976fc2afa8af24" - integrity sha512-yA9G5NJgV5esANJCO0oF15MkBO20mIskbZ8ijfmlKIvQKg0ynVKfHZ15/nhAJN5m8Jn3X5qkwriQCiUntC9AbA== +"@typescript-eslint/scope-manager@5.23.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.23.0.tgz#4305e61c2c8e3cfa3787d30f54e79430cc17ce1b" + integrity sha512-EhjaFELQHCRb5wTwlGsNMvzK9b8Oco4aYNleeDlNuL6qXWDF47ch4EhVNPh8Rdhf9tmqbN4sWDk/8g+Z/J8JVw== dependencies: - "@typescript-eslint/types" "5.22.0" - "@typescript-eslint/visitor-keys" "5.22.0" + "@typescript-eslint/types" "5.23.0" + "@typescript-eslint/visitor-keys" "5.23.0" -"@typescript-eslint/type-utils@5.22.0": - version "5.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.22.0.tgz#0c0e93b34210e334fbe1bcb7250c470f4a537c19" - integrity sha512-iqfLZIsZhK2OEJ4cQ01xOq3NaCuG5FQRKyHicA3xhZxMgaxQazLUHbH/B2k9y5i7l3+o+B5ND9Mf1AWETeMISA== +"@typescript-eslint/type-utils@5.23.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.23.0.tgz#f852252f2fc27620d5bb279d8fed2a13d2e3685e" + integrity sha512-iuI05JsJl/SUnOTXA9f4oI+/4qS/Zcgk+s2ir+lRmXI+80D8GaGwoUqs4p+X+4AxDolPpEpVUdlEH4ADxFy4gw== dependencies: - "@typescript-eslint/utils" "5.22.0" + "@typescript-eslint/utils" "5.23.0" debug "^4.3.2" tsutils "^3.21.0" -"@typescript-eslint/types@5.22.0": - version "5.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.22.0.tgz#50a4266e457a5d4c4b87ac31903b28b06b2c3ed0" - integrity sha512-T7owcXW4l0v7NTijmjGWwWf/1JqdlWiBzPqzAWhobxft0SiEvMJB56QXmeCQjrPuM8zEfGUKyPQr/L8+cFUBLw== +"@typescript-eslint/types@5.23.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.23.0.tgz#8733de0f58ae0ed318dbdd8f09868cdbf9f9ad09" + integrity sha512-NfBsV/h4dir/8mJwdZz7JFibaKC3E/QdeMEDJhiAE3/eMkoniZ7MjbEMCGXw6MZnZDMN3G9S0mH/6WUIj91dmw== -"@typescript-eslint/typescript-estree@5.22.0": - version "5.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.22.0.tgz#e2116fd644c3e2fda7f4395158cddd38c0c6df97" - integrity sha512-EyBEQxvNjg80yinGE2xdhpDYm41so/1kOItl0qrjIiJ1kX/L/L8WWGmJg8ni6eG3DwqmOzDqOhe6763bF92nOw== +"@typescript-eslint/typescript-estree@5.23.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.23.0.tgz#dca5f10a0a85226db0796e8ad86addc9aee52065" + integrity sha512-xE9e0lrHhI647SlGMl+m+3E3CKPF1wzvvOEWnuE3CCjjT7UiRnDGJxmAcVKJIlFgK6DY9RB98eLr1OPigPEOGg== dependencies: - "@typescript-eslint/types" "5.22.0" - "@typescript-eslint/visitor-keys" "5.22.0" + "@typescript-eslint/types" "5.23.0" + "@typescript-eslint/visitor-keys" "5.23.0" debug "^4.3.2" globby "^11.0.4" is-glob "^4.0.3" semver "^7.3.5" tsutils "^3.21.0" -"@typescript-eslint/utils@5.22.0", "@typescript-eslint/utils@^5.10.0", "@typescript-eslint/utils@^5.22.0": - version "5.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.22.0.tgz#1f2c4897e2cf7e44443c848a13c60407861babd8" - integrity sha512-HodsGb037iobrWSUMS7QH6Hl1kppikjA1ELiJlNSTYf/UdMEwzgj0WIp+lBNb6WZ3zTwb0tEz51j0Wee3iJ3wQ== +"@typescript-eslint/utils@5.23.0", "@typescript-eslint/utils@^5.10.0", "@typescript-eslint/utils@^5.23.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.23.0.tgz#4691c3d1b414da2c53d8943310df36ab1c50648a" + integrity sha512-dbgaKN21drqpkbbedGMNPCtRPZo1IOUr5EI9Jrrh99r5UW5Q0dz46RKXeSBoPV+56R6dFKpbrdhgUNSJsDDRZA== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.22.0" - "@typescript-eslint/types" "5.22.0" - "@typescript-eslint/typescript-estree" "5.22.0" + "@typescript-eslint/scope-manager" "5.23.0" + "@typescript-eslint/types" "5.23.0" + "@typescript-eslint/typescript-estree" "5.23.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/visitor-keys@5.22.0": - version "5.22.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.22.0.tgz#f49c0ce406944ffa331a1cfabeed451ea4d0909c" - integrity sha512-DbgTqn2Dv5RFWluG88tn0pP6Ex0ROF+dpDO1TNNZdRtLjUr6bdznjA6f/qNqJLjd2PgguAES2Zgxh/JzwzETDg== +"@typescript-eslint/visitor-keys@5.23.0": + version "5.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.23.0.tgz#057c60a7ca64667a39f991473059377a8067c87b" + integrity sha512-Vd4mFNchU62sJB8pX19ZSPog05B0Y0CE2UxAZPT5k4iqhRYjPnqyY3woMxCd0++t9OTqkgjST+1ydLBi7e2Fvg== dependencies: - "@typescript-eslint/types" "5.22.0" + "@typescript-eslint/types" "5.23.0" eslint-visitor-keys "^3.0.0" "@webassemblyjs/ast@1.11.1": @@ -5097,9 +5097,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001332, caniuse-lite@^1.0.30001335: - version "1.0.30001338" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001338.tgz#b5dd7a7941a51a16480bdf6ff82bded1628eec0d" - integrity sha512-1gLHWyfVoRDsHieO+CaeYe7jSo/MT7D7lhaXUiwwbuR5BwQxORs0f1tAwUSQr3YbxRXJvxHM/PA5FfPQRnsPeQ== + version "1.0.30001339" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001339.tgz#f9aece4ea8156071613b27791547ba0b33f176cf" + integrity sha512-Es8PiVqCe+uXdms0Gu5xP5PF2bxLR7OBp3wUzUnuO7OHzhOfCyg3hdiGWVPVxhiuniOzng+hTc1u3fEQ0TlkSQ== caseless@~0.12.0: version "0.12.0" @@ -5834,27 +5834,27 @@ copy-webpack-plugin@^10.2.4: serialize-javascript "^6.0.0" core-js-compat@^3.21.0, core-js-compat@^3.22.1: - version "3.22.4" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.22.4.tgz#d700f451e50f1d7672dcad0ac85d910e6691e579" - integrity sha512-dIWcsszDezkFZrfm1cnB4f/J85gyhiCpxbgBdohWCDtSVuAaChTSpPV7ldOQf/Xds2U5xCIJZOK82G4ZPAIswA== + version "3.22.5" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.22.5.tgz#7fffa1d20cb18405bd22756ca1353c6f1a0e8614" + integrity sha512-rEF75n3QtInrYICvJjrAgV03HwKiYvtKHdPtaba1KucG+cNZ4NJnH9isqt979e67KZlhpbCOTwnsvnIr+CVeOg== dependencies: browserslist "^4.20.3" semver "7.0.0" core-js-pure@^3.20.2: - version "3.22.4" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.22.4.tgz#a992210f4cad8b32786b8654563776c56b0e0d0a" - integrity sha512-4iF+QZkpzIz0prAFuepmxwJ2h5t4agvE8WPYqs2mjLJMNNwJOnpch76w2Q7bUfCPEv/V7wpvOfog0w273M+ZSw== + version "3.22.5" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.22.5.tgz#bdee0ed2f9b78f2862cda4338a07b13a49b6c9a9" + integrity sha512-8xo9R00iYD7TcV7OrC98GwxiUEAabVWO3dix+uyWjnYrx9fyASLlIX+f/3p5dW5qByaP2bcZ8X/T47s55et/tA== core-js@^2.4.1: version "2.6.12" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== -core-js@^3.22.4: - version "3.22.4" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.22.4.tgz#f4b3f108d45736935aa028444a69397e40d8c531" - integrity sha512-1uLykR+iOfYja+6Jn/57743gc9n73EWiOnSJJ4ba3B4fOEYDBv25MagmEZBxTp5cWq4b/KPx/l77zgsp28ju4w== +core-js@^3.22.5: + version "3.22.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.22.5.tgz#a5f5a58e663d5c0ebb4e680cd7be37536fb2a9cf" + integrity sha512-VP/xYuvJ0MJWRAobcmQ8F2H6Bsn+s7zqAAjFaHGBMc5AQm7zaelhD1LGduFn2EehEcQcU+br6t+fwbpQ5d1ZWA== core-util-is@1.0.2: version "1.0.2" @@ -6694,7 +6694,7 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1: dependencies: once "^1.4.0" -enhanced-resolve@^5.9.2: +enhanced-resolve@^5.9.3: version "5.9.3" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88" integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow== @@ -7950,9 +7950,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.6.0, globals@^13.9.0: - version "13.13.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.13.0.tgz#ac32261060d8070e2719dd6998406e27d2b5727b" - integrity sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A== + version "13.14.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.14.0.tgz#daf3ff9b4336527cf56e98330b6f64bea9aff9df" + integrity sha512-ERO68sOYwm5UuLvSJTY7w7NP2c8S4UcXs3X1GBX8cwOr+ShOcDBbCY5mH4zxz0jsYCdJ8ve8Mv9n2YGJMB1aeg== dependencies: type-fest "^0.20.2" @@ -8532,10 +8532,10 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -husky@^7.0.4: - version "7.0.4" - resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" - integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== +husky@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.1.tgz#511cb3e57de3e3190514ae49ed50f6bc3f50b3e9" + integrity sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw== hyphenate-style-name@^1.0.2: version "1.0.4" @@ -8735,9 +8735,9 @@ invariant@^2.2.4: loose-envify "^1.0.0" ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha512-rBtCAQAJm8A110nbwn6YdveUnuZH3WrC36IwkRXxDnq53JvXA2NVQvB7IHyKomxK1MJ4VDNw3UtFDdXQ+AvLYA== + version "1.1.6" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.6.tgz#5a651a37644586e18b6ba3b48ca122bf56495f67" + integrity sha512-/dAvCivFs/VexXAtiAoMIqyhkhStNC9CPD0h1noonimOgB1xrCkexF2c5CjlqQ72GgMPjN6tiV+oreoPv3Ft1g== ipaddr.js@1.9.1: version "1.9.1" @@ -9775,12 +9775,12 @@ json-buffer@3.0.0: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: +json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== -json-parse-even-better-errors@^2.3.0: +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== @@ -13325,9 +13325,9 @@ rollup-plugin-terser@^7.0.0: terser "^5.0.0" rollup@^2.43.1: - version "2.72.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.72.0.tgz#f94280b003bcf9f2f1f2594059a9db5abced371e" - integrity sha512-KqtR2YcO35/KKijg4nx4STO3569aqCUeGRkKWnJ6r+AvBBrVY9L4pmf4NHVrQr4mTOq6msbohflxr2kpihhaOA== + version "2.72.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.72.1.tgz#861c94790537b10008f0ca0fbc60e631aabdd045" + integrity sha512-NTc5UGy/NWFGpSqF1lFY8z9Adri6uhyMLI6LvPAXdBKoPRFhIIiBUpt+Qg2awixqO3xvzSijjhnb4+QEZwJmxA== optionalDependencies: fsevents "~2.3.2" @@ -15704,10 +15704,10 @@ webpack-sources@^3.2.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5, webpack@^5.72.0: - version "5.72.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.72.0.tgz#f8bc40d9c6bb489a4b7a8a685101d6022b8b6e28" - integrity sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w== +webpack@^5, webpack@^5.72.1: + version "5.72.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.72.1.tgz#3500fc834b4e9ba573b9f430b2c0a61e1bb57d13" + integrity sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^0.0.51" @@ -15718,13 +15718,13 @@ webpack@^5, webpack@^5.72.0: acorn-import-assertions "^1.7.6" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.9.2" + enhanced-resolve "^5.9.3" es-module-lexer "^0.9.0" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" graceful-fs "^4.2.9" - json-parse-better-errors "^1.0.2" + json-parse-even-better-errors "^2.3.1" loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" From d3788bd126393cc8f70d78137ce3ebd4be95ec1f Mon Sep 17 00:00:00 2001 From: Joshua Chen Date: Wed, 11 May 2022 11:02:41 +0800 Subject: [PATCH 05/18] fix(mdx-loader): use React.Fragment as fragment factory (#7392) --- packages/docusaurus-mdx-loader/src/loader.ts | 2 +- website/_dogfooding/_pages tests/markdownPageTests.md | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/docusaurus-mdx-loader/src/loader.ts b/packages/docusaurus-mdx-loader/src/loader.ts index af18cd3982..68c3f55f90 100644 --- a/packages/docusaurus-mdx-loader/src/loader.ts +++ b/packages/docusaurus-mdx-loader/src/loader.ts @@ -31,7 +31,7 @@ const { const pragma = ` /* @jsxRuntime classic */ /* @jsx mdx */ -/* @jsxFrag mdx.Fragment */ +/* @jsxFrag React.Fragment */ `; const DEFAULT_OPTIONS: MDXOptions = { diff --git a/website/_dogfooding/_pages tests/markdownPageTests.md b/website/_dogfooding/_pages tests/markdownPageTests.md index bbd5c90e67..ca7e9fcff7 100644 --- a/website/_dogfooding/_pages tests/markdownPageTests.md +++ b/website/_dogfooding/_pages tests/markdownPageTests.md @@ -183,3 +183,9 @@ Code tag + double pipe: || Details without a summary + +This is a fragment: + +<>Hello + +It should work :) From 8973727de82b827347ffbd004ff1cd654c6aef47 Mon Sep 17 00:00:00 2001 From: Joshua Chen Date: Wed, 11 May 2022 13:02:59 +0800 Subject: [PATCH 06/18] chore: use "pr:" prefix for changelog labels; elaborate on labeling process (#7394) --- .github/dependabot.yml | 2 +- admin/publish.md | 17 ++++++++++++++--- lerna.json | 14 +++++++------- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index ff8708bf01..0635bad2a5 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -6,4 +6,4 @@ updates: interval: weekly open-pull-requests-limit: 99 labels: - - 'tag: dependencies' + - 'pr: dependencies' diff --git a/admin/publish.md b/admin/publish.md index a46ed99e6f..def8c7fc6e 100644 --- a/admin/publish.md +++ b/admin/publish.md @@ -70,11 +70,22 @@ This local test step is optional because it will be run by the CI on your releas ### 3. Update the v2 changelog -The changelog uses GitHub labels to classify each pull request. Use the GitHub interface to assign each newly merged pull request to a GitHub label starting with `tag:`, otherwise the PR won't appear in the changelog. +The changelog uses GitHub labels to classify each pull request. Use the GitHub interface to assign each newly merged pull request to a GitHub label starting with `pr:`, otherwise the PR won't appear in the changelog. -[Check tags of all recently merged Pull-Requests](https://github.com/facebook/docusaurus/pulls?q=is%3Apr+sort%3Aupdated-desc+is%3Amerged+) +Not all labels will appear in the changelog—some are designed not to. However, you should **always** label each PR, so that before release, we can do a quick scan and confirm no PR is accidentally left out. Here's a search query (pity that GH doesn't have wildcard queries yet): -The `tag:` label prefix is for PRs only. Other labels are not used by the changelog tool, and it's not necessary to assign such labels to issues, only PRs. +``` +is:pr is:merged sort:updated-desc -label:"pr: breaking change","pr: new feature","pr: bug fix","pr: performance","pr: polish","pr: documentation","pr: maintenance","pr: internal","pr: dependencies","pr: showcase" +``` + +[Check tags of all recently merged Pull-Requests](https://github.com/facebook/docusaurus/pulls?q=is%3Apr+is%3Amerged+sort%3Aupdated-desc+-label%3A%22pr%3A+breaking+change%22%2C%22pr%3A+new+feature%22%2C%22pr%3A+bug+fix%22%2C%22pr%3A+performance%22%2C%22pr%3A+polish%22%2C%22pr%3A+documentation%22%2C%22pr%3A+maintenance%22%2C%22pr%3A+internal%22%2C%22pr%3A+dependencies%22%2C%22pr%3A+showcase%22) + +Some general principles about the labeling process: + +- "Will an average user be interested in this entry?" Items like "improve test coverage", "upgrade dependencies" can probably be left out (we have `pr: internal` and `pr: dependencies` for this). However, "pin GitHub actions to an SHA", "add visual testing infrastructure", etc., albeit internal, could be interesting to the user, and can be included in the "maintenance" section. +- "Will this change have tangible impact on the user?" A common case is when a PR implements a feature X, then there are immediately follow-up PRs that fix bugs or polish feature X. These follow-up PRs don't necessarily have to be in the changelog, and even if they alter the API, they are not breaking changes, because to an average user bumping their version, they will only see the new feature X as a whole. Make the entries atomic. + +The `pr:` label prefix is for PRs only. Other labels are not used by the changelog tool, and it's not necessary to assign such labels to issues, only PRs. Generate a GitHub auth token by going to https://github.com/settings/tokens (the only permission needed is `public_repo`). Save the token somewhere for future reference. diff --git a/lerna.json b/lerna.json index 16fca78e9d..264ec32ae6 100644 --- a/lerna.json +++ b/lerna.json @@ -5,13 +5,13 @@ "changelog": { "repo": "facebook/docusaurus", "labels": { - "tag: new feature": ":rocket: New Feature", - "tag: breaking change": ":boom: Breaking Change", - "tag: bug fix": ":bug: Bug Fix", - "tag: polish": ":nail_care: Polish", - "tag: documentation": ":memo: Documentation", - "tag: maintenance": ":wrench: Maintenance", - "tag: performance": ":running_woman: Performance" + "pr: breaking change": ":boom: Breaking Change", + "pr: new feature": ":rocket: New Feature", + "pr: bug fix": ":bug: Bug Fix", + "pr: performance": ":running_woman: Performance", + "pr: polish": ":nail_care: Polish", + "pr: documentation": ":memo: Documentation", + "pr: maintenance": ":wrench: Maintenance" }, "cacheDir": ".changelog" } From 52e466e5de1ea096e21498d8e2d9117cde0bc4d4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 May 2022 13:14:28 +0800 Subject: [PATCH 07/18] chore(deps): bump github/codeql-action from 2.1.9 to 2.1.10 (#7395) Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2.1.9 to 2.1.10. - [Release notes](https://github.com/github/codeql-action/releases) - [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/github/codeql-action/compare/7502d6e991ca767d2db617bfd823a1ed925a0d59...75b4f1c4669133dc294b06c2794e969efa2e5316) --- updated-dependencies: - dependency-name: github/codeql-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/codeql-analysis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 305588ca1a..4fb9c9ab40 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -34,9 +34,9 @@ jobs: uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v3 - name: Initialize CodeQL - uses: github/codeql-action/init@7502d6e991ca767d2db617bfd823a1ed925a0d59 # v2 + uses: github/codeql-action/init@75b4f1c4669133dc294b06c2794e969efa2e5316 # v2 with: languages: ${{ matrix.language }} - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@7502d6e991ca767d2db617bfd823a1ed925a0d59 # v2 + uses: github/codeql-action/analyze@75b4f1c4669133dc294b06c2794e969efa2e5316 # v2 From a0b060759d34501d9f0a129a19a50dc20c3fa0f1 Mon Sep 17 00:00:00 2001 From: Massoud Maboudi Date: Wed, 11 May 2022 14:35:19 +0800 Subject: [PATCH 08/18] docs: fix translation config example (#7396) --- website/docs/api/docusaurus.config.js.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/docs/api/docusaurus.config.js.md b/website/docs/api/docusaurus.config.js.md index 488fd728c3..9910ddb522 100644 --- a/website/docs/api/docusaurus.config.js.md +++ b/website/docs/api/docusaurus.config.js.md @@ -130,7 +130,7 @@ Example: module.exports = { i18n: { defaultLocale: 'en', - locales: ['en', 'fr'], + locales: ['en', 'fa'], localeConfigs: { en: { label: 'English', @@ -153,7 +153,7 @@ module.exports = { - `locales`: List of locales deployed on your site. Must contain `defaultLocale`. - `localeConfigs`: Individual options for each locale. - `label`: The label displayed for this locale in the locales dropdown. - - `direction`: `ltr` (default) or `rtl` (for [right-to-left languages](https://developer.mozilla.org/en-US/docs/Glossary/rtl) like Arabic, Hebrew, etc.). Used to select the locale's CSS and html meta attribute. + - `direction`: `ltr` (default) or `rtl` (for [right-to-left languages](https://developer.mozilla.org/en-US/docs/Glossary/rtl) like Farsi, Arabic, Hebrew, etc.). Used to select the locale's CSS and html meta attribute. - `htmlLang`: BCP 47 language tag to use in `` and in `` - `calendar`: the [calendar](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/calendar) used to calculate the date era. Note that it doesn't control the actual string displayed: `MM/DD/YYYY` and `DD/MM/YYYY` are both `gregory`. To choose the format (`DD/MM/YYYY` or `MM/DD/YYYY`), set your locale name to `en-GB` or `en-US` (`en` means `en-US`). From cd0aff443bc7a397b2a535c0e72e190a62a43fc8 Mon Sep 17 00:00:00 2001 From: Benjamin Diolez Date: Wed, 11 May 2022 14:29:56 +0200 Subject: [PATCH 09/18] docs: add Piano Analytics to showcase (#7381) * docs: add Piano Analytics to showcase * optimize image; add to favorite Co-authored-by: Joshua Chen --- website/src/data/showcase/piano-analytics.png | Bin 0 -> 32228 bytes website/src/data/users.tsx | 8 ++++++++ 2 files changed, 8 insertions(+) create mode 100644 website/src/data/showcase/piano-analytics.png diff --git a/website/src/data/showcase/piano-analytics.png b/website/src/data/showcase/piano-analytics.png new file mode 100644 index 0000000000000000000000000000000000000000..ff4ca5619bc45ee8db3343a395dd8a28f666118e GIT binary patch literal 32228 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 Date: Thu, 12 May 2022 04:30:59 +0200 Subject: [PATCH 10/18] fix(website): use react-lite-youtube-embed for lazy YouTube video (#7390) * fix(website): use react-lite-youtube-embed for lazy YouTube video * fix(website): use react-lite-youtube-embed for lazy YouTube video * fix(website): use react-lite-youtube-embed for lazy YouTube video * Update multiple-sidebars.md * Update installation.md * refactor intro * rename file back Co-authored-by: Joshua Chen --- project-words.txt | 4 ++++ website/docs/introduction.md | 16 ++++++++++------ website/package.json | 1 + website/src/css/custom.css | 26 ++++++++++---------------- website/src/pages/index.tsx | 14 +++++++------- yarn.lock | 5 +++++ 6 files changed, 37 insertions(+), 29 deletions(-) diff --git a/project-words.txt b/project-words.txt index 341e85f935..2e029e7f7c 100644 --- a/project-words.txt +++ b/project-words.txt @@ -16,6 +16,7 @@ atrule autoconverted autogen autogenerating +autohide backport backticks bartosz @@ -152,6 +153,7 @@ marcey marocchino massoud mathjax +maxresdefault mdast mdxa mdxast @@ -208,6 +210,7 @@ philpl photoshop picocolors picomatch +playbtn pluggable plushie pnpm @@ -267,6 +270,7 @@ sensical serializers setaf setext +showinfo sida simen slorber diff --git a/website/docs/introduction.md b/website/docs/introduction.md index de877f6238..cec5f22c2e 100644 --- a/website/docs/introduction.md +++ b/website/docs/introduction.md @@ -50,16 +50,20 @@ Or read the **[5-minute tutorial](https://tutorial.docusaurus.io)** online. In this presentation at [Algolia Community Event](https://www.algolia.com/), [Meta Open Source team](https://opensource.facebook.com/) shared a brief walk-through of Docusaurus. They covered how to get started with the project, enable plugins, and set up functionalities like documentation and blogging. +```mdx-code-block +import LiteYouTubeEmbed from 'react-lite-youtube-embed'; +
-