UNPKG

browser-extension-manager

Version:
228 lines (185 loc) 6.91 kB
// Libraries const Manager = new (require('../build.js')); const logger = Manager.logger('setup'); const argv = Manager.getArguments(); const path = require('path'); const jetpack = require('fs-jetpack'); const version = require('wonderful-version'); const { execute, template, force } = require('node-powertools'); const NPM = require('npm-api'); const glob = require('glob').globSync; const { minimatch } = require('minimatch'); // Load package const package = Manager.getPackage('main'); const project = Manager.getPackage('project'); const manifest = Manager.getManifest(); // Dependency MAP const DEPENDENCY_MAP = { 'gulp': 'dev', } module.exports = async function (options) { // Fix options options = options || {}; options.checkManager = force(options.checkManager || true, 'boolean'); options.checkNode = force(options.checkNode || true, 'boolean'); options.checkPeerDependencies = force(options.checkPeerDependencies || true, 'boolean'); options.setupScripts = force(options.setupScripts || true, 'boolean'); options.checkLocality = force(options.checkLocality || true, 'boolean'); // Log logger.log(`Welcome to ${package.name} v${package.version}!`); logger.log(`options`, options); // Prefix project project.dependencies = project.dependencies || {}; project.devDependencies = project.devDependencies || {}; try { // Log current working directory await logCWD(); // Ensure this package is up-to-date if (options.checkManager) { await updateManager(); } // Ensure proper node version if (options.checkNode) { await ensureNodeVersion(); } // Run the setup if (options.checkPeerDependencies) { await ensurePeerDependencies(); } // Setup scripts if (options.setupScripts) { await setupScripts(); } // Copy all files from src/defaults/dist on first run // await copyDefaultDistFiles(); // Check which locality we are using if (options.checkLocality) { await checkLocality(); } } catch (e) { // Throw error throw e; } }; async function logCWD() { logger.log('Current working directory:', process.cwd()); // logger.log('Current working directory 2:', await execute('pwd')); // logger.log('Current working directory 3:', await execute('ls -al')); } async function updateManager() { const npm = new NPM(); // Get the latest version const installedVersion = project.devDependencies[package.name]; const latestVersion = await npm.repo(package.name) .package() .then((pkg) => { return pkg.version; }, (e) => { return '0.0.0'; }); const isUpToDate = version.is(installedVersion, '>=', latestVersion); const levelDifference = version.levelDifference(installedVersion, latestVersion); // Check if installedVersion is truthy or throw error if (!installedVersion) { throw new Error(`No installed version of ${package.name} found in devDependencies.`); } // Log logVersionCheck(package.name, installedVersion, latestVersion, isUpToDate); // Quit if local if (installedVersion.startsWith('file:')) { return; } // Check if we need to update if (!isUpToDate) { // Quit if major version difference if (levelDifference === 'major' && installedVersion !== 'latest') { return logger.error(`Major version difference detected. Please update to ${latestVersion} manually.`); } // Install the latest version await install(package.name, latestVersion); } } async function ensureNodeVersion() { const installedVersion = version.clean(process.version); const requiredVersion = version.clean(package.engines.node); const isUpToDate = version.is(installedVersion, '>=', requiredVersion); // Log logVersionCheck('Node.js', installedVersion, requiredVersion, isUpToDate); // Check if we need to update if (!isUpToDate) { throw new Error(`Node version is out-of-date. Required version is ${requiredVersion}.`); } } async function ensurePeerDependencies() { const requiredPeerDependencies = package.peerDependencies || {}; // Loop through and make sure project has AT LEAST the required version for (let [dependency, ver] of Object.entries(requiredPeerDependencies)) { const projectDependencyVersion = version.clean(project.dependencies[dependency] || project.devDependencies[dependency]); const location = DEPENDENCY_MAP[dependency] === 'dev' ? '--save-dev' : ''; const isUpToDate = version.is(projectDependencyVersion, '>=', ver); // Clean version if needed ver = version.clean(ver); // Log // logger.log('Checking peer dep:', dependency, '-->', projectDependencyVersion, '>=', ver); logVersionCheck(dependency, projectDependencyVersion, ver, isUpToDate); // Install if not found if ( // Not found !projectDependencyVersion // Not the right version || !isUpToDate ) { await install(dependency, ver, location); } } } function setupScripts() { // Setup the scripts project.scripts = project.scripts || {}; // Setup the scripts Object.keys(package.projectScripts).forEach((key) => { project.scripts[key] = package.projectScripts[key]; }); // Save the project jetpack.write(path.join(process.cwd(), 'package.json'), project); } function checkLocality() { const installedVersion = project.devDependencies[package.name]; // Check if installedVersion is truthy or throw error if (!installedVersion) { throw new Error(`No installed version of ${package.name} found in devDependencies.`); } // Warn if using local version if (installedVersion.startsWith('file:')) { logger.warn(`⚠️⚠️⚠️ You are using the local version of ${package.name}. This WILL NOT WORK when published. ⚠️⚠️⚠️`); } } function install(package, ver, location) { // Default to latest ver || 'latest'; // Clean version if needed ver = ver === 'latest' ? ver : version.clean(ver); // Build the command let command = `npm install ${package}@${ver} ${location || '--save'}`; // Log logger.log('Installing:', command); // Execute return execute(command, { log: true }) .then(async () => { // Read new project const projectUpdated = jetpack.read(path.join(process.cwd(), 'package.json'), 'json'); // Log logger.log('Installed:', package, ver); // Update package object project.dependencies = projectUpdated.dependencies; project.devDependencies = projectUpdated.devDependencies; }); } function logVersionCheck(name, installedVersion, latestVersion, isUpToDate) { // Quit if local if (installedVersion.startsWith('file:')) { isUpToDate = true; } // Log logger.log(`Checking if ${name} is up to date (${logger.format.bold(installedVersion)} >= ${logger.format.bold(latestVersion)}): ${isUpToDate ? logger.format.green('Yes') : logger.format.red('No')}`); }