diff --git a/core/lib/patternlab.js b/core/lib/patternlab.js index 6fc111887..a5aafdd40 100644 --- a/core/lib/patternlab.js +++ b/core/lib/patternlab.js @@ -121,14 +121,16 @@ var patternlab_engine = function (config) { console.log(''); plutils.logGreen(' patternlab:loadstarterkit'); - console.log(' > Load a starterkit into config.paths.soource/*'); - console.log(' > NOTE: This does overwrite any existing contents, and does not clean the directory first.'); + console.log(' > Load a starterkit into config.paths.source/*'); + console.log(' > NOTE: Overwrites existing content, and only cleans out existing directory if --clean=true argument is passed.'); console.log(' > NOTE: In most cases, `npm install starterkit-name` will precede this call.'); console.log(' > arguments:'); console.log(' -- kit '); console.log(' > the name of the starter kit to load'); + console.log(' -- clean '); + console.log(' > removes all files from config.paths.source/ prior to load'); console.log(' > example (gulp):'); - console.log(' `gulp patternlab:starterkit-load --kit=starterkit-mustache-demo`'); + console.log(' `gulp patternlab:loadstarterkit --kit=starterkit-mustache-demo`'); console.log(''); console.log('==============================='); @@ -175,9 +177,9 @@ var patternlab_engine = function (config) { return starterkit_manager.list_starterkits(); } - function loadStarterKit(starterkitName) { + function loadStarterKit(starterkitName, clean) { var starterkit_manager = new sm(patternlab); - starterkit_manager.load_starterkit(starterkitName); + starterkit_manager.load_starterkit(starterkitName, clean); } function buildPatterns(deletePatternDir) { @@ -369,8 +371,8 @@ var patternlab_engine = function (config) { liststarterkits: function () { return listStarterkits(); }, - loadstarterkit: function (starterkitName) { - loadStarterKit(starterkitName); + loadstarterkit: function (starterkitName, clean) { + loadStarterKit(starterkitName, clean); } }; }; diff --git a/core/lib/starterkit_manager.js b/core/lib/starterkit_manager.js index caffc9c55..e14503d45 100644 --- a/core/lib/starterkit_manager.js +++ b/core/lib/starterkit_manager.js @@ -3,29 +3,41 @@ var starterkit_manager = function (pl) { var path = require('path'), fs = require('fs-extra'), + util = require('./utilities'), paths = pl.config.paths; - function loadStarterKit(starterkitName) { + function loadStarterKit(starterkitName, clean) { try { var kitPath = path.resolve( path.join(process.cwd(), 'node_modules', starterkitName, pl.config.starterkitSubDir) ); - var kitPathDirExists = fs.statSync(kitPath).isDirectory(); + console.log('Attempting to load starterkit from', kitPath); + try { + var kitDirStats = fs.statSync(kitPath); + } catch (ex) { + util.logRed(starterkitName + ' not found, please use npm to install it first.'); + util.logRed(starterkitName + ' not loaded.'); + return; + } + var kitPathDirExists = kitDirStats.isDirectory(); if (kitPathDirExists) { - //todo check and prompt user is paths().source is not empty + if (clean) { + console.log('Deleting contents of', paths.source.root, 'prior to starterkit load.'); + util.emptyDirectory(paths.source.root); + } else { + console.log('Overwriting contents of', paths.source.root, 'during starterkit load.'); + } fs.copy(kitPath, paths.source.root, function (ex) { if (ex) { console.error(ex); } - console.log('starterkit ' + starterkitName + ' loaded successfully.'); + util.logGreen('starterkit ' + starterkitName + ' loaded successfully.'); }); - } } catch (ex) { console.log(ex); - console.log(starterkitName + ' not found, please use npm to install it first'); } } @@ -38,8 +50,8 @@ var starterkit_manager = function (pl) { } return { - load_starterkit: function (starterkitName) { - loadStarterKit(starterkitName); + load_starterkit: function (starterkitName, clean) { + loadStarterKit(starterkitName, clean); }, list_starterkits: function () { listStarterkits(); diff --git a/core/lib/utilities.js b/core/lib/utilities.js index ef4e866fc..4765e874b 100644 --- a/core/lib/utilities.js +++ b/core/lib/utilities.js @@ -1,5 +1,8 @@ "use strict"; +var fs = require('fs-extra'), + path = require('path'); + var util = { // http://stackoverflow.com/questions/6274339/how-can-i-shuffle-an-array-in-javascript shuffle: function (o) { @@ -58,6 +61,28 @@ var util = { if (obj.hasOwnProperty(prop)) { return false; } } return true; + }, + + // recursively delete the contents of directory + // adapted from https://gist.github.com/tkihira/2367067 + emptyDirectory: function (dir, cleanDir) { + var list = fs.readdirSync(dir); + for (var i = 0; i < list.length; i++) { + var filename = path.join(dir, list[i]); + var stat = fs.statSync(filename); + + if (filename === "." || filename === "..") { + // pass these files + } else if (stat.isDirectory()) { + this.emptyDirectory(filename); + } else { + // rm fiilename + fs.unlinkSync(filename); + } + } + if (cleanDir) { + fs.rmdirSync(dir); + } } };