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');
+ });
+});