npm | | Check if there is a local-npm server running on Brian's machine | Search

This code updates dependency versions in a project's package.json file to match the versions actually installed, using information from npm list.

Run example

npm run import -- "Replace package.json latest with actual latest version numbers"

Replace package.json latest with actual latest version numbers

var fs = require('fs');
var path = require('path');
var cwd = 'C:\\Users\\brian.cullinan\\Documents\\portal\\';
var execSync = require('child_process').execSync;
var packages = execSync('npm list --dev', {cwd: cwd}).toString().split('\n');
var packageJson = JSON.parse(fs.readFileSync(path.join(cwd, 'package.json')));
var deps = Object.keys(packageJson.dependencies);
deps.forEach((d, k) => {
    packages.forEach((p, i) => {
        if (p.indexOf(d + '@') > -1) {
            packageJson.dependencies[d] = '~' + p.split('@').pop().replace(' deduped', '');
        }
    });
});
console.log(packages);
var devDeps = Object.keys(packageJson.devDependencies);
devDeps.forEach((d, k) => {
    packages.forEach((p, i) => {
        if (p.indexOf(d + '@') > -1) {
            packageJson.devDependencies[d] = '~' + p.split('@').pop().replace(' deduped', '');
        }
    });
});
$.mime({'text/html': '<pre>' + JSON.stringify(packageJson, null, 4) + '</pre>'});

What the code could have been:

// Requires
const fs = require('fs');
const path = require('path');
const childProcess = require('child_process');
const mime = require('mime-types'); // For mime type

// Constants
const CURRENT_WORKING_DIRECTORY = 'C:\\Users\\brian.cullinan\\Documents\\portal\\';
const NPM_LIST_COMMAND = 'npm list --dev';

// Function to get installed packages
function getInstalledPackages(cwd = CURRENT_WORKING_DIRECTORY) {
  try {
    const packages = childProcess.execSync(NPM_LIST_COMMAND, { cwd, encoding: 'utf8' });
    return packages.split('\n').filter(Boolean);
  } catch (error) {
    console.error(`Error getting installed packages: ${error.message}`);
    return [];
  }
}

// Function to get package dependencies
function getPackageDependencies(filePath = path.join(CURRENT_WORKING_DIRECTORY, 'package.json')) {
  try {
    const packageJson = fs.readFileSync(filePath, 'utf8');
    return JSON.parse(packageJson);
  } catch (error) {
    console.error(`Error getting package dependencies: ${error.message}`);
    return {};
  }
}

// Main function
async function main() {
  // Get installed packages
  const packages = getInstalledPackages();

  // Get package dependencies
  const packageJson = getPackageDependencies();

  // Update dependencies and devDependencies
  Object.keys(packageJson.dependencies).forEach((dependency) => {
    packages.forEach((packageInfo) => {
      if (packageInfo.includes(dependency + '@')) {
        const version = packageInfo.split('@').pop().replace(' deduped', '');
        packageJson.dependencies[dependency] = `~${version}`;
      }
    });
  });

  Object.keys(packageJson.devDependencies).forEach((devDependency) => {
    packages.forEach((packageInfo) => {
      if (packageInfo.includes(devDependency + '@')) {
        const version = packageInfo.split('@').pop().replace(' deduped', '');
        packageJson.devDependencies[devDependency] = `~${version}`;
      }
    });
  });

  // Log updated packageJson
  console.log(packages);
  console.log(JSON.stringify(packageJson, null, 4));

  // Send response
  const response = mime.lookup('text/html');
  if (response) {
    const html = `
${JSON.stringify(packageJson, null, 4)}
`; // Assuming a response function is available $.mime({ [response]: html }); } else { console.error('Unsupported MIME type'); } } // Run main function main();

This code analyzes a project's package.json file and updates dependency versions based on information from a list of installed packages.

Here's a breakdown:

  1. Initialization:

  2. Dependency Version Update:

  3. Output:

In essence, this code automates the process of updating dependency versions in a project's package.json file based on the actual versions installed in the project.