From 1f0cea6e7fabe7e5a4f62af53bc18df99b393f84 Mon Sep 17 00:00:00 2001 From: "Mgs. M. Rizqi Fadhlurrahman" Date: Wed, 27 Oct 2021 00:36:22 +0700 Subject: [PATCH] feat(nuxi): nuxi upgrade command (#1468) Co-authored-by: Pooya Parsa --- docs/content/1.getting-started/4.commands.md | 8 +++ packages/nuxi/README.md | 2 +- packages/nuxi/src/commands/index.ts | 3 +- packages/nuxi/src/commands/upgrade.ts | 68 ++++++++++++++++++++ 4 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 packages/nuxi/src/commands/upgrade.ts diff --git a/docs/content/1.getting-started/4.commands.md b/docs/content/1.getting-started/4.commands.md index 94118ffc19..7a421a38c6 100644 --- a/docs/content/1.getting-started/4.commands.md +++ b/docs/content/1.getting-started/4.commands.md @@ -42,3 +42,11 @@ npm run build :: Nuxt will create a [`.output`](/docs/directory-structure/output) directory with all your application, server and dependencies ready to be deployed. Checkout the [deployment](/docs/deployment) section to learn where and how you can deploy a Nuxt application using Nitro. + +## Upgrade Nuxt3 version + +To upgrade Nuxt3 version: + +```bash +npx nuxi upgrade +``` diff --git a/packages/nuxi/README.md b/packages/nuxi/README.md index 5a5d358423..d1ca7159f0 100644 --- a/packages/nuxi/README.md +++ b/packages/nuxi/README.md @@ -2,4 +2,4 @@ > Nuxt Command Line Interface -Learn more about this package: https://v3.nuxtjs.org +Learn more about this package: https://v3.nuxtjs.org/getting-started/commands diff --git a/packages/nuxi/src/commands/index.ts b/packages/nuxi/src/commands/index.ts index 1051d57dd1..ce99abb816 100644 --- a/packages/nuxi/src/commands/index.ts +++ b/packages/nuxi/src/commands/index.ts @@ -11,7 +11,8 @@ export const commands = { usage: () => import('./usage').then(_rDefault), info: () => import('./info').then(_rDefault), init: () => import('./init').then(_rDefault), - create: () => import('./init').then(_rDefault) + create: () => import('./init').then(_rDefault), + upgrade: () => import('./upgrade').then(_rDefault) } export type Command = keyof typeof commands diff --git a/packages/nuxi/src/commands/upgrade.ts b/packages/nuxi/src/commands/upgrade.ts new file mode 100644 index 0000000000..5a2792931e --- /dev/null +++ b/packages/nuxi/src/commands/upgrade.ts @@ -0,0 +1,68 @@ +import { execSync } from 'child_process' +import { promises as fsp, existsSync } from 'fs' +import consola from 'consola' +import { resolve } from 'pathe' +import { resolveModule } from '../utils/cjs' +import { defineNuxtCommand } from './index' + +async function getNuxtVersion (paths: string | string[]) { + const pkgJson = resolveModule('nuxt3/package.json', paths) + const pkg = pkgJson && JSON.parse(await fsp.readFile(pkgJson, 'utf8')) + if (!pkg.version) { + consola.warn('Cannot find any installed nuxt3 versions in ', paths) + } + return pkg.version || '0.0.0' +} + +export default defineNuxtCommand({ + meta: { + name: 'upgrade', + usage: 'npx nuxi upgrade [--force|-f]', + description: 'Upgrade nuxt3' + }, + async invoke (args) { + const rootDir = resolve(args._[0] || '.') + + const yarnLock = 'yarn.lock' + const npmLock = 'package-lock.json' + + const isYarn = existsSync(resolve(rootDir, yarnLock)) + const isNpm = existsSync(resolve(rootDir, npmLock)) + const packageManager = isYarn ? 'yarn' : isNpm ? 'npm' : null + if (!packageManager) { + console.error('Cannot detect Package Manager in', rootDir) + process.exit(1) + } + const packageManagerVersion = execSync(`${packageManager} --version`).toString('utf8').trim() + consola.info('Package Manager:', packageManager, packageManagerVersion) + + const currentVersion = await getNuxtVersion(rootDir) + consola.info('Current nuxt version:', currentVersion) + + if (args.force || args.f) { + consola.info('Removing lock-file and node_modules...') + await Promise.all([ + fsp.rm(isYarn ? yarnLock : npmLock), + fsp.rmdir('node_modules', { recursive: true }) + ]) + execSync(`${packageManager} install`, { stdio: 'inherit' }) + } else { + consola.info('Upgrading nuxt...') + execSync(`${packageManager} ${isYarn ? 'add' : 'install'} nuxt3@latest`, { stdio: 'inherit' }) + } + + const upgradedVersion = await getNuxtVersion(rootDir) + consola.info('Upgraded nuxt version:', upgradedVersion) + + if (upgradedVersion === currentVersion) { + consola.success('You\'re already using the latest version of nuxt3.') + } else { + consola.success('Successfully upgraded nuxt from', currentVersion, 'to', upgradedVersion) + const commitA = currentVersion.split('.').pop() + const commitB = upgradedVersion.split('.').pop() + if (commitA && commitB) { + consola.info('Changelog:', `https://github.com/nuxt/framework/compare/${commitA}...${commitB}`) + } + } + } +})