From d98f00a62282f29c4dc196b9056c98e3cd49839b Mon Sep 17 00:00:00 2001 From: Sergio Date: Wed, 20 Jan 2021 20:59:25 +0100 Subject: [PATCH 1/3] feat: docusaurus upgrade cli command --- packages/docusaurus/bin/docusaurus.js | 13 +++++ packages/docusaurus/src/commands/upgrade.ts | 60 +++++++++++++++++++++ packages/docusaurus/src/index.ts | 1 + website/package.json | 3 +- 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 packages/docusaurus/src/commands/upgrade.ts diff --git a/packages/docusaurus/bin/docusaurus.js b/packages/docusaurus/bin/docusaurus.js index 7b8d6809e995..2a27b3c72922 100755 --- a/packages/docusaurus/bin/docusaurus.js +++ b/packages/docusaurus/bin/docusaurus.js @@ -19,6 +19,7 @@ const { externalCommand, serve, clear, + upgrade, writeTranslations, } = require('../lib'); const requiredVersion = require('../package.json').engines.node; @@ -206,6 +207,17 @@ cli wrapCommand(clear)(path.resolve(siteDir)); }); +cli + .command('upgrade') + .description('Upgrades @docusaurus packages') + .option( + '-t, --tag ', + 'Tag of npm to look for upgrading. This option accepts any of: ', + ) + .action(({tag = undefined}) => { + wrapCommand(upgrade)({tag}); + }); + cli .command('write-translations [siteDir]') .description('Extract required translations of your site') @@ -245,6 +257,7 @@ function isInternalCommand(command) { 'start', 'build', 'swizzle', + 'upgrade', 'deploy', 'serve', 'clear', diff --git a/packages/docusaurus/src/commands/upgrade.ts b/packages/docusaurus/src/commands/upgrade.ts new file mode 100644 index 000000000000..c99d1a1969a4 --- /dev/null +++ b/packages/docusaurus/src/commands/upgrade.ts @@ -0,0 +1,60 @@ +/** + * 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. + */ +import chalk = require('chalk'); +import fs from 'fs-extra'; +import path from 'path'; +import os from 'os'; +import childProcess from 'child_process'; +import clear from './clear'; + +function hasYarn() { + return fs.existsSync(path.resolve(path.dirname(process.cwd()), 'yarn.lock')); +} + +type CommonNpmTags = 'alpha' | 'beta' | 'latest' | 'next'; +export default function upgrade(opts: {tag: CommonNpmTags}): void { + const [npmClient, npmCommand] = hasYarn() + ? ['yarn', 'upgrade'] + : ['npm', 'install']; + + const {dependencies = {}, devDependencies = {}} = JSON.parse( + fs.readFileSync(path.join(process.cwd(), './package.json'), 'utf8'), + ); + + let packageNames = Array.from( + new Set( + [ + ...Object.keys(dependencies), + ...Object.keys(devDependencies), + ].filter((pkg) => pkg.startsWith('@docusaurus')), + ), + ).sort(); + + if (!packageNames.length) { + console.log(chalk.red(`Found 0 packages with scope @docusaurus`)); + return; + } + + if (opts.tag) { + packageNames = packageNames.map((_) => `${_}@${opts.tag}`); + } + + console.log(chalk.green(`Found ${packageNames.length} to update:`)); + console.log(packageNames); + console.log( + chalk.cyan( + `Executing "${npmClient} ${npmCommand} ${packageNames.join(' ')}"`, + ), + ); + + childProcess.spawnSync(npmClient, [npmCommand, ...packageNames], { + stdio: 'inherit', + shell: os.platform() === 'win32', + }); + + clear(path.resolve('.')); +} diff --git a/packages/docusaurus/src/index.ts b/packages/docusaurus/src/index.ts index f2c15ce9789c..d0e1f37817b3 100644 --- a/packages/docusaurus/src/index.ts +++ b/packages/docusaurus/src/index.ts @@ -13,3 +13,4 @@ export {default as externalCommand} from './commands/external'; export {default as serve} from './commands/serve'; export {default as clear} from './commands/clear'; export {default as writeTranslations} from './commands/writeTranslations'; +export {default as upgrade} from './commands/upgrade'; diff --git a/website/package.json b/website/package.json index 77564056fefb..2fd9e346afa8 100644 --- a/website/package.json +++ b/website/package.json @@ -10,6 +10,7 @@ "deploy": "docusaurus deploy", "clear": "docusaurus clear", "serve": "docusaurus serve", + "upgrade": "docusaurus upgrade", "start:baseUrl": "cross-env BASE_URL='/build/' yarn start", "build:baseUrl": "cross-env BASE_URL='/build/' yarn build", "start:bootstrap": "cross-env DOCUSAURUS_PRESET=bootstrap yarn start", @@ -60,4 +61,4 @@ "cross-env": "^7.0.2", "raw-loader": "^4.0.1" } -} +} \ No newline at end of file From 2455bc04d3022ab14a5995f56858a769c4659ca5 Mon Sep 17 00:00:00 2001 From: Josh-Cena Date: Mon, 15 Nov 2021 22:03:01 +0800 Subject: [PATCH 2/3] Prettier --- packages/docusaurus/src/commands/upgrade.ts | 7 +++---- packages/docusaurus/src/index.ts | 2 +- website/package.json | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/docusaurus/src/commands/upgrade.ts b/packages/docusaurus/src/commands/upgrade.ts index c99d1a1969a4..4262888fbb13 100644 --- a/packages/docusaurus/src/commands/upgrade.ts +++ b/packages/docusaurus/src/commands/upgrade.ts @@ -27,10 +27,9 @@ export default function upgrade(opts: {tag: CommonNpmTags}): void { let packageNames = Array.from( new Set( - [ - ...Object.keys(dependencies), - ...Object.keys(devDependencies), - ].filter((pkg) => pkg.startsWith('@docusaurus')), + [...Object.keys(dependencies), ...Object.keys(devDependencies)].filter( + (pkg) => pkg.startsWith('@docusaurus'), + ), ), ).sort(); diff --git a/packages/docusaurus/src/index.ts b/packages/docusaurus/src/index.ts index 9aee08b54929..d549fd5e31d9 100644 --- a/packages/docusaurus/src/index.ts +++ b/packages/docusaurus/src/index.ts @@ -12,6 +12,6 @@ export {default as deploy} from './commands/deploy'; export {default as externalCommand} from './commands/external'; export {default as serve} from './commands/serve'; export {default as clear} from './commands/clear'; +export {default as upgrade} from './commands/upgrade'; export {default as writeTranslations} from './commands/writeTranslations'; export {default as writeHeadingIds} from './commands/writeHeadingIds'; -export {default as upgrade} from './commands/upgrade'; diff --git a/website/package.json b/website/package.json index 32dd03a0c60a..f82e6341b18f 100644 --- a/website/package.json +++ b/website/package.json @@ -70,4 +70,4 @@ "cross-env": "^7.0.3", "raw-loader": "^4.0.2" } -} \ No newline at end of file +} From 234e289f1080f5885aacdd94109ef476ebdd7579 Mon Sep 17 00:00:00 2001 From: Joshua Chen Date: Fri, 8 Apr 2022 15:10:45 +0800 Subject: [PATCH 3/3] fix --- packages/docusaurus/bin/docusaurus.mjs | 8 +++--- packages/docusaurus/src/commands/upgrade.ts | 27 ++++++++++++--------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/packages/docusaurus/bin/docusaurus.mjs b/packages/docusaurus/bin/docusaurus.mjs index f37a09e7df63..979e237a08c5 100755 --- a/packages/docusaurus/bin/docusaurus.mjs +++ b/packages/docusaurus/bin/docusaurus.mjs @@ -196,14 +196,14 @@ cli }); cli - .command('upgrade') - .description('Upgrades @docusaurus packages') + .command('upgrade [siteDir]') + .description('Upgrade @docusaurus packages.') .option( '-t, --tag ', 'Tag of npm to look for upgrading. This option accepts any of: ', ) - .action(({tag = undefined}) => { - wrapCommand(upgrade)({tag}); + .action(async (siteDir, {tag = undefined}) => { + upgrade(await resolveDir(siteDir), {tag}); }); cli diff --git a/packages/docusaurus/src/commands/upgrade.ts b/packages/docusaurus/src/commands/upgrade.ts index f968ebad3249..0909e658ba8b 100644 --- a/packages/docusaurus/src/commands/upgrade.ts +++ b/packages/docusaurus/src/commands/upgrade.ts @@ -18,37 +18,42 @@ async function hasYarn() { type CommonNpmTags = 'alpha' | 'beta' | 'latest' | 'next'; -export async function upgrade(opts: {tag: CommonNpmTags}): Promise { - const [npmClient, npmCommand] = await hasYarn() +export async function upgrade( + siteDir: string, + {tag}: {tag: CommonNpmTags}, +): Promise { + const [npmClient, npmCommand] = (await hasYarn()) ? ['yarn', 'upgrade'] : ['npm', 'install']; - const {dependencies = {}, devDependencies = {}} = await fs.readJSON(path.join(process.cwd(), './package.json'), 'utf8'); + const {dependencies = {}, devDependencies = {}} = await fs.readJSON( + path.join(siteDir, 'package.json'), + ); - let packageNames = Array.from( + const packageNames = Array.from( new Set( [...Object.keys(dependencies), ...Object.keys(devDependencies)].filter( (pkg) => pkg.startsWith('@docusaurus'), ), ), - ).sort(); + ) + .sort() + .map((name) => (tag ? `${name}@${tag}` : name)); if (!packageNames.length) { logger.error(`Found 0 packages with scope @docusaurus`); return; } - if (opts.tag) { - packageNames = packageNames.map((_) => `${_}@${opts.tag}`); - } - logger.info`Found number=${packageNames.length} to update: name=${packageNames}`; - logger.info`Executing code=${`${npmClient} ${npmCommand} ${packageNames.join(' ')}`}`; + logger.info`Executing code=${`${npmClient} ${npmCommand} ${packageNames.join( + ' ', + )}`}`; childProcess.spawnSync(npmClient, [npmCommand, ...packageNames], { stdio: 'inherit', shell: os.platform() === 'win32', }); - await clear(path.resolve('.')); + await clear(siteDir); }