Compare commits

...

9 Commits

Author SHA1 Message Date
Julian Lam
3f13a69298 Re-introduce lodash into src/package-install.js (#10315)
* test: add failing test for if package.json is non-existant, fix tests' beforeEach method

* Revert "fix: #10289, remove lodash dependency in src/cli/package-install.js"

This reverts commit 81fa2e22bc.

* fix: regression caused by 94b79ce402

`./nodebb setup` was no longer able to be called without arguments or env vars

* fix: .updatePackageFile() throwing if no package.json

* fix: removing unneeded code in src/cli/index.js that seemed to be used to handle cases where package.json was missing (initial install)

... However, as .updatePackageFile() now handled cases where there is no package.json, it should be ok to remove this code

* fix: handle missing package.json or node_modules/
2022-02-18 10:13:11 -05:00
Julian Lam
b60174f51e fix: regression caused by 94b79ce402
`./nodebb setup` was no longer able to be called without arguments or env vars
2022-02-18 10:12:59 -05:00
Misty (Bot)
7388f111b7 chore: incrementing version number - v1.19.3 2022-02-16 19:20:39 +00:00
Misty (Bot)
4bd559deba Merge commit 'e9e48a756fad301e8a6729d3e74852a644228724' into v1.19.x 2022-02-16 19:20:36 +00:00
Misty (Bot)
ded19254ac chore: incrementing version number - v1.19.2 2022-02-09 21:28:32 +00:00
Misty (Bot)
5c89557155 Merge commit '8e52abe8bed8706d2f75dce4f118490e48c6fab8' into v1.19.x 2022-02-09 21:28:11 +00:00
Misty (Bot)
04ce24e661 chore: incrementing version number - v1.19.1 2022-01-21 18:20:49 +00:00
Misty (Bot)
a24a108a66 Merge commit 'd098e26f82096188a8ef910561c5ebc7a784a399' into v1.19.x 2022-01-21 18:18:46 +00:00
Misty (Bot)
aa77758afd chore: incrementing version number - v1.19.0 2022-01-13 18:51:21 +00:00
5 changed files with 44 additions and 55 deletions

View File

@@ -2,7 +2,7 @@
"name": "nodebb",
"license": "GPL-3.0",
"description": "NodeBB Forum",
"version": "1.19.2",
"version": "1.19.3",
"homepage": "http://www.nodebb.org",
"repository": {
"type": "git",
@@ -184,4 +184,4 @@
"url": "https://github.com/barisusakli"
}
]
}
}

View File

@@ -10,31 +10,18 @@ require('../../require-main');
const packageInstall = require('./package-install');
const { paths } = require('../constants');
// check to make sure dependencies are installed
try {
fs.accessSync(paths.currentPackage, fs.constants.R_OK);
} catch (e) {
if (e.code === 'ENOENT') {
console.warn('package.json not found.');
console.log('Populating package.json...');
packageInstall.updatePackageFile();
packageInstall.preserveExtraneousPlugins();
try {
fs.accessSync(path.join(paths.nodeModules, 'chalk/package.json'), fs.constants.R_OK);
const chalk = require('chalk');
console.log(chalk.green('OK'));
} catch (e) {
console.log('OK');
fs.accessSync(paths.currentPackage, fs.constants.R_OK); // throw on missing package.json
try { // handle missing node_modules/ directory
fs.accessSync(paths.nodeModules, fs.constants.R_OK);
} catch (e) {
if (e.code === 'ENOENT') {
// run package installation just to sync up node_modules/ with existing package.json
packageInstall.installAll();
} else {
throw e;
}
} else {
throw e;
}
}
try {
fs.accessSync(path.join(paths.nodeModules, 'semver/package.json'), fs.constants.R_OK);
const semver = require('semver');
@@ -53,12 +40,14 @@ try {
checkVersion('async');
checkVersion('commander');
checkVersion('chalk');
checkVersion('lodash');
} catch (e) {
if (['ENOENT', 'DEP_WRONG_VERSION', 'MODULE_NOT_FOUND'].includes(e.code)) {
console.warn('Dependencies outdated or not yet installed.');
console.log('Installing them now...\n');
packageInstall.updatePackageFile();
packageInstall.preserveExtraneousPlugins();
packageInstall.installAll();
const chalk = require('chalk');

View File

@@ -1,6 +1,7 @@
'use strict';
const path = require('path');
const fs = require('fs');
const cproc = require('child_process');
@@ -17,34 +18,22 @@ function sortDependencies(dependencies) {
}, {});
}
function merge(to, from) {
// Poor man's version of _.merge()
if (Object.values(from).every(val => typeof val !== 'object')) {
return Object.assign(to, from);
}
Object.keys(from).forEach((key) => {
if (Object.getPrototypeOf(from[key]) === Object.prototype) {
to[key] = merge(to[key], from[key]);
} else {
to[key] = from[key];
}
});
return to;
}
pkgInstall.updatePackageFile = () => {
let oldPackageContents = {};
let oldPackageContents;
try {
oldPackageContents = JSON.parse(fs.readFileSync(paths.currentPackage, 'utf8'));
} catch (e) {
if (e.code !== 'ENOENT') {
throw e;
} else {
// No local package.json, copy from install/package.json
fs.copyFileSync(paths.installPackage, paths.currentPackage);
return;
}
}
const _ = require('lodash');
const defaultPackageContents = JSON.parse(fs.readFileSync(paths.installPackage, 'utf8'));
let dependencies = {};
@@ -59,7 +48,7 @@ pkgInstall.updatePackageFile = () => {
// Sort dependencies alphabetically
dependencies = sortDependencies({ ...dependencies, ...defaultPackageContents.dependencies });
const packageContents = { ...merge(oldPackageContents, defaultPackageContents), dependencies, devDependencies };
const packageContents = { ..._.merge(oldPackageContents, defaultPackageContents), dependencies, devDependencies };
fs.writeFileSync(paths.currentPackage, JSON.stringify(packageContents, null, 4));
};

View File

@@ -47,7 +47,7 @@ questions.optional = [
];
function checkSetupFlagEnv() {
let setupVal = install.values || {};
let setupVal = install.values;
const envConfMap = {
NODEBB_URL: 'url',
@@ -65,17 +65,21 @@ function checkSetupFlagEnv() {
};
// Set setup values from env vars (if set)
winston.info('[install/checkSetupFlagEnv] checking env vars for setup info...');
const envKeys = Object.keys(process.env);
if (Object.keys(envConfMap).some(key => envKeys.includes(key))) {
winston.info('[install/checkSetupFlagEnv] checking env vars for setup info...');
setupVal = setupVal || {};
Object.entries(process.env).forEach(([evName, evValue]) => { // get setup values from env
if (evName.startsWith('NODEBB_DB_')) {
setupVal[`${process.env.NODEBB_DB}:${envConfMap[evName]}`] = evValue;
} else if (evName.startsWith('NODEBB_')) {
setupVal[envConfMap[evName]] = evValue;
}
});
Object.entries(process.env).forEach(([evName, evValue]) => { // get setup values from env
if (evName.startsWith('NODEBB_DB_')) {
setupVal[`${process.env.NODEBB_DB}:${envConfMap[evName]}`] = evValue;
} else if (evName.startsWith('NODEBB_')) {
setupVal[envConfMap[evName]] = evValue;
}
});
setupVal['admin:password:confirm'] = setupVal['admin:password'];
setupVal['admin:password:confirm'] = setupVal['admin:password'];
}
// try to get setup values from json, if successful this overwrites all values set by env
// TODO: better behaviour would be to support overrides per value, i.e. in order of priority (generic pattern):

View File

@@ -23,12 +23,11 @@ describe('Package install lib', () => {
// Move `install/package.json` and `package.json` out of the way for now
await fs.copyFile(sourcePackagePath, path.resolve(__dirname, '../install/package.json.bak')); // safekeeping
await fs.copyFile(packageFilePath, path.resolve(__dirname, '../package.json.bak')); // safekeeping
await fs.copyFile(sourcePackagePath, packageFilePath); // match files for testing
});
beforeEach(async () => {
await fs.copyFile(path.resolve(__dirname, '../install/package.json.bak'), sourcePackagePath);
await fs.copyFile(path.resolve(__dirname, '../package.json.bak'), packageFilePath);
await fs.copyFile(sourcePackagePath, packageFilePath); // match files for testing
source = JSON.parse(await fs.readFile(sourcePackagePath));
current = JSON.parse(await fs.readFile(packageFilePath));
});
@@ -95,6 +94,14 @@ describe('Package install lib', () => {
assert.strictEqual(updated.devDependencies.hasOwnProperty('expect'), false);
});
it('should handle if there is no package.json', async () => {
await fs.unlink(packageFilePath);
pkgInstall.updatePackageFile();
const updated = JSON.parse(await fs.readFile(packageFilePath, 'utf8'));
assert.deepStrictEqual(updated, source);
});
after(async () => {
// Clean up
await fs.rename(path.resolve(__dirname, '../install/package.json.bak'), sourcePackagePath);