From 1d170e0c1c03b22f526510291c0ae122b62b17bc Mon Sep 17 00:00:00 2001 From: Peter Jaszkowiak Date: Tue, 11 Aug 2020 12:32:44 -0600 Subject: [PATCH] fix: #8547, remove old deps during upgrade (#8557) --- src/cli/package-install.js | 13 +++++++++++-- test/package-install.js | 30 ++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 test/package-install.js diff --git a/src/cli/package-install.js b/src/cli/package-install.js index 37c73e7438..c822b46c24 100644 --- a/src/cli/package-install.js +++ b/src/cli/package-install.js @@ -8,6 +8,8 @@ const packageFilePath = path.join(__dirname, '../../package.json'); const packageDefaultFilePath = path.join(__dirname, '../../install/package.json'); const modulesPath = path.join(__dirname, '../../node_modules'); +const isPackage = /^nodebb-(plugin|theme|widget|reward)-\w+/; + function updatePackageFile() { let oldPackageContents = {}; @@ -20,7 +22,15 @@ function updatePackageFile() { } const defaultPackageContents = JSON.parse(fs.readFileSync(packageDefaultFilePath, 'utf8')); - const packageContents = { ...oldPackageContents, ...defaultPackageContents, dependencies: { ...oldPackageContents.dependencies, ...defaultPackageContents.dependencies } }; + + const dependencies = {}; + Object.entries(oldPackageContents.dependencies).forEach(([dep, version]) => { + if (isPackage.test(dep)) { + dependencies[dep] = version; + } + }); + + const packageContents = { ...oldPackageContents, ...defaultPackageContents, dependencies: { ...dependencies, ...defaultPackageContents.dependencies } }; fs.writeFileSync(packageFilePath, JSON.stringify(packageContents, null, 2)); } @@ -83,7 +93,6 @@ function preserveExtraneousPlugins() { return; } - const isPackage = /^nodebb-(plugin|theme|widget|reward)-\w+/; const packages = fs.readdirSync(modulesPath).filter(function (pkgName) { return isPackage.test(pkgName); }); diff --git a/test/package-install.js b/test/package-install.js new file mode 100644 index 0000000000..6886cbc45d --- /dev/null +++ b/test/package-install.js @@ -0,0 +1,30 @@ +'use strict'; + + +const { execSync } = require('child_process'); +const path = require('path'); +const { readFileSync } = require('fs'); + +var assert = require('assert'); + +describe('Package install', function () { + it('should remove non-`nodebb-` modules not specified in `install/package.json`', function () { + const packageFilePath = path.join(__dirname, '../package.json'); + + // install an extra package + // chose dotenv because it's a popular package + // and we use nconf instead + execSync('npm install dotenv --save --production'); + + // assert it saves in package.json + const packageWithExtras = JSON.parse(readFileSync(packageFilePath, 'utf8')); + assert(packageWithExtras.dependencies.dotenv, 'dependency did not save'); + + // update the package file + require('../src/cli/package-install').updatePackageFile(); + + // assert it removed the extra package + const packageCleaned = JSON.parse(readFileSync(packageFilePath, 'utf8')); + assert(!packageCleaned.dependencies.dotenv, 'dependency was not removed'); + }); +});