Skip to content
Snippets Groups Projects
Select Git revision
  • b96192eec6f64a254ef9c3b51f11e5aac8a3b24d
  • master default protected
  • gh-pages
  • dependabot/npm_and_yarn/eslint-plugin-jsdoc-51.0.3
  • dependabot/npm_and_yarn/nock-14.0.5
  • dependabot/npm_and_yarn/react-19.1.0
  • dependabot/npm_and_yarn/react-dom-19.1.0
  • server-2025-02-01-6100669a
  • server-2024-11-01-87cba042
  • server-2024-10-01-6875b7c8
  • dependabot/npm_and_yarn/path-to-regexp-8.2.0
  • server-2024-09-01-3d52575c
  • daily-tests-gha2
  • daily-tests-gha
  • server-2023-12-01-92d8fb8e
  • server-2023-11-01-a80c93fd
  • server-2023-10-01-31096085
  • coc-v2
  • server-2023-09-01-8edc3810
  • server-2023-08-01-75858a03
  • server-2023-07-01-02183d8d
  • server-2025-07-01
  • 5.0.2
  • 5.0.1
  • 5.0.0
  • server-2025-06-01
  • server-2025-05-01
  • server-2025-04-03
  • server-2025-03-02
  • server-2025-03-01
  • server-2025-02-02
  • server-2025-01-01
  • server-2024-12-01
  • server-2024-11-02
  • 4.1.0
  • server-2024-09-25
  • server-2024-09-02
  • server-2024-08-01
  • server-2024-07-01
  • 4.0.0
  • server-2024-06-01
41 results

server.js

Blame
  • npm.js 3.42 KiB
    const fs = require('fs');
    const cp = require('child_process');
    const tmp = require('tmp');
    const path = require('path');
    
    let logger = require('../../logger');
    
    module.exports = {
      generateLockFile,
      getLockFile,
      maintainLockFile,
    };
    
    async function generateLockFile(newPackageJson, npmrcContent) {
      logger.debug('Generating new package-lock.json file');
      const tmpDir = tmp.dirSync({ unsafeCleanup: true });
      let packageLock;
      try {
        fs.writeFileSync(path.join(tmpDir.name, 'package.json'), newPackageJson);
        if (npmrcContent) {
          fs.writeFileSync(path.join(tmpDir.name, '.npmrc'), npmrcContent);
        }
        logger.debug('Spawning npm install');
        const result = cp.spawnSync('npm', ['install', '--ignore-scripts'], {
          cwd: tmpDir.name,
          shell: true,
        });
        logger.debug(
          { stdout: String(result.stdout), stderr: String(result.stderr) },
          'npm install complete'
        );
        packageLock = fs.readFileSync(path.join(tmpDir.name, 'package-lock.json'));
      } catch (error) /* istanbul ignore next */ {
        try {
          tmpDir.removeCallback();
        } catch (err2) {
          logger.warn(`Failed to remove tmpDir ${tmpDir.name}`);
        }
        throw error;
      }
      try {
        tmpDir.removeCallback();
      } catch (err2) {
        logger.warn(`Failed to remove tmpDir ${tmpDir.name}`);
      }
      return packageLock;
    }
    
    async function getLockFile(
      packageFile,
      packageContent,
      api,
      npmVersion,
      parentLogger
    ) {
      logger = parentLogger || logger;
      // Detect if a package-lock.json file is in use
      const packageLockFileName = path.join(
        path.dirname(packageFile),
        'package-lock.json'
      );
      if (!await api.getFileContent(packageLockFileName)) {
        return null;
      }
      if (npmVersion === '') {
        throw new Error(
          'Need to generate package-lock.json but npm is not installed'
        );
      }
      // TODO: have a more forwards-compatible check
      if (npmVersion[0] !== '5') {
        throw new Error(
          `Need to generate package-lock.json but npm version is "${npmVersion}"`
        );
      }
      // Copy over custom config commitFiles
      const npmrcContent = await api.getFileContent('.npmrc');
      // Generate package-lock.json using shell command
      const newPackageLockContent = await module.exports.generateLockFile(
        packageContent,
        npmrcContent
      );
      // Return file object
      return {
        name: packageLockFileName,
        contents: newPackageLockContent,
      };
    }
    
    async function maintainLockFile(inputConfig) {
      logger = inputConfig.logger || logger;
      logger.trace({ config: inputConfig }, `maintainLockFile`);
      const packageContent = await inputConfig.api.getFileContent(
        inputConfig.packageFile
      );
      const packageLockFileName = path.join(
        path.dirname(inputConfig.packageFile),
        'package-lock.json'
      );
      logger.debug(`Checking for ${packageLockFileName}`);
      const existingPackageLock = await inputConfig.api.getFileContent(
        packageLockFileName
      );
      logger.trace(`existingPackageLock:\n${existingPackageLock}`);
      if (!existingPackageLock) {
        return null;
      }
      logger.debug('Found existing package-lock.json file');
      const newPackageLock = await module.exports.getLockFile(
        inputConfig.packageFile,
        packageContent,
        inputConfig.api
      );
      logger.trace(`newPackageLock:\n${newPackageLock.contents}`);
      if (existingPackageLock.toString() === newPackageLock.contents.toString()) {
        logger.debug('npm lock file does not need updating');
        return null;
      }
      logger.debug('npm lock needs updating');
      return newPackageLock;
    }