76 lines
2.2 KiB
JavaScript
76 lines
2.2 KiB
JavaScript
// Implementation based on:
|
|
// https://github.com/angular/angular/blob/3b9c08676a4c921bbfa847802e08566fb601ba7a/tools/npm/check-node-modules.js
|
|
'use strict';
|
|
|
|
// Imports
|
|
var fs = require('fs');
|
|
var path = require('path');
|
|
|
|
// Constants
|
|
var PROJECT_ROOT = path.join(__dirname, '../../');
|
|
var NODE_MODULES_DIR = 'node_modules';
|
|
var NPM_SHRINKWRAP_FILE = 'npm-shrinkwrap.json';
|
|
var NPM_SHRINKWRAP_CACHED_FILE = NODE_MODULES_DIR + '/npm-shrinkwrap.cached.json';
|
|
|
|
// Run
|
|
_main();
|
|
|
|
// Functions - Definitions
|
|
function _main() {
|
|
var purgeIfStale = process.argv.indexOf('--purge') !== -1;
|
|
|
|
process.chdir(PROJECT_ROOT);
|
|
checkNodeModules(purgeIfStale);
|
|
}
|
|
|
|
function checkNodeModules(purgeIfStale) {
|
|
var nodeModulesOk = compareMarkerFiles(NPM_SHRINKWRAP_FILE, NPM_SHRINKWRAP_CACHED_FILE);
|
|
|
|
if (nodeModulesOk) {
|
|
console.log(':-) npm dependencies are looking good!');
|
|
} else if (purgeIfStale) {
|
|
console.log(':-( npm dependencies are stale or in an unknown state!');
|
|
console.log(' Purging \'' + NODE_MODULES_DIR + '\'...');
|
|
deleteDirSync(NODE_MODULES_DIR);
|
|
} else {
|
|
var separator = new Array(81).join('!');
|
|
|
|
console.warn(separator);
|
|
console.warn(':-( npm dependencies are stale or in an unknown state!');
|
|
console.warn('You can rebuild the dependencies by running `npm install`.');
|
|
console.warn(separator);
|
|
}
|
|
|
|
return nodeModulesOk;
|
|
}
|
|
|
|
function compareMarkerFiles(markerFilePath, cachedMarkerFilePath) {
|
|
if (!fs.existsSync(markerFilePath)) return false;
|
|
if (!fs.existsSync(cachedMarkerFilePath)) return false;
|
|
|
|
var opts = {encoding: 'utf-8'};
|
|
var markerContent = fs.readFileSync(markerFilePath, opts);
|
|
var cachedMarkerContent = fs.readFileSync(cachedMarkerFilePath, opts);
|
|
|
|
return markerContent === cachedMarkerContent;
|
|
}
|
|
|
|
// Custom implementation of `rm -rf` that works consistently across OSes
|
|
function deleteDirSync(path) {
|
|
if (fs.existsSync(path)) {
|
|
fs.readdirSync(path).forEach(deleteDirOrFileSync);
|
|
fs.rmdirSync(path);
|
|
}
|
|
|
|
// Helpers
|
|
function deleteDirOrFileSync(subpath) {
|
|
var curPath = path + '/' + subpath;
|
|
|
|
if (fs.lstatSync(curPath).isDirectory()) {
|
|
deleteDirSync(curPath);
|
|
} else {
|
|
fs.unlinkSync(curPath);
|
|
}
|
|
}
|
|
}
|