diff --git a/packages/core/cli/src/commands/index.js b/packages/core/cli/src/commands/index.js index 3647d07250..97a685f668 100644 --- a/packages/core/cli/src/commands/index.js +++ b/packages/core/cli/src/commands/index.js @@ -30,6 +30,7 @@ module.exports = (cli) => { require('./test')(cli); require('./test-coverage')(cli); require('./umi')(cli); + require('./update-deps')(cli); require('./upgrade')(cli); require('./postinstall')(cli); require('./pkg')(cli); diff --git a/packages/core/cli/src/commands/update-deps.js b/packages/core/cli/src/commands/update-deps.js new file mode 100644 index 0000000000..ed54d06721 --- /dev/null +++ b/packages/core/cli/src/commands/update-deps.js @@ -0,0 +1,71 @@ +/** + * This file is part of the NocoBase (R) project. + * Copyright (c) 2020-2024 NocoBase Co., Ltd. + * Authors: NocoBase Team. + * + * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License. + * For more information, please refer to: https://www.nocobase.com/agreement. + */ + +const chalk = require('chalk'); +const { Command } = require('commander'); +const { resolve } = require('path'); +const { run, promptForTs, runAppCommand, hasCorePackages, downloadPro, hasTsNode, checkDBDialect } = require('../util'); +const { existsSync, rmSync } = require('fs'); +const { readJSON, writeJSON } = require('fs-extra'); +const deepmerge = require('deepmerge'); + +const rmAppDir = () => { + // If ts-node is not installed, do not do the following + const appDevDir = resolve(process.cwd(), './storage/.app-dev'); + if (existsSync(appDevDir)) { + rmSync(appDevDir, { recursive: true, force: true }); + } +}; + +/** + * + * @param {Command} cli + */ +module.exports = (cli) => { + cli + .command('update-deps') + .option('--force') + .allowUnknownOption() + .action(async (options) => { + if (hasCorePackages() || !hasTsNode()) { + await downloadPro(); + return; + } + const pkg = require('../../package.json'); + let distTag = 'latest'; + if (pkg.version.includes('alpha')) { + distTag = 'alpha'; + } else if (pkg.version.includes('beta')) { + distTag = 'beta'; + } + const { stdout } = await run('npm', ['info', `@nocobase/cli@${distTag}`, 'version'], { + stdio: 'pipe', + }); + if (!options.force && pkg.version === stdout) { + await downloadPro(); + rmAppDir(); + return; + } + const descPath = resolve(process.cwd(), 'package.json'); + const descJson = await readJSON(descPath, 'utf8'); + const sourcePath = resolve(__dirname, '../../templates/create-app-package.json'); + const sourceJson = await readJSON(sourcePath, 'utf8'); + if (descJson['dependencies']?.['@nocobase/cli']) { + descJson['dependencies']['@nocobase/cli'] = stdout; + } + if (descJson['devDependencies']?.['@nocobase/devtools']) { + descJson['devDependencies']['@nocobase/devtools'] = stdout; + } + const json = deepmerge(descJson, sourceJson); + await writeJSON(descPath, json, { spaces: 2, encoding: 'utf8' }); + await run('yarn', ['install']); + await downloadPro(); + rmAppDir(); + }); +}; diff --git a/packages/core/cli/src/commands/upgrade.js b/packages/core/cli/src/commands/upgrade.js index accd77a865..c2bb0736d3 100644 --- a/packages/core/cli/src/commands/upgrade.js +++ b/packages/core/cli/src/commands/upgrade.js @@ -29,7 +29,6 @@ async function updatePackage() { * @param {Command} cli */ module.exports = (cli) => { - const { APP_PACKAGE_ROOT } = process.env; cli .command('upgrade') .allowUnknownOption() @@ -38,53 +37,11 @@ module.exports = (cli) => { .option('-S|--skip-code-update') .action(async (options) => { checkDBDialect(); - if (hasTsNode()) promptForTs(); - if (hasCorePackages()) { - // await run('yarn', ['install']); - await downloadPro(); - await runAppCommand('upgrade'); - return; - } if (options.skipCodeUpdate) { - await downloadPro(); await runAppCommand('upgrade'); - return; + } else { + await run('nocobase', ['update-deps']); + await run('nocobase', ['upgrade', '--skip-code-update']); } - // await runAppCommand('upgrade'); - if (!hasTsNode()) { - await downloadPro(); - await runAppCommand('upgrade'); - return; - } - const rmAppDir = () => { - // If ts-node is not installed, do not do the following - const appDevDir = resolve(process.cwd(), './storage/.app-dev'); - if (existsSync(appDevDir)) { - rmSync(appDevDir, { recursive: true, force: true }); - } - }; - const pkg = require('../../package.json'); - let distTag = 'latest'; - if (pkg.version.includes('alpha')) { - distTag = 'alpha'; - } else if (pkg.version.includes('beta')) { - distTag = 'beta'; - } - // get latest version - const { stdout } = await run('npm', ['info', `@nocobase/cli@${distTag}`, 'version'], { - stdio: 'pipe', - }); - if (pkg.version === stdout) { - await downloadPro(); - await runAppCommand('upgrade'); - await rmAppDir(); - return; - } - await run('yarn', ['add', `@nocobase/cli@${distTag}`, `@nocobase/devtools@${distTag}`, '-W']); - await updatePackage(); - await run('yarn', ['install']); - await downloadPro(); - await runAppCommand('upgrade'); - await rmAppDir(); }); }; diff --git a/packages/core/create-nocobase-app/src/cli.js b/packages/core/create-nocobase-app/src/cli.js index 1abad655b0..28496f7c6b 100644 --- a/packages/core/create-nocobase-app/src/cli.js +++ b/packages/core/create-nocobase-app/src/cli.js @@ -21,7 +21,7 @@ cli .option('--quickstart', 'quickstart app creation') .option('--skip-dev-dependencies') .option('-a, --all-db-dialect', 'install all database dialect dependencies') - .option('-d, --db-dialect ', 'database dialect, current support mysql/postgres', 'postgres') + .option('-d, --db-dialect [dbDialect]', 'database dialect, current support postgres, mysql, mariadb, kingbase') .option('-e, --env ', 'environment variables write into .env file', concat, []) .description('create a new application') .action(async (name, options) => { diff --git a/packages/core/create-nocobase-app/src/generator.js b/packages/core/create-nocobase-app/src/generator.js index 66a882b835..56cfdb3590 100644 --- a/packages/core/create-nocobase-app/src/generator.js +++ b/packages/core/create-nocobase-app/src/generator.js @@ -37,21 +37,6 @@ class AppGenerator extends Generator { return items; } - checkDbEnv() { - const dialect = this.args.dbDialect; - const env = this.env; - if (dialect === 'sqlite') { - return; - } - if (!env.DB_DATABASE || !env.DB_USER || !env.DB_PASSWORD) { - console.log( - chalk.red( - `Please set DB_HOST, DB_PORT, DB_DATABASE, DB_USER, DB_PASSWORD in .env file to complete database settings`, - ), - ); - } - } - checkProjectPath() { if (existsSync(this.cwd)) { console.log(chalk.red('Project directory already exists')); @@ -59,19 +44,6 @@ class AppGenerator extends Generator { } } - checkDialect() { - const dialect = this.args.dbDialect; - const supportDialects = ['mysql', 'mariadb', 'postgres']; - if (!supportDialects.includes(dialect)) { - console.log( - `dialect ${chalk.red(dialect)} is not supported, currently supported dialects are ${chalk.green( - supportDialects.join(','), - )}.`, - ); - process.exit(1); - } - } - getContext() { const env = this.env; const envs = []; @@ -158,7 +130,6 @@ class AppGenerator extends Generator { async writing() { this.checkProjectPath(); - this.checkDialect(); const { name } = this.context;