closes #450. READ COMMENTS IN PR450 FOR INSTRUCTIONS ON USAGE We'll put these instructions some place better soon. Also replace globule with globby ( perf issues) and explicitly exclude node_modules where possible. Updated _examples/package.json for latest 3rd party libs (e.g. alpha.48) and updated template-syntax/ts/package.json to be a prototypical example
		
			
				
	
	
		
			138 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| var path = require('canonical-path');
 | |
| var fs = require('fs');
 | |
| var minimatch = require("minimatch");
 | |
| 
 | |
| 
 | |
| // Utility wrappers over fs functions
 | |
| 
 | |
| module.exports = {
 | |
|   addSymlink: addSymlink,
 | |
|   removeSymlink: removeSymlink,
 | |
|   removeDirSync: removeDirSync,
 | |
|   lstatSyncExt: lstatSyncExt,
 | |
| };
 | |
| 
 | |
| // create a new link (linkPath) that points
 | |
| // to realPath - will also delete the linkPath
 | |
| // if it is a preexisting folder and not itself a symbolic link before it
 | |
| // starts.
 | |
| function addSymlink(realPath, linkPath) {
 | |
| 
 | |
|   // check if the linkPath is a folder
 | |
|   // and if so delete it
 | |
|   var stat = lstatSyncExt(linkPath);
 | |
| 
 | |
|   if (stat && stat.isSymbolicLink()) {
 | |
|     // todo: check if it points to realPath
 | |
|     return;
 | |
|   }
 | |
|   if (stat && stat.isDirectory()) {
 | |
|     removeDirSync(linkPath);
 | |
|   }
 | |
|   symLinkSyncExt(realPath, linkPath, 'dir');
 | |
| 
 | |
| }
 | |
| 
 | |
| function removeSymlink(linkPath) {
 | |
|   var stat = lstatSyncExt(linkPath);
 | |
|   if (!stat || !stat.isSymbolicLink()) return;
 | |
| 
 | |
|   fs.unlinkSync(linkPath);
 | |
| }
 | |
| 
 | |
| // remove a dir and all of its files - sync
 | |
| function removeDirSync(dirPath) {
 | |
|   var files;
 | |
|   try {
 | |
|     files = fs.readdirSync(dirPath);
 | |
|   }
 | |
|   catch(e) { return; }
 | |
|   if (files.length > 0) {
 | |
|     for (var i = 0; i < files.length; i++) {
 | |
|       var filePath = path.join(dirPath, files[i]);
 | |
|       var stat = fs.lstatSync(filePath);
 | |
|       if (stat.isFile() || stat.isSymbolicLink()) {
 | |
|         fs.unlinkSync(filePath);
 | |
|       } else {
 | |
|         removeDirSync(filePath);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   fs.rmdirSync(dirPath);
 | |
| }
 | |
| 
 | |
| // same as lstatSync except returns a null for nonExistent file instead of throwing
 | |
| function lstatSyncExt(filePath) {
 | |
|   try {
 | |
|     var stat = fs.lstatSync(filePath);
 | |
|   } catch (e) {
 | |
|     if(e.code == 'ENOENT') return null;
 | |
|     throw e;
 | |
|   }
 | |
|   return stat;
 | |
| }
 | |
| 
 | |
| function symLinkSyncExt(realPath, linkPath, type) {
 | |
|   // fs.symlink requires the real path to be fully resolved.
 | |
|   realPath = path.resolve(realPath);
 | |
|   try {
 | |
|     fs.symlinkSync(realPath, linkPath, type);
 | |
|   } catch (e) {
 | |
|     var msg = "Unable to create symlink: " + linkPath;
 | |
|     if (e.code == "EPERM") {
 | |
|       msg += "\nPermissions issue, on windows this function must be run as an administrator."
 | |
|     }
 | |
|     console.log(msg + "\n" + e);
 | |
|   }
 | |
| }
 | |
| 
 | |
| // Talk to Jay - not currently needed.
 | |
| //
 | |
| //function globWithIgnore(basePath, globs, ignoreGlobs, options) {
 | |
| //  options = options || {};
 | |
| //  options.filters = globs.map(function (glob) {
 | |
| //    return minimatch.filter(glob);
 | |
| //  });
 | |
| //  options.ignoreFilters = ignoreGlobs && ignoreGlobs.map(function(glob) {
 | |
| //      return minimatch.filter(glob);
 | |
| //    });
 | |
| //  options.ignoreSymlink = options.ignoreSymlink == null ? true : false;
 | |
| //  return globSyncCore(basePath, options);
 | |
| //}
 | |
| //
 | |
| //function globSyncCore(basePath, options) {
 | |
| //  var results = [];
 | |
| //  var files;
 | |
| //  try {
 | |
| //    files = fs.readdirSync(basePath);
 | |
| //  }
 | |
| //  catch(e) { return results; }
 | |
| //
 | |
| //  files.forEach(function(file) {
 | |
| //    var filePath = path.join(basePath, file);
 | |
| //    var shouldIgnore = options.ignoreFilters && options.ignoreFilters.some(function(filter) {
 | |
| //        return filter(filePath);
 | |
| //      });
 | |
| //    if (shouldIgnore) return;
 | |
| //
 | |
| //    var stat = fs.lstatSync(filePath);
 | |
| //
 | |
| //    if (stat.isDirectory()) {
 | |
| //      if (stat.isSymbolicLink() && options.ignoreSymlink) {
 | |
| //        // do nothing
 | |
| //      } else {
 | |
| //        var partialResults = globSyncCore(filePath, options);
 | |
| //        Array.prototype.push.apply(results, partialResults);
 | |
| //      }
 | |
| //    } else {
 | |
| //      var ok = options.filters.every(function(filter) {
 | |
| //        return filter(filePath);
 | |
| //      });
 | |
| //      if (ok) {
 | |
| //        results.push(filePath);
 | |
| //      }
 | |
| //    }
 | |
| //  });
 | |
| //  return results;
 | |
| //}
 |