showFormErrors = function ($form, errors) { for (var name in errors) { if (errors.hasOwnProperty(name)) { var firstErrorMessage = errors[name][Object.keys(errors[name])[0]]; $form.find('[name="' + name + '"]').parents('.form-group').addClass('has-error'); var message = '
' + firstErrorMessage + '
'; $form.find('[name="' + name + '"]').after(message); } } }; showFormSuccess = function ($form) { $form.find('input').parents('.form-group').addClass('has-success'); }; clearFormErrors = function ($form) { $form.find('.form-group.has-error .help-block.error').remove(); $form.find('.form-group.has-error').removeClass('has-error'); }; resetForm = function ($form) { $form.find('input').val(''); }; trackLink = function (trackLabel) { if (trackLabel) { console.log(trackLabel); ga('send', 'event', 'link', 'click', trackLabel); } }; Util = {}; Util.deleteFolder = function (directory) { if (fs.existsSync(directory)) { fs.readdirSync(directory).forEach(function (file) { var curDirectory = directory + '/' + file; if (fs.lstatSync(curDirectory).isDirectory()) { // Recurse Util.deleteFolder(curDirectory); } else { // Delete File try { fs.unlinkSync(curDirectory); } catch (e) { console.error(e); } } }); fs.rmdirSync(directory); } }; Util.copyFolder = function (src, dest) { var exists = fs.existsSync(src); var stats = exists && fs.statSync(src); var isDirectory = exists && stats.isDirectory(); if (exists && isDirectory) { try { fs.mkdirSync(dest); } catch (e) { console.error(e); } fs.readdirSync(src).forEach(function (childItemName) { Util.copyFolder(path.join(src, childItemName), path.join(dest, childItemName)); }); } else { try { fs.linkSync(src, dest); } catch (e) { console.error(e); } } }; Util.copyVolumes = function (directory, appName) { var KITE_VOLUMES_PATH = path.join(directory, 'volumes'); if (fs.existsSync(KITE_VOLUMES_PATH)) { var destinationPath = path.join(KITE_PATH, appName); Util.copyFolder(KITE_VOLUMES_PATH, destinationPath); console.log('Copied volumes for: ' + appName); } }; Util.hasDockerfile = function (directory) { return fs.existsSync(path.join(directory, 'Dockerfile')); }; /** * Compares two software version numbers (e.g. "1.7.1" or "1.2b"). * * @param {string} v1 The first version to be compared. * @param {string} v2 The second version to be compared. * @param {object} [options] Optional flags that affect comparison behavior: *