Merge branch 'master' into webpack5

This commit is contained in:
Barış Soner Uşaklı
2022-02-17 14:16:21 -05:00
4 changed files with 32 additions and 44 deletions

View File

@@ -284,12 +284,15 @@ async function copyCSS() {
async function loadDefaults() {
const setupDefaultsPath = path.join(__dirname, '../setup.json');
try {
await fs.promises.access(setupDefaultsPath, fs.constants.F_OK + fs.constants.R_OK);
// eslint-disable-next-line no-bitwise
await fs.promises.access(setupDefaultsPath, fs.constants.F_OK | fs.constants.R_OK);
} catch (err) {
// setup.json not found or inaccessible, proceed with no defaults
if (err.code !== 'ENOENT') {
throw err;
}
return;
}
winston.info('[installer] Found setup.json, populating default values');
nconf.file({

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

@@ -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);