| 
									
										
										
										
											2015-06-05 23:37:09 -07:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var fs = require('fs'); | 
					
						
							|  |  |  | var path = require('path'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var NPM_SHRINKWRAP_FILE = 'npm-shrinkwrap.json'; | 
					
						
							| 
									
										
										
										
											2015-12-21 14:50:56 -08:00
										 |  |  | var NPM_SHRINKWRAP_CACHED_FILE = 'node_modules/.npm-shrinkwrap.cached.json'; | 
					
						
							| 
									
										
										
										
											2015-06-05 23:37:09 -07:00
										 |  |  | var FS_OPTS = {encoding: 'utf-8'}; | 
					
						
							|  |  |  | var PROJECT_ROOT = path.join(__dirname, '../../'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function checkNodeModules(logOutput, purgeIfStale) { | 
					
						
							|  |  |  |   var nodeModulesOK = _checkCache(NPM_SHRINKWRAP_FILE, NPM_SHRINKWRAP_CACHED_FILE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (nodeModulesOK) { | 
					
						
							|  |  |  |     if (logOutput) console.log(':-) npm dependencies are looking good!'); | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     if (logOutput) console.error(':-( npm dependencies are stale or in an in unknown state!'); | 
					
						
							|  |  |  |     if (purgeIfStale) { | 
					
						
							|  |  |  |       if (logOutput) console.log('    purging...'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       var nodeModulesPath = path.join(PROJECT_ROOT, 'node_modules'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       if (fs.existsSync(nodeModulesPath)) { | 
					
						
							| 
									
										
										
										
											2015-07-01 09:19:03 -07:00
										 |  |  |         _deleteDir(nodeModulesPath); | 
					
						
							| 
									
										
										
										
											2015-06-05 23:37:09 -07:00
										 |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return nodeModulesOK; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function _checkCache(markerFile, cacheMarkerFile) { | 
					
						
							|  |  |  |   var absoluteMarkerFilePath = path.join(PROJECT_ROOT, markerFile); | 
					
						
							|  |  |  |   var absoluteCacheMarkerFilePath = path.join(PROJECT_ROOT, cacheMarkerFile); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (!fs.existsSync(absoluteCacheMarkerFilePath)) return false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var markerContent = fs.readFileSync(absoluteMarkerFilePath, FS_OPTS); | 
					
						
							|  |  |  |   var cacheMarkerContent = fs.readFileSync(absoluteCacheMarkerFilePath, FS_OPTS); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return markerContent == cacheMarkerContent; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-01 09:19:03 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Custom implementation of recursive `rm` because we can't rely on the state of node_modules to | 
					
						
							|  |  |  |  * pull in existing module. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | function _deleteDir(path) { | 
					
						
							|  |  |  |   if( fs.existsSync(path) ) { | 
					
						
							|  |  |  |     var subpaths = fs.readdirSync(path); | 
					
						
							|  |  |  |     subpaths.forEach(function(subpath) { | 
					
						
							|  |  |  |       var curPath = path + "/" + subpath; | 
					
						
							|  |  |  |       if(fs.lstatSync(curPath).isDirectory()) { | 
					
						
							|  |  |  |         _deleteDir(curPath); | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         fs.unlinkSync(curPath); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |     fs.rmdirSync(path); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-05 23:37:09 -07:00
										 |  |  | module.exports = checkNodeModules; |